diff options
author | Jason Chen <b02280@freescale.com> | 2011-05-25 18:36:03 +0800 |
---|---|---|
committer | Eric Miao <eric.miao@linaro.org> | 2011-05-27 21:11:30 +0800 |
commit | 0adde3c3d8bd67aa17b21cd9386759559885a613 (patch) | |
tree | e5e20bd922f39253bfb3bb3646846382b1a728ef | |
parent | 8ee59be38f87bd49562248f4366e09479dcdaaf8 (diff) |
LINARO: MX53: add pmic poweroff support
BugLink: http://bugs.launchpad.net/bugs/738217
Signed-off-by: Jason Chen <jason.chen@linaro.org>
Signed-off-by: Eric Miao <eric.miao@linaro.org>
-rw-r--r-- | arch/arm/mach-mx5/board-mx53_loco.c | 3 | ||||
-rw-r--r-- | drivers/mfd/da9052-core.c | 18 | ||||
-rw-r--r-- | include/linux/mfd/da9052/da9052.h | 1 |
3 files changed, 22 insertions, 0 deletions
diff --git a/arch/arm/mach-mx5/board-mx53_loco.c b/arch/arm/mach-mx5/board-mx53_loco.c index b12ce22883f..740fb6b8021 100644 --- a/arch/arm/mach-mx5/board-mx53_loco.c +++ b/arch/arm/mach-mx5/board-mx53_loco.c @@ -28,6 +28,7 @@ #include <linux/pwm_backlight.h> #include <linux/ahci_platform.h> #include <linux/gpio_keys.h> +#include <linux/mfd/da9052/da9052.h> #include <mach/common.h> #include <mach/hardware.h> @@ -774,6 +775,8 @@ static void __init mx53_loco_board_init(void) * during boot, even if SCC2 driver is not part of the image */ imx53_add_mxc_scc2(); + + pm_power_off = da9053_power_off; } static void __init mx53_loco_timer_init(void) diff --git a/drivers/mfd/da9052-core.c b/drivers/mfd/da9052-core.c index 9290831f26b..d6e47df58fc 100644 --- a/drivers/mfd/da9052-core.c +++ b/drivers/mfd/da9052-core.c @@ -34,6 +34,7 @@ struct da9052_eh_nb eve_nb_array[EVE_CNT]; static struct da9052_ssc_ops ssc_ops; struct mutex manconv_lock; static struct semaphore eve_nb_array_lock; +static struct da9052 *da9052_data; void da9052_lock(struct da9052 *da9052) { @@ -370,6 +371,22 @@ static void da9052_eh_restore_irq(struct da9052 *da9052) free_irq(da9052->irq, NULL); } +void da9053_power_off(void) +{ + struct da9052_ssc_msg ssc_msg; + if (!da9052_data) + return; + + ssc_msg.addr = DA9052_CONTROLB_REG; + da9052_data->read(da9052_data, &ssc_msg); + ssc_msg.data |= DA9052_CONTROLB_SHUTDOWN; + pr_info("da9052 shutdown: DA9052_CONTROLB_REG=%x\n", ssc_msg.data); + da9052_data->write(da9052_data, &ssc_msg); + ssc_msg.addr = DA9052_GPID9_REG; + ssc_msg.data = 0; + da9052_data->read(da9052_data, &ssc_msg); +} + static int da9052_add_subdevice_pdata(struct da9052 *da9052, const char *name, void *pdata, size_t pdata_size) { @@ -512,6 +529,7 @@ int da9052_ssc_init(struct da9052 *da9052) DA9052_EH_DEVICE_NAME, da9052)) return -EIO; enable_irq_wake(da9052->irq); + da9052_data = da9052; return 0; } diff --git a/include/linux/mfd/da9052/da9052.h b/include/linux/mfd/da9052/da9052.h index fd83f73bcd8..c477023e2f8 100644 --- a/include/linux/mfd/da9052/da9052.h +++ b/include/linux/mfd/da9052/da9052.h @@ -206,4 +206,5 @@ int eh_register_nb(struct da9052 *da9052, struct da9052_eh_nb *nb); int eh_unregister_nb(struct da9052 *da9052, struct da9052_eh_nb *nb); int da9052_manual_read(struct da9052 *da9052, unsigned char channel); +void da9053_power_off(void); #endif /* __LINUX_MFD_DA9052_DA9052_H */ |