mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 11:11:45 -04:00
Merge branches 'pm-cpuidle', 'pm-core', 'pm-domains', 'pm-avs' and 'pm-devfreq'
* pm-cpuidle: cpuidle: powernv: Avoid a branch in the core snooze_loop() loop cpuidle: powernv: Don't continually set thread priority in snooze_loop() cpuidle: powernv: Don't bounce between low and very low thread priority cpuidle: cpuidle-cps: remove unused variable powernv-cpuidle: Validate DT property array size * pm-core: PM / runtime: Document autosuspend-helper side effects PM / runtime: Fix autosuspend documentation * pm-domains: PM / Domains: Ignore domain-idle-states that are not compatible PM / Domains: Don't warn about IRQ safe device for an always on PM domain PM / Domains: Respect errors from genpd's ->power_off() callback PM / Domains: Enable users of genpd to specify always on PM domains PM / Domains: Clean up code validating genpd's status PM / Domain: remove conditional from error case * pm-avs: PM / AVS: rockchip-io: add io selectors and supplies for rk3328 * pm-devfreq: PM / devfreq: Move struct devfreq_governor to devfreq directory
This commit is contained in:
commit
060d0fbb43
10 changed files with 195 additions and 70 deletions
|
|
@ -118,7 +118,7 @@ static void __init cps_cpuidle_unregister(void)
|
|||
|
||||
static int __init cps_cpuidle_init(void)
|
||||
{
|
||||
int err, cpu, core, i;
|
||||
int err, cpu, i;
|
||||
struct cpuidle_device *device;
|
||||
|
||||
/* Detect supported states */
|
||||
|
|
@ -160,7 +160,6 @@ static int __init cps_cpuidle_init(void)
|
|||
}
|
||||
|
||||
for_each_possible_cpu(cpu) {
|
||||
core = cpu_data[cpu].core;
|
||||
device = &per_cpu(cpuidle_dev, cpu);
|
||||
device->cpu = cpu;
|
||||
#ifdef CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED
|
||||
|
|
|
|||
|
|
@ -56,10 +56,9 @@ static int snooze_loop(struct cpuidle_device *dev,
|
|||
|
||||
snooze_exit_time = get_tb() + snooze_timeout;
|
||||
ppc64_runlatch_off();
|
||||
HMT_very_low();
|
||||
while (!need_resched()) {
|
||||
HMT_low();
|
||||
HMT_very_low();
|
||||
if (snooze_timeout_en && get_tb() > snooze_exit_time)
|
||||
if (likely(snooze_timeout_en) && get_tb() > snooze_exit_time)
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
@ -215,11 +214,25 @@ static inline void add_powernv_state(int index, const char *name,
|
|||
stop_psscr_table[index].mask = psscr_mask;
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns 0 if prop1_len == prop2_len. Else returns -1
|
||||
*/
|
||||
static inline int validate_dt_prop_sizes(const char *prop1, int prop1_len,
|
||||
const char *prop2, int prop2_len)
|
||||
{
|
||||
if (prop1_len == prop2_len)
|
||||
return 0;
|
||||
|
||||
pr_warn("cpuidle-powernv: array sizes don't match for %s and %s\n",
|
||||
prop1, prop2);
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int powernv_add_idle_states(void)
|
||||
{
|
||||
struct device_node *power_mgt;
|
||||
int nr_idle_states = 1; /* Snooze */
|
||||
int dt_idle_states;
|
||||
int dt_idle_states, count;
|
||||
u32 latency_ns[CPUIDLE_STATE_MAX];
|
||||
u32 residency_ns[CPUIDLE_STATE_MAX];
|
||||
u32 flags[CPUIDLE_STATE_MAX];
|
||||
|
|
@ -244,6 +257,21 @@ static int powernv_add_idle_states(void)
|
|||
goto out;
|
||||
}
|
||||
|
||||
count = of_property_count_u32_elems(power_mgt,
|
||||
"ibm,cpu-idle-state-latencies-ns");
|
||||
|
||||
if (validate_dt_prop_sizes("ibm,cpu-idle-state-flags", dt_idle_states,
|
||||
"ibm,cpu-idle-state-latencies-ns",
|
||||
count) != 0)
|
||||
goto out;
|
||||
|
||||
count = of_property_count_strings(power_mgt,
|
||||
"ibm,cpu-idle-state-names");
|
||||
if (validate_dt_prop_sizes("ibm,cpu-idle-state-flags", dt_idle_states,
|
||||
"ibm,cpu-idle-state-names",
|
||||
count) != 0)
|
||||
goto out;
|
||||
|
||||
/*
|
||||
* Since snooze is used as first idle state, max idle states allowed is
|
||||
* CPUIDLE_STATE_MAX -1
|
||||
|
|
@ -278,6 +306,22 @@ static int powernv_add_idle_states(void)
|
|||
has_stop_states = (flags[0] &
|
||||
(OPAL_PM_STOP_INST_FAST | OPAL_PM_STOP_INST_DEEP));
|
||||
if (has_stop_states) {
|
||||
count = of_property_count_u64_elems(power_mgt,
|
||||
"ibm,cpu-idle-state-psscr");
|
||||
if (validate_dt_prop_sizes("ibm,cpu-idle-state-flags",
|
||||
dt_idle_states,
|
||||
"ibm,cpu-idle-state-psscr",
|
||||
count) != 0)
|
||||
goto out;
|
||||
|
||||
count = of_property_count_u64_elems(power_mgt,
|
||||
"ibm,cpu-idle-state-psscr-mask");
|
||||
if (validate_dt_prop_sizes("ibm,cpu-idle-state-flags",
|
||||
dt_idle_states,
|
||||
"ibm,cpu-idle-state-psscr-mask",
|
||||
count) != 0)
|
||||
goto out;
|
||||
|
||||
if (of_property_read_u64_array(power_mgt,
|
||||
"ibm,cpu-idle-state-psscr", psscr_val, dt_idle_states)) {
|
||||
pr_warn("cpuidle-powernv: missing ibm,cpu-idle-state-psscr in DT\n");
|
||||
|
|
@ -292,8 +336,21 @@ static int powernv_add_idle_states(void)
|
|||
}
|
||||
}
|
||||
|
||||
rc = of_property_read_u32_array(power_mgt,
|
||||
"ibm,cpu-idle-state-residency-ns", residency_ns, dt_idle_states);
|
||||
count = of_property_count_u32_elems(power_mgt,
|
||||
"ibm,cpu-idle-state-residency-ns");
|
||||
|
||||
if (count < 0) {
|
||||
rc = count;
|
||||
} else if (validate_dt_prop_sizes("ibm,cpu-idle-state-flags",
|
||||
dt_idle_states,
|
||||
"ibm,cpu-idle-state-residency-ns",
|
||||
count) != 0) {
|
||||
goto out;
|
||||
} else {
|
||||
rc = of_property_read_u32_array(power_mgt,
|
||||
"ibm,cpu-idle-state-residency-ns",
|
||||
residency_ns, dt_idle_states);
|
||||
}
|
||||
|
||||
for (i = 0; i < dt_idle_states; i++) {
|
||||
unsigned int exit_latency, target_residency;
|
||||
|
|
|
|||
Loading…
Reference in a new issue