فهرست منبع

Merge tag 'cleanup-for-3.16' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc into next

Pull ARM SoC cleanups from Olof Johansson:
 "Cleanups for 3.16.  Among these are:

   - a bunch of misc cleanups for Broadcom platforms, mostly
     housekeeping
   - enabling Common Clock Framework on the older s3c24xx Samsung
     chipsets
   - cleanup of the Versatile Express system controller code, moving it
     to syscon
   - power management cleanups for OMAP platforms

  plus a handful of other cleanups across the place"

* tag 'cleanup-for-3.16' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc: (87 commits)
  ARM: kconfig: allow PCI support to be selected with ARCH_MULTIPLATFORM
  clk: samsung: fix build error
  ARM: vexpress: refine dependencies for new code
  clk: samsung: clk-s3c2410-dlck: do not use PNAME macro as it declares __initdata
  cpufreq: exynos: Fix the compile error
  ARM: S3C24XX: move debug-macro.S into the common space
  ARM: S3C24XX: use generic DEBUG_UART_PHY/_VIRT in debug macro
  ARM: S3C24XX: trim down debug uart handling
  ARM: compressed/head.S: remove s3c24xx special case
  ARM: EXYNOS: Remove unnecessary inclusion of cpu.h
  ARM: EXYNOS: Migrate Exynos specific macros from plat to mach
  ARM: EXYNOS: Remove exynos_subsys registration
  ARM: EXYNOS: Remove duplicate lines in Makefile
  ARM: EXYNOS: use v7_exit_coherency_flush macro for cache disabling
  ARM: OMAP4: PRCM: remove references to cm-regbits-44xx.h from PRCM core files
  ARM: OMAP3/4: PRM: add support of late_init call to prm_ll_ops
  ARM: OMAP3/OMAP4: PRM: add prm_features flags and add IO wakeup under it
  ARM: OMAP3/4: PRM: provide io chain reconfig function through irq setup
  ARM: OMAP2+: PRM: remove unnecessary cpu_is_XXX calls from prm_init / exit
  ARM: OMAP2+: PRCM: cleanup some header includes
  ...
Linus Torvalds 11 سال پیش
والد
کامیت
0a58471541
100فایلهای تغییر یافته به همراه1048 افزوده شده و 529 حذف شده
  1. 66 13
      Documentation/devicetree/bindings/arm/vexpress-sysreg.txt
  2. 10 5
      Documentation/devicetree/bindings/arm/vexpress.txt
  3. 50 0
      Documentation/devicetree/bindings/clock/samsung,s3c2410-clock.txt
  4. 50 0
      Documentation/devicetree/bindings/clock/samsung,s3c2412-clock.txt
  5. 56 0
      Documentation/devicetree/bindings/clock/samsung,s3c2443-clock.txt
  6. 1 0
      arch/arm/Kconfig
  7. 52 2
      arch/arm/Kconfig.debug
  8. 0 5
      arch/arm/boot/compressed/head.S
  9. 1 0
      arch/arm/boot/dts/atlas6.dtsi
  10. 1 0
      arch/arm/boot/dts/prima2.dtsi
  11. 13 0
      arch/arm/boot/dts/s3c2416-smdk2416.dts
  12. 42 0
      arch/arm/boot/dts/s3c2416.dtsi
  13. 72 4
      arch/arm/boot/dts/vexpress-v2m-rs1.dtsi
  14. 72 4
      arch/arm/boot/dts/vexpress-v2m.dtsi
  15. 3 2
      arch/arm/boot/dts/vexpress-v2p-ca15_a7.dts
  16. 2 0
      arch/arm/configs/realview-smp_defconfig
  17. 2 0
      arch/arm/configs/realview_defconfig
  18. 3 0
      arch/arm/configs/versatile_defconfig
  19. 46 0
      arch/arm/include/debug/s3c24xx.S
  20. 35 14
      arch/arm/mach-bcm/Kconfig
  21. 17 4
      arch/arm/mach-bcm/Makefile
  22. 98 38
      arch/arm/mach-bcm/bcm_kona_smc.c
  23. 2 50
      arch/arm/mach-bcm/bcm_kona_smc.h
  24. 0 41
      arch/arm/mach-bcm/bcm_kona_smc_asm.S
  25. 2 3
      arch/arm/mach-bcm/board_bcm21664.c
  26. 1 1
      arch/arm/mach-bcm/board_bcm281xx.c
  27. 10 6
      arch/arm/mach-bcm/kona_l2_cache.c
  28. 5 1
      arch/arm/mach-bcm/kona_l2_cache.h
  29. 0 1
      arch/arm/mach-cns3xxx/Kconfig
  30. 1 6
      arch/arm/mach-exynos/Makefile
  31. 72 0
      arch/arm/mach-exynos/common.h
  32. 0 1
      arch/arm/mach-exynos/cpuidle.c
  33. 0 13
      arch/arm/mach-exynos/exynos.c
  34. 1 2
      arch/arm/mach-exynos/firmware.c
  35. 1 64
      arch/arm/mach-exynos/hotplug.c
  36. 0 2
      arch/arm/mach-exynos/platsmp.c
  37. 0 1
      arch/arm/mach-exynos/pm.c
  38. 0 2
      arch/arm/mach-exynos/pmu.c
  39. 0 1
      arch/arm/mach-imx/Kconfig
  40. 0 7
      arch/arm/mach-mvebu/Kconfig
  41. 2 2
      arch/arm/mach-omap2/board-flash.c
  42. 1 1
      arch/arm/mach-omap2/clkt2xxx_dpllcore.c
  43. 4 4
      arch/arm/mach-omap2/clkt2xxx_osc.c
  44. 1 1
      arch/arm/mach-omap2/clkt2xxx_sys.c
  45. 2 1
      arch/arm/mach-omap2/clockdomain.h
  46. 2 13
      arch/arm/mach-omap2/cm2xxx.c
  47. 2 2
      arch/arm/mach-omap2/cm2xxx_3xxx.h
  48. 2 2
      arch/arm/mach-omap2/cm33xx.c
  49. 0 3
      arch/arm/mach-omap2/cm33xx.h
  50. 9 16
      arch/arm/mach-omap2/cm3xxx.c
  51. 2 3
      arch/arm/mach-omap2/cm3xxx.h
  52. 4 7
      arch/arm/mach-omap2/cm44xx.c
  53. 1 1
      arch/arm/mach-omap2/cm_common.c
  54. 9 5
      arch/arm/mach-omap2/cminst44xx.c
  55. 10 10
      arch/arm/mach-omap2/control.c
  56. 2 2
      arch/arm/mach-omap2/dma.c
  57. 4 4
      arch/arm/mach-omap2/gpmc.c
  58. 1 1
      arch/arm/mach-omap2/id.c
  59. 2 2
      arch/arm/mach-omap2/irq.c
  60. 4 4
      arch/arm/mach-omap2/mux.c
  61. 2 2
      arch/arm/mach-omap2/omap-hotplug.c
  62. 9 9
      arch/arm/mach-omap2/omap-mpuss-lowpower.c
  63. 3 3
      arch/arm/mach-omap2/omap-smp.c
  64. 21 21
      arch/arm/mach-omap2/omap-wakeupgen.c
  65. 9 9
      arch/arm/mach-omap2/omap4-common.c
  66. 5 5
      arch/arm/mach-omap2/omap_hwmod.c
  67. 1 0
      arch/arm/mach-omap2/omap_hwmod_33xx_43xx_ipblock_data.c
  68. 3 3
      arch/arm/mach-omap2/omap_phy_internal.c
  69. 0 1
      arch/arm/mach-omap2/powerdomain-common.c
  70. 1 0
      arch/arm/mach-omap2/powerdomain.c
  71. 1 2
      arch/arm/mach-omap2/powerdomain.h
  72. 24 0
      arch/arm/mach-omap2/prcm-common.h
  73. 2 2
      arch/arm/mach-omap2/prcm_mpu44xx.c
  74. 0 1
      arch/arm/mach-omap2/prcm_mpu44xx.h
  75. 10 0
      arch/arm/mach-omap2/prm.h
  76. 1 12
      arch/arm/mach-omap2/prm2xxx.c
  77. 1 1
      arch/arm/mach-omap2/prm2xxx.h
  78. 0 1
      arch/arm/mach-omap2/prm2xxx_3xxx.c
  79. 2 2
      arch/arm/mach-omap2/prm2xxx_3xxx.h
  80. 2 3
      arch/arm/mach-omap2/prm33xx.c
  81. 10 12
      arch/arm/mach-omap2/prm3xxx.c
  82. 1 1
      arch/arm/mach-omap2/prm3xxx.h
  83. 11 13
      arch/arm/mach-omap2/prm44xx.c
  84. 11 6
      arch/arm/mach-omap2/prm_common.c
  85. 2 2
      arch/arm/mach-omap2/prminst44xx.c
  86. 4 4
      arch/arm/mach-omap2/sdrc.h
  87. 2 2
      arch/arm/mach-omap2/sdrc2xxx.c
  88. 1 1
      arch/arm/mach-omap2/sr_device.c
  89. 8 8
      arch/arm/mach-omap2/sram.c
  90. 4 4
      arch/arm/mach-omap2/timer.c
  91. 2 2
      arch/arm/mach-omap2/vc.c
  92. 4 4
      arch/arm/mach-omap2/wd_timer.c
  93. 20 14
      arch/arm/mach-prima2/rstc.c
  94. 0 2
      arch/arm/mach-qcom/Kconfig
  95. 15 0
      arch/arm/mach-realview/core.c
  96. 1 0
      arch/arm/mach-realview/core.h
  97. 1 0
      arch/arm/mach-realview/realview_eb.c
  98. 1 0
      arch/arm/mach-realview/realview_pb1176.c
  99. 1 0
      arch/arm/mach-realview/realview_pb11mp.c
  100. 1 0
      arch/arm/mach-realview/realview_pba8.c

+ 66 - 13
Documentation/devicetree/bindings/arm/vexpress-sysreg.txt

@@ -8,6 +8,8 @@ interrupt generation, MMC and NOR Flash control etc.
 Required node properties:
 Required node properties:
 - compatible value : = "arm,vexpress,sysreg";
 - compatible value : = "arm,vexpress,sysreg";
 - reg : physical base address and the size of the registers window
 - reg : physical base address and the size of the registers window
+
+Deprecated properties, replaced by GPIO subnodes (see below):
 - gpio-controller : specifies that the node is a GPIO controller
 - gpio-controller : specifies that the node is a GPIO controller
 - #gpio-cells : size of the GPIO specifier, should be 2:
 - #gpio-cells : size of the GPIO specifier, should be 2:
   - first cell is the pseudo-GPIO line number:
   - first cell is the pseudo-GPIO line number:
@@ -16,35 +18,86 @@ Required node properties:
     2 - NOR FLASH WPn
     2 - NOR FLASH WPn
   - second cell can take standard GPIO flags (currently ignored).
   - second cell can take standard GPIO flags (currently ignored).
 
 
