aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/video
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/video')
-rw-r--r--drivers/video/acornfb.c4
-rw-r--r--drivers/video/backlight/88pm860x_bl.c18
-rw-r--r--drivers/video/backlight/Kconfig10
-rw-r--r--drivers/video/backlight/Makefile2
-rw-r--r--drivers/video/backlight/aat2870_bl.c13
-rw-r--r--drivers/video/backlight/adp5520_bl.c11
-rw-r--r--drivers/video/backlight/adp8860_bl.c17
-rw-r--r--drivers/video/backlight/adp8870_bl.c17
-rw-r--r--drivers/video/backlight/ams369fg06.c24
-rw-r--r--drivers/video/backlight/as3711_bl.c26
-rw-r--r--drivers/video/backlight/atmel-pwm-bl.c96
-rw-r--r--drivers/video/backlight/bd6107.c6
-rw-r--r--drivers/video/backlight/corgi_lcd.c30
-rw-r--r--drivers/video/backlight/cr_bllcd.c13
-rw-r--r--drivers/video/backlight/da903x_bl.c16
-rw-r--r--drivers/video/backlight/da9052_bl.c6
-rw-r--r--drivers/video/backlight/ep93xx_bl.c13
-rw-r--r--drivers/video/backlight/generic_bl.c8
-rw-r--r--drivers/video/backlight/gpio_backlight.c17
-rw-r--r--drivers/video/backlight/hx8357.c20
-rw-r--r--drivers/video/backlight/ili922x.c7
-rw-r--r--drivers/video/backlight/ili9320.c15
-rw-r--r--drivers/video/backlight/kb3886_bl.c20
-rw-r--r--drivers/video/backlight/l4f00242t03.c6
-rw-r--r--drivers/video/backlight/ld9040.c23
-rw-r--r--drivers/video/backlight/ld9040_gamma.h4
-rw-r--r--drivers/video/backlight/lm3533_bl.c12
-rw-r--r--drivers/video/backlight/lm3630_bl.c475
-rw-r--r--drivers/video/backlight/lm3630a_bl.c483
-rw-r--r--drivers/video/backlight/lm3639_bl.c13
-rw-r--r--drivers/video/backlight/lms283gf05.c17
-rw-r--r--drivers/video/backlight/lms501kf03.c8
-rw-r--r--drivers/video/backlight/lp855x_bl.c41
-rw-r--r--drivers/video/backlight/lp8788_bl.c2
-rw-r--r--drivers/video/backlight/ltv350qv.c11
-rw-r--r--drivers/video/backlight/lv5207lp.c9
-rw-r--r--drivers/video/backlight/max8925_bl.c17
-rw-r--r--drivers/video/backlight/omap1_bl.c2
-rw-r--r--drivers/video/backlight/pandora_bl.c12
-rw-r--r--drivers/video/backlight/pcf50633-backlight.c15
-rw-r--r--drivers/video/backlight/platform_lcd.c22
-rw-r--r--drivers/video/backlight/pwm_bl.c2
-rw-r--r--drivers/video/backlight/s6e63m0.c22
-rw-r--r--drivers/video/backlight/tdo24m.c14
-rw-r--r--drivers/video/backlight/tosa_bl.c2
-rw-r--r--drivers/video/backlight/tps65217_bl.c17
-rw-r--r--drivers/video/backlight/wm831x_bl.c21
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,
196static int pm860x_backlight_probe(struct platform_device *pdev) 196static 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;
263out_brt:
264 backlight_device_unregister(bl);
265 return ret;
266}
267
268static 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
276static struct platform_driver pm860x_backlight_driver = { 265static 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
285module_platform_driver(pm860x_backlight_driver); 273module_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
371config BACKLIGHT_LM3630 371config 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
378config BACKLIGHT_LM3639 378config 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
394config BACKLIGHT_LP8788 394config 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
37obj-$(CONFIG_BACKLIGHT_HP680) += hp680_bl.o 37obj-$(CONFIG_BACKLIGHT_HP680) += hp680_bl.o
38obj-$(CONFIG_BACKLIGHT_HP700) += jornada720_bl.o 38obj-$(CONFIG_BACKLIGHT_HP700) += jornada720_bl.o
39obj-$(CONFIG_BACKLIGHT_LM3533) += lm3533_bl.o 39obj-$(CONFIG_BACKLIGHT_LM3533) += lm3533_bl.o
40obj-$(CONFIG_BACKLIGHT_LM3630) += lm3630_bl.o 40obj-$(CONFIG_BACKLIGHT_LM3630A) += lm3630a_bl.o
41obj-$(CONFIG_BACKLIGHT_LM3639) += lm3639_bl.o 41obj-$(CONFIG_BACKLIGHT_LM3639) += lm3639_bl.o
42obj-$(CONFIG_BACKLIGHT_LOCOMO) += locomolcd.o 42obj-$(CONFIG_BACKLIGHT_LOCOMO) += locomolcd.o
43obj-$(CONFIG_BACKLIGHT_LP855X) += lp855x_bl.o 43obj-$(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
128static int aat2870_bl_probe(struct platform_device *pdev) 128static 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
202out_bl_dev_unregister:
203 backlight_device_unregister(bd);
204out: 203out:
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)
216static int adp8860_led_probe(struct i2c_client *client) 216static 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)
300static int adp8860_led_remove(struct i2c_client *client) 300static 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);
754out1:
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)
238static int adp8870_led_probe(struct i2c_client *client) 238static 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)
325static int adp8870_led_remove(struct i2c_client *client) 325static 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);
928out1:
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
520out_lcd_unregister:
521 lcd_device_unregister(ld);
522 return ret;
523} 518}
524 519
525static int ams369fg06_remove(struct spi_device *spi) 520static 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
467esu2:
468 backlight_device_unregister(supply->su1.bl);
469 return ret;
470}
471
472static 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
482static struct platform_driver as3711_backlight_driver = { 467static 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
491module_platform_driver(as3711_backlight_driver); 475module_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
29static 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
30static int atmel_pwm_bl_set_intensity(struct backlight_device *bd) 37static 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)
70static int atmel_pwm_bl_get_intensity(struct backlight_device *bd) 71static 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
86static int atmel_pwm_bl_init_pwm(struct atmel_pwm_bl *pwmbl) 86static 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
197err_free_bl_dev:
198 backlight_device_unregister(bldev);
199err_free_pwm: 192err_free_pwm:
200 pwm_channel_free(&pwmbl->pwmc); 193 pwm_channel_free(&pwmbl->pwmc);
201err_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);
229MODULE_AUTHOR("Hans-Christian egtvedt <hans-christian.egtvedt@atmel.com>"); 220MODULE_AUTHOR("Hans-Christian egtvedt <hans-christian.egtvedt@atmel.com>");
230MODULE_DESCRIPTION("Atmel PWM backlight driver"); 221MODULE_DESCRIPTION("Atmel PWM backlight driver");
231MODULE_LICENSE("GPL"); 222MODULE_LICENSE("GPL");
223MODULE_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 = {
128static int bd6107_probe(struct i2c_client *client, 128static 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,
533static int corgi_lcd_probe(struct spi_device *spi) 533static 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
587err_unregister_bl:
588 backlight_device_unregister(lcd->bl_dev);
589err_unregister_lcd:
590 lcd_device_unregister(lcd->lcd_dev);
591 return ret;
592} 586}
593 587
594static int corgi_lcd_remove(struct spi_device *spi) 588static 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
110static int da903x_backlight_probe(struct platform_device *pdev) 110static 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
161static 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
169static struct platform_driver da903x_backlight_driver = { 162static 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
178module_platform_driver(da903x_backlight_driver); 170module_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
109static 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
118static int ep93xxbl_suspend(struct device *dev) 110static 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
146module_platform_driver(ep93xxbl_driver); 137module_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 = {
79static int genericbl_probe(struct platform_device *pdev) 79static 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
63static int gpio_backlight_probe(struct platform_device *pdev) 63static 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
111static 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
119static struct platform_driver gpio_backlight_driver = { 113static 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
128module_platform_driver(gpio_backlight_driver); 121module_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
670init_error:
671 lcd_device_unregister(lcdev);
672 return ret;
673}
674
675static 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
683static struct spi_driver hx8357_driver = { 672static 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
531static int ili922x_remove(struct spi_device *spi) 531static 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,
198int ili9320_probe_spi(struct spi_device *spi, 198int 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}
261EXPORT_SYMBOL_GPL(ili9320_probe_spi); 257EXPORT_SYMBOL_GPL(ili9320_probe_spi);
262 258
263int ili9320_remove(struct ili9320 *ili) 259int 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}
271EXPORT_SYMBOL_GPL(ili9320_remove); 264EXPORT_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 = {
141static int kb3886bl_probe(struct platform_device *pdev) 141static 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
169static 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
178static struct platform_driver kb3886bl_driver = { 169static 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
49static void l4f00242t03_lcd_init(struct spi_device *spi) 49static 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
89static void l4f00242t03_lcd_powerdown(struct spi_device *spi) 89static 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 = {
171static int l4f00242t03_probe(struct spi_device *spi) 171static 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
761out_unregister_lcd:
762 lcd_device_unregister(lcd->ld);
763
764 return ret;
765} 759}
766 760
767static int ld9040_remove(struct spi_device *spi) 761static 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
170struct ld9040_gamma { 170struct 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
174static 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
346err_sysfs_remove: 347err_sysfs_remove:
347 sysfs_remove_group(&bd->dev.kobj, &lm3533_bl_attribute_group); 348 sysfs_remove_group(&bd->dev.kobj, &lm3533_bl_attribute_group);
348err_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
34enum lm3630_leds {
35 BLED_ALL = 0,
36 BLED_1,
37 BLED_2
38};
39
40static 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
46struct 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 */
58static 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
97out:
98 dev_err(pchip->dev, "i2c failed to access register\n");
99 return ret;
100}
101
102/* interrupt handling */
103static 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, &reg_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
121static 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;
134out:
135 dev_err(pchip->dev, "i2c failed to access register\n");
136 return IRQ_HANDLED;
137}
138
139static 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
156static bool
157set_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 */
167static 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;
198out:
199 dev_err(pchip->dev, "i2c failed to access REG_CTRL\n");
200 return bl->props.brightness;
201}
202
203static 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, &reg_val);
212 if (ret < 0)
213 goto out;
214 brightness = reg_val & 0x01;
215 ret = regmap_read(pchip->regmap, REG_PWM_OUTLOW, &reg_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, &reg_val);
225 if (ret < 0)
226 goto out;
227 brightness = reg_val + 1;
228 }
229 bl->props.brightness = brightness;
230 return bl->props.brightness;
231out:
232 dev_err(pchip->dev, "i2c failed to access register\n");
233 return 0;
234}
235
236static 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
242static 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;
261out:
262 dev_err(pchip->dev, "i2c failed to access register\n");
263 return bl->props.brightness;
264}
265
266static 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, &reg_val);
275 if (ret < 0)
276 goto out;
277 brightness = reg_val & 0x01;
278 ret = regmap_read(pchip->regmap, REG_PWM_OUTLOW, &reg_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, &reg_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;
295out:
296 dev_err(pchip->dev, "i2c failed to access register\n");
297 return bl->props.brightness;
298}
299
300static 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
306static 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
338static 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
346static const struct regmap_config lm3630_regmap = {
347 .reg_bits = 8,
348 .val_bits = 8,
349 .max_register = REG_MAX,
350};
351
352static 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
425err_bl_reg:
426 dev_err(&client->dev, "fail : backlight register.\n");
427 lm3630_backlight_unregister(pchip);
428err_chip_init:
429 return ret;
430}
431
432static 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
454static const struct i2c_device_id lm3630_id[] = {
455 {LM3630_NAME, 0},
456 {}
457};
458
459MODULE_DEVICE_TABLE(i2c, lm3630_id);
460
461static 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
470module_i2c_driver(lm3630_i2c_driver);
471
472MODULE_DESCRIPTION("Texas Instruments Backlight driver for LM3630");
473MODULE_AUTHOR("G.Shark Jeong <gshark.jeong@gmail.com>");
474MODULE_AUTHOR("Daniel Jeong <daniel.jeong@ti.com>");
475MODULE_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
37struct 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 */
51static 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, &reg_val);
57 if (rval < 0)
58 return rval;
59 return reg_val & 0xFF;
60}
61
62static 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
68static 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 */
76static 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 */
106static 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
123static 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
139static 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
163static 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 */
176static 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
205out_i2c_err:
206 dev_err(pchip->dev, "i2c failed to access\n");
207 return bl->props.brightness;
208}
209
210static 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
238out:
239 bl->props.brightness = brightness;
240 return bl->props.brightness;
241out_i2c_err:
242 dev_err(pchip->dev, "i2c failed to access register\n");
243 return 0;
244}
245
246static 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 */
253static 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
282out_i2c_err:
283 dev_err(pchip->dev, "i2c failed to access REG_CTRL\n");
284 return bl->props.brightness;
285}
286
287static 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
315out:
316 bl->props.brightness = brightness;
317 return bl->props.brightness;
318out_i2c_err:
319 dev_err(pchip->dev, "i2c failed to access register\n");
320 return 0;
321}
322
323static 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
329static 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
360static const struct regmap_config lm3630a_regmap = {
361 .reg_bits = 8,
362 .val_bits = 8,
363 .max_register = REG_MAX,
364};
365
366static 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
441static 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
462static const struct i2c_device_id lm3630a_id[] = {
463 {LM3630A_NAME, 0},
464 {}
465};
466
467MODULE_DEVICE_TABLE(i2c, lm3630a_id);
468
469static 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
478module_i2c_driver(lm3630a_i2c_driver);
479
480MODULE_DESCRIPTION("Texas Instruments Backlight driver for LM3630A");
481MODULE_AUTHOR("Daniel Jeong <gshark.jeong@gmail.com>");
482MODULE_AUTHOR("LDD MLP <ldd-mlp@list.ti.com>");
483MODULE_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 = {
153static int lms283gf05_probe(struct spi_device *spi) 153static 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
193static 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
202static struct spi_driver lms283gf05_driver = { 194static 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
211module_spi_driver(lms283gf05_driver); 202module_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
302static void lp855x_backlight_unregister(struct lp855x *lp)
303{
304 if (lp->bl)
305 backlight_device_unregister(lp->bl);
306}
307
308static ssize_t lp855x_get_chip_id(struct device *dev, 313static 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)
394static int lp855x_probe(struct i2c_client *cl, const struct i2c_device_id *id) 399static 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
450err_sysfs:
451 lp855x_backlight_unregister(lp);
452err_dev:
453 return ret;
454} 454}
455 455
456static int lp855x_remove(struct i2c_client *cl) 456static 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
55struct lp8788_bl_config default_bl_config = { 55static 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, &ltv_ops); 245 ld = devm_lcd_device_register(&spi->dev, "ltv350qv", &spi->dev, lcd,
246 &ltv_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
259out_unregister:
260 lcd_device_unregister(ld);
261 return ret;
262} 259}
263 260
264static int ltv350qv_remove(struct spi_device *spi) 261static 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 = {
93static int lv5207lp_probe(struct i2c_client *client, 93static 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;
194out_brt:
195 backlight_device_unregister(bl);
196 return ret;
197}
198
199static 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
207static struct platform_driver max8925_backlight_driver = { 197static 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
216module_platform_driver(max8925_backlight_driver); 205module_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
148static 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
155static struct platform_driver pandora_backlight_driver = { 148static 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
164module_platform_driver(pandora_backlight_driver); 156module_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
150static 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
159static struct platform_driver pcf50633_bl_driver = { 151static 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
121static 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
174module_platform_driver(platform_lcd_driver); 160module_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
164static int pwm_backlight_probe(struct platform_device *pdev) 164static 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
802out_lcd_unregister:
803 lcd_device_unregister(ld);
804 return ret;
805} 801}
806 802
807static int s6e63m0_remove(struct spi_device *spi) 803static 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
400out_unregister:
401 lcd_device_unregister(lcd->lcd_dev);
402 return err;
403} 399}
404 400
405static int tdo24m_remove(struct spi_device *spi) 401static 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
39static void tosa_bl_set_backlight(struct tosa_bl_data *data, int brightness) 39static 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
333static 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
342static struct platform_driver tps65217_bl_driver = { 332static 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 = {
123static int wm831x_backlight_probe(struct platform_device *pdev) 123static 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
219static 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
227static struct platform_driver wm831x_backlight_driver = { 217static 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
236module_platform_driver(wm831x_backlight_driver); 225module_platform_driver(wm831x_backlight_driver);