summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Gonzalez <alex.gonzalez@digi.com>2012-01-27 17:28:14 +0100
committerAlex Gonzalez <alex.gonzalez@digi.com>2012-01-31 10:08:55 +0100
commit7b953d0c53332aef1e5c3e69aef5fe86a5f39b58 (patch)
tree4e9dd640ffef1c27137fbe050df4d97a2bbf8108
parentd6511a4bb6a4f3d2d007ecb7f7ccb617f2160145 (diff)
reset: Implement PMIC read workaround.
Signed-off-by: Alex Gonzalez <alex.gonzalez@digi.com>
-rw-r--r--arch/arm/plat-mxc/system.c5
-rw-r--r--drivers/mfd/da9052-core.c37
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)