+Control registers providing pseudo-GPIO lines must be represented
+by subnodes, each of them requiring the following properties:
+- compatible value : one of
+			"arm,vexpress-sysreg,sys_led"
+			"arm,vexpress-sysreg,sys_mci"
+			"arm,vexpress-sysreg,sys_flash"
+- gpio-controller : makes the node a GPIO controller
+- #gpio-cells : size of the GPIO specifier, must be 2:
+  - first cell is the function number:
+    - for sys_led : 0..7 = LED 0..7
+    - for sys_mci : 0 = MMC CARDIN, 1 = MMC WPROT
+    - for sys_flash : 0 = NOR FLASH WPn
+  - second cell can take standard GPIO flags (currently ignored).
+
 Example:
 Example:
 	v2m_sysreg: sysreg@10000000 {
 	v2m_sysreg: sysreg@10000000 {
  		compatible = "arm,vexpress-sysreg";
  		compatible = "arm,vexpress-sysreg";
  		reg = <0x10000000 0x1000>;
  		reg = <0x10000000 0x1000>;
-		gpio-controller;
-		#gpio-cells = <2>;
+
+		v2m_led_gpios: sys_led@08 {
+			compatible = "arm,vexpress-sysreg,sys_led";
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		v2m_mmc_gpios: sys_mci@48 {
+			compatible = "arm,vexpress-sysreg,sys_mci";
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		v2m_flash_gpios: sys_flash@4c {
+			compatible = "arm,vexpress-sysreg,sys_flash";
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
  	};
  	};
 
 
 This block also can also act a bridge to the platform's configuration
 This block also can also act a bridge to the platform's configuration
 bus via "system control" interface, addressing devices with site number,
 bus via "system control" interface, addressing devices with site number,
 position in the board stack, config controller, function and device
 position in the board stack, config controller, function and device
-numbers - see motherboard's TRM for more details.
-
-The node describing a config device must refer to the sysreg node via
-"arm,vexpress,config-bridge" phandle (can be also defined in the node's
-parent) and relies on the board topology properties - see main vexpress
-node documentation for more details. It must also define the following
-property:
-- arm,vexpress-sysreg,func : must contain two cells:
-  - first cell defines function number (eg. 1 for clock generator,
-    2 for voltage regulators etc.)
-  - device number (eg. osc 0, osc 1 etc.)
+numbers - see motherboard's TRM for more details. All configuration
+controller accessible via this interface must reference the sysreg
+node via "arm,vexpress,config-bridge" phandle and define appropriate
+topology properties - see main vexpress node documentation for more
+details. Each child of such node describes one function and must
+define the following properties:
+- compatible value : must be one of (corresponding to the TRM):
+	"arm,vexpress-amp"
+	"arm,vexpress-dvimode"
+	"arm,vexpress-energy"
+	"arm,vexpress-muxfpga"
+	"arm,vexpress-osc"
+	"arm,vexpress-power"
+	"arm,vexpress-reboot"
+	"arm,vexpress-reset"
+	"arm,vexpress-scc"
+	"arm,vexpress-shutdown"
+	"arm,vexpress-temp"
+	"arm,vexpress-volt"
+- arm,vexpress-sysreg,func : must contain a set of two cells long groups:
+  - first cell of each group defines the function number
+    (eg. 1 for clock generator, 2 for voltage regulators etc.)
+  - second cell of each group defines device number (eg. osc 0,
+    osc 1 etc.)
+  - some functions (eg. energy meter, with its 64 bit long counter)
+    are using more than one function/device number pair
 
 
 Example:
 Example:
 	mcc {
 	mcc {
+		compatible = "arm,vexpress,config-bus";
 		arm,vexpress,config-bridge = <&v2m_sysreg>;
 		arm,vexpress,config-bridge = <&v2m_sysreg>;
 
 
 		osc@0 {
 		osc@0 {
 			compatible = "arm,vexpress-osc";
 			compatible = "arm,vexpress-osc";
 			arm,vexpress-sysreg,func = <1 0>;
 			arm,vexpress-sysreg,func = <1 0>;
 		};
 		};
+
+		energy@0 {
+			compatible = "arm,vexpress-energy";
+			arm,vexpress-sysreg,func = <13 0>, <13 1>;
+		};
 	};
 	};

+ 10 - 5
Documentation/devicetree/bindings/arm/vexpress.txt

@@ -80,12 +80,17 @@ but also control clock generators, voltage regulators, gather
 environmental data like temperature, power consumption etc. Even
 environmental data like temperature, power consumption etc. Even
 the video output switch (FPGA) is controlled that way.
 the video output switch (FPGA) is controlled that way.
 
 
-Nodes describing devices controlled by this infrastructure should
-point at the bridge device node:
+The controllers are not mapped into normal memory address space
+and must be accessed through bridges - other devices capable
+of generating transactions on the configuration bus.
+
+The nodes describing configuration controllers must define
+the following properties:
+- compatible value:
+	compatible = "arm,vexpress,config-bus";
 - bridge phandle:
 - bridge phandle:
 	arm,vexpress,config-bridge = <phandle>;
 	arm,vexpress,config-bridge = <phandle>;
-This property can be also defined in a parent node (eg. for a DCC)
-and is effective for all children.
+and children describing available functions.
 
 
 
 
 Platform topology
 Platform topology
@@ -197,7 +202,7 @@ Example of a VE tile description (simplified)
 	};
 	};
 
 
 	dcc {
 	dcc {
-		compatible = "simple-bus";
+		compatible = "arm,vexpress,config-bus";
 		arm,vexpress,config-bridge = <&v2m_sysreg>;
 		arm,vexpress,config-bridge = <&v2m_sysreg>;
 
 
 		osc@0 {
 		osc@0 {

+ 50 - 0
Documentation/devicetree/bindings/clock/samsung,s3c2410-clock.txt

@@ -0,0 +1,50 @@
+* Samsung S3C2410 Clock Controller
+
+The S3C2410 clock controller generates and supplies clock to various controllers
+within the SoC. The clock binding described here is applicable to the s3c2410,
+s3c2440 and s3c2442 SoCs in the s3c24x family.
+
+Required Properties:
+
+- compatible: should be one of the following.
+  - "samsung,s3c2410-clock" - controller compatible with S3C2410 SoC.
+  - "samsung,s3c2440-clock" - controller compatible with S3C2440 SoC.
+  - "samsung,s3c2442-clock" - controller compatible with S3C2442 SoC.
+- reg: physical base address of the controller and length of memory mapped
+  region.
+- #clock-cells: should be 1.
+
+Each clock is assigned an identifier and client nodes can use this identifier
+to specify the clock which they consume. Some of the clocks are available only
+on a particular SoC.
+
+All available clocks are defined as preprocessor macros in
+dt-bindings/clock/samsung,s3c2410-clock.h header and can be used in device
+tree sources.
+
+External clocks:
+
+The xti clock used as input for the plls is generated outside the SoC. It is
+expected that is are defined using standard clock bindings with a
+clock-output-names value of "xti".
+
+Example: Clock controller node:
+
+	clocks: clock-controller@4c000000 {
+		compatible = "samsung,s3c2410-clock";
+		reg = <0x4c000000 0x20>;
+		#clock-cells = <1>;
+	};
+
+Example: UART controller node that consumes the clock generated by the clock
+  controller (refer to the standard clock bindings for information about
+  "clocks" and "clock-names" properties):
+
+	serial@50004000 {
+		compatible = "samsung,s3c2440-uart";
+		reg = <0x50004000 0x4000>;
+		interrupts = <1 23 3 4>, <1 23 4 4>;
+		clock-names = "uart", "clk_uart_baud2";
+		clocks = <&clocks PCLK_UART0>, <&clocks PCLK_UART0>;
+		status = "disabled";
+	};

+ 50 - 0
Documentation/devicetree/bindings/clock/samsung,s3c2412-clock.txt

@@ -0,0 +1,50 @@
+* Samsung S3C2412 Clock Controller
+
+The S3C2412 clock controller generates and supplies clock to various controllers
+within the SoC. The clock binding described here is applicable to the s3c2412
+and s3c2413 SoCs in the s3c24x family.
+
+Required Properties:
+
+- compatible: should be "samsung,s3c2412-clock"
+- reg: physical base address of the controller and length of memory mapped
+  region.
+- #clock-cells: should be 1.
+
+Each clock is assigned an identifier and client nodes can use this identifier
+to specify the clock which they consume. Some of the clocks are available only
+on a particular SoC.
+
+All available clocks are defined as preprocessor macros in
+dt-bindings/clock/s3c2412.h header and can be used in device
+tree sources.
+
+External clocks:
+
+There are several clocks that are generated outside the SoC. It is expected
+that they are defined using standard clock bindings with following
+clock-output-names:
+ - "xti" - crystal input - required,
+ - "ext" - external clock source - optional,
+
+Example: Clock controller node:
+
+	clocks: clock-controller@4c000000 {
+		compatible = "samsung,s3c2412-clock";
+		reg = <0x4c000000 0x20>;
+		#clock-cells = <1>;
+	};
+
+Example: UART controller node that consumes the clock generated by the clock
+  controller (refer to the standard clock bindings for information about
+  "clocks" and "clock-names" properties):
+
+	serial@50004000 {
+		compatible = "samsung,s3c2412-uart";
+		reg = <0x50004000 0x4000>;
+		interrupts = <1 23 3 4>, <1 23 4 4>;
+		clock-names = "uart", "clk_uart_baud2", "clk_uart_baud3";
+		clocks = <&clocks PCLK_UART0>, <&clocks PCLK_UART0>,
+			 <&clocks SCLK_UART>;
+		status = "disabled";
+	};

+ 56 - 0
Documentation/devicetree/bindings/clock/samsung,s3c2443-clock.txt

@@ -0,0 +1,56 @@
+* Samsung S3C2443 Clock Controller
+
+The S3C2443 clock controller generates and supplies clock to various controllers
+within the SoC. The clock binding described here is applicable to all SoCs in
+the s3c24x family starting with the s3c2443.
+
+Required Properties:
+
+- compatible: should be one of the following.
+  - "samsung,s3c2416-clock" - controller compatible with S3C2416 SoC.
+  - "samsung,s3c2443-clock" - controller compatible with S3C2443 SoC.
+  - "samsung,s3c2450-clock" - controller compatible with S3C2450 SoC.
+- reg: physical base address of the controller and length of memory mapped
+  region.
+- #clock-cells: should be 1.
+
+Each clock is assigned an identifier and client nodes can use this identifier
+to specify the clock which they consume. Some of the clocks are available only
+on a particular SoC.
+
+All available clocks are defined as preprocessor macros in
+dt-bindings/clock/s3c2443.h header and can be used in device
+tree sources.
+
+External clocks:
+
+There are several clocks that are generated outside the SoC. It is expected
+that they are defined using standard clock bindings with following
+clock-output-names:
+ - "xti" - crystal input - required,
+ - "ext" - external clock source - optional,
+ - "ext_i2s" - external I2S clock - optional,
+ - "ext_uart" - external uart clock - optional,
+
+Example: Clock controller node:
+
+	clocks: clock-controller@4c000000 {
+		compatible = "samsung,s3c2416-clock";
+		reg = <0x4c000000 0x40>;
+		#clock-cells = <1>;
+	};
+
+Example: UART controller node that consumes the clock generated by the clock
+  controller (refer to the standard clock bindings for information about
+  "clocks" and "clock-names" properties):
+
+	serial@50004000 {
+		compatible = "samsung,s3c2440-uart";
+		reg = <0x50004000 0x4000>;
+		interrupts = <1 23 3 4>, <1 23 4 4>;
+		clock-names = "uart", "clk_uart_baud2",
+				"clk_uart_baud3";
+		clocks = <&clocks PCLK_UART0>, <&clocks PCLK_UART0>,
+				<&clocks SCLK_UART>;
+		status = "disabled";
+	};

+ 1 - 0
arch/arm/Kconfig

@@ -314,6 +314,7 @@ config ARCH_MULTIPLATFORM
 	select CLKSRC_OF
 	select CLKSRC_OF
 	select COMMON_CLK
 	select COMMON_CLK
 	select GENERIC_CLOCKEVENTS
 	select GENERIC_CLOCKEVENTS
+	select MIGHT_HAVE_PCI
 	select MULTI_IRQ_HANDLER
 	select MULTI_IRQ_HANDLER
 	select SPARSE_IRQ
 	select SPARSE_IRQ
 	select USE_OF
 	select USE_OF

+ 52 - 2
arch/arm/Kconfig.debug

@@ -625,6 +625,7 @@ choice
 	config DEBUG_S3C_UART0
 	config DEBUG_S3C_UART0
 		depends on PLAT_SAMSUNG
 		depends on PLAT_SAMSUNG
 		select DEBUG_EXYNOS_UART if ARCH_EXYNOS
 		select DEBUG_EXYNOS_UART if ARCH_EXYNOS
+		select DEBUG_S3C24XX_UART if ARCH_S3C24XX
 		bool "Use S3C UART 0 for low-level debug"
 		bool "Use S3C UART 0 for low-level debug"
 		help
 		help
 		  Say Y here if you want the debug print routines to direct
 		  Say Y here if you want the debug print routines to direct
@@ -637,6 +638,7 @@ choice
 	config DEBUG_S3C_UART1
 	config DEBUG_S3C_UART1
 		depends on PLAT_SAMSUNG
 		depends on PLAT_SAMSUNG
 		select DEBUG_EXYNOS_UART if ARCH_EXYNOS
 		select DEBUG_EXYNOS_UART if ARCH_EXYNOS
+		select DEBUG_S3C24XX_UART if ARCH_S3C24XX
 		bool "Use S3C UART 1 for low-level debug"
 		bool "Use S3C UART 1 for low-level debug"
 		help
 		help
 		  Say Y here if you want the debug print routines to direct
 		  Say Y here if you want the debug print routines to direct
@@ -649,6 +651,7 @@ choice
 	config DEBUG_S3C_UART2
 	config DEBUG_S3C_UART2
 		depends on PLAT_SAMSUNG
 		depends on PLAT_SAMSUNG
 		select DEBUG_EXYNOS_UART if ARCH_EXYNOS
 		select DEBUG_EXYNOS_UART if ARCH_EXYNOS
+		select DEBUG_S3C24XX_UART if ARCH_S3C24XX
 		bool "Use S3C UART 2 for low-level debug"
 		bool "Use S3C UART 2 for low-level debug"
 		help
 		help
 		  Say Y here if you want the debug print routines to direct
 		  Say Y here if you want the debug print routines to direct
@@ -670,6 +673,33 @@ choice
 		  The uncompressor code port configuration is now handled
 		  The uncompressor code port configuration is now handled
 		  by CONFIG_S3C_LOWLEVEL_UART_PORT.
 		  by CONFIG_S3C_LOWLEVEL_UART_PORT.
 
 
+	config DEBUG_S3C2410_UART0
+		depends on ARCH_S3C24XX
+		select DEBUG_S3C2410_UART
+		bool "Use S3C2410/S3C2412 UART 0 for low-level debug"
+		help
+		  Say Y here if you want the debug print routines to direct
+		  their output to UART 0. The port must have been initialised
+		  by the boot-loader before use.
+
+	config DEBUG_S3C2410_UART1
+		depends on ARCH_S3C24XX
+		select DEBUG_S3C2410_UART
+		bool "Use S3C2410/S3C2412 UART 1 for low-level debug"
+		help
+		  Say Y here if you want the debug print routines to direct
+		  their output to UART 1. The port must have been initialised
+		  by the boot-loader before use.
+
+	config DEBUG_S3C2410_UART2
+		depends on ARCH_S3C24XX
+		select DEBUG_S3C2410_UART
+		bool "Use S3C2410/S3C2412 UART 2 for low-level debug"
+		help
+		  Say Y here if you want the debug print routines to direct
+		  their output to UART 2. The port must have been initialised
+		  by the boot-loader before use.
+
 	config DEBUG_SOCFPGA_UART
 	config DEBUG_SOCFPGA_UART
 		depends on ARCH_SOCFPGA
 		depends on ARCH_SOCFPGA
 		bool "Use SOCFPGA UART for low-level debug"
 		bool "Use SOCFPGA UART for low-level debug"
@@ -921,6 +951,13 @@ endchoice
 config DEBUG_EXYNOS_UART
 config DEBUG_EXYNOS_UART
 	bool
 	bool
 
 
+config DEBUG_S3C2410_UART
+	bool
+	select DEBUG_S3C24XX_UART
+
+config DEBUG_S3C24XX_UART
+	bool
+
 config DEBUG_OMAP2PLUS_UART
 config DEBUG_OMAP2PLUS_UART
 	bool
 	bool
 	depends on ARCH_OMAP2PLUS
 	depends on ARCH_OMAP2PLUS
@@ -973,6 +1010,7 @@ config DEBUG_LL_INCLUDE
 				 DEBUG_IMX6SL_UART
 				 DEBUG_IMX6SL_UART
 	default "debug/msm.S" if DEBUG_MSM_UART
 	default "debug/msm.S" if DEBUG_MSM_UART
 	default "debug/omap2plus.S" if DEBUG_OMAP2PLUS_UART
 	default "debug/omap2plus.S" if DEBUG_OMAP2PLUS_UART
+	default "debug/s3c24xx.S" if DEBUG_S3C24XX_UART
 	default "debug/sirf.S" if DEBUG_SIRFPRIMA2_UART1 || DEBUG_SIRFMARCO_UART1
 	default "debug/sirf.S" if DEBUG_SIRFPRIMA2_UART1 || DEBUG_SIRFMARCO_UART1
 	default "debug/sti.S" if DEBUG_STI_UART
 	default "debug/sti.S" if DEBUG_STI_UART
 	default "debug/tegra.S" if DEBUG_TEGRA_UART
 	default "debug/tegra.S" if DEBUG_TEGRA_UART
@@ -1029,6 +1067,12 @@ config DEBUG_UART_PHYS
 	default 0x40090000 if ARCH_LPC32XX
 	default 0x40090000 if ARCH_LPC32XX
 	default 0x40100000 if DEBUG_PXA_UART1
 	default 0x40100000 if DEBUG_PXA_UART1
 	default 0x42000000 if ARCH_GEMINI
 	default 0x42000000 if ARCH_GEMINI
+	default 0x50000000 if DEBUG_S3C24XX_UART && (DEBUG_S3C_UART0 || \
+				DEBUG_S3C2410_UART0)
+	default 0x50004000 if DEBUG_S3C24XX_UART && (DEBUG_S3C_UART1 || \
+				DEBUG_S3C2410_UART1)
+	default 0x50008000 if DEBUG_S3C24XX_UART && (DEBUG_S3C_UART2 || \
+				DEBUG_S3C2410_UART2)
 	default 0x7c0003f8 if FOOTBRIDGE
 	default 0x7c0003f8 if FOOTBRIDGE
 	default 0x80070000 if DEBUG_IMX23_UART
 	default 0x80070000 if DEBUG_IMX23_UART
 	default 0x80074000 if DEBUG_IMX28_UART
 	default 0x80074000 if DEBUG_IMX28_UART
@@ -1058,7 +1102,7 @@ config DEBUG_UART_PHYS
 	default 0xfffff700 if ARCH_IOP33X
 	default 0xfffff700 if ARCH_IOP33X
 	depends on DEBUG_LL_UART_8250 || DEBUG_LL_UART_PL01X || \
 	depends on DEBUG_LL_UART_8250 || DEBUG_LL_UART_PL01X || \
 		DEBUG_LL_UART_EFM32 || \
 		DEBUG_LL_UART_EFM32 || \
-		DEBUG_UART_8250 || DEBUG_UART_PL01X
+		DEBUG_UART_8250 || DEBUG_UART_PL01X || DEBUG_S3C24XX_UART
 
 
 config DEBUG_UART_VIRT
 config DEBUG_UART_VIRT
 	hex "Virtual base address of debug UART"
 	hex "Virtual base address of debug UART"
@@ -1075,6 +1119,12 @@ config DEBUG_UART_VIRT
 	default 0xf2100000 if DEBUG_PXA_UART1
 	default 0xf2100000 if DEBUG_PXA_UART1
 	default 0xf4090000 if ARCH_LPC32XX
 	default 0xf4090000 if ARCH_LPC32XX
 	default 0xf4200000 if ARCH_GEMINI
 	default 0xf4200000 if ARCH_GEMINI
+	default 0xf7000000 if DEBUG_S3C24XX_UART && (DEBUG_S3C_UART0 || \
+				DEBUG_S3C2410_UART0)
+	default 0xf7004000 if DEBUG_S3C24XX_UART && (DEBUG_S3C_UART1 || \
+				DEBUG_S3C2410_UART1)
+	default 0xf7008000 if DEBUG_S3C24XX_UART && (DEBUG_S3C_UART2 || \
+				DEBUG_S3C2410_UART2)
 	default 0xf7fc9000 if DEBUG_BERLIN_UART
 	default 0xf7fc9000 if DEBUG_BERLIN_UART
 	default 0xf8009000 if DEBUG_VEXPRESS_UART0_CA9
 	default 0xf8009000 if DEBUG_VEXPRESS_UART0_CA9
 	default 0xf8090000 if DEBUG_VEXPRESS_UART0_RS1
 	default 0xf8090000 if DEBUG_VEXPRESS_UART0_RS1
@@ -1116,7 +1166,7 @@ config DEBUG_UART_VIRT
 	default 0xff003000 if DEBUG_U300_UART
 	default 0xff003000 if DEBUG_U300_UART
 	default DEBUG_UART_PHYS if !MMU
 	default DEBUG_UART_PHYS if !MMU
 	depends on DEBUG_LL_UART_8250 || DEBUG_LL_UART_PL01X || \
 	depends on DEBUG_LL_UART_8250 || DEBUG_LL_UART_PL01X || \
-		DEBUG_UART_8250 || DEBUG_UART_PL01X
+		DEBUG_UART_8250 || DEBUG_UART_PL01X || DEBUG_S3C24XX_UART
 
 
 config DEBUG_UART_8250_SHIFT
 config DEBUG_UART_8250_SHIFT
 	int "Register offset shift for the 8250 debug UART"
 	int "Register offset shift for the 8250 debug UART"

+ 0 - 5
arch/arm/boot/compressed/head.S

@@ -60,11 +60,6 @@
 		add	\rb, \rb, #0x00010000	@ Ser1
 		add	\rb, \rb, #0x00010000	@ Ser1
 #endif
 #endif
 		.endm
 		.endm
-#elif defined(CONFIG_ARCH_S3C24XX)
-		.macro loadsp, rb, tmp
-		mov	\rb, #0x50000000
-		add	\rb, \rb, #0x4000 * CONFIG_S3C_LOWLEVEL_UART_PORT
-		.endm
 #else
 #else
 		.macro	loadsp,	rb, tmp
 		.macro	loadsp,	rb, tmp
 		addruart \rb, \tmp
 		addruart \rb, \tmp

+ 1 - 0
arch/arm/boot/dts/atlas6.dtsi

@@ -195,6 +195,7 @@
 				compatible = "sirf,prima2-tick";
 				compatible = "sirf,prima2-tick";
 				reg = <0xb0020000 0x1000>;
 				reg = <0xb0020000 0x1000>;
 				interrupts = <0>;
 				interrupts = <0>;
+				clocks = <&clks 11>;
 			};
 			};
 
 
 			nand@b0030000 {
 			nand@b0030000 {

+ 1 - 0
arch/arm/boot/dts/prima2.dtsi

@@ -201,6 +201,7 @@
 				compatible = "sirf,prima2-tick";
 				compatible = "sirf,prima2-tick";
 				reg = <0xb0020000 0x1000>;
 				reg = <0xb0020000 0x1000>;
 				interrupts = <0>;
 				interrupts = <0>;
+				clocks = <&clks 11>;
 			};
 			};
 
 
 			nand@b0030000 {
 			nand@b0030000 {

+ 13 - 0
arch/arm/boot/dts/s3c2416-smdk2416.dts

@@ -19,6 +19,19 @@
 		reg =  <0x30000000 0x4000000>;
 		reg =  <0x30000000 0x4000000>;
 	};
 	};
 
 
+	clocks {
+		compatible = "simple-bus";
+		#address-cells = <1>;
+		#size-cells = <1>;
+
+		xti: xti {
+			compatible = "fixed-clock";
+			clock-frequency = <12000000>;
+			clock-output-names = "xti";
+			#clock-cells = <0>;
+		};
+	};
+
 	serial@50000000 {
 	serial@50000000 {
 		status = "okay";
 		status = "okay";
 		pinctrl-names = "default";
 		pinctrl-names = "default";

+ 42 - 0
arch/arm/boot/dts/s3c2416.dtsi

@@ -8,6 +8,7 @@
  * published by the Free Software Foundation.
  * published by the Free Software Foundation.
  */
  */
 
 
+#include <dt-bindings/clock/s3c2443.h>
 #include "s3c24xx.dtsi"
 #include "s3c24xx.dtsi"
 #include "s3c2416-pinctrl.dtsi"
 #include "s3c2416-pinctrl.dtsi"
 
 
@@ -28,26 +29,53 @@
 		compatible = "samsung,s3c2416-irq";
 		compatible = "samsung,s3c2416-irq";
 	};
 	};
 
 
+	clocks: clock-controller@0x4c000000 {
+		compatible = "samsung,s3c2416-clock";
+		reg = <0x4c000000 0x40>;
+		#clock-cells = <1>;
+	};
+
 	pinctrl@56000000 {
 	pinctrl@56000000 {
 		compatible = "samsung,s3c2416-pinctrl";
 		compatible = "samsung,s3c2416-pinctrl";
 	};
 	};
 
 
+	timer@51000000 {
+		clocks = <&clocks PCLK_PWM>;
+		clock-names = "timers";
+	};
+
 	serial@50000000 {
 	serial@50000000 {
 		compatible = "samsung,s3c2440-uart";
 		compatible = "samsung,s3c2440-uart";
+		clock-names = "uart", "clk_uart_baud2",
+				"clk_uart_baud3";
+		clocks = <&clocks PCLK_UART0>, <&clocks PCLK_UART0>,
+				<&clocks SCLK_UART>;
 	};
 	};
 
 
 	serial@50004000 {
 	serial@50004000 {
 		compatible = "samsung,s3c2440-uart";
 		compatible = "samsung,s3c2440-uart";
+		clock-names = "uart", "clk_uart_baud2",
+				"clk_uart_baud3";
+		clocks = <&clocks PCLK_UART1>, <&clocks PCLK_UART1>,
+				<&clocks SCLK_UART>;
 	};
 	};
 
 
 	serial@50008000 {
 	serial@50008000 {
 		compatible = "samsung,s3c2440-uart";
 		compatible = "samsung,s3c2440-uart";
+		clock-names = "uart", "clk_uart_baud2",
+				"clk_uart_baud3";
+		clocks = <&clocks PCLK_UART2>, <&clocks PCLK_UART2>,
+				<&clocks SCLK_UART>;
 	};
 	};
 
 
 	serial@5000C000 {
 	serial@5000C000 {
 		compatible = "samsung,s3c2440-uart";
 		compatible = "samsung,s3c2440-uart";
 		reg = <0x5000C000 0x4000>;
 		reg = <0x5000C000 0x4000>;
 		interrupts = <1 18 24 4>, <1 18 25 4>;
 		interrupts = <1 18 24 4>, <1 18 25 4>;
+		clock-names = "uart", "clk_uart_baud2",
+				"clk_uart_baud3";
+		clocks = <&clocks PCLK_UART3>, <&clocks PCLK_UART3>,
+				<&clocks SCLK_UART>;
 		status = "disabled";
 		status = "disabled";
 	};
 	};
 
 
@@ -55,6 +83,10 @@
 		compatible = "samsung,s3c6410-sdhci";
 		compatible = "samsung,s3c6410-sdhci";
 		reg = <0x4AC00000 0x100>;
 		reg = <0x4AC00000 0x100>;
 		interrupts = <0 0 21 3>;
 		interrupts = <0 0 21 3>;
+		clock-names = "hsmmc", "mmc_busclk.0",
+				"mmc_busclk.2";
+		clocks = <&clocks HCLK_HSMMC0>, <&clocks HCLK_HSMMC0>,
+				<&clocks MUX_HSMMC0>;
 		status = "disabled";
 		status = "disabled";
 	};
 	};
 
 
@@ -62,18 +94,28 @@
 		compatible = "samsung,s3c6410-sdhci";
 		compatible = "samsung,s3c6410-sdhci";
 		reg = <0x4A800000 0x100>;
 		reg = <0x4A800000 0x100>;
 		interrupts = <0 0 20 3>;
 		interrupts = <0 0 20 3>;
+		clock-names = "hsmmc", "mmc_busclk.0",
+				"mmc_busclk.2";
+		clocks = <&clocks HCLK_HSMMC1>, <&clocks HCLK_HSMMC1>,
+				<&clocks MUX_HSMMC1>;
 		status = "disabled";
 		status = "disabled";
 	};
 	};
 
 
 	watchdog@53000000 {
 	watchdog@53000000 {
 		interrupts = <1 9 27 3>;
 		interrupts = <1 9 27 3>;
+		clocks = <&clocks PCLK_WDT>;
+		clock-names = "watchdog";
 	};
 	};
 
 
 	rtc@57000000 {
 	rtc@57000000 {
 		compatible = "samsung,s3c2416-rtc";
 		compatible = "samsung,s3c2416-rtc";
+		clocks = <&clocks PCLK_RTC>;
+		clock-names = "rtc";
 	};
 	};
 
 
 	i2c@54000000 {
 	i2c@54000000 {
 		compatible = "samsung,s3c2440-i2c";
 		compatible = "samsung,s3c2440-i2c";
+		clocks = <&clocks PCLK_I2C0>;
+		clock-names = "i2c";
 	};
 	};
 };
 };

+ 72 - 4
arch/arm/boot/dts/vexpress-v2m-rs1.dtsi

@@ -74,8 +74,24 @@
 			v2m_sysreg: sysreg@010000 {
 			v2m_sysreg: sysreg@010000 {
 				compatible = "arm,vexpress-sysreg";
 				compatible = "arm,vexpress-sysreg";
 				reg = <0x010000 0x1000>;
 				reg = <0x010000 0x1000>;
-				gpio-controller;
-				#gpio-cells = <2>;
+
+				v2m_led_gpios: sys_led@08 {
+					compatible = "arm,vexpress-sysreg,sys_led";
+					gpio-controller;
+					#gpio-cells = <2>;
+				};
+
+				v2m_mmc_gpios: sys_mci@48 {
+					compatible = "arm,vexpress-sysreg,sys_mci";
+					gpio-controller;
+					#gpio-cells = <2>;
+				};
+
+				v2m_flash_gpios: sys_flash@4c {
+					compatible = "arm,vexpress-sysreg,sys_flash";
+					gpio-controller;
+					#gpio-cells = <2>;
+				};
 			};
 			};
 
 
 			v2m_sysctl: sysctl@020000 {
 			v2m_sysctl: sysctl@020000 {
@@ -113,8 +129,8 @@
 				compatible = "arm,pl180", "arm,primecell";
 				compatible = "arm,pl180", "arm,primecell";
 				reg = <0x050000 0x1000>;
 				reg = <0x050000 0x1000>;
 				interrupts = <9 10>;
 				interrupts = <9 10>;
-				cd-gpios = <&v2m_sysreg 0 0>;
-				wp-gpios = <&v2m_sysreg 1 0>;
+				cd-gpios = <&v2m_mmc_gpios 0 0>;
+				wp-gpios = <&v2m_mmc_gpios 1 0>;
 				max-frequency = <12000000>;
 				max-frequency = <12000000>;
 				vmmc-supply = <&v2m_fixed_3v3>;
 				vmmc-supply = <&v2m_fixed_3v3>;
 				clocks = <&v2m_clk24mhz>, <&smbclk>;
 				clocks = <&v2m_clk24mhz>, <&smbclk>;
@@ -265,6 +281,58 @@
 			clock-output-names = "v2m:refclk32khz";
 			clock-output-names = "v2m:refclk32khz";
 		};
 		};
 
 
