From fe009175ae3ec3724c1414440e22a1d32d806ec5 Mon Sep 17 00:00:00 2001 From: Milo Kim Date: Mon, 20 Jul 2015 15:45:38 +0900 Subject: [PATCH 1/5] backlight: lp855x: Use private data for regulator control LP855x backlight device can be enabled by external VDD input. The 'supply' data is used for this purpose. It's kind of private data which runs internally, so there is no reason to expose to the platform data. And devm_regulator_get() is moved from _parse_dt() to _probe(). Regulator consumer(lp855x) can control regulator not only from DT but also from platform data configuration in a source file such like board-*.c. Signed-off-by: Milo Kim Acked-by: Sean Paul Acked-by: Jingoo Han Signed-off-by: Lee Jones --- drivers/video/backlight/lp855x_bl.c | 23 ++++++++++++----------- include/linux/platform_data/lp855x.h | 2 -- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/drivers/video/backlight/lp855x_bl.c b/drivers/video/backlight/lp855x_bl.c index 88116b493f3b..f88df9ec08d0 100644 --- a/drivers/video/backlight/lp855x_bl.c +++ b/drivers/video/backlight/lp855x_bl.c @@ -73,6 +73,7 @@ struct lp855x { struct device *dev; struct lp855x_platform_data *pdata; struct pwm_device *pwm; + struct regulator *supply; /* regulator for VDD input */ }; static int lp855x_write_byte(struct lp855x *lp, u8 reg, u8 data) @@ -378,13 +379,6 @@ static int lp855x_parse_dt(struct lp855x *lp) pdata->rom_data = &rom[0]; } - pdata->supply = devm_regulator_get(dev, "power"); - if (IS_ERR(pdata->supply)) { - if (PTR_ERR(pdata->supply) == -EPROBE_DEFER) - return -EPROBE_DEFER; - pdata->supply = NULL; - } - lp->pdata = pdata; return 0; @@ -425,8 +419,15 @@ static int lp855x_probe(struct i2c_client *cl, const struct i2c_device_id *id) else lp->mode = REGISTER_BASED; - if (lp->pdata->supply) { - ret = regulator_enable(lp->pdata->supply); + lp->supply = devm_regulator_get(lp->dev, "power"); + if (IS_ERR(lp->supply)) { + if (PTR_ERR(lp->supply) == -EPROBE_DEFER) + return -EPROBE_DEFER; + lp->supply = NULL; + } + + if (lp->supply) { + ret = regulator_enable(lp->supply); if (ret < 0) { dev_err(&cl->dev, "failed to enable supply: %d\n", ret); return ret; @@ -464,8 +465,8 @@ static int lp855x_remove(struct i2c_client *cl) lp->bl->props.brightness = 0; backlight_update_status(lp->bl); - if (lp->pdata->supply) - regulator_disable(lp->pdata->supply); + if (lp->supply) + regulator_disable(lp->supply); sysfs_remove_group(&lp->dev->kobj, &lp855x_attr_group); return 0; diff --git a/include/linux/platform_data/lp855x.h b/include/linux/platform_data/lp855x.h index 9c7fd1efe495..1b2ba24e4e03 100644 --- a/include/linux/platform_data/lp855x.h +++ b/include/linux/platform_data/lp855x.h @@ -136,7 +136,6 @@ struct lp855x_rom_data { Only valid when mode is PWM_BASED. * @size_program : total size of lp855x_rom_data * @rom_data : list of new eeprom/eprom registers - * @supply : regulator that supplies 3V input */ struct lp855x_platform_data { const char *name; @@ -145,7 +144,6 @@ struct lp855x_platform_data { unsigned int period_ns; int size_program; struct lp855x_rom_data *rom_data; - struct regulator *supply; }; #endif From 7ddbc2423c3301280b883bbb04b998203f30312c Mon Sep 17 00:00:00 2001 From: Bjorn Andersson Date: Tue, 21 Jul 2015 17:44:49 -0700 Subject: [PATCH 2/5] backlight: pm8941-wled: Move PM8941 WLED driver to backlight The Qualcomm PM8941 WLED block is used for backlight and should therefor be in the backlight framework and not in the LED framework. This moves the driver and adapts to the backlight api instead. Signed-off-by: Bjorn Andersson Tested-by: Rob Clark Acked-by: Jacek Anaszewski Acked-by: Jingoo Han Signed-off-by: Lee Jones --- .../backlight/pm8941-wled.txt} | 5 +- drivers/leds/Kconfig | 8 --- drivers/leds/Makefile | 1 - drivers/video/backlight/Kconfig | 7 +++ drivers/video/backlight/Makefile | 1 + .../backlight/pm8941-wled.c} | 60 ++++++++----------- 6 files changed, 35 insertions(+), 47 deletions(-) rename Documentation/devicetree/bindings/{leds/leds-pm8941-wled.txt => video/backlight/pm8941-wled.txt} (84%) rename drivers/{leds/leds-pm8941-wled.c => video/backlight/pm8941-wled.c} (90%) diff --git a/Documentation/devicetree/bindings/leds/leds-pm8941-wled.txt b/Documentation/devicetree/bindings/video/backlight/pm8941-wled.txt similarity index 84% rename from Documentation/devicetree/bindings/leds/leds-pm8941-wled.txt rename to Documentation/devicetree/bindings/video/backlight/pm8941-wled.txt index a85a964d61f5..424f8444a6cd 100644 --- a/Documentation/devicetree/bindings/leds/leds-pm8941-wled.txt +++ b/Documentation/devicetree/bindings/video/backlight/pm8941-wled.txt @@ -5,10 +5,7 @@ Required properties: - reg: slave address Optional properties: -- label: The label for this led - See Documentation/devicetree/bindings/leds/common.txt -- linux,default-trigger: Default trigger assigned to the LED - See Documentation/devicetree/bindings/leds/common.txt +- label: The name of the backlight device - qcom,cs-out: bool; enable current sink output - qcom,cabc: bool; enable content adaptive backlight control - qcom,ext-gen: bool; use externally generated modulator signal to dim diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig index 9ad35f72ab4c..b8d4b965ca2a 100644 --- a/drivers/leds/Kconfig +++ b/drivers/leds/Kconfig @@ -578,14 +578,6 @@ config LEDS_VERSATILE This option enabled support for the LEDs on the ARM Versatile and RealView boards. Say Y to enabled these. -config LEDS_PM8941_WLED - tristate "LED support for the Qualcomm PM8941 WLED block" - depends on LEDS_CLASS - select REGMAP - help - This option enables support for the 'White' LED block - on Qualcomm PM8941 PMICs. - comment "LED Triggers" source "drivers/leds/trigger/Kconfig" diff --git a/drivers/leds/Makefile b/drivers/leds/Makefile index 8d6a24a2f513..abe96d960ebe 100644 --- a/drivers/leds/Makefile +++ b/drivers/leds/Makefile @@ -63,7 +63,6 @@ obj-$(CONFIG_LEDS_BLINKM) += leds-blinkm.o obj-$(CONFIG_LEDS_SYSCON) += leds-syscon.o obj-$(CONFIG_LEDS_VERSATILE) += leds-versatile.o obj-$(CONFIG_LEDS_MENF21BMC) += leds-menf21bmc.o -obj-$(CONFIG_LEDS_PM8941_WLED) += leds-pm8941-wled.o obj-$(CONFIG_LEDS_KTD2692) += leds-ktd2692.o # LED SPI Drivers diff --git a/drivers/video/backlight/Kconfig b/drivers/video/backlight/Kconfig index 0505b796d743..5ffa4b4e26c0 100644 --- a/drivers/video/backlight/Kconfig +++ b/drivers/video/backlight/Kconfig @@ -299,6 +299,13 @@ config BACKLIGHT_TOSA If you have an Sharp SL-6000 Zaurus say Y to enable a driver for its backlight +config BACKLIGHT_PM8941_WLED + tristate "Qualcomm PM8941 WLED Driver" + select REGMAP + help + If you have the Qualcomm PM8941, say Y to enable a driver for the + WLED block. + config BACKLIGHT_SAHARA tristate "Tabletkiosk Sahara Touch-iT Backlight Driver" depends on X86 diff --git a/drivers/video/backlight/Makefile b/drivers/video/backlight/Makefile index d67073f9d421..16ec534cff30 100644 --- a/drivers/video/backlight/Makefile +++ b/drivers/video/backlight/Makefile @@ -48,6 +48,7 @@ obj-$(CONFIG_BACKLIGHT_OMAP1) += omap1_bl.o obj-$(CONFIG_BACKLIGHT_OT200) += ot200_bl.o obj-$(CONFIG_BACKLIGHT_PANDORA) += pandora_bl.o obj-$(CONFIG_BACKLIGHT_PCF50633) += pcf50633-backlight.o +obj-$(CONFIG_BACKLIGHT_PM8941_WLED) += pm8941-wled.o obj-$(CONFIG_BACKLIGHT_PWM) += pwm_bl.o obj-$(CONFIG_BACKLIGHT_SAHARA) += kb3886_bl.o obj-$(CONFIG_BACKLIGHT_SKY81452) += sky81452-backlight.o diff --git a/drivers/leds/leds-pm8941-wled.c b/drivers/video/backlight/pm8941-wled.c similarity index 90% rename from drivers/leds/leds-pm8941-wled.c rename to drivers/video/backlight/pm8941-wled.c index bf64a593fbf1..c704c3236034 100644 --- a/drivers/leds/leds-pm8941-wled.c +++ b/drivers/video/backlight/pm8941-wled.c @@ -11,7 +11,7 @@ */ #include -#include +#include #include #include #include @@ -76,30 +76,29 @@ struct pm8941_wled_config { }; struct pm8941_wled { + const char *name; struct regmap *regmap; u16 addr; - struct led_classdev cdev; - struct pm8941_wled_config cfg; }; -static int pm8941_wled_set(struct led_classdev *cdev, - enum led_brightness value) +static int pm8941_wled_update_status(struct backlight_device *bl) { - struct pm8941_wled *wled; + struct pm8941_wled *wled = bl_get_data(bl); + u16 val = bl->props.brightness; u8 ctrl = 0; - u16 val; int rc; int i; - wled = container_of(cdev, struct pm8941_wled, cdev); + if (bl->props.power != FB_BLANK_UNBLANK || + bl->props.fb_blank != FB_BLANK_UNBLANK || + bl->props.state & BL_CORE_FBBLANK) + val = 0; - if (value != 0) + if (val != 0) ctrl = PM8941_WLED_REG_MOD_EN_BIT; - val = value * PM8941_WLED_REG_VAL_MAX / LED_FULL; - rc = regmap_update_bits(wled->regmap, wled->addr + PM8941_WLED_REG_MOD_EN, PM8941_WLED_REG_MOD_EN_MASK, ctrl); @@ -128,16 +127,6 @@ static int pm8941_wled_set(struct led_classdev *cdev, return rc; } -static void pm8941_wled_set_brightness(struct led_classdev *cdev, - enum led_brightness value) -{ - if (pm8941_wled_set(cdev, value)) { - dev_err(cdev->dev, "Unable to set brightness\n"); - return; - } - cdev->brightness = value; -} - static int pm8941_wled_setup(struct pm8941_wled *wled) { int rc; @@ -336,12 +325,9 @@ static int pm8941_wled_configure(struct pm8941_wled *wled, struct device *dev) } wled->addr = val; - rc = of_property_read_string(dev->of_node, "label", &wled->cdev.name); + rc = of_property_read_string(dev->of_node, "label", &wled->name); if (rc) - wled->cdev.name = dev->of_node->name; - - wled->cdev.default_trigger = of_get_property(dev->of_node, - "linux,default-trigger", NULL); + wled->name = dev->of_node->name; *cfg = pm8941_wled_config_defaults; for (i = 0; i < ARRAY_SIZE(u32_opts); ++i) { @@ -377,8 +363,14 @@ static int pm8941_wled_configure(struct pm8941_wled *wled, struct device *dev) return 0; } +static const struct backlight_ops pm8941_wled_ops = { + .update_status = pm8941_wled_update_status, +}; + static int pm8941_wled_probe(struct platform_device *pdev) { + struct backlight_properties props; + struct backlight_device *bl; struct pm8941_wled *wled; struct regmap *regmap; int rc; @@ -403,13 +395,14 @@ static int pm8941_wled_probe(struct platform_device *pdev) if (rc) return rc; - wled->cdev.brightness_set = pm8941_wled_set_brightness; - - rc = devm_led_classdev_register(&pdev->dev, &wled->cdev); - if (rc) - return rc; - - platform_set_drvdata(pdev, wled); + memset(&props, 0, sizeof(struct backlight_properties)); + props.type = BACKLIGHT_RAW; + props.max_brightness = PM8941_WLED_REG_VAL_MAX; + bl = devm_backlight_device_register(&pdev->dev, wled->name, + &pdev->dev, wled, + &pm8941_wled_ops, &props); + if (IS_ERR(bl)) + return PTR_ERR(bl); return 0; }; @@ -432,4 +425,3 @@ module_platform_driver(pm8941_wled_driver); MODULE_DESCRIPTION("pm8941 wled driver"); MODULE_LICENSE("GPL v2"); -MODULE_ALIAS("platform:pm8941-wled"); From 047ffbb27115b57759767145803b752518399d90 Mon Sep 17 00:00:00 2001 From: Axel Lin Date: Mon, 17 Aug 2015 15:59:17 +0800 Subject: [PATCH 3/5] backlight: sky81452: Remove unneeded use of IS_ERR_VALUE() macro IS_ERR_VALUE() makes sense only *if* there could be valid values in negative error range. Signed-off-by: Axel Lin Signed-off-by: Lee Jones --- drivers/video/backlight/sky81452-backlight.c | 26 ++++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/drivers/video/backlight/sky81452-backlight.c b/drivers/video/backlight/sky81452-backlight.c index 052fa1bac03d..d414c7a3acf5 100644 --- a/drivers/video/backlight/sky81452-backlight.c +++ b/drivers/video/backlight/sky81452-backlight.c @@ -65,7 +65,7 @@ static int sky81452_bl_update_status(struct backlight_device *bd) if (brightness > 0) { ret = regmap_write(regmap, SKY81452_REG0, brightness - 1); - if (IS_ERR_VALUE(ret)) + if (ret < 0) return ret; return regmap_update_bits(regmap, SKY81452_REG1, SKY81452_EN, @@ -87,12 +87,12 @@ static ssize_t sky81452_bl_store_enable(struct device *dev, int ret; ret = kstrtoul(buf, 16, &value); - if (IS_ERR_VALUE(ret)) + if (ret < 0) return ret; ret = regmap_update_bits(regmap, SKY81452_REG1, SKY81452_EN, value << CTZ(SKY81452_EN)); - if (IS_ERR_VALUE(ret)) + if (ret < 0) return ret; return count; @@ -108,7 +108,7 @@ static ssize_t sky81452_bl_show_open_short(struct device *dev, reg = !strcmp(attr->attr.name, "open") ? SKY81452_REG5 : SKY81452_REG4; ret = regmap_read(regmap, reg, &value); - if (IS_ERR_VALUE(ret)) + if (ret < 0) return ret; if (value & SKY81452_SHRT) { @@ -136,7 +136,7 @@ static ssize_t sky81452_bl_show_fault(struct device *dev, int ret; ret = regmap_read(regmap, SKY81452_REG4, &value); - if (IS_ERR_VALUE(ret)) + if (ret < 0) return ret; *buf = 0; @@ -196,7 +196,7 @@ static struct sky81452_bl_platform_data *sky81452_bl_parse_dt( pdata->gpio_enable = of_get_gpio(np, 0); ret = of_property_count_u32_elems(np, "led-sources"); - if (IS_ERR_VALUE(ret)) { + if (ret < 0) { pdata->enable = SKY81452_EN >> CTZ(SKY81452_EN); } else { num_entry = ret; @@ -205,7 +205,7 @@ static struct sky81452_bl_platform_data *sky81452_bl_parse_dt( ret = of_property_read_u32_array(np, "led-sources", sources, num_entry); - if (IS_ERR_VALUE(ret)) { + if (ret < 0) { dev_err(dev, "led-sources node is invalid.\n"); return ERR_PTR(-EINVAL); } @@ -218,12 +218,12 @@ static struct sky81452_bl_platform_data *sky81452_bl_parse_dt( ret = of_property_read_u32(np, "skyworks,short-detection-threshold-volt", &pdata->short_detection_threshold); - if (IS_ERR_VALUE(ret)) + if (ret < 0) pdata->short_detection_threshold = 7; ret = of_property_read_u32(np, "skyworks,current-limit-mA", &pdata->boost_current_limit); - if (IS_ERR_VALUE(ret)) + if (ret < 0) pdata->boost_current_limit = 2750; of_node_put(np); @@ -278,14 +278,14 @@ static int sky81452_bl_probe(struct platform_device *pdev) if (gpio_is_valid(pdata->gpio_enable)) { ret = devm_gpio_request_one(dev, pdata->gpio_enable, GPIOF_OUT_INIT_HIGH, "sky81452-en"); - if (IS_ERR_VALUE(ret)) { + if (ret < 0) { dev_err(dev, "failed to request GPIO. err=%d\n", ret); return ret; } } ret = sky81452_bl_init_device(regmap, pdata); - if (IS_ERR_VALUE(ret)) { + if (ret < 0) { dev_err(dev, "failed to initialize. err=%d\n", ret); return ret; } @@ -302,8 +302,8 @@ static int sky81452_bl_probe(struct platform_device *pdev) platform_set_drvdata(pdev, bd); - ret = sysfs_create_group(&bd->dev.kobj, &sky81452_bl_attr_group); - if (IS_ERR_VALUE(ret)) { + ret = sysfs_create_group(&bd->dev.kobj, &sky81452_bl_attr_group); + if (ret < 0) { dev_err(dev, "failed to create attribute. err=%d\n", ret); return ret; } From 85463d8ed1ffae0eb0bd070e400f33918a6696ef Mon Sep 17 00:00:00 2001 From: Markus Elfring Date: Wed, 1 Jul 2015 12:08:31 +0200 Subject: [PATCH 4/5] backlight: lp8788_bl: Delete a check before backlight_device_unregister() The backlight_device_unregister() function tests whether its argument is NULL and then returns immediately. Thus the test around the call is not needed. This issue was detected by using the Coccinelle software. Signed-off-by: Markus Elfring Acked-by: Jingoo Han Signed-off-by: Lee Jones --- drivers/video/backlight/lp8788_bl.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/drivers/video/backlight/lp8788_bl.c b/drivers/video/backlight/lp8788_bl.c index e418d5b1aa55..5d583d7a517b 100644 --- a/drivers/video/backlight/lp8788_bl.c +++ b/drivers/video/backlight/lp8788_bl.c @@ -221,8 +221,7 @@ static void lp8788_backlight_unregister(struct lp8788_bl *bl) { struct backlight_device *bl_dev = bl->bl_dev; - if (bl_dev) - backlight_device_unregister(bl_dev); + backlight_device_unregister(bl_dev); } static ssize_t lp8788_get_bl_ctl_mode(struct device *dev, From 13d20b3b618adc43168b034792eec57063b5ec6f Mon Sep 17 00:00:00 2001 From: Javier Martinez Canillas Date: Tue, 25 Aug 2015 08:31:12 +0200 Subject: [PATCH 5/5] backlight: tosa: Export I2C module alias information The I2C core always reports the MODALIAS uevent as "i2c:" regardless of the mechanism that was used to register the device (i.e: OF or board code) and the table that is used later to match the driver with the device (i.e: I2C id table or OF match table). So drivers needs to export the I2C id table and this be built into the module or udev won't have the necessary information to autoload the needed driver module when the device is added. Signed-off-by: Javier Martinez Canillas Signed-off-by: Lee Jones --- drivers/video/backlight/tosa_bl.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/video/backlight/tosa_bl.c b/drivers/video/backlight/tosa_bl.c index 3ad676558c80..83742d806391 100644 --- a/drivers/video/backlight/tosa_bl.c +++ b/drivers/video/backlight/tosa_bl.c @@ -158,6 +158,7 @@ static const struct i2c_device_id tosa_bl_id[] = { { "tosa-bl", 0 }, { }, }; +MODULE_DEVICE_TABLE(i2c, tosa_bl_id); static struct i2c_driver tosa_bl_driver = { .driver = {