1 // SPDX-License-Identifier: GPL-2.0
2 // Copyright (c) 2017-18 Linaro Limited
4 #include <linux/delay.h>
5 #include <linux/errno.h>
6 #include <linux/kernel.h>
7 #include <linux/module.h>
9 #include <linux/of_platform.h>
10 #include <linux/platform_device.h>
11 #include <linux/reboot.h>
12 #include <linux/reboot-mode.h>
13 #include <linux/regmap.h>
15 #define PON_SOFT_RB_SPARE 0x8f
19 struct regmap
*regmap
;
21 struct reboot_mode_driver reboot_mode
;
24 static int pm8916_reboot_mode_write(struct reboot_mode_driver
*reboot
,
27 struct pm8916_pon
*pon
= container_of
28 (reboot
, struct pm8916_pon
, reboot_mode
);
31 ret
= regmap_update_bits(pon
->regmap
,
32 pon
->baseaddr
+ PON_SOFT_RB_SPARE
,
35 dev_err(pon
->dev
, "update reboot mode bits failed\n");
40 static int pm8916_pon_probe(struct platform_device
*pdev
)
42 struct pm8916_pon
*pon
;
45 pon
= devm_kzalloc(&pdev
->dev
, sizeof(*pon
), GFP_KERNEL
);
49 pon
->dev
= &pdev
->dev
;
51 pon
->regmap
= dev_get_regmap(pdev
->dev
.parent
, NULL
);
53 dev_err(&pdev
->dev
, "failed to locate regmap\n");
57 error
= of_property_read_u32(pdev
->dev
.of_node
, "reg",
62 pon
->reboot_mode
.dev
= &pdev
->dev
;
63 pon
->reboot_mode
.write
= pm8916_reboot_mode_write
;
64 error
= devm_reboot_mode_register(&pdev
->dev
, &pon
->reboot_mode
);
66 dev_err(&pdev
->dev
, "can't register reboot mode\n");
70 platform_set_drvdata(pdev
, pon
);
72 return devm_of_platform_populate(&pdev
->dev
);
75 static const struct of_device_id pm8916_pon_id_table
[] = {
76 { .compatible
= "qcom,pm8916-pon" },
77 { .compatible
= "qcom,pms405-pon" },
80 MODULE_DEVICE_TABLE(of
, pm8916_pon_id_table
);
82 static struct platform_driver pm8916_pon_driver
= {
83 .probe
= pm8916_pon_probe
,
86 .of_match_table
= of_match_ptr(pm8916_pon_id_table
),
89 module_platform_driver(pm8916_pon_driver
);
91 MODULE_DESCRIPTION("pm8916 Power On driver");
92 MODULE_LICENSE("GPL v2");