Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ff23ab24 authored by Rafael J. Wysocki's avatar Rafael J. Wysocki
Browse files

Merge branches 'pm-cpufreq' and 'pm-cpuidle'

* pm-cpufreq:
  cpufreq: fix a NULL pointer dereference in __cpufreq_governor()
  cpufreq-dt: defer probing if OPP table is not ready

* pm-cpuidle:
  cpuidle / ACPI: remove unused CPUIDLE_FLAG_TIME_INVALID
  cpuidle: ladder: Better idle duration measurement without using CPUIDLE_FLAG_TIME_INVALID
  cpuidle: menu: Better idle duration measurement without using CPUIDLE_FLAG_TIME_INVALID
Loading
Loading
Loading
Loading
+0 −2
Original line number Diff line number Diff line
@@ -985,8 +985,6 @@ static int acpi_processor_setup_cpuidle_states(struct acpi_processor *pr)
		state->flags = 0;
		switch (cx->type) {
			case ACPI_STATE_C1:
			if (cx->entry_method != ACPI_CSTATE_FFH)
				state->flags |= CPUIDLE_FLAG_TIME_INVALID;

			state->enter = acpi_idle_enter_c1;
			state->enter_dead = acpi_idle_play_dead;
+11 −0
Original line number Diff line number Diff line
@@ -211,6 +211,17 @@ static int cpufreq_init(struct cpufreq_policy *policy)
	/* OPPs might be populated at runtime, don't check for error here */
	of_init_opp_table(cpu_dev);

	/*
	 * But we need OPP table to function so if it is not there let's
	 * give platform code chance to provide it for us.
	 */
	ret = dev_pm_opp_get_opp_count(cpu_dev);
	if (ret <= 0) {
		pr_debug("OPP table is not ready, deferring probe\n");
		ret = -EPROBE_DEFER;
		goto out_free_opp;
	}

	priv = kzalloc(sizeof(*priv), GFP_KERNEL);
	if (!priv) {
		ret = -ENOMEM;
+6 −0
Original line number Diff line number Diff line
@@ -2028,6 +2028,12 @@ static int __cpufreq_governor(struct cpufreq_policy *policy,
	/* Don't start any governor operations if we are entering suspend */
	if (cpufreq_suspended)
		return 0;
	/*
	 * Governor might not be initiated here if ACPI _PPC changed
	 * notification happened, so check it.
	 */
	if (!policy->governor)
		return -EINVAL;

	if (policy->governor->max_transition_latency &&
	    policy->cpuinfo.transition_latency >
+1 −6
Original line number Diff line number Diff line
@@ -79,12 +79,7 @@ static int ladder_select_state(struct cpuidle_driver *drv,

	last_state = &ldev->states[last_idx];

	if (!(drv->states[last_idx].flags & CPUIDLE_FLAG_TIME_INVALID)) {
		last_residency = cpuidle_get_last_residency(dev) - \
					 drv->states[last_idx].exit_latency;
	}
	else
		last_residency = last_state->threshold.promotion_time + 1;
	last_residency = cpuidle_get_last_residency(dev) - drv->states[last_idx].exit_latency;

	/* consider promotion */
	if (last_idx < drv->state_count - 1 &&
+10 −15
Original line number Diff line number Diff line
@@ -396,8 +396,8 @@ static void menu_update(struct cpuidle_driver *drv, struct cpuidle_device *dev)
	 * power state and occurrence of the wakeup event.
	 *
	 * If the entered idle state didn't support residency measurements,
	 * we are basically lost in the dark how much time passed.
	 * As a compromise, assume we slept for the whole expected time.
	 * we use them anyway if they are short, and if long,
	 * truncate to the whole expected time.
	 *
	 * Any measured amount of time will include the exit latency.
	 * Since we are interested in when the wakeup begun, not when it
@@ -405,12 +405,8 @@ static void menu_update(struct cpuidle_driver *drv, struct cpuidle_device *dev)
	 * the measured amount of time is less than the exit latency,
	 * assume the state was never reached and the exit latency is 0.
	 */
	if (unlikely(target->flags & CPUIDLE_FLAG_TIME_INVALID)) {
		/* Use timer value as is */
		measured_us = data->next_timer_us;

	} else {
		/* Use measured value */
	/* measured value */
	measured_us = cpuidle_get_last_residency(dev);

	/* Deduct exit latency */
@@ -420,7 +416,6 @@ static void menu_update(struct cpuidle_driver *drv, struct cpuidle_device *dev)
	/* Make sure our coefficients do not exceed unity */
	if (measured_us > data->next_timer_us)
		measured_us = data->next_timer_us;
	}

	/* Update our correction ratio */
	new_factor = data->correction_factor[data->bucket];
Loading