diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-11-01 21:02:35 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-11-01 21:02:35 -0700 | 
| commit | 367069f16e32e188d4687fe2c3e30f2ca583836f (patch) | |
| tree | 977f87038b75e53af9d132cba2f7a2aecb2fa005 /arch/arm | |
| parent | 81a3c10ce8a7fd5bf9a06bfc38bd417512911831 (diff) | |
| parent | c72dbae971400e466ad9ff16c920cd6d9d8c55a1 (diff) | |
| download | olio-linux-3.10-367069f16e32e188d4687fe2c3e30f2ca583836f.tar.xz olio-linux-3.10-367069f16e32e188d4687fe2c3e30f2ca583836f.zip  | |
Merge branch 'next/dt' of git://git.linaro.org/people/arnd/arm-soc
* 'next/dt' of git://git.linaro.org/people/arnd/arm-soc:
  ARM: gic: use module.h instead of export.h
  ARM: gic: fix irq_alloc_descs handling for sparse irq
  ARM: gic: add OF based initialization
  ARM: gic: add irq_domain support
  irq: support domains with non-zero hwirq base
  of/irq: introduce of_irq_init
  ARM: at91: add at91sam9g20 and Calao USB A9G20 DT support
  ARM: at91: dt: at91sam9g45 family and board device tree files
  arm/mx5: add device tree support for imx51 babbage
  arm/mx5: add device tree support for imx53 boards
  ARM: msm: Add devicetree support for msm8660-surf
  msm_serial: Add devicetree support
  msm_serial: Use relative resources for iomem
