diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-11-13 01:45:43 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-11-13 01:45:43 -0500 |
commit | 5cbb3d216e2041700231bcfc383ee5f8b7fc8b74 (patch) | |
tree | a738fa82dbcefa9bd283c08bc67f38827be63937 /drivers | |
parent | 9bc9ccd7db1c9f043f75380b5a5b94912046a60e (diff) | |
parent | 4e9b45a19241354daec281d7a785739829b52359 (diff) |
Merge branch 'akpm' (patches from Andrew Morton)
Merge first patch-bomb from Andrew Morton:
"Quite a lot of other stuff is banked up awaiting further
next->mainline merging, but this batch contains:
- Lots of random misc patches
- OCFS2
- Most of MM
- backlight updates
- lib/ updates
- printk updates
- checkpatch updates
- epoll tweaking
- rtc updates
- hfs
- hfsplus
- documentation
- procfs
- update gcov to gcc-4.7 format
- IPC"
* emailed patches from Andrew Morton <akpm@linux-foundation.org>: (269 commits)
ipc, msg: fix message length check for negative values
ipc/util.c: remove unnecessary work pending test
devpts: plug the memory leak in kill_sb
./Makefile: export initial ramdisk compression config option
init/Kconfig: add option to disable kernel compression
drivers: w1: make w1_slave::flags long to avoid memory corruption
drivers/w1/masters/ds1wm.cuse dev_get_platdata()
drivers/memstick/core/ms_block.c: fix unreachable state in h_msb_read_page()
drivers/memstick/core/mspro_block.c: fix attributes array allocation
drivers/pps/clients/pps-gpio.c: remove redundant of_match_ptr
kernel/panic.c: reduce 1 byte usage for print tainted buffer
gcov: reuse kbasename helper
kernel/gcov/fs.c: use pr_warn()
kernel/module.c: use pr_foo()
gcov: compile specific gcov implementation based on gcc version
gcov: add support for gcc 4.7 gcov format
gcov: move gcov structs definitions to a gcc version specific file
kernel/taskstats.c: return -ENOMEM when alloc memory fails in add_del_listener()
kernel/taskstats.c: add nla_nest_cancel() for failure processing between nla_nest_start() and nla_nest_end()
kernel/sysctl_binary.c: use scnprintf() instead of snprintf()
...
Diffstat (limited to 'drivers')
94 files changed, 1804 insertions, 1126 deletions
diff --git a/drivers/char/Kconfig b/drivers/char/Kconfig index 14219972c745..fa3243d71c76 100644 --- a/drivers/char/Kconfig +++ b/drivers/char/Kconfig | |||
@@ -522,10 +522,16 @@ config HPET_MMAP | |||
522 | If you say Y here, user applications will be able to mmap | 522 | If you say Y here, user applications will be able to mmap |
523 | the HPET registers. | 523 | the HPET registers. |
524 | 524 | ||
525 | config HPET_MMAP_DEFAULT | ||
526 | bool "Enable HPET MMAP access by default" | ||
527 | default y | ||
528 | depends on HPET_MMAP | ||
529 | help | ||
525 | In some hardware implementations, the page containing HPET | 530 | In some hardware implementations, the page containing HPET |
526 | registers may also contain other things that shouldn't be | 531 | registers may also contain other things that shouldn't be |
527 | exposed to the user. If this applies to your hardware, | 532 | exposed to the user. This option selects the default (if |
528 | say N here. | 533 | kernel parameter hpet_mmap is not set) user access to the |
534 | registers for applications that require it. | ||
529 | 535 | ||
530 | config HANGCHECK_TIMER | 536 | config HANGCHECK_TIMER |
531 | tristate "Hangcheck timer" | 537 | tristate "Hangcheck timer" |
diff --git a/drivers/char/hpet.c b/drivers/char/hpet.c index dca5834685cf..5d9c31dfc905 100644 --- a/drivers/char/hpet.c +++ b/drivers/char/hpet.c | |||
@@ -367,12 +367,29 @@ static unsigned int hpet_poll(struct file *file, poll_table * wait) | |||
367 | return 0; | 367 | return 0; |
368 | } | 368 | } |
369 | 369 | ||
370 | #ifdef CONFIG_HPET_MMAP | ||
371 | #ifdef CONFIG_HPET_MMAP_DEFAULT | ||
372 | static int hpet_mmap_enabled = 1; | ||
373 | #else | ||
374 | static int hpet_mmap_enabled = 0; | ||
375 | #endif | ||
376 | |||
377 | static __init int hpet_mmap_enable(char *str) | ||
378 | { | ||
379 | get_option(&str, &hpet_mmap_enabled); | ||
380 | pr_info("HPET mmap %s\n", hpet_mmap_enabled ? "enabled" : "disabled"); | ||
381 | return 1; | ||
382 | } | ||
383 | __setup("hpet_mmap", hpet_mmap_enable); | ||
384 | |||
370 | static int hpet_mmap(struct file *file, struct vm_area_struct *vma) | 385 | static int hpet_mmap(struct file *file, struct vm_area_struct *vma) |
371 | { | 386 | { |
372 | #ifdef CONFIG_HPET_MMAP | ||
373 | struct hpet_dev *devp; | 387 | struct hpet_dev *devp; |
374 | unsigned long addr; | 388 | unsigned long addr; |
375 | 389 | ||
390 | if (!hpet_mmap_enabled) | ||
391 | return -EACCES; | ||
392 | |||
376 | devp = file->private_data; | 393 | devp = file->private_data; |
377 | addr = devp->hd_hpets->hp_hpet_phys; | 394 | addr = devp->hd_hpets->hp_hpet_phys; |
378 | 395 | ||
@@ -381,10 +398,13 @@ static int hpet_mmap(struct file *file, struct vm_area_struct *vma) | |||
381 | 398 | ||
382 | vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); | 399 | vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); |
383 | return vm_iomap_memory(vma, addr, PAGE_SIZE); | 400 | return vm_iomap_memory(vma, addr, PAGE_SIZE); |
401 | } | ||
384 | #else | 402 | #else |
403 | static int hpet_mmap(struct file *file, struct vm_area_struct *vma) | ||
404 | { | ||
385 | return -ENOSYS; | 405 | return -ENOSYS; |
386 | #endif | ||
387 | } | 406 | } |
407 | #endif | ||
388 | 408 | ||
389 | static int hpet_fasync(int fd, struct file *file, int on) | 409 | static int hpet_fasync(int fd, struct file *file, int on) |
390 | { | 410 | { |
diff --git a/drivers/dma/mmp_tdma.c b/drivers/dma/mmp_tdma.c index 38cb517fb2eb..d3b6358e5a27 100644 --- a/drivers/dma/mmp_tdma.c +++ b/drivers/dma/mmp_tdma.c | |||
@@ -350,12 +350,7 @@ struct mmp_tdma_desc *mmp_tdma_alloc_descriptor(struct mmp_tdma_chan *tdmac) | |||
350 | if (!gpool) | 350 | if (!gpool) |
351 | return NULL; | 351 | return NULL; |
352 | 352 | ||
353 | tdmac->desc_arr = (void *)gen_pool_alloc(gpool, size); | 353 | tdmac->desc_arr = gen_pool_dma_alloc(gpool, size, &tdmac->desc_arr_phys); |
354 | if (!tdmac->desc_arr) | ||
355 | return NULL; | ||
356 | |||
357 | tdmac->desc_arr_phys = gen_pool_virt_to_phys(gpool, | ||
358 | (unsigned long)tdmac->desc_arr); | ||
359 | 354 | ||
360 | return tdmac->desc_arr; | 355 | return tdmac->desc_arr; |
361 | } | 356 | } |
diff --git a/drivers/iommu/omap-iopgtable.h b/drivers/iommu/omap-iopgtable.h index f4003d568a92..b6f9a51746ca 100644 --- a/drivers/iommu/omap-iopgtable.h +++ b/drivers/iommu/omap-iopgtable.h | |||
@@ -95,4 +95,4 @@ static inline phys_addr_t omap_iommu_translate(u32 d, u32 va, u32 mask) | |||
95 | #define iopte_offset(iopgd, da) (iopgd_page_vaddr(iopgd) + iopte_index(da)) | 95 | #define iopte_offset(iopgd, da) (iopgd_page_vaddr(iopgd) + iopte_index(da)) |
96 | 96 | ||
97 | #define to_iommu(dev) \ | 97 | #define to_iommu(dev) \ |
98 | ((struct omap_iommu *)platform_get_drvdata(to_platform_device(dev))) | 98 | (platform_get_drvdata(to_platform_device(dev))) |
diff --git a/drivers/media/platform/coda.c b/drivers/media/platform/coda.c index 449d2fec9e87..4993610051ee 100644 --- a/drivers/media/platform/coda.c +++ b/drivers/media/platform/coda.c | |||
@@ -3232,13 +3232,12 @@ static int coda_probe(struct platform_device *pdev) | |||
3232 | dev->iram_size = CODA7_IRAM_SIZE; | 3232 | dev->iram_size = CODA7_IRAM_SIZE; |
3233 | break; | 3233 | break; |
3234 | } | 3234 | } |
3235 | dev->iram_vaddr = gen_pool_alloc(dev->iram_pool, dev->iram_size); | 3235 | dev->iram_vaddr = (unsigned long)gen_pool_dma_alloc(dev->iram_pool, |
3236 | dev->iram_size, (dma_addr_t *)&dev->iram_paddr); | ||
3236 | if (!dev->iram_vaddr) { | 3237 | if (!dev->iram_vaddr) { |
3237 | dev_err(&pdev->dev, "unable to alloc iram\n"); | 3238 | dev_err(&pdev->dev, "unable to alloc iram\n"); |
3238 | return -ENOMEM; | 3239 | return -ENOMEM; |
3239 | } | 3240 | } |
3240 | dev->iram_paddr = gen_pool_virt_to_phys(dev->iram_pool, | ||
3241 | dev->iram_vaddr); | ||
3242 | 3241 | ||
3243 | platform_set_drvdata(pdev, dev); | 3242 | platform_set_drvdata(pdev, dev); |
3244 | 3243 | ||
diff --git a/drivers/memstick/core/ms_block.c b/drivers/memstick/core/ms_block.c index 08e70232062f..9188ef5d677e 100644 --- a/drivers/memstick/core/ms_block.c +++ b/drivers/memstick/core/ms_block.c | |||
@@ -401,7 +401,7 @@ again: | |||
401 | sizeof(struct ms_status_register))) | 401 | sizeof(struct ms_status_register))) |
402 | return 0; | 402 | return 0; |
403 | 403 | ||
404 | msb->state = MSB_RP_RECEIVE_OOB_READ; | 404 | msb->state = MSB_RP_RECIVE_STATUS_REG; |
405 | return 0; | 405 | return 0; |
406 | 406 | ||
407 | case MSB_RP_RECIVE_STATUS_REG: | 407 | case MSB_RP_RECIVE_STATUS_REG: |
diff --git a/drivers/memstick/core/mspro_block.c b/drivers/memstick/core/mspro_block.c index f4176ca3a794..fc145d202c46 100644 --- a/drivers/memstick/core/mspro_block.c +++ b/drivers/memstick/core/mspro_block.c | |||
@@ -1023,8 +1023,8 @@ static int mspro_block_read_attributes(struct memstick_dev *card) | |||
1023 | } else | 1023 | } else |
1024 | attr_count = attr->count; | 1024 | attr_count = attr->count; |
1025 | 1025 | ||
1026 | msb->attr_group.attrs = kzalloc((attr_count + 1) | 1026 | msb->attr_group.attrs = kcalloc(attr_count + 1, |
1027 | * sizeof(struct attribute), | 1027 | sizeof(*msb->attr_group.attrs), |
1028 | GFP_KERNEL); | 1028 | GFP_KERNEL); |
1029 | if (!msb->attr_group.attrs) { | 1029 | if (!msb->attr_group.attrs) { |
1030 | rc = -ENOMEM; | 1030 | rc = -ENOMEM; |
diff --git a/drivers/message/i2o/driver.c b/drivers/message/i2o/driver.c index b6b92d760510..1b18a0d1d05b 100644 --- a/drivers/message/i2o/driver.c +++ b/drivers/message/i2o/driver.c | |||
@@ -105,7 +105,8 @@ int i2o_driver_register(struct i2o_driver *drv) | |||
105 | osm_err("too many drivers registered, increase " | 105 | osm_err("too many drivers registered, increase " |
106 | "max_drivers\n"); | 106 | "max_drivers\n"); |
107 | spin_unlock_irqrestore(&i2o_drivers_lock, flags); | 107 | spin_unlock_irqrestore(&i2o_drivers_lock, flags); |
108 | return -EFAULT; | 108 | rc = -EFAULT; |
109 | goto out; | ||
109 | } | 110 | } |
110 | 111 | ||
111 | drv->context = i; | 112 | drv->context = i; |
@@ -124,11 +125,14 @@ int i2o_driver_register(struct i2o_driver *drv) | |||
124 | } | 125 | } |
125 | 126 | ||
126 | rc = driver_register(&drv->driver); | 127 | rc = driver_register(&drv->driver); |
127 | if (rc) { | 128 | if (rc) |
128 | if (drv->event) { | 129 | goto out; |
129 | destroy_workqueue(drv->event_queue); | 130 | |
130 | drv->event_queue = NULL; | 131 | return 0; |
131 | } | 132 | out: |
133 | if (drv->event_queue) { | ||
134 | destroy_workqueue(drv->event_queue); | ||
135 | drv->event_queue = NULL; | ||
132 | } | 136 | } |
133 | 137 | ||
134 | return rc; | 138 | return rc; |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c index 9fbeee522d2c..32c92abf5094 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c | |||
@@ -1217,9 +1217,6 @@ static void bnx2x_set_one_vlan_mac_e1h(struct bnx2x *bp, | |||
1217 | ETH_VLAN_FILTER_CLASSIFY, config); | 1217 | ETH_VLAN_FILTER_CLASSIFY, config); |
1218 | } | 1218 | } |
1219 | 1219 | ||
1220 | #define list_next_entry(pos, member) \ | ||
1221 | list_entry((pos)->member.next, typeof(*(pos)), member) | ||
1222 | |||
1223 | /** | 1220 | /** |
1224 | * bnx2x_vlan_mac_restore - reconfigure next MAC/VLAN/VLAN-MAC element | 1221 | * bnx2x_vlan_mac_restore - reconfigure next MAC/VLAN/VLAN-MAC element |
1225 | * | 1222 | * |
diff --git a/drivers/pps/clients/pps-gpio.c b/drivers/pps/clients/pps-gpio.c index 9966124ad988..f41bacfdc3dc 100644 --- a/drivers/pps/clients/pps-gpio.c +++ b/drivers/pps/clients/pps-gpio.c | |||
@@ -201,7 +201,7 @@ static struct platform_driver pps_gpio_driver = { | |||
201 | .driver = { | 201 | .driver = { |
202 | .name = PPS_GPIO_NAME, | 202 | .name = PPS_GPIO_NAME, |
203 | .owner = THIS_MODULE, | 203 | .owner = THIS_MODULE, |
204 | .of_match_table = of_match_ptr(pps_gpio_dt_ids), | 204 | .of_match_table = pps_gpio_dt_ids, |
205 | }, | 205 | }, |
206 | }; | 206 | }; |
207 | 207 | ||
diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig index 9654aa3c05cb..15f166a470a7 100644 --- a/drivers/rtc/Kconfig +++ b/drivers/rtc/Kconfig | |||
@@ -153,6 +153,16 @@ config RTC_DRV_88PM80X | |||
153 | This driver can also be built as a module. If so, the module | 153 | This driver can also be built as a module. If so, the module |
154 | will be called rtc-88pm80x. | 154 | will be called rtc-88pm80x. |
155 | 155 | ||
156 | config RTC_DRV_AS3722 | ||
157 | tristate "ams AS3722 RTC driver" | ||
158 | depends on MFD_AS3722 | ||
159 | help | ||
160 | If you say yes here you get support for the RTC of ams AS3722 PMIC | ||
161 | chips. | ||
162 | |||
163 | This driver can also be built as a module. If so, the module | ||
164 | will be called rtc-as3722. | ||
165 | |||
156 | config RTC_DRV_DS1307 | 166 | config RTC_DRV_DS1307 |
157 | tristate "Dallas/Maxim DS1307/37/38/39/40, ST M41T00, EPSON RX-8025" | 167 | tristate "Dallas/Maxim DS1307/37/38/39/40, ST M41T00, EPSON RX-8025" |
158 | help | 168 | help |
@@ -497,6 +507,16 @@ config RTC_DRV_RV3029C2 | |||
497 | This driver can also be built as a module. If so, the module | 507 | This driver can also be built as a module. If so, the module |
498 | will be called rtc-rv3029c2. | 508 | will be called rtc-rv3029c2. |
499 | 509 | ||
510 | config RTC_DRV_S5M | ||
511 | tristate "Samsung S5M series" | ||
512 | depends on MFD_SEC_CORE | ||
513 | help | ||
514 | If you say yes here you will get support for the | ||
515 | RTC of Samsung S5M PMIC series. | ||
516 | |||
517 | This driver can also be built as a module. If so, the module | ||
518 | will be called rtc-s5m. | ||
519 | |||
500 | endif # I2C | 520 | endif # I2C |
501 | 521 | ||
502 | comment "SPI RTC drivers" | 522 | comment "SPI RTC drivers" |
diff --git a/drivers/rtc/Makefile b/drivers/rtc/Makefile index 2dff3d2009b5..27b4bd884066 100644 --- a/drivers/rtc/Makefile +++ b/drivers/rtc/Makefile | |||
@@ -20,6 +20,7 @@ obj-$(CONFIG_RTC_DRV_88PM860X) += rtc-88pm860x.o | |||
20 | obj-$(CONFIG_RTC_DRV_88PM80X) += rtc-88pm80x.o | 20 | obj-$(CONFIG_RTC_DRV_88PM80X) += rtc-88pm80x.o |
21 | obj-$(CONFIG_RTC_DRV_AB3100) += rtc-ab3100.o | 21 | obj-$(CONFIG_RTC_DRV_AB3100) += rtc-ab3100.o |
22 | obj-$(CONFIG_RTC_DRV_AB8500) += rtc-ab8500.o | 22 | obj-$(CONFIG_RTC_DRV_AB8500) += rtc-ab8500.o |
23 | obj-$(CONFIG_RTC_DRV_AS3722) += rtc-as3722.o | ||
23 | obj-$(CONFIG_RTC_DRV_AT32AP700X)+= rtc-at32ap700x.o | 24 | obj-$(CONFIG_RTC_DRV_AT32AP700X)+= rtc-at32ap700x.o |
24 | obj-$(CONFIG_RTC_DRV_AT91RM9200)+= rtc-at91rm9200.o | 25 | obj-$(CONFIG_RTC_DRV_AT91RM9200)+= rtc-at91rm9200.o |
25 | obj-$(CONFIG_RTC_DRV_AT91SAM9) += rtc-at91sam9.o | 26 | obj-$(CONFIG_RTC_DRV_AT91SAM9) += rtc-at91sam9.o |
@@ -107,6 +108,7 @@ obj-$(CONFIG_RTC_DRV_RX8025) += rtc-rx8025.o | |||
107 | obj-$(CONFIG_RTC_DRV_RX8581) += rtc-rx8581.o | 108 | obj-$(CONFIG_RTC_DRV_RX8581) += rtc-rx8581.o |
108 | obj-$(CONFIG_RTC_DRV_S35390A) += rtc-s35390a.o | 109 | obj-$(CONFIG_RTC_DRV_S35390A) += rtc-s35390a.o |
109 | obj-$(CONFIG_RTC_DRV_S3C) += rtc-s3c.o | 110 | obj-$(CONFIG_RTC_DRV_S3C) += rtc-s3c.o |
111 | obj-$(CONFIG_RTC_DRV_S5M) += rtc-s5m.o | ||
110 | obj-$(CONFIG_RTC_DRV_SA1100) += rtc-sa1100.o | 112 | obj-$(CONFIG_RTC_DRV_SA1100) += rtc-sa1100.o |
111 | obj-$(CONFIG_RTC_DRV_SH) += rtc-sh.o | 113 | obj-$(CONFIG_RTC_DRV_SH) += rtc-sh.o |
112 | obj-$(CONFIG_RTC_DRV_SNVS) += rtc-snvs.o | 114 | obj-$(CONFIG_RTC_DRV_SNVS) += rtc-snvs.o |
diff --git a/drivers/rtc/rtc-88pm80x.c b/drivers/rtc/rtc-88pm80x.c index 354c937a5866..0916089c7c3e 100644 --- a/drivers/rtc/rtc-88pm80x.c +++ b/drivers/rtc/rtc-88pm80x.c | |||
@@ -251,14 +251,15 @@ static SIMPLE_DEV_PM_OPS(pm80x_rtc_pm_ops, pm80x_rtc_suspend, pm80x_rtc_resume); | |||
251 | static int pm80x_rtc_probe(struct platform_device *pdev) | 251 | static int pm80x_rtc_probe(struct platform_device *pdev) |
252 | { | 252 | { |
253 | struct pm80x_chip *chip = dev_get_drvdata(pdev->dev.parent); | 253 | struct pm80x_chip *chip = dev_get_drvdata(pdev->dev.parent); |
254 | struct pm80x_platform_data *pm80x_pdata; | 254 | struct pm80x_platform_data *pm80x_pdata = |
255 | dev_get_platdata(pdev->dev.parent); | ||
255 | struct pm80x_rtc_pdata *pdata = NULL; | 256 | struct pm80x_rtc_pdata *pdata = NULL; |
256 | struct pm80x_rtc_info *info; | 257 | struct pm80x_rtc_info *info; |
257 | struct rtc_time tm; | 258 | struct rtc_time tm; |
258 | unsigned long ticks = 0; | 259 | unsigned long ticks = 0; |
259 | int ret; | 260 | int ret; |
260 | 261 | ||
261 | pdata = pdev->dev.platform_data; | 262 | pdata = dev_get_platdata(&pdev->dev); |
262 | if (pdata == NULL) | 263 | if (pdata == NULL) |
263 | dev_warn(&pdev->dev, "No platform data!\n"); | 264 | dev_warn(&pdev->dev, "No platform data!\n"); |
264 | 265 | ||
@@ -326,8 +327,7 @@ static int pm80x_rtc_probe(struct platform_device *pdev) | |||
326 | regmap_update_bits(info->map, PM800_RTC_CONTROL, PM800_RTC1_USE_XO, | 327 | regmap_update_bits(info->map, PM800_RTC_CONTROL, PM800_RTC1_USE_XO, |
327 | PM800_RTC1_USE_XO); | 328 | PM800_RTC1_USE_XO); |
328 | 329 | ||
329 | if (pdev->dev.parent->platform_data) { | 330 | if (pm80x_pdata) { |
330 | pm80x_pdata = pdev->dev.parent->platform_data; | ||
331 | pdata = pm80x_pdata->rtc; | 331 | pdata = pm80x_pdata->rtc; |
332 | if (pdata) | 332 | if (pdata) |
333 | info->rtc_dev->dev.platform_data = &pdata->rtc_wakeup; | 333 | info->rtc_dev->dev.platform_data = &pdata->rtc_wakeup; |
diff --git a/drivers/rtc/rtc-88pm860x.c b/drivers/rtc/rtc-88pm860x.c index 4e30c85728e5..816504846cdd 100644 --- a/drivers/rtc/rtc-88pm860x.c +++ b/drivers/rtc/rtc-88pm860x.c | |||
@@ -316,7 +316,7 @@ static int pm860x_rtc_probe(struct platform_device *pdev) | |||
316 | unsigned long ticks = 0; | 316 | unsigned long ticks = 0; |
317 | int ret; | 317 | int ret; |
318 | 318 | ||
319 | pdata = pdev->dev.platform_data; | 319 | pdata = dev_get_platdata(&pdev->dev); |
320 | 320 | ||
321 | info = devm_kzalloc(&pdev->dev, sizeof(struct pm860x_rtc_info), | 321 | info = devm_kzalloc(&pdev->dev, sizeof(struct pm860x_rtc_info), |
322 | GFP_KERNEL); | 322 | GFP_KERNEL); |
diff --git a/drivers/rtc/rtc-as3722.c b/drivers/rtc/rtc-as3722.c new file mode 100644 index 000000000000..9cfa8170a2d6 --- /dev/null +++ b/drivers/rtc/rtc-as3722.c | |||
@@ -0,0 +1,275 @@ | |||
1 | /* | ||
2 | * rtc-as3722.c - Real Time Clock driver for ams AS3722 PMICs | ||
3 | * | ||
4 | * Copyright (C) 2013 ams AG | ||
5 | * Copyright (c) 2013, NVIDIA Corporation. All rights reserved. | ||
6 | * | ||
7 | * Author: Florian Lobmaier <florian.lobmaier@ams.com> | ||
8 | * Author: Laxman Dewangan <ldewangan@nvidia.com> | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License as published by | ||
12 | * the Free Software Foundation; either version 2 of the License, or | ||
13 | * (at your option) any later version. | ||
14 | * | ||
15 | * This program is distributed in the hope that it will be useful, | ||
16 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
17 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
18 | * GNU General Public License for more details. | ||
19 | */ | ||
20 | |||
21 | #include <linux/bcd.h> | ||
22 | #include <linux/completion.h> | ||
23 | #include <linux/delay.h> | ||
24 | #include <linux/interrupt.h> | ||
25 | #include <linux/ioctl.h> | ||
26 | #include <linux/kernel.h> | ||
27 | #include <linux/module.h> | ||
28 | #include <linux/mfd/as3722.h> | ||
29 | #include <linux/platform_device.h> | ||
30 | #include <linux/rtc.h> | ||
31 | #include <linux/time.h> | ||
32 | |||
33 | #define AS3722_RTC_START_YEAR 2000 | ||
34 | struct as3722_rtc { | ||
35 | struct rtc_device *rtc; | ||
36 | struct device *dev; | ||
37 | struct as3722 *as3722; | ||
38 | int alarm_irq; | ||
39 | bool irq_enable; | ||
40 | }; | ||
41 | |||
42 | static void as3722_time_to_reg(u8 *rbuff, struct rtc_time *tm) | ||
43 | { | ||
44 | rbuff[0] = bin2bcd(tm->tm_sec); | ||
45 | rbuff[1] = bin2bcd(tm->tm_min); | ||
46 | rbuff[2] = bin2bcd(tm->tm_hour); | ||
47 | rbuff[3] = bin2bcd(tm->tm_mday); | ||
48 | rbuff[4] = bin2bcd(tm->tm_mon); | ||
49 | rbuff[5] = bin2bcd(tm->tm_year - (AS3722_RTC_START_YEAR - 1900)); | ||
50 | } | ||
51 | |||
52 | static void as3722_reg_to_time(u8 *rbuff, struct rtc_time *tm) | ||
53 | { | ||
54 | tm->tm_sec = bcd2bin(rbuff[0] & 0x7F); | ||
55 | tm->tm_min = bcd2bin(rbuff[1] & 0x7F); | ||
56 | tm->tm_hour = bcd2bin(rbuff[2] & 0x3F); | ||
57 | tm->tm_mday = bcd2bin(rbuff[3] & 0x3F); | ||
58 | tm->tm_mon = bcd2bin(rbuff[4] & 0x1F); | ||
59 | tm->tm_year = (AS3722_RTC_START_YEAR - 1900) + bcd2bin(rbuff[5] & 0x7F); | ||
60 | return; | ||
61 | } | ||
62 | |||
63 | static int as3722_rtc_read_time(struct device *dev, struct rtc_time *tm) | ||
64 | { | ||
65 | struct as3722_rtc *as3722_rtc = dev_get_drvdata(dev); | ||
66 | struct as3722 *as3722 = as3722_rtc->as3722; | ||
67 | u8 as_time_array[6]; | ||
68 | int ret; | ||
69 | |||
70 | ret = as3722_block_read(as3722, AS3722_RTC_SECOND_REG, | ||
71 | 6, as_time_array); | ||
72 | if (ret < 0) { | ||
73 | dev_err(dev, "RTC_SECOND reg block read failed %d\n", ret); | ||
74 | return ret; | ||
75 | } | ||
76 | as3722_reg_to_time(as_time_array, tm); | ||
77 | return 0; | ||
78 | } | ||
79 | |||
80 | static int as3722_rtc_set_time(struct device *dev, struct rtc_time *tm) | ||
81 | { | ||
82 | struct as3722_rtc *as3722_rtc = dev_get_drvdata(dev); | ||
83 | struct as3722 *as3722 = as3722_rtc->as3722; | ||
84 | u8 as_time_array[6]; | ||
85 | int ret; | ||
86 | |||
87 | if (tm->tm_year < (AS3722_RTC_START_YEAR - 1900)) | ||
88 | return -EINVAL; | ||
89 | |||
90 | as3722_time_to_reg(as_time_array, tm); | ||
91 | ret = as3722_block_write(as3722, AS3722_RTC_SECOND_REG, 6, | ||
92 | as_time_array); | ||
93 | if (ret < 0) | ||
94 | dev_err(dev, "RTC_SECOND reg block write failed %d\n", ret); | ||
95 | return ret; | ||
96 | } | ||
97 | |||
98 | static int as3722_rtc_alarm_irq_enable(struct device *dev, | ||
99 | unsigned int enabled) | ||
100 | { | ||
101 | struct as3722_rtc *as3722_rtc = dev_get_drvdata(dev); | ||
102 | |||
103 | if (enabled && !as3722_rtc->irq_enable) { | ||
104 | enable_irq(as3722_rtc->alarm_irq); | ||
105 | as3722_rtc->irq_enable = true; | ||
106 | } else if (!enabled && as3722_rtc->irq_enable) { | ||
107 | disable_irq(as3722_rtc->alarm_irq); | ||
108 | as3722_rtc->irq_enable = false; | ||
109 | } | ||
110 | return 0; | ||
111 | } | ||
112 | |||
113 | static int as3722_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm) | ||
114 | { | ||
115 | struct as3722_rtc *as3722_rtc = dev_get_drvdata(dev); | ||
116 | struct as3722 *as3722 = as3722_rtc->as3722; | ||
117 | u8 as_time_array[6]; | ||
118 | int ret; | ||
119 | |||
120 | ret = as3722_block_read(as3722, AS3722_RTC_ALARM_SECOND_REG, 6, | ||
121 | as_time_array); | ||
122 | if (ret < 0) { | ||
123 | dev_err(dev, "RTC_ALARM_SECOND block read failed %d\n", ret); | ||
124 | return ret; | ||
125 | } | ||
126 | |||
127 | as3722_reg_to_time(as_time_array, &alrm->time); | ||
128 | return 0; | ||
129 | } | ||
130 | |||
131 | static int as3722_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) | ||
132 | { | ||
133 | struct as3722_rtc *as3722_rtc = dev_get_drvdata(dev); | ||
134 | struct as3722 *as3722 = as3722_rtc->as3722; | ||
135 | u8 as_time_array[6]; | ||
136 | int ret; | ||
137 | |||
138 | if (alrm->time.tm_year < (AS3722_RTC_START_YEAR - 1900)) | ||
139 | return -EINVAL; | ||
140 | |||
141 | ret = as3722_rtc_alarm_irq_enable(dev, 0); | ||
142 | if (ret < 0) { | ||
143 | dev_err(dev, "Disable RTC alarm failed\n"); | ||
144 | return ret; | ||
145 | } | ||
146 | |||
147 | as3722_time_to_reg(as_time_array, &alrm->time); | ||
148 | ret = as3722_block_write(as3722, AS3722_RTC_ALARM_SECOND_REG, 6, | ||
149 | as_time_array); | ||
150 | if (ret < 0) { | ||
151 | dev_err(dev, "RTC_ALARM_SECOND block write failed %d\n", ret); | ||
152 | return ret; | ||
153 | } | ||
154 | |||
155 | if (alrm->enabled) | ||
156 | ret = as3722_rtc_alarm_irq_enable(dev, alrm->enabled); | ||
157 | return ret; | ||
158 | } | ||
159 | |||
160 | static irqreturn_t as3722_alarm_irq(int irq, void *data) | ||
161 | { | ||
162 | struct as3722_rtc *as3722_rtc = data; | ||
163 | |||
164 | rtc_update_irq(as3722_rtc->rtc, 1, RTC_IRQF | RTC_AF); | ||
165 | return IRQ_HANDLED; | ||
166 | } | ||
167 | |||
168 | static const struct rtc_class_ops as3722_rtc_ops = { | ||
169 | .read_time = as3722_rtc_read_time, | ||
170 | .set_time = as3722_rtc_set_time, | ||
171 | .read_alarm = as3722_rtc_read_alarm, | ||
172 | .set_alarm = as3722_rtc_set_alarm, | ||
173 | .alarm_irq_enable = as3722_rtc_alarm_irq_enable, | ||
174 | }; | ||
175 | |||
176 | static int as3722_rtc_probe(struct platform_device *pdev) | ||
177 | { | ||
178 | struct as3722 *as3722 = dev_get_drvdata(pdev->dev.parent); | ||
179 | struct as3722_rtc *as3722_rtc; | ||
180 | int ret; | ||
181 | |||
182 | as3722_rtc = devm_kzalloc(&pdev->dev, sizeof(*as3722_rtc), GFP_KERNEL); | ||
183 | if (!as3722_rtc) | ||
184 | return -ENOMEM; | ||
185 | |||
186 | as3722_rtc->as3722 = as3722; | ||
187 | as3722_rtc->dev = &pdev->dev; | ||
188 | platform_set_drvdata(pdev, as3722_rtc); | ||
189 | |||
190 | /* Enable the RTC to make sure it is running. */ | ||
191 | ret = as3722_update_bits(as3722, AS3722_RTC_CONTROL_REG, | ||
192 | AS3722_RTC_ON | AS3722_RTC_ALARM_WAKEUP_EN, | ||
193 | AS3722_RTC_ON | AS3722_RTC_ALARM_WAKEUP_EN); | ||
194 | if (ret < 0) { | ||
195 | dev_err(&pdev->dev, "RTC_CONTROL reg write failed: %d\n", ret); | ||
196 | return ret; | ||
197 | } | ||
198 | |||
199 | device_init_wakeup(&pdev->dev, 1); | ||
200 | |||
201 | as3722_rtc->rtc = rtc_device_register("as3722", &pdev->dev, | ||
202 | &as3722_rtc_ops, THIS_MODULE); | ||
203 | if (IS_ERR(as3722_rtc->rtc)) { | ||
204 | ret = PTR_ERR(as3722_rtc->rtc); | ||
205 | dev_err(&pdev->dev, "RTC register failed: %d\n", ret); | ||
206 | return ret; | ||
207 | } | ||
208 | |||
209 | as3722_rtc->alarm_irq = platform_get_irq(pdev, 0); | ||
210 | dev_info(&pdev->dev, "RTC interrupt %d\n", as3722_rtc->alarm_irq); | ||
211 | |||
212 | ret = request_threaded_irq(as3722_rtc->alarm_irq, NULL, | ||
213 | as3722_alarm_irq, IRQF_ONESHOT | IRQF_EARLY_RESUME, | ||
214 | "rtc-alarm", as3722_rtc); | ||
215 | if (ret < 0) { | ||
216 | dev_err(&pdev->dev, "Failed to request alarm IRQ %d: %d\n", | ||
217 | as3722_rtc->alarm_irq, ret); | ||
218 | goto scrub; | ||
219 | } | ||
220 | disable_irq(as3722_rtc->alarm_irq); | ||
221 | return 0; | ||
222 | scrub: | ||
223 | rtc_device_unregister(as3722_rtc->rtc); | ||
224 | return ret; | ||
225 | } | ||
226 | |||
227 | static int as3722_rtc_remove(struct platform_device *pdev) | ||
228 | { | ||
229 | struct as3722_rtc *as3722_rtc = platform_get_drvdata(pdev); | ||
230 | |||
231 | free_irq(as3722_rtc->alarm_irq, as3722_rtc); | ||
232 | rtc_device_unregister(as3722_rtc->rtc); | ||
233 | return 0; | ||
234 | } | ||
235 | |||
236 | #ifdef CONFIG_PM_SLEEP | ||
237 | static int as3722_rtc_suspend(struct device *dev) | ||
238 | { | ||
239 | struct as3722_rtc *as3722_rtc = dev_get_drvdata(dev); | ||
240 | |||
241 | if (device_may_wakeup(dev)) | ||
242 | enable_irq_wake(as3722_rtc->alarm_irq); | ||
243 | |||
244 | return 0; | ||
245 | } | ||
246 | |||
247 | static int as3722_rtc_resume(struct device *dev) | ||
248 | { | ||
249 | struct as3722_rtc *as3722_rtc = dev_get_drvdata(dev); | ||
250 | |||
251 | if (device_may_wakeup(dev)) | ||
252 | disable_irq_wake(as3722_rtc->alarm_irq); | ||
253 | return 0; | ||
254 | } | ||
255 | #endif | ||
256 | |||
257 | static const struct dev_pm_ops as3722_rtc_pm_ops = { | ||
258 | SET_SYSTEM_SLEEP_PM_OPS(as3722_rtc_suspend, as3722_rtc_resume) | ||
259 | }; | ||
260 | |||
261 | static struct platform_driver as3722_rtc_driver = { | ||
262 | .probe = as3722_rtc_probe, | ||
263 | .remove = as3722_rtc_remove, | ||
264 | .driver = { | ||
265 | .name = "as3722-rtc", | ||
266 | .pm = &as3722_rtc_pm_ops, | ||
267 | }, | ||
268 | }; | ||
269 | module_platform_driver(as3722_rtc_driver); | ||
270 | |||
271 | MODULE_DESCRIPTION("RTC driver for AS3722 PMICs"); | ||
272 | MODULE_ALIAS("platform:as3722-rtc"); | ||
273 | MODULE_AUTHOR("Florian Lobmaier <florian.lobmaier@ams.com>"); | ||
274 | MODULE_AUTHOR("Laxman Dewangan <ldewangan@nvidia.com>"); | ||
275 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/rtc/rtc-at91rm9200.c b/drivers/rtc/rtc-at91rm9200.c index 741892632ae0..8b2cd8a5a2ff 100644 --- a/drivers/rtc/rtc-at91rm9200.c +++ b/drivers/rtc/rtc-at91rm9200.c | |||
@@ -376,7 +376,8 @@ static int __init at91_rtc_probe(struct platform_device *pdev) | |||
376 | return -ENXIO; | 376 | return -ENXIO; |
377 | } | 377 | } |
378 | 378 | ||
379 | at91_rtc_regs = ioremap(regs->start, resource_size(regs)); | 379 | at91_rtc_regs = devm_ioremap(&pdev->dev, regs->start, |
380 | resource_size(regs)); | ||
380 | if (!at91_rtc_regs) { | 381 | if (!at91_rtc_regs) { |
381 | dev_err(&pdev->dev, "failed to map registers, aborting.\n"); | 382 | dev_err(&pdev->dev, "failed to map registers, aborting.\n"); |
382 | return -ENOMEM; | 383 | return -ENOMEM; |
@@ -390,12 +391,12 @@ static int __init at91_rtc_probe(struct platform_device *pdev) | |||
390 | AT91_RTC_SECEV | AT91_RTC_TIMEV | | 391 | AT91_RTC_SECEV | AT91_RTC_TIMEV | |
391 | AT91_RTC_CALEV); | 392 | AT91_RTC_CALEV); |
392 | 393 | ||
393 | ret = request_irq(irq, at91_rtc_interrupt, | 394 | ret = devm_request_irq(&pdev->dev, irq, at91_rtc_interrupt, |
394 | IRQF_SHARED, | 395 | IRQF_SHARED, |
395 | "at91_rtc", pdev); | 396 | "at91_rtc", pdev); |
396 | if (ret) { | 397 | if (ret) { |
397 | dev_err(&pdev->dev, "IRQ %d already in use.\n", irq); | 398 | dev_err(&pdev->dev, "IRQ %d already in use.\n", irq); |
398 | goto err_unmap; | 399 | return ret; |
399 | } | 400 | } |
400 | 401 | ||
401 | /* cpu init code should really have flagged this device as | 402 | /* cpu init code should really have flagged this device as |
@@ -404,23 +405,14 @@ static int __init at91_rtc_probe(struct platform_device *pdev) | |||
404 | if (!device_can_wakeup(&pdev->dev)) | 405 | if (!device_can_wakeup(&pdev->dev)) |
405 | device_init_wakeup(&pdev->dev, 1); | 406 | device_init_wakeup(&pdev->dev, 1); |
406 | 407 | ||
407 | rtc = rtc_device_register(pdev->name, &pdev->dev, | 408 | rtc = devm_rtc_device_register(&pdev->dev, pdev->name, |
408 | &at91_rtc_ops, THIS_MODULE); | 409 | &at91_rtc_ops, THIS_MODULE); |
409 | if (IS_ERR(rtc)) { | 410 | if (IS_ERR(rtc)) |
410 | ret = PTR_ERR(rtc); | 411 | return PTR_ERR(rtc); |
411 | goto err_free_irq; | ||
412 | } | ||
413 | platform_set_drvdata(pdev, rtc); | 412 | platform_set_drvdata(pdev, rtc); |
414 | 413 | ||
415 | dev_info(&pdev->dev, "AT91 Real Time Clock driver.\n"); | 414 | dev_info(&pdev->dev, "AT91 Real Time Clock driver.\n"); |
416 | return 0; | 415 | return 0; |
417 | |||
418 | err_free_irq: | ||
419 | free_irq(irq, pdev); | ||
420 | err_unmap: | ||
421 | iounmap(at91_rtc_regs); | ||
422 | |||
423 | return ret; | ||
424 | } | 416 | } |
425 | 417 | ||
426 | /* | 418 | /* |
@@ -428,16 +420,10 @@ err_unmap: | |||
428 | */ | 420 | */ |
429 | static int __exit at91_rtc_remove(struct platform_device *pdev) | 421 | static int __exit at91_rtc_remove(struct platform_device *pdev) |
430 | { | 422 | { |
431 | struct rtc_device *rtc = platform_get_drvdata(pdev); | ||
432 | |||
433 | /* Disable all interrupts */ | 423 | /* Disable all interrupts */ |
434 | at91_rtc_write_idr(AT91_RTC_ACKUPD | AT91_RTC_ALARM | | 424 | at91_rtc_write_idr(AT91_RTC_ACKUPD | AT91_RTC_ALARM | |
435 | AT91_RTC_SECEV | AT91_RTC_TIMEV | | 425 | AT91_RTC_SECEV | AT91_RTC_TIMEV | |
436 | AT91_RTC_CALEV); | 426 | AT91_RTC_CALEV); |
437 | free_irq(irq, pdev); | ||
438 | |||
439 | rtc_device_unregister(rtc); | ||
440 | iounmap(at91_rtc_regs); | ||
441 | 427 | ||
442 | return 0; | 428 | return 0; |
443 | } | 429 | } |
diff --git a/drivers/rtc/rtc-cmos.c b/drivers/rtc/rtc-cmos.c index 24e733c98f8b..f14876256a4a 100644 --- a/drivers/rtc/rtc-cmos.c +++ b/drivers/rtc/rtc-cmos.c | |||
@@ -595,7 +595,7 @@ static irqreturn_t cmos_interrupt(int irq, void *p) | |||
595 | static int INITSECTION | 595 | static int INITSECTION |
596 | cmos_do_probe(struct device *dev, struct resource *ports, int rtc_irq) | 596 | cmos_do_probe(struct device *dev, struct resource *ports, int rtc_irq) |
597 | { | 597 | { |
598 | struct cmos_rtc_board_info *info = dev->platform_data; | 598 | struct cmos_rtc_board_info *info = dev_get_platdata(dev); |
599 | int retval = 0; | 599 | int retval = 0; |
600 | unsigned char rtc_control; | 600 | unsigned char rtc_control; |
601 | unsigned address_space; | 601 | unsigned address_space; |
@@ -789,7 +789,6 @@ static void __exit cmos_do_remove(struct device *dev) | |||
789 | cmos->iomem = NULL; | 789 | cmos->iomem = NULL; |
790 | 790 | ||
791 | cmos->dev = NULL; | 791 | cmos->dev = NULL; |
792 | dev_set_drvdata(dev, NULL); | ||
793 | } | 792 | } |
794 | 793 | ||
795 | #ifdef CONFIG_PM | 794 | #ifdef CONFIG_PM |
diff --git a/drivers/rtc/rtc-da9055.c b/drivers/rtc/rtc-da9055.c index e00642b61076..48cb2ac3bd3e 100644 --- a/drivers/rtc/rtc-da9055.c +++ b/drivers/rtc/rtc-da9055.c | |||
@@ -278,7 +278,7 @@ static int da9055_rtc_probe(struct platform_device *pdev) | |||
278 | return -ENOMEM; | 278 | return -ENOMEM; |
279 | 279 | ||
280 | rtc->da9055 = dev_get_drvdata(pdev->dev.parent); | 280 | rtc->da9055 = dev_get_drvdata(pdev->dev.parent); |
281 | pdata = rtc->da9055->dev->platform_data; | 281 | pdata = dev_get_platdata(rtc->da9055->dev); |
282 | platform_set_drvdata(pdev, rtc); | 282 | platform_set_drvdata(pdev, rtc); |
283 | 283 | ||
284 | ret = da9055_rtc_device_init(rtc->da9055, pdata); | 284 | ret = da9055_rtc_device_init(rtc->da9055, pdata); |
diff --git a/drivers/rtc/rtc-ds1305.c b/drivers/rtc/rtc-ds1305.c index dd6170acde95..80f323731ee2 100644 --- a/drivers/rtc/rtc-ds1305.c +++ b/drivers/rtc/rtc-ds1305.c | |||
@@ -606,7 +606,7 @@ static int ds1305_probe(struct spi_device *spi) | |||
606 | struct ds1305 *ds1305; | 606 | struct ds1305 *ds1305; |
607 | int status; | 607 | int status; |
608 | u8 addr, value; | 608 | u8 addr, value; |
609 | struct ds1305_platform_data *pdata = spi->dev.platform_data; | 609 | struct ds1305_platform_data *pdata = dev_get_platdata(&spi->dev); |
610 | bool write_ctrl = false; | 610 | bool write_ctrl = false; |
611 | 611 | ||
612 | /* Sanity check board setup data. This may be hooked up | 612 | /* Sanity check board setup data. This may be hooked up |
diff --git a/drivers/rtc/rtc-ds1307.c b/drivers/rtc/rtc-ds1307.c index ca18fd1433b3..4e75345a559a 100644 --- a/drivers/rtc/rtc-ds1307.c +++ b/drivers/rtc/rtc-ds1307.c | |||
@@ -670,9 +670,9 @@ static int ds1307_probe(struct i2c_client *client, | |||
670 | int tmp; | 670 | int tmp; |
671 | const struct chip_desc *chip = &chips[id->driver_data]; | 671 | const struct chip_desc *chip = &chips[id->driver_data]; |
672 | struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent); | 672 | struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent); |
673 | int want_irq = false; | 673 | bool want_irq = false; |
674 | unsigned char *buf; | 674 | unsigned char *buf; |
675 | struct ds1307_platform_data *pdata = client->dev.platform_data; | 675 | struct ds1307_platform_data *pdata = dev_get_platdata(&client->dev); |
676 | static const int bbsqi_bitpos[] = { | 676 | static const int bbsqi_bitpos[] = { |
677 | [ds_1337] = 0, | 677 | [ds_1337] = 0, |
678 | [ds_1339] = DS1339_BIT_BBSQI, | 678 | [ds_1339] = DS1339_BIT_BBSQI, |
@@ -956,7 +956,7 @@ read_rtc: | |||
956 | GFP_KERNEL); | 956 | GFP_KERNEL); |
957 | if (!ds1307->nvram) { | 957 | if (!ds1307->nvram) { |
958 | err = -ENOMEM; | 958 | err = -ENOMEM; |
959 | goto exit; | 959 | goto err_irq; |
960 | } | 960 | } |
961 | ds1307->nvram->attr.name = "nvram"; | 961 | ds1307->nvram->attr.name = "nvram"; |
962 | ds1307->nvram->attr.mode = S_IRUGO | S_IWUSR; | 962 | ds1307->nvram->attr.mode = S_IRUGO | S_IWUSR; |
@@ -967,13 +967,15 @@ read_rtc: | |||
967 | ds1307->nvram_offset = chip->nvram_offset; | 967 | ds1307->nvram_offset = chip->nvram_offset; |
968 | err = sysfs_create_bin_file(&client->dev.kobj, ds1307->nvram); | 968 | err = sysfs_create_bin_file(&client->dev.kobj, ds1307->nvram); |
969 | if (err) | 969 | if (err) |
970 | goto exit; | 970 | goto err_irq; |
971 | set_bit(HAS_NVRAM, &ds1307->flags); | 971 | set_bit(HAS_NVRAM, &ds1307->flags); |
972 | dev_info(&client->dev, "%zu bytes nvram\n", ds1307->nvram->size); | 972 | dev_info(&client->dev, "%zu bytes nvram\n", ds1307->nvram->size); |
973 | } | 973 | } |
974 | 974 | ||
975 | return 0; | 975 | return 0; |
976 | 976 | ||
977 | err_irq: | ||
978 | free_irq(client->irq, client); | ||
977 | exit: | 979 | exit: |
978 | return err; | 980 | return err; |
979 | } | 981 | } |
diff --git a/drivers/rtc/rtc-ds2404.c b/drivers/rtc/rtc-ds2404.c index 2ca5a23aba8a..fc209dc4e245 100644 --- a/drivers/rtc/rtc-ds2404.c +++ b/drivers/rtc/rtc-ds2404.c | |||
@@ -224,7 +224,7 @@ static const struct rtc_class_ops ds2404_rtc_ops = { | |||
224 | 224 | ||
225 | static int rtc_probe(struct platform_device *pdev) | 225 | static int rtc_probe(struct platform_device *pdev) |
226 | { | 226 | { |
227 | struct ds2404_platform_data *pdata = pdev->dev.platform_data; | 227 | struct ds2404_platform_data *pdata = dev_get_platdata(&pdev->dev); |
228 | struct ds2404 *chip; | 228 | struct ds2404 *chip; |
229 | int retval = -EBUSY; | 229 | int retval = -EBUSY; |
230 | 230 | ||
diff --git a/drivers/rtc/rtc-ep93xx.c b/drivers/rtc/rtc-ep93xx.c index 580e7b56bde8..5e4f5dc40ba5 100644 --- a/drivers/rtc/rtc-ep93xx.c +++ b/drivers/rtc/rtc-ep93xx.c | |||
@@ -42,7 +42,7 @@ struct ep93xx_rtc { | |||
42 | static int ep93xx_rtc_get_swcomp(struct device *dev, unsigned short *preload, | 42 | static int ep93xx_rtc_get_swcomp(struct device *dev, unsigned short *preload, |
43 | unsigned short *delete) | 43 | unsigned short *delete) |
44 | { | 44 | { |
45 | struct ep93xx_rtc *ep93xx_rtc = dev->platform_data; | 45 | struct ep93xx_rtc *ep93xx_rtc = dev_get_platdata(dev); |
46 | unsigned long comp; | 46 | unsigned long comp; |
47 | 47 | ||
48 | comp = __raw_readl(ep93xx_rtc->mmio_base + EP93XX_RTC_SWCOMP); | 48 | comp = __raw_readl(ep93xx_rtc->mmio_base + EP93XX_RTC_SWCOMP); |
@@ -60,7 +60,7 @@ static int ep93xx_rtc_get_swcomp(struct device *dev, unsigned short *preload, | |||
60 | 60 | ||
61 | static int ep93xx_rtc_read_time(struct device *dev, struct rtc_time *tm) | 61 | static int ep93xx_rtc_read_time(struct device *dev, struct rtc_time *tm) |
62 | { | 62 | { |
63 | struct ep93xx_rtc *ep93xx_rtc = dev->platform_data; | 63 | struct ep93xx_rtc *ep93xx_rtc = dev_get_platdata(dev); |
64 | unsigned long time; | 64 | unsigned long time; |
65 | 65 | ||
66 | time = __raw_readl(ep93xx_rtc->mmio_base + EP93XX_RTC_DATA); | 66 | time = __raw_readl(ep93xx_rtc->mmio_base + EP93XX_RTC_DATA); |
@@ -71,7 +71,7 @@ static int ep93xx_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
71 | 71 | ||
72 | static int ep93xx_rtc_set_mmss(struct device *dev, unsigned long secs) | 72 | static int ep93xx_rtc_set_mmss(struct device *dev, unsigned long secs) |
73 | { | 73 | { |
74 | struct ep93xx_rtc *ep93xx_rtc = dev->platform_data; | 74 | struct ep93xx_rtc *ep93xx_rtc = dev_get_platdata(dev); |
75 | 75 | ||
76 | __raw_writel(secs + 1, ep93xx_rtc->mmio_base + EP93XX_RTC_LOAD); | 76 | __raw_writel(secs + 1, ep93xx_rtc->mmio_base + EP93XX_RTC_LOAD); |
77 | return 0; | 77 | return 0; |
diff --git a/drivers/rtc/rtc-isl1208.c b/drivers/rtc/rtc-isl1208.c index c016ad81767a..c3c549d511b9 100644 --- a/drivers/rtc/rtc-isl1208.c +++ b/drivers/rtc/rtc-isl1208.c | |||
@@ -144,11 +144,7 @@ isl1208_i2c_validate_client(struct i2c_client *client) | |||
144 | static int | 144 | static int |
145 | isl1208_i2c_get_sr(struct i2c_client *client) | 145 | isl1208_i2c_get_sr(struct i2c_client *client) |
146 | { | 146 | { |
147 | int sr = i2c_smbus_read_byte_data(client, ISL1208_REG_SR); | 147 | return i2c_smbus_read_byte_data(client, ISL1208_REG_SR); |
148 | if (sr < 0) | ||
149 | return -EIO; | ||
150 | |||
151 | return sr; | ||
152 | } | 148 | } |
153 | 149 | ||
154 | static int | 150 | static int |
@@ -647,10 +643,11 @@ isl1208_probe(struct i2c_client *client, const struct i2c_device_id *id) | |||
647 | "chip found, driver version " DRV_VERSION "\n"); | 643 | "chip found, driver version " DRV_VERSION "\n"); |
648 | 644 | ||
649 | if (client->irq > 0) { | 645 | if (client->irq > 0) { |
650 | rc = request_threaded_irq(client->irq, NULL, | 646 | rc = devm_request_threaded_irq(&client->dev, client->irq, NULL, |
651 | isl1208_rtc_interrupt, | 647 | isl1208_rtc_interrupt, |
652 | IRQF_SHARED, | 648 | IRQF_SHARED, |
653 | isl1208_driver.driver.name, client); | 649 | isl1208_driver.driver.name, |
650 | client); | ||
654 | if (!rc) { | 651 | if (!rc) { |
655 | device_init_wakeup(&client->dev, 1); | 652 | device_init_wakeup(&client->dev, 1); |
656 | enable_irq_wake(client->irq); | 653 | enable_irq_wake(client->irq); |
@@ -662,20 +659,18 @@ isl1208_probe(struct i2c_client *client, const struct i2c_device_id *id) | |||
662 | } | 659 | } |
663 | } | 660 | } |
664 | 661 | ||
665 | rtc = rtc_device_register(isl1208_driver.driver.name, | 662 | rtc = devm_rtc_device_register(&client->dev, isl1208_driver.driver.name, |
666 | &client->dev, &isl1208_rtc_ops, | 663 | &isl1208_rtc_ops, |
667 | THIS_MODULE); | 664 | THIS_MODULE); |
668 | if (IS_ERR(rtc)) { | 665 | if (IS_ERR(rtc)) |
669 | rc = PTR_ERR(rtc); | 666 | return PTR_ERR(rtc); |
670 | goto exit_free_irq; | ||
671 | } | ||
672 | 667 | ||
673 | i2c_set_clientdata(client, rtc); | 668 | i2c_set_clientdata(client, rtc); |
674 | 669 | ||
675 | rc = isl1208_i2c_get_sr(client); | 670 | rc = isl1208_i2c_get_sr(client); |
676 | if (rc < 0) { | 671 | if (rc < 0) { |
677 | dev_err(&client->dev, "reading status failed\n"); | 672 | dev_err(&client->dev, "reading status failed\n"); |
678 | goto exit_unregister; | 673 | return rc; |
679 | } | 674 | } |
680 | 675 | ||
681 | if (rc & ISL1208_REG_SR_RTCF) | 676 | if (rc & ISL1208_REG_SR_RTCF) |
@@ -684,28 +679,15 @@ isl1208_probe(struct i2c_client *client, const struct i2c_device_id *id) | |||
684 | 679 | ||
685 | rc = sysfs_create_group(&client->dev.kobj, &isl1208_rtc_sysfs_files); | 680 | rc = sysfs_create_group(&client->dev.kobj, &isl1208_rtc_sysfs_files); |
686 | if (rc) | 681 | if (rc) |
687 | goto exit_unregister; | 682 | return rc; |
688 | 683 | ||
689 | return 0; | 684 | return 0; |
690 | |||
691 | exit_unregister: | ||
692 | rtc_device_unregister(rtc); | ||
693 | exit_free_irq: | ||
694 | if (client->irq) | ||
695 | free_irq(client->irq, client); | ||
696 | |||
697 | return rc; | ||
698 | } | 685 | } |
699 | 686 | ||
700 | static int | 687 | static int |
701 | isl1208_remove(struct i2c_client *client) | 688 | isl1208_remove(struct i2c_client *client) |
702 | { | 689 | { |
703 | struct rtc_device *rtc = i2c_get_clientdata(client); | ||
704 | |||
705 | sysfs_remove_group(&client->dev.kobj, &isl1208_rtc_sysfs_files); | 690 | sysfs_remove_group(&client->dev.kobj, &isl1208_rtc_sysfs_files); |
706 | rtc_device_unregister(rtc); | ||
707 | if (client->irq) | ||
708 | free_irq(client->irq, client); | ||
709 | 691 | ||
710 | return 0; | 692 | return 0; |
711 | } | 693 | } |
diff --git a/drivers/rtc/rtc-m48t59.c b/drivers/rtc/rtc-m48t59.c index fcb03291f145..11880c1e9dac 100644 --- a/drivers/rtc/rtc-m48t59.c +++ b/drivers/rtc/rtc-m48t59.c | |||
@@ -68,7 +68,7 @@ m48t59_mem_readb(struct device *dev, u32 ofs) | |||
68 | static int m48t59_rtc_read_time(struct device *dev, struct rtc_time *tm) | 68 | static int m48t59_rtc_read_time(struct device *dev, struct rtc_time *tm) |
69 | { | 69 | { |
70 | struct platform_device *pdev = to_platform_device(dev); | 70 | struct platform_device *pdev = to_platform_device(dev); |
71 | struct m48t59_plat_data *pdata = pdev->dev.platform_data; | 71 | struct m48t59_plat_data *pdata = dev_get_platdata(&pdev->dev); |
72 | struct m48t59_private *m48t59 = platform_get_drvdata(pdev); | 72 | struct m48t59_private *m48t59 = platform_get_drvdata(pdev); |
73 | unsigned long flags; | 73 | unsigned long flags; |
74 | u8 val; | 74 | u8 val; |
@@ -111,7 +111,7 @@ static int m48t59_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
111 | static int m48t59_rtc_set_time(struct device *dev, struct rtc_time *tm) | 111 | static int m48t59_rtc_set_time(struct device *dev, struct rtc_time *tm) |
112 | { | 112 | { |
113 | struct platform_device *pdev = to_platform_device(dev); | 113 | struct platform_device *pdev = to_platform_device(dev); |
114 | struct m48t59_plat_data *pdata = pdev->dev.platform_data; | 114 | struct m48t59_plat_data *pdata = dev_get_platdata(&pdev->dev); |
115 | struct m48t59_private *m48t59 = platform_get_drvdata(pdev); | 115 | struct m48t59_private *m48t59 = platform_get_drvdata(pdev); |
116 | unsigned long flags; | 116 | unsigned long flags; |
117 | u8 val = 0; | 117 | u8 val = 0; |
@@ -158,7 +158,7 @@ static int m48t59_rtc_set_time(struct device *dev, struct rtc_time *tm) | |||
158 | static int m48t59_rtc_readalarm(struct device *dev, struct rtc_wkalrm *alrm) | 158 | static int m48t59_rtc_readalarm(struct device *dev, struct rtc_wkalrm *alrm) |
159 | { | 159 | { |
160 | struct platform_device *pdev = to_platform_device(dev); | 160 | struct platform_device *pdev = to_platform_device(dev); |
161 | struct m48t59_plat_data *pdata = pdev->dev.platform_data; | 161 | struct m48t59_plat_data *pdata = dev_get_platdata(&pdev->dev); |
162 | struct m48t59_private *m48t59 = platform_get_drvdata(pdev); | 162 | struct m48t59_private *m48t59 = platform_get_drvdata(pdev); |
163 | struct rtc_time *tm = &alrm->time; | 163 | struct rtc_time *tm = &alrm->time; |
164 | unsigned long flags; | 164 | unsigned long flags; |
@@ -205,7 +205,7 @@ static int m48t59_rtc_readalarm(struct device *dev, struct rtc_wkalrm *alrm) | |||
205 | static int m48t59_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm) | 205 | static int m48t59_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm) |
206 | { | 206 | { |
207 | struct platform_device *pdev = to_platform_device(dev); | 207 | struct platform_device *pdev = to_platform_device(dev); |
208 | struct m48t59_plat_data *pdata = pdev->dev.platform_data; | 208 | struct m48t59_plat_data *pdata = dev_get_platdata(&pdev->dev); |
209 | struct m48t59_private *m48t59 = platform_get_drvdata(pdev); | 209 | struct m48t59_private *m48t59 = platform_get_drvdata(pdev); |
210 | struct rtc_time *tm = &alrm->time; | 210 | struct rtc_time *tm = &alrm->time; |
211 | u8 mday, hour, min, sec; | 211 | u8 mday, hour, min, sec; |
@@ -266,7 +266,7 @@ static int m48t59_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm) | |||
266 | static int m48t59_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled) | 266 | static int m48t59_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled) |
267 | { | 267 | { |
268 | struct platform_device *pdev = to_platform_device(dev); | 268 | struct platform_device *pdev = to_platform_device(dev); |
269 | struct m48t59_plat_data *pdata = pdev->dev.platform_data; | 269 | struct m48t59_plat_data *pdata = dev_get_platdata(&pdev->dev); |
270 | struct m48t59_private *m48t59 = platform_get_drvdata(pdev); | 270 | struct m48t59_private *m48t59 = platform_get_drvdata(pdev); |
271 | unsigned long flags; | 271 | unsigned long flags; |
272 | 272 | ||
@@ -283,7 +283,7 @@ static int m48t59_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled) | |||
283 | static int m48t59_rtc_proc(struct device *dev, struct seq_file *seq) | 283 | static int m48t59_rtc_proc(struct device *dev, struct seq_file *seq) |
284 | { | 284 | { |
285 | struct platform_device *pdev = to_platform_device(dev); | 285 | struct platform_device *pdev = to_platform_device(dev); |
286 | struct m48t59_plat_data *pdata = pdev->dev.platform_data; | 286 | struct m48t59_plat_data *pdata = dev_get_platdata(&pdev->dev); |
287 | struct m48t59_private *m48t59 = platform_get_drvdata(pdev); | 287 | struct m48t59_private *m48t59 = platform_get_drvdata(pdev); |
288 | unsigned long flags; | 288 | unsigned long flags; |
289 | u8 val; | 289 | u8 val; |
@@ -304,7 +304,7 @@ static irqreturn_t m48t59_rtc_interrupt(int irq, void *dev_id) | |||
304 | { | 304 | { |
305 | struct device *dev = (struct device *)dev_id; | 305 | struct device *dev = (struct device *)dev_id; |
306 | struct platform_device *pdev = to_platform_device(dev); | 306 | struct platform_device *pdev = to_platform_device(dev); |
307 | struct m48t59_plat_data *pdata = pdev->dev.platform_data; | 307 | struct m48t59_plat_data *pdata = dev_get_platdata(&pdev->dev); |
308 | struct m48t59_private *m48t59 = platform_get_drvdata(pdev); | 308 | struct m48t59_private *m48t59 = platform_get_drvdata(pdev); |
309 | u8 event; | 309 | u8 event; |
310 | 310 | ||
@@ -340,7 +340,7 @@ static ssize_t m48t59_nvram_read(struct file *filp, struct kobject *kobj, | |||
340 | { | 340 | { |
341 | struct device *dev = container_of(kobj, struct device, kobj); | 341 | struct device *dev = container_of(kobj, struct device, kobj); |
342 | struct platform_device *pdev = to_platform_device(dev); | 342 | struct platform_device *pdev = to_platform_device(dev); |
343 | struct m48t59_plat_data *pdata = pdev->dev.platform_data; | 343 | struct m48t59_plat_data *pdata = dev_get_platdata(&pdev->dev); |
344 | struct m48t59_private *m48t59 = platform_get_drvdata(pdev); | 344 | struct m48t59_private *m48t59 = platform_get_drvdata(pdev); |
345 | ssize_t cnt = 0; | 345 | ssize_t cnt = 0; |
346 | unsigned long flags; | 346 | unsigned long flags; |
@@ -360,7 +360,7 @@ static ssize_t m48t59_nvram_write(struct file *filp, struct kobject *kobj, | |||
360 | { | 360 | { |
361 | struct device *dev = container_of(kobj, struct device, kobj); | 361 | struct device *dev = container_of(kobj, struct device, kobj); |
362 | struct platform_device *pdev = to_platform_device(dev); | 362 | struct platform_device *pdev = to_platform_device(dev); |
363 | struct m48t59_plat_data *pdata = pdev->dev.platform_data; | 363 | struct m48t59_plat_data *pdata = dev_get_platdata(&pdev->dev); |
364 | struct m48t59_private *m48t59 = platform_get_drvdata(pdev); | 364 | struct m48t59_private *m48t59 = platform_get_drvdata(pdev); |
365 | ssize_t cnt = 0; | 365 | ssize_t cnt = 0; |
366 | unsigned long flags; | 366 | unsigned long flags; |
@@ -385,7 +385,7 @@ static struct bin_attribute m48t59_nvram_attr = { | |||
385 | 385 | ||
386 | static int m48t59_rtc_probe(struct platform_device *pdev) | 386 | static int m48t59_rtc_probe(struct platform_device *pdev) |
387 | { | 387 | { |
388 | struct m48t59_plat_data *pdata = pdev->dev.platform_data; | 388 | struct m48t59_plat_data *pdata = dev_get_platdata(&pdev->dev); |
389 | struct m48t59_private *m48t59 = NULL; | 389 | struct m48t59_private *m48t59 = NULL; |
390 | struct resource *res; | 390 | struct resource *res; |
391 | int ret = -ENOMEM; | 391 | int ret = -ENOMEM; |
diff --git a/drivers/rtc/rtc-m48t86.c b/drivers/rtc/rtc-m48t86.c index 2d30314fa07f..32f64c942621 100644 --- a/drivers/rtc/rtc-m48t86.c +++ b/drivers/rtc/rtc-m48t86.c | |||
@@ -46,7 +46,7 @@ static int m48t86_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
46 | { | 46 | { |
47 | unsigned char reg; | 47 | unsigned char reg; |
48 | struct platform_device *pdev = to_platform_device(dev); | 48 | struct platform_device *pdev = to_platform_device(dev); |
49 | struct m48t86_ops *ops = pdev->dev.platform_data; | 49 | struct m48t86_ops *ops = dev_get_platdata(&pdev->dev); |
50 | 50 | ||
51 | reg = ops->readbyte(M48T86_REG_B); | 51 | reg = ops->readbyte(M48T86_REG_B); |
52 | 52 | ||
@@ -84,7 +84,7 @@ static int m48t86_rtc_set_time(struct device *dev, struct rtc_time *tm) | |||
84 | { | 84 | { |
85 | unsigned char reg; | 85 | unsigned char reg; |
86 | struct platform_device *pdev = to_platform_device(dev); | 86 | struct platform_device *pdev = to_platform_device(dev); |
87 | struct m48t86_ops *ops = pdev->dev.platform_data; | 87 | struct m48t86_ops *ops = dev_get_platdata(&pdev->dev); |
88 | 88 | ||
89 | reg = ops->readbyte(M48T86_REG_B); | 89 | reg = ops->readbyte(M48T86_REG_B); |
90 | 90 | ||
@@ -123,7 +123,7 @@ static int m48t86_rtc_proc(struct device *dev, struct seq_file *seq) | |||
123 | { | 123 | { |
124 | unsigned char reg; | 124 | unsigned char reg; |
125 | struct platform_device *pdev = to_platform_device(dev); | 125 | struct platform_device *pdev = to_platform_device(dev); |
126 | struct m48t86_ops *ops = pdev->dev.platform_data; | 126 | struct m48t86_ops *ops = dev_get_platdata(&pdev->dev); |
127 | 127 | ||
128 | reg = ops->readbyte(M48T86_REG_B); | 128 | reg = ops->readbyte(M48T86_REG_B); |
129 | 129 | ||
@@ -147,7 +147,7 @@ static const struct rtc_class_ops m48t86_rtc_ops = { | |||
147 | static int m48t86_rtc_probe(struct platform_device *dev) | 147 | static int m48t86_rtc_probe(struct platform_device *dev) |
148 | { | 148 | { |
149 | unsigned char reg; | 149 | unsigned char reg; |
150 | struct m48t86_ops *ops = dev->dev.platform_data; | 150 | struct m48t86_ops *ops = dev_get_platdata(&dev->dev); |
151 | struct rtc_device *rtc; | 151 | struct rtc_device *rtc; |
152 | 152 | ||
153 | rtc = devm_rtc_device_register(&dev->dev, "m48t86", | 153 | rtc = devm_rtc_device_register(&dev->dev, "m48t86", |
diff --git a/drivers/rtc/rtc-max6900.c b/drivers/rtc/rtc-max6900.c index 55969b1b771a..4804985b876e 100644 --- a/drivers/rtc/rtc-max6900.c +++ b/drivers/rtc/rtc-max6900.c | |||
@@ -164,14 +164,7 @@ static int max6900_i2c_read_time(struct i2c_client *client, struct rtc_time *tm) | |||
164 | 164 | ||
165 | static int max6900_i2c_clear_write_protect(struct i2c_client *client) | 165 | static int max6900_i2c_clear_write_protect(struct i2c_client *client) |
166 | { | 166 | { |
167 | int rc; | 167 | return i2c_smbus_write_byte_data(client, MAX6900_REG_CONTROL_WRITE, 0); |
168 | rc = i2c_smbus_write_byte_data(client, MAX6900_REG_CONTROL_WRITE, 0); | ||
169 | if (rc < 0) { | ||
170 | dev_err(&client->dev, "%s: control register write failed\n", | ||
171 | __func__); | ||
172 | return -EIO; | ||
173 | } | ||
174 | return 0; | ||
175 | } | 168 | } |
176 | 169 | ||
177 | static int | 170 | static int |
diff --git a/drivers/rtc/rtc-mrst.c b/drivers/rtc/rtc-mrst.c index 315209d9b407..e2436d140175 100644 --- a/drivers/rtc/rtc-mrst.c +++ b/drivers/rtc/rtc-mrst.c | |||
@@ -380,7 +380,6 @@ static int vrtc_mrst_do_probe(struct device *dev, struct resource *iomem, | |||
380 | cleanup1: | 380 | cleanup1: |
381 | rtc_device_unregister(mrst_rtc.rtc); | 381 | rtc_device_unregister(mrst_rtc.rtc); |
382 | cleanup0: | 382 | cleanup0: |
383 | dev_set_drvdata(dev, NULL); | ||
384 | mrst_rtc.dev = NULL; | 383 | mrst_rtc.dev = NULL; |
385 | release_mem_region(iomem->start, resource_size(iomem)); | 384 | release_mem_region(iomem->start, resource_size(iomem)); |
386 | dev_err(dev, "rtc-mrst: unable to initialise\n"); | 385 | dev_err(dev, "rtc-mrst: unable to initialise\n"); |
@@ -412,7 +411,6 @@ static void rtc_mrst_do_remove(struct device *dev) | |||
412 | mrst->iomem = NULL; | 411 | mrst->iomem = NULL; |
413 | 412 | ||
414 | mrst->dev = NULL; | 413 | mrst->dev = NULL; |
415 | dev_set_drvdata(dev, NULL); | ||
416 | } | 414 | } |
417 | 415 | ||
418 | #ifdef CONFIG_PM | 416 | #ifdef CONFIG_PM |
diff --git a/drivers/rtc/rtc-omap.c b/drivers/rtc/rtc-omap.c index c7d97ee59327..26de5f8c2ae4 100644 --- a/drivers/rtc/rtc-omap.c +++ b/drivers/rtc/rtc-omap.c | |||
@@ -553,7 +553,7 @@ static struct platform_driver omap_rtc_driver = { | |||
553 | .name = DRIVER_NAME, | 553 | .name = DRIVER_NAME, |
554 | .owner = THIS_MODULE, | 554 | .owner = THIS_MODULE, |
555 | .pm = &omap_rtc_pm_ops, | 555 | .pm = &omap_rtc_pm_ops, |
556 | .of_match_table = of_match_ptr(omap_rtc_of_match), | 556 | .of_match_table = omap_rtc_of_match, |
557 | }, | 557 | }, |
558 | .id_table = omap_rtc_devtype, | 558 | .id_table = omap_rtc_devtype, |
559 | }; | 559 | }; |
diff --git a/drivers/rtc/rtc-pcf2123.c b/drivers/rtc/rtc-pcf2123.c index 1725b5090e33..d1953bb244c5 100644 --- a/drivers/rtc/rtc-pcf2123.c +++ b/drivers/rtc/rtc-pcf2123.c | |||
@@ -327,7 +327,7 @@ kfree_exit: | |||
327 | 327 | ||
328 | static int pcf2123_remove(struct spi_device *spi) | 328 | static int pcf2123_remove(struct spi_device *spi) |
329 | { | 329 | { |
330 | struct pcf2123_plat_data *pdata = spi->dev.platform_data; | 330 | struct pcf2123_plat_data *pdata = dev_get_platdata(&spi->dev); |
331 | int i; | 331 | int i; |
332 | 332 | ||
333 | if (pdata) { | 333 | if (pdata) { |
diff --git a/drivers/rtc/rtc-pl030.c b/drivers/rtc/rtc-pl030.c index 22bacdbf9139..f85a1a93e669 100644 --- a/drivers/rtc/rtc-pl030.c +++ b/drivers/rtc/rtc-pl030.c | |||
@@ -106,7 +106,7 @@ static int pl030_probe(struct amba_device *dev, const struct amba_id *id) | |||
106 | if (ret) | 106 | if (ret) |
107 | goto err_req; | 107 | goto err_req; |
108 | 108 | ||
109 | rtc = kmalloc(sizeof(*rtc), GFP_KERNEL); | 109 | rtc = devm_kzalloc(&dev->dev, sizeof(*rtc), GFP_KERNEL); |
110 | if (!rtc) { | 110 | if (!rtc) { |
111 | ret = -ENOMEM; | 111 | ret = -ENOMEM; |
112 | goto err_rtc; | 112 | goto err_rtc; |
@@ -115,7 +115,7 @@ static int pl030_probe(struct amba_device *dev, const struct amba_id *id) | |||
115 | rtc->base = ioremap(dev->res.start, resource_size(&dev->res)); | 115 | rtc->base = ioremap(dev->res.start, resource_size(&dev->res)); |
116 | if (!rtc->base) { | 116 | if (!rtc->base) { |
117 | ret = -ENOMEM; | 117 | ret = -ENOMEM; |
118 | goto err_map; | 118 | goto err_rtc; |
119 | } | 119 | } |
120 | 120 | ||
121 | __raw_writel(0, rtc->base + RTC_CR); | 121 | __raw_writel(0, rtc->base + RTC_CR); |
@@ -141,8 +141,6 @@ static int pl030_probe(struct amba_device *dev, const struct amba_id *id) | |||
141 | free_irq(dev->irq[0], rtc); | 141 | free_irq(dev->irq[0], rtc); |
142 | err_irq: | 142 | err_irq: |
143 | iounmap(rtc->base); | 143 | iounmap(rtc->base); |
144 | err_map: | ||
145 | kfree(rtc); | ||
146 | err_rtc: | 144 | err_rtc: |
147 | amba_release_regions(dev); | 145 | amba_release_regions(dev); |
148 | err_req: | 146 | err_req: |
@@ -153,14 +151,11 @@ static int pl030_remove(struct amba_device *dev) | |||
153 | { | 151 | { |
154 | struct pl030_rtc *rtc = amba_get_drvdata(dev); | 152 | struct pl030_rtc *rtc = amba_get_drvdata(dev); |
155 | 153 | ||
156 | amba_set_drvdata(dev, NULL); | ||
157 | |||
158 | writel(0, rtc->base + RTC_CR); | 154 | writel(0, rtc->base + RTC_CR); |
159 | 155 | ||
160 | free_irq(dev->irq[0], rtc); | 156 | free_irq(dev->irq[0], rtc); |
161 | rtc_device_unregister(rtc->rtc); | 157 | rtc_device_unregister(rtc->rtc); |
162 | iounmap(rtc->base); | 158 | iounmap(rtc->base); |
163 | kfree(rtc); | ||
164 | amba_release_regions(dev); | 159 | amba_release_regions(dev); |
165 | 160 | ||
166 | return 0; | 161 | return 0; |
diff --git a/drivers/rtc/rtc-pl031.c b/drivers/rtc/rtc-pl031.c index e3b25712b659..99181fff88fd 100644 --- a/drivers/rtc/rtc-pl031.c +++ b/drivers/rtc/rtc-pl031.c | |||
@@ -305,7 +305,6 @@ static int pl031_remove(struct amba_device *adev) | |||
305 | { | 305 | { |
306 | struct pl031_local *ldata = dev_get_drvdata(&adev->dev); | 306 | struct pl031_local *ldata = dev_get_drvdata(&adev->dev); |
307 | 307 | ||
308 | amba_set_drvdata(adev, NULL); | ||
309 | free_irq(adev->irq[0], ldata); | 308 | free_irq(adev->irq[0], ldata); |
310 | rtc_device_unregister(ldata->rtc); | 309 | rtc_device_unregister(ldata->rtc); |
311 | iounmap(ldata->base); | 310 | iounmap(ldata->base); |
@@ -391,7 +390,6 @@ out_no_irq: | |||
391 | rtc_device_unregister(ldata->rtc); | 390 | rtc_device_unregister(ldata->rtc); |
392 | out_no_rtc: | 391 | out_no_rtc: |
393 | iounmap(ldata->base); | 392 | iounmap(ldata->base); |
394 | amba_set_drvdata(adev, NULL); | ||
395 | out_no_remap: | 393 | out_no_remap: |
396 | kfree(ldata); | 394 | kfree(ldata); |
397 | out: | 395 | out: |
diff --git a/drivers/rtc/rtc-puv3.c b/drivers/rtc/rtc-puv3.c index 402732cfb32a..1ecfe3bd92ac 100644 --- a/drivers/rtc/rtc-puv3.c +++ b/drivers/rtc/rtc-puv3.c | |||
@@ -53,11 +53,11 @@ static irqreturn_t puv3_rtc_tickirq(int irq, void *id) | |||
53 | } | 53 | } |
54 | 54 | ||
55 | /* Update control registers */ | 55 | /* Update control registers */ |
56 | static void puv3_rtc_setaie(int to) | 56 | static void puv3_rtc_setaie(struct device *dev, int to) |
57 | { | 57 | { |
58 | unsigned int tmp; | 58 | unsigned int tmp; |
59 | 59 | ||
60 | pr_debug("%s: aie=%d\n", __func__, to); | 60 | dev_dbg(dev, "%s: aie=%d\n", __func__, to); |
61 | 61 | ||
62 | tmp = readl(RTC_RTSR) & ~RTC_RTSR_ALE; | 62 | tmp = readl(RTC_RTSR) & ~RTC_RTSR_ALE; |
63 | 63 | ||
@@ -71,7 +71,7 @@ static int puv3_rtc_setpie(struct device *dev, int enabled) | |||
71 | { | 71 | { |
72 | unsigned int tmp; | 72 | unsigned int tmp; |
73 | 73 | ||
74 | pr_debug("%s: pie=%d\n", __func__, enabled); | 74 | dev_debug(dev, "%s: pie=%d\n", __func__, enabled); |
75 | 75 | ||
76 | spin_lock_irq(&puv3_rtc_pie_lock); | 76 | spin_lock_irq(&puv3_rtc_pie_lock); |
77 | tmp = readl(RTC_RTSR) & ~RTC_RTSR_HZE; | 77 | tmp = readl(RTC_RTSR) & ~RTC_RTSR_HZE; |
@@ -90,7 +90,7 @@ static int puv3_rtc_gettime(struct device *dev, struct rtc_time *rtc_tm) | |||
90 | { | 90 | { |
91 | rtc_time_to_tm(readl(RTC_RCNR), rtc_tm); | 91 | rtc_time_to_tm(readl(RTC_RCNR), rtc_tm); |
92 | 92 | ||
93 | pr_debug("read time %02x.%02x.%02x %02x/%02x/%02x\n", | 93 | dev_dbg(dev, "read time %02x.%02x.%02x %02x/%02x/%02x\n", |
94 | rtc_tm->tm_year, rtc_tm->tm_mon, rtc_tm->tm_mday, | 94 | rtc_tm->tm_year, rtc_tm->tm_mon, rtc_tm->tm_mday, |
95 | rtc_tm->tm_hour, rtc_tm->tm_min, rtc_tm->tm_sec); | 95 | rtc_tm->tm_hour, rtc_tm->tm_min, rtc_tm->tm_sec); |
96 | 96 | ||
@@ -101,7 +101,7 @@ static int puv3_rtc_settime(struct device *dev, struct rtc_time *tm) | |||
101 | { | 101 | { |
102 | unsigned long rtc_count = 0; | 102 | unsigned long rtc_count = 0; |
103 | 103 | ||
104 | pr_debug("set time %02d.%02d.%02d %02d/%02d/%02d\n", | 104 | dev_dbg(dev, "set time %02d.%02d.%02d %02d/%02d/%02d\n", |
105 | tm->tm_year, tm->tm_mon, tm->tm_mday, | 105 | tm->tm_year, tm->tm_mon, tm->tm_mday, |
106 | tm->tm_hour, tm->tm_min, tm->tm_sec); | 106 | tm->tm_hour, tm->tm_min, tm->tm_sec); |
107 | 107 | ||
@@ -119,7 +119,7 @@ static int puv3_rtc_getalarm(struct device *dev, struct rtc_wkalrm *alrm) | |||
119 | 119 | ||
120 | alrm->enabled = readl(RTC_RTSR) & RTC_RTSR_ALE; | 120 | alrm->enabled = readl(RTC_RTSR) & RTC_RTSR_ALE; |
121 | 121 | ||
122 | pr_debug("read alarm %02x %02x.%02x.%02x %02x/%02x/%02x\n", | 122 | dev_dbg(dev, "read alarm %02x %02x.%02x.%02x %02x/%02x/%02x\n", |
123 | alrm->enabled, | 123 | alrm->enabled, |
124 | alm_tm->tm_year, alm_tm->tm_mon, alm_tm->tm_mday, | 124 | alm_tm->tm_year, alm_tm->tm_mon, alm_tm->tm_mday, |
125 | alm_tm->tm_hour, alm_tm->tm_min, alm_tm->tm_sec); | 125 | alm_tm->tm_hour, alm_tm->tm_min, alm_tm->tm_sec); |
@@ -132,7 +132,7 @@ static int puv3_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm) | |||
132 | struct rtc_time *tm = &alrm->time; | 132 | struct rtc_time *tm = &alrm->time; |
133 | unsigned long rtcalarm_count = 0; | 133 | unsigned long rtcalarm_count = 0; |
134 | 134 | ||
135 | pr_debug("puv3_rtc_setalarm: %d, %02x/%02x/%02x %02x.%02x.%02x\n", | 135 | dev_dbg(dev, "puv3_rtc_setalarm: %d, %02x/%02x/%02x %02x.%02x.%02x\n", |
136 | alrm->enabled, | 136 | alrm->enabled, |
137 | tm->tm_mday & 0xff, tm->tm_mon & 0xff, tm->tm_year & 0xff, | 137 | tm->tm_mday & 0xff, tm->tm_mon & 0xff, tm->tm_year & 0xff, |
138 | tm->tm_hour & 0xff, tm->tm_min & 0xff, tm->tm_sec); | 138 | tm->tm_hour & 0xff, tm->tm_min & 0xff, tm->tm_sec); |
@@ -140,7 +140,7 @@ static int puv3_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm) | |||
140 | rtc_tm_to_time(tm, &rtcalarm_count); | 140 | rtc_tm_to_time(tm, &rtcalarm_count); |
141 | writel(rtcalarm_count, RTC_RTAR); | 141 | writel(rtcalarm_count, RTC_RTAR); |
142 | 142 | ||
143 | puv3_rtc_setaie(alrm->enabled); | 143 | puv3_rtc_setaie(&dev->dev, alrm->enabled); |
144 | 144 | ||
145 | if (alrm->enabled) | 145 | if (alrm->enabled) |
146 | enable_irq_wake(puv3_rtc_alarmno); | 146 | enable_irq_wake(puv3_rtc_alarmno); |
@@ -227,7 +227,7 @@ static int puv3_rtc_remove(struct platform_device *dev) | |||
227 | rtc_device_unregister(rtc); | 227 | rtc_device_unregister(rtc); |
228 | 228 | ||
229 | puv3_rtc_setpie(&dev->dev, 0); | 229 | puv3_rtc_setpie(&dev->dev, 0); |
230 | puv3_rtc_setaie(0); | 230 | puv3_rtc_setaie(&dev->dev, 0); |
231 | 231 | ||
232 | release_resource(puv3_rtc_mem); | 232 | release_resource(puv3_rtc_mem); |
233 | kfree(puv3_rtc_mem); | 233 | kfree(puv3_rtc_mem); |
@@ -241,7 +241,7 @@ static int puv3_rtc_probe(struct platform_device *pdev) | |||
241 | struct resource *res; | 241 | struct resource *res; |
242 | int ret; | 242 | int ret; |
243 | 243 | ||
244 | pr_debug("%s: probe=%p\n", __func__, pdev); | 244 | dev_dbg(&pdev->dev, "%s: probe=%p\n", __func__, pdev); |
245 | 245 | ||
246 | /* find the IRQs */ | 246 | /* find the IRQs */ |
247 | puv3_rtc_tickno = platform_get_irq(pdev, 1); | 247 | puv3_rtc_tickno = platform_get_irq(pdev, 1); |
@@ -256,7 +256,7 @@ static int puv3_rtc_probe(struct platform_device *pdev) | |||
256 | return -ENOENT; | 256 | return -ENOENT; |
257 | } | 257 | } |
258 | 258 | ||
259 | pr_debug("PKUnity_rtc: tick irq %d, alarm irq %d\n", | 259 | dev_dbg(&pdev->dev, "PKUnity_rtc: tick irq %d, alarm irq %d\n", |
260 | puv3_rtc_tickno, puv3_rtc_alarmno); | 260 | puv3_rtc_tickno, puv3_rtc_alarmno); |
261 | 261 | ||
262 | /* get the memory region */ | 262 | /* get the memory region */ |
diff --git a/drivers/rtc/rtc-rs5c348.c b/drivers/rtc/rtc-rs5c348.c index f7a90a116a39..090a101c1c81 100644 --- a/drivers/rtc/rtc-rs5c348.c +++ b/drivers/rtc/rtc-rs5c348.c | |||
@@ -64,7 +64,7 @@ static int | |||
64 | rs5c348_rtc_set_time(struct device *dev, struct rtc_time *tm) | 64 | rs5c348_rtc_set_time(struct device *dev, struct rtc_time *tm) |
65 | { | 65 | { |
66 | struct spi_device *spi = to_spi_device(dev); | 66 | struct spi_device *spi = to_spi_device(dev); |
67 | struct rs5c348_plat_data *pdata = spi->dev.platform_data; | 67 | struct rs5c348_plat_data *pdata = dev_get_platdata(&spi->dev); |
68 | u8 txbuf[5+7], *txp; | 68 | u8 txbuf[5+7], *txp; |
69 | int ret; | 69 | int ret; |
70 | 70 | ||
@@ -100,7 +100,7 @@ static int | |||
100 | rs5c348_rtc_read_time(struct device *dev, struct rtc_time *tm) | 100 | rs5c348_rtc_read_time(struct device *dev, struct rtc_time *tm) |
101 | { | 101 | { |
102 | struct spi_device *spi = to_spi_device(dev); | 102 | struct spi_device *spi = to_spi_device(dev); |
103 | struct rs5c348_plat_data *pdata = spi->dev.platform_data; | 103 | struct rs5c348_plat_data *pdata = dev_get_platdata(&spi->dev); |
104 | u8 txbuf[5], rxbuf[7]; | 104 | u8 txbuf[5], rxbuf[7]; |
105 | int ret; | 105 | int ret; |
106 | 106 | ||
diff --git a/drivers/rtc/rtc-s5m.c b/drivers/rtc/rtc-s5m.c new file mode 100644 index 000000000000..b7fd02bc0a14 --- /dev/null +++ b/drivers/rtc/rtc-s5m.c | |||
@@ -0,0 +1,635 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2013 Samsung Electronics Co., Ltd | ||
3 | * http://www.samsung.com | ||
4 | * | ||
5 | * Copyright (C) 2013 Google, Inc | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License as published by | ||
9 | * the Free Software Foundation; either version 2 of the License, or | ||
10 | * (at your option) any later version. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | * GNU General Public License for more details. | ||
16 | */ | ||
17 | |||
18 | #include <linux/module.h> | ||
19 | #include <linux/i2c.h> | ||
20 | #include <linux/slab.h> | ||
21 | #include <linux/bcd.h> | ||
22 | #include <linux/bitops.h> | ||
23 | #include <linux/regmap.h> | ||
24 | #include <linux/rtc.h> | ||
25 | #include <linux/delay.h> | ||
26 | #include <linux/platform_device.h> | ||
27 | #include <linux/mfd/samsung/core.h> | ||
28 | #include <linux/mfd/samsung/irq.h> | ||
29 | #include <linux/mfd/samsung/rtc.h> | ||
30 | |||
31 | struct s5m_rtc_info { | ||
32 | struct device *dev; | ||
33 | struct sec_pmic_dev *s5m87xx; | ||
34 | struct regmap *rtc; | ||
35 | struct rtc_device *rtc_dev; | ||
36 | int irq; | ||
37 | int device_type; | ||
38 | int rtc_24hr_mode; | ||
39 | bool wtsr_smpl; | ||
40 | }; | ||
41 | |||
42 | static void s5m8767_data_to_tm(u8 *data, struct rtc_time *tm, | ||
43 | int rtc_24hr_mode) | ||
44 | { | ||
45 | tm->tm_sec = data[RTC_SEC] & 0x7f; | ||
46 | tm->tm_min = data[RTC_MIN] & 0x7f; | ||
47 | if (rtc_24hr_mode) { | ||
48 | tm->tm_hour = data[RTC_HOUR] & 0x1f; | ||
49 | } else { | ||
50 | tm->tm_hour = data[RTC_HOUR] & 0x0f; | ||
51 | if (data[RTC_HOUR] & HOUR_PM_MASK) | ||
52 | tm->tm_hour += 12; | ||
53 | } | ||
54 | |||
55 | tm->tm_wday = ffs(data[RTC_WEEKDAY] & 0x7f); | ||
56 | tm->tm_mday = data[RTC_DATE] & 0x1f; | ||
57 | tm->tm_mon = (data[RTC_MONTH] & 0x0f) - 1; | ||
58 | tm->tm_year = (data[RTC_YEAR1] & 0x7f) + 100; | ||
59 | tm->tm_yday = 0; | ||
60 | tm->tm_isdst = 0; | ||
61 | } | ||
62 | |||
63 | static int s5m8767_tm_to_data(struct rtc_time *tm, u8 *data) | ||
64 | { | ||
65 | data[RTC_SEC] = tm->tm_sec; | ||
66 | data[RTC_MIN] = tm->tm_min; | ||
67 | |||
68 | if (tm->tm_hour >= 12) | ||
69 | data[RTC_HOUR] = tm->tm_hour | HOUR_PM_MASK; | ||
70 | else | ||
71 | data[RTC_HOUR] = tm->tm_hour & ~HOUR_PM_MASK; | ||
72 | |||
73 | data[RTC_WEEKDAY] = 1 << tm->tm_wday; | ||
74 | data[RTC_DATE] = tm->tm_mday; | ||
75 | data[RTC_MONTH] = tm->tm_mon + 1; | ||
76 | data[RTC_YEAR1] = tm->tm_year > 100 ? (tm->tm_year - 100) : 0; | ||
77 | |||
78 | if (tm->tm_year < 100) { | ||
79 | pr_err("s5m8767 RTC cannot handle the year %d.\n", | ||
80 | 1900 + tm->tm_year); | ||
81 | return -EINVAL; | ||
82 | } else { | ||
83 | return 0; | ||
84 | } | ||
85 | } | ||
86 | |||
87 | static inline int s5m8767_rtc_set_time_reg(struct s5m_rtc_info *info) | ||
88 | { | ||
89 | int ret; | ||
90 | unsigned int data; | ||
91 | |||
92 | ret = regmap_read(info->rtc, SEC_RTC_UDR_CON, &data); | ||
93 | if (ret < 0) { | ||
94 | dev_err(info->dev, "failed to read update reg(%d)\n", ret); | ||
95 | return ret; | ||
96 | } | ||
97 | |||
98 | data |= RTC_TIME_EN_MASK; | ||
99 | data |= RTC_UDR_MASK; | ||
100 | |||
101 | ret = regmap_write(info->rtc, SEC_RTC_UDR_CON, data); | ||
102 | if (ret < 0) { | ||
103 | dev_err(info->dev, "failed to write update reg(%d)\n", ret); | ||
104 | return ret; | ||
105 | } | ||
106 | |||
107 | do { | ||
108 | ret = regmap_read(info->rtc, SEC_RTC_UDR_CON, &data); | ||
109 | } while ((data & RTC_UDR_MASK) && !ret); | ||
110 | |||
111 | return ret; | ||
112 | } | ||
113 | |||
114 | static inline int s5m8767_rtc_set_alarm_reg(struct s5m_rtc_info *info) | ||
115 | { | ||
116 | int ret; | ||
117 | unsigned int data; | ||
118 | |||
119 | ret = regmap_read(info->rtc, SEC_RTC_UDR_CON, &data); | ||
120 | if (ret < 0) { | ||
121 | dev_err(info->dev, "%s: fail to read update reg(%d)\n", | ||
122 | __func__, ret); | ||
123 | return ret; | ||
124 | } | ||
125 | |||
126 | data &= ~RTC_TIME_EN_MASK; | ||
127 | data |= RTC_UDR_MASK; | ||
128 | |||
129 | ret = regmap_write(info->rtc, SEC_RTC_UDR_CON, data); | ||
130 | if (ret < 0) { | ||
131 | dev_err(info->dev, "%s: fail to write update reg(%d)\n", | ||
132 | __func__, ret); | ||
133 | return ret; | ||
134 | } | ||
135 | |||
136 | do { | ||
137 | ret = regmap_read(info->rtc, SEC_RTC_UDR_CON, &data); | ||
138 | } while ((data & RTC_UDR_MASK) && !ret); | ||
139 | |||
140 | return ret; | ||
141 | } | ||
142 | |||
143 | static void s5m8763_data_to_tm(u8 *data, struct rtc_time *tm) | ||
144 | { | ||
145 | tm->tm_sec = bcd2bin(data[RTC_SEC]); | ||
146 | tm->tm_min = bcd2bin(data[RTC_MIN]); | ||
147 | |||
148 | if (data[RTC_HOUR] & HOUR_12) { | ||
149 | tm->tm_hour = bcd2bin(data[RTC_HOUR] & 0x1f); | ||
150 | if (data[RTC_HOUR] & HOUR_PM) | ||
151 | tm->tm_hour += 12; | ||
152 | } else { | ||
153 | tm->tm_hour = bcd2bin(data[RTC_HOUR] & 0x3f); | ||
154 | } | ||
155 | |||
156 | tm->tm_wday = data[RTC_WEEKDAY] & 0x07; | ||
157 | tm->tm_mday = bcd2bin(data[RTC_DATE]); | ||
158 | tm->tm_mon = bcd2bin(data[RTC_MONTH]); | ||
159 | tm->tm_year = bcd2bin(data[RTC_YEAR1]) + bcd2bin(data[RTC_YEAR2]) * 100; | ||
160 | tm->tm_year -= 1900; | ||
161 | } | ||
162 | |||
163 | static void s5m8763_tm_to_data(struct rtc_time *tm, u8 *data) | ||
164 | { | ||
165 | data[RTC_SEC] = bin2bcd(tm->tm_sec); | ||
166 | data[RTC_MIN] = bin2bcd(tm->tm_min); | ||
167 | data[RTC_HOUR] = bin2bcd(tm->tm_hour); | ||
168 | data[RTC_WEEKDAY] = tm->tm_wday; | ||
169 | data[RTC_DATE] = bin2bcd(tm->tm_mday); | ||
170 | data[RTC_MONTH] = bin2bcd(tm->tm_mon); | ||
171 | data[RTC_YEAR1] = bin2bcd(tm->tm_year % 100); | ||
172 | data[RTC_YEAR2] = bin2bcd((tm->tm_year + 1900) / 100); | ||
173 | } | ||
174 | |||
175 | static int s5m_rtc_read_time(struct device *dev, struct rtc_time *tm) | ||
176 | { | ||
177 | struct s5m_rtc_info *info = dev_get_drvdata(dev); | ||
178 | u8 data[8]; | ||
179 | int ret; | ||
180 | |||
181 | ret = regmap_bulk_read(info->rtc, SEC_RTC_SEC, data, 8); | ||
182 | if (ret < 0) | ||
183 | return ret; | ||
184 | |||
185 | switch (info->device_type) { | ||
186 | case S5M8763X: | ||
187 | s5m8763_data_to_tm(data, tm); | ||
188 | break; | ||
189 | |||
190 | case S5M8767X: | ||
191 | s5m8767_data_to_tm(data, tm, info->rtc_24hr_mode); | ||
192 | break; | ||
193 | |||
194 | default: | ||
195 | return -EINVAL; | ||
196 | } | ||
197 | |||
198 | dev_dbg(dev, "%s: %d/%d/%d %d:%d:%d(%d)\n", __func__, | ||
199 | 1900 + tm->tm_year, 1 + tm->tm_mon, tm->tm_mday, | ||
200 | tm->tm_hour, tm->tm_min, tm->tm_sec, tm->tm_wday); | ||
201 | |||
202 | return rtc_valid_tm(tm); | ||
203 | } | ||
204 | |||
205 | static int s5m_rtc_set_time(struct device *dev, struct rtc_time *tm) | ||
206 | { | ||
207 | struct s5m_rtc_info *info = dev_get_drvdata(dev); | ||
208 | u8 data[8]; | ||
209 | int ret = 0; | ||
210 | |||
211 | switch (info->device_type) { | ||
212 | case S5M8763X: | ||
213 | s5m8763_tm_to_data(tm, data); | ||
214 | break; | ||
215 | case S5M8767X: | ||
216 | ret = s5m8767_tm_to_data(tm, data); | ||
217 | break; | ||
218 | default: | ||
219 | return -EINVAL; | ||
220 | } | ||
221 | |||
222 | if (ret < 0) | ||
223 | return ret; | ||
224 | |||
225 | dev_dbg(dev, "%s: %d/%d/%d %d:%d:%d(%d)\n", __func__, | ||
226 | 1900 + tm->tm_year, 1 + tm->tm_mon, tm->tm_mday, | ||
227 | tm->tm_hour, tm->tm_min, tm->tm_sec, tm->tm_wday); | ||
228 | |||
229 | ret = regmap_raw_write(info->rtc, SEC_RTC_SEC, data, 8); | ||
230 | if (ret < 0) | ||
231 | return ret; | ||
232 | |||
233 | ret = s5m8767_rtc_set_time_reg(info); | ||
234 | |||
235 | return ret; | ||
236 | } | ||
237 | |||
238 | static int s5m_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm) | ||
239 | { | ||
240 | struct s5m_rtc_info *info = dev_get_drvdata(dev); | ||
241 | u8 data[8]; | ||
242 | unsigned int val; | ||
243 | int ret, i; | ||
244 | |||
245 | ret = regmap_bulk_read(info->rtc, SEC_ALARM0_SEC, data, 8); | ||
246 | if (ret < 0) | ||
247 | return ret; | ||
248 | |||
249 | switch (info->device_type) { | ||
250 | case S5M8763X: | ||
251 | s5m8763_data_to_tm(data, &alrm->time); | ||
252 | ret = regmap_read(info->rtc, SEC_ALARM0_CONF, &val); | ||
253 | if (ret < 0) | ||
254 | return ret; | ||
255 | |||
256 | alrm->enabled = !!val; | ||
257 | |||
258 | ret = regmap_read(info->rtc, SEC_RTC_STATUS, &val); | ||
259 | if (ret < 0) | ||
260 | return ret; | ||
261 | |||
262 | break; | ||
263 | |||
264 | case S5M8767X: | ||
265 | s5m8767_data_to_tm(data, &alrm->time, info->rtc_24hr_mode); | ||
266 | dev_dbg(dev, "%s: %d/%d/%d %d:%d:%d(%d)\n", __func__, | ||
267 | 1900 + alrm->time.tm_year, 1 + alrm->time.tm_mon, | ||
268 | alrm->time.tm_mday, alrm->time.tm_hour, | ||
269 | alrm->time.tm_min, alrm->time.tm_sec, | ||
270 | alrm->time.tm_wday); | ||
271 | |||
272 | alrm->enabled = 0; | ||
273 | for (i = 0; i < 7; i++) { | ||
274 | if (data[i] & ALARM_ENABLE_MASK) { | ||
275 | alrm->enabled = 1; | ||
276 | break; | ||
277 | } | ||
278 | } | ||
279 | |||
280 | alrm->pending = 0; | ||
281 | ret = regmap_read(info->rtc, SEC_RTC_STATUS, &val); | ||
282 | if (ret < 0) | ||
283 | return ret; | ||
284 | break; | ||
285 | |||
286 | default: | ||
287 | return -EINVAL; | ||
288 | } | ||
289 | |||
290 | if (val & ALARM0_STATUS) | ||
291 | alrm->pending = 1; | ||
292 | else | ||
293 | alrm->pending = 0; | ||
294 | |||
295 | return 0; | ||
296 | } | ||
297 | |||
298 | static int s5m_rtc_stop_alarm(struct s5m_rtc_info *info) | ||
299 | { | ||
300 | u8 data[8]; | ||
301 | int ret, i; | ||
302 | struct rtc_time tm; | ||
303 | |||
304 | ret = regmap_bulk_read(info->rtc, SEC_ALARM0_SEC, data, 8); | ||
305 | if (ret < 0) | ||
306 | return ret; | ||
307 | |||
308 | s5m8767_data_to_tm(data, &tm, info->rtc_24hr_mode); | ||
309 | dev_dbg(info->dev, "%s: %d/%d/%d %d:%d:%d(%d)\n", __func__, | ||
310 | 1900 + tm.tm_year, 1 + tm.tm_mon, tm.tm_mday, | ||
311 | tm.tm_hour, tm.tm_min, tm.tm_sec, tm.tm_wday); | ||
312 | |||
313 | switch (info->device_type) { | ||
314 | case S5M8763X: | ||
315 | ret = regmap_write(info->rtc, SEC_ALARM0_CONF, 0); | ||
316 | break; | ||
317 | |||
318 | case S5M8767X: | ||
319 | for (i = 0; i < 7; i++) | ||
320 | data[i] &= ~ALARM_ENABLE_MASK; | ||
321 | |||
322 | ret = regmap_raw_write(info->rtc, SEC_ALARM0_SEC, data, 8); | ||
323 | if (ret < 0) | ||
324 | return ret; | ||
325 | |||
326 | ret = s5m8767_rtc_set_alarm_reg(info); | ||
327 | |||
328 | break; | ||
329 | |||
330 | default: | ||
331 | return -EINVAL; | ||
332 | } | ||
333 | |||
334 | return ret; | ||
335 | } | ||
336 | |||
337 | static int s5m_rtc_start_alarm(struct s5m_rtc_info *info) | ||
338 | { | ||
339 | int ret; | ||
340 | u8 data[8]; | ||
341 | u8 alarm0_conf; | ||
342 | struct rtc_time tm; | ||
343 | |||
344 | ret = regmap_bulk_read(info->rtc, SEC_ALARM0_SEC, data, 8); | ||
345 | if (ret < 0) | ||
346 | return ret; | ||
347 | |||
348 | s5m8767_data_to_tm(data, &tm, info->rtc_24hr_mode); | ||
349 | dev_dbg(info->dev, "%s: %d/%d/%d %d:%d:%d(%d)\n", __func__, | ||
350 | 1900 + tm.tm_year, 1 + tm.tm_mon, tm.tm_mday, | ||
351 | tm.tm_hour, tm.tm_min, tm.tm_sec, tm.tm_wday); | ||
352 | |||
353 | switch (info->device_type) { | ||
354 | case S5M8763X: | ||
355 | alarm0_conf = 0x77; | ||
356 | ret = regmap_write(info->rtc, SEC_ALARM0_CONF, alarm0_conf); | ||
357 | break; | ||
358 | |||
359 | case S5M8767X: | ||
360 | data[RTC_SEC] |= ALARM_ENABLE_MASK; | ||
361 | data[RTC_MIN] |= ALARM_ENABLE_MASK; | ||
362 | data[RTC_HOUR] |= ALARM_ENABLE_MASK; | ||
363 | data[RTC_WEEKDAY] &= ~ALARM_ENABLE_MASK; | ||
364 | if (data[RTC_DATE] & 0x1f) | ||
365 | data[RTC_DATE] |= ALARM_ENABLE_MASK; | ||
366 | if (data[RTC_MONTH] & 0xf) | ||
367 | data[RTC_MONTH] |= ALARM_ENABLE_MASK; | ||
368 | if (data[RTC_YEAR1] & 0x7f) | ||
369 | data[RTC_YEAR1] |= ALARM_ENABLE_MASK; | ||
370 | |||
371 | ret = regmap_raw_write(info->rtc, SEC_ALARM0_SEC, data, 8); | ||
372 | if (ret < 0) | ||
373 | return ret; | ||
374 | ret = s5m8767_rtc_set_alarm_reg(info); | ||
375 | |||
376 | break; | ||
377 | |||
378 | default: | ||
379 | return -EINVAL; | ||
380 | } | ||
381 | |||
382 | return ret; | ||
383 | } | ||
384 | |||
385 | static int s5m_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) | ||
386 | { | ||
387 | struct s5m_rtc_info *info = dev_get_drvdata(dev); | ||
388 | u8 data[8]; | ||
389 | int ret; | ||
390 | |||
391 | switch (info->device_type) { | ||
392 | case S5M8763X: | ||
393 | s5m8763_tm_to_data(&alrm->time, data); | ||
394 | break; | ||
395 | |||
396 | case S5M8767X: | ||
397 | s5m8767_tm_to_data(&alrm->time, data); | ||
398 | break; | ||
399 | |||
400 | default: | ||
401 | return -EINVAL; | ||
402 | } | ||
403 | |||
404 | dev_dbg(dev, "%s: %d/%d/%d %d:%d:%d(%d)\n", __func__, | ||
405 | 1900 + alrm->time.tm_year, 1 + alrm->time.tm_mon, | ||
406 | alrm->time.tm_mday, alrm->time.tm_hour, alrm->time.tm_min, | ||
407 | alrm->time.tm_sec, alrm->time.tm_wday); | ||
408 | |||
409 | ret = s5m_rtc_stop_alarm(info); | ||
410 | if (ret < 0) | ||
411 | return ret; | ||
412 | |||
413 | ret = regmap_raw_write(info->rtc, SEC_ALARM0_SEC, data, 8); | ||
414 | if (ret < 0) | ||
415 | return ret; | ||
416 | |||
417 | ret = s5m8767_rtc_set_alarm_reg(info); | ||
418 | if (ret < 0) | ||
419 | return ret; | ||
420 | |||
421 | if (alrm->enabled) | ||
422 | ret = s5m_rtc_start_alarm(info); | ||
423 | |||
424 | return ret; | ||
425 | } | ||
426 | |||
427 | static int s5m_rtc_alarm_irq_enable(struct device *dev, | ||
428 | unsigned int enabled) | ||
429 | { | ||
430 | struct s5m_rtc_info *info = dev_get_drvdata(dev); | ||
431 | |||
432 | if (enabled) | ||
433 | return s5m_rtc_start_alarm(info); | ||
434 | else | ||
435 | return s5m_rtc_stop_alarm(info); | ||
436 | } | ||
437 | |||
438 | static irqreturn_t s5m_rtc_alarm_irq(int irq, void *data) | ||
439 | { | ||
440 | struct s5m_rtc_info *info = data; | ||
441 | |||
442 | rtc_update_irq(info->rtc_dev, 1, RTC_IRQF | RTC_AF); | ||
443 | |||
444 | return IRQ_HANDLED; | ||
445 | } | ||
446 | |||
447 | static const struct rtc_class_ops s5m_rtc_ops = { | ||
448 | .read_time = s5m_rtc_read_time, | ||
449 | .set_time = s5m_rtc_set_time, | ||
450 | .read_alarm = s5m_rtc_read_alarm, | ||
451 | .set_alarm = s5m_rtc_set_alarm, | ||
452 | .alarm_irq_enable = s5m_rtc_alarm_irq_enable, | ||
453 | }; | ||
454 | |||
455 | static void s5m_rtc_enable_wtsr(struct s5m_rtc_info *info, bool enable) | ||
456 | { | ||
457 | int ret; | ||
458 | ret = regmap_update_bits(info->rtc, SEC_WTSR_SMPL_CNTL, | ||
459 | WTSR_ENABLE_MASK, | ||
460 | enable ? WTSR_ENABLE_MASK : 0); | ||
461 | if (ret < 0) | ||
462 | dev_err(info->dev, "%s: fail to update WTSR reg(%d)\n", | ||
463 | __func__, ret); | ||
464 | } | ||
465 | |||
466 | static void s5m_rtc_enable_smpl(struct s5m_rtc_info *info, bool enable) | ||
467 | { | ||
468 | int ret; | ||
469 | ret = regmap_update_bits(info->rtc, SEC_WTSR_SMPL_CNTL, | ||
470 | SMPL_ENABLE_MASK, | ||
471 | enable ? SMPL_ENABLE_MASK : 0); | ||
472 | if (ret < 0) | ||
473 | dev_err(info->dev, "%s: fail to update SMPL reg(%d)\n", | ||
474 | __func__, ret); | ||
475 | } | ||
476 | |||
477 | static int s5m8767_rtc_init_reg(struct s5m_rtc_info *info) | ||
478 | { | ||
479 | u8 data[2]; | ||
480 | unsigned int tp_read; | ||
481 | int ret; | ||
482 | struct rtc_time tm; | ||
483 | |||
484 | ret = regmap_read(info->rtc, SEC_RTC_UDR_CON, &tp_read); | ||
485 | if (ret < 0) { | ||
486 | dev_err(info->dev, "%s: fail to read control reg(%d)\n", | ||
487 | __func__, ret); | ||
488 | return ret; | ||
489 | } | ||
490 | |||
491 | /* Set RTC control register : Binary mode, 24hour mode */ | ||
492 | data[0] = (1 << BCD_EN_SHIFT) | (1 << MODEL24_SHIFT); | ||
493 | data[1] = (0 << BCD_EN_SHIFT) | (1 << MODEL24_SHIFT); | ||
494 | |||
495 | info->rtc_24hr_mode = 1; | ||
496 | ret = regmap_raw_write(info->rtc, SEC_ALARM0_CONF, data, 2); | ||
497 | if (ret < 0) { | ||
498 | dev_err(info->dev, "%s: fail to write controlm reg(%d)\n", | ||
499 | __func__, ret); | ||
500 | return ret; | ||
501 | } | ||
502 | |||
503 | /* In first boot time, Set rtc time to 1/1/2012 00:00:00(SUN) */ | ||
504 | if ((tp_read & RTC_TCON_MASK) == 0) { | ||
505 | dev_dbg(info->dev, "rtc init\n"); | ||
506 | tm.tm_sec = 0; | ||
507 | tm.tm_min = 0; | ||
508 | tm.tm_hour = 0; | ||
509 | tm.tm_wday = 0; | ||
510 | tm.tm_mday = 1; | ||
511 | tm.tm_mon = 0; | ||
512 | tm.tm_year = 112; | ||
513 | tm.tm_yday = 0; | ||
514 | tm.tm_isdst = 0; | ||
515 | ret = s5m_rtc_set_time(info->dev, &tm); | ||
516 | } | ||
517 | |||
518 | ret = regmap_update_bits(info->rtc, SEC_RTC_UDR_CON, | ||
519 | RTC_TCON_MASK, tp_read | RTC_TCON_MASK); | ||
520 | if (ret < 0) | ||
521 | dev_err(info->dev, "%s: fail to update TCON reg(%d)\n", | ||
522 | __func__, ret); | ||
523 | |||
524 | return ret; | ||
525 | } | ||
526 | |||
527 | static int s5m_rtc_probe(struct platform_device *pdev) | ||
528 | { | ||
529 | struct sec_pmic_dev *s5m87xx = dev_get_drvdata(pdev->dev.parent); | ||
530 | struct sec_platform_data *pdata = s5m87xx->pdata; | ||
531 | struct s5m_rtc_info *info; | ||
532 | int ret; | ||
533 | |||
534 | if (!pdata) { | ||
535 | dev_err(pdev->dev.parent, "Platform data not supplied\n"); | ||
536 | return -ENODEV; | ||
537 | } | ||
538 | |||
539 | info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL); | ||
540 | if (!info) | ||
541 | return -ENOMEM; | ||
542 | |||
543 | info->dev = &pdev->dev; | ||
544 | info->s5m87xx = s5m87xx; | ||
545 | info->rtc = s5m87xx->rtc; | ||
546 | info->device_type = s5m87xx->device_type; | ||
547 | info->wtsr_smpl = s5m87xx->wtsr_smpl; | ||
548 | |||
549 | switch (pdata->device_type) { | ||
550 | case S5M8763X: | ||
551 | info->irq = s5m87xx->irq_base + S5M8763_IRQ_ALARM0; | ||
552 | break; | ||
553 | |||
554 | case S5M8767X: | ||
555 | info->irq = s5m87xx->irq_base + S5M8767_IRQ_RTCA1; | ||
556 | break; | ||
557 | |||
558 | default: | ||
559 | ret = -EINVAL; | ||
560 | dev_err(&pdev->dev, "Unsupported device type: %d\n", ret); | ||
561 | return ret; | ||
562 | } | ||
563 | |||
564 | platform_set_drvdata(pdev, info); | ||
565 | |||
566 | ret = s5m8767_rtc_init_reg(info); | ||
567 | |||
568 | if (info->wtsr_smpl) { | ||
569 | s5m_rtc_enable_wtsr(info, true); | ||
570 | s5m_rtc_enable_smpl(info, true); | ||
571 | } | ||
572 | |||
573 | device_init_wakeup(&pdev->dev, 1); | ||
574 | |||
575 | info->rtc_dev = devm_rtc_device_register(&pdev->dev, "s5m-rtc", | ||
576 | &s5m_rtc_ops, THIS_MODULE); | ||
577 | |||
578 | if (IS_ERR(info->rtc_dev)) | ||
579 | return PTR_ERR(info->rtc_dev); | ||
580 | |||
581 | ret = devm_request_threaded_irq(&pdev->dev, info->irq, NULL, | ||
582 | s5m_rtc_alarm_irq, 0, "rtc-alarm0", | ||
583 | info); | ||
584 | if (ret < 0) | ||
585 | dev_err(&pdev->dev, "Failed to request alarm IRQ: %d: %d\n", | ||
586 | info->irq, ret); | ||
587 | |||
588 | return ret; | ||
589 | } | ||
590 | |||
591 | static void s5m_rtc_shutdown(struct platform_device *pdev) | ||
592 | { | ||
593 | struct s5m_rtc_info *info = platform_get_drvdata(pdev); | ||
594 | int i; | ||
595 | unsigned int val = 0; | ||
596 | if (info->wtsr_smpl) { | ||
597 | for (i = 0; i < 3; i++) { | ||
598 | s5m_rtc_enable_wtsr(info, false); | ||
599 | regmap_read(info->rtc, SEC_WTSR_SMPL_CNTL, &val); | ||
600 | pr_debug("%s: WTSR_SMPL reg(0x%02x)\n", __func__, val); | ||
601 | if (val & WTSR_ENABLE_MASK) | ||
602 | pr_emerg("%s: fail to disable WTSR\n", | ||
603 | __func__); | ||
604 | else { | ||
605 | pr_info("%s: success to disable WTSR\n", | ||
606 | __func__); | ||
607 | break; | ||
608 | } | ||
609 | } | ||
610 | } | ||
611 | /* Disable SMPL when power off */ | ||
612 | s5m_rtc_enable_smpl(info, false); | ||
613 | } | ||
614 | |||
615 | static const struct platform_device_id s5m_rtc_id[] = { | ||
616 | { "s5m-rtc", 0 }, | ||
617 | }; | ||
618 | |||
619 | static struct platform_driver s5m_rtc_driver = { | ||
620 | .driver = { | ||
621 | .name = "s5m-rtc", | ||
622 | .owner = THIS_MODULE, | ||
623 | }, | ||
624 | .probe = s5m_rtc_probe, | ||
625 | .shutdown = s5m_rtc_shutdown, | ||
626 | .id_table = s5m_rtc_id, | ||
627 | }; | ||
628 | |||
629 | module_platform_driver(s5m_rtc_driver); | ||
630 | |||
631 | /* Module information */ | ||
632 | MODULE_AUTHOR("Sangbeom Kim <sbkim73@samsung.com>"); | ||
633 | MODULE_DESCRIPTION("Samsung S5M RTC driver"); | ||
634 | MODULE_LICENSE("GPL"); | ||
635 | MODULE_ALIAS("platform:s5m-rtc"); | ||
diff --git a/drivers/rtc/rtc-sh.c b/drivers/rtc/rtc-sh.c index 6d87e26355a3..d0d2b047658b 100644 --- a/drivers/rtc/rtc-sh.c +++ b/drivers/rtc/rtc-sh.c | |||
@@ -649,8 +649,9 @@ static int __init sh_rtc_probe(struct platform_device *pdev) | |||
649 | clk_enable(rtc->clk); | 649 | clk_enable(rtc->clk); |
650 | 650 | ||
651 | rtc->capabilities = RTC_DEF_CAPABILITIES; | 651 | rtc->capabilities = RTC_DEF_CAPABILITIES; |
652 | if (pdev->dev.platform_data) { | 652 | if (dev_get_platdata(&pdev->dev)) { |
653 | struct sh_rtc_platform_info *pinfo = pdev->dev.platform_data; | 653 | struct sh_rtc_platform_info *pinfo = |
654 | dev_get_platdata(&pdev->dev); | ||
654 | 655 | ||
655 | /* | 656 | /* |
656 | * Some CPUs have special capabilities in addition to the | 657 | * Some CPUs have special capabilities in addition to the |
diff --git a/drivers/rtc/rtc-sirfsoc.c b/drivers/rtc/rtc-sirfsoc.c index 63460cf80f1b..3eb3642ae299 100644 --- a/drivers/rtc/rtc-sirfsoc.c +++ b/drivers/rtc/rtc-sirfsoc.c | |||
@@ -59,7 +59,7 @@ static int sirfsoc_rtc_read_alarm(struct device *dev, | |||
59 | unsigned long rtc_alarm, rtc_count; | 59 | unsigned long rtc_alarm, rtc_count; |
60 | struct sirfsoc_rtc_drv *rtcdrv; | 60 | struct sirfsoc_rtc_drv *rtcdrv; |
61 | 61 | ||
62 | rtcdrv = (struct sirfsoc_rtc_drv *)dev_get_drvdata(dev); | 62 | rtcdrv = dev_get_drvdata(dev); |
63 | 63 | ||
64 | local_irq_disable(); | 64 | local_irq_disable(); |
65 | 65 | ||
@@ -94,7 +94,7 @@ static int sirfsoc_rtc_set_alarm(struct device *dev, | |||
94 | { | 94 | { |
95 | unsigned long rtc_status_reg, rtc_alarm; | 95 | unsigned long rtc_status_reg, rtc_alarm; |
96 | struct sirfsoc_rtc_drv *rtcdrv; | 96 | struct sirfsoc_rtc_drv *rtcdrv; |
97 | rtcdrv = (struct sirfsoc_rtc_drv *)dev_get_drvdata(dev); | 97 | rtcdrv = dev_get_drvdata(dev); |
98 | 98 | ||
99 | if (alrm->enabled) { | 99 | if (alrm->enabled) { |
100 | rtc_tm_to_time(&(alrm->time), &rtc_alarm); | 100 | rtc_tm_to_time(&(alrm->time), &rtc_alarm); |
@@ -157,7 +157,7 @@ static int sirfsoc_rtc_read_time(struct device *dev, | |||
157 | { | 157 | { |
158 | unsigned long tmp_rtc = 0; | 158 | unsigned long tmp_rtc = 0; |
159 | struct sirfsoc_rtc_drv *rtcdrv; | 159 | struct sirfsoc_rtc_drv *rtcdrv; |
160 | rtcdrv = (struct sirfsoc_rtc_drv *)dev_get_drvdata(dev); | 160 | rtcdrv = dev_get_drvdata(dev); |
161 | /* | 161 | /* |
162 | * This patch is taken from WinCE - Need to validate this for | 162 | * This patch is taken from WinCE - Need to validate this for |
163 | * correctness. To work around sirfsoc RTC counter double sync logic | 163 | * correctness. To work around sirfsoc RTC counter double sync logic |
@@ -178,7 +178,7 @@ static int sirfsoc_rtc_set_time(struct device *dev, | |||
178 | { | 178 | { |
179 | unsigned long rtc_time; | 179 | unsigned long rtc_time; |
180 | struct sirfsoc_rtc_drv *rtcdrv; | 180 | struct sirfsoc_rtc_drv *rtcdrv; |
181 | rtcdrv = (struct sirfsoc_rtc_drv *)dev_get_drvdata(dev); | 181 | rtcdrv = dev_get_drvdata(dev); |
182 | 182 | ||
183 | rtc_tm_to_time(tm, &rtc_time); | 183 | rtc_tm_to_time(tm, &rtc_time); |
184 | 184 | ||
@@ -274,7 +274,7 @@ static int sirfsoc_rtc_probe(struct platform_device *pdev) | |||
274 | err = of_property_read_u32(np, "reg", &rtcdrv->rtc_base); | 274 | err = of_property_read_u32(np, "reg", &rtcdrv->rtc_base); |
275 | if (err) { | 275 | if (err) { |
276 | dev_err(&pdev->dev, "unable to find base address of rtc node in dtb\n"); | 276 | dev_err(&pdev->dev, "unable to find base address of rtc node in dtb\n"); |
277 | goto error; | 277 | return err; |
278 | } | 278 | } |
279 | 279 | ||
280 | platform_set_drvdata(pdev, rtcdrv); | 280 | platform_set_drvdata(pdev, rtcdrv); |
@@ -290,7 +290,7 @@ static int sirfsoc_rtc_probe(struct platform_device *pdev) | |||
290 | rtc_div = ((32768 / RTC_HZ) / 2) - 1; | 290 | rtc_div = ((32768 / RTC_HZ) / 2) - 1; |
291 | sirfsoc_rtc_iobrg_writel(rtc_div, rtcdrv->rtc_base + RTC_DIV); | 291 | sirfsoc_rtc_iobrg_writel(rtc_div, rtcdrv->rtc_base + RTC_DIV); |
292 | 292 | ||
293 | rtcdrv->rtc = rtc_device_register(pdev->name, &(pdev->dev), | 293 | rtcdrv->rtc = devm_rtc_device_register(&pdev->dev, pdev->name, |
294 | &sirfsoc_rtc_ops, THIS_MODULE); | 294 | &sirfsoc_rtc_ops, THIS_MODULE); |
295 | if (IS_ERR(rtcdrv->rtc)) { | 295 | if (IS_ERR(rtcdrv->rtc)) { |
296 | err = PTR_ERR(rtcdrv->rtc); | 296 | err = PTR_ERR(rtcdrv->rtc); |
@@ -322,24 +322,15 @@ static int sirfsoc_rtc_probe(struct platform_device *pdev) | |||
322 | rtcdrv); | 322 | rtcdrv); |
323 | if (err) { | 323 | if (err) { |
324 | dev_err(&pdev->dev, "Unable to register for the SiRF SOC RTC IRQ\n"); | 324 | dev_err(&pdev->dev, "Unable to register for the SiRF SOC RTC IRQ\n"); |
325 | goto error; | 325 | return err; |
326 | } | 326 | } |
327 | 327 | ||
328 | return 0; | 328 | return 0; |
329 | |||
330 | error: | ||
331 | if (rtcdrv->rtc) | ||
332 | rtc_device_unregister(rtcdrv->rtc); | ||
333 | |||
334 | return err; | ||
335 | } | 329 | } |
336 | 330 | ||
337 | static int sirfsoc_rtc_remove(struct platform_device *pdev) | 331 | static int sirfsoc_rtc_remove(struct platform_device *pdev) |
338 | { | 332 | { |
339 | struct sirfsoc_rtc_drv *rtcdrv = platform_get_drvdata(pdev); | ||
340 | |||
341 | device_init_wakeup(&pdev->dev, 0); | 333 | device_init_wakeup(&pdev->dev, 0); |
342 | rtc_device_unregister(rtcdrv->rtc); | ||
343 | 334 | ||
344 | return 0; | 335 | return 0; |
345 | } | 336 | } |
@@ -373,7 +364,7 @@ static int sirfsoc_rtc_thaw(struct device *dev) | |||
373 | { | 364 | { |
374 | u32 tmp; | 365 | u32 tmp; |
375 | struct sirfsoc_rtc_drv *rtcdrv; | 366 | struct sirfsoc_rtc_drv *rtcdrv; |
376 | rtcdrv = (struct sirfsoc_rtc_drv *)dev_get_drvdata(dev); | 367 | rtcdrv = dev_get_drvdata(dev); |
377 | 368 | ||
378 | /* | 369 | /* |
379 | * if resume from snapshot and the rtc power is losed, | 370 | * if resume from snapshot and the rtc power is losed, |
@@ -467,7 +458,7 @@ static struct platform_driver sirfsoc_rtc_driver = { | |||
467 | #ifdef CONFIG_PM | 458 | #ifdef CONFIG_PM |
468 | .pm = &sirfsoc_rtc_pm_ops, | 459 | .pm = &sirfsoc_rtc_pm_ops, |
469 | #endif | 460 | #endif |
470 | .of_match_table = of_match_ptr(sirfsoc_rtc_of_match), | 461 | .of_match_table = sirfsoc_rtc_of_match, |
471 | }, | 462 | }, |
472 | .probe = sirfsoc_rtc_probe, | 463 | .probe = sirfsoc_rtc_probe, |
473 | .remove = sirfsoc_rtc_remove, | 464 | .remove = sirfsoc_rtc_remove, |
diff --git a/drivers/rtc/rtc-snvs.c b/drivers/rtc/rtc-snvs.c index 316a342115b2..fa384fe28988 100644 --- a/drivers/rtc/rtc-snvs.c +++ b/drivers/rtc/rtc-snvs.c | |||
@@ -329,7 +329,7 @@ static struct platform_driver snvs_rtc_driver = { | |||
329 | .name = "snvs_rtc", | 329 | .name = "snvs_rtc", |
330 | .owner = THIS_MODULE, | 330 | .owner = THIS_MODULE, |
331 | .pm = &snvs_rtc_pm_ops, | 331 | .pm = &snvs_rtc_pm_ops, |
332 | .of_match_table = of_match_ptr(snvs_dt_ids), | 332 | .of_match_table = snvs_dt_ids, |
333 | }, | 333 | }, |
334 | .probe = snvs_rtc_probe, | 334 | .probe = snvs_rtc_probe, |
335 | }; | 335 | }; |
diff --git a/drivers/rtc/rtc-stmp3xxx.c b/drivers/rtc/rtc-stmp3xxx.c index 26019531db15..ea96492357b0 100644 --- a/drivers/rtc/rtc-stmp3xxx.c +++ b/drivers/rtc/rtc-stmp3xxx.c | |||
@@ -343,7 +343,7 @@ static struct platform_driver stmp3xxx_rtcdrv = { | |||
343 | .name = "stmp3xxx-rtc", | 343 | .name = "stmp3xxx-rtc", |
344 | .owner = THIS_MODULE, | 344 | .owner = THIS_MODULE, |
345 | .pm = &stmp3xxx_rtc_pm_ops, | 345 | .pm = &stmp3xxx_rtc_pm_ops, |
346 | .of_match_table = of_match_ptr(rtc_dt_ids), | 346 | .of_match_table = rtc_dt_ids, |
347 | }, | 347 | }, |
348 | }; | 348 | }; |
349 | 349 | ||
diff --git a/drivers/rtc/rtc-tps65910.c b/drivers/rtc/rtc-tps65910.c index a9caf043b0ce..7af00208d637 100644 --- a/drivers/rtc/rtc-tps65910.c +++ b/drivers/rtc/rtc-tps65910.c | |||
@@ -22,7 +22,6 @@ | |||
22 | #include <linux/rtc.h> | 22 | #include <linux/rtc.h> |
23 | #include <linux/bcd.h> | 23 | #include <linux/bcd.h> |
24 | #include <linux/platform_device.h> | 24 | #include <linux/platform_device.h> |
25 | #include <linux/pm_runtime.h> | ||
26 | #include <linux/interrupt.h> | 25 | #include <linux/interrupt.h> |
27 | #include <linux/mfd/tps65910.h> | 26 | #include <linux/mfd/tps65910.h> |
28 | 27 | ||
diff --git a/drivers/rtc/rtc-v3020.c b/drivers/rtc/rtc-v3020.c index d07d89823020..25222cdccdc6 100644 --- a/drivers/rtc/rtc-v3020.c +++ b/drivers/rtc/rtc-v3020.c | |||
@@ -303,7 +303,7 @@ static const struct rtc_class_ops v3020_rtc_ops = { | |||
303 | 303 | ||
304 | static int rtc_probe(struct platform_device *pdev) | 304 | static int rtc_probe(struct platform_device *pdev) |
305 | { | 305 | { |
306 | struct v3020_platform_data *pdata = pdev->dev.platform_data; | 306 | struct v3020_platform_data *pdata = dev_get_platdata(&pdev->dev); |
307 | struct v3020 *chip; | 307 | struct v3020 *chip; |
308 | int retval = -EBUSY; | 308 | int retval = -EBUSY; |
309 | int i; | 309 | int i; |
diff --git a/drivers/rtc/rtc-vr41xx.c b/drivers/rtc/rtc-vr41xx.c index 54e104e197e3..aabc22c587fb 100644 --- a/drivers/rtc/rtc-vr41xx.c +++ b/drivers/rtc/rtc-vr41xx.c | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <linux/err.h> | 20 | #include <linux/err.h> |
21 | #include <linux/fs.h> | 21 | #include <linux/fs.h> |
22 | #include <linux/init.h> | 22 | #include <linux/init.h> |
23 | #include <linux/io.h> | ||
23 | #include <linux/ioport.h> | 24 | #include <linux/ioport.h> |
24 | #include <linux/interrupt.h> | 25 | #include <linux/interrupt.h> |
25 | #include <linux/module.h> | 26 | #include <linux/module.h> |
@@ -27,11 +28,10 @@ | |||
27 | #include <linux/rtc.h> | 28 | #include <linux/rtc.h> |
28 | #include <linux/spinlock.h> | 29 | #include <linux/spinlock.h> |
29 | #include <linux/types.h> | 30 | #include <linux/types.h> |
31 | #include <linux/uaccess.h> | ||
30 | #include <linux/log2.h> | 32 | #include <linux/log2.h> |
31 | 33 | ||
32 | #include <asm/div64.h> | 34 | #include <asm/div64.h> |
33 | #include <asm/io.h> | ||
34 | #include <asm/uaccess.h> | ||
35 | 35 | ||
36 | MODULE_AUTHOR("Yoichi Yuasa <yuasa@linux-mips.org>"); | 36 | MODULE_AUTHOR("Yoichi Yuasa <yuasa@linux-mips.org>"); |
37 | MODULE_DESCRIPTION("NEC VR4100 series RTC driver"); | 37 | MODULE_DESCRIPTION("NEC VR4100 series RTC driver"); |
diff --git a/drivers/rtc/rtc-vt8500.c b/drivers/rtc/rtc-vt8500.c index c2d6331fc712..df2ef3eba7cd 100644 --- a/drivers/rtc/rtc-vt8500.c +++ b/drivers/rtc/rtc-vt8500.c | |||
@@ -228,7 +228,7 @@ static int vt8500_rtc_probe(struct platform_device *pdev) | |||
228 | vt8500_rtc->irq_alarm = platform_get_irq(pdev, 0); | 228 | vt8500_rtc->irq_alarm = platform_get_irq(pdev, 0); |
229 | if (vt8500_rtc->irq_alarm < 0) { | 229 | if (vt8500_rtc->irq_alarm < 0) { |
230 | dev_err(&pdev->dev, "No alarm IRQ resource defined\n"); | 230 | dev_err(&pdev->dev, "No alarm IRQ resource defined\n"); |
231 | return -ENXIO; | 231 | return vt8500_rtc->irq_alarm; |
232 | } | 232 | } |
233 | 233 | ||
234 | vt8500_rtc->res = devm_request_mem_region(&pdev->dev, | 234 | vt8500_rtc->res = devm_request_mem_region(&pdev->dev, |
@@ -296,7 +296,7 @@ static struct platform_driver vt8500_rtc_driver = { | |||
296 | .driver = { | 296 | .driver = { |
297 | .name = "vt8500-rtc", | 297 | .name = "vt8500-rtc", |
298 | .owner = THIS_MODULE, | 298 | .owner = THIS_MODULE, |
299 | .of_match_table = of_match_ptr(wmt_dt_ids), | 299 | .of_match_table = wmt_dt_ids, |
300 | }, | 300 | }, |
301 | }; | 301 | }; |
302 | 302 | ||
diff --git a/drivers/staging/lustre/lustre/include/lustre/lustre_errno.h b/drivers/staging/lustre/lustre/include/lustre/lustre_errno.h index 2870487dd286..35aefa2cdad1 100644 --- a/drivers/staging/lustre/lustre/include/lustre/lustre_errno.h +++ b/drivers/staging/lustre/lustre/include/lustre/lustre_errno.h | |||
@@ -165,7 +165,7 @@ | |||
165 | #define LUSTRE_EHOSTUNREACH 113 /* No route to host */ | 165 | #define LUSTRE_EHOSTUNREACH 113 /* No route to host */ |
166 | #define LUSTRE_EALREADY 114 /* Operation already in progress */ | 166 | #define LUSTRE_EALREADY 114 /* Operation already in progress */ |
167 | #define LUSTRE_EINPROGRESS 115 /* Operation now in progress */ | 167 | #define LUSTRE_EINPROGRESS 115 /* Operation now in progress */ |
168 | #define LUSTRE_ESTALE 116 /* Stale NFS file handle */ | 168 | #define LUSTRE_ESTALE 116 /* Stale file handle */ |
169 | #define LUSTRE_EUCLEAN 117 /* Structure needs cleaning */ | 169 | #define LUSTRE_EUCLEAN 117 /* Structure needs cleaning */ |
170 | #define LUSTRE_ENOTNAM 118 /* Not a XENIX named type file */ | 170 | #define LUSTRE_ENOTNAM 118 /* Not a XENIX named type file */ |
171 | #define LUSTRE_ENAVAIL 119 /* No XENIX semaphores available */ | 171 | #define LUSTRE_ENAVAIL 119 /* No XENIX semaphores available */ |
diff --git a/drivers/uio/uio_pruss.c b/drivers/uio/uio_pruss.c index f519da9034b7..96c4a19b1918 100644 --- a/drivers/uio/uio_pruss.c +++ b/drivers/uio/uio_pruss.c | |||
@@ -158,14 +158,12 @@ static int pruss_probe(struct platform_device *dev) | |||
158 | if (pdata->sram_pool) { | 158 | if (pdata->sram_pool) { |
159 | gdev->sram_pool = pdata->sram_pool; | 159 | gdev->sram_pool = pdata->sram_pool; |
160 | gdev->sram_vaddr = | 160 | gdev->sram_vaddr = |
161 | gen_pool_alloc(gdev->sram_pool, sram_pool_sz); | 161 | (unsigned long)gen_pool_dma_alloc(gdev->sram_pool, |
162 | sram_pool_sz, &gdev->sram_paddr); | ||
162 | if (!gdev->sram_vaddr) { | 163 | if (!gdev->sram_vaddr) { |
163 | dev_err(&dev->dev, "Could not allocate SRAM pool\n"); | 164 | dev_err(&dev->dev, "Could not allocate SRAM pool\n"); |
164 | goto out_free; | 165 | goto out_free; |
165 | } | 166 | } |
166 | gdev->sram_paddr = | ||
167 | gen_pool_virt_to_phys(gdev->sram_pool, | ||
168 | gdev->sram_vaddr); | ||
169 | } | 167 | } |
170 | 168 | ||
171 | gdev->ddr_vaddr = dma_alloc_coherent(&dev->dev, extram_pool_sz, | 169 | gdev->ddr_vaddr = dma_alloc_coherent(&dev->dev, extram_pool_sz, |
diff --git a/drivers/video/acornfb.c b/drivers/video/acornfb.c index 7e8346ec9cdc..a305caea58ee 100644 --- a/drivers/video/acornfb.c +++ b/drivers/video/acornfb.c | |||
@@ -949,9 +949,7 @@ free_unused_pages(unsigned int virtual_start, unsigned int virtual_end) | |||
949 | * the page. | 949 | * the page. |
950 | */ | 950 | */ |
951 | page = virt_to_page(virtual_start); | 951 | page = virt_to_page(virtual_start); |
952 | ClearPageReserved(page); | 952 | __free_reserved_page(page); |
953 | init_page_count(page); | ||
954 | free_page(virtual_start); | ||
955 | 953 | ||
956 | virtual_start += PAGE_SIZE; | 954 | virtual_start += PAGE_SIZE; |
957 | mb_freed += PAGE_SIZE / 1024; | 955 | mb_freed += PAGE_SIZE / 1024; |
diff --git a/drivers/video/backlight/88pm860x_bl.c b/drivers/video/backlight/88pm860x_bl.c index 2cd63507ed74..7db5234462d0 100644 --- a/drivers/video/backlight/88pm860x_bl.c +++ b/drivers/video/backlight/88pm860x_bl.c | |||
@@ -196,7 +196,7 @@ static int pm860x_backlight_dt_init(struct platform_device *pdev, | |||
196 | static int pm860x_backlight_probe(struct platform_device *pdev) | 196 | static int pm860x_backlight_probe(struct platform_device *pdev) |
197 | { | 197 | { |
198 | struct pm860x_chip *chip = dev_get_drvdata(pdev->dev.parent); | 198 | struct pm860x_chip *chip = dev_get_drvdata(pdev->dev.parent); |
199 | struct pm860x_backlight_pdata *pdata = pdev->dev.platform_data; | 199 | struct pm860x_backlight_pdata *pdata = dev_get_platdata(&pdev->dev); |
200 | struct pm860x_backlight_data *data; | 200 | struct pm860x_backlight_data *data; |
201 | struct backlight_device *bl; | 201 | struct backlight_device *bl; |
202 | struct resource *res; | 202 | struct resource *res; |
@@ -243,7 +243,7 @@ static int pm860x_backlight_probe(struct platform_device *pdev) | |||
243 | memset(&props, 0, sizeof(struct backlight_properties)); | 243 | memset(&props, 0, sizeof(struct backlight_properties)); |
244 | props.type = BACKLIGHT_RAW; | 244 | props.type = BACKLIGHT_RAW; |
245 | props.max_brightness = MAX_BRIGHTNESS; | 245 | props.max_brightness = MAX_BRIGHTNESS; |
246 | bl = backlight_device_register(name, &pdev->dev, data, | 246 | bl = devm_backlight_device_register(&pdev->dev, name, &pdev->dev, data, |
247 | &pm860x_backlight_ops, &props); | 247 | &pm860x_backlight_ops, &props); |
248 | if (IS_ERR(bl)) { | 248 | if (IS_ERR(bl)) { |
249 | dev_err(&pdev->dev, "failed to register backlight\n"); | 249 | dev_err(&pdev->dev, "failed to register backlight\n"); |
@@ -256,21 +256,10 @@ static int pm860x_backlight_probe(struct platform_device *pdev) | |||
256 | /* read current backlight */ | 256 | /* read current backlight */ |
257 | ret = pm860x_backlight_get_brightness(bl); | 257 | ret = pm860x_backlight_get_brightness(bl); |
258 | if (ret < 0) | 258 | if (ret < 0) |
259 | goto out_brt; | 259 | return ret; |
260 | 260 | ||
261 | backlight_update_status(bl); | 261 | backlight_update_status(bl); |
262 | return 0; | 262 | return 0; |
263 | out_brt: | ||
264 | backlight_device_unregister(bl); | ||
265 | return ret; | ||
266 | } | ||
267 | |||
268 | static int pm860x_backlight_remove(struct platform_device *pdev) | ||
269 | { | ||
270 | struct backlight_device *bl = platform_get_drvdata(pdev); | ||
271 | |||
272 | backlight_device_unregister(bl); | ||
273 | return 0; | ||
274 | } | 263 | } |
275 | 264 | ||
276 | static struct platform_driver pm860x_backlight_driver = { | 265 | static struct platform_driver pm860x_backlight_driver = { |
@@ -279,7 +268,6 @@ static struct platform_driver pm860x_backlight_driver = { | |||
279 | .owner = THIS_MODULE, | 268 | .owner = THIS_MODULE, |
280 | }, | 269 | }, |
281 | .probe = pm860x_backlight_probe, | 270 | .probe = pm860x_backlight_probe, |
282 | .remove = pm860x_backlight_remove, | ||
283 | }; | 271 | }; |
284 | 272 | ||
285 | module_platform_driver(pm860x_backlight_driver); | 273 | module_platform_driver(pm860x_backlight_driver); |
diff --git a/drivers/video/backlight/Kconfig b/drivers/video/backlight/Kconfig index d4a7a351d67c..5a3eb2ecb525 100644 --- a/drivers/video/backlight/Kconfig +++ b/drivers/video/backlight/Kconfig | |||
@@ -368,12 +368,12 @@ config BACKLIGHT_AAT2870 | |||
368 | If you have a AnalogicTech AAT2870 say Y to enable the | 368 | If you have a AnalogicTech AAT2870 say Y to enable the |
369 | backlight driver. | 369 | backlight driver. |
370 | 370 | ||
371 | config BACKLIGHT_LM3630 | 371 | config BACKLIGHT_LM3630A |
372 | tristate "Backlight Driver for LM3630" | 372 | tristate "Backlight Driver for LM3630A" |
373 | depends on BACKLIGHT_CLASS_DEVICE && I2C | 373 | depends on BACKLIGHT_CLASS_DEVICE && I2C |
374 | select REGMAP_I2C | 374 | select REGMAP_I2C |
375 | help | 375 | help |
376 | This supports TI LM3630 Backlight Driver | 376 | This supports TI LM3630A Backlight Driver |
377 | 377 | ||
378 | config BACKLIGHT_LM3639 | 378 | config BACKLIGHT_LM3639 |
379 | tristate "Backlight Driver for LM3639" | 379 | tristate "Backlight Driver for LM3639" |
@@ -388,8 +388,8 @@ config BACKLIGHT_LP855X | |||
388 | tristate "Backlight driver for TI LP855X" | 388 | tristate "Backlight driver for TI LP855X" |
389 | depends on BACKLIGHT_CLASS_DEVICE && I2C | 389 | depends on BACKLIGHT_CLASS_DEVICE && I2C |
390 | help | 390 | help |
391 | This supports TI LP8550, LP8551, LP8552, LP8553, LP8556 and LP8557 | 391 | This supports TI LP8550, LP8551, LP8552, LP8553, LP8555, LP8556 and |
392 | backlight driver. | 392 | LP8557 backlight driver. |
393 | 393 | ||
394 | config BACKLIGHT_LP8788 | 394 | config BACKLIGHT_LP8788 |
395 | tristate "Backlight driver for TI LP8788 MFD" | 395 | tristate "Backlight driver for TI LP8788 MFD" |
diff --git a/drivers/video/backlight/Makefile b/drivers/video/backlight/Makefile index 38e1babb1946..bb820024f346 100644 --- a/drivers/video/backlight/Makefile +++ b/drivers/video/backlight/Makefile | |||
@@ -37,7 +37,7 @@ obj-$(CONFIG_BACKLIGHT_GPIO) += gpio_backlight.o | |||
37 | obj-$(CONFIG_BACKLIGHT_HP680) += hp680_bl.o | 37 | obj-$(CONFIG_BACKLIGHT_HP680) += hp680_bl.o |
38 | obj-$(CONFIG_BACKLIGHT_HP700) += jornada720_bl.o | 38 | obj-$(CONFIG_BACKLIGHT_HP700) += jornada720_bl.o |
39 | obj-$(CONFIG_BACKLIGHT_LM3533) += lm3533_bl.o | 39 | obj-$(CONFIG_BACKLIGHT_LM3533) += lm3533_bl.o |
40 | obj-$(CONFIG_BACKLIGHT_LM3630) += lm3630_bl.o | 40 | obj-$(CONFIG_BACKLIGHT_LM3630A) += lm3630a_bl.o |
41 | obj-$(CONFIG_BACKLIGHT_LM3639) += lm3639_bl.o | 41 | obj-$(CONFIG_BACKLIGHT_LM3639) += lm3639_bl.o |
42 | obj-$(CONFIG_BACKLIGHT_LOCOMO) += locomolcd.o | 42 | obj-$(CONFIG_BACKLIGHT_LOCOMO) += locomolcd.o |
43 | obj-$(CONFIG_BACKLIGHT_LP855X) += lp855x_bl.o | 43 | obj-$(CONFIG_BACKLIGHT_LP855X) += lp855x_bl.o |
diff --git a/drivers/video/backlight/aat2870_bl.c b/drivers/video/backlight/aat2870_bl.c index c6fc668d6236..ee0c0a982e4e 100644 --- a/drivers/video/backlight/aat2870_bl.c +++ b/drivers/video/backlight/aat2870_bl.c | |||
@@ -127,7 +127,7 @@ static const struct backlight_ops aat2870_bl_ops = { | |||
127 | 127 | ||
128 | static int aat2870_bl_probe(struct platform_device *pdev) | 128 | static int aat2870_bl_probe(struct platform_device *pdev) |
129 | { | 129 | { |
130 | struct aat2870_bl_platform_data *pdata = pdev->dev.platform_data; | 130 | struct aat2870_bl_platform_data *pdata = dev_get_platdata(&pdev->dev); |
131 | struct aat2870_bl_driver_data *aat2870_bl; | 131 | struct aat2870_bl_driver_data *aat2870_bl; |
132 | struct backlight_device *bd; | 132 | struct backlight_device *bd; |
133 | struct backlight_properties props; | 133 | struct backlight_properties props; |
@@ -158,8 +158,9 @@ static int aat2870_bl_probe(struct platform_device *pdev) | |||
158 | memset(&props, 0, sizeof(struct backlight_properties)); | 158 | memset(&props, 0, sizeof(struct backlight_properties)); |
159 | 159 | ||
160 | props.type = BACKLIGHT_RAW; | 160 | props.type = BACKLIGHT_RAW; |
161 | bd = backlight_device_register("aat2870-backlight", &pdev->dev, | 161 | bd = devm_backlight_device_register(&pdev->dev, "aat2870-backlight", |
162 | aat2870_bl, &aat2870_bl_ops, &props); | 162 | &pdev->dev, aat2870_bl, &aat2870_bl_ops, |
163 | &props); | ||
163 | if (IS_ERR(bd)) { | 164 | if (IS_ERR(bd)) { |
164 | dev_err(&pdev->dev, | 165 | dev_err(&pdev->dev, |
165 | "Failed allocate memory for backlight device\n"); | 166 | "Failed allocate memory for backlight device\n"); |
@@ -194,13 +195,11 @@ static int aat2870_bl_probe(struct platform_device *pdev) | |||
194 | ret = aat2870_bl_update_status(bd); | 195 | ret = aat2870_bl_update_status(bd); |
195 | if (ret < 0) { | 196 | if (ret < 0) { |
196 | dev_err(&pdev->dev, "Failed to initialize\n"); | 197 | dev_err(&pdev->dev, "Failed to initialize\n"); |
197 | goto out_bl_dev_unregister; | 198 | return ret; |
198 | } | 199 | } |
199 | 200 | ||
200 | return 0; | 201 | return 0; |
201 | 202 | ||
202 | out_bl_dev_unregister: | ||
203 | backlight_device_unregister(bd); | ||
204 | out: | 203 | out: |
205 | return ret; | 204 | return ret; |
206 | } | 205 | } |
@@ -214,8 +213,6 @@ static int aat2870_bl_remove(struct platform_device *pdev) | |||
214 | bd->props.brightness = 0; | 213 | bd->props.brightness = 0; |
215 | backlight_update_status(bd); | 214 | backlight_update_status(bd); |
216 | 215 | ||
217 | backlight_device_unregister(bd); | ||
218 | |||
219 | return 0; | 216 | return 0; |
220 | } | 217 | } |
221 | 218 | ||
diff --git a/drivers/video/backlight/adp5520_bl.c b/drivers/video/backlight/adp5520_bl.c index c84701b7ca6e..f37097a261a2 100644 --- a/drivers/video/backlight/adp5520_bl.c +++ b/drivers/video/backlight/adp5520_bl.c | |||
@@ -297,7 +297,7 @@ static int adp5520_bl_probe(struct platform_device *pdev) | |||
297 | return -ENOMEM; | 297 | return -ENOMEM; |
298 | 298 | ||
299 | data->master = pdev->dev.parent; | 299 | data->master = pdev->dev.parent; |
300 | data->pdata = pdev->dev.platform_data; | 300 | data->pdata = dev_get_platdata(&pdev->dev); |
301 | 301 | ||
302 | if (data->pdata == NULL) { | 302 | if (data->pdata == NULL) { |
303 | dev_err(&pdev->dev, "missing platform data\n"); | 303 | dev_err(&pdev->dev, "missing platform data\n"); |
@@ -312,8 +312,9 @@ static int adp5520_bl_probe(struct platform_device *pdev) | |||
312 | memset(&props, 0, sizeof(struct backlight_properties)); | 312 | memset(&props, 0, sizeof(struct backlight_properties)); |
313 | props.type = BACKLIGHT_RAW; | 313 | props.type = BACKLIGHT_RAW; |
314 | props.max_brightness = ADP5020_MAX_BRIGHTNESS; | 314 | props.max_brightness = ADP5020_MAX_BRIGHTNESS; |
315 | bl = backlight_device_register(pdev->name, data->master, data, | 315 | bl = devm_backlight_device_register(&pdev->dev, pdev->name, |
316 | &adp5520_bl_ops, &props); | 316 | data->master, data, &adp5520_bl_ops, |
317 | &props); | ||
317 | if (IS_ERR(bl)) { | 318 | if (IS_ERR(bl)) { |
318 | dev_err(&pdev->dev, "failed to register backlight\n"); | 319 | dev_err(&pdev->dev, "failed to register backlight\n"); |
319 | return PTR_ERR(bl); | 320 | return PTR_ERR(bl); |
@@ -326,7 +327,7 @@ static int adp5520_bl_probe(struct platform_device *pdev) | |||
326 | 327 | ||
327 | if (ret) { | 328 | if (ret) { |
328 | dev_err(&pdev->dev, "failed to register sysfs\n"); | 329 | dev_err(&pdev->dev, "failed to register sysfs\n"); |
329 | backlight_device_unregister(bl); | 330 | return ret; |
330 | } | 331 | } |
331 | 332 | ||
332 | platform_set_drvdata(pdev, bl); | 333 | platform_set_drvdata(pdev, bl); |
@@ -347,8 +348,6 @@ static int adp5520_bl_remove(struct platform_device *pdev) | |||
347 | sysfs_remove_group(&bl->dev.kobj, | 348 | sysfs_remove_group(&bl->dev.kobj, |
348 | &adp5520_bl_attr_group); | 349 | &adp5520_bl_attr_group); |
349 | 350 | ||
350 | backlight_device_unregister(bl); | ||
351 | |||
352 | return 0; | 351 | return 0; |
353 | } | 352 | } |
354 | 353 | ||
diff --git a/drivers/video/backlight/adp8860_bl.c b/drivers/video/backlight/adp8860_bl.c index 75b10f876127..9d656717d0f7 100644 --- a/drivers/video/backlight/adp8860_bl.c +++ b/drivers/video/backlight/adp8860_bl.c | |||
@@ -216,7 +216,7 @@ static int adp8860_led_setup(struct adp8860_led *led) | |||
216 | static int adp8860_led_probe(struct i2c_client *client) | 216 | static int adp8860_led_probe(struct i2c_client *client) |
217 | { | 217 | { |
218 | struct adp8860_backlight_platform_data *pdata = | 218 | struct adp8860_backlight_platform_data *pdata = |
219 | client->dev.platform_data; | 219 | dev_get_platdata(&client->dev); |
220 | struct adp8860_bl *data = i2c_get_clientdata(client); | 220 | struct adp8860_bl *data = i2c_get_clientdata(client); |
221 | struct adp8860_led *led, *led_dat; | 221 | struct adp8860_led *led, *led_dat; |
222 | struct led_info *cur_led; | 222 | struct led_info *cur_led; |
@@ -300,7 +300,7 @@ static int adp8860_led_probe(struct i2c_client *client) | |||
300 | static int adp8860_led_remove(struct i2c_client *client) | 300 | static int adp8860_led_remove(struct i2c_client *client) |
301 | { | 301 | { |
302 | struct adp8860_backlight_platform_data *pdata = | 302 | struct adp8860_backlight_platform_data *pdata = |
303 | client->dev.platform_data; | 303 | dev_get_platdata(&client->dev); |
304 | struct adp8860_bl *data = i2c_get_clientdata(client); | 304 | struct adp8860_bl *data = i2c_get_clientdata(client); |
305 | int i; | 305 | int i; |
306 | 306 | ||
@@ -658,7 +658,7 @@ static int adp8860_probe(struct i2c_client *client, | |||
658 | struct backlight_device *bl; | 658 | struct backlight_device *bl; |
659 | struct adp8860_bl *data; | 659 | struct adp8860_bl *data; |
660 | struct adp8860_backlight_platform_data *pdata = | 660 | struct adp8860_backlight_platform_data *pdata = |
661 | client->dev.platform_data; | 661 | dev_get_platdata(&client->dev); |
662 | struct backlight_properties props; | 662 | struct backlight_properties props; |
663 | uint8_t reg_val; | 663 | uint8_t reg_val; |
664 | int ret; | 664 | int ret; |
@@ -711,8 +711,9 @@ static int adp8860_probe(struct i2c_client *client, | |||
711 | 711 | ||
712 | mutex_init(&data->lock); | 712 | mutex_init(&data->lock); |
713 | 713 | ||
714 | bl = backlight_device_register(dev_driver_string(&client->dev), | 714 | bl = devm_backlight_device_register(&client->dev, |
715 | &client->dev, data, &adp8860_bl_ops, &props); | 715 | dev_driver_string(&client->dev), |
716 | &client->dev, data, &adp8860_bl_ops, &props); | ||
716 | if (IS_ERR(bl)) { | 717 | if (IS_ERR(bl)) { |
717 | dev_err(&client->dev, "failed to register backlight\n"); | 718 | dev_err(&client->dev, "failed to register backlight\n"); |
718 | return PTR_ERR(bl); | 719 | return PTR_ERR(bl); |
@@ -728,7 +729,7 @@ static int adp8860_probe(struct i2c_client *client, | |||
728 | 729 | ||
729 | if (ret) { | 730 | if (ret) { |
730 | dev_err(&client->dev, "failed to register sysfs\n"); | 731 | dev_err(&client->dev, "failed to register sysfs\n"); |
731 | goto out1; | 732 | return ret; |
732 | } | 733 | } |
733 | 734 | ||
734 | ret = adp8860_bl_setup(bl); | 735 | ret = adp8860_bl_setup(bl); |
@@ -751,8 +752,6 @@ out: | |||
751 | if (data->en_ambl_sens) | 752 | if (data->en_ambl_sens) |
752 | sysfs_remove_group(&data->bl->dev.kobj, | 753 | sysfs_remove_group(&data->bl->dev.kobj, |
753 | &adp8860_bl_attr_group); | 754 | &adp8860_bl_attr_group); |
754 | out1: | ||
755 | backlight_device_unregister(bl); | ||
756 | 755 | ||
757 | return ret; | 756 | return ret; |
758 | } | 757 | } |
@@ -770,8 +769,6 @@ static int adp8860_remove(struct i2c_client *client) | |||
770 | sysfs_remove_group(&data->bl->dev.kobj, | 769 | sysfs_remove_group(&data->bl->dev.kobj, |
771 | &adp8860_bl_attr_group); | 770 | &adp8860_bl_attr_group); |
772 | 771 | ||
773 | backlight_device_unregister(data->bl); | ||
774 | |||
775 | return 0; | 772 | return 0; |
776 | } | 773 | } |
777 | 774 | ||
diff --git a/drivers/video/backlight/adp8870_bl.c b/drivers/video/backlight/adp8870_bl.c index 90049d7b5c60..63707205326b 100644 --- a/drivers/video/backlight/adp8870_bl.c +++ b/drivers/video/backlight/adp8870_bl.c | |||
@@ -238,7 +238,7 @@ static int adp8870_led_setup(struct adp8870_led *led) | |||
238 | static int adp8870_led_probe(struct i2c_client *client) | 238 | static int adp8870_led_probe(struct i2c_client *client) |
239 | { | 239 | { |
240 | struct adp8870_backlight_platform_data *pdata = | 240 | struct adp8870_backlight_platform_data *pdata = |
241 | client->dev.platform_data; | 241 | dev_get_platdata(&client->dev); |
242 | struct adp8870_bl *data = i2c_get_clientdata(client); | 242 | struct adp8870_bl *data = i2c_get_clientdata(client); |
243 | struct adp8870_led *led, *led_dat; | 243 | struct adp8870_led *led, *led_dat; |
244 | struct led_info *cur_led; | 244 | struct led_info *cur_led; |
@@ -325,7 +325,7 @@ static int adp8870_led_probe(struct i2c_client *client) | |||
325 | static int adp8870_led_remove(struct i2c_client *client) | 325 | static int adp8870_led_remove(struct i2c_client *client) |
326 | { | 326 | { |
327 | struct adp8870_backlight_platform_data *pdata = | 327 | struct adp8870_backlight_platform_data *pdata = |
328 | client->dev.platform_data; | 328 | dev_get_platdata(&client->dev); |
329 | struct adp8870_bl *data = i2c_get_clientdata(client); | 329 | struct adp8870_bl *data = i2c_get_clientdata(client); |
330 | int i; | 330 | int i; |
331 | 331 | ||
@@ -848,7 +848,7 @@ static int adp8870_probe(struct i2c_client *client, | |||
848 | struct backlight_device *bl; | 848 | struct backlight_device *bl; |
849 | struct adp8870_bl *data; | 849 | struct adp8870_bl *data; |
850 | struct adp8870_backlight_platform_data *pdata = | 850 | struct adp8870_backlight_platform_data *pdata = |
851 | client->dev.platform_data; | 851 | dev_get_platdata(&client->dev); |
852 | uint8_t reg_val; | 852 | uint8_t reg_val; |
853 | int ret; | 853 | int ret; |
854 | 854 | ||
@@ -888,8 +888,9 @@ static int adp8870_probe(struct i2c_client *client, | |||
888 | memset(&props, 0, sizeof(props)); | 888 | memset(&props, 0, sizeof(props)); |
889 | props.type = BACKLIGHT_RAW; | 889 | props.type = BACKLIGHT_RAW; |
890 | props.max_brightness = props.brightness = ADP8870_MAX_BRIGHTNESS; | 890 | props.max_brightness = props.brightness = ADP8870_MAX_BRIGHTNESS; |
891 | bl = backlight_device_register(dev_driver_string(&client->dev), | 891 | bl = devm_backlight_device_register(&client->dev, |
892 | &client->dev, data, &adp8870_bl_ops, &props); | 892 | dev_driver_string(&client->dev), |
893 | &client->dev, data, &adp8870_bl_ops, &props); | ||
893 | if (IS_ERR(bl)) { | 894 | if (IS_ERR(bl)) { |
894 | dev_err(&client->dev, "failed to register backlight\n"); | 895 | dev_err(&client->dev, "failed to register backlight\n"); |
895 | return PTR_ERR(bl); | 896 | return PTR_ERR(bl); |
@@ -902,7 +903,7 @@ static int adp8870_probe(struct i2c_client *client, | |||
902 | &adp8870_bl_attr_group); | 903 | &adp8870_bl_attr_group); |
903 | if (ret) { | 904 | if (ret) { |
904 | dev_err(&client->dev, "failed to register sysfs\n"); | 905 | dev_err(&client->dev, "failed to register sysfs\n"); |
905 | goto out1; | 906 | return ret; |
906 | } | 907 | } |
907 | } | 908 | } |
908 | 909 | ||
@@ -925,8 +926,6 @@ out: | |||
925 | if (data->pdata->en_ambl_sens) | 926 | if (data->pdata->en_ambl_sens) |
926 | sysfs_remove_group(&data->bl->dev.kobj, | 927 | sysfs_remove_group(&data->bl->dev.kobj, |
927 | &adp8870_bl_attr_group); | 928 | &adp8870_bl_attr_group); |
928 | out1: | ||
929 | backlight_device_unregister(bl); | ||
930 | 929 | ||
931 | return ret; | 930 | return ret; |
932 | } | 931 | } |
@@ -944,8 +943,6 @@ static int adp8870_remove(struct i2c_client *client) | |||
944 | sysfs_remove_group(&data->bl->dev.kobj, | 943 | sysfs_remove_group(&data->bl->dev.kobj, |
945 | &adp8870_bl_attr_group); | 944 | &adp8870_bl_attr_group); |
946 | 945 | ||
947 | backlight_device_unregister(data->bl); | ||
948 | |||
949 | return 0; | 946 | return 0; |
950 | } | 947 | } |
951 | 948 | ||
diff --git a/drivers/video/backlight/ams369fg06.c b/drivers/video/backlight/ams369fg06.c index 319fef6cb422..d8952c4aa689 100644 --- a/drivers/video/backlight/ams369fg06.c +++ b/drivers/video/backlight/ams369fg06.c | |||
@@ -471,14 +471,14 @@ static int ams369fg06_probe(struct spi_device *spi) | |||
471 | lcd->spi = spi; | 471 | lcd->spi = spi; |
472 | lcd->dev = &spi->dev; | 472 | lcd->dev = &spi->dev; |
473 | 473 | ||
474 | lcd->lcd_pd = spi->dev.platform_data; | 474 | lcd->lcd_pd = dev_get_platdata(&spi->dev); |
475 | if (!lcd->lcd_pd) { | 475 | if (!lcd->lcd_pd) { |
476 | dev_err(&spi->dev, "platform data is NULL\n"); | 476 | dev_err(&spi->dev, "platform data is NULL\n"); |
477 | return -EINVAL; | 477 | return -EINVAL; |
478 | } | 478 | } |
479 | 479 | ||
480 | ld = lcd_device_register("ams369fg06", &spi->dev, lcd, | 480 | ld = devm_lcd_device_register(&spi->dev, "ams369fg06", &spi->dev, lcd, |
481 | &ams369fg06_lcd_ops); | 481 | &ams369fg06_lcd_ops); |
482 | if (IS_ERR(ld)) | 482 | if (IS_ERR(ld)) |
483 | return PTR_ERR(ld); | 483 | return PTR_ERR(ld); |
484 | 484 | ||
@@ -488,12 +488,11 @@ static int ams369fg06_probe(struct spi_device *spi) | |||
488 | props.type = BACKLIGHT_RAW; | 488 | props.type = BACKLIGHT_RAW; |
489 | props.max_brightness = MAX_BRIGHTNESS; | 489 | props.max_brightness = MAX_BRIGHTNESS; |
490 | 490 | ||
491 | bd = backlight_device_register("ams369fg06-bl", &spi->dev, lcd, | 491 | bd = devm_backlight_device_register(&spi->dev, "ams369fg06-bl", |
492 | &ams369fg06_backlight_ops, &props); | 492 | &spi->dev, lcd, |
493 | if (IS_ERR(bd)) { | 493 | &ams369fg06_backlight_ops, &props); |
494 | ret = PTR_ERR(bd); | 494 | if (IS_ERR(bd)) |
495 | goto out_lcd_unregister; | 495 | return PTR_ERR(bd); |
496 | } | ||
497 | 496 | ||
498 | bd->props.brightness = DEFAULT_BRIGHTNESS; | 497 | bd->props.brightness = DEFAULT_BRIGHTNESS; |
499 | lcd->bd = bd; | 498 | lcd->bd = bd; |
@@ -516,10 +515,6 @@ static int ams369fg06_probe(struct spi_device *spi) | |||
516 | dev_info(&spi->dev, "ams369fg06 panel driver has been probed.\n"); | 515 | dev_info(&spi->dev, "ams369fg06 panel driver has been probed.\n"); |
517 | 516 | ||
518 | return 0; | 517 | return 0; |
519 | |||
520 | out_lcd_unregister: | ||
521 | lcd_device_unregister(ld); | ||
522 | return ret; | ||
523 | } | 518 | } |
524 | 519 | ||
525 | static int ams369fg06_remove(struct spi_device *spi) | 520 | static int ams369fg06_remove(struct spi_device *spi) |
@@ -527,9 +522,6 @@ static int ams369fg06_remove(struct spi_device *spi) | |||
527 | struct ams369fg06 *lcd = spi_get_drvdata(spi); | 522 | struct ams369fg06 *lcd = spi_get_drvdata(spi); |
528 | 523 | ||
529 | ams369fg06_power(lcd, FB_BLANK_POWERDOWN); | 524 | ams369fg06_power(lcd, FB_BLANK_POWERDOWN); |
530 | backlight_device_unregister(lcd->bd); | ||
531 | lcd_device_unregister(lcd->ld); | ||
532 | |||
533 | return 0; | 525 | return 0; |
534 | } | 526 | } |
535 | 527 | ||
diff --git a/drivers/video/backlight/as3711_bl.c b/drivers/video/backlight/as3711_bl.c index 123887cd76bd..bb1fc45b7549 100644 --- a/drivers/video/backlight/as3711_bl.c +++ b/drivers/video/backlight/as3711_bl.c | |||
@@ -240,7 +240,8 @@ static int as3711_bl_register(struct platform_device *pdev, | |||
240 | /* max tuning I = 31uA for voltage- and 38250uA for current-feedback */ | 240 | /* max tuning I = 31uA for voltage- and 38250uA for current-feedback */ |
241 | props.max_brightness = max_brightness; | 241 | props.max_brightness = max_brightness; |
242 | 242 | ||
243 | bl = backlight_device_register(su->type == AS3711_BL_SU1 ? | 243 | bl = devm_backlight_device_register(&pdev->dev, |
244 | su->type == AS3711_BL_SU1 ? | ||
244 | "as3711-su1" : "as3711-su2", | 245 | "as3711-su1" : "as3711-su2", |
245 | &pdev->dev, su, | 246 | &pdev->dev, su, |
246 | &as3711_bl_ops, &props); | 247 | &as3711_bl_ops, &props); |
@@ -432,8 +433,7 @@ static int as3711_backlight_probe(struct platform_device *pdev) | |||
432 | case AS3711_SU2_LX_SD4: | 433 | case AS3711_SU2_LX_SD4: |
433 | break; | 434 | break; |
434 | default: | 435 | default: |
435 | ret = -EINVAL; | 436 | return -EINVAL; |
436 | goto esu2; | ||
437 | } | 437 | } |
438 | 438 | ||
439 | switch (pdata->su2_feedback) { | 439 | switch (pdata->su2_feedback) { |
@@ -447,8 +447,7 @@ static int as3711_backlight_probe(struct platform_device *pdev) | |||
447 | max_brightness = min(pdata->su2_max_uA / 150, 255); | 447 | max_brightness = min(pdata->su2_max_uA / 150, 255); |
448 | break; | 448 | break; |
449 | default: | 449 | default: |
450 | ret = -EINVAL; | 450 | return -EINVAL; |
451 | goto esu2; | ||
452 | } | 451 | } |
453 | 452 | ||
454 | ret = as3711_bl_init_su2(supply); | 453 | ret = as3711_bl_init_su2(supply); |
@@ -457,26 +456,12 @@ static int as3711_backlight_probe(struct platform_device *pdev) | |||
457 | 456 | ||
458 | ret = as3711_bl_register(pdev, max_brightness, su); | 457 | ret = as3711_bl_register(pdev, max_brightness, su); |
459 | if (ret < 0) | 458 | if (ret < 0) |
460 | goto esu2; | 459 | return ret; |
461 | } | 460 | } |
462 | 461 | ||
463 | platform_set_drvdata(pdev, supply); | 462 | platform_set_drvdata(pdev, supply); |
464 | 463 | ||
465 | return 0; | 464 | return 0; |
466 | |||
467 | esu2: | ||
468 | backlight_device_unregister(supply->su1.bl); | ||
469 | return ret; | ||
470 | } | ||
471 | |||
472 | static int as3711_backlight_remove(struct platform_device *pdev) | ||
473 | { | ||
474 | struct as3711_bl_supply *supply = platform_get_drvdata(pdev); | ||
475 | |||
476 | backlight_device_unregister(supply->su1.bl); | ||
477 | backlight_device_unregister(supply->su2.bl); | ||
478 | |||
479 | return 0; | ||
480 | } | 465 | } |
481 | 466 | ||
482 | static struct platform_driver as3711_backlight_driver = { | 467 | static struct platform_driver as3711_backlight_driver = { |
@@ -485,7 +470,6 @@ static struct platform_driver as3711_backlight_driver = { | |||
485 | .owner = THIS_MODULE, | 470 | .owner = THIS_MODULE, |
486 | }, | 471 | }, |
487 | .probe = as3711_backlight_probe, | 472 | .probe = as3711_backlight_probe, |
488 | .remove = as3711_backlight_remove, | ||
489 | }; | 473 | }; |
490 | 474 | ||
491 | module_platform_driver(as3711_backlight_driver); | 475 | module_platform_driver(as3711_backlight_driver); |
diff --git a/drivers/video/backlight/atmel-pwm-bl.c b/drivers/video/backlight/atmel-pwm-bl.c index f7447f7004fb..261b1a4ec3d8 100644 --- a/drivers/video/backlight/atmel-pwm-bl.c +++ b/drivers/video/backlight/atmel-pwm-bl.c | |||
@@ -12,7 +12,6 @@ | |||
12 | #include <linux/module.h> | 12 | #include <linux/module.h> |
13 | #include <linux/platform_device.h> | 13 | #include <linux/platform_device.h> |
14 | #include <linux/fb.h> | 14 | #include <linux/fb.h> |
15 | #include <linux/clk.h> | ||
16 | #include <linux/gpio.h> | 15 | #include <linux/gpio.h> |
17 | #include <linux/backlight.h> | 16 | #include <linux/backlight.h> |
18 | #include <linux/atmel_pwm.h> | 17 | #include <linux/atmel_pwm.h> |
@@ -27,6 +26,14 @@ struct atmel_pwm_bl { | |||
27 | int gpio_on; | 26 | int gpio_on; |
28 | }; | 27 | }; |
29 | 28 | ||
29 | static void atmel_pwm_bl_set_gpio_on(struct atmel_pwm_bl *pwmbl, int on) | ||
30 | { | ||
31 | if (!gpio_is_valid(pwmbl->gpio_on)) | ||
32 | return; | ||
33 | |||
34 | gpio_set_value(pwmbl->gpio_on, on ^ pwmbl->pdata->on_active_low); | ||
35 | } | ||
36 | |||
30 | static int atmel_pwm_bl_set_intensity(struct backlight_device *bd) | 37 | static int atmel_pwm_bl_set_intensity(struct backlight_device *bd) |
31 | { | 38 | { |
32 | struct atmel_pwm_bl *pwmbl = bl_get_data(bd); | 39 | struct atmel_pwm_bl *pwmbl = bl_get_data(bd); |
@@ -49,19 +56,13 @@ static int atmel_pwm_bl_set_intensity(struct backlight_device *bd) | |||
49 | pwm_duty = pwmbl->pdata->pwm_duty_min; | 56 | pwm_duty = pwmbl->pdata->pwm_duty_min; |
50 | 57 | ||
51 | if (!intensity) { | 58 | if (!intensity) { |
52 | if (pwmbl->gpio_on != -1) { | 59 | atmel_pwm_bl_set_gpio_on(pwmbl, 0); |
53 | gpio_set_value(pwmbl->gpio_on, | ||
54 | 0 ^ pwmbl->pdata->on_active_low); | ||
55 | } | ||
56 | pwm_channel_writel(&pwmbl->pwmc, PWM_CUPD, pwm_duty); | 60 | pwm_channel_writel(&pwmbl->pwmc, PWM_CUPD, pwm_duty); |
57 | pwm_channel_disable(&pwmbl->pwmc); | 61 | pwm_channel_disable(&pwmbl->pwmc); |
58 | } else { | 62 | } else { |
59 | pwm_channel_enable(&pwmbl->pwmc); | 63 | pwm_channel_enable(&pwmbl->pwmc); |
60 | pwm_channel_writel(&pwmbl->pwmc, PWM_CUPD, pwm_duty); | 64 | pwm_channel_writel(&pwmbl->pwmc, PWM_CUPD, pwm_duty); |
61 | if (pwmbl->gpio_on != -1) { | 65 | atmel_pwm_bl_set_gpio_on(pwmbl, 1); |
62 | gpio_set_value(pwmbl->gpio_on, | ||
63 | 1 ^ pwmbl->pdata->on_active_low); | ||
64 | } | ||
65 | } | 66 | } |
66 | 67 | ||
67 | return 0; | 68 | return 0; |
@@ -70,17 +71,16 @@ static int atmel_pwm_bl_set_intensity(struct backlight_device *bd) | |||
70 | static int atmel_pwm_bl_get_intensity(struct backlight_device *bd) | 71 | static int atmel_pwm_bl_get_intensity(struct backlight_device *bd) |
71 | { | 72 | { |
72 | struct atmel_pwm_bl *pwmbl = bl_get_data(bd); | 73 | struct atmel_pwm_bl *pwmbl = bl_get_data(bd); |
73 | u8 intensity; | 74 | u32 cdty; |
75 | u32 intensity; | ||
74 | 76 | ||
75 | if (pwmbl->pdata->pwm_active_low) { | 77 | cdty = pwm_channel_readl(&pwmbl->pwmc, PWM_CDTY); |
76 | intensity = pwm_channel_readl(&pwmbl->pwmc, PWM_CDTY) - | 78 | if (pwmbl->pdata->pwm_active_low) |
77 | pwmbl->pdata->pwm_duty_min; | 79 | intensity = cdty - pwmbl->pdata->pwm_duty_min; |
78 | } else { | 80 | else |
79 | intensity = pwmbl->pdata->pwm_duty_max - | 81 | intensity = pwmbl->pdata->pwm_duty_max - cdty; |
80 | pwm_channel_readl(&pwmbl->pwmc, PWM_CDTY); | ||
81 | } | ||
82 | 82 | ||
83 | return intensity; | 83 | return intensity & 0xffff; |
84 | } | 84 | } |
85 | 85 | ||
86 | static int atmel_pwm_bl_init_pwm(struct atmel_pwm_bl *pwmbl) | 86 | static int atmel_pwm_bl_init_pwm(struct atmel_pwm_bl *pwmbl) |
@@ -124,46 +124,40 @@ static int atmel_pwm_bl_probe(struct platform_device *pdev) | |||
124 | const struct atmel_pwm_bl_platform_data *pdata; | 124 | const struct atmel_pwm_bl_platform_data *pdata; |
125 | struct backlight_device *bldev; | 125 | struct backlight_device *bldev; |
126 | struct atmel_pwm_bl *pwmbl; | 126 | struct atmel_pwm_bl *pwmbl; |
127 | unsigned long flags; | ||
127 | int retval; | 128 | int retval; |
128 | 129 | ||
130 | pdata = dev_get_platdata(&pdev->dev); | ||
131 | if (!pdata) | ||
132 | return -ENODEV; | ||
133 | |||
134 | if (pdata->pwm_compare_max < pdata->pwm_duty_max || | ||
135 | pdata->pwm_duty_min > pdata->pwm_duty_max || | ||
136 | pdata->pwm_frequency == 0) | ||
137 | return -EINVAL; | ||
138 | |||
129 | pwmbl = devm_kzalloc(&pdev->dev, sizeof(struct atmel_pwm_bl), | 139 | pwmbl = devm_kzalloc(&pdev->dev, sizeof(struct atmel_pwm_bl), |
130 | GFP_KERNEL); | 140 | GFP_KERNEL); |
131 | if (!pwmbl) | 141 | if (!pwmbl) |
132 | return -ENOMEM; | 142 | return -ENOMEM; |
133 | 143 | ||
134 | pwmbl->pdev = pdev; | 144 | pwmbl->pdev = pdev; |
135 | |||
136 | pdata = pdev->dev.platform_data; | ||
137 | if (!pdata) { | ||
138 | retval = -ENODEV; | ||
139 | goto err_free_mem; | ||
140 | } | ||
141 | |||
142 | if (pdata->pwm_compare_max < pdata->pwm_duty_max || | ||
143 | pdata->pwm_duty_min > pdata->pwm_duty_max || | ||
144 | pdata->pwm_frequency == 0) { | ||
145 | retval = -EINVAL; | ||
146 | goto err_free_mem; | ||
147 | } | ||
148 | |||
149 | pwmbl->pdata = pdata; | 145 | pwmbl->pdata = pdata; |
150 | pwmbl->gpio_on = pdata->gpio_on; | 146 | pwmbl->gpio_on = pdata->gpio_on; |
151 | 147 | ||
152 | retval = pwm_channel_alloc(pdata->pwm_channel, &pwmbl->pwmc); | 148 | retval = pwm_channel_alloc(pdata->pwm_channel, &pwmbl->pwmc); |
153 | if (retval) | 149 | if (retval) |
154 | goto err_free_mem; | 150 | return retval; |
155 | |||
156 | if (pwmbl->gpio_on != -1) { | ||
157 | retval = devm_gpio_request(&pdev->dev, pwmbl->gpio_on, | ||
158 | "gpio_atmel_pwm_bl"); | ||
159 | if (retval) { | ||
160 | pwmbl->gpio_on = -1; | ||
161 | goto err_free_pwm; | ||
162 | } | ||
163 | 151 | ||
152 | if (gpio_is_valid(pwmbl->gpio_on)) { | ||
164 | /* Turn display off by default. */ | 153 | /* Turn display off by default. */ |
165 | retval = gpio_direction_output(pwmbl->gpio_on, | 154 | if (pdata->on_active_low) |
166 | 0 ^ pdata->on_active_low); | 155 | flags = GPIOF_OUT_INIT_HIGH; |
156 | else | ||
157 | flags = GPIOF_OUT_INIT_LOW; | ||
158 | |||
159 | retval = devm_gpio_request_one(&pdev->dev, pwmbl->gpio_on, | ||
160 | flags, "gpio_atmel_pwm_bl"); | ||
167 | if (retval) | 161 | if (retval) |
168 | goto err_free_pwm; | 162 | goto err_free_pwm; |
169 | } | 163 | } |
@@ -171,8 +165,9 @@ static int atmel_pwm_bl_probe(struct platform_device *pdev) | |||
171 | memset(&props, 0, sizeof(struct backlight_properties)); | 165 | memset(&props, 0, sizeof(struct backlight_properties)); |
172 | props.type = BACKLIGHT_RAW; | 166 | props.type = BACKLIGHT_RAW; |
173 | props.max_brightness = pdata->pwm_duty_max - pdata->pwm_duty_min; | 167 | props.max_brightness = pdata->pwm_duty_max - pdata->pwm_duty_min; |
174 | bldev = backlight_device_register("atmel-pwm-bl", &pdev->dev, pwmbl, | 168 | bldev = devm_backlight_device_register(&pdev->dev, "atmel-pwm-bl", |
175 | &atmel_pwm_bl_ops, &props); | 169 | &pdev->dev, pwmbl, &atmel_pwm_bl_ops, |
170 | &props); | ||
176 | if (IS_ERR(bldev)) { | 171 | if (IS_ERR(bldev)) { |
177 | retval = PTR_ERR(bldev); | 172 | retval = PTR_ERR(bldev); |
178 | goto err_free_pwm; | 173 | goto err_free_pwm; |
@@ -188,17 +183,15 @@ static int atmel_pwm_bl_probe(struct platform_device *pdev) | |||
188 | 183 | ||
189 | retval = atmel_pwm_bl_init_pwm(pwmbl); | 184 | retval = atmel_pwm_bl_init_pwm(pwmbl); |
190 | if (retval) | 185 | if (retval) |
191 | goto err_free_bl_dev; | 186 | goto err_free_pwm; |
192 | 187 | ||
193 | atmel_pwm_bl_set_intensity(bldev); | 188 | atmel_pwm_bl_set_intensity(bldev); |
194 | 189 | ||
195 | return 0; | 190 | return 0; |
196 | 191 | ||
197 | err_free_bl_dev: | ||
198 | backlight_device_unregister(bldev); | ||
199 | err_free_pwm: | 192 | err_free_pwm: |
200 | pwm_channel_free(&pwmbl->pwmc); | 193 | pwm_channel_free(&pwmbl->pwmc); |
201 | err_free_mem: | 194 | |
202 | return retval; | 195 | return retval; |
203 | } | 196 | } |
204 | 197 | ||
@@ -206,11 +199,9 @@ static int atmel_pwm_bl_remove(struct platform_device *pdev) | |||
206 | { | 199 | { |
207 | struct atmel_pwm_bl *pwmbl = platform_get_drvdata(pdev); | 200 | struct atmel_pwm_bl *pwmbl = platform_get_drvdata(pdev); |
208 | 201 | ||
209 | if (pwmbl->gpio_on != -1) | 202 | atmel_pwm_bl_set_gpio_on(pwmbl, 0); |
210 | gpio_set_value(pwmbl->gpio_on, 0); | ||
211 | pwm_channel_disable(&pwmbl->pwmc); | 203 | pwm_channel_disable(&pwmbl->pwmc); |
212 | pwm_channel_free(&pwmbl->pwmc); | 204 | pwm_channel_free(&pwmbl->pwmc); |
213 | backlight_device_unregister(pwmbl->bldev); | ||
214 | 205 | ||
215 | return 0; | 206 | return 0; |
216 | } | 207 | } |
@@ -229,3 +220,4 @@ module_platform_driver(atmel_pwm_bl_driver); | |||
229 | MODULE_AUTHOR("Hans-Christian egtvedt <hans-christian.egtvedt@atmel.com>"); | 220 | MODULE_AUTHOR("Hans-Christian egtvedt <hans-christian.egtvedt@atmel.com>"); |
230 | MODULE_DESCRIPTION("Atmel PWM backlight driver"); | 221 | MODULE_DESCRIPTION("Atmel PWM backlight driver"); |
231 | MODULE_LICENSE("GPL"); | 222 | MODULE_LICENSE("GPL"); |
223 | MODULE_ALIAS("platform:atmel-pwm-bl"); | ||
diff --git a/drivers/video/backlight/bd6107.c b/drivers/video/backlight/bd6107.c index 15e3294b29fe..16dd9bc625bd 100644 --- a/drivers/video/backlight/bd6107.c +++ b/drivers/video/backlight/bd6107.c | |||
@@ -128,7 +128,7 @@ static const struct backlight_ops bd6107_backlight_ops = { | |||
128 | static int bd6107_probe(struct i2c_client *client, | 128 | static int bd6107_probe(struct i2c_client *client, |
129 | const struct i2c_device_id *id) | 129 | const struct i2c_device_id *id) |
130 | { | 130 | { |
131 | struct bd6107_platform_data *pdata = client->dev.platform_data; | 131 | struct bd6107_platform_data *pdata = dev_get_platdata(&client->dev); |
132 | struct backlight_device *backlight; | 132 | struct backlight_device *backlight; |
133 | struct backlight_properties props; | 133 | struct backlight_properties props; |
134 | struct bd6107 *bd; | 134 | struct bd6107 *bd; |
@@ -166,7 +166,8 @@ static int bd6107_probe(struct i2c_client *client, | |||
166 | props.brightness = clamp_t(unsigned int, pdata->def_value, 0, | 166 | props.brightness = clamp_t(unsigned int, pdata->def_value, 0, |
167 | props.max_brightness); | 167 | props.max_brightness); |
168 | 168 | ||
169 | backlight = backlight_device_register(dev_name(&client->dev), | 169 | backlight = devm_backlight_device_register(&client->dev, |
170 | dev_name(&client->dev), | ||
170 | &bd->client->dev, bd, | 171 | &bd->client->dev, bd, |
171 | &bd6107_backlight_ops, &props); | 172 | &bd6107_backlight_ops, &props); |
172 | if (IS_ERR(backlight)) { | 173 | if (IS_ERR(backlight)) { |
@@ -186,7 +187,6 @@ static int bd6107_remove(struct i2c_client *client) | |||
186 | 187 | ||
187 | backlight->props.brightness = 0; | 188 | backlight->props.brightness = 0; |
188 | backlight_update_status(backlight); | 189 | backlight_update_status(backlight); |
189 | backlight_device_unregister(backlight); | ||
190 | 190 | ||
191 | return 0; | 191 | return 0; |
192 | } | 192 | } |
diff --git a/drivers/video/backlight/corgi_lcd.c b/drivers/video/backlight/corgi_lcd.c index c97867a717a7..db8db5fa6583 100644 --- a/drivers/video/backlight/corgi_lcd.c +++ b/drivers/video/backlight/corgi_lcd.c | |||
@@ -533,7 +533,7 @@ static int setup_gpio_backlight(struct corgi_lcd *lcd, | |||
533 | static int corgi_lcd_probe(struct spi_device *spi) | 533 | static int corgi_lcd_probe(struct spi_device *spi) |
534 | { | 534 | { |
535 | struct backlight_properties props; | 535 | struct backlight_properties props; |
536 | struct corgi_lcd_platform_data *pdata = spi->dev.platform_data; | 536 | struct corgi_lcd_platform_data *pdata = dev_get_platdata(&spi->dev); |
537 | struct corgi_lcd *lcd; | 537 | struct corgi_lcd *lcd; |
538 | int ret = 0; | 538 | int ret = 0; |
539 | 539 | ||
@@ -550,8 +550,8 @@ static int corgi_lcd_probe(struct spi_device *spi) | |||
550 | 550 | ||
551 | lcd->spi_dev = spi; | 551 | lcd->spi_dev = spi; |
552 | 552 | ||
553 | lcd->lcd_dev = lcd_device_register("corgi_lcd", &spi->dev, | 553 | lcd->lcd_dev = devm_lcd_device_register(&spi->dev, "corgi_lcd", |
554 | lcd, &corgi_lcd_ops); | 554 | &spi->dev, lcd, &corgi_lcd_ops); |
555 | if (IS_ERR(lcd->lcd_dev)) | 555 | if (IS_ERR(lcd->lcd_dev)) |
556 | return PTR_ERR(lcd->lcd_dev); | 556 | return PTR_ERR(lcd->lcd_dev); |
557 | 557 | ||
@@ -561,18 +561,18 @@ static int corgi_lcd_probe(struct spi_device *spi) | |||
561 | memset(&props, 0, sizeof(struct backlight_properties)); | 561 | memset(&props, 0, sizeof(struct backlight_properties)); |
562 | props.type = BACKLIGHT_RAW; | 562 | props.type = BACKLIGHT_RAW; |
563 | props.max_brightness = pdata->max_intensity; | 563 | props.max_brightness = pdata->max_intensity; |
564 | lcd->bl_dev = backlight_device_register("corgi_bl", &spi->dev, lcd, | 564 | lcd->bl_dev = devm_backlight_device_register(&spi->dev, "corgi_bl", |
565 | &corgi_bl_ops, &props); | 565 | &spi->dev, lcd, &corgi_bl_ops, |
566 | if (IS_ERR(lcd->bl_dev)) { | 566 | &props); |
567 | ret = PTR_ERR(lcd->bl_dev); | 567 | if (IS_ERR(lcd->bl_dev)) |
568 | goto err_unregister_lcd; | 568 | return PTR_ERR(lcd->bl_dev); |
569 | } | 569 | |
570 | lcd->bl_dev->props.brightness = pdata->default_intensity; | 570 | lcd->bl_dev->props.brightness = pdata->default_intensity; |
571 | lcd->bl_dev->props.power = FB_BLANK_UNBLANK; | 571 | lcd->bl_dev->props.power = FB_BLANK_UNBLANK; |
572 | 572 | ||
573 | ret = setup_gpio_backlight(lcd, pdata); | 573 | ret = setup_gpio_backlight(lcd, pdata); |
574 | if (ret) | 574 | if (ret) |
575 | goto err_unregister_bl; | 575 | return ret; |
576 | 576 | ||
577 | lcd->kick_battery = pdata->kick_battery; | 577 | lcd->kick_battery = pdata->kick_battery; |
578 | 578 | ||
@@ -583,12 +583,6 @@ static int corgi_lcd_probe(struct spi_device *spi) | |||
583 | lcd->limit_mask = pdata->limit_mask; | 583 | lcd->limit_mask = pdata->limit_mask; |
584 | the_corgi_lcd = lcd; | 584 | the_corgi_lcd = lcd; |
585 | return 0; | 585 | return 0; |
586 | |||
587 | err_unregister_bl: | ||
588 | backlight_device_unregister(lcd->bl_dev); | ||
589 | err_unregister_lcd: | ||
590 | lcd_device_unregister(lcd->lcd_dev); | ||
591 | return ret; | ||
592 | } | 586 | } |
593 | 587 | ||
594 | static int corgi_lcd_remove(struct spi_device *spi) | 588 | static int corgi_lcd_remove(struct spi_device *spi) |
@@ -598,11 +592,7 @@ static int corgi_lcd_remove(struct spi_device *spi) | |||
598 | lcd->bl_dev->props.power = FB_BLANK_UNBLANK; | 592 | lcd->bl_dev->props.power = FB_BLANK_UNBLANK; |
599 | lcd->bl_dev->props.brightness = 0; | 593 | lcd->bl_dev->props.brightness = 0; |
600 | backlight_update_status(lcd->bl_dev); | 594 | backlight_update_status(lcd->bl_dev); |
601 | backlight_device_unregister(lcd->bl_dev); | ||
602 | |||
603 | corgi_lcd_set_power(lcd->lcd_dev, FB_BLANK_POWERDOWN); | 595 | corgi_lcd_set_power(lcd->lcd_dev, FB_BLANK_POWERDOWN); |
604 | lcd_device_unregister(lcd->lcd_dev); | ||
605 | |||
606 | return 0; | 596 | return 0; |
607 | } | 597 | } |
608 | 598 | ||
diff --git a/drivers/video/backlight/cr_bllcd.c b/drivers/video/backlight/cr_bllcd.c index 37bae801e23b..f3fed9ef745f 100644 --- a/drivers/video/backlight/cr_bllcd.c +++ b/drivers/video/backlight/cr_bllcd.c | |||
@@ -195,16 +195,17 @@ static int cr_backlight_probe(struct platform_device *pdev) | |||
195 | 195 | ||
196 | memset(&props, 0, sizeof(struct backlight_properties)); | 196 | memset(&props, 0, sizeof(struct backlight_properties)); |
197 | props.type = BACKLIGHT_RAW; | 197 | props.type = BACKLIGHT_RAW; |
198 | bdp = backlight_device_register("cr-backlight", &pdev->dev, NULL, | 198 | bdp = devm_backlight_device_register(&pdev->dev, "cr-backlight", |
199 | &cr_backlight_ops, &props); | 199 | &pdev->dev, NULL, &cr_backlight_ops, |
200 | &props); | ||
200 | if (IS_ERR(bdp)) { | 201 | if (IS_ERR(bdp)) { |
201 | pci_dev_put(lpc_dev); | 202 | pci_dev_put(lpc_dev); |
202 | return PTR_ERR(bdp); | 203 | return PTR_ERR(bdp); |
203 | } | 204 | } |
204 | 205 | ||
205 | ldp = lcd_device_register("cr-lcd", &pdev->dev, NULL, &cr_lcd_ops); | 206 | ldp = devm_lcd_device_register(&pdev->dev, "cr-lcd", &pdev->dev, NULL, |
207 | &cr_lcd_ops); | ||
206 | if (IS_ERR(ldp)) { | 208 | if (IS_ERR(ldp)) { |
207 | backlight_device_unregister(bdp); | ||
208 | pci_dev_put(lpc_dev); | 209 | pci_dev_put(lpc_dev); |
209 | return PTR_ERR(ldp); | 210 | return PTR_ERR(ldp); |
210 | } | 211 | } |
@@ -215,8 +216,6 @@ static int cr_backlight_probe(struct platform_device *pdev) | |||
215 | 216 | ||
216 | crp = devm_kzalloc(&pdev->dev, sizeof(*crp), GFP_KERNEL); | 217 | crp = devm_kzalloc(&pdev->dev, sizeof(*crp), GFP_KERNEL); |
217 | if (!crp) { | 218 | if (!crp) { |
218 | lcd_device_unregister(ldp); | ||
219 | backlight_device_unregister(bdp); | ||
220 | pci_dev_put(lpc_dev); | 219 | pci_dev_put(lpc_dev); |
221 | return -ENOMEM; | 220 | return -ENOMEM; |
222 | } | 221 | } |
@@ -241,8 +240,6 @@ static int cr_backlight_remove(struct platform_device *pdev) | |||
241 | crp->cr_backlight_device->props.max_brightness = 0; | 240 | crp->cr_backlight_device->props.max_brightness = 0; |
242 | cr_backlight_set_intensity(crp->cr_backlight_device); | 241 | cr_backlight_set_intensity(crp->cr_backlight_device); |
243 | cr_lcd_set_power(crp->cr_lcd_device, FB_BLANK_POWERDOWN); | 242 | cr_lcd_set_power(crp->cr_lcd_device, FB_BLANK_POWERDOWN); |
244 | backlight_device_unregister(crp->cr_backlight_device); | ||
245 | lcd_device_unregister(crp->cr_lcd_device); | ||
246 | pci_dev_put(lpc_dev); | 243 | pci_dev_put(lpc_dev); |
247 | 244 | ||
248 | return 0; | 245 | return 0; |
diff --git a/drivers/video/backlight/da903x_bl.c b/drivers/video/backlight/da903x_bl.c index 67cadd30e273..12c5d840c590 100644 --- a/drivers/video/backlight/da903x_bl.c +++ b/drivers/video/backlight/da903x_bl.c | |||
@@ -109,7 +109,7 @@ static const struct backlight_ops da903x_backlight_ops = { | |||
109 | 109 | ||
110 | static int da903x_backlight_probe(struct platform_device *pdev) | 110 | static int da903x_backlight_probe(struct platform_device *pdev) |
111 | { | 111 | { |
112 | struct da9034_backlight_pdata *pdata = pdev->dev.platform_data; | 112 | struct da9034_backlight_pdata *pdata = dev_get_platdata(&pdev->dev); |
113 | struct da903x_backlight_data *data; | 113 | struct da903x_backlight_data *data; |
114 | struct backlight_device *bl; | 114 | struct backlight_device *bl; |
115 | struct backlight_properties props; | 115 | struct backlight_properties props; |
@@ -144,8 +144,9 @@ static int da903x_backlight_probe(struct platform_device *pdev) | |||
144 | memset(&props, 0, sizeof(props)); | 144 | memset(&props, 0, sizeof(props)); |
145 | props.type = BACKLIGHT_RAW; | 145 | props.type = BACKLIGHT_RAW; |
146 | props.max_brightness = max_brightness; | 146 | props.max_brightness = max_brightness; |
147 | bl = backlight_device_register(pdev->name, data->da903x_dev, data, | 147 | bl = devm_backlight_device_register(&pdev->dev, pdev->name, |
148 | &da903x_backlight_ops, &props); | 148 | data->da903x_dev, data, |
149 | &da903x_backlight_ops, &props); | ||
149 | if (IS_ERR(bl)) { | 150 | if (IS_ERR(bl)) { |
150 | dev_err(&pdev->dev, "failed to register backlight\n"); | 151 | dev_err(&pdev->dev, "failed to register backlight\n"); |
151 | return PTR_ERR(bl); | 152 | return PTR_ERR(bl); |
@@ -158,21 +159,12 @@ static int da903x_backlight_probe(struct platform_device *pdev) | |||
158 | return 0; | 159 | return 0; |
159 | } | 160 | } |
160 | 161 | ||
161 | static int da903x_backlight_remove(struct platform_device *pdev) | ||
162 | { | ||
163 | struct backlight_device *bl = platform_get_drvdata(pdev); | ||
164 | |||
165 | backlight_device_unregister(bl); | ||
166 | return 0; | ||
167 | } | ||
168 | |||
169 | static struct platform_driver da903x_backlight_driver = { | 162 | static struct platform_driver da903x_backlight_driver = { |
170 | .driver = { | 163 | .driver = { |
171 | .name = "da903x-backlight", | 164 | .name = "da903x-backlight", |
172 | .owner = THIS_MODULE, | 165 | .owner = THIS_MODULE, |
173 | }, | 166 | }, |
174 | .probe = da903x_backlight_probe, | 167 | .probe = da903x_backlight_probe, |
175 | .remove = da903x_backlight_remove, | ||
176 | }; | 168 | }; |
177 | 169 | ||
178 | module_platform_driver(da903x_backlight_driver); | 170 | module_platform_driver(da903x_backlight_driver); |
diff --git a/drivers/video/backlight/da9052_bl.c b/drivers/video/backlight/da9052_bl.c index 842da5a3ac4f..20d55becaa74 100644 --- a/drivers/video/backlight/da9052_bl.c +++ b/drivers/video/backlight/da9052_bl.c | |||
@@ -125,8 +125,9 @@ static int da9052_backlight_probe(struct platform_device *pdev) | |||
125 | props.type = BACKLIGHT_RAW; | 125 | props.type = BACKLIGHT_RAW; |
126 | props.max_brightness = DA9052_MAX_BRIGHTNESS; | 126 | props.max_brightness = DA9052_MAX_BRIGHTNESS; |
127 | 127 | ||
128 | bl = backlight_device_register(pdev->name, wleds->da9052->dev, wleds, | 128 | bl = devm_backlight_device_register(&pdev->dev, pdev->name, |
129 | &da9052_backlight_ops, &props); | 129 | wleds->da9052->dev, wleds, |
130 | &da9052_backlight_ops, &props); | ||
130 | if (IS_ERR(bl)) { | 131 | if (IS_ERR(bl)) { |
131 | dev_err(&pdev->dev, "Failed to register backlight\n"); | 132 | dev_err(&pdev->dev, "Failed to register backlight\n"); |
132 | return PTR_ERR(bl); | 133 | return PTR_ERR(bl); |
@@ -147,7 +148,6 @@ static int da9052_backlight_remove(struct platform_device *pdev) | |||
147 | wleds->brightness = 0; | 148 | wleds->brightness = 0; |
148 | wleds->state = DA9052_WLEDS_OFF; | 149 | wleds->state = DA9052_WLEDS_OFF; |
149 | da9052_adjust_wled_brightness(wleds); | 150 | da9052_adjust_wled_brightness(wleds); |
150 | backlight_device_unregister(bl); | ||
151 | 151 | ||
152 | return 0; | 152 | return 0; |
153 | } | 153 | } |
diff --git a/drivers/video/backlight/ep93xx_bl.c b/drivers/video/backlight/ep93xx_bl.c index 018368ba4124..0d1f633c6480 100644 --- a/drivers/video/backlight/ep93xx_bl.c +++ b/drivers/video/backlight/ep93xx_bl.c | |||
@@ -92,8 +92,8 @@ static int ep93xxbl_probe(struct platform_device *dev) | |||
92 | memset(&props, 0, sizeof(struct backlight_properties)); | 92 | memset(&props, 0, sizeof(struct backlight_properties)); |
93 | props.type = BACKLIGHT_RAW; | 93 | props.type = BACKLIGHT_RAW; |
94 | props.max_brightness = EP93XX_MAX_BRIGHT; | 94 | props.max_brightness = EP93XX_MAX_BRIGHT; |
95 | bl = backlight_device_register(dev->name, &dev->dev, ep93xxbl, | 95 | bl = devm_backlight_device_register(&dev->dev, dev->name, &dev->dev, |
96 | &ep93xxbl_ops, &props); | 96 | ep93xxbl, &ep93xxbl_ops, &props); |
97 | if (IS_ERR(bl)) | 97 | if (IS_ERR(bl)) |
98 | return PTR_ERR(bl); | 98 | return PTR_ERR(bl); |
99 | 99 | ||
@@ -106,14 +106,6 @@ static int ep93xxbl_probe(struct platform_device *dev) | |||
106 | return 0; | 106 | return 0; |
107 | } | 107 | } |
108 | 108 | ||
109 | static int ep93xxbl_remove(struct platform_device *dev) | ||
110 | { | ||
111 | struct backlight_device *bl = platform_get_drvdata(dev); | ||
112 | |||
113 | backlight_device_unregister(bl); | ||
114 | return 0; | ||
115 | } | ||
116 | |||
117 | #ifdef CONFIG_PM_SLEEP | 109 | #ifdef CONFIG_PM_SLEEP |
118 | static int ep93xxbl_suspend(struct device *dev) | 110 | static int ep93xxbl_suspend(struct device *dev) |
119 | { | 111 | { |
@@ -140,7 +132,6 @@ static struct platform_driver ep93xxbl_driver = { | |||
140 | .pm = &ep93xxbl_pm_ops, | 132 | .pm = &ep93xxbl_pm_ops, |
141 | }, | 133 | }, |
142 | .probe = ep93xxbl_probe, | 134 | .probe = ep93xxbl_probe, |
143 | .remove = ep93xxbl_remove, | ||
144 | }; | 135 | }; |
145 | 136 | ||
146 | module_platform_driver(ep93xxbl_driver); | 137 | module_platform_driver(ep93xxbl_driver); |
diff --git a/drivers/video/backlight/generic_bl.c b/drivers/video/backlight/generic_bl.c index 19e393b41438..5d8d65200db7 100644 --- a/drivers/video/backlight/generic_bl.c +++ b/drivers/video/backlight/generic_bl.c | |||
@@ -79,7 +79,7 @@ static const struct backlight_ops genericbl_ops = { | |||
79 | static int genericbl_probe(struct platform_device *pdev) | 79 | static int genericbl_probe(struct platform_device *pdev) |
80 | { | 80 | { |
81 | struct backlight_properties props; | 81 | struct backlight_properties props; |
82 | struct generic_bl_info *machinfo = pdev->dev.platform_data; | 82 | struct generic_bl_info *machinfo = dev_get_platdata(&pdev->dev); |
83 | const char *name = "generic-bl"; | 83 | const char *name = "generic-bl"; |
84 | struct backlight_device *bd; | 84 | struct backlight_device *bd; |
85 | 85 | ||
@@ -93,8 +93,8 @@ static int genericbl_probe(struct platform_device *pdev) | |||
93 | memset(&props, 0, sizeof(struct backlight_properties)); | 93 | memset(&props, 0, sizeof(struct backlight_properties)); |
94 | props.type = BACKLIGHT_RAW; | 94 | props.type = BACKLIGHT_RAW; |
95 | props.max_brightness = machinfo->max_intensity; | 95 | props.max_brightness = machinfo->max_intensity; |
96 | bd = backlight_device_register(name, &pdev->dev, NULL, &genericbl_ops, | 96 | bd = devm_backlight_device_register(&pdev->dev, name, &pdev->dev, |
97 | &props); | 97 | NULL, &genericbl_ops, &props); |
98 | if (IS_ERR(bd)) | 98 | if (IS_ERR(bd)) |
99 | return PTR_ERR(bd); | 99 | return PTR_ERR(bd); |
100 | 100 | ||
@@ -118,8 +118,6 @@ static int genericbl_remove(struct platform_device *pdev) | |||
118 | bd->props.brightness = 0; | 118 | bd->props.brightness = 0; |
119 | backlight_update_status(bd); | 119 | backlight_update_status(bd); |
120 | 120 | ||
121 | backlight_device_unregister(bd); | ||
122 | |||
123 | dev_info(&pdev->dev, "Generic Backlight Driver Unloaded\n"); | 121 | dev_info(&pdev->dev, "Generic Backlight Driver Unloaded\n"); |
124 | return 0; | 122 | return 0; |
125 | } | 123 | } |
diff --git a/drivers/video/backlight/gpio_backlight.c b/drivers/video/backlight/gpio_backlight.c index 5fa217f9f445..81fb12770c2a 100644 --- a/drivers/video/backlight/gpio_backlight.c +++ b/drivers/video/backlight/gpio_backlight.c | |||
@@ -62,7 +62,8 @@ static const struct backlight_ops gpio_backlight_ops = { | |||
62 | 62 | ||
63 | static int gpio_backlight_probe(struct platform_device *pdev) | 63 | static int gpio_backlight_probe(struct platform_device *pdev) |
64 | { | 64 | { |
65 | struct gpio_backlight_platform_data *pdata = pdev->dev.platform_data; | 65 | struct gpio_backlight_platform_data *pdata = |
66 | dev_get_platdata(&pdev->dev); | ||
66 | struct backlight_properties props; | 67 | struct backlight_properties props; |
67 | struct backlight_device *bl; | 68 | struct backlight_device *bl; |
68 | struct gpio_backlight *gbl; | 69 | struct gpio_backlight *gbl; |
@@ -94,8 +95,9 @@ static int gpio_backlight_probe(struct platform_device *pdev) | |||
94 | memset(&props, 0, sizeof(props)); | 95 | memset(&props, 0, sizeof(props)); |
95 | props.type = BACKLIGHT_RAW; | 96 | props.type = BACKLIGHT_RAW; |
96 | props.max_brightness = 1; | 97 | props.max_brightness = 1; |
97 | bl = backlight_device_register(dev_name(&pdev->dev), &pdev->dev, gbl, | 98 | bl = devm_backlight_device_register(&pdev->dev, dev_name(&pdev->dev), |
98 | &gpio_backlight_ops, &props); | 99 | &pdev->dev, gbl, &gpio_backlight_ops, |
100 | &props); | ||
99 | if (IS_ERR(bl)) { | 101 | if (IS_ERR(bl)) { |
100 | dev_err(&pdev->dev, "failed to register backlight\n"); | 102 | dev_err(&pdev->dev, "failed to register backlight\n"); |
101 | return PTR_ERR(bl); | 103 | return PTR_ERR(bl); |
@@ -108,21 +110,12 @@ static int gpio_backlight_probe(struct platform_device *pdev) | |||
108 | return 0; | 110 | return 0; |
109 | } | 111 | } |
110 | 112 | ||
111 | static int gpio_backlight_remove(struct platform_device *pdev) | ||
112 | { | ||
113 | struct backlight_device *bl = platform_get_drvdata(pdev); | ||
114 | |||
115 | backlight_device_unregister(bl); | ||
116 | return 0; | ||
117 | } | ||
118 | |||
119 | static struct platform_driver gpio_backlight_driver = { | 113 | static struct platform_driver gpio_backlight_driver = { |
120 | .driver = { | 114 | .driver = { |
121 | .name = "gpio-backlight", | 115 | .name = "gpio-backlight", |
122 | .owner = THIS_MODULE, | 116 | .owner = THIS_MODULE, |
123 | }, | 117 | }, |
124 | .probe = gpio_backlight_probe, | 118 | .probe = gpio_backlight_probe, |
125 | .remove = gpio_backlight_remove, | ||
126 | }; | 119 | }; |
127 | 120 | ||
128 | module_platform_driver(gpio_backlight_driver); | 121 | module_platform_driver(gpio_backlight_driver); |
diff --git a/drivers/video/backlight/hx8357.c b/drivers/video/backlight/hx8357.c index c7af8c45ab8a..985e854e244b 100644 --- a/drivers/video/backlight/hx8357.c +++ b/drivers/video/backlight/hx8357.c | |||
@@ -648,7 +648,8 @@ static int hx8357_probe(struct spi_device *spi) | |||
648 | lcd->use_im_pins = 0; | 648 | lcd->use_im_pins = 0; |
649 | } | 649 | } |
650 | 650 | ||
651 | lcdev = lcd_device_register("mxsfb", &spi->dev, lcd, &hx8357_ops); | 651 | lcdev = devm_lcd_device_register(&spi->dev, "mxsfb", &spi->dev, lcd, |
652 | &hx8357_ops); | ||
652 | if (IS_ERR(lcdev)) { | 653 | if (IS_ERR(lcdev)) { |
653 | ret = PTR_ERR(lcdev); | 654 | ret = PTR_ERR(lcdev); |
654 | return ret; | 655 | return ret; |
@@ -660,32 +661,19 @@ static int hx8357_probe(struct spi_device *spi) | |||
660 | ret = ((int (*)(struct lcd_device *))match->data)(lcdev); | 661 | ret = ((int (*)(struct lcd_device *))match->data)(lcdev); |
661 | if (ret) { | 662 | if (ret) { |
662 | dev_err(&spi->dev, "Couldn't initialize panel\n"); | 663 | dev_err(&spi->dev, "Couldn't initialize panel\n"); |
663 | goto init_error; | 664 | return ret; |
664 | } | 665 | } |
665 | 666 | ||
666 | dev_info(&spi->dev, "Panel probed\n"); | 667 | dev_info(&spi->dev, "Panel probed\n"); |
667 | 668 | ||
668 | return 0; | 669 | return 0; |
669 | |||
670 | init_error: | ||
671 | lcd_device_unregister(lcdev); | ||
672 | return ret; | ||
673 | } | ||
674 | |||
675 | static int hx8357_remove(struct spi_device *spi) | ||
676 | { | ||
677 | struct lcd_device *lcdev = spi_get_drvdata(spi); | ||
678 | |||
679 | lcd_device_unregister(lcdev); | ||
680 | return 0; | ||
681 | } | 670 | } |
682 | 671 | ||
683 | static struct spi_driver hx8357_driver = { | 672 | static struct spi_driver hx8357_driver = { |
684 | .probe = hx8357_probe, | 673 | .probe = hx8357_probe, |
685 | .remove = hx8357_remove, | ||
686 | .driver = { | 674 | .driver = { |
687 | .name = "hx8357", | 675 | .name = "hx8357", |
688 | .of_match_table = of_match_ptr(hx8357_dt_ids), | 676 | .of_match_table = hx8357_dt_ids, |
689 | }, | 677 | }, |
690 | }; | 678 | }; |
691 | 679 | ||
diff --git a/drivers/video/backlight/ili922x.c b/drivers/video/backlight/ili922x.c index d9f65c2d9b01..73464e4b4c74 100644 --- a/drivers/video/backlight/ili922x.c +++ b/drivers/video/backlight/ili922x.c | |||
@@ -513,8 +513,8 @@ static int ili922x_probe(struct spi_device *spi) | |||
513 | 513 | ||
514 | ili->power = FB_BLANK_POWERDOWN; | 514 | ili->power = FB_BLANK_POWERDOWN; |
515 | 515 | ||
516 | lcd = lcd_device_register("ili922xlcd", &spi->dev, ili, | 516 | lcd = devm_lcd_device_register(&spi->dev, "ili922xlcd", &spi->dev, ili, |
517 | &ili922x_ops); | 517 | &ili922x_ops); |
518 | if (IS_ERR(lcd)) { | 518 | if (IS_ERR(lcd)) { |
519 | dev_err(&spi->dev, "cannot register LCD\n"); | 519 | dev_err(&spi->dev, "cannot register LCD\n"); |
520 | return PTR_ERR(lcd); | 520 | return PTR_ERR(lcd); |
@@ -530,10 +530,7 @@ static int ili922x_probe(struct spi_device *spi) | |||
530 | 530 | ||
531 | static int ili922x_remove(struct spi_device *spi) | 531 | static int ili922x_remove(struct spi_device *spi) |
532 | { | 532 | { |
533 | struct ili922x *ili = spi_get_drvdata(spi); | ||
534 | |||
535 | ili922x_poweroff(spi); | 533 | ili922x_poweroff(spi); |
536 | lcd_device_unregister(ili->ld); | ||
537 | return 0; | 534 | return 0; |
538 | } | 535 | } |
539 | 536 | ||
diff --git a/drivers/video/backlight/ili9320.c b/drivers/video/backlight/ili9320.c index f8be90c5dedc..e2b8b40a9bd9 100644 --- a/drivers/video/backlight/ili9320.c +++ b/drivers/video/backlight/ili9320.c | |||
@@ -198,7 +198,7 @@ static void ili9320_setup_spi(struct ili9320 *ili, | |||
198 | int ili9320_probe_spi(struct spi_device *spi, | 198 | int ili9320_probe_spi(struct spi_device *spi, |
199 | struct ili9320_client *client) | 199 | struct ili9320_client *client) |
200 | { | 200 | { |
201 | struct ili9320_platdata *cfg = spi->dev.platform_data; | 201 | struct ili9320_platdata *cfg = dev_get_platdata(&spi->dev); |
202 | struct device *dev = &spi->dev; | 202 | struct device *dev = &spi->dev; |
203 | struct ili9320 *ili; | 203 | struct ili9320 *ili; |
204 | struct lcd_device *lcd; | 204 | struct lcd_device *lcd; |
@@ -235,7 +235,8 @@ int ili9320_probe_spi(struct spi_device *spi, | |||
235 | 235 | ||
236 | ili9320_setup_spi(ili, spi); | 236 | ili9320_setup_spi(ili, spi); |
237 | 237 | ||
238 | lcd = lcd_device_register("ili9320", dev, ili, &ili9320_ops); | 238 | lcd = devm_lcd_device_register(&spi->dev, "ili9320", dev, ili, |
239 | &ili9320_ops); | ||
239 | if (IS_ERR(lcd)) { | 240 | if (IS_ERR(lcd)) { |
240 | dev_err(dev, "failed to register lcd device\n"); | 241 | dev_err(dev, "failed to register lcd device\n"); |
241 | return PTR_ERR(lcd); | 242 | return PTR_ERR(lcd); |
@@ -248,24 +249,16 @@ int ili9320_probe_spi(struct spi_device *spi, | |||
248 | ret = ili9320_power(ili, FB_BLANK_UNBLANK); | 249 | ret = ili9320_power(ili, FB_BLANK_UNBLANK); |
249 | if (ret != 0) { | 250 | if (ret != 0) { |
250 | dev_err(dev, "failed to set lcd power state\n"); | 251 | dev_err(dev, "failed to set lcd power state\n"); |
251 | goto err_unregister; | 252 | return ret; |
252 | } | 253 | } |
253 | 254 | ||
254 | return 0; | 255 | return 0; |
255 | |||
256 | err_unregister: | ||
257 | lcd_device_unregister(lcd); | ||
258 | |||
259 | return ret; | ||
260 | } | 256 | } |
261 | EXPORT_SYMBOL_GPL(ili9320_probe_spi); | 257 | EXPORT_SYMBOL_GPL(ili9320_probe_spi); |
262 | 258 | ||
263 | int ili9320_remove(struct ili9320 *ili) | 259 | int ili9320_remove(struct ili9320 *ili) |
264 | { | 260 | { |
265 | ili9320_power(ili, FB_BLANK_POWERDOWN); | 261 | ili9320_power(ili, FB_BLANK_POWERDOWN); |
266 | |||
267 | lcd_device_unregister(ili->lcd); | ||
268 | |||
269 | return 0; | 262 | return 0; |
270 | } | 263 | } |
271 | EXPORT_SYMBOL_GPL(ili9320_remove); | 264 | EXPORT_SYMBOL_GPL(ili9320_remove); |
diff --git a/drivers/video/backlight/kb3886_bl.c b/drivers/video/backlight/kb3886_bl.c index bca6ccc74dfb..7592cc25c963 100644 --- a/drivers/video/backlight/kb3886_bl.c +++ b/drivers/video/backlight/kb3886_bl.c | |||
@@ -141,7 +141,7 @@ static const struct backlight_ops kb3886bl_ops = { | |||
141 | static int kb3886bl_probe(struct platform_device *pdev) | 141 | static int kb3886bl_probe(struct platform_device *pdev) |
142 | { | 142 | { |
143 | struct backlight_properties props; | 143 | struct backlight_properties props; |
144 | struct kb3886bl_machinfo *machinfo = pdev->dev.platform_data; | 144 | struct kb3886bl_machinfo *machinfo = dev_get_platdata(&pdev->dev); |
145 | 145 | ||
146 | bl_machinfo = machinfo; | 146 | bl_machinfo = machinfo; |
147 | if (!machinfo->limit_mask) | 147 | if (!machinfo->limit_mask) |
@@ -150,10 +150,10 @@ static int kb3886bl_probe(struct platform_device *pdev) | |||
150 | memset(&props, 0, sizeof(struct backlight_properties)); | 150 | memset(&props, 0, sizeof(struct backlight_properties)); |
151 | props.type = BACKLIGHT_RAW; | 151 | props.type = BACKLIGHT_RAW; |
152 | props.max_brightness = machinfo->max_intensity; | 152 | props.max_brightness = machinfo->max_intensity; |
153 | kb3886_backlight_device = backlight_device_register("kb3886-bl", | 153 | kb3886_backlight_device = devm_backlight_device_register(&pdev->dev, |
154 | &pdev->dev, NULL, | 154 | "kb3886-bl", &pdev->dev, |
155 | &kb3886bl_ops, | 155 | NULL, &kb3886bl_ops, |
156 | &props); | 156 | &props); |
157 | if (IS_ERR(kb3886_backlight_device)) | 157 | if (IS_ERR(kb3886_backlight_device)) |
158 | return PTR_ERR(kb3886_backlight_device); | 158 | return PTR_ERR(kb3886_backlight_device); |
159 | 159 | ||
@@ -166,18 +166,8 @@ static int kb3886bl_probe(struct platform_device *pdev) | |||
166 | return 0; | 166 | return 0; |
167 | } | 167 | } |
168 | 168 | ||
169 | static int kb3886bl_remove(struct platform_device *pdev) | ||
170 | { | ||
171 | struct backlight_device *bd = platform_get_drvdata(pdev); | ||
172 | |||
173 | backlight_device_unregister(bd); | ||
174 | |||
175 | return 0; | ||
176 | } | ||
177 | |||
178 | static struct platform_driver kb3886bl_driver = { | 169 | static struct platform_driver kb3886bl_driver = { |
179 | .probe = kb3886bl_probe, | 170 | .probe = kb3886bl_probe, |
180 | .remove = kb3886bl_remove, | ||
181 | .driver = { | 171 | .driver = { |
182 | .name = "kb3886-bl", | 172 | .name = "kb3886-bl", |
183 | .pm = &kb3886bl_pm_ops, | 173 | .pm = &kb3886bl_pm_ops, |
diff --git a/drivers/video/backlight/l4f00242t03.c b/drivers/video/backlight/l4f00242t03.c index a35a38c709cf..923eae2f85f8 100644 --- a/drivers/video/backlight/l4f00242t03.c +++ b/drivers/video/backlight/l4f00242t03.c | |||
@@ -48,7 +48,7 @@ static void l4f00242t03_reset(unsigned int gpio) | |||
48 | 48 | ||
49 | static void l4f00242t03_lcd_init(struct spi_device *spi) | 49 | static void l4f00242t03_lcd_init(struct spi_device *spi) |
50 | { | 50 | { |
51 | struct l4f00242t03_pdata *pdata = spi->dev.platform_data; | 51 | struct l4f00242t03_pdata *pdata = dev_get_platdata(&spi->dev); |
52 | struct l4f00242t03_priv *priv = spi_get_drvdata(spi); | 52 | struct l4f00242t03_priv *priv = spi_get_drvdata(spi); |
53 | const u16 cmd[] = { 0x36, param(0), 0x3A, param(0x60) }; | 53 | const u16 cmd[] = { 0x36, param(0), 0x3A, param(0x60) }; |
54 | int ret; | 54 | int ret; |
@@ -88,7 +88,7 @@ static void l4f00242t03_lcd_init(struct spi_device *spi) | |||
88 | 88 | ||
89 | static void l4f00242t03_lcd_powerdown(struct spi_device *spi) | 89 | static void l4f00242t03_lcd_powerdown(struct spi_device *spi) |
90 | { | 90 | { |
91 | struct l4f00242t03_pdata *pdata = spi->dev.platform_data; | 91 | struct l4f00242t03_pdata *pdata = dev_get_platdata(&spi->dev); |
92 | struct l4f00242t03_priv *priv = spi_get_drvdata(spi); | 92 | struct l4f00242t03_priv *priv = spi_get_drvdata(spi); |
93 | 93 | ||
94 | dev_dbg(&spi->dev, "Powering down LCD\n"); | 94 | dev_dbg(&spi->dev, "Powering down LCD\n"); |
@@ -171,7 +171,7 @@ static struct lcd_ops l4f_ops = { | |||
171 | static int l4f00242t03_probe(struct spi_device *spi) | 171 | static int l4f00242t03_probe(struct spi_device *spi) |
172 | { | 172 | { |
173 | struct l4f00242t03_priv *priv; | 173 | struct l4f00242t03_priv *priv; |
174 | struct l4f00242t03_pdata *pdata = spi->dev.platform_data; | 174 | struct l4f00242t03_pdata *pdata = dev_get_platdata(&spi->dev); |
175 | int ret; | 175 | int ret; |
176 | 176 | ||
177 | if (pdata == NULL) { | 177 | if (pdata == NULL) { |
diff --git a/drivers/video/backlight/ld9040.c b/drivers/video/backlight/ld9040.c index 1e0a3093ce50..506a6c236039 100644 --- a/drivers/video/backlight/ld9040.c +++ b/drivers/video/backlight/ld9040.c | |||
@@ -702,7 +702,7 @@ static int ld9040_probe(struct spi_device *spi) | |||
702 | lcd->spi = spi; | 702 | lcd->spi = spi; |
703 | lcd->dev = &spi->dev; | 703 | lcd->dev = &spi->dev; |
704 | 704 | ||
705 | lcd->lcd_pd = spi->dev.platform_data; | 705 | lcd->lcd_pd = dev_get_platdata(&spi->dev); |
706 | if (!lcd->lcd_pd) { | 706 | if (!lcd->lcd_pd) { |
707 | dev_err(&spi->dev, "platform data is NULL.\n"); | 707 | dev_err(&spi->dev, "platform data is NULL.\n"); |
708 | return -EINVAL; | 708 | return -EINVAL; |
@@ -716,7 +716,8 @@ static int ld9040_probe(struct spi_device *spi) | |||
716 | return ret; | 716 | return ret; |
717 | } | 717 | } |
718 | 718 | ||
719 | ld = lcd_device_register("ld9040", &spi->dev, lcd, &ld9040_lcd_ops); | 719 | ld = devm_lcd_device_register(&spi->dev, "ld9040", &spi->dev, lcd, |
720 | &ld9040_lcd_ops); | ||
720 | if (IS_ERR(ld)) | 721 | if (IS_ERR(ld)) |
721 | return PTR_ERR(ld); | 722 | return PTR_ERR(ld); |
722 | 723 | ||
@@ -726,12 +727,10 @@ static int ld9040_probe(struct spi_device *spi) | |||
726 | props.type = BACKLIGHT_RAW; | 727 | props.type = BACKLIGHT_RAW; |
727 | props.max_brightness = MAX_BRIGHTNESS; | 728 | props.max_brightness = MAX_BRIGHTNESS; |
728 | 729 | ||
729 | bd = backlight_device_register("ld9040-bl", &spi->dev, | 730 | bd = devm_backlight_device_register(&spi->dev, "ld9040-bl", &spi->dev, |
730 | lcd, &ld9040_backlight_ops, &props); | 731 | lcd, &ld9040_backlight_ops, &props); |
731 | if (IS_ERR(bd)) { | 732 | if (IS_ERR(bd)) |
732 | ret = PTR_ERR(bd); | 733 | return PTR_ERR(bd); |
733 | goto out_unregister_lcd; | ||
734 | } | ||
735 | 734 | ||
736 | bd->props.brightness = MAX_BRIGHTNESS; | 735 | bd->props.brightness = MAX_BRIGHTNESS; |
737 | lcd->bd = bd; | 736 | lcd->bd = bd; |
@@ -757,11 +756,6 @@ static int ld9040_probe(struct spi_device *spi) | |||
757 | 756 | ||
758 | dev_info(&spi->dev, "ld9040 panel driver has been probed.\n"); | 757 | dev_info(&spi->dev, "ld9040 panel driver has been probed.\n"); |
759 | return 0; | 758 | return 0; |
760 | |||
761 | out_unregister_lcd: | ||
762 | lcd_device_unregister(lcd->ld); | ||
763 | |||
764 | return ret; | ||
765 | } | 759 | } |
766 | 760 | ||
767 | static int ld9040_remove(struct spi_device *spi) | 761 | static int ld9040_remove(struct spi_device *spi) |
@@ -769,9 +763,6 @@ static int ld9040_remove(struct spi_device *spi) | |||
769 | struct ld9040 *lcd = spi_get_drvdata(spi); | 763 | struct ld9040 *lcd = spi_get_drvdata(spi); |
770 | 764 | ||
771 | ld9040_power(lcd, FB_BLANK_POWERDOWN); | 765 | ld9040_power(lcd, FB_BLANK_POWERDOWN); |
772 | backlight_device_unregister(lcd->bd); | ||
773 | lcd_device_unregister(lcd->ld); | ||
774 | |||
775 | return 0; | 766 | return 0; |
776 | } | 767 | } |
777 | 768 | ||
diff --git a/drivers/video/backlight/ld9040_gamma.h b/drivers/video/backlight/ld9040_gamma.h index 038d9c86ec03..c5e586d97385 100644 --- a/drivers/video/backlight/ld9040_gamma.h +++ b/drivers/video/backlight/ld9040_gamma.h | |||
@@ -169,7 +169,9 @@ static const unsigned int ld9040_22_50[] = { | |||
169 | 169 | ||
170 | struct ld9040_gamma { | 170 | struct ld9040_gamma { |
171 | unsigned int *gamma_22_table[MAX_GAMMA_LEVEL]; | 171 | unsigned int *gamma_22_table[MAX_GAMMA_LEVEL]; |
172 | } gamma_table = { | 172 | }; |
173 | |||
174 | static struct ld9040_gamma gamma_table = { | ||
173 | .gamma_22_table[0] = (unsigned int *)&ld9040_22_50, | 175 | .gamma_22_table[0] = (unsigned int *)&ld9040_22_50, |
174 | .gamma_22_table[1] = (unsigned int *)&ld9040_22_70, | 176 | .gamma_22_table[1] = (unsigned int *)&ld9040_22_70, |
175 | .gamma_22_table[2] = (unsigned int *)&ld9040_22_80, | 177 | .gamma_22_table[2] = (unsigned int *)&ld9040_22_80, |
diff --git a/drivers/video/backlight/lm3533_bl.c b/drivers/video/backlight/lm3533_bl.c index 1d1dbfb789e3..187d1c283c1d 100644 --- a/drivers/video/backlight/lm3533_bl.c +++ b/drivers/video/backlight/lm3533_bl.c | |||
@@ -284,7 +284,7 @@ static int lm3533_bl_probe(struct platform_device *pdev) | |||
284 | if (!lm3533) | 284 | if (!lm3533) |
285 | return -EINVAL; | 285 | return -EINVAL; |
286 | 286 | ||
287 | pdata = pdev->dev.platform_data; | 287 | pdata = dev_get_platdata(&pdev->dev); |
288 | if (!pdata) { | 288 | if (!pdata) { |
289 | dev_err(&pdev->dev, "no platform data\n"); | 289 | dev_err(&pdev->dev, "no platform data\n"); |
290 | return -EINVAL; | 290 | return -EINVAL; |
@@ -313,8 +313,9 @@ static int lm3533_bl_probe(struct platform_device *pdev) | |||
313 | props.type = BACKLIGHT_RAW; | 313 | props.type = BACKLIGHT_RAW; |
314 | props.max_brightness = LM3533_BL_MAX_BRIGHTNESS; | 314 | props.max_brightness = LM3533_BL_MAX_BRIGHTNESS; |
315 | props.brightness = pdata->default_brightness; | 315 | props.brightness = pdata->default_brightness; |
316 | bd = backlight_device_register(pdata->name, pdev->dev.parent, bl, | 316 | bd = devm_backlight_device_register(&pdev->dev, pdata->name, |
317 | &lm3533_bl_ops, &props); | 317 | pdev->dev.parent, bl, &lm3533_bl_ops, |
318 | &props); | ||
318 | if (IS_ERR(bd)) { | 319 | if (IS_ERR(bd)) { |
319 | dev_err(&pdev->dev, "failed to register backlight device\n"); | 320 | dev_err(&pdev->dev, "failed to register backlight device\n"); |
320 | return PTR_ERR(bd); | 321 | return PTR_ERR(bd); |
@@ -328,7 +329,7 @@ static int lm3533_bl_probe(struct platform_device *pdev) | |||
328 | ret = sysfs_create_group(&bd->dev.kobj, &lm3533_bl_attribute_group); | 329 | ret = sysfs_create_group(&bd->dev.kobj, &lm3533_bl_attribute_group); |
329 | if (ret < 0) { | 330 | if (ret < 0) { |
330 | dev_err(&pdev->dev, "failed to create sysfs attributes\n"); | 331 | dev_err(&pdev->dev, "failed to create sysfs attributes\n"); |
331 | goto err_unregister; | 332 | return ret; |
332 | } | 333 | } |
333 | 334 | ||
334 | backlight_update_status(bd); | 335 | backlight_update_status(bd); |
@@ -345,8 +346,6 @@ static int lm3533_bl_probe(struct platform_device *pdev) | |||
345 | 346 | ||
346 | err_sysfs_remove: | 347 | err_sysfs_remove: |
347 | sysfs_remove_group(&bd->dev.kobj, &lm3533_bl_attribute_group); | 348 | sysfs_remove_group(&bd->dev.kobj, &lm3533_bl_attribute_group); |
348 | err_unregister: | ||
349 | backlight_device_unregister(bd); | ||
350 | 349 | ||
351 | return ret; | 350 | return ret; |
352 | } | 351 | } |
@@ -363,7 +362,6 @@ static int lm3533_bl_remove(struct platform_device *pdev) | |||
363 | 362 | ||
364 | lm3533_ctrlbank_disable(&bl->cb); | 363 | lm3533_ctrlbank_disable(&bl->cb); |
365 | sysfs_remove_group(&bd->dev.kobj, &lm3533_bl_attribute_group); | 364 | sysfs_remove_group(&bd->dev.kobj, &lm3533_bl_attribute_group); |
366 | backlight_device_unregister(bd); | ||
367 | 365 | ||
368 | return 0; | 366 | return 0; |
369 | } | 367 | } |
diff --git a/drivers/video/backlight/lm3630_bl.c b/drivers/video/backlight/lm3630_bl.c deleted file mode 100644 index 76a62e978fc3..000000000000 --- a/drivers/video/backlight/lm3630_bl.c +++ /dev/null | |||
@@ -1,475 +0,0 @@ | |||
1 | /* | ||
2 | * Simple driver for Texas Instruments LM3630 Backlight driver chip | ||
3 | * Copyright (C) 2012 Texas Instruments | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU General Public License version 2 as | ||
7 | * published by the Free Software Foundation. | ||
8 | * | ||
9 | */ | ||
10 | #include <linux/module.h> | ||
11 | #include <linux/slab.h> | ||
12 | #include <linux/i2c.h> | ||
13 | #include <linux/backlight.h> | ||
14 | #include <linux/err.h> | ||
15 | #include <linux/delay.h> | ||
16 | #include <linux/uaccess.h> | ||
17 | #include <linux/interrupt.h> | ||
18 | #include <linux/regmap.h> | ||
19 | #include <linux/platform_data/lm3630_bl.h> | ||
20 | |||
21 | #define REG_CTRL 0x00 | ||
22 | #define REG_CONFIG 0x01 | ||
23 | #define REG_BRT_A 0x03 | ||
24 | #define REG_BRT_B 0x04 | ||
25 | #define REG_INT_STATUS 0x09 | ||
26 | #define REG_INT_EN 0x0A | ||
27 | #define REG_FAULT 0x0B | ||
28 | #define REG_PWM_OUTLOW 0x12 | ||
29 | #define REG_PWM_OUTHIGH 0x13 | ||
30 | #define REG_MAX 0x1F | ||
31 | |||
32 | #define INT_DEBOUNCE_MSEC 10 | ||
33 | |||
34 | enum lm3630_leds { | ||
35 | BLED_ALL = 0, | ||
36 | BLED_1, | ||
37 | BLED_2 | ||
38 | }; | ||
39 | |||
40 | static const char * const bled_name[] = { | ||
41 | [BLED_ALL] = "lm3630_bled", /*Bank1 controls all string */ | ||
42 | [BLED_1] = "lm3630_bled1", /*Bank1 controls bled1 */ | ||
43 | [BLED_2] = "lm3630_bled2", /*Bank1 or 2 controls bled2 */ | ||
44 | }; | ||
45 | |||
46 | struct lm3630_chip_data { | ||
47 | struct device *dev; | ||
48 | struct delayed_work work; | ||
49 | int irq; | ||
50 | struct workqueue_struct *irqthread; | ||
51 | struct lm3630_platform_data *pdata; | ||
52 | struct backlight_device *bled1; | ||
53 | struct backlight_device *bled2; | ||
54 | struct regmap *regmap; | ||
55 | }; | ||
56 | |||
57 | /* initialize chip */ | ||
58 | static int lm3630_chip_init(struct lm3630_chip_data *pchip) | ||
59 | { | ||
60 | int ret; | ||
61 | unsigned int reg_val; | ||
62 | struct lm3630_platform_data *pdata = pchip->pdata; | ||
63 | |||
64 | /*pwm control */ | ||
65 | reg_val = ((pdata->pwm_active & 0x01) << 2) | (pdata->pwm_ctrl & 0x03); | ||
66 | ret = regmap_update_bits(pchip->regmap, REG_CONFIG, 0x07, reg_val); | ||
67 | if (ret < 0) | ||
68 | goto out; | ||
69 | |||
70 | /* bank control */ | ||
71 | reg_val = ((pdata->bank_b_ctrl & 0x01) << 1) | | ||
72 | (pdata->bank_a_ctrl & 0x07); | ||
73 | ret = regmap_update_bits(pchip->regmap, REG_CTRL, 0x07, reg_val); | ||
74 | if (ret < 0) | ||
75 | goto out; | ||
76 | |||
77 | ret = regmap_update_bits(pchip->regmap, REG_CTRL, 0x80, 0x00); | ||
78 | if (ret < 0) | ||
79 | goto out; | ||
80 | |||
81 | /* set initial brightness */ | ||
82 | if (pdata->bank_a_ctrl != BANK_A_CTRL_DISABLE) { | ||
83 | ret = regmap_write(pchip->regmap, | ||
84 | REG_BRT_A, pdata->init_brt_led1); | ||
85 | if (ret < 0) | ||
86 | goto out; | ||
87 | } | ||
88 | |||
89 | if (pdata->bank_b_ctrl != BANK_B_CTRL_DISABLE) { | ||
90 | ret = regmap_write(pchip->regmap, | ||
91 | REG_BRT_B, pdata->init_brt_led2); | ||
92 | if (ret < 0) | ||
93 | goto out; | ||
94 | } | ||
95 | return ret; | ||
96 | |||
97 | out: | ||
98 | dev_err(pchip->dev, "i2c failed to access register\n"); | ||
99 | return ret; | ||
100 | } | ||
101 | |||
102 | /* interrupt handling */ | ||
103 | static void lm3630_delayed_func(struct work_struct *work) | ||
104 | { | ||
105 | int ret; | ||
106 | unsigned int reg_val; | ||
107 | struct lm3630_chip_data *pchip; | ||
108 | |||
109 | pchip = container_of(work, struct lm3630_chip_data, work.work); | ||
110 | |||
111 | ret = regmap_read(pchip->regmap, REG_INT_STATUS, ®_val); | ||
112 | if (ret < 0) { | ||
113 | dev_err(pchip->dev, | ||
114 | "i2c failed to access REG_INT_STATUS Register\n"); | ||
115 | return; | ||
116 | } | ||
117 | |||
118 | dev_info(pchip->dev, "REG_INT_STATUS Register is 0x%x\n", reg_val); | ||
119 | } | ||
120 | |||
121 | static irqreturn_t lm3630_isr_func(int irq, void *chip) | ||
122 | { | ||
123 | int ret; | ||
124 | struct lm3630_chip_data *pchip = chip; | ||
125 | unsigned long delay = msecs_to_jiffies(INT_DEBOUNCE_MSEC); | ||
126 | |||
127 | queue_delayed_work(pchip->irqthread, &pchip->work, delay); | ||
128 | |||
129 | ret = regmap_update_bits(pchip->regmap, REG_CTRL, 0x80, 0x00); | ||
130 | if (ret < 0) | ||
131 | goto out; | ||
132 | |||
133 | return IRQ_HANDLED; | ||
134 | out: | ||
135 | dev_err(pchip->dev, "i2c failed to access register\n"); | ||
136 | return IRQ_HANDLED; | ||
137 | } | ||
138 | |||
139 | static int lm3630_intr_config(struct lm3630_chip_data *pchip) | ||
140 | { | ||
141 | INIT_DELAYED_WORK(&pchip->work, lm3630_delayed_func); | ||
142 | pchip->irqthread = create_singlethread_workqueue("lm3630-irqthd"); | ||
143 | if (!pchip->irqthread) { | ||
144 | dev_err(pchip->dev, "create irq thread fail...\n"); | ||
145 | return -1; | ||
146 | } | ||
147 | if (request_threaded_irq | ||
148 | (pchip->irq, NULL, lm3630_isr_func, | ||
149 | IRQF_TRIGGER_FALLING | IRQF_ONESHOT, "lm3630_irq", pchip)) { | ||
150 | dev_err(pchip->dev, "request threaded irq fail..\n"); | ||
151 | return -1; | ||
152 | } | ||
153 | return 0; | ||
154 | } | ||
155 | |||
156 | static bool | ||
157 | set_intensity(struct backlight_device *bl, struct lm3630_chip_data *pchip) | ||
158 | { | ||
159 | if (!pchip->pdata->pwm_set_intensity) | ||
160 | return false; | ||
161 | pchip->pdata->pwm_set_intensity(bl->props.brightness - 1, | ||
162 | pchip->pdata->pwm_period); | ||
163 | return true; | ||
164 | } | ||
165 | |||
166 | /* update and get brightness */ | ||
167 | static int lm3630_bank_a_update_status(struct backlight_device *bl) | ||
168 | { | ||
169 | int ret; | ||
170 | struct lm3630_chip_data *pchip = bl_get_data(bl); | ||
171 | enum lm3630_pwm_ctrl pwm_ctrl = pchip->pdata->pwm_ctrl; | ||
172 | |||
173 | /* brightness 0 means disable */ | ||
174 | if (!bl->props.brightness) { | ||
175 | ret = regmap_update_bits(pchip->regmap, REG_CTRL, 0x04, 0x00); | ||
176 | if (ret < 0) | ||
177 | goto out; | ||
178 | return bl->props.brightness; | ||
179 | } | ||
180 | |||
181 | /* pwm control */ | ||
182 | if (pwm_ctrl == PWM_CTRL_BANK_A || pwm_ctrl == PWM_CTRL_BANK_ALL) { | ||
183 | if (!set_intensity(bl, pchip)) | ||
184 | dev_err(pchip->dev, "No pwm control func. in plat-data\n"); | ||
185 | } else { | ||
186 | |||
187 | /* i2c control */ | ||
188 | ret = regmap_update_bits(pchip->regmap, REG_CTRL, 0x80, 0x00); | ||
189 | if (ret < 0) | ||
190 | goto out; | ||
191 | mdelay(1); | ||
192 | ret = regmap_write(pchip->regmap, | ||
193 | REG_BRT_A, bl->props.brightness - 1); | ||
194 | if (ret < 0) | ||
195 | goto out; | ||
196 | } | ||
197 | return bl->props.brightness; | ||
198 | out: | ||
199 | dev_err(pchip->dev, "i2c failed to access REG_CTRL\n"); | ||
200 | return bl->props.brightness; | ||
201 | } | ||
202 | |||
203 | static int lm3630_bank_a_get_brightness(struct backlight_device *bl) | ||
204 | { | ||
205 | unsigned int reg_val; | ||
206 | int brightness, ret; | ||
207 | struct lm3630_chip_data *pchip = bl_get_data(bl); | ||
208 | enum lm3630_pwm_ctrl pwm_ctrl = pchip->pdata->pwm_ctrl; | ||
209 | |||
210 | if (pwm_ctrl == PWM_CTRL_BANK_A || pwm_ctrl == PWM_CTRL_BANK_ALL) { | ||
211 | ret = regmap_read(pchip->regmap, REG_PWM_OUTHIGH, ®_val); | ||
212 | if (ret < 0) | ||
213 | goto out; | ||
214 | brightness = reg_val & 0x01; | ||
215 | ret = regmap_read(pchip->regmap, REG_PWM_OUTLOW, ®_val); | ||
216 | if (ret < 0) | ||
217 | goto out; | ||
218 | brightness = ((brightness << 8) | reg_val) + 1; | ||
219 | } else { | ||
220 | ret = regmap_update_bits(pchip->regmap, REG_CTRL, 0x80, 0x00); | ||
221 | if (ret < 0) | ||
222 | goto out; | ||
223 | mdelay(1); | ||
224 | ret = regmap_read(pchip->regmap, REG_BRT_A, ®_val); | ||
225 | if (ret < 0) | ||
226 | goto out; | ||
227 | brightness = reg_val + 1; | ||
228 | } | ||
229 | bl->props.brightness = brightness; | ||
230 | return bl->props.brightness; | ||
231 | out: | ||
232 | dev_err(pchip->dev, "i2c failed to access register\n"); | ||
233 | return 0; | ||
234 | } | ||
235 | |||
236 | static const struct backlight_ops lm3630_bank_a_ops = { | ||
237 | .options = BL_CORE_SUSPENDRESUME, | ||
238 | .update_status = lm3630_bank_a_update_status, | ||
239 | .get_brightness = lm3630_bank_a_get_brightness, | ||
240 | }; | ||
241 | |||
242 | static int lm3630_bank_b_update_status(struct backlight_device *bl) | ||
243 | { | ||
244 | int ret; | ||
245 | struct lm3630_chip_data *pchip = bl_get_data(bl); | ||
246 | enum lm3630_pwm_ctrl pwm_ctrl = pchip->pdata->pwm_ctrl; | ||
247 | |||
248 | if (pwm_ctrl == PWM_CTRL_BANK_B || pwm_ctrl == PWM_CTRL_BANK_ALL) { | ||
249 | if (!set_intensity(bl, pchip)) | ||
250 | dev_err(pchip->dev, | ||
251 | "no pwm control func. in plat-data\n"); | ||
252 | } else { | ||
253 | ret = regmap_update_bits(pchip->regmap, REG_CTRL, 0x80, 0x00); | ||
254 | if (ret < 0) | ||
255 | goto out; | ||
256 | mdelay(1); | ||
257 | ret = regmap_write(pchip->regmap, | ||
258 | REG_BRT_B, bl->props.brightness - 1); | ||
259 | } | ||
260 | return bl->props.brightness; | ||
261 | out: | ||
262 | dev_err(pchip->dev, "i2c failed to access register\n"); | ||
263 | return bl->props.brightness; | ||
264 | } | ||
265 | |||
266 | static int lm3630_bank_b_get_brightness(struct backlight_device *bl) | ||
267 | { | ||
268 | unsigned int reg_val; | ||
269 | int brightness, ret; | ||
270 | struct lm3630_chip_data *pchip = bl_get_data(bl); | ||
271 | enum lm3630_pwm_ctrl pwm_ctrl = pchip->pdata->pwm_ctrl; | ||
272 | |||
273 | if (pwm_ctrl == PWM_CTRL_BANK_B || pwm_ctrl == PWM_CTRL_BANK_ALL) { | ||
274 | ret = regmap_read(pchip->regmap, REG_PWM_OUTHIGH, ®_val); | ||
275 | if (ret < 0) | ||
276 | goto out; | ||
277 | brightness = reg_val & 0x01; | ||
278 | ret = regmap_read(pchip->regmap, REG_PWM_OUTLOW, ®_val); | ||
279 | if (ret < 0) | ||
280 | goto out; | ||
281 | brightness = ((brightness << 8) | reg_val) + 1; | ||
282 | } else { | ||
283 | ret = regmap_update_bits(pchip->regmap, REG_CTRL, 0x80, 0x00); | ||
284 | if (ret < 0) | ||
285 | goto out; | ||
286 | mdelay(1); | ||
287 | ret = regmap_read(pchip->regmap, REG_BRT_B, ®_val); | ||
288 | if (ret < 0) | ||
289 | goto out; | ||
290 | brightness = reg_val + 1; | ||
291 | } | ||
292 | bl->props.brightness = brightness; | ||
293 | |||
294 | return bl->props.brightness; | ||
295 | out: | ||
296 | dev_err(pchip->dev, "i2c failed to access register\n"); | ||
297 | return bl->props.brightness; | ||
298 | } | ||
299 | |||
300 | static const struct backlight_ops lm3630_bank_b_ops = { | ||
301 | .options = BL_CORE_SUSPENDRESUME, | ||
302 | .update_status = lm3630_bank_b_update_status, | ||
303 | .get_brightness = lm3630_bank_b_get_brightness, | ||
304 | }; | ||
305 | |||
306 | static int lm3630_backlight_register(struct lm3630_chip_data *pchip, | ||
307 | enum lm3630_leds ledno) | ||
308 | { | ||
309 | const char *name = bled_name[ledno]; | ||
310 | struct backlight_properties props; | ||
311 | struct lm3630_platform_data *pdata = pchip->pdata; | ||
312 | |||
313 | props.type = BACKLIGHT_RAW; | ||
314 | switch (ledno) { | ||
315 | case BLED_1: | ||
316 | case BLED_ALL: | ||
317 | props.brightness = pdata->init_brt_led1; | ||
318 | props.max_brightness = pdata->max_brt_led1; | ||
319 | pchip->bled1 = | ||
320 | backlight_device_register(name, pchip->dev, pchip, | ||
321 | &lm3630_bank_a_ops, &props); | ||
322 | if (IS_ERR(pchip->bled1)) | ||
323 | return PTR_ERR(pchip->bled1); | ||
324 | break; | ||
325 | case BLED_2: | ||
326 | props.brightness = pdata->init_brt_led2; | ||
327 | props.max_brightness = pdata->max_brt_led2; | ||
328 | pchip->bled2 = | ||
329 | backlight_device_register(name, pchip->dev, pchip, | ||
330 | &lm3630_bank_b_ops, &props); | ||
331 | if (IS_ERR(pchip->bled2)) | ||
332 | return PTR_ERR(pchip->bled2); | ||
333 | break; | ||
334 | } | ||
335 | return 0; | ||
336 | } | ||
337 | |||
338 | static void lm3630_backlight_unregister(struct lm3630_chip_data *pchip) | ||
339 | { | ||
340 | if (pchip->bled1) | ||
341 | backlight_device_unregister(pchip->bled1); | ||
342 | if (pchip->bled2) | ||
343 | backlight_device_unregister(pchip->bled2); | ||
344 | } | ||
345 | |||
346 | static const struct regmap_config lm3630_regmap = { | ||
347 | .reg_bits = 8, | ||
348 | .val_bits = 8, | ||
349 | .max_register = REG_MAX, | ||
350 | }; | ||
351 | |||
352 | static int lm3630_probe(struct i2c_client *client, | ||
353 | const struct i2c_device_id *id) | ||
354 | { | ||
355 | struct lm3630_platform_data *pdata = client->dev.platform_data; | ||
356 | struct lm3630_chip_data *pchip; | ||
357 | int ret; | ||
358 | |||
359 | if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { | ||
360 | dev_err(&client->dev, "fail : i2c functionality check...\n"); | ||
361 | return -EOPNOTSUPP; | ||
362 | } | ||
363 | |||
364 | if (pdata == NULL) { | ||
365 | dev_err(&client->dev, "fail : no platform data.\n"); | ||
366 | return -ENODATA; | ||
367 | } | ||
368 | |||
369 | pchip = devm_kzalloc(&client->dev, sizeof(struct lm3630_chip_data), | ||
370 | GFP_KERNEL); | ||
371 | if (!pchip) | ||
372 | return -ENOMEM; | ||
373 | pchip->pdata = pdata; | ||
374 | pchip->dev = &client->dev; | ||
375 | |||
376 | pchip->regmap = devm_regmap_init_i2c(client, &lm3630_regmap); | ||
377 | if (IS_ERR(pchip->regmap)) { | ||
378 | ret = PTR_ERR(pchip->regmap); | ||
379 | dev_err(&client->dev, "fail : allocate register map: %d\n", | ||
380 | ret); | ||
381 | return ret; | ||
382 | } | ||
383 | i2c_set_clientdata(client, pchip); | ||
384 | |||
385 | /* chip initialize */ | ||
386 | ret = lm3630_chip_init(pchip); | ||
387 | if (ret < 0) { | ||
388 | dev_err(&client->dev, "fail : init chip\n"); | ||
389 | goto err_chip_init; | ||
390 | } | ||
391 | |||
392 | switch (pdata->bank_a_ctrl) { | ||
393 | case BANK_A_CTRL_ALL: | ||
394 | ret = lm3630_backlight_register(pchip, BLED_ALL); | ||
395 | pdata->bank_b_ctrl = BANK_B_CTRL_DISABLE; | ||
396 | break; | ||
397 | case BANK_A_CTRL_LED1: | ||
398 | ret = lm3630_backlight_register(pchip, BLED_1); | ||
399 | break; | ||
400 | case BANK_A_CTRL_LED2: | ||
401 | ret = lm3630_backlight_register(pchip, BLED_2); | ||
402 | pdata->bank_b_ctrl = BANK_B_CTRL_DISABLE; | ||
403 | break; | ||
404 | default: | ||
405 | break; | ||
406 | } | ||
407 | |||
408 | if (ret < 0) | ||
409 | goto err_bl_reg; | ||
410 | |||
411 | if (pdata->bank_b_ctrl && pchip->bled2 == NULL) { | ||
412 | ret = lm3630_backlight_register(pchip, BLED_2); | ||
413 | if (ret < 0) | ||
414 | goto err_bl_reg; | ||
415 | } | ||
416 | |||
417 | /* interrupt enable : irq 0 is not allowed for lm3630 */ | ||
418 | pchip->irq = client->irq; | ||
419 | if (pchip->irq) | ||
420 | lm3630_intr_config(pchip); | ||
421 | |||
422 | dev_info(&client->dev, "LM3630 backlight register OK.\n"); | ||
423 | return 0; | ||
424 | |||
425 | err_bl_reg: | ||
426 | dev_err(&client->dev, "fail : backlight register.\n"); | ||
427 | lm3630_backlight_unregister(pchip); | ||
428 | err_chip_init: | ||
429 | return ret; | ||
430 | } | ||
431 | |||
432 | static int lm3630_remove(struct i2c_client *client) | ||
433 | { | ||
434 | int ret; | ||
435 | struct lm3630_chip_data *pchip = i2c_get_clientdata(client); | ||
436 | |||
437 | ret = regmap_write(pchip->regmap, REG_BRT_A, 0); | ||
438 | if (ret < 0) | ||
439 | dev_err(pchip->dev, "i2c failed to access register\n"); | ||
440 | |||
441 | ret = regmap_write(pchip->regmap, REG_BRT_B, 0); | ||
442 | if (ret < 0) | ||
443 | dev_err(pchip->dev, "i2c failed to access register\n"); | ||
444 | |||
445 | lm3630_backlight_unregister(pchip); | ||
446 | if (pchip->irq) { | ||
447 | free_irq(pchip->irq, pchip); | ||
448 | flush_workqueue(pchip->irqthread); | ||
449 | destroy_workqueue(pchip->irqthread); | ||
450 | } | ||
451 | return 0; | ||
452 | } | ||
453 | |||
454 | static const struct i2c_device_id lm3630_id[] = { | ||
455 | {LM3630_NAME, 0}, | ||
456 | {} | ||
457 | }; | ||
458 | |||
459 | MODULE_DEVICE_TABLE(i2c, lm3630_id); | ||
460 | |||
461 | static struct i2c_driver lm3630_i2c_driver = { | ||
462 | .driver = { | ||
463 | .name = LM3630_NAME, | ||
464 | }, | ||
465 | .probe = lm3630_probe, | ||
466 | .remove = lm3630_remove, | ||
467 | .id_table = lm3630_id, | ||
468 | }; | ||
469 | |||
470 | module_i2c_driver(lm3630_i2c_driver); | ||
471 | |||
472 | MODULE_DESCRIPTION("Texas Instruments Backlight driver for LM3630"); | ||
473 | MODULE_AUTHOR("G.Shark Jeong <gshark.jeong@gmail.com>"); | ||
474 | MODULE_AUTHOR("Daniel Jeong <daniel.jeong@ti.com>"); | ||
475 | MODULE_LICENSE("GPL v2"); | ||
diff --git a/drivers/video/backlight/lm3630a_bl.c b/drivers/video/backlight/lm3630a_bl.c new file mode 100644 index 000000000000..35fe4825a454 --- /dev/null +++ b/drivers/video/backlight/lm3630a_bl.c | |||
@@ -0,0 +1,483 @@ | |||
1 | /* | ||
2 | * Simple driver for Texas Instruments LM3630A Backlight driver chip | ||
3 | * Copyright (C) 2012 Texas Instruments | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU General Public License version 2 as | ||
7 | * published by the Free Software Foundation. | ||
8 | * | ||
9 | */ | ||
10 | #include <linux/module.h> | ||
11 | #include <linux/slab.h> | ||
12 | #include <linux/i2c.h> | ||
13 | #include <linux/backlight.h> | ||
14 | #include <linux/err.h> | ||
15 | #include <linux/delay.h> | ||
16 | #include <linux/uaccess.h> | ||
17 | #include <linux/interrupt.h> | ||
18 | #include <linux/regmap.h> | ||
19 | #include <linux/pwm.h> | ||
20 | #include <linux/platform_data/lm3630a_bl.h> | ||
21 | |||
22 | #define REG_CTRL 0x00 | ||
23 | #define REG_BOOST 0x02 | ||
24 | #define REG_CONFIG 0x01 | ||
25 | #define REG_BRT_A 0x03 | ||
26 | #define REG_BRT_B 0x04 | ||
27 | #define REG_I_A 0x05 | ||
28 | #define REG_I_B 0x06 | ||
29 | #define REG_INT_STATUS 0x09 | ||
30 | #define REG_INT_EN 0x0A | ||
31 | #define REG_FAULT 0x0B | ||
32 | #define REG_PWM_OUTLOW 0x12 | ||
33 | #define REG_PWM_OUTHIGH 0x13 | ||
34 | #define REG_MAX 0x1F | ||
35 | |||
36 | #define INT_DEBOUNCE_MSEC 10 | ||
37 | struct lm3630a_chip { | ||
38 | struct device *dev; | ||
39 | struct delayed_work work; | ||
40 | |||
41 | int irq; | ||
42 | struct workqueue_struct *irqthread; | ||
43 | struct lm3630a_platform_data *pdata; | ||
44 | struct backlight_device *bleda; | ||
45 | struct backlight_device *bledb; | ||
46 | struct regmap *regmap; | ||
47 | struct pwm_device *pwmd; | ||
48 | }; | ||
49 | |||
50 | /* i2c access */ | ||
51 | static int lm3630a_read(struct lm3630a_chip *pchip, unsigned int reg) | ||
52 | { | ||
53 | int rval; | ||
54 | unsigned int reg_val; | ||
55 | |||
56 | rval = regmap_read(pchip->regmap, reg, ®_val); | ||
57 | if (rval < 0) | ||
58 | return rval; | ||
59 | return reg_val & 0xFF; | ||
60 | } | ||
61 | |||
62 | static int lm3630a_write(struct lm3630a_chip *pchip, | ||
63 | unsigned int reg, unsigned int data) | ||
64 | { | ||
65 | return regmap_write(pchip->regmap, reg, data); | ||
66 | } | ||
67 | |||
68 | static int lm3630a_update(struct lm3630a_chip *pchip, | ||
69 | unsigned int reg, unsigned int mask, | ||
70 | unsigned int data) | ||
71 | { | ||
72 | return regmap_update_bits(pchip->regmap, reg, mask, data); | ||
73 | } | ||
74 | |||
75 | /* initialize chip */ | ||
76 | static int lm3630a_chip_init(struct lm3630a_chip *pchip) | ||
77 | { | ||
78 | int rval; | ||
79 | struct lm3630a_platform_data *pdata = pchip->pdata; | ||
80 | |||
81 | usleep_range(1000, 2000); | ||
82 | /* set Filter Strength Register */ | ||
83 | rval = lm3630a_write(pchip, 0x50, 0x03); | ||
84 | /* set Cofig. register */ | ||
85 | rval |= lm3630a_update(pchip, REG_CONFIG, 0x07, pdata->pwm_ctrl); | ||
86 | /* set boost control */ | ||
87 | rval |= lm3630a_write(pchip, REG_BOOST, 0x38); | ||
88 | /* set current A */ | ||
89 | rval |= lm3630a_update(pchip, REG_I_A, 0x1F, 0x1F); | ||
90 | /* set current B */ | ||
91 | rval |= lm3630a_write(pchip, REG_I_B, 0x1F); | ||
92 | /* set control */ | ||
93 | rval |= lm3630a_update(pchip, REG_CTRL, 0x14, pdata->leda_ctrl); | ||
94 | rval |= lm3630a_update(pchip, REG_CTRL, 0x0B, pdata->ledb_ctrl); | ||
95 | usleep_range(1000, 2000); | ||
96 | /* set brightness A and B */ | ||
97 | rval |= lm3630a_write(pchip, REG_BRT_A, pdata->leda_init_brt); | ||
98 | rval |= lm3630a_write(pchip, REG_BRT_B, pdata->ledb_init_brt); | ||
99 | |||
100 | if (rval < 0) | ||
101 | dev_err(pchip->dev, "i2c failed to access register\n"); | ||
102 | return rval; | ||
103 | } | ||
104 | |||
105 | /* interrupt handling */ | ||
106 | static void lm3630a_delayed_func(struct work_struct *work) | ||
107 | { | ||
108 | int rval; | ||
109 | struct lm3630a_chip *pchip; | ||
110 | |||
111 | pchip = container_of(work, struct lm3630a_chip, work.work); | ||
112 | |||
113 | rval = lm3630a_read(pchip, REG_INT_STATUS); | ||
114 | if (rval < 0) { | ||
115 | dev_err(pchip->dev, | ||
116 | "i2c failed to access REG_INT_STATUS Register\n"); | ||
117 | return; | ||
118 | } | ||
119 | |||
120 | dev_info(pchip->dev, "REG_INT_STATUS Register is 0x%x\n", rval); | ||
121 | } | ||
122 | |||
123 | static irqreturn_t lm3630a_isr_func(int irq, void *chip) | ||
124 | { | ||
125 | int rval; | ||
126 | struct lm3630a_chip *pchip = chip; | ||
127 | unsigned long delay = msecs_to_jiffies(INT_DEBOUNCE_MSEC); | ||
128 | |||
129 | queue_delayed_work(pchip->irqthread, &pchip->work, delay); | ||
130 | |||
131 | rval = lm3630a_update(pchip, REG_CTRL, 0x80, 0x00); | ||
132 | if (rval < 0) { | ||
133 | dev_err(pchip->dev, "i2c failed to access register\n"); | ||
134 | return IRQ_NONE; | ||
135 | } | ||
136 | return IRQ_HANDLED; | ||
137 | } | ||
138 | |||
139 | static int lm3630a_intr_config(struct lm3630a_chip *pchip) | ||
140 | { | ||
141 | int rval; | ||
142 | |||
143 | rval = lm3630a_write(pchip, REG_INT_EN, 0x87); | ||
144 | if (rval < 0) | ||
145 | return rval; | ||
146 | |||
147 | INIT_DELAYED_WORK(&pchip->work, lm3630a_delayed_func); | ||
148 | pchip->irqthread = create_singlethread_workqueue("lm3630a-irqthd"); | ||
149 | if (!pchip->irqthread) { | ||
150 | dev_err(pchip->dev, "create irq thread fail\n"); | ||
151 | return -ENOMEM; | ||
152 | } | ||
153 | if (request_threaded_irq | ||
154 | (pchip->irq, NULL, lm3630a_isr_func, | ||
155 | IRQF_TRIGGER_FALLING | IRQF_ONESHOT, "lm3630a_irq", pchip)) { | ||
156 | dev_err(pchip->dev, "request threaded irq fail\n"); | ||
157 | destroy_workqueue(pchip->irqthread); | ||
158 | return -ENOMEM; | ||
159 | } | ||
160 | return rval; | ||
161 | } | ||
162 | |||
163 | static void lm3630a_pwm_ctrl(struct lm3630a_chip *pchip, int br, int br_max) | ||
164 | { | ||
165 | unsigned int period = pwm_get_period(pchip->pwmd); | ||
166 | unsigned int duty = br * period / br_max; | ||
167 | |||
168 | pwm_config(pchip->pwmd, duty, period); | ||
169 | if (duty) | ||
170 | pwm_enable(pchip->pwmd); | ||
171 | else | ||
172 | pwm_disable(pchip->pwmd); | ||
173 | } | ||
174 | |||
175 | /* update and get brightness */ | ||
176 | static int lm3630a_bank_a_update_status(struct backlight_device *bl) | ||
177 | { | ||
178 | int ret; | ||
179 | struct lm3630a_chip *pchip = bl_get_data(bl); | ||
180 | enum lm3630a_pwm_ctrl pwm_ctrl = pchip->pdata->pwm_ctrl; | ||
181 | |||
182 | /* pwm control */ | ||
183 | if ((pwm_ctrl & LM3630A_PWM_BANK_A) != 0) { | ||
184 | lm3630a_pwm_ctrl(pchip, bl->props.brightness, | ||
185 | bl->props.max_brightness); | ||
186 | return bl->props.brightness; | ||
187 | } | ||
188 | |||
189 | /* disable sleep */ | ||
190 | ret = lm3630a_update(pchip, REG_CTRL, 0x80, 0x00); | ||
191 | if (ret < 0) | ||
192 | goto out_i2c_err; | ||
193 | usleep_range(1000, 2000); | ||
194 | /* minimum brightness is 0x04 */ | ||
195 | ret = lm3630a_write(pchip, REG_BRT_A, bl->props.brightness); | ||
196 | if (bl->props.brightness < 0x4) | ||
197 | ret |= lm3630a_update(pchip, REG_CTRL, LM3630A_LEDA_ENABLE, 0); | ||
198 | else | ||
199 | ret |= lm3630a_update(pchip, REG_CTRL, | ||
200 | LM3630A_LEDA_ENABLE, LM3630A_LEDA_ENABLE); | ||
201 | if (ret < 0) | ||
202 | goto out_i2c_err; | ||
203 | return bl->props.brightness; | ||
204 | |||
205 | out_i2c_err: | ||
206 | dev_err(pchip->dev, "i2c failed to access\n"); | ||
207 | return bl->props.brightness; | ||
208 | } | ||
209 | |||
210 | static int lm3630a_bank_a_get_brightness(struct backlight_device *bl) | ||
211 | { | ||
212 | int brightness, rval; | ||
213 | struct lm3630a_chip *pchip = bl_get_data(bl); | ||
214 | enum lm3630a_pwm_ctrl pwm_ctrl = pchip->pdata->pwm_ctrl; | ||
215 | |||
216 | if ((pwm_ctrl & LM3630A_PWM_BANK_A) != 0) { | ||
217 | rval = lm3630a_read(pchip, REG_PWM_OUTHIGH); | ||
218 | if (rval < 0) | ||
219 | goto out_i2c_err; | ||
220 | brightness = (rval & 0x01) << 8; | ||
221 | rval = lm3630a_read(pchip, REG_PWM_OUTLOW); | ||
222 | if (rval < 0) | ||
223 | goto out_i2c_err; | ||
224 | brightness |= rval; | ||
225 | goto out; | ||
226 | } | ||
227 | |||
228 | /* disable sleep */ | ||
229 | rval = lm3630a_update(pchip, REG_CTRL, 0x80, 0x00); | ||
230 | if (rval < 0) | ||
231 | goto out_i2c_err; | ||
232 | usleep_range(1000, 2000); | ||
233 | rval = lm3630a_read(pchip, REG_BRT_A); | ||
234 | if (rval < 0) | ||
235 | goto out_i2c_err; | ||
236 | brightness = rval; | ||
237 | |||
238 | out: | ||
239 | bl->props.brightness = brightness; | ||
240 | return bl->props.brightness; | ||
241 | out_i2c_err: | ||
242 | dev_err(pchip->dev, "i2c failed to access register\n"); | ||
243 | return 0; | ||
244 | } | ||
245 | |||
246 | static const struct backlight_ops lm3630a_bank_a_ops = { | ||
247 | .options = BL_CORE_SUSPENDRESUME, | ||
248 | .update_status = lm3630a_bank_a_update_status, | ||
249 | .get_brightness = lm3630a_bank_a_get_brightness, | ||
250 | }; | ||
251 | |||
252 | /* update and get brightness */ | ||
253 | static int lm3630a_bank_b_update_status(struct backlight_device *bl) | ||
254 | { | ||
255 | int ret; | ||
256 | struct lm3630a_chip *pchip = bl_get_data(bl); | ||
257 | enum lm3630a_pwm_ctrl pwm_ctrl = pchip->pdata->pwm_ctrl; | ||
258 | |||
259 | /* pwm control */ | ||
260 | if ((pwm_ctrl & LM3630A_PWM_BANK_B) != 0) { | ||
261 | lm3630a_pwm_ctrl(pchip, bl->props.brightness, | ||
262 | bl->props.max_brightness); | ||
263 | return bl->props.brightness; | ||
264 | } | ||
265 | |||
266 | /* disable sleep */ | ||
267 | ret = lm3630a_update(pchip, REG_CTRL, 0x80, 0x00); | ||
268 | if (ret < 0) | ||
269 | goto out_i2c_err; | ||
270 | usleep_range(1000, 2000); | ||
271 | /* minimum brightness is 0x04 */ | ||
272 | ret = lm3630a_write(pchip, REG_BRT_B, bl->props.brightness); | ||
273 | if (bl->props.brightness < 0x4) | ||
274 | ret |= lm3630a_update(pchip, REG_CTRL, LM3630A_LEDB_ENABLE, 0); | ||
275 | else | ||
276 | ret |= lm3630a_update(pchip, REG_CTRL, | ||
277 | LM3630A_LEDB_ENABLE, LM3630A_LEDB_ENABLE); | ||
278 | if (ret < 0) | ||
279 | goto out_i2c_err; | ||
280 | return bl->props.brightness; | ||
281 | |||
282 | out_i2c_err: | ||
283 | dev_err(pchip->dev, "i2c failed to access REG_CTRL\n"); | ||
284 | return bl->props.brightness; | ||
285 | } | ||
286 | |||
287 | static int lm3630a_bank_b_get_brightness(struct backlight_device *bl) | ||
288 | { | ||
289 | int brightness, rval; | ||
290 | struct lm3630a_chip *pchip = bl_get_data(bl); | ||
291 | enum lm3630a_pwm_ctrl pwm_ctrl = pchip->pdata->pwm_ctrl; | ||
292 | |||
293 | if ((pwm_ctrl & LM3630A_PWM_BANK_B) != 0) { | ||
294 | rval = lm3630a_read(pchip, REG_PWM_OUTHIGH); | ||
295 | if (rval < 0) | ||
296 | goto out_i2c_err; | ||
297 | brightness = (rval & 0x01) << 8; | ||
298 | rval = lm3630a_read(pchip, REG_PWM_OUTLOW); | ||
299 | if (rval < 0) | ||
300 | goto out_i2c_err; | ||
301 | brightness |= rval; | ||
302 | goto out; | ||
303 | } | ||
304 | |||
305 | /* disable sleep */ | ||
306 | rval = lm3630a_update(pchip, REG_CTRL, 0x80, 0x00); | ||
307 | if (rval < 0) | ||
308 | goto out_i2c_err; | ||
309 | usleep_range(1000, 2000); | ||
310 | rval = lm3630a_read(pchip, REG_BRT_B); | ||
311 | if (rval < 0) | ||
312 | goto out_i2c_err; | ||
313 | brightness = rval; | ||
314 | |||
315 | out: | ||
316 | bl->props.brightness = brightness; | ||
317 | return bl->props.brightness; | ||
318 | out_i2c_err: | ||
319 | dev_err(pchip->dev, "i2c failed to access register\n"); | ||
320 | return 0; | ||
321 | } | ||
322 | |||
323 | static const struct backlight_ops lm3630a_bank_b_ops = { | ||
324 | .options = BL_CORE_SUSPENDRESUME, | ||
325 | .update_status = lm3630a_bank_b_update_status, | ||
326 | .get_brightness = lm3630a_bank_b_get_brightness, | ||
327 | }; | ||
328 | |||
329 | static int lm3630a_backlight_register(struct lm3630a_chip *pchip) | ||
330 | { | ||
331 | struct backlight_properties props; | ||
332 | struct lm3630a_platform_data *pdata = pchip->pdata; | ||
333 | |||
334 | props.type = BACKLIGHT_RAW; | ||
335 | if (pdata->leda_ctrl != LM3630A_LEDA_DISABLE) { | ||
336 | props.brightness = pdata->leda_init_brt; | ||
337 | props.max_brightness = pdata->leda_max_brt; | ||
338 | pchip->bleda = | ||
339 | devm_backlight_device_register(pchip->dev, "lm3630a_leda", | ||
340 | pchip->dev, pchip, | ||
341 | &lm3630a_bank_a_ops, &props); | ||
342 | if (IS_ERR(pchip->bleda)) | ||
343 | return PTR_ERR(pchip->bleda); | ||
344 | } | ||
345 | |||
346 | if ((pdata->ledb_ctrl != LM3630A_LEDB_DISABLE) && | ||
347 | (pdata->ledb_ctrl != LM3630A_LEDB_ON_A)) { | ||
348 | props.brightness = pdata->ledb_init_brt; | ||
349 | props.max_brightness = pdata->ledb_max_brt; | ||
350 | pchip->bledb = | ||
351 | devm_backlight_device_register(pchip->dev, "lm3630a_ledb", | ||
352 | pchip->dev, pchip, | ||
353 | &lm3630a_bank_b_ops, &props); | ||
354 | if (IS_ERR(pchip->bledb)) | ||
355 | return PTR_ERR(pchip->bledb); | ||
356 | } | ||
357 | return 0; | ||
358 | } | ||
359 | |||
360 | static const struct regmap_config lm3630a_regmap = { | ||
361 | .reg_bits = 8, | ||
362 | .val_bits = 8, | ||
363 | .max_register = REG_MAX, | ||
364 | }; | ||
365 | |||
366 | static int lm3630a_probe(struct i2c_client *client, | ||
367 | const struct i2c_device_id *id) | ||
368 | { | ||
369 | struct lm3630a_platform_data *pdata = dev_get_platdata(&client->dev); | ||
370 | struct lm3630a_chip *pchip; | ||
371 | int rval; | ||
372 | |||
373 | if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { | ||
374 | dev_err(&client->dev, "fail : i2c functionality check\n"); | ||
375 | return -EOPNOTSUPP; | ||
376 | } | ||
377 | |||
378 | pchip = devm_kzalloc(&client->dev, sizeof(struct lm3630a_chip), | ||
379 | GFP_KERNEL); | ||
380 | if (!pchip) | ||
381 | return -ENOMEM; | ||
382 | pchip->dev = &client->dev; | ||
383 | |||
384 | pchip->regmap = devm_regmap_init_i2c(client, &lm3630a_regmap); | ||
385 | if (IS_ERR(pchip->regmap)) { | ||
386 | rval = PTR_ERR(pchip->regmap); | ||
387 | dev_err(&client->dev, "fail : allocate reg. map: %d\n", rval); | ||
388 | return rval; | ||
389 | } | ||
390 | |||
391 | i2c_set_clientdata(client, pchip); | ||
392 | if (pdata == NULL) { | ||
393 | pdata = devm_kzalloc(pchip->dev, | ||
394 | sizeof(struct lm3630a_platform_data), | ||
395 | GFP_KERNEL); | ||
396 | if (pdata == NULL) | ||
397 | return -ENOMEM; | ||
398 | /* default values */ | ||
399 | pdata->leda_ctrl = LM3630A_LEDA_ENABLE; | ||
400 | pdata->ledb_ctrl = LM3630A_LEDB_ENABLE; | ||
401 | pdata->leda_max_brt = LM3630A_MAX_BRIGHTNESS; | ||
402 | pdata->ledb_max_brt = LM3630A_MAX_BRIGHTNESS; | ||
403 | pdata->leda_init_brt = LM3630A_MAX_BRIGHTNESS; | ||
404 | pdata->ledb_init_brt = LM3630A_MAX_BRIGHTNESS; | ||
405 | } | ||
406 | pchip->pdata = pdata; | ||
407 | |||
408 | /* chip initialize */ | ||
409 | rval = lm3630a_chip_init(pchip); | ||
410 | if (rval < 0) { | ||
411 | dev_err(&client->dev, "fail : init chip\n"); | ||
412 | return rval; | ||
413 | } | ||
414 | /* backlight register */ | ||
415 | rval = lm3630a_backlight_register(pchip); | ||
416 | if (rval < 0) { | ||
417 | dev_err(&client->dev, "fail : backlight register.\n"); | ||
418 | return rval; | ||
419 | } | ||
420 | /* pwm */ | ||
421 | if (pdata->pwm_ctrl != LM3630A_PWM_DISABLE) { | ||
422 | pchip->pwmd = devm_pwm_get(pchip->dev, "lm3630a-pwm"); | ||
423 | if (IS_ERR(pchip->pwmd)) { | ||
424 | dev_err(&client->dev, "fail : get pwm device\n"); | ||
425 | return PTR_ERR(pchip->pwmd); | ||
426 | } | ||
427 | } | ||
428 | pchip->pwmd->period = pdata->pwm_period; | ||
429 | |||
430 | /* interrupt enable : irq 0 is not allowed */ | ||
431 | pchip->irq = client->irq; | ||
432 | if (pchip->irq) { | ||
433 | rval = lm3630a_intr_config(pchip); | ||
434 | if (rval < 0) | ||
435 | return rval; | ||
436 | } | ||
437 | dev_info(&client->dev, "LM3630A backlight register OK.\n"); | ||
438 | return 0; | ||
439 | } | ||
440 | |||
441 | static int lm3630a_remove(struct i2c_client *client) | ||
442 | { | ||
443 | int rval; | ||
444 | struct lm3630a_chip *pchip = i2c_get_clientdata(client); | ||
445 | |||
446 | rval = lm3630a_write(pchip, REG_BRT_A, 0); | ||
447 | if (rval < 0) | ||
448 | dev_err(pchip->dev, "i2c failed to access register\n"); | ||
449 | |||
450 | rval = lm3630a_write(pchip, REG_BRT_B, 0); | ||
451 | if (rval < 0) | ||
452 | dev_err(pchip->dev, "i2c failed to access register\n"); | ||
453 | |||
454 | if (pchip->irq) { | ||
455 | free_irq(pchip->irq, pchip); | ||
456 | flush_workqueue(pchip->irqthread); | ||
457 | destroy_workqueue(pchip->irqthread); | ||
458 | } | ||
459 | return 0; | ||
460 | } | ||
461 | |||
462 | static const struct i2c_device_id lm3630a_id[] = { | ||
463 | {LM3630A_NAME, 0}, | ||
464 | {} | ||
465 | }; | ||
466 | |||
467 | MODULE_DEVICE_TABLE(i2c, lm3630a_id); | ||
468 | |||
469 | static struct i2c_driver lm3630a_i2c_driver = { | ||
470 | .driver = { | ||
471 | .name = LM3630A_NAME, | ||
472 | }, | ||
473 | .probe = lm3630a_probe, | ||
474 | .remove = lm3630a_remove, | ||
475 | .id_table = lm3630a_id, | ||
476 | }; | ||
477 | |||
478 | module_i2c_driver(lm3630a_i2c_driver); | ||
479 | |||
480 | MODULE_DESCRIPTION("Texas Instruments Backlight driver for LM3630A"); | ||
481 | MODULE_AUTHOR("Daniel Jeong <gshark.jeong@gmail.com>"); | ||
482 | MODULE_AUTHOR("LDD MLP <ldd-mlp@list.ti.com>"); | ||
483 | MODULE_LICENSE("GPL v2"); | ||
diff --git a/drivers/video/backlight/lm3639_bl.c b/drivers/video/backlight/lm3639_bl.c index 053964da8dd3..6fd60adf922e 100644 --- a/drivers/video/backlight/lm3639_bl.c +++ b/drivers/video/backlight/lm3639_bl.c | |||
@@ -76,10 +76,13 @@ static int lm3639_chip_init(struct lm3639_chip_data *pchip) | |||
76 | goto out; | 76 | goto out; |
77 | 77 | ||
78 | /* output pins config. */ | 78 | /* output pins config. */ |
79 | if (!pdata->init_brt_led) | 79 | if (!pdata->init_brt_led) { |
80 | reg_val = pdata->fled_pins | pdata->bled_pins; | 80 | reg_val = pdata->fled_pins; |
81 | else | 81 | reg_val |= pdata->bled_pins; |
82 | reg_val = pdata->fled_pins | pdata->bled_pins | 0x01; | 82 | } else { |
83 | reg_val = pdata->fled_pins; | ||
84 | reg_val |= pdata->bled_pins | 0x01; | ||
85 | } | ||
83 | 86 | ||
84 | ret = regmap_update_bits(pchip->regmap, REG_ENABLE, 0x79, reg_val); | 87 | ret = regmap_update_bits(pchip->regmap, REG_ENABLE, 0x79, reg_val); |
85 | if (ret < 0) | 88 | if (ret < 0) |
@@ -304,7 +307,7 @@ static int lm3639_probe(struct i2c_client *client, | |||
304 | { | 307 | { |
305 | int ret; | 308 | int ret; |
306 | struct lm3639_chip_data *pchip; | 309 | struct lm3639_chip_data *pchip; |
307 | struct lm3639_platform_data *pdata = client->dev.platform_data; | 310 | struct lm3639_platform_data *pdata = dev_get_platdata(&client->dev); |
308 | struct backlight_properties props; | 311 | struct backlight_properties props; |
309 | 312 | ||
310 | if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { | 313 | if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { |
diff --git a/drivers/video/backlight/lms283gf05.c b/drivers/video/backlight/lms283gf05.c index 4eec47261cd3..de8832504f68 100644 --- a/drivers/video/backlight/lms283gf05.c +++ b/drivers/video/backlight/lms283gf05.c | |||
@@ -128,7 +128,7 @@ static int lms283gf05_power_set(struct lcd_device *ld, int power) | |||
128 | { | 128 | { |
129 | struct lms283gf05_state *st = lcd_get_data(ld); | 129 | struct lms283gf05_state *st = lcd_get_data(ld); |
130 | struct spi_device *spi = st->spi; | 130 | struct spi_device *spi = st->spi; |
131 | struct lms283gf05_pdata *pdata = spi->dev.platform_data; | 131 | struct lms283gf05_pdata *pdata = dev_get_platdata(&spi->dev); |
132 | 132 | ||
133 | if (power <= FB_BLANK_NORMAL) { | 133 | if (power <= FB_BLANK_NORMAL) { |
134 | if (pdata) | 134 | if (pdata) |
@@ -153,7 +153,7 @@ static struct lcd_ops lms_ops = { | |||
153 | static int lms283gf05_probe(struct spi_device *spi) | 153 | static int lms283gf05_probe(struct spi_device *spi) |
154 | { | 154 | { |
155 | struct lms283gf05_state *st; | 155 | struct lms283gf05_state *st; |
156 | struct lms283gf05_pdata *pdata = spi->dev.platform_data; | 156 | struct lms283gf05_pdata *pdata = dev_get_platdata(&spi->dev); |
157 | struct lcd_device *ld; | 157 | struct lcd_device *ld; |
158 | int ret = 0; | 158 | int ret = 0; |
159 | 159 | ||
@@ -173,7 +173,8 @@ static int lms283gf05_probe(struct spi_device *spi) | |||
173 | return -ENOMEM; | 173 | return -ENOMEM; |
174 | } | 174 | } |
175 | 175 | ||
176 | ld = lcd_device_register("lms283gf05", &spi->dev, st, &lms_ops); | 176 | ld = devm_lcd_device_register(&spi->dev, "lms283gf05", &spi->dev, st, |
177 | &lms_ops); | ||
177 | if (IS_ERR(ld)) | 178 | if (IS_ERR(ld)) |
178 | return PTR_ERR(ld); | 179 | return PTR_ERR(ld); |
179 | 180 | ||
@@ -190,22 +191,12 @@ static int lms283gf05_probe(struct spi_device *spi) | |||
190 | return 0; | 191 | return 0; |
191 | } | 192 | } |
192 | 193 | ||
193 | static int lms283gf05_remove(struct spi_device *spi) | ||
194 | { | ||
195 | struct lms283gf05_state *st = spi_get_drvdata(spi); | ||
196 | |||
197 | lcd_device_unregister(st->ld); | ||
198 | |||
199 | return 0; | ||
200 | } | ||
201 | |||
202 | static struct spi_driver lms283gf05_driver = { | 194 | static struct spi_driver lms283gf05_driver = { |
203 | .driver = { | 195 | .driver = { |
204 | .name = "lms283gf05", | 196 | .name = "lms283gf05", |
205 | .owner = THIS_MODULE, | 197 | .owner = THIS_MODULE, |
206 | }, | 198 | }, |
207 | .probe = lms283gf05_probe, | 199 | .probe = lms283gf05_probe, |
208 | .remove = lms283gf05_remove, | ||
209 | }; | 200 | }; |
210 | 201 | ||
211 | module_spi_driver(lms283gf05_driver); | 202 | module_spi_driver(lms283gf05_driver); |
diff --git a/drivers/video/backlight/lms501kf03.c b/drivers/video/backlight/lms501kf03.c index cf01b9ac8131..77258b7b04be 100644 --- a/drivers/video/backlight/lms501kf03.c +++ b/drivers/video/backlight/lms501kf03.c | |||
@@ -344,14 +344,14 @@ static int lms501kf03_probe(struct spi_device *spi) | |||
344 | lcd->spi = spi; | 344 | lcd->spi = spi; |
345 | lcd->dev = &spi->dev; | 345 | lcd->dev = &spi->dev; |
346 | 346 | ||
347 | lcd->lcd_pd = spi->dev.platform_data; | 347 | lcd->lcd_pd = dev_get_platdata(&spi->dev); |
348 | if (!lcd->lcd_pd) { | 348 | if (!lcd->lcd_pd) { |
349 | dev_err(&spi->dev, "platform data is NULL\n"); | 349 | dev_err(&spi->dev, "platform data is NULL\n"); |
350 | return -EINVAL; | 350 | return -EINVAL; |
351 | } | 351 | } |
352 | 352 | ||
353 | ld = lcd_device_register("lms501kf03", &spi->dev, lcd, | 353 | ld = devm_lcd_device_register(&spi->dev, "lms501kf03", &spi->dev, lcd, |
354 | &lms501kf03_lcd_ops); | 354 | &lms501kf03_lcd_ops); |
355 | if (IS_ERR(ld)) | 355 | if (IS_ERR(ld)) |
356 | return PTR_ERR(ld); | 356 | return PTR_ERR(ld); |
357 | 357 | ||
@@ -382,8 +382,6 @@ static int lms501kf03_remove(struct spi_device *spi) | |||
382 | struct lms501kf03 *lcd = spi_get_drvdata(spi); | 382 | struct lms501kf03 *lcd = spi_get_drvdata(spi); |
383 | 383 | ||
384 | lms501kf03_power(lcd, FB_BLANK_POWERDOWN); | 384 | lms501kf03_power(lcd, FB_BLANK_POWERDOWN); |
385 | lcd_device_unregister(lcd->ld); | ||
386 | |||
387 | return 0; | 385 | return 0; |
388 | } | 386 | } |
389 | 387 | ||
diff --git a/drivers/video/backlight/lp855x_bl.c b/drivers/video/backlight/lp855x_bl.c index c0b41f13bd4a..cae80d555e84 100644 --- a/drivers/video/backlight/lp855x_bl.c +++ b/drivers/video/backlight/lp855x_bl.c | |||
@@ -26,13 +26,15 @@ | |||
26 | #define LP8556_EPROM_START 0xA0 | 26 | #define LP8556_EPROM_START 0xA0 |
27 | #define LP8556_EPROM_END 0xAF | 27 | #define LP8556_EPROM_END 0xAF |
28 | 28 | ||
29 | /* LP8557 Registers */ | 29 | /* LP8555/7 Registers */ |
30 | #define LP8557_BL_CMD 0x00 | 30 | #define LP8557_BL_CMD 0x00 |
31 | #define LP8557_BL_MASK 0x01 | 31 | #define LP8557_BL_MASK 0x01 |
32 | #define LP8557_BL_ON 0x01 | 32 | #define LP8557_BL_ON 0x01 |
33 | #define LP8557_BL_OFF 0x00 | 33 | #define LP8557_BL_OFF 0x00 |
34 | #define LP8557_BRIGHTNESS_CTRL 0x04 | 34 | #define LP8557_BRIGHTNESS_CTRL 0x04 |
35 | #define LP8557_CONFIG 0x10 | 35 | #define LP8557_CONFIG 0x10 |
36 | #define LP8555_EPROM_START 0x10 | ||
37 | #define LP8555_EPROM_END 0x7A | ||
36 | #define LP8557_EPROM_START 0x10 | 38 | #define LP8557_EPROM_START 0x10 |
37 | #define LP8557_EPROM_END 0x1E | 39 | #define LP8557_EPROM_END 0x1E |
38 | 40 | ||
@@ -111,6 +113,10 @@ static bool lp855x_is_valid_rom_area(struct lp855x *lp, u8 addr) | |||
111 | start = LP8556_EPROM_START; | 113 | start = LP8556_EPROM_START; |
112 | end = LP8556_EPROM_END; | 114 | end = LP8556_EPROM_END; |
113 | break; | 115 | break; |
116 | case LP8555: | ||
117 | start = LP8555_EPROM_START; | ||
118 | end = LP8555_EPROM_END; | ||
119 | break; | ||
114 | case LP8557: | 120 | case LP8557: |
115 | start = LP8557_EPROM_START; | 121 | start = LP8557_EPROM_START; |
116 | end = LP8557_EPROM_END; | 122 | end = LP8557_EPROM_END; |
@@ -165,9 +171,14 @@ static int lp855x_configure(struct lp855x *lp) | |||
165 | struct lp855x_platform_data *pd = lp->pdata; | 171 | struct lp855x_platform_data *pd = lp->pdata; |
166 | 172 | ||
167 | switch (lp->chip_id) { | 173 | switch (lp->chip_id) { |
168 | case LP8550 ... LP8556: | 174 | case LP8550: |
175 | case LP8551: | ||
176 | case LP8552: | ||
177 | case LP8553: | ||
178 | case LP8556: | ||
169 | lp->cfg = &lp855x_dev_cfg; | 179 | lp->cfg = &lp855x_dev_cfg; |
170 | break; | 180 | break; |
181 | case LP8555: | ||
171 | case LP8557: | 182 | case LP8557: |
172 | lp->cfg = &lp8557_dev_cfg; | 183 | lp->cfg = &lp8557_dev_cfg; |
173 | break; | 184 | break; |
@@ -289,7 +300,7 @@ static int lp855x_backlight_register(struct lp855x *lp) | |||
289 | 300 | ||
290 | props.brightness = pdata->initial_brightness; | 301 | props.brightness = pdata->initial_brightness; |
291 | 302 | ||
292 | bl = backlight_device_register(name, lp->dev, lp, | 303 | bl = devm_backlight_device_register(lp->dev, name, lp->dev, lp, |
293 | &lp855x_bl_ops, &props); | 304 | &lp855x_bl_ops, &props); |
294 | if (IS_ERR(bl)) | 305 | if (IS_ERR(bl)) |
295 | return PTR_ERR(bl); | 306 | return PTR_ERR(bl); |
@@ -299,12 +310,6 @@ static int lp855x_backlight_register(struct lp855x *lp) | |||
299 | return 0; | 310 | return 0; |
300 | } | 311 | } |
301 | 312 | ||
302 | static void lp855x_backlight_unregister(struct lp855x *lp) | ||
303 | { | ||
304 | if (lp->bl) | ||
305 | backlight_device_unregister(lp->bl); | ||
306 | } | ||
307 | |||
308 | static ssize_t lp855x_get_chip_id(struct device *dev, | 313 | static ssize_t lp855x_get_chip_id(struct device *dev, |
309 | struct device_attribute *attr, char *buf) | 314 | struct device_attribute *attr, char *buf) |
310 | { | 315 | { |
@@ -394,7 +399,7 @@ static int lp855x_parse_dt(struct device *dev, struct device_node *node) | |||
394 | static int lp855x_probe(struct i2c_client *cl, const struct i2c_device_id *id) | 399 | static int lp855x_probe(struct i2c_client *cl, const struct i2c_device_id *id) |
395 | { | 400 | { |
396 | struct lp855x *lp; | 401 | struct lp855x *lp; |
397 | struct lp855x_platform_data *pdata = cl->dev.platform_data; | 402 | struct lp855x_platform_data *pdata = dev_get_platdata(&cl->dev); |
398 | struct device_node *node = cl->dev.of_node; | 403 | struct device_node *node = cl->dev.of_node; |
399 | int ret; | 404 | int ret; |
400 | 405 | ||
@@ -403,7 +408,7 @@ static int lp855x_probe(struct i2c_client *cl, const struct i2c_device_id *id) | |||
403 | if (ret < 0) | 408 | if (ret < 0) |
404 | return ret; | 409 | return ret; |
405 | 410 | ||
406 | pdata = cl->dev.platform_data; | 411 | pdata = dev_get_platdata(&cl->dev); |
407 | } | 412 | } |
408 | 413 | ||
409 | if (!i2c_check_functionality(cl->adapter, I2C_FUNC_SMBUS_I2C_BLOCK)) | 414 | if (!i2c_check_functionality(cl->adapter, I2C_FUNC_SMBUS_I2C_BLOCK)) |
@@ -428,29 +433,24 @@ static int lp855x_probe(struct i2c_client *cl, const struct i2c_device_id *id) | |||
428 | ret = lp855x_configure(lp); | 433 | ret = lp855x_configure(lp); |
429 | if (ret) { | 434 | if (ret) { |
430 | dev_err(lp->dev, "device config err: %d", ret); | 435 | dev_err(lp->dev, "device config err: %d", ret); |
431 | goto err_dev; | 436 | return ret; |
432 | } | 437 | } |
433 | 438 | ||
434 | ret = lp855x_backlight_register(lp); | 439 | ret = lp855x_backlight_register(lp); |
435 | if (ret) { | 440 | if (ret) { |
436 | dev_err(lp->dev, | 441 | dev_err(lp->dev, |
437 | "failed to register backlight. err: %d\n", ret); | 442 | "failed to register backlight. err: %d\n", ret); |
438 | goto err_dev; | 443 | return ret; |
439 | } | 444 | } |
440 | 445 | ||
441 | ret = sysfs_create_group(&lp->dev->kobj, &lp855x_attr_group); | 446 | ret = sysfs_create_group(&lp->dev->kobj, &lp855x_attr_group); |
442 | if (ret) { | 447 | if (ret) { |
443 | dev_err(lp->dev, "failed to register sysfs. err: %d\n", ret); | 448 | dev_err(lp->dev, "failed to register sysfs. err: %d\n", ret); |
444 | goto err_sysfs; | 449 | return ret; |
445 | } | 450 | } |
446 | 451 | ||
447 | backlight_update_status(lp->bl); | 452 | backlight_update_status(lp->bl); |
448 | return 0; | 453 | return 0; |
449 | |||
450 | err_sysfs: | ||
451 | lp855x_backlight_unregister(lp); | ||
452 | err_dev: | ||
453 | return ret; | ||
454 | } | 454 | } |
455 | 455 | ||
456 | static int lp855x_remove(struct i2c_client *cl) | 456 | static int lp855x_remove(struct i2c_client *cl) |
@@ -460,7 +460,6 @@ static int lp855x_remove(struct i2c_client *cl) | |||
460 | lp->bl->props.brightness = 0; | 460 | lp->bl->props.brightness = 0; |
461 | backlight_update_status(lp->bl); | 461 | backlight_update_status(lp->bl); |
462 | sysfs_remove_group(&lp->dev->kobj, &lp855x_attr_group); | 462 | sysfs_remove_group(&lp->dev->kobj, &lp855x_attr_group); |
463 | lp855x_backlight_unregister(lp); | ||
464 | 463 | ||
465 | return 0; | 464 | return 0; |
466 | } | 465 | } |
@@ -470,6 +469,7 @@ static const struct of_device_id lp855x_dt_ids[] = { | |||
470 | { .compatible = "ti,lp8551", }, | 469 | { .compatible = "ti,lp8551", }, |
471 | { .compatible = "ti,lp8552", }, | 470 | { .compatible = "ti,lp8552", }, |
472 | { .compatible = "ti,lp8553", }, | 471 | { .compatible = "ti,lp8553", }, |
472 | { .compatible = "ti,lp8555", }, | ||
473 | { .compatible = "ti,lp8556", }, | 473 | { .compatible = "ti,lp8556", }, |
474 | { .compatible = "ti,lp8557", }, | 474 | { .compatible = "ti,lp8557", }, |
475 | { } | 475 | { } |
@@ -481,6 +481,7 @@ static const struct i2c_device_id lp855x_ids[] = { | |||
481 | {"lp8551", LP8551}, | 481 | {"lp8551", LP8551}, |
482 | {"lp8552", LP8552}, | 482 | {"lp8552", LP8552}, |
483 | {"lp8553", LP8553}, | 483 | {"lp8553", LP8553}, |
484 | {"lp8555", LP8555}, | ||
484 | {"lp8556", LP8556}, | 485 | {"lp8556", LP8556}, |
485 | {"lp8557", LP8557}, | 486 | {"lp8557", LP8557}, |
486 | { } | 487 | { } |
diff --git a/drivers/video/backlight/lp8788_bl.c b/drivers/video/backlight/lp8788_bl.c index 980855ec9bb1..e49905d495dc 100644 --- a/drivers/video/backlight/lp8788_bl.c +++ b/drivers/video/backlight/lp8788_bl.c | |||
@@ -52,7 +52,7 @@ struct lp8788_bl { | |||
52 | struct pwm_device *pwm; | 52 | struct pwm_device *pwm; |
53 | }; | 53 | }; |
54 | 54 | ||
55 | struct lp8788_bl_config default_bl_config = { | 55 | static struct lp8788_bl_config default_bl_config = { |
56 | .bl_mode = LP8788_BL_REGISTER_ONLY, | 56 | .bl_mode = LP8788_BL_REGISTER_ONLY, |
57 | .dim_mode = LP8788_DIM_EXPONENTIAL, | 57 | .dim_mode = LP8788_DIM_EXPONENTIAL, |
58 | .full_scale = LP8788_FULLSCALE_1900uA, | 58 | .full_scale = LP8788_FULLSCALE_1900uA, |
diff --git a/drivers/video/backlight/ltv350qv.c b/drivers/video/backlight/ltv350qv.c index ed1b39268131..383f550e165e 100644 --- a/drivers/video/backlight/ltv350qv.c +++ b/drivers/video/backlight/ltv350qv.c | |||
@@ -242,7 +242,8 @@ static int ltv350qv_probe(struct spi_device *spi) | |||
242 | if (!lcd->buffer) | 242 | if (!lcd->buffer) |
243 | return -ENOMEM; | 243 | return -ENOMEM; |
244 | 244 | ||
245 | ld = lcd_device_register("ltv350qv", &spi->dev, lcd, <v_ops); | 245 | ld = devm_lcd_device_register(&spi->dev, "ltv350qv", &spi->dev, lcd, |
246 | <v_ops); | ||
246 | if (IS_ERR(ld)) | 247 | if (IS_ERR(ld)) |
247 | return PTR_ERR(ld); | 248 | return PTR_ERR(ld); |
248 | 249 | ||
@@ -250,15 +251,11 @@ static int ltv350qv_probe(struct spi_device *spi) | |||
250 | 251 | ||
251 | ret = ltv350qv_power(lcd, FB_BLANK_UNBLANK); | 252 | ret = ltv350qv_power(lcd, FB_BLANK_UNBLANK); |
252 | if (ret) | 253 | if (ret) |
253 | goto out_unregister; | 254 | return ret; |
254 | 255 | ||
255 | spi_set_drvdata(spi, lcd); | 256 | spi_set_drvdata(spi, lcd); |
256 | 257 | ||
257 | return 0; | 258 | return 0; |
258 | |||
259 | out_unregister: | ||
260 | lcd_device_unregister(ld); | ||
261 | return ret; | ||
262 | } | 259 | } |
263 | 260 | ||
264 | static int ltv350qv_remove(struct spi_device *spi) | 261 | static int ltv350qv_remove(struct spi_device *spi) |
@@ -266,8 +263,6 @@ static int ltv350qv_remove(struct spi_device *spi) | |||
266 | struct ltv350qv *lcd = spi_get_drvdata(spi); | 263 | struct ltv350qv *lcd = spi_get_drvdata(spi); |
267 | 264 | ||
268 | ltv350qv_power(lcd, FB_BLANK_POWERDOWN); | 265 | ltv350qv_power(lcd, FB_BLANK_POWERDOWN); |
269 | lcd_device_unregister(lcd->ld); | ||
270 | |||
271 | return 0; | 266 | return 0; |
272 | } | 267 | } |
273 | 268 | ||
diff --git a/drivers/video/backlight/lv5207lp.c b/drivers/video/backlight/lv5207lp.c index 498fd73d59b9..1802b2d1357d 100644 --- a/drivers/video/backlight/lv5207lp.c +++ b/drivers/video/backlight/lv5207lp.c | |||
@@ -93,7 +93,7 @@ static const struct backlight_ops lv5207lp_backlight_ops = { | |||
93 | static int lv5207lp_probe(struct i2c_client *client, | 93 | static int lv5207lp_probe(struct i2c_client *client, |
94 | const struct i2c_device_id *id) | 94 | const struct i2c_device_id *id) |
95 | { | 95 | { |
96 | struct lv5207lp_platform_data *pdata = client->dev.platform_data; | 96 | struct lv5207lp_platform_data *pdata = dev_get_platdata(&client->dev); |
97 | struct backlight_device *backlight; | 97 | struct backlight_device *backlight; |
98 | struct backlight_properties props; | 98 | struct backlight_properties props; |
99 | struct lv5207lp *lv; | 99 | struct lv5207lp *lv; |
@@ -124,9 +124,9 @@ static int lv5207lp_probe(struct i2c_client *client, | |||
124 | props.brightness = clamp_t(unsigned int, pdata->def_value, 0, | 124 | props.brightness = clamp_t(unsigned int, pdata->def_value, 0, |
125 | props.max_brightness); | 125 | props.max_brightness); |
126 | 126 | ||
127 | backlight = backlight_device_register(dev_name(&client->dev), | 127 | backlight = devm_backlight_device_register(&client->dev, |
128 | &lv->client->dev, lv, | 128 | dev_name(&client->dev), &lv->client->dev, |
129 | &lv5207lp_backlight_ops, &props); | 129 | lv, &lv5207lp_backlight_ops, &props); |
130 | if (IS_ERR(backlight)) { | 130 | if (IS_ERR(backlight)) { |
131 | dev_err(&client->dev, "failed to register backlight\n"); | 131 | dev_err(&client->dev, "failed to register backlight\n"); |
132 | return PTR_ERR(backlight); | 132 | return PTR_ERR(backlight); |
@@ -144,7 +144,6 @@ static int lv5207lp_remove(struct i2c_client *client) | |||
144 | 144 | ||
145 | backlight->props.brightness = 0; | 145 | backlight->props.brightness = 0; |
146 | backlight_update_status(backlight); | 146 | backlight_update_status(backlight); |
147 | backlight_device_unregister(backlight); | ||
148 | 147 | ||
149 | return 0; | 148 | return 0; |
150 | } | 149 | } |
diff --git a/drivers/video/backlight/max8925_bl.c b/drivers/video/backlight/max8925_bl.c index 886e797f75f9..66fa08c920d2 100644 --- a/drivers/video/backlight/max8925_bl.c +++ b/drivers/video/backlight/max8925_bl.c | |||
@@ -163,7 +163,8 @@ static int max8925_backlight_probe(struct platform_device *pdev) | |||
163 | memset(&props, 0, sizeof(struct backlight_properties)); | 163 | memset(&props, 0, sizeof(struct backlight_properties)); |
164 | props.type = BACKLIGHT_RAW; | 164 | props.type = BACKLIGHT_RAW; |
165 | props.max_brightness = MAX_BRIGHTNESS; | 165 | props.max_brightness = MAX_BRIGHTNESS; |
166 | bl = backlight_device_register("max8925-backlight", &pdev->dev, data, | 166 | bl = devm_backlight_device_register(&pdev->dev, "max8925-backlight", |
167 | &pdev->dev, data, | ||
167 | &max8925_backlight_ops, &props); | 168 | &max8925_backlight_ops, &props); |
168 | if (IS_ERR(bl)) { | 169 | if (IS_ERR(bl)) { |
169 | dev_err(&pdev->dev, "failed to register backlight\n"); | 170 | dev_err(&pdev->dev, "failed to register backlight\n"); |
@@ -188,20 +189,9 @@ static int max8925_backlight_probe(struct platform_device *pdev) | |||
188 | } | 189 | } |
189 | ret = max8925_set_bits(chip->i2c, data->reg_mode_cntl, 0xfe, value); | 190 | ret = max8925_set_bits(chip->i2c, data->reg_mode_cntl, 0xfe, value); |
190 | if (ret < 0) | 191 | if (ret < 0) |
191 | goto out_brt; | 192 | return ret; |
192 | backlight_update_status(bl); | 193 | backlight_update_status(bl); |
193 | return 0; | 194 | return 0; |
194 | out_brt: | ||
195 | backlight_device_unregister(bl); | ||
196 | return ret; | ||
197 | } | ||
198 | |||
199 | static int max8925_backlight_remove(struct platform_device *pdev) | ||
200 | { | ||
201 | struct backlight_device *bl = platform_get_drvdata(pdev); | ||
202 | |||
203 | backlight_device_unregister(bl); | ||
204 | return 0; | ||
205 | } | 195 | } |
206 | 196 | ||
207 | static struct platform_driver max8925_backlight_driver = { | 197 | static struct platform_driver max8925_backlight_driver = { |
@@ -210,7 +200,6 @@ static struct platform_driver max8925_backlight_driver = { | |||
210 | .owner = THIS_MODULE, | 200 | .owner = THIS_MODULE, |
211 | }, | 201 | }, |
212 | .probe = max8925_backlight_probe, | 202 | .probe = max8925_backlight_probe, |
213 | .remove = max8925_backlight_remove, | ||
214 | }; | 203 | }; |
215 | 204 | ||
216 | module_platform_driver(max8925_backlight_driver); | 205 | module_platform_driver(max8925_backlight_driver); |
diff --git a/drivers/video/backlight/omap1_bl.c b/drivers/video/backlight/omap1_bl.c index 812e22e35cab..ac11a4650c19 100644 --- a/drivers/video/backlight/omap1_bl.c +++ b/drivers/video/backlight/omap1_bl.c | |||
@@ -133,7 +133,7 @@ static int omapbl_probe(struct platform_device *pdev) | |||
133 | struct backlight_properties props; | 133 | struct backlight_properties props; |
134 | struct backlight_device *dev; | 134 | struct backlight_device *dev; |
135 | struct omap_backlight *bl; | 135 | struct omap_backlight *bl; |
136 | struct omap_backlight_config *pdata = pdev->dev.platform_data; | 136 | struct omap_backlight_config *pdata = dev_get_platdata(&pdev->dev); |
137 | 137 | ||
138 | if (!pdata) | 138 | if (!pdata) |
139 | return -ENXIO; | 139 | return -ENXIO; |
diff --git a/drivers/video/backlight/pandora_bl.c b/drivers/video/backlight/pandora_bl.c index 633b0a22fd64..2098c5d6efb9 100644 --- a/drivers/video/backlight/pandora_bl.c +++ b/drivers/video/backlight/pandora_bl.c | |||
@@ -120,8 +120,8 @@ static int pandora_backlight_probe(struct platform_device *pdev) | |||
120 | memset(&props, 0, sizeof(props)); | 120 | memset(&props, 0, sizeof(props)); |
121 | props.max_brightness = MAX_USER_VALUE; | 121 | props.max_brightness = MAX_USER_VALUE; |
122 | props.type = BACKLIGHT_RAW; | 122 | props.type = BACKLIGHT_RAW; |
123 | bl = backlight_device_register(pdev->name, &pdev->dev, | 123 | bl = devm_backlight_device_register(&pdev->dev, pdev->name, &pdev->dev, |
124 | NULL, &pandora_backlight_ops, &props); | 124 | NULL, &pandora_backlight_ops, &props); |
125 | if (IS_ERR(bl)) { | 125 | if (IS_ERR(bl)) { |
126 | dev_err(&pdev->dev, "failed to register backlight\n"); | 126 | dev_err(&pdev->dev, "failed to register backlight\n"); |
127 | return PTR_ERR(bl); | 127 | return PTR_ERR(bl); |
@@ -145,20 +145,12 @@ static int pandora_backlight_probe(struct platform_device *pdev) | |||
145 | return 0; | 145 | return 0; |
146 | } | 146 | } |
147 | 147 | ||
148 | static int pandora_backlight_remove(struct platform_device *pdev) | ||
149 | { | ||
150 | struct backlight_device *bl = platform_get_drvdata(pdev); | ||
151 | backlight_device_unregister(bl); | ||
152 | return 0; | ||
153 | } | ||
154 | |||
155 | static struct platform_driver pandora_backlight_driver = { | 148 | static struct platform_driver pandora_backlight_driver = { |
156 | .driver = { | 149 | .driver = { |
157 | .name = "pandora-backlight", | 150 | .name = "pandora-backlight", |
158 | .owner = THIS_MODULE, | 151 | .owner = THIS_MODULE, |
159 | }, | 152 | }, |
160 | .probe = pandora_backlight_probe, | 153 | .probe = pandora_backlight_probe, |
161 | .remove = pandora_backlight_remove, | ||
162 | }; | 154 | }; |
163 | 155 | ||
164 | module_platform_driver(pandora_backlight_driver); | 156 | module_platform_driver(pandora_backlight_driver); |
diff --git a/drivers/video/backlight/pcf50633-backlight.c b/drivers/video/backlight/pcf50633-backlight.c index 6ed76be18f19..b95d3b0aaffe 100644 --- a/drivers/video/backlight/pcf50633-backlight.c +++ b/drivers/video/backlight/pcf50633-backlight.c | |||
@@ -103,7 +103,7 @@ static int pcf50633_bl_probe(struct platform_device *pdev) | |||
103 | { | 103 | { |
104 | struct pcf50633_bl *pcf_bl; | 104 | struct pcf50633_bl *pcf_bl; |
105 | struct device *parent = pdev->dev.parent; | 105 | struct device *parent = pdev->dev.parent; |
106 | struct pcf50633_platform_data *pcf50633_data = parent->platform_data; | 106 | struct pcf50633_platform_data *pcf50633_data = dev_get_platdata(parent); |
107 | struct pcf50633_bl_platform_data *pdata = pcf50633_data->backlight_data; | 107 | struct pcf50633_bl_platform_data *pdata = pcf50633_data->backlight_data; |
108 | struct backlight_properties bl_props; | 108 | struct backlight_properties bl_props; |
109 | 109 | ||
@@ -126,7 +126,8 @@ static int pcf50633_bl_probe(struct platform_device *pdev) | |||
126 | 126 | ||
127 | pcf_bl->pcf = dev_to_pcf50633(pdev->dev.parent); | 127 | pcf_bl->pcf = dev_to_pcf50633(pdev->dev.parent); |
128 | 128 | ||
129 | pcf_bl->bl = backlight_device_register(pdev->name, &pdev->dev, pcf_bl, | 129 | pcf_bl->bl = devm_backlight_device_register(&pdev->dev, pdev->name, |
130 | &pdev->dev, pcf_bl, | ||
130 | &pcf50633_bl_ops, &bl_props); | 131 | &pcf50633_bl_ops, &bl_props); |
131 | 132 | ||
132 | if (IS_ERR(pcf_bl->bl)) | 133 | if (IS_ERR(pcf_bl->bl)) |
@@ -147,18 +148,8 @@ static int pcf50633_bl_probe(struct platform_device *pdev) | |||
147 | return 0; | 148 | return 0; |
148 | } | 149 | } |
149 | 150 | ||
150 | static int pcf50633_bl_remove(struct platform_device *pdev) | ||
151 | { | ||
152 | struct pcf50633_bl *pcf_bl = platform_get_drvdata(pdev); | ||
153 | |||
154 | backlight_device_unregister(pcf_bl->bl); | ||
155 | |||
156 | return 0; | ||
157 | } | ||
158 | |||
159 | static struct platform_driver pcf50633_bl_driver = { | 151 | static struct platform_driver pcf50633_bl_driver = { |
160 | .probe = pcf50633_bl_probe, | 152 | .probe = pcf50633_bl_probe, |
161 | .remove = pcf50633_bl_remove, | ||
162 | .driver = { | 153 | .driver = { |
163 | .name = "pcf50633-backlight", | 154 | .name = "pcf50633-backlight", |
164 | }, | 155 | }, |
diff --git a/drivers/video/backlight/platform_lcd.c b/drivers/video/backlight/platform_lcd.c index 056836706708..d01884d4f1bf 100644 --- a/drivers/video/backlight/platform_lcd.c +++ b/drivers/video/backlight/platform_lcd.c | |||
@@ -80,7 +80,7 @@ static int platform_lcd_probe(struct platform_device *pdev) | |||
80 | struct device *dev = &pdev->dev; | 80 | struct device *dev = &pdev->dev; |
81 | int err; | 81 | int err; |
82 | 82 | ||
83 | pdata = pdev->dev.platform_data; | 83 | pdata = dev_get_platdata(&pdev->dev); |
84 | if (!pdata) { | 84 | if (!pdata) { |
85 | dev_err(dev, "no platform data supplied\n"); | 85 | dev_err(dev, "no platform data supplied\n"); |
86 | return -EINVAL; | 86 | return -EINVAL; |
@@ -101,30 +101,17 @@ static int platform_lcd_probe(struct platform_device *pdev) | |||
101 | 101 | ||
102 | plcd->us = dev; | 102 | plcd->us = dev; |
103 | plcd->pdata = pdata; | 103 | plcd->pdata = pdata; |
104 | plcd->lcd = lcd_device_register(dev_name(dev), dev, | 104 | plcd->lcd = devm_lcd_device_register(&pdev->dev, dev_name(dev), dev, |
105 | plcd, &platform_lcd_ops); | 105 | plcd, &platform_lcd_ops); |
106 | if (IS_ERR(plcd->lcd)) { | 106 | if (IS_ERR(plcd->lcd)) { |
107 | dev_err(dev, "cannot register lcd device\n"); | 107 | dev_err(dev, "cannot register lcd device\n"); |
108 | err = PTR_ERR(plcd->lcd); | 108 | return PTR_ERR(plcd->lcd); |
109 | goto err; | ||
110 | } | 109 | } |
111 | 110 | ||
112 | platform_set_drvdata(pdev, plcd); | 111 | platform_set_drvdata(pdev, plcd); |
113 | platform_lcd_set_power(plcd->lcd, FB_BLANK_NORMAL); | 112 | platform_lcd_set_power(plcd->lcd, FB_BLANK_NORMAL); |
114 | 113 | ||
115 | return 0; | 114 | return 0; |
116 | |||
117 | err: | ||
118 | return err; | ||
119 | } | ||
120 | |||
121 | static int platform_lcd_remove(struct platform_device *pdev) | ||
122 | { | ||
123 | struct platform_lcd *plcd = platform_get_drvdata(pdev); | ||
124 | |||
125 | lcd_device_unregister(plcd->lcd); | ||
126 | |||
127 | return 0; | ||
128 | } | 115 | } |
129 | 116 | ||
130 | #ifdef CONFIG_PM_SLEEP | 117 | #ifdef CONFIG_PM_SLEEP |
@@ -168,7 +155,6 @@ static struct platform_driver platform_lcd_driver = { | |||
168 | .of_match_table = of_match_ptr(platform_lcd_of_match), | 155 | .of_match_table = of_match_ptr(platform_lcd_of_match), |
169 | }, | 156 | }, |
170 | .probe = platform_lcd_probe, | 157 | .probe = platform_lcd_probe, |
171 | .remove = platform_lcd_remove, | ||
172 | }; | 158 | }; |
173 | 159 | ||
174 | module_platform_driver(platform_lcd_driver); | 160 | module_platform_driver(platform_lcd_driver); |
diff --git a/drivers/video/backlight/pwm_bl.c b/drivers/video/backlight/pwm_bl.c index 1fea627394d7..36db5d98dd2f 100644 --- a/drivers/video/backlight/pwm_bl.c +++ b/drivers/video/backlight/pwm_bl.c | |||
@@ -163,7 +163,7 @@ static int pwm_backlight_parse_dt(struct device *dev, | |||
163 | 163 | ||
164 | static int pwm_backlight_probe(struct platform_device *pdev) | 164 | static int pwm_backlight_probe(struct platform_device *pdev) |
165 | { | 165 | { |
166 | struct platform_pwm_backlight_data *data = pdev->dev.platform_data; | 166 | struct platform_pwm_backlight_data *data = dev_get_platdata(&pdev->dev); |
167 | struct platform_pwm_backlight_data defdata; | 167 | struct platform_pwm_backlight_data defdata; |
168 | struct backlight_properties props; | 168 | struct backlight_properties props; |
169 | struct backlight_device *bl; | 169 | struct backlight_device *bl; |
diff --git a/drivers/video/backlight/s6e63m0.c b/drivers/video/backlight/s6e63m0.c index b37bb1854bf4..510a1bcf76f1 100644 --- a/drivers/video/backlight/s6e63m0.c +++ b/drivers/video/backlight/s6e63m0.c | |||
@@ -735,13 +735,14 @@ static int s6e63m0_probe(struct spi_device *spi) | |||
735 | lcd->spi = spi; | 735 | lcd->spi = spi; |
736 | lcd->dev = &spi->dev; | 736 | lcd->dev = &spi->dev; |
737 | 737 | ||
738 | lcd->lcd_pd = spi->dev.platform_data; | 738 | lcd->lcd_pd = dev_get_platdata(&spi->dev); |
739 | if (!lcd->lcd_pd) { | 739 | if (!lcd->lcd_pd) { |
740 | dev_err(&spi->dev, "platform data is NULL.\n"); | 740 | dev_err(&spi->dev, "platform data is NULL.\n"); |
741 | return -EINVAL; | 741 | return -EINVAL; |
742 | } | 742 | } |
743 | 743 | ||
744 | ld = lcd_device_register("s6e63m0", &spi->dev, lcd, &s6e63m0_lcd_ops); | 744 | ld = devm_lcd_device_register(&spi->dev, "s6e63m0", &spi->dev, lcd, |
745 | &s6e63m0_lcd_ops); | ||
745 | if (IS_ERR(ld)) | 746 | if (IS_ERR(ld)) |
746 | return PTR_ERR(ld); | 747 | return PTR_ERR(ld); |
747 | 748 | ||
@@ -751,12 +752,11 @@ static int s6e63m0_probe(struct spi_device *spi) | |||
751 | props.type = BACKLIGHT_RAW; | 752 | props.type = BACKLIGHT_RAW; |
752 | props.max_brightness = MAX_BRIGHTNESS; | 753 | props.max_brightness = MAX_BRIGHTNESS; |
753 | 754 | ||
754 | bd = backlight_device_register("s6e63m0bl-bl", &spi->dev, lcd, | 755 | bd = devm_backlight_device_register(&spi->dev, "s6e63m0bl-bl", |
755 | &s6e63m0_backlight_ops, &props); | 756 | &spi->dev, lcd, &s6e63m0_backlight_ops, |
756 | if (IS_ERR(bd)) { | 757 | &props); |
757 | ret = PTR_ERR(bd); | 758 | if (IS_ERR(bd)) |
758 | goto out_lcd_unregister; | 759 | return PTR_ERR(bd); |
759 | } | ||
760 | 760 | ||
761 | bd->props.brightness = MAX_BRIGHTNESS; | 761 | bd->props.brightness = MAX_BRIGHTNESS; |
762 | lcd->bd = bd; | 762 | lcd->bd = bd; |
@@ -798,10 +798,6 @@ static int s6e63m0_probe(struct spi_device *spi) | |||
798 | dev_info(&spi->dev, "s6e63m0 panel driver has been probed.\n"); | 798 | dev_info(&spi->dev, "s6e63m0 panel driver has been probed.\n"); |
799 | 799 | ||
800 | return 0; | 800 | return 0; |
801 | |||
802 | out_lcd_unregister: | ||
803 | lcd_device_unregister(ld); | ||
804 | return ret; | ||
805 | } | 801 | } |
806 | 802 | ||
807 | static int s6e63m0_remove(struct spi_device *spi) | 803 | static int s6e63m0_remove(struct spi_device *spi) |
@@ -811,8 +807,6 @@ static int s6e63m0_remove(struct spi_device *spi) | |||
811 | s6e63m0_power(lcd, FB_BLANK_POWERDOWN); | 807 | s6e63m0_power(lcd, FB_BLANK_POWERDOWN); |
812 | device_remove_file(&spi->dev, &dev_attr_gamma_table); | 808 | device_remove_file(&spi->dev, &dev_attr_gamma_table); |
813 | device_remove_file(&spi->dev, &dev_attr_gamma_mode); | 809 | device_remove_file(&spi->dev, &dev_attr_gamma_mode); |
814 | backlight_device_unregister(lcd->bd); | ||
815 | lcd_device_unregister(lcd->ld); | ||
816 | 810 | ||
817 | return 0; | 811 | return 0; |
818 | } | 812 | } |
diff --git a/drivers/video/backlight/tdo24m.c b/drivers/video/backlight/tdo24m.c index 18cdf466d50a..908016fc5829 100644 --- a/drivers/video/backlight/tdo24m.c +++ b/drivers/video/backlight/tdo24m.c | |||
@@ -338,7 +338,7 @@ static int tdo24m_probe(struct spi_device *spi) | |||
338 | enum tdo24m_model model; | 338 | enum tdo24m_model model; |
339 | int err; | 339 | int err; |
340 | 340 | ||
341 | pdata = spi->dev.platform_data; | 341 | pdata = dev_get_platdata(&spi->dev); |
342 | if (pdata) | 342 | if (pdata) |
343 | model = pdata->model; | 343 | model = pdata->model; |
344 | else | 344 | else |
@@ -385,21 +385,17 @@ static int tdo24m_probe(struct spi_device *spi) | |||
385 | return -EINVAL; | 385 | return -EINVAL; |
386 | } | 386 | } |
387 | 387 | ||
388 | lcd->lcd_dev = lcd_device_register("tdo24m", &spi->dev, | 388 | lcd->lcd_dev = devm_lcd_device_register(&spi->dev, "tdo24m", &spi->dev, |
389 | lcd, &tdo24m_ops); | 389 | lcd, &tdo24m_ops); |
390 | if (IS_ERR(lcd->lcd_dev)) | 390 | if (IS_ERR(lcd->lcd_dev)) |
391 | return PTR_ERR(lcd->lcd_dev); | 391 | return PTR_ERR(lcd->lcd_dev); |
392 | 392 | ||
393 | spi_set_drvdata(spi, lcd); | 393 | spi_set_drvdata(spi, lcd); |
394 | err = tdo24m_power(lcd, FB_BLANK_UNBLANK); | 394 | err = tdo24m_power(lcd, FB_BLANK_UNBLANK); |
395 | if (err) | 395 | if (err) |
396 | goto out_unregister; | 396 | return err; |
397 | 397 | ||
398 | return 0; | 398 | return 0; |
399 | |||
400 | out_unregister: | ||
401 | lcd_device_unregister(lcd->lcd_dev); | ||
402 | return err; | ||
403 | } | 399 | } |
404 | 400 | ||
405 | static int tdo24m_remove(struct spi_device *spi) | 401 | static int tdo24m_remove(struct spi_device *spi) |
@@ -407,8 +403,6 @@ static int tdo24m_remove(struct spi_device *spi) | |||
407 | struct tdo24m *lcd = spi_get_drvdata(spi); | 403 | struct tdo24m *lcd = spi_get_drvdata(spi); |
408 | 404 | ||
409 | tdo24m_power(lcd, FB_BLANK_POWERDOWN); | 405 | tdo24m_power(lcd, FB_BLANK_POWERDOWN); |
410 | lcd_device_unregister(lcd->lcd_dev); | ||
411 | |||
412 | return 0; | 406 | return 0; |
413 | } | 407 | } |
414 | 408 | ||
diff --git a/drivers/video/backlight/tosa_bl.c b/drivers/video/backlight/tosa_bl.c index 9df66ac68b34..b8db9338cacd 100644 --- a/drivers/video/backlight/tosa_bl.c +++ b/drivers/video/backlight/tosa_bl.c | |||
@@ -38,7 +38,7 @@ struct tosa_bl_data { | |||
38 | 38 | ||
39 | static void tosa_bl_set_backlight(struct tosa_bl_data *data, int brightness) | 39 | static void tosa_bl_set_backlight(struct tosa_bl_data *data, int brightness) |
40 | { | 40 | { |
41 | struct spi_device *spi = data->i2c->dev.platform_data; | 41 | struct spi_device *spi = dev_get_platdata(&data->i2c->dev); |
42 | 42 | ||
43 | i2c_smbus_write_byte_data(data->i2c, DAC_CH1, data->comadj); | 43 | i2c_smbus_write_byte_data(data->i2c, DAC_CH1, data->comadj); |
44 | 44 | ||
diff --git a/drivers/video/backlight/tps65217_bl.c b/drivers/video/backlight/tps65217_bl.c index 05782312aeb3..cbba37e6836e 100644 --- a/drivers/video/backlight/tps65217_bl.c +++ b/drivers/video/backlight/tps65217_bl.c | |||
@@ -287,12 +287,11 @@ static int tps65217_bl_probe(struct platform_device *pdev) | |||
287 | if (IS_ERR(pdata)) | 287 | if (IS_ERR(pdata)) |
288 | return PTR_ERR(pdata); | 288 | return PTR_ERR(pdata); |
289 | } else { | 289 | } else { |
290 | if (!pdev->dev.platform_data) { | 290 | pdata = dev_get_platdata(&pdev->dev); |
291 | if (!pdata) { | ||
291 | dev_err(&pdev->dev, "no platform data provided\n"); | 292 | dev_err(&pdev->dev, "no platform data provided\n"); |
292 | return -EINVAL; | 293 | return -EINVAL; |
293 | } | 294 | } |
294 | |||
295 | pdata = pdev->dev.platform_data; | ||
296 | } | 295 | } |
297 | 296 | ||
298 | tps65217_bl = devm_kzalloc(&pdev->dev, sizeof(*tps65217_bl), | 297 | tps65217_bl = devm_kzalloc(&pdev->dev, sizeof(*tps65217_bl), |
@@ -314,7 +313,7 @@ static int tps65217_bl_probe(struct platform_device *pdev) | |||
314 | bl_props.type = BACKLIGHT_RAW; | 313 | bl_props.type = BACKLIGHT_RAW; |
315 | bl_props.max_brightness = 100; | 314 | bl_props.max_brightness = 100; |
316 | 315 | ||
317 | tps65217_bl->bl = backlight_device_register(pdev->name, | 316 | tps65217_bl->bl = devm_backlight_device_register(&pdev->dev, pdev->name, |
318 | tps65217_bl->dev, tps65217_bl, | 317 | tps65217_bl->dev, tps65217_bl, |
319 | &tps65217_bl_ops, &bl_props); | 318 | &tps65217_bl_ops, &bl_props); |
320 | if (IS_ERR(tps65217_bl->bl)) { | 319 | if (IS_ERR(tps65217_bl->bl)) { |
@@ -330,18 +329,8 @@ static int tps65217_bl_probe(struct platform_device *pdev) | |||
330 | return 0; | 329 | return 0; |
331 | } | 330 | } |
332 | 331 | ||
333 | static int tps65217_bl_remove(struct platform_device *pdev) | ||
334 | { | ||
335 | struct tps65217_bl *tps65217_bl = platform_get_drvdata(pdev); | ||
336 | |||
337 | backlight_device_unregister(tps65217_bl->bl); | ||
338 | |||
339 | return 0; | ||
340 | } | ||
341 | |||
342 | static struct platform_driver tps65217_bl_driver = { | 332 | static struct platform_driver tps65217_bl_driver = { |
343 | .probe = tps65217_bl_probe, | 333 | .probe = tps65217_bl_probe, |
344 | .remove = tps65217_bl_remove, | ||
345 | .driver = { | 334 | .driver = { |
346 | .owner = THIS_MODULE, | 335 | .owner = THIS_MODULE, |
347 | .name = "tps65217-bl", | 336 | .name = "tps65217-bl", |
diff --git a/drivers/video/backlight/wm831x_bl.c b/drivers/video/backlight/wm831x_bl.c index 9e5517a3a52b..8b9455e93069 100644 --- a/drivers/video/backlight/wm831x_bl.c +++ b/drivers/video/backlight/wm831x_bl.c | |||
@@ -123,7 +123,7 @@ static const struct backlight_ops wm831x_backlight_ops = { | |||
123 | static int wm831x_backlight_probe(struct platform_device *pdev) | 123 | static int wm831x_backlight_probe(struct platform_device *pdev) |
124 | { | 124 | { |
125 | struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent); | 125 | struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent); |
126 | struct wm831x_pdata *wm831x_pdata; | 126 | struct wm831x_pdata *wm831x_pdata = dev_get_platdata(pdev->dev.parent); |
127 | struct wm831x_backlight_pdata *pdata; | 127 | struct wm831x_backlight_pdata *pdata; |
128 | struct wm831x_backlight_data *data; | 128 | struct wm831x_backlight_data *data; |
129 | struct backlight_device *bl; | 129 | struct backlight_device *bl; |
@@ -131,12 +131,10 @@ static int wm831x_backlight_probe(struct platform_device *pdev) | |||
131 | int ret, i, max_isel, isink_reg, dcdc_cfg; | 131 | int ret, i, max_isel, isink_reg, dcdc_cfg; |
132 | 132 | ||
133 | /* We need platform data */ | 133 | /* We need platform data */ |
134 | if (pdev->dev.parent->platform_data) { | 134 | if (wm831x_pdata) |
135 | wm831x_pdata = pdev->dev.parent->platform_data; | ||
136 | pdata = wm831x_pdata->backlight; | 135 | pdata = wm831x_pdata->backlight; |
137 | } else { | 136 | else |
138 | pdata = NULL; | 137 | pdata = NULL; |
139 | } | ||
140 | 138 | ||
141 | if (!pdata) { | 139 | if (!pdata) { |
142 | dev_err(&pdev->dev, "No platform data supplied\n"); | 140 | dev_err(&pdev->dev, "No platform data supplied\n"); |
@@ -197,8 +195,8 @@ static int wm831x_backlight_probe(struct platform_device *pdev) | |||
197 | memset(&props, 0, sizeof(props)); | 195 | memset(&props, 0, sizeof(props)); |
198 | props.type = BACKLIGHT_RAW; | 196 | props.type = BACKLIGHT_RAW; |
199 | props.max_brightness = max_isel; | 197 | props.max_brightness = max_isel; |
200 | bl = backlight_device_register("wm831x", &pdev->dev, data, | 198 | bl = devm_backlight_device_register(&pdev->dev, "wm831x", &pdev->dev, |
201 | &wm831x_backlight_ops, &props); | 199 | data, &wm831x_backlight_ops, &props); |
202 | if (IS_ERR(bl)) { | 200 | if (IS_ERR(bl)) { |
203 | dev_err(&pdev->dev, "failed to register backlight\n"); | 201 | dev_err(&pdev->dev, "failed to register backlight\n"); |
204 | return PTR_ERR(bl); | 202 | return PTR_ERR(bl); |
@@ -216,21 +214,12 @@ static int wm831x_backlight_probe(struct platform_device *pdev) | |||
216 | return 0; | 214 | return 0; |
217 | } | 215 | } |
218 | 216 | ||
219 | static int wm831x_backlight_remove(struct platform_device *pdev) | ||
220 | { | ||
221 | struct backlight_device *bl = platform_get_drvdata(pdev); | ||
222 | |||
223 | backlight_device_unregister(bl); | ||
224 | return 0; | ||
225 | } | ||
226 | |||
227 | static struct platform_driver wm831x_backlight_driver = { | 217 | static struct platform_driver wm831x_backlight_driver = { |
228 | .driver = { | 218 | .driver = { |
229 | .name = "wm831x-backlight", | 219 | .name = "wm831x-backlight", |
230 | .owner = THIS_MODULE, | 220 | .owner = THIS_MODULE, |
231 | }, | 221 | }, |
232 | .probe = wm831x_backlight_probe, | 222 | .probe = wm831x_backlight_probe, |
233 | .remove = wm831x_backlight_remove, | ||
234 | }; | 223 | }; |
235 | 224 | ||
236 | module_platform_driver(wm831x_backlight_driver); | 225 | module_platform_driver(wm831x_backlight_driver); |
diff --git a/drivers/w1/masters/ds1wm.c b/drivers/w1/masters/ds1wm.c index 41613f92a723..02df3b1381d2 100644 --- a/drivers/w1/masters/ds1wm.c +++ b/drivers/w1/masters/ds1wm.c | |||
@@ -255,17 +255,17 @@ static int ds1wm_find_divisor(int gclk) | |||
255 | static void ds1wm_up(struct ds1wm_data *ds1wm_data) | 255 | static void ds1wm_up(struct ds1wm_data *ds1wm_data) |
256 | { | 256 | { |
257 | int divisor; | 257 | int divisor; |
258 | struct ds1wm_driver_data *plat = ds1wm_data->pdev->dev.platform_data; | 258 | struct device *dev = &ds1wm_data->pdev->dev; |
259 | struct ds1wm_driver_data *plat = dev_get_platdata(dev); | ||
259 | 260 | ||
260 | if (ds1wm_data->cell->enable) | 261 | if (ds1wm_data->cell->enable) |
261 | ds1wm_data->cell->enable(ds1wm_data->pdev); | 262 | ds1wm_data->cell->enable(ds1wm_data->pdev); |
262 | 263 | ||
263 | divisor = ds1wm_find_divisor(plat->clock_rate); | 264 | divisor = ds1wm_find_divisor(plat->clock_rate); |
264 | dev_dbg(&ds1wm_data->pdev->dev, | 265 | dev_dbg(dev, "found divisor 0x%x for clock %d\n", |
265 | "found divisor 0x%x for clock %d\n", divisor, plat->clock_rate); | 266 | divisor, plat->clock_rate); |
266 | if (divisor == 0) { | 267 | if (divisor == 0) { |
267 | dev_err(&ds1wm_data->pdev->dev, | 268 | dev_err(dev, "no suitable divisor for %dHz clock\n", |
268 | "no suitable divisor for %dHz clock\n", | ||
269 | plat->clock_rate); | 269 | plat->clock_rate); |
270 | return; | 270 | return; |
271 | } | 271 | } |
@@ -481,7 +481,7 @@ static int ds1wm_probe(struct platform_device *pdev) | |||
481 | ds1wm_data->cell = mfd_get_cell(pdev); | 481 | ds1wm_data->cell = mfd_get_cell(pdev); |
482 | if (!ds1wm_data->cell) | 482 | if (!ds1wm_data->cell) |
483 | return -ENODEV; | 483 | return -ENODEV; |
484 | plat = pdev->dev.platform_data; | 484 | plat = dev_get_platdata(&pdev->dev); |
485 | if (!plat) | 485 | if (!plat) |
486 | return -ENODEV; | 486 | return -ENODEV; |
487 | 487 | ||
diff --git a/drivers/w1/w1.c b/drivers/w1/w1.c index fa932c2f7d97..66efa96c4603 100644 --- a/drivers/w1/w1.c +++ b/drivers/w1/w1.c | |||
@@ -709,7 +709,7 @@ static int w1_attach_slave_device(struct w1_master *dev, struct w1_reg_num *rn) | |||
709 | 709 | ||
710 | sl->owner = THIS_MODULE; | 710 | sl->owner = THIS_MODULE; |
711 | sl->master = dev; | 711 | sl->master = dev; |
712 | set_bit(W1_SLAVE_ACTIVE, (long *)&sl->flags); | 712 | set_bit(W1_SLAVE_ACTIVE, &sl->flags); |
713 | 713 | ||
714 | memset(&msg, 0, sizeof(msg)); | 714 | memset(&msg, 0, sizeof(msg)); |
715 | memcpy(&sl->reg_num, rn, sizeof(sl->reg_num)); | 715 | memcpy(&sl->reg_num, rn, sizeof(sl->reg_num)); |
@@ -866,7 +866,7 @@ void w1_slave_found(struct w1_master *dev, u64 rn) | |||
866 | 866 | ||
867 | sl = w1_slave_search_device(dev, tmp); | 867 | sl = w1_slave_search_device(dev, tmp); |
868 | if (sl) { | 868 | if (sl) { |
869 | set_bit(W1_SLAVE_ACTIVE, (long *)&sl->flags); | 869 | set_bit(W1_SLAVE_ACTIVE, &sl->flags); |
870 | } else { | 870 | } else { |
871 | if (rn && tmp->crc == w1_calc_crc8((u8 *)&rn_le, 7)) | 871 | if (rn && tmp->crc == w1_calc_crc8((u8 *)&rn_le, 7)) |
872 | w1_attach_slave_device(dev, tmp); | 872 | w1_attach_slave_device(dev, tmp); |
@@ -984,14 +984,14 @@ void w1_search_process_cb(struct w1_master *dev, u8 search_type, | |||
984 | struct w1_slave *sl, *sln; | 984 | struct w1_slave *sl, *sln; |
985 | 985 | ||
986 | list_for_each_entry(sl, &dev->slist, w1_slave_entry) | 986 | list_for_each_entry(sl, &dev->slist, w1_slave_entry) |
987 | clear_bit(W1_SLAVE_ACTIVE, (long *)&sl->flags); | 987 | clear_bit(W1_SLAVE_ACTIVE, &sl->flags); |
988 | 988 | ||
989 | w1_search_devices(dev, search_type, cb); | 989 | w1_search_devices(dev, search_type, cb); |
990 | 990 | ||
991 | list_for_each_entry_safe(sl, sln, &dev->slist, w1_slave_entry) { | 991 | list_for_each_entry_safe(sl, sln, &dev->slist, w1_slave_entry) { |
992 | if (!test_bit(W1_SLAVE_ACTIVE, (unsigned long *)&sl->flags) && !--sl->ttl) | 992 | if (!test_bit(W1_SLAVE_ACTIVE, &sl->flags) && !--sl->ttl) |
993 | w1_slave_detach(sl); | 993 | w1_slave_detach(sl); |
994 | else if (test_bit(W1_SLAVE_ACTIVE, (unsigned long *)&sl->flags)) | 994 | else if (test_bit(W1_SLAVE_ACTIVE, &sl->flags)) |
995 | sl->ttl = dev->slave_ttl; | 995 | sl->ttl = dev->slave_ttl; |
996 | } | 996 | } |
997 | 997 | ||
diff --git a/drivers/w1/w1.h b/drivers/w1/w1.h index 45908e56c2f8..ca8081a101d6 100644 --- a/drivers/w1/w1.h +++ b/drivers/w1/w1.h | |||
@@ -67,8 +67,8 @@ struct w1_slave | |||
67 | struct w1_reg_num reg_num; | 67 | struct w1_reg_num reg_num; |
68 | atomic_t refcnt; | 68 | atomic_t refcnt; |
69 | u8 rom[9]; | 69 | u8 rom[9]; |
70 | u32 flags; | ||
71 | int ttl; | 70 | int ttl; |
71 | unsigned long flags; | ||
72 | 72 | ||
73 | struct w1_master *master; | 73 | struct w1_master *master; |
74 | struct w1_family *family; | 74 | struct w1_family *family; |