diff options
author | John Stultz <john.stultz@linaro.org> | 2019-06-03 18:23:18 -0400 |
---|---|---|
committer | Sebastian Reichel <sebastian.reichel@collabora.com> | 2019-06-24 17:26:32 -0400 |
commit | fce5430f6a86911ba3b4c8343ab04a88d7ad7795 (patch) | |
tree | ea3ee3b3396418b9443435af2fd7ffa5e3c9f0e6 | |
parent | 9faf929608f52b907d8d41a455f3bee852f3dc85 (diff) |
reset: qcom-pon: Add support for gen2 pon
Add support for gen2 pon register so "reboot bootloader" can
work on pixel3 and db845.
Cc: Andy Gross <agross@kernel.org>
Cc: David Brown <david.brown@linaro.org>
Cc: Bjorn Andersson <bjorn.andersson@linaro.org>
Cc: Amit Pundir <amit.pundir@linaro.org>
Cc: Rob Herring <robh+dt@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Sebastian Reichel <sre@kernel.org>
Cc: linux-arm-msm@vger.kernel.org
Cc: devicetree@vger.kernel.org
Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org>
Signed-off-by: John Stultz <john.stultz@linaro.org>
v2:
* Split out dts changes into separate path
* Minor cleanups and remove unused variables
Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
-rw-r--r-- | drivers/power/reset/qcom-pon.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/drivers/power/reset/qcom-pon.c b/drivers/power/reset/qcom-pon.c index 3fa1642d4c54..22a743a0bf28 100644 --- a/drivers/power/reset/qcom-pon.c +++ b/drivers/power/reset/qcom-pon.c | |||
@@ -14,11 +14,15 @@ | |||
14 | 14 | ||
15 | #define PON_SOFT_RB_SPARE 0x8f | 15 | #define PON_SOFT_RB_SPARE 0x8f |
16 | 16 | ||
17 | #define GEN1_REASON_SHIFT 2 | ||
18 | #define GEN2_REASON_SHIFT 1 | ||
19 | |||
17 | struct pm8916_pon { | 20 | struct pm8916_pon { |
18 | struct device *dev; | 21 | struct device *dev; |
19 | struct regmap *regmap; | 22 | struct regmap *regmap; |
20 | u32 baseaddr; | 23 | u32 baseaddr; |
21 | struct reboot_mode_driver reboot_mode; | 24 | struct reboot_mode_driver reboot_mode; |
25 | long reason_shift; | ||
22 | }; | 26 | }; |
23 | 27 | ||
24 | static int pm8916_reboot_mode_write(struct reboot_mode_driver *reboot, | 28 | static int pm8916_reboot_mode_write(struct reboot_mode_driver *reboot, |
@@ -30,7 +34,7 @@ static int pm8916_reboot_mode_write(struct reboot_mode_driver *reboot, | |||
30 | 34 | ||
31 | ret = regmap_update_bits(pon->regmap, | 35 | ret = regmap_update_bits(pon->regmap, |
32 | pon->baseaddr + PON_SOFT_RB_SPARE, | 36 | pon->baseaddr + PON_SOFT_RB_SPARE, |
33 | 0xfc, magic << 2); | 37 | 0xfc, magic << pon->reason_shift); |
34 | if (ret < 0) | 38 | if (ret < 0) |
35 | dev_err(pon->dev, "update reboot mode bits failed\n"); | 39 | dev_err(pon->dev, "update reboot mode bits failed\n"); |
36 | 40 | ||
@@ -60,6 +64,7 @@ static int pm8916_pon_probe(struct platform_device *pdev) | |||
60 | return error; | 64 | return error; |
61 | 65 | ||
62 | pon->reboot_mode.dev = &pdev->dev; | 66 | pon->reboot_mode.dev = &pdev->dev; |
67 | pon->reason_shift = (long)of_device_get_match_data(&pdev->dev); | ||
63 | pon->reboot_mode.write = pm8916_reboot_mode_write; | 68 | pon->reboot_mode.write = pm8916_reboot_mode_write; |
64 | error = devm_reboot_mode_register(&pdev->dev, &pon->reboot_mode); | 69 | error = devm_reboot_mode_register(&pdev->dev, &pon->reboot_mode); |
65 | if (error) { | 70 | if (error) { |
@@ -73,8 +78,9 @@ static int pm8916_pon_probe(struct platform_device *pdev) | |||
73 | } | 78 | } |
74 | 79 | ||
75 | static const struct of_device_id pm8916_pon_id_table[] = { | 80 | static const struct of_device_id pm8916_pon_id_table[] = { |
76 | { .compatible = "qcom,pm8916-pon" }, | 81 | { .compatible = "qcom,pm8916-pon", .data = (void *)GEN1_REASON_SHIFT }, |
77 | { .compatible = "qcom,pms405-pon" }, | 82 | { .compatible = "qcom,pms405-pon", .data = (void *)GEN1_REASON_SHIFT }, |
83 | { .compatible = "qcom,pm8998-pon", .data = (void *)GEN2_REASON_SHIFT }, | ||
78 | { } | 84 | { } |
79 | }; | 85 | }; |
80 | MODULE_DEVICE_TABLE(of, pm8916_pon_id_table); | 86 | MODULE_DEVICE_TABLE(of, pm8916_pon_id_table); |