Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

watchdog: rt2880-wdt: avoid static global declarations

Instead of using static global definitions in driver code, refactor code
introducing a new watchdog driver data structure and use it along the code.

Signed-off-by: Sergio Paracuellos <sergio.paracuellos@gmail.com>
Reviewed-by: Guenter Roeck <linux@roeck-us.net>
Link: https://lore.kernel.org/r/20230301065510.2818425-1-sergio.paracuellos@gmail.com
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Wim Van Sebroeck <wim@linux-watchdog.org>

authored by

Sergio Paracuellos and committed by
Wim Van Sebroeck
76ad36bf 07d41160

+50 -39
+50 -39
drivers/watchdog/rt2880_wdt.c
··· 40 40 #define TMR1CTL_PRESCALE_MASK 0xf 41 41 #define TMR1CTL_PRESCALE_65536 0xf 42 42 43 - static struct clk *rt288x_wdt_clk; 44 - static unsigned long rt288x_wdt_freq; 45 - static void __iomem *rt288x_wdt_base; 46 - static struct reset_control *rt288x_wdt_reset; 43 + struct rt2880_wdt_data { 44 + void __iomem *base; 45 + unsigned long freq; 46 + struct clk *clk; 47 + struct reset_control *rst; 48 + struct watchdog_device wdt; 49 + }; 47 50 48 51 static bool nowayout = WATCHDOG_NOWAYOUT; 49 52 module_param(nowayout, bool, 0); ··· 54 51 "Watchdog cannot be stopped once started (default=" 55 52 __MODULE_STRING(WATCHDOG_NOWAYOUT) ")"); 56 53 57 - static inline void rt_wdt_w32(unsigned reg, u32 val) 54 + static inline void rt_wdt_w32(void __iomem *base, unsigned reg, u32 val) 58 55 { 59 - iowrite32(val, rt288x_wdt_base + reg); 56 + iowrite32(val, base + reg); 60 57 } 61 58 62 - static inline u32 rt_wdt_r32(unsigned reg) 59 + static inline u32 rt_wdt_r32(void __iomem *base, unsigned reg) 63 60 { 64 - return ioread32(rt288x_wdt_base + reg); 61 + return ioread32(base + reg); 65 62 } 66 63 67 64 static int rt288x_wdt_ping(struct watchdog_device *w) 68 65 { 69 - rt_wdt_w32(TIMER_REG_TMR1LOAD, w->timeout * rt288x_wdt_freq); 66 + struct rt2880_wdt_data *drvdata = watchdog_get_drvdata(w); 67 + 68 + rt_wdt_w32(drvdata->base, TIMER_REG_TMR1LOAD, w->timeout * drvdata->freq); 70 69 71 70 return 0; 72 71 } 73 72 74 73 static int rt288x_wdt_start(struct watchdog_device *w) 75 74 { 75 + struct rt2880_wdt_data *drvdata = watchdog_get_drvdata(w); 76 76 u32 t; 77 77 78 - t = rt_wdt_r32(TIMER_REG_TMR1CTL); 78 + t = rt_wdt_r32(drvdata->base, TIMER_REG_TMR1CTL); 79 79 t &= ~(TMR1CTL_MODE_MASK << TMR1CTL_MODE_SHIFT | 80 80 TMR1CTL_PRESCALE_MASK); 81 81 t |= (TMR1CTL_MODE_WDT << TMR1CTL_MODE_SHIFT | 82 82 TMR1CTL_PRESCALE_65536); 83 - rt_wdt_w32(TIMER_REG_TMR1CTL, t); 83 + rt_wdt_w32(drvdata->base, TIMER_REG_TMR1CTL, t); 84 84 85 85 rt288x_wdt_ping(w); 86 86 87 - t = rt_wdt_r32(TIMER_REG_TMR1CTL); 87 + t = rt_wdt_r32(drvdata->base, TIMER_REG_TMR1CTL); 88 88 t |= TMR1CTL_ENABLE; 89 - rt_wdt_w32(TIMER_REG_TMR1CTL, t); 89 + rt_wdt_w32(drvdata->base, TIMER_REG_TMR1CTL, t); 90 90 91 91 return 0; 92 92 } 93 93 94 94 static int rt288x_wdt_stop(struct watchdog_device *w) 95 95 { 96 + struct rt2880_wdt_data *drvdata = watchdog_get_drvdata(w); 96 97 u32 t; 97 98 98 99 rt288x_wdt_ping(w); 99 100 100 - t = rt_wdt_r32(TIMER_REG_TMR1CTL); 101 + t = rt_wdt_r32(drvdata->base, TIMER_REG_TMR1CTL); 101 102 t &= ~TMR1CTL_ENABLE; 102 - rt_wdt_w32(TIMER_REG_TMR1CTL, t); 103 + rt_wdt_w32(drvdata->base, TIMER_REG_TMR1CTL, t); 103 104 104 105 return 0; 105 106 } ··· 137 130 .set_timeout = rt288x_wdt_set_timeout, 138 131 }; 139 132 140 - static struct watchdog_device rt288x_wdt_dev = { 141 - .info = &rt288x_wdt_info, 142 - .ops = &rt288x_wdt_ops, 143 - .min_timeout = 1, 144 - }; 145 - 146 133 static int rt288x_wdt_probe(struct platform_device *pdev) 147 134 { 148 135 struct device *dev = &pdev->dev; 136 + struct watchdog_device *wdt; 137 + struct rt2880_wdt_data *drvdata; 149 138 int ret; 150 139 151 - rt288x_wdt_base = devm_platform_ioremap_resource(pdev, 0); 152 - if (IS_ERR(rt288x_wdt_base)) 153 - return PTR_ERR(rt288x_wdt_base); 140 + drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL); 141 + if (!drvdata) 142 + return -ENOMEM; 154 143 155 - rt288x_wdt_clk = devm_clk_get(dev, NULL); 156 - if (IS_ERR(rt288x_wdt_clk)) 157 - return PTR_ERR(rt288x_wdt_clk); 144 + drvdata->base = devm_platform_ioremap_resource(pdev, 0); 145 + if (IS_ERR(drvdata->base)) 146 + return PTR_ERR(drvdata->base); 158 147 159 - rt288x_wdt_reset = devm_reset_control_get_exclusive(dev, NULL); 160 - if (!IS_ERR(rt288x_wdt_reset)) 161 - reset_control_deassert(rt288x_wdt_reset); 148 + drvdata->clk = devm_clk_get(dev, NULL); 149 + if (IS_ERR(drvdata->clk)) 150 + return PTR_ERR(drvdata->clk); 162 151 163 - rt288x_wdt_freq = clk_get_rate(rt288x_wdt_clk) / RALINK_WDT_PRESCALE; 152 + drvdata->rst = devm_reset_control_get_exclusive(dev, NULL); 153 + if (!IS_ERR(drvdata->rst)) 154 + reset_control_deassert(drvdata->rst); 164 155 165 - rt288x_wdt_dev.bootstatus = rt288x_wdt_bootcause(); 166 - rt288x_wdt_dev.max_timeout = (0xfffful / rt288x_wdt_freq); 167 - rt288x_wdt_dev.parent = dev; 156 + drvdata->freq = clk_get_rate(drvdata->clk) / RALINK_WDT_PRESCALE; 168 157 169 - watchdog_init_timeout(&rt288x_wdt_dev, rt288x_wdt_dev.max_timeout, 170 - dev); 171 - watchdog_set_nowayout(&rt288x_wdt_dev, nowayout); 158 + wdt = &drvdata->wdt; 159 + wdt->info = &rt288x_wdt_info; 160 + wdt->ops = &rt288x_wdt_ops; 161 + wdt->min_timeout = 1; 162 + wdt->max_timeout = (0xfffful / drvdata->freq); 163 + wdt->parent = dev; 164 + wdt->bootstatus = rt288x_wdt_bootcause(); 172 165 173 - watchdog_stop_on_reboot(&rt288x_wdt_dev); 174 - ret = devm_watchdog_register_device(dev, &rt288x_wdt_dev); 166 + watchdog_init_timeout(wdt, wdt->max_timeout, dev); 167 + watchdog_set_nowayout(wdt, nowayout); 168 + watchdog_set_drvdata(wdt, drvdata); 169 + 170 + watchdog_stop_on_reboot(wdt); 171 + ret = devm_watchdog_register_device(dev, &drvdata->wdt); 175 172 if (!ret) 176 173 dev_info(dev, "Initialized\n"); 177 174