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 <quic_c_sbsure@quicinc.com>
This commit is contained in:
parent
47517f21fb
commit
63fc25e0a0
@ -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) {
|
||||
|
Loading…
Reference in New Issue
Block a user