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

Input: lm8323 - use guard notation when acquiring mutexes

This makes the code more compact and error handling more robust
by ensuring that mutexes are released in all code paths when control
leaves critical section.

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

+22 -27
+22 -27
drivers/input/keyboard/lm8323.c
··· 350 350 351 351 static void pwm_done(struct lm8323_pwm *pwm) 352 352 { 353 - mutex_lock(&pwm->lock); 353 + guard(mutex)(&pwm->lock); 354 + 354 355 pwm->running = false; 355 356 if (pwm->desired_brightness != pwm->brightness) 356 357 schedule_work(&pwm->work); 357 - mutex_unlock(&pwm->lock); 358 358 } 359 359 360 360 /* ··· 367 367 u8 ints; 368 368 int i; 369 369 370 - mutex_lock(&lm->lock); 370 + guard(mutex)(&lm->lock); 371 371 372 372 while ((lm8323_read(lm, LM8323_CMD_READ_INT, &ints, 1) == 1) && ints) { 373 373 if (likely(ints & INT_KEYPAD)) ··· 393 393 } 394 394 } 395 395 } 396 - 397 - mutex_unlock(&lm->lock); 398 396 399 397 return IRQ_HANDLED; 400 398 } ··· 443 445 u16 pwm_cmds[3]; 444 446 int num_cmds = 0; 445 447 446 - mutex_lock(&pwm->lock); 448 + guard(mutex)(&pwm->lock); 447 449 448 450 /* 449 451 * Do nothing if we're already at the requested level, ··· 452 454 * finishes. 453 455 */ 454 456 if (pwm->running || pwm->desired_brightness == pwm->brightness) 455 - goto out; 457 + return; 456 458 457 459 kill = (pwm->desired_brightness == 0); 458 460 up = (pwm->desired_brightness > pwm->brightness); ··· 487 489 488 490 lm8323_write_pwm(pwm, kill, num_cmds, pwm_cmds); 489 491 pwm->brightness = pwm->desired_brightness; 490 - 491 - out: 492 - mutex_unlock(&pwm->lock); 493 492 } 494 493 495 494 static void lm8323_pwm_set_brightness(struct led_classdev *led_cdev, ··· 495 500 struct lm8323_pwm *pwm = cdev_to_pwm(led_cdev); 496 501 struct lm8323_chip *lm = pwm->chip; 497 502 498 - mutex_lock(&pwm->lock); 499 - pwm->desired_brightness = brightness; 500 - mutex_unlock(&pwm->lock); 503 + scoped_guard(mutex, &pwm->lock) { 504 + pwm->desired_brightness = brightness; 505 + } 501 506 502 507 if (in_interrupt()) { 503 508 schedule_work(&pwm->work); ··· 505 510 /* 506 511 * Schedule PWM work as usual unless we are going into suspend 507 512 */ 508 - mutex_lock(&lm->lock); 509 - if (likely(!lm->pm_suspend)) 510 - schedule_work(&pwm->work); 511 - else 512 - lm8323_pwm_work(&pwm->work); 513 - mutex_unlock(&lm->lock); 513 + scoped_guard(mutex, &lm->lock) { 514 + if (likely(!lm->pm_suspend)) 515 + schedule_work(&pwm->work); 516 + else 517 + lm8323_pwm_work(&pwm->work); 518 + } 514 519 } 515 520 } 516 521 ··· 603 608 if (ret) 604 609 return ret; 605 610 606 - mutex_lock(&lm->lock); 611 + guard(mutex)(&lm->lock); 612 + 607 613 lm->kp_enabled = !i; 608 - mutex_unlock(&lm->lock); 609 614 610 615 return count; 611 616 } ··· 753 758 irq_set_irq_wake(client->irq, 0); 754 759 disable_irq(client->irq); 755 760 756 - mutex_lock(&lm->lock); 757 - lm->pm_suspend = true; 758 - mutex_unlock(&lm->lock); 761 + scoped_guard(mutex, &lm->lock) { 762 + lm->pm_suspend = true; 763 + } 759 764 760 765 for (i = 0; i < 3; i++) 761 766 if (lm->pwm[i].enabled) ··· 770 775 struct lm8323_chip *lm = i2c_get_clientdata(client); 771 776 int i; 772 777 773 - mutex_lock(&lm->lock); 774 - lm->pm_suspend = false; 775 - mutex_unlock(&lm->lock); 778 + scoped_guard(mutex, &lm->lock) { 779 + lm->pm_suspend = false; 780 + } 776 781 777 782 for (i = 0; i < 3; i++) 778 783 if (lm->pwm[i].enabled)