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

watchdog: st_lpc_wdt: Convert to use device managed functions

Use device managed functions to simplify error handling, reduce
source code size, improve readability, and reduce the likelyhood of bugs.

The conversion was done automatically with coccinelle using the
following semantic patches. The semantic patches and the scripts
used to generate this commit log are available at
https://github.com/groeck/coccinelle-patches

- Use devm_add_action_or_reset() for calls to clk_disable_unprepare
- Introduce local variable 'struct device *dev' and use it instead of
dereferencing it repeatedly
- Use devm_watchdog_register_driver() to register watchdog device

Cc: Patrice Chotard <patrice.chotard@st.com>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Acked-by: Patrice Chotard <patrice.chotard@st.com>
Signed-off-by: Wim Van Sebroeck <wim@linux-watchdog.org>

authored by

Guenter Roeck and committed by
Wim Van Sebroeck
cfe9ee3a 78d9bfad

+26 -21
+26 -21
drivers/watchdog/st_lpc_wdt.c
··· 142 142 .ops = &st_wdog_ops, 143 143 }; 144 144 145 + static void st_clk_disable_unprepare(void *data) 146 + { 147 + clk_disable_unprepare(data); 148 + } 149 + 145 150 static int st_wdog_probe(struct platform_device *pdev) 146 151 { 152 + struct device *dev = &pdev->dev; 147 153 const struct of_device_id *match; 148 - struct device_node *np = pdev->dev.of_node; 154 + struct device_node *np = dev->of_node; 149 155 struct st_wdog *st_wdog; 150 156 struct regmap *regmap; 151 157 struct clk *clk; ··· 161 155 162 156 ret = of_property_read_u32(np, "st,lpc-mode", &mode); 163 157 if (ret) { 164 - dev_err(&pdev->dev, "An LPC mode must be provided\n"); 158 + dev_err(dev, "An LPC mode must be provided\n"); 165 159 return -EINVAL; 166 160 } 167 161 ··· 169 163 if (mode != ST_LPC_MODE_WDT) 170 164 return -ENODEV; 171 165 172 - st_wdog = devm_kzalloc(&pdev->dev, sizeof(*st_wdog), GFP_KERNEL); 166 + st_wdog = devm_kzalloc(dev, sizeof(*st_wdog), GFP_KERNEL); 173 167 if (!st_wdog) 174 168 return -ENOMEM; 175 169 176 - match = of_match_device(st_wdog_match, &pdev->dev); 170 + match = of_match_device(st_wdog_match, dev); 177 171 if (!match) { 178 - dev_err(&pdev->dev, "Couldn't match device\n"); 172 + dev_err(dev, "Couldn't match device\n"); 179 173 return -ENODEV; 180 174 } 181 175 st_wdog->syscfg = (struct st_wdog_syscfg *)match->data; ··· 186 180 187 181 regmap = syscon_regmap_lookup_by_phandle(np, "st,syscfg"); 188 182 if (IS_ERR(regmap)) { 189 - dev_err(&pdev->dev, "No syscfg phandle specified\n"); 183 + dev_err(dev, "No syscfg phandle specified\n"); 190 184 return PTR_ERR(regmap); 191 185 } 192 186 193 - clk = devm_clk_get(&pdev->dev, NULL); 187 + clk = devm_clk_get(dev, NULL); 194 188 if (IS_ERR(clk)) { 195 - dev_err(&pdev->dev, "Unable to request clock\n"); 189 + dev_err(dev, "Unable to request clock\n"); 196 190 return PTR_ERR(clk); 197 191 } 198 192 199 - st_wdog->dev = &pdev->dev; 193 + st_wdog->dev = dev; 200 194 st_wdog->base = base; 201 195 st_wdog->clk = clk; 202 196 st_wdog->regmap = regmap; ··· 204 198 st_wdog->clkrate = clk_get_rate(st_wdog->clk); 205 199 206 200 if (!st_wdog->clkrate) { 207 - dev_err(&pdev->dev, "Unable to fetch clock rate\n"); 201 + dev_err(dev, "Unable to fetch clock rate\n"); 208 202 return -EINVAL; 209 203 } 210 204 st_wdog_dev.max_timeout = 0xFFFFFFFF / st_wdog->clkrate; 211 - st_wdog_dev.parent = &pdev->dev; 205 + st_wdog_dev.parent = dev; 212 206 213 207 ret = clk_prepare_enable(clk); 214 208 if (ret) { 215 - dev_err(&pdev->dev, "Unable to enable clock\n"); 209 + dev_err(dev, "Unable to enable clock\n"); 216 210 return ret; 217 211 } 212 + ret = devm_add_action_or_reset(dev, st_clk_disable_unprepare, clk); 213 + if (ret) 214 + return ret; 218 215 219 216 watchdog_set_drvdata(&st_wdog_dev, st_wdog); 220 217 watchdog_set_nowayout(&st_wdog_dev, WATCHDOG_NOWAYOUT); 221 218 222 219 /* Init Watchdog timeout with value in DT */ 223 - ret = watchdog_init_timeout(&st_wdog_dev, 0, &pdev->dev); 220 + ret = watchdog_init_timeout(&st_wdog_dev, 0, dev); 224 221 if (ret) { 225 - dev_err(&pdev->dev, "Unable to initialise watchdog timeout\n"); 226 - clk_disable_unprepare(clk); 222 + dev_err(dev, "Unable to initialise watchdog timeout\n"); 227 223 return ret; 228 224 } 229 225 230 - ret = watchdog_register_device(&st_wdog_dev); 226 + ret = devm_watchdog_register_device(dev, &st_wdog_dev); 231 227 if (ret) { 232 - dev_err(&pdev->dev, "Unable to register watchdog\n"); 233 - clk_disable_unprepare(clk); 228 + dev_err(dev, "Unable to register watchdog\n"); 234 229 return ret; 235 230 } 236 231 237 232 st_wdog_setup(st_wdog, true); 238 233 239 - dev_info(&pdev->dev, "LPC Watchdog driver registered, reset type is %s", 234 + dev_info(dev, "LPC Watchdog driver registered, reset type is %s", 240 235 st_wdog->warm_reset ? "warm" : "cold"); 241 236 242 237 return ret; ··· 248 241 struct st_wdog *st_wdog = watchdog_get_drvdata(&st_wdog_dev); 249 242 250 243 st_wdog_setup(st_wdog, false); 251 - watchdog_unregister_device(&st_wdog_dev); 252 - clk_disable_unprepare(st_wdog->clk); 253 244 254 245 return 0; 255 246 }