|
|
|
@ -757,19 +757,18 @@ EXPORT_SYMBOL_GPL(bL_switcher_put_enabled); |
|
|
|
|
* while the switcher is active. |
|
|
|
|
* We're just not ready to deal with that given the trickery involved. |
|
|
|
|
*/ |
|
|
|
|
static int bL_switcher_hotplug_callback(struct notifier_block *nfb, |
|
|
|
|
unsigned long action, void *hcpu) |
|
|
|
|
static int bL_switcher_cpu_pre(unsigned int cpu) |
|
|
|
|
{ |
|
|
|
|
if (bL_switcher_active) { |
|
|
|
|
int pairing = bL_switcher_cpu_pairing[(unsigned long)hcpu]; |
|
|
|
|
switch (action & 0xf) { |
|
|
|
|
case CPU_UP_PREPARE: |
|
|
|
|
case CPU_DOWN_PREPARE: |
|
|
|
|
if (pairing == -1) |
|
|
|
|
return NOTIFY_BAD; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return NOTIFY_DONE; |
|
|
|
|
int pairing; |
|
|
|
|
|
|
|
|
|
if (!bL_switcher_active) |
|
|
|
|
return 0; |
|
|
|
|
|
|
|
|
|
pairing = bL_switcher_cpu_pairing[cpu]; |
|
|
|
|
|
|
|
|
|
if (pairing == -1) |
|
|
|
|
return -EINVAL; |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static bool no_bL_switcher; |
|
|
|
@ -782,8 +781,15 @@ static int __init bL_switcher_init(void) |
|
|
|
|
if (!mcpm_is_available()) |
|
|
|
|
return -ENODEV; |
|
|
|
|
|
|
|
|
|
cpu_notifier(bL_switcher_hotplug_callback, 0); |
|
|
|
|
|
|
|
|
|
cpuhp_setup_state_nocalls(CPUHP_ARM_BL_PREPARE, "arm/bl:prepare", |
|
|
|
|
bL_switcher_cpu_pre, NULL); |
|
|
|
|
ret = cpuhp_setup_state_nocalls(CPUHP_AP_ONLINE_DYN, "arm/bl:predown", |
|
|
|
|
NULL, bL_switcher_cpu_pre); |
|
|
|
|
if (ret < 0) { |
|
|
|
|
cpuhp_remove_state_nocalls(CPUHP_ARM_BL_PREPARE); |
|
|
|
|
pr_err("bL_switcher: Failed to allocate a hotplug state\n"); |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
if (!no_bL_switcher) { |
|
|
|
|
ret = bL_switcher_enable(); |
|
|
|
|
if (ret) |
|
|
|
|