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; |
