On Fri, Feb 10, 2023 at 06:38:41PM +0100, Sergio Paracuellos wrote: > MT7621 SoC has a system controller node. Watchdog need to access to reset > status register. Ralink architecture and related driver are old and from > the beggining they are using some architecture dependent operations for > accessing this shared registers through 'asm/mach-ralink/ralink_regs.h' > header file. However this is not ideal from a driver perspective which can > just access to the system controller registers in an arch independent way > using regmap syscon APIs. Update Kconfig accordingly to select new added > dependencies and allow driver to be compile tested. > > Signed-off-by: Sergio Paracuellos <sergio.paracuellos@xxxxxxxxx> Reviewed-by: Guenter Roeck <linux@xxxxxxxxxxxx> > --- > drivers/watchdog/Kconfig | 2 ++ > drivers/watchdog/mt7621_wdt.c | 19 ++++++++++++++----- > 2 files changed, 16 insertions(+), 5 deletions(-) > > diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig > index b64bc49c7..0759de670 100644 > --- a/drivers/watchdog/Kconfig > +++ b/drivers/watchdog/Kconfig > @@ -1865,6 +1865,8 @@ config GXP_WATCHDOG > config MT7621_WDT > tristate "Mediatek SoC watchdog" > select WATCHDOG_CORE > + select REGMAP_MMIO > + select MFD_SYSCON > depends on SOC_MT7620 || SOC_MT7621 > help > Hardware driver for the Mediatek/Ralink MT7621/8 SoC Watchdog Timer. > diff --git a/drivers/watchdog/mt7621_wdt.c b/drivers/watchdog/mt7621_wdt.c > index 40fb2c9ba..9ed07c187 100644 > --- a/drivers/watchdog/mt7621_wdt.c > +++ b/drivers/watchdog/mt7621_wdt.c > @@ -15,8 +15,8 @@ > #include <linux/moduleparam.h> > #include <linux/platform_device.h> > #include <linux/mod_devicetable.h> > - > -#include <asm/mach-ralink/ralink_regs.h> > +#include <linux/mfd/syscon.h> > +#include <linux/regmap.h> > > #define SYSC_RSTSTAT 0x38 > #define WDT_RST_CAUSE BIT(1) > @@ -34,6 +34,7 @@ > struct mt7621_wdt_data { > void __iomem *base; > struct reset_control *rst; > + struct regmap *sysc; > struct watchdog_device wdt; > }; > > @@ -104,9 +105,12 @@ static int mt7621_wdt_stop(struct watchdog_device *w) > return 0; > } > > -static int mt7621_wdt_bootcause(void) > +static int mt7621_wdt_bootcause(struct mt7621_wdt_data *d) > { > - if (rt_sysc_r32(SYSC_RSTSTAT) & WDT_RST_CAUSE) > + u32 val; > + > + regmap_read(d->sysc, SYSC_RSTSTAT, &val); > + if (val & WDT_RST_CAUSE) > return WDIOF_CARDRESET; > > return 0; > @@ -134,6 +138,7 @@ static const struct watchdog_ops mt7621_wdt_ops = { > > static int mt7621_wdt_probe(struct platform_device *pdev) > { > + struct device_node *np = pdev->dev.of_node; > struct device *dev = &pdev->dev; > struct watchdog_device *mt7621_wdt; > struct mt7621_wdt_data *drvdata; > @@ -143,6 +148,10 @@ static int mt7621_wdt_probe(struct platform_device *pdev) > if (!drvdata) > return -ENOMEM; > > + drvdata->sysc = syscon_regmap_lookup_by_phandle(np, "mediatek,sysctl"); > + if (IS_ERR(drvdata->sysc)) > + return PTR_ERR(drvdata->sysc); > + > drvdata->base = devm_platform_ioremap_resource(pdev, 0); > if (IS_ERR(drvdata->base)) > return PTR_ERR(drvdata->base); > @@ -158,7 +167,7 @@ static int mt7621_wdt_probe(struct platform_device *pdev) > mt7621_wdt->max_timeout = 0xfffful / 1000; > mt7621_wdt->parent = dev; > > - mt7621_wdt->bootstatus = mt7621_wdt_bootcause(); > + mt7621_wdt->bootstatus = mt7621_wdt_bootcause(drvdata); > > watchdog_init_timeout(mt7621_wdt, mt7621_wdt->max_timeout, dev); > watchdog_set_nowayout(mt7621_wdt, nowayout); > -- > 2.25.1 >