From 0adde3c3d8bd67aa17b21cd9386759559885a613 Mon Sep 17 00:00:00 2001 From: Jason Chen Date: Wed, 25 May 2011 18:36:03 +0800 Subject: LINARO: MX53: add pmic poweroff support BugLink: http://bugs.launchpad.net/bugs/738217 Signed-off-by: Jason Chen Signed-off-by: Eric Miao --- arch/arm/mach-mx5/board-mx53_loco.c | 3 +++ drivers/mfd/da9052-core.c | 18 ++++++++++++++++++ include/linux/mfd/da9052/da9052.h | 1 + 3 files changed, 22 insertions(+) diff --git a/arch/arm/mach-mx5/board-mx53_loco.c b/arch/arm/mach-mx5/board-mx53_loco.c index b12ce22883f9..740fb6b8021c 100644 --- a/arch/arm/mach-mx5/board-mx53_loco.c +++ b/arch/arm/mach-mx5/board-mx53_loco.c @@ -28,6 +28,7 @@ #include #include #include +#include #include #include @@ -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 9290831f26b8..d6e47df58fc7 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 fd83f73bcd82..c477023e2f8c 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 */ -- cgit v1.2.3