diff options
author | Shinya Kuribayashi <shinya.kuribayashi@necel.com> | 2009-11-06 07:43:52 -0500 |
---|---|---|
committer | Ben Dooks <ben-linux@fluff.org> | 2009-12-08 19:19:09 -0500 |
commit | ed5e1dd5f2daa8a59bc8116888417a6ff96d2ae9 (patch) | |
tree | e68b2585942c67b5f9627b90bbbcb9b1913d8161 /drivers/i2c/busses/i2c-designware.c | |
parent | 6035ccd8e9e40bb654fbfdef325902ab531679a5 (diff) |
i2c-designware: Consolidate to use 32-bit word accesses
This driver looks originally meant for armel machines where readw()/
writew() works perfectly fine with this hardware. But that doens't
work for big-endian systems.
This patch converts all 8/16-bit-aware usages to 32-bit variants.
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 | 76 |
1 files changed, 38 insertions, 38 deletions
diff --git a/drivers/i2c/busses/i2c-designware.c b/drivers/i2c/busses/i2c-designware.c index b444762e9b9f..a4f928e1fc5b 100644 --- a/drivers/i2c/busses/i2c-designware.c +++ b/drivers/i2c/busses/i2c-designware.c | |||
@@ -162,14 +162,14 @@ struct dw_i2c_dev { | |||
162 | struct i2c_msg *msgs; | 162 | struct i2c_msg *msgs; |
163 | int msgs_num; | 163 | int msgs_num; |
164 | int msg_write_idx; | 164 | int msg_write_idx; |
165 | u16 tx_buf_len; | 165 | u32 tx_buf_len; |
166 | u8 *tx_buf; | 166 | u8 *tx_buf; |
167 | int msg_read_idx; | 167 | int msg_read_idx; |
168 | u16 rx_buf_len; | 168 | u32 rx_buf_len; |
169 | u8 *rx_buf; | 169 | u8 *rx_buf; |
170 | int msg_err; | 170 | int msg_err; |
171 | unsigned int status; | 171 | unsigned int status; |
172 | u16 abort_source; | 172 | u32 abort_source; |
173 | int irq; | 173 | int irq; |
174 | struct i2c_adapter adapter; | 174 | struct i2c_adapter adapter; |
175 | unsigned int tx_fifo_depth; | 175 | unsigned int tx_fifo_depth; |
@@ -187,25 +187,25 @@ struct dw_i2c_dev { | |||
187 | static void i2c_dw_init(struct dw_i2c_dev *dev) | 187 | static void i2c_dw_init(struct dw_i2c_dev *dev) |
188 | { | 188 | { |
189 | u32 input_clock_khz = clk_get_rate(dev->clk) / 1000; | 189 | u32 input_clock_khz = clk_get_rate(dev->clk) / 1000; |
190 | u16 ic_con; | 190 | u32 ic_con; |
191 | 191 | ||
192 | /* Disable the adapter */ | 192 | /* Disable the adapter */ |
193 | writeb(0, dev->base + DW_IC_ENABLE); | 193 | writel(0, dev->base + DW_IC_ENABLE); |
194 | 194 | ||
195 | /* set standard and fast speed deviders for high/low periods */ | 195 | /* set standard and fast speed deviders for high/low periods */ |
196 | writew((input_clock_khz * 40 / 10000)+1, /* std speed high, 4us */ | 196 | writel((input_clock_khz * 40 / 10000)+1, /* std speed high, 4us */ |
197 | dev->base + DW_IC_SS_SCL_HCNT); | 197 | dev->base + DW_IC_SS_SCL_HCNT); |
198 | writew((input_clock_khz * 47 / 10000)+1, /* std speed low, 4.7us */ | 198 | writel((input_clock_khz * 47 / 10000)+1, /* std speed low, 4.7us */ |
199 | dev->base + DW_IC_SS_SCL_LCNT); | 199 | dev->base + DW_IC_SS_SCL_LCNT); |
200 | writew((input_clock_khz * 6 / 10000)+1, /* fast speed high, 0.6us */ | 200 | writel((input_clock_khz * 6 / 10000)+1, /* fast speed high, 0.6us */ |
201 | dev->base + DW_IC_FS_SCL_HCNT); | 201 | dev->base + DW_IC_FS_SCL_HCNT); |
202 | writew((input_clock_khz * 13 / 10000)+1, /* fast speed low, 1.3us */ | 202 | writel((input_clock_khz * 13 / 10000)+1, /* fast speed low, 1.3us */ |
203 | dev->base + DW_IC_FS_SCL_LCNT); | 203 | dev->base + DW_IC_FS_SCL_LCNT); |
204 | 204 | ||
205 | /* configure the i2c master */ | 205 | /* configure the i2c master */ |
206 | ic_con = DW_IC_CON_MASTER | DW_IC_CON_SLAVE_DISABLE | | 206 | ic_con = DW_IC_CON_MASTER | DW_IC_CON_SLAVE_DISABLE | |
207 | DW_IC_CON_RESTART_EN | DW_IC_CON_SPEED_FAST; | 207 | DW_IC_CON_RESTART_EN | DW_IC_CON_SPEED_FAST; |
208 | writew(ic_con, dev->base + DW_IC_CON); | 208 | writel(ic_con, dev->base + DW_IC_CON); |
209 | } | 209 | } |
210 | 210 | ||
211 | /* | 211 | /* |
@@ -215,7 +215,7 @@ static int i2c_dw_wait_bus_not_busy(struct dw_i2c_dev *dev) | |||
215 | { | 215 | { |
216 | int timeout = TIMEOUT; | 216 | int timeout = TIMEOUT; |
217 | 217 | ||
218 | while (readb(dev->base + DW_IC_STATUS) & DW_IC_STATUS_ACTIVITY) { | 218 | while (readl(dev->base + DW_IC_STATUS) & DW_IC_STATUS_ACTIVITY) { |
219 | if (timeout <= 0) { | 219 | if (timeout <= 0) { |
220 | dev_warn(dev->dev, "timeout waiting for bus ready\n"); | 220 | dev_warn(dev->dev, "timeout waiting for bus ready\n"); |
221 | return -ETIMEDOUT; | 221 | return -ETIMEDOUT; |
@@ -239,29 +239,29 @@ i2c_dw_xfer_msg(struct i2c_adapter *adap) | |||
239 | struct dw_i2c_dev *dev = i2c_get_adapdata(adap); | 239 | struct dw_i2c_dev *dev = i2c_get_adapdata(adap); |
240 | struct i2c_msg *msgs = dev->msgs; | 240 | struct i2c_msg *msgs = dev->msgs; |
241 | int num = dev->msgs_num; | 241 | int num = dev->msgs_num; |
242 | u16 ic_con, intr_mask; | 242 | u32 ic_con, intr_mask; |
243 | int tx_limit = dev->tx_fifo_depth - readb(dev->base + DW_IC_TXFLR); | 243 | int tx_limit = dev->tx_fifo_depth - readl(dev->base + DW_IC_TXFLR); |
244 | int rx_limit = dev->rx_fifo_depth - readb(dev->base + DW_IC_RXFLR); | 244 | int rx_limit = dev->rx_fifo_depth - readl(dev->base + DW_IC_RXFLR); |
245 | u16 addr = msgs[dev->msg_write_idx].addr; | 245 | u32 addr = msgs[dev->msg_write_idx].addr; |
246 | u16 buf_len = dev->tx_buf_len; | 246 | u32 buf_len = dev->tx_buf_len; |
247 | 247 | ||
248 | if (!(dev->status & STATUS_WRITE_IN_PROGRESS)) { | 248 | if (!(dev->status & STATUS_WRITE_IN_PROGRESS)) { |
249 | /* Disable the adapter */ | 249 | /* Disable the adapter */ |
250 | writeb(0, dev->base + DW_IC_ENABLE); | 250 | writel(0, dev->base + DW_IC_ENABLE); |
251 | 251 | ||
252 | /* set the slave (target) address */ | 252 | /* set the slave (target) address */ |
253 | writew(msgs[dev->msg_write_idx].addr, dev->base + DW_IC_TAR); | 253 | writel(msgs[dev->msg_write_idx].addr, dev->base + DW_IC_TAR); |
254 | 254 | ||
255 | /* if the slave address is ten bit address, enable 10BITADDR */ | 255 | /* if the slave address is ten bit address, enable 10BITADDR */ |
256 | ic_con = readw(dev->base + DW_IC_CON); | 256 | ic_con = readl(dev->base + DW_IC_CON); |
257 | if (msgs[dev->msg_write_idx].flags & I2C_M_TEN) | 257 | if (msgs[dev->msg_write_idx].flags & I2C_M_TEN) |
258 | ic_con |= DW_IC_CON_10BITADDR_MASTER; | 258 | ic_con |= DW_IC_CON_10BITADDR_MASTER; |
259 | else | 259 | else |
260 | ic_con &= ~DW_IC_CON_10BITADDR_MASTER; | 260 | ic_con &= ~DW_IC_CON_10BITADDR_MASTER; |
261 | writew(ic_con, dev->base + DW_IC_CON); | 261 | writel(ic_con, dev->base + DW_IC_CON); |
262 | 262 | ||
263 | /* Enable the adapter */ | 263 | /* Enable the adapter */ |
264 | writeb(1, dev->base + DW_IC_ENABLE); | 264 | writel(1, dev->base + DW_IC_ENABLE); |
265 | } | 265 | } |
266 | 266 | ||
267 | for (; dev->msg_write_idx < num; dev->msg_write_idx++) { | 267 | for (; dev->msg_write_idx < num; dev->msg_write_idx++) { |
@@ -287,10 +287,10 @@ i2c_dw_xfer_msg(struct i2c_adapter *adap) | |||
287 | 287 | ||
288 | while (buf_len > 0 && tx_limit > 0 && rx_limit > 0) { | 288 | while (buf_len > 0 && tx_limit > 0 && rx_limit > 0) { |
289 | if (msgs[dev->msg_write_idx].flags & I2C_M_RD) { | 289 | if (msgs[dev->msg_write_idx].flags & I2C_M_RD) { |
290 | writew(0x100, dev->base + DW_IC_DATA_CMD); | 290 | writel(0x100, dev->base + DW_IC_DATA_CMD); |
291 | rx_limit--; | 291 | rx_limit--; |
292 | } else | 292 | } else |
293 | writew(*(dev->tx_buf++), | 293 | writel(*(dev->tx_buf++), |
294 | dev->base + DW_IC_DATA_CMD); | 294 | dev->base + DW_IC_DATA_CMD); |
295 | tx_limit--; buf_len--; | 295 | tx_limit--; buf_len--; |
296 | } | 296 | } |
@@ -302,7 +302,7 @@ i2c_dw_xfer_msg(struct i2c_adapter *adap) | |||
302 | dev->status |= STATUS_WRITE_IN_PROGRESS; | 302 | dev->status |= STATUS_WRITE_IN_PROGRESS; |
303 | } else | 303 | } else |
304 | dev->status &= ~STATUS_WRITE_IN_PROGRESS; | 304 | dev->status &= ~STATUS_WRITE_IN_PROGRESS; |
305 | writew(intr_mask, dev->base + DW_IC_INTR_MASK); | 305 | writel(intr_mask, dev->base + DW_IC_INTR_MASK); |
306 | 306 | ||
307 | dev->tx_buf_len = buf_len; | 307 | dev->tx_buf_len = buf_len; |
308 | } | 308 | } |
@@ -313,11 +313,11 @@ i2c_dw_read(struct i2c_adapter *adap) | |||
313 | struct dw_i2c_dev *dev = i2c_get_adapdata(adap); | 313 | struct dw_i2c_dev *dev = i2c_get_adapdata(adap); |
314 | struct i2c_msg *msgs = dev->msgs; | 314 | struct i2c_msg *msgs = dev->msgs; |
315 | int num = dev->msgs_num; | 315 | int num = dev->msgs_num; |
316 | u16 addr = msgs[dev->msg_read_idx].addr; | 316 | u32 addr = msgs[dev->msg_read_idx].addr; |
317 | int rx_valid = readw(dev->base + DW_IC_RXFLR); | 317 | int rx_valid = readl(dev->base + DW_IC_RXFLR); |
318 | 318 | ||
319 | for (; dev->msg_read_idx < num; dev->msg_read_idx++) { | 319 | for (; dev->msg_read_idx < num; dev->msg_read_idx++) { |
320 | u16 len; | 320 | u32 len; |
321 | u8 *buf; | 321 | u8 *buf; |
322 | 322 | ||
323 | if (!(msgs[dev->msg_read_idx].flags & I2C_M_RD)) | 323 | if (!(msgs[dev->msg_read_idx].flags & I2C_M_RD)) |
@@ -336,7 +336,7 @@ i2c_dw_read(struct i2c_adapter *adap) | |||
336 | } | 336 | } |
337 | 337 | ||
338 | for (; len > 0 && rx_valid > 0; len--, rx_valid--) | 338 | for (; len > 0 && rx_valid > 0; len--, rx_valid--) |
339 | *buf++ = readb(dev->base + DW_IC_DATA_CMD); | 339 | *buf++ = readl(dev->base + DW_IC_DATA_CMD); |
340 | 340 | ||
341 | if (len > 0) { | 341 | if (len > 0) { |
342 | dev->status |= STATUS_READ_IN_PROGRESS; | 342 | dev->status |= STATUS_READ_IN_PROGRESS; |
@@ -398,7 +398,7 @@ i2c_dw_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num) | |||
398 | do { | 398 | do { |
399 | i2c_dw_read(adap); | 399 | i2c_dw_read(adap); |
400 | } while (dev->status & STATUS_READ_IN_PROGRESS); | 400 | } while (dev->status & STATUS_READ_IN_PROGRESS); |
401 | writeb(0, dev->base + DW_IC_ENABLE); | 401 | writel(0, dev->base + DW_IC_ENABLE); |
402 | ret = num; | 402 | ret = num; |
403 | goto done; | 403 | goto done; |
404 | } | 404 | } |
@@ -428,7 +428,7 @@ static u32 i2c_dw_func(struct i2c_adapter *adap) | |||
428 | static void dw_i2c_pump_msg(unsigned long data) | 428 | static void dw_i2c_pump_msg(unsigned long data) |
429 | { | 429 | { |
430 | struct dw_i2c_dev *dev = (struct dw_i2c_dev *) data; | 430 | struct dw_i2c_dev *dev = (struct dw_i2c_dev *) data; |
431 | u16 intr_mask; | 431 | u32 intr_mask; |
432 | 432 | ||
433 | i2c_dw_read(&dev->adapter); | 433 | i2c_dw_read(&dev->adapter); |
434 | i2c_dw_xfer_msg(&dev->adapter); | 434 | i2c_dw_xfer_msg(&dev->adapter); |
@@ -436,7 +436,7 @@ static void dw_i2c_pump_msg(unsigned long data) | |||
436 | intr_mask = DW_IC_INTR_STOP_DET | DW_IC_INTR_TX_ABRT; | 436 | intr_mask = DW_IC_INTR_STOP_DET | DW_IC_INTR_TX_ABRT; |
437 | if (dev->status & STATUS_WRITE_IN_PROGRESS) | 437 | if (dev->status & STATUS_WRITE_IN_PROGRESS) |
438 | intr_mask |= DW_IC_INTR_TX_EMPTY; | 438 | intr_mask |= DW_IC_INTR_TX_EMPTY; |
439 | writew(intr_mask, dev->base + DW_IC_INTR_MASK); | 439 | writel(intr_mask, dev->base + DW_IC_INTR_MASK); |
440 | } | 440 | } |
441 | 441 | ||
442 | /* | 442 | /* |
@@ -446,19 +446,19 @@ static void dw_i2c_pump_msg(unsigned long data) | |||
446 | static irqreturn_t i2c_dw_isr(int this_irq, void *dev_id) | 446 | static irqreturn_t i2c_dw_isr(int this_irq, void *dev_id) |
447 | { | 447 | { |
448 | struct dw_i2c_dev *dev = dev_id; | 448 | struct dw_i2c_dev *dev = dev_id; |
449 | u16 stat; | 449 | u32 stat; |
450 | 450 | ||
451 | stat = readw(dev->base + DW_IC_INTR_STAT); | 451 | stat = readl(dev->base + DW_IC_INTR_STAT); |
452 | dev_dbg(dev->dev, "%s: stat=0x%x\n", __func__, stat); | 452 | dev_dbg(dev->dev, "%s: stat=0x%x\n", __func__, stat); |
453 | if (stat & DW_IC_INTR_TX_ABRT) { | 453 | if (stat & DW_IC_INTR_TX_ABRT) { |
454 | dev->abort_source = readw(dev->base + DW_IC_TX_ABRT_SOURCE); | 454 | dev->abort_source = readl(dev->base + DW_IC_TX_ABRT_SOURCE); |
455 | dev->cmd_err |= DW_IC_ERR_TX_ABRT; | 455 | dev->cmd_err |= DW_IC_ERR_TX_ABRT; |
456 | dev->status = STATUS_IDLE; | 456 | dev->status = STATUS_IDLE; |
457 | } else if (stat & DW_IC_INTR_TX_EMPTY) | 457 | } else if (stat & DW_IC_INTR_TX_EMPTY) |
458 | tasklet_schedule(&dev->pump_msg); | 458 | tasklet_schedule(&dev->pump_msg); |
459 | 459 | ||
460 | readb(dev->base + DW_IC_CLR_INTR); /* clear interrupts */ | 460 | readl(dev->base + DW_IC_CLR_INTR); /* clear interrupts */ |
461 | writew(0, dev->base + DW_IC_INTR_MASK); /* disable interrupts */ | 461 | writel(0, dev->base + DW_IC_INTR_MASK); /* disable interrupts */ |
462 | if (stat & (DW_IC_INTR_TX_ABRT | DW_IC_INTR_STOP_DET)) | 462 | if (stat & (DW_IC_INTR_TX_ABRT | DW_IC_INTR_STOP_DET)) |
463 | complete(&dev->cmd_complete); | 463 | complete(&dev->cmd_complete); |
464 | 464 | ||
@@ -531,7 +531,7 @@ static int __devinit dw_i2c_probe(struct platform_device *pdev) | |||
531 | } | 531 | } |
532 | i2c_dw_init(dev); | 532 | i2c_dw_init(dev); |
533 | 533 | ||
534 | writew(0, dev->base + DW_IC_INTR_MASK); /* disable IRQ */ | 534 | writel(0, dev->base + DW_IC_INTR_MASK); /* disable IRQ */ |
535 | r = request_irq(dev->irq, i2c_dw_isr, 0, pdev->name, dev); | 535 | r = request_irq(dev->irq, i2c_dw_isr, 0, pdev->name, dev); |
536 | if (r) { | 536 | if (r) { |
537 | dev_err(&pdev->dev, "failure requesting irq %i\n", dev->irq); | 537 | dev_err(&pdev->dev, "failure requesting irq %i\n", dev->irq); |
@@ -587,7 +587,7 @@ static int __devexit dw_i2c_remove(struct platform_device *pdev) | |||
587 | clk_put(dev->clk); | 587 | clk_put(dev->clk); |
588 | dev->clk = NULL; | 588 | dev->clk = NULL; |
589 | 589 | ||
590 | writeb(0, dev->base + DW_IC_ENABLE); | 590 | writel(0, dev->base + DW_IC_ENABLE); |
591 | free_irq(dev->irq, dev); | 591 | free_irq(dev->irq, dev); |
592 | kfree(dev); | 592 | kfree(dev); |
593 | 593 | ||