diff options
author | Alex Gonzalez <alex.gonzalez@digi.com> | 2012-01-27 17:28:14 +0100 |
---|---|---|
committer | Alex Gonzalez <alex.gonzalez@digi.com> | 2012-01-31 10:08:55 +0100 |
commit | 7b953d0c53332aef1e5c3e69aef5fe86a5f39b58 (patch) | |
tree | 4e9dd640ffef1c27137fbe050df4d97a2bbf8108 | |
parent | d6511a4bb6a4f3d2d007ecb7f7ccb617f2160145 (diff) |
reset: Implement PMIC read workaround.
Signed-off-by: Alex Gonzalez <alex.gonzalez@digi.com>
-rw-r--r-- | arch/arm/plat-mxc/system.c | 5 | ||||
-rw-r--r-- | drivers/mfd/da9052-core.c | 37 |
2 files changed, 31 insertions, 11 deletions
diff --git a/arch/arm/plat-mxc/system.c b/arch/arm/plat-mxc/system.c index 98ceed280c4e..81c69e49424a 100644 --- a/arch/arm/plat-mxc/system.c +++ b/arch/arm/plat-mxc/system.c @@ -37,6 +37,7 @@ static void __iomem *wdog_base; extern int dvfs_core_is_active; extern void stop_dvfs(void); +extern void da9053_last_read(void); #define MX53_WDA_GPIO 9 /* * Reset the system. It is called by machine_restart(). @@ -83,6 +84,10 @@ void arch_reset(char mode, const char *cmd) wcr_enable = (1 << 2); } +#if defined(CONFIG_MODULE_CCXMX53) + da9053_last_read(); +#endif + /* Assert SRS signal */ __raw_writew(wcr_enable, wdog_base); diff --git a/drivers/mfd/da9052-core.c b/drivers/mfd/da9052-core.c index 4babd287e9c5..6ba73bb329a9 100644 --- a/drivers/mfd/da9052-core.c +++ b/drivers/mfd/da9052-core.c @@ -555,11 +555,34 @@ void da9052_ssc_exit(struct da9052 *da9052) return; } +// A Dialog reported PMIC I2C bug needs to finish with an I2C read +// or the PMIC won't power up again in some cases. +void da9053_last_read( void) +{ + struct da9052_ssc_msg msg_test; + + if (!da9052_data){ + printk("Can't apply da9053 I2C workaround\n"); + return; + } + + if( !mutex_is_locked(&da9052_data->ssc_lock) ) + da9052_lock(da9052_data); + + BUG_ON( !mutex_is_locked(&da9052_data->ssc_lock) ); + + // Dummy read + msg_test.addr = DA9052_GPIO0809_REG; + msg_test.data = 0; + da9052_data->read(da9052_data, &msg_test); + + // Do not unlock to disallow any other I2C access. +} + void da9053_power_off(void) { #if defined(CONFIG_MODULE_CCXMX53) struct da9052_ssc_msg msgs[5]; - struct da9052_ssc_msg msg_test; int ret; if (!da9052_data) @@ -588,18 +611,10 @@ void da9053_power_off(void) if (ret != 0) printk(KERN_WARNING "DA9052: %s failure\n", __func__); - // Dummy read - msg_test.addr = DA9052_GPIO0809_REG; - msg_test.data = 0; - da9052_data->read(da9052_data, &msg_test); - - // Do not unlock to disallow any other I2C access. + da9053_last_read(); - // A Dialog reported PMIC I2C bug needs to finish with an I2C read - // or the PMIC won't power up again in some cases. + // No more accesses while(1); - - da9052_unlock(da9052_data); #else struct da9052_ssc_msg ssc_msg; if (!da9052_data) |