+		leds {
+			compatible = "gpio-leds";
+
+			user@1 {
+				label = "v2m:green:user1";
+				gpios = <&v2m_led_gpios 0 0>;
+				linux,default-trigger = "heartbeat";
+			};
+
+			user@2 {
+				label = "v2m:green:user2";
+				gpios = <&v2m_led_gpios 1 0>;
+				linux,default-trigger = "mmc0";
+			};
+
+			user@3 {
+				label = "v2m:green:user3";
+				gpios = <&v2m_led_gpios 2 0>;
+				linux,default-trigger = "cpu0";
+			};
+
+			user@4 {
+				label = "v2m:green:user4";
+				gpios = <&v2m_led_gpios 3 0>;
+				linux,default-trigger = "cpu1";
+			};
+
+			user@5 {
+				label = "v2m:green:user5";
+				gpios = <&v2m_led_gpios 4 0>;
+				linux,default-trigger = "cpu2";
+			};
+
+			user@6 {
+				label = "v2m:green:user6";
+				gpios = <&v2m_led_gpios 5 0>;
+				linux,default-trigger = "cpu3";
+			};
+
+			user@7 {
+				label = "v2m:green:user7";
+				gpios = <&v2m_led_gpios 6 0>;
+				linux,default-trigger = "cpu4";
+			};
+
+			user@8 {
+				label = "v2m:green:user8";
+				gpios = <&v2m_led_gpios 7 0>;
+				linux,default-trigger = "cpu5";
+			};
+		};
+
 		mcc {
 		mcc {
 			compatible = "arm,vexpress,config-bus";
 			compatible = "arm,vexpress,config-bus";
 			arm,vexpress,config-bridge = <&v2m_sysreg>;
 			arm,vexpress,config-bridge = <&v2m_sysreg>;

+ 72 - 4
arch/arm/boot/dts/vexpress-v2m.dtsi

@@ -73,8 +73,24 @@
 			v2m_sysreg: sysreg@00000 {
 			v2m_sysreg: sysreg@00000 {
 				compatible = "arm,vexpress-sysreg";
 				compatible = "arm,vexpress-sysreg";
 				reg = <0x00000 0x1000>;
 				reg = <0x00000 0x1000>;
-				gpio-controller;
-				#gpio-cells = <2>;
+
+				v2m_led_gpios: sys_led@08 {
+					compatible = "arm,vexpress-sysreg,sys_led";
+					gpio-controller;
+					#gpio-cells = <2>;
+				};
+
+				v2m_mmc_gpios: sys_mci@48 {
+					compatible = "arm,vexpress-sysreg,sys_mci";
+					gpio-controller;
+					#gpio-cells = <2>;
+				};
+
+				v2m_flash_gpios: sys_flash@4c {
+					compatible = "arm,vexpress-sysreg,sys_flash";
+					gpio-controller;
+					#gpio-cells = <2>;
+				};
 			};
 			};
 
 
 			v2m_sysctl: sysctl@01000 {
 			v2m_sysctl: sysctl@01000 {
@@ -112,8 +128,8 @@
 				compatible = "arm,pl180", "arm,primecell";
 				compatible = "arm,pl180", "arm,primecell";
 				reg = <0x05000 0x1000>;
 				reg = <0x05000 0x1000>;
 				interrupts = <9 10>;
 				interrupts = <9 10>;
-				cd-gpios = <&v2m_sysreg 0 0>;
-				wp-gpios = <&v2m_sysreg 1 0>;
+				cd-gpios = <&v2m_mmc_gpios 0 0>;
+				wp-gpios = <&v2m_mmc_gpios 1 0>;
 				max-frequency = <12000000>;
 				max-frequency = <12000000>;
 				vmmc-supply = <&v2m_fixed_3v3>;
 				vmmc-supply = <&v2m_fixed_3v3>;
 				clocks = <&v2m_clk24mhz>, <&smbclk>;
 				clocks = <&v2m_clk24mhz>, <&smbclk>;
@@ -264,6 +280,58 @@
 			clock-output-names = "v2m:refclk32khz";
 			clock-output-names = "v2m:refclk32khz";
 		};
 		};
 
 
+		leds {
+			compatible = "gpio-leds";
+
+			user@1 {
+				label = "v2m:green:user1";
+				gpios = <&v2m_led_gpios 0 0>;
+				linux,default-trigger = "heartbeat";
+			};
+
+			user@2 {
+				label = "v2m:green:user2";
+				gpios = <&v2m_led_gpios 1 0>;
+				linux,default-trigger = "mmc0";
+			};
+
+			user@3 {
+				label = "v2m:green:user3";
+				gpios = <&v2m_led_gpios 2 0>;
+				linux,default-trigger = "cpu0";
+			};
+
+			user@4 {
+				label = "v2m:green:user4";
+				gpios = <&v2m_led_gpios 3 0>;
+				linux,default-trigger = "cpu1";
+			};
+
+			user@5 {
+				label = "v2m:green:user5";
+				gpios = <&v2m_led_gpios 4 0>;
+				linux,default-trigger = "cpu2";
+			};
+
+			user@6 {
+				label = "v2m:green:user6";
+				gpios = <&v2m_led_gpios 5 0>;
+				linux,default-trigger = "cpu3";
+			};
+
+			user@7 {
+				label = "v2m:green:user7";
+				gpios = <&v2m_led_gpios 6 0>;
+				linux,default-trigger = "cpu4";
+			};
+
+			user@8 {
+				label = "v2m:green:user8";
+				gpios = <&v2m_led_gpios 7 0>;
+				linux,default-trigger = "cpu5";
+			};
+		};
+
 		mcc {
 		mcc {
 			compatible = "arm,vexpress,config-bus";
 			compatible = "arm,vexpress,config-bus";
 			arm,vexpress,config-bridge = <&v2m_sysreg>;
 			arm,vexpress,config-bridge = <&v2m_sysreg>;

+ 3 - 2
arch/arm/boot/dts/vexpress-v2p-ca15_a7.dts

@@ -312,6 +312,7 @@
 			arm,vexpress-sysreg,func = <12 0>;
 			arm,vexpress-sysreg,func = <12 0>;
 			label = "A15 Pcore";
 			label = "A15 Pcore";
 		};
 		};
+
 		power@1 {
 		power@1 {
 			/* Total power for the three A7 cores */
 			/* Total power for the three A7 cores */
 			compatible = "arm,vexpress-power";
 			compatible = "arm,vexpress-power";
@@ -322,14 +323,14 @@
 		energy@0 {
 		energy@0 {
 			/* Total energy for the two A15 cores */
 			/* Total energy for the two A15 cores */
 			compatible = "arm,vexpress-energy";
 			compatible = "arm,vexpress-energy";
-			arm,vexpress-sysreg,func = <13 0>;
+			arm,vexpress-sysreg,func = <13 0>, <13 1>;
 			label = "A15 Jcore";
 			label = "A15 Jcore";
 		};
 		};
 
 
 		energy@2 {
 		energy@2 {
 			/* Total energy for the three A7 cores */
 			/* Total energy for the three A7 cores */
 			compatible = "arm,vexpress-energy";
 			compatible = "arm,vexpress-energy";
-			arm,vexpress-sysreg,func = <13 2>;
+			arm,vexpress-sysreg,func = <13 2>, <13 3>;
 			label = "A7 Jcore";
 			label = "A7 Jcore";
 		};
 		};
 	};
 	};

+ 2 - 0
arch/arm/configs/realview-smp_defconfig

@@ -76,8 +76,10 @@ CONFIG_MMC=y
 CONFIG_MMC_ARMMMCI=y
 CONFIG_MMC_ARMMMCI=y
 CONFIG_NEW_LEDS=y
 CONFIG_NEW_LEDS=y
 CONFIG_LEDS_CLASS=y
 CONFIG_LEDS_CLASS=y
+CONFIG_LEDS_VERSATILE=y
 CONFIG_LEDS_TRIGGERS=y
 CONFIG_LEDS_TRIGGERS=y
 CONFIG_LEDS_TRIGGER_HEARTBEAT=y
 CONFIG_LEDS_TRIGGER_HEARTBEAT=y
+CONFIG_LEDS_TRIGGER_CPU=y
 CONFIG_RTC_CLASS=y
 CONFIG_RTC_CLASS=y
 CONFIG_RTC_DRV_DS1307=y
 CONFIG_RTC_DRV_DS1307=y
 CONFIG_RTC_DRV_PL031=y
 CONFIG_RTC_DRV_PL031=y

+ 2 - 0
arch/arm/configs/realview_defconfig

@@ -75,8 +75,10 @@ CONFIG_MMC=y
 CONFIG_MMC_ARMMMCI=y
 CONFIG_MMC_ARMMMCI=y
 CONFIG_NEW_LEDS=y
 CONFIG_NEW_LEDS=y
 CONFIG_LEDS_CLASS=y
 CONFIG_LEDS_CLASS=y
+CONFIG_LEDS_VERSATILE=y
 CONFIG_LEDS_TRIGGERS=y
 CONFIG_LEDS_TRIGGERS=y
 CONFIG_LEDS_TRIGGER_HEARTBEAT=y
 CONFIG_LEDS_TRIGGER_HEARTBEAT=y
+CONFIG_LEDS_TRIGGER_CPU=y
 CONFIG_RTC_CLASS=y
 CONFIG_RTC_CLASS=y
 CONFIG_RTC_DRV_DS1307=y
 CONFIG_RTC_DRV_DS1307=y
 CONFIG_RTC_DRV_PL031=y
 CONFIG_RTC_DRV_PL031=y

+ 3 - 0
arch/arm/configs/versatile_defconfig

@@ -61,6 +61,9 @@ CONFIG_SND_ARMAACI=m
 CONFIG_MMC=y
 CONFIG_MMC=y
 CONFIG_MMC_ARMMMCI=m
 CONFIG_MMC_ARMMMCI=m
 CONFIG_NEW_LEDS=y
 CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+CONFIG_LEDS_VERSATILE=y
+CONFIG_LEDS_TRIGGERS=y
 CONFIG_LEDS_TRIGGER_HEARTBEAT=y
 CONFIG_LEDS_TRIGGER_HEARTBEAT=y
 CONFIG_LEDS_TRIGGER_CPU=y
 CONFIG_LEDS_TRIGGER_CPU=y
 CONFIG_EXT2_FS=y
 CONFIG_EXT2_FS=y

+ 46 - 0
arch/arm/include/debug/s3c24xx.S

@@ -0,0 +1,46 @@
+/* arch/arm/mach-s3c2410/include/mach/debug-macro.S
+ *
+ * Debugging macro include header
+ *
+ *  Copyright (C) 1994-1999 Russell King
+ *  Copyright (C) 2005 Simtec Electronics
+ *
+ *  Moved from linux/arch/arm/kernel/debug.S by Ben Dooks
+ *
+ * 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
+ * published by the Free Software Foundation.
+*/
+
+#include <linux/serial_s3c.h>
+
+#define S3C2410_UART1_OFF (0x4000)
+
+	.macro addruart, rp, rv, tmp
+		ldr	\rp, = CONFIG_DEBUG_UART_PHYS
+		ldr	\rv, = CONFIG_DEBUG_UART_VIRT
+	.endm
+
+	.macro  fifo_full_s3c2410 rd, rx
+		ldr	\rd, [\rx, # S3C2410_UFSTAT]
+		tst	\rd, #S3C2410_UFSTAT_TXFULL
+	.endm
+
+	.macro fifo_level_s3c2410 rd, rx
+		ldr	\rd, [\rx, # S3C2410_UFSTAT]
+		and	\rd, \rd, #S3C2410_UFSTAT_TXMASK
+	.endm
+
+/* Select the correct implementation depending on the configuration. The
+ * S3C2440 will get selected by default, as these are the most widely
+ * used variants of these
+*/
+
+#if defined(CONFIG_DEBUG_S3C2410_UART)
+#define fifo_full  fifo_full_s3c2410
+#define fifo_level fifo_level_s3c2410
+#endif
+
+/* include the reset of the code which will do the work */
+
+#include <debug/samsung.S>

+ 35 - 14
arch/arm/mach-bcm/Kconfig

@@ -10,22 +10,51 @@ if ARCH_BCM
 menu "Broadcom SoC Selection"
 menu "Broadcom SoC Selection"
 
 
 config ARCH_BCM_MOBILE
 config ARCH_BCM_MOBILE
-	bool "Broadcom Mobile SoC" if ARCH_MULTI_V7
-	depends on MMU
+	bool "Broadcom Mobile SoC Support" if ARCH_MULTI_V7
 	select ARCH_REQUIRE_GPIOLIB
 	select ARCH_REQUIRE_GPIOLIB
 	select ARM_ERRATA_754322
 	select ARM_ERRATA_754322
 	select ARM_ERRATA_764369 if SMP
 	select ARM_ERRATA_764369 if SMP
 	select ARM_GIC
 	select ARM_GIC
 	select GPIO_BCM_KONA
 	select GPIO_BCM_KONA
 	select TICK_ONESHOT
 	select TICK_ONESHOT
-	select CACHE_L2X0
 	select HAVE_ARM_ARCH_TIMER
 	select HAVE_ARM_ARCH_TIMER
 	select PINCTRL
 	select PINCTRL
 	help
 	help
 	  This enables support for systems based on Broadcom mobile SoCs.
 	  This enables support for systems based on Broadcom mobile SoCs.
-	  It currently supports the 'BCM281XX' family, which includes
-	  BCM11130, BCM11140, BCM11351, BCM28145 and
-	  BCM28155 variants.
+
+if ARCH_BCM_MOBILE
+
+menu "Broadcom Mobile SoC Selection"
+
+config ARCH_BCM_281XX
+	bool "Broadcom BCM281XX SoC family"
+	default y
+	help
+	  Enable support for the the BCM281XX family, which includes
+	  BCM11130, BCM11140, BCM11351, BCM28145 and BCM28155
+	  variants.
+
+config ARCH_BCM_21664
+	bool "Broadcom BCM21664 SoC family"
+	default y
+	help
+	  Enable support for the the BCM21664 family, which includes
+	  BCM21663 and BCM21664 variants.
+
+config ARCH_BCM_MOBILE_L2_CACHE
+	bool "Broadcom mobile SoC level 2 cache support"
+	depends on (ARCH_BCM_281XX || ARCH_BCM_21664)
+	default y
+	select CACHE_L2X0
+	select ARCH_BCM_MOBILE_SMC
+
+config ARCH_BCM_MOBILE_SMC
+	bool
+	depends on ARCH_BCM_281XX || ARCH_BCM_21664
+
+endmenu
+
+endif
 
 
 config ARCH_BCM2835
 config ARCH_BCM2835
 	bool "Broadcom BCM2835 family" if ARCH_MULTI_V6
 	bool "Broadcom BCM2835 family" if ARCH_MULTI_V6
@@ -33,10 +62,7 @@ config ARCH_BCM2835
 	select ARM_AMBA
 	select ARM_AMBA
 	select ARM_ERRATA_411920
 	select ARM_ERRATA_411920
 	select ARM_TIMER_SP804
 	select ARM_TIMER_SP804
-	select CLKDEV_LOOKUP
 	select CLKSRC_OF
 	select CLKSRC_OF
-	select CPU_V6
-	select GENERIC_CLOCKEVENTS
 	select PINCTRL
 	select PINCTRL
 	select PINCTRL_BCM2835
 	select PINCTRL_BCM2835
 	help
 	help
@@ -45,17 +71,12 @@ config ARCH_BCM2835
 
 
 config ARCH_BCM_5301X
 config ARCH_BCM_5301X
 	bool "Broadcom BCM470X / BCM5301X ARM SoC" if ARCH_MULTI_V7
 	bool "Broadcom BCM470X / BCM5301X ARM SoC" if ARCH_MULTI_V7
-	depends on MMU
 	select ARM_GIC
 	select ARM_GIC
 	select CACHE_L2X0
 	select CACHE_L2X0
 	select HAVE_ARM_SCU if SMP
 	select HAVE_ARM_SCU if SMP
 	select HAVE_ARM_TWD if SMP
 	select HAVE_ARM_TWD if SMP
-	select HAVE_SMP
-	select COMMON_CLK
-	select GENERIC_CLOCKEVENTS
 	select ARM_GLOBAL_TIMER
 	select ARM_GLOBAL_TIMER
 	select CLKSRC_ARM_GLOBAL_TIMER_SCHED_CLOCK
 	select CLKSRC_ARM_GLOBAL_TIMER_SCHED_CLOCK
-	select MIGHT_HAVE_PCI
 	help
 	help
 	  Support for Broadcom BCM470X and BCM5301X SoCs with ARM CPU cores.
 	  Support for Broadcom BCM470X and BCM5301X SoCs with ARM CPU cores.
 
 

+ 17 - 4
arch/arm/mach-bcm/Makefile

@@ -10,10 +10,23 @@
 # of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 # of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 # GNU General Public License for more details.
 # GNU General Public License for more details.
 
 
-obj-$(CONFIG_ARCH_BCM_MOBILE)	:= board_bcm281xx.o board_bcm21664.o \
-				bcm_kona_smc.o bcm_kona_smc_asm.o kona.o
+# BCM281XX
+obj-$(CONFIG_ARCH_BCM_281XX)	+= board_bcm281xx.o
+
+# BCM21664
+obj-$(CONFIG_ARCH_BCM_21664)	+= board_bcm21664.o
+
+# BCM281XX and BCM21664 L2 cache control
+obj-$(CONFIG_ARCH_BCM_MOBILE_L2_CACHE) += kona_l2_cache.o
+
+# Support for secure monitor traps
+obj-$(CONFIG_ARCH_BCM_MOBILE_SMC) += bcm_kona_smc.o
+ifeq ($(call as-instr,.arch_extension sec,as_has_sec),as_has_sec)
+CFLAGS_bcm_kona_smc.o		+= -Wa,-march=armv7-a+sec -DREQUIRES_SEC
+endif
+
+# BCM2835
 obj-$(CONFIG_ARCH_BCM2835)	+= board_bcm2835.o
 obj-$(CONFIG_ARCH_BCM2835)	+= board_bcm2835.o
 
 
-plus_sec := $(call as-instr,.arch_extension sec,+sec)
-AFLAGS_bcm_kona_smc_asm.o	:=-Wa,-march=armv7-a$(plus_sec)
+# BCM5301X
 obj-$(CONFIG_ARCH_BCM_5301X)	+= bcm_5301x.o
 obj-$(CONFIG_ARCH_BCM_5301X)	+= bcm_5301x.o

+ 98 - 38
arch/arm/mach-bcm/bcm_kona_smc.c

@@ -21,11 +21,8 @@
 
 
 #include "bcm_kona_smc.h"
 #include "bcm_kona_smc.h"
 
 
-struct secure_bridge_data {
-	void __iomem *bounce;		/* virtual address */
-	u32 __iomem buffer_addr;	/* physical address */
-	int initialized;
-} bridge_data;
+static u32		bcm_smc_buffer_phys;	/* physical address */
+static void __iomem	*bcm_smc_buffer;	/* virtual address */
 
 
 struct bcm_kona_smc_data {
 struct bcm_kona_smc_data {
 	unsigned service_id;
 	unsigned service_id;
@@ -33,6 +30,7 @@ struct bcm_kona_smc_data {
 	unsigned arg1;
 	unsigned arg1;
 	unsigned arg2;
 	unsigned arg2;
 	unsigned arg3;
 	unsigned arg3;
+	unsigned result;
 };
 };
 
 
 static const struct of_device_id bcm_kona_smc_ids[] __initconst = {
 static const struct of_device_id bcm_kona_smc_ids[] __initconst = {
@@ -41,59 +39,125 @@ static const struct of_device_id bcm_kona_smc_ids[] __initconst = {
 	{},
 	{},
 };
 };
 
 
-/* Map in the bounce area */
+/* Map in the args buffer area */
 int __init bcm_kona_smc_init(void)
 int __init bcm_kona_smc_init(void)
 {
 {
 	struct device_node *node;
 	struct device_node *node;
+	const __be32 *prop_val;
+	u64 prop_size = 0;
+	unsigned long buffer_size;
+	u32 buffer_phys;
 
 
 	/* Read buffer addr and size from the device tree node */
 	/* Read buffer addr and size from the device tree node */
 	node = of_find_matching_node(NULL, bcm_kona_smc_ids);
 	node = of_find_matching_node(NULL, bcm_kona_smc_ids);
 	if (!node)
 	if (!node)
 		return -ENODEV;
 		return -ENODEV;
 
 
-	/* Don't care about size or flags of the DT node */
-	bridge_data.buffer_addr =
-		be32_to_cpu(*of_get_address(node, 0, NULL, NULL));
-	BUG_ON(!bridge_data.buffer_addr);
+	prop_val = of_get_address(node, 0, &prop_size, NULL);
+	if (!prop_val)
+		return -EINVAL;
 
 
-	bridge_data.bounce = of_iomap(node, 0);
-	BUG_ON(!bridge_data.bounce);
+	/* We assume space for four 32-bit arguments */
+	if (prop_size < 4 * sizeof(u32) || prop_size > (u64)ULONG_MAX)
+		return -EINVAL;
+	buffer_size = (unsigned long)prop_size;
 
 
-	bridge_data.initialized = 1;
+	buffer_phys = be32_to_cpup(prop_val);
+	if (!buffer_phys)
+		return -EINVAL;
+
+	bcm_smc_buffer = ioremap(buffer_phys, buffer_size);
+	if (!bcm_smc_buffer)
+		return -ENOMEM;
+	bcm_smc_buffer_phys = buffer_phys;
 
 
 	pr_info("Kona Secure API initialized\n");
 	pr_info("Kona Secure API initialized\n");
 
 
 	return 0;
 	return 0;
 }
 }
 
 
+/*
+ * int bcm_kona_do_smc(u32 service_id, u32 buffer_addr)
+ *
+ * Only core 0 can run the secure monitor code.  If an "smc" request
+ * is initiated on a different core it must be redirected to core 0
+ * for execution.  We rely on the caller to handle this.
+ *
+ * Each "smc" request supplies a service id and the address of a
+ * buffer containing parameters related to the service to be
+ * performed.  A flags value defines the behavior of the level 2
+ * cache and interrupt handling while the secure monitor executes.
+ *
+ * Parameters to the "smc" request are passed in r4-r6 as follows:
+ *     r4	service id
+ *     r5	flags (SEC_ROM_*)
+ *     r6	physical address of buffer with other parameters
+ *
+ * Execution of an "smc" request produces two distinct results.
+ *
+ * First, the secure monitor call itself (regardless of the specific
+ * service request) can succeed, or can produce an error.  When an
+ * "smc" request completes this value is found in r12; it should
+ * always be SEC_EXIT_NORMAL.
+ *
+ * In addition, the particular service performed produces a result.
+ * The values that should be expected depend on the service.  We
+ * therefore return this value to the caller, so it can handle the
+ * request result appropriately.  This result value is found in r0
+ * when the "smc" request completes.
+ */
+static int bcm_kona_do_smc(u32 service_id, u32 buffer_phys)
+{
+	register u32 ip asm("ip");	/* Also called r12 */
+	register u32 r0 asm("r0");
+	register u32 r4 asm("r4");
+	register u32 r5 asm("r5");
+	register u32 r6 asm("r6");
+
+	r4 = service_id;
+	r5 = 0x3;		/* Keep IRQ and FIQ off in SM */
+	r6 = buffer_phys;
+
+	asm volatile (
+		/* Make sure we got the registers we want */
+		__asmeq("%0", "ip")
+		__asmeq("%1", "r0")
+		__asmeq("%2", "r4")
+		__asmeq("%3", "r5")
+		__asmeq("%4", "r6")
+#ifdef REQUIRES_SEC
+		".arch_extension sec\n"
+#endif
+		"	smc    #0\n"
+		: "=r" (ip), "=r" (r0)
+		: "r" (r4), "r" (r5), "r" (r6)
+		: "r1", "r2", "r3", "r7", "lr");
+
+	BUG_ON(ip != SEC_EXIT_NORMAL);
+
+	return r0;
+}
+
 /* __bcm_kona_smc() should only run on CPU 0, with pre-emption disabled */
 /* __bcm_kona_smc() should only run on CPU 0, with pre-emption disabled */
 static void __bcm_kona_smc(void *info)
 static void __bcm_kona_smc(void *info)
 {
 {
 	struct bcm_kona_smc_data *data = info;
 	struct bcm_kona_smc_data *data = info;
-	u32 *args = bridge_data.bounce;
-	int rc = 0;
+	u32 *args = bcm_smc_buffer;
 
 
-	/* Must run on CPU 0 */
 	BUG_ON(smp_processor_id() != 0);
 	BUG_ON(smp_processor_id() != 0);
+	BUG_ON(!args);
 
 
-	/* Check map in the bounce area */
-	BUG_ON(!bridge_data.initialized);
-
-	/* Copy one 32 bit word into the bounce area */
-	args[0] = data->arg0;
-	args[1] = data->arg1;
-	args[2] = data->arg2;
-	args[3] = data->arg3;
+	/* Copy the four 32 bit argument values into the bounce area */
+	writel_relaxed(data->arg0, args++);
+	writel_relaxed(data->arg1, args++);
+	writel_relaxed(data->arg2, args++);
+	writel(data->arg3, args);
 
 
 	/* Flush caches for input data passed to Secure Monitor */
 	/* Flush caches for input data passed to Secure Monitor */
-	if (data->service_id != SSAPI_BRCM_START_VC_CORE)
-		flush_cache_all();
-
-	/* Trap into Secure Monitor */
-	rc = bcm_kona_smc_asm(data->service_id, bridge_data.buffer_addr);
+	flush_cache_all();
 
 
-	if (rc != SEC_ROM_RET_OK)
-		pr_err("Secure Monitor call failed (0x%x)!\n", rc);
+	/* Trap into Secure Monitor and record the request result */
+	data->result = bcm_kona_do_smc(data->service_id, bcm_smc_buffer_phys);
 }
 }
 
 
 unsigned bcm_kona_smc(unsigned service_id, unsigned arg0, unsigned arg1,
 unsigned bcm_kona_smc(unsigned service_id, unsigned arg0, unsigned arg1,
@@ -106,17 +170,13 @@ unsigned bcm_kona_smc(unsigned service_id, unsigned arg0, unsigned arg1,
 	data.arg1 = arg1;
 	data.arg1 = arg1;
 	data.arg2 = arg2;
 	data.arg2 = arg2;
 	data.arg3 = arg3;
 	data.arg3 = arg3;
+	data.result = 0;
 
 
 	/*
 	/*
 	 * Due to a limitation of the secure monitor, we must use the SMP
 	 * Due to a limitation of the secure monitor, we must use the SMP
 	 * infrastructure to forward all secure monitor calls to Core 0.
 	 * infrastructure to forward all secure monitor calls to Core 0.
 	 */
 	 */
-	if (get_cpu() != 0)
-		smp_call_function_single(0, __bcm_kona_smc, (void *)&data, 1);
-	else
-		__bcm_kona_smc(&data);
+	smp_call_function_single(0, __bcm_kona_smc, &data, 1);
 
 
-	put_cpu();
-
-	return 0;
+	return data.result;
 }
 }

+ 2 - 50
arch/arm/mach-bcm/bcm_kona_smc.h

@@ -15,55 +15,12 @@
 #define BCM_KONA_SMC_H
 #define BCM_KONA_SMC_H
 
 
 #include <linux/types.h>
 #include <linux/types.h>
-#define FLAGS	(SEC_ROM_ICACHE_ENABLE_MASK | SEC_ROM_DCACHE_ENABLE_MASK | \
-			SEC_ROM_IRQ_ENABLE_MASK | SEC_ROM_FIQ_ENABLE_MASK)
 
 
-/*!
- * Definitions for IRQ & FIQ Mask for ARM
- */
-
-#define FIQ_IRQ_MASK						0xC0
-#define FIQ_MASK						0x40
-#define IRQ_MASK						0x80
-
-/*!
- * Secure Mode FLAGs
- */
-
-/* When set, enables ICache within the secure mode */
-#define SEC_ROM_ICACHE_ENABLE_MASK                        0x00000001
-
-/* When set, enables DCache within the secure mode */
-#define SEC_ROM_DCACHE_ENABLE_MASK                        0x00000002
-
-/* When set, enables IRQ within the secure mode */
-#define SEC_ROM_IRQ_ENABLE_MASK                           0x00000004
-
-/* When set, enables FIQ within the secure mode */
-#define SEC_ROM_FIQ_ENABLE_MASK                           0x00000008
-
-/* When set, enables Unified L2 cache within the secure mode */
-#define SEC_ROM_UL2_CACHE_ENABLE_MASK                     0x00000010
-
-/* Broadcom Secure Service API Service IDs */
-#define SSAPI_DORMANT_ENTRY_SERV                          0x01000000
-#define SSAPI_PUBLIC_OTP_SERV                             0x01000001
-#define SSAPI_ENABLE_L2_CACHE                             0x01000002
-#define SSAPI_DISABLE_L2_CACHE                            0x01000003
-#define SSAPI_WRITE_SCU_STATUS                            0x01000004
-#define SSAPI_WRITE_PWR_GATE                              0x01000005
-
-/* Broadcom Secure Service API Return Codes */
+/* Broadcom Secure Service API service IDs, return codes, and exit codes */
+#define SSAPI_ENABLE_L2_CACHE		0x01000002
 #define SEC_ROM_RET_OK			0x00000001
 #define SEC_ROM_RET_OK			0x00000001
-#define SEC_ROM_RET_FAIL		0x00000009
-
-#define SSAPI_RET_FROM_INT_SERV		0x4
 #define SEC_EXIT_NORMAL			0x1
 #define SEC_EXIT_NORMAL			0x1
 
 
-#define SSAPI_ROW_AES			0x0E000006
-#define SSAPI_BRCM_START_VC_CORE	0x0E000008
-
-#ifndef	__ASSEMBLY__
 extern int __init bcm_kona_smc_init(void);
 extern int __init bcm_kona_smc_init(void);
 
 
 extern unsigned bcm_kona_smc(unsigned service_id,
 extern unsigned bcm_kona_smc(unsigned service_id,
@@ -72,9 +29,4 @@ extern unsigned bcm_kona_smc(unsigned service_id,
 			     unsigned arg2,
 			     unsigned arg2,
 			     unsigned arg3);
 			     unsigned arg3);
 
 
-extern int bcm_kona_smc_asm(u32 service_id,
-			    u32 buffer_addr);
-
-#endif	/* __ASSEMBLY__ */
-
 #endif /* BCM_KONA_SMC_H */
 #endif /* BCM_KONA_SMC_H */

+ 0 - 41
arch/arm/mach-bcm/bcm_kona_smc_asm.S

@@ -1,41 +0,0 @@
-/*
- * Copyright (C) 2013 Broadcom Corporation
- *
- * 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 version 2.
- *
- * This program is distributed "as is" WITHOUT ANY WARRANTY of any
- * kind, whether express or implied; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- */
-
-#include <linux/linkage.h>
-#include "bcm_kona_smc.h"
-
-/*
- * int bcm_kona_smc_asm(u32 service_id, u32 buffer_addr)
- */
-
-ENTRY(bcm_kona_smc_asm)
-	stmfd	sp!, {r4-r12, lr}
-	mov	r4, r0		@ service_id
-	mov	r5, #3		@ Keep IRQ and FIQ off in SM
-	/*
-	 * Since interrupts are disabled in the open mode, we must keep
-	 * interrupts disabled in secure mode by setting R5=0x3. If interrupts
-	 * are enabled in open mode, we can set R5=0x0 to allow interrupts in
-	 * secure mode.  If we did this, the secure monitor would return back
-	 * control to the open mode to handle the interrupt prior to completing
-	 * the secure service. If this happened, R12 would not be
-	 * SEC_EXIT_NORMAL and we would need to call SMC again after resetting
-	 * R5 (it gets clobbered by the secure monitor) and setting R4 to
-	 * SSAPI_RET_FROM_INT_SERV to indicate that we want the secure monitor
-	 * to finish up the previous uncompleted secure service.
-	 */
-	mov	r6, r1		@ buffer_addr
-	smc	#0
-	/* Check r12 for SEC_EXIT_NORMAL here if interrupts are enabled */
-	ldmfd	sp!, {r4-r12, pc}
-ENDPROC(bcm_kona_smc_asm)

+ 2 - 3
arch/arm/mach-bcm/board_bcm21664.c

@@ -11,14 +11,13 @@
  * GNU General Public License for more details.
  * GNU General Public License for more details.
  */
  */
 
 
-#include <linux/clocksource.h>
 #include <linux/of_address.h>
 #include <linux/of_address.h>
 #include <linux/of_platform.h>
 #include <linux/of_platform.h>
+#include <linux/io.h>
 
 
 #include <asm/mach/arch.h>
 #include <asm/mach/arch.h>
 
 
-#include "bcm_kona_smc.h"
-#include "kona.h"
+#include "kona_l2_cache.h"
 
 
 #define RSTMGR_DT_STRING		"brcm,bcm21664-resetmgr"
 #define RSTMGR_DT_STRING		"brcm,bcm21664-resetmgr"
 
 

+ 1 - 1
arch/arm/mach-bcm/board_bcm281xx.c

@@ -17,7 +17,7 @@
 
 
 #include <asm/mach/arch.h>
 #include <asm/mach/arch.h>
 
 
-#include "kona.h"
+#include "kona_l2_cache.h"
 
 
 #define SECWDOG_OFFSET			0x00000000
 #define SECWDOG_OFFSET			0x00000000
 #define SECWDOG_RESERVED_MASK		0xe2000000
 #define SECWDOG_RESERVED_MASK		0xe2000000

+ 10 - 6
arch/arm/mach-bcm/kona.c → arch/arm/mach-bcm/kona_l2_cache.c

@@ -11,19 +11,18 @@
  * GNU General Public License for more details.
  * GNU General Public License for more details.
  */
  */
 
 
-#include <linux/of_platform.h>
+
+#include <linux/init.h>
+#include <linux/printk.h>
 #include <asm/hardware/cache-l2x0.h>
 #include <asm/hardware/cache-l2x0.h>
 
 
 #include "bcm_kona_smc.h"
 #include "bcm_kona_smc.h"
-#include "kona.h"
 
 
 void __init kona_l2_cache_init(void)
 void __init kona_l2_cache_init(void)
 {
 {
+	unsigned int result;
 	int ret;
 	int ret;
 
 
-	if (!IS_ENABLED(CONFIG_CACHE_L2X0))
-		return;
-
 	ret = bcm_kona_smc_init();
 	ret = bcm_kona_smc_init();
 	if (ret) {
 	if (ret) {
 		pr_info("Secure API not available (%d). Skipping L2 init.\n",
 		pr_info("Secure API not available (%d). Skipping L2 init.\n",
@@ -31,7 +30,12 @@ void __init kona_l2_cache_init(void)
 		return;
 		return;
 	}
 	}
 
 
-	bcm_kona_smc(SSAPI_ENABLE_L2_CACHE, 0, 0, 0, 0);
+	result = bcm_kona_smc(SSAPI_ENABLE_L2_CACHE, 0, 0, 0, 0);
+	if (result != SEC_ROM_RET_OK) {
+		pr_err("Secure Monitor call failed (%u)! Skipping L2 init.\n",
+			result);
+		return;
+	}
 
 
 	/*
 	/*
 	 * The aux_val and aux_mask have no effect since L2 cache is already
 	 * The aux_val and aux_mask have no effect since L2 cache is already

+ 5 - 1
arch/arm/mach-bcm/kona.h → arch/arm/mach-bcm/kona_l2_cache.h

@@ -11,4 +11,8 @@
  * GNU General Public License for more details.
  * GNU General Public License for more details.
  */
  */
 
 
-void __init kona_l2_cache_init(void);
+#ifdef CONFIG_ARCH_BCM_MOBILE_L2_CACHE
+void	kona_l2_cache_init(void);
+#else
+#define kona_l2_cache_init() ((void)0)
+#endif

+ 0 - 1
arch/arm/mach-cns3xxx/Kconfig

@@ -1,7 +1,6 @@
 config ARCH_CNS3XXX
 config ARCH_CNS3XXX
 	bool "Cavium Networks CNS3XXX family" if ARCH_MULTI_V6
 	bool "Cavium Networks CNS3XXX family" if ARCH_MULTI_V6
 	select ARM_GIC
 	select ARM_GIC
-	select MIGHT_HAVE_PCI
 	select PCI_DOMAINS if PCI
 	select PCI_DOMAINS if PCI
 	help
 	help
 	  Support for Cavium Networks CNS3XXX platform.
 	  Support for Cavium Networks CNS3XXX platform.

+ 1 - 6
arch/arm/mach-exynos/Makefile

@@ -12,20 +12,15 @@ obj-				:=
 
 
 # Core
 # Core
 
 
-obj-$(CONFIG_ARCH_EXYNOS)	+= exynos.o
+obj-$(CONFIG_ARCH_EXYNOS)	+= exynos.o pmu.o exynos-smc.o firmware.o
 
 
 obj-$(CONFIG_PM_SLEEP)		+= pm.o sleep.o
 obj-$(CONFIG_PM_SLEEP)		+= pm.o sleep.o
 obj-$(CONFIG_PM_GENERIC_DOMAINS) += pm_domains.o
 obj-$(CONFIG_PM_GENERIC_DOMAINS) += pm_domains.o
 obj-$(CONFIG_CPU_IDLE)		+= cpuidle.o
 obj-$(CONFIG_CPU_IDLE)		+= cpuidle.o
 
 
-obj-$(CONFIG_ARCH_EXYNOS)	+= pmu.o
-
 obj-$(CONFIG_SMP)		+= platsmp.o headsmp.o
 obj-$(CONFIG_SMP)		+= platsmp.o headsmp.o
 
 
 obj-$(CONFIG_HOTPLUG_CPU)	+= hotplug.o
 obj-$(CONFIG_HOTPLUG_CPU)	+= hotplug.o
 
 
-obj-$(CONFIG_ARCH_EXYNOS)	+= exynos-smc.o
-obj-$(CONFIG_ARCH_EXYNOS)	+= firmware.o
-
 plus_sec := $(call as-instr,.arch_extension sec,+sec)
 plus_sec := $(call as-instr,.arch_extension sec,+sec)
 AFLAGS_exynos-smc.o		:=-Wa,-march=armv7-a$(plus_sec)
 AFLAGS_exynos-smc.o		:=-Wa,-march=armv7-a$(plus_sec)

+ 72 - 0
arch/arm/mach-exynos/common.h

@@ -15,6 +15,75 @@
 #include <linux/reboot.h>
 #include <linux/reboot.h>
 #include <linux/of.h>
 #include <linux/of.h>
 
 
+#define EXYNOS4210_CPU_ID	0x43210000
+#define EXYNOS4212_CPU_ID	0x43220000
+#define EXYNOS4412_CPU_ID	0xE4412200
+#define EXYNOS4_CPU_MASK	0xFFFE0000
+
+#define EXYNOS5250_SOC_ID	0x43520000
+#define EXYNOS5420_SOC_ID	0xE5420000
+#define EXYNOS5440_SOC_ID	0xE5440000
+#define EXYNOS5_SOC_MASK	0xFFFFF000
+
+extern unsigned long samsung_cpu_id;
+
+#define IS_SAMSUNG_CPU(name, id, mask)		\
+static inline int is_samsung_##name(void)	\
+{						\
+	return ((samsung_cpu_id & mask) == (id & mask));	\
+}
+
+IS_SAMSUNG_CPU(exynos4210, EXYNOS4210_CPU_ID, EXYNOS4_CPU_MASK)
+IS_SAMSUNG_CPU(exynos4212, EXYNOS4212_CPU_ID, EXYNOS4_CPU_MASK)
+IS_SAMSUNG_CPU(exynos4412, EXYNOS4412_CPU_ID, EXYNOS4_CPU_MASK)
+IS_SAMSUNG_CPU(exynos5250, EXYNOS5250_SOC_ID, EXYNOS5_SOC_MASK)
+IS_SAMSUNG_CPU(exynos5420, EXYNOS5420_SOC_ID, EXYNOS5_SOC_MASK)
+IS_SAMSUNG_CPU(exynos5440, EXYNOS5440_SOC_ID, EXYNOS5_SOC_MASK)
+
+#if defined(CONFIG_CPU_EXYNOS4210)
+# define soc_is_exynos4210()	is_samsung_exynos4210()
+#else
+# define soc_is_exynos4210()	0
+#endif
+
+#if defined(CONFIG_SOC_EXYNOS4212)
+# define soc_is_exynos4212()	is_samsung_exynos4212()
+#else
+# define soc_is_exynos4212()	0
+#endif
+
+#if defined(CONFIG_SOC_EXYNOS4412)
+# define soc_is_exynos4412()	is_samsung_exynos4412()
+#else
+# define soc_is_exynos4412()	0
+#endif
+
+#define EXYNOS4210_REV_0	(0x0)
+#define EXYNOS4210_REV_1_0	(0x10)
+#define EXYNOS4210_REV_1_1	(0x11)
+
+#if defined(CONFIG_SOC_EXYNOS5250)
+# define soc_is_exynos5250()	is_samsung_exynos5250()
+#else
+# define soc_is_exynos5250()	0
+#endif
+
+#if defined(CONFIG_SOC_EXYNOS5420)
+# define soc_is_exynos5420()	is_samsung_exynos5420()
+#else
+# define soc_is_exynos5420()	0
+#endif
+
+#if defined(CONFIG_SOC_EXYNOS5440)
+# define soc_is_exynos5440()	is_samsung_exynos5440()
+#else
+# define soc_is_exynos5440()	0
+#endif
+
+#define soc_is_exynos4() (soc_is_exynos4210() || soc_is_exynos4212() || \
+			  soc_is_exynos4412())
+#define soc_is_exynos5() (soc_is_exynos5250() || soc_is_exynos5420())
+
 void mct_init(void __iomem *base, int irq_g0, int irq_l0, int irq_l1);
 void mct_init(void __iomem *base, int irq_g0, int irq_l0, int irq_l1);
 
 
 struct map_desc;
 struct map_desc;
@@ -63,4 +132,7 @@ struct exynos_pmu_conf {
 
 
 extern void exynos_sys_powerdown_conf(enum sys_powerdown mode);
 extern void exynos_sys_powerdown_conf(enum sys_powerdown mode);
 
 
+extern void s5p_init_cpu(void __iomem *cpuid_addr);
+extern unsigned int samsung_rev(void);
+
 #endif /* __ARCH_ARM_MACH_EXYNOS_COMMON_H */
 #endif /* __ARCH_ARM_MACH_EXYNOS_COMMON_H */

+ 0 - 1
arch/arm/mach-exynos/cpuidle.c

@@ -24,7 +24,6 @@
 #include <asm/unified.h>
 #include <asm/unified.h>
 #include <asm/cpuidle.h>
 #include <asm/cpuidle.h>
 
 
-#include <plat/cpu.h>
 #include <plat/pm.h>
 #include <plat/pm.h>
 
 
 #include <mach/map.h>
 #include <mach/map.h>

+ 0 - 13
arch/arm/mach-exynos/exynos.c

@@ -26,8 +26,6 @@
 #include <asm/mach/map.h>
 #include <asm/mach/map.h>
 #include <asm/memory.h>
 #include <asm/memory.h>
 
 
-#include <plat/cpu.h>
-
 #include "common.h"
 #include "common.h"
 #include "mfc.h"
 #include "mfc.h"
 #include "regs-pmu.h"
 #include "regs-pmu.h"
@@ -308,17 +306,6 @@ void __init exynos_init_io(void)
 	exynos_map_io();
 	exynos_map_io();
 }
 }
 
 
-struct bus_type exynos_subsys = {
-	.name		= "exynos-core",
-	.dev_name	= "exynos-core",
-};
-
-static int __init exynos_core_init(void)
-{
-	return subsys_system_register(&exynos_subsys, NULL);
-}
-core_initcall(exynos_core_init);
-
 static int __init exynos4_l2x0_cache_init(void)
 static int __init exynos4_l2x0_cache_init(void)
 {
 {
 	int ret;
 	int ret;

+ 1 - 2
arch/arm/mach-exynos/firmware.c

@@ -18,8 +18,7 @@
 
 
 #include <mach/map.h>
 #include <mach/map.h>
 
 
-#include <plat/cpu.h>
-
+#include "common.h"
 #include "smc.h"
 #include "smc.h"
 
 
 static int exynos_do_idle(void)
 static int exynos_do_idle(void)

+ 1 - 64
arch/arm/mach-exynos/hotplug.c

@@ -19,61 +19,9 @@
 #include <asm/cp15.h>
 #include <asm/cp15.h>
 #include <asm/smp_plat.h>
 #include <asm/smp_plat.h>
 
 
-#include <plat/cpu.h>
-
 #include "common.h"
 #include "common.h"
 #include "regs-pmu.h"
 #include "regs-pmu.h"
 
 
-static inline void cpu_enter_lowpower_a9(void)
-{
-	unsigned int v;
-
-	asm volatile(
-	"	mcr	p15, 0, %1, c7, c5, 0\n"
-	"	mcr	p15, 0, %1, c7, c10, 4\n"
-	/*
-	 * Turn off coherency
-	 */
-	"	mrc	p15, 0, %0, c1, c0, 1\n"
-	"	bic	%0, %0, %3\n"
-	"	mcr	p15, 0, %0, c1, c0, 1\n"
-	"	mrc	p15, 0, %0, c1, c0, 0\n"
-	"	bic	%0, %0, %2\n"
-	"	mcr	p15, 0, %0, c1, c0, 0\n"
-	  : "=&r" (v)
-	  : "r" (0), "Ir" (CR_C), "Ir" (0x40)
-	  : "cc");
-}
-
-static inline void cpu_enter_lowpower_a15(void)
-{
-	unsigned int v;
-
-	asm volatile(
-	"	mrc	p15, 0, %0, c1, c0, 0\n"
-	"	bic	%0, %0, %1\n"
-	"	mcr	p15, 0, %0, c1, c0, 0\n"
-	  : "=&r" (v)
-	  : "Ir" (CR_C)
-	  : "cc");
-
-	flush_cache_louis();
-
-	asm volatile(
-	/*
-	* Turn off coherency
-	*/
-	"	mrc	p15, 0, %0, c1, c0, 1\n"
-	"	bic	%0, %0, %1\n"
-	"	mcr	p15, 0, %0, c1, c0, 1\n"
-	: "=&r" (v)
-	: "Ir" (0x40)
-	: "cc");
-
-	isb();
-	dsb();
-}
-
 static inline void cpu_leave_lowpower(void)
 static inline void cpu_leave_lowpower(void)
 {
 {
 	unsigned int v;
 	unsigned int v;
@@ -132,19 +80,8 @@ static inline void platform_do_lowpower(unsigned int cpu, int *spurious)
 void __ref exynos_cpu_die(unsigned int cpu)
 void __ref exynos_cpu_die(unsigned int cpu)
 {
 {
 	int spurious = 0;
 	int spurious = 0;
-	int primary_part = 0;
 
 
-	/*
-	 * we're ready for shutdown now, so do it.
-	 * Exynos4 is A9 based while Exynos5 is A15; check the CPU part
-	 * number by reading the Main ID register and then perform the
-	 * appropriate sequence for entering low power.
-	 */
-	asm("mrc p15, 0, %0, c0, c0, 0" : "=r"(primary_part) : : "cc");
-	if ((primary_part & 0xfff0) == 0xc0f0)
-		cpu_enter_lowpower_a15();
-	else
-		cpu_enter_lowpower_a9();
+	v7_exit_coherency_flush(louis);
 
 
 	platform_do_lowpower(cpu, &spurious);
 	platform_do_lowpower(cpu, &spurious);
 
 

+ 0 - 2
arch/arm/mach-exynos/platsmp.c

@@ -26,8 +26,6 @@
 #include <asm/smp_scu.h>
 #include <asm/smp_scu.h>
 #include <asm/firmware.h>
 #include <asm/firmware.h>
 
 
-#include <plat/cpu.h>
-
 #include "common.h"
 #include "common.h"
 #include "regs-pmu.h"
 #include "regs-pmu.h"
 
 

+ 0 - 1
arch/arm/mach-exynos/pm.c

@@ -26,7 +26,6 @@
 #include <asm/smp_scu.h>
 #include <asm/smp_scu.h>
 #include <asm/suspend.h>
 #include <asm/suspend.h>
 
 
-#include <plat/cpu.h>
 #include <plat/pm-common.h>
 #include <plat/pm-common.h>
 #include <plat/pll.h>
 #include <plat/pll.h>
 #include <plat/regs-srom.h>
 #include <plat/regs-srom.h>

+ 0 - 2
arch/arm/mach-exynos/pmu.c

@@ -13,8 +13,6 @@
 #include <linux/kernel.h>
 #include <linux/kernel.h>
 #include <linux/bug.h>
 #include <linux/bug.h>
 
 
-#include <plat/cpu.h>
-
 #include "common.h"
 #include "common.h"
 #include "regs-pmu.h"
 #include "regs-pmu.h"
 
 

+ 0 - 1
arch/arm/mach-imx/Kconfig

@@ -796,7 +796,6 @@ config SOC_IMX6Q
 	select ARM_ERRATA_764369 if SMP
 	select ARM_ERRATA_764369 if SMP
 	select HAVE_ARM_SCU if SMP
 	select HAVE_ARM_SCU if SMP
 	select HAVE_ARM_TWD if SMP
 	select HAVE_ARM_TWD if SMP
-	select MIGHT_HAVE_PCI
 	select PCI_DOMAINS if PCI
 	select PCI_DOMAINS if PCI
 	select PINCTRL_IMX6Q
 	select PINCTRL_IMX6Q
 	select SOC_IMX6
 	select SOC_IMX6

+ 0 - 7
arch/arm/mach-mvebu/Kconfig

@@ -3,15 +3,12 @@ config ARCH_MVEBU
 	select ARCH_SUPPORTS_BIG_ENDIAN
 	select ARCH_SUPPORTS_BIG_ENDIAN
 	select CLKSRC_MMIO
 	select CLKSRC_MMIO
 	select GENERIC_IRQ_CHIP
 	select GENERIC_IRQ_CHIP
-	select IRQ_DOMAIN
 	select PINCTRL
 	select PINCTRL
 	select PLAT_ORION
 	select PLAT_ORION
 	select MVEBU_MBUS
 	select MVEBU_MBUS
 	select ZONE_DMA if ARM_LPAE
 	select ZONE_DMA if ARM_LPAE
 	select ARCH_REQUIRE_GPIOLIB
 	select ARCH_REQUIRE_GPIOLIB
-	select MIGHT_HAVE_PCI
 	select PCI_QUIRKS if PCI
 	select PCI_QUIRKS if PCI
-	select OF_ADDRESS_PCI
 
 
 if ARCH_MVEBU
 if ARCH_MVEBU
 
 
@@ -38,7 +35,6 @@ config MACH_ARMADA_375
 	select ARM_ERRATA_753970
 	select ARM_ERRATA_753970
 	select ARM_GIC
 	select ARM_GIC
 	select ARMADA_375_CLK
 	select ARMADA_375_CLK
-	select CPU_V7
 	select MACH_MVEBU_V7
 	select MACH_MVEBU_V7
 	select PINCTRL_ARMADA_375
 	select PINCTRL_ARMADA_375
 	help
 	help
@@ -51,7 +47,6 @@ config MACH_ARMADA_38X
 	select ARM_ERRATA_753970
 	select ARM_ERRATA_753970
 	select ARM_GIC
 	select ARM_GIC
 	select ARMADA_38X_CLK
 	select ARMADA_38X_CLK
-	select CPU_V7
 	select MACH_MVEBU_V7
 	select MACH_MVEBU_V7
 	select PINCTRL_ARMADA_38X
 	select PINCTRL_ARMADA_38X
 	help
 	help
@@ -86,13 +81,11 @@ config MACH_KIRKWOOD
 	select ARCH_REQUIRE_GPIOLIB
 	select ARCH_REQUIRE_GPIOLIB
 	select CPU_FEROCEON
 	select CPU_FEROCEON
 	select KIRKWOOD_CLK
 	select KIRKWOOD_CLK
-	select OF_IRQ
 	select ORION_IRQCHIP
 	select ORION_IRQCHIP
 	select ORION_TIMER
 	select ORION_TIMER
 	select PCI
 	select PCI
 	select PCI_QUIRKS
 	select PCI_QUIRKS
 	select PINCTRL_KIRKWOOD
 	select PINCTRL_KIRKWOOD
-	select USE_OF
 	help
 	help
 	  Say 'Y' here if you want your kernel to support boards based
 	  Say 'Y' here if you want your kernel to support boards based
 	  on the Marvell Kirkwood device tree.
 	  on the Marvell Kirkwood device tree.

+ 2 - 2
arch/arm/mach-omap2/board-flash.c

@@ -160,13 +160,13 @@ static u8 get_gpmc0_type(void)
 	if (!fpga_map_addr)
 	if (!fpga_map_addr)
 		return -ENOMEM;
 		return -ENOMEM;
 
 
-	if (!(__raw_readw(fpga_map_addr + REG_FPGA_REV)))
+	if (!(readw_relaxed(fpga_map_addr + REG_FPGA_REV)))
 		/* we dont have an DEBUG FPGA??? */
 		/* we dont have an DEBUG FPGA??? */
 		/* Depend on #defines!! default to strata boot return param */
 		/* Depend on #defines!! default to strata boot return param */
 		goto unmap;
 		goto unmap;
 
 
 	/* S8-DIP-OFF = 1, S8-DIP-ON = 0 */
 	/* S8-DIP-OFF = 1, S8-DIP-ON = 0 */
-	cs = __raw_readw(fpga_map_addr + REG_FPGA_DIP_SWITCH_INPUT2) & 0xf;
+	cs = readw_relaxed(fpga_map_addr + REG_FPGA_DIP_SWITCH_INPUT2) & 0xf;
 
 
 	/* ES2.0 SDP's onwards 4 dip switches are provided for CS */
 	/* ES2.0 SDP's onwards 4 dip switches are provided for CS */
 	if (omap_rev() >= OMAP3430_REV_ES1_0)
 	if (omap_rev() >= OMAP3430_REV_ES1_0)

+ 1 - 1
arch/arm/mach-omap2/clkt2xxx_dpllcore.c

@@ -138,7 +138,7 @@ int omap2_reprogram_dpllcore(struct clk_hw *hw, unsigned long rate,
 		if (!dd)
 		if (!dd)
 			return -EINVAL;
 			return -EINVAL;
 
 
-		tmpset.cm_clksel1_pll = __raw_readl(dd->mult_div1_reg);
+		tmpset.cm_clksel1_pll = readl_relaxed(dd->mult_div1_reg);
 		tmpset.cm_clksel1_pll &= ~(dd->mult_mask |
 		tmpset.cm_clksel1_pll &= ~(dd->mult_mask |
 					   dd->div1_mask);
 					   dd->div1_mask);
 		div = ((curr_prcm_set->xtal_speed / 1000000) - 1);
 		div = ((curr_prcm_set->xtal_speed / 1000000) - 1);

+ 4 - 4
arch/arm/mach-omap2/clkt2xxx_osc.c

@@ -39,9 +39,9 @@ int omap2_enable_osc_ck(struct clk_hw *clk)
 {
 {
 	u32 pcc;
 	u32 pcc;
 
 
-	pcc = __raw_readl(prcm_clksrc_ctrl);
+	pcc = readl_relaxed(prcm_clksrc_ctrl);
 
 
-	__raw_writel(pcc & ~OMAP_AUTOEXTCLKMODE_MASK, prcm_clksrc_ctrl);
+	writel_relaxed(pcc & ~OMAP_AUTOEXTCLKMODE_MASK, prcm_clksrc_ctrl);
 
 
 	return 0;
 	return 0;
 }
 }
@@ -57,9 +57,9 @@ void omap2_disable_osc_ck(struct clk_hw *clk)
 {
 {
 	u32 pcc;
 	u32 pcc;
 
 
-	pcc = __raw_readl(prcm_clksrc_ctrl);
+	pcc = readl_relaxed(prcm_clksrc_ctrl);
 
 
-	__raw_writel(pcc | OMAP_AUTOEXTCLKMODE_MASK, prcm_clksrc_ctrl);
+	writel_relaxed(pcc | OMAP_AUTOEXTCLKMODE_MASK, prcm_clksrc_ctrl);
 }
 }
 
 
 unsigned long omap2_osc_clk_recalc(struct clk_hw *clk,
 unsigned long omap2_osc_clk_recalc(struct clk_hw *clk,

+ 1 - 1
arch/arm/mach-omap2/clkt2xxx_sys.c

@@ -33,7 +33,7 @@ u32 omap2xxx_get_sysclkdiv(void)
 {
 {
 	u32 div;
 	u32 div;
 
 
-	div = __raw_readl(prcm_clksrc_ctrl);
+	div = readl_relaxed(prcm_clksrc_ctrl);
 	div &= OMAP_SYSCLKDIV_MASK;
 	div &= OMAP_SYSCLKDIV_MASK;
 	div >>= OMAP_SYSCLKDIV_SHIFT;
 	div >>= OMAP_SYSCLKDIV_SHIFT;
 
 

+ 2 - 1
arch/arm/mach-omap2/clockdomain.h

@@ -18,7 +18,6 @@
 
 
 #include "powerdomain.h"
 #include "powerdomain.h"
 #include "clock.h"
 #include "clock.h"
-#include "omap_hwmod.h"
 
 
 /*
 /*
  * Clockdomain flags
  * Clockdomain flags
@@ -98,6 +97,8 @@ struct clkdm_dep {
 /* Possible flags for struct clockdomain._flags */
 /* Possible flags for struct clockdomain._flags */
 #define _CLKDM_FLAG_HWSUP_ENABLED		BIT(0)
 #define _CLKDM_FLAG_HWSUP_ENABLED		BIT(0)
 
 
+struct omap_hwmod;
+
 /**
 /**
  * struct clockdomain - OMAP clockdomain
  * struct clockdomain - OMAP clockdomain
  * @name: clockdomain name
  * @name: clockdomain name

+ 2 - 13
arch/arm/mach-omap2/cm2xxx.c

@@ -18,9 +18,6 @@
 #include <linux/err.h>
 #include <linux/err.h>
 #include <linux/io.h>
 #include <linux/io.h>
 
 
-#include "soc.h"
-#include "iomap.h"
-#include "common.h"
 #include "prm2xxx.h"
 #include "prm2xxx.h"
 #include "cm.h"
 #include "cm.h"
 #include "cm2xxx.h"
 #include "cm2xxx.h"
@@ -390,7 +387,7 @@ void omap2xxx_cm_set_mod_dividers(u32 mpu, u32 dsp, u32 gfx, u32 core, u32 mdm)
 	tmp = omap2_cm_read_mod_reg(CORE_MOD, CM_CLKSEL1) &
 	tmp = omap2_cm_read_mod_reg(CORE_MOD, CM_CLKSEL1) &
 		OMAP24XX_CLKSEL_DSS2_MASK;
 		OMAP24XX_CLKSEL_DSS2_MASK;
 	omap2_cm_write_mod_reg(core | tmp, CORE_MOD, CM_CLKSEL1);
 	omap2_cm_write_mod_reg(core | tmp, CORE_MOD, CM_CLKSEL1);
-	if (cpu_is_omap2430())
+	if (mdm)
 		omap2_cm_write_mod_reg(mdm, OMAP2430_MDM_MOD, CM_CLKSEL);
 		omap2_cm_write_mod_reg(mdm, OMAP2430_MDM_MOD, CM_CLKSEL);
 }
 }
 
 
@@ -405,19 +402,11 @@ static struct cm_ll_data omap2xxx_cm_ll_data = {
 
 
 int __init omap2xxx_cm_init(void)
 int __init omap2xxx_cm_init(void)
 {
 {
-	if (!cpu_is_omap24xx())
-		return 0;
-
 	return cm_register(&omap2xxx_cm_ll_data);
 	return cm_register(&omap2xxx_cm_ll_data);
 }
 }
 
 
 static void __exit omap2xxx_cm_exit(void)
 static void __exit omap2xxx_cm_exit(void)
 {
 {
-	if (!cpu_is_omap24xx())
-		return;
-
-	/* Should never happen */
-	WARN(cm_unregister(&omap2xxx_cm_ll_data),
-	     "%s: cm_ll_data function pointer mismatch\n", __func__);
+	cm_unregister(&omap2xxx_cm_ll_data);
 }
 }
 __exitcall(omap2xxx_cm_exit);
 __exitcall(omap2xxx_cm_exit);

+ 2 - 2
arch/arm/mach-omap2/cm2xxx_3xxx.h

@@ -52,12 +52,12 @@
 
 
 static inline u32 omap2_cm_read_mod_reg(s16 module, u16 idx)
 static inline u32 omap2_cm_read_mod_reg(s16 module, u16 idx)
 {
 {
-	return __raw_readl(cm_base + module + idx);
+	return readl_relaxed(cm_base + module + idx);
 }
 }
 
 
 static inline void omap2_cm_write_mod_reg(u32 val, s16 module, u16 idx)
 static inline void omap2_cm_write_mod_reg(u32 val, s16 module, u16 idx)
 {
 {
-	__raw_writel(val, cm_base + module + idx);
+	writel_relaxed(val, cm_base + module + idx);
 }
 }
 
 
 /* Read-modify-write a register in a CM module. Caller must lock */
 /* Read-modify-write a register in a CM module. Caller must lock */

+ 2 - 2
arch/arm/mach-omap2/cm33xx.c

@@ -50,13 +50,13 @@
 /* Read a register in a CM instance */
 /* Read a register in a CM instance */
 static inline u32 am33xx_cm_read_reg(u16 inst, u16 idx)
 static inline u32 am33xx_cm_read_reg(u16 inst, u16 idx)
 {
 {
-	return __raw_readl(cm_base + inst + idx);
+	return readl_relaxed(cm_base + inst + idx);
 }
 }
 
 
 /* Write into a register in a CM */
 /* Write into a register in a CM */
 static inline void am33xx_cm_write_reg(u32 val, u16 inst, u16 idx)
 static inline void am33xx_cm_write_reg(u32 val, u16 inst, u16 idx)
 {
 {
-	__raw_writel(val, cm_base + inst + idx);
+	writel_relaxed(val, cm_base + inst + idx);
 }
 }
 
 
 /* Read-modify-write a register in CM */
 /* Read-modify-write a register in CM */

+ 0 - 3
arch/arm/mach-omap2/cm33xx.h

@@ -17,11 +17,8 @@
 #ifndef __ARCH_ARM_MACH_OMAP2_CM_33XX_H
 #ifndef __ARCH_ARM_MACH_OMAP2_CM_33XX_H
 #define __ARCH_ARM_MACH_OMAP2_CM_33XX_H
 #define __ARCH_ARM_MACH_OMAP2_CM_33XX_H
 
 
-#include "common.h"
-
 #include "cm.h"
 #include "cm.h"
 #include "cm-regbits-33xx.h"
 #include "cm-regbits-33xx.h"
-#include "iomap.h"
 
 
 /* CM base address */
 /* CM base address */
 #define AM33XX_CM_BASE		0x44e00000
 #define AM33XX_CM_BASE		0x44e00000

+ 9 - 16
arch/arm/mach-omap2/cm3xxx.c

@@ -18,9 +18,6 @@
 #include <linux/err.h>
 #include <linux/err.h>
 #include <linux/io.h>
 #include <linux/io.h>
 
 
-#include "soc.h"
-#include "iomap.h"
-#include "common.h"
 #include "prm2xxx_3xxx.h"
 #include "prm2xxx_3xxx.h"
 #include "cm.h"
 #include "cm.h"
 #include "cm3xxx.h"
 #include "cm3xxx.h"
@@ -388,7 +385,8 @@ void omap3_cm_save_context(void)
 		omap2_cm_read_mod_reg(OMAP3430_IVA2_MOD, CM_CLKSEL1);
 		omap2_cm_read_mod_reg(OMAP3430_IVA2_MOD, CM_CLKSEL1);
 	cm_context.iva2_cm_clksel2 =
 	cm_context.iva2_cm_clksel2 =
 		omap2_cm_read_mod_reg(OMAP3430_IVA2_MOD, CM_CLKSEL2);
 		omap2_cm_read_mod_reg(OMAP3430_IVA2_MOD, CM_CLKSEL2);
-	cm_context.cm_sysconfig = __raw_readl(OMAP3430_CM_SYSCONFIG);
+	cm_context.cm_sysconfig =
+		omap2_cm_read_mod_reg(OCP_MOD, OMAP3430_CM_SYSCONFIG);
 	cm_context.sgx_cm_clksel =
 	cm_context.sgx_cm_clksel =
 		omap2_cm_read_mod_reg(OMAP3430ES2_SGX_MOD, CM_CLKSEL);
 		omap2_cm_read_mod_reg(OMAP3430ES2_SGX_MOD, CM_CLKSEL);
 	cm_context.dss_cm_clksel =
 	cm_context.dss_cm_clksel =
@@ -418,7 +416,8 @@ void omap3_cm_save_context(void)
 		omap2_cm_read_mod_reg(PLL_MOD, OMAP3430ES2_CM_CLKSEL5);
 		omap2_cm_read_mod_reg(PLL_MOD, OMAP3430ES2_CM_CLKSEL5);
 	cm_context.pll_cm_clken2 =
 	cm_context.pll_cm_clken2 =
 		omap2_cm_read_mod_reg(PLL_MOD, OMAP3430ES2_CM_CLKEN2);
 		omap2_cm_read_mod_reg(PLL_MOD, OMAP3430ES2_CM_CLKEN2);
-	cm_context.cm_polctrl = __raw_readl(OMAP3430_CM_POLCTRL);
+	cm_context.cm_polctrl =
+		omap2_cm_read_mod_reg(OCP_MOD, OMAP3430_CM_POLCTRL);
 	cm_context.iva2_cm_fclken =
 	cm_context.iva2_cm_fclken =
 		omap2_cm_read_mod_reg(OMAP3430_IVA2_MOD, CM_FCLKEN);
 		omap2_cm_read_mod_reg(OMAP3430_IVA2_MOD, CM_FCLKEN);
 	cm_context.iva2_cm_clken_pll =
 	cm_context.iva2_cm_clken_pll =
@@ -519,7 +518,8 @@ void omap3_cm_restore_context(void)
 			       CM_CLKSEL1);
 			       CM_CLKSEL1);
 	omap2_cm_write_mod_reg(cm_context.iva2_cm_clksel2, OMAP3430_IVA2_MOD,
 	omap2_cm_write_mod_reg(cm_context.iva2_cm_clksel2, OMAP3430_IVA2_MOD,
 			       CM_CLKSEL2);
 			       CM_CLKSEL2);
-	__raw_writel(cm_context.cm_sysconfig, OMAP3430_CM_SYSCONFIG);
+	omap2_cm_write_mod_reg(cm_context.cm_sysconfig, OCP_MOD,
+			       OMAP3430_CM_SYSCONFIG);
 	omap2_cm_write_mod_reg(cm_context.sgx_cm_clksel, OMAP3430ES2_SGX_MOD,
 	omap2_cm_write_mod_reg(cm_context.sgx_cm_clksel, OMAP3430ES2_SGX_MOD,
 			       CM_CLKSEL);
 			       CM_CLKSEL);
 	omap2_cm_write_mod_reg(cm_context.dss_cm_clksel, OMAP3430_DSS_MOD,
 	omap2_cm_write_mod_reg(cm_context.dss_cm_clksel, OMAP3430_DSS_MOD,
@@ -547,7 +547,8 @@ void omap3_cm_restore_context(void)
 			       OMAP3430ES2_CM_CLKSEL5);
 			       OMAP3430ES2_CM_CLKSEL5);
 	omap2_cm_write_mod_reg(cm_context.pll_cm_clken2, PLL_MOD,
 	omap2_cm_write_mod_reg(cm_context.pll_cm_clken2, PLL_MOD,
 			       OMAP3430ES2_CM_CLKEN2);
 			       OMAP3430ES2_CM_CLKEN2);
-	__raw_writel(cm_context.cm_polctrl, OMAP3430_CM_POLCTRL);
+	omap2_cm_write_mod_reg(cm_context.cm_polctrl, OCP_MOD,
+			       OMAP3430_CM_POLCTRL);
 	omap2_cm_write_mod_reg(cm_context.iva2_cm_fclken, OMAP3430_IVA2_MOD,
 	omap2_cm_write_mod_reg(cm_context.iva2_cm_fclken, OMAP3430_IVA2_MOD,
 			       CM_FCLKEN);
 			       CM_FCLKEN);
 	omap2_cm_write_mod_reg(cm_context.iva2_cm_clken_pll, OMAP3430_IVA2_MOD,
 	omap2_cm_write_mod_reg(cm_context.iva2_cm_clken_pll, OMAP3430_IVA2_MOD,
@@ -669,19 +670,11 @@ static struct cm_ll_data omap3xxx_cm_ll_data = {
 
 
 int __init omap3xxx_cm_init(void)
 int __init omap3xxx_cm_init(void)
 {
 {
-	if (!cpu_is_omap34xx())
-		return 0;
-
 	return cm_register(&omap3xxx_cm_ll_data);
 	return cm_register(&omap3xxx_cm_ll_data);
 }
 }
 
 
 static void __exit omap3xxx_cm_exit(void)
 static void __exit omap3xxx_cm_exit(void)
 {
 {
-	if (!cpu_is_omap34xx())
-		return;
-
-	/* Should never happen */
-	WARN(cm_unregister(&omap3xxx_cm_ll_data),
-	     "%s: cm_ll_data function pointer mismatch\n", __func__);
+	cm_unregister(&omap3xxx_cm_ll_data);
 }
 }
 __exitcall(omap3xxx_cm_exit);
 __exitcall(omap3xxx_cm_exit);

+ 2 - 3
arch/arm/mach-omap2/cm3xxx.h

@@ -29,9 +29,8 @@
  * These registers appear once per CM module.
  * These registers appear once per CM module.
  */
  */
 
 
-#define OMAP3430_CM_REVISION		OMAP34XX_CM_REGADDR(OCP_MOD, 0x0000)
-#define OMAP3430_CM_SYSCONFIG		OMAP34XX_CM_REGADDR(OCP_MOD, 0x0010)
-#define OMAP3430_CM_POLCTRL		OMAP34XX_CM_REGADDR(OCP_MOD, 0x009c)
+#define OMAP3430_CM_SYSCONFIG		0x0010
+#define OMAP3430_CM_POLCTRL		0x009c
 
 
 #define OMAP3_CM_CLKOUT_CTRL_OFFSET	0x0070
 #define OMAP3_CM_CLKOUT_CTRL_OFFSET	0x0070
 #define OMAP3430_CM_CLKOUT_CTRL		OMAP_CM_REGADDR(OMAP3430_CCR_MOD, 0x0070)
 #define OMAP3430_CM_CLKOUT_CTRL		OMAP_CM_REGADDR(OMAP3430_CCR_MOD, 0x0070)

+ 4 - 7
arch/arm/mach-omap2/cm44xx.c

@@ -18,35 +18,32 @@
 #include <linux/err.h>
 #include <linux/err.h>
 #include <linux/io.h>
 #include <linux/io.h>
 
 
-#include "iomap.h"
-#include "common.h"
 #include "cm.h"
 #include "cm.h"
 #include "cm1_44xx.h"
 #include "cm1_44xx.h"
 #include "cm2_44xx.h"
 #include "cm2_44xx.h"
-#include "cm-regbits-44xx.h"
 
 
 /* CM1 hardware module low-level functions */
 /* CM1 hardware module low-level functions */
 
 
 /* Read a register in CM1 */
 /* Read a register in CM1 */
 u32 omap4_cm1_read_inst_reg(s16 inst, u16 reg)
 u32 omap4_cm1_read_inst_reg(s16 inst, u16 reg)
 {
 {
-	return __raw_readl(OMAP44XX_CM1_REGADDR(inst, reg));
+	return readl_relaxed(cm_base + inst + reg);
 }
 }
 
 
 /* Write into a register in CM1 */
 /* Write into a register in CM1 */
 void omap4_cm1_write_inst_reg(u32 val, s16 inst, u16 reg)
 void omap4_cm1_write_inst_reg(u32 val, s16 inst, u16 reg)
 {
 {
-	__raw_writel(val, OMAP44XX_CM1_REGADDR(inst, reg));
+	writel_relaxed(val, cm_base + inst + reg);
 }
 }
 
 
 /* Read a register in CM2 */
 /* Read a register in CM2 */
 u32 omap4_cm2_read_inst_reg(s16 inst, u16 reg)
 u32 omap4_cm2_read_inst_reg(s16 inst, u16 reg)
 {
 {
-	return __raw_readl(OMAP44XX_CM2_REGADDR(inst, reg));
+	return readl_relaxed(cm2_base + inst + reg);
 }
 }
 
 
 /* Write into a register in CM2 */
 /* Write into a register in CM2 */
 void omap4_cm2_write_inst_reg(u32 val, s16 inst, u16 reg)
 void omap4_cm2_write_inst_reg(u32 val, s16 inst, u16 reg)
 {
 {
-	__raw_writel(val, OMAP44XX_CM2_REGADDR(inst, reg));
+	writel_relaxed(val, cm2_base + inst + reg);
 }
 }

+ 1 - 1
arch/arm/mach-omap2/cm_common.c

@@ -14,11 +14,11 @@
 #include <linux/kernel.h>
 #include <linux/kernel.h>
 #include <linux/init.h>
 #include <linux/init.h>
 #include <linux/errno.h>
 #include <linux/errno.h>
+#include <linux/bug.h>
 
 
 #include "cm2xxx.h"
 #include "cm2xxx.h"
 #include "cm3xxx.h"
 #include "cm3xxx.h"
 #include "cm44xx.h"
 #include "cm44xx.h"
-#include "common.h"
 
 
 /*
 /*
  * cm_ll_data: function pointers to SoC-specific implementations of
  * cm_ll_data: function pointers to SoC-specific implementations of

+ 9 - 5
arch/arm/mach-omap2/cminst44xx.c

@@ -21,8 +21,6 @@
 #include <linux/err.h>
 #include <linux/err.h>
 #include <linux/io.h>
 #include <linux/io.h>
 
 
-#include "iomap.h"
-#include "common.h"
 #include "clockdomain.h"
 #include "clockdomain.h"
 #include "cm.h"
 #include "cm.h"
 #include "cm1_44xx.h"
 #include "cm1_44xx.h"
@@ -30,12 +28,18 @@
 #include "cm44xx.h"
 #include "cm44xx.h"
 #include "cminst44xx.h"
 #include "cminst44xx.h"
 #include "cm-regbits-34xx.h"
 #include "cm-regbits-34xx.h"
-#include "cm-regbits-44xx.h"
 #include "prcm44xx.h"
 #include "prcm44xx.h"
 #include "prm44xx.h"
 #include "prm44xx.h"
 #include "prcm_mpu44xx.h"
 #include "prcm_mpu44xx.h"
 #include "prcm-common.h"
 #include "prcm-common.h"
 
 
+#define OMAP4430_IDLEST_SHIFT		16
+#define OMAP4430_IDLEST_MASK		(0x3 << 16)
+#define OMAP4430_CLKTRCTRL_SHIFT	0
+#define OMAP4430_CLKTRCTRL_MASK		(0x3 << 0)
+#define OMAP4430_MODULEMODE_SHIFT	0
+#define OMAP4430_MODULEMODE_MASK	(0x3 << 0)
+
 /*
 /*
  * CLKCTRL_IDLEST_*: possible values for the CM_*_CLKCTRL.IDLEST bitfield:
  * CLKCTRL_IDLEST_*: possible values for the CM_*_CLKCTRL.IDLEST bitfield:
  *
  *
@@ -116,7 +120,7 @@ u32 omap4_cminst_read_inst_reg(u8 part, u16 inst, u16 idx)
 	BUG_ON(part >= OMAP4_MAX_PRCM_PARTITIONS ||
 	BUG_ON(part >= OMAP4_MAX_PRCM_PARTITIONS ||
 	       part == OMAP4430_INVALID_PRCM_PARTITION ||
 	       part == OMAP4430_INVALID_PRCM_PARTITION ||
 	       !_cm_bases[part]);
 	       !_cm_bases[part]);
-	return __raw_readl(_cm_bases[part] + inst + idx);
+	return readl_relaxed(_cm_bases[part] + inst + idx);
 }
 }
 
 
 /* Write into a register in a CM instance */
 /* Write into a register in a CM instance */
@@ -125,7 +129,7 @@ void omap4_cminst_write_inst_reg(u32 val, u8 part, u16 inst, u16 idx)
 	BUG_ON(part >= OMAP4_MAX_PRCM_PARTITIONS ||
 	BUG_ON(part >= OMAP4_MAX_PRCM_PARTITIONS ||
 	       part == OMAP4430_INVALID_PRCM_PARTITION ||
 	       part == OMAP4430_INVALID_PRCM_PARTITION ||
 	       !_cm_bases[part]);
 	       !_cm_bases[part]);
-	__raw_writel(val, _cm_bases[part] + inst + idx);
+	writel_relaxed(val, _cm_bases[part] + inst + idx);
 }
 }
 
 
 /* Read-modify-write a register in CM1. Caller must lock */
 /* Read-modify-write a register in CM1. Caller must lock */

+ 10 - 10
arch/arm/mach-omap2/control.c

@@ -151,32 +151,32 @@ void __iomem *omap_ctrl_base_get(void)
 
 
 u8 omap_ctrl_readb(u16 offset)
 u8 omap_ctrl_readb(u16 offset)
 {
 {
-	return __raw_readb(OMAP_CTRL_REGADDR(offset));
+	return readb_relaxed(OMAP_CTRL_REGADDR(offset));
 }
 }
 
 
 u16 omap_ctrl_readw(u16 offset)
 u16 omap_ctrl_readw(u16 offset)
 {
 {
-	return __raw_readw(OMAP_CTRL_REGADDR(offset));
+	return readw_relaxed(OMAP_CTRL_REGADDR(offset));
 }
 }
 
 
 u32 omap_ctrl_readl(u16 offset)
 u32 omap_ctrl_readl(u16 offset)
 {
 {
-	return __raw_readl(OMAP_CTRL_REGADDR(offset));
+	return readl_relaxed(OMAP_CTRL_REGADDR(offset));
 }
 }
 
 
 void omap_ctrl_writeb(u8 val, u16 offset)
 void omap_ctrl_writeb(u8 val, u16 offset)
 {
 {
-	__raw_writeb(val, OMAP_CTRL_REGADDR(offset));
+	writeb_relaxed(val, OMAP_CTRL_REGADDR(offset));
 }
 }
 
 
 void omap_ctrl_writew(u16 val, u16 offset)
 void omap_ctrl_writew(u16 val, u16 offset)
 {
 {
-	__raw_writew(val, OMAP_CTRL_REGADDR(offset));
+	writew_relaxed(val, OMAP_CTRL_REGADDR(offset));
 }
 }
 
 
 void omap_ctrl_writel(u32 val, u16 offset)
 void omap_ctrl_writel(u32 val, u16 offset)
 {
 {
-	__raw_writel(val, OMAP_CTRL_REGADDR(offset));
+	writel_relaxed(val, OMAP_CTRL_REGADDR(offset));
 }
 }
 
 
 /*
 /*
@@ -188,12 +188,12 @@ void omap_ctrl_writel(u32 val, u16 offset)
 
 
 u32 omap4_ctrl_pad_readl(u16 offset)
 u32 omap4_ctrl_pad_readl(u16 offset)
 {
 {
-	return __raw_readl(OMAP4_CTRL_PAD_REGADDR(offset));
+	return readl_relaxed(OMAP4_CTRL_PAD_REGADDR(offset));
 }
 }
 
 
 void omap4_ctrl_pad_writel(u32 val, u16 offset)
 void omap4_ctrl_pad_writel(u32 val, u16 offset)
 {
 {
-	__raw_writel(val, OMAP4_CTRL_PAD_REGADDR(offset));
+	writel_relaxed(val, OMAP4_CTRL_PAD_REGADDR(offset));
 }
 }
 
 
 #ifdef CONFIG_ARCH_OMAP3
 #ifdef CONFIG_ARCH_OMAP3
@@ -222,7 +222,7 @@ void omap3_ctrl_write_boot_mode(u8 bootmode)
 	 *
 	 *
 	 * XXX This should use some omap_ctrl_writel()-type function
 	 * XXX This should use some omap_ctrl_writel()-type function
 	 */
 	 */
-	__raw_writel(l, OMAP2_L4_IO_ADDRESS(OMAP343X_SCRATCHPAD + 4));
+	writel_relaxed(l, OMAP2_L4_IO_ADDRESS(OMAP343X_SCRATCHPAD + 4));
 }
 }
 
 
 #endif
 #endif
@@ -285,7 +285,7 @@ void omap3_clear_scratchpad_contents(void)
 	if (omap2_prm_read_mod_reg(OMAP3430_GR_MOD, OMAP3_PRM_RSTST_OFFSET) &
 	if (omap2_prm_read_mod_reg(OMAP3430_GR_MOD, OMAP3_PRM_RSTST_OFFSET) &
 	    OMAP3430_GLOBAL_COLD_RST_MASK) {
 	    OMAP3430_GLOBAL_COLD_RST_MASK) {
 		for ( ; offset <= max_offset; offset += 0x4)
 		for ( ; offset <= max_offset; offset += 0x4)
-			__raw_writel(0x0, (v_addr + offset));
+			writel_relaxed(0x0, (v_addr + offset));
 		omap2_prm_set_mod_reg_bits(OMAP3430_GLOBAL_COLD_RST_MASK,
 		omap2_prm_set_mod_reg_bits(OMAP3430_GLOBAL_COLD_RST_MASK,
 					   OMAP3430_GR_MOD,
 					   OMAP3430_GR_MOD,
 					   OMAP3_PRM_RSTST_OFFSET);
 					   OMAP3_PRM_RSTST_OFFSET);

+ 2 - 2
arch/arm/mach-omap2/dma.c

@@ -91,7 +91,7 @@ static inline void dma_write(u32 val, int reg, int lch)
 	addr += reg_map[reg].offset;
 	addr += reg_map[reg].offset;
 	addr += reg_map[reg].stride * lch;
 	addr += reg_map[reg].stride * lch;
 
 
-	__raw_writel(val, addr);
+	writel_relaxed(val, addr);
 }
 }
 
 
 static inline u32 dma_read(int reg, int lch)
 static inline u32 dma_read(int reg, int lch)
@@ -101,7 +101,7 @@ static inline u32 dma_read(int reg, int lch)
 	addr += reg_map[reg].offset;
 	addr += reg_map[reg].offset;
 	addr += reg_map[reg].stride * lch;
 	addr += reg_map[reg].stride * lch;
 
 
-	return __raw_readl(addr);
+	return readl_relaxed(addr);
 }
 }
 
 
 static void omap2_clear_dma(int lch)
 static void omap2_clear_dma(int lch)

+ 4 - 4
arch/arm/mach-omap2/gpmc.c

@@ -170,12 +170,12 @@ static irqreturn_t gpmc_handle_irq(int irq, void *dev);
 
 
 static void gpmc_write_reg(int idx, u32 val)
 static void gpmc_write_reg(int idx, u32 val)
 {
 {
-	__raw_writel(val, gpmc_base + idx);
+	writel_relaxed(val, gpmc_base + idx);
 }
 }
 
 
 static u32 gpmc_read_reg(int idx)
 static u32 gpmc_read_reg(int idx)
 {
 {
-	return __raw_readl(gpmc_base + idx);
+	return readl_relaxed(gpmc_base + idx);
 }
 }
 
 
 void gpmc_cs_write_reg(int cs, int idx, u32 val)
 void gpmc_cs_write_reg(int cs, int idx, u32 val)
@@ -183,7 +183,7 @@ void gpmc_cs_write_reg(int cs, int idx, u32 val)
 	void __iomem *reg_addr;
 	void __iomem *reg_addr;
 
 
 	reg_addr = gpmc_base + GPMC_CS0_OFFSET + (cs * GPMC_CS_SIZE) + idx;
 	reg_addr = gpmc_base + GPMC_CS0_OFFSET + (cs * GPMC_CS_SIZE) + idx;
-	__raw_writel(val, reg_addr);
+	writel_relaxed(val, reg_addr);
 }
 }
 
 
 static u32 gpmc_cs_read_reg(int cs, int idx)
 static u32 gpmc_cs_read_reg(int cs, int idx)
@@ -191,7 +191,7 @@ static u32 gpmc_cs_read_reg(int cs, int idx)
 	void __iomem *reg_addr;
 	void __iomem *reg_addr;
 
 
 	reg_addr = gpmc_base + GPMC_CS0_OFFSET + (cs * GPMC_CS_SIZE) + idx;
 	reg_addr = gpmc_base + GPMC_CS0_OFFSET + (cs * GPMC_CS_SIZE) + idx;
-	return __raw_readl(reg_addr);
+	return readl_relaxed(reg_addr);
 }
 }
 
 
 /* TODO: Add support for gpmc_fck to clock framework and use it */
 /* TODO: Add support for gpmc_fck to clock framework and use it */

+ 1 - 1
arch/arm/mach-omap2/id.c

@@ -94,7 +94,7 @@ EXPORT_SYMBOL(omap_type);
 #define OMAP_TAP_DIE_ID_44XX_2	0x020c
 #define OMAP_TAP_DIE_ID_44XX_2	0x020c
 #define OMAP_TAP_DIE_ID_44XX_3	0x0210
 #define OMAP_TAP_DIE_ID_44XX_3	0x0210
 
 
-#define read_tap_reg(reg)	__raw_readl(tap_base  + (reg))
+#define read_tap_reg(reg)	readl_relaxed(tap_base  + (reg))
 
 
 struct omap_id {
 struct omap_id {
 	u16	hawkeye;	/* Silicon type (Hawkeye id) */
 	u16	hawkeye;	/* Silicon type (Hawkeye id) */

+ 2 - 2
arch/arm/mach-omap2/irq.c

@@ -83,12 +83,12 @@ struct omap3_intc_regs {
 
 
 static void intc_bank_write_reg(u32 val, struct omap_irq_bank *bank, u16 reg)
 static void intc_bank_write_reg(u32 val, struct omap_irq_bank *bank, u16 reg)
 {
 {
-	__raw_writel(val, bank->base_reg + reg);
+	writel_relaxed(val, bank->base_reg + reg);
 }
 }
 
 
 static u32 intc_bank_read_reg(struct omap_irq_bank *bank, u16 reg)
 static u32 intc_bank_read_reg(struct omap_irq_bank *bank, u16 reg)
 {
 {
-	return __raw_readl(bank->base_reg + reg);
+	return readl_relaxed(bank->base_reg + reg);
 }
 }
 
 
 /* XXX: FIQ and additional INTC support (only MPU at the moment) */
 /* XXX: FIQ and additional INTC support (only MPU at the moment) */

+ 4 - 4
arch/arm/mach-omap2/mux.c

@@ -70,18 +70,18 @@ struct omap_mux_partition *omap_mux_get(const char *name)
 u16 omap_mux_read(struct omap_mux_partition *partition, u16 reg)
 u16 omap_mux_read(struct omap_mux_partition *partition, u16 reg)
 {
 {
 	if (partition->flags & OMAP_MUX_REG_8BIT)
 	if (partition->flags & OMAP_MUX_REG_8BIT)
-		return __raw_readb(partition->base + reg);
+		return readb_relaxed(partition->base + reg);
 	else
 	else
-		return __raw_readw(partition->base + reg);
+		return readw_relaxed(partition->base + reg);
 }
 }
 
 
 void omap_mux_write(struct omap_mux_partition *partition, u16 val,
 void omap_mux_write(struct omap_mux_partition *partition, u16 val,
 			   u16 reg)
 			   u16 reg)
 {
 {
 	if (partition->flags & OMAP_MUX_REG_8BIT)
 	if (partition->flags & OMAP_MUX_REG_8BIT)
-		__raw_writeb(val, partition->base + reg);
+		writeb_relaxed(val, partition->base + reg);
 	else
 	else
-		__raw_writew(val, partition->base + reg);
+		writew_relaxed(val, partition->base + reg);
 }
 }
 
 
 void omap_mux_write_array(struct omap_mux_partition *partition,
 void omap_mux_write_array(struct omap_mux_partition *partition,

+ 2 - 2
arch/arm/mach-omap2/omap-hotplug.c

@@ -39,7 +39,7 @@ void __ref omap4_cpu_die(unsigned int cpu)
 		if (omap_modify_auxcoreboot0(0x0, 0x200) != 0x0)
 		if (omap_modify_auxcoreboot0(0x0, 0x200) != 0x0)
 			pr_err("Secure clear status failed\n");
 			pr_err("Secure clear status failed\n");
 	} else {
 	} else {
-		__raw_writel(0, base + OMAP_AUX_CORE_BOOT_0);
+		writel_relaxed(0, base + OMAP_AUX_CORE_BOOT_0);
 	}
 	}
 
 
 
 
@@ -53,7 +53,7 @@ void __ref omap4_cpu_die(unsigned int cpu)
 			boot_cpu = omap_read_auxcoreboot0();
 			boot_cpu = omap_read_auxcoreboot0();
 		else
 		else
 			boot_cpu =
 			boot_cpu =
-				__raw_readl(base + OMAP_AUX_CORE_BOOT_0) >> 5;
+				readl_relaxed(base + OMAP_AUX_CORE_BOOT_0) >> 5;
 
 
 		if (boot_cpu == smp_processor_id()) {
 		if (boot_cpu == smp_processor_id()) {
 			/*
 			/*

+ 9 - 9
arch/arm/mach-omap2/omap-mpuss-lowpower.c

@@ -116,7 +116,7 @@ static inline void set_cpu_wakeup_addr(unsigned int cpu_id, u32 addr)
 {
 {
 	struct omap4_cpu_pm_info *pm_info = &per_cpu(omap4_pm_info, cpu_id);
 	struct omap4_cpu_pm_info *pm_info = &per_cpu(omap4_pm_info, cpu_id);
 
 
-	__raw_writel(addr, pm_info->wkup_sar_addr);
+	writel_relaxed(addr, pm_info->wkup_sar_addr);
 }
 }
 
 
 /*
 /*
@@ -141,7 +141,7 @@ static void scu_pwrst_prepare(unsigned int cpu_id, unsigned int cpu_state)
 		break;
 		break;
 	}
 	}
 
 
-	__raw_writel(scu_pwr_st, pm_info->scu_sar_addr);
+	writel_relaxed(scu_pwr_st, pm_info->scu_sar_addr);
 }
 }
 
 
 /* Helper functions for MPUSS OSWR */
 /* Helper functions for MPUSS OSWR */
@@ -179,7 +179,7 @@ static void l2x0_pwrst_prepare(unsigned int cpu_id, unsigned int save_state)
 {
 {
 	struct omap4_cpu_pm_info *pm_info = &per_cpu(omap4_pm_info, cpu_id);
 	struct omap4_cpu_pm_info *pm_info = &per_cpu(omap4_pm_info, cpu_id);
 
 
-	__raw_writel(save_state, pm_info->l2x0_sar_addr);
+	writel_relaxed(save_state, pm_info->l2x0_sar_addr);
 }
 }
 
 
 /*
 /*
@@ -192,10 +192,10 @@ static void save_l2x0_context(void)
 	u32 val;
 	u32 val;
 	void __iomem *l2x0_base = omap4_get_l2cache_base();
 	void __iomem *l2x0_base = omap4_get_l2cache_base();
 	if (l2x0_base) {
 	if (l2x0_base) {
-		val = __raw_readl(l2x0_base + L2X0_AUX_CTRL);
-		__raw_writel(val, sar_base + L2X0_AUXCTRL_OFFSET);
-		val = __raw_readl(l2x0_base + L2X0_PREFETCH_CTRL);
-		__raw_writel(val, sar_base + L2X0_PREFETCH_CTRL_OFFSET);
+		val = readl_relaxed(l2x0_base + L2X0_AUX_CTRL);
+		writel_relaxed(val, sar_base + L2X0_AUXCTRL_OFFSET);
+		val = readl_relaxed(l2x0_base + L2X0_PREFETCH_CTRL);
+		writel_relaxed(val, sar_base + L2X0_PREFETCH_CTRL_OFFSET);
 	}
 	}
 }
 }
 #else
 #else
@@ -386,9 +386,9 @@ int __init omap4_mpuss_init(void)
 
 
 	/* Save device type on scratchpad for low level code to use */
 	/* Save device type on scratchpad for low level code to use */
 	if (omap_type() != OMAP2_DEVICE_TYPE_GP)
 	if (omap_type() != OMAP2_DEVICE_TYPE_GP)
-		__raw_writel(1, sar_base + OMAP_TYPE_OFFSET);
+		writel_relaxed(1, sar_base + OMAP_TYPE_OFFSET);
 	else
 	else
-		__raw_writel(0, sar_base + OMAP_TYPE_OFFSET);
+		writel_relaxed(0, sar_base + OMAP_TYPE_OFFSET);
 
 
 	save_l2x0_context();
 	save_l2x0_context();
 
 

+ 3 - 3
arch/arm/mach-omap2/omap-smp.c

@@ -99,7 +99,7 @@ static int omap4_boot_secondary(unsigned int cpu, struct task_struct *idle)
 	if (omap_secure_apis_support())
 	if (omap_secure_apis_support())
 		omap_modify_auxcoreboot0(0x200, 0xfffffdff);
 		omap_modify_auxcoreboot0(0x200, 0xfffffdff);
 	else
 	else
-		__raw_writel(0x20, base + OMAP_AUX_CORE_BOOT_0);
+		writel_relaxed(0x20, base + OMAP_AUX_CORE_BOOT_0);
 
 
 	if (!cpu1_clkdm && !cpu1_pwrdm) {
 	if (!cpu1_clkdm && !cpu1_pwrdm) {
 		cpu1_clkdm = clkdm_lookup("mpu1_clkdm");
 		cpu1_clkdm = clkdm_lookup("mpu1_clkdm");
@@ -227,8 +227,8 @@ static void __init omap4_smp_prepare_cpus(unsigned int max_cpus)
 	if (omap_secure_apis_support())
 	if (omap_secure_apis_support())
 		omap_auxcoreboot_addr(virt_to_phys(startup_addr));
 		omap_auxcoreboot_addr(virt_to_phys(startup_addr));
 	else
 	else
-		__raw_writel(virt_to_phys(omap5_secondary_startup),
-						base + OMAP_AUX_CORE_BOOT_1);
+		writel_relaxed(virt_to_phys(omap5_secondary_startup),
+			       base + OMAP_AUX_CORE_BOOT_1);
 
 
 }
 }
 
 

+ 21 - 21
arch/arm/mach-omap2/omap-wakeupgen.c

@@ -60,19 +60,19 @@ static unsigned int omap_secure_apis;
  */
  */
 static inline u32 wakeupgen_readl(u8 idx, u32 cpu)
 static inline u32 wakeupgen_readl(u8 idx, u32 cpu)
 {
 {
-	return __raw_readl(wakeupgen_base + OMAP_WKG_ENB_A_0 +
+	return readl_relaxed(wakeupgen_base + OMAP_WKG_ENB_A_0 +
 				(cpu * CPU_ENA_OFFSET) + (idx * 4));
 				(cpu * CPU_ENA_OFFSET) + (idx * 4));
 }
 }
 
 
 static inline void wakeupgen_writel(u32 val, u8 idx, u32 cpu)
 static inline void wakeupgen_writel(u32 val, u8 idx, u32 cpu)
 {
 {
-	__raw_writel(val, wakeupgen_base + OMAP_WKG_ENB_A_0 +
+	writel_relaxed(val, wakeupgen_base + OMAP_WKG_ENB_A_0 +
 				(cpu * CPU_ENA_OFFSET) + (idx * 4));
 				(cpu * CPU_ENA_OFFSET) + (idx * 4));
 }
 }
 
 
 static inline void sar_writel(u32 val, u32 offset, u8 idx)
 static inline void sar_writel(u32 val, u32 offset, u8 idx)
 {
 {
-	__raw_writel(val, sar_base + offset + (idx * 4));
+	writel_relaxed(val, sar_base + offset + (idx * 4));
 }
 }
 
 
 static inline int _wakeupgen_get_irq_info(u32 irq, u32 *bit_posn, u8 *reg_index)
 static inline int _wakeupgen_get_irq_info(u32 irq, u32 *bit_posn, u8 *reg_index)
@@ -231,21 +231,21 @@ static inline void omap4_irq_save_context(void)
 	}
 	}
 
 
 	/* Save AuxBoot* registers */
 	/* Save AuxBoot* registers */
-	val = __raw_readl(wakeupgen_base + OMAP_AUX_CORE_BOOT_0);
-	__raw_writel(val, sar_base + AUXCOREBOOT0_OFFSET);
-	val = __raw_readl(wakeupgen_base + OMAP_AUX_CORE_BOOT_1);
-	__raw_writel(val, sar_base + AUXCOREBOOT1_OFFSET);
+	val = readl_relaxed(wakeupgen_base + OMAP_AUX_CORE_BOOT_0);
+	writel_relaxed(val, sar_base + AUXCOREBOOT0_OFFSET);
+	val = readl_relaxed(wakeupgen_base + OMAP_AUX_CORE_BOOT_1);
+	writel_relaxed(val, sar_base + AUXCOREBOOT1_OFFSET);
 
 
 	/* Save SyncReq generation logic */
 	/* Save SyncReq generation logic */
-	val = __raw_readl(wakeupgen_base + OMAP_PTMSYNCREQ_MASK);
-	__raw_writel(val, sar_base + PTMSYNCREQ_MASK_OFFSET);
-	val = __raw_readl(wakeupgen_base + OMAP_PTMSYNCREQ_EN);
-	__raw_writel(val, sar_base + PTMSYNCREQ_EN_OFFSET);
+	val = readl_relaxed(wakeupgen_base + OMAP_PTMSYNCREQ_MASK);
+	writel_relaxed(val, sar_base + PTMSYNCREQ_MASK_OFFSET);
+	val = readl_relaxed(wakeupgen_base + OMAP_PTMSYNCREQ_EN);
+	writel_relaxed(val, sar_base + PTMSYNCREQ_EN_OFFSET);
 
 
 	/* Set the Backup Bit Mask status */
 	/* Set the Backup Bit Mask status */
-	val = __raw_readl(sar_base + SAR_BACKUP_STATUS_OFFSET);
+	val = readl_relaxed(sar_base + SAR_BACKUP_STATUS_OFFSET);
 	val |= SAR_BACKUP_STATUS_WAKEUPGEN;
 	val |= SAR_BACKUP_STATUS_WAKEUPGEN;
-	__raw_writel(val, sar_base + SAR_BACKUP_STATUS_OFFSET);
+	writel_relaxed(val, sar_base + SAR_BACKUP_STATUS_OFFSET);
 
 
 }
 }
 
 
@@ -264,15 +264,15 @@ static inline void omap5_irq_save_context(void)
 	}
 	}
 
 
 	/* Save AuxBoot* registers */
 	/* Save AuxBoot* registers */
-	val = __raw_readl(wakeupgen_base + OMAP_AUX_CORE_BOOT_0);
-	__raw_writel(val, sar_base + OMAP5_AUXCOREBOOT0_OFFSET);
-	val = __raw_readl(wakeupgen_base + OMAP_AUX_CORE_BOOT_0);
-	__raw_writel(val, sar_base + OMAP5_AUXCOREBOOT1_OFFSET);
+	val = readl_relaxed(wakeupgen_base + OMAP_AUX_CORE_BOOT_0);
+	writel_relaxed(val, sar_base + OMAP5_AUXCOREBOOT0_OFFSET);
+	val = readl_relaxed(wakeupgen_base + OMAP_AUX_CORE_BOOT_0);
+	writel_relaxed(val, sar_base + OMAP5_AUXCOREBOOT1_OFFSET);
 
 
 	/* Set the Backup Bit Mask status */
 	/* Set the Backup Bit Mask status */
-	val = __raw_readl(sar_base + OMAP5_SAR_BACKUP_STATUS_OFFSET);
+	val = readl_relaxed(sar_base + OMAP5_SAR_BACKUP_STATUS_OFFSET);
 	val |= SAR_BACKUP_STATUS_WAKEUPGEN;
 	val |= SAR_BACKUP_STATUS_WAKEUPGEN;
-	__raw_writel(val, sar_base + OMAP5_SAR_BACKUP_STATUS_OFFSET);
+	writel_relaxed(val, sar_base + OMAP5_SAR_BACKUP_STATUS_OFFSET);
 
 
 }
 }
 
 
@@ -306,9 +306,9 @@ static void irq_sar_clear(void)
 	if (soc_is_omap54xx())
 	if (soc_is_omap54xx())
 		offset = OMAP5_SAR_BACKUP_STATUS_OFFSET;
 		offset = OMAP5_SAR_BACKUP_STATUS_OFFSET;
 
 
-	val = __raw_readl(sar_base + offset);
+	val = readl_relaxed(sar_base + offset);
 	val &= ~SAR_BACKUP_STATUS_WAKEUPGEN;
 	val &= ~SAR_BACKUP_STATUS_WAKEUPGEN;
-	__raw_writel(val, sar_base + offset);
+	writel_relaxed(val, sar_base + offset);
 }
 }
 
 
 /*
 /*

+ 9 - 9
arch/arm/mach-omap2/omap4-common.c

@@ -125,25 +125,25 @@ void __init gic_init_irq(void)
 void gic_dist_disable(void)
 void gic_dist_disable(void)
 {
 {
 	if (gic_dist_base_addr)
 	if (gic_dist_base_addr)
-		__raw_writel(0x0, gic_dist_base_addr + GIC_DIST_CTRL);
+		writel_relaxed(0x0, gic_dist_base_addr + GIC_DIST_CTRL);
 }
 }
 
 
 void gic_dist_enable(void)
 void gic_dist_enable(void)
 {
 {
 	if (gic_dist_base_addr)
 	if (gic_dist_base_addr)
-		__raw_writel(0x1, gic_dist_base_addr + GIC_DIST_CTRL);
+		writel_relaxed(0x1, gic_dist_base_addr + GIC_DIST_CTRL);
 }
 }
 
 
 bool gic_dist_disabled(void)
 bool gic_dist_disabled(void)
 {
 {
-	return !(__raw_readl(gic_dist_base_addr + GIC_DIST_CTRL) & 0x1);
+	return !(readl_relaxed(gic_dist_base_addr + GIC_DIST_CTRL) & 0x1);
 }
 }
 
 
 void gic_timer_retrigger(void)
 void gic_timer_retrigger(void)
 {
 {
-	u32 twd_int = __raw_readl(twd_base + TWD_TIMER_INTSTAT);
-	u32 gic_int = __raw_readl(gic_dist_base_addr + GIC_DIST_PENDING_SET);
-	u32 twd_ctrl = __raw_readl(twd_base + TWD_TIMER_CONTROL);
+	u32 twd_int = readl_relaxed(twd_base + TWD_TIMER_INTSTAT);
+	u32 gic_int = readl_relaxed(gic_dist_base_addr + GIC_DIST_PENDING_SET);
+	u32 twd_ctrl = readl_relaxed(twd_base + TWD_TIMER_CONTROL);
 
 
 	if (twd_int && !(gic_int & BIT(IRQ_LOCALTIMER))) {
 	if (twd_int && !(gic_int & BIT(IRQ_LOCALTIMER))) {
 		/*
 		/*
@@ -151,11 +151,11 @@ void gic_timer_retrigger(void)
 		 * disabled.  Ack the pending interrupt, and retrigger it.
 		 * disabled.  Ack the pending interrupt, and retrigger it.
 		 */
 		 */
 		pr_warn("%s: lost localtimer interrupt\n", __func__);
 		pr_warn("%s: lost localtimer interrupt\n", __func__);
-		__raw_writel(1, twd_base + TWD_TIMER_INTSTAT);
+		writel_relaxed(1, twd_base + TWD_TIMER_INTSTAT);
 		if (!(twd_ctrl & TWD_TIMER_CONTROL_PERIODIC)) {
 		if (!(twd_ctrl & TWD_TIMER_CONTROL_PERIODIC)) {
-			__raw_writel(1, twd_base + TWD_TIMER_COUNTER);
+			writel_relaxed(1, twd_base + TWD_TIMER_COUNTER);
 			twd_ctrl |= TWD_TIMER_CONTROL_ENABLE;
 			twd_ctrl |= TWD_TIMER_CONTROL_ENABLE;
-			__raw_writel(twd_ctrl, twd_base + TWD_TIMER_CONTROL);
+			writel_relaxed(twd_ctrl, twd_base + TWD_TIMER_CONTROL);
 		}
 		}
 	}
 	}
 }
 }

