#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)
 struct mt7621_wdt_data {
        void __iomem *base;
        struct reset_control *rst;
+       struct regmap *sysc;
        struct watchdog_device wdt;
 };
 
        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;
 
 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;
        if (!drvdata)
                return -ENOMEM;
 
+       drvdata->sysc = syscon_regmap_lookup_by_phandle(np, "mediatek,sysctl");
+       if (IS_ERR(drvdata->sysc)) {
+               drvdata->sysc = syscon_regmap_lookup_by_compatible("mediatek,mt7621-sysc");
+               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);
        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);