Hi Philippe,

On Tue, Jan 16, 2024 at 11:04 AM Philippe Mathieu-Daudé <phi...@linaro.org>
wrote:

> Hi,
>
> (Cc'ing Li, Strahinja and Niek)
>
> On 15/1/24 19:27, Guenter Roeck wrote:
> > Add watchdog timer support to Allwinner-H40 and Bananapi.
> > The watchdog timer is added as an overlay to the Timer
> > module memory map.
>
> I'm confused by these registers from TYPE_AW_A10_PIT
> and the TYPE_AW_WDT implementation you are using:
>
>    #define AW_A10_PIT_WDOG_CONTROL    0x90
>    #define AW_A10_PIT_WDOG_MODE       0x94
>
> Do we have 2 implementations of the same peripheral?
>

The inspiration for the AW_WDT implementation, with overlay of WDOG_CONTROL
and WDOG_MODE registers in the PIT memory map, was taken from the AW_RTC
implementation.
That was the easiest way to implement watchdog functionality, and also
keeps logical functionality in the appropriate place (hw/watchdog) instead
of bundling it with the timer.
As Guenter commented, the AW_A10_PIT does not do anything with those two
registers and with overlay it does not matter anymore.


>
> Should we instanciate AW_WDT within AW_A10_PIT?
>

Unfortunately, I don't know what that would look like and what benefits we
would have from it. Can you point me to an example that already exists?


> > Signed-off-by: Guenter Roeck <li...@roeck-us.net>
>

Guenter, thank you for submitting this change. The commit looks fine to me,
so

Reviewed-by: Strahinja Jankovic <strahinja.p.janko...@gmail.com>

Best regards,
Strahinja


> ---
> >   docs/system/arm/bananapi_m2u.rst | 2 +-
> >   hw/arm/Kconfig                   | 1 +
> >   hw/arm/allwinner-r40.c           | 8 ++++++++
> >   include/hw/arm/allwinner-r40.h   | 3 +++
> >   4 files changed, 13 insertions(+), 1 deletion(-)
>
>
> > diff --git a/hw/arm/allwinner-r40.c b/hw/arm/allwinner-r40.c
> > index 534be4a735..a28e5b3886 100644
> > --- a/hw/arm/allwinner-r40.c
> > +++ b/hw/arm/allwinner-r40.c
> > @@ -53,6 +53,7 @@ const hwaddr allwinner_r40_memmap[] = {
> >       [AW_R40_DEV_OHCI2]      = 0x01c1c400,
> >       [AW_R40_DEV_CCU]        = 0x01c20000,
> >       [AW_R40_DEV_PIT]        = 0x01c20c00,
> > +    [AW_R40_DEV_WDT]        = 0x01c20c90,
> >       [AW_R40_DEV_UART0]      = 0x01c28000,
> >       [AW_R40_DEV_UART1]      = 0x01c28400,
> >       [AW_R40_DEV_UART2]      = 0x01c28800,
> > @@ -279,6 +280,8 @@ static void allwinner_r40_init(Object *obj)
> >       object_property_add_alias(obj, "clk1-freq", OBJECT(&s->timer),
> >                                 "clk1-freq");
> >
> > +    object_initialize_child(obj, "wdt", &s->wdt, TYPE_AW_WDT_SUN4I);
> > +
> >       object_initialize_child(obj, "ccu", &s->ccu, TYPE_AW_R40_CCU);
> >
> >       for (int i = 0; i < AW_R40_NUM_MMCS; i++) {
> > @@ -545,6 +548,11 @@ static void allwinner_r40_realize(DeviceState *dev,
> Error **errp)
> >       sysbus_connect_irq(SYS_BUS_DEVICE(&s->emac), 0,
> >                          qdev_get_gpio_in(DEVICE(&s->gic),
> AW_R40_GIC_SPI_EMAC));
> >
> > +    /* WDT */
> > +    sysbus_realize(SYS_BUS_DEVICE(&s->wdt), &error_fatal);
> > +    sysbus_mmio_map_overlap(SYS_BUS_DEVICE(&s->wdt), 0,
> > +                            allwinner_r40_memmap[AW_R40_DEV_WDT], 1);
> > +
>

Reply via email to