Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'i2c/for-current' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux

Pull i2c fixes from Wolfram Sang:
"Some more I2C driver updates. IMX updates are a tad bigger, but not
exceptionally big"

* 'i2c/for-current' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux:
i2c: mlxbf: Fix the return check of devm_ioremap and ioremap
i2c: mlxbf: select CONFIG_I2C_SLAVE
i2c: imx: Don't generate STOP condition if arbitration has been lost
i2c: imx: Check for I2SR_IAL after every byte
i2c: imx: Fix reset of I2SR_IAL flag
i2c: qcom: Fix IRQ error misassignement
i2c: qup: Fix error return code in qup_i2c_bam_schedule_desc()

+47 -17
+1
drivers/i2c/busses/Kconfig
··· 734 734 config I2C_MLXBF 735 735 tristate "Mellanox BlueField I2C controller" 736 736 depends on MELLANOX_PLATFORM && ARM64 737 + select I2C_SLAVE 737 738 help 738 739 Enabling this option will add I2C SMBus support for Mellanox BlueField 739 740 system.
+36 -8
drivers/i2c/busses/i2c-imx.c
··· 412 412 dma->chan_using = NULL; 413 413 } 414 414 415 + static void i2c_imx_clear_irq(struct imx_i2c_struct *i2c_imx, unsigned int bits) 416 + { 417 + unsigned int temp; 418 + 419 + /* 420 + * i2sr_clr_opcode is the value to clear all interrupts. Here we want to 421 + * clear only <bits>, so we write ~i2sr_clr_opcode with just <bits> 422 + * toggled. This is required because i.MX needs W0C and Vybrid uses W1C. 423 + */ 424 + temp = ~i2c_imx->hwdata->i2sr_clr_opcode ^ bits; 425 + imx_i2c_write_reg(temp, i2c_imx, IMX_I2C_I2SR); 426 + } 427 + 415 428 static int i2c_imx_bus_busy(struct imx_i2c_struct *i2c_imx, int for_busy, bool atomic) 416 429 { 417 430 unsigned long orig_jiffies = jiffies; ··· 437 424 438 425 /* check for arbitration lost */ 439 426 if (temp & I2SR_IAL) { 440 - temp &= ~I2SR_IAL; 441 - imx_i2c_write_reg(temp, i2c_imx, IMX_I2C_I2SR); 427 + i2c_imx_clear_irq(i2c_imx, I2SR_IAL); 442 428 return -EAGAIN; 443 429 } 444 430 ··· 481 469 */ 482 470 readb_poll_timeout_atomic(addr, regval, regval & I2SR_IIF, 5, 1000 + 100); 483 471 i2c_imx->i2csr = regval; 484 - imx_i2c_write_reg(0, i2c_imx, IMX_I2C_I2SR); 472 + i2c_imx_clear_irq(i2c_imx, I2SR_IIF | I2SR_IAL); 485 473 } else { 486 474 wait_event_timeout(i2c_imx->queue, i2c_imx->i2csr & I2SR_IIF, HZ / 10); 487 475 } ··· 490 478 dev_dbg(&i2c_imx->adapter.dev, "<%s> Timeout\n", __func__); 491 479 return -ETIMEDOUT; 492 480 } 481 + 482 + /* check for arbitration lost */ 483 + if (i2c_imx->i2csr & I2SR_IAL) { 484 + dev_dbg(&i2c_imx->adapter.dev, "<%s> Arbitration lost\n", __func__); 485 + i2c_imx_clear_irq(i2c_imx, I2SR_IAL); 486 + 487 + i2c_imx->i2csr = 0; 488 + return -EAGAIN; 489 + } 490 + 493 491 dev_dbg(&i2c_imx->adapter.dev, "<%s> TRX complete\n", __func__); 494 492 i2c_imx->i2csr = 0; 495 493 return 0; ··· 615 593 /* Stop I2C transaction */ 616 594 dev_dbg(&i2c_imx->adapter.dev, "<%s>\n", __func__); 617 595 temp = imx_i2c_read_reg(i2c_imx, IMX_I2C_I2CR); 596 + if (!(temp & I2CR_MSTA)) 597 + i2c_imx->stopped = 1; 618 598 temp &= ~(I2CR_MSTA | I2CR_MTX); 619 599 if (i2c_imx->dma) 620 600 temp &= ~I2CR_DMAEN; ··· 647 623 if (temp & I2SR_IIF) { 648 624 /* save status register */ 649 625 i2c_imx->i2csr = temp; 650 - temp &= ~I2SR_IIF; 651 - temp |= (i2c_imx->hwdata->i2sr_clr_opcode & I2SR_IIF); 652 - imx_i2c_write_reg(temp, i2c_imx, IMX_I2C_I2SR); 626 + i2c_imx_clear_irq(i2c_imx, I2SR_IIF); 653 627 wake_up(&i2c_imx->queue); 654 628 return IRQ_HANDLED; 655 629 } ··· 780 758 */ 781 759 dev_dbg(dev, "<%s> clear MSTA\n", __func__); 782 760 temp = imx_i2c_read_reg(i2c_imx, IMX_I2C_I2CR); 761 + if (!(temp & I2CR_MSTA)) 762 + i2c_imx->stopped = 1; 783 763 temp &= ~(I2CR_MSTA | I2CR_MTX); 784 764 imx_i2c_write_reg(temp, i2c_imx, IMX_I2C_I2CR); 785 - i2c_imx_bus_busy(i2c_imx, 0, false); 765 + if (!i2c_imx->stopped) 766 + i2c_imx_bus_busy(i2c_imx, 0, false); 786 767 } else { 787 768 /* 788 769 * For i2c master receiver repeat restart operation like: ··· 910 885 dev_dbg(&i2c_imx->adapter.dev, 911 886 "<%s> clear MSTA\n", __func__); 912 887 temp = imx_i2c_read_reg(i2c_imx, IMX_I2C_I2CR); 888 + if (!(temp & I2CR_MSTA)) 889 + i2c_imx->stopped = 1; 913 890 temp &= ~(I2CR_MSTA | I2CR_MTX); 914 891 imx_i2c_write_reg(temp, i2c_imx, IMX_I2C_I2CR); 915 - i2c_imx_bus_busy(i2c_imx, 0, atomic); 892 + if (!i2c_imx->stopped) 893 + i2c_imx_bus_busy(i2c_imx, 0, atomic); 916 894 } else { 917 895 /* 918 896 * For i2c master receiver repeat restart operation like:
+6 -6
drivers/i2c/busses/i2c-mlxbf.c
··· 1258 1258 return -EFAULT; 1259 1259 1260 1260 gpio_res->io = devm_ioremap(dev, params->start, size); 1261 - if (IS_ERR(gpio_res->io)) { 1261 + if (!gpio_res->io) { 1262 1262 devm_release_mem_region(dev, params->start, size); 1263 - return PTR_ERR(gpio_res->io); 1263 + return -ENOMEM; 1264 1264 } 1265 1265 1266 1266 return 0; ··· 1323 1323 return -EFAULT; 1324 1324 1325 1325 corepll_res->io = devm_ioremap(dev, params->start, size); 1326 - if (IS_ERR(corepll_res->io)) { 1326 + if (!corepll_res->io) { 1327 1327 devm_release_mem_region(dev, params->start, size); 1328 - return PTR_ERR(corepll_res->io); 1328 + return -ENOMEM; 1329 1329 } 1330 1330 1331 1331 return 0; ··· 1717 1717 return -EFAULT; 1718 1718 1719 1719 coalesce_res->io = ioremap(params->start, size); 1720 - if (IS_ERR(coalesce_res->io)) { 1720 + if (!coalesce_res->io) { 1721 1721 release_mem_region(params->start, size); 1722 - return PTR_ERR(coalesce_res->io); 1722 + return -ENOMEM; 1723 1723 } 1724 1724 1725 1725 priv->coalesce = coalesce_res;
+2 -2
drivers/i2c/busses/i2c-qcom-cci.c
··· 194 194 if (unlikely(val & CCI_IRQ_STATUS_0_I2C_M1_ERROR)) { 195 195 if (val & CCI_IRQ_STATUS_0_I2C_M1_Q0_NACK_ERR || 196 196 val & CCI_IRQ_STATUS_0_I2C_M1_Q1_NACK_ERR) 197 - cci->master[0].status = -ENXIO; 197 + cci->master[1].status = -ENXIO; 198 198 else 199 - cci->master[0].status = -EIO; 199 + cci->master[1].status = -EIO; 200 200 201 201 writel(CCI_HALT_REQ_I2C_M1_Q0Q1, cci->base + CCI_HALT_REQ); 202 202 ret = IRQ_HANDLED;
+2 -1
drivers/i2c/busses/i2c-qup.c
··· 801 801 if (ret || qup->bus_err || qup->qup_err) { 802 802 reinit_completion(&qup->xfer); 803 803 804 - if (qup_i2c_change_state(qup, QUP_RUN_STATE)) { 804 + ret = qup_i2c_change_state(qup, QUP_RUN_STATE); 805 + if (ret) { 805 806 dev_err(qup->dev, "change to run state timed out"); 806 807 goto desc_err; 807 808 }