forked from Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
87 lines
2.0 KiB
87 lines
2.0 KiB
// SPDX-License-Identifier: GPL-2.0-only |
|
/* |
|
* Power off driver for ams AS3722 device. |
|
* |
|
* Copyright (c) 2013, NVIDIA CORPORATION. All rights reserved. |
|
* |
|
* Author: Laxman Dewangan <[email protected]> |
|
*/ |
|
|
|
#include <linux/mfd/as3722.h> |
|
#include <linux/module.h> |
|
#include <linux/of.h> |
|
#include <linux/of_device.h> |
|
#include <linux/platform_device.h> |
|
#include <linux/slab.h> |
|
|
|
struct as3722_poweroff { |
|
struct device *dev; |
|
struct as3722 *as3722; |
|
}; |
|
|
|
static struct as3722_poweroff *as3722_pm_poweroff; |
|
|
|
static void as3722_pm_power_off(void) |
|
{ |
|
int ret; |
|
|
|
if (!as3722_pm_poweroff) { |
|
pr_err("AS3722 poweroff is not initialised\n"); |
|
return; |
|
} |
|
|
|
ret = as3722_update_bits(as3722_pm_poweroff->as3722, |
|
AS3722_RESET_CONTROL_REG, AS3722_POWER_OFF, AS3722_POWER_OFF); |
|
if (ret < 0) |
|
dev_err(as3722_pm_poweroff->dev, |
|
"RESET_CONTROL_REG update failed, %d\n", ret); |
|
} |
|
|
|
static int as3722_poweroff_probe(struct platform_device *pdev) |
|
{ |
|
struct as3722_poweroff *as3722_poweroff; |
|
struct device_node *np = pdev->dev.parent->of_node; |
|
|
|
if (!np) |
|
return -EINVAL; |
|
|
|
if (!of_property_read_bool(np, "ams,system-power-controller")) |
|
return 0; |
|
|
|
as3722_poweroff = devm_kzalloc(&pdev->dev, sizeof(*as3722_poweroff), |
|
GFP_KERNEL); |
|
if (!as3722_poweroff) |
|
return -ENOMEM; |
|
|
|
as3722_poweroff->as3722 = dev_get_drvdata(pdev->dev.parent); |
|
as3722_poweroff->dev = &pdev->dev; |
|
as3722_pm_poweroff = as3722_poweroff; |
|
if (!pm_power_off) |
|
pm_power_off = as3722_pm_power_off; |
|
|
|
return 0; |
|
} |
|
|
|
static int as3722_poweroff_remove(struct platform_device *pdev) |
|
{ |
|
if (pm_power_off == as3722_pm_power_off) |
|
pm_power_off = NULL; |
|
as3722_pm_poweroff = NULL; |
|
|
|
return 0; |
|
} |
|
|
|
static struct platform_driver as3722_poweroff_driver = { |
|
.driver = { |
|
.name = "as3722-power-off", |
|
}, |
|
.probe = as3722_poweroff_probe, |
|
.remove = as3722_poweroff_remove, |
|
}; |
|
|
|
module_platform_driver(as3722_poweroff_driver); |
|
|
|
MODULE_DESCRIPTION("Power off driver for ams AS3722 PMIC Device"); |
|
MODULE_ALIAS("platform:as3722-power-off"); |
|
MODULE_AUTHOR("Laxman Dewangan <[email protected]>"); |
|
MODULE_LICENSE("GPL v2");
|
|
|