+ 5 - 5
arch/arm/mach-omap2/omap_hwmod.c

@@ -72,7 +72,7 @@
  *            | (../mach-omap2/omap_hwmod*)   |
  *            | (../mach-omap2/omap_hwmod*)   |
  *            +-------------------------------+
  *            +-------------------------------+
  *            | OMAP clock/PRCM/register fns  |
  *            | OMAP clock/PRCM/register fns  |
- *            | (__raw_{read,write}l, clk*)   |
+ *            | ({read,write}l_relaxed, clk*) |
  *            +-------------------------------+
  *            +-------------------------------+
  *
  *
  * Device drivers should not contain any OMAP-specific code or data in
  * Device drivers should not contain any OMAP-specific code or data in
@@ -3230,17 +3230,17 @@ static int _am33xx_is_hardreset_asserted(struct omap_hwmod *oh,
 u32 omap_hwmod_read(struct omap_hwmod *oh, u16 reg_offs)
 u32 omap_hwmod_read(struct omap_hwmod *oh, u16 reg_offs)
 {
 {
 	if (oh->flags & HWMOD_16BIT_REG)
 	if (oh->flags & HWMOD_16BIT_REG)
-		return __raw_readw(oh->_mpu_rt_va + reg_offs);
+		return readw_relaxed(oh->_mpu_rt_va + reg_offs);
 	else
 	else
-		return __raw_readl(oh->_mpu_rt_va + reg_offs);
+		return readl_relaxed(oh->_mpu_rt_va + reg_offs);
 }
 }
 
 
 void omap_hwmod_write(u32 v, struct omap_hwmod *oh, u16 reg_offs)
 void omap_hwmod_write(u32 v, struct omap_hwmod *oh, u16 reg_offs)
 {
 {
 	if (oh->flags & HWMOD_16BIT_REG)
 	if (oh->flags & HWMOD_16BIT_REG)
-		__raw_writew(v, oh->_mpu_rt_va + reg_offs);
+		writew_relaxed(v, oh->_mpu_rt_va + reg_offs);
 	else
 	else
-		__raw_writel(v, oh->_mpu_rt_va + reg_offs);
+		writel_relaxed(v, oh->_mpu_rt_va + reg_offs);
 }
 }
 
 
 /**
 /**

+ 1 - 0
arch/arm/mach-omap2/omap_hwmod_33xx_43xx_ipblock_data.c

@@ -24,6 +24,7 @@
 #include "prm33xx.h"
 #include "prm33xx.h"
 #include "omap_hwmod_33xx_43xx_common_data.h"
 #include "omap_hwmod_33xx_43xx_common_data.h"
 #include "prcm43xx.h"
 #include "prcm43xx.h"
+#include "common.h"
 
 
 #define CLKCTRL(oh, clkctrl) ((oh).prcm.omap4.clkctrl_offs = (clkctrl))
 #define CLKCTRL(oh, clkctrl) ((oh).prcm.omap4.clkctrl_offs = (clkctrl))
 #define RSTCTRL(oh, rstctrl) ((oh).prcm.omap4.rstctrl_offs = (rstctrl))
 #define RSTCTRL(oh, rstctrl) ((oh).prcm.omap4.rstctrl_offs = (rstctrl))

+ 3 - 3
arch/arm/mach-omap2/omap_phy_internal.c

@@ -57,7 +57,7 @@ static int __init omap4430_phy_power_down(void)
 	}
 	}
 
 
 	/* Power down the phy */
 	/* Power down the phy */
-	__raw_writel(PHY_PD, ctrl_base + CONTROL_DEV_CONF);
+	writel_relaxed(PHY_PD, ctrl_base + CONTROL_DEV_CONF);
 
 
 	iounmap(ctrl_base);
 	iounmap(ctrl_base);
 
 
@@ -162,7 +162,7 @@ void ti81xx_musb_phy_power(u8 on)
 		return;
 		return;
 	}
 	}
 
 
