Commit 4d145e3f authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'i2c-for-6.10-rc8' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux

Pull i2c fixes from Wolfram Sang:
 "Fixes for the I2C testunit, the Renesas R-Car driver and some
  MAINTAINERS corrections"

* tag 'i2c-for-6.10-rc8' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux:
  i2c: testunit: avoid re-issued work after read message
  i2c: rcar: ensure Gen3+ reset does not disturb local targets
  i2c: mark HostNotify target address as used
  i2c: testunit: correct Kconfig description
  MAINTAINERS: VIRTIO I2C loses a maintainer, gains a reviewer
  MAINTAINERS: delete entries for Thor Thayer
  i2c: rcar: clear NO_RXDMA flag after resetting
  i2c: rcar: bring hardware to known state when probing
parents d0d0cd38 3fdd2d21
...@@ -846,12 +846,6 @@ ALPS PS/2 TOUCHPAD DRIVER ...@@ -846,12 +846,6 @@ ALPS PS/2 TOUCHPAD DRIVER
R: Pali Rohár <pali@kernel.org> R: Pali Rohár <pali@kernel.org>
F: drivers/input/mouse/alps.* F: drivers/input/mouse/alps.*
ALTERA I2C CONTROLLER DRIVER
M: Thor Thayer <thor.thayer@linux.intel.com>
S: Maintained
F: Documentation/devicetree/bindings/i2c/i2c-altera.txt
F: drivers/i2c/busses/i2c-altera.c
ALTERA MAILBOX DRIVER ALTERA MAILBOX DRIVER
M: Mun Yew Tham <mun.yew.tham@intel.com> M: Mun Yew Tham <mun.yew.tham@intel.com>
S: Maintained S: Maintained
...@@ -871,21 +865,6 @@ L: linux-gpio@vger.kernel.org ...@@ -871,21 +865,6 @@ L: linux-gpio@vger.kernel.org
S: Maintained S: Maintained
F: drivers/gpio/gpio-altera.c F: drivers/gpio/gpio-altera.c
ALTERA SYSTEM MANAGER DRIVER
M: Thor Thayer <thor.thayer@linux.intel.com>
S: Maintained
F: drivers/mfd/altera-sysmgr.c
F: include/linux/mfd/altera-sysmgr.h
ALTERA SYSTEM RESOURCE DRIVER FOR ARRIA10 DEVKIT
M: Thor Thayer <thor.thayer@linux.intel.com>
S: Maintained
F: drivers/gpio/gpio-altera-a10sr.c
F: drivers/mfd/altera-a10sr.c
F: drivers/reset/reset-a10sr.c
F: include/dt-bindings/reset/altr,rst-mgr-a10sr.h
F: include/linux/mfd/altera-a10sr.h
ALTERA TRIPLE SPEED ETHERNET DRIVER ALTERA TRIPLE SPEED ETHERNET DRIVER
M: Joyce Ooi <joyce.ooi@intel.com> M: Joyce Ooi <joyce.ooi@intel.com>
L: netdev@vger.kernel.org L: netdev@vger.kernel.org
...@@ -23864,8 +23843,8 @@ S: Maintained ...@@ -23864,8 +23843,8 @@ S: Maintained
F: drivers/vhost/scsi.c F: drivers/vhost/scsi.c
VIRTIO I2C DRIVER VIRTIO I2C DRIVER
M: Conghui Chen <conghui.chen@intel.com>
M: Viresh Kumar <viresh.kumar@linaro.org> M: Viresh Kumar <viresh.kumar@linaro.org>
R: "Chen, Jian Jun" <jian.jun.chen@intel.com>
L: linux-i2c@vger.kernel.org L: linux-i2c@vger.kernel.org
L: virtualization@lists.linux.dev L: virtualization@lists.linux.dev
S: Maintained S: Maintained
......
...@@ -135,7 +135,7 @@ config I2C_SLAVE_EEPROM ...@@ -135,7 +135,7 @@ config I2C_SLAVE_EEPROM
Documentation/i2c/slave-eeprom-backend.rst for further details. Documentation/i2c/slave-eeprom-backend.rst for further details.
config I2C_SLAVE_TESTUNIT config I2C_SLAVE_TESTUNIT
tristate "I2C eeprom testunit driver" tristate "I2C testunit driver"
help help
This backend can be used to trigger test cases for I2C bus masters This backend can be used to trigger test cases for I2C bus masters
which require a remote device with certain capabilities, e.g. which require a remote device with certain capabilities, e.g.
......
...@@ -257,6 +257,14 @@ static void rcar_i2c_init(struct rcar_i2c_priv *priv) ...@@ -257,6 +257,14 @@ static void rcar_i2c_init(struct rcar_i2c_priv *priv)
} }
} }
static void rcar_i2c_reset_slave(struct rcar_i2c_priv *priv)
{
rcar_i2c_write(priv, ICSIER, 0);
rcar_i2c_write(priv, ICSSR, 0);
rcar_i2c_write(priv, ICSCR, SDBS);
rcar_i2c_write(priv, ICSAR, 0); /* Gen2: must be 0 if not using slave */
}
static int rcar_i2c_bus_barrier(struct rcar_i2c_priv *priv) static int rcar_i2c_bus_barrier(struct rcar_i2c_priv *priv)
{ {
int ret; int ret;
...@@ -875,6 +883,10 @@ static int rcar_i2c_do_reset(struct rcar_i2c_priv *priv) ...@@ -875,6 +883,10 @@ static int rcar_i2c_do_reset(struct rcar_i2c_priv *priv)
{ {
int ret; int ret;
/* Don't reset if a slave instance is currently running */
if (priv->slave)
return -EISCONN;
ret = reset_control_reset(priv->rstc); ret = reset_control_reset(priv->rstc);
if (ret) if (ret)
return ret; return ret;
...@@ -903,10 +915,10 @@ static int rcar_i2c_master_xfer(struct i2c_adapter *adap, ...@@ -903,10 +915,10 @@ static int rcar_i2c_master_xfer(struct i2c_adapter *adap,
/* Gen3+ needs a reset. That also allows RXDMA once */ /* Gen3+ needs a reset. That also allows RXDMA once */
if (priv->devtype >= I2C_RCAR_GEN3) { if (priv->devtype >= I2C_RCAR_GEN3) {
priv->flags &= ~ID_P_NO_RXDMA;
ret = rcar_i2c_do_reset(priv); ret = rcar_i2c_do_reset(priv);
if (ret) if (ret)
goto out; goto out;
priv->flags &= ~ID_P_NO_RXDMA;
} }
rcar_i2c_init(priv); rcar_i2c_init(priv);
...@@ -1033,11 +1045,8 @@ static int rcar_unreg_slave(struct i2c_client *slave) ...@@ -1033,11 +1045,8 @@ static int rcar_unreg_slave(struct i2c_client *slave)
/* ensure no irq is running before clearing ptr */ /* ensure no irq is running before clearing ptr */
disable_irq(priv->irq); disable_irq(priv->irq);
rcar_i2c_write(priv, ICSIER, 0); rcar_i2c_reset_slave(priv);
rcar_i2c_write(priv, ICSSR, 0);
enable_irq(priv->irq); enable_irq(priv->irq);
rcar_i2c_write(priv, ICSCR, SDBS);
rcar_i2c_write(priv, ICSAR, 0); /* Gen2: must be 0 if not using slave */
priv->slave = NULL; priv->slave = NULL;
...@@ -1152,7 +1161,9 @@ static int rcar_i2c_probe(struct platform_device *pdev) ...@@ -1152,7 +1161,9 @@ static int rcar_i2c_probe(struct platform_device *pdev)
goto out_pm_disable; goto out_pm_disable;
} }
rcar_i2c_write(priv, ICSAR, 0); /* Gen2: must be 0 if not using slave */ /* Bring hardware to known state */
rcar_i2c_init(priv);
rcar_i2c_reset_slave(priv);
if (priv->devtype < I2C_RCAR_GEN3) { if (priv->devtype < I2C_RCAR_GEN3) {
irqflags |= IRQF_NO_THREAD; irqflags |= IRQF_NO_THREAD;
...@@ -1168,6 +1179,7 @@ static int rcar_i2c_probe(struct platform_device *pdev) ...@@ -1168,6 +1179,7 @@ static int rcar_i2c_probe(struct platform_device *pdev)
if (of_property_read_bool(dev->of_node, "smbus")) if (of_property_read_bool(dev->of_node, "smbus"))
priv->flags |= ID_P_HOST_NOTIFY; priv->flags |= ID_P_HOST_NOTIFY;
/* R-Car Gen3+ needs a reset before every transfer */
if (priv->devtype >= I2C_RCAR_GEN3) { if (priv->devtype >= I2C_RCAR_GEN3) {
priv->rstc = devm_reset_control_get_exclusive(&pdev->dev, NULL); priv->rstc = devm_reset_control_get_exclusive(&pdev->dev, NULL);
if (IS_ERR(priv->rstc)) { if (IS_ERR(priv->rstc)) {
...@@ -1178,6 +1190,9 @@ static int rcar_i2c_probe(struct platform_device *pdev) ...@@ -1178,6 +1190,9 @@ static int rcar_i2c_probe(struct platform_device *pdev)
ret = reset_control_status(priv->rstc); ret = reset_control_status(priv->rstc);
if (ret < 0) if (ret < 0)
goto out_pm_put; goto out_pm_put;
/* hard reset disturbs HostNotify local target, so disable it */
priv->flags &= ~ID_P_HOST_NOTIFY;
} }
ret = platform_get_irq(pdev, 0); ret = platform_get_irq(pdev, 0);
......
...@@ -1067,6 +1067,7 @@ EXPORT_SYMBOL(i2c_find_device_by_fwnode); ...@@ -1067,6 +1067,7 @@ EXPORT_SYMBOL(i2c_find_device_by_fwnode);
static const struct i2c_device_id dummy_id[] = { static const struct i2c_device_id dummy_id[] = {
{ "dummy", 0 }, { "dummy", 0 },
{ "smbus_host_notify", 0 },
{ }, { },
}; };
......
...@@ -118,6 +118,13 @@ static int i2c_slave_testunit_slave_cb(struct i2c_client *client, ...@@ -118,6 +118,13 @@ static int i2c_slave_testunit_slave_cb(struct i2c_client *client,
queue_delayed_work(system_long_wq, &tu->worker, queue_delayed_work(system_long_wq, &tu->worker,
msecs_to_jiffies(10 * tu->regs[TU_REG_DELAY])); msecs_to_jiffies(10 * tu->regs[TU_REG_DELAY]));
} }
/*
* Reset reg_idx to avoid that work gets queued again in case of
* STOP after a following read message. But do not clear TU regs
* here because we still need them in the workqueue!
*/
tu->reg_idx = 0;
break; break;
case I2C_SLAVE_WRITE_REQUESTED: case I2C_SLAVE_WRITE_REQUESTED:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment