[PATCH v4 08/11] ppc/pnv: Use resettable interface to reset child I2C buses

Glenn Miles posted 11 patches 1 year ago
Maintainers: Paolo Bonzini <pbonzini@redhat.com>, Glenn Miles <milesg@linux.vnet.ibm.com>, "Cédric Le Goater" <clg@kaod.org>, Nicholas Piggin <npiggin@gmail.com>, "Frédéric Barrat" <fbarrat@linux.ibm.com>, Thomas Huth <thuth@redhat.com>, Laurent Vivier <lvivier@redhat.com>
There is a newer version of this series
[PATCH v4 08/11] ppc/pnv: Use resettable interface to reset child I2C buses
Posted by Glenn Miles 1 year ago
The QEMU I2C buses and devices use the resettable
interface for resetting while the PNV I2C controller
and parent buses and devices have not yet transitioned
to this new interface and use the old reset strategy.
This was preventing the I2C buses and devices wired
to the PNV I2C controller from being reset.

The short term fix for this is to have the PNV I2C
Controller's reset function explicitly call the resettable
interface function, bus_cold_reset(), on all child
I2C buses.

The long term fix should be to transition all PNV parent
devices and buses to use the resettable interface so that
all child buses and devices are automatically reset.

Signed-off-by: Glenn Miles <milesg@linux.vnet.ibm.com>
---

No changes from previous version

 hw/ppc/pnv_i2c.c | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)

diff --git a/hw/ppc/pnv_i2c.c b/hw/ppc/pnv_i2c.c
index f80589157b..9ced596b98 100644
--- a/hw/ppc/pnv_i2c.c
+++ b/hw/ppc/pnv_i2c.c
@@ -628,6 +628,19 @@ static int pnv_i2c_dt_xscom(PnvXScomInterface *dev, void *fdt,
     return 0;
 }
 
+static void pnv_i2c_sys_reset(void *dev)
+{
+    int port;
+    PnvI2C *i2c = PNV_I2C(dev);
+
+    pnv_i2c_reset(dev);
+
+    /* reset all buses connected to this i2c controller */
+    for (port = 0; port < i2c->num_busses; port++) {
+        bus_cold_reset(BUS(i2c->busses[port]));
+    }
+}
+
 static void pnv_i2c_realize(DeviceState *dev, Error **errp)
 {
     PnvI2C *i2c = PNV_I2C(dev);
@@ -648,7 +661,7 @@ static void pnv_i2c_realize(DeviceState *dev, Error **errp)
 
     fifo8_create(&i2c->fifo, PNV_I2C_FIFO_SIZE);
 
-    qemu_register_reset(pnv_i2c_reset, dev);
+    qemu_register_reset(pnv_i2c_sys_reset, dev);
 
     qdev_init_gpio_out(DEVICE(dev), &i2c->psi_irq, 1);
 }
-- 
2.31.1
Re: [PATCH v4 08/11] ppc/pnv: Use resettable interface to reset child I2C buses
Posted by Cédric Le Goater 1 year ago
On 11/21/23 00:51, Glenn Miles wrote:
> The QEMU I2C buses and devices use the resettable
> interface for resetting while the PNV I2C controller
> and parent buses and devices have not yet transitioned
> to this new interface and use the old reset strategy.
> This was preventing the I2C buses and devices wired
> to the PNV I2C controller from being reset.
> 
> The short term fix for this is to have the PNV I2C
> Controller's reset function explicitly call the resettable
> interface function, bus_cold_reset(), on all child
> I2C buses.
> 
> The long term fix should be to transition all PNV parent
> devices and buses to use the resettable interface so that
> all child buses and devices are automatically reset.
> 
> Signed-off-by: Glenn Miles <milesg@linux.vnet.ibm.com>
> ---


Reviewed-by: Cédric Le Goater <clg@kaod.org>

Thanks,

C.


> 
> No changes from previous version
> 
>   hw/ppc/pnv_i2c.c | 15 ++++++++++++++-
>   1 file changed, 14 insertions(+), 1 deletion(-)
> 
> diff --git a/hw/ppc/pnv_i2c.c b/hw/ppc/pnv_i2c.c
> index f80589157b..9ced596b98 100644
> --- a/hw/ppc/pnv_i2c.c
> +++ b/hw/ppc/pnv_i2c.c
> @@ -628,6 +628,19 @@ static int pnv_i2c_dt_xscom(PnvXScomInterface *dev, void *fdt,
>       return 0;
>   }
>   
> +static void pnv_i2c_sys_reset(void *dev)
> +{
> +    int port;
> +    PnvI2C *i2c = PNV_I2C(dev);
> +
> +    pnv_i2c_reset(dev);
> +
> +    /* reset all buses connected to this i2c controller */
> +    for (port = 0; port < i2c->num_busses; port++) {
> +        bus_cold_reset(BUS(i2c->busses[port]));
> +    }
> +}
> +
>   static void pnv_i2c_realize(DeviceState *dev, Error **errp)
>   {
>       PnvI2C *i2c = PNV_I2C(dev);
> @@ -648,7 +661,7 @@ static void pnv_i2c_realize(DeviceState *dev, Error **errp)
>   
>       fifo8_create(&i2c->fifo, PNV_I2C_FIFO_SIZE);
>   
> -    qemu_register_reset(pnv_i2c_reset, dev);
> +    qemu_register_reset(pnv_i2c_sys_reset, dev);
>   
>       qdev_init_gpio_out(DEVICE(dev), &i2c->psi_irq, 1);
>   }