-	usbphycfg = __raw_readl(scm_base + USBCTRL0);
+	usbphycfg = readl_relaxed(scm_base + USBCTRL0);
 
 
 	if (on) {
 	if (on) {
 		if (cpu_is_ti816x()) {
 		if (cpu_is_ti816x()) {
@@ -181,7 +181,7 @@ void ti81xx_musb_phy_power(u8 on)
 			usbphycfg |= USBPHY_CM_PWRDN | USBPHY_OTG_PWRDN;
 			usbphycfg |= USBPHY_CM_PWRDN | USBPHY_OTG_PWRDN;
 
 
 	}
 	}
-	__raw_writel(usbphycfg, scm_base + USBCTRL0);
+	writel_relaxed(usbphycfg, scm_base + USBCTRL0);
 
 
 	iounmap(scm_base);
 	iounmap(scm_base);
 }
 }

+ 0 - 1
arch/arm/mach-omap2/powerdomain-common.c

@@ -17,7 +17,6 @@
 #include "pm.h"
 #include "pm.h"
 #include "cm.h"
 #include "cm.h"
 #include "cm-regbits-34xx.h"
 #include "cm-regbits-34xx.h"
-#include "cm-regbits-44xx.h"
 #include "prm-regbits-34xx.h"
 #include "prm-regbits-34xx.h"
 #include "prm-regbits-44xx.h"
 #include "prm-regbits-44xx.h"
 
 

+ 1 - 0
arch/arm/mach-omap2/powerdomain.c

@@ -32,6 +32,7 @@
 
 
 #include "powerdomain.h"
 #include "powerdomain.h"
 #include "clockdomain.h"
 #include "clockdomain.h"
+#include "voltage.h"
 
 
 #include "soc.h"
 #include "soc.h"
 #include "pm.h"
 #include "pm.h"

+ 1 - 2
arch/arm/mach-omap2/powerdomain.h

@@ -21,8 +21,6 @@
 #include <linux/list.h>
 #include <linux/list.h>
 #include <linux/spinlock.h>
 #include <linux/spinlock.h>
 
 
-#include "voltage.h"
-
 /* Powerdomain basic power states */
 /* Powerdomain basic power states */
 #define PWRDM_POWER_OFF		0x0
 #define PWRDM_POWER_OFF		0x0
 #define PWRDM_POWER_RET		0x1
 #define PWRDM_POWER_RET		0x1
@@ -75,6 +73,7 @@
 
 
 struct clockdomain;
 struct clockdomain;
 struct powerdomain;
 struct powerdomain;
+struct voltagedomain;
 
 
 /**
 /**
  * struct powerdomain - OMAP powerdomain
  * struct powerdomain - OMAP powerdomain

+ 24 - 0
arch/arm/mach-omap2/prcm-common.h

@@ -428,6 +428,28 @@
 #define MAX_IOPAD_LATCH_TIME			100
 #define MAX_IOPAD_LATCH_TIME			100
 # ifndef __ASSEMBLER__
 # ifndef __ASSEMBLER__
 
 
+#include <linux/delay.h>
+
+/**
+ * omap_test_timeout - busy-loop, testing a condition
+ * @cond: condition to test until it evaluates to true
+ * @timeout: maximum number of microseconds in the timeout
+ * @index: loop index (integer)
+ *
+ * Loop waiting for @cond to become true or until at least @timeout
+ * microseconds have passed.  To use, define some integer @index in the
+ * calling code.  After running, if @index == @timeout, then the loop has
+ * timed out.
+ */
+#define omap_test_timeout(cond, timeout, index)			\
+({								\
+	for (index = 0; index < timeout; index++) {		\
+		if (cond)					\
+			break;					\
+		udelay(1);					\
+	}							\
+})
+
 /**
 /**
  * struct omap_prcm_irq - describes a PRCM interrupt bit
  * struct omap_prcm_irq - describes a PRCM interrupt bit
  * @name: a short name describing the interrupt type, e.g. "wkup" or "io"
  * @name: a short name describing the interrupt type, e.g. "wkup" or "io"
@@ -458,6 +480,7 @@ struct omap_prcm_irq {
  * @ocp_barrier: fn ptr to force buffered PRM writes to complete
  * @ocp_barrier: fn ptr to force buffered PRM writes to complete
  * @save_and_clear_irqen: fn ptr to save and clear IRQENABLE regs
  * @save_and_clear_irqen: fn ptr to save and clear IRQENABLE regs
  * @restore_irqen: fn ptr to save and clear IRQENABLE regs
  * @restore_irqen: fn ptr to save and clear IRQENABLE regs
+ * @reconfigure_io_chain: fn ptr to reconfigure IO chain
  * @saved_mask: IRQENABLE regs are saved here during suspend
  * @saved_mask: IRQENABLE regs are saved here during suspend
  * @priority_mask: 1 bit per IRQ, set to 1 if omap_prcm_irq.priority = true
  * @priority_mask: 1 bit per IRQ, set to 1 if omap_prcm_irq.priority = true
  * @base_irq: base dynamic IRQ number, returned from irq_alloc_descs() in init
  * @base_irq: base dynamic IRQ number, returned from irq_alloc_descs() in init
@@ -479,6 +502,7 @@ struct omap_prcm_irq_setup {
 	void (*ocp_barrier)(void);
 	void (*ocp_barrier)(void);
 	void (*save_and_clear_irqen)(u32 *saved_mask);
 	void (*save_and_clear_irqen)(u32 *saved_mask);
 	void (*restore_irqen)(u32 *saved_mask);
 	void (*restore_irqen)(u32 *saved_mask);
+	void (*reconfigure_io_chain)(void);
 	u32 *saved_mask;
 	u32 *saved_mask;
 	u32 *priority_mask;
 	u32 *priority_mask;
 	int base_irq;
 	int base_irq;

+ 2 - 2
arch/arm/mach-omap2/prcm_mpu44xx.c

@@ -30,12 +30,12 @@ void __iomem *prcm_mpu_base;
 
 
 u32 omap4_prcm_mpu_read_inst_reg(s16 inst, u16 reg)
 u32 omap4_prcm_mpu_read_inst_reg(s16 inst, u16 reg)
 {
 {
-	return __raw_readl(OMAP44XX_PRCM_MPU_REGADDR(inst, reg));
+	return readl_relaxed(OMAP44XX_PRCM_MPU_REGADDR(inst, reg));
 }
 }
 
 
 void omap4_prcm_mpu_write_inst_reg(u32 val, s16 inst, u16 reg)
 void omap4_prcm_mpu_write_inst_reg(u32 val, s16 inst, u16 reg)
 {
 {
-	__raw_writel(val, OMAP44XX_PRCM_MPU_REGADDR(inst, reg));
+	writel_relaxed(val, OMAP44XX_PRCM_MPU_REGADDR(inst, reg));
 }
 }
 
 
 u32 omap4_prcm_mpu_rmw_inst_reg_bits(u32 mask, u32 bits, s16 inst, s16 reg)
 u32 omap4_prcm_mpu_rmw_inst_reg_bits(u32 mask, u32 bits, s16 inst, s16 reg)

+ 0 - 1
arch/arm/mach-omap2/prcm_mpu44xx.h

@@ -26,7 +26,6 @@
 #define __ARCH_ARM_MACH_OMAP2_PRCM_MPU44XX_H
 #define __ARCH_ARM_MACH_OMAP2_PRCM_MPU44XX_H
 
 
 #include "prcm_mpu_44xx_54xx.h"
 #include "prcm_mpu_44xx_54xx.h"
-#include "common.h"
 
 
 #define OMAP4430_PRCM_MPU_BASE			0x48243000
 #define OMAP4430_PRCM_MPU_BASE			0x48243000
 
 

+ 10 - 0
arch/arm/mach-omap2/prm.h

@@ -17,10 +17,18 @@
 
 
 # ifndef __ASSEMBLER__
 # ifndef __ASSEMBLER__
 extern void __iomem *prm_base;
 extern void __iomem *prm_base;
+extern u16 prm_features;
 extern void omap2_set_globals_prm(void __iomem *prm);
 extern void omap2_set_globals_prm(void __iomem *prm);
 int of_prcm_init(void);
 int of_prcm_init(void);
 # endif
 # endif
 
 
+/*
+ * prm_features flag values
+ *
+ * PRM_HAS_IO_WAKEUP: has IO wakeup capability
+ * PRM_HAS_VOLTAGE: has voltage domains
+ */
+#define PRM_HAS_IO_WAKEUP	(1 << 0)
 
 
 /*
 /*
  * MAX_MODULE_SOFTRESET_WAIT: Maximum microseconds to wait for OMAP
  * MAX_MODULE_SOFTRESET_WAIT: Maximum microseconds to wait for OMAP
@@ -118,6 +126,7 @@ struct prm_reset_src_map {
  * @read_reset_sources: ptr to the SoC PRM-specific get_reset_source impl
  * @read_reset_sources: ptr to the SoC PRM-specific get_reset_source impl
  * @was_any_context_lost_old: ptr to the SoC PRM context loss test fn
  * @was_any_context_lost_old: ptr to the SoC PRM context loss test fn
  * @clear_context_loss_flags_old: ptr to the SoC PRM context loss flag clear fn
  * @clear_context_loss_flags_old: ptr to the SoC PRM context loss flag clear fn
+ * @late_init: ptr to the late init function
  *
  *
  * XXX @was_any_context_lost_old and @clear_context_loss_flags_old are
  * XXX @was_any_context_lost_old and @clear_context_loss_flags_old are
  * deprecated.
  * deprecated.
@@ -126,6 +135,7 @@ struct prm_ll_data {
 	u32 (*read_reset_sources)(void);
 	u32 (*read_reset_sources)(void);
 	bool (*was_any_context_lost_old)(u8 part, s16 inst, u16 idx);
 	bool (*was_any_context_lost_old)(u8 part, s16 inst, u16 idx);
 	void (*clear_context_loss_flags_old)(u8 part, s16 inst, u16 idx);
 	void (*clear_context_loss_flags_old)(u8 part, s16 inst, u16 idx);
+	int (*late_init)(void);
 };
 };
 
 
 extern int prm_register(struct prm_ll_data *pld);
 extern int prm_register(struct prm_ll_data *pld);

+ 1 - 12
arch/arm/mach-omap2/prm2xxx.c

@@ -18,9 +18,6 @@
 #include <linux/io.h>
 #include <linux/io.h>
 #include <linux/irq.h>
 #include <linux/irq.h>
 
 
-#include "soc.h"
-#include "common.h"
-#include "vp.h"
 #include "powerdomain.h"
 #include "powerdomain.h"
 #include "clockdomain.h"
 #include "clockdomain.h"
 #include "prm2xxx.h"
 #include "prm2xxx.h"
@@ -201,19 +198,11 @@ static struct prm_ll_data omap2xxx_prm_ll_data = {
 
 
 int __init omap2xxx_prm_init(void)
 int __init omap2xxx_prm_init(void)
 {
 {
-	if (!cpu_is_omap24xx())
-		return 0;
-
 	return prm_register(&omap2xxx_prm_ll_data);
 	return prm_register(&omap2xxx_prm_ll_data);
 }
 }
 
 
 static void __exit omap2xxx_prm_exit(void)
 static void __exit omap2xxx_prm_exit(void)
 {
 {
-	if (!cpu_is_omap24xx())
-		return;
-
-	/* Should never happen */
-	WARN(prm_unregister(&omap2xxx_prm_ll_data),
-	     "%s: prm_ll_data function pointer mismatch\n", __func__);
+	prm_unregister(&omap2xxx_prm_ll_data);
 }
 }
 __exitcall(omap2xxx_prm_exit);
 __exitcall(omap2xxx_prm_exit);

+ 1 - 1
arch/arm/mach-omap2/prm2xxx.h

@@ -27,7 +27,7 @@
 
 
 /*
 /*
  * OMAP2-specific global PRM registers
  * OMAP2-specific global PRM registers
- * Use __raw_{read,write}l() with these registers.
+ * Use {read,write}l_relaxed() with these registers.
  *
  *
  * With a few exceptions, these are the register names beginning with
  * With a few exceptions, these are the register names beginning with
  * PRCM_* on 24xx.  (The exceptions are the IRQSTATUS and IRQENABLE
  * PRCM_* on 24xx.  (The exceptions are the IRQSTATUS and IRQENABLE

+ 0 - 1
arch/arm/mach-omap2/prm2xxx_3xxx.c

@@ -16,7 +16,6 @@
 #include <linux/err.h>
 #include <linux/err.h>
 #include <linux/io.h>
 #include <linux/io.h>
 
 
-#include "common.h"
 #include "powerdomain.h"
 #include "powerdomain.h"
 #include "prm2xxx_3xxx.h"
 #include "prm2xxx_3xxx.h"
 #include "prm-regbits-24xx.h"
 #include "prm-regbits-24xx.h"

+ 2 - 2
arch/arm/mach-omap2/prm2xxx_3xxx.h

@@ -55,12 +55,12 @@
 /* Power/reset management domain register get/set */
 /* Power/reset management domain register get/set */
 static inline u32 omap2_prm_read_mod_reg(s16 module, u16 idx)
 static inline u32 omap2_prm_read_mod_reg(s16 module, u16 idx)
 {
 {
-	return __raw_readl(prm_base + module + idx);
+	return readl_relaxed(prm_base + module + idx);
 }
 }
 
 
 static inline void omap2_prm_write_mod_reg(u32 val, s16 module, u16 idx)
 static inline void omap2_prm_write_mod_reg(u32 val, s16 module, u16 idx)
 {
 {
-	__raw_writel(val, prm_base + module + idx);
+	writel_relaxed(val, prm_base + module + idx);
 }
 }
 
 
 /* Read-modify-write a register in a PRM module. Caller must lock */
 /* Read-modify-write a register in a PRM module. Caller must lock */

+ 2 - 3
arch/arm/mach-omap2/prm33xx.c

@@ -19,7 +19,6 @@
 #include <linux/err.h>
 #include <linux/err.h>
 #include <linux/io.h>
 #include <linux/io.h>
 
 
-#include "common.h"
 #include "powerdomain.h"
 #include "powerdomain.h"
 #include "prm33xx.h"
 #include "prm33xx.h"
 #include "prm-regbits-33xx.h"
 #include "prm-regbits-33xx.h"
@@ -27,13 +26,13 @@
 /* Read a register in a PRM instance */
 /* Read a register in a PRM instance */
 u32 am33xx_prm_read_reg(s16 inst, u16 idx)
 u32 am33xx_prm_read_reg(s16 inst, u16 idx)
 {
 {
-	return __raw_readl(prm_base + inst + idx);
+	return readl_relaxed(prm_base + inst + idx);
 }
 }
 
 
 /* Write into a register in a PRM instance */
 /* Write into a register in a PRM instance */
 void am33xx_prm_write_reg(u32 val, s16 inst, u16 idx)
 void am33xx_prm_write_reg(u32 val, s16 inst, u16 idx)
 {
 {
-	__raw_writel(val, prm_base + inst + idx);
+	writel_relaxed(val, prm_base + inst + idx);
 }
 }
 
 
 /* Read-modify-write a register in PRM. Caller must lock */
 /* Read-modify-write a register in PRM. Caller must lock */

+ 10 - 12
arch/arm/mach-omap2/prm3xxx.c

@@ -43,6 +43,7 @@ static struct omap_prcm_irq_setup omap3_prcm_irq_setup = {
 	.ocp_barrier		= &omap3xxx_prm_ocp_barrier,
 	.ocp_barrier		= &omap3xxx_prm_ocp_barrier,
 	.save_and_clear_irqen	= &omap3xxx_prm_save_and_clear_irqen,
 	.save_and_clear_irqen	= &omap3xxx_prm_save_and_clear_irqen,
 	.restore_irqen		= &omap3xxx_prm_restore_irqen,
 	.restore_irqen		= &omap3xxx_prm_restore_irqen,
+	.reconfigure_io_chain	= &omap3xxx_prm_reconfigure_io_chain,
 };
 };
 
 
 /*
 /*
@@ -246,7 +247,7 @@ void omap3xxx_prm_reconfigure_io_chain(void)
  */
  */
 static void __init omap3xxx_prm_enable_io_wakeup(void)
 static void __init omap3xxx_prm_enable_io_wakeup(void)
 {
 {
-	if (omap3_has_io_wakeup())
+	if (prm_features & PRM_HAS_IO_WAKEUP)
 		omap2_prm_set_mod_reg_bits(OMAP3430_EN_IO_MASK, WKUP_MOD,
 		omap2_prm_set_mod_reg_bits(OMAP3430_EN_IO_MASK, WKUP_MOD,
 					   PM_WKEN);
 					   PM_WKEN);
 }
 }
@@ -400,23 +401,26 @@ struct pwrdm_ops omap3_pwrdm_operations = {
  *
  *
  */
  */
 
 
+static int omap3xxx_prm_late_init(void);
+
 static struct prm_ll_data omap3xxx_prm_ll_data = {
 static struct prm_ll_data omap3xxx_prm_ll_data = {
 	.read_reset_sources = &omap3xxx_prm_read_reset_sources,
 	.read_reset_sources = &omap3xxx_prm_read_reset_sources,
+	.late_init = &omap3xxx_prm_late_init,
 };
 };
 
 
 int __init omap3xxx_prm_init(void)
 int __init omap3xxx_prm_init(void)
 {
 {
-	if (!cpu_is_omap34xx())
-		return 0;
+	if (omap3_has_io_wakeup())
+		prm_features |= PRM_HAS_IO_WAKEUP;
 
 
 	return prm_register(&omap3xxx_prm_ll_data);
 	return prm_register(&omap3xxx_prm_ll_data);
 }
 }
 
 
-static int __init omap3xxx_prm_late_init(void)
+static int omap3xxx_prm_late_init(void)
 {
 {
 	int ret;
 	int ret;
 
 
-	if (!cpu_is_omap34xx())
+	if (!(prm_features & PRM_HAS_IO_WAKEUP))
 		return 0;
 		return 0;
 
 
 	omap3xxx_prm_enable_io_wakeup();
 	omap3xxx_prm_enable_io_wakeup();
@@ -427,15 +431,9 @@ static int __init omap3xxx_prm_late_init(void)
 
 
 	return ret;
 	return ret;
 }
 }
-omap_subsys_initcall(omap3xxx_prm_late_init);
 
 
 static void __exit omap3xxx_prm_exit(void)
 static void __exit omap3xxx_prm_exit(void)
 {
 {
-	if (!cpu_is_omap34xx())
-		return;
-
-	/* Should never happen */
-	WARN(prm_unregister(&omap3xxx_prm_ll_data),
-	     "%s: prm_ll_data function pointer mismatch\n", __func__);
+	prm_unregister(&omap3xxx_prm_ll_data);
 }
 }
 __exitcall(omap3xxx_prm_exit);
 __exitcall(omap3xxx_prm_exit);

+ 1 - 1
arch/arm/mach-omap2/prm3xxx.h

@@ -26,7 +26,7 @@
 
 
 /*
 /*
  * OMAP3-specific global PRM registers
  * OMAP3-specific global PRM registers
- * Use __raw_{read,write}l() with these registers.
+ * Use {read,write}l_relaxed() with these registers.
  *
  *
  * With a few exceptions, these are the register names beginning with
  * With a few exceptions, these are the register names beginning with
  * PRM_* on 34xx.  (The exceptions are the IRQSTATUS and IRQENABLE
  * PRM_* on 34xx.  (The exceptions are the IRQSTATUS and IRQENABLE

+ 11 - 13
arch/arm/mach-omap2/prm44xx.c

@@ -47,6 +47,7 @@ static struct omap_prcm_irq_setup omap4_prcm_irq_setup = {
 	.ocp_barrier		= &omap44xx_prm_ocp_barrier,
 	.ocp_barrier		= &omap44xx_prm_ocp_barrier,
 	.save_and_clear_irqen	= &omap44xx_prm_save_and_clear_irqen,
 	.save_and_clear_irqen	= &omap44xx_prm_save_and_clear_irqen,
 	.restore_irqen		= &omap44xx_prm_restore_irqen,
 	.restore_irqen		= &omap44xx_prm_restore_irqen,
+	.reconfigure_io_chain	= &omap44xx_prm_reconfigure_io_chain,
 };
 };
 
 
 /*
 /*
@@ -81,13 +82,13 @@ static struct prm_reset_src_map omap44xx_prm_reset_src_map[] = {
 /* Read a register in a CM/PRM instance in the PRM module */
 /* Read a register in a CM/PRM instance in the PRM module */
 u32 omap4_prm_read_inst_reg(s16 inst, u16 reg)
 u32 omap4_prm_read_inst_reg(s16 inst, u16 reg)
 {
 {
-	return __raw_readl(prm_base + inst + reg);
+	return readl_relaxed(prm_base + inst + reg);
 }
 }
 
 
 /* Write into a register in a CM/PRM instance in the PRM module */
 /* Write into a register in a CM/PRM instance in the PRM module */
 void omap4_prm_write_inst_reg(u32 val, s16 inst, u16 reg)
 void omap4_prm_write_inst_reg(u32 val, s16 inst, u16 reg)
 {
 {
-	__raw_writel(val, prm_base + inst + reg);
+	writel_relaxed(val, prm_base + inst + reg);
 }
 }
 
 
 /* Read-modify-write a register in a PRM module. Caller must lock */
 /* Read-modify-write a register in a PRM module. Caller must lock */
@@ -649,6 +650,8 @@ struct pwrdm_ops omap4_pwrdm_operations = {
 	.pwrdm_has_voltdm	= omap4_check_vcvp,
 	.pwrdm_has_voltdm	= omap4_check_vcvp,
 };
 };
 
 
