aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/i2c/busses/i2c-designware.c
diff options
context:
space:
mode:
authorShinya Kuribayashi <shinya.kuribayashi@necel.com>2009-11-06 07:48:12 -0500
committerBen Dooks <ben-linux@fluff.org>2009-12-08 19:19:11 -0500
commit4cb6d1d6da471d795320cc4a933ce60f415dd1f6 (patch)
tree0ca9f5254f74590f8f3bd72064b327a77395e01c /drivers/i2c/busses/i2c-designware.c
parent0774539948b23984f1c866135ba307fa2c441d0e (diff)
i2c-designware: Set Tx/Rx FIFO threshold levels
As a hardware feature, DW I2C core generates a STOP condition whenever the Tx FIFO becomes empty (strictly speaking, whenever the last byte in the Tx FIFO is sent out), even if we have more bytes to be written. In other words, we must never make "Tx FIFO underrun" happen during a transaction, except for the last byte. For the safety's sake, we'd make TX_EMPTY interrupt get triggered every time one byte is processed. The Rx FIFO threshold needs to be set as well. Signed-off-by: Shinya Kuribayashi <shinya.kuribayashi@necel.com> Acked-by: Baruch Siach <baruch@tkos.co.il> Signed-off-by: Ben Dooks <ben-linux@fluff.org>
Diffstat (limited to 'drivers/i2c/busses/i2c-designware.c')
-rw-r--r--drivers/i2c/busses/i2c-designware.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/drivers/i2c/busses/i2c-designware.c b/drivers/i2c/busses/i2c-designware.c
index 5fce1a07e6c..0eea0dd3589 100644
--- a/drivers/i2c/busses/i2c-designware.c
+++ b/drivers/i2c/busses/i2c-designware.c
@@ -50,6 +50,8 @@
50#define DW_IC_INTR_STAT 0x2c 50#define DW_IC_INTR_STAT 0x2c
51#define DW_IC_INTR_MASK 0x30 51#define DW_IC_INTR_MASK 0x30
52#define DW_IC_RAW_INTR_STAT 0x34 52#define DW_IC_RAW_INTR_STAT 0x34
53#define DW_IC_RX_TL 0x38
54#define DW_IC_TX_TL 0x3c
53#define DW_IC_CLR_INTR 0x40 55#define DW_IC_CLR_INTR 0x40
54#define DW_IC_CLR_RX_UNDER 0x44 56#define DW_IC_CLR_RX_UNDER 0x44
55#define DW_IC_CLR_RX_OVER 0x48 57#define DW_IC_CLR_RX_OVER 0x48
@@ -295,6 +297,10 @@ static void i2c_dw_init(struct dw_i2c_dev *dev)
295 writel(lcnt, dev->base + DW_IC_FS_SCL_LCNT); 297 writel(lcnt, dev->base + DW_IC_FS_SCL_LCNT);
296 dev_dbg(dev->dev, "Fast-mode HCNT:LCNT = %d:%d\n", hcnt, lcnt); 298 dev_dbg(dev->dev, "Fast-mode HCNT:LCNT = %d:%d\n", hcnt, lcnt);
297 299
300 /* Configure Tx/Rx FIFO threshold levels */
301 writel(dev->tx_fifo_depth - 1, dev->base + DW_IC_TX_TL);
302 writel(0, dev->base + DW_IC_RX_TL);
303
298 /* configure the i2c master */ 304 /* configure the i2c master */
299 ic_con = DW_IC_CON_MASTER | DW_IC_CON_SLAVE_DISABLE | 305 ic_con = DW_IC_CON_MASTER | DW_IC_CON_SLAVE_DISABLE |
300 DW_IC_CON_RESTART_EN | DW_IC_CON_SPEED_FAST; 306 DW_IC_CON_RESTART_EN | DW_IC_CON_SPEED_FAST;