diff options
author | Shinya Kuribayashi <shinya.kuribayashi@necel.com> | 2009-11-06 07:48:12 -0500 |
---|---|---|
committer | Ben Dooks <ben-linux@fluff.org> | 2009-12-08 19:19:11 -0500 |
commit | 4cb6d1d6da471d795320cc4a933ce60f415dd1f6 (patch) | |
tree | 0ca9f5254f74590f8f3bd72064b327a77395e01c /drivers/i2c/busses/i2c-designware.c | |
parent | 0774539948b23984f1c866135ba307fa2c441d0e (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.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/drivers/i2c/busses/i2c-designware.c b/drivers/i2c/busses/i2c-designware.c index 5fce1a07e6c1..0eea0dd35895 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; |