diff options
Diffstat (limited to 'drivers/video')
47 files changed, 721 insertions, 938 deletions
diff --git a/drivers/video/acornfb.c b/drivers/video/acornfb.c index 7e8346ec9cdc..a305caea58ee 100644 --- a/drivers/video/acornfb.c +++ b/drivers/video/acornfb.c | |||
@@ -949,9 +949,7 @@ free_unused_pages(unsigned int virtual_start, unsigned int virtual_end) | |||
949 | * the page. | 949 | * the page. |
950 | */ | 950 | */ |
951 | page = virt_to_page(virtual_start); | 951 | page = virt_to_page(virtual_start); |
952 | ClearPageReserved(page); | 952 | __free_reserved_page(page); |
953 | init_page_count(page); | ||
954 | free_page(virtual_start); | ||
955 | 953 | ||
956 | virtual_start += PAGE_SIZE; | 954 | virtual_start += PAGE_SIZE; |
957 | mb_freed += PAGE_SIZE / 1024; | 955 | mb_freed += PAGE_SIZE / 1024; |
diff --git a/drivers/video/backlight/88pm860x_bl.c b/drivers/video/backlight/88pm860x_bl.c index 2cd63507ed74..7db5234462d0 100644 --- a/drivers/video/backlight/88pm860x_bl.c +++ b/drivers/video/backlight/88pm860x_bl.c | |||
@@ -196,7 +196,7 @@ static int pm860x_backlight_dt_init(struct platform_device *pdev, | |||
196 | static int pm860x_backlight_probe(struct platform_device *pdev) | 196 | static int pm860x_backlight_probe(struct platform_device *pdev) |
197 | { | 197 | { |
198 | struct pm860x_chip *chip = dev_get_drvdata(pdev->dev.parent); | 198 | struct pm860x_chip *chip = dev_get_drvdata(pdev->dev.parent); |
199 | struct pm860x_backlight_pdata *pdata = pdev->dev.platform_data; | 199 | struct pm860x_backlight_pdata *pdata = dev_get_platdata(&pdev->dev); |
200 | struct pm860x_backlight_data *data; | 200 | struct pm860x_backlight_data *data; |
201 | struct backlight_device *bl; | 201 | struct backlight_device *bl; |
202 | struct resource *res; | 202 | struct resource *res; |
@@ -243,7 +243,7 @@ static int pm860x_backlight_probe(struct platform_device *pdev) | |||
243 | memset(&props, 0, sizeof(struct backlight_properties)); | 243 | memset(&props, 0, sizeof(struct backlight_properties)); |
244 | props.type = BACKLIGHT_RAW; | 244 | props.type = BACKLIGHT_RAW; |
245 | props.max_brightness = MAX_BRIGHTNESS; | 245 | props.max_brightness = MAX_BRIGHTNESS; |
246 | bl = backlight_device_register(name, &pdev->dev, data, | 246 | bl = devm_backlight_device_register(&pdev->dev, name, &pdev->dev, data, |
247 | &pm860x_backlight_ops, &props); | 247 | &pm860x_backlight_ops, &props); |
248 | if (IS_ERR(bl)) { | 248 | if (IS_ERR(bl)) { |
249 | dev_err(&pdev->dev, "failed to register backlight\n"); | 249 | dev_err(&pdev->dev, "failed to register backlight\n"); |
@@ -256,21 +256,10 @@ static int pm860x_backlight_probe(struct platform_device *pdev) | |||
256 | /* read current backlight */ | 256 | /* read current backlight */ |
257 | ret = pm860x_backlight_get_brightness(bl); | 257 | ret = pm860x_backlight_get_brightness(bl); |
258 | if (ret < 0) | 258 | if (ret < 0) |
259 | goto out_brt; | 259 | return ret; |
260 | 260 | ||
261 | backlight_update_status(bl); | 261 | backlight_update_status(bl); |
262 | return 0; | 262 | return 0; |
263 | out_brt: | ||
264 | backlight_device_unregister(bl); | ||
265 | return ret; | ||
266 | } | ||
267 | |||
268 | static int pm860x_backlight_remove(struct platform_device *pdev) | ||
269 | { | ||
270 | struct backlight_device *bl = platform_get_drvdata(pdev); | ||
271 | |||
272 | backlight_device_unregister(bl); | ||
273 | return 0; | ||
274 | } | 263 | } |
275 | 264 | ||
276 | static struct platform_driver pm860x_backlight_driver = { | 265 | static struct platform_driver pm860x_backlight_driver = { |
@@ -279,7 +268,6 @@ static struct platform_driver pm860x_backlight_driver = { | |||
279 | .owner = THIS_MODULE, | 268 | .owner = THIS_MODULE, |
280 | }, | 269 | }, |
281 | .probe = pm860x_backlight_probe, | 270 | .probe = pm860x_backlight_probe, |
282 | .remove = pm860x_backlight_remove, | ||
283 | }; | 271 | }; |
284 | 272 | ||
285 | module_platform_driver(pm860x_backlight_driver); | 273 | module_platform_driver(pm860x_backlight_driver); |
diff --git a/drivers/video/backlight/Kconfig b/drivers/video/backlight/Kconfig index d4a7a351d67c..5a3eb2ecb525 100644 --- a/drivers/video/backlight/Kconfig +++ b/drivers/video/backlight/Kconfig | |||
@@ -368,12 +368,12 @@ config BACKLIGHT_AAT2870 | |||
368 | If you have a AnalogicTech AAT2870 say Y to enable the | 368 | If you have a AnalogicTech AAT2870 say Y to enable the |
369 | backlight driver. | 369 | backlight driver. |
370 | 370 | ||
371 | config BACKLIGHT_LM3630 | 371 | config BACKLIGHT_LM3630A |
372 | tristate "Backlight Driver for LM3630" | 372 | tristate "Backlight Driver for LM3630A" |
373 | depends on BACKLIGHT_CLASS_DEVICE && I2C | 373 | depends on BACKLIGHT_CLASS_DEVICE && I2C |
374 | select REGMAP_I2C | 374 | select REGMAP_I2C |
375 | help | 375 | help |
376 | This supports TI LM3630 Backlight Driver | 376 | This supports TI LM3630A Backlight Driver |
377 | 377 | ||
378 | config BACKLIGHT_LM3639 | 378 | config BACKLIGHT_LM3639 |
379 | tristate "Backlight Driver for LM3639" | 379 | tristate "Backlight Driver for LM3639" |
@@ -388,8 +388,8 @@ config BACKLIGHT_LP855X | |||
388 | tristate "Backlight driver for TI LP855X" | 388 | tristate "Backlight driver for TI LP855X" |
389 | depends on BACKLIGHT_CLASS_DEVICE && I2C | 389 | depends on BACKLIGHT_CLASS_DEVICE && I2C |
390 | help | 390 | help |
391 | This supports TI LP8550, LP8551, LP8552, LP8553, LP8556 and LP8557 | 391 | This supports TI LP8550, LP8551, LP8552, LP8553, LP8555, LP8556 and |
392 | backlight driver. | 392 | LP8557 backlight driver. |
393 | 393 | ||
394 | config BACKLIGHT_LP8788 | 394 | config BACKLIGHT_LP8788 |
395 | tristate "Backlight driver for TI LP8788 MFD" | 395 | tristate "Backlight driver for TI LP8788 MFD" |
diff --git a/drivers/video/backlight/Makefile b/drivers/video/backlight/Makefile index 38e1babb1946..bb820024f346 100644 --- a/drivers/video/backlight/Makefile +++ b/drivers/video/backlight/Makefile | |||
@@ -37,7 +37,7 @@ obj-$(CONFIG_BACKLIGHT_GPIO) += gpio_backlight.o | |||
37 | obj-$(CONFIG_BACKLIGHT_HP680) += hp680_bl.o | 37 | obj-$(CONFIG_BACKLIGHT_HP680) += hp680_bl.o |
38 | obj-$(CONFIG_BACKLIGHT_HP700) += jornada720_bl.o | 38 | obj-$(CONFIG_BACKLIGHT_HP700) += jornada720_bl.o |
39 | obj-$(CONFIG_BACKLIGHT_LM3533) += lm3533_bl.o | 39 | obj-$(CONFIG_BACKLIGHT_LM3533) += lm3533_bl.o |
40 | obj-$(CONFIG_BACKLIGHT_LM3630) += lm3630_bl.o | 40 | obj-$(CONFIG_BACKLIGHT_LM3630A) += lm3630a_bl.o |
41 | obj-$(CONFIG_BACKLIGHT_LM3639) += lm3639_bl.o | 41 | obj-$(CONFIG_BACKLIGHT_LM3639) += lm3639_bl.o |
42 | obj-$(CONFIG_BACKLIGHT_LOCOMO) += locomolcd.o | 42 | obj-$(CONFIG_BACKLIGHT_LOCOMO) += locomolcd.o |
43 | obj-$(CONFIG_BACKLIGHT_LP855X) += lp855x_bl.o | 43 | obj-$(CONFIG_BACKLIGHT_LP855X) += lp855x_bl.o |
diff --git a/drivers/video/backlight/aat2870_bl.c b/drivers/video/backlight/aat2870_bl.c index c6fc668d6236..ee0c0a982e4e 100644 --- a/drivers/video/backlight/aat2870_bl.c +++ b/drivers/video/backlight/aat2870_bl.c | |||
@@ -127,7 +127,7 @@ static const struct backlight_ops aat2870_bl_ops = { | |||
127 | 127 | ||
128 | static int aat2870_bl_probe(struct platform_device *pdev) | 128 | static int aat2870_bl_probe(struct platform_device *pdev) |
129 | { | 129 | { |
130 | struct aat2870_bl_platform_data *pdata = pdev->dev.platform_data; | 130 | struct aat2870_bl_platform_data *pdata = dev_get_platdata(&pdev->dev); |
131 | struct aat2870_bl_driver_data *aat2870_bl; | 131 | struct aat2870_bl_driver_data *aat2870_bl; |
132 | struct backlight_device *bd; | 132 | struct backlight_device *bd; |
133 | struct backlight_properties props; | 133 | struct backlight_properties props; |
@@ -158,8 +158,9 @@ static int aat2870_bl_probe(struct platform_device *pdev) | |||
158 | memset(&props, 0, sizeof(struct backlight_properties)); | 158 | memset(&props, 0, sizeof(struct backlight_properties)); |
159 | 159 | ||
160 | props.type = BACKLIGHT_RAW; | 160 | props.type = BACKLIGHT_RAW; |
161 | bd = backlight_device_register("aat2870-backlight", &pdev->dev, | 161 | bd = devm_backlight_device_register(&pdev->dev, "aat2870-backlight", |
162 | aat2870_bl, &aat2870_bl_ops, &props); | 162 | &pdev->dev, aat2870_bl, &aat2870_bl_ops, |
163 | &props); | ||
163 | if (IS_ERR(bd)) { | 164 | if (IS_ERR(bd)) { |
164 | dev_err(&pdev->dev, | 165 | dev_err(&pdev->dev, |
165 | "Failed allocate memory for backlight device\n"); | 166 | "Failed allocate memory for backlight device\n"); |
@@ -194,13 +195,11 @@ static int aat2870_bl_probe(struct platform_device *pdev) | |||
194 | ret = aat2870_bl_update_status(bd); | 195 | ret = aat2870_bl_update_status(bd); |
195 | if (ret < 0) { | 196 | if (ret < 0) { |
196 | dev_err(&pdev->dev, "Failed to initialize\n"); | 197 | dev_err(&pdev->dev, "Failed to initialize\n"); |
197 | goto out_bl_dev_unregister; | 198 | return ret; |
198 | } | 199 | } |
199 | 200 | ||
200 | return 0; | 201 | return 0; |
201 | 202 | ||
202 | out_bl_dev_unregister: | ||
203 | backlight_device_unregister(bd); | ||
204 | out: | 203 | out: |
205 | return ret; | 204 | return ret; |
206 | } | 205 | } |
@@ -214,8 +213,6 @@ static int aat2870_bl_remove(struct platform_device *pdev) | |||
214 | bd->props.brightness = 0; | 213 | bd->props.brightness = 0; |
215 | backlight_update_status(bd); | 214 | backlight_update_status(bd); |
216 | 215 | ||
217 | backlight_device_unregister(bd); | ||
218 | |||
219 | return 0; | 216 | return 0; |
220 | } | 217 | } |
221 | 218 | ||
diff --git a/drivers/video/backlight/adp5520_bl.c b/drivers/video/backlight/adp5520_bl.c index c84701b7ca6e..f37097a261a2 100644 --- a/drivers/video/backlight/adp5520_bl.c +++ b/drivers/video/backlight/adp5520_bl.c | |||
@@ -297,7 +297,7 @@ static int adp5520_bl_probe(struct platform_device *pdev) | |||
297 | return -ENOMEM; | 297 | return -ENOMEM; |
298 | 298 | ||
299 | data->master = pdev->dev.parent; | 299 | data->master = pdev->dev.parent; |
300 | data->pdata = pdev->dev.platform_data; | 300 | data->pdata = dev_get_platdata(&pdev->dev); |
301 | 301 | ||
302 | if (data->pdata == NULL) { | 302 | if (data->pdata == NULL) { |
303 | dev_err(&pdev->dev, "missing platform data\n"); | 303 | dev_err(&pdev->dev, "missing platform data\n"); |
@@ -312,8 +312,9 @@ static int adp5520_bl_probe(struct platform_device *pdev) | |||
312 | memset(&props, 0, sizeof(struct backlight_properties)); | 312 | memset(&props, 0, sizeof(struct backlight_properties)); |
313 | props.type = BACKLIGHT_RAW; | 313 | props.type = BACKLIGHT_RAW; |
314 | props.max_brightness = ADP5020_MAX_BRIGHTNESS; | 314 | props.max_brightness = ADP5020_MAX_BRIGHTNESS; |
315 | bl = backlight_device_register(pdev->name, data->master, data, | 315 | bl = devm_backlight_device_register(&pdev->dev, pdev->name, |
316 | &adp5520_bl_ops, &props); | 316 | data->master, data, &adp5520_bl_ops, |
317 | &props); | ||
317 | if (IS_ERR(bl)) { | 318 | if (IS_ERR(bl)) { |
318 | dev_err(&pdev->dev, "failed to register backlight\n"); | 319 | dev_err(&pdev->dev, "failed to register backlight\n"); |
319 | return PTR_ERR(bl); | 320 | return PTR_ERR(bl); |
@@ -326,7 +327,7 @@ static int adp5520_bl_probe(struct platform_device *pdev) | |||
326 | 327 | ||
327 | if (ret) { | 328 | if (ret) { |
328 | dev_err(&pdev->dev, "failed to register sysfs\n"); | 329 | dev_err(&pdev->dev, "failed to register sysfs\n"); |
329 | backlight_device_unregister(bl); | 330 | return ret; |
330 | } | 331 | } |
331 | 332 | ||
332 | platform_set_drvdata(pdev, bl); | 333 | platform_set_drvdata(pdev, bl); |
@@ -347,8 +348,6 @@ static int adp5520_bl_remove(struct platform_device *pdev) | |||
347 | sysfs_remove_group(&bl->dev.kobj, | 348 | sysfs_remove_group(&bl->dev.kobj, |
348 | &adp5520_bl_attr_group); | 349 | &adp5520_bl_attr_group); |
349 | 350 | ||
350 | backlight_device_unregister(bl); | ||
351 | |||
352 | return 0; | 351 | return 0; |
353 | } | 352 | } |
354 | 353 | ||
diff --git a/drivers/video/backlight/adp8860_bl.c b/drivers/video/backlight/adp8860_bl.c index 75b10f876127..9d656717d0f7 100644 --- a/drivers/video/backlight/adp8860_bl.c +++ b/drivers/video/backlight/adp8860_bl.c | |||
@@ -216,7 +216,7 @@ static int adp8860_led_setup(struct adp8860_led *led) | |||
216 | static int adp8860_led_probe(struct i2c_client *client) | 216 | static int adp8860_led_probe(struct i2c_client *client) |
217 | { | 217 | { |
218 | struct adp8860_backlight_platform_data *pdata = | 218 | struct adp8860_backlight_platform_data *pdata = |
219 | client->dev.platform_data; | 219 | dev_get_platdata(&client->dev); |
220 | struct adp8860_bl *data = i2c_get_clientdata(client); | 220 | struct adp8860_bl *data = i2c_get_clientdata(client); |
221 | struct adp8860_led *led, *led_dat; | 221 | struct adp8860_led *led, *led_dat; |
222 | struct led_info *cur_led; | 222 | struct led_info *cur_led; |
@@ -300,7 +300,7 @@ static int adp8860_led_probe(struct i2c_client *client) | |||
300 | static int adp8860_led_remove(struct i2c_client *client) | 300 | static int adp8860_led_remove(struct i2c_client *client) |
301 | { | 301 | { |
302 | struct adp8860_backlight_platform_data *pdata = | 302 | struct adp8860_backlight_platform_data *pdata = |
303 | client->dev.platform_data; | 303 | dev_get_platdata(&client->dev); |
304 | struct adp8860_bl *data = i2c_get_clientdata(client); | 304 | struct adp8860_bl *data = i2c_get_clientdata(client); |
305 | int i; | 305 | int i; |
306 | 306 | ||
@@ -658,7 +658,7 @@ static int adp8860_probe(struct i2c_client *client, | |||
658 | struct backlight_device *bl; | 658 | struct backlight_device *bl; |
659 | struct adp8860_bl *data; | 659 | struct adp8860_bl *data; |
660 | struct adp8860_backlight_platform_data *pdata = | 660 | struct adp8860_backlight_platform_data *pdata = |
661 | client->dev.platform_data; | 661 | dev_get_platdata(&client->dev); |
662 | struct backlight_properties props; | 662 | struct backlight_properties props; |
663 | uint8_t reg_val; | 663 | uint8_t reg_val; |
664 | int ret; | 664 | int ret; |
@@ -711,8 +711,9 @@ static int adp8860_probe(struct i2c_client *client, | |||
711 | 711 | ||
712 | mutex_init(&data->lock); | 712 | mutex_init(&data->lock); |
713 | 713 | ||
714 | bl = backlight_device_register(dev_driver_string(&client->dev), | 714 | bl = devm_backlight_device_register(&client->dev, |
715 | &client->dev, data, &adp8860_bl_ops, &props); | 715 | dev_driver_string(&client->dev), |
716 | &client->dev, data, &adp8860_bl_ops, &props); | ||
716 | if (IS_ERR(bl)) { | 717 | if (IS_ERR(bl)) { |
717 | dev_err(&client->dev, "failed to register backlight\n"); | 718 | dev_err(&client->dev, "failed to register backlight\n"); |
718 | return PTR_ERR(bl); | 719 | return PTR_ERR(bl); |
@@ -728,7 +729,7 @@ static int adp8860_probe(struct i2c_client *client, | |||
728 | 729 | ||
729 | if (ret) { | 730 | if (ret) { |
730 | dev_err(&client->dev, "failed to register sysfs\n"); | 731 | dev_err(&client->dev, "failed to register sysfs\n"); |
731 | goto out1; | 732 | return ret; |
732 | } | 733 | } |
733 | 734 | ||
734 | ret = adp8860_bl_setup(bl); | 735 | ret = adp8860_bl_setup(bl); |
@@ -751,8 +752,6 @@ out: | |||
751 | if (data->en_ambl_sens) | 752 | if (data->en_ambl_sens) |
752 | sysfs_remove_group(&data->bl->dev.kobj, | 753 | sysfs_remove_group(&data->bl->dev.kobj, |
753 | &adp8860_bl_attr_group); | 754 | &adp8860_bl_attr_group); |
754 | out1: | ||
755 | backlight_device_unregister(bl); | ||
756 | 755 | ||
757 | return ret; | 756 | return ret; |
758 | } | 757 | } |
@@ -770,8 +769,6 @@ static int adp8860_remove(struct i2c_client *client) | |||
770 | sysfs_remove_group(&data->bl->dev.kobj, | 769 | sysfs_remove_group(&data->bl->dev.kobj, |
771 | &adp8860_bl_attr_group); | 770 | &adp8860_bl_attr_group); |
772 | 771 | ||
773 | backlight_device_unregister(data->bl); | ||
774 | |||
775 | return 0; | 772 | return 0; |
776 | } | 773 | } |
777 | 774 | ||
diff --git a/drivers/video/backlight/adp8870_bl.c b/drivers/video/backlight/adp8870_bl.c index 90049d7b5c60..63707205326b 100644 --- a/drivers/video/backlight/adp8870_bl.c +++ b/drivers/video/backlight/adp8870_bl.c | |||
@@ -238,7 +238,7 @@ static int adp8870_led_setup(struct adp8870_led *led) | |||
238 | static int adp8870_led_probe(struct i2c_client *client) | 238 | static int adp8870_led_probe(struct i2c_client *client) |
239 | { | 239 | { |
240 | struct adp8870_backlight_platform_data *pdata = | 240 | struct adp8870_backlight_platform_data *pdata = |
241 | client->dev.platform_data; | 241 | dev_get_platdata(&client->dev); |
242 | struct adp8870_bl *data = i2c_get_clientdata(client); | 242 | struct adp8870_bl *data = i2c_get_clientdata(client); |
243 | struct adp8870_led *led, *led_dat; | 243 | struct adp8870_led *led, *led_dat; |
244 | struct led_info *cur_led; | 244 | struct led_info *cur_led; |
@@ -325,7 +325,7 @@ static int adp8870_led_probe(struct i2c_client *client) | |||
325 | static int adp8870_led_remove(struct i2c_client *client) | 325 | static int adp8870_led_remove(struct i2c_client *client) |
326 | { | 326 | { |
327 | struct adp8870_backlight_platform_data *pdata = | 327 | struct adp8870_backlight_platform_data *pdata = |
328 | client->dev.platform_data; | 328 | dev_get_platdata(&client->dev); |
329 | struct adp8870_bl *data = i2c_get_clientdata(client); | 329 | struct adp8870_bl *data = i2c_get_clientdata(client); |
330 | int i; | 330 | int i; |
331 | 331 | ||
@@ -848,7 +848,7 @@ static int adp8870_probe(struct i2c_client *client, | |||
848 | struct backlight_device *bl; | 848 | struct backlight_device *bl; |
849 | struct adp8870_bl *data; | 849 | struct adp8870_bl *data; |
850 | struct adp8870_backlight_platform_data *pdata = | 850 | struct adp8870_backlight_platform_data *pdata = |
851 | client->dev.platform_data; | 851 | dev_get_platdata(&client->dev); |
852 | uint8_t reg_val; | 852 | uint8_t reg_val; |
853 | int ret; | 853 | int ret; |
854 | 854 | ||
@@ -888,8 +888,9 @@ static int adp8870_probe(struct i2c_client *client, | |||
888 | memset(&props, 0, sizeof(props)); | 888 | memset(&props, 0, sizeof(props)); |
889 | props.type = BACKLIGHT_RAW; | 889 | props.type = BACKLIGHT_RAW; |
890 | props.max_brightness = props.brightness = ADP8870_MAX_BRIGHTNESS; | 890 | props.max_brightness = props.brightness = ADP8870_MAX_BRIGHTNESS; |
891 | bl = backlight_device_register(dev_driver_string(&client->dev), | 891 | bl = devm_backlight_device_register(&client->dev, |
892 | &client->dev, data, &adp8870_bl_ops, &props); | 892 | dev_driver_string(&client->dev), |
893 | &client->dev, data, &adp8870_bl_ops, &props); | ||
893 | if (IS_ERR(bl)) { | 894 | if (IS_ERR(bl)) { |
894 | dev_err(&client->dev, "failed to register backlight\n"); | 895 | dev_err(&client->dev, "failed to register backlight\n"); |
895 | return PTR_ERR(bl); | 896 | return PTR_ERR(bl); |
@@ -902,7 +903,7 @@ static int adp8870_probe(struct i2c_client *client, | |||
902 | &adp8870_bl_attr_group); | 903 | &adp8870_bl_attr_group); |
903 | if (ret) { | 904 | if (ret) { |
904 | dev_err(&client->dev, "failed to register sysfs\n"); | 905 | dev_err(&client->dev, "failed to register sysfs\n"); |
905 | goto out1; | 906 | return ret; |
906 | } | 907 | } |
907 | } | 908 | } |
908 | 909 | ||
@@ -925,8 +926,6 @@ out: | |||
925 | if (data->pdata->en_ambl_sens) | 926 | if (data->pdata->en_ambl_sens) |
926 | sysfs_remove_group(&data->bl->dev.kobj, | 927 | sysfs_remove_group(&data->bl->dev.kobj, |
927 | &adp8870_bl_attr_group); | 928 | &adp8870_bl_attr_group); |
928 | out1: | ||
929 | backlight_device_unregister(bl); | ||
930 | 929 | ||
931 | return ret; | 930 | return ret; |
932 | } | 931 | } |
@@ -944,8 +943,6 @@ static int adp8870_remove(struct i2c_client *client) | |||
944 | sysfs_remove_group(&data->bl->dev.kobj, | 943 | sysfs_remove_group(&data->bl->dev.kobj, |
945 | &adp8870_bl_attr_group); | 944 | &adp8870_bl_attr_group); |
946 | 945 | ||
947 | backlight_device_unregister(data->bl); | ||
948 | |||
949 | return 0; | 946 | return 0; |
950 | } | 947 | } |
951 | 948 | ||
diff --git a/drivers/video/backlight/ams369fg06.c b/drivers/video/backlight/ams369fg06.c index 319fef6cb422..d8952c4aa689 100644 --- a/drivers/video/backlight/ams369fg06.c +++ b/drivers/video/backlight/ams369fg06.c | |||
@@ -471,14 +471,14 @@ static int ams369fg06_probe(struct spi_device *spi) | |||
471 | lcd->spi = spi; | 471 | lcd->spi = spi; |
472 | lcd->dev = &spi->dev; | 472 | lcd->dev = &spi->dev; |
473 | 473 | ||
474 | lcd->lcd_pd = spi->dev.platform_data; | 474 | lcd->lcd_pd = dev_get_platdata(&spi->dev); |
475 | if (!lcd->lcd_pd) { | 475 | if (!lcd->lcd_pd) { |
476 | dev_err(&spi->dev, "platform data is NULL\n"); | 476 | dev_err(&spi->dev, "platform data is NULL\n"); |
477 | return -EINVAL; | 477 | return -EINVAL; |
478 | } | 478 | } |
479 | 479 | ||
480 | ld = lcd_device_register("ams369fg06", &spi->dev, lcd, | 480 | ld = devm_lcd_device_register(&spi->dev, "ams369fg06", &spi->dev, lcd, |
481 | &ams369fg06_lcd_ops); | 481 | &ams369fg06_lcd_ops); |
482 | if (IS_ERR(ld)) | 482 | if (IS_ERR(ld)) |
483 | return PTR_ERR(ld); | 483 | return PTR_ERR(ld); |
484 | 484 | ||
@@ -488,12 +488,11 @@ static int ams369fg06_probe(struct spi_device *spi) | |||
488 | props.type = BACKLIGHT_RAW; | 488 | props.type = BACKLIGHT_RAW; |
489 | props.max_brightness = MAX_BRIGHTNESS; | 489 | props.max_brightness = MAX_BRIGHTNESS; |
490 | 490 | ||
491 | bd = backlight_device_register("ams369fg06-bl", &spi->dev, lcd, | 491 | bd = devm_backlight_device_register(&spi->dev, "ams369fg06-bl", |
492 | &ams369fg06_backlight_ops, &props); | 492 | &spi->dev, lcd, |
493 | if (IS_ERR(bd)) { | 493 | &ams369fg06_backlight_ops, &props); |
494 | ret = PTR_ERR(bd); | 494 | if (IS_ERR(bd)) |
495 | goto out_lcd_unregister; | 495 | return PTR_ERR(bd); |
496 | } | ||
497 | 496 | ||
498 | bd->props.brightness = DEFAULT_BRIGHTNESS; | 497 | bd->props.brightness = DEFAULT_BRIGHTNESS; |
499 | lcd->bd = bd; | 498 | lcd->bd = bd; |
@@ -516,10 +515,6 @@ static int ams369fg06_probe(struct spi_device *spi) | |||
516 | dev_info(&spi->dev, "ams369fg06 panel driver has been probed.\n"); | 515 | dev_info(&spi->dev, "ams369fg06 panel driver has been probed.\n"); |
517 | 516 | ||
518 | return 0; | 517 | return 0; |
519 | |||
520 | out_lcd_unregister: | ||
521 | lcd_device_unregister(ld); | ||
522 | return ret; | ||
523 | } | 518 | } |
524 | 519 | ||
525 | static int ams369fg06_remove(struct spi_device *spi) | 520 | static int ams369fg06_remove(struct spi_device *spi) |
@@ -527,9 +522,6 @@ static int ams369fg06_remove(struct spi_device *spi) | |||
527 | struct ams369fg06 *lcd = spi_get_drvdata(spi); | 522 | struct ams369fg06 *lcd = spi_get_drvdata(spi); |
528 | 523 | ||
529 | ams369fg06_power(lcd, FB_BLANK_POWERDOWN); | 524 | ams369fg06_power(lcd, FB_BLANK_POWERDOWN); |
530 | backlight_device_unregister(lcd->bd); | ||
531 | lcd_device_unregister(lcd->ld); | ||
532 | |||
533 | return 0; | 525 | return 0; |
534 | } | 526 | } |
535 | 527 | ||
diff --git a/drivers/video/backlight/as3711_bl.c b/drivers/video/backlight/as3711_bl.c index 123887cd76bd..bb1fc45b7549 100644 --- a/drivers/video/backlight/as3711_bl.c +++ b/drivers/video/backlight/as3711_bl.c | |||
@@ -240,7 +240,8 @@ static int as3711_bl_register(struct platform_device *pdev, | |||
240 | /* max tuning I = 31uA for voltage- and 38250uA for current-feedback */ | 240 | /* max tuning I = 31uA for voltage- and 38250uA for current-feedback */ |
241 | props.max_brightness = max_brightness; | 241 | props.max_brightness = max_brightness; |
242 | 242 | ||
243 | bl = backlight_device_register(su->type == AS3711_BL_SU1 ? | 243 | bl = devm_backlight_device_register(&pdev->dev, |
244 | su->type == AS3711_BL_SU1 ? | ||
244 | "as3711-su1" : "as3711-su2", | 245 | "as3711-su1" : "as3711-su2", |
245 | &pdev->dev, su, | 246 | &pdev->dev, su, |
246 | &as3711_bl_ops, &props); | 247 | &as3711_bl_ops, &props); |
@@ -432,8 +433,7 @@ static int as3711_backlight_probe(struct platform_device *pdev) | |||
432 | case AS3711_SU2_LX_SD4: | 433 | case AS3711_SU2_LX_SD4: |
433 | break; | 434 | break; |
434 | default: | 435 | default: |
435 | ret = -EINVAL; | 436 | return -EINVAL; |
436 | goto esu2; | ||
437 | } | 437 | } |
438 | 438 | ||
439 | switch (pdata->su2_feedback) { | 439 | switch (pdata->su2_feedback) { |
@@ -447,8 +447,7 @@ static int as3711_backlight_probe(struct platform_device *pdev) | |||
447 | max_brightness = min(pdata->su2_max_uA / 150, 255); | 447 | max_brightness = min(pdata->su2_max_uA / 150, 255); |
448 | break; | 448 | break; |
449 | default: | 449 | default: |
450 | ret = -EINVAL; | 450 | return -EINVAL; |
451 | goto esu2; | ||
452 | } | 451 | } |
453 | 452 | ||
454 | ret = as3711_bl_init_su2(supply); | 453 | ret = as3711_bl_init_su2(supply); |
@@ -457,26 +456,12 @@ static int as3711_backlight_probe(struct platform_device *pdev) | |||
457 | 456 | ||
458 | ret = as3711_bl_register(pdev, max_brightness, su); | 457 | ret = as3711_bl_register(pdev, max_brightness, su); |
459 | if (ret < 0) | 458 | if (ret < 0) |
460 | goto esu2; | 459 | return ret; |
461 | } | 460 | } |
462 | 461 | ||
463 | platform_set_drvdata(pdev, supply); | 462 | platform_set_drvdata(pdev, supply); |
464 | 463 | ||
465 | return 0; | 464 | return 0; |
466 | |||
467 | esu2: | ||
468 | backlight_device_unregister(supply->su1.bl); | ||
469 | return ret; | ||
470 | } | ||
471 | |||
472 | static int as3711_backlight_remove(struct platform_device *pdev) | ||
473 | { | ||
474 | struct as3711_bl_supply *supply = platform_get_drvdata(pdev); | ||
475 | |||
476 | backlight_device_unregister(supply->su1.bl); | ||
477 | backlight_device_unregister(supply->su2.bl); | ||
478 | |||
479 | return 0; | ||
480 | } | 465 | } |
481 | 466 | ||
482 | static struct platform_driver as3711_backlight_driver = { | 467 | static struct platform_driver as3711_backlight_driver = { |
@@ -485,7 +470,6 @@ static struct platform_driver as3711_backlight_driver = { | |||
485 | .owner = THIS_MODULE, | 470 | .owner = THIS_MODULE, |
486 | }, | 471 | }, |
487 | .probe = as3711_backlight_probe, | 472 | .probe = as3711_backlight_probe, |
488 | .remove = as3711_backlight_remove, | ||
489 | }; | 473 | }; |
490 | 474 | ||
491 | module_platform_driver(as3711_backlight_driver); | 475 | module_platform_driver(as3711_backlight_driver); |
diff --git a/drivers/video/backlight/atmel-pwm-bl.c b/drivers/video/backlight/atmel-pwm-bl.c index f7447f7004fb..261b1a4ec3d8 100644 --- a/drivers/video/backlight/atmel-pwm-bl.c +++ b/drivers/video/backlight/atmel-pwm-bl.c | |||
@@ -12,7 +12,6 @@ | |||
12 | #include <linux/module.h> | 12 | #include <linux/module.h> |
13 | #include <linux/platform_device.h> | 13 | #include <linux/platform_device.h> |
14 | #include <linux/fb.h> | 14 | #include <linux/fb.h> |
15 | #include <linux/clk.h> | ||
16 | #include <linux/gpio.h> | 15 | #include <linux/gpio.h> |
17 | #include <linux/backlight.h> | 16 | #include <linux/backlight.h> |
18 | #include <linux/atmel_pwm.h> | 17 | #include <linux/atmel_pwm.h> |
@@ -27,6 +26,14 @@ struct atmel_pwm_bl { | |||
27 | int gpio_on; | 26 | int gpio_on; |
28 | }; | 27 | }; |
29 | 28 | ||
29 | static void atmel_pwm_bl_set_gpio_on(struct atmel_pwm_bl *pwmbl, int on) | ||
30 | { | ||
31 | if (!gpio_is_valid(pwmbl->gpio_on)) | ||
32 | return; | ||
33 | |||
34 | gpio_set_value(pwmbl->gpio_on, on ^ pwmbl->pdata->on_active_low); | ||
35 | } | ||
36 | |||
30 | static int atmel_pwm_bl_set_intensity(struct backlight_device *bd) | 37 | static int atmel_pwm_bl_set_intensity(struct backlight_device *bd) |
31 | { | 38 | { |
32 | struct atmel_pwm_bl *pwmbl = bl_get_data(bd); | 39 | struct atmel_pwm_bl *pwmbl = bl_get_data(bd); |
@@ -49,19 +56,13 @@ static int atmel_pwm_bl_set_intensity(struct backlight_device *bd) | |||
49 | pwm_duty = pwmbl->pdata->pwm_duty_min; | 56 | pwm_duty = pwmbl->pdata->pwm_duty_min; |
50 | 57 | ||
51 | if (!intensity) { | 58 | if (!intensity) { |
52 | if (pwmbl->gpio_on != -1) { | 59 | atmel_pwm_bl_set_gpio_on(pwmbl, 0); |
53 | gpio_set_value(pwmbl->gpio_on, | ||
54 | 0 ^ pwmbl->pdata->on_active_low); | ||
55 | } | ||
56 | pwm_channel_writel(&pwmbl->pwmc, PWM_CUPD, pwm_duty); | 60 | pwm_channel_writel(&pwmbl->pwmc, PWM_CUPD, pwm_duty); |
57 | pwm_channel_disable(&pwmbl->pwmc); | 61 | pwm_channel_disable(&pwmbl->pwmc); |
58 | } else { | 62 | } else { |
59 | pwm_channel_enable(&pwmbl->pwmc); | 63 | pwm_channel_enable(&pwmbl->pwmc); |
60 | pwm_channel_writel(&pwmbl->pwmc, PWM_CUPD, pwm_duty); | 64 | pwm_channel_writel(&pwmbl->pwmc, PWM_CUPD, pwm_duty); |
61 | if (pwmbl->gpio_on != -1) { | 65 | atmel_pwm_bl_set_gpio_on(pwmbl, 1); |
62 | gpio_set_value(pwmbl->gpio_on, | ||
63 | 1 ^ pwmbl->pdata->on_active_low); | ||
64 | } | ||
65 | } | 66 | } |
66 | 67 | ||
67 | return 0; | 68 | return 0; |
@@ -70,17 +71,16 @@ static int atmel_pwm_bl_set_intensity(struct backlight_device *bd) | |||
70 | static int atmel_pwm_bl_get_intensity(struct backlight_device *bd) | 71 | static int atmel_pwm_bl_get_intensity(struct backlight_device *bd) |
71 | { | 72 | { |
72 | struct atmel_pwm_bl *pwmbl = bl_get_data(bd); | 73 | struct atmel_pwm_bl *pwmbl = bl_get_data(bd); |
73 | u8 intensity; | 74 | u32 cdty; |
75 | u32 intensity; | ||
74 | 76 | ||
75 | if (pwmbl->pdata->pwm_active_low) { | 77 | cdty = pwm_channel_readl(&pwmbl->pwmc, PWM_CDTY); |
76 | intensity = pwm_channel_readl(&pwmbl->pwmc, PWM_CDTY) - | 78 | if (pwmbl->pdata->pwm_active_low) |
77 | pwmbl->pdata->pwm_duty_min; | 79 | intensity = cdty - pwmbl->pdata->pwm_duty_min; |
78 | } else { | 80 | else |
79 | intensity = pwmbl->pdata->pwm_duty_max - | 81 | intensity = pwmbl->pdata->pwm_duty_max - cdty; |
80 | pwm_channel_readl(&pwmbl->pwmc, PWM_CDTY); | ||
81 | } | ||
82 | 82 | ||
83 | return intensity; | 83 | return intensity & 0xffff; |
84 | } | 84 | } |
85 | 85 | ||
86 | static int atmel_pwm_bl_init_pwm(struct atmel_pwm_bl *pwmbl) | 86 | static int atmel_pwm_bl_init_pwm(struct atmel_pwm_bl *pwmbl) |
@@ -124,46 +124,40 @@ static int atmel_pwm_bl_probe(struct platform_device *pdev) | |||
124 | const struct atmel_pwm_bl_platform_data *pdata; | 124 | const struct atmel_pwm_bl_platform_data *pdata; |
125 | struct backlight_device *bldev; | 125 | struct backlight_device *bldev; |
126 | struct atmel_pwm_bl *pwmbl; | 126 | struct atmel_pwm_bl *pwmbl; |
127 | unsigned long flags; | ||
127 | int retval; | 128 | int retval; |
128 | 129 | ||
130 | pdata = dev_get_platdata(&pdev->dev); | ||
131 | if (!pdata) | ||
132 | return -ENODEV; | ||
133 | |||
134 | if (pdata->pwm_compare_max < pdata->pwm_duty_max || | ||
135 | pdata->pwm_duty_min > pdata->pwm_duty_max || | ||
136 | pdata->pwm_frequency == 0) | ||
137 | return -EINVAL; | ||
138 | |||
129 | pwmbl = devm_kzalloc(&pdev->dev, sizeof(struct atmel_pwm_bl), | 139 | pwmbl = devm_kzalloc(&pdev->dev, sizeof(struct atmel_pwm_bl), |
130 | GFP_KERNEL); | 140 | GFP_KERNEL); |
131 | if (!pwmbl) | 141 | if (!pwmbl) |
132 | return -ENOMEM; | 142 | return -ENOMEM; |
133 | 143 | ||
134 | pwmbl->pdev = pdev; | 144 | pwmbl->pdev = pdev; |
135 | |||
136 | pdata = pdev->dev.platform_data; | ||
137 | if (!pdata) { | ||
138 | retval = -ENODEV; | ||
139 | goto err_free_mem; | ||
140 | } | ||
141 | |||
142 | if (pdata->pwm_compare_max < pdata->pwm_duty_max || | ||
143 | pdata->pwm_duty_min > pdata->pwm_duty_max || | ||
144 | pdata->pwm_frequency == 0) { | ||
145 | retval = -EINVAL; | ||
146 | goto err_free_mem; | ||
147 | } | ||
148 | |||
149 | pwmbl->pdata = pdata; | 145 | pwmbl->pdata = pdata; |
150 | pwmbl->gpio_on = pdata->gpio_on; | 146 | pwmbl->gpio_on = pdata->gpio_on; |
151 | 147 | ||
152 | retval = pwm_channel_alloc(pdata->pwm_channel, &pwmbl->pwmc); | 148 | retval = pwm_channel_alloc(pdata->pwm_channel, &pwmbl->pwmc); |
153 | if (retval) | 149 | if (retval) |
154 | goto err_free_mem; | 150 | return retval; |
155 | |||
156 | if (pwmbl->gpio_on != -1) { | ||
157 | retval = devm_gpio_request(&pdev->dev, pwmbl->gpio_on, | ||
158 | "gpio_atmel_pwm_bl"); | ||
159 | if (retval) { | ||
160 | pwmbl->gpio_on = -1; | ||
161 | goto err_free_pwm; | ||
162 | } | ||
163 | 151 | ||
152 | if (gpio_is_valid(pwmbl->gpio_on)) { | ||
164 | /* Turn display off by default. */ | 153 | /* Turn display off by default. */ |
165 | retval = gpio_direction_output(pwmbl->gpio_on, | 154 | if (pdata->on_active_low) |
166 | 0 ^ pdata->on_active_low); | 155 | flags = GPIOF_OUT_INIT_HIGH; |
156 | else | ||
157 | flags = GPIOF_OUT_INIT_LOW; | ||
158 | |||
159 | retval = devm_gpio_request_one(&pdev->dev, pwmbl->gpio_on, | ||
160 | flags, "gpio_atmel_pwm_bl"); | ||
167 | if (retval) | 161 | if (retval) |
168 | goto err_free_pwm; | 162 | goto err_free_pwm; |
169 | } | 163 | } |
@@ -171,8 +165,9 @@ static int atmel_pwm_bl_probe(struct platform_device *pdev) | |||
171 | memset(&props, 0, sizeof(struct backlight_properties)); | 165 | memset(&props, 0, sizeof(struct backlight_properties)); |
172 | props.type = BACKLIGHT_RAW; | 166 | props.type = BACKLIGHT_RAW; |
173 | props.max_brightness = pdata->pwm_duty_max - pdata->pwm_duty_min; | 167 | props.max_brightness = pdata->pwm_duty_max - pdata->pwm_duty_min; |
174 | bldev = backlight_device_register("atmel-pwm-bl", &pdev->dev, pwmbl, | 168 | bldev = devm_backlight_device_register(&pdev->dev, "atmel-pwm-bl", |
175 | &atmel_pwm_bl_ops, &props); | 169 | &pdev->dev, pwmbl, &atmel_pwm_bl_ops, |
170 | &props); | ||
176 | if (IS_ERR(bldev)) { | 171 | if (IS_ERR(bldev)) { |
177 | retval = PTR_ERR(bldev); | 172 | retval = PTR_ERR(bldev); |
178 | goto err_free_pwm; | 173 | goto err_free_pwm; |
@@ -188,17 +183,15 @@ static int atmel_pwm_bl_probe(struct platform_device *pdev) | |||
188 | 183 | ||
189 | retval = atmel_pwm_bl_init_pwm(pwmbl); | 184 | retval = atmel_pwm_bl_init_pwm(pwmbl); |
190 | if (retval) | 185 | if (retval) |
191 | goto err_free_bl_dev; | 186 | goto err_free_pwm; |
192 | 187 | ||
193 | atmel_pwm_bl_set_intensity(bldev); | 188 | atmel_pwm_bl_set_intensity(bldev); |
194 | 189 | ||
195 | return 0; | 190 | return 0; |
196 | 191 | ||
197 | err_free_bl_dev: | ||
198 | backlight_device_unregister(bldev); | ||
199 | err_free_pwm: | 192 | err_free_pwm: |
200 | pwm_channel_free(&pwmbl->pwmc); | 193 | pwm_channel_free(&pwmbl->pwmc); |
201 | err_free_mem: | 194 | |
202 | return retval; | 195 | return retval; |
203 | } | 196 | } |
204 | 197 | ||
@@ -206,11 +199,9 @@ static int atmel_pwm_bl_remove(struct platform_device *pdev) | |||
206 | { | 199 | { |
207 | struct atmel_pwm_bl *pwmbl = platform_get_drvdata(pdev); | 200 | struct atmel_pwm_bl *pwmbl = platform_get_drvdata(pdev); |
208 | 201 | ||
209 | if (pwmbl->gpio_on != -1) | 202 | atmel_pwm_bl_set_gpio_on(pwmbl, 0); |
210 | gpio_set_value(pwmbl->gpio_on, 0); | ||
211 | pwm_channel_disable(&pwmbl->pwmc); | 203 | pwm_channel_disable(&pwmbl->pwmc); |
212 | pwm_channel_free(&pwmbl->pwmc); | 204 | pwm_channel_free(&pwmbl->pwmc); |
213 | backlight_device_unregister(pwmbl->bldev); | ||
214 | 205 | ||
215 | return 0; | 206 | return 0; |
216 | } | 207 | } |
@@ -229,3 +220,4 @@ module_platform_driver(atmel_pwm_bl_driver); | |||
229 | MODULE_AUTHOR("Hans-Christian egtvedt <hans-christian.egtvedt@atmel.com>"); | 220 | MODULE_AUTHOR("Hans-Christian egtvedt <hans-christian.egtvedt@atmel.com>"); |
230 | MODULE_DESCRIPTION("Atmel PWM backlight driver"); | 221 | MODULE_DESCRIPTION("Atmel PWM backlight driver"); |
231 | MODULE_LICENSE("GPL"); | 222 | MODULE_LICENSE("GPL"); |
223 | MODULE_ALIAS("platform:atmel-pwm-bl"); | ||
diff --git a/drivers/video/backlight/bd6107.c b/drivers/video/backlight/bd6107.c index 15e3294b29fe..16dd9bc625bd 100644 --- a/drivers/video/backlight/bd6107.c +++ b/drivers/video/backlight/bd6107.c | |||
@@ -128,7 +128,7 @@ static const struct backlight_ops bd6107_backlight_ops = { | |||
128 | static int bd6107_probe(struct i2c_client *client, | 128 | static int bd6107_probe(struct i2c_client *client, |
129 | const struct i2c_device_id *id) | 129 | const struct i2c_device_id *id) |
130 | { | 130 | { |
131 | struct bd6107_platform_data *pdata = client->dev.platform_data; | 131 | struct bd6107_platform_data *pdata = dev_get_platdata(&client->dev); |
132 | struct backlight_device *backlight; | 132 | struct backlight_device *backlight; |
133 | struct backlight_properties props; | 133 | struct backlight_properties props; |
134 | struct bd6107 *bd; | 134 | struct bd6107 *bd; |
@@ -166,7 +166,8 @@ static int bd6107_probe(struct i2c_client *client, | |||
166 | props.brightness = clamp_t(unsigned int, pdata->def_value, 0, | 166 | props.brightness = clamp_t(unsigned int, pdata->def_value, 0, |
167 | props.max_brightness); | 167 | props.max_brightness); |
168 | 168 | ||
169 | backlight = backlight_device_register(dev_name(&client->dev), | 169 | backlight = devm_backlight_device_register(&client->dev, |
170 | dev_name(&client->dev), | ||
170 | &bd->client->dev, bd, | 171 | &bd->client->dev, bd, |
171 | &bd6107_backlight_ops, &props); | 172 | &bd6107_backlight_ops, &props); |
172 | if (IS_ERR(backlight)) { | 173 | if (IS_ERR(backlight)) { |
@@ -186,7 +187,6 @@ static int bd6107_remove(struct i2c_client *client) | |||
186 | 187 | ||
187 | backlight->props.brightness = 0; | 188 | backlight->props.brightness = 0; |
188 | backlight_update_status(backlight); | 189 | backlight_update_status(backlight); |
189 | backlight_device_unregister(backlight); | ||
190 | 190 | ||
191 | return 0; | 191 | return 0; |
192 | } | 192 | } |
diff --git a/drivers/video/backlight/corgi_lcd.c b/drivers/video/backlight/corgi_lcd.c index c97867a717a7..db8db5fa6583 100644 --- a/drivers/video/backlight/corgi_lcd.c +++ b/drivers/video/backlight/corgi_lcd.c | |||
@@ -533,7 +533,7 @@ static int setup_gpio_backlight(struct corgi_lcd *lcd, | |||
533 | static int corgi_lcd_probe(struct spi_device *spi) | 533 | static int corgi_lcd_probe(struct spi_device *spi) |
534 | { | 534 | { |
535 | struct backlight_properties props; | 535 | struct backlight_properties props; |
536 | struct corgi_lcd_platform_data *pdata = spi->dev.platform_data; | 536 | struct corgi_lcd_platform_data *pdata = dev_get_platdata(&spi->dev); |
537 | struct corgi_lcd *lcd; | 537 | struct corgi_lcd *lcd; |
538 | int ret = 0; | 538 | int ret = 0; |
539 | 539 | ||
@@ -550,8 +550,8 @@ static int corgi_lcd_probe(struct spi_device *spi) | |||
550 | 550 | ||
551 | lcd->spi_dev = spi; | 551 | lcd->spi_dev = spi; |
552 | 552 | ||
553 | lcd->lcd_dev = lcd_device_register("corgi_lcd", &spi->dev, | 553 | lcd->lcd_dev = devm_lcd_device_register(&spi->dev, "corgi_lcd", |
554 | lcd, &corgi_lcd_ops); | 554 | &spi->dev, lcd, &corgi_lcd_ops); |
555 | if (IS_ERR(lcd->lcd_dev)) | 555 | if (IS_ERR(lcd->lcd_dev)) |
556 | return PTR_ERR(lcd->lcd_dev); | 556 | return PTR_ERR(lcd->lcd_dev); |
557 | 557 | ||
@@ -561,18 +561,18 @@ static int corgi_lcd_probe(struct spi_device *spi) | |||
561 | memset(&props, 0, sizeof(struct backlight_properties)); | 561 | memset(&props, 0, sizeof(struct backlight_properties)); |
562 | props.type = BACKLIGHT_RAW; | 562 | props.type = BACKLIGHT_RAW; |
563 | props.max_brightness = pdata->max_intensity; | 563 | props.max_brightness = pdata->max_intensity; |
564 | lcd->bl_dev = backlight_device_register("corgi_bl", &spi->dev, lcd, | 564 | lcd->bl_dev = devm_backlight_device_register(&spi->dev, "corgi_bl", |
565 | &corgi_bl_ops, &props); | 565 | &spi->dev, lcd, &corgi_bl_ops, |
566 | if (IS_ERR(lcd->bl_dev)) { | 566 | &props); |
567 | ret = PTR_ERR(lcd->bl_dev); | 567 | if (IS_ERR(lcd->bl_dev)) |
568 | goto err_unregister_lcd; | 568 | return PTR_ERR(lcd->bl_dev); |
569 | } | 569 | |
570 | lcd->bl_dev->props.brightness = pdata->default_intensity; | 570 | lcd->bl_dev->props.brightness = pdata->default_intensity; |
571 | lcd->bl_dev->props.power = FB_BLANK_UNBLANK; | 571 | lcd->bl_dev->props.power = FB_BLANK_UNBLANK; |
572 | 572 | ||
573 | ret = setup_gpio_backlight(lcd, pdata); | 573 | ret = setup_gpio_backlight(lcd, pdata); |
574 | if (ret) | 574 | if (ret) |
575 | goto err_unregister_bl; | 575 | return ret; |
576 | 576 | ||
577 | lcd->kick_battery = pdata->kick_battery; | 577 | lcd->kick_battery = pdata->kick_battery; |
578 | 578 | ||
@@ -583,12 +583,6 @@ static int corgi_lcd_probe(struct spi_device *spi) | |||
583 | lcd->limit_mask = pdata->limit_mask; | 583 | lcd->limit_mask = pdata->limit_mask; |
584 | the_corgi_lcd = lcd; | 584 | the_corgi_lcd = lcd; |
585 | return 0; | 585 | return 0; |
586 | |||
587 | err_unregister_bl: | ||
588 | backlight_device_unregister(lcd->bl_dev); | ||
589 | err_unregister_lcd: | ||
590 | lcd_device_unregister(lcd->lcd_dev); | ||
591 | return ret; | ||
592 | } | 586 | } |
593 | 587 | ||
594 | static int corgi_lcd_remove(struct spi_device *spi) | 588 | static int corgi_lcd_remove(struct spi_device *spi) |
@@ -598,11 +592,7 @@ static int corgi_lcd_remove(struct spi_device *spi) | |||
598 | lcd->bl_dev->props.power = FB_BLANK_UNBLANK; | 592 | lcd->bl_dev->props.power = FB_BLANK_UNBLANK; |
599 | lcd->bl_dev->props.brightness = 0; | 593 | lcd->bl_dev->props.brightness = 0; |
600 | backlight_update_status(lcd->bl_dev); | 594 | backlight_update_status(lcd->bl_dev); |
601 | backlight_device_unregister(lcd->bl_dev); | ||
602 | |||
603 | corgi_lcd_set_power(lcd->lcd_dev, FB_BLANK_POWERDOWN); | 595 | corgi_lcd_set_power(lcd->lcd_dev, FB_BLANK_POWERDOWN); |
604 | lcd_device_unregister(lcd->lcd_dev); | ||
605 | |||
606 | return 0; | 596 | return 0; |
607 | } | 597 | } |
608 | 598 | ||
diff --git a/drivers/video/backlight/cr_bllcd.c b/drivers/video/backlight/cr_bllcd.c index 37bae801e23b..f3fed9ef745f 100644 --- a/drivers/video/backlight/cr_bllcd.c +++ b/drivers/video/backlight/cr_bllcd.c | |||
@@ -195,16 +195,17 @@ static int cr_backlight_probe(struct platform_device *pdev) | |||
195 | 195 | ||
196 | memset(&props, 0, sizeof(struct backlight_properties)); | 196 | memset(&props, 0, sizeof(struct backlight_properties)); |
197 | props.type = BACKLIGHT_RAW; | 197 | props.type = BACKLIGHT_RAW; |
198 | bdp = backlight_device_register("cr-backlight", &pdev->dev, NULL, | 198 | bdp = devm_backlight_device_register(&pdev->dev, "cr-backlight", |
199 | &cr_backlight_ops, &props); | 199 | &pdev->dev, NULL, &cr_backlight_ops, |
200 | &props); | ||
200 | if (IS_ERR(bdp)) { | 201 | if (IS_ERR(bdp)) { |
201 | pci_dev_put(lpc_dev); | 202 | pci_dev_put(lpc_dev); |
202 | return PTR_ERR(bdp); | 203 | return PTR_ERR(bdp); |
203 | } | 204 | } |
204 | 205 | ||
205 | ldp = lcd_device_register("cr-lcd", &pdev->dev, NULL, &cr_lcd_ops); | 206 | ldp = devm_lcd_device_register(&pdev->dev, "cr-lcd", &pdev->dev, NULL, |
207 | &cr_lcd_ops); | ||
206 | if (IS_ERR(ldp)) { | 208 | if (IS_ERR(ldp)) { |
207 | backlight_device_unregister(bdp); | ||
208 | pci_dev_put(lpc_dev); | 209 | pci_dev_put(lpc_dev); |
209 | return PTR_ERR(ldp); | 210 | return PTR_ERR(ldp); |
210 | } | 211 | } |
@@ -215,8 +216,6 @@ static int cr_backlight_probe(struct platform_device *pdev) | |||
215 | 216 | ||
216 | crp = devm_kzalloc(&pdev->dev, sizeof(*crp), GFP_KERNEL); | 217 | crp = devm_kzalloc(&pdev->dev, sizeof(*crp), GFP_KERNEL); |
217 | if (!crp) { | 218 | if (!crp) { |
218 | lcd_device_unregister(ldp); | ||
219 | backlight_device_unregister(bdp); | ||
220 | pci_dev_put(lpc_dev); | 219 | pci_dev_put(lpc_dev); |
221 | return -ENOMEM; | 220 | return -ENOMEM; |
222 | } | 221 | } |
@@ -241,8 +240,6 @@ static int cr_backlight_remove(struct platform_device *pdev) | |||
241 | crp->cr_backlight_device->props.max_brightness = 0; | 240 | crp->cr_backlight_device->props.max_brightness = 0; |
242 | cr_backlight_set_intensity(crp->cr_backlight_device); | 241 | cr_backlight_set_intensity(crp->cr_backlight_device); |
243 | cr_lcd_set_power(crp->cr_lcd_device, FB_BLANK_POWERDOWN); | 242 | cr_lcd_set_power(crp->cr_lcd_device, FB_BLANK_POWERDOWN); |
244 | backlight_device_unregister(crp->cr_backlight_device); | ||
245 | lcd_device_unregister(crp->cr_lcd_device); | ||
246 | pci_dev_put(lpc_dev); | 243 | pci_dev_put(lpc_dev); |
247 | 244 | ||
248 | return 0; | 245 | return 0; |
diff --git a/drivers/video/backlight/da903x_bl.c b/drivers/video/backlight/da903x_bl.c index 67cadd30e273..12c5d840c590 100644 --- a/drivers/video/backlight/da903x_bl.c +++ b/drivers/video/backlight/da903x_bl.c | |||
@@ -109,7 +109,7 @@ static const struct backlight_ops da903x_backlight_ops = { | |||
109 | 109 | ||
110 | static int da903x_backlight_probe(struct platform_device *pdev) | 110 | static int da903x_backlight_probe(struct platform_device *pdev) |
111 | { | 111 | { |
112 | struct da9034_backlight_pdata *pdata = pdev->dev.platform_data; | 112 | struct da9034_backlight_pdata *pdata = dev_get_platdata(&pdev->dev); |
113 | struct da903x_backlight_data *data; | 113 | struct da903x_backlight_data *data; |
114 | struct backlight_device *bl; | 114 | struct backlight_device *bl; |
115 | struct backlight_properties props; | 115 | struct backlight_properties props; |
@@ -144,8 +144,9 @@ static int da903x_backlight_probe(struct platform_device *pdev) | |||
144 | memset(&props, 0, sizeof(props)); | 144 | memset(&props, 0, sizeof(props)); |
145 | props.type = BACKLIGHT_RAW; | 145 | props.type = BACKLIGHT_RAW; |
146 | props.max_brightness = max_brightness; | 146 | props.max_brightness = max_brightness; |
147 | bl = backlight_device_register(pdev->name, data->da903x_dev, data, | 147 | bl = devm_backlight_device_register(&pdev->dev, pdev->name, |
148 | &da903x_backlight_ops, &props); | 148 | data->da903x_dev, data, |
149 | &da903x_backlight_ops, &props); | ||
149 | if (IS_ERR(bl)) { | 150 | if (IS_ERR(bl)) { |
150 | dev_err(&pdev->dev, "failed to register backlight\n"); | 151 | dev_err(&pdev->dev, "failed to register backlight\n"); |
151 | return PTR_ERR(bl); | 152 | return PTR_ERR(bl); |
@@ -158,21 +159,12 @@ static int da903x_backlight_probe(struct platform_device *pdev) | |||
158 | return 0; | 159 | return 0; |
159 | } | 160 | } |
160 | 161 | ||
161 | static int da903x_backlight_remove(struct platform_device *pdev) | ||
162 | { | ||
163 | struct backlight_device *bl = platform_get_drvdata(pdev); | ||
164 | |||
165 | backlight_device_unregister(bl); | ||
166 | return 0; | ||
167 | } | ||
168 | |||
169 | static struct platform_driver da903x_backlight_driver = { | 162 | static struct platform_driver da903x_backlight_driver = { |
170 | .driver = { | 163 | .driver = { |
171 | .name = "da903x-backlight", | 164 | .name = "da903x-backlight", |
172 | .owner = THIS_MODULE, | 165 | .owner = THIS_MODULE, |
173 | }, | 166 | }, |
174 | .probe = da903x_backlight_probe, | 167 | .probe = da903x_backlight_probe, |
175 | .remove = da903x_backlight_remove, | ||
176 | }; | 168 | }; |
177 | 169 | ||
178 | module_platform_driver(da903x_backlight_driver); | 170 | module_platform_driver(da903x_backlight_driver); |
diff --git a/drivers/video/backlight/da9052_bl.c b/drivers/video/backlight/da9052_bl.c index 842da5a3ac4f..20d55becaa74 100644 --- a/drivers/video/backlight/da9052_bl.c +++ b/drivers/video/backlight/da9052_bl.c | |||
@@ -125,8 +125,9 @@ static int da9052_backlight_probe(struct platform_device *pdev) | |||
125 | props.type = BACKLIGHT_RAW; | 125 | props.type = BACKLIGHT_RAW; |
126 | props.max_brightness = DA9052_MAX_BRIGHTNESS; | 126 | props.max_brightness = DA9052_MAX_BRIGHTNESS; |
127 | 127 | ||
128 | bl = backlight_device_register(pdev->name, wleds->da9052->dev, wleds, | 128 | bl = devm_backlight_device_register(&pdev->dev, pdev->name, |
129 | &da9052_backlight_ops, &props); | 129 | wleds->da9052->dev, wleds, |
130 | &da9052_backlight_ops, &props); | ||
130 | if (IS_ERR(bl)) { | 131 | if (IS_ERR(bl)) { |
131 | dev_err(&pdev->dev, "Failed to register backlight\n"); | 132 | dev_err(&pdev->dev, "Failed to register backlight\n"); |
132 | return PTR_ERR(bl); | 133 | return PTR_ERR(bl); |
@@ -147,7 +148,6 @@ static int da9052_backlight_remove(struct platform_device *pdev) | |||
147 | wleds->brightness = 0; | 148 | wleds->brightness = 0; |
148 | wleds->state = DA9052_WLEDS_OFF; | 149 | wleds->state = DA9052_WLEDS_OFF; |
149 | da9052_adjust_wled_brightness(wleds); | 150 | da9052_adjust_wled_brightness(wleds); |
150 | backlight_device_unregister(bl); | ||
151 | 151 | ||
152 | return 0; | 152 | return 0; |
153 | } | 153 | } |
diff --git a/drivers/video/backlight/ep93xx_bl.c b/drivers/video/backlight/ep93xx_bl.c index 018368ba4124..0d1f633c6480 100644 --- a/drivers/video/backlight/ep93xx_bl.c +++ b/drivers/video/backlight/ep93xx_bl.c | |||
@@ -92,8 +92,8 @@ static int ep93xxbl_probe(struct platform_device *dev) | |||
92 | memset(&props, 0, sizeof(struct backlight_properties)); | 92 | memset(&props, 0, sizeof(struct backlight_properties)); |
93 | props.type = BACKLIGHT_RAW; | 93 | props.type = BACKLIGHT_RAW; |
94 | props.max_brightness = EP93XX_MAX_BRIGHT; | 94 | props.max_brightness = EP93XX_MAX_BRIGHT; |
95 | bl = backlight_device_register(dev->name, &dev->dev, ep93xxbl, | 95 | bl = devm_backlight_device_register(&dev->dev, dev->name, &dev->dev, |
96 | &ep93xxbl_ops, &props); | 96 | ep93xxbl, &ep93xxbl_ops, &props); |
97 | if (IS_ERR(bl)) | 97 | if (IS_ERR(bl)) |
98 | return PTR_ERR(bl); | 98 | return PTR_ERR(bl); |
99 | 99 | ||
@@ -106,14 +106,6 @@ static int ep93xxbl_probe(struct platform_device *dev) | |||
106 | return 0; | 106 | return 0; |
107 | } | 107 | } |
108 | 108 | ||
109 | static int ep93xxbl_remove(struct platform_device *dev) | ||
110 | { | ||
111 | struct backlight_device *bl = platform_get_drvdata(dev); | ||
112 | |||
113 | backlight_device_unregister(bl); | ||
114 | return 0; | ||
115 | } | ||
116 | |||
117 | #ifdef CONFIG_PM_SLEEP | 109 | #ifdef CONFIG_PM_SLEEP |
118 | static int ep93xxbl_suspend(struct device *dev) | 110 | static int ep93xxbl_suspend(struct device *dev) |
119 | { | 111 | { |
@@ -140,7 +132,6 @@ static struct platform_driver ep93xxbl_driver = { | |||
140 | .pm = &ep93xxbl_pm_ops, | 132 | .pm = &ep93xxbl_pm_ops, |
141 | }, | 133 | }, |
142 | .probe = ep93xxbl_probe, | 134 | .probe = ep93xxbl_probe, |
143 | .remove = ep93xxbl_remove, | ||
144 | }; | 135 | }; |
145 | 136 | ||
146 | module_platform_driver(ep93xxbl_driver); | 137 | module_platform_driver(ep93xxbl_driver); |
diff --git a/drivers/video/backlight/generic_bl.c b/drivers/video/backlight/generic_bl.c index 19e393b41438..5d8d65200db7 100644 --- a/drivers/video/backlight/generic_bl.c +++ b/drivers/video/backlight/generic_bl.c | |||
@@ -79,7 +79,7 @@ static const struct backlight_ops genericbl_ops = { | |||
79 | static int genericbl_probe(struct platform_device *pdev) | 79 | static int genericbl_probe(struct platform_device *pdev) |
80 | { | 80 | { |
81 | struct backlight_properties props; | 81 | struct backlight_properties props; |
82 | struct generic_bl_info *machinfo = pdev->dev.platform_data; | 82 | struct generic_bl_info *machinfo = dev_get_platdata(&pdev->dev); |
83 | const char *name = "generic-bl"; | 83 | const char *name = "generic-bl"; |
84 | struct backlight_device *bd; | 84 | struct backlight_device *bd; |
85 | 85 | ||
@@ -93,8 +93,8 @@ static int genericbl_probe(struct platform_device *pdev) | |||
93 | memset(&props, 0, sizeof(struct backlight_properties)); | 93 | memset(&props, 0, sizeof(struct backlight_properties)); |
94 | props.type = BACKLIGHT_RAW; | 94 | props.type = BACKLIGHT_RAW; |
95 | props.max_brightness = machinfo->max_intensity; | 95 | props.max_brightness = machinfo->max_intensity; |
96 | bd = backlight_device_register(name, &pdev->dev, NULL, &genericbl_ops, | 96 | bd = devm_backlight_device_register(&pdev->dev, name, &pdev->dev, |
97 | &props); | 97 | NULL, &genericbl_ops, &props); |
98 | if (IS_ERR(bd)) | 98 | if (IS_ERR(bd)) |
99 | return PTR_ERR(bd); | 99 | return PTR_ERR(bd); |
100 | 100 | ||
@@ -118,8 +118,6 @@ static int genericbl_remove(struct platform_device *pdev) | |||
118 | bd->props.brightness = 0; | 118 | bd->props.brightness = 0; |
119 | backlight_update_status(bd); | 119 | backlight_update_status(bd); |
120 | 120 | ||
121 | backlight_device_unregister(bd); | ||
122 | |||
123 | dev_info(&pdev->dev, "Generic Backlight Driver Unloaded\n"); | 121 | dev_info(&pdev->dev, "Generic Backlight Driver Unloaded\n"); |
124 | return 0; | 122 | return 0; |
125 | } | 123 | } |
diff --git a/drivers/video/backlight/gpio_backlight.c b/drivers/video/backlight/gpio_backlight.c index 5fa217f9f445..81fb12770c2a 100644 --- a/drivers/video/backlight/gpio_backlight.c +++ b/drivers/video/backlight/gpio_backlight.c | |||
@@ -62,7 +62,8 @@ static const struct backlight_ops gpio_backlight_ops = { | |||
62 | 62 | ||
63 | static int gpio_backlight_probe(struct platform_device *pdev) | 63 | static int gpio_backlight_probe(struct platform_device *pdev) |
64 | { | 64 | { |
65 | struct gpio_backlight_platform_data *pdata = pdev->dev.platform_data; | 65 | struct gpio_backlight_platform_data *pdata = |
66 | dev_get_platdata(&pdev->dev); | ||
66 | struct backlight_properties props; | 67 | struct backlight_properties props; |
67 | struct backlight_device *bl; | 68 | struct backlight_device *bl; |
68 | struct gpio_backlight *gbl; | 69 | struct gpio_backlight *gbl; |
@@ -94,8 +95,9 @@ static int gpio_backlight_probe(struct platform_device *pdev) | |||
94 | memset(&props, 0, sizeof(props)); | 95 | memset(&props, 0, sizeof(props)); |
95 | props.type = BACKLIGHT_RAW; | 96 | props.type = BACKLIGHT_RAW; |
96 | props.max_brightness = 1; | 97 | props.max_brightness = 1; |
97 | bl = backlight_device_register(dev_name(&pdev->dev), &pdev->dev, gbl, | 98 | bl = devm_backlight_device_register(&pdev->dev, dev_name(&pdev->dev), |
98 | &gpio_backlight_ops, &props); | 99 | &pdev->dev, gbl, &gpio_backlight_ops, |
100 | &props); | ||
99 | if (IS_ERR(bl)) { | 101 | if (IS_ERR(bl)) { |
100 | dev_err(&pdev->dev, "failed to register backlight\n"); | 102 | dev_err(&pdev->dev, "failed to register backlight\n"); |
101 | return PTR_ERR(bl); | 103 | return PTR_ERR(bl); |
@@ -108,21 +110,12 @@ static int gpio_backlight_probe(struct platform_device *pdev) | |||
108 | return 0; | 110 | return 0; |
109 | } | 111 | } |
110 | 112 | ||
111 | static int gpio_backlight_remove(struct platform_device *pdev) | ||
112 | { | ||
113 | struct backlight_device *bl = platform_get_drvdata(pdev); | ||
114 | |||
115 | backlight_device_unregister(bl); | ||
116 | return 0; | ||
117 | } | ||
118 | |||
119 | static struct platform_driver gpio_backlight_driver = { | 113 | static struct platform_driver gpio_backlight_driver = { |
120 | .driver = { | 114 | .driver = { |
121 | .name = "gpio-backlight", | 115 | .name = "gpio-backlight", |
122 | .owner = THIS_MODULE, | 116 | .owner = THIS_MODULE, |
123 | }, | 117 | }, |
124 | .probe = gpio_backlight_probe, | 118 | .probe = gpio_backlight_probe, |
125 | .remove = gpio_backlight_remove, | ||
126 | }; | 119 | }; |
127 | 120 | ||
128 | module_platform_driver(gpio_backlight_driver); | 121 | module_platform_driver(gpio_backlight_driver); |
diff --git a/drivers/video/backlight/hx8357.c b/drivers/video/backlight/hx8357.c index c7af8c45ab8a..985e854e244b 100644 --- a/drivers/video/backlight/hx8357.c +++ b/drivers/video/backlight/hx8357.c | |||
@@ -648,7 +648,8 @@ static int hx8357_probe(struct spi_device *spi) | |||
648 | lcd->use_im_pins = 0; | 648 | lcd->use_im_pins = 0; |
649 | } | 649 | } |
650 | 650 | ||
651 | lcdev = lcd_device_register("mxsfb", &spi->dev, lcd, &hx8357_ops); | 651 | lcdev = devm_lcd_device_register(&spi->dev, "mxsfb", &spi->dev, lcd, |
652 | &hx8357_ops); | ||
652 | if (IS_ERR(lcdev)) { | 653 | if (IS_ERR(lcdev)) { |
653 | ret = PTR_ERR(lcdev); | 654 | ret = PTR_ERR(lcdev); |
654 | return ret; | 655 | return ret; |
@@ -660,32 +661,19 @@ static int hx8357_probe(struct spi_device *spi) | |||
660 | ret = ((int (*)(struct lcd_device *))match->data)(lcdev); | 661 | ret = ((int (*)(struct lcd_device *))match->data)(lcdev); |
661 | if (ret) { | 662 | if (ret) { |
662 | dev_err(&spi->dev, "Couldn't initialize panel\n"); | 663 | dev_err(&spi->dev, "Couldn't initialize panel\n"); |
663 | goto init_error; | 664 | return ret; |
664 | } | 665 | } |
665 | 666 | ||
666 | dev_info(&spi->dev, "Panel probed\n"); | 667 | dev_info(&spi->dev, "Panel probed\n"); |
667 | 668 | ||
668 | return 0; | 669 | return 0; |
669 | |||
670 | init_error: | ||
671 | lcd_device_unregister(lcdev); | ||
672 | return ret; | ||
673 | } | ||
674 | |||
675 | static int hx8357_remove(struct spi_device *spi) | ||
676 | { | ||
677 | struct lcd_device *lcdev = spi_get_drvdata(spi); | ||
678 | |||
679 | lcd_device_unregister(lcdev); | ||
680 | return 0; | ||
681 | } | 670 | } |
682 | 671 | ||
683 | static struct spi_driver hx8357_driver = { | 672 | static struct spi_driver hx8357_driver = { |
684 | .probe = hx8357_probe, | 673 | .probe = hx8357_probe, |
685 | .remove = hx8357_remove, | ||
686 | .driver = { | 674 | .driver = { |
687 | .name = "hx8357", | 675 | .name = "hx8357", |
688 | .of_match_table = of_match_ptr(hx8357_dt_ids), | 676 | .of_match_table = hx8357_dt_ids, |
689 | }, | 677 | }, |
690 | }; | 678 | }; |
691 | 679 | ||
diff --git a/drivers/video/backlight/ili922x.c b/drivers/video/backlight/ili922x.c index d9f65c2d9b01..73464e4b4c74 100644 --- a/drivers/video/backlight/ili922x.c +++ b/drivers/video/backlight/ili922x.c | |||
@@ -513,8 +513,8 @@ static int ili922x_probe(struct spi_device *spi) | |||
513 | 513 | ||
514 | ili->power = FB_BLANK_POWERDOWN; | 514 | ili->power = FB_BLANK_POWERDOWN; |
515 | 515 | ||
516 | lcd = lcd_device_register("ili922xlcd", &spi->dev, ili, | 516 | lcd = devm_lcd_device_register(&spi->dev, "ili922xlcd", &spi->dev, ili, |
517 | &ili922x_ops); | 517 | &ili922x_ops); |
518 | if (IS_ERR(lcd)) { | 518 | if (IS_ERR(lcd)) { |
519 | dev_err(&spi->dev, "cannot register LCD\n"); | 519 | dev_err(&spi->dev, "cannot register LCD\n"); |
520 | return PTR_ERR(lcd); | 520 | return PTR_ERR(lcd); |
@@ -530,10 +530,7 @@ static int ili922x_probe(struct spi_device *spi) | |||
530 | 530 | ||
531 | static int ili922x_remove(struct spi_device *spi) | 531 | static int ili922x_remove(struct spi_device *spi) |
532 | { | 532 | { |
533 | struct ili922x *ili = spi_get_drvdata(spi); | ||
534 | |||
535 | ili922x_poweroff(spi); | 533 | ili922x_poweroff(spi); |
536 | lcd_device_unregister(ili->ld); | ||
537 | return 0; | 534 | return 0; |
538 | } | 535 | } |
539 | 536 | ||
diff --git a/drivers/video/backlight/ili9320.c b/drivers/video/backlight/ili9320.c index f8be90c5dedc..e2b8b40a9bd9 100644 --- a/drivers/video/backlight/ili9320.c +++ b/drivers/video/backlight/ili9320.c | |||
@@ -198,7 +198,7 @@ static void ili9320_setup_spi(struct ili9320 *ili, | |||
198 | int ili9320_probe_spi(struct spi_device *spi, | 198 | int ili9320_probe_spi(struct spi_device *spi, |
199 | struct ili9320_client *client) | 199 | struct ili9320_client *client) |
200 | { | 200 | { |
201 | struct ili9320_platdata *cfg = spi->dev.platform_data; | 201 | struct ili9320_platdata *cfg = dev_get_platdata(&spi->dev); |
202 | struct device *dev = &spi->dev; | 202 | struct device *dev = &spi->dev; |
203 | struct ili9320 *ili; | 203 | struct ili9320 *ili; |
204 | struct lcd_device *lcd; | 204 | struct lcd_device *lcd; |
@@ -235,7 +235,8 @@ int ili9320_probe_spi(struct spi_device *spi, | |||
235 | 235 | ||
236 | ili9320_setup_spi(ili, spi); | 236 | ili9320_setup_spi(ili, spi); |
237 | 237 | ||
238 | lcd = lcd_device_register("ili9320", dev, ili, &ili9320_ops); | 238 | lcd = devm_lcd_device_register(&spi->dev, "ili9320", dev, ili, |
239 | &ili9320_ops); | ||
239 | if (IS_ERR(lcd)) { | 240 | if (IS_ERR(lcd)) { |
240 | dev_err(dev, "failed to register lcd device\n"); | 241 | dev_err(dev, "failed to register lcd device\n"); |
241 | return PTR_ERR(lcd); | 242 | return PTR_ERR(lcd); |
@@ -248,24 +249,16 @@ int ili9320_probe_spi(struct spi_device *spi, | |||
248 | ret = ili9320_power(ili, FB_BLANK_UNBLANK); | 249 | ret = ili9320_power(ili, FB_BLANK_UNBLANK); |
249 | if (ret != 0) { | 250 | if (ret != 0) { |
250 | dev_err(dev, "failed to set lcd power state\n"); | 251 | dev_err(dev, "failed to set lcd power state\n"); |
251 | goto err_unregister; | 252 | return ret; |
252 | } | 253 | } |
253 | 254 | ||
254 | return 0; | 255 | return 0; |
255 | |||
256 | err_unregister: | ||
257 | lcd_device_unregister(lcd); | ||
258 | |||
259 | return ret; | ||
260 | } | 256 | } |
261 | EXPORT_SYMBOL_GPL(ili9320_probe_spi); | 257 | EXPORT_SYMBOL_GPL(ili9320_probe_spi); |
262 | 258 | ||
263 | int ili9320_remove(struct ili9320 *ili) | 259 | int ili9320_remove(struct ili9320 *ili) |
264 | { | 260 | { |
265 | ili9320_power(ili, FB_BLANK_POWERDOWN); | 261 | ili9320_power(ili, FB_BLANK_POWERDOWN); |
266 | |||
267 | lcd_device_unregister(ili->lcd); | ||
268 | |||
269 | return 0; | 262 | return 0; |
270 | } | 263 | } |
271 | EXPORT_SYMBOL_GPL(ili9320_remove); | 264 | EXPORT_SYMBOL_GPL(ili9320_remove); |
diff --git a/drivers/video/backlight/kb3886_bl.c b/drivers/video/backlight/kb3886_bl.c index bca6ccc74dfb..7592cc25c963 100644 --- a/drivers/video/backlight/kb3886_bl.c +++ b/drivers/video/backlight/kb3886_bl.c | |||
@@ -141,7 +141,7 @@ static const struct backlight_ops kb3886bl_ops = { | |||
141 | static int kb3886bl_probe(struct platform_device *pdev) | 141 | static int kb3886bl_probe(struct platform_device *pdev) |
142 | { | 142 | { |
143 | struct backlight_properties props; | 143 | struct backlight_properties props; |
144 | struct kb3886bl_machinfo *machinfo = pdev->dev.platform_data; | 144 | struct kb3886bl_machinfo *machinfo = dev_get_platdata(&pdev->dev); |
145 | 145 | ||
146 | bl_machinfo = machinfo; | 146 | bl_machinfo = machinfo; |
147 | if (!machinfo->limit_mask) | 147 | if (!machinfo->limit_mask) |
@@ -150,10 +150,10 @@ static int kb3886bl_probe(struct platform_device *pdev) | |||
150 | memset(&props, 0, sizeof(struct backlight_properties)); | 150 | memset(&props, 0, sizeof(struct backlight_properties)); |
151 | props.type = BACKLIGHT_RAW; | 151 | props.type = BACKLIGHT_RAW; |
152 | props.max_brightness = machinfo->max_intensity; | 152 | props.max_brightness = machinfo->max_intensity; |
153 | kb3886_backlight_device = backlight_device_register("kb3886-bl", | 153 | kb3886_backlight_device = devm_backlight_device_register(&pdev->dev, |
154 | &pdev->dev, NULL, | 154 | "kb3886-bl", &pdev->dev, |
155 | &kb3886bl_ops, | 155 | NULL, &kb3886bl_ops, |
156 | &props); | 156 | &props); |
157 | if (IS_ERR(kb3886_backlight_device)) | 157 | if (IS_ERR(kb3886_backlight_device)) |
158 | return PTR_ERR(kb3886_backlight_device); | 158 | return PTR_ERR(kb3886_backlight_device); |
159 | 159 | ||
@@ -166,18 +166,8 @@ static int kb3886bl_probe(struct platform_device *pdev) | |||
166 | return 0; | 166 | return 0; |
167 | } | 167 | } |
168 | 168 | ||
169 | static int kb3886bl_remove(struct platform_device *pdev) | ||
170 | { | ||
171 | struct backlight_device *bd = platform_get_drvdata(pdev); | ||
172 | |||
173 | backlight_device_unregister(bd); | ||
174 | |||
175 | return 0; | ||
176 | } | ||
177 | |||
178 | static struct platform_driver kb3886bl_driver = { | 169 | static struct platform_driver kb3886bl_driver = { |
179 | .probe = kb3886bl_probe, | 170 | .probe = kb3886bl_probe, |
180 | .remove = kb3886bl_remove, | ||
181 | .driver = { | 171 | .driver = { |
182 | .name = "kb3886-bl", | 172 | .name = "kb3886-bl", |
183 | .pm = &kb3886bl_pm_ops, | 173 | .pm = &kb3886bl_pm_ops, |
diff --git a/drivers/video/backlight/l4f00242t03.c b/drivers/video/backlight/l4f00242t03.c index a35a38c709cf..923eae2f85f8 100644 --- a/drivers/video/backlight/l4f00242t03.c +++ b/drivers/video/backlight/l4f00242t03.c | |||
@@ -48,7 +48,7 @@ static void l4f00242t03_reset(unsigned int gpio) | |||
48 | 48 | ||
49 | static void l4f00242t03_lcd_init(struct spi_device *spi) | 49 | static void l4f00242t03_lcd_init(struct spi_device *spi) |
50 | { | 50 | { |
51 | struct l4f00242t03_pdata *pdata = spi->dev.platform_data; | 51 | struct l4f00242t03_pdata *pdata = dev_get_platdata(&spi->dev); |
52 | struct l4f00242t03_priv *priv = spi_get_drvdata(spi); | 52 | struct l4f00242t03_priv *priv = spi_get_drvdata(spi); |
53 | const u16 cmd[] = { 0x36, param(0), 0x3A, param(0x60) }; | 53 | const u16 cmd[] = { 0x36, param(0), 0x3A, param(0x60) }; |
54 | int ret; | 54 | int ret; |
@@ -88,7 +88,7 @@ static void l4f00242t03_lcd_init(struct spi_device *spi) | |||
88 | 88 | ||
89 | static void l4f00242t03_lcd_powerdown(struct spi_device *spi) | 89 | static void l4f00242t03_lcd_powerdown(struct spi_device *spi) |
90 | { | 90 | { |
91 | struct l4f00242t03_pdata *pdata = spi->dev.platform_data; | 91 | struct l4f00242t03_pdata *pdata = dev_get_platdata(&spi->dev); |
92 | struct l4f00242t03_priv *priv = spi_get_drvdata(spi); | 92 | struct l4f00242t03_priv *priv = spi_get_drvdata(spi); |
93 | 93 | ||
94 | dev_dbg(&spi->dev, "Powering down LCD\n"); | 94 | dev_dbg(&spi->dev, "Powering down LCD\n"); |
@@ -171,7 +171,7 @@ static struct lcd_ops l4f_ops = { | |||
171 | static int l4f00242t03_probe(struct spi_device *spi) | 171 | static int l4f00242t03_probe(struct spi_device *spi) |
172 | { | 172 | { |
173 | struct l4f00242t03_priv *priv; | 173 | struct l4f00242t03_priv *priv; |
174 | struct l4f00242t03_pdata *pdata = spi->dev.platform_data; | 174 | struct l4f00242t03_pdata *pdata = dev_get_platdata(&spi->dev); |
175 | int ret; | 175 | int ret; |
176 | 176 | ||
177 | if (pdata == NULL) { | 177 | if (pdata == NULL) { |
diff --git a/drivers/video/backlight/ld9040.c b/drivers/video/backlight/ld9040.c index 1e0a3093ce50..506a6c236039 100644 --- a/drivers/video/backlight/ld9040.c +++ b/drivers/video/backlight/ld9040.c | |||
@@ -702,7 +702,7 @@ static int ld9040_probe(struct spi_device *spi) | |||
702 | lcd->spi = spi; | 702 | lcd->spi = spi; |
703 | lcd->dev = &spi->dev; | 703 | lcd->dev = &spi->dev; |
704 | 704 | ||
705 | lcd->lcd_pd = spi->dev.platform_data; | 705 | lcd->lcd_pd = dev_get_platdata(&spi->dev); |
706 | if (!lcd->lcd_pd) { | 706 | if (!lcd->lcd_pd) { |
707 | dev_err(&spi->dev, "platform data is NULL.\n"); | 707 | dev_err(&spi->dev, "platform data is NULL.\n"); |
708 | return -EINVAL; | 708 | return -EINVAL; |
@@ -716,7 +716,8 @@ static int ld9040_probe(struct spi_device *spi) | |||
716 | return ret; | 716 | return ret; |
717 | } | 717 | } |
718 | 718 | ||
719 | ld = lcd_device_register("ld9040", &spi->dev, lcd, &ld9040_lcd_ops); | 719 | ld = devm_lcd_device_register(&spi->dev, "ld9040", &spi->dev, lcd, |
720 | &ld9040_lcd_ops); | ||
720 | if (IS_ERR(ld)) | 721 | if (IS_ERR(ld)) |
721 | return PTR_ERR(ld); | 722 | return PTR_ERR(ld); |
722 | 723 | ||
@@ -726,12 +727,10 @@ static int ld9040_probe(struct spi_device *spi) | |||
726 | props.type = BACKLIGHT_RAW; | 727 | props.type = BACKLIGHT_RAW; |
727 | props.max_brightness = MAX_BRIGHTNESS; | 728 | props.max_brightness = MAX_BRIGHTNESS; |
728 | 729 | ||
729 | bd = backlight_device_register("ld9040-bl", &spi->dev, | 730 | bd = devm_backlight_device_register(&spi->dev, "ld9040-bl", &spi->dev, |
730 | lcd, &ld9040_backlight_ops, &props); | 731 | lcd, &ld9040_backlight_ops, &props); |
731 | if (IS_ERR(bd)) { | 732 | if (IS_ERR(bd)) |
732 | ret = PTR_ERR(bd); | 733 | return PTR_ERR(bd); |
733 | goto out_unregister_lcd; | ||
734 | } | ||
735 | 734 | ||
736 | bd->props.brightness = MAX_BRIGHTNESS; | 735 | bd->props.brightness = MAX_BRIGHTNESS; |
737 | lcd->bd = bd; | 736 | lcd->bd = bd; |
@@ -757,11 +756,6 @@ static int ld9040_probe(struct spi_device *spi) | |||
757 | 756 | ||
758 | dev_info(&spi->dev, "ld9040 panel driver has been probed.\n"); | 757 | dev_info(&spi->dev, "ld9040 panel driver has been probed.\n"); |
759 | return 0; | 758 | return 0; |
760 | |||
761 | out_unregister_lcd: | ||
762 | lcd_device_unregister(lcd->ld); | ||
763 | |||
764 | return ret; | ||
765 | } | 759 | } |
766 | 760 | ||
767 | static int ld9040_remove(struct spi_device *spi) | 761 | static int ld9040_remove(struct spi_device *spi) |
@@ -769,9 +763,6 @@ static int ld9040_remove(struct spi_device *spi) | |||
769 | struct ld9040 *lcd = spi_get_drvdata(spi); | 763 | struct ld9040 *lcd = spi_get_drvdata(spi); |
770 | 764 | ||
771 | ld9040_power(lcd, FB_BLANK_POWERDOWN); | 765 | ld9040_power(lcd, FB_BLANK_POWERDOWN); |
772 | backlight_device_unregister(lcd->bd); | ||
773 | lcd_device_unregister(lcd->ld); | ||
774 | |||
775 | return 0; | 766 | return 0; |
776 | } | 767 | } |
777 | 768 | ||
diff --git a/drivers/video/backlight/ld9040_gamma.h b/drivers/video/backlight/ld9040_gamma.h index 038d9c86ec03..c5e586d97385 100644 --- a/drivers/video/backlight/ld9040_gamma.h +++ b/drivers/video/backlight/ld9040_gamma.h | |||
@@ -169,7 +169,9 @@ static const unsigned int ld9040_22_50[] = { | |||
169 | 169 | ||
170 | struct ld9040_gamma { | 170 | struct ld9040_gamma { |
171 | unsigned int *gamma_22_table[MAX_GAMMA_LEVEL]; | 171 | unsigned int *gamma_22_table[MAX_GAMMA_LEVEL]; |
172 | } gamma_table = { | 172 | }; |
173 | |||
174 | static struct ld9040_gamma gamma_table = { | ||
173 | .gamma_22_table[0] = (unsigned int *)&ld9040_22_50, | 175 | .gamma_22_table[0] = (unsigned int *)&ld9040_22_50, |
174 | .gamma_22_table[1] = (unsigned int *)&ld9040_22_70, | 176 | .gamma_22_table[1] = (unsigned int *)&ld9040_22_70, |
175 | .gamma_22_table[2] = (unsigned int *)&ld9040_22_80, | 177 | .gamma_22_table[2] = (unsigned int *)&ld9040_22_80, |
diff --git a/drivers/video/backlight/lm3533_bl.c b/drivers/video/backlight/lm3533_bl.c index 1d1dbfb789e3..187d1c283c1d 100644 --- a/drivers/video/backlight/lm3533_bl.c +++ b/drivers/video/backlight/lm3533_bl.c | |||
@@ -284,7 +284,7 @@ static int lm3533_bl_probe(struct platform_device *pdev) | |||
284 | if (!lm3533) | 284 | if (!lm3533) |
285 | return -EINVAL; | 285 | return -EINVAL; |
286 | 286 | ||
287 | pdata = pdev->dev.platform_data; | 287 | pdata = dev_get_platdata(&pdev->dev); |
288 | if (!pdata) { | 288 | if (!pdata) { |
289 | dev_err(&pdev->dev, "no platform data\n"); | 289 | dev_err(&pdev->dev, "no platform data\n"); |
290 | return -EINVAL; | 290 | return -EINVAL; |
@@ -313,8 +313,9 @@ static int lm3533_bl_probe(struct platform_device *pdev) | |||
313 | props.type = BACKLIGHT_RAW; | 313 | props.type = BACKLIGHT_RAW; |
314 | props.max_brightness = LM3533_BL_MAX_BRIGHTNESS; | 314 | props.max_brightness = LM3533_BL_MAX_BRIGHTNESS; |
315 | props.brightness = pdata->default_brightness; | 315 | props.brightness = pdata->default_brightness; |
316 | bd = backlight_device_register(pdata->name, pdev->dev.parent, bl, | 316 | bd = devm_backlight_device_register(&pdev->dev, pdata->name, |
317 | &lm3533_bl_ops, &props); | 317 | pdev->dev.parent, bl, &lm3533_bl_ops, |
318 | &props); | ||
318 | if (IS_ERR(bd)) { | 319 | if (IS_ERR(bd)) { |
319 | dev_err(&pdev->dev, "failed to register backlight device\n"); | 320 | dev_err(&pdev->dev, "failed to register backlight device\n"); |
320 | return PTR_ERR(bd); | 321 | return PTR_ERR(bd); |
@@ -328,7 +329,7 @@ static int lm3533_bl_probe(struct platform_device *pdev) | |||
328 | ret = sysfs_create_group(&bd->dev.kobj, &lm3533_bl_attribute_group); | 329 | ret = sysfs_create_group(&bd->dev.kobj, &lm3533_bl_attribute_group); |
329 | if (ret < 0) { | 330 | if (ret < 0) { |
330 | dev_err(&pdev->dev, "failed to create sysfs attributes\n"); | 331 | dev_err(&pdev->dev, "failed to create sysfs attributes\n"); |
331 | goto err_unregister; | 332 | return ret; |
332 | } | 333 | } |
333 | 334 | ||
334 | backlight_update_status(bd); | 335 | backlight_update_status(bd); |
@@ -345,8 +346,6 @@ static int lm3533_bl_probe(struct platform_device *pdev) | |||
345 | 346 | ||
346 | err_sysfs_remove: | 347 | err_sysfs_remove: |
347 | sysfs_remove_group(&bd->dev.kobj, &lm3533_bl_attribute_group); | 348 | sysfs_remove_group(&bd->dev.kobj, &lm3533_bl_attribute_group); |
348 | err_unregister: | ||
349 | backlight_device_unregister(bd); | ||
350 | 349 | ||
351 | return ret; | 350 | return ret; |
352 | } | 351 | } |
@@ -363,7 +362,6 @@ static int lm3533_bl_remove(struct platform_device *pdev) | |||
363 | 362 | ||
364 | lm3533_ctrlbank_disable(&bl->cb); | 363 | lm3533_ctrlbank_disable(&bl->cb); |
365 | sysfs_remove_group(&bd->dev.kobj, &lm3533_bl_attribute_group); | 364 | sysfs_remove_group(&bd->dev.kobj, &lm3533_bl_attribute_group); |
366 | backlight_device_unregister(bd); | ||
367 | 365 | ||
368 | return 0; | 366 | return 0; |
369 | } | 367 | } |
diff --git a/drivers/video/backlight/lm3630_bl.c b/drivers/video/backlight/lm3630_bl.c deleted file mode 100644 index 76a62e978fc3..000000000000 --- a/drivers/video/backlight/lm3630_bl.c +++ /dev/null | |||
@@ -1,475 +0,0 @@ | |||
1 | /* | ||
2 | * Simple driver for Texas Instruments LM3630 Backlight driver chip | ||
3 | * Copyright (C) 2012 Texas Instruments | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU General Public License version 2 as | ||
7 | * published by the Free Software Foundation. | ||
8 | * | ||
9 | */ | ||
10 | #include <linux/module.h> | ||
11 | #include <linux/slab.h> | ||
12 | #include <linux/i2c.h> | ||
13 | #include <linux/backlight.h> | ||
14 | #include <linux/err.h> | ||
15 | #include <linux/delay.h> | ||
16 | #include <linux/uaccess.h> | ||
17 | #include <linux/interrupt.h> | ||
18 | #include <linux/regmap.h> | ||
19 | #include <linux/platform_data/lm3630_bl.h> | ||
20 | |||
21 | #define REG_CTRL 0x00 | ||
22 | #define REG_CONFIG 0x01 | ||
23 | #define REG_BRT_A 0x03 | ||
24 | #define REG_BRT_B 0x04 | ||
25 | #define REG_INT_STATUS 0x09 | ||
26 | #define REG_INT_EN 0x0A | ||
27 | #define REG_FAULT 0x0B | ||
28 | #define REG_PWM_OUTLOW 0x12 | ||
29 | #define REG_PWM_OUTHIGH 0x13 | ||
30 | #define REG_MAX 0x1F | ||
31 | |||
32 | #define INT_DEBOUNCE_MSEC 10 | ||
33 | |||
34 | enum lm3630_leds { | ||
35 | BLED_ALL = 0, | ||
36 | BLED_1, | ||
37 | BLED_2 | ||
38 | }; | ||
39 | |||
40 | static const char * const bled_name[] = { | ||
41 | [BLED_ALL] = "lm3630_bled", /*Bank1 controls all string */ | ||
42 | [BLED_1] = "lm3630_bled1", /*Bank1 controls bled1 */ | ||
43 | [BLED_2] = "lm3630_bled2", /*Bank1 or 2 controls bled2 */ | ||
44 | }; | ||
45 | |||
46 | struct lm3630_chip_data { | ||
47 | struct device *dev; | ||
48 | struct delayed_work work; | ||
49 | int irq; | ||
50 | struct workqueue_struct *irqthread; | ||
51 | struct lm3630_platform_data *pdata; | ||
52 | struct backlight_device *bled1; | ||
53 | struct backlight_device *bled2; | ||
54 | struct regmap *regmap; | ||
55 | }; | ||
56 | |||
57 | /* initialize chip */ | ||
58 | static int lm3630_chip_init(struct lm3630_chip_data *pchip) | ||
59 | { | ||
60 | int ret; | ||
61 | unsigned int reg_val; | ||
62 | struct lm3630_platform_data *pdata = pchip->pdata; | ||
63 | |||
64 | /*pwm control */ | ||
65 | reg_val = ((pdata->pwm_active & 0x01) << 2) | (pdata->pwm_ctrl & 0x03); | ||
66 | ret = regmap_update_bits(pchip->regmap, REG_CONFIG, 0x07, reg_val); | ||
67 | if (ret < 0) | ||
68 | goto out; | ||
69 | |||
70 | /* bank control */ | ||
71 | reg_val = ((pdata->bank_b_ctrl & 0x01) << 1) | | ||
72 | (pdata->bank_a_ctrl & 0x07); | ||
73 | ret = regmap_update_bits(pchip->regmap, REG_CTRL, 0x07, reg_val); | ||
74 | if (ret < 0) | ||
75 | goto out; | ||
76 | |||
77 | ret = regmap_update_bits(pchip->regmap, REG_CTRL, 0x80, 0x00); | ||
78 | if (ret < 0) | ||
79 | goto out; | ||
80 | |||
81 | /* set initial brightness */ | ||
82 | if (pdata->bank_a_ctrl != BANK_A_CTRL_DISABLE) { | ||
83 | ret = regmap_write(pchip->regmap, | ||
84 | REG_BRT_A, pdata->init_brt_led1); | ||
85 | if (ret < 0) | ||
86 | goto out; | ||
87 | } | ||
88 | |||
89 | if (pdata->bank_b_ctrl != BANK_B_CTRL_DISABLE) { | ||
90 | ret = regmap_write(pchip->regmap, | ||
91 | REG_BRT_B, pdata->init_brt_led2); | ||
92 | if (ret < 0) | ||
93 | goto out; | ||
94 | } | ||
95 | return ret; | ||
96 | |||
97 | out: | ||
98 | dev_err(pchip->dev, "i2c failed to access register\n"); | ||
99 | return ret; | ||
100 | } | ||
101 | |||
102 | /* interrupt handling */ | ||
103 | static void lm3630_delayed_func(struct work_struct *work) | ||
104 | { | ||
105 | int ret; | ||
106 | unsigned int reg_val; | ||
107 | struct lm3630_chip_data *pchip; | ||
108 | |||
109 | pchip = container_of(work, struct lm3630_chip_data, work.work); | ||
110 | |||
111 | ret = regmap_read(pchip->regmap, REG_INT_STATUS, ®_val); | ||
112 | if (ret < 0) { | ||
113 | dev_err(pchip->dev, | ||
114 | "i2c failed to access REG_INT_STATUS Register\n"); | ||
115 | return; | ||
116 | } | ||
117 | |||
118 | dev_info(pchip->dev, "REG_INT_STATUS Register is 0x%x\n", reg_val); | ||
119 | } | ||
120 | |||
121 | static irqreturn_t lm3630_isr_func(int irq, void *chip) | ||
122 | { | ||
123 | int ret; | ||
124 | struct lm3630_chip_data *pchip = chip; | ||
125 | unsigned long delay = msecs_to_jiffies(INT_DEBOUNCE_MSEC); | ||
126 | |||
127 | queue_delayed_work(pchip->irqthread, &pchip->work, delay); | ||
128 | |||
129 | ret = regmap_update_bits(pchip->regmap, REG_CTRL, 0x80, 0x00); | ||
130 | if (ret < 0) | ||
131 | goto out; | ||
132 | |||
133 | return IRQ_HANDLED; | ||
134 | out: | ||
135 | dev_err(pchip->dev, "i2c failed to access register\n"); | ||
136 | return IRQ_HANDLED; | ||
137 | } | ||
138 | |||
139 | static int lm3630_intr_config(struct lm3630_chip_data *pchip) | ||
140 | { | ||
141 | INIT_DELAYED_WORK(&pchip->work, lm3630_delayed_func); | ||
142 | pchip->irqthread = create_singlethread_workqueue("lm3630-irqthd"); | ||
143 | if (!pchip->irqthread) { | ||
144 | dev_err(pchip->dev, "create irq thread fail...\n"); | ||
145 | return -1; | ||
146 | } | ||
147 | if (request_threaded_irq | ||
148 | (pchip->irq, NULL, lm3630_isr_func, | ||
149 | IRQF_TRIGGER_FALLING | IRQF_ONESHOT, "lm3630_irq", pchip)) { | ||
150 | dev_err(pchip->dev, "request threaded irq fail..\n"); | ||
151 | return -1; | ||
152 | } | ||
153 | return 0; | ||
154 | } | ||
155 | |||
156 | static bool | ||
157 | set_intensity(struct backlight_device *bl, struct lm3630_chip_data *pchip) | ||
158 | { | ||
159 | if (!pchip->pdata->pwm_set_intensity) | ||
160 | return false; | ||
161 | pchip->pdata->pwm_set_intensity(bl->props.brightness - 1, | ||
162 | pchip->pdata->pwm_period); | ||
163 | return true; | ||
164 | } | ||
165 | |||
166 | /* update and get brightness */ | ||
167 | static int lm3630_bank_a_update_status(struct backlight_device *bl) | ||
168 | { | ||
169 | int ret; | ||
170 | struct lm3630_chip_data *pchip = bl_get_data(bl); | ||
171 | enum lm3630_pwm_ctrl pwm_ctrl = pchip->pdata->pwm_ctrl; | ||
172 | |||
173 | /* brightness 0 means disable */ | ||
174 | if (!bl->props.brightness) { | ||
175 | ret = regmap_update_bits(pchip->regmap, REG_CTRL, 0x04, 0x00); | ||
176 | if (ret < 0) | ||
177 | goto out; | ||
178 | return bl->props.brightness; | ||
179 | } | ||
180 | |||
181 | /* pwm control */ | ||
182 | if (pwm_ctrl == PWM_CTRL_BANK_A || pwm_ctrl == PWM_CTRL_BANK_ALL) { | ||
183 | if (!set_intensity(bl, pchip)) | ||
184 | dev_err(pchip->dev, "No pwm control func. in plat-data\n"); | ||
185 | } else { | ||
186 | |||
187 | /* i2c control */ | ||
188 | ret = regmap_update_bits(pchip->regmap, REG_CTRL, 0x80, 0x00); | ||
189 | if (ret < 0) | ||
190 | goto out; | ||
191 | mdelay(1); | ||
192 | ret = regmap_write(pchip->regmap, | ||
193 | REG_BRT_A, bl->props.brightness - 1); | ||
194 | if (ret < 0) | ||
195 | goto out; | ||
196 | } | ||
197 | return bl->props.brightness; | ||
198 | out: | ||
199 | dev_err(pchip->dev, "i2c failed to access REG_CTRL\n"); | ||
200 | return bl->props.brightness; | ||
201 | } | ||
202 | |||
203 | static int lm3630_bank_a_get_brightness(struct backlight_device *bl) | ||
204 | { | ||
205 | unsigned int reg_val; | ||
206 | int brightness, ret; | ||
207 | struct lm3630_chip_data *pchip = bl_get_data(bl); | ||
208 | enum lm3630_pwm_ctrl pwm_ctrl = pchip->pdata->pwm_ctrl; | ||
209 | |||
210 | if (pwm_ctrl == PWM_CTRL_BANK_A || pwm_ctrl == PWM_CTRL_BANK_ALL) { | ||
211 | ret = regmap_read(pchip->regmap, REG_PWM_OUTHIGH, ®_val); | ||
212 | if (ret < 0) | ||
213 | goto out; | ||
214 | brightness = reg_val & 0x01; | ||
215 | ret = regmap_read(pchip->regmap, REG_PWM_OUTLOW, ®_val); | ||
216 | if (ret < 0) | ||
217 | goto out; | ||
218 | brightness = ((brightness << 8) | reg_val) + 1; | ||
219 | } else { | ||
220 | ret = regmap_update_bits(pchip->regmap, REG_CTRL, 0x80, 0x00); | ||
221 | if (ret < 0) | ||
222 | goto out; | ||
223 | mdelay(1); | ||
224 | ret = regmap_read(pchip->regmap, REG_BRT_A, ®_val); | ||
225 | if (ret < 0) | ||
226 | goto out; | ||
227 | brightness = reg_val + 1; | ||
228 | } | ||
229 | bl->props.brightness = brightness; | ||
230 | return bl->props.brightness; | ||
231 | out: | ||
232 | dev_err(pchip->dev, "i2c failed to access register\n"); | ||
233 | return 0; | ||
234 | } | ||
235 | |||
236 | static const struct backlight_ops lm3630_bank_a_ops = { | ||
237 | .options = BL_CORE_SUSPENDRESUME, | ||
238 | .update_status = lm3630_bank_a_update_status, | ||
239 | .get_brightness = lm3630_bank_a_get_brightness, | ||
240 | }; | ||
241 | |||
242 | static int lm3630_bank_b_update_status(struct backlight_device *bl) | ||
243 | { | ||
244 | int ret; | ||
245 | struct lm3630_chip_data *pchip = bl_get_data(bl); | ||
246 | enum lm3630_pwm_ctrl pwm_ctrl = pchip->pdata->pwm_ctrl; | ||
247 | |||
248 | if (pwm_ctrl == PWM_CTRL_BANK_B || pwm_ctrl == PWM_CTRL_BANK_ALL) { | ||
249 | if (!set_intensity(bl, pchip)) | ||
250 | dev_err(pchip->dev, | ||
251 | "no pwm control func. in plat-data\n"); | ||
252 | } else { | ||
253 | ret = regmap_update_bits(pchip->regmap, REG_CTRL, 0x80, 0x00); | ||
254 | if (ret < 0) | ||
255 | goto out; | ||
256 | mdelay(1); | ||
257 | ret = regmap_write(pchip->regmap, | ||
258 | REG_BRT_B, bl->props.brightness - 1); | ||
259 | } | ||
260 | return bl->props.brightness; | ||
261 | out: | ||
262 | dev_err(pchip->dev, "i2c failed to access register\n"); | ||
263 | return bl->props.brightness; | ||
264 | } | ||
265 | |||
266 | static int lm3630_bank_b_get_brightness(struct backlight_device *bl) | ||
267 | { | ||
268 | unsigned int reg_val; | ||
269 | int brightness, ret; | ||
270 | struct lm3630_chip_data *pchip = bl_get_data(bl); | ||
271 | enum lm3630_pwm_ctrl pwm_ctrl = pchip->pdata->pwm_ctrl; | ||
272 | |||
273 | if (pwm_ctrl == PWM_CTRL_BANK_B || pwm_ctrl == PWM_CTRL_BANK_ALL) { | ||
274 | ret = regmap_read(pchip->regmap, REG_PWM_OUTHIGH, ®_val); | ||
275 | if (ret < 0) | ||
276 | goto out; | ||
277 | brightness = reg_val & 0x01; | ||
278 | ret = regmap_read(pchip->regmap, REG_PWM_OUTLOW, ®_val); | ||
279 | if (ret < 0) | ||
280 | goto out; | ||
281 | brightness = ((brightness << 8) | reg_val) + 1; | ||
282 | } else { | ||
283 | ret = regmap_update_bits(pchip->regmap, REG_CTRL, 0x80, 0x00); | ||
284 | if (ret < 0) | ||
285 | goto out; | ||
286 | mdelay(1); | ||
287 | ret = regmap_read(pchip->regmap, REG_BRT_B, ®_val); | ||
288 | if (ret < 0) | ||
289 | goto out; | ||
290 | brightness = reg_val + 1; | ||
291 | } | ||
292 | bl->props.brightness = brightness; | ||
293 | |||
294 | return bl->props.brightness; | ||
295 | out: | ||
296 | dev_err(pchip->dev, "i2c failed to access register\n"); | ||
297 | return bl->props.brightness; | ||
298 | } | ||
299 | |||
300 | static const struct backlight_ops lm3630_bank_b_ops = { | ||
301 | .options = BL_CORE_SUSPENDRESUME, | ||
302 | .update_status = lm3630_bank_b_update_status, | ||
303 | .get_brightness = lm3630_bank_b_get_brightness, | ||
304 | }; | ||
305 | |||
306 | static int lm3630_backlight_register(struct lm3630_chip_data *pchip, | ||
307 | enum lm3630_leds ledno) | ||
308 | { | ||
309 | const char *name = bled_name[ledno]; | ||
310 | struct backlight_properties props; | ||
311 | struct lm3630_platform_data *pdata = pchip->pdata; | ||
312 | |||
313 | props.type = BACKLIGHT_RAW; | ||
314 | switch (ledno) { | ||
315 | case BLED_1: | ||
316 | case BLED_ALL: | ||
317 | props.brightness = pdata->init_brt_led1; | ||
318 | props.max_brightness = pdata->max_brt_led1; | ||
319 | pchip->bled1 = | ||
320 | backlight_device_register(name, pchip->dev, pchip, | ||
321 | &lm3630_bank_a_ops, &props); | ||
322 | if (IS_ERR(pchip->bled1)) | ||
323 | return PTR_ERR(pchip->bled1); | ||
324 | break; | ||
325 | case BLED_2: | ||
326 | props.brightness = pdata->init_brt_led2; | ||
327 | props.max_brightness = pdata->max_brt_led2; | ||
328 | pchip->bled2 = | ||
329 | backlight_device_register(name, pchip->dev, pchip, | ||
330 | &lm3630_bank_b_ops, &props); | ||
331 | if (IS_ERR(pchip->bled2)) | ||
332 | return PTR_ERR(pchip->bled2); | ||
333 | break; | ||
334 | } | ||
335 | return 0; | ||
336 | } | ||
337 | |||
338 | static void lm3630_backlight_unregister(struct lm3630_chip_data *pchip) | ||
339 | { | ||
340 | if (pchip->bled1) | ||
341 | backlight_device_unregister(pchip->bled1); | ||
342 | if (pchip->bled2) | ||
343 | backlight_device_unregister(pchip->bled2); | ||
344 | } | ||
345 | |||
346 | static const struct regmap_config lm3630_regmap = { | ||
347 | .reg_bits = 8, | ||
348 | .val_bits = 8, | ||
349 | .max_register = REG_MAX, | ||
350 | }; | ||
351 | |||
352 | static int lm3630_probe(struct i2c_client *client, | ||
353 | const struct i2c_device_id *id) | ||
354 | { | ||
355 | struct lm3630_platform_data *pdata = client->dev.platform_data; | ||
356 | struct lm3630_chip_data *pchip; | ||
357 | int ret; | ||
358 | |||
359 | if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { | ||
360 | dev_err(&client->dev, "fail : i2c functionality check...\n"); | ||
361 | return -EOPNOTSUPP; | ||
362 | } | ||
363 | |||
364 | if (pdata == NULL) { | ||
365 | dev_err(&client->dev, "fail : no platform data.\n"); | ||
366 | return -ENODATA; | ||
367 | } | ||
368 | |||
369 | pchip = devm_kzalloc(&client->dev, sizeof(struct lm3630_chip_data), | ||
370 | GFP_KERNEL); | ||
371 | if (!pchip) | ||
372 | return -ENOMEM; | ||
373 | pchip->pdata = pdata; | ||
374 | pchip->dev = &client->dev; | ||
375 | |||
376 | pchip->regmap = devm_regmap_init_i2c(client, &lm3630_regmap); | ||
377 | if (IS_ERR(pchip->regmap)) { | ||
378 | ret = PTR_ERR(pchip->regmap); | ||
379 | dev_err(&client->dev, "fail : allocate register map: %d\n", | ||
380 | ret); | ||
381 | return ret; | ||
382 | } | ||
383 | i2c_set_clientdata(client, pchip); | ||
384 | |||
385 | /* chip initialize */ | ||
386 | ret = lm3630_chip_init(pchip); | ||
387 | if (ret < 0) { | ||
388 | dev_err(&client->dev, "fail : init chip\n"); | ||
389 | goto err_chip_init; | ||
390 | } | ||
391 | |||
392 | switch (pdata->bank_a_ctrl) { | ||
393 | case BANK_A_CTRL_ALL: | ||
394 | ret = lm3630_backlight_register(pchip, BLED_ALL); | ||
395 | pdata->bank_b_ctrl = BANK_B_CTRL_DISABLE; | ||
396 | break; | ||
397 | case BANK_A_CTRL_LED1: | ||
398 | ret = lm3630_backlight_register(pchip, BLED_1); | ||
399 | break; | ||
400 | case BANK_A_CTRL_LED2: | ||
401 | ret = lm3630_backlight_register(pchip, BLED_2); | ||
402 | pdata->bank_b_ctrl = BANK_B_CTRL_DISABLE; | ||
403 | break; | ||
404 | default: | ||
405 | break; | ||
406 | } | ||
407 | |||
408 | if (ret < 0) | ||
409 | goto err_bl_reg; | ||
410 | |||
411 | if (pdata->bank_b_ctrl && pchip->bled2 == NULL) { | ||
412 | ret = lm3630_backlight_register(pchip, BLED_2); | ||
413 | if (ret < 0) | ||
414 | goto err_bl_reg; | ||
415 | } | ||
416 | |||
417 | /* interrupt enable : irq 0 is not allowed for lm3630 */ | ||
418 | pchip->irq = client->irq; | ||
419 | if (pchip->irq) | ||
420 | lm3630_intr_config(pchip); | ||
421 | |||
422 | dev_info(&client->dev, "LM3630 backlight register OK.\n"); | ||
423 | return 0; | ||
424 | |||
425 | err_bl_reg: | ||
426 | dev_err(&client->dev, "fail : backlight register.\n"); | ||
427 | lm3630_backlight_unregister(pchip); | ||
428 | err_chip_init: | ||
429 | return ret; | ||
430 | } | ||
431 | |||
432 | static int lm3630_remove(struct i2c_client *client) | ||
433 | { | ||
434 | int ret; | ||
435 | struct lm3630_chip_data *pchip = i2c_get_clientdata(client); | ||
436 | |||
437 | ret = regmap_write(pchip->regmap, REG_BRT_A, 0); | ||
438 | if (ret < 0) | ||
439 | dev_err(pchip->dev, "i2c failed to access register\n"); | ||
440 | |||
441 | ret = regmap_write(pchip->regmap, REG_BRT_B, 0); | ||
442 | if (ret < 0) | ||
443 | dev_err(pchip->dev, "i2c failed to access register\n"); | ||
444 | |||
445 | lm3630_backlight_unregister(pchip); | ||
446 | if (pchip->irq) { | ||
447 | free_irq(pchip->irq, pchip); | ||
448 | flush_workqueue(pchip->irqthread); | ||
449 | destroy_workqueue(pchip->irqthread); | ||
450 | } | ||
451 | return 0; | ||
452 | } | ||
453 | |||
454 | static const struct i2c_device_id lm3630_id[] = { | ||
455 | {LM3630_NAME, 0}, | ||
456 | {} | ||
457 | }; | ||
458 | |||
459 | MODULE_DEVICE_TABLE(i2c, lm3630_id); | ||
460 | |||
461 | static struct i2c_driver lm3630_i2c_driver = { | ||
462 | .driver = { | ||
463 | .name = LM3630_NAME, | ||
464 | }, | ||
465 | .probe = lm3630_probe, | ||
466 | .remove = lm3630_remove, | ||
467 | .id_table = lm3630_id, | ||
468 | }; | ||
469 | |||
470 | module_i2c_driver(lm3630_i2c_driver); | ||
471 | |||
472 | MODULE_DESCRIPTION("Texas Instruments Backlight driver for LM3630"); | ||
473 | MODULE_AUTHOR("G.Shark Jeong <gshark.jeong@gmail.com>"); | ||
474 | MODULE_AUTHOR("Daniel Jeong <daniel.jeong@ti.com>"); | ||
475 | MODULE_LICENSE("GPL v2"); | ||
diff --git a/drivers/video/backlight/lm3630a_bl.c b/drivers/video/backlight/lm3630a_bl.c new file mode 100644 index 000000000000..35fe4825a454 --- /dev/null +++ b/drivers/video/backlight/lm3630a_bl.c | |||
@@ -0,0 +1,483 @@ | |||
1 | /* | ||
2 | * Simple driver for Texas Instruments LM3630A Backlight driver chip | ||
3 | * Copyright (C) 2012 Texas Instruments | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU General Public License version 2 as | ||
7 | * published by the Free Software Foundation. | ||
8 | * | ||
9 | */ | ||
10 | #include <linux/module.h> | ||
11 | #include <linux/slab.h> | ||
12 | #include <linux/i2c.h> | ||
13 | #include <linux/backlight.h> | ||
14 | #include <linux/err.h> | ||
15 | #include <linux/delay.h> | ||
16 | #include <linux/uaccess.h> | ||
17 | #include <linux/interrupt.h> | ||
18 | #include <linux/regmap.h> | ||
19 | #include <linux/pwm.h> | ||
20 | #include <linux/platform_data/lm3630a_bl.h> | ||
21 | |||
22 | #define REG_CTRL 0x00 | ||
23 | #define REG_BOOST 0x02 | ||
24 | #define REG_CONFIG 0x01 | ||
25 | #define REG_BRT_A 0x03 | ||
26 | #define REG_BRT_B 0x04 | ||
27 | #define REG_I_A 0x05 | ||
28 | #define REG_I_B 0x06 | ||
29 | #define REG_INT_STATUS 0x09 | ||
30 | #define REG_INT_EN 0x0A | ||
31 | #define REG_FAULT 0x0B | ||
32 | #define REG_PWM_OUTLOW 0x12 | ||
33 | #define REG_PWM_OUTHIGH 0x13 | ||
34 | #define REG_MAX 0x1F | ||
35 | |||
36 | #define INT_DEBOUNCE_MSEC 10 | ||
37 | struct lm3630a_chip { | ||
38 | struct device *dev; | ||
39 | struct delayed_work work; | ||
40 | |||
41 | int irq; | ||
42 | struct workqueue_struct *irqthread; | ||
43 | struct lm3630a_platform_data *pdata; | ||
44 | struct backlight_device *bleda; | ||
45 | struct backlight_device *bledb; | ||
46 | struct regmap *regmap; | ||
47 | struct pwm_device *pwmd; | ||
48 | }; | ||
49 | |||
50 | /* i2c access */ | ||
51 | static int lm3630a_read(struct lm3630a_chip *pchip, unsigned int reg) | ||
52 | { | ||
53 | int rval; | ||
54 | unsigned int reg_val; | ||
55 | |||
56 | rval = regmap_read(pchip->regmap, reg, ®_val); | ||
57 | if (rval < 0) | ||
58 | return rval; | ||
59 | return reg_val & 0xFF; | ||
60 | } | ||
61 | |||
62 | static int lm3630a_write(struct lm3630a_chip *pchip, | ||
63 | unsigned int reg, unsigned int data) | ||
64 | { | ||
65 | return regmap_write(pchip->regmap, reg, data); | ||
66 | } | ||
67 | |||
68 | static int lm3630a_update(struct lm3630a_chip *pchip, | ||
69 | unsigned int reg, unsigned int mask, | ||
70 | unsigned int data) | ||
71 | { | ||
72 | return regmap_update_bits(pchip->regmap, reg, mask, data); | ||
73 | } | ||
74 | |||
75 | /* initialize chip */ | ||
76 | static int lm3630a_chip_init(struct lm3630a_chip *pchip) | ||
77 | { | ||
78 | int rval; | ||
79 | struct lm3630a_platform_data *pdata = pchip->pdata; | ||
80 | |||
81 | usleep_range(1000, 2000); | ||
82 | /* set Filter Strength Register */ | ||
83 | rval = lm3630a_write(pchip, 0x50, 0x03); | ||
84 | /* set Cofig. register */ | ||
85 | rval |= lm3630a_update(pchip, REG_CONFIG, 0x07, pdata->pwm_ctrl); | ||
86 | /* set boost control */ | ||
87 | rval |= lm3630a_write(pchip, REG_BOOST, 0x38); | ||
88 | /* set current A */ | ||
89 | rval |= lm3630a_update(pchip, REG_I_A, 0x1F, 0x1F); | ||
90 | /* set current B */ | ||
91 | rval |= lm3630a_write(pchip, REG_I_B, 0x1F); | ||
92 | /* set control */ | ||
93 | rval |= lm3630a_update(pchip, REG_CTRL, 0x14, pdata->leda_ctrl); | ||
94 | rval |= lm3630a_update(pchip, REG_CTRL, 0x0B, pdata->ledb_ctrl); | ||
95 | usleep_range(1000, 2000); | ||
96 | /* set brightness A and B */ | ||
97 | rval |= lm3630a_write(pchip, REG_BRT_A, pdata->leda_init_brt); | ||
98 | rval |= lm3630a_write(pchip, REG_BRT_B, pdata->ledb_init_brt); | ||
99 | |||
100 | if (rval < 0) | ||
101 | dev_err(pchip->dev, "i2c failed to access register\n"); | ||
102 | return rval; | ||
103 | } | ||
104 | |||
105 | /* interrupt handling */ | ||
106 | static void lm3630a_delayed_func(struct work_struct *work) | ||
107 | { | ||
108 | int rval; | ||
109 | struct lm3630a_chip *pchip; | ||
110 | |||
111 | pchip = container_of(work, struct lm3630a_chip, work.work); | ||
112 | |||
113 | rval = lm3630a_read(pchip, REG_INT_STATUS); | ||
114 | if (rval < 0) { | ||
115 | dev_err(pchip->dev, | ||
116 | "i2c failed to access REG_INT_STATUS Register\n"); | ||
117 | return; | ||
118 | } | ||
119 | |||
120 | dev_info(pchip->dev, "REG_INT_STATUS Register is 0x%x\n", rval); | ||
121 | } | ||
122 | |||
123 | static irqreturn_t lm3630a_isr_func(int irq, void *chip) | ||
124 | { | ||
125 | int rval; | ||
126 | struct lm3630a_chip *pchip = chip; | ||
127 | unsigned long delay = msecs_to_jiffies(INT_DEBOUNCE_MSEC); | ||
128 | |||
129 | queue_delayed_work(pchip->irqthread, &pchip->work, delay); | ||
130 | |||
131 | rval = lm3630a_update(pchip, REG_CTRL, 0x80, 0x00); | ||
132 | if (rval < 0) { | ||
133 | dev_err(pchip->dev, "i2c failed to access register\n"); | ||
134 | return IRQ_NONE; | ||
135 | } | ||
136 | return IRQ_HANDLED; | ||
137 | } | ||
138 | |||
139 | static int lm3630a_intr_config(struct lm3630a_chip *pchip) | ||
140 | { | ||
141 | int rval; | ||
142 | |||
143 | rval = lm3630a_write(pchip, REG_INT_EN, 0x87); | ||
144 | if (rval < 0) | ||
145 | return rval; | ||
146 | |||
147 | INIT_DELAYED_WORK(&pchip->work, lm3630a_delayed_func); | ||
148 | pchip->irqthread = create_singlethread_workqueue("lm3630a-irqthd"); | ||
149 | if (!pchip->irqthread) { | ||
150 | dev_err(pchip->dev, "create irq thread fail\n"); | ||
151 | return -ENOMEM; | ||
152 | } | ||
153 | if (request_threaded_irq | ||
154 | (pchip->irq, NULL, lm3630a_isr_func, | ||
155 | IRQF_TRIGGER_FALLING | IRQF_ONESHOT, "lm3630a_irq", pchip)) { | ||
156 | dev_err(pchip->dev, "request threaded irq fail\n"); | ||
157 | destroy_workqueue(pchip->irqthread); | ||
158 | return -ENOMEM; | ||
159 | } | ||
160 | return rval; | ||
161 | } | ||
162 | |||
163 | static void lm3630a_pwm_ctrl(struct lm3630a_chip *pchip, int br, int br_max) | ||
164 | { | ||
165 | unsigned int period = pwm_get_period(pchip->pwmd); | ||
166 | unsigned int duty = br * period / br_max; | ||
167 | |||
168 | pwm_config(pchip->pwmd, duty, period); | ||
169 | if (duty) | ||
170 | pwm_enable(pchip->pwmd); | ||
171 | else | ||
172 | pwm_disable(pchip->pwmd); | ||
173 | } | ||
174 | |||
175 | /* update and get brightness */ | ||
176 | static int lm3630a_bank_a_update_status(struct backlight_device *bl) | ||
177 | { | ||
178 | int ret; | ||
179 | struct lm3630a_chip *pchip = bl_get_data(bl); | ||
180 | enum lm3630a_pwm_ctrl pwm_ctrl = pchip->pdata->pwm_ctrl; | ||
181 | |||
182 | /* pwm control */ | ||
183 | if ((pwm_ctrl & LM3630A_PWM_BANK_A) != 0) { | ||
184 | lm3630a_pwm_ctrl(pchip, bl->props.brightness, | ||
185 | bl->props.max_brightness); | ||
186 | return bl->props.brightness; | ||
187 | } | ||
188 | |||
189 | /* disable sleep */ | ||
190 | ret = lm3630a_update(pchip, REG_CTRL, 0x80, 0x00); | ||
191 | if (ret < 0) | ||
192 | goto out_i2c_err; | ||
193 | usleep_range(1000, 2000); | ||
194 | /* minimum brightness is 0x04 */ | ||
195 | ret = lm3630a_write(pchip, REG_BRT_A, bl->props.brightness); | ||
196 | if (bl->props.brightness < 0x4) | ||
197 | ret |= lm3630a_update(pchip, REG_CTRL, LM3630A_LEDA_ENABLE, 0); | ||
198 | else | ||
199 | ret |= lm3630a_update(pchip, REG_CTRL, | ||
200 | LM3630A_LEDA_ENABLE, LM3630A_LEDA_ENABLE); | ||
201 | if (ret < 0) | ||
202 | goto out_i2c_err; | ||
203 | return bl->props.brightness; | ||
204 | |||
205 | out_i2c_err: | ||
206 | dev_err(pchip->dev, "i2c failed to access\n"); | ||
207 | return bl->props.brightness; | ||
208 | } | ||
209 | |||
210 | static int lm3630a_bank_a_get_brightness(struct backlight_device *bl) | ||
211 | { | ||
212 | int brightness, rval; | ||
213 | struct lm3630a_chip *pchip = bl_get_data(bl); | ||
214 | enum lm3630a_pwm_ctrl pwm_ctrl = pchip->pdata->pwm_ctrl; | ||
215 | |||
216 | if ((pwm_ctrl & LM3630A_PWM_BANK_A) != 0) { | ||
217 | rval = lm3630a_read(pchip, REG_PWM_OUTHIGH); | ||
218 | if (rval < 0) | ||
219 | goto out_i2c_err; | ||
220 | brightness = (rval & 0x01) << 8; | ||
221 | rval = lm3630a_read(pchip, REG_PWM_OUTLOW); | ||
222 | if (rval < 0) | ||
223 | goto out_i2c_err; | ||
224 | brightness |= rval; | ||
225 | goto out; | ||
226 | } | ||
227 | |||
228 | /* disable sleep */ | ||
229 | rval = lm3630a_update(pchip, REG_CTRL, 0x80, 0x00); | ||
230 | if (rval < 0) | ||
231 | goto out_i2c_err; | ||
232 | usleep_range(1000, 2000); | ||
233 | rval = lm3630a_read(pchip, REG_BRT_A); | ||
234 | if (rval < 0) | ||
235 | goto out_i2c_err; | ||
236 | brightness = rval; | ||
237 | |||
238 | out: | ||
239 | bl->props.brightness = brightness; | ||
240 | return bl->props.brightness; | ||
241 | out_i2c_err: | ||
242 | dev_err(pchip->dev, "i2c failed to access register\n"); | ||
243 | return 0; | ||
244 | } | ||
245 | |||
246 | static const struct backlight_ops lm3630a_bank_a_ops = { | ||
247 | .options = BL_CORE_SUSPENDRESUME, | ||
248 | .update_status = lm3630a_bank_a_update_status, | ||
249 | .get_brightness = lm3630a_bank_a_get_brightness, | ||
250 | }; | ||
251 | |||
252 | /* update and get brightness */ | ||
253 | static int lm3630a_bank_b_update_status(struct backlight_device *bl) | ||
254 | { | ||
255 | int ret; | ||
256 | struct lm3630a_chip *pchip = bl_get_data(bl); | ||
257 | enum lm3630a_pwm_ctrl pwm_ctrl = pchip->pdata->pwm_ctrl; | ||
258 | |||
259 | /* pwm control */ | ||
260 | if ((pwm_ctrl & LM3630A_PWM_BANK_B) != 0) { | ||
261 | lm3630a_pwm_ctrl(pchip, bl->props.brightness, | ||
262 | bl->props.max_brightness); | ||
263 | return bl->props.brightness; | ||
264 | } | ||
265 | |||
266 | /* disable sleep */ | ||
267 | ret = lm3630a_update(pchip, REG_CTRL, 0x80, 0x00); | ||
268 | if (ret < 0) | ||
269 | goto out_i2c_err; | ||
270 | usleep_range(1000, 2000); | ||
271 | /* minimum brightness is 0x04 */ | ||
272 | ret = lm3630a_write(pchip, REG_BRT_B, bl->props.brightness); | ||
273 | if (bl->props.brightness < 0x4) | ||
274 | ret |= lm3630a_update(pchip, REG_CTRL, LM3630A_LEDB_ENABLE, 0); | ||
275 | else | ||
276 | ret |= lm3630a_update(pchip, REG_CTRL, | ||
277 | LM3630A_LEDB_ENABLE, LM3630A_LEDB_ENABLE); | ||
278 | if (ret < 0) | ||
279 | goto out_i2c_err; | ||
280 | return bl->props.brightness; | ||
281 | |||
282 | out_i2c_err: | ||
283 | dev_err(pchip->dev, "i2c failed to access REG_CTRL\n"); | ||
284 | return bl->props.brightness; | ||
285 | } | ||
286 | |||
287 | static int lm3630a_bank_b_get_brightness(struct backlight_device *bl) | ||
288 | { | ||
289 | int brightness, rval; | ||
290 | struct lm3630a_chip *pchip = bl_get_data(bl); | ||
291 | enum lm3630a_pwm_ctrl pwm_ctrl = pchip->pdata->pwm_ctrl; | ||
292 | |||
293 | if ((pwm_ctrl & LM3630A_PWM_BANK_B) != 0) { | ||
294 | rval = lm3630a_read(pchip, REG_PWM_OUTHIGH); | ||
295 | if (rval < 0) | ||
296 | goto out_i2c_err; | ||
297 | brightness = (rval & 0x01) << 8; | ||
298 | rval = lm3630a_read(pchip, REG_PWM_OUTLOW); | ||
299 | if (rval < 0) | ||
300 | goto out_i2c_err; | ||
301 | brightness |= rval; | ||
302 | goto out; | ||
303 | } | ||
304 | |||
305 | /* disable sleep */ | ||
306 | rval = lm3630a_update(pchip, REG_CTRL, 0x80, 0x00); | ||
307 | if (rval < 0) | ||
308 | goto out_i2c_err; | ||
309 | usleep_range(1000, 2000); | ||
310 | rval = lm3630a_read(pchip, REG_BRT_B); | ||
311 | if (rval < 0) | ||
312 | goto out_i2c_err; | ||
313 | brightness = rval; | ||
314 | |||
315 | out: | ||
316 | bl->props.brightness = brightness; | ||
317 | return bl->props.brightness; | ||
318 | out_i2c_err: | ||
319 | dev_err(pchip->dev, "i2c failed to access register\n"); | ||
320 | return 0; | ||
321 | } | ||
322 | |||
323 | static const struct backlight_ops lm3630a_bank_b_ops = { | ||
324 | .options = BL_CORE_SUSPENDRESUME, | ||
325 | .update_status = lm3630a_bank_b_update_status, | ||
326 | .get_brightness = lm3630a_bank_b_get_brightness, | ||
327 | }; | ||
328 | |||
329 | static int lm3630a_backlight_register(struct lm3630a_chip *pchip) | ||
330 | { | ||
331 | struct backlight_properties props; | ||
332 | struct lm3630a_platform_data *pdata = pchip->pdata; | ||
333 | |||
334 | props.type = BACKLIGHT_RAW; | ||
335 | if (pdata->leda_ctrl != LM3630A_LEDA_DISABLE) { | ||
336 | props.brightness = pdata->leda_init_brt; | ||
337 | props.max_brightness = pdata->leda_max_brt; | ||
338 | pchip->bleda = | ||
339 | devm_backlight_device_register(pchip->dev, "lm3630a_leda", | ||
340 | pchip->dev, pchip, | ||
341 | &lm3630a_bank_a_ops, &props); | ||
342 | if (IS_ERR(pchip->bleda)) | ||
343 | return PTR_ERR(pchip->bleda); | ||
344 | } | ||
345 | |||
346 | if ((pdata->ledb_ctrl != LM3630A_LEDB_DISABLE) && | ||
347 | (pdata->ledb_ctrl != LM3630A_LEDB_ON_A)) { | ||
348 | props.brightness = pdata->ledb_init_brt; | ||
349 | props.max_brightness = pdata->ledb_max_brt; | ||
350 | pchip->bledb = | ||
351 | devm_backlight_device_register(pchip->dev, "lm3630a_ledb", | ||
352 | pchip->dev, pchip, | ||
353 | &lm3630a_bank_b_ops, &props); | ||
354 | if (IS_ERR(pchip->bledb)) | ||
355 | return PTR_ERR(pchip->bledb); | ||
356 | } | ||
357 | return 0; | ||
358 | } | ||
359 | |||
360 | static const struct regmap_config lm3630a_regmap = { | ||
361 | .reg_bits = 8, | ||
362 | .val_bits = 8, | ||
363 | .max_register = REG_MAX, | ||
364 | }; | ||
365 | |||
366 | static int lm3630a_probe(struct i2c_client *client, | ||
367 | const struct i2c_device_id *id) | ||
368 | { | ||
369 | struct lm3630a_platform_data *pdata = dev_get_platdata(&client->dev); | ||
370 | struct lm3630a_chip *pchip; | ||
371 | int rval; | ||
372 | |||
373 | if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { | ||
374 | dev_err(&client->dev, "fail : i2c functionality check\n"); | ||
375 | return -EOPNOTSUPP; | ||
376 | } | ||
377 | |||
378 | pchip = devm_kzalloc(&client->dev, sizeof(struct lm3630a_chip), | ||
379 | GFP_KERNEL); | ||
380 | if (!pchip) | ||
381 | return -ENOMEM; | ||
382 | pchip->dev = &client->dev; | ||
383 | |||
384 | pchip->regmap = devm_regmap_init_i2c(client, &lm3630a_regmap); | ||
385 | if (IS_ERR(pchip->regmap)) { | ||
386 | rval = PTR_ERR(pchip->regmap); | ||
387 | dev_err(&client->dev, "fail : allocate reg. map: %d\n", rval); | ||
388 | return rval; | ||
389 | } | ||
390 | |||
391 | i2c_set_clientdata(client, pchip); | ||
392 | if (pdata == NULL) { | ||
393 | pdata = devm_kzalloc(pchip->dev, | ||
394 | sizeof(struct lm3630a_platform_data), | ||
395 | GFP_KERNEL); | ||
396 | if (pdata == NULL) | ||
397 | return -ENOMEM; | ||
398 | /* default values */ | ||
399 | pdata->leda_ctrl = LM3630A_LEDA_ENABLE; | ||
400 | pdata->ledb_ctrl = LM3630A_LEDB_ENABLE; | ||
401 | pdata->leda_max_brt = LM3630A_MAX_BRIGHTNESS; | ||
402 | pdata->ledb_max_brt = LM3630A_MAX_BRIGHTNESS; | ||
403 | pdata->leda_init_brt = LM3630A_MAX_BRIGHTNESS; | ||
404 | pdata->ledb_init_brt = LM3630A_MAX_BRIGHTNESS; | ||
405 | } | ||
406 | pchip->pdata = pdata; | ||
407 | |||
408 | /* chip initialize */ | ||
409 | rval = lm3630a_chip_init(pchip); | ||
410 | if (rval < 0) { | ||
411 | dev_err(&client->dev, "fail : init chip\n"); | ||
412 | return rval; | ||
413 | } | ||
414 | /* backlight register */ | ||
415 | rval = lm3630a_backlight_register(pchip); | ||
416 | if (rval < 0) { | ||
417 | dev_err(&client->dev, "fail : backlight register.\n"); | ||
418 | return rval; | ||
419 | } | ||
420 | /* pwm */ | ||
421 | if (pdata->pwm_ctrl != LM3630A_PWM_DISABLE) { | ||
422 | pchip->pwmd = devm_pwm_get(pchip->dev, "lm3630a-pwm"); | ||
423 | if (IS_ERR(pchip->pwmd)) { | ||
424 | dev_err(&client->dev, "fail : get pwm device\n"); | ||
425 | return PTR_ERR(pchip->pwmd); | ||
426 | } | ||
427 | } | ||
428 | pchip->pwmd->period = pdata->pwm_period; | ||
429 | |||
430 | /* interrupt enable : irq 0 is not allowed */ | ||
431 | pchip->irq = client->irq; | ||
432 | if (pchip->irq) { | ||
433 | rval = lm3630a_intr_config(pchip); | ||
434 | if (rval < 0) | ||
435 | return rval; | ||
436 | } | ||
437 | dev_info(&client->dev, "LM3630A backlight register OK.\n"); | ||
438 | return 0; | ||
439 | } | ||
440 | |||
441 | static int lm3630a_remove(struct i2c_client *client) | ||
442 | { | ||
443 | int rval; | ||
444 | struct lm3630a_chip *pchip = i2c_get_clientdata(client); | ||
445 | |||
446 | rval = lm3630a_write(pchip, REG_BRT_A, 0); | ||
447 | if (rval < 0) | ||
448 | dev_err(pchip->dev, "i2c failed to access register\n"); | ||
449 | |||
450 | rval = lm3630a_write(pchip, REG_BRT_B, 0); | ||
451 | if (rval < 0) | ||
452 | dev_err(pchip->dev, "i2c failed to access register\n"); | ||
453 | |||
454 | if (pchip->irq) { | ||
455 | free_irq(pchip->irq, pchip); | ||
456 | flush_workqueue(pchip->irqthread); | ||
457 | destroy_workqueue(pchip->irqthread); | ||
458 | } | ||
459 | return 0; | ||
460 | } | ||
461 | |||
462 | static const struct i2c_device_id lm3630a_id[] = { | ||
463 | {LM3630A_NAME, 0}, | ||
464 | {} | ||
465 | }; | ||
466 | |||
467 | MODULE_DEVICE_TABLE(i2c, lm3630a_id); | ||
468 | |||
469 | static struct i2c_driver lm3630a_i2c_driver = { | ||
470 | .driver = { | ||
471 | .name = LM3630A_NAME, | ||
472 | }, | ||
473 | .probe = lm3630a_probe, | ||
474 | .remove = lm3630a_remove, | ||
475 | .id_table = lm3630a_id, | ||
476 | }; | ||
477 | |||
478 | module_i2c_driver(lm3630a_i2c_driver); | ||
479 | |||
480 | MODULE_DESCRIPTION("Texas Instruments Backlight driver for LM3630A"); | ||
481 | MODULE_AUTHOR("Daniel Jeong <gshark.jeong@gmail.com>"); | ||
482 | MODULE_AUTHOR("LDD MLP <ldd-mlp@list.ti.com>"); | ||
483 | MODULE_LICENSE("GPL v2"); | ||
diff --git a/drivers/video/backlight/lm3639_bl.c b/drivers/video/backlight/lm3639_bl.c index 053964da8dd3..6fd60adf922e 100644 --- a/drivers/video/backlight/lm3639_bl.c +++ b/drivers/video/backlight/lm3639_bl.c | |||
@@ -76,10 +76,13 @@ static int lm3639_chip_init(struct lm3639_chip_data *pchip) | |||
76 | goto out; | 76 | goto out; |
77 | 77 | ||
78 | /* output pins config. */ | 78 | /* output pins config. */ |
79 | if (!pdata->init_brt_led) | 79 | if (!pdata->init_brt_led) { |
80 | reg_val = pdata->fled_pins | pdata->bled_pins; | 80 | reg_val = pdata->fled_pins; |
81 | else | 81 | reg_val |= pdata->bled_pins; |
82 | reg_val = pdata->fled_pins | pdata->bled_pins | 0x01; | 82 | } else { |
83 | reg_val = pdata->fled_pins; | ||
84 | reg_val |= pdata->bled_pins | 0x01; | ||
85 | } | ||
83 | 86 | ||
84 | ret = regmap_update_bits(pchip->regmap, REG_ENABLE, 0x79, reg_val); | 87 | ret = regmap_update_bits(pchip->regmap, REG_ENABLE, 0x79, reg_val); |
85 | if (ret < 0) | 88 | if (ret < 0) |
@@ -304,7 +307,7 @@ static int lm3639_probe(struct i2c_client *client, | |||
304 | { | 307 | { |
305 | int ret; | 308 | int ret; |
306 | struct lm3639_chip_data *pchip; | 309 | struct lm3639_chip_data *pchip; |
307 | struct lm3639_platform_data *pdata = client->dev.platform_data; | 310 | struct lm3639_platform_data *pdata = dev_get_platdata(&client->dev); |
308 | struct backlight_properties props; | 311 | struct backlight_properties props; |
309 | 312 | ||
310 | if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { | 313 | if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { |
diff --git a/drivers/video/backlight/lms283gf05.c b/drivers/video/backlight/lms283gf05.c index 4eec47261cd3..de8832504f68 100644 --- a/drivers/video/backlight/lms283gf05.c +++ b/drivers/video/backlight/lms283gf05.c | |||
@@ -128,7 +128,7 @@ static int lms283gf05_power_set(struct lcd_device *ld, int power) | |||
128 | { | 128 | { |
129 | struct lms283gf05_state *st = lcd_get_data(ld); | 129 | struct lms283gf05_state *st = lcd_get_data(ld); |
130 | struct spi_device *spi = st->spi; | 130 | struct spi_device *spi = st->spi; |
131 | struct lms283gf05_pdata *pdata = spi->dev.platform_data; | 131 | struct lms283gf05_pdata *pdata = dev_get_platdata(&spi->dev); |
132 | 132 | ||
133 | if (power <= FB_BLANK_NORMAL) { | 133 | if (power <= FB_BLANK_NORMAL) { |
134 | if (pdata) | 134 | if (pdata) |
@@ -153,7 +153,7 @@ static struct lcd_ops lms_ops = { | |||
153 | static int lms283gf05_probe(struct spi_device *spi) | 153 | static int lms283gf05_probe(struct spi_device *spi) |
154 | { | 154 | { |
155 | struct lms283gf05_state *st; | 155 | struct lms283gf05_state *st; |
156 | struct lms283gf05_pdata *pdata = spi->dev.platform_data; | 156 | struct lms283gf05_pdata *pdata = dev_get_platdata(&spi->dev); |
157 | struct lcd_device *ld; | 157 | struct lcd_device *ld; |
158 | int ret = 0; | 158 | int ret = 0; |
159 | 159 | ||
@@ -173,7 +173,8 @@ static int lms283gf05_probe(struct spi_device *spi) | |||
173 | return -ENOMEM; | 173 | return -ENOMEM; |
174 | } | 174 | } |
175 | 175 | ||
176 | ld = lcd_device_register("lms283gf05", &spi->dev, st, &lms_ops); | 176 | ld = devm_lcd_device_register(&spi->dev, "lms283gf05", &spi->dev, st, |
177 | &lms_ops); | ||
177 | if (IS_ERR(ld)) | 178 | if (IS_ERR(ld)) |
178 | return PTR_ERR(ld); | 179 | return PTR_ERR(ld); |
179 | 180 | ||
@@ -190,22 +191,12 @@ static int lms283gf05_probe(struct spi_device *spi) | |||
190 | return 0; | 191 | return 0; |
191 | } | 192 | } |
192 | 193 | ||
193 | static int lms283gf05_remove(struct spi_device *spi) | ||
194 | { | ||
195 | struct lms283gf05_state *st = spi_get_drvdata(spi); | ||
196 | |||
197 | lcd_device_unregister(st->ld); | ||
198 | |||
199 | return 0; | ||
200 | } | ||
201 | |||
202 | static struct spi_driver lms283gf05_driver = { | 194 | static struct spi_driver lms283gf05_driver = { |
203 | .driver = { | 195 | .driver = { |
204 | .name = "lms283gf05", | 196 | .name = "lms283gf05", |
205 | .owner = THIS_MODULE, | 197 | .owner = THIS_MODULE, |
206 | }, | 198 | }, |
207 | .probe = lms283gf05_probe, | 199 | .probe = lms283gf05_probe, |
208 | .remove = lms283gf05_remove, | ||
209 | }; | 200 | }; |
210 | 201 | ||
211 | module_spi_driver(lms283gf05_driver); | 202 | module_spi_driver(lms283gf05_driver); |
diff --git a/drivers/video/backlight/lms501kf03.c b/drivers/video/backlight/lms501kf03.c index cf01b9ac8131..77258b7b04be 100644 --- a/drivers/video/backlight/lms501kf03.c +++ b/drivers/video/backlight/lms501kf03.c | |||
@@ -344,14 +344,14 @@ static int lms501kf03_probe(struct spi_device *spi) | |||
344 | lcd->spi = spi; | 344 | lcd->spi = spi; |
345 | lcd->dev = &spi->dev; | 345 | lcd->dev = &spi->dev; |
346 | 346 | ||
347 | lcd->lcd_pd = spi->dev.platform_data; | 347 | lcd->lcd_pd = dev_get_platdata(&spi->dev); |
348 | if (!lcd->lcd_pd) { | 348 | if (!lcd->lcd_pd) { |
349 | dev_err(&spi->dev, "platform data is NULL\n"); | 349 | dev_err(&spi->dev, "platform data is NULL\n"); |
350 | return -EINVAL; | 350 | return -EINVAL; |
351 | } | 351 | } |
352 | 352 | ||
353 | ld = lcd_device_register("lms501kf03", &spi->dev, lcd, | 353 | ld = devm_lcd_device_register(&spi->dev, "lms501kf03", &spi->dev, lcd, |
354 | &lms501kf03_lcd_ops); | 354 | &lms501kf03_lcd_ops); |
355 | if (IS_ERR(ld)) | 355 | if (IS_ERR(ld)) |
356 | return PTR_ERR(ld); | 356 | return PTR_ERR(ld); |
357 | 357 | ||
@@ -382,8 +382,6 @@ static int lms501kf03_remove(struct spi_device *spi) | |||
382 | struct lms501kf03 *lcd = spi_get_drvdata(spi); | 382 | struct lms501kf03 *lcd = spi_get_drvdata(spi); |
383 | 383 | ||
384 | lms501kf03_power(lcd, FB_BLANK_POWERDOWN); | 384 | lms501kf03_power(lcd, FB_BLANK_POWERDOWN); |
385 | lcd_device_unregister(lcd->ld); | ||
386 | |||
387 | return 0; | 385 | return 0; |
388 | } | 386 | } |
389 | 387 | ||
diff --git a/drivers/video/backlight/lp855x_bl.c b/drivers/video/backlight/lp855x_bl.c index c0b41f13bd4a..cae80d555e84 100644 --- a/drivers/video/backlight/lp855x_bl.c +++ b/drivers/video/backlight/lp855x_bl.c | |||
@@ -26,13 +26,15 @@ | |||
26 | #define LP8556_EPROM_START 0xA0 | 26 | #define LP8556_EPROM_START 0xA0 |
27 | #define LP8556_EPROM_END 0xAF | 27 | #define LP8556_EPROM_END 0xAF |
28 | 28 | ||
29 | /* LP8557 Registers */ | 29 | /* LP8555/7 Registers */ |
30 | #define LP8557_BL_CMD 0x00 | 30 | #define LP8557_BL_CMD 0x00 |
31 | #define LP8557_BL_MASK 0x01 | 31 | #define LP8557_BL_MASK 0x01 |
32 | #define LP8557_BL_ON 0x01 | 32 | #define LP8557_BL_ON 0x01 |
33 | #define LP8557_BL_OFF 0x00 | 33 | #define LP8557_BL_OFF 0x00 |
34 | #define LP8557_BRIGHTNESS_CTRL 0x04 | 34 | #define LP8557_BRIGHTNESS_CTRL 0x04 |
35 | #define LP8557_CONFIG 0x10 | 35 | #define LP8557_CONFIG 0x10 |
36 | #define LP8555_EPROM_START 0x10 | ||
37 | #define LP8555_EPROM_END 0x7A | ||
36 | #define LP8557_EPROM_START 0x10 | 38 | #define LP8557_EPROM_START 0x10 |
37 | #define LP8557_EPROM_END 0x1E | 39 | #define LP8557_EPROM_END 0x1E |
38 | 40 | ||
@@ -111,6 +113,10 @@ static bool lp855x_is_valid_rom_area(struct lp855x *lp, u8 addr) | |||
111 | start = LP8556_EPROM_START; | 113 | start = LP8556_EPROM_START; |
112 | end = LP8556_EPROM_END; | 114 | end = LP8556_EPROM_END; |
113 | break; | 115 | break; |
116 | case LP8555: | ||
117 | start = LP8555_EPROM_START; | ||
118 | end = LP8555_EPROM_END; | ||
119 | break; | ||
114 | case LP8557: | 120 | case LP8557: |
115 | start = LP8557_EPROM_START; | 121 | start = LP8557_EPROM_START; |
116 | end = LP8557_EPROM_END; | 122 | end = LP8557_EPROM_END; |
@@ -165,9 +171,14 @@ static int lp855x_configure(struct lp855x *lp) | |||
165 | struct lp855x_platform_data *pd = lp->pdata; | 171 | struct lp855x_platform_data *pd = lp->pdata; |
166 | 172 | ||
167 | switch (lp->chip_id) { | 173 | switch (lp->chip_id) { |
168 | case LP8550 ... LP8556: | 174 | case LP8550: |
175 | case LP8551: | ||
176 | case LP8552: | ||
177 | case LP8553: | ||
178 | case LP8556: | ||
169 | lp->cfg = &lp855x_dev_cfg; | 179 | lp->cfg = &lp855x_dev_cfg; |
170 | break; | 180 | break; |
181 | case LP8555: | ||
171 | case LP8557: | 182 | case LP8557: |
172 | lp->cfg = &lp8557_dev_cfg; | 183 | lp->cfg = &lp8557_dev_cfg; |
173 | break; | 184 | break; |
@@ -289,7 +300,7 @@ static int lp855x_backlight_register(struct lp855x *lp) | |||
289 | 300 | ||
290 | props.brightness = pdata->initial_brightness; | 301 | props.brightness = pdata->initial_brightness; |
291 | 302 | ||
292 | bl = backlight_device_register(name, lp->dev, lp, | 303 | bl = devm_backlight_device_register(lp->dev, name, lp->dev, lp, |
293 | &lp855x_bl_ops, &props); | 304 | &lp855x_bl_ops, &props); |
294 | if (IS_ERR(bl)) | 305 | if (IS_ERR(bl)) |
295 | return PTR_ERR(bl); | 306 | return PTR_ERR(bl); |
@@ -299,12 +310,6 @@ static int lp855x_backlight_register(struct lp855x *lp) | |||
299 | return 0; | 310 | return 0; |
300 | } | 311 | } |
301 | 312 | ||
302 | static void lp855x_backlight_unregister(struct lp855x *lp) | ||
303 | { | ||
304 | if (lp->bl) | ||
305 | backlight_device_unregister(lp->bl); | ||
306 | } | ||
307 | |||
308 | static ssize_t lp855x_get_chip_id(struct device *dev, | 313 | static ssize_t lp855x_get_chip_id(struct device *dev, |
309 | struct device_attribute *attr, char *buf) | 314 | struct device_attribute *attr, char *buf) |
310 | { | 315 | { |
@@ -394,7 +399,7 @@ static int lp855x_parse_dt(struct device *dev, struct device_node *node) | |||
394 | static int lp855x_probe(struct i2c_client *cl, const struct i2c_device_id *id) | 399 | static int lp855x_probe(struct i2c_client *cl, const struct i2c_device_id *id) |
395 | { | 400 | { |
396 | struct lp855x *lp; | 401 | struct lp855x *lp; |
397 | struct lp855x_platform_data *pdata = cl->dev.platform_data; | 402 | struct lp855x_platform_data *pdata = dev_get_platdata(&cl->dev); |
398 | struct device_node *node = cl->dev.of_node; | 403 | struct device_node *node = cl->dev.of_node; |
399 | int ret; | 404 | int ret; |
400 | 405 | ||
@@ -403,7 +408,7 @@ static int lp855x_probe(struct i2c_client *cl, const struct i2c_device_id *id) | |||
403 | if (ret < 0) | 408 | if (ret < 0) |
404 | return ret; | 409 | return ret; |
405 | 410 | ||
406 | pdata = cl->dev.platform_data; | 411 | pdata = dev_get_platdata(&cl->dev); |
407 | } | 412 | } |
408 | 413 | ||
409 | if (!i2c_check_functionality(cl->adapter, I2C_FUNC_SMBUS_I2C_BLOCK)) | 414 | if (!i2c_check_functionality(cl->adapter, I2C_FUNC_SMBUS_I2C_BLOCK)) |
@@ -428,29 +433,24 @@ static int lp855x_probe(struct i2c_client *cl, const struct i2c_device_id *id) | |||
428 | ret = lp855x_configure(lp); | 433 | ret = lp855x_configure(lp); |
429 | if (ret) { | 434 | if (ret) { |
430 | dev_err(lp->dev, "device config err: %d", ret); | 435 | dev_err(lp->dev, "device config err: %d", ret); |
431 | goto err_dev; | 436 | return ret; |
432 | } | 437 | } |
433 | 438 | ||
434 | ret = lp855x_backlight_register(lp); | 439 | ret = lp855x_backlight_register(lp); |
435 | if (ret) { | 440 | if (ret) { |
436 | dev_err(lp->dev, | 441 | dev_err(lp->dev, |
437 | "failed to register backlight. err: %d\n", ret); | 442 | "failed to register backlight. err: %d\n", ret); |
438 | goto err_dev; | 443 | return ret; |
439 | } | 444 | } |
440 | 445 | ||
441 | ret = sysfs_create_group(&lp->dev->kobj, &lp855x_attr_group); | 446 | ret = sysfs_create_group(&lp->dev->kobj, &lp855x_attr_group); |
442 | if (ret) { | 447 | if (ret) { |
443 | dev_err(lp->dev, "failed to register sysfs. err: %d\n", ret); | 448 | dev_err(lp->dev, "failed to register sysfs. err: %d\n", ret); |
444 | goto err_sysfs; | 449 | return ret; |
445 | } | 450 | } |
446 | 451 | ||
447 | backlight_update_status(lp->bl); | 452 | backlight_update_status(lp->bl); |
448 | return 0; | 453 | return 0; |
449 | |||
450 | err_sysfs: | ||
451 | lp855x_backlight_unregister(lp); | ||
452 | err_dev: | ||
453 | return ret; | ||
454 | } | 454 | } |
455 | 455 | ||
456 | static int lp855x_remove(struct i2c_client *cl) | 456 | static int lp855x_remove(struct i2c_client *cl) |
@@ -460,7 +460,6 @@ static int lp855x_remove(struct i2c_client *cl) | |||
460 | lp->bl->props.brightness = 0; | 460 | lp->bl->props.brightness = 0; |
461 | backlight_update_status(lp->bl); | 461 | backlight_update_status(lp->bl); |
462 | sysfs_remove_group(&lp->dev->kobj, &lp855x_attr_group); | 462 | sysfs_remove_group(&lp->dev->kobj, &lp855x_attr_group); |
463 | lp855x_backlight_unregister(lp); | ||
464 | 463 | ||
465 | return 0; | 464 | return 0; |
466 | } | 465 | } |
@@ -470,6 +469,7 @@ static const struct of_device_id lp855x_dt_ids[] = { | |||
470 | { .compatible = "ti,lp8551", }, | 469 | { .compatible = "ti,lp8551", }, |
471 | { .compatible = "ti,lp8552", }, | 470 | { .compatible = "ti,lp8552", }, |
472 | { .compatible = "ti,lp8553", }, | 471 | { .compatible = "ti,lp8553", }, |
472 | { .compatible = "ti,lp8555", }, | ||
473 | { .compatible = "ti,lp8556", }, | 473 | { .compatible = "ti,lp8556", }, |
474 | { .compatible = "ti,lp8557", }, | 474 | { .compatible = "ti,lp8557", }, |
475 | { } | 475 | { } |
@@ -481,6 +481,7 @@ static const struct i2c_device_id lp855x_ids[] = { | |||
481 | {"lp8551", LP8551}, | 481 | {"lp8551", LP8551}, |
482 | {"lp8552", LP8552}, | 482 | {"lp8552", LP8552}, |
483 | {"lp8553", LP8553}, | 483 | {"lp8553", LP8553}, |
484 | {"lp8555", LP8555}, | ||
484 | {"lp8556", LP8556}, | 485 | {"lp8556", LP8556}, |
485 | {"lp8557", LP8557}, | 486 | {"lp8557", LP8557}, |
486 | { } | 487 | { } |
diff --git a/drivers/video/backlight/lp8788_bl.c b/drivers/video/backlight/lp8788_bl.c index 980855ec9bb1..e49905d495dc 100644 --- a/drivers/video/backlight/lp8788_bl.c +++ b/drivers/video/backlight/lp8788_bl.c | |||
@@ -52,7 +52,7 @@ struct lp8788_bl { | |||
52 | struct pwm_device *pwm; | 52 | struct pwm_device *pwm; |
53 | }; | 53 | }; |
54 | 54 | ||
55 | struct lp8788_bl_config default_bl_config = { | 55 | static struct lp8788_bl_config default_bl_config = { |
56 | .bl_mode = LP8788_BL_REGISTER_ONLY, | 56 | .bl_mode = LP8788_BL_REGISTER_ONLY, |
57 | .dim_mode = LP8788_DIM_EXPONENTIAL, | 57 | .dim_mode = LP8788_DIM_EXPONENTIAL, |
58 | .full_scale = LP8788_FULLSCALE_1900uA, | 58 | .full_scale = LP8788_FULLSCALE_1900uA, |
diff --git a/drivers/video/backlight/ltv350qv.c b/drivers/video/backlight/ltv350qv.c index ed1b39268131..383f550e165e 100644 --- a/drivers/video/backlight/ltv350qv.c +++ b/drivers/video/backlight/ltv350qv.c | |||
@@ -242,7 +242,8 @@ static int ltv350qv_probe(struct spi_device *spi) | |||
242 | if (!lcd->buffer) | 242 | if (!lcd->buffer) |
243 | return -ENOMEM; | 243 | return -ENOMEM; |
244 | 244 | ||
245 | ld = lcd_device_register("ltv350qv", &spi->dev, lcd, <v_ops); | 245 | ld = devm_lcd_device_register(&spi->dev, "ltv350qv", &spi->dev, lcd, |
246 | <v_ops); | ||
246 | if (IS_ERR(ld)) | 247 | if (IS_ERR(ld)) |
247 | return PTR_ERR(ld); | 248 | return PTR_ERR(ld); |
248 | 249 | ||
@@ -250,15 +251,11 @@ static int ltv350qv_probe(struct spi_device *spi) | |||
250 | 251 | ||
251 | ret = ltv350qv_power(lcd, FB_BLANK_UNBLANK); | 252 | ret = ltv350qv_power(lcd, FB_BLANK_UNBLANK); |
252 | if (ret) | 253 | if (ret) |
253 | goto out_unregister; | 254 | return ret; |
254 | 255 | ||
255 | spi_set_drvdata(spi, lcd); | 256 | spi_set_drvdata(spi, lcd); |
256 | 257 | ||
257 | return 0; | 258 | return 0; |
258 | |||
259 | out_unregister: | ||
260 | lcd_device_unregister(ld); | ||
261 | return ret; | ||
262 | } | 259 | } |
263 | 260 | ||
264 | static int ltv350qv_remove(struct spi_device *spi) | 261 | static int ltv350qv_remove(struct spi_device *spi) |
@@ -266,8 +263,6 @@ static int ltv350qv_remove(struct spi_device *spi) | |||
266 | struct ltv350qv *lcd = spi_get_drvdata(spi); | 263 | struct ltv350qv *lcd = spi_get_drvdata(spi); |
267 | 264 | ||
268 | ltv350qv_power(lcd, FB_BLANK_POWERDOWN); | 265 | ltv350qv_power(lcd, FB_BLANK_POWERDOWN); |
269 | lcd_device_unregister(lcd->ld); | ||
270 | |||
271 | return 0; | 266 | return 0; |
272 | } | 267 | } |
273 | 268 | ||
diff --git a/drivers/video/backlight/lv5207lp.c b/drivers/video/backlight/lv5207lp.c index 498fd73d59b9..1802b2d1357d 100644 --- a/drivers/video/backlight/lv5207lp.c +++ b/drivers/video/backlight/lv5207lp.c | |||
@@ -93,7 +93,7 @@ static const struct backlight_ops lv5207lp_backlight_ops = { | |||
93 | static int lv5207lp_probe(struct i2c_client *client, | 93 | static int lv5207lp_probe(struct i2c_client *client, |
94 | const struct i2c_device_id *id) | 94 | const struct i2c_device_id *id) |
95 | { | 95 | { |
96 | struct lv5207lp_platform_data *pdata = client->dev.platform_data; | 96 | struct lv5207lp_platform_data *pdata = dev_get_platdata(&client->dev); |
97 | struct backlight_device *backlight; | 97 | struct backlight_device *backlight; |
98 | struct backlight_properties props; | 98 | struct backlight_properties props; |
99 | struct lv5207lp *lv; | 99 | struct lv5207lp *lv; |
@@ -124,9 +124,9 @@ static int lv5207lp_probe(struct i2c_client *client, | |||
124 | props.brightness = clamp_t(unsigned int, pdata->def_value, 0, | 124 | props.brightness = clamp_t(unsigned int, pdata->def_value, 0, |
125 | props.max_brightness); | 125 | props.max_brightness); |
126 | 126 | ||
127 | backlight = backlight_device_register(dev_name(&client->dev), | 127 | backlight = devm_backlight_device_register(&client->dev, |
128 | &lv->client->dev, lv, | 128 | dev_name(&client->dev), &lv->client->dev, |
129 | &lv5207lp_backlight_ops, &props); | 129 | lv, &lv5207lp_backlight_ops, &props); |
130 | if (IS_ERR(backlight)) { | 130 | if (IS_ERR(backlight)) { |
131 | dev_err(&client->dev, "failed to register backlight\n"); | 131 | dev_err(&client->dev, "failed to register backlight\n"); |
132 | return PTR_ERR(backlight); | 132 | return PTR_ERR(backlight); |
@@ -144,7 +144,6 @@ static int lv5207lp_remove(struct i2c_client *client) | |||
144 | 144 | ||
145 | backlight->props.brightness = 0; | 145 | backlight->props.brightness = 0; |
146 | backlight_update_status(backlight); | 146 | backlight_update_status(backlight); |
147 | backlight_device_unregister(backlight); | ||
148 | 147 | ||
149 | return 0; | 148 | return 0; |
150 | } | 149 | } |
diff --git a/drivers/video/backlight/max8925_bl.c b/drivers/video/backlight/max8925_bl.c index 886e797f75f9..66fa08c920d2 100644 --- a/drivers/video/backlight/max8925_bl.c +++ b/drivers/video/backlight/max8925_bl.c | |||
@@ -163,7 +163,8 @@ static int max8925_backlight_probe(struct platform_device *pdev) | |||
163 | memset(&props, 0, sizeof(struct backlight_properties)); | 163 | memset(&props, 0, sizeof(struct backlight_properties)); |
164 | props.type = BACKLIGHT_RAW; | 164 | props.type = BACKLIGHT_RAW; |
165 | props.max_brightness = MAX_BRIGHTNESS; | 165 | props.max_brightness = MAX_BRIGHTNESS; |
166 | bl = backlight_device_register("max8925-backlight", &pdev->dev, data, | 166 | bl = devm_backlight_device_register(&pdev->dev, "max8925-backlight", |
167 | &pdev->dev, data, | ||
167 | &max8925_backlight_ops, &props); | 168 | &max8925_backlight_ops, &props); |
168 | if (IS_ERR(bl)) { | 169 | if (IS_ERR(bl)) { |
169 | dev_err(&pdev->dev, "failed to register backlight\n"); | 170 | dev_err(&pdev->dev, "failed to register backlight\n"); |
@@ -188,20 +189,9 @@ static int max8925_backlight_probe(struct platform_device *pdev) | |||
188 | } | 189 | } |
189 | ret = max8925_set_bits(chip->i2c, data->reg_mode_cntl, 0xfe, value); | 190 | ret = max8925_set_bits(chip->i2c, data->reg_mode_cntl, 0xfe, value); |
190 | if (ret < 0) | 191 | if (ret < 0) |
191 | goto out_brt; | 192 | return ret; |
192 | backlight_update_status(bl); | 193 | backlight_update_status(bl); |
193 | return 0; | 194 | return 0; |
194 | out_brt: | ||
195 | backlight_device_unregister(bl); | ||
196 | return ret; | ||
197 | } | ||
198 | |||
199 | static int max8925_backlight_remove(struct platform_device *pdev) | ||
200 | { | ||
201 | struct backlight_device *bl = platform_get_drvdata(pdev); | ||
202 | |||
203 | backlight_device_unregister(bl); | ||
204 | return 0; | ||
205 | } | 195 | } |
206 | 196 | ||
207 | static struct platform_driver max8925_backlight_driver = { | 197 | static struct platform_driver max8925_backlight_driver = { |
@@ -210,7 +200,6 @@ static struct platform_driver max8925_backlight_driver = { | |||
210 | .owner = THIS_MODULE, | 200 | .owner = THIS_MODULE, |
211 | }, | 201 | }, |
212 | .probe = max8925_backlight_probe, | 202 | .probe = max8925_backlight_probe, |
213 | .remove = max8925_backlight_remove, | ||
214 | }; | 203 | }; |
215 | 204 | ||
216 | module_platform_driver(max8925_backlight_driver); | 205 | module_platform_driver(max8925_backlight_driver); |
diff --git a/drivers/video/backlight/omap1_bl.c b/drivers/video/backlight/omap1_bl.c index 812e22e35cab..ac11a4650c19 100644 --- a/drivers/video/backlight/omap1_bl.c +++ b/drivers/video/backlight/omap1_bl.c | |||
@@ -133,7 +133,7 @@ static int omapbl_probe(struct platform_device *pdev) | |||
133 | struct backlight_properties props; | 133 | struct backlight_properties props; |
134 | struct backlight_device *dev; | 134 | struct backlight_device *dev; |
135 | struct omap_backlight *bl; | 135 | struct omap_backlight *bl; |
136 | struct omap_backlight_config *pdata = pdev->dev.platform_data; | 136 | struct omap_backlight_config *pdata = dev_get_platdata(&pdev->dev); |
137 | 137 | ||
138 | if (!pdata) | 138 | if (!pdata) |
139 | return -ENXIO; | 139 | return -ENXIO; |
diff --git a/drivers/video/backlight/pandora_bl.c b/drivers/video/backlight/pandora_bl.c index 633b0a22fd64..2098c5d6efb9 100644 --- a/drivers/video/backlight/pandora_bl.c +++ b/drivers/video/backlight/pandora_bl.c | |||
@@ -120,8 +120,8 @@ static int pandora_backlight_probe(struct platform_device *pdev) | |||
120 | memset(&props, 0, sizeof(props)); | 120 | memset(&props, 0, sizeof(props)); |
121 | props.max_brightness = MAX_USER_VALUE; | 121 | props.max_brightness = MAX_USER_VALUE; |
122 | props.type = BACKLIGHT_RAW; | 122 | props.type = BACKLIGHT_RAW; |
123 | bl = backlight_device_register(pdev->name, &pdev->dev, | 123 | bl = devm_backlight_device_register(&pdev->dev, pdev->name, &pdev->dev, |
124 | NULL, &pandora_backlight_ops, &props); | 124 | NULL, &pandora_backlight_ops, &props); |
125 | if (IS_ERR(bl)) { | 125 | if (IS_ERR(bl)) { |
126 | dev_err(&pdev->dev, "failed to register backlight\n"); | 126 | dev_err(&pdev->dev, "failed to register backlight\n"); |
127 | return PTR_ERR(bl); | 127 | return PTR_ERR(bl); |
@@ -145,20 +145,12 @@ static int pandora_backlight_probe(struct platform_device *pdev) | |||
145 | return 0; | 145 | return 0; |
146 | } | 146 | } |
147 | 147 | ||
148 | static int pandora_backlight_remove(struct platform_device *pdev) | ||
149 | { | ||
150 | struct backlight_device *bl = platform_get_drvdata(pdev); | ||
151 | backlight_device_unregister(bl); | ||
152 | return 0; | ||
153 | } | ||
154 | |||
155 | static struct platform_driver pandora_backlight_driver = { | 148 | static struct platform_driver pandora_backlight_driver = { |
156 | .driver = { | 149 | .driver = { |
157 | .name = "pandora-backlight", | 150 | .name = "pandora-backlight", |
158 | .owner = THIS_MODULE, | 151 | .owner = THIS_MODULE, |
159 | }, | 152 | }, |
160 | .probe = pandora_backlight_probe, | 153 | .probe = pandora_backlight_probe, |
161 | .remove = pandora_backlight_remove, | ||
162 | }; | 154 | }; |
163 | 155 | ||
164 | module_platform_driver(pandora_backlight_driver); | 156 | module_platform_driver(pandora_backlight_driver); |
diff --git a/drivers/video/backlight/pcf50633-backlight.c b/drivers/video/backlight/pcf50633-backlight.c index 6ed76be18f19..b95d3b0aaffe 100644 --- a/drivers/video/backlight/pcf50633-backlight.c +++ b/drivers/video/backlight/pcf50633-backlight.c | |||
@@ -103,7 +103,7 @@ static int pcf50633_bl_probe(struct platform_device *pdev) | |||
103 | { | 103 | { |
104 | struct pcf50633_bl *pcf_bl; | 104 | struct pcf50633_bl *pcf_bl; |
105 | struct device *parent = pdev->dev.parent; | 105 | struct device *parent = pdev->dev.parent; |
106 | struct pcf50633_platform_data *pcf50633_data = parent->platform_data; | 106 | struct pcf50633_platform_data *pcf50633_data = dev_get_platdata(parent); |
107 | struct pcf50633_bl_platform_data *pdata = pcf50633_data->backlight_data; | 107 | struct pcf50633_bl_platform_data *pdata = pcf50633_data->backlight_data; |
108 | struct backlight_properties bl_props; | 108 | struct backlight_properties bl_props; |
109 | 109 | ||
@@ -126,7 +126,8 @@ static int pcf50633_bl_probe(struct platform_device *pdev) | |||
126 | 126 | ||
127 | pcf_bl->pcf = dev_to_pcf50633(pdev->dev.parent); | 127 | pcf_bl->pcf = dev_to_pcf50633(pdev->dev.parent); |
128 | 128 | ||
129 | pcf_bl->bl = backlight_device_register(pdev->name, &pdev->dev, pcf_bl, | 129 | pcf_bl->bl = devm_backlight_device_register(&pdev->dev, pdev->name, |
130 | &pdev->dev, pcf_bl, | ||
130 | &pcf50633_bl_ops, &bl_props); | 131 | &pcf50633_bl_ops, &bl_props); |
131 | 132 | ||
132 | if (IS_ERR(pcf_bl->bl)) | 133 | if (IS_ERR(pcf_bl->bl)) |
@@ -147,18 +148,8 @@ static int pcf50633_bl_probe(struct platform_device *pdev) | |||
147 | return 0; | 148 | return 0; |
148 | } | 149 | } |
149 | 150 | ||
150 | static int pcf50633_bl_remove(struct platform_device *pdev) | ||
151 | { | ||
152 | struct pcf50633_bl *pcf_bl = platform_get_drvdata(pdev); | ||
153 | |||
154 | backlight_device_unregister(pcf_bl->bl); | ||
155 | |||
156 | return 0; | ||
157 | } | ||
158 | |||
159 | static struct platform_driver pcf50633_bl_driver = { | 151 | static struct platform_driver pcf50633_bl_driver = { |
160 | .probe = pcf50633_bl_probe, | 152 | .probe = pcf50633_bl_probe, |
161 | .remove = pcf50633_bl_remove, | ||
162 | .driver = { | 153 | .driver = { |
163 | .name = "pcf50633-backlight", | 154 | .name = "pcf50633-backlight", |
164 | }, | 155 | }, |
diff --git a/drivers/video/backlight/platform_lcd.c b/drivers/video/backlight/platform_lcd.c index 056836706708..d01884d4f1bf 100644 --- a/drivers/video/backlight/platform_lcd.c +++ b/drivers/video/backlight/platform_lcd.c | |||
@@ -80,7 +80,7 @@ static int platform_lcd_probe(struct platform_device *pdev) | |||
80 | struct device *dev = &pdev->dev; | 80 | struct device *dev = &pdev->dev; |
81 | int err; | 81 | int err; |
82 | 82 | ||
83 | pdata = pdev->dev.platform_data; | 83 | pdata = dev_get_platdata(&pdev->dev); |
84 | if (!pdata) { | 84 | if (!pdata) { |
85 | dev_err(dev, "no platform data supplied\n"); | 85 | dev_err(dev, "no platform data supplied\n"); |
86 | return -EINVAL; | 86 | return -EINVAL; |
@@ -101,30 +101,17 @@ static int platform_lcd_probe(struct platform_device *pdev) | |||
101 | 101 | ||
102 | plcd->us = dev; | 102 | plcd->us = dev; |
103 | plcd->pdata = pdata; | 103 | plcd->pdata = pdata; |
104 | plcd->lcd = lcd_device_register(dev_name(dev), dev, | 104 | plcd->lcd = devm_lcd_device_register(&pdev->dev, dev_name(dev), dev, |
105 | plcd, &platform_lcd_ops); | 105 | plcd, &platform_lcd_ops); |
106 | if (IS_ERR(plcd->lcd)) { | 106 | if (IS_ERR(plcd->lcd)) { |
107 | dev_err(dev, "cannot register lcd device\n"); | 107 | dev_err(dev, "cannot register lcd device\n"); |
108 | err = PTR_ERR(plcd->lcd); | 108 | return PTR_ERR(plcd->lcd); |
109 | goto err; | ||
110 | } | 109 | } |
111 | 110 | ||
112 | platform_set_drvdata(pdev, plcd); | 111 | platform_set_drvdata(pdev, plcd); |
113 | platform_lcd_set_power(plcd->lcd, FB_BLANK_NORMAL); | 112 | platform_lcd_set_power(plcd->lcd, FB_BLANK_NORMAL); |
114 | 113 | ||
115 | return 0; | 114 | return 0; |
116 | |||
117 | err: | ||
118 | return err; | ||
119 | } | ||
120 | |||
121 | static int platform_lcd_remove(struct platform_device *pdev) | ||
122 | { | ||
123 | struct platform_lcd *plcd = platform_get_drvdata(pdev); | ||
124 | |||
125 | lcd_device_unregister(plcd->lcd); | ||
126 | |||
127 | return 0; | ||
128 | } | 115 | } |
129 | 116 | ||
130 | #ifdef CONFIG_PM_SLEEP | 117 | #ifdef CONFIG_PM_SLEEP |
@@ -168,7 +155,6 @@ static struct platform_driver platform_lcd_driver = { | |||
168 | .of_match_table = of_match_ptr(platform_lcd_of_match), | 155 | .of_match_table = of_match_ptr(platform_lcd_of_match), |
169 | }, | 156 | }, |
170 | .probe = platform_lcd_probe, | 157 | .probe = platform_lcd_probe, |
171 | .remove = platform_lcd_remove, | ||
172 | }; | 158 | }; |
173 | 159 | ||
174 | module_platform_driver(platform_lcd_driver); | 160 | module_platform_driver(platform_lcd_driver); |
diff --git a/drivers/video/backlight/pwm_bl.c b/drivers/video/backlight/pwm_bl.c index 1fea627394d7..36db5d98dd2f 100644 --- a/drivers/video/backlight/pwm_bl.c +++ b/drivers/video/backlight/pwm_bl.c | |||
@@ -163,7 +163,7 @@ static int pwm_backlight_parse_dt(struct device *dev, | |||
163 | 163 | ||
164 | static int pwm_backlight_probe(struct platform_device *pdev) | 164 | static int pwm_backlight_probe(struct platform_device *pdev) |
165 | { | 165 | { |
166 | struct platform_pwm_backlight_data *data = pdev->dev.platform_data; | 166 | struct platform_pwm_backlight_data *data = dev_get_platdata(&pdev->dev); |
167 | struct platform_pwm_backlight_data defdata; | 167 | struct platform_pwm_backlight_data defdata; |
168 | struct backlight_properties props; | 168 | struct backlight_properties props; |
169 | struct backlight_device *bl; | 169 | struct backlight_device *bl; |
diff --git a/drivers/video/backlight/s6e63m0.c b/drivers/video/backlight/s6e63m0.c index b37bb1854bf4..510a1bcf76f1 100644 --- a/drivers/video/backlight/s6e63m0.c +++ b/drivers/video/backlight/s6e63m0.c | |||
@@ -735,13 +735,14 @@ static int s6e63m0_probe(struct spi_device *spi) | |||
735 | lcd->spi = spi; | 735 | lcd->spi = spi; |
736 | lcd->dev = &spi->dev; | 736 | lcd->dev = &spi->dev; |
737 | 737 | ||
738 | lcd->lcd_pd = spi->dev.platform_data; | 738 | lcd->lcd_pd = dev_get_platdata(&spi->dev); |
739 | if (!lcd->lcd_pd) { | 739 | if (!lcd->lcd_pd) { |
740 | dev_err(&spi->dev, "platform data is NULL.\n"); | 740 | dev_err(&spi->dev, "platform data is NULL.\n"); |
741 | return -EINVAL; | 741 | return -EINVAL; |
742 | } | 742 | } |
743 | 743 | ||
744 | ld = lcd_device_register("s6e63m0", &spi->dev, lcd, &s6e63m0_lcd_ops); | 744 | ld = devm_lcd_device_register(&spi->dev, "s6e63m0", &spi->dev, lcd, |
745 | &s6e63m0_lcd_ops); | ||
745 | if (IS_ERR(ld)) | 746 | if (IS_ERR(ld)) |
746 | return PTR_ERR(ld); | 747 | return PTR_ERR(ld); |
747 | 748 | ||
@@ -751,12 +752,11 @@ static int s6e63m0_probe(struct spi_device *spi) | |||
751 | props.type = BACKLIGHT_RAW; | 752 | props.type = BACKLIGHT_RAW; |
752 | props.max_brightness = MAX_BRIGHTNESS; | 753 | props.max_brightness = MAX_BRIGHTNESS; |
753 | 754 | ||
754 | bd = backlight_device_register("s6e63m0bl-bl", &spi->dev, lcd, | 755 | bd = devm_backlight_device_register(&spi->dev, "s6e63m0bl-bl", |
755 | &s6e63m0_backlight_ops, &props); | 756 | &spi->dev, lcd, &s6e63m0_backlight_ops, |
756 | if (IS_ERR(bd)) { | 757 | &props); |
757 | ret = PTR_ERR(bd); | 758 | if (IS_ERR(bd)) |
758 | goto out_lcd_unregister; | 759 | return PTR_ERR(bd); |
759 | } | ||
760 | 760 | ||
761 | bd->props.brightness = MAX_BRIGHTNESS; | 761 | bd->props.brightness = MAX_BRIGHTNESS; |
762 | lcd->bd = bd; | 762 | lcd->bd = bd; |
@@ -798,10 +798,6 @@ static int s6e63m0_probe(struct spi_device *spi) | |||
798 | dev_info(&spi->dev, "s6e63m0 panel driver has been probed.\n"); | 798 | dev_info(&spi->dev, "s6e63m0 panel driver has been probed.\n"); |
799 | 799 | ||
800 | return 0; | 800 | return 0; |
801 | |||
802 | out_lcd_unregister: | ||
803 | lcd_device_unregister(ld); | ||
804 | return ret; | ||
805 | } | 801 | } |
806 | 802 | ||
807 | static int s6e63m0_remove(struct spi_device *spi) | 803 | static int s6e63m0_remove(struct spi_device *spi) |
@@ -811,8 +807,6 @@ static int s6e63m0_remove(struct spi_device *spi) | |||
811 | s6e63m0_power(lcd, FB_BLANK_POWERDOWN); | 807 | s6e63m0_power(lcd, FB_BLANK_POWERDOWN); |
812 | device_remove_file(&spi->dev, &dev_attr_gamma_table); | 808 | device_remove_file(&spi->dev, &dev_attr_gamma_table); |
813 | device_remove_file(&spi->dev, &dev_attr_gamma_mode); | 809 | device_remove_file(&spi->dev, &dev_attr_gamma_mode); |
814 | backlight_device_unregister(lcd->bd); | ||
815 | lcd_device_unregister(lcd->ld); | ||
816 | 810 | ||
817 | return 0; | 811 | return 0; |
818 | } | 812 | } |
diff --git a/drivers/video/backlight/tdo24m.c b/drivers/video/backlight/tdo24m.c index 18cdf466d50a..908016fc5829 100644 --- a/drivers/video/backlight/tdo24m.c +++ b/drivers/video/backlight/tdo24m.c | |||
@@ -338,7 +338,7 @@ static int tdo24m_probe(struct spi_device *spi) | |||
338 | enum tdo24m_model model; | 338 | enum tdo24m_model model; |
339 | int err; | 339 | int err; |
340 | 340 | ||
341 | pdata = spi->dev.platform_data; | 341 | pdata = dev_get_platdata(&spi->dev); |
342 | if (pdata) | 342 | if (pdata) |
343 | model = pdata->model; | 343 | model = pdata->model; |
344 | else | 344 | else |
@@ -385,21 +385,17 @@ static int tdo24m_probe(struct spi_device *spi) | |||
385 | return -EINVAL; | 385 | return -EINVAL; |
386 | } | 386 | } |
387 | 387 | ||
388 | lcd->lcd_dev = lcd_device_register("tdo24m", &spi->dev, | 388 | lcd->lcd_dev = devm_lcd_device_register(&spi->dev, "tdo24m", &spi->dev, |
389 | lcd, &tdo24m_ops); | 389 | lcd, &tdo24m_ops); |
390 | if (IS_ERR(lcd->lcd_dev)) | 390 | if (IS_ERR(lcd->lcd_dev)) |
391 | return PTR_ERR(lcd->lcd_dev); | 391 | return PTR_ERR(lcd->lcd_dev); |
392 | 392 | ||
393 | spi_set_drvdata(spi, lcd); | 393 | spi_set_drvdata(spi, lcd); |
394 | err = tdo24m_power(lcd, FB_BLANK_UNBLANK); | 394 | err = tdo24m_power(lcd, FB_BLANK_UNBLANK); |
395 | if (err) | 395 | if (err) |
396 | goto out_unregister; | 396 | return err; |
397 | 397 | ||
398 | return 0; | 398 | return 0; |
399 | |||
400 | out_unregister: | ||
401 | lcd_device_unregister(lcd->lcd_dev); | ||
402 | return err; | ||
403 | } | 399 | } |
404 | 400 | ||
405 | static int tdo24m_remove(struct spi_device *spi) | 401 | static int tdo24m_remove(struct spi_device *spi) |
@@ -407,8 +403,6 @@ static int tdo24m_remove(struct spi_device *spi) | |||
407 | struct tdo24m *lcd = spi_get_drvdata(spi); | 403 | struct tdo24m *lcd = spi_get_drvdata(spi); |
408 | 404 | ||
409 | tdo24m_power(lcd, FB_BLANK_POWERDOWN); | 405 | tdo24m_power(lcd, FB_BLANK_POWERDOWN); |
410 | lcd_device_unregister(lcd->lcd_dev); | ||
411 | |||
412 | return 0; | 406 | return 0; |
413 | } | 407 | } |
414 | 408 | ||
diff --git a/drivers/video/backlight/tosa_bl.c b/drivers/video/backlight/tosa_bl.c index 9df66ac68b34..b8db9338cacd 100644 --- a/drivers/video/backlight/tosa_bl.c +++ b/drivers/video/backlight/tosa_bl.c | |||
@@ -38,7 +38,7 @@ struct tosa_bl_data { | |||
38 | 38 | ||
39 | static void tosa_bl_set_backlight(struct tosa_bl_data *data, int brightness) | 39 | static void tosa_bl_set_backlight(struct tosa_bl_data *data, int brightness) |
40 | { | 40 | { |
41 | struct spi_device *spi = data->i2c->dev.platform_data; | 41 | struct spi_device *spi = dev_get_platdata(&data->i2c->dev); |
42 | 42 | ||
43 | i2c_smbus_write_byte_data(data->i2c, DAC_CH1, data->comadj); | 43 | i2c_smbus_write_byte_data(data->i2c, DAC_CH1, data->comadj); |
44 | 44 | ||
diff --git a/drivers/video/backlight/tps65217_bl.c b/drivers/video/backlight/tps65217_bl.c index 05782312aeb3..cbba37e6836e 100644 --- a/drivers/video/backlight/tps65217_bl.c +++ b/drivers/video/backlight/tps65217_bl.c | |||
@@ -287,12 +287,11 @@ static int tps65217_bl_probe(struct platform_device *pdev) | |||
287 | if (IS_ERR(pdata)) | 287 | if (IS_ERR(pdata)) |
288 | return PTR_ERR(pdata); | 288 | return PTR_ERR(pdata); |
289 | } else { | 289 | } else { |
290 | if (!pdev->dev.platform_data) { | 290 | pdata = dev_get_platdata(&pdev->dev); |
291 | if (!pdata) { | ||
291 | dev_err(&pdev->dev, "no platform data provided\n"); | 292 | dev_err(&pdev->dev, "no platform data provided\n"); |
292 | return -EINVAL; | 293 | return -EINVAL; |
293 | } | 294 | } |
294 | |||
295 | pdata = pdev->dev.platform_data; | ||
296 | } | 295 | } |
297 | 296 | ||
298 | tps65217_bl = devm_kzalloc(&pdev->dev, sizeof(*tps65217_bl), | 297 | tps65217_bl = devm_kzalloc(&pdev->dev, sizeof(*tps65217_bl), |
@@ -314,7 +313,7 @@ static int tps65217_bl_probe(struct platform_device *pdev) | |||
314 | bl_props.type = BACKLIGHT_RAW; | 313 | bl_props.type = BACKLIGHT_RAW; |
315 | bl_props.max_brightness = 100; | 314 | bl_props.max_brightness = 100; |
316 | 315 | ||
317 | tps65217_bl->bl = backlight_device_register(pdev->name, | 316 | tps65217_bl->bl = devm_backlight_device_register(&pdev->dev, pdev->name, |
318 | tps65217_bl->dev, tps65217_bl, | 317 | tps65217_bl->dev, tps65217_bl, |
319 | &tps65217_bl_ops, &bl_props); | 318 | &tps65217_bl_ops, &bl_props); |
320 | if (IS_ERR(tps65217_bl->bl)) { | 319 | if (IS_ERR(tps65217_bl->bl)) { |
@@ -330,18 +329,8 @@ static int tps65217_bl_probe(struct platform_device *pdev) | |||
330 | return 0; | 329 | return 0; |
331 | } | 330 | } |
332 | 331 | ||
333 | static int tps65217_bl_remove(struct platform_device *pdev) | ||
334 | { | ||
335 | struct tps65217_bl *tps65217_bl = platform_get_drvdata(pdev); | ||
336 | |||
337 | backlight_device_unregister(tps65217_bl->bl); | ||
338 | |||
339 | return 0; | ||
340 | } | ||
341 | |||
342 | static struct platform_driver tps65217_bl_driver = { | 332 | static struct platform_driver tps65217_bl_driver = { |
343 | .probe = tps65217_bl_probe, | 333 | .probe = tps65217_bl_probe, |
344 | .remove = tps65217_bl_remove, | ||
345 | .driver = { | 334 | .driver = { |
346 | .owner = THIS_MODULE, | 335 | .owner = THIS_MODULE, |
347 | .name = "tps65217-bl", | 336 | .name = "tps65217-bl", |
diff --git a/drivers/video/backlight/wm831x_bl.c b/drivers/video/backlight/wm831x_bl.c index 9e5517a3a52b..8b9455e93069 100644 --- a/drivers/video/backlight/wm831x_bl.c +++ b/drivers/video/backlight/wm831x_bl.c | |||
@@ -123,7 +123,7 @@ static const struct backlight_ops wm831x_backlight_ops = { | |||
123 | static int wm831x_backlight_probe(struct platform_device *pdev) | 123 | static int wm831x_backlight_probe(struct platform_device *pdev) |
124 | { | 124 | { |
125 | struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent); | 125 | struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent); |
126 | struct wm831x_pdata *wm831x_pdata; | 126 | struct wm831x_pdata *wm831x_pdata = dev_get_platdata(pdev->dev.parent); |
127 | struct wm831x_backlight_pdata *pdata; | 127 | struct wm831x_backlight_pdata *pdata; |
128 | struct wm831x_backlight_data *data; | 128 | struct wm831x_backlight_data *data; |
129 | struct backlight_device *bl; | 129 | struct backlight_device *bl; |
@@ -131,12 +131,10 @@ static int wm831x_backlight_probe(struct platform_device *pdev) | |||
131 | int ret, i, max_isel, isink_reg, dcdc_cfg; | 131 | int ret, i, max_isel, isink_reg, dcdc_cfg; |
132 | 132 | ||
133 | /* We need platform data */ | 133 | /* We need platform data */ |
134 | if (pdev->dev.parent->platform_data) { | 134 | if (wm831x_pdata) |
135 | wm831x_pdata = pdev->dev.parent->platform_data; | ||
136 | pdata = wm831x_pdata->backlight; | 135 | pdata = wm831x_pdata->backlight; |
137 | } else { | 136 | else |
138 | pdata = NULL; | 137 | pdata = NULL; |
139 | } | ||
140 | 138 | ||
141 | if (!pdata) { | 139 | if (!pdata) { |
142 | dev_err(&pdev->dev, "No platform data supplied\n"); | 140 | dev_err(&pdev->dev, "No platform data supplied\n"); |
@@ -197,8 +195,8 @@ static int wm831x_backlight_probe(struct platform_device *pdev) | |||
197 | memset(&props, 0, sizeof(props)); | 195 | memset(&props, 0, sizeof(props)); |
198 | props.type = BACKLIGHT_RAW; | 196 | props.type = BACKLIGHT_RAW; |
199 | props.max_brightness = max_isel; | 197 | props.max_brightness = max_isel; |
200 | bl = backlight_device_register("wm831x", &pdev->dev, data, | 198 | bl = devm_backlight_device_register(&pdev->dev, "wm831x", &pdev->dev, |
201 | &wm831x_backlight_ops, &props); | 199 | data, &wm831x_backlight_ops, &props); |
202 | if (IS_ERR(bl)) { | 200 | if (IS_ERR(bl)) { |
203 | dev_err(&pdev->dev, "failed to register backlight\n"); | 201 | dev_err(&pdev->dev, "failed to register backlight\n"); |
204 | return PTR_ERR(bl); | 202 | return PTR_ERR(bl); |
@@ -216,21 +214,12 @@ static int wm831x_backlight_probe(struct platform_device *pdev) | |||
216 | return 0; | 214 | return 0; |
217 | } | 215 | } |
218 | 216 | ||
219 | static int wm831x_backlight_remove(struct platform_device *pdev) | ||
220 | { | ||
221 | struct backlight_device *bl = platform_get_drvdata(pdev); | ||
222 | |||
223 | backlight_device_unregister(bl); | ||
224 | return 0; | ||
225 | } | ||
226 | |||
227 | static struct platform_driver wm831x_backlight_driver = { | 217 | static struct platform_driver wm831x_backlight_driver = { |
228 | .driver = { | 218 | .driver = { |
229 | .name = "wm831x-backlight", | 219 | .name = "wm831x-backlight", |
230 | .owner = THIS_MODULE, | 220 | .owner = THIS_MODULE, |
231 | }, | 221 | }, |
232 | .probe = wm831x_backlight_probe, | 222 | .probe = wm831x_backlight_probe, |
233 | .remove = wm831x_backlight_remove, | ||
234 | }; | 223 | }; |
235 | 224 | ||
236 | module_platform_driver(wm831x_backlight_driver); | 225 | module_platform_driver(wm831x_backlight_driver); |