浏览代码

Merge branch 'akpm' (incoming from Andrew)

Merge second batch of fixes from Andrew Morton:

 - various misc bits

 - some printk updates

 - a new "SRAM" driver.

 - MAINTAINERS updates

 - the backlight driver queue

 - checkpatch updates

 - a few init/ changes

 - a huge number of drivers/rtc changes

 - fatfs updates

 - some lib/idr.c work

 - some renaming of the random driver interfaces

* emailed patches from Andrew Morton <akpm@linux-foundation.org>: (285 commits)
  net: rename random32 to prandom
  net/core: remove duplicate statements by do-while loop
  net/core: rename random32() to prandom_u32()
  net/netfilter: rename random32() to prandom_u32()
  net/sched: rename random32() to prandom_u32()
  net/sunrpc: rename random32() to prandom_u32()
  scsi: rename random32() to prandom_u32()
  lguest: rename random32() to prandom_u32()
  uwb: rename random32() to prandom_u32()
  video/uvesafb: rename random32() to prandom_u32()
  mmc: rename random32() to prandom_u32()
  drbd: rename random32() to prandom_u32()
  kernel/: rename random32() to prandom_u32()
  mm/: rename random32() to prandom_u32()
  lib/: rename random32() to prandom_u32()
  x86: rename random32() to prandom_u32()
  x86: pageattr-test: remove srandom32 call
  uuid: use prandom_bytes()
  raid6test: use prandom_bytes()
  sctp: convert sctp_assoc_set_id() to use idr_alloc_cyclic()
  ...
Linus Torvalds 12 年之前
父节点
当前提交
56847d857c
共有 100 个文件被更改,包括 931 次插入1220 次删除
  1. 4 0
      CREDITS
  2. 8 1
      Documentation/SubmittingPatches
  3. 0 7
      Documentation/backlight/lp855x-driver.txt
  4. 30 0
      Documentation/devicetree/bindings/media/coda.txt
  5. 16 0
      Documentation/devicetree/bindings/misc/sram.txt
  6. 15 0
      Documentation/devicetree/bindings/rtc/atmel,at91rm9200-rtc.txt
  7. 41 0
      Documentation/devicetree/bindings/video/backlight/lp855x.txt
  8. 27 0
      Documentation/devicetree/bindings/video/backlight/tps65217-backlight.txt
  9. 21 5
      Documentation/filesystems/vfat.txt
  10. 13 11
      MAINTAINERS
  11. 3 14
      arch/arm/kernel/early_printk.c
  12. 0 2
      arch/blackfin/kernel/early_printk.c
  13. 4 22
      arch/microblaze/kernel/early_printk.c
  14. 6 6
      arch/mips/kernel/early_printk.c
  15. 2 4
      arch/powerpc/kernel/udbg.c
  16. 2 2
      arch/sh/kernel/sh_bios.c
  17. 5 22
      arch/tile/kernel/early_printk.c
  18. 5 3
      arch/um/kernel/early_printk.c
  19. 4 8
      arch/unicore32/kernel/early_printk.c
  20. 2 19
      arch/x86/kernel/early_printk.c
  21. 2 3
      arch/x86/mm/pageattr-test.c
  22. 2 7
      crypto/async_tx/raid6test.c
  23. 3 2
      drivers/block/drbd/drbd_receiver.c
  24. 0 1
      drivers/infiniband/hw/amso1100/c2.h
  25. 1 2
      drivers/infiniband/hw/amso1100/c2_qp.c
  26. 1 3
      drivers/infiniband/hw/mlx4/cm.c
  27. 1 1
      drivers/lguest/page_tables.c
  28. 0 1
      drivers/media/platform/Kconfig
  29. 31 14
      drivers/media/platform/coda.c
  30. 9 0
      drivers/misc/Kconfig
  31. 1 0
      drivers/misc/Makefile
  32. 121 0
      drivers/misc/sram.c
  33. 2 2
      drivers/mmc/core/core.c
  34. 3 1
      drivers/rpmsg/virtio_rpmsg_bus.c
  35. 70 0
      drivers/rtc/class.c
  36. 2 3
      drivers/rtc/rtc-88pm80x.c
  37. 11 18
      drivers/rtc/rtc-88pm860x.c
  38. 3 18
      drivers/rtc/rtc-ab3100.c
  39. 6 12
      drivers/rtc/rtc-ab8500.c
  40. 10 29
      drivers/rtc/rtc-at32ap700x.c
  41. 24 26
      drivers/rtc/rtc-at91rm9200.c
  42. 22 35
      drivers/rtc/rtc-at91sam9.c
  43. 2 16
      drivers/rtc/rtc-au1xxx.c
  44. 11 23
      drivers/rtc/rtc-bfin.c
  45. 1 4
      drivers/rtc/rtc-bq32k.c
  46. 8 21
      drivers/rtc/rtc-bq4802.c
  47. 2 2
      drivers/rtc/rtc-cmos.c
  48. 14 28
      drivers/rtc/rtc-coh901331.c
  49. 1 4
      drivers/rtc/rtc-da9052.c
  50. 1 4
      drivers/rtc/rtc-da9055.c
  51. 5 19
      drivers/rtc/rtc-davinci.c
  52. 2 5
      drivers/rtc/rtc-dm355evm.c
  53. 9 35
      drivers/rtc/rtc-ds1216.c
  54. 10 39
      drivers/rtc/rtc-ds1286.c
  55. 4 18
      drivers/rtc/rtc-ds1302.c
  56. 12 23
      drivers/rtc/rtc-ds1305.c
  57. 63 11
      drivers/rtc/rtc-ds1307.c
  58. 10 25
      drivers/rtc/rtc-ds1374.c
  59. 4 11
      drivers/rtc/rtc-ds1390.c
  60. 3 5
      drivers/rtc/rtc-ds1511.c
  61. 2 4
      drivers/rtc/rtc-ds1553.c
  62. 1 7
      drivers/rtc/rtc-ds1672.c
  63. 2 6
      drivers/rtc/rtc-ds1742.c
  64. 3 9
      drivers/rtc/rtc-ds2404.c
  65. 7 18
      drivers/rtc/rtc-ds3232.c
  66. 3 6
      drivers/rtc/rtc-ds3234.c
  67. 2 17
      drivers/rtc/rtc-efi.c
  68. 1 6
      drivers/rtc/rtc-em3027.c
  69. 3 8
      drivers/rtc/rtc-ep93xx.c
  70. 3 8
      drivers/rtc/rtc-fm3130.c
  71. 3 18
      drivers/rtc/rtc-generic.c
  72. 3 4
      drivers/rtc/rtc-hid-sensor-time.c
  73. 5 18
      drivers/rtc/rtc-imxdi.c
  74. 7 23
      drivers/rtc/rtc-isl12022.c
  75. 1 4
      drivers/rtc/rtc-lp8788.c
  76. 2 3
      drivers/rtc/rtc-lpc32xx.c
  77. 1 4
      drivers/rtc/rtc-ls1x.c
  78. 5 11
      drivers/rtc/rtc-m41t80.c
  79. 3 8
      drivers/rtc/rtc-m41t93.c
  80. 3 8
      drivers/rtc/rtc-m41t94.c
  81. 10 32
      drivers/rtc/rtc-m48t35.c
  82. 4 7
      drivers/rtc/rtc-m48t86.c
  83. 2 7
      drivers/rtc/rtc-max6900.c
  84. 13 16
      drivers/rtc/rtc-max6902.c
  85. 27 46
      drivers/rtc/rtc-max77686.c
  86. 4 16
      drivers/rtc/rtc-max8907.c
  87. 9 17
      drivers/rtc/rtc-max8925.c
  88. 4 13
      drivers/rtc/rtc-max8997.c
  89. 5 13
      drivers/rtc/rtc-max8998.c
  90. 4 19
      drivers/rtc/rtc-mc13xxx.c
  91. 12 33
      drivers/rtc/rtc-msm6242.c
  92. 6 17
      drivers/rtc/rtc-mv.c
  93. 4 11
      drivers/rtc/rtc-mxc.c
  94. 15 57
      drivers/rtc/rtc-nuc900.c
  95. 20 61
      drivers/rtc/rtc-omap.c
  96. 12 7
      drivers/rtc/rtc-palmas.c
  97. 16 37
      drivers/rtc/rtc-pcap.c
  98. 4 8
      drivers/rtc/rtc-pcf2123.c
  99. 4 11
      drivers/rtc/rtc-pcf50633.c
  100. 1 5
      drivers/rtc/rtc-pcf8523.c

+ 4 - 0
CREDITS

@@ -761,6 +761,10 @@ S: Northampton
 S: NN1 3QT
 S: NN1 3QT
 S: United Kingdom
 S: United Kingdom
 
 
+N: Massimo Dal Zotto
+E: dz@debian.org
+D: i8k Dell laptop SMM driver
+
 N: Uwe Dannowski
 N: Uwe Dannowski
 E: Uwe.Dannowski@ira.uka.de
 E: Uwe.Dannowski@ira.uka.de
 W: http://i30www.ira.uka.de/~dannowsk/
 W: http://i30www.ira.uka.de/~dannowsk/

+ 8 - 1
Documentation/SubmittingPatches

@@ -420,7 +420,7 @@ person it names.  This tag documents that potentially interested parties
 have been included in the discussion
 have been included in the discussion
 
 
 
 
-14) Using Reported-by:, Tested-by: and Reviewed-by:
+14) Using Reported-by:, Tested-by:, Reviewed-by: and Suggested-by:
 
 
 If this patch fixes a problem reported by somebody else, consider adding a
 If this patch fixes a problem reported by somebody else, consider adding a
 Reported-by: tag to credit the reporter for their contribution.  Please
 Reported-by: tag to credit the reporter for their contribution.  Please
@@ -468,6 +468,13 @@ done on the patch.  Reviewed-by: tags, when supplied by reviewers known to
 understand the subject area and to perform thorough reviews, will normally
 understand the subject area and to perform thorough reviews, will normally
 increase the likelihood of your patch getting into the kernel.
 increase the likelihood of your patch getting into the kernel.
 
 
+A Suggested-by: tag indicates that the patch idea is suggested by the person
+named and ensures credit to the person for the idea. Please note that this
+tag should not be added without the reporter's permission, especially if the
+idea was not posted in a public forum. That said, if we diligently credit our
+idea reporters, they will, hopefully, be inspired to help us again in the
+future.
+
 
 
 15) The canonical patch format
 15) The canonical patch format
 
 

+ 0 - 7
Documentation/backlight/lp855x-driver.txt

@@ -32,14 +32,10 @@ Platform data for lp855x
 For supporting platform specific data, the lp855x platform data can be used.
 For supporting platform specific data, the lp855x platform data can be used.
 
 
 * name : Backlight driver name. If it is not defined, default name is set.
 * name : Backlight driver name. If it is not defined, default name is set.
-* mode : Brightness control mode. PWM or register based.
 * device_control : Value of DEVICE CONTROL register.
 * device_control : Value of DEVICE CONTROL register.
 * initial_brightness : Initial value of backlight brightness.
 * initial_brightness : Initial value of backlight brightness.
 * period_ns : Platform specific PWM period value. unit is nano.
 * period_ns : Platform specific PWM period value. unit is nano.
 	     Only valid when brightness is pwm input mode.
 	     Only valid when brightness is pwm input mode.
-* load_new_rom_data :
-	0 : use default configuration data
-	1 : update values of eeprom or eprom registers on loading driver
 * size_program : Total size of lp855x_rom_data.
 * size_program : Total size of lp855x_rom_data.
 * rom_data : List of new eeprom/eprom registers.
 * rom_data : List of new eeprom/eprom registers.
 
 
@@ -54,10 +50,8 @@ static struct lp855x_rom_data lp8552_eeprom_arr[] = {
 
 
 static struct lp855x_platform_data lp8552_pdata = {
 static struct lp855x_platform_data lp8552_pdata = {
 	.name = "lcd-bl",
 	.name = "lcd-bl",
-	.mode = REGISTER_BASED,
 	.device_control = I2C_CONFIG(LP8552),
 	.device_control = I2C_CONFIG(LP8552),
 	.initial_brightness = INITIAL_BRT,
 	.initial_brightness = INITIAL_BRT,
-	.load_new_rom_data = 1,
 	.size_program = ARRAY_SIZE(lp8552_eeprom_arr),
 	.size_program = ARRAY_SIZE(lp8552_eeprom_arr),
 	.rom_data = lp8552_eeprom_arr,
 	.rom_data = lp8552_eeprom_arr,
 };
 };
@@ -65,7 +59,6 @@ static struct lp855x_platform_data lp8552_pdata = {
 example 2) lp8556 platform data : pwm input mode with default rom data
 example 2) lp8556 platform data : pwm input mode with default rom data
 
 
 static struct lp855x_platform_data lp8556_pdata = {
 static struct lp855x_platform_data lp8556_pdata = {
-	.mode = PWM_BASED,
 	.device_control = PWM_CONFIG(LP8556),
 	.device_control = PWM_CONFIG(LP8556),
 	.initial_brightness = INITIAL_BRT,
 	.initial_brightness = INITIAL_BRT,
 	.period_ns = 1000000,
 	.period_ns = 1000000,

+ 30 - 0
Documentation/devicetree/bindings/media/coda.txt

@@ -0,0 +1,30 @@
+Chips&Media Coda multi-standard codec IP
+========================================
+
+Coda codec IPs are present in i.MX SoCs in various versions,
+called VPU (Video Processing Unit).
+
+Required properties:
+- compatible : should be "fsl,<chip>-src" for i.MX SoCs:
+  (a) "fsl,imx27-vpu" for CodaDx6 present in i.MX27
+  (b) "fsl,imx53-vpu" for CODA7541 present in i.MX53
+  (c) "fsl,imx6q-vpu" for CODA960 present in i.MX6q
+- reg: should be register base and length as documented in the
+  SoC reference manual
+- interrupts : Should contain the VPU interrupt. For CODA960,
+  a second interrupt is needed for the MJPEG unit.
+- clocks : Should contain the ahb and per clocks, in the order
+  determined by the clock-names property.
+- clock-names : Should be "ahb", "per"
+- iram : phandle pointing to the SRAM device node
+
+Example:
+
+vpu: vpu@63ff4000 {
+	compatible = "fsl,imx53-vpu";
+	reg = <0x63ff4000 0x1000>;
+	interrupts = <9>;
+	clocks = <&clks 63>, <&clks 63>;
+	clock-names = "ahb", "per";
+	iram = <&ocram>;
+};

+ 16 - 0
Documentation/devicetree/bindings/misc/sram.txt

@@ -0,0 +1,16 @@
+Generic on-chip SRAM
+
+Simple IO memory regions to be managed by the genalloc API.
+
+Required properties:
+
+- compatible : mmio-sram
+
+- reg : SRAM iomem address range
+
+Example:
+
+sram: sram@5c000000 {
+	compatible = "mmio-sram";
+	reg = <0x5c000000 0x40000>; /* 256 KiB SRAM at address 0x5c000000 */
+};

+ 15 - 0
Documentation/devicetree/bindings/rtc/atmel,at91rm9200-rtc.txt

@@ -0,0 +1,15 @@
+Atmel AT91RM9200 Real Time Clock
+
+Required properties:
+- compatible: should be: "atmel,at91rm9200-rtc"
+- reg: physical base address of the controller and length of memory mapped
+  region.
+- interrupts: rtc alarm/event interrupt
+
+Example:
+
+rtc@fffffe00 {
+	compatible = "atmel,at91rm9200-rtc";
+	reg = <0xfffffe00 0x100>;
+	interrupts = <1 4 7>;
+};

+ 41 - 0
Documentation/devicetree/bindings/video/backlight/lp855x.txt

@@ -0,0 +1,41 @@
+lp855x bindings
+
+Required properties:
+  - compatible: "ti,lp8550", "ti,lp8551", "ti,lp8552", "ti,lp8553",
+                "ti,lp8556", "ti,lp8557"
+  - reg: I2C slave address (u8)
+  - dev-ctrl: Value of DEVICE CONTROL register (u8). It depends on the device.
+
+Optional properties:
+  - bl-name: Backlight device name (string)
+  - init-brt: Initial value of backlight brightness (u8)
+  - pwm-period: PWM period value. Set only PWM input mode used (u32)
+  - rom-addr: Register address of ROM area to be updated (u8)
+  - rom-val: Register value to be updated (u8)
+
+Example:
+
+	/* LP8556 */
+	backlight@2c {
+		compatible = "ti,lp8556";
+		reg = <0x2c>;
+
+		bl-name = "lcd-bl";
+		dev-ctrl = /bits/ 8 <0x85>;
+		init-brt = /bits/ 8 <0x10>;
+	};
+
+	/* LP8557 */
+	backlight@2c {
+		compatible = "ti,lp8557";
+		reg = <0x2c>;
+
+		dev-ctrl = /bits/ 8 <0x41>;
+		init-brt = /bits/ 8 <0x0a>;
+
+		/* 4V OV, 4 output LED string enabled */
+		rom_14h {
+			rom-addr = /bits/ 8 <0x14>;
+			rom-val = /bits/ 8 <0xcf>;
+		};
+	};

+ 27 - 0
Documentation/devicetree/bindings/video/backlight/tps65217-backlight.txt

@@ -0,0 +1,27 @@
+TPS65217 family of regulators
+
+The TPS65217 chip contains a boost converter and current sinks which can be
+used to drive LEDs for use as backlights.
+
+Required properties:
+- compatible: "ti,tps65217"
+- reg: I2C slave address
+- backlight: node for specifying WLED1 and WLED2 lines in TPS65217
+- isel: selection bit, valid values: 1 for ISEL1 (low-level) and 2 for ISEL2 (high-level)
+- fdim: PWM dimming frequency, valid values: 100, 200, 500, 1000
+- default-brightness: valid values: 0-100
+
+Each regulator is defined using the standard binding for regulators.
+
+Example:
+
+	tps: tps@24 {
+		reg = <0x24>;
+		compatible = "ti,tps65217";
+		backlight {
+			isel = <1>;  /* 1 - ISET1, 2 ISET2 */
+			fdim = <100>; /* TPS65217_BL_FDIM_100HZ */
+			default-brightness = <50>;
+		};
+	};
+

+ 21 - 5
Documentation/filesystems/vfat.txt

@@ -150,12 +150,28 @@ discard       -- If set, issues discard/TRIM commands to the block
 		 device when blocks are freed. This is useful for SSD devices
 		 device when blocks are freed. This is useful for SSD devices
 		 and sparse/thinly-provisoned LUNs.
 		 and sparse/thinly-provisoned LUNs.
 
 
-nfs           -- This option maintains an index (cache) of directory
-		 inodes by i_logstart which is used by the nfs-related code to
-		 improve look-ups.
+nfs=stale_rw|nostale_ro
+		Enable this only if you want to export the FAT filesystem
+		over NFS.
+
+		stale_rw: This option maintains an index (cache) of directory
+		inodes by i_logstart which is used by the nfs-related code to
+		improve look-ups. Full file operations (read/write) over NFS is
+		supported but with cache eviction at NFS server, this could
+		result in ESTALE issues.
+
+		nostale_ro: This option bases the inode number and filehandle
+		on the on-disk location of a file in the MS-DOS directory entry.
+		This ensures that ESTALE will not be returned after a file is
+		evicted from the inode cache. However, it means that operations
+		such as rename, create and unlink could cause filehandles that
+		previously pointed at one file to point at a different file,
+		potentially causing data corruption. For this reason, this
+		option also mounts the filesystem readonly.
+
+		To maintain backward compatibility, '-o nfs' is also accepted,
+		defaulting to stale_rw
 
 
-		 Enable this only if you want to export the FAT filesystem
-		 over NFS
 
 
 <bool>: 0,1,yes,no,true,false
 <bool>: 0,1,yes,no,true,false
 
 

+ 13 - 11
MAINTAINERS

@@ -90,6 +90,9 @@ Descriptions of section entries:
 	   F:	drivers/net/*	all files in drivers/net, but not below
 	   F:	drivers/net/*	all files in drivers/net, but not below
 	   F:	*/net/*		all files in "any top level directory"/net
 	   F:	*/net/*		all files in "any top level directory"/net
 	   One pattern per line.  Multiple F: lines acceptable.
 	   One pattern per line.  Multiple F: lines acceptable.
+	N: Files and directories with regex patterns.
+	   N:	[^a-z]tegra	all files whose path contains the word tegra
+	   One pattern per line.  Multiple N: lines acceptable.
 	X: Files and directories that are NOT maintained, same rules as F:
 	X: Files and directories that are NOT maintained, same rules as F:
 	   Files exclusions are tested before file matches.
 	   Files exclusions are tested before file matches.
 	   Can be useful for excluding a specific subdirectory, for instance:
 	   Can be useful for excluding a specific subdirectory, for instance:
@@ -97,13 +100,12 @@ Descriptions of section entries:
 	   X:	net/ipv6/
 	   X:	net/ipv6/
 	   matches all files in and below net excluding net/ipv6/
 	   matches all files in and below net excluding net/ipv6/
 	K: Keyword perl extended regex pattern to match content in a
 	K: Keyword perl extended regex pattern to match content in a
-	   patch or file, or an affected filename.  For instance:
+	   patch or file.  For instance:
 	   K: of_get_profile
 	   K: of_get_profile
-	      matches patch or file content, or filenames, that contain
-	      "of_get_profile"
+	      matches patches or files that contain "of_get_profile"
 	   K: \b(printk|pr_(info|err))\b
 	   K: \b(printk|pr_(info|err))\b
-	      matches patch or file content, or filenames, that contain one or
-	      more of the words printk, pr_info or pr_err
+	      matches patches or files that contain one or more of the words
+	      printk, pr_info or pr_err
 	   One regex pattern per line.  Multiple K: lines acceptable.
 	   One regex pattern per line.  Multiple K: lines acceptable.
 
 
 Note: For the hard of thinking, this list is meant to remain in alphabetical
 Note: For the hard of thinking, this list is meant to remain in alphabetical
@@ -2442,9 +2444,7 @@ S:	Maintained
 F:	drivers/platform/x86/dell-laptop.c
 F:	drivers/platform/x86/dell-laptop.c
 
 
 DELL LAPTOP SMM DRIVER
 DELL LAPTOP SMM DRIVER
-M:	Massimo Dal Zotto <dz@debian.org>
-W:	http://www.debian.org/~dz/i8k/
-S:	Maintained
+S:	Orphan
 F:	drivers/char/i8k.c
 F:	drivers/char/i8k.c
 F:	include/uapi/linux/i8k.h
 F:	include/uapi/linux/i8k.h
 
 
@@ -7893,7 +7893,7 @@ L:	linux-tegra@vger.kernel.org
 Q:	http://patchwork.ozlabs.org/project/linux-tegra/list/
 Q:	http://patchwork.ozlabs.org/project/linux-tegra/list/
 T:	git git://git.kernel.org/pub/scm/linux/kernel/git/swarren/linux-tegra.git
 T:	git git://git.kernel.org/pub/scm/linux/kernel/git/swarren/linux-tegra.git
 S:	Supported
 S:	Supported
-K:	(?i)[^a-z]tegra
+N:	[^a-z]tegra
 
 
 TEHUTI ETHERNET DRIVER
 TEHUTI ETHERNET DRIVER
 M:	Andy Gospodarek <andy@greyhouse.net>
 M:	Andy Gospodarek <andy@greyhouse.net>
@@ -8379,9 +8379,10 @@ S:	Maintained
 F:	drivers/usb/serial/option.c
 F:	drivers/usb/serial/option.c
 
 
 USB PEGASUS DRIVER
 USB PEGASUS DRIVER
-M:	Petko Manolov <petkan@users.sourceforge.net>
+M:	Petko Manolov <petkan@nucleusys.com>
 L:	linux-usb@vger.kernel.org
 L:	linux-usb@vger.kernel.org
 L:	netdev@vger.kernel.org
 L:	netdev@vger.kernel.org
+T:	git git://git.code.sf.net/p/pegasus2/git
 W:	http://pegasus2.sourceforge.net/
 W:	http://pegasus2.sourceforge.net/
 S:	Maintained
 S:	Maintained
 F:	drivers/net/usb/pegasus.*
 F:	drivers/net/usb/pegasus.*
@@ -8401,9 +8402,10 @@ S:	Supported
 F:	drivers/usb/class/usblp.c
 F:	drivers/usb/class/usblp.c
 
 
 USB RTL8150 DRIVER
 USB RTL8150 DRIVER
-M:	Petko Manolov <petkan@users.sourceforge.net>
+M:	Petko Manolov <petkan@nucleusys.com>
 L:	linux-usb@vger.kernel.org
 L:	linux-usb@vger.kernel.org
 L:	netdev@vger.kernel.org
 L:	netdev@vger.kernel.org
+T:	git git://git.code.sf.net/p/pegasus2/git
 W:	http://pegasus2.sourceforge.net/
 W:	http://pegasus2.sourceforge.net/
 S:	Maintained
 S:	Maintained
 F:	drivers/net/usb/rtl8150.c
 F:	drivers/net/usb/rtl8150.c

+ 3 - 14
arch/arm/kernel/early_printk.c

@@ -29,28 +29,17 @@ static void early_console_write(struct console *con, const char *s, unsigned n)
 	early_write(s, n);
 	early_write(s, n);
 }
 }
 
 
-static struct console early_console = {
+static struct console early_console_dev = {
 	.name =		"earlycon",
 	.name =		"earlycon",
 	.write =	early_console_write,
 	.write =	early_console_write,
 	.flags =	CON_PRINTBUFFER | CON_BOOT,
 	.flags =	CON_PRINTBUFFER | CON_BOOT,
 	.index =	-1,
 	.index =	-1,
 };
 };
 
 
-asmlinkage void early_printk(const char *fmt, ...)
-{
-	char buf[512];
-	int n;
-	va_list ap;
-
-	va_start(ap, fmt);
-	n = vscnprintf(buf, sizeof(buf), fmt, ap);
-	early_write(buf, n);
-	va_end(ap);
-}
-
 static int __init setup_early_printk(char *buf)
 static int __init setup_early_printk(char *buf)
 {
 {
-	register_console(&early_console);
+	early_console = &early_console_dev;
+	register_console(&early_console_dev);
 	return 0;
 	return 0;
 }
 }
 
 

+ 0 - 2
arch/blackfin/kernel/early_printk.c

@@ -25,8 +25,6 @@ extern struct console *bfin_earlyserial_init(unsigned int port,
 extern struct console *bfin_jc_early_init(void);
 extern struct console *bfin_jc_early_init(void);
 #endif
 #endif
 
 
-static struct console *early_console;
-
 /* Default console */
 /* Default console */
 #define DEFAULT_PORT 0
 #define DEFAULT_PORT 0
 #define DEFAULT_CFLAG CS8|B57600
 #define DEFAULT_CFLAG CS8|B57600

+ 4 - 22
arch/microblaze/kernel/early_printk.c

@@ -21,7 +21,6 @@
 #include <asm/setup.h>
 #include <asm/setup.h>
 #include <asm/prom.h>
 #include <asm/prom.h>
 
 
-static u32 early_console_initialized;
 static u32 base_addr;
 static u32 base_addr;
 
 
 #ifdef CONFIG_SERIAL_UARTLITE_CONSOLE
 #ifdef CONFIG_SERIAL_UARTLITE_CONSOLE
@@ -109,27 +108,11 @@ static struct console early_serial_uart16550_console = {
 };
 };
 #endif /* CONFIG_SERIAL_8250_CONSOLE */
 #endif /* CONFIG_SERIAL_8250_CONSOLE */
 
 
-static struct console *early_console;
-
-void early_printk(const char *fmt, ...)
-{
-	char buf[512];
-	int n;
-	va_list ap;
-
-	if (early_console_initialized) {
-		va_start(ap, fmt);
-		n = vscnprintf(buf, 512, fmt, ap);
-		early_console->write(early_console, buf, n);
-		va_end(ap);
-	}
-}
-
 int __init setup_early_printk(char *opt)
 int __init setup_early_printk(char *opt)
 {
 {
 	int version = 0;
 	int version = 0;
 
 
-	if (early_console_initialized)
+	if (early_console)
 		return 1;
 		return 1;
 
 
 	base_addr = of_early_console(&version);
 	base_addr = of_early_console(&version);
@@ -159,7 +142,6 @@ int __init setup_early_printk(char *opt)
 		}
 		}
 
 
 		register_console(early_console);
 		register_console(early_console);
-		early_console_initialized = 1;
 		return 0;
 		return 0;
 	}
 	}
 	return 1;
 	return 1;
@@ -169,7 +151,7 @@ int __init setup_early_printk(char *opt)
  * only for early console because of performance degression */
  * only for early console because of performance degression */
 void __init remap_early_printk(void)
 void __init remap_early_printk(void)
 {
 {
-	if (!early_console_initialized || !early_console)
+	if (!early_console)
 		return;
 		return;
 	pr_info("early_printk_console remapping from 0x%x to ", base_addr);
 	pr_info("early_printk_console remapping from 0x%x to ", base_addr);
 	base_addr = (u32) ioremap(base_addr, PAGE_SIZE);
 	base_addr = (u32) ioremap(base_addr, PAGE_SIZE);
@@ -194,9 +176,9 @@ void __init remap_early_printk(void)
 
 
 void __init disable_early_printk(void)
 void __init disable_early_printk(void)
 {
 {
-	if (!early_console_initialized || !early_console)
+	if (!early_console)
 		return;
 		return;
 	pr_warn("disabling early console\n");
 	pr_warn("disabling early console\n");
 	unregister_console(early_console);
 	unregister_console(early_console);
-	early_console_initialized = 0;
+	early_console = NULL;
 }
 }

+ 6 - 6
arch/mips/kernel/early_printk.c

@@ -7,7 +7,9 @@
  * Copyright (C) 2007 MIPS Technologies, Inc.
  * Copyright (C) 2007 MIPS Technologies, Inc.
  *   written by Ralf Baechle (ralf@linux-mips.org)
  *   written by Ralf Baechle (ralf@linux-mips.org)
  */
  */
+#include <linux/kernel.h>
 #include <linux/console.h>
 #include <linux/console.h>
+#include <linux/printk.h>
 #include <linux/init.h>
 #include <linux/init.h>
 
 
 #include <asm/setup.h>
 #include <asm/setup.h>
@@ -24,20 +26,18 @@ static void early_console_write(struct console *con, const char *s, unsigned n)
 	}
 	}
 }
 }
 
 
-static struct console early_console = {
+static struct console early_console_prom = {
 	.name	= "early",
 	.name	= "early",
 	.write	= early_console_write,
 	.write	= early_console_write,
 	.flags	= CON_PRINTBUFFER | CON_BOOT,
 	.flags	= CON_PRINTBUFFER | CON_BOOT,
 	.index	= -1
 	.index	= -1
 };
 };
 
 
-static int early_console_initialized __initdata;
-
 void __init setup_early_printk(void)
 void __init setup_early_printk(void)
 {
 {
-	if (early_console_initialized)
+	if (early_console)
 		return;
 		return;
-	early_console_initialized = 1;
+	early_console = &early_console_prom;
 
 
-	register_console(&early_console);
+	register_console(&early_console_prom);
 }
 }

+ 2 - 4
arch/powerpc/kernel/udbg.c

@@ -156,15 +156,13 @@ static struct console udbg_console = {
 	.index	= 0,
 	.index	= 0,
 };
 };
 
 
-static int early_console_initialized;
-
 /*
 /*
  * Called by setup_system after ppc_md->probe and ppc_md->early_init.
  * Called by setup_system after ppc_md->probe and ppc_md->early_init.
  * Call it again after setting udbg_putc in ppc_md->setup_arch.
  * Call it again after setting udbg_putc in ppc_md->setup_arch.
  */
  */
 void __init register_early_udbg_console(void)
 void __init register_early_udbg_console(void)
 {
 {
-	if (early_console_initialized)
+	if (early_console)
 		return;
 		return;
 
 
 	if (!udbg_putc)
 	if (!udbg_putc)
@@ -174,7 +172,7 @@ void __init register_early_udbg_console(void)
 		printk(KERN_INFO "early console immortal !\n");
 		printk(KERN_INFO "early console immortal !\n");
 		udbg_console.flags &= ~CON_BOOT;
 		udbg_console.flags &= ~CON_BOOT;
 	}
 	}
-	early_console_initialized = 1;
+	early_console = &udbg_console;
 	register_console(&udbg_console);
 	register_console(&udbg_console);
 }
 }
 
 

+ 2 - 2
arch/sh/kernel/sh_bios.c

@@ -104,6 +104,7 @@ void sh_bios_vbr_reload(void)
 		);
 		);
 }
 }
 
 
+#ifdef CONFIG_EARLY_PRINTK
 /*
 /*
  *	Print a string through the BIOS
  *	Print a string through the BIOS
  */
  */
@@ -144,8 +145,6 @@ static struct console bios_console = {
 	.index		= -1,
 	.index		= -1,
 };
 };
 
 
-static struct console *early_console;
-
 static int __init setup_early_printk(char *buf)
 static int __init setup_early_printk(char *buf)
 {
 {
 	int keep_early = 0;
 	int keep_early = 0;
@@ -170,3 +169,4 @@ static int __init setup_early_printk(char *buf)
 	return 0;
 	return 0;
 }
 }
 early_param("earlyprintk", setup_early_printk);
 early_param("earlyprintk", setup_early_printk);
+#endif

+ 5 - 22
arch/tile/kernel/early_printk.c

@@ -17,6 +17,7 @@
 #include <linux/init.h>
 #include <linux/init.h>
 #include <linux/string.h>
 #include <linux/string.h>
 #include <linux/irqflags.h>
 #include <linux/irqflags.h>
+#include <linux/printk.h>
 #include <asm/setup.h>
 #include <asm/setup.h>
 #include <hv/hypervisor.h>
 #include <hv/hypervisor.h>
 
 
@@ -33,25 +34,8 @@ static struct console early_hv_console = {
 };
 };
 
 
 /* Direct interface for emergencies */
 /* Direct interface for emergencies */
-static struct console *early_console = &early_hv_console;
-static int early_console_initialized;
 static int early_console_complete;
 static int early_console_complete;
 
 
-static void early_vprintk(const char *fmt, va_list ap)
-{
-	char buf[512];
-	int n = vscnprintf(buf, sizeof(buf), fmt, ap);
-	early_console->write(early_console, buf, n);
-}
-
-void early_printk(const char *fmt, ...)
-{
-	va_list ap;
-	va_start(ap, fmt);
-	early_vprintk(fmt, ap);
-	va_end(ap);
-}
-
 void early_panic(const char *fmt, ...)
 void early_panic(const char *fmt, ...)
 {
 {
 	va_list ap;
 	va_list ap;
@@ -69,14 +53,13 @@ static int __initdata keep_early;
 
 
 static int __init setup_early_printk(char *str)
 static int __init setup_early_printk(char *str)
 {
 {
-	if (early_console_initialized)
+	if (early_console)
 		return 1;
 		return 1;
 
 
 	if (str != NULL && strncmp(str, "keep", 4) == 0)
 	if (str != NULL && strncmp(str, "keep", 4) == 0)
 		keep_early = 1;
 		keep_early = 1;
 
 
 	early_console = &early_hv_console;
 	early_console = &early_hv_console;
-	early_console_initialized = 1;
 	register_console(early_console);
 	register_console(early_console);
 
 
 	return 0;
 	return 0;
@@ -85,12 +68,12 @@ static int __init setup_early_printk(char *str)
 void __init disable_early_printk(void)
 void __init disable_early_printk(void)
 {
 {
 	early_console_complete = 1;
 	early_console_complete = 1;
-	if (!early_console_initialized || !early_console)
+	if (!early_console)
 		return;
 		return;
 	if (!keep_early) {
 	if (!keep_early) {
 		early_printk("disabling early console\n");
 		early_printk("disabling early console\n");
 		unregister_console(early_console);
 		unregister_console(early_console);
-		early_console_initialized = 0;
+		early_console = NULL;
 	} else {
 	} else {
 		early_printk("keeping early console\n");
 		early_printk("keeping early console\n");
 	}
 	}
@@ -98,7 +81,7 @@ void __init disable_early_printk(void)
 
 
 void warn_early_printk(void)
 void warn_early_printk(void)
 {
 {
-	if (early_console_complete || early_console_initialized)
+	if (early_console_complete || early_console)
 		return;
 		return;
 	early_printk("\
 	early_printk("\
 Machine shutting down before console output is fully initialized.\n\
 Machine shutting down before console output is fully initialized.\n\

+ 5 - 3
arch/um/kernel/early_printk.c

@@ -16,7 +16,7 @@ static void early_console_write(struct console *con, const char *s, unsigned int
 	um_early_printk(s, n);
 	um_early_printk(s, n);
 }
 }
 
 
-static struct console early_console = {
+static struct console early_console_dev = {
 	.name = "earlycon",
 	.name = "earlycon",
 	.write = early_console_write,
 	.write = early_console_write,
 	.flags = CON_BOOT,
 	.flags = CON_BOOT,
@@ -25,8 +25,10 @@ static struct console early_console = {
 
 
 static int __init setup_early_printk(char *buf)
 static int __init setup_early_printk(char *buf)
 {
 {
-	register_console(&early_console);
-
+	if (!early_console) {
+		early_console = &early_console_dev;
+		register_console(&early_console_dev);
+	}
 	return 0;
 	return 0;
 }
 }
 
 

+ 4 - 8
arch/unicore32/kernel/early_printk.c

@@ -33,21 +33,17 @@ static struct console early_ocd_console = {
 	.index =	-1,
 	.index =	-1,
 };
 };
 
 
-/* Direct interface for emergencies */
-static struct console *early_console = &early_ocd_console;
-
-static int __initdata keep_early;
-
 static int __init setup_early_printk(char *buf)
 static int __init setup_early_printk(char *buf)
 {
 {
-	if (!buf)
+	int keep_early;
+
+	if (!buf || early_console)
 		return 0;
 		return 0;
 
 
 	if (strstr(buf, "keep"))
 	if (strstr(buf, "keep"))
 		keep_early = 1;
 		keep_early = 1;
 
 
-	if (!strncmp(buf, "ocd", 3))
-		early_console = &early_ocd_console;
+	early_console = &early_ocd_console;
 
 
 	if (keep_early)
 	if (keep_early)
 		early_console->flags &= ~CON_BOOT;
 		early_console->flags &= ~CON_BOOT;

+ 2 - 19
arch/x86/kernel/early_printk.c

@@ -169,25 +169,9 @@ static struct console early_serial_console = {
 	.index =	-1,
 	.index =	-1,
 };
 };
 
 
-/* Direct interface for emergencies */
-static struct console *early_console = &early_vga_console;
-static int __initdata early_console_initialized;
-
-asmlinkage void early_printk(const char *fmt, ...)
-{
-	char buf[512];
-	int n;
-	va_list ap;
-
-	va_start(ap, fmt);
-	n = vscnprintf(buf, sizeof(buf), fmt, ap);
-	early_console->write(early_console, buf, n);
-	va_end(ap);
-}
-
 static inline void early_console_register(struct console *con, int keep_early)
 static inline void early_console_register(struct console *con, int keep_early)
 {
 {
-	if (early_console->index != -1) {
+	if (con->index != -1) {
 		printk(KERN_CRIT "ERROR: earlyprintk= %s already used\n",
 		printk(KERN_CRIT "ERROR: earlyprintk= %s already used\n",
 		       con->name);
 		       con->name);
 		return;
 		return;
@@ -207,9 +191,8 @@ static int __init setup_early_printk(char *buf)
 	if (!buf)
 	if (!buf)
 		return 0;
 		return 0;
 
 
-	if (early_console_initialized)
+	if (early_console)
 		return 0;
 		return 0;
-	early_console_initialized = 1;
 
 
 	keep = (strstr(buf, "keep") != NULL);
 	keep = (strstr(buf, "keep") != NULL);
 
 

+ 2 - 3
arch/x86/mm/pageattr-test.c

@@ -130,13 +130,12 @@ static int pageattr_test(void)
 	}
 	}
 
 
 	failed += print_split(&sa);
 	failed += print_split(&sa);
-	srandom32(100);
 
 
 	for (i = 0; i < NTEST; i++) {
 	for (i = 0; i < NTEST; i++) {
-		unsigned long pfn = random32() % max_pfn_mapped;
+		unsigned long pfn = prandom_u32() % max_pfn_mapped;
 
 
 		addr[i] = (unsigned long)__va(pfn << PAGE_SHIFT);
 		addr[i] = (unsigned long)__va(pfn << PAGE_SHIFT);
-		len[i] = random32() % 100;
+		len[i] = prandom_u32() % 100;
 		len[i] = min_t(unsigned long, len[i], max_pfn_mapped - pfn - 1);
 		len[i] = min_t(unsigned long, len[i], max_pfn_mapped - pfn - 1);
 
 
 		if (len[i] == 0)
 		if (len[i] == 0)

+ 2 - 7
crypto/async_tx/raid6test.c

@@ -46,15 +46,10 @@ static void callback(void *param)
 
 
 static void makedata(int disks)
 static void makedata(int disks)
 {
 {
-	int i, j;
+	int i;
 
 
 	for (i = 0; i < disks; i++) {
 	for (i = 0; i < disks; i++) {
-		for (j = 0; j < PAGE_SIZE/sizeof(u32); j += sizeof(u32)) {
-			u32 *p = page_address(data[i]) + j;
-
-			*p = random32();
-		}
-
+		prandom_bytes(page_address(data[i]), PAGE_SIZE);
 		dataptrs[i] = data[i];
 		dataptrs[i] = data[i];
 	}
 	}
 }
 }

+ 3 - 2
drivers/block/drbd/drbd_receiver.c

@@ -757,7 +757,8 @@ static struct socket *drbd_wait_for_connect(struct drbd_tconn *tconn, struct acc
 	rcu_read_unlock();
 	rcu_read_unlock();
 
 
 	timeo = connect_int * HZ;
 	timeo = connect_int * HZ;
-	timeo += (random32() & 1) ? timeo / 7 : -timeo / 7; /* 28.5% random jitter */
+	/* 28.5% random jitter */
+	timeo += (prandom_u32() & 1) ? timeo / 7 : -timeo / 7;
 
 
 	err = wait_for_completion_interruptible_timeout(&ad->door_bell, timeo);
 	err = wait_for_completion_interruptible_timeout(&ad->door_bell, timeo);
 	if (err <= 0)
 	if (err <= 0)
@@ -953,7 +954,7 @@ retry:
 				conn_warn(tconn, "Error receiving initial packet\n");
 				conn_warn(tconn, "Error receiving initial packet\n");
 				sock_release(s);
 				sock_release(s);
 randomize:
 randomize:
-				if (random32() & 1)
+				if (prandom_u32() & 1)
 					goto retry;
 					goto retry;
 			}
 			}
 		}
 		}

+ 0 - 1
drivers/infiniband/hw/amso1100/c2.h

@@ -265,7 +265,6 @@ struct c2_pd_table {
 struct c2_qp_table {
 struct c2_qp_table {
 	struct idr idr;
 	struct idr idr;
 	spinlock_t lock;
 	spinlock_t lock;
-	int last;
 };
 };
 
 
 struct c2_element {
 struct c2_element {

+ 1 - 2
drivers/infiniband/hw/amso1100/c2_qp.c

@@ -385,8 +385,7 @@ static int c2_alloc_qpn(struct c2_dev *c2dev, struct c2_qp *qp)
 	idr_preload(GFP_KERNEL);
 	idr_preload(GFP_KERNEL);
 	spin_lock_irq(&c2dev->qp_table.lock);
 	spin_lock_irq(&c2dev->qp_table.lock);
 
 
-	ret = idr_alloc(&c2dev->qp_table.idr, qp, c2dev->qp_table.last++, 0,
-			GFP_NOWAIT);
+	ret = idr_alloc_cyclic(&c2dev->qp_table.idr, qp, 0, 0, GFP_NOWAIT);
 	if (ret >= 0)
 	if (ret >= 0)
 		qp->qpn = ret;
 		qp->qpn = ret;
 
 

+ 1 - 3
drivers/infiniband/hw/mlx4/cm.c

@@ -204,7 +204,6 @@ static struct id_map_entry *
 id_map_alloc(struct ib_device *ibdev, int slave_id, u32 sl_cm_id)
 id_map_alloc(struct ib_device *ibdev, int slave_id, u32 sl_cm_id)
 {
 {
 	int ret;
 	int ret;
-	static int next_id;
 	struct id_map_entry *ent;
 	struct id_map_entry *ent;
 	struct mlx4_ib_sriov *sriov = &to_mdev(ibdev)->sriov;
 	struct mlx4_ib_sriov *sriov = &to_mdev(ibdev)->sriov;
 
 
@@ -223,9 +222,8 @@ id_map_alloc(struct ib_device *ibdev, int slave_id, u32 sl_cm_id)
 	idr_preload(GFP_KERNEL);
 	idr_preload(GFP_KERNEL);
 	spin_lock(&to_mdev(ibdev)->sriov.id_map_lock);
 	spin_lock(&to_mdev(ibdev)->sriov.id_map_lock);
 
 
-	ret = idr_alloc(&sriov->pv_id_table, ent, next_id, 0, GFP_NOWAIT);
+	ret = idr_alloc_cyclic(&sriov->pv_id_table, ent, 0, 0, GFP_NOWAIT);
 	if (ret >= 0) {
 	if (ret >= 0) {
-		next_id = max(ret + 1, 0);
 		ent->pv_cm_id = (u32)ret;
 		ent->pv_cm_id = (u32)ret;
 		sl_id_map_add(ibdev, ent);
 		sl_id_map_add(ibdev, ent);
 		list_add_tail(&ent->list, &sriov->cm_list);
 		list_add_tail(&ent->list, &sriov->cm_list);

+ 1 - 1
drivers/lguest/page_tables.c

@@ -686,7 +686,7 @@ static unsigned int new_pgdir(struct lg_cpu *cpu,
 	 * We pick one entry at random to throw out.  Choosing the Least
 	 * We pick one entry at random to throw out.  Choosing the Least
 	 * Recently Used might be better, but this is easy.
 	 * Recently Used might be better, but this is easy.
 	 */
 	 */
-	next = random32() % ARRAY_SIZE(cpu->lg->pgdirs);
+	next = prandom_u32() % ARRAY_SIZE(cpu->lg->pgdirs);
 	/* If it's never been allocated at all before, try now. */
 	/* If it's never been allocated at all before, try now. */
 	if (!cpu->lg->pgdirs[next].pgdir) {
 	if (!cpu->lg->pgdirs[next].pgdir) {
 		cpu->lg->pgdirs[next].pgdir =
 		cpu->lg->pgdirs[next].pgdir =

+ 0 - 1
drivers/media/platform/Kconfig

@@ -145,7 +145,6 @@ config VIDEO_CODA
 	depends on VIDEO_DEV && VIDEO_V4L2 && ARCH_MXC
 	depends on VIDEO_DEV && VIDEO_V4L2 && ARCH_MXC
 	select VIDEOBUF2_DMA_CONTIG
 	select VIDEOBUF2_DMA_CONTIG
 	select V4L2_MEM2MEM_DEV
 	select V4L2_MEM2MEM_DEV
-	select IRAM_ALLOC if SOC_IMX53
 	---help---
 	---help---
 	   Coda is a range of video codec IPs that supports
 	   Coda is a range of video codec IPs that supports
 	   H.264, MPEG-4, and other video formats.
 	   H.264, MPEG-4, and other video formats.

+ 31 - 14
drivers/media/platform/coda.c

@@ -14,6 +14,7 @@
 #include <linux/clk.h>
 #include <linux/clk.h>
 #include <linux/delay.h>
 #include <linux/delay.h>
 #include <linux/firmware.h>
 #include <linux/firmware.h>
+#include <linux/genalloc.h>
 #include <linux/interrupt.h>
 #include <linux/interrupt.h>
 #include <linux/io.h>
 #include <linux/io.h>
 #include <linux/irq.h>
 #include <linux/irq.h>
@@ -23,7 +24,7 @@
 #include <linux/slab.h>
 #include <linux/slab.h>
 #include <linux/videodev2.h>
 #include <linux/videodev2.h>
 #include <linux/of.h>
 #include <linux/of.h>
-#include <linux/platform_data/imx-iram.h>
+#include <linux/platform_data/coda.h>
 
 
 #include <media/v4l2-ctrls.h>
 #include <media/v4l2-ctrls.h>
 #include <media/v4l2-device.h>
 #include <media/v4l2-device.h>
@@ -43,6 +44,7 @@
 #define CODA7_WORK_BUF_SIZE	(512 * 1024 + CODA_FMO_BUF_SIZE * 8 * 1024)
 #define CODA7_WORK_BUF_SIZE	(512 * 1024 + CODA_FMO_BUF_SIZE * 8 * 1024)
 #define CODA_PARA_BUF_SIZE	(10 * 1024)
 #define CODA_PARA_BUF_SIZE	(10 * 1024)
 #define CODA_ISRAM_SIZE	(2048 * 2)
 #define CODA_ISRAM_SIZE	(2048 * 2)
+#define CODADX6_IRAM_SIZE	0xb000
 #define CODA7_IRAM_SIZE		0x14000 /* 81920 bytes */
 #define CODA7_IRAM_SIZE		0x14000 /* 81920 bytes */
 
 
 #define CODA_MAX_FRAMEBUFFERS	2
 #define CODA_MAX_FRAMEBUFFERS	2
@@ -128,7 +130,10 @@ struct coda_dev {
 
 
 	struct coda_aux_buf	codebuf;
 	struct coda_aux_buf	codebuf;
 	struct coda_aux_buf	workbuf;
 	struct coda_aux_buf	workbuf;
+	struct gen_pool		*iram_pool;
+	long unsigned int	iram_vaddr;
 	long unsigned int	iram_paddr;
 	long unsigned int	iram_paddr;
+	unsigned long		iram_size;
 
 
 	spinlock_t		irqlock;
 	spinlock_t		irqlock;
 	struct mutex		dev_mutex;
 	struct mutex		dev_mutex;
@@ -1926,6 +1931,9 @@ static int coda_probe(struct platform_device *pdev)
 	const struct of_device_id *of_id =
 	const struct of_device_id *of_id =
 			of_match_device(of_match_ptr(coda_dt_ids), &pdev->dev);
 			of_match_device(of_match_ptr(coda_dt_ids), &pdev->dev);
 	const struct platform_device_id *pdev_id;
 	const struct platform_device_id *pdev_id;
+	struct coda_platform_data *pdata = pdev->dev.platform_data;
+	struct device_node *np = pdev->dev.of_node;
+	struct gen_pool *pool;
 	struct coda_dev *dev;
 	struct coda_dev *dev;
 	struct resource *res;
 	struct resource *res;
 	int ret, irq;
 	int ret, irq;
@@ -1988,6 +1996,16 @@ static int coda_probe(struct platform_device *pdev)
 		return -ENOENT;
 		return -ENOENT;
 	}
 	}
 
 
+	/* Get IRAM pool from device tree or platform data */
+	pool = of_get_named_gen_pool(np, "iram", 0);
+	if (!pool && pdata)
+		pool = dev_get_gen_pool(pdata->iram_dev);
+	if (!pool) {
+		dev_err(&pdev->dev, "iram pool not available\n");
+		return -ENOMEM;
+	}
+	dev->iram_pool = pool;
+
 	ret = v4l2_device_register(&pdev->dev, &dev->v4l2_dev);
 	ret = v4l2_device_register(&pdev->dev, &dev->v4l2_dev);
 	if (ret)
 	if (ret)
 		return ret;
 		return ret;
@@ -2022,18 +2040,17 @@ static int coda_probe(struct platform_device *pdev)
 		return -ENOMEM;
 		return -ENOMEM;
 	}
 	}
 
 
-	if (dev->devtype->product == CODA_DX6) {
-		dev->iram_paddr = 0xffff4c00;
-	} else {
-		void __iomem *iram_vaddr;
-
-		iram_vaddr = iram_alloc(CODA7_IRAM_SIZE,
-					&dev->iram_paddr);
-		if (!iram_vaddr) {
-			dev_err(&pdev->dev, "unable to alloc iram\n");
-			return -ENOMEM;
-		}
+	if (dev->devtype->product == CODA_DX6)
+		dev->iram_size = CODADX6_IRAM_SIZE;
+	else
+		dev->iram_size = CODA7_IRAM_SIZE;
+	dev->iram_vaddr = gen_pool_alloc(dev->iram_pool, dev->iram_size);
+	if (!dev->iram_vaddr) {
+		dev_err(&pdev->dev, "unable to alloc iram\n");
+		return -ENOMEM;
 	}
 	}
+	dev->iram_paddr = gen_pool_virt_to_phys(dev->iram_pool,
+						dev->iram_vaddr);
 
 
 	platform_set_drvdata(pdev, dev);
 	platform_set_drvdata(pdev, dev);
 
 
@@ -2050,8 +2067,8 @@ static int coda_remove(struct platform_device *pdev)
 	if (dev->alloc_ctx)
 	if (dev->alloc_ctx)
 		vb2_dma_contig_cleanup_ctx(dev->alloc_ctx);
 		vb2_dma_contig_cleanup_ctx(dev->alloc_ctx);
 	v4l2_device_unregister(&dev->v4l2_dev);
 	v4l2_device_unregister(&dev->v4l2_dev);
-	if (dev->iram_paddr)
-		iram_free(dev->iram_paddr, CODA7_IRAM_SIZE);
+	if (dev->iram_vaddr)
+		gen_pool_free(dev->iram_pool, dev->iram_vaddr, dev->iram_size);
 	if (dev->codebuf.vaddr)
 	if (dev->codebuf.vaddr)
 		dma_free_coherent(&pdev->dev, dev->codebuf.size,
 		dma_free_coherent(&pdev->dev, dev->codebuf.size,
 				  &dev->codebuf.vaddr, dev->codebuf.paddr);
 				  &dev->codebuf.vaddr, dev->codebuf.paddr);

+ 9 - 0
drivers/misc/Kconfig

@@ -518,6 +518,15 @@ config LATTICE_ECP3_CONFIG
 
 
 	  If unsure, say N.
 	  If unsure, say N.
 
 
+config SRAM
+	bool "Generic on-chip SRAM driver"
+	depends on HAS_IOMEM
+	select GENERIC_ALLOCATOR
+	help
+	  This driver allows you to declare a memory region to be managed by
+	  the genalloc API. It is supposed to be used for small on-chip SRAM
+	  areas found on many SoCs.
+
 source "drivers/misc/c2port/Kconfig"
 source "drivers/misc/c2port/Kconfig"
 source "drivers/misc/eeprom/Kconfig"
 source "drivers/misc/eeprom/Kconfig"
 source "drivers/misc/cb710/Kconfig"
 source "drivers/misc/cb710/Kconfig"

+ 1 - 0
drivers/misc/Makefile

@@ -52,3 +52,4 @@ obj-$(CONFIG_ALTERA_STAPL)	+=altera-stapl/
 obj-$(CONFIG_INTEL_MEI)		+= mei/
 obj-$(CONFIG_INTEL_MEI)		+= mei/
 obj-$(CONFIG_VMWARE_VMCI)	+= vmw_vmci/
 obj-$(CONFIG_VMWARE_VMCI)	+= vmw_vmci/
 obj-$(CONFIG_LATTICE_ECP3_CONFIG)	+= lattice-ecp3-config.o
 obj-$(CONFIG_LATTICE_ECP3_CONFIG)	+= lattice-ecp3-config.o
+obj-$(CONFIG_SRAM)		+= sram.o

+ 121 - 0
drivers/misc/sram.c

@@ -0,0 +1,121 @@
+/*
+ * Generic on-chip SRAM allocation driver
+ *
+ * Copyright (C) 2012 Philipp Zabel, Pengutronix
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ */
+
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/clk.h>
+#include <linux/err.h>
+#include <linux/io.h>
+#include <linux/of.h>
+#include <linux/platform_device.h>
+#include <linux/slab.h>
+#include <linux/spinlock.h>
+#include <linux/genalloc.h>
+
+#define SRAM_GRANULARITY	32
+
+struct sram_dev {
+	struct gen_pool *pool;
+	struct clk *clk;
+};
+
+static int sram_probe(struct platform_device *pdev)
+{
+	void __iomem *virt_base;
+	struct sram_dev *sram;
+	struct resource *res;
+	unsigned long size;
+	int ret;
+
+	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+	if (!res)
+		return -EINVAL;
+
+	size = resource_size(res);
+
+	virt_base = devm_request_and_ioremap(&pdev->dev, res);
+	if (!virt_base)
+		return -EADDRNOTAVAIL;
+
+	sram = devm_kzalloc(&pdev->dev, sizeof(*sram), GFP_KERNEL);
+	if (!sram)
+		return -ENOMEM;
+
+	sram->clk = devm_clk_get(&pdev->dev, NULL);
+	if (IS_ERR(sram->clk))
+		sram->clk = NULL;
+	else
+		clk_prepare_enable(sram->clk);
+
+	sram->pool = devm_gen_pool_create(&pdev->dev, ilog2(SRAM_GRANULARITY), -1);
+	if (!sram->pool)
+		return -ENOMEM;
+
+	ret = gen_pool_add_virt(sram->pool, (unsigned long)virt_base,
+				res->start, size, -1);
+	if (ret < 0) {
+		gen_pool_destroy(sram->pool);
+		return ret;
+	}
+
+	platform_set_drvdata(pdev, sram);
+
+	dev_dbg(&pdev->dev, "SRAM pool: %ld KiB @ 0x%p\n", size / 1024, virt_base);
+
+	return 0;
+}
+
+static int sram_remove(struct platform_device *pdev)
+{
+	struct sram_dev *sram = platform_get_drvdata(pdev);
+
+	if (gen_pool_avail(sram->pool) < gen_pool_size(sram->pool))
+		dev_dbg(&pdev->dev, "removed while SRAM allocated\n");
+
+	gen_pool_destroy(sram->pool);
+
+	if (sram->clk)
+		clk_disable_unprepare(sram->clk);
+
+	return 0;
+}
+
+#ifdef CONFIG_OF
+static struct of_device_id sram_dt_ids[] = {
+	{ .compatible = "mmio-sram" },
+	{}
+};
+#endif
+
+static struct platform_driver sram_driver = {
+	.driver = {
+		.name = "sram",
+		.of_match_table = of_match_ptr(sram_dt_ids),
+	},
+	.probe = sram_probe,
+	.remove = sram_remove,
+};
+
+static int __init sram_init(void)
+{
+	return platform_driver_register(&sram_driver);
+}
+
+postcore_initcall(sram_init);

+ 2 - 2
drivers/mmc/core/core.c

@@ -120,8 +120,8 @@ static void mmc_should_fail_request(struct mmc_host *host,
 	    !should_fail(&host->fail_mmc_request, data->blksz * data->blocks))
 	    !should_fail(&host->fail_mmc_request, data->blksz * data->blocks))
 		return;
 		return;
 
 
-	data->error = data_errors[random32() % ARRAY_SIZE(data_errors)];
-	data->bytes_xfered = (random32() % (data->bytes_xfered >> 9)) << 9;
+	data->error = data_errors[prandom_u32() % ARRAY_SIZE(data_errors)];
+	data->bytes_xfered = (prandom_u32() % (data->bytes_xfered >> 9)) << 9;
 }
 }
 
 
 #else /* CONFIG_FAIL_MMC_REQUEST */
 #else /* CONFIG_FAIL_MMC_REQUEST */

+ 3 - 1
drivers/rpmsg/virtio_rpmsg_bus.c

@@ -951,8 +951,10 @@ static int rpmsg_probe(struct virtio_device *vdev)
 	bufs_va = dma_alloc_coherent(vdev->dev.parent->parent,
 	bufs_va = dma_alloc_coherent(vdev->dev.parent->parent,
 				RPMSG_TOTAL_BUF_SPACE,
 				RPMSG_TOTAL_BUF_SPACE,
 				&vrp->bufs_dma, GFP_KERNEL);
 				&vrp->bufs_dma, GFP_KERNEL);
-	if (!bufs_va)
+	if (!bufs_va) {
+		err = -ENOMEM;
 		goto vqs_del;
 		goto vqs_del;
+	}
 
 
 	dev_dbg(&vdev->dev, "buffers: va %p, dma 0x%llx\n", bufs_va,
 	dev_dbg(&vdev->dev, "buffers: va %p, dma 0x%llx\n", bufs_va,
 					(unsigned long long)vrp->bufs_dma);
 					(unsigned long long)vrp->bufs_dma);

+ 70 - 0
drivers/rtc/class.c

@@ -259,6 +259,76 @@ void rtc_device_unregister(struct rtc_device *rtc)
 }
 }
 EXPORT_SYMBOL_GPL(rtc_device_unregister);
 EXPORT_SYMBOL_GPL(rtc_device_unregister);
 
 
+static void devm_rtc_device_release(struct device *dev, void *res)
+{
+	struct rtc_device *rtc = *(struct rtc_device **)res;
+
+	rtc_device_unregister(rtc);
+}
+
+static int devm_rtc_device_match(struct device *dev, void *res, void *data)
+{
+	struct rtc **r = res;
+
+	return *r == data;
+}
+
+/**
+ * devm_rtc_device_register - resource managed rtc_device_register()
+ * @dev: the device to register
+ * @name: the name of the device
+ * @ops: the rtc operations structure
+ * @owner: the module owner
+ *
+ * @return a struct rtc on success, or an ERR_PTR on error
+ *
+ * Managed rtc_device_register(). The rtc_device returned from this function
+ * are automatically freed on driver detach. See rtc_device_register()
+ * for more information.
+ */
+
+struct rtc_device *devm_rtc_device_register(struct device *dev,
+					const char *name,
+					const struct rtc_class_ops *ops,
+					struct module *owner)
+{
+	struct rtc_device **ptr, *rtc;
+
+	ptr = devres_alloc(devm_rtc_device_release, sizeof(*ptr), GFP_KERNEL);
+	if (!ptr)
+		return ERR_PTR(-ENOMEM);
+
+	rtc = rtc_device_register(name, dev, ops, owner);
+	if (!IS_ERR(rtc)) {
+		*ptr = rtc;
+		devres_add(dev, ptr);
+	} else {
+		devres_free(ptr);
+	}
+
+	return rtc;
+}
+EXPORT_SYMBOL_GPL(devm_rtc_device_register);
+
+/**
+ * devm_rtc_device_unregister - resource managed devm_rtc_device_unregister()
+ * @dev: the device to unregister
+ * @rtc: the RTC class device to unregister
+ *
+ * Deallocated a rtc allocated with devm_rtc_device_register(). Normally this
+ * function will not need to be called and the resource management code will
+ * ensure that the resource is freed.
+ */
+void devm_rtc_device_unregister(struct device *dev, struct rtc_device *rtc)
+{
+	int rc;
+
+	rc = devres_release(dev, devm_rtc_device_release,
+				devm_rtc_device_match, rtc);
+	WARN_ON(rc);
+}
+EXPORT_SYMBOL_GPL(devm_rtc_device_unregister);
+
 static int __init rtc_init(void)
 static int __init rtc_init(void)
 {
 {
 	rtc_class = class_create(THIS_MODULE, "rtc");
 	rtc_class = class_create(THIS_MODULE, "rtc");

+ 2 - 3
drivers/rtc/rtc-88pm80x.c

@@ -234,7 +234,7 @@ static const struct rtc_class_ops pm80x_rtc_ops = {
 	.alarm_irq_enable = pm80x_rtc_alarm_irq_enable,
 	.alarm_irq_enable = pm80x_rtc_alarm_irq_enable,
 };
 };
 
 
-#ifdef CONFIG_PM
+#ifdef CONFIG_PM_SLEEP
 static int pm80x_rtc_suspend(struct device *dev)
 static int pm80x_rtc_suspend(struct device *dev)
 {
 {
 	return pm80x_dev_suspend(dev);
 	return pm80x_dev_suspend(dev);
@@ -312,7 +312,7 @@ static int pm80x_rtc_probe(struct platform_device *pdev)
 	}
 	}
 	rtc_tm_to_time(&tm, &ticks);
 	rtc_tm_to_time(&tm, &ticks);
 
 
-	info->rtc_dev = rtc_device_register("88pm80x-rtc", &pdev->dev,
+	info->rtc_dev = devm_rtc_device_register(&pdev->dev, "88pm80x-rtc",
 					    &pm80x_rtc_ops, THIS_MODULE);
 					    &pm80x_rtc_ops, THIS_MODULE);
 	if (IS_ERR(info->rtc_dev)) {
 	if (IS_ERR(info->rtc_dev)) {
 		ret = PTR_ERR(info->rtc_dev);
 		ret = PTR_ERR(info->rtc_dev);
@@ -346,7 +346,6 @@ static int pm80x_rtc_remove(struct platform_device *pdev)
 {
 {
 	struct pm80x_rtc_info *info = platform_get_drvdata(pdev);
 	struct pm80x_rtc_info *info = platform_get_drvdata(pdev);
 	platform_set_drvdata(pdev, NULL);
 	platform_set_drvdata(pdev, NULL);
-	rtc_device_unregister(info->rtc_dev);
 	pm80x_free_irq(info->chip, info->irq, info);
 	pm80x_free_irq(info->chip, info->irq, info);
 	return 0;
 	return 0;
 }
 }

+ 11 - 18
drivers/rtc/rtc-88pm860x.c

@@ -318,14 +318,14 @@ static int pm860x_rtc_probe(struct platform_device *pdev)
 
 
 	pdata = pdev->dev.platform_data;
 	pdata = pdev->dev.platform_data;
 
 
-	info = kzalloc(sizeof(struct pm860x_rtc_info), GFP_KERNEL);
+	info = devm_kzalloc(&pdev->dev, sizeof(struct pm860x_rtc_info),
+			    GFP_KERNEL);
 	if (!info)
 	if (!info)
 		return -ENOMEM;
 		return -ENOMEM;
 	info->irq = platform_get_irq(pdev, 0);
 	info->irq = platform_get_irq(pdev, 0);
 	if (info->irq < 0) {
 	if (info->irq < 0) {
 		dev_err(&pdev->dev, "No IRQ resource!\n");
 		dev_err(&pdev->dev, "No IRQ resource!\n");
-		ret = -EINVAL;
-		goto out;
+		return info->irq;
 	}
 	}
 
 
 	info->chip = chip;
 	info->chip = chip;
@@ -333,12 +333,13 @@ static int pm860x_rtc_probe(struct platform_device *pdev)
 	info->dev = &pdev->dev;
 	info->dev = &pdev->dev;
 	dev_set_drvdata(&pdev->dev, info);
 	dev_set_drvdata(&pdev->dev, info);
 
 
-	ret = request_threaded_irq(info->irq, NULL, rtc_update_handler,
-				   IRQF_ONESHOT, "rtc", info);
+	ret = devm_request_threaded_irq(&pdev->dev, info->irq, NULL,
+					rtc_update_handler, IRQF_ONESHOT, "rtc",
+					info);
 	if (ret < 0) {
 	if (ret < 0) {
 		dev_err(chip->dev, "Failed to request IRQ: #%d: %d\n",
 		dev_err(chip->dev, "Failed to request IRQ: #%d: %d\n",
 			info->irq, ret);
 			info->irq, ret);
-		goto out;
+		return ret;
 	}
 	}
 
 
 	/* set addresses of 32-bit base value for RTC time */
 	/* set addresses of 32-bit base value for RTC time */
@@ -350,7 +351,7 @@ static int pm860x_rtc_probe(struct platform_device *pdev)
 	ret = pm860x_rtc_read_time(&pdev->dev, &tm);
 	ret = pm860x_rtc_read_time(&pdev->dev, &tm);
 	if (ret < 0) {
 	if (ret < 0) {
 		dev_err(&pdev->dev, "Failed to read initial time.\n");
 		dev_err(&pdev->dev, "Failed to read initial time.\n");
-		goto out_rtc;
+		return ret;
 	}
 	}
 	if ((tm.tm_year < 70) || (tm.tm_year > 138)) {
 	if ((tm.tm_year < 70) || (tm.tm_year > 138)) {
 		tm.tm_year = 70;
 		tm.tm_year = 70;
@@ -362,7 +363,7 @@ static int pm860x_rtc_probe(struct platform_device *pdev)
 		ret = pm860x_rtc_set_time(&pdev->dev, &tm);
 		ret = pm860x_rtc_set_time(&pdev->dev, &tm);
 		if (ret < 0) {
 		if (ret < 0) {
 			dev_err(&pdev->dev, "Failed to set initial time.\n");
 			dev_err(&pdev->dev, "Failed to set initial time.\n");
-			goto out_rtc;
+			return ret;
 		}
 		}
 	}
 	}
 	rtc_tm_to_time(&tm, &ticks);
 	rtc_tm_to_time(&tm, &ticks);
@@ -373,12 +374,12 @@ static int pm860x_rtc_probe(struct platform_device *pdev)
 		}
 		}
 	}
 	}
 
 
-	info->rtc_dev = rtc_device_register("88pm860x-rtc", &pdev->dev,
+	info->rtc_dev = devm_rtc_device_register(&pdev->dev, "88pm860x-rtc",
 					    &pm860x_rtc_ops, THIS_MODULE);
 					    &pm860x_rtc_ops, THIS_MODULE);
 	ret = PTR_ERR(info->rtc_dev);
 	ret = PTR_ERR(info->rtc_dev);
 	if (IS_ERR(info->rtc_dev)) {
 	if (IS_ERR(info->rtc_dev)) {
 		dev_err(&pdev->dev, "Failed to register RTC device: %d\n", ret);
 		dev_err(&pdev->dev, "Failed to register RTC device: %d\n", ret);
-		goto out_rtc;
+		return ret;
 	}
 	}
 
 
 	/*
 	/*
@@ -405,11 +406,6 @@ static int pm860x_rtc_probe(struct platform_device *pdev)
 	device_init_wakeup(&pdev->dev, 1);
 	device_init_wakeup(&pdev->dev, 1);
 
 
 	return 0;
 	return 0;
-out_rtc:
-	free_irq(info->irq, info);
-out:
-	kfree(info);
-	return ret;
 }
 }
 
 
 static int pm860x_rtc_remove(struct platform_device *pdev)
 static int pm860x_rtc_remove(struct platform_device *pdev)
@@ -423,9 +419,6 @@ static int pm860x_rtc_remove(struct platform_device *pdev)
 #endif	/* VRTC_CALIBRATION */
 #endif	/* VRTC_CALIBRATION */
 
 
 	platform_set_drvdata(pdev, NULL);
 	platform_set_drvdata(pdev, NULL);
-	rtc_device_unregister(info->rtc_dev);
-	free_irq(info->irq, info);
-	kfree(info);
 	return 0;
 	return 0;
 }
 }
 
 

+ 3 - 18
drivers/rtc/rtc-ab3100.c

@@ -229,8 +229,8 @@ static int __init ab3100_rtc_probe(struct platform_device *pdev)
 		/* Ignore any error on this write */
 		/* Ignore any error on this write */
 	}
 	}
 
 
-	rtc = rtc_device_register("ab3100-rtc", &pdev->dev, &ab3100_rtc_ops,
-				  THIS_MODULE);
+	rtc = devm_rtc_device_register(&pdev->dev, "ab3100-rtc",
+					&ab3100_rtc_ops, THIS_MODULE);
 	if (IS_ERR(rtc)) {
 	if (IS_ERR(rtc)) {
 		err = PTR_ERR(rtc);
 		err = PTR_ERR(rtc);
 		return err;
 		return err;
@@ -242,9 +242,6 @@ static int __init ab3100_rtc_probe(struct platform_device *pdev)
 
 
 static int __exit ab3100_rtc_remove(struct platform_device *pdev)
 static int __exit ab3100_rtc_remove(struct platform_device *pdev)
 {
 {
-	struct rtc_device *rtc = platform_get_drvdata(pdev);
-
-	rtc_device_unregister(rtc);
 	platform_set_drvdata(pdev, NULL);
 	platform_set_drvdata(pdev, NULL);
 	return 0;
 	return 0;
 }
 }
@@ -257,19 +254,7 @@ static struct platform_driver ab3100_rtc_driver = {
 	.remove	 = __exit_p(ab3100_rtc_remove),
 	.remove	 = __exit_p(ab3100_rtc_remove),
 };
 };
 
 
-static int __init ab3100_rtc_init(void)
-{
-	return platform_driver_probe(&ab3100_rtc_driver,
-				     ab3100_rtc_probe);
-}
-
-static void __exit ab3100_rtc_exit(void)
-{
-	platform_driver_unregister(&ab3100_rtc_driver);
-}
-
-module_init(ab3100_rtc_init);
-module_exit(ab3100_rtc_exit);
+module_platform_driver_probe(ab3100_rtc_driver, ab3100_rtc_probe);
 
 
 MODULE_AUTHOR("Linus Walleij <linus.walleij@stericsson.com>");
 MODULE_AUTHOR("Linus Walleij <linus.walleij@stericsson.com>");
 MODULE_DESCRIPTION("AB3100 RTC Driver");
 MODULE_DESCRIPTION("AB3100 RTC Driver");

+ 6 - 12
drivers/rtc/rtc-ab8500.c

@@ -422,20 +422,19 @@ static int ab8500_rtc_probe(struct platform_device *pdev)
 
 
 	device_init_wakeup(&pdev->dev, true);
 	device_init_wakeup(&pdev->dev, true);
 
 
-	rtc = rtc_device_register("ab8500-rtc", &pdev->dev, &ab8500_rtc_ops,
-			THIS_MODULE);
+	rtc = devm_rtc_device_register(&pdev->dev, "ab8500-rtc",
+					&ab8500_rtc_ops, THIS_MODULE);
 	if (IS_ERR(rtc)) {
 	if (IS_ERR(rtc)) {
 		dev_err(&pdev->dev, "Registration failed\n");
 		dev_err(&pdev->dev, "Registration failed\n");
 		err = PTR_ERR(rtc);
 		err = PTR_ERR(rtc);
 		return err;
 		return err;
 	}
 	}
 
 
-	err = request_threaded_irq(irq, NULL, rtc_alarm_handler,
-		IRQF_NO_SUSPEND | IRQF_ONESHOT, "ab8500-rtc", rtc);
-	if (err < 0) {
-		rtc_device_unregister(rtc);
+	err = devm_request_threaded_irq(&pdev->dev, irq, NULL,
+			rtc_alarm_handler, IRQF_NO_SUSPEND | IRQF_ONESHOT,
+			"ab8500-rtc", rtc);
+	if (err < 0)
 		return err;
 		return err;
-	}
 
 
 	platform_set_drvdata(pdev, rtc);
 	platform_set_drvdata(pdev, rtc);
 
 
@@ -450,13 +449,8 @@ static int ab8500_rtc_probe(struct platform_device *pdev)
 
 
 static int ab8500_rtc_remove(struct platform_device *pdev)
 static int ab8500_rtc_remove(struct platform_device *pdev)
 {
 {
-	struct rtc_device *rtc = platform_get_drvdata(pdev);
-	int irq = platform_get_irq_byname(pdev, "ALARM");
-
 	ab8500_sysfs_rtc_unregister(&pdev->dev);
 	ab8500_sysfs_rtc_unregister(&pdev->dev);
 
 
-	free_irq(irq, rtc);
-	rtc_device_unregister(rtc);
 	platform_set_drvdata(pdev, NULL);
 	platform_set_drvdata(pdev, NULL);
 
 
 	return 0;
 	return 0;

+ 10 - 29
drivers/rtc/rtc-at32ap700x.c

@@ -202,7 +202,8 @@ static int __init at32_rtc_probe(struct platform_device *pdev)
 	int irq;
 	int irq;
 	int ret;
 	int ret;
 
 
-	rtc = kzalloc(sizeof(struct rtc_at32ap700x), GFP_KERNEL);
+	rtc = devm_kzalloc(&pdev->dev, sizeof(struct rtc_at32ap700x),
+			   GFP_KERNEL);
 	if (!rtc) {
 	if (!rtc) {
 		dev_dbg(&pdev->dev, "out of memory\n");
 		dev_dbg(&pdev->dev, "out of memory\n");
 		return -ENOMEM;
 		return -ENOMEM;
@@ -223,7 +224,7 @@ static int __init at32_rtc_probe(struct platform_device *pdev)
 	}
 	}
 
 
 	rtc->irq = irq;
 	rtc->irq = irq;
-	rtc->regs = ioremap(regs->start, resource_size(regs));
+	rtc->regs = devm_ioremap(&pdev->dev, regs->start, resource_size(regs));
 	if (!rtc->regs) {
 	if (!rtc->regs) {
 		ret = -ENOMEM;
 		ret = -ENOMEM;
 		dev_dbg(&pdev->dev, "could not map I/O memory\n");
 		dev_dbg(&pdev->dev, "could not map I/O memory\n");
@@ -244,20 +245,21 @@ static int __init at32_rtc_probe(struct platform_device *pdev)
 				| RTC_BIT(CTRL_EN));
 				| RTC_BIT(CTRL_EN));
 	}
 	}
 
 
-	ret = request_irq(irq, at32_rtc_interrupt, IRQF_SHARED, "rtc", rtc);
+	ret = devm_request_irq(&pdev->dev, irq, at32_rtc_interrupt, IRQF_SHARED,
+				"rtc", rtc);
 	if (ret) {
 	if (ret) {
 		dev_dbg(&pdev->dev, "could not request irq %d\n", irq);
 		dev_dbg(&pdev->dev, "could not request irq %d\n", irq);
-		goto out_iounmap;
+		goto out;
 	}
 	}
 
 
 	platform_set_drvdata(pdev, rtc);
 	platform_set_drvdata(pdev, rtc);
 
 
-	rtc->rtc = rtc_device_register(pdev->name, &pdev->dev,
+	rtc->rtc = devm_rtc_device_register(&pdev->dev, pdev->name,
 				&at32_rtc_ops, THIS_MODULE);
 				&at32_rtc_ops, THIS_MODULE);
 	if (IS_ERR(rtc->rtc)) {
 	if (IS_ERR(rtc->rtc)) {
 		dev_dbg(&pdev->dev, "could not register rtc device\n");
 		dev_dbg(&pdev->dev, "could not register rtc device\n");
 		ret = PTR_ERR(rtc->rtc);
 		ret = PTR_ERR(rtc->rtc);
-		goto out_free_irq;
+		goto out;
 	}
 	}
 
 
 	device_init_wakeup(&pdev->dev, 1);
 	device_init_wakeup(&pdev->dev, 1);
@@ -267,26 +269,15 @@ static int __init at32_rtc_probe(struct platform_device *pdev)
 
 
 	return 0;
 	return 0;
 
 
-out_free_irq:
-	platform_set_drvdata(pdev, NULL);
-	free_irq(irq, rtc);
-out_iounmap:
-	iounmap(rtc->regs);
 out:
 out:
-	kfree(rtc);
+	platform_set_drvdata(pdev, NULL);
 	return ret;
 	return ret;
 }
 }
 
 
 static int __exit at32_rtc_remove(struct platform_device *pdev)
 static int __exit at32_rtc_remove(struct platform_device *pdev)
 {
 {
-	struct rtc_at32ap700x *rtc = platform_get_drvdata(pdev);
-
 	device_init_wakeup(&pdev->dev, 0);
 	device_init_wakeup(&pdev->dev, 0);
 
 
-	free_irq(rtc->irq, rtc);
-	iounmap(rtc->regs);
-	rtc_device_unregister(rtc->rtc);
-	kfree(rtc);
 	platform_set_drvdata(pdev, NULL);
 	platform_set_drvdata(pdev, NULL);
 
 
 	return 0;
 	return 0;
@@ -302,17 +293,7 @@ static struct platform_driver at32_rtc_driver = {
 	},
 	},
 };
 };
 
 
-static int __init at32_rtc_init(void)
-{
-	return platform_driver_probe(&at32_rtc_driver, at32_rtc_probe);
-}
-module_init(at32_rtc_init);
-
-static void __exit at32_rtc_exit(void)
-{
-	platform_driver_unregister(&at32_rtc_driver);
-}
-module_exit(at32_rtc_exit);
+module_platform_driver_probe(at32_rtc_driver, at32_rtc_probe);
 
 
 MODULE_AUTHOR("Hans-Christian Egtvedt <hcegtvedt@atmel.com>");
 MODULE_AUTHOR("Hans-Christian Egtvedt <hcegtvedt@atmel.com>");
 MODULE_DESCRIPTION("Real time clock for AVR32 AT32AP700x");
 MODULE_DESCRIPTION("Real time clock for AVR32 AT32AP700x");

+ 24 - 26
drivers/rtc/rtc-at91rm9200.c

@@ -28,6 +28,8 @@
 #include <linux/ioctl.h>
 #include <linux/ioctl.h>
 #include <linux/completion.h>
 #include <linux/completion.h>
 #include <linux/io.h>
 #include <linux/io.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
 
 
 #include <asm/uaccess.h>
 #include <asm/uaccess.h>
 
 
@@ -297,7 +299,7 @@ static int __init at91_rtc_probe(struct platform_device *pdev)
 				"at91_rtc", pdev);
 				"at91_rtc", pdev);
 	if (ret) {
 	if (ret) {
 		dev_err(&pdev->dev, "IRQ %d already in use.\n", irq);
 		dev_err(&pdev->dev, "IRQ %d already in use.\n", irq);
-		return ret;
+		goto err_unmap;
 	}
 	}
 
 
 	/* cpu init code should really have flagged this device as
 	/* cpu init code should really have flagged this device as
@@ -309,13 +311,20 @@ static int __init at91_rtc_probe(struct platform_device *pdev)
 	rtc = rtc_device_register(pdev->name, &pdev->dev,
 	rtc = rtc_device_register(pdev->name, &pdev->dev,
 				&at91_rtc_ops, THIS_MODULE);
 				&at91_rtc_ops, THIS_MODULE);
 	if (IS_ERR(rtc)) {
 	if (IS_ERR(rtc)) {
-		free_irq(irq, pdev);
-		return PTR_ERR(rtc);
+		ret = PTR_ERR(rtc);
+		goto err_free_irq;
 	}
 	}
 	platform_set_drvdata(pdev, rtc);
 	platform_set_drvdata(pdev, rtc);
 
 
 	dev_info(&pdev->dev, "AT91 Real Time Clock driver.\n");
 	dev_info(&pdev->dev, "AT91 Real Time Clock driver.\n");
 	return 0;
 	return 0;
+
+err_free_irq:
+	free_irq(irq, pdev);
+err_unmap:
+	iounmap(at91_rtc_regs);
+
+	return ret;
 }
 }
 
 
 /*
 /*
@@ -332,12 +341,13 @@ static int __exit at91_rtc_remove(struct platform_device *pdev)
 	free_irq(irq, pdev);
 	free_irq(irq, pdev);
 
 
 	rtc_device_unregister(rtc);
 	rtc_device_unregister(rtc);
+	iounmap(at91_rtc_regs);
 	platform_set_drvdata(pdev, NULL);
 	platform_set_drvdata(pdev, NULL);
 
 
 	return 0;
 	return 0;
 }
 }
 
 
-#ifdef CONFIG_PM
+#ifdef CONFIG_PM_SLEEP
 
 
 /* AT91RM9200 RTC Power management control */
 /* AT91RM9200 RTC Power management control */
 
 
@@ -369,39 +379,27 @@ static int at91_rtc_resume(struct device *dev)
 	}
 	}
 	return 0;
 	return 0;
 }
 }
+#endif
 
 
-static const struct dev_pm_ops at91_rtc_pm = {
-	.suspend =	at91_rtc_suspend,
-	.resume =	at91_rtc_resume,
-};
-
-#define at91_rtc_pm_ptr	&at91_rtc_pm
+static SIMPLE_DEV_PM_OPS(at91_rtc_pm_ops, at91_rtc_suspend, at91_rtc_resume);
 
 
-#else
-#define at91_rtc_pm_ptr	NULL
-#endif
+static const struct of_device_id at91_rtc_dt_ids[] = {
+	{ .compatible = "atmel,at91rm9200-rtc" },
+	{ /* sentinel */ }
+};
+MODULE_DEVICE_TABLE(of, at91_rtc_dt_ids);
 
 
 static struct platform_driver at91_rtc_driver = {
 static struct platform_driver at91_rtc_driver = {
 	.remove		= __exit_p(at91_rtc_remove),
 	.remove		= __exit_p(at91_rtc_remove),
 	.driver		= {
 	.driver		= {
 		.name	= "at91_rtc",
 		.name	= "at91_rtc",
 		.owner	= THIS_MODULE,
 		.owner	= THIS_MODULE,
-		.pm	= at91_rtc_pm_ptr,
+		.pm	= &at91_rtc_pm_ops,
+		.of_match_table = of_match_ptr(at91_rtc_dt_ids),
 	},
 	},
 };
 };
 
 
-static int __init at91_rtc_init(void)
-{
-	return platform_driver_probe(&at91_rtc_driver, at91_rtc_probe);
-}
-
-static void __exit at91_rtc_exit(void)
-{
-	platform_driver_unregister(&at91_rtc_driver);
-}
-
-module_init(at91_rtc_init);
-module_exit(at91_rtc_exit);
+module_platform_driver_probe(at91_rtc_driver, at91_rtc_probe);
 
 
 MODULE_AUTHOR("Rick Bronson");
 MODULE_AUTHOR("Rick Bronson");
 MODULE_DESCRIPTION("RTC driver for Atmel AT91RM9200");
 MODULE_DESCRIPTION("RTC driver for Atmel AT91RM9200");

+ 22 - 35
drivers/rtc/rtc-at91sam9.c

@@ -20,6 +20,7 @@
 #include <linux/ioctl.h>
 #include <linux/ioctl.h>
 #include <linux/slab.h>
 #include <linux/slab.h>
 #include <linux/platform_data/atmel.h>
 #include <linux/platform_data/atmel.h>
+#include <linux/io.h>
 
 
 #include <mach/at91_rtt.h>
 #include <mach/at91_rtt.h>
 #include <mach/cpu.h>
 #include <mach/cpu.h>
@@ -309,7 +310,7 @@ static int at91_rtc_probe(struct platform_device *pdev)
 		return irq;
 		return irq;
 	}
 	}
 
 
-	rtc = kzalloc(sizeof *rtc, GFP_KERNEL);
+	rtc = devm_kzalloc(&pdev->dev, sizeof(*rtc), GFP_KERNEL);
 	if (!rtc)
 	if (!rtc)
 		return -ENOMEM;
 		return -ENOMEM;
 
 
@@ -320,18 +321,19 @@ static int at91_rtc_probe(struct platform_device *pdev)
 		device_init_wakeup(&pdev->dev, 1);
 		device_init_wakeup(&pdev->dev, 1);
 
 
 	platform_set_drvdata(pdev, rtc);
 	platform_set_drvdata(pdev, rtc);
-	rtc->rtt = ioremap(r->start, resource_size(r));
+	rtc->rtt = devm_ioremap(&pdev->dev, r->start, resource_size(r));
 	if (!rtc->rtt) {
 	if (!rtc->rtt) {
 		dev_err(&pdev->dev, "failed to map registers, aborting.\n");
 		dev_err(&pdev->dev, "failed to map registers, aborting.\n");
 		ret = -ENOMEM;
 		ret = -ENOMEM;
 		goto fail;
 		goto fail;
 	}
 	}
 
 
-	rtc->gpbr = ioremap(r_gpbr->start, resource_size(r_gpbr));
+	rtc->gpbr = devm_ioremap(&pdev->dev, r_gpbr->start,
+				resource_size(r_gpbr));
 	if (!rtc->gpbr) {
 	if (!rtc->gpbr) {
 		dev_err(&pdev->dev, "failed to map gpbr registers, aborting.\n");
 		dev_err(&pdev->dev, "failed to map gpbr registers, aborting.\n");
 		ret = -ENOMEM;
 		ret = -ENOMEM;
-		goto fail_gpbr;
+		goto fail;
 	}
 	}
 
 
 	mr = rtt_readl(rtc, MR);
 	mr = rtt_readl(rtc, MR);
@@ -346,20 +348,19 @@ static int at91_rtc_probe(struct platform_device *pdev)
 	mr &= ~(AT91_RTT_ALMIEN | AT91_RTT_RTTINCIEN);
 	mr &= ~(AT91_RTT_ALMIEN | AT91_RTT_RTTINCIEN);
 	rtt_writel(rtc, MR, mr);
 	rtt_writel(rtc, MR, mr);
 
 
-	rtc->rtcdev = rtc_device_register(pdev->name, &pdev->dev,
-				&at91_rtc_ops, THIS_MODULE);
+	rtc->rtcdev = devm_rtc_device_register(&pdev->dev, pdev->name,
+					&at91_rtc_ops, THIS_MODULE);
 	if (IS_ERR(rtc->rtcdev)) {
 	if (IS_ERR(rtc->rtcdev)) {
 		ret = PTR_ERR(rtc->rtcdev);
 		ret = PTR_ERR(rtc->rtcdev);
-		goto fail_register;
+		goto fail;
 	}
 	}
 
 
 	/* register irq handler after we know what name we'll use */
 	/* register irq handler after we know what name we'll use */
-	ret = request_irq(rtc->irq, at91_rtc_interrupt, IRQF_SHARED,
-				dev_name(&rtc->rtcdev->dev), rtc);
+	ret = devm_request_irq(&pdev->dev, rtc->irq, at91_rtc_interrupt,
+				IRQF_SHARED, dev_name(&rtc->rtcdev->dev), rtc);
 	if (ret) {
 	if (ret) {
 		dev_dbg(&pdev->dev, "can't share IRQ %d?\n", rtc->irq);
 		dev_dbg(&pdev->dev, "can't share IRQ %d?\n", rtc->irq);
-		rtc_device_unregister(rtc->rtcdev);
-		goto fail_register;
+		goto fail;
 	}
 	}
 
 
 	/* NOTE:  sam9260 rev A silicon has a ROM bug which resets the
 	/* NOTE:  sam9260 rev A silicon has a ROM bug which resets the
@@ -374,13 +375,8 @@ static int at91_rtc_probe(struct platform_device *pdev)
 
 
 	return 0;
 	return 0;
 
 
-fail_register:
-	iounmap(rtc->gpbr);
-fail_gpbr:
-	iounmap(rtc->rtt);
 fail:
 fail:
 	platform_set_drvdata(pdev, NULL);
 	platform_set_drvdata(pdev, NULL);
-	kfree(rtc);
 	return ret;
 	return ret;
 }
 }
 
 
@@ -394,14 +390,8 @@ static int at91_rtc_remove(struct platform_device *pdev)
 
 
 	/* disable all interrupts */
 	/* disable all interrupts */
 	rtt_writel(rtc, MR, mr & ~(AT91_RTT_ALMIEN | AT91_RTT_RTTINCIEN));
 	rtt_writel(rtc, MR, mr & ~(AT91_RTT_ALMIEN | AT91_RTT_RTTINCIEN));
-	free_irq(rtc->irq, rtc);
-
-	rtc_device_unregister(rtc->rtcdev);
 
 
-	iounmap(rtc->gpbr);
-	iounmap(rtc->rtt);
 	platform_set_drvdata(pdev, NULL);
 	platform_set_drvdata(pdev, NULL);
-	kfree(rtc);
 	return 0;
 	return 0;
 }
 }
 
 
@@ -414,14 +404,13 @@ static void at91_rtc_shutdown(struct platform_device *pdev)
 	rtt_writel(rtc, MR, mr & ~rtc->imr);
 	rtt_writel(rtc, MR, mr & ~rtc->imr);
 }
 }
 
 
-#ifdef CONFIG_PM
+#ifdef CONFIG_PM_SLEEP
 
 
 /* AT91SAM9 RTC Power management control */
 /* AT91SAM9 RTC Power management control */
 
 
