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 tag 'i2c-for-6.13-rc8' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux

Pull i2c fixes from Wolfram Sang:

- fix ref leak in the I2C core

- fix remove notification in the address translator

- missing error check in the pinctrl demuxer (plus a typo fix)

- fix NAK handling when Linux is testunit target

- fix NAK handling for the Renesas R-Car controller when it is a target

* tag 'i2c-for-6.13-rc8' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux:
i2c: testunit: on errors, repeat NACK until STOP
i2c: rcar: fix NACK handling when being a target
i2c: mux: demux-pinctrl: correct comment
i2c: mux: demux-pinctrl: check initial mux selection, too
i2c: atr: Fix client detach
i2c: core: fix reference leak in i2c_register_adapter()

+36 -12
+15 -5
drivers/i2c/busses/i2c-rcar.c
··· 130 130 #define ID_P_PM_BLOCKED BIT(31) 131 131 #define ID_P_MASK GENMASK(31, 27) 132 132 133 + #define ID_SLAVE_NACK BIT(0) 134 + 133 135 enum rcar_i2c_type { 134 136 I2C_RCAR_GEN1, 135 137 I2C_RCAR_GEN2, ··· 168 166 int irq; 169 167 170 168 struct i2c_client *host_notify_client; 169 + u8 slave_flags; 171 170 }; 172 171 173 172 #define rcar_i2c_priv_to_dev(p) ((p)->adap.dev.parent) ··· 658 655 { 659 656 u32 ssr_raw, ssr_filtered; 660 657 u8 value; 658 + int ret; 661 659 662 660 ssr_raw = rcar_i2c_read(priv, ICSSR) & 0xff; 663 661 ssr_filtered = ssr_raw & rcar_i2c_read(priv, ICSIER); ··· 674 670 rcar_i2c_write(priv, ICRXTX, value); 675 671 rcar_i2c_write(priv, ICSIER, SDE | SSR | SAR); 676 672 } else { 677 - i2c_slave_event(priv->slave, I2C_SLAVE_WRITE_REQUESTED, &value); 673 + ret = i2c_slave_event(priv->slave, I2C_SLAVE_WRITE_REQUESTED, &value); 674 + if (ret) 675 + priv->slave_flags |= ID_SLAVE_NACK; 676 + 678 677 rcar_i2c_read(priv, ICRXTX); /* dummy read */ 679 678 rcar_i2c_write(priv, ICSIER, SDR | SSR | SAR); 680 679 } ··· 690 683 if (ssr_filtered & SSR) { 691 684 i2c_slave_event(priv->slave, I2C_SLAVE_STOP, &value); 692 685 rcar_i2c_write(priv, ICSCR, SIE | SDBS); /* clear our NACK */ 686 + priv->slave_flags &= ~ID_SLAVE_NACK; 693 687 rcar_i2c_write(priv, ICSIER, SAR); 694 688 rcar_i2c_write(priv, ICSSR, ~SSR & 0xff); 695 689 } 696 690 697 691 /* master wants to write to us */ 698 692 if (ssr_filtered & SDR) { 699 - int ret; 700 - 701 693 value = rcar_i2c_read(priv, ICRXTX); 702 694 ret = i2c_slave_event(priv->slave, I2C_SLAVE_WRITE_RECEIVED, &value); 703 - /* Send NACK in case of error */ 704 - rcar_i2c_write(priv, ICSCR, SIE | SDBS | (ret < 0 ? FNA : 0)); 695 + if (ret) 696 + priv->slave_flags |= ID_SLAVE_NACK; 697 + 698 + /* Send NACK in case of error, but it will come 1 byte late :( */ 699 + rcar_i2c_write(priv, ICSCR, SIE | SDBS | 700 + (priv->slave_flags & ID_SLAVE_NACK ? FNA : 0)); 705 701 rcar_i2c_write(priv, ICSSR, ~SDR & 0xff); 706 702 } 707 703
+1 -1
drivers/i2c/i2c-atr.c
··· 412 412 dev_name(dev), ret); 413 413 break; 414 414 415 - case BUS_NOTIFY_DEL_DEVICE: 415 + case BUS_NOTIFY_REMOVED_DEVICE: 416 416 i2c_atr_detach_client(client->adapter, client); 417 417 break; 418 418
+1
drivers/i2c/i2c-core-base.c
··· 1562 1562 res = device_add(&adap->dev); 1563 1563 if (res) { 1564 1564 pr_err("adapter '%s': can't register device (%d)\n", adap->name, res); 1565 + put_device(&adap->dev); 1565 1566 goto out_list; 1566 1567 } 1567 1568
+15 -4
drivers/i2c/i2c-slave-testunit.c
··· 38 38 39 39 enum testunit_flags { 40 40 TU_FLAG_IN_PROCESS, 41 + TU_FLAG_NACK, 41 42 }; 42 43 43 44 struct testunit_data { ··· 91 90 92 91 switch (event) { 93 92 case I2C_SLAVE_WRITE_REQUESTED: 94 - if (test_bit(TU_FLAG_IN_PROCESS, &tu->flags)) 95 - return -EBUSY; 93 + if (test_bit(TU_FLAG_IN_PROCESS | TU_FLAG_NACK, &tu->flags)) { 94 + ret = -EBUSY; 95 + break; 96 + } 96 97 97 98 memset(tu->regs, 0, TU_NUM_REGS); 98 99 tu->reg_idx = 0; ··· 102 99 break; 103 100 104 101 case I2C_SLAVE_WRITE_RECEIVED: 105 - if (test_bit(TU_FLAG_IN_PROCESS, &tu->flags)) 106 - return -EBUSY; 102 + if (test_bit(TU_FLAG_IN_PROCESS | TU_FLAG_NACK, &tu->flags)) { 103 + ret = -EBUSY; 104 + break; 105 + } 107 106 108 107 if (tu->reg_idx < TU_NUM_REGS) 109 108 tu->regs[tu->reg_idx] = *val; ··· 134 129 * here because we still need them in the workqueue! 135 130 */ 136 131 tu->reg_idx = 0; 132 + 133 + clear_bit(TU_FLAG_NACK, &tu->flags); 137 134 break; 138 135 139 136 case I2C_SLAVE_READ_PROCESSED: ··· 157 150 tu->regs[TU_REG_CMD] : 0; 158 151 break; 159 152 } 153 + 154 + /* If an error occurred somewhen, we NACK everything until next STOP */ 155 + if (ret) 156 + set_bit(TU_FLAG_NACK, &tu->flags); 160 157 161 158 return ret; 162 159 }
+4 -2
drivers/i2c/muxes/i2c-demux-pinctrl.c
··· 68 68 } 69 69 70 70 /* 71 - * Check if there are pinctrl states at all. Note: we cant' use 71 + * Check if there are pinctrl states at all. Note: we can't use 72 72 * devm_pinctrl_get_select() because we need to distinguish between 73 73 * the -ENODEV from devm_pinctrl_get() and pinctrl_lookup_state(). 74 74 */ ··· 261 261 pm_runtime_no_callbacks(&pdev->dev); 262 262 263 263 /* switch to first parent as active master */ 264 - i2c_demux_activate_master(priv, 0); 264 + err = i2c_demux_activate_master(priv, 0); 265 + if (err) 266 + goto err_rollback; 265 267 266 268 err = device_create_file(&pdev->dev, &dev_attr_available_masters); 267 269 if (err)