diff options
Diffstat (limited to 'drivers/i2c')
-rw-r--r-- | drivers/i2c/algos/i2c-algo-bit.c | 55 | ||||
-rw-r--r-- | drivers/i2c/busses/i2c-designware-master.c | 1 | ||||
-rw-r--r-- | drivers/i2c/busses/i2c-designware-platdrv.c | 7 | ||||
-rw-r--r-- | drivers/i2c/busses/i2c-i801.c | 9 | ||||
-rw-r--r-- | drivers/i2c/busses/i2c-sh_mobile.c | 15 | ||||
-rw-r--r-- | drivers/i2c/i2c-core-base.c | 11 |
6 files changed, 58 insertions, 40 deletions
diff --git a/drivers/i2c/algos/i2c-algo-bit.c b/drivers/i2c/algos/i2c-algo-bit.c index 6ec65adaba49..c33dcfb87993 100644 --- a/drivers/i2c/algos/i2c-algo-bit.c +++ b/drivers/i2c/algos/i2c-algo-bit.c | |||
@@ -110,8 +110,8 @@ static int sclhi(struct i2c_algo_bit_data *adap) | |||
110 | } | 110 | } |
111 | #ifdef DEBUG | 111 | #ifdef DEBUG |
112 | if (jiffies != start && i2c_debug >= 3) | 112 | if (jiffies != start && i2c_debug >= 3) |
113 | pr_debug("i2c-algo-bit: needed %ld jiffies for SCL to go " | 113 | pr_debug("i2c-algo-bit: needed %ld jiffies for SCL to go high\n", |
114 | "high\n", jiffies - start); | 114 | jiffies - start); |
115 | #endif | 115 | #endif |
116 | 116 | ||
117 | done: | 117 | done: |
@@ -171,8 +171,9 @@ static int i2c_outb(struct i2c_adapter *i2c_adap, unsigned char c) | |||
171 | setsda(adap, sb); | 171 | setsda(adap, sb); |
172 | udelay((adap->udelay + 1) / 2); | 172 | udelay((adap->udelay + 1) / 2); |
173 | if (sclhi(adap) < 0) { /* timed out */ | 173 | if (sclhi(adap) < 0) { /* timed out */ |
174 | bit_dbg(1, &i2c_adap->dev, "i2c_outb: 0x%02x, " | 174 | bit_dbg(1, &i2c_adap->dev, |
175 | "timeout at bit #%d\n", (int)c, i); | 175 | "i2c_outb: 0x%02x, timeout at bit #%d\n", |
176 | (int)c, i); | ||
176 | return -ETIMEDOUT; | 177 | return -ETIMEDOUT; |
177 | } | 178 | } |
178 | /* FIXME do arbitration here: | 179 | /* FIXME do arbitration here: |
@@ -185,8 +186,8 @@ static int i2c_outb(struct i2c_adapter *i2c_adap, unsigned char c) | |||
185 | } | 186 | } |
186 | sdahi(adap); | 187 | sdahi(adap); |
187 | if (sclhi(adap) < 0) { /* timeout */ | 188 | if (sclhi(adap) < 0) { /* timeout */ |
188 | bit_dbg(1, &i2c_adap->dev, "i2c_outb: 0x%02x, " | 189 | bit_dbg(1, &i2c_adap->dev, |
189 | "timeout at ack\n", (int)c); | 190 | "i2c_outb: 0x%02x, timeout at ack\n", (int)c); |
190 | return -ETIMEDOUT; | 191 | return -ETIMEDOUT; |
191 | } | 192 | } |
192 | 193 | ||
@@ -215,8 +216,9 @@ static int i2c_inb(struct i2c_adapter *i2c_adap) | |||
215 | sdahi(adap); | 216 | sdahi(adap); |
216 | for (i = 0; i < 8; i++) { | 217 | for (i = 0; i < 8; i++) { |
217 | if (sclhi(adap) < 0) { /* timeout */ | 218 | if (sclhi(adap) < 0) { /* timeout */ |
218 | bit_dbg(1, &i2c_adap->dev, "i2c_inb: timeout at bit " | 219 | bit_dbg(1, &i2c_adap->dev, |
219 | "#%d\n", 7 - i); | 220 | "i2c_inb: timeout at bit #%d\n", |
221 | 7 - i); | ||
220 | return -ETIMEDOUT; | 222 | return -ETIMEDOUT; |
221 | } | 223 | } |
222 | indata *= 2; | 224 | indata *= 2; |
@@ -265,8 +267,9 @@ static int test_bus(struct i2c_adapter *i2c_adap) | |||
265 | goto bailout; | 267 | goto bailout; |
266 | } | 268 | } |
267 | if (!scl) { | 269 | if (!scl) { |
268 | printk(KERN_WARNING "%s: SCL unexpected low " | 270 | printk(KERN_WARNING |
269 | "while pulling SDA low!\n", name); | 271 | "%s: SCL unexpected low while pulling SDA low!\n", |
272 | name); | ||
270 | goto bailout; | 273 | goto bailout; |
271 | } | 274 | } |
272 | 275 | ||
@@ -278,8 +281,9 @@ static int test_bus(struct i2c_adapter *i2c_adap) | |||
278 | goto bailout; | 281 | goto bailout; |
279 | } | 282 | } |
280 | if (!scl) { | 283 | if (!scl) { |
281 | printk(KERN_WARNING "%s: SCL unexpected low " | 284 | printk(KERN_WARNING |
282 | "while pulling SDA high!\n", name); | 285 | "%s: SCL unexpected low while pulling SDA high!\n", |
286 | name); | ||
283 | goto bailout; | 287 | goto bailout; |
284 | } | 288 | } |
285 | 289 | ||
@@ -291,8 +295,9 @@ static int test_bus(struct i2c_adapter *i2c_adap) | |||
291 | goto bailout; | 295 | goto bailout; |
292 | } | 296 | } |
293 | if (!sda) { | 297 | if (!sda) { |
294 | printk(KERN_WARNING "%s: SDA unexpected low " | 298 | printk(KERN_WARNING |
295 | "while pulling SCL low!\n", name); | 299 | "%s: SDA unexpected low while pulling SCL low!\n", |
300 | name); | ||
296 | goto bailout; | 301 | goto bailout; |
297 | } | 302 | } |
298 | 303 | ||
@@ -304,8 +309,9 @@ static int test_bus(struct i2c_adapter *i2c_adap) | |||
304 | goto bailout; | 309 | goto bailout; |
305 | } | 310 | } |
306 | if (!sda) { | 311 | if (!sda) { |
307 | printk(KERN_WARNING "%s: SDA unexpected low " | 312 | printk(KERN_WARNING |
308 | "while pulling SCL high!\n", name); | 313 | "%s: SDA unexpected low while pulling SCL high!\n", |
314 | name); | ||
309 | goto bailout; | 315 | goto bailout; |
310 | } | 316 | } |
311 | 317 | ||
@@ -352,8 +358,8 @@ static int try_address(struct i2c_adapter *i2c_adap, | |||
352 | i2c_start(adap); | 358 | i2c_start(adap); |
353 | } | 359 | } |
354 | if (i && ret) | 360 | if (i && ret) |
355 | bit_dbg(1, &i2c_adap->dev, "Used %d tries to %s client at " | 361 | bit_dbg(1, &i2c_adap->dev, |
356 | "0x%02x: %s\n", i + 1, | 362 | "Used %d tries to %s client at 0x%02x: %s\n", i + 1, |
357 | addr & 1 ? "read from" : "write to", addr >> 1, | 363 | addr & 1 ? "read from" : "write to", addr >> 1, |
358 | ret == 1 ? "success" : "failed, timeout?"); | 364 | ret == 1 ? "success" : "failed, timeout?"); |
359 | return ret; | 365 | return ret; |
@@ -442,8 +448,9 @@ static int readbytes(struct i2c_adapter *i2c_adap, struct i2c_msg *msg) | |||
442 | if (inval <= 0 || inval > I2C_SMBUS_BLOCK_MAX) { | 448 | if (inval <= 0 || inval > I2C_SMBUS_BLOCK_MAX) { |
443 | if (!(flags & I2C_M_NO_RD_ACK)) | 449 | if (!(flags & I2C_M_NO_RD_ACK)) |
444 | acknak(i2c_adap, 0); | 450 | acknak(i2c_adap, 0); |
445 | dev_err(&i2c_adap->dev, "readbytes: invalid " | 451 | dev_err(&i2c_adap->dev, |
446 | "block length (%d)\n", inval); | 452 | "readbytes: invalid block length (%d)\n", |
453 | inval); | ||
447 | return -EPROTO; | 454 | return -EPROTO; |
448 | } | 455 | } |
449 | /* The original count value accounts for the extra | 456 | /* The original count value accounts for the extra |
@@ -506,8 +513,8 @@ static int bit_doAddress(struct i2c_adapter *i2c_adap, struct i2c_msg *msg) | |||
506 | return -ENXIO; | 513 | return -ENXIO; |
507 | } | 514 | } |
508 | if (flags & I2C_M_RD) { | 515 | if (flags & I2C_M_RD) { |
509 | bit_dbg(3, &i2c_adap->dev, "emitting repeated " | 516 | bit_dbg(3, &i2c_adap->dev, |
510 | "start condition\n"); | 517 | "emitting repeated start condition\n"); |
511 | i2c_repstart(adap); | 518 | i2c_repstart(adap); |
512 | /* okay, now switch into reading mode */ | 519 | /* okay, now switch into reading mode */ |
513 | addr |= 0x01; | 520 | addr |= 0x01; |
@@ -564,8 +571,8 @@ static int bit_xfer(struct i2c_adapter *i2c_adap, | |||
564 | } | 571 | } |
565 | ret = bit_doAddress(i2c_adap, pmsg); | 572 | ret = bit_doAddress(i2c_adap, pmsg); |
566 | if ((ret != 0) && !nak_ok) { | 573 | if ((ret != 0) && !nak_ok) { |
567 | bit_dbg(1, &i2c_adap->dev, "NAK from " | 574 | bit_dbg(1, &i2c_adap->dev, |
568 | "device addr 0x%02x msg #%d\n", | 575 | "NAK from device addr 0x%02x msg #%d\n", |
569 | msgs[i].addr, i); | 576 | msgs[i].addr, i); |
570 | goto bailout; | 577 | goto bailout; |
571 | } | 578 | } |
diff --git a/drivers/i2c/busses/i2c-designware-master.c b/drivers/i2c/busses/i2c-designware-master.c index e18442b9973a..94d94b4a9a0d 100644 --- a/drivers/i2c/busses/i2c-designware-master.c +++ b/drivers/i2c/busses/i2c-designware-master.c | |||
@@ -708,7 +708,6 @@ int i2c_dw_probe(struct dw_i2c_dev *dev) | |||
708 | i2c_set_adapdata(adap, dev); | 708 | i2c_set_adapdata(adap, dev); |
709 | 709 | ||
710 | if (dev->pm_disabled) { | 710 | if (dev->pm_disabled) { |
711 | dev_pm_syscore_device(dev->dev, true); | ||
712 | irq_flags = IRQF_NO_SUSPEND; | 711 | irq_flags = IRQF_NO_SUSPEND; |
713 | } else { | 712 | } else { |
714 | irq_flags = IRQF_SHARED | IRQF_COND_SUSPEND; | 713 | irq_flags = IRQF_SHARED | IRQF_COND_SUSPEND; |
diff --git a/drivers/i2c/busses/i2c-designware-platdrv.c b/drivers/i2c/busses/i2c-designware-platdrv.c index 1a8d2da5b000..b5750fd85125 100644 --- a/drivers/i2c/busses/i2c-designware-platdrv.c +++ b/drivers/i2c/busses/i2c-designware-platdrv.c | |||
@@ -434,6 +434,9 @@ static int dw_i2c_plat_suspend(struct device *dev) | |||
434 | { | 434 | { |
435 | struct dw_i2c_dev *i_dev = dev_get_drvdata(dev); | 435 | struct dw_i2c_dev *i_dev = dev_get_drvdata(dev); |
436 | 436 | ||
437 | if (i_dev->pm_disabled) | ||
438 | return 0; | ||
439 | |||
437 | i_dev->disable(i_dev); | 440 | i_dev->disable(i_dev); |
438 | i2c_dw_prepare_clk(i_dev, false); | 441 | i2c_dw_prepare_clk(i_dev, false); |
439 | 442 | ||
@@ -444,7 +447,9 @@ static int dw_i2c_plat_resume(struct device *dev) | |||
444 | { | 447 | { |
445 | struct dw_i2c_dev *i_dev = dev_get_drvdata(dev); | 448 | struct dw_i2c_dev *i_dev = dev_get_drvdata(dev); |
446 | 449 | ||
447 | i2c_dw_prepare_clk(i_dev, true); | 450 | if (!i_dev->pm_disabled) |
451 | i2c_dw_prepare_clk(i_dev, true); | ||
452 | |||
448 | i_dev->init(i_dev); | 453 | i_dev->init(i_dev); |
449 | 454 | ||
450 | return 0; | 455 | return 0; |
diff --git a/drivers/i2c/busses/i2c-i801.c b/drivers/i2c/busses/i2c-i801.c index 941c223f6491..04b60a349d7e 100644 --- a/drivers/i2c/busses/i2c-i801.c +++ b/drivers/i2c/busses/i2c-i801.c | |||
@@ -1415,6 +1415,13 @@ static void i801_add_tco(struct i801_priv *priv) | |||
1415 | } | 1415 | } |
1416 | 1416 | ||
1417 | #ifdef CONFIG_ACPI | 1417 | #ifdef CONFIG_ACPI |
1418 | static bool i801_acpi_is_smbus_ioport(const struct i801_priv *priv, | ||
1419 | acpi_physical_address address) | ||
1420 | { | ||
1421 | return address >= priv->smba && | ||
1422 | address <= pci_resource_end(priv->pci_dev, SMBBAR); | ||
1423 | } | ||
1424 | |||
1418 | static acpi_status | 1425 | static acpi_status |
1419 | i801_acpi_io_handler(u32 function, acpi_physical_address address, u32 bits, | 1426 | i801_acpi_io_handler(u32 function, acpi_physical_address address, u32 bits, |
1420 | u64 *value, void *handler_context, void *region_context) | 1427 | u64 *value, void *handler_context, void *region_context) |
@@ -1430,7 +1437,7 @@ i801_acpi_io_handler(u32 function, acpi_physical_address address, u32 bits, | |||
1430 | */ | 1437 | */ |
1431 | mutex_lock(&priv->acpi_lock); | 1438 | mutex_lock(&priv->acpi_lock); |
1432 | 1439 | ||
1433 | if (!priv->acpi_reserved) { | 1440 | if (!priv->acpi_reserved && i801_acpi_is_smbus_ioport(priv, address)) { |
1434 | priv->acpi_reserved = true; | 1441 | priv->acpi_reserved = true; |
1435 | 1442 | ||
1436 | dev_warn(&pdev->dev, "BIOS is accessing SMBus registers\n"); | 1443 | dev_warn(&pdev->dev, "BIOS is accessing SMBus registers\n"); |
diff --git a/drivers/i2c/busses/i2c-sh_mobile.c b/drivers/i2c/busses/i2c-sh_mobile.c index 439e8778f849..818cab14e87c 100644 --- a/drivers/i2c/busses/i2c-sh_mobile.c +++ b/drivers/i2c/busses/i2c-sh_mobile.c | |||
@@ -507,8 +507,6 @@ static void sh_mobile_i2c_dma_callback(void *data) | |||
507 | pd->pos = pd->msg->len; | 507 | pd->pos = pd->msg->len; |
508 | pd->stop_after_dma = true; | 508 | pd->stop_after_dma = true; |
509 | 509 | ||
510 | i2c_release_dma_safe_msg_buf(pd->msg, pd->dma_buf); | ||
511 | |||
512 | iic_set_clr(pd, ICIC, 0, ICIC_TDMAE | ICIC_RDMAE); | 510 | iic_set_clr(pd, ICIC, 0, ICIC_TDMAE | ICIC_RDMAE); |
513 | } | 511 | } |
514 | 512 | ||
@@ -602,8 +600,8 @@ static void sh_mobile_i2c_xfer_dma(struct sh_mobile_i2c_data *pd) | |||
602 | dma_async_issue_pending(chan); | 600 | dma_async_issue_pending(chan); |
603 | } | 601 | } |
604 | 602 | ||
605 | static int start_ch(struct sh_mobile_i2c_data *pd, struct i2c_msg *usr_msg, | 603 | static void start_ch(struct sh_mobile_i2c_data *pd, struct i2c_msg *usr_msg, |
606 | bool do_init) | 604 | bool do_init) |
607 | { | 605 | { |
608 | if (do_init) { | 606 | if (do_init) { |
609 | /* Initialize channel registers */ | 607 | /* Initialize channel registers */ |
@@ -627,7 +625,6 @@ static int start_ch(struct sh_mobile_i2c_data *pd, struct i2c_msg *usr_msg, | |||
627 | 625 | ||
628 | /* Enable all interrupts to begin with */ | 626 | /* Enable all interrupts to begin with */ |
629 | iic_wr(pd, ICIC, ICIC_DTEE | ICIC_WAITE | ICIC_ALE | ICIC_TACKE); | 627 | iic_wr(pd, ICIC, ICIC_DTEE | ICIC_WAITE | ICIC_ALE | ICIC_TACKE); |
630 | return 0; | ||
631 | } | 628 | } |
632 | 629 | ||
633 | static int poll_dte(struct sh_mobile_i2c_data *pd) | 630 | static int poll_dte(struct sh_mobile_i2c_data *pd) |
@@ -698,9 +695,7 @@ static int sh_mobile_i2c_xfer(struct i2c_adapter *adapter, | |||
698 | pd->send_stop = i == num - 1 || msg->flags & I2C_M_STOP; | 695 | pd->send_stop = i == num - 1 || msg->flags & I2C_M_STOP; |
699 | pd->stop_after_dma = false; | 696 | pd->stop_after_dma = false; |
700 | 697 | ||
701 | err = start_ch(pd, msg, do_start); | 698 | start_ch(pd, msg, do_start); |
702 | if (err) | ||
703 | break; | ||
704 | 699 | ||
705 | if (do_start) | 700 | if (do_start) |
706 | i2c_op(pd, OP_START, 0); | 701 | i2c_op(pd, OP_START, 0); |
@@ -709,6 +704,10 @@ static int sh_mobile_i2c_xfer(struct i2c_adapter *adapter, | |||
709 | timeout = wait_event_timeout(pd->wait, | 704 | timeout = wait_event_timeout(pd->wait, |
710 | pd->sr & (ICSR_TACK | SW_DONE), | 705 | pd->sr & (ICSR_TACK | SW_DONE), |
711 | adapter->timeout); | 706 | adapter->timeout); |
707 | |||
708 | /* 'stop_after_dma' tells if DMA transfer was complete */ | ||
709 | i2c_put_dma_safe_msg_buf(pd->dma_buf, pd->msg, pd->stop_after_dma); | ||
710 | |||
712 | if (!timeout) { | 711 | if (!timeout) { |
713 | dev_err(pd->dev, "Transfer request timed out\n"); | 712 | dev_err(pd->dev, "Transfer request timed out\n"); |
714 | if (pd->dma_direction != DMA_NONE) | 713 | if (pd->dma_direction != DMA_NONE) |
diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c index f15737763608..9ee9a15e7134 100644 --- a/drivers/i2c/i2c-core-base.c +++ b/drivers/i2c/i2c-core-base.c | |||
@@ -2293,21 +2293,22 @@ u8 *i2c_get_dma_safe_msg_buf(struct i2c_msg *msg, unsigned int threshold) | |||
2293 | EXPORT_SYMBOL_GPL(i2c_get_dma_safe_msg_buf); | 2293 | EXPORT_SYMBOL_GPL(i2c_get_dma_safe_msg_buf); |
2294 | 2294 | ||
2295 | /** | 2295 | /** |
2296 | * i2c_release_dma_safe_msg_buf - release DMA safe buffer and sync with i2c_msg | 2296 | * i2c_put_dma_safe_msg_buf - release DMA safe buffer and sync with i2c_msg |
2297 | * @msg: the message to be synced with | ||
2298 | * @buf: the buffer obtained from i2c_get_dma_safe_msg_buf(). May be NULL. | 2297 | * @buf: the buffer obtained from i2c_get_dma_safe_msg_buf(). May be NULL. |
2298 | * @msg: the message which the buffer corresponds to | ||
2299 | * @xferred: bool saying if the message was transferred | ||
2299 | */ | 2300 | */ |
2300 | void i2c_release_dma_safe_msg_buf(struct i2c_msg *msg, u8 *buf) | 2301 | void i2c_put_dma_safe_msg_buf(u8 *buf, struct i2c_msg *msg, bool xferred) |
2301 | { | 2302 | { |
2302 | if (!buf || buf == msg->buf) | 2303 | if (!buf || buf == msg->buf) |
2303 | return; | 2304 | return; |
2304 | 2305 | ||
2305 | if (msg->flags & I2C_M_RD) | 2306 | if (xferred && msg->flags & I2C_M_RD) |
2306 | memcpy(msg->buf, buf, msg->len); | 2307 | memcpy(msg->buf, buf, msg->len); |
2307 | 2308 | ||
2308 | kfree(buf); | 2309 | kfree(buf); |
2309 | } | 2310 | } |
2310 | EXPORT_SYMBOL_GPL(i2c_release_dma_safe_msg_buf); | 2311 | EXPORT_SYMBOL_GPL(i2c_put_dma_safe_msg_buf); |
2311 | 2312 | ||
2312 | MODULE_AUTHOR("Simon G. Vogl <simon@tk.uni-linz.ac.at>"); | 2313 | MODULE_AUTHOR("Simon G. Vogl <simon@tk.uni-linz.ac.at>"); |
2313 | MODULE_DESCRIPTION("I2C-Bus main module"); | 2314 | MODULE_DESCRIPTION("I2C-Bus main module"); |