summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohn Stultz <john.stultz@linaro.org>2019-06-03 18:23:18 -0400
committerSebastian Reichel <sebastian.reichel@collabora.com>2019-06-24 17:26:32 -0400
commitfce5430f6a86911ba3b4c8343ab04a88d7ad7795 (patch)
treeea3ee3b3396418b9443435af2fd7ffa5e3c9f0e6
parent9faf929608f52b907d8d41a455f3bee852f3dc85 (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.c12
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
17struct pm8916_pon { 20struct 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
24static int pm8916_reboot_mode_write(struct reboot_mode_driver *reboot, 28static 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
75static const struct of_device_id pm8916_pon_id_table[] = { 80static 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};
80MODULE_DEVICE_TABLE(of, pm8916_pon_id_table); 86MODULE_DEVICE_TABLE(of, pm8916_pon_id_table);