diff options
-rw-r--r-- | drivers/i2c/busses/i2c-s3c2410.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/drivers/i2c/busses/i2c-s3c2410.c b/drivers/i2c/busses/i2c-s3c2410.c index ba0006666b3..3a86f23cf44 100644 --- a/drivers/i2c/busses/i2c-s3c2410.c +++ b/drivers/i2c/busses/i2c-s3c2410.c @@ -76,6 +76,8 @@ struct s3c24xx_i2c { #ifdef CONFIG_CPU_FREQ struct notifier_block freq_transition; #endif + + int suspended; }; /* default platform data removed, dev should always carry data. */ @@ -135,6 +137,14 @@ static inline void s3c24xx_i2c_disable_irq(struct s3c24xx_i2c *i2c) unsigned long tmp; tmp = readl(i2c->regs + S3C2410_IICCON); + +/* S3c2442 datasheet + * + * If the IICCON[5]=0, IICCON[4] does not operate correctly. + * So, It is recommended that you should set IICCON[5]=1, + * although you does not use the IIC interrupt. + */ + writel(tmp & ~S3C2410_IICCON_IRQEN, i2c->regs + S3C2410_IICCON); } @@ -480,6 +490,14 @@ static int s3c24xx_i2c_doxfer(struct s3c24xx_i2c *i2c, if (i2c->suspended) return -EIO; + if (i2c->suspended) { + dev_err(i2c->dev, + "Hey I am still asleep (suspended: %d), retry later\n", + i2c->suspended); + ret = -EAGAIN; + goto out; + } + ret = s3c24xx_i2c_set_master(i2c); if (ret != 0) { dev_err(i2c->dev, "cannot get bus (error %d)\n", ret); @@ -973,6 +991,8 @@ static int s3c24xx_i2c_resume(struct platform_device *dev) i2c->suspended = 0; s3c24xx_i2c_init(i2c); + i2c->suspended--; + return 0; } |