Commit 670c039d authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'backlight-for-linus-4.3' of git://git.kernel.org/pub/scm/linux/kernel/git/lee/backlight

Pull backlight updates from Lee Jones:
 - Stop using LP855X Platform Data to control regulators
 - Move PWM8941 WLED driver into Backlight
 - Remove invalid use of IS_ERR_VALUE() macro
 - Remove duplicate check for NULL data before unregistering
 - Export I2C Device ID structure

* tag 'backlight-for-linus-4.3' of git://git.kernel.org/pub/scm/linux/kernel/git/lee/backlight:
  backlight: tosa: Export I2C module alias information
  backlight: lp8788_bl: Delete a check before backlight_device_unregister()
  backlight: sky81452: Remove unneeded use of IS_ERR_VALUE() macro
  backlight: pm8941-wled: Move PM8941 WLED driver to backlight
  backlight: lp855x: Use private data for regulator control
parents 8bd8fd0a 13d20b3b
...@@ -5,10 +5,7 @@ Required properties: ...@@ -5,10 +5,7 @@ Required properties:
- reg: slave address - reg: slave address
Optional properties: Optional properties:
- label: The label for this led - label: The name of the backlight device
See Documentation/devicetree/bindings/leds/common.txt
- linux,default-trigger: Default trigger assigned to the LED
See Documentation/devicetree/bindings/leds/common.txt
- qcom,cs-out: bool; enable current sink output - qcom,cs-out: bool; enable current sink output
- qcom,cabc: bool; enable content adaptive backlight control - qcom,cabc: bool; enable content adaptive backlight control
- qcom,ext-gen: bool; use externally generated modulator signal to dim - qcom,ext-gen: bool; use externally generated modulator signal to dim
......
...@@ -594,14 +594,6 @@ config LEDS_VERSATILE ...@@ -594,14 +594,6 @@ config LEDS_VERSATILE
This option enabled support for the LEDs on the ARM Versatile This option enabled support for the LEDs on the ARM Versatile
and RealView boards. Say Y to enabled these. 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" comment "LED Triggers"
source "drivers/leds/trigger/Kconfig" source "drivers/leds/trigger/Kconfig"
......
...@@ -63,7 +63,6 @@ obj-$(CONFIG_LEDS_BLINKM) += leds-blinkm.o ...@@ -63,7 +63,6 @@ obj-$(CONFIG_LEDS_BLINKM) += leds-blinkm.o
obj-$(CONFIG_LEDS_SYSCON) += leds-syscon.o obj-$(CONFIG_LEDS_SYSCON) += leds-syscon.o
obj-$(CONFIG_LEDS_VERSATILE) += leds-versatile.o obj-$(CONFIG_LEDS_VERSATILE) += leds-versatile.o
obj-$(CONFIG_LEDS_MENF21BMC) += leds-menf21bmc.o obj-$(CONFIG_LEDS_MENF21BMC) += leds-menf21bmc.o
obj-$(CONFIG_LEDS_PM8941_WLED) += leds-pm8941-wled.o
obj-$(CONFIG_LEDS_KTD2692) += leds-ktd2692.o obj-$(CONFIG_LEDS_KTD2692) += leds-ktd2692.o
obj-$(CONFIG_LEDS_POWERNV) += leds-powernv.o obj-$(CONFIG_LEDS_POWERNV) += leds-powernv.o
......
...@@ -299,6 +299,13 @@ config BACKLIGHT_TOSA ...@@ -299,6 +299,13 @@ config BACKLIGHT_TOSA
If you have an Sharp SL-6000 Zaurus say Y to enable a driver If you have an Sharp SL-6000 Zaurus say Y to enable a driver
for its backlight 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 config BACKLIGHT_SAHARA
tristate "Tabletkiosk Sahara Touch-iT Backlight Driver" tristate "Tabletkiosk Sahara Touch-iT Backlight Driver"
depends on X86 depends on X86
......
...@@ -48,6 +48,7 @@ obj-$(CONFIG_BACKLIGHT_OMAP1) += omap1_bl.o ...@@ -48,6 +48,7 @@ obj-$(CONFIG_BACKLIGHT_OMAP1) += omap1_bl.o
obj-$(CONFIG_BACKLIGHT_OT200) += ot200_bl.o obj-$(CONFIG_BACKLIGHT_OT200) += ot200_bl.o
obj-$(CONFIG_BACKLIGHT_PANDORA) += pandora_bl.o obj-$(CONFIG_BACKLIGHT_PANDORA) += pandora_bl.o
obj-$(CONFIG_BACKLIGHT_PCF50633) += pcf50633-backlight.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_PWM) += pwm_bl.o
obj-$(CONFIG_BACKLIGHT_SAHARA) += kb3886_bl.o obj-$(CONFIG_BACKLIGHT_SAHARA) += kb3886_bl.o
obj-$(CONFIG_BACKLIGHT_SKY81452) += sky81452-backlight.o obj-$(CONFIG_BACKLIGHT_SKY81452) += sky81452-backlight.o
......
...@@ -73,6 +73,7 @@ struct lp855x { ...@@ -73,6 +73,7 @@ struct lp855x {
struct device *dev; struct device *dev;
struct lp855x_platform_data *pdata; struct lp855x_platform_data *pdata;
struct pwm_device *pwm; struct pwm_device *pwm;
struct regulator *supply; /* regulator for VDD input */
}; };
static int lp855x_write_byte(struct lp855x *lp, u8 reg, u8 data) static int lp855x_write_byte(struct lp855x *lp, u8 reg, u8 data)
...@@ -378,13 +379,6 @@ static int lp855x_parse_dt(struct lp855x *lp) ...@@ -378,13 +379,6 @@ static int lp855x_parse_dt(struct lp855x *lp)
pdata->rom_data = &rom[0]; 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; lp->pdata = pdata;
return 0; return 0;
...@@ -425,8 +419,15 @@ static int lp855x_probe(struct i2c_client *cl, const struct i2c_device_id *id) ...@@ -425,8 +419,15 @@ static int lp855x_probe(struct i2c_client *cl, const struct i2c_device_id *id)
else else
lp->mode = REGISTER_BASED; lp->mode = REGISTER_BASED;
if (lp->pdata->supply) { lp->supply = devm_regulator_get(lp->dev, "power");
ret = regulator_enable(lp->pdata->supply); 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) { if (ret < 0) {
dev_err(&cl->dev, "failed to enable supply: %d\n", ret); dev_err(&cl->dev, "failed to enable supply: %d\n", ret);
return ret; return ret;
...@@ -464,8 +465,8 @@ static int lp855x_remove(struct i2c_client *cl) ...@@ -464,8 +465,8 @@ static int lp855x_remove(struct i2c_client *cl)
lp->bl->props.brightness = 0; lp->bl->props.brightness = 0;
backlight_update_status(lp->bl); backlight_update_status(lp->bl);
if (lp->pdata->supply) if (lp->supply)
regulator_disable(lp->pdata->supply); regulator_disable(lp->supply);
sysfs_remove_group(&lp->dev->kobj, &lp855x_attr_group); sysfs_remove_group(&lp->dev->kobj, &lp855x_attr_group);
return 0; return 0;
......
...@@ -221,7 +221,6 @@ static void lp8788_backlight_unregister(struct lp8788_bl *bl) ...@@ -221,7 +221,6 @@ static void lp8788_backlight_unregister(struct lp8788_bl *bl)
{ {
struct backlight_device *bl_dev = bl->bl_dev; struct backlight_device *bl_dev = bl->bl_dev;
if (bl_dev)
backlight_device_unregister(bl_dev); backlight_device_unregister(bl_dev);
} }
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
*/ */
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/leds.h> #include <linux/backlight.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/of.h> #include <linux/of.h>
#include <linux/of_device.h> #include <linux/of_device.h>
...@@ -76,30 +76,29 @@ struct pm8941_wled_config { ...@@ -76,30 +76,29 @@ struct pm8941_wled_config {
}; };
struct pm8941_wled { struct pm8941_wled {
const char *name;
struct regmap *regmap; struct regmap *regmap;
u16 addr; u16 addr;
struct led_classdev cdev;
struct pm8941_wled_config cfg; struct pm8941_wled_config cfg;
}; };
static int pm8941_wled_set(struct led_classdev *cdev, static int pm8941_wled_update_status(struct backlight_device *bl)
enum led_brightness value)
{ {
struct pm8941_wled *wled; struct pm8941_wled *wled = bl_get_data(bl);
u16 val = bl->props.brightness;
u8 ctrl = 0; u8 ctrl = 0;
u16 val;
int rc; int rc;
int i; 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; ctrl = PM8941_WLED_REG_MOD_EN_BIT;
val = value * PM8941_WLED_REG_VAL_MAX / LED_FULL;
rc = regmap_update_bits(wled->regmap, rc = regmap_update_bits(wled->regmap,
wled->addr + PM8941_WLED_REG_MOD_EN, wled->addr + PM8941_WLED_REG_MOD_EN,
PM8941_WLED_REG_MOD_EN_MASK, ctrl); PM8941_WLED_REG_MOD_EN_MASK, ctrl);
...@@ -128,16 +127,6 @@ static int pm8941_wled_set(struct led_classdev *cdev, ...@@ -128,16 +127,6 @@ static int pm8941_wled_set(struct led_classdev *cdev,
return rc; 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) static int pm8941_wled_setup(struct pm8941_wled *wled)
{ {
int rc; int rc;
...@@ -336,12 +325,9 @@ static int pm8941_wled_configure(struct pm8941_wled *wled, struct device *dev) ...@@ -336,12 +325,9 @@ static int pm8941_wled_configure(struct pm8941_wled *wled, struct device *dev)
} }
wled->addr = val; 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) if (rc)
wled->cdev.name = dev->of_node->name; wled->name = dev->of_node->name;
wled->cdev.default_trigger = of_get_property(dev->of_node,
"linux,default-trigger", NULL);
*cfg = pm8941_wled_config_defaults; *cfg = pm8941_wled_config_defaults;
for (i = 0; i < ARRAY_SIZE(u32_opts); ++i) { 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) ...@@ -377,8 +363,14 @@ static int pm8941_wled_configure(struct pm8941_wled *wled, struct device *dev)
return 0; 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) static int pm8941_wled_probe(struct platform_device *pdev)
{ {
struct backlight_properties props;
struct backlight_device *bl;
struct pm8941_wled *wled; struct pm8941_wled *wled;
struct regmap *regmap; struct regmap *regmap;
int rc; int rc;
...@@ -403,13 +395,14 @@ static int pm8941_wled_probe(struct platform_device *pdev) ...@@ -403,13 +395,14 @@ static int pm8941_wled_probe(struct platform_device *pdev)
if (rc) if (rc)
return rc; return rc;
wled->cdev.brightness_set = pm8941_wled_set_brightness; memset(&props, 0, sizeof(struct backlight_properties));
props.type = BACKLIGHT_RAW;
rc = devm_led_classdev_register(&pdev->dev, &wled->cdev); props.max_brightness = PM8941_WLED_REG_VAL_MAX;
if (rc) bl = devm_backlight_device_register(&pdev->dev, wled->name,
return rc; &pdev->dev, wled,
&pm8941_wled_ops, &props);
platform_set_drvdata(pdev, wled); if (IS_ERR(bl))
return PTR_ERR(bl);
return 0; return 0;
}; };
...@@ -432,4 +425,3 @@ module_platform_driver(pm8941_wled_driver); ...@@ -432,4 +425,3 @@ module_platform_driver(pm8941_wled_driver);
MODULE_DESCRIPTION("pm8941 wled driver"); MODULE_DESCRIPTION("pm8941 wled driver");
MODULE_LICENSE("GPL v2"); MODULE_LICENSE("GPL v2");
MODULE_ALIAS("platform:pm8941-wled");
...@@ -65,7 +65,7 @@ static int sky81452_bl_update_status(struct backlight_device *bd) ...@@ -65,7 +65,7 @@ static int sky81452_bl_update_status(struct backlight_device *bd)
if (brightness > 0) { if (brightness > 0) {
ret = regmap_write(regmap, SKY81452_REG0, brightness - 1); ret = regmap_write(regmap, SKY81452_REG0, brightness - 1);
if (IS_ERR_VALUE(ret)) if (ret < 0)
return ret; return ret;
return regmap_update_bits(regmap, SKY81452_REG1, SKY81452_EN, return regmap_update_bits(regmap, SKY81452_REG1, SKY81452_EN,
...@@ -87,12 +87,12 @@ static ssize_t sky81452_bl_store_enable(struct device *dev, ...@@ -87,12 +87,12 @@ static ssize_t sky81452_bl_store_enable(struct device *dev,
int ret; int ret;
ret = kstrtoul(buf, 16, &value); ret = kstrtoul(buf, 16, &value);
if (IS_ERR_VALUE(ret)) if (ret < 0)
return ret; return ret;
ret = regmap_update_bits(regmap, SKY81452_REG1, SKY81452_EN, ret = regmap_update_bits(regmap, SKY81452_REG1, SKY81452_EN,
value << CTZ(SKY81452_EN)); value << CTZ(SKY81452_EN));
if (IS_ERR_VALUE(ret)) if (ret < 0)
return ret; return ret;
return count; return count;
...@@ -108,7 +108,7 @@ static ssize_t sky81452_bl_show_open_short(struct device *dev, ...@@ -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; reg = !strcmp(attr->attr.name, "open") ? SKY81452_REG5 : SKY81452_REG4;
ret = regmap_read(regmap, reg, &value); ret = regmap_read(regmap, reg, &value);
if (IS_ERR_VALUE(ret)) if (ret < 0)
return ret; return ret;
if (value & SKY81452_SHRT) { if (value & SKY81452_SHRT) {
...@@ -136,7 +136,7 @@ static ssize_t sky81452_bl_show_fault(struct device *dev, ...@@ -136,7 +136,7 @@ static ssize_t sky81452_bl_show_fault(struct device *dev,
int ret; int ret;
ret = regmap_read(regmap, SKY81452_REG4, &value); ret = regmap_read(regmap, SKY81452_REG4, &value);
if (IS_ERR_VALUE(ret)) if (ret < 0)
return ret; return ret;
*buf = 0; *buf = 0;
...@@ -196,7 +196,7 @@ static struct sky81452_bl_platform_data *sky81452_bl_parse_dt( ...@@ -196,7 +196,7 @@ static struct sky81452_bl_platform_data *sky81452_bl_parse_dt(
pdata->gpio_enable = of_get_gpio(np, 0); pdata->gpio_enable = of_get_gpio(np, 0);
ret = of_property_count_u32_elems(np, "led-sources"); ret = of_property_count_u32_elems(np, "led-sources");
if (IS_ERR_VALUE(ret)) { if (ret < 0) {
pdata->enable = SKY81452_EN >> CTZ(SKY81452_EN); pdata->enable = SKY81452_EN >> CTZ(SKY81452_EN);
} else { } else {
num_entry = ret; num_entry = ret;
...@@ -205,7 +205,7 @@ static struct sky81452_bl_platform_data *sky81452_bl_parse_dt( ...@@ -205,7 +205,7 @@ static struct sky81452_bl_platform_data *sky81452_bl_parse_dt(
ret = of_property_read_u32_array(np, "led-sources", sources, ret = of_property_read_u32_array(np, "led-sources", sources,
num_entry); num_entry);
if (IS_ERR_VALUE(ret)) { if (ret < 0) {
dev_err(dev, "led-sources node is invalid.\n"); dev_err(dev, "led-sources node is invalid.\n");
return ERR_PTR(-EINVAL); return ERR_PTR(-EINVAL);
} }
...@@ -218,12 +218,12 @@ static struct sky81452_bl_platform_data *sky81452_bl_parse_dt( ...@@ -218,12 +218,12 @@ static struct sky81452_bl_platform_data *sky81452_bl_parse_dt(
ret = of_property_read_u32(np, ret = of_property_read_u32(np,
"skyworks,short-detection-threshold-volt", "skyworks,short-detection-threshold-volt",
&pdata->short_detection_threshold); &pdata->short_detection_threshold);
if (IS_ERR_VALUE(ret)) if (ret < 0)
pdata->short_detection_threshold = 7; pdata->short_detection_threshold = 7;
ret = of_property_read_u32(np, "skyworks,current-limit-mA", ret = of_property_read_u32(np, "skyworks,current-limit-mA",
&pdata->boost_current_limit); &pdata->boost_current_limit);
if (IS_ERR_VALUE(ret)) if (ret < 0)
pdata->boost_current_limit = 2750; pdata->boost_current_limit = 2750;
of_node_put(np); of_node_put(np);
...@@ -278,14 +278,14 @@ static int sky81452_bl_probe(struct platform_device *pdev) ...@@ -278,14 +278,14 @@ static int sky81452_bl_probe(struct platform_device *pdev)
if (gpio_is_valid(pdata->gpio_enable)) { if (gpio_is_valid(pdata->gpio_enable)) {
ret = devm_gpio_request_one(dev, pdata->gpio_enable, ret = devm_gpio_request_one(dev, pdata->gpio_enable,
GPIOF_OUT_INIT_HIGH, "sky81452-en"); 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); dev_err(dev, "failed to request GPIO. err=%d\n", ret);
return ret; return ret;
} }
} }
ret = sky81452_bl_init_device(regmap, pdata); 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); dev_err(dev, "failed to initialize. err=%d\n", ret);
return ret; return ret;
} }
...@@ -303,7 +303,7 @@ static int sky81452_bl_probe(struct platform_device *pdev) ...@@ -303,7 +303,7 @@ static int sky81452_bl_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, bd); platform_set_drvdata(pdev, bd);
ret = sysfs_create_group(&bd->dev.kobj, &sky81452_bl_attr_group); ret = sysfs_create_group(&bd->dev.kobj, &sky81452_bl_attr_group);
if (IS_ERR_VALUE(ret)) { if (ret < 0) {
dev_err(dev, "failed to create attribute. err=%d\n", ret); dev_err(dev, "failed to create attribute. err=%d\n", ret);
return ret; return ret;
} }
......
...@@ -158,6 +158,7 @@ static const struct i2c_device_id tosa_bl_id[] = { ...@@ -158,6 +158,7 @@ static const struct i2c_device_id tosa_bl_id[] = {
{ "tosa-bl", 0 }, { "tosa-bl", 0 },
{ }, { },
}; };
MODULE_DEVICE_TABLE(i2c, tosa_bl_id);
static struct i2c_driver tosa_bl_driver = { static struct i2c_driver tosa_bl_driver = {
.driver = { .driver = {
......
...@@ -136,7 +136,6 @@ struct lp855x_rom_data { ...@@ -136,7 +136,6 @@ struct lp855x_rom_data {
Only valid when mode is PWM_BASED. Only valid when mode is PWM_BASED.
* @size_program : total size of lp855x_rom_data * @size_program : total size of lp855x_rom_data
* @rom_data : list of new eeprom/eprom registers * @rom_data : list of new eeprom/eprom registers
* @supply : regulator that supplies 3V input
*/ */
struct lp855x_platform_data { struct lp855x_platform_data {
const char *name; const char *name;
...@@ -145,7 +144,6 @@ struct lp855x_platform_data { ...@@ -145,7 +144,6 @@ struct lp855x_platform_data {
unsigned int period_ns; unsigned int period_ns;
int size_program; int size_program;
struct lp855x_rom_data *rom_data; struct lp855x_rom_data *rom_data;
struct regulator *supply;
}; };
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment