diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2020-04-05 13:47:57 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2020-04-05 13:47:57 -0700 |
commit | a10c9c710f9ecea87b9f4bbb837467893b4bef01 (patch) | |
tree | 462defb69d4bf44481cfd1d5394b56e52909a61f /drivers/power/reset/sc27xx-poweroff.c | |
parent | c48b07226bd41f4053aa2024c5e347183c04deb5 (diff) | |
parent | f78c55e3b4806974f7d590b2aab8683232b7bd25 (diff) |
Merge tag 'for-v5.7' of git://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply
Pull power supply and reset changes from Sebastian Reichel:
"Core:
- Nothing
Drivers:
- at91-reset: cleanups, proper handling for sam9x60
- sc27xx, charger-manager: allow building as module
- sc27xx: add support to read current charge capacity
- axp288: more quirks for weird hardware
- misc fixes"
* tag 'for-v5.7' of git://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply: (26 commits)
power: reset: sc27xx: Allow the SC27XX poweroff driver building into a module
power: reset: sc27xx: Change to use cpu_down()
power: reset: sc27xx: Power off the external subsystems' connection
power: twl4030: Use scnprintf() for avoiding potential buffer overflow
power: supply: bq27xxx_battery: Silence deferred-probe error
power: reset: at91-reset: handle nrst async for sam9x60
power: reset: at91-reset: get rid of at91_reset_data
power: reset: at91-reset: keep only one reset function
power: reset: at91-reset: make at91sam9g45_restart() generic
power: reset: at91-reset: introduce ramc_lpr to struct at91_reset
power: reset: at91-reset: use r4 as tmp argument
power: reset: at91-reset: introduce args member in at91_reset_data
power: reset: at91-reset: introduce struct at91_reset_data
power: reset: at91-reset: devm_kzalloc() for at91_reset data structure
power: reset: at91-reset: pass rstc base address to at91_reset_status()
power: reset: at91-reset: convert reset in pointer to struct at91_reset
power: reset: at91-reset: add notifier block to struct at91_reset
power: reset: at91-reset: add sclk to struct at91_reset
power: reset: at91-reset: add ramc_base[] to struct at91_reset
power: reset: at91-reset: introduce struct at91_reset
...
Diffstat (limited to 'drivers/power/reset/sc27xx-poweroff.c')
-rw-r--r-- | drivers/power/reset/sc27xx-poweroff.c | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/drivers/power/reset/sc27xx-poweroff.c b/drivers/power/reset/sc27xx-poweroff.c index 29fb08b8faa0..90287c31992c 100644 --- a/drivers/power/reset/sc27xx-poweroff.c +++ b/drivers/power/reset/sc27xx-poweroff.c @@ -6,6 +6,7 @@ #include <linux/cpu.h> #include <linux/kernel.h> +#include <linux/module.h> #include <linux/platform_device.h> #include <linux/pm.h> #include <linux/regmap.h> @@ -13,6 +14,8 @@ #define SC27XX_PWR_PD_HW 0xc2c #define SC27XX_PWR_OFF_EN BIT(0) +#define SC27XX_SLP_CTRL 0xdf0 +#define SC27XX_LDO_XTL_EN BIT(3) static struct regmap *regmap; @@ -27,10 +30,13 @@ static struct regmap *regmap; */ static void sc27xx_poweroff_shutdown(void) { -#ifdef CONFIG_PM_SLEEP_SMP - int cpu = smp_processor_id(); +#ifdef CONFIG_HOTPLUG_CPU + int cpu; - freeze_secondary_cpus(cpu); + for_each_online_cpu(cpu) { + if (cpu != smp_processor_id()) + remove_cpu(cpu); + } #endif } @@ -40,6 +46,9 @@ static struct syscore_ops poweroff_syscore_ops = { static void sc27xx_poweroff_do_poweroff(void) { + /* Disable the external subsys connection's power firstly */ + regmap_write(regmap, SC27XX_SLP_CTRL, SC27XX_LDO_XTL_EN); + regmap_write(regmap, SC27XX_PWR_PD_HW, SC27XX_PWR_OFF_EN); } @@ -63,4 +72,8 @@ static struct platform_driver sc27xx_poweroff_driver = { .name = "sc27xx-poweroff", }, }; -builtin_platform_driver(sc27xx_poweroff_driver); +module_platform_driver(sc27xx_poweroff_driver); + +MODULE_DESCRIPTION("Power off driver for SC27XX PMIC Device"); +MODULE_AUTHOR("Baolin Wang <baolin.wang@unisoc.com>"); +MODULE_LICENSE("GPL v2"); |