diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-01-23 22:11:50 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-01-23 22:11:50 -0500 |
| commit | 3aacd625f20129f5a41ea3ff3b5353b0e4dabd01 (patch) | |
| tree | 7cf4ea65397f80098b30494df31cfc8f5fa26d63 /drivers | |
| parent | 7e21774db5cc9cf8fe93a64a2f0c6cf47db8ab24 (diff) | |
| parent | 2a1d689c9ba42a6066540fb221b6ecbd6298b728 (diff) | |
Merge branch 'akpm' (incoming from Andrew)
Merge second patch-bomb from Andrew Morton:
- various misc bits
- the rest of MM
- add generic fixmap.h, use it
- backlight updates
- dynamic_debug updates
- printk() updates
- checkpatch updates
- binfmt_elf
- ramfs
- init/
- autofs4
- drivers/rtc
- nilfs
- hfsplus
- Documentation/
- coredump
- procfs
- fork
- exec
- kexec
- kdump
- partitions
- rapidio
- rbtree
- userns
- memstick
- w1
- decompressors
* emailed patches from Andrew Morton <akpm@linux-foundation.org>: (197 commits)
lib/decompress_unlz4.c: always set an error return code on failures
romfs: fix returm err while getting inode in fill_super
drivers/w1/masters/w1-gpio.c: add strong pullup emulation
drivers/memstick/host/rtsx_pci_ms.c: fix ms card data transfer bug
userns: relax the posix_acl_valid() checks
arch/sh/kernel/dwarf.c: use rbtree postorder iteration helper instead of solution using repeated rb_erase()
fs-ext3-use-rbtree-postorder-iteration-helper-instead-of-opencoding-fix
fs/ext3: use rbtree postorder iteration helper instead of opencoding
fs/jffs2: use rbtree postorder iteration helper instead of opencoding
fs/ext4: use rbtree postorder iteration helper instead of opencoding
fs/ubifs: use rbtree postorder iteration helper instead of opencoding
net/netfilter/ipset/ip_set_hash_netiface.c: use rbtree postorder iteration instead of opencoding
rbtree/test: test rbtree_postorder_for_each_entry_safe()
rbtree/test: move rb_node to the middle of the test struct
rapidio: add modular rapidio core build into powerpc and mips branches
partitions/efi: complete documentation of gpt kernel param purpose
kdump: add /sys/kernel/vmcoreinfo ABI documentation
kdump: fix exported size of vmcoreinfo note
kexec: add sysctl to disable kexec_load
fs/exec.c: call arch_pick_mmap_layout() only once
...
Diffstat (limited to 'drivers')
38 files changed, 852 insertions, 220 deletions
diff --git a/drivers/block/Kconfig b/drivers/block/Kconfig index 86b9f37d102e..9ffa90c6201c 100644 --- a/drivers/block/Kconfig +++ b/drivers/block/Kconfig | |||
| @@ -368,7 +368,8 @@ config BLK_DEV_RAM | |||
| 368 | For details, read <file:Documentation/blockdev/ramdisk.txt>. | 368 | For details, read <file:Documentation/blockdev/ramdisk.txt>. |
| 369 | 369 | ||
| 370 | To compile this driver as a module, choose M here: the | 370 | To compile this driver as a module, choose M here: the |
| 371 | module will be called rd. | 371 | module will be called brd. An alias "rd" has been defined |
| 372 | for historical reasons. | ||
| 372 | 373 | ||
| 373 | Most normal users won't need the RAM disk functionality, and can | 374 | Most normal users won't need the RAM disk functionality, and can |
| 374 | thus say N here. | 375 | thus say N here. |
diff --git a/drivers/firmware/Kconfig b/drivers/firmware/Kconfig index 074787281c94..5a29fac951ec 100644 --- a/drivers/firmware/Kconfig +++ b/drivers/firmware/Kconfig | |||
| @@ -108,6 +108,9 @@ config DMI_SYSFS | |||
| 108 | under /sys/firmware/dmi when this option is enabled and | 108 | under /sys/firmware/dmi when this option is enabled and |
| 109 | loaded. | 109 | loaded. |
| 110 | 110 | ||
| 111 | config DMI_SCAN_MACHINE_NON_EFI_FALLBACK | ||
| 112 | bool | ||
| 113 | |||
| 111 | config ISCSI_IBFT_FIND | 114 | config ISCSI_IBFT_FIND |
| 112 | bool "iSCSI Boot Firmware Table Attributes" | 115 | bool "iSCSI Boot Firmware Table Attributes" |
| 113 | depends on X86 | 116 | depends on X86 |
diff --git a/drivers/firmware/dmi_scan.c b/drivers/firmware/dmi_scan.c index c7e81ff8f3ef..17afc51f3054 100644 --- a/drivers/firmware/dmi_scan.c +++ b/drivers/firmware/dmi_scan.c | |||
| @@ -116,7 +116,7 @@ static int __init dmi_walk_early(void (*decode)(const struct dmi_header *, | |||
| 116 | { | 116 | { |
| 117 | u8 *buf; | 117 | u8 *buf; |
| 118 | 118 | ||
| 119 | buf = dmi_ioremap(dmi_base, dmi_len); | 119 | buf = dmi_early_remap(dmi_base, dmi_len); |
| 120 | if (buf == NULL) | 120 | if (buf == NULL) |
| 121 | return -1; | 121 | return -1; |
| 122 | 122 | ||
| @@ -124,7 +124,7 @@ static int __init dmi_walk_early(void (*decode)(const struct dmi_header *, | |||
| 124 | 124 | ||
| 125 | add_device_randomness(buf, dmi_len); | 125 | add_device_randomness(buf, dmi_len); |
| 126 | 126 | ||
| 127 | dmi_iounmap(buf, dmi_len); | 127 | dmi_early_unmap(buf, dmi_len); |
| 128 | return 0; | 128 | return 0; |
| 129 | } | 129 | } |
| 130 | 130 | ||
| @@ -527,18 +527,18 @@ void __init dmi_scan_machine(void) | |||
| 527 | * needed during early boot. This also means we can | 527 | * needed during early boot. This also means we can |
| 528 | * iounmap the space when we're done with it. | 528 | * iounmap the space when we're done with it. |
| 529 | */ | 529 | */ |
| 530 | p = dmi_ioremap(efi.smbios, 32); | 530 | p = dmi_early_remap(efi.smbios, 32); |
| 531 | if (p == NULL) | 531 | if (p == NULL) |
| 532 | goto error; | 532 | goto error; |
| 533 | memcpy_fromio(buf, p, 32); | 533 | memcpy_fromio(buf, p, 32); |
| 534 | dmi_iounmap(p, 32); | 534 | dmi_early_unmap(p, 32); |
| 535 | 535 | ||
| 536 | if (!dmi_present(buf)) { | 536 | if (!dmi_present(buf)) { |
| 537 | dmi_available = 1; | 537 | dmi_available = 1; |
| 538 | goto out; | 538 | goto out; |
| 539 | } | 539 | } |
| 540 | } else { | 540 | } else if (IS_ENABLED(CONFIG_DMI_SCAN_MACHINE_NON_EFI_FALLBACK)) { |
| 541 | p = dmi_ioremap(0xF0000, 0x10000); | 541 | p = dmi_early_remap(0xF0000, 0x10000); |
| 542 | if (p == NULL) | 542 | if (p == NULL) |
| 543 | goto error; | 543 | goto error; |
| 544 | 544 | ||
| @@ -554,12 +554,12 @@ void __init dmi_scan_machine(void) | |||
| 554 | memcpy_fromio(buf + 16, q, 16); | 554 | memcpy_fromio(buf + 16, q, 16); |
| 555 | if (!dmi_present(buf)) { | 555 | if (!dmi_present(buf)) { |
| 556 | dmi_available = 1; | 556 | dmi_available = 1; |
| 557 | dmi_iounmap(p, 0x10000); | 557 | dmi_early_unmap(p, 0x10000); |
| 558 | goto out; | 558 | goto out; |
| 559 | } | 559 | } |
| 560 | memcpy(buf, buf + 16, 16); | 560 | memcpy(buf, buf + 16, 16); |
| 561 | } | 561 | } |
| 562 | dmi_iounmap(p, 0x10000); | 562 | dmi_early_unmap(p, 0x10000); |
| 563 | } | 563 | } |
| 564 | error: | 564 | error: |
| 565 | pr_info("DMI not present or invalid.\n"); | 565 | pr_info("DMI not present or invalid.\n"); |
| @@ -831,13 +831,13 @@ int dmi_walk(void (*decode)(const struct dmi_header *, void *), | |||
| 831 | if (!dmi_available) | 831 | if (!dmi_available) |
| 832 | return -1; | 832 | return -1; |
| 833 | 833 | ||
| 834 | buf = ioremap(dmi_base, dmi_len); | 834 | buf = dmi_remap(dmi_base, dmi_len); |
| 835 | if (buf == NULL) | 835 | if (buf == NULL) |
| 836 | return -1; | 836 | return -1; |
| 837 | 837 | ||
| 838 | dmi_table(buf, dmi_len, dmi_num, decode, private_data); | 838 | dmi_table(buf, dmi_len, dmi_num, decode, private_data); |
| 839 | 839 | ||
| 840 | iounmap(buf); | 840 | dmi_unmap(buf); |
| 841 | return 0; | 841 | return 0; |
| 842 | } | 842 | } |
| 843 | EXPORT_SYMBOL_GPL(dmi_walk); | 843 | EXPORT_SYMBOL_GPL(dmi_walk); |
diff --git a/drivers/gpu/drm/gma500/backlight.c b/drivers/gpu/drm/gma500/backlight.c index 143eba3309c5..ea7dfc59d796 100644 --- a/drivers/gpu/drm/gma500/backlight.c +++ b/drivers/gpu/drm/gma500/backlight.c | |||
| @@ -26,13 +26,13 @@ | |||
| 26 | #include "intel_bios.h" | 26 | #include "intel_bios.h" |
| 27 | #include "power.h" | 27 | #include "power.h" |
| 28 | 28 | ||
| 29 | #ifdef CONFIG_BACKLIGHT_CLASS_DEVICE | ||
| 29 | static void do_gma_backlight_set(struct drm_device *dev) | 30 | static void do_gma_backlight_set(struct drm_device *dev) |
| 30 | { | 31 | { |
| 31 | #ifdef CONFIG_BACKLIGHT_CLASS_DEVICE | ||
| 32 | struct drm_psb_private *dev_priv = dev->dev_private; | 32 | struct drm_psb_private *dev_priv = dev->dev_private; |
| 33 | backlight_update_status(dev_priv->backlight_device); | 33 | backlight_update_status(dev_priv->backlight_device); |
| 34 | #endif | ||
| 35 | } | 34 | } |
| 35 | #endif | ||
| 36 | 36 | ||
| 37 | void gma_backlight_enable(struct drm_device *dev) | 37 | void gma_backlight_enable(struct drm_device *dev) |
| 38 | { | 38 | { |
diff --git a/drivers/mailbox/omap-mbox.h b/drivers/mailbox/omap-mbox.h index 6cd38fc68599..86d7518cd13b 100644 --- a/drivers/mailbox/omap-mbox.h +++ b/drivers/mailbox/omap-mbox.h | |||
| @@ -52,7 +52,7 @@ struct omap_mbox_queue { | |||
| 52 | 52 | ||
| 53 | struct omap_mbox { | 53 | struct omap_mbox { |
| 54 | const char *name; | 54 | const char *name; |
| 55 | unsigned int irq; | 55 | int irq; |
| 56 | struct omap_mbox_queue *txq, *rxq; | 56 | struct omap_mbox_queue *txq, *rxq; |
| 57 | struct omap_mbox_ops *ops; | 57 | struct omap_mbox_ops *ops; |
| 58 | struct device *dev; | 58 | struct device *dev; |
diff --git a/drivers/memstick/host/rtsx_pci_ms.c b/drivers/memstick/host/rtsx_pci_ms.c index 25f8f93decb6..2a635b6fdaf7 100644 --- a/drivers/memstick/host/rtsx_pci_ms.c +++ b/drivers/memstick/host/rtsx_pci_ms.c | |||
| @@ -145,6 +145,8 @@ static int ms_transfer_data(struct realtek_pci_ms *host, unsigned char data_dir, | |||
| 145 | unsigned int length = sg->length; | 145 | unsigned int length = sg->length; |
| 146 | u16 sec_cnt = (u16)(length / 512); | 146 | u16 sec_cnt = (u16)(length / 512); |
| 147 | u8 val, trans_mode, dma_dir; | 147 | u8 val, trans_mode, dma_dir; |
| 148 | struct memstick_dev *card = host->msh->card; | ||
| 149 | bool pro_card = card->id.type == MEMSTICK_TYPE_PRO; | ||
| 148 | 150 | ||
| 149 | dev_dbg(ms_dev(host), "%s: tpc = 0x%02x, data_dir = %s, length = %d\n", | 151 | dev_dbg(ms_dev(host), "%s: tpc = 0x%02x, data_dir = %s, length = %d\n", |
| 150 | __func__, tpc, (data_dir == READ) ? "READ" : "WRITE", | 152 | __func__, tpc, (data_dir == READ) ? "READ" : "WRITE", |
| @@ -152,19 +154,21 @@ static int ms_transfer_data(struct realtek_pci_ms *host, unsigned char data_dir, | |||
| 152 | 154 | ||
| 153 | if (data_dir == READ) { | 155 | if (data_dir == READ) { |
| 154 | dma_dir = DMA_DIR_FROM_CARD; | 156 | dma_dir = DMA_DIR_FROM_CARD; |
| 155 | trans_mode = MS_TM_AUTO_READ; | 157 | trans_mode = pro_card ? MS_TM_AUTO_READ : MS_TM_NORMAL_READ; |
| 156 | } else { | 158 | } else { |
| 157 | dma_dir = DMA_DIR_TO_CARD; | 159 | dma_dir = DMA_DIR_TO_CARD; |
| 158 | trans_mode = MS_TM_AUTO_WRITE; | 160 | trans_mode = pro_card ? MS_TM_AUTO_WRITE : MS_TM_NORMAL_WRITE; |
| 159 | } | 161 | } |
| 160 | 162 | ||
| 161 | rtsx_pci_init_cmd(pcr); | 163 | rtsx_pci_init_cmd(pcr); |
| 162 | 164 | ||
| 163 | rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, MS_TPC, 0xFF, tpc); | 165 | rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, MS_TPC, 0xFF, tpc); |
| 164 | rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, MS_SECTOR_CNT_H, | 166 | if (pro_card) { |
| 165 | 0xFF, (u8)(sec_cnt >> 8)); | 167 | rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, MS_SECTOR_CNT_H, |
| 166 | rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, MS_SECTOR_CNT_L, | 168 | 0xFF, (u8)(sec_cnt >> 8)); |
| 167 | 0xFF, (u8)sec_cnt); | 169 | rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, MS_SECTOR_CNT_L, |
| 170 | 0xFF, (u8)sec_cnt); | ||
| 171 | } | ||
| 168 | rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, MS_TRANS_CFG, 0xFF, cfg); | 172 | rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, MS_TRANS_CFG, 0xFF, cfg); |
| 169 | 173 | ||
| 170 | rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, IRQSTAT0, | 174 | rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, IRQSTAT0, |
| @@ -192,8 +196,14 @@ static int ms_transfer_data(struct realtek_pci_ms *host, unsigned char data_dir, | |||
| 192 | } | 196 | } |
| 193 | 197 | ||
| 194 | rtsx_pci_read_register(pcr, MS_TRANS_CFG, &val); | 198 | rtsx_pci_read_register(pcr, MS_TRANS_CFG, &val); |
| 195 | if (val & (MS_INT_CMDNK | MS_INT_ERR | MS_CRC16_ERR | MS_RDY_TIMEOUT)) | 199 | if (pro_card) { |
| 196 | return -EIO; | 200 | if (val & (MS_INT_CMDNK | MS_INT_ERR | |
| 201 | MS_CRC16_ERR | MS_RDY_TIMEOUT)) | ||
| 202 | return -EIO; | ||
| 203 | } else { | ||
| 204 | if (val & (MS_CRC16_ERR | MS_RDY_TIMEOUT)) | ||
| 205 | return -EIO; | ||
| 206 | } | ||
| 197 | 207 | ||
| 198 | return 0; | 208 | return 0; |
| 199 | } | 209 | } |
| @@ -462,8 +472,8 @@ static int rtsx_pci_ms_set_param(struct memstick_host *msh, | |||
| 462 | clock = 19000000; | 472 | clock = 19000000; |
| 463 | ssc_depth = RTSX_SSC_DEPTH_500K; | 473 | ssc_depth = RTSX_SSC_DEPTH_500K; |
| 464 | 474 | ||
| 465 | err = rtsx_pci_write_register(pcr, MS_CFG, | 475 | err = rtsx_pci_write_register(pcr, MS_CFG, 0x58, |
| 466 | 0x18, MS_BUS_WIDTH_1); | 476 | MS_BUS_WIDTH_1 | PUSH_TIME_DEFAULT); |
| 467 | if (err < 0) | 477 | if (err < 0) |
| 468 | return err; | 478 | return err; |
| 469 | } else if (value == MEMSTICK_PAR4) { | 479 | } else if (value == MEMSTICK_PAR4) { |
diff --git a/drivers/mfd/max8998.c b/drivers/mfd/max8998.c index f47eaa70eae0..612ca404e150 100644 --- a/drivers/mfd/max8998.c +++ b/drivers/mfd/max8998.c | |||
| @@ -175,7 +175,7 @@ static inline int max8998_i2c_get_driver_data(struct i2c_client *i2c, | |||
| 175 | if (IS_ENABLED(CONFIG_OF) && i2c->dev.of_node) { | 175 | if (IS_ENABLED(CONFIG_OF) && i2c->dev.of_node) { |
| 176 | const struct of_device_id *match; | 176 | const struct of_device_id *match; |
| 177 | match = of_match_node(max8998_dt_match, i2c->dev.of_node); | 177 | match = of_match_node(max8998_dt_match, i2c->dev.of_node); |
| 178 | return (int)match->data; | 178 | return (int)(long)match->data; |
| 179 | } | 179 | } |
| 180 | 180 | ||
| 181 | return (int)id->driver_data; | 181 | return (int)id->driver_data; |
diff --git a/drivers/mfd/tps65217.c b/drivers/mfd/tps65217.c index 6939ae56c2e1..966cf65c5c36 100644 --- a/drivers/mfd/tps65217.c +++ b/drivers/mfd/tps65217.c | |||
| @@ -170,7 +170,7 @@ static int tps65217_probe(struct i2c_client *client, | |||
| 170 | "Failed to find matching dt id\n"); | 170 | "Failed to find matching dt id\n"); |
| 171 | return -EINVAL; | 171 | return -EINVAL; |
| 172 | } | 172 | } |
| 173 | chip_id = (unsigned int)match->data; | 173 | chip_id = (unsigned int)(unsigned long)match->data; |
| 174 | status_off = of_property_read_bool(client->dev.of_node, | 174 | status_off = of_property_read_bool(client->dev.of_node, |
| 175 | "ti,pmic-shutdown-controller"); | 175 | "ti,pmic-shutdown-controller"); |
| 176 | } | 176 | } |
diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig index b1328a45b095..db933decc39c 100644 --- a/drivers/rtc/Kconfig +++ b/drivers/rtc/Kconfig | |||
| @@ -212,6 +212,17 @@ config RTC_DRV_DS3232 | |||
| 212 | This driver can also be built as a module. If so, the module | 212 | This driver can also be built as a module. If so, the module |
| 213 | will be called rtc-ds3232. | 213 | will be called rtc-ds3232. |
| 214 | 214 | ||
| 215 | config RTC_DRV_HYM8563 | ||
| 216 | tristate "Haoyu Microelectronics HYM8563" | ||
| 217 | depends on I2C && OF | ||
| 218 | help | ||
| 219 | Say Y to enable support for the HYM8563 I2C RTC chip. Apart | ||
| 220 | from the usual rtc functions it provides a clock output of | ||
| 221 | up to 32kHz. | ||
| 222 | |||
| 223 | This driver can also be built as a module. If so, the module | ||
| 224 | will be called rtc-hym8563. | ||
| 225 | |||
| 215 | config RTC_DRV_LP8788 | 226 | config RTC_DRV_LP8788 |
| 216 | tristate "TI LP8788 RTC driver" | 227 | tristate "TI LP8788 RTC driver" |
| 217 | depends on MFD_LP8788 | 228 | depends on MFD_LP8788 |
| @@ -637,7 +648,7 @@ comment "Platform RTC drivers" | |||
| 637 | 648 | ||
| 638 | config RTC_DRV_CMOS | 649 | config RTC_DRV_CMOS |
| 639 | tristate "PC-style 'CMOS'" | 650 | tristate "PC-style 'CMOS'" |
| 640 | depends on X86 || ARM || M32R || ATARI || PPC || MIPS || SPARC64 | 651 | depends on X86 || ARM || M32R || PPC || MIPS || SPARC64 |
| 641 | default y if X86 | 652 | default y if X86 |
| 642 | help | 653 | help |
| 643 | Say "yes" here to get direct support for the real time clock | 654 | Say "yes" here to get direct support for the real time clock |
diff --git a/drivers/rtc/Makefile b/drivers/rtc/Makefile index c00741a0bf10..b427bf7dd20d 100644 --- a/drivers/rtc/Makefile +++ b/drivers/rtc/Makefile | |||
| @@ -55,6 +55,7 @@ obj-$(CONFIG_RTC_DRV_EP93XX) += rtc-ep93xx.o | |||
| 55 | obj-$(CONFIG_RTC_DRV_FM3130) += rtc-fm3130.o | 55 | obj-$(CONFIG_RTC_DRV_FM3130) += rtc-fm3130.o |
| 56 | obj-$(CONFIG_RTC_DRV_GENERIC) += rtc-generic.o | 56 | obj-$(CONFIG_RTC_DRV_GENERIC) += rtc-generic.o |
| 57 | obj-$(CONFIG_RTC_DRV_HID_SENSOR_TIME) += rtc-hid-sensor-time.o | 57 | obj-$(CONFIG_RTC_DRV_HID_SENSOR_TIME) += rtc-hid-sensor-time.o |
| 58 | obj-$(CONFIG_RTC_DRV_HYM8563) += rtc-hym8563.o | ||
| 58 | obj-$(CONFIG_RTC_DRV_IMXDI) += rtc-imxdi.o | 59 | obj-$(CONFIG_RTC_DRV_IMXDI) += rtc-imxdi.o |
| 59 | obj-$(CONFIG_RTC_DRV_ISL1208) += rtc-isl1208.o | 60 | obj-$(CONFIG_RTC_DRV_ISL1208) += rtc-isl1208.o |
| 60 | obj-$(CONFIG_RTC_DRV_ISL12022) += rtc-isl12022.o | 61 | obj-$(CONFIG_RTC_DRV_ISL12022) += rtc-isl12022.o |
diff --git a/drivers/rtc/class.c b/drivers/rtc/class.c index 02426812bebc..589351ef75d0 100644 --- a/drivers/rtc/class.c +++ b/drivers/rtc/class.c | |||
| @@ -14,6 +14,7 @@ | |||
| 14 | #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt | 14 | #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt |
| 15 | 15 | ||
| 16 | #include <linux/module.h> | 16 | #include <linux/module.h> |
| 17 | #include <linux/of.h> | ||
| 17 | #include <linux/rtc.h> | 18 | #include <linux/rtc.h> |
| 18 | #include <linux/kdev_t.h> | 19 | #include <linux/kdev_t.h> |
| 19 | #include <linux/idr.h> | 20 | #include <linux/idr.h> |
| @@ -157,12 +158,27 @@ struct rtc_device *rtc_device_register(const char *name, struct device *dev, | |||
| 157 | { | 158 | { |
| 158 | struct rtc_device *rtc; | 159 | struct rtc_device *rtc; |
| 159 | struct rtc_wkalrm alrm; | 160 | struct rtc_wkalrm alrm; |
| 160 | int id, err; | 161 | int of_id = -1, id = -1, err; |
| 162 | |||
| 163 | if (dev->of_node) | ||
| 164 | of_id = of_alias_get_id(dev->of_node, "rtc"); | ||
| 165 | else if (dev->parent && dev->parent->of_node) | ||
| 166 | of_id = of_alias_get_id(dev->parent->of_node, "rtc"); | ||
| 167 | |||
| 168 | if (of_id >= 0) { | ||
| 169 | id = ida_simple_get(&rtc_ida, of_id, of_id + 1, | ||
| 170 | GFP_KERNEL); | ||
| 171 | if (id < 0) | ||
| 172 | dev_warn(dev, "/aliases ID %d not available\n", | ||
| 173 | of_id); | ||
| 174 | } | ||
| 161 | 175 | ||
| 162 | id = ida_simple_get(&rtc_ida, 0, 0, GFP_KERNEL); | ||
| 163 | if (id < 0) { | 176 | if (id < 0) { |
| 164 | err = id; | 177 | id = ida_simple_get(&rtc_ida, 0, 0, GFP_KERNEL); |
| 165 | goto exit; | 178 | if (id < 0) { |
| 179 | err = id; | ||
| 180 | goto exit; | ||
| 181 | } | ||
| 166 | } | 182 | } |
| 167 | 183 | ||
| 168 | rtc = kzalloc(sizeof(struct rtc_device), GFP_KERNEL); | 184 | rtc = kzalloc(sizeof(struct rtc_device), GFP_KERNEL); |
diff --git a/drivers/rtc/rtc-as3722.c b/drivers/rtc/rtc-as3722.c index 9cfa8170a2d6..4af016985890 100644 --- a/drivers/rtc/rtc-as3722.c +++ b/drivers/rtc/rtc-as3722.c | |||
| @@ -198,7 +198,7 @@ static int as3722_rtc_probe(struct platform_device *pdev) | |||
| 198 | 198 | ||
| 199 | device_init_wakeup(&pdev->dev, 1); | 199 | device_init_wakeup(&pdev->dev, 1); |
| 200 | 200 | ||
| 201 | as3722_rtc->rtc = rtc_device_register("as3722", &pdev->dev, | 201 | as3722_rtc->rtc = devm_rtc_device_register(&pdev->dev, "as3722-rtc", |
| 202 | &as3722_rtc_ops, THIS_MODULE); | 202 | &as3722_rtc_ops, THIS_MODULE); |
| 203 | if (IS_ERR(as3722_rtc->rtc)) { | 203 | if (IS_ERR(as3722_rtc->rtc)) { |
| 204 | ret = PTR_ERR(as3722_rtc->rtc); | 204 | ret = PTR_ERR(as3722_rtc->rtc); |
| @@ -209,28 +209,16 @@ static int as3722_rtc_probe(struct platform_device *pdev) | |||
| 209 | as3722_rtc->alarm_irq = platform_get_irq(pdev, 0); | 209 | as3722_rtc->alarm_irq = platform_get_irq(pdev, 0); |
| 210 | dev_info(&pdev->dev, "RTC interrupt %d\n", as3722_rtc->alarm_irq); | 210 | dev_info(&pdev->dev, "RTC interrupt %d\n", as3722_rtc->alarm_irq); |
| 211 | 211 | ||
| 212 | ret = request_threaded_irq(as3722_rtc->alarm_irq, NULL, | 212 | ret = devm_request_threaded_irq(&pdev->dev, as3722_rtc->alarm_irq, NULL, |
| 213 | as3722_alarm_irq, IRQF_ONESHOT | IRQF_EARLY_RESUME, | 213 | as3722_alarm_irq, IRQF_ONESHOT | IRQF_EARLY_RESUME, |
| 214 | "rtc-alarm", as3722_rtc); | 214 | "rtc-alarm", as3722_rtc); |
| 215 | if (ret < 0) { | 215 | if (ret < 0) { |
| 216 | dev_err(&pdev->dev, "Failed to request alarm IRQ %d: %d\n", | 216 | dev_err(&pdev->dev, "Failed to request alarm IRQ %d: %d\n", |
| 217 | as3722_rtc->alarm_irq, ret); | 217 | as3722_rtc->alarm_irq, ret); |
| 218 | goto scrub; | 218 | return ret; |
| 219 | } | 219 | } |
| 220 | disable_irq(as3722_rtc->alarm_irq); | 220 | disable_irq(as3722_rtc->alarm_irq); |
| 221 | return 0; | 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 | } | 222 | } |
| 235 | 223 | ||
| 236 | #ifdef CONFIG_PM_SLEEP | 224 | #ifdef CONFIG_PM_SLEEP |
| @@ -260,7 +248,6 @@ static const struct dev_pm_ops as3722_rtc_pm_ops = { | |||
| 260 | 248 | ||
| 261 | static struct platform_driver as3722_rtc_driver = { | 249 | static struct platform_driver as3722_rtc_driver = { |
| 262 | .probe = as3722_rtc_probe, | 250 | .probe = as3722_rtc_probe, |
| 263 | .remove = as3722_rtc_remove, | ||
| 264 | .driver = { | 251 | .driver = { |
| 265 | .name = "as3722-rtc", | 252 | .name = "as3722-rtc", |
| 266 | .pm = &as3722_rtc_pm_ops, | 253 | .pm = &as3722_rtc_pm_ops, |
diff --git a/drivers/rtc/rtc-cmos.c b/drivers/rtc/rtc-cmos.c index a2325bc5e497..cae212f30d65 100644 --- a/drivers/rtc/rtc-cmos.c +++ b/drivers/rtc/rtc-cmos.c | |||
| @@ -756,11 +756,9 @@ cmos_do_probe(struct device *dev, struct resource *ports, int rtc_irq) | |||
| 756 | irq_handler_t rtc_cmos_int_handler; | 756 | irq_handler_t rtc_cmos_int_handler; |
| 757 | 757 | ||
| 758 | if (is_hpet_enabled()) { | 758 | if (is_hpet_enabled()) { |
| 759 | int err; | ||
| 760 | |||
| 761 | rtc_cmos_int_handler = hpet_rtc_interrupt; | 759 | rtc_cmos_int_handler = hpet_rtc_interrupt; |
| 762 | err = hpet_register_irq_handler(cmos_interrupt); | 760 | retval = hpet_register_irq_handler(cmos_interrupt); |
| 763 | if (err != 0) { | 761 | if (retval) { |
| 764 | dev_warn(dev, "hpet_register_irq_handler " | 762 | dev_warn(dev, "hpet_register_irq_handler " |
| 765 | " failed in rtc_init()."); | 763 | " failed in rtc_init()."); |
| 766 | goto cleanup1; | 764 | goto cleanup1; |
| @@ -1175,7 +1173,7 @@ static struct platform_driver cmos_platform_driver = { | |||
| 1175 | .remove = __exit_p(cmos_platform_remove), | 1173 | .remove = __exit_p(cmos_platform_remove), |
| 1176 | .shutdown = cmos_platform_shutdown, | 1174 | .shutdown = cmos_platform_shutdown, |
| 1177 | .driver = { | 1175 | .driver = { |
| 1178 | .name = (char *) driver_name, | 1176 | .name = driver_name, |
| 1179 | #ifdef CONFIG_PM | 1177 | #ifdef CONFIG_PM |
| 1180 | .pm = &cmos_pm_ops, | 1178 | .pm = &cmos_pm_ops, |
| 1181 | #endif | 1179 | #endif |
diff --git a/drivers/rtc/rtc-ds1305.c b/drivers/rtc/rtc-ds1305.c index 80f323731ee2..2dd586a19b59 100644 --- a/drivers/rtc/rtc-ds1305.c +++ b/drivers/rtc/rtc-ds1305.c | |||
| @@ -787,7 +787,6 @@ static int ds1305_remove(struct spi_device *spi) | |||
| 787 | cancel_work_sync(&ds1305->work); | 787 | cancel_work_sync(&ds1305->work); |
| 788 | } | 788 | } |
| 789 | 789 | ||
| 790 | spi_set_drvdata(spi, NULL); | ||
| 791 | return 0; | 790 | return 0; |
| 792 | } | 791 | } |
| 793 | 792 | ||
diff --git a/drivers/rtc/rtc-ds1742.c b/drivers/rtc/rtc-ds1742.c index 17b73fdc3b6e..5a1f3b2a8f1e 100644 --- a/drivers/rtc/rtc-ds1742.c +++ b/drivers/rtc/rtc-ds1742.c | |||
| @@ -13,12 +13,13 @@ | |||
| 13 | */ | 13 | */ |
| 14 | 14 | ||
| 15 | #include <linux/bcd.h> | 15 | #include <linux/bcd.h> |
| 16 | #include <linux/init.h> | ||
| 17 | #include <linux/kernel.h> | 16 | #include <linux/kernel.h> |
| 18 | #include <linux/gfp.h> | 17 | #include <linux/gfp.h> |
| 19 | #include <linux/delay.h> | 18 | #include <linux/delay.h> |
| 20 | #include <linux/jiffies.h> | 19 | #include <linux/jiffies.h> |
| 21 | #include <linux/rtc.h> | 20 | #include <linux/rtc.h> |
| 21 | #include <linux/of.h> | ||
| 22 | #include <linux/of_device.h> | ||
| 22 | #include <linux/platform_device.h> | 23 | #include <linux/platform_device.h> |
| 23 | #include <linux/io.h> | 24 | #include <linux/io.h> |
| 24 | #include <linux/module.h> | 25 | #include <linux/module.h> |
| @@ -215,12 +216,19 @@ static int ds1742_rtc_remove(struct platform_device *pdev) | |||
| 215 | return 0; | 216 | return 0; |
| 216 | } | 217 | } |
| 217 | 218 | ||
| 219 | static struct of_device_id __maybe_unused ds1742_rtc_of_match[] = { | ||
| 220 | { .compatible = "maxim,ds1742", }, | ||
| 221 | { } | ||
| 222 | }; | ||
| 223 | MODULE_DEVICE_TABLE(of, ds1742_rtc_of_match); | ||
| 224 | |||
| 218 | static struct platform_driver ds1742_rtc_driver = { | 225 | static struct platform_driver ds1742_rtc_driver = { |
| 219 | .probe = ds1742_rtc_probe, | 226 | .probe = ds1742_rtc_probe, |
| 220 | .remove = ds1742_rtc_remove, | 227 | .remove = ds1742_rtc_remove, |
| 221 | .driver = { | 228 | .driver = { |
| 222 | .name = "rtc-ds1742", | 229 | .name = "rtc-ds1742", |
| 223 | .owner = THIS_MODULE, | 230 | .owner = THIS_MODULE, |
| 231 | .of_match_table = ds1742_rtc_of_match, | ||
| 224 | }, | 232 | }, |
| 225 | }; | 233 | }; |
| 226 | 234 | ||
diff --git a/drivers/rtc/rtc-hym8563.c b/drivers/rtc/rtc-hym8563.c new file mode 100644 index 000000000000..bd628a6f981d --- /dev/null +++ b/drivers/rtc/rtc-hym8563.c | |||
| @@ -0,0 +1,606 @@ | |||
| 1 | /* | ||
| 2 | * Haoyu HYM8563 RTC driver | ||
| 3 | * | ||
| 4 | * Copyright (C) 2013 MundoReader S.L. | ||
| 5 | * Author: Heiko Stuebner <heiko@sntech.de> | ||
| 6 | * | ||
| 7 | * based on rtc-HYM8563 | ||
| 8 | * Copyright (C) 2010 ROCKCHIP, Inc. | ||
| 9 | * | ||
| 10 | * This software is licensed under the terms of the GNU General Public | ||
| 11 | * License version 2, as published by the Free Software Foundation, and | ||
| 12 | * may be copied, distributed, and modified under those terms. | ||
| 13 | * | ||
| 14 | * This program is distributed in the hope that it will be useful, | ||
| 15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 17 | * GNU General Public License for more details. | ||
| 18 | */ | ||
| 19 | |||
| 20 | #include <linux/module.h> | ||
| 21 | #include <linux/clk-provider.h> | ||
| 22 | #include <linux/i2c.h> | ||
| 23 | #include <linux/bcd.h> | ||
| 24 | #include <linux/rtc.h> | ||
| 25 | |||
| 26 | #define HYM8563_CTL1 0x00 | ||
| 27 | #define HYM8563_CTL1_TEST BIT(7) | ||
| 28 | #define HYM8563_CTL1_STOP BIT(5) | ||
| 29 | #define HYM8563_CTL1_TESTC BIT(3) | ||
| 30 | |||
| 31 | #define HYM8563_CTL2 0x01 | ||
| 32 | #define HYM8563_CTL2_TI_TP BIT(4) | ||
| 33 | #define HYM8563_CTL2_AF BIT(3) | ||
| 34 | #define HYM8563_CTL2_TF BIT(2) | ||
| 35 | #define HYM8563_CTL2_AIE BIT(1) | ||
| 36 | #define HYM8563_CTL2_TIE BIT(0) | ||
| 37 | |||
| 38 | #define HYM8563_SEC 0x02 | ||
| 39 | #define HYM8563_SEC_VL BIT(7) | ||
| 40 | #define HYM8563_SEC_MASK 0x7f | ||
| 41 | |||
| 42 | #define HYM8563_MIN 0x03 | ||
| 43 | #define HYM8563_MIN_MASK 0x7f | ||
| 44 | |||
| 45 | #define HYM8563_HOUR 0x04 | ||
| 46 | #define HYM8563_HOUR_MASK 0x3f | ||
| 47 | |||
| 48 | #define HYM8563_DAY 0x05 | ||
| 49 | #define HYM8563_DAY_MASK 0x3f | ||
| 50 | |||
| 51 | #define HYM8563_WEEKDAY 0x06 | ||
| 52 | #define HYM8563_WEEKDAY_MASK 0x07 | ||
| 53 | |||
| 54 | #define HYM8563_MONTH 0x07 | ||
| 55 | #define HYM8563_MONTH_CENTURY BIT(7) | ||
| 56 | #define HYM8563_MONTH_MASK 0x1f | ||
| 57 | |||
| 58 | #define HYM8563_YEAR 0x08 | ||
| 59 | |||
| 60 | #define HYM8563_ALM_MIN 0x09 | ||
| 61 | #define HYM8563_ALM_HOUR 0x0a | ||
| 62 | #define HYM8563_ALM_DAY 0x0b | ||
| 63 | #define HYM8563_ALM_WEEK 0x0c | ||
| 64 | |||
| 65 | /* Each alarm check can be disabled by setting this bit in the register */ | ||
| 66 | #define HYM8563_ALM_BIT_DISABLE BIT(7) | ||
| 67 | |||
| 68 | #define HYM8563_CLKOUT 0x0d | ||
| 69 | #define HYM8563_CLKOUT_DISABLE BIT(7) | ||
| 70 | #define HYM8563_CLKOUT_32768 0 | ||
| 71 | #define HYM8563_CLKOUT_1024 1 | ||
| 72 | #define HYM8563_CLKOUT_32 2 | ||
| 73 | #define HYM8563_CLKOUT_1 3 | ||
| 74 | #define HYM8563_CLKOUT_MASK 3 | ||
| 75 | |||
| 76 | #define HYM8563_TMR_CTL 0x0e | ||
| 77 | #define HYM8563_TMR_CTL_ENABLE BIT(7) | ||
| 78 | #define HYM8563_TMR_CTL_4096 0 | ||
| 79 | #define HYM8563_TMR_CTL_64 1 | ||
| 80 | #define HYM8563_TMR_CTL_1 2 | ||
| 81 | #define HYM8563_TMR_CTL_1_60 3 | ||
| 82 | #define HYM8563_TMR_CTL_MASK 3 | ||
| 83 | |||
| 84 | #define HYM8563_TMR_CNT 0x0f | ||
| 85 | |||
| 86 | struct hym8563 { | ||
| 87 | struct i2c_client *client; | ||
| 88 | struct rtc_device *rtc; | ||
| 89 | bool valid; | ||
| 90 | #ifdef CONFIG_COMMON_CLK | ||
| 91 | struct clk_hw clkout_hw; | ||
| 92 | #endif | ||
| 93 | }; | ||
| 94 | |||
| 95 | /* | ||
| 96 | * RTC handling | ||
| 97 | */ | ||
| 98 | |||
| 99 | static int hym8563_rtc_read_time(struct device *dev, struct rtc_time *tm) | ||
| 100 | { | ||
| 101 | struct i2c_client *client = to_i2c_client(dev); | ||
| 102 | struct hym8563 *hym8563 = i2c_get_clientdata(client); | ||
| 103 | u8 buf[7]; | ||
| 104 | int ret; | ||
| 105 | |||
| 106 | if (!hym8563->valid) { | ||
| 107 | dev_warn(&client->dev, "no valid clock/calendar values available\n"); | ||
| 108 | return -EPERM; | ||
| 109 | } | ||
| 110 | |||
| 111 | ret = i2c_smbus_read_i2c_block_data(client, HYM8563_SEC, 7, buf); | ||
| 112 | |||
| 113 | tm->tm_sec = bcd2bin(buf[0] & HYM8563_SEC_MASK); | ||
| 114 | tm->tm_min = bcd2bin(buf[1] & HYM8563_MIN_MASK); | ||
| 115 | tm->tm_hour = bcd2bin(buf[2] & HYM8563_HOUR_MASK); | ||
| 116 | tm->tm_mday = bcd2bin(buf[3] & HYM8563_DAY_MASK); | ||
| 117 | tm->tm_wday = bcd2bin(buf[4] & HYM8563_WEEKDAY_MASK); /* 0 = Sun */ | ||
| 118 | tm->tm_mon = bcd2bin(buf[5] & HYM8563_MONTH_MASK) - 1; /* 0 = Jan */ | ||
| 119 | tm->tm_year = bcd2bin(buf[6]) + 100; | ||
| 120 | |||
| 121 | return 0; | ||
| 122 | } | ||
| 123 | |||
| 124 | static int hym8563_rtc_set_time(struct device *dev, struct rtc_time *tm) | ||
| 125 | { | ||
| 126 | struct i2c_client *client = to_i2c_client(dev); | ||
| 127 | struct hym8563 *hym8563 = i2c_get_clientdata(client); | ||
| 128 | u8 buf[7]; | ||
| 129 | int ret; | ||
| 130 | |||
| 131 | /* Years >= 2100 are to far in the future, 19XX is to early */ | ||
| 132 | if (tm->tm_year < 100 || tm->tm_year >= 200) | ||
| 133 | return -EINVAL; | ||
| 134 | |||
| 135 | buf[0] = bin2bcd(tm->tm_sec); | ||
| 136 | buf[1] = bin2bcd(tm->tm_min); | ||
| 137 | buf[2] = bin2bcd(tm->tm_hour); | ||
| 138 | buf[3] = bin2bcd(tm->tm_mday); | ||
| 139 | buf[4] = bin2bcd(tm->tm_wday); | ||
| 140 | buf[5] = bin2bcd(tm->tm_mon + 1); | ||
| 141 | |||
| 142 | /* | ||
| 143 | * While the HYM8563 has a century flag in the month register, | ||
| 144 | * it does not seem to carry it over a subsequent write/read. | ||
| 145 | * So we'll limit ourself to 100 years, starting at 2000 for now. | ||
| 146 | */ | ||
| 147 | buf[6] = tm->tm_year - 100; | ||
| 148 | |||
| 149 | /* | ||
| 150 | * CTL1 only contains TEST-mode bits apart from stop, | ||
| 151 | * so no need to read the value first | ||
| 152 | */ | ||
| 153 | ret = i2c_smbus_write_byte_data(client, HYM8563_CTL1, | ||
| 154 | HYM8563_CTL1_STOP); | ||
| 155 | if (ret < 0) | ||
| 156 | return ret; | ||
| 157 | |||
| 158 | ret = i2c_smbus_write_i2c_block_data(client, HYM8563_SEC, 7, buf); | ||
| 159 | if (ret < 0) | ||
| 160 | return ret; | ||
| 161 | |||
| 162 | ret = i2c_smbus_write_byte_data(client, HYM8563_CTL1, 0); | ||
| 163 | if (ret < 0) | ||
| 164 | return ret; | ||
| 165 | |||
| 166 | hym8563->valid = true; | ||
| 167 | |||
| 168 | return 0; | ||
| 169 | } | ||
| 170 | |||
| 171 | static int hym8563_rtc_alarm_irq_enable(struct device *dev, | ||
| 172 | unsigned int enabled) | ||
| 173 | { | ||
| 174 | struct i2c_client *client = to_i2c_client(dev); | ||
| 175 | int data; | ||
| 176 | |||
| 177 | data = i2c_smbus_read_byte_data(client, HYM8563_CTL2); | ||
| 178 | if (data < 0) | ||
| 179 | return data; | ||
| 180 | |||
| 181 | if (enabled) | ||
| 182 | data |= HYM8563_CTL2_AIE; | ||
| 183 | else | ||
| 184 | data &= ~HYM8563_CTL2_AIE; | ||
| 185 | |||
| 186 | return i2c_smbus_write_byte_data(client, HYM8563_CTL2, data); | ||
| 187 | }; | ||
| 188 | |||
| 189 | static int hym8563_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alm) | ||
| 190 | { | ||
| 191 | struct i2c_client *client = to_i2c_client(dev); | ||
| 192 | struct rtc_time *alm_tm = &alm->time; | ||
| 193 | u8 buf[4]; | ||
| 194 | int ret; | ||
| 195 | |||
| 196 | ret = i2c_smbus_read_i2c_block_data(client, HYM8563_ALM_MIN, 4, buf); | ||
| 197 | if (ret < 0) | ||
| 198 | return ret; | ||
| 199 | |||
| 200 | /* The alarm only has a minute accuracy */ | ||
| 201 | alm_tm->tm_sec = -1; | ||
| 202 | |||
| 203 | alm_tm->tm_min = (buf[0] & HYM8563_ALM_BIT_DISABLE) ? | ||
| 204 | -1 : | ||
| 205 | bcd2bin(buf[0] & HYM8563_MIN_MASK); | ||
| 206 | alm_tm->tm_hour = (buf[1] & HYM8563_ALM_BIT_DISABLE) ? | ||
| 207 | -1 : | ||
| 208 | bcd2bin(buf[1] & HYM8563_HOUR_MASK); | ||
| 209 | alm_tm->tm_mday = (buf[2] & HYM8563_ALM_BIT_DISABLE) ? | ||
| 210 | -1 : | ||
| 211 | bcd2bin(buf[2] & HYM8563_DAY_MASK); | ||
| 212 | alm_tm->tm_wday = (buf[3] & HYM8563_ALM_BIT_DISABLE) ? | ||
| 213 | -1 : | ||
| 214 | bcd2bin(buf[3] & HYM8563_WEEKDAY_MASK); | ||
| 215 | |||
| 216 | alm_tm->tm_mon = -1; | ||
| 217 | alm_tm->tm_year = -1; | ||
| 218 | |||
| 219 | ret = i2c_smbus_read_byte_data(client, HYM8563_CTL2); | ||
| 220 | if (ret < 0) | ||
| 221 | return ret; | ||
| 222 | |||
| 223 | if (ret & HYM8563_CTL2_AIE) | ||
| 224 | alm->enabled = 1; | ||
| 225 | |||
| 226 | return 0; | ||
| 227 | } | ||
| 228 | |||
| 229 | static int hym8563_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alm) | ||
| 230 | { | ||
| 231 | struct i2c_client *client = to_i2c_client(dev); | ||
| 232 | struct rtc_time *alm_tm = &alm->time; | ||
| 233 | u8 buf[4]; | ||
| 234 | int ret; | ||
| 235 | |||
| 236 | /* | ||
| 237 | * The alarm has no seconds so deal with it | ||
| 238 | */ | ||
| 239 | if (alm_tm->tm_sec) { | ||
| 240 | alm_tm->tm_sec = 0; | ||
| 241 | alm_tm->tm_min++; | ||
| 242 | if (alm_tm->tm_min >= 60) { | ||
| 243 | alm_tm->tm_min = 0; | ||
| 244 | alm_tm->tm_hour++; | ||
| 245 | if (alm_tm->tm_hour >= 24) { | ||
| 246 | alm_tm->tm_hour = 0; | ||
| 247 | alm_tm->tm_mday++; | ||
| 248 | if (alm_tm->tm_mday > 31) | ||
| 249 | alm_tm->tm_mday = 0; | ||
| 250 | } | ||
| 251 | } | ||
| 252 | } | ||
| 253 | |||
| 254 | ret = i2c_smbus_read_byte_data(client, HYM8563_CTL2); | ||
| 255 | if (ret < 0) | ||
| 256 | return ret; | ||
| 257 | |||
| 258 | ret &= ~HYM8563_CTL2_AIE; | ||
| 259 | |||
| 260 | ret = i2c_smbus_write_byte_data(client, HYM8563_CTL2, ret); | ||
| 261 | if (ret < 0) | ||
| 262 | return ret; | ||
| 263 | |||
| 264 | buf[0] = (alm_tm->tm_min < 60 && alm_tm->tm_min >= 0) ? | ||
| 265 | bin2bcd(alm_tm->tm_min) : HYM8563_ALM_BIT_DISABLE; | ||
| 266 | |||
| 267 | buf[1] = (alm_tm->tm_hour < 24 && alm_tm->tm_hour >= 0) ? | ||
| 268 | bin2bcd(alm_tm->tm_hour) : HYM8563_ALM_BIT_DISABLE; | ||
| 269 | |||
| 270 | buf[2] = (alm_tm->tm_mday <= 31 && alm_tm->tm_mday >= 1) ? | ||
| 271 | bin2bcd(alm_tm->tm_mday) : HYM8563_ALM_BIT_DISABLE; | ||
| 272 | |||
| 273 | buf[3] = (alm_tm->tm_wday < 7 && alm_tm->tm_wday >= 0) ? | ||
| 274 | bin2bcd(alm_tm->tm_wday) : HYM8563_ALM_BIT_DISABLE; | ||
| 275 | |||
| 276 | ret = i2c_smbus_write_i2c_block_data(client, HYM8563_ALM_MIN, 4, buf); | ||
| 277 | if (ret < 0) | ||
| 278 | return ret; | ||
| 279 | |||
| 280 | return hym8563_rtc_alarm_irq_enable(dev, alm->enabled); | ||
| 281 | } | ||
| 282 | |||
| 283 | static const struct rtc_class_ops hym8563_rtc_ops = { | ||
| 284 | .read_time = hym8563_rtc_read_time, | ||
| 285 | .set_time = hym8563_rtc_set_time, | ||
| 286 | .alarm_irq_enable = hym8563_rtc_alarm_irq_enable, | ||
| 287 | .read_alarm = hym8563_rtc_read_alarm, | ||
| 288 | .set_alarm = hym8563_rtc_set_alarm, | ||
| 289 | }; | ||
| 290 | |||
| 291 | /* | ||
| 292 | * Handling of the clkout | ||
| 293 | */ | ||
| 294 | |||
| 295 | #ifdef CONFIG_COMMON_CLK | ||
| 296 | #define clkout_hw_to_hym8563(_hw) container_of(_hw, struct hym8563, clkout_hw) | ||
| 297 | |||
| 298 | static int clkout_rates[] = { | ||
| 299 | 32768, | ||
| 300 | 1024, | ||
| 301 | 32, | ||
| 302 | 1, | ||
| 303 | }; | ||
| 304 | |||
| 305 | static unsigned long hym8563_clkout_recalc_rate(struct clk_hw *hw, | ||
| 306 | unsigned long parent_rate) | ||
| 307 | { | ||
| 308 | struct hym8563 *hym8563 = clkout_hw_to_hym8563(hw); | ||
| 309 | struct i2c_client *client = hym8563->client; | ||
| 310 | int ret = i2c_smbus_read_byte_data(client, HYM8563_CLKOUT); | ||
| 311 | |||
| 312 | if (ret < 0 || ret & HYM8563_CLKOUT_DISABLE) | ||
| 313 | return 0; | ||
| 314 | |||
| 315 | ret &= HYM8563_CLKOUT_MASK; | ||
| 316 | return clkout_rates[ret]; | ||
| 317 | } | ||
| 318 | |||
| 319 | static long hym8563_clkout_round_rate(struct clk_hw *hw, unsigned long rate, | ||
| 320 | unsigned long *prate) | ||
| 321 | { | ||
| 322 | int i; | ||
| 323 | |||
| 324 | for (i = 0; i < ARRAY_SIZE(clkout_rates); i++) | ||
| 325 | if (clkout_rates[i] <= rate) | ||
| 326 | return clkout_rates[i]; | ||
| 327 | |||
| 328 | return 0; | ||
| 329 | } | ||
| 330 | |||
| 331 | static int hym8563_clkout_set_rate(struct clk_hw *hw, unsigned long rate, | ||
| 332 | unsigned long parent_rate) | ||
| 333 | { | ||
| 334 | struct hym8563 *hym8563 = clkout_hw_to_hym8563(hw); | ||
| 335 | struct i2c_client *client = hym8563->client; | ||
| 336 | int ret = i2c_smbus_read_byte_data(client, HYM8563_CLKOUT); | ||
| 337 | int i; | ||
| 338 | |||
| 339 | if (ret < 0) | ||
| 340 | return ret; | ||
| 341 | |||
| 342 | for (i = 0; i < ARRAY_SIZE(clkout_rates); i++) | ||
| 343 | if (clkout_rates[i] == rate) { | ||
| 344 | ret &= ~HYM8563_CLKOUT_MASK; | ||
| 345 | ret |= i; | ||
| 346 | return i2c_smbus_write_byte_data(client, | ||
| 347 | HYM8563_CLKOUT, ret); | ||
| 348 | } | ||
| 349 | |||
| 350 | return -EINVAL; | ||
| 351 | } | ||
| 352 | |||
| 353 | static int hym8563_clkout_control(struct clk_hw *hw, bool enable) | ||
| 354 | { | ||
| 355 | struct hym8563 *hym8563 = clkout_hw_to_hym8563(hw); | ||
| 356 | struct i2c_client *client = hym8563->client; | ||
| 357 | int ret = i2c_smbus_read_byte_data(client, HYM8563_CLKOUT); | ||
| 358 | |||
| 359 | if (ret < 0) | ||
| 360 | return ret; | ||
| 361 | |||
| 362 | if (enable) | ||
| 363 | ret &= ~HYM8563_CLKOUT_DISABLE; | ||
| 364 | else | ||
| 365 | ret |= HYM8563_CLKOUT_DISABLE; | ||
| 366 | |||
| 367 | return i2c_smbus_write_byte_data(client, HYM8563_CLKOUT, ret); | ||
| 368 | } | ||
| 369 | |||
| 370 | static int hym8563_clkout_prepare(struct clk_hw *hw) | ||
| 371 | { | ||
| 372 | return hym8563_clkout_control(hw, 1); | ||
| 373 | } | ||
| 374 | |||
| 375 | static void hym8563_clkout_unprepare(struct clk_hw *hw) | ||
| 376 | { | ||
| 377 | hym8563_clkout_control(hw, 0); | ||
| 378 | } | ||
| 379 | |||
| 380 | static int hym8563_clkout_is_prepared(struct clk_hw *hw) | ||
| 381 | { | ||
| 382 | struct hym8563 *hym8563 = clkout_hw_to_hym8563(hw); | ||
| 383 | struct i2c_client *client = hym8563->client; | ||
| 384 | int ret = i2c_smbus_read_byte_data(client, HYM8563_CLKOUT); | ||
| 385 | |||
| 386 | if (ret < 0) | ||
| 387 | return ret; | ||
| 388 | |||
| 389 | return !(ret & HYM8563_CLKOUT_DISABLE); | ||
| 390 | } | ||
| 391 | |||
| 392 | static const struct clk_ops hym8563_clkout_ops = { | ||
| 393 | .prepare = hym8563_clkout_prepare, | ||
| 394 | .unprepare = hym8563_clkout_unprepare, | ||
| 395 | .is_prepared = hym8563_clkout_is_prepared, | ||
| 396 | .recalc_rate = hym8563_clkout_recalc_rate, | ||
| 397 | .round_rate = hym8563_clkout_round_rate, | ||
| 398 | .set_rate = hym8563_clkout_set_rate, | ||
| 399 | }; | ||
| 400 | |||
| 401 | static struct clk *hym8563_clkout_register_clk(struct hym8563 *hym8563) | ||
| 402 | { | ||
| 403 | struct i2c_client *client = hym8563->client; | ||
| 404 | struct device_node *node = client->dev.of_node; | ||
| 405 | struct clk *clk; | ||
| 406 | struct clk_init_data init; | ||
| 407 | int ret; | ||
| 408 | |||
| 409 | ret = i2c_smbus_write_byte_data(client, HYM8563_CLKOUT, | ||
| 410 | HYM8563_CLKOUT_DISABLE); | ||
| 411 | if (ret < 0) | ||
| 412 | return ERR_PTR(ret); | ||
| 413 | |||
| 414 | init.name = "hym8563-clkout"; | ||
| 415 | init.ops = &hym8563_clkout_ops; | ||
| 416 | init.flags = CLK_IS_ROOT; | ||
| 417 | init.parent_names = NULL; | ||
| 418 | init.num_parents = 0; | ||
| 419 | hym8563->clkout_hw.init = &init; | ||
| 420 | |||
| 421 | /* register the clock */ | ||
| 422 | clk = clk_register(&client->dev, &hym8563->clkout_hw); | ||
| 423 | |||
| 424 | if (!IS_ERR(clk)) | ||
| 425 | of_clk_add_provider(node, of_clk_src_simple_get, clk); | ||
| 426 | |||
| 427 | return clk; | ||
| 428 | } | ||
| 429 | #endif | ||
| 430 | |||
| 431 | /* | ||
| 432 | * The alarm interrupt is implemented as a level-low interrupt in the | ||
| 433 | * hym8563, while the timer interrupt uses a falling edge. | ||
| 434 | * We don't use the timer at all, so the interrupt is requested to | ||
| 435 | * use the level-low trigger. | ||
| 436 | */ | ||
| 437 | static irqreturn_t hym8563_irq(int irq, void *dev_id) | ||
| 438 | { | ||
| 439 | struct hym8563 *hym8563 = (struct hym8563 *)dev_id; | ||
| 440 | struct i2c_client *client = hym8563->client; | ||
| 441 | struct mutex *lock = &hym8563->rtc->ops_lock; | ||
| 442 | int data, ret; | ||
| 443 | |||
| 444 | mutex_lock(lock); | ||
| 445 | |||
| 446 | /* Clear the alarm flag */ | ||
| 447 | |||
| 448 | data = i2c_smbus_read_byte_data(client, HYM8563_CTL2); | ||
| 449 | if (data < 0) { | ||
| 450 | dev_err(&client->dev, "%s: error reading i2c data %d\n", | ||
| 451 | __func__, data); | ||
| 452 | goto out; | ||
| 453 | } | ||
| 454 | |||
| 455 | data &= ~HYM8563_CTL2_AF; | ||
| 456 | |||
| 457 | ret = i2c_smbus_write_byte_data(client, HYM8563_CTL2, data); | ||
| 458 | if (ret < 0) { | ||
| 459 | dev_err(&client->dev, "%s: error writing i2c data %d\n", | ||
| 460 | __func__, ret); | ||
| 461 | } | ||
| 462 | |||
| 463 | out: | ||
| 464 | mutex_unlock(lock); | ||
| 465 | return IRQ_HANDLED; | ||
| 466 | } | ||
| 467 | |||
| 468 | static int hym8563_init_device(struct i2c_client *client) | ||
| 469 | { | ||
| 470 | int ret; | ||
| 471 | |||
| 472 | /* Clear stop flag if present */ | ||
| 473 | ret = i2c_smbus_write_byte_data(client, HYM8563_CTL1, 0); | ||
| 474 | if (ret < 0) | ||
| 475 | return ret; | ||
| 476 | |||
| 477 | ret = i2c_smbus_read_byte_data(client, HYM8563_CTL2); | ||
| 478 | if (ret < 0) | ||
| 479 | return ret; | ||
| 480 | |||
| 481 | /* Disable alarm and timer interrupts */ | ||
| 482 | ret &= ~HYM8563_CTL2_AIE; | ||
| 483 | ret &= ~HYM8563_CTL2_TIE; | ||
| 484 | |||
| 485 | /* Clear any pending alarm and timer flags */ | ||
| 486 | if (ret & HYM8563_CTL2_AF) | ||
| 487 | ret &= ~HYM8563_CTL2_AF; | ||
| 488 | |||
| 489 | if (ret & HYM8563_CTL2_TF) | ||
| 490 | ret &= ~HYM8563_CTL2_TF; | ||
| 491 | |||
| 492 | ret &= ~HYM8563_CTL2_TI_TP; | ||
| 493 | |||
| 494 | return i2c_smbus_write_byte_data(client, HYM8563_CTL2, ret); | ||
| 495 | } | ||
| 496 | |||
| 497 | #ifdef CONFIG_PM_SLEEP | ||
| 498 | static int hym8563_suspend(struct device *dev) | ||
| 499 | { | ||
| 500 | struct i2c_client *client = to_i2c_client(dev); | ||
| 501 | int ret; | ||
| 502 | |||
| 503 | if (device_may_wakeup(dev)) { | ||
| 504 | ret = enable_irq_wake(client->irq); | ||
| 505 | if (ret) { | ||
| 506 | dev_err(dev, "enable_irq_wake failed, %d\n", ret); | ||
| 507 | return ret; | ||
| 508 | } | ||
| 509 | } | ||
| 510 | |||
| 511 | return 0; | ||
| 512 | } | ||
| 513 | |||
| 514 | static int hym8563_resume(struct device *dev) | ||
| 515 | { | ||
| 516 | struct i2c_client *client = to_i2c_client(dev); | ||
| 517 | |||
| 518 | if (device_may_wakeup(dev)) | ||
| 519 | disable_irq_wake(client->irq); | ||
| 520 | |||
| 521 | return 0; | ||
| 522 | } | ||
| 523 | #endif | ||
| 524 | |||
| 525 | static SIMPLE_DEV_PM_OPS(hym8563_pm_ops, hym8563_suspend, hym8563_resume); | ||
| 526 | |||
| 527 | static int hym8563_probe(struct i2c_client *client, | ||
| 528 | const struct i2c_device_id *id) | ||
| 529 | { | ||
| 530 | struct hym8563 *hym8563; | ||
| 531 | int ret; | ||
| 532 | |||
| 533 | hym8563 = devm_kzalloc(&client->dev, sizeof(*hym8563), GFP_KERNEL); | ||
| 534 | if (!hym8563) | ||
| 535 | return -ENOMEM; | ||
| 536 | |||
| 537 | hym8563->client = client; | ||
| 538 | i2c_set_clientdata(client, hym8563); | ||
| 539 | |||
| 540 | device_set_wakeup_capable(&client->dev, true); | ||
| 541 | |||
| 542 | ret = hym8563_init_device(client); | ||
| 543 | if (ret) { | ||
| 544 | dev_err(&client->dev, "could not init device, %d\n", ret); | ||
| 545 | return ret; | ||
| 546 | } | ||
| 547 | |||
| 548 | ret = devm_request_threaded_irq(&client->dev, client->irq, | ||
| 549 | NULL, hym8563_irq, | ||
| 550 | IRQF_TRIGGER_LOW | IRQF_ONESHOT, | ||
| 551 | client->name, hym8563); | ||
| 552 | if (ret < 0) { | ||
| 553 | dev_err(&client->dev, "irq %d request failed, %d\n", | ||
| 554 | client->irq, ret); | ||
| 555 | return ret; | ||
| 556 | } | ||
| 557 | |||
| 558 | /* check state of calendar information */ | ||
| 559 | ret = i2c_smbus_read_byte_data(client, HYM8563_SEC); | ||
| 560 | if (ret < 0) | ||
| 561 | return ret; | ||
| 562 | |||
| 563 | hym8563->valid = !(ret & HYM8563_SEC_VL); | ||
| 564 | dev_dbg(&client->dev, "rtc information is %s\n", | ||
| 565 | hym8563->valid ? "valid" : "invalid"); | ||
| 566 | |||
| 567 | hym8563->rtc = devm_rtc_device_register(&client->dev, client->name, | ||
| 568 | &hym8563_rtc_ops, THIS_MODULE); | ||
| 569 | if (IS_ERR(hym8563->rtc)) | ||
| 570 | return PTR_ERR(hym8563->rtc); | ||
| 571 | |||
| 572 | #ifdef CONFIG_COMMON_CLK | ||
| 573 | hym8563_clkout_register_clk(hym8563); | ||
| 574 | #endif | ||
| 575 | |||
| 576 | return 0; | ||
| 577 | } | ||
| 578 | |||
| 579 | static const struct i2c_device_id hym8563_id[] = { | ||
| 580 | { "hym8563", 0 }, | ||
| 581 | {}, | ||
| 582 | }; | ||
| 583 | MODULE_DEVICE_TABLE(i2c, hym8563_id); | ||
| 584 | |||
| 585 | static struct of_device_id hym8563_dt_idtable[] = { | ||
| 586 | { .compatible = "haoyu,hym8563" }, | ||
| 587 | {}, | ||
| 588 | }; | ||
| 589 | MODULE_DEVICE_TABLE(of, hym8563_dt_idtable); | ||
| 590 | |||
| 591 | static struct i2c_driver hym8563_driver = { | ||
| 592 | .driver = { | ||
| 593 | .name = "rtc-hym8563", | ||
| 594 | .owner = THIS_MODULE, | ||
| 595 | .pm = &hym8563_pm_ops, | ||
| 596 | .of_match_table = hym8563_dt_idtable, | ||
| 597 | }, | ||
| 598 | .probe = hym8563_probe, | ||
| 599 | .id_table = hym8563_id, | ||
| 600 | }; | ||
| 601 | |||
| 602 | module_i2c_driver(hym8563_driver); | ||
| 603 | |||
| 604 | MODULE_AUTHOR("Heiko Stuebner <heiko@sntech.de>"); | ||
| 605 | MODULE_DESCRIPTION("HYM8563 RTC driver"); | ||
| 606 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/rtc/rtc-max8907.c b/drivers/rtc/rtc-max8907.c index 8e45b3c4aa2f..3032178bd9e6 100644 --- a/drivers/rtc/rtc-max8907.c +++ b/drivers/rtc/rtc-max8907.c | |||
| @@ -51,7 +51,7 @@ static irqreturn_t max8907_irq_handler(int irq, void *data) | |||
| 51 | { | 51 | { |
| 52 | struct max8907_rtc *rtc = data; | 52 | struct max8907_rtc *rtc = data; |
| 53 | 53 | ||
| 54 | regmap_update_bits(rtc->regmap, MAX8907_REG_ALARM0_CNTL, 0x7f, 0); | 54 | regmap_write(rtc->regmap, MAX8907_REG_ALARM0_CNTL, 0); |
| 55 | 55 | ||
| 56 | rtc_update_irq(rtc->rtc_dev, 1, RTC_IRQF | RTC_AF); | 56 | rtc_update_irq(rtc->rtc_dev, 1, RTC_IRQF | RTC_AF); |
| 57 | 57 | ||
| @@ -64,7 +64,7 @@ static void regs_to_tm(u8 *regs, struct rtc_time *tm) | |||
| 64 | bcd2bin(regs[RTC_YEAR1]) - 1900; | 64 | bcd2bin(regs[RTC_YEAR1]) - 1900; |
| 65 | tm->tm_mon = bcd2bin(regs[RTC_MONTH] & 0x1f) - 1; | 65 | tm->tm_mon = bcd2bin(regs[RTC_MONTH] & 0x1f) - 1; |
| 66 | tm->tm_mday = bcd2bin(regs[RTC_DATE] & 0x3f); | 66 | tm->tm_mday = bcd2bin(regs[RTC_DATE] & 0x3f); |
| 67 | tm->tm_wday = (regs[RTC_WEEKDAY] & 0x07) - 1; | 67 | tm->tm_wday = (regs[RTC_WEEKDAY] & 0x07); |
| 68 | if (regs[RTC_HOUR] & HOUR_12) { | 68 | if (regs[RTC_HOUR] & HOUR_12) { |
| 69 | tm->tm_hour = bcd2bin(regs[RTC_HOUR] & 0x01f); | 69 | tm->tm_hour = bcd2bin(regs[RTC_HOUR] & 0x01f); |
| 70 | if (tm->tm_hour == 12) | 70 | if (tm->tm_hour == 12) |
| @@ -88,7 +88,7 @@ static void tm_to_regs(struct rtc_time *tm, u8 *regs) | |||
| 88 | regs[RTC_YEAR1] = bin2bcd(low); | 88 | regs[RTC_YEAR1] = bin2bcd(low); |
| 89 | regs[RTC_MONTH] = bin2bcd(tm->tm_mon + 1); | 89 | regs[RTC_MONTH] = bin2bcd(tm->tm_mon + 1); |
| 90 | regs[RTC_DATE] = bin2bcd(tm->tm_mday); | 90 | regs[RTC_DATE] = bin2bcd(tm->tm_mday); |
| 91 | regs[RTC_WEEKDAY] = tm->tm_wday + 1; | 91 | regs[RTC_WEEKDAY] = tm->tm_wday; |
| 92 | regs[RTC_HOUR] = bin2bcd(tm->tm_hour); | 92 | regs[RTC_HOUR] = bin2bcd(tm->tm_hour); |
| 93 | regs[RTC_MIN] = bin2bcd(tm->tm_min); | 93 | regs[RTC_MIN] = bin2bcd(tm->tm_min); |
| 94 | regs[RTC_SEC] = bin2bcd(tm->tm_sec); | 94 | regs[RTC_SEC] = bin2bcd(tm->tm_sec); |
| @@ -153,7 +153,7 @@ static int max8907_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) | |||
| 153 | tm_to_regs(&alrm->time, regs); | 153 | tm_to_regs(&alrm->time, regs); |
| 154 | 154 | ||
| 155 | /* Disable alarm while we update the target time */ | 155 | /* Disable alarm while we update the target time */ |
| 156 | ret = regmap_update_bits(rtc->regmap, MAX8907_REG_ALARM0_CNTL, 0x7f, 0); | 156 | ret = regmap_write(rtc->regmap, MAX8907_REG_ALARM0_CNTL, 0); |
| 157 | if (ret < 0) | 157 | if (ret < 0) |
| 158 | return ret; | 158 | return ret; |
| 159 | 159 | ||
| @@ -163,8 +163,7 @@ static int max8907_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) | |||
| 163 | return ret; | 163 | return ret; |
| 164 | 164 | ||
| 165 | if (alrm->enabled) | 165 | if (alrm->enabled) |
| 166 | ret = regmap_update_bits(rtc->regmap, MAX8907_REG_ALARM0_CNTL, | 166 | ret = regmap_write(rtc->regmap, MAX8907_REG_ALARM0_CNTL, 0x77); |
| 167 | 0x7f, 0x7f); | ||
| 168 | 167 | ||
| 169 | return ret; | 168 | return ret; |
| 170 | } | 169 | } |
diff --git a/drivers/rtc/rtc-mxc.c b/drivers/rtc/rtc-mxc.c index 50c572645546..419874fefa4b 100644 --- a/drivers/rtc/rtc-mxc.c +++ b/drivers/rtc/rtc-mxc.c | |||
| @@ -391,11 +391,13 @@ static int mxc_rtc_probe(struct platform_device *pdev) | |||
| 391 | pdata->clk = devm_clk_get(&pdev->dev, NULL); | 391 | pdata->clk = devm_clk_get(&pdev->dev, NULL); |
| 392 | if (IS_ERR(pdata->clk)) { | 392 | if (IS_ERR(pdata->clk)) { |
| 393 | dev_err(&pdev->dev, "unable to get clock!\n"); | 393 | dev_err(&pdev->dev, "unable to get clock!\n"); |
| 394 | ret = PTR_ERR(pdata->clk); | 394 | return PTR_ERR(pdata->clk); |
| 395 | goto exit_free_pdata; | ||
| 396 | } | 395 | } |
| 397 | 396 | ||
| 398 | clk_prepare_enable(pdata->clk); | 397 | ret = clk_prepare_enable(pdata->clk); |
| 398 | if (ret) | ||
| 399 | return ret; | ||
| 400 | |||
| 399 | rate = clk_get_rate(pdata->clk); | 401 | rate = clk_get_rate(pdata->clk); |
| 400 | 402 | ||
| 401 | if (rate == 32768) | 403 | if (rate == 32768) |
| @@ -447,8 +449,6 @@ static int mxc_rtc_probe(struct platform_device *pdev) | |||
| 447 | exit_put_clk: | 449 | exit_put_clk: |
| 448 | clk_disable_unprepare(pdata->clk); | 450 | clk_disable_unprepare(pdata->clk); |
| 449 | 451 | ||
| 450 | exit_free_pdata: | ||
| 451 | |||
| 452 | return ret; | 452 | return ret; |
| 453 | } | 453 | } |
| 454 | 454 | ||
diff --git a/drivers/rtc/rtc-pcf2127.c b/drivers/rtc/rtc-pcf2127.c index 1ee514a3972c..9bd842e97749 100644 --- a/drivers/rtc/rtc-pcf2127.c +++ b/drivers/rtc/rtc-pcf2127.c | |||
| @@ -197,10 +197,7 @@ static int pcf2127_probe(struct i2c_client *client, | |||
| 197 | pcf2127_driver.driver.name, | 197 | pcf2127_driver.driver.name, |
| 198 | &pcf2127_rtc_ops, THIS_MODULE); | 198 | &pcf2127_rtc_ops, THIS_MODULE); |
| 199 | 199 | ||
| 200 | if (IS_ERR(pcf2127->rtc)) | 200 | return PTR_ERR_OR_ZERO(pcf2127->rtc); |
| 201 | return PTR_ERR(pcf2127->rtc); | ||
| 202 | |||
| 203 | return 0; | ||
| 204 | } | 201 | } |
| 205 | 202 | ||
| 206 | static const struct i2c_device_id pcf2127_id[] = { | 203 | static const struct i2c_device_id pcf2127_id[] = { |
diff --git a/drivers/rtc/rtc-rx8581.c b/drivers/rtc/rtc-rx8581.c index 00b0eb7fe166..de8d9c427782 100644 --- a/drivers/rtc/rtc-rx8581.c +++ b/drivers/rtc/rtc-rx8581.c | |||
| @@ -52,8 +52,45 @@ | |||
| 52 | #define RX8581_CTRL_STOP 0x02 /* STOP bit */ | 52 | #define RX8581_CTRL_STOP 0x02 /* STOP bit */ |
| 53 | #define RX8581_CTRL_RESET 0x01 /* RESET bit */ | 53 | #define RX8581_CTRL_RESET 0x01 /* RESET bit */ |
| 54 | 54 | ||
| 55 | struct rx8581 { | ||
| 56 | struct i2c_client *client; | ||
| 57 | struct rtc_device *rtc; | ||
| 58 | s32 (*read_block_data)(const struct i2c_client *client, u8 command, | ||
| 59 | u8 length, u8 *values); | ||
| 60 | s32 (*write_block_data)(const struct i2c_client *client, u8 command, | ||
| 61 | u8 length, const u8 *values); | ||
| 62 | }; | ||
| 63 | |||
| 55 | static struct i2c_driver rx8581_driver; | 64 | static struct i2c_driver rx8581_driver; |
| 56 | 65 | ||
| 66 | static int rx8581_read_block_data(const struct i2c_client *client, u8 command, | ||
| 67 | u8 length, u8 *values) | ||
| 68 | { | ||
| 69 | s32 i, data; | ||
| 70 | |||
| 71 | for (i = 0; i < length; i++) { | ||
| 72 | data = i2c_smbus_read_byte_data(client, command + i); | ||
| 73 | if (data < 0) | ||
| 74 | return data; | ||
| 75 | values[i] = data; | ||
| 76 | } | ||
| 77 | return i; | ||
| 78 | } | ||
| 79 | |||
| 80 | static int rx8581_write_block_data(const struct i2c_client *client, u8 command, | ||
| 81 | u8 length, const u8 *values) | ||
| 82 | { | ||
| 83 | s32 i, ret; | ||
| 84 | |||
| 85 | for (i = 0; i < length; i++) { | ||
| 86 | ret = i2c_smbus_write_byte_data(client, command + i, | ||
| 87 | values[i]); | ||
| 88 | if (ret < 0) | ||
| 89 | return ret; | ||
| 90 | } | ||
| 91 | return length; | ||
| 92 | } | ||
| 93 | |||
| 57 | /* | 94 | /* |
| 58 | * In the routines that deal directly with the rx8581 hardware, we use | 95 | * In the routines that deal directly with the rx8581 hardware, we use |
| 59 | * rtc_time -- month 0-11, hour 0-23, yr = calendar year-epoch. | 96 | * rtc_time -- month 0-11, hour 0-23, yr = calendar year-epoch. |
| @@ -62,6 +99,7 @@ static int rx8581_get_datetime(struct i2c_client *client, struct rtc_time *tm) | |||
| 62 | { | 99 | { |
| 63 | unsigned char date[7]; | 100 | unsigned char date[7]; |
| 64 | int data, err; | 101 | int data, err; |
| 102 | struct rx8581 *rx8581 = i2c_get_clientdata(client); | ||
| 65 | 103 | ||
| 66 | /* First we ensure that the "update flag" is not set, we read the | 104 | /* First we ensure that the "update flag" is not set, we read the |
| 67 | * time and date then re-read the "update flag". If the update flag | 105 | * time and date then re-read the "update flag". If the update flag |
| @@ -80,14 +118,13 @@ static int rx8581_get_datetime(struct i2c_client *client, struct rtc_time *tm) | |||
| 80 | err = i2c_smbus_write_byte_data(client, | 118 | err = i2c_smbus_write_byte_data(client, |
| 81 | RX8581_REG_FLAG, (data & ~RX8581_FLAG_UF)); | 119 | RX8581_REG_FLAG, (data & ~RX8581_FLAG_UF)); |
| 82 | if (err != 0) { | 120 | if (err != 0) { |
| 83 | dev_err(&client->dev, "Unable to write device " | 121 | dev_err(&client->dev, "Unable to write device flags\n"); |
| 84 | "flags\n"); | ||
| 85 | return -EIO; | 122 | return -EIO; |
| 86 | } | 123 | } |
| 87 | } | 124 | } |
| 88 | 125 | ||
| 89 | /* Now read time and date */ | 126 | /* Now read time and date */ |
| 90 | err = i2c_smbus_read_i2c_block_data(client, RX8581_REG_SC, | 127 | err = rx8581->read_block_data(client, RX8581_REG_SC, |
| 91 | 7, date); | 128 | 7, date); |
| 92 | if (err < 0) { | 129 | if (err < 0) { |
| 93 | dev_err(&client->dev, "Unable to read date\n"); | 130 | dev_err(&client->dev, "Unable to read date\n"); |
| @@ -140,6 +177,7 @@ static int rx8581_set_datetime(struct i2c_client *client, struct rtc_time *tm) | |||
| 140 | { | 177 | { |
| 141 | int data, err; | 178 | int data, err; |
| 142 | unsigned char buf[7]; | 179 | unsigned char buf[7]; |
| 180 | struct rx8581 *rx8581 = i2c_get_clientdata(client); | ||
| 143 | 181 | ||
| 144 | dev_dbg(&client->dev, "%s: secs=%d, mins=%d, hours=%d, " | 182 | dev_dbg(&client->dev, "%s: secs=%d, mins=%d, hours=%d, " |
| 145 | "mday=%d, mon=%d, year=%d, wday=%d\n", | 183 | "mday=%d, mon=%d, year=%d, wday=%d\n", |
| @@ -176,7 +214,7 @@ static int rx8581_set_datetime(struct i2c_client *client, struct rtc_time *tm) | |||
| 176 | } | 214 | } |
| 177 | 215 | ||
| 178 | /* write register's data */ | 216 | /* write register's data */ |
| 179 | err = i2c_smbus_write_i2c_block_data(client, RX8581_REG_SC, 7, buf); | 217 | err = rx8581->write_block_data(client, RX8581_REG_SC, 7, buf); |
| 180 | if (err < 0) { | 218 | if (err < 0) { |
| 181 | dev_err(&client->dev, "Unable to write to date registers\n"); | 219 | dev_err(&client->dev, "Unable to write to date registers\n"); |
| 182 | return -EIO; | 220 | return -EIO; |
| @@ -231,22 +269,39 @@ static const struct rtc_class_ops rx8581_rtc_ops = { | |||
| 231 | static int rx8581_probe(struct i2c_client *client, | 269 | static int rx8581_probe(struct i2c_client *client, |
| 232 | const struct i2c_device_id *id) | 270 | const struct i2c_device_id *id) |
| 233 | { | 271 | { |
| 234 | struct rtc_device *rtc; | 272 | struct rx8581 *rx8581; |
| 235 | 273 | ||
| 236 | dev_dbg(&client->dev, "%s\n", __func__); | 274 | dev_dbg(&client->dev, "%s\n", __func__); |
| 237 | 275 | ||
| 238 | if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) | 276 | if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA) |
| 239 | return -ENODEV; | 277 | && !i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_I2C_BLOCK)) |
| 278 | return -EIO; | ||
| 240 | 279 | ||
| 241 | dev_info(&client->dev, "chip found, driver version " DRV_VERSION "\n"); | 280 | rx8581 = devm_kzalloc(&client->dev, sizeof(struct rx8581), GFP_KERNEL); |
| 281 | if (!rx8581) | ||
| 282 | return -ENOMEM; | ||
| 242 | 283 | ||
| 243 | rtc = devm_rtc_device_register(&client->dev, rx8581_driver.driver.name, | 284 | i2c_set_clientdata(client, rx8581); |
| 244 | &rx8581_rtc_ops, THIS_MODULE); | 285 | rx8581->client = client; |
| 245 | 286 | ||
| 246 | if (IS_ERR(rtc)) | 287 | if (i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_I2C_BLOCK)) { |
| 247 | return PTR_ERR(rtc); | 288 | rx8581->read_block_data = i2c_smbus_read_i2c_block_data; |
| 289 | rx8581->write_block_data = i2c_smbus_write_i2c_block_data; | ||
| 290 | } else { | ||
| 291 | rx8581->read_block_data = rx8581_read_block_data; | ||
| 292 | rx8581->write_block_data = rx8581_write_block_data; | ||
| 293 | } | ||
| 248 | 294 | ||
| 249 | i2c_set_clientdata(client, rtc); | 295 | dev_info(&client->dev, "chip found, driver version " DRV_VERSION "\n"); |
| 296 | |||
| 297 | rx8581->rtc = devm_rtc_device_register(&client->dev, | ||
| 298 | rx8581_driver.driver.name, &rx8581_rtc_ops, THIS_MODULE); | ||
| 299 | |||
| 300 | if (IS_ERR(rx8581->rtc)) { | ||
| 301 | dev_err(&client->dev, | ||
| 302 | "unable to register the class device\n"); | ||
| 303 | return PTR_ERR(rx8581->rtc); | ||
| 304 | } | ||
| 250 | 305 | ||
| 251 | return 0; | 306 | return 0; |
| 252 | } | 307 | } |
diff --git a/drivers/rtc/rtc-s5m.c b/drivers/rtc/rtc-s5m.c index ae8119dc2846..476af93543f6 100644 --- a/drivers/rtc/rtc-s5m.c +++ b/drivers/rtc/rtc-s5m.c | |||
| @@ -639,6 +639,7 @@ static void s5m_rtc_shutdown(struct platform_device *pdev) | |||
| 639 | s5m_rtc_enable_smpl(info, false); | 639 | s5m_rtc_enable_smpl(info, false); |
| 640 | } | 640 | } |
| 641 | 641 | ||
| 642 | #ifdef CONFIG_PM_SLEEP | ||
| 642 | static int s5m_rtc_resume(struct device *dev) | 643 | static int s5m_rtc_resume(struct device *dev) |
| 643 | { | 644 | { |
| 644 | struct s5m_rtc_info *info = dev_get_drvdata(dev); | 645 | struct s5m_rtc_info *info = dev_get_drvdata(dev); |
| @@ -660,6 +661,7 @@ static int s5m_rtc_suspend(struct device *dev) | |||
| 660 | 661 | ||
| 661 | return ret; | 662 | return ret; |
| 662 | } | 663 | } |
| 664 | #endif /* CONFIG_PM_SLEEP */ | ||
| 663 | 665 | ||
| 664 | static SIMPLE_DEV_PM_OPS(s5m_rtc_pm_ops, s5m_rtc_suspend, s5m_rtc_resume); | 666 | static SIMPLE_DEV_PM_OPS(s5m_rtc_pm_ops, s5m_rtc_suspend, s5m_rtc_resume); |
| 665 | 667 | ||
diff --git a/drivers/rtc/rtc-twl.c b/drivers/rtc/rtc-twl.c index c2e80d7ca5e2..1915464e4cd6 100644 --- a/drivers/rtc/rtc-twl.c +++ b/drivers/rtc/rtc-twl.c | |||
| @@ -479,7 +479,7 @@ static int twl_rtc_probe(struct platform_device *pdev) | |||
| 479 | u8 rd_reg; | 479 | u8 rd_reg; |
| 480 | 480 | ||
| 481 | if (irq <= 0) | 481 | if (irq <= 0) |
| 482 | goto out1; | 482 | return ret; |
| 483 | 483 | ||
| 484 | /* Initialize the register map */ | 484 | /* Initialize the register map */ |
| 485 | if (twl_class_is_4030()) | 485 | if (twl_class_is_4030()) |
| @@ -489,7 +489,7 @@ static int twl_rtc_probe(struct platform_device *pdev) | |||
| 489 | 489 | ||
| 490 | ret = twl_rtc_read_u8(&rd_reg, REG_RTC_STATUS_REG); | 490 | ret = twl_rtc_read_u8(&rd_reg, REG_RTC_STATUS_REG); |
| 491 | if (ret < 0) | 491 | if (ret < 0) |
| 492 | goto out1; | 492 | return ret; |
| 493 | 493 | ||
| 494 | if (rd_reg & BIT_RTC_STATUS_REG_POWER_UP_M) | 494 | if (rd_reg & BIT_RTC_STATUS_REG_POWER_UP_M) |
| 495 | dev_warn(&pdev->dev, "Power up reset detected.\n"); | 495 | dev_warn(&pdev->dev, "Power up reset detected.\n"); |
| @@ -500,7 +500,7 @@ static int twl_rtc_probe(struct platform_device *pdev) | |||
| 500 | /* Clear RTC Power up reset and pending alarm interrupts */ | 500 | /* Clear RTC Power up reset and pending alarm interrupts */ |
| 501 | ret = twl_rtc_write_u8(rd_reg, REG_RTC_STATUS_REG); | 501 | ret = twl_rtc_write_u8(rd_reg, REG_RTC_STATUS_REG); |
| 502 | if (ret < 0) | 502 | if (ret < 0) |
| 503 | goto out1; | 503 | return ret; |
| 504 | 504 | ||
| 505 | if (twl_class_is_6030()) { | 505 | if (twl_class_is_6030()) { |
| 506 | twl6030_interrupt_unmask(TWL6030_RTC_INT_MASK, | 506 | twl6030_interrupt_unmask(TWL6030_RTC_INT_MASK, |
| @@ -512,7 +512,7 @@ static int twl_rtc_probe(struct platform_device *pdev) | |||
| 512 | dev_info(&pdev->dev, "Enabling TWL-RTC\n"); | 512 | dev_info(&pdev->dev, "Enabling TWL-RTC\n"); |
| 513 | ret = twl_rtc_write_u8(BIT_RTC_CTRL_REG_STOP_RTC_M, REG_RTC_CTRL_REG); | 513 | ret = twl_rtc_write_u8(BIT_RTC_CTRL_REG_STOP_RTC_M, REG_RTC_CTRL_REG); |
| 514 | if (ret < 0) | 514 | if (ret < 0) |
| 515 | goto out1; | 515 | return ret; |
| 516 | 516 | ||
| 517 | /* ensure interrupts are disabled, bootloaders can be strange */ | 517 | /* ensure interrupts are disabled, bootloaders can be strange */ |
| 518 | ret = twl_rtc_write_u8(0, REG_RTC_INTERRUPTS_REG); | 518 | ret = twl_rtc_write_u8(0, REG_RTC_INTERRUPTS_REG); |
| @@ -522,34 +522,29 @@ static int twl_rtc_probe(struct platform_device *pdev) | |||
| 522 | /* init cached IRQ enable bits */ | 522 | /* init cached IRQ enable bits */ |
| 523 | ret = twl_rtc_read_u8(&rtc_irq_bits, REG_RTC_INTERRUPTS_REG); | 523 | ret = twl_rtc_read_u8(&rtc_irq_bits, REG_RTC_INTERRUPTS_REG); |
| 524 | if (ret < 0) | 524 | if (ret < 0) |
| 525 | goto out1; | 525 | return ret; |
| 526 | 526 | ||
| 527 | device_init_wakeup(&pdev->dev, 1); | 527 | device_init_wakeup(&pdev->dev, 1); |
| 528 | 528 | ||
| 529 | rtc = rtc_device_register(pdev->name, | 529 | rtc = devm_rtc_device_register(&pdev->dev, pdev->name, |
| 530 | &pdev->dev, &twl_rtc_ops, THIS_MODULE); | 530 | &twl_rtc_ops, THIS_MODULE); |
| 531 | if (IS_ERR(rtc)) { | 531 | if (IS_ERR(rtc)) { |
| 532 | ret = PTR_ERR(rtc); | ||
| 533 | dev_err(&pdev->dev, "can't register RTC device, err %ld\n", | 532 | dev_err(&pdev->dev, "can't register RTC device, err %ld\n", |
| 534 | PTR_ERR(rtc)); | 533 | PTR_ERR(rtc)); |
| 535 | goto out1; | 534 | return PTR_ERR(rtc); |
| 536 | } | 535 | } |
| 537 | 536 | ||
| 538 | ret = request_threaded_irq(irq, NULL, twl_rtc_interrupt, | 537 | ret = devm_request_threaded_irq(&pdev->dev, irq, NULL, |
| 539 | IRQF_TRIGGER_RISING | IRQF_ONESHOT, | 538 | twl_rtc_interrupt, |
| 540 | dev_name(&rtc->dev), rtc); | 539 | IRQF_TRIGGER_RISING | IRQF_ONESHOT, |
| 540 | dev_name(&rtc->dev), rtc); | ||
| 541 | if (ret < 0) { | 541 | if (ret < 0) { |
| 542 | dev_err(&pdev->dev, "IRQ is not free.\n"); | 542 | dev_err(&pdev->dev, "IRQ is not free.\n"); |
| 543 | goto out2; | 543 | return ret; |
| 544 | } | 544 | } |
| 545 | 545 | ||
| 546 | platform_set_drvdata(pdev, rtc); | 546 | platform_set_drvdata(pdev, rtc); |
| 547 | return 0; | 547 | return 0; |
| 548 | |||
| 549 | out2: | ||
| 550 | rtc_device_unregister(rtc); | ||
| 551 | out1: | ||
| 552 | return ret; | ||
| 553 | } | 548 | } |
| 554 | 549 | ||
| 555 | /* | 550 | /* |
| @@ -559,9 +554,6 @@ out1: | |||
| 559 | static int twl_rtc_remove(struct platform_device *pdev) | 554 | static int twl_rtc_remove(struct platform_device *pdev) |
| 560 | { | 555 | { |
| 561 | /* leave rtc running, but disable irqs */ | 556 | /* leave rtc running, but disable irqs */ |
| 562 | struct rtc_device *rtc = platform_get_drvdata(pdev); | ||
| 563 | int irq = platform_get_irq(pdev, 0); | ||
| 564 | |||
| 565 | mask_rtc_irq_bit(BIT_RTC_INTERRUPTS_REG_IT_ALARM_M); | 557 | mask_rtc_irq_bit(BIT_RTC_INTERRUPTS_REG_IT_ALARM_M); |
| 566 | mask_rtc_irq_bit(BIT_RTC_INTERRUPTS_REG_IT_TIMER_M); | 558 | mask_rtc_irq_bit(BIT_RTC_INTERRUPTS_REG_IT_TIMER_M); |
| 567 | if (twl_class_is_6030()) { | 559 | if (twl_class_is_6030()) { |
| @@ -571,10 +563,6 @@ static int twl_rtc_remove(struct platform_device *pdev) | |||
| 571 | REG_INT_MSK_STS_A); | 563 | REG_INT_MSK_STS_A); |
| 572 | } | 564 | } |
| 573 | 565 | ||
| 574 | |||
| 575 | free_irq(irq, rtc); | ||
| 576 | |||
| 577 | rtc_device_unregister(rtc); | ||
| 578 | return 0; | 566 | return 0; |
| 579 | } | 567 | } |
| 580 | 568 | ||
diff --git a/drivers/rtc/rtc-vr41xx.c b/drivers/rtc/rtc-vr41xx.c index aabc22c587fb..88c9c92e89fd 100644 --- a/drivers/rtc/rtc-vr41xx.c +++ b/drivers/rtc/rtc-vr41xx.c | |||
| @@ -293,7 +293,7 @@ static int rtc_probe(struct platform_device *pdev) | |||
| 293 | if (!res) | 293 | if (!res) |
| 294 | return -EBUSY; | 294 | return -EBUSY; |
| 295 | 295 | ||
| 296 | rtc1_base = ioremap(res->start, resource_size(res)); | 296 | rtc1_base = devm_ioremap(&pdev->dev, res->start, resource_size(res)); |
| 297 | if (!rtc1_base) | 297 | if (!rtc1_base) |
| 298 | return -EBUSY; | 298 | return -EBUSY; |
| 299 | 299 | ||
| @@ -303,13 +303,14 @@ static int rtc_probe(struct platform_device *pdev) | |||
| 303 | goto err_rtc1_iounmap; | 303 | goto err_rtc1_iounmap; |
| 304 | } | 304 | } |
| 305 | 305 | ||
| 306 | rtc2_base = ioremap(res->start, resource_size(res)); | 306 | rtc2_base = devm_ioremap(&pdev->dev, res->start, resource_size(res)); |
| 307 | if (!rtc2_base) { | 307 | if (!rtc2_base) { |
| 308 | retval = -EBUSY; | 308 | retval = -EBUSY; |
| 309 | goto err_rtc1_iounmap; | 309 | goto err_rtc1_iounmap; |
| 310 | } | 310 | } |
| 311 | 311 | ||
| 312 | rtc = rtc_device_register(rtc_name, &pdev->dev, &vr41xx_rtc_ops, THIS_MODULE); | 312 | rtc = devm_rtc_device_register(&pdev->dev, rtc_name, &vr41xx_rtc_ops, |
| 313 | THIS_MODULE); | ||
| 313 | if (IS_ERR(rtc)) { | 314 | if (IS_ERR(rtc)) { |
| 314 | retval = PTR_ERR(rtc); | 315 | retval = PTR_ERR(rtc); |
| 315 | goto err_iounmap_all; | 316 | goto err_iounmap_all; |
| @@ -330,24 +331,24 @@ static int rtc_probe(struct platform_device *pdev) | |||
| 330 | aie_irq = platform_get_irq(pdev, 0); | 331 | aie_irq = platform_get_irq(pdev, 0); |
| 331 | if (aie_irq <= 0) { | 332 | if (aie_irq <= 0) { |
| 332 | retval = -EBUSY; | 333 | retval = -EBUSY; |
| 333 | goto err_device_unregister; | 334 | goto err_iounmap_all; |
| 334 | } | 335 | } |
| 335 | 336 | ||
| 336 | retval = request_irq(aie_irq, elapsedtime_interrupt, 0, | 337 | retval = devm_request_irq(&pdev->dev, aie_irq, elapsedtime_interrupt, 0, |
| 337 | "elapsed_time", pdev); | 338 | "elapsed_time", pdev); |
| 338 | if (retval < 0) | 339 | if (retval < 0) |
| 339 | goto err_device_unregister; | 340 | goto err_iounmap_all; |
| 340 | 341 | ||
| 341 | pie_irq = platform_get_irq(pdev, 1); | 342 | pie_irq = platform_get_irq(pdev, 1); |
| 342 | if (pie_irq <= 0) { | 343 | if (pie_irq <= 0) { |
| 343 | retval = -EBUSY; | 344 | retval = -EBUSY; |
| 344 | goto err_free_irq; | 345 | goto err_iounmap_all; |
| 345 | } | 346 | } |
| 346 | 347 | ||
| 347 | retval = request_irq(pie_irq, rtclong1_interrupt, 0, | 348 | retval = devm_request_irq(&pdev->dev, pie_irq, rtclong1_interrupt, 0, |
| 348 | "rtclong1", pdev); | 349 | "rtclong1", pdev); |
| 349 | if (retval < 0) | 350 | if (retval < 0) |
| 350 | goto err_free_irq; | 351 | goto err_iounmap_all; |
| 351 | 352 | ||
| 352 | platform_set_drvdata(pdev, rtc); | 353 | platform_set_drvdata(pdev, rtc); |
| 353 | 354 | ||
| @@ -358,47 +359,20 @@ static int rtc_probe(struct platform_device *pdev) | |||
| 358 | 359 | ||
| 359 | return 0; | 360 | return 0; |
| 360 | 361 | ||
| 361 | err_free_irq: | ||
| 362 | free_irq(aie_irq, pdev); | ||
| 363 | |||
| 364 | err_device_unregister: | ||
| 365 | rtc_device_unregister(rtc); | ||
| 366 | |||
| 367 | err_iounmap_all: | 362 | err_iounmap_all: |
| 368 | iounmap(rtc2_base); | ||
| 369 | rtc2_base = NULL; | 363 | rtc2_base = NULL; |
| 370 | 364 | ||
| 371 | err_rtc1_iounmap: | 365 | err_rtc1_iounmap: |
| 372 | iounmap(rtc1_base); | ||
| 373 | rtc1_base = NULL; | 366 | rtc1_base = NULL; |
| 374 | 367 | ||
| 375 | return retval; | 368 | return retval; |
| 376 | } | 369 | } |
| 377 | 370 | ||
| 378 | static int rtc_remove(struct platform_device *pdev) | ||
| 379 | { | ||
| 380 | struct rtc_device *rtc; | ||
| 381 | |||
| 382 | rtc = platform_get_drvdata(pdev); | ||
| 383 | if (rtc) | ||
| 384 | rtc_device_unregister(rtc); | ||
| 385 | |||
| 386 | free_irq(aie_irq, pdev); | ||
| 387 | free_irq(pie_irq, pdev); | ||
| 388 | if (rtc1_base) | ||
| 389 | iounmap(rtc1_base); | ||
| 390 | if (rtc2_base) | ||
| 391 | iounmap(rtc2_base); | ||
| 392 | |||
| 393 | return 0; | ||
| 394 | } | ||
| 395 | |||
| 396 | /* work with hotplug and coldplug */ | 371 | /* work with hotplug and coldplug */ |
| 397 | MODULE_ALIAS("platform:RTC"); | 372 | MODULE_ALIAS("platform:RTC"); |
| 398 | 373 | ||
| 399 | static struct platform_driver rtc_platform_driver = { | 374 | static struct platform_driver rtc_platform_driver = { |
| 400 | .probe = rtc_probe, | 375 | .probe = rtc_probe, |
| 401 | .remove = rtc_remove, | ||
| 402 | .driver = { | 376 | .driver = { |
| 403 | .name = rtc_name, | 377 | .name = rtc_name, |
| 404 | .owner = THIS_MODULE, | 378 | .owner = THIS_MODULE, |
diff --git a/drivers/video/aty/aty128fb.c b/drivers/video/aty/aty128fb.c index 12ca031877d4..52108be69e77 100644 --- a/drivers/video/aty/aty128fb.c +++ b/drivers/video/aty/aty128fb.c | |||
| @@ -357,11 +357,13 @@ static int default_lcd_on = 1; | |||
| 357 | static bool mtrr = true; | 357 | static bool mtrr = true; |
| 358 | #endif | 358 | #endif |
| 359 | 359 | ||
| 360 | #ifdef CONFIG_FB_ATY128_BACKLIGHT | ||
| 360 | #ifdef CONFIG_PMAC_BACKLIGHT | 361 | #ifdef CONFIG_PMAC_BACKLIGHT |
| 361 | static int backlight = 1; | 362 | static int backlight = 1; |
| 362 | #else | 363 | #else |
| 363 | static int backlight = 0; | 364 | static int backlight = 0; |
| 364 | #endif | 365 | #endif |
| 366 | #endif | ||
| 365 | 367 | ||
| 366 | /* PLL constants */ | 368 | /* PLL constants */ |
| 367 | struct aty128_constants { | 369 | struct aty128_constants { |
| @@ -1671,7 +1673,9 @@ static int aty128fb_setup(char *options) | |||
| 1671 | default_crt_on = simple_strtoul(this_opt+4, NULL, 0); | 1673 | default_crt_on = simple_strtoul(this_opt+4, NULL, 0); |
| 1672 | continue; | 1674 | continue; |
| 1673 | } else if (!strncmp(this_opt, "backlight:", 10)) { | 1675 | } else if (!strncmp(this_opt, "backlight:", 10)) { |
| 1676 | #ifdef CONFIG_FB_ATY128_BACKLIGHT | ||
| 1674 | backlight = simple_strtoul(this_opt+10, NULL, 0); | 1677 | backlight = simple_strtoul(this_opt+10, NULL, 0); |
| 1678 | #endif | ||
| 1675 | continue; | 1679 | continue; |
| 1676 | } | 1680 | } |
| 1677 | #ifdef CONFIG_MTRR | 1681 | #ifdef CONFIG_MTRR |
diff --git a/drivers/video/backlight/hp680_bl.c b/drivers/video/backlight/hp680_bl.c index 00076ecfe9b8..8ea42b8d9bc8 100644 --- a/drivers/video/backlight/hp680_bl.c +++ b/drivers/video/backlight/hp680_bl.c | |||
| @@ -110,8 +110,8 @@ static int hp680bl_probe(struct platform_device *pdev) | |||
| 110 | memset(&props, 0, sizeof(struct backlight_properties)); | 110 | memset(&props, 0, sizeof(struct backlight_properties)); |
| 111 | props.type = BACKLIGHT_RAW; | 111 | props.type = BACKLIGHT_RAW; |
| 112 | props.max_brightness = HP680_MAX_INTENSITY; | 112 | props.max_brightness = HP680_MAX_INTENSITY; |
| 113 | bd = backlight_device_register("hp680-bl", &pdev->dev, NULL, | 113 | bd = devm_backlight_device_register(&pdev->dev, "hp680-bl", &pdev->dev, |
| 114 | &hp680bl_ops, &props); | 114 | NULL, &hp680bl_ops, &props); |
| 115 | if (IS_ERR(bd)) | 115 | if (IS_ERR(bd)) |
| 116 | return PTR_ERR(bd); | 116 | return PTR_ERR(bd); |
| 117 | 117 | ||
| @@ -131,8 +131,6 @@ static int hp680bl_remove(struct platform_device *pdev) | |||
| 131 | bd->props.power = 0; | 131 | bd->props.power = 0; |
| 132 | hp680bl_send_intensity(bd); | 132 | hp680bl_send_intensity(bd); |
| 133 | 133 | ||
| 134 | backlight_device_unregister(bd); | ||
| 135 | |||
| 136 | return 0; | 134 | return 0; |
| 137 | } | 135 | } |
| 138 | 136 | ||
diff --git a/drivers/video/backlight/jornada720_bl.c b/drivers/video/backlight/jornada720_bl.c index 3ccb89340f22..6ce96b4a8796 100644 --- a/drivers/video/backlight/jornada720_bl.c +++ b/drivers/video/backlight/jornada720_bl.c | |||
| @@ -115,9 +115,10 @@ static int jornada_bl_probe(struct platform_device *pdev) | |||
| 115 | memset(&props, 0, sizeof(struct backlight_properties)); | 115 | memset(&props, 0, sizeof(struct backlight_properties)); |
| 116 | props.type = BACKLIGHT_RAW; | 116 | props.type = BACKLIGHT_RAW; |
| 117 | props.max_brightness = BL_MAX_BRIGHT; | 117 | props.max_brightness = BL_MAX_BRIGHT; |
| 118 | bd = backlight_device_register(S1D_DEVICENAME, &pdev->dev, NULL, | ||
| 119 | &jornada_bl_ops, &props); | ||
| 120 | 118 | ||
| 119 | bd = devm_backlight_device_register(&pdev->dev, S1D_DEVICENAME, | ||
| 120 | &pdev->dev, NULL, &jornada_bl_ops, | ||
| 121 | &props); | ||
| 121 | if (IS_ERR(bd)) { | 122 | if (IS_ERR(bd)) { |
| 122 | ret = PTR_ERR(bd); | 123 | ret = PTR_ERR(bd); |
| 123 | dev_err(&pdev->dev, "failed to register device, err=%x\n", ret); | 124 | dev_err(&pdev->dev, "failed to register device, err=%x\n", ret); |
| @@ -139,18 +140,8 @@ static int jornada_bl_probe(struct platform_device *pdev) | |||
| 139 | return 0; | 140 | return 0; |
| 140 | } | 141 | } |
| 141 | 142 | ||
| 142 | static int jornada_bl_remove(struct platform_device *pdev) | ||
| 143 | { | ||
| 144 | struct backlight_device *bd = platform_get_drvdata(pdev); | ||
| 145 | |||
| 146 | backlight_device_unregister(bd); | ||
| 147 | |||
| 148 | return 0; | ||
| 149 | } | ||
| 150 | |||
| 151 | static struct platform_driver jornada_bl_driver = { | 143 | static struct platform_driver jornada_bl_driver = { |
| 152 | .probe = jornada_bl_probe, | 144 | .probe = jornada_bl_probe, |
| 153 | .remove = jornada_bl_remove, | ||
| 154 | .driver = { | 145 | .driver = { |
| 155 | .name = "jornada_bl", | 146 | .name = "jornada_bl", |
| 156 | }, | 147 | }, |
diff --git a/drivers/video/backlight/jornada720_lcd.c b/drivers/video/backlight/jornada720_lcd.c index b061413f1a65..da3876c9b3ae 100644 --- a/drivers/video/backlight/jornada720_lcd.c +++ b/drivers/video/backlight/jornada720_lcd.c | |||
| @@ -100,7 +100,8 @@ static int jornada_lcd_probe(struct platform_device *pdev) | |||
| 100 | struct lcd_device *lcd_device; | 100 | struct lcd_device *lcd_device; |
| 101 | int ret; | 101 | int ret; |
| 102 | 102 | ||
| 103 | lcd_device = lcd_device_register(S1D_DEVICENAME, &pdev->dev, NULL, &jornada_lcd_props); | 103 | lcd_device = devm_lcd_device_register(&pdev->dev, S1D_DEVICENAME, |
| 104 | &pdev->dev, NULL, &jornada_lcd_props); | ||
| 104 | 105 | ||
| 105 | if (IS_ERR(lcd_device)) { | 106 | if (IS_ERR(lcd_device)) { |
| 106 | ret = PTR_ERR(lcd_device); | 107 | ret = PTR_ERR(lcd_device); |
| @@ -119,18 +120,8 @@ static int jornada_lcd_probe(struct platform_device *pdev) | |||
| 119 | return 0; | 120 | return 0; |
| 120 | } | 121 | } |
| 121 | 122 | ||
| 122 | static int jornada_lcd_remove(struct platform_device *pdev) | ||
| 123 | { | ||
| 124 | struct lcd_device *lcd_device = platform_get_drvdata(pdev); | ||
| 125 | |||
| 126 | lcd_device_unregister(lcd_device); | ||
| 127 | |||
| 128 | return 0; | ||
| 129 | } | ||
| 130 | |||
| 131 | static struct platform_driver jornada_lcd_driver = { | 123 | static struct platform_driver jornada_lcd_driver = { |
| 132 | .probe = jornada_lcd_probe, | 124 | .probe = jornada_lcd_probe, |
| 133 | .remove = jornada_lcd_remove, | ||
| 134 | .driver = { | 125 | .driver = { |
| 135 | .name = "jornada_lcd", | 126 | .name = "jornada_lcd", |
| 136 | }, | 127 | }, |
diff --git a/drivers/video/backlight/kb3886_bl.c b/drivers/video/backlight/kb3886_bl.c index 7592cc25c963..84a110a719cb 100644 --- a/drivers/video/backlight/kb3886_bl.c +++ b/drivers/video/backlight/kb3886_bl.c | |||
| @@ -78,7 +78,7 @@ static struct kb3886bl_machinfo *bl_machinfo; | |||
| 78 | static unsigned long kb3886bl_flags; | 78 | static unsigned long kb3886bl_flags; |
| 79 | #define KB3886BL_SUSPENDED 0x01 | 79 | #define KB3886BL_SUSPENDED 0x01 |
| 80 | 80 | ||
| 81 | static struct dmi_system_id __initdata kb3886bl_device_table[] = { | 81 | static struct dmi_system_id kb3886bl_device_table[] __initdata = { |
| 82 | { | 82 | { |
| 83 | .ident = "Sahara Touch-iT", | 83 | .ident = "Sahara Touch-iT", |
| 84 | .matches = { | 84 | .matches = { |
diff --git a/drivers/video/backlight/l4f00242t03.c b/drivers/video/backlight/l4f00242t03.c index b5fc13bc24e7..63e763828e0e 100644 --- a/drivers/video/backlight/l4f00242t03.c +++ b/drivers/video/backlight/l4f00242t03.c | |||
| @@ -223,8 +223,8 @@ static int l4f00242t03_probe(struct spi_device *spi) | |||
| 223 | return PTR_ERR(priv->core_reg); | 223 | return PTR_ERR(priv->core_reg); |
| 224 | } | 224 | } |
| 225 | 225 | ||
| 226 | priv->ld = lcd_device_register("l4f00242t03", | 226 | priv->ld = devm_lcd_device_register(&spi->dev, "l4f00242t03", &spi->dev, |
| 227 | &spi->dev, priv, &l4f_ops); | 227 | priv, &l4f_ops); |
| 228 | if (IS_ERR(priv->ld)) | 228 | if (IS_ERR(priv->ld)) |
| 229 | return PTR_ERR(priv->ld); | 229 | return PTR_ERR(priv->ld); |
| 230 | 230 | ||
| @@ -243,8 +243,6 @@ static int l4f00242t03_remove(struct spi_device *spi) | |||
| 243 | struct l4f00242t03_priv *priv = spi_get_drvdata(spi); | 243 | struct l4f00242t03_priv *priv = spi_get_drvdata(spi); |
| 244 | 244 | ||
| 245 | l4f00242t03_lcd_power_set(priv->ld, FB_BLANK_POWERDOWN); | 245 | l4f00242t03_lcd_power_set(priv->ld, FB_BLANK_POWERDOWN); |
| 246 | lcd_device_unregister(priv->ld); | ||
| 247 | |||
| 248 | return 0; | 246 | return 0; |
| 249 | } | 247 | } |
| 250 | 248 | ||
diff --git a/drivers/video/backlight/lp855x_bl.c b/drivers/video/backlight/lp855x_bl.c index cae80d555e84..2ca3a040007b 100644 --- a/drivers/video/backlight/lp855x_bl.c +++ b/drivers/video/backlight/lp855x_bl.c | |||
| @@ -125,7 +125,7 @@ static bool lp855x_is_valid_rom_area(struct lp855x *lp, u8 addr) | |||
| 125 | return false; | 125 | return false; |
| 126 | } | 126 | } |
| 127 | 127 | ||
| 128 | return (addr >= start && addr <= end); | 128 | return addr >= start && addr <= end; |
| 129 | } | 129 | } |
| 130 | 130 | ||
| 131 | static int lp8557_bl_off(struct lp855x *lp) | 131 | static int lp8557_bl_off(struct lp855x *lp) |
diff --git a/drivers/video/backlight/lp8788_bl.c b/drivers/video/backlight/lp8788_bl.c index e49905d495dc..daba34dc46d4 100644 --- a/drivers/video/backlight/lp8788_bl.c +++ b/drivers/video/backlight/lp8788_bl.c | |||
| @@ -63,13 +63,13 @@ static struct lp8788_bl_config default_bl_config = { | |||
| 63 | 63 | ||
| 64 | static inline bool is_brightness_ctrl_by_pwm(enum lp8788_bl_ctrl_mode mode) | 64 | static inline bool is_brightness_ctrl_by_pwm(enum lp8788_bl_ctrl_mode mode) |
| 65 | { | 65 | { |
| 66 | return (mode == LP8788_BL_COMB_PWM_BASED); | 66 | return mode == LP8788_BL_COMB_PWM_BASED; |
| 67 | } | 67 | } |
| 68 | 68 | ||
| 69 | static inline bool is_brightness_ctrl_by_register(enum lp8788_bl_ctrl_mode mode) | 69 | static inline bool is_brightness_ctrl_by_register(enum lp8788_bl_ctrl_mode mode) |
| 70 | { | 70 | { |
| 71 | return (mode == LP8788_BL_REGISTER_ONLY || | 71 | return mode == LP8788_BL_REGISTER_ONLY || |
| 72 | mode == LP8788_BL_COMB_REGISTER_BASED); | 72 | mode == LP8788_BL_COMB_REGISTER_BASED; |
| 73 | } | 73 | } |
| 74 | 74 | ||
| 75 | static int lp8788_backlight_configure(struct lp8788_bl *bl) | 75 | static int lp8788_backlight_configure(struct lp8788_bl *bl) |
diff --git a/drivers/video/backlight/omap1_bl.c b/drivers/video/backlight/omap1_bl.c index ac11a4650c19..a0dcd88ac74f 100644 --- a/drivers/video/backlight/omap1_bl.c +++ b/drivers/video/backlight/omap1_bl.c | |||
| @@ -146,8 +146,8 @@ static int omapbl_probe(struct platform_device *pdev) | |||
| 146 | memset(&props, 0, sizeof(struct backlight_properties)); | 146 | memset(&props, 0, sizeof(struct backlight_properties)); |
| 147 | props.type = BACKLIGHT_RAW; | 147 | props.type = BACKLIGHT_RAW; |
| 148 | props.max_brightness = OMAPBL_MAX_INTENSITY; | 148 | props.max_brightness = OMAPBL_MAX_INTENSITY; |
| 149 | dev = backlight_device_register("omap-bl", &pdev->dev, bl, &omapbl_ops, | 149 | dev = devm_backlight_device_register(&pdev->dev, "omap-bl", &pdev->dev, |
| 150 | &props); | 150 | bl, &omapbl_ops, &props); |
| 151 | if (IS_ERR(dev)) | 151 | if (IS_ERR(dev)) |
| 152 | return PTR_ERR(dev); | 152 | return PTR_ERR(dev); |
| 153 | 153 | ||
| @@ -170,20 +170,10 @@ static int omapbl_probe(struct platform_device *pdev) | |||
| 170 | return 0; | 170 | return 0; |
| 171 | } | 171 | } |
| 172 | 172 | ||
| 173 | static int omapbl_remove(struct platform_device *pdev) | ||
| 174 | { | ||
| 175 | struct backlight_device *dev = platform_get_drvdata(pdev); | ||
| 176 | |||
| 177 | backlight_device_unregister(dev); | ||
| 178 | |||
| 179 | return 0; | ||
| 180 | } | ||
| 181 | |||
| 182 | static SIMPLE_DEV_PM_OPS(omapbl_pm_ops, omapbl_suspend, omapbl_resume); | 173 | static SIMPLE_DEV_PM_OPS(omapbl_pm_ops, omapbl_suspend, omapbl_resume); |
| 183 | 174 | ||
| 184 | static struct platform_driver omapbl_driver = { | 175 | static struct platform_driver omapbl_driver = { |
| 185 | .probe = omapbl_probe, | 176 | .probe = omapbl_probe, |
| 186 | .remove = omapbl_remove, | ||
| 187 | .driver = { | 177 | .driver = { |
| 188 | .name = "omap-bl", | 178 | .name = "omap-bl", |
| 189 | .pm = &omapbl_pm_ops, | 179 | .pm = &omapbl_pm_ops, |
diff --git a/drivers/video/backlight/ot200_bl.c b/drivers/video/backlight/ot200_bl.c index fdbb6ee5027c..f5a5202dd79d 100644 --- a/drivers/video/backlight/ot200_bl.c +++ b/drivers/video/backlight/ot200_bl.c | |||
| @@ -118,8 +118,9 @@ static int ot200_backlight_probe(struct platform_device *pdev) | |||
| 118 | props.brightness = 100; | 118 | props.brightness = 100; |
| 119 | props.type = BACKLIGHT_RAW; | 119 | props.type = BACKLIGHT_RAW; |
| 120 | 120 | ||
| 121 | bl = backlight_device_register(dev_name(&pdev->dev), &pdev->dev, data, | 121 | bl = devm_backlight_device_register(&pdev->dev, dev_name(&pdev->dev), |
| 122 | &ot200_backlight_ops, &props); | 122 | &pdev->dev, data, &ot200_backlight_ops, |
| 123 | &props); | ||
| 123 | if (IS_ERR(bl)) { | 124 | if (IS_ERR(bl)) { |
| 124 | dev_err(&pdev->dev, "failed to register backlight\n"); | 125 | dev_err(&pdev->dev, "failed to register backlight\n"); |
| 125 | retval = PTR_ERR(bl); | 126 | retval = PTR_ERR(bl); |
| @@ -137,10 +138,6 @@ error_devm_kzalloc: | |||
| 137 | 138 | ||
| 138 | static int ot200_backlight_remove(struct platform_device *pdev) | 139 | static int ot200_backlight_remove(struct platform_device *pdev) |
| 139 | { | 140 | { |
| 140 | struct backlight_device *bl = platform_get_drvdata(pdev); | ||
| 141 | |||
| 142 | backlight_device_unregister(bl); | ||
| 143 | |||
| 144 | /* on module unload set brightness to 100% */ | 141 | /* on module unload set brightness to 100% */ |
| 145 | cs5535_mfgpt_write(pwm_timer, MFGPT_REG_COUNTER, 0); | 142 | cs5535_mfgpt_write(pwm_timer, MFGPT_REG_COUNTER, 0); |
| 146 | cs5535_mfgpt_write(pwm_timer, MFGPT_REG_SETUP, MFGPT_SETUP_CNTEN); | 143 | cs5535_mfgpt_write(pwm_timer, MFGPT_REG_SETUP, MFGPT_SETUP_CNTEN); |
diff --git a/drivers/video/backlight/tosa_bl.c b/drivers/video/backlight/tosa_bl.c index b8db9338cacd..3ad676558c80 100644 --- a/drivers/video/backlight/tosa_bl.c +++ b/drivers/video/backlight/tosa_bl.c | |||
| @@ -105,8 +105,9 @@ static int tosa_bl_probe(struct i2c_client *client, | |||
| 105 | memset(&props, 0, sizeof(struct backlight_properties)); | 105 | memset(&props, 0, sizeof(struct backlight_properties)); |
| 106 | props.type = BACKLIGHT_RAW; | 106 | props.type = BACKLIGHT_RAW; |
| 107 | props.max_brightness = 512 - 1; | 107 | props.max_brightness = 512 - 1; |
| 108 | data->bl = backlight_device_register("tosa-bl", &client->dev, data, | 108 | data->bl = devm_backlight_device_register(&client->dev, "tosa-bl", |
| 109 | &bl_ops, &props); | 109 | &client->dev, data, &bl_ops, |
| 110 | &props); | ||
| 110 | if (IS_ERR(data->bl)) { | 111 | if (IS_ERR(data->bl)) { |
| 111 | ret = PTR_ERR(data->bl); | 112 | ret = PTR_ERR(data->bl); |
| 112 | goto err_reg; | 113 | goto err_reg; |
| @@ -128,9 +129,7 @@ static int tosa_bl_remove(struct i2c_client *client) | |||
| 128 | { | 129 | { |
| 129 | struct tosa_bl_data *data = i2c_get_clientdata(client); | 130 | struct tosa_bl_data *data = i2c_get_clientdata(client); |
| 130 | 131 | ||
| 131 | backlight_device_unregister(data->bl); | ||
| 132 | data->bl = NULL; | 132 | data->bl = NULL; |
| 133 | |||
| 134 | return 0; | 133 | return 0; |
| 135 | } | 134 | } |
| 136 | 135 | ||
diff --git a/drivers/video/backlight/tosa_lcd.c b/drivers/video/backlight/tosa_lcd.c index be5d636764bf..f08d641ccd01 100644 --- a/drivers/video/backlight/tosa_lcd.c +++ b/drivers/video/backlight/tosa_lcd.c | |||
| @@ -206,8 +206,8 @@ static int tosa_lcd_probe(struct spi_device *spi) | |||
| 206 | 206 | ||
| 207 | tosa_lcd_tg_on(data); | 207 | tosa_lcd_tg_on(data); |
| 208 | 208 | ||
| 209 | data->lcd = lcd_device_register("tosa-lcd", &spi->dev, data, | 209 | data->lcd = devm_lcd_device_register(&spi->dev, "tosa-lcd", &spi->dev, |
| 210 | &tosa_lcd_ops); | 210 | data, &tosa_lcd_ops); |
| 211 | 211 | ||
| 212 | if (IS_ERR(data->lcd)) { | 212 | if (IS_ERR(data->lcd)) { |
| 213 | ret = PTR_ERR(data->lcd); | 213 | ret = PTR_ERR(data->lcd); |
| @@ -226,8 +226,6 @@ static int tosa_lcd_remove(struct spi_device *spi) | |||
| 226 | { | 226 | { |
| 227 | struct tosa_lcd_data *data = spi_get_drvdata(spi); | 227 | struct tosa_lcd_data *data = spi_get_drvdata(spi); |
| 228 | 228 | ||
| 229 | lcd_device_unregister(data->lcd); | ||
| 230 | |||
| 231 | if (data->i2c) | 229 | if (data->i2c) |
| 232 | i2c_unregister_device(data->i2c); | 230 | i2c_unregister_device(data->i2c); |
| 233 | 231 | ||
diff --git a/drivers/vlynq/vlynq.c b/drivers/vlynq/vlynq.c index 7b07135ab26e..c0227f9418eb 100644 --- a/drivers/vlynq/vlynq.c +++ b/drivers/vlynq/vlynq.c | |||
| @@ -762,7 +762,8 @@ static int vlynq_remove(struct platform_device *pdev) | |||
| 762 | 762 | ||
| 763 | device_unregister(&dev->dev); | 763 | device_unregister(&dev->dev); |
| 764 | iounmap(dev->local); | 764 | iounmap(dev->local); |
| 765 | release_mem_region(dev->regs_start, dev->regs_end - dev->regs_start); | 765 | release_mem_region(dev->regs_start, |
| 766 | dev->regs_end - dev->regs_start + 1); | ||
| 766 | 767 | ||
| 767 | kfree(dev); | 768 | kfree(dev); |
| 768 | 769 | ||
diff --git a/drivers/w1/masters/w1-gpio.c b/drivers/w1/masters/w1-gpio.c index e36b18b2817b..9709b8b484ba 100644 --- a/drivers/w1/masters/w1-gpio.c +++ b/drivers/w1/masters/w1-gpio.c | |||
| @@ -18,10 +18,31 @@ | |||
| 18 | #include <linux/of_gpio.h> | 18 | #include <linux/of_gpio.h> |
| 19 | #include <linux/err.h> | 19 | #include <linux/err.h> |
| 20 | #include <linux/of.h> | 20 | #include <linux/of.h> |
| 21 | #include <linux/delay.h> | ||
| 21 | 22 | ||
| 22 | #include "../w1.h" | 23 | #include "../w1.h" |
| 23 | #include "../w1_int.h" | 24 | #include "../w1_int.h" |
| 24 | 25 | ||
| 26 | static u8 w1_gpio_set_pullup(void *data, int delay) | ||
| 27 | { | ||
| 28 | struct w1_gpio_platform_data *pdata = data; | ||
| 29 | |||
| 30 | if (delay) { | ||
| 31 | pdata->pullup_duration = delay; | ||
| 32 | } else { | ||
| 33 | if (pdata->pullup_duration) { | ||
| 34 | gpio_direction_output(pdata->pin, 1); | ||
| 35 | |||
| 36 | msleep(pdata->pullup_duration); | ||
| 37 | |||
| 38 | gpio_direction_input(pdata->pin); | ||
| 39 | } | ||
| 40 | pdata->pullup_duration = 0; | ||
| 41 | } | ||
| 42 | |||
| 43 | return 0; | ||
| 44 | } | ||
| 45 | |||
| 25 | static void w1_gpio_write_bit_dir(void *data, u8 bit) | 46 | static void w1_gpio_write_bit_dir(void *data, u8 bit) |
| 26 | { | 47 | { |
| 27 | struct w1_gpio_platform_data *pdata = data; | 48 | struct w1_gpio_platform_data *pdata = data; |
| @@ -132,6 +153,7 @@ static int w1_gpio_probe(struct platform_device *pdev) | |||
| 132 | } else { | 153 | } else { |
| 133 | gpio_direction_input(pdata->pin); | 154 | gpio_direction_input(pdata->pin); |
| 134 | master->write_bit = w1_gpio_write_bit_dir; | 155 | master->write_bit = w1_gpio_write_bit_dir; |
| 156 | master->set_pullup = w1_gpio_set_pullup; | ||
| 135 | } | 157 | } |
| 136 | 158 | ||
| 137 | err = w1_add_master_device(master); | 159 | err = w1_add_master_device(master); |
diff --git a/drivers/w1/w1_int.c b/drivers/w1/w1_int.c index 5a98649f6abc..590bd8a7cd1b 100644 --- a/drivers/w1/w1_int.c +++ b/drivers/w1/w1_int.c | |||
| @@ -117,18 +117,6 @@ int w1_add_master_device(struct w1_bus_master *master) | |||
| 117 | printk(KERN_ERR "w1_add_master_device: invalid function set\n"); | 117 | printk(KERN_ERR "w1_add_master_device: invalid function set\n"); |
| 118 | return(-EINVAL); | 118 | return(-EINVAL); |
| 119 | } | 119 | } |
| 120 | /* While it would be electrically possible to make a device that | ||
| 121 | * generated a strong pullup in bit bang mode, only hardware that | ||
| 122 | * controls 1-wire time frames are even expected to support a strong | ||
| 123 | * pullup. w1_io.c would need to support calling set_pullup before | ||
| 124 | * the last write_bit operation of a w1_write_8 which it currently | ||
| 125 | * doesn't. | ||
| 126 | */ | ||
| 127 | if (!master->write_byte && !master->touch_bit && master->set_pullup) { | ||
| 128 | printk(KERN_ERR "w1_add_master_device: set_pullup requires " | ||
| 129 | "write_byte or touch_bit, disabling\n"); | ||
| 130 | master->set_pullup = NULL; | ||
| 131 | } | ||
| 132 | 120 | ||
| 133 | /* Lock until the device is added (or not) to w1_masters. */ | 121 | /* Lock until the device is added (or not) to w1_masters. */ |
| 134 | mutex_lock(&w1_mlock); | 122 | mutex_lock(&w1_mlock); |
