diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2022-08-06 10:33:34 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2022-08-06 10:33:34 -0700 |
commit | 75b9fcb530edc9731bd539353ec7ddb6c8366a25 (patch) | |
tree | 30d3456366284fc7badddea78784a4240dc73b7d /drivers/video | |
parent | 613b2a82f2e06fc5f75c2921e9908adfa7cb9024 (diff) | |
parent | fe201f6fa4cf96749b0a6b6a61b33b6a82de4e49 (diff) |
Merge tag 'backlight-next-5.20' of git://git.kernel.org/pub/scm/linux/kernel/git/lee/backlight
Pull backlight updates from Lee Jones:
"Core Framework:
- Change maintainer email address
Fix-ups:
- Obtain OCP level from Device Tree; rt4831-backlight
- DT fix-ups/conversions; richtek,rt4831-backlight
- Remove unused code / functionatlity; platform_lcd
- Switch to atomic PWM API; lp855x_bl
* tag 'backlight-next-5.20' of git://git.kernel.org/pub/scm/linux/kernel/git/lee/backlight:
MAINTAINERS: Use Lee Jones' kernel.org address for Backlight submissions
backlight: lp855x: Switch to atomic PWM API
dt-bindings: backlight: Update Lee Jones' email address
Revert "drivers/video/backlight/platform_lcd.c: add support for device tree based probe"
backlight: rt4831: Apply ocp level from devicetree
dt-bindings: backlight: rt4831: Add the new ocp level property
Diffstat (limited to 'drivers/video')
-rw-r--r-- | drivers/video/backlight/lp855x_bl.c | 21 | ||||
-rw-r--r-- | drivers/video/backlight/platform_lcd.c | 10 | ||||
-rw-r--r-- | drivers/video/backlight/rt4831-backlight.c | 33 |
3 files changed, 41 insertions, 23 deletions
diff --git a/drivers/video/backlight/lp855x_bl.c b/drivers/video/backlight/lp855x_bl.c index 2b9e2bbbb03e..fc02c5c16055 100644 --- a/drivers/video/backlight/lp855x_bl.c +++ b/drivers/video/backlight/lp855x_bl.c @@ -218,9 +218,8 @@ err: static void lp855x_pwm_ctrl(struct lp855x *lp, int br, int max_br) { - unsigned int period = lp->pdata->period_ns; - unsigned int duty = br * period / max_br; struct pwm_device *pwm; + struct pwm_state state; /* request pwm device with the consumer name */ if (!lp->pwm) { @@ -230,18 +229,16 @@ static void lp855x_pwm_ctrl(struct lp855x *lp, int br, int max_br) lp->pwm = pwm; - /* - * FIXME: pwm_apply_args() should be removed when switching to - * the atomic PWM API. - */ - pwm_apply_args(pwm); + pwm_init_state(lp->pwm, &state); + } else { + pwm_get_state(lp->pwm, &state); } - pwm_config(lp->pwm, duty, period); - if (duty) - pwm_enable(lp->pwm); - else - pwm_disable(lp->pwm); + state.period = lp->pdata->period_ns; + state.duty_cycle = div_u64(br * state.period, max_br); + state.enabled = state.duty_cycle; + + pwm_apply_state(lp->pwm, &state); } static int lp855x_bl_update_status(struct backlight_device *bl) diff --git a/drivers/video/backlight/platform_lcd.c b/drivers/video/backlight/platform_lcd.c index b2bfbf070200..dc37494baf42 100644 --- a/drivers/video/backlight/platform_lcd.c +++ b/drivers/video/backlight/platform_lcd.c @@ -12,7 +12,6 @@ #include <linux/fb.h> #include <linux/backlight.h> #include <linux/lcd.h> -#include <linux/of.h> #include <linux/slab.h> #include <video/platform_lcd.h> @@ -133,19 +132,10 @@ static int platform_lcd_resume(struct device *dev) static SIMPLE_DEV_PM_OPS(platform_lcd_pm_ops, platform_lcd_suspend, platform_lcd_resume); -#ifdef CONFIG_OF -static const struct of_device_id platform_lcd_of_match[] = { - { .compatible = "platform-lcd" }, - {}, -}; -MODULE_DEVICE_TABLE(of, platform_lcd_of_match); -#endif - static struct platform_driver platform_lcd_driver = { .driver = { .name = "platform-lcd", .pm = &platform_lcd_pm_ops, - .of_match_table = of_match_ptr(platform_lcd_of_match), }, .probe = platform_lcd_probe, }; diff --git a/drivers/video/backlight/rt4831-backlight.c b/drivers/video/backlight/rt4831-backlight.c index 42155c7d2db1..eb8c59e8713f 100644 --- a/drivers/video/backlight/rt4831-backlight.c +++ b/drivers/video/backlight/rt4831-backlight.c @@ -12,6 +12,7 @@ #define RT4831_REG_BLCFG 0x02 #define RT4831_REG_BLDIML 0x04 #define RT4831_REG_ENABLE 0x08 +#define RT4831_REG_BLOPT2 0x11 #define RT4831_BLMAX_BRIGHTNESS 2048 @@ -23,6 +24,11 @@ #define RT4831_BLDIML_MASK GENMASK(2, 0) #define RT4831_BLDIMH_MASK GENMASK(10, 3) #define RT4831_BLDIMH_SHIFT 3 +#define RT4831_BLOCP_MASK GENMASK(1, 0) + +#define RT4831_BLOCP_MINUA 900000 +#define RT4831_BLOCP_MAXUA 1800000 +#define RT4831_BLOCP_STEPUA 300000 struct rt4831_priv { struct device *dev; @@ -85,7 +91,7 @@ static int rt4831_parse_backlight_properties(struct rt4831_priv *priv, { struct device *dev = priv->dev; u8 propval; - u32 brightness; + u32 brightness, ocp_uA; unsigned int val = 0; int ret; @@ -120,6 +126,31 @@ static int rt4831_parse_backlight_properties(struct rt4831_priv *priv, if (ret) return ret; + /* + * This OCP level is used to protect and limit the inductor current. + * If inductor peak current reach the level, low-side MOSFET will be + * turned off. Meanwhile, the output channel current may be limited. + * To match the configured channel current, the inductor chosen must + * be higher than the OCP level. + * + * Not like the OVP level, the default 21V can be used in the most + * application. But if the chosen OCP level is smaller than needed, + * it will also affect the backlight channel output current to be + * smaller than the register setting. + */ + ret = device_property_read_u32(dev, "richtek,bled-ocp-microamp", + &ocp_uA); + if (!ret) { + ocp_uA = clamp_val(ocp_uA, RT4831_BLOCP_MINUA, + RT4831_BLOCP_MAXUA); + val = DIV_ROUND_UP(ocp_uA - RT4831_BLOCP_MINUA, + RT4831_BLOCP_STEPUA); + ret = regmap_update_bits(priv->regmap, RT4831_REG_BLOPT2, + RT4831_BLOCP_MASK, val); + if (ret) + return ret; + } + ret = device_property_read_u8(dev, "richtek,channel-use", &propval); if (ret) { dev_err(dev, "richtek,channel-use DT property missing\n"); |