diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-04-10 11:52:35 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-04-10 11:52:35 -0400 |
| commit | edf2377c4776ce20ae990f27f0248e88a37e25c4 (patch) | |
| tree | 2072ff0353aac87a46fdd0e79fb6a3e666720ee0 | |
| parent | 39de65aa2c3eee901db020a4f1396998e09602a3 (diff) | |
| parent | f1740e4cffede3e919a3511bf4e5113d642f09ec (diff) | |
Merge tag 'backlight-for-linus-3.15' of git://git.kernel.org/pub/scm/linux/kernel/git/lee/backlight
Pull backlight changes from Lee Jones:
- core: call put_device() instead of kfree()
- gpio-backlight: add DT support
- lm3639_bl driver: use managed resources
* tag 'backlight-for-linus-3.15' of git://git.kernel.org/pub/scm/linux/kernel/git/lee/backlight:
backlight: lm3639: Use devm_backlight_device_register()
backlight: gpio-backlight: Add DT support
backlight: core: Replace kfree with put_device
| -rw-r--r-- | Documentation/devicetree/bindings/video/backlight/gpio-backlight.txt | 16 | ||||
| -rw-r--r-- | drivers/video/backlight/backlight.c | 2 | ||||
| -rw-r--r-- | drivers/video/backlight/gpio_backlight.c | 58 | ||||
| -rw-r--r-- | drivers/video/backlight/lm3639_bl.c | 17 |
4 files changed, 75 insertions, 18 deletions
diff --git a/Documentation/devicetree/bindings/video/backlight/gpio-backlight.txt b/Documentation/devicetree/bindings/video/backlight/gpio-backlight.txt new file mode 100644 index 000000000000..321be6640533 --- /dev/null +++ b/Documentation/devicetree/bindings/video/backlight/gpio-backlight.txt | |||
| @@ -0,0 +1,16 @@ | |||
| 1 | gpio-backlight bindings | ||
| 2 | |||
| 3 | Required properties: | ||
| 4 | - compatible: "gpio-backlight" | ||
| 5 | - gpios: describes the gpio that is used for enabling/disabling the backlight. | ||
| 6 | refer to bindings/gpio/gpio.txt for more details. | ||
| 7 | |||
| 8 | Optional properties: | ||
| 9 | - default-on: enable the backlight at boot. | ||
| 10 | |||
| 11 | Example: | ||
| 12 | backlight { | ||
| 13 | compatible = "gpio-backlight"; | ||
| 14 | gpios = <&gpio3 4 GPIO_ACTIVE_HIGH>; | ||
| 15 | default-on; | ||
| 16 | }; | ||
diff --git a/drivers/video/backlight/backlight.c b/drivers/video/backlight/backlight.c index 27d3cf255e78..bd2172c2d650 100644 --- a/drivers/video/backlight/backlight.c +++ b/drivers/video/backlight/backlight.c | |||
| @@ -347,7 +347,7 @@ struct backlight_device *backlight_device_register(const char *name, | |||
| 347 | 347 | ||
| 348 | rc = device_register(&new_bd->dev); | 348 | rc = device_register(&new_bd->dev); |
| 349 | if (rc) { | 349 | if (rc) { |
| 350 | kfree(new_bd); | 350 | put_device(&new_bd->dev); |
| 351 | return ERR_PTR(rc); | 351 | return ERR_PTR(rc); |
| 352 | } | 352 | } |
| 353 | 353 | ||
diff --git a/drivers/video/backlight/gpio_backlight.c b/drivers/video/backlight/gpio_backlight.c index 81fb12770c2a..a2eba12e1cb7 100644 --- a/drivers/video/backlight/gpio_backlight.c +++ b/drivers/video/backlight/gpio_backlight.c | |||
| @@ -13,6 +13,8 @@ | |||
| 13 | #include <linux/init.h> | 13 | #include <linux/init.h> |
| 14 | #include <linux/kernel.h> | 14 | #include <linux/kernel.h> |
| 15 | #include <linux/module.h> | 15 | #include <linux/module.h> |
| 16 | #include <linux/of.h> | ||
| 17 | #include <linux/of_gpio.h> | ||
| 16 | #include <linux/platform_data/gpio_backlight.h> | 18 | #include <linux/platform_data/gpio_backlight.h> |
| 17 | #include <linux/platform_device.h> | 19 | #include <linux/platform_device.h> |
| 18 | #include <linux/slab.h> | 20 | #include <linux/slab.h> |
| @@ -23,6 +25,7 @@ struct gpio_backlight { | |||
| 23 | 25 | ||
| 24 | int gpio; | 26 | int gpio; |
| 25 | int active; | 27 | int active; |
| 28 | int def_value; | ||
| 26 | }; | 29 | }; |
| 27 | 30 | ||
| 28 | static int gpio_backlight_update_status(struct backlight_device *bl) | 31 | static int gpio_backlight_update_status(struct backlight_device *bl) |
| @@ -60,6 +63,29 @@ static const struct backlight_ops gpio_backlight_ops = { | |||
| 60 | .check_fb = gpio_backlight_check_fb, | 63 | .check_fb = gpio_backlight_check_fb, |
| 61 | }; | 64 | }; |
| 62 | 65 | ||
| 66 | static int gpio_backlight_probe_dt(struct platform_device *pdev, | ||
| 67 | struct gpio_backlight *gbl) | ||
| 68 | { | ||
| 69 | struct device_node *np = pdev->dev.of_node; | ||
| 70 | enum of_gpio_flags gpio_flags; | ||
| 71 | |||
| 72 | gbl->gpio = of_get_gpio_flags(np, 0, &gpio_flags); | ||
| 73 | |||
| 74 | if (!gpio_is_valid(gbl->gpio)) { | ||
| 75 | if (gbl->gpio != -EPROBE_DEFER) { | ||
| 76 | dev_err(&pdev->dev, | ||
| 77 | "Error: The gpios parameter is missing or invalid.\n"); | ||
| 78 | } | ||
| 79 | return gbl->gpio; | ||
| 80 | } | ||
| 81 | |||
| 82 | gbl->active = (gpio_flags & OF_GPIO_ACTIVE_LOW) ? 0 : 1; | ||
| 83 | |||
| 84 | gbl->def_value = of_property_read_bool(np, "default-on"); | ||
| 85 | |||
| 86 | return 0; | ||
| 87 | } | ||
| 88 | |||
| 63 | static int gpio_backlight_probe(struct platform_device *pdev) | 89 | static int gpio_backlight_probe(struct platform_device *pdev) |
| 64 | { | 90 | { |
| 65 | struct gpio_backlight_platform_data *pdata = | 91 | struct gpio_backlight_platform_data *pdata = |
| @@ -67,10 +93,12 @@ static int gpio_backlight_probe(struct platform_device *pdev) | |||
| 67 | struct backlight_properties props; | 93 | struct backlight_properties props; |
| 68 | struct backlight_device *bl; | 94 | struct backlight_device *bl; |
| 69 | struct gpio_backlight *gbl; | 95 | struct gpio_backlight *gbl; |
| 96 | struct device_node *np = pdev->dev.of_node; | ||
| 70 | int ret; | 97 | int ret; |
| 71 | 98 | ||
| 72 | if (!pdata) { | 99 | if (!pdata && !np) { |
| 73 | dev_err(&pdev->dev, "failed to find platform data\n"); | 100 | dev_err(&pdev->dev, |
| 101 | "failed to find platform data or device tree node.\n"); | ||
| 74 | return -ENODEV; | 102 | return -ENODEV; |
| 75 | } | 103 | } |
| 76 | 104 | ||
| @@ -79,14 +107,22 @@ static int gpio_backlight_probe(struct platform_device *pdev) | |||
| 79 | return -ENOMEM; | 107 | return -ENOMEM; |
| 80 | 108 | ||
| 81 | gbl->dev = &pdev->dev; | 109 | gbl->dev = &pdev->dev; |
| 82 | gbl->fbdev = pdata->fbdev; | 110 | |
| 83 | gbl->gpio = pdata->gpio; | 111 | if (np) { |
| 84 | gbl->active = pdata->active_low ? 0 : 1; | 112 | ret = gpio_backlight_probe_dt(pdev, gbl); |
| 113 | if (ret) | ||
| 114 | return ret; | ||
| 115 | } else { | ||
| 116 | gbl->fbdev = pdata->fbdev; | ||
| 117 | gbl->gpio = pdata->gpio; | ||
| 118 | gbl->active = pdata->active_low ? 0 : 1; | ||
| 119 | gbl->def_value = pdata->def_value; | ||
| 120 | } | ||
| 85 | 121 | ||
| 86 | ret = devm_gpio_request_one(gbl->dev, gbl->gpio, GPIOF_DIR_OUT | | 122 | ret = devm_gpio_request_one(gbl->dev, gbl->gpio, GPIOF_DIR_OUT | |
| 87 | (gbl->active ? GPIOF_INIT_LOW | 123 | (gbl->active ? GPIOF_INIT_LOW |
| 88 | : GPIOF_INIT_HIGH), | 124 | : GPIOF_INIT_HIGH), |
| 89 | pdata->name); | 125 | pdata ? pdata->name : "backlight"); |
| 90 | if (ret < 0) { | 126 | if (ret < 0) { |
| 91 | dev_err(&pdev->dev, "unable to request GPIO\n"); | 127 | dev_err(&pdev->dev, "unable to request GPIO\n"); |
| 92 | return ret; | 128 | return ret; |
| @@ -103,17 +139,25 @@ static int gpio_backlight_probe(struct platform_device *pdev) | |||
| 103 | return PTR_ERR(bl); | 139 | return PTR_ERR(bl); |
| 104 | } | 140 | } |
| 105 | 141 | ||
| 106 | bl->props.brightness = pdata->def_value; | 142 | bl->props.brightness = gbl->def_value; |
| 107 | backlight_update_status(bl); | 143 | backlight_update_status(bl); |
| 108 | 144 | ||
| 109 | platform_set_drvdata(pdev, bl); | 145 | platform_set_drvdata(pdev, bl); |
| 110 | return 0; | 146 | return 0; |
| 111 | } | 147 | } |
| 112 | 148 | ||
| 149 | #ifdef CONFIG_OF | ||
| 150 | static struct of_device_id gpio_backlight_of_match[] = { | ||
| 151 | { .compatible = "gpio-backlight" }, | ||
| 152 | { /* sentinel */ } | ||
| 153 | }; | ||
| 154 | #endif | ||
| 155 | |||
| 113 | static struct platform_driver gpio_backlight_driver = { | 156 | static struct platform_driver gpio_backlight_driver = { |
| 114 | .driver = { | 157 | .driver = { |
| 115 | .name = "gpio-backlight", | 158 | .name = "gpio-backlight", |
| 116 | .owner = THIS_MODULE, | 159 | .owner = THIS_MODULE, |
| 160 | .of_match_table = of_match_ptr(gpio_backlight_of_match), | ||
| 117 | }, | 161 | }, |
| 118 | .probe = gpio_backlight_probe, | 162 | .probe = gpio_backlight_probe, |
| 119 | }; | 163 | }; |
diff --git a/drivers/video/backlight/lm3639_bl.c b/drivers/video/backlight/lm3639_bl.c index 6fd60adf922e..5f36808d214f 100644 --- a/drivers/video/backlight/lm3639_bl.c +++ b/drivers/video/backlight/lm3639_bl.c | |||
| @@ -349,8 +349,9 @@ static int lm3639_probe(struct i2c_client *client, | |||
| 349 | props.brightness = pdata->init_brt_led; | 349 | props.brightness = pdata->init_brt_led; |
| 350 | props.max_brightness = pdata->max_brt_led; | 350 | props.max_brightness = pdata->max_brt_led; |
| 351 | pchip->bled = | 351 | pchip->bled = |
| 352 | backlight_device_register("lm3639_bled", pchip->dev, pchip, | 352 | devm_backlight_device_register(pchip->dev, "lm3639_bled", |
| 353 | &lm3639_bled_ops, &props); | 353 | pchip->dev, pchip, &lm3639_bled_ops, |
| 354 | &props); | ||
| 354 | if (IS_ERR(pchip->bled)) { | 355 | if (IS_ERR(pchip->bled)) { |
| 355 | dev_err(&client->dev, "fail : backlight register\n"); | 356 | dev_err(&client->dev, "fail : backlight register\n"); |
| 356 | ret = PTR_ERR(pchip->bled); | 357 | ret = PTR_ERR(pchip->bled); |
| @@ -360,7 +361,7 @@ static int lm3639_probe(struct i2c_client *client, | |||
| 360 | ret = device_create_file(&(pchip->bled->dev), &dev_attr_bled_mode); | 361 | ret = device_create_file(&(pchip->bled->dev), &dev_attr_bled_mode); |
| 361 | if (ret < 0) { | 362 | if (ret < 0) { |
| 362 | dev_err(&client->dev, "failed : add sysfs entries\n"); | 363 | dev_err(&client->dev, "failed : add sysfs entries\n"); |
| 363 | goto err_bled_mode; | 364 | goto err_out; |
| 364 | } | 365 | } |
| 365 | 366 | ||
| 366 | /* flash */ | 367 | /* flash */ |
| @@ -391,8 +392,6 @@ err_torch: | |||
| 391 | led_classdev_unregister(&pchip->cdev_flash); | 392 | led_classdev_unregister(&pchip->cdev_flash); |
| 392 | err_flash: | 393 | err_flash: |
| 393 | device_remove_file(&(pchip->bled->dev), &dev_attr_bled_mode); | 394 | device_remove_file(&(pchip->bled->dev), &dev_attr_bled_mode); |
| 394 | err_bled_mode: | ||
| 395 | backlight_device_unregister(pchip->bled); | ||
| 396 | err_out: | 395 | err_out: |
| 397 | return ret; | 396 | return ret; |
| 398 | } | 397 | } |
| @@ -407,10 +406,8 @@ static int lm3639_remove(struct i2c_client *client) | |||
| 407 | led_classdev_unregister(&pchip->cdev_torch); | 406 | led_classdev_unregister(&pchip->cdev_torch); |
| 408 | if (&pchip->cdev_flash) | 407 | if (&pchip->cdev_flash) |
| 409 | led_classdev_unregister(&pchip->cdev_flash); | 408 | led_classdev_unregister(&pchip->cdev_flash); |
| 410 | if (pchip->bled) { | 409 | if (pchip->bled) |
| 411 | device_remove_file(&(pchip->bled->dev), &dev_attr_bled_mode); | 410 | device_remove_file(&(pchip->bled->dev), &dev_attr_bled_mode); |
| 412 | backlight_device_unregister(pchip->bled); | ||
| 413 | } | ||
| 414 | return 0; | 411 | return 0; |
| 415 | } | 412 | } |
| 416 | 413 | ||
| @@ -432,6 +429,6 @@ static struct i2c_driver lm3639_i2c_driver = { | |||
| 432 | module_i2c_driver(lm3639_i2c_driver); | 429 | module_i2c_driver(lm3639_i2c_driver); |
| 433 | 430 | ||
| 434 | MODULE_DESCRIPTION("Texas Instruments Backlight+Flash LED driver for LM3639"); | 431 | MODULE_DESCRIPTION("Texas Instruments Backlight+Flash LED driver for LM3639"); |
| 435 | MODULE_AUTHOR("Daniel Jeong <daniel.jeong@ti.com>"); | 432 | MODULE_AUTHOR("Daniel Jeong <gshark.jeong@gmail.com>"); |
| 436 | MODULE_AUTHOR("G.Shark Jeong <gshark.jeong@gmail.com>"); | 433 | MODULE_AUTHOR("Ldd Mlp <ldd-mlp@list.ti.com>"); |
| 437 | MODULE_LICENSE("GPL v2"); | 434 | MODULE_LICENSE("GPL v2"); |
