1 | // SPDX-License-Identifier: GPL-2.0-only |
2 | /* |
3 | * Power off driver for ams AS3722 device. |
4 | * |
5 | * Copyright (c) 2013, NVIDIA CORPORATION. All rights reserved. |
6 | * |
7 | * Author: Laxman Dewangan <ldewangan@nvidia.com> |
8 | */ |
9 | |
10 | #include <linux/mfd/as3722.h> |
11 | #include <linux/module.h> |
12 | #include <linux/of.h> |
13 | #include <linux/platform_device.h> |
14 | #include <linux/reboot.h> |
15 | #include <linux/slab.h> |
16 | |
17 | struct as3722_poweroff { |
18 | struct device *dev; |
19 | struct as3722 *as3722; |
20 | }; |
21 | |
22 | static int as3722_pm_power_off(struct sys_off_data *data) |
23 | { |
24 | struct as3722_poweroff *as3722_pm_poweroff = data->cb_data; |
25 | int ret; |
26 | |
27 | ret = as3722_update_bits(as3722: as3722_pm_poweroff->as3722, |
28 | AS3722_RESET_CONTROL_REG, AS3722_POWER_OFF, AS3722_POWER_OFF); |
29 | if (ret < 0) |
30 | dev_err(as3722_pm_poweroff->dev, |
31 | "RESET_CONTROL_REG update failed, %d\n" , ret); |
32 | |
33 | return NOTIFY_DONE; |
34 | } |
35 | |
36 | static int as3722_poweroff_probe(struct platform_device *pdev) |
37 | { |
38 | struct as3722_poweroff *as3722_poweroff; |
39 | struct device_node *np = pdev->dev.parent->of_node; |
40 | |
41 | if (!np) |
42 | return -EINVAL; |
43 | |
44 | if (!of_property_read_bool(np, propname: "ams,system-power-controller" )) |
45 | return 0; |
46 | |
47 | as3722_poweroff = devm_kzalloc(dev: &pdev->dev, size: sizeof(*as3722_poweroff), |
48 | GFP_KERNEL); |
49 | if (!as3722_poweroff) |
50 | return -ENOMEM; |
51 | |
52 | as3722_poweroff->as3722 = dev_get_drvdata(dev: pdev->dev.parent); |
53 | as3722_poweroff->dev = &pdev->dev; |
54 | |
55 | return devm_register_sys_off_handler(dev: as3722_poweroff->dev, |
56 | mode: SYS_OFF_MODE_POWER_OFF, |
57 | SYS_OFF_PRIO_DEFAULT, |
58 | callback: as3722_pm_power_off, |
59 | cb_data: as3722_poweroff); |
60 | |
61 | return 0; |
62 | } |
63 | |
64 | static struct platform_driver as3722_poweroff_driver = { |
65 | .driver = { |
66 | .name = "as3722-power-off" , |
67 | }, |
68 | .probe = as3722_poweroff_probe, |
69 | }; |
70 | |
71 | module_platform_driver(as3722_poweroff_driver); |
72 | |
73 | MODULE_DESCRIPTION("Power off driver for ams AS3722 PMIC Device" ); |
74 | MODULE_ALIAS("platform:as3722-power-off" ); |
75 | MODULE_AUTHOR("Laxman Dewangan <ldewangan@nvidia.com>" ); |
76 | |