Fix up conflicts in arch/arm/mach-at91/{at91sam9260.c,at91sam9g45.c}
Diffstat (limited to 'arch/arm')
33 files changed, 2209 insertions, 84 deletions
diff --git a/arch/arm/boot/dts/at91sam9g20.dtsi b/arch/arm/boot/dts/at91sam9g20.dtsi new file mode 100644 index 00000000000..aeef04269cf --- /dev/null +++ b/arch/arm/boot/dts/at91sam9g20.dtsi @@ -0,0 +1,119 @@ +/* + * at91sam9g20.dtsi - Device Tree Include file for AT91SAM9G20 family SoC + * + *  Copyright (C) 2011 Atmel, + *                2011 Nicolas Ferre <nicolas.ferre@atmel.com>, + *                2011 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> + * + * Licensed under GPLv2 or later. + */ + +/include/ "skeleton.dtsi" + +/ { +	model = "Atmel AT91SAM9G20 family SoC"; +	compatible = "atmel,at91sam9g20"; +	interrupt-parent = <&aic>; + +	aliases { +		serial0 = &dbgu; +		serial1 = &usart0; +		serial2 = &usart1; +		serial3 = &usart2; +		serial4 = &usart3; +		serial5 = &usart4; +		serial6 = &usart5; +	}; +	cpus { +		cpu@0 { +			compatible = "arm,arm926ejs"; +		}; +	}; + +	memory@20000000 { +		reg = <0x20000000 0x08000000>; +	}; + +	ahb { +		compatible = "simple-bus"; +		#address-cells = <1>; +		#size-cells = <1>; +		ranges; + +		apb { +			compatible = "simple-bus"; +			#address-cells = <1>; +			#size-cells = <1>; +			ranges; + +			aic: interrupt-controller@fffff000 { +				#interrupt-cells = <1>; +				compatible = "atmel,at91rm9200-aic"; +				interrupt-controller; +				interrupt-parent; +				reg = <0xfffff000 0x200>; +			}; + +			dbgu: serial@fffff200 { +				compatible = "atmel,at91sam9260-usart"; +				reg = <0xfffff200 0x200>; +				interrupts = <1>; +				status = "disabled"; +			}; + +			usart0: serial@fffb0000 { +				compatible = "atmel,at91sam9260-usart"; +				reg = <0xfffb0000 0x200>; +				interrupts = <6>; +				atmel,use-dma-rx; +				atmel,use-dma-tx; +				status = "disabled"; +			}; + +			usart1: serial@fffb4000 { +				compatible = "atmel,at91sam9260-usart"; +				reg = <0xfffb4000 0x200>; +				interrupts = <7>; +				atmel,use-dma-rx; +				atmel,use-dma-tx; +				status = "disabled"; +			}; + +			usart2: serial@fffb8000 { +				compatible = "atmel,at91sam9260-usart"; +				reg = <0xfffb8000 0x200>; +				interrupts = <8>; +				atmel,use-dma-rx; +				atmel,use-dma-tx; +				status = "disabled"; +			}; + +			usart3: serial@fffd0000 { +				compatible = "atmel,at91sam9260-usart"; +				reg = <0xfffd0000 0x200>; +				interrupts = <23>; +				atmel,use-dma-rx; +				atmel,use-dma-tx; +				status = "disabled"; +			}; + +			usart4: serial@fffd4000 { +				compatible = "atmel,at91sam9260-usart"; +				reg = <0xfffd4000 0x200>; +				interrupts = <24>; +				atmel,use-dma-rx; +				atmel,use-dma-tx; +				status = "disabled"; +			}; + +			usart5: serial@fffd8000 { +				compatible = "atmel,at91sam9260-usart"; +				reg = <0xfffd8000 0x200>; +				interrupts = <25>; +				atmel,use-dma-rx; +				atmel,use-dma-tx; +				status = "disabled"; +			}; +		}; +	}; +}; diff --git a/arch/arm/boot/dts/at91sam9g45.dtsi b/arch/arm/boot/dts/at91sam9g45.dtsi new file mode 100644 index 00000000000..db6a45202f2 --- /dev/null +++ b/arch/arm/boot/dts/at91sam9g45.dtsi @@ -0,0 +1,106 @@ +/* + * at91sam9g45.dtsi - Device Tree Include file for AT91SAM9G45 family SoC + *                    applies to AT91SAM9G45, AT91SAM9M10, + *                    AT91SAM9G46, AT91SAM9M11 SoC + * + *  Copyright (C) 2011 Atmel, + *                2011 Nicolas Ferre <nicolas.ferre@atmel.com> + * + * Licensed under GPLv2 or later. + */ + +/include/ "skeleton.dtsi" + +/ { +	model = "Atmel AT91SAM9G45 family SoC"; +	compatible = "atmel,at91sam9g45"; +	interrupt-parent = <&aic>; + +	aliases { +		serial0 = &dbgu; +		serial1 = &usart0; +		serial2 = &usart1; +		serial3 = &usart2; +		serial4 = &usart3; +	}; +	cpus { +		cpu@0 { +			compatible = "arm,arm926ejs"; +		}; +	}; + +	memory@70000000 { +		reg = <0x70000000 0x10000000>; +	}; + +	ahb { +		compatible = "simple-bus"; +		#address-cells = <1>; +		#size-cells = <1>; +		ranges; + +		apb { +			compatible = "simple-bus"; +			#address-cells = <1>; +			#size-cells = <1>; +			ranges; + +			aic: interrupt-controller@fffff000 { +				#interrupt-cells = <1>; +				compatible = "atmel,at91rm9200-aic"; +				interrupt-controller; +				interrupt-parent; +				reg = <0xfffff000 0x200>; +			}; + +			dma: dma-controller@ffffec00 { +				compatible = "atmel,at91sam9g45-dma"; +				reg = <0xffffec00 0x200>; +				interrupts = <21>; +			}; + +			dbgu: serial@ffffee00 { +				compatible = "atmel,at91sam9260-usart"; +				reg = <0xffffee00 0x200>; +				interrupts = <1>; +				status = "disabled"; +			}; + +			usart0: serial@fff8c000 { +				compatible = "atmel,at91sam9260-usart"; +				reg = <0xfff8c000 0x200>; +				interrupts = <7>; +				atmel,use-dma-rx; +				atmel,use-dma-tx; +				status = "disabled"; +			}; + +			usart1: serial@fff90000 { +				compatible = "atmel,at91sam9260-usart"; +				reg = <0xfff90000 0x200>; +				interrupts = <8>; +				atmel,use-dma-rx; +				atmel,use-dma-tx; +				status = "disabled"; +			}; + +			usart2: serial@fff94000 { +				compatible = "atmel,at91sam9260-usart"; +				reg = <0xfff94000 0x200>; +				interrupts = <9>; +				atmel,use-dma-rx; +				atmel,use-dma-tx; +				status = "disabled"; +			}; + +			usart3: serial@fff98000 { +				compatible = "atmel,at91sam9260-usart"; +				reg = <0xfff98000 0x200>; +				interrupts = <10>; +				atmel,use-dma-rx; +				atmel,use-dma-tx; +				status = "disabled"; +			}; +		}; +	}; +}; diff --git a/arch/arm/boot/dts/at91sam9m10g45ek.dts b/arch/arm/boot/dts/at91sam9m10g45ek.dts new file mode 100644 index 00000000000..85b34f59cd8 --- /dev/null +++ b/arch/arm/boot/dts/at91sam9m10g45ek.dts @@ -0,0 +1,35 @@ +/* + * at91sam9m10g45ek.dts - Device Tree file for AT91SAM9M10G45-EK board + * + *  Copyright (C) 2011 Atmel, + *                2011 Nicolas Ferre <nicolas.ferre@atmel.com> + * + * Licensed under GPLv2 or later. + */ +/dts-v1/; +/include/ "at91sam9g45.dtsi" + +/ { +	model = "Atmel AT91SAM9M10G45-EK"; +	compatible = "atmel,at91sam9m10g45ek", "atmel,at91sam9g45", "atmel,at91sam9"; + +	chosen { +		bootargs = "mem=64M console=ttyS0,115200 mtdparts=atmel_nand:4M(bootstrap/uboot/kernel)ro,60M(rootfs),-(data) root=/dev/mtdblock1 rw rootfstype=jffs2"; +	}; + +	memory@70000000 { +		reg = <0x70000000 0x4000000>; +	}; + +	ahb { +		apb { +			dbgu: serial@ffffee00 { +				status = "okay"; +			}; + +			usart1: serial@fff90000 { +				status = "okay"; +			}; +		}; +	}; +}; diff --git a/arch/arm/boot/dts/imx51-babbage.dts b/arch/arm/boot/dts/imx51-babbage.dts new file mode 100644 index 00000000000..f8766af1121 --- /dev/null +++ b/arch/arm/boot/dts/imx51-babbage.dts @@ -0,0 +1,135 @@ +/* + * 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 + */ + +/dts-v1/; +/include/ "imx51.dtsi" + +/ { +	model = "Freescale i.MX51 Babbage Board"; +	compatible = "fsl,imx51-babbage", "fsl,imx51"; + +	chosen { +		bootargs = "console=ttymxc0,115200 root=/dev/mmcblk0p3 rootwait"; +	}; + +	memory { +		reg = <0x90000000 0x20000000>; +	}; + +	soc { +		aips@70000000 { /* aips-1 */ +			spba@70000000 { +				esdhc@70004000 { /* ESDHC1 */ +					fsl,cd-internal; +					fsl,wp-internal; +					status = "okay"; +				}; + +				esdhc@70008000 { /* ESDHC2 */ +					cd-gpios = <&gpio0 6 0>; /* GPIO1_6 */ +					wp-gpios = <&gpio0 5 0>; /* GPIO1_5 */ +					status = "okay"; +				}; + +				uart2: uart@7000c000 { /* UART3 */ +					fsl,uart-has-rtscts; +					status = "okay"; +				}; + +				ecspi@70010000 { /* ECSPI1 */ +					fsl,spi-num-chipselects = <2>; +					cs-gpios = <&gpio3 24 0>, /* GPIO4_24 */ +						   <&gpio3 25 0>; /* GPIO4_25 */ +					status = "okay"; + +					pmic: mc13892@0 { +						#address-cells = <1>; +						#size-cells = <0>; +						compatible = "fsl,mc13892"; +						spi-max-frequency = <6000000>; +						reg = <0>; +						mc13xxx-irq-gpios = <&gpio0 8 0>; /* GPIO1_8 */ +						fsl,mc13xxx-uses-regulator; +					}; + +					flash: at45db321d@1 { +						#address-cells = <1>; +						#size-cells = <1>; +						compatible = "atmel,at45db321d", "atmel,at45", "atmel,dataflash"; +						spi-max-frequency = <25000000>; +						reg = <1>; + +						partition@0 { +							label = "U-Boot"; +							reg = <0x0 0x40000>; +							read-only; +						}; + +						partition@40000 { +							label = "Kernel"; +							reg = <0x40000 0x3c0000>; +						}; +					}; +				}; +			}; + +			wdog@73f98000 { /* WDOG1 */ +				status = "okay"; +			}; + +			iomuxc@73fa8000 { +				compatible = "fsl,imx51-iomuxc-babbage"; +				reg = <0x73fa8000 0x4000>; +			}; + +			uart0: uart@73fbc000 { +				fsl,uart-has-rtscts; +				status = "okay"; +			}; + +			uart1: uart@73fc0000 { +				status = "okay"; +			}; +		}; + +		aips@80000000 {	/* aips-2 */ +			sdma@83fb0000 { +				fsl,sdma-ram-script-name = "imx/sdma/sdma-imx51.bin"; +			}; + +			i2c@83fc4000 { /* I2C2 */ +				status = "okay"; + +				codec: sgtl5000@0a { +					compatible = "fsl,sgtl5000"; +					reg = <0x0a>; +				}; +			}; + +			fec@83fec000 { +				phy-mode = "mii"; +				status = "okay"; +			}; +		}; +	}; + +	gpio-keys { +		compatible = "gpio-keys"; + +		power { +			label = "Power Button"; +			gpios = <&gpio1 21 0>; +			linux,code = <116>; /* KEY_POWER */ +			gpio-key,wakeup; +		}; +	}; +}; diff --git a/arch/arm/boot/dts/imx51.dtsi b/arch/arm/boot/dts/imx51.dtsi new file mode 100644 index 00000000000..327ab8e3a4c --- /dev/null +++ b/arch/arm/boot/dts/imx51.dtsi @@ -0,0 +1,246 @@ +/* + * 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/ "skeleton.dtsi" + +/ { +	aliases { +		serial0 = &uart0; +		serial1 = &uart1; +		serial2 = &uart2; +	}; + +	tzic: tz-interrupt-controller@e0000000 { +		compatible = "fsl,imx51-tzic", "fsl,tzic"; +		interrupt-controller; +		#interrupt-cells = <1>; +		reg = <0xe0000000 0x4000>; +	}; + +	clocks { +		#address-cells = <1>; +		#size-cells = <0>; + +		ckil { +			compatible = "fsl,imx-ckil", "fixed-clock"; +			clock-frequency = <32768>; +		}; + +		ckih1 { +			compatible = "fsl,imx-ckih1", "fixed-clock"; +			clock-frequency = <22579200>; +		}; + +		ckih2 { +			compatible = "fsl,imx-ckih2", "fixed-clock"; +			clock-frequency = <0>; +		}; + +		osc { +			compatible = "fsl,imx-osc", "fixed-clock"; +			clock-frequency = <24000000>; +		}; +	}; + +	soc { +		#address-cells = <1>; +		#size-cells = <1>; +		compatible = "simple-bus"; +		interrupt-parent = <&tzic>; +		ranges; + +		aips@70000000 { /* AIPS1 */ +			compatible = "fsl,aips-bus", "simple-bus"; +			#address-cells = <1>; +			#size-cells = <1>; +			reg = <0x70000000 0x10000000>; +			ranges; + +			spba@70000000 { +				compatible = "fsl,spba-bus", "simple-bus"; +				#address-cells = <1>; +				#size-cells = <1>; +				reg = <0x70000000 0x40000>; +				ranges; + +				esdhc@70004000 { /* ESDHC1 */ +					compatible = "fsl,imx51-esdhc"; +					reg = <0x70004000 0x4000>; +					interrupts = <1>; +					status = "disabled"; +				}; + +				esdhc@70008000 { /* ESDHC2 */ +					compatible = "fsl,imx51-esdhc"; +					reg = <0x70008000 0x4000>; +					interrupts = <2>; +					status = "disabled"; +				}; + +				uart2: uart@7000c000 { /* UART3 */ +					compatible = "fsl,imx51-uart", "fsl,imx21-uart"; +					reg = <0x7000c000 0x4000>; +					interrupts = <33>; +					status = "disabled"; +				}; + +				ecspi@70010000 { /* ECSPI1 */ +					#address-cells = <1>; +					#size-cells = <0>; +					compatible = "fsl,imx51-ecspi"; +					reg = <0x70010000 0x4000>; +					interrupts = <36>; +					status = "disabled"; +				}; + +				esdhc@70020000 { /* ESDHC3 */ +					compatible = "fsl,imx51-esdhc"; +					reg = <0x70020000 0x4000>; +					interrupts = <3>; +					status = "disabled"; +				}; + +				esdhc@70024000 { /* ESDHC4 */ +					compatible = "fsl,imx51-esdhc"; +					reg = <0x70024000 0x4000>; +					interrupts = <4>; +					status = "disabled"; +				}; +			}; + +			gpio0: gpio@73f84000 { /* GPIO1 */ +				compatible = "fsl,imx51-gpio", "fsl,imx31-gpio"; +				reg = <0x73f84000 0x4000>; +				interrupts = <50 51>; +				gpio-controller; +				#gpio-cells = <2>; +				interrupt-controller; +				#interrupt-cells = <1>; +			}; + +			gpio1: gpio@73f88000 { /* GPIO2 */ +				compatible = "fsl,imx51-gpio", "fsl,imx31-gpio"; +				reg = <0x73f88000 0x4000>; +				interrupts = <52 53>; +				gpio-controller; +				#gpio-cells = <2>; +				interrupt-controller; +				#interrupt-cells = <1>; +			}; + +			gpio2: gpio@73f8c000 { /* GPIO3 */ +				compatible = "fsl,imx51-gpio", "fsl,imx31-gpio"; +				reg = <0x73f8c000 0x4000>; +				interrupts = <54 55>; +				gpio-controller; +				#gpio-cells = <2>; +				interrupt-controller; +				#interrupt-cells = <1>; +			}; + +			gpio3: gpio@73f90000 { /* GPIO4 */ +				compatible = "fsl,imx51-gpio", "fsl,imx31-gpio"; +				reg = <0x73f90000 0x4000>; +				interrupts = <56 57>; +				gpio-controller; +				#gpio-cells = <2>; +				interrupt-controller; +				#interrupt-cells = <1>; +			}; + +			wdog@73f98000 { /* WDOG1 */ +				compatible = "fsl,imx51-wdt", "fsl,imx21-wdt"; +				reg = <0x73f98000 0x4000>; +				interrupts = <58>; +				status = "disabled"; +			}; + +			wdog@73f9c000 { /* WDOG2 */ +				compatible = "fsl,imx51-wdt", "fsl,imx21-wdt"; +				reg = <0x73f9c000 0x4000>; +				interrupts = <59>; +				status = "disabled"; +			}; + +			uart0: uart@73fbc000 { +				compatible = "fsl,imx51-uart", "fsl,imx21-uart"; +				reg = <0x73fbc000 0x4000>; +				interrupts = <31>; +				status = "disabled"; +			}; + +			uart1: uart@73fc0000 { +				compatible = "fsl,imx51-uart", "fsl,imx21-uart"; +				reg = <0x73fc0000 0x4000>; +				interrupts = <32>; +				status = "disabled"; +			}; +		}; + +		aips@80000000 {	/* AIPS2 */ +			compatible = "fsl,aips-bus", "simple-bus"; +			#address-cells = <1>; +			#size-cells = <1>; +			reg = <0x80000000 0x10000000>; +			ranges; + +			ecspi@83fac000 { /* ECSPI2 */ +				#address-cells = <1>; +				#size-cells = <0>; +				compatible = "fsl,imx51-ecspi"; +				reg = <0x83fac000 0x4000>; +				interrupts = <37>; +				status = "disabled"; +			}; + +			sdma@83fb0000 { +				compatible = "fsl,imx51-sdma", "fsl,imx35-sdma"; +				reg = <0x83fb0000 0x4000>; +				interrupts = <6>; +			}; + +			cspi@83fc0000 { +				#address-cells = <1>; +				#size-cells = <0>; +				compatible = "fsl,imx51-cspi", "fsl,imx35-cspi"; +				reg = <0x83fc0000 0x4000>; +				interrupts = <38>; +				status = "disabled"; +			}; + +			i2c@83fc4000 { /* I2C2 */ +				#address-cells = <1>; +				#size-cells = <0>; +				compatible = "fsl,imx51-i2c", "fsl,imx1-i2c"; +				reg = <0x83fc4000 0x4000>; +				interrupts = <63>; +				status = "disabled"; +			}; + +			i2c@83fc8000 { /* I2C1 */ +				#address-cells = <1>; +				#size-cells = <0>; +				compatible = "fsl,imx51-i2c", "fsl,imx1-i2c"; +				reg = <0x83fc8000 0x4000>; +				interrupts = <62>; +				status = "disabled"; +			}; + +			fec@83fec000 { +				compatible = "fsl,imx51-fec", "fsl,imx27-fec"; +				reg = <0x83fec000 0x4000>; +				interrupts = <87>; +				status = "disabled"; +			}; +		}; +	}; +}; diff --git a/arch/arm/boot/dts/imx53-ard.dts b/arch/arm/boot/dts/imx53-ard.dts new file mode 100644 index 00000000000..2ab7f80a0a3 --- /dev/null +++ b/arch/arm/boot/dts/imx53-ard.dts @@ -0,0 +1,113 @@ +/* + * 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 + */ + +/dts-v1/; +/include/ "imx53.dtsi" + +/ { +	model = "Freescale i.MX53 Automotive Reference Design Board"; +	compatible = "fsl,imx53-ard", "fsl,imx53"; + +	chosen { +		bootargs = "console=ttymxc0,115200 root=/dev/mmcblk0p3 rootwait"; +	}; + +	memory { +		reg = <0x70000000 0x40000000>; +	}; + +	soc { +		aips@50000000 { /* AIPS1 */ +			spba@50000000 { +				esdhc@50004000 { /* ESDHC1 */ +					cd-gpios = <&gpio0 1 0>; /* GPIO1_1 */ +					wp-gpios = <&gpio0 9 0>; /* GPIO1_9 */ +					status = "okay"; +				}; +			}; + +			wdog@53f98000 { /* WDOG1 */ +				status = "okay"; +			}; + +			iomuxc@53fa8000 { +				compatible = "fsl,imx53-iomuxc-ard"; +				reg = <0x53fa8000 0x4000>; +			}; + +			uart0: uart@53fbc000 { /* UART1 */ +				status = "okay"; +			}; +		}; + +		aips@60000000 {	/* AIPS2 */ +			sdma@63fb0000 { +				fsl,sdma-ram-script-name = "imx/sdma/sdma-imx53.bin"; +			}; +		}; +	}; + +	eim-cs1@f4000000 { +		#address-cells = <1>; +		#size-cells = <1>; +		compatible = "fsl,eim-bus", "simple-bus"; +		reg = <0xf4000000 0x3ff0000>; +		ranges; + +		lan9220@f4000000 { +			compatible = "smsc,lan9220", "smsc,lan9115"; +			reg = <0xf4000000 0x2000000>; +			phy-mode = "mii"; +			interrupt-parent = <&gpio1>; +			interrupts = <31>; +			reg-io-width = <4>; +			smsc,irq-push-pull; +		}; +	}; + +	gpio-keys { +		compatible = "gpio-keys"; + +		home { +			label = "Home"; +			gpios = <&gpio4 10 0>; /* GPIO5_10 */ +			linux,code = <102>; /* KEY_HOME */ +			gpio-key,wakeup; +		}; + +		back { +			label = "Back"; +			gpios = <&gpio4 11 0>; /* GPIO5_11 */ +			linux,code = <158>; /* KEY_BACK */ +			gpio-key,wakeup; +		}; + +		program { +			label = "Program"; +			gpios = <&gpio4 12 0>; /* GPIO5_12 */ +			linux,code = <362>; /* KEY_PROGRAM */ +			gpio-key,wakeup; +		}; + +		volume-up { +			label = "Volume Up"; +			gpios = <&gpio4 13 0>; /* GPIO5_13 */ +			linux,code = <115>; /* KEY_VOLUMEUP */ +		}; + +		volume-down { +			label = "Volume Down"; +			gpios = <&gpio3 0 0>; /* GPIO4_0 */ +			linux,code = <114>; /* KEY_VOLUMEDOWN */ +		}; +	}; +}; diff --git a/arch/arm/boot/dts/imx53-evk.dts b/arch/arm/boot/dts/imx53-evk.dts new file mode 100644 index 00000000000..3f3a88185ff --- /dev/null +++ b/arch/arm/boot/dts/imx53-evk.dts @@ -0,0 +1,120 @@ +/* + * 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 + */ + +/dts-v1/; +/include/ "imx53.dtsi" + +/ { +	model = "Freescale i.MX53 Evaluation Kit"; +	compatible = "fsl,imx53-evk", "fsl,imx53"; + +	chosen { +		bootargs = "console=ttymxc0,115200 root=/dev/mmcblk0p3 rootwait"; +	}; + +	memory { +		reg = <0x70000000 0x80000000>; +	}; + +	soc { +		aips@50000000 { /* AIPS1 */ +			spba@50000000 { +				esdhc@50004000 { /* ESDHC1 */ +					cd-gpios = <&gpio2 13 0>; /* GPIO3_13 */ +					wp-gpios = <&gpio2 14 0>; /* GPIO3_14 */ +					status = "okay"; +				}; + +				ecspi@50010000 { /* ECSPI1 */ +					fsl,spi-num-chipselects = <2>; +					cs-gpios = <&gpio1 30 0>, /* GPIO2_30 */ +						   <&gpio2 19 0>; /* GPIO3_19 */ +					status = "okay"; + +					flash: at45db321d@1 { +						#address-cells = <1>; +						#size-cells = <1>; +						compatible = "atmel,at45db321d", "atmel,at45", "atmel,dataflash"; +						spi-max-frequency = <25000000>; +						reg = <1>; + +						partition@0 { +							label = "U-Boot"; +							reg = <0x0 0x40000>; +							read-only; +						}; + +						partition@40000 { +							label = "Kernel"; +							reg = <0x40000 0x3c0000>; +						}; +					}; +				}; + +				esdhc@50020000 { /* ESDHC3 */ +					cd-gpios = <&gpio2 11 0>; /* GPIO3_11 */ +					wp-gpios = <&gpio2 12 0>; /* GPIO3_12 */ +					status = "okay"; +				}; +			}; + +			wdog@53f98000 { /* WDOG1 */ +				status = "okay"; +			}; + +			iomuxc@53fa8000 { +				compatible = "fsl,imx53-iomuxc-evk"; +				reg = <0x53fa8000 0x4000>; +			}; + +			uart0: uart@53fbc000 { /* UART1 */ +				status = "okay"; +			}; +		}; + +		aips@60000000 {	/* AIPS2 */ +			sdma@63fb0000 { +				fsl,sdma-ram-script-name = "imx/sdma/sdma-imx53.bin"; +			}; + +			i2c@63fc4000 { /* I2C2 */ +				status = "okay"; + +				pmic: mc13892@08 { +					compatible = "fsl,mc13892", "fsl,mc13xxx"; +					reg = <0x08>; +				}; + +				codec: sgtl5000@0a { +					compatible = "fsl,sgtl5000"; +					reg = <0x0a>; +				}; +			}; + +			fec@63fec000 { +				phy-mode = "rmii"; +				phy-reset-gpios = <&gpio6 6 0>; /* GPIO7_6 */ +				status = "okay"; +			}; +		}; +	}; + +	leds { +		compatible = "gpio-leds"; + +		green { +			label = "Heartbeat"; +			gpios = <&gpio6 7 0>; /* GPIO7_7 */ +			linux,default-trigger = "heartbeat"; +		}; +	}; +}; diff --git a/arch/arm/boot/dts/imx53-qsb.dts b/arch/arm/boot/dts/imx53-qsb.dts new file mode 100644 index 00000000000..ae6de6d0c3f --- /dev/null +++ b/arch/arm/boot/dts/imx53-qsb.dts @@ -0,0 +1,125 @@ +/* + * 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 + */ + +/dts-v1/; +/include/ "imx53.dtsi" + +/ { +	model = "Freescale i.MX53 Quick Start Board"; +	compatible = "fsl,imx53-qsb", "fsl,imx53"; + +	chosen { +		bootargs = "console=ttymxc0,115200 root=/dev/mmcblk0p3 rootwait"; +	}; + +	memory { +		reg = <0x70000000 0x40000000>; +	}; + +	soc { +		aips@50000000 { /* AIPS1 */ +			spba@50000000 { +				esdhc@50004000 { /* ESDHC1 */ +					cd-gpios = <&gpio2 13 0>; /* GPIO3_13 */ +					status = "okay"; +				}; + +				esdhc@50020000 { /* ESDHC3 */ +					cd-gpios = <&gpio2 11 0>; /* GPIO3_11 */ +					wp-gpios = <&gpio2 12 0>; /* GPIO3_12 */ +					status = "okay"; +				}; +			}; + +			wdog@53f98000 { /* WDOG1 */ +				status = "okay"; +			}; + +			iomuxc@53fa8000 { +				compatible = "fsl,imx53-iomuxc-qsb"; +				reg = <0x53fa8000 0x4000>; +			}; + +			uart0: uart@53fbc000 { /* UART1 */ +				status = "okay"; +			}; +		}; + +		aips@60000000 {	/* AIPS2 */ +			sdma@63fb0000 { +				fsl,sdma-ram-script-name = "imx/sdma/sdma-imx53.bin"; +			}; + +			i2c@63fc4000 { /* I2C2 */ +				status = "okay"; + +				codec: sgtl5000@0a { +					compatible = "fsl,sgtl5000"; +					reg = <0x0a>; +				}; +			}; + +			i2c@63fc8000 { /* I2C1 */ +				status = "okay"; + +				accelerometer: mma8450@1c { +					compatible = "fsl,mma8450"; +					reg = <0x1c>; +				}; + +				pmic: dialog@48 { +					compatible = "dialog,da9053", "dialog,da9052"; +					reg = <0x48>; +				}; +			}; + +			fec@63fec000 { +				phy-mode = "rmii"; +				phy-reset-gpios = <&gpio6 6 0>; /* GPIO7_6 */ +				status = "okay"; +			}; +		}; +	}; + +	gpio-keys { +		compatible = "gpio-keys"; + +		power { +			label = "Power Button"; +			gpios = <&gpio0 8 0>; /* GPIO1_8 */ +			linux,code = <116>; /* KEY_POWER */ +			gpio-key,wakeup; +		}; + +		volume-up { +			label = "Volume Up"; +			gpios = <&gpio1 14 0>; /* GPIO2_14 */ +			linux,code = <115>; /* KEY_VOLUMEUP */ +		}; + +		volume-down { +			label = "Volume Down"; +			gpios = <&gpio1 15 0>; /* GPIO2_15 */ +			linux,code = <114>; /* KEY_VOLUMEDOWN */ +		}; +	}; + +	leds { +		compatible = "gpio-leds"; + +		user { +			label = "Heartbeat"; +			gpios = <&gpio6 7 0>; /* GPIO7_7 */ +			linux,default-trigger = "heartbeat"; +		}; +	}; +}; diff --git a/arch/arm/boot/dts/imx53-smd.dts b/arch/arm/boot/dts/imx53-smd.dts new file mode 100644 index 00000000000..b1c062eea71 --- /dev/null +++ b/arch/arm/boot/dts/imx53-smd.dts @@ -0,0 +1,169 @@ +/* + * 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 + */ + +/dts-v1/; +/include/ "imx53.dtsi" + +/ { +	model = "Freescale i.MX53 Smart Mobile Reference Design Board"; +	compatible = "fsl,imx53-smd", "fsl,imx53"; + +	chosen { +		bootargs = "console=ttymxc0,115200 root=/dev/mmcblk0p3 rootwait"; +	}; + +	memory { +		reg = <0x70000000 0x40000000>; +	}; + +	soc { +		aips@50000000 { /* AIPS1 */ +			spba@50000000 { +				esdhc@50004000 { /* ESDHC1 */ +					cd-gpios = <&gpio2 13 0>; /* GPIO3_13 */ +					wp-gpios = <&gpio3 11 0>; /* GPIO4_11 */ +					status = "okay"; +				}; + +				esdhc@50008000 { /* ESDHC2 */ +					fsl,card-wired; +					status = "okay"; +				}; + +				uart2: uart@5000c000 { /* UART3 */ +					fsl,uart-has-rtscts; +					status = "okay"; +				}; + +				ecspi@50010000 { /* ECSPI1 */ +					fsl,spi-num-chipselects = <2>; +					cs-gpios = <&gpio1 30 0>, /* GPIO2_30 */ +						   <&gpio2 19 0>; /* GPIO3_19 */ +					status = "okay"; + +					zigbee: mc1323@0 { +						compatible = "fsl,mc1323"; +						spi-max-frequency = <8000000>; +						reg = <0>; +					}; + +					flash: m25p32@1 { +						#address-cells = <1>; +						#size-cells = <1>; +						compatible = "st,m25p32", "st,m25p"; +						spi-max-frequency = <20000000>; +						reg = <1>; + +						partition@0 { +							label = "U-Boot"; +							reg = <0x0 0x40000>; +							read-only; +						}; + +						partition@40000 { +							label = "Kernel"; +							reg = <0x40000 0x3c0000>; +						}; +					}; +				}; + +				esdhc@50020000 { /* ESDHC3 */ +					fsl,card-wired; +					status = "okay"; +				}; +			}; + +			wdog@53f98000 { /* WDOG1 */ +				status = "okay"; +			}; + +			iomuxc@53fa8000 { +				compatible = "fsl,imx53-iomuxc-smd"; +				reg = <0x53fa8000 0x4000>; +			}; + +			uart0: uart@53fbc000 { /* UART1 */ +				status = "okay"; +			}; + +			uart1: uart@53fc0000 { /* UART2 */ +				status = "okay"; +			}; +		}; + +		aips@60000000 {	/* AIPS2 */ +			sdma@63fb0000 { +				fsl,sdma-ram-script-name = "imx/sdma/sdma-imx53.bin"; +			}; + +			i2c@63fc4000 { /* I2C2 */ +				status = "okay"; + +				codec: sgtl5000@0a { +					compatible = "fsl,sgtl5000"; +					reg = <0x0a>; +				}; + +				magnetometer: mag3110@0e { +					compatible = "fsl,mag3110"; +					reg = <0x0e>; +				}; + +				touchkey: mpr121@5a { +					compatible = "fsl,mpr121"; +					reg = <0x5a>; +				}; +			}; + +			i2c@63fc8000 { /* I2C1 */ +				status = "okay"; + +				accelerometer: mma8450@1c { +					compatible = "fsl,mma8450"; +					reg = <0x1c>; +				}; + +				camera: ov5642@3c { +					compatible = "ovti,ov5642"; +					reg = <0x3c>; +				}; + +				pmic: dialog@48 { +					compatible = "dialog,da9053", "dialog,da9052"; +					reg = <0x48>; +				}; +			}; + +			fec@63fec000 { +				phy-mode = "rmii"; +				phy-reset-gpios = <&gpio6 6 0>; /* GPIO7_6 */ +				status = "okay"; +			}; +		}; +	}; + +	gpio-keys { +		compatible = "gpio-keys"; + +		volume-up { +			label = "Volume Up"; +			gpios = <&gpio1 14 0>; /* GPIO2_14 */ +			linux,code = <115>; /* KEY_VOLUMEUP */ +		}; + +		volume-down { +			label = "Volume Down"; +			gpios = <&gpio1 15 0>; /* GPIO2_15 */ +			linux,code = <114>; /* KEY_VOLUMEDOWN */ +		}; +	}; +}; diff --git a/arch/arm/boot/dts/imx53.dtsi b/arch/arm/boot/dts/imx53.dtsi new file mode 100644 index 00000000000..099cd84ee37 --- /dev/null +++ b/arch/arm/boot/dts/imx53.dtsi @@ -0,0 +1,301 @@ +/* + * 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/ "skeleton.dtsi" + +/ { +	aliases { +		serial0 = &uart0; +		serial1 = &uart1; +		serial2 = &uart2; +		serial3 = &uart3; +		serial4 = &uart4; +	}; + +	tzic: tz-interrupt-controller@0fffc000 { +		compatible = "fsl,imx53-tzic", "fsl,tzic"; +		interrupt-controller; +		#interrupt-cells = <1>; +		reg = <0x0fffc000 0x4000>; +	}; + +	clocks { +		#address-cells = <1>; +		#size-cells = <0>; + +		ckil { +			compatible = "fsl,imx-ckil", "fixed-clock"; +			clock-frequency = <32768>; +		}; + +		ckih1 { +			compatible = "fsl,imx-ckih1", "fixed-clock"; +			clock-frequency = <22579200>; +		}; + +		ckih2 { +			compatible = "fsl,imx-ckih2", "fixed-clock"; +			clock-frequency = <0>; +		}; + +		osc { +			compatible = "fsl,imx-osc", "fixed-clock"; +			clock-frequency = <24000000>; +		}; +	}; + +	soc { +		#address-cells = <1>; +		#size-cells = <1>; +		compatible = "simple-bus"; +		interrupt-parent = <&tzic>; +		ranges; + +		aips@50000000 { /* AIPS1 */ +			compatible = "fsl,aips-bus", "simple-bus"; +			#address-cells = <1>; +			#size-cells = <1>; +			reg = <0x50000000 0x10000000>; +			ranges; + +			spba@50000000 { +				compatible = "fsl,spba-bus", "simple-bus"; +				#address-cells = <1>; +				#size-cells = <1>; +				reg = <0x50000000 0x40000>; +				ranges; + +				esdhc@50004000 { /* ESDHC1 */ +					compatible = "fsl,imx53-esdhc"; +					reg = <0x50004000 0x4000>; +					interrupts = <1>; +					status = "disabled"; +				}; + +				esdhc@50008000 { /* ESDHC2 */ +					compatible = "fsl,imx53-esdhc"; +					reg = <0x50008000 0x4000>; +					interrupts = <2>; +					status = "disabled"; +				}; + +				uart2: uart@5000c000 { /* UART3 */ +					compatible = "fsl,imx53-uart", "fsl,imx21-uart"; +					reg = <0x5000c000 0x4000>; +					interrupts = <33>; +					status = "disabled"; +				}; + +				ecspi@50010000 { /* ECSPI1 */ +					#address-cells = <1>; +					#size-cells = <0>; +					compatible = "fsl,imx53-ecspi", "fsl,imx51-ecspi"; +					reg = <0x50010000 0x4000>; +					interrupts = <36>; +					status = "disabled"; +				}; + +				esdhc@50020000 { /* ESDHC3 */ +					compatible = "fsl,imx53-esdhc"; +					reg = <0x50020000 0x4000>; +					interrupts = <3>; +					status = "disabled"; +				}; + +				esdhc@50024000 { /* ESDHC4 */ +					compatible = "fsl,imx53-esdhc"; +					reg = <0x50024000 0x4000>; +					interrupts = <4>; +					status = "disabled"; +				}; +			}; + +			gpio0: gpio@53f84000 { /* GPIO1 */ +				compatible = "fsl,imx53-gpio", "fsl,imx31-gpio"; +				reg = <0x53f84000 0x4000>; +				interrupts = <50 51>; +				gpio-controller; +				#gpio-cells = <2>; +				interrupt-controller; +				#interrupt-cells = <1>; +			}; + +			gpio1: gpio@53f88000 { /* GPIO2 */ +				compatible = "fsl,imx53-gpio", "fsl,imx31-gpio"; +				reg = <0x53f88000 0x4000>; +				interrupts = <52 53>; +				gpio-controller; +				#gpio-cells = <2>; +				interrupt-controller; +				#interrupt-cells = <1>; +			}; + +			gpio2: gpio@53f8c000 { /* GPIO3 */ +				compatible = "fsl,imx53-gpio", "fsl,imx31-gpio"; +				reg = <0x53f8c000 0x4000>; +				interrupts = <54 55>; +				gpio-controller; +				#gpio-cells = <2>; +				interrupt-controller; +				#interrupt-cells = <1>; +			}; + +			gpio3: gpio@53f90000 { /* GPIO4 */ +				compatible = "fsl,imx53-gpio", "fsl,imx31-gpio"; +				reg = <0x53f90000 0x4000>; +				interrupts = <56 57>; +				gpio-controller; +				#gpio-cells = <2>; +				interrupt-controller; +				#interrupt-cells = <1>; +			}; + +			wdog@53f98000 { /* WDOG1 */ +				compatible = "fsl,imx53-wdt", "fsl,imx21-wdt"; +				reg = <0x53f98000 0x4000>; +				interrupts = <58>; +				status = "disabled"; +			}; + +			wdog@53f9c000 { /* WDOG2 */ +				compatible = "fsl,imx53-wdt", "fsl,imx21-wdt"; +				reg = <0x53f9c000 0x4000>; +				interrupts = <59>; +				status = "disabled"; +			}; + +			uart0: uart@53fbc000 { /* UART1 */ +				compatible = "fsl,imx53-uart", "fsl,imx21-uart"; +				reg = <0x53fbc000 0x4000>; +				interrupts = <31>; +				status = "disabled"; +			}; + +			uart1: uart@53fc0000 { /* UART2 */ +				compatible = "fsl,imx53-uart", "fsl,imx21-uart"; +				reg = <0x53fc0000 0x4000>; +				interrupts = <32>; +				status = "disabled"; +			}; + +			gpio4: gpio@53fdc000 { /* GPIO5 */ +				compatible = "fsl,imx53-gpio", "fsl,imx31-gpio"; +				reg = <0x53fdc000 0x4000>; +				interrupts = <103 104>; +				gpio-controller; +				#gpio-cells = <2>; +				interrupt-controller; +				#interrupt-cells = <1>; +			}; + +			gpio5: gpio@53fe0000 { /* GPIO6 */ +				compatible = "fsl,imx53-gpio", "fsl,imx31-gpio"; +				reg = <0x53fe0000 0x4000>; +				interrupts = <105 106>; +				gpio-controller; +				#gpio-cells = <2>; +				interrupt-controller; +				#interrupt-cells = <1>; +			}; + +			gpio6: gpio@53fe4000 { /* GPIO7 */ +				compatible = "fsl,imx53-gpio", "fsl,imx31-gpio"; +				reg = <0x53fe4000 0x4000>; +				interrupts = <107 108>; +				gpio-controller; +				#gpio-cells = <2>; +				interrupt-controller; +				#interrupt-cells = <1>; +			}; + +			i2c@53fec000 { /* I2C3 */ +				#address-cells = <1>; +				#size-cells = <0>; +				compatible = "fsl,imx53-i2c", "fsl,imx1-i2c"; +				reg = <0x53fec000 0x4000>; +				interrupts = <64>; +				status = "disabled"; +			}; + +			uart3: uart@53ff0000 { /* UART4 */ +				compatible = "fsl,imx53-uart", "fsl,imx21-uart"; +				reg = <0x53ff0000 0x4000>; +				interrupts = <13>; +				status = "disabled"; +			}; +		}; + +		aips@60000000 {	/* AIPS2 */ +			compatible = "fsl,aips-bus", "simple-bus"; +			#address-cells = <1>; +			#size-cells = <1>; +			reg = <0x60000000 0x10000000>; +			ranges; + +			uart4: uart@63f90000 { /* UART5 */ +				compatible = "fsl,imx53-uart", "fsl,imx21-uart"; +				reg = <0x63f90000 0x4000>; +				interrupts = <86>; +				status = "disabled"; +			}; + +			ecspi@63fac000 { /* ECSPI2 */ +				#address-cells = <1>; +				#size-cells = <0>; +				compatible = "fsl,imx53-ecspi", "fsl,imx51-ecspi"; +				reg = <0x63fac000 0x4000>; +				interrupts = <37>; +				status = "disabled"; +			}; + +			sdma@63fb0000 { +				compatible = "fsl,imx53-sdma", "fsl,imx35-sdma"; +				reg = <0x63fb0000 0x4000>; +				interrupts = <6>; +			}; + +			cspi@63fc0000 { +				#address-cells = <1>; +				#size-cells = <0>; +				compatible = "fsl,imx53-cspi", "fsl,imx35-cspi"; +				reg = <0x63fc0000 0x4000>; +				interrupts = <38>; +				status = "disabled"; +			}; + +			i2c@63fc4000 { /* I2C2 */ +				#address-cells = <1>; +				#size-cells = <0>; +				compatible = "fsl,imx53-i2c", "fsl,imx1-i2c"; +				reg = <0x63fc4000 0x4000>; +				interrupts = <63>; +				status = "disabled"; +			}; + +			i2c@63fc8000 { /* I2C1 */ +				#address-cells = <1>; +				#size-cells = <0>; +				compatible = "fsl,imx53-i2c", "fsl,imx1-i2c"; +				reg = <0x63fc8000 0x4000>; +				interrupts = <62>; +				status = "disabled"; +			}; + +			fec@63fec000 { +				compatible = "fsl,imx53-fec", "fsl,imx25-fec"; +				reg = <0x63fec000 0x4000>; +				interrupts = <87>; +				status = "disabled"; +			}; +		}; +	}; +}; diff --git a/arch/arm/boot/dts/msm8660-surf.dts b/arch/arm/boot/dts/msm8660-surf.dts new file mode 100644 index 00000000000..15ded0deaa7 --- /dev/null +++ b/arch/arm/boot/dts/msm8660-surf.dts @@ -0,0 +1,24 @@ +/dts-v1/; + +/include/ "skeleton.dtsi" + +/ { +	model = "Qualcomm MSM8660 SURF"; +	compatible = "qcom,msm8660-surf", "qcom,msm8660"; +	interrupt-parent = <&intc>; + +	intc: interrupt-controller@02080000 { +		compatible = "qcom,msm-8660-qgic"; +		interrupt-controller; +		#interrupt-cells = <1>; +		reg = < 0x02080000 0x1000 >, +		      < 0x02081000 0x1000 >; +	}; + +	serial@19c400000 { +		compatible = "qcom,msm-hsuart", "qcom,msm-uart"; +		reg = <0x19c40000 0x1000>, +		      <0x19c00000 0x1000>; +		interrupts = <195>; +	}; +}; diff --git a/arch/arm/boot/dts/usb_a9g20.dts b/arch/arm/boot/dts/usb_a9g20.dts new file mode 100644 index 00000000000..d66e2c00ac3 --- /dev/null +++ b/arch/arm/boot/dts/usb_a9g20.dts @@ -0,0 +1,30 @@ +/* + * usb_a9g20.dts - Device Tree file for Caloa USB A9G20 board + * + *  Copyright (C) 2011 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> + * + * Licensed under GPLv2 or later. + */ +/dts-v1/; +/include/ "at91sam9g20.dtsi" + +/ { +	model = "Calao USB A9G20"; +	compatible = "calao,usb-a9g20", "atmel,at91sam9g20", "atmel,at91sam9"; + +	chosen { +		bootargs = "mem=64M console=ttyS0,115200 mtdparts=atmel_nand:128k(at91bootstrap),256k(barebox)ro,128k(bareboxenv),128k(bareboxenv2),4M(kernel),120M(rootfs),-(data) root=/dev/mtdblock5 rw rootfstype=ubifs"; +	}; + +	memory@20000000 { +		reg = <0x20000000 0x4000000>; +	}; + +	ahb { +		apb { +			dbgu: serial@fffff200 { +				status = "okay"; +			}; +		}; +	}; +}; diff --git a/arch/arm/common/Kconfig b/arch/arm/common/Kconfig index 4b71766fb21..74df9ca2be3 100644 --- a/arch/arm/common/Kconfig +++ b/arch/arm/common/Kconfig @@ -1,4 +1,5 @@  config ARM_GIC +	select IRQ_DOMAIN  	bool  config ARM_VIC diff --git a/arch/arm/common/gic.c b/arch/arm/common/gic.c index a8fc6b23759..0e6ae470c94 100644 --- a/arch/arm/common/gic.c +++ b/arch/arm/common/gic.c @@ -24,11 +24,17 @@   */  #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> @@ -75,8 +81,7 @@ static inline void __iomem *gic_cpu_base(struct irq_data *d)  static inline unsigned int gic_irq(struct irq_data *d)  { -	struct gic_chip_data *gic_data = irq_data_get_irq_chip_data(d); -	return d->irq - gic_data->irq_offset; +	return d->hwirq;  }  /* @@ -84,7 +89,7 @@ static inline unsigned int gic_irq(struct irq_data *d)   */  static void gic_mask_irq(struct irq_data *d)  { -	u32 mask = 1 << (d->irq % 32); +	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); @@ -95,7 +100,7 @@ static void gic_mask_irq(struct irq_data *d)  static void gic_unmask_irq(struct irq_data *d)  { -	u32 mask = 1 << (d->irq % 32); +	u32 mask = 1 << (gic_irq(d) % 32);  	raw_spin_lock(&irq_controller_lock);  	if (gic_arch_extn.irq_unmask) @@ -176,7 +181,7 @@ 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 = (d->irq % 4) * 8; +	unsigned int shift = (gic_irq(d) % 4) * 8;  	unsigned int cpu = cpumask_any_and(mask_val, cpu_online_mask);  	u32 val, mask, bit; @@ -227,7 +232,7 @@ static void gic_handle_cascade_irq(unsigned int irq, struct irq_desc *desc)  	if (gic_irq == 1023)  		goto out; -	cascade_irq = gic_irq + chip_data->irq_offset; +	cascade_irq = irq_domain_to_irq(&chip_data->domain, gic_irq);  	if (unlikely(gic_irq < 32 || gic_irq > 1020 || cascade_irq >= NR_IRQS))  		do_bad_IRQ(cascade_irq, desc);  	else @@ -259,14 +264,14 @@ void __init gic_cascade_irq(unsigned int gic_nr, unsigned int irq)  	irq_set_chained_handler(irq, gic_handle_cascade_irq);  } -static void __init gic_dist_init(struct gic_chip_data *gic, -	unsigned int irq_start) +static void __init gic_dist_init(struct gic_chip_data *gic)  { -	unsigned int gic_irqs, irq_limit, i; +	unsigned int i, irq;  	u32 cpumask; +	unsigned int gic_irqs = gic->gic_irqs; +	struct irq_domain *domain = &gic->domain;  	void __iomem *base = gic->dist_base;  	u32 cpu = 0; -	u32 nrppis = 0, ppi_base = 0;  #ifdef CONFIG_SMP  	cpu = cpu_logical_map(smp_processor_id()); @@ -279,34 +284,6 @@ static void __init gic_dist_init(struct gic_chip_data *gic,  	writel_relaxed(0, base + GIC_DIST_CTRL);  	/* -	 * Find out how many interrupts are supported. -	 * The GIC only supports up to 1020 interrupt sources. -	 */ -	gic_irqs = readl_relaxed(base + GIC_DIST_CTR) & 0x1f; -	gic_irqs = (gic_irqs + 1) * 32; -	if (gic_irqs > 1020) -		gic_irqs = 1020; - -	gic->gic_irqs = gic_irqs; - -	/* -	 * Nobody would be insane enough to use PPIs on a secondary -	 * GIC, right? -	 */ -	if (gic == &gic_data[0]) { -		nrppis = (32 - irq_start) & 31; - -		/* The GIC only supports up to 16 PPIs. */ -		if (nrppis > 16) -			BUG(); - -		ppi_base = gic->irq_offset + 32 - nrppis; -	} - -	pr_info("Configuring GIC with %d sources (%d PPIs)\n", -		gic_irqs, (gic == &gic_data[0]) ? nrppis : 0); - -	/*  	 * Set all global interrupts to be level triggered, active low.  	 */  	for (i = 32; i < gic_irqs; i += 16) @@ -332,29 +309,20 @@ static void __init gic_dist_init(struct gic_chip_data *gic,  		writel_relaxed(0xffffffff, base + GIC_DIST_ENABLE_CLEAR + i * 4 / 32);  	/* -	 * Limit number of interrupts registered to the platform maximum -	 */ -	irq_limit = gic->irq_offset + gic_irqs; -	if (WARN_ON(irq_limit > NR_IRQS)) -		irq_limit = NR_IRQS; - -	/*  	 * Setup the Linux IRQ subsystem.  	 */ -	for (i = 0; i < nrppis; i++) { -		int ppi = i + ppi_base; - -		irq_set_percpu_devid(ppi); -		irq_set_chip_and_handler(ppi, &gic_chip, -					 handle_percpu_devid_irq); -		irq_set_chip_data(ppi, gic); -		set_irq_flags(ppi, IRQF_VALID | IRQF_NOAUTOEN); -	} - -	for (i = irq_start + nrppis; i < irq_limit; i++) { -		irq_set_chip_and_handler(i, &gic_chip, handle_fasteoi_irq); -		irq_set_chip_data(i, gic); -		set_irq_flags(i, IRQF_VALID | IRQF_PROBE); +	irq_domain_for_each_irq(domain, i, irq) { +		if (i < 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, gic);  	}  	writel_relaxed(1, base + GIC_DIST_CTRL); @@ -566,23 +534,85 @@ static void __init gic_pm_init(struct gic_chip_data *gic)  }  #endif -void __init gic_init(unsigned int gic_nr, unsigned int irq_start, +#ifdef CONFIG_OF +static int gic_irq_domain_dt_translate(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; +} +#endif + +const struct irq_domain_ops gic_irq_domain_ops = { +#ifdef CONFIG_OF +	.dt_translate = gic_irq_domain_dt_translate, +#endif +}; + +void __init gic_init(unsigned int gic_nr, int irq_start,  	void __iomem *dist_base, void __iomem *cpu_base)  {  	struct gic_chip_data *gic; +	struct irq_domain *domain; +	int gic_irqs;  	BUG_ON(gic_nr >= MAX_GIC_NR);  	gic = &gic_data[gic_nr]; +	domain = &gic->domain;  	gic->dist_base = dist_base;  	gic->cpu_base = cpu_base; -	gic->irq_offset = (irq_start - 1) & ~31; -	if (gic_nr == 0) +	/* +	 * For primary GICs, skip over SGIs. +	 * For secondary GICs, skip over PPIs, too. +	 */ +	if (gic_nr == 0) {  		gic_cpu_base_addr = cpu_base; +		domain->hwirq_base = 16; +		if (irq_start > 0) +			irq_start = (irq_start & ~31) + 16; +	} else +		domain->hwirq_base = 32; + +	/* +	 * Find out how many interrupts are supported. +	 * The GIC only supports up to 1020 interrupt sources. +	 */ +	gic_irqs = readl_relaxed(dist_base + GIC_DIST_CTR) & 0x1f; +	gic_irqs = (gic_irqs + 1) * 32; +	if (gic_irqs > 1020) +		gic_irqs = 1020; +	gic->gic_irqs = gic_irqs; + +	domain->nr_irq = gic_irqs - domain->hwirq_base; +	domain->irq_base = irq_alloc_descs(irq_start, 16, domain->nr_irq, +					   numa_node_id()); +	if (IS_ERR_VALUE(domain->irq_base)) { +		WARN(1, "Cannot allocate irq_descs @ IRQ%d, assuming pre-allocated\n", +		     irq_start); +		domain->irq_base = irq_start; +	} +	domain->priv = gic; +	domain->ops = &gic_irq_domain_ops; +	irq_domain_add(domain);  	gic_chip.flags |= gic_arch_extn.flags; -	gic_dist_init(gic, irq_start); +	gic_dist_init(gic);  	gic_cpu_init(gic);  	gic_pm_init(gic);  } @@ -614,3 +644,35 @@ void gic_raise_softirq(const struct cpumask *mask, unsigned int irq)  	writel_relaxed(map << 16 | irq, gic_data[0].dist_base + 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; +	int irq; +	struct irq_domain *domain = &gic_data[gic_cnt].domain; + +	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"); + +	domain->of_node = of_node_get(node); + +	gic_init(gic_cnt, -1, dist_base, cpu_base); + +	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/include/asm/hardware/gic.h b/arch/arm/include/asm/hardware/gic.h index 14867e12f20..3e91f22046f 100644 --- a/arch/arm/include/asm/hardware/gic.h +++ b/arch/arm/include/asm/hardware/gic.h @@ -33,16 +33,19 @@  #define GIC_DIST_SOFTINT		0xf00  #ifndef __ASSEMBLY__ +#include <linux/irqdomain.h> +struct device_node; +  extern void __iomem *gic_cpu_base_addr;  extern struct irq_chip gic_arch_extn; -void gic_init(unsigned int, unsigned int, void __iomem *, void __iomem *); +void gic_init(unsigned int, int, void __iomem *, void __iomem *); +int gic_of_init(struct device_node *node, struct device_node *parent);  void gic_secondary_init(unsigned int);  void gic_cascade_irq(unsigned int gic_nr, unsigned int irq);  void gic_raise_softirq(const struct cpumask *mask, unsigned int irq);  struct gic_chip_data { -	unsigned int irq_offset;  	void __iomem *dist_base;  	void __iomem *cpu_base;  #ifdef CONFIG_CPU_PM @@ -52,6 +55,9 @@ struct gic_chip_data {  	u32 __percpu *saved_ppi_enable;  	u32 __percpu *saved_ppi_conf;  #endif +#ifdef CONFIG_IRQ_DOMAIN +	struct irq_domain domain; +#endif  	unsigned int gic_irqs;  };  #endif diff --git a/arch/arm/mach-at91/Kconfig b/arch/arm/mach-at91/Kconfig index 04a85c546ab..a6b7991d7fe 100644 --- a/arch/arm/mach-at91/Kconfig +++ b/arch/arm/mach-at91/Kconfig @@ -455,6 +455,17 @@ endif  # ---------------------------------------------------------- +comment "Generic Board Type" + +config MACH_AT91SAM_DT +	bool "Atmel AT91SAM Evaluation Kits with device-tree support" +	select USE_OF +	help +	  Select this if you want to experiment device-tree with +	  an Atmel Evaluation Kit. + +# ---------------------------------------------------------- +  comment "AT91 Board Options"  config MTD_AT91_DATAFLASH_CARD diff --git a/arch/arm/mach-at91/Makefile b/arch/arm/mach-at91/Makefile index d992dd5d932..242174f9f35 100644 --- a/arch/arm/mach-at91/Makefile +++ b/arch/arm/mach-at91/Makefile @@ -76,6 +76,9 @@ obj-$(CONFIG_MACH_SNAPPER_9260)	+= board-snapper9260.o  # AT91SAM9G45 board-specific support  obj-$(CONFIG_MACH_AT91SAM9M10G45EK) += board-sam9m10g45ek.o +# AT91SAM board with device-tree +obj-$(CONFIG_MACH_AT91SAM_DT) += board-dt.o +  # AT91CAP9 board-specific support  obj-$(CONFIG_MACH_AT91CAP9ADK)	+= board-cap9adk.o diff --git a/arch/arm/mach-at91/Makefile.boot b/arch/arm/mach-at91/Makefile.boot index 9ab5a3e5f4f..8ddafadfdc7 100644 --- a/arch/arm/mach-at91/Makefile.boot +++ b/arch/arm/mach-at91/Makefile.boot @@ -16,3 +16,5 @@ else  params_phys-y	:= 0x20000100  initrd_phys-y	:= 0x20410000  endif + +dtb-$(CONFIG_MACH_AT91SAM_DT) += at91sam9m10g45ek.dtb usb_a9g20.dtb diff --git a/arch/arm/mach-at91/at91sam9260.c b/arch/arm/mach-at91/at91sam9260.c index a9be75825e3..b84a9f642f5 100644 --- a/arch/arm/mach-at91/at91sam9260.c +++ b/arch/arm/mach-at91/at91sam9260.c @@ -199,6 +199,14 @@ static struct clk_lookup periph_clocks_lookups[] = {  	CLKDEV_CON_DEV_ID("t4_clk", "atmel_tcb.1", &tc4_clk),  	CLKDEV_CON_DEV_ID("t5_clk", "atmel_tcb.1", &tc5_clk),  	CLKDEV_CON_DEV_ID("pclk", "ssc.0", &ssc_clk), +	/* more usart lookup table for DT entries */ +	CLKDEV_CON_DEV_ID("usart", "fffff200.serial", &mck), +	CLKDEV_CON_DEV_ID("usart", "fffb0000.serial", &usart0_clk), +	CLKDEV_CON_DEV_ID("usart", "fffb4000.serial", &usart1_clk), +	CLKDEV_CON_DEV_ID("usart", "fffb8000.serial", &usart2_clk), +	CLKDEV_CON_DEV_ID("usart", "fffd0000.serial", &usart3_clk), +	CLKDEV_CON_DEV_ID("usart", "fffd4000.serial", &usart4_clk), +	CLKDEV_CON_DEV_ID("usart", "fffd8000.serial", &usart5_clk),  	/* fake hclk clock */  	CLKDEV_CON_DEV_ID("hclk", "at91_ohci", &ohci_clk),  }; diff --git a/arch/arm/mach-at91/at91sam9g45.c b/arch/arm/mach-at91/at91sam9g45.c index 29def9095ab..318b0407ea0 100644 --- a/arch/arm/mach-at91/at91sam9g45.c +++ b/arch/arm/mach-at91/at91sam9g45.c @@ -223,6 +223,12 @@ static struct clk_lookup periph_clocks_lookups[] = {  	CLKDEV_CON_DEV_ID("pclk", "ssc.0", &ssc0_clk),  	CLKDEV_CON_DEV_ID("pclk", "ssc.1", &ssc1_clk),  	CLKDEV_CON_DEV_ID(NULL, "atmel-trng", &trng_clk), +	/* more usart lookup table for DT entries */ +	CLKDEV_CON_DEV_ID("usart", "ffffee00.serial", &mck), +	CLKDEV_CON_DEV_ID("usart", "fff8c000.serial", &usart0_clk), +	CLKDEV_CON_DEV_ID("usart", "fff90000.serial", &usart1_clk), +	CLKDEV_CON_DEV_ID("usart", "fff94000.serial", &usart2_clk), +	CLKDEV_CON_DEV_ID("usart", "fff98000.serial", &usart3_clk),  	/* fake hclk clock */  	CLKDEV_CON_DEV_ID("hclk", "at91_ohci", &uhphs_clk),  }; diff --git a/arch/arm/mach-at91/board-dt.c b/arch/arm/mach-at91/board-dt.c new file mode 100644 index 00000000000..0b7d3277821 --- /dev/null +++ b/arch/arm/mach-at91/board-dt.c @@ -0,0 +1,123 @@ +/* + *  Setup code for AT91SAM Evaluation Kits with Device Tree support + * + *  Covers: * AT91SAM9G45-EKES  board + *          * AT91SAM9M10-EKES  board + *          * AT91SAM9M10G45-EK board + * + *  Copyright (C) 2011 Atmel, + *                2011 Nicolas Ferre <nicolas.ferre@atmel.com> + * + * Licensed under GPLv2 or later. + */ + +#include <linux/types.h> +#include <linux/init.h> +#include <linux/module.h> +#include <linux/gpio.h> +#include <linux/irqdomain.h> +#include <linux/of_irq.h> +#include <linux/of_platform.h> + +#include <mach/hardware.h> +#include <mach/board.h> +#include <mach/system_rev.h> +#include <mach/at91sam9_smc.h> + +#include <asm/setup.h> +#include <asm/irq.h> +#include <asm/mach/arch.h> +#include <asm/mach/map.h> +#include <asm/mach/irq.h> + +#include "sam9_smc.h" +#include "generic.h" + + +static void __init ek_init_early(void) +{ +	/* Initialize processor: 12.000 MHz crystal */ +	at91_initialize(12000000); + +	/* DGBU on ttyS0. (Rx & Tx only) */ +	at91_register_uart(0, 0, 0); + +	/* set serial console to ttyS0 (ie, DBGU) */ +	at91_set_serial_console(0); +} + +/* det_pin is not connected */ +static struct atmel_nand_data __initdata ek_nand_data = { +	.ale		= 21, +	.cle		= 22, +	.rdy_pin	= AT91_PIN_PC8, +	.enable_pin	= AT91_PIN_PC14, +}; + +static struct sam9_smc_config __initdata ek_nand_smc_config = { +	.ncs_read_setup		= 0, +	.nrd_setup		= 2, +	.ncs_write_setup	= 0, +	.nwe_setup		= 2, + +	.ncs_read_pulse		= 4, +	.nrd_pulse		= 4, +	.ncs_write_pulse	= 4, +	.nwe_pulse		= 4, + +	.read_cycle		= 7, +	.write_cycle		= 7, + +	.mode			= AT91_SMC_READMODE | AT91_SMC_WRITEMODE | AT91_SMC_EXNWMODE_DISABLE, +	.tdf_cycles		= 3, +}; + +static void __init ek_add_device_nand(void) +{ +	ek_nand_data.bus_width_16 = board_have_nand_16bit(); +	/* setup bus-width (8 or 16) */ +	if (ek_nand_data.bus_width_16) +		ek_nand_smc_config.mode |= AT91_SMC_DBW_16; +	else +		ek_nand_smc_config.mode |= AT91_SMC_DBW_8; + +	/* configure chip-select 3 (NAND) */ +	sam9_smc_configure(3, &ek_nand_smc_config); + +	at91_add_device_nand(&ek_nand_data); +} + +static const struct of_device_id aic_of_match[] __initconst = { +	{ .compatible = "atmel,at91rm9200-aic", }, +	{}, +}; + +static void __init at91_dt_init_irq(void) +{ +	irq_domain_generate_simple(aic_of_match, 0xfffff000, 0); +	at91_init_irq_default(); +} + +static void __init at91_dt_device_init(void) +{ +	of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); + +	/* NAND */ +	ek_add_device_nand(); +} + +static const char *at91_dt_board_compat[] __initdata = { +	"atmel,at91sam9m10g45ek", +	"calao,usb-a9g20", +	NULL +}; + +DT_MACHINE_START(at91sam_dt, "Atmel AT91SAM (Device Tree)") +	/* Maintainer: Atmel */ +	.timer		= &at91sam926x_timer, +	.map_io		= at91_map_io, +	.init_early	= ek_init_early, +	.init_irq	= at91_dt_init_irq, +	.init_machine	= at91_dt_device_init, +	.dt_compat	= at91_dt_board_compat, +MACHINE_END diff --git a/arch/arm/mach-msm/board-msm8x60.c b/arch/arm/mach-msm/board-msm8x60.c index 106170fb184..cf38e2284fa 100644 --- a/arch/arm/mach-msm/board-msm8x60.c +++ b/arch/arm/mach-msm/board-msm8x60.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2010, Code Aurora Forum. All rights reserved. +/* Copyright (c) 2010, 2011, Code Aurora Forum. 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 and @@ -8,18 +8,16 @@   * but WITHOUT ANY WARRANTY; without even the implied warranty of   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the   * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - *   */  #include <linux/kernel.h>  #include <linux/platform_device.h>  #include <linux/io.h>  #include <linux/irq.h> +#include <linux/irqdomain.h> +#include <linux/of.h> +#include <linux/of_address.h> +#include <linux/of_platform.h>  #include <linux/memblock.h>  #include <asm/mach-types.h> @@ -70,6 +68,41 @@ static void __init msm8x60_init(void)  {  } +#ifdef CONFIG_OF +static struct of_dev_auxdata msm_auxdata_lookup[] __initdata = { +	{} +}; + +static struct of_device_id msm_dt_gic_match[] __initdata = { +	{ .compatible = "qcom,msm-8660-qgic", }, +	{} +}; + +static void __init msm8x60_dt_init(void) +{ +	struct device_node *node; + +	node = of_find_matching_node_by_address(NULL, msm_dt_gic_match, +			MSM8X60_QGIC_DIST_PHYS); +	if (node) +		irq_domain_add_simple(node, GIC_SPI_START); + +	if (of_machine_is_compatible("qcom,msm8660-surf")) { +		printk(KERN_INFO "Init surf UART registers\n"); +		msm8x60_init_uart12dm(); +	} + +	of_platform_populate(NULL, of_default_bus_match_table, +			msm_auxdata_lookup, NULL); +} + +static const char *msm8x60_fluid_match[] __initdata = { +	"qcom,msm8660-fluid", +	"qcom,msm8660-surf", +	NULL +}; +#endif /* CONFIG_OF */ +  MACHINE_START(MSM8X60_RUMI3, "QCT MSM8X60 RUMI3")  	.fixup = msm8x60_fixup,  	.reserve = msm8x60_reserve, @@ -105,3 +138,14 @@ MACHINE_START(MSM8X60_FFA, "QCT MSM8X60 FFA")  	.init_machine = msm8x60_init,  	.timer = &msm_timer,  MACHINE_END + +#ifdef CONFIG_OF +/* TODO: General device tree support for all MSM. */ +DT_MACHINE_START(MSM_DT, "Qualcomm MSM (Flattened Device Tree)") +	.map_io = msm8x60_map_io, +	.init_irq = msm8x60_init_irq, +	.init_machine = msm8x60_dt_init, +	.timer = &msm_timer, +	.dt_compat = msm8x60_fluid_match, +MACHINE_END +#endif /* CONFIG_OF */ diff --git a/arch/arm/mach-mx5/Kconfig b/arch/arm/mach-mx5/Kconfig index 3d4c31306ca..af0c212e3c7 100644 --- a/arch/arm/mach-mx5/Kconfig +++ b/arch/arm/mach-mx5/Kconfig @@ -56,6 +56,15 @@ config MACH_MX50_RDP  comment "i.MX51 machines:" +config MACH_IMX51_DT +	bool "Support i.MX51 platforms from device tree" +	select SOC_IMX51 +	select USE_OF +	select MACH_MX51_BABBAGE +	help +	  Include support for Freescale i.MX51 based platforms +	  using the device tree for discovery +  config MACH_MX51_BABBAGE  	bool "Support MX51 BABBAGE platforms"  	select SOC_IMX51 @@ -171,6 +180,18 @@ config MACH_MX51_EFIKASB  comment "i.MX53 machines:" +config MACH_IMX53_DT +	bool "Support i.MX53 platforms from device tree" +	select SOC_IMX53 +	select USE_OF +	select MACH_MX53_ARD +	select MACH_MX53_EVK +	select MACH_MX53_LOCO +	select MACH_MX53_SMD +	help +	  Include support for Freescale i.MX53 based platforms +	  using the device tree for discovery +  config MACH_MX53_EVK  	bool "Support MX53 EVK platforms"  	select SOC_IMX53 diff --git a/arch/arm/mach-mx5/Makefile b/arch/arm/mach-mx5/Makefile index 9565304b728..0fc60807fa2 100644 --- a/arch/arm/mach-mx5/Makefile +++ b/arch/arm/mach-mx5/Makefile @@ -21,3 +21,6 @@ obj-$(CONFIG_MX51_EFIKA_COMMON) += mx51_efika.o  obj-$(CONFIG_MACH_MX51_EFIKAMX) += board-mx51_efikamx.o  obj-$(CONFIG_MACH_MX51_EFIKASB) += board-mx51_efikasb.o  obj-$(CONFIG_MACH_MX50_RDP) += board-mx50_rdp.o + +obj-$(CONFIG_MACH_IMX51_DT) += imx51-dt.o +obj-$(CONFIG_MACH_IMX53_DT) += imx53-dt.o diff --git a/arch/arm/mach-mx5/board-mx51_babbage.c b/arch/arm/mach-mx5/board-mx51_babbage.c index 5993208a8f0..5c837603ff0 100644 --- a/arch/arm/mach-mx5/board-mx51_babbage.c +++ b/arch/arm/mach-mx5/board-mx51_babbage.c @@ -349,6 +349,12 @@ static const struct esdhc_platform_data mx51_babbage_sd2_data __initconst = {  	.wp_type = ESDHC_WP_GPIO,  }; +void __init imx51_babbage_common_init(void) +{ +	mxc_iomux_v3_setup_multiple_pads(mx51babbage_pads, +					 ARRAY_SIZE(mx51babbage_pads)); +} +  /*   * Board specific initialization.   */ @@ -363,8 +369,7 @@ static void __init mx51_babbage_init(void)  #if defined(CONFIG_CPU_FREQ_IMX)  	get_cpu_op = mx51_get_cpu_op;  #endif -	mxc_iomux_v3_setup_multiple_pads(mx51babbage_pads, -					ARRAY_SIZE(mx51babbage_pads)); +	imx51_babbage_common_init();  	imx51_add_imx_uart(0, &uart_pdata);  	imx51_add_imx_uart(1, NULL); diff --git a/arch/arm/mach-mx5/board-mx53_ard.c b/arch/arm/mach-mx5/board-mx53_ard.c index 614edcb0aa7..0d7f0fffb23 100644 --- a/arch/arm/mach-mx5/board-mx53_ard.c +++ b/arch/arm/mach-mx5/board-mx53_ard.c @@ -171,9 +171,6 @@ static struct imxi2c_platform_data mx53_ard_i2c3_data = {  static void __init mx53_ard_io_init(void)  { -	mxc_iomux_v3_setup_multiple_pads(mx53_ard_pads, -				ARRAY_SIZE(mx53_ard_pads)); -  	gpio_request(ARD_ETHERNET_INT_B, "eth-int-b");  	gpio_direction_input(ARD_ETHERNET_INT_B); @@ -216,6 +213,13 @@ static int weim_cs_config(void)  	return 0;  } +void __init imx53_ard_common_init(void) +{ +	mxc_iomux_v3_setup_multiple_pads(mx53_ard_pads, +					 ARRAY_SIZE(mx53_ard_pads)); +	weim_cs_config(); +} +  static struct platform_device *devices[] __initdata = {  	&ard_smsc_lan9220_device,  }; @@ -225,8 +229,8 @@ static void __init mx53_ard_board_init(void)  	imx53_soc_init();  	imx53_add_imx_uart(0, NULL); +	imx53_ard_common_init();  	mx53_ard_io_init(); -	weim_cs_config();  	platform_add_devices(devices, ARRAY_SIZE(devices));  	imx53_add_sdhci_esdhc_imx(0, &mx53_ard_sd1_data); diff --git a/arch/arm/mach-mx5/board-mx53_evk.c b/arch/arm/mach-mx5/board-mx53_evk.c index 6a3e6168e32..6bea31ab8f8 100644 --- a/arch/arm/mach-mx5/board-mx53_evk.c +++ b/arch/arm/mach-mx5/board-mx53_evk.c @@ -131,12 +131,17 @@ static const struct spi_imx_master mx53_evk_spi_data __initconst = {  	.num_chipselect = ARRAY_SIZE(mx53_evk_spi_cs),  }; +void __init imx53_evk_common_init(void) +{ +	mxc_iomux_v3_setup_multiple_pads(mx53_evk_pads, +					 ARRAY_SIZE(mx53_evk_pads)); +} +  static void __init mx53_evk_board_init(void)  {  	imx53_soc_init(); +	imx53_evk_common_init(); -	mxc_iomux_v3_setup_multiple_pads(mx53_evk_pads, -					ARRAY_SIZE(mx53_evk_pads));  	mx53_evk_init_uart();  	mx53_evk_fec_reset();  	imx53_add_fec(&mx53_evk_fec_pdata); diff --git a/arch/arm/mach-mx5/board-mx53_loco.c b/arch/arm/mach-mx5/board-mx53_loco.c index 0af2766f861..7678f7734db 100644 --- a/arch/arm/mach-mx5/board-mx53_loco.c +++ b/arch/arm/mach-mx5/board-mx53_loco.c @@ -263,6 +263,12 @@ static const struct gpio_led_platform_data mx53loco_leds_data __initconst = {  	.num_leds	= ARRAY_SIZE(mx53loco_leds),  }; +void __init imx53_qsb_common_init(void) +{ +	mxc_iomux_v3_setup_multiple_pads(mx53_loco_pads, +					 ARRAY_SIZE(mx53_loco_pads)); +} +  static struct i2c_board_info mx53loco_i2c_devices[] = {  	{  		I2C_BOARD_INFO("mma8450", 0x1C), @@ -273,9 +279,8 @@ static void __init mx53_loco_board_init(void)  {  	int ret;  	imx53_soc_init(); +	imx53_qsb_common_init(); -	mxc_iomux_v3_setup_multiple_pads(mx53_loco_pads, -					ARRAY_SIZE(mx53_loco_pads));  	imx53_add_imx_uart(0, NULL);  	mx53_loco_fec_reset();  	imx53_add_fec(&mx53_loco_fec_data); diff --git a/arch/arm/mach-mx5/board-mx53_smd.c b/arch/arm/mach-mx5/board-mx53_smd.c index d12fd3043ba..59c0845eb4a 100644 --- a/arch/arm/mach-mx5/board-mx53_smd.c +++ b/arch/arm/mach-mx5/board-mx53_smd.c @@ -125,12 +125,17 @@ static inline void mx53_smd_ahci_pwr_on(void)  	}  } +void __init imx53_smd_common_init(void) +{ +	mxc_iomux_v3_setup_multiple_pads(mx53_smd_pads, +					 ARRAY_SIZE(mx53_smd_pads)); +} +  static void __init mx53_smd_board_init(void)  {  	imx53_soc_init(); +	imx53_smd_common_init(); -	mxc_iomux_v3_setup_multiple_pads(mx53_smd_pads, -					ARRAY_SIZE(mx53_smd_pads));  	mx53_smd_init_uart();  	mx53_smd_fec_reset();  	imx53_add_fec(&mx53_smd_fec_data); diff --git a/arch/arm/mach-mx5/clock-mx51-mx53.c b/arch/arm/mach-mx5/clock-mx51-mx53.c index b94879e8679..2aacf41c48e 100644 --- a/arch/arm/mach-mx5/clock-mx51-mx53.c +++ b/arch/arm/mach-mx5/clock-mx51-mx53.c @@ -15,6 +15,7 @@  #include <linux/clk.h>  #include <linux/io.h>  #include <linux/clkdev.h> +#include <linux/of.h>  #include <asm/div64.h> @@ -1632,3 +1633,41 @@ int __init mx53_clocks_init(unsigned long ckil, unsigned long osc,  		MX53_INT_GPT);  	return 0;  } + +static void __init clk_get_freq_dt(unsigned long *ckil, unsigned long *osc, +				   unsigned long *ckih1, unsigned long *ckih2) +{ +	struct device_node *np; + +	/* retrieve the freqency of fixed clocks from device tree */ +	for_each_compatible_node(np, NULL, "fixed-clock") { +		u32 rate; +		if (of_property_read_u32(np, "clock-frequency", &rate)) +			continue; + +		if (of_device_is_compatible(np, "fsl,imx-ckil")) +			*ckil = rate; +		else if (of_device_is_compatible(np, "fsl,imx-osc")) +			*osc = rate; +		else if (of_device_is_compatible(np, "fsl,imx-ckih1")) +			*ckih1 = rate; +		else if (of_device_is_compatible(np, "fsl,imx-ckih2")) +			*ckih2 = rate; +	} +} + +int __init mx51_clocks_init_dt(void) +{ +	unsigned long ckil, osc, ckih1, ckih2; + +	clk_get_freq_dt(&ckil, &osc, &ckih1, &ckih2); +	return mx51_clocks_init(ckil, osc, ckih1, ckih2); +} + +int __init mx53_clocks_init_dt(void) +{ +	unsigned long ckil, osc, ckih1, ckih2; + +	clk_get_freq_dt(&ckil, &osc, &ckih1, &ckih2); +	return mx53_clocks_init(ckil, osc, ckih1, ckih2); +} diff --git a/arch/arm/mach-mx5/imx51-dt.c b/arch/arm/mach-mx5/imx51-dt.c new file mode 100644 index 00000000000..ccc61585659 --- /dev/null +++ b/arch/arm/mach-mx5/imx51-dt.c @@ -0,0 +1,116 @@ +/* + * Copyright 2011 Freescale Semiconductor, Inc. All Rights Reserved. + * 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/irq.h> +#include <linux/irqdomain.h> +#include <linux/of_irq.h> +#include <linux/of_platform.h> +#include <asm/mach/arch.h> +#include <asm/mach/time.h> +#include <mach/common.h> +#include <mach/mx51.h> + +/* + * Lookup table for attaching a specific name and platform_data pointer to + * devices as they get created by of_platform_populate().  Ideally this table + * would not exist, but the current clock implementation depends on some devices + * having a specific name. + */ +static const struct of_dev_auxdata imx51_auxdata_lookup[] __initconst = { +	OF_DEV_AUXDATA("fsl,imx51-uart", MX51_UART1_BASE_ADDR, "imx21-uart.0", NULL), +	OF_DEV_AUXDATA("fsl,imx51-uart", MX51_UART2_BASE_ADDR, "imx21-uart.1", NULL), +	OF_DEV_AUXDATA("fsl,imx51-uart", MX51_UART3_BASE_ADDR, "imx21-uart.2", NULL), +	OF_DEV_AUXDATA("fsl,imx51-fec", MX51_FEC_BASE_ADDR, "imx27-fec.0", NULL), +	OF_DEV_AUXDATA("fsl,imx51-esdhc", MX51_ESDHC1_BASE_ADDR, "sdhci-esdhc-imx51.0", NULL), +	OF_DEV_AUXDATA("fsl,imx51-esdhc", MX51_ESDHC2_BASE_ADDR, "sdhci-esdhc-imx51.1", NULL), +	OF_DEV_AUXDATA("fsl,imx51-esdhc", MX51_ESDHC3_BASE_ADDR, "sdhci-esdhc-imx51.2", NULL), +	OF_DEV_AUXDATA("fsl,imx51-esdhc", MX51_ESDHC4_BASE_ADDR, "sdhci-esdhc-imx51.3", NULL), +	OF_DEV_AUXDATA("fsl,imx51-ecspi", MX51_ECSPI1_BASE_ADDR, "imx51-ecspi.0", NULL), +	OF_DEV_AUXDATA("fsl,imx51-ecspi", MX51_ECSPI2_BASE_ADDR, "imx51-ecspi.1", NULL), +	OF_DEV_AUXDATA("fsl,imx51-cspi", MX51_CSPI_BASE_ADDR, "imx35-cspi.0", NULL), +	OF_DEV_AUXDATA("fsl,imx51-i2c", MX51_I2C1_BASE_ADDR, "imx-i2c.0", NULL), +	OF_DEV_AUXDATA("fsl,imx51-i2c", MX51_I2C2_BASE_ADDR, "imx-i2c.1", NULL), +	OF_DEV_AUXDATA("fsl,imx51-sdma", MX51_SDMA_BASE_ADDR, "imx35-sdma", NULL), +	OF_DEV_AUXDATA("fsl,imx51-wdt", MX51_WDOG1_BASE_ADDR, "imx2-wdt.0", NULL), +	{ /* sentinel */ } +}; + +static void __init imx51_tzic_add_irq_domain(struct device_node *np, +				struct device_node *interrupt_parent) +{ +	irq_domain_add_simple(np, 0); +} + +static void __init imx51_gpio_add_irq_domain(struct device_node *np, +				struct device_node *interrupt_parent) +{ +	static int gpio_irq_base = MXC_GPIO_IRQ_START + ARCH_NR_GPIOS - +				   32 * 4; /* imx51 gets 4 gpio ports */ + +	irq_domain_add_simple(np, gpio_irq_base); +	gpio_irq_base += 32; +} + +static const struct of_device_id imx51_irq_match[] __initconst = { +	{ .compatible = "fsl,imx51-tzic", .data = imx51_tzic_add_irq_domain, }, +	{ .compatible = "fsl,imx51-gpio", .data = imx51_gpio_add_irq_domain, }, +	{ /* sentinel */ } +}; + +static const struct of_device_id imx51_iomuxc_of_match[] __initconst = { +	{ .compatible = "fsl,imx51-iomuxc-babbage", .data = imx51_babbage_common_init, }, +	{ /* sentinel */ } +}; + +static void __init imx51_dt_init(void) +{ +	struct device_node *node; +	const struct of_device_id *of_id; +	void (*func)(void); + +	of_irq_init(imx51_irq_match); + +	node = of_find_matching_node(NULL, imx51_iomuxc_of_match); +	if (node) { +		of_id = of_match_node(imx51_iomuxc_of_match, node); +		func = of_id->data; +		func(); +		of_node_put(node); +	} + +	of_platform_populate(NULL, of_default_bus_match_table, +			     imx51_auxdata_lookup, NULL); +} + +static void __init imx51_timer_init(void) +{ +	mx51_clocks_init_dt(); +} + +static struct sys_timer imx51_timer = { +	.init = imx51_timer_init, +}; + +static const char *imx51_dt_board_compat[] __initdata = { +	"fsl,imx51-babbage", +	NULL +}; + +DT_MACHINE_START(IMX51_DT, "Freescale i.MX51 (Device Tree Support)") +	.map_io		= mx51_map_io, +	.init_early	= imx51_init_early, +	.init_irq	= mx51_init_irq, +	.handle_irq	= imx51_handle_irq, +	.timer		= &imx51_timer, +	.init_machine	= imx51_dt_init, +	.dt_compat	= imx51_dt_board_compat, +MACHINE_END diff --git a/arch/arm/mach-mx5/imx53-dt.c b/arch/arm/mach-mx5/imx53-dt.c new file mode 100644 index 00000000000..ccaa0b81b76 --- /dev/null +++ b/arch/arm/mach-mx5/imx53-dt.c @@ -0,0 +1,126 @@ +/* + * Copyright 2011 Freescale Semiconductor, Inc. All Rights Reserved. + * 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/io.h> +#include <linux/irq.h> +#include <linux/irqdomain.h> +#include <linux/of_irq.h> +#include <linux/of_platform.h> +#include <asm/mach/arch.h> +#include <asm/mach/time.h> +#include <mach/common.h> +#include <mach/mx53.h> + +/* + * Lookup table for attaching a specific name and platform_data pointer to + * devices as they get created by of_platform_populate().  Ideally this table + * would not exist, but the current clock implementation depends on some devices + * having a specific name. + */ +static const struct of_dev_auxdata imx53_auxdata_lookup[] __initconst = { +	OF_DEV_AUXDATA("fsl,imx53-uart", MX53_UART1_BASE_ADDR, "imx21-uart.0", NULL), +	OF_DEV_AUXDATA("fsl,imx53-uart", MX53_UART2_BASE_ADDR, "imx21-uart.1", NULL), +	OF_DEV_AUXDATA("fsl,imx53-uart", MX53_UART3_BASE_ADDR, "imx21-uart.2", NULL), +	OF_DEV_AUXDATA("fsl,imx53-uart", MX53_UART4_BASE_ADDR, "imx21-uart.3", NULL), +	OF_DEV_AUXDATA("fsl,imx53-uart", MX53_UART5_BASE_ADDR, "imx21-uart.4", NULL), +	OF_DEV_AUXDATA("fsl,imx53-fec", MX53_FEC_BASE_ADDR, "imx25-fec.0", NULL), +	OF_DEV_AUXDATA("fsl,imx53-esdhc", MX53_ESDHC1_BASE_ADDR, "sdhci-esdhc-imx53.0", NULL), +	OF_DEV_AUXDATA("fsl,imx53-esdhc", MX53_ESDHC2_BASE_ADDR, "sdhci-esdhc-imx53.1", NULL), +	OF_DEV_AUXDATA("fsl,imx53-esdhc", MX53_ESDHC3_BASE_ADDR, "sdhci-esdhc-imx53.2", NULL), +	OF_DEV_AUXDATA("fsl,imx53-esdhc", MX53_ESDHC4_BASE_ADDR, "sdhci-esdhc-imx53.3", NULL), +	OF_DEV_AUXDATA("fsl,imx53-ecspi", MX53_ECSPI1_BASE_ADDR, "imx51-ecspi.0", NULL), +	OF_DEV_AUXDATA("fsl,imx53-ecspi", MX53_ECSPI2_BASE_ADDR, "imx51-ecspi.1", NULL), +	OF_DEV_AUXDATA("fsl,imx53-cspi", MX53_CSPI_BASE_ADDR, "imx35-cspi.0", NULL), +	OF_DEV_AUXDATA("fsl,imx53-i2c", MX53_I2C1_BASE_ADDR, "imx-i2c.0", NULL), +	OF_DEV_AUXDATA("fsl,imx53-i2c", MX53_I2C2_BASE_ADDR, "imx-i2c.1", NULL), +	OF_DEV_AUXDATA("fsl,imx53-i2c", MX53_I2C3_BASE_ADDR, "imx-i2c.2", NULL), +	OF_DEV_AUXDATA("fsl,imx53-sdma", MX53_SDMA_BASE_ADDR, "imx35-sdma", NULL), +	OF_DEV_AUXDATA("fsl,imx53-wdt", MX53_WDOG1_BASE_ADDR, "imx2-wdt.0", NULL), +	{ /* sentinel */ } +}; + +static void __init imx53_tzic_add_irq_domain(struct device_node *np, +				struct device_node *interrupt_parent) +{ +	irq_domain_add_simple(np, 0); +} + +static void __init imx53_gpio_add_irq_domain(struct device_node *np, +				struct device_node *interrupt_parent) +{ +	static int gpio_irq_base = MXC_GPIO_IRQ_START + ARCH_NR_GPIOS - +				   32 * 7; /* imx53 gets 7 gpio ports */ + +	irq_domain_add_simple(np, gpio_irq_base); +	gpio_irq_base += 32; +} + +static const struct of_device_id imx53_irq_match[] __initconst = { +	{ .compatible = "fsl,imx53-tzic", .data = imx53_tzic_add_irq_domain, }, +	{ .compatible = "fsl,imx53-gpio", .data = imx53_gpio_add_irq_domain, }, +	{ /* sentinel */ } +}; + +static const struct of_device_id imx53_iomuxc_of_match[] __initconst = { +	{ .compatible = "fsl,imx53-iomuxc-ard", .data = imx53_ard_common_init, }, +	{ .compatible = "fsl,imx53-iomuxc-evk", .data = imx53_evk_common_init, }, +	{ .compatible = "fsl,imx53-iomuxc-qsb", .data = imx53_qsb_common_init, }, +	{ .compatible = "fsl,imx53-iomuxc-smd", .data = imx53_smd_common_init, }, +	{ /* sentinel */ } +}; + +static void __init imx53_dt_init(void) +{ +	struct device_node *node; +	const struct of_device_id *of_id; +	void (*func)(void); + +	of_irq_init(imx53_irq_match); + +	node = of_find_matching_node(NULL, imx53_iomuxc_of_match); +	if (node) { +		of_id = of_match_node(imx53_iomuxc_of_match, node); +		func = of_id->data; +		func(); +		of_node_put(node); +	} + +	of_platform_populate(NULL, of_default_bus_match_table, +			     imx53_auxdata_lookup, NULL); +} + +static void __init imx53_timer_init(void) +{ +	mx53_clocks_init_dt(); +} + +static struct sys_timer imx53_timer = { +	.init = imx53_timer_init, +}; + +static const char *imx53_dt_board_compat[] __initdata = { +	"fsl,imx53-ard", +	"fsl,imx53-evk", +	"fsl,imx53-qsb", +	"fsl,imx53-smd", +	NULL +}; + +DT_MACHINE_START(IMX53_DT, "Freescale i.MX53 (Device Tree Support)") +	.map_io		= mx53_map_io, +	.init_early	= imx53_init_early, +	.init_irq	= mx53_init_irq, +	.handle_irq	= imx53_handle_irq, +	.timer		= &imx53_timer, +	.init_machine	= imx53_dt_init, +	.dt_compat	= imx53_dt_board_compat, +MACHINE_END diff --git a/arch/arm/plat-mxc/include/mach/common.h b/arch/arm/plat-mxc/include/mach/common.h index ace4bb550ed..c850af3650e 100644 --- a/arch/arm/plat-mxc/include/mach/common.h +++ b/arch/arm/plat-mxc/include/mach/common.h @@ -64,6 +64,8 @@ extern int mx51_clocks_init(unsigned long ckil, unsigned long osc,  			unsigned long ckih1, unsigned long ckih2);  extern int mx53_clocks_init(unsigned long ckil, unsigned long osc,  			unsigned long ckih1, unsigned long ckih2); +extern int mx51_clocks_init_dt(void); +extern int mx53_clocks_init_dt(void);  extern struct platform_device *mxc_register_gpio(char *name, int id,  	resource_size_t iobase, resource_size_t iosize, int irq, int irq_high);  extern void mxc_set_cpu_type(unsigned int type); @@ -97,4 +99,9 @@ void tzic_handle_irq(struct pt_regs *);  #define imx51_handle_irq tzic_handle_irq  #define imx53_handle_irq tzic_handle_irq +extern void imx51_babbage_common_init(void); +extern void imx53_ard_common_init(void); +extern void imx53_evk_common_init(void); +extern void imx53_qsb_common_init(void); +extern void imx53_smd_common_init(void);  #endif  |