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

Input: matrix_keypad - switch to using managed resources

Switch the drivers to use managed resources (devm) to simplify error
handling and remove the need to have remove() implementation.

Link: https://lore.kernel.org/r/20240121053232.276968-3-dmitry.torokhov@gmail.com
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>

+24 -65
+24 -65
drivers/input/keyboard/matrix_keypad.c
··· 278 278 279 279 /* initialized strobe lines as outputs, activated */ 280 280 for (i = 0; i < pdata->num_col_gpios; i++) { 281 - err = gpio_request(pdata->col_gpios[i], "matrix_kbd_col"); 281 + err = devm_gpio_request(&pdev->dev, 282 + pdata->col_gpios[i], "matrix_kbd_col"); 282 283 if (err) { 283 284 dev_err(&pdev->dev, 284 285 "failed to request GPIO%d for COL%d\n", 285 286 pdata->col_gpios[i], i); 286 - goto err_free_cols; 287 + return err; 287 288 } 288 289 289 290 gpio_direction_output(pdata->col_gpios[i], !pdata->active_low); 290 291 } 291 292 292 293 for (i = 0; i < pdata->num_row_gpios; i++) { 293 - err = gpio_request(pdata->row_gpios[i], "matrix_kbd_row"); 294 + err = devm_gpio_request(&pdev->dev, 295 + pdata->row_gpios[i], "matrix_kbd_row"); 294 296 if (err) { 295 297 dev_err(&pdev->dev, 296 298 "failed to request GPIO%d for ROW%d\n", 297 299 pdata->row_gpios[i], i); 298 - goto err_free_rows; 300 + return err; 299 301 } 300 302 301 303 gpio_direction_input(pdata->row_gpios[i]); 302 304 } 303 305 304 306 if (pdata->clustered_irq > 0) { 305 - err = request_any_context_irq(pdata->clustered_irq, 307 + err = devm_request_any_context_irq(&pdev->dev, 308 + pdata->clustered_irq, 306 309 matrix_keypad_interrupt, 307 310 pdata->clustered_irq_flags, 308 311 "matrix-keypad", keypad); 309 312 if (err < 0) { 310 313 dev_err(&pdev->dev, 311 314 "Unable to acquire clustered interrupt\n"); 312 - goto err_free_rows; 315 + return err; 313 316 } 314 317 315 318 keypad->row_irqs[0] = pdata->clustered_irq; ··· 325 322 dev_err(&pdev->dev, 326 323 "Unable to convert GPIO line %i to irq: %d\n", 327 324 pdata->row_gpios[i], err); 328 - goto err_free_irqs; 325 + return err; 329 326 } 330 327 331 - err = request_any_context_irq(irq, 328 + err = devm_request_any_context_irq(&pdev->dev, 329 + irq, 332 330 matrix_keypad_interrupt, 333 331 IRQF_TRIGGER_RISING | 334 332 IRQF_TRIGGER_FALLING, ··· 338 334 dev_err(&pdev->dev, 339 335 "Unable to acquire interrupt for GPIO line %i\n", 340 336 pdata->row_gpios[i]); 341 - goto err_free_irqs; 337 + return err; 342 338 } 343 339 344 340 keypad->row_irqs[i] = irq; ··· 349 345 350 346 /* initialized as disabled - enabled by input->open */ 351 347 disable_row_irqs(keypad); 348 + 352 349 return 0; 353 - 354 - err_free_irqs: 355 - while (--i >= 0) 356 - free_irq(keypad->row_irqs[i], keypad); 357 - i = pdata->num_row_gpios; 358 - err_free_rows: 359 - while (--i >= 0) 360 - gpio_free(pdata->row_gpios[i]); 361 - i = pdata->num_col_gpios; 362 - err_free_cols: 363 - while (--i >= 0) 364 - gpio_free(pdata->col_gpios[i]); 365 - 366 - return err; 367 - } 368 - 369 - static void matrix_keypad_free_gpio(struct matrix_keypad *keypad) 370 - { 371 - const struct matrix_keypad_platform_data *pdata = keypad->pdata; 372 - int i; 373 - 374 - for (i = 0; i < keypad->num_row_irqs; i++) 375 - free_irq(keypad->row_irqs[i], keypad); 376 - 377 - for (i = 0; i < pdata->num_row_gpios; i++) 378 - gpio_free(pdata->row_gpios[i]); 379 - 380 - for (i = 0; i < pdata->num_col_gpios; i++) 381 - gpio_free(pdata->col_gpios[i]); 382 350 } 383 351 384 352 #ifdef CONFIG_OF ··· 449 473 return -EINVAL; 450 474 } 451 475 452 - keypad = kzalloc(sizeof(struct matrix_keypad), GFP_KERNEL); 453 - input_dev = input_allocate_device(); 454 - if (!keypad || !input_dev) { 455 - err = -ENOMEM; 456 - goto err_free_mem; 457 - } 476 + keypad = devm_kzalloc(&pdev->dev, sizeof(*keypad), GFP_KERNEL); 477 + if (!keypad) 478 + return -ENOMEM; 479 + 480 + input_dev = devm_input_allocate_device(&pdev->dev); 481 + if (!input_dev) 482 + return -ENOMEM; 458 483 459 484 keypad->input_dev = input_dev; 460 485 keypad->pdata = pdata; ··· 466 489 467 490 input_dev->name = pdev->name; 468 491 input_dev->id.bustype = BUS_HOST; 469 - input_dev->dev.parent = &pdev->dev; 470 492 input_dev->open = matrix_keypad_start; 471 493 input_dev->close = matrix_keypad_stop; 472 494 ··· 475 499 NULL, input_dev); 476 500 if (err) { 477 501 dev_err(&pdev->dev, "failed to build keymap\n"); 478 - goto err_free_mem; 502 + return -ENOMEM; 479 503 } 480 504 481 505 if (!pdata->no_autorepeat) ··· 485 509 486 510 err = matrix_keypad_init_gpio(pdev, keypad); 487 511 if (err) 488 - goto err_free_mem; 512 + return err; 489 513 490 514 err = input_register_device(keypad->input_dev); 491 515 if (err) 492 - goto err_free_gpio; 516 + return err; 493 517 494 518 device_init_wakeup(&pdev->dev, pdata->wakeup); 495 519 platform_set_drvdata(pdev, keypad); 496 520 497 521 return 0; 498 - 499 - err_free_gpio: 500 - matrix_keypad_free_gpio(keypad); 501 - err_free_mem: 502 - input_free_device(input_dev); 503 - kfree(keypad); 504 - return err; 505 - } 506 - 507 - static void matrix_keypad_remove(struct platform_device *pdev) 508 - { 509 - struct matrix_keypad *keypad = platform_get_drvdata(pdev); 510 - 511 - matrix_keypad_free_gpio(keypad); 512 - input_unregister_device(keypad->input_dev); 513 - kfree(keypad); 514 522 } 515 523 516 524 #ifdef CONFIG_OF ··· 507 547 508 548 static struct platform_driver matrix_keypad_driver = { 509 549 .probe = matrix_keypad_probe, 510 - .remove_new = matrix_keypad_remove, 511 550 .driver = { 512 551 .name = "matrix-keypad", 513 552 .pm = pm_sleep_ptr(&matrix_keypad_pm_ops),