mirror of https://gitee.com/openkylin/linux.git
- Fix-ups
- Take heed of GPIO default-on requests; gpio_backlight - Enable DT probing; tps65217_bl - Bug Fixes - Free resources in error path; pwm_bl - Fix uninitialised variable warning; adp8860_bl, adp8870_bl - Protect unconditional DT look-ups from non-DT platforms; pwm_bl - Fix backlight flicker; pwm_bl -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABAgAGBQJWl21vAAoJEFGvii+H/Hdhke8QAJwYZLvGKSLyWzIKdYV5hSpU 5g/ulX+287oT3HWJ8Jlv6ljko+e3EFTkQB5x0po4YlZKBBiymdrYDdb445zA4K3d HBdHH141U4q4GYTs5r34PTdE2xkj/6CS9Ml4NyqzaRMVE0J60a3qrRxn2+naILBo tq4UmGwq5CJvpOzbkf40AG1/uSMwCrpmNZJMVXLk0JIBWPUzIjD2tvtDOyBsIAPk yccdl7t0YQDCW3XwDbZNlhakx2bIom1Qf00kLOEnpbZsCwzfM0v2HSesEf7o1eke BF9H4oDKp/JUTTawsu369dWsVgjwwfAQXYoYGHqX5CvcNJ9QTm5X/DJQQU19GDEi vh5LR5GlNZKG4u0b1ZTYLIlMwYQmKAJtqUgGcyduuxeQQZ0OrIK97n0XvRlfl0tr dZqO6rNWP6vdELNsy9n6ibJUDmWuBTIRuNG+lYp/eoHCq48ObGJwTZCXWbJJeTOT 8TDuUjSelwCtA+dPQbtuujBKb9l4n3O+RENzYDmEIV0do5WUS3fUSHo8HwDLMB2e Jg1P19ou1QumSmi0I4GZWFetqsf87no6Fbb5aoMiKkp1oaY347OZWgmYhP/AUNqo 1w4mWQEBjDp7r81VwpVyPl0/yhA8e7i05fHG+jJ4z0iamaiWabY6+zHUsnYTeaHN SK2h+JksCwK2BagFkYvJ =a/gc -----END PGP SIGNATURE----- Merge tag 'backlight-for-linus-4.5' of git://git.kernel.org/pub/scm/linux/kernel/git/lee/backlight Pull backlight updates from Lee Jones: Fix-ups: - Take heed of GPIO default-on requests; gpio_backlight - Enable DT probing; tps65217_bl Bug Fixes: - Free resources in error path; pwm_bl - Fix uninitialised variable warning; adp8860_bl, adp8870_bl - Protect unconditional DT look-ups from non-DT platforms; pwm_bl - Fix backlight flicker; pwm_bl * tag 'backlight-for-linus-4.5' of git://git.kernel.org/pub/scm/linux/kernel/git/lee/backlight: backlight: pwm_bl: Free PWM requested by legacy API on error path backlight: adp8860: Fix another uninitialized variable use backlight: gpio-backlight: Use default-on on GPIO request backlight: pwm_bl: Fix broken PWM backlight for non-dt platforms backlight: tps65217_bl: Add MODULE_DEVICE_TABLE backlight: pwm_bl: Avoid backlight flicker when probed from DT backlight: adp88x0: Fix uninitialized variable use
This commit is contained in:
commit
b14bf630be
|
@ -566,11 +566,13 @@ static ssize_t adp8860_bl_ambient_light_level_show(struct device *dev,
|
||||||
|
|
||||||
mutex_lock(&data->lock);
|
mutex_lock(&data->lock);
|
||||||
error = adp8860_read(data->client, ADP8860_PH1LEVL, ®_val);
|
error = adp8860_read(data->client, ADP8860_PH1LEVL, ®_val);
|
||||||
ret_val = reg_val;
|
if (!error) {
|
||||||
error |= adp8860_read(data->client, ADP8860_PH1LEVH, ®_val);
|
ret_val = reg_val;
|
||||||
|
error = adp8860_read(data->client, ADP8860_PH1LEVH, ®_val);
|
||||||
|
}
|
||||||
mutex_unlock(&data->lock);
|
mutex_unlock(&data->lock);
|
||||||
|
|
||||||
if (error < 0)
|
if (error)
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
/* Return 13-bit conversion value for the first light sensor */
|
/* Return 13-bit conversion value for the first light sensor */
|
||||||
|
@ -621,10 +623,12 @@ static ssize_t adp8860_bl_ambient_light_zone_store(struct device *dev,
|
||||||
|
|
||||||
/* Set user supplied ambient light zone */
|
/* Set user supplied ambient light zone */
|
||||||
mutex_lock(&data->lock);
|
mutex_lock(&data->lock);
|
||||||
adp8860_read(data->client, ADP8860_CFGR, ®_val);
|
ret = adp8860_read(data->client, ADP8860_CFGR, ®_val);
|
||||||
reg_val &= ~(CFGR_BLV_MASK << CFGR_BLV_SHIFT);
|
if (!ret) {
|
||||||
reg_val |= (val - 1) << CFGR_BLV_SHIFT;
|
reg_val &= ~(CFGR_BLV_MASK << CFGR_BLV_SHIFT);
|
||||||
adp8860_write(data->client, ADP8860_CFGR, reg_val);
|
reg_val |= (val - 1) << CFGR_BLV_SHIFT;
|
||||||
|
adp8860_write(data->client, ADP8860_CFGR, reg_val);
|
||||||
|
}
|
||||||
mutex_unlock(&data->lock);
|
mutex_unlock(&data->lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -807,10 +807,12 @@ static ssize_t adp8870_bl_ambient_light_zone_store(struct device *dev,
|
||||||
|
|
||||||
/* Set user supplied ambient light zone */
|
/* Set user supplied ambient light zone */
|
||||||
mutex_lock(&data->lock);
|
mutex_lock(&data->lock);
|
||||||
adp8870_read(data->client, ADP8870_CFGR, ®_val);
|
ret = adp8870_read(data->client, ADP8870_CFGR, ®_val);
|
||||||
reg_val &= ~(CFGR_BLV_MASK << CFGR_BLV_SHIFT);
|
if (!ret) {
|
||||||
reg_val |= (val - 1) << CFGR_BLV_SHIFT;
|
reg_val &= ~(CFGR_BLV_MASK << CFGR_BLV_SHIFT);
|
||||||
adp8870_write(data->client, ADP8870_CFGR, reg_val);
|
reg_val |= (val - 1) << CFGR_BLV_SHIFT;
|
||||||
|
adp8870_write(data->client, ADP8870_CFGR, reg_val);
|
||||||
|
}
|
||||||
mutex_unlock(&data->lock);
|
mutex_unlock(&data->lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -89,6 +89,7 @@ static int gpio_backlight_probe(struct platform_device *pdev)
|
||||||
struct backlight_device *bl;
|
struct backlight_device *bl;
|
||||||
struct gpio_backlight *gbl;
|
struct gpio_backlight *gbl;
|
||||||
struct device_node *np = pdev->dev.of_node;
|
struct device_node *np = pdev->dev.of_node;
|
||||||
|
unsigned long flags = GPIOF_DIR_OUT;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (!pdata && !np) {
|
if (!pdata && !np) {
|
||||||
|
@ -114,9 +115,12 @@ static int gpio_backlight_probe(struct platform_device *pdev)
|
||||||
gbl->def_value = pdata->def_value;
|
gbl->def_value = pdata->def_value;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = devm_gpio_request_one(gbl->dev, gbl->gpio, GPIOF_DIR_OUT |
|
if (gbl->active)
|
||||||
(gbl->active ? GPIOF_INIT_LOW
|
flags |= gbl->def_value ? GPIOF_INIT_HIGH : GPIOF_INIT_LOW;
|
||||||
: GPIOF_INIT_HIGH),
|
else
|
||||||
|
flags |= gbl->def_value ? GPIOF_INIT_LOW : GPIOF_INIT_HIGH;
|
||||||
|
|
||||||
|
ret = devm_gpio_request_one(gbl->dev, gbl->gpio, flags,
|
||||||
pdata ? pdata->name : "backlight");
|
pdata ? pdata->name : "backlight");
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
dev_err(&pdev->dev, "unable to request GPIO\n");
|
dev_err(&pdev->dev, "unable to request GPIO\n");
|
||||||
|
|
|
@ -198,7 +198,9 @@ static int pwm_backlight_probe(struct platform_device *pdev)
|
||||||
struct platform_pwm_backlight_data defdata;
|
struct platform_pwm_backlight_data defdata;
|
||||||
struct backlight_properties props;
|
struct backlight_properties props;
|
||||||
struct backlight_device *bl;
|
struct backlight_device *bl;
|
||||||
|
struct device_node *node = pdev->dev.of_node;
|
||||||
struct pwm_bl_data *pb;
|
struct pwm_bl_data *pb;
|
||||||
|
int initial_blank = FB_BLANK_UNBLANK;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (!data) {
|
if (!data) {
|
||||||
|
@ -242,7 +244,7 @@ static int pwm_backlight_probe(struct platform_device *pdev)
|
||||||
pb->enabled = false;
|
pb->enabled = false;
|
||||||
|
|
||||||
pb->enable_gpio = devm_gpiod_get_optional(&pdev->dev, "enable",
|
pb->enable_gpio = devm_gpiod_get_optional(&pdev->dev, "enable",
|
||||||
GPIOD_OUT_HIGH);
|
GPIOD_ASIS);
|
||||||
if (IS_ERR(pb->enable_gpio)) {
|
if (IS_ERR(pb->enable_gpio)) {
|
||||||
ret = PTR_ERR(pb->enable_gpio);
|
ret = PTR_ERR(pb->enable_gpio);
|
||||||
goto err_alloc;
|
goto err_alloc;
|
||||||
|
@ -264,15 +266,32 @@ static int pwm_backlight_probe(struct platform_device *pdev)
|
||||||
pb->enable_gpio = gpio_to_desc(data->enable_gpio);
|
pb->enable_gpio = gpio_to_desc(data->enable_gpio);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (pb->enable_gpio) {
|
||||||
|
/*
|
||||||
|
* If the driver is probed from the device tree and there is a
|
||||||
|
* phandle link pointing to the backlight node, it is safe to
|
||||||
|
* assume that another driver will enable the backlight at the
|
||||||
|
* appropriate time. Therefore, if it is disabled, keep it so.
|
||||||
|
*/
|
||||||
|
if (node && node->phandle &&
|
||||||
|
gpiod_get_direction(pb->enable_gpio) == GPIOF_DIR_OUT &&
|
||||||
|
gpiod_get_value(pb->enable_gpio) == 0)
|
||||||
|
initial_blank = FB_BLANK_POWERDOWN;
|
||||||
|
else
|
||||||
|
gpiod_direction_output(pb->enable_gpio, 1);
|
||||||
|
}
|
||||||
|
|
||||||
pb->power_supply = devm_regulator_get(&pdev->dev, "power");
|
pb->power_supply = devm_regulator_get(&pdev->dev, "power");
|
||||||
if (IS_ERR(pb->power_supply)) {
|
if (IS_ERR(pb->power_supply)) {
|
||||||
ret = PTR_ERR(pb->power_supply);
|
ret = PTR_ERR(pb->power_supply);
|
||||||
goto err_alloc;
|
goto err_alloc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (node && node->phandle && !regulator_is_enabled(pb->power_supply))
|
||||||
|
initial_blank = FB_BLANK_POWERDOWN;
|
||||||
|
|
||||||
pb->pwm = devm_pwm_get(&pdev->dev, NULL);
|
pb->pwm = devm_pwm_get(&pdev->dev, NULL);
|
||||||
if (IS_ERR(pb->pwm) && PTR_ERR(pb->pwm) != -EPROBE_DEFER
|
if (IS_ERR(pb->pwm) && PTR_ERR(pb->pwm) != -EPROBE_DEFER && !node) {
|
||||||
&& !pdev->dev.of_node) {
|
|
||||||
dev_err(&pdev->dev, "unable to request PWM, trying legacy API\n");
|
dev_err(&pdev->dev, "unable to request PWM, trying legacy API\n");
|
||||||
pb->legacy = true;
|
pb->legacy = true;
|
||||||
pb->pwm = pwm_request(data->pwm_id, "pwm-backlight");
|
pb->pwm = pwm_request(data->pwm_id, "pwm-backlight");
|
||||||
|
@ -309,6 +328,8 @@ static int pwm_backlight_probe(struct platform_device *pdev)
|
||||||
if (IS_ERR(bl)) {
|
if (IS_ERR(bl)) {
|
||||||
dev_err(&pdev->dev, "failed to register backlight\n");
|
dev_err(&pdev->dev, "failed to register backlight\n");
|
||||||
ret = PTR_ERR(bl);
|
ret = PTR_ERR(bl);
|
||||||
|
if (pb->legacy)
|
||||||
|
pwm_free(pb->pwm);
|
||||||
goto err_alloc;
|
goto err_alloc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -320,6 +341,7 @@ static int pwm_backlight_probe(struct platform_device *pdev)
|
||||||
}
|
}
|
||||||
|
|
||||||
bl->props.brightness = data->dft_brightness;
|
bl->props.brightness = data->dft_brightness;
|
||||||
|
bl->props.power = initial_blank;
|
||||||
backlight_update_status(bl);
|
backlight_update_status(bl);
|
||||||
|
|
||||||
platform_set_drvdata(pdev, bl);
|
platform_set_drvdata(pdev, bl);
|
||||||
|
|
|
@ -320,10 +320,19 @@ static int tps65217_bl_probe(struct platform_device *pdev)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_OF
|
||||||
|
static const struct of_device_id tps65217_bl_of_match[] = {
|
||||||
|
{ .compatible = "ti,tps65217-bl", },
|
||||||
|
{ /* sentinel */ },
|
||||||
|
};
|
||||||
|
MODULE_DEVICE_TABLE(of, tps65217_bl_of_match);
|
||||||
|
#endif
|
||||||
|
|
||||||
static struct platform_driver tps65217_bl_driver = {
|
static struct platform_driver tps65217_bl_driver = {
|
||||||
.probe = tps65217_bl_probe,
|
.probe = tps65217_bl_probe,
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = "tps65217-bl",
|
.name = "tps65217-bl",
|
||||||
|
.of_match_table = of_match_ptr(tps65217_bl_of_match),
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue