From 63fc25e0a0646473d8aff4223fcadad11f0da7ab Mon Sep 17 00:00:00 2001 From: Shilpa Suresh Date: Tue, 18 Oct 2022 16:21:31 +0530 Subject: [PATCH] leds:leds-qpnp-vibrator-ldo: Use blocking call for brightness_set The routine qpnp_vib_brightness_set calls a sleeping function qpnp_vib_ldo_poll_status. This causes crashes due to sleeping functions being called from atomic context when a non blocking hook is used. To avoid these crashes, use the brighness_set_blocking hook in qpnp_vib_brightness_set. Change-Id: Id8690e5d8dd7a7fb6b761202fde6325127173ec0 Signed-off-by: Shilpa Suresh --- drivers/leds/leds-qpnp-vibrator-ldo.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/drivers/leds/leds-qpnp-vibrator-ldo.c b/drivers/leds/leds-qpnp-vibrator-ldo.c index b15a57e01ac3..58ca819d396e 100644 --- a/drivers/leds/leds-qpnp-vibrator-ldo.c +++ b/drivers/leds/leds-qpnp-vibrator-ldo.c @@ -284,7 +284,7 @@ static enum led_brightness qpnp_vib_brightness_get(struct led_classdev *cdev) return chip->state; } -static void qpnp_vib_brightness_set(struct led_classdev *cdev, +static int qpnp_vib_brightness_set(struct led_classdev *cdev, enum led_brightness level) { struct vib_ldo_chip *chip = container_of(cdev, struct vib_ldo_chip, @@ -302,10 +302,11 @@ static void qpnp_vib_brightness_set(struct led_classdev *cdev, hrtimer_cancel(&chip->overdrive_timer); cancel_work_sync(&chip->overdrive_work); } - qpnp_vib_ldo_enable(chip, false); + ret = qpnp_vib_ldo_enable(chip, false); } pr_debug("vibrator state=%d\n", chip->state); + return ret; } static int qpnp_vibrator_ldo_suspend(struct device *dev) @@ -365,7 +366,7 @@ static int qpnp_vibrator_ldo_probe(struct platform_device *pdev) chip->cdev.name = "vibrator"; chip->cdev.brightness_get = qpnp_vib_brightness_get; - chip->cdev.brightness_set = qpnp_vib_brightness_set; + chip->cdev.brightness_set_blocking = qpnp_vib_brightness_set; chip->cdev.max_brightness = 100; ret = devm_led_classdev_register(&pdev->dev, &chip->cdev); if (ret < 0) {