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