-static int at91_rtc_suspend(struct platform_device *pdev,
-					pm_message_t state)
+static int at91_rtc_suspend(struct device *dev)
 {
 {
-	struct sam9_rtc	*rtc = platform_get_drvdata(pdev);
+	struct sam9_rtc	*rtc = dev_get_drvdata(dev);
 	u32		mr = rtt_readl(rtc, MR);
 	u32		mr = rtt_readl(rtc, MR);
 
 
 	/*
 	/*
@@ -430,7 +419,7 @@ static int at91_rtc_suspend(struct platform_device *pdev,
 	 */
 	 */
 	rtc->imr = mr & (AT91_RTT_ALMIEN | AT91_RTT_RTTINCIEN);
 	rtc->imr = mr & (AT91_RTT_ALMIEN | AT91_RTT_RTTINCIEN);
 	if (rtc->imr) {
 	if (rtc->imr) {
-		if (device_may_wakeup(&pdev->dev) && (mr & AT91_RTT_ALMIEN)) {
+		if (device_may_wakeup(dev) && (mr & AT91_RTT_ALMIEN)) {
 			enable_irq_wake(rtc->irq);
 			enable_irq_wake(rtc->irq);
 			/* don't let RTTINC cause wakeups */
 			/* don't let RTTINC cause wakeups */
 			if (mr & AT91_RTT_RTTINCIEN)
 			if (mr & AT91_RTT_RTTINCIEN)
@@ -442,13 +431,13 @@ static int at91_rtc_suspend(struct platform_device *pdev,
 	return 0;
 	return 0;
 }
 }
 
 
-static int at91_rtc_resume(struct platform_device *pdev)
+static int at91_rtc_resume(struct device *dev)
 {
 {
-	struct sam9_rtc	*rtc = platform_get_drvdata(pdev);
+	struct sam9_rtc	*rtc = dev_get_drvdata(dev);
 	u32		mr;
 	u32		mr;
 
 
 	if (rtc->imr) {
 	if (rtc->imr) {
-		if (device_may_wakeup(&pdev->dev))
+		if (device_may_wakeup(dev))
 			disable_irq_wake(rtc->irq);
 			disable_irq_wake(rtc->irq);
 		mr = rtt_readl(rtc, MR);
 		mr = rtt_readl(rtc, MR);
 		rtt_writel(rtc, MR, mr | rtc->imr);
 		rtt_writel(rtc, MR, mr | rtc->imr);
@@ -456,20 +445,18 @@ static int at91_rtc_resume(struct platform_device *pdev)
 
 
 	return 0;
 	return 0;
 }
 }
-#else
-#define at91_rtc_suspend	NULL
-#define at91_rtc_resume		NULL
 #endif
 #endif
 
 
+static SIMPLE_DEV_PM_OPS(at91_rtc_pm_ops, at91_rtc_suspend, at91_rtc_resume);
+
 static struct platform_driver at91_rtc_driver = {
 static struct platform_driver at91_rtc_driver = {
 	.probe		= at91_rtc_probe,
 	.probe		= at91_rtc_probe,
 	.remove		= at91_rtc_remove,
 	.remove		= at91_rtc_remove,
 	.shutdown	= at91_rtc_shutdown,
 	.shutdown	= at91_rtc_shutdown,
-	.suspend	= at91_rtc_suspend,
-	.resume		= at91_rtc_resume,
 	.driver		= {
 	.driver		= {
 		.name	= "rtc-at91sam9",
 		.name	= "rtc-at91sam9",
 		.owner	= THIS_MODULE,
 		.owner	= THIS_MODULE,
+		.pm	= &at91_rtc_pm_ops,
 	},
 	},
 };
 };
 
 

+ 2 - 16
drivers/rtc/rtc-au1xxx.c

@@ -101,7 +101,7 @@ static int au1xtoy_rtc_probe(struct platform_device *pdev)
 	while (au_readl(SYS_COUNTER_CNTRL) & SYS_CNTRL_C0S)
 	while (au_readl(SYS_COUNTER_CNTRL) & SYS_CNTRL_C0S)
 		msleep(1);
 		msleep(1);
 
 
-	rtcdev = rtc_device_register("rtc-au1xxx", &pdev->dev,
+	rtcdev = devm_rtc_device_register(&pdev->dev, "rtc-au1xxx",
 				     &au1xtoy_rtc_ops, THIS_MODULE);
 				     &au1xtoy_rtc_ops, THIS_MODULE);
 	if (IS_ERR(rtcdev)) {
 	if (IS_ERR(rtcdev)) {
 		ret = PTR_ERR(rtcdev);
 		ret = PTR_ERR(rtcdev);
@@ -118,9 +118,6 @@ out_err:
 
 
 static int au1xtoy_rtc_remove(struct platform_device *pdev)
 static int au1xtoy_rtc_remove(struct platform_device *pdev)
 {
 {
-	struct rtc_device *rtcdev = platform_get_drvdata(pdev);
-
-	rtc_device_unregister(rtcdev);
 	platform_set_drvdata(pdev, NULL);
 	platform_set_drvdata(pdev, NULL);
 
 
 	return 0;
 	return 0;
@@ -134,18 +131,7 @@ static struct platform_driver au1xrtc_driver = {
 	.remove		= au1xtoy_rtc_remove,
 	.remove		= au1xtoy_rtc_remove,
 };
 };
 
 
-static int __init au1xtoy_rtc_init(void)
-{
-	return platform_driver_probe(&au1xrtc_driver, au1xtoy_rtc_probe);
-}
-
-static void __exit au1xtoy_rtc_exit(void)
-{
-	platform_driver_unregister(&au1xrtc_driver);
-}
-
-module_init(au1xtoy_rtc_init);
-module_exit(au1xtoy_rtc_exit);
+module_platform_driver_probe(au1xrtc_driver, au1xtoy_rtc_probe);
 
 
 MODULE_DESCRIPTION("Au1xxx TOY-counter-based RTC driver");
 MODULE_DESCRIPTION("Au1xxx TOY-counter-based RTC driver");
 MODULE_AUTHOR("Manuel Lauss <manuel.lauss@gmail.com>");
 MODULE_AUTHOR("Manuel Lauss <manuel.lauss@gmail.com>");

+ 11 - 23
drivers/rtc/rtc-bfin.c

@@ -352,14 +352,14 @@ static int bfin_rtc_probe(struct platform_device *pdev)
 	dev_dbg_stamp(dev);
 	dev_dbg_stamp(dev);
 
 
 	/* Allocate memory for our RTC struct */
 	/* Allocate memory for our RTC struct */
-	rtc = kzalloc(sizeof(*rtc), GFP_KERNEL);
+	rtc = devm_kzalloc(dev, sizeof(*rtc), GFP_KERNEL);
 	if (unlikely(!rtc))
 	if (unlikely(!rtc))
 		return -ENOMEM;
 		return -ENOMEM;
 	platform_set_drvdata(pdev, rtc);
 	platform_set_drvdata(pdev, rtc);
 	device_init_wakeup(dev, 1);
 	device_init_wakeup(dev, 1);
 
 
 	/* Register our RTC with the RTC framework */
 	/* Register our RTC with the RTC framework */
-	rtc->rtc_dev = rtc_device_register(pdev->name, dev, &bfin_rtc_ops,
+	rtc->rtc_dev = devm_rtc_device_register(dev, pdev->name, &bfin_rtc_ops,
 						THIS_MODULE);
 						THIS_MODULE);
 	if (unlikely(IS_ERR(rtc->rtc_dev))) {
 	if (unlikely(IS_ERR(rtc->rtc_dev))) {
 		ret = PTR_ERR(rtc->rtc_dev);
 		ret = PTR_ERR(rtc->rtc_dev);
@@ -367,9 +367,10 @@ static int bfin_rtc_probe(struct platform_device *pdev)
 	}
 	}
 
 
 	/* Grab the IRQ and init the hardware */
 	/* Grab the IRQ and init the hardware */
-	ret = request_irq(IRQ_RTC, bfin_rtc_interrupt, 0, pdev->name, dev);
+	ret = devm_request_irq(dev, IRQ_RTC, bfin_rtc_interrupt, 0,
+				pdev->name, dev);
 	if (unlikely(ret))
 	if (unlikely(ret))
-		goto err_reg;
+		goto err;
 	/* sometimes the bootloader touched things, but the write complete was not
 	/* sometimes the bootloader touched things, but the write complete was not
 	 * enabled, so let's just do a quick timeout here since the IRQ will not fire ...
 	 * enabled, so let's just do a quick timeout here since the IRQ will not fire ...
 	 */
 	 */
@@ -381,32 +382,23 @@ static int bfin_rtc_probe(struct platform_device *pdev)
 
 
 	return 0;
 	return 0;
 
 
-err_reg:
-	rtc_device_unregister(rtc->rtc_dev);
 err:
 err:
-	kfree(rtc);
 	return ret;
 	return ret;
 }
 }
 
 
 static int bfin_rtc_remove(struct platform_device *pdev)
 static int bfin_rtc_remove(struct platform_device *pdev)
 {
 {
-	struct bfin_rtc *rtc = platform_get_drvdata(pdev);
 	struct device *dev = &pdev->dev;
 	struct device *dev = &pdev->dev;
 
 
 	bfin_rtc_reset(dev, 0);
 	bfin_rtc_reset(dev, 0);
-	free_irq(IRQ_RTC, dev);
-	rtc_device_unregister(rtc->rtc_dev);
 	platform_set_drvdata(pdev, NULL);
 	platform_set_drvdata(pdev, NULL);
-	kfree(rtc);
 
 
 	return 0;
 	return 0;
 }
 }
 
 
-#ifdef CONFIG_PM
-static int bfin_rtc_suspend(struct platform_device *pdev, pm_message_t state)
+#ifdef CONFIG_PM_SLEEP
+static int bfin_rtc_suspend(struct device *dev)
 {
 {
-	struct device *dev = &pdev->dev;
-
 	dev_dbg_stamp(dev);
 	dev_dbg_stamp(dev);
 
 
 	if (device_may_wakeup(dev)) {
 	if (device_may_wakeup(dev)) {
@@ -418,10 +410,8 @@ static int bfin_rtc_suspend(struct platform_device *pdev, pm_message_t state)
 	return 0;
 	return 0;
 }
 }
 
 
-static int bfin_rtc_resume(struct platform_device *pdev)
+static int bfin_rtc_resume(struct device *dev)
 {
 {
-	struct device *dev = &pdev->dev;
-
 	dev_dbg_stamp(dev);
 	dev_dbg_stamp(dev);
 
 
 	if (device_may_wakeup(dev))
 	if (device_may_wakeup(dev))
@@ -440,20 +430,18 @@ static int bfin_rtc_resume(struct platform_device *pdev)
 
 
 	return 0;
 	return 0;
 }
 }
-#else
-# define bfin_rtc_suspend NULL
-# define bfin_rtc_resume  NULL
 #endif
 #endif
 
 
+static SIMPLE_DEV_PM_OPS(bfin_rtc_pm_ops, bfin_rtc_suspend, bfin_rtc_resume);
+
 static struct platform_driver bfin_rtc_driver = {
 static struct platform_driver bfin_rtc_driver = {
 	.driver		= {
 	.driver		= {
 		.name	= "rtc-bfin",
 		.name	= "rtc-bfin",
 		.owner	= THIS_MODULE,
 		.owner	= THIS_MODULE,
+		.pm	= &bfin_rtc_pm_ops,
 	},
 	},
 	.probe		= bfin_rtc_probe,
 	.probe		= bfin_rtc_probe,
 	.remove		= bfin_rtc_remove,
 	.remove		= bfin_rtc_remove,
-	.suspend	= bfin_rtc_suspend,
-	.resume		= bfin_rtc_resume,
 };
 };
 
 
 module_platform_driver(bfin_rtc_driver);
 module_platform_driver(bfin_rtc_driver);

+ 1 - 4
drivers/rtc/rtc-bq32k.c

@@ -153,7 +153,7 @@ static int bq32k_probe(struct i2c_client *client,
 	if (error)
 	if (error)
 		return error;
 		return error;
 
 
-	rtc = rtc_device_register(bq32k_driver.driver.name, &client->dev,
+	rtc = devm_rtc_device_register(&client->dev, bq32k_driver.driver.name,
 						&bq32k_rtc_ops, THIS_MODULE);
 						&bq32k_rtc_ops, THIS_MODULE);
 	if (IS_ERR(rtc))
 	if (IS_ERR(rtc))
 		return PTR_ERR(rtc);
 		return PTR_ERR(rtc);
@@ -165,9 +165,6 @@ static int bq32k_probe(struct i2c_client *client,
 
 
 static int bq32k_remove(struct i2c_client *client)
 static int bq32k_remove(struct i2c_client *client)
 {
 {
-	struct rtc_device *rtc = i2c_get_clientdata(client);
-
-	rtc_device_unregister(rtc);
 	return 0;
 	return 0;
 }
 }
 
 

+ 8 - 21
drivers/rtc/rtc-bq4802.c

@@ -142,7 +142,7 @@ static const struct rtc_class_ops bq4802_ops = {
 
 
 static int bq4802_probe(struct platform_device *pdev)
 static int bq4802_probe(struct platform_device *pdev)
 {
 {
-	struct bq4802 *p = kzalloc(sizeof(*p), GFP_KERNEL);
+	struct bq4802 *p = devm_kzalloc(&pdev->dev, sizeof(*p), GFP_KERNEL);
 	int err = -ENOMEM;
 	int err = -ENOMEM;
 
 
 	if (!p)
 	if (!p)
@@ -155,54 +155,41 @@ static int bq4802_probe(struct platform_device *pdev)
 		p->r = platform_get_resource(pdev, IORESOURCE_IO, 0);
 		p->r = platform_get_resource(pdev, IORESOURCE_IO, 0);
 		err = -EINVAL;
 		err = -EINVAL;
 		if (!p->r)
 		if (!p->r)
-			goto out_free;
+			goto out;
 	}
 	}
 	if (p->r->flags & IORESOURCE_IO) {
 	if (p->r->flags & IORESOURCE_IO) {
 		p->ioport = p->r->start;
 		p->ioport = p->r->start;
 		p->read = bq4802_read_io;
 		p->read = bq4802_read_io;
 		p->write = bq4802_write_io;
 		p->write = bq4802_write_io;
 	} else if (p->r->flags & IORESOURCE_MEM) {
 	} else if (p->r->flags & IORESOURCE_MEM) {
-		p->regs = ioremap(p->r->start, resource_size(p->r));
+		p->regs = devm_ioremap(&pdev->dev, p->r->start,
+					resource_size(p->r));
 		p->read = bq4802_read_mem;
 		p->read = bq4802_read_mem;
 		p->write = bq4802_write_mem;
 		p->write = bq4802_write_mem;
 	} else {
 	} else {
 		err = -EINVAL;
 		err = -EINVAL;
-		goto out_free;
+		goto out;
 	}
 	}
 
 
 	platform_set_drvdata(pdev, p);
 	platform_set_drvdata(pdev, p);
 
 
-	p->rtc = rtc_device_register("bq4802", &pdev->dev,
-				     &bq4802_ops, THIS_MODULE);
+	p->rtc = devm_rtc_device_register(&pdev->dev, "bq4802",
+					&bq4802_ops, THIS_MODULE);
 	if (IS_ERR(p->rtc)) {
 	if (IS_ERR(p->rtc)) {
 		err = PTR_ERR(p->rtc);
 		err = PTR_ERR(p->rtc);
-		goto out_iounmap;
+		goto out;
 	}
 	}
 
 
 	err = 0;
 	err = 0;
 out:
 out:
 	return err;
 	return err;
 
 
-out_iounmap:
-	if (p->r->flags & IORESOURCE_MEM)
-		iounmap(p->regs);
-out_free:
-	kfree(p);
-	goto out;
 }
 }
 
 
 static int bq4802_remove(struct platform_device *pdev)
 static int bq4802_remove(struct platform_device *pdev)
 {
 {
-	struct bq4802 *p = platform_get_drvdata(pdev);
-
-	rtc_device_unregister(p->rtc);
-	if (p->r->flags & IORESOURCE_MEM)
-		iounmap(p->regs);
-
 	platform_set_drvdata(pdev, NULL);
 	platform_set_drvdata(pdev, NULL);
 
 
-	kfree(p);
-
 	return 0;
 	return 0;
 }
 }
 
 

+ 2 - 2
drivers/rtc/rtc-cmos.c

@@ -804,9 +804,8 @@ static int cmos_suspend(struct device *dev)
 			mask = RTC_IRQMASK;
 			mask = RTC_IRQMASK;
 		tmp &= ~mask;
 		tmp &= ~mask;
 		CMOS_WRITE(tmp, RTC_CONTROL);
 		CMOS_WRITE(tmp, RTC_CONTROL);
+		hpet_mask_rtc_irq_bit(mask);
 
 
-		/* shut down hpet emulation - we don't need it for alarm */
-		hpet_mask_rtc_irq_bit(RTC_PIE|RTC_AIE|RTC_UIE);
 		cmos_checkintr(cmos, tmp);
 		cmos_checkintr(cmos, tmp);
 	}
 	}
 	spin_unlock_irq(&rtc_lock);
 	spin_unlock_irq(&rtc_lock);
@@ -870,6 +869,7 @@ static int cmos_resume(struct device *dev)
 			rtc_update_irq(cmos->rtc, 1, mask);
 			rtc_update_irq(cmos->rtc, 1, mask);
 			tmp &= ~RTC_AIE;
 			tmp &= ~RTC_AIE;
 			hpet_mask_rtc_irq_bit(RTC_AIE);
 			hpet_mask_rtc_irq_bit(RTC_AIE);
+			hpet_rtc_timer_init();
 		} while (mask & RTC_AIE);
 		} while (mask & RTC_AIE);
 		spin_unlock_irq(&rtc_lock);
 		spin_unlock_irq(&rtc_lock);
 	}
 	}

+ 14 - 28
drivers/rtc/rtc-coh901331.c

@@ -47,7 +47,7 @@ struct coh901331_port {
 	u32 physize;
 	u32 physize;
 	void __iomem *virtbase;
 	void __iomem *virtbase;
 	int irq;
 	int irq;
-#ifdef CONFIG_PM
+#ifdef CONFIG_PM_SLEEP
 	u32 irqmaskstore;
 	u32 irqmaskstore;
 #endif
 #endif
 };
 };
@@ -155,7 +155,6 @@ static int __exit coh901331_remove(struct platform_device *pdev)
 	struct coh901331_port *rtap = dev_get_drvdata(&pdev->dev);
 	struct coh901331_port *rtap = dev_get_drvdata(&pdev->dev);
 
 
 	if (rtap) {
 	if (rtap) {
-		rtc_device_unregister(rtap->rtc);
 		clk_unprepare(rtap->clk);
 		clk_unprepare(rtap->clk);
 		platform_set_drvdata(pdev, NULL);
 		platform_set_drvdata(pdev, NULL);
 	}
 	}
@@ -211,8 +210,8 @@ static int __init coh901331_probe(struct platform_device *pdev)
 	clk_disable(rtap->clk);
 	clk_disable(rtap->clk);
 
 
 	platform_set_drvdata(pdev, rtap);
 	platform_set_drvdata(pdev, rtap);
-	rtap->rtc = rtc_device_register("coh901331", &pdev->dev, &coh901331_ops,
-					 THIS_MODULE);
+	rtap->rtc = devm_rtc_device_register(&pdev->dev, "coh901331",
+					&coh901331_ops, THIS_MODULE);
 	if (IS_ERR(rtap->rtc)) {
 	if (IS_ERR(rtap->rtc)) {
 		ret = PTR_ERR(rtap->rtc);
 		ret = PTR_ERR(rtap->rtc);
 		goto out_no_rtc;
 		goto out_no_rtc;
@@ -226,17 +225,17 @@ static int __init coh901331_probe(struct platform_device *pdev)
 	return ret;
 	return ret;
 }
 }
 
 
-#ifdef CONFIG_PM
-static int coh901331_suspend(struct platform_device *pdev, pm_message_t state)
+#ifdef CONFIG_PM_SLEEP
+static int coh901331_suspend(struct device *dev)
 {
 {
-	struct coh901331_port *rtap = dev_get_drvdata(&pdev->dev);
+	struct coh901331_port *rtap = dev_get_drvdata(dev);
 
 
 	/*
 	/*
 	 * If this RTC alarm will be used for waking the system up,
 	 * If this RTC alarm will be used for waking the system up,
 	 * don't disable it of course. Else we just disable the alarm
 	 * don't disable it of course. Else we just disable the alarm
 	 * and await suspension.
 	 * and await suspension.
 	 */
 	 */
-	if (device_may_wakeup(&pdev->dev)) {
+	if (device_may_wakeup(dev)) {
 		enable_irq_wake(rtap->irq);
 		enable_irq_wake(rtap->irq);
 	} else {
 	} else {
 		clk_enable(rtap->clk);
 		clk_enable(rtap->clk);
@@ -248,12 +247,12 @@ static int coh901331_suspend(struct platform_device *pdev, pm_message_t state)
 	return 0;
 	return 0;
 }
 }
 
 
-static int coh901331_resume(struct platform_device *pdev)
+static int coh901331_resume(struct device *dev)
 {
 {
-	struct coh901331_port *rtap = dev_get_drvdata(&pdev->dev);
+	struct coh901331_port *rtap = dev_get_drvdata(dev);
 
 
 	clk_prepare(rtap->clk);
 	clk_prepare(rtap->clk);
-	if (device_may_wakeup(&pdev->dev)) {
+	if (device_may_wakeup(dev)) {
 		disable_irq_wake(rtap->irq);
 		disable_irq_wake(rtap->irq);
 	} else {
 	} else {
 		clk_enable(rtap->clk);
 		clk_enable(rtap->clk);
@@ -262,11 +261,10 @@ static int coh901331_resume(struct platform_device *pdev)
 	}
 	}
 	return 0;
 	return 0;
 }
 }
-#else
-#define coh901331_suspend NULL
-#define coh901331_resume NULL
 #endif
 #endif
 
 
+static SIMPLE_DEV_PM_OPS(coh901331_pm_ops, coh901331_suspend, coh901331_resume);
+
 static void coh901331_shutdown(struct platform_device *pdev)
 static void coh901331_shutdown(struct platform_device *pdev)
 {
 {
 	struct coh901331_port *rtap = dev_get_drvdata(&pdev->dev);
 	struct coh901331_port *rtap = dev_get_drvdata(&pdev->dev);
@@ -280,25 +278,13 @@ static struct platform_driver coh901331_driver = {
 	.driver = {
 	.driver = {
 		.name = "rtc-coh901331",
 		.name = "rtc-coh901331",
 		.owner = THIS_MODULE,
 		.owner = THIS_MODULE,
+		.pm = &coh901331_pm_ops,
 	},
 	},
 	.remove = __exit_p(coh901331_remove),
 	.remove = __exit_p(coh901331_remove),
-	.suspend = coh901331_suspend,
-	.resume = coh901331_resume,
 	.shutdown = coh901331_shutdown,
 	.shutdown = coh901331_shutdown,
 };
 };
 
 
-static int __init coh901331_init(void)
-{
-	return platform_driver_probe(&coh901331_driver, coh901331_probe);
-}
-
-static void __exit coh901331_exit(void)
-{
-	platform_driver_unregister(&coh901331_driver);
-}
-
-module_init(coh901331_init);
-module_exit(coh901331_exit);
+module_platform_driver_probe(coh901331_driver, coh901331_probe);
 
 
 MODULE_AUTHOR("Linus Walleij <linus.walleij@stericsson.com>");
 MODULE_AUTHOR("Linus Walleij <linus.walleij@stericsson.com>");
 MODULE_DESCRIPTION("ST-Ericsson AB COH 901 331 RTC Driver");
 MODULE_DESCRIPTION("ST-Ericsson AB COH 901 331 RTC Driver");

+ 1 - 4
drivers/rtc/rtc-da9052.c

@@ -247,7 +247,7 @@ static int da9052_rtc_probe(struct platform_device *pdev)
 		return ret;
 		return ret;
 	}
 	}
 
 
-	rtc->rtc = rtc_device_register(pdev->name, &pdev->dev,
+	rtc->rtc = devm_rtc_device_register(&pdev->dev, pdev->name,
 				       &da9052_rtc_ops, THIS_MODULE);
 				       &da9052_rtc_ops, THIS_MODULE);
 	if (IS_ERR(rtc->rtc))
 	if (IS_ERR(rtc->rtc))
 		return PTR_ERR(rtc->rtc);
 		return PTR_ERR(rtc->rtc);
@@ -257,9 +257,6 @@ static int da9052_rtc_probe(struct platform_device *pdev)
 
 
 static int da9052_rtc_remove(struct platform_device *pdev)
 static int da9052_rtc_remove(struct platform_device *pdev)
 {
 {
-	struct da9052_rtc *rtc = pdev->dev.platform_data;
-
-	rtc_device_unregister(rtc->rtc);
 	platform_set_drvdata(pdev, NULL);
 	platform_set_drvdata(pdev, NULL);
 
 
 	return 0;
 	return 0;

+ 1 - 4
drivers/rtc/rtc-da9055.c

@@ -294,7 +294,7 @@ static int da9055_rtc_probe(struct platform_device *pdev)
 
 
 	device_init_wakeup(&pdev->dev, 1);
 	device_init_wakeup(&pdev->dev, 1);
 
 
-	rtc->rtc = rtc_device_register(pdev->name, &pdev->dev,
+	rtc->rtc = devm_rtc_device_register(&pdev->dev, pdev->name,
 					&da9055_rtc_ops, THIS_MODULE);
 					&da9055_rtc_ops, THIS_MODULE);
 	if (IS_ERR(rtc->rtc)) {
 	if (IS_ERR(rtc->rtc)) {
 		ret = PTR_ERR(rtc->rtc);
 		ret = PTR_ERR(rtc->rtc);
@@ -317,9 +317,6 @@ err_rtc:
 
 
 static int da9055_rtc_remove(struct platform_device *pdev)
 static int da9055_rtc_remove(struct platform_device *pdev)
 {
 {
-	struct da9055_rtc *rtc = pdev->dev.platform_data;
-
-	rtc_device_unregister(rtc->rtc);
 	platform_set_drvdata(pdev, NULL);
 	platform_set_drvdata(pdev, NULL);
 
 
 	return 0;
 	return 0;

+ 5 - 19
drivers/rtc/rtc-davinci.c

@@ -523,7 +523,7 @@ static int __init davinci_rtc_probe(struct platform_device *pdev)
 
 
 	platform_set_drvdata(pdev, davinci_rtc);
 	platform_set_drvdata(pdev, davinci_rtc);
 
 
-	davinci_rtc->rtc = rtc_device_register(pdev->name, &pdev->dev,
+	davinci_rtc->rtc = devm_rtc_device_register(&pdev->dev, pdev->name,
 				    &davinci_rtc_ops, THIS_MODULE);
 				    &davinci_rtc_ops, THIS_MODULE);
 	if (IS_ERR(davinci_rtc->rtc)) {
 	if (IS_ERR(davinci_rtc->rtc)) {
 		ret = PTR_ERR(davinci_rtc->rtc);
 		ret = PTR_ERR(davinci_rtc->rtc);
@@ -543,7 +543,7 @@ static int __init davinci_rtc_probe(struct platform_device *pdev)
 			  0, "davinci_rtc", davinci_rtc);
 			  0, "davinci_rtc", davinci_rtc);
 	if (ret < 0) {
 	if (ret < 0) {
 		dev_err(dev, "unable to register davinci RTC interrupt\n");
 		dev_err(dev, "unable to register davinci RTC interrupt\n");
-		goto fail2;
+		goto fail1;
 	}
 	}
 
 
 	/* Enable interrupts */
 	/* Enable interrupts */
@@ -557,14 +557,12 @@ static int __init davinci_rtc_probe(struct platform_device *pdev)
 
 
 	return 0;
 	return 0;
 
 
-fail2:
-	rtc_device_unregister(davinci_rtc->rtc);
 fail1:
 fail1:
 	platform_set_drvdata(pdev, NULL);
 	platform_set_drvdata(pdev, NULL);
 	return ret;
 	return ret;
 }
 }
 
 
-static int davinci_rtc_remove(struct platform_device *pdev)
+static int __exit davinci_rtc_remove(struct platform_device *pdev)
 {
 {
 	struct davinci_rtc *davinci_rtc = platform_get_drvdata(pdev);
 	struct davinci_rtc *davinci_rtc = platform_get_drvdata(pdev);
 
 
@@ -572,8 +570,6 @@ static int davinci_rtc_remove(struct platform_device *pdev)
 
 
 	rtcif_write(davinci_rtc, 0, PRTCIF_INTEN);
 	rtcif_write(davinci_rtc, 0, PRTCIF_INTEN);
 
 
-	rtc_device_unregister(davinci_rtc->rtc);
-
 	platform_set_drvdata(pdev, NULL);
 	platform_set_drvdata(pdev, NULL);
 
 
 	return 0;
 	return 0;
@@ -581,24 +577,14 @@ static int davinci_rtc_remove(struct platform_device *pdev)
 
 
 static struct platform_driver davinci_rtc_driver = {
 static struct platform_driver davinci_rtc_driver = {
 	.probe		= davinci_rtc_probe,
 	.probe		= davinci_rtc_probe,
-	.remove		= davinci_rtc_remove,
+	.remove		= __exit_p(davinci_rtc_remove),
 	.driver		= {
 	.driver		= {
 		.name = "rtc_davinci",
 		.name = "rtc_davinci",
 		.owner = THIS_MODULE,
 		.owner = THIS_MODULE,
 	},
 	},
 };
 };
 
 
-static int __init rtc_init(void)
-{
-	return platform_driver_probe(&davinci_rtc_driver, davinci_rtc_probe);
-}
-module_init(rtc_init);
-
-static void __exit rtc_exit(void)
-{
-	platform_driver_unregister(&davinci_rtc_driver);
-}
-module_exit(rtc_exit);
+module_platform_driver_probe(davinci_rtc_driver, davinci_rtc_probe);
 
 
 MODULE_AUTHOR("Miguel Aguilar <miguel.aguilar@ridgerun.com>");
 MODULE_AUTHOR("Miguel Aguilar <miguel.aguilar@ridgerun.com>");
 MODULE_DESCRIPTION("Texas Instruments DaVinci PRTC Driver");
 MODULE_DESCRIPTION("Texas Instruments DaVinci PRTC Driver");

+ 2 - 5
drivers/rtc/rtc-dm355evm.c

@@ -127,8 +127,8 @@ static int dm355evm_rtc_probe(struct platform_device *pdev)
 {
 {
 	struct rtc_device *rtc;
 	struct rtc_device *rtc;
 
 
-	rtc = rtc_device_register(pdev->name,
-				  &pdev->dev, &dm355evm_rtc_ops, THIS_MODULE);
+	rtc = devm_rtc_device_register(&pdev->dev, pdev->name,
+					&dm355evm_rtc_ops, THIS_MODULE);
 	if (IS_ERR(rtc)) {
 	if (IS_ERR(rtc)) {
 		dev_err(&pdev->dev, "can't register RTC device, err %ld\n",
 		dev_err(&pdev->dev, "can't register RTC device, err %ld\n",
 			PTR_ERR(rtc));
 			PTR_ERR(rtc));
@@ -141,9 +141,6 @@ static int dm355evm_rtc_probe(struct platform_device *pdev)
 
 
 static int dm355evm_rtc_remove(struct platform_device *pdev)
 static int dm355evm_rtc_remove(struct platform_device *pdev)
 {
 {
-	struct rtc_device *rtc = platform_get_drvdata(pdev);
-
-	rtc_device_unregister(rtc);
 	platform_set_drvdata(pdev, NULL);
 	platform_set_drvdata(pdev, NULL);
 	return 0;
 	return 0;
 }
 }

+ 9 - 35
drivers/rtc/rtc-ds1216.c

@@ -30,8 +30,6 @@ struct ds1216_regs {
 struct ds1216_priv {
 struct ds1216_priv {
 	struct rtc_device *rtc;
 	struct rtc_device *rtc;
 	void __iomem *ioaddr;
 	void __iomem *ioaddr;
-	size_t size;
-	unsigned long baseaddr;
 };
 };
 
 
 static const u8 magic[] = {
 static const u8 magic[] = {
@@ -144,57 +142,33 @@ static int __init ds1216_rtc_probe(struct platform_device *pdev)
 {
 {
 	struct resource *res;
 	struct resource *res;
 	struct ds1216_priv *priv;
 	struct ds1216_priv *priv;
-	int ret = 0;
 	u8 dummy[8];
 	u8 dummy[8];
 
 
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 	if (!res)
 	if (!res)
 		return -ENODEV;
 		return -ENODEV;
-	priv = kzalloc(sizeof *priv, GFP_KERNEL);
+	priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
 	if (!priv)
 	if (!priv)
 		return -ENOMEM;
 		return -ENOMEM;
 
 
 	platform_set_drvdata(pdev, priv);
 	platform_set_drvdata(pdev, priv);
 
 
-	priv->size = resource_size(res);
-	if (!request_mem_region(res->start, priv->size, pdev->name)) {
-		ret = -EBUSY;
-		goto out;
-	}
-	priv->baseaddr = res->start;
-	priv->ioaddr = ioremap(priv->baseaddr, priv->size);
-	if (!priv->ioaddr) {
-		ret = -ENOMEM;
-		goto out;
-	}
-	priv->rtc = rtc_device_register("ds1216", &pdev->dev,
-				  &ds1216_rtc_ops, THIS_MODULE);
-	if (IS_ERR(priv->rtc)) {
-		ret = PTR_ERR(priv->rtc);
-		goto out;
-	}
+	priv->ioaddr = devm_ioremap_resource(&pdev->dev, res);
+	if (IS_ERR(priv->ioaddr))
+		return PTR_ERR(priv->ioaddr);
+
+	priv->rtc = devm_rtc_device_register(&pdev->dev, "ds1216",
+					&ds1216_rtc_ops, THIS_MODULE);
+	if (IS_ERR(priv->rtc))
+		return PTR_ERR(priv->rtc);
 
 
 	/* dummy read to get clock into a known state */
 	/* dummy read to get clock into a known state */
 	ds1216_read(priv->ioaddr, dummy);
 	ds1216_read(priv->ioaddr, dummy);
 	return 0;
 	return 0;
-
-out:
-	if (priv->ioaddr)
-		iounmap(priv->ioaddr);
-	if (priv->baseaddr)
-		release_mem_region(priv->baseaddr, priv->size);
-	kfree(priv);
-	return ret;
 }
 }
 
 
 static int __exit ds1216_rtc_remove(struct platform_device *pdev)
 static int __exit ds1216_rtc_remove(struct platform_device *pdev)
 {
 {
-	struct ds1216_priv *priv = platform_get_drvdata(pdev);
-
-	rtc_device_unregister(priv->rtc);
-	iounmap(priv->ioaddr);
-	release_mem_region(priv->baseaddr, priv->size);
-	kfree(priv);
 	return 0;
 	return 0;
 }
 }
 
 

+ 10 - 39
drivers/rtc/rtc-ds1286.c

@@ -25,8 +25,6 @@
 struct ds1286_priv {
 struct ds1286_priv {
 	struct rtc_device *rtc;
 	struct rtc_device *rtc;
 	u32 __iomem *rtcregs;
 	u32 __iomem *rtcregs;
-	size_t size;
-	unsigned long baseaddr;
 	spinlock_t lock;
 	spinlock_t lock;
 };
 };
 
 
@@ -270,7 +268,6 @@ static int ds1286_set_time(struct device *dev, struct rtc_time *tm)
 static int ds1286_read_alarm(struct device *dev, struct rtc_wkalrm *alm)
 static int ds1286_read_alarm(struct device *dev, struct rtc_wkalrm *alm)
 {
 {
 	struct ds1286_priv *priv = dev_get_drvdata(dev);
 	struct ds1286_priv *priv = dev_get_drvdata(dev);
-	unsigned char cmd;
 	unsigned long flags;
 	unsigned long flags;
 
 
 	/*
 	/*
@@ -281,7 +278,7 @@ static int ds1286_read_alarm(struct device *dev, struct rtc_wkalrm *alm)
 	alm->time.tm_min = ds1286_rtc_read(priv, RTC_MINUTES_ALARM) & 0x7f;
 	alm->time.tm_min = ds1286_rtc_read(priv, RTC_MINUTES_ALARM) & 0x7f;
 	alm->time.tm_hour = ds1286_rtc_read(priv, RTC_HOURS_ALARM)  & 0x1f;
 	alm->time.tm_hour = ds1286_rtc_read(priv, RTC_HOURS_ALARM)  & 0x1f;
 	alm->time.tm_wday = ds1286_rtc_read(priv, RTC_DAY_ALARM)    & 0x07;
 	alm->time.tm_wday = ds1286_rtc_read(priv, RTC_DAY_ALARM)    & 0x07;
-	cmd = ds1286_rtc_read(priv, RTC_CMD);
+	ds1286_rtc_read(priv, RTC_CMD);
 	spin_unlock_irqrestore(&priv->lock, flags);
 	spin_unlock_irqrestore(&priv->lock, flags);
 
 
 	alm->time.tm_min = bcd2bin(alm->time.tm_min);
 	alm->time.tm_min = bcd2bin(alm->time.tm_min);
@@ -334,56 +331,30 @@ static int ds1286_probe(struct platform_device *pdev)
 	struct rtc_device *rtc;
 	struct rtc_device *rtc;
 	struct resource *res;
 	struct resource *res;
 	struct ds1286_priv *priv;
 	struct ds1286_priv *priv;
-	int ret = 0;
 
 
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 	if (!res)
 	if (!res)
 		return -ENODEV;
 		return -ENODEV;
-	priv = kzalloc(sizeof(struct ds1286_priv), GFP_KERNEL);
+	priv = devm_kzalloc(&pdev->dev, sizeof(struct ds1286_priv), GFP_KERNEL);
 	if (!priv)
 	if (!priv)
 		return -ENOMEM;
 		return -ENOMEM;
 
 
-	priv->size = resource_size(res);
-	if (!request_mem_region(res->start, priv->size, pdev->name)) {
-		ret = -EBUSY;
-		goto out;
-	}
-	priv->baseaddr = res->start;
-	priv->rtcregs = ioremap(priv->baseaddr, priv->size);
-	if (!priv->rtcregs) {
-		ret = -ENOMEM;
-		goto out;
-	}
+	priv->rtcregs = devm_ioremap_resource(&pdev->dev, res);
+	if (IS_ERR(priv->rtcregs))
+		return PTR_ERR(priv->rtcregs);
+
 	spin_lock_init(&priv->lock);
 	spin_lock_init(&priv->lock);
 	platform_set_drvdata(pdev, priv);
 	platform_set_drvdata(pdev, priv);
-	rtc = rtc_device_register("ds1286", &pdev->dev,
-				  &ds1286_ops, THIS_MODULE);
-	if (IS_ERR(rtc)) {
-		ret = PTR_ERR(rtc);
-		goto out;
-	}
+	rtc = devm_rtc_device_register(&pdev->dev, "ds1286", &ds1286_ops,
+					THIS_MODULE);
+	if (IS_ERR(rtc))
+		return PTR_ERR(rtc);
 	priv->rtc = rtc;
 	priv->rtc = rtc;
 	return 0;
 	return 0;
-
-out:
-	if (priv->rtc)
-		rtc_device_unregister(priv->rtc);
-	if (priv->rtcregs)
-		iounmap(priv->rtcregs);
-	if (priv->baseaddr)
-		release_mem_region(priv->baseaddr, priv->size);
-	kfree(priv);
-	return ret;
 }
 }
 
 
 static int ds1286_remove(struct platform_device *pdev)
 static int ds1286_remove(struct platform_device *pdev)
 {
 {
-	struct ds1286_priv *priv = platform_get_drvdata(pdev);
-
-	rtc_device_unregister(priv->rtc);
-	iounmap(priv->rtcregs);
-	release_mem_region(priv->baseaddr, priv->size);
-	kfree(priv);
 	return 0;
 	return 0;
 }
 }
 
 

+ 4 - 18
drivers/rtc/rtc-ds1302.c

@@ -224,7 +224,7 @@ static int __init ds1302_rtc_probe(struct platform_device *pdev)
 		return -ENODEV;
 		return -ENODEV;
 	}
 	}
 
 
-	rtc = rtc_device_register("ds1302", &pdev->dev,
+	rtc = devm_rtc_device_register(&pdev->dev, "ds1302",
 					   &ds1302_rtc_ops, THIS_MODULE);
 					   &ds1302_rtc_ops, THIS_MODULE);
 	if (IS_ERR(rtc))
 	if (IS_ERR(rtc))
 		return PTR_ERR(rtc);
 		return PTR_ERR(rtc);
@@ -234,11 +234,8 @@ static int __init ds1302_rtc_probe(struct platform_device *pdev)
 	return 0;
 	return 0;
 }
 }
 
 
-static int ds1302_rtc_remove(struct platform_device *pdev)
+static int __exit ds1302_rtc_remove(struct platform_device *pdev)
 {
 {
-	struct rtc_device *rtc = platform_get_drvdata(pdev);
-
-	rtc_device_unregister(rtc);
 	platform_set_drvdata(pdev, NULL);
 	platform_set_drvdata(pdev, NULL);
 
 
 	return 0;
 	return 0;
@@ -249,21 +246,10 @@ static struct platform_driver ds1302_platform_driver = {
 		.name	= DRV_NAME,
 		.name	= DRV_NAME,
 		.owner	= THIS_MODULE,
 		.owner	= THIS_MODULE,
 	},
 	},
-	.remove		= ds1302_rtc_remove,
+	.remove		= __exit_p(ds1302_rtc_remove),
 };
 };
 
 
-static int __init ds1302_rtc_init(void)
-{
-	return platform_driver_probe(&ds1302_platform_driver, ds1302_rtc_probe);
-}
-
-static void __exit ds1302_rtc_exit(void)
-{
-	platform_driver_unregister(&ds1302_platform_driver);
-}
-
-module_init(ds1302_rtc_init);
-module_exit(ds1302_rtc_exit);
+module_platform_driver_probe(ds1302_platform_driver, ds1302_rtc_probe);
 
 
 MODULE_DESCRIPTION("Dallas DS1302 RTC driver");
 MODULE_DESCRIPTION("Dallas DS1302 RTC driver");
 MODULE_VERSION(DRV_VERSION);
 MODULE_VERSION(DRV_VERSION);

+ 12 - 23
drivers/rtc/rtc-ds1305.c

@@ -619,7 +619,7 @@ static int ds1305_probe(struct spi_device *spi)
 		return -EINVAL;
 		return -EINVAL;
 
 
 	/* set up driver data */
 	/* set up driver data */
-	ds1305 = kzalloc(sizeof *ds1305, GFP_KERNEL);
+	ds1305 = devm_kzalloc(&spi->dev, sizeof(*ds1305), GFP_KERNEL);
 	if (!ds1305)
 	if (!ds1305)
 		return -ENOMEM;
 		return -ENOMEM;
 	ds1305->spi = spi;
 	ds1305->spi = spi;
@@ -632,7 +632,7 @@ static int ds1305_probe(struct spi_device *spi)
 	if (status < 0) {
 	if (status < 0) {
 		dev_dbg(&spi->dev, "can't %s, %d\n",
 		dev_dbg(&spi->dev, "can't %s, %d\n",
 				"read", status);
 				"read", status);
-		goto fail0;
+		return status;
 	}
 	}
 
 
 	dev_dbg(&spi->dev, "ctrl %s: %3ph\n", "read", ds1305->ctrl);
 	dev_dbg(&spi->dev, "ctrl %s: %3ph\n", "read", ds1305->ctrl);
@@ -644,8 +644,7 @@ static int ds1305_probe(struct spi_device *spi)
 	 */
 	 */
 	if ((ds1305->ctrl[0] & 0x38) != 0 || (ds1305->ctrl[1] & 0xfc) != 0) {
 	if ((ds1305->ctrl[0] & 0x38) != 0 || (ds1305->ctrl[1] & 0xfc) != 0) {
 		dev_dbg(&spi->dev, "RTC chip is not present\n");
 		dev_dbg(&spi->dev, "RTC chip is not present\n");
-		status = -ENODEV;
-		goto fail0;
+		return -ENODEV;
 	}
 	}
 	if (ds1305->ctrl[2] == 0)
 	if (ds1305->ctrl[2] == 0)
 		dev_dbg(&spi->dev, "chip may not be present\n");
 		dev_dbg(&spi->dev, "chip may not be present\n");
@@ -664,7 +663,7 @@ static int ds1305_probe(struct spi_device *spi)
 
 
 		dev_dbg(&spi->dev, "clear WP --> %d\n", status);
 		dev_dbg(&spi->dev, "clear WP --> %d\n", status);
 		if (status < 0)
 		if (status < 0)
-			goto fail0;
+			return status;
 	}
 	}
 
 
 	/* on DS1305, maybe start oscillator; like most low power
 	/* on DS1305, maybe start oscillator; like most low power
@@ -718,7 +717,7 @@ static int ds1305_probe(struct spi_device *spi)
 		if (status < 0) {
 		if (status < 0) {
 			dev_dbg(&spi->dev, "can't %s, %d\n",
 			dev_dbg(&spi->dev, "can't %s, %d\n",
 					"write", status);
 					"write", status);
-			goto fail0;
+			return status;
 		}
 		}
 
 
 		dev_dbg(&spi->dev, "ctrl %s: %3ph\n", "write", ds1305->ctrl);
 		dev_dbg(&spi->dev, "ctrl %s: %3ph\n", "write", ds1305->ctrl);
@@ -730,7 +729,7 @@ static int ds1305_probe(struct spi_device *spi)
 				&value, sizeof value);
 				&value, sizeof value);
 	if (status < 0) {
 	if (status < 0) {
 		dev_dbg(&spi->dev, "read HOUR --> %d\n", status);
 		dev_dbg(&spi->dev, "read HOUR --> %d\n", status);
-		goto fail0;
+		return status;
 	}
 	}
 
 
 	ds1305->hr12 = (DS1305_HR_12 & value) != 0;
 	ds1305->hr12 = (DS1305_HR_12 & value) != 0;
@@ -738,12 +737,12 @@ static int ds1305_probe(struct spi_device *spi)
 		dev_dbg(&spi->dev, "AM/PM\n");
 		dev_dbg(&spi->dev, "AM/PM\n");
 
 
 	/* register RTC ... from here on, ds1305->ctrl needs locking */
 	/* register RTC ... from here on, ds1305->ctrl needs locking */
-	ds1305->rtc = rtc_device_register("ds1305", &spi->dev,
+	ds1305->rtc = devm_rtc_device_register(&spi->dev, "ds1305",
 			&ds1305_ops, THIS_MODULE);
 			&ds1305_ops, THIS_MODULE);
 	if (IS_ERR(ds1305->rtc)) {
 	if (IS_ERR(ds1305->rtc)) {
 		status = PTR_ERR(ds1305->rtc);
 		status = PTR_ERR(ds1305->rtc);
 		dev_dbg(&spi->dev, "register rtc --> %d\n", status);
 		dev_dbg(&spi->dev, "register rtc --> %d\n", status);
-		goto fail0;
+		return status;
 	}
 	}
 
 
 	/* Maybe set up alarm IRQ; be ready to handle it triggering right
 	/* Maybe set up alarm IRQ; be ready to handle it triggering right
@@ -754,12 +753,12 @@ static int ds1305_probe(struct spi_device *spi)
 	 */
 	 */
 	if (spi->irq) {
 	if (spi->irq) {
 		INIT_WORK(&ds1305->work, ds1305_work);
 		INIT_WORK(&ds1305->work, ds1305_work);
-		status = request_irq(spi->irq, ds1305_irq,
+		status = devm_request_irq(&spi->dev, spi->irq, ds1305_irq,
 				0, dev_name(&ds1305->rtc->dev), ds1305);
 				0, dev_name(&ds1305->rtc->dev), ds1305);
 		if (status < 0) {
 		if (status < 0) {
 			dev_dbg(&spi->dev, "request_irq %d --> %d\n",
 			dev_dbg(&spi->dev, "request_irq %d --> %d\n",
 					spi->irq, status);
 					spi->irq, status);
-			goto fail1;
+			return status;
 		}
 		}
 
 
 		device_set_wakeup_capable(&spi->dev, 1);
 		device_set_wakeup_capable(&spi->dev, 1);
@@ -769,18 +768,10 @@ static int ds1305_probe(struct spi_device *spi)
 	status = sysfs_create_bin_file(&spi->dev.kobj, &nvram);
 	status = sysfs_create_bin_file(&spi->dev.kobj, &nvram);
 	if (status < 0) {
 	if (status < 0) {
 		dev_dbg(&spi->dev, "register nvram --> %d\n", status);
 		dev_dbg(&spi->dev, "register nvram --> %d\n", status);
-		goto fail2;
+		return status;
 	}
 	}
 
 
 	return 0;
 	return 0;
-
-fail2:
-	free_irq(spi->irq, ds1305);
-fail1:
-	rtc_device_unregister(ds1305->rtc);
-fail0:
-	kfree(ds1305);
-	return status;
 }
 }
 
 
 static int ds1305_remove(struct spi_device *spi)
 static int ds1305_remove(struct spi_device *spi)
@@ -792,13 +783,11 @@ static int ds1305_remove(struct spi_device *spi)
 	/* carefully shut down irq and workqueue, if present */
 	/* carefully shut down irq and workqueue, if present */
 	if (spi->irq) {
 	if (spi->irq) {
 		set_bit(FLAG_EXITING, &ds1305->flags);
 		set_bit(FLAG_EXITING, &ds1305->flags);
-		free_irq(spi->irq, ds1305);
+		devm_free_irq(&spi->dev, spi->irq, ds1305);
 		cancel_work_sync(&ds1305->work);
 		cancel_work_sync(&ds1305->work);
 	}
 	}
 
 
-	rtc_device_unregister(ds1305->rtc);
 	spi_set_drvdata(spi, NULL);
 	spi_set_drvdata(spi, NULL);
-	kfree(ds1305);
 	return 0;
 	return 0;
 }
 }
 
 

+ 63 - 11
drivers/rtc/rtc-ds1307.c

@@ -4,6 +4,7 @@
  *  Copyright (C) 2005 James Chapman (ds1337 core)
  *  Copyright (C) 2005 James Chapman (ds1337 core)
  *  Copyright (C) 2006 David Brownell
  *  Copyright (C) 2006 David Brownell
  *  Copyright (C) 2009 Matthias Fuchs (rx8025 support)
  *  Copyright (C) 2009 Matthias Fuchs (rx8025 support)
+ *  Copyright (C) 2012 Bertrand Achard (nvram access fixes)
  *
  *
  * This program is free software; you can redistribute it and/or modify
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
  * it under the terms of the GNU General Public License version 2 as
@@ -196,7 +197,7 @@ static s32 ds1307_read_block_data_once(const struct i2c_client *client,
 static s32 ds1307_read_block_data(const struct i2c_client *client, u8 command,
 static s32 ds1307_read_block_data(const struct i2c_client *client, u8 command,
 				  u8 length, u8 *values)
 				  u8 length, u8 *values)
 {
 {
-	u8 oldvalues[I2C_SMBUS_BLOCK_MAX];
+	u8 oldvalues[255];
 	s32 ret;
 	s32 ret;
 	int tries = 0;
 	int tries = 0;
 
 
@@ -222,7 +223,7 @@ static s32 ds1307_read_block_data(const struct i2c_client *client, u8 command,
 static s32 ds1307_write_block_data(const struct i2c_client *client, u8 command,
 static s32 ds1307_write_block_data(const struct i2c_client *client, u8 command,
 				   u8 length, const u8 *values)
 				   u8 length, const u8 *values)
 {
 {
-	u8 currvalues[I2C_SMBUS_BLOCK_MAX];
+	u8 currvalues[255];
 	int tries = 0;
 	int tries = 0;
 
 
 	dev_dbg(&client->dev, "ds1307_write_block_data (length=%d)\n", length);
 	dev_dbg(&client->dev, "ds1307_write_block_data (length=%d)\n", length);
@@ -250,6 +251,57 @@ static s32 ds1307_write_block_data(const struct i2c_client *client, u8 command,
 
 
 /*----------------------------------------------------------------------*/
 /*----------------------------------------------------------------------*/
 
 
+/* These RTC devices are not designed to be connected to a SMbus adapter.
+   SMbus limits block operations length to 32 bytes, whereas it's not
+   limited on I2C buses. As a result, accesses may exceed 32 bytes;
+   in that case, split them into smaller blocks */
+
+static s32 ds1307_native_smbus_write_block_data(const struct i2c_client *client,
+				u8 command, u8 length, const u8 *values)
+{
+	u8 suboffset = 0;
+
+	if (length <= I2C_SMBUS_BLOCK_MAX)
+		return i2c_smbus_write_i2c_block_data(client,
+					command, length, values);
+
+	while (suboffset < length) {
+		s32 retval = i2c_smbus_write_i2c_block_data(client,
+				command + suboffset,
+				min(I2C_SMBUS_BLOCK_MAX, length - suboffset),
+				values + suboffset);
+		if (retval < 0)
+			return retval;
+
+		suboffset += I2C_SMBUS_BLOCK_MAX;
+	}
+	return length;
+}
+
+static s32 ds1307_native_smbus_read_block_data(const struct i2c_client *client,
+				u8 command, u8 length, u8 *values)
+{
+	u8 suboffset = 0;
+
+	if (length <= I2C_SMBUS_BLOCK_MAX)
+		return i2c_smbus_read_i2c_block_data(client,
+					command, length, values);
+
+	while (suboffset < length) {
+		s32 retval = i2c_smbus_read_i2c_block_data(client,
+				command + suboffset,
+				min(I2C_SMBUS_BLOCK_MAX, length - suboffset),
+				values + suboffset);
+		if (retval < 0)
+			return retval;
+
+		suboffset += I2C_SMBUS_BLOCK_MAX;
+	}
+	return length;
+}
+
+/*----------------------------------------------------------------------*/
+
 /*
 /*
  * The IRQ logic includes a "real" handler running in IRQ context just
  * The IRQ logic includes a "real" handler running in IRQ context just
  * long enough to schedule this workqueue entry.   We need a task context
  * long enough to schedule this workqueue entry.   We need a task context
@@ -646,8 +698,8 @@ static int ds1307_probe(struct i2c_client *client,
 
 
 	buf = ds1307->regs;
 	buf = ds1307->regs;
 	if (i2c_check_functionality(adapter, I2C_FUNC_SMBUS_I2C_BLOCK)) {
 	if (i2c_check_functionality(adapter, I2C_FUNC_SMBUS_I2C_BLOCK)) {
-		ds1307->read_block_data = i2c_smbus_read_i2c_block_data;
-		ds1307->write_block_data = i2c_smbus_write_i2c_block_data;
+		ds1307->read_block_data = ds1307_native_smbus_read_block_data;
+		ds1307->write_block_data = ds1307_native_smbus_write_block_data;
 	} else {
 	} else {
 		ds1307->read_block_data = ds1307_read_block_data;
 		ds1307->read_block_data = ds1307_read_block_data;
 		ds1307->write_block_data = ds1307_write_block_data;
 		ds1307->write_block_data = ds1307_write_block_data;
@@ -661,7 +713,7 @@ static int ds1307_probe(struct i2c_client *client,
 		tmp = ds1307->read_block_data(ds1307->client,
 		tmp = ds1307->read_block_data(ds1307->client,
 				DS1337_REG_CONTROL, 2, buf);
 				DS1337_REG_CONTROL, 2, buf);
 		if (tmp != 2) {
 		if (tmp != 2) {
-			pr_debug("read error %d\n", tmp);
+			dev_dbg(&client->dev, "read error %d\n", tmp);
 			err = -EIO;
 			err = -EIO;
 			goto exit_free;
 			goto exit_free;
 		}
 		}
@@ -700,7 +752,7 @@ static int ds1307_probe(struct i2c_client *client,
 		tmp = i2c_smbus_read_i2c_block_data(ds1307->client,
 		tmp = i2c_smbus_read_i2c_block_data(ds1307->client,
 				RX8025_REG_CTRL1 << 4 | 0x08, 2, buf);
 				RX8025_REG_CTRL1 << 4 | 0x08, 2, buf);
 		if (tmp != 2) {
 		if (tmp != 2) {
-			pr_debug("read error %d\n", tmp);
+			dev_dbg(&client->dev, "read error %d\n", tmp);
 			err = -EIO;
 			err = -EIO;
 			goto exit_free;
 			goto exit_free;
 		}
 		}
@@ -744,7 +796,7 @@ static int ds1307_probe(struct i2c_client *client,
 			tmp = i2c_smbus_read_i2c_block_data(ds1307->client,
 			tmp = i2c_smbus_read_i2c_block_data(ds1307->client,
 					RX8025_REG_CTRL1 << 4 | 0x08, 2, buf);
 					RX8025_REG_CTRL1 << 4 | 0x08, 2, buf);
 			if (tmp != 2) {
 			if (tmp != 2) {
-				pr_debug("read error %d\n", tmp);
+				dev_dbg(&client->dev, "read error %d\n", tmp);
 				err = -EIO;
 				err = -EIO;
 				goto exit_free;
 				goto exit_free;
 			}
 			}
@@ -772,7 +824,7 @@ read_rtc:
 	/* read RTC registers */
 	/* read RTC registers */
 	tmp = ds1307->read_block_data(ds1307->client, ds1307->offset, 8, buf);
 	tmp = ds1307->read_block_data(ds1307->client, ds1307->offset, 8, buf);
 	if (tmp != 8) {
 	if (tmp != 8) {
-		pr_debug("read error %d\n", tmp);
+		dev_dbg(&client->dev, "read error %d\n", tmp);
 		err = -EIO;
 		err = -EIO;
 		goto exit_free;
 		goto exit_free;
 	}
 	}
@@ -814,7 +866,7 @@ read_rtc:
 
 
 		tmp = i2c_smbus_read_byte_data(client, DS1340_REG_FLAG);
 		tmp = i2c_smbus_read_byte_data(client, DS1340_REG_FLAG);
 		if (tmp < 0) {
 		if (tmp < 0) {
-			pr_debug("read error %d\n", tmp);
+			dev_dbg(&client->dev, "read error %d\n", tmp);
 			err = -EIO;
 			err = -EIO;
 			goto exit_free;
 			goto exit_free;
 		}
 		}
@@ -908,8 +960,8 @@ read_rtc:
 		ds1307->nvram->attr.name = "nvram";
 		ds1307->nvram->attr.name = "nvram";
 		ds1307->nvram->attr.mode = S_IRUGO | S_IWUSR;
 		ds1307->nvram->attr.mode = S_IRUGO | S_IWUSR;
 		sysfs_bin_attr_init(ds1307->nvram);
 		sysfs_bin_attr_init(ds1307->nvram);
-		ds1307->nvram->read = ds1307_nvram_read,
-		ds1307->nvram->write = ds1307_nvram_write,
+		ds1307->nvram->read = ds1307_nvram_read;
+		ds1307->nvram->write = ds1307_nvram_write;
 		ds1307->nvram->size = chip->nvram_size;
 		ds1307->nvram->size = chip->nvram_size;
 		ds1307->nvram_offset = chip->nvram_offset;
 		ds1307->nvram_offset = chip->nvram_offset;
 		err = sysfs_create_bin_file(&client->dev.kobj, ds1307->nvram);
 		err = sysfs_create_bin_file(&client->dev.kobj, ds1307->nvram);

+ 10 - 25
drivers/rtc/rtc-ds1374.c

@@ -347,7 +347,7 @@ static int ds1374_probe(struct i2c_client *client,
 	struct ds1374 *ds1374;
 	struct ds1374 *ds1374;
 	int ret;
 	int ret;
 
 
-	ds1374 = kzalloc(sizeof(struct ds1374), GFP_KERNEL);
+	ds1374 = devm_kzalloc(&client->dev, sizeof(struct ds1374), GFP_KERNEL);
 	if (!ds1374)
 	if (!ds1374)
 		return -ENOMEM;
 		return -ENOMEM;
 
 
@@ -359,36 +359,27 @@ static int ds1374_probe(struct i2c_client *client,
 
 
 	ret = ds1374_check_rtc_status(client);
 	ret = ds1374_check_rtc_status(client);
 	if (ret)
 	if (ret)
-		goto out_free;
+		return ret;
 
 
 	if (client->irq > 0) {
 	if (client->irq > 0) {
-		ret = request_irq(client->irq, ds1374_irq, 0,
+		ret = devm_request_irq(&client->dev, client->irq, ds1374_irq, 0,
 		                  "ds1374", client);
 		                  "ds1374", client);
 		if (ret) {
 		if (ret) {
 			dev_err(&client->dev, "unable to request IRQ\n");
 			dev_err(&client->dev, "unable to request IRQ\n");
-			goto out_free;
+			return ret;
 		}
 		}
 
 
 		device_set_wakeup_capable(&client->dev, 1);
 		device_set_wakeup_capable(&client->dev, 1);
 	}
 	}
 
 
-	ds1374->rtc = rtc_device_register(client->name, &client->dev,
+	ds1374->rtc = devm_rtc_device_register(&client->dev, client->name,
 	                                  &ds1374_rtc_ops, THIS_MODULE);
 	                                  &ds1374_rtc_ops, THIS_MODULE);
 	if (IS_ERR(ds1374->rtc)) {
 	if (IS_ERR(ds1374->rtc)) {
-		ret = PTR_ERR(ds1374->rtc);
 		dev_err(&client->dev, "unable to register the class device\n");
 		dev_err(&client->dev, "unable to register the class device\n");
-		goto out_irq;
+		return PTR_ERR(ds1374->rtc);
 	}
 	}
 
 
 	return 0;
 	return 0;
-
-out_irq:
-	if (client->irq > 0)
-		free_irq(client->irq, client);
-
-out_free:
-	kfree(ds1374);
-	return ret;
 }
 }
 
 
 static int ds1374_remove(struct i2c_client *client)
 static int ds1374_remove(struct i2c_client *client)
@@ -400,16 +391,14 @@ static int ds1374_remove(struct i2c_client *client)
 		ds1374->exiting = 1;
 		ds1374->exiting = 1;
 		mutex_unlock(&ds1374->mutex);
 		mutex_unlock(&ds1374->mutex);
 
 
-		free_irq(client->irq, client);
+		devm_free_irq(&client->dev, client->irq, client);
 		cancel_work_sync(&ds1374->work);
 		cancel_work_sync(&ds1374->work);
 	}
 	}
 
 
-	rtc_device_unregister(ds1374->rtc);
-	kfree(ds1374);
 	return 0;
 	return 0;
 }
 }
 
 
-#ifdef CONFIG_PM
+#ifdef CONFIG_PM_SLEEP
 static int ds1374_suspend(struct device *dev)
 static int ds1374_suspend(struct device *dev)
 {
 {
 	struct i2c_client *client = to_i2c_client(dev);
 	struct i2c_client *client = to_i2c_client(dev);
@@ -427,19 +416,15 @@ static int ds1374_resume(struct device *dev)
 		disable_irq_wake(client->irq);
 		disable_irq_wake(client->irq);
 	return 0;
 	return 0;
 }
 }
+#endif
 
 
 static SIMPLE_DEV_PM_OPS(ds1374_pm, ds1374_suspend, ds1374_resume);
 static SIMPLE_DEV_PM_OPS(ds1374_pm, ds1374_suspend, ds1374_resume);
 
 
-#define DS1374_PM (&ds1374_pm)
-#else
-#define DS1374_PM NULL
-#endif
-
 static struct i2c_driver ds1374_driver = {
 static struct i2c_driver ds1374_driver = {
 	.driver = {
 	.driver = {
 		.name = "rtc-ds1374",
 		.name = "rtc-ds1374",
 		.owner = THIS_MODULE,
 		.owner = THIS_MODULE,
-		.pm = DS1374_PM,
+		.pm = &ds1374_pm,
 	},
 	},
 	.probe = ds1374_probe,
 	.probe = ds1374_probe,
 	.remove = ds1374_remove,
 	.remove = ds1374_remove,

+ 4 - 11
drivers/rtc/rtc-ds1390.c

@@ -131,26 +131,24 @@ static int ds1390_probe(struct spi_device *spi)
 	spi->bits_per_word = 8;
 	spi->bits_per_word = 8;
 	spi_setup(spi);
 	spi_setup(spi);
 
 
-	chip = kzalloc(sizeof *chip, GFP_KERNEL);
+	chip = devm_kzalloc(&spi->dev, sizeof(*chip), GFP_KERNEL);
 	if (!chip) {
 	if (!chip) {
 		dev_err(&spi->dev, "unable to allocate device memory\n");
 		dev_err(&spi->dev, "unable to allocate device memory\n");
 		return -ENOMEM;
 		return -ENOMEM;
 	}
 	}
-	dev_set_drvdata(&spi->dev, chip);
+	spi_set_drvdata(spi, chip);
 
 
 	res = ds1390_get_reg(&spi->dev, DS1390_REG_SECONDS, &tmp);
 	res = ds1390_get_reg(&spi->dev, DS1390_REG_SECONDS, &tmp);
 	if (res != 0) {
 	if (res != 0) {
 		dev_err(&spi->dev, "unable to read device\n");
 		dev_err(&spi->dev, "unable to read device\n");
-		kfree(chip);
 		return res;
 		return res;
 	}
 	}
 
 
-	chip->rtc = rtc_device_register("ds1390",
-				&spi->dev, &ds1390_rtc_ops, THIS_MODULE);
+	chip->rtc = devm_rtc_device_register(&spi->dev, "ds1390",
+					&ds1390_rtc_ops, THIS_MODULE);
 	if (IS_ERR(chip->rtc)) {
 	if (IS_ERR(chip->rtc)) {
 		dev_err(&spi->dev, "unable to register device\n");
 		dev_err(&spi->dev, "unable to register device\n");
 		res = PTR_ERR(chip->rtc);
 		res = PTR_ERR(chip->rtc);
-		kfree(chip);
 	}
 	}
 
 
 	return res;
 	return res;
@@ -158,11 +156,6 @@ static int ds1390_probe(struct spi_device *spi)
 
 
 static int ds1390_remove(struct spi_device *spi)
 static int ds1390_remove(struct spi_device *spi)
 {
 {
-	struct ds1390 *chip = spi_get_drvdata(spi);
-
-	rtc_device_unregister(chip->rtc);
-	kfree(chip);
-
 	return 0;
 	return 0;
 }
 }
 
 

+ 3 - 5
drivers/rtc/rtc-ds1511.c

@@ -538,15 +538,14 @@ static int ds1511_rtc_probe(struct platform_device *pdev)
 		}
 		}
 	}
 	}
 
 
-	rtc = rtc_device_register(pdev->name, &pdev->dev, &ds1511_rtc_ops,
-		THIS_MODULE);
+	rtc = devm_rtc_device_register(&pdev->dev, pdev->name, &ds1511_rtc_ops,
+					THIS_MODULE);
 	if (IS_ERR(rtc))
 	if (IS_ERR(rtc))
 		return PTR_ERR(rtc);
 		return PTR_ERR(rtc);
 	pdata->rtc = rtc;
 	pdata->rtc = rtc;
 
 
 	ret = sysfs_create_bin_file(&pdev->dev.kobj, &ds1511_nvram_attr);
 	ret = sysfs_create_bin_file(&pdev->dev.kobj, &ds1511_nvram_attr);
-	if (ret)
-		rtc_device_unregister(pdata->rtc);
+
 	return ret;
 	return ret;
 }
 }
 
 
@@ -555,7 +554,6 @@ static int ds1511_rtc_remove(struct platform_device *pdev)
 	struct rtc_plat_data *pdata = platform_get_drvdata(pdev);
 	struct rtc_plat_data *pdata = platform_get_drvdata(pdev);
 
 
 	sysfs_remove_bin_file(&pdev->dev.kobj, &ds1511_nvram_attr);
 	sysfs_remove_bin_file(&pdev->dev.kobj, &ds1511_nvram_attr);
-	rtc_device_unregister(pdata->rtc);
 	if (pdata->irq > 0) {
 	if (pdata->irq > 0) {
 		/*
 		/*
 		 * disable the alarm interrupt
 		 * disable the alarm interrupt

+ 2 - 4
drivers/rtc/rtc-ds1553.c

@@ -326,15 +326,14 @@ static int ds1553_rtc_probe(struct platform_device *pdev)
 		}
 		}
 	}
 	}
 
 
-	rtc = rtc_device_register(pdev->name, &pdev->dev,
+	rtc = devm_rtc_device_register(&pdev->dev, pdev->name,
 				  &ds1553_rtc_ops, THIS_MODULE);
 				  &ds1553_rtc_ops, THIS_MODULE);
 	if (IS_ERR(rtc))
 	if (IS_ERR(rtc))
 		return PTR_ERR(rtc);
 		return PTR_ERR(rtc);
 	pdata->rtc = rtc;
 	pdata->rtc = rtc;
 
 
 	ret = sysfs_create_bin_file(&pdev->dev.kobj, &ds1553_nvram_attr);
 	ret = sysfs_create_bin_file(&pdev->dev.kobj, &ds1553_nvram_attr);
-	if (ret)
-		rtc_device_unregister(rtc);
+
 	return ret;
 	return ret;
 }
 }
 
 
@@ -343,7 +342,6 @@ static int ds1553_rtc_remove(struct platform_device *pdev)
 	struct rtc_plat_data *pdata = platform_get_drvdata(pdev);
 	struct rtc_plat_data *pdata = platform_get_drvdata(pdev);
 
 
 	sysfs_remove_bin_file(&pdev->dev.kobj, &ds1553_nvram_attr);
 	sysfs_remove_bin_file(&pdev->dev.kobj, &ds1553_nvram_attr);
-	rtc_device_unregister(pdata->rtc);
 	if (pdata->irq > 0)
 	if (pdata->irq > 0)
 		writeb(0, pdata->ioaddr + RTC_INTERRUPTS);
 		writeb(0, pdata->ioaddr + RTC_INTERRUPTS);
 	return 0;
 	return 0;

+ 1 - 7
drivers/rtc/rtc-ds1672.c

@@ -155,11 +155,6 @@ static const struct rtc_class_ops ds1672_rtc_ops = {
 
 
 static int ds1672_remove(struct i2c_client *client)
 static int ds1672_remove(struct i2c_client *client)
 {
 {
-	struct rtc_device *rtc = i2c_get_clientdata(client);
-
-	if (rtc)
-		rtc_device_unregister(rtc);
-
 	return 0;
 	return 0;
 }
 }
 
 
@@ -177,7 +172,7 @@ static int ds1672_probe(struct i2c_client *client,
 
 
 	dev_info(&client->dev, "chip found, driver version " DRV_VERSION "\n");
 	dev_info(&client->dev, "chip found, driver version " DRV_VERSION "\n");
 
 
-	rtc = rtc_device_register(ds1672_driver.driver.name, &client->dev,
+	rtc = devm_rtc_device_register(&client->dev, ds1672_driver.driver.name,
 				  &ds1672_rtc_ops, THIS_MODULE);
 				  &ds1672_rtc_ops, THIS_MODULE);
 
 
 	if (IS_ERR(rtc))
 	if (IS_ERR(rtc))
@@ -202,7 +197,6 @@ static int ds1672_probe(struct i2c_client *client,
 	return 0;
 	return 0;
 
 
  exit_devreg:
  exit_devreg:
-	rtc_device_unregister(rtc);
 	return err;
 	return err;
 }
 }
 
 

+ 2 - 6
drivers/rtc/rtc-ds1742.c

@@ -208,17 +208,14 @@ static int ds1742_rtc_probe(struct platform_device *pdev)
 
 
 	pdata->last_jiffies = jiffies;
 	pdata->last_jiffies = jiffies;
 	platform_set_drvdata(pdev, pdata);
 	platform_set_drvdata(pdev, pdata);
-	rtc = rtc_device_register(pdev->name, &pdev->dev,
+	rtc = devm_rtc_device_register(&pdev->dev, pdev->name,
 				  &ds1742_rtc_ops, THIS_MODULE);
 				  &ds1742_rtc_ops, THIS_MODULE);
 	if (IS_ERR(rtc))
 	if (IS_ERR(rtc))
 		return PTR_ERR(rtc);
 		return PTR_ERR(rtc);
 	pdata->rtc = rtc;
 	pdata->rtc = rtc;
 
 
 	ret = sysfs_create_bin_file(&pdev->dev.kobj, &pdata->nvram_attr);
 	ret = sysfs_create_bin_file(&pdev->dev.kobj, &pdata->nvram_attr);
-	if (ret) {
-		dev_err(&pdev->dev, "creating nvram file in sysfs failed\n");
-		rtc_device_unregister(rtc);
-	}
+
 	return ret;
 	return ret;
 }
 }
 
 
@@ -227,7 +224,6 @@ static int ds1742_rtc_remove(struct platform_device *pdev)
 	struct rtc_plat_data *pdata = platform_get_drvdata(pdev);
 	struct rtc_plat_data *pdata = platform_get_drvdata(pdev);
 
 
 	sysfs_remove_bin_file(&pdev->dev.kobj, &pdata->nvram_attr);
 	sysfs_remove_bin_file(&pdev->dev.kobj, &pdata->nvram_attr);
-	rtc_device_unregister(pdata->rtc);
 	return 0;
 	return 0;
 }
 }
 
 

+ 3 - 9
drivers/rtc/rtc-ds2404.c

@@ -228,7 +228,7 @@ static int rtc_probe(struct platform_device *pdev)
 	struct ds2404 *chip;
 	struct ds2404 *chip;
 	int retval = -EBUSY;
 	int retval = -EBUSY;
 
 
-	chip = kzalloc(sizeof(struct ds2404), GFP_KERNEL);
+	chip = devm_kzalloc(&pdev->dev, sizeof(struct ds2404), GFP_KERNEL);
 	if (!chip)
 	if (!chip)
 		return -ENOMEM;
 		return -ENOMEM;
 
 
@@ -244,8 +244,8 @@ static int rtc_probe(struct platform_device *pdev)
 
 
 	platform_set_drvdata(pdev, chip);
 	platform_set_drvdata(pdev, chip);
 
 
-	chip->rtc = rtc_device_register("ds2404",
-				&pdev->dev, &ds2404_rtc_ops, THIS_MODULE);
+	chip->rtc = devm_rtc_device_register(&pdev->dev, "ds2404",
+					&ds2404_rtc_ops, THIS_MODULE);
 	if (IS_ERR(chip->rtc)) {
 	if (IS_ERR(chip->rtc)) {
 		retval = PTR_ERR(chip->rtc);
 		retval = PTR_ERR(chip->rtc);
 		goto err_io;
 		goto err_io;
@@ -257,20 +257,14 @@ static int rtc_probe(struct platform_device *pdev)
 err_io:
 err_io:
 	chip->ops->unmap_io(chip);
 	chip->ops->unmap_io(chip);
 err_chip:
 err_chip:
-	kfree(chip);
 	return retval;
 	return retval;
 }
 }
 
 
 static int rtc_remove(struct platform_device *dev)
 static int rtc_remove(struct platform_device *dev)
 {
 {
 	struct ds2404 *chip = platform_get_drvdata(dev);
 	struct ds2404 *chip = platform_get_drvdata(dev);
-	struct rtc_device *rtc = chip->rtc;
-
-	if (rtc)
-		rtc_device_unregister(rtc);
 
 
 	chip->ops->unmap_io(chip);
 	chip->ops->unmap_io(chip);
-	kfree(chip);
 
 
 	return 0;
 	return 0;
 }
 }

+ 7 - 18
drivers/rtc/rtc-ds3232.c

@@ -397,7 +397,7 @@ static int ds3232_probe(struct i2c_client *client,
 	struct ds3232 *ds3232;
 	struct ds3232 *ds3232;
 	int ret;
 	int ret;
 
 
-	ds3232 = kzalloc(sizeof(struct ds3232), GFP_KERNEL);
+	ds3232 = devm_kzalloc(&client->dev, sizeof(struct ds3232), GFP_KERNEL);
 	if (!ds3232)
 	if (!ds3232)
 		return -ENOMEM;
 		return -ENOMEM;
 
 
@@ -409,34 +409,25 @@ static int ds3232_probe(struct i2c_client *client,
 
 
 	ret = ds3232_check_rtc_status(client);
 	ret = ds3232_check_rtc_status(client);
 	if (ret)
 	if (ret)
-		goto out_free;
+		return ret;
 
 
-	ds3232->rtc = rtc_device_register(client->name, &client->dev,
+	ds3232->rtc = devm_rtc_device_register(&client->dev, client->name,
 					  &ds3232_rtc_ops, THIS_MODULE);
 					  &ds3232_rtc_ops, THIS_MODULE);
 	if (IS_ERR(ds3232->rtc)) {
 	if (IS_ERR(ds3232->rtc)) {
-		ret = PTR_ERR(ds3232->rtc);
 		dev_err(&client->dev, "unable to register the class device\n");
 		dev_err(&client->dev, "unable to register the class device\n");
-		goto out_irq;
+		return PTR_ERR(ds3232->rtc);
 	}
 	}
 
 
 	if (client->irq >= 0) {
 	if (client->irq >= 0) {
-		ret = request_irq(client->irq, ds3232_irq, 0,
+		ret = devm_request_irq(&client->dev, client->irq, ds3232_irq, 0,
 				 "ds3232", client);
 				 "ds3232", client);
 		if (ret) {
 		if (ret) {
 			dev_err(&client->dev, "unable to request IRQ\n");
 			dev_err(&client->dev, "unable to request IRQ\n");
-			goto out_free;
+			return ret;
 		}
 		}
 	}
 	}
 
 
 	return 0;
 	return 0;
-
-out_irq:
-	if (client->irq >= 0)
-		free_irq(client->irq, client);
-
-out_free:
-	kfree(ds3232);
-	return ret;
 }
 }
 
 
 static int ds3232_remove(struct i2c_client *client)
 static int ds3232_remove(struct i2c_client *client)
@@ -448,12 +439,10 @@ static int ds3232_remove(struct i2c_client *client)
 		ds3232->exiting = 1;
 		ds3232->exiting = 1;
 		mutex_unlock(&ds3232->mutex);
 		mutex_unlock(&ds3232->mutex);
 
 
-		free_irq(client->irq, client);
+		devm_free_irq(&client->dev, client->irq, client);
 		cancel_work_sync(&ds3232->work);
 		cancel_work_sync(&ds3232->work);
 	}
 	}
 
 
-	rtc_device_unregister(ds3232->rtc);
-	kfree(ds3232);
 	return 0;
 	return 0;
 }
 }
 
 

+ 3 - 6
drivers/rtc/rtc-ds3234.c

@@ -146,21 +146,18 @@ static int ds3234_probe(struct spi_device *spi)
 	ds3234_get_reg(&spi->dev, DS3234_REG_CONT_STAT, &tmp);
 	ds3234_get_reg(&spi->dev, DS3234_REG_CONT_STAT, &tmp);
 	dev_info(&spi->dev, "Ctrl/Stat Reg: 0x%02x\n", tmp);
 	dev_info(&spi->dev, "Ctrl/Stat Reg: 0x%02x\n", tmp);
 
 
-	rtc = rtc_device_register("ds3234",
-				&spi->dev, &ds3234_rtc_ops, THIS_MODULE);
+	rtc = devm_rtc_device_register(&spi->dev, "ds3234",
+				&ds3234_rtc_ops, THIS_MODULE);
 	if (IS_ERR(rtc))
 	if (IS_ERR(rtc))
 		return PTR_ERR(rtc);
 		return PTR_ERR(rtc);
 
 
-	dev_set_drvdata(&spi->dev, rtc);
+	spi_set_drvdata(spi, rtc);
 
 
 	return 0;
 	return 0;
 }
 }
 
 
 static int ds3234_remove(struct spi_device *spi)
 static int ds3234_remove(struct spi_device *spi)
 {
 {
-	struct rtc_device *rtc = spi_get_drvdata(spi);
-
-	rtc_device_unregister(rtc);
 	return 0;
 	return 0;
 }
 }
 
 

+ 2 - 17
drivers/rtc/rtc-efi.c

@@ -191,7 +191,7 @@ static int __init efi_rtc_probe(struct platform_device *dev)
 {
 {
 	struct rtc_device *rtc;
 	struct rtc_device *rtc;
 
 
-	rtc = rtc_device_register("rtc-efi", &dev->dev, &efi_rtc_ops,
+	rtc = devm_rtc_device_register(&dev->dev, "rtc-efi", &efi_rtc_ops,
 					THIS_MODULE);
 					THIS_MODULE);
 	if (IS_ERR(rtc))
 	if (IS_ERR(rtc))
 		return PTR_ERR(rtc);
 		return PTR_ERR(rtc);
@@ -203,10 +203,6 @@ static int __init efi_rtc_probe(struct platform_device *dev)
 
 
 static int __exit efi_rtc_remove(struct platform_device *dev)
 static int __exit efi_rtc_remove(struct platform_device *dev)
 {
 {
-	struct rtc_device *rtc = platform_get_drvdata(dev);
-
-	rtc_device_unregister(rtc);
-
 	return 0;
 	return 0;
 }
 }
 
 
@@ -218,18 +214,7 @@ static struct platform_driver efi_rtc_driver = {
 	.remove = __exit_p(efi_rtc_remove),
 	.remove = __exit_p(efi_rtc_remove),
 };
 };
 
 
-static int __init efi_rtc_init(void)
-{
-	return platform_driver_probe(&efi_rtc_driver, efi_rtc_probe);
-}
-
-static void __exit efi_rtc_exit(void)
-{
-	platform_driver_unregister(&efi_rtc_driver);
-}
-
-module_init(efi_rtc_init);
-module_exit(efi_rtc_exit);
+module_platform_driver_probe(efi_rtc_driver, efi_rtc_probe);
 
 
 MODULE_AUTHOR("dann frazier <dannf@hp.com>");
 MODULE_AUTHOR("dann frazier <dannf@hp.com>");
 MODULE_LICENSE("GPL");
 MODULE_LICENSE("GPL");

+ 1 - 6
drivers/rtc/rtc-em3027.c

@@ -121,7 +121,7 @@ static int em3027_probe(struct i2c_client *client,
 	if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C))
 	if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C))
 		return -ENODEV;
 		return -ENODEV;
 
 
-	rtc = rtc_device_register(em3027_driver.driver.name, &client->dev,
+	rtc = devm_rtc_device_register(&client->dev, em3027_driver.driver.name,
 				  &em3027_rtc_ops, THIS_MODULE);
 				  &em3027_rtc_ops, THIS_MODULE);
 	if (IS_ERR(rtc))
 	if (IS_ERR(rtc))
 		return PTR_ERR(rtc);
 		return PTR_ERR(rtc);
@@ -133,11 +133,6 @@ static int em3027_probe(struct i2c_client *client,
 
 
 static int em3027_remove(struct i2c_client *client)
 static int em3027_remove(struct i2c_client *client)
 {
 {
-	struct rtc_device *rtc = i2c_get_clientdata(client);
-
-	if (rtc)
-		rtc_device_unregister(rtc);
-
 	return 0;
 	return 0;
 }
 }
 
 

+ 3 - 8
drivers/rtc/rtc-ep93xx.c

@@ -153,8 +153,8 @@ static int ep93xx_rtc_probe(struct platform_device *pdev)
 	pdev->dev.platform_data = ep93xx_rtc;
 	pdev->dev.platform_data = ep93xx_rtc;
 	platform_set_drvdata(pdev, ep93xx_rtc);
 	platform_set_drvdata(pdev, ep93xx_rtc);
 
 
-	ep93xx_rtc->rtc = rtc_device_register(pdev->name,
-				&pdev->dev, &ep93xx_rtc_ops, THIS_MODULE);
+	ep93xx_rtc->rtc = devm_rtc_device_register(&pdev->dev,
+				pdev->name, &ep93xx_rtc_ops, THIS_MODULE);
 	if (IS_ERR(ep93xx_rtc->rtc)) {
 	if (IS_ERR(ep93xx_rtc->rtc)) {
 		err = PTR_ERR(ep93xx_rtc->rtc);
 		err = PTR_ERR(ep93xx_rtc->rtc);
 		goto exit;
 		goto exit;
@@ -162,12 +162,10 @@ static int ep93xx_rtc_probe(struct platform_device *pdev)
 
 
 	err = sysfs_create_group(&pdev->dev.kobj, &ep93xx_rtc_sysfs_files);
 	err = sysfs_create_group(&pdev->dev.kobj, &ep93xx_rtc_sysfs_files);
 	if (err)
 	if (err)
-		goto fail;
+		goto exit;
 
 
 	return 0;
 	return 0;
 
 
-fail:
-	rtc_device_unregister(ep93xx_rtc->rtc);
 exit:
 exit:
 	platform_set_drvdata(pdev, NULL);
 	platform_set_drvdata(pdev, NULL);
 	pdev->dev.platform_data = NULL;
 	pdev->dev.platform_data = NULL;
@@ -176,11 +174,8 @@ exit:
 
 
 static int ep93xx_rtc_remove(struct platform_device *pdev)
 static int ep93xx_rtc_remove(struct platform_device *pdev)
 {
 {
-	struct ep93xx_rtc *ep93xx_rtc = platform_get_drvdata(pdev);
-
 	sysfs_remove_group(&pdev->dev.kobj, &ep93xx_rtc_sysfs_files);
 	sysfs_remove_group(&pdev->dev.kobj, &ep93xx_rtc_sysfs_files);
 	platform_set_drvdata(pdev, NULL);
 	platform_set_drvdata(pdev, NULL);
-	rtc_device_unregister(ep93xx_rtc->rtc);
 	pdev->dev.platform_data = NULL;
 	pdev->dev.platform_data = NULL;
 
 
 	return 0;
 	return 0;

+ 3 - 8
drivers/rtc/rtc-fm3130.c

@@ -358,7 +358,7 @@ static int fm3130_probe(struct i2c_client *client,
 			I2C_FUNC_I2C | I2C_FUNC_SMBUS_WRITE_BYTE_DATA))
 			I2C_FUNC_I2C | I2C_FUNC_SMBUS_WRITE_BYTE_DATA))
 		return -EIO;
 		return -EIO;
 
 
-	fm3130 = kzalloc(sizeof(struct fm3130), GFP_KERNEL);
+	fm3130 = devm_kzalloc(&client->dev, sizeof(struct fm3130), GFP_KERNEL);
 
 
 	if (!fm3130)
 	if (!fm3130)
 		return -ENOMEM;
 		return -ENOMEM;
@@ -395,7 +395,7 @@ static int fm3130_probe(struct i2c_client *client,
 
 
 	tmp = i2c_transfer(adapter, fm3130->msg, 4);
 	tmp = i2c_transfer(adapter, fm3130->msg, 4);
 	if (tmp != 4) {
 	if (tmp != 4) {
-		pr_debug("read error %d\n", tmp);
+		dev_dbg(&client->dev, "read error %d\n", tmp);
 		err = -EIO;
 		err = -EIO;
 		goto exit_free;
 		goto exit_free;
 	}
 	}
@@ -507,7 +507,7 @@ bad_clock:
 
 
 	/* We won't bail out here because we just got invalid data.
 	/* We won't bail out here because we just got invalid data.
 	   Time setting from u-boot doesn't work anyway */
 	   Time setting from u-boot doesn't work anyway */
-	fm3130->rtc = rtc_device_register(client->name, &client->dev,
+	fm3130->rtc = devm_rtc_device_register(&client->dev, client->name,
 				&fm3130_rtc_ops, THIS_MODULE);
 				&fm3130_rtc_ops, THIS_MODULE);
 	if (IS_ERR(fm3130->rtc)) {
 	if (IS_ERR(fm3130->rtc)) {
 		err = PTR_ERR(fm3130->rtc);
 		err = PTR_ERR(fm3130->rtc);
@@ -517,16 +517,11 @@ bad_clock:
 	}
 	}
 	return 0;
 	return 0;
 exit_free:
 exit_free:
-	kfree(fm3130);
 	return err;
 	return err;
 }
 }
 
 
 static int fm3130_remove(struct i2c_client *client)
 static int fm3130_remove(struct i2c_client *client)
 {
 {
-	struct fm3130 *fm3130 = i2c_get_clientdata(client);
-
-	rtc_device_unregister(fm3130->rtc);
-	kfree(fm3130);
 	return 0;
 	return 0;
 }
 }
 
 

+ 3 - 18
drivers/rtc/rtc-generic.c

@@ -38,8 +38,8 @@ static int __init generic_rtc_probe(struct platform_device *dev)
 {
 {
 	struct rtc_device *rtc;
 	struct rtc_device *rtc;
 
 
-	rtc = rtc_device_register("rtc-generic", &dev->dev, &generic_rtc_ops,
-				  THIS_MODULE);
+	rtc = devm_rtc_device_register(&dev->dev, "rtc-generic",
+					&generic_rtc_ops, THIS_MODULE);
 	if (IS_ERR(rtc))
 	if (IS_ERR(rtc))
 		return PTR_ERR(rtc);
 		return PTR_ERR(rtc);
 
 
@@ -50,10 +50,6 @@ static int __init generic_rtc_probe(struct platform_device *dev)
 
 
 static int __exit generic_rtc_remove(struct platform_device *dev)
 static int __exit generic_rtc_remove(struct platform_device *dev)
 {
 {
-	struct rtc_device *rtc = platform_get_drvdata(dev);
-
-	rtc_device_unregister(rtc);
-
 	return 0;
 	return 0;
 }
 }
 
 
@@ -65,18 +61,7 @@ static struct platform_driver generic_rtc_driver = {
 	.remove = __exit_p(generic_rtc_remove),
 	.remove = __exit_p(generic_rtc_remove),
 };
 };
 
 
-static int __init generic_rtc_init(void)
-{
-	return platform_driver_probe(&generic_rtc_driver, generic_rtc_probe);
-}
-
-static void __exit generic_rtc_fini(void)
-{
-	platform_driver_unregister(&generic_rtc_driver);
-}
-
-module_init(generic_rtc_init);
-module_exit(generic_rtc_fini);
+module_platform_driver_probe(generic_rtc_driver, generic_rtc_probe);
 
 
 MODULE_AUTHOR("Kyle McMartin <kyle@mcmartin.ca>");
 MODULE_AUTHOR("Kyle McMartin <kyle@mcmartin.ca>");
 MODULE_LICENSE("GPL");
 MODULE_LICENSE("GPL");

+ 3 - 4
drivers/rtc/rtc-hid-sensor-time.c

@@ -255,8 +255,9 @@ static int hid_time_probe(struct platform_device *pdev)
 		return ret;
 		return ret;
 	}
 	}
 
 
-	time_state->rtc = rtc_device_register("hid-sensor-time",
-				&pdev->dev, &hid_time_rtc_ops, THIS_MODULE);
+	time_state->rtc = devm_rtc_device_register(&pdev->dev,
+					"hid-sensor-time", &hid_time_rtc_ops,
+					THIS_MODULE);
 
 
 	if (IS_ERR(time_state->rtc)) {
 	if (IS_ERR(time_state->rtc)) {
 		dev_err(&pdev->dev, "rtc device register failed!\n");
 		dev_err(&pdev->dev, "rtc device register failed!\n");
@@ -269,9 +270,7 @@ static int hid_time_probe(struct platform_device *pdev)
 static int hid_time_remove(struct platform_device *pdev)
 static int hid_time_remove(struct platform_device *pdev)
 {
 {
 	struct hid_sensor_hub_device *hsdev = pdev->dev.platform_data;
 	struct hid_sensor_hub_device *hsdev = pdev->dev.platform_data;
-	struct hid_time_state *time_state = platform_get_drvdata(pdev);
 
 
-	rtc_device_unregister(time_state->rtc);
 	sensor_hub_remove_callback(hsdev, HID_USAGE_SENSOR_TIME);
 	sensor_hub_remove_callback(hsdev, HID_USAGE_SENSOR_TIME);
 
 
 	return 0;
 	return 0;

+ 5 - 18
drivers/rtc/rtc-imxdi.c

@@ -369,7 +369,7 @@ static void dryice_work(struct work_struct *work)
 /*
 /*
  * probe for dryice rtc device
  * probe for dryice rtc device
  */
  */
-static int dryice_rtc_probe(struct platform_device *pdev)
+static int __init dryice_rtc_probe(struct platform_device *pdev)
 {
 {
 	struct resource *res;
 	struct resource *res;
 	struct imxdi_dev *imxdi;
 	struct imxdi_dev *imxdi;
@@ -464,7 +464,7 @@ static int dryice_rtc_probe(struct platform_device *pdev)
 	}
 	}
 
 
 	platform_set_drvdata(pdev, imxdi);
 	platform_set_drvdata(pdev, imxdi);
-	imxdi->rtc = rtc_device_register(pdev->name, &pdev->dev,
+	imxdi->rtc = devm_rtc_device_register(&pdev->dev, pdev->name,
 				  &dryice_rtc_ops, THIS_MODULE);
 				  &dryice_rtc_ops, THIS_MODULE);
 	if (IS_ERR(imxdi->rtc)) {
 	if (IS_ERR(imxdi->rtc)) {
 		rc = PTR_ERR(imxdi->rtc);
 		rc = PTR_ERR(imxdi->rtc);
@@ -479,7 +479,7 @@ err:
 	return rc;
 	return rc;
 }
 }
 
 
-static int dryice_rtc_remove(struct platform_device *pdev)
+static int __exit dryice_rtc_remove(struct platform_device *pdev)
 {
 {
 	struct imxdi_dev *imxdi = platform_get_drvdata(pdev);
 	struct imxdi_dev *imxdi = platform_get_drvdata(pdev);
 
 
@@ -488,8 +488,6 @@ static int dryice_rtc_remove(struct platform_device *pdev)
 	/* mask all interrupts */
 	/* mask all interrupts */
 	__raw_writel(0, imxdi->ioaddr + DIER);
 	__raw_writel(0, imxdi->ioaddr + DIER);
 
 
-	rtc_device_unregister(imxdi->rtc);
-
 	clk_disable_unprepare(imxdi->clk);
 	clk_disable_unprepare(imxdi->clk);
 
 
 	return 0;
 	return 0;
@@ -510,21 +508,10 @@ static struct platform_driver dryice_rtc_driver = {
 		   .owner = THIS_MODULE,
 		   .owner = THIS_MODULE,
 		   .of_match_table = of_match_ptr(dryice_dt_ids),
 		   .of_match_table = of_match_ptr(dryice_dt_ids),
 		   },
 		   },
-	.remove = dryice_rtc_remove,
+	.remove = __exit_p(dryice_rtc_remove),
 };
 };
 
 
-static int __init dryice_rtc_init(void)
-{
-	return platform_driver_probe(&dryice_rtc_driver, dryice_rtc_probe);
-}
-
-static void __exit dryice_rtc_exit(void)
-{
-	platform_driver_unregister(&dryice_rtc_driver);
-}
-
-module_init(dryice_rtc_init);
-module_exit(dryice_rtc_exit);
+module_platform_driver_probe(dryice_rtc_driver, dryice_rtc_probe);
 
 
 MODULE_AUTHOR("Freescale Semiconductor, Inc.");
 MODULE_AUTHOR("Freescale Semiconductor, Inc.");
 MODULE_AUTHOR("Baruch Siach <baruch@tkos.co.il>");
 MODULE_AUTHOR("Baruch Siach <baruch@tkos.co.il>");

+ 7 - 23
drivers/rtc/rtc-isl12022.c

@@ -252,12 +252,11 @@ static int isl12022_probe(struct i2c_client *client,
 {
 {
 	struct isl12022 *isl12022;
 	struct isl12022 *isl12022;
 
 
-	int ret = 0;
-
 	if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C))
 	if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C))
 		return -ENODEV;
 		return -ENODEV;
 
 
-	isl12022 = kzalloc(sizeof(struct isl12022), GFP_KERNEL);
+	isl12022 = devm_kzalloc(&client->dev, sizeof(struct isl12022),
+				GFP_KERNEL);
 	if (!isl12022)
 	if (!isl12022)
 		return -ENOMEM;
 		return -ENOMEM;
 
 
@@ -265,37 +264,22 @@ static int isl12022_probe(struct i2c_client *client,
 
 
 	i2c_set_clientdata(client, isl12022);
 	i2c_set_clientdata(client, isl12022);
 
 
-	isl12022->rtc = rtc_device_register(isl12022_driver.driver.name,
-					    &client->dev,
-					    &isl12022_rtc_ops,
-					    THIS_MODULE);
-
-	if (IS_ERR(isl12022->rtc)) {
-		ret = PTR_ERR(isl12022->rtc);
-		goto exit_kfree;
-	}
+	isl12022->rtc = devm_rtc_device_register(&client->dev,
+					isl12022_driver.driver.name,
+					&isl12022_rtc_ops, THIS_MODULE);
+	if (IS_ERR(isl12022->rtc))
+		return PTR_ERR(isl12022->rtc);
 
 
 	return 0;
 	return 0;
-
-exit_kfree:
-	kfree(isl12022);
-
-	return ret;
 }
 }
 
 
 static int isl12022_remove(struct i2c_client *client)
 static int isl12022_remove(struct i2c_client *client)
 {
 {
-	struct isl12022 *isl12022 = i2c_get_clientdata(client);
-
-	rtc_device_unregister(isl12022->rtc);
-	kfree(isl12022);
-
 	return 0;
 	return 0;
 }
 }
 
 
 static const struct i2c_device_id isl12022_id[] = {
 static const struct i2c_device_id isl12022_id[] = {
 	{ "isl12022", 0 },
 	{ "isl12022", 0 },
-	{ "rtc8564", 0 },
 	{ }
 	{ }
 };
 };
 MODULE_DEVICE_TABLE(i2c, isl12022_id);
 MODULE_DEVICE_TABLE(i2c, isl12022_id);

+ 1 - 4
drivers/rtc/rtc-lp8788.c

@@ -299,7 +299,7 @@ static int lp8788_rtc_probe(struct platform_device *pdev)
 
 
 	device_init_wakeup(dev, 1);
 	device_init_wakeup(dev, 1);
 
 
-	rtc->rdev = rtc_device_register("lp8788_rtc", dev,
+	rtc->rdev = devm_rtc_device_register(dev, "lp8788_rtc",
 					&lp8788_rtc_ops, THIS_MODULE);
 					&lp8788_rtc_ops, THIS_MODULE);
 	if (IS_ERR(rtc->rdev)) {
 	if (IS_ERR(rtc->rdev)) {
 		dev_err(dev, "can not register rtc device\n");
 		dev_err(dev, "can not register rtc device\n");
@@ -314,9 +314,6 @@ static int lp8788_rtc_probe(struct platform_device *pdev)
 
 
 static int lp8788_rtc_remove(struct platform_device *pdev)
 static int lp8788_rtc_remove(struct platform_device *pdev)
 {
 {
-	struct lp8788_rtc *rtc = platform_get_drvdata(pdev);
-
-	rtc_device_unregister(rtc->rdev);
 	platform_set_drvdata(pdev, NULL);
 	platform_set_drvdata(pdev, NULL);
 
 
 	return 0;
 	return 0;

+ 2 - 3
drivers/rtc/rtc-lpc32xx.c

@@ -273,8 +273,8 @@ static int lpc32xx_rtc_probe(struct platform_device *pdev)
 
 
 	platform_set_drvdata(pdev, rtc);
 	platform_set_drvdata(pdev, rtc);
 
 
-	rtc->rtc = rtc_device_register(RTC_NAME, &pdev->dev, &lpc32xx_rtc_ops,
-		THIS_MODULE);
+	rtc->rtc = devm_rtc_device_register(&pdev->dev, RTC_NAME,
+					&lpc32xx_rtc_ops, THIS_MODULE);
 	if (IS_ERR(rtc->rtc)) {
 	if (IS_ERR(rtc->rtc)) {
 		dev_err(&pdev->dev, "Can't get RTC\n");
 		dev_err(&pdev->dev, "Can't get RTC\n");
 		platform_set_drvdata(pdev, NULL);
 		platform_set_drvdata(pdev, NULL);
@@ -307,7 +307,6 @@ static int lpc32xx_rtc_remove(struct platform_device *pdev)
 		device_init_wakeup(&pdev->dev, 0);
 		device_init_wakeup(&pdev->dev, 0);
 
 
 	platform_set_drvdata(pdev, NULL);
 	platform_set_drvdata(pdev, NULL);
-	rtc_device_unregister(rtc->rtc);
 
 
 	return 0;
 	return 0;
 }
 }

+ 1 - 4
drivers/rtc/rtc-ls1x.c

@@ -172,7 +172,7 @@ static int ls1x_rtc_probe(struct platform_device *pdev)
 	while (readl(SYS_COUNTER_CNTRL) & SYS_CNTRL_TTS)
 	while (readl(SYS_COUNTER_CNTRL) & SYS_CNTRL_TTS)
 		usleep_range(1000, 3000);
 		usleep_range(1000, 3000);
 
 
-	rtcdev = rtc_device_register("ls1x-rtc", &pdev->dev,
+	rtcdev = devm_rtc_device_register(&pdev->dev, "ls1x-rtc",
 					&ls1x_rtc_ops , THIS_MODULE);
 					&ls1x_rtc_ops , THIS_MODULE);
 	if (IS_ERR(rtcdev)) {
 	if (IS_ERR(rtcdev)) {
 		ret = PTR_ERR(rtcdev);
 		ret = PTR_ERR(rtcdev);
@@ -187,9 +187,6 @@ err:
 
 
 static int ls1x_rtc_remove(struct platform_device *pdev)
 static int ls1x_rtc_remove(struct platform_device *pdev)
 {
 {
-	struct rtc_device *rtcdev = platform_get_drvdata(pdev);
-
-	rtc_device_unregister(rtcdev);
 	platform_set_drvdata(pdev, NULL);
 	platform_set_drvdata(pdev, NULL);
 
 
 	return 0;
 	return 0;

+ 5 - 11
drivers/rtc/rtc-m41t80.c

@@ -637,7 +637,8 @@ static int m41t80_probe(struct i2c_client *client,
 	dev_info(&client->dev,
 	dev_info(&client->dev,
 		 "chip found, driver version " DRV_VERSION "\n");
 		 "chip found, driver version " DRV_VERSION "\n");
 
 
-	clientdata = kzalloc(sizeof(*clientdata), GFP_KERNEL);
+	clientdata = devm_kzalloc(&client->dev, sizeof(*clientdata),
+				GFP_KERNEL);
 	if (!clientdata) {
 	if (!clientdata) {
 		rc = -ENOMEM;
 		rc = -ENOMEM;
 		goto exit;
 		goto exit;
@@ -646,8 +647,8 @@ static int m41t80_probe(struct i2c_client *client,
 	clientdata->features = id->driver_data;
 	clientdata->features = id->driver_data;
 	i2c_set_clientdata(client, clientdata);
 	i2c_set_clientdata(client, clientdata);
 
 
-	rtc = rtc_device_register(client->name, &client->dev,
-				  &m41t80_rtc_ops, THIS_MODULE);
+	rtc = devm_rtc_device_register(&client->dev, client->name,
+					&m41t80_rtc_ops, THIS_MODULE);
 	if (IS_ERR(rtc)) {
 	if (IS_ERR(rtc)) {
 		rc = PTR_ERR(rtc);
 		rc = PTR_ERR(rtc);
 		rtc = NULL;
 		rtc = NULL;
@@ -718,26 +719,19 @@ ht_err:
 	goto exit;
 	goto exit;
 
 
 exit:
 exit:
-	if (rtc)
-		rtc_device_unregister(rtc);
-	kfree(clientdata);
 	return rc;
 	return rc;
 }
 }
 
 
 static int m41t80_remove(struct i2c_client *client)
 static int m41t80_remove(struct i2c_client *client)
 {
 {
+#ifdef CONFIG_RTC_DRV_M41T80_WDT
 	struct m41t80_data *clientdata = i2c_get_clientdata(client);
 	struct m41t80_data *clientdata = i2c_get_clientdata(client);
-	struct rtc_device *rtc = clientdata->rtc;
 
 
-#ifdef CONFIG_RTC_DRV_M41T80_WDT
 	if (clientdata->features & M41T80_FEATURE_HT) {
 	if (clientdata->features & M41T80_FEATURE_HT) {
 		misc_deregister(&wdt_dev);
 		misc_deregister(&wdt_dev);
 		unregister_reboot_notifier(&wdt_notifier);
 		unregister_reboot_notifier(&wdt_notifier);
 	}
 	}
 #endif
 #endif
-	if (rtc)
-		rtc_device_unregister(rtc);
-	kfree(clientdata);
 
 
 	return 0;
 	return 0;
 }
 }

+ 3 - 8
drivers/rtc/rtc-m41t93.c

@@ -184,12 +184,12 @@ static int m41t93_probe(struct spi_device *spi)
 		return -ENODEV;
 		return -ENODEV;
 	}
 	}
 
 
-	rtc = rtc_device_register(m41t93_driver.driver.name,
-		&spi->dev, &m41t93_rtc_ops, THIS_MODULE);
+	rtc = devm_rtc_device_register(&spi->dev, m41t93_driver.driver.name,
+					&m41t93_rtc_ops, THIS_MODULE);
 	if (IS_ERR(rtc))
 	if (IS_ERR(rtc))
 		return PTR_ERR(rtc);
 		return PTR_ERR(rtc);
 
 
-	dev_set_drvdata(&spi->dev, rtc);
+	spi_set_drvdata(spi, rtc);
 
 
 	return 0;
 	return 0;
 }
 }
@@ -197,11 +197,6 @@ static int m41t93_probe(struct spi_device *spi)
 
 
 static int m41t93_remove(struct spi_device *spi)
 static int m41t93_remove(struct spi_device *spi)
 {
 {
-	struct rtc_device *rtc = spi_get_drvdata(spi);
-
-	if (rtc)
-		rtc_device_unregister(rtc);
-
 	return 0;
 	return 0;
 }
 }
 
 

+ 3 - 8
drivers/rtc/rtc-m41t94.c

@@ -124,23 +124,18 @@ static int m41t94_probe(struct spi_device *spi)
 		return res;
 		return res;
 	}
 	}
 
 
-	rtc = rtc_device_register(m41t94_driver.driver.name,
-		&spi->dev, &m41t94_rtc_ops, THIS_MODULE);
+	rtc = devm_rtc_device_register(&spi->dev, m41t94_driver.driver.name,
+					&m41t94_rtc_ops, THIS_MODULE);
 	if (IS_ERR(rtc))
 	if (IS_ERR(rtc))
 		return PTR_ERR(rtc);
 		return PTR_ERR(rtc);
 
 
-	dev_set_drvdata(&spi->dev, rtc);
+	spi_set_drvdata(spi, rtc);
 
 
 	return 0;
 	return 0;
 }
 }
 
 
 static int m41t94_remove(struct spi_device *spi)
 static int m41t94_remove(struct spi_device *spi)
 {
 {
-	struct rtc_device *rtc = spi_get_drvdata(spi);
-
-	if (rtc)
-		rtc_device_unregister(rtc);
-
 	return 0;
 	return 0;
 }
 }
 
 

+ 10 - 32
drivers/rtc/rtc-m48t35.c

@@ -145,12 +145,11 @@ static int m48t35_probe(struct platform_device *pdev)
 {
 {
 	struct resource *res;
 	struct resource *res;
 	struct m48t35_priv *priv;
 	struct m48t35_priv *priv;
-	int ret = 0;
 
 
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 	if (!res)
 	if (!res)
 		return -ENODEV;
 		return -ENODEV;
-	priv = kzalloc(sizeof(struct m48t35_priv), GFP_KERNEL);
+	priv = devm_kzalloc(&pdev->dev, sizeof(struct m48t35_priv), GFP_KERNEL);
 	if (!priv)
 	if (!priv)
 		return -ENOMEM;
 		return -ENOMEM;
 
 
@@ -160,50 +159,29 @@ static int m48t35_probe(struct platform_device *pdev)
 	 * conflicts are resolved
 	 * conflicts are resolved
 	 */
 	 */
 #ifndef CONFIG_SGI_IP27
 #ifndef CONFIG_SGI_IP27
-	if (!request_mem_region(res->start, priv->size, pdev->name)) {
-		ret = -EBUSY;
-		goto out;
-	}
+	if (!devm_request_mem_region(&pdev->dev, res->start, priv->size,
+				     pdev->name))
+		return -EBUSY;
 #endif
 #endif
 	priv->baseaddr = res->start;
 	priv->baseaddr = res->start;
-	priv->reg = ioremap(priv->baseaddr, priv->size);
-	if (!priv->reg) {
-		ret = -ENOMEM;
-		goto out;
-	}
+	priv->reg = devm_ioremap(&pdev->dev, priv->baseaddr, priv->size);
+	if (!priv->reg)
+		return -ENOMEM;
 
 
 	spin_lock_init(&priv->lock);
 	spin_lock_init(&priv->lock);
 
 
 	platform_set_drvdata(pdev, priv);
 	platform_set_drvdata(pdev, priv);
 
 
-	priv->rtc = rtc_device_register("m48t35", &pdev->dev,
+	priv->rtc = devm_rtc_device_register(&pdev->dev, "m48t35",
 				  &m48t35_ops, THIS_MODULE);
 				  &m48t35_ops, THIS_MODULE);
-	if (IS_ERR(priv->rtc)) {
-		ret = PTR_ERR(priv->rtc);
-		goto out;
-	}
+	if (IS_ERR(priv->rtc))
+		return PTR_ERR(priv->rtc);
 
 
 	return 0;
 	return 0;
-
-out:
-	if (priv->reg)
-		iounmap(priv->reg);
-	if (priv->baseaddr)
-		release_mem_region(priv->baseaddr, priv->size);
-	kfree(priv);
-	return ret;
 }
 }
 
 
 static int m48t35_remove(struct platform_device *pdev)
 static int m48t35_remove(struct platform_device *pdev)
 {
 {
-	struct m48t35_priv *priv = platform_get_drvdata(pdev);
-
-	rtc_device_unregister(priv->rtc);
-	iounmap(priv->reg);
-#ifndef CONFIG_SGI_IP27
-	release_mem_region(priv->baseaddr, priv->size);
-#endif
-	kfree(priv);
 	return 0;
 	return 0;
 }
 }
 
 

+ 4 - 7
drivers/rtc/rtc-m48t86.c

@@ -148,8 +148,10 @@ static int m48t86_rtc_probe(struct platform_device *dev)
 {
 {
 	unsigned char reg;
 	unsigned char reg;
 	struct m48t86_ops *ops = dev->dev.platform_data;
 	struct m48t86_ops *ops = dev->dev.platform_data;
-	struct rtc_device *rtc = rtc_device_register("m48t86",
-				&dev->dev, &m48t86_rtc_ops, THIS_MODULE);
+	struct rtc_device *rtc;
+
+	rtc = devm_rtc_device_register(&dev->dev, "m48t86",
+				&m48t86_rtc_ops, THIS_MODULE);
 
 
 	if (IS_ERR(rtc))
 	if (IS_ERR(rtc))
 		return PTR_ERR(rtc);
 		return PTR_ERR(rtc);
@@ -166,11 +168,6 @@ static int m48t86_rtc_probe(struct platform_device *dev)
 
 
 static int m48t86_rtc_remove(struct platform_device *dev)
 static int m48t86_rtc_remove(struct platform_device *dev)
 {
 {
-	struct rtc_device *rtc = platform_get_drvdata(dev);
-
- 	if (rtc)
-		rtc_device_unregister(rtc);
-
 	platform_set_drvdata(dev, NULL);
 	platform_set_drvdata(dev, NULL);
 
 
 	return 0;
 	return 0;

+ 2 - 7
drivers/rtc/rtc-max6900.c

@@ -214,11 +214,6 @@ static int max6900_rtc_set_time(struct device *dev, struct rtc_time *tm)
 
 
 static int max6900_remove(struct i2c_client *client)
 static int max6900_remove(struct i2c_client *client)
 {
 {
-	struct rtc_device *rtc = i2c_get_clientdata(client);
-
-	if (rtc)
-		rtc_device_unregister(rtc);
-
 	return 0;
 	return 0;
 }
 }
 
 
@@ -237,8 +232,8 @@ max6900_probe(struct i2c_client *client, const struct i2c_device_id *id)
 
 
 	dev_info(&client->dev, "chip found, driver version " DRV_VERSION "\n");
 	dev_info(&client->dev, "chip found, driver version " DRV_VERSION "\n");
 
 
-	rtc = rtc_device_register(max6900_driver.driver.name,
-				  &client->dev, &max6900_rtc_ops, THIS_MODULE);
+	rtc = devm_rtc_device_register(&client->dev, max6900_driver.driver.name,
+					&max6900_rtc_ops, THIS_MODULE);
 	if (IS_ERR(rtc))
 	if (IS_ERR(rtc))
 		return PTR_ERR(rtc);
 		return PTR_ERR(rtc);
 
 

+ 13 - 16
drivers/rtc/rtc-max6902.c

@@ -93,24 +93,24 @@ static int max6902_set_time(struct device *dev, struct rtc_time *dt)
 	dt->tm_year = dt->tm_year + 1900;
 	dt->tm_year = dt->tm_year + 1900;
 
 
 	/* Remove write protection */
 	/* Remove write protection */
-	max6902_set_reg(dev, 0xF, 0);
+	max6902_set_reg(dev, MAX6902_REG_CONTROL, 0);
 
 
-	max6902_set_reg(dev, 0x01, bin2bcd(dt->tm_sec));
-	max6902_set_reg(dev, 0x03, bin2bcd(dt->tm_min));
-	max6902_set_reg(dev, 0x05, bin2bcd(dt->tm_hour));
+	max6902_set_reg(dev, MAX6902_REG_SECONDS, bin2bcd(dt->tm_sec));
+	max6902_set_reg(dev, MAX6902_REG_MINUTES, bin2bcd(dt->tm_min));
+	max6902_set_reg(dev, MAX6902_REG_HOURS, bin2bcd(dt->tm_hour));
 
 
-	max6902_set_reg(dev, 0x07, bin2bcd(dt->tm_mday));
-	max6902_set_reg(dev, 0x09, bin2bcd(dt->tm_mon + 1));
-	max6902_set_reg(dev, 0x0B, bin2bcd(dt->tm_wday));
-	max6902_set_reg(dev, 0x0D, bin2bcd(dt->tm_year % 100));
-	max6902_set_reg(dev, 0x13, bin2bcd(dt->tm_year / 100));
+	max6902_set_reg(dev, MAX6902_REG_DATE, bin2bcd(dt->tm_mday));
+	max6902_set_reg(dev, MAX6902_REG_MONTH, bin2bcd(dt->tm_mon + 1));
+	max6902_set_reg(dev, MAX6902_REG_DAY, bin2bcd(dt->tm_wday));
+	max6902_set_reg(dev, MAX6902_REG_YEAR, bin2bcd(dt->tm_year % 100));
+	max6902_set_reg(dev, MAX6902_REG_CENTURY, bin2bcd(dt->tm_year / 100));
 
 
 	/* Compulab used a delay here. However, the datasheet
 	/* Compulab used a delay here. However, the datasheet
 	 * does not mention a delay being required anywhere... */
 	 * does not mention a delay being required anywhere... */
 	/* delay(2000); */
 	/* delay(2000); */
 
 
 	/* Write protect */
 	/* Write protect */
-	max6902_set_reg(dev, 0xF, 0x80);
+	max6902_set_reg(dev, MAX6902_REG_CONTROL, 0x80);
 
 
 	return 0;
 	return 0;
 }
 }
@@ -134,20 +134,17 @@ static int max6902_probe(struct spi_device *spi)
 	if (res != 0)
 	if (res != 0)
 		return res;
 		return res;
 
 
-	rtc = rtc_device_register("max6902",
-				&spi->dev, &max6902_rtc_ops, THIS_MODULE);
+	rtc = devm_rtc_device_register(&spi->dev, "max6902",
+				&max6902_rtc_ops, THIS_MODULE);
 	if (IS_ERR(rtc))
 	if (IS_ERR(rtc))
 		return PTR_ERR(rtc);
 		return PTR_ERR(rtc);
 
 
-	dev_set_drvdata(&spi->dev, rtc);
+	spi_set_drvdata(spi, rtc);
 	return 0;
 	return 0;
 }
 }
 
 
 static int max6902_remove(struct spi_device *spi)
 static int max6902_remove(struct spi_device *spi)
 {
 {
-	struct rtc_device *rtc = dev_get_drvdata(&spi->dev);
-
-	rtc_device_unregister(rtc);
 	return 0;
 	return 0;
 }
 }
 
 

+ 27 - 46
drivers/rtc/rtc-max77686.c

@@ -24,7 +24,7 @@
 
 
 /* RTC Control Register */
 /* RTC Control Register */
 #define BCD_EN_SHIFT			0
 #define BCD_EN_SHIFT			0
-#define BCD_EN_MASK				(1 << BCD_EN_SHIFT)
+#define BCD_EN_MASK			(1 << BCD_EN_SHIFT)
 #define MODEL24_SHIFT			1
 #define MODEL24_SHIFT			1
 #define MODEL24_MASK			(1 << MODEL24_SHIFT)
 #define MODEL24_MASK			(1 << MODEL24_SHIFT)
 /* RTC Update Register1 */
 /* RTC Update Register1 */
@@ -33,12 +33,12 @@
 #define RTC_RBUDR_SHIFT			4
 #define RTC_RBUDR_SHIFT			4
 #define RTC_RBUDR_MASK			(1 << RTC_RBUDR_SHIFT)
 #define RTC_RBUDR_MASK			(1 << RTC_RBUDR_SHIFT)
 /* WTSR and SMPL Register */
 /* WTSR and SMPL Register */
-#define WTSRT_SHIFT				0
-#define SMPLT_SHIFT				2
+#define WTSRT_SHIFT			0
+#define SMPLT_SHIFT			2
 #define WTSR_EN_SHIFT			6
 #define WTSR_EN_SHIFT			6
 #define SMPL_EN_SHIFT			7
 #define SMPL_EN_SHIFT			7
-#define WTSRT_MASK				(3 << WTSRT_SHIFT)
-#define SMPLT_MASK				(3 << SMPLT_SHIFT)
+#define WTSRT_MASK			(3 << WTSRT_SHIFT)
+#define SMPLT_MASK			(3 << SMPLT_SHIFT)
 #define WTSR_EN_MASK			(1 << WTSR_EN_SHIFT)
 #define WTSR_EN_MASK			(1 << WTSR_EN_SHIFT)
 #define SMPL_EN_MASK			(1 << SMPL_EN_SHIFT)
 #define SMPL_EN_MASK			(1 << SMPL_EN_SHIFT)
 /* RTC Hour register */
 /* RTC Hour register */
@@ -466,7 +466,7 @@ static void max77686_rtc_enable_smpl(struct max77686_rtc_info *info, bool enable
 
 
 	val = 0;
 	val = 0;
 	regmap_read(info->max77686->rtc_regmap, MAX77686_WTSR_SMPL_CNTL, &val);
 	regmap_read(info->max77686->rtc_regmap, MAX77686_WTSR_SMPL_CNTL, &val);
-	pr_info("%s: WTSR_SMPL(0x%02x)\n", __func__, val);
+	dev_info(info->dev, "%s: WTSR_SMPL(0x%02x)\n", __func__, val);
 }
 }
 #endif /* MAX77686_RTC_WTSR_SMPL */
 #endif /* MAX77686_RTC_WTSR_SMPL */
 
 
@@ -505,7 +505,8 @@ static int max77686_rtc_probe(struct platform_device *pdev)
 
 
 	dev_info(&pdev->dev, "%s\n", __func__);
 	dev_info(&pdev->dev, "%s\n", __func__);
 
 
-	info = kzalloc(sizeof(struct max77686_rtc_info), GFP_KERNEL);
+	info = devm_kzalloc(&pdev->dev, sizeof(struct max77686_rtc_info),
+				GFP_KERNEL);
 	if (!info)
 	if (!info)
 		return -ENOMEM;
 		return -ENOMEM;
 
 
@@ -513,13 +514,12 @@ static int max77686_rtc_probe(struct platform_device *pdev)
 	info->dev = &pdev->dev;
 	info->dev = &pdev->dev;
 	info->max77686 = max77686;
 	info->max77686 = max77686;
 	info->rtc = max77686->rtc;
 	info->rtc = max77686->rtc;
-	info->max77686->rtc_regmap = regmap_init_i2c(info->max77686->rtc,
+	info->max77686->rtc_regmap = devm_regmap_init_i2c(info->max77686->rtc,
 					 &max77686_rtc_regmap_config);
 					 &max77686_rtc_regmap_config);
 	if (IS_ERR(info->max77686->rtc_regmap)) {
 	if (IS_ERR(info->max77686->rtc_regmap)) {
 		ret = PTR_ERR(info->max77686->rtc_regmap);
 		ret = PTR_ERR(info->max77686->rtc_regmap);
 		dev_err(info->max77686->dev, "Failed to allocate register map: %d\n",
 		dev_err(info->max77686->dev, "Failed to allocate register map: %d\n",
 				ret);
 				ret);
-		kfree(info);
 		return ret;
 		return ret;
 	}
 	}
 	platform_set_drvdata(pdev, info);
 	platform_set_drvdata(pdev, info);
@@ -538,8 +538,8 @@ static int max77686_rtc_probe(struct platform_device *pdev)
 
 
 	device_init_wakeup(&pdev->dev, 1);
 	device_init_wakeup(&pdev->dev, 1);
 
 
-	info->rtc_dev = rtc_device_register("max77686-rtc", &pdev->dev,
-			&max77686_rtc_ops, THIS_MODULE);
+	info->rtc_dev = devm_rtc_device_register(&pdev->dev, "max77686-rtc",
+					&max77686_rtc_ops, THIS_MODULE);
 
 
 	if (IS_ERR(info->rtc_dev)) {
 	if (IS_ERR(info->rtc_dev)) {
 		dev_info(&pdev->dev, "%s: fail\n", __func__);
 		dev_info(&pdev->dev, "%s: fail\n", __func__);
@@ -551,36 +551,24 @@ static int max77686_rtc_probe(struct platform_device *pdev)
 		goto err_rtc;
 		goto err_rtc;
 	}
 	}
 	virq = irq_create_mapping(max77686->irq_domain, MAX77686_RTCIRQ_RTCA1);
 	virq = irq_create_mapping(max77686->irq_domain, MAX77686_RTCIRQ_RTCA1);
-	if (!virq)
+	if (!virq) {
+		ret = -ENXIO;
 		goto err_rtc;
 		goto err_rtc;
+	}
 	info->virq = virq;
 	info->virq = virq;
 
 
-	ret = request_threaded_irq(virq, NULL, max77686_rtc_alarm_irq, 0,
-			"rtc-alarm0", info);
-	if (ret < 0) {
+	ret = devm_request_threaded_irq(&pdev->dev, virq, NULL,
+				max77686_rtc_alarm_irq, 0, "rtc-alarm0", info);
+	if (ret < 0)
 		dev_err(&pdev->dev, "Failed to request alarm IRQ: %d: %d\n",
 		dev_err(&pdev->dev, "Failed to request alarm IRQ: %d: %d\n",
 			info->virq, ret);
 			info->virq, ret);
-		goto err_rtc;
-	}
 
 
-	goto out;
 err_rtc:
 err_rtc:
-	kfree(info);
-	return ret;
-out:
 	return ret;
 	return ret;
 }
 }
 
 
 static int max77686_rtc_remove(struct platform_device *pdev)
 static int max77686_rtc_remove(struct platform_device *pdev)
 {
 {
-	struct max77686_rtc_info *info = platform_get_drvdata(pdev);
-
-	if (info) {
-		free_irq(info->virq, info);
-		rtc_device_unregister(info->rtc_dev);
-		kfree(info);
-	}
-
 	return 0;
 	return 0;
 }
 }
 
 
@@ -594,11 +582,14 @@ static void max77686_rtc_shutdown(struct platform_device *pdev)
 	for (i = 0; i < 3; i++) {
 	for (i = 0; i < 3; i++) {
 		max77686_rtc_enable_wtsr(info, false);
 		max77686_rtc_enable_wtsr(info, false);
 		regmap_read(info->max77686->rtc_regmap, MAX77686_WTSR_SMPL_CNTL, &val);
 		regmap_read(info->max77686->rtc_regmap, MAX77686_WTSR_SMPL_CNTL, &val);
-		pr_info("%s: WTSR_SMPL reg(0x%02x)\n", __func__, val);
-		if (val & WTSR_EN_MASK)
-			pr_emerg("%s: fail to disable WTSR\n", __func__);
-		else {
-			pr_info("%s: success to disable WTSR\n", __func__);
+		dev_info(info->dev, "%s: WTSR_SMPL reg(0x%02x)\n", __func__,
+				val);
+		if (val & WTSR_EN_MASK) {
+			dev_emerg(info->dev, "%s: fail to disable WTSR\n",
+					__func__);
+		} else {
+			dev_info(info->dev, "%s: success to disable WTSR\n",
+					__func__);
 			break;
 			break;
 		}
 		}
 	}
 	}
@@ -624,18 +615,8 @@ static struct platform_driver max77686_rtc_driver = {
 	.id_table	= rtc_id,
 	.id_table	= rtc_id,
 };
 };
 
 
-static int __init max77686_rtc_init(void)
-{
-	return platform_driver_register(&max77686_rtc_driver);
-}
-module_init(max77686_rtc_init);
-
-static void __exit max77686_rtc_exit(void)
-{
-	platform_driver_unregister(&max77686_rtc_driver);
-}
-module_exit(max77686_rtc_exit);
+module_platform_driver(max77686_rtc_driver);
 
 
 MODULE_DESCRIPTION("Maxim MAX77686 RTC driver");
 MODULE_DESCRIPTION("Maxim MAX77686 RTC driver");
-MODULE_AUTHOR("<woong.byun@samsung.com>");
+MODULE_AUTHOR("Chiwoong Byun <woong.byun@samsung.com>");
 MODULE_LICENSE("GPL");
 MODULE_LICENSE("GPL");

+ 4 - 16
drivers/rtc/rtc-max8907.c

@@ -190,7 +190,7 @@ static int max8907_rtc_probe(struct platform_device *pdev)
 	rtc->max8907 = max8907;
 	rtc->max8907 = max8907;
 	rtc->regmap = max8907->regmap_rtc;
 	rtc->regmap = max8907->regmap_rtc;
 
 
-	rtc->rtc_dev = rtc_device_register("max8907-rtc", &pdev->dev,
+	rtc->rtc_dev = devm_rtc_device_register(&pdev->dev, "max8907-rtc",
 					&max8907_rtc_ops, THIS_MODULE);
 					&max8907_rtc_ops, THIS_MODULE);
 	if (IS_ERR(rtc->rtc_dev)) {
 	if (IS_ERR(rtc->rtc_dev)) {
 		ret = PTR_ERR(rtc->rtc_dev);
 		ret = PTR_ERR(rtc->rtc_dev);
@@ -200,33 +200,21 @@ static int max8907_rtc_probe(struct platform_device *pdev)
 
 
 	rtc->irq = regmap_irq_get_virq(max8907->irqc_rtc,
 	rtc->irq = regmap_irq_get_virq(max8907->irqc_rtc,
 				       MAX8907_IRQ_RTC_ALARM0);
 				       MAX8907_IRQ_RTC_ALARM0);
-	if (rtc->irq < 0) {
-		ret = rtc->irq;
-		goto err_unregister;
-	}
+	if (rtc->irq < 0)
+		return rtc->irq;
 
 
 	ret = devm_request_threaded_irq(&pdev->dev, rtc->irq, NULL,
 	ret = devm_request_threaded_irq(&pdev->dev, rtc->irq, NULL,
 				max8907_irq_handler,
 				max8907_irq_handler,
 				IRQF_ONESHOT, "max8907-alarm0", rtc);
 				IRQF_ONESHOT, "max8907-alarm0", rtc);
-	if (ret < 0) {
+	if (ret < 0)
 		dev_err(&pdev->dev, "Failed to request IRQ%d: %d\n",
 		dev_err(&pdev->dev, "Failed to request IRQ%d: %d\n",
 			rtc->irq, ret);
 			rtc->irq, ret);
-		goto err_unregister;
-	}
 
 
-	return 0;
-
-err_unregister:
-	rtc_device_unregister(rtc->rtc_dev);
 	return ret;
 	return ret;
 }
 }
 
 
 static int max8907_rtc_remove(struct platform_device *pdev)
 static int max8907_rtc_remove(struct platform_device *pdev)
 {
 {
-	struct max8907_rtc *rtc = platform_get_drvdata(pdev);
-
-	rtc_device_unregister(rtc->rtc_dev);
-
 	return 0;
 	return 0;
 }
 }
 
 

+ 9 - 17
drivers/rtc/rtc-max8925.c

@@ -253,7 +253,8 @@ static int max8925_rtc_probe(struct platform_device *pdev)
 	struct max8925_rtc_info *info;
 	struct max8925_rtc_info *info;
 	int ret;
 	int ret;
 
 
-	info = kzalloc(sizeof(struct max8925_rtc_info), GFP_KERNEL);
+	info = devm_kzalloc(&pdev->dev, sizeof(struct max8925_rtc_info),
+			    GFP_KERNEL);
 	if (!info)
 	if (!info)
 		return -ENOMEM;
 		return -ENOMEM;
 	info->chip = chip;
 	info->chip = chip;
@@ -261,12 +262,13 @@ static int max8925_rtc_probe(struct platform_device *pdev)
 	info->dev = &pdev->dev;
 	info->dev = &pdev->dev;
 	info->irq = platform_get_irq(pdev, 0);
 	info->irq = platform_get_irq(pdev, 0);
 
 
-	ret = request_threaded_irq(info->irq, NULL, rtc_update_handler,
-				   IRQF_ONESHOT, "rtc-alarm0", info);
+	ret = devm_request_threaded_irq(&pdev->dev, info->irq, NULL,
+					rtc_update_handler, IRQF_ONESHOT,
+					"rtc-alarm0", info);
 	if (ret < 0) {
 	if (ret < 0) {
 		dev_err(chip->dev, "Failed to request IRQ: #%d: %d\n",
 		dev_err(chip->dev, "Failed to request IRQ: #%d: %d\n",
 			info->irq, ret);
 			info->irq, ret);
-		goto out_irq;
+		goto err;
 	}
 	}
 
 
 	dev_set_drvdata(&pdev->dev, info);
 	dev_set_drvdata(&pdev->dev, info);
@@ -275,32 +277,22 @@ static int max8925_rtc_probe(struct platform_device *pdev)
 
 
 	device_init_wakeup(&pdev->dev, 1);
 	device_init_wakeup(&pdev->dev, 1);
 
 
-	info->rtc_dev = rtc_device_register("max8925-rtc", &pdev->dev,
+	info->rtc_dev = devm_rtc_device_register(&pdev->dev, "max8925-rtc",
 					&max8925_rtc_ops, THIS_MODULE);
 					&max8925_rtc_ops, THIS_MODULE);
 	ret = PTR_ERR(info->rtc_dev);
 	ret = PTR_ERR(info->rtc_dev);
 	if (IS_ERR(info->rtc_dev)) {
 	if (IS_ERR(info->rtc_dev)) {
 		dev_err(&pdev->dev, "Failed to register RTC device: %d\n", ret);
 		dev_err(&pdev->dev, "Failed to register RTC device: %d\n", ret);
-		goto out_rtc;
+		goto err;
 	}
 	}
 
 
 	return 0;
 	return 0;
-out_rtc:
+err:
 	platform_set_drvdata(pdev, NULL);
 	platform_set_drvdata(pdev, NULL);
-	free_irq(info->irq, info);
-out_irq:
-	kfree(info);
 	return ret;
 	return ret;
 }
 }
 
 
 static int max8925_rtc_remove(struct platform_device *pdev)
 static int max8925_rtc_remove(struct platform_device *pdev)
 {
 {
-	struct max8925_rtc_info *info = platform_get_drvdata(pdev);
-
-	if (info) {
-		free_irq(info->irq, info);
-		rtc_device_unregister(info->rtc_dev);
-		kfree(info);
-	}
 	return 0;
 	return 0;
 }
 }
 
 

+ 4 - 13
drivers/rtc/rtc-max8997.c

@@ -479,8 +479,8 @@ static int max8997_rtc_probe(struct platform_device *pdev)
 
 
 	device_init_wakeup(&pdev->dev, 1);
 	device_init_wakeup(&pdev->dev, 1);
 
 
-	info->rtc_dev = rtc_device_register("max8997-rtc", &pdev->dev,
-			&max8997_rtc_ops, THIS_MODULE);
+	info->rtc_dev = devm_rtc_device_register(&pdev->dev, "max8997-rtc",
+					&max8997_rtc_ops, THIS_MODULE);
 
 
 	if (IS_ERR(info->rtc_dev)) {
 	if (IS_ERR(info->rtc_dev)) {
 		ret = PTR_ERR(info->rtc_dev);
 		ret = PTR_ERR(info->rtc_dev);
@@ -491,6 +491,7 @@ static int max8997_rtc_probe(struct platform_device *pdev)
 	virq = irq_create_mapping(max8997->irq_domain, MAX8997_PMICIRQ_RTCA1);
 	virq = irq_create_mapping(max8997->irq_domain, MAX8997_PMICIRQ_RTCA1);
 	if (!virq) {
 	if (!virq) {
 		dev_err(&pdev->dev, "Failed to create mapping alarm IRQ\n");
 		dev_err(&pdev->dev, "Failed to create mapping alarm IRQ\n");
+		ret = -ENXIO;
 		goto err_out;
 		goto err_out;
 	}
 	}
 	info->virq = virq;
 	info->virq = virq;
@@ -498,26 +499,16 @@ static int max8997_rtc_probe(struct platform_device *pdev)
 	ret = devm_request_threaded_irq(&pdev->dev, virq, NULL,
 	ret = devm_request_threaded_irq(&pdev->dev, virq, NULL,
 				max8997_rtc_alarm_irq, 0,
 				max8997_rtc_alarm_irq, 0,
 				"rtc-alarm0", info);
 				"rtc-alarm0", info);
-	if (ret < 0) {
+	if (ret < 0)
 		dev_err(&pdev->dev, "Failed to request alarm IRQ: %d: %d\n",
 		dev_err(&pdev->dev, "Failed to request alarm IRQ: %d: %d\n",
 			info->virq, ret);
 			info->virq, ret);
-		goto err_out;
-	}
-
-	return ret;
 
 
 err_out:
 err_out:
-	rtc_device_unregister(info->rtc_dev);
 	return ret;
 	return ret;
 }
 }
 
 
 static int max8997_rtc_remove(struct platform_device *pdev)
 static int max8997_rtc_remove(struct platform_device *pdev)
 {
 {
-	struct max8997_rtc_info *info = platform_get_drvdata(pdev);
-
-	if (info)
-		rtc_device_unregister(info->rtc_dev);
-
 	return 0;
 	return 0;
 }
 }
 
 

+ 5 - 13
drivers/rtc/rtc-max8998.c

@@ -256,7 +256,8 @@ static int max8998_rtc_probe(struct platform_device *pdev)
 	struct max8998_rtc_info *info;
 	struct max8998_rtc_info *info;
 	int ret;
 	int ret;
 
 
-	info = kzalloc(sizeof(struct max8998_rtc_info), GFP_KERNEL);
+	info = devm_kzalloc(&pdev->dev, sizeof(struct max8998_rtc_info),
+			GFP_KERNEL);
 	if (!info)
 	if (!info)
 		return -ENOMEM;
 		return -ENOMEM;
 
 
@@ -267,7 +268,7 @@ static int max8998_rtc_probe(struct platform_device *pdev)
 
 
 	platform_set_drvdata(pdev, info);
 	platform_set_drvdata(pdev, info);
 
 
-	info->rtc_dev = rtc_device_register("max8998-rtc", &pdev->dev,
+	info->rtc_dev = devm_rtc_device_register(&pdev->dev, "max8998-rtc",
 			&max8998_rtc_ops, THIS_MODULE);
 			&max8998_rtc_ops, THIS_MODULE);
 
 
 	if (IS_ERR(info->rtc_dev)) {
 	if (IS_ERR(info->rtc_dev)) {
@@ -276,8 +277,8 @@ static int max8998_rtc_probe(struct platform_device *pdev)
 		goto out_rtc;
 		goto out_rtc;
 	}
 	}
 
 
-	ret = request_threaded_irq(info->irq, NULL, max8998_rtc_alarm_irq, 0,
-			"rtc-alarm0", info);
+	ret = devm_request_threaded_irq(&pdev->dev, info->irq, NULL,
+				max8998_rtc_alarm_irq, 0, "rtc-alarm0", info);
 
 
 	if (ret < 0)
 	if (ret < 0)
 		dev_err(&pdev->dev, "Failed to request alarm IRQ: %d: %d\n",
 		dev_err(&pdev->dev, "Failed to request alarm IRQ: %d: %d\n",
@@ -294,20 +295,11 @@ static int max8998_rtc_probe(struct platform_device *pdev)
 
 
 out_rtc:
 out_rtc:
 	platform_set_drvdata(pdev, NULL);
 	platform_set_drvdata(pdev, NULL);
-	kfree(info);
 	return ret;
 	return ret;
 }
 }
 
 
 static int max8998_rtc_remove(struct platform_device *pdev)
 static int max8998_rtc_remove(struct platform_device *pdev)
 {
 {
-	struct max8998_rtc_info *info = platform_get_drvdata(pdev);
-
-	if (info) {
-		free_irq(info->irq, info);
-		rtc_device_unregister(info->rtc_dev);
-		kfree(info);
-	}
-
 	return 0;
 	return 0;
 }
 }
 
 

+ 4 - 19
drivers/rtc/rtc-mc13xxx.c

@@ -316,7 +316,7 @@ static int __init mc13xxx_rtc_probe(struct platform_device *pdev)
 	struct mc13xxx *mc13xxx;
 	struct mc13xxx *mc13xxx;
 	int rtcrst_pending;
 	int rtcrst_pending;
 
 
-	priv = kzalloc(sizeof(*priv), GFP_KERNEL);
+	priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
 	if (!priv)
 	if (!priv)
 		return -ENOMEM;
 		return -ENOMEM;
 
 
@@ -351,8 +351,8 @@ static int __init mc13xxx_rtc_probe(struct platform_device *pdev)
 
 
 	mc13xxx_unlock(mc13xxx);
 	mc13xxx_unlock(mc13xxx);
 
 
-	priv->rtc = rtc_device_register(pdev->name,
-			&pdev->dev, &mc13xxx_rtc_ops, THIS_MODULE);
+	priv->rtc = devm_rtc_device_register(&pdev->dev, pdev->name,
+					&mc13xxx_rtc_ops, THIS_MODULE);
 	if (IS_ERR(priv->rtc)) {
 	if (IS_ERR(priv->rtc)) {
 		ret = PTR_ERR(priv->rtc);
 		ret = PTR_ERR(priv->rtc);
 
 
@@ -372,7 +372,6 @@ err_reset_irq_request:
 		mc13xxx_unlock(mc13xxx);
 		mc13xxx_unlock(mc13xxx);
 
 
 		platform_set_drvdata(pdev, NULL);
 		platform_set_drvdata(pdev, NULL);
-		kfree(priv);
 	}
 	}
 
 
 	return ret;
 	return ret;
@@ -384,8 +383,6 @@ static int __exit mc13xxx_rtc_remove(struct platform_device *pdev)
 
 
 	mc13xxx_lock(priv->mc13xxx);
 	mc13xxx_lock(priv->mc13xxx);
 
 
-	rtc_device_unregister(priv->rtc);
-
 	mc13xxx_irq_free(priv->mc13xxx, MC13XXX_IRQ_TODA, priv);
 	mc13xxx_irq_free(priv->mc13xxx, MC13XXX_IRQ_TODA, priv);
 	mc13xxx_irq_free(priv->mc13xxx, MC13XXX_IRQ_1HZ, priv);
 	mc13xxx_irq_free(priv->mc13xxx, MC13XXX_IRQ_1HZ, priv);
 	mc13xxx_irq_free(priv->mc13xxx, MC13XXX_IRQ_RTCRST, priv);
 	mc13xxx_irq_free(priv->mc13xxx, MC13XXX_IRQ_RTCRST, priv);
@@ -394,8 +391,6 @@ static int __exit mc13xxx_rtc_remove(struct platform_device *pdev)
 
 
 	platform_set_drvdata(pdev, NULL);
 	platform_set_drvdata(pdev, NULL);
 
 
-	kfree(priv);
-
 	return 0;
 	return 0;
 }
 }
 
 
@@ -420,17 +415,7 @@ static struct platform_driver mc13xxx_rtc_driver = {
 	},
 	},
 };
 };
 
 
-static int __init mc13xxx_rtc_init(void)
-{
-	return platform_driver_probe(&mc13xxx_rtc_driver, &mc13xxx_rtc_probe);
-}
-module_init(mc13xxx_rtc_init);
-
-static void __exit mc13xxx_rtc_exit(void)
-{
-	platform_driver_unregister(&mc13xxx_rtc_driver);
-}
-module_exit(mc13xxx_rtc_exit);
+module_platform_driver_probe(mc13xxx_rtc_driver, &mc13xxx_rtc_probe);
 
 
 MODULE_AUTHOR("Sascha Hauer <s.hauer@pengutronix.de>");
 MODULE_AUTHOR("Sascha Hauer <s.hauer@pengutronix.de>");
 MODULE_DESCRIPTION("RTC driver for Freescale MC13XXX PMIC");
 MODULE_DESCRIPTION("RTC driver for Freescale MC13XXX PMIC");

+ 12 - 33
drivers/rtc/rtc-msm6242.c

@@ -194,30 +194,28 @@ static const struct rtc_class_ops msm6242_rtc_ops = {
 	.set_time	= msm6242_set_time,
 	.set_time	= msm6242_set_time,
 };
 };
 
 
-static int __init msm6242_rtc_probe(struct platform_device *dev)
+static int __init msm6242_rtc_probe(struct platform_device *pdev)
 {
 {
 	struct resource *res;
 	struct resource *res;
 	struct msm6242_priv *priv;
 	struct msm6242_priv *priv;
 	struct rtc_device *rtc;
 	struct rtc_device *rtc;
 	int error;
 	int error;
 
 
-	res = platform_get_resource(dev, IORESOURCE_MEM, 0);
+	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 	if (!res)
 	if (!res)
 		return -ENODEV;
 		return -ENODEV;
 
 
-	priv = kzalloc(sizeof(*priv), GFP_KERNEL);
+	priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
 	if (!priv)
 	if (!priv)
 		return -ENOMEM;
 		return -ENOMEM;
 
 
-	priv->regs = ioremap(res->start, resource_size(res));
-	if (!priv->regs) {
-		error = -ENOMEM;
-		goto out_free_priv;
-	}
-	platform_set_drvdata(dev, priv);
+	priv->regs = devm_ioremap(&pdev->dev, res->start, resource_size(res));
+	if (!priv->regs)
+		return -ENOMEM;
+	platform_set_drvdata(pdev, priv);
 
 
-	rtc = rtc_device_register("rtc-msm6242", &dev->dev, &msm6242_rtc_ops,
-				  THIS_MODULE);
+	rtc = devm_rtc_device_register(&pdev->dev, "rtc-msm6242",
+				&msm6242_rtc_ops, THIS_MODULE);
 	if (IS_ERR(rtc)) {
 	if (IS_ERR(rtc)) {
 		error = PTR_ERR(rtc);
 		error = PTR_ERR(rtc);
 		goto out_unmap;
 		goto out_unmap;
@@ -227,20 +225,12 @@ static int __init msm6242_rtc_probe(struct platform_device *dev)
 	return 0;
 	return 0;
 
 
 out_unmap:
 out_unmap:
-	platform_set_drvdata(dev, NULL);
-	iounmap(priv->regs);
-out_free_priv:
-	kfree(priv);
+	platform_set_drvdata(pdev, NULL);
 	return error;
 	return error;
 }
 }
 
 
-static int __exit msm6242_rtc_remove(struct platform_device *dev)
+static int __exit msm6242_rtc_remove(struct platform_device *pdev)
 {
 {
-	struct msm6242_priv *priv = platform_get_drvdata(dev);
-
-	rtc_device_unregister(priv->rtc);
-	iounmap(priv->regs);
-	kfree(priv);
 	return 0;
 	return 0;
 }
 }
 
 
@@ -252,18 +242,7 @@ static struct platform_driver msm6242_rtc_driver = {
 	.remove	= __exit_p(msm6242_rtc_remove),
 	.remove	= __exit_p(msm6242_rtc_remove),
 };
 };
 
 
-static int __init msm6242_rtc_init(void)
-{
-	return platform_driver_probe(&msm6242_rtc_driver, msm6242_rtc_probe);
-}
-
-static void __exit msm6242_rtc_fini(void)
-{
-	platform_driver_unregister(&msm6242_rtc_driver);
-}
-
-module_init(msm6242_rtc_init);
-module_exit(msm6242_rtc_fini);
+module_platform_driver_probe(msm6242_rtc_driver, msm6242_rtc_probe);
 
 
 MODULE_AUTHOR("Geert Uytterhoeven <geert@linux-m68k.org>");
 MODULE_AUTHOR("Geert Uytterhoeven <geert@linux-m68k.org>");
 MODULE_LICENSE("GPL");
 MODULE_LICENSE("GPL");

+ 6 - 17
drivers/rtc/rtc-mv.c

@@ -217,7 +217,7 @@ static const struct rtc_class_ops mv_rtc_alarm_ops = {
 	.alarm_irq_enable = mv_rtc_alarm_irq_enable,
 	.alarm_irq_enable = mv_rtc_alarm_irq_enable,
 };
 };
 
 
-static int mv_rtc_probe(struct platform_device *pdev)
+static int __init mv_rtc_probe(struct platform_device *pdev)
 {
 {
 	struct resource *res;
 	struct resource *res;
 	struct rtc_plat_data *pdata;
 	struct rtc_plat_data *pdata;
@@ -272,12 +272,13 @@ static int mv_rtc_probe(struct platform_device *pdev)
 
 
 	if (pdata->irq >= 0) {
 	if (pdata->irq >= 0) {
 		device_init_wakeup(&pdev->dev, 1);
 		device_init_wakeup(&pdev->dev, 1);
-		pdata->rtc = rtc_device_register(pdev->name, &pdev->dev,
+		pdata->rtc = devm_rtc_device_register(&pdev->dev, pdev->name,
 						 &mv_rtc_alarm_ops,
 						 &mv_rtc_alarm_ops,
 						 THIS_MODULE);
 						 THIS_MODULE);
-	} else
-		pdata->rtc = rtc_device_register(pdev->name, &pdev->dev,
+	} else {
+		pdata->rtc = devm_rtc_device_register(&pdev->dev, pdev->name,
 						 &mv_rtc_ops, THIS_MODULE);
 						 &mv_rtc_ops, THIS_MODULE);
+	}
 	if (IS_ERR(pdata->rtc)) {
 	if (IS_ERR(pdata->rtc)) {
 		ret = PTR_ERR(pdata->rtc);
 		ret = PTR_ERR(pdata->rtc);
 		goto out;
 		goto out;
@@ -308,7 +309,6 @@ static int __exit mv_rtc_remove(struct platform_device *pdev)
 	if (pdata->irq >= 0)
 	if (pdata->irq >= 0)
 		device_init_wakeup(&pdev->dev, 0);
 		device_init_wakeup(&pdev->dev, 0);
 
 
-	rtc_device_unregister(pdata->rtc);
 	if (!IS_ERR(pdata->clk))
 	if (!IS_ERR(pdata->clk))
 		clk_disable_unprepare(pdata->clk);
 		clk_disable_unprepare(pdata->clk);
 
 
@@ -331,18 +331,7 @@ static struct platform_driver mv_rtc_driver = {
 	},
 	},
 };
 };
 
 
-static __init int mv_init(void)
-{
-	return platform_driver_probe(&mv_rtc_driver, mv_rtc_probe);
-}
-
-static __exit void mv_exit(void)
-{
-	platform_driver_unregister(&mv_rtc_driver);
-}
-
-module_init(mv_init);
-module_exit(mv_exit);
+module_platform_driver_probe(mv_rtc_driver, mv_rtc_probe);
 
 
 MODULE_AUTHOR("Saeed Bishara <saeed@marvell.com>");
 MODULE_AUTHOR("Saeed Bishara <saeed@marvell.com>");
 MODULE_DESCRIPTION("Marvell RTC driver");
 MODULE_DESCRIPTION("Marvell RTC driver");

+ 4 - 11
drivers/rtc/rtc-mxc.c

@@ -439,7 +439,7 @@ static int mxc_rtc_probe(struct platform_device *pdev)
 	if (pdata->irq >=0)
 	if (pdata->irq >=0)
 		device_init_wakeup(&pdev->dev, 1);
 		device_init_wakeup(&pdev->dev, 1);
 
 
-	rtc = rtc_device_register(pdev->name, &pdev->dev, &mxc_rtc_ops,
+	rtc = devm_rtc_device_register(&pdev->dev, pdev->name, &mxc_rtc_ops,
 				  THIS_MODULE);
 				  THIS_MODULE);
 	if (IS_ERR(rtc)) {
 	if (IS_ERR(rtc)) {
 		ret = PTR_ERR(rtc);
 		ret = PTR_ERR(rtc);
@@ -464,15 +464,13 @@ static int mxc_rtc_remove(struct platform_device *pdev)
 {
 {
 	struct rtc_plat_data *pdata = platform_get_drvdata(pdev);
 	struct rtc_plat_data *pdata = platform_get_drvdata(pdev);
 
 
-	rtc_device_unregister(pdata->rtc);
-
 	clk_disable_unprepare(pdata->clk);
 	clk_disable_unprepare(pdata->clk);
 	platform_set_drvdata(pdev, NULL);
 	platform_set_drvdata(pdev, NULL);
 
 
 	return 0;
 	return 0;
 }
 }
 
 
-#ifdef CONFIG_PM
+#ifdef CONFIG_PM_SLEEP
 static int mxc_rtc_suspend(struct device *dev)
 static int mxc_rtc_suspend(struct device *dev)
 {
 {
 	struct rtc_plat_data *pdata = dev_get_drvdata(dev);
 	struct rtc_plat_data *pdata = dev_get_drvdata(dev);
@@ -492,19 +490,14 @@ static int mxc_rtc_resume(struct device *dev)
 
 
 	return 0;
 	return 0;
 }
 }
-
-static struct dev_pm_ops mxc_rtc_pm_ops = {
-	.suspend	= mxc_rtc_suspend,
-	.resume		= mxc_rtc_resume,
-};
 #endif
 #endif
 
 
+static SIMPLE_DEV_PM_OPS(mxc_rtc_pm_ops, mxc_rtc_suspend, mxc_rtc_resume);
+
 static struct platform_driver mxc_rtc_driver = {
 static struct platform_driver mxc_rtc_driver = {
 	.driver = {
 	.driver = {
 		   .name	= "mxc_rtc",
 		   .name	= "mxc_rtc",
-#ifdef CONFIG_PM
 		   .pm		= &mxc_rtc_pm_ops,
 		   .pm		= &mxc_rtc_pm_ops,
-#endif
 		   .owner	= THIS_MODULE,
 		   .owner	= THIS_MODULE,
 	},
 	},
 	.id_table = imx_rtc_devtype,
 	.id_table = imx_rtc_devtype,

+ 15 - 57
drivers/rtc/rtc-nuc900.c

@@ -222,13 +222,13 @@ static struct rtc_class_ops nuc900_rtc_ops = {
 	.alarm_irq_enable = nuc900_alarm_irq_enable,
 	.alarm_irq_enable = nuc900_alarm_irq_enable,
 };
 };
 
 
-static int nuc900_rtc_probe(struct platform_device *pdev)
+static int __init nuc900_rtc_probe(struct platform_device *pdev)
 {
 {
 	struct resource *res;
 	struct resource *res;
 	struct nuc900_rtc *nuc900_rtc;
 	struct nuc900_rtc *nuc900_rtc;
-	int err = 0;
 
 
-	nuc900_rtc = kzalloc(sizeof(struct nuc900_rtc), GFP_KERNEL);
+	nuc900_rtc = devm_kzalloc(&pdev->dev, sizeof(struct nuc900_rtc),
+				GFP_KERNEL);
 	if (!nuc900_rtc) {
 	if (!nuc900_rtc) {
 		dev_err(&pdev->dev, "kzalloc nuc900_rtc failed\n");
 		dev_err(&pdev->dev, "kzalloc nuc900_rtc failed\n");
 		return -ENOMEM;
 		return -ENOMEM;
@@ -236,93 +236,51 @@ static int nuc900_rtc_probe(struct platform_device *pdev)
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 	if (!res) {
 	if (!res) {
 		dev_err(&pdev->dev, "platform_get_resource failed\n");
 		dev_err(&pdev->dev, "platform_get_resource failed\n");
-		err = -ENXIO;
-		goto fail1;
+		return -ENXIO;
 	}
 	}
 
 
-	if (!request_mem_region(res->start, resource_size(res),
-				pdev->name)) {
-		dev_err(&pdev->dev, "request_mem_region failed\n");
-		err = -EBUSY;
-		goto fail1;
-	}
-
-	nuc900_rtc->rtc_reg = ioremap(res->start, resource_size(res));
-	if (!nuc900_rtc->rtc_reg) {
-		dev_err(&pdev->dev, "ioremap rtc_reg failed\n");
-		err = -ENOMEM;
-		goto fail2;
-	}
+	nuc900_rtc->rtc_reg = devm_ioremap_resource(&pdev->dev, res);
+	if (IS_ERR(nuc900_rtc->rtc_reg))
+		return PTR_ERR(nuc900_rtc->rtc_reg);
 
 
 	platform_set_drvdata(pdev, nuc900_rtc);
 	platform_set_drvdata(pdev, nuc900_rtc);
 
 
-	nuc900_rtc->rtcdev = rtc_device_register(pdev->name, &pdev->dev,
+	nuc900_rtc->rtcdev = devm_rtc_device_register(&pdev->dev, pdev->name,
 						&nuc900_rtc_ops, THIS_MODULE);
 						&nuc900_rtc_ops, THIS_MODULE);
 	if (IS_ERR(nuc900_rtc->rtcdev)) {
 	if (IS_ERR(nuc900_rtc->rtcdev)) {
 		dev_err(&pdev->dev, "rtc device register failed\n");
 		dev_err(&pdev->dev, "rtc device register failed\n");
-		err = PTR_ERR(nuc900_rtc->rtcdev);
-		goto fail3;
+		return PTR_ERR(nuc900_rtc->rtcdev);
 	}
 	}
 
 
 	__raw_writel(__raw_readl(nuc900_rtc->rtc_reg + REG_RTC_TSSR) | MODE24,
 	__raw_writel(__raw_readl(nuc900_rtc->rtc_reg + REG_RTC_TSSR) | MODE24,
 					nuc900_rtc->rtc_reg + REG_RTC_TSSR);
 					nuc900_rtc->rtc_reg + REG_RTC_TSSR);
 
 
 	nuc900_rtc->irq_num = platform_get_irq(pdev, 0);
 	nuc900_rtc->irq_num = platform_get_irq(pdev, 0);
-	if (request_irq(nuc900_rtc->irq_num, nuc900_rtc_interrupt,
-				0, "nuc900rtc", nuc900_rtc)) {
+	if (devm_request_irq(&pdev->dev, nuc900_rtc->irq_num,
+			nuc900_rtc_interrupt, 0, "nuc900rtc", nuc900_rtc)) {
 		dev_err(&pdev->dev, "NUC900 RTC request irq failed\n");
 		dev_err(&pdev->dev, "NUC900 RTC request irq failed\n");
-		err = -EBUSY;
-		goto fail4;
+		return -EBUSY;
 	}
 	}
 
 
 	return 0;
 	return 0;
-
-fail4:	rtc_device_unregister(nuc900_rtc->rtcdev);
-fail3:	iounmap(nuc900_rtc->rtc_reg);
-fail2:	release_mem_region(res->start, resource_size(res));
-fail1:	kfree(nuc900_rtc);
-	return err;
 }
 }
 
 
-static int nuc900_rtc_remove(struct platform_device *pdev)
+static int __exit nuc900_rtc_remove(struct platform_device *pdev)
 {
 {
-	struct nuc900_rtc *nuc900_rtc = platform_get_drvdata(pdev);
-	struct resource *res;
-
-	free_irq(nuc900_rtc->irq_num, nuc900_rtc);
-	rtc_device_unregister(nuc900_rtc->rtcdev);
-	iounmap(nuc900_rtc->rtc_reg);
-
-	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-	release_mem_region(res->start, resource_size(res));
-
-	kfree(nuc900_rtc);
-
 	platform_set_drvdata(pdev, NULL);
 	platform_set_drvdata(pdev, NULL);
 
 
 	return 0;
 	return 0;
 }
 }
 
 
 static struct platform_driver nuc900_rtc_driver = {
 static struct platform_driver nuc900_rtc_driver = {
-	.remove		= nuc900_rtc_remove,
+	.remove		= __exit_p(nuc900_rtc_remove),
 	.driver		= {
 	.driver		= {
 		.name	= "nuc900-rtc",
 		.name	= "nuc900-rtc",
 		.owner	= THIS_MODULE,
 		.owner	= THIS_MODULE,
 	},
 	},
 };
 };
 
 
-static int __init nuc900_rtc_init(void)
-{
-	return platform_driver_probe(&nuc900_rtc_driver, nuc900_rtc_probe);
-}
-
-static void __exit nuc900_rtc_exit(void)
-{
-	platform_driver_unregister(&nuc900_rtc_driver);
-}
-
-module_init(nuc900_rtc_init);
-module_exit(nuc900_rtc_exit);
+module_platform_driver_probe(nuc900_rtc_driver, nuc900_rtc_probe);
 
 
 MODULE_AUTHOR("Wan ZongShun <mcuos.com@gmail.com>");
 MODULE_AUTHOR("Wan ZongShun <mcuos.com@gmail.com>");
 MODULE_DESCRIPTION("nuc910/nuc920 RTC driver");
 MODULE_DESCRIPTION("nuc910/nuc920 RTC driver");

+ 20 - 61
drivers/rtc/rtc-omap.c

@@ -324,7 +324,7 @@ MODULE_DEVICE_TABLE(of, omap_rtc_of_match);
 
 
 static int __init omap_rtc_probe(struct platform_device *pdev)
 static int __init omap_rtc_probe(struct platform_device *pdev)
 {
 {
-	struct resource		*res, *mem;
+	struct resource		*res;
 	struct rtc_device	*rtc;
 	struct rtc_device	*rtc;
 	u8			reg, new_ctrl;
 	u8			reg, new_ctrl;
 	const struct platform_device_id *id_entry;
 	const struct platform_device_id *id_entry;
@@ -352,18 +352,9 @@ static int __init omap_rtc_probe(struct platform_device *pdev)
 		return -ENOENT;
 		return -ENOENT;
 	}
 	}
 
 
-	mem = request_mem_region(res->start, resource_size(res), pdev->name);
-	if (!mem) {
-		pr_debug("%s: RTC registers at %08x are not free\n",
-			pdev->name, res->start);
-		return -EBUSY;
-	}
-
-	rtc_base = ioremap(res->start, resource_size(res));
-	if (!rtc_base) {
-		pr_debug("%s: RTC registers can't be mapped\n", pdev->name);
-		goto fail;
-	}
+	rtc_base = devm_ioremap_resource(&pdev->dev, res);
+	if (IS_ERR(rtc_base))
+		return PTR_ERR(rtc_base);
 
 
 	/* Enable the clock/module so that we can access the registers */
 	/* Enable the clock/module so that we can access the registers */
 	pm_runtime_enable(&pdev->dev);
 	pm_runtime_enable(&pdev->dev);
@@ -375,7 +366,7 @@ static int __init omap_rtc_probe(struct platform_device *pdev)
 		rtc_writel(KICK1_VALUE, OMAP_RTC_KICK1_REG);
 		rtc_writel(KICK1_VALUE, OMAP_RTC_KICK1_REG);
 	}
 	}
 
 
-	rtc = rtc_device_register(pdev->name, &pdev->dev,
+	rtc = devm_rtc_device_register(&pdev->dev, pdev->name,
 			&omap_rtc_ops, THIS_MODULE);
 			&omap_rtc_ops, THIS_MODULE);
 	if (IS_ERR(rtc)) {
 	if (IS_ERR(rtc)) {
 		pr_debug("%s: can't register RTC device, err %ld\n",
 		pr_debug("%s: can't register RTC device, err %ld\n",
@@ -383,7 +374,6 @@ static int __init omap_rtc_probe(struct platform_device *pdev)
 		goto fail0;
 		goto fail0;
 	}
 	}
 	platform_set_drvdata(pdev, rtc);
 	platform_set_drvdata(pdev, rtc);
-	dev_set_drvdata(&rtc->dev, mem);
 
 
 	/* clear pending irqs, and set 1/second periodic,
 	/* clear pending irqs, and set 1/second periodic,
 	 * which we'll use instead of update irqs
 	 * which we'll use instead of update irqs
@@ -401,18 +391,18 @@ static int __init omap_rtc_probe(struct platform_device *pdev)
 		rtc_write(OMAP_RTC_STATUS_ALARM, OMAP_RTC_STATUS_REG);
 		rtc_write(OMAP_RTC_STATUS_ALARM, OMAP_RTC_STATUS_REG);
 
 
 	/* handle periodic and alarm irqs */
 	/* handle periodic and alarm irqs */
-	if (request_irq(omap_rtc_timer, rtc_irq, 0,
+	if (devm_request_irq(&pdev->dev, omap_rtc_timer, rtc_irq, 0,
 			dev_name(&rtc->dev), rtc)) {
 			dev_name(&rtc->dev), rtc)) {
 		pr_debug("%s: RTC timer interrupt IRQ%d already claimed\n",
 		pr_debug("%s: RTC timer interrupt IRQ%d already claimed\n",
 			pdev->name, omap_rtc_timer);
 			pdev->name, omap_rtc_timer);
-		goto fail1;
+		goto fail0;
 	}
 	}
 	if ((omap_rtc_timer != omap_rtc_alarm) &&
 	if ((omap_rtc_timer != omap_rtc_alarm) &&
-		(request_irq(omap_rtc_alarm, rtc_irq, 0,
+		(devm_request_irq(&pdev->dev, omap_rtc_alarm, rtc_irq, 0,
 			dev_name(&rtc->dev), rtc))) {
 			dev_name(&rtc->dev), rtc))) {
 		pr_debug("%s: RTC alarm interrupt IRQ%d already claimed\n",
 		pr_debug("%s: RTC alarm interrupt IRQ%d already claimed\n",
 			pdev->name, omap_rtc_alarm);
 			pdev->name, omap_rtc_alarm);
-		goto fail2;
+		goto fail0;
 	}
 	}
 
 
 	/* On boards with split power, RTC_ON_NOFF won't reset the RTC */
 	/* On boards with split power, RTC_ON_NOFF won't reset the RTC */
@@ -446,25 +436,16 @@ static int __init omap_rtc_probe(struct platform_device *pdev)
 
 
 	return 0;
 	return 0;
 
 
-fail2:
-	free_irq(omap_rtc_timer, rtc);
-fail1:
-	rtc_device_unregister(rtc);
 fail0:
 fail0:
 	if (id_entry && (id_entry->driver_data & OMAP_RTC_HAS_KICKER))
 	if (id_entry && (id_entry->driver_data & OMAP_RTC_HAS_KICKER))
 		rtc_writel(0, OMAP_RTC_KICK0_REG);
 		rtc_writel(0, OMAP_RTC_KICK0_REG);
 	pm_runtime_put_sync(&pdev->dev);
 	pm_runtime_put_sync(&pdev->dev);
 	pm_runtime_disable(&pdev->dev);
 	pm_runtime_disable(&pdev->dev);
-	iounmap(rtc_base);
-fail:
-	release_mem_region(mem->start, resource_size(mem));
 	return -EIO;
 	return -EIO;
 }
 }
 
 
 static int __exit omap_rtc_remove(struct platform_device *pdev)
 static int __exit omap_rtc_remove(struct platform_device *pdev)
 {
 {
-	struct rtc_device	*rtc = platform_get_drvdata(pdev);
-	struct resource		*mem = dev_get_drvdata(&rtc->dev);
 	const struct platform_device_id *id_entry =
 	const struct platform_device_id *id_entry =
 				platform_get_device_id(pdev);
 				platform_get_device_id(pdev);
 
 
@@ -473,12 +454,6 @@ static int __exit omap_rtc_remove(struct platform_device *pdev)
 	/* leave rtc running, but disable irqs */
 	/* leave rtc running, but disable irqs */
 	rtc_write(0, OMAP_RTC_INTERRUPTS_REG);
 	rtc_write(0, OMAP_RTC_INTERRUPTS_REG);
 
 
-	free_irq(omap_rtc_timer, rtc);
-
-	if (omap_rtc_timer != omap_rtc_alarm)
-		free_irq(omap_rtc_alarm, rtc);
-
-	rtc_device_unregister(rtc);
 	if (id_entry && (id_entry->driver_data & OMAP_RTC_HAS_KICKER))
 	if (id_entry && (id_entry->driver_data & OMAP_RTC_HAS_KICKER))
 		rtc_writel(0, OMAP_RTC_KICK0_REG);
 		rtc_writel(0, OMAP_RTC_KICK0_REG);
 
 
@@ -486,16 +461,13 @@ static int __exit omap_rtc_remove(struct platform_device *pdev)
 	pm_runtime_put_sync(&pdev->dev);
 	pm_runtime_put_sync(&pdev->dev);
 	pm_runtime_disable(&pdev->dev);
 	pm_runtime_disable(&pdev->dev);
 
 
-	iounmap(rtc_base);
-	release_mem_region(mem->start, resource_size(mem));
 	return 0;
 	return 0;
 }
 }
 
 
-#ifdef CONFIG_PM
-
+#ifdef CONFIG_PM_SLEEP
 static u8 irqstat;
 static u8 irqstat;
 
 
-static int omap_rtc_suspend(struct platform_device *pdev, pm_message_t state)
+static int omap_rtc_suspend(struct device *dev)
 {
 {
 	irqstat = rtc_read(OMAP_RTC_INTERRUPTS_REG);
 	irqstat = rtc_read(OMAP_RTC_INTERRUPTS_REG);
 
 
@@ -503,34 +475,32 @@ static int omap_rtc_suspend(struct platform_device *pdev, pm_message_t state)
 	 * source, and in fact this enable() call is just saving a flag
 	 * source, and in fact this enable() call is just saving a flag
 	 * that's never used...
 	 * that's never used...
 	 */
 	 */
-	if (device_may_wakeup(&pdev->dev))
+	if (device_may_wakeup(dev))
 		enable_irq_wake(omap_rtc_alarm);
 		enable_irq_wake(omap_rtc_alarm);
 	else
 	else
 		rtc_write(0, OMAP_RTC_INTERRUPTS_REG);
 		rtc_write(0, OMAP_RTC_INTERRUPTS_REG);
 
 
 	/* Disable the clock/module */
 	/* Disable the clock/module */
-	pm_runtime_put_sync(&pdev->dev);
+	pm_runtime_put_sync(dev);
 
 
 	return 0;
 	return 0;
 }
 }
 
 
-static int omap_rtc_resume(struct platform_device *pdev)
+static int omap_rtc_resume(struct device *dev)
 {
 {
 	/* Enable the clock/module so that we can access the registers */
 	/* Enable the clock/module so that we can access the registers */
-	pm_runtime_get_sync(&pdev->dev);
+	pm_runtime_get_sync(dev);
 
 
-	if (device_may_wakeup(&pdev->dev))
+	if (device_may_wakeup(dev))
 		disable_irq_wake(omap_rtc_alarm);
 		disable_irq_wake(omap_rtc_alarm);
 	else
 	else
 		rtc_write(irqstat, OMAP_RTC_INTERRUPTS_REG);
 		rtc_write(irqstat, OMAP_RTC_INTERRUPTS_REG);
 	return 0;
 	return 0;
 }
 }
-
-#else
-#define omap_rtc_suspend NULL
-#define omap_rtc_resume  NULL
 #endif
 #endif
 
 
+static SIMPLE_DEV_PM_OPS(omap_rtc_pm_ops, omap_rtc_suspend, omap_rtc_resume);
+
 static void omap_rtc_shutdown(struct platform_device *pdev)
 static void omap_rtc_shutdown(struct platform_device *pdev)
 {
 {
 	rtc_write(0, OMAP_RTC_INTERRUPTS_REG);
 	rtc_write(0, OMAP_RTC_INTERRUPTS_REG);
@@ -539,28 +509,17 @@ static void omap_rtc_shutdown(struct platform_device *pdev)
 MODULE_ALIAS("platform:omap_rtc");
 MODULE_ALIAS("platform:omap_rtc");
 static struct platform_driver omap_rtc_driver = {
 static struct platform_driver omap_rtc_driver = {
 	.remove		= __exit_p(omap_rtc_remove),
 	.remove		= __exit_p(omap_rtc_remove),
-	.suspend	= omap_rtc_suspend,
-	.resume		= omap_rtc_resume,
 	.shutdown	= omap_rtc_shutdown,
 	.shutdown	= omap_rtc_shutdown,
 	.driver		= {
 	.driver		= {
 		.name	= DRIVER_NAME,
 		.name	= DRIVER_NAME,
 		.owner	= THIS_MODULE,
 		.owner	= THIS_MODULE,
+		.pm	= &omap_rtc_pm_ops,
 		.of_match_table = of_match_ptr(omap_rtc_of_match),
 		.of_match_table = of_match_ptr(omap_rtc_of_match),
 	},
 	},
 	.id_table	= omap_rtc_devtype,
 	.id_table	= omap_rtc_devtype,
 };
 };
 
 
-static int __init rtc_init(void)
-{
-	return platform_driver_probe(&omap_rtc_driver, omap_rtc_probe);
-}
-module_init(rtc_init);
-
-static void __exit rtc_exit(void)
-{
-	platform_driver_unregister(&omap_rtc_driver);
-}
-module_exit(rtc_exit);
+module_platform_driver_probe(omap_rtc_driver, omap_rtc_probe);
 
 
 MODULE_AUTHOR("George G. Davis (and others)");
 MODULE_AUTHOR("George G. Davis (and others)");
 MODULE_LICENSE("GPL");
 MODULE_LICENSE("GPL");

+ 12 - 7
drivers/rtc/rtc-palmas.c

@@ -30,6 +30,7 @@
 #include <linux/kernel.h>
 #include <linux/kernel.h>
 #include <linux/mfd/palmas.h>
 #include <linux/mfd/palmas.h>
 #include <linux/module.h>
 #include <linux/module.h>
+#include <linux/of.h>
 #include <linux/rtc.h>
 #include <linux/rtc.h>
 #include <linux/types.h>
 #include <linux/types.h>
 #include <linux/platform_device.h>
 #include <linux/platform_device.h>
@@ -264,7 +265,7 @@ static int palmas_rtc_probe(struct platform_device *pdev)
 
 
 	palmas_rtc->irq = platform_get_irq(pdev, 0);
 	palmas_rtc->irq = platform_get_irq(pdev, 0);
 
 
-	palmas_rtc->rtc = rtc_device_register(pdev->name, &pdev->dev,
+	palmas_rtc->rtc = devm_rtc_device_register(&pdev->dev, pdev->name,
 				&palmas_rtc_ops, THIS_MODULE);
 				&palmas_rtc_ops, THIS_MODULE);
 	if (IS_ERR(palmas_rtc->rtc)) {
 	if (IS_ERR(palmas_rtc->rtc)) {
 		ret = PTR_ERR(palmas_rtc->rtc);
 		ret = PTR_ERR(palmas_rtc->rtc);
@@ -272,14 +273,13 @@ static int palmas_rtc_probe(struct platform_device *pdev)
 		return ret;
 		return ret;
 	}
 	}
 
 
-	ret = request_threaded_irq(palmas_rtc->irq, NULL,
+	ret = devm_request_threaded_irq(&pdev->dev, palmas_rtc->irq, NULL,
 			palmas_rtc_interrupt,
 			palmas_rtc_interrupt,
 			IRQF_TRIGGER_LOW | IRQF_ONESHOT |
 			IRQF_TRIGGER_LOW | IRQF_ONESHOT |
 			IRQF_EARLY_RESUME,
 			IRQF_EARLY_RESUME,
 			dev_name(&pdev->dev), palmas_rtc);
 			dev_name(&pdev->dev), palmas_rtc);
 	if (ret < 0) {
 	if (ret < 0) {
 		dev_err(&pdev->dev, "IRQ request failed, err = %d\n", ret);
 		dev_err(&pdev->dev, "IRQ request failed, err = %d\n", ret);
-		rtc_device_unregister(palmas_rtc->rtc);
 		return ret;
 		return ret;
 	}
 	}
 
 
@@ -289,11 +289,7 @@ static int palmas_rtc_probe(struct platform_device *pdev)
 
 
 static int palmas_rtc_remove(struct platform_device *pdev)
 static int palmas_rtc_remove(struct platform_device *pdev)
 {
 {
-	struct palmas_rtc *palmas_rtc = platform_get_drvdata(pdev);
-
 	palmas_rtc_alarm_irq_enable(&pdev->dev, 0);
 	palmas_rtc_alarm_irq_enable(&pdev->dev, 0);
-	free_irq(palmas_rtc->irq, palmas_rtc);
-	rtc_device_unregister(palmas_rtc->rtc);
 	return 0;
 	return 0;
 }
 }
 
 
@@ -321,6 +317,14 @@ static const struct dev_pm_ops palmas_rtc_pm_ops = {
 	SET_SYSTEM_SLEEP_PM_OPS(palmas_rtc_suspend, palmas_rtc_resume)
 	SET_SYSTEM_SLEEP_PM_OPS(palmas_rtc_suspend, palmas_rtc_resume)
 };
 };
 
 
+#ifdef CONFIG_OF
+static struct of_device_id of_palmas_rtc_match[] = {
+	{ .compatible = "ti,palmas-rtc"},
+	{ },
+};
+MODULE_DEVICE_TABLE(of, of_palmas_rtc_match);
+#endif
+
 static struct platform_driver palmas_rtc_driver = {
 static struct platform_driver palmas_rtc_driver = {
 	.probe		= palmas_rtc_probe,
 	.probe		= palmas_rtc_probe,
 	.remove		= palmas_rtc_remove,
 	.remove		= palmas_rtc_remove,
@@ -328,6 +332,7 @@ static struct platform_driver palmas_rtc_driver = {
 		.owner	= THIS_MODULE,
 		.owner	= THIS_MODULE,
 		.name	= "palmas-rtc",
 		.name	= "palmas-rtc",
 		.pm	= &palmas_rtc_pm_ops,
 		.pm	= &palmas_rtc_pm_ops,
+		.of_match_table = of_match_ptr(of_palmas_rtc_match),
 	},
 	},
 };
 };
 
 

+ 16 - 37
drivers/rtc/rtc-pcap.c

@@ -139,13 +139,14 @@ static const struct rtc_class_ops pcap_rtc_ops = {
 	.alarm_irq_enable = pcap_rtc_alarm_irq_enable,
 	.alarm_irq_enable = pcap_rtc_alarm_irq_enable,
 };
 };
 
 
-static int pcap_rtc_probe(struct platform_device *pdev)
+static int __init pcap_rtc_probe(struct platform_device *pdev)
 {
 {
 	struct pcap_rtc *pcap_rtc;
 	struct pcap_rtc *pcap_rtc;
 	int timer_irq, alarm_irq;
 	int timer_irq, alarm_irq;
 	int err = -ENOMEM;
 	int err = -ENOMEM;
 
 
-	pcap_rtc = kmalloc(sizeof(struct pcap_rtc), GFP_KERNEL);
+	pcap_rtc = devm_kzalloc(&pdev->dev, sizeof(struct pcap_rtc),
+				GFP_KERNEL);
 	if (!pcap_rtc)
 	if (!pcap_rtc)
 		return err;
 		return err;
 
 
@@ -153,68 +154,46 @@ static int pcap_rtc_probe(struct platform_device *pdev)
 
 
 	platform_set_drvdata(pdev, pcap_rtc);
 	platform_set_drvdata(pdev, pcap_rtc);
 
 
-	pcap_rtc->rtc = rtc_device_register("pcap", &pdev->dev,
-				  &pcap_rtc_ops, THIS_MODULE);
+	pcap_rtc->rtc = devm_rtc_device_register(&pdev->dev, "pcap",
+					&pcap_rtc_ops, THIS_MODULE);
 	if (IS_ERR(pcap_rtc->rtc)) {
 	if (IS_ERR(pcap_rtc->rtc)) {
 		err = PTR_ERR(pcap_rtc->rtc);
 		err = PTR_ERR(pcap_rtc->rtc);
-		goto fail_rtc;
+		goto fail;
 	}
 	}
 
 
-
 	timer_irq = pcap_to_irq(pcap_rtc->pcap, PCAP_IRQ_1HZ);
 	timer_irq = pcap_to_irq(pcap_rtc->pcap, PCAP_IRQ_1HZ);
 	alarm_irq = pcap_to_irq(pcap_rtc->pcap, PCAP_IRQ_TODA);
 	alarm_irq = pcap_to_irq(pcap_rtc->pcap, PCAP_IRQ_TODA);
 
 
-	err = request_irq(timer_irq, pcap_rtc_irq, 0, "RTC Timer", pcap_rtc);
+	err = devm_request_irq(&pdev->dev, timer_irq, pcap_rtc_irq, 0,
+				"RTC Timer", pcap_rtc);
 	if (err)
 	if (err)
-		goto fail_timer;
+		goto fail;
 
 
-	err = request_irq(alarm_irq, pcap_rtc_irq, 0, "RTC Alarm", pcap_rtc);
+	err = devm_request_irq(&pdev->dev, alarm_irq, pcap_rtc_irq, 0,
+				"RTC Alarm", pcap_rtc);
 	if (err)
 	if (err)
-		goto fail_alarm;
+		goto fail;
 
 
 	return 0;
 	return 0;
-fail_alarm:
-	free_irq(timer_irq, pcap_rtc);
-fail_timer:
-	rtc_device_unregister(pcap_rtc->rtc);
-fail_rtc:
+fail:
 	platform_set_drvdata(pdev, NULL);
 	platform_set_drvdata(pdev, NULL);
-	kfree(pcap_rtc);
 	return err;
 	return err;
 }
 }
 
 
-static int pcap_rtc_remove(struct platform_device *pdev)
+static int __exit pcap_rtc_remove(struct platform_device *pdev)
 {
 {
-	struct pcap_rtc *pcap_rtc = platform_get_drvdata(pdev);
-
-	free_irq(pcap_to_irq(pcap_rtc->pcap, PCAP_IRQ_1HZ), pcap_rtc);
-	free_irq(pcap_to_irq(pcap_rtc->pcap, PCAP_IRQ_TODA), pcap_rtc);
-	rtc_device_unregister(pcap_rtc->rtc);
-	kfree(pcap_rtc);
-
 	return 0;
 	return 0;
 }
 }
 
 
 static struct platform_driver pcap_rtc_driver = {
 static struct platform_driver pcap_rtc_driver = {
-	.remove = pcap_rtc_remove,
+	.remove = __exit_p(pcap_rtc_remove),
 	.driver = {
 	.driver = {
 		.name  = "pcap-rtc",
 		.name  = "pcap-rtc",
 		.owner = THIS_MODULE,
 		.owner = THIS_MODULE,
 	},
 	},
 };
 };
 
 
-static int __init rtc_pcap_init(void)
-{
-	return platform_driver_probe(&pcap_rtc_driver, pcap_rtc_probe);
-}
-
-static void __exit rtc_pcap_exit(void)
-{
-	platform_driver_unregister(&pcap_rtc_driver);
-}
-
-module_init(rtc_pcap_init);
-module_exit(rtc_pcap_exit);
+module_platform_driver_probe(pcap_rtc_driver, pcap_rtc_probe);
 
 
 MODULE_DESCRIPTION("Motorola pcap rtc driver");
 MODULE_DESCRIPTION("Motorola pcap rtc driver");
 MODULE_AUTHOR("guiming zhuo <gmzhuo@gmail.com>");
 MODULE_AUTHOR("guiming zhuo <gmzhuo@gmail.com>");

+ 4 - 8
drivers/rtc/rtc-pcf2123.c

@@ -226,7 +226,8 @@ static int pcf2123_probe(struct spi_device *spi)
 	u8 txbuf[2], rxbuf[2];
 	u8 txbuf[2], rxbuf[2];
 	int ret, i;
 	int ret, i;
 
 
-	pdata = kzalloc(sizeof(struct pcf2123_plat_data), GFP_KERNEL);
+	pdata = devm_kzalloc(&spi->dev, sizeof(struct pcf2123_plat_data),
+				GFP_KERNEL);
 	if (!pdata)
 	if (!pdata)
 		return -ENOMEM;
 		return -ENOMEM;
 	spi->dev.platform_data = pdata;
 	spi->dev.platform_data = pdata;
@@ -265,6 +266,7 @@ static int pcf2123_probe(struct spi_device *spi)
 
 
 	if (!(rxbuf[0] & 0x20)) {
 	if (!(rxbuf[0] & 0x20)) {
 		dev_err(&spi->dev, "chip not found\n");
 		dev_err(&spi->dev, "chip not found\n");
+		ret = -ENODEV;
 		goto kfree_exit;
 		goto kfree_exit;
 	}
 	}
 
 
@@ -281,7 +283,7 @@ static int pcf2123_probe(struct spi_device *spi)
 	pcf2123_delay_trec();
 	pcf2123_delay_trec();
 
 
 	/* Finalize the initialization */
 	/* Finalize the initialization */
-	rtc = rtc_device_register(pcf2123_driver.driver.name, &spi->dev,
+	rtc = devm_rtc_device_register(&spi->dev, pcf2123_driver.driver.name,
 			&pcf2123_rtc_ops, THIS_MODULE);
 			&pcf2123_rtc_ops, THIS_MODULE);
 
 
 	if (IS_ERR(rtc)) {
 	if (IS_ERR(rtc)) {
@@ -314,7 +316,6 @@ sysfs_exit:
 		device_remove_file(&spi->dev, &pdata->regs[i].attr);
 		device_remove_file(&spi->dev, &pdata->regs[i].attr);
 
 
 kfree_exit:
 kfree_exit:
-	kfree(pdata);
 	spi->dev.platform_data = NULL;
 	spi->dev.platform_data = NULL;
 	return ret;
 	return ret;
 }
 }
@@ -325,15 +326,10 @@ static int pcf2123_remove(struct spi_device *spi)
 	int i;
 	int i;
 
 
 	if (pdata) {
 	if (pdata) {
-		struct rtc_device *rtc = pdata->rtc;
-
-		if (rtc)
-			rtc_device_unregister(rtc);
 		for (i = 0; i < 16; i++)
 		for (i = 0; i < 16; i++)
 			if (pdata->regs[i].name[0])
 			if (pdata->regs[i].name[0])
 				device_remove_file(&spi->dev,
 				device_remove_file(&spi->dev,
 						   &pdata->regs[i].attr);
 						   &pdata->regs[i].attr);
-		kfree(pdata);
 	}
 	}
 
 
 	return 0;
 	return 0;

+ 4 - 11
drivers/rtc/rtc-pcf50633.c

@@ -252,20 +252,17 @@ static int pcf50633_rtc_probe(struct platform_device *pdev)
 {
 {
 	struct pcf50633_rtc *rtc;
 	struct pcf50633_rtc *rtc;
 
 
-	rtc = kzalloc(sizeof(*rtc), GFP_KERNEL);
+	rtc = devm_kzalloc(&pdev->dev, sizeof(*rtc), GFP_KERNEL);
 	if (!rtc)
 	if (!rtc)
 		return -ENOMEM;
 		return -ENOMEM;
 
 
 	rtc->pcf = dev_to_pcf50633(pdev->dev.parent);
 	rtc->pcf = dev_to_pcf50633(pdev->dev.parent);
 	platform_set_drvdata(pdev, rtc);
 	platform_set_drvdata(pdev, rtc);
-	rtc->rtc_dev = rtc_device_register("pcf50633-rtc", &pdev->dev,
+	rtc->rtc_dev = devm_rtc_device_register(&pdev->dev, "pcf50633-rtc",
 				&pcf50633_rtc_ops, THIS_MODULE);
 				&pcf50633_rtc_ops, THIS_MODULE);
 
 
-	if (IS_ERR(rtc->rtc_dev)) {
-		int ret =  PTR_ERR(rtc->rtc_dev);
-		kfree(rtc);
-		return ret;
-	}
+	if (IS_ERR(rtc->rtc_dev))
+		return PTR_ERR(rtc->rtc_dev);
 
 
 	pcf50633_register_irq(rtc->pcf, PCF50633_IRQ_ALARM,
 	pcf50633_register_irq(rtc->pcf, PCF50633_IRQ_ALARM,
 					pcf50633_rtc_irq, rtc);
 					pcf50633_rtc_irq, rtc);
@@ -277,12 +274,8 @@ static int pcf50633_rtc_remove(struct platform_device *pdev)
 	struct pcf50633_rtc *rtc;
 	struct pcf50633_rtc *rtc;
 
 
 	rtc = platform_get_drvdata(pdev);
 	rtc = platform_get_drvdata(pdev);
-
 	pcf50633_free_irq(rtc->pcf, PCF50633_IRQ_ALARM);
 	pcf50633_free_irq(rtc->pcf, PCF50633_IRQ_ALARM);
 
 
-	rtc_device_unregister(rtc->rtc_dev);
-	kfree(rtc);
-
 	return 0;
 	return 0;
 }
 }
 
 

+ 1 - 5
drivers/rtc/rtc-pcf8523.c

@@ -307,7 +307,7 @@ static int pcf8523_probe(struct i2c_client *client,
 	if (err < 0)
 	if (err < 0)
 		return err;
 		return err;
 
 
-	pcf->rtc = rtc_device_register(DRIVER_NAME, &client->dev,
+	pcf->rtc = devm_rtc_device_register(&client->dev, DRIVER_NAME,
 				       &pcf8523_rtc_ops, THIS_MODULE);
 				       &pcf8523_rtc_ops, THIS_MODULE);
 	if (IS_ERR(pcf->rtc))
 	if (IS_ERR(pcf->rtc))
 		return PTR_ERR(pcf->rtc);
 		return PTR_ERR(pcf->rtc);
@@ -319,10 +319,6 @@ static int pcf8523_probe(struct i2c_client *client,
 
 
 static int pcf8523_remove(struct i2c_client *client)
 static int pcf8523_remove(struct i2c_client *client)
 {
 {
-	struct pcf8523 *pcf = i2c_get_clientdata(client);
-
-	rtc_device_unregister(pcf->rtc);
-
 	return 0;
 	return 0;
 }
 }
 
 

部分文件因为文件数量过多而无法显示