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

Input: nomadik-ske-keypad - convert to use devm_* api

Use devm_* api to simplify code, this makes it unnecessary to explicitly
release resources.

Signed-off-by: Yangtao Li <frank.li@vivo.com>
Link: https://lore.kernel.org/r/20230705052346.39337-8-frank.li@vivo.com
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>

authored by

Yangtao Li and committed by
Dmitry Torokhov
c0551abb b1c55900

+35 -92
+35 -92
drivers/input/keyboard/nomadik-ske-keypad.c
··· 221 221 return IRQ_HANDLED; 222 222 } 223 223 224 + static void ske_keypad_board_exit(void *data) 225 + { 226 + struct ske_keypad *keypad = data; 227 + 228 + keypad->board->exit(); 229 + } 230 + 224 231 static int __init ske_keypad_probe(struct platform_device *pdev) 225 232 { 226 233 const struct ske_keypad_platform_data *plat = 227 234 dev_get_platdata(&pdev->dev); 235 + struct device *dev = &pdev->dev; 228 236 struct ske_keypad *keypad; 229 237 struct input_dev *input; 230 - struct resource *res; 231 238 int irq; 232 239 int error; 233 240 ··· 245 238 246 239 irq = platform_get_irq(pdev, 0); 247 240 if (irq < 0) 248 - return -EINVAL; 241 + return irq; 249 242 250 - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 251 - if (!res) { 252 - dev_err(&pdev->dev, "missing platform resources\n"); 253 - return -EINVAL; 254 - } 255 - 256 - keypad = kzalloc(sizeof(struct ske_keypad), GFP_KERNEL); 257 - input = input_allocate_device(); 243 + keypad = devm_kzalloc(dev, sizeof(struct ske_keypad), 244 + GFP_KERNEL); 245 + input = devm_input_allocate_device(dev); 258 246 if (!keypad || !input) { 259 247 dev_err(&pdev->dev, "failed to allocate keypad memory\n"); 260 - error = -ENOMEM; 261 - goto err_free_mem; 248 + return -ENOMEM; 262 249 } 263 250 264 251 keypad->irq = irq; ··· 260 259 keypad->input = input; 261 260 spin_lock_init(&keypad->ske_keypad_lock); 262 261 263 - if (!request_mem_region(res->start, resource_size(res), pdev->name)) { 264 - dev_err(&pdev->dev, "failed to request I/O memory\n"); 265 - error = -EBUSY; 266 - goto err_free_mem; 267 - } 262 + keypad->reg_base = devm_platform_ioremap_resource(pdev, 0); 263 + if (IS_ERR(keypad->reg_base)) 264 + return PTR_ERR(keypad->reg_base); 268 265 269 - keypad->reg_base = ioremap(res->start, resource_size(res)); 270 - if (!keypad->reg_base) { 271 - dev_err(&pdev->dev, "failed to remap I/O memory\n"); 272 - error = -ENXIO; 273 - goto err_free_mem_region; 274 - } 275 - 276 - keypad->pclk = clk_get(&pdev->dev, "apb_pclk"); 266 + keypad->pclk = devm_clk_get_enabled(dev, "apb_pclk"); 277 267 if (IS_ERR(keypad->pclk)) { 278 268 dev_err(&pdev->dev, "failed to get pclk\n"); 279 - error = PTR_ERR(keypad->pclk); 280 - goto err_iounmap; 269 + return PTR_ERR(keypad->pclk); 281 270 } 282 271 283 - keypad->clk = clk_get(&pdev->dev, NULL); 272 + keypad->clk = devm_clk_get_enabled(dev, NULL); 284 273 if (IS_ERR(keypad->clk)) { 285 274 dev_err(&pdev->dev, "failed to get clk\n"); 286 - error = PTR_ERR(keypad->clk); 287 - goto err_pclk; 275 + return PTR_ERR(keypad->clk); 288 276 } 289 277 290 278 input->id.bustype = BUS_HOST; ··· 285 295 keypad->keymap, input); 286 296 if (error) { 287 297 dev_err(&pdev->dev, "Failed to build keymap\n"); 288 - goto err_clk; 298 + return error; 289 299 } 290 300 291 301 input_set_capability(input, EV_MSC, MSC_SCAN); 292 302 if (!plat->no_autorepeat) 293 303 __set_bit(EV_REP, input->evbit); 294 304 295 - error = clk_prepare_enable(keypad->pclk); 296 - if (error) { 297 - dev_err(&pdev->dev, "Failed to prepare/enable pclk\n"); 298 - goto err_clk; 299 - } 300 - 301 - error = clk_prepare_enable(keypad->clk); 302 - if (error) { 303 - dev_err(&pdev->dev, "Failed to prepare/enable clk\n"); 304 - goto err_pclk_disable; 305 - } 306 - 307 - 308 305 /* go through board initialization helpers */ 309 306 if (keypad->board->init) 310 307 keypad->board->init(); 311 308 309 + if (keypad->board->exit) { 310 + error = devm_add_action_or_reset(dev, ske_keypad_board_exit, 311 + keypad); 312 + if (error) 313 + return error; 314 + } 315 + 312 316 error = ske_keypad_chip_init(keypad); 313 317 if (error) { 314 318 dev_err(&pdev->dev, "unable to init keypad hardware\n"); 315 - goto err_clk_disable; 319 + return error; 316 320 } 317 321 318 - error = request_threaded_irq(keypad->irq, NULL, ske_keypad_irq, 319 - IRQF_ONESHOT, "ske-keypad", keypad); 322 + error = devm_request_threaded_irq(dev, keypad->irq, 323 + NULL, ske_keypad_irq, 324 + IRQF_ONESHOT, "ske-keypad", keypad); 320 325 if (error) { 321 326 dev_err(&pdev->dev, "allocate irq %d failed\n", keypad->irq); 322 - goto err_clk_disable; 327 + return error; 323 328 } 324 329 325 330 error = input_register_device(input); 326 331 if (error) { 327 332 dev_err(&pdev->dev, 328 - "unable to register input device: %d\n", error); 329 - goto err_free_irq; 333 + "unable to register input device: %d\n", error); 334 + return error; 330 335 } 331 336 332 337 if (plat->wakeup_enable) 333 338 device_init_wakeup(&pdev->dev, true); 334 339 335 340 platform_set_drvdata(pdev, keypad); 336 - 337 - return 0; 338 - 339 - err_free_irq: 340 - free_irq(keypad->irq, keypad); 341 - err_clk_disable: 342 - clk_disable_unprepare(keypad->clk); 343 - err_pclk_disable: 344 - clk_disable_unprepare(keypad->pclk); 345 - err_clk: 346 - clk_put(keypad->clk); 347 - err_pclk: 348 - clk_put(keypad->pclk); 349 - err_iounmap: 350 - iounmap(keypad->reg_base); 351 - err_free_mem_region: 352 - release_mem_region(res->start, resource_size(res)); 353 - err_free_mem: 354 - input_free_device(input); 355 - kfree(keypad); 356 - return error; 357 - } 358 - 359 - static int ske_keypad_remove(struct platform_device *pdev) 360 - { 361 - struct ske_keypad *keypad = platform_get_drvdata(pdev); 362 - struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 363 - 364 - free_irq(keypad->irq, keypad); 365 - 366 - input_unregister_device(keypad->input); 367 - 368 - clk_disable_unprepare(keypad->clk); 369 - clk_put(keypad->clk); 370 - 371 - if (keypad->board->exit) 372 - keypad->board->exit(); 373 - 374 - iounmap(keypad->reg_base); 375 - release_mem_region(res->start, resource_size(res)); 376 - kfree(keypad); 377 341 378 342 return 0; 379 343 } ··· 368 424 .name = "nmk-ske-keypad", 369 425 .pm = pm_sleep_ptr(&ske_keypad_dev_pm_ops), 370 426 }, 371 - .remove = ske_keypad_remove, 372 427 }; 373 428 374 429 module_platform_driver_probe(ske_keypad_driver, ske_keypad_probe);