hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
kernel/drivers/power/reset/qcom-pon.c
....@@ -14,11 +14,15 @@
1414
1515 #define PON_SOFT_RB_SPARE 0x8f
1616
17
+#define GEN1_REASON_SHIFT 2
18
+#define GEN2_REASON_SHIFT 1
19
+
1720 struct pm8916_pon {
1821 struct device *dev;
1922 struct regmap *regmap;
2023 u32 baseaddr;
2124 struct reboot_mode_driver reboot_mode;
25
+ long reason_shift;
2226 };
2327
2428 static int pm8916_reboot_mode_write(struct reboot_mode_driver *reboot,
....@@ -30,7 +34,8 @@
3034
3135 ret = regmap_update_bits(pon->regmap,
3236 pon->baseaddr + PON_SOFT_RB_SPARE,
33
- 0xfc, magic << 2);
37
+ GENMASK(7, pon->reason_shift),
38
+ magic << pon->reason_shift);
3439 if (ret < 0)
3540 dev_err(pon->dev, "update reboot mode bits failed\n");
3641
....@@ -60,6 +65,7 @@
6065 return error;
6166
6267 pon->reboot_mode.dev = &pdev->dev;
68
+ pon->reason_shift = (long)of_device_get_match_data(&pdev->dev);
6369 pon->reboot_mode.write = pm8916_reboot_mode_write;
6470 error = devm_reboot_mode_register(&pdev->dev, &pon->reboot_mode);
6571 if (error) {
....@@ -73,7 +79,9 @@
7379 }
7480
7581 static const struct of_device_id pm8916_pon_id_table[] = {
76
- { .compatible = "qcom,pm8916-pon" },
82
+ { .compatible = "qcom,pm8916-pon", .data = (void *)GEN1_REASON_SHIFT },
83
+ { .compatible = "qcom,pms405-pon", .data = (void *)GEN1_REASON_SHIFT },
84
+ { .compatible = "qcom,pm8998-pon", .data = (void *)GEN2_REASON_SHIFT },
7785 { }
7886 };
7987 MODULE_DEVICE_TABLE(of, pm8916_pon_id_table);