|
10 | 10 | #include <linux/of_device.h> |
11 | 11 | #include <linux/regulator/of_regulator.h> |
12 | 12 | #include <linux/platform_device.h> |
| 13 | +#include <linux/reboot.h> |
13 | 14 | #include <linux/regulator/driver.h> |
14 | 15 | #include <linux/regulator/machine.h> |
15 | 16 | #include <linux/regulator/pfuze100.h> |
@@ -569,10 +570,10 @@ static inline struct device_node *match_of_node(int index) |
569 | 570 | return pfuze_matches[index].of_node; |
570 | 571 | } |
571 | 572 |
|
572 | | -static struct pfuze_chip *syspm_pfuze_chip; |
573 | | - |
574 | | -static void pfuze_power_off_prepare(void) |
| 573 | +static int pfuze_power_off_prepare(struct sys_off_data *data) |
575 | 574 | { |
| 575 | + struct pfuze_chip *syspm_pfuze_chip = data->cb_data; |
| 576 | + |
576 | 577 | dev_info(syspm_pfuze_chip->dev, "Configure standby mode for power off"); |
577 | 578 |
|
578 | 579 | /* Switch from default mode: APS/APS to APS/Off */ |
@@ -607,28 +608,30 @@ static void pfuze_power_off_prepare(void) |
607 | 608 | regmap_update_bits(syspm_pfuze_chip->regmap, PFUZE100_VGEN6VOL, |
608 | 609 | PFUZE100_VGENxLPWR | PFUZE100_VGENxSTBY, |
609 | 610 | PFUZE100_VGENxSTBY); |
| 611 | + |
| 612 | + return NOTIFY_DONE; |
610 | 613 | } |
611 | 614 |
|
612 | 615 | static int pfuze_power_off_prepare_init(struct pfuze_chip *pfuze_chip) |
613 | 616 | { |
| 617 | + int err; |
| 618 | + |
614 | 619 | if (pfuze_chip->chip_id != PFUZE100) { |
615 | 620 | dev_warn(pfuze_chip->dev, "Requested pm_power_off_prepare handler for not supported chip\n"); |
616 | 621 | return -ENODEV; |
617 | 622 | } |
618 | 623 |
|
619 | | - if (pm_power_off_prepare) { |
620 | | - dev_warn(pfuze_chip->dev, "pm_power_off_prepare is already registered.\n"); |
621 | | - return -EBUSY; |
| 624 | + err = devm_register_sys_off_handler(pfuze_chip->dev, |
| 625 | + SYS_OFF_MODE_POWER_OFF_PREPARE, |
| 626 | + SYS_OFF_PRIO_DEFAULT, |
| 627 | + pfuze_power_off_prepare, |
| 628 | + pfuze_chip); |
| 629 | + if (err) { |
| 630 | + dev_err(pfuze_chip->dev, "failed to register sys-off handler: %d\n", |
| 631 | + err); |
| 632 | + return err; |
622 | 633 | } |
623 | 634 |
|
624 | | - if (syspm_pfuze_chip) { |
625 | | - dev_warn(pfuze_chip->dev, "syspm_pfuze_chip is already set.\n"); |
626 | | - return -EBUSY; |
627 | | - } |
628 | | - |
629 | | - syspm_pfuze_chip = pfuze_chip; |
630 | | - pm_power_off_prepare = pfuze_power_off_prepare; |
631 | | - |
632 | 635 | return 0; |
633 | 636 | } |
634 | 637 |
|
@@ -837,23 +840,12 @@ static int pfuze100_regulator_probe(struct i2c_client *client, |
837 | 840 | return 0; |
838 | 841 | } |
839 | 842 |
|
840 | | -static int pfuze100_regulator_remove(struct i2c_client *client) |
841 | | -{ |
842 | | - if (syspm_pfuze_chip) { |
843 | | - syspm_pfuze_chip = NULL; |
844 | | - pm_power_off_prepare = NULL; |
845 | | - } |
846 | | - |
847 | | - return 0; |
848 | | -} |
849 | | - |
850 | 843 | static struct i2c_driver pfuze_driver = { |
851 | 844 | .driver = { |
852 | 845 | .name = "pfuze100-regulator", |
853 | 846 | .of_match_table = pfuze_dt_ids, |
854 | 847 | }, |
855 | 848 | .probe = pfuze100_regulator_probe, |
856 | | - .remove = pfuze100_regulator_remove, |
857 | 849 | }; |
858 | 850 | module_i2c_driver(pfuze_driver); |
859 | 851 |
|
|
0 commit comments