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

Input: lpc32xx-keys - switch to using managed resources

This change switches to using devm_* managed resources APIs to
request the resources in probe to simplify probe error path and
module unloading.

Signed-off-by: Pramod Gurav <pramod.gurav@smartplayin.com>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>

authored by

Pramod Gurav and committed by
Dmitry Torokhov
dae7aa8d 38c38072

+20 -72
+20 -72
drivers/input/keyboard/lpc32xx-keys.c
··· 66 66 struct lpc32xx_kscan_drv { 67 67 struct input_dev *input; 68 68 struct clk *clk; 69 - struct resource *iores; 70 69 void __iomem *kscan_base; 71 70 unsigned int irq; 72 71 ··· 187 188 return -EINVAL; 188 189 } 189 190 190 - kscandat = kzalloc(sizeof(struct lpc32xx_kscan_drv), GFP_KERNEL); 191 - if (!kscandat) { 192 - dev_err(&pdev->dev, "failed to allocate memory\n"); 191 + kscandat = devm_kzalloc(&pdev->dev, sizeof(*kscandat), 192 + GFP_KERNEL); 193 + if (!kscandat) 193 194 return -ENOMEM; 194 - } 195 195 196 196 error = lpc32xx_parse_dt(&pdev->dev, kscandat); 197 197 if (error) { 198 198 dev_err(&pdev->dev, "failed to parse device tree\n"); 199 - goto err_free_mem; 199 + return error; 200 200 } 201 201 202 202 keymap_size = sizeof(kscandat->keymap[0]) * 203 203 (kscandat->matrix_sz << kscandat->row_shift); 204 - kscandat->keymap = kzalloc(keymap_size, GFP_KERNEL); 205 - if (!kscandat->keymap) { 206 - dev_err(&pdev->dev, "could not allocate memory for keymap\n"); 207 - error = -ENOMEM; 208 - goto err_free_mem; 209 - } 204 + kscandat->keymap = devm_kzalloc(&pdev->dev, keymap_size, GFP_KERNEL); 205 + if (!kscandat->keymap) 206 + return -ENOMEM; 210 207 211 - kscandat->input = input = input_allocate_device(); 208 + kscandat->input = input = devm_input_allocate_device(&pdev->dev); 212 209 if (!input) { 213 210 dev_err(&pdev->dev, "failed to allocate input device\n"); 214 - error = -ENOMEM; 215 - goto err_free_keymap; 211 + return -ENOMEM; 216 212 } 217 213 218 214 /* Setup key input */ ··· 228 234 kscandat->keymap, kscandat->input); 229 235 if (error) { 230 236 dev_err(&pdev->dev, "failed to build keymap\n"); 231 - goto err_free_input; 237 + return error; 232 238 } 233 239 234 240 input_set_drvdata(kscandat->input, kscandat); 235 241 236 - kscandat->iores = request_mem_region(res->start, resource_size(res), 237 - pdev->name); 238 - if (!kscandat->iores) { 239 - dev_err(&pdev->dev, "failed to request I/O memory\n"); 240 - error = -EBUSY; 241 - goto err_free_input; 242 - } 243 - 244 - kscandat->kscan_base = ioremap(kscandat->iores->start, 245 - resource_size(kscandat->iores)); 246 - if (!kscandat->kscan_base) { 247 - dev_err(&pdev->dev, "failed to remap I/O memory\n"); 248 - error = -EBUSY; 249 - goto err_release_memregion; 250 - } 242 + kscandat->kscan_base = devm_ioremap_resource(&pdev->dev, res); 243 + if (IS_ERR(kscandat->kscan_base)) 244 + return PTR_ERR(kscandat->kscan_base); 251 245 252 246 /* Get the key scanner clock */ 253 - kscandat->clk = clk_get(&pdev->dev, NULL); 247 + kscandat->clk = devm_clk_get(&pdev->dev, NULL); 254 248 if (IS_ERR(kscandat->clk)) { 255 249 dev_err(&pdev->dev, "failed to get clock\n"); 256 - error = PTR_ERR(kscandat->clk); 257 - goto err_unmap; 250 + return PTR_ERR(kscandat->clk); 258 251 } 259 252 260 253 /* Configure the key scanner */ 261 254 error = clk_prepare_enable(kscandat->clk); 262 255 if (error) 263 - goto err_clk_put; 256 + return error; 264 257 265 258 writel(kscandat->deb_clks, LPC32XX_KS_DEB(kscandat->kscan_base)); 266 259 writel(kscandat->scan_delay, LPC32XX_KS_SCAN_CTL(kscandat->kscan_base)); ··· 258 277 writel(1, LPC32XX_KS_IRQ(kscandat->kscan_base)); 259 278 clk_disable_unprepare(kscandat->clk); 260 279 261 - error = request_irq(irq, lpc32xx_kscan_irq, 0, pdev->name, kscandat); 280 + error = devm_request_irq(&pdev->dev, irq, lpc32xx_kscan_irq, 0, 281 + pdev->name, kscandat); 262 282 if (error) { 263 283 dev_err(&pdev->dev, "failed to request irq\n"); 264 - goto err_clk_put; 284 + return error; 265 285 } 266 286 267 287 error = input_register_device(kscandat->input); 268 288 if (error) { 269 289 dev_err(&pdev->dev, "failed to register input device\n"); 270 - goto err_free_irq; 290 + return error; 271 291 } 272 292 273 293 platform_set_drvdata(pdev, kscandat); 274 - return 0; 275 - 276 - err_free_irq: 277 - free_irq(irq, kscandat); 278 - err_clk_put: 279 - clk_put(kscandat->clk); 280 - err_unmap: 281 - iounmap(kscandat->kscan_base); 282 - err_release_memregion: 283 - release_mem_region(kscandat->iores->start, 284 - resource_size(kscandat->iores)); 285 - err_free_input: 286 - input_free_device(kscandat->input); 287 - err_free_keymap: 288 - kfree(kscandat->keymap); 289 - err_free_mem: 290 - kfree(kscandat); 291 - 292 - return error; 293 - } 294 - 295 - static int lpc32xx_kscan_remove(struct platform_device *pdev) 296 - { 297 - struct lpc32xx_kscan_drv *kscandat = platform_get_drvdata(pdev); 298 - 299 - free_irq(platform_get_irq(pdev, 0), kscandat); 300 - clk_put(kscandat->clk); 301 - iounmap(kscandat->kscan_base); 302 - release_mem_region(kscandat->iores->start, 303 - resource_size(kscandat->iores)); 304 - input_unregister_device(kscandat->input); 305 - kfree(kscandat->keymap); 306 - kfree(kscandat); 307 294 308 295 return 0; 309 296 } ··· 327 378 328 379 static struct platform_driver lpc32xx_kscan_driver = { 329 380 .probe = lpc32xx_kscan_probe, 330 - .remove = lpc32xx_kscan_remove, 331 381 .driver = { 332 382 .name = DRV_NAME, 333 383 .owner = THIS_MODULE,