+static int omap44xx_prm_late_init(void);
+
 /*
 /*
  * XXX document
  * XXX document
  */
  */
@@ -656,34 +659,29 @@ static struct prm_ll_data omap44xx_prm_ll_data = {
 	.read_reset_sources = &omap44xx_prm_read_reset_sources,
 	.read_reset_sources = &omap44xx_prm_read_reset_sources,
 	.was_any_context_lost_old = &omap44xx_prm_was_any_context_lost_old,
 	.was_any_context_lost_old = &omap44xx_prm_was_any_context_lost_old,
 	.clear_context_loss_flags_old = &omap44xx_prm_clear_context_loss_flags_old,
 	.clear_context_loss_flags_old = &omap44xx_prm_clear_context_loss_flags_old,
+	.late_init = &omap44xx_prm_late_init,
 };
 };
 
 
 int __init omap44xx_prm_init(void)
 int __init omap44xx_prm_init(void)
 {
 {
-	if (!cpu_is_omap44xx() && !soc_is_omap54xx() && !soc_is_dra7xx())
-		return 0;
+	if (cpu_is_omap44xx())
+		prm_features |= PRM_HAS_IO_WAKEUP;
 
 
 	return prm_register(&omap44xx_prm_ll_data);
 	return prm_register(&omap44xx_prm_ll_data);
 }
 }
 
 
-static int __init omap44xx_prm_late_init(void)
+static int omap44xx_prm_late_init(void)
 {
 {
-	if (!cpu_is_omap44xx())
+	if (!(prm_features & PRM_HAS_IO_WAKEUP))
 		return 0;
 		return 0;
 
 
 	omap44xx_prm_enable_io_wakeup();
 	omap44xx_prm_enable_io_wakeup();
 
 
 	return omap_prcm_register_chain_handler(&omap4_prcm_irq_setup);
 	return omap_prcm_register_chain_handler(&omap4_prcm_irq_setup);
 }
 }
-omap_subsys_initcall(omap44xx_prm_late_init);
 
 
 static void __exit omap44xx_prm_exit(void)
 static void __exit omap44xx_prm_exit(void)
 {
 {
-	if (!cpu_is_omap44xx())
-		return;
-
-	/* Should never happen */
-	WARN(prm_unregister(&omap44xx_prm_ll_data),
-	     "%s: prm_ll_data function pointer mismatch\n", __func__);
+	prm_unregister(&omap44xx_prm_ll_data);
 }
 }
 __exitcall(omap44xx_prm_exit);
 __exitcall(omap44xx_prm_exit);

+ 11 - 6
arch/arm/mach-omap2/prm_common.c

@@ -62,6 +62,8 @@ static struct omap_prcm_irq_setup *prcm_irq_setup;
 /* prm_base: base virtual address of the PRM IP block */
 /* prm_base: base virtual address of the PRM IP block */
 void __iomem *prm_base;
 void __iomem *prm_base;
 
 
+u16 prm_features;
+
 /*
 /*
  * prm_ll_data: function pointers to SoC-specific implementations of
  * prm_ll_data: function pointers to SoC-specific implementations of
  * common PRM functions
  * common PRM functions
@@ -330,12 +332,7 @@ int omap_prcm_register_chain_handler(struct omap_prcm_irq_setup *irq_setup)
 
 
 	if (of_have_populated_dt()) {
 	if (of_have_populated_dt()) {
 		int irq = omap_prcm_event_to_irq("io");
 		int irq = omap_prcm_event_to_irq("io");
-		if (cpu_is_omap34xx())
-			omap_pcs_legacy_init(irq,
-				omap3xxx_prm_reconfigure_io_chain);
-		else
-			omap_pcs_legacy_init(irq,
-				omap44xx_prm_reconfigure_io_chain);
+		omap_pcs_legacy_init(irq, irq_setup->reconfigure_io_chain);
 	}
 	}
 
 
 	return 0;
 	return 0;
@@ -530,3 +527,11 @@ int __init of_prcm_init(void)
 
 
 	return 0;
 	return 0;
 }
 }
+
+static int __init prm_late_init(void)
+{
+	if (prm_ll_data->late_init)
+		return prm_ll_data->late_init();
+	return 0;
+}
+subsys_initcall(prm_late_init);

+ 2 - 2
arch/arm/mach-omap2/prminst44xx.c

@@ -49,7 +49,7 @@ u32 omap4_prminst_read_inst_reg(u8 part, s16 inst, u16 idx)
 	BUG_ON(part >= OMAP4_MAX_PRCM_PARTITIONS ||
 	BUG_ON(part >= OMAP4_MAX_PRCM_PARTITIONS ||
 	       part == OMAP4430_INVALID_PRCM_PARTITION ||
 	       part == OMAP4430_INVALID_PRCM_PARTITION ||
 	       !_prm_bases[part]);
 	       !_prm_bases[part]);
-	return __raw_readl(_prm_bases[part] + inst + idx);
+	return readl_relaxed(_prm_bases[part] + inst + idx);
 }
 }
 
 
 /* Write into a register in a PRM instance */
 /* Write into a register in a PRM instance */
@@ -58,7 +58,7 @@ void omap4_prminst_write_inst_reg(u32 val, u8 part, s16 inst, u16 idx)
 	BUG_ON(part >= OMAP4_MAX_PRCM_PARTITIONS ||
 	BUG_ON(part >= OMAP4_MAX_PRCM_PARTITIONS ||
 	       part == OMAP4430_INVALID_PRCM_PARTITION ||
 	       part == OMAP4430_INVALID_PRCM_PARTITION ||
 	       !_prm_bases[part]);
 	       !_prm_bases[part]);
-	__raw_writel(val, _prm_bases[part] + inst + idx);
+	writel_relaxed(val, _prm_bases[part] + inst + idx);
 }
 }
 
 
 /* Read-modify-write a register in PRM. Caller must lock */
 /* Read-modify-write a register in PRM. Caller must lock */

+ 4 - 4
arch/arm/mach-omap2/sdrc.h

@@ -31,24 +31,24 @@ extern void __iomem *omap2_sms_base;
 
 
 static inline void sdrc_write_reg(u32 val, u16 reg)
 static inline void sdrc_write_reg(u32 val, u16 reg)
 {
 {
-	__raw_writel(val, OMAP_SDRC_REGADDR(reg));
+	writel_relaxed(val, OMAP_SDRC_REGADDR(reg));
 }
 }
 
 
 static inline u32 sdrc_read_reg(u16 reg)
 static inline u32 sdrc_read_reg(u16 reg)
 {
 {
-	return __raw_readl(OMAP_SDRC_REGADDR(reg));
+	return readl_relaxed(OMAP_SDRC_REGADDR(reg));
 }
 }
 
 
 /* SMS global register get/set */
 /* SMS global register get/set */
 
 
 static inline void sms_write_reg(u32 val, u16 reg)
 static inline void sms_write_reg(u32 val, u16 reg)
 {
 {
-	__raw_writel(val, OMAP_SMS_REGADDR(reg));
+	writel_relaxed(val, OMAP_SMS_REGADDR(reg));
 }
 }
 
 
 static inline u32 sms_read_reg(u16 reg)
 static inline u32 sms_read_reg(u16 reg)
 {
 {
-	return __raw_readl(OMAP_SMS_REGADDR(reg));
+	return readl_relaxed(OMAP_SMS_REGADDR(reg));
 }
 }
 
 
 extern void omap2_set_globals_sdrc(void __iomem *sdrc, void __iomem *sms);
 extern void omap2_set_globals_sdrc(void __iomem *sdrc, void __iomem *sms);

+ 2 - 2
arch/arm/mach-omap2/sdrc2xxx.c

@@ -103,9 +103,9 @@ u32 omap2xxx_sdrc_reprogram(u32 level, u32 force)
 	 * prm2xxx.c function
 	 * prm2xxx.c function
 	 */
 	 */
 	if (cpu_is_omap2420())
 	if (cpu_is_omap2420())
-		__raw_writel(0xffff, OMAP2420_PRCM_VOLTSETUP);
+		writel_relaxed(0xffff, OMAP2420_PRCM_VOLTSETUP);
 	else
 	else
-		__raw_writel(0xffff, OMAP2430_PRCM_VOLTSETUP);
+		writel_relaxed(0xffff, OMAP2430_PRCM_VOLTSETUP);
 	omap2_sram_reprogram_sdrc(level, dll_ctrl, m_type);
 	omap2_sram_reprogram_sdrc(level, dll_ctrl, m_type);
 	curr_perf_level = level;
 	curr_perf_level = level;
 	local_irq_restore(flags);
 	local_irq_restore(flags);

+ 1 - 1
arch/arm/mach-omap2/sr_device.c

@@ -57,7 +57,7 @@ static void __init sr_set_nvalues(struct omap_volt_data *volt_data,
 
 
 		/*
 		/*
 		 * In OMAP4 the efuse registers are 24 bit aligned.
 		 * In OMAP4 the efuse registers are 24 bit aligned.
-		 * A __raw_readl will fail for non-32 bit aligned address
+		 * A readl_relaxed will fail for non-32 bit aligned address
 		 * and hence the 8-bit read and shift.
 		 * and hence the 8-bit read and shift.
 		 */
 		 */
 		if (cpu_is_omap44xx()) {
 		if (cpu_is_omap44xx()) {

+ 8 - 8
arch/arm/mach-omap2/sram.c

@@ -70,16 +70,16 @@ static int is_sram_locked(void)
 	if (OMAP2_DEVICE_TYPE_GP == omap_type()) {
 	if (OMAP2_DEVICE_TYPE_GP == omap_type()) {
 		/* RAMFW: R/W access to all initiators for all qualifier sets */
 		/* RAMFW: R/W access to all initiators for all qualifier sets */
 		if (cpu_is_omap242x()) {
 		if (cpu_is_omap242x()) {
-			__raw_writel(0xFF, OMAP24XX_VA_REQINFOPERM0); /* all q-vects */
-			__raw_writel(0xCFDE, OMAP24XX_VA_READPERM0);  /* all i-read */
-			__raw_writel(0xCFDE, OMAP24XX_VA_WRITEPERM0); /* all i-write */
+			writel_relaxed(0xFF, OMAP24XX_VA_REQINFOPERM0); /* all q-vects */
+			writel_relaxed(0xCFDE, OMAP24XX_VA_READPERM0);  /* all i-read */
+			writel_relaxed(0xCFDE, OMAP24XX_VA_WRITEPERM0); /* all i-write */
 		}
 		}
 		if (cpu_is_omap34xx()) {
 		if (cpu_is_omap34xx()) {
-			__raw_writel(0xFFFF, OMAP34XX_VA_REQINFOPERM0); /* all q-vects */
-			__raw_writel(0xFFFF, OMAP34XX_VA_READPERM0);  /* all i-read */
-			__raw_writel(0xFFFF, OMAP34XX_VA_WRITEPERM0); /* all i-write */
-			__raw_writel(0x0, OMAP34XX_VA_ADDR_MATCH2);
-			__raw_writel(0xFFFFFFFF, OMAP34XX_VA_SMS_RG_ATT0);
+			writel_relaxed(0xFFFF, OMAP34XX_VA_REQINFOPERM0); /* all q-vects */
+			writel_relaxed(0xFFFF, OMAP34XX_VA_READPERM0);  /* all i-read */
+			writel_relaxed(0xFFFF, OMAP34XX_VA_WRITEPERM0); /* all i-write */
+			writel_relaxed(0x0, OMAP34XX_VA_ADDR_MATCH2);
+			writel_relaxed(0xFFFFFFFF, OMAP34XX_VA_SMS_RG_ATT0);
 		}
 		}
 		return 0;
 		return 0;
 	} else
 	} else

+ 4 - 4
arch/arm/mach-omap2/timer.c

@@ -546,15 +546,15 @@ static void __init realtime_counter_init(void)
 	}
 	}
 
 
 	/* Program numerator and denumerator registers */
 	/* Program numerator and denumerator registers */
-	reg = __raw_readl(base + INCREMENTER_NUMERATOR_OFFSET) &
+	reg = readl_relaxed(base + INCREMENTER_NUMERATOR_OFFSET) &
 			NUMERATOR_DENUMERATOR_MASK;
 			NUMERATOR_DENUMERATOR_MASK;
 	reg |= num;
 	reg |= num;
-	__raw_writel(reg, base + INCREMENTER_NUMERATOR_OFFSET);
+	writel_relaxed(reg, base + INCREMENTER_NUMERATOR_OFFSET);
 
 
-	reg = __raw_readl(base + INCREMENTER_DENUMERATOR_RELOAD_OFFSET) &
+	reg = readl_relaxed(base + INCREMENTER_DENUMERATOR_RELOAD_OFFSET) &
 			NUMERATOR_DENUMERATOR_MASK;
 			NUMERATOR_DENUMERATOR_MASK;
 	reg |= den;
 	reg |= den;
-	__raw_writel(reg, base + INCREMENTER_DENUMERATOR_RELOAD_OFFSET);
+	writel_relaxed(reg, base + INCREMENTER_DENUMERATOR_RELOAD_OFFSET);
 
 
 	arch_timer_freq = (rate / den) * num;
 	arch_timer_freq = (rate / den) * num;
 	set_cntfreq();
 	set_cntfreq();

+ 2 - 2
arch/arm/mach-omap2/vc.c

@@ -462,7 +462,7 @@ static void omap4_set_timings(struct voltagedomain *voltdm, bool off_mode)
 	val |= omap4_usec_to_val_scrm(tshut, OMAP4_DOWNTIME_SHIFT,
 	val |= omap4_usec_to_val_scrm(tshut, OMAP4_DOWNTIME_SHIFT,
 		OMAP4_DOWNTIME_MASK);
 		OMAP4_DOWNTIME_MASK);
 
 
-	__raw_writel(val, OMAP4_SCRM_CLKSETUPTIME);
+	writel_relaxed(val, OMAP4_SCRM_CLKSETUPTIME);
 }
 }
 
 
 /* OMAP4 specific voltage init functions */
 /* OMAP4 specific voltage init functions */
@@ -584,7 +584,7 @@ static void __init omap4_vc_i2c_timing_init(struct voltagedomain *voltdm)
 	val = i2c_data->loadbits << 25 | i2c_data->loadbits << 29;
 	val = i2c_data->loadbits << 25 | i2c_data->loadbits << 29;
 
 
 	/* Write to SYSCTRL_PADCONF_WKUP_CTRL_I2C_2 to setup I2C pull */
 	/* Write to SYSCTRL_PADCONF_WKUP_CTRL_I2C_2 to setup I2C pull */
-	__raw_writel(val, OMAP2_L4_IO_ADDRESS(OMAP4_CTRL_MODULE_PAD_WKUP +
+	writel_relaxed(val, OMAP2_L4_IO_ADDRESS(OMAP4_CTRL_MODULE_PAD_WKUP +
 				OMAP4_CTRL_MODULE_PAD_WKUP_CONTROL_I2C_2));
 				OMAP4_CTRL_MODULE_PAD_WKUP_CONTROL_I2C_2));
 
 
 	/* HSSCLH can always be zero */
 	/* HSSCLH can always be zero */

+ 4 - 4
arch/arm/mach-omap2/wd_timer.c

@@ -49,12 +49,12 @@ int omap2_wd_timer_disable(struct omap_hwmod *oh)
 	}
 	}
 
 
 	/* sequence required to disable watchdog */
 	/* sequence required to disable watchdog */
-	__raw_writel(0xAAAA, base + OMAP_WDT_SPR);
-	while (__raw_readl(base + OMAP_WDT_WPS) & 0x10)
+	writel_relaxed(0xAAAA, base + OMAP_WDT_SPR);
+	while (readl_relaxed(base + OMAP_WDT_WPS) & 0x10)
 		cpu_relax();
 		cpu_relax();
 
 
-	__raw_writel(0x5555, base + OMAP_WDT_SPR);
-	while (__raw_readl(base + OMAP_WDT_WPS) & 0x10)
+	writel_relaxed(0x5555, base + OMAP_WDT_SPR);
+	while (readl_relaxed(base + OMAP_WDT_WPS) & 0x10)
 		cpu_relax();
 		cpu_relax();
 
 
 	return 0;
 	return 0;

+ 20 - 14
arch/arm/mach-prima2/rstc.c

@@ -36,27 +36,33 @@ static int sirfsoc_reset_module(struct reset_controller_dev *rcdev,
 
 
 	if (of_device_is_compatible(rcdev->of_node, "sirf,prima2-rstc")) {
 	if (of_device_is_compatible(rcdev->of_node, "sirf,prima2-rstc")) {
 		/*
 		/*
-		 * Writing 1 to this bit resets corresponding block. Writing 0 to this
-		 * bit de-asserts reset signal of the corresponding block.
-		 * datasheet doesn't require explicit delay between the set and clear
-		 * of reset bit. it could be shorter if tests pass.
+		 * Writing 1 to this bit resets corresponding block.
+		 * Writing 0 to this bit de-asserts reset signal of the
+		 * corresponding block. datasheet doesn't require explicit
+		 * delay between the set and clear of reset bit. it could
+		 * be shorter if tests pass.
 		 */
 		 */
-		writel(readl(sirfsoc_rstc_base + (reset_bit / 32) * 4) | (1 << reset_bit),
+		writel(readl(sirfsoc_rstc_base +
+			(reset_bit / 32) * 4) | (1 << reset_bit),
 			sirfsoc_rstc_base + (reset_bit / 32) * 4);
 			sirfsoc_rstc_base + (reset_bit / 32) * 4);
-		msleep(10);
-		writel(readl(sirfsoc_rstc_base + (reset_bit / 32) * 4) & ~(1 << reset_bit),
+		msleep(20);
+		writel(readl(sirfsoc_rstc_base +
+			(reset_bit / 32) * 4) & ~(1 << reset_bit),
 			sirfsoc_rstc_base + (reset_bit / 32) * 4);
 			sirfsoc_rstc_base + (reset_bit / 32) * 4);
 	} else {
 	} else {
 		/*
 		/*
 		 * For MARCO and POLO
 		 * For MARCO and POLO
-		 * Writing 1 to SET register resets corresponding block. Writing 1 to CLEAR
-		 * register de-asserts reset signal of the corresponding block.
-		 * datasheet doesn't require explicit delay between the set and clear
-		 * of reset bit. it could be shorter if tests pass.
+		 * Writing 1 to SET register resets corresponding block.
+		 * Writing 1 to CLEAR register de-asserts reset signal of the
+		 * corresponding block.
+		 * datasheet doesn't require explicit delay between the set and
+		 * clear of reset bit. it could be shorter if tests pass.
 		 */
 		 */
-		writel(1 << reset_bit, sirfsoc_rstc_base + (reset_bit / 32) * 8);
-		msleep(10);
-		writel(1 << reset_bit, sirfsoc_rstc_base + (reset_bit / 32) * 8 + 4);
+		writel(1 << reset_bit,
+			sirfsoc_rstc_base + (reset_bit / 32) * 8);
+		msleep(20);
+		writel(1 << reset_bit,
+			sirfsoc_rstc_base + (reset_bit / 32) * 8 + 4);
 	}
 	}
 
 
 	mutex_unlock(&rstc_lock);
 	mutex_unlock(&rstc_lock);

+ 0 - 2
arch/arm/mach-qcom/Kconfig

@@ -3,8 +3,6 @@ config ARCH_QCOM
 	select ARCH_REQUIRE_GPIOLIB
 	select ARCH_REQUIRE_GPIOLIB
 	select ARM_GIC
 	select ARM_GIC
 	select CLKSRC_OF
 	select CLKSRC_OF
-	select GENERIC_CLOCKEVENTS
-	select HAVE_SMP
 	select QCOM_SCM if SMP
 	select QCOM_SCM if SMP
 	help
 	help
 	  Support for Qualcomm's devicetree based systems.
 	  Support for Qualcomm's devicetree based systems.

+ 15 - 0
arch/arm/mach-realview/core.c

@@ -148,6 +148,21 @@ struct platform_device realview_cf_device = {
 	},
 	},
 };
 };
 
 
+static struct resource realview_leds_resources[] = {
+	{
+		.start	= REALVIEW_SYS_BASE + REALVIEW_SYS_LED_OFFSET,
+		.end	= REALVIEW_SYS_BASE + REALVIEW_SYS_LED_OFFSET + 4,
+		.flags	= IORESOURCE_MEM,
+	},
+};
+
+struct platform_device realview_leds_device = {
+	.name		= "versatile-leds",
+	.id		= -1,
+	.num_resources	= ARRAY_SIZE(realview_leds_resources),
+	.resource	= realview_leds_resources,
+};
+
 static struct resource realview_i2c_resource = {
 static struct resource realview_i2c_resource = {
 	.start		= REALVIEW_I2C_BASE,
 	.start		= REALVIEW_I2C_BASE,
 	.end		= REALVIEW_I2C_BASE + SZ_4K - 1,
 	.end		= REALVIEW_I2C_BASE + SZ_4K - 1,

+ 1 - 0
arch/arm/mach-realview/core.h

@@ -37,6 +37,7 @@ struct machine_desc;
 
 
 extern struct platform_device realview_flash_device;
 extern struct platform_device realview_flash_device;
 extern struct platform_device realview_cf_device;
 extern struct platform_device realview_cf_device;
+extern struct platform_device realview_leds_device;
 extern struct platform_device realview_i2c_device;
 extern struct platform_device realview_i2c_device;
 extern struct mmci_platform_data realview_mmc0_plat_data;
 extern struct mmci_platform_data realview_mmc0_plat_data;
 extern struct mmci_platform_data realview_mmc1_plat_data;
 extern struct mmci_platform_data realview_mmc1_plat_data;

+ 1 - 0
arch/arm/mach-realview/realview_eb.c

@@ -452,6 +452,7 @@ static void __init realview_eb_init(void)
 	realview_flash_register(&realview_eb_flash_resource, 1);
 	realview_flash_register(&realview_eb_flash_resource, 1);
 	platform_device_register(&realview_i2c_device);
 	platform_device_register(&realview_i2c_device);
 	platform_device_register(&char_lcd_device);
 	platform_device_register(&char_lcd_device);
+	platform_device_register(&realview_leds_device);
 	eth_device_register();
 	eth_device_register();
 	realview_usb_register(realview_eb_isp1761_resources);
 	realview_usb_register(realview_eb_isp1761_resources);
 
 

+ 1 - 0
arch/arm/mach-realview/realview_pb1176.c

@@ -367,6 +367,7 @@ static void __init realview_pb1176_init(void)
 	realview_usb_register(realview_pb1176_isp1761_resources);
 	realview_usb_register(realview_pb1176_isp1761_resources);
 	platform_device_register(&pmu_device);
 	platform_device_register(&pmu_device);
 	platform_device_register(&char_lcd_device);
 	platform_device_register(&char_lcd_device);
+	platform_device_register(&realview_leds_device);
 
 
 	for (i = 0; i < ARRAY_SIZE(amba_devs); i++) {
 	for (i = 0; i < ARRAY_SIZE(amba_devs); i++) {
 		struct amba_device *d = amba_devs[i];
 		struct amba_device *d = amba_devs[i];

+ 1 - 0
arch/arm/mach-realview/realview_pb11mp.c

@@ -347,6 +347,7 @@ static void __init realview_pb11mp_init(void)
 	realview_eth_register(NULL, realview_pb11mp_smsc911x_resources);
 	realview_eth_register(NULL, realview_pb11mp_smsc911x_resources);
 	platform_device_register(&realview_i2c_device);
 	platform_device_register(&realview_i2c_device);
 	platform_device_register(&realview_cf_device);
 	platform_device_register(&realview_cf_device);
+	platform_device_register(&realview_leds_device);
 	realview_usb_register(realview_pb11mp_isp1761_resources);
 	realview_usb_register(realview_pb11mp_isp1761_resources);
 	platform_device_register(&pmu_device);
 	platform_device_register(&pmu_device);
 
 

+ 1 - 0
arch/arm/mach-realview/realview_pba8.c

@@ -289,6 +289,7 @@ static void __init realview_pba8_init(void)
 	realview_eth_register(NULL, realview_pba8_smsc911x_resources);
 	realview_eth_register(NULL, realview_pba8_smsc911x_resources);
 	platform_device_register(&realview_i2c_device);
 	platform_device_register(&realview_i2c_device);
 	platform_device_register(&realview_cf_device);
 	platform_device_register(&realview_cf_device);
+	platform_device_register(&realview_leds_device);
 	realview_usb_register(realview_pba8_isp1761_resources);
 	realview_usb_register(realview_pba8_isp1761_resources);
 	platform_device_register(&pmu_device);
 	platform_device_register(&pmu_device);
 
 

برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است