diff options
Diffstat (limited to 'arch')
426 files changed, 4142 insertions, 5207 deletions
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index eb9fc2f8acf..22bfac3e697 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -393,6 +393,7 @@ config ARCH_GEMINI  config ARCH_SIRF  	bool "CSR SiRF"  	select ARCH_REQUIRE_GPIOLIB +	select AUTO_ZRELADDR  	select COMMON_CLK  	select GENERIC_CLOCKEVENTS  	select GENERIC_IRQ_CHIP @@ -950,22 +951,6 @@ config ARCH_OMAP  	help  	  Support for TI's OMAP platform (OMAP1/2/3/4). -config ARCH_VT8500_SINGLE -	bool "VIA/WonderMedia 85xx" -	select ARCH_HAS_CPUFREQ -	select ARCH_REQUIRE_GPIOLIB -	select CLKDEV_LOOKUP -	select COMMON_CLK -	select CPU_ARM926T -	select GENERIC_CLOCKEVENTS -	select GENERIC_GPIO -	select HAVE_CLK -	select MULTI_IRQ_HANDLER -	select SPARSE_IRQ -	select USE_OF -	help -	  Support for VIA/WonderMedia VT8500/WM85xx System-on-Chip. -  endchoice  menu "Multiple platform selection" diff --git a/arch/arm/Kconfig.debug b/arch/arm/Kconfig.debug index 661030d6bc6..0cc8e3652b0 100644 --- a/arch/arm/Kconfig.debug +++ b/arch/arm/Kconfig.debug @@ -219,12 +219,12 @@ choice  		  Say Y here if you want kernel low-level debugging support  		  on i.MX51. -	config DEBUG_IMX50_IMX53_UART -		bool "i.MX50 and i.MX53 Debug UART" -		depends on SOC_IMX50 || SOC_IMX53 +	config DEBUG_IMX53_UART +		bool "i.MX53 Debug UART" +		depends on SOC_IMX53  		help  		  Say Y here if you want kernel low-level debugging support -		  on i.MX50 or i.MX53. +		  on i.MX53.  	config DEBUG_IMX6Q_UART  		bool "i.MX6Q Debug UART" @@ -386,6 +386,20 @@ choice  		  Say Y here if you want kernel low-level debugging support  		  on Tegra based platforms. +	config DEBUG_SIRFPRIMA2_UART1 +		bool "Kernel low-level debugging messages via SiRFprimaII UART1" +		depends on ARCH_PRIMA2 +		help +		  Say Y here if you want the debug print routines to direct +		  their output to the uart1 port on SiRFprimaII devices. + +	config DEBUG_SIRFMARCO_UART1 +		bool "Kernel low-level debugging messages via SiRFmarco UART1" +		depends on ARCH_MARCO +		help +		  Say Y here if you want the debug print routines to direct +		  their output to the uart1 port on SiRFmarco devices. +  	config DEBUG_VEXPRESS_UART0_DETECT  		bool "Autodetect UART0 on Versatile Express Cortex-A core tiles"  		depends on ARCH_VEXPRESS && CPU_CP15_MMU @@ -412,6 +426,13 @@ choice  		  of the tiles using the RS1 memory map, including all new A-class  		  core tiles, FPGA-based SMMs and software models. +	config DEBUG_VT8500_UART0 +		bool "Use UART0 on VIA/Wondermedia SoCs" +		depends on ARCH_VT8500 +		help +		  This option selects UART0 on VIA/Wondermedia System-on-a-chip +		  devices, including VT8500, WM8505, WM8650 and WM8850. +  	config DEBUG_LL_UART_NONE  		bool "No low-level debugging UART"  		depends on !ARCH_MULTIPLATFORM @@ -497,7 +518,7 @@ config DEBUG_LL_INCLUDE  				 DEBUG_IMX21_IMX27_UART || \  				 DEBUG_IMX31_IMX35_UART || \  				 DEBUG_IMX51_UART || \ -				 DEBUG_IMX50_IMX53_UART ||\ +				 DEBUG_IMX53_UART ||\  				 DEBUG_IMX6Q_UART  	default "debug/highbank.S" if DEBUG_HIGHBANK_UART  	default "debug/mvebu.S" if DEBUG_MVEBU_UART @@ -506,6 +527,7 @@ config DEBUG_LL_INCLUDE  	default "debug/sunxi.S" if DEBUG_SUNXI_UART0 || DEBUG_SUNXI_UART1  	default "debug/vexpress.S" if DEBUG_VEXPRESS_UART0_DETECT || \  		DEBUG_VEXPRESS_UART0_CA9 || DEBUG_VEXPRESS_UART0_RS1 +	default "debug/vt8500.S" if DEBUG_VT8500_UART0  	default "debug/tegra.S" if DEBUG_TEGRA_UART  	default "debug/zynq.S" if DEBUG_ZYNQ_UART0 || DEBUG_ZYNQ_UART1  	default "mach/debug-macro.S" diff --git a/arch/arm/boot/dts/Makefile b/arch/arm/boot/dts/Makefile index b53f18f8d5d..2e7a7e2de11 100644 --- a/arch/arm/boot/dts/Makefile +++ b/arch/arm/boot/dts/Makefile @@ -73,6 +73,7 @@ dtb-$(CONFIG_ARCH_KIRKWOOD) += kirkwood-dns320.dtb \  	kirkwood-ts219-6281.dtb \  	kirkwood-ts219-6282.dtb \  	kirkwood-openblocks_a6.dtb +dtb-$(CONFIG_ARCH_MARCO) += marco-evb.dtb  dtb-$(CONFIG_ARCH_MSM) += msm8660-surf.dtb \  	msm8960-cdp.dtb  dtb-$(CONFIG_ARCH_MVEBU) += armada-370-db.dtb \ @@ -153,10 +154,12 @@ dtb-$(CONFIG_ARCH_VEXPRESS) += vexpress-v2p-ca5s.dtb \  	xenvm-4.2.dtb  dtb-$(CONFIG_ARCH_VT8500) += vt8500-bv07.dtb \  	wm8505-ref.dtb \ -	wm8650-mid.dtb +	wm8650-mid.dtb \ +	wm8850-w70v2.dtb  dtb-$(CONFIG_ARCH_ZYNQ) += zynq-zc702.dtb  targets += dtbs +targets += $(dtb-y)  endif  # *.dtb used to be generated in the directory above. Clean out the diff --git a/arch/arm/boot/dts/armada-370-db.dts b/arch/arm/boot/dts/armada-370-db.dts index 00044026ef1..9b82facb256 100644 --- a/arch/arm/boot/dts/armada-370-db.dts +++ b/arch/arm/boot/dts/armada-370-db.dts @@ -26,7 +26,7 @@  	memory {  		device_type = "memory"; -		reg = <0x00000000 0x20000000>; /* 512 MB */ +		reg = <0x00000000 0x40000000>; /* 1 GB */  	};  	soc { diff --git a/arch/arm/boot/dts/armada-xp-mv78230.dtsi b/arch/arm/boot/dts/armada-xp-mv78230.dtsi index 271855a6e22..e041f42ed71 100644 --- a/arch/arm/boot/dts/armada-xp-mv78230.dtsi +++ b/arch/arm/boot/dts/armada-xp-mv78230.dtsi @@ -50,27 +50,25 @@  		};  		gpio0: gpio@d0018100 { -			compatible = "marvell,armadaxp-gpio"; -			reg = <0xd0018100 0x40>, -			    <0xd0018800 0x30>; +			compatible = "marvell,orion-gpio"; +			reg = <0xd0018100 0x40>;  			ngpios = <32>;  			gpio-controller;  			#gpio-cells = <2>;  			interrupt-controller;  			#interrupts-cells = <2>; -			interrupts = <16>, <17>, <18>, <19>; +			interrupts = <82>, <83>, <84>, <85>;  		};  		gpio1: gpio@d0018140 { -			compatible = "marvell,armadaxp-gpio"; -			reg = <0xd0018140 0x40>, -			    <0xd0018840 0x30>; +			compatible = "marvell,orion-gpio"; +			reg = <0xd0018140 0x40>;  			ngpios = <17>;  			gpio-controller;  			#gpio-cells = <2>;  			interrupt-controller;  			#interrupts-cells = <2>; -			interrupts = <20>, <21>, <22>; +			interrupts = <87>, <88>, <89>;  		};  	};  }; diff --git a/arch/arm/boot/dts/armada-xp-mv78260.dtsi b/arch/arm/boot/dts/armada-xp-mv78260.dtsi index 1c1937dbce7..9e23bd8c953 100644 --- a/arch/arm/boot/dts/armada-xp-mv78260.dtsi +++ b/arch/arm/boot/dts/armada-xp-mv78260.dtsi @@ -51,39 +51,36 @@  		};  		gpio0: gpio@d0018100 { -			compatible = "marvell,armadaxp-gpio"; -			reg = <0xd0018100 0x40>, -			    <0xd0018800 0x30>; +			compatible = "marvell,orion-gpio"; +			reg = <0xd0018100 0x40>;  			ngpios = <32>;  			gpio-controller;  			#gpio-cells = <2>;  			interrupt-controller;  			#interrupts-cells = <2>; -			interrupts = <16>, <17>, <18>, <19>; +			interrupts = <82>, <83>, <84>, <85>;  		};  		gpio1: gpio@d0018140 { -			compatible = "marvell,armadaxp-gpio"; -			reg = <0xd0018140 0x40>, -			    <0xd0018840 0x30>; +			compatible = "marvell,orion-gpio"; +			reg = <0xd0018140 0x40>;  			ngpios = <32>;  			gpio-controller;  			#gpio-cells = <2>;  			interrupt-controller;  			#interrupts-cells = <2>; -			interrupts = <20>, <21>, <22>, <23>; +			interrupts = <87>, <88>, <89>, <90>;  		};  		gpio2: gpio@d0018180 { -			compatible = "marvell,armadaxp-gpio"; -			reg = <0xd0018180 0x40>, -			    <0xd0018870 0x30>; +			compatible = "marvell,orion-gpio"; +			reg = <0xd0018180 0x40>;  			ngpios = <3>;  			gpio-controller;  			#gpio-cells = <2>;  			interrupt-controller;  			#interrupts-cells = <2>; -			interrupts = <24>; +			interrupts = <91>;  		};  		ethernet@d0034000 { diff --git a/arch/arm/boot/dts/armada-xp-mv78460.dtsi b/arch/arm/boot/dts/armada-xp-mv78460.dtsi index 4905cf3a5ef..965966110e3 100644 --- a/arch/arm/boot/dts/armada-xp-mv78460.dtsi +++ b/arch/arm/boot/dts/armada-xp-mv78460.dtsi @@ -66,39 +66,36 @@  		};  		gpio0: gpio@d0018100 { -			compatible = "marvell,armadaxp-gpio"; -			reg = <0xd0018100 0x40>, -			    <0xd0018800 0x30>; +			compatible = "marvell,orion-gpio"; +			reg = <0xd0018100 0x40>;  			ngpios = <32>;  			gpio-controller;  			#gpio-cells = <2>;  			interrupt-controller;  			#interrupts-cells = <2>; -			interrupts = <16>, <17>, <18>, <19>; +			interrupts = <82>, <83>, <84>, <85>;  		};  		gpio1: gpio@d0018140 { -			compatible = "marvell,armadaxp-gpio"; -			reg = <0xd0018140 0x40>, -			    <0xd0018840 0x30>; +			compatible = "marvell,orion-gpio"; +			reg = <0xd0018140 0x40>;  			ngpios = <32>;  			gpio-controller;  			#gpio-cells = <2>;  			interrupt-controller;  			#interrupts-cells = <2>; -			interrupts = <20>, <21>, <22>, <23>; +			interrupts = <87>, <88>, <89>, <90>;  		};  		gpio2: gpio@d0018180 { -			compatible = "marvell,armadaxp-gpio"; -			reg = <0xd0018180 0x40>, -			    <0xd0018870 0x30>; +			compatible = "marvell,orion-gpio"; +			reg = <0xd0018180 0x40>;  			ngpios = <3>;  			gpio-controller;  			#gpio-cells = <2>;  			interrupt-controller;  			#interrupts-cells = <2>; -			interrupts = <24>; +			interrupts = <91>;  		};  		ethernet@d0034000 { diff --git a/arch/arm/boot/dts/at91rm9200.dtsi b/arch/arm/boot/dts/at91rm9200.dtsi index e154f242c68..222047f1ece 100644 --- a/arch/arm/boot/dts/at91rm9200.dtsi +++ b/arch/arm/boot/dts/at91rm9200.dtsi @@ -336,8 +336,8 @@  	i2c@0 {  		compatible = "i2c-gpio"; -		gpios = <&pioA 23 0 /* sda */ -			 &pioA 24 0 /* scl */ +		gpios = <&pioA 25 0 /* sda */ +			 &pioA 26 0 /* scl */  			>;  		i2c-gpio,sda-open-drain;  		i2c-gpio,scl-open-drain; diff --git a/arch/arm/boot/dts/at91sam9260.dtsi b/arch/arm/boot/dts/at91sam9260.dtsi index 68bccf41a2c..cb7bcc51608 100644 --- a/arch/arm/boot/dts/at91sam9260.dtsi +++ b/arch/arm/boot/dts/at91sam9260.dtsi @@ -306,6 +306,22 @@  					};  				}; +				ssc0 { +					pinctrl_ssc0_tx: ssc0_tx-0 { +						atmel,pins = +							<1 16 0x1 0x0	/* PB16 periph A */ +							 1 17 0x1 0x0	/* PB17 periph A */ +							 1 18 0x1 0x0>;	/* PB18 periph A */ +					}; + +					pinctrl_ssc0_rx: ssc0_rx-0 { +						atmel,pins = +							<1 19 0x1 0x0	/* PB19 periph A */ +							 1 20 0x1 0x0	/* PB20 periph A */ +							 1 21 0x1 0x0>;	/* PB21 periph A */ +					}; +				}; +  				pioA: gpio@fffff400 {  					compatible = "atmel,at91rm9200-gpio";  					reg = <0xfffff400 0x200>; @@ -450,6 +466,8 @@  				compatible = "atmel,at91rm9200-ssc";  				reg = <0xfffbc000 0x4000>;  				interrupts = <14 4 5>; +				pinctrl-names = "default"; +				pinctrl-0 = <&pinctrl_ssc0_tx &pinctrl_ssc0_rx>;  				status = "disabled";  			}; diff --git a/arch/arm/boot/dts/at91sam9263.dtsi b/arch/arm/boot/dts/at91sam9263.dtsi index 32ec62cf538..271d4de026e 100644 --- a/arch/arm/boot/dts/at91sam9263.dtsi +++ b/arch/arm/boot/dts/at91sam9263.dtsi @@ -271,6 +271,38 @@  					};  				}; +				ssc0 { +					pinctrl_ssc0_tx: ssc0_tx-0 { +						atmel,pins = +							<1 0 0x2 0x0	/* PB0 periph B */ +							 1 1 0x2 0x0	/* PB1 periph B */ +							 1 2 0x2 0x0>;	/* PB2 periph B */ +					}; + +					pinctrl_ssc0_rx: ssc0_rx-0 { +						atmel,pins = +							<1 3 0x2 0x0	/* PB3 periph B */ +							 1 4 0x2 0x0	/* PB4 periph B */ +							 1 5 0x2 0x0>;	/* PB5 periph B */ +					}; +				}; + +				ssc1 { +					pinctrl_ssc1_tx: ssc1_tx-0 { +						atmel,pins = +							<1 6 0x1 0x0	/* PB6 periph A */ +							 1 7 0x1 0x0	/* PB7 periph A */ +							 1 8 0x1 0x0>;	/* PB8 periph A */ +					}; + +					pinctrl_ssc1_rx: ssc1_rx-0 { +						atmel,pins = +							<1 9 0x1 0x0	/* PB9 periph A */ +							 1 10 0x1 0x0	/* PB10 periph A */ +							 1 11 0x1 0x0>;	/* PB11 periph A */ +					}; +				}; +  				pioA: gpio@fffff200 {  					compatible = "atmel,at91rm9200-gpio";  					reg = <0xfffff200 0x200>; @@ -368,6 +400,8 @@  				compatible = "atmel,at91rm9200-ssc";  				reg = <0xfff98000 0x4000>;  				interrupts = <16 4 5>; +				pinctrl-names = "default"; +				pinctrl-0 = <&pinctrl_ssc0_tx &pinctrl_ssc0_rx>;  				status = "disabled";  			}; @@ -375,6 +409,8 @@  				compatible = "atmel,at91rm9200-ssc";  				reg = <0xfff9c000 0x4000>;  				interrupts = <17 4 5>; +				pinctrl-names = "default"; +				pinctrl-0 = <&pinctrl_ssc1_tx &pinctrl_ssc1_rx>;  				status = "disabled";  			}; diff --git a/arch/arm/boot/dts/at91sam9g45.dtsi b/arch/arm/boot/dts/at91sam9g45.dtsi index 231858ffd85..6b1d4cab24c 100644 --- a/arch/arm/boot/dts/at91sam9g45.dtsi +++ b/arch/arm/boot/dts/at91sam9g45.dtsi @@ -290,6 +290,38 @@  					};  				}; +				ssc0 { +					pinctrl_ssc0_tx: ssc0_tx-0 { +						atmel,pins = +							<3 0 0x1 0x0	/* PD0 periph A */ +							 3 1 0x1 0x0	/* PD1 periph A */ +							 3 2 0x1 0x0>;	/* PD2 periph A */ +					}; + +					pinctrl_ssc0_rx: ssc0_rx-0 { +						atmel,pins = +							<3 3 0x1 0x0	/* PD3 periph A */ +							 3 4 0x1 0x0	/* PD4 periph A */ +							 3 5 0x1 0x0>;	/* PD5 periph A */ +					}; +				}; + +				ssc1 { +					pinctrl_ssc1_tx: ssc1_tx-0 { +						atmel,pins = +							<3 10 0x1 0x0	/* PD10 periph A */ +							 3 11 0x1 0x0	/* PD11 periph A */ +							 3 12 0x1 0x0>;	/* PD12 periph A */ +					}; + +					pinctrl_ssc1_rx: ssc1_rx-0 { +						atmel,pins = +							<3 13 0x1 0x0	/* PD13 periph A */ +							 3 14 0x1 0x0	/* PD14 periph A */ +							 3 15 0x1 0x0>;	/* PD15 periph A */ +					}; +				}; +  				pioA: gpio@fffff200 {  					compatible = "atmel,at91rm9200-gpio";  					reg = <0xfffff200 0x200>; @@ -425,6 +457,8 @@  				compatible = "atmel,at91sam9g45-ssc";  				reg = <0xfff9c000 0x4000>;  				interrupts = <16 4 5>; +				pinctrl-names = "default"; +				pinctrl-0 = <&pinctrl_ssc0_tx &pinctrl_ssc0_rx>;  				status = "disabled";  			}; @@ -432,6 +466,8 @@  				compatible = "atmel,at91sam9g45-ssc";  				reg = <0xfffa0000 0x4000>;  				interrupts = <17 4 5>; +				pinctrl-names = "default"; +				pinctrl-0 = <&pinctrl_ssc1_tx &pinctrl_ssc1_rx>;  				status = "disabled";  			}; diff --git a/arch/arm/boot/dts/at91sam9n12.dtsi b/arch/arm/boot/dts/at91sam9n12.dtsi index e9efb34f437..80e29c605d4 100644 --- a/arch/arm/boot/dts/at91sam9n12.dtsi +++ b/arch/arm/boot/dts/at91sam9n12.dtsi @@ -28,6 +28,7 @@  		tcb1 = &tcb1;  		i2c0 = &i2c0;  		i2c1 = &i2c1; +		ssc0 = &ssc0;  	};  	cpus {  		cpu@0 { @@ -244,6 +245,22 @@  					};  				}; +				ssc0 { +					pinctrl_ssc0_tx: ssc0_tx-0 { +						atmel,pins = +							<0 24 0x2 0x0	/* PA24 periph B */ +							 0 25 0x2 0x0	/* PA25 periph B */ +							 0 26 0x2 0x0>;	/* PA26 periph B */ +					}; + +					pinctrl_ssc0_rx: ssc0_rx-0 { +						atmel,pins = +							<0 27 0x2 0x0	/* PA27 periph B */ +							 0 28 0x2 0x0	/* PA28 periph B */ +							 0 29 0x2 0x0>;	/* PA29 periph B */ +					}; +				}; +  				pioA: gpio@fffff400 {  					compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio";  					reg = <0xfffff400 0x200>; @@ -294,6 +311,15 @@  				status = "disabled";  			}; +			ssc0: ssc@f0010000 { +				compatible = "atmel,at91sam9g45-ssc"; +				reg = <0xf0010000 0x4000>; +				interrupts = <28 4 5>; +				pinctrl-names = "default"; +				pinctrl-0 = <&pinctrl_ssc0_tx &pinctrl_ssc0_rx>; +				status = "disabled"; +			}; +  			usart0: serial@f801c000 {  				compatible = "atmel,at91sam9260-usart";  				reg = <0xf801c000 0x4000>; diff --git a/arch/arm/boot/dts/at91sam9x5.dtsi b/arch/arm/boot/dts/at91sam9x5.dtsi index 40ac3a4eb1a..8ecca6948d8 100644 --- a/arch/arm/boot/dts/at91sam9x5.dtsi +++ b/arch/arm/boot/dts/at91sam9x5.dtsi @@ -88,13 +88,6 @@  				interrupts = <1 4 7>;  			}; -			ssc0: ssc@f0010000 { -				compatible = "atmel,at91sam9g45-ssc"; -				reg = <0xf0010000 0x4000>; -				interrupts = <28 4 5>; -				status = "disabled"; -			}; -  			tcb0: timer@f8008000 {  				compatible = "atmel,at91sam9x5-tcb";  				reg = <0xf8008000 0x100>; @@ -150,6 +143,11 @@  						atmel,pins =  							<0 3 0x1 0x0>;	/* PA3 periph A */  					}; + +					pinctrl_usart0_sck: usart0_sck-0 { +						atmel,pins = +							<0 4 0x1 0x0>;	/* PA4 periph A */ +					};  				};  				usart1 { @@ -161,12 +159,17 @@  					pinctrl_usart1_rts: usart1_rts-0 {  						atmel,pins = -							<3 27 0x3 0x0>;	/* PC27 periph C */ +							<2 27 0x3 0x0>;	/* PC27 periph C */  					};  					pinctrl_usart1_cts: usart1_cts-0 {  						atmel,pins = -							<3 28 0x3 0x0>;	/* PC28 periph C */ +							<2 28 0x3 0x0>;	/* PC28 periph C */ +					}; + +					pinctrl_usart1_sck: usart1_sck-0 { +						atmel,pins = +							<2 28 0x3 0x0>;	/* PC29 periph C */  					};  				}; @@ -179,46 +182,56 @@  					pinctrl_uart2_rts: uart2_rts-0 {  						atmel,pins = -							<0 0 0x2 0x0>;	/* PB0 periph B */ +							<1 0 0x2 0x0>;	/* PB0 periph B */  					};  					pinctrl_uart2_cts: uart2_cts-0 {  						atmel,pins = -							<0 1 0x2 0x0>;	/* PB1 periph B */ +							<1 1 0x2 0x0>;	/* PB1 periph B */ +					}; + +					pinctrl_usart2_sck: usart2_sck-0 { +						atmel,pins = +							<1 2 0x2 0x0>;	/* PB2 periph B */  					};  				};  				usart3 {  					pinctrl_uart3: usart3-0 {  						atmel,pins = -							<3 23 0x2 0x1	/* PC22 periph B with pullup */ -							 3 23 0x2 0x0>;	/* PC23 periph B */ +							<2 23 0x2 0x1	/* PC22 periph B with pullup */ +							 2 23 0x2 0x0>;	/* PC23 periph B */  					};  					pinctrl_usart3_rts: usart3_rts-0 {  						atmel,pins = -							<3 24 0x2 0x0>;	/* PC24 periph B */ +							<2 24 0x2 0x0>;	/* PC24 periph B */  					};  					pinctrl_usart3_cts: usart3_cts-0 {  						atmel,pins = -							<3 25 0x2 0x0>;	/* PC25 periph B */ +							<2 25 0x2 0x0>;	/* PC25 periph B */ +					}; + +					pinctrl_usart3_sck: usart3_sck-0 { +						atmel,pins = +							<2 26 0x2 0x0>;	/* PC26 periph B */  					};  				};  				uart0 {  					pinctrl_uart0: uart0-0 {  						atmel,pins = -							<3 8 0x3 0x0	/* PC8 periph C */ -							 3 9 0x3 0x1>;	/* PC9 periph C with pullup */ +							<2 8 0x3 0x0	/* PC8 periph C */ +							 2 9 0x3 0x1>;	/* PC9 periph C with pullup */  					};  				};  				uart1 {  					pinctrl_uart1: uart1-0 {  						atmel,pins = -							<3 16 0x3 0x0	/* PC16 periph C */ -							 3 17 0x3 0x1>;	/* PC17 periph C with pullup */ +							<2 16 0x3 0x0	/* PC16 periph C */ +							 2 17 0x3 0x1>;	/* PC17 periph C with pullup */  					};  				}; @@ -247,14 +260,14 @@  					pinctrl_macb0_rmii_mii: macb0_rmii_mii-0 {  						atmel,pins = -							<1 8 0x1 0x0	/* PA8 periph A */ -							 1 11 0x1 0x0	/* PA11 periph A */ -							 1 12 0x1 0x0	/* PA12 periph A */ -							 1 13 0x1 0x0	/* PA13 periph A */ -							 1 14 0x1 0x0	/* PA14 periph A */ -							 1 15 0x1 0x0	/* PA15 periph A */ -							 1 16 0x1 0x0	/* PA16 periph A */ -							 1 17 0x1 0x0>;	/* PA17 periph A */ +							<1 8 0x1 0x0	/* PB8 periph A */ +							 1 11 0x1 0x0	/* PB11 periph A */ +							 1 12 0x1 0x0	/* PB12 periph A */ +							 1 13 0x1 0x0	/* PB13 periph A */ +							 1 14 0x1 0x0	/* PB14 periph A */ +							 1 15 0x1 0x0	/* PB15 periph A */ +							 1 16 0x1 0x0	/* PB16 periph A */ +							 1 17 0x1 0x0>;	/* PB17 periph A */  					};  				}; @@ -290,6 +303,22 @@  					};  				}; +				ssc0 { +					pinctrl_ssc0_tx: ssc0_tx-0 { +						atmel,pins = +							<0 24 0x2 0x0	/* PA24 periph B */ +							 0 25 0x2 0x0	/* PA25 periph B */ +							 0 26 0x2 0x0>;	/* PA26 periph B */ +					}; + +					pinctrl_ssc0_rx: ssc0_rx-0 { +						atmel,pins = +							<0 27 0x2 0x0	/* PA27 periph B */ +							 0 28 0x2 0x0	/* PA28 periph B */ +							 0 29 0x2 0x0>;	/* PA29 periph B */ +					}; +				}; +  				pioA: gpio@fffff400 {  					compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio";  					reg = <0xfffff400 0x200>; @@ -333,6 +362,15 @@  				};  			}; +			ssc0: ssc@f0010000 { +				compatible = "atmel,at91sam9g45-ssc"; +				reg = <0xf0010000 0x4000>; +				interrupts = <28 4 5>; +				pinctrl-names = "default"; +				pinctrl-0 = <&pinctrl_ssc0_tx &pinctrl_ssc0_rx>; +				status = "disabled"; +			}; +  			mmc0: mmc@f0008000 {  				compatible = "atmel,hsmci";  				reg = <0xf0008000 0x600>; diff --git a/arch/arm/boot/dts/cros5250-common.dtsi b/arch/arm/boot/dts/cros5250-common.dtsi index fddd1741743..46c09801703 100644 --- a/arch/arm/boot/dts/cros5250-common.dtsi +++ b/arch/arm/boot/dts/cros5250-common.dtsi @@ -96,8 +96,8 @@  		fifo-depth = <0x80>;  		card-detect-delay = <200>;  		samsung,dw-mshc-ciu-div = <3>; -		samsung,dw-mshc-sdr-timing = <2 3 3>; -		samsung,dw-mshc-ddr-timing = <1 2 3>; +		samsung,dw-mshc-sdr-timing = <2 3>; +		samsung,dw-mshc-ddr-timing = <1 2>;  		slot@0 {  			reg = <0>; @@ -120,8 +120,8 @@  		fifo-depth = <0x80>;  		card-detect-delay = <200>;  		samsung,dw-mshc-ciu-div = <3>; -		samsung,dw-mshc-sdr-timing = <2 3 3>; -		samsung,dw-mshc-ddr-timing = <1 2 3>; +		samsung,dw-mshc-sdr-timing = <2 3>; +		samsung,dw-mshc-ddr-timing = <1 2>;  		slot@0 {  			reg = <0>; @@ -141,8 +141,8 @@  		fifo-depth = <0x80>;  		card-detect-delay = <200>;  		samsung,dw-mshc-ciu-div = <3>; -		samsung,dw-mshc-sdr-timing = <2 3 3>; -		samsung,dw-mshc-ddr-timing = <1 2 3>; +		samsung,dw-mshc-sdr-timing = <2 3>; +		samsung,dw-mshc-ddr-timing = <1 2>;  		slot@0 {  			reg = <0>; diff --git a/arch/arm/boot/dts/dove-cubox.dts b/arch/arm/boot/dts/dove-cubox.dts index fed7d3f9f43..cdee96fca6e 100644 --- a/arch/arm/boot/dts/dove-cubox.dts +++ b/arch/arm/boot/dts/dove-cubox.dts @@ -26,10 +26,15 @@  };  &uart0 { status = "okay"; }; -&sdio0 { status = "okay"; };  &sata0 { status = "okay"; };  &i2c0 { status = "okay"; }; +&sdio0 { +	status = "okay"; +	/* sdio0 card detect is connected to wrong pin on CuBox */ +	cd-gpios = <&gpio0 12 1>; +}; +  &spi0 {  	status = "okay"; @@ -42,9 +47,14 @@  };  &pinctrl { -	pinctrl-0 = <&pmx_gpio_18>; +	pinctrl-0 = <&pmx_gpio_12 &pmx_gpio_18>;  	pinctrl-names = "default"; +	pmx_gpio_12: pmx-gpio-12 { +		marvell,pins = "mpp12"; +		marvell,function = "gpio"; +	}; +  	pmx_gpio_18: pmx-gpio-18 {  		marvell,pins = "mpp18";  		marvell,function = "gpio"; diff --git a/arch/arm/boot/dts/dove.dtsi b/arch/arm/boot/dts/dove.dtsi index 42eac1ff3cc..740630f9cd6 100644 --- a/arch/arm/boot/dts/dove.dtsi +++ b/arch/arm/boot/dts/dove.dtsi @@ -93,6 +93,7 @@  			reg = <0xd0400 0x20>;  			ngpios = <32>;  			interrupt-controller; +			#interrupt-cells = <2>;  			interrupts = <12>, <13>, <14>, <60>;  		}; @@ -103,6 +104,7 @@  			reg = <0xd0420 0x20>;  			ngpios = <32>;  			interrupt-controller; +			#interrupt-cells = <2>;  			interrupts = <61>;  		}; diff --git a/arch/arm/boot/dts/emev2.dtsi b/arch/arm/boot/dts/emev2.dtsi index eb504a6c0f4..c8a8c08b48d 100644 --- a/arch/arm/boot/dts/emev2.dtsi +++ b/arch/arm/boot/dts/emev2.dtsi @@ -15,11 +15,18 @@  	interrupt-parent = <&gic>;  	cpus { +		#address-cells = <1>; +		#size-cells = <0>; +  		cpu@0 { +			device_type = "cpu";  			compatible = "arm,cortex-a9"; +			reg = <0>;  		};  		cpu@1 { +			device_type = "cpu";  			compatible = "arm,cortex-a9"; +			reg = <1>;  		};  	}; diff --git a/arch/arm/boot/dts/exynos5250-smdk5250.dts b/arch/arm/boot/dts/exynos5250-smdk5250.dts index 942d5761ca9..e05b18f3c33 100644 --- a/arch/arm/boot/dts/exynos5250-smdk5250.dts +++ b/arch/arm/boot/dts/exynos5250-smdk5250.dts @@ -115,8 +115,8 @@  		fifo-depth = <0x80>;  		card-detect-delay = <200>;  		samsung,dw-mshc-ciu-div = <3>; -		samsung,dw-mshc-sdr-timing = <2 3 3>; -		samsung,dw-mshc-ddr-timing = <1 2 3>; +		samsung,dw-mshc-sdr-timing = <2 3>; +		samsung,dw-mshc-ddr-timing = <1 2>;  		slot@0 {  			reg = <0>; @@ -139,8 +139,8 @@  		fifo-depth = <0x80>;  		card-detect-delay = <200>;  		samsung,dw-mshc-ciu-div = <3>; -		samsung,dw-mshc-sdr-timing = <2 3 3>; -		samsung,dw-mshc-ddr-timing = <1 2 3>; +		samsung,dw-mshc-sdr-timing = <2 3>; +		samsung,dw-mshc-ddr-timing = <1 2>;  		slot@0 {  			reg = <0>; diff --git a/arch/arm/boot/dts/imx31.dtsi b/arch/arm/boot/dts/imx31.dtsi index eef7099f3e3..454c2d17540 100644 --- a/arch/arm/boot/dts/imx31.dtsi +++ b/arch/arm/boot/dts/imx31.dtsi @@ -45,6 +45,8 @@  				compatible = "fsl,imx31-uart", "fsl,imx21-uart";  				reg = <0x43f90000 0x4000>;  				interrupts = <45>; +				clocks = <&clks 10>, <&clks 30>; +				clock-names = "ipg", "per";  				status = "disabled";  			}; @@ -52,12 +54,16 @@  				compatible = "fsl,imx31-uart", "fsl,imx21-uart";  				reg = <0x43f94000 0x4000>;  				interrupts = <32>; +				clocks = <&clks 10>, <&clks 31>; +				clock-names = "ipg", "per";  				status = "disabled";  			};  			uart4: serial@43fb0000 {  				compatible = "fsl,imx31-uart", "fsl,imx21-uart";  				reg = <0x43fb0000 0x4000>; +				clocks = <&clks 10>, <&clks 49>; +				clock-names = "ipg", "per";  				interrupts = <46>;  				status = "disabled";  			}; @@ -66,6 +72,8 @@  				compatible = "fsl,imx31-uart", "fsl,imx21-uart";  				reg = <0x43fb4000 0x4000>;  				interrupts = <47>; +				clocks = <&clks 10>, <&clks 50>; +				clock-names = "ipg", "per";  				status = "disabled";  			};  		}; @@ -81,8 +89,17 @@  				compatible = "fsl,imx31-uart", "fsl,imx21-uart";  				reg = <0x5000c000 0x4000>;  				interrupts = <18>; +				clocks = <&clks 10>, <&clks 48>; +				clock-names = "ipg", "per";  				status = "disabled";  			}; + +			clks: ccm@53f80000{ +				compatible = "fsl,imx31-ccm"; +				reg = <0x53f80000 0x4000>; +				interrupts = <0 31 0x04 0 53 0x04>; +				#clock-cells = <1>; +			};  		};  	};  }; diff --git a/arch/arm/boot/dts/kirkwood-ns2-common.dtsi b/arch/arm/boot/dts/kirkwood-ns2-common.dtsi index 9bc6785ad22..77d21abfcdf 100644 --- a/arch/arm/boot/dts/kirkwood-ns2-common.dtsi +++ b/arch/arm/boot/dts/kirkwood-ns2-common.dtsi @@ -1,4 +1,5 @@  /include/ "kirkwood.dtsi" +/include/ "kirkwood-6281.dtsi"  / {  	chosen { @@ -6,6 +7,21 @@  	};  	ocp@f1000000 { +		pinctrl: pinctrl@10000 { +			pinctrl-0 = < &pmx_spi &pmx_twsi0 &pmx_uart0 +					&pmx_ns2_sata0 &pmx_ns2_sata1>; +			pinctrl-names = "default"; + +			pmx_ns2_sata0: pmx-ns2-sata0 { +				marvell,pins = "mpp21"; +				marvell,function = "sata0"; +			}; +			pmx_ns2_sata1: pmx-ns2-sata1 { +				marvell,pins = "mpp20"; +				marvell,function = "sata1"; +			}; +		}; +  		serial@12000 {  			clock-frequency = <166666667>;  			status = "okay"; diff --git a/arch/arm/boot/dts/kirkwood.dtsi b/arch/arm/boot/dts/kirkwood.dtsi index 110d6cbb795..d6ab442b701 100644 --- a/arch/arm/boot/dts/kirkwood.dtsi +++ b/arch/arm/boot/dts/kirkwood.dtsi @@ -36,6 +36,7 @@  			reg = <0x10100 0x40>;  			ngpios = <32>;  			interrupt-controller; +			#interrupt-cells = <2>;  			interrupts = <35>, <36>, <37>, <38>;  		}; @@ -46,6 +47,7 @@  			reg = <0x10140 0x40>;  			ngpios = <18>;  			interrupt-controller; +			#interrupt-cells = <2>;  			interrupts = <39>, <40>, <41>;  		}; diff --git a/arch/arm/boot/dts/kizbox.dts b/arch/arm/boot/dts/kizbox.dts index e8814fe0e27..b4dc3ed9a3e 100644 --- a/arch/arm/boot/dts/kizbox.dts +++ b/arch/arm/boot/dts/kizbox.dts @@ -48,6 +48,8 @@  			macb0: ethernet@fffc4000 {  				phy-mode = "mii"; +				pinctrl-0 = <&pinctrl_macb_rmii +				             &pinctrl_macb_rmii_mii_alt>;  				status = "okay";  			}; diff --git a/arch/arm/boot/dts/marco-evb.dts b/arch/arm/boot/dts/marco-evb.dts new file mode 100644 index 00000000000..5130aeacfca --- /dev/null +++ b/arch/arm/boot/dts/marco-evb.dts @@ -0,0 +1,54 @@ +/* + * DTS file for CSR SiRFmarco Evaluation Board + * + * Copyright (c) 2012 Cambridge Silicon Radio Limited, a CSR plc group company. + * + * Licensed under GPLv2 or later. + */ + +/dts-v1/; + +/include/ "marco.dtsi" + +/ { +	model = "CSR SiRFmarco Evaluation Board"; +	compatible = "sirf,marco-cb", "sirf,marco"; + +	memory { +		reg = <0x40000000 0x60000000>; +	}; + +	axi { +		peri-iobg { +			uart1: uart@cc060000 { +				status = "okay"; +			}; +			uart2: uart@cc070000 { +				status = "okay"; +			}; +			i2c0: i2c@cc0e0000 { +			      status = "okay"; +			      fpga-cpld@4d { +				      compatible = "sirf,fpga-cpld"; +				      reg = <0x4d>; +			      }; +			}; +			spi1: spi@cc170000 { +				status = "okay"; +				pinctrl-names = "default"; +				pinctrl-0 = <&spi1_pins_a>; +				spi@0 { +					compatible = "spidev"; +					reg = <0>; +					spi-max-frequency = <1000000>; +				}; +			}; +			pci-iobg { +				sd0: sdhci@cd000000 { +					bus-width = <8>; +					status = "okay"; +				}; +			}; +		}; +	}; +}; diff --git a/arch/arm/boot/dts/marco.dtsi b/arch/arm/boot/dts/marco.dtsi new file mode 100644 index 00000000000..1579c3491cc --- /dev/null +++ b/arch/arm/boot/dts/marco.dtsi @@ -0,0 +1,756 @@ +/* + * DTS file for CSR SiRFmarco SoC + * + * Copyright (c) 2012 Cambridge Silicon Radio Limited, a CSR plc group company. + * + * Licensed under GPLv2 or later. + */ + +/include/ "skeleton.dtsi" +/ { +	compatible = "sirf,marco"; +	#address-cells = <1>; +	#size-cells = <1>; +	interrupt-parent = <&gic>; + +	cpus { +		#address-cells = <1>; +		#size-cells = <0>; + +		cpu@0 { +			device_type = "cpu"; +			compatible = "arm,cortex-a9"; +			reg = <0>; +		}; +		cpu@1 { +			device_type = "cpu"; +			compatible = "arm,cortex-a9"; +			reg = <1>; +		}; +	}; + +	axi { +		compatible = "simple-bus"; +		#address-cells = <1>; +		#size-cells = <1>; +		ranges = <0x40000000 0x40000000 0xa0000000>; + +		l2-cache-controller@c0030000 { +			compatible = "sirf,marco-pl310-cache", "arm,pl310-cache"; +			reg = <0xc0030000 0x1000>; +			interrupts = <0 59 0>; +			arm,tag-latency = <1 1 1>; +			arm,data-latency = <1 1 1>; +			arm,filter-ranges = <0x40000000 0x80000000>; +		}; + +		gic: interrupt-controller@c0011000 { +			compatible = "arm,cortex-a9-gic"; +			interrupt-controller; +			#interrupt-cells = <3>; +			reg = <0xc0011000 0x1000>, +			      <0xc0010100 0x0100>; +		}; + +		rstc-iobg { +			compatible = "simple-bus"; +			#address-cells = <1>; +			#size-cells = <1>; +			ranges = <0xc2000000 0xc2000000 0x1000000>; + +			reset-controller@c2000000 { +				compatible = "sirf,marco-rstc"; +				reg = <0xc2000000 0x10000>; +			}; +		}; + +		sys-iobg { +			compatible = "simple-bus"; +			#address-cells = <1>; +			#size-cells = <1>; +			ranges = <0xc3000000 0xc3000000 0x1000000>; + +			clock-controller@c3000000 { +				compatible = "sirf,marco-clkc"; +				reg = <0xc3000000 0x1000>; +				interrupts = <0 3 0>; +			}; + +			rsc-controller@c3010000 { +				compatible = "sirf,marco-rsc"; +				reg = <0xc3010000 0x1000>; +			}; +		}; + +		mem-iobg { +			compatible = "simple-bus"; +			#address-cells = <1>; +			#size-cells = <1>; +			ranges = <0xc4000000 0xc4000000 0x1000000>; + +			memory-controller@c4000000 { +				compatible = "sirf,marco-memc"; +				reg = <0xc4000000 0x10000>; +				interrupts = <0 27 0>; +			}; +		}; + +		disp-iobg0 { +			compatible = "simple-bus"; +			#address-cells = <1>; +			#size-cells = <1>; +			ranges = <0xc5000000 0xc5000000 0x1000000>; + +			display0@c5000000 { +				compatible = "sirf,marco-lcd"; +				reg = <0xc5000000 0x10000>; +				interrupts = <0 30 0>; +			}; + +			vpp0@c5010000 { +				compatible = "sirf,marco-vpp"; +				reg = <0xc5010000 0x10000>; +				interrupts = <0 31 0>; +			}; +		}; + +		disp-iobg1 { +			compatible = "simple-bus"; +			#address-cells = <1>; +			#size-cells = <1>; +			ranges = <0xc6000000 0xc6000000 0x1000000>; + +			display1@c6000000 { +				compatible = "sirf,marco-lcd"; +				reg = <0xc6000000 0x10000>; +				interrupts = <0 62 0>; +			}; + +			vpp1@c6010000 { +				compatible = "sirf,marco-vpp"; +				reg = <0xc6010000 0x10000>; +				interrupts = <0 63 0>; +			}; +		}; + +		graphics-iobg { +			compatible = "simple-bus"; +			#address-cells = <1>; +			#size-cells = <1>; +			ranges = <0xc8000000 0xc8000000 0x1000000>; + +			graphics@c8000000 { +				compatible = "powervr,sgx540"; +				reg = <0xc8000000 0x1000000>; +				interrupts = <0 6 0>; +			}; +		}; + +		multimedia-iobg { +			compatible = "simple-bus"; +			#address-cells = <1>; +			#size-cells = <1>; +			ranges = <0xc9000000 0xc9000000 0x1000000>; + +			multimedia@a0000000 { +				compatible = "sirf,marco-video-codec"; +				reg = <0xc9000000 0x1000000>; +				interrupts = <0 5 0>; +			}; +		}; + +		dsp-iobg { +			compatible = "simple-bus"; +			#address-cells = <1>; +			#size-cells = <1>; +			ranges = <0xca000000 0xca000000 0x2000000>; + +			dspif@ca000000 { +				compatible = "sirf,marco-dspif"; +				reg = <0xca000000 0x10000>; +				interrupts = <0 9 0>; +			}; + +			gps@ca010000 { +				compatible = "sirf,marco-gps"; +				reg = <0xca010000 0x10000>; +				interrupts = <0 7 0>; +			}; + +			dsp@cb000000 { +				compatible = "sirf,marco-dsp"; +				reg = <0xcb000000 0x1000000>; +				interrupts = <0 8 0>; +			}; +		}; + +		peri-iobg { +			compatible = "simple-bus"; +			#address-cells = <1>; +			#size-cells = <1>; +			ranges = <0xcc000000 0xcc000000 0x2000000>; + +			timer@cc020000 { +				compatible = "sirf,marco-tick"; +				reg = <0xcc020000 0x1000>; +				interrupts = <0 0 0>, +					   <0 1 0>, +					   <0 2 0>, +					   <0 49 0>, +					   <0 50 0>, +					   <0 51 0>; +			}; + +			nand@cc030000 { +				compatible = "sirf,marco-nand"; +				reg = <0xcc030000 0x10000>; +				interrupts = <0 41 0>; +			}; + +			audio@cc040000 { +				compatible = "sirf,marco-audio"; +				reg = <0xcc040000 0x10000>; +				interrupts = <0 35 0>; +			}; + +			uart0: uart@cc050000 { +				cell-index = <0>; +				compatible = "sirf,marco-uart"; +				reg = <0xcc050000 0x1000>; +				interrupts = <0 17 0>; +				fifosize = <128>; +				status = "disabled"; +			}; + +			uart1: uart@cc060000 { +				cell-index = <1>; +				compatible = "sirf,marco-uart"; +				reg = <0xcc060000 0x1000>; +				interrupts = <0 18 0>; +				fifosize = <32>; +				status = "disabled"; +			}; + +			uart2: uart@cc070000 { +				cell-index = <2>; +				compatible = "sirf,marco-uart"; +				reg = <0xcc070000 0x1000>; +				interrupts = <0 19 0>; +				fifosize = <128>; +				status = "disabled"; +			}; + +			uart3: uart@cc190000 { +				cell-index = <3>; +				compatible = "sirf,marco-uart"; +				reg = <0xcc190000 0x1000>; +				interrupts = <0 66 0>; +				fifosize = <128>; +				status = "disabled"; +			}; + +			uart4: uart@cc1a0000 { +				cell-index = <4>; +				compatible = "sirf,marco-uart"; +				reg = <0xcc1a0000 0x1000>; +				interrupts = <0 69 0>; +				fifosize = <128>; +				status = "disabled"; +			}; + +			usp0: usp@cc080000 { +				cell-index = <0>; +				compatible = "sirf,marco-usp"; +				reg = <0xcc080000 0x10000>; +				interrupts = <0 20 0>; +				status = "disabled"; +			}; + +			usp1: usp@cc090000 { +				cell-index = <1>; +				compatible = "sirf,marco-usp"; +				reg = <0xcc090000 0x10000>; +				interrupts = <0 21 0>; +				status = "disabled"; +			}; + +			usp2: usp@cc0a0000 { +				cell-index = <2>; +				compatible = "sirf,marco-usp"; +				reg = <0xcc0a0000 0x10000>; +				interrupts = <0 22 0>; +				status = "disabled"; +			}; + +			dmac0: dma-controller@cc0b0000 { +				cell-index = <0>; +				compatible = "sirf,marco-dmac"; +				reg = <0xcc0b0000 0x10000>; +				interrupts = <0 12 0>; +			}; + +			dmac1: dma-controller@cc160000 { +				cell-index = <1>; +				compatible = "sirf,marco-dmac"; +				reg = <0xcc160000 0x10000>; +				interrupts = <0 13 0>; +			}; + +			vip@cc0c0000 { +				compatible = "sirf,marco-vip"; +				reg = <0xcc0c0000 0x10000>; +			}; + +			spi0: spi@cc0d0000 { +				cell-index = <0>; +				compatible = "sirf,marco-spi"; +				reg = <0xcc0d0000 0x10000>; +				interrupts = <0 15 0>; +				sirf,spi-num-chipselects = <1>; +				cs-gpios = <&gpio 0 0>; +				sirf,spi-dma-rx-channel = <25>; +				sirf,spi-dma-tx-channel = <20>; +				#address-cells = <1>; +				#size-cells = <0>; +				status = "disabled"; +			}; + +			spi1: spi@cc170000 { +				cell-index = <1>; +				compatible = "sirf,marco-spi"; +				reg = <0xcc170000 0x10000>; +				interrupts = <0 16 0>; +				sirf,spi-num-chipselects = <1>; +				cs-gpios = <&gpio 0 0>; +				sirf,spi-dma-rx-channel = <12>; +				sirf,spi-dma-tx-channel = <13>; +				#address-cells = <1>; +				#size-cells = <0>; +				status = "disabled"; +			}; + +			i2c0: i2c@cc0e0000 { +				cell-index = <0>; +				compatible = "sirf,marco-i2c"; +				reg = <0xcc0e0000 0x10000>; +				interrupts = <0 24 0>; +				#address-cells = <1>; +				#size-cells = <0>; +				status = "disabled"; +			}; + +			i2c1: i2c@cc0f0000 { +				cell-index = <1>; +				compatible = "sirf,marco-i2c"; +				reg = <0xcc0f0000 0x10000>; +				interrupts = <0 25 0>; +				#address-cells = <1>; +				#size-cells = <0>; +				status = "disabled"; +			}; + +			tsc@cc110000 { +				compatible = "sirf,marco-tsc"; +				reg = <0xcc110000 0x10000>; +				interrupts = <0 33 0>; +			}; + +			gpio: pinctrl@cc120000 { +				#gpio-cells = <2>; +				#interrupt-cells = <2>; +				compatible = "sirf,marco-pinctrl"; +				reg = <0xcc120000 0x10000>; +				interrupts = <0 43 0>, +					   <0 44 0>, +					   <0 45 0>, +					   <0 46 0>, +					   <0 47 0>; +				gpio-controller; +				interrupt-controller; + +				lcd_16pins_a: lcd0_0 { +					lcd { +						sirf,pins = "lcd_16bitsgrp"; +						sirf,function = "lcd_16bits"; +					}; +				}; +				lcd_18pins_a: lcd0_1 { +					lcd { +						sirf,pins = "lcd_18bitsgrp"; +						sirf,function = "lcd_18bits"; +					}; +				}; +				lcd_24pins_a: lcd0_2 { +					lcd { +						sirf,pins = "lcd_24bitsgrp"; +						sirf,function = "lcd_24bits"; +					}; +				}; +				lcdrom_pins_a: lcdrom0_0 { +					lcd { +						sirf,pins = "lcdromgrp"; +						sirf,function = "lcdrom"; +					}; +				}; +				uart0_pins_a: uart0_0 { +					uart { +						sirf,pins = "uart0grp"; +						sirf,function = "uart0"; +					}; +				}; +				uart1_pins_a: uart1_0 { +					uart { +						sirf,pins = "uart1grp"; +						sirf,function = "uart1"; +					}; +				}; +				uart2_pins_a: uart2_0 { +					uart { +						sirf,pins = "uart2grp"; +						sirf,function = "uart2"; +					}; +				}; +				uart2_noflow_pins_a: uart2_1 { +					uart { +						sirf,pins = "uart2_nostreamctrlgrp"; +						sirf,function = "uart2_nostreamctrl"; +					}; +				}; +				spi0_pins_a: spi0_0 { +					spi { +						sirf,pins = "spi0grp"; +						sirf,function = "spi0"; +					}; +				}; +				spi1_pins_a: spi1_0 { +					spi { +						sirf,pins = "spi1grp"; +						sirf,function = "spi1"; +					}; +				}; +				i2c0_pins_a: i2c0_0 { +					i2c { +						sirf,pins = "i2c0grp"; +						sirf,function = "i2c0"; +					}; +				}; +				i2c1_pins_a: i2c1_0 { +					i2c { +						sirf,pins = "i2c1grp"; +						sirf,function = "i2c1"; +					}; +				}; +				pwm0_pins_a: pwm0_0 { +				        pwm { +				                sirf,pins = "pwm0grp"; +				                sirf,function = "pwm0"; +				        }; +				}; +				pwm1_pins_a: pwm1_0 { +				        pwm { +				                sirf,pins = "pwm1grp"; +				                sirf,function = "pwm1"; +				        }; +				}; +				pwm2_pins_a: pwm2_0 { +				        pwm { +				                sirf,pins = "pwm2grp"; +				                sirf,function = "pwm2"; +				        }; +				}; +				pwm3_pins_a: pwm3_0 { +				        pwm { +				                sirf,pins = "pwm3grp"; +				                sirf,function = "pwm3"; +				        }; +				}; +				gps_pins_a: gps_0 { +				        gps { +				                sirf,pins = "gpsgrp"; +				                sirf,function = "gps"; +				        }; +				}; +				vip_pins_a: vip_0 { +				        vip { +				                sirf,pins = "vipgrp"; +				                sirf,function = "vip"; +				        }; +				}; +				sdmmc0_pins_a: sdmmc0_0 { +				        sdmmc0 { +				                sirf,pins = "sdmmc0grp"; +				                sirf,function = "sdmmc0"; +				        }; +				}; +				sdmmc1_pins_a: sdmmc1_0 { +				        sdmmc1 { +				                sirf,pins = "sdmmc1grp"; +				                sirf,function = "sdmmc1"; +				        }; +				}; +				sdmmc2_pins_a: sdmmc2_0 { +				        sdmmc2 { +				                sirf,pins = "sdmmc2grp"; +				                sirf,function = "sdmmc2"; +				        }; +				}; +				sdmmc3_pins_a: sdmmc3_0 { +				        sdmmc3 { +				                sirf,pins = "sdmmc3grp"; +				                sirf,function = "sdmmc3"; +				        }; +				}; +				sdmmc4_pins_a: sdmmc4_0 { +				        sdmmc4 { +				                sirf,pins = "sdmmc4grp"; +				                sirf,function = "sdmmc4"; +				        }; +				}; +				sdmmc5_pins_a: sdmmc5_0 { +				        sdmmc5 { +				                sirf,pins = "sdmmc5grp"; +				                sirf,function = "sdmmc5"; +				        }; +				}; +				i2s_pins_a: i2s_0 { +				        i2s { +				                sirf,pins = "i2sgrp"; +				                sirf,function = "i2s"; +				        }; +				}; +				ac97_pins_a: ac97_0 { +				        ac97 { +				                sirf,pins = "ac97grp"; +				                sirf,function = "ac97"; +				        }; +				}; +				nand_pins_a: nand_0 { +				        nand { +				                sirf,pins = "nandgrp"; +				                sirf,function = "nand"; +				        }; +				}; +				usp0_pins_a: usp0_0 { +				        usp0 { +				                sirf,pins = "usp0grp"; +				                sirf,function = "usp0"; +				        }; +				}; +				usp1_pins_a: usp1_0 { +				        usp1 { +				                sirf,pins = "usp1grp"; +				                sirf,function = "usp1"; +				        }; +				}; +				usp2_pins_a: usp2_0 { +				        usp2 { +				                sirf,pins = "usp2grp"; +				                sirf,function = "usp2"; +				        }; +				}; +				usb0_utmi_drvbus_pins_a: usb0_utmi_drvbus_0 { +				        usb0_utmi_drvbus { +				                sirf,pins = "usb0_utmi_drvbusgrp"; +				                sirf,function = "usb0_utmi_drvbus"; +				        }; +				}; +				usb1_utmi_drvbus_pins_a: usb1_utmi_drvbus_0 { +				        usb1_utmi_drvbus { +				                sirf,pins = "usb1_utmi_drvbusgrp"; +				                sirf,function = "usb1_utmi_drvbus"; +				        }; +				}; +				warm_rst_pins_a: warm_rst_0 { +				        warm_rst { +				                sirf,pins = "warm_rstgrp"; +				                sirf,function = "warm_rst"; +				        }; +				}; +				pulse_count_pins_a: pulse_count_0 { +				        pulse_count { +				                sirf,pins = "pulse_countgrp"; +				                sirf,function = "pulse_count"; +				        }; +				}; +				cko0_rst_pins_a: cko0_rst_0 { +				        cko0_rst { +				                sirf,pins = "cko0_rstgrp"; +				                sirf,function = "cko0_rst"; +				        }; +				}; +				cko1_rst_pins_a: cko1_rst_0 { +				        cko1_rst { +				                sirf,pins = "cko1_rstgrp"; +				                sirf,function = "cko1_rst"; +				        }; +				}; +			}; + +			pwm@cc130000 { +				compatible = "sirf,marco-pwm"; +				reg = <0xcc130000 0x10000>; +			}; + +			efusesys@cc140000 { +				compatible = "sirf,marco-efuse"; +				reg = <0xcc140000 0x10000>; +			}; + +			pulsec@cc150000 { +				compatible = "sirf,marco-pulsec"; +				reg = <0xcc150000 0x10000>; +				interrupts = <0 48 0>; +			}; + +			pci-iobg { +				compatible = "sirf,marco-pciiobg", "simple-bus"; +				#address-cells = <1>; +				#size-cells = <1>; +				ranges = <0xcd000000 0xcd000000 0x1000000>; + +				sd0: sdhci@cd000000 { +					cell-index = <0>; +					compatible = "sirf,marco-sdhc"; +					reg = <0xcd000000 0x100000>; +					interrupts = <0 38 0>; +					status = "disabled"; +				}; + +				sd1: sdhci@cd100000 { +					cell-index = <1>; +					compatible = "sirf,marco-sdhc"; +					reg = <0xcd100000 0x100000>; +					interrupts = <0 38 0>; +					status = "disabled"; +				}; + +				sd2: sdhci@cd200000 { +					cell-index = <2>; +					compatible = "sirf,marco-sdhc"; +					reg = <0xcd200000 0x100000>; +					interrupts = <0 23 0>; +					status = "disabled"; +				}; + +				sd3: sdhci@cd300000 { +					cell-index = <3>; +					compatible = "sirf,marco-sdhc"; +					reg = <0xcd300000 0x100000>; +					interrupts = <0 23 0>; +					status = "disabled"; +				}; + +				sd4: sdhci@cd400000 { +					cell-index = <4>; +					compatible = "sirf,marco-sdhc"; +					reg = <0xcd400000 0x100000>; +					interrupts = <0 39 0>; +					status = "disabled"; +				}; + +				sd5: sdhci@cd500000 { +					cell-index = <5>; +					compatible = "sirf,marco-sdhc"; +					reg = <0xcd500000 0x100000>; +					interrupts = <0 39 0>; +					status = "disabled"; +				}; + +				pci-copy@cd900000 { +					compatible = "sirf,marco-pcicp"; +					reg = <0xcd900000 0x100000>; +					interrupts = <0 40 0>; +				}; + +				rom-interface@cda00000 { +					compatible = "sirf,marco-romif"; +					reg = <0xcda00000 0x100000>; +				}; +			}; +		}; + +		rtc-iobg { +			compatible = "sirf,marco-rtciobg", "sirf-marco-rtciobg-bus"; +			#address-cells = <1>; +			#size-cells = <1>; +			reg = <0xc1000000 0x10000>; + +			gpsrtc@1000 { +				compatible = "sirf,marco-gpsrtc"; +				reg = <0x1000 0x1000>; +				interrupts = <0 55 0>, +					   <0 56 0>, +					   <0 57 0>; +			}; + +			sysrtc@2000 { +				compatible = "sirf,marco-sysrtc"; +				reg = <0x2000 0x1000>; +				interrupts = <0 52 0>, +					   <0 53 0>, +					   <0 54 0>; +			}; + +			pwrc@3000 { +				compatible = "sirf,marco-pwrc"; +				reg = <0x3000 0x1000>; +				interrupts = <0 32 0>; +			}; +		}; + +		uus-iobg { +			compatible = "simple-bus"; +			#address-cells = <1>; +			#size-cells = <1>; +			ranges = <0xce000000 0xce000000 0x1000000>; + +			usb0: usb@ce000000 { +				compatible = "chipidea,ci13611a-marco"; +				reg = <0xce000000 0x10000>; +				interrupts = <0 10 0>; +			}; + +			usb1: usb@ce010000 { +				compatible = "chipidea,ci13611a-marco"; +				reg = <0xce010000 0x10000>; +				interrupts = <0 11 0>; +			}; + +			security@ce020000 { +				compatible = "sirf,marco-security"; +				reg = <0xce020000 0x10000>; +				interrupts = <0 42 0>; +			}; +		}; + +		can-iobg { +			compatible = "simple-bus"; +			#address-cells = <1>; +			#size-cells = <1>; +			ranges = <0xd0000000 0xd0000000 0x1000000>; + +			can0: can@d0000000 { +				compatible = "sirf,marco-can"; +				reg = <0xd0000000 0x10000>; +			}; + +			can1: can@d0010000 { +				compatible = "sirf,marco-can"; +				reg = <0xd0010000 0x10000>; +			}; +		}; + +		lvds-iobg { +			compatible = "simple-bus"; +			#address-cells = <1>; +			#size-cells = <1>; +			ranges = <0xd1000000 0xd1000000 0x1000000>; + +			lvds@d1000000 { +				compatible = "sirf,marco-lvds"; +				reg = <0xd1000000 0x10000>; +				interrupts = <0 64 0>; +			}; +		}; +	}; +}; diff --git a/arch/arm/boot/dts/sh73a0-reference.dtsi b/arch/arm/boot/dts/sh73a0-reference.dtsi new file mode 100644 index 00000000000..d4bb0125b2b --- /dev/null +++ b/arch/arm/boot/dts/sh73a0-reference.dtsi @@ -0,0 +1,24 @@ +/* + * Device Tree Source for the SH73A0 SoC + * + * Copyright (C) 2012 Renesas Solutions Corp. + * + * This file is licensed under the terms of the GNU General Public License + * version 2.  This program is licensed "as is" without any warranty of any + * kind, whether express or implied. + */ + +/include/ "sh73a0.dtsi" + +/ { +	compatible = "renesas,sh73a0"; + +	mmcif: mmcif@0x10010000 { +		compatible = "renesas,sh-mmcif"; +		reg = <0xe6bd0000 0x100>; +		interrupt-parent = <&gic>; +		interrupts = <0 140 0x4 +			      0 141 0x4>; +		reg-io-width = <4>; +	}; +}; diff --git a/arch/arm/boot/dts/sh73a0.dtsi b/arch/arm/boot/dts/sh73a0.dtsi new file mode 100644 index 00000000000..8a59465d023 --- /dev/null +++ b/arch/arm/boot/dts/sh73a0.dtsi @@ -0,0 +1,100 @@ +/* + * Device Tree Source for the SH73A0 SoC + * + * Copyright (C) 2012 Renesas Solutions Corp. + * + * This file is licensed under the terms of the GNU General Public License + * version 2.  This program is licensed "as is" without any warranty of any + * kind, whether express or implied. + */ + +/include/ "skeleton.dtsi" + +/ { +	compatible = "renesas,sh73a0"; + +	cpus { +		#address-cells = <1>; +		#size-cells = <0>; + +		cpu@0 { +			device_type = "cpu"; +			compatible = "arm,cortex-a9"; +			reg = <0>; +		}; +		cpu@1 { +			device_type = "cpu"; +			compatible = "arm,cortex-a9"; +			reg = <1>; +		}; +	}; + +	gic: interrupt-controller@f0001000 { +		compatible = "arm,cortex-a9-gic"; +		#interrupt-cells = <3>; +		#address-cells = <1>; +		interrupt-controller; +		reg = <0xf0001000 0x1000>, +		      <0xf0000100 0x100>; +	}; + +	i2c0: i2c@0xe6820000 { +		#address-cells = <1>; +		#size-cells = <0>; +		compatible = "renesas,rmobile-iic"; +		reg = <0xe6820000 0x425>; +		interrupt-parent = <&gic>; +		interrupts = <0 167 0x4 +			      0 168 0x4 +			      0 169 0x4 +			      0 170 0x4>; +	}; + +	i2c1: i2c@0xe6822000 { +		#address-cells = <1>; +		#size-cells = <0>; +		compatible = "renesas,rmobile-iic"; +		reg = <0xe6822000 0x425>; +		interrupt-parent = <&gic>; +		interrupts = <0 51 0x4 +			      0 52 0x4 +			      0 53 0x4 +			      0 54 0x4>; +	}; + +	i2c2: i2c@0xe6824000 { +		#address-cells = <1>; +		#size-cells = <0>; +		compatible = "renesas,rmobile-iic"; +		reg = <0xe6824000 0x425>; +		interrupt-parent = <&gic>; +		interrupts = <0 171 0x4 +			      0 172 0x4 +			      0 173 0x4 +			      0 174 0x4>; +	}; + +	i2c3: i2c@0xe6826000 { +		#address-cells = <1>; +		#size-cells = <0>; +		compatible = "renesas,rmobile-iic"; +		reg = <0xe6826000 0x425>; +		interrupt-parent = <&gic>; +		interrupts = <0 183 0x4 +			      0 184 0x4 +			      0 185 0x4 +			      0 186 0x4>; +	}; + +	i2c4: i2c@0xe6828000 { +		#address-cells = <1>; +		#size-cells = <0>; +		compatible = "renesas,rmobile-iic"; +		reg = <0xe6828000 0x425>; +		interrupt-parent = <&gic>; +		interrupts = <0 187 0x4 +			      0 188 0x4 +			      0 189 0x4 +			      0 190 0x4>; +	}; +}; diff --git a/arch/arm/boot/dts/sunxi.dtsi b/arch/arm/boot/dts/sunxi.dtsi index 8bbc2bfef22..8b36abea9f2 100644 --- a/arch/arm/boot/dts/sunxi.dtsi +++ b/arch/arm/boot/dts/sunxi.dtsi @@ -60,19 +60,21 @@  		};  		uart0: uart@01c28000 { -			compatible = "ns8250"; +			compatible = "snps,dw-apb-uart";  			reg = <0x01c28000 0x400>;  			interrupts = <1>;  			reg-shift = <2>; +			reg-io-width = <4>;  			clock-frequency = <24000000>;  			status = "disabled";  		};  		uart1: uart@01c28400 { -			compatible = "ns8250"; +			compatible = "snps,dw-apb-uart";  			reg = <0x01c28400 0x400>;  			interrupts = <2>;  			reg-shift = <2>; +			reg-io-width = <4>;  			clock-frequency = <24000000>;  			status = "disabled";  		}; diff --git a/arch/arm/boot/dts/tegra20-harmony.dts b/arch/arm/boot/dts/tegra20-harmony.dts index 43eb72af894..2b4169702c8 100644 --- a/arch/arm/boot/dts/tegra20-harmony.dts +++ b/arch/arm/boot/dts/tegra20-harmony.dts @@ -432,6 +432,10 @@  		status = "okay";  	}; +	usb-phy@c5004400 { +		nvidia,phy-reset-gpio = <&gpio 169 0>; /* gpio PV1 */ +	}; +  	sdhci@c8000200 {  		status = "okay";  		cd-gpios = <&gpio 69 0>; /* gpio PI5 */ diff --git a/arch/arm/boot/dts/tegra20-paz00.dts b/arch/arm/boot/dts/tegra20-paz00.dts index a965fe9c7aa..11b30db63ff 100644 --- a/arch/arm/boot/dts/tegra20-paz00.dts +++ b/arch/arm/boot/dts/tegra20-paz00.dts @@ -420,6 +420,10 @@  		status = "okay";  	}; +	usb-phy@c5004400 { +		nvidia,phy-reset-gpio = <&gpio 168 0>; /* gpio PV0 */ +	}; +  	sdhci@c8000000 {  		status = "okay";  		cd-gpios = <&gpio 173 0>; /* gpio PV5 */ diff --git a/arch/arm/boot/dts/tegra20-seaboard.dts b/arch/arm/boot/dts/tegra20-seaboard.dts index 420459825b4..607bf0c6bf9 100644 --- a/arch/arm/boot/dts/tegra20-seaboard.dts +++ b/arch/arm/boot/dts/tegra20-seaboard.dts @@ -561,6 +561,10 @@  		status = "okay";  	}; +	usb-phy@c5004400 { +		nvidia,phy-reset-gpio = <&gpio 169 0>; /* gpio PV1 */ +	}; +  	sdhci@c8000000 {  		status = "okay";  		power-gpios = <&gpio 86 0>; /* gpio PK6 */ diff --git a/arch/arm/boot/dts/tegra20-trimslice.dts b/arch/arm/boot/dts/tegra20-trimslice.dts index b70b4cb754c..e47cf6a58b6 100644 --- a/arch/arm/boot/dts/tegra20-trimslice.dts +++ b/arch/arm/boot/dts/tegra20-trimslice.dts @@ -310,6 +310,10 @@  		status = "okay";  	}; +	usb-phy@c5004400 { +		nvidia,phy-reset-gpio = <&gpio 168 0>; /* gpio PV0 */ +	}; +  	sdhci@c8000000 {  		status = "okay";  		bus-width = <4>; diff --git a/arch/arm/boot/dts/tegra20-ventana.dts b/arch/arm/boot/dts/tegra20-ventana.dts index adc47547eaa..f6c61d10fd2 100644 --- a/arch/arm/boot/dts/tegra20-ventana.dts +++ b/arch/arm/boot/dts/tegra20-ventana.dts @@ -497,6 +497,10 @@  		status = "okay";  	}; +	usb-phy@c5004400 { +		nvidia,phy-reset-gpio = <&gpio 169 0>; /* gpio PV1 */ +	}; +  	sdhci@c8000000 {  		status = "okay";  		power-gpios = <&gpio 86 0>; /* gpio PK6 */ diff --git a/arch/arm/boot/dts/vexpress-v2p-ca15_a7.dts b/arch/arm/boot/dts/vexpress-v2p-ca15_a7.dts index 1fc405a9ecf..cf8071ad22d 100644 --- a/arch/arm/boot/dts/vexpress-v2p-ca15_a7.dts +++ b/arch/arm/boot/dts/vexpress-v2p-ca15_a7.dts @@ -45,7 +45,6 @@  			reg = <1>;  		}; -/* A7s disabled till big.LITTLE patches are available...  		cpu2: cpu@2 {  			device_type = "cpu";  			compatible = "arm,cortex-a7"; @@ -63,7 +62,6 @@  			compatible = "arm,cortex-a7";  			reg = <0x102>;  		}; -*/  	};  	memory@80000000 { diff --git a/arch/arm/boot/dts/wm8850-w70v2.dts b/arch/arm/boot/dts/wm8850-w70v2.dts new file mode 100644 index 00000000000..fcc660c8954 --- /dev/null +++ b/arch/arm/boot/dts/wm8850-w70v2.dts @@ -0,0 +1,47 @@ +/* + * wm8850-w70v2.dts + *  - Device tree file for Wondermedia WM8850 Tablet + *  - 'W70-V2' mainboard + *  - HongLianYing 'HLY070ML268-21A' 7" LCD panel + * + * Copyright (C) 2012 Tony Prisk <linux@prisktech.co.nz> + * + * Licensed under GPLv2 or later + */ + +/dts-v1/; +/include/ "wm8850.dtsi" + +/ { +	model = "Wondermedia WM8850-W70v2 Tablet"; + +	/* +	 * Display node is based on Sascha Hauer's patch on dri-devel. +	 * Added a bpp property to calculate the size of the framebuffer +	 * until the binding is formalized. +	 */ +	display: display@0 { +		modes { +			mode0: mode@0 { +				hactive = <800>; +				vactive = <480>; +				hback-porch = <88>; +				hfront-porch = <40>; +				hsync-len = <0>; +				vback-porch = <32>; +				vfront-porch = <11>; +				vsync-len = <1>; +				clock = <0>;	/* unused but required */ +				bpp = <16>;	/* non-standard but required */ +			}; +		}; +	}; + +	backlight { +		compatible = "pwm-backlight"; +		pwms = <&pwm 0 50000 1>;	/* duty inverted */ + +		brightness-levels = <0 40 60 80 100 130 190 255>; +		default-brightness-level = <5>; +	}; +}; diff --git a/arch/arm/boot/dts/wm8850.dtsi b/arch/arm/boot/dts/wm8850.dtsi new file mode 100644 index 00000000000..e8cbfdc87bb --- /dev/null +++ b/arch/arm/boot/dts/wm8850.dtsi @@ -0,0 +1,224 @@ +/* + * wm8850.dtsi - Device tree file for Wondermedia WM8850 SoC + * + * Copyright (C) 2012 Tony Prisk <linux@prisktech.co.nz> + * + * Licensed under GPLv2 or later + */ + +/include/ "skeleton.dtsi" + +/ { +	compatible = "wm,wm8850"; + +	aliases { +		serial0 = &uart0; +		serial1 = &uart1; +		serial2 = &uart2; +		serial3 = &uart3; +	}; + +	soc { +		#address-cells = <1>; +		#size-cells = <1>; +		compatible = "simple-bus"; +		ranges; +		interrupt-parent = <&intc0>; + +		intc0: interrupt-controller@d8140000 { +			compatible = "via,vt8500-intc"; +			interrupt-controller; +			reg = <0xd8140000 0x10000>; +			#interrupt-cells = <1>; +		}; + +		/* Secondary IC cascaded to intc0 */ +		intc1: interrupt-controller@d8150000 { +			compatible = "via,vt8500-intc"; +			interrupt-controller; +			#interrupt-cells = <1>; +			reg = <0xD8150000 0x10000>; +			interrupts = <56 57 58 59 60 61 62 63>; +		}; + +		gpio: gpio-controller@d8110000 { +			compatible = "wm,wm8650-gpio"; +			gpio-controller; +			reg = <0xd8110000 0x10000>; +			#gpio-cells = <3>; +		}; + +		pmc@d8130000 { +			compatible = "via,vt8500-pmc"; +			reg = <0xd8130000 0x1000>; + +			clocks { +				#address-cells = <1>; +				#size-cells = <0>; + +				ref25: ref25M { +					#clock-cells = <0>; +					compatible = "fixed-clock"; +					clock-frequency = <25000000>; +				}; + +				ref24: ref24M { +					#clock-cells = <0>; +					compatible = "fixed-clock"; +					clock-frequency = <24000000>; +				}; + +				plla: plla { +					#clock-cells = <0>; +					compatible = "wm,wm8750-pll-clock"; +					clocks = <&ref25>; +					reg = <0x200>; +				}; + +				pllb: pllb { +					#clock-cells = <0>; +					compatible = "wm,wm8750-pll-clock"; +					clocks = <&ref25>; +					reg = <0x204>; +				}; + +				clkuart0: uart0 { +					#clock-cells = <0>; +					compatible = "via,vt8500-device-clock"; +					clocks = <&ref24>; +					enable-reg = <0x254>; +					enable-bit = <24>; +				}; + +				clkuart1: uart1 { +					#clock-cells = <0>; +					compatible = "via,vt8500-device-clock"; +					clocks = <&ref24>; +					enable-reg = <0x254>; +					enable-bit = <25>; +				}; + +                                clkuart2: uart2 { +                                        #clock-cells = <0>; +                                        compatible = "via,vt8500-device-clock"; +                                        clocks = <&ref24>; +                                        enable-reg = <0x254>; +                                        enable-bit = <26>; +                                }; + +                                clkuart3: uart3 { +                                        #clock-cells = <0>; +                                        compatible = "via,vt8500-device-clock"; +                                        clocks = <&ref24>; +                                        enable-reg = <0x254>; +                                        enable-bit = <27>; +                                }; + +				clkpwm: pwm { +					#clock-cells = <0>; +					compatible = "via,vt8500-device-clock"; +					clocks = <&pllb>; +					divisor-reg = <0x350>; +					enable-reg = <0x250>; +					enable-bit = <17>; +				}; + +				clksdhc: sdhc { +					#clock-cells = <0>; +					compatible = "via,vt8500-device-clock"; +					clocks = <&pllb>; +					divisor-reg = <0x330>; +					divisor-mask = <0x3f>; +					enable-reg = <0x250>; +					enable-bit = <0>; +				}; +			}; +		}; + +		fb@d8051700 { +			compatible = "wm,wm8505-fb"; +			reg = <0xd8051700 0x200>; +			display = <&display>; +			default-mode = <&mode0>; +		}; + +		ge_rops@d8050400 { +			compatible = "wm,prizm-ge-rops"; +			reg = <0xd8050400 0x100>; +		}; + +		pwm: pwm@d8220000 { +			#pwm-cells = <3>; +			compatible = "via,vt8500-pwm"; +			reg = <0xd8220000 0x100>; +			clocks = <&clkpwm>; +		}; + +		timer@d8130100 { +			compatible = "via,vt8500-timer"; +			reg = <0xd8130100 0x28>; +			interrupts = <36>; +		}; + +		ehci@d8007900 { +			compatible = "via,vt8500-ehci"; +			reg = <0xd8007900 0x200>; +			interrupts = <26>; +		}; + +		uhci@d8007b00 { +			compatible = "platform-uhci"; +			reg = <0xd8007b00 0x200>; +			interrupts = <26>; +		}; + +		uhci@d8008d00 { +			compatible = "platform-uhci"; +			reg = <0xd8008d00 0x200>; +			interrupts = <26>; +		}; + +		uart0: uart@d8200000 { +			compatible = "via,vt8500-uart"; +			reg = <0xd8200000 0x1040>; +			interrupts = <32>; +			clocks = <&clkuart0>; +		}; + +		uart1: uart@d82b0000 { +			compatible = "via,vt8500-uart"; +			reg = <0xd82b0000 0x1040>; +			interrupts = <33>; +			clocks = <&clkuart1>; +		}; + +                uart2: uart@d8210000 { +                        compatible = "via,vt8500-uart"; +                        reg = <0xd8210000 0x1040>; +                        interrupts = <47>; +                        clocks = <&clkuart2>; +                }; + +                uart3: uart@d82c0000 { +                        compatible = "via,vt8500-uart"; +                        reg = <0xd82c0000 0x1040>; +                        interrupts = <50>; +                        clocks = <&clkuart3>; +                }; + +		rtc@d8100000 { +			compatible = "via,vt8500-rtc"; +			reg = <0xd8100000 0x10000>; +			interrupts = <48>; +		}; + +		sdhc@d800a000 { +			compatible = "wm,wm8505-sdhc"; +			reg = <0xd800a000 0x1000>; +			interrupts = <20 21>; +			clocks = <&clksdhc>; +			bus-width = <4>; +			sdon-inverted; +		}; +	}; +}; diff --git a/arch/arm/common/Kconfig b/arch/arm/common/Kconfig index 45ceeb0e93e..9353184d730 100644 --- a/arch/arm/common/Kconfig +++ b/arch/arm/common/Kconfig @@ -1,26 +1,3 @@ -config ARM_GIC -	bool -	select IRQ_DOMAIN -	select MULTI_IRQ_HANDLER - -config GIC_NON_BANKED -	bool - -config ARM_VIC -	bool -	select IRQ_DOMAIN -	select MULTI_IRQ_HANDLER - -config ARM_VIC_NR -	int -	default 4 if ARCH_S5PV210 -	default 3 if ARCH_S5PC100 -	default 2 -	depends on ARM_VIC -	help -	  The maximum number of VICs available in the system, for -	  power management. -  config ICST  	bool diff --git a/arch/arm/common/Makefile b/arch/arm/common/Makefile index e8a4e58f1b8..dc8dd0de5c0 100644 --- a/arch/arm/common/Makefile +++ b/arch/arm/common/Makefile @@ -2,8 +2,6 @@  # Makefile for the linux kernel.  # -obj-$(CONFIG_ARM_GIC)		+= gic.o -obj-$(CONFIG_ARM_VIC)		+= vic.o  obj-$(CONFIG_ICST)		+= icst.o  obj-$(CONFIG_SA1111)		+= sa1111.o  obj-$(CONFIG_PCI_HOST_VIA82C505) += via82c505.o diff --git a/arch/arm/common/gic.c b/arch/arm/common/gic.c deleted file mode 100644 index 36ae03a3f5d..00000000000 --- a/arch/arm/common/gic.c +++ /dev/null @@ -1,811 +0,0 @@ -/* - *  linux/arch/arm/common/gic.c - * - *  Copyright (C) 2002 ARM Limited, All Rights Reserved. - * - * 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. - * - * Interrupt architecture for the GIC: - * - * o There is one Interrupt Distributor, which receives interrupts - *   from system devices and sends them to the Interrupt Controllers. - * - * o There is one CPU Interface per CPU, which sends interrupts sent - *   by the Distributor, and interrupts generated locally, to the - *   associated CPU. The base address of the CPU interface is usually - *   aliased so that the same address points to different chips depending - *   on the CPU it is accessed from. - * - * Note that IRQs 0-31 are special - they are local to each CPU. - * As such, the enable set/clear, pending set/clear and active bit - * registers are banked per-cpu for these sources. - */ -#include <linux/init.h> -#include <linux/kernel.h> -#include <linux/err.h> -#include <linux/module.h> -#include <linux/list.h> -#include <linux/smp.h> -#include <linux/cpu_pm.h> -#include <linux/cpumask.h> -#include <linux/io.h> -#include <linux/of.h> -#include <linux/of_address.h> -#include <linux/of_irq.h> -#include <linux/irqdomain.h> -#include <linux/interrupt.h> -#include <linux/percpu.h> -#include <linux/slab.h> - -#include <asm/irq.h> -#include <asm/exception.h> -#include <asm/smp_plat.h> -#include <asm/mach/irq.h> -#include <asm/hardware/gic.h> - -union gic_base { -	void __iomem *common_base; -	void __percpu __iomem **percpu_base; -}; - -struct gic_chip_data { -	union gic_base dist_base; -	union gic_base cpu_base; -#ifdef CONFIG_CPU_PM -	u32 saved_spi_enable[DIV_ROUND_UP(1020, 32)]; -	u32 saved_spi_conf[DIV_ROUND_UP(1020, 16)]; -	u32 saved_spi_target[DIV_ROUND_UP(1020, 4)]; -	u32 __percpu *saved_ppi_enable; -	u32 __percpu *saved_ppi_conf; -#endif -	struct irq_domain *domain; -	unsigned int gic_irqs; -#ifdef CONFIG_GIC_NON_BANKED -	void __iomem *(*get_base)(union gic_base *); -#endif -}; - -static DEFINE_RAW_SPINLOCK(irq_controller_lock); - -/* - * The GIC mapping of CPU interfaces does not necessarily match - * the logical CPU numbering.  Let's use a mapping as returned - * by the GIC itself. - */ -#define NR_GIC_CPU_IF 8 -static u8 gic_cpu_map[NR_GIC_CPU_IF] __read_mostly; - -/* - * Supported arch specific GIC irq extension. - * Default make them NULL. - */ -struct irq_chip gic_arch_extn = { -	.irq_eoi	= NULL, -	.irq_mask	= NULL, -	.irq_unmask	= NULL, -	.irq_retrigger	= NULL, -	.irq_set_type	= NULL, -	.irq_set_wake	= NULL, -}; - -#ifndef MAX_GIC_NR -#define MAX_GIC_NR	1 -#endif - -static struct gic_chip_data gic_data[MAX_GIC_NR] __read_mostly; - -#ifdef CONFIG_GIC_NON_BANKED -static void __iomem *gic_get_percpu_base(union gic_base *base) -{ -	return *__this_cpu_ptr(base->percpu_base); -} - -static void __iomem *gic_get_common_base(union gic_base *base) -{ -	return base->common_base; -} - -static inline void __iomem *gic_data_dist_base(struct gic_chip_data *data) -{ -	return data->get_base(&data->dist_base); -} - -static inline void __iomem *gic_data_cpu_base(struct gic_chip_data *data) -{ -	return data->get_base(&data->cpu_base); -} - -static inline void gic_set_base_accessor(struct gic_chip_data *data, -					 void __iomem *(*f)(union gic_base *)) -{ -	data->get_base = f; -} -#else -#define gic_data_dist_base(d)	((d)->dist_base.common_base) -#define gic_data_cpu_base(d)	((d)->cpu_base.common_base) -#define gic_set_base_accessor(d,f) -#endif - -static inline void __iomem *gic_dist_base(struct irq_data *d) -{ -	struct gic_chip_data *gic_data = irq_data_get_irq_chip_data(d); -	return gic_data_dist_base(gic_data); -} - -static inline void __iomem *gic_cpu_base(struct irq_data *d) -{ -	struct gic_chip_data *gic_data = irq_data_get_irq_chip_data(d); -	return gic_data_cpu_base(gic_data); -} - -static inline unsigned int gic_irq(struct irq_data *d) -{ -	return d->hwirq; -} - -/* - * Routines to acknowledge, disable and enable interrupts - */ -static void gic_mask_irq(struct irq_data *d) -{ -	u32 mask = 1 << (gic_irq(d) % 32); - -	raw_spin_lock(&irq_controller_lock); -	writel_relaxed(mask, gic_dist_base(d) + GIC_DIST_ENABLE_CLEAR + (gic_irq(d) / 32) * 4); -	if (gic_arch_extn.irq_mask) -		gic_arch_extn.irq_mask(d); -	raw_spin_unlock(&irq_controller_lock); -} - -static void gic_unmask_irq(struct irq_data *d) -{ -	u32 mask = 1 << (gic_irq(d) % 32); - -	raw_spin_lock(&irq_controller_lock); -	if (gic_arch_extn.irq_unmask) -		gic_arch_extn.irq_unmask(d); -	writel_relaxed(mask, gic_dist_base(d) + GIC_DIST_ENABLE_SET + (gic_irq(d) / 32) * 4); -	raw_spin_unlock(&irq_controller_lock); -} - -static void gic_eoi_irq(struct irq_data *d) -{ -	if (gic_arch_extn.irq_eoi) { -		raw_spin_lock(&irq_controller_lock); -		gic_arch_extn.irq_eoi(d); -		raw_spin_unlock(&irq_controller_lock); -	} - -	writel_relaxed(gic_irq(d), gic_cpu_base(d) + GIC_CPU_EOI); -} - -static int gic_set_type(struct irq_data *d, unsigned int type) -{ -	void __iomem *base = gic_dist_base(d); -	unsigned int gicirq = gic_irq(d); -	u32 enablemask = 1 << (gicirq % 32); -	u32 enableoff = (gicirq / 32) * 4; -	u32 confmask = 0x2 << ((gicirq % 16) * 2); -	u32 confoff = (gicirq / 16) * 4; -	bool enabled = false; -	u32 val; - -	/* Interrupt configuration for SGIs can't be changed */ -	if (gicirq < 16) -		return -EINVAL; - -	if (type != IRQ_TYPE_LEVEL_HIGH && type != IRQ_TYPE_EDGE_RISING) -		return -EINVAL; - -	raw_spin_lock(&irq_controller_lock); - -	if (gic_arch_extn.irq_set_type) -		gic_arch_extn.irq_set_type(d, type); - -	val = readl_relaxed(base + GIC_DIST_CONFIG + confoff); -	if (type == IRQ_TYPE_LEVEL_HIGH) -		val &= ~confmask; -	else if (type == IRQ_TYPE_EDGE_RISING) -		val |= confmask; - -	/* -	 * As recommended by the spec, disable the interrupt before changing -	 * the configuration -	 */ -	if (readl_relaxed(base + GIC_DIST_ENABLE_SET + enableoff) & enablemask) { -		writel_relaxed(enablemask, base + GIC_DIST_ENABLE_CLEAR + enableoff); -		enabled = true; -	} - -	writel_relaxed(val, base + GIC_DIST_CONFIG + confoff); - -	if (enabled) -		writel_relaxed(enablemask, base + GIC_DIST_ENABLE_SET + enableoff); - -	raw_spin_unlock(&irq_controller_lock); - -	return 0; -} - -static int gic_retrigger(struct irq_data *d) -{ -	if (gic_arch_extn.irq_retrigger) -		return gic_arch_extn.irq_retrigger(d); - -	return -ENXIO; -} - -#ifdef CONFIG_SMP -static int gic_set_affinity(struct irq_data *d, const struct cpumask *mask_val, -			    bool force) -{ -	void __iomem *reg = gic_dist_base(d) + GIC_DIST_TARGET + (gic_irq(d) & ~3); -	unsigned int shift = (gic_irq(d) % 4) * 8; -	unsigned int cpu = cpumask_any_and(mask_val, cpu_online_mask); -	u32 val, mask, bit; - -	if (cpu >= NR_GIC_CPU_IF || cpu >= nr_cpu_ids) -		return -EINVAL; - -	mask = 0xff << shift; -	bit = gic_cpu_map[cpu] << shift; - -	raw_spin_lock(&irq_controller_lock); -	val = readl_relaxed(reg) & ~mask; -	writel_relaxed(val | bit, reg); -	raw_spin_unlock(&irq_controller_lock); - -	return IRQ_SET_MASK_OK; -} -#endif - -#ifdef CONFIG_PM -static int gic_set_wake(struct irq_data *d, unsigned int on) -{ -	int ret = -ENXIO; - -	if (gic_arch_extn.irq_set_wake) -		ret = gic_arch_extn.irq_set_wake(d, on); - -	return ret; -} - -#else -#define gic_set_wake	NULL -#endif - -asmlinkage void __exception_irq_entry gic_handle_irq(struct pt_regs *regs) -{ -	u32 irqstat, irqnr; -	struct gic_chip_data *gic = &gic_data[0]; -	void __iomem *cpu_base = gic_data_cpu_base(gic); - -	do { -		irqstat = readl_relaxed(cpu_base + GIC_CPU_INTACK); -		irqnr = irqstat & ~0x1c00; - -		if (likely(irqnr > 15 && irqnr < 1021)) { -			irqnr = irq_find_mapping(gic->domain, irqnr); -			handle_IRQ(irqnr, regs); -			continue; -		} -		if (irqnr < 16) { -			writel_relaxed(irqstat, cpu_base + GIC_CPU_EOI); -#ifdef CONFIG_SMP -			handle_IPI(irqnr, regs); -#endif -			continue; -		} -		break; -	} while (1); -} - -static void gic_handle_cascade_irq(unsigned int irq, struct irq_desc *desc) -{ -	struct gic_chip_data *chip_data = irq_get_handler_data(irq); -	struct irq_chip *chip = irq_get_chip(irq); -	unsigned int cascade_irq, gic_irq; -	unsigned long status; - -	chained_irq_enter(chip, desc); - -	raw_spin_lock(&irq_controller_lock); -	status = readl_relaxed(gic_data_cpu_base(chip_data) + GIC_CPU_INTACK); -	raw_spin_unlock(&irq_controller_lock); - -	gic_irq = (status & 0x3ff); -	if (gic_irq == 1023) -		goto out; - -	cascade_irq = irq_find_mapping(chip_data->domain, gic_irq); -	if (unlikely(gic_irq < 32 || gic_irq > 1020)) -		do_bad_IRQ(cascade_irq, desc); -	else -		generic_handle_irq(cascade_irq); - - out: -	chained_irq_exit(chip, desc); -} - -static struct irq_chip gic_chip = { -	.name			= "GIC", -	.irq_mask		= gic_mask_irq, -	.irq_unmask		= gic_unmask_irq, -	.irq_eoi		= gic_eoi_irq, -	.irq_set_type		= gic_set_type, -	.irq_retrigger		= gic_retrigger, -#ifdef CONFIG_SMP -	.irq_set_affinity	= gic_set_affinity, -#endif -	.irq_set_wake		= gic_set_wake, -}; - -void __init gic_cascade_irq(unsigned int gic_nr, unsigned int irq) -{ -	if (gic_nr >= MAX_GIC_NR) -		BUG(); -	if (irq_set_handler_data(irq, &gic_data[gic_nr]) != 0) -		BUG(); -	irq_set_chained_handler(irq, gic_handle_cascade_irq); -} - -static void __init gic_dist_init(struct gic_chip_data *gic) -{ -	unsigned int i; -	u32 cpumask; -	unsigned int gic_irqs = gic->gic_irqs; -	void __iomem *base = gic_data_dist_base(gic); - -	writel_relaxed(0, base + GIC_DIST_CTRL); - -	/* -	 * Set all global interrupts to be level triggered, active low. -	 */ -	for (i = 32; i < gic_irqs; i += 16) -		writel_relaxed(0, base + GIC_DIST_CONFIG + i * 4 / 16); - -	/* -	 * Set all global interrupts to this CPU only. -	 */ -	cpumask = readl_relaxed(base + GIC_DIST_TARGET + 0); -	for (i = 32; i < gic_irqs; i += 4) -		writel_relaxed(cpumask, base + GIC_DIST_TARGET + i * 4 / 4); - -	/* -	 * Set priority on all global interrupts. -	 */ -	for (i = 32; i < gic_irqs; i += 4) -		writel_relaxed(0xa0a0a0a0, base + GIC_DIST_PRI + i * 4 / 4); - -	/* -	 * Disable all interrupts.  Leave the PPI and SGIs alone -	 * as these enables are banked registers. -	 */ -	for (i = 32; i < gic_irqs; i += 32) -		writel_relaxed(0xffffffff, base + GIC_DIST_ENABLE_CLEAR + i * 4 / 32); - -	writel_relaxed(1, base + GIC_DIST_CTRL); -} - -static void __cpuinit gic_cpu_init(struct gic_chip_data *gic) -{ -	void __iomem *dist_base = gic_data_dist_base(gic); -	void __iomem *base = gic_data_cpu_base(gic); -	unsigned int cpu_mask, cpu = smp_processor_id(); -	int i; - -	/* -	 * Get what the GIC says our CPU mask is. -	 */ -	BUG_ON(cpu >= NR_GIC_CPU_IF); -	cpu_mask = readl_relaxed(dist_base + GIC_DIST_TARGET + 0); -	gic_cpu_map[cpu] = cpu_mask; - -	/* -	 * Clear our mask from the other map entries in case they're -	 * still undefined. -	 */ -	for (i = 0; i < NR_GIC_CPU_IF; i++) -		if (i != cpu) -			gic_cpu_map[i] &= ~cpu_mask; - -	/* -	 * Deal with the banked PPI and SGI interrupts - disable all -	 * PPI interrupts, ensure all SGI interrupts are enabled. -	 */ -	writel_relaxed(0xffff0000, dist_base + GIC_DIST_ENABLE_CLEAR); -	writel_relaxed(0x0000ffff, dist_base + GIC_DIST_ENABLE_SET); - -	/* -	 * Set priority on PPI and SGI interrupts -	 */ -	for (i = 0; i < 32; i += 4) -		writel_relaxed(0xa0a0a0a0, dist_base + GIC_DIST_PRI + i * 4 / 4); - -	writel_relaxed(0xf0, base + GIC_CPU_PRIMASK); -	writel_relaxed(1, base + GIC_CPU_CTRL); -} - -#ifdef CONFIG_CPU_PM -/* - * Saves the GIC distributor registers during suspend or idle.  Must be called - * with interrupts disabled but before powering down the GIC.  After calling - * this function, no interrupts will be delivered by the GIC, and another - * platform-specific wakeup source must be enabled. - */ -static void gic_dist_save(unsigned int gic_nr) -{ -	unsigned int gic_irqs; -	void __iomem *dist_base; -	int i; - -	if (gic_nr >= MAX_GIC_NR) -		BUG(); - -	gic_irqs = gic_data[gic_nr].gic_irqs; -	dist_base = gic_data_dist_base(&gic_data[gic_nr]); - -	if (!dist_base) -		return; - -	for (i = 0; i < DIV_ROUND_UP(gic_irqs, 16); i++) -		gic_data[gic_nr].saved_spi_conf[i] = -			readl_relaxed(dist_base + GIC_DIST_CONFIG + i * 4); - -	for (i = 0; i < DIV_ROUND_UP(gic_irqs, 4); i++) -		gic_data[gic_nr].saved_spi_target[i] = -			readl_relaxed(dist_base + GIC_DIST_TARGET + i * 4); - -	for (i = 0; i < DIV_ROUND_UP(gic_irqs, 32); i++) -		gic_data[gic_nr].saved_spi_enable[i] = -			readl_relaxed(dist_base + GIC_DIST_ENABLE_SET + i * 4); -} - -/* - * Restores the GIC distributor registers during resume or when coming out of - * idle.  Must be called before enabling interrupts.  If a level interrupt - * that occured while the GIC was suspended is still present, it will be - * handled normally, but any edge interrupts that occured will not be seen by - * the GIC and need to be handled by the platform-specific wakeup source. - */ -static void gic_dist_restore(unsigned int gic_nr) -{ -	unsigned int gic_irqs; -	unsigned int i; -	void __iomem *dist_base; - -	if (gic_nr >= MAX_GIC_NR) -		BUG(); - -	gic_irqs = gic_data[gic_nr].gic_irqs; -	dist_base = gic_data_dist_base(&gic_data[gic_nr]); - -	if (!dist_base) -		return; - -	writel_relaxed(0, dist_base + GIC_DIST_CTRL); - -	for (i = 0; i < DIV_ROUND_UP(gic_irqs, 16); i++) -		writel_relaxed(gic_data[gic_nr].saved_spi_conf[i], -			dist_base + GIC_DIST_CONFIG + i * 4); - -	for (i = 0; i < DIV_ROUND_UP(gic_irqs, 4); i++) -		writel_relaxed(0xa0a0a0a0, -			dist_base + GIC_DIST_PRI + i * 4); - -	for (i = 0; i < DIV_ROUND_UP(gic_irqs, 4); i++) -		writel_relaxed(gic_data[gic_nr].saved_spi_target[i], -			dist_base + GIC_DIST_TARGET + i * 4); - -	for (i = 0; i < DIV_ROUND_UP(gic_irqs, 32); i++) -		writel_relaxed(gic_data[gic_nr].saved_spi_enable[i], -			dist_base + GIC_DIST_ENABLE_SET + i * 4); - -	writel_relaxed(1, dist_base + GIC_DIST_CTRL); -} - -static void gic_cpu_save(unsigned int gic_nr) -{ -	int i; -	u32 *ptr; -	void __iomem *dist_base; -	void __iomem *cpu_base; - -	if (gic_nr >= MAX_GIC_NR) -		BUG(); - -	dist_base = gic_data_dist_base(&gic_data[gic_nr]); -	cpu_base = gic_data_cpu_base(&gic_data[gic_nr]); - -	if (!dist_base || !cpu_base) -		return; - -	ptr = __this_cpu_ptr(gic_data[gic_nr].saved_ppi_enable); -	for (i = 0; i < DIV_ROUND_UP(32, 32); i++) -		ptr[i] = readl_relaxed(dist_base + GIC_DIST_ENABLE_SET + i * 4); - -	ptr = __this_cpu_ptr(gic_data[gic_nr].saved_ppi_conf); -	for (i = 0; i < DIV_ROUND_UP(32, 16); i++) -		ptr[i] = readl_relaxed(dist_base + GIC_DIST_CONFIG + i * 4); - -} - -static void gic_cpu_restore(unsigned int gic_nr) -{ -	int i; -	u32 *ptr; -	void __iomem *dist_base; -	void __iomem *cpu_base; - -	if (gic_nr >= MAX_GIC_NR) -		BUG(); - -	dist_base = gic_data_dist_base(&gic_data[gic_nr]); -	cpu_base = gic_data_cpu_base(&gic_data[gic_nr]); - -	if (!dist_base || !cpu_base) -		return; - -	ptr = __this_cpu_ptr(gic_data[gic_nr].saved_ppi_enable); -	for (i = 0; i < DIV_ROUND_UP(32, 32); i++) -		writel_relaxed(ptr[i], dist_base + GIC_DIST_ENABLE_SET + i * 4); - -	ptr = __this_cpu_ptr(gic_data[gic_nr].saved_ppi_conf); -	for (i = 0; i < DIV_ROUND_UP(32, 16); i++) -		writel_relaxed(ptr[i], dist_base + GIC_DIST_CONFIG + i * 4); - -	for (i = 0; i < DIV_ROUND_UP(32, 4); i++) -		writel_relaxed(0xa0a0a0a0, dist_base + GIC_DIST_PRI + i * 4); - -	writel_relaxed(0xf0, cpu_base + GIC_CPU_PRIMASK); -	writel_relaxed(1, cpu_base + GIC_CPU_CTRL); -} - -static int gic_notifier(struct notifier_block *self, unsigned long cmd,	void *v) -{ -	int i; - -	for (i = 0; i < MAX_GIC_NR; i++) { -#ifdef CONFIG_GIC_NON_BANKED -		/* Skip over unused GICs */ -		if (!gic_data[i].get_base) -			continue; -#endif -		switch (cmd) { -		case CPU_PM_ENTER: -			gic_cpu_save(i); -			break; -		case CPU_PM_ENTER_FAILED: -		case CPU_PM_EXIT: -			gic_cpu_restore(i); -			break; -		case CPU_CLUSTER_PM_ENTER: -			gic_dist_save(i); -			break; -		case CPU_CLUSTER_PM_ENTER_FAILED: -		case CPU_CLUSTER_PM_EXIT: -			gic_dist_restore(i); -			break; -		} -	} - -	return NOTIFY_OK; -} - -static struct notifier_block gic_notifier_block = { -	.notifier_call = gic_notifier, -}; - -static void __init gic_pm_init(struct gic_chip_data *gic) -{ -	gic->saved_ppi_enable = __alloc_percpu(DIV_ROUND_UP(32, 32) * 4, -		sizeof(u32)); -	BUG_ON(!gic->saved_ppi_enable); - -	gic->saved_ppi_conf = __alloc_percpu(DIV_ROUND_UP(32, 16) * 4, -		sizeof(u32)); -	BUG_ON(!gic->saved_ppi_conf); - -	if (gic == &gic_data[0]) -		cpu_pm_register_notifier(&gic_notifier_block); -} -#else -static void __init gic_pm_init(struct gic_chip_data *gic) -{ -} -#endif - -static int gic_irq_domain_map(struct irq_domain *d, unsigned int irq, -				irq_hw_number_t hw) -{ -	if (hw < 32) { -		irq_set_percpu_devid(irq); -		irq_set_chip_and_handler(irq, &gic_chip, -					 handle_percpu_devid_irq); -		set_irq_flags(irq, IRQF_VALID | IRQF_NOAUTOEN); -	} else { -		irq_set_chip_and_handler(irq, &gic_chip, -					 handle_fasteoi_irq); -		set_irq_flags(irq, IRQF_VALID | IRQF_PROBE); -	} -	irq_set_chip_data(irq, d->host_data); -	return 0; -} - -static int gic_irq_domain_xlate(struct irq_domain *d, -				struct device_node *controller, -				const u32 *intspec, unsigned int intsize, -				unsigned long *out_hwirq, unsigned int *out_type) -{ -	if (d->of_node != controller) -		return -EINVAL; -	if (intsize < 3) -		return -EINVAL; - -	/* Get the interrupt number and add 16 to skip over SGIs */ -	*out_hwirq = intspec[1] + 16; - -	/* For SPIs, we need to add 16 more to get the GIC irq ID number */ -	if (!intspec[0]) -		*out_hwirq += 16; - -	*out_type = intspec[2] & IRQ_TYPE_SENSE_MASK; -	return 0; -} - -const struct irq_domain_ops gic_irq_domain_ops = { -	.map = gic_irq_domain_map, -	.xlate = gic_irq_domain_xlate, -}; - -void __init gic_init_bases(unsigned int gic_nr, int irq_start, -			   void __iomem *dist_base, void __iomem *cpu_base, -			   u32 percpu_offset, struct device_node *node) -{ -	irq_hw_number_t hwirq_base; -	struct gic_chip_data *gic; -	int gic_irqs, irq_base, i; - -	BUG_ON(gic_nr >= MAX_GIC_NR); - -	gic = &gic_data[gic_nr]; -#ifdef CONFIG_GIC_NON_BANKED -	if (percpu_offset) { /* Frankein-GIC without banked registers... */ -		unsigned int cpu; - -		gic->dist_base.percpu_base = alloc_percpu(void __iomem *); -		gic->cpu_base.percpu_base = alloc_percpu(void __iomem *); -		if (WARN_ON(!gic->dist_base.percpu_base || -			    !gic->cpu_base.percpu_base)) { -			free_percpu(gic->dist_base.percpu_base); -			free_percpu(gic->cpu_base.percpu_base); -			return; -		} - -		for_each_possible_cpu(cpu) { -			unsigned long offset = percpu_offset * cpu_logical_map(cpu); -			*per_cpu_ptr(gic->dist_base.percpu_base, cpu) = dist_base + offset; -			*per_cpu_ptr(gic->cpu_base.percpu_base, cpu) = cpu_base + offset; -		} - -		gic_set_base_accessor(gic, gic_get_percpu_base); -	} else -#endif -	{			/* Normal, sane GIC... */ -		WARN(percpu_offset, -		     "GIC_NON_BANKED not enabled, ignoring %08x offset!", -		     percpu_offset); -		gic->dist_base.common_base = dist_base; -		gic->cpu_base.common_base = cpu_base; -		gic_set_base_accessor(gic, gic_get_common_base); -	} - -	/* -	 * Initialize the CPU interface map to all CPUs. -	 * It will be refined as each CPU probes its ID. -	 */ -	for (i = 0; i < NR_GIC_CPU_IF; i++) -		gic_cpu_map[i] = 0xff; - -	/* -	 * For primary GICs, skip over SGIs. -	 * For secondary GICs, skip over PPIs, too. -	 */ -	if (gic_nr == 0 && (irq_start & 31) > 0) { -		hwirq_base = 16; -		if (irq_start != -1) -			irq_start = (irq_start & ~31) + 16; -	} else { -		hwirq_base = 32; -	} - -	/* -	 * Find out how many interrupts are supported. -	 * The GIC only supports up to 1020 interrupt sources. -	 */ -	gic_irqs = readl_relaxed(gic_data_dist_base(gic) + GIC_DIST_CTR) & 0x1f; -	gic_irqs = (gic_irqs + 1) * 32; -	if (gic_irqs > 1020) -		gic_irqs = 1020; -	gic->gic_irqs = gic_irqs; - -	gic_irqs -= hwirq_base; /* calculate # of irqs to allocate */ -	irq_base = irq_alloc_descs(irq_start, 16, gic_irqs, numa_node_id()); -	if (IS_ERR_VALUE(irq_base)) { -		WARN(1, "Cannot allocate irq_descs @ IRQ%d, assuming pre-allocated\n", -		     irq_start); -		irq_base = irq_start; -	} -	gic->domain = irq_domain_add_legacy(node, gic_irqs, irq_base, -				    hwirq_base, &gic_irq_domain_ops, gic); -	if (WARN_ON(!gic->domain)) -		return; - -	gic_chip.flags |= gic_arch_extn.flags; -	gic_dist_init(gic); -	gic_cpu_init(gic); -	gic_pm_init(gic); -} - -void __cpuinit gic_secondary_init(unsigned int gic_nr) -{ -	BUG_ON(gic_nr >= MAX_GIC_NR); - -	gic_cpu_init(&gic_data[gic_nr]); -} - -#ifdef CONFIG_SMP -void gic_raise_softirq(const struct cpumask *mask, unsigned int irq) -{ -	int cpu; -	unsigned long map = 0; - -	/* Convert our logical CPU mask into a physical one. */ -	for_each_cpu(cpu, mask) -		map |= gic_cpu_map[cpu]; - -	/* -	 * Ensure that stores to Normal memory are visible to the -	 * other CPUs before issuing the IPI. -	 */ -	dsb(); - -	/* this always happens on GIC0 */ -	writel_relaxed(map << 16 | irq, gic_data_dist_base(&gic_data[0]) + GIC_DIST_SOFTINT); -} -#endif - -#ifdef CONFIG_OF -static int gic_cnt __initdata = 0; - -int __init gic_of_init(struct device_node *node, struct device_node *parent) -{ -	void __iomem *cpu_base; -	void __iomem *dist_base; -	u32 percpu_offset; -	int irq; - -	if (WARN_ON(!node)) -		return -ENODEV; - -	dist_base = of_iomap(node, 0); -	WARN(!dist_base, "unable to map gic dist registers\n"); - -	cpu_base = of_iomap(node, 1); -	WARN(!cpu_base, "unable to map gic cpu registers\n"); - -	if (of_property_read_u32(node, "cpu-offset", &percpu_offset)) -		percpu_offset = 0; - -	gic_init_bases(gic_cnt, -1, dist_base, cpu_base, percpu_offset, node); - -	if (parent) { -		irq = irq_of_parse_and_map(node, 0); -		gic_cascade_irq(gic_cnt, irq); -	} -	gic_cnt++; -	return 0; -} -#endif diff --git a/arch/arm/common/vic.c b/arch/arm/common/vic.c deleted file mode 100644 index 8f324b99416..00000000000 --- a/arch/arm/common/vic.c +++ /dev/null @@ -1,464 +0,0 @@ -/* - *  linux/arch/arm/common/vic.c - * - *  Copyright (C) 1999 - 2003 ARM Limited - *  Copyright (C) 2000 Deep Blue Solutions Ltd - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA - */ - -#include <linux/export.h> -#include <linux/init.h> -#include <linux/list.h> -#include <linux/io.h> -#include <linux/irqdomain.h> -#include <linux/of.h> -#include <linux/of_address.h> -#include <linux/of_irq.h> -#include <linux/syscore_ops.h> -#include <linux/device.h> -#include <linux/amba/bus.h> - -#include <asm/exception.h> -#include <asm/mach/irq.h> -#include <asm/hardware/vic.h> - -/** - * struct vic_device - VIC PM device - * @irq: The IRQ number for the base of the VIC. - * @base: The register base for the VIC. - * @valid_sources: A bitmask of valid interrupts - * @resume_sources: A bitmask of interrupts for resume. - * @resume_irqs: The IRQs enabled for resume. - * @int_select: Save for VIC_INT_SELECT. - * @int_enable: Save for VIC_INT_ENABLE. - * @soft_int: Save for VIC_INT_SOFT. - * @protect: Save for VIC_PROTECT. - * @domain: The IRQ domain for the VIC. - */ -struct vic_device { -	void __iomem	*base; -	int		irq; -	u32		valid_sources; -	u32		resume_sources; -	u32		resume_irqs; -	u32		int_select; -	u32		int_enable; -	u32		soft_int; -	u32		protect; -	struct irq_domain *domain; -}; - -/* we cannot allocate memory when VICs are initially registered */ -static struct vic_device vic_devices[CONFIG_ARM_VIC_NR]; - -static int vic_id; - -/** - * vic_init2 - common initialisation code - * @base: Base of the VIC. - * - * Common initialisation code for registration - * and resume. -*/ -static void vic_init2(void __iomem *base) -{ -	int i; - -	for (i = 0; i < 16; i++) { -		void __iomem *reg = base + VIC_VECT_CNTL0 + (i * 4); -		writel(VIC_VECT_CNTL_ENABLE | i, reg); -	} - -	writel(32, base + VIC_PL190_DEF_VECT_ADDR); -} - -#ifdef CONFIG_PM -static void resume_one_vic(struct vic_device *vic) -{ -	void __iomem *base = vic->base; - -	printk(KERN_DEBUG "%s: resuming vic at %p\n", __func__, base); - -	/* re-initialise static settings */ -	vic_init2(base); - -	writel(vic->int_select, base + VIC_INT_SELECT); -	writel(vic->protect, base + VIC_PROTECT); - -	/* set the enabled ints and then clear the non-enabled */ -	writel(vic->int_enable, base + VIC_INT_ENABLE); -	writel(~vic->int_enable, base + VIC_INT_ENABLE_CLEAR); - -	/* and the same for the soft-int register */ - -	writel(vic->soft_int, base + VIC_INT_SOFT); -	writel(~vic->soft_int, base + VIC_INT_SOFT_CLEAR); -} - -static void vic_resume(void) -{ -	int id; - -	for (id = vic_id - 1; id >= 0; id--) -		resume_one_vic(vic_devices + id); -} - -static void suspend_one_vic(struct vic_device *vic) -{ -	void __iomem *base = vic->base; - -	printk(KERN_DEBUG "%s: suspending vic at %p\n", __func__, base); - -	vic->int_select = readl(base + VIC_INT_SELECT); -	vic->int_enable = readl(base + VIC_INT_ENABLE); -	vic->soft_int = readl(base + VIC_INT_SOFT); -	vic->protect = readl(base + VIC_PROTECT); - -	/* set the interrupts (if any) that are used for -	 * resuming the system */ - -	writel(vic->resume_irqs, base + VIC_INT_ENABLE); -	writel(~vic->resume_irqs, base + VIC_INT_ENABLE_CLEAR); -} - -static int vic_suspend(void) -{ -	int id; - -	for (id = 0; id < vic_id; id++) -		suspend_one_vic(vic_devices + id); - -	return 0; -} - -struct syscore_ops vic_syscore_ops = { -	.suspend	= vic_suspend, -	.resume		= vic_resume, -}; - -/** - * vic_pm_init - initicall to register VIC pm - * - * This is called via late_initcall() to register - * the resources for the VICs due to the early - * nature of the VIC's registration. -*/ -static int __init vic_pm_init(void) -{ -	if (vic_id > 0) -		register_syscore_ops(&vic_syscore_ops); - -	return 0; -} -late_initcall(vic_pm_init); -#endif /* CONFIG_PM */ - -static struct irq_chip vic_chip; - -static int vic_irqdomain_map(struct irq_domain *d, unsigned int irq, -			     irq_hw_number_t hwirq) -{ -	struct vic_device *v = d->host_data; - -	/* Skip invalid IRQs, only register handlers for the real ones */ -	if (!(v->valid_sources & (1 << hwirq))) -		return -ENOTSUPP; -	irq_set_chip_and_handler(irq, &vic_chip, handle_level_irq); -	irq_set_chip_data(irq, v->base); -	set_irq_flags(irq, IRQF_VALID | IRQF_PROBE); -	return 0; -} - -static struct irq_domain_ops vic_irqdomain_ops = { -	.map = vic_irqdomain_map, -	.xlate = irq_domain_xlate_onetwocell, -}; - -/** - * vic_register() - Register a VIC. - * @base: The base address of the VIC. - * @irq: The base IRQ for the VIC. - * @valid_sources: bitmask of valid interrupts - * @resume_sources: bitmask of interrupts allowed for resume sources. - * @node: The device tree node associated with the VIC. - * - * Register the VIC with the system device tree so that it can be notified - * of suspend and resume requests and ensure that the correct actions are - * taken to re-instate the settings on resume. - * - * This also configures the IRQ domain for the VIC. - */ -static void __init vic_register(void __iomem *base, unsigned int irq, -				u32 valid_sources, u32 resume_sources, -				struct device_node *node) -{ -	struct vic_device *v; -	int i; - -	if (vic_id >= ARRAY_SIZE(vic_devices)) { -		printk(KERN_ERR "%s: too few VICs, increase CONFIG_ARM_VIC_NR\n", __func__); -		return; -	} - -	v = &vic_devices[vic_id]; -	v->base = base; -	v->valid_sources = valid_sources; -	v->resume_sources = resume_sources; -	v->irq = irq; -	vic_id++; -	v->domain = irq_domain_add_simple(node, fls(valid_sources), irq, -					  &vic_irqdomain_ops, v); -	/* create an IRQ mapping for each valid IRQ */ -	for (i = 0; i < fls(valid_sources); i++) -		if (valid_sources & (1 << i)) -			irq_create_mapping(v->domain, i); -} - -static void vic_ack_irq(struct irq_data *d) -{ -	void __iomem *base = irq_data_get_irq_chip_data(d); -	unsigned int irq = d->hwirq; -	writel(1 << irq, base + VIC_INT_ENABLE_CLEAR); -	/* moreover, clear the soft-triggered, in case it was the reason */ -	writel(1 << irq, base + VIC_INT_SOFT_CLEAR); -} - -static void vic_mask_irq(struct irq_data *d) -{ -	void __iomem *base = irq_data_get_irq_chip_data(d); -	unsigned int irq = d->hwirq; -	writel(1 << irq, base + VIC_INT_ENABLE_CLEAR); -} - -static void vic_unmask_irq(struct irq_data *d) -{ -	void __iomem *base = irq_data_get_irq_chip_data(d); -	unsigned int irq = d->hwirq; -	writel(1 << irq, base + VIC_INT_ENABLE); -} - -#if defined(CONFIG_PM) -static struct vic_device *vic_from_irq(unsigned int irq) -{ -        struct vic_device *v = vic_devices; -	unsigned int base_irq = irq & ~31; -	int id; - -	for (id = 0; id < vic_id; id++, v++) { -		if (v->irq == base_irq) -			return v; -	} - -	return NULL; -} - -static int vic_set_wake(struct irq_data *d, unsigned int on) -{ -	struct vic_device *v = vic_from_irq(d->irq); -	unsigned int off = d->hwirq; -	u32 bit = 1 << off; - -	if (!v) -		return -EINVAL; - -	if (!(bit & v->resume_sources)) -		return -EINVAL; - -	if (on) -		v->resume_irqs |= bit; -	else -		v->resume_irqs &= ~bit; - -	return 0; -} -#else -#define vic_set_wake NULL -#endif /* CONFIG_PM */ - -static struct irq_chip vic_chip = { -	.name		= "VIC", -	.irq_ack	= vic_ack_irq, -	.irq_mask	= vic_mask_irq, -	.irq_unmask	= vic_unmask_irq, -	.irq_set_wake	= vic_set_wake, -}; - -static void __init vic_disable(void __iomem *base) -{ -	writel(0, base + VIC_INT_SELECT); -	writel(0, base + VIC_INT_ENABLE); -	writel(~0, base + VIC_INT_ENABLE_CLEAR); -	writel(0, base + VIC_ITCR); -	writel(~0, base + VIC_INT_SOFT_CLEAR); -} - -static void __init vic_clear_interrupts(void __iomem *base) -{ -	unsigned int i; - -	writel(0, base + VIC_PL190_VECT_ADDR); -	for (i = 0; i < 19; i++) { -		unsigned int value; - -		value = readl(base + VIC_PL190_VECT_ADDR); -		writel(value, base + VIC_PL190_VECT_ADDR); -	} -} - -/* - * The PL190 cell from ARM has been modified by ST to handle 64 interrupts. - * The original cell has 32 interrupts, while the modified one has 64, - * replocating two blocks 0x00..0x1f in 0x20..0x3f. In that case - * the probe function is called twice, with base set to offset 000 - *  and 020 within the page. We call this "second block". - */ -static void __init vic_init_st(void __iomem *base, unsigned int irq_start, -			       u32 vic_sources, struct device_node *node) -{ -	unsigned int i; -	int vic_2nd_block = ((unsigned long)base & ~PAGE_MASK) != 0; - -	/* Disable all interrupts initially. */ -	vic_disable(base); - -	/* -	 * Make sure we clear all existing interrupts. The vector registers -	 * in this cell are after the second block of general registers, -	 * so we can address them using standard offsets, but only from -	 * the second base address, which is 0x20 in the page -	 */ -	if (vic_2nd_block) { -		vic_clear_interrupts(base); - -		/* ST has 16 vectors as well, but we don't enable them by now */ -		for (i = 0; i < 16; i++) { -			void __iomem *reg = base + VIC_VECT_CNTL0 + (i * 4); -			writel(0, reg); -		} - -		writel(32, base + VIC_PL190_DEF_VECT_ADDR); -	} - -	vic_register(base, irq_start, vic_sources, 0, node); -} - -void __init __vic_init(void __iomem *base, int irq_start, -			      u32 vic_sources, u32 resume_sources, -			      struct device_node *node) -{ -	unsigned int i; -	u32 cellid = 0; -	enum amba_vendor vendor; - -	/* Identify which VIC cell this one is, by reading the ID */ -	for (i = 0; i < 4; i++) { -		void __iomem *addr; -		addr = (void __iomem *)((u32)base & PAGE_MASK) + 0xfe0 + (i * 4); -		cellid |= (readl(addr) & 0xff) << (8 * i); -	} -	vendor = (cellid >> 12) & 0xff; -	printk(KERN_INFO "VIC @%p: id 0x%08x, vendor 0x%02x\n", -	       base, cellid, vendor); - -	switch(vendor) { -	case AMBA_VENDOR_ST: -		vic_init_st(base, irq_start, vic_sources, node); -		return; -	default: -		printk(KERN_WARNING "VIC: unknown vendor, continuing anyways\n"); -		/* fall through */ -	case AMBA_VENDOR_ARM: -		break; -	} - -	/* Disable all interrupts initially. */ -	vic_disable(base); - -	/* Make sure we clear all existing interrupts */ -	vic_clear_interrupts(base); - -	vic_init2(base); - -	vic_register(base, irq_start, vic_sources, resume_sources, node); -} - -/** - * vic_init() - initialise a vectored interrupt controller - * @base: iomem base address - * @irq_start: starting interrupt number, must be muliple of 32 - * @vic_sources: bitmask of interrupt sources to allow - * @resume_sources: bitmask of interrupt sources to allow for resume - */ -void __init vic_init(void __iomem *base, unsigned int irq_start, -		     u32 vic_sources, u32 resume_sources) -{ -	__vic_init(base, irq_start, vic_sources, resume_sources, NULL); -} - -#ifdef CONFIG_OF -int __init vic_of_init(struct device_node *node, struct device_node *parent) -{ -	void __iomem *regs; - -	if (WARN(parent, "non-root VICs are not supported")) -		return -EINVAL; - -	regs = of_iomap(node, 0); -	if (WARN_ON(!regs)) -		return -EIO; - -	/* -	 * Passing 0 as first IRQ makes the simple domain allocate descriptors -	 */ -	__vic_init(regs, 0, ~0, ~0, node); - -	return 0; -} -#endif /* CONFIG OF */ - -/* - * Handle each interrupt in a single VIC.  Returns non-zero if we've - * handled at least one interrupt.  This reads the status register - * before handling each interrupt, which is necessary given that - * handle_IRQ may briefly re-enable interrupts for soft IRQ handling. - */ -static int handle_one_vic(struct vic_device *vic, struct pt_regs *regs) -{ -	u32 stat, irq; -	int handled = 0; - -	while ((stat = readl_relaxed(vic->base + VIC_IRQ_STATUS))) { -		irq = ffs(stat) - 1; -		handle_IRQ(irq_find_mapping(vic->domain, irq), regs); -		handled = 1; -	} - -	return handled; -} - -/* - * Keep iterating over all registered VIC's until there are no pending - * interrupts. - */ -asmlinkage void __exception_irq_entry vic_handle_irq(struct pt_regs *regs) -{ -	int i, handled; - -	do { -		for (i = 0, handled = 0; i < vic_id; ++i) -			handled |= handle_one_vic(&vic_devices[i], regs); -	} while (handled); -} diff --git a/arch/arm/configs/at91_dt_defconfig b/arch/arm/configs/at91_dt_defconfig index b175577d7ab..1ea959019fc 100644 --- a/arch/arm/configs/at91_dt_defconfig +++ b/arch/arm/configs/at91_dt_defconfig @@ -19,6 +19,7 @@ CONFIG_SOC_AT91SAM9260=y  CONFIG_SOC_AT91SAM9263=y  CONFIG_SOC_AT91SAM9G45=y  CONFIG_SOC_AT91SAM9X5=y +CONFIG_SOC_AT91SAM9N12=y  CONFIG_MACH_AT91SAM_DT=y  CONFIG_AT91_PROGRAMMABLE_CLOCKS=y  CONFIG_AT91_TIMER_HZ=128 @@ -31,7 +32,7 @@ CONFIG_ZBOOT_ROM_TEXT=0x0  CONFIG_ZBOOT_ROM_BSS=0x0  CONFIG_ARM_APPENDED_DTB=y  CONFIG_ARM_ATAG_DTB_COMPAT=y -CONFIG_CMDLINE="mem=128M console=ttyS0,115200 initrd=0x21100000,25165824 root=/dev/ram0 rw" +CONFIG_CMDLINE="console=ttyS0,115200 initrd=0x21100000,25165824 root=/dev/ram0 rw"  CONFIG_KEXEC=y  CONFIG_AUTO_ZRELADDR=y  # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set diff --git a/arch/arm/configs/imx_v6_v7_defconfig b/arch/arm/configs/imx_v6_v7_defconfig index 69667133321..d946372c430 100644 --- a/arch/arm/configs/imx_v6_v7_defconfig +++ b/arch/arm/configs/imx_v6_v7_defconfig @@ -19,6 +19,7 @@ CONFIG_MODULE_SRCVERSION_ALL=y  CONFIG_ARCH_MXC=y  CONFIG_ARCH_MULTI_V6=y  CONFIG_ARCH_MULTI_V7=y +CONFIG_MACH_IMX31_DT=y  CONFIG_MACH_MX31LILLY=y  CONFIG_MACH_MX31LITE=y  CONFIG_MACH_PCM037=y @@ -32,7 +33,6 @@ CONFIG_MACH_PCM043=y  CONFIG_MACH_MX35_3DS=y  CONFIG_MACH_VPR200=y  CONFIG_MACH_IMX51_DT=y -CONFIG_MACH_MX51_3DS=y  CONFIG_MACH_EUKREA_CPUIMX51SD=y  CONFIG_SOC_IMX53=y  CONFIG_SOC_IMX6Q=y diff --git a/arch/arm/configs/kirkwood_defconfig b/arch/arm/configs/kirkwood_defconfig index 93f3794ba5c..13482ea58b0 100644 --- a/arch/arm/configs/kirkwood_defconfig +++ b/arch/arm/configs/kirkwood_defconfig @@ -56,6 +56,7 @@ CONFIG_AEABI=y  CONFIG_ZBOOT_ROM_TEXT=0x0  CONFIG_ZBOOT_ROM_BSS=0x0  CONFIG_CPU_IDLE=y +CONFIG_CPU_IDLE_KIRKWOOD=y  CONFIG_NET=y  CONFIG_PACKET=y  CONFIG_UNIX=y diff --git a/arch/arm/configs/mvebu_defconfig b/arch/arm/configs/mvebu_defconfig index b5bc96cb65a..cbd91bce1ca 100644 --- a/arch/arm/configs/mvebu_defconfig +++ b/arch/arm/configs/mvebu_defconfig @@ -33,6 +33,8 @@ CONFIG_MVNETA=y  CONFIG_MARVELL_PHY=y  CONFIG_SERIAL_8250=y  CONFIG_SERIAL_8250_CONSOLE=y +CONFIG_I2C=y +CONFIG_I2C_MV64XXX=y  CONFIG_SERIAL_8250_DW=y  CONFIG_GPIOLIB=y  CONFIG_GPIO_SYSFS=y diff --git a/arch/arm/configs/prima2_defconfig b/arch/arm/configs/prima2_defconfig index 6a936c7c078..002a1ceadce 100644 --- a/arch/arm/configs/prima2_defconfig +++ b/arch/arm/configs/prima2_defconfig @@ -11,6 +11,9 @@ CONFIG_PARTITION_ADVANCED=y  CONFIG_BSD_DISKLABEL=y  CONFIG_SOLARIS_X86_PARTITION=y  CONFIG_ARCH_SIRF=y +# CONFIG_SWP_EMULATE is not set +CONFIG_SMP=y +CONFIG_SCHED_MC=y  CONFIG_PREEMPT=y  CONFIG_AEABI=y  CONFIG_KEXEC=y diff --git a/arch/arm/include/asm/hardware/gic.h b/arch/arm/include/asm/hardware/gic.h deleted file mode 100644 index 4b1ce6cd477..00000000000 --- a/arch/arm/include/asm/hardware/gic.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - *  arch/arm/include/asm/hardware/gic.h - * - *  Copyright (C) 2002 ARM Limited, All Rights Reserved. - * - * 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. - */ -#ifndef __ASM_ARM_HARDWARE_GIC_H -#define __ASM_ARM_HARDWARE_GIC_H - -#include <linux/compiler.h> - -#define GIC_CPU_CTRL			0x00 -#define GIC_CPU_PRIMASK			0x04 -#define GIC_CPU_BINPOINT		0x08 -#define GIC_CPU_INTACK			0x0c -#define GIC_CPU_EOI			0x10 -#define GIC_CPU_RUNNINGPRI		0x14 -#define GIC_CPU_HIGHPRI			0x18 - -#define GIC_DIST_CTRL			0x000 -#define GIC_DIST_CTR			0x004 -#define GIC_DIST_ENABLE_SET		0x100 -#define GIC_DIST_ENABLE_CLEAR		0x180 -#define GIC_DIST_PENDING_SET		0x200 -#define GIC_DIST_PENDING_CLEAR		0x280 -#define GIC_DIST_ACTIVE_BIT		0x300 -#define GIC_DIST_PRI			0x400 -#define GIC_DIST_TARGET			0x800 -#define GIC_DIST_CONFIG			0xc00 -#define GIC_DIST_SOFTINT		0xf00 - -#ifndef __ASSEMBLY__ -#include <linux/irqdomain.h> -struct device_node; - -extern struct irq_chip gic_arch_extn; - -void gic_init_bases(unsigned int, int, void __iomem *, void __iomem *, -		    u32 offset, struct device_node *); -int gic_of_init(struct device_node *node, struct device_node *parent); -void gic_secondary_init(unsigned int); -void gic_handle_irq(struct pt_regs *regs); -void gic_cascade_irq(unsigned int gic_nr, unsigned int irq); -void gic_raise_softirq(const struct cpumask *mask, unsigned int irq); - -static inline void gic_init(unsigned int nr, int start, -			    void __iomem *dist , void __iomem *cpu) -{ -	gic_init_bases(nr, start, dist, cpu, 0, NULL); -} - -#endif - -#endif diff --git a/arch/arm/include/asm/hardware/vic.h b/arch/arm/include/asm/hardware/vic.h deleted file mode 100644 index 2bebad36fc8..00000000000 --- a/arch/arm/include/asm/hardware/vic.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - *  arch/arm/include/asm/hardware/vic.h - * - *  Copyright (c) ARM Limited 2003.  All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA - */ -#ifndef __ASM_ARM_HARDWARE_VIC_H -#define __ASM_ARM_HARDWARE_VIC_H - -#define VIC_IRQ_STATUS			0x00 -#define VIC_FIQ_STATUS			0x04 -#define VIC_RAW_STATUS			0x08 -#define VIC_INT_SELECT			0x0c	/* 1 = FIQ, 0 = IRQ */ -#define VIC_INT_ENABLE			0x10	/* 1 = enable, 0 = disable */ -#define VIC_INT_ENABLE_CLEAR		0x14 -#define VIC_INT_SOFT			0x18 -#define VIC_INT_SOFT_CLEAR		0x1c -#define VIC_PROTECT			0x20 -#define VIC_PL190_VECT_ADDR		0x30	/* PL190 only */ -#define VIC_PL190_DEF_VECT_ADDR		0x34	/* PL190 only */ - -#define VIC_VECT_ADDR0			0x100	/* 0 to 15 (0..31 PL192) */ -#define VIC_VECT_CNTL0			0x200	/* 0 to 15 (0..31 PL192) */ -#define VIC_ITCR			0x300	/* VIC test control register */ - -#define VIC_VECT_CNTL_ENABLE		(1 << 5) - -#define VIC_PL192_VECT_ADDR		0xF00 - -#ifndef __ASSEMBLY__ -#include <linux/compiler.h> -#include <linux/types.h> - -struct device_node; -struct pt_regs; - -void __vic_init(void __iomem *base, int irq_start, u32 vic_sources, -		u32 resume_sources, struct device_node *node); -void vic_init(void __iomem *base, unsigned int irq_start, u32 vic_sources, u32 resume_sources); -int vic_of_init(struct device_node *node, struct device_node *parent); -void vic_handle_irq(struct pt_regs *regs); - -#endif /* __ASSEMBLY__ */ -#endif diff --git a/arch/arm/include/asm/mach/irq.h b/arch/arm/include/asm/mach/irq.h index 15cb035309f..18c88302333 100644 --- a/arch/arm/include/asm/mach/irq.h +++ b/arch/arm/include/asm/mach/irq.h @@ -22,6 +22,7 @@ extern int show_fiq_list(struct seq_file *, int);  #ifdef CONFIG_MULTI_IRQ_HANDLER  extern void (*handle_arch_irq)(struct pt_regs *); +extern void set_handle_irq(void (*handle_irq)(struct pt_regs *));  #endif  /* diff --git a/arch/arm/include/debug/imx.S b/arch/arm/include/debug/imx.S index 0c4e17d4d35..c6f294cf18f 100644 --- a/arch/arm/include/debug/imx.S +++ b/arch/arm/include/debug/imx.S @@ -34,7 +34,7 @@  #define UART_PADDR	0x43f90000  #elif defined (CONFIG_DEBUG_IMX51_UART)  #define UART_PADDR	0x73fbc000 -#elif defined (CONFIG_DEBUG_IMX50_IMX53_UART) +#elif defined (CONFIG_DEBUG_IMX53_UART)  #define UART_PADDR	0x53fbc000  #elif defined (CONFIG_DEBUG_IMX6Q_UART)  #define UART_PADDR	IMX6Q_DEBUG_UART_BASE diff --git a/arch/arm/mach-vt8500/include/mach/debug-macro.S b/arch/arm/include/debug/vt8500.S index ca292f29d4a..0e0ca0869da 100644 --- a/arch/arm/mach-vt8500/include/mach/debug-macro.S +++ b/arch/arm/include/debug/vt8500.S @@ -1,20 +1,24 @@ -/* - * arch/arm/mach-vt8500/include/mach/debug-macro.S +/*  + * Debugging macro include header   *   *  Copyright (C) 2010 Alexey Charkov <alchark@gmail.com> - * - * Debugging macro include header + *    Moved from arch/arm/mach-vt8500/include/mach/debug-macro.S + *    Minor changes for readability.   *   * 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. - * -*/ + */ + +#define DEBUG_LL_PHYS_BASE		0xD8000000 +#define DEBUG_LL_VIRT_BASE		0xF8000000 +#define DEBUG_LL_UART_OFFSET		0x00200000 +#if defined(CONFIG_DEBUG_VT8500_UART0)  	.macro	addruart, rp, rv, tmp -	mov	\rp,      #0x00200000 -	orr	\rv, \rp, #0xf8000000 -	orr	\rp, \rp, #0xd8000000 +	mov	\rp,      #DEBUG_LL_UART_OFFSET +	orr	\rv, \rp, #DEBUG_LL_VIRT_BASE +	orr	\rp, \rp, #DEBUG_LL_PHYS_BASE  	.endm  	.macro	senduart,rd,rx @@ -29,3 +33,5 @@  	.macro	waituart,rd,rx  	.endm + +#endif diff --git a/arch/arm/kernel/debug.S b/arch/arm/kernel/debug.S index 6809200c31f..14f7c3b1463 100644 --- a/arch/arm/kernel/debug.S +++ b/arch/arm/kernel/debug.S @@ -100,12 +100,14 @@ ENTRY(printch)  		b	1b  ENDPROC(printch) +#ifdef CONFIG_MMU  ENTRY(debug_ll_addr)  		addruart r2, r3, ip  		str	r2, [r0]  		str	r3, [r1]  		mov	pc, lr  ENDPROC(debug_ll_addr) +#endif  #else diff --git a/arch/arm/kernel/head.S b/arch/arm/kernel/head.S index 4eee351f466..486a15ae901 100644 --- a/arch/arm/kernel/head.S +++ b/arch/arm/kernel/head.S @@ -246,6 +246,7 @@ __create_page_tables:  	/*  	 * Then map boot params address in r2 if specified. +	 * We map 2 sections in case the ATAGs/DTB crosses a section boundary.  	 */  	mov	r0, r2, lsr #SECTION_SHIFT  	movs	r0, r0, lsl #SECTION_SHIFT @@ -253,6 +254,8 @@ __create_page_tables:  	addne	r3, r3, #PAGE_OFFSET  	addne	r3, r4, r3, lsr #(SECTION_SHIFT - PMD_ORDER)  	orrne	r6, r7, r0 +	strne	r6, [r3], #1 << PMD_ORDER +	addne	r6, r6, #1 << SECTION_SHIFT  	strne	r6, [r3]  #ifdef CONFIG_DEBUG_LL @@ -331,7 +334,7 @@ ENTRY(secondary_startup)  	 * as it has already been validated by the primary processor.  	 */  #ifdef CONFIG_ARM_VIRT_EXT -	bl	__hyp_stub_install +	bl	__hyp_stub_install_secondary  #endif  	safe_svcmode_maskall r9 diff --git a/arch/arm/kernel/hyp-stub.S b/arch/arm/kernel/hyp-stub.S index 65b2417aebc..1315c4ccfa5 100644 --- a/arch/arm/kernel/hyp-stub.S +++ b/arch/arm/kernel/hyp-stub.S @@ -99,7 +99,7 @@ ENTRY(__hyp_stub_install_secondary)  	 * immediately.  	 */  	compare_cpu_mode_with_primary	r4, r5, r6, r7 -	bxne	lr +	movne	pc, lr  	/*  	 * Once we have given up on one CPU, we do not try to install the @@ -111,7 +111,7 @@ ENTRY(__hyp_stub_install_secondary)  	 */  	cmp	r4, #HYP_MODE -	bxne	lr			@ give up if the CPU is not in HYP mode +	movne	pc, lr			@ give up if the CPU is not in HYP mode  /*   * Configure HSCTLR to set correct exception endianness/instruction set @@ -120,7 +120,8 @@ ENTRY(__hyp_stub_install_secondary)   * Eventually, CPU-specific code might be needed -- assume not for now   *   * This code relies on the "eret" instruction to synchronize the - * various coprocessor accesses. + * various coprocessor accesses. This is done when we switch to SVC + * (see safe_svcmode_maskall).   */  	@ Now install the hypervisor stub:  	adr	r7, __hyp_stub_vectors @@ -155,14 +156,7 @@ THUMB(	orr	r7, #(1 << 30)	)	@ HSCTLR.TE  1:  #endif -	bic	r7, r4, #MODE_MASK -	orr	r7, r7, #SVC_MODE -THUMB(	orr	r7, r7, #PSR_T_BIT	) -	msr	spsr_cxsf, r7		@ This is SPSR_hyp. - -	__MSR_ELR_HYP(14)		@ msr elr_hyp, lr -	__ERET				@ return, switching to SVC mode -					@ The boot CPU mode is left in r4. +	bx	lr			@ The boot CPU mode is left in r4.  ENDPROC(__hyp_stub_install_secondary)  __hyp_stub_do_trap: @@ -200,7 +194,7 @@ ENDPROC(__hyp_get_vectors)  	@ fall through  ENTRY(__hyp_set_vectors)  	__HVC(0) -	bx	lr +	mov	pc, lr  ENDPROC(__hyp_set_vectors)  #ifndef ZIMAGE diff --git a/arch/arm/kernel/irq.c b/arch/arm/kernel/irq.c index 896165096d6..8e4ef4c83a7 100644 --- a/arch/arm/kernel/irq.c +++ b/arch/arm/kernel/irq.c @@ -117,6 +117,16 @@ void __init init_IRQ(void)  	machine_desc->init_irq();  } +#ifdef CONFIG_MULTI_IRQ_HANDLER +void __init set_handle_irq(void (*handle_irq)(struct pt_regs *)) +{ +	if (handle_arch_irq) +		return; + +	handle_arch_irq = handle_irq; +} +#endif +  #ifdef CONFIG_SPARSE_IRQ  int __init arch_probe_nr_irqs(void)  { diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c index 84f4cbf652e..3fc96db2a4b 100644 --- a/arch/arm/kernel/smp.c +++ b/arch/arm/kernel/smp.c @@ -416,7 +416,8 @@ static void (*smp_cross_call)(const struct cpumask *, unsigned int);  void __init set_smp_cross_call(void (*fn)(const struct cpumask *, unsigned int))  { -	smp_cross_call = fn; +	if (!smp_cross_call) +		smp_cross_call = fn;  }  void arch_send_call_function_ipi_mask(const struct cpumask *mask) diff --git a/arch/arm/kernel/smp_twd.c b/arch/arm/kernel/smp_twd.c index 49f335d301b..dc9bb014666 100644 --- a/arch/arm/kernel/smp_twd.c +++ b/arch/arm/kernel/smp_twd.c @@ -24,7 +24,6 @@  #include <asm/smp_twd.h>  #include <asm/localtimer.h> -#include <asm/hardware/gic.h>  /* set up by the platform code */  static void __iomem *twd_base; diff --git a/arch/arm/mach-at91/at91rm9200_time.c b/arch/arm/mach-at91/at91rm9200_time.c index 180b3024bec..2acdff4c1df 100644 --- a/arch/arm/mach-at91/at91rm9200_time.c +++ b/arch/arm/mach-at91/at91rm9200_time.c @@ -174,7 +174,6 @@ clkevt32k_next_event(unsigned long delta, struct clock_event_device *dev)  static struct clock_event_device clkevt = {  	.name		= "at91_tick",  	.features	= CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT, -	.shift		= 32,  	.rating		= 150,  	.set_next_event	= clkevt32k_next_event,  	.set_mode	= clkevt32k_mode, @@ -265,11 +264,9 @@ void __init at91rm9200_timer_init(void)  	at91_st_write(AT91_ST_RTMR, 1);  	/* Setup timer clockevent, with minimum of two ticks (important!!) */ -	clkevt.mult = div_sc(AT91_SLOW_CLOCK, NSEC_PER_SEC, clkevt.shift); -	clkevt.max_delta_ns = clockevent_delta2ns(AT91_ST_ALMV, &clkevt); -	clkevt.min_delta_ns = clockevent_delta2ns(2, &clkevt) + 1;  	clkevt.cpumask = cpumask_of(0); -	clockevents_register_device(&clkevt); +	clockevents_config_and_register(&clkevt, AT91_SLOW_CLOCK, +					2, AT91_ST_ALMV);  	/* register clocksource */  	clocksource_register_hz(&clk32k, AT91_SLOW_CLOCK); diff --git a/arch/arm/mach-at91/setup.c b/arch/arm/mach-at91/setup.c index 9ee866ce047..4b678478cf9 100644 --- a/arch/arm/mach-at91/setup.c +++ b/arch/arm/mach-at91/setup.c @@ -105,6 +105,8 @@ static void __init soc_detect(u32 dbgu_base)  	switch (socid) {  	case ARCH_ID_AT91RM9200:  		at91_soc_initdata.type = AT91_SOC_RM9200; +		if (at91_soc_initdata.subtype == AT91_SOC_SUBTYPE_NONE) +			at91_soc_initdata.subtype = AT91_SOC_RM9200_BGA;  		at91_boot_soc = at91rm9200_soc;  		break; diff --git a/arch/arm/mach-bcm/board_bcm.c b/arch/arm/mach-bcm/board_bcm.c index 3df68030cf6..f0f9abafad2 100644 --- a/arch/arm/mach-bcm/board_bcm.c +++ b/arch/arm/mach-bcm/board_bcm.c @@ -11,30 +11,19 @@   * GNU General Public License for more details.   */ -#include <linux/of_irq.h>  #include <linux/of_platform.h>  #include <linux/init.h>  #include <linux/device.h>  #include <linux/platform_device.h> +#include <linux/irqchip.h>  #include <asm/mach/arch.h> -#include <asm/hardware/gic.h> -  #include <asm/mach/time.h> -static const struct of_device_id irq_match[] = { -	{.compatible = "arm,cortex-a9-gic", .data = gic_of_init, }, -	{} -}; -  static void timer_init(void)  {  } -static void __init init_irq(void) -{ -	of_irq_init(irq_match); -}  static void __init board_init(void)  { @@ -45,9 +34,8 @@ static void __init board_init(void)  static const char * const bcm11351_dt_compat[] = { "bcm,bcm11351", NULL, };  DT_MACHINE_START(BCM11351_DT, "Broadcom Application Processor") -	.init_irq = init_irq, +	.init_irq = irqchip_init,  	.init_time = timer_init,  	.init_machine = board_init,  	.dt_compat = bcm11351_dt_compat, -	.handle_irq = gic_handle_irq,  MACHINE_END diff --git a/arch/arm/mach-bcm2835/bcm2835.c b/arch/arm/mach-bcm2835/bcm2835.c index 176d2d24782..1a446a164c8 100644 --- a/arch/arm/mach-bcm2835/bcm2835.c +++ b/arch/arm/mach-bcm2835/bcm2835.c @@ -26,11 +26,13 @@  #include <mach/bcm2835_soc.h>  #define PM_RSTC				0x1c +#define PM_RSTS				0x20  #define PM_WDOG				0x24  #define PM_PASSWORD			0x5a000000  #define PM_RSTC_WRCFG_MASK		0x00000030  #define PM_RSTC_WRCFG_FULL_RESET	0x00000020 +#define PM_RSTS_HADWRH_SET		0x00000040  static void __iomem *wdt_regs; @@ -67,6 +69,29 @@ static void bcm2835_restart(char mode, const char *cmd)  	mdelay(1);  } +/* + * We can't really power off, but if we do the normal reset scheme, and + * indicate to bootcode.bin not to reboot, then most of the chip will be + * powered off. + */ +static void bcm2835_power_off(void) +{ +	u32 val; + +	/* +	 * We set the watchdog hard reset bit here to distinguish this reset +	 * from the normal (full) reset. bootcode.bin will not reboot after a +	 * hard reset. +	 */ +	val = readl_relaxed(wdt_regs + PM_RSTS); +	val &= ~PM_RSTC_WRCFG_MASK; +	val |= PM_PASSWORD | PM_RSTS_HADWRH_SET; +	writel_relaxed(val, wdt_regs + PM_RSTS); + +	/* Continue with normal reset mechanism */ +	bcm2835_restart(0, ""); +} +  static struct map_desc io_map __initdata = {  	.virtual = BCM2835_PERIPH_VIRT,  	.pfn = __phys_to_pfn(BCM2835_PERIPH_PHYS), @@ -84,6 +109,9 @@ static void __init bcm2835_init(void)  	int ret;  	bcm2835_setup_restart(); +	if (wdt_regs) +		pm_power_off = bcm2835_power_off; +  	bcm2835_init_clocks();  	ret = of_platform_populate(NULL, of_default_bus_match_table, NULL, diff --git a/arch/arm/mach-cns3xxx/cns3420vb.c b/arch/arm/mach-cns3xxx/cns3420vb.c index 3c86f910b64..a71867e1d8d 100644 --- a/arch/arm/mach-cns3xxx/cns3420vb.c +++ b/arch/arm/mach-cns3xxx/cns3420vb.c @@ -28,7 +28,6 @@  #include <linux/usb/ohci_pdriver.h>  #include <asm/setup.h>  #include <asm/mach-types.h> -#include <asm/hardware/gic.h>  #include <asm/mach/arch.h>  #include <asm/mach/map.h>  #include <asm/mach/time.h> @@ -251,7 +250,6 @@ MACHINE_START(CNS3420VB, "Cavium Networks CNS3420 Validation Board")  	.map_io		= cns3420_map_io,  	.init_irq	= cns3xxx_init_irq,  	.init_time	= cns3xxx_timer_init, -	.handle_irq	= gic_handle_irq,  	.init_machine	= cns3420_init,  	.restart	= cns3xxx_restart,  MACHINE_END diff --git a/arch/arm/mach-cns3xxx/core.c b/arch/arm/mach-cns3xxx/core.c index 1754f8f4f34..e698f26cc0c 100644 --- a/arch/arm/mach-cns3xxx/core.c +++ b/arch/arm/mach-cns3xxx/core.c @@ -12,10 +12,10 @@  #include <linux/interrupt.h>  #include <linux/clockchips.h>  #include <linux/io.h> +#include <linux/irqchip/arm-gic.h>  #include <asm/mach/map.h>  #include <asm/mach/time.h>  #include <asm/mach/irq.h> -#include <asm/hardware/gic.h>  #include <asm/hardware/cache-l2x0.h>  #include <mach/cns3xxx.h>  #include "core.h" @@ -134,7 +134,6 @@ static int cns3xxx_timer_set_next_event(unsigned long evt,  static struct clock_event_device cns3xxx_tmr1_clockevent = {  	.name		= "cns3xxx timer1", -	.shift		= 8,  	.features       = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT,  	.set_mode	= cns3xxx_timer_set_mode,  	.set_next_event	= cns3xxx_timer_set_next_event, @@ -145,15 +144,9 @@ static struct clock_event_device cns3xxx_tmr1_clockevent = {  static void __init cns3xxx_clockevents_init(unsigned int timer_irq)  {  	cns3xxx_tmr1_clockevent.irq = timer_irq; -	cns3xxx_tmr1_clockevent.mult = -		div_sc((cns3xxx_cpu_clock() >> 3) * 1000000, NSEC_PER_SEC, -		       cns3xxx_tmr1_clockevent.shift); -	cns3xxx_tmr1_clockevent.max_delta_ns = -		clockevent_delta2ns(0xffffffff, &cns3xxx_tmr1_clockevent); -	cns3xxx_tmr1_clockevent.min_delta_ns = -		clockevent_delta2ns(0xf, &cns3xxx_tmr1_clockevent); - -	clockevents_register_device(&cns3xxx_tmr1_clockevent); +	clockevents_config_and_register(&cns3xxx_tmr1_clockevent, +					(cns3xxx_cpu_clock() >> 3) * 1000000, +					0xf, 0xffffffff);  }  /* diff --git a/arch/arm/mach-davinci/board-da830-evm.c b/arch/arm/mach-davinci/board-da830-evm.c index e3742716cba..6da25eebf91 100644 --- a/arch/arm/mach-davinci/board-da830-evm.c +++ b/arch/arm/mach-davinci/board-da830-evm.c @@ -652,8 +652,13 @@ static __init void da830_evm_init(void)  	if (ret)  		pr_warning("da830_evm_init: rtc setup failed: %d\n", ret); -	ret = da8xx_register_spi(0, da830evm_spi_info, -				 ARRAY_SIZE(da830evm_spi_info)); +	ret = spi_register_board_info(da830evm_spi_info, +				      ARRAY_SIZE(da830evm_spi_info)); +	if (ret) +		pr_warn("%s: spi info registration failed: %d\n", __func__, +			ret); + +	ret = da8xx_register_spi_bus(0, ARRAY_SIZE(da830evm_spi_info));  	if (ret)  		pr_warning("da830_evm_init: spi 0 registration failed: %d\n",  			   ret); diff --git a/arch/arm/mach-davinci/board-da850-evm.c b/arch/arm/mach-davinci/board-da850-evm.c index 3b3356097bb..3a76a47df39 100644 --- a/arch/arm/mach-davinci/board-da850-evm.c +++ b/arch/arm/mach-davinci/board-da850-evm.c @@ -1565,8 +1565,13 @@ static __init void da850_evm_init(void)  	da850_vpif_init(); -	ret = da8xx_register_spi(1, da850evm_spi_info, -				 ARRAY_SIZE(da850evm_spi_info)); +	ret = spi_register_board_info(da850evm_spi_info, +				      ARRAY_SIZE(da850evm_spi_info)); +	if (ret) +		pr_warn("%s: spi info registration failed: %d\n", __func__, +			ret); + +	ret = da8xx_register_spi_bus(1, ARRAY_SIZE(da850evm_spi_info));  	if (ret)  		pr_warning("da850_evm_init: spi 1 registration failed: %d\n",  				ret); diff --git a/arch/arm/mach-davinci/board-mityomapl138.c b/arch/arm/mach-davinci/board-mityomapl138.c index b0df578bf74..9549d53aa63 100644 --- a/arch/arm/mach-davinci/board-mityomapl138.c +++ b/arch/arm/mach-davinci/board-mityomapl138.c @@ -529,8 +529,13 @@ static void __init mityomapl138_init(void)  	mityomapl138_setup_nand(); -	ret = da8xx_register_spi(1, mityomapl138_spi_flash_info, -			       ARRAY_SIZE(mityomapl138_spi_flash_info)); +	ret = spi_register_board_info(mityomapl138_spi_flash_info, +				      ARRAY_SIZE(mityomapl138_spi_flash_info)); +	if (ret) +		pr_warn("spi info registration failed: %d\n", ret); + +	ret = da8xx_register_spi_bus(1, +				     ARRAY_SIZE(mityomapl138_spi_flash_info));  	if (ret)  		pr_warning("spi 1 registration failed: %d\n", ret); diff --git a/arch/arm/mach-davinci/clock.c b/arch/arm/mach-davinci/clock.c index 34668ead53c..d458558ee84 100644 --- a/arch/arm/mach-davinci/clock.c +++ b/arch/arm/mach-davinci/clock.c @@ -52,6 +52,40 @@ static void __clk_disable(struct clk *clk)  		__clk_disable(clk->parent);  } +int davinci_clk_reset(struct clk *clk, bool reset) +{ +	unsigned long flags; + +	if (clk == NULL || IS_ERR(clk)) +		return -EINVAL; + +	spin_lock_irqsave(&clockfw_lock, flags); +	if (clk->flags & CLK_PSC) +		davinci_psc_reset(clk->gpsc, clk->lpsc, reset); +	spin_unlock_irqrestore(&clockfw_lock, flags); + +	return 0; +} +EXPORT_SYMBOL(davinci_clk_reset); + +int davinci_clk_reset_assert(struct clk *clk) +{ +	if (clk == NULL || IS_ERR(clk) || !clk->reset) +		return -EINVAL; + +	return clk->reset(clk, true); +} +EXPORT_SYMBOL(davinci_clk_reset_assert); + +int davinci_clk_reset_deassert(struct clk *clk) +{ +	if (clk == NULL || IS_ERR(clk) || !clk->reset) +		return -EINVAL; + +	return clk->reset(clk, false); +} +EXPORT_SYMBOL(davinci_clk_reset_deassert); +  int clk_enable(struct clk *clk)  {  	unsigned long flags; @@ -535,7 +569,7 @@ int davinci_set_refclk_rate(unsigned long rate)  }  int __init davinci_clk_init(struct clk_lookup *clocks) -  { +{  	struct clk_lookup *c;  	struct clk *clk;  	size_t num_clocks = 0; @@ -576,6 +610,9 @@ int __init davinci_clk_init(struct clk_lookup *clocks)  		if (clk->lpsc)  			clk->flags |= CLK_PSC; +		if (clk->flags & PSC_LRST) +			clk->reset = davinci_clk_reset; +  		clk_register(clk);  		num_clocks++; diff --git a/arch/arm/mach-davinci/clock.h b/arch/arm/mach-davinci/clock.h index 46f0f1bf1a4..8694b395fc9 100644 --- a/arch/arm/mach-davinci/clock.h +++ b/arch/arm/mach-davinci/clock.h @@ -103,6 +103,7 @@ struct clk {  	unsigned long (*recalc) (struct clk *);  	int (*set_rate) (struct clk *clk, unsigned long rate);  	int (*round_rate) (struct clk *clk, unsigned long rate); +	int (*reset) (struct clk *clk, bool reset);  };  /* Clock flags: SoC-specific flags start at BIT(16) */ @@ -112,6 +113,7 @@ struct clk {  #define PRE_PLL			BIT(4) /* source is before PLL mult/div */  #define PSC_SWRSTDISABLE	BIT(5) /* Disable state is SwRstDisable */  #define PSC_FORCE		BIT(6) /* Force module state transtition */ +#define PSC_LRST		BIT(8) /* Use local reset on enable/disable */  #define CLK(dev, con, ck) 	\  	{			\ @@ -126,6 +128,7 @@ int davinci_set_pllrate(struct pll_data *pll, unsigned int prediv,  int davinci_set_sysclk_rate(struct clk *clk, unsigned long rate);  int davinci_set_refclk_rate(unsigned long rate);  int davinci_simple_set_rate(struct clk *clk, unsigned long rate); +int davinci_clk_reset(struct clk *clk, bool reset);  extern struct platform_device davinci_wdt_device;  extern void davinci_watchdog_reset(struct platform_device *); diff --git a/arch/arm/mach-davinci/da850.c b/arch/arm/mach-davinci/da850.c index 6b9154e9f90..0c4a26ddebb 100644 --- a/arch/arm/mach-davinci/da850.c +++ b/arch/arm/mach-davinci/da850.c @@ -76,6 +76,13 @@ static struct clk pll0_aux_clk = {  	.flags		= CLK_PLL | PRE_PLL,  }; +static struct clk pll0_sysclk1 = { +	.name		= "pll0_sysclk1", +	.parent		= &pll0_clk, +	.flags		= CLK_PLL, +	.div_reg	= PLLDIV1, +}; +  static struct clk pll0_sysclk2 = {  	.name		= "pll0_sysclk2",  	.parent		= &pll0_clk, @@ -368,10 +375,19 @@ static struct clk sata_clk = {  	.flags		= PSC_FORCE,  }; +static struct clk dsp_clk = { +	.name		= "dsp", +	.parent		= &pll0_sysclk1, +	.domain		= DAVINCI_GPSC_DSPDOMAIN, +	.lpsc		= DA8XX_LPSC0_GEM, +	.flags		= PSC_LRST | PSC_FORCE, +}; +  static struct clk_lookup da850_clks[] = {  	CLK(NULL,		"ref",		&ref_clk),  	CLK(NULL,		"pll0",		&pll0_clk),  	CLK(NULL,		"pll0_aux",	&pll0_aux_clk), +	CLK(NULL,		"pll0_sysclk1",	&pll0_sysclk1),  	CLK(NULL,		"pll0_sysclk2",	&pll0_sysclk2),  	CLK(NULL,		"pll0_sysclk3",	&pll0_sysclk3),  	CLK(NULL,		"pll0_sysclk4",	&pll0_sysclk4), @@ -413,6 +429,7 @@ static struct clk_lookup da850_clks[] = {  	CLK("spi_davinci.1",	NULL,		&spi1_clk),  	CLK("vpif",		NULL,		&vpif_clk),  	CLK("ahci",		NULL,		&sata_clk), +	CLK("davinci-rproc.0",	NULL,		&dsp_clk),  	CLK(NULL,		NULL,		NULL),  }; diff --git a/arch/arm/mach-davinci/devices-da8xx.c b/arch/arm/mach-davinci/devices-da8xx.c index 2d5502d84a2..aa402bc160c 100644 --- a/arch/arm/mach-davinci/devices-da8xx.c +++ b/arch/arm/mach-davinci/devices-da8xx.c @@ -751,7 +751,7 @@ void __iomem * __init da8xx_get_mem_ctlr(void)  	da8xx_ddr2_ctlr_base = ioremap(DA8XX_DDR2_CTL_BASE, SZ_32K);  	if (!da8xx_ddr2_ctlr_base) -		pr_warning("%s: Unable to map DDR2 controller",	__func__); +		pr_warn("%s: Unable to map DDR2 controller", __func__);  	return da8xx_ddr2_ctlr_base;  } @@ -832,7 +832,7 @@ static struct resource da8xx_spi1_resources[] = {  	},  }; -struct davinci_spi_platform_data da8xx_spi_pdata[] = { +static struct davinci_spi_platform_data da8xx_spi_pdata[] = {  	[0] = {  		.version	= SPI_VERSION_2,  		.intr_line	= 1, @@ -866,20 +866,12 @@ static struct platform_device da8xx_spi_device[] = {  	},  }; -int __init da8xx_register_spi(int instance, const struct spi_board_info *info, -			      unsigned len) +int __init da8xx_register_spi_bus(int instance, unsigned num_chipselect)  { -	int ret; -  	if (instance < 0 || instance > 1)  		return -EINVAL; -	ret = spi_register_board_info(info, len); -	if (ret) -		pr_warning("%s: failed to register board info for spi %d :" -			   " %d\n", __func__, instance, ret); - -	da8xx_spi_pdata[instance].num_chipselect = len; +	da8xx_spi_pdata[instance].num_chipselect = num_chipselect;  	if (instance == 1 && cpu_is_davinci_da850()) {  		da8xx_spi1_resources[0].start = DA850_SPI1_BASE; diff --git a/arch/arm/mach-davinci/include/mach/clock.h b/arch/arm/mach-davinci/include/mach/clock.h index a3b04021987..3e8af6a0b64 100644 --- a/arch/arm/mach-davinci/include/mach/clock.h +++ b/arch/arm/mach-davinci/include/mach/clock.h @@ -18,4 +18,7 @@ struct clk;  extern int clk_register(struct clk *clk);  extern void clk_unregister(struct clk *clk); +int davinci_clk_reset_assert(struct clk *c); +int davinci_clk_reset_deassert(struct clk *c); +  #endif diff --git a/arch/arm/mach-davinci/include/mach/da8xx.h b/arch/arm/mach-davinci/include/mach/da8xx.h index 700d311c685..1b14aea4031 100644 --- a/arch/arm/mach-davinci/include/mach/da8xx.h +++ b/arch/arm/mach-davinci/include/mach/da8xx.h @@ -82,8 +82,7 @@ void __init da850_init(void);  int da830_register_edma(struct edma_rsv_info *rsv);  int da850_register_edma(struct edma_rsv_info *rsv[2]);  int da8xx_register_i2c(int instance, struct davinci_i2c_platform_data *pdata); -int da8xx_register_spi(int instance, -		const struct spi_board_info *info, unsigned len); +int da8xx_register_spi_bus(int instance, unsigned num_chipselect);  int da8xx_register_watchdog(void);  int da8xx_register_usb20(unsigned mA, unsigned potpgt);  int da8xx_register_usb11(struct da8xx_ohci_root_hub *pdata); @@ -110,7 +109,6 @@ extern struct platform_device da8xx_serial_device;  extern struct emac_platform_data da8xx_emac_pdata;  extern struct da8xx_lcdc_platform_data sharp_lcd035q3dg01_pdata;  extern struct da8xx_lcdc_platform_data sharp_lk043t1dg01_pdata; -extern struct davinci_spi_platform_data da8xx_spi_pdata[];  extern struct platform_device da8xx_wdt_device; diff --git a/arch/arm/mach-davinci/include/mach/psc.h b/arch/arm/mach-davinci/include/mach/psc.h index 40a0027838e..0a22710493f 100644 --- a/arch/arm/mach-davinci/include/mach/psc.h +++ b/arch/arm/mach-davinci/include/mach/psc.h @@ -246,6 +246,7 @@  #define MDSTAT_STATE_MASK	0x3f  #define PDSTAT_STATE_MASK	0x1f +#define MDCTL_LRST		BIT(8)  #define MDCTL_FORCE		BIT(31)  #define PDCTL_NEXT		BIT(0)  #define PDCTL_EPCGOOD		BIT(8) @@ -253,6 +254,8 @@  #ifndef __ASSEMBLER__  extern int davinci_psc_is_clk_active(unsigned int ctlr, unsigned int id); +extern void davinci_psc_reset(unsigned int ctlr, unsigned int id, +		bool reset);  extern void davinci_psc_config(unsigned int domain, unsigned int ctlr,  		unsigned int id, bool enable, u32 flags); diff --git a/arch/arm/mach-davinci/psc.c b/arch/arm/mach-davinci/psc.c index d7e210f4b55..82fdc69d572 100644 --- a/arch/arm/mach-davinci/psc.c +++ b/arch/arm/mach-davinci/psc.c @@ -35,7 +35,7 @@ int __init davinci_psc_is_clk_active(unsigned int ctlr, unsigned int id)  	struct davinci_soc_info *soc_info = &davinci_soc_info;  	if (!soc_info->psc_bases || (ctlr >= soc_info->psc_bases_num)) { -		pr_warning("PSC: Bad psc data: 0x%x[%d]\n", +		pr_warn("PSC: Bad psc data: 0x%x[%d]\n",  				(int)soc_info->psc_bases, ctlr);  		return 0;  	} @@ -48,6 +48,31 @@ int __init davinci_psc_is_clk_active(unsigned int ctlr, unsigned int id)  	return mdstat & BIT(12);  } +/* Control "reset" line associated with PSC domain */ +void davinci_psc_reset(unsigned int ctlr, unsigned int id, bool reset) +{ +	u32 mdctl; +	void __iomem *psc_base; +	struct davinci_soc_info *soc_info = &davinci_soc_info; + +	if (!soc_info->psc_bases || (ctlr >= soc_info->psc_bases_num)) { +		pr_warn("PSC: Bad psc data: 0x%x[%d]\n", +				(int)soc_info->psc_bases, ctlr); +		return; +	} + +	psc_base = ioremap(soc_info->psc_bases[ctlr], SZ_4K); + +	mdctl = readl(psc_base + MDCTL + 4 * id); +	if (reset) +		mdctl &= ~MDCTL_LRST; +	else +		mdctl |= MDCTL_LRST; +	writel(mdctl, psc_base + MDCTL + 4 * id); + +	iounmap(psc_base); +} +  /* Enable or disable a PSC domain */  void davinci_psc_config(unsigned int domain, unsigned int ctlr,  		unsigned int id, bool enable, u32 flags) @@ -58,7 +83,7 @@ void davinci_psc_config(unsigned int domain, unsigned int ctlr,  	u32 next_state = PSC_STATE_ENABLE;  	if (!soc_info->psc_bases || (ctlr >= soc_info->psc_bases_num)) { -		pr_warning("PSC: Bad psc data: 0x%x[%d]\n", +		pr_warn("PSC: Bad psc data: 0x%x[%d]\n",  				(int)soc_info->psc_bases, ctlr);  		return;  	} diff --git a/arch/arm/mach-ep93xx/adssphere.c b/arch/arm/mach-ep93xx/adssphere.c index 82d9c788535..bda6c3a5c92 100644 --- a/arch/arm/mach-ep93xx/adssphere.c +++ b/arch/arm/mach-ep93xx/adssphere.c @@ -17,7 +17,6 @@  #include <mach/hardware.h> -#include <asm/hardware/vic.h>  #include <asm/mach-types.h>  #include <asm/mach/arch.h> @@ -39,7 +38,6 @@ MACHINE_START(ADSSPHERE, "ADS Sphere board")  	.atag_offset	= 0x100,  	.map_io		= ep93xx_map_io,  	.init_irq	= ep93xx_init_irq, -	.handle_irq	= vic_handle_irq,  	.init_time	= ep93xx_timer_init,  	.init_machine	= adssphere_init_machine,  	.init_late	= ep93xx_init_late, diff --git a/arch/arm/mach-ep93xx/core.c b/arch/arm/mach-ep93xx/core.c index ee27b4b0ab0..c49ed3dc1ae 100644 --- a/arch/arm/mach-ep93xx/core.c +++ b/arch/arm/mach-ep93xx/core.c @@ -34,6 +34,7 @@  #include <linux/i2c-gpio.h>  #include <linux/spi/spi.h>  #include <linux/export.h> +#include <linux/irqchip/arm-vic.h>  #include <mach/hardware.h>  #include <linux/platform_data/video-ep93xx.h> @@ -44,8 +45,6 @@  #include <asm/mach/map.h>  #include <asm/mach/time.h> -#include <asm/hardware/vic.h> -  #include "soc.h"  /************************************************************************* diff --git a/arch/arm/mach-ep93xx/edb93xx.c b/arch/arm/mach-ep93xx/edb93xx.c index ac260519c9e..27b14ae92c7 100644 --- a/arch/arm/mach-ep93xx/edb93xx.c +++ b/arch/arm/mach-ep93xx/edb93xx.c @@ -39,7 +39,6 @@  #include <linux/platform_data/spi-ep93xx.h>  #include <mach/gpio-ep93xx.h> -#include <asm/hardware/vic.h>  #include <asm/mach-types.h>  #include <asm/mach/arch.h> @@ -276,7 +275,6 @@ MACHINE_START(EDB9301, "Cirrus Logic EDB9301 Evaluation Board")  	.atag_offset	= 0x100,  	.map_io		= ep93xx_map_io,  	.init_irq	= ep93xx_init_irq, -	.handle_irq	= vic_handle_irq,  	.init_time	= ep93xx_timer_init,  	.init_machine	= edb93xx_init_machine,  	.init_late	= ep93xx_init_late, @@ -290,7 +288,6 @@ MACHINE_START(EDB9302, "Cirrus Logic EDB9302 Evaluation Board")  	.atag_offset	= 0x100,  	.map_io		= ep93xx_map_io,  	.init_irq	= ep93xx_init_irq, -	.handle_irq	= vic_handle_irq,  	.init_time	= ep93xx_timer_init,  	.init_machine	= edb93xx_init_machine,  	.init_late	= ep93xx_init_late, @@ -304,7 +301,6 @@ MACHINE_START(EDB9302A, "Cirrus Logic EDB9302A Evaluation Board")  	.atag_offset	= 0x100,  	.map_io		= ep93xx_map_io,  	.init_irq	= ep93xx_init_irq, -	.handle_irq	= vic_handle_irq,  	.init_time	= ep93xx_timer_init,  	.init_machine	= edb93xx_init_machine,  	.init_late	= ep93xx_init_late, @@ -318,7 +314,6 @@ MACHINE_START(EDB9307, "Cirrus Logic EDB9307 Evaluation Board")  	.atag_offset	= 0x100,  	.map_io		= ep93xx_map_io,  	.init_irq	= ep93xx_init_irq, -	.handle_irq	= vic_handle_irq,  	.init_time	= ep93xx_timer_init,  	.init_machine	= edb93xx_init_machine,  	.init_late	= ep93xx_init_late, @@ -332,7 +327,6 @@ MACHINE_START(EDB9307A, "Cirrus Logic EDB9307A Evaluation Board")  	.atag_offset	= 0x100,  	.map_io		= ep93xx_map_io,  	.init_irq	= ep93xx_init_irq, -	.handle_irq	= vic_handle_irq,  	.init_time	= ep93xx_timer_init,  	.init_machine	= edb93xx_init_machine,  	.init_late	= ep93xx_init_late, @@ -346,7 +340,6 @@ MACHINE_START(EDB9312, "Cirrus Logic EDB9312 Evaluation Board")  	.atag_offset	= 0x100,  	.map_io		= ep93xx_map_io,  	.init_irq	= ep93xx_init_irq, -	.handle_irq	= vic_handle_irq,  	.init_time	= ep93xx_timer_init,  	.init_machine	= edb93xx_init_machine,  	.init_late	= ep93xx_init_late, @@ -360,7 +353,6 @@ MACHINE_START(EDB9315, "Cirrus Logic EDB9315 Evaluation Board")  	.atag_offset	= 0x100,  	.map_io		= ep93xx_map_io,  	.init_irq	= ep93xx_init_irq, -	.handle_irq	= vic_handle_irq,  	.init_time	= ep93xx_timer_init,  	.init_machine	= edb93xx_init_machine,  	.init_late	= ep93xx_init_late, @@ -374,7 +366,6 @@ MACHINE_START(EDB9315A, "Cirrus Logic EDB9315A Evaluation Board")  	.atag_offset	= 0x100,  	.map_io		= ep93xx_map_io,  	.init_irq	= ep93xx_init_irq, -	.handle_irq	= vic_handle_irq,  	.init_time	= ep93xx_timer_init,  	.init_machine	= edb93xx_init_machine,  	.init_late	= ep93xx_init_late, diff --git a/arch/arm/mach-ep93xx/gesbc9312.c b/arch/arm/mach-ep93xx/gesbc9312.c index 76c50f42bd7..0cca5b18330 100644 --- a/arch/arm/mach-ep93xx/gesbc9312.c +++ b/arch/arm/mach-ep93xx/gesbc9312.c @@ -17,7 +17,6 @@  #include <mach/hardware.h> -#include <asm/hardware/vic.h>  #include <asm/mach-types.h>  #include <asm/mach/arch.h> @@ -39,7 +38,6 @@ MACHINE_START(GESBC9312, "Glomation GESBC-9312-sx")  	.atag_offset	= 0x100,  	.map_io		= ep93xx_map_io,  	.init_irq	= ep93xx_init_irq, -	.handle_irq	= vic_handle_irq,  	.init_time	= ep93xx_timer_init,  	.init_machine	= gesbc9312_init_machine,  	.init_late	= ep93xx_init_late, diff --git a/arch/arm/mach-ep93xx/micro9.c b/arch/arm/mach-ep93xx/micro9.c index 777cd2170f8..373583c2982 100644 --- a/arch/arm/mach-ep93xx/micro9.c +++ b/arch/arm/mach-ep93xx/micro9.c @@ -18,7 +18,6 @@  #include <mach/hardware.h> -#include <asm/hardware/vic.h>  #include <asm/mach-types.h>  #include <asm/mach/arch.h> @@ -82,7 +81,6 @@ MACHINE_START(MICRO9, "Contec Micro9-High")  	.atag_offset	= 0x100,  	.map_io		= ep93xx_map_io,  	.init_irq	= ep93xx_init_irq, -	.handle_irq	= vic_handle_irq,  	.init_time	= ep93xx_timer_init,  	.init_machine	= micro9_init_machine,  	.init_late	= ep93xx_init_late, @@ -96,7 +94,6 @@ MACHINE_START(MICRO9M, "Contec Micro9-Mid")  	.atag_offset	= 0x100,  	.map_io		= ep93xx_map_io,  	.init_irq	= ep93xx_init_irq, -	.handle_irq	= vic_handle_irq,  	.init_time	= ep93xx_timer_init,  	.init_machine	= micro9_init_machine,  	.init_late	= ep93xx_init_late, @@ -110,7 +107,6 @@ MACHINE_START(MICRO9L, "Contec Micro9-Lite")  	.atag_offset	= 0x100,  	.map_io		= ep93xx_map_io,  	.init_irq	= ep93xx_init_irq, -	.handle_irq	= vic_handle_irq,  	.init_time	= ep93xx_timer_init,  	.init_machine	= micro9_init_machine,  	.init_late	= ep93xx_init_late, @@ -124,7 +120,6 @@ MACHINE_START(MICRO9S, "Contec Micro9-Slim")  	.atag_offset	= 0x100,  	.map_io		= ep93xx_map_io,  	.init_irq	= ep93xx_init_irq, -	.handle_irq	= vic_handle_irq,  	.init_time	= ep93xx_timer_init,  	.init_machine	= micro9_init_machine,  	.init_late	= ep93xx_init_late, diff --git a/arch/arm/mach-ep93xx/simone.c b/arch/arm/mach-ep93xx/simone.c index 6ff39ee2ad5..36f22c1a31f 100644 --- a/arch/arm/mach-ep93xx/simone.c +++ b/arch/arm/mach-ep93xx/simone.c @@ -25,7 +25,6 @@  #include <linux/platform_data/video-ep93xx.h>  #include <mach/gpio-ep93xx.h> -#include <asm/hardware/vic.h>  #include <asm/mach-types.h>  #include <asm/mach/arch.h> @@ -83,7 +82,6 @@ MACHINE_START(SIM_ONE, "Simplemachines Sim.One Board")  	.atag_offset	= 0x100,  	.map_io		= ep93xx_map_io,  	.init_irq	= ep93xx_init_irq, -	.handle_irq	= vic_handle_irq,  	.init_time	= ep93xx_timer_init,  	.init_machine	= simone_init_machine,  	.init_late	= ep93xx_init_late, diff --git a/arch/arm/mach-ep93xx/snappercl15.c b/arch/arm/mach-ep93xx/snappercl15.c index 6434c07dbf9..aa86f86638d 100644 --- a/arch/arm/mach-ep93xx/snappercl15.c +++ b/arch/arm/mach-ep93xx/snappercl15.c @@ -31,7 +31,6 @@  #include <linux/platform_data/video-ep93xx.h>  #include <mach/gpio-ep93xx.h> -#include <asm/hardware/vic.h>  #include <asm/mach-types.h>  #include <asm/mach/arch.h> @@ -176,7 +175,6 @@ MACHINE_START(SNAPPER_CL15, "Bluewater Systems Snapper CL15")  	.atag_offset	= 0x100,  	.map_io		= ep93xx_map_io,  	.init_irq	= ep93xx_init_irq, -	.handle_irq	= vic_handle_irq,  	.init_time	= ep93xx_timer_init,  	.init_machine	= snappercl15_init_machine,  	.init_late	= ep93xx_init_late, diff --git a/arch/arm/mach-ep93xx/ts72xx.c b/arch/arm/mach-ep93xx/ts72xx.c index e4fa0d3760a..61f4b5dc4d7 100644 --- a/arch/arm/mach-ep93xx/ts72xx.c +++ b/arch/arm/mach-ep93xx/ts72xx.c @@ -22,7 +22,6 @@  #include <mach/hardware.h> -#include <asm/hardware/vic.h>  #include <asm/mach-types.h>  #include <asm/mach/map.h>  #include <asm/mach/arch.h> @@ -246,7 +245,6 @@ MACHINE_START(TS72XX, "Technologic Systems TS-72xx SBC")  	.atag_offset	= 0x100,  	.map_io		= ts72xx_map_io,  	.init_irq	= ep93xx_init_irq, -	.handle_irq	= vic_handle_irq,  	.init_time	= ep93xx_timer_init,  	.init_machine	= ts72xx_init_machine,  	.init_late	= ep93xx_init_late, diff --git a/arch/arm/mach-ep93xx/vision_ep9307.c b/arch/arm/mach-ep93xx/vision_ep9307.c index 8610ba29399..605956fd07a 100644 --- a/arch/arm/mach-ep93xx/vision_ep9307.c +++ b/arch/arm/mach-ep93xx/vision_ep9307.c @@ -34,7 +34,6 @@  #include <linux/platform_data/spi-ep93xx.h>  #include <mach/gpio-ep93xx.h> -#include <asm/hardware/vic.h>  #include <asm/mach-types.h>  #include <asm/mach/map.h>  #include <asm/mach/arch.h> @@ -364,7 +363,6 @@ MACHINE_START(VISION_EP9307, "Vision Engraving Systems EP9307")  	.atag_offset	= 0x100,  	.map_io		= vision_map_io,  	.init_irq	= ep93xx_init_irq, -	.handle_irq	= vic_handle_irq,  	.init_time	= ep93xx_timer_init,  	.init_machine	= vision_init_machine,  	.init_late	= ep93xx_init_late, diff --git a/arch/arm/mach-exynos/common.c b/arch/arm/mach-exynos/common.c index 1a89824a5f7..4ea80bc4ef9 100644 --- a/arch/arm/mach-exynos/common.c +++ b/arch/arm/mach-exynos/common.c @@ -22,12 +22,13 @@  #include <linux/of_irq.h>  #include <linux/export.h>  #include <linux/irqdomain.h> +#include <linux/irqchip.h>  #include <linux/of_address.h> +#include <linux/irqchip/arm-gic.h>  #include <asm/proc-fns.h>  #include <asm/exception.h>  #include <asm/hardware/cache-l2x0.h> -#include <asm/hardware/gic.h>  #include <asm/mach/map.h>  #include <asm/mach/irq.h>  #include <asm/cacheflush.h> @@ -644,8 +645,6 @@ static int __init combiner_of_init(struct device_node *np,  }  static const struct of_device_id exynos_dt_irq_match[] = { -	{ .compatible = "arm,cortex-a9-gic", .data = gic_of_init, }, -	{ .compatible = "arm,cortex-a15-gic", .data = gic_of_init, },  	{ .compatible = "samsung,exynos4210-combiner",  			.data = combiner_of_init, },  	{}, @@ -661,8 +660,10 @@ void __init exynos4_init_irq(void)  	if (!of_have_populated_dt())  		gic_init_bases(0, IRQ_PPI(0), S5P_VA_GIC_DIST, S5P_VA_GIC_CPU, gic_bank_offset, NULL);  #ifdef CONFIG_OF -	else +	else { +		irqchip_init();  		of_irq_init(exynos_dt_irq_match); +	}  #endif  	if (!of_have_populated_dt()) @@ -679,6 +680,7 @@ void __init exynos4_init_irq(void)  void __init exynos5_init_irq(void)  {  #ifdef CONFIG_OF +	irqchip_init();  	of_irq_init(exynos_dt_irq_match);  #endif  	/* diff --git a/arch/arm/mach-exynos/include/mach/regs-irq.h b/arch/arm/mach-exynos/include/mach/regs-irq.h index 9c7b4bfd546..f2b50506b9f 100644 --- a/arch/arm/mach-exynos/include/mach/regs-irq.h +++ b/arch/arm/mach-exynos/include/mach/regs-irq.h @@ -13,7 +13,7 @@  #ifndef __ASM_ARCH_REGS_IRQ_H  #define __ASM_ARCH_REGS_IRQ_H __FILE__ -#include <asm/hardware/gic.h> +#include <linux/irqchip/arm-gic.h>  #include <mach/map.h>  #endif /* __ASM_ARCH_REGS_IRQ_H */ diff --git a/arch/arm/mach-exynos/mach-armlex4210.c b/arch/arm/mach-exynos/mach-armlex4210.c index 2f18130d0d1..685f29173af 100644 --- a/arch/arm/mach-exynos/mach-armlex4210.c +++ b/arch/arm/mach-exynos/mach-armlex4210.c @@ -16,7 +16,6 @@  #include <linux/smsc911x.h>  #include <asm/mach/arch.h> -#include <asm/hardware/gic.h>  #include <asm/mach-types.h>  #include <plat/cpu.h> @@ -201,7 +200,6 @@ MACHINE_START(ARMLEX4210, "ARMLEX4210")  	.smp		= smp_ops(exynos_smp_ops),  	.init_irq	= exynos4_init_irq,  	.map_io		= armlex4210_map_io, -	.handle_irq	= gic_handle_irq,  	.init_machine	= armlex4210_machine_init,  	.init_late	= exynos_init_late,  	.init_time	= exynos4_timer_init, diff --git a/arch/arm/mach-exynos/mach-exynos4-dt.c b/arch/arm/mach-exynos/mach-exynos4-dt.c index 160030168b1..112d10e53d2 100644 --- a/arch/arm/mach-exynos/mach-exynos4-dt.c +++ b/arch/arm/mach-exynos/mach-exynos4-dt.c @@ -15,7 +15,6 @@  #include <linux/serial_core.h>  #include <asm/mach/arch.h> -#include <asm/hardware/gic.h>  #include <mach/map.h>  #include <plat/cpu.h> @@ -107,7 +106,6 @@ DT_MACHINE_START(EXYNOS4210_DT, "Samsung Exynos4 (Flattened Device Tree)")  	.smp		= smp_ops(exynos_smp_ops),  	.init_irq	= exynos4_init_irq,  	.map_io		= exynos4_dt_map_io, -	.handle_irq	= gic_handle_irq,  	.init_machine	= exynos4_dt_machine_init,  	.init_late	= exynos_init_late,  	.init_time	= exynos4_timer_init, diff --git a/arch/arm/mach-exynos/mach-exynos5-dt.c b/arch/arm/mach-exynos/mach-exynos5-dt.c index 4e074c67cc8..0deeecffa3a 100644 --- a/arch/arm/mach-exynos/mach-exynos5-dt.c +++ b/arch/arm/mach-exynos/mach-exynos5-dt.c @@ -16,7 +16,6 @@  #include <linux/io.h>  #include <asm/mach/arch.h> -#include <asm/hardware/gic.h>  #include <mach/map.h>  #include <mach/regs-pmu.h> @@ -179,7 +178,6 @@ DT_MACHINE_START(EXYNOS5_DT, "SAMSUNG EXYNOS5 (Flattened Device Tree)")  	.init_irq	= exynos5_init_irq,  	.smp		= smp_ops(exynos_smp_ops),  	.map_io		= exynos5_dt_map_io, -	.handle_irq	= gic_handle_irq,  	.init_machine	= exynos5_dt_machine_init,  	.init_late	= exynos_init_late,  	.init_time	= exynos4_timer_init, diff --git a/arch/arm/mach-exynos/mach-nuri.c b/arch/arm/mach-exynos/mach-nuri.c index dccd1d16b83..b8b3fbf0bae 100644 --- a/arch/arm/mach-exynos/mach-nuri.c +++ b/arch/arm/mach-exynos/mach-nuri.c @@ -39,7 +39,6 @@  #include <media/v4l2-mediabus.h>  #include <asm/mach/arch.h> -#include <asm/hardware/gic.h>  #include <asm/mach-types.h>  #include <plat/adc.h> @@ -1379,7 +1378,6 @@ MACHINE_START(NURI, "NURI")  	.smp		= smp_ops(exynos_smp_ops),  	.init_irq	= exynos4_init_irq,  	.map_io		= nuri_map_io, -	.handle_irq	= gic_handle_irq,  	.init_machine	= nuri_machine_init,  	.init_late	= exynos_init_late,  	.init_time	= exynos4_timer_init, diff --git a/arch/arm/mach-exynos/mach-origen.c b/arch/arm/mach-exynos/mach-origen.c index 4e115632456..579d2d171da 100644 --- a/arch/arm/mach-exynos/mach-origen.c +++ b/arch/arm/mach-exynos/mach-origen.c @@ -29,7 +29,6 @@  #include <linux/platform_data/usb-exynos.h>  #include <asm/mach/arch.h> -#include <asm/hardware/gic.h>  #include <asm/mach-types.h>  #include <video/platform_lcd.h> @@ -814,7 +813,6 @@ MACHINE_START(ORIGEN, "ORIGEN")  	.smp		= smp_ops(exynos_smp_ops),  	.init_irq	= exynos4_init_irq,  	.map_io		= origen_map_io, -	.handle_irq	= gic_handle_irq,  	.init_machine	= origen_machine_init,  	.init_late	= exynos_init_late,  	.init_time	= exynos4_timer_init, diff --git a/arch/arm/mach-exynos/mach-smdk4x12.c b/arch/arm/mach-exynos/mach-smdk4x12.c index e9c9c2995f0..fe6149624b8 100644 --- a/arch/arm/mach-exynos/mach-smdk4x12.c +++ b/arch/arm/mach-exynos/mach-smdk4x12.c @@ -25,7 +25,6 @@  #include <linux/platform_data/s3c-hsotg.h>  #include <asm/mach/arch.h> -#include <asm/hardware/gic.h>  #include <asm/mach-types.h>  #include <video/samsung_fimd.h> @@ -376,7 +375,6 @@ MACHINE_START(SMDK4212, "SMDK4212")  	.smp		= smp_ops(exynos_smp_ops),  	.init_irq	= exynos4_init_irq,  	.map_io		= smdk4x12_map_io, -	.handle_irq	= gic_handle_irq,  	.init_machine	= smdk4x12_machine_init,  	.init_time	= exynos4_timer_init,  	.restart	= exynos4_restart, @@ -390,7 +388,6 @@ MACHINE_START(SMDK4412, "SMDK4412")  	.smp		= smp_ops(exynos_smp_ops),  	.init_irq	= exynos4_init_irq,  	.map_io		= smdk4x12_map_io, -	.handle_irq	= gic_handle_irq,  	.init_machine	= smdk4x12_machine_init,  	.init_late	= exynos_init_late,  	.init_time	= exynos4_timer_init, diff --git a/arch/arm/mach-exynos/mach-smdkv310.c b/arch/arm/mach-exynos/mach-smdkv310.c index b228ab9bda0..d71672922b1 100644 --- a/arch/arm/mach-exynos/mach-smdkv310.c +++ b/arch/arm/mach-exynos/mach-smdkv310.c @@ -26,7 +26,6 @@  #include <linux/platform_data/usb-exynos.h>  #include <asm/mach/arch.h> -#include <asm/hardware/gic.h>  #include <asm/mach-types.h>  #include <video/platform_lcd.h> @@ -423,7 +422,6 @@ MACHINE_START(SMDKV310, "SMDKV310")  	.smp		= smp_ops(exynos_smp_ops),  	.init_irq	= exynos4_init_irq,  	.map_io		= smdkv310_map_io, -	.handle_irq	= gic_handle_irq,  	.init_machine	= smdkv310_machine_init,  	.init_time	= exynos4_timer_init,  	.reserve	= &smdkv310_reserve, @@ -436,7 +434,6 @@ MACHINE_START(SMDKC210, "SMDKC210")  	.smp		= smp_ops(exynos_smp_ops),  	.init_irq	= exynos4_init_irq,  	.map_io		= smdkv310_map_io, -	.handle_irq	= gic_handle_irq,  	.init_machine	= smdkv310_machine_init,  	.init_late	= exynos_init_late,  	.init_time	= exynos4_timer_init, diff --git a/arch/arm/mach-exynos/mach-universal_c210.c b/arch/arm/mach-exynos/mach-universal_c210.c index 866f29a9bee..c9d33a43103 100644 --- a/arch/arm/mach-exynos/mach-universal_c210.c +++ b/arch/arm/mach-exynos/mach-universal_c210.c @@ -29,7 +29,6 @@  #include <drm/exynos_drm.h>  #include <asm/mach/arch.h> -#include <asm/hardware/gic.h>  #include <asm/mach-types.h>  #include <video/samsung_fimd.h> @@ -1151,7 +1150,6 @@ MACHINE_START(UNIVERSAL_C210, "UNIVERSAL_C210")  	.smp		= smp_ops(exynos_smp_ops),  	.init_irq	= exynos4_init_irq,  	.map_io		= universal_map_io, -	.handle_irq	= gic_handle_irq,  	.init_machine	= universal_machine_init,  	.init_late	= exynos_init_late,  	.init_time	= s5p_timer_init, diff --git a/arch/arm/mach-exynos/mct.c b/arch/arm/mach-exynos/mct.c index 4a89b54fcad..c9d6650f9b5 100644 --- a/arch/arm/mach-exynos/mct.c +++ b/arch/arm/mach-exynos/mct.c @@ -22,7 +22,6 @@  #include <linux/of.h>  #include <asm/arch_timer.h> -#include <asm/hardware/gic.h>  #include <asm/localtimer.h>  #include <plat/cpu.h> @@ -255,13 +254,9 @@ static struct irqaction mct_comp_event_irq = {  static void exynos4_clockevent_init(void)  { -	clockevents_calc_mult_shift(&mct_comp_device, clk_rate, 5); -	mct_comp_device.max_delta_ns = -		clockevent_delta2ns(0xffffffff, &mct_comp_device); -	mct_comp_device.min_delta_ns = -		clockevent_delta2ns(0xf, &mct_comp_device);  	mct_comp_device.cpumask = cpumask_of(0); -	clockevents_register_device(&mct_comp_device); +	clockevents_config_and_register(&mct_comp_device, clk_rate, +					0xf, 0xffffffff);  	if (soc_is_exynos5250())  		setup_irq(EXYNOS5_IRQ_MCT_G0, &mct_comp_event_irq); @@ -404,14 +399,8 @@ static int __cpuinit exynos4_local_timer_setup(struct clock_event_device *evt)  	evt->set_mode = exynos4_tick_set_mode;  	evt->features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT;  	evt->rating = 450; - -	clockevents_calc_mult_shift(evt, clk_rate / (TICK_BASE_CNT + 1), 5); -	evt->max_delta_ns = -		clockevent_delta2ns(0x7fffffff, evt); -	evt->min_delta_ns = -		clockevent_delta2ns(0xf, evt); - -	clockevents_register_device(evt); +	clockevents_config_and_register(evt, clk_rate / (TICK_BASE_CNT + 1), +					0xf, 0x7fffffff);  	exynos4_mct_write(TICK_BASE_CNT, mevt->base + MCT_L_TCNTB_OFFSET); diff --git a/arch/arm/mach-exynos/platsmp.c b/arch/arm/mach-exynos/platsmp.c index c5c840e947b..60f7c5be057 100644 --- a/arch/arm/mach-exynos/platsmp.c +++ b/arch/arm/mach-exynos/platsmp.c @@ -20,9 +20,9 @@  #include <linux/jiffies.h>  #include <linux/smp.h>  #include <linux/io.h> +#include <linux/irqchip/arm-gic.h>  #include <asm/cacheflush.h> -#include <asm/hardware/gic.h>  #include <asm/smp_plat.h>  #include <asm/smp_scu.h> @@ -149,7 +149,7 @@ static int __cpuinit exynos_boot_secondary(unsigned int cpu, struct task_struct  		__raw_writel(virt_to_phys(exynos4_secondary_startup),  							cpu_boot_reg(phys_cpu)); -		gic_raise_softirq(cpumask_of(cpu), 0); +		arch_send_wakeup_ipi_mask(cpumask_of(cpu));  		if (pen_release == -1)  			break; @@ -190,8 +190,6 @@ static void __init exynos_smp_init_cpus(void)  	for (i = 0; i < ncores; i++)  		set_cpu_possible(i, true); - -	set_smp_cross_call(gic_raise_softirq);  }  static void __init exynos_smp_prepare_cpus(unsigned int max_cpus) diff --git a/arch/arm/mach-footbridge/dc21285-timer.c b/arch/arm/mach-footbridge/dc21285-timer.c index 9f14b1d9a0e..9ee78f7b499 100644 --- a/arch/arm/mach-footbridge/dc21285-timer.c +++ b/arch/arm/mach-footbridge/dc21285-timer.c @@ -101,10 +101,6 @@ void __init footbridge_timer_init(void)  	setup_irq(ce->irq, &footbridge_timer_irq); -	clockevents_calc_mult_shift(ce, mem_fclk_21285, 5); -	ce->max_delta_ns = clockevent_delta2ns(0xffffff, ce); -	ce->min_delta_ns = clockevent_delta2ns(0x000004, ce);  	ce->cpumask = cpumask_of(smp_processor_id()); - -	clockevents_register_device(ce); +	clockevents_config_and_register(ce, mem_fclk_21285, 0x4, 0xffffff);  } diff --git a/arch/arm/mach-highbank/highbank.c b/arch/arm/mach-highbank/highbank.c index 41e254cac1a..fd630bccbd3 100644 --- a/arch/arm/mach-highbank/highbank.c +++ b/arch/arm/mach-highbank/highbank.c @@ -18,6 +18,7 @@  #include <linux/dma-mapping.h>  #include <linux/io.h>  #include <linux/irq.h> +#include <linux/irqchip.h>  #include <linux/irqdomain.h>  #include <linux/of.h>  #include <linux/of_irq.h> @@ -32,7 +33,6 @@  #include <asm/smp_twd.h>  #include <asm/hardware/arm_timer.h>  #include <asm/hardware/timer-sp.h> -#include <asm/hardware/gic.h>  #include <asm/hardware/cache-l2x0.h>  #include <asm/mach/arch.h>  #include <asm/mach/map.h> @@ -66,12 +66,6 @@ void highbank_set_cpu_jump(int cpu, void *jump_addr)  			  HB_JUMP_TABLE_PHYS(cpu) + 15);  } -const static struct of_device_id irq_match[] = { -	{ .compatible = "arm,cortex-a15-gic", .data = gic_of_init, }, -	{ .compatible = "arm,cortex-a9-gic", .data = gic_of_init, }, -	{} -}; -  #ifdef CONFIG_CACHE_L2X0  static void highbank_l2x0_disable(void)  { @@ -82,7 +76,7 @@ static void highbank_l2x0_disable(void)  static void __init highbank_init_irq(void)  { -	of_irq_init(irq_match); +	irqchip_init();  	if (of_find_compatible_node(NULL, NULL, "arm,cortex-a9"))  		highbank_scu_map_io(); @@ -206,7 +200,6 @@ DT_MACHINE_START(HIGHBANK, "Highbank")  	.map_io		= debug_ll_io_init,  	.init_irq	= highbank_init_irq,  	.init_time	= highbank_timer_init, -	.handle_irq	= gic_handle_irq,  	.init_machine	= highbank_init,  	.dt_compat	= highbank_match,  	.restart	= highbank_restart, diff --git a/arch/arm/mach-highbank/platsmp.c b/arch/arm/mach-highbank/platsmp.c index 4ecc864ac8b..8797a700172 100644 --- a/arch/arm/mach-highbank/platsmp.c +++ b/arch/arm/mach-highbank/platsmp.c @@ -17,9 +17,9 @@  #include <linux/init.h>  #include <linux/smp.h>  #include <linux/io.h> +#include <linux/irqchip/arm-gic.h>  #include <asm/smp_scu.h> -#include <asm/hardware/gic.h>  #include "core.h" @@ -33,7 +33,7 @@ static void __cpuinit highbank_secondary_init(unsigned int cpu)  static int __cpuinit highbank_boot_secondary(unsigned int cpu, struct task_struct *idle)  {  	highbank_set_cpu_jump(cpu, secondary_startup); -	gic_raise_softirq(cpumask_of(cpu), 0); +	arch_send_wakeup_ipi_mask(cpumask_of(cpu));  	return 0;  } @@ -56,8 +56,6 @@ static void __init highbank_smp_init_cpus(void)  	for (i = 0; i < ncores; i++)  		set_cpu_possible(i, true); - -	set_smp_cross_call(gic_raise_softirq);  }  static void __init highbank_smp_prepare_cpus(unsigned int max_cpus) diff --git a/arch/arm/mach-imx/Kconfig b/arch/arm/mach-imx/Kconfig index 3e628fd7a67..7b11d3329e8 100644 --- a/arch/arm/mach-imx/Kconfig +++ b/arch/arm/mach-imx/Kconfig @@ -95,9 +95,6 @@ config MACH_MX27  config ARCH_MX5  	bool -config ARCH_MX50 -	bool -  config ARCH_MX51  	bool @@ -164,11 +161,6 @@ config SOC_IMX5  	select CPU_V7  	select MXC_TZIC -config SOC_IMX50 -	bool -	select ARCH_MX50 -	select SOC_IMX5 -  config	SOC_IMX51  	bool  	select ARCH_MX5 @@ -738,25 +730,10 @@ endif  if ARCH_MULTI_V7 -comment "i.MX5 platforms:" - -config MACH_MX50_RDP -	bool "Support MX50 reference design platform" -	depends on BROKEN -	select IMX_HAVE_PLATFORM_IMX_I2C -	select IMX_HAVE_PLATFORM_IMX_UART -	select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX -	select IMX_HAVE_PLATFORM_SPI_IMX -	select SOC_IMX50 -	help -	  Include support for MX50 reference design platform (RDP) board. This -	  includes specific configurations for the board and its peripherals. -  comment "i.MX51 machines:"  config MACH_IMX51_DT  	bool "Support i.MX51 platforms from device tree" -	select MACH_MX51_BABBAGE  	select SOC_IMX51  	help  	  Include support for Freescale i.MX51 based platforms @@ -777,19 +754,6 @@ config MACH_MX51_BABBAGE  	  u-boot. This includes specific configurations for the board and its  	  peripherals. -config MACH_MX51_3DS -	bool "Support MX51PDK (3DS)" -	select IMX_HAVE_PLATFORM_IMX2_WDT -	select IMX_HAVE_PLATFORM_IMX_KEYPAD -	select IMX_HAVE_PLATFORM_IMX_UART -	select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX -	select IMX_HAVE_PLATFORM_SPI_IMX -	select MXC_DEBUG_BOARD -	select SOC_IMX51 -	help -	  Include support for MX51PDK (3DS) platform. This includes specific -	  configurations for the board and its peripherals. -  config MACH_EUKREA_CPUIMX51SD  	bool "Support Eukrea CPUIMX51SD module"  	select IMX_HAVE_PLATFORM_FSL_USB2_UDC @@ -851,6 +815,7 @@ config SOC_IMX6Q  	select HAVE_CAN_FLEXCAN if CAN  	select HAVE_IMX_GPC  	select HAVE_IMX_MMDC +	select HAVE_IMX_SRC  	select HAVE_SMP  	select MFD_SYSCON  	select PINCTRL diff --git a/arch/arm/mach-imx/Makefile b/arch/arm/mach-imx/Makefile index 0634b3152c2..c4ce0906d76 100644 --- a/arch/arm/mach-imx/Makefile +++ b/arch/arm/mach-imx/Makefile @@ -28,7 +28,11 @@ obj-$(CONFIG_MXC_ULPI) += ulpi.o  obj-$(CONFIG_MXC_USE_EPIT) += epit.o  obj-$(CONFIG_MXC_DEBUG_BOARD) += 3ds_debugboard.o  obj-$(CONFIG_CPU_FREQ_IMX)    += cpufreq.o -obj-$(CONFIG_CPU_IDLE) += cpuidle.o + +ifeq ($(CONFIG_CPU_IDLE),y) +obj-y += cpuidle.o +obj-$(CONFIG_SOC_IMX6Q) += cpuidle-imx6q.o +endif  ifdef CONFIG_SND_IMX_SOC  obj-y += ssi-fiq.o @@ -88,7 +92,6 @@ obj-$(CONFIG_MACH_EUKREA_CPUIMX35SD) += mach-cpuimx35.o  obj-$(CONFIG_MACH_EUKREA_MBIMXSD35_BASEBOARD) += eukrea_mbimxsd35-baseboard.o  obj-$(CONFIG_MACH_VPR200) += mach-vpr200.o -obj-$(CONFIG_DEBUG_LL) += lluart.o  obj-$(CONFIG_HAVE_IMX_GPC) += gpc.o  obj-$(CONFIG_HAVE_IMX_MMDC) += mmdc.o  obj-$(CONFIG_HAVE_IMX_SRC) += src.o @@ -103,10 +106,8 @@ endif  # i.MX5 based machines  obj-$(CONFIG_MACH_MX51_BABBAGE) += mach-mx51_babbage.o -obj-$(CONFIG_MACH_MX51_3DS) += mach-mx51_3ds.o  obj-$(CONFIG_MACH_EUKREA_CPUIMX51SD) += mach-cpuimx51sd.o  obj-$(CONFIG_MACH_EUKREA_MBIMXSD51_BASEBOARD) += eukrea_mbimxsd51-baseboard.o -obj-$(CONFIG_MACH_MX50_RDP) += mach-mx50_rdp.o  obj-$(CONFIG_MACH_IMX51_DT) += imx51-dt.o  obj-$(CONFIG_SOC_IMX53) += mach-imx53.o diff --git a/arch/arm/mach-imx/Makefile.boot b/arch/arm/mach-imx/Makefile.boot index b27815de847..41ba1bb0437 100644 --- a/arch/arm/mach-imx/Makefile.boot +++ b/arch/arm/mach-imx/Makefile.boot @@ -22,10 +22,6 @@ zreladdr-$(CONFIG_SOC_IMX35)	+= 0x80008000  params_phys-$(CONFIG_SOC_IMX35)	:= 0x80000100  initrd_phys-$(CONFIG_SOC_IMX35)	:= 0x80800000 -zreladdr-$(CONFIG_SOC_IMX50)	+= 0x70008000 -params_phys-$(CONFIG_SOC_IMX50)	:= 0x70000100 -initrd_phys-$(CONFIG_SOC_IMX50)	:= 0x70800000 -  zreladdr-$(CONFIG_SOC_IMX51)	+= 0x90008000  params_phys-$(CONFIG_SOC_IMX51)	:= 0x90000100  initrd_phys-$(CONFIG_SOC_IMX51)	:= 0x90800000 diff --git a/arch/arm/mach-imx/clk-imx25.c b/arch/arm/mach-imx/clk-imx25.c index b197aa73dc4..2c570cdaae7 100644 --- a/arch/arm/mach-imx/clk-imx25.c +++ b/arch/arm/mach-imx/clk-imx25.c @@ -254,9 +254,9 @@ int __init mx25_clocks_init(void)  	clk_register_clkdev(clk[ipg], "ipg", "mxc-ehci.2");  	clk_register_clkdev(clk[usbotg_ahb], "ahb", "mxc-ehci.2");  	clk_register_clkdev(clk[usb_div], "per", "mxc-ehci.2"); -	clk_register_clkdev(clk[ipg], "ipg", "fsl-usb2-udc"); -	clk_register_clkdev(clk[usbotg_ahb], "ahb", "fsl-usb2-udc"); -	clk_register_clkdev(clk[usb_div], "per", "fsl-usb2-udc"); +	clk_register_clkdev(clk[ipg], "ipg", "imx-udc-mx27"); +	clk_register_clkdev(clk[usbotg_ahb], "ahb", "imx-udc-mx27"); +	clk_register_clkdev(clk[usb_div], "per", "imx-udc-mx27");  	clk_register_clkdev(clk[nfc_ipg_per], NULL, "imx25-nand.0");  	/* i.mx25 has the i.mx35 type cspi */  	clk_register_clkdev(clk[cspi1_ipg], NULL, "imx35-cspi.0"); diff --git a/arch/arm/mach-imx/clk-imx27.c b/arch/arm/mach-imx/clk-imx27.c index 4c1d1e4efc7..d24b0d68e83 100644 --- a/arch/arm/mach-imx/clk-imx27.c +++ b/arch/arm/mach-imx/clk-imx27.c @@ -62,7 +62,7 @@ static const char *clko_sel_clks[] = {  	"32k", "usb_div", "dptc",  }; -static const char *ssi_sel_clks[] = { "spll", "mpll", }; +static const char *ssi_sel_clks[] = { "spll_gate", "mpll", };  enum mx27_clks {  	dummy, ckih, ckil, mpll, spll, mpll_main2, ahb, ipg, nfc_div, per1_div, @@ -82,7 +82,7 @@ enum mx27_clks {  	csi_ahb_gate, brom_ahb_gate, ata_ahb_gate, wdog_ipg_gate, usb_ipg_gate,  	uart6_ipg_gate, uart5_ipg_gate, uart4_ipg_gate, uart3_ipg_gate,  	uart2_ipg_gate, uart1_ipg_gate, ckih_div1p5, fpm, mpll_osc_sel, -	mpll_sel, clk_max +	mpll_sel, spll_gate, clk_max  };  static struct clk *clk[clk_max]; @@ -104,6 +104,7 @@ int __init mx27_clocks_init(unsigned long fref)  			ARRAY_SIZE(mpll_sel_clks));  	clk[mpll] = imx_clk_pllv1("mpll", "mpll_sel", CCM_MPCTL0);  	clk[spll] = imx_clk_pllv1("spll", "ckih", CCM_SPCTL0); +	clk[spll_gate] = imx_clk_gate("spll_gate", "spll", CCM_CSCR, 1);  	clk[mpll_main2] = imx_clk_fixed_factor("mpll_main2", "mpll", 2, 3);  	if (mx27_revision() >= IMX_CHIP_REVISION_2_0) { @@ -121,7 +122,7 @@ int __init mx27_clocks_init(unsigned long fref)  	clk[per4_div] = imx_clk_divider("per4_div", "mpll_main2", CCM_PCDR1, 24, 6);  	clk[vpu_sel] = imx_clk_mux("vpu_sel", CCM_CSCR, 21, 1, vpu_sel_clks, ARRAY_SIZE(vpu_sel_clks));  	clk[vpu_div] = imx_clk_divider("vpu_div", "vpu_sel", CCM_PCDR0, 10, 6); -	clk[usb_div] = imx_clk_divider("usb_div", "spll", CCM_CSCR, 28, 3); +	clk[usb_div] = imx_clk_divider("usb_div", "spll_gate", CCM_CSCR, 28, 3);  	clk[cpu_sel] = imx_clk_mux("cpu_sel", CCM_CSCR, 15, 1, cpu_sel_clks, ARRAY_SIZE(cpu_sel_clks));  	clk[clko_sel] = imx_clk_mux("clko_sel", CCM_CCSR, 0, 5, clko_sel_clks, ARRAY_SIZE(clko_sel_clks));  	if (mx27_revision() >= IMX_CHIP_REVISION_2_0) @@ -236,9 +237,9 @@ int __init mx27_clocks_init(unsigned long fref)  	clk_register_clkdev(clk[lcdc_ahb_gate], "ahb", "imx21-fb.0");  	clk_register_clkdev(clk[csi_ahb_gate], "ahb", "imx27-camera.0");  	clk_register_clkdev(clk[per4_gate], "per", "imx27-camera.0"); -	clk_register_clkdev(clk[usb_div], "per", "fsl-usb2-udc"); -	clk_register_clkdev(clk[usb_ipg_gate], "ipg", "fsl-usb2-udc"); -	clk_register_clkdev(clk[usb_ahb_gate], "ahb", "fsl-usb2-udc"); +	clk_register_clkdev(clk[usb_div], "per", "imx-udc-mx27"); +	clk_register_clkdev(clk[usb_ipg_gate], "ipg", "imx-udc-mx27"); +	clk_register_clkdev(clk[usb_ahb_gate], "ahb", "imx-udc-mx27");  	clk_register_clkdev(clk[usb_div], "per", "mxc-ehci.0");  	clk_register_clkdev(clk[usb_ipg_gate], "ipg", "mxc-ehci.0");  	clk_register_clkdev(clk[usb_ahb_gate], "ahb", "mxc-ehci.0"); diff --git a/arch/arm/mach-imx/clk-imx31.c b/arch/arm/mach-imx/clk-imx31.c index 8be64e0a4ac..b5b65f3efaf 100644 --- a/arch/arm/mach-imx/clk-imx31.c +++ b/arch/arm/mach-imx/clk-imx31.c @@ -34,8 +34,8 @@ static const char *csi_sel[] = { "upll", "spll", };  static const char *fir_sel[] = { "mcu_main", "upll", "spll" };  enum mx31_clks { -	ckih, ckil, mpll, spll, upll, mcu_main, hsp, ahb, nfc, ipg, per_div, -	per, csi, fir, csi_div, usb_div_pre, usb_div_post, fir_div_pre, +	dummy, ckih, ckil, mpll, spll, upll, mcu_main, hsp, ahb, nfc, ipg, +	per_div, per, csi, fir, csi_div, usb_div_pre, usb_div_post, fir_div_pre,  	fir_div_post, sdhc1_gate, sdhc2_gate, gpt_gate, epit1_gate, epit2_gate,  	iim_gate, ata_gate, sdma_gate, cspi3_gate, rng_gate, uart1_gate,  	uart2_gate, ssi1_gate, i2c1_gate, i2c2_gate, i2c3_gate, hantro_gate, @@ -46,12 +46,15 @@ enum mx31_clks {  };  static struct clk *clk[clk_max]; +static struct clk_onecell_data clk_data;  int __init mx31_clocks_init(unsigned long fref)  {  	void __iomem *base = MX31_IO_ADDRESS(MX31_CCM_BASE_ADDR);  	int i; +	struct device_node *np; +	clk[dummy] = imx_clk_fixed("dummy", 0);  	clk[ckih] = imx_clk_fixed("ckih", fref);  	clk[ckil] = imx_clk_fixed("ckil", 32768);  	clk[mpll] = imx_clk_pllv1("mpll", "ckih", base + MXC_CCM_MPCTL); @@ -116,6 +119,14 @@ int __init mx31_clocks_init(unsigned long fref)  			pr_err("imx31 clk %d: register failed with %ld\n",  				i, PTR_ERR(clk[i])); +	np = of_find_compatible_node(NULL, NULL, "fsl,imx31-ccm"); + +	if (np) { +		clk_data.clks = clk; +		clk_data.clk_num = ARRAY_SIZE(clk); +		of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data); +	} +  	clk_register_clkdev(clk[gpt_gate], "per", "imx-gpt.0");  	clk_register_clkdev(clk[ipg], "ipg", "imx-gpt.0");  	clk_register_clkdev(clk[cspi1_gate], NULL, "imx31-cspi.0"); @@ -139,9 +150,9 @@ int __init mx31_clocks_init(unsigned long fref)  	clk_register_clkdev(clk[usb_div_post], "per", "mxc-ehci.2");  	clk_register_clkdev(clk[usb_gate], "ahb", "mxc-ehci.2");  	clk_register_clkdev(clk[ipg], "ipg", "mxc-ehci.2"); -	clk_register_clkdev(clk[usb_div_post], "per", "fsl-usb2-udc"); -	clk_register_clkdev(clk[usb_gate], "ahb", "fsl-usb2-udc"); -	clk_register_clkdev(clk[ipg], "ipg", "fsl-usb2-udc"); +	clk_register_clkdev(clk[usb_div_post], "per", "imx-udc-mx27"); +	clk_register_clkdev(clk[usb_gate], "ahb", "imx-udc-mx27"); +	clk_register_clkdev(clk[ipg], "ipg", "imx-udc-mx27");  	clk_register_clkdev(clk[csi_gate], NULL, "mx3-camera.0");  	/* i.mx31 has the i.mx21 type uart */  	clk_register_clkdev(clk[uart1_gate], "per", "imx21-uart.0"); diff --git a/arch/arm/mach-imx/clk-imx35.c b/arch/arm/mach-imx/clk-imx35.c index 66f3d65ea27..74e3a34d78b 100644 --- a/arch/arm/mach-imx/clk-imx35.c +++ b/arch/arm/mach-imx/clk-imx35.c @@ -67,13 +67,13 @@ enum mx35_clks {  static struct clk *clk[clk_max]; -int __init mx35_clocks_init() +int __init mx35_clocks_init(void)  {  	void __iomem *base = MX35_IO_ADDRESS(MX35_CCM_BASE_ADDR);  	u32 pdr0, consumer_sel, hsp_sel;  	struct arm_ahb_div *aad;  	unsigned char *hsp_div; -	int i; +	u32 i;  	pdr0 = __raw_readl(base + MXC_CCM_PDR0);  	consumer_sel = (pdr0 >> 16) & 0xf; @@ -251,9 +251,9 @@ int __init mx35_clocks_init()  	clk_register_clkdev(clk[usb_div], "per", "mxc-ehci.2");  	clk_register_clkdev(clk[ipg], "ipg", "mxc-ehci.2");  	clk_register_clkdev(clk[usbotg_gate], "ahb", "mxc-ehci.2"); -	clk_register_clkdev(clk[usb_div], "per", "fsl-usb2-udc"); -	clk_register_clkdev(clk[ipg], "ipg", "fsl-usb2-udc"); -	clk_register_clkdev(clk[usbotg_gate], "ahb", "fsl-usb2-udc"); +	clk_register_clkdev(clk[usb_div], "per", "imx-udc-mx27"); +	clk_register_clkdev(clk[ipg], "ipg", "imx-udc-mx27"); +	clk_register_clkdev(clk[usbotg_gate], "ahb", "imx-udc-mx27");  	clk_register_clkdev(clk[wdog_gate], NULL, "imx2-wdt.0");  	clk_register_clkdev(clk[nfc_div], NULL, "imx25-nand.0");  	clk_register_clkdev(clk[csi_gate], NULL, "mx3-camera.0"); diff --git a/arch/arm/mach-imx/clk-imx51-imx53.c b/arch/arm/mach-imx/clk-imx51-imx53.c index 579023f59dc..fb7cb841b64 100644 --- a/arch/arm/mach-imx/clk-imx51-imx53.c +++ b/arch/arm/mach-imx/clk-imx51-imx53.c @@ -269,9 +269,9 @@ static void __init mx5_clocks_common_init(unsigned long rate_ckil,  	clk_register_clkdev(clk[usboh3_per_gate], "per", "mxc-ehci.2");  	clk_register_clkdev(clk[usboh3_gate], "ipg", "mxc-ehci.2");  	clk_register_clkdev(clk[usboh3_gate], "ahb", "mxc-ehci.2"); -	clk_register_clkdev(clk[usboh3_per_gate], "per", "fsl-usb2-udc"); -	clk_register_clkdev(clk[usboh3_gate], "ipg", "fsl-usb2-udc"); -	clk_register_clkdev(clk[usboh3_gate], "ahb", "fsl-usb2-udc"); +	clk_register_clkdev(clk[usboh3_per_gate], "per", "imx-udc-mx51"); +	clk_register_clkdev(clk[usboh3_gate], "ipg", "imx-udc-mx51"); +	clk_register_clkdev(clk[usboh3_gate], "ahb", "imx-udc-mx51");  	clk_register_clkdev(clk[nfc_gate], NULL, "imx51-nand");  	clk_register_clkdev(clk[ssi1_ipg_gate], NULL, "imx-ssi.0");  	clk_register_clkdev(clk[ssi2_ipg_gate], NULL, "imx-ssi.1"); diff --git a/arch/arm/mach-imx/clk-imx6q.c b/arch/arm/mach-imx/clk-imx6q.c index 7f2c10c7413..540138c4606 100644 --- a/arch/arm/mach-imx/clk-imx6q.c +++ b/arch/arm/mach-imx/clk-imx6q.c @@ -54,9 +54,18 @@  #define BM_CLPCR_MASK_SCU_IDLE		(0x1 << 26)  #define BM_CLPCR_MASK_L2CC_IDLE		(0x1 << 27) +#define CGPR				0x64 +#define BM_CGPR_CHICKEN_BIT		(0x1 << 17) +  static void __iomem *ccm_base; -void __init imx6q_clock_map_io(void) { } +void imx6q_set_chicken_bit(void) +{ +	u32 val = readl_relaxed(ccm_base + CGPR); + +	val |= BM_CGPR_CHICKEN_BIT; +	writel_relaxed(val, ccm_base + CGPR); +}  int imx6q_set_lpm(enum mxc_cpu_pwr_mode mode)  { @@ -68,6 +77,7 @@ int imx6q_set_lpm(enum mxc_cpu_pwr_mode mode)  		break;  	case WAIT_UNCLOCKED:  		val |= 0x1 << BP_CLPCR_LPM; +		val |= BM_CLPCR_ARM_CLK_DIS_ON_LPM;  		break;  	case STOP_POWER_ON:  		val |= 0x2 << BP_CLPCR_LPM; @@ -436,6 +446,9 @@ int __init mx6q_clocks_init(void)  	for (i = 0; i < ARRAY_SIZE(clks_init_on); i++)  		clk_prepare_enable(clk[clks_init_on[i]]); +	/* Set initial power mode */ +	imx6q_set_lpm(WAIT_CLOCKED); +  	np = of_find_compatible_node(NULL, NULL, "fsl,imx6q-gpt");  	base = of_iomap(np, 0);  	WARN_ON(!base); diff --git a/arch/arm/mach-imx/common.h b/arch/arm/mach-imx/common.h index 7191ab4434e..5a800bfcec5 100644 --- a/arch/arm/mach-imx/common.h +++ b/arch/arm/mach-imx/common.h @@ -21,7 +21,6 @@ extern void mx25_map_io(void);  extern void mx27_map_io(void);  extern void mx31_map_io(void);  extern void mx35_map_io(void); -extern void mx50_map_io(void);  extern void mx51_map_io(void);  extern void mx53_map_io(void);  extern void imx1_init_early(void); @@ -30,7 +29,6 @@ extern void imx25_init_early(void);  extern void imx27_init_early(void);  extern void imx31_init_early(void);  extern void imx35_init_early(void); -extern void imx50_init_early(void);  extern void imx51_init_early(void);  extern void imx53_init_early(void);  extern void mxc_init_irq(void __iomem *); @@ -41,7 +39,6 @@ extern void mx25_init_irq(void);  extern void mx27_init_irq(void);  extern void mx31_init_irq(void);  extern void mx35_init_irq(void); -extern void mx50_init_irq(void);  extern void mx51_init_irq(void);  extern void mx53_init_irq(void);  extern void imx1_soc_init(void); @@ -50,7 +47,6 @@ extern void imx25_soc_init(void);  extern void imx27_soc_init(void);  extern void imx31_soc_init(void);  extern void imx35_soc_init(void); -extern void imx50_soc_init(void);  extern void imx51_soc_init(void);  extern void imx51_init_late(void);  extern void imx53_init_late(void); @@ -109,27 +105,22 @@ void tzic_handle_irq(struct pt_regs *);  #define imx27_handle_irq avic_handle_irq  #define imx31_handle_irq avic_handle_irq  #define imx35_handle_irq avic_handle_irq -#define imx50_handle_irq tzic_handle_irq  #define imx51_handle_irq tzic_handle_irq  #define imx53_handle_irq tzic_handle_irq -#define imx6q_handle_irq gic_handle_irq  extern void imx_enable_cpu(int cpu, bool enable);  extern void imx_set_cpu_jump(int cpu, void *jump_addr); -#ifdef CONFIG_DEBUG_LL -extern void imx_lluart_map_io(void); -#else -static inline void imx_lluart_map_io(void) {} -#endif  extern void v7_cpu_resume(void);  extern u32 *pl310_get_save_ptr(void);  #ifdef CONFIG_SMP  extern void v7_secondary_startup(void);  extern void imx_scu_map_io(void);  extern void imx_smp_prepare(void); +extern void imx_scu_standby_enable(void);  #else  static inline void imx_scu_map_io(void) {}  static inline void imx_smp_prepare(void) {} +static inline void imx_scu_standby_enable(void) {}  #endif  extern void imx_enable_cpu(int cpu, bool enable);  extern void imx_set_cpu_jump(int cpu, void *jump_addr); @@ -139,9 +130,10 @@ extern void imx_gpc_init(void);  extern void imx_gpc_pre_suspend(void);  extern void imx_gpc_post_resume(void);  extern int imx6q_set_lpm(enum mxc_cpu_pwr_mode mode); -extern void imx6q_clock_map_io(void); +extern void imx6q_set_chicken_bit(void);  extern void imx_cpu_die(unsigned int cpu); +extern int imx_cpu_kill(unsigned int cpu);  #ifdef CONFIG_PM  extern void imx6q_pm_init(void); diff --git a/arch/arm/mach-imx/cpu-imx5.c b/arch/arm/mach-imx/cpu-imx5.c index d88760014ff..d7ce72252a4 100644 --- a/arch/arm/mach-imx/cpu-imx5.c +++ b/arch/arm/mach-imx/cpu-imx5.c @@ -22,7 +22,6 @@  static int mx5_cpu_rev = -1;  #define IIM_SREV 0x24 -#define MX50_HW_ADADIG_DIGPROG	0xB0  static int get_mx51_srev(void)  { @@ -108,41 +107,3 @@ int mx53_revision(void)  	return mx5_cpu_rev;  }  EXPORT_SYMBOL(mx53_revision); - -static int get_mx50_srev(void) -{ -	void __iomem *anatop = ioremap(MX50_ANATOP_BASE_ADDR, SZ_8K); -	u32 rev; - -	if (!anatop) { -		mx5_cpu_rev = -EINVAL; -		return 0; -	} - -	rev = readl(anatop + MX50_HW_ADADIG_DIGPROG); -	rev &= 0xff; - -	iounmap(anatop); -	if (rev == 0x0) -		return IMX_CHIP_REVISION_1_0; -	else if (rev == 0x1) -		return IMX_CHIP_REVISION_1_1; -	return 0; -} - -/* - * Returns: - *	the silicon revision of the cpu - *	-EINVAL - not a mx50 - */ -int mx50_revision(void) -{ -	if (!cpu_is_mx50()) -		return -EINVAL; - -	if (mx5_cpu_rev == -1) -		mx5_cpu_rev = get_mx50_srev(); - -	return mx5_cpu_rev; -} -EXPORT_SYMBOL(mx50_revision); diff --git a/arch/arm/mach-imx/cpuidle-imx6q.c b/arch/arm/mach-imx/cpuidle-imx6q.c new file mode 100644 index 00000000000..d533e2695f0 --- /dev/null +++ b/arch/arm/mach-imx/cpuidle-imx6q.c @@ -0,0 +1,95 @@ +/* + * Copyright (C) 2012 Freescale Semiconductor, Inc. + * + * 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/clockchips.h> +#include <linux/cpuidle.h> +#include <linux/module.h> +#include <asm/cpuidle.h> +#include <asm/proc-fns.h> + +#include "common.h" +#include "cpuidle.h" + +static atomic_t master = ATOMIC_INIT(0); +static DEFINE_SPINLOCK(master_lock); + +static int imx6q_enter_wait(struct cpuidle_device *dev, +			    struct cpuidle_driver *drv, int index) +{ +	int cpu = dev->cpu; + +	clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_ENTER, &cpu); + +	if (atomic_inc_return(&master) == num_online_cpus()) { +		/* +		 * With this lock, we prevent other cpu to exit and enter +		 * this function again and become the master. +		 */ +		if (!spin_trylock(&master_lock)) +			goto idle; +		imx6q_set_lpm(WAIT_UNCLOCKED); +		cpu_do_idle(); +		imx6q_set_lpm(WAIT_CLOCKED); +		spin_unlock(&master_lock); +		goto done; +	} + +idle: +	cpu_do_idle(); +done: +	atomic_dec(&master); +	clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_EXIT, &cpu); + +	return index; +} + +/* + * For each cpu, setup the broadcast timer because local timer + * stops for the states other than WFI. + */ +static void imx6q_setup_broadcast_timer(void *arg) +{ +	int cpu = smp_processor_id(); + +	clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_ON, &cpu); +} + +static struct cpuidle_driver imx6q_cpuidle_driver = { +	.name = "imx6q_cpuidle", +	.owner = THIS_MODULE, +	.en_core_tk_irqen = 1, +	.states = { +		/* WFI */ +		ARM_CPUIDLE_WFI_STATE, +		/* WAIT */ +		{ +			.exit_latency = 50, +			.target_residency = 75, +			.flags = CPUIDLE_FLAG_TIME_VALID, +			.enter = imx6q_enter_wait, +			.name = "WAIT", +			.desc = "Clock off", +		}, +	}, +	.state_count = 2, +	.safe_state_index = 0, +}; + +int __init imx6q_cpuidle_init(void) +{ +	/* Need to enable SCU standby for entering WAIT modes */ +	imx_scu_standby_enable(); + +	/* Set chicken bit to get a reliable WAIT mode support */ +	imx6q_set_chicken_bit(); + +	/* Configure the broadcast timer on each cpu */ +	on_each_cpu(imx6q_setup_broadcast_timer, NULL, 1); + +	return imx_cpuidle_init(&imx6q_cpuidle_driver); +} diff --git a/arch/arm/mach-imx/cpuidle.h b/arch/arm/mach-imx/cpuidle.h index bc932d1af37..e092d1359d9 100644 --- a/arch/arm/mach-imx/cpuidle.h +++ b/arch/arm/mach-imx/cpuidle.h @@ -14,9 +14,14 @@  #ifdef CONFIG_CPU_IDLE  extern int imx_cpuidle_init(struct cpuidle_driver *drv); +extern int imx6q_cpuidle_init(void);  #else  static inline int imx_cpuidle_init(struct cpuidle_driver *drv)  {  	return -ENODEV;  } +static inline int imx6q_cpuidle_init(void) +{ +	return -ENODEV; +}  #endif diff --git a/arch/arm/mach-imx/devices-imx50.h b/arch/arm/mach-imx/devices-imx50.h deleted file mode 100644 index 2c290391f29..00000000000 --- a/arch/arm/mach-imx/devices-imx50.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (C) 2010 Freescale Semiconductor, Inc. All Rights Reserved. - */ - -/* - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include "devices/devices-common.h" - -extern const struct imx_imx_uart_1irq_data imx50_imx_uart_data[]; -#define imx50_add_imx_uart(id, pdata)	\ -	imx_add_imx_uart_1irq(&imx50_imx_uart_data[id], pdata) - -extern const struct imx_fec_data imx50_fec_data; -#define imx50_add_fec(pdata)	\ -	imx_add_fec(&imx50_fec_data, pdata) - -extern const struct imx_imx_i2c_data imx50_imx_i2c_data[]; -#define imx50_add_imx_i2c(id, pdata)	\ -	imx_add_imx_i2c(&imx50_imx_i2c_data[id], pdata) diff --git a/arch/arm/mach-imx/devices/Kconfig b/arch/arm/mach-imx/devices/Kconfig index 9a8f1ca7bcb..9b9ba1f4ffe 100644 --- a/arch/arm/mach-imx/devices/Kconfig +++ b/arch/arm/mach-imx/devices/Kconfig @@ -1,6 +1,6 @@  config IMX_HAVE_PLATFORM_FEC  	bool -	default y if ARCH_MX25 || SOC_IMX27 || SOC_IMX35 || SOC_IMX50 || SOC_IMX51 || SOC_IMX53 +	default y if ARCH_MX25 || SOC_IMX27 || SOC_IMX35 || SOC_IMX51 || SOC_IMX53  config IMX_HAVE_PLATFORM_FLEXCAN  	bool diff --git a/arch/arm/mach-imx/devices/devices-common.h b/arch/arm/mach-imx/devices/devices-common.h index 6277baf1b7b..9bd5777ff0e 100644 --- a/arch/arm/mach-imx/devices/devices-common.h +++ b/arch/arm/mach-imx/devices/devices-common.h @@ -63,6 +63,7 @@ struct platform_device *__init imx_add_flexcan(  #include <linux/fsl_devices.h>  struct imx_fsl_usb2_udc_data { +	const char *devid;  	resource_size_t iobase;  	resource_size_t irq;  }; diff --git a/arch/arm/mach-imx/devices/platform-fec.c b/arch/arm/mach-imx/devices/platform-fec.c index 2cb188ad9a0..63eba08f87b 100644 --- a/arch/arm/mach-imx/devices/platform-fec.c +++ b/arch/arm/mach-imx/devices/platform-fec.c @@ -35,12 +35,6 @@ const struct imx_fec_data imx35_fec_data __initconst =  	imx_fec_data_entry_single(MX35, "imx27-fec");  #endif -#ifdef CONFIG_SOC_IMX50 -/* i.mx50 has the i.mx25 type fec */ -const struct imx_fec_data imx50_fec_data __initconst = -	imx_fec_data_entry_single(MX50, "imx25-fec"); -#endif -  #ifdef CONFIG_SOC_IMX51  /* i.mx51 has the i.mx27 type fec */  const struct imx_fec_data imx51_fec_data __initconst = diff --git a/arch/arm/mach-imx/devices/platform-fsl-usb2-udc.c b/arch/arm/mach-imx/devices/platform-fsl-usb2-udc.c index 37e44398197..3c06bd96e9c 100644 --- a/arch/arm/mach-imx/devices/platform-fsl-usb2-udc.c +++ b/arch/arm/mach-imx/devices/platform-fsl-usb2-udc.c @@ -11,35 +11,36 @@  #include "../hardware.h"  #include "devices-common.h" -#define imx_fsl_usb2_udc_data_entry_single(soc)				\ +#define imx_fsl_usb2_udc_data_entry_single(soc, _devid)			\  	{								\ +		.devid = _devid,					\  		.iobase = soc ## _USB_OTG_BASE_ADDR,			\  		.irq = soc ## _INT_USB_OTG,				\  	}  #ifdef CONFIG_SOC_IMX25  const struct imx_fsl_usb2_udc_data imx25_fsl_usb2_udc_data __initconst = -	imx_fsl_usb2_udc_data_entry_single(MX25); +	imx_fsl_usb2_udc_data_entry_single(MX25, "imx-udc-mx27");  #endif /* ifdef CONFIG_SOC_IMX25 */  #ifdef CONFIG_SOC_IMX27  const struct imx_fsl_usb2_udc_data imx27_fsl_usb2_udc_data __initconst = -	imx_fsl_usb2_udc_data_entry_single(MX27); +	imx_fsl_usb2_udc_data_entry_single(MX27, "imx-udc-mx27");  #endif /* ifdef CONFIG_SOC_IMX27 */  #ifdef CONFIG_SOC_IMX31  const struct imx_fsl_usb2_udc_data imx31_fsl_usb2_udc_data __initconst = -	imx_fsl_usb2_udc_data_entry_single(MX31); +	imx_fsl_usb2_udc_data_entry_single(MX31, "imx-udc-mx27");  #endif /* ifdef CONFIG_SOC_IMX31 */  #ifdef CONFIG_SOC_IMX35  const struct imx_fsl_usb2_udc_data imx35_fsl_usb2_udc_data __initconst = -	imx_fsl_usb2_udc_data_entry_single(MX35); +	imx_fsl_usb2_udc_data_entry_single(MX35, "imx-udc-mx27");  #endif /* ifdef CONFIG_SOC_IMX35 */  #ifdef CONFIG_SOC_IMX51  const struct imx_fsl_usb2_udc_data imx51_fsl_usb2_udc_data __initconst = -	imx_fsl_usb2_udc_data_entry_single(MX51); +	imx_fsl_usb2_udc_data_entry_single(MX51, "imx-udc-mx51");  #endif  struct platform_device *__init imx_add_fsl_usb2_udc( @@ -57,7 +58,7 @@ struct platform_device *__init imx_add_fsl_usb2_udc(  			.flags = IORESOURCE_IRQ,  		},  	}; -	return imx_add_platform_device_dmamask("fsl-usb2-udc", -1, +	return imx_add_platform_device_dmamask(data->devid, -1,  			res, ARRAY_SIZE(res),  			pdata, sizeof(*pdata), DMA_BIT_MASK(32));  } diff --git a/arch/arm/mach-imx/devices/platform-imx-fb.c b/arch/arm/mach-imx/devices/platform-imx-fb.c index 10b0ed39f07..25a47c616b2 100644 --- a/arch/arm/mach-imx/devices/platform-imx-fb.c +++ b/arch/arm/mach-imx/devices/platform-imx-fb.c @@ -54,7 +54,7 @@ struct platform_device *__init imx_add_imx_fb(  			.flags = IORESOURCE_IRQ,  		},  	}; -	return imx_add_platform_device_dmamask("imx-fb", 0, +	return imx_add_platform_device_dmamask(data->devid, 0,  			res, ARRAY_SIZE(res),  			pdata, sizeof(*pdata), DMA_BIT_MASK(32));  } diff --git a/arch/arm/mach-imx/devices/platform-imx-i2c.c b/arch/arm/mach-imx/devices/platform-imx-i2c.c index 8e30e5703cd..57d342e85c2 100644 --- a/arch/arm/mach-imx/devices/platform-imx-i2c.c +++ b/arch/arm/mach-imx/devices/platform-imx-i2c.c @@ -70,16 +70,6 @@ const struct imx_imx_i2c_data imx35_imx_i2c_data[] __initconst = {  };  #endif /* ifdef CONFIG_SOC_IMX35 */ -#ifdef CONFIG_SOC_IMX50 -const struct imx_imx_i2c_data imx50_imx_i2c_data[] __initconst = { -#define imx50_imx_i2c_data_entry(_id, _hwid)				\ -	imx_imx_i2c_data_entry(MX50, "imx21-i2c", _id, _hwid, SZ_4K) -	imx50_imx_i2c_data_entry(0, 1), -	imx50_imx_i2c_data_entry(1, 2), -	imx50_imx_i2c_data_entry(2, 3), -}; -#endif /* ifdef CONFIG_SOC_IMX51 */ -  #ifdef CONFIG_SOC_IMX51  const struct imx_imx_i2c_data imx51_imx_i2c_data[] __initconst = {  #define imx51_imx_i2c_data_entry(_id, _hwid)				\ diff --git a/arch/arm/mach-imx/devices/platform-imx-uart.c b/arch/arm/mach-imx/devices/platform-imx-uart.c index 67bf866a2cb..faac4aa6ca6 100644 --- a/arch/arm/mach-imx/devices/platform-imx-uart.c +++ b/arch/arm/mach-imx/devices/platform-imx-uart.c @@ -94,18 +94,6 @@ const struct imx_imx_uart_1irq_data imx35_imx_uart_data[] __initconst = {  };  #endif /* ifdef CONFIG_SOC_IMX35 */ -#ifdef CONFIG_SOC_IMX50 -const struct imx_imx_uart_1irq_data imx50_imx_uart_data[] __initconst = { -#define imx50_imx_uart_data_entry(_id, _hwid)				\ -	imx_imx_uart_1irq_data_entry(MX50, _id, _hwid, SZ_4K) -	imx50_imx_uart_data_entry(0, 1), -	imx50_imx_uart_data_entry(1, 2), -	imx50_imx_uart_data_entry(2, 3), -	imx50_imx_uart_data_entry(3, 4), -	imx50_imx_uart_data_entry(4, 5), -}; -#endif /* ifdef CONFIG_SOC_IMX50 */ -  #ifdef CONFIG_SOC_IMX51  const struct imx_imx_uart_1irq_data imx51_imx_uart_data[] __initconst = {  #define imx51_imx_uart_data_entry(_id, _hwid)				\ diff --git a/arch/arm/mach-imx/epit.c b/arch/arm/mach-imx/epit.c index 04a5961beea..e02de188ae8 100644 --- a/arch/arm/mach-imx/epit.c +++ b/arch/arm/mach-imx/epit.c @@ -178,7 +178,6 @@ static struct irqaction epit_timer_irq = {  static struct clock_event_device clockevent_epit = {  	.name		= "epit",  	.features	= CLOCK_EVT_FEAT_ONESHOT, -	.shift		= 32,  	.set_mode	= epit_set_mode,  	.set_next_event	= epit_set_next_event,  	.rating		= 200, @@ -186,18 +185,10 @@ static struct clock_event_device clockevent_epit = {  static int __init epit_clockevent_init(struct clk *timer_clk)  { -	unsigned int c = clk_get_rate(timer_clk); - -	clockevent_epit.mult = div_sc(c, NSEC_PER_SEC, -					clockevent_epit.shift); -	clockevent_epit.max_delta_ns = -			clockevent_delta2ns(0xfffffffe, &clockevent_epit); -	clockevent_epit.min_delta_ns = -			clockevent_delta2ns(0x800, &clockevent_epit); -  	clockevent_epit.cpumask = cpumask_of(0); - -	clockevents_register_device(&clockevent_epit); +	clockevents_config_and_register(&clockevent_epit, +					clk_get_rate(timer_clk), +					0x800, 0xfffffffe);  	return 0;  } diff --git a/arch/arm/mach-imx/gpc.c b/arch/arm/mach-imx/gpc.c index e1537f9e45b..a96ccc7f501 100644 --- a/arch/arm/mach-imx/gpc.c +++ b/arch/arm/mach-imx/gpc.c @@ -15,7 +15,7 @@  #include <linux/of.h>  #include <linux/of_address.h>  #include <linux/of_irq.h> -#include <asm/hardware/gic.h> +#include <linux/irqchip/arm-gic.h>  #define GPC_IMR1		0x008  #define GPC_PGC_CPU_PDN		0x2a0 @@ -101,11 +101,16 @@ static void imx_gpc_irq_mask(struct irq_data *d)  void __init imx_gpc_init(void)  {  	struct device_node *np; +	int i;  	np = of_find_compatible_node(NULL, NULL, "fsl,imx6q-gpc");  	gpc_base = of_iomap(np, 0);  	WARN_ON(!gpc_base); +	/* Initially mask all interrupts */ +	for (i = 0; i < IMR_NUM; i++) +		writel_relaxed(~0, gpc_base + GPC_IMR1 + i * 4); +  	/* Register GPC as the secondary interrupt controller behind GIC */  	gic_arch_extn.irq_mask = imx_gpc_irq_mask;  	gic_arch_extn.irq_unmask = imx_gpc_irq_unmask; diff --git a/arch/arm/mach-imx/hardware.h b/arch/arm/mach-imx/hardware.h index 3ce7fa3bd43..911e9b31b03 100644 --- a/arch/arm/mach-imx/hardware.h +++ b/arch/arm/mach-imx/hardware.h @@ -72,11 +72,6 @@   *	AVIC	0x68000000+0x100000	->	0xf5800000+0x100000   *	X_MEMC	0xb8000000+0x010000	->	0xf5c00000+0x010000   *	SPBA0	0x50000000+0x100000	->	0xf5400000+0x100000 - * mx50: - *	TZIC	0x0fffc000+0x004000	->	0xf4bfc000+0x004000 - *	AIPS1	0x53f00000+0x100000	->	0xf5700000+0x100000 - *	SPBA0	0x50000000+0x100000	->	0xf5400000+0x100000 - *	AIPS2	0x63f00000+0x100000	->	0xf5300000+0x100000   * mx51:   *	TZIC	0x0fffc000+0x004000	->	0xf4bfc000+0x004000   *	IRAM	0x1ffe0000+0x020000	->	0xf4fe0000+0x020000 @@ -108,7 +103,6 @@  #include "mxc.h"  #include "mx6q.h" -#include "mx50.h"  #include "mx51.h"  #include "mx53.h"  #include "mx3x.h" diff --git a/arch/arm/mach-imx/hotplug.c b/arch/arm/mach-imx/hotplug.c index 3dec962b077..7bc5fe15dda 100644 --- a/arch/arm/mach-imx/hotplug.c +++ b/arch/arm/mach-imx/hotplug.c @@ -46,9 +46,11 @@ static inline void cpu_enter_lowpower(void)  void imx_cpu_die(unsigned int cpu)  {  	cpu_enter_lowpower(); -	imx_enable_cpu(cpu, false); +	cpu_do_idle(); +} -	/* spin here until hardware takes it down */ -	while (1) -		; +int imx_cpu_kill(unsigned int cpu) +{ +	imx_enable_cpu(cpu, false); +	return 1;  } diff --git a/arch/arm/mach-imx/imx31-dt.c b/arch/arm/mach-imx/imx31-dt.c index f9a69096009..00737eb4e00 100644 --- a/arch/arm/mach-imx/imx31-dt.c +++ b/arch/arm/mach-imx/imx31-dt.c @@ -18,24 +18,9 @@  #include "common.h"  #include "mx31.h" -static const struct of_dev_auxdata imx31_auxdata_lookup[] __initconst = { -	OF_DEV_AUXDATA("fsl,imx31-uart", MX31_UART1_BASE_ADDR, -			"imx21-uart.0", NULL), -	OF_DEV_AUXDATA("fsl,imx31-uart", MX31_UART2_BASE_ADDR, -			"imx21-uart.1", NULL), -	OF_DEV_AUXDATA("fsl,imx31-uart", MX31_UART3_BASE_ADDR, -			"imx21-uart.2", NULL), -	OF_DEV_AUXDATA("fsl,imx31-uart", MX31_UART4_BASE_ADDR, -			"imx21-uart.3", NULL), -	OF_DEV_AUXDATA("fsl,imx31-uart", MX31_UART5_BASE_ADDR, -			"imx21-uart.4", NULL), -	{ /* sentinel */ } -}; -  static void __init imx31_dt_init(void)  { -	of_platform_populate(NULL, of_default_bus_match_table, -			     imx31_auxdata_lookup, NULL); +	of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);  }  static const char *imx31_dt_board_compat[] __initdata = { diff --git a/arch/arm/mach-imx/iomux-mx50.h b/arch/arm/mach-imx/iomux-mx50.h deleted file mode 100644 index 00f56e0e800..00000000000 --- a/arch/arm/mach-imx/iomux-mx50.h +++ /dev/null @@ -1,977 +0,0 @@ -/* - * Copyright (C) 2010 Freescale Semiconductor, Inc. All Rights Reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#ifndef __MACH_IOMUX_MX50_H__ -#define __MACH_IOMUX_MX50_H__ - -#include "iomux-v3.h" - -#define MX50_ELCDIF_PAD_CTRL	(PAD_CTL_PKE | PAD_CTL_DSE_HIGH) - -#define MX50_SD_PAD_CTRL	(PAD_CTL_HYS | PAD_CTL_PKE | PAD_CTL_PUE | \ -					PAD_CTL_PUS_47K_UP | PAD_CTL_DSE_HIGH) - -#define MX50_UART_PAD_CTRL	(PAD_CTL_DSE_HIGH | PAD_CTL_PKE) - -#define MX50_I2C_PAD_CTRL	(PAD_CTL_ODE | PAD_CTL_DSE_HIGH | \ -					PAD_CTL_PUS_100K_UP | PAD_CTL_HYS) - -#define MX50_USB_PAD_CTRL	(PAD_CTL_PKE | PAD_CTL_PUE | \ -					PAD_CTL_DSE_HIGH | PAD_CTL_PUS_47K_UP) - -#define MX50_FEC_PAD_CTRL	(PAD_CTL_HYS | PAD_CTL_PKE | PAD_CTL_PUE | \ -					PAD_CTL_PUS_22K_UP | PAD_CTL_ODE | \ -					PAD_CTL_DSE_HIGH) - -#define MX50_OWIRE_PAD_CTRL	(PAD_CTL_HYS | PAD_CTL_PKE | PAD_CTL_PUE | \ -					PAD_CTL_PUS_100K_UP | PAD_CTL_ODE | \ -					PAD_CTL_DSE_HIGH | PAD_CTL_SRE_FAST) - -#define MX50_KEYPAD_CTRL        (PAD_CTL_HYS | PAD_CTL_PKE | PAD_CTL_PUE | \ -					PAD_CTL_PUS_100K_UP | PAD_CTL_DSE_HIGH) - -#define MX50_CSPI_SS_PAD	(PAD_CTL_PKE | PAD_CTL_PUE | \ -					PAD_CTL_PUS_22K_UP | PAD_CTL_DSE_HIGH) - -#define MX50_PAD_KEY_COL0__KEY_COL0	IOMUX_PAD(0x2CC, 0x20, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_KEY_COL0__GPIO_4_0	IOMUX_PAD(0x2CC, 0x20, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_KEY_COL0__NANDF_CLE	IOMUX_PAD(0x2CC, 0x20, 2, 0x0, 0, PAD_CTL_DSE_HIGH) - -#define MX50_PAD_KEY_ROW0__KEY_ROW0	IOMUX_PAD(0x2D0, 0x24, 0, 0x0, 0, MX50_KEYPAD_CTRL) -#define MX50_PAD_KEY_ROW0__GPIO_4_1	IOMUX_PAD(0x2D0, 0x24, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_KEY_ROW0__NANDF_ALE	IOMUX_PAD(0x2D0, 0x24, 2, 0x0, 0, PAD_CTL_DSE_HIGH) - -#define MX50_PAD_KEY_COL1__KEY_COL1	IOMUX_PAD(0x2D4, 0x28, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_KEY_COL1__GPIO_4_2	IOMUX_PAD(0x2D4, 0x28, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_KEY_COL1__NANDF_CE0	IOMUX_PAD(0x2D4, 0x28, 2, 0x0, 0, PAD_CTL_DSE_HIGH) - -#define MX50_PAD_KEY_ROW1__KEY_ROW1	IOMUX_PAD(0x2D8, 0x2C, 0, 0x0, 0, MX50_KEYPAD_CTRL) -#define MX50_PAD_KEY_ROW1__GPIO_4_3	IOMUX_PAD(0x2D8, 0x2C, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_KEY_ROW1__NANDF_CE1	IOMUX_PAD(0x2D8, 0x2C, 2, 0x0, 0, PAD_CTL_DSE_HIGH) - -#define MX50_PAD_KEY_COL2__KEY_COL2	IOMUX_PAD(0x2DC, 0x30, 0, 0x0, 0, MX50_KEYPAD_CTRL) -#define MX50_PAD_KEY_COL2__GPIO_4_4	IOMUX_PAD(0x2DC, 0x30, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_KEY_COL2__NANDF_CE2	IOMUX_PAD(0x2DC, 0x30, 2, 0x0, 0, PAD_CTL_DSE_HIGH) - -#define MX50_PAD_KEY_ROW2__KEY_ROW2	IOMUX_PAD(0x2E0, 0x34, 0, 0x0, 0, MX50_KEYPAD_CTRL) -#define MX50_PAD_KEY_ROW2__GPIO_4_5	IOMUX_PAD(0x2E0, 0x34, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_KEY_ROW2__NANDF_CE3	IOMUX_PAD(0x2E0, 0x34, 2, 0x0, 0, PAD_CTL_DSE_HIGH) - -#define MX50_PAD_KEY_COL3__KEY_COL3	IOMUX_PAD(0x2E4, 0x38, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_KEY_COL3__GPIO_4_6	IOMUX_PAD(0x2E4, 0x38, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_KEY_COL3__NANDF_READY	IOMUX_PAD(0x2E4, 0x38, 2, 0x7b4, 0, PAD_CTL_PKE | \ -							PAD_CTL_PUE | PAD_CTL_PUS_100K_UP) -#define MX50_PAD_KEY_COL3__SDMA_EXT0	IOMUX_PAD(0x2E4, 0x38, 6, 0x7b8, 0, NO_PAD_CTRL) - -#define MX50_PAD_KEY_ROW3__KEY_ROW3	IOMUX_PAD(0x2E8, 0x3C, 0, 0x0, 0, MX50_KEYPAD_CTRL) -#define MX50_PAD_KEY_ROW3__GPIO_4_7	IOMUX_PAD(0x2E8, 0x3C, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_KEY_ROW3__NANDF_DQS	IOMUX_PAD(0x2E8, 0x3C, 2, 0x7b0, 0, PAD_CTL_DSE_HIGH) -#define MX50_PAD_KEY_ROW3__SDMA_EXT1	IOMUX_PAD(0x2E8, 0x3C, 6, 0x7bc, 0, NO_PAD_CTRL) - -#define MX50_PAD_I2C1_SCL__I2C1_SCL	IOMUX_PAD(0x2EC, 0x40, IOMUX_CONFIG_SION, 0x0, 0, \ -							MX50_I2C_PAD_CTRL) -#define MX50_PAD_I2C1_SCL__GPIO_6_18	IOMUX_PAD(0x2EC, 0x40, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_I2C1_SCL__UART2_TXD	IOMUX_PAD(0x2EC, 0x40, 2, 0x0, 0, MX50_UART_PAD_CTRL) - -#define MX50_PAD_I2C1_SDA__I2C1_SDA	IOMUX_PAD(0x2F0, 0x44, IOMUX_CONFIG_SION, 0x0, 0, \ -							MX50_I2C_PAD_CTRL) -#define MX50_PAD_I2C1_SDA__GPIO_6_19	IOMUX_PAD(0x2F0, 0x44, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_I2C1_SDA__UART2_RXD	IOMUX_PAD(0x2F0, 0x44, 2, 0x7cc, 1, MX50_UART_PAD_CTRL) - -#define MX50_PAD_I2C2_SCL__I2C2_SCL	IOMUX_PAD(0x2F4, 0x48, IOMUX_CONFIG_SION, 0x0, 0, \ -							MX50_I2C_PAD_CTRL) -#define MX50_PAD_I2C2_SCL__GPIO_6_20	IOMUX_PAD(0x2F4, 0x48, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_I2C2_SCL__UART2_CTS	IOMUX_PAD(0x2F4, 0x48, 2, 0x0, 0, MX50_UART_PAD_CTRL) -#define MX50_PAD_I2C2_SCL__DCDC_OK	IOMUX_PAD(0x2F4, 0x48, 7, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_I2C2_SDA__I2C2_SDA	IOMUX_PAD(0x2F8, 0x4C, IOMUX_CONFIG_SION, 0x0, 0, \ -							MX50_I2C_PAD_CTRL) -#define MX50_PAD_I2C2_SDA__GPIO_6_21	IOMUX_PAD(0x2F8, 0x4C, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_I2C2_SDA__UART2_RTS	IOMUX_PAD(0x2F8, 0x4C, 2, 0x7c8, 1, MX50_UART_PAD_CTRL) -#define MX50_PAD_I2C2_SDA__PWRSTABLE	IOMUX_PAD(0x2F8, 0x4C, 7, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_I2C3_SCL__I2C3_SCL	IOMUX_PAD(0x2FC, 0x50, IOMUX_CONFIG_SION, 0x0, 0, \ -							MX50_I2C_PAD_CTRL) -#define MX50_PAD_I2C3_SCL__GPIO_6_22	IOMUX_PAD(0x2FC, 0x50, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_I2C3_SCL__FEC_MDC	IOMUX_PAD(0x2FC, 0x50, 2, 0x0, 0, PAD_CTL_DSE_HIGH) -#define MX50_PAD_I2C3_SCL__PMIC_RDY	IOMUX_PAD(0x2FC, 0x50, 3, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_I2C3_SCL__GPT_CAPIN1	IOMUX_PAD(0x2FC, 0x50, 5, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_I2C3_SCL__USBOTG_OC	IOMUX_PAD(0x2FC, 0x50, 7, 0x7E8, 0, MX50_USB_PAD_CTRL) - -#define MX50_PAD_I2C3_SDA__I2C3_SDA	IOMUX_PAD(0x300, 0x54, IOMUX_CONFIG_SION, 0x0, 0, \ -								MX50_I2C_PAD_CTRL) -#define MX50_PAD_I2C3_SDA__GPIO_6_23	IOMUX_PAD(0x300, 0x54, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_I2C3_SDA__FEC_MDIO	IOMUX_PAD(0x300, 0x54, 2, 0x774, 0, MX50_FEC_PAD_CTRL) -#define MX50_PAD_I2C3_SDA__PWRFAIL_INT	IOMUX_PAD(0x300, 0x54, 3, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_I2C3_SDA__ALARM_DEB	IOMUX_PAD(0x300, 0x54, 4, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_I2C3_SDA__GPT_CAPIN1	IOMUX_PAD(0x300, 0x54, 5, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_I2C3_SDA__USBOTG_PWR	IOMUX_PAD(0x300, 0x54, 7, 0x0, 0, \ -							PAD_CTL_PKE | PAD_CTL_DSE_HIGH) - -#define MX50_PAD_PWM1__PWM1_PWMO	IOMUX_PAD(0x304, 0x58, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_PWM1__GPIO_6_24	IOMUX_PAD(0x304, 0x58, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_PWM1__USBOTG_OC	IOMUX_PAD(0x304, 0x58, 2, 0x7E8, 1, MX50_USB_PAD_CTRL) -#define MX50_PAD_PWM1__GPT_CMPOUT1	IOMUX_PAD(0x304, 0x58, 5, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_PWM2__PWM2_PWMO	IOMUX_PAD(0x308, 0x5C, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_PWM2__GPIO_6_25	IOMUX_PAD(0x308, 0x5C, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_PWM2__USBOTG_PWR	IOMUX_PAD(0x308, 0x5C, 2, 0x0, 0, \ -							PAD_CTL_PKE | PAD_CTL_DSE_HIGH) -#define MX50_PAD_PWM2__DCDC_PWM		IOMUX_PAD(0x308, 0x5C, 4, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_PWM2__GPT_CMPOUT2	IOMUX_PAD(0x308, 0x5C, 5, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_PWM2__ANY_PU_RST	IOMUX_PAD(0x308, 0x5C, 7, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_OWIRE__OWIRE		IOMUX_PAD(0x30C, 0x60, 0, 0x0, 0, MX50_OWIRE_PAD_CTRL) -#define MX50_PAD_OWIRE__GPIO_6_26	IOMUX_PAD(0x30C, 0x60, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_OWIRE__USBH1_OC	IOMUX_PAD(0x30C, 0x60, 2, 0x0, 0, MX50_USB_PAD_CTRL) -#define MX50_PAD_OWIRE__SSI_EXT1_CLK	IOMUX_PAD(0x30C, 0x60, 3, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_OWIRE__EPDC_PWRIRQ	IOMUX_PAD(0x30C, 0x60, 4, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_OWIRE__GPT_CMPOUT3	IOMUX_PAD(0x30C, 0x60, 5, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_EPITO__EPITO		IOMUX_PAD(0x310, 0x64, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPITO__GPIO_6_27	IOMUX_PAD(0x310, 0x64, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPITO__USBH1_PWR	IOMUX_PAD(0x310, 0x64, 2, 0x0, 0, \ -							PAD_CTL_PKE | PAD_CTL_DSE_HIGH) -#define MX50_PAD_EPITO__SSI_EXT2_CLK	IOMUX_PAD(0x310, 0x64, 3, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPITO__TOG_EN		IOMUX_PAD(0x310, 0x64, 4, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPITO__GPT_CLKIN	IOMUX_PAD(0x310, 0x64, 5, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_WDOG__WDOG		IOMUX_PAD(0x314, 0x68, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_WDOG__GPIO_6_28	IOMUX_PAD(0x314, 0x68, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_WDOG__WDOG_RST		IOMUX_PAD(0x314, 0x68, 2, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_WDOG__XTAL32K		IOMUX_PAD(0x314, 0x68, 6, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_SSI_TXFS__SSI_TXFS	IOMUX_PAD(0x318, 0x6C, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_SSI_TXFS__GPIO_6_0	IOMUX_PAD(0x318, 0x6C, 1, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_SSI_TXC__SSI_TXC	IOMUX_PAD(0x31C, 0x70, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_SSI_TXC__GPIO_6_1	IOMUX_PAD(0x31C, 0x70, 1, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_SSI_TXD__SSI_TXD	IOMUX_PAD(0x320, 0x74, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_SSI_TXD__GPIO_6_2	IOMUX_PAD(0x320, 0x74, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_SSI_TXD__CSPI_RDY	IOMUX_PAD(0x320, 0x74, 4, 0x6e8, 0, NO_PAD_CTRL) - -#define MX50_PAD_SSI_RXD__SSI_RXD	IOMUX_PAD(0x324, 0x78, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_SSI_RXD__GPIO_6_3	IOMUX_PAD(0x324, 0x78, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_SSI_RXD__CSPI_SS3	IOMUX_PAD(0x324, 0x78, 4, 0x6f4, 0, MX50_CSPI_SS_PAD) - -#define MX50_PAD_SSI_RXFS__AUD3_RXFS	IOMUX_PAD(0x328, 0x7C, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_SSI_RXFS__GPIO_6_4	IOMUX_PAD(0x328, 0x7C, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_SSI_RXFS__UART5_TXD	IOMUX_PAD(0x328, 0x7C, 2, 0x0, 0, MX50_UART_PAD_CTRL) -#define MX50_PAD_SSI_RXFS__WEIM_D6	IOMUX_PAD(0x328, 0x7C, 3, 0x804, 0, NO_PAD_CTRL) -#define MX50_PAD_SSI_RXFS__CSPI_SS2	IOMUX_PAD(0x328, 0x7C, 4, 0x6f0, 0, MX50_CSPI_SS_PAD) -#define MX50_PAD_SSI_RXFS__FEC_COL	IOMUX_PAD(0x328, 0x7C, 5, 0x770, 0, PAD_CTL_DSE_HIGH) -#define MX50_PAD_SSI_RXFS__FEC_MDC	IOMUX_PAD(0x328, 0x7C, 6, 0x0, 0, PAD_CTL_DSE_HIGH) - -#define MX50_PAD_SSI_RXC__AUD3_RXC	IOMUX_PAD(0x32C, 0x80, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_SSI_RXC__GPIO_6_5	IOMUX_PAD(0x32C, 0x80, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_SSI_RXC__UART5_RXD	IOMUX_PAD(0x32C, 0x80, 2, 0x7e4, 1, MX50_UART_PAD_CTRL) -#define MX50_PAD_SSI_RXC__WEIM_D7	IOMUX_PAD(0x32C, 0x80, 3, 0x808, 0, NO_PAD_CTRL) -#define MX50_PAD_SSI_RXC__CSPI_SS1	IOMUX_PAD(0x32C, 0x80, 4, 0x6ec, 0, MX50_CSPI_SS_PAD) -#define MX50_PAD_SSI_RXC__FEC_RX_CLK	IOMUX_PAD(0x32C, 0x80, 5, 0x780, 0, NO_PAD_CTRL) -#define MX50_PAD_SSI_RXC__FEC_MDIO	IOMUX_PAD(0x32C, 0x80, 6, 0x774, 1, MX50_FEC_PAD_CTRL) - -#define MX50_PAD_UART1_TXD__UART1_TXD	IOMUX_PAD(0x330, 0x84, 0, 0x0, 0, MX50_UART_PAD_CTRL) -#define MX50_PAD_UART1_TXD__GPIO_6_6	IOMUX_PAD(0x330, 0x84, 1, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_UART1_RXD__UART1_RXD	IOMUX_PAD(0x334, 0x88, 0, 0x7c4, 1, MX50_UART_PAD_CTRL) -#define MX50_PAD_UART1_RXD__GPIO_6_7	IOMUX_PAD(0x334, 0x88, 1, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_UART1_CTS__UART1_CTS	IOMUX_PAD(0x338, 0x8C, 0, 0x0, 0, MX50_UART_PAD_CTRL) -#define MX50_PAD_UART1_CTS__GPIO_6_8	IOMUX_PAD(0x338, 0x8C, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_UART1_CTS__UART5_TXD	IOMUX_PAD(0x338, 0x8C, 2, 0x0, 0, MX50_UART_PAD_CTRL) -#define MX50_PAD_UART1_CTS__SD4_D4	IOMUX_PAD(0x338, 0x8C, 4, 0x760, 0, MX50_SD_PAD_CTRL) -#define MX50_PAD_UART1_CTS__SD4_CMD	IOMUX_PAD(0x338, 0x8C, 5, 0x74c, 0, MX50_SD_PAD_CTRL) - -#define MX50_PAD_UART1_RTS__UART1_RTS	IOMUX_PAD(0x33C, 0x90, 0, 0x7c0, 1, MX50_UART_PAD_CTRL) -#define MX50_PAD_UART1_RTS__GPIO_6_9	IOMUX_PAD(0x33C, 0x90, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_UART1_RTS__UART5_RXD	IOMUX_PAD(0x33C, 0x90, 2, 0x7e4, 3, MX50_UART_PAD_CTRL) -#define MX50_PAD_UART1_RTS__SD4_D5	IOMUX_PAD(0x33C, 0x90, 4, 0x764, 0, MX50_SD_PAD_CTRL) -#define MX50_PAD_UART1_RTS__SD4_CLK	IOMUX_PAD(0x33C, 0x90, 5, 0x748, 0, MX50_SD_PAD_CTRL) - -#define MX50_PAD_UART2_TXD__UART2_TXD	IOMUX_PAD(0x340, 0x94, 0, 0x0, 0, MX50_UART_PAD_CTRL) -#define MX50_PAD_UART2_TXD__GPIO_6_10	IOMUX_PAD(0x340, 0x94, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_UART2_TXD__SD4_D6	IOMUX_PAD(0x340, 0x94, 4, 0x768, 0, MX50_SD_PAD_CTRL) -#define MX50_PAD_UART2_TXD__SD4_D4	IOMUX_PAD(0x340, 0x94, 5, 0x760, 1, MX50_SD_PAD_CTRL) - -#define MX50_PAD_UART2_RXD__UART2_RXD	IOMUX_PAD(0x344, 0x98, 0, 0x7cc, 3, MX50_UART_PAD_CTRL) -#define MX50_PAD_UART2_RXD__GPIO_6_11	IOMUX_PAD(0x344, 0x98, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_UART2_RXD__SD4_D7	IOMUX_PAD(0x344, 0x98, 4, 0x76c, 0, MX50_SD_PAD_CTRL) -#define MX50_PAD_UART2_RXD__SD4_D5	IOMUX_PAD(0x344, 0x98, 5, 0x764, 1, MX50_SD_PAD_CTRL) - -#define MX50_PAD_UART2_CTS__UART2_CTS	IOMUX_PAD(0x348, 0x9C, 0, 0x0, 0, MX50_UART_PAD_CTRL) -#define MX50_PAD_UART2_CTS__GPIO_6_12	IOMUX_PAD(0x348, 0x9C, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_UART2_CTS__SD4_CMD	IOMUX_PAD(0x348, 0x9C, 4, 0x74c, 1, MX50_SD_PAD_CTRL) -#define MX50_PAD_UART2_CTS__SD4_D6	IOMUX_PAD(0x348, 0x9C, 5, 0x768, 1, MX50_SD_PAD_CTRL) - -#define MX50_PAD_UART2_RTS__UART2_RTS	IOMUX_PAD(0x34C, 0xA0, 0, 0x7c8, 3, MX50_UART_PAD_CTRL) -#define MX50_PAD_UART2_RTS__GPIO_6_13	IOMUX_PAD(0x34C, 0xA0, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_UART2_RTS__SD4_CLK	IOMUX_PAD(0x34C, 0xA0, 4, 0x748, 1, MX50_SD_PAD_CTRL) -#define MX50_PAD_UART2_RTS__SD4_D7	IOMUX_PAD(0x34C, 0xA0, 5, 0x76c, 1, MX50_SD_PAD_CTRL) - -#define MX50_PAD_UART3_TXD__UART3_TXD	IOMUX_PAD(0x350, 0xA4, 0, 0x0, 0, MX50_UART_PAD_CTRL) -#define MX50_PAD_UART3_TXD__GPIO_6_14	IOMUX_PAD(0x350, 0xA4, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_UART3_TXD__SD1_D4	IOMUX_PAD(0x350, 0xA4, 3, 0x0, 0, MX50_SD_PAD_CTRL) -#define MX50_PAD_UART3_TXD__SD4_D0	IOMUX_PAD(0x350, 0xA4, 4, 0x750, 0, MX50_SD_PAD_CTRL) -#define MX50_PAD_UART3_TXD__SD2_WP	IOMUX_PAD(0x350, 0xA4, 5, 0x744, 0, MX50_SD_PAD_CTRL) -#define MX50_PAD_UART3_TXD__WEIM_D12	IOMUX_PAD(0x350, 0xA4, 6, 0x81c, 0, NO_PAD_CTRL) - -#define MX50_PAD_UART3_RXD__UART3_RXD	IOMUX_PAD(0x354, 0xA8, 0, 0x7d4, 1, MX50_UART_PAD_CTRL) -#define MX50_PAD_UART3_RXD__GPIO_6_15	IOMUX_PAD(0x354, 0xA8, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_UART3_RXD__SD1_D5	IOMUX_PAD(0x354, 0xA8, 3, 0x0, 0, MX50_SD_PAD_CTRL) -#define MX50_PAD_UART3_RXD__SD4_D1	IOMUX_PAD(0x354, 0xA8, 4, 0x754, 0, MX50_SD_PAD_CTRL) -#define MX50_PAD_UART3_RXD__SD2_CD	IOMUX_PAD(0x354, 0xA8, 5, 0x740, 0, MX50_SD_PAD_CTRL) -#define MX50_PAD_UART3_RXD__WEIM_D13	IOMUX_PAD(0x354, 0xA8, 6, 0x820, 0, NO_PAD_CTRL) - -#define MX50_PAD_UART4_TXD__UART4_TXD	IOMUX_PAD(0x358, 0xAC, 0, 0x0, 0, MX50_UART_PAD_CTRL) -#define MX50_PAD_UART4_TXD__GPIO_6_16	IOMUX_PAD(0x358, 0xAC, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_UART4_TXD__UART3_CTS	IOMUX_PAD(0x358, 0xAC, 2, 0x0, 0, MX50_UART_PAD_CTRL) -#define MX50_PAD_UART4_TXD__SD1_D6	IOMUX_PAD(0x358, 0xAC, 3, 0x0, 0, MX50_SD_PAD_CTRL) -#define MX50_PAD_UART4_TXD__SD4_D2	IOMUX_PAD(0x358, 0xAC, 4, 0x758, 0, MX50_SD_PAD_CTRL) -#define MX50_PAD_UART4_TXD__SD2_LCTL	IOMUX_PAD(0x358, 0xAC, 5, 0x0, 0, MX50_SD_PAD_CTRL) -#define MX50_PAD_UART4_TXD__WEIM_D14	IOMUX_PAD(0x358, 0xAC, 6, 0x824, 0, NO_PAD_CTRL) - -#define MX50_PAD_UART4_RXD__UART4_RXD	IOMUX_PAD(0x35C, 0xB0, 0, 0x7dc, 1, MX50_UART_PAD_CTRL) -#define MX50_PAD_UART4_RXD__GPIO_6_17	IOMUX_PAD(0x35C, 0xB0, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_UART4_RXD__UART3_RTS	IOMUX_PAD(0x35C, 0xB0, 2, 0x7d0, 1, MX50_UART_PAD_CTRL) -#define MX50_PAD_UART4_RXD__SD1_D7	IOMUX_PAD(0x35C, 0xB0, 3, 0x0, 0, MX50_SD_PAD_CTRL) -#define MX50_PAD_UART4_RXD__SD4_D3	IOMUX_PAD(0x35C, 0xB0, 4, 0x75c, 0, MX50_SD_PAD_CTRL) -#define MX50_PAD_UART4_RXD__SD1_LCTL	IOMUX_PAD(0x35C, 0xB0, 5, 0x0, 0, MX50_SD_PAD_CTRL) -#define MX50_PAD_UART4_RXD__WEIM_D15	IOMUX_PAD(0x35C, 0xB0, 6, 0x828, 0, NO_PAD_CTRL) - -#define MX50_PAD_CSPI_SCLK__CSPI_SCLK	IOMUX_PAD(0x360, 0xB4, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_CSPI_SCLK__GPIO_4_8	IOMUX_PAD(0x360, 0xB4, 1, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_CSPI_MOSI__CSPI_MOSI	IOMUX_PAD(0x364, 0xB8, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_CSPI_MOSI__GPIO_4_9	IOMUX_PAD(0x364, 0xB8, 1, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_CSPI_MISO__CSPI_MISO	IOMUX_PAD(0x368, 0xBC, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_CSPI_MISO__GPIO_4_10	IOMUX_PAD(0x368, 0xBC, 1, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_CSPI_SS0__CSPI_SS0	IOMUX_PAD(0x36C, 0xC0, 0, 0x0, 0, MX50_CSPI_SS_PAD) -#define MX50_PAD_CSPI_SS0__GPIO_4_11	IOMUX_PAD(0x36C, 0xC0, 1, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_ECSPI1_SCLK__ECSPI1_SCLK	IOMUX_PAD(0x370, 0xC4, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_ECSPI1_SCLK__GPIO_4_12		IOMUX_PAD(0x370, 0xC4, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_ECSPI1_SCLK__CSPI_RDY		IOMUX_PAD(0x370, 0xC4, 2, 0x6e8, 1, NO_PAD_CTRL) -#define MX50_PAD_ECSPI1_SCLK__ECSPI2_RDY	IOMUX_PAD(0x370, 0xC4, 3, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_ECSPI1_SCLK__UART3_RTS		IOMUX_PAD(0x370, 0xC4, 4, 0x7d0, 2, MX50_UART_PAD_CTRL) -#define MX50_PAD_ECSPI1_SCLK__EPDC_SDCE6	IOMUX_PAD(0x370, 0xC4, 5, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_ECSPI1_SCLK__WEIM_D8		IOMUX_PAD(0x370, 0xC4, 7, 0x80c, 0, NO_PAD_CTRL) - -#define MX50_PAD_ECSPI1_MOSI__ECSPI1_MOSI	IOMUX_PAD(0x374, 0xC8, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_ECSPI1_MOSI__GPIO_4_13		IOMUX_PAD(0x374, 0xC8, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_ECSPI1_MOSI__CSPI_SS1		IOMUX_PAD(0x374, 0xC8, 2, 0x6ec, 1, MX50_CSPI_SS_PAD) -#define MX50_PAD_ECSPI1_MOSI__ECSPI2_SS1	IOMUX_PAD(0x374, 0xC8, 3, 0x0, 0, MX50_CSPI_SS_PAD) -#define MX50_PAD_ECSPI1_MOSI__UART3_CTS		IOMUX_PAD(0x374, 0xC8, 4, 0x0, 0, MX50_UART_PAD_CTRL) -#define MX50_PAD_ECSPI1_MOSI__EPDC_SDCE7	IOMUX_PAD(0x374, 0xC8, 5, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_ECSPI1_MOSI__WEIM_D9		IOMUX_PAD(0x374, 0xC8, 7, 0x810, 0, NO_PAD_CTRL) - -#define MX50_PAD_ECSPI1_MISO__ECSPI1_MISO	IOMUX_PAD(0x378, 0xCC, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_ECSPI1_MISO__GPIO_4_14		IOMUX_PAD(0x378, 0xCC, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_ECSPI1_MISO__CSPI_SS2		IOMUX_PAD(0x378, 0xCC, 2, 0x6f0, 1, MX50_CSPI_SS_PAD) -#define MX50_PAD_ECSPI1_MISO__ECSPI2_SS2	IOMUX_PAD(0x378, 0xCC, 3, 0x0, 0, MX50_CSPI_SS_PAD) -#define MX50_PAD_ECSPI1_MISO__UART4_RTS		IOMUX_PAD(0x378, 0xCC, 4, 0x7d8, 0, MX50_UART_PAD_CTRL) -#define MX50_PAD_ECSPI1_MISO__EPDC_SDCE8	IOMUX_PAD(0x378, 0xCC, 5, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_ECSPI1_MISO__WEIM_D10		IOMUX_PAD(0x378, 0xCC, 7, 0x814, 0, NO_PAD_CTRL) - -#define MX50_PAD_ECSPI1_SS0__ECSPI1_SS0		IOMUX_PAD(0x37C, 0xD0, 0, 0x0, 0, MX50_CSPI_SS_PAD) -#define MX50_PAD_ECSPI1_SS0__GPIO_4_15		IOMUX_PAD(0x37C, 0xD0, 1, 0x0, 0, PAD_CTL_PUS_100K_UP) -#define MX50_PAD_ECSPI1_SS0__CSPI_SS3		IOMUX_PAD(0x37C, 0xD0, 2, 0x6f4, 1, MX50_CSPI_SS_PAD) -#define MX50_PAD_ECSPI1_SS0__ECSPI2_SS3		IOMUX_PAD(0x37C, 0xD0, 3, 0x0, 0, MX50_CSPI_SS_PAD) -#define MX50_PAD_ECSPI1_SS0__UART4_CTS		IOMUX_PAD(0x37C, 0xD0, 4, 0x0, 0, MX50_UART_PAD_CTRL) -#define MX50_PAD_ECSPI1_SS0__EPDC_SDCE9		IOMUX_PAD(0x37C, 0xD0, 5, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_ECSPI1_SS0__WEIM_D11		IOMUX_PAD(0x37C, 0xD0, 7, 0x818, 0, NO_PAD_CTRL) - -#define MX50_PAD_ECSPI2_SCLK__ECSPI2_SCLK	IOMUX_PAD(0x380, 0xD4, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_ECSPI2_SCLK__GPIO_4_16		IOMUX_PAD(0x380, 0xD4, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_ECSPI2_SCLK__ELCDIF_WR		IOMUX_PAD(0x380, 0xD4, 2, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_ECSPI2_SCLK__ECSPI1_RDY	IOMUX_PAD(0x380, 0xD4, 3, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_ECSPI2_SCLK__UART5_RTS		IOMUX_PAD(0x380, 0xD4, 4, 0x7e0, 0, MX50_UART_PAD_CTRL) -#define MX50_PAD_ECSPI2_SCLK__ELCDIF_DOTCLK	IOMUX_PAD(0x380, 0xD4, 5, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_ECSPI2_SCLK__NANDF_CEN4	IOMUX_PAD(0x380, 0xD4, 6, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_ECSPI2_SCLK__WEIM_D8		IOMUX_PAD(0x380, 0xD4, 7, 0x80c, 1, NO_PAD_CTRL) - -#define MX50_PAD_ECSPI2_MOSI__ECSPI2_MOSI	IOMUX_PAD(0x384, 0xD8, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_ECSPI2_MOSI__GPIO_4_17		IOMUX_PAD(0x384, 0xD8, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_ECSPI2_MOSI__ELCDIF_RD		IOMUX_PAD(0x384, 0xD8, 2, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_ECSPI2_MOSI__ECSPI1_SS1	IOMUX_PAD(0x384, 0xD8, 3, 0x0, 0, MX50_CSPI_SS_PAD) -#define MX50_PAD_ECSPI2_MOSI__UART5_CTS		IOMUX_PAD(0x384, 0xD8, 4, 0x0, 0, MX50_UART_PAD_CTRL) -#define MX50_PAD_ECSPI2_MOSI__ELCDIF_EN		IOMUX_PAD(0x384, 0xD8, 5, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_ECSPI2_MOSI__NANDF_CEN5	IOMUX_PAD(0x384, 0xD8, 6, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_ECSPI2_MOSI__WEIM_D9		IOMUX_PAD(0x384, 0xD8, 7, 0x810, 1, NO_PAD_CTRL) - -#define MX50_PAD_ECSPI2_MISO__ECSPI2_MISO	IOMUX_PAD(0x388, 0xDC, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_ECSPI2_MISO__GPIO_4_18		IOMUX_PAD(0x388, 0xDC, 1, 0x0, 0, PAD_CTL_PUS_100K_UP) -#define MX50_PAD_ECSPI2_MISO__ELCDIF_RS		IOMUX_PAD(0x388, 0xDC, 2, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_ECSPI2_MISO__ECSPI1_SS2	IOMUX_PAD(0x388, 0xDC, 3, 0x0, 0, MX50_CSPI_SS_PAD) -#define MX50_PAD_ECSPI2_MISO__UART5_TXD		IOMUX_PAD(0x388, 0xDC, 4, 0x0, 0, MX50_UART_PAD_CTRL) -#define MX50_PAD_ECSPI2_MISO__ELCDIF_VSYNC	IOMUX_PAD(0x388, 0xDC, 5, 0x73c, 0, NO_PAD_CTRL) -#define MX50_PAD_ECSPI2_MISO__NANDF_CEN6	IOMUX_PAD(0x388, 0xDC, 6, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_ECSPI2_MISO__WEIM_D10		IOMUX_PAD(0x388, 0xDC, 7, 0x814, 1, NO_PAD_CTRL) - -#define MX50_PAD_ECSPI2_SS0__ECSPI2_SS0		IOMUX_PAD(0x38C, 0xE0, 0, 0x0, 0, MX50_CSPI_SS_PAD) -#define MX50_PAD_ECSPI2_SS0__GPIO_4_19		IOMUX_PAD(0x38C, 0xE0, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_ECSPI2_SS0__ELCDIF_CS		IOMUX_PAD(0x38C, 0xE0, 2, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_ECSPI2_SS0__ECSPI1_SS3		IOMUX_PAD(0x38C, 0xE0, 3, 0x0, 0, MX50_CSPI_SS_PAD) -#define MX50_PAD_ECSPI2_SS0__UART5_RXD		IOMUX_PAD(0x38C, 0xE0, 4, 0x7e4, 5, MX50_UART_PAD_CTRL) -#define MX50_PAD_ECSPI2_SS0__ELCDIF_HSYNC	IOMUX_PAD(0x38C, 0xE0, 5, 0x6f8, 0, NO_PAD_CTRL) -#define MX50_PAD_ECSPI2_SS0__NANDF_CEN7		IOMUX_PAD(0x38C, 0xE0, 6, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_ECSPI2_SS0__WEIM_D11		IOMUX_PAD(0x38C, 0xE0, 7, 0x818, 1, NO_PAD_CTRL) - -#define MX50_PAD_SD1_CLK__SD1_CLK	IOMUX_PAD(0x390, 0xE4, IOMUX_CONFIG_SION, 0x0, 0, MX50_SD_PAD_CTRL) -#define MX50_PAD_SD1_CLK__GPIO_5_0	IOMUX_PAD(0x390, 0xE4, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_SD1_CLK__CLKO		IOMUX_PAD(0x390, 0xE4, 7, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_SD1_CMD__SD1_CMD	IOMUX_PAD(0x394, 0xE8, IOMUX_CONFIG_SION, 0x0, 0, MX50_SD_PAD_CTRL) -#define MX50_PAD_SD1_CMD__GPIO_5_1	IOMUX_PAD(0x394, 0xE8, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_SD1_CMD__CLKO2		IOMUX_PAD(0x394, 0xE8, 7, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_SD1_D0__SD1_D0		IOMUX_PAD(0x398, 0xEC, 0, 0x0, 0, MX50_SD_PAD_CTRL) -#define MX50_PAD_SD1_D0__GPIO_5_2	IOMUX_PAD(0x398, 0xEC, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_SD1_D0__PLL1_BYP	IOMUX_PAD(0x398, 0xEC, 7, 0x6dc, 0, NO_PAD_CTRL) - -#define MX50_PAD_SD1_D1__SD1_D1		IOMUX_PAD(0x39C, 0xF0, 0, 0x0, 0, MX50_SD_PAD_CTRL) -#define MX50_PAD_SD1_D1__GPIO_5_3	IOMUX_PAD(0x39C, 0xF0, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_SD1_D1__PLL2_BYP	IOMUX_PAD(0x39C, 0xF0, 7, 0x6e0, 0, NO_PAD_CTRL) - -#define MX50_PAD_SD1_D2__SD1_D2		IOMUX_PAD(0x3A0, 0xF4, 0, 0x0, 0, MX50_SD_PAD_CTRL) -#define MX50_PAD_SD1_D2__GPIO_5_4	IOMUX_PAD(0x3A0, 0xF4, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_SD1_D2__PLL3_BYP	IOMUX_PAD(0x3A0, 0xF4, 7, 0x6e4, 0, NO_PAD_CTRL) - -#define MX50_PAD_SD1_D3__SD1_D3		IOMUX_PAD(0x3A4, 0xF8, 0, 0x0, 0, MX50_SD_PAD_CTRL) -#define MX50_PAD_SD1_D3__GPIO_5_5	IOMUX_PAD(0x3A4, 0xF8, 1, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_SD2_CLK__SD2_CLK	IOMUX_PAD(0x3A8, 0xFC, IOMUX_CONFIG_SION, 0x0, 0, MX50_SD_PAD_CTRL) -#define MX50_PAD_SD2_CLK__GPIO_5_6	IOMUX_PAD(0x3A8, 0xFC, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_SD2_CLK__MSHC_SCLK	IOMUX_PAD(0x3A8, 0xFC, 2, 0x0, 0, MX50_SD_PAD_CTRL) - -#define MX50_PAD_SD2_CMD__SD2_CMD	IOMUX_PAD(0x3AC, 0x100, IOMUX_CONFIG_SION, 0x0, 0, MX50_SD_PAD_CTRL) -#define MX50_PAD_SD2_CMD__GPIO_5_7	IOMUX_PAD(0x3AC, 0x100, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_SD2_CMD__MSHC_BS	IOMUX_PAD(0x3AC, 0x100, 2, 0x0, 0, MX50_SD_PAD_CTRL) - -#define MX50_PAD_SD2_D0__SD2_D0		IOMUX_PAD(0x3B0, 0x104, 0, 0x0, 0, MX50_SD_PAD_CTRL) -#define MX50_PAD_SD2_D0__GPIO_5_8	IOMUX_PAD(0x3B0, 0x104, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_SD2_D0__MSHC_D0	IOMUX_PAD(0x3B0, 0x104, 2, 0x0, 0, MX50_SD_PAD_CTRL) -#define MX50_PAD_SD2_D0__KEY_COL4	IOMUX_PAD(0x3B0, 0x104, 3, 0x790, 0, NO_PAD_CTRL) - -#define MX50_PAD_SD2_D1__SD2_D1		IOMUX_PAD(0x3B4, 0x108, 0, 0x0, 0, MX50_SD_PAD_CTRL) -#define MX50_PAD_SD2_D1__GPIO_5_9	IOMUX_PAD(0x3B4, 0x108, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_SD2_D1__MSHC_D1	IOMUX_PAD(0x3B4, 0x108, 2, 0x0, 0, MX50_SD_PAD_CTRL) -#define MX50_PAD_SD2_D1__KEY_ROW4	IOMUX_PAD(0x3B4, 0x108, 3, 0x7a0, 0, NO_PAD_CTRL) - -#define MX50_PAD_SD2_D2__SD2_D2		IOMUX_PAD(0x3B8, 0x10C, 0, 0x0, 0, MX50_SD_PAD_CTRL) -#define MX50_PAD_SD2_D2__GPIO_5_10	IOMUX_PAD(0x3B8, 0x10C, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_SD2_D2__MSHC_D2	IOMUX_PAD(0x3B8, 0x10C, 2, 0x0, 0, MX50_SD_PAD_CTRL) -#define MX50_PAD_SD2_D2__KEY_COL5	IOMUX_PAD(0x3B8, 0x10C, 3, 0x794, 0, NO_PAD_CTRL) - -#define MX50_PAD_SD2_D3__SD2_D3		IOMUX_PAD(0x3BC, 0x110, 0, 0x0, 0, MX50_SD_PAD_CTRL) -#define MX50_PAD_SD2_D3__GPIO_5_11	IOMUX_PAD(0x3BC, 0x110, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_SD2_D3__MSHC_D3	IOMUX_PAD(0x3BC, 0x110, 2, 0x0, 0, MX50_SD_PAD_CTRL) -#define MX50_PAD_SD2_D3__KEY_ROW5	IOMUX_PAD(0x3BC, 0x110, 3, 0x7a4, 0, NO_PAD_CTRL) - -#define MX50_PAD_SD2_D4__SD2_D4		IOMUX_PAD(0x3C0, 0x114, 0, 0x0, 0, MX50_SD_PAD_CTRL) -#define MX50_PAD_SD2_D4__GPIO_5_12	IOMUX_PAD(0x3C0, 0x114, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_SD2_D4__AUD4_RXFS	IOMUX_PAD(0x3C0, 0x114, 2, 0x6d0, 0, NO_PAD_CTRL) -#define MX50_PAD_SD2_D4__KEY_COL6	IOMUX_PAD(0x3C0, 0x114, 3, 0x798, 0, NO_PAD_CTRL) -#define MX50_PAD_SD2_D4__WEIM_D0	IOMUX_PAD(0x3C0, 0x114, 4, 0x7ec, 0, NO_PAD_CTRL) -#define MX50_PAD_SD2_D4__CCM_OUT0	IOMUX_PAD(0x3C0, 0x114, 7, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_SD2_D5__SD2_D5		IOMUX_PAD(0x3C4, 0x118, 0, 0x0, 0, MX50_SD_PAD_CTRL) -#define MX50_PAD_SD2_D5__GPIO_5_13	IOMUX_PAD(0x3C4, 0x118, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_SD2_D5__AUD4_RXC	IOMUX_PAD(0x3C4, 0x118, 2, 0x6cc, 0, NO_PAD_CTRL) -#define MX50_PAD_SD2_D5__KEY_ROW6	IOMUX_PAD(0x3C4, 0x118, 3, 0x7a8, 0, NO_PAD_CTRL) -#define MX50_PAD_SD2_D5__WEIM_D1	IOMUX_PAD(0x3C4, 0x118, 4, 0x7f0, 0, NO_PAD_CTRL) -#define MX50_PAD_SD2_D5__CCM_OUT1	IOMUX_PAD(0x3C4, 0x118, 7, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_SD2_D6__SD2_D6		IOMUX_PAD(0x3C8, 0x11C, 0, 0x0, 0, MX50_SD_PAD_CTRL) -#define MX50_PAD_SD2_D6__GPIO_5_14	IOMUX_PAD(0x3C8, 0x11C, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_SD2_D6__AUD4_RXD	IOMUX_PAD(0x3C8, 0x11C, 2, 0x6c4, 0, NO_PAD_CTRL) -#define MX50_PAD_SD2_D6__KEY_COL7	IOMUX_PAD(0x3C8, 0x11C, 3, 0x79c, 0, NO_PAD_CTRL) -#define MX50_PAD_SD2_D6__WEIM_D2	IOMUX_PAD(0x3C8, 0x11C, 4, 0x7f4, 0, NO_PAD_CTRL) -#define MX50_PAD_SD2_D6__CCM_OUT2	IOMUX_PAD(0x3C8, 0x11C, 7, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_SD2_D7__SD2_D7		IOMUX_PAD(0x3CC, 0x120, 0, 0x0, 0, MX50_SD_PAD_CTRL) -#define MX50_PAD_SD2_D7__GPIO_5_15	IOMUX_PAD(0x3CC, 0x120, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_SD2_D7__AUD4_TXFS	IOMUX_PAD(0x3CC, 0x120, 2, 0x6d8, 0, NO_PAD_CTRL) -#define MX50_PAD_SD2_D7__KEY_ROW7	IOMUX_PAD(0x3CC, 0x120, 3, 0x7ac, 0, NO_PAD_CTRL) -#define MX50_PAD_SD2_D7__WEIM_D3	IOMUX_PAD(0x3CC, 0x120, 4, 0x7f8, 0, NO_PAD_CTRL) -#define MX50_PAD_SD2_D7__CCM_STOP	IOMUX_PAD(0x3CC, 0x120, 7, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_SD2_WP__SD2_WP		IOMUX_PAD(0x3D0, 0x124, 0, 0x744, 1, MX50_SD_PAD_CTRL) -#define MX50_PAD_SD2_WP__GPIO_5_16	IOMUX_PAD(0x3D0, 0x124, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_SD2_WP__AUD4_TXD	IOMUX_PAD(0x3D0, 0x124, 2, 0x6c8, 0, NO_PAD_CTRL) -#define MX50_PAD_SD2_WP__WEIM_D4	IOMUX_PAD(0x3D0, 0x124, 4, 0x7fc, 0, NO_PAD_CTRL) -#define MX50_PAD_SD2_WP__CCM_WAIT	IOMUX_PAD(0x3D0, 0x124, 7, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_SD2_CD__SD2_CD		IOMUX_PAD(0x3D4, 0x128, 0, 0x740, 1, MX50_SD_PAD_CTRL) -#define MX50_PAD_SD2_CD__GPIO_5_17	IOMUX_PAD(0x3D4, 0x128, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_SD2_CD__AUD4_TXC	IOMUX_PAD(0x3D4, 0x128, 2, 0x6d4, 0, NO_PAD_CTRL) -#define MX50_PAD_SD2_CD__WEIM_D5	IOMUX_PAD(0x3D4, 0x128, 4, 0x800, 0, NO_PAD_CTRL) -#define MX50_PAD_SD2_CD__CCM_REF_EN	IOMUX_PAD(0x3D4, 0x128, 7, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_PMIC_ON_REQ__PMIC_ON_REQ	IOMUX_PAD(0x3D8, 0, 0, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_PMIC_STBY_REQ__PMIC_STBY_REQ	IOMUX_PAD(0x3DC, 0, 0, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_PMIC_PORT_B__PMIC_PORT_B	IOMUX_PAD(0x3E0, 0, 0, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_PMIC_BOOT_MODE1__PMIC_BOOT_MODE1	IOMUX_PAD(0x3E4, 0, 0, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_PMIC_RESET_IN_B__PMIC_RESET_IN_B	IOMUX_PAD(0x3E8, 0, 0, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_PMIC_BOOT_MODE0__PMIC_BOOT_MODE0	IOMUX_PAD(0x3EC, 0, 0, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_PMIC_TEST_MODE__PMIC_TEST_MODE	IOMUX_PAD(0x3F0, 0, 0, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_PMIC_JTAG_TMS__PMIC_JTAG_TMS	IOMUX_PAD(0x3F4, 0, 0, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_PMIC_JTAG_MOD__PMIC_JTAG_MOD	IOMUX_PAD(0x3F8, 0, 0, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_PMIC_JTAG_TRSTB__PMIC_JTAG_TRSTB	IOMUX_PAD(0x3FC, 0, 0, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_PMIC_JTAG_TDI__PMIC_JTAG_TDI	IOMUX_PAD(0x400, 0, 0, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_PMIC_JTAG_TCK__PMIC_JTAG_TCK	IOMUX_PAD(0x404, 0, 0, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_PMIC_JTAG_TDO__PMIC_JTAG_TDO	IOMUX_PAD(0x408, 0, 0, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_DISP_D0__DISP_D0	IOMUX_PAD(0x40C, 0x12C, 0, 0x6fc, 0, MX50_ELCDIF_PAD_CTRL) -#define MX50_PAD_DISP_D0__GPIO_2_0	IOMUX_PAD(0x40C, 0x12C, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_DISP_D0__FEC_TXCLK	IOMUX_PAD(0x40C, 0x12C, 2, 0x78c, 0, PAD_CTL_HYS | PAD_CTL_PKE) - -#define MX50_PAD_DISP_D1__DISP_D1	IOMUX_PAD(0x410, 0x130, 0, 0x700, 0, MX50_ELCDIF_PAD_CTRL) -#define MX50_PAD_DISP_D1__GPIO_2_1	IOMUX_PAD(0x410, 0x130, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_DISP_D1__FEC_RX_ER	IOMUX_PAD(0x410, 0x130, 2, 0x788, 0, PAD_CTL_HYS | PAD_CTL_PKE) -#define MX50_PAD_DISP_D1__WEIM_A17	IOMUX_PAD(0x410, 0x130, 3, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_DISP_D2__DISP_D2	IOMUX_PAD(0x414, 0x134, 0, 0x704, 0, MX50_ELCDIF_PAD_CTRL) -#define MX50_PAD_DISP_D2__GPIO_2_2	IOMUX_PAD(0x414, 0x134, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_DISP_D2__FEC_RX_DV	IOMUX_PAD(0x414, 0x134, 2, 0x784, 0, PAD_CTL_HYS | PAD_CTL_PKE) -#define MX50_PAD_DISP_D2__WEIM_A18	IOMUX_PAD(0x414, 0x134, 3, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_DISP_D3__DISP_D3	IOMUX_PAD(0x418, 0x138, 0, 0x708, 0, MX50_ELCDIF_PAD_CTRL) -#define MX50_PAD_DISP_D3__GPIO_2_3	IOMUX_PAD(0x418, 0x138, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_DISP_D3__FEC_RXD1	IOMUX_PAD(0x418, 0x138, 2, 0x77C, 0, PAD_CTL_HYS | PAD_CTL_PKE) -#define MX50_PAD_DISP_D3__WEIM_A19	IOMUX_PAD(0x418, 0x138, 3, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_DISP_D3__FEC_COL	IOMUX_PAD(0x418, 0x138, 4, 0x770, 1, NO_PAD_CTRL) - -#define MX50_PAD_DISP_D4__DISP_D4	IOMUX_PAD(0x41C, 0x13C, 0, 0x70c, 0, MX50_ELCDIF_PAD_CTRL) -#define MX50_PAD_DISP_D4__GPIO_2_4	IOMUX_PAD(0x41C, 0x13C, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_DISP_D4__FEC_RXD0	IOMUX_PAD(0x41C, 0x13C, 2, 0x778, 0, PAD_CTL_HYS | PAD_CTL_PKE) -#define MX50_PAD_DISP_D4__WEIM_A20	IOMUX_PAD(0x41C, 0x13C, 3, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_DISP_D5__DISP_D5	IOMUX_PAD(0x420, 0x140, 0, 0x710, 0, MX50_ELCDIF_PAD_CTRL) -#define MX50_PAD_DISP_D5__GPIO_2_5	IOMUX_PAD(0x420, 0x140, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_DISP_D5__FEC_TX_EN	IOMUX_PAD(0x420, 0x140, 2, 0x0, 0, PAD_CTL_DSE_HIGH) -#define MX50_PAD_DISP_D5__WEIM_A21	IOMUX_PAD(0x420, 0x140, 3, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_DISP_D6__DISP_D6	IOMUX_PAD(0x424, 0x144, 0, 0x714, 0, MX50_ELCDIF_PAD_CTRL) -#define MX50_PAD_DISP_D6__GPIO_2_6	IOMUX_PAD(0x424, 0x144, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_DISP_D6__FEC_TXD1	IOMUX_PAD(0x424, 0x144, 2, 0x0, 0, PAD_CTL_DSE_HIGH) -#define MX50_PAD_DISP_D6__WEIM_A22	IOMUX_PAD(0x424, 0x144, 3, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_DISP_D6__FEC_RX_CLK	IOMUX_PAD(0x424, 0x144, 4, 0x780, 1, NO_PAD_CTRL) - -#define MX50_PAD_DISP_D7__DISP_D7	IOMUX_PAD(0x428, 0x148, 0, 0x718, 0, MX50_ELCDIF_PAD_CTRL) -#define MX50_PAD_DISP_D7__GPIO_2_7	IOMUX_PAD(0x428, 0x148, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_DISP_D7__FEC_TXD0	IOMUX_PAD(0x428, 0x148, 2, 0x0, 0, PAD_CTL_DSE_HIGH) -#define MX50_PAD_DISP_D7__WEIM_A23	IOMUX_PAD(0x428, 0x148, 3, 0x0, 0, NO_PAD_CTRL) - - -#define MX50_PAD_DISP_WR__ELCDIF_WR	IOMUX_PAD(0x42C, 0x14C, 0, 0x0, 0, MX50_ELCDIF_PAD_CTRL) -#define MX50_PAD_DISP_WR__GPIO_2_16	IOMUX_PAD(0x42C, 0x14C, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_DISP_WR__ELCDIF_PIXCLK	IOMUX_PAD(0x42C, 0x14C, 2, 0x0, 0, MX50_ELCDIF_PAD_CTRL) -#define MX50_PAD_DISP_WR__WEIM_A24	IOMUX_PAD(0x42C, 0x14C, 3, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_DISP_RD__ELCDIF_RD	IOMUX_PAD(0x430, 0x150, 0, 0x0, 0, MX50_ELCDIF_PAD_CTRL) -#define MX50_PAD_DISP_RD__GPIO_2_19	IOMUX_PAD(0x430, 0x150, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_DISP_RD__ELCDIF_EN	IOMUX_PAD(0x430, 0x150, 2, 0x0, 0, MX50_ELCDIF_PAD_CTRL) -#define MX50_PAD_DISP_RD__WEIM_A25	IOMUX_PAD(0x430, 0x150, 3, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_DISP_RS__ELCDIF_RS	IOMUX_PAD(0x434, 0x154, 0, 0x0, 0, MX50_ELCDIF_PAD_CTRL) -#define MX50_PAD_DISP_RS__GPIO_2_17	IOMUX_PAD(0x434, 0x154, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_DISP_RS__ELCDIF_VSYNC	IOMUX_PAD(0x434, 0x154, 2, 0x73c, 1, MX50_ELCDIF_PAD_CTRL) -#define MX50_PAD_DISP_RS__WEIM_A26	IOMUX_PAD(0x434, 0x154, 3, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_DISP_CS__ELCDIF_CS	IOMUX_PAD(0x438, 0x158, 0, 0x0, 0, MX50_ELCDIF_PAD_CTRL) -#define MX50_PAD_DISP_CS__GPIO_2_21	IOMUX_PAD(0x438, 0x158, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_DISP_CS__ELCDIF_HSYNC	IOMUX_PAD(0x438, 0x158, 2, 0x6f8, 1, MX50_ELCDIF_PAD_CTRL) -#define MX50_PAD_DISP_CS__WEIM_A27	IOMUX_PAD(0x438, 0x158, 3, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_DISP_CS__WEIM_CS3	IOMUX_PAD(0x438, 0x158, 4, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_DISP_BUSY__ELCDIF_HSYNC	IOMUX_PAD(0x43C, 0x15C, 0, 0x6f8, 2, MX50_ELCDIF_PAD_CTRL) -#define MX50_PAD_DISP_BUSY__GPIO_2_18		IOMUX_PAD(0x43C, 0x15C, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_DISP_BUSY__WEIM_CS3		IOMUX_PAD(0x43C, 0x15C, 3, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_DISP_RESET__ELCDIF_RST	IOMUX_PAD(0x440, 0x160, 0, 0x0, 0, MX50_ELCDIF_PAD_CTRL) -#define MX50_PAD_DISP_RESET__GPIO_2_20	IOMUX_PAD(0x440, 0x160, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_DISP_RESET__WEIM_CS3	IOMUX_PAD(0x440, 0x160, 4, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_SD3_CMD__SD3_CMD	IOMUX_PAD(0x444, 0x164, 0, 0x0, 0, MX50_SD_PAD_CTRL) -#define MX50_PAD_SD3_CMD__GPIO_5_18	IOMUX_PAD(0x444, 0x164, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PIN_SD3_CMD__NANDF_WRN	IOMUX_PAD(0x444, 0x164, 2, 0x0, 0, PAD_CTL_DSE_HIGH) -#define MX50_PAD_SD3_CMD__SSP_CMD	IOMUX_PAD(0x444, 0x164, 3, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_SD3_CLK__SD3_CLK	IOMUX_PAD(0x448, 0x168, 0, 0x0, 0, MX50_SD_PAD_CTRL) -#define MX50_PAD_SD3_CLK__GPIO_5_19	IOMUX_PAD(0x448, 0x168, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PIN_SD3_CLK__NANDF_RDN	IOMUX_PAD(0x448, 0x168, 2, 0x0, 0, PAD_CTL_DSE_HIGH) -#define MX50_PAD_SD3_CLK__SSP_CLK	IOMUX_PAD(0x448, 0x168, 3, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_SD3_D0__SD3_D0		IOMUX_PAD(0x44C, 0x16C, 0, 0x0, 0, MX50_SD_PAD_CTRL) -#define MX50_PAD_SD3_D0__GPIO_5_20	IOMUX_PAD(0x44C, 0x16C, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PIN_SD3_D0__NANDF_D4	IOMUX_PAD(0x44C, 0x16C, 2, 0x0, 0, PAD_CTL_DSE_HIGH) -#define MX50_PAD_SD3_D0__SSP_D0		IOMUX_PAD(0x44C, 0x16C, 3, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_SD3_D0__PLL1_BYP	IOMUX_PAD(0x44C, 0x16C, 7, 0x6dc, 1, NO_PAD_CTRL) - -#define MX50_PAD_SD3_D1__SD3_D1		IOMUX_PAD(0x450, 0x170, 0, 0x0, 0, MX50_SD_PAD_CTRL) -#define MX50_PAD_SD3_D1__GPIO_5_21	IOMUX_PAD(0x450, 0x170, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PIN_SD3_D1__NANDF_D5	IOMUX_PAD(0x450, 0x170, 2, 0x0, 0, PAD_CTL_DSE_HIGH) -#define MX50_PAD_SD3_D1__PLL2_BYP	IOMUX_PAD(0x450, 0x170, 7, 0x6e0, 1, NO_PAD_CTRL) - -#define MX50_PAD_SD3_D2__SD3_D2		IOMUX_PAD(0x454, 0x174, 0, 0x0, 0, MX50_SD_PAD_CTRL) -#define MX50_PAD_SD3_D2__GPIO_5_22	IOMUX_PAD(0x454, 0x174, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PIN_SD3_D2__NANDF_D6	IOMUX_PAD(0x454, 0x174, 2, 0x0, 0, PAD_CTL_DSE_HIGH) -#define MX50_PAD_SD3_D2__SSP_D2		IOMUX_PAD(0x454, 0x174, 3, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_SD3_D2__PLL3_BYP	IOMUX_PAD(0x454, 0x174, 7, 0x6e4, 1, NO_PAD_CTRL) - -#define MX50_PAD_SD3_D3__SD3_D3		IOMUX_PAD(0x458, 0x178, 0, 0x0, 0, MX50_SD_PAD_CTRL) -#define MX50_PAD_SD3_D3__GPIO_5_23	IOMUX_PAD(0x458, 0x178, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PIN_SD3_D3__NANDF_D7	IOMUX_PAD(0x458, 0x178, 2, 0x0, 0, PAD_CTL_DSE_HIGH) -#define MX50_PAD_SD3_D3__SSP_D3		IOMUX_PAD(0x458, 0x178, 3, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_SD3_D4__SD3_D4		IOMUX_PAD(0x45C, 0x17C, 0, 0x0, 0, MX50_SD_PAD_CTRL) -#define MX50_PAD_SD3_D4__GPIO_5_24	IOMUX_PAD(0x45C, 0x17C, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PIN_SD3_D4__NANDF_D0	IOMUX_PAD(0x45C, 0x17C, 2, 0x0, 0, PAD_CTL_DSE_HIGH) -#define MX50_PAD_SD3_D4__SSP_D4		IOMUX_PAD(0x45C, 0x17C, 1, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_SD3_D5__SD3_D5		IOMUX_PAD(0x460, 0x180, 0, 0x0, 0, MX50_SD_PAD_CTRL) -#define MX50_PAD_SD3_D5__GPIO_5_25	IOMUX_PAD(0x460, 0x180, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PIN_SD3_D5__NANDF_D1	IOMUX_PAD(0x460, 0x180, 2, 0x0, 0, PAD_CTL_DSE_HIGH) -#define MX50_PAD_SD3_D5__SSP_D5		IOMUX_PAD(0x460, 0x180, 3, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_SD3_D6__SD3_D6		IOMUX_PAD(0x464, 0x184, 0, 0x0, 0, MX50_SD_PAD_CTRL) -#define MX50_PAD_SD3_D6__GPIO_5_26	IOMUX_PAD(0x464, 0x184, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PIN_SD3_D6__NANDF_D2	IOMUX_PAD(0x464, 0x184, 2, 0x0, 0, PAD_CTL_DSE_HIGH) -#define MX50_PAD_SD3_D6__SSP_D6		IOMUX_PAD(0x464, 0x184, 3, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_SD3_D7__SD3_D7		IOMUX_PAD(0x468, 0x188, 0, 0x0, 0, MX50_SD_PAD_CTRL) -#define MX50_PAD_SD3_D7__GPIO_5_27	IOMUX_PAD(0x468, 0x188, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PIN_SD3_D7__NANDF_D3	IOMUX_PAD(0x468, 0x188, 2, 0x0, 0, PAD_CTL_DSE_HIGH) -#define MX50_PAD_SD3_D7__SSP_D7		IOMUX_PAD(0x468, 0x188, 3, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_SD3_WP__SD3_WP		IOMUX_PAD(0x46C, 0x18C, 0, 0x0, 0, MX50_SD_PAD_CTRL) -#define MX50_PAD_SD3_WP__GPIO_5_28	IOMUX_PAD(0x46C, 0x18C, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PIN_SD3_WP__NANDF_RESETN	IOMUX_PAD(0x46C, 0x18C, 2, 0x0, 0, PAD_CTL_DSE_HIGH) -#define MX50_PAD_SD3_WP__SSP_CD		IOMUX_PAD(0x46C, 0x18C, 3, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_SD3_WP__SD4_LCTL	IOMUX_PAD(0x46C, 0x18C, 4, 0x0, 0, MX50_SD_PAD_CTRL) -#define MX50_PAD_SD3_WP__WEIM_CS3	IOMUX_PAD(0x46C, 0x18C, 5, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_DISP_D8__DISP_D8	IOMUX_PAD(0x470, 0x190, 0, 0x71c, 0, MX50_ELCDIF_PAD_CTRL) -#define MX50_PAD_DISP_D8__GPIO_2_8	IOMUX_PAD(0x470, 0x190, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_DISP_D8__NANDF_CLE	IOMUX_PAD(0x470, 0x190, 2, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_DISP_D8__SD1_LCTL	IOMUX_PAD(0x470, 0x190, 3, 0x0, 0, MX50_SD_PAD_CTRL) -#define MX50_PAD_DISP_D8__SD4_CMD	IOMUX_PAD(0x470, 0x190, 4, 0x74c, 2, MX50_SD_PAD_CTRL) -#define MX50_PAD_DISP_D8__KEY_COL4	IOMUX_PAD(0x470, 0x190, 5, 0x790, 1, NO_PAD_CTRL) -#define MX50_PAD_DISP_D8__FEC_TX_CLK	IOMUX_PAD(0x470, 0x190, 6, 0x78c, 1, NO_PAD_CTRL) - -#define MX50_PAD_DISP_D9__DISP_D9	IOMUX_PAD(0x474, 0x194, 0, 0x720, 0, MX50_ELCDIF_PAD_CTRL) -#define MX50_PAD_DISP_D9__GPIO_2_9	IOMUX_PAD(0x474, 0x194, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_DISP_D9__NANDF_ALE	IOMUX_PAD(0x474, 0x194, 2, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_DISP_D9__SD2_LCTL	IOMUX_PAD(0x474, 0x194, 3, 0x0, 0, MX50_SD_PAD_CTRL) -#define MX50_PAD_DISP_D9__SD4_CLK	IOMUX_PAD(0x474, 0x194, 4, 0x748, 2, MX50_SD_PAD_CTRL) -#define MX50_PAD_DISP_D9__KEY_ROW4	IOMUX_PAD(0x474, 0x194, 5, 0x7a0, 1, NO_PAD_CTRL) -#define MX50_PAD_DISP_D9__FEC_RX_ER	IOMUX_PAD(0x474, 0x194, 6, 0x788, 1, NO_PAD_CTRL) - -#define MX50_PAD_DISP_D10__DISP_D10	IOMUX_PAD(0x478, 0x198, 0, 0x724, 0, MX50_ELCDIF_PAD_CTRL) -#define MX50_PAD_DISP_D10__GPIO_2_10	IOMUX_PAD(0x478, 0x198, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_DISP_D10__NANDF_CEN0	IOMUX_PAD(0x478, 0x198, 2, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_DISP_D10__SD3_LCTL	IOMUX_PAD(0x478, 0x198, 3, 0x0, 0, MX50_SD_PAD_CTRL) -#define MX50_PAD_DISP_D10__SD4_D0	IOMUX_PAD(0x478, 0x198, 4, 0x750, 1, MX50_SD_PAD_CTRL) -#define MX50_PAD_DISP_D10__KEY_COL5	IOMUX_PAD(0x478, 0x198, 5, 0x794, 1, NO_PAD_CTRL) -#define MX50_PAD_DISP_D10__FEC_RX_DV	IOMUX_PAD(0x478, 0x198, 6, 0x784, 1, NO_PAD_CTRL) - -#define MX50_PAD_DISP_D11__DISP_D11	IOMUX_PAD(0x47C, 0x19C, 0, 0x728, 0, MX50_ELCDIF_PAD_CTRL) -#define MX50_PAD_DISP_D11__GPIO_2_11	IOMUX_PAD(0x47C, 0x19C, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_DISP_D11__NANDF_CEN1	IOMUX_PAD(0x47C, 0x19C, 2, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_DISP_D11__SD4_D1	IOMUX_PAD(0x47C, 0x19C, 4, 0x754, 1, MX50_SD_PAD_CTRL) -#define MX50_PAD_DISP_D11__KEY_ROW5	IOMUX_PAD(0x47C, 0x19C, 5, 0x7a4, 1, NO_PAD_CTRL) -#define MX50_PAD_DISP_D11__FEC_RDAT1	IOMUX_PAD(0x47C, 0x19C, 6, 0x77c, 1, NO_PAD_CTRL) - -#define MX50_PAD_DISP_D12__DISP_D12	IOMUX_PAD(0x480, 0x1A0, 0, 0x72c, 0, MX50_ELCDIF_PAD_CTRL) -#define MX50_PAD_DISP_D12__GPIO_2_12	IOMUX_PAD(0x480, 0x1A0, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_DISP_D12__NANDF_CEN2	IOMUX_PAD(0x480, 0x1A0, 2, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_DISP_D12__SD1_CD	IOMUX_PAD(0x480, 0x1A0, 3, 0x0, 0, MX50_SD_PAD_CTRL) -#define MX50_PAD_DISP_D12__SD4_D2	IOMUX_PAD(0x480, 0x1A0, 4, 0x758, 1, MX50_SD_PAD_CTRL) -#define MX50_PAD_DISP_D12__KEY_COL6	IOMUX_PAD(0x480, 0x1A0, 5, 0x798, 1, NO_PAD_CTRL) -#define MX50_PAD_DISP_D12__FEC_RDAT0	IOMUX_PAD(0x480, 0x1A0, 6, 0x778, 1, NO_PAD_CTRL) - -#define MX50_PAD_DISP_D13__DISP_D13	IOMUX_PAD(0x484, 0x1A4, 0, 0x730, 0, MX50_ELCDIF_PAD_CTRL) -#define MX50_PAD_DISP_D13__GPIO_2_13	IOMUX_PAD(0x484, 0x1A4, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_DISP_D13__NANDF_CEN3	IOMUX_PAD(0x484, 0x1A4, 2, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_DISP_D13__SD3_CD	IOMUX_PAD(0x484, 0x1A4, 3, 0x0, 0, MX50_SD_PAD_CTRL) -#define MX50_PAD_DISP_D13__SD4_D3	IOMUX_PAD(0x484, 0x1A4, 4, 0x75c, 1, MX50_SD_PAD_CTRL) -#define MX50_PAD_DISP_D13__KEY_ROW6	IOMUX_PAD(0x484, 0x1A4, 5, 0x7a8, 1, NO_PAD_CTRL) -#define MX50_PAD_DISP_D13__FEC_TX_EN	IOMUX_PAD(0x484, 0x1A4, 6, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_DISP_D14__DISP_D14	IOMUX_PAD(0x488, 0x1A8, 0, 0x734, 0, MX50_ELCDIF_PAD_CTRL) -#define MX50_PAD_DISP_D14__GPIO_2_14	IOMUX_PAD(0x488, 0x1A8, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_DISP_D14__NANDF_RDY0	IOMUX_PAD(0x488, 0x1A8, 2, 0x7b4, 1, NO_PAD_CTRL) -#define MX50_PAD_DISP_D14__SD1_WP	IOMUX_PAD(0x488, 0x1A8, 3, 0x0, 0, MX50_SD_PAD_CTRL) -#define MX50_PAD_DISP_D14__SD4_WP	IOMUX_PAD(0x488, 0x1A8, 4, 0x0, 0, MX50_SD_PAD_CTRL) -#define MX50_PAD_DISP_D14__KEY_COL7	IOMUX_PAD(0x488, 0x1A8, 5, 0x79c, 1, NO_PAD_CTRL) -#define MX50_PAD_DISP_D14__FEC_TDAT1	IOMUX_PAD(0x488, 0x1A8, 6, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_DISP_D15__DISP_D15	IOMUX_PAD(0x48C, 0x1AC, 0, 0x738, 0, MX50_ELCDIF_PAD_CTRL) -#define MX50_PAD_DISP_D15__GPIO_2_15	IOMUX_PAD(0x48C, 0x1AC, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_DISP_D15__NANDF_DQS	IOMUX_PAD(0x48C, 0x1AC, 2, 0x7b0, 1, NO_PAD_CTRL) -#define MX50_PAD_DISP_D15__SD3_RST	IOMUX_PAD(0x48C, 0x1AC, 3, 0x0, 0, MX50_SD_PAD_CTRL) -#define MX50_PAD_DISP_D15__SD4_CD	IOMUX_PAD(0x48C, 0x1AC, 4, 0x0, 0, MX50_SD_PAD_CTRL) -#define MX50_PAD_DISP_D15__KEY_ROW7	IOMUX_PAD(0x48C, 0x1AC, 5, 0x7ac, 1, NO_PAD_CTRL) -#define MX50_PAD_DISP_D15__FEC_TDAT0	IOMUX_PAD(0x48C, 0x1AC, 6, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_EPDC_D0__EPDC_D0	IOMUX_PAD(0x54C, 0x1B0, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_D0__GPIO_3_0	IOMUX_PAD(0x54C, 0x1B0, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_D0__WEIM_D0	IOMUX_PAD(0x54C, 0x1B0, 2, 0x7ec, 1, NO_PAD_CTRL) -#define MX50_PAD_EPDC_D0__ELCDIF_RS	IOMUX_PAD(0x54C, 0x1B0, 3, 0x0, 0, MX50_ELCDIF_PAD_CTRL) -#define MX50_PAD_EPDC_D0__ELCDIF_PIXCLK	IOMUX_PAD(0x54C, 0x1B0, 4, 0x0, 0, MX50_ELCDIF_PAD_CTRL) - -#define MX50_PAD_EPDC_D1__EPDC_D1	IOMUX_PAD(0x550, 0x1B4, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_D1__GPIO_3_1	IOMUX_PAD(0x550, 0x1B4, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_D1__WEIM_D1	IOMUX_PAD(0x550, 0x1B4, 2, 0x7f0, 1, NO_PAD_CTRL) -#define MX50_PAD_EPDC_D1__ELCDIF_CS	IOMUX_PAD(0x550, 0x1B4, 3, 0x0, 0, MX50_ELCDIF_PAD_CTRL) -#define MX50_PAD_EPDC_D1__ELCDIF_EN	IOMUX_PAD(0x550, 0x1B4, 4, 0x0, 0, MX50_ELCDIF_PAD_CTRL) - -#define MX50_PAD_EPDC_D2__EPDC_D2	IOMUX_PAD(0x554, 0x1B8, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_D2__GPIO_3_2	IOMUX_PAD(0x554, 0x1B8, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_D2__WEIM_D2	IOMUX_PAD(0x554, 0x1B8, 2, 0x7f4, 1, NO_PAD_CTRL) -#define MX50_PAD_EPDC_D2__ELCDIF_WR	IOMUX_PAD(0x554, 0x1B8, 3, 0x0, 0, MX50_ELCDIF_PAD_CTRL) -#define MX50_PAD_EPDC_D2__ELCDIF_VSYNC	IOMUX_PAD(0x554, 0x1B8, 4, 0x73c, 2, MX50_ELCDIF_PAD_CTRL) - -#define MX50_PAD_EPDC_D3__EPDC_D3	IOMUX_PAD(0x558, 0x1BC, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_D3__GPIO_3_3	IOMUX_PAD(0x558, 0x1BC, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_D3__WEIM_D3	IOMUX_PAD(0x558, 0x1BC, 2, 0x7f8, 1, NO_PAD_CTRL) -#define MX50_PAD_EPDC_D3__ELCDIF_RD	IOMUX_PAD(0x558, 0x1BC, 3, 0x0, 0, MX50_ELCDIF_PAD_CTRL) -#define MX50_PAD_EPDC_D3__ELCDIF_HSYNC	IOMUX_PAD(0x558, 0x1BC, 4, 0x6f8, 3, MX50_ELCDIF_PAD_CTRL) - -#define MX50_PAD_EPDC_D4__EPDC_D4	IOMUX_PAD(0x55C, 0x1C0, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_D4__GPIO_3_4	IOMUX_PAD(0x55C, 0x1C0, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_D4__WEIM_D4	IOMUX_PAD(0x55C, 0x1C0, 2, 0x7fc, 1, NO_PAD_CTRL) - -#define MX50_PAD_EPDC_D5__EPDC_D5	IOMUX_PAD(0x560, 0x1C4, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_D5__GPIO_3_5	IOMUX_PAD(0x560, 0x1C4, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_D5__WEIM_D5	IOMUX_PAD(0x560, 0x1C4, 2, 0x800, 1, NO_PAD_CTRL) - -#define MX50_PAD_EPDC_D6__EPDC_D6	IOMUX_PAD(0x564, 0x1C8, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_D6__GPIO_3_6	IOMUX_PAD(0x564, 0x1C8, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_D6__WEIM_D6	IOMUX_PAD(0x564, 0x1C8, 2, 0x804, 1, NO_PAD_CTRL) - -#define MX50_PAD_EPDC_D7__EPDC_D7	IOMUX_PAD(0x568, 0x1CC, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_D7__GPIO_3_7	IOMUX_PAD(0x568, 0x1CC, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_D7__WEIM_D7	IOMUX_PAD(0x568, 0x1CC, 2, 0x808, 1, NO_PAD_CTRL) - -#define MX50_PAD_EPDC_D8__EPDC_D8	IOMUX_PAD(0x56C, 0x1D0, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_D8__GPIO_3_8	IOMUX_PAD(0x56C, 0x1D0, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_D8__WEIM_D8	IOMUX_PAD(0x56C, 0x1D0, 2, 0x80c, 2, NO_PAD_CTRL) -#define MX50_PAD_EPDC_D8__ELCDIF_D24	IOMUX_PAD(0x56C, 0x1D0, 3, 0x0, 0, MX50_ELCDIF_PAD_CTRL) - -#define MX50_PAD_EPDC_D9__EPDC_D9	IOMUX_PAD(0x570, 0x1D4, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_D9__GPIO_3_9	IOMUX_PAD(0x570, 0x1D4, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_D9__WEIM_D9	IOMUX_PAD(0x570, 0x1D4, 2, 0x810, 2, NO_PAD_CTRL) -#define MX50_PAD_EPDC_D9__ELCDIF_D25	IOMUX_PAD(0x570, 0x1D4, 3, 0x0, 0, MX50_ELCDIF_PAD_CTRL) - -#define MX50_PAD_EPDC_D10__EPDC_D10	IOMUX_PAD(0x574, 0x1D8, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_D10__GPIO_3_10	IOMUX_PAD(0x574, 0x1D8, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_D10__WEIM_D10	IOMUX_PAD(0x574, 0x1D8, 2, 0x814, 2, NO_PAD_CTRL) -#define MX50_PAD_EPDC_D10__ELCDIF_D26	IOMUX_PAD(0x574, 0x1D8, 3, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_EPDC_D11__EPDC_D11	IOMUX_PAD(0x578, 0x1DC, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_D11__GPIO_3_11	IOMUX_PAD(0x578, 0x1DC, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_D11__WEIM_D11	IOMUX_PAD(0x578, 0x1DC, 2, 0x818, 2, NO_PAD_CTRL) -#define MX50_PAD_EPDC_D11__ELCDIF_D27	IOMUX_PAD(0x578, 0x1DC, 3, 0x0, 0, MX50_ELCDIF_PAD_CTRL) - -#define MX50_PAD_EPDC_D12__EPDC_D12	IOMUX_PAD(0x57C, 0x1E0, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_D12__GPIO_3_12	IOMUX_PAD(0x57C, 0x1E0, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_D12__WEIM_D12	IOMUX_PAD(0x57C, 0x1E0, 2, 0x81c, 1, NO_PAD_CTRL) -#define MX50_PAD_EPDC_D12__ELCDIF_D28	IOMUX_PAD(0x57C, 0x1E0, 3, 0x0, 0, MX50_ELCDIF_PAD_CTRL) - -#define MX50_PAD_EPDC_D13__EPDC_D13	IOMUX_PAD(0x580, 0x1E4, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_D13__GPIO_3_13	IOMUX_PAD(0x580, 0x1E4, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_D13__WEIM_D13	IOMUX_PAD(0x580, 0x1E4, 2, 0x820, 1, NO_PAD_CTRL) -#define MX50_PAD_EPDC_D13__ELCDIF_D29	IOMUX_PAD(0x580, 0x1E4, 3, 0x0, 0, MX50_ELCDIF_PAD_CTRL) - -#define MX50_PAD_EPDC_D14__EPDC_D14	IOMUX_PAD(0x584, 0x1E8, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_D14__GPIO_3_14	IOMUX_PAD(0x584, 0x1E8, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_D14__WEIM_D14	IOMUX_PAD(0x584, 0x1E8, 2, 0x824, 1, NO_PAD_CTRL) -#define MX50_PAD_EPDC_D14__ELCDIF_D30	IOMUX_PAD(0x584, 0x1E8, 3, 0x0, 0, MX50_ELCDIF_PAD_CTRL) -#define MX50_PAD_EPDC_D14__AUD6_TXD	IOMUX_PAD(0x584, 0x1E8, 4, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_EPDC_D15__EPDC_D15	IOMUX_PAD(0x588, 0x1EC, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_D15__GPIO_3_15	IOMUX_PAD(0x588, 0x1EC, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_D15__WEIM_D15	IOMUX_PAD(0x588, 0x1EC, 2, 0x828, 1, NO_PAD_CTRL) -#define MX50_PAD_EPDC_D15__ELCDIF_D31	IOMUX_PAD(0x588, 0x1EC, 3, 0x0, 0, MX50_ELCDIF_PAD_CTRL) -#define MX50_PAD_EPDC_D15__AUD6_TXC	IOMUX_PAD(0x588, 0x1EC, 4, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_EPDC_GDCLK__EPDC_GDCLK	IOMUX_PAD(0x58C, 0x1F0, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_GDCLK__GPIO_3_16	IOMUX_PAD(0x58C, 0x1F0, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_GDCLK__WEIM_D16	IOMUX_PAD(0x58C, 0x1F0, 2, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_GDCLK__ELCDIF_D16	IOMUX_PAD(0x58C, 0x1F0, 3, 0x0, 0, MX50_ELCDIF_PAD_CTRL) -#define MX50_PAD_EPDC_GDCLK__AUD6_TXFS	IOMUX_PAD(0x58C, 0x1F0, 4, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_EPDC_GDSP__EPDC_GDSP	IOMUX_PAD(0x590, 0x1F4, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_GDSP__GPIO_3_17	IOMUX_PAD(0x590, 0x1F4, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_GDSP__WEIM_D17	IOMUX_PAD(0x590, 0x1F4, 2, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_GDSP__ELCDIF_D17	IOMUX_PAD(0x590, 0x1F4, 3, 0x0, 0, MX50_ELCDIF_PAD_CTRL) -#define MX50_PAD_EPDC_GDSP__AUD6_RXD	IOMUX_PAD(0x590, 0x1F4, 4, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_EPDC_GDOE__EPDC_GDOE	IOMUX_PAD(0x594, 0x1F8, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_GDOE__GPIO_3_18	IOMUX_PAD(0x594, 0x1F8, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_GDOE__WEIM_D18	IOMUX_PAD(0x594, 0x1F8, 2, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_GDOE__ELCDIF_D18	IOMUX_PAD(0x594, 0x1F8, 3, 0x0, 0, MX50_ELCDIF_PAD_CTRL) -#define MX50_PAD_EPDC_GDOE__AUD6_RXC	IOMUX_PAD(0x594, 0x1F8, 4, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_EPDC_GDRL__EPDC_GDRL	IOMUX_PAD(0x598, 0x1FC, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_GDRL__GPIO_3_19	IOMUX_PAD(0x598, 0x1FC, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_GDRL__WEIM_D19	IOMUX_PAD(0x598, 0x1FC, 2, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_GDRL__ELCDIF_D19	IOMUX_PAD(0x598, 0x1FC, 3, 0x0, 0, MX50_ELCDIF_PAD_CTRL) -#define MX50_PAD_EPDC_GDRL__AUD6_RXFS	IOMUX_PAD(0x598, 0x1FC, 4, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_EPDC_SDCLK__EPDC_SDCLK	IOMUX_PAD(0x59C, 0x200, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_SDCLK__GPIO_3_20	IOMUX_PAD(0x59C, 0x200, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_SDCLK__WEIM_D20	IOMUX_PAD(0x59C, 0x200, 2, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_SDCLK__ELCDIF_D20	IOMUX_PAD(0x59C, 0x200, 3, 0x0, 0, MX50_ELCDIF_PAD_CTRL) -#define MX50_PAD_EPDC_SDCLK__AUD5_TXD	IOMUX_PAD(0x59C, 0x200, 4, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_EPDC_SDOEZ__EPDC_SDOEZ	IOMUX_PAD(0x5A0, 0x204, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_SDOEZ__GPIO_3_21	IOMUX_PAD(0x5A0, 0x204, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_SDOEZ__WEIM_D21	IOMUX_PAD(0x5A0, 0x204, 2, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_SDOEZ__ELCDIF_D21	IOMUX_PAD(0x5A0, 0x204, 3, 0x0, 0, MX50_ELCDIF_PAD_CTRL) -#define MX50_PAD_EPDC_SDOEZ__AUD5_TXC	IOMUX_PAD(0x5A0, 0x204, 4, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_EPDC_SDOED__EPDC_SDOED	IOMUX_PAD(0x5A4, 0x208, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_SDOED__GPIO_3_22	IOMUX_PAD(0x5A4, 0x208, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_SDOED__WEIM_D22	IOMUX_PAD(0x5A4, 0x208, 2, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_SDOED__ELCDIF_D22	IOMUX_PAD(0x5A4, 0x208, 3, 0x0, 0, MX50_ELCDIF_PAD_CTRL) -#define MX50_PAD_EPDC_SDOED__AUD5_TXFS	IOMUX_PAD(0x5A4, 0x208, 4, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_EPDC_SDOE__EPDC_SDOE	IOMUX_PAD(0x5A8, 0x20C, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_SDOE__GPIO_3_23	IOMUX_PAD(0x5A8, 0x20C, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_SDOE__WEIM_D23	IOMUX_PAD(0x5A8, 0x20C, 2, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_SDOE__ELCDIF_D23	IOMUX_PAD(0x5A8, 0x20C, 3, 0x0, 0, MX50_ELCDIF_PAD_CTRL) -#define MX50_PAD_EPDC_SDOE__AUD5_RXD	IOMUX_PAD(0x5A8, 0x20C, 4, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_EPDC_SDLE__EPDC_SDLE	IOMUX_PAD(0x5AC, 0x210, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_SDLE__GPIO_3_24	IOMUX_PAD(0x5AC, 0x210, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_SDLE__WEIM_D24	IOMUX_PAD(0x5AC, 0x210, 2, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_SDLE__ELCDIF_D8	IOMUX_PAD(0x5AC, 0x210, 3, 0x71c, 1, MX50_ELCDIF_PAD_CTRL) -#define MX50_PAD_EPDC_SDLE__AUD5_RXC	IOMUX_PAD(0x5AC, 0x210, 4, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_EPDC_SDCLKN__EPDC_SDCLKN	IOMUX_PAD(0x5B0, 0x214, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_SDCLKN__GPIO_3_25		IOMUX_PAD(0x5B0, 0x214, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_SDCLKN__WEIM_D25		IOMUX_PAD(0x5B0, 0x214, 2, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_SDCLKN__ELCDIF_D9		IOMUX_PAD(0x5B0, 0x214, 3, 0x720, 1, MX50_ELCDIF_PAD_CTRL) -#define MX50_PAD_EPDC_SDCLKN__AUD5_RXFS		IOMUX_PAD(0x5B0, 0x214, 4, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_EPDC_SDSHR__EPDC_SDSHR	IOMUX_PAD(0x5B4, 0x218, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_SDSHR__GPIO_3_26	IOMUX_PAD(0x5B4, 0x218, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_SDSHR__WEIM_D26	IOMUX_PAD(0x5B4, 0x218, 2, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_SDSHR__ELCDIF_D10	IOMUX_PAD(0x5B4, 0x218, 3, 0x724, 1, MX50_ELCDIF_PAD_CTRL) -#define MX50_PAD_EPDC_SDSHR__AUD4_TXD	IOMUX_PAD(0x5B4, 0x218, 4, 0x6c8, 1, NO_PAD_CTRL) - -#define MX50_PAD_EPDC_PWRCOM__EPDC_PWRCOM	IOMUX_PAD(0x5B8, 0x21C, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_PWRCOM__GPIO_3_27		IOMUX_PAD(0x5B8, 0x21C, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_PWRCOM__WEIM_D27		IOMUX_PAD(0x5B8, 0x21C, 2, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_PWRCOM__ELCDIF_D11	IOMUX_PAD(0x5B8, 0x21C, 3, 0x728, 1, MX50_ELCDIF_PAD_CTRL) -#define MX50_PAD_EPDC_PWRCOM__AUD4_TXC		IOMUX_PAD(0x5B8, 0x21C, 4, 0x6d4, 1, NO_PAD_CTRL) - -#define MX50_PAD_EPDC_PWRSTAT__EPDC_PWRSTAT	IOMUX_PAD(0x5BC, 0x220, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_PWRSTAT__GPIO_3_28	IOMUX_PAD(0x5BC, 0x220, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_PWRSTAT__WEIM_D28		IOMUX_PAD(0x5BC, 0x220, 2, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_PWRSTAT__ELCDIF_D12	IOMUX_PAD(0x5BC, 0x220, 3, 0x72c, 1, MX50_ELCDIF_PAD_CTRL) -#define MX50_PAD_EPDC_PWRSTAT__AUD4_TXFS	IOMUX_PAD(0x5BC, 0x220, 4, 0x6d8, 1, NO_PAD_CTRL) - -#define MX50_PAD_EPDC_PWRCTRL0__EPDC_PWRCTRL0	IOMUX_PAD(0x5C0, 0x224, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_PWRCTRL0__GPIO_3_29	IOMUX_PAD(0x5C0, 0x224, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_PWRCTRL0__WEIM_D29	IOMUX_PAD(0x5C0, 0x224, 2, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_PWRCTRL0__ELCDIF_D13	IOMUX_PAD(0x5C0, 0x224, 3, 0x730, 1, MX50_ELCDIF_PAD_CTRL) -#define MX50_PAD_EPDC_PWRCTRL0__AUD4_RXD	IOMUX_PAD(0x5C0, 0x224, 4, 0x6c4, 1, NO_PAD_CTRL) - -#define MX50_PAD_EPDC_PWRCTRL1__EPDC_PWRCTRL1	IOMUX_PAD(0x5C4, 0x228, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_PWRCTRL1__GPIO_3_30	IOMUX_PAD(0x5C4, 0x228, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_PWRCTRL1__WEIM_D30	IOMUX_PAD(0x5C4, 0x228, 2, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_PWRCTRL1__ELCDIF_D14	IOMUX_PAD(0x5C4, 0x228, 3, 0x734, 1, MX50_ELCDIF_PAD_CTRL) -#define MX50_PAD_EPDC_PWRCTRL1__AUD4_RXC	IOMUX_PAD(0x5C4, 0x228, 4, 0x6cc, 1, NO_PAD_CTRL) - -#define MX50_PAD_EPDC_PWRCTRL2__EPDC_PWRCTRL2	IOMUX_PAD(0x5C8, 0x22C, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_PWRCTRL2__GPIO_3_31	IOMUX_PAD(0x5C8, 0x22C, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_PWRCTRL2__WEIM_D31	IOMUX_PAD(0x5C8, 0x22C, 2, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_PWRCTRL2__ELCDIF_D15	IOMUX_PAD(0x5C8, 0x22C, 3, 0x738, 1, MX50_ELCDIF_PAD_CTRL) -#define MX50_PAD_EPDC_PWRCTRL2__AUD4_RXFS	IOMUX_PAD(0x5C8, 0x22C, 4, 0x6d0, 1, NO_PAD_CTRL) -#define MX50_PAD_EPDC_PWRCTRL2__SDMA_EXT0	IOMUX_PAD(0x5C8, 0x22C, 6, 0x7b8, 1, NO_PAD_CTRL) - -#define MX50_PAD_EPDC_PWRCTRL3__PWRCTRL3	IOMUX_PAD(0x5CC, 0x230, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_PWRCTRL3__GPIO_4_20	IOMUX_PAD(0x5CC, 0x230, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_PWRCTRL3__WEIM_EB2	IOMUX_PAD(0x5CC, 0x230, 2, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_PWRCTRL3__SDMA_EXT1	IOMUX_PAD(0x5CC, 0x230, 6, 0x7bc, 1, NO_PAD_CTRL) - -#define MX50_PAD_EPDC_VCOM0__EPDC_VCOM0	IOMUX_PAD(0x5D0, 0x234, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_VCOM0__GPIO_4_21	IOMUX_PAD(0x5D0, 0x234, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_VCOM0__WEIM_EB3	IOMUX_PAD(0x5D0, 0x234, 2, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_EPDC_VCOM1__EPDC_VCOM1	IOMUX_PAD(0x5D4, 0x238, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_VCOM1__GPIO_4_22	IOMUX_PAD(0x5D4, 0x238, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_VCOM1__WEIM_CS3	IOMUX_PAD(0x5D4, 0x238, 2, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_EPDC_BDR0__EPDC_BDR0	IOMUX_PAD(0x5D8, 0x23C, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_BDR0__GPIO_4_23	IOMUX_PAD(0x5D8, 0x23C, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_BDR0__ELCDIF_D7	IOMUX_PAD(0x5D8, 0x23C, 3, 0x718, 1, MX50_ELCDIF_PAD_CTRL) - -#define MX50_PAD_EPDC_BDR1__EPDC_BDR1	IOMUX_PAD(0x5DC, 0x240, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_BDR1__GPIO_4_24	IOMUX_PAD(0x5DC, 0x240, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_BDR1__ELCDIF_D6	IOMUX_PAD(0x5DC, 0x240, 3, 0x714, 1, MX50_ELCDIF_PAD_CTRL) - -#define MX50_PAD_EPDC_SDCE0__EPDC_SDCE0	IOMUX_PAD(0x5E0, 0x244, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_SDCE0__GPIO_4_25	IOMUX_PAD(0x5E0, 0x244, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_SDCE0__ELCDIF_D5	IOMUX_PAD(0x5E0, 0x244, 3, 0x710, 1, MX50_ELCDIF_PAD_CTRL) - -#define MX50_PAD_EPDC_SDCE1__EPDC_SDCE1	IOMUX_PAD(0x5E4, 0x248, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_SDCE1__GPIO_4_26	IOMUX_PAD(0x5E4, 0x248, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_SDCE1__ELCDIF_D4	IOMUX_PAD(0x5E4, 0x248, 2, 0x70c, 1, MX50_ELCDIF_PAD_CTRL) - -#define MX50_PAD_EPDC_SDCE2__EPDC_SDCE2		IOMUX_PAD(0x5E8, 0x24C, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_SDCE2__GPIO_4_27		IOMUX_PAD(0x5E8, 0x24C, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_SDCE2__ELCDIF_DAT3	IOMUX_PAD(0x5E8, 0x24C, 3, 0x708, 1, MX50_ELCDIF_PAD_CTRL) - -#define MX50_PAD_EPDC_SDCE3__EPDC_SDCE3	IOMUX_PAD(0x5EC, 0x250, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_SDCE3__GPIO_4_28	IOMUX_PAD(0x5EC, 0x250, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_SDCE3__ELCDIF_D2	IOMUX_PAD(0x5EC, 0x250, 3, 0x704, 1, MX50_ELCDIF_PAD_CTRL) - -#define MX50_PAD_EPDC_SDCE4__EPDC_SDCE4	IOMUX_PAD(0x5F0, 0x254, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_SDCE4__GPIO_4_29	IOMUX_PAD(0x5F0, 0x254, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_SDCE4__ELCDIF_D1	IOMUX_PAD(0x5F0, 0x254, 3, 0x700, 1, MX50_ELCDIF_PAD_CTRL) - -#define MX50_PAD_EPDC_SDCE5__EPDC_SDCE5	IOMUX_PAD(0x5F4, 0x258, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_SDCE5__GPIO_4_30	IOMUX_PAD(0x5F4, 0x258, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EPDC_SDCE5__ELCDIF_D0	IOMUX_PAD(0x5F4, 0x258, 3, 0x6fc, 1, MX50_ELCDIF_PAD_CTRL) - -#define MX50_PAD_EIM_DA0__WEIM_A0	IOMUX_PAD(0x5F8, 0x25C, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EIM_DA0__GPIO_1_0	IOMUX_PAD(0x5F8, 0x25C, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EIM_DA0__KEY_COL4	IOMUX_PAD(0x5f8, 0x25C, 3, 0x790, 2, NO_PAD_CTRL) - -#define MX50_PAD_EIM_DA1__WEIM_A1	IOMUX_PAD(0x5FC, 0x260, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EIM_DA1__GPIO_1_1	IOMUX_PAD(0x5FC, 0x260, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EIM_DA1__KEY_ROW4	IOMUX_PAD(0x5fc, 0x260, 3, 0x7a0, 2, MX50_KEYPAD_CTRL) - -#define MX50_PAD_EIM_DA2__WEIM_A2	IOMUX_PAD(0x600, 0x264, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EIM_DA2__GPIO_1_2	IOMUX_PAD(0x600, 0x264, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EIM_DA2__KEY_COL5	IOMUX_PAD(0x600, 0x264, 3, 0x794, 2, NO_PAD_CTRL) - -#define MX50_PAD_EIM_DA3__WEIM_A3	IOMUX_PAD(0x604, 0x268, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EIM_DA3__GPIO_1_3	IOMUX_PAD(0x604, 0x268, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EIM_DA3__KEY_ROW5	IOMUX_PAD(0x604, 0x268, 3, 0x7a4, 2, MX50_KEYPAD_CTRL) - -#define MX50_PAD_EIM_DA4__WEIM_A4	IOMUX_PAD(0x608, 0x26C, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EIM_DA4__GPIO_1_4	IOMUX_PAD(0x608, 0x26C, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EIM_DA4__KEY_COL6	IOMUX_PAD(0x608, 0x26C, 3, 0x798, 2, NO_PAD_CTRL) - -#define MX50_PAD_EIM_DA5__WEIM_A5	IOMUX_PAD(0x60C, 0x270, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EIM_DA5__GPIO_1_5	IOMUX_PAD(0x60C, 0x270, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EIM_DA5__KEY_ROW6	IOMUX_PAD(0x60C, 0x270, 3, 0x7a8, 2, MX50_KEYPAD_CTRL) - -#define MX50_PAD_EIM_DA6__WEIM_A6	IOMUX_PAD(0x610, 0x274, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EIM_DA6__GPIO_1_6	IOMUX_PAD(0x610, 0x274, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EIM_DA6__KEY_COL7	IOMUX_PAD(0x610, 0x274, 3, 0x79c, 2, NO_PAD_CTRL) - -#define MX50_PAD_EIM_DA7__WEIM_A7	IOMUX_PAD(0x614, 0x278, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EIM_DA7__GPIO_1_7	IOMUX_PAD(0x614, 0x278, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EIM_DA7__KEY_ROW7	IOMUX_PAD(0x614, 0x278, 3, 0x7ac, 2, MX50_KEYPAD_CTRL) - -#define MX50_PAD_EIM_DA8__WEIM_A8	IOMUX_PAD(0x618, 0x27C, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EIM_DA8__GPIO_1_8	IOMUX_PAD(0x618, 0x27C, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PIN_EIM_DA8__NANDF_CLE	IOMUX_PAD(0x618, 0x27C, 2, 0x0, 0, PAD_CTL_DSE_HIGH) - -#define MX50_PAD_EIM_DA9__WEIM_A9	IOMUX_PAD(0x61C, 0x280, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EIM_DA9__GPIO_1_9	IOMUX_PAD(0x61C, 0x280, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PIN_EIM_DA9__NANDF_ALE	IOMUX_PAD(0x61C, 0x280, 2, 0x0, 0, PAD_CTL_DSE_HIGH) - -#define MX50_PAD_EIM_DA10__WEIM_A10	IOMUX_PAD(0x620, 0x284, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EIM_DA10__GPIO_1_10	IOMUX_PAD(0x620, 0x284, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PIN_EIM_DA10__NANDF_CE0	IOMUX_PAD(0x620, 0x284, 2, 0x0, 0, PAD_CTL_DSE_HIGH) - -#define MX50_PAD_EIM_DA11__WEIM_A11	IOMUX_PAD(0x624, 0x288, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EIM_DA11__GPIO_1_11	IOMUX_PAD(0x624, 0x288, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PIN_EIM_DA11__NANDF_CE1	IOMUX_PAD(0x624, 0x288, 2, 0x0, 0, PAD_CTL_DSE_HIGH) - -#define MX50_PAD_EIM_DA12__WEIM_A12	IOMUX_PAD(0x628, 0x28C, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EIM_DA12__GPIO_1_12	IOMUX_PAD(0x628, 0x28C, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PIN_EIM_DA12__NANDF_CE2	IOMUX_PAD(0x628, 0x28C, 2, 0x0, 0, PAD_CTL_DSE_HIGH) -#define MX50_PAD_EIM_DA12__EPDC_SDCE6	IOMUX_PAD(0x628, 0x28C, 3, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_EIM_DA13__WEIM_A13	IOMUX_PAD(0x62C, 0x290, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EIM_DA13__GPIO_1_13	IOMUX_PAD(0x62C, 0x290, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PIN_EIM_DA13__NANDF_CE3	IOMUX_PAD(0x62C, 0x290, 2, 0x0, 0, PAD_CTL_DSE_HIGH) -#define MX50_PIN_EIM_DA13__EPDC_SDCE7	IOMUX_PAD(0x62C, 0x290, 3, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_EIM_DA14__WEIM_A14	IOMUX_PAD(0x630, 0x294, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EIM_DA14__GPIO_1_14	IOMUX_PAD(0x630, 0x294, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EIM_DA14__NANDF_READY	IOMUX_PAD(0x630, 0x294, 2, 0x7B4, 2, PAD_CTL_PKE | \ -							PAD_CTL_PUE | PAD_CTL_PUS_100K_UP) -#define MX50_PAD_EIM_DA14__EPDC_SDCE8	IOMUX_PAD(0x630, 0x294, 3, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_EIM_DA15__WEIM_A15	IOMUX_PAD(0x634, 0x298, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EIM_DA15__GPIO_1_15	IOMUX_PAD(0x634, 0x298, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PIN_EIM_DA15__NANDF_DQS	IOMUX_PAD(0x634, 0x298, 2, 0x7B0, 2, PAD_CTL_DSE_HIGH) -#define MX50_PAD_EIM_DA15__EPDC_SDCE9	IOMUX_PAD(0x634, 0x298, 3, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_EIM_CS2__WEIM_CS2	IOMUX_PAD(0x638, 0x29C, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EIM_CS2__GPIO_1_16	IOMUX_PAD(0x638, 0x29C, 1, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EIM_CS2__WEIM_A27	IOMUX_PAD(0x638, 0x29C, 2, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_EIM_CS1__WEIM_CS1	IOMUX_PAD(0x63C, 0x2A0, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EIM_CS1__GPIO_1_17	IOMUX_PAD(0x63C, 0x2A0, 1, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_EIM_CS0__WEIM_CS0	IOMUX_PAD(0x640, 0x2A4, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EIM_CS0__GPIO_1_18	IOMUX_PAD(0x640, 0x2A4, 1, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_EIM_EB0__WEIM_EB0	IOMUX_PAD(0x644, 0x2A8, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EIM_EB0__GPIO_1_19	IOMUX_PAD(0x644, 0x2A8, 1, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_EIM_EB1__WEIM_EB1	IOMUX_PAD(0x648, 0x2AC, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EIM_EB1__GPIO_1_20	IOMUX_PAD(0x648, 0x2AC, 1, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_EIM_WAIT__WEIM_WAIT	IOMUX_PAD(0x64C, 0x2B0, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EIM_WAIT__GPIO_1_21	IOMUX_PAD(0x64C, 0x2B0, 1, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_EIM_BCLK__WEIM_BCLK	IOMUX_PAD(0x650, 0x2B4, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EIM_BCLK__GPIO_1_22	IOMUX_PAD(0x650, 0x2B4, 1, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_EIM_RDY__WEIM_RDY	IOMUX_PAD(0x654, 0x2B8, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EIM_RDY__GPIO_1_23	IOMUX_PAD(0x654, 0x2B8, 1, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_EIM_OE__WEIM_OE	IOMUX_PAD(0x658, 0x2BC, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EIM_OE__GPIO_1_24	IOMUX_PAD(0x658, 0x2BC, 1, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_EIM_RW__WEIM_RW	IOMUX_PAD(0x65C, 0x2C0, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EIM_RW__GPIO_1_25	IOMUX_PAD(0x65C, 0x2C0, 1, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_EIM_LBA__WEIM_LBA	IOMUX_PAD(0x660, 0x2C4, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EIM_LBA__GPIO_1_26	IOMUX_PAD(0x660, 0x2C4, 1, 0x0, 0, NO_PAD_CTRL) - -#define MX50_PAD_EIM_CRE__WEIM_CRE	IOMUX_PAD(0x664, 0x2C8, 0, 0x0, 0, NO_PAD_CTRL) -#define MX50_PAD_EIM_CRE__GPIO_1_27	IOMUX_PAD(0x664, 0x2C8, 1, 0x0, 0, NO_PAD_CTRL) - -#endif /* __MACH_IOMUX_MX50_H__ */ diff --git a/arch/arm/mach-imx/iram.h b/arch/arm/mach-imx/iram.h deleted file mode 100644 index 022690c3370..00000000000 --- a/arch/arm/mach-imx/iram.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (C) 2010 Freescale Semiconductor, Inc. All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, - * MA 02110-1301, USA. - */ -#include <linux/errno.h> - -#ifdef CONFIG_IRAM_ALLOC - -int __init iram_init(unsigned long base, unsigned long size); -void __iomem *iram_alloc(unsigned int size, unsigned long *dma_addr); -void iram_free(unsigned long dma_addr, unsigned int size); - -#else - -static inline int __init iram_init(unsigned long base, unsigned long size) -{ -	return -ENOMEM; -} - -static inline void __iomem *iram_alloc(unsigned int size, unsigned long *dma_addr) -{ -	return NULL; -} - -static inline void iram_free(unsigned long base, unsigned long size) {} - -#endif diff --git a/arch/arm/mach-imx/iram_alloc.c b/arch/arm/mach-imx/iram_alloc.c index 6c80424f678..e05cf407db6 100644 --- a/arch/arm/mach-imx/iram_alloc.c +++ b/arch/arm/mach-imx/iram_alloc.c @@ -22,8 +22,7 @@  #include <linux/module.h>  #include <linux/spinlock.h>  #include <linux/genalloc.h> - -#include "iram.h" +#include "linux/platform_data/imx-iram.h"  static unsigned long iram_phys_base;  static void __iomem *iram_virt_base; diff --git a/arch/arm/mach-imx/lluart.c b/arch/arm/mach-imx/lluart.c deleted file mode 100644 index 2fdc9bf2fb5..00000000000 --- a/arch/arm/mach-imx/lluart.c +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2011 Freescale Semiconductor, Inc. - * Copyright 2011 Linaro Ltd. - * - * The code contained herein is licensed under the GNU General Public - * License. You may obtain a copy of the GNU General Public License - * Version 2 or later at the following locations: - * - * http://www.opensource.org/licenses/gpl-license.html - * http://www.gnu.org/copyleft/gpl.html - */ - -#include <linux/init.h> -#include <asm/page.h> -#include <asm/sizes.h> -#include <asm/mach/map.h> - -#include "hardware.h" - -#define IMX6Q_UART1_BASE_ADDR	0x02020000 -#define IMX6Q_UART2_BASE_ADDR	0x021e8000 -#define IMX6Q_UART3_BASE_ADDR	0x021ec000 -#define IMX6Q_UART4_BASE_ADDR	0x021f0000 -#define IMX6Q_UART5_BASE_ADDR	0x021f4000 - -/* - * IMX6Q_UART_BASE_ADDR is put in the middle to force the expansion - * of IMX6Q_UART##n##_BASE_ADDR. - */ -#define IMX6Q_UART_BASE_ADDR(n)	IMX6Q_UART##n##_BASE_ADDR -#define IMX6Q_UART_BASE(n)	IMX6Q_UART_BASE_ADDR(n) -#define IMX6Q_DEBUG_UART_BASE	IMX6Q_UART_BASE(CONFIG_DEBUG_IMX6Q_UART_PORT) - -static struct map_desc imx_lluart_desc = { -#ifdef CONFIG_DEBUG_IMX6Q_UART -	.virtual	= IMX_IO_P2V(IMX6Q_DEBUG_UART_BASE), -	.pfn		= __phys_to_pfn(IMX6Q_DEBUG_UART_BASE), -	.length		= 0x4000, -	.type		= MT_DEVICE, -#endif -}; - -void __init imx_lluart_map_io(void) -{ -	if (imx_lluart_desc.virtual) -		iotable_init(&imx_lluart_desc, 1); -} diff --git a/arch/arm/mach-imx/mach-imx6q.c b/arch/arm/mach-imx/mach-imx6q.c index cd277a0f5b1..1786b2d1257 100644 --- a/arch/arm/mach-imx/mach-imx6q.c +++ b/arch/arm/mach-imx/mach-imx6q.c @@ -12,12 +12,12 @@  #include <linux/clk.h>  #include <linux/clkdev.h> -#include <linux/cpuidle.h>  #include <linux/delay.h>  #include <linux/export.h>  #include <linux/init.h>  #include <linux/io.h>  #include <linux/irq.h> +#include <linux/irqchip.h>  #include <linux/of.h>  #include <linux/of_address.h>  #include <linux/of_irq.h> @@ -26,11 +26,10 @@  #include <linux/regmap.h>  #include <linux/micrel_phy.h>  #include <linux/mfd/syscon.h> -#include <asm/cpuidle.h>  #include <asm/smp_twd.h>  #include <asm/hardware/cache-l2x0.h> -#include <asm/hardware/gic.h>  #include <asm/mach/arch.h> +#include <asm/mach/map.h>  #include <asm/mach/time.h>  #include <asm/system_misc.h> @@ -201,37 +200,28 @@ static void __init imx6q_init_machine(void)  	imx6q_1588_init();  } -static struct cpuidle_driver imx6q_cpuidle_driver = { -	.name			= "imx6q_cpuidle", -	.owner			= THIS_MODULE, -	.en_core_tk_irqen	= 1, -	.states[0]		= ARM_CPUIDLE_WFI_STATE, -	.state_count		= 1, -}; -  static void __init imx6q_init_late(void)  { -	imx_cpuidle_init(&imx6q_cpuidle_driver); +	/* +	 * WAIT mode is broken on TO 1.0 and 1.1, so there is no point +	 * to run cpuidle on them. +	 */ +	if (imx6q_revision() > IMX_CHIP_REVISION_1_1) +		imx6q_cpuidle_init();  }  static void __init imx6q_map_io(void)  { -	imx_lluart_map_io(); +	debug_ll_io_init();  	imx_scu_map_io(); -	imx6q_clock_map_io();  } -static const struct of_device_id imx6q_irq_match[] __initconst = { -	{ .compatible = "arm,cortex-a9-gic", .data = gic_of_init, }, -	{ /* sentinel */ } -}; -  static void __init imx6q_init_irq(void)  {  	l2x0_of_init(0, ~0UL);  	imx_src_init();  	imx_gpc_init(); -	of_irq_init(imx6q_irq_match); +	irqchip_init();  }  static void __init imx6q_timer_init(void) @@ -250,7 +240,6 @@ DT_MACHINE_START(IMX6Q, "Freescale i.MX6 Quad (Device Tree)")  	.smp		= smp_ops(imx_smp_ops),  	.map_io		= imx6q_map_io,  	.init_irq	= imx6q_init_irq, -	.handle_irq	= imx6q_handle_irq,  	.init_time	= imx6q_timer_init,  	.init_machine	= imx6q_init_machine,  	.init_late      = imx6q_init_late, diff --git a/arch/arm/mach-imx/mach-mx50_rdp.c b/arch/arm/mach-imx/mach-mx50_rdp.c deleted file mode 100644 index 8937902bda5..00000000000 --- a/arch/arm/mach-imx/mach-mx50_rdp.c +++ /dev/null @@ -1,221 +0,0 @@ -/* - * Copyright (C) 2010 Freescale Semiconductor, Inc. All Rights Reserved. - */ - -/* - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include <linux/init.h> -#include <linux/platform_device.h> -#include <linux/gpio.h> -#include <linux/delay.h> -#include <linux/io.h> - -#include <asm/irq.h> -#include <asm/setup.h> -#include <asm/mach-types.h> -#include <asm/mach/arch.h> -#include <asm/mach/time.h> - -#include "common.h" -#include "devices-imx50.h" -#include "hardware.h" -#include "iomux-mx50.h" - -#define FEC_EN		IMX_GPIO_NR(6, 23) -#define FEC_RESET_B	IMX_GPIO_NR(4, 12) - -static iomux_v3_cfg_t mx50_rdp_pads[] __initdata = { -	/* SD1 */ -	MX50_PAD_ECSPI2_SS0__GPIO_4_19, -	MX50_PAD_EIM_CRE__GPIO_1_27, -	MX50_PAD_SD1_CMD__SD1_CMD, - -	MX50_PAD_SD1_CLK__SD1_CLK, -	MX50_PAD_SD1_D0__SD1_D0, -	MX50_PAD_SD1_D1__SD1_D1, -	MX50_PAD_SD1_D2__SD1_D2, -	MX50_PAD_SD1_D3__SD1_D3, - -	/* SD2 */ -	MX50_PAD_SD2_CD__GPIO_5_17, -	MX50_PAD_SD2_WP__GPIO_5_16, -	MX50_PAD_SD2_CMD__SD2_CMD, -	MX50_PAD_SD2_CLK__SD2_CLK, -	MX50_PAD_SD2_D0__SD2_D0, -	MX50_PAD_SD2_D1__SD2_D1, -	MX50_PAD_SD2_D2__SD2_D2, -	MX50_PAD_SD2_D3__SD2_D3, -	MX50_PAD_SD2_D4__SD2_D4, -	MX50_PAD_SD2_D5__SD2_D5, -	MX50_PAD_SD2_D6__SD2_D6, -	MX50_PAD_SD2_D7__SD2_D7, - -	/* SD3 */ -	MX50_PAD_SD3_CMD__SD3_CMD, -	MX50_PAD_SD3_CLK__SD3_CLK, -	MX50_PAD_SD3_D0__SD3_D0, -	MX50_PAD_SD3_D1__SD3_D1, -	MX50_PAD_SD3_D2__SD3_D2, -	MX50_PAD_SD3_D3__SD3_D3, -	MX50_PAD_SD3_D4__SD3_D4, -	MX50_PAD_SD3_D5__SD3_D5, -	MX50_PAD_SD3_D6__SD3_D6, -	MX50_PAD_SD3_D7__SD3_D7, - -	/* PWR_INT */ -	MX50_PAD_ECSPI2_MISO__GPIO_4_18, - -	/* UART pad setting */ -	MX50_PAD_UART1_TXD__UART1_TXD, -	MX50_PAD_UART1_RXD__UART1_RXD, -	MX50_PAD_UART1_RTS__UART1_RTS, -	MX50_PAD_UART2_TXD__UART2_TXD, -	MX50_PAD_UART2_RXD__UART2_RXD, -	MX50_PAD_UART2_CTS__UART2_CTS, -	MX50_PAD_UART2_RTS__UART2_RTS, - -	MX50_PAD_I2C1_SCL__I2C1_SCL, -	MX50_PAD_I2C1_SDA__I2C1_SDA, -	MX50_PAD_I2C2_SCL__I2C2_SCL, -	MX50_PAD_I2C2_SDA__I2C2_SDA, - -	MX50_PAD_EPITO__USBH1_PWR, -	/* Need to comment below line if -	 * one needs to debug owire. -	 */ -	MX50_PAD_OWIRE__USBH1_OC, -	/* using gpio to control otg pwr */ -	MX50_PAD_PWM2__GPIO_6_25, -	MX50_PAD_I2C3_SCL__USBOTG_OC, - -	MX50_PAD_SSI_RXC__FEC_MDIO, -	MX50_PAD_SSI_RXFS__FEC_MDC, -	MX50_PAD_DISP_D0__FEC_TXCLK, -	MX50_PAD_DISP_D1__FEC_RX_ER, -	MX50_PAD_DISP_D2__FEC_RX_DV, -	MX50_PAD_DISP_D3__FEC_RXD1, -	MX50_PAD_DISP_D4__FEC_RXD0, -	MX50_PAD_DISP_D5__FEC_TX_EN, -	MX50_PAD_DISP_D6__FEC_TXD1, -	MX50_PAD_DISP_D7__FEC_TXD0, -	MX50_PAD_I2C3_SDA__GPIO_6_23, -	MX50_PAD_ECSPI1_SCLK__GPIO_4_12, - -	MX50_PAD_CSPI_SS0__CSPI_SS0, -	MX50_PAD_ECSPI1_MOSI__CSPI_SS1, -	MX50_PAD_CSPI_MOSI__CSPI_MOSI, -	MX50_PAD_CSPI_MISO__CSPI_MISO, - -	/* SGTL500_OSC_EN */ -	MX50_PAD_UART1_CTS__GPIO_6_8, - -	/* SGTL_AMP_SHDN */ -	MX50_PAD_UART3_RXD__GPIO_6_15, - -	/* Keypad */ -	MX50_PAD_KEY_COL0__KEY_COL0, -	MX50_PAD_KEY_ROW0__KEY_ROW0, -	MX50_PAD_KEY_COL1__KEY_COL1, -	MX50_PAD_KEY_ROW1__KEY_ROW1, -	MX50_PAD_KEY_COL2__KEY_COL2, -	MX50_PAD_KEY_ROW2__KEY_ROW2, -	MX50_PAD_KEY_COL3__KEY_COL3, -	MX50_PAD_KEY_ROW3__KEY_ROW3, -	MX50_PAD_EIM_DA0__KEY_COL4, -	MX50_PAD_EIM_DA1__KEY_ROW4, -	MX50_PAD_EIM_DA2__KEY_COL5, -	MX50_PAD_EIM_DA3__KEY_ROW5, -	MX50_PAD_EIM_DA4__KEY_COL6, -	MX50_PAD_EIM_DA5__KEY_ROW6, -	MX50_PAD_EIM_DA6__KEY_COL7, -	MX50_PAD_EIM_DA7__KEY_ROW7, -	/*EIM pads */ -	MX50_PAD_EIM_DA8__GPIO_1_8, -	MX50_PAD_EIM_DA9__GPIO_1_9, -	MX50_PAD_EIM_DA10__GPIO_1_10, -	MX50_PAD_EIM_DA11__GPIO_1_11, -	MX50_PAD_EIM_DA12__GPIO_1_12, -	MX50_PAD_EIM_DA13__GPIO_1_13, -	MX50_PAD_EIM_DA14__GPIO_1_14, -	MX50_PAD_EIM_DA15__GPIO_1_15, -	MX50_PAD_EIM_CS2__GPIO_1_16, -	MX50_PAD_EIM_CS1__GPIO_1_17, -	MX50_PAD_EIM_CS0__GPIO_1_18, -	MX50_PAD_EIM_EB0__GPIO_1_19, -	MX50_PAD_EIM_EB1__GPIO_1_20, -	MX50_PAD_EIM_WAIT__GPIO_1_21, -	MX50_PAD_EIM_BCLK__GPIO_1_22, -	MX50_PAD_EIM_RDY__GPIO_1_23, -	MX50_PAD_EIM_OE__GPIO_1_24, -}; - -/* Serial ports */ -static const struct imxuart_platform_data uart_pdata __initconst = { -	.flags = IMXUART_HAVE_RTSCTS, -}; - -static const struct fec_platform_data fec_data __initconst = { -	.phy = PHY_INTERFACE_MODE_RMII, -}; - -static inline void mx50_rdp_fec_reset(void) -{ -	gpio_request(FEC_EN, "fec-en"); -	gpio_direction_output(FEC_EN, 0); -	gpio_request(FEC_RESET_B, "fec-reset_b"); -	gpio_direction_output(FEC_RESET_B, 0); -	msleep(1); -	gpio_set_value(FEC_RESET_B, 1); -} - -static const struct imxi2c_platform_data i2c_data __initconst = { -	.bitrate = 100000, -}; - -/* - * Board specific initialization. - */ -static void __init mx50_rdp_board_init(void) -{ -	imx50_soc_init(); - -	mxc_iomux_v3_setup_multiple_pads(mx50_rdp_pads, -					ARRAY_SIZE(mx50_rdp_pads)); - -	imx50_add_imx_uart(0, &uart_pdata); -	imx50_add_imx_uart(1, &uart_pdata); -	mx50_rdp_fec_reset(); -	imx50_add_fec(&fec_data); -	imx50_add_imx_i2c(0, &i2c_data); -	imx50_add_imx_i2c(1, &i2c_data); -	imx50_add_imx_i2c(2, &i2c_data); -} - -static void __init mx50_rdp_timer_init(void) -{ -	mx50_clocks_init(32768, 24000000, 22579200); -} - -MACHINE_START(MX50_RDP, "Freescale MX50 Reference Design Platform") -	.map_io = mx50_map_io, -	.init_early = imx50_init_early, -	.init_irq = mx50_init_irq, -	.handle_irq = imx50_handle_irq, -	.init_time	= mx50_rdp_timer_init, -	.init_machine = mx50_rdp_board_init, -	.restart	= mxc_restart, -MACHINE_END diff --git a/arch/arm/mach-imx/mach-mx51_3ds.c b/arch/arm/mach-imx/mach-mx51_3ds.c deleted file mode 100644 index 2d236511153..00000000000 --- a/arch/arm/mach-imx/mach-mx51_3ds.c +++ /dev/null @@ -1,174 +0,0 @@ -/* - * Copyright 2008-2009 Freescale Semiconductor, Inc. All Rights Reserved. - * Copyright (C) 2010 Jason Wang <jason77.wang@gmail.com> - * - * The code contained herein is licensed under the GNU General Public - * License. You may obtain a copy of the GNU General Public License - * Version 2 or later at the following locations: - * - * http://www.opensource.org/licenses/gpl-license.html - * http://www.gnu.org/copyleft/gpl.html - */ - -#include <linux/irq.h> -#include <linux/platform_device.h> -#include <linux/spi/spi.h> -#include <linux/gpio.h> - -#include <asm/mach-types.h> -#include <asm/mach/arch.h> -#include <asm/mach/time.h> - -#include "3ds_debugboard.h" -#include "common.h" -#include "devices-imx51.h" -#include "hardware.h" -#include "iomux-mx51.h" - -#define MX51_3DS_ECSPI2_CS	(GPIO_PORTC + 28) - -static iomux_v3_cfg_t mx51_3ds_pads[] = { -	/* UART1 */ -	MX51_PAD_UART1_RXD__UART1_RXD, -	MX51_PAD_UART1_TXD__UART1_TXD, -	MX51_PAD_UART1_RTS__UART1_RTS, -	MX51_PAD_UART1_CTS__UART1_CTS, - -	/* UART2 */ -	MX51_PAD_UART2_RXD__UART2_RXD, -	MX51_PAD_UART2_TXD__UART2_TXD, -	MX51_PAD_EIM_D25__UART2_CTS, -	MX51_PAD_EIM_D26__UART2_RTS, - -	/* UART3 */ -	MX51_PAD_UART3_RXD__UART3_RXD, -	MX51_PAD_UART3_TXD__UART3_TXD, -	MX51_PAD_EIM_D24__UART3_CTS, -	MX51_PAD_EIM_D27__UART3_RTS, - -	/* CPLD PARENT IRQ PIN */ -	MX51_PAD_GPIO1_6__GPIO1_6, - -	/* KPP */ -	MX51_PAD_KEY_ROW0__KEY_ROW0, -	MX51_PAD_KEY_ROW1__KEY_ROW1, -	MX51_PAD_KEY_ROW2__KEY_ROW2, -	MX51_PAD_KEY_ROW3__KEY_ROW3, -	MX51_PAD_KEY_COL0__KEY_COL0, -	MX51_PAD_KEY_COL1__KEY_COL1, -	MX51_PAD_KEY_COL2__KEY_COL2, -	MX51_PAD_KEY_COL3__KEY_COL3, -	MX51_PAD_KEY_COL4__KEY_COL4, -	MX51_PAD_KEY_COL5__KEY_COL5, - -	/* eCSPI2 */ -	MX51_PAD_NANDF_RB2__ECSPI2_SCLK, -	MX51_PAD_NANDF_RB3__ECSPI2_MISO, -	MX51_PAD_NANDF_D15__ECSPI2_MOSI, -	MX51_PAD_NANDF_D12__GPIO3_28, -}; - -/* Serial ports */ -static const struct imxuart_platform_data uart_pdata __initconst = { -	.flags = IMXUART_HAVE_RTSCTS, -}; - -static int mx51_3ds_board_keymap[] = { -	KEY(0, 0, KEY_1), -	KEY(0, 1, KEY_2), -	KEY(0, 2, KEY_3), -	KEY(0, 3, KEY_F1), -	KEY(0, 4, KEY_UP), -	KEY(0, 5, KEY_F2), - -	KEY(1, 0, KEY_4), -	KEY(1, 1, KEY_5), -	KEY(1, 2, KEY_6), -	KEY(1, 3, KEY_LEFT), -	KEY(1, 4, KEY_SELECT), -	KEY(1, 5, KEY_RIGHT), - -	KEY(2, 0, KEY_7), -	KEY(2, 1, KEY_8), -	KEY(2, 2, KEY_9), -	KEY(2, 3, KEY_F3), -	KEY(2, 4, KEY_DOWN), -	KEY(2, 5, KEY_F4), - -	KEY(3, 0, KEY_0), -	KEY(3, 1, KEY_OK), -	KEY(3, 2, KEY_ESC), -	KEY(3, 3, KEY_ENTER), -	KEY(3, 4, KEY_MENU), -	KEY(3, 5, KEY_BACK) -}; - -static const struct matrix_keymap_data mx51_3ds_map_data __initconst = { -	.keymap		= mx51_3ds_board_keymap, -	.keymap_size	= ARRAY_SIZE(mx51_3ds_board_keymap), -}; - -static int mx51_3ds_spi2_cs[] = { -	MXC_SPI_CS(0), -	MX51_3DS_ECSPI2_CS, -}; - -static const struct spi_imx_master mx51_3ds_ecspi2_pdata __initconst = { -	.chipselect	= mx51_3ds_spi2_cs, -	.num_chipselect	= ARRAY_SIZE(mx51_3ds_spi2_cs), -}; - -static struct spi_board_info mx51_3ds_spi_nor_device[] = { -	{ -	 .modalias = "m25p80", -	 .max_speed_hz = 25000000,	/* max spi clock (SCK) speed in HZ */ -	 .bus_num = 1, -	 .chip_select = 1, -	 .mode = SPI_MODE_0, -	 .platform_data = NULL,}, -}; - -/* - * Board specific initialization. - */ -static void __init mx51_3ds_init(void) -{ -	imx51_soc_init(); - -	mxc_iomux_v3_setup_multiple_pads(mx51_3ds_pads, -					ARRAY_SIZE(mx51_3ds_pads)); - -	imx51_add_imx_uart(0, &uart_pdata); -	imx51_add_imx_uart(1, &uart_pdata); -	imx51_add_imx_uart(2, &uart_pdata); - -	imx51_add_ecspi(1, &mx51_3ds_ecspi2_pdata); -	spi_register_board_info(mx51_3ds_spi_nor_device, -				ARRAY_SIZE(mx51_3ds_spi_nor_device)); - -	if (mxc_expio_init(MX51_CS5_BASE_ADDR, IMX_GPIO_NR(1, 6))) -		printk(KERN_WARNING "Init of the debugboard failed, all " -				    "devices on the board are unusable.\n"); - -	imx51_add_sdhci_esdhc_imx(0, NULL); -	imx51_add_imx_keypad(&mx51_3ds_map_data); -	imx51_add_imx2_wdt(0); -} - -static void __init mx51_3ds_timer_init(void) -{ -	mx51_clocks_init(32768, 24000000, 22579200, 0); -} - -MACHINE_START(MX51_3DS, "Freescale MX51 3-Stack Board") -	/* Maintainer: Freescale Semiconductor, Inc. */ -	.atag_offset = 0x100, -	.map_io = mx51_map_io, -	.init_early = imx51_init_early, -	.init_irq = mx51_init_irq, -	.handle_irq = imx51_handle_irq, -	.init_time	= mx51_3ds_timer_init, -	.init_machine = mx51_3ds_init, -	.init_late	= imx51_init_late, -	.restart	= mxc_restart, -MACHINE_END diff --git a/arch/arm/mach-imx/mm-imx5.c b/arch/arm/mach-imx/mm-imx5.c index 79d71cf23a1..cf34994cfe2 100644 --- a/arch/arm/mach-imx/mm-imx5.c +++ b/arch/arm/mach-imx/mm-imx5.c @@ -24,16 +24,6 @@  #include "iomux-v3.h"  /* - * Define the MX50 memory map. - */ -static struct map_desc mx50_io_desc[] __initdata = { -	imx_map_entry(MX50, TZIC, MT_DEVICE), -	imx_map_entry(MX50, SPBA0, MT_DEVICE), -	imx_map_entry(MX50, AIPS1, MT_DEVICE), -	imx_map_entry(MX50, AIPS2, MT_DEVICE), -}; - -/*   * Define the MX51 memory map.   */  static struct map_desc mx51_io_desc[] __initdata = { @@ -59,11 +49,6 @@ static struct map_desc mx53_io_desc[] __initdata = {   * system startup to create static physical to virtual memory mappings   * for the IO modules.   */ -void __init mx50_map_io(void) -{ -	iotable_init(mx50_io_desc, ARRAY_SIZE(mx50_io_desc)); -} -  void __init mx51_map_io(void)  {  	iotable_init(mx51_io_desc, ARRAY_SIZE(mx51_io_desc)); @@ -74,13 +59,6 @@ void __init mx53_map_io(void)  	iotable_init(mx53_io_desc, ARRAY_SIZE(mx53_io_desc));  } -void __init imx50_init_early(void) -{ -	mxc_set_cpu_type(MXC_CPU_MX50); -	mxc_iomux_v3_init(MX50_IO_ADDRESS(MX50_IOMUXC_BASE_ADDR)); -	mxc_arch_reset_init(MX50_IO_ADDRESS(MX50_WDOG_BASE_ADDR)); -} -  /*   * The MIPI HSC unit has been removed from the i.MX51 Reference Manual by   * the Freescale marketing division. However this did not remove the @@ -115,11 +93,6 @@ void __init imx53_init_early(void)  	mxc_arch_reset_init(MX53_IO_ADDRESS(MX53_WDOG1_BASE_ADDR));  } -void __init mx50_init_irq(void) -{ -	tzic_init_irq(MX50_IO_ADDRESS(MX50_TZIC_BASE_ADDR)); -} -  void __init mx51_init_irq(void)  {  	tzic_init_irq(MX51_IO_ADDRESS(MX51_TZIC_BASE_ADDR)); @@ -148,31 +121,10 @@ static struct sdma_platform_data imx51_sdma_pdata __initdata = {  	.script_addrs = &imx51_sdma_script,  }; -static const struct resource imx50_audmux_res[] __initconst = { -	DEFINE_RES_MEM(MX50_AUDMUX_BASE_ADDR, SZ_16K), -}; -  static const struct resource imx51_audmux_res[] __initconst = {  	DEFINE_RES_MEM(MX51_AUDMUX_BASE_ADDR, SZ_16K),  }; -void __init imx50_soc_init(void) -{ -	mxc_device_init(); - -	/* i.mx50 has the i.mx35 type gpio */ -	mxc_register_gpio("imx35-gpio", 0, MX50_GPIO1_BASE_ADDR, SZ_16K, MX50_INT_GPIO1_LOW, MX50_INT_GPIO1_HIGH); -	mxc_register_gpio("imx35-gpio", 1, MX50_GPIO2_BASE_ADDR, SZ_16K, MX50_INT_GPIO2_LOW, MX50_INT_GPIO2_HIGH); -	mxc_register_gpio("imx35-gpio", 2, MX50_GPIO3_BASE_ADDR, SZ_16K, MX50_INT_GPIO3_LOW, MX50_INT_GPIO3_HIGH); -	mxc_register_gpio("imx35-gpio", 3, MX50_GPIO4_BASE_ADDR, SZ_16K, MX50_INT_GPIO4_LOW, MX50_INT_GPIO4_HIGH); -	mxc_register_gpio("imx35-gpio", 4, MX50_GPIO5_BASE_ADDR, SZ_16K, MX50_INT_GPIO5_LOW, MX50_INT_GPIO5_HIGH); -	mxc_register_gpio("imx35-gpio", 5, MX50_GPIO6_BASE_ADDR, SZ_16K, MX50_INT_GPIO6_LOW, MX50_INT_GPIO6_HIGH); - -	/* i.mx50 has the i.mx31 type audmux */ -	platform_device_register_simple("imx31-audmux", 0, imx50_audmux_res, -					ARRAY_SIZE(imx50_audmux_res)); -} -  void __init imx51_soc_init(void)  {  	mxc_device_init(); diff --git a/arch/arm/mach-imx/mx50.h b/arch/arm/mach-imx/mx50.h deleted file mode 100644 index 09ac19c1570..00000000000 --- a/arch/arm/mach-imx/mx50.h +++ /dev/null @@ -1,290 +0,0 @@ -#ifndef __MACH_MX50_H__ -#define __MACH_MX50_H__ - -/* - * IROM - */ -#define MX50_IROM_BASE_ADDR		0x0 -#define MX50_IROM_SIZE			SZ_64K - -/* TZIC */ -#define MX50_TZIC_BASE_ADDR		0x0fffc000 -#define MX50_TZIC_SIZE			SZ_16K - -/* - * IRAM - */ -#define MX50_IRAM_BASE_ADDR	0xf8000000	/* internal ram */ -#define MX50_IRAM_PARTITIONS	16 -#define MX50_IRAM_SIZE		(MX50_IRAM_PARTITIONS * SZ_8K)	/* 128KB */ - -/* - * Databahn - */ -#define MX50_DATABAHN_BASE_ADDR			0x14000000 - -/* - * Graphics Memory of GPU - */ -#define MX50_GPU2D_BASE_ADDR		0x20000000 - -#define MX50_DEBUG_BASE_ADDR		0x40000000 -#define MX50_DEBUG_SIZE			SZ_1M -#define MX50_ETB_BASE_ADDR		(MX50_DEBUG_BASE_ADDR + 0x00001000) -#define MX50_ETM_BASE_ADDR		(MX50_DEBUG_BASE_ADDR + 0x00002000) -#define MX50_TPIU_BASE_ADDR		(MX50_DEBUG_BASE_ADDR + 0x00003000) -#define MX50_CTI0_BASE_ADDR		(MX50_DEBUG_BASE_ADDR + 0x00004000) -#define MX50_CTI1_BASE_ADDR		(MX50_DEBUG_BASE_ADDR + 0x00005000) -#define MX50_CTI2_BASE_ADDR		(MX50_DEBUG_BASE_ADDR + 0x00006000) -#define MX50_CTI3_BASE_ADDR		(MX50_DEBUG_BASE_ADDR + 0x00007000) -#define MX50_CORTEX_DBG_BASE_ADDR	(MX50_DEBUG_BASE_ADDR + 0x00008000) - -#define MX50_APBHDMA_BASE_ADDR		(MX50_DEBUG_BASE_ADDR + 0x01000000) -#define MX50_OCOTP_CTRL_BASE_ADDR	(MX50_DEBUG_BASE_ADDR + 0x01002000) -#define MX50_DIGCTL_BASE_ADDR		(MX50_DEBUG_BASE_ADDR + 0x01004000) -#define MX50_GPMI_BASE_ADDR		(MX50_DEBUG_BASE_ADDR + 0x01006000) -#define MX50_BCH_BASE_ADDR		(MX50_DEBUG_BASE_ADDR + 0x01008000) -#define MX50_ELCDIF_BASE_ADDR		(MX50_DEBUG_BASE_ADDR + 0x0100a000) -#define MX50_EPXP_BASE_ADDR		(MX50_DEBUG_BASE_ADDR + 0x0100c000) -#define MX50_DCP_BASE_ADDR		(MX50_DEBUG_BASE_ADDR + 0x0100e000) -#define MX50_EPDC_BASE_ADDR		(MX50_DEBUG_BASE_ADDR + 0x01010000) -#define MX50_QOSC_BASE_ADDR		(MX50_DEBUG_BASE_ADDR + 0x01012000) -#define MX50_PERFMON_BASE_ADDR		(MX50_DEBUG_BASE_ADDR + 0x01014000) -#define MX50_SSP_BASE_ADDR		(MX50_DEBUG_BASE_ADDR + 0x01016000) -#define MX50_ANATOP_BASE_ADDR		(MX50_DEBUG_BASE_ADDR + 0x01018000) -#define MX50_NIC_BASE_ADDR		(MX50_DEBUG_BASE_ADDR + 0x08000000) - -/* - * SPBA global module enabled #0 - */ -#define MX50_SPBA0_BASE_ADDR		0x50000000 -#define MX50_SPBA0_SIZE			SZ_1M - -#define MX50_MMC_SDHC1_BASE_ADDR	(MX50_SPBA0_BASE_ADDR + 0x00004000) -#define MX50_MMC_SDHC2_BASE_ADDR	(MX50_SPBA0_BASE_ADDR + 0x00008000) -#define MX50_UART3_BASE_ADDR		(MX50_SPBA0_BASE_ADDR + 0x0000c000) -#define MX50_CSPI1_BASE_ADDR		(MX50_SPBA0_BASE_ADDR + 0x00010000) -#define MX50_SSI2_BASE_ADDR		(MX50_SPBA0_BASE_ADDR + 0x00014000) -#define MX50_MMC_SDHC3_BASE_ADDR	(MX50_SPBA0_BASE_ADDR + 0x00020000) -#define MX50_MMC_SDHC4_BASE_ADDR	(MX50_SPBA0_BASE_ADDR + 0x00024000) - -/* - * AIPS 1 - */ -#define MX50_AIPS1_BASE_ADDR	0x53f00000 -#define MX50_AIPS1_SIZE		SZ_1M - -#define MX50_OTG_BASE_ADDR	(MX50_AIPS1_BASE_ADDR + 0x00080000) -#define MX50_GPIO1_BASE_ADDR	(MX50_AIPS1_BASE_ADDR + 0x00084000) -#define MX50_GPIO2_BASE_ADDR	(MX50_AIPS1_BASE_ADDR + 0x00088000) -#define MX50_GPIO3_BASE_ADDR	(MX50_AIPS1_BASE_ADDR + 0x0008c000) -#define MX50_GPIO4_BASE_ADDR	(MX50_AIPS1_BASE_ADDR + 0x00090000) -#define MX50_KPP_BASE_ADDR	(MX50_AIPS1_BASE_ADDR + 0x00094000) -#define MX50_WDOG_BASE_ADDR	(MX50_AIPS1_BASE_ADDR + 0x00098000) -#define MX50_GPT1_BASE_ADDR	(MX50_AIPS1_BASE_ADDR + 0x000a0000) -#define MX50_SRTC_BASE_ADDR	(MX50_AIPS1_BASE_ADDR + 0x000a4000) -#define MX50_IOMUXC_BASE_ADDR	(MX50_AIPS1_BASE_ADDR + 0x000a8000) -#define MX50_EPIT1_BASE_ADDR	(MX50_AIPS1_BASE_ADDR + 0x000ac000) -#define MX50_PWM1_BASE_ADDR	(MX50_AIPS1_BASE_ADDR + 0x000b4000) -#define MX50_PWM2_BASE_ADDR	(MX50_AIPS1_BASE_ADDR + 0x000b8000) -#define MX50_UART1_BASE_ADDR	(MX50_AIPS1_BASE_ADDR + 0x000bc000) -#define MX50_UART2_BASE_ADDR	(MX50_AIPS1_BASE_ADDR + 0x000c0000) -#define MX50_SRC_BASE_ADDR	(MX50_AIPS1_BASE_ADDR + 0x000d0000) -#define MX50_CCM_BASE_ADDR	(MX50_AIPS1_BASE_ADDR + 0x000d4000) -#define MX50_GPC_BASE_ADDR	(MX50_AIPS1_BASE_ADDR + 0x000d8000) -#define MX50_GPIO5_BASE_ADDR	(MX50_AIPS1_BASE_ADDR + 0x000dc000) -#define MX50_GPIO6_BASE_ADDR	(MX50_AIPS1_BASE_ADDR + 0x000e0000) -#define MX50_I2C3_BASE_ADDR	(MX50_AIPS1_BASE_ADDR + 0x000ec000) -#define MX50_UART4_BASE_ADDR	(MX50_AIPS1_BASE_ADDR + 0x000f0000) - -#define MX50_MSHC_BASE_ADDR	(MX50_AIPS1_BASE_ADDR + 0x000f4000) -#define MX50_RNGB_BASE_ADDR	(MX50_AIPS1_BASE_ADDR + 0x000f8000) - -/* - * AIPS 2 - */ -#define MX50_AIPS2_BASE_ADDR	0x63f00000 -#define MX50_AIPS2_SIZE		SZ_1M - -#define MX50_PLL1_BASE_ADDR	(MX50_AIPS2_BASE_ADDR + 0x00080000) -#define MX50_PLL2_BASE_ADDR	(MX50_AIPS2_BASE_ADDR + 0x00084000) -#define MX50_PLL3_BASE_ADDR	(MX50_AIPS2_BASE_ADDR + 0x00088000) -#define MX50_UART5_BASE_ADDR	(MX50_AIPS2_BASE_ADDR + 0x00090000) -#define MX50_AHBMAX_BASE_ADDR	(MX50_AIPS2_BASE_ADDR + 0x00094000) -#define MX50_ARM_BASE_ADDR	(MX50_AIPS2_BASE_ADDR + 0x000a0000) -#define MX50_OWIRE_BASE_ADDR	(MX50_AIPS2_BASE_ADDR + 0x000a4000) -#define MX50_CSPI2_BASE_ADDR	(MX50_AIPS2_BASE_ADDR + 0x000ac000) -#define MX50_SDMA_BASE_ADDR	(MX50_AIPS2_BASE_ADDR + 0x000b0000) -#define MX50_ROMCP_BASE_ADDR	(MX50_AIPS2_BASE_ADDR + 0x000b8000) -#define MX50_CSPI3_BASE_ADDR	(MX50_AIPS2_BASE_ADDR + 0x000c0000) -#define MX50_I2C2_BASE_ADDR	(MX50_AIPS2_BASE_ADDR + 0x000c4000) -#define MX50_I2C1_BASE_ADDR	(MX50_AIPS2_BASE_ADDR + 0x000c8000) -#define MX50_SSI1_BASE_ADDR	(MX50_AIPS2_BASE_ADDR + 0x000cc000) -#define MX50_AUDMUX_BASE_ADDR	(MX50_AIPS2_BASE_ADDR + 0x000d0000) -#define MX50_WEIM_BASE_ADDR	(MX50_AIPS2_BASE_ADDR + 0x000d8000) -#define MX50_FEC_BASE_ADDR	(MX50_AIPS2_BASE_ADDR + 0x000ec000) - -/* - * Memory regions and CS - */ -#define MX50_CSD0_BASE_ADDR		0x70000000 -#define MX50_CSD1_BASE_ADDR		0xb0000000 -#define MX50_CS0_BASE_ADDR		0xf0000000 - -#define MX50_IO_P2V(x)			IMX_IO_P2V(x) -#define MX50_IO_ADDRESS(x)		IOMEM(MX50_IO_P2V(x)) - -/* - * defines for SPBA modules - */ -#define MX50_SPBA_SDHC1		0x04 -#define MX50_SPBA_SDHC2		0x08 -#define MX50_SPBA_UART3		0x0c -#define MX50_SPBA_CSPI1		0x10 -#define MX50_SPBA_SSI2		0x14 -#define MX50_SPBA_SDHC3		0x20 -#define MX50_SPBA_SDHC4		0x24 -#define MX50_SPBA_SPDIF		0x28 -#define MX50_SPBA_ATA		0x30 -#define MX50_SPBA_SLIM		0x34 -#define MX50_SPBA_HSI2C		0x38 -#define MX50_SPBA_CTRL		0x3c - -/* - * DMA request assignments - */ -#define MX50_DMA_REQ_GPC		1 -#define MX50_DMA_REQ_ATA_UART4_RX	2 -#define MX50_DMA_REQ_ATA_UART4_TX	3 -#define MX50_DMA_REQ_CSPI1_RX		6 -#define MX50_DMA_REQ_CSPI1_TX		7 -#define MX50_DMA_REQ_CSPI2_RX		8 -#define MX50_DMA_REQ_CSPI2_TX		9 -#define MX50_DMA_REQ_I2C3_SDHC3		10 -#define MX50_DMA_REQ_SDHC4		11 -#define MX50_DMA_REQ_UART2_FIRI_RX	12 -#define MX50_DMA_REQ_UART2_FIRI_TX	13 -#define MX50_DMA_REQ_EXT0		14 -#define MX50_DMA_REQ_EXT1		15 -#define MX50_DMA_REQ_UART5_RX		16 -#define MX50_DMA_REQ_UART5_TX		17 -#define MX50_DMA_REQ_UART1_RX		18 -#define MX50_DMA_REQ_UART1_TX		19 -#define MX50_DMA_REQ_I2C1_SDHC1		20 -#define MX50_DMA_REQ_I2C2_SDHC2		21 -#define MX50_DMA_REQ_SSI2_RX2		22 -#define MX50_DMA_REQ_SSI2_TX2		23 -#define MX50_DMA_REQ_SSI2_RX1		24 -#define MX50_DMA_REQ_SSI2_TX1		25 -#define MX50_DMA_REQ_SSI1_RX2		26 -#define MX50_DMA_REQ_SSI1_TX2		27 -#define MX50_DMA_REQ_SSI1_RX1		28 -#define MX50_DMA_REQ_SSI1_TX1		29 -#define MX50_DMA_REQ_CSPI_RX		38 -#define MX50_DMA_REQ_CSPI_TX		39 -#define MX50_DMA_REQ_UART3_RX		42 -#define MX50_DMA_REQ_UART3_TX		43 - -/* - * Interrupt numbers - */ -#include <asm/irq.h> -#define MX50_INT_MMC_SDHC1	(NR_IRQS_LEGACY + 1) -#define MX50_INT_MMC_SDHC2	(NR_IRQS_LEGACY + 2) -#define MX50_INT_MMC_SDHC3	(NR_IRQS_LEGACY + 3) -#define MX50_INT_MMC_SDHC4	(NR_IRQS_LEGACY + 4) -#define MX50_INT_DAP		(NR_IRQS_LEGACY + 5) -#define MX50_INT_SDMA		(NR_IRQS_LEGACY + 6) -#define MX50_INT_IOMUX		(NR_IRQS_LEGACY + 7) -#define MX50_INT_UART4		(NR_IRQS_LEGACY + 13) -#define MX50_INT_USB_H1		(NR_IRQS_LEGACY + 14) -#define MX50_INT_USB_OTG	(NR_IRQS_LEGACY + 18) -#define MX50_INT_DATABAHN	(NR_IRQS_LEGACY + 19) -#define MX50_INT_ELCDIF		(NR_IRQS_LEGACY + 20) -#define MX50_INT_EPXP		(NR_IRQS_LEGACY + 21) -#define MX50_INT_SRTC_NTZ	(NR_IRQS_LEGACY + 24) -#define MX50_INT_SRTC_TZ	(NR_IRQS_LEGACY + 25) -#define MX50_INT_EPDC		(NR_IRQS_LEGACY + 27) -#define MX50_INT_NIC		(NR_IRQS_LEGACY + 28) -#define MX50_INT_SSI1		(NR_IRQS_LEGACY + 29) -#define MX50_INT_SSI2		(NR_IRQS_LEGACY + 30) -#define MX50_INT_UART1		(NR_IRQS_LEGACY + 31) -#define MX50_INT_UART2		(NR_IRQS_LEGACY + 32) -#define MX50_INT_UART3		(NR_IRQS_LEGACY + 33) -#define MX50_INT_RESV34		(NR_IRQS_LEGACY + 34) -#define MX50_INT_RESV35		(NR_IRQS_LEGACY + 35) -#define MX50_INT_CSPI1		(NR_IRQS_LEGACY + 36) -#define MX50_INT_CSPI2		(NR_IRQS_LEGACY + 37) -#define MX50_INT_CSPI		(NR_IRQS_LEGACY + 38) -#define MX50_INT_GPT		(NR_IRQS_LEGACY + 39) -#define MX50_INT_EPIT1		(NR_IRQS_LEGACY + 40) -#define MX50_INT_GPIO1_INT7	(NR_IRQS_LEGACY + 42) -#define MX50_INT_GPIO1_INT6	(NR_IRQS_LEGACY + 43) -#define MX50_INT_GPIO1_INT5	(NR_IRQS_LEGACY + 44) -#define MX50_INT_GPIO1_INT4	(NR_IRQS_LEGACY + 45) -#define MX50_INT_GPIO1_INT3	(NR_IRQS_LEGACY + 46) -#define MX50_INT_GPIO1_INT2	(NR_IRQS_LEGACY + 47) -#define MX50_INT_GPIO1_INT1	(NR_IRQS_LEGACY + 48) -#define MX50_INT_GPIO1_INT0	(NR_IRQS_LEGACY + 49) -#define MX50_INT_GPIO1_LOW	(NR_IRQS_LEGACY + 50) -#define MX50_INT_GPIO1_HIGH	(NR_IRQS_LEGACY + 51) -#define MX50_INT_GPIO2_LOW	(NR_IRQS_LEGACY + 52) -#define MX50_INT_GPIO2_HIGH	(NR_IRQS_LEGACY + 53) -#define MX50_INT_GPIO3_LOW	(NR_IRQS_LEGACY + 54) -#define MX50_INT_GPIO3_HIGH	(NR_IRQS_LEGACY + 55) -#define MX50_INT_GPIO4_LOW	(NR_IRQS_LEGACY + 56) -#define MX50_INT_GPIO4_HIGH	(NR_IRQS_LEGACY + 57) -#define MX50_INT_WDOG1		(NR_IRQS_LEGACY + 58) -#define MX50_INT_KPP		(NR_IRQS_LEGACY + 60) -#define MX50_INT_PWM1		(NR_IRQS_LEGACY + 61) -#define MX50_INT_I2C1		(NR_IRQS_LEGACY + 62) -#define MX50_INT_I2C2		(NR_IRQS_LEGACY + 63) -#define MX50_INT_I2C3		(NR_IRQS_LEGACY + 64) -#define MX50_INT_RESV65		(NR_IRQS_LEGACY + 65) -#define MX50_INT_DCDC		(NR_IRQS_LEGACY + 66) -#define MX50_INT_THERMAL_ALARM	(NR_IRQS_LEGACY + 67) -#define MX50_INT_ANA3		(NR_IRQS_LEGACY + 68) -#define MX50_INT_ANA4		(NR_IRQS_LEGACY + 69) -#define MX50_INT_CCM1		(NR_IRQS_LEGACY + 71) -#define MX50_INT_CCM2		(NR_IRQS_LEGACY + 72) -#define MX50_INT_GPC1		(NR_IRQS_LEGACY + 73) -#define MX50_INT_GPC2		(NR_IRQS_LEGACY + 74) -#define MX50_INT_SRC		(NR_IRQS_LEGACY + 75) -#define MX50_INT_NM		(NR_IRQS_LEGACY + 76) -#define MX50_INT_PMU		(NR_IRQS_LEGACY + 77) -#define MX50_INT_CTI_IRQ	(NR_IRQS_LEGACY + 78) -#define MX50_INT_CTI1_TG0	(NR_IRQS_LEGACY + 79) -#define MX50_INT_CTI1_TG1	(NR_IRQS_LEGACY + 80) -#define MX50_INT_GPU2_IRQ	(NR_IRQS_LEGACY + 84) -#define MX50_INT_GPU2_BUSY	(NR_IRQS_LEGACY + 85) -#define MX50_INT_UART5		(NR_IRQS_LEGACY + 86) -#define MX50_INT_FEC		(NR_IRQS_LEGACY + 87) -#define MX50_INT_OWIRE		(NR_IRQS_LEGACY + 88) -#define MX50_INT_CTI1_TG2	(NR_IRQS_LEGACY + 89) -#define MX50_INT_SJC		(NR_IRQS_LEGACY + 90) -#define MX50_INT_DCP_CHAN1_3	(NR_IRQS_LEGACY + 91) -#define MX50_INT_DCP_CHAN0	(NR_IRQS_LEGACY + 92) -#define MX50_INT_PWM2		(NR_IRQS_LEGACY + 94) -#define MX50_INT_RNGB		(NR_IRQS_LEGACY + 97) -#define MX50_INT_CTI1_TG3	(NR_IRQS_LEGACY + 98) -#define MX50_INT_RAWNAND_BCH	(NR_IRQS_LEGACY + 100) -#define MX50_INT_RAWNAND_GPMI	(NR_IRQS_LEGACY + 102) -#define MX50_INT_GPIO5_LOW	(NR_IRQS_LEGACY + 103) -#define MX50_INT_GPIO5_HIGH	(NR_IRQS_LEGACY + 104) -#define MX50_INT_GPIO6_LOW	(NR_IRQS_LEGACY + 105) -#define MX50_INT_GPIO6_HIGH	(NR_IRQS_LEGACY + 106) -#define MX50_INT_MSHC		(NR_IRQS_LEGACY + 109) -#define MX50_INT_APBHDMA_CHAN0	(NR_IRQS_LEGACY + 110) -#define MX50_INT_APBHDMA_CHAN1	(NR_IRQS_LEGACY + 111) -#define MX50_INT_APBHDMA_CHAN2	(NR_IRQS_LEGACY + 112) -#define MX50_INT_APBHDMA_CHAN3	(NR_IRQS_LEGACY + 113) -#define MX50_INT_APBHDMA_CHAN4	(NR_IRQS_LEGACY + 114) -#define MX50_INT_APBHDMA_CHAN5	(NR_IRQS_LEGACY + 115) -#define MX50_INT_APBHDMA_CHAN6	(NR_IRQS_LEGACY + 116) -#define MX50_INT_APBHDMA_CHAN7	(NR_IRQS_LEGACY + 117) - -#if !defined(__ASSEMBLY__) && !defined(__MXC_BOOT_UNCOMPRESS) -extern int mx50_revision(void); -#endif - -#endif /* ifndef __MACH_MX50_H__ */ diff --git a/arch/arm/mach-imx/mxc.h b/arch/arm/mach-imx/mxc.h index d78298366a9..7dce17a9fe6 100644 --- a/arch/arm/mach-imx/mxc.h +++ b/arch/arm/mach-imx/mxc.h @@ -32,7 +32,6 @@  #define MXC_CPU_MX27		27  #define MXC_CPU_MX31		31  #define MXC_CPU_MX35		35 -#define MXC_CPU_MX50		50  #define MXC_CPU_MX51		51  #define MXC_CPU_MX53		53 @@ -126,18 +125,6 @@ extern unsigned int __mxc_cpu_type;  # define cpu_is_mx35()		(0)  #endif -#ifdef CONFIG_SOC_IMX50 -# ifdef mxc_cpu_type -#  undef mxc_cpu_type -#  define mxc_cpu_type __mxc_cpu_type -# else -#  define mxc_cpu_type MXC_CPU_MX50 -# endif -# define cpu_is_mx50()		(mxc_cpu_type == MXC_CPU_MX50) -#else -# define cpu_is_mx50()		(0) -#endif -  #ifdef CONFIG_SOC_IMX51  # ifdef mxc_cpu_type  #  undef mxc_cpu_type diff --git a/arch/arm/mach-imx/platsmp.c b/arch/arm/mach-imx/platsmp.c index 3777b805b76..7c0b03f67b0 100644 --- a/arch/arm/mach-imx/platsmp.c +++ b/arch/arm/mach-imx/platsmp.c @@ -12,14 +12,16 @@  #include <linux/init.h>  #include <linux/smp.h> +#include <linux/irqchip/arm-gic.h>  #include <asm/page.h>  #include <asm/smp_scu.h> -#include <asm/hardware/gic.h>  #include <asm/mach/map.h>  #include "common.h"  #include "hardware.h" +#define SCU_STANDBY_ENABLE	(1 << 5) +  static void __iomem *scu_base;  static struct map_desc scu_io_desc __initdata = { @@ -42,6 +44,14 @@ void __init imx_scu_map_io(void)  	scu_base = IMX_IO_ADDRESS(base);  } +void imx_scu_standby_enable(void) +{ +	u32 val = readl_relaxed(scu_base); + +	val |= SCU_STANDBY_ENABLE; +	writel_relaxed(val, scu_base); +} +  static void __cpuinit imx_secondary_init(unsigned int cpu)  {  	/* @@ -71,8 +81,6 @@ static void __init imx_smp_init_cpus(void)  	for (i = 0; i < ncores; i++)  		set_cpu_possible(i, true); - -	set_smp_cross_call(gic_raise_softirq);  }  void imx_smp_prepare(void) @@ -92,5 +100,6 @@ struct smp_operations  imx_smp_ops __initdata = {  	.smp_boot_secondary	= imx_boot_secondary,  #ifdef CONFIG_HOTPLUG_CPU  	.cpu_die		= imx_cpu_die, +	.cpu_kill		= imx_cpu_kill,  #endif  }; diff --git a/arch/arm/mach-imx/pm-imx5.c b/arch/arm/mach-imx/pm-imx5.c index 2e063c2deb9..f67fd7ee812 100644 --- a/arch/arm/mach-imx/pm-imx5.c +++ b/arch/arm/mach-imx/pm-imx5.c @@ -34,7 +34,7 @@  /*   * set cpu low power mode before WFI instruction. This function is called - * mx5 because it can be used for mx50, mx51, and mx53. + * mx5 because it can be used for mx51, and mx53.   */  static void mx5_cpu_lp_set(enum mxc_cpu_pwr_mode mode)  { @@ -85,10 +85,7 @@ static void mx5_cpu_lp_set(enum mxc_cpu_pwr_mode mode)  	__raw_writel(plat_lpc, MXC_CORTEXA8_PLAT_LPC);  	__raw_writel(ccm_clpcr, MXC_CCM_CLPCR);  	__raw_writel(arm_srpgcr, MXC_SRPG_ARM_SRPGCR); - -	/* Enable NEON SRPG for all but MX50TO1.0. */ -	if (mx50_revision() != IMX_CHIP_REVISION_1_0) -		__raw_writel(arm_srpgcr, MXC_SRPG_NEON_SRPGCR); +	__raw_writel(arm_srpgcr, MXC_SRPG_NEON_SRPGCR);  	if (stop_mode) {  		empgc0 |= MXC_SRPGCR_PCR; diff --git a/arch/arm/mach-imx/pm-imx6q.c b/arch/arm/mach-imx/pm-imx6q.c index a17543da602..ee42d20cba1 100644 --- a/arch/arm/mach-imx/pm-imx6q.c +++ b/arch/arm/mach-imx/pm-imx6q.c @@ -41,6 +41,7 @@ static int imx6q_pm_enter(suspend_state_t state)  		cpu_suspend(0, imx6q_suspend_finish);  		imx_smp_prepare();  		imx_gpc_post_resume(); +		imx6q_set_lpm(WAIT_CLOCKED);  		break;  	default:  		return -EINVAL; diff --git a/arch/arm/mach-imx/time.c b/arch/arm/mach-imx/time.c index f017302f6d0..fea91313678 100644 --- a/arch/arm/mach-imx/time.c +++ b/arch/arm/mach-imx/time.c @@ -152,7 +152,8 @@ static int v2_set_next_event(unsigned long evt,  	__raw_writel(tcmp, timer_base + V2_TCMP); -	return (int)(tcmp - __raw_readl(timer_base + V2_TCN)) < 0 ? +	return evt < 0x7fffffff && +		(int)(tcmp - __raw_readl(timer_base + V2_TCN)) < 0 ?  				-ETIME : 0;  } @@ -256,7 +257,6 @@ static struct irqaction mxc_timer_irq = {  static struct clock_event_device clockevent_mxc = {  	.name		= "mxc_timer1",  	.features	= CLOCK_EVT_FEAT_ONESHOT, -	.shift		= 32,  	.set_mode	= mxc_set_mode,  	.set_next_event	= mx1_2_set_next_event,  	.rating		= 200, @@ -264,21 +264,13 @@ static struct clock_event_device clockevent_mxc = {  static int __init mxc_clockevent_init(struct clk *timer_clk)  { -	unsigned int c = clk_get_rate(timer_clk); -  	if (timer_is_v2())  		clockevent_mxc.set_next_event = v2_set_next_event; -	clockevent_mxc.mult = div_sc(c, NSEC_PER_SEC, -					clockevent_mxc.shift); -	clockevent_mxc.max_delta_ns = -			clockevent_delta2ns(0xfffffffe, &clockevent_mxc); -	clockevent_mxc.min_delta_ns = -			clockevent_delta2ns(0xff, &clockevent_mxc); -  	clockevent_mxc.cpumask = cpumask_of(0); - -	clockevents_register_device(&clockevent_mxc); +	clockevents_config_and_register(&clockevent_mxc, +					clk_get_rate(timer_clk), +					0xff, 0xfffffffe);  	return 0;  } diff --git a/arch/arm/mach-integrator/pci_v3.c b/arch/arm/mach-integrator/pci_v3.c index be50e795536..e7fcea7f330 100644 --- a/arch/arm/mach-integrator/pci_v3.c +++ b/arch/arm/mach-integrator/pci_v3.c @@ -475,13 +475,12 @@ int __init pci_v3_setup(int nr, struct pci_sys_data *sys)  {  	int ret = 0; +	if (!ap_syscon_base) +		return -EINVAL; +  	if (nr == 0) {  		sys->mem_offset = PHYS_PCI_MEM_BASE;  		ret = pci_v3_setup_resources(sys); -		/* Remap the Integrator system controller */ -		ap_syscon_base = ioremap(INTEGRATOR_SC_BASE, 0x100); -		if (!ap_syscon_base) -			return -EINVAL;  	}  	return ret; @@ -497,6 +496,13 @@ void __init pci_v3_preinit(void)  	unsigned int temp;  	int ret; +	/* Remap the Integrator system controller */ +	ap_syscon_base = ioremap(INTEGRATOR_SC_BASE, 0x100); +	if (!ap_syscon_base) { +		pr_err("unable to remap the AP syscon for PCIv3\n"); +		return; +	} +  	pcibios_min_mem = 0x00100000;  	/* diff --git a/arch/arm/mach-ixp4xx/common.c b/arch/arm/mach-ixp4xx/common.c index f6ac695ceb6..1dbeb7c99d5 100644 --- a/arch/arm/mach-ixp4xx/common.c +++ b/arch/arm/mach-ixp4xx/common.c @@ -519,22 +519,15 @@ static struct clock_event_device clockevent_ixp4xx = {  	.name		= "ixp4xx timer1",  	.features       = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT,  	.rating         = 200, -	.shift		= 24,  	.set_mode	= ixp4xx_set_mode,  	.set_next_event	= ixp4xx_set_next_event,  };  static void __init ixp4xx_clockevent_init(void)  { -	clockevent_ixp4xx.mult = div_sc(IXP4XX_TIMER_FREQ, NSEC_PER_SEC, -					clockevent_ixp4xx.shift); -	clockevent_ixp4xx.max_delta_ns = -		clockevent_delta2ns(0xfffffffe, &clockevent_ixp4xx); -	clockevent_ixp4xx.min_delta_ns = -		clockevent_delta2ns(0xf, &clockevent_ixp4xx);  	clockevent_ixp4xx.cpumask = cpumask_of(0); - -	clockevents_register_device(&clockevent_ixp4xx); +	clockevents_config_and_register(&clockevent_ixp4xx, IXP4XX_TIMER_FREQ, +					0xf, 0xfffffffe);  }  void ixp4xx_restart(char mode, const char *cmd) diff --git a/arch/arm/mach-kirkwood/Makefile b/arch/arm/mach-kirkwood/Makefile index 8d2e5a96247..d6653095a1e 100644 --- a/arch/arm/mach-kirkwood/Makefile +++ b/arch/arm/mach-kirkwood/Makefile @@ -19,7 +19,6 @@ obj-$(CONFIG_MACH_NET2BIG_V2)		+= netxbig_v2-setup.o lacie_v2-common.o  obj-$(CONFIG_MACH_NET5BIG_V2)		+= netxbig_v2-setup.o lacie_v2-common.o  obj-$(CONFIG_MACH_T5325)		+= t5325-setup.o -obj-$(CONFIG_CPU_IDLE)			+= cpuidle.o  obj-$(CONFIG_ARCH_KIRKWOOD_DT)		+= board-dt.o  obj-$(CONFIG_MACH_DREAMPLUG_DT)		+= board-dreamplug.o  obj-$(CONFIG_MACH_ICONNECT_DT)		+= board-iconnect.o diff --git a/arch/arm/mach-kirkwood/board-dt.c b/arch/arm/mach-kirkwood/board-dt.c index d4af5c191c2..95cc04d14b6 100644 --- a/arch/arm/mach-kirkwood/board-dt.c +++ b/arch/arm/mach-kirkwood/board-dt.c @@ -98,6 +98,8 @@ static void __init kirkwood_dt_init(void)  	/* Setup root of clk tree */  	kirkwood_of_clk_init(); +	kirkwood_cpuidle_init(); +  #ifdef CONFIG_KEXEC  	kexec_reinit = kirkwood_enable_pcie;  #endif diff --git a/arch/arm/mach-kirkwood/board-ns2.c b/arch/arm/mach-kirkwood/board-ns2.c index 8821720ab5a..f4632a809f6 100644 --- a/arch/arm/mach-kirkwood/board-ns2.c +++ b/arch/arm/mach-kirkwood/board-ns2.c @@ -18,47 +18,11 @@  #include <linux/gpio.h>  #include <linux/of.h>  #include "common.h" -#include "mpp.h"  static struct mv643xx_eth_platform_data ns2_ge00_data = {  	.phy_addr	= MV643XX_ETH_PHY_ADDR(8),  }; -static unsigned int ns2_mpp_config[] __initdata = { -	MPP0_SPI_SCn, -	MPP1_SPI_MOSI, -	MPP2_SPI_SCK, -	MPP3_SPI_MISO, -	MPP4_NF_IO6, -	MPP5_NF_IO7, -	MPP6_SYSRST_OUTn, -	MPP7_GPO,		/* Fan speed (bit 1) */ -	MPP8_TW0_SDA, -	MPP9_TW0_SCK, -	MPP10_UART0_TXD, -	MPP11_UART0_RXD, -	MPP12_GPO,		/* Red led */ -	MPP14_GPIO,		/* USB fuse */ -	MPP16_GPIO,		/* SATA 0 power */ -	MPP17_GPIO,		/* SATA 1 power */ -	MPP18_NF_IO0, -	MPP19_NF_IO1, -	MPP20_SATA1_ACTn, -	MPP21_SATA0_ACTn, -	MPP22_GPIO,		/* Fan speed (bit 0) */ -	MPP23_GPIO,		/* Fan power */ -	MPP24_GPIO,		/* USB mode select */ -	MPP25_GPIO,		/* Fan rotation fail */ -	MPP26_GPIO,		/* USB device vbus */ -	MPP28_GPIO,		/* USB enable host vbus */ -	MPP29_GPIO,		/* Blue led (slow register) */ -	MPP30_GPIO,		/* Blue led (command register) */ -	MPP31_GPIO,		/* Board power off */ -	MPP32_GPIO,		/* Power button (0 = Released, 1 = Pushed) */ -	MPP33_GPO,		/* Fan speed (bit 2) */ -	0 -}; -  #define NS2_GPIO_POWER_OFF	31  static void ns2_power_off(void) @@ -71,8 +35,6 @@ void __init ns2_init(void)  	/*  	 * Basic setup. Needs to be called early.  	 */ -	kirkwood_mpp_conf(ns2_mpp_config); -  	if (of_machine_is_compatible("lacie,netspace_lite_v2") ||  	    of_machine_is_compatible("lacie,netspace_mini_v2"))  		ns2_ge00_data.phy_addr = MV643XX_ETH_PHY_ADDR(0); diff --git a/arch/arm/mach-kirkwood/common.c b/arch/arm/mach-kirkwood/common.c index b5ad4dff6b1..49792a0cd2d 100644 --- a/arch/arm/mach-kirkwood/common.c +++ b/arch/arm/mach-kirkwood/common.c @@ -499,6 +499,28 @@ void __init kirkwood_wdt_init(void)  	orion_wdt_init();  } +/***************************************************************************** + * CPU idle + ****************************************************************************/ +static struct resource kirkwood_cpuidle_resource[] = { +	{ +		.flags	= IORESOURCE_MEM, +		.start	= DDR_OPERATION_BASE, +		.end	= DDR_OPERATION_BASE + 3, +	}, +}; + +static struct platform_device kirkwood_cpuidle = { +	.name		= "kirkwood_cpuidle", +	.id		= -1, +	.resource	= kirkwood_cpuidle_resource, +	.num_resources	= 1, +}; + +void __init kirkwood_cpuidle_init(void) +{ +	platform_device_register(&kirkwood_cpuidle); +}  /*****************************************************************************   * Time handling @@ -667,6 +689,7 @@ void __init kirkwood_init(void)  	kirkwood_xor1_init();  	kirkwood_crypto_init(); +	kirkwood_cpuidle_init();  #ifdef CONFIG_KEXEC  	kexec_reinit = kirkwood_enable_pcie;  #endif diff --git a/arch/arm/mach-kirkwood/common.h b/arch/arm/mach-kirkwood/common.h index 283ab611e8d..e956d0277dd 100644 --- a/arch/arm/mach-kirkwood/common.h +++ b/arch/arm/mach-kirkwood/common.h @@ -50,6 +50,7 @@ void kirkwood_nand_init(struct mtd_partition *parts, int nr_parts, int delay);  void kirkwood_nand_init_rnb(struct mtd_partition *parts, int nr_parts,  			    int (*dev_ready)(struct mtd_info *));  void kirkwood_audio_init(void); +void kirkwood_cpuidle_init(void);  void kirkwood_restart(char, const char *);  void kirkwood_clk_init(void); diff --git a/arch/arm/mach-kirkwood/cpuidle.c b/arch/arm/mach-kirkwood/cpuidle.c deleted file mode 100644 index f7304670f2f..00000000000 --- a/arch/arm/mach-kirkwood/cpuidle.c +++ /dev/null @@ -1,73 +0,0 @@ -/* - * arch/arm/mach-kirkwood/cpuidle.c - * - * CPU idle Marvell Kirkwood SoCs - * - * This file is licensed under the terms of the GNU General Public - * License version 2.  This program is licensed "as is" without any - * warranty of any kind, whether express or implied. - * - * The cpu idle uses wait-for-interrupt and DDR self refresh in order - * to implement two idle states - - * #1 wait-for-interrupt - * #2 wait-for-interrupt and DDR self refresh - */ - -#include <linux/kernel.h> -#include <linux/init.h> -#include <linux/platform_device.h> -#include <linux/cpuidle.h> -#include <linux/io.h> -#include <linux/export.h> -#include <asm/proc-fns.h> -#include <asm/cpuidle.h> -#include <mach/kirkwood.h> - -#define KIRKWOOD_MAX_STATES	2 - -/* Actual code that puts the SoC in different idle states */ -static int kirkwood_enter_idle(struct cpuidle_device *dev, -				struct cpuidle_driver *drv, -			       int index) -{ -	writel(0x7, DDR_OPERATION_BASE); -	cpu_do_idle(); - -	return index; -} - -static struct cpuidle_driver kirkwood_idle_driver = { -	.name			= "kirkwood_idle", -	.owner			= THIS_MODULE, -	.en_core_tk_irqen	= 1, -	.states[0]		= ARM_CPUIDLE_WFI_STATE, -	.states[1]		= { -		.enter			= kirkwood_enter_idle, -		.exit_latency		= 10, -		.target_residency	= 100000, -		.flags			= CPUIDLE_FLAG_TIME_VALID, -		.name			= "DDR SR", -		.desc			= "WFI and DDR Self Refresh", -	}, -	.state_count = KIRKWOOD_MAX_STATES, -}; - -static DEFINE_PER_CPU(struct cpuidle_device, kirkwood_cpuidle_device); - -/* Initialize CPU idle by registering the idle states */ -static int kirkwood_init_cpuidle(void) -{ -	struct cpuidle_device *device; - -	device = &per_cpu(kirkwood_cpuidle_device, smp_processor_id()); -	device->state_count = KIRKWOOD_MAX_STATES; - -	cpuidle_register_driver(&kirkwood_idle_driver); -	if (cpuidle_register_device(device)) { -		pr_err("kirkwood_init_cpuidle: Failed registering\n"); -		return -EIO; -	} -	return 0; -} - -device_initcall(kirkwood_init_cpuidle); diff --git a/arch/arm/mach-kirkwood/include/mach/kirkwood.h b/arch/arm/mach-kirkwood/include/mach/kirkwood.h index 041653a04a9..a05563a31c9 100644 --- a/arch/arm/mach-kirkwood/include/mach/kirkwood.h +++ b/arch/arm/mach-kirkwood/include/mach/kirkwood.h @@ -60,8 +60,9 @@   * Register Map   */  #define DDR_VIRT_BASE		(KIRKWOOD_REGS_VIRT_BASE + 0x00000) +#define DDR_PHYS_BASE		(KIRKWOOD_REGS_PHYS_BASE + 0x00000)  #define  DDR_WINDOW_CPU_BASE	(DDR_VIRT_BASE + 0x1500) -#define DDR_OPERATION_BASE	(DDR_VIRT_BASE + 0x1418) +#define DDR_OPERATION_BASE	(DDR_PHYS_BASE + 0x1418)  #define DEV_BUS_PHYS_BASE	(KIRKWOOD_REGS_PHYS_BASE + 0x10000)  #define DEV_BUS_VIRT_BASE	(KIRKWOOD_REGS_VIRT_BASE + 0x10000) diff --git a/arch/arm/mach-kirkwood/pcie.c b/arch/arm/mach-kirkwood/pcie.c index a1c3ab6fc80..d96ad4c0997 100644 --- a/arch/arm/mach-kirkwood/pcie.c +++ b/arch/arm/mach-kirkwood/pcie.c @@ -247,13 +247,9 @@ static struct hw_pci kirkwood_pci __initdata = {  static void __init add_pcie_port(int index, void __iomem *base)  { -	pr_info("Kirkwood PCIe port %d: ", index); - -	if (orion_pcie_link_up(base)) { -		pr_info("link up\n"); -		pcie_port_map[num_pcie_ports++] = index; -	} else -		pr_info("link down, ignoring\n"); +	pcie_port_map[num_pcie_ports++] = index; +	pr_info("Kirkwood PCIe port %d: link %s\n", index, +		orion_pcie_link_up(base) ? "up" : "down");  }  void __init kirkwood_pcie_init(unsigned int portmask) diff --git a/arch/arm/mach-lpc32xx/timer.c b/arch/arm/mach-lpc32xx/timer.c index 88bd4ce3b94..20eab63d10b 100644 --- a/arch/arm/mach-lpc32xx/timer.c +++ b/arch/arm/mach-lpc32xx/timer.c @@ -70,7 +70,6 @@ static void lpc32xx_clkevt_mode(enum clock_event_mode mode,  static struct clock_event_device lpc32xx_clkevt = {  	.name		= "lpc32xx_clkevt",  	.features	= CLOCK_EVT_FEAT_ONESHOT, -	.shift		= 32,  	.rating		= 300,  	.set_next_event	= lpc32xx_clkevt_next_event,  	.set_mode	= lpc32xx_clkevt_mode, @@ -141,14 +140,8 @@ void __init lpc32xx_timer_init(void)  	setup_irq(IRQ_LPC32XX_TIMER0, &lpc32xx_timer_irq);  	/* Setup the clockevent structure. */ -	lpc32xx_clkevt.mult = div_sc(clkrate, NSEC_PER_SEC, -		lpc32xx_clkevt.shift); -	lpc32xx_clkevt.max_delta_ns = clockevent_delta2ns(-1, -		&lpc32xx_clkevt); -	lpc32xx_clkevt.min_delta_ns = clockevent_delta2ns(1, -		&lpc32xx_clkevt) + 1;  	lpc32xx_clkevt.cpumask = cpumask_of(0); -	clockevents_register_device(&lpc32xx_clkevt); +	clockevents_config_and_register(&lpc32xx_clkevt, clkrate, 1, -1);  	/* Use timer1 as clock source. */  	__raw_writel(LPC32XX_TIMER_CNTR_TCR_RESET, diff --git a/arch/arm/mach-mmp/time.c b/arch/arm/mach-mmp/time.c index 936447c7097..86a18b3d252 100644 --- a/arch/arm/mach-mmp/time.c +++ b/arch/arm/mach-mmp/time.c @@ -141,7 +141,6 @@ static void timer_set_mode(enum clock_event_mode mode,  static struct clock_event_device ckevt = {  	.name		= "clockevent",  	.features	= CLOCK_EVT_FEAT_ONESHOT, -	.shift		= 32,  	.rating		= 200,  	.set_next_event	= timer_set_next_event,  	.set_mode	= timer_set_mode, @@ -198,15 +197,13 @@ void __init timer_init(int irq)  	setup_sched_clock(mmp_read_sched_clock, 32, CLOCK_TICK_RATE); -	ckevt.mult = div_sc(CLOCK_TICK_RATE, NSEC_PER_SEC, ckevt.shift); -	ckevt.max_delta_ns = clockevent_delta2ns(MAX_DELTA, &ckevt); -	ckevt.min_delta_ns = clockevent_delta2ns(MIN_DELTA, &ckevt);  	ckevt.cpumask = cpumask_of(0);  	setup_irq(irq, &timer_irq);  	clocksource_register_hz(&cksrc, CLOCK_TICK_RATE); -	clockevents_register_device(&ckevt); +	clockevents_config_and_register(&ckevt, CLOCK_TICK_RATE, +					MIN_DELTA, MAX_DELTA);  }  #ifdef CONFIG_OF diff --git a/arch/arm/mach-msm/board-dt-8660.c b/arch/arm/mach-msm/board-dt-8660.c index 27c41eabfd1..7dcfc5300bb 100644 --- a/arch/arm/mach-msm/board-dt-8660.c +++ b/arch/arm/mach-msm/board-dt-8660.c @@ -11,26 +11,15 @@   */  #include <linux/init.h> +#include <linux/irqchip.h>  #include <linux/of.h> -#include <linux/of_irq.h>  #include <linux/of_platform.h>  #include <asm/mach/arch.h> -#include <asm/hardware/gic.h>  #include <mach/board.h>  #include "common.h" -static const struct of_device_id msm_dt_gic_match[] __initconst = { -	{ .compatible = "qcom,msm-8660-qgic", .data = gic_of_init }, -	{} -}; - -static void __init msm8x60_init_irq(void) -{ -	of_irq_init(msm_dt_gic_match); -} -  static void __init msm8x60_init_late(void)  {  	smd_debugfs_init(); @@ -55,8 +44,7 @@ static const char *msm8x60_fluid_match[] __initdata = {  DT_MACHINE_START(MSM_DT, "Qualcomm MSM (Flattened Device Tree)")  	.smp = smp_ops(msm_smp_ops),  	.map_io = msm_map_msm8x60_io, -	.init_irq = msm8x60_init_irq, -	.handle_irq = gic_handle_irq, +	.init_irq = irqchip_init,  	.init_machine = msm8x60_dt_init,  	.init_late = msm8x60_init_late,  	.init_time	= msm_dt_timer_init, diff --git a/arch/arm/mach-msm/board-dt-8960.c b/arch/arm/mach-msm/board-dt-8960.c index 3226d527696..73019363ffa 100644 --- a/arch/arm/mach-msm/board-dt-8960.c +++ b/arch/arm/mach-msm/board-dt-8960.c @@ -11,24 +11,13 @@   */  #include <linux/init.h> -#include <linux/of_irq.h> +#include <linux/irqchip.h>  #include <linux/of_platform.h> -#include <asm/hardware/gic.h>  #include <asm/mach/arch.h>  #include "common.h" -static const struct of_device_id msm_dt_gic_match[] __initconst = { -	{ .compatible = "qcom,msm-qgic2", .data = gic_of_init }, -	{ } -}; - -static void __init msm_dt_init_irq(void) -{ -	of_irq_init(msm_dt_gic_match); -} -  static void __init msm_dt_init(void)  {  	of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); @@ -42,9 +31,8 @@ static const char * const msm8960_dt_match[] __initconst = {  DT_MACHINE_START(MSM8960_DT, "Qualcomm MSM (Flattened Device Tree)")  	.smp = smp_ops(msm_smp_ops),  	.map_io = msm_map_msm8960_io, -	.init_irq = msm_dt_init_irq, +	.init_irq = irqchip_init,  	.init_time	= msm_dt_timer_init,  	.init_machine = msm_dt_init,  	.dt_compat = msm8960_dt_match, -	.handle_irq = gic_handle_irq,  MACHINE_END diff --git a/arch/arm/mach-msm/platsmp.c b/arch/arm/mach-msm/platsmp.c index 7ed69b69c87..42932865416 100644 --- a/arch/arm/mach-msm/platsmp.c +++ b/arch/arm/mach-msm/platsmp.c @@ -15,8 +15,8 @@  #include <linux/jiffies.h>  #include <linux/smp.h>  #include <linux/io.h> +#include <linux/irqchip/arm-gic.h> -#include <asm/hardware/gic.h>  #include <asm/cacheflush.h>  #include <asm/cputype.h>  #include <asm/mach-types.h> @@ -115,7 +115,7 @@ static int __cpuinit msm_boot_secondary(unsigned int cpu, struct task_struct *id  	 * the boot monitor to read the system wide flags register,  	 * and branch to the address found there.  	 */ -	gic_raise_softirq(cpumask_of(cpu), 0); +	arch_send_wakeup_ipi_mask(cpumask_of(cpu));  	timeout = jiffies + (1 * HZ);  	while (time_before(jiffies, timeout)) { @@ -153,8 +153,6 @@ static void __init msm_smp_init_cpus(void)  	for (i = 0; i < ncores; i++)  		set_cpu_possible(i, true); - -        set_smp_cross_call(gic_raise_softirq);  }  static void __init msm_smp_prepare_cpus(unsigned int max_cpus) diff --git a/arch/arm/mach-msm/timer.c b/arch/arm/mach-msm/timer.c index 2fb5f3eec50..2969027f02f 100644 --- a/arch/arm/mach-msm/timer.c +++ b/arch/arm/mach-msm/timer.c @@ -25,7 +25,6 @@  #include <linux/of_irq.h>  #include <asm/mach/time.h> -#include <asm/hardware/gic.h>  #include <asm/localtimer.h>  #include <asm/sched_clock.h> @@ -144,13 +143,9 @@ static int __cpuinit msm_local_timer_setup(struct clock_event_device *evt)  	evt->rating = msm_clockevent.rating;  	evt->set_mode = msm_timer_set_mode;  	evt->set_next_event = msm_timer_set_next_event; -	evt->shift = msm_clockevent.shift; -	evt->mult = div_sc(GPT_HZ, NSEC_PER_SEC, evt->shift); -	evt->max_delta_ns = clockevent_delta2ns(0xf0000000, evt); -	evt->min_delta_ns = clockevent_delta2ns(4, evt);  	*__this_cpu_ptr(msm_evt.percpu_evt) = evt; -	clockevents_register_device(evt); +	clockevents_config_and_register(evt, GPT_HZ, 4, 0xf0000000);  	enable_percpu_irq(evt->irq, IRQ_TYPE_EDGE_RISING);  	return 0;  } diff --git a/arch/arm/mach-mvebu/Makefile b/arch/arm/mach-mvebu/Makefile index 5dcb369b58a..99df4df680f 100644 --- a/arch/arm/mach-mvebu/Makefile +++ b/arch/arm/mach-mvebu/Makefile @@ -1,6 +1,8 @@  ccflags-$(CONFIG_ARCH_MULTIPLATFORM) := -I$(srctree)/$(src)/include \  	-I$(srctree)/arch/arm/plat-orion/include +AFLAGS_coherency_ll.o		:= -Wa,-march=armv7-a +  obj-y += system-controller.o  obj-$(CONFIG_MACH_ARMADA_370_XP) += armada-370-xp.o irq-armada-370-xp.o addr-map.o coherency.o coherency_ll.o pmsu.o  obj-$(CONFIG_SMP)                += platsmp.o headsmp.o diff --git a/arch/arm/mach-mxs/timer.c b/arch/arm/mach-mxs/timer.c index 856f4c79606..27451b1ba3f 100644 --- a/arch/arm/mach-mxs/timer.c +++ b/arch/arm/mach-mxs/timer.c @@ -195,7 +195,6 @@ static void mxs_set_mode(enum clock_event_mode mode,  static struct clock_event_device mxs_clockevent_device = {  	.name		= "mxs_timrot",  	.features	= CLOCK_EVT_FEAT_ONESHOT, -	.shift		= 32,  	.set_mode	= mxs_set_mode,  	.set_next_event	= timrotv2_set_next_event,  	.rating		= 200, @@ -203,25 +202,12 @@ static struct clock_event_device mxs_clockevent_device = {  static int __init mxs_clockevent_init(struct clk *timer_clk)  { -	unsigned int c = clk_get_rate(timer_clk); - -	mxs_clockevent_device.mult = -		div_sc(c, NSEC_PER_SEC, mxs_clockevent_device.shift); -	mxs_clockevent_device.cpumask = cpumask_of(0); -	if (timrot_is_v1()) { +	if (timrot_is_v1())  		mxs_clockevent_device.set_next_event = timrotv1_set_next_event; -		mxs_clockevent_device.max_delta_ns = -			clockevent_delta2ns(0xfffe, &mxs_clockevent_device); -		mxs_clockevent_device.min_delta_ns = -			clockevent_delta2ns(0xf, &mxs_clockevent_device); -	} else { -		mxs_clockevent_device.max_delta_ns = -			clockevent_delta2ns(0xfffffffe, &mxs_clockevent_device); -		mxs_clockevent_device.min_delta_ns = -			clockevent_delta2ns(0xf, &mxs_clockevent_device); -	} - -	clockevents_register_device(&mxs_clockevent_device); +	mxs_clockevent_device.cpumask = cpumask_of(0); +	clockevents_config_and_register(&mxs_clockevent_device, +					clk_get_rate(timer_clk), 0xf, +					timrot_is_v1() ? 0xfffe : 0xfffffffe);  	return 0;  } diff --git a/arch/arm/mach-netx/generic.c b/arch/arm/mach-netx/generic.c index aa627465d91..27c2cb7ab81 100644 --- a/arch/arm/mach-netx/generic.c +++ b/arch/arm/mach-netx/generic.c @@ -23,9 +23,9 @@  #include <linux/module.h>  #include <linux/platform_device.h>  #include <linux/io.h> +#include <linux/irqchip/arm-vic.h>  #include <mach/hardware.h>  #include <asm/mach/map.h> -#include <asm/hardware/vic.h>  #include <mach/netx-regs.h>  #include <asm/mach/irq.h> diff --git a/arch/arm/mach-netx/nxdb500.c b/arch/arm/mach-netx/nxdb500.c index 241e1b9c58c..9b558eb3070 100644 --- a/arch/arm/mach-netx/nxdb500.c +++ b/arch/arm/mach-netx/nxdb500.c @@ -28,7 +28,6 @@  #include <mach/hardware.h>  #include <asm/mach-types.h>  #include <asm/mach/arch.h> -#include <asm/hardware/vic.h>  #include <mach/netx-regs.h>  #include <linux/platform_data/eth-netx.h> @@ -204,7 +203,6 @@ MACHINE_START(NXDB500, "Hilscher nxdb500")  	.atag_offset	= 0x100,  	.map_io		= netx_map_io,  	.init_irq	= netx_init_irq, -	.handle_irq	= vic_handle_irq,  	.init_time	= netx_timer_init,  	.init_machine	= nxdb500_init,  	.restart	= netx_restart, diff --git a/arch/arm/mach-netx/nxdkn.c b/arch/arm/mach-netx/nxdkn.c index 055aeecedde..a5e86cd365e 100644 --- a/arch/arm/mach-netx/nxdkn.c +++ b/arch/arm/mach-netx/nxdkn.c @@ -28,7 +28,6 @@  #include <mach/hardware.h>  #include <asm/mach-types.h>  #include <asm/mach/arch.h> -#include <asm/hardware/vic.h>  #include <mach/netx-regs.h>  #include <linux/platform_data/eth-netx.h> @@ -97,7 +96,6 @@ MACHINE_START(NXDKN, "Hilscher nxdkn")  	.atag_offset	= 0x100,  	.map_io		= netx_map_io,  	.init_irq	= netx_init_irq, -	.handle_irq	= vic_handle_irq,  	.init_time	= netx_timer_init,  	.init_machine	= nxdkn_init,  	.restart	= netx_restart, diff --git a/arch/arm/mach-netx/nxeb500hmi.c b/arch/arm/mach-netx/nxeb500hmi.c index 018e91c55b0..ad17885d015 100644 --- a/arch/arm/mach-netx/nxeb500hmi.c +++ b/arch/arm/mach-netx/nxeb500hmi.c @@ -28,7 +28,6 @@  #include <mach/hardware.h>  #include <asm/mach-types.h>  #include <asm/mach/arch.h> -#include <asm/hardware/vic.h>  #include <mach/netx-regs.h>  #include <linux/platform_data/eth-netx.h> @@ -181,7 +180,6 @@ MACHINE_START(NXEB500HMI, "Hilscher nxeb500hmi")  	.atag_offset	= 0x100,  	.map_io		= netx_map_io,  	.init_irq	= netx_init_irq, -	.handle_irq	= vic_handle_irq,  	.init_time	= netx_timer_init,  	.init_machine	= nxeb500hmi_init,  	.restart	= netx_restart, diff --git a/arch/arm/mach-netx/time.c b/arch/arm/mach-netx/time.c index 0dee4524494..6df42e64303 100644 --- a/arch/arm/mach-netx/time.c +++ b/arch/arm/mach-netx/time.c @@ -76,7 +76,6 @@ static int netx_set_next_event(unsigned long evt,  static struct clock_event_device netx_clockevent = {  	.name = "netx-timer" __stringify(TIMER_CLOCKEVENT), -	.shift = 32,  	.features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT,  	.set_next_event = netx_set_next_event,  	.set_mode = netx_set_mode, @@ -140,14 +139,9 @@ void __init netx_timer_init(void)  	clocksource_mmio_init(NETX_GPIO_COUNTER_CURRENT(TIMER_CLOCKSOURCE),  		"netx_timer", CLOCK_TICK_RATE, 200, 32, clocksource_mmio_readl_up); -	netx_clockevent.mult = div_sc(CLOCK_TICK_RATE, NSEC_PER_SEC, -			netx_clockevent.shift); -	netx_clockevent.max_delta_ns = -		clockevent_delta2ns(0xfffffffe, &netx_clockevent);  	/* with max_delta_ns >= delta2ns(0x800) the system currently runs fine.  	 * Adding some safety ... */ -	netx_clockevent.min_delta_ns = -		clockevent_delta2ns(0xa00, &netx_clockevent);  	netx_clockevent.cpumask = cpumask_of(0); -	clockevents_register_device(&netx_clockevent); +	clockevents_config_and_register(&netx_clockevent, CLOCK_TICK_RATE, +					0xa00, 0xfffffffe);  } diff --git a/arch/arm/mach-nomadik/board-nhk8815.c b/arch/arm/mach-nomadik/board-nhk8815.c index c9015ba647a..aaed48d9437 100644 --- a/arch/arm/mach-nomadik/board-nhk8815.c +++ b/arch/arm/mach-nomadik/board-nhk8815.c @@ -27,7 +27,6 @@  #include <linux/pinctrl/machine.h>  #include <linux/platform_data/pinctrl-nomadik.h>  #include <linux/platform_data/clocksource-nomadik-mtu.h> -#include <asm/hardware/vic.h>  #include <asm/sizes.h>  #include <asm/mach-types.h>  #include <asm/mach/arch.h> @@ -348,7 +347,6 @@ MACHINE_START(NOMADIK, "NHK8815")  	.atag_offset	= 0x100,  	.map_io		= cpu8815_map_io,  	.init_irq	= cpu8815_init_irq, -	.handle_irq	= vic_handle_irq,  	.init_time	= nomadik_timer_init,  	.init_machine	= nhk8815_platform_init,  	.restart	= cpu8815_restart, diff --git a/arch/arm/mach-nomadik/cpu-8815.c b/arch/arm/mach-nomadik/cpu-8815.c index 1273931303f..351404673f6 100644 --- a/arch/arm/mach-nomadik/cpu-8815.c +++ b/arch/arm/mach-nomadik/cpu-8815.c @@ -25,13 +25,13 @@  #include <linux/slab.h>  #include <linux/irq.h>  #include <linux/dma-mapping.h> +#include <linux/irqchip/arm-vic.h>  #include <linux/platform_data/clk-nomadik.h>  #include <linux/platform_data/pinctrl-nomadik.h>  #include <mach/hardware.h>  #include <mach/irqs.h>  #include <asm/mach/map.h> -#include <asm/hardware/vic.h>  #include <asm/cacheflush.h>  #include <asm/hardware/cache-l2x0.h> diff --git a/arch/arm/mach-omap1/time.c b/arch/arm/mach-omap1/time.c index 1d4512fdc9b..726ec23d29c 100644 --- a/arch/arm/mach-omap1/time.c +++ b/arch/arm/mach-omap1/time.c @@ -145,7 +145,6 @@ static void omap_mpu_set_mode(enum clock_event_mode mode,  static struct clock_event_device clockevent_mpu_timer1 = {  	.name		= "mpu_timer1",  	.features       = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT, -	.shift		= 32,  	.set_next_event	= omap_mpu_set_next_event,  	.set_mode	= omap_mpu_set_mode,  }; @@ -170,15 +169,9 @@ static __init void omap_init_mpu_timer(unsigned long rate)  	setup_irq(INT_TIMER1, &omap_mpu_timer1_irq);  	omap_mpu_timer_start(0, (rate / HZ) - 1, 1); -	clockevent_mpu_timer1.mult = div_sc(rate, NSEC_PER_SEC, -					    clockevent_mpu_timer1.shift); -	clockevent_mpu_timer1.max_delta_ns = -		clockevent_delta2ns(-1, &clockevent_mpu_timer1); -	clockevent_mpu_timer1.min_delta_ns = -		clockevent_delta2ns(1, &clockevent_mpu_timer1); -  	clockevent_mpu_timer1.cpumask = cpumask_of(0); -	clockevents_register_device(&clockevent_mpu_timer1); +	clockevents_config_and_register(&clockevent_mpu_timer1, rate, +					1, -1);  } diff --git a/arch/arm/mach-omap1/timer32k.c b/arch/arm/mach-omap1/timer32k.c index 41152fadd4c..0b74246ba62 100644 --- a/arch/arm/mach-omap1/timer32k.c +++ b/arch/arm/mach-omap1/timer32k.c @@ -140,7 +140,6 @@ static void omap_32k_timer_set_mode(enum clock_event_mode mode,  static struct clock_event_device clockevent_32k_timer = {  	.name		= "32k-timer",  	.features       = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT, -	.shift		= 32,  	.set_next_event	= omap_32k_timer_set_next_event,  	.set_mode	= omap_32k_timer_set_mode,  }; @@ -165,16 +164,9 @@ static __init void omap_init_32k_timer(void)  {  	setup_irq(INT_OS_TIMER, &omap_32k_timer_irq); -	clockevent_32k_timer.mult = div_sc(OMAP_32K_TICKS_PER_SEC, -					   NSEC_PER_SEC, -					   clockevent_32k_timer.shift); -	clockevent_32k_timer.max_delta_ns = -		clockevent_delta2ns(0xfffffffe, &clockevent_32k_timer); -	clockevent_32k_timer.min_delta_ns = -		clockevent_delta2ns(1, &clockevent_32k_timer); -  	clockevent_32k_timer.cpumask = cpumask_of(0); -	clockevents_register_device(&clockevent_32k_timer); +	clockevents_config_and_register(&clockevent_32k_timer, +					OMAP_32K_TICKS_PER_SEC, 1, 0xfffffffe);  }  /* diff --git a/arch/arm/mach-omap2/board-4430sdp.c b/arch/arm/mach-omap2/board-4430sdp.c index f5d5f5941d7..f8eeef40efe 100644 --- a/arch/arm/mach-omap2/board-4430sdp.c +++ b/arch/arm/mach-omap2/board-4430sdp.c @@ -26,10 +26,10 @@  #include <linux/regulator/fixed.h>  #include <linux/leds.h>  #include <linux/leds_pwm.h> +#include <linux/irqchip/arm-gic.h>  #include <linux/platform_data/omap4-keypad.h>  #include <linux/usb/musb.h> -#include <asm/hardware/gic.h>  #include <asm/mach-types.h>  #include <asm/mach/arch.h>  #include <asm/mach/map.h> @@ -722,7 +722,6 @@ MACHINE_START(OMAP_4430SDP, "OMAP4430 4430SDP board")  	.map_io		= omap4_map_io,  	.init_early	= omap4430_init_early,  	.init_irq	= gic_init_irq, -	.handle_irq	= gic_handle_irq,  	.init_machine	= omap_4430sdp_init,  	.init_late	= omap4430_init_late,  	.init_time	= omap4_local_timer_init, diff --git a/arch/arm/mach-omap2/board-generic.c b/arch/arm/mach-omap2/board-generic.c index 8a5f814613c..2590463e4b5 100644 --- a/arch/arm/mach-omap2/board-generic.c +++ b/arch/arm/mach-omap2/board-generic.c @@ -16,7 +16,6 @@  #include <linux/of_platform.h>  #include <linux/irqdomain.h> -#include <asm/hardware/gic.h>  #include <asm/mach/arch.h>  #include "common.h" @@ -156,7 +155,6 @@ DT_MACHINE_START(OMAP4_DT, "Generic OMAP4 (Flattened Device Tree)")  	.map_io		= omap4_map_io,  	.init_early	= omap4430_init_early,  	.init_irq	= omap_gic_of_init, -	.handle_irq	= gic_handle_irq,  	.init_machine	= omap_generic_init,  	.init_late	= omap4430_init_late,  	.init_time	= omap4_local_timer_init, @@ -177,7 +175,6 @@ DT_MACHINE_START(OMAP5_DT, "Generic OMAP5 (Flattened Device Tree)")  	.map_io		= omap5_map_io,  	.init_early	= omap5_init_early,  	.init_irq	= omap_gic_of_init, -	.handle_irq	= gic_handle_irq,  	.init_machine	= omap_generic_init,  	.init_time	= omap5_realtime_timer_init,  	.dt_compat	= omap5_boards_compat, diff --git a/arch/arm/mach-omap2/board-omap4panda.c b/arch/arm/mach-omap2/board-omap4panda.c index ed8240c1a9b..b62317906b3 100644 --- a/arch/arm/mach-omap2/board-omap4panda.c +++ b/arch/arm/mach-omap2/board-omap4panda.c @@ -31,9 +31,9 @@  #include <linux/ti_wilink_st.h>  #include <linux/usb/musb.h>  #include <linux/wl12xx.h> +#include <linux/irqchip/arm-gic.h>  #include <linux/platform_data/omap-abe-twl6040.h> -#include <asm/hardware/gic.h>  #include <asm/mach-types.h>  #include <asm/mach/arch.h>  #include <asm/mach/map.h> @@ -397,6 +397,12 @@ static struct omap_board_mux board_mux[] __initdata = {  		  OMAP_PULL_ENA),  	OMAP4_MUX(ABE_MCBSP1_FSX, OMAP_MUX_MODE0 | OMAP_PIN_INPUT), +	/* UART2 - BT/FM/GPS shared transport */ +	OMAP4_MUX(UART2_CTS,	OMAP_PIN_INPUT	| OMAP_MUX_MODE0), +	OMAP4_MUX(UART2_RTS,	OMAP_PIN_OUTPUT	| OMAP_MUX_MODE0), +	OMAP4_MUX(UART2_RX,	OMAP_PIN_INPUT	| OMAP_MUX_MODE0), +	OMAP4_MUX(UART2_TX,	OMAP_PIN_OUTPUT	| OMAP_MUX_MODE0), +  	{ .reg_offset = OMAP_MUX_TERMINATOR },  }; @@ -453,7 +459,6 @@ MACHINE_START(OMAP4_PANDA, "OMAP4 Panda board")  	.map_io		= omap4_map_io,  	.init_early	= omap4430_init_early,  	.init_irq	= gic_init_irq, -	.handle_irq	= gic_handle_irq,  	.init_machine	= omap4_panda_init,  	.init_late	= omap4430_init_late,  	.init_time	= omap4_local_timer_init, diff --git a/arch/arm/mach-omap2/cclock2420_data.c b/arch/arm/mach-omap2/cclock2420_data.c index 7e5febe456d..ab7e952d207 100644 --- a/arch/arm/mach-omap2/cclock2420_data.c +++ b/arch/arm/mach-omap2/cclock2420_data.c @@ -1935,6 +1935,8 @@ int __init omap2420_clk_init(void)  			omap2_init_clk_hw_omap_clocks(c->lk.clk);  	} +	omap2xxx_clkt_vps_late_init(); +  	omap2_clk_disable_autoidle_all();  	omap2_clk_enable_init_clocks(enable_init_clks, diff --git a/arch/arm/mach-omap2/cclock2430_data.c b/arch/arm/mach-omap2/cclock2430_data.c index eda079b96c6..eb3dab68d53 100644 --- a/arch/arm/mach-omap2/cclock2430_data.c +++ b/arch/arm/mach-omap2/cclock2430_data.c @@ -2050,6 +2050,8 @@ int __init omap2430_clk_init(void)  			omap2_init_clk_hw_omap_clocks(c->lk.clk);  	} +	omap2xxx_clkt_vps_late_init(); +  	omap2_clk_disable_autoidle_all();  	omap2_clk_enable_init_clocks(enable_init_clks, diff --git a/arch/arm/mach-omap2/cclock44xx_data.c b/arch/arm/mach-omap2/cclock44xx_data.c index 5789a5e2556..a2cc046b47f 100644 --- a/arch/arm/mach-omap2/cclock44xx_data.c +++ b/arch/arm/mach-omap2/cclock44xx_data.c @@ -2026,14 +2026,13 @@ int __init omap4xxx_clk_init(void)  	 * On OMAP4460 the ABE DPLL fails to turn on if in idle low-power  	 * state when turning the ABE clock domain. Workaround this by  	 * locking the ABE DPLL on boot. +	 * Lock the ABE DPLL in any case to avoid issues with audio.  	 */ -	if (cpu_is_omap446x()) { -		rc = clk_set_parent(&abe_dpll_refclk_mux_ck, &sys_32k_ck); -		if (!rc) -			rc = clk_set_rate(&dpll_abe_ck, OMAP4_DPLL_ABE_DEFFREQ); -		if (rc) -			pr_err("%s: failed to configure ABE DPLL!\n", __func__); -	} +	rc = clk_set_parent(&abe_dpll_refclk_mux_ck, &sys_32k_ck); +	if (!rc) +		rc = clk_set_rate(&dpll_abe_ck, OMAP4_DPLL_ABE_DEFFREQ); +	if (rc) +		pr_err("%s: failed to configure ABE DPLL!\n", __func__);  	return 0;  } diff --git a/arch/arm/mach-omap2/devices.c b/arch/arm/mach-omap2/devices.c index 5e304d0719a..626f3ea3142 100644 --- a/arch/arm/mach-omap2/devices.c +++ b/arch/arm/mach-omap2/devices.c @@ -639,7 +639,7 @@ static int count_ocp2scp_devices(struct omap_ocp2scp_dev *ocp2scp_dev)  	return cnt;  } -static void omap_init_ocp2scp(void) +static void __init omap_init_ocp2scp(void)  {  	struct omap_hwmod	*oh;  	struct platform_device	*pdev; diff --git a/arch/arm/mach-omap2/drm.c b/arch/arm/mach-omap2/drm.c index 4c7566c7e24..2a2cfa88ddb 100644 --- a/arch/arm/mach-omap2/drm.c +++ b/arch/arm/mach-omap2/drm.c @@ -25,6 +25,7 @@  #include <linux/dma-mapping.h>  #include <linux/platform_data/omap_drm.h> +#include "soc.h"  #include "omap_device.h"  #include "omap_hwmod.h" @@ -56,7 +57,7 @@ static int __init omap_init_drm(void)  			oh->name);  	} -	platform_data.omaprev = GET_OMAP_REVISION(); +	platform_data.omaprev = GET_OMAP_TYPE;  	return platform_device_register(&omap_drm_device); diff --git a/arch/arm/mach-omap2/omap-smp.c b/arch/arm/mach-omap2/omap-smp.c index e683d0dcef6..d9727218dd0 100644 --- a/arch/arm/mach-omap2/omap-smp.c +++ b/arch/arm/mach-omap2/omap-smp.c @@ -19,9 +19,9 @@  #include <linux/device.h>  #include <linux/smp.h>  #include <linux/io.h> +#include <linux/irqchip/arm-gic.h>  #include <asm/cacheflush.h> -#include <asm/hardware/gic.h>  #include <asm/smp_scu.h>  #include "omap-secure.h" @@ -157,7 +157,7 @@ static int __cpuinit omap4_boot_secondary(unsigned int cpu, struct task_struct *  		booted = true;  	} -	gic_raise_softirq(cpumask_of(cpu), 0); +	arch_send_wakeup_ipi_mask(cpumask_of(cpu));  	/*  	 * Now the secondary core is starting up let it run its @@ -231,8 +231,6 @@ static void __init omap4_smp_init_cpus(void)  	for (i = 0; i < ncores; i++)  		set_cpu_possible(i, true); - -	set_smp_cross_call(gic_raise_softirq);  }  static void __init omap4_smp_prepare_cpus(unsigned int max_cpus) diff --git a/arch/arm/mach-omap2/omap-wakeupgen.c b/arch/arm/mach-omap2/omap-wakeupgen.c index 5d3b4f4f81a..8c5b5e3e354 100644 --- a/arch/arm/mach-omap2/omap-wakeupgen.c +++ b/arch/arm/mach-omap2/omap-wakeupgen.c @@ -24,8 +24,7 @@  #include <linux/cpu.h>  #include <linux/notifier.h>  #include <linux/cpu_pm.h> - -#include <asm/hardware/gic.h> +#include <linux/irqchip/arm-gic.h>  #include "omap-wakeupgen.h"  #include "omap-secure.h" diff --git a/arch/arm/mach-omap2/omap4-common.c b/arch/arm/mach-omap2/omap4-common.c index 6897ae21bb8..54709488360 100644 --- a/arch/arm/mach-omap2/omap4-common.c +++ b/arch/arm/mach-omap2/omap4-common.c @@ -15,13 +15,14 @@  #include <linux/init.h>  #include <linux/io.h>  #include <linux/irq.h> +#include <linux/irqchip.h>  #include <linux/platform_device.h>  #include <linux/memblock.h>  #include <linux/of_irq.h>  #include <linux/of_platform.h>  #include <linux/export.h> +#include <linux/irqchip/arm-gic.h> -#include <asm/hardware/gic.h>  #include <asm/hardware/cache-l2x0.h>  #include <asm/mach/map.h>  #include <asm/memblock.h> @@ -255,16 +256,10 @@ static int __init omap4_sar_ram_init(void)  }  early_initcall(omap4_sar_ram_init); -static struct of_device_id irq_match[] __initdata = { -	{ .compatible = "arm,cortex-a9-gic", .data = gic_of_init, }, -	{ .compatible = "arm,cortex-a15-gic", .data = gic_of_init, }, -	{ } -}; -  void __init omap_gic_of_init(void)  {  	omap_wakeupgen_init(); -	of_irq_init(irq_match); +	irqchip_init();  }  #if defined(CONFIG_MMC_OMAP_HS) || defined(CONFIG_MMC_OMAP_HS_MODULE) diff --git a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c index 129d5081ed1..793f54ac7d1 100644 --- a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c @@ -2132,8 +2132,12 @@ static struct omap_hwmod omap44xx_mcpdm_hwmod = {  	 * currently reset very early during boot, before I2C is  	 * available, so it doesn't seem that we have any choice in  	 * the kernel other than to avoid resetting it. +	 * +	 * Also, McPDM needs to be configured to NO_IDLE mode when it +	 * is in used otherwise vital clocks will be gated which +	 * results 'slow motion' audio playback.  	 */ -	.flags		= HWMOD_EXT_OPT_MAIN_CLK, +	.flags		= HWMOD_EXT_OPT_MAIN_CLK | HWMOD_SWSUP_SIDLE,  	.mpu_irqs	= omap44xx_mcpdm_irqs,  	.sdma_reqs	= omap44xx_mcpdm_sdma_reqs,  	.main_clk	= "mcpdm_fck", diff --git a/arch/arm/mach-omap2/timer.c b/arch/arm/mach-omap2/timer.c index 5975a42e16d..d86074745c5 100644 --- a/arch/arm/mach-omap2/timer.c +++ b/arch/arm/mach-omap2/timer.c @@ -131,7 +131,6 @@ static void omap2_gp_timer_set_mode(enum clock_event_mode mode,  static struct clock_event_device clockevent_gpt = {  	.name		= "gp_timer",  	.features       = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT, -	.shift		= 32,  	.rating		= 300,  	.set_next_event	= omap2_gp_timer_set_next_event,  	.set_mode	= omap2_gp_timer_set_mode, @@ -165,15 +164,11 @@ static struct device_node * __init omap_get_timer_dt(struct of_device_id *match,  	struct device_node *np;  	for_each_matching_node(np, match) { -		if (!of_device_is_available(np)) { -			of_node_put(np); +		if (!of_device_is_available(np))  			continue; -		} -		if (property && !of_get_property(np, property, NULL)) { -			of_node_put(np); +		if (property && !of_get_property(np, property, NULL))  			continue; -		}  		of_add_property(np, &device_disabled);  		return np; @@ -340,17 +335,11 @@ static void __init omap2_gp_clockevent_init(int gptimer_id,  	__omap_dm_timer_int_enable(&clkev, OMAP_TIMER_INT_OVERFLOW); -	clockevent_gpt.mult = div_sc(clkev.rate, NSEC_PER_SEC, -				     clockevent_gpt.shift); -	clockevent_gpt.max_delta_ns = -		clockevent_delta2ns(0xffffffff, &clockevent_gpt); -	clockevent_gpt.min_delta_ns = -		clockevent_delta2ns(3, &clockevent_gpt); -		/* Timer internal resynch latency. */ -  	clockevent_gpt.cpumask = cpu_possible_mask;  	clockevent_gpt.irq = omap_dm_timer_get_irq(&clkev); -	clockevents_register_device(&clockevent_gpt); +	clockevents_config_and_register(&clockevent_gpt, clkev.rate, +					3, /* Timer internal resynch latency */ +					0xffffffff);  	pr_info("OMAP clockevent source: GPTIMER%d at %lu Hz\n",  		gptimer_id, clkev.rate); diff --git a/arch/arm/mach-picoxcell/common.c b/arch/arm/mach-picoxcell/common.c index 518c59bdbcd..70b441ad1d1 100644 --- a/arch/arm/mach-picoxcell/common.c +++ b/arch/arm/mach-picoxcell/common.c @@ -9,6 +9,7 @@   */  #include <linux/delay.h>  #include <linux/irq.h> +#include <linux/irqchip.h>  #include <linux/irqdomain.h>  #include <linux/of.h>  #include <linux/of_address.h> @@ -17,7 +18,6 @@  #include <linux/dw_apb_timer.h>  #include <asm/mach/arch.h> -#include <asm/hardware/vic.h>  #include <asm/mach/map.h>  #include "common.h" @@ -70,16 +70,6 @@ static const char *picoxcell_dt_match[] = {  	NULL  }; -static const struct of_device_id vic_of_match[] __initconst = { -	{ .compatible = "arm,pl192-vic", .data = vic_of_init, }, -	{ /* Sentinel */ } -}; - -static void __init picoxcell_init_irq(void) -{ -	of_irq_init(vic_of_match); -} -  static void picoxcell_wdt_restart(char mode, const char *cmd)  {  	/* @@ -97,8 +87,7 @@ static void picoxcell_wdt_restart(char mode, const char *cmd)  DT_MACHINE_START(PICOXCELL, "Picochip picoXcell")  	.map_io		= picoxcell_map_io,  	.nr_irqs	= NR_IRQS_LEGACY, -	.init_irq	= picoxcell_init_irq, -	.handle_irq	= vic_handle_irq, +	.init_irq	= irqchip_init,  	.init_time	= dw_apb_timer_init,  	.init_machine	= picoxcell_init_machine,  	.dt_compat	= picoxcell_dt_match, diff --git a/arch/arm/mach-prima2/Kconfig b/arch/arm/mach-prima2/Kconfig index 558ccfb8d45..4f7379fe01e 100644 --- a/arch/arm/mach-prima2/Kconfig +++ b/arch/arm/mach-prima2/Kconfig @@ -11,6 +11,16 @@ config ARCH_PRIMA2  	help            Support for CSR SiRFSoC ARM Cortex A9 Platform +config ARCH_MARCO +	bool "CSR SiRFSoC MARCO ARM Cortex A9 Platform" +	default y +	select ARM_GIC +	select CPU_V7 +	select HAVE_SMP +	select SMP_ON_UP +	help +          Support for CSR SiRFSoC ARM Cortex A9 Platform +  endmenu  config SIRF_IRQ diff --git a/arch/arm/mach-prima2/Makefile b/arch/arm/mach-prima2/Makefile index fc9ce22e2b5..bfe360cbd17 100644 --- a/arch/arm/mach-prima2/Makefile +++ b/arch/arm/mach-prima2/Makefile @@ -1,4 +1,3 @@ -obj-y := timer.o  obj-y += rstc.o  obj-y += common.o  obj-y += rtciobrg.o @@ -6,3 +5,7 @@ obj-$(CONFIG_DEBUG_LL) += lluart.o  obj-$(CONFIG_CACHE_L2X0) += l2x0.o  obj-$(CONFIG_SUSPEND) += pm.o sleep.o  obj-$(CONFIG_SIRF_IRQ) += irq.o +obj-$(CONFIG_SMP) += platsmp.o headsmp.o +obj-$(CONFIG_HOTPLUG_CPU)  += hotplug.o +obj-$(CONFIG_ARCH_PRIMA2) += timer-prima2.o +obj-$(CONFIG_ARCH_MARCO) += timer-marco.o diff --git a/arch/arm/mach-prima2/common.c b/arch/arm/mach-prima2/common.c index ed3570e5eb8..2d57aa479a7 100644 --- a/arch/arm/mach-prima2/common.c +++ b/arch/arm/mach-prima2/common.c @@ -8,6 +8,7 @@  #include <linux/init.h>  #include <linux/kernel.h> +#include <linux/irqchip.h>  #include <asm/sizes.h>  #include <asm/mach-types.h>  #include <asm/mach/arch.h> @@ -30,6 +31,12 @@ void __init sirfsoc_init_late(void)  	sirfsoc_pm_init();  } +static __init void sirfsoc_map_io(void) +{ +	sirfsoc_map_lluart(); +	sirfsoc_map_scu(); +} +  #ifdef CONFIG_ARCH_PRIMA2  static const char *prima2_dt_match[] __initdata = {         "sirf,prima2", @@ -38,9 +45,12 @@ static const char *prima2_dt_match[] __initdata = {  DT_MACHINE_START(PRIMA2_DT, "Generic PRIMA2 (Flattened Device Tree)")  	/* Maintainer: Barry Song <baohua.song@csr.com> */ -	.map_io         = sirfsoc_map_lluart, +	.map_io         = sirfsoc_map_io,  	.init_irq	= sirfsoc_of_irq_init, -	.init_time	= sirfsoc_timer_init, +	.init_time	= sirfsoc_prima2_timer_init, +#ifdef CONFIG_MULTI_IRQ_HANDLER +	.handle_irq     = sirfsoc_handle_irq, +#endif  	.dma_zone_size	= SZ_256M,  	.init_machine	= sirfsoc_mach_init,  	.init_late	= sirfsoc_init_late, @@ -48,3 +58,22 @@ DT_MACHINE_START(PRIMA2_DT, "Generic PRIMA2 (Flattened Device Tree)")  	.restart	= sirfsoc_restart,  MACHINE_END  #endif + +#ifdef CONFIG_ARCH_MARCO +static const char *marco_dt_match[] __initdata = { +	"sirf,marco", +	NULL +}; + +DT_MACHINE_START(MARCO_DT, "Generic MARCO (Flattened Device Tree)") +	/* Maintainer: Barry Song <baohua.song@csr.com> */ +	.smp            = smp_ops(sirfsoc_smp_ops), +	.map_io         = sirfsoc_map_io, +	.init_irq	= irqchip_init, +	.init_time	= sirfsoc_marco_timer_init, +	.init_machine	= sirfsoc_mach_init, +	.init_late	= sirfsoc_init_late, +	.dt_compat      = marco_dt_match, +	.restart	= sirfsoc_restart, +MACHINE_END +#endif diff --git a/arch/arm/mach-prima2/common.h b/arch/arm/mach-prima2/common.h index 9c75f124e3c..b7c26b62e4a 100644 --- a/arch/arm/mach-prima2/common.h +++ b/arch/arm/mach-prima2/common.h @@ -11,12 +11,19 @@  #include <linux/init.h>  #include <asm/mach/time.h> +#include <asm/exception.h> -extern void sirfsoc_timer_init(void); +extern void sirfsoc_prima2_timer_init(void); +extern void sirfsoc_marco_timer_init(void); + +extern struct smp_operations   sirfsoc_smp_ops; +extern void sirfsoc_secondary_startup(void); +extern void sirfsoc_cpu_die(unsigned int cpu);  extern void __init sirfsoc_of_irq_init(void);  extern void __init sirfsoc_of_clk_init(void);  extern void sirfsoc_restart(char, const char *); +extern asmlinkage void __exception_irq_entry sirfsoc_handle_irq(struct pt_regs *regs);  #ifndef CONFIG_DEBUG_LL  static inline void sirfsoc_map_lluart(void)  {} @@ -24,6 +31,12 @@ static inline void sirfsoc_map_lluart(void)  {}  extern void __init sirfsoc_map_lluart(void);  #endif +#ifndef CONFIG_SMP +static inline void sirfsoc_map_scu(void) {} +#else +extern void sirfsoc_map_scu(void); +#endif +  #ifdef CONFIG_SUSPEND  extern int sirfsoc_pm_init(void);  #else diff --git a/arch/arm/mach-prima2/headsmp.S b/arch/arm/mach-prima2/headsmp.S new file mode 100644 index 00000000000..6ec19d51a27 --- /dev/null +++ b/arch/arm/mach-prima2/headsmp.S @@ -0,0 +1,79 @@ +/* + * Entry of the second core for CSR Marco dual-core SMP SoCs + * + * Copyright (c) 2012 Cambridge Silicon Radio Limited, a CSR plc group company. + * + * Licensed under GPLv2 or later. + */ + +#include <linux/linkage.h> +#include <linux/init.h> + +	__INIT +/* + * Cold boot and hardware reset show different behaviour, + * system will be always panic if we warm-reset the board + * Here we invalidate L1 of CPU1 to make sure there isn't + * uninitialized data written into memory later + */ +ENTRY(v7_invalidate_l1) +	mov	r0, #0 +	mcr	p15, 0, r0, c7, c5, 0	@ invalidate I cache +	mcr	p15, 2, r0, c0, c0, 0 +	mrc	p15, 1, r0, c0, c0, 0 + +	ldr	r1, =0x7fff +	and	r2, r1, r0, lsr #13 + +	ldr	r1, =0x3ff + +	and	r3, r1, r0, lsr #3	@ NumWays - 1 +	add	r2, r2, #1		@ NumSets + +	and	r0, r0, #0x7 +	add	r0, r0, #4	@ SetShift + +	clz	r1, r3		@ WayShift +	add	r4, r3, #1	@ NumWays +1:	sub	r2, r2, #1	@ NumSets-- +	mov	r3, r4		@ Temp = NumWays +2:	subs	r3, r3, #1	@ Temp-- +	mov	r5, r3, lsl r1 +	mov	r6, r2, lsl r0 +	orr	r5, r5, r6	@ Reg = (Temp<<WayShift)|(NumSets<<SetShift) +	mcr	p15, 0, r5, c7, c6, 2 +	bgt	2b +	cmp	r2, #0 +	bgt	1b +	dsb +	isb +	mov	pc, lr +ENDPROC(v7_invalidate_l1) + +/* + * SIRFSOC specific entry point for secondary CPUs.  This provides + * a "holding pen" into which all secondary cores are held until we're + * ready for them to initialise. + */ +ENTRY(sirfsoc_secondary_startup) +	bl v7_invalidate_l1 +        mrc     p15, 0, r0, c0, c0, 5 +        and     r0, r0, #15 +        adr     r4, 1f +        ldmia   r4, {r5, r6} +        sub     r4, r4, r5 +        add     r6, r6, r4 +pen:    ldr     r7, [r6] +        cmp     r7, r0 +        bne     pen + +        /* +         * we've been released from the holding pen: secondary_stack +         * should now contain the SVC stack for this core +         */ +        b       secondary_startup +ENDPROC(sirfsoc_secondary_startup) + +        .align +1:      .long   . +        .long   pen_release diff --git a/arch/arm/mach-prima2/hotplug.c b/arch/arm/mach-prima2/hotplug.c new file mode 100644 index 00000000000..97c1ee58644 --- /dev/null +++ b/arch/arm/mach-prima2/hotplug.c @@ -0,0 +1,41 @@ +/* + * CPU hotplug support for CSR Marco dual-core SMP SoCs + * + * Copyright (c) 2012 Cambridge Silicon Radio Limited, a CSR plc group company. + * + * Licensed under GPLv2 or later. + */ + +#include <linux/kernel.h> +#include <linux/errno.h> +#include <linux/smp.h> + +#include <asm/cacheflush.h> +#include <asm/smp_plat.h> + +static inline void platform_do_lowpower(unsigned int cpu) +{ +	flush_cache_all(); + +	/* we put the platform to just WFI */ +	for (;;) { +		__asm__ __volatile__("dsb\n\t" "wfi\n\t" +			: : : "memory"); +		if (pen_release == cpu_logical_map(cpu)) { +			/* +			 * OK, proper wakeup, we're done +			 */ +			break; +		} +	} +} + +/* + * platform-specific code to shutdown a CPU + * + * Called with IRQs disabled + */ +void sirfsoc_cpu_die(unsigned int cpu) +{ +	platform_do_lowpower(cpu); +} diff --git a/arch/arm/mach-prima2/include/mach/irqs.h b/arch/arm/mach-prima2/include/mach/irqs.h index f6014a07541..b778a0f248e 100644 --- a/arch/arm/mach-prima2/include/mach/irqs.h +++ b/arch/arm/mach-prima2/include/mach/irqs.h @@ -10,8 +10,8 @@  #define __ASM_ARCH_IRQS_H  #define SIRFSOC_INTENAL_IRQ_START  0 -#define SIRFSOC_INTENAL_IRQ_END    59 +#define SIRFSOC_INTENAL_IRQ_END    127  #define SIRFSOC_GPIO_IRQ_START     (SIRFSOC_INTENAL_IRQ_END + 1) -#define NR_IRQS	220 +#define NR_IRQS	288  #endif diff --git a/arch/arm/mach-prima2/include/mach/uart.h b/arch/arm/mach-prima2/include/mach/uart.h index c98b4d5ac24..c10510d01a4 100644 --- a/arch/arm/mach-prima2/include/mach/uart.h +++ b/arch/arm/mach-prima2/include/mach/uart.h @@ -10,7 +10,13 @@  #define __MACH_PRIMA2_SIRFSOC_UART_H  /* UART-1: used as serial debug port */ +#if defined(CONFIG_DEBUG_SIRFPRIMA2_UART1)  #define SIRFSOC_UART1_PA_BASE          0xb0060000 +#elif defined(CONFIG_DEBUG_SIRFMARCO_UART1) +#define SIRFSOC_UART1_PA_BASE          0xcc060000 +#else +#define SIRFSOC_UART1_PA_BASE          0 +#endif  #define SIRFSOC_UART1_VA_BASE          SIRFSOC_VA(0x060000)  #define SIRFSOC_UART1_SIZE		SZ_4K diff --git a/arch/arm/mach-prima2/include/mach/uncompress.h b/arch/arm/mach-prima2/include/mach/uncompress.h index 0c898fcf909..15f3edcfbb4 100644 --- a/arch/arm/mach-prima2/include/mach/uncompress.h +++ b/arch/arm/mach-prima2/include/mach/uncompress.h @@ -25,6 +25,9 @@ static __inline__ void putc(char c)  	 * during kernel decompression, all mappings are flat:  	 *  virt_addr == phys_addr  	 */ +	if (!SIRFSOC_UART1_PA_BASE) +		return; +  	while (__raw_readl((void __iomem *)SIRFSOC_UART1_PA_BASE + SIRFSOC_UART_TXFIFO_STATUS)  		& SIRFSOC_UART1_TXFIFO_FULL)  		barrier(); diff --git a/arch/arm/mach-prima2/irq.c b/arch/arm/mach-prima2/irq.c index 7dee9176e77..6c0f3e9c43f 100644 --- a/arch/arm/mach-prima2/irq.c +++ b/arch/arm/mach-prima2/irq.c @@ -9,17 +9,19 @@  #include <linux/init.h>  #include <linux/io.h>  #include <linux/irq.h> -#include <mach/hardware.h> -#include <asm/mach/irq.h>  #include <linux/of.h>  #include <linux/of_address.h>  #include <linux/irqdomain.h>  #include <linux/syscore_ops.h> +#include <asm/mach/irq.h> +#include <asm/exception.h> +#include <mach/hardware.h>  #define SIRFSOC_INT_RISC_MASK0          0x0018  #define SIRFSOC_INT_RISC_MASK1          0x001C  #define SIRFSOC_INT_RISC_LEVEL0         0x0020  #define SIRFSOC_INT_RISC_LEVEL1         0x0024 +#define SIRFSOC_INIT_IRQ_ID		0x0038  void __iomem *sirfsoc_intc_base; @@ -52,6 +54,16 @@ static __init void sirfsoc_irq_init(void)  	writel_relaxed(0, sirfsoc_intc_base + SIRFSOC_INT_RISC_MASK1);  } +asmlinkage void __exception_irq_entry sirfsoc_handle_irq(struct pt_regs *regs) +{ +	u32 irqstat, irqnr; + +	irqstat = readl_relaxed(sirfsoc_intc_base + SIRFSOC_INIT_IRQ_ID); +	irqnr = irqstat & 0xff; + +	handle_IRQ(irqnr, regs); +} +  static struct of_device_id intc_ids[]  = {  	{ .compatible = "sirf,prima2-intc" },  	{}, diff --git a/arch/arm/mach-prima2/l2x0.c b/arch/arm/mach-prima2/l2x0.c index c99837797d7..cbcbe9cb094 100644 --- a/arch/arm/mach-prima2/l2x0.c +++ b/arch/arm/mach-prima2/l2x0.c @@ -11,19 +11,38 @@  #include <linux/of.h>  #include <asm/hardware/cache-l2x0.h> -static struct of_device_id prima2_l2x0_ids[]  = { -	{ .compatible = "sirf,prima2-pl310-cache" }, +struct l2x0_aux +{ +	u32 val; +	u32 mask; +}; + +static struct l2x0_aux prima2_l2x0_aux __initconst = { +	.val = 2 << L2X0_AUX_CTRL_WAY_SIZE_SHIFT, +	.mask =	0, +}; + +static struct l2x0_aux marco_l2x0_aux __initconst = { +	.val = (2 << L2X0_AUX_CTRL_WAY_SIZE_SHIFT) | +		(1 << L2X0_AUX_CTRL_ASSOCIATIVITY_SHIFT), +	.mask = L2X0_AUX_CTRL_MASK, +}; + +static struct of_device_id sirf_l2x0_ids[] __initconst = { +	{ .compatible = "sirf,prima2-pl310-cache", .data = &prima2_l2x0_aux, }, +	{ .compatible = "sirf,marco-pl310-cache", .data = &marco_l2x0_aux, },  	{},  };  static int __init sirfsoc_l2x0_init(void)  {  	struct device_node *np; +	const struct l2x0_aux *aux; -	np = of_find_matching_node(NULL, prima2_l2x0_ids); +	np = of_find_matching_node(NULL, sirf_l2x0_ids);  	if (np) { -		pr_info("Initializing prima2 L2 cache\n"); -		return l2x0_of_init(0x40000, 0); +		aux = of_match_node(sirf_l2x0_ids, np)->data; +		return l2x0_of_init(aux->val, aux->mask);  	}  	return 0; diff --git a/arch/arm/mach-prima2/platsmp.c b/arch/arm/mach-prima2/platsmp.c new file mode 100644 index 00000000000..4b788310f6a --- /dev/null +++ b/arch/arm/mach-prima2/platsmp.c @@ -0,0 +1,157 @@ +/* + * plat smp support for CSR Marco dual-core SMP SoCs + * + * Copyright (c) 2012 Cambridge Silicon Radio Limited, a CSR plc group company. + * + * Licensed under GPLv2 or later. + */ + +#include <linux/init.h> +#include <linux/smp.h> +#include <linux/delay.h> +#include <linux/of.h> +#include <linux/of_address.h> +#include <linux/irqchip/arm-gic.h> +#include <asm/page.h> +#include <asm/mach/map.h> +#include <asm/smp_plat.h> +#include <asm/smp_scu.h> +#include <asm/cacheflush.h> +#include <asm/cputype.h> +#include <mach/map.h> + +#include "common.h" + +static void __iomem *scu_base; +static void __iomem *rsc_base; + +static DEFINE_SPINLOCK(boot_lock); + +static struct map_desc scu_io_desc __initdata = { +	.length		= SZ_4K, +	.type		= MT_DEVICE, +}; + +void __init sirfsoc_map_scu(void) +{ +	unsigned long base; + +	/* Get SCU base */ +	asm("mrc p15, 4, %0, c15, c0, 0" : "=r" (base)); + +	scu_io_desc.virtual = SIRFSOC_VA(base); +	scu_io_desc.pfn = __phys_to_pfn(base); +	iotable_init(&scu_io_desc, 1); + +	scu_base = (void __iomem *)SIRFSOC_VA(base); +} + +static void __cpuinit sirfsoc_secondary_init(unsigned int cpu) +{ +	/* +	 * if any interrupts are already enabled for the primary +	 * core (e.g. timer irq), then they will not have been enabled +	 * for us: do so +	 */ +	gic_secondary_init(0); + +	/* +	 * let the primary processor know we're out of the +	 * pen, then head off into the C entry point +	 */ +	pen_release = -1; +	smp_wmb(); + +	/* +	 * Synchronise with the boot thread. +	 */ +	spin_lock(&boot_lock); +	spin_unlock(&boot_lock); +} + +static struct of_device_id rsc_ids[]  = { +	{ .compatible = "sirf,marco-rsc" }, +	{}, +}; + +static int __cpuinit sirfsoc_boot_secondary(unsigned int cpu, struct task_struct *idle) +{ +	unsigned long timeout; +	struct device_node *np; + +	np = of_find_matching_node(NULL, rsc_ids); +	if (!np) +		return -ENODEV; + +	rsc_base = of_iomap(np, 0); +	if (!rsc_base) +		return -ENOMEM; + +	/* +	 * write the address of secondary startup into the sram register +	 * at offset 0x2C, then write the magic number 0x3CAF5D62 to the +	 * RSC register at offset 0x28, which is what boot rom code is +	 * waiting for. This would wake up the secondary core from WFE +	 */ +#define SIRFSOC_CPU1_JUMPADDR_OFFSET 0x2C +	__raw_writel(virt_to_phys(sirfsoc_secondary_startup), +		rsc_base + SIRFSOC_CPU1_JUMPADDR_OFFSET); + +#define SIRFSOC_CPU1_WAKEMAGIC_OFFSET 0x28 +	__raw_writel(0x3CAF5D62, +		rsc_base + SIRFSOC_CPU1_WAKEMAGIC_OFFSET); + +	/* make sure write buffer is drained */ +	mb(); + +	spin_lock(&boot_lock); + +	/* +	 * The secondary processor is waiting to be released from +	 * the holding pen - release it, then wait for it to flag +	 * that it has been released by resetting pen_release. +	 * +	 * Note that "pen_release" is the hardware CPU ID, whereas +	 * "cpu" is Linux's internal ID. +	 */ +	pen_release = cpu_logical_map(cpu); +	__cpuc_flush_dcache_area((void *)&pen_release, sizeof(pen_release)); +	outer_clean_range(__pa(&pen_release), __pa(&pen_release + 1)); + +	/* +	 * Send the secondary CPU SEV, thereby causing the boot monitor to read +	 * the JUMPADDR and WAKEMAGIC, and branch to the address found there. +	 */ +	dsb_sev(); + +	timeout = jiffies + (1 * HZ); +	while (time_before(jiffies, timeout)) { +		smp_rmb(); +		if (pen_release == -1) +			break; + +		udelay(10); +	} + +	/* +	 * now the secondary core is starting up let it run its +	 * calibrations, then wait for it to finish +	 */ +	spin_unlock(&boot_lock); + +	return pen_release != -1 ? -ENOSYS : 0; +} + +static void __init sirfsoc_smp_prepare_cpus(unsigned int max_cpus) +{ +	scu_enable(scu_base); +} + +struct smp_operations sirfsoc_smp_ops __initdata = { +        .smp_prepare_cpus       = sirfsoc_smp_prepare_cpus, +        .smp_secondary_init     = sirfsoc_secondary_init, +        .smp_boot_secondary     = sirfsoc_boot_secondary, +#ifdef CONFIG_HOTPLUG_CPU +	.cpu_die                = sirfsoc_cpu_die, +#endif +}; diff --git a/arch/arm/mach-prima2/rstc.c b/arch/arm/mach-prima2/rstc.c index 762adb73ab7..435019ca0a4 100644 --- a/arch/arm/mach-prima2/rstc.c +++ b/arch/arm/mach-prima2/rstc.c @@ -19,6 +19,7 @@ static DEFINE_MUTEX(rstc_lock);  static struct of_device_id rstc_ids[]  = {  	{ .compatible = "sirf,prima2-rstc" }, +	{ .compatible = "sirf,marco-rstc" },  	{},  }; @@ -42,27 +43,37 @@ early_initcall(sirfsoc_of_rstc_init);  int sirfsoc_reset_device(struct device *dev)  { -	const unsigned int *prop = of_get_property(dev->of_node, "reset-bit", NULL); -	unsigned int reset_bit; +	u32 reset_bit; -	if (!prop) -		return -ENODEV; - -	reset_bit = be32_to_cpup(prop); +	if (of_property_read_u32(dev->of_node, "reset-bit", &reset_bit)) +		return -EINVAL;  	mutex_lock(&rstc_lock); -	/* -	 * 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) | reset_bit, -		sirfsoc_rstc_base + (reset_bit / 32) * 4); -	msleep(10); -	writel(readl(sirfsoc_rstc_base + (reset_bit / 32) * 4) & ~reset_bit, -		sirfsoc_rstc_base + (reset_bit / 32) * 4); +	if (of_device_is_compatible(dev->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. +		 */ +		writel(readl(sirfsoc_rstc_base + (reset_bit / 32) * 4) | reset_bit, +			sirfsoc_rstc_base + (reset_bit / 32) * 4); +		msleep(10); +		writel(readl(sirfsoc_rstc_base + (reset_bit / 32) * 4) & ~reset_bit, +			sirfsoc_rstc_base + (reset_bit / 32) * 4); +	} else { +		/* +		 * 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. +		 */ +		writel(reset_bit, sirfsoc_rstc_base + (reset_bit / 32) * 8); +		msleep(10); +		writel(reset_bit, sirfsoc_rstc_base + (reset_bit / 32) * 8 + 4); +	}  	mutex_unlock(&rstc_lock); diff --git a/arch/arm/mach-prima2/rtciobrg.c b/arch/arm/mach-prima2/rtciobrg.c index 55735360213..9f2da2eec4d 100644 --- a/arch/arm/mach-prima2/rtciobrg.c +++ b/arch/arm/mach-prima2/rtciobrg.c @@ -104,6 +104,7 @@ EXPORT_SYMBOL_GPL(sirfsoc_rtc_iobrg_writel);  static const struct of_device_id rtciobrg_ids[] = {  	{ .compatible = "sirf,prima2-rtciobg" }, +	{ .compatible = "sirf,marco-rtciobg" },  	{}  }; diff --git a/arch/arm/mach-prima2/timer-marco.c b/arch/arm/mach-prima2/timer-marco.c new file mode 100644 index 00000000000..f4eea2e97eb --- /dev/null +++ b/arch/arm/mach-prima2/timer-marco.c @@ -0,0 +1,316 @@ +/* + * System timer for CSR SiRFprimaII + * + * Copyright (c) 2011 Cambridge Silicon Radio Limited, a CSR plc group company. + * + * Licensed under GPLv2 or later. + */ + +#include <linux/kernel.h> +#include <linux/interrupt.h> +#include <linux/clockchips.h> +#include <linux/clocksource.h> +#include <linux/bitops.h> +#include <linux/irq.h> +#include <linux/clk.h> +#include <linux/slab.h> +#include <linux/of.h> +#include <linux/of_irq.h> +#include <linux/of_address.h> +#include <asm/sched_clock.h> +#include <asm/localtimer.h> +#include <asm/mach/time.h> + +#include "common.h" + +#define SIRFSOC_TIMER_32COUNTER_0_CTRL			0x0000 +#define SIRFSOC_TIMER_32COUNTER_1_CTRL			0x0004 +#define SIRFSOC_TIMER_MATCH_0				0x0018 +#define SIRFSOC_TIMER_MATCH_1				0x001c +#define SIRFSOC_TIMER_COUNTER_0				0x0048 +#define SIRFSOC_TIMER_COUNTER_1				0x004c +#define SIRFSOC_TIMER_INTR_STATUS			0x0060 +#define SIRFSOC_TIMER_WATCHDOG_EN			0x0064 +#define SIRFSOC_TIMER_64COUNTER_CTRL			0x0068 +#define SIRFSOC_TIMER_64COUNTER_LO			0x006c +#define SIRFSOC_TIMER_64COUNTER_HI			0x0070 +#define SIRFSOC_TIMER_64COUNTER_LOAD_LO			0x0074 +#define SIRFSOC_TIMER_64COUNTER_LOAD_HI			0x0078 +#define SIRFSOC_TIMER_64COUNTER_RLATCHED_LO		0x007c +#define SIRFSOC_TIMER_64COUNTER_RLATCHED_HI		0x0080 + +#define SIRFSOC_TIMER_REG_CNT 6 + +static const u32 sirfsoc_timer_reg_list[SIRFSOC_TIMER_REG_CNT] = { +	SIRFSOC_TIMER_WATCHDOG_EN, +	SIRFSOC_TIMER_32COUNTER_0_CTRL, +	SIRFSOC_TIMER_32COUNTER_1_CTRL, +	SIRFSOC_TIMER_64COUNTER_CTRL, +	SIRFSOC_TIMER_64COUNTER_RLATCHED_LO, +	SIRFSOC_TIMER_64COUNTER_RLATCHED_HI, +}; + +static u32 sirfsoc_timer_reg_val[SIRFSOC_TIMER_REG_CNT]; + +static void __iomem *sirfsoc_timer_base; +static void __init sirfsoc_of_timer_map(void); + +/* disable count and interrupt */ +static inline void sirfsoc_timer_count_disable(int idx) +{ +	writel_relaxed(readl_relaxed(sirfsoc_timer_base + SIRFSOC_TIMER_32COUNTER_0_CTRL + 4 * idx) & ~0x7, +		sirfsoc_timer_base + SIRFSOC_TIMER_32COUNTER_0_CTRL + 4 * idx); +} + +/* enable count and interrupt */ +static inline void sirfsoc_timer_count_enable(int idx) +{ +	writel_relaxed(readl_relaxed(sirfsoc_timer_base + SIRFSOC_TIMER_32COUNTER_0_CTRL + 4 * idx) | 0x7, +		sirfsoc_timer_base + SIRFSOC_TIMER_32COUNTER_0_CTRL + 4 * idx); +} + +/* timer interrupt handler */ +static irqreturn_t sirfsoc_timer_interrupt(int irq, void *dev_id) +{ +	struct clock_event_device *ce = dev_id; +	int cpu = smp_processor_id(); + +	/* clear timer interrupt */ +	writel_relaxed(BIT(cpu), sirfsoc_timer_base + SIRFSOC_TIMER_INTR_STATUS); + +	if (ce->mode == CLOCK_EVT_MODE_ONESHOT) +		sirfsoc_timer_count_disable(cpu); + +	ce->event_handler(ce); + +	return IRQ_HANDLED; +} + +/* read 64-bit timer counter */ +static cycle_t sirfsoc_timer_read(struct clocksource *cs) +{ +	u64 cycles; + +	writel_relaxed((readl_relaxed(sirfsoc_timer_base + SIRFSOC_TIMER_64COUNTER_CTRL) | +			BIT(0)) & ~BIT(1), sirfsoc_timer_base + SIRFSOC_TIMER_64COUNTER_CTRL); + +	cycles = readl_relaxed(sirfsoc_timer_base + SIRFSOC_TIMER_64COUNTER_RLATCHED_HI); +	cycles = (cycles << 32) | readl_relaxed(sirfsoc_timer_base + SIRFSOC_TIMER_64COUNTER_RLATCHED_LO); + +	return cycles; +} + +static int sirfsoc_timer_set_next_event(unsigned long delta, +	struct clock_event_device *ce) +{ +	int cpu = smp_processor_id(); + +	writel_relaxed(0, sirfsoc_timer_base + SIRFSOC_TIMER_COUNTER_0 + +		4 * cpu); +	writel_relaxed(delta, sirfsoc_timer_base + SIRFSOC_TIMER_MATCH_0 + +		4 * cpu); + +	/* enable the tick */ +	sirfsoc_timer_count_enable(cpu); + +	return 0; +} + +static void sirfsoc_timer_set_mode(enum clock_event_mode mode, +	struct clock_event_device *ce) +{ +	switch (mode) { +	case CLOCK_EVT_MODE_ONESHOT: +		/* enable in set_next_event */ +		break; +	default: +		break; +	} + +	sirfsoc_timer_count_disable(smp_processor_id()); +} + +static void sirfsoc_clocksource_suspend(struct clocksource *cs) +{ +	int i; + +	for (i = 0; i < SIRFSOC_TIMER_REG_CNT; i++) +		sirfsoc_timer_reg_val[i] = readl_relaxed(sirfsoc_timer_base + sirfsoc_timer_reg_list[i]); +} + +static void sirfsoc_clocksource_resume(struct clocksource *cs) +{ +	int i; + +	for (i = 0; i < SIRFSOC_TIMER_REG_CNT - 2; i++) +		writel_relaxed(sirfsoc_timer_reg_val[i], sirfsoc_timer_base + sirfsoc_timer_reg_list[i]); + +	writel_relaxed(sirfsoc_timer_reg_val[SIRFSOC_TIMER_REG_CNT - 2], +		sirfsoc_timer_base + SIRFSOC_TIMER_64COUNTER_LOAD_LO); +	writel_relaxed(sirfsoc_timer_reg_val[SIRFSOC_TIMER_REG_CNT - 1], +		sirfsoc_timer_base + SIRFSOC_TIMER_64COUNTER_LOAD_HI); + +	writel_relaxed(readl_relaxed(sirfsoc_timer_base + SIRFSOC_TIMER_64COUNTER_CTRL) | +		BIT(1) | BIT(0), sirfsoc_timer_base + SIRFSOC_TIMER_64COUNTER_CTRL); +} + +static struct clock_event_device sirfsoc_clockevent = { +	.name = "sirfsoc_clockevent", +	.rating = 200, +	.features = CLOCK_EVT_FEAT_ONESHOT, +	.set_mode = sirfsoc_timer_set_mode, +	.set_next_event = sirfsoc_timer_set_next_event, +}; + +static struct clocksource sirfsoc_clocksource = { +	.name = "sirfsoc_clocksource", +	.rating = 200, +	.mask = CLOCKSOURCE_MASK(64), +	.flags = CLOCK_SOURCE_IS_CONTINUOUS, +	.read = sirfsoc_timer_read, +	.suspend = sirfsoc_clocksource_suspend, +	.resume = sirfsoc_clocksource_resume, +}; + +static struct irqaction sirfsoc_timer_irq = { +	.name = "sirfsoc_timer0", +	.flags = IRQF_TIMER | IRQF_NOBALANCING, +	.handler = sirfsoc_timer_interrupt, +	.dev_id = &sirfsoc_clockevent, +}; + +#ifdef CONFIG_LOCAL_TIMERS + +static struct irqaction sirfsoc_timer1_irq = { +	.name = "sirfsoc_timer1", +	.flags = IRQF_TIMER | IRQF_NOBALANCING, +	.handler = sirfsoc_timer_interrupt, +}; + +static int __cpuinit sirfsoc_local_timer_setup(struct clock_event_device *ce) +{ +	/* Use existing clock_event for cpu 0 */ +	if (!smp_processor_id()) +		return 0; + +	ce->irq = sirfsoc_timer1_irq.irq; +	ce->name = "local_timer"; +	ce->features = sirfsoc_clockevent.features; +	ce->rating = sirfsoc_clockevent.rating; +	ce->set_mode = sirfsoc_timer_set_mode; +	ce->set_next_event = sirfsoc_timer_set_next_event; +	ce->shift = sirfsoc_clockevent.shift; +	ce->mult = sirfsoc_clockevent.mult; +	ce->max_delta_ns = sirfsoc_clockevent.max_delta_ns; +	ce->min_delta_ns = sirfsoc_clockevent.min_delta_ns; + +	sirfsoc_timer1_irq.dev_id = ce; +	BUG_ON(setup_irq(ce->irq, &sirfsoc_timer1_irq)); +	irq_set_affinity(sirfsoc_timer1_irq.irq, cpumask_of(1)); + +	clockevents_register_device(ce); +	return 0; +} + +static void sirfsoc_local_timer_stop(struct clock_event_device *ce) +{ +	sirfsoc_timer_count_disable(1); + +	remove_irq(sirfsoc_timer1_irq.irq, &sirfsoc_timer1_irq); +} + +static struct local_timer_ops sirfsoc_local_timer_ops __cpuinitdata = { +	.setup	= sirfsoc_local_timer_setup, +	.stop	= sirfsoc_local_timer_stop, +}; +#endif /* CONFIG_LOCAL_TIMERS */ + +static void __init sirfsoc_clockevent_init(void) +{ +	clockevents_calc_mult_shift(&sirfsoc_clockevent, CLOCK_TICK_RATE, 60); + +	sirfsoc_clockevent.max_delta_ns = +		clockevent_delta2ns(-2, &sirfsoc_clockevent); +	sirfsoc_clockevent.min_delta_ns = +		clockevent_delta2ns(2, &sirfsoc_clockevent); + +	sirfsoc_clockevent.cpumask = cpumask_of(0); +	clockevents_register_device(&sirfsoc_clockevent); +#ifdef CONFIG_LOCAL_TIMERS +	local_timer_register(&sirfsoc_local_timer_ops); +#endif +} + +/* initialize the kernel jiffy timer source */ +void __init sirfsoc_marco_timer_init(void) +{ +	unsigned long rate; +	u32 timer_div; +	struct clk *clk; + +	/* initialize clocking early, we want to set the OS timer */ +	sirfsoc_of_clk_init(); + +	/* timer's input clock is io clock */ +	clk = clk_get_sys("io", NULL); + +	BUG_ON(IS_ERR(clk)); +	rate = clk_get_rate(clk); + +	BUG_ON(rate < CLOCK_TICK_RATE); +	BUG_ON(rate % CLOCK_TICK_RATE); + +	sirfsoc_of_timer_map(); + +	/* Initialize the timer dividers */ +	timer_div = rate / CLOCK_TICK_RATE - 1; +	writel_relaxed(timer_div << 16, sirfsoc_timer_base + SIRFSOC_TIMER_64COUNTER_CTRL); +	writel_relaxed(timer_div << 16, sirfsoc_timer_base + SIRFSOC_TIMER_32COUNTER_0_CTRL); +	writel_relaxed(timer_div << 16, sirfsoc_timer_base + SIRFSOC_TIMER_32COUNTER_1_CTRL); + +	/* Initialize timer counters to 0 */ +	writel_relaxed(0, sirfsoc_timer_base + SIRFSOC_TIMER_64COUNTER_LOAD_LO); +	writel_relaxed(0, sirfsoc_timer_base + SIRFSOC_TIMER_64COUNTER_LOAD_HI); +	writel_relaxed(readl_relaxed(sirfsoc_timer_base + SIRFSOC_TIMER_64COUNTER_CTRL) | +		BIT(1) | BIT(0), sirfsoc_timer_base + SIRFSOC_TIMER_64COUNTER_CTRL); +	writel_relaxed(0, sirfsoc_timer_base + SIRFSOC_TIMER_COUNTER_0); +	writel_relaxed(0, sirfsoc_timer_base + SIRFSOC_TIMER_COUNTER_1); + +	/* Clear all interrupts */ +	writel_relaxed(0xFFFF, sirfsoc_timer_base + SIRFSOC_TIMER_INTR_STATUS); + +	BUG_ON(clocksource_register_hz(&sirfsoc_clocksource, CLOCK_TICK_RATE)); + +	BUG_ON(setup_irq(sirfsoc_timer_irq.irq, &sirfsoc_timer_irq)); + +	sirfsoc_clockevent_init(); +} + +static struct of_device_id timer_ids[] = { +	{ .compatible = "sirf,marco-tick" }, +	{}, +}; + +static void __init sirfsoc_of_timer_map(void) +{ +	struct device_node *np; + +	np = of_find_matching_node(NULL, timer_ids); +	if (!np) +		return; +	sirfsoc_timer_base = of_iomap(np, 0); +	if (!sirfsoc_timer_base) +		panic("unable to map timer cpu registers\n"); + +	sirfsoc_timer_irq.irq = irq_of_parse_and_map(np, 0); +	if (!sirfsoc_timer_irq.irq) +		panic("No irq passed for timer0 via DT\n"); + +#ifdef CONFIG_LOCAL_TIMERS +	sirfsoc_timer1_irq.irq = irq_of_parse_and_map(np, 1); +	if (!sirfsoc_timer1_irq.irq) +		panic("No irq passed for timer1 via DT\n"); +#endif + +	of_node_put(np); +} diff --git a/arch/arm/mach-prima2/timer.c b/arch/arm/mach-prima2/timer-prima2.c index 8c732a5beb7..6da584f8a94 100644 --- a/arch/arm/mach-prima2/timer.c +++ b/arch/arm/mach-prima2/timer-prima2.c @@ -175,19 +175,13 @@ static u32 notrace sirfsoc_read_sched_clock(void)  static void __init sirfsoc_clockevent_init(void)  { -	clockevents_calc_mult_shift(&sirfsoc_clockevent, CLOCK_TICK_RATE, 60); - -	sirfsoc_clockevent.max_delta_ns = -		clockevent_delta2ns(-2, &sirfsoc_clockevent); -	sirfsoc_clockevent.min_delta_ns = -		clockevent_delta2ns(2, &sirfsoc_clockevent); -  	sirfsoc_clockevent.cpumask = cpumask_of(0); -	clockevents_register_device(&sirfsoc_clockevent); +	clockevents_config_and_register(&sirfsoc_clockevent, CLOCK_TICK_RATE, +					2, -2);  }  /* initialize the kernel jiffy timer source */ -void __init sirfsoc_timer_init(void) +void __init sirfsoc_prima2_timer_init(void)  {  	unsigned long rate;  	struct clk *clk; @@ -226,14 +220,14 @@ static struct of_device_id timer_ids[] = {  	{},  }; -void __init sirfsoc_of_timer_map(void) +static void __init sirfsoc_of_timer_map(void)  {  	struct device_node *np;  	const unsigned int *intspec;  	np = of_find_matching_node(NULL, timer_ids);  	if (!np) -		panic("unable to find compatible timer node in dtb\n"); +		return;  	sirfsoc_timer_base = of_iomap(np, 0);  	if (!sirfsoc_timer_base)  		panic("unable to map timer cpu registers\n"); diff --git a/arch/arm/mach-pxa/include/mach/mfp-pxa27x.h b/arch/arm/mach-pxa/include/mach/mfp-pxa27x.h index a611ad3153c..b6132aa95dc 100644 --- a/arch/arm/mach-pxa/include/mach/mfp-pxa27x.h +++ b/arch/arm/mach-pxa/include/mach/mfp-pxa27x.h @@ -463,6 +463,9 @@  	GPIO76_LCD_PCLK,	\  	GPIO77_LCD_BIAS +/* these enable a work-around for a hw bug in pxa27x during ac97 warm reset */ +#define GPIO113_AC97_nRESET_GPIO_HIGH MFP_CFG_OUT(GPIO113, AF0, DEFAULT) +#define GPIO95_AC97_nRESET_GPIO_HIGH MFP_CFG_OUT(GPIO95, AF0, DEFAULT)  extern int keypad_set_wake(unsigned int on);  #endif /* __ASM_ARCH_MFP_PXA27X_H */ diff --git a/arch/arm/mach-pxa/pxa27x.c b/arch/arm/mach-pxa/pxa27x.c index 8047ee0effc..616cb87b617 100644 --- a/arch/arm/mach-pxa/pxa27x.c +++ b/arch/arm/mach-pxa/pxa27x.c @@ -47,9 +47,9 @@ void pxa27x_clear_otgph(void)  EXPORT_SYMBOL(pxa27x_clear_otgph);  static unsigned long ac97_reset_config[] = { -	GPIO113_GPIO, +	GPIO113_AC97_nRESET_GPIO_HIGH,  	GPIO113_AC97_nRESET, -	GPIO95_GPIO, +	GPIO95_AC97_nRESET_GPIO_HIGH,  	GPIO95_AC97_nRESET,  }; diff --git a/arch/arm/mach-pxa/time.c b/arch/arm/mach-pxa/time.c index bea19a06b2b..8f1ee92aea3 100644 --- a/arch/arm/mach-pxa/time.c +++ b/arch/arm/mach-pxa/time.c @@ -151,16 +151,12 @@ void __init pxa_timer_init(void)  	setup_sched_clock(pxa_read_sched_clock, 32, clock_tick_rate); -	clockevents_calc_mult_shift(&ckevt_pxa_osmr0, clock_tick_rate, 4); -	ckevt_pxa_osmr0.max_delta_ns = -		clockevent_delta2ns(0x7fffffff, &ckevt_pxa_osmr0); -	ckevt_pxa_osmr0.min_delta_ns = -		clockevent_delta2ns(MIN_OSCR_DELTA * 2, &ckevt_pxa_osmr0) + 1;  	ckevt_pxa_osmr0.cpumask = cpumask_of(0);  	setup_irq(IRQ_OST0, &pxa_ost0_irq);  	clocksource_mmio_init(OSCR, "oscr0", clock_tick_rate, 200, 32,  		clocksource_mmio_readl_up); -	clockevents_register_device(&ckevt_pxa_osmr0); +	clockevents_config_and_register(&ckevt_pxa_osmr0, clock_tick_rate, +		MIN_OSCR_DELTA * 2, 0x7fffffff);  } diff --git a/arch/arm/mach-realview/core.c b/arch/arm/mach-realview/core.c index 68246748058..1d5ee5c9a1d 100644 --- a/arch/arm/mach-realview/core.c +++ b/arch/arm/mach-realview/core.c @@ -42,7 +42,6 @@  #include <asm/mach/irq.h>  #include <asm/mach/map.h> -#include <asm/hardware/gic.h>  #include <mach/platform.h>  #include <mach/irqs.h> diff --git a/arch/arm/mach-realview/platsmp.c b/arch/arm/mach-realview/platsmp.c index 300f7064465..98e3052b793 100644 --- a/arch/arm/mach-realview/platsmp.c +++ b/arch/arm/mach-realview/platsmp.c @@ -14,7 +14,6 @@  #include <linux/io.h>  #include <mach/hardware.h> -#include <asm/hardware/gic.h>  #include <asm/mach-types.h>  #include <asm/smp_scu.h> @@ -59,8 +58,6 @@ static void __init realview_smp_init_cpus(void)  	for (i = 0; i < ncores; i++)  		set_cpu_possible(i, true); - -	set_smp_cross_call(gic_raise_softirq);  }  static void __init realview_smp_prepare_cpus(unsigned int max_cpus) diff --git a/arch/arm/mach-realview/realview_eb.c b/arch/arm/mach-realview/realview_eb.c index f892862fd6a..5b1c8bfe6fa 100644 --- a/arch/arm/mach-realview/realview_eb.c +++ b/arch/arm/mach-realview/realview_eb.c @@ -27,13 +27,13 @@  #include <linux/amba/mmci.h>  #include <linux/amba/pl022.h>  #include <linux/io.h> +#include <linux/irqchip/arm-gic.h>  #include <linux/platform_data/clk-realview.h>  #include <mach/hardware.h>  #include <asm/irq.h>  #include <asm/mach-types.h>  #include <asm/pgtable.h> -#include <asm/hardware/gic.h>  #include <asm/hardware/cache-l2x0.h>  #include <asm/smp_twd.h> @@ -469,7 +469,6 @@ MACHINE_START(REALVIEW_EB, "ARM-RealView EB")  	.init_early	= realview_init_early,  	.init_irq	= gic_init_irq,  	.init_time	= realview_eb_timer_init, -	.handle_irq	= gic_handle_irq,  	.init_machine	= realview_eb_init,  #ifdef CONFIG_ZONE_DMA  	.dma_zone_size	= SZ_256M, diff --git a/arch/arm/mach-realview/realview_pb1176.c b/arch/arm/mach-realview/realview_pb1176.c index 6a4524b93fc..d5e83a1f698 100644 --- a/arch/arm/mach-realview/realview_pb1176.c +++ b/arch/arm/mach-realview/realview_pb1176.c @@ -29,13 +29,13 @@  #include <linux/mtd/physmap.h>  #include <linux/mtd/partitions.h>  #include <linux/io.h> +#include <linux/irqchip/arm-gic.h>  #include <linux/platform_data/clk-realview.h>  #include <mach/hardware.h>  #include <asm/irq.h>  #include <asm/mach-types.h>  #include <asm/pgtable.h> -#include <asm/hardware/gic.h>  #include <asm/hardware/cache-l2x0.h>  #include <asm/mach/arch.h> @@ -381,7 +381,6 @@ MACHINE_START(REALVIEW_PB1176, "ARM-RealView PB1176")  	.init_early	= realview_init_early,  	.init_irq	= gic_init_irq,  	.init_time	= realview_pb1176_timer_init, -	.handle_irq	= gic_handle_irq,  	.init_machine	= realview_pb1176_init,  #ifdef CONFIG_ZONE_DMA  	.dma_zone_size	= SZ_256M, diff --git a/arch/arm/mach-realview/realview_pb11mp.c b/arch/arm/mach-realview/realview_pb11mp.c index 502f6e6c691..c3cfe213b5e 100644 --- a/arch/arm/mach-realview/realview_pb11mp.c +++ b/arch/arm/mach-realview/realview_pb11mp.c @@ -27,13 +27,13 @@  #include <linux/amba/mmci.h>  #include <linux/amba/pl022.h>  #include <linux/io.h> +#include <linux/irqchip/arm-gic.h>  #include <linux/platform_data/clk-realview.h>  #include <mach/hardware.h>  #include <asm/irq.h>  #include <asm/mach-types.h>  #include <asm/pgtable.h> -#include <asm/hardware/gic.h>  #include <asm/hardware/cache-l2x0.h>  #include <asm/smp_twd.h> @@ -364,7 +364,6 @@ MACHINE_START(REALVIEW_PB11MP, "ARM-RealView PB11MPCore")  	.init_early	= realview_init_early,  	.init_irq	= gic_init_irq,  	.init_time	= realview_pb11mp_timer_init, -	.handle_irq	= gic_handle_irq,  	.init_machine	= realview_pb11mp_init,  #ifdef CONFIG_ZONE_DMA  	.dma_zone_size	= SZ_256M, diff --git a/arch/arm/mach-realview/realview_pba8.c b/arch/arm/mach-realview/realview_pba8.c index 85c81aaa05e..dde652a5962 100644 --- a/arch/arm/mach-realview/realview_pba8.c +++ b/arch/arm/mach-realview/realview_pba8.c @@ -27,12 +27,12 @@  #include <linux/amba/mmci.h>  #include <linux/amba/pl022.h>  #include <linux/io.h> +#include <linux/irqchip/arm-gic.h>  #include <linux/platform_data/clk-realview.h>  #include <asm/irq.h>  #include <asm/mach-types.h>  #include <asm/pgtable.h> -#include <asm/hardware/gic.h>  #include <asm/mach/arch.h>  #include <asm/mach/map.h> @@ -305,7 +305,6 @@ MACHINE_START(REALVIEW_PBA8, "ARM-RealView PB-A8")  	.init_early	= realview_init_early,  	.init_irq	= gic_init_irq,  	.init_time	= realview_pba8_timer_init, -	.handle_irq	= gic_handle_irq,  	.init_machine	= realview_pba8_init,  #ifdef CONFIG_ZONE_DMA  	.dma_zone_size	= SZ_256M, diff --git a/arch/arm/mach-realview/realview_pbx.c b/arch/arm/mach-realview/realview_pbx.c index a15a7b0be29..54f0185b01e 100644 --- a/arch/arm/mach-realview/realview_pbx.c +++ b/arch/arm/mach-realview/realview_pbx.c @@ -26,13 +26,13 @@  #include <linux/amba/mmci.h>  #include <linux/amba/pl022.h>  #include <linux/io.h> +#include <linux/irqchip/arm-gic.h>  #include <linux/platform_data/clk-realview.h>  #include <asm/irq.h>  #include <asm/mach-types.h>  #include <asm/smp_twd.h>  #include <asm/pgtable.h> -#include <asm/hardware/gic.h>  #include <asm/hardware/cache-l2x0.h>  #include <asm/mach/arch.h> @@ -401,7 +401,6 @@ MACHINE_START(REALVIEW_PBX, "ARM-RealView PBX")  	.init_early	= realview_init_early,  	.init_irq	= gic_init_irq,  	.init_time	= realview_pbx_timer_init, -	.handle_irq	= gic_handle_irq,  	.init_machine	= realview_pbx_init,  #ifdef CONFIG_ZONE_DMA  	.dma_zone_size	= SZ_256M, diff --git a/arch/arm/mach-s3c64xx/common.c b/arch/arm/mach-s3c64xx/common.c index aef303b8997..0b9c0ba4483 100644 --- a/arch/arm/mach-s3c64xx/common.c +++ b/arch/arm/mach-s3c64xx/common.c @@ -25,10 +25,10 @@  #include <linux/dma-mapping.h>  #include <linux/irq.h>  #include <linux/gpio.h> +#include <linux/irqchip/arm-vic.h>  #include <asm/mach/arch.h>  #include <asm/mach/map.h> -#include <asm/hardware/vic.h>  #include <asm/system_misc.h>  #include <mach/map.h> diff --git a/arch/arm/mach-s3c64xx/include/mach/regs-irq.h b/arch/arm/mach-s3c64xx/include/mach/regs-irq.h index bcce68a0bb7..6a1127891c8 100644 --- a/arch/arm/mach-s3c64xx/include/mach/regs-irq.h +++ b/arch/arm/mach-s3c64xx/include/mach/regs-irq.h @@ -15,6 +15,5 @@  #ifndef __ASM_ARCH_REGS_IRQ_H  #define __ASM_ARCH_REGS_IRQ_H __FILE__ -#include <asm/hardware/vic.h>  #endif /* __ASM_ARCH_6400_REGS_IRQ_H */ diff --git a/arch/arm/mach-s3c64xx/include/mach/tick.h b/arch/arm/mach-s3c64xx/include/mach/tick.h index ebe18a9469b..db9c1b1d56a 100644 --- a/arch/arm/mach-s3c64xx/include/mach/tick.h +++ b/arch/arm/mach-s3c64xx/include/mach/tick.h @@ -15,6 +15,8 @@  #ifndef __ASM_ARCH_TICK_H  #define __ASM_ARCH_TICK_H __FILE__ +#include <linux/irqchip/arm-vic.h> +  /* note, the timer interrutps turn up in 2 places, the vic and then   * the timer block. We take the VIC as the base at the moment.   */ diff --git a/arch/arm/mach-s3c64xx/mach-anw6410.c b/arch/arm/mach-s3c64xx/mach-anw6410.c index 75cbc67f628..afeae0b5bb2 100644 --- a/arch/arm/mach-s3c64xx/mach-anw6410.c +++ b/arch/arm/mach-s3c64xx/mach-anw6410.c @@ -31,7 +31,6 @@  #include <video/platform_lcd.h>  #include <video/samsung_fimd.h> -#include <asm/hardware/vic.h>  #include <asm/mach/arch.h>  #include <asm/mach/map.h>  #include <asm/mach/irq.h> @@ -230,7 +229,6 @@ MACHINE_START(ANW6410, "A&W6410")  	.atag_offset	= 0x100,  	.init_irq	= s3c6410_init_irq, -	.handle_irq	= vic_handle_irq,  	.map_io		= anw6410_map_io,  	.init_machine	= anw6410_machine_init,  	.init_late	= s3c64xx_init_late, diff --git a/arch/arm/mach-s3c64xx/mach-crag6410-module.c b/arch/arm/mach-s3c64xx/mach-crag6410-module.c index 553059f5184..755c0bb119f 100644 --- a/arch/arm/mach-s3c64xx/mach-crag6410-module.c +++ b/arch/arm/mach-s3c64xx/mach-crag6410-module.c @@ -47,7 +47,7 @@ static struct spi_board_info wm1253_devs[] = {  		.bus_num	= 0,  		.chip_select	= 0,  		.mode		= SPI_MODE_0, -		.irq		= S3C_EINT(5), +		.irq		= S3C_EINT(4),  		.controller_data = &wm0010_spi_csinfo,  		.platform_data = &wm0010_pdata,  	}, diff --git a/arch/arm/mach-s3c64xx/mach-crag6410.c b/arch/arm/mach-s3c64xx/mach-crag6410.c index 053dbcbeaa7..5b6adc7f1d3 100644 --- a/arch/arm/mach-s3c64xx/mach-crag6410.c +++ b/arch/arm/mach-s3c64xx/mach-crag6410.c @@ -42,7 +42,6 @@  #include <sound/wm1250-ev1.h> -#include <asm/hardware/vic.h>  #include <asm/mach/arch.h>  #include <asm/mach-types.h> @@ -867,7 +866,6 @@ MACHINE_START(WLF_CRAGG_6410, "Wolfson Cragganmore 6410")  	/* Maintainer: Mark Brown <broonie@opensource.wolfsonmicro.com> */  	.atag_offset	= 0x100,  	.init_irq	= s3c6410_init_irq, -	.handle_irq	= vic_handle_irq,  	.map_io		= crag6410_map_io,  	.init_machine	= crag6410_machine_init,  	.init_late	= s3c64xx_init_late, diff --git a/arch/arm/mach-s3c64xx/mach-hmt.c b/arch/arm/mach-s3c64xx/mach-hmt.c index 7e8605d9814..7212eb9cfeb 100644 --- a/arch/arm/mach-s3c64xx/mach-hmt.c +++ b/arch/arm/mach-s3c64xx/mach-hmt.c @@ -30,7 +30,6 @@  #include <mach/hardware.h>  #include <mach/map.h> -#include <asm/hardware/vic.h>  #include <asm/irq.h>  #include <asm/mach-types.h> @@ -273,7 +272,6 @@ MACHINE_START(HMT, "Airgoo-HMT")  	/* Maintainer: Peter Korsgaard <jacmet@sunsite.dk> */  	.atag_offset	= 0x100,  	.init_irq	= s3c6410_init_irq, -	.handle_irq	= vic_handle_irq,  	.map_io		= hmt_map_io,  	.init_machine	= hmt_machine_init,  	.init_late	= s3c64xx_init_late, diff --git a/arch/arm/mach-s3c64xx/mach-mini6410.c b/arch/arm/mach-s3c64xx/mach-mini6410.c index 4f8dc7dff92..e173e6e9822 100644 --- a/arch/arm/mach-s3c64xx/mach-mini6410.c +++ b/arch/arm/mach-s3c64xx/mach-mini6410.c @@ -24,7 +24,6 @@  #include <linux/serial_core.h>  #include <linux/types.h> -#include <asm/hardware/vic.h>  #include <asm/mach-types.h>  #include <asm/mach/arch.h>  #include <asm/mach/map.h> @@ -352,7 +351,6 @@ MACHINE_START(MINI6410, "MINI6410")  	/* Maintainer: Darius Augulis <augulis.darius@gmail.com> */  	.atag_offset	= 0x100,  	.init_irq	= s3c6410_init_irq, -	.handle_irq	= vic_handle_irq,  	.map_io		= mini6410_map_io,  	.init_machine	= mini6410_machine_init,  	.init_late	= s3c64xx_init_late, diff --git a/arch/arm/mach-s3c64xx/mach-ncp.c b/arch/arm/mach-s3c64xx/mach-ncp.c index cdd7f947376..8d3cedd995f 100644 --- a/arch/arm/mach-s3c64xx/mach-ncp.c +++ b/arch/arm/mach-s3c64xx/mach-ncp.c @@ -26,7 +26,6 @@  #include <video/platform_lcd.h>  #include <video/samsung_fimd.h> -#include <asm/hardware/vic.h>  #include <asm/mach/arch.h>  #include <asm/mach/map.h>  #include <asm/mach/irq.h> @@ -101,7 +100,6 @@ MACHINE_START(NCP, "NCP")  	/* Maintainer: Samsung Electronics */  	.atag_offset	= 0x100,  	.init_irq	= s3c6410_init_irq, -	.handle_irq	= vic_handle_irq,  	.map_io		= ncp_map_io,  	.init_machine	= ncp_machine_init,  	.init_late	= s3c64xx_init_late, diff --git a/arch/arm/mach-s3c64xx/mach-real6410.c b/arch/arm/mach-s3c64xx/mach-real6410.c index b0f61982ef5..4d0d47a6693 100644 --- a/arch/arm/mach-s3c64xx/mach-real6410.c +++ b/arch/arm/mach-s3c64xx/mach-real6410.c @@ -25,7 +25,6 @@  #include <linux/serial_core.h>  #include <linux/types.h> -#include <asm/hardware/vic.h>  #include <asm/mach-types.h>  #include <asm/mach/arch.h>  #include <asm/mach/map.h> @@ -331,7 +330,6 @@ MACHINE_START(REAL6410, "REAL6410")  	.atag_offset	= 0x100,  	.init_irq	= s3c6410_init_irq, -	.handle_irq	= vic_handle_irq,  	.map_io		= real6410_map_io,  	.init_machine	= real6410_machine_init,  	.init_late	= s3c64xx_init_late, diff --git a/arch/arm/mach-s3c64xx/mach-smartq5.c b/arch/arm/mach-s3c64xx/mach-smartq5.c index 7a737614717..ca2afcfce57 100644 --- a/arch/arm/mach-s3c64xx/mach-smartq5.c +++ b/arch/arm/mach-s3c64xx/mach-smartq5.c @@ -17,7 +17,6 @@  #include <linux/leds.h>  #include <linux/platform_device.h> -#include <asm/hardware/vic.h>  #include <asm/mach-types.h>  #include <asm/mach/arch.h> @@ -153,7 +152,6 @@ MACHINE_START(SMARTQ5, "SmartQ 5")  	/* Maintainer: Maurus Cuelenaere <mcuelenaere AT gmail DOT com> */  	.atag_offset	= 0x100,  	.init_irq	= s3c6410_init_irq, -	.handle_irq	= vic_handle_irq,  	.map_io		= smartq_map_io,  	.init_machine	= smartq5_machine_init,  	.init_late	= s3c64xx_init_late, diff --git a/arch/arm/mach-s3c64xx/mach-smartq7.c b/arch/arm/mach-s3c64xx/mach-smartq7.c index 889d525325c..37bb0c632a5 100644 --- a/arch/arm/mach-s3c64xx/mach-smartq7.c +++ b/arch/arm/mach-s3c64xx/mach-smartq7.c @@ -17,7 +17,6 @@  #include <linux/leds.h>  #include <linux/platform_device.h> -#include <asm/hardware/vic.h>  #include <asm/mach-types.h>  #include <asm/mach/arch.h> @@ -169,7 +168,6 @@ MACHINE_START(SMARTQ7, "SmartQ 7")  	/* Maintainer: Maurus Cuelenaere <mcuelenaere AT gmail DOT com> */  	.atag_offset	= 0x100,  	.init_irq	= s3c6410_init_irq, -	.handle_irq	= vic_handle_irq,  	.map_io		= smartq_map_io,  	.init_machine	= smartq7_machine_init,  	.init_late	= s3c64xx_init_late, diff --git a/arch/arm/mach-s3c64xx/mach-smdk6400.c b/arch/arm/mach-s3c64xx/mach-smdk6400.c index e31fe5bb37b..a392869c834 100644 --- a/arch/arm/mach-s3c64xx/mach-smdk6400.c +++ b/arch/arm/mach-s3c64xx/mach-smdk6400.c @@ -22,7 +22,6 @@  #include <asm/mach-types.h> -#include <asm/hardware/vic.h>  #include <asm/mach/arch.h>  #include <asm/mach/map.h>  #include <asm/mach/irq.h> @@ -90,7 +89,6 @@ MACHINE_START(SMDK6400, "SMDK6400")  	.atag_offset	= 0x100,  	.init_irq	= s3c6400_init_irq, -	.handle_irq	= vic_handle_irq,  	.map_io		= smdk6400_map_io,  	.init_machine	= smdk6400_machine_init,  	.init_late	= s3c64xx_init_late, diff --git a/arch/arm/mach-s3c64xx/mach-smdk6410.c b/arch/arm/mach-s3c64xx/mach-smdk6410.c index f1b87cd9cb0..1663d10ba02 100644 --- a/arch/arm/mach-s3c64xx/mach-smdk6410.c +++ b/arch/arm/mach-s3c64xx/mach-smdk6410.c @@ -45,7 +45,6 @@  #include <video/platform_lcd.h>  #include <video/samsung_fimd.h> -#include <asm/hardware/vic.h>  #include <asm/mach/arch.h>  #include <asm/mach/map.h>  #include <asm/mach/irq.h> @@ -700,7 +699,6 @@ MACHINE_START(SMDK6410, "SMDK6410")  	.atag_offset	= 0x100,  	.init_irq	= s3c6410_init_irq, -	.handle_irq	= vic_handle_irq,  	.map_io		= smdk6410_map_io,  	.init_machine	= smdk6410_machine_init,  	.init_late	= s3c64xx_init_late, diff --git a/arch/arm/mach-s3c64xx/pm.c b/arch/arm/mach-s3c64xx/pm.c index 7feb426fc20..d2e1a16690b 100644 --- a/arch/arm/mach-s3c64xx/pm.c +++ b/arch/arm/mach-s3c64xx/pm.c @@ -338,8 +338,10 @@ int __init s3c64xx_pm_init(void)  	for (i = 0; i < ARRAY_SIZE(s3c64xx_pm_domains); i++)  		pm_genpd_init(&s3c64xx_pm_domains[i]->pd, NULL, false); +#ifdef CONFIG_S3C_DEV_FB  	if (dev_get_platdata(&s3c_device_fb.dev))  		pm_genpd_add_device(&s3c64xx_pm_f.pd, &s3c_device_fb.dev); +#endif  	return 0;  } diff --git a/arch/arm/mach-s5p64x0/include/mach/regs-irq.h b/arch/arm/mach-s5p64x0/include/mach/regs-irq.h index 4aaebdace55..d60397d1ff4 100644 --- a/arch/arm/mach-s5p64x0/include/mach/regs-irq.h +++ b/arch/arm/mach-s5p64x0/include/mach/regs-irq.h @@ -13,7 +13,6 @@  #ifndef __ASM_ARCH_REGS_IRQ_H  #define __ASM_ARCH_REGS_IRQ_H __FILE__ -#include <asm/hardware/vic.h>  #include <mach/map.h>  #endif /* __ASM_ARCH_REGS_IRQ_H */ diff --git a/arch/arm/mach-s5p64x0/include/mach/tick.h b/arch/arm/mach-s5p64x0/include/mach/tick.h deleted file mode 100644 index 00aa7f1d8e5..00000000000 --- a/arch/arm/mach-s5p64x0/include/mach/tick.h +++ /dev/null @@ -1,29 +0,0 @@ -/* linux/arch/arm/mach-s5p64x0/include/mach/tick.h - * - * Copyright (c) 2009-2010 Samsung Electronics Co., Ltd. - *		http://www.samsung.com - * - * Copyright 2008 Openmoko, Inc. - * Copyright 2008 Simtec Electronics - *	http://armlinux.simtec.co.uk/ - *	Ben Dooks <ben@simtec.co.uk> - * - * S5P64X0 - Timer tick support definitions - * - * 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. -*/ - -#ifndef __ASM_ARCH_TICK_H -#define __ASM_ARCH_TICK_H __FILE__ - -static inline u32 s3c24xx_ostimer_pending(void) -{ -	u32 pend = __raw_readl(VA_VIC0 + VIC_RAW_STATUS); -	return pend & (1 << (IRQ_TIMER4_VIC - S5P_IRQ_VIC0(0))); -} - -#define TICK_MAX	(0xffffffff) - -#endif /* __ASM_ARCH_TICK_H */ diff --git a/arch/arm/mach-s5p64x0/mach-smdk6440.c b/arch/arm/mach-s5p64x0/mach-smdk6440.c index 0a3146dc081..a40d5eb3812 100644 --- a/arch/arm/mach-s5p64x0/mach-smdk6440.c +++ b/arch/arm/mach-s5p64x0/mach-smdk6440.c @@ -29,7 +29,6 @@  #include <video/platform_lcd.h>  #include <video/samsung_fimd.h> -#include <asm/hardware/vic.h>  #include <asm/mach/arch.h>  #include <asm/mach/map.h>  #include <asm/irq.h> @@ -272,7 +271,6 @@ MACHINE_START(SMDK6440, "SMDK6440")  	.atag_offset	= 0x100,  	.init_irq	= s5p6440_init_irq, -	.handle_irq	= vic_handle_irq,  	.map_io		= smdk6440_map_io,  	.init_machine	= smdk6440_machine_init,  	.init_time	= s5p_timer_init, diff --git a/arch/arm/mach-s5p64x0/mach-smdk6450.c b/arch/arm/mach-s5p64x0/mach-smdk6450.c index 36917f2ea25..703e576a26e 100644 --- a/arch/arm/mach-s5p64x0/mach-smdk6450.c +++ b/arch/arm/mach-s5p64x0/mach-smdk6450.c @@ -29,7 +29,6 @@  #include <video/platform_lcd.h>  #include <video/samsung_fimd.h> -#include <asm/hardware/vic.h>  #include <asm/mach/arch.h>  #include <asm/mach/map.h>  #include <asm/irq.h> @@ -291,7 +290,6 @@ MACHINE_START(SMDK6450, "SMDK6450")  	.atag_offset	= 0x100,  	.init_irq	= s5p6450_init_irq, -	.handle_irq	= vic_handle_irq,  	.map_io		= smdk6450_map_io,  	.init_machine	= smdk6450_machine_init,  	.init_time	= s5p_timer_init, diff --git a/arch/arm/mach-s5pc100/include/mach/regs-irq.h b/arch/arm/mach-s5pc100/include/mach/regs-irq.h index 4d9036d0f28..761627897f3 100644 --- a/arch/arm/mach-s5pc100/include/mach/regs-irq.h +++ b/arch/arm/mach-s5pc100/include/mach/regs-irq.h @@ -14,6 +14,5 @@  #define __ASM_ARCH_REGS_IRQ_H __FILE__  #include <mach/map.h> -#include <asm/hardware/vic.h>  #endif /* __ASM_ARCH_REGS_IRQ_H */ diff --git a/arch/arm/mach-s5pc100/include/mach/tick.h b/arch/arm/mach-s5pc100/include/mach/tick.h index 20f68730ed1..0af8e41230e 100644 --- a/arch/arm/mach-s5pc100/include/mach/tick.h +++ b/arch/arm/mach-s5pc100/include/mach/tick.h @@ -15,6 +15,8 @@  #ifndef __ASM_ARCH_TICK_H  #define __ASM_ARCH_TICK_H __FILE__ +#include <linux/irqchip/arm-vic.h> +  /* note, the timer interrutps turn up in 2 places, the vic and then   * the timer block. We take the VIC as the base at the moment.   */ diff --git a/arch/arm/mach-s5pc100/mach-smdkc100.c b/arch/arm/mach-s5pc100/mach-smdkc100.c index 39a9197d174..185a1958389 100644 --- a/arch/arm/mach-s5pc100/mach-smdkc100.c +++ b/arch/arm/mach-s5pc100/mach-smdkc100.c @@ -25,7 +25,6 @@  #include <linux/input.h>  #include <linux/pwm_backlight.h> -#include <asm/hardware/vic.h>  #include <asm/mach/arch.h>  #include <asm/mach/map.h> @@ -254,7 +253,6 @@ MACHINE_START(SMDKC100, "SMDKC100")  	/* Maintainer: Byungho Min <bhmin@samsung.com> */  	.atag_offset	= 0x100,  	.init_irq	= s5pc100_init_irq, -	.handle_irq	= vic_handle_irq,  	.map_io		= smdkc100_map_io,  	.init_machine	= smdkc100_machine_init,  	.init_time	= s3c24xx_timer_init, diff --git a/arch/arm/mach-s5pv210/include/mach/regs-irq.h b/arch/arm/mach-s5pv210/include/mach/regs-irq.h index 5c3b104a7c8..d8bc1e6c7aa 100644 --- a/arch/arm/mach-s5pv210/include/mach/regs-irq.h +++ b/arch/arm/mach-s5pv210/include/mach/regs-irq.h @@ -13,7 +13,6 @@  #ifndef __ASM_ARCH_REGS_IRQ_H  #define __ASM_ARCH_REGS_IRQ_H __FILE__ -#include <asm/hardware/vic.h>  #include <mach/map.h>  #endif /* __ASM_ARCH_REGS_IRQ_H */ diff --git a/arch/arm/mach-s5pv210/include/mach/tick.h b/arch/arm/mach-s5pv210/include/mach/tick.h deleted file mode 100644 index 7993b3603cc..00000000000 --- a/arch/arm/mach-s5pv210/include/mach/tick.h +++ /dev/null @@ -1,26 +0,0 @@ -/* linux/arch/arm/mach-s5pv210/include/mach/tick.h - * - * Copyright (c) 2009 Samsung Electronics Co., Ltd. - *		http://www.samsung.com/ - * - * Based on arch/arm/mach-s3c6400/include/mach/tick.h - * - * S5PV210 - Timer tick support definitions - * - * 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. -*/ - -#ifndef __ASM_ARCH_TICK_H -#define __ASM_ARCH_TICK_H __FILE__ - -static inline u32 s3c24xx_ostimer_pending(void) -{ -	u32 pend = __raw_readl(VA_VIC0 + VIC_RAW_STATUS); -	return pend & (1 << (IRQ_TIMER4_VIC - S5P_IRQ_VIC0(0))); -} - -#define TICK_MAX	(0xffffffff) - -#endif /* __ASM_ARCH_TICK_H */ diff --git a/arch/arm/mach-s5pv210/mach-aquila.c b/arch/arm/mach-s5pv210/mach-aquila.c index 1fb44a5ebb8..11900a8e88a 100644 --- a/arch/arm/mach-s5pv210/mach-aquila.c +++ b/arch/arm/mach-s5pv210/mach-aquila.c @@ -22,7 +22,6 @@  #include <linux/input.h>  #include <linux/gpio.h> -#include <asm/hardware/vic.h>  #include <asm/mach/arch.h>  #include <asm/mach/map.h>  #include <asm/setup.h> @@ -685,7 +684,6 @@ MACHINE_START(AQUILA, "Aquila")  	   Kyungmin Park <kyungmin.park@samsung.com> */  	.atag_offset	= 0x100,  	.init_irq	= s5pv210_init_irq, -	.handle_irq	= vic_handle_irq,  	.map_io		= aquila_map_io,  	.init_machine	= aquila_machine_init,  	.init_time	= s5p_timer_init, diff --git a/arch/arm/mach-s5pv210/mach-goni.c b/arch/arm/mach-s5pv210/mach-goni.c index ababdca2b3e..57048159174 100644 --- a/arch/arm/mach-s5pv210/mach-goni.c +++ b/arch/arm/mach-s5pv210/mach-goni.c @@ -29,7 +29,6 @@  #include <linux/interrupt.h>  #include <linux/platform_data/s3c-hsotg.h> -#include <asm/hardware/vic.h>  #include <asm/mach/arch.h>  #include <asm/mach/map.h>  #include <asm/setup.h> @@ -972,7 +971,6 @@ MACHINE_START(GONI, "GONI")  	/* Maintainers: Kyungmin Park <kyungmin.park@samsung.com> */  	.atag_offset	= 0x100,  	.init_irq	= s5pv210_init_irq, -	.handle_irq	= vic_handle_irq,  	.map_io		= goni_map_io,  	.init_machine	= goni_machine_init,  	.init_time	= s5p_timer_init, diff --git a/arch/arm/mach-s5pv210/mach-smdkc110.c b/arch/arm/mach-s5pv210/mach-smdkc110.c index acfb0ebce13..28bd0248a3e 100644 --- a/arch/arm/mach-s5pv210/mach-smdkc110.c +++ b/arch/arm/mach-s5pv210/mach-smdkc110.c @@ -15,7 +15,6 @@  #include <linux/i2c.h>  #include <linux/device.h> -#include <asm/hardware/vic.h>  #include <asm/mach/arch.h>  #include <asm/mach/map.h>  #include <asm/setup.h> @@ -152,7 +151,6 @@ MACHINE_START(SMDKC110, "SMDKC110")  	/* Maintainer: Kukjin Kim <kgene.kim@samsung.com> */  	.atag_offset	= 0x100,  	.init_irq	= s5pv210_init_irq, -	.handle_irq	= vic_handle_irq,  	.map_io		= smdkc110_map_io,  	.init_machine	= smdkc110_machine_init,  	.init_time	= s5p_timer_init, diff --git a/arch/arm/mach-s5pv210/mach-smdkv210.c b/arch/arm/mach-s5pv210/mach-smdkv210.c index e1d820f3b42..3c73f36869b 100644 --- a/arch/arm/mach-s5pv210/mach-smdkv210.c +++ b/arch/arm/mach-s5pv210/mach-smdkv210.c @@ -21,7 +21,6 @@  #include <linux/pwm_backlight.h>  #include <linux/platform_data/s3c-hsotg.h> -#include <asm/hardware/vic.h>  #include <asm/mach/arch.h>  #include <asm/mach/map.h>  #include <asm/setup.h> @@ -328,7 +327,6 @@ MACHINE_START(SMDKV210, "SMDKV210")  	/* Maintainer: Kukjin Kim <kgene.kim@samsung.com> */  	.atag_offset	= 0x100,  	.init_irq	= s5pv210_init_irq, -	.handle_irq	= vic_handle_irq,  	.map_io		= smdkv210_map_io,  	.init_machine	= smdkv210_machine_init,  	.init_time	= s5p_timer_init, diff --git a/arch/arm/mach-s5pv210/mach-torbreck.c b/arch/arm/mach-s5pv210/mach-torbreck.c index 1e6fc6eccdf..2d4c5531819 100644 --- a/arch/arm/mach-s5pv210/mach-torbreck.c +++ b/arch/arm/mach-s5pv210/mach-torbreck.c @@ -14,7 +14,6 @@  #include <linux/init.h>  #include <linux/serial_core.h> -#include <asm/hardware/vic.h>  #include <asm/mach/arch.h>  #include <asm/mach/map.h>  #include <asm/setup.h> @@ -129,7 +128,6 @@ MACHINE_START(TORBRECK, "TORBRECK")  	/* Maintainer: Hyunchul Ko <ghcstop@gmail.com> */  	.atag_offset	= 0x100,  	.init_irq	= s5pv210_init_irq, -	.handle_irq	= vic_handle_irq,  	.map_io		= torbreck_map_io,  	.init_machine	= torbreck_machine_init,  	.init_time	= s5p_timer_init, diff --git a/arch/arm/mach-sa1100/time.c b/arch/arm/mach-sa1100/time.c index 934db6385cd..a59a13a665a 100644 --- a/arch/arm/mach-sa1100/time.c +++ b/arch/arm/mach-sa1100/time.c @@ -124,16 +124,12 @@ void __init sa1100_timer_init(void)  	setup_sched_clock(sa1100_read_sched_clock, 32, 3686400); -	clockevents_calc_mult_shift(&ckevt_sa1100_osmr0, 3686400, 4); -	ckevt_sa1100_osmr0.max_delta_ns = -		clockevent_delta2ns(0x7fffffff, &ckevt_sa1100_osmr0); -	ckevt_sa1100_osmr0.min_delta_ns = -		clockevent_delta2ns(MIN_OSCR_DELTA * 2, &ckevt_sa1100_osmr0) + 1;  	ckevt_sa1100_osmr0.cpumask = cpumask_of(0);  	setup_irq(IRQ_OST0, &sa1100_timer_irq);  	clocksource_mmio_init(OSCR, "oscr", CLOCK_TICK_RATE, 200, 32,  		clocksource_mmio_readl_up); -	clockevents_register_device(&ckevt_sa1100_osmr0); +	clockevents_config_and_register(&ckevt_sa1100_osmr0, 3686400, +					MIN_OSCR_DELTA * 2, 0x7fffffff);  } diff --git a/arch/arm/mach-shmobile/Makefile b/arch/arm/mach-shmobile/Makefile index 0b7147928aa..700e6623aa8 100644 --- a/arch/arm/mach-shmobile/Makefile +++ b/arch/arm/mach-shmobile/Makefile @@ -15,7 +15,7 @@ obj-$(CONFIG_ARCH_EMEV2)	+= setup-emev2.o clock-emev2.o  # SMP objects  smp-y				:= platsmp.o headsmp.o  smp-$(CONFIG_HOTPLUG_CPU)	+= hotplug.o -smp-$(CONFIG_ARCH_SH73A0)	+= smp-sh73a0.o +smp-$(CONFIG_ARCH_SH73A0)	+= smp-sh73a0.o headsmp-sh73a0.o  smp-$(CONFIG_ARCH_R8A7779)	+= smp-r8a7779.o  smp-$(CONFIG_ARCH_EMEV2)	+= smp-emev2.o @@ -37,6 +37,7 @@ obj-$(CONFIG_ARCH_SHMOBILE)	+= pm-rmobile.o  obj-$(CONFIG_ARCH_SH7372)	+= pm-sh7372.o sleep-sh7372.o  obj-$(CONFIG_ARCH_R8A7740)	+= pm-r8a7740.o  obj-$(CONFIG_ARCH_R8A7779)	+= pm-r8a7779.o +obj-$(CONFIG_ARCH_SH73A0)	+= pm-sh73a0.o  # Board objects  obj-$(CONFIG_MACH_AP4EVB)	+= board-ap4evb.o diff --git a/arch/arm/mach-shmobile/board-ag5evm.c b/arch/arm/mach-shmobile/board-ag5evm.c index d81a66362b7..705bc63c798 100644 --- a/arch/arm/mach-shmobile/board-ag5evm.c +++ b/arch/arm/mach-shmobile/board-ag5evm.c @@ -40,6 +40,7 @@  #include <linux/mmc/sh_mobile_sdhi.h>  #include <linux/mfd/tmio.h>  #include <linux/sh_clk.h> +#include <linux/irqchip/arm-gic.h>  #include <video/sh_mobile_lcdc.h>  #include <video/sh_mipi_dsi.h>  #include <sound/sh_fsi.h> @@ -49,7 +50,6 @@  #include <mach/common.h>  #include <asm/mach-types.h>  #include <asm/mach/arch.h> -#include <asm/hardware/gic.h>  #include <asm/hardware/cache-l2x0.h>  #include <asm/traps.h> @@ -668,7 +668,6 @@ MACHINE_START(AG5EVM, "ag5evm")  	.init_early	= sh73a0_add_early_devices,  	.nr_irqs	= NR_IRQS_LEGACY,  	.init_irq	= sh73a0_init_irq, -	.handle_irq	= gic_handle_irq,  	.init_machine	= ag5evm_init,  	.init_late	= shmobile_init_late,  	.init_time	= sh73a0_earlytimer_init, diff --git a/arch/arm/mach-shmobile/board-armadillo800eva.c b/arch/arm/mach-shmobile/board-armadillo800eva.c index e7912447ad5..65731370da8 100644 --- a/arch/arm/mach-shmobile/board-armadillo800eva.c +++ b/arch/arm/mach-shmobile/board-armadillo800eva.c @@ -1181,6 +1181,8 @@ static void __init eva_init(void)  	rmobile_add_device_to_domain("A4LC", &hdmi_lcdc_device);  	if (usb)  		rmobile_add_device_to_domain("A3SP", usb); + +	r8a7740_pm_init();  }  static void __init eva_earlytimer_init(void) diff --git a/arch/arm/mach-shmobile/board-kota2.c b/arch/arm/mach-shmobile/board-kota2.c index 2f24994f2ef..d759a9c2b9e 100644 --- a/arch/arm/mach-shmobile/board-kota2.c +++ b/arch/arm/mach-shmobile/board-kota2.c @@ -35,6 +35,7 @@  #include <linux/input/sh_keysc.h>  #include <linux/gpio_keys.h>  #include <linux/leds.h> +#include <linux/irqchip/arm-gic.h>  #include <linux/platform_data/leds-renesas-tpu.h>  #include <linux/mmc/host.h>  #include <linux/mmc/sh_mmcif.h> @@ -47,7 +48,6 @@  #include <asm/mach-types.h>  #include <asm/mach/arch.h>  #include <asm/mach/time.h> -#include <asm/hardware/gic.h>  #include <asm/hardware/cache-l2x0.h>  #include <asm/traps.h> @@ -550,7 +550,6 @@ MACHINE_START(KOTA2, "kota2")  	.init_early	= sh73a0_add_early_devices,  	.nr_irqs	= NR_IRQS_LEGACY,  	.init_irq	= sh73a0_init_irq, -	.handle_irq	= gic_handle_irq,  	.init_machine	= kota2_init,  	.init_late	= shmobile_init_late,  	.init_time	= sh73a0_earlytimer_init, diff --git a/arch/arm/mach-shmobile/board-kzm9d.c b/arch/arm/mach-shmobile/board-kzm9d.c index 59be864f599..c254782aa72 100644 --- a/arch/arm/mach-shmobile/board-kzm9d.c +++ b/arch/arm/mach-shmobile/board-kzm9d.c @@ -28,7 +28,6 @@  #include <mach/emev2.h>  #include <asm/mach-types.h>  #include <asm/mach/arch.h> -#include <asm/hardware/gic.h>  /* Dummy supplies, where voltage doesn't matter */  static struct regulator_consumer_supply dummy_supplies[] = { @@ -89,7 +88,6 @@ DT_MACHINE_START(KZM9D_DT, "kzm9d")  	.init_early	= emev2_add_early_devices,  	.nr_irqs	= NR_IRQS_LEGACY,  	.init_irq	= emev2_init_irq, -	.handle_irq	= gic_handle_irq,  	.init_machine	= kzm9d_add_standard_devices,  	.init_late	= shmobile_init_late,  	.init_time	= shmobile_timer_init, diff --git a/arch/arm/mach-shmobile/board-kzm9g.c b/arch/arm/mach-shmobile/board-kzm9g.c index adb23ef5112..363c6edfa3c 100644 --- a/arch/arm/mach-shmobile/board-kzm9g.c +++ b/arch/arm/mach-shmobile/board-kzm9g.c @@ -25,6 +25,7 @@  #include <linux/i2c.h>  #include <linux/i2c/pcf857x.h>  #include <linux/input.h> +#include <linux/irqchip/arm-gic.h>  #include <linux/mmc/host.h>  #include <linux/mmc/sh_mmcif.h>  #include <linux/mmc/sh_mobile_sdhi.h> @@ -42,7 +43,6 @@  #include <mach/sh73a0.h>  #include <mach/common.h>  #include <asm/hardware/cache-l2x0.h> -#include <asm/hardware/gic.h>  #include <asm/mach-types.h>  #include <asm/mach/arch.h>  #include <video/sh_mobile_lcdc.h> @@ -772,6 +772,8 @@ static void __init kzm_init(void)  	sh73a0_add_standard_devices();  	platform_add_devices(kzm_devices, ARRAY_SIZE(kzm_devices)); + +	sh73a0_pm_init();  }  static void kzm9g_restart(char mode, const char *cmd) @@ -792,7 +794,6 @@ DT_MACHINE_START(KZM9G_DT, "kzm9g")  	.init_early	= sh73a0_add_early_devices,  	.nr_irqs	= NR_IRQS_LEGACY,  	.init_irq	= sh73a0_init_irq, -	.handle_irq	= gic_handle_irq,  	.init_machine	= kzm_init,  	.init_late	= shmobile_init_late,  	.init_time	= sh73a0_earlytimer_init, diff --git a/arch/arm/mach-shmobile/board-marzen.c b/arch/arm/mach-shmobile/board-marzen.c index ca45a0c50af..cdcb799e802 100644 --- a/arch/arm/mach-shmobile/board-marzen.c +++ b/arch/arm/mach-shmobile/board-marzen.c @@ -44,7 +44,6 @@  #include <mach/irqs.h>  #include <asm/mach-types.h>  #include <asm/mach/arch.h> -#include <asm/hardware/gic.h>  #include <asm/traps.h>  /* Fixed 3.3V regulator to be used by SDHI0 */ @@ -382,7 +381,6 @@ MACHINE_START(MARZEN, "marzen")  	.init_early	= r8a7779_add_early_devices,  	.nr_irqs	= NR_IRQS_LEGACY,  	.init_irq	= r8a7779_init_irq, -	.handle_irq	= gic_handle_irq,  	.init_machine	= marzen_init,  	.init_late	= marzen_init_late,  	.init_time	= r8a7779_earlytimer_init, diff --git a/arch/arm/mach-shmobile/clock-r8a7740.c b/arch/arm/mach-shmobile/clock-r8a7740.c index eac49d59782..19ce885a3b4 100644 --- a/arch/arm/mach-shmobile/clock-r8a7740.c +++ b/arch/arm/mach-shmobile/clock-r8a7740.c @@ -581,10 +581,14 @@ static struct clk_lookup lookups[] = {  	/* MSTP32 clocks */  	CLKDEV_DEV_ID("sh_mobile_lcdc_fb.0",	&mstp_clks[MSTP100]), -	CLKDEV_DEV_ID("sh_tmu.1",		&mstp_clks[MSTP111]), +	CLKDEV_DEV_ID("sh_tmu.3",		&mstp_clks[MSTP111]), +	CLKDEV_DEV_ID("sh_tmu.4",		&mstp_clks[MSTP111]), +	CLKDEV_DEV_ID("sh_tmu.5",		&mstp_clks[MSTP111]),  	CLKDEV_DEV_ID("i2c-sh_mobile.0",	&mstp_clks[MSTP116]),  	CLKDEV_DEV_ID("sh_mobile_lcdc_fb.1",	&mstp_clks[MSTP117]),  	CLKDEV_DEV_ID("sh_tmu.0",		&mstp_clks[MSTP125]), +	CLKDEV_DEV_ID("sh_tmu.1",		&mstp_clks[MSTP125]), +	CLKDEV_DEV_ID("sh_tmu.2",		&mstp_clks[MSTP125]),  	CLKDEV_DEV_ID("sh_mobile_ceu.0",	&mstp_clks[MSTP127]),  	CLKDEV_DEV_ID("sh_mobile_ceu.1",	&mstp_clks[MSTP128]), diff --git a/arch/arm/mach-shmobile/clock-r8a7779.c b/arch/arm/mach-shmobile/clock-r8a7779.c index c019609da66..202370de32f 100644 --- a/arch/arm/mach-shmobile/clock-r8a7779.c +++ b/arch/arm/mach-shmobile/clock-r8a7779.c @@ -161,7 +161,8 @@ static struct clk_lookup lookups[] = {  	CLKDEV_DEV_ID("ehci-platform.0", &mstp_clks[MSTP100]), /* USB EHCI port0/1 */  	CLKDEV_DEV_ID("ohci-platform.0", &mstp_clks[MSTP100]), /* USB OHCI port0/1 */  	CLKDEV_DEV_ID("sh_tmu.0", &mstp_clks[MSTP016]), /* TMU00 */ -	CLKDEV_DEV_ID("sh_tmu.1", &mstp_clks[MSTP016]), /* TMU01 */ +	CLKDEV_DEV_ID("sh_tmu.1", &mstp_clks[MSTP015]), /* TMU01 */ +	CLKDEV_DEV_ID("sh_tmu.2", &mstp_clks[MSTP014]), /* TMU02 */  	CLKDEV_DEV_ID("i2c-rcar.0", &mstp_clks[MSTP030]), /* I2C0 */  	CLKDEV_DEV_ID("i2c-rcar.1", &mstp_clks[MSTP029]), /* I2C1 */  	CLKDEV_DEV_ID("i2c-rcar.2", &mstp_clks[MSTP028]), /* I2C2 */ diff --git a/arch/arm/mach-shmobile/clock-sh7372.c b/arch/arm/mach-shmobile/clock-sh7372.c index 3ca6757b129..45d21fe317f 100644 --- a/arch/arm/mach-shmobile/clock-sh7372.c +++ b/arch/arm/mach-shmobile/clock-sh7372.c @@ -544,6 +544,7 @@ static struct clk_lookup lookups[] = {  	/* MSTP32 clocks */  	CLKDEV_DEV_ID("i2c-sh_mobile.2", &mstp_clks[MSTP001]), /* IIC2 */ +	CLKDEV_DEV_ID("fff30000.i2c", &mstp_clks[MSTP001]), /* IIC2 */  	CLKDEV_DEV_ID("spi_sh_msiof.0", &mstp_clks[MSTP000]), /* MSIOF0 */  	CLKDEV_DEV_ID("uio_pdrv_genirq.4", &mstp_clks[MSTP131]), /* VEU3 */  	CLKDEV_DEV_ID("uio_pdrv_genirq.3", &mstp_clks[MSTP130]), /* VEU2 */ @@ -556,6 +557,7 @@ static struct clk_lookup lookups[] = {  	CLKDEV_DEV_ID("sh-mipi-dsi.0", &mstp_clks[MSTP118]), /* DSITX0 */  	CLKDEV_DEV_ID("sh_mobile_lcdc_fb.1", &mstp_clks[MSTP117]), /* LCDC1 */  	CLKDEV_DEV_ID("i2c-sh_mobile.0", &mstp_clks[MSTP116]), /* IIC0 */ +	CLKDEV_DEV_ID("fff20000.i2c", &mstp_clks[MSTP116]), /* IIC0 */  	CLKDEV_DEV_ID("sh_mobile_meram.0", &mstp_clks[MSTP113]), /* MERAM */  	CLKDEV_DEV_ID("uio_pdrv_genirq.5", &mstp_clks[MSTP106]), /* JPU */  	CLKDEV_DEV_ID("uio_pdrv_genirq.0", &mstp_clks[MSTP101]), /* VPU */ @@ -577,18 +579,25 @@ static struct clk_lookup lookups[] = {  	CLKDEV_DEV_ID("sh-sci.4", &mstp_clks[MSTP200]), /* SCIFA4 */  	CLKDEV_DEV_ID("sh_fsi2", &mstp_clks[MSTP328]), /* FSI2 */  	CLKDEV_DEV_ID("i2c-sh_mobile.1", &mstp_clks[MSTP323]), /* IIC1 */ +	CLKDEV_DEV_ID("e6c20000.i2c", &mstp_clks[MSTP323]), /* IIC1 */  	CLKDEV_DEV_ID("r8a66597_hcd.0", &mstp_clks[MSTP322]), /* USB0 */  	CLKDEV_DEV_ID("r8a66597_udc.0", &mstp_clks[MSTP322]), /* USB0 */  	CLKDEV_DEV_ID("renesas_usbhs.0", &mstp_clks[MSTP322]), /* USB0 */  	CLKDEV_DEV_ID("sh_flctl.0", &mstp_clks[MSTP315]), /* FLCTL */  	CLKDEV_DEV_ID("sh_mobile_sdhi.0", &mstp_clks[MSTP314]), /* SDHI0 */ +	CLKDEV_DEV_ID("e6850000.sdhi", &mstp_clks[MSTP314]), /* SDHI0 */  	CLKDEV_DEV_ID("sh_mobile_sdhi.1", &mstp_clks[MSTP313]), /* SDHI1 */ +	CLKDEV_DEV_ID("e6860000.sdhi", &mstp_clks[MSTP313]), /* SDHI1 */  	CLKDEV_DEV_ID("sh_mmcif.0", &mstp_clks[MSTP312]), /* MMC */ +	CLKDEV_DEV_ID("e6bd0000.mmcif", &mstp_clks[MSTP312]), /* MMC */  	CLKDEV_DEV_ID("sh-mipi-dsi.1", &mstp_clks[MSTP423]), /* DSITX1 */  	CLKDEV_DEV_ID("sh_mobile_sdhi.2", &mstp_clks[MSTP415]), /* SDHI2 */ +	CLKDEV_DEV_ID("e6870000.sdhi", &mstp_clks[MSTP415]), /* SDHI2 */  	CLKDEV_DEV_ID("sh-mobile-hdmi", &mstp_clks[MSTP413]), /* HDMI */  	CLKDEV_DEV_ID("i2c-sh_mobile.3", &mstp_clks[MSTP411]), /* IIC3 */ +	CLKDEV_DEV_ID("e6d20000.i2c", &mstp_clks[MSTP411]), /* IIC3 */  	CLKDEV_DEV_ID("i2c-sh_mobile.4", &mstp_clks[MSTP410]), /* IIC4 */ +	CLKDEV_DEV_ID("e6d30000.i2c", &mstp_clks[MSTP410]), /* IIC4 */  	CLKDEV_DEV_ID("sh-dma-engine.4", &mstp_clks[MSTP407]), /* USB-DMAC1 */  	CLKDEV_DEV_ID("r8a66597_hcd.1", &mstp_clks[MSTP406]), /* USB1 */  	CLKDEV_DEV_ID("r8a66597_udc.1", &mstp_clks[MSTP406]), /* USB1 */ diff --git a/arch/arm/mach-shmobile/clock-sh73a0.c b/arch/arm/mach-shmobile/clock-sh73a0.c index 516ff7f3e43..afa5423a0f9 100644 --- a/arch/arm/mach-shmobile/clock-sh73a0.c +++ b/arch/arm/mach-shmobile/clock-sh73a0.c @@ -264,17 +264,17 @@ enum { DIV4_I, DIV4_ZG, DIV4_M3, DIV4_B, DIV4_M1, DIV4_M2,  	SH_CLK_DIV4(&pll1_clk, _reg, _bit, _mask, _flags)  static struct clk div4_clks[DIV4_NR] = { -	[DIV4_I] = DIV4(FRQCRA, 20, 0xfff, CLK_ENABLE_ON_INIT), -	[DIV4_ZG] = DIV4(FRQCRA, 16, 0xbff, CLK_ENABLE_ON_INIT), -	[DIV4_M3] = DIV4(FRQCRA, 12, 0xfff, CLK_ENABLE_ON_INIT), -	[DIV4_B] = DIV4(FRQCRA, 8, 0xfff, CLK_ENABLE_ON_INIT), -	[DIV4_M1] = DIV4(FRQCRA, 4, 0xfff, 0), -	[DIV4_M2] = DIV4(FRQCRA, 0, 0xfff, 0), -	[DIV4_Z] = DIV4(FRQCRB, 24, 0xbff, 0), -	[DIV4_ZTR] = DIV4(FRQCRB, 20, 0xfff, 0), -	[DIV4_ZT] = DIV4(FRQCRB, 16, 0xfff, 0), -	[DIV4_ZX] = DIV4(FRQCRB, 12, 0xfff, 0), -	[DIV4_HP] = DIV4(FRQCRB, 4, 0xfff, 0), +	[DIV4_I] = DIV4(FRQCRA, 20, 0xdff, CLK_ENABLE_ON_INIT), +	[DIV4_ZG] = DIV4(FRQCRA, 16, 0xd7f, CLK_ENABLE_ON_INIT), +	[DIV4_M3] = DIV4(FRQCRA, 12, 0x1dff, CLK_ENABLE_ON_INIT), +	[DIV4_B] = DIV4(FRQCRA, 8, 0xdff, CLK_ENABLE_ON_INIT), +	[DIV4_M1] = DIV4(FRQCRA, 4, 0x1dff, 0), +	[DIV4_M2] = DIV4(FRQCRA, 0, 0x1dff, 0), +	[DIV4_Z] = DIV4(FRQCRB, 24, 0x97f, 0), +	[DIV4_ZTR] = DIV4(FRQCRB, 20, 0xdff, 0), +	[DIV4_ZT] = DIV4(FRQCRB, 16, 0xdff, 0), +	[DIV4_ZX] = DIV4(FRQCRB, 12, 0xdff, 0), +	[DIV4_HP] = DIV4(FRQCRB, 4, 0xdff, 0),  };  enum { DIV6_VCK1, DIV6_VCK2, DIV6_VCK3, DIV6_ZB1, @@ -525,6 +525,13 @@ static struct clk mstp_clks[MSTP_NR] = {  	[MSTP403] = MSTP(&r_clk, SMSTPCR4, 3, 0), /* KEYSC */  }; +/* The lookups structure below includes duplicate entries for some clocks + * with alternate names. + * - The traditional name used when a device is initialised with platform data + * - The name used when a device is initialised using device tree + * The longer-term aim is to remove these duplicates, and indeed the + * lookups table entirely, by describing clocks using device tree. + */  static struct clk_lookup lookups[] = {  	/* main clocks */  	CLKDEV_CON_ID("r_clk", &r_clk), @@ -545,6 +552,7 @@ static struct clk_lookup lookups[] = {  	/* MSTP32 clocks */  	CLKDEV_DEV_ID("i2c-sh_mobile.2", &mstp_clks[MSTP001]), /* I2C2 */ +	CLKDEV_DEV_ID("e6824000.i2c", &mstp_clks[MSTP001]), /* I2C2 */  	CLKDEV_DEV_ID("sh_mobile_ceu.1", &mstp_clks[MSTP129]), /* CEU1 */  	CLKDEV_DEV_ID("sh-mobile-csi2.1", &mstp_clks[MSTP128]), /* CSI2-RX1 */  	CLKDEV_DEV_ID("sh_mobile_ceu.0", &mstp_clks[MSTP127]), /* CEU0 */ @@ -553,6 +561,7 @@ static struct clk_lookup lookups[] = {  	CLKDEV_DEV_ID("sh_tmu.1", &mstp_clks[MSTP125]), /* TMU01 */  	CLKDEV_DEV_ID("sh-mipi-dsi.0", &mstp_clks[MSTP118]), /* DSITX */  	CLKDEV_DEV_ID("i2c-sh_mobile.0", &mstp_clks[MSTP116]), /* I2C0 */ +	CLKDEV_DEV_ID("e6820000.i2c", &mstp_clks[MSTP116]), /* I2C0 */  	CLKDEV_DEV_ID("sh_mobile_lcdc_fb.0", &mstp_clks[MSTP100]), /* LCDC0 */  	CLKDEV_DEV_ID("sh-sci.7", &mstp_clks[MSTP219]), /* SCIFA7 */  	CLKDEV_DEV_ID("sh-dma-engine.0", &mstp_clks[MSTP218]), /* SY-DMAC */ @@ -569,17 +578,21 @@ static struct clk_lookup lookups[] = {  	CLKDEV_DEV_ID("sh_fsi2", &mstp_clks[MSTP328]), /* FSI */  	CLKDEV_DEV_ID("sh_irda.0", &mstp_clks[MSTP325]), /* IrDA */  	CLKDEV_DEV_ID("i2c-sh_mobile.1", &mstp_clks[MSTP323]), /* I2C1 */ +	CLKDEV_DEV_ID("e6822000.i2c", &mstp_clks[MSTP323]), /* I2C1 */  	CLKDEV_DEV_ID("renesas_usbhs", &mstp_clks[MSTP322]), /* USB */  	CLKDEV_DEV_ID("sh_mobile_sdhi.0", &mstp_clks[MSTP314]), /* SDHI0 */  	CLKDEV_DEV_ID("sh_mobile_sdhi.1", &mstp_clks[MSTP313]), /* SDHI1 */  	CLKDEV_DEV_ID("sh_mmcif.0", &mstp_clks[MSTP312]), /* MMCIF0 */ +	CLKDEV_DEV_ID("e6bd0000.mmcif", &mstp_clks[MSTP312]), /* MMCIF0 */  	CLKDEV_DEV_ID("sh_mobile_sdhi.2", &mstp_clks[MSTP311]), /* SDHI2 */  	CLKDEV_DEV_ID("leds-renesas-tpu.12", &mstp_clks[MSTP303]), /* TPU1 */  	CLKDEV_DEV_ID("leds-renesas-tpu.21", &mstp_clks[MSTP302]), /* TPU2 */  	CLKDEV_DEV_ID("leds-renesas-tpu.30", &mstp_clks[MSTP301]), /* TPU3 */  	CLKDEV_DEV_ID("leds-renesas-tpu.41", &mstp_clks[MSTP300]), /* TPU4 */  	CLKDEV_DEV_ID("i2c-sh_mobile.3", &mstp_clks[MSTP411]), /* I2C3 */ +	CLKDEV_DEV_ID("e6826000.i2c", &mstp_clks[MSTP411]), /* I2C3 */  	CLKDEV_DEV_ID("i2c-sh_mobile.4", &mstp_clks[MSTP410]), /* I2C4 */ +	CLKDEV_DEV_ID("e6828000.i2c", &mstp_clks[MSTP410]), /* I2C4 */  	CLKDEV_DEV_ID("sh_keysc.0", &mstp_clks[MSTP403]), /* KEYSC */  }; diff --git a/arch/arm/mach-shmobile/headsmp-sh73a0.S b/arch/arm/mach-shmobile/headsmp-sh73a0.S new file mode 100644 index 00000000000..bec4c0d9b71 --- /dev/null +++ b/arch/arm/mach-shmobile/headsmp-sh73a0.S @@ -0,0 +1,50 @@ +/* + * SMP support for SoC sh73a0 + * + * Copyright (C) 2012 Bastian Hecht + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR /PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#include <linux/linkage.h> +#include <linux/init.h> +#include <asm/memory.h> + +	__CPUINIT +/* + * Reset vector for secondary CPUs. + * + * First we turn on L1 cache coherency for our CPU. Then we jump to + * shmobile_invalidate_start that invalidates the cache and hands over control + * to the common ARM startup code. + * This function will be mapped to address 0 by the SBAR register. + * A normal branch is out of range here so we need a long jump. We jump to + * the physical address as the MMU is still turned off. + */ +	.align	12 +ENTRY(sh73a0_secondary_vector) +	mrc     p15, 0, r0, c0, c0, 5	@ read MIPDR +	and	r0, r0, #3		@ mask out cpu ID +	lsl	r0, r0, #3		@ we will shift by cpu_id * 8 bits +	mov	r1, #0xf0000000		@ SCU base address +	ldr	r2, [r1, #8]		@ SCU Power Status Register +	mov	r3, #3 +	bic	r2, r2, r3, lsl r0	@ Clear bits of our CPU (Run Mode) +	str	r2, [r1, #8]		@ write back + +	ldr	pc, 1f +1:	.long shmobile_invalidate_start - PAGE_OFFSET + PLAT_PHYS_OFFSET +ENDPROC(sh73a0_secondary_vector) diff --git a/arch/arm/mach-shmobile/hotplug.c b/arch/arm/mach-shmobile/hotplug.c index b09a0bdbf81..a1524e3367b 100644 --- a/arch/arm/mach-shmobile/hotplug.c +++ b/arch/arm/mach-shmobile/hotplug.c @@ -56,6 +56,12 @@ int shmobile_cpu_disable(unsigned int cpu)  	return cpu == 0 ? -EPERM : 0;  } +int shmobile_cpu_disable_any(unsigned int cpu) +{ +	cpumask_clear_cpu(cpu, &dead_cpus); +	return 0; +} +  int shmobile_cpu_is_dead(unsigned int cpu)  {  	return cpumask_test_cpu(cpu, &dead_cpus); diff --git a/arch/arm/mach-shmobile/include/mach/common.h b/arch/arm/mach-shmobile/include/mach/common.h index a57439eec11..e48606d8a2b 100644 --- a/arch/arm/mach-shmobile/include/mach/common.h +++ b/arch/arm/mach-shmobile/include/mach/common.h @@ -23,6 +23,8 @@ extern void sh7372_map_io(void);  extern void sh7372_earlytimer_init(void);  extern void sh7372_add_early_devices(void);  extern void sh7372_add_standard_devices(void); +extern void sh7372_add_early_devices_dt(void); +extern void sh7372_add_standard_devices_dt(void);  extern void sh7372_clock_init(void);  extern void sh7372_pinmux_init(void);  extern void sh7372_pm_init(void); @@ -32,12 +34,17 @@ extern struct clk sh7372_extal1_clk;  extern struct clk sh7372_extal2_clk;  extern void sh73a0_init_irq(void); +extern void sh73a0_init_irq_dt(void);  extern void sh73a0_map_io(void);  extern void sh73a0_earlytimer_init(void);  extern void sh73a0_add_early_devices(void); +extern void sh73a0_add_early_devices_dt(void);  extern void sh73a0_add_standard_devices(void); +extern void sh73a0_add_standard_devices_dt(void);  extern void sh73a0_clock_init(void);  extern void sh73a0_pinmux_init(void); +extern void sh73a0_pm_init(void); +extern void sh73a0_secondary_vector(void);  extern struct clk sh73a0_extal1_clk;  extern struct clk sh73a0_extal2_clk;  extern struct clk sh73a0_extcki_clk; @@ -49,6 +56,7 @@ extern void r8a7740_add_early_devices(void);  extern void r8a7740_add_standard_devices(void);  extern void r8a7740_clock_init(u8 md_ck);  extern void r8a7740_pinmux_init(void); +extern void r8a7740_pm_init(void);  extern void r8a7779_init_irq(void);  extern void r8a7779_map_io(void); @@ -76,6 +84,7 @@ static inline int shmobile_cpuidle_init(void) { return 0; }  extern void shmobile_cpu_die(unsigned int cpu);  extern int shmobile_cpu_disable(unsigned int cpu); +extern int shmobile_cpu_disable_any(unsigned int cpu);  #ifdef CONFIG_HOTPLUG_CPU  extern int shmobile_cpu_is_dead(unsigned int cpu); diff --git a/arch/arm/mach-shmobile/intc-r8a7779.c b/arch/arm/mach-shmobile/intc-r8a7779.c index ef66f1a8aa2..8807c27f71f 100644 --- a/arch/arm/mach-shmobile/intc-r8a7779.c +++ b/arch/arm/mach-shmobile/intc-r8a7779.c @@ -22,10 +22,10 @@  #include <linux/interrupt.h>  #include <linux/irq.h>  #include <linux/io.h> +#include <linux/irqchip/arm-gic.h>  #include <mach/common.h>  #include <mach/intc.h>  #include <mach/r8a7779.h> -#include <asm/hardware/gic.h>  #include <asm/mach-types.h>  #include <asm/mach/arch.h> diff --git a/arch/arm/mach-shmobile/intc-sh73a0.c b/arch/arm/mach-shmobile/intc-sh73a0.c index f0c5e519060..91faba666d4 100644 --- a/arch/arm/mach-shmobile/intc-sh73a0.c +++ b/arch/arm/mach-shmobile/intc-sh73a0.c @@ -23,10 +23,11 @@  #include <linux/irq.h>  #include <linux/io.h>  #include <linux/sh_intc.h> +#include <linux/irqchip.h> +#include <linux/irqchip/arm-gic.h>  #include <mach/intc.h>  #include <mach/irqs.h>  #include <mach/sh73a0.h> -#include <asm/hardware/gic.h>  #include <asm/mach-types.h>  #include <asm/mach/arch.h> @@ -315,11 +316,6 @@ static int intca_gic_set_type(struct irq_data *data, unsigned int type)  	return irq_cbp(irq_set_type, to_intca_reloc_irq(data), type);  } -static int intca_gic_set_wake(struct irq_data *data, unsigned int on) -{ -	return irq_cbp(irq_set_wake, to_intca_reloc_irq(data), on); -} -  #ifdef CONFIG_SMP  static int intca_gic_set_affinity(struct irq_data *data,  				  const struct cpumask *cpumask, @@ -339,7 +335,7 @@ struct irq_chip intca_gic_irq_chip = {  	.irq_disable		= intca_gic_disable,  	.irq_shutdown		= intca_gic_disable,  	.irq_set_type		= intca_gic_set_type, -	.irq_set_wake		= intca_gic_set_wake, +	.irq_set_wake		= sh73a0_set_wake,  #ifdef CONFIG_SMP  	.irq_set_affinity	= intca_gic_set_affinity,  #endif @@ -464,3 +460,11 @@ void __init sh73a0_init_irq(void)  	sh73a0_pint1_cascade.handler = sh73a0_pint1_demux;  	setup_irq(gic_spi(34), &sh73a0_pint1_cascade);  } + +#ifdef CONFIG_OF +void __init sh73a0_init_irq_dt(void) +{ +	irqchip_init(); +	gic_arch_extn.irq_set_wake = sh73a0_set_wake; +} +#endif diff --git a/arch/arm/mach-shmobile/platsmp.c b/arch/arm/mach-shmobile/platsmp.c index ed8d2351915..1f958d7b0ba 100644 --- a/arch/arm/mach-shmobile/platsmp.c +++ b/arch/arm/mach-shmobile/platsmp.c @@ -12,7 +12,6 @@   */  #include <linux/init.h>  #include <linux/smp.h> -#include <asm/hardware/gic.h>  void __init shmobile_smp_init_cpus(unsigned int ncores)  { @@ -26,6 +25,4 @@ void __init shmobile_smp_init_cpus(unsigned int ncores)  	for (i = 0; i < ncores; i++)  		set_cpu_possible(i, true); - -	set_smp_cross_call(gic_raise_softirq);  } diff --git a/arch/arm/mach-shmobile/pm-r8a7740.c b/arch/arm/mach-shmobile/pm-r8a7740.c index 21e5316d2d8..40b87aa1d44 100644 --- a/arch/arm/mach-shmobile/pm-r8a7740.c +++ b/arch/arm/mach-shmobile/pm-r8a7740.c @@ -9,7 +9,9 @@   * for more details.   */  #include <linux/console.h> +#include <linux/suspend.h>  #include <mach/pm-rmobile.h> +#include <mach/common.h>  #ifdef CONFIG_PM  static int r8a7740_pd_a4s_suspend(void) @@ -58,3 +60,23 @@ void __init r8a7740_init_pm_domains(void)  }  #endif /* CONFIG_PM */ + +#ifdef CONFIG_SUSPEND +static int r8a7740_enter_suspend(suspend_state_t suspend_state) +{ +	cpu_do_idle(); +	return 0; +} + +static void r8a7740_suspend_init(void) +{ +	shmobile_suspend_ops.enter = r8a7740_enter_suspend; +} +#else +static void r8a7740_suspend_init(void) {} +#endif + +void __init r8a7740_pm_init(void) +{ +	r8a7740_suspend_init(); +} diff --git a/arch/arm/mach-shmobile/pm-sh73a0.c b/arch/arm/mach-shmobile/pm-sh73a0.c new file mode 100644 index 00000000000..99086e98fbb --- /dev/null +++ b/arch/arm/mach-shmobile/pm-sh73a0.c @@ -0,0 +1,32 @@ +/* + * sh73a0 Power management support + * + *  Copyright (C) 2012 Bastian Hecht <hechtb+renesas@gmail.com> + * + * This file is subject to the terms and conditions of the GNU General Public + * License.  See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#include <linux/suspend.h> +#include <mach/common.h> + +#ifdef CONFIG_SUSPEND +static int sh73a0_enter_suspend(suspend_state_t suspend_state) +{ +	cpu_do_idle(); +	return 0; +} + +static void sh73a0_suspend_init(void) +{ +	shmobile_suspend_ops.enter = sh73a0_enter_suspend; +} +#else +static void sh73a0_suspend_init(void) {} +#endif + +void __init sh73a0_pm_init(void) +{ +	sh73a0_suspend_init(); +} diff --git a/arch/arm/mach-shmobile/setup-emev2.c b/arch/arm/mach-shmobile/setup-emev2.c index ea61cb657ac..47662a581c0 100644 --- a/arch/arm/mach-shmobile/setup-emev2.c +++ b/arch/arm/mach-shmobile/setup-emev2.c @@ -20,13 +20,14 @@  #include <linux/init.h>  #include <linux/interrupt.h>  #include <linux/irq.h> +#include <linux/irqchip.h>  #include <linux/platform_device.h>  #include <linux/platform_data/gpio-em.h>  #include <linux/of_platform.h>  #include <linux/delay.h>  #include <linux/input.h>  #include <linux/io.h> -#include <linux/of_irq.h> +#include <linux/irqchip/arm-gic.h>  #include <mach/hardware.h>  #include <mach/common.h>  #include <mach/emev2.h> @@ -35,7 +36,6 @@  #include <asm/mach/arch.h>  #include <asm/mach/map.h>  #include <asm/mach/time.h> -#include <asm/hardware/gic.h>  static struct map_desc emev2_io_desc[] __initdata = {  #ifdef CONFIG_SMP @@ -445,27 +445,16 @@ void __init emev2_add_standard_devices_dt(void)  			     emev2_auxdata_lookup, NULL);  } -static const struct of_device_id emev2_dt_irq_match[] = { -	{ .compatible = "arm,cortex-a9-gic", .data = gic_of_init, }, -	{}, -}; -  static const char *emev2_boards_compat_dt[] __initdata = {  	"renesas,emev2",  	NULL,  }; -void __init emev2_init_irq_dt(void) -{ -	of_irq_init(emev2_dt_irq_match); -} -  DT_MACHINE_START(EMEV2_DT, "Generic Emma Mobile EV2 (Flattened Device Tree)")  	.smp		= smp_ops(emev2_smp_ops),  	.init_early	= emev2_init_delay,  	.nr_irqs	= NR_IRQS_LEGACY, -	.init_irq	= emev2_init_irq_dt, -	.handle_irq	= gic_handle_irq, +	.init_irq	= irqchip_init,  	.init_machine	= emev2_add_standard_devices_dt,  	.init_time	= shmobile_timer_init,  	.dt_compat	= emev2_boards_compat_dt, diff --git a/arch/arm/mach-shmobile/setup-r8a7740.c b/arch/arm/mach-shmobile/setup-r8a7740.c index 03c69f9979a..847567d5548 100644 --- a/arch/arm/mach-shmobile/setup-r8a7740.c +++ b/arch/arm/mach-shmobile/setup-r8a7740.c @@ -27,7 +27,6 @@  #include <linux/serial_sci.h>  #include <linux/sh_dma.h>  #include <linux/sh_timer.h> -#include <linux/dma-mapping.h>  #include <mach/dma-register.h>  #include <mach/r8a7740.h>  #include <mach/pm-rmobile.h> @@ -262,6 +261,97 @@ static struct platform_device cmt10_device = {  	.num_resources	= ARRAY_SIZE(cmt10_resources),  }; +/* TMU */ +static struct sh_timer_config tmu00_platform_data = { +	.name = "TMU00", +	.channel_offset = 0x4, +	.timer_bit = 0, +	.clockevent_rating = 200, +}; + +static struct resource tmu00_resources[] = { +	[0] = { +		.name	= "TMU00", +		.start	= 0xfff80008, +		.end	= 0xfff80014 - 1, +		.flags	= IORESOURCE_MEM, +	}, +	[1] = { +		.start	= intcs_evt2irq(0xe80), +		.flags	= IORESOURCE_IRQ, +	}, +}; + +static struct platform_device tmu00_device = { +	.name		= "sh_tmu", +	.id		= 0, +	.dev = { +		.platform_data	= &tmu00_platform_data, +	}, +	.resource	= tmu00_resources, +	.num_resources	= ARRAY_SIZE(tmu00_resources), +}; + +static struct sh_timer_config tmu01_platform_data = { +	.name = "TMU01", +	.channel_offset = 0x10, +	.timer_bit = 1, +	.clocksource_rating = 200, +}; + +static struct resource tmu01_resources[] = { +	[0] = { +		.name	= "TMU01", +		.start	= 0xfff80014, +		.end	= 0xfff80020 - 1, +		.flags	= IORESOURCE_MEM, +	}, +	[1] = { +		.start	= intcs_evt2irq(0xea0), +		.flags	= IORESOURCE_IRQ, +	}, +}; + +static struct platform_device tmu01_device = { +	.name		= "sh_tmu", +	.id		= 1, +	.dev = { +		.platform_data	= &tmu01_platform_data, +	}, +	.resource	= tmu01_resources, +	.num_resources	= ARRAY_SIZE(tmu01_resources), +}; + +static struct sh_timer_config tmu02_platform_data = { +	.name = "TMU02", +	.channel_offset = 0x1C, +	.timer_bit = 2, +	.clocksource_rating = 200, +}; + +static struct resource tmu02_resources[] = { +	[0] = { +		.name	= "TMU02", +		.start	= 0xfff80020, +		.end	= 0xfff8002C - 1, +		.flags	= IORESOURCE_MEM, +	}, +	[1] = { +		.start	= intcs_evt2irq(0xec0), +		.flags	= IORESOURCE_IRQ, +	}, +}; + +static struct platform_device tmu02_device = { +	.name		= "sh_tmu", +	.id		= 2, +	.dev = { +		.platform_data	= &tmu02_platform_data, +	}, +	.resource	= tmu02_resources, +	.num_resources	= ARRAY_SIZE(tmu02_resources), +}; +  static struct platform_device *r8a7740_early_devices[] __initdata = {  	&scif0_device,  	&scif1_device, @@ -273,6 +363,9 @@ static struct platform_device *r8a7740_early_devices[] __initdata = {  	&scif7_device,  	&scifb_device,  	&cmt10_device, +	&tmu00_device, +	&tmu01_device, +	&tmu02_device,  };  /* DMA */ diff --git a/arch/arm/mach-shmobile/setup-r8a7779.c b/arch/arm/mach-shmobile/setup-r8a7779.c index a181ced09e4..7e87ab3eb8d 100644 --- a/arch/arm/mach-shmobile/setup-r8a7779.c +++ b/arch/arm/mach-shmobile/setup-r8a7779.c @@ -66,8 +66,7 @@ static struct plat_sci_port scif0_platform_data = {  	.scscr		= SCSCR_RE | SCSCR_TE | SCSCR_CKE1,  	.scbrr_algo_id	= SCBRR_ALGO_2,  	.type		= PORT_SCIF, -	.irqs		= { gic_spi(88), gic_spi(88), -			    gic_spi(88), gic_spi(88) }, +	.irqs		= SCIx_IRQ_MUXED(gic_spi(88)),  };  static struct platform_device scif0_device = { @@ -84,8 +83,7 @@ static struct plat_sci_port scif1_platform_data = {  	.scscr		= SCSCR_RE | SCSCR_TE | SCSCR_CKE1,  	.scbrr_algo_id	= SCBRR_ALGO_2,  	.type		= PORT_SCIF, -	.irqs		= { gic_spi(89), gic_spi(89), -			    gic_spi(89), gic_spi(89) }, +	.irqs		= SCIx_IRQ_MUXED(gic_spi(89)),  };  static struct platform_device scif1_device = { @@ -102,8 +100,7 @@ static struct plat_sci_port scif2_platform_data = {  	.scscr		= SCSCR_RE | SCSCR_TE | SCSCR_CKE1,  	.scbrr_algo_id	= SCBRR_ALGO_2,  	.type		= PORT_SCIF, -	.irqs		= { gic_spi(90), gic_spi(90), -			    gic_spi(90), gic_spi(90) }, +	.irqs		= SCIx_IRQ_MUXED(gic_spi(90)),  };  static struct platform_device scif2_device = { @@ -120,8 +117,7 @@ static struct plat_sci_port scif3_platform_data = {  	.scscr		= SCSCR_RE | SCSCR_TE | SCSCR_CKE1,  	.scbrr_algo_id	= SCBRR_ALGO_2,  	.type		= PORT_SCIF, -	.irqs		= { gic_spi(91), gic_spi(91), -			    gic_spi(91), gic_spi(91) }, +	.irqs		= SCIx_IRQ_MUXED(gic_spi(91)),  };  static struct platform_device scif3_device = { @@ -138,8 +134,7 @@ static struct plat_sci_port scif4_platform_data = {  	.scscr		= SCSCR_RE | SCSCR_TE | SCSCR_CKE1,  	.scbrr_algo_id	= SCBRR_ALGO_2,  	.type		= PORT_SCIF, -	.irqs		= { gic_spi(92), gic_spi(92), -			    gic_spi(92), gic_spi(92) }, +	.irqs		= SCIx_IRQ_MUXED(gic_spi(92)),  };  static struct platform_device scif4_device = { @@ -156,8 +151,7 @@ static struct plat_sci_port scif5_platform_data = {  	.scscr		= SCSCR_RE | SCSCR_TE | SCSCR_CKE1,  	.scbrr_algo_id	= SCBRR_ALGO_2,  	.type		= PORT_SCIF, -	.irqs		= { gic_spi(93), gic_spi(93), -			    gic_spi(93), gic_spi(93) }, +	.irqs		= SCIx_IRQ_MUXED(gic_spi(93)),  };  static struct platform_device scif5_device = { diff --git a/arch/arm/mach-shmobile/setup-sh73a0.c b/arch/arm/mach-shmobile/setup-sh73a0.c index 8c2d6424f47..f7ecb0bc1be 100644 --- a/arch/arm/mach-shmobile/setup-sh73a0.c +++ b/arch/arm/mach-shmobile/setup-sh73a0.c @@ -23,6 +23,7 @@  #include <linux/interrupt.h>  #include <linux/irq.h>  #include <linux/platform_device.h> +#include <linux/of_platform.h>  #include <linux/delay.h>  #include <linux/input.h>  #include <linux/io.h> @@ -754,7 +755,7 @@ static struct platform_device pmu_device = {  	.resource	= pmu_resources,  }; -static struct platform_device *sh73a0_early_devices[] __initdata = { +static struct platform_device *sh73a0_early_devices_dt[] __initdata = {  	&scif0_device,  	&scif1_device,  	&scif2_device, @@ -765,6 +766,9 @@ static struct platform_device *sh73a0_early_devices[] __initdata = {  	&scif7_device,  	&scif8_device,  	&cmt10_device, +}; + +static struct platform_device *sh73a0_early_devices[] __initdata = {  	&tmu00_device,  	&tmu01_device,  }; @@ -787,6 +791,8 @@ void __init sh73a0_add_standard_devices(void)  	/* Clear software reset bit on SY-DMAC module */  	__raw_writel(__raw_readl(SRCR2) & ~(1 << 18), SRCR2); +	platform_add_devices(sh73a0_early_devices_dt, +			    ARRAY_SIZE(sh73a0_early_devices_dt));  	platform_add_devices(sh73a0_early_devices,  			    ARRAY_SIZE(sh73a0_early_devices));  	platform_add_devices(sh73a0_late_devices, @@ -805,9 +811,63 @@ void __init sh73a0_earlytimer_init(void)  void __init sh73a0_add_early_devices(void)  { +	early_platform_add_devices(sh73a0_early_devices_dt, +				   ARRAY_SIZE(sh73a0_early_devices_dt));  	early_platform_add_devices(sh73a0_early_devices,  				   ARRAY_SIZE(sh73a0_early_devices));  	/* setup early console here as well */  	shmobile_setup_console();  } + +#ifdef CONFIG_USE_OF + +/* Please note that the clock initialisation shcheme used in + * sh73a0_add_early_devices_dt() and sh73a0_add_standard_devices_dt() + * does not work with SMP as there is a yet to be resolved lock-up in + * workqueue initialisation. + * + * CONFIG_SMP should be disabled when using this code. + */ + +void __init sh73a0_add_early_devices_dt(void) +{ +	shmobile_setup_delay(1196, 44, 46); /* Cortex-A9 @ 1196MHz */ + +	early_platform_add_devices(sh73a0_early_devices_dt, +				   ARRAY_SIZE(sh73a0_early_devices_dt)); + +	/* setup early console here as well */ +	shmobile_setup_console(); +} + +static const struct of_dev_auxdata sh73a0_auxdata_lookup[] __initconst = { +	{}, +}; + +void __init sh73a0_add_standard_devices_dt(void) +{ +	/* clocks are setup late during boot in the case of DT */ +	sh73a0_clock_init(); + +	platform_add_devices(sh73a0_early_devices_dt, +			     ARRAY_SIZE(sh73a0_early_devices_dt)); +	of_platform_populate(NULL, of_default_bus_match_table, +			     sh73a0_auxdata_lookup, NULL); +} + +static const char *sh73a0_boards_compat_dt[] __initdata = { +	"renesas,sh73a0", +	NULL, +}; + +DT_MACHINE_START(SH73A0_DT, "Generic SH73A0 (Flattened Device Tree)") +	.map_io		= sh73a0_map_io, +	.init_early	= sh73a0_add_early_devices_dt, +	.nr_irqs	= NR_IRQS_LEGACY, +	.init_irq	= sh73a0_init_irq_dt, +	.init_machine	= sh73a0_add_standard_devices_dt, +	.init_time	= shmobile_timer_init, +	.dt_compat	= sh73a0_boards_compat_dt, +MACHINE_END +#endif /* CONFIG_USE_OF */ diff --git a/arch/arm/mach-shmobile/sleep-sh7372.S b/arch/arm/mach-shmobile/sleep-sh7372.S index 1d564674451..a9df53b69ab 100644 --- a/arch/arm/mach-shmobile/sleep-sh7372.S +++ b/arch/arm/mach-shmobile/sleep-sh7372.S @@ -59,17 +59,19 @@ sh7372_do_idle_sysc:  	mcr	p15, 0, r0, c1, c0, 0  	isb +	/* +	 * Clean and invalidate data cache again. +	 */ +	ldr	r1, kernel_flush +	blx	r1 +  	/* disable L2 cache in the aux control register */  	mrc     p15, 0, r10, c1, c0, 1  	bic     r10, r10, #2  	mcr     p15, 0, r10, c1, c0, 1 +	isb  	/* -	 * Invalidate data cache again. -	 */ -	ldr	r1, kernel_flush -	blx	r1 -	/*  	 * The kernel doesn't interwork: v7_flush_dcache_all in particluar will  	 * always return in Thumb state when CONFIG_THUMB2_KERNEL is enabled.  	 * This sequence switches back to ARM.  Note that .align may insert a diff --git a/arch/arm/mach-shmobile/smp-emev2.c b/arch/arm/mach-shmobile/smp-emev2.c index f6745628628..953eb1f9388 100644 --- a/arch/arm/mach-shmobile/smp-emev2.c +++ b/arch/arm/mach-shmobile/smp-emev2.c @@ -23,11 +23,11 @@  #include <linux/spinlock.h>  #include <linux/io.h>  #include <linux/delay.h> +#include <linux/irqchip/arm-gic.h>  #include <mach/common.h>  #include <mach/emev2.h>  #include <asm/smp_plat.h>  #include <asm/smp_scu.h> -#include <asm/hardware/gic.h>  #include <asm/cacheflush.h>  #define EMEV2_SCU_BASE 0x1e000000 @@ -100,7 +100,7 @@ static int __cpuinit emev2_boot_secondary(unsigned int cpu, struct task_struct *  	/* Tell ROM loader about our vector (in headsmp.S) */  	emev2_set_boot_vector(__pa(shmobile_secondary_vector)); -	gic_raise_softirq(cpumask_of(cpu), 0); +	arch_send_wakeup_ipi_mask(cpumask_of(cpu));  	return 0;  } diff --git a/arch/arm/mach-shmobile/smp-r8a7779.c b/arch/arm/mach-shmobile/smp-r8a7779.c index 2ce6af9a6a3..3a4acf23edc 100644 --- a/arch/arm/mach-shmobile/smp-r8a7779.c +++ b/arch/arm/mach-shmobile/smp-r8a7779.c @@ -23,12 +23,12 @@  #include <linux/spinlock.h>  #include <linux/io.h>  #include <linux/delay.h> +#include <linux/irqchip/arm-gic.h>  #include <mach/common.h>  #include <mach/r8a7779.h>  #include <asm/smp_plat.h>  #include <asm/smp_scu.h>  #include <asm/smp_twd.h> -#include <asm/hardware/gic.h>  #define AVECR IOMEM(0xfe700040) diff --git a/arch/arm/mach-shmobile/smp-sh73a0.c b/arch/arm/mach-shmobile/smp-sh73a0.c index 624f00f70ab..acb46a94ccd 100644 --- a/arch/arm/mach-shmobile/smp-sh73a0.c +++ b/arch/arm/mach-shmobile/smp-sh73a0.c @@ -23,12 +23,13 @@  #include <linux/spinlock.h>  #include <linux/io.h>  #include <linux/delay.h> +#include <linux/irqchip/arm-gic.h>  #include <mach/common.h> +#include <asm/cacheflush.h>  #include <asm/smp_plat.h>  #include <mach/sh73a0.h>  #include <asm/smp_scu.h>  #include <asm/smp_twd.h> -#include <asm/hardware/gic.h>  #define WUPCR		IOMEM(0xe6151010)  #define SRESCR		IOMEM(0xe6151018) @@ -36,14 +37,13 @@  #define SBAR		IOMEM(0xe6180020)  #define APARMBAREA	IOMEM(0xe6f10020) +#define PSTR_SHUTDOWN_MODE	3 +  static void __iomem *scu_base_addr(void)  {  	return (void __iomem *)0xf0000000;  } -static DEFINE_SPINLOCK(scu_lock); -static unsigned long tmp; -  #ifdef CONFIG_HAVE_ARM_TWD  static DEFINE_TWD_LOCAL_TIMER(twd_local_timer, 0xf0000600, 29);  void __init sh73a0_register_twd(void) @@ -52,20 +52,6 @@ void __init sh73a0_register_twd(void)  }  #endif -static void modify_scu_cpu_psr(unsigned long set, unsigned long clr) -{ -	void __iomem *scu_base = scu_base_addr(); - -	spin_lock(&scu_lock); -	tmp = __raw_readl(scu_base + 8); -	tmp &= ~clr; -	tmp |= set; -	spin_unlock(&scu_lock); - -	/* disable cache coherency after releasing the lock */ -	__raw_writel(tmp, scu_base + 8); -} -  static unsigned int __init sh73a0_get_core_count(void)  {  	void __iomem *scu_base = scu_base_addr(); @@ -82,9 +68,6 @@ static int __cpuinit sh73a0_boot_secondary(unsigned int cpu, struct task_struct  {  	cpu = cpu_logical_map(cpu); -	/* enable cache coherency */ -	modify_scu_cpu_psr(0, 3 << (cpu * 8)); -  	if (((__raw_readl(PSTR) >> (4 * cpu)) & 3) == 3)  		__raw_writel(1 << cpu, WUPCR);	/* wake up */  	else @@ -95,16 +78,14 @@ static int __cpuinit sh73a0_boot_secondary(unsigned int cpu, struct task_struct  static void __init sh73a0_smp_prepare_cpus(unsigned int max_cpus)  { -	int cpu = cpu_logical_map(0); -  	scu_enable(scu_base_addr()); -	/* Map the reset vector (in headsmp.S) */ +	/* Map the reset vector (in headsmp-sh73a0.S) */  	__raw_writel(0, APARMBAREA);      /* 4k */ -	__raw_writel(__pa(shmobile_secondary_vector), SBAR); +	__raw_writel(__pa(sh73a0_secondary_vector), SBAR); -	/* enable cache coherency on CPU0 */ -	modify_scu_cpu_psr(0, 3 << (cpu * 8)); +	/* enable cache coherency on booting CPU */ +	scu_power_mode(scu_base_addr(), SCU_PM_NORMAL);  }  static void __init sh73a0_smp_init_cpus(void) @@ -114,16 +95,20 @@ static void __init sh73a0_smp_init_cpus(void)  	shmobile_smp_init_cpus(ncores);  } -static int __maybe_unused sh73a0_cpu_kill(unsigned int cpu) +#ifdef CONFIG_HOTPLUG_CPU +static int sh73a0_cpu_kill(unsigned int cpu)  { +  	int k; +	u32 pstr; -	/* this function is running on another CPU than the offline target, -	 * here we need wait for shutdown code in platform_cpu_die() to -	 * finish before asking SoC-specific code to power off the CPU core. +	/* +	 * wait until the power status register confirms the shutdown of the +	 * offline target  	 */  	for (k = 0; k < 1000; k++) { -		if (shmobile_cpu_is_dead(cpu)) +		pstr = (__raw_readl(PSTR) >> (4 * cpu)) & 3; +		if (pstr == PSTR_SHUTDOWN_MODE)  			return 1;  		mdelay(1); @@ -132,6 +117,23 @@ static int __maybe_unused sh73a0_cpu_kill(unsigned int cpu)  	return 0;  } +static void sh73a0_cpu_die(unsigned int cpu) +{ +	/* +	 * The ARM MPcore does not issue a cache coherency request for the L1 +	 * cache when powering off single CPUs. We must take care of this and +	 * further caches. +	 */ +	dsb(); +	flush_cache_all(); + +	/* Set power off mode. This takes the CPU out of the MP cluster */ +	scu_power_mode(scu_base_addr(), SCU_PM_POWEROFF); + +	/* Enter shutdown mode */ +	cpu_do_idle(); +} +#endif /* CONFIG_HOTPLUG_CPU */  struct smp_operations sh73a0_smp_ops __initdata = {  	.smp_init_cpus		= sh73a0_smp_init_cpus, @@ -140,7 +142,7 @@ struct smp_operations sh73a0_smp_ops __initdata = {  	.smp_boot_secondary	= sh73a0_boot_secondary,  #ifdef CONFIG_HOTPLUG_CPU  	.cpu_kill		= sh73a0_cpu_kill, -	.cpu_die		= shmobile_cpu_die, -	.cpu_disable		= shmobile_cpu_disable, +	.cpu_die		= sh73a0_cpu_die, +	.cpu_disable		= shmobile_cpu_disable_any,  #endif  }; diff --git a/arch/arm/mach-socfpga/platsmp.c b/arch/arm/mach-socfpga/platsmp.c index 68dd1b69512..4e9e69d9e7d 100644 --- a/arch/arm/mach-socfpga/platsmp.c +++ b/arch/arm/mach-socfpga/platsmp.c @@ -22,9 +22,9 @@  #include <linux/io.h>  #include <linux/of.h>  #include <linux/of_address.h> +#include <linux/irqchip/arm-gic.h>  #include <asm/cacheflush.h> -#include <asm/hardware/gic.h>  #include <asm/smp_scu.h>  #include <asm/smp_plat.h> @@ -83,8 +83,6 @@ static void __init socfpga_smp_init_cpus(void)  	for (i = 0; i < ncores; i++)  		set_cpu_possible(i, true); - -	set_smp_cross_call(gic_raise_softirq);  }  static void __init socfpga_smp_prepare_cpus(unsigned int max_cpus) diff --git a/arch/arm/mach-socfpga/socfpga.c b/arch/arm/mach-socfpga/socfpga.c index b54baea5f80..27d68468a02 100644 --- a/arch/arm/mach-socfpga/socfpga.c +++ b/arch/arm/mach-socfpga/socfpga.c @@ -15,12 +15,12 @@   * along with this program.  If not, see <http://www.gnu.org/licenses/>.   */  #include <linux/dw_apb_timer.h> +#include <linux/irqchip.h>  #include <linux/of_address.h>  #include <linux/of_irq.h>  #include <linux/of_platform.h>  #include <asm/hardware/cache-l2x0.h> -#include <asm/hardware/gic.h>  #include <asm/mach/arch.h>  #include <asm/mach/map.h> @@ -62,11 +62,6 @@ static void __init socfpga_map_io(void)  	early_printk("Early printk initialized\n");  } -const static struct of_device_id irq_match[] = { -	{ .compatible = "arm,cortex-a9-gic", .data = gic_of_init, }, -	{} -}; -  void __init socfpga_sysmgr_init(void)  {  	struct device_node *np; @@ -78,9 +73,9 @@ void __init socfpga_sysmgr_init(void)  	rst_manager_base_addr = of_iomap(np, 0);  } -static void __init gic_init_irq(void) +static void __init socfpga_init_irq(void)  { -	of_irq_init(irq_match); +	irqchip_init();  	socfpga_sysmgr_init();  } @@ -105,8 +100,7 @@ static const char *altera_dt_match[] = {  DT_MACHINE_START(SOCFPGA, "Altera SOCFPGA")  	.smp		= smp_ops(socfpga_smp_ops),  	.map_io		= socfpga_map_io, -	.init_irq	= gic_init_irq, -	.handle_irq     = gic_handle_irq, +	.init_irq	= socfpga_init_irq,  	.init_time	= dw_apb_timer_init,  	.init_machine	= socfpga_cyclone5_init,  	.restart	= socfpga_cyclone5_restart, diff --git a/arch/arm/mach-spear13xx/include/mach/generic.h b/arch/arm/mach-spear13xx/include/mach/generic.h index 35e8a007463..633e678e01a 100644 --- a/arch/arm/mach-spear13xx/include/mach/generic.h +++ b/arch/arm/mach-spear13xx/include/mach/generic.h @@ -28,7 +28,6 @@ extern struct dw_dma_slave nand_write_dma_priv;  /* Add spear13xx family function declarations here */  void __init spear_setup_of_timer(void);  void __init spear13xx_map_io(void); -void __init spear13xx_dt_init_irq(void);  void __init spear13xx_l2x0_init(void);  bool dw_dma_filter(struct dma_chan *chan, void *slave);  void spear_restart(char, const char *); diff --git a/arch/arm/mach-spear13xx/platsmp.c b/arch/arm/mach-spear13xx/platsmp.c index 2eaa3fa7b43..af4ade61cd9 100644 --- a/arch/arm/mach-spear13xx/platsmp.c +++ b/arch/arm/mach-spear13xx/platsmp.c @@ -15,8 +15,8 @@  #include <linux/jiffies.h>  #include <linux/io.h>  #include <linux/smp.h> +#include <linux/irqchip/arm-gic.h>  #include <asm/cacheflush.h> -#include <asm/hardware/gic.h>  #include <asm/smp_scu.h>  #include <mach/spear.h>  #include <mach/generic.h> @@ -104,8 +104,6 @@ static void __init spear13xx_smp_init_cpus(void)  	for (i = 0; i < ncores; i++)  		set_cpu_possible(i, true); - -	set_smp_cross_call(gic_raise_softirq);  }  static void __init spear13xx_smp_prepare_cpus(unsigned int max_cpus) diff --git a/arch/arm/mach-spear13xx/spear1310.c b/arch/arm/mach-spear13xx/spear1310.c index e77d05d4808..56214d1076e 100644 --- a/arch/arm/mach-spear13xx/spear1310.c +++ b/arch/arm/mach-spear13xx/spear1310.c @@ -14,9 +14,9 @@  #define pr_fmt(fmt) "SPEAr1310: " fmt  #include <linux/amba/pl022.h> +#include <linux/irqchip.h>  #include <linux/of_platform.h>  #include <linux/pata_arasan_cf_data.h> -#include <asm/hardware/gic.h>  #include <asm/mach/arch.h>  #include <asm/mach/map.h>  #include <mach/generic.h> @@ -90,8 +90,7 @@ static void __init spear1310_map_io(void)  DT_MACHINE_START(SPEAR1310_DT, "ST SPEAr1310 SoC with Flattened Device Tree")  	.smp		=	smp_ops(spear13xx_smp_ops),  	.map_io		=	spear1310_map_io, -	.init_irq	=	spear13xx_dt_init_irq, -	.handle_irq	=	gic_handle_irq, +	.init_irq	=	irqchip_init,  	.init_time	=	spear13xx_timer_init,  	.init_machine	=	spear1310_dt_init,  	.restart	=	spear_restart, diff --git a/arch/arm/mach-spear13xx/spear1340.c b/arch/arm/mach-spear13xx/spear1340.c index ebc25477906..9a28beb2a11 100644 --- a/arch/arm/mach-spear13xx/spear1340.c +++ b/arch/arm/mach-spear13xx/spear1340.c @@ -18,7 +18,7 @@  #include <linux/delay.h>  #include <linux/dw_dmac.h>  #include <linux/of_platform.h> -#include <asm/hardware/gic.h> +#include <linux/irqchip.h>  #include <asm/mach/arch.h>  #include <mach/dma.h>  #include <mach/generic.h> @@ -184,8 +184,7 @@ static const char * const spear1340_dt_board_compat[] = {  DT_MACHINE_START(SPEAR1340_DT, "ST SPEAr1340 SoC with Flattened Device Tree")  	.smp		=	smp_ops(spear13xx_smp_ops),  	.map_io		=	spear13xx_map_io, -	.init_irq	=	spear13xx_dt_init_irq, -	.handle_irq	=	gic_handle_irq, +	.init_irq	=	irqchip_init,  	.init_time	=	spear13xx_timer_init,  	.init_machine	=	spear1340_dt_init,  	.restart	=	spear_restart, diff --git a/arch/arm/mach-spear13xx/spear13xx.c b/arch/arm/mach-spear13xx/spear13xx.c index 7f7acf775f0..c7d2b4a8d8c 100644 --- a/arch/arm/mach-spear13xx/spear13xx.c +++ b/arch/arm/mach-spear13xx/spear13xx.c @@ -17,9 +17,8 @@  #include <linux/clk.h>  #include <linux/dw_dmac.h>  #include <linux/err.h> -#include <linux/of_irq.h> +#include <linux/of.h>  #include <asm/hardware/cache-l2x0.h> -#include <asm/hardware/gic.h>  #include <asm/mach/map.h>  #include <asm/smp_twd.h>  #include <mach/dma.h> @@ -182,13 +181,3 @@ void __init spear13xx_timer_init(void)  	spear_setup_of_timer();  	twd_local_timer_of_register();  } - -static const struct of_device_id gic_of_match[] __initconst = { -	{ .compatible = "arm,cortex-a9-gic", .data = gic_of_init }, -	{ /* Sentinel */ } -}; - -void __init spear13xx_dt_init_irq(void) -{ -	of_irq_init(gic_of_match); -} diff --git a/arch/arm/mach-spear3xx/include/mach/generic.h b/arch/arm/mach-spear3xx/include/mach/generic.h index 46b8f7e4d38..df310799e41 100644 --- a/arch/arm/mach-spear3xx/include/mach/generic.h +++ b/arch/arm/mach-spear3xx/include/mach/generic.h @@ -30,7 +30,6 @@ extern struct pl08x_platform_data pl080_plat_data;  void __init spear_setup_of_timer(void);  void __init spear3xx_clk_init(void);  void __init spear3xx_map_io(void); -void __init spear3xx_dt_init_irq(void);  void spear_restart(char, const char *); diff --git a/arch/arm/mach-spear3xx/spear300.c b/arch/arm/mach-spear3xx/spear300.c index 2630efa93f5..bbc9b7e9c62 100644 --- a/arch/arm/mach-spear3xx/spear300.c +++ b/arch/arm/mach-spear3xx/spear300.c @@ -14,8 +14,8 @@  #define pr_fmt(fmt) "SPEAr300: " fmt  #include <linux/amba/pl08x.h> +#include <linux/irqchip.h>  #include <linux/of_platform.h> -#include <asm/hardware/vic.h>  #include <asm/mach/arch.h>  #include <mach/generic.h>  #include <mach/spear.h> @@ -212,8 +212,7 @@ static void __init spear300_map_io(void)  DT_MACHINE_START(SPEAR300_DT, "ST SPEAr300 SoC with Flattened Device Tree")  	.map_io		=	spear300_map_io, -	.init_irq	=	spear3xx_dt_init_irq, -	.handle_irq	=	vic_handle_irq, +	.init_irq	=	irqchip_init,  	.init_time	=	spear3xx_timer_init,  	.init_machine	=	spear300_dt_init,  	.restart	=	spear_restart, diff --git a/arch/arm/mach-spear3xx/spear310.c b/arch/arm/mach-spear3xx/spear310.c index b6147eaebcd..c13a434a819 100644 --- a/arch/arm/mach-spear3xx/spear310.c +++ b/arch/arm/mach-spear3xx/spear310.c @@ -15,8 +15,8 @@  #include <linux/amba/pl08x.h>  #include <linux/amba/serial.h> +#include <linux/irqchip.h>  #include <linux/of_platform.h> -#include <asm/hardware/vic.h>  #include <asm/mach/arch.h>  #include <mach/generic.h>  #include <mach/spear.h> @@ -254,8 +254,7 @@ static void __init spear310_map_io(void)  DT_MACHINE_START(SPEAR310_DT, "ST SPEAr310 SoC with Flattened Device Tree")  	.map_io		=	spear310_map_io, -	.init_irq	=	spear3xx_dt_init_irq, -	.handle_irq	=	vic_handle_irq, +	.init_irq	=	irqchip_init,  	.init_time	=	spear3xx_timer_init,  	.init_machine	=	spear310_dt_init,  	.restart	=	spear_restart, diff --git a/arch/arm/mach-spear3xx/spear320.c b/arch/arm/mach-spear3xx/spear320.c index 53160f713af..e1c77079a3e 100644 --- a/arch/arm/mach-spear3xx/spear320.c +++ b/arch/arm/mach-spear3xx/spear320.c @@ -16,8 +16,8 @@  #include <linux/amba/pl022.h>  #include <linux/amba/pl08x.h>  #include <linux/amba/serial.h> +#include <linux/irqchip.h>  #include <linux/of_platform.h> -#include <asm/hardware/vic.h>  #include <asm/mach/arch.h>  #include <mach/generic.h>  #include <mach/spear.h> @@ -268,8 +268,7 @@ static void __init spear320_map_io(void)  DT_MACHINE_START(SPEAR320_DT, "ST SPEAr320 SoC with Flattened Device Tree")  	.map_io		=	spear320_map_io, -	.init_irq	=	spear3xx_dt_init_irq, -	.handle_irq	=	vic_handle_irq, +	.init_irq	=	irqchip_init,  	.init_time	=	spear3xx_timer_init,  	.init_machine	=	spear320_dt_init,  	.restart	=	spear_restart, diff --git a/arch/arm/mach-spear3xx/spear3xx.c b/arch/arm/mach-spear3xx/spear3xx.c index 89f4c58908e..b2ba516ca2d 100644 --- a/arch/arm/mach-spear3xx/spear3xx.c +++ b/arch/arm/mach-spear3xx/spear3xx.c @@ -15,11 +15,8 @@  #include <linux/amba/pl022.h>  #include <linux/amba/pl08x.h> -#include <linux/irqchip/spear-shirq.h> -#include <linux/of_irq.h>  #include <linux/io.h>  #include <asm/hardware/pl080.h> -#include <asm/hardware/vic.h>  #include <plat/pl080.h>  #include <mach/generic.h>  #include <mach/spear.h> @@ -115,16 +112,3 @@ void __init spear3xx_timer_init(void)  	spear_setup_of_timer();  } - -static const struct of_device_id vic_of_match[] __initconst = { -	{ .compatible = "arm,pl190-vic", .data = vic_of_init, }, -	{ .compatible = "st,spear300-shirq", .data = spear300_shirq_of_init, }, -	{ .compatible = "st,spear310-shirq", .data = spear310_shirq_of_init, }, -	{ .compatible = "st,spear320-shirq", .data = spear320_shirq_of_init, }, -	{ /* Sentinel */ } -}; - -void __init spear3xx_dt_init_irq(void) -{ -	of_irq_init(vic_of_match); -} diff --git a/arch/arm/mach-spear6xx/spear6xx.c b/arch/arm/mach-spear6xx/spear6xx.c index 1f85bc07c6c..b8bd33ca88b 100644 --- a/arch/arm/mach-spear6xx/spear6xx.c +++ b/arch/arm/mach-spear6xx/spear6xx.c @@ -16,12 +16,11 @@  #include <linux/amba/pl08x.h>  #include <linux/clk.h>  #include <linux/err.h> +#include <linux/irqchip.h>  #include <linux/of.h>  #include <linux/of_address.h> -#include <linux/of_irq.h>  #include <linux/of_platform.h>  #include <asm/hardware/pl080.h> -#include <asm/hardware/vic.h>  #include <asm/mach/arch.h>  #include <asm/mach/time.h>  #include <asm/mach/map.h> @@ -421,20 +420,9 @@ static const char *spear600_dt_board_compat[] = {  	NULL  }; -static const struct of_device_id vic_of_match[] __initconst = { -	{ .compatible = "arm,pl190-vic", .data = vic_of_init, }, -	{ /* Sentinel */ } -}; - -static void __init spear6xx_dt_init_irq(void) -{ -	of_irq_init(vic_of_match); -} -  DT_MACHINE_START(SPEAR600_DT, "ST SPEAr600 (Flattened Device Tree)")  	.map_io		=	spear6xx_map_io, -	.init_irq	=	spear6xx_dt_init_irq, -	.handle_irq	=	vic_handle_irq, +	.init_irq	=	irqchip_init,  	.init_time	=	spear6xx_timer_init,  	.init_machine	=	spear600_dt_init,  	.restart	=	spear_restart, diff --git a/arch/arm/mach-sunxi/sunxi.c b/arch/arm/mach-sunxi/sunxi.c index 6980cfa646f..fb8fbcecb17 100644 --- a/arch/arm/mach-sunxi/sunxi.c +++ b/arch/arm/mach-sunxi/sunxi.c @@ -21,8 +21,6 @@  #include <linux/irqchip/sunxi.h> -#include <asm/hardware/vic.h> -  #include <asm/mach/arch.h>  #include <asm/mach/map.h> diff --git a/arch/arm/mach-tegra/board-dt-tegra20.c b/arch/arm/mach-tegra/board-dt-tegra20.c index 63cfc430f9c..a0edf251028 100644 --- a/arch/arm/mach-tegra/board-dt-tegra20.c +++ b/arch/arm/mach-tegra/board-dt-tegra20.c @@ -26,7 +26,6 @@  #include <linux/of.h>  #include <linux/of_address.h>  #include <linux/of_fdt.h> -#include <linux/of_irq.h>  #include <linux/of_platform.h>  #include <linux/pda_power.h>  #include <linux/platform_data/tegra_usb.h> @@ -35,7 +34,6 @@  #include <linux/i2c-tegra.h>  #include <linux/usb/tegra_usb_phy.h> -#include <asm/hardware/gic.h>  #include <asm/mach-types.h>  #include <asm/mach/arch.h>  #include <asm/mach/time.h> @@ -149,7 +147,6 @@ DT_MACHINE_START(TEGRA_DT, "nVidia Tegra20 (Flattened Device Tree)")  	.smp		= smp_ops(tegra_smp_ops),  	.init_early	= tegra20_init_early,  	.init_irq	= tegra_dt_init_irq, -	.handle_irq	= gic_handle_irq,  	.init_time	= clocksource_of_init,  	.init_machine	= tegra_dt_init,  	.init_late	= tegra_dt_init_late, diff --git a/arch/arm/mach-tegra/board-dt-tegra30.c b/arch/arm/mach-tegra/board-dt-tegra30.c index 5b58b6439db..bf68567e549 100644 --- a/arch/arm/mach-tegra/board-dt-tegra30.c +++ b/arch/arm/mach-tegra/board-dt-tegra30.c @@ -32,7 +32,6 @@  #include <linux/of_platform.h>  #include <asm/mach/arch.h> -#include <asm/hardware/gic.h>  #include "board.h"  #include "common.h" @@ -53,7 +52,6 @@ DT_MACHINE_START(TEGRA30_DT, "NVIDIA Tegra30 (Flattened Device Tree)")  	.map_io		= tegra_map_common_io,  	.init_early	= tegra30_init_early,  	.init_irq	= tegra_dt_init_irq, -	.handle_irq	= gic_handle_irq,  	.init_time	= clocksource_of_init,  	.init_machine	= tegra30_dt_init,  	.init_late	= tegra_init_late, diff --git a/arch/arm/mach-tegra/common.c b/arch/arm/mach-tegra/common.c index 2f1351359a3..46c071861c4 100644 --- a/arch/arm/mach-tegra/common.c +++ b/arch/arm/mach-tegra/common.c @@ -21,11 +21,10 @@  #include <linux/io.h>  #include <linux/clk.h>  #include <linux/delay.h> -#include <linux/of_irq.h> +#include <linux/irqchip.h>  #include <linux/clk/tegra.h>  #include <asm/hardware/cache-l2x0.h> -#include <asm/hardware/gic.h>  #include <mach/powergate.h> @@ -58,17 +57,11 @@ u32 tegra_uart_config[4] = {  };  #ifdef CONFIG_OF -static const struct of_device_id tegra_dt_irq_match[] __initconst = { -	{ .compatible = "arm,cortex-a15-gic", .data = gic_of_init }, -	{ .compatible = "arm,cortex-a9-gic", .data = gic_of_init }, -	{ } -}; -  void __init tegra_dt_init_irq(void)  {  	tegra_clocks_init();  	tegra_init_irq(); -	of_irq_init(tegra_dt_irq_match); +	irqchip_init();  }  #endif diff --git a/arch/arm/mach-tegra/irq.c b/arch/arm/mach-tegra/irq.c index c9976e337bb..1952e82797c 100644 --- a/arch/arm/mach-tegra/irq.c +++ b/arch/arm/mach-tegra/irq.c @@ -22,8 +22,7 @@  #include <linux/irq.h>  #include <linux/io.h>  #include <linux/of.h> - -#include <asm/hardware/gic.h> +#include <linux/irqchip/arm-gic.h>  #include "board.h"  #include "iomap.h" diff --git a/arch/arm/mach-tegra/platsmp.c b/arch/arm/mach-tegra/platsmp.c index 2ff68a47099..f06fc51cc27 100644 --- a/arch/arm/mach-tegra/platsmp.c +++ b/arch/arm/mach-tegra/platsmp.c @@ -18,10 +18,10 @@  #include <linux/jiffies.h>  #include <linux/smp.h>  #include <linux/io.h> +#include <linux/irqchip/arm-gic.h>  #include <linux/clk/tegra.h>  #include <asm/cacheflush.h> -#include <asm/hardware/gic.h>  #include <asm/mach-types.h>  #include <asm/smp_scu.h>  #include <asm/smp_plat.h> @@ -178,7 +178,6 @@ done:  static void __init tegra_smp_init_cpus(void)  { -	set_smp_cross_call(gic_raise_softirq);  }  static void __init tegra_smp_prepare_cpus(unsigned int max_cpus) diff --git a/arch/arm/mach-u300/core.c b/arch/arm/mach-u300/core.c index 100a8b764da..12060ae4e8f 100644 --- a/arch/arm/mach-u300/core.c +++ b/arch/arm/mach-u300/core.c @@ -31,11 +31,11 @@  #include <linux/dma-mapping.h>  #include <linux/platform_data/clk-u300.h>  #include <linux/platform_data/pinctrl-coh901.h> +#include <linux/irqchip/arm-vic.h>  #include <asm/types.h>  #include <asm/setup.h>  #include <asm/memory.h> -#include <asm/hardware/vic.h>  #include <asm/mach/map.h>  #include <asm/mach-types.h>  #include <asm/mach/arch.h> @@ -1779,7 +1779,6 @@ MACHINE_START(U300, "Ericsson AB U335 S335/B335 Prototype Board")  	.map_io		= u300_map_io,  	.nr_irqs	= 0,  	.init_irq	= u300_init_irq, -	.handle_irq	= vic_handle_irq,  	.init_time	= u300_timer_init,  	.init_machine	= u300_init_machine,  	.restart	= u300_restart, diff --git a/arch/arm/mach-ux500/board-mop500.c b/arch/arm/mach-ux500/board-mop500.c index e1dfa24b4fb..0e928d28175 100644 --- a/arch/arm/mach-ux500/board-mop500.c +++ b/arch/arm/mach-ux500/board-mop500.c @@ -40,7 +40,6 @@  #include <asm/mach-types.h>  #include <asm/mach/arch.h> -#include <asm/hardware/gic.h>  #include <mach/hardware.h>  #include <mach/setup.h> @@ -752,7 +751,6 @@ MACHINE_START(U8500, "ST-Ericsson MOP500 platform")  	.init_irq	= ux500_init_irq,  	/* we re-use nomadik timer here */  	.init_time	= ux500_timer_init, -	.handle_irq	= gic_handle_irq,  	.init_machine	= mop500_init_machine,  	.init_late	= ux500_init_late,  MACHINE_END @@ -762,7 +760,6 @@ MACHINE_START(U8520, "ST-Ericsson U8520 Platform HREFP520")  	.map_io		= u8500_map_io,  	.init_irq	= ux500_init_irq,  	.init_time	= ux500_timer_init, -	.handle_irq	= gic_handle_irq,  	.init_machine	= mop500_init_machine,  	.init_late	= ux500_init_late,  MACHINE_END @@ -773,7 +770,6 @@ MACHINE_START(HREFV60, "ST-Ericsson U8500 Platform HREFv60+")  	.map_io		= u8500_map_io,  	.init_irq	= ux500_init_irq,  	.init_time	= ux500_timer_init, -	.handle_irq	= gic_handle_irq,  	.init_machine	= hrefv60_init_machine,  	.init_late	= ux500_init_late,  MACHINE_END @@ -785,7 +781,6 @@ MACHINE_START(SNOWBALL, "Calao Systems Snowball platform")  	.init_irq	= ux500_init_irq,  	/* we re-use nomadik timer here */  	.init_time	= ux500_timer_init, -	.handle_irq	= gic_handle_irq,  	.init_machine	= snowball_init_machine,  	.init_late	= NULL,  MACHINE_END diff --git a/arch/arm/mach-ux500/cpu-db8500.c b/arch/arm/mach-ux500/cpu-db8500.c index c1fb38b5ed9..218a6b1ada7 100644 --- a/arch/arm/mach-ux500/cpu-db8500.c +++ b/arch/arm/mach-ux500/cpu-db8500.c @@ -27,7 +27,6 @@  #include <asm/pmu.h>  #include <asm/mach/map.h>  #include <asm/mach/arch.h> -#include <asm/hardware/gic.h>  #include <mach/hardware.h>  #include <mach/setup.h> @@ -342,7 +341,6 @@ DT_MACHINE_START(U8500_DT, "ST-Ericsson Ux5x0 platform (Device Tree Support)")  	.init_irq	= ux500_init_irq,  	/* we re-use nomadik timer here */  	.init_time	= ux500_timer_init, -	.handle_irq	= gic_handle_irq,  	.init_machine	= u8500_init_machine,  	.init_late	= NULL,  	.dt_compat      = stericsson_dt_platform_compat, diff --git a/arch/arm/mach-ux500/cpu.c b/arch/arm/mach-ux500/cpu.c index 721e7b4275f..5dd90d31ffc 100644 --- a/arch/arm/mach-ux500/cpu.c +++ b/arch/arm/mach-ux500/cpu.c @@ -17,9 +17,10 @@  #include <linux/of.h>  #include <linux/of_irq.h>  #include <linux/irq.h> +#include <linux/irqchip.h> +#include <linux/irqchip/arm-gic.h>  #include <linux/platform_data/clk-ux500.h> -#include <asm/hardware/gic.h>  #include <asm/mach/map.h>  #include <mach/hardware.h> @@ -42,11 +43,6 @@ void __iomem *_PRCMU_BASE;   * This feels fragile because it depends on the gpio device getting probed   * _before_ any device uses the gpio interrupts.  */ -static const struct of_device_id ux500_dt_irq_match[] = { -	{ .compatible = "arm,cortex-a9-gic", .data = gic_of_init, }, -	{}, -}; -  void __init ux500_init_irq(void)  {  	void __iomem *dist_base; @@ -62,7 +58,7 @@ void __init ux500_init_irq(void)  #ifdef CONFIG_OF  	if (of_have_populated_dt()) -		of_irq_init(ux500_dt_irq_match); +		irqchip_init();  	else  #endif  		gic_init(0, 29, dist_base, cpu_base); diff --git a/arch/arm/mach-ux500/platsmp.c b/arch/arm/mach-ux500/platsmp.c index 3db7782f3af..b8adac93421 100644 --- a/arch/arm/mach-ux500/platsmp.c +++ b/arch/arm/mach-ux500/platsmp.c @@ -16,9 +16,9 @@  #include <linux/device.h>  #include <linux/smp.h>  #include <linux/io.h> +#include <linux/irqchip/arm-gic.h>  #include <asm/cacheflush.h> -#include <asm/hardware/gic.h>  #include <asm/smp_plat.h>  #include <asm/smp_scu.h>  #include <mach/hardware.h> @@ -91,7 +91,7 @@ static int __cpuinit ux500_boot_secondary(unsigned int cpu, struct task_struct *  	 */  	write_pen_release(cpu_logical_map(cpu)); -	smp_send_reschedule(cpu); +	arch_send_wakeup_ipi_mask(cpumask_of(cpu));  	timeout = jiffies + (1 * HZ);  	while (time_before(jiffies, timeout)) { @@ -155,8 +155,6 @@ static void __init ux500_smp_init_cpus(void)  	for (i = 0; i < ncores; i++)  		set_cpu_possible(i, true); - -	set_smp_cross_call(gic_raise_softirq);  }  static void __init ux500_smp_prepare_cpus(unsigned int max_cpus) diff --git a/arch/arm/mach-versatile/core.c b/arch/arm/mach-versatile/core.c index d5ddc0c77f5..a42b89083eb 100644 --- a/arch/arm/mach-versatile/core.c +++ b/arch/arm/mach-versatile/core.c @@ -32,6 +32,7 @@  #include <linux/amba/mmci.h>  #include <linux/amba/pl022.h>  #include <linux/io.h> +#include <linux/irqchip/arm-vic.h>  #include <linux/irqchip/versatile-fpga.h>  #include <linux/gfp.h>  #include <linux/clkdev.h> @@ -40,7 +41,6 @@  #include <asm/irq.h>  #include <asm/hardware/arm_timer.h>  #include <asm/hardware/icst.h> -#include <asm/hardware/vic.h>  #include <asm/mach-types.h>  #include <asm/mach/arch.h> diff --git a/arch/arm/mach-versatile/versatile_ab.c b/arch/arm/mach-versatile/versatile_ab.c index 187c1da2c4b..1caef109379 100644 --- a/arch/arm/mach-versatile/versatile_ab.c +++ b/arch/arm/mach-versatile/versatile_ab.c @@ -26,7 +26,6 @@  #include <mach/hardware.h>  #include <asm/irq.h> -#include <asm/hardware/vic.h>  #include <asm/mach-types.h>  #include <asm/mach/arch.h> @@ -39,7 +38,6 @@ MACHINE_START(VERSATILE_AB, "ARM-Versatile AB")  	.map_io		= versatile_map_io,  	.init_early	= versatile_init_early,  	.init_irq	= versatile_init_irq, -	.handle_irq	= vic_handle_irq,  	.init_time	= versatile_timer_init,  	.init_machine	= versatile_init,  	.restart	= versatile_restart, diff --git a/arch/arm/mach-versatile/versatile_dt.c b/arch/arm/mach-versatile/versatile_dt.c index ccf9f8a9206..2558f2e957c 100644 --- a/arch/arm/mach-versatile/versatile_dt.c +++ b/arch/arm/mach-versatile/versatile_dt.c @@ -24,7 +24,6 @@  #include <linux/init.h>  #include <linux/of_irq.h>  #include <linux/of_platform.h> -#include <asm/hardware/vic.h>  #include <asm/mach-types.h>  #include <asm/mach/arch.h> @@ -46,7 +45,6 @@ DT_MACHINE_START(VERSATILE_PB, "ARM-Versatile (Device Tree Support)")  	.map_io		= versatile_map_io,  	.init_early	= versatile_init_early,  	.init_irq	= versatile_init_irq, -	.handle_irq	= vic_handle_irq,  	.init_time	= versatile_timer_init,  	.init_machine	= versatile_dt_init,  	.dt_compat	= versatile_dt_match, diff --git a/arch/arm/mach-versatile/versatile_pb.c b/arch/arm/mach-versatile/versatile_pb.c index 1cabc0aa569..611d140c869 100644 --- a/arch/arm/mach-versatile/versatile_pb.c +++ b/arch/arm/mach-versatile/versatile_pb.c @@ -27,7 +27,6 @@  #include <linux/io.h>  #include <mach/hardware.h> -#include <asm/hardware/vic.h>  #include <asm/irq.h>  #include <asm/mach-types.h> @@ -107,7 +106,6 @@ MACHINE_START(VERSATILE_PB, "ARM-Versatile PB")  	.map_io		= versatile_map_io,  	.init_early	= versatile_init_early,  	.init_irq	= versatile_init_irq, -	.handle_irq	= vic_handle_irq,  	.init_time	= versatile_timer_init,  	.init_machine	= versatile_pb_init,  	.restart	= versatile_restart, diff --git a/arch/arm/mach-vexpress/ct-ca9x4.c b/arch/arm/mach-vexpress/ct-ca9x4.c index 60838ddb856..6f34497a424 100644 --- a/arch/arm/mach-vexpress/ct-ca9x4.c +++ b/arch/arm/mach-vexpress/ct-ca9x4.c @@ -10,10 +10,10 @@  #include <linux/amba/clcd.h>  #include <linux/clkdev.h>  #include <linux/vexpress.h> +#include <linux/irqchip/arm-gic.h>  #include <asm/hardware/arm_timer.h>  #include <asm/hardware/cache-l2x0.h> -#include <asm/hardware/gic.h>  #include <asm/smp_scu.h>  #include <asm/smp_twd.h> @@ -182,8 +182,6 @@ static void __init ct_ca9x4_init_cpu_map(void)  	for (i = 0; i < ncores; ++i)  		set_cpu_possible(i, true); - -	set_smp_cross_call(gic_raise_softirq);  }  static void __init ct_ca9x4_smp_enable(unsigned int max_cpus) diff --git a/arch/arm/mach-vexpress/platsmp.c b/arch/arm/mach-vexpress/platsmp.c index c5d70de9bb4..dc1ace55d55 100644 --- a/arch/arm/mach-vexpress/platsmp.c +++ b/arch/arm/mach-vexpress/platsmp.c @@ -16,7 +16,6 @@  #include <linux/vexpress.h>  #include <asm/smp_scu.h> -#include <asm/hardware/gic.h>  #include <asm/mach/map.h>  #include <mach/motherboard.h> @@ -128,8 +127,6 @@ static void __init vexpress_dt_smp_init_cpus(void)  	for (i = 0; i < ncores; ++i)  		set_cpu_possible(i, true); - -	set_smp_cross_call(gic_raise_softirq);  }  static void __init vexpress_dt_smp_prepare_cpus(unsigned int max_cpus) diff --git a/arch/arm/mach-vexpress/v2m.c b/arch/arm/mach-vexpress/v2m.c index 08bd548ef14..915683cb67d 100644 --- a/arch/arm/mach-vexpress/v2m.c +++ b/arch/arm/mach-vexpress/v2m.c @@ -7,6 +7,7 @@  #include <linux/io.h>  #include <linux/smp.h>  #include <linux/init.h> +#include <linux/irqchip.h>  #include <linux/of_address.h>  #include <linux/of_fdt.h>  #include <linux/of_irq.h> @@ -30,7 +31,6 @@  #include <asm/mach/time.h>  #include <asm/hardware/arm_timer.h>  #include <asm/hardware/cache-l2x0.h> -#include <asm/hardware/gic.h>  #include <asm/hardware/timer-sp.h>  #include <mach/ct-ca9x4.h> @@ -373,7 +373,6 @@ MACHINE_START(VEXPRESS, "ARM-Versatile Express")  	.init_early	= v2m_init_early,  	.init_irq	= v2m_init_irq,  	.init_time	= v2m_timer_init, -	.handle_irq	= gic_handle_irq,  	.init_machine	= v2m_init,  	.restart	= vexpress_restart,  MACHINE_END @@ -430,16 +429,6 @@ void __init v2m_dt_init_early(void)  	}  } -static  struct of_device_id vexpress_irq_match[] __initdata = { -	{ .compatible = "arm,cortex-a9-gic", .data = gic_of_init, }, -	{} -}; - -static void __init v2m_dt_init_irq(void) -{ -	of_irq_init(vexpress_irq_match); -} -  static void __init v2m_dt_timer_init(void)  {  	struct device_node *node = NULL; @@ -489,9 +478,8 @@ DT_MACHINE_START(VEXPRESS_DT, "ARM-Versatile Express")  	.smp		= smp_ops(vexpress_smp_ops),  	.map_io		= v2m_dt_map_io,  	.init_early	= v2m_dt_init_early, -	.init_irq	= v2m_dt_init_irq, +	.init_irq	= irqchip_init,  	.init_time	= v2m_dt_timer_init,  	.init_machine	= v2m_dt_init, -	.handle_irq	= gic_handle_irq,  	.restart	= vexpress_restart,  MACHINE_END diff --git a/arch/arm/mach-vt8500/Kconfig b/arch/arm/mach-vt8500/Kconfig index 2ed0b7d95db..c0b1c604ccf 100644 --- a/arch/arm/mach-vt8500/Kconfig +++ b/arch/arm/mach-vt8500/Kconfig @@ -1,12 +1,34 @@  config ARCH_VT8500 -	bool "VIA/WonderMedia 85xx" if ARCH_MULTI_V5 -	default ARCH_VT8500_SINGLE +	bool  	select ARCH_HAS_CPUFREQ  	select ARCH_REQUIRE_GPIOLIB  	select CLKDEV_LOOKUP -	select CPU_ARM926T  	select GENERIC_CLOCKEVENTS  	select GENERIC_GPIO  	select HAVE_CLK +	select VT8500_TIMER  	help  	  Support for VIA/WonderMedia VT8500/WM85xx System-on-Chip. + +config ARCH_WM8505 +	bool "VIA/Wondermedia 85xx and WM8650" + 	depends on ARCH_MULTI_V5 + 	select ARCH_VT8500 + 	select CPU_ARM926T + 	help + +config ARCH_WM8750 +	bool "WonderMedia WM8750" +	depends on ARCH_MULTI_V6 +	select ARCH_VT8500 +	select CPU_V6 +	help +	  Support for WonderMedia WM8750 System-on-Chip. + +config ARCH_WM8850 +	bool "WonderMedia WM8850" +	depends on ARCH_MULTI_V7 +	select ARCH_VT8500 +	select CPU_V7 +	help +	  Support for WonderMedia WM8850 System-on-Chip. diff --git a/arch/arm/mach-vt8500/Makefile b/arch/arm/mach-vt8500/Makefile index e035251cda4..92ceb2436b6 100644 --- a/arch/arm/mach-vt8500/Makefile +++ b/arch/arm/mach-vt8500/Makefile @@ -1 +1 @@ -obj-$(CONFIG_ARCH_VT8500) += irq.o timer.o vt8500.o +obj-$(CONFIG_ARCH_VT8500) += irq.o vt8500.o diff --git a/arch/arm/mach-vt8500/common.h b/arch/arm/mach-vt8500/common.h index 6f2b843115d..77611a6968d 100644 --- a/arch/arm/mach-vt8500/common.h +++ b/arch/arm/mach-vt8500/common.h @@ -18,7 +18,6 @@  #include <linux/of.h> -void __init vt8500_timer_init(void);  int __init vt8500_irq_init(struct device_node *node,  				struct device_node *parent); diff --git a/arch/arm/mach-vt8500/include/mach/timex.h b/arch/arm/mach-vt8500/include/mach/timex.h deleted file mode 100644 index 8487e4c690b..00000000000 --- a/arch/arm/mach-vt8500/include/mach/timex.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - *  arch/arm/mach-vt8500/include/mach/timex.h - * - *  Copyright (C) 2010 Alexey Charkov <alchark@gmail.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA - */ - -#ifndef MACH_TIMEX_H -#define MACH_TIMEX_H - -#define CLOCK_TICK_RATE		(3000000) - -#endif /* MACH_TIMEX_H */ diff --git a/arch/arm/mach-vt8500/include/mach/uncompress.h b/arch/arm/mach-vt8500/include/mach/uncompress.h deleted file mode 100644 index e6e81fdaf10..00000000000 --- a/arch/arm/mach-vt8500/include/mach/uncompress.h +++ /dev/null @@ -1,37 +0,0 @@ -/* arch/arm/mach-vt8500/include/mach/uncompress.h - * - * Copyright (C) 2010 Alexey Charkov <alchark@gmail.com> - * - * Based on arch/arm/mach-dove/include/mach/uncompress.h - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - */ - -#define UART0_PHYS	0xd8200000 -#define UART0_ADDR(x)	*(volatile unsigned char *)(UART0_PHYS + x) - -static void putc(const char c) -{ -	while (UART0_ADDR(0x1c) & 0x2) -		/* Tx busy, wait and poll */; - -	UART0_ADDR(0) = c; -} - -static void flush(void) -{ -} - -/* - * nothing to do - */ -#define arch_decomp_setup() -#define arch_decomp_wdog() diff --git a/arch/arm/mach-vt8500/timer.c b/arch/arm/mach-vt8500/timer.c deleted file mode 100644 index 3dd21a47881..00000000000 --- a/arch/arm/mach-vt8500/timer.c +++ /dev/null @@ -1,184 +0,0 @@ -/* - *  arch/arm/mach-vt8500/timer.c - * - *  Copyright (C) 2012 Tony Prisk <linux@prisktech.co.nz> - *  Copyright (C) 2010 Alexey Charkov <alchark@gmail.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA - */ - -/* - * This file is copied and modified from the original timer.c provided by - * Alexey Charkov. Minor changes have been made for Device Tree Support. - */ - -#include <linux/io.h> -#include <linux/irq.h> -#include <linux/interrupt.h> -#include <linux/clocksource.h> -#include <linux/clockchips.h> -#include <linux/delay.h> -#include <asm/mach/time.h> - -#include <linux/of.h> -#include <linux/of_address.h> -#include <linux/of_irq.h> - -#define VT8500_TIMER_OFFSET	0x0100 -#define VT8500_TIMER_HZ		3000000 -#define TIMER_MATCH_VAL		0x0000 -#define TIMER_COUNT_VAL		0x0010 -#define TIMER_STATUS_VAL	0x0014 -#define TIMER_IER_VAL		0x001c		/* interrupt enable */ -#define TIMER_CTRL_VAL		0x0020 -#define TIMER_AS_VAL		0x0024		/* access status */ -#define TIMER_COUNT_R_ACTIVE	(1 << 5)	/* not ready for read */ -#define TIMER_COUNT_W_ACTIVE	(1 << 4)	/* not ready for write */ -#define TIMER_MATCH_W_ACTIVE	(1 << 0)	/* not ready for write */ - -#define msecs_to_loops(t) (loops_per_jiffy / 1000 * HZ * t) - -static void __iomem *regbase; - -static cycle_t vt8500_timer_read(struct clocksource *cs) -{ -	int loops = msecs_to_loops(10); -	writel(3, regbase + TIMER_CTRL_VAL); -	while ((readl((regbase + TIMER_AS_VAL)) & TIMER_COUNT_R_ACTIVE) -						&& --loops) -		cpu_relax(); -	return readl(regbase + TIMER_COUNT_VAL); -} - -static struct clocksource clocksource = { -	.name           = "vt8500_timer", -	.rating         = 200, -	.read           = vt8500_timer_read, -	.mask           = CLOCKSOURCE_MASK(32), -	.flags          = CLOCK_SOURCE_IS_CONTINUOUS, -}; - -static int vt8500_timer_set_next_event(unsigned long cycles, -				    struct clock_event_device *evt) -{ -	int loops = msecs_to_loops(10); -	cycle_t alarm = clocksource.read(&clocksource) + cycles; -	while ((readl(regbase + TIMER_AS_VAL) & TIMER_MATCH_W_ACTIVE) -						&& --loops) -		cpu_relax(); -	writel((unsigned long)alarm, regbase + TIMER_MATCH_VAL); - -	if ((signed)(alarm - clocksource.read(&clocksource)) <= 16) -		return -ETIME; - -	writel(1, regbase + TIMER_IER_VAL); - -	return 0; -} - -static void vt8500_timer_set_mode(enum clock_event_mode mode, -			      struct clock_event_device *evt) -{ -	switch (mode) { -	case CLOCK_EVT_MODE_RESUME: -	case CLOCK_EVT_MODE_PERIODIC: -		break; -	case CLOCK_EVT_MODE_ONESHOT: -	case CLOCK_EVT_MODE_UNUSED: -	case CLOCK_EVT_MODE_SHUTDOWN: -		writel(readl(regbase + TIMER_CTRL_VAL) | 1, -			regbase + TIMER_CTRL_VAL); -		writel(0, regbase + TIMER_IER_VAL); -		break; -	} -} - -static struct clock_event_device clockevent = { -	.name           = "vt8500_timer", -	.features       = CLOCK_EVT_FEAT_ONESHOT, -	.rating         = 200, -	.set_next_event = vt8500_timer_set_next_event, -	.set_mode       = vt8500_timer_set_mode, -}; - -static irqreturn_t vt8500_timer_interrupt(int irq, void *dev_id) -{ -	struct clock_event_device *evt = dev_id; -	writel(0xf, regbase + TIMER_STATUS_VAL); -	evt->event_handler(evt); - -	return IRQ_HANDLED; -} - -static struct irqaction irq = { -	.name    = "vt8500_timer", -	.flags   = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL, -	.handler = vt8500_timer_interrupt, -	.dev_id  = &clockevent, -}; - -static struct of_device_id vt8500_timer_ids[] = { -	{ .compatible = "via,vt8500-timer" }, -	{ } -}; - -void __init vt8500_timer_init(void) -{ -	struct device_node *np; -	int timer_irq; - -	np = of_find_matching_node(NULL, vt8500_timer_ids); -	if (!np) { -		pr_err("%s: Timer description missing from Device Tree\n", -								__func__); -		return; -	} -	regbase = of_iomap(np, 0); -	if (!regbase) { -		pr_err("%s: Missing iobase description in Device Tree\n", -								__func__); -		of_node_put(np); -		return; -	} -	timer_irq = irq_of_parse_and_map(np, 0); -	if (!timer_irq) { -		pr_err("%s: Missing irq description in Device Tree\n", -								__func__); -		of_node_put(np); -		return; -	} - -	writel(1, regbase + TIMER_CTRL_VAL); -	writel(0xf, regbase + TIMER_STATUS_VAL); -	writel(~0, regbase + TIMER_MATCH_VAL); - -	if (clocksource_register_hz(&clocksource, VT8500_TIMER_HZ)) -		pr_err("%s: vt8500_timer_init: clocksource_register failed for %s\n", -					__func__, clocksource.name); - -	clockevents_calc_mult_shift(&clockevent, VT8500_TIMER_HZ, 4); - -	/* copy-pasted from mach-msm; no idea */ -	clockevent.max_delta_ns = -		clockevent_delta2ns(0xf0000000, &clockevent); -	clockevent.min_delta_ns = clockevent_delta2ns(4, &clockevent); -	clockevent.cpumask = cpumask_of(0); - -	if (setup_irq(timer_irq, &irq)) -		pr_err("%s: setup_irq failed for %s\n", __func__, -							clockevent.name); -	clockevents_register_device(&clockevent); -} - diff --git a/arch/arm/mach-vt8500/vt8500.c b/arch/arm/mach-vt8500/vt8500.c index d5b9c6689c9..6141868b9a3 100644 --- a/arch/arm/mach-vt8500/vt8500.c +++ b/arch/arm/mach-vt8500/vt8500.c @@ -20,6 +20,7 @@  #include <linux/io.h>  #include <linux/pm.h> +#include <linux/vt8500_timer.h>  #include <asm/mach-types.h>  #include <asm/mach/arch.h> @@ -179,6 +180,8 @@ static const char * const vt8500_dt_compat[] = {  	"via,vt8500",  	"wm,wm8650",  	"wm,wm8505", +	"wm,wm8750", +	"wm,wm8850",  };  DT_MACHINE_START(WMT_DT, "VIA/Wondermedia SoC (Device Tree Support)") diff --git a/arch/arm/mach-w90x900/time.c b/arch/arm/mach-w90x900/time.c index d9c3d6b801c..30fbca84457 100644 --- a/arch/arm/mach-w90x900/time.c +++ b/arch/arm/mach-w90x900/time.c @@ -91,7 +91,6 @@ static int nuc900_clockevent_setnextevent(unsigned long evt,  static struct clock_event_device nuc900_clockevent_device = {  	.name		= "nuc900-timer0", -	.shift		= 32,  	.features	= CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT,  	.set_mode	= nuc900_clockevent_setmode,  	.set_next_event	= nuc900_clockevent_setnextevent, @@ -133,15 +132,10 @@ static void __init nuc900_clockevents_init(void)  	__raw_writel(RESETINT, REG_TISR);  	setup_irq(IRQ_TIMER0, &nuc900_timer0_irq); -	nuc900_clockevent_device.mult = div_sc(rate, NSEC_PER_SEC, -					nuc900_clockevent_device.shift); -	nuc900_clockevent_device.max_delta_ns = clockevent_delta2ns(0xffffffff, -					&nuc900_clockevent_device); -	nuc900_clockevent_device.min_delta_ns = clockevent_delta2ns(0xf, -					&nuc900_clockevent_device);  	nuc900_clockevent_device.cpumask = cpumask_of(0); -	clockevents_register_device(&nuc900_clockevent_device); +	clockevents_config_and_register(&nuc900_clockevent_device, rate, +					0xf, 0xffffffff);  }  static void __init nuc900_clocksource_init(void) diff --git a/arch/arm/mach-zynq/common.c b/arch/arm/mach-zynq/common.c index 2ae4bce652b..6472a69cbfe 100644 --- a/arch/arm/mach-zynq/common.c +++ b/arch/arm/mach-zynq/common.c @@ -31,7 +31,6 @@  #include <asm/mach-types.h>  #include <asm/page.h>  #include <asm/pgtable.h> -#include <asm/hardware/gic.h>  #include <asm/hardware/cache-l2x0.h>  #include "common.h" @@ -55,19 +54,6 @@ static void __init xilinx_init_machine(void)  	of_platform_bus_probe(NULL, zynq_of_bus_ids, NULL);  } -static struct of_device_id irq_match[] __initdata = { -	{ .compatible = "arm,cortex-a9-gic", .data = gic_of_init, }, -	{ } -}; - -/** - * xilinx_irq_init() - Interrupt controller initialization for the GIC. - */ -static void __init xilinx_irq_init(void) -{ -	of_irq_init(irq_match); -} -  #define SCU_PERIPH_PHYS		0xF8F00000  #define SCU_PERIPH_SIZE		SZ_8K  #define SCU_PERIPH_VIRT		(VMALLOC_END - SCU_PERIPH_SIZE) @@ -110,8 +96,7 @@ static const char *xilinx_dt_match[] = {  MACHINE_START(XILINX_EP107, "Xilinx Zynq Platform")  	.map_io		= xilinx_map_io, -	.init_irq	= xilinx_irq_init, -	.handle_irq	= gic_handle_irq, +	.init_irq	= irqchip_init,  	.init_machine	= xilinx_init_machine,  	.init_time	= xilinx_zynq_timer_init,  	.dt_compat	= xilinx_dt_match, diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c index 6b2fb87c869..076c26d4386 100644 --- a/arch/arm/mm/dma-mapping.c +++ b/arch/arm/mm/dma-mapping.c @@ -774,25 +774,27 @@ static void dma_cache_maint_page(struct page *page, unsigned long offset,  	size_t size, enum dma_data_direction dir,  	void (*op)(const void *, size_t, int))  { +	unsigned long pfn; +	size_t left = size; + +	pfn = page_to_pfn(page) + offset / PAGE_SIZE; +	offset %= PAGE_SIZE; +  	/*  	 * A single sg entry may refer to multiple physically contiguous  	 * pages.  But we still need to process highmem pages individually.  	 * If highmem is not configured then the bulk of this loop gets  	 * optimized out.  	 */ -	size_t left = size;  	do {  		size_t len = left;  		void *vaddr; +		page = pfn_to_page(pfn); +  		if (PageHighMem(page)) { -			if (len + offset > PAGE_SIZE) { -				if (offset >= PAGE_SIZE) { -					page += offset / PAGE_SIZE; -					offset %= PAGE_SIZE; -				} +			if (len + offset > PAGE_SIZE)  				len = PAGE_SIZE - offset; -			}  			vaddr = kmap_high_get(page);  			if (vaddr) {  				vaddr += offset; @@ -809,7 +811,7 @@ static void dma_cache_maint_page(struct page *page, unsigned long offset,  			op(vaddr, len, dir);  		}  		offset = 0; -		page++; +		pfn++;  		left -= len;  	} while (left);  } diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c index 9f0610243bd..ce328c7f5c9 100644 --- a/arch/arm/mm/mmu.c +++ b/arch/arm/mm/mmu.c @@ -283,7 +283,7 @@ static struct mem_type mem_types[] = {  	},  	[MT_MEMORY_SO] = {  		.prot_pte  = L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_DIRTY | -				L_PTE_MT_UNCACHED, +				L_PTE_MT_UNCACHED | L_PTE_XN,  		.prot_l1   = PMD_TYPE_TABLE,  		.prot_sect = PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_SECT_S |  				PMD_SECT_UNCACHED | PMD_SECT_XN, diff --git a/arch/arm/plat-iop/time.c b/arch/arm/plat-iop/time.c index cbfbbe46178..837a2d52e9d 100644 --- a/arch/arm/plat-iop/time.c +++ b/arch/arm/plat-iop/time.c @@ -156,14 +156,9 @@ void __init iop_init_time(unsigned long tick_rate)  	write_tmr0(timer_ctl & ~IOP_TMR_EN);  	write_tisr(1);  	setup_irq(IRQ_IOP_TIMER0, &iop_timer_irq); -	clockevents_calc_mult_shift(&iop_clockevent, -				    tick_rate, IOP_MIN_RANGE); -	iop_clockevent.max_delta_ns = -		clockevent_delta2ns(0xfffffffe, &iop_clockevent); -	iop_clockevent.min_delta_ns = -		clockevent_delta2ns(0xf, &iop_clockevent);  	iop_clockevent.cpumask = cpumask_of(0); -	clockevents_register_device(&iop_clockevent); +	clockevents_config_and_register(&iop_clockevent, tick_rate, +					0xf, 0xfffffffe);  	/*  	 * Set up free-running clocksource timer 1. diff --git a/arch/arm/plat-orion/mpp.c b/arch/arm/plat-orion/mpp.c index e686fe76a96..7310bcfb299 100644 --- a/arch/arm/plat-orion/mpp.c +++ b/arch/arm/plat-orion/mpp.c @@ -49,7 +49,7 @@ void __init orion_mpp_conf(unsigned int *mpp_list, unsigned int variant_mask,  					"number (%u)\n", num);  			continue;  		} -		if (variant_mask & !(*mpp_list & variant_mask)) { +		if (variant_mask && !(*mpp_list & variant_mask)) {  			printk(KERN_WARNING  			       "orion_mpp_conf: requested MPP%u config "  			       "unavailable on this hardware\n", num); diff --git a/arch/arm/plat-orion/time.c b/arch/arm/plat-orion/time.c index 0f4fa863dd5..5d5ac0f0542 100644 --- a/arch/arm/plat-orion/time.c +++ b/arch/arm/plat-orion/time.c @@ -156,7 +156,6 @@ orion_clkevt_mode(enum clock_event_mode mode, struct clock_event_device *dev)  static struct clock_event_device orion_clkevt = {  	.name		= "orion_tick",  	.features	= CLOCK_EVT_FEAT_ONESHOT | CLOCK_EVT_FEAT_PERIODIC, -	.shift		= 32,  	.rating		= 300,  	.set_next_event	= orion_clkevt_next_event,  	.set_mode	= orion_clkevt_mode, @@ -221,9 +220,6 @@ orion_time_init(void __iomem *_bridge_base, u32 _bridge_timer1_clr_mask,  	 * Setup clockevent timer (interrupt-driven).  	 */  	setup_irq(irq, &orion_timer_irq); -	orion_clkevt.mult = div_sc(tclk, NSEC_PER_SEC, orion_clkevt.shift); -	orion_clkevt.max_delta_ns = clockevent_delta2ns(0xfffffffe, &orion_clkevt); -	orion_clkevt.min_delta_ns = clockevent_delta2ns(1, &orion_clkevt);  	orion_clkevt.cpumask = cpumask_of(0); -	clockevents_register_device(&orion_clkevt); +	clockevents_config_and_register(&orion_clkevt, tclk, 1, 0xfffffffe);  } diff --git a/arch/arm/plat-samsung/s5p-irq-eint.c b/arch/arm/plat-samsung/s5p-irq-eint.c index 33bd3f3d20f..faa65160278 100644 --- a/arch/arm/plat-samsung/s5p-irq-eint.c +++ b/arch/arm/plat-samsung/s5p-irq-eint.c @@ -15,8 +15,7 @@  #include <linux/io.h>  #include <linux/device.h>  #include <linux/gpio.h> - -#include <asm/hardware/vic.h> +#include <linux/irqchip/arm-vic.h>  #include <plat/regs-irqtype.h> diff --git a/arch/arm/plat-samsung/s5p-irq.c b/arch/arm/plat-samsung/s5p-irq.c index dfb47d638f0..103e371f5e3 100644 --- a/arch/arm/plat-samsung/s5p-irq.c +++ b/arch/arm/plat-samsung/s5p-irq.c @@ -13,8 +13,7 @@  #include <linux/interrupt.h>  #include <linux/irq.h>  #include <linux/io.h> - -#include <asm/hardware/vic.h> +#include <linux/irqchip/arm-vic.h>  #include <mach/map.h>  #include <plat/regs-timer.h> diff --git a/arch/arm/plat-samsung/s5p-time.c b/arch/arm/plat-samsung/s5p-time.c index dabede46c0e..e92510cf82e 100644 --- a/arch/arm/plat-samsung/s5p-time.c +++ b/arch/arm/plat-samsung/s5p-time.c @@ -274,15 +274,8 @@ static void __init s5p_clockevent_init(void)  	clock_rate = clk_get_rate(tin_event);  	clock_count_per_tick = clock_rate / HZ; -	clockevents_calc_mult_shift(&time_event_device, -				    clock_rate, S5PTIMER_MIN_RANGE); -	time_event_device.max_delta_ns = -		clockevent_delta2ns(-1, &time_event_device); -	time_event_device.min_delta_ns = -		clockevent_delta2ns(1, &time_event_device); -  	time_event_device.cpumask = cpumask_of(0); -	clockevents_register_device(&time_event_device); +	clockevents_config_and_register(&time_event_device, clock_rate, 1, -1);  	irq_number = timer_source.event_id + IRQ_TIMER0;  	setup_irq(irq_number, &s5p_clock_event_irq); diff --git a/arch/arm/plat-spear/time.c b/arch/arm/plat-spear/time.c index 03321af5de9..bd5c53cd696 100644 --- a/arch/arm/plat-spear/time.c +++ b/arch/arm/plat-spear/time.c @@ -186,15 +186,9 @@ static void __init spear_clockevent_init(int irq)  	tick_rate = clk_get_rate(gpt_clk);  	tick_rate >>= CTRL_PRESCALER16; -	clockevents_calc_mult_shift(&clkevt, tick_rate, SPEAR_MIN_RANGE); - -	clkevt.max_delta_ns = clockevent_delta2ns(0xfff0, -			&clkevt); -	clkevt.min_delta_ns = clockevent_delta2ns(3, &clkevt); -  	clkevt.cpumask = cpumask_of(0); -	clockevents_register_device(&clkevt); +	clockevents_config_and_register(&clkevt, tick_rate, 3, 0xfff0);  	setup_irq(irq, &spear_timer_irq);  } diff --git a/arch/arm/plat-versatile/headsmp.S b/arch/arm/plat-versatile/headsmp.S index dd703ef09b8..b178d44e9ea 100644 --- a/arch/arm/plat-versatile/headsmp.S +++ b/arch/arm/plat-versatile/headsmp.S @@ -20,7 +20,7 @@   */  ENTRY(versatile_secondary_startup)  	mrc	p15, 0, r0, c0, c0, 5 -	and	r0, r0, #15 +	bic	r0, #0xff000000  	adr	r4, 1f  	ldmia	r4, {r5, r6}  	sub	r4, r4, r5 diff --git a/arch/arm/plat-versatile/platsmp.c b/arch/arm/plat-versatile/platsmp.c index 04ca4937d8c..f2ac1556177 100644 --- a/arch/arm/plat-versatile/platsmp.c +++ b/arch/arm/plat-versatile/platsmp.c @@ -14,10 +14,10 @@  #include <linux/device.h>  #include <linux/jiffies.h>  #include <linux/smp.h> +#include <linux/irqchip/arm-gic.h>  #include <asm/cacheflush.h>  #include <asm/smp_plat.h> -#include <asm/hardware/gic.h>  /*   * Write pen_release in a way that is guaranteed to be visible to all @@ -79,7 +79,7 @@ int __cpuinit versatile_boot_secondary(unsigned int cpu, struct task_struct *idl  	 * the boot monitor to read the system wide flags register,  	 * and branch to the address found there.  	 */ -	gic_raise_softirq(cpumask_of(cpu), 0); +	arch_send_wakeup_ipi_mask(cpumask_of(cpu));  	timeout = jiffies + (1 * HZ);  	while (time_before(jiffies, timeout)) { diff --git a/arch/arm/vfp/entry.S b/arch/arm/vfp/entry.S index cc926c98598..323ce1a62bb 100644 --- a/arch/arm/vfp/entry.S +++ b/arch/arm/vfp/entry.S @@ -22,7 +22,7 @@  @  IRQs disabled.  @  ENTRY(do_vfp) -#ifdef CONFIG_PREEMPT +#ifdef CONFIG_PREEMPT_COUNT  	ldr	r4, [r10, #TI_PREEMPT]	@ get preempt count  	add	r11, r4, #1		@ increment it  	str	r11, [r10, #TI_PREEMPT] @@ -35,7 +35,7 @@ ENTRY(do_vfp)  ENDPROC(do_vfp)  ENTRY(vfp_null_entry) -#ifdef CONFIG_PREEMPT +#ifdef CONFIG_PREEMPT_COUNT  	get_thread_info	r10  	ldr	r4, [r10, #TI_PREEMPT]	@ get preempt count  	sub	r11, r4, #1		@ decrement it @@ -53,7 +53,7 @@ ENDPROC(vfp_null_entry)  	__INIT  ENTRY(vfp_testing_entry) -#ifdef CONFIG_PREEMPT +#ifdef CONFIG_PREEMPT_COUNT  	get_thread_info	r10  	ldr	r4, [r10, #TI_PREEMPT]	@ get preempt count  	sub	r11, r4, #1		@ decrement it diff --git a/arch/arm/vfp/vfphw.S b/arch/arm/vfp/vfphw.S index ea0349f6358..dd5e56f95f3 100644 --- a/arch/arm/vfp/vfphw.S +++ b/arch/arm/vfp/vfphw.S @@ -168,7 +168,7 @@ vfp_hw_state_valid:  					@ else it's one 32-bit instruction, so  					@ always subtract 4 from the following  					@ instruction address. -#ifdef CONFIG_PREEMPT +#ifdef CONFIG_PREEMPT_COUNT  	get_thread_info	r10  	ldr	r4, [r10, #TI_PREEMPT]	@ get preempt count  	sub	r11, r4, #1		@ decrement it @@ -192,7 +192,7 @@ look_for_VFP_exceptions:  	@ not recognised by VFP  	DBGSTR	"not VFP" -#ifdef CONFIG_PREEMPT +#ifdef CONFIG_PREEMPT_COUNT  	get_thread_info	r10  	ldr	r4, [r10, #TI_PREEMPT]	@ get preempt count  	sub	r11, r4, #1		@ decrement it diff --git a/arch/arm64/boot/dts/Makefile b/arch/arm64/boot/dts/Makefile index 801e2d7fcbc..32ac0aef006 100644 --- a/arch/arm64/boot/dts/Makefile +++ b/arch/arm64/boot/dts/Makefile @@ -1,4 +1,5 @@  targets += dtbs +targets += $(dtb-y)  dtbs: $(addprefix $(obj)/, $(dtb-y)) diff --git a/arch/arm64/include/asm/elf.h b/arch/arm64/include/asm/elf.h index 07fea290d7c..fe32c0e4ac0 100644 --- a/arch/arm64/include/asm/elf.h +++ b/arch/arm64/include/asm/elf.h @@ -26,7 +26,10 @@  typedef unsigned long elf_greg_t; -#define ELF_NGREG (sizeof (struct pt_regs) / sizeof(elf_greg_t)) +#define ELF_NGREG (sizeof(struct user_pt_regs) / sizeof(elf_greg_t)) +#define ELF_CORE_COPY_REGS(dest, regs)	\ +	*(struct user_pt_regs *)&(dest) = (regs)->user_regs; +  typedef elf_greg_t elf_gregset_t[ELF_NGREG];  typedef struct user_fpsimd_state elf_fpregset_t; diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h index 64b13394950..e333a243bfc 100644 --- a/arch/arm64/include/asm/pgtable.h +++ b/arch/arm64/include/asm/pgtable.h @@ -24,7 +24,8 @@  /*   * Software defined PTE bits definition.   */ -#define PTE_VALID		(_AT(pteval_t, 1) << 0)	/* pte_present() check */ +#define PTE_VALID		(_AT(pteval_t, 1) << 0) +#define PTE_PROT_NONE		(_AT(pteval_t, 1) << 1)	/* only when !PTE_VALID */  #define PTE_FILE		(_AT(pteval_t, 1) << 2)	/* only when !pte_present() */  #define PTE_DIRTY		(_AT(pteval_t, 1) << 55)  #define PTE_SPECIAL		(_AT(pteval_t, 1) << 56) @@ -60,9 +61,12 @@ extern void __pgd_error(const char *file, int line, unsigned long val);  extern pgprot_t pgprot_default; -#define _MOD_PROT(p, b)	__pgprot(pgprot_val(p) | (b)) +#define __pgprot_modify(prot,mask,bits) \ +	__pgprot((pgprot_val(prot) & ~(mask)) | (bits)) + +#define _MOD_PROT(p, b)		__pgprot_modify(p, 0, b) -#define PAGE_NONE		_MOD_PROT(pgprot_default, PTE_NG | PTE_PXN | PTE_UXN | PTE_RDONLY) +#define PAGE_NONE		__pgprot_modify(pgprot_default, PTE_TYPE_MASK, PTE_PROT_NONE)  #define PAGE_SHARED		_MOD_PROT(pgprot_default, PTE_USER | PTE_NG | PTE_PXN | PTE_UXN)  #define PAGE_SHARED_EXEC	_MOD_PROT(pgprot_default, PTE_USER | PTE_NG | PTE_PXN)  #define PAGE_COPY		_MOD_PROT(pgprot_default, PTE_USER | PTE_NG | PTE_PXN | PTE_UXN | PTE_RDONLY) @@ -72,7 +76,7 @@ extern pgprot_t pgprot_default;  #define PAGE_KERNEL		_MOD_PROT(pgprot_default, PTE_PXN | PTE_UXN | PTE_DIRTY)  #define PAGE_KERNEL_EXEC	_MOD_PROT(pgprot_default, PTE_UXN | PTE_DIRTY) -#define __PAGE_NONE		__pgprot(_PAGE_DEFAULT | PTE_NG | PTE_PXN | PTE_UXN | PTE_RDONLY) +#define __PAGE_NONE		__pgprot(((_PAGE_DEFAULT) & ~PTE_TYPE_MASK) | PTE_PROT_NONE)  #define __PAGE_SHARED		__pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN | PTE_UXN)  #define __PAGE_SHARED_EXEC	__pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN)  #define __PAGE_COPY		__pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN | PTE_UXN | PTE_RDONLY) @@ -125,16 +129,15 @@ extern struct page *empty_zero_page;  /*   * The following only work if pte_present(). Undefined behaviour otherwise.   */ -#define pte_present(pte)	(pte_val(pte) & PTE_VALID) +#define pte_present(pte)	(pte_val(pte) & (PTE_VALID | PTE_PROT_NONE))  #define pte_dirty(pte)		(pte_val(pte) & PTE_DIRTY)  #define pte_young(pte)		(pte_val(pte) & PTE_AF)  #define pte_special(pte)	(pte_val(pte) & PTE_SPECIAL)  #define pte_write(pte)		(!(pte_val(pte) & PTE_RDONLY))  #define pte_exec(pte)		(!(pte_val(pte) & PTE_UXN)) -#define pte_present_exec_user(pte) \ -	((pte_val(pte) & (PTE_VALID | PTE_USER | PTE_UXN)) == \ -	 (PTE_VALID | PTE_USER)) +#define pte_valid_user(pte) \ +	((pte_val(pte) & (PTE_VALID | PTE_USER)) == (PTE_VALID | PTE_USER))  #define PTE_BIT_FUNC(fn,op) \  static inline pte_t pte_##fn(pte_t pte) { pte_val(pte) op; return pte; } @@ -157,10 +160,13 @@ extern void __sync_icache_dcache(pte_t pteval, unsigned long addr);  static inline void set_pte_at(struct mm_struct *mm, unsigned long addr,  			      pte_t *ptep, pte_t pte)  { -	if (pte_present_exec_user(pte)) -		__sync_icache_dcache(pte, addr); -	if (!pte_dirty(pte)) -		pte = pte_wrprotect(pte); +	if (pte_valid_user(pte)) { +		if (pte_exec(pte)) +			__sync_icache_dcache(pte, addr); +		if (!pte_dirty(pte)) +			pte = pte_wrprotect(pte); +	} +  	set_pte(ptep, pte);  } @@ -170,9 +176,6 @@ static inline void set_pte_at(struct mm_struct *mm, unsigned long addr,  #define pte_huge(pte)		((pte_val(pte) & PTE_TYPE_MASK) == PTE_TYPE_HUGEPAGE)  #define pte_mkhuge(pte)		(__pte((pte_val(pte) & ~PTE_TYPE_MASK) | PTE_TYPE_HUGEPAGE)) -#define __pgprot_modify(prot,mask,bits)		\ -	__pgprot((pgprot_val(prot) & ~(mask)) | (bits)) -  #define __HAVE_ARCH_PTE_SPECIAL  /* @@ -264,7 +267,8 @@ static inline pmd_t *pmd_offset(pud_t *pud, unsigned long addr)  static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)  { -	const pteval_t mask = PTE_USER | PTE_PXN | PTE_UXN | PTE_RDONLY; +	const pteval_t mask = PTE_USER | PTE_PXN | PTE_UXN | PTE_RDONLY | +			      PTE_PROT_NONE | PTE_VALID;  	pte_val(pte) = (pte_val(pte) & ~mask) | (pgprot_val(newprot) & mask);  	return pte;  } diff --git a/arch/arm64/include/asm/unistd32.h b/arch/arm64/include/asm/unistd32.h index 58432625fdb..5ef47ba3ed4 100644 --- a/arch/arm64/include/asm/unistd32.h +++ b/arch/arm64/include/asm/unistd32.h @@ -395,8 +395,13 @@ __SYSCALL(370, sys_name_to_handle_at)  __SYSCALL(371, compat_sys_open_by_handle_at)  __SYSCALL(372, compat_sys_clock_adjtime)  __SYSCALL(373, sys_syncfs) +__SYSCALL(374, compat_sys_sendmmsg) +__SYSCALL(375, sys_setns) +__SYSCALL(376, compat_sys_process_vm_readv) +__SYSCALL(377, compat_sys_process_vm_writev) +__SYSCALL(378, sys_ni_syscall)			/* 378 for kcmp */ -#define __NR_compat_syscalls		374 +#define __NR_compat_syscalls		379  /*   * Compat syscall numbers used by the AArch64 kernel. diff --git a/arch/arm64/kernel/vdso.c b/arch/arm64/kernel/vdso.c index c958cb84d75..6a389dc1bd4 100644 --- a/arch/arm64/kernel/vdso.c +++ b/arch/arm64/kernel/vdso.c @@ -252,10 +252,6 @@ void update_vsyscall(struct timekeeper *tk)  void update_vsyscall_tz(void)  { -	++vdso_data->tb_seq_count; -	smp_wmb();  	vdso_data->tz_minuteswest	= sys_tz.tz_minuteswest;  	vdso_data->tz_dsttime		= sys_tz.tz_dsttime; -	smp_wmb(); -	++vdso_data->tb_seq_count;  } diff --git a/arch/arm64/kernel/vdso/gettimeofday.S b/arch/arm64/kernel/vdso/gettimeofday.S index 8bf658d974f..f0a6d10b521 100644 --- a/arch/arm64/kernel/vdso/gettimeofday.S +++ b/arch/arm64/kernel/vdso/gettimeofday.S @@ -73,8 +73,6 @@ ENTRY(__kernel_gettimeofday)  	/* If tz is NULL, return 0. */  	cbz	x1, 3f  	ldp	w4, w5, [vdso_data, #VDSO_TZ_MINWEST] -	seqcnt_read w9 -	seqcnt_check w9, 1b  	stp	w4, w5, [x1, #TZ_MINWEST]  3:  	mov	x0, xzr diff --git a/arch/ia64/kernel/ptrace.c b/arch/ia64/kernel/ptrace.c index 4265ff64219..b7a5fffe092 100644 --- a/arch/ia64/kernel/ptrace.c +++ b/arch/ia64/kernel/ptrace.c @@ -672,33 +672,6 @@ ptrace_attach_sync_user_rbs (struct task_struct *child)  	read_unlock(&tasklist_lock);  } -static inline int -thread_matches (struct task_struct *thread, unsigned long addr) -{ -	unsigned long thread_rbs_end; -	struct pt_regs *thread_regs; - -	if (ptrace_check_attach(thread, 0) < 0) -		/* -		 * If the thread is not in an attachable state, we'll -		 * ignore it.  The net effect is that if ADDR happens -		 * to overlap with the portion of the thread's -		 * register backing store that is currently residing -		 * on the thread's kernel stack, then ptrace() may end -		 * up accessing a stale value.  But if the thread -		 * isn't stopped, that's a problem anyhow, so we're -		 * doing as well as we can... -		 */ -		return 0; - -	thread_regs = task_pt_regs(thread); -	thread_rbs_end = ia64_get_user_rbs_end(thread, thread_regs, NULL); -	if (!on_kernel_rbs(addr, thread_regs->ar_bspstore, thread_rbs_end)) -		return 0; - -	return 1;	/* looks like we've got a winner */ -} -  /*   * Write f32-f127 back to task->thread.fph if it has been modified.   */ diff --git a/arch/m68k/include/asm/dma-mapping.h b/arch/m68k/include/asm/dma-mapping.h index 17f7a45948e..3e6b8445af6 100644 --- a/arch/m68k/include/asm/dma-mapping.h +++ b/arch/m68k/include/asm/dma-mapping.h @@ -21,6 +21,22 @@ extern void *dma_alloc_coherent(struct device *, size_t,  extern void dma_free_coherent(struct device *, size_t,  			      void *, dma_addr_t); +static inline void *dma_alloc_attrs(struct device *dev, size_t size, +				    dma_addr_t *dma_handle, gfp_t flag, +				    struct dma_attrs *attrs) +{ +	/* attrs is not supported and ignored */ +	return dma_alloc_coherent(dev, size, dma_handle, flag); +} + +static inline void dma_free_attrs(struct device *dev, size_t size, +				  void *cpu_addr, dma_addr_t dma_handle, +				  struct dma_attrs *attrs) +{ +	/* attrs is not supported and ignored */ +	dma_free_coherent(dev, size, cpu_addr, dma_handle); +} +  static inline void *dma_alloc_noncoherent(struct device *dev, size_t size,  					  dma_addr_t *handle, gfp_t flag)  { diff --git a/arch/m68k/include/asm/pgtable_no.h b/arch/m68k/include/asm/pgtable_no.h index bf86b29fe64..037028f4ab7 100644 --- a/arch/m68k/include/asm/pgtable_no.h +++ b/arch/m68k/include/asm/pgtable_no.h @@ -64,6 +64,8 @@ extern unsigned int kobjsize(const void *objp);   */  #define	VMALLOC_START	0  #define	VMALLOC_END	0xffffffff +#define	KMAP_START	0 +#define	KMAP_END	0xffffffff  #include <asm-generic/pgtable.h> diff --git a/arch/m68k/include/asm/unistd.h b/arch/m68k/include/asm/unistd.h index 847994ce680..f9337f61466 100644 --- a/arch/m68k/include/asm/unistd.h +++ b/arch/m68k/include/asm/unistd.h @@ -4,7 +4,7 @@  #include <uapi/asm/unistd.h> -#define NR_syscalls		348 +#define NR_syscalls		349  #define __ARCH_WANT_OLD_READDIR  #define __ARCH_WANT_OLD_STAT diff --git a/arch/m68k/include/uapi/asm/unistd.h b/arch/m68k/include/uapi/asm/unistd.h index b94bfbf9070..625f321001d 100644 --- a/arch/m68k/include/uapi/asm/unistd.h +++ b/arch/m68k/include/uapi/asm/unistd.h @@ -353,5 +353,6 @@  #define __NR_process_vm_readv	345  #define __NR_process_vm_writev	346  #define __NR_kcmp		347 +#define __NR_finit_module	348  #endif /* _UAPI_ASM_M68K_UNISTD_H_ */ diff --git a/arch/m68k/kernel/syscalltable.S b/arch/m68k/kernel/syscalltable.S index c30da5b3f2d..3f04ea0ab80 100644 --- a/arch/m68k/kernel/syscalltable.S +++ b/arch/m68k/kernel/syscalltable.S @@ -368,4 +368,5 @@ ENTRY(sys_call_table)  	.long sys_process_vm_readv	/* 345 */  	.long sys_process_vm_writev  	.long sys_kcmp +	.long sys_finit_module diff --git a/arch/m68k/mm/init.c b/arch/m68k/mm/init.c index f0e05bce92f..afd8106fd83 100644 --- a/arch/m68k/mm/init.c +++ b/arch/m68k/mm/init.c @@ -39,6 +39,11 @@  void *empty_zero_page;  EXPORT_SYMBOL(empty_zero_page); +#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE) +extern void init_pointer_table(unsigned long ptable); +extern pmd_t *zero_pgtable; +#endif +  #ifdef CONFIG_MMU  pg_data_t pg_data_map[MAX_NUMNODES]; @@ -69,9 +74,6 @@ void __init m68k_setup_node(int node)  	node_set_online(node);  } -extern void init_pointer_table(unsigned long ptable); -extern pmd_t *zero_pgtable; -  #else /* CONFIG_MMU */  /* diff --git a/arch/mips/bcm47xx/Kconfig b/arch/mips/bcm47xx/Kconfig index d7af29f1fcf..ba611927749 100644 --- a/arch/mips/bcm47xx/Kconfig +++ b/arch/mips/bcm47xx/Kconfig @@ -8,8 +8,10 @@ config BCM47XX_SSB  	select SSB_DRIVER_EXTIF  	select SSB_EMBEDDED  	select SSB_B43_PCI_BRIDGE if PCI +	select SSB_DRIVER_PCICORE if PCI  	select SSB_PCICORE_HOSTMODE if PCI  	select SSB_DRIVER_GPIO +	select GPIOLIB  	default y  	help  	 Add support for old Broadcom BCM47xx boards with Sonics Silicon Backplane support. @@ -25,6 +27,7 @@ config BCM47XX_BCMA  	select BCMA_HOST_PCI if PCI  	select BCMA_DRIVER_PCI_HOSTMODE if PCI  	select BCMA_DRIVER_GPIO +	select GPIOLIB  	default y  	help  	 Add support for new Broadcom BCM47xx boards with Broadcom specific Advanced Microcontroller Bus. diff --git a/arch/mips/cavium-octeon/executive/cvmx-l2c.c b/arch/mips/cavium-octeon/executive/cvmx-l2c.c index 9f883bf7695..33b72144db3 100644 --- a/arch/mips/cavium-octeon/executive/cvmx-l2c.c +++ b/arch/mips/cavium-octeon/executive/cvmx-l2c.c @@ -30,6 +30,7 @@   * measurement, and debugging facilities.   */ +#include <linux/compiler.h>  #include <linux/irqflags.h>  #include <asm/octeon/cvmx.h>  #include <asm/octeon/cvmx-l2c.h> @@ -285,22 +286,22 @@ uint64_t cvmx_l2c_read_perf(uint32_t counter)   */  static void fault_in(uint64_t addr, int len)  { -	volatile char *ptr; -	volatile char dummy; +	char *ptr; +  	/*  	 * Adjust addr and length so we get all cache lines even for  	 * small ranges spanning two cache lines.  	 */  	len += addr & CVMX_CACHE_LINE_MASK;  	addr &= ~CVMX_CACHE_LINE_MASK; -	ptr = (volatile char *)cvmx_phys_to_ptr(addr); +	ptr = cvmx_phys_to_ptr(addr);  	/*  	 * Invalidate L1 cache to make sure all loads result in data  	 * being in L2.  	 */  	CVMX_DCACHE_INVALIDATE;  	while (len > 0) { -		dummy += *ptr; +		ACCESS_ONCE(*ptr);  		len -= CVMX_CACHE_LINE_SIZE;  		ptr += CVMX_CACHE_LINE_SIZE;  	} diff --git a/arch/mips/include/asm/dsp.h b/arch/mips/include/asm/dsp.h index e9bfc0813c7..7bfad0520e2 100644 --- a/arch/mips/include/asm/dsp.h +++ b/arch/mips/include/asm/dsp.h @@ -16,7 +16,7 @@  #include <asm/mipsregs.h>  #define DSP_DEFAULT	0x00000000 -#define DSP_MASK	0x3ff +#define DSP_MASK	0x3f  #define __enable_dsp_hazard()						\  do {									\ diff --git a/arch/mips/include/asm/inst.h b/arch/mips/include/asm/inst.h index ab84064283d..33c34adbecf 100644 --- a/arch/mips/include/asm/inst.h +++ b/arch/mips/include/asm/inst.h @@ -353,6 +353,7 @@ union mips_instruction {  	struct u_format u_format;  	struct c_format c_format;  	struct r_format r_format; +	struct p_format p_format;  	struct f_format f_format;  	struct ma_format ma_format;  	struct b_format b_format; diff --git a/arch/mips/include/asm/mach-pnx833x/war.h b/arch/mips/include/asm/mach-pnx833x/war.h index edaa06d9d49..e410df4e1b3 100644 --- a/arch/mips/include/asm/mach-pnx833x/war.h +++ b/arch/mips/include/asm/mach-pnx833x/war.h @@ -21,4 +21,4 @@  #define R10000_LLSC_WAR			0  #define MIPS34K_MISSED_ITLB_WAR		0 -#endif /* __ASM_MIPS_MACH_PNX8550_WAR_H */ +#endif /* __ASM_MIPS_MACH_PNX833X_WAR_H */ diff --git a/arch/mips/include/asm/pgtable-64.h b/arch/mips/include/asm/pgtable-64.h index c63191055e6..013d5f78126 100644 --- a/arch/mips/include/asm/pgtable-64.h +++ b/arch/mips/include/asm/pgtable-64.h @@ -230,6 +230,7 @@ static inline void pud_clear(pud_t *pudp)  #else  #define pte_pfn(x)		((unsigned long)((x).pte >> _PFN_SHIFT))  #define pfn_pte(pfn, prot)	__pte(((pfn) << _PFN_SHIFT) | pgprot_val(prot)) +#define pfn_pmd(pfn, prot)	__pmd(((pfn) << _PFN_SHIFT) | pgprot_val(prot))  #endif  #define __pgd_offset(address)	pgd_index(address) diff --git a/arch/mips/include/uapi/asm/Kbuild b/arch/mips/include/uapi/asm/Kbuild index a1a0452ac18..77d4fb33f75 100644 --- a/arch/mips/include/uapi/asm/Kbuild +++ b/arch/mips/include/uapi/asm/Kbuild @@ -3,6 +3,7 @@ include include/uapi/asm-generic/Kbuild.asm  header-y += auxvec.h  header-y += bitsperlong.h +header-y += break.h  header-y += byteorder.h  header-y += cachectl.h  header-y += errno.h diff --git a/arch/mips/include/asm/break.h b/arch/mips/include/uapi/asm/break.h index 9161e684cb4..9161e684cb4 100644 --- a/arch/mips/include/asm/break.h +++ b/arch/mips/include/uapi/asm/break.h diff --git a/arch/mips/kernel/ftrace.c b/arch/mips/kernel/ftrace.c index 6a2d758dd8e..83fa1460e29 100644 --- a/arch/mips/kernel/ftrace.c +++ b/arch/mips/kernel/ftrace.c @@ -25,6 +25,12 @@  #define MCOUNT_OFFSET_INSNS 4  #endif +/* Arch override because MIPS doesn't need to run this from stop_machine() */ +void arch_ftrace_update_code(int command) +{ +	ftrace_modify_all_code(command); +} +  /*   * Check if the address is in kernel space   * @@ -89,6 +95,24 @@ static int ftrace_modify_code(unsigned long ip, unsigned int new_code)  	return 0;  } +#ifndef CONFIG_64BIT +static int ftrace_modify_code_2(unsigned long ip, unsigned int new_code1, +				unsigned int new_code2) +{ +	int faulted; + +	safe_store_code(new_code1, ip, faulted); +	if (unlikely(faulted)) +		return -EFAULT; +	ip += 4; +	safe_store_code(new_code2, ip, faulted); +	if (unlikely(faulted)) +		return -EFAULT; +	flush_icache_range(ip, ip + 8); /* original ip + 12 */ +	return 0; +} +#endif +  /*   * The details about the calling site of mcount on MIPS   * @@ -131,8 +155,18 @@ int ftrace_make_nop(struct module *mod,  	 * needed.  	 */  	new = in_kernel_space(ip) ? INSN_NOP : INSN_B_1F; - +#ifdef CONFIG_64BIT  	return ftrace_modify_code(ip, new); +#else +	/* +	 * On 32 bit MIPS platforms, gcc adds a stack adjust +	 * instruction in the delay slot after the branch to +	 * mcount and expects mcount to restore the sp on return. +	 * This is based on a legacy API and does nothing but +	 * waste instructions so it's being removed at runtime. +	 */ +	return ftrace_modify_code_2(ip, new, INSN_NOP); +#endif  }  int ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr) diff --git a/arch/mips/kernel/mcount.S b/arch/mips/kernel/mcount.S index 4c968e7efb7..16586767335 100644 --- a/arch/mips/kernel/mcount.S +++ b/arch/mips/kernel/mcount.S @@ -46,9 +46,8 @@  	PTR_L	a5, PT_R9(sp)  	PTR_L	a6, PT_R10(sp)  	PTR_L	a7, PT_R11(sp) -	PTR_ADDIU	sp, PT_SIZE  #else -	PTR_ADDIU	sp, (PT_SIZE + 8) +	PTR_ADDIU	sp, PT_SIZE  #endif  .endm @@ -69,7 +68,9 @@ NESTED(ftrace_caller, PT_SIZE, ra)  	.globl _mcount  _mcount:  	b	ftrace_stub -	 nop +	addiu sp,sp,8 + +	/* When tracing is activated, it calls ftrace_caller+8 (aka here) */  	lw	t1, function_trace_stop  	bnez	t1, ftrace_stub  	 nop diff --git a/arch/mips/kernel/vpe.c b/arch/mips/kernel/vpe.c index eec690af658..147cec19621 100644 --- a/arch/mips/kernel/vpe.c +++ b/arch/mips/kernel/vpe.c @@ -705,7 +705,7 @@ static int vpe_run(struct vpe * v)  			printk(KERN_WARNING  			       "VPE loader: TC %d is already in use.\n", -                               t->index); +			       v->tc->index);  			return -ENOEXEC;  		}  	} else { diff --git a/arch/mips/lantiq/irq.c b/arch/mips/lantiq/irq.c index f36acd1b380..a7935bf0fec 100644 --- a/arch/mips/lantiq/irq.c +++ b/arch/mips/lantiq/irq.c @@ -408,7 +408,7 @@ int __init icu_of_init(struct device_node *node, struct device_node *parent)  #endif  	/* tell oprofile which irq to use */ -	cp0_perfcount_irq = LTQ_PERF_IRQ; +	cp0_perfcount_irq = irq_create_mapping(ltq_domain, LTQ_PERF_IRQ);  	/*  	 * if the timer irq is not one of the mips irqs we need to diff --git a/arch/mips/lib/delay.c b/arch/mips/lib/delay.c index dc81ca8dc0d..288f7954988 100644 --- a/arch/mips/lib/delay.c +++ b/arch/mips/lib/delay.c @@ -21,7 +21,7 @@ void __delay(unsigned long loops)  	"	.set	noreorder				\n"  	"	.align	3					\n"  	"1:	bnez	%0, 1b					\n" -#if __SIZEOF_LONG__ == 4 +#if BITS_PER_LONG == 32  	"	subu	%0, 1					\n"  #else  	"	dsubu	%0, 1					\n" diff --git a/arch/mips/mm/ioremap.c b/arch/mips/mm/ioremap.c index 7657fd21cd3..cacfd31e8ec 100644 --- a/arch/mips/mm/ioremap.c +++ b/arch/mips/mm/ioremap.c @@ -190,9 +190,3 @@ void __iounmap(const volatile void __iomem *addr)  EXPORT_SYMBOL(__ioremap);  EXPORT_SYMBOL(__iounmap); - -int __virt_addr_valid(const volatile void *kaddr) -{ -	return pfn_valid(PFN_DOWN(virt_to_phys(kaddr))); -} -EXPORT_SYMBOL_GPL(__virt_addr_valid); diff --git a/arch/mips/mm/mmap.c b/arch/mips/mm/mmap.c index d9be7540a6b..7e5fe2790d8 100644 --- a/arch/mips/mm/mmap.c +++ b/arch/mips/mm/mmap.c @@ -192,3 +192,9 @@ unsigned long arch_randomize_brk(struct mm_struct *mm)  	return ret;  } + +int __virt_addr_valid(const volatile void *kaddr) +{ +	return pfn_valid(PFN_DOWN(virt_to_phys(kaddr))); +} +EXPORT_SYMBOL_GPL(__virt_addr_valid); diff --git a/arch/mips/netlogic/xlr/setup.c b/arch/mips/netlogic/xlr/setup.c index 4e7f49d3d5a..c5ce6992ac4 100644 --- a/arch/mips/netlogic/xlr/setup.c +++ b/arch/mips/netlogic/xlr/setup.c @@ -193,8 +193,11 @@ static void nlm_init_node(void)  void __init prom_init(void)  { -	int i, *argv, *envp;		/* passed as 32 bit ptrs */ +	int *argv, *envp;		/* passed as 32 bit ptrs */  	struct psb_info *prom_infop; +#ifdef CONFIG_SMP +	int i; +#endif  	/* truncate to 32 bit and sign extend all args */  	argv = (int *)(long)(int)fw_arg1; diff --git a/arch/mips/pci/pci-ar71xx.c b/arch/mips/pci/pci-ar71xx.c index 1552522b871..6eaa4f2d0e3 100644 --- a/arch/mips/pci/pci-ar71xx.c +++ b/arch/mips/pci/pci-ar71xx.c @@ -24,7 +24,7 @@  #include <asm/mach-ath79/pci.h>  #define AR71XX_PCI_MEM_BASE	0x10000000 -#define AR71XX_PCI_MEM_SIZE	0x08000000 +#define AR71XX_PCI_MEM_SIZE	0x07000000  #define AR71XX_PCI_WIN0_OFFS		0x10000000  #define AR71XX_PCI_WIN1_OFFS		0x11000000 diff --git a/arch/mips/pci/pci-ar724x.c b/arch/mips/pci/pci-ar724x.c index 86d77a66645..c11c75be2d7 100644 --- a/arch/mips/pci/pci-ar724x.c +++ b/arch/mips/pci/pci-ar724x.c @@ -21,7 +21,7 @@  #define AR724X_PCI_CTRL_SIZE	0x100  #define AR724X_PCI_MEM_BASE	0x10000000 -#define AR724X_PCI_MEM_SIZE	0x08000000 +#define AR724X_PCI_MEM_SIZE	0x04000000  #define AR724X_PCI_REG_RESET		0x18  #define AR724X_PCI_REG_INT_STATUS	0x4c diff --git a/arch/mn10300/Kconfig b/arch/mn10300/Kconfig index aa03f2e1338..e70001cfa05 100644 --- a/arch/mn10300/Kconfig +++ b/arch/mn10300/Kconfig @@ -6,6 +6,7 @@ config MN10300  	select ARCH_WANT_IPC_PARSE_VERSION  	select HAVE_ARCH_TRACEHOOK  	select HAVE_ARCH_KGDB +	select GENERIC_ATOMIC64  	select HAVE_NMI_WATCHDOG if MN10300_WD_TIMER  	select GENERIC_CLOCKEVENTS  	select MODULES_USE_ELF_RELA diff --git a/arch/parisc/kernel/entry.S b/arch/parisc/kernel/entry.S index bfb44247d7a..eb7850b46c2 100644 --- a/arch/parisc/kernel/entry.S +++ b/arch/parisc/kernel/entry.S @@ -1865,7 +1865,7 @@ syscall_restore:  	/* Are we being ptraced? */  	ldw	TASK_FLAGS(%r1),%r19 -	ldi	(_TIF_SINGLESTEP|_TIF_BLOCKSTEP),%r2 +	ldi	_TIF_SYSCALL_TRACE_MASK,%r2  	and,COND(=)	%r19,%r2,%r0  	b,n	syscall_restore_rfi @@ -1978,15 +1978,23 @@ syscall_restore_rfi:  	/* sr2 should be set to zero for userspace syscalls */  	STREG	%r0,TASK_PT_SR2(%r1) -pt_regs_ok:  	LDREG	TASK_PT_GR31(%r1),%r2 -	depi	3,31,2,%r2			   /* ensure return to user mode. */ -	STREG	%r2,TASK_PT_IAOQ0(%r1) +	depi	3,31,2,%r2		   /* ensure return to user mode. */ +	STREG   %r2,TASK_PT_IAOQ0(%r1)  	ldo	4(%r2),%r2  	STREG	%r2,TASK_PT_IAOQ1(%r1) +	b	intr_restore  	copy	%r25,%r16 + +pt_regs_ok: +	LDREG	TASK_PT_IAOQ0(%r1),%r2 +	depi	3,31,2,%r2		   /* ensure return to user mode. */ +	STREG	%r2,TASK_PT_IAOQ0(%r1) +	LDREG	TASK_PT_IAOQ1(%r1),%r2 +	depi	3,31,2,%r2 +	STREG	%r2,TASK_PT_IAOQ1(%r1)  	b	intr_restore -	nop +	copy	%r25,%r16  	.import schedule,code  syscall_do_resched: diff --git a/arch/parisc/kernel/irq.c b/arch/parisc/kernel/irq.c index c0b1affc06a..0299d63cd11 100644 --- a/arch/parisc/kernel/irq.c +++ b/arch/parisc/kernel/irq.c @@ -410,11 +410,13 @@ void __init init_IRQ(void)  {  	local_irq_disable();	/* PARANOID - should already be disabled */  	mtctl(~0UL, 23);	/* EIRR : clear all pending external intr */ -	claim_cpu_irqs();  #ifdef CONFIG_SMP -	if (!cpu_eiem) +	if (!cpu_eiem) { +		claim_cpu_irqs();  		cpu_eiem = EIEM_MASK(IPI_IRQ) | EIEM_MASK(TIMER_IRQ); +	}  #else +	claim_cpu_irqs();  	cpu_eiem = EIEM_MASK(TIMER_IRQ);  #endif          set_eiem(cpu_eiem);	/* EIEM : enable all external intr */ diff --git a/arch/parisc/kernel/ptrace.c b/arch/parisc/kernel/ptrace.c index 857c2f54547..534abd4936e 100644 --- a/arch/parisc/kernel/ptrace.c +++ b/arch/parisc/kernel/ptrace.c @@ -26,7 +26,7 @@  #include <asm/asm-offsets.h>  /* PSW bits we allow the debugger to modify */ -#define USER_PSW_BITS	(PSW_N | PSW_V | PSW_CB) +#define USER_PSW_BITS	(PSW_N | PSW_B | PSW_V | PSW_CB)  /*   * Called by kernel/ptrace.c when detaching.. diff --git a/arch/parisc/kernel/signal.c b/arch/parisc/kernel/signal.c index 53799695599..fd051705a40 100644 --- a/arch/parisc/kernel/signal.c +++ b/arch/parisc/kernel/signal.c @@ -190,8 +190,10 @@ get_sigframe(struct k_sigaction *ka, unsigned long sp, size_t frame_size)  	DBG(1,"get_sigframe: ka = %#lx, sp = %#lx, frame_size = %#lx\n",  			(unsigned long)ka, sp, frame_size); +	/* Align alternate stack and reserve 64 bytes for the signal +	   handler's frame marker.  */  	if ((ka->sa.sa_flags & SA_ONSTACK) != 0 && ! sas_ss_flags(sp)) -		sp = current->sas_ss_sp; /* Stacks grow up! */ +		sp = (current->sas_ss_sp + 0x7f) & ~0x3f; /* Stacks grow up! */  	DBG(1,"get_sigframe: Returning sp = %#lx\n", (unsigned long)sp);  	return (void __user *) sp; /* Stacks grow up.  Fun. */ diff --git a/arch/parisc/math-emu/cnv_float.h b/arch/parisc/math-emu/cnv_float.h index 9071e093164..933423fa514 100644 --- a/arch/parisc/math-emu/cnv_float.h +++ b/arch/parisc/math-emu/cnv_float.h @@ -347,16 +347,15 @@      Sgl_isinexact_to_fix(sgl_value,exponent)  #define Duint_from_sgl_mantissa(sgl_value,exponent,dresultA,dresultB)	\ -  {Sall(sgl_value) <<= SGL_EXP_LENGTH;  /*  left-justify  */		\ +  {unsigned int val = Sall(sgl_value) << SGL_EXP_LENGTH;		\      if (exponent <= 31) {						\ -    	Dintp1(dresultA) = 0;						\ -    	Dintp2(dresultB) = (unsigned)Sall(sgl_value) >> (31 - exponent); \ +	Dintp1(dresultA) = 0;						\ +	Dintp2(dresultB) = val >> (31 - exponent);			\      }									\      else {								\ -    	Dintp1(dresultA) = Sall(sgl_value) >> (63 - exponent);		\ -    	Dintp2(dresultB) = Sall(sgl_value) << (exponent - 31);		\ +	Dintp1(dresultA) = val >> (63 - exponent);			\ +	Dintp2(dresultB) = exponent <= 62 ? val << (exponent - 31) : 0;	\      }									\ -    Sall(sgl_value) >>= SGL_EXP_LENGTH;  /* return to original */	\    }  #define Duint_setzero(dresultA,dresultB) 	\ diff --git a/arch/powerpc/include/uapi/asm/kvm_para.h b/arch/powerpc/include/uapi/asm/kvm_para.h index ed0e0254b47..e3af3286a06 100644 --- a/arch/powerpc/include/uapi/asm/kvm_para.h +++ b/arch/powerpc/include/uapi/asm/kvm_para.h @@ -78,7 +78,7 @@ struct kvm_vcpu_arch_shared {  #define KVM_HCALL_TOKEN(num)     _EV_HCALL_TOKEN(EV_KVM_VENDOR_ID, num) -#include <uapi/asm/epapr_hcalls.h> +#include <asm/epapr_hcalls.h>  #define KVM_FEATURE_MAGIC_PAGE	1 diff --git a/arch/powerpc/kernel/entry_32.S b/arch/powerpc/kernel/entry_32.S index d22e73e4618..e514de57a12 100644 --- a/arch/powerpc/kernel/entry_32.S +++ b/arch/powerpc/kernel/entry_32.S @@ -439,6 +439,8 @@ ret_from_fork:  ret_from_kernel_thread:  	REST_NVGPRS(r1)  	bl	schedule_tail +	li	r3,0 +	stw	r3,0(r1)  	mtlr	r14  	mr	r3,r15  	PPC440EP_ERR42 diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S index b310a057362..3d990d3bd8b 100644 --- a/arch/powerpc/kernel/entry_64.S +++ b/arch/powerpc/kernel/entry_64.S @@ -664,6 +664,19 @@ resume_kernel:  	ld	r4,TI_FLAGS(r9)  	andi.	r0,r4,_TIF_NEED_RESCHED  	bne	1b + +	/* +	 * arch_local_irq_restore() from preempt_schedule_irq above may +	 * enable hard interrupt but we really should disable interrupts +	 * when we return from the interrupt, and so that we don't get +	 * interrupted after loading SRR0/1. +	 */ +#ifdef CONFIG_PPC_BOOK3E +	wrteei	0 +#else +	ld	r10,PACAKMSR(r13) /* Get kernel MSR without EE */ +	mtmsrd	r10,1		  /* Update machine state */ +#endif /* CONFIG_PPC_BOOK3E */  #endif /* CONFIG_PREEMPT */  	.globl	fast_exc_return_irq diff --git a/arch/powerpc/kernel/kgdb.c b/arch/powerpc/kernel/kgdb.c index c470a40b29f..a7bc7521c06 100644 --- a/arch/powerpc/kernel/kgdb.c +++ b/arch/powerpc/kernel/kgdb.c @@ -154,12 +154,12 @@ static int kgdb_handle_breakpoint(struct pt_regs *regs)  static int kgdb_singlestep(struct pt_regs *regs)  {  	struct thread_info *thread_info, *exception_thread_info; -	struct thread_info *backup_current_thread_info = \ -		(struct thread_info *)kmalloc(sizeof(struct thread_info), GFP_KERNEL); +	struct thread_info *backup_current_thread_info;  	if (user_mode(regs))  		return 0; +	backup_current_thread_info = (struct thread_info *)kmalloc(sizeof(struct thread_info), GFP_KERNEL);  	/*  	 * On Book E and perhaps other processors, singlestep is handled on  	 * the critical exception stack.  This causes current_thread_info() @@ -185,6 +185,7 @@ static int kgdb_singlestep(struct pt_regs *regs)  		/* Restore current_thread_info lastly. */  		memcpy(exception_thread_info, backup_current_thread_info, sizeof *thread_info); +	kfree(backup_current_thread_info);  	return 1;  } diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c index 6f6b1cccc91..127361e093f 100644 --- a/arch/powerpc/kernel/time.c +++ b/arch/powerpc/kernel/time.c @@ -494,10 +494,15 @@ void timer_interrupt(struct pt_regs * regs)  	set_dec(DECREMENTER_MAX);  	/* Some implementations of hotplug will get timer interrupts while -	 * offline, just ignore these +	 * offline, just ignore these and we also need to set +	 * decrementers_next_tb as MAX to make sure __check_irq_replay +	 * don't replay timer interrupt when return, otherwise we'll trap +	 * here infinitely :(  	 */ -	if (!cpu_online(smp_processor_id())) +	if (!cpu_online(smp_processor_id())) { +		*next_tb = ~(u64)0;  		return; +	}  	/* Conditionally hard-enable interrupts now that the DEC has been  	 * bumped to its maximum value diff --git a/arch/powerpc/kvm/book3s_hv_ras.c b/arch/powerpc/kvm/book3s_hv_ras.c index 35f3cf0269b..a353c485808 100644 --- a/arch/powerpc/kvm/book3s_hv_ras.c +++ b/arch/powerpc/kvm/book3s_hv_ras.c @@ -79,7 +79,9 @@ static void flush_tlb_power7(struct kvm_vcpu *vcpu)  static long kvmppc_realmode_mc_power7(struct kvm_vcpu *vcpu)  {  	unsigned long srr1 = vcpu->arch.shregs.msr; +#ifdef CONFIG_PPC_POWERNV  	struct opal_machine_check_event *opal_evt; +#endif  	long handled = 1;  	if (srr1 & SRR1_MC_LDSTERR) { @@ -117,6 +119,7 @@ static long kvmppc_realmode_mc_power7(struct kvm_vcpu *vcpu)  		handled = 0;  	} +#ifdef CONFIG_PPC_POWERNV  	/*  	 * See if OPAL has already handled the condition.  	 * We assume that if the condition is recovered then OPAL @@ -131,6 +134,7 @@ static long kvmppc_realmode_mc_power7(struct kvm_vcpu *vcpu)  	if (handled)  		opal_evt->in_use = 0; +#endif  	return handled;  } diff --git a/arch/powerpc/kvm/emulate.c b/arch/powerpc/kvm/emulate.c index b0855e5d890..9d9cddc5b34 100644 --- a/arch/powerpc/kvm/emulate.c +++ b/arch/powerpc/kvm/emulate.c @@ -39,6 +39,7 @@  #define OP_31_XOP_TRAP      4  #define OP_31_XOP_LWZX      23  #define OP_31_XOP_TRAP_64   68 +#define OP_31_XOP_DCBF      86  #define OP_31_XOP_LBZX      87  #define OP_31_XOP_STWX      151  #define OP_31_XOP_STBX      215 @@ -374,6 +375,7 @@ int kvmppc_emulate_instruction(struct kvm_run *run, struct kvm_vcpu *vcpu)  			emulated = kvmppc_emulate_mtspr(vcpu, sprn, rs);  			break; +		case OP_31_XOP_DCBF:  		case OP_31_XOP_DCBI:  			/* Do nothing. The guest is performing dcbi because  			 * hardware DMA is not snooped by the dcache, but diff --git a/arch/powerpc/oprofile/op_model_power4.c b/arch/powerpc/oprofile/op_model_power4.c index 315f9495e9b..f444b94935f 100644 --- a/arch/powerpc/oprofile/op_model_power4.c +++ b/arch/powerpc/oprofile/op_model_power4.c @@ -52,7 +52,7 @@ static int power7_marked_instr_event(u64 mmcr1)  	for (pmc = 0; pmc < 4; pmc++) {  		psel = mmcr1 & (OPROFILE_PM_PMCSEL_MSK  				<< (OPROFILE_MAX_PMC_NUM - pmc) -				* OPROFILE_MAX_PMC_NUM); +				* OPROFILE_PMSEL_FIELD_WIDTH);  		psel = (psel >> ((OPROFILE_MAX_PMC_NUM - pmc)  				 * OPROFILE_PMSEL_FIELD_WIDTH)) & ~1ULL;  		unit = mmcr1 & (OPROFILE_PM_UNIT_MSK diff --git a/arch/powerpc/platforms/pasemi/cpufreq.c b/arch/powerpc/platforms/pasemi/cpufreq.c index 95d00173029..890f30e70f9 100644 --- a/arch/powerpc/platforms/pasemi/cpufreq.c +++ b/arch/powerpc/platforms/pasemi/cpufreq.c @@ -236,6 +236,13 @@ out:  static int pas_cpufreq_cpu_exit(struct cpufreq_policy *policy)  { +	/* +	 * We don't support CPU hotplug. Don't unmap after the system +	 * has already made it to a running state. +	 */ +	if (system_state != SYSTEM_BOOTING) +		return 0; +  	if (sdcasr_mapbase)  		iounmap(sdcasr_mapbase);  	if (sdcpwr_mapbase) diff --git a/arch/s390/Makefile b/arch/s390/Makefile index 4b8e08b56f4..7e3ce78d429 100644 --- a/arch/s390/Makefile +++ b/arch/s390/Makefile @@ -24,8 +24,8 @@ CHECKFLAGS	+= -D__s390__ -msize-long  else  LD_BFD		:= elf64-s390  LDFLAGS		:= -m elf64_s390 -KBUILD_AFLAGS_MODULE += -fpic -D__PIC__ -KBUILD_CFLAGS_MODULE += -fpic -D__PIC__ +KBUILD_AFLAGS_MODULE += -fPIC +KBUILD_CFLAGS_MODULE += -fPIC  KBUILD_CFLAGS	+= -m64  KBUILD_AFLAGS	+= -m64  UTS_MACHINE	:= s390x diff --git a/arch/s390/include/asm/dma.h b/arch/s390/include/asm/dma.h index de015d85e3e..bb9bdcd2086 100644 --- a/arch/s390/include/asm/dma.h +++ b/arch/s390/include/asm/dma.h @@ -10,4 +10,10 @@   */  #define MAX_DMA_ADDRESS         0x80000000 +#ifdef CONFIG_PCI +extern int isa_dma_bridge_buggy; +#else +#define isa_dma_bridge_buggy	(0) +#endif +  #endif /* _ASM_S390_DMA_H */ diff --git a/arch/s390/include/asm/io.h b/arch/s390/include/asm/io.h index 16c3eb164f4..27cb32185ce 100644 --- a/arch/s390/include/asm/io.h +++ b/arch/s390/include/asm/io.h @@ -85,6 +85,11 @@ static inline void iounmap(volatile void __iomem *addr)  #define __raw_writel	zpci_write_u32  #define __raw_writeq	zpci_write_u64 +#define readb_relaxed	readb +#define readw_relaxed	readw +#define readl_relaxed	readl +#define readq_relaxed	readq +  #endif /* CONFIG_PCI */  #include <asm-generic/io.h> diff --git a/arch/s390/include/asm/irq.h b/arch/s390/include/asm/irq.h index e6972f85d2b..7def77302d6 100644 --- a/arch/s390/include/asm/irq.h +++ b/arch/s390/include/asm/irq.h @@ -2,43 +2,61 @@  #define _ASM_IRQ_H  #include <linux/hardirq.h> +#include <linux/percpu.h> +#include <linux/cache.h>  #include <linux/types.h> -enum interruption_class { +enum interruption_main_class {  	EXTERNAL_INTERRUPT,  	IO_INTERRUPT, -	EXTINT_CLK, -	EXTINT_EXC, -	EXTINT_EMS, -	EXTINT_TMR, -	EXTINT_TLA, -	EXTINT_PFL, -	EXTINT_DSD, -	EXTINT_VRT, -	EXTINT_SCP, -	EXTINT_IUC, -	EXTINT_CMS, -	EXTINT_CMC, -	EXTINT_CMR, -	IOINT_CIO, -	IOINT_QAI, -	IOINT_DAS, -	IOINT_C15, -	IOINT_C70, -	IOINT_TAP, -	IOINT_VMR, -	IOINT_LCS, -	IOINT_CLW, -	IOINT_CTC, -	IOINT_APB, -	IOINT_ADM, -	IOINT_CSC, -	IOINT_PCI, -	IOINT_MSI, +	NR_IRQS +}; + +enum interruption_class { +	IRQEXT_CLK, +	IRQEXT_EXC, +	IRQEXT_EMS, +	IRQEXT_TMR, +	IRQEXT_TLA, +	IRQEXT_PFL, +	IRQEXT_DSD, +	IRQEXT_VRT, +	IRQEXT_SCP, +	IRQEXT_IUC, +	IRQEXT_CMS, +	IRQEXT_CMC, +	IRQEXT_CMR, +	IRQIO_CIO, +	IRQIO_QAI, +	IRQIO_DAS, +	IRQIO_C15, +	IRQIO_C70, +	IRQIO_TAP, +	IRQIO_VMR, +	IRQIO_LCS, +	IRQIO_CLW, +	IRQIO_CTC, +	IRQIO_APB, +	IRQIO_ADM, +	IRQIO_CSC, +	IRQIO_PCI, +	IRQIO_MSI,  	NMI_NMI, -	NR_IRQS, +	CPU_RST, +	NR_ARCH_IRQS  }; +struct irq_stat { +	unsigned int irqs[NR_ARCH_IRQS]; +}; + +DECLARE_PER_CPU_SHARED_ALIGNED(struct irq_stat, irq_stat); + +static __always_inline void inc_irq_stat(enum interruption_class irq) +{ +	__get_cpu_var(irq_stat).irqs[irq]++; +} +  struct ext_code {  	unsigned short subcode;  	unsigned short code; diff --git a/arch/s390/include/asm/pgtable.h b/arch/s390/include/asm/pgtable.h index c928dc1938f..098adbb6266 100644 --- a/arch/s390/include/asm/pgtable.h +++ b/arch/s390/include/asm/pgtable.h @@ -1365,6 +1365,18 @@ static inline void pmdp_invalidate(struct vm_area_struct *vma,  	__pmd_idte(address, pmdp);  } +#define __HAVE_ARCH_PMDP_SET_WRPROTECT +static inline void pmdp_set_wrprotect(struct mm_struct *mm, +				      unsigned long address, pmd_t *pmdp) +{ +	pmd_t pmd = *pmdp; + +	if (pmd_write(pmd)) { +		__pmd_idte(address, pmdp); +		set_pmd_at(mm, address, pmdp, pmd_wrprotect(pmd)); +	} +} +  static inline pmd_t mk_pmd_phys(unsigned long physpage, pgprot_t pgprot)  {  	pmd_t __pmd; @@ -1387,10 +1399,7 @@ static inline int has_transparent_hugepage(void)  static inline unsigned long pmd_pfn(pmd_t pmd)  { -	if (pmd_trans_huge(pmd)) -		return pmd_val(pmd) >> HPAGE_SHIFT; -	else -		return pmd_val(pmd) >> PAGE_SHIFT; +	return pmd_val(pmd) >> PAGE_SHIFT;  }  #endif /* CONFIG_TRANSPARENT_HUGEPAGE */ diff --git a/arch/s390/include/asm/timex.h b/arch/s390/include/asm/timex.h index fba4d66788a..4c060bb5b8e 100644 --- a/arch/s390/include/asm/timex.h +++ b/arch/s390/include/asm/timex.h @@ -128,4 +128,32 @@ static inline unsigned long long get_clock_monotonic(void)  	return get_clock_xt() - sched_clock_base_cc;  } +/** + * tod_to_ns - convert a TOD format value to nanoseconds + * @todval: to be converted TOD format value + * Returns: number of nanoseconds that correspond to the TOD format value + * + * Converting a 64 Bit TOD format value to nanoseconds means that the value + * must be divided by 4.096. In order to achieve that we multiply with 125 + * and divide by 512: + * + *    ns = (todval * 125) >> 9; + * + * In order to avoid an overflow with the multiplication we can rewrite this. + * With a split todval == 2^32 * th + tl (th upper 32 bits, tl lower 32 bits) + * we end up with + * + *    ns = ((2^32 * th + tl) * 125 ) >> 9; + * -> ns = (2^23 * th * 125) + ((tl * 125) >> 9); + * + */ +static inline unsigned long long tod_to_ns(unsigned long long todval) +{ +	unsigned long long ns; + +	ns = ((todval >> 32) << 23) * 125; +	ns += ((todval & 0xffffffff) * 125) >> 9; +	return ns; +} +  #endif diff --git a/arch/s390/include/uapi/asm/unistd.h b/arch/s390/include/uapi/asm/unistd.h index 63e6078699f..864f693c237 100644 --- a/arch/s390/include/uapi/asm/unistd.h +++ b/arch/s390/include/uapi/asm/unistd.h @@ -279,7 +279,8 @@  #define __NR_process_vm_writev	341  #define __NR_s390_runtime_instr 342  #define __NR_kcmp		343 -#define NR_syscalls 344 +#define __NR_finit_module	344 +#define NR_syscalls 345  /*    * There are some system calls that are not present on 64 bit, some diff --git a/arch/s390/kernel/compat_wrapper.S b/arch/s390/kernel/compat_wrapper.S index 827e094a2f4..9b9a805656b 100644 --- a/arch/s390/kernel/compat_wrapper.S +++ b/arch/s390/kernel/compat_wrapper.S @@ -1659,3 +1659,9 @@ ENTRY(sys_kcmp_wrapper)  	llgfr	%r5,%r5			# unsigned long  	llgfr	%r6,%r6			# unsigned long  	jg	sys_kcmp + +ENTRY(sys_finit_module_wrapper) +	lgfr	%r2,%r2			# int +	llgtr	%r3,%r3			# const char __user * +	lgfr	%r4,%r4			# int +	jg	sys_finit_module diff --git a/arch/s390/kernel/debug.c b/arch/s390/kernel/debug.c index ba500d8dc39..4e8215e0d4b 100644 --- a/arch/s390/kernel/debug.c +++ b/arch/s390/kernel/debug.c @@ -1127,13 +1127,14 @@ debug_register_view(debug_info_t * id, struct debug_view *view)  	if (i == DEBUG_MAX_VIEWS) {  		pr_err("Registering view %s/%s would exceed the maximum "  		       "number of views %i\n", id->name, view->name, i); -		debugfs_remove(pde);  		rc = -1;  	} else {  		id->views[i] = view;  		id->debugfs_entries[i] = pde;  	}  	spin_unlock_irqrestore(&id->lock, flags); +	if (rc) +		debugfs_remove(pde);  out:  	return rc;  } @@ -1146,9 +1147,9 @@ EXPORT_SYMBOL(debug_register_view);  int  debug_unregister_view(debug_info_t * id, struct debug_view *view)  { -	int rc = 0; -	int i; +	struct dentry *dentry = NULL;  	unsigned long flags; +	int i, rc = 0;  	if (!id)  		goto out; @@ -1160,10 +1161,12 @@ debug_unregister_view(debug_info_t * id, struct debug_view *view)  	if (i == DEBUG_MAX_VIEWS)  		rc = -1;  	else { -		debugfs_remove(id->debugfs_entries[i]); +		dentry = id->debugfs_entries[i];  		id->views[i] = NULL; +		id->debugfs_entries[i] = NULL;  	}  	spin_unlock_irqrestore(&id->lock, flags); +	debugfs_remove(dentry);  out:  	return rc;  } diff --git a/arch/s390/kernel/irq.c b/arch/s390/kernel/irq.c index bf24293970c..9df824ea166 100644 --- a/arch/s390/kernel/irq.c +++ b/arch/s390/kernel/irq.c @@ -24,43 +24,65 @@  #include <asm/irq.h>  #include "entry.h" +DEFINE_PER_CPU_SHARED_ALIGNED(struct irq_stat, irq_stat); +EXPORT_PER_CPU_SYMBOL_GPL(irq_stat); +  struct irq_class {  	char *name;  	char *desc;  }; -static const struct irq_class intrclass_names[] = { +/* + * The list of "main" irq classes on s390. This is the list of interrrupts + * that appear both in /proc/stat ("intr" line) and /proc/interrupts. + * Historically only external and I/O interrupts have been part of /proc/stat. + * We can't add the split external and I/O sub classes since the first field + * in the "intr" line in /proc/stat is supposed to be the sum of all other + * fields. + * Since the external and I/O interrupt fields are already sums we would end + * up with having a sum which accounts each interrupt twice. + */ +static const struct irq_class irqclass_main_desc[NR_IRQS] = {  	[EXTERNAL_INTERRUPT] = {.name = "EXT"}, -	[IO_INTERRUPT]	     = {.name = "I/O"}, -	[EXTINT_CLK] = {.name = "CLK", .desc = "[EXT] Clock Comparator"}, -	[EXTINT_EXC] = {.name = "EXC", .desc = "[EXT] External Call"}, -	[EXTINT_EMS] = {.name = "EMS", .desc = "[EXT] Emergency Signal"}, -	[EXTINT_TMR] = {.name = "TMR", .desc = "[EXT] CPU Timer"}, -	[EXTINT_TLA] = {.name = "TAL", .desc = "[EXT] Timing Alert"}, -	[EXTINT_PFL] = {.name = "PFL", .desc = "[EXT] Pseudo Page Fault"}, -	[EXTINT_DSD] = {.name = "DSD", .desc = "[EXT] DASD Diag"}, -	[EXTINT_VRT] = {.name = "VRT", .desc = "[EXT] Virtio"}, -	[EXTINT_SCP] = {.name = "SCP", .desc = "[EXT] Service Call"}, -	[EXTINT_IUC] = {.name = "IUC", .desc = "[EXT] IUCV"}, -	[EXTINT_CMS] = {.name = "CMS", .desc = "[EXT] CPU-Measurement: Sampling"}, -	[EXTINT_CMC] = {.name = "CMC", .desc = "[EXT] CPU-Measurement: Counter"}, -	[EXTINT_CMR] = {.name = "CMR", .desc = "[EXT] CPU-Measurement: RI"}, -	[IOINT_CIO]  = {.name = "CIO", .desc = "[I/O] Common I/O Layer Interrupt"}, -	[IOINT_QAI]  = {.name = "QAI", .desc = "[I/O] QDIO Adapter Interrupt"}, -	[IOINT_DAS]  = {.name = "DAS", .desc = "[I/O] DASD"}, -	[IOINT_C15]  = {.name = "C15", .desc = "[I/O] 3215"}, -	[IOINT_C70]  = {.name = "C70", .desc = "[I/O] 3270"}, -	[IOINT_TAP]  = {.name = "TAP", .desc = "[I/O] Tape"}, -	[IOINT_VMR]  = {.name = "VMR", .desc = "[I/O] Unit Record Devices"}, -	[IOINT_LCS]  = {.name = "LCS", .desc = "[I/O] LCS"}, -	[IOINT_CLW]  = {.name = "CLW", .desc = "[I/O] CLAW"}, -	[IOINT_CTC]  = {.name = "CTC", .desc = "[I/O] CTC"}, -	[IOINT_APB]  = {.name = "APB", .desc = "[I/O] AP Bus"}, -	[IOINT_ADM]  = {.name = "ADM", .desc = "[I/O] EADM Subchannel"}, -	[IOINT_CSC]  = {.name = "CSC", .desc = "[I/O] CHSC Subchannel"}, -	[IOINT_PCI]  = {.name = "PCI", .desc = "[I/O] PCI Interrupt" }, -	[IOINT_MSI] =  {.name = "MSI", .desc = "[I/O] MSI Interrupt" }, +	[IO_INTERRUPT]	     = {.name = "I/O"} +}; + +/* + * The list of split external and I/O interrupts that appear only in + * /proc/interrupts. + * In addition this list contains non external / I/O events like NMIs. + */ +static const struct irq_class irqclass_sub_desc[NR_ARCH_IRQS] = { +	[IRQEXT_CLK] = {.name = "CLK", .desc = "[EXT] Clock Comparator"}, +	[IRQEXT_EXC] = {.name = "EXC", .desc = "[EXT] External Call"}, +	[IRQEXT_EMS] = {.name = "EMS", .desc = "[EXT] Emergency Signal"}, +	[IRQEXT_TMR] = {.name = "TMR", .desc = "[EXT] CPU Timer"}, +	[IRQEXT_TLA] = {.name = "TAL", .desc = "[EXT] Timing Alert"}, +	[IRQEXT_PFL] = {.name = "PFL", .desc = "[EXT] Pseudo Page Fault"}, +	[IRQEXT_DSD] = {.name = "DSD", .desc = "[EXT] DASD Diag"}, +	[IRQEXT_VRT] = {.name = "VRT", .desc = "[EXT] Virtio"}, +	[IRQEXT_SCP] = {.name = "SCP", .desc = "[EXT] Service Call"}, +	[IRQEXT_IUC] = {.name = "IUC", .desc = "[EXT] IUCV"}, +	[IRQEXT_CMS] = {.name = "CMS", .desc = "[EXT] CPU-Measurement: Sampling"}, +	[IRQEXT_CMC] = {.name = "CMC", .desc = "[EXT] CPU-Measurement: Counter"}, +	[IRQEXT_CMR] = {.name = "CMR", .desc = "[EXT] CPU-Measurement: RI"}, +	[IRQIO_CIO]  = {.name = "CIO", .desc = "[I/O] Common I/O Layer Interrupt"}, +	[IRQIO_QAI]  = {.name = "QAI", .desc = "[I/O] QDIO Adapter Interrupt"}, +	[IRQIO_DAS]  = {.name = "DAS", .desc = "[I/O] DASD"}, +	[IRQIO_C15]  = {.name = "C15", .desc = "[I/O] 3215"}, +	[IRQIO_C70]  = {.name = "C70", .desc = "[I/O] 3270"}, +	[IRQIO_TAP]  = {.name = "TAP", .desc = "[I/O] Tape"}, +	[IRQIO_VMR]  = {.name = "VMR", .desc = "[I/O] Unit Record Devices"}, +	[IRQIO_LCS]  = {.name = "LCS", .desc = "[I/O] LCS"}, +	[IRQIO_CLW]  = {.name = "CLW", .desc = "[I/O] CLAW"}, +	[IRQIO_CTC]  = {.name = "CTC", .desc = "[I/O] CTC"}, +	[IRQIO_APB]  = {.name = "APB", .desc = "[I/O] AP Bus"}, +	[IRQIO_ADM]  = {.name = "ADM", .desc = "[I/O] EADM Subchannel"}, +	[IRQIO_CSC]  = {.name = "CSC", .desc = "[I/O] CHSC Subchannel"}, +	[IRQIO_PCI]  = {.name = "PCI", .desc = "[I/O] PCI Interrupt" }, +	[IRQIO_MSI]  = {.name = "MSI", .desc = "[I/O] MSI Interrupt" },  	[NMI_NMI]    = {.name = "NMI", .desc = "[NMI] Machine Check"}, +	[CPU_RST]    = {.name = "RST", .desc = "[CPU] CPU Restart"},  };  /* @@ -68,30 +90,34 @@ static const struct irq_class intrclass_names[] = {   */  int show_interrupts(struct seq_file *p, void *v)  { -	int i = *(loff_t *) v, j; +	int irq = *(loff_t *) v; +	int cpu;  	get_online_cpus(); -	if (i == 0) { +	if (irq == 0) {  		seq_puts(p, "           "); -		for_each_online_cpu(j) -			seq_printf(p, "CPU%d       ",j); +		for_each_online_cpu(cpu) +			seq_printf(p, "CPU%d       ", cpu);  		seq_putc(p, '\n');  	} - -	if (i < NR_IRQS) { -		seq_printf(p, "%s: ", intrclass_names[i].name); -#ifndef CONFIG_SMP -		seq_printf(p, "%10u ", kstat_irqs(i)); -#else -		for_each_online_cpu(j) -			seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]); -#endif -		if (intrclass_names[i].desc) -			seq_printf(p, "  %s", intrclass_names[i].desc); -                seq_putc(p, '\n'); -        } +	if (irq < NR_IRQS) { +		seq_printf(p, "%s: ", irqclass_main_desc[irq].name); +		for_each_online_cpu(cpu) +			seq_printf(p, "%10u ", kstat_cpu(cpu).irqs[irq]); +		seq_putc(p, '\n'); +		goto skip_arch_irqs; +	} +	for (irq = 0; irq < NR_ARCH_IRQS; irq++) { +		seq_printf(p, "%s: ", irqclass_sub_desc[irq].name); +		for_each_online_cpu(cpu) +			seq_printf(p, "%10u ", per_cpu(irq_stat, cpu).irqs[irq]); +		if (irqclass_sub_desc[irq].desc) +			seq_printf(p, "  %s", irqclass_sub_desc[irq].desc); +		seq_putc(p, '\n'); +	} +skip_arch_irqs:  	put_online_cpus(); -        return 0; +	return 0;  }  /* @@ -222,7 +248,7 @@ void __irq_entry do_extint(struct pt_regs *regs, struct ext_code ext_code,  		/* Serve timer interrupts first. */  		clock_comparator_work();  	} -	kstat_cpu(smp_processor_id()).irqs[EXTERNAL_INTERRUPT]++; +	kstat_incr_irqs_this_cpu(EXTERNAL_INTERRUPT, NULL);  	if (ext_code.code != 0x1004)  		__get_cpu_var(s390_idle).nohz_delay = 1; diff --git a/arch/s390/kernel/nmi.c b/arch/s390/kernel/nmi.c index a6daa5c5cdb..7918fbea36b 100644 --- a/arch/s390/kernel/nmi.c +++ b/arch/s390/kernel/nmi.c @@ -254,7 +254,7 @@ void notrace s390_do_machine_check(struct pt_regs *regs)  	int umode;  	nmi_enter(); -	kstat_cpu(smp_processor_id()).irqs[NMI_NMI]++; +	inc_irq_stat(NMI_NMI);  	mci = (struct mci *) &S390_lowcore.mcck_interruption_code;  	mcck = &__get_cpu_var(cpu_mcck);  	umode = user_mode(regs); diff --git a/arch/s390/kernel/perf_cpum_cf.c b/arch/s390/kernel/perf_cpum_cf.c index c4e7269d4a0..86ec7447e1f 100644 --- a/arch/s390/kernel/perf_cpum_cf.c +++ b/arch/s390/kernel/perf_cpum_cf.c @@ -229,7 +229,7 @@ static void cpumf_measurement_alert(struct ext_code ext_code,  	if (!(alert & CPU_MF_INT_CF_MASK))  		return; -	kstat_cpu(smp_processor_id()).irqs[EXTINT_CMC]++; +	inc_irq_stat(IRQEXT_CMC);  	cpuhw = &__get_cpu_var(cpu_hw_events);  	/* Measurement alerts are shared and might happen when the PMU diff --git a/arch/s390/kernel/runtime_instr.c b/arch/s390/kernel/runtime_instr.c index 61066f6f71a..077a99389b0 100644 --- a/arch/s390/kernel/runtime_instr.c +++ b/arch/s390/kernel/runtime_instr.c @@ -71,7 +71,7 @@ static void runtime_instr_int_handler(struct ext_code ext_code,  	if (!(param32 & CPU_MF_INT_RI_MASK))  		return; -	kstat_cpu(smp_processor_id()).irqs[EXTINT_CMR]++; +	inc_irq_stat(IRQEXT_CMR);  	if (!current->thread.ri_cb)  		return; diff --git a/arch/s390/kernel/setup.c b/arch/s390/kernel/setup.c index 2568590973a..a5360de85ec 100644 --- a/arch/s390/kernel/setup.c +++ b/arch/s390/kernel/setup.c @@ -16,7 +16,7 @@  #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt  #include <linux/errno.h> -#include <linux/module.h> +#include <linux/export.h>  #include <linux/sched.h>  #include <linux/kernel.h>  #include <linux/memblock.h> @@ -289,6 +289,7 @@ void machine_power_off(void)   * Dummy power off function.   */  void (*pm_power_off)(void) = machine_power_off; +EXPORT_SYMBOL_GPL(pm_power_off);  static int __init early_parse_mem(char *p)  { diff --git a/arch/s390/kernel/smp.c b/arch/s390/kernel/smp.c index 0b45baa5543..7433a2f9e5c 100644 --- a/arch/s390/kernel/smp.c +++ b/arch/s390/kernel/smp.c @@ -433,9 +433,9 @@ static void do_ext_call_interrupt(struct ext_code ext_code,  	cpu = smp_processor_id();  	if (ext_code.code == 0x1202) -		kstat_cpu(cpu).irqs[EXTINT_EXC]++; +		inc_irq_stat(IRQEXT_EXC);  	else -		kstat_cpu(cpu).irqs[EXTINT_EMS]++; +		inc_irq_stat(IRQEXT_EMS);  	/*  	 * handle bit signal external calls  	 */ @@ -623,9 +623,10 @@ static struct sclp_cpu_info *smp_get_cpu_info(void)  	return info;  } -static int smp_add_present_cpu(int cpu); +static int __cpuinit smp_add_present_cpu(int cpu); -static int __smp_rescan_cpus(struct sclp_cpu_info *info, int sysfs_add) +static int __cpuinit __smp_rescan_cpus(struct sclp_cpu_info *info, +				       int sysfs_add)  {  	struct pcpu *pcpu;  	cpumask_t avail; @@ -708,6 +709,7 @@ static void __cpuinit smp_start_secondary(void *cpuvoid)  	pfault_init();  	notify_cpu_starting(smp_processor_id());  	set_cpu_online(smp_processor_id(), true); +	inc_irq_stat(CPU_RST);  	local_irq_enable();  	/* cpu_idle will call schedule for us */  	cpu_idle(); @@ -985,7 +987,7 @@ static int __cpuinit smp_cpu_notify(struct notifier_block *self,  	return notifier_from_errno(err);  } -static int smp_add_present_cpu(int cpu) +static int __cpuinit smp_add_present_cpu(int cpu)  {  	struct cpu *c = &pcpu_devices[cpu].cpu;  	struct device *s = &c->dev; diff --git a/arch/s390/kernel/syscalls.S b/arch/s390/kernel/syscalls.S index 48174850f3b..6a6c61f94dd 100644 --- a/arch/s390/kernel/syscalls.S +++ b/arch/s390/kernel/syscalls.S @@ -352,3 +352,4 @@ SYSCALL(sys_process_vm_readv,sys_process_vm_readv,compat_sys_process_vm_readv_wr  SYSCALL(sys_process_vm_writev,sys_process_vm_writev,compat_sys_process_vm_writev_wrapper)  SYSCALL(sys_ni_syscall,sys_s390_runtime_instr,sys_s390_runtime_instr_wrapper)  SYSCALL(sys_kcmp,sys_kcmp,sys_kcmp_wrapper) +SYSCALL(sys_finit_module,sys_finit_module,sys_finit_module_wrapper) diff --git a/arch/s390/kernel/time.c b/arch/s390/kernel/time.c index 7fcd690d42c..a5f4f5a1d24 100644 --- a/arch/s390/kernel/time.c +++ b/arch/s390/kernel/time.c @@ -63,7 +63,7 @@ static DEFINE_PER_CPU(struct clock_event_device, comparators);   */  unsigned long long notrace __kprobes sched_clock(void)  { -	return (get_clock_monotonic() * 125) >> 9; +	return tod_to_ns(get_clock_monotonic());  }  /* @@ -168,7 +168,7 @@ static void clock_comparator_interrupt(struct ext_code ext_code,  				       unsigned int param32,  				       unsigned long param64)  { -	kstat_cpu(smp_processor_id()).irqs[EXTINT_CLK]++; +	inc_irq_stat(IRQEXT_CLK);  	if (S390_lowcore.clock_comparator == -1ULL)  		set_clock_comparator(S390_lowcore.clock_comparator);  } @@ -179,7 +179,7 @@ static void stp_timing_alert(struct stp_irq_parm *);  static void timing_alert_interrupt(struct ext_code ext_code,  				   unsigned int param32, unsigned long param64)  { -	kstat_cpu(smp_processor_id()).irqs[EXTINT_TLA]++; +	inc_irq_stat(IRQEXT_TLA);  	if (param32 & 0x00c40000)  		etr_timing_alert((struct etr_irq_parm *) ¶m32);  	if (param32 & 0x00038000) diff --git a/arch/s390/kernel/topology.c b/arch/s390/kernel/topology.c index f1aba87cceb..4b2e3e31700 100644 --- a/arch/s390/kernel/topology.c +++ b/arch/s390/kernel/topology.c @@ -10,6 +10,7 @@  #include <linux/bootmem.h>  #include <linux/cpuset.h>  #include <linux/device.h> +#include <linux/export.h>  #include <linux/kernel.h>  #include <linux/sched.h>  #include <linux/init.h> @@ -42,6 +43,7 @@ static struct mask_info socket_info;  static struct mask_info book_info;  struct cpu_topology_s390 cpu_topology[NR_CPUS]; +EXPORT_SYMBOL_GPL(cpu_topology);  static cpumask_t cpu_group_map(struct mask_info *info, unsigned int cpu)  { diff --git a/arch/s390/kvm/interrupt.c b/arch/s390/kvm/interrupt.c index c30615e605a..82c481ddef7 100644 --- a/arch/s390/kvm/interrupt.c +++ b/arch/s390/kvm/interrupt.c @@ -408,7 +408,7 @@ int kvm_s390_handle_wait(struct kvm_vcpu *vcpu)  		return 0;  	} -	sltime = ((vcpu->arch.sie_block->ckc - now)*125)>>9; +	sltime = tod_to_ns(vcpu->arch.sie_block->ckc - now);  	hrtimer_start(&vcpu->arch.ckc_timer, ktime_set (0, sltime) , HRTIMER_MODE_REL);  	VCPU_EVENT(vcpu, 5, "enabled wait via clock comparator: %llx ns", sltime); diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c index c9011bfaabb..f090e819bf7 100644 --- a/arch/s390/kvm/kvm-s390.c +++ b/arch/s390/kvm/kvm-s390.c @@ -613,7 +613,9 @@ static int __vcpu_run(struct kvm_vcpu *vcpu)  		kvm_s390_deliver_pending_interrupts(vcpu);  	vcpu->arch.sie_block->icptcode = 0; +	preempt_disable();  	kvm_guest_enter(); +	preempt_enable();  	VCPU_EVENT(vcpu, 6, "entering sie flags %x",  		   atomic_read(&vcpu->arch.sie_block->cpuflags));  	trace_kvm_s390_sie_enter(vcpu, diff --git a/arch/s390/mm/fault.c b/arch/s390/mm/fault.c index 42601d6e166..2fb9e63b8fc 100644 --- a/arch/s390/mm/fault.c +++ b/arch/s390/mm/fault.c @@ -569,7 +569,7 @@ static void pfault_interrupt(struct ext_code ext_code,  	subcode = ext_code.subcode;  	if ((subcode & 0xff00) != __SUBCODE_MASK)  		return; -	kstat_cpu(smp_processor_id()).irqs[EXTINT_PFL]++; +	inc_irq_stat(IRQEXT_PFL);  	/* Get the token (= pid of the affected task). */  	pid = sizeof(void *) == 4 ? param32 : param64;  	rcu_read_lock(); diff --git a/arch/s390/oprofile/hwsampler.c b/arch/s390/oprofile/hwsampler.c index 0cb385da202..b5b2916895e 100644 --- a/arch/s390/oprofile/hwsampler.c +++ b/arch/s390/oprofile/hwsampler.c @@ -233,7 +233,7 @@ static void hws_ext_handler(struct ext_code ext_code,  	if (!(param32 & CPU_MF_INT_SF_MASK))  		return; -	kstat_cpu(smp_processor_id()).irqs[EXTINT_CMS]++; +	inc_irq_stat(IRQEXT_CMS);  	atomic_xchg(&cb->ext_params, atomic_read(&cb->ext_params) | param32);  	if (hws_wq) diff --git a/arch/s390/pci/pci.c b/arch/s390/pci/pci.c index ff49427e994..60e0372545d 100644 --- a/arch/s390/pci/pci.c +++ b/arch/s390/pci/pci.c @@ -160,35 +160,6 @@ int pci_proc_domain(struct pci_bus *bus)  }  EXPORT_SYMBOL_GPL(pci_proc_domain); -/* Store PCI function information block */ -static int zpci_store_fib(struct zpci_dev *zdev, u8 *fc) -{ -	struct zpci_fib *fib; -	u8 status, cc; - -	fib = (void *) get_zeroed_page(GFP_KERNEL); -	if (!fib) -		return -ENOMEM; - -	do { -		cc = __stpcifc(zdev->fh, 0, fib, &status); -		if (cc == 2) { -			msleep(ZPCI_INSN_BUSY_DELAY); -			memset(fib, 0, PAGE_SIZE); -		} -	} while (cc == 2); - -	if (cc) -		pr_err_once("%s: cc: %u  status: %u\n", -			    __func__, cc, status); - -	/* Return PCI function controls */ -	*fc = fib->fc; - -	free_page((unsigned long) fib); -	return (cc) ? -EIO : 0; -} -  /* Modify PCI: Register adapter interruptions */  static int zpci_register_airq(struct zpci_dev *zdev, unsigned int aisb,  			      u64 aibv) @@ -469,7 +440,7 @@ static void zpci_irq_handler(void *dont, void *need)  	int rescan = 0, max = aisb_max;  	struct zdev_irq_map *imap; -	kstat_cpu(smp_processor_id()).irqs[IOINT_PCI]++; +	inc_irq_stat(IRQIO_PCI);  	sbit = start;  scan: @@ -481,7 +452,7 @@ scan:  		/* find vector bit */  		imap = bucket->imap[sbit];  		for_each_set_bit_left(mbit, &imap->aibv, imap->msi_vecs) { -			kstat_cpu(smp_processor_id()).irqs[IOINT_MSI]++; +			inc_irq_stat(IRQIO_MSI);  			clear_bit(63 - mbit, &imap->aibv);  			spin_lock(&imap->lock); diff --git a/arch/s390/pci/pci_dma.c b/arch/s390/pci/pci_dma.c index 6138468b420..a547419907c 100644 --- a/arch/s390/pci/pci_dma.c +++ b/arch/s390/pci/pci_dma.c @@ -13,8 +13,6 @@  #include <linux/pci.h>  #include <asm/pci_dma.h> -static enum zpci_ioat_dtype zpci_ioat_dt = ZPCI_IOTA_RTTO; -  static struct kmem_cache *dma_region_table_cache;  static struct kmem_cache *dma_page_table_cache; diff --git a/arch/sh/boards/mach-ecovec24/setup.c b/arch/sh/boards/mach-ecovec24/setup.c index 3fede4556c9..a0fa5791cd4 100644 --- a/arch/sh/boards/mach-ecovec24/setup.c +++ b/arch/sh/boards/mach-ecovec24/setup.c @@ -70,6 +70,16 @@   *                                  OFF-ON : MMC   */ +/* + * FSI - DA7210 + * + * it needs amixer settings for playing + * + * amixer set 'HeadPhone' 80 + * amixer set 'Out Mixer Left DAC Left' on + * amixer set 'Out Mixer Right DAC Right' on + */ +  /* Heartbeat */  static unsigned char led_pos[] = { 0, 1, 2, 3 }; diff --git a/arch/sh/include/asm/elf.h b/arch/sh/include/asm/elf.h index 37924afa8d8..bf9f44f17c2 100644 --- a/arch/sh/include/asm/elf.h +++ b/arch/sh/include/asm/elf.h @@ -203,9 +203,9 @@ extern void __kernel_vsyscall;  	if (vdso_enabled)					\  		NEW_AUX_ENT(AT_SYSINFO_EHDR, VDSO_BASE);	\  	else							\ -		NEW_AUX_ENT(AT_IGNORE, 0); +		NEW_AUX_ENT(AT_IGNORE, 0)  #else -#define VSYSCALL_AUX_ENT +#define VSYSCALL_AUX_ENT	NEW_AUX_ENT(AT_IGNORE, 0)  #endif /* CONFIG_VSYSCALL */  #ifdef CONFIG_SH_FPU diff --git a/arch/sh/include/asm/processor_32.h b/arch/sh/include/asm/processor_32.h index b1320d55ca3..e699a12cdcc 100644 --- a/arch/sh/include/asm/processor_32.h +++ b/arch/sh/include/asm/processor_32.h @@ -39,7 +39,7 @@  /* This decides where the kernel will search for a free chunk of vm   * space during mmap's.   */ -#define TASK_UNMAPPED_BASE	(TASK_SIZE / 3) +#define TASK_UNMAPPED_BASE	PAGE_ALIGN(TASK_SIZE / 3)  /*   * Bit of SR register diff --git a/arch/sh/include/asm/processor_64.h b/arch/sh/include/asm/processor_64.h index 1ee8946f095..1cc7d319714 100644 --- a/arch/sh/include/asm/processor_64.h +++ b/arch/sh/include/asm/processor_64.h @@ -47,7 +47,7 @@ pc; })  /* This decides where the kernel will search for a free chunk of vm   * space during mmap's.   */ -#define TASK_UNMAPPED_BASE	(TASK_SIZE / 3) +#define TASK_UNMAPPED_BASE	PAGE_ALIGN(TASK_SIZE / 3)  /*   * Bit of SR register diff --git a/arch/sh/include/uapi/asm/unistd_32.h b/arch/sh/include/uapi/asm/unistd_32.h index 9e465f246dc..d13a1d62373 100644 --- a/arch/sh/include/uapi/asm/unistd_32.h +++ b/arch/sh/include/uapi/asm/unistd_32.h @@ -379,7 +379,8 @@  #define __NR_process_vm_readv	365  #define __NR_process_vm_writev	366  #define __NR_kcmp		367 +#define __NR_finit_module	368 -#define NR_syscalls 368 +#define NR_syscalls 369  #endif /* __ASM_SH_UNISTD_32_H */ diff --git a/arch/sh/include/uapi/asm/unistd_64.h b/arch/sh/include/uapi/asm/unistd_64.h index 8e3a2edd284..e6820c86e8c 100644 --- a/arch/sh/include/uapi/asm/unistd_64.h +++ b/arch/sh/include/uapi/asm/unistd_64.h @@ -399,7 +399,8 @@  #define __NR_process_vm_readv	376  #define __NR_process_vm_writev	377  #define __NR_kcmp		378 +#define __NR_finit_module	379 -#define NR_syscalls 379 +#define NR_syscalls 380  #endif /* __ASM_SH_UNISTD_64_H */ diff --git a/arch/sh/kernel/syscalls_32.S b/arch/sh/kernel/syscalls_32.S index fe97ae5e56f..734234be2f0 100644 --- a/arch/sh/kernel/syscalls_32.S +++ b/arch/sh/kernel/syscalls_32.S @@ -385,3 +385,4 @@ ENTRY(sys_call_table)  	.long sys_process_vm_readv	/* 365 */  	.long sys_process_vm_writev  	.long sys_kcmp +	.long sys_finit_module diff --git a/arch/sh/kernel/syscalls_64.S b/arch/sh/kernel/syscalls_64.S index 5c7b1c67bdc..579fcb9a896 100644 --- a/arch/sh/kernel/syscalls_64.S +++ b/arch/sh/kernel/syscalls_64.S @@ -405,3 +405,4 @@ sys_call_table:  	.long sys_process_vm_readv  	.long sys_process_vm_writev  	.long sys_kcmp +	.long sys_finit_module diff --git a/arch/sh/lib/mcount.S b/arch/sh/lib/mcount.S index 60164e65d66..52aa2011d75 100644 --- a/arch/sh/lib/mcount.S +++ b/arch/sh/lib/mcount.S @@ -294,6 +294,8 @@ stack_panic:  	.align 2  .L_init_thread_union:  	.long	init_thread_union +.L_ebss: +	.long	__bss_stop  .Lpanic:  	.long	panic  .Lpanic_s: diff --git a/arch/sparc/include/uapi/asm/unistd.h b/arch/sparc/include/uapi/asm/unistd.h index cac719d1bc5..62ced589bcf 100644 --- a/arch/sparc/include/uapi/asm/unistd.h +++ b/arch/sparc/include/uapi/asm/unistd.h @@ -407,8 +407,9 @@  #define __NR_process_vm_writev	339  #define __NR_kern_features	340  #define __NR_kcmp		341 +#define __NR_finit_module	342 -#define NR_syscalls		342 +#define NR_syscalls		343  /* Bitmask values returned from kern_features system call.  */  #define KERN_FEATURE_MIXED_MODE_STACK	0x00000001 diff --git a/arch/sparc/kernel/pci.c b/arch/sparc/kernel/pci.c index 04bacce76fe..baf4366e2d6 100644 --- a/arch/sparc/kernel/pci.c +++ b/arch/sparc/kernel/pci.c @@ -378,7 +378,8 @@ static void apb_calc_first_last(u8 map, u32 *first_p, u32 *last_p)  /* Cook up fake bus resources for SUNW,simba PCI bridges which lack   * a proper 'ranges' property.   */ -static void apb_fake_ranges(struct pci_dev *dev, struct pci_bus *bus, +static void apb_fake_ranges(struct pci_dev *dev, +			    struct pci_bus *bus,  			    struct pci_pbm_info *pbm)  {  	struct pci_bus_region region; @@ -403,13 +404,15 @@ static void apb_fake_ranges(struct pci_dev *dev, struct pci_bus *bus,  	pcibios_bus_to_resource(dev, res, ®ion);  } -static void pci_of_scan_bus(struct pci_pbm_info *pbm, struct device_node *node, +static void pci_of_scan_bus(struct pci_pbm_info *pbm, +			    struct device_node *node,  			    struct pci_bus *bus);  #define GET_64BIT(prop, i)	((((u64) (prop)[(i)]) << 32) | (prop)[(i)+1])  static void of_scan_pci_bridge(struct pci_pbm_info *pbm, -			       struct device_node *node, struct pci_dev *dev) +			       struct device_node *node, +			       struct pci_dev *dev)  {  	struct pci_bus *bus;  	const u32 *busrange, *ranges; @@ -500,7 +503,8 @@ after_ranges:  	pci_of_scan_bus(pbm, node, bus);  } -static void pci_of_scan_bus(struct pci_pbm_info *pbm, struct device_node *node, +static void pci_of_scan_bus(struct pci_pbm_info *pbm, +			    struct device_node *node,  			    struct pci_bus *bus)  {  	struct device_node *child; diff --git a/arch/sparc/kernel/pci_psycho.c b/arch/sparc/kernel/pci_psycho.c index b8523828971..c647634ead2 100644 --- a/arch/sparc/kernel/pci_psycho.c +++ b/arch/sparc/kernel/pci_psycho.c @@ -366,7 +366,8 @@ static void pbm_config_busmastering(struct pci_pbm_info *pbm)  	pci_config_write8(addr, 64);  } -static void psycho_scan_bus(struct pci_pbm_info *pbm, struct device *parent) +static void psycho_scan_bus(struct pci_pbm_info *pbm, +			    struct device *parent)  {  	pbm_config_busmastering(pbm);  	pbm->is_66mhz_capable = 0; diff --git a/arch/sparc/kernel/pci_sabre.c b/arch/sparc/kernel/pci_sabre.c index 531186d7c9a..6f00d27e8da 100644 --- a/arch/sparc/kernel/pci_sabre.c +++ b/arch/sparc/kernel/pci_sabre.c @@ -442,7 +442,8 @@ static void sabre_scan_bus(struct pci_pbm_info *pbm, struct device *parent)  	sabre_register_error_handlers(pbm);  } -static void sabre_pbm_init(struct pci_pbm_info *pbm, struct platform_device *op) +static void sabre_pbm_init(struct pci_pbm_info *pbm, +			   struct platform_device *op)  {  	psycho_pbm_init_common(pbm, op, "SABRE", PBM_CHIP_TYPE_SABRE);  	pbm->pci_afsr = pbm->controller_regs + SABRE_PIOAFSR; diff --git a/arch/sparc/kernel/pci_schizo.c b/arch/sparc/kernel/pci_schizo.c index 29e888158ae..8f76f23dac3 100644 --- a/arch/sparc/kernel/pci_schizo.c +++ b/arch/sparc/kernel/pci_schizo.c @@ -1306,8 +1306,9 @@ static void schizo_pbm_hw_init(struct pci_pbm_info *pbm)  	}  } -static int schizo_pbm_init(struct pci_pbm_info *pbm, struct platform_device *op, -			   u32 portid, int chip_type) +static int schizo_pbm_init(struct pci_pbm_info *pbm, +			   struct platform_device *op, u32 portid, +			   int chip_type)  {  	const struct linux_prom64_registers *regs;  	struct device_node *dp = op->dev.of_node; diff --git a/arch/sparc/kernel/systbls_32.S b/arch/sparc/kernel/systbls_32.S index 5147f574f12..6ac43c36bbb 100644 --- a/arch/sparc/kernel/systbls_32.S +++ b/arch/sparc/kernel/systbls_32.S @@ -85,4 +85,4 @@ sys_call_table:  /*325*/	.long sys_pwritev, sys_rt_tgsigqueueinfo, sys_perf_event_open, sys_recvmmsg, sys_fanotify_init  /*330*/	.long sys_fanotify_mark, sys_prlimit64, sys_name_to_handle_at, sys_open_by_handle_at, sys_clock_adjtime  /*335*/	.long sys_syncfs, sys_sendmmsg, sys_setns, sys_process_vm_readv, sys_process_vm_writev -/*340*/	.long sys_ni_syscall, sys_kcmp +/*340*/	.long sys_ni_syscall, sys_kcmp, sys_finit_module diff --git a/arch/sparc/kernel/systbls_64.S b/arch/sparc/kernel/systbls_64.S index cdbd9b81775..1009ecb9267 100644 --- a/arch/sparc/kernel/systbls_64.S +++ b/arch/sparc/kernel/systbls_64.S @@ -86,7 +86,7 @@ sys_call_table32:  	.word compat_sys_pwritev, compat_sys_rt_tgsigqueueinfo, sys_perf_event_open, compat_sys_recvmmsg, sys_fanotify_init  /*330*/	.word sys32_fanotify_mark, sys_prlimit64, sys_name_to_handle_at, compat_sys_open_by_handle_at, compat_sys_clock_adjtime  	.word sys_syncfs, compat_sys_sendmmsg, sys_setns, compat_sys_process_vm_readv, compat_sys_process_vm_writev -/*340*/	.word sys_kern_features, sys_kcmp +/*340*/	.word sys_kern_features, sys_kcmp, sys_finit_module  #endif /* CONFIG_COMPAT */ @@ -164,4 +164,4 @@ sys_call_table:  	.word sys_pwritev, sys_rt_tgsigqueueinfo, sys_perf_event_open, sys_recvmmsg, sys_fanotify_init  /*330*/	.word sys_fanotify_mark, sys_prlimit64, sys_name_to_handle_at, sys_open_by_handle_at, sys_clock_adjtime  	.word sys_syncfs, sys_sendmmsg, sys_setns, sys_process_vm_readv, sys_process_vm_writev -/*340*/	.word sys_kern_features, sys_kcmp +/*340*/	.word sys_kern_features, sys_kcmp, sys_finit_module diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 79795af5981..225543bf45a 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -2138,6 +2138,7 @@ config OLPC_XO1_RTC  config OLPC_XO1_SCI  	bool "OLPC XO-1 SCI extras"  	depends on OLPC && OLPC_XO1_PM +	depends on INPUT=y  	select POWER_SUPPLY  	select GPIO_CS5535  	select MFD_CORE diff --git a/arch/x86/boot/Makefile b/arch/x86/boot/Makefile index ccce0ed67dd..379814bc41e 100644 --- a/arch/x86/boot/Makefile +++ b/arch/x86/boot/Makefile @@ -71,7 +71,7 @@ GCOV_PROFILE := n  $(obj)/bzImage: asflags-y  := $(SVGA_MODE)  quiet_cmd_image = BUILD   $@ -cmd_image = $(obj)/tools/build $(obj)/setup.bin $(obj)/vmlinux.bin > $@ +cmd_image = $(obj)/tools/build $(obj)/setup.bin $(obj)/vmlinux.bin $(obj)/zoffset.h > $@  $(obj)/bzImage: $(obj)/setup.bin $(obj)/vmlinux.bin $(obj)/tools/build FORCE  	$(call if_changed,image) @@ -92,7 +92,7 @@ targets += voffset.h  $(obj)/voffset.h: vmlinux FORCE  	$(call if_changed,voffset) -sed-zoffset := -e 's/^\([0-9a-fA-F]*\) . \(startup_32\|input_data\|_end\|z_.*\)$$/\#define ZO_\2 0x\1/p' +sed-zoffset := -e 's/^\([0-9a-fA-F]*\) . \(startup_32\|startup_64\|efi_pe_entry\|efi_stub_entry\|input_data\|_end\|z_.*\)$$/\#define ZO_\2 0x\1/p'  quiet_cmd_zoffset = ZOFFSET $@        cmd_zoffset = $(NM) $< | sed -n $(sed-zoffset) > $@ diff --git a/arch/x86/boot/compressed/eboot.c b/arch/x86/boot/compressed/eboot.c index b1942e22276..f8fa41190c3 100644 --- a/arch/x86/boot/compressed/eboot.c +++ b/arch/x86/boot/compressed/eboot.c @@ -256,10 +256,10 @@ static efi_status_t setup_efi_pci(struct boot_params *params)  	int i;  	struct setup_data *data; -	data = (struct setup_data *)params->hdr.setup_data; +	data = (struct setup_data *)(unsigned long)params->hdr.setup_data;  	while (data && data->next) -		data = (struct setup_data *)data->next; +		data = (struct setup_data *)(unsigned long)data->next;  	status = efi_call_phys5(sys_table->boottime->locate_handle,  				EFI_LOCATE_BY_PROTOCOL, &pci_proto, @@ -295,16 +295,18 @@ static efi_status_t setup_efi_pci(struct boot_params *params)  		if (!pci)  			continue; +#ifdef CONFIG_X86_64  		status = efi_call_phys4(pci->attributes, pci,  					EfiPciIoAttributeOperationGet, 0,  					&attributes); - +#else +		status = efi_call_phys5(pci->attributes, pci, +					EfiPciIoAttributeOperationGet, 0, 0, +					&attributes); +#endif  		if (status != EFI_SUCCESS)  			continue; -		if (!attributes & EFI_PCI_IO_ATTRIBUTE_EMBEDDED_ROM) -			continue; -  		if (!pci->romimage || !pci->romsize)  			continue; @@ -345,9 +347,9 @@ static efi_status_t setup_efi_pci(struct boot_params *params)  		memcpy(rom->romdata, pci->romimage, pci->romsize);  		if (data) -			data->next = (uint64_t)rom; +			data->next = (unsigned long)rom;  		else -			params->hdr.setup_data = (uint64_t)rom; +			params->hdr.setup_data = (unsigned long)rom;  		data = (struct setup_data *)rom; @@ -432,10 +434,9 @@ static efi_status_t setup_gop(struct screen_info *si, efi_guid_t *proto,  			 * Once we've found a GOP supporting ConOut,  			 * don't bother looking any further.  			 */ +			first_gop = gop;  			if (conout_found)  				break; - -			first_gop = gop;  		}  	} diff --git a/arch/x86/boot/compressed/head_32.S b/arch/x86/boot/compressed/head_32.S index aa4aaf1b238..1e3184f6072 100644 --- a/arch/x86/boot/compressed/head_32.S +++ b/arch/x86/boot/compressed/head_32.S @@ -35,11 +35,11 @@ ENTRY(startup_32)  #ifdef CONFIG_EFI_STUB  	jmp	preferred_addr -	.balign	0x10  	/*  	 * We don't need the return address, so set up the stack so -	 * efi_main() can find its arugments. +	 * efi_main() can find its arguments.  	 */ +ENTRY(efi_pe_entry)  	add	$0x4, %esp  	call	make_boot_params @@ -50,8 +50,10 @@ ENTRY(startup_32)  	pushl	%eax  	pushl	%esi  	pushl	%ecx +	sub	$0x4, %esp -	.org 0x30,0x90 +ENTRY(efi_stub_entry) +	add	$0x4, %esp  	call	efi_main  	cmpl	$0, %eax  	movl	%eax, %esi diff --git a/arch/x86/boot/compressed/head_64.S b/arch/x86/boot/compressed/head_64.S index 2c4b171eec3..f5d1aaa0dec 100644 --- a/arch/x86/boot/compressed/head_64.S +++ b/arch/x86/boot/compressed/head_64.S @@ -201,12 +201,12 @@ ENTRY(startup_64)  	 */  #ifdef CONFIG_EFI_STUB  	/* -	 * The entry point for the PE/COFF executable is 0x210, so only -	 * legacy boot loaders will execute this jmp. +	 * The entry point for the PE/COFF executable is efi_pe_entry, so +	 * only legacy boot loaders will execute this jmp.  	 */  	jmp	preferred_addr -	.org 0x210 +ENTRY(efi_pe_entry)  	mov	%rcx, %rdi  	mov	%rdx, %rsi  	pushq	%rdi @@ -218,7 +218,7 @@ ENTRY(startup_64)  	popq	%rsi  	popq	%rdi -	.org 0x230,0x90 +ENTRY(efi_stub_entry)  	call	efi_main  	movq	%rax,%rsi  	cmpq	$0,%rax diff --git a/arch/x86/boot/header.S b/arch/x86/boot/header.S index 8c132a625b9..944ce595f76 100644 --- a/arch/x86/boot/header.S +++ b/arch/x86/boot/header.S @@ -21,6 +21,7 @@  #include <asm/e820.h>  #include <asm/page_types.h>  #include <asm/setup.h> +#include <asm/bootparam.h>  #include "boot.h"  #include "voffset.h"  #include "zoffset.h" @@ -255,6 +256,9 @@ section_table:  	# header, from the old boot sector.  	.section ".header", "a" +	.globl	sentinel +sentinel:	.byte 0xff, 0xff        /* Used to detect broken loaders */ +  	.globl	hdr  hdr:  setup_sects:	.byte 0			/* Filled in by build.c */ @@ -279,7 +283,7 @@ _start:  	# Part 2 of the header, from the old setup.S  		.ascii	"HdrS"		# header signature -		.word	0x020b		# header version number (>= 0x0105) +		.word	0x020c		# header version number (>= 0x0105)  					# or else old loadlin-1.5 will fail)  		.globl realmode_swtch  realmode_swtch:	.word	0, 0		# default_switch, SETUPSEG @@ -297,13 +301,7 @@ type_of_loader:	.byte	0		# 0 means ancient bootloader, newer  # flags, unused bits must be zero (RFU) bit within loadflags  loadflags: -LOADED_HIGH	= 1			# If set, the kernel is loaded high -CAN_USE_HEAP	= 0x80			# If set, the loader also has set -					# heap_end_ptr to tell how much -					# space behind setup.S can be used for -					# heap purposes. -					# Only the loader knows what is free -		.byte	LOADED_HIGH +		.byte	LOADED_HIGH	# The kernel is to be loaded high  setup_move_size: .word  0x8000		# size to move, when setup is not  					# loaded at 0x90000. We will move setup @@ -369,7 +367,23 @@ relocatable_kernel:    .byte 1  relocatable_kernel:    .byte 0  #endif  min_alignment:		.byte MIN_KERNEL_ALIGN_LG2	# minimum alignment -pad3:			.word 0 + +xloadflags: +#ifdef CONFIG_X86_64 +# define XLF0 XLF_KERNEL_64			/* 64-bit kernel */ +#else +# define XLF0 0 +#endif +#ifdef CONFIG_EFI_STUB +# ifdef CONFIG_X86_64 +#  define XLF23 XLF_EFI_HANDOVER_64		/* 64-bit EFI handover ok */ +# else +#  define XLF23 XLF_EFI_HANDOVER_32		/* 32-bit EFI handover ok */ +# endif +#else +# define XLF23 0 +#endif +			.word XLF0 | XLF23  cmdline_size:   .long   COMMAND_LINE_SIZE-1     #length of the command line,                                                  #added with boot protocol @@ -397,8 +411,13 @@ pref_address:		.quad LOAD_PHYSICAL_ADDR	# preferred load addr  #define INIT_SIZE VO_INIT_SIZE  #endif  init_size:		.long INIT_SIZE		# kernel initialization size -handover_offset:	.long 0x30		# offset to the handover +handover_offset: +#ifdef CONFIG_EFI_STUB +  			.long 0x30		# offset to the handover  						# protocol entry point +#else +			.long 0 +#endif  # End of setup header ##################################################### diff --git a/arch/x86/boot/setup.ld b/arch/x86/boot/setup.ld index 03c0683636b..96a6c756353 100644 --- a/arch/x86/boot/setup.ld +++ b/arch/x86/boot/setup.ld @@ -13,7 +13,7 @@ SECTIONS  	.bstext		: { *(.bstext) }  	.bsdata		: { *(.bsdata) } -	. = 497; +	. = 495;  	.header		: { *(.header) }  	.entrytext	: { *(.entrytext) }  	.inittext	: { *(.inittext) } diff --git a/arch/x86/boot/tools/build.c b/arch/x86/boot/tools/build.c index 4b8e165ee57..94c54465002 100644 --- a/arch/x86/boot/tools/build.c +++ b/arch/x86/boot/tools/build.c @@ -52,6 +52,10 @@ int is_big_kernel;  #define PECOFF_RELOC_RESERVE 0x20 +unsigned long efi_stub_entry; +unsigned long efi_pe_entry; +unsigned long startup_64; +  /*----------------------------------------------------------------------*/  static const u32 crctab32[] = { @@ -132,7 +136,7 @@ static void die(const char * str, ...)  static void usage(void)  { -	die("Usage: build setup system [> image]"); +	die("Usage: build setup system [zoffset.h] [> image]");  }  #ifdef CONFIG_EFI_STUB @@ -206,30 +210,54 @@ static void update_pecoff_text(unsigned int text_start, unsigned int file_sz)  	 */  	put_unaligned_le32(file_sz - 512, &buf[pe_header + 0x1c]); -#ifdef CONFIG_X86_32  	/* -	 * Address of entry point. -	 * -	 * The EFI stub entry point is +16 bytes from the start of -	 * the .text section. +	 * Address of entry point for PE/COFF executable  	 */ -	put_unaligned_le32(text_start + 16, &buf[pe_header + 0x28]); -#else -	/* -	 * Address of entry point. startup_32 is at the beginning and -	 * the 64-bit entry point (startup_64) is always 512 bytes -	 * after. The EFI stub entry point is 16 bytes after that, as -	 * the first instruction allows legacy loaders to jump over -	 * the EFI stub initialisation -	 */ -	put_unaligned_le32(text_start + 528, &buf[pe_header + 0x28]); -#endif /* CONFIG_X86_32 */ +	put_unaligned_le32(text_start + efi_pe_entry, &buf[pe_header + 0x28]);  	update_pecoff_section_header(".text", text_start, text_sz);  }  #endif /* CONFIG_EFI_STUB */ + +/* + * Parse zoffset.h and find the entry points. We could just #include zoffset.h + * but that would mean tools/build would have to be rebuilt every time. It's + * not as if parsing it is hard... + */ +#define PARSE_ZOFS(p, sym) do { \ +	if (!strncmp(p, "#define ZO_" #sym " ", 11+sizeof(#sym)))	\ +		sym = strtoul(p + 11 + sizeof(#sym), NULL, 16);		\ +} while (0) + +static void parse_zoffset(char *fname) +{ +	FILE *file; +	char *p; +	int c; + +	file = fopen(fname, "r"); +	if (!file) +		die("Unable to open `%s': %m", fname); +	c = fread(buf, 1, sizeof(buf) - 1, file); +	if (ferror(file)) +		die("read-error on `zoffset.h'"); +	buf[c] = 0; + +	p = (char *)buf; + +	while (p && *p) { +		PARSE_ZOFS(p, efi_stub_entry); +		PARSE_ZOFS(p, efi_pe_entry); +		PARSE_ZOFS(p, startup_64); + +		p = strchr(p, '\n'); +		while (p && (*p == '\r' || *p == '\n')) +			p++; +	} +} +  int main(int argc, char ** argv)  {  	unsigned int i, sz, setup_sectors; @@ -241,7 +269,19 @@ int main(int argc, char ** argv)  	void *kernel;  	u32 crc = 0xffffffffUL; -	if (argc != 3) +	/* Defaults for old kernel */ +#ifdef CONFIG_X86_32 +	efi_pe_entry = 0x10; +	efi_stub_entry = 0x30; +#else +	efi_pe_entry = 0x210; +	efi_stub_entry = 0x230; +	startup_64 = 0x200; +#endif + +	if (argc == 4) +		parse_zoffset(argv[3]); +	else if (argc != 3)  		usage();  	/* Copy the setup code */ @@ -299,6 +339,11 @@ int main(int argc, char ** argv)  #ifdef CONFIG_EFI_STUB  	update_pecoff_text(setup_sectors * 512, sz + i + ((sys_size * 16) - sz)); + +#ifdef CONFIG_X86_64 /* Yes, this is really how we defined it :( */ +	efi_stub_entry -= 0x200; +#endif +	put_unaligned_le32(efi_stub_entry, &buf[0x264]);  #endif  	crc = partial_crc32(buf, i, crc); diff --git a/arch/x86/include/asm/efi.h b/arch/x86/include/asm/efi.h index 6e8fdf5ad11..28677c55113 100644 --- a/arch/x86/include/asm/efi.h +++ b/arch/x86/include/asm/efi.h @@ -94,6 +94,7 @@ extern void __iomem *efi_ioremap(unsigned long addr, unsigned long size,  #endif /* CONFIG_X86_32 */  extern int add_efi_memmap; +extern unsigned long x86_efi_facility;  extern void efi_set_executable(efi_memory_desc_t *md, bool executable);  extern int efi_memblock_x86_reserve_range(void);  extern void efi_call_phys_prelog(void); diff --git a/arch/x86/include/asm/uv/uv.h b/arch/x86/include/asm/uv/uv.h index b47c2a82ff1..062921ef34e 100644 --- a/arch/x86/include/asm/uv/uv.h +++ b/arch/x86/include/asm/uv/uv.h @@ -16,7 +16,7 @@ extern void uv_system_init(void);  extern const struct cpumask *uv_flush_tlb_others(const struct cpumask *cpumask,  						 struct mm_struct *mm,  						 unsigned long start, -						 unsigned end, +						 unsigned long end,  						 unsigned int cpu);  #else	/* X86_UV */ diff --git a/arch/x86/include/uapi/asm/bootparam.h b/arch/x86/include/uapi/asm/bootparam.h index 92862cd9020..c15ddaf9071 100644 --- a/arch/x86/include/uapi/asm/bootparam.h +++ b/arch/x86/include/uapi/asm/bootparam.h @@ -1,6 +1,31 @@  #ifndef _ASM_X86_BOOTPARAM_H  #define _ASM_X86_BOOTPARAM_H +/* setup_data types */ +#define SETUP_NONE			0 +#define SETUP_E820_EXT			1 +#define SETUP_DTB			2 +#define SETUP_PCI			3 + +/* ram_size flags */ +#define RAMDISK_IMAGE_START_MASK	0x07FF +#define RAMDISK_PROMPT_FLAG		0x8000 +#define RAMDISK_LOAD_FLAG		0x4000 + +/* loadflags */ +#define LOADED_HIGH	(1<<0) +#define QUIET_FLAG	(1<<5) +#define KEEP_SEGMENTS	(1<<6) +#define CAN_USE_HEAP	(1<<7) + +/* xloadflags */ +#define XLF_KERNEL_64			(1<<0) +#define XLF_CAN_BE_LOADED_ABOVE_4G	(1<<1) +#define XLF_EFI_HANDOVER_32		(1<<2) +#define XLF_EFI_HANDOVER_64		(1<<3) + +#ifndef __ASSEMBLY__ +  #include <linux/types.h>  #include <linux/screen_info.h>  #include <linux/apm_bios.h> @@ -9,12 +34,6 @@  #include <asm/ist.h>  #include <video/edid.h> -/* setup data types */ -#define SETUP_NONE			0 -#define SETUP_E820_EXT			1 -#define SETUP_DTB			2 -#define SETUP_PCI			3 -  /* extensible setup data list node */  struct setup_data {  	__u64 next; @@ -28,9 +47,6 @@ struct setup_header {  	__u16	root_flags;  	__u32	syssize;  	__u16	ram_size; -#define RAMDISK_IMAGE_START_MASK	0x07FF -#define RAMDISK_PROMPT_FLAG		0x8000 -#define RAMDISK_LOAD_FLAG		0x4000  	__u16	vid_mode;  	__u16	root_dev;  	__u16	boot_flag; @@ -42,10 +58,6 @@ struct setup_header {  	__u16	kernel_version;  	__u8	type_of_loader;  	__u8	loadflags; -#define LOADED_HIGH	(1<<0) -#define QUIET_FLAG	(1<<5) -#define KEEP_SEGMENTS	(1<<6) -#define CAN_USE_HEAP	(1<<7)  	__u16	setup_move_size;  	__u32	code32_start;  	__u32	ramdisk_image; @@ -58,7 +70,8 @@ struct setup_header {  	__u32	initrd_addr_max;  	__u32	kernel_alignment;  	__u8	relocatable_kernel; -	__u8	_pad2[3]; +	__u8	min_alignment; +	__u16	xloadflags;  	__u32	cmdline_size;  	__u32	hardware_subarch;  	__u64	hardware_subarch_data; @@ -106,7 +119,10 @@ struct boot_params {  	__u8  hd1_info[16];	/* obsolete! */		/* 0x090 */  	struct sys_desc_table sys_desc_table;		/* 0x0a0 */  	struct olpc_ofw_header olpc_ofw_header;		/* 0x0b0 */ -	__u8  _pad4[128];				/* 0x0c0 */ +	__u32 ext_ramdisk_image;			/* 0x0c0 */ +	__u32 ext_ramdisk_size;				/* 0x0c4 */ +	__u32 ext_cmd_line_ptr;				/* 0x0c8 */ +	__u8  _pad4[116];				/* 0x0cc */  	struct edid_info edid_info;			/* 0x140 */  	struct efi_info efi_info;			/* 0x1c0 */  	__u32 alt_mem_k;				/* 0x1e0 */ @@ -115,7 +131,20 @@ struct boot_params {  	__u8  eddbuf_entries;				/* 0x1e9 */  	__u8  edd_mbr_sig_buf_entries;			/* 0x1ea */  	__u8  kbd_status;				/* 0x1eb */ -	__u8  _pad6[5];					/* 0x1ec */ +	__u8  _pad5[3];					/* 0x1ec */ +	/* +	 * The sentinel is set to a nonzero value (0xff) in header.S. +	 * +	 * A bootloader is supposed to only take setup_header and put +	 * it into a clean boot_params buffer. If it turns out that +	 * it is clumsy or too generous with the buffer, it most +	 * probably will pick up the sentinel variable too. The fact +	 * that this variable then is still 0xff will let kernel +	 * know that some variables in boot_params are invalid and +	 * kernel should zero out certain portions of boot_params. +	 */ +	__u8  sentinel;					/* 0x1ef */ +	__u8  _pad6[1];					/* 0x1f0 */  	struct setup_header hdr;    /* setup header */	/* 0x1f1 */  	__u8  _pad7[0x290-0x1f1-sizeof(struct setup_header)];  	__u32 edd_mbr_sig_buffer[EDD_MBR_SIG_MAX];	/* 0x290 */ @@ -134,6 +163,6 @@ enum {  	X86_NR_SUBARCHS,  }; - +#endif /* __ASSEMBLY__ */  #endif /* _ASM_X86_BOOTPARAM_H */ diff --git a/arch/x86/kernel/cpu/perf_event.c b/arch/x86/kernel/cpu/perf_event.c index 4428fd178bc..6774c17a557 100644 --- a/arch/x86/kernel/cpu/perf_event.c +++ b/arch/x86/kernel/cpu/perf_event.c @@ -340,9 +340,6 @@ int x86_setup_perfctr(struct perf_event *event)  		/* BTS is currently only allowed for user-mode. */  		if (!attr->exclude_kernel)  			return -EOPNOTSUPP; - -		if (!attr->exclude_guest) -			return -EOPNOTSUPP;  	}  	hwc->config |= config; @@ -385,9 +382,6 @@ int x86_pmu_hw_config(struct perf_event *event)  	if (event->attr.precise_ip) {  		int precise = 0; -		if (!event->attr.exclude_guest) -			return -EOPNOTSUPP; -  		/* Support for constant skid */  		if (x86_pmu.pebs_active && !x86_pmu.pebs_broken) {  			precise++; diff --git a/arch/x86/kernel/entry_32.S b/arch/x86/kernel/entry_32.S index ff84d5469d7..6ed91d9980e 100644 --- a/arch/x86/kernel/entry_32.S +++ b/arch/x86/kernel/entry_32.S @@ -1065,7 +1065,6 @@ ENTRY(xen_failsafe_callback)  	lea 16(%esp),%esp  	CFI_ADJUST_CFA_OFFSET -16  	jz 5f -	addl $16,%esp  	jmp iret_exc  5:	pushl_cfi $-1 /* orig_ax = -1 => not a system call */  	SAVE_ALL diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S index 07a7a04529b..cb3c591339a 100644 --- a/arch/x86/kernel/entry_64.S +++ b/arch/x86/kernel/entry_64.S @@ -1781,6 +1781,7 @@ first_nmi:  	 * Leave room for the "copied" frame  	 */  	subq $(5*8), %rsp +	CFI_ADJUST_CFA_OFFSET 5*8  	/* Copy the stack frame to the Saved frame */  	.rept 5 @@ -1863,10 +1864,8 @@ end_repeat_nmi:  nmi_swapgs:  	SWAPGS_UNSAFE_STACK  nmi_restore: -	RESTORE_ALL 8 - -	/* Pop the extra iret frame */ -	addq $(5*8), %rsp +	/* Pop the extra iret frame at once */ +	RESTORE_ALL 6*8  	/* Clear the NMI executing stack variable */  	movq $0, 5*8(%rsp) diff --git a/arch/x86/kernel/head_32.S b/arch/x86/kernel/head_32.S index 8e7f6556028..c8932c79e78 100644 --- a/arch/x86/kernel/head_32.S +++ b/arch/x86/kernel/head_32.S @@ -300,6 +300,12 @@ ENTRY(startup_32_smp)  	leal -__PAGE_OFFSET(%ecx),%esp  default_entry: +#define CR0_STATE	(X86_CR0_PE | X86_CR0_MP | X86_CR0_ET | \ +			 X86_CR0_NE | X86_CR0_WP | X86_CR0_AM | \ +			 X86_CR0_PG) +	movl $(CR0_STATE & ~X86_CR0_PG),%eax +	movl %eax,%cr0 +  /*   *	New page tables may be in 4Mbyte page mode and may   *	be using the global pages.  @@ -364,8 +370,7 @@ default_entry:   */  	movl $pa(initial_page_table), %eax  	movl %eax,%cr3		/* set the page table pointer.. */ -	movl %cr0,%eax -	orl  $X86_CR0_PG,%eax +	movl $CR0_STATE,%eax  	movl %eax,%cr0		/* ..and set paging (PG) bit */  	ljmp $__BOOT_CS,$1f	/* Clear prefetch and normalize %eip */  1: diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c index 08b973f6403..9c2bd8bd4b4 100644 --- a/arch/x86/kernel/kvm.c +++ b/arch/x86/kernel/kvm.c @@ -43,6 +43,7 @@  #include <asm/apicdef.h>  #include <asm/hypervisor.h>  #include <asm/kvm_guest.h> +#include <asm/context_tracking.h>  static int kvmapf = 1; @@ -121,6 +122,8 @@ void kvm_async_pf_task_wait(u32 token)  	struct kvm_task_sleep_node n, *e;  	DEFINE_WAIT(wait); +	rcu_irq_enter(); +  	spin_lock(&b->lock);  	e = _find_apf_task(b, token);  	if (e) { @@ -128,6 +131,8 @@ void kvm_async_pf_task_wait(u32 token)  		hlist_del(&e->link);  		kfree(e);  		spin_unlock(&b->lock); + +		rcu_irq_exit();  		return;  	} @@ -152,13 +157,16 @@ void kvm_async_pf_task_wait(u32 token)  			/*  			 * We cannot reschedule. So halt.  			 */ +			rcu_irq_exit();  			native_safe_halt(); +			rcu_irq_enter();  			local_irq_disable();  		}  	}  	if (!n.halted)  		finish_wait(&n.wq, &wait); +	rcu_irq_exit();  	return;  }  EXPORT_SYMBOL_GPL(kvm_async_pf_task_wait); @@ -252,10 +260,10 @@ do_async_page_fault(struct pt_regs *regs, unsigned long error_code)  		break;  	case KVM_PV_REASON_PAGE_NOT_PRESENT:  		/* page is swapped out by the host. */ -		rcu_irq_enter(); +		exception_enter(regs);  		exit_idle();  		kvm_async_pf_task_wait((u32)read_cr2()); -		rcu_irq_exit(); +		exception_exit(regs);  		break;  	case KVM_PV_REASON_PAGE_READY:  		rcu_irq_enter(); diff --git a/arch/x86/kernel/msr.c b/arch/x86/kernel/msr.c index a7c5661f849..4929502c137 100644 --- a/arch/x86/kernel/msr.c +++ b/arch/x86/kernel/msr.c @@ -174,6 +174,9 @@ static int msr_open(struct inode *inode, struct file *file)  	unsigned int cpu;  	struct cpuinfo_x86 *c; +	if (!capable(CAP_SYS_RAWIO)) +		return -EPERM; +  	cpu = iminor(file->f_path.dentry->d_inode);  	if (cpu >= nr_cpu_ids || !cpu_online(cpu))  		return -ENXIO;	/* No such CPU */ diff --git a/arch/x86/kernel/pci-dma.c b/arch/x86/kernel/pci-dma.c index 0f5dec5c80e..872079a67e4 100644 --- a/arch/x86/kernel/pci-dma.c +++ b/arch/x86/kernel/pci-dma.c @@ -56,7 +56,7 @@ struct device x86_dma_fallback_dev = {  EXPORT_SYMBOL(x86_dma_fallback_dev);  /* Number of entries preallocated for DMA-API debugging */ -#define PREALLOC_DMA_DEBUG_ENTRIES       32768 +#define PREALLOC_DMA_DEBUG_ENTRIES       65536  int dma_set_mask(struct device *dev, u64 mask)  { diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c index 4e8ba39eaf0..76fa1e9a2b3 100644 --- a/arch/x86/kernel/reboot.c +++ b/arch/x86/kernel/reboot.c @@ -584,7 +584,7 @@ static void native_machine_emergency_restart(void)  			break;  		case BOOT_EFI: -			if (efi_enabled) +			if (efi_enabled(EFI_RUNTIME_SERVICES))  				efi.reset_system(reboot_mode ?  						 EFI_RESET_WARM :  						 EFI_RESET_COLD, diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index 23ddd558fbd..8b24289cc10 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c @@ -610,6 +610,83 @@ static __init void reserve_ibft_region(void)  static unsigned reserve_low = CONFIG_X86_RESERVE_LOW << 10; +static bool __init snb_gfx_workaround_needed(void) +{ +#ifdef CONFIG_PCI +	int i; +	u16 vendor, devid; +	static const __initconst u16 snb_ids[] = { +		0x0102, +		0x0112, +		0x0122, +		0x0106, +		0x0116, +		0x0126, +		0x010a, +	}; + +	/* Assume no if something weird is going on with PCI */ +	if (!early_pci_allowed()) +		return false; + +	vendor = read_pci_config_16(0, 2, 0, PCI_VENDOR_ID); +	if (vendor != 0x8086) +		return false; + +	devid = read_pci_config_16(0, 2, 0, PCI_DEVICE_ID); +	for (i = 0; i < ARRAY_SIZE(snb_ids); i++) +		if (devid == snb_ids[i]) +			return true; +#endif + +	return false; +} + +/* + * Sandy Bridge graphics has trouble with certain ranges, exclude + * them from allocation. + */ +static void __init trim_snb_memory(void) +{ +	static const __initconst unsigned long bad_pages[] = { +		0x20050000, +		0x20110000, +		0x20130000, +		0x20138000, +		0x40004000, +	}; +	int i; + +	if (!snb_gfx_workaround_needed()) +		return; + +	printk(KERN_DEBUG "reserving inaccessible SNB gfx pages\n"); + +	/* +	 * Reserve all memory below the 1 MB mark that has not +	 * already been reserved. +	 */ +	memblock_reserve(0, 1<<20); +	 +	for (i = 0; i < ARRAY_SIZE(bad_pages); i++) { +		if (memblock_reserve(bad_pages[i], PAGE_SIZE)) +			printk(KERN_WARNING "failed to reserve 0x%08lx\n", +			       bad_pages[i]); +	} +} + +/* + * Here we put platform-specific memory range workarounds, i.e. + * memory known to be corrupt or otherwise in need to be reserved on + * specific platforms. + * + * If this gets used more widely it could use a real dispatch mechanism. + */ +static void __init trim_platform_memory_ranges(void) +{ +	trim_snb_memory(); +} +  static void __init trim_bios_range(void)  {  	/* @@ -630,6 +707,7 @@ static void __init trim_bios_range(void)  	 * take them out.  	 */  	e820_remove_range(BIOS_BEGIN, BIOS_END - BIOS_BEGIN, E820_RAM, 1); +  	sanitize_e820_map(e820.map, ARRAY_SIZE(e820.map), &e820.nr_map);  } @@ -729,15 +807,15 @@ void __init setup_arch(char **cmdline_p)  #ifdef CONFIG_EFI  	if (!strncmp((char *)&boot_params.efi_info.efi_loader_signature,  		     "EL32", 4)) { -		efi_enabled = 1; -		efi_64bit = false; +		set_bit(EFI_BOOT, &x86_efi_facility);  	} else if (!strncmp((char *)&boot_params.efi_info.efi_loader_signature,  		     "EL64", 4)) { -		efi_enabled = 1; -		efi_64bit = true; +		set_bit(EFI_BOOT, &x86_efi_facility); +		set_bit(EFI_64BIT, &x86_efi_facility);  	} -	if (efi_enabled && efi_memblock_x86_reserve_range()) -		efi_enabled = 0; + +	if (efi_enabled(EFI_BOOT)) +		efi_memblock_x86_reserve_range();  #endif  	x86_init.oem.arch_setup(); @@ -810,7 +888,7 @@ void __init setup_arch(char **cmdline_p)  	finish_e820_parsing(); -	if (efi_enabled) +	if (efi_enabled(EFI_BOOT))  		efi_init();  	dmi_scan_machine(); @@ -893,7 +971,7 @@ void __init setup_arch(char **cmdline_p)  	 * The EFI specification says that boot service code won't be called  	 * after ExitBootServices(). This is, in fact, a lie.  	 */ -	if (efi_enabled) +	if (efi_enabled(EFI_MEMMAP))  		efi_reserve_boot_services();  	/* preallocate 4k for mptable mpc */ @@ -908,6 +986,8 @@ void __init setup_arch(char **cmdline_p)  	setup_real_mode(); +	trim_platform_memory_ranges(); +  	init_gbpages();  	/* max_pfn_mapped is updated here */ @@ -1034,7 +1114,7 @@ void __init setup_arch(char **cmdline_p)  #ifdef CONFIG_VT  #if defined(CONFIG_VGA_CONSOLE) -	if (!efi_enabled || (efi_mem_type(0xa0000) != EFI_CONVENTIONAL_MEMORY)) +	if (!efi_enabled(EFI_BOOT) || (efi_mem_type(0xa0000) != EFI_CONVENTIONAL_MEMORY))  		conswitchp = &vga_con;  #elif defined(CONFIG_DUMMY_CONSOLE)  	conswitchp = &dummy_con; @@ -1051,14 +1131,14 @@ void __init setup_arch(char **cmdline_p)  	register_refined_jiffies(CLOCK_TICK_RATE);  #ifdef CONFIG_EFI -	/* Once setup is done above, disable efi_enabled on mismatched -	 * firmware/kernel archtectures since there is no support for -	 * runtime services. +	/* Once setup is done above, unmap the EFI memory map on +	 * mismatched firmware/kernel archtectures since there is no +	 * support for runtime services.  	 */ -	if (efi_enabled && IS_ENABLED(CONFIG_X86_64) != efi_64bit) { +	if (efi_enabled(EFI_BOOT) && +	    IS_ENABLED(CONFIG_X86_64) != efi_enabled(EFI_64BIT)) {  		pr_info("efi: Setup done, disabling due to 32/64-bit mismatch\n");  		efi_unmap_memmap(); -		efi_enabled = 0;  	}  #endif  } diff --git a/arch/x86/kernel/step.c b/arch/x86/kernel/step.c index cd3b2438a98..9b4d51d0c0d 100644 --- a/arch/x86/kernel/step.c +++ b/arch/x86/kernel/step.c @@ -165,10 +165,11 @@ void set_task_blockstep(struct task_struct *task, bool on)  	 * Ensure irq/preemption can't change debugctl in between.  	 * Note also that both TIF_BLOCKSTEP and debugctl should  	 * be changed atomically wrt preemption. -	 * FIXME: this means that set/clear TIF_BLOCKSTEP is simply -	 * wrong if task != current, SIGKILL can wakeup the stopped -	 * tracee and set/clear can play with the running task, this -	 * can confuse the next __switch_to_xtra(). +	 * +	 * NOTE: this means that set/clear TIF_BLOCKSTEP is only safe if +	 * task is current or it can't be running, otherwise we can race +	 * with __switch_to_xtra(). We rely on ptrace_freeze_traced() but +	 * PTRACE_KILL is not safe.  	 */  	local_irq_disable();  	debugctl = get_debugctlmsr(); diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 76f54461f7c..c243b81e3c7 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -120,7 +120,7 @@ struct kvm_shared_msrs {  };  static struct kvm_shared_msrs_global __read_mostly shared_msrs_global; -static DEFINE_PER_CPU(struct kvm_shared_msrs, shared_msrs); +static struct kvm_shared_msrs __percpu *shared_msrs;  struct kvm_stats_debugfs_item debugfs_entries[] = {  	{ "pf_fixed", VCPU_STAT(pf_fixed) }, @@ -191,10 +191,10 @@ static void kvm_on_user_return(struct user_return_notifier *urn)  static void shared_msr_update(unsigned slot, u32 msr)  { -	struct kvm_shared_msrs *smsr;  	u64 value; +	unsigned int cpu = smp_processor_id(); +	struct kvm_shared_msrs *smsr = per_cpu_ptr(shared_msrs, cpu); -	smsr = &__get_cpu_var(shared_msrs);  	/* only read, and nobody should modify it at this time,  	 * so don't need lock */  	if (slot >= shared_msrs_global.nr) { @@ -226,7 +226,8 @@ static void kvm_shared_msr_cpu_online(void)  void kvm_set_shared_msr(unsigned slot, u64 value, u64 mask)  { -	struct kvm_shared_msrs *smsr = &__get_cpu_var(shared_msrs); +	unsigned int cpu = smp_processor_id(); +	struct kvm_shared_msrs *smsr = per_cpu_ptr(shared_msrs, cpu);  	if (((value ^ smsr->values[slot].curr) & mask) == 0)  		return; @@ -242,7 +243,8 @@ EXPORT_SYMBOL_GPL(kvm_set_shared_msr);  static void drop_user_return_notifiers(void *ignore)  { -	struct kvm_shared_msrs *smsr = &__get_cpu_var(shared_msrs); +	unsigned int cpu = smp_processor_id(); +	struct kvm_shared_msrs *smsr = per_cpu_ptr(shared_msrs, cpu);  	if (smsr->registered)  		kvm_on_user_return(&smsr->urn); @@ -5233,9 +5235,16 @@ int kvm_arch_init(void *opaque)  		goto out;  	} +	r = -ENOMEM; +	shared_msrs = alloc_percpu(struct kvm_shared_msrs); +	if (!shared_msrs) { +		printk(KERN_ERR "kvm: failed to allocate percpu kvm_shared_msrs\n"); +		goto out; +	} +  	r = kvm_mmu_module_init();  	if (r) -		goto out; +		goto out_free_percpu;  	kvm_set_mmio_spte_mask();  	kvm_init_msr_list(); @@ -5258,6 +5267,8 @@ int kvm_arch_init(void *opaque)  	return 0; +out_free_percpu: +	free_percpu(shared_msrs);  out:  	return r;  } @@ -5275,6 +5286,7 @@ void kvm_arch_exit(void)  #endif  	kvm_x86_ops = NULL;  	kvm_mmu_module_exit(); +	free_percpu(shared_msrs);  }  int kvm_emulate_halt(struct kvm_vcpu *vcpu) diff --git a/arch/x86/platform/efi/efi.c b/arch/x86/platform/efi/efi.c index ad4439145f8..77cf0090c0a 100644 --- a/arch/x86/platform/efi/efi.c +++ b/arch/x86/platform/efi/efi.c @@ -51,9 +51,6 @@  #define EFI_DEBUG	1 -int efi_enabled; -EXPORT_SYMBOL(efi_enabled); -  struct efi __read_mostly efi = {  	.mps        = EFI_INVALID_TABLE_ADDR,  	.acpi       = EFI_INVALID_TABLE_ADDR, @@ -69,19 +66,28 @@ EXPORT_SYMBOL(efi);  struct efi_memory_map memmap; -bool efi_64bit; -  static struct efi efi_phys __initdata;  static efi_system_table_t efi_systab __initdata;  static inline bool efi_is_native(void)  { -	return IS_ENABLED(CONFIG_X86_64) == efi_64bit; +	return IS_ENABLED(CONFIG_X86_64) == efi_enabled(EFI_64BIT); +} + +unsigned long x86_efi_facility; + +/* + * Returns 1 if 'facility' is enabled, 0 otherwise. + */ +int efi_enabled(int facility) +{ +	return test_bit(facility, &x86_efi_facility) != 0;  } +EXPORT_SYMBOL(efi_enabled);  static int __init setup_noefi(char *arg)  { -	efi_enabled = 0; +	clear_bit(EFI_BOOT, &x86_efi_facility);  	return 0;  }  early_param("noefi", setup_noefi); @@ -426,6 +432,7 @@ void __init efi_reserve_boot_services(void)  void __init efi_unmap_memmap(void)  { +	clear_bit(EFI_MEMMAP, &x86_efi_facility);  	if (memmap.map) {  		early_iounmap(memmap.map, memmap.nr_map * memmap.desc_size);  		memmap.map = NULL; @@ -460,7 +467,7 @@ void __init efi_free_boot_services(void)  static int __init efi_systab_init(void *phys)  { -	if (efi_64bit) { +	if (efi_enabled(EFI_64BIT)) {  		efi_system_table_64_t *systab64;  		u64 tmp = 0; @@ -552,7 +559,7 @@ static int __init efi_config_init(u64 tables, int nr_tables)  	void *config_tables, *tablep;  	int i, sz; -	if (efi_64bit) +	if (efi_enabled(EFI_64BIT))  		sz = sizeof(efi_config_table_64_t);  	else  		sz = sizeof(efi_config_table_32_t); @@ -572,7 +579,7 @@ static int __init efi_config_init(u64 tables, int nr_tables)  		efi_guid_t guid;  		unsigned long table; -		if (efi_64bit) { +		if (efi_enabled(EFI_64BIT)) {  			u64 table64;  			guid = ((efi_config_table_64_t *)tablep)->guid;  			table64 = ((efi_config_table_64_t *)tablep)->table; @@ -684,7 +691,6 @@ void __init efi_init(void)  	if (boot_params.efi_info.efi_systab_hi ||  	    boot_params.efi_info.efi_memmap_hi) {  		pr_info("Table located above 4GB, disabling EFI.\n"); -		efi_enabled = 0;  		return;  	}  	efi_phys.systab = (efi_system_table_t *)boot_params.efi_info.efi_systab; @@ -694,10 +700,10 @@ void __init efi_init(void)  			  ((__u64)boot_params.efi_info.efi_systab_hi<<32));  #endif -	if (efi_systab_init(efi_phys.systab)) { -		efi_enabled = 0; +	if (efi_systab_init(efi_phys.systab))  		return; -	} + +	set_bit(EFI_SYSTEM_TABLES, &x86_efi_facility);  	/*  	 * Show what we know for posterity @@ -715,10 +721,10 @@ void __init efi_init(void)  		efi.systab->hdr.revision >> 16,  		efi.systab->hdr.revision & 0xffff, vendor); -	if (efi_config_init(efi.systab->tables, efi.systab->nr_tables)) { -		efi_enabled = 0; +	if (efi_config_init(efi.systab->tables, efi.systab->nr_tables))  		return; -	} + +	set_bit(EFI_CONFIG_TABLES, &x86_efi_facility);  	/*  	 * Note: We currently don't support runtime services on an EFI @@ -727,15 +733,17 @@ void __init efi_init(void)  	if (!efi_is_native())  		pr_info("No EFI runtime due to 32/64-bit mismatch with kernel\n"); -	else if (efi_runtime_init()) { -		efi_enabled = 0; -		return; +	else { +		if (efi_runtime_init()) +			return; +		set_bit(EFI_RUNTIME_SERVICES, &x86_efi_facility);  	} -	if (efi_memmap_init()) { -		efi_enabled = 0; +	if (efi_memmap_init())  		return; -	} + +	set_bit(EFI_MEMMAP, &x86_efi_facility); +  #ifdef CONFIG_X86_32  	if (efi_is_native()) {  		x86_platform.get_wallclock = efi_get_time; @@ -941,7 +949,7 @@ void __init efi_enter_virtual_mode(void)  	 *  	 * Call EFI services through wrapper functions.  	 */ -	efi.runtime_version = efi_systab.fw_revision; +	efi.runtime_version = efi_systab.hdr.revision;  	efi.get_time = virt_efi_get_time;  	efi.set_time = virt_efi_set_time;  	efi.get_wakeup_time = virt_efi_get_wakeup_time; @@ -969,6 +977,9 @@ u32 efi_mem_type(unsigned long phys_addr)  	efi_memory_desc_t *md;  	void *p; +	if (!efi_enabled(EFI_MEMMAP)) +		return 0; +  	for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) {  		md = p;  		if ((md->phys_addr <= phys_addr) && diff --git a/arch/x86/platform/efi/efi_64.c b/arch/x86/platform/efi/efi_64.c index 95fd505dfeb..2b200386061 100644 --- a/arch/x86/platform/efi/efi_64.c +++ b/arch/x86/platform/efi/efi_64.c @@ -38,7 +38,7 @@  #include <asm/cacheflush.h>  #include <asm/fixmap.h> -static pgd_t save_pgd __initdata; +static pgd_t *save_pgd __initdata;  static unsigned long efi_flags __initdata;  static void __init early_code_mapping_set_exec(int executable) @@ -61,12 +61,20 @@ static void __init early_code_mapping_set_exec(int executable)  void __init efi_call_phys_prelog(void)  {  	unsigned long vaddress; +	int pgd; +	int n_pgds;  	early_code_mapping_set_exec(1);  	local_irq_save(efi_flags); -	vaddress = (unsigned long)__va(0x0UL); -	save_pgd = *pgd_offset_k(0x0UL); -	set_pgd(pgd_offset_k(0x0UL), *pgd_offset_k(vaddress)); + +	n_pgds = DIV_ROUND_UP((max_pfn << PAGE_SHIFT), PGDIR_SIZE); +	save_pgd = kmalloc(n_pgds * sizeof(pgd_t), GFP_KERNEL); + +	for (pgd = 0; pgd < n_pgds; pgd++) { +		save_pgd[pgd] = *pgd_offset_k(pgd * PGDIR_SIZE); +		vaddress = (unsigned long)__va(pgd * PGDIR_SIZE); +		set_pgd(pgd_offset_k(pgd * PGDIR_SIZE), *pgd_offset_k(vaddress)); +	}  	__flush_tlb_all();  } @@ -75,7 +83,11 @@ void __init efi_call_phys_epilog(void)  	/*  	 * After the lock is released, the original page table is restored.  	 */ -	set_pgd(pgd_offset_k(0x0UL), save_pgd); +	int pgd; +	int n_pgds = DIV_ROUND_UP((max_pfn << PAGE_SHIFT) , PGDIR_SIZE); +	for (pgd = 0; pgd < n_pgds; pgd++) +		set_pgd(pgd_offset_k(pgd * PGDIR_SIZE), save_pgd[pgd]); +	kfree(save_pgd);  	__flush_tlb_all();  	local_irq_restore(efi_flags);  	early_code_mapping_set_exec(0); diff --git a/arch/x86/platform/uv/tlb_uv.c b/arch/x86/platform/uv/tlb_uv.c index b8b3a37c80c..dbbdca5f508 100644 --- a/arch/x86/platform/uv/tlb_uv.c +++ b/arch/x86/platform/uv/tlb_uv.c @@ -1034,7 +1034,8 @@ static int set_distrib_bits(struct cpumask *flush_mask, struct bau_control *bcp,   * globally purge translation cache of a virtual address or all TLB's   * @cpumask: mask of all cpu's in which the address is to be removed   * @mm: mm_struct containing virtual address range - * @va: virtual address to be removed (or TLB_FLUSH_ALL for all TLB's on cpu) + * @start: start virtual address to be removed from TLB + * @end: end virtual address to be remove from TLB   * @cpu: the current cpu   *   * This is the entry point for initiating any UV global TLB shootdown. @@ -1056,7 +1057,7 @@ static int set_distrib_bits(struct cpumask *flush_mask, struct bau_control *bcp,   */  const struct cpumask *uv_flush_tlb_others(const struct cpumask *cpumask,  				struct mm_struct *mm, unsigned long start, -				unsigned end, unsigned int cpu) +				unsigned long end, unsigned int cpu)  {  	int locals = 0;  	int remotes = 0; @@ -1113,7 +1114,10 @@ const struct cpumask *uv_flush_tlb_others(const struct cpumask *cpumask,  	record_send_statistics(stat, locals, hubs, remotes, bau_desc); -	bau_desc->payload.address = start; +	if (!end || (end - start) <= PAGE_SIZE) +		bau_desc->payload.address = start; +	else +		bau_desc->payload.address = TLB_FLUSH_ALL;  	bau_desc->payload.sending_cpu = cpu;  	/*  	 * uv_flush_send_and_wait returns 0 if all cpu's were messaged, diff --git a/arch/x86/tools/relocs.c b/arch/x86/tools/relocs.c index 5a1847d6193..79d67bd507f 100644 --- a/arch/x86/tools/relocs.c +++ b/arch/x86/tools/relocs.c @@ -814,12 +814,14 @@ int main(int argc, char **argv)  	read_relocs(fp);  	if (show_absolute_syms) {  		print_absolute_symbols(); -		return 0; +		goto out;  	}  	if (show_absolute_relocs) {  		print_absolute_relocs(); -		return 0; +		goto out;  	}  	emit_relocs(as_text, use_real_mode); +out: +	fclose(fp);  	return 0;  } diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c index 4f7d2599b48..34bc4cee888 100644 --- a/arch/x86/xen/smp.c +++ b/arch/x86/xen/smp.c @@ -432,13 +432,6 @@ static void __cpuinit xen_play_dead(void) /* used only with HOTPLUG_CPU */  	play_dead_common();  	HYPERVISOR_vcpu_op(VCPUOP_down, smp_processor_id(), NULL);  	cpu_bringup(); -	/* -	 * Balance out the preempt calls - as we are running in cpu_idle -	 * loop which has been called at bootup from cpu_bringup_and_idle. -	 * The cpucpu_bringup_and_idle called cpu_bringup which made a -	 * preempt_disable() So this preempt_enable will balance it out. -	 */ -	preempt_enable();  }  #else /* !CONFIG_HOTPLUG_CPU */  |