Am Sun, Feb 13, 2022 at 02:22:53PM +0100 schrieb Tobias Heider:
> Hey,
>
> I'm trying to get the Turris Omnia running and one thing missing
> is a driver for the armada-380-wdg. We already have a similar driver
> called mvdog(4) that currently only supports the armada-3700 watchdog.
> The diff below adds support for disabling the armada-380-wdg.
>
> ok?
First of all, it's -wdt. ;) It's a good start, comments inline.
>
> Index: mvdog.c
> ===================================================================
> RCS file: /mount/openbsd/cvs/src/sys/dev/fdt/mvdog.c,v
> retrieving revision 1.2
> diff -u -p -r1.2 mvdog.c
> --- mvdog.c 24 Oct 2021 17:52:26 -0000 1.2
> +++ mvdog.c 13 Feb 2022 13:11:06 -0000
> @@ -33,6 +33,10 @@
>
> #define WDT_TIMER_SELECT 0x64
Might be worth renaming those as well.
> +#define ARMADA_380_RSTOUT_MASK_BIT (1 << 10)
> +#define ARMADA_380_RSTOUT_ENABLE_BIT (1 << 8)
> +#define ARMADA_380_WDT_ENABLE_BIT (1 << 8)
Hm, How about A380 as prefix? But that's just nitpicking.
> #define HREAD4(sc, reg)
> \
> (bus_space_read_4((sc)->sc_iot, (sc)->sc_ioh, (reg)))
> #define HWRITE4(sc, reg, val)
> \
> @@ -47,6 +51,8 @@ struct mvdog_softc {
> bus_space_tag_t sc_iot;
> bus_space_handle_t sc_ioh;
> struct regmap *sc_rm;
> + bus_space_handle_t sc_ioh_rout;
> + bus_space_handle_t sc_ioh_routmask;
> };
>
> int mvdog_match(struct device *, void *, void *);
> @@ -65,7 +71,8 @@ mvdog_match(struct device *parent, void
> {
> struct fdt_attach_args *faa = aux;
>
> - return OF_is_compatible(faa->fa_node, "marvell,armada-3700-wdt");
> + return OF_is_compatible(faa->fa_node, "marvell,armada-3700-wdt") ||
> + OF_is_compatible(faa->fa_node, "marvell,armada-380-wdt");
> }
>
> void
> @@ -86,17 +93,39 @@ mvdog_attach(struct device *parent, stru
> return;
> }
>
> - sc->sc_rm = regmap_byphandle(OF_getpropint(faa->fa_node,
> - "marvell,system-controller", 0));
> - if (sc->sc_rm == NULL) {
> - printf(": can't get regmap\n");
> - return;
> - }
> -
> printf("\n");
This needs to be moved to the end, otherwise in the error case it will
be:
mvdog0 at simplebus0\n
:can't ...
>
> - /* Disable watchdog timer. */
> - HCLR4(sc, CNTR_CTRL(CNTR_WDOG), CNTR_CTRL_ENABLE);
> - HCLR4(sc, CNTR_CTRL(CNTR_RETRIGGER), CNTR_CTRL_ENABLE);
> - regmap_write_4(sc->sc_rm, WDT_TIMER_SELECT, 0);
> + if (OF_is_compatible(faa->fa_node, "marvell,armada-3700-wdt")) {
> + sc->sc_rm = regmap_byphandle(OF_getpropint(faa->fa_node,
> + "marvell,system-controller", 0));
> + if (sc->sc_rm == NULL) {
> + printf(": can't get regmap\n");
> + return;
> + }
> +
> + /* Disable watchdog timer. */
> + HCLR4(sc, CNTR_CTRL(CNTR_WDOG), CNTR_CTRL_ENABLE);
> + HCLR4(sc, CNTR_CTRL(CNTR_RETRIGGER), CNTR_CTRL_ENABLE);
> + regmap_write_4(sc->sc_rm, WDT_TIMER_SELECT, 0);
> + } else {
While we tend do to if else quite often with those compatibles, I wonder
if more explicit 'if compatible 380' might be better for readability.
> + if (bus_space_map(sc->sc_iot, faa->fa_reg[1].addr,
> + faa->fa_reg[1].size, 0, &sc->sc_ioh_rout)) {
> + printf(": can't map registers\n");
> + return;
> + }
> + if (bus_space_map(sc->sc_iot, faa->fa_reg[2].addr,
> + faa->fa_reg[2].size, 0, &sc->sc_ioh_routmask)) {
> + printf(": can't map registers\n");
> + return;
> + }
> +
> + /* Disable watchdog timer. */
> + bus_space_write_4(sc->sc_iot, sc->sc_ioh_routmask, 0,
> + bus_space_read_4(sc->sc_iot, sc->sc_ioh_routmask, 0) |
> + ARMADA_380_RSTOUT_MASK_BIT);
> + bus_space_write_4(sc->sc_iot, sc->sc_ioh_rout, 0,
> + bus_space_read_4(sc->sc_iot, sc->sc_ioh_rout, 0) &
> + ~ARMADA_380_RSTOUT_ENABLE_BIT);
> + HCLR4(sc, 0, ARMADA_380_WDT_ENABLE_BIT);
Not sure I like the mix of bus_space_* and H* macros. Maybe kettenis@
wants to chime in, he always helps me when I'm overthinking stuff.
Cheers,
Patrick
> + }
> }
>