Skip to content

Commit 76ad36b

Browse files
parakaWim Van Sebroeck
authored andcommitted
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>
1 parent 07d4116 commit 76ad36b

1 file changed

Lines changed: 50 additions & 39 deletions

File tree

drivers/watchdog/rt2880_wdt.c

Lines changed: 50 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -40,63 +40,70 @@
4040
#define TMR1CTL_PRESCALE_MASK 0xf
4141
#define TMR1CTL_PRESCALE_65536 0xf
4242

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+
};
4750

4851
static bool nowayout = WATCHDOG_NOWAYOUT;
4952
module_param(nowayout, bool, 0);
5053
MODULE_PARM_DESC(nowayout,
5154
"Watchdog cannot be stopped once started (default="
5255
__MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
5356

54-
static inline void rt_wdt_w32(unsigned reg, u32 val)
57+
static inline void rt_wdt_w32(void __iomem *base, unsigned reg, u32 val)
5558
{
56-
iowrite32(val, rt288x_wdt_base + reg);
59+
iowrite32(val, base + reg);
5760
}
5861

59-
static inline u32 rt_wdt_r32(unsigned reg)
62+
static inline u32 rt_wdt_r32(void __iomem *base, unsigned reg)
6063
{
61-
return ioread32(rt288x_wdt_base + reg);
64+
return ioread32(base + reg);
6265
}
6366

6467
static int rt288x_wdt_ping(struct watchdog_device *w)
6568
{
66-
rt_wdt_w32(TIMER_REG_TMR1LOAD, w->timeout * rt288x_wdt_freq);
69+
struct rt2880_wdt_data *drvdata = watchdog_get_drvdata(w);
70+
71+
rt_wdt_w32(drvdata->base, TIMER_REG_TMR1LOAD, w->timeout * drvdata->freq);
6772

6873
return 0;
6974
}
7075

7176
static int rt288x_wdt_start(struct watchdog_device *w)
7277
{
78+
struct rt2880_wdt_data *drvdata = watchdog_get_drvdata(w);
7379
u32 t;
7480

75-
t = rt_wdt_r32(TIMER_REG_TMR1CTL);
81+
t = rt_wdt_r32(drvdata->base, TIMER_REG_TMR1CTL);
7682
t &= ~(TMR1CTL_MODE_MASK << TMR1CTL_MODE_SHIFT |
7783
TMR1CTL_PRESCALE_MASK);
7884
t |= (TMR1CTL_MODE_WDT << TMR1CTL_MODE_SHIFT |
7985
TMR1CTL_PRESCALE_65536);
80-
rt_wdt_w32(TIMER_REG_TMR1CTL, t);
86+
rt_wdt_w32(drvdata->base, TIMER_REG_TMR1CTL, t);
8187

8288
rt288x_wdt_ping(w);
8389

84-
t = rt_wdt_r32(TIMER_REG_TMR1CTL);
90+
t = rt_wdt_r32(drvdata->base, TIMER_REG_TMR1CTL);
8591
t |= TMR1CTL_ENABLE;
86-
rt_wdt_w32(TIMER_REG_TMR1CTL, t);
92+
rt_wdt_w32(drvdata->base, TIMER_REG_TMR1CTL, t);
8793

8894
return 0;
8995
}
9096

9197
static int rt288x_wdt_stop(struct watchdog_device *w)
9298
{
99+
struct rt2880_wdt_data *drvdata = watchdog_get_drvdata(w);
93100
u32 t;
94101

95102
rt288x_wdt_ping(w);
96103

97-
t = rt_wdt_r32(TIMER_REG_TMR1CTL);
104+
t = rt_wdt_r32(drvdata->base, TIMER_REG_TMR1CTL);
98105
t &= ~TMR1CTL_ENABLE;
99-
rt_wdt_w32(TIMER_REG_TMR1CTL, t);
106+
rt_wdt_w32(drvdata->base, TIMER_REG_TMR1CTL, t);
100107

101108
return 0;
102109
}
@@ -130,41 +137,45 @@ static const struct watchdog_ops rt288x_wdt_ops = {
130137
.set_timeout = rt288x_wdt_set_timeout,
131138
};
132139

133-
static struct watchdog_device rt288x_wdt_dev = {
134-
.info = &rt288x_wdt_info,
135-
.ops = &rt288x_wdt_ops,
136-
.min_timeout = 1,
137-
};
138-
139140
static int rt288x_wdt_probe(struct platform_device *pdev)
140141
{
141142
struct device *dev = &pdev->dev;
143+
struct watchdog_device *wdt;
144+
struct rt2880_wdt_data *drvdata;
142145
int ret;
143146

144-
rt288x_wdt_base = devm_platform_ioremap_resource(pdev, 0);
145-
if (IS_ERR(rt288x_wdt_base))
146-
return PTR_ERR(rt288x_wdt_base);
147+
drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL);
148+
if (!drvdata)
149+
return -ENOMEM;
150+
151+
drvdata->base = devm_platform_ioremap_resource(pdev, 0);
152+
if (IS_ERR(drvdata->base))
153+
return PTR_ERR(drvdata->base);
147154

148-
rt288x_wdt_clk = devm_clk_get(dev, NULL);
149-
if (IS_ERR(rt288x_wdt_clk))
150-
return PTR_ERR(rt288x_wdt_clk);
155+
drvdata->clk = devm_clk_get(dev, NULL);
156+
if (IS_ERR(drvdata->clk))
157+
return PTR_ERR(drvdata->clk);
151158

152-
rt288x_wdt_reset = devm_reset_control_get_exclusive(dev, NULL);
153-
if (!IS_ERR(rt288x_wdt_reset))
154-
reset_control_deassert(rt288x_wdt_reset);
159+
drvdata->rst = devm_reset_control_get_exclusive(dev, NULL);
160+
if (!IS_ERR(drvdata->rst))
161+
reset_control_deassert(drvdata->rst);
155162

156-
rt288x_wdt_freq = clk_get_rate(rt288x_wdt_clk) / RALINK_WDT_PRESCALE;
163+
drvdata->freq = clk_get_rate(drvdata->clk) / RALINK_WDT_PRESCALE;
157164

158-
rt288x_wdt_dev.bootstatus = rt288x_wdt_bootcause();
159-
rt288x_wdt_dev.max_timeout = (0xfffful / rt288x_wdt_freq);
160-
rt288x_wdt_dev.parent = dev;
165+
wdt = &drvdata->wdt;
166+
wdt->info = &rt288x_wdt_info;
167+
wdt->ops = &rt288x_wdt_ops;
168+
wdt->min_timeout = 1;
169+
wdt->max_timeout = (0xfffful / drvdata->freq);
170+
wdt->parent = dev;
171+
wdt->bootstatus = rt288x_wdt_bootcause();
161172

162-
watchdog_init_timeout(&rt288x_wdt_dev, rt288x_wdt_dev.max_timeout,
163-
dev);
164-
watchdog_set_nowayout(&rt288x_wdt_dev, nowayout);
173+
watchdog_init_timeout(wdt, wdt->max_timeout, dev);
174+
watchdog_set_nowayout(wdt, nowayout);
175+
watchdog_set_drvdata(wdt, drvdata);
165176

166-
watchdog_stop_on_reboot(&rt288x_wdt_dev);
167-
ret = devm_watchdog_register_device(dev, &rt288x_wdt_dev);
177+
watchdog_stop_on_reboot(wdt);
178+
ret = devm_watchdog_register_device(dev, &drvdata->wdt);
168179
if (!ret)
169180
dev_info(dev, "Initialized\n");
170181

0 commit comments

Comments
 (0)