aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/i2c
diff options
context:
space:
mode:
authorMasahiro Yamada <yamada.masahiro@socionext.com>2016-09-01 07:46:30 -0400
committerWolfram Sang <wsa@the-dreams.de>2016-09-08 16:41:31 -0400
commit0b1c7716fd871eaa6cb4a9a1df5396302411255a (patch)
tree8c82d077d6ca578e64e344c5e71c2988948c3471 /drivers/i2c
parent405188e86a4acb732f94f6d7a00b7fbb89cf5309 (diff)
i2c: uniphier-f: set the adapter to master mode when probing
Currently, the adapter is set to the master mode at the first use. Since then, it is kept in the slave mode, so unexpected glitch signals on the I2C lines may cause the adapter into insane state. Setting it to the master mode along with initialization solves the problem. Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com> Reported-by: Akio Noda <noda.akio@socionext.com> Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
Diffstat (limited to 'drivers/i2c')
-rw-r--r--drivers/i2c/busses/i2c-uniphier-f.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/drivers/i2c/busses/i2c-uniphier-f.c b/drivers/i2c/busses/i2c-uniphier-f.c
index 28866854950e..829df91cc759 100644
--- a/drivers/i2c/busses/i2c-uniphier-f.c
+++ b/drivers/i2c/busses/i2c-uniphier-f.c
@@ -458,16 +458,20 @@ static struct i2c_bus_recovery_info uniphier_fi2c_bus_recovery_info = {
458static void uniphier_fi2c_hw_init(struct uniphier_fi2c_priv *priv, 458static void uniphier_fi2c_hw_init(struct uniphier_fi2c_priv *priv,
459 u32 bus_speed, unsigned long clk_rate) 459 u32 bus_speed, unsigned long clk_rate)
460{ 460{
461 u32 clk_count; 461 u32 tmp;
462
463 tmp = readl(priv->membase + UNIPHIER_FI2C_CR);
464 tmp |= UNIPHIER_FI2C_CR_MST;
465 writel(tmp, priv->membase + UNIPHIER_FI2C_CR);
462 466
463 uniphier_fi2c_reset(priv); 467 uniphier_fi2c_reset(priv);
464 468
465 clk_count = clk_rate / bus_speed; 469 tmp = clk_rate / bus_speed;
466 470
467 writel(clk_count, priv->membase + UNIPHIER_FI2C_CYC); 471 writel(tmp, priv->membase + UNIPHIER_FI2C_CYC);
468 writel(clk_count / 2, priv->membase + UNIPHIER_FI2C_LCTL); 472 writel(tmp / 2, priv->membase + UNIPHIER_FI2C_LCTL);
469 writel(clk_count / 2, priv->membase + UNIPHIER_FI2C_SSUT); 473 writel(tmp / 2, priv->membase + UNIPHIER_FI2C_SSUT);
470 writel(clk_count / 16, priv->membase + UNIPHIER_FI2C_DSUT); 474 writel(tmp / 16, priv->membase + UNIPHIER_FI2C_DSUT);
471 475
472 uniphier_fi2c_prepare_operation(priv); 476 uniphier_fi2c_prepare_operation(priv);
473} 477}