diff options
147 files changed, 5017 insertions, 1037 deletions
diff --git a/Documentation/devicetree/bindings/arm/atmel-aic.txt b/Documentation/devicetree/bindings/arm/atmel-aic.txt new file mode 100644 index 00000000000..aabca4f8340 --- /dev/null +++ b/Documentation/devicetree/bindings/arm/atmel-aic.txt @@ -0,0 +1,38 @@ +* Advanced Interrupt Controller (AIC) + +Required properties: +- compatible: Should be "atmel,<chip>-aic" +- interrupt-controller: Identifies the node as an interrupt controller. +- interrupt-parent: For single AIC system, it is an empty property. +- #interrupt-cells: The number of cells to define the interrupts. It sould be 2. +  The first cell is the IRQ number (aka "Peripheral IDentifier" on datasheet). +  The second cell is used to specify flags: +    bits[3:0] trigger type and level flags: +      1 = low-to-high edge triggered. +      2 = high-to-low edge triggered. +      4 = active high level-sensitive. +      8 = active low level-sensitive. +      Valid combinations are 1, 2, 3, 4, 8. +      Default flag for internal sources should be set to 4 (active high). +- reg: Should contain AIC registers location and length + +Examples: +	/* +	 * AIC +	 */ +	aic: interrupt-controller@fffff000 { +		compatible = "atmel,at91rm9200-aic"; +		interrupt-controller; +		interrupt-parent; +		#interrupt-cells = <2>; +		reg = <0xfffff000 0x200>; +	}; + +	/* +	 * An interrupt generating device that is wired to an AIC. +	 */ +	dma: dma-controller@ffffec00 { +		compatible = "atmel,at91sam9g45-dma"; +		reg = <0xffffec00 0x200>; +		interrupts = <21 4>; +	}; diff --git a/Documentation/devicetree/bindings/arm/atmel-at91.txt b/Documentation/devicetree/bindings/arm/atmel-at91.txt new file mode 100644 index 00000000000..1aeaf6f2a1b --- /dev/null +++ b/Documentation/devicetree/bindings/arm/atmel-at91.txt @@ -0,0 +1,32 @@ +Atmel AT91 device tree bindings. +================================ + +PIT Timer required properties: +- compatible: Should be "atmel,at91sam9260-pit" +- reg: Should contain registers location and length +- interrupts: Should contain interrupt for the PIT which is the IRQ line +  shared across all System Controller members. + +TC/TCLIB Timer required properties: +- compatible: Should be "atmel,<chip>-pit". +  <chip> can be "at91rm9200" or "at91sam9x5" +- reg: Should contain registers location and length +- interrupts: Should contain all interrupts for the TC block +  Note that you can specify several interrupt cells if the TC +  block has one interrupt per channel. + +Examples: + +One interrupt per TC block: +	tcb0: timer@fff7c000 { +		compatible = "atmel,at91rm9200-tcb"; +		reg = <0xfff7c000 0x100>; +		interrupts = <18 4>; +	}; + +One interrupt per TC channel in a TC block: +	tcb1: timer@fffdc000 { +		compatible = "atmel,at91rm9200-tcb"; +		reg = <0xfffdc000 0x100>; +		interrupts = <26 4 27 4 28 4>; +	}; diff --git a/Documentation/devicetree/bindings/arm/fsl.txt b/Documentation/devicetree/bindings/arm/fsl.txt index 54bdddadf1c..bfbc771a65f 100644 --- a/Documentation/devicetree/bindings/arm/fsl.txt +++ b/Documentation/devicetree/bindings/arm/fsl.txt @@ -28,3 +28,25 @@ Required root node properties:  i.MX6 Quad SABRE Lite Board  Required root node properties:      - compatible = "fsl,imx6q-sabrelite", "fsl,imx6q"; + +Generic i.MX boards +------------------- + +No iomux setup is done for these boards, so this must have been configured +by the bootloader for boards to work with the generic bindings. + +i.MX27 generic board +Required root node properties: +    - compatible = "fsl,imx27"; + +i.MX51 generic board +Required root node properties: +    - compatible = "fsl,imx51"; + +i.MX53 generic board +Required root node properties: +    - compatible = "fsl,imx53"; + +i.MX6q generic board +Required root node properties: +    - compatible = "fsl,imx6q"; diff --git a/Documentation/devicetree/bindings/arm/mrvl.txt b/Documentation/devicetree/bindings/arm/mrvl.txt new file mode 100644 index 00000000000..d8de933e9d8 --- /dev/null +++ b/Documentation/devicetree/bindings/arm/mrvl.txt @@ -0,0 +1,6 @@ +Marvell Platforms Device Tree Bindings +---------------------------------------------------- + +PXA168 Aspenite Board +Required root node properties: +	- compatible = "mrvl,pxa168-aspenite", "mrvl,pxa168"; diff --git a/Documentation/devicetree/bindings/arm/omap/intc.txt b/Documentation/devicetree/bindings/arm/omap/intc.txt new file mode 100644 index 00000000000..f2583e6ec06 --- /dev/null +++ b/Documentation/devicetree/bindings/arm/omap/intc.txt @@ -0,0 +1,27 @@ +* OMAP Interrupt Controller + +OMAP2/3 are using a TI interrupt controller that can support several +configurable number of interrupts. + +Main node required properties: + +- compatible : should be: +	"ti,omap2-intc" +- interrupt-controller : Identifies the node as an interrupt controller +- #interrupt-cells : Specifies the number of cells needed to encode an +  interrupt source. The type shall be a <u32> and the value shall be 1. + +  The cell contains the interrupt number in the range [0-128]. +- ti,intc-size: Number of interrupts handled by the interrupt controller. +- reg: physical base address and size of the intc registers map. + +Example: + +	intc: interrupt-controller@1 { +		compatible = "ti,omap2-intc"; +		interrupt-controller; +		#interrupt-cells = <1>; +		ti,intc-size = <96>; +		reg = <0x48200000 0x1000>; +	}; + diff --git a/Documentation/devicetree/bindings/arm/vexpress.txt b/Documentation/devicetree/bindings/arm/vexpress.txt new file mode 100644 index 00000000000..ec8b50cbb2e --- /dev/null +++ b/Documentation/devicetree/bindings/arm/vexpress.txt @@ -0,0 +1,146 @@ +ARM Versatile Express boards family +----------------------------------- + +ARM's Versatile Express platform consists of a motherboard and one +or more daughterboards (tiles). The motherboard provides a set of +peripherals. Processor and RAM "live" on the tiles. + +The motherboard and each core tile should be described by a separate +Device Tree source file, with the tile's description including +the motherboard file using a /include/ directive. As the motherboard +can be initialized in one of two different configurations ("memory +maps"), care must be taken to include the correct one. + +Required properties in the root node: +- compatible value: +	compatible = "arm,vexpress,<model>", "arm,vexpress"; +  where <model> is the full tile model name (as used in the tile's +    Technical Reference Manual), eg.: +    - for Coretile Express A5x2 (V2P-CA5s): +	compatible = "arm,vexpress,v2p-ca5s", "arm,vexpress"; +    - for Coretile Express A9x4 (V2P-CA9): +	compatible = "arm,vexpress,v2p-ca9", "arm,vexpress"; +  If a tile comes in several variants or can be used in more then one +  configuration, the compatible value should be: +	compatible = "arm,vexpress,<model>,<variant>", \ +				"arm,vexpress,<model>", "arm,vexpress"; +  eg: +    - Coretile Express A15x2 (V2P-CA15) with Tech Chip 1: +	compatible = "arm,vexpress,v2p-ca15,tc1", \ +				"arm,vexpress,v2p-ca15", "arm,vexpress"; +    - LogicTile Express 13MG (V2F-2XV6) running Cortex-A7 (3 cores) SMM: +	compatible = "arm,vexpress,v2f-2xv6,ca7x3", \ +				"arm,vexpress,v2f-2xv6", "arm,vexpress"; + +Optional properties in the root node: +- tile model name (use name from the tile's Technical Reference +  Manual, eg. "V2P-CA5s") +	model = "<model>"; +- tile's HBI number (unique ARM's board model ID, visible on the +  PCB's silkscreen) in hexadecimal transcription: +	arm,hbi = <0xhbi> +  eg: +  - for Coretile Express A5x2 (V2P-CA5s) HBI-0191: +	arm,hbi = <0x191>; +  - Coretile Express A9x4 (V2P-CA9) HBI-0225: +	arm,hbi = <0x225>; + +Top-level standard "cpus" node is required. It must contain a node +with device_type = "cpu" property for every available core, eg.: + +	cpus { +		#address-cells = <1>; +		#size-cells = <0>; + +		cpu@0 { +			device_type = "cpu"; +			compatible = "arm,cortex-a5"; +			reg = <0>; +		}; +	}; + +The motherboard description file provides a single "motherboard" node +using 2 address cells corresponding to the Static Memory Bus used +between the motherboard and the tile. The first cell defines the Chip +Select (CS) line number, the second cell address offset within the CS. +All interrupt lines between the motherboard and the tile are active +high and are described using single cell. + +Optional properties of the "motherboard" node: +- motherboard's memory map variant: +	arm,v2m-memory-map = "<name>"; +  where name is one of: +  - "rs1" - for RS1 map (i.a. peripherals on CS3); this map is also +            referred to as "ARM Cortex-A Series memory map": +	arm,v2m-memory-map = "rs1"; +  When this property is missing, the motherboard is using the original +  memory map (also known as the "Legacy memory map", primarily used +  with the original CoreTile Express A9x4) with peripherals on CS7. + +Motherboard .dtsi files provide a set of labelled peripherals that +can be used to obtain required phandle in the tile's "aliases" node: +- UARTs, note that the numbers correspond to the physical connectors +  on the motherboard's back panel: +	v2m_serial0, v2m_serial1, v2m_serial2 and v2m_serial3 +- I2C controllers: +	v2m_i2c_dvi and v2m_i2c_pcie +- SP804 timers: +	v2m_timer01 and v2m_timer23 + +Current Linux implementation requires a "arm,v2m_timer" alias +pointing at one of the motherboard's SP804 timers, if it is to be +used as the system timer. This alias should be defined in the +motherboard files. + +The tile description must define "ranges", "interrupt-map-mask" and +"interrupt-map" properties to translate the motherboard's address +and interrupt space into one used by the tile's processor. + +Abbreviated example: + +/dts-v1/; + +/ { +	model = "V2P-CA5s"; +	arm,hbi = <0x225>; +	compatible = "arm,vexpress-v2p-ca5s", "arm,vexpress"; +	interrupt-parent = <&gic>; +	#address-cells = <1>; +	#size-cells = <1>; + +	chosen { }; + +	aliases { +		serial0 = &v2m_serial0; +	}; + +	cpus { +		#address-cells = <1>; +		#size-cells = <0>; + +		cpu@0 { +			device_type = "cpu"; +			compatible = "arm,cortex-a5"; +			reg = <0>; +		}; +	}; + +	gic: interrupt-controller@2c001000 { +		compatible = "arm,cortex-a9-gic"; +		#interrupt-cells = <3>; +		#address-cells = <0>; +		interrupt-controller; +		reg = <0x2c001000 0x1000>, +		      <0x2c000100 0x100>; +	}; + +	motherboard { +		/* CS0 is visible at 0x08000000 */ +		ranges = <0 0 0x08000000 0x04000000>; +		interrupt-map-mask = <0 0 63>; +		/* Active high IRQ 0 is connected to GIC's SPI0 */ +		interrupt-map = <0 0 0 &gic 0 0 4>; +	}; +}; + +/include/ "vexpress-v2m-rs1.dtsi" diff --git a/Documentation/devicetree/bindings/gpio/gpio_atmel.txt b/Documentation/devicetree/bindings/gpio/gpio_atmel.txt new file mode 100644 index 00000000000..66efc804806 --- /dev/null +++ b/Documentation/devicetree/bindings/gpio/gpio_atmel.txt @@ -0,0 +1,20 @@ +* Atmel GPIO controller (PIO) + +Required properties: +- compatible: "atmel,<chip>-gpio", where <chip> is at91rm9200 or at91sam9x5. +- reg: Should contain GPIO controller registers location and length +- interrupts: Should be the port interrupt shared by all the pins. +- #gpio-cells: Should be two.  The first cell is the pin number and +  the second cell is used to specify optional parameters (currently +  unused). +- gpio-controller: Marks the device node as a GPIO controller. + +Example: +	pioA: gpio@fffff200 { +		compatible = "atmel,at91rm9200-gpio"; +		reg = <0xfffff200 0x100>; +		interrupts = <2 4>; +		#gpio-cells = <2>; +		gpio-controller; +	}; + diff --git a/Documentation/devicetree/bindings/gpio/mrvl-gpio.txt b/Documentation/devicetree/bindings/gpio/mrvl-gpio.txt new file mode 100644 index 00000000000..1e34cfe5ebe --- /dev/null +++ b/Documentation/devicetree/bindings/gpio/mrvl-gpio.txt @@ -0,0 +1,23 @@ +* Marvell PXA GPIO controller + +Required properties: +- compatible : Should be "mrvl,pxa-gpio" or "mrvl,mmp-gpio" +- reg : Address and length of the register set for the device +- interrupts : Should be the port interrupt shared by all gpio pins, if +- interrupt-name : Should be the name of irq resource. +  one number. +- gpio-controller : Marks the device node as a gpio controller. +- #gpio-cells : Should be one.  It is the pin number. + +Example: + +	gpio: gpio@d4019000 { +		compatible = "mrvl,mmp-gpio", "mrvl,pxa-gpio"; +		reg = <0xd4019000 0x1000>; +		interrupts = <49>, <17>, <18>; +		interrupt-name = "gpio_mux", "gpio0", "gpio1"; +		gpio-controller; +		#gpio-cells = <1>; +		interrupt-controller; +		#interrupt-cells = <1>; +      }; diff --git a/Documentation/devicetree/bindings/i2c/mrvl-i2c.txt b/Documentation/devicetree/bindings/i2c/mrvl-i2c.txt new file mode 100644 index 00000000000..071eb3caae9 --- /dev/null +++ b/Documentation/devicetree/bindings/i2c/mrvl-i2c.txt @@ -0,0 +1,37 @@ +* I2C + +Required properties : + + - reg : Offset and length of the register set for the device + - compatible : should be "mrvl,mmp-twsi" where CHIP is the name of a +   compatible processor, e.g. pxa168, pxa910, mmp2, mmp3. +   For the pxa2xx/pxa3xx, an additional node "mrvl,pxa-i2c" is required +   as shown in the example below. + +Recommended properties : + + - interrupts : <a b> where a is the interrupt number and b is a +   field that represents an encoding of the sense and level +   information for the interrupt.  This should be encoded based on +   the information in section 2) depending on the type of interrupt +   controller you have. + - interrupt-parent : the phandle for the interrupt controller that +   services interrupts for this device. + - mrvl,i2c-polling : Disable interrupt of i2c controller. Polling +   status register of i2c controller instead. + - mrvl,i2c-fast-mode : Enable fast mode of i2c controller. + +Examples: +	twsi1: i2c@d4011000 { +		compatible = "mrvl,mmp-twsi", "mrvl,pxa-i2c"; +		reg = <0xd4011000 0x1000>; +		interrupts = <7>; +		mrvl,i2c-fast-mode; +	}; +	 +	twsi2: i2c@d4025000 { +		compatible = "mrvl,mmp-twsi", "mrvl,pxa-i2c"; +		reg = <0xd4025000 0x1000>; +		interrupts = <58>; +	}; + diff --git a/Documentation/devicetree/bindings/rtc/sa1100-rtc.txt b/Documentation/devicetree/bindings/rtc/sa1100-rtc.txt new file mode 100644 index 00000000000..0cda19ad485 --- /dev/null +++ b/Documentation/devicetree/bindings/rtc/sa1100-rtc.txt @@ -0,0 +1,17 @@ +* Marvell Real Time Clock controller + +Required properties: +- compatible: should be "mrvl,sa1100-rtc" +- reg: physical base address of the controller and length of memory mapped +  region. +- interrupts: Should be two. The first interrupt number is the rtc alarm +  interrupt and the second interrupt number is the rtc hz interrupt. +- interrupt-names: Assign name of irq resource. + +Example: +	rtc: rtc@d4010000 { +		compatible = "mrvl,mmp-rtc"; +		reg = <0xd4010000 0x1000>; +		interrupts = <5>, <6>; +		interrupt-name = "rtc 1Hz", "rtc alarm"; +	}; diff --git a/Documentation/devicetree/bindings/serial/mrvl-serial.txt b/Documentation/devicetree/bindings/serial/mrvl-serial.txt new file mode 100644 index 00000000000..d744340de88 --- /dev/null +++ b/Documentation/devicetree/bindings/serial/mrvl-serial.txt @@ -0,0 +1,4 @@ +PXA UART controller + +Required properties: +- compatible : should be "mrvl,mmp-uart" or "mrvl,pxa-uart". diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 8ef416a3a55..94422601ea5 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -325,6 +325,7 @@ config ARCH_AT91  	select ARCH_REQUIRE_GPIOLIB  	select HAVE_CLK  	select CLKDEV_LOOKUP +	select IRQ_DOMAIN  	help  	  This enables support for systems based on the Atmel AT91RM9200,  	  AT91SAM9 processors. diff --git a/arch/arm/boot/dts/am3517_mt_ventoux.dts b/arch/arm/boot/dts/am3517_mt_ventoux.dts new file mode 100644 index 00000000000..5eb26d7d9b4 --- /dev/null +++ b/arch/arm/boot/dts/am3517_mt_ventoux.dts @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2011 Ilya Yanok, EmCraft Systems + * + * 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. + */ +/dts-v1/; + +/include/ "omap3.dtsi" + +/ { +	model = "TeeJet Mt.Ventoux"; +	compatible = "teejet,mt_ventoux", "ti,omap3"; + +	memory { +		device_type = "memory"; +		reg = <0x80000000 0x10000000>; /* 256 MB */ +	}; + +	/* AM35xx doesn't have IVA */ +	soc { +		iva { +			status = "disabled"; +		}; +	}; +}; diff --git a/arch/arm/boot/dts/at91sam9g20.dtsi b/arch/arm/boot/dts/at91sam9g20.dtsi index 07603b8c950..a100db03ec9 100644 --- a/arch/arm/boot/dts/at91sam9g20.dtsi +++ b/arch/arm/boot/dts/at91sam9g20.dtsi @@ -23,6 +23,11 @@  		serial4 = &usart3;  		serial5 = &usart4;  		serial6 = &usart5; +		gpio0 = &pioA; +		gpio1 = &pioB; +		gpio2 = &pioC; +		tcb0 = &tcb0; +		tcb1 = &tcb1;  	};  	cpus {  		cpu@0 { @@ -47,24 +52,69 @@  			ranges;  			aic: interrupt-controller@fffff000 { -				#interrupt-cells = <1>; +				#interrupt-cells = <2>;  				compatible = "atmel,at91rm9200-aic";  				interrupt-controller;  				interrupt-parent;  				reg = <0xfffff000 0x200>;  			}; +			pit: timer@fffffd30 { +				compatible = "atmel,at91sam9260-pit"; +				reg = <0xfffffd30 0xf>; +				interrupts = <1 4>; +			}; + +			tcb0: timer@fffa0000 { +				compatible = "atmel,at91rm9200-tcb"; +				reg = <0xfffa0000 0x100>; +				interrupts = <17 4 18 4 19 4>; +			}; + +			tcb1: timer@fffdc000 { +				compatible = "atmel,at91rm9200-tcb"; +				reg = <0xfffdc000 0x100>; +				interrupts = <26 4 27 4 28 4>; +			}; + +			pioA: gpio@fffff400 { +				compatible = "atmel,at91rm9200-gpio"; +				reg = <0xfffff400 0x100>; +				interrupts = <2 4>; +				#gpio-cells = <2>; +				gpio-controller; +				interrupt-controller; +			}; + +			pioB: gpio@fffff600 { +				compatible = "atmel,at91rm9200-gpio"; +				reg = <0xfffff600 0x100>; +				interrupts = <3 4>; +				#gpio-cells = <2>; +				gpio-controller; +				interrupt-controller; +			}; + +			pioC: gpio@fffff800 { +				compatible = "atmel,at91rm9200-gpio"; +				reg = <0xfffff800 0x100>; +				interrupts = <4 4>; +				#gpio-cells = <2>; +				gpio-controller; +				interrupt-controller; +			}; +  			dbgu: serial@fffff200 {  				compatible = "atmel,at91sam9260-usart";  				reg = <0xfffff200 0x200>; -				interrupts = <1>; +				interrupts = <1 4>;  				status = "disabled";  			};  			usart0: serial@fffb0000 {  				compatible = "atmel,at91sam9260-usart";  				reg = <0xfffb0000 0x200>; -				interrupts = <6>; +				interrupts = <6 4>;  				atmel,use-dma-rx;  				atmel,use-dma-tx;  				status = "disabled"; @@ -73,7 +123,7 @@  			usart1: serial@fffb4000 {  				compatible = "atmel,at91sam9260-usart";  				reg = <0xfffb4000 0x200>; -				interrupts = <7>; +				interrupts = <7 4>;  				atmel,use-dma-rx;  				atmel,use-dma-tx;  				status = "disabled"; @@ -82,7 +132,7 @@  			usart2: serial@fffb8000 {  				compatible = "atmel,at91sam9260-usart";  				reg = <0xfffb8000 0x200>; -				interrupts = <8>; +				interrupts = <8 4>;  				atmel,use-dma-rx;  				atmel,use-dma-tx;  				status = "disabled"; @@ -91,7 +141,7 @@  			usart3: serial@fffd0000 {  				compatible = "atmel,at91sam9260-usart";  				reg = <0xfffd0000 0x200>; -				interrupts = <23>; +				interrupts = <23 4>;  				atmel,use-dma-rx;  				atmel,use-dma-tx;  				status = "disabled"; @@ -100,7 +150,7 @@  			usart4: serial@fffd4000 {  				compatible = "atmel,at91sam9260-usart";  				reg = <0xfffd4000 0x200>; -				interrupts = <24>; +				interrupts = <24 4>;  				atmel,use-dma-rx;  				atmel,use-dma-tx;  				status = "disabled"; @@ -109,7 +159,7 @@  			usart5: serial@fffd8000 {  				compatible = "atmel,at91sam9260-usart";  				reg = <0xfffd8000 0x200>; -				interrupts = <25>; +				interrupts = <25 4>;  				atmel,use-dma-rx;  				atmel,use-dma-tx;  				status = "disabled"; @@ -118,7 +168,7 @@  			macb0: ethernet@fffc4000 {  				compatible = "cdns,at32ap7000-macb", "cdns,macb";  				reg = <0xfffc4000 0x100>; -				interrupts = <21>; +				interrupts = <21 4>;  				status = "disabled";  			};  		}; diff --git a/arch/arm/boot/dts/at91sam9g45.dtsi b/arch/arm/boot/dts/at91sam9g45.dtsi index fffa005300a..f779667159b 100644 --- a/arch/arm/boot/dts/at91sam9g45.dtsi +++ b/arch/arm/boot/dts/at91sam9g45.dtsi @@ -22,6 +22,13 @@  		serial2 = &usart1;  		serial3 = &usart2;  		serial4 = &usart3; +		gpio0 = &pioA; +		gpio1 = &pioB; +		gpio2 = &pioC; +		gpio3 = &pioD; +		gpio4 = &pioE; +		tcb0 = &tcb0; +		tcb1 = &tcb1;  	};  	cpus {  		cpu@0 { @@ -46,30 +53,94 @@  			ranges;  			aic: interrupt-controller@fffff000 { -				#interrupt-cells = <1>; +				#interrupt-cells = <2>;  				compatible = "atmel,at91rm9200-aic";  				interrupt-controller;  				interrupt-parent;  				reg = <0xfffff000 0x200>;  			}; +			pit: timer@fffffd30 { +				compatible = "atmel,at91sam9260-pit"; +				reg = <0xfffffd30 0xf>; +				interrupts = <1 4>; +			}; + + +			tcb0: timer@fff7c000 { +				compatible = "atmel,at91rm9200-tcb"; +				reg = <0xfff7c000 0x100>; +				interrupts = <18 4>; +			}; + +			tcb1: timer@fffd4000 { +				compatible = "atmel,at91rm9200-tcb"; +				reg = <0xfffd4000 0x100>; +				interrupts = <18 4>; +			}; +  			dma: dma-controller@ffffec00 {  				compatible = "atmel,at91sam9g45-dma";  				reg = <0xffffec00 0x200>; -				interrupts = <21>; +				interrupts = <21 4>; +			}; + +			pioA: gpio@fffff200 { +				compatible = "atmel,at91rm9200-gpio"; +				reg = <0xfffff200 0x100>; +				interrupts = <2 4>; +				#gpio-cells = <2>; +				gpio-controller; +				interrupt-controller; +			}; + +			pioB: gpio@fffff400 { +				compatible = "atmel,at91rm9200-gpio"; +				reg = <0xfffff400 0x100>; +				interrupts = <3 4>; +				#gpio-cells = <2>; +				gpio-controller; +				interrupt-controller; +			}; + +			pioC: gpio@fffff600 { +				compatible = "atmel,at91rm9200-gpio"; +				reg = <0xfffff600 0x100>; +				interrupts = <4 4>; +				#gpio-cells = <2>; +				gpio-controller; +				interrupt-controller; +			}; + +			pioD: gpio@fffff800 { +				compatible = "atmel,at91rm9200-gpio"; +				reg = <0xfffff800 0x100>; +				interrupts = <5 4>; +				#gpio-cells = <2>; +				gpio-controller; +				interrupt-controller; +			}; + +			pioE: gpio@fffffa00 { +				compatible = "atmel,at91rm9200-gpio"; +				reg = <0xfffffa00 0x100>; +				interrupts = <5 4>; +				#gpio-cells = <2>; +				gpio-controller; +				interrupt-controller;  			};  			dbgu: serial@ffffee00 {  				compatible = "atmel,at91sam9260-usart";  				reg = <0xffffee00 0x200>; -				interrupts = <1>; +				interrupts = <1 4>;  				status = "disabled";  			};  			usart0: serial@fff8c000 {  				compatible = "atmel,at91sam9260-usart";  				reg = <0xfff8c000 0x200>; -				interrupts = <7>; +				interrupts = <7 4>;  				atmel,use-dma-rx;  				atmel,use-dma-tx;  				status = "disabled"; @@ -78,7 +149,7 @@  			usart1: serial@fff90000 {  				compatible = "atmel,at91sam9260-usart";  				reg = <0xfff90000 0x200>; -				interrupts = <8>; +				interrupts = <8 4>;  				atmel,use-dma-rx;  				atmel,use-dma-tx;  				status = "disabled"; @@ -87,7 +158,7 @@  			usart2: serial@fff94000 {  				compatible = "atmel,at91sam9260-usart";  				reg = <0xfff94000 0x200>; -				interrupts = <9>; +				interrupts = <9 4>;  				atmel,use-dma-rx;  				atmel,use-dma-tx;  				status = "disabled"; @@ -96,7 +167,7 @@  			usart3: serial@fff98000 {  				compatible = "atmel,at91sam9260-usart";  				reg = <0xfff98000 0x200>; -				interrupts = <10>; +				interrupts = <10 4>;  				atmel,use-dma-rx;  				atmel,use-dma-tx;  				status = "disabled"; @@ -105,7 +176,7 @@  			macb0: ethernet@fffbc000 {  				compatible = "cdns,at32ap7000-macb", "cdns,macb";  				reg = <0xfffbc000 0x100>; -				interrupts = <25>; +				interrupts = <25 4>;  				status = "disabled";  			};  		}; diff --git a/arch/arm/boot/dts/at91sam9m10g45ek.dts b/arch/arm/boot/dts/at91sam9m10g45ek.dts index a387e7704ce..15e25f903ca 100644 --- a/arch/arm/boot/dts/at91sam9m10g45ek.dts +++ b/arch/arm/boot/dts/at91sam9m10g45ek.dts @@ -37,4 +37,76 @@  			};  		};  	}; + +	leds { +		compatible = "gpio-leds"; + +		d8 { +			label = "d8"; +			gpios = <&pioD 30 0>; +			linux,default-trigger = "heartbeat"; +		}; + +		d6 { +			label = "d6"; +			gpios = <&pioD 0 1>; +			linux,default-trigger = "nand-disk"; +		}; + +		d7 { +			label = "d7"; +			gpios = <&pioD 31 1>; +			linux,default-trigger = "mmc0"; +		}; +	}; + +	gpio_keys { +		compatible = "gpio-keys"; +		#address-cells = <1>; +		#size-cells = <0>; + +		left_click { +			label = "left_click"; +			gpios = <&pioB 6 1>; +			linux,code = <272>; +			gpio-key,wakeup; +		}; + +		right_click { +			label = "right_click"; +			gpios = <&pioB 7 1>; +			linux,code = <273>; +			gpio-key,wakeup; +		}; + +		left { +			label = "Joystick Left"; +			gpios = <&pioB 14 1>; +			linux,code = <105>; +		}; + +		right { +			label = "Joystick Right"; +			gpios = <&pioB 15 1>; +			linux,code = <106>; +		}; + +		up { +			label = "Joystick Up"; +			gpios = <&pioB 16 1>; +			linux,code = <103>; +		}; + +		down { +			label = "Joystick Down"; +			gpios = <&pioB 17 1>; +			linux,code = <108>; +		}; + +		enter { +			label = "Joystick Press"; +			gpios = <&pioB 18 1>; +			linux,code = <28>; +		}; +	};  }; diff --git a/arch/arm/boot/dts/at91sam9x5.dtsi b/arch/arm/boot/dts/at91sam9x5.dtsi index e91391f5073..a02e636d8a5 100644 --- a/arch/arm/boot/dts/at91sam9x5.dtsi +++ b/arch/arm/boot/dts/at91sam9x5.dtsi @@ -89,35 +89,39 @@  			};  			pioA: gpio@fffff400 { -				compatible = "atmel,at91rm9200-gpio"; +				compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio";  				reg = <0xfffff400 0x100>;  				interrupts = <2 4>;  				#gpio-cells = <2>;  				gpio-controller; +				interrupt-controller;  			};  			pioB: gpio@fffff600 { -				compatible = "atmel,at91rm9200-gpio"; +				compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio";  				reg = <0xfffff600 0x100>;  				interrupts = <2 4>;  				#gpio-cells = <2>;  				gpio-controller; +				interrupt-controller;  			};  			pioC: gpio@fffff800 { -				compatible = "atmel,at91rm9200-gpio"; +				compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio";  				reg = <0xfffff800 0x100>;  				interrupts = <3 4>;  				#gpio-cells = <2>;  				gpio-controller; +				interrupt-controller;  			};  			pioD: gpio@fffffa00 { -				compatible = "atmel,at91rm9200-gpio"; +				compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio";  				reg = <0xfffffa00 0x100>;  				interrupts = <3 4>;  				#gpio-cells = <2>;  				gpio-controller; +				interrupt-controller;  			};  			dbgu: serial@fffff200 { diff --git a/arch/arm/boot/dts/at91sam9x5cm.dtsi b/arch/arm/boot/dts/at91sam9x5cm.dtsi index 4ab5a77f4af..64ae3e89025 100644 --- a/arch/arm/boot/dts/at91sam9x5cm.dtsi +++ b/arch/arm/boot/dts/at91sam9x5cm.dtsi @@ -11,4 +11,19 @@  	memory@20000000 {  		reg = <0x20000000 0x8000000>;  	}; + +	leds { +		compatible = "gpio-leds"; + +		pb18 { +			label = "pb18"; +			gpios = <&pioB 18 1>; +			linux,default-trigger = "heartbeat"; +		}; + +		pd21 { +			label = "pd21"; +			gpios = <&pioD 21 0>; +		}; +	};  }; diff --git a/arch/arm/boot/dts/imx27-phytec-phycore.dts b/arch/arm/boot/dts/imx27-phytec-phycore.dts new file mode 100644 index 00000000000..a51a08fc2af --- /dev/null +++ b/arch/arm/boot/dts/imx27-phytec-phycore.dts @@ -0,0 +1,76 @@ +/* + * Copyright 2012 Sascha Hauer, Pengutronix + * + * 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/ "imx27.dtsi" + +/ { +	model = "Phytec pcm038"; +	compatible = "phytec,imx27-pcm038", "fsl,imx27"; + +	memory { +		reg = <0x0 0x0>; +	}; + +	soc { +		aipi@10000000 { /* aipi */ + +			wdog@10002000 { +				status = "okay"; +			}; + +			uart@1000a000 { +				fsl,uart-has-rtscts; +				status = "okay"; +			}; + +			uart@1000b000 { +				fsl,uart-has-rtscts; +				status = "okay"; +			}; + +			uart@1000c000 { +				fsl,uart-has-rtscts; +				status = "okay"; +			}; + +			fec@1002b000 { +				status = "okay"; +			}; + +			i2c@1001d000 { +				clock-frequency = <400000>; +				status = "okay"; +				at24@4c { +					compatible = "at,24c32"; +					pagesize = <32>; +					reg = <0x52>; +				}; +				pcf8563@51 { +					compatible = "nxp,pcf8563"; +					reg = <0x51>; +				}; +				lm75@4a { +					compatible = "national,lm75"; +					reg = <0x4a>; +				}; +			}; +		}; +	}; + +	nor_flash@c0000000 { +		compatible = "cfi-flash"; +		bank-width = <2>; +		reg = <0xc0000000 0x02000000>; +		#address-cells = <1>; +		#size-cells = <1>; +	}; +}; diff --git a/arch/arm/boot/dts/imx27.dtsi b/arch/arm/boot/dts/imx27.dtsi new file mode 100644 index 00000000000..bc5e7d5ddd5 --- /dev/null +++ b/arch/arm/boot/dts/imx27.dtsi @@ -0,0 +1,217 @@ +/* + * Copyright 2012 Sascha Hauer, Pengutronix + * + * 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 = &uart1; +		serial1 = &uart2; +		serial2 = &uart3; +		serial3 = &uart4; +		serial4 = &uart5; +		serial5 = &uart6; +	}; + +	avic: avic-interrupt-controller@e0000000 { +		compatible = "fsl,imx27-avic", "fsl,avic"; +		interrupt-controller; +		#interrupt-cells = <1>; +		reg = <0x10040000 0x1000>; +	}; + +	clocks { +		#address-cells = <1>; +		#size-cells = <0>; + +		osc26m { +			compatible = "fsl,imx-osc26m", "fixed-clock"; +			clock-frequency = <26000000>; +		}; +	}; + +	soc { +		#address-cells = <1>; +		#size-cells = <1>; +		compatible = "simple-bus"; +		interrupt-parent = <&avic>; +		ranges; + +		aipi@10000000 { /* AIPI1 */ +			compatible = "fsl,aipi-bus", "simple-bus"; +			#address-cells = <1>; +			#size-cells = <1>; +			reg = <0x10000000 0x10000000>; +			ranges; + +			wdog@10002000 { +				compatible = "fsl,imx27-wdt", "fsl,imx21-wdt"; +				reg = <0x10002000 0x4000>; +				interrupts = <27>; +				status = "disabled"; +			}; + +			uart1: uart@1000a000 { +				compatible = "fsl,imx27-uart", "fsl,imx21-uart"; +				reg = <0x1000a000 0x1000>; +				interrupts = <20>; +				status = "disabled"; +			}; + +			uart2: uart@1000b000 { +				compatible = "fsl,imx27-uart", "fsl,imx21-uart"; +				reg = <0x1000b000 0x1000>; +				interrupts = <19>; +				status = "disabled"; +			}; + +			uart3: uart@1000c000 { +				compatible = "fsl,imx27-uart", "fsl,imx21-uart"; +				reg = <0x1000c000 0x1000>; +				interrupts = <18>; +				status = "disabled"; +			}; + +			uart4: uart@1000d000 { +				compatible = "fsl,imx27-uart", "fsl,imx21-uart"; +				reg = <0x1000d000 0x1000>; +				interrupts = <17>; +				status = "disabled"; +			}; + +			cspi1: cspi@1000e000 { +				#address-cells = <1>; +				#size-cells = <0>; +				compatible = "fsl,imx27-cspi"; +				reg = <0x1000e000 0x1000>; +				interrupts = <16>; +				status = "disabled"; +			}; + +			cspi2: cspi@1000f000 { +				#address-cells = <1>; +				#size-cells = <0>; +				compatible = "fsl,imx27-cspi"; +				reg = <0x1000f000 0x1000>; +				interrupts = <15>; +				status = "disabled"; +			}; + +			i2c1: i2c@10012000 { +				#address-cells = <1>; +				#size-cells = <0>; +				compatible = "fsl,imx27-i2c", "fsl,imx1-i2c"; +				reg = <0x10012000 0x1000>; +				interrupts = <12>; +				status = "disabled"; +			}; + +			gpio1: gpio@10015000 { +				compatible = "fsl,imx27-gpio", "fsl,imx21-gpio"; +				reg = <0x10015000 0x100>; +				interrupts = <8>; +				gpio-controller; +				#gpio-cells = <2>; +				interrupt-controller; +				#interrupt-cells = <1>; +			}; + +			gpio2: gpio@10015100 { +				compatible = "fsl,imx27-gpio", "fsl,imx21-gpio"; +				reg = <0x10015100 0x100>; +				interrupts = <8>; +				gpio-controller; +				#gpio-cells = <2>; +				interrupt-controller; +				#interrupt-cells = <1>; +			}; + +			gpio3: gpio@10015200 { +				compatible = "fsl,imx27-gpio", "fsl,imx21-gpio"; +				reg = <0x10015200 0x100>; +				interrupts = <8>; +				gpio-controller; +				#gpio-cells = <2>; +				interrupt-controller; +				#interrupt-cells = <1>; +			}; + +			gpio4: gpio@10015300 { +				compatible = "fsl,imx27-gpio", "fsl,imx21-gpio"; +				reg = <0x10015300 0x100>; +				interrupts = <8>; +				gpio-controller; +				#gpio-cells = <2>; +				interrupt-controller; +				#interrupt-cells = <1>; +			}; + +			gpio5: gpio@10015400 { +				compatible = "fsl,imx27-gpio", "fsl,imx21-gpio"; +				reg = <0x10015400 0x100>; +				interrupts = <8>; +				gpio-controller; +				#gpio-cells = <2>; +				interrupt-controller; +				#interrupt-cells = <1>; +			}; + +			gpio6: gpio@10015500 { +				compatible = "fsl,imx27-gpio", "fsl,imx21-gpio"; +				reg = <0x10015500 0x100>; +				interrupts = <8>; +				gpio-controller; +				#gpio-cells = <2>; +				interrupt-controller; +				#interrupt-cells = <1>; +			}; + +			cspi3: cspi@10017000 { +				#address-cells = <1>; +				#size-cells = <0>; +				compatible = "fsl,imx27-cspi"; +				reg = <0x10017000 0x1000>; +				interrupts = <6>; +				status = "disabled"; +			}; + +			uart5: uart@1001b000 { +				compatible = "fsl,imx27-uart", "fsl,imx21-uart"; +				reg = <0x1001b000 0x1000>; +				interrupts = <49>; +				status = "disabled"; +			}; + +			uart6: uart@1001c000 { +				compatible = "fsl,imx27-uart", "fsl,imx21-uart"; +				reg = <0x1001c000 0x1000>; +				interrupts = <48>; +				status = "disabled"; +			}; + +			i2c2: i2c@1001d000 { +				#address-cells = <1>; +				#size-cells = <0>; +				compatible = "fsl,imx27-i2c", "fsl,imx1-i2c"; +				reg = <0x1001d000 0x1000>; +				interrupts = <1>; +				status = "disabled"; +			}; + +			fec: fec@1002b000 { +				compatible = "fsl,imx27-fec"; +				reg = <0x1002b000 0x4000>; +				interrupts = <50>; +				status = "disabled"; +			}; +		}; +	}; +}; diff --git a/arch/arm/boot/dts/imx51-babbage.dts b/arch/arm/boot/dts/imx51-babbage.dts index 564cb8c19f1..9949e6060de 100644 --- a/arch/arm/boot/dts/imx51-babbage.dts +++ b/arch/arm/boot/dts/imx51-babbage.dts @@ -56,8 +56,95 @@  						compatible = "fsl,mc13892";  						spi-max-frequency = <6000000>;  						reg = <0>; -						mc13xxx-irq-gpios = <&gpio1 8 0>; -						fsl,mc13xxx-uses-regulator; +						interrupt-parent = <&gpio1>; +						interrupts = <8>; + +						regulators { +							sw1_reg: sw1 { +								regulator-min-microvolt = <600000>; +								regulator-max-microvolt = <1375000>; +								regulator-boot-on; +								regulator-always-on; +							}; + +							sw2_reg: sw2 { +								regulator-min-microvolt = <900000>; +								regulator-max-microvolt = <1850000>; +								regulator-boot-on; +								regulator-always-on; +							}; + +							sw3_reg: sw3 { +								regulator-min-microvolt = <1100000>; +								regulator-max-microvolt = <1850000>; +								regulator-boot-on; +								regulator-always-on; +							}; + +							sw4_reg: sw4 { +								regulator-min-microvolt = <1100000>; +								regulator-max-microvolt = <1850000>; +								regulator-boot-on; +								regulator-always-on; +							}; + +							vpll_reg: vpll { +								regulator-min-microvolt = <1050000>; +								regulator-max-microvolt = <1800000>; +								regulator-boot-on; +								regulator-always-on; +							}; + +							vdig_reg: vdig { +								regulator-min-microvolt = <1650000>; +								regulator-max-microvolt = <1650000>; +								regulator-boot-on; +							}; + +							vsd_reg: vsd { +								regulator-min-microvolt = <1800000>; +								regulator-max-microvolt = <3150000>; +							}; + +							vusb2_reg: vusb2 { +								regulator-min-microvolt = <2400000>; +								regulator-max-microvolt = <2775000>; +								regulator-boot-on; +								regulator-always-on; +							}; + +							vvideo_reg: vvideo { +								regulator-min-microvolt = <2775000>; +								regulator-max-microvolt = <2775000>; +							}; + +							vaudio_reg: vaudio { +								regulator-min-microvolt = <2300000>; +								regulator-max-microvolt = <3000000>; +							}; + +							vcam_reg: vcam { +								regulator-min-microvolt = <2500000>; +								regulator-max-microvolt = <3000000>; +							}; + +							vgen1_reg: vgen1 { +								regulator-min-microvolt = <1200000>; +								regulator-max-microvolt = <1200000>; +							}; + +							vgen2_reg: vgen2 { +								regulator-min-microvolt = <1200000>; +								regulator-max-microvolt = <3150000>; +								regulator-always-on; +							}; + +							vgen3_reg: vgen3 { +								regulator-min-microvolt = <1800000>; +								regulator-max-microvolt = <2900000>; +								regulator-always-on; +							}; +						};  					};  					flash: at45db321d@1 { diff --git a/arch/arm/boot/dts/imx6q-arm2.dts b/arch/arm/boot/dts/imx6q-arm2.dts index c3977e0478b..ce1c8238c89 100644 --- a/arch/arm/boot/dts/imx6q-arm2.dts +++ b/arch/arm/boot/dts/imx6q-arm2.dts @@ -36,11 +36,13 @@  			usdhc@02198000 { /* uSDHC3 */  				cd-gpios = <&gpio6 11 0>;  				wp-gpios = <&gpio6 14 0>; +				vmmc-supply = <®_3p3v>;  				status = "okay";  			};  			usdhc@0219c000 { /* uSDHC4 */  				fsl,card-wired; +				vmmc-supply = <®_3p3v>;  				status = "okay";  			}; @@ -50,6 +52,18 @@  		};  	}; +	regulators { +		compatible = "simple-bus"; + +		reg_3p3v: 3p3v { +			compatible = "regulator-fixed"; +			regulator-name = "3P3V"; +			regulator-min-microvolt = <3300000>; +			regulator-max-microvolt = <3300000>; +			regulator-always-on; +		}; +	}; +  	leds {  		compatible = "gpio-leds"; diff --git a/arch/arm/boot/dts/imx6q-sabrelite.dts b/arch/arm/boot/dts/imx6q-sabrelite.dts index 08d920de728..4663a4e5a28 100644 --- a/arch/arm/boot/dts/imx6q-sabrelite.dts +++ b/arch/arm/boot/dts/imx6q-sabrelite.dts @@ -32,18 +32,52 @@  			usdhc@02198000 { /* uSDHC3 */  				cd-gpios = <&gpio7 0 0>;  				wp-gpios = <&gpio7 1 0>; +				vmmc-supply = <®_3p3v>;  				status = "okay";  			};  			usdhc@0219c000 { /* uSDHC4 */  				cd-gpios = <&gpio2 6 0>;  				wp-gpios = <&gpio2 7 0>; +				vmmc-supply = <®_3p3v>;  				status = "okay";  			};  			uart2: uart@021e8000 {  				status = "okay";  			}; + +			i2c@021a0000 { /* I2C1 */ +				status = "okay"; +				clock-frequency = <100000>; + +				codec: sgtl5000@0a { +					compatible = "fsl,sgtl5000"; +					reg = <0x0a>; +					VDDA-supply = <®_2p5v>; +					VDDIO-supply = <®_3p3v>; +				}; +			}; +		}; +	}; + +	regulators { +		compatible = "simple-bus"; + +		reg_2p5v: 2p5v { +			compatible = "regulator-fixed"; +			regulator-name = "2P5V"; +			regulator-min-microvolt = <2500000>; +			regulator-max-microvolt = <2500000>; +			regulator-always-on; +		}; + +		reg_3p3v: 3p3v { +			compatible = "regulator-fixed"; +			regulator-name = "3P3V"; +			regulator-min-microvolt = <3300000>; +			regulator-max-microvolt = <3300000>; +			regulator-always-on;  		};  	};  }; diff --git a/arch/arm/boot/dts/omap3-beagle.dts b/arch/arm/boot/dts/omap3-beagle.dts index 9486be62bcd..9f72cd4cf30 100644 --- a/arch/arm/boot/dts/omap3-beagle.dts +++ b/arch/arm/boot/dts/omap3-beagle.dts @@ -13,15 +13,6 @@  	model = "TI OMAP3 BeagleBoard";  	compatible = "ti,omap3-beagle", "ti,omap3"; -	/* -	 * Since the initial device tree board file does not create any -	 * devices (MMC, network...), the only way to boot is to provide a -	 * ramdisk. -	 */ -	chosen { -		bootargs = "root=/dev/ram0 rw console=ttyO2,115200n8 initrd=0x81600000,20M ramdisk_size=20480 no_console_suspend debug earlyprintk"; -	}; -  	memory {  		device_type = "memory";  		reg = <0x80000000 0x20000000>; /* 512 MB */ diff --git a/arch/arm/boot/dts/omap3-evm.dts b/arch/arm/boot/dts/omap3-evm.dts new file mode 100644 index 00000000000..2eee16ec59b --- /dev/null +++ b/arch/arm/boot/dts/omap3-evm.dts @@ -0,0 +1,20 @@ +/* + * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/ + * + * 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. + */ +/dts-v1/; + +/include/ "omap3.dtsi" + +/ { +	model = "TI OMAP3 EVM (OMAP3530, AM/DM37x)"; +	compatible = "ti,omap3-evm", "ti,omap3"; + +	memory { +		device_type = "memory"; +		reg = <0x80000000 0x10000000>; /* 256 MB */ +	}; +}; diff --git a/arch/arm/boot/dts/omap3.dtsi b/arch/arm/boot/dts/omap3.dtsi index 216c3317461..c6121357c1e 100644 --- a/arch/arm/boot/dts/omap3.dtsi +++ b/arch/arm/boot/dts/omap3.dtsi @@ -61,34 +61,57 @@  		ranges;  		ti,hwmods = "l3_main"; -		intc: interrupt-controller@1 { -			compatible = "ti,omap3-intc"; +		intc: interrupt-controller@48200000 { +			compatible = "ti,omap2-intc";  			interrupt-controller;  			#interrupt-cells = <1>; +			ti,intc-size = <96>; +			reg = <0x48200000 0x1000>;  		}; -		uart1: serial@0x4806a000 { +		uart1: serial@4806a000 {  			compatible = "ti,omap3-uart";  			ti,hwmods = "uart1";  			clock-frequency = <48000000>;  		}; -		uart2: serial@0x4806c000 { +		uart2: serial@4806c000 {  			compatible = "ti,omap3-uart";  			ti,hwmods = "uart2";  			clock-frequency = <48000000>;  		}; -		uart3: serial@0x49020000 { +		uart3: serial@49020000 {  			compatible = "ti,omap3-uart";  			ti,hwmods = "uart3";  			clock-frequency = <48000000>;  		}; -		uart4: serial@0x49042000 { +		uart4: serial@49042000 {  			compatible = "ti,omap3-uart";  			ti,hwmods = "uart4";  			clock-frequency = <48000000>;  		}; + +		i2c1: i2c@48070000 { +			compatible = "ti,omap3-i2c"; +			#address-cells = <1>; +			#size-cells = <0>; +			ti,hwmods = "i2c1"; +		}; + +		i2c2: i2c@48072000 { +			compatible = "ti,omap3-i2c"; +			#address-cells = <1>; +			#size-cells = <0>; +			ti,hwmods = "i2c2"; +		}; + +		i2c3: i2c@48060000 { +			compatible = "ti,omap3-i2c"; +			#address-cells = <1>; +			#size-cells = <0>; +			ti,hwmods = "i2c3"; +		};  	};  }; diff --git a/arch/arm/boot/dts/omap4-panda.dts b/arch/arm/boot/dts/omap4-panda.dts index c7026578ce7..9755ad5917f 100644 --- a/arch/arm/boot/dts/omap4-panda.dts +++ b/arch/arm/boot/dts/omap4-panda.dts @@ -13,15 +13,6 @@  	model = "TI OMAP4 PandaBoard";  	compatible = "ti,omap4-panda", "ti,omap4430", "ti,omap4"; -	/* -	 * Since the initial device tree board file does not create any -	 * devices (MMC, network...), the only way to boot is to provide a -	 * ramdisk. -	 */ -	chosen { -		bootargs = "root=/dev/ram0 rw console=ttyO2,115200n8 initrd=0x81600000,20M ramdisk_size=20480 no_console_suspend debug"; -	}; -  	memory {  		device_type = "memory";  		reg = <0x80000000 0x40000000>; /* 1 GB */ diff --git a/arch/arm/boot/dts/omap4-sdp.dts b/arch/arm/boot/dts/omap4-sdp.dts index 066e28c9032..63c6b2b2bf4 100644 --- a/arch/arm/boot/dts/omap4-sdp.dts +++ b/arch/arm/boot/dts/omap4-sdp.dts @@ -13,15 +13,6 @@  	model = "TI OMAP4 SDP board";  	compatible = "ti,omap4-sdp", "ti,omap4430", "ti,omap4"; -	/* -	 * Since the initial device tree board file does not create any -	 * devices (MMC, network...), the only way to boot is to provide a -	 * ramdisk. -	 */ -	chosen { -		bootargs = "root=/dev/ram0 rw console=ttyO2,115200n8 initrd=0x81600000,20M ramdisk_size=20480 no_console_suspend debug"; -	}; -  	memory {  		device_type = "memory";  		reg = <0x80000000 0x40000000>; /* 1 GB */ diff --git a/arch/arm/boot/dts/omap4.dtsi b/arch/arm/boot/dts/omap4.dtsi index e8fe75fac7c..3d35559e77b 100644 --- a/arch/arm/boot/dts/omap4.dtsi +++ b/arch/arm/boot/dts/omap4.dtsi @@ -99,33 +99,61 @@  		gic: interrupt-controller@48241000 {  			compatible = "arm,cortex-a9-gic";  			interrupt-controller; -			#interrupt-cells = <1>; +			#interrupt-cells = <3>;  			reg = <0x48241000 0x1000>,  			      <0x48240100 0x0100>;  		}; -		uart1: serial@0x4806a000 { +		uart1: serial@4806a000 {  			compatible = "ti,omap4-uart";  			ti,hwmods = "uart1";  			clock-frequency = <48000000>;  		}; -		uart2: serial@0x4806c000 { +		uart2: serial@4806c000 {  			compatible = "ti,omap4-uart";  			ti,hwmods = "uart2";  			clock-frequency = <48000000>;  		}; -		uart3: serial@0x48020000 { +		uart3: serial@48020000 {  			compatible = "ti,omap4-uart";  			ti,hwmods = "uart3";  			clock-frequency = <48000000>;  		}; -		uart4: serial@0x4806e000 { +		uart4: serial@4806e000 {  			compatible = "ti,omap4-uart";  			ti,hwmods = "uart4";  			clock-frequency = <48000000>;  		}; + +		i2c1: i2c@48070000 { +			compatible = "ti,omap4-i2c"; +			#address-cells = <1>; +			#size-cells = <0>; +			ti,hwmods = "i2c1"; +		}; + +		i2c2: i2c@48072000 { +			compatible = "ti,omap4-i2c"; +			#address-cells = <1>; +			#size-cells = <0>; +			ti,hwmods = "i2c2"; +		}; + +		i2c3: i2c@48060000 { +			compatible = "ti,omap4-i2c"; +			#address-cells = <1>; +			#size-cells = <0>; +			ti,hwmods = "i2c3"; +		}; + +		i2c4: i2c@48350000 { +			compatible = "ti,omap4-i2c"; +			#address-cells = <1>; +			#size-cells = <0>; +			ti,hwmods = "i2c4"; +		};  	};  }; diff --git a/arch/arm/boot/dts/pxa168-aspenite.dts b/arch/arm/boot/dts/pxa168-aspenite.dts new file mode 100644 index 00000000000..e762facb3fa --- /dev/null +++ b/arch/arm/boot/dts/pxa168-aspenite.dts @@ -0,0 +1,38 @@ +/* + *  Copyright (C) 2012 Marvell Technology Group Ltd. + *  Author: Haojian Zhuang <haojian.zhuang@marvell.com> + * + *  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 + *  publishhed by the Free Software Foundation. + */ + +/dts-v1/; +/include/ "pxa168.dtsi" + +/ { +	model = "Marvell PXA168 Aspenite Development Board"; +	compatible = "mrvl,pxa168-aspenite", "mrvl,pxa168"; + +	chosen { +		bootargs = "console=ttyS0,115200 root=/dev/nfs nfsroot=192.168.1.100:/nfsroot/ ip=192.168.1.101:192.168.1.100::255.255.255.0::eth0:on"; +	}; + +	memory { +		reg = <0x00000000 0x04000000>; +	}; + +	soc { +		apb@d4000000 { +			uart1: uart@d4017000 { +				status = "okay"; +			}; +			twsi1: i2c@d4011000 { +				status = "okay"; +			}; +			rtc: rtc@d4010000 { +				status = "okay"; +			}; +		}; +	}; +}; diff --git a/arch/arm/boot/dts/pxa168.dtsi b/arch/arm/boot/dts/pxa168.dtsi new file mode 100644 index 00000000000..d32d5128f22 --- /dev/null +++ b/arch/arm/boot/dts/pxa168.dtsi @@ -0,0 +1,98 @@ +/* + *  Copyright (C) 2012 Marvell Technology Group Ltd. + *  Author: Haojian Zhuang <haojian.zhuang@marvell.com> + * + *  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 + *  publishhed by the Free Software Foundation. + */ + +/include/ "skeleton.dtsi" + +/ { +	aliases { +		serial0 = &uart1; +		serial1 = &uart2; +		serial2 = &uart3; +		i2c0 = &twsi1; +		i2c1 = &twsi2; +	}; + +	intc: intc-interrupt-controller@d4282000 { +		compatible = "mrvl,mmp-intc", "mrvl,intc"; +		interrupt-controller; +		#interrupt-cells = <1>; +		reg = <0xd4282000 0x1000>; +	}; + +	soc { +		#address-cells = <1>; +		#size-cells = <1>; +		compatible = "simple-bus"; +		interrupt-parent = <&intc>; +		ranges; + +		apb@d4000000 {	/* APB */ +			compatible = "mrvl,apb-bus", "simple-bus"; +			#address-cells = <1>; +			#size-cells = <1>; +			reg = <0xd4000000 0x00200000>; +			ranges; + +			uart1: uart@d4017000 { +				compatible = "mrvl,mmp-uart", "mrvl,pxa-uart"; +				reg = <0xd4017000 0x1000>; +				interrupts = <27>; +				status = "disabled"; +			}; + +			uart2: uart@d4018000 { +				compatible = "mrvl,mmp-uart", "mrvl,pxa-uart"; +				reg = <0xd4018000 0x1000>; +				interrupts = <28>; +				status = "disabled"; +			}; + +			uart3: uart@d4026000 { +				compatible = "mrvl,mmp-uart", "mrvl,pxa-uart"; +				reg = <0xd4026000 0x1000>; +				interrupts = <29>; +				status = "disabled"; +			}; + +			gpio: gpio@d4019000 { +				compatible = "mrvl,mmp-gpio", "mrvl,pxa-gpio"; +				reg = <0xd4019000 0x1000>; +				interrupts = <49>; +				interrupt-names = "gpio_mux"; +				gpio-controller; +				#gpio-cells = <1>; +				interrupt-controller; +				#interrupt-cells = <1>; +			}; + +			twsi1: i2c@d4011000 { +				compatible = "mrvl,mmp-twsi", "mrvl,pxa-i2c"; +				reg = <0xd4011000 0x1000>; +				interrupts = <7>; +				mrvl,i2c-fast-mode; +				status = "disabled"; +			}; + +			twsi2: i2c@d4025000 { +				compatible = "mrvl,mmp-twsi", "mrvl,pxa-i2c"; +				reg = <0xd4025000 0x1000>; +				interrupts = <58>; +				status = "disabled"; +			}; + +			rtc: rtc@d4010000 { +				compatible = "mrvl,mmp-rtc"; +				reg = <0xd4010000 0x1000>; +				interrupts = <5 6>; +				interrupt-names = "rtc 1Hz", "rtc alarm"; +				status = "disabled"; +			}; +		}; +	}; +}; diff --git a/arch/arm/boot/dts/tegra-cardhu.dts b/arch/arm/boot/dts/tegra-cardhu.dts index 70c41fc897d..73263501f58 100644 --- a/arch/arm/boot/dts/tegra-cardhu.dts +++ b/arch/arm/boot/dts/tegra-cardhu.dts @@ -33,4 +33,22 @@  	i2c@7000d000 {  		clock-frequency = <100000>;  	}; + +	sdhci@78000000 { +		cd-gpios = <&gpio 69 0>; /* gpio PI5 */ +		wp-gpios = <&gpio 155 0>; /* gpio PT3 */ +		power-gpios = <&gpio 31 0>; /* gpio PD7 */ +	}; + +	sdhci@78000200 { +		status = "disable"; +	}; + +	sdhci@78000400 { +		status = "disable"; +	}; + +	sdhci@78000400 { +		support-8bit; +	};  }; diff --git a/arch/arm/boot/dts/tegra-paz00.dts b/arch/arm/boot/dts/tegra-paz00.dts index fc97254c364..6c02abb469d 100644 --- a/arch/arm/boot/dts/tegra-paz00.dts +++ b/arch/arm/boot/dts/tegra-paz00.dts @@ -65,7 +65,8 @@  			"Headset Mic", "MICBIAS1",  			"MIC1", "Headset Mic",  			"Headset Stereophone", "HPR", -			"Headset Stereophone", "HPL"; +			"Headset Stereophone", "HPL", +			"DMICDAT", "Digital Mic";  		nvidia,audio-codec = <&alc5632>;  		nvidia,i2s-controller = <&tegra_i2s1>; diff --git a/arch/arm/boot/dts/tegra20.dtsi b/arch/arm/boot/dts/tegra20.dtsi index ec1f0101c79..aff8a175aa4 100644 --- a/arch/arm/boot/dts/tegra20.dtsi +++ b/arch/arm/boot/dts/tegra20.dtsi @@ -17,6 +17,12 @@  		      < 0x50040100 0x0100 >;  	}; +	pmu { +		compatible = "arm,cortex-a9-pmu"; +		interrupts = <0 56 0x04 +			      0 57 0x04>; +	}; +  	apbdma: dma@6000a000 {  		compatible = "nvidia,tegra20-apbdma";  		reg = <0x6000a000 0x1200>; diff --git a/arch/arm/boot/dts/tegra30.dtsi b/arch/arm/boot/dts/tegra30.dtsi index ac4b75cb26c..62a7b39f1c9 100644 --- a/arch/arm/boot/dts/tegra30.dtsi +++ b/arch/arm/boot/dts/tegra30.dtsi @@ -17,6 +17,14 @@  		      < 0x50040100 0x0100 >;  	}; +	pmu { +		compatible = "arm,cortex-a9-pmu"; +		interrupts = <0 144 0x04 +			      0 145 0x04 +			      0 146 0x04 +			      0 147 0x04>; +	}; +  	apbdma: dma@6000a000 {  		compatible = "nvidia,tegra30-apbdma", "nvidia,tegra20-apbdma";  		reg = <0x6000a000 0x1400>; diff --git a/arch/arm/boot/dts/usb_a9g20.dts b/arch/arm/boot/dts/usb_a9g20.dts index f04b535477f..d74545a2a77 100644 --- a/arch/arm/boot/dts/usb_a9g20.dts +++ b/arch/arm/boot/dts/usb_a9g20.dts @@ -32,4 +32,27 @@  			};  		};  	}; + +	leds { +		compatible = "gpio-leds"; + +		user_led { +			label = "user_led"; +			gpios = <&pioB 21 1>; +			linux,default-trigger = "heartbeat"; +		}; +	}; + +	gpio_keys { +		compatible = "gpio-keys"; +		#address-cells = <1>; +		#size-cells = <0>; + +		user_pb { +			label = "user_pb"; +			gpios = <&pioB 10 1>; +			linux,code = <28>; +			gpio-key,wakeup; +		}; +	};  }; diff --git a/arch/arm/boot/dts/vexpress-v2m-rs1.dtsi b/arch/arm/boot/dts/vexpress-v2m-rs1.dtsi new file mode 100644 index 00000000000..16076e2d093 --- /dev/null +++ b/arch/arm/boot/dts/vexpress-v2m-rs1.dtsi @@ -0,0 +1,201 @@ +/* + * ARM Ltd. Versatile Express + * + * Motherboard Express uATX + * V2M-P1 + * + * HBI-0190D + * + * RS1 memory map ("ARM Cortex-A Series memory map" in the board's + * Technical Reference Manual) + * + * WARNING! The hardware described in this file is independent from the + * original variant (vexpress-v2m.dtsi), but there is a strong + * correspondence between the two configurations. + * + * TAKE CARE WHEN MAINTAINING THIS FILE TO PROPAGATE ANY RELEVANT + * CHANGES TO vexpress-v2m.dtsi! + */ + +/ { +	aliases { +		arm,v2m_timer = &v2m_timer01; +	}; + +	motherboard { +		compatible = "simple-bus"; +		arm,v2m-memory-map = "rs1"; +		#address-cells = <2>; /* SMB chipselect number and offset */ +		#size-cells = <1>; +		#interrupt-cells = <1>; + +		flash@0,00000000 { +			compatible = "arm,vexpress-flash", "cfi-flash"; +			reg = <0 0x00000000 0x04000000>, +			      <4 0x00000000 0x04000000>; +			bank-width = <4>; +		}; + +		psram@1,00000000 { +			compatible = "arm,vexpress-psram", "mtd-ram"; +			reg = <1 0x00000000 0x02000000>; +			bank-width = <4>; +		}; + +		vram@2,00000000 { +			compatible = "arm,vexpress-vram"; +			reg = <2 0x00000000 0x00800000>; +		}; + +		ethernet@2,02000000 { +			compatible = "smsc,lan9118", "smsc,lan9115"; +			reg = <2 0x02000000 0x10000>; +			interrupts = <15>; +			phy-mode = "mii"; +			reg-io-width = <4>; +			smsc,irq-active-high; +			smsc,irq-push-pull; +		}; + +		usb@2,03000000 { +			compatible = "nxp,usb-isp1761"; +			reg = <2 0x03000000 0x20000>; +			interrupts = <16>; +			port1-otg; +		}; + +		iofpga@3,00000000 { +			compatible = "arm,amba-bus", "simple-bus"; +			#address-cells = <1>; +			#size-cells = <1>; +			ranges = <0 3 0 0x200000>; + +			sysreg@010000 { +				compatible = "arm,vexpress-sysreg"; +				reg = <0x010000 0x1000>; +			}; + +			sysctl@020000 { +				compatible = "arm,sp810", "arm,primecell"; +				reg = <0x020000 0x1000>; +			}; + +			/* PCI-E I2C bus */ +			v2m_i2c_pcie: i2c@030000 { +				compatible = "arm,versatile-i2c"; +				reg = <0x030000 0x1000>; + +				#address-cells = <1>; +				#size-cells = <0>; + +				pcie-switch@60 { +					compatible = "idt,89hpes32h8"; +					reg = <0x60>; +				}; +			}; + +			aaci@040000 { +				compatible = "arm,pl041", "arm,primecell"; +				reg = <0x040000 0x1000>; +				interrupts = <11>; +			}; + +			mmci@050000 { +				compatible = "arm,pl180", "arm,primecell"; +				reg = <0x050000 0x1000>; +				interrupts = <9 10>; +			}; + +			kmi@060000 { +				compatible = "arm,pl050", "arm,primecell"; +				reg = <0x060000 0x1000>; +				interrupts = <12>; +			}; + +			kmi@070000 { +				compatible = "arm,pl050", "arm,primecell"; +				reg = <0x070000 0x1000>; +				interrupts = <13>; +			}; + +			v2m_serial0: uart@090000 { +				compatible = "arm,pl011", "arm,primecell"; +				reg = <0x090000 0x1000>; +				interrupts = <5>; +			}; + +			v2m_serial1: uart@0a0000 { +				compatible = "arm,pl011", "arm,primecell"; +				reg = <0x0a0000 0x1000>; +				interrupts = <6>; +			}; + +			v2m_serial2: uart@0b0000 { +				compatible = "arm,pl011", "arm,primecell"; +				reg = <0x0b0000 0x1000>; +				interrupts = <7>; +			}; + +			v2m_serial3: uart@0c0000 { +				compatible = "arm,pl011", "arm,primecell"; +				reg = <0x0c0000 0x1000>; +				interrupts = <8>; +			}; + +			wdt@0f0000 { +				compatible = "arm,sp805", "arm,primecell"; +				reg = <0x0f0000 0x1000>; +				interrupts = <0>; +			}; + +			v2m_timer01: timer@110000 { +				compatible = "arm,sp804", "arm,primecell"; +				reg = <0x110000 0x1000>; +				interrupts = <2>; +			}; + +			v2m_timer23: timer@120000 { +				compatible = "arm,sp804", "arm,primecell"; +				reg = <0x120000 0x1000>; +			}; + +			/* DVI I2C bus */ +			v2m_i2c_dvi: i2c@160000 { +				compatible = "arm,versatile-i2c"; +				reg = <0x160000 0x1000>; + +				#address-cells = <1>; +				#size-cells = <0>; + +				dvi-transmitter@39 { +					compatible = "sil,sii9022-tpi", "sil,sii9022"; +					reg = <0x39>; +				}; + +				dvi-transmitter@60 { +					compatible = "sil,sii9022-cpi", "sil,sii9022"; +					reg = <0x60>; +				}; +			}; + +			rtc@170000 { +				compatible = "arm,pl031", "arm,primecell"; +				reg = <0x170000 0x1000>; +				interrupts = <4>; +			}; + +			compact-flash@1a0000 { +				compatible = "arm,vexpress-cf", "ata-generic"; +				reg = <0x1a0000 0x100 +				       0x1a0100 0xf00>; +				reg-shift = <2>; +			}; + +			clcd@1f0000 { +				compatible = "arm,pl111", "arm,primecell"; +				reg = <0x1f0000 0x1000>; +				interrupts = <14>; +			}; +		}; +	}; +}; diff --git a/arch/arm/boot/dts/vexpress-v2m.dtsi b/arch/arm/boot/dts/vexpress-v2m.dtsi new file mode 100644 index 00000000000..a6c9c7c82d5 --- /dev/null +++ b/arch/arm/boot/dts/vexpress-v2m.dtsi @@ -0,0 +1,200 @@ +/* + * ARM Ltd. Versatile Express + * + * Motherboard Express uATX + * V2M-P1 + * + * HBI-0190D + * + * Original memory map ("Legacy memory map" in the board's + * Technical Reference Manual) + * + * WARNING! The hardware described in this file is independent from the + * RS1 variant (vexpress-v2m-rs1.dtsi), but there is a strong + * correspondence between the two configurations. + * + * TAKE CARE WHEN MAINTAINING THIS FILE TO PROPAGATE ANY RELEVANT + * CHANGES TO vexpress-v2m-rs1.dtsi! + */ + +/ { +	aliases { +		arm,v2m_timer = &v2m_timer01; +	}; + +	motherboard { +		compatible = "simple-bus"; +		#address-cells = <2>; /* SMB chipselect number and offset */ +		#size-cells = <1>; +		#interrupt-cells = <1>; + +		flash@0,00000000 { +			compatible = "arm,vexpress-flash", "cfi-flash"; +			reg = <0 0x00000000 0x04000000>, +			      <1 0x00000000 0x04000000>; +			bank-width = <4>; +		}; + +		psram@2,00000000 { +			compatible = "arm,vexpress-psram", "mtd-ram"; +			reg = <2 0x00000000 0x02000000>; +			bank-width = <4>; +		}; + +		vram@3,00000000 { +			compatible = "arm,vexpress-vram"; +			reg = <3 0x00000000 0x00800000>; +		}; + +		ethernet@3,02000000 { +			compatible = "smsc,lan9118", "smsc,lan9115"; +			reg = <3 0x02000000 0x10000>; +			interrupts = <15>; +			phy-mode = "mii"; +			reg-io-width = <4>; +			smsc,irq-active-high; +			smsc,irq-push-pull; +		}; + +		usb@3,03000000 { +			compatible = "nxp,usb-isp1761"; +			reg = <3 0x03000000 0x20000>; +			interrupts = <16>; +			port1-otg; +		}; + +		iofpga@7,00000000 { +			compatible = "arm,amba-bus", "simple-bus"; +			#address-cells = <1>; +			#size-cells = <1>; +			ranges = <0 7 0 0x20000>; + +			sysreg@00000 { +				compatible = "arm,vexpress-sysreg"; +				reg = <0x00000 0x1000>; +			}; + +			sysctl@01000 { +				compatible = "arm,sp810", "arm,primecell"; +				reg = <0x01000 0x1000>; +			}; + +			/* PCI-E I2C bus */ +			v2m_i2c_pcie: i2c@02000 { +				compatible = "arm,versatile-i2c"; +				reg = <0x02000 0x1000>; + +				#address-cells = <1>; +				#size-cells = <0>; + +				pcie-switch@60 { +					compatible = "idt,89hpes32h8"; +					reg = <0x60>; +				}; +			}; + +			aaci@04000 { +				compatible = "arm,pl041", "arm,primecell"; +				reg = <0x04000 0x1000>; +				interrupts = <11>; +			}; + +			mmci@05000 { +				compatible = "arm,pl180", "arm,primecell"; +				reg = <0x05000 0x1000>; +				interrupts = <9 10>; +			}; + +			kmi@06000 { +				compatible = "arm,pl050", "arm,primecell"; +				reg = <0x06000 0x1000>; +				interrupts = <12>; +			}; + +			kmi@07000 { +				compatible = "arm,pl050", "arm,primecell"; +				reg = <0x07000 0x1000>; +				interrupts = <13>; +			}; + +			v2m_serial0: uart@09000 { +				compatible = "arm,pl011", "arm,primecell"; +				reg = <0x09000 0x1000>; +				interrupts = <5>; +			}; + +			v2m_serial1: uart@0a000 { +				compatible = "arm,pl011", "arm,primecell"; +				reg = <0x0a000 0x1000>; +				interrupts = <6>; +			}; + +			v2m_serial2: uart@0b000 { +				compatible = "arm,pl011", "arm,primecell"; +				reg = <0x0b000 0x1000>; +				interrupts = <7>; +			}; + +			v2m_serial3: uart@0c000 { +				compatible = "arm,pl011", "arm,primecell"; +				reg = <0x0c000 0x1000>; +				interrupts = <8>; +			}; + +			wdt@0f000 { +				compatible = "arm,sp805", "arm,primecell"; +				reg = <0x0f000 0x1000>; +				interrupts = <0>; +			}; + +			v2m_timer01: timer@11000 { +				compatible = "arm,sp804", "arm,primecell"; +				reg = <0x11000 0x1000>; +				interrupts = <2>; +			}; + +			v2m_timer23: timer@12000 { +				compatible = "arm,sp804", "arm,primecell"; +				reg = <0x12000 0x1000>; +			}; + +			/* DVI I2C bus */ +			v2m_i2c_dvi: i2c@16000 { +				compatible = "arm,versatile-i2c"; +				reg = <0x16000 0x1000>; + +				#address-cells = <1>; +				#size-cells = <0>; + +				dvi-transmitter@39 { +					compatible = "sil,sii9022-tpi", "sil,sii9022"; +					reg = <0x39>; +				}; + +				dvi-transmitter@60 { +					compatible = "sil,sii9022-cpi", "sil,sii9022"; +					reg = <0x60>; +				}; +			}; + +			rtc@17000 { +				compatible = "arm,pl031", "arm,primecell"; +				reg = <0x17000 0x1000>; +				interrupts = <4>; +			}; + +			compact-flash@1a000 { +				compatible = "arm,vexpress-cf", "ata-generic"; +				reg = <0x1a000 0x100 +				       0x1a100 0xf00>; +				reg-shift = <2>; +			}; + +			clcd@1f000 { +				compatible = "arm,pl111", "arm,primecell"; +				reg = <0x1f000 0x1000>; +				interrupts = <14>; +			}; +		}; +	}; +}; diff --git a/arch/arm/boot/dts/vexpress-v2p-ca15-tc1.dts b/arch/arm/boot/dts/vexpress-v2p-ca15-tc1.dts new file mode 100644 index 00000000000..941b161ab78 --- /dev/null +++ b/arch/arm/boot/dts/vexpress-v2p-ca15-tc1.dts @@ -0,0 +1,157 @@ +/* + * ARM Ltd. Versatile Express + * + * CoreTile Express A15x2 (version with Test Chip 1) + * Cortex-A15 MPCore (V2P-CA15) + * + * HBI-0237A + */ + +/dts-v1/; + +/ { +	model = "V2P-CA15"; +	arm,hbi = <0x237>; +	compatible = "arm,vexpress,v2p-ca15,tc1", "arm,vexpress,v2p-ca15", "arm,vexpress"; +	interrupt-parent = <&gic>; +	#address-cells = <1>; +	#size-cells = <1>; + +	chosen { }; + +	aliases { +		serial0 = &v2m_serial0; +		serial1 = &v2m_serial1; +		serial2 = &v2m_serial2; +		serial3 = &v2m_serial3; +		i2c0 = &v2m_i2c_dvi; +		i2c1 = &v2m_i2c_pcie; +	}; + +	cpus { +		#address-cells = <1>; +		#size-cells = <0>; + +		cpu@0 { +			device_type = "cpu"; +			compatible = "arm,cortex-a15"; +			reg = <0>; +		}; + +		cpu@1 { +			device_type = "cpu"; +			compatible = "arm,cortex-a15"; +			reg = <1>; +		}; +	}; + +	memory@80000000 { +		device_type = "memory"; +		reg = <0x80000000 0x40000000>; +	}; + +	hdlcd@2b000000 { +		compatible = "arm,hdlcd"; +		reg = <0x2b000000 0x1000>; +		interrupts = <0 85 4>; +	}; + +	memory-controller@2b0a0000 { +		compatible = "arm,pl341", "arm,primecell"; +		reg = <0x2b0a0000 0x1000>; +	}; + +	wdt@2b060000 { +		compatible = "arm,sp805", "arm,primecell"; +		reg = <0x2b060000 0x1000>; +		interrupts = <98>; +	}; + +	gic: interrupt-controller@2c001000 { +		compatible = "arm,cortex-a15-gic", "arm,cortex-a9-gic"; +		#interrupt-cells = <3>; +		#address-cells = <0>; +		interrupt-controller; +		reg = <0x2c001000 0x1000>, +		      <0x2c002000 0x100>; +	}; + +	memory-controller@7ffd0000 { +		compatible = "arm,pl354", "arm,primecell"; +		reg = <0x7ffd0000 0x1000>; +		interrupts = <0 86 4>, +			     <0 87 4>; +	}; + +	dma@7ffb0000 { +		compatible = "arm,pl330", "arm,primecell"; +		reg = <0x7ffb0000 0x1000>; +		interrupts = <0 92 4>, +			     <0 88 4>, +			     <0 89 4>, +			     <0 90 4>, +			     <0 91 4>; +	}; + +	pmu { +		compatible = "arm,cortex-a15-pmu", "arm,cortex-a9-pmu"; +		interrupts = <0 68 4>, +			     <0 69 4>; +	}; + +	motherboard { +		ranges = <0 0 0x08000000 0x04000000>, +			 <1 0 0x14000000 0x04000000>, +			 <2 0 0x18000000 0x04000000>, +			 <3 0 0x1c000000 0x04000000>, +			 <4 0 0x0c000000 0x04000000>, +			 <5 0 0x10000000 0x04000000>; + +		interrupt-map-mask = <0 0 63>; +		interrupt-map = <0 0  0 &gic 0  0 4>, +				<0 0  1 &gic 0  1 4>, +				<0 0  2 &gic 0  2 4>, +				<0 0  3 &gic 0  3 4>, +				<0 0  4 &gic 0  4 4>, +				<0 0  5 &gic 0  5 4>, +				<0 0  6 &gic 0  6 4>, +				<0 0  7 &gic 0  7 4>, +				<0 0  8 &gic 0  8 4>, +				<0 0  9 &gic 0  9 4>, +				<0 0 10 &gic 0 10 4>, +				<0 0 11 &gic 0 11 4>, +				<0 0 12 &gic 0 12 4>, +				<0 0 13 &gic 0 13 4>, +				<0 0 14 &gic 0 14 4>, +				<0 0 15 &gic 0 15 4>, +				<0 0 16 &gic 0 16 4>, +				<0 0 17 &gic 0 17 4>, +				<0 0 18 &gic 0 18 4>, +				<0 0 19 &gic 0 19 4>, +				<0 0 20 &gic 0 20 4>, +				<0 0 21 &gic 0 21 4>, +				<0 0 22 &gic 0 22 4>, +				<0 0 23 &gic 0 23 4>, +				<0 0 24 &gic 0 24 4>, +				<0 0 25 &gic 0 25 4>, +				<0 0 26 &gic 0 26 4>, +				<0 0 27 &gic 0 27 4>, +				<0 0 28 &gic 0 28 4>, +				<0 0 29 &gic 0 29 4>, +				<0 0 30 &gic 0 30 4>, +				<0 0 31 &gic 0 31 4>, +				<0 0 32 &gic 0 32 4>, +				<0 0 33 &gic 0 33 4>, +				<0 0 34 &gic 0 34 4>, +				<0 0 35 &gic 0 35 4>, +				<0 0 36 &gic 0 36 4>, +				<0 0 37 &gic 0 37 4>, +				<0 0 38 &gic 0 38 4>, +				<0 0 39 &gic 0 39 4>, +				<0 0 40 &gic 0 40 4>, +				<0 0 41 &gic 0 41 4>, +				<0 0 42 &gic 0 42 4>; +	}; +}; + +/include/ "vexpress-v2m-rs1.dtsi" diff --git a/arch/arm/boot/dts/vexpress-v2p-ca5s.dts b/arch/arm/boot/dts/vexpress-v2p-ca5s.dts new file mode 100644 index 00000000000..6905e66d474 --- /dev/null +++ b/arch/arm/boot/dts/vexpress-v2p-ca5s.dts @@ -0,0 +1,162 @@ +/* + * ARM Ltd. Versatile Express + * + * CoreTile Express A5x2 + * Cortex-A5 MPCore (V2P-CA5s) + * + * HBI-0225B + */ + +/dts-v1/; + +/ { +	model = "V2P-CA5s"; +	arm,hbi = <0x225>; +	compatible = "arm,vexpress,v2p-ca5s", "arm,vexpress"; +	interrupt-parent = <&gic>; +	#address-cells = <1>; +	#size-cells = <1>; + +	chosen { }; + +	aliases { +		serial0 = &v2m_serial0; +		serial1 = &v2m_serial1; +		serial2 = &v2m_serial2; +		serial3 = &v2m_serial3; +		i2c0 = &v2m_i2c_dvi; +		i2c1 = &v2m_i2c_pcie; +	}; + +	cpus { +		#address-cells = <1>; +		#size-cells = <0>; + +		cpu@0 { +			device_type = "cpu"; +			compatible = "arm,cortex-a5"; +			reg = <0>; +			next-level-cache = <&L2>; +		}; + +		cpu@1 { +			device_type = "cpu"; +			compatible = "arm,cortex-a5"; +			reg = <1>; +			next-level-cache = <&L2>; +		}; +	}; + +	memory@80000000 { +		device_type = "memory"; +		reg = <0x80000000 0x40000000>; +	}; + +	hdlcd@2a110000 { +		compatible = "arm,hdlcd"; +		reg = <0x2a110000 0x1000>; +		interrupts = <0 85 4>; +	}; + +	memory-controller@2a150000 { +		compatible = "arm,pl341", "arm,primecell"; +		reg = <0x2a150000 0x1000>; +	}; + +	memory-controller@2a190000 { +		compatible = "arm,pl354", "arm,primecell"; +		reg = <0x2a190000 0x1000>; +		interrupts = <0 86 4>, +			     <0 87 4>; +	}; + +	scu@2c000000 { +		compatible = "arm,cortex-a5-scu"; +		reg = <0x2c000000 0x58>; +	}; + +	timer@2c000600 { +		compatible = "arm,cortex-a5-twd-timer"; +		reg = <0x2c000600 0x38>; +		interrupts = <1 2 0x304>, +			     <1 3 0x304>; +	}; + +	gic: interrupt-controller@2c001000 { +		compatible = "arm,corex-a5-gic", "arm,cortex-a9-gic"; +		#interrupt-cells = <3>; +		#address-cells = <0>; +		interrupt-controller; +		reg = <0x2c001000 0x1000>, +		      <0x2c000100 0x100>; +	}; + +	L2: cache-controller@2c0f0000 { +		compatible = "arm,pl310-cache"; +		reg = <0x2c0f0000 0x1000>; +		interrupts = <0 84 4>; +		cache-level = <2>; +	}; + +	pmu { +		compatible = "arm,cortex-a5-pmu", "arm,cortex-a9-pmu"; +		interrupts = <0 68 4>, +			     <0 69 4>; +	}; + +	motherboard { +		ranges = <0 0 0x08000000 0x04000000>, +			 <1 0 0x14000000 0x04000000>, +			 <2 0 0x18000000 0x04000000>, +			 <3 0 0x1c000000 0x04000000>, +			 <4 0 0x0c000000 0x04000000>, +			 <5 0 0x10000000 0x04000000>; + +		interrupt-map-mask = <0 0 63>; +		interrupt-map = <0 0  0 &gic 0  0 4>, +				<0 0  1 &gic 0  1 4>, +				<0 0  2 &gic 0  2 4>, +				<0 0  3 &gic 0  3 4>, +				<0 0  4 &gic 0  4 4>, +				<0 0  5 &gic 0  5 4>, +				<0 0  6 &gic 0  6 4>, +				<0 0  7 &gic 0  7 4>, +				<0 0  8 &gic 0  8 4>, +				<0 0  9 &gic 0  9 4>, +				<0 0 10 &gic 0 10 4>, +				<0 0 11 &gic 0 11 4>, +				<0 0 12 &gic 0 12 4>, +				<0 0 13 &gic 0 13 4>, +				<0 0 14 &gic 0 14 4>, +				<0 0 15 &gic 0 15 4>, +				<0 0 16 &gic 0 16 4>, +				<0 0 17 &gic 0 17 4>, +				<0 0 18 &gic 0 18 4>, +				<0 0 19 &gic 0 19 4>, +				<0 0 20 &gic 0 20 4>, +				<0 0 21 &gic 0 21 4>, +				<0 0 22 &gic 0 22 4>, +				<0 0 23 &gic 0 23 4>, +				<0 0 24 &gic 0 24 4>, +				<0 0 25 &gic 0 25 4>, +				<0 0 26 &gic 0 26 4>, +				<0 0 27 &gic 0 27 4>, +				<0 0 28 &gic 0 28 4>, +				<0 0 29 &gic 0 29 4>, +				<0 0 30 &gic 0 30 4>, +				<0 0 31 &gic 0 31 4>, +				<0 0 32 &gic 0 32 4>, +				<0 0 33 &gic 0 33 4>, +				<0 0 34 &gic 0 34 4>, +				<0 0 35 &gic 0 35 4>, +				<0 0 36 &gic 0 36 4>, +				<0 0 37 &gic 0 37 4>, +				<0 0 38 &gic 0 38 4>, +				<0 0 39 &gic 0 39 4>, +				<0 0 40 &gic 0 40 4>, +				<0 0 41 &gic 0 41 4>, +				<0 0 42 &gic 0 42 4>; +	}; +}; + +/include/ "vexpress-v2m-rs1.dtsi" diff --git a/arch/arm/boot/dts/vexpress-v2p-ca9.dts b/arch/arm/boot/dts/vexpress-v2p-ca9.dts new file mode 100644 index 00000000000..da778693be5 --- /dev/null +++ b/arch/arm/boot/dts/vexpress-v2p-ca9.dts @@ -0,0 +1,192 @@ +/* + * ARM Ltd. Versatile Express + * + * CoreTile Express A9x4 + * Cortex-A9 MPCore (V2P-CA9) + * + * HBI-0191B + */ + +/dts-v1/; + +/ { +	model = "V2P-CA9"; +	arm,hbi = <0x191>; +	compatible = "arm,vexpress,v2p-ca9", "arm,vexpress"; +	interrupt-parent = <&gic>; +	#address-cells = <1>; +	#size-cells = <1>; + +	chosen { }; + +	aliases { +		serial0 = &v2m_serial0; +		serial1 = &v2m_serial1; +		serial2 = &v2m_serial2; +		serial3 = &v2m_serial3; +		i2c0 = &v2m_i2c_dvi; +		i2c1 = &v2m_i2c_pcie; +	}; + +	cpus { +		#address-cells = <1>; +		#size-cells = <0>; + +		cpu@0 { +			device_type = "cpu"; +			compatible = "arm,cortex-a9"; +			reg = <0>; +			next-level-cache = <&L2>; +		}; + +		cpu@1 { +			device_type = "cpu"; +			compatible = "arm,cortex-a9"; +			reg = <1>; +			next-level-cache = <&L2>; +		}; + +		cpu@2 { +			device_type = "cpu"; +			compatible = "arm,cortex-a9"; +			reg = <2>; +			next-level-cache = <&L2>; +		}; + +		cpu@3 { +			device_type = "cpu"; +			compatible = "arm,cortex-a9"; +			reg = <3>; +			next-level-cache = <&L2>; +		}; +	}; + +	memory@60000000 { +		device_type = "memory"; +		reg = <0x60000000 0x40000000>; +	}; + +	clcd@10020000 { +		compatible = "arm,pl111", "arm,primecell"; +		reg = <0x10020000 0x1000>; +		interrupts = <0 44 4>; +	}; + +	memory-controller@100e0000 { +		compatible = "arm,pl341", "arm,primecell"; +		reg = <0x100e0000 0x1000>; +	}; + +	memory-controller@100e1000 { +		compatible = "arm,pl354", "arm,primecell"; +		reg = <0x100e1000 0x1000>; +		interrupts = <0 45 4>, +			     <0 46 4>; +	}; + +	timer@100e4000 { +		compatible = "arm,sp804", "arm,primecell"; +		reg = <0x100e4000 0x1000>; +		interrupts = <0 48 4>, +			     <0 49 4>; +	}; + +	watchdog@100e5000 { +		compatible = "arm,sp805", "arm,primecell"; +		reg = <0x100e5000 0x1000>; +		interrupts = <0 51 4>; +	}; + +	scu@1e000000 { +		compatible = "arm,cortex-a9-scu"; +		reg = <0x1e000000 0x58>; +	}; + +	timer@1e000600 { +		compatible = "arm,cortex-a9-twd-timer"; +		reg = <0x1e000600 0x20>; +		interrupts = <1 2 0xf04>, +			     <1 3 0xf04>; +	}; + +	gic: interrupt-controller@1e001000 { +		compatible = "arm,cortex-a9-gic"; +		#interrupt-cells = <3>; +		#address-cells = <0>; +		interrupt-controller; +		reg = <0x1e001000 0x1000>, +		      <0x1e000100 0x100>; +	}; + +	L2: cache-controller@1e00a000 { +		compatible = "arm,pl310-cache"; +		reg = <0x1e00a000 0x1000>; +		interrupts = <0 43 4>; +		cache-level = <2>; +		arm,data-latency = <1 1 1>; +		arm,tag-latency = <1 1 1>; +	}; + +	pmu { +		compatible = "arm,cortex-a9-pmu"; +		interrupts = <0 60 4>, +			     <0 61 4>, +			     <0 62 4>, +			     <0 63 4>; +	}; + +	motherboard { +		ranges = <0 0 0x40000000 0x04000000>, +			 <1 0 0x44000000 0x04000000>, +			 <2 0 0x48000000 0x04000000>, +			 <3 0 0x4c000000 0x04000000>, +			 <7 0 0x10000000 0x00020000>; + +		interrupt-map-mask = <0 0 63>; +		interrupt-map = <0 0  0 &gic 0  0 4>, +				<0 0  1 &gic 0  1 4>, +				<0 0  2 &gic 0  2 4>, +				<0 0  3 &gic 0  3 4>, +				<0 0  4 &gic 0  4 4>, +				<0 0  5 &gic 0  5 4>, +				<0 0  6 &gic 0  6 4>, +				<0 0  7 &gic 0  7 4>, +				<0 0  8 &gic 0  8 4>, +				<0 0  9 &gic 0  9 4>, +				<0 0 10 &gic 0 10 4>, +				<0 0 11 &gic 0 11 4>, +				<0 0 12 &gic 0 12 4>, +				<0 0 13 &gic 0 13 4>, +				<0 0 14 &gic 0 14 4>, +				<0 0 15 &gic 0 15 4>, +				<0 0 16 &gic 0 16 4>, +				<0 0 17 &gic 0 17 4>, +				<0 0 18 &gic 0 18 4>, +				<0 0 19 &gic 0 19 4>, +				<0 0 20 &gic 0 20 4>, +				<0 0 21 &gic 0 21 4>, +				<0 0 22 &gic 0 22 4>, +				<0 0 23 &gic 0 23 4>, +				<0 0 24 &gic 0 24 4>, +				<0 0 25 &gic 0 25 4>, +				<0 0 26 &gic 0 26 4>, +				<0 0 27 &gic 0 27 4>, +				<0 0 28 &gic 0 28 4>, +				<0 0 29 &gic 0 29 4>, +				<0 0 30 &gic 0 30 4>, +				<0 0 31 &gic 0 31 4>, +				<0 0 32 &gic 0 32 4>, +				<0 0 33 &gic 0 33 4>, +				<0 0 34 &gic 0 34 4>, +				<0 0 35 &gic 0 35 4>, +				<0 0 36 &gic 0 36 4>, +				<0 0 37 &gic 0 37 4>, +				<0 0 38 &gic 0 38 4>, +				<0 0 39 &gic 0 39 4>, +				<0 0 40 &gic 0 40 4>, +				<0 0 41 &gic 0 41 4>, +				<0 0 42 &gic 0 42 4>; +	}; +}; + +/include/ "vexpress-v2m.dtsi" diff --git a/arch/arm/mach-at91/Makefile b/arch/arm/mach-at91/Makefile index 1b6518518d9..8512e53bed9 100644 --- a/arch/arm/mach-at91/Makefile +++ b/arch/arm/mach-at91/Makefile @@ -20,7 +20,7 @@ obj-$(CONFIG_ARCH_AT91SAM9263)	+= at91sam9263.o at91sam926x_time.o at91sam9263_d  obj-$(CONFIG_ARCH_AT91SAM9RL)	+= at91sam9rl.o at91sam926x_time.o at91sam9rl_devices.o sam9_smc.o  obj-$(CONFIG_ARCH_AT91SAM9G20)	+= at91sam9260.o at91sam926x_time.o at91sam9260_devices.o sam9_smc.o  obj-$(CONFIG_ARCH_AT91SAM9G45)	+= at91sam9g45.o at91sam926x_time.o at91sam9g45_devices.o sam9_smc.o -obj-$(CONFIG_ARCH_AT91SAM9X5)	+= at91sam9x5.o at91sam926x_time.o +obj-$(CONFIG_ARCH_AT91SAM9X5)	+= at91sam9x5.o at91sam926x_time.o sam9_smc.o  obj-$(CONFIG_ARCH_AT91X40)	+= at91x40.o at91x40_time.o  # AT91RM9200 board-specific support diff --git a/arch/arm/mach-at91/Makefile.boot b/arch/arm/mach-at91/Makefile.boot index 2fd051eb244..0da66ca4a4f 100644 --- a/arch/arm/mach-at91/Makefile.boot +++ b/arch/arm/mach-at91/Makefile.boot @@ -13,4 +13,10 @@ params_phys-y	:= 0x20000100  initrd_phys-y	:= 0x20410000  endif -dtb-$(CONFIG_MACH_AT91SAM_DT) += at91sam9m10g45ek.dtb usb_a9g20.dtb +# Keep dtb files sorted alphabetically for each SoC +# sam9g20 +dtb-$(CONFIG_MACH_AT91SAM_DT) += usb_a9g20.dtb +# sam9g45 +dtb-$(CONFIG_MACH_AT91SAM_DT) += at91sam9m10g45ek.dtb +# sam9x5 +dtb-$(CONFIG_MACH_AT91SAM_DT) += at91sam9g25ek.dtb diff --git a/arch/arm/mach-at91/at91rm9200.c b/arch/arm/mach-at91/at91rm9200.c index dd6e2de1342..0df1045311e 100644 --- a/arch/arm/mach-at91/at91rm9200.c +++ b/arch/arm/mach-at91/at91rm9200.c @@ -295,7 +295,7 @@ static void at91rm9200_idle(void)  	 * Disable the processor clock.  The processor will be automatically  	 * re-enabled by an interrupt or by a reset.  	 */ -	at91_sys_write(AT91_PMC_SCDR, AT91_PMC_PCK); +	at91_pmc_write(AT91_PMC_SCDR, AT91_PMC_PCK);  }  static void at91rm9200_restart(char mode, const char *cmd) @@ -303,8 +303,8 @@ static void at91rm9200_restart(char mode, const char *cmd)  	/*  	 * Perform a hardware reset with the use of the Watchdog timer.  	 */ -	at91_sys_write(AT91_ST_WDMR, AT91_ST_RSTEN | AT91_ST_EXTEN | 1); -	at91_sys_write(AT91_ST_CR, AT91_ST_WDRST); +	at91_st_write(AT91_ST_WDMR, AT91_ST_RSTEN | AT91_ST_EXTEN | 1); +	at91_st_write(AT91_ST_CR, AT91_ST_WDRST);  }  /* -------------------------------------------------------------------- @@ -319,6 +319,8 @@ static void __init at91rm9200_map_io(void)  static void __init at91rm9200_ioremap_registers(void)  { +	at91rm9200_ioremap_st(AT91RM9200_BASE_ST); +	at91_ioremap_ramc(0, AT91RM9200_BASE_MC, 256);  }  static void __init at91rm9200_initialize(void) diff --git a/arch/arm/mach-at91/at91rm9200_devices.c b/arch/arm/mach-at91/at91rm9200_devices.c index 97676bdae99..99ce5c955e3 100644 --- a/arch/arm/mach-at91/at91rm9200_devices.c +++ b/arch/arm/mach-at91/at91rm9200_devices.c @@ -21,6 +21,7 @@  #include <mach/board.h>  #include <mach/at91rm9200.h>  #include <mach/at91rm9200_mc.h> +#include <mach/at91_ramc.h>  #include "generic.h" @@ -241,15 +242,15 @@ void __init at91_add_device_cf(struct at91_cf_data *data)  	data->chipselect = 4;		/* can only use EBI ChipSelect 4 */  	/* CF takes over CS4, CS5, CS6 */ -	csa = at91_sys_read(AT91_EBI_CSA); -	at91_sys_write(AT91_EBI_CSA, csa | AT91_EBI_CS4A_SMC_COMPACTFLASH); +	csa = at91_ramc_read(0, AT91_EBI_CSA); +	at91_ramc_write(0, AT91_EBI_CSA, csa | AT91_EBI_CS4A_SMC_COMPACTFLASH);  	/*  	 * Static memory controller timing adjustments.  	 * REVISIT:  these timings are in terms of MCK cycles, so  	 * when MCK changes (cpufreq etc) so must these values...  	 */ -	at91_sys_write(AT91_SMC_CSR(4), +	at91_ramc_write(0, AT91_SMC_CSR(4),  				  AT91_SMC_ACSS_STD  				| AT91_SMC_DBW_16  				| AT91_SMC_BAT @@ -407,11 +408,11 @@ void __init at91_add_device_nand(struct atmel_nand_data *data)  		return;  	/* enable the address range of CS3 */ -	csa = at91_sys_read(AT91_EBI_CSA); -	at91_sys_write(AT91_EBI_CSA, csa | AT91_EBI_CS3A_SMC_SMARTMEDIA); +	csa = at91_ramc_read(0, AT91_EBI_CSA); +	at91_ramc_write(0, AT91_EBI_CSA, csa | AT91_EBI_CS3A_SMC_SMARTMEDIA);  	/* set the bus interface characteristics */ -	at91_sys_write(AT91_SMC_CSR(3), AT91_SMC_ACSS_STD | AT91_SMC_DBW_8 | AT91_SMC_WSEN +	at91_ramc_write(0, AT91_SMC_CSR(3), AT91_SMC_ACSS_STD | AT91_SMC_DBW_8 | AT91_SMC_WSEN  		| AT91_SMC_NWS_(5)  		| AT91_SMC_TDF_(1)  		| AT91_SMC_RWSETUP_(0)	/* tDS Data Set up Time 30 - ns */ @@ -1114,7 +1115,6 @@ static inline void configure_usart3_pins(unsigned pins)  }  static struct platform_device *__initdata at91_uarts[ATMEL_MAX_UART];	/* the UARTs to use */ -struct platform_device *atmel_default_console_device;	/* the serial console device */  void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins)  { diff --git a/arch/arm/mach-at91/at91rm9200_time.c b/arch/arm/mach-at91/at91rm9200_time.c index a028cdf8f97..dd7f782b0b9 100644 --- a/arch/arm/mach-at91/at91rm9200_time.c +++ b/arch/arm/mach-at91/at91rm9200_time.c @@ -43,9 +43,9 @@ static inline unsigned long read_CRTR(void)  {  	unsigned long x1, x2; -	x1 = at91_sys_read(AT91_ST_CRTR); +	x1 = at91_st_read(AT91_ST_CRTR);  	do { -		x2 = at91_sys_read(AT91_ST_CRTR); +		x2 = at91_st_read(AT91_ST_CRTR);  		if (x1 == x2)  			break;  		x1 = x2; @@ -58,7 +58,7 @@ static inline unsigned long read_CRTR(void)   */  static irqreturn_t at91rm9200_timer_interrupt(int irq, void *dev_id)  { -	u32	sr = at91_sys_read(AT91_ST_SR) & irqmask; +	u32	sr = at91_st_read(AT91_ST_SR) & irqmask;  	/*  	 * irqs should be disabled here, but as the irq is shared they are only @@ -110,22 +110,22 @@ static void  clkevt32k_mode(enum clock_event_mode mode, struct clock_event_device *dev)  {  	/* Disable and flush pending timer interrupts */ -	at91_sys_write(AT91_ST_IDR, AT91_ST_PITS | AT91_ST_ALMS); -	(void) at91_sys_read(AT91_ST_SR); +	at91_st_write(AT91_ST_IDR, AT91_ST_PITS | AT91_ST_ALMS); +	at91_st_read(AT91_ST_SR);  	last_crtr = read_CRTR();  	switch (mode) {  	case CLOCK_EVT_MODE_PERIODIC:  		/* PIT for periodic irqs; fixed rate of 1/HZ */  		irqmask = AT91_ST_PITS; -		at91_sys_write(AT91_ST_PIMR, RM9200_TIMER_LATCH); +		at91_st_write(AT91_ST_PIMR, RM9200_TIMER_LATCH);  		break;  	case CLOCK_EVT_MODE_ONESHOT:  		/* ALM for oneshot irqs, set by next_event()  		 * before 32 seconds have passed  		 */  		irqmask = AT91_ST_ALMS; -		at91_sys_write(AT91_ST_RTAR, last_crtr); +		at91_st_write(AT91_ST_RTAR, last_crtr);  		break;  	case CLOCK_EVT_MODE_SHUTDOWN:  	case CLOCK_EVT_MODE_UNUSED: @@ -133,7 +133,7 @@ clkevt32k_mode(enum clock_event_mode mode, struct clock_event_device *dev)  		irqmask = 0;  		break;  	} -	at91_sys_write(AT91_ST_IER, irqmask); +	at91_st_write(AT91_ST_IER, irqmask);  }  static int @@ -156,12 +156,12 @@ clkevt32k_next_event(unsigned long delta, struct clock_event_device *dev)  	alm = read_CRTR();  	/* Cancel any pending alarm; flush any pending IRQ */ -	at91_sys_write(AT91_ST_RTAR, alm); -	(void) at91_sys_read(AT91_ST_SR); +	at91_st_write(AT91_ST_RTAR, alm); +	at91_st_read(AT91_ST_SR);  	/* Schedule alarm by writing RTAR. */  	alm += delta; -	at91_sys_write(AT91_ST_RTAR, alm); +	at91_st_write(AT91_ST_RTAR, alm);  	return status;  } @@ -175,15 +175,24 @@ static struct clock_event_device clkevt = {  	.set_mode	= clkevt32k_mode,  }; +void __iomem *at91_st_base; + +void __init at91rm9200_ioremap_st(u32 addr) +{ +	at91_st_base = ioremap(addr, 256); +	if (!at91_st_base) +		panic("Impossible to ioremap ST\n"); +} +  /*   * ST (system timer) module supports both clockevents and clocksource.   */  void __init at91rm9200_timer_init(void)  {  	/* Disable all timer interrupts, and clear any pending ones */ -	at91_sys_write(AT91_ST_IDR, +	at91_st_write(AT91_ST_IDR,  		AT91_ST_PITS | AT91_ST_WDOVF | AT91_ST_RTTINC | AT91_ST_ALMS); -	(void) at91_sys_read(AT91_ST_SR); +	at91_st_read(AT91_ST_SR);  	/* Make IRQs happen for the system timer */  	setup_irq(AT91_ID_SYS, &at91rm9200_timer_irq); @@ -192,7 +201,7 @@ void __init at91rm9200_timer_init(void)  	 * directly for the clocksource and all clockevents, after adjusting  	 * its prescaler from the 1 Hz default.  	 */ -	at91_sys_write(AT91_ST_RTMR, 1); +	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); diff --git a/arch/arm/mach-at91/at91sam9260.c b/arch/arm/mach-at91/at91sam9260.c index 9ac8c6fe336..14b5a9c9a51 100644 --- a/arch/arm/mach-at91/at91sam9260.c +++ b/arch/arm/mach-at91/at91sam9260.c @@ -209,6 +209,13 @@ static struct clk_lookup periph_clocks_lookups[] = {  	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), +	/* more tc lookup table for DT entries */ +	CLKDEV_CON_DEV_ID("t0_clk", "fffa0000.timer", &tc0_clk), +	CLKDEV_CON_DEV_ID("t1_clk", "fffa0000.timer", &tc1_clk), +	CLKDEV_CON_DEV_ID("t2_clk", "fffa0000.timer", &tc2_clk), +	CLKDEV_CON_DEV_ID("t0_clk", "fffdc000.timer", &tc3_clk), +	CLKDEV_CON_DEV_ID("t1_clk", "fffdc000.timer", &tc4_clk), +	CLKDEV_CON_DEV_ID("t2_clk", "fffdc000.timer", &tc5_clk),  	/* fake hclk clock */  	CLKDEV_CON_DEV_ID("hclk", "at91_ohci", &ohci_clk),  	CLKDEV_CON_ID("pioA", &pioA_clk), @@ -310,34 +317,27 @@ static void __init at91sam9xe_map_io(void)  static void __init at91sam9260_map_io(void)  { -	if (cpu_is_at91sam9xe()) { +	if (cpu_is_at91sam9xe())  		at91sam9xe_map_io(); -	} else if (cpu_is_at91sam9g20()) { -		at91_init_sram(0, AT91SAM9G20_SRAM0_BASE, AT91SAM9G20_SRAM0_SIZE); -		at91_init_sram(1, AT91SAM9G20_SRAM1_BASE, AT91SAM9G20_SRAM1_SIZE); -	} else { -		at91_init_sram(0, AT91SAM9260_SRAM0_BASE, AT91SAM9260_SRAM0_SIZE); -		at91_init_sram(1, AT91SAM9260_SRAM1_BASE, AT91SAM9260_SRAM1_SIZE); -	} +	else if (cpu_is_at91sam9g20()) +		at91_init_sram(0, AT91SAM9G20_SRAM_BASE, AT91SAM9G20_SRAM_SIZE); +	else +		at91_init_sram(0, AT91SAM9260_SRAM_BASE, AT91SAM9260_SRAM_SIZE);  }  static void __init at91sam9260_ioremap_registers(void)  {  	at91_ioremap_shdwc(AT91SAM9260_BASE_SHDWC);  	at91_ioremap_rstc(AT91SAM9260_BASE_RSTC); +	at91_ioremap_ramc(0, AT91SAM9260_BASE_SDRAMC, 512);  	at91sam926x_ioremap_pit(AT91SAM9260_BASE_PIT);  	at91sam9_ioremap_smc(0, AT91SAM9260_BASE_SMC); -} - -static void at91sam9260_idle(void) -{ -	at91_sys_write(AT91_PMC_SCDR, AT91_PMC_PCK); -	cpu_do_idle(); +	at91_ioremap_matrix(AT91SAM9260_BASE_MATRIX);  }  static void __init at91sam9260_initialize(void)  { -	arm_pm_idle = at91sam9260_idle; +	arm_pm_idle = at91sam9_idle;  	arm_pm_restart = at91sam9_alt_restart;  	at91_extern_irq = (1 << AT91SAM9260_ID_IRQ0) | (1 << AT91SAM9260_ID_IRQ1)  			| (1 << AT91SAM9260_ID_IRQ2); diff --git a/arch/arm/mach-at91/at91sam9260_devices.c b/arch/arm/mach-at91/at91sam9260_devices.c index 5a24f0b4554..7e5651ee9f8 100644 --- a/arch/arm/mach-at91/at91sam9260_devices.c +++ b/arch/arm/mach-at91/at91sam9260_devices.c @@ -21,6 +21,7 @@  #include <mach/cpu.h>  #include <mach/at91sam9260.h>  #include <mach/at91sam9260_matrix.h> +#include <mach/at91_matrix.h>  #include <mach/at91sam9_smc.h>  #include "generic.h" @@ -422,8 +423,8 @@ void __init at91_add_device_nand(struct atmel_nand_data *data)  	if (!data)  		return; -	csa = at91_sys_read(AT91_MATRIX_EBICSA); -	at91_sys_write(AT91_MATRIX_EBICSA, csa | AT91_MATRIX_CS3A_SMC_SMARTMEDIA); +	csa = at91_matrix_read(AT91_MATRIX_EBICSA); +	at91_matrix_write(AT91_MATRIX_EBICSA, csa | AT91_MATRIX_CS3A_SMC_SMARTMEDIA);  	/* enable pin */  	if (gpio_is_valid(data->enable_pin)) @@ -641,7 +642,7 @@ void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices)  static struct resource tcb0_resources[] = {  	[0] = {  		.start	= AT91SAM9260_BASE_TCB0, -		.end	= AT91SAM9260_BASE_TCB0 + SZ_16K - 1, +		.end	= AT91SAM9260_BASE_TCB0 + SZ_256 - 1,  		.flags	= IORESOURCE_MEM,  	},  	[1] = { @@ -671,7 +672,7 @@ static struct platform_device at91sam9260_tcb0_device = {  static struct resource tcb1_resources[] = {  	[0] = {  		.start	= AT91SAM9260_BASE_TCB1, -		.end	= AT91SAM9260_BASE_TCB1 + SZ_16K - 1, +		.end	= AT91SAM9260_BASE_TCB1 + SZ_256 - 1,  		.flags	= IORESOURCE_MEM,  	},  	[1] = { @@ -698,8 +699,25 @@ static struct platform_device at91sam9260_tcb1_device = {  	.num_resources	= ARRAY_SIZE(tcb1_resources),  }; +#if defined(CONFIG_OF) +static struct of_device_id tcb_ids[] = { +	{ .compatible = "atmel,at91rm9200-tcb" }, +	{ /*sentinel*/ } +}; +#endif +  static void __init at91_add_device_tc(void)  { +#if defined(CONFIG_OF) +	struct device_node *np; + +	np = of_find_matching_node(NULL, tcb_ids); +	if (np) { +		of_node_put(np); +		return; +	} +#endif +  	platform_device_register(&at91sam9260_tcb0_device);  	platform_device_register(&at91sam9260_tcb1_device);  } @@ -717,18 +735,42 @@ static struct resource rtt_resources[] = {  		.start	= AT91SAM9260_BASE_RTT,  		.end	= AT91SAM9260_BASE_RTT + SZ_16 - 1,  		.flags	= IORESOURCE_MEM, -	} +	}, { +		.flags	= IORESOURCE_MEM, +	},  };  static struct platform_device at91sam9260_rtt_device = {  	.name		= "at91_rtt",  	.id		= 0,  	.resource	= rtt_resources, -	.num_resources	= ARRAY_SIZE(rtt_resources),  }; + +#if IS_ENABLED(CONFIG_RTC_DRV_AT91SAM9) +static void __init at91_add_device_rtt_rtc(void) +{ +	at91sam9260_rtt_device.name = "rtc-at91sam9"; +	/* +	 * The second resource is needed: +	 * GPBR will serve as the storage for RTC time offset +	 */ +	at91sam9260_rtt_device.num_resources = 2; +	rtt_resources[1].start = AT91SAM9260_BASE_GPBR + +				 4 * CONFIG_RTC_DRV_AT91SAM9_GPBR; +	rtt_resources[1].end = rtt_resources[1].start + 3; +} +#else +static void __init at91_add_device_rtt_rtc(void) +{ +	/* Only one resource is needed: RTT not used as RTC */ +	at91sam9260_rtt_device.num_resources = 1; +} +#endif +  static void __init at91_add_device_rtt(void)  { +	at91_add_device_rtt_rtc();  	platform_device_register(&at91sam9260_rtt_device);  } @@ -1139,7 +1181,6 @@ static inline void configure_usart5_pins(void)  }  static struct platform_device *__initdata at91_uarts[ATMEL_MAX_UART];	/* the UARTs to use */ -struct platform_device *atmel_default_console_device;	/* the serial console device */  void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins)  { @@ -1264,7 +1305,7 @@ void __init at91_add_device_cf(struct at91_cf_data *data)  	if (!data)  		return; -	csa = at91_sys_read(AT91_MATRIX_EBICSA); +	csa = at91_matrix_read(AT91_MATRIX_EBICSA);  	switch (data->chipselect) {  	case 4: @@ -1287,7 +1328,7 @@ void __init at91_add_device_cf(struct at91_cf_data *data)  		return;  	} -	at91_sys_write(AT91_MATRIX_EBICSA, csa); +	at91_matrix_write(AT91_MATRIX_EBICSA, csa);  	if (gpio_is_valid(data->rst_pin)) {  		at91_set_multi_drive(data->rst_pin, 0); diff --git a/arch/arm/mach-at91/at91sam9261.c b/arch/arm/mach-at91/at91sam9261.c index ab76868f01f..684c5dfd92a 100644 --- a/arch/arm/mach-at91/at91sam9261.c +++ b/arch/arm/mach-at91/at91sam9261.c @@ -283,19 +283,15 @@ static void __init at91sam9261_ioremap_registers(void)  {  	at91_ioremap_shdwc(AT91SAM9261_BASE_SHDWC);  	at91_ioremap_rstc(AT91SAM9261_BASE_RSTC); +	at91_ioremap_ramc(0, AT91SAM9261_BASE_SDRAMC, 512);  	at91sam926x_ioremap_pit(AT91SAM9261_BASE_PIT);  	at91sam9_ioremap_smc(0, AT91SAM9261_BASE_SMC); -} - -static void at91sam9261_idle(void) -{ -	at91_sys_write(AT91_PMC_SCDR, AT91_PMC_PCK); -	cpu_do_idle(); +	at91_ioremap_matrix(AT91SAM9261_BASE_MATRIX);  }  static void __init at91sam9261_initialize(void)  { -	arm_pm_idle = at91sam9261_idle; +	arm_pm_idle = at91sam9_idle;  	arm_pm_restart = at91sam9_alt_restart;  	at91_extern_irq = (1 << AT91SAM9261_ID_IRQ0) | (1 << AT91SAM9261_ID_IRQ1)  			| (1 << AT91SAM9261_ID_IRQ2); diff --git a/arch/arm/mach-at91/at91sam9261_devices.c b/arch/arm/mach-at91/at91sam9261_devices.c index 1e28bed8f42..096da87dc00 100644 --- a/arch/arm/mach-at91/at91sam9261_devices.c +++ b/arch/arm/mach-at91/at91sam9261_devices.c @@ -24,6 +24,7 @@  #include <mach/board.h>  #include <mach/at91sam9261.h>  #include <mach/at91sam9261_matrix.h> +#include <mach/at91_matrix.h>  #include <mach/at91sam9_smc.h>  #include "generic.h" @@ -236,8 +237,8 @@ void __init at91_add_device_nand(struct atmel_nand_data *data)  	if (!data)  		return; -	csa = at91_sys_read(AT91_MATRIX_EBICSA); -	at91_sys_write(AT91_MATRIX_EBICSA, csa | AT91_MATRIX_CS3A_SMC_SMARTMEDIA); +	csa = at91_matrix_read(AT91_MATRIX_EBICSA); +	at91_matrix_write(AT91_MATRIX_EBICSA, csa | AT91_MATRIX_CS3A_SMC_SMARTMEDIA);  	/* enable pin */  	if (gpio_is_valid(data->enable_pin)) @@ -603,6 +604,8 @@ static struct resource rtt_resources[] = {  		.start	= AT91SAM9261_BASE_RTT,  		.end	= AT91SAM9261_BASE_RTT + SZ_16 - 1,  		.flags	= IORESOURCE_MEM, +	}, { +		.flags	= IORESOURCE_MEM,  	}  }; @@ -610,11 +613,32 @@ static struct platform_device at91sam9261_rtt_device = {  	.name		= "at91_rtt",  	.id		= 0,  	.resource	= rtt_resources, -	.num_resources	= ARRAY_SIZE(rtt_resources),  }; +#if IS_ENABLED(CONFIG_RTC_DRV_AT91SAM9) +static void __init at91_add_device_rtt_rtc(void) +{ +	at91sam9261_rtt_device.name = "rtc-at91sam9"; +	/* +	 * The second resource is needed: +	 * GPBR will serve as the storage for RTC time offset +	 */ +	at91sam9261_rtt_device.num_resources = 2; +	rtt_resources[1].start = AT91SAM9261_BASE_GPBR + +				 4 * CONFIG_RTC_DRV_AT91SAM9_GPBR; +	rtt_resources[1].end = rtt_resources[1].start + 3; +} +#else +static void __init at91_add_device_rtt_rtc(void) +{ +	/* Only one resource is needed: RTT not used as RTC */ +	at91sam9261_rtt_device.num_resources = 1; +} +#endif +  static void __init at91_add_device_rtt(void)  { +	at91_add_device_rtt_rtc();  	platform_device_register(&at91sam9261_rtt_device);  } @@ -991,7 +1015,6 @@ static inline void configure_usart2_pins(unsigned pins)  }  static struct platform_device *__initdata at91_uarts[ATMEL_MAX_UART];	/* the UARTs to use */ -struct platform_device *atmel_default_console_device;	/* the serial console device */  void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins)  { diff --git a/arch/arm/mach-at91/at91sam9263.c b/arch/arm/mach-at91/at91sam9263.c index 247ab633abc..0b4fa5a7f68 100644 --- a/arch/arm/mach-at91/at91sam9263.c +++ b/arch/arm/mach-at91/at91sam9263.c @@ -303,20 +303,17 @@ static void __init at91sam9263_ioremap_registers(void)  {  	at91_ioremap_shdwc(AT91SAM9263_BASE_SHDWC);  	at91_ioremap_rstc(AT91SAM9263_BASE_RSTC); +	at91_ioremap_ramc(0, AT91SAM9263_BASE_SDRAMC0, 512); +	at91_ioremap_ramc(1, AT91SAM9263_BASE_SDRAMC1, 512);  	at91sam926x_ioremap_pit(AT91SAM9263_BASE_PIT);  	at91sam9_ioremap_smc(0, AT91SAM9263_BASE_SMC0);  	at91sam9_ioremap_smc(1, AT91SAM9263_BASE_SMC1); -} - -static void at91sam9263_idle(void) -{ -	at91_sys_write(AT91_PMC_SCDR, AT91_PMC_PCK); -	cpu_do_idle(); +	at91_ioremap_matrix(AT91SAM9263_BASE_MATRIX);  }  static void __init at91sam9263_initialize(void)  { -	arm_pm_idle = at91sam9263_idle; +	arm_pm_idle = at91sam9_idle;  	arm_pm_restart = at91sam9_alt_restart;  	at91_extern_irq = (1 << AT91SAM9263_ID_IRQ0) | (1 << AT91SAM9263_ID_IRQ1); diff --git a/arch/arm/mach-at91/at91sam9263_devices.c b/arch/arm/mach-at91/at91sam9263_devices.c index 70709ab0102..53688c46f95 100644 --- a/arch/arm/mach-at91/at91sam9263_devices.c +++ b/arch/arm/mach-at91/at91sam9263_devices.c @@ -23,6 +23,7 @@  #include <mach/board.h>  #include <mach/at91sam9263.h>  #include <mach/at91sam9263_matrix.h> +#include <mach/at91_matrix.h>  #include <mach/at91sam9_smc.h>  #include "generic.h" @@ -409,7 +410,7 @@ void __init at91_add_device_cf(struct at91_cf_data *data)  	 * we assume SMC timings are configured by board code,  	 * except True IDE where timings are controlled by driver  	 */ -	ebi0_csa = at91_sys_read(AT91_MATRIX_EBI0CSA); +	ebi0_csa = at91_matrix_read(AT91_MATRIX_EBI0CSA);  	switch (data->chipselect) {  	case 4:  		at91_set_A_periph(AT91_PIN_PD6, 0);  /* EBI0_NCS4/CFCS0 */ @@ -428,7 +429,7 @@ void __init at91_add_device_cf(struct at91_cf_data *data)  		       data->chipselect);  		return;  	} -	at91_sys_write(AT91_MATRIX_EBI0CSA, ebi0_csa); +	at91_matrix_write(AT91_MATRIX_EBI0CSA, ebi0_csa);  	if (gpio_is_valid(data->det_pin)) {  		at91_set_gpio_input(data->det_pin, 1); @@ -496,8 +497,8 @@ void __init at91_add_device_nand(struct atmel_nand_data *data)  	if (!data)  		return; -	csa = at91_sys_read(AT91_MATRIX_EBI0CSA); -	at91_sys_write(AT91_MATRIX_EBI0CSA, csa | AT91_MATRIX_EBI0_CS3A_SMC_SMARTMEDIA); +	csa = at91_matrix_read(AT91_MATRIX_EBI0CSA); +	at91_matrix_write(AT91_MATRIX_EBI0CSA, csa | AT91_MATRIX_EBI0_CS3A_SMC_SMARTMEDIA);  	/* enable pin */  	if (gpio_is_valid(data->enable_pin)) @@ -966,6 +967,8 @@ static struct resource rtt0_resources[] = {  		.start	= AT91SAM9263_BASE_RTT0,  		.end	= AT91SAM9263_BASE_RTT0 + SZ_16 - 1,  		.flags	= IORESOURCE_MEM, +	}, { +		.flags	= IORESOURCE_MEM,  	}  }; @@ -973,7 +976,6 @@ static struct platform_device at91sam9263_rtt0_device = {  	.name		= "at91_rtt",  	.id		= 0,  	.resource	= rtt0_resources, -	.num_resources	= ARRAY_SIZE(rtt0_resources),  };  static struct resource rtt1_resources[] = { @@ -981,6 +983,8 @@ static struct resource rtt1_resources[] = {  		.start	= AT91SAM9263_BASE_RTT1,  		.end	= AT91SAM9263_BASE_RTT1 + SZ_16 - 1,  		.flags	= IORESOURCE_MEM, +	}, { +		.flags	= IORESOURCE_MEM,  	}  }; @@ -988,11 +992,53 @@ static struct platform_device at91sam9263_rtt1_device = {  	.name		= "at91_rtt",  	.id		= 1,  	.resource	= rtt1_resources, -	.num_resources	= ARRAY_SIZE(rtt1_resources),  }; +#if IS_ENABLED(CONFIG_RTC_DRV_AT91SAM9) +static void __init at91_add_device_rtt_rtc(void) +{ +	struct platform_device *pdev; +	struct resource *r; + +	switch (CONFIG_RTC_DRV_AT91SAM9_RTT) { +	case 0: +		/* +		 * The second resource is needed only for the chosen RTT: +		 * GPBR will serve as the storage for RTC time offset +		 */ +		at91sam9263_rtt0_device.num_resources = 2; +		at91sam9263_rtt1_device.num_resources = 1; +		pdev = &at91sam9263_rtt0_device; +		r = rtt0_resources; +		break; +	case 1: +		at91sam9263_rtt0_device.num_resources = 1; +		at91sam9263_rtt1_device.num_resources = 2; +		pdev = &at91sam9263_rtt1_device; +		r = rtt1_resources; +		break; +	default: +		pr_err("at91sam9263: only supports 2 RTT (%d)\n", +		       CONFIG_RTC_DRV_AT91SAM9_RTT); +		return; +	} + +	pdev->name = "rtc-at91sam9"; +	r[1].start = AT91SAM9263_BASE_GPBR + 4 * CONFIG_RTC_DRV_AT91SAM9_GPBR; +	r[1].end = r[1].start + 3; +} +#else +static void __init at91_add_device_rtt_rtc(void) +{ +	/* Only one resource is needed: RTT not used as RTC */ +	at91sam9263_rtt0_device.num_resources = 1; +	at91sam9263_rtt1_device.num_resources = 1; +} +#endif +  static void __init at91_add_device_rtt(void)  { +	at91_add_device_rtt_rtc();  	platform_device_register(&at91sam9263_rtt0_device);  	platform_device_register(&at91sam9263_rtt1_device);  } @@ -1378,7 +1424,6 @@ static inline void configure_usart2_pins(unsigned pins)  }  static struct platform_device *__initdata at91_uarts[ATMEL_MAX_UART];	/* the UARTs to use */ -struct platform_device *atmel_default_console_device;	/* the serial console device */  void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins)  { diff --git a/arch/arm/mach-at91/at91sam926x_time.c b/arch/arm/mach-at91/at91sam926x_time.c index d89ead740a9..a94758b4273 100644 --- a/arch/arm/mach-at91/at91sam926x_time.c +++ b/arch/arm/mach-at91/at91sam926x_time.c @@ -14,6 +14,9 @@  #include <linux/kernel.h>  #include <linux/clk.h>  #include <linux/clockchips.h> +#include <linux/of.h> +#include <linux/of_address.h> +#include <linux/of_irq.h>  #include <asm/mach/time.h> @@ -133,7 +136,8 @@ static irqreturn_t at91sam926x_pit_interrupt(int irq, void *dev_id)  static struct irqaction at91sam926x_pit_irq = {  	.name		= "at91_tick",  	.flags		= IRQF_SHARED | IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL, -	.handler	= at91sam926x_pit_interrupt +	.handler	= at91sam926x_pit_interrupt, +	.irq		= AT91_ID_SYS,  };  static void at91sam926x_pit_reset(void) @@ -149,6 +153,51 @@ static void at91sam926x_pit_reset(void)  	pit_write(AT91_PIT_MR, (pit_cycle - 1) | AT91_PIT_PITEN);  } +#ifdef CONFIG_OF +static struct of_device_id pit_timer_ids[] = { +	{ .compatible = "atmel,at91sam9260-pit" }, +	{ /* sentinel */ } +}; + +static int __init of_at91sam926x_pit_init(void) +{ +	struct device_node	*np; +	int			ret; + +	np = of_find_matching_node(NULL, pit_timer_ids); +	if (!np) +		goto err; + +	pit_base_addr = of_iomap(np, 0); +	if (!pit_base_addr) +		goto node_err; + +	/* Get the interrupts property */ +	ret = irq_of_parse_and_map(np, 0); +	if (!ret) { +		pr_crit("AT91: PIT: Unable to get IRQ from DT\n"); +		goto ioremap_err; +	} +	at91sam926x_pit_irq.irq = ret; + +	of_node_put(np); + +	return 0; + +ioremap_err: +	iounmap(pit_base_addr); +node_err: +	of_node_put(np); +err: +	return -EINVAL; +} +#else +static int __init of_at91sam926x_pit_init(void) +{ +	return -EINVAL; +} +#endif +  /*   * Set up both clocksource and clockevent support.   */ @@ -156,6 +205,10 @@ static void __init at91sam926x_pit_init(void)  {  	unsigned long	pit_rate;  	unsigned	bits; +	int		ret; + +	/* For device tree enabled device: initialize here */ +	of_at91sam926x_pit_init();  	/*  	 * Use our actual MCK to figure out how many MCK/16 ticks per @@ -177,7 +230,9 @@ static void __init at91sam926x_pit_init(void)  	clocksource_register_hz(&pit_clk, pit_rate);  	/* Set up irq handler */ -	setup_irq(AT91_ID_SYS, &at91sam926x_pit_irq); +	ret = setup_irq(at91sam926x_pit_irq.irq, &at91sam926x_pit_irq); +	if (ret) +		pr_crit("AT91: PIT: Unable to setup IRQ\n");  	/* Set up and register clockevents */  	pit_clkevt.mult = div_sc(pit_rate, NSEC_PER_SEC, pit_clkevt.shift); @@ -193,6 +248,15 @@ static void at91sam926x_pit_suspend(void)  void __init at91sam926x_ioremap_pit(u32 addr)  { +#if defined(CONFIG_OF) +	struct device_node *np = +		of_find_matching_node(NULL, pit_timer_ids); + +	if (np) { +		of_node_put(np); +		return; +	} +#endif  	pit_base_addr = ioremap(addr, 16);  	if (!pit_base_addr) diff --git a/arch/arm/mach-at91/at91sam9_alt_reset.S b/arch/arm/mach-at91/at91sam9_alt_reset.S index 518e4237717..7af2e108b8a 100644 --- a/arch/arm/mach-at91/at91sam9_alt_reset.S +++ b/arch/arm/mach-at91/at91sam9_alt_reset.S @@ -15,16 +15,17 @@  #include <linux/linkage.h>  #include <mach/hardware.h> -#include <mach/at91sam9_sdramc.h> +#include <mach/at91_ramc.h>  #include <mach/at91_rstc.h>  			.arm  			.globl	at91sam9_alt_restart -at91sam9_alt_restart:	ldr	r0, .at91_va_base_sdramc	@ preload constants -			ldr	r1, =at91_rstc_base -			ldr	r1, [r1] +at91sam9_alt_restart:	ldr	r0, =at91_ramc_base		@ preload constants +			ldr	r0, [r0] +			ldr	r4, =at91_rstc_base +			ldr	r1, [r4]  			mov	r2, #1  			mov	r3, #AT91_SDRAMC_LPCB_POWER_DOWN @@ -37,6 +38,3 @@ at91sam9_alt_restart:	ldr	r0, .at91_va_base_sdramc	@ preload constants  			str	r4, [r1, #AT91_RSTC_CR]		@ reset processor  			b	. - -.at91_va_base_sdramc: -	.word AT91_VA_BASE_SYS + AT91_SDRAMC0 diff --git a/arch/arm/mach-at91/at91sam9g45.c b/arch/arm/mach-at91/at91sam9g45.c index 5b12192e52e..0014573dfe1 100644 --- a/arch/arm/mach-at91/at91sam9g45.c +++ b/arch/arm/mach-at91/at91sam9g45.c @@ -229,6 +229,9 @@ static struct clk_lookup periph_clocks_lookups[] = {  	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), +	/* more tc lookup table for DT entries */ +	CLKDEV_CON_DEV_ID("t0_clk", "fff7c000.timer", &tcb0_clk), +	CLKDEV_CON_DEV_ID("t0_clk", "fffd4000.timer", &tcb0_clk),  	/* fake hclk clock */  	CLKDEV_CON_DEV_ID("hclk", "at91_ohci", &uhphs_clk),  	CLKDEV_CON_ID("pioA", &pioA_clk), @@ -317,12 +320,6 @@ static struct at91_gpio_bank at91sam9g45_gpio[] __initdata = {  	}  }; -static void at91sam9g45_idle(void) -{ -	at91_sys_write(AT91_PMC_SCDR, AT91_PMC_PCK); -	cpu_do_idle(); -} -  /* --------------------------------------------------------------------   *  AT91SAM9G45 processor initialization   * -------------------------------------------------------------------- */ @@ -337,13 +334,16 @@ static void __init at91sam9g45_ioremap_registers(void)  {  	at91_ioremap_shdwc(AT91SAM9G45_BASE_SHDWC);  	at91_ioremap_rstc(AT91SAM9G45_BASE_RSTC); +	at91_ioremap_ramc(0, AT91SAM9G45_BASE_DDRSDRC1, 512); +	at91_ioremap_ramc(1, AT91SAM9G45_BASE_DDRSDRC0, 512);  	at91sam926x_ioremap_pit(AT91SAM9G45_BASE_PIT);  	at91sam9_ioremap_smc(0, AT91SAM9G45_BASE_SMC); +	at91_ioremap_matrix(AT91SAM9G45_BASE_MATRIX);  }  static void __init at91sam9g45_initialize(void)  { -	arm_pm_idle = at91sam9g45_idle; +	arm_pm_idle = at91sam9_idle;  	arm_pm_restart = at91sam9g45_restart;  	at91_extern_irq = (1 << AT91SAM9G45_ID_IRQ0); diff --git a/arch/arm/mach-at91/at91sam9g45_devices.c b/arch/arm/mach-at91/at91sam9g45_devices.c index bd4e68cd3e2..4320b209678 100644 --- a/arch/arm/mach-at91/at91sam9g45_devices.c +++ b/arch/arm/mach-at91/at91sam9g45_devices.c @@ -25,6 +25,7 @@  #include <mach/board.h>  #include <mach/at91sam9g45.h>  #include <mach/at91sam9g45_matrix.h> +#include <mach/at91_matrix.h>  #include <mach/at91sam9_smc.h>  #include <mach/at_hdmac.h>  #include <mach/atmel-mci.h> @@ -557,8 +558,8 @@ void __init at91_add_device_nand(struct atmel_nand_data *data)  	if (!data)  		return; -	csa = at91_sys_read(AT91_MATRIX_EBICSA); -	at91_sys_write(AT91_MATRIX_EBICSA, csa | AT91_MATRIX_EBI_CS3A_SMC_SMARTMEDIA); +	csa = at91_matrix_read(AT91_MATRIX_EBICSA); +	at91_matrix_write(AT91_MATRIX_EBICSA, csa | AT91_MATRIX_EBI_CS3A_SMC_SMARTMEDIA);  	/* enable pin */  	if (gpio_is_valid(data->enable_pin)) @@ -1051,7 +1052,7 @@ void __init at91_add_device_lcdc(struct atmel_lcdfb_info *data) {}  static struct resource tcb0_resources[] = {  	[0] = {  		.start	= AT91SAM9G45_BASE_TCB0, -		.end	= AT91SAM9G45_BASE_TCB0 + SZ_16K - 1, +		.end	= AT91SAM9G45_BASE_TCB0 + SZ_256 - 1,  		.flags	= IORESOURCE_MEM,  	},  	[1] = { @@ -1072,7 +1073,7 @@ static struct platform_device at91sam9g45_tcb0_device = {  static struct resource tcb1_resources[] = {  	[0] = {  		.start	= AT91SAM9G45_BASE_TCB1, -		.end	= AT91SAM9G45_BASE_TCB1 + SZ_16K - 1, +		.end	= AT91SAM9G45_BASE_TCB1 + SZ_256 - 1,  		.flags	= IORESOURCE_MEM,  	},  	[1] = { @@ -1089,8 +1090,25 @@ static struct platform_device at91sam9g45_tcb1_device = {  	.num_resources	= ARRAY_SIZE(tcb1_resources),  }; +#if defined(CONFIG_OF) +static struct of_device_id tcb_ids[] = { +	{ .compatible = "atmel,at91rm9200-tcb" }, +	{ /*sentinel*/ } +}; +#endif +  static void __init at91_add_device_tc(void)  { +#if defined(CONFIG_OF) +	struct device_node *np; + +	np = of_find_matching_node(NULL, tcb_ids); +	if (np) { +		of_node_put(np); +		return; +	} +#endif +  	platform_device_register(&at91sam9g45_tcb0_device);  	platform_device_register(&at91sam9g45_tcb1_device);  } @@ -1193,6 +1211,8 @@ static struct resource rtt_resources[] = {  		.start	= AT91SAM9G45_BASE_RTT,  		.end	= AT91SAM9G45_BASE_RTT + SZ_16 - 1,  		.flags	= IORESOURCE_MEM, +	}, { +		.flags	= IORESOURCE_MEM,  	}  }; @@ -1200,11 +1220,32 @@ static struct platform_device at91sam9g45_rtt_device = {  	.name		= "at91_rtt",  	.id		= 0,  	.resource	= rtt_resources, -	.num_resources	= ARRAY_SIZE(rtt_resources),  }; +#if IS_ENABLED(CONFIG_RTC_DRV_AT91SAM9) +static void __init at91_add_device_rtt_rtc(void) +{ +	at91sam9g45_rtt_device.name = "rtc-at91sam9"; +	/* +	 * The second resource is needed: +	 * GPBR will serve as the storage for RTC time offset +	 */ +	at91sam9g45_rtt_device.num_resources = 2; +	rtt_resources[1].start = AT91SAM9G45_BASE_GPBR + +				 4 * CONFIG_RTC_DRV_AT91SAM9_GPBR; +	rtt_resources[1].end = rtt_resources[1].start + 3; +} +#else +static void __init at91_add_device_rtt_rtc(void) +{ +	/* Only one resource is needed: RTT not used as RTC */ +	at91sam9g45_rtt_device.num_resources = 1; +} +#endif +  static void __init at91_add_device_rtt(void)  { +	at91_add_device_rtt_rtc();  	platform_device_register(&at91sam9g45_rtt_device);  } @@ -1659,7 +1700,6 @@ static inline void configure_usart3_pins(unsigned pins)  }  static struct platform_device *__initdata at91_uarts[ATMEL_MAX_UART];	/* the UARTs to use */ -struct platform_device *atmel_default_console_device;	/* the serial console device */  void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins)  { diff --git a/arch/arm/mach-at91/at91sam9g45_reset.S b/arch/arm/mach-at91/at91sam9g45_reset.S index 0468be10980..9d457182c86 100644 --- a/arch/arm/mach-at91/at91sam9g45_reset.S +++ b/arch/arm/mach-at91/at91sam9g45_reset.S @@ -12,7 +12,7 @@  #include <linux/linkage.h>  #include <mach/hardware.h> -#include <mach/at91sam9_ddrsdr.h> +#include <mach/at91_ramc.h>  #include <mach/at91_rstc.h>  			.arm @@ -20,9 +20,10 @@  			.globl	at91sam9g45_restart  at91sam9g45_restart: -			ldr	r0, .at91_va_base_sdramc0	@ preload constants -			ldr	r1, =at91_rstc_base -			ldr	r1, [r1] +			ldr	r5, =at91_ramc_base		@ preload constants +			ldr	r0, [r5] +			ldr	r4, =at91_rstc_base +			ldr	r1, [r4]  			mov	r2, #1  			mov	r3, #AT91_DDRSDRC_LPCB_POWER_DOWN @@ -35,6 +36,3 @@ at91sam9g45_restart:  			str	r4, [r1, #AT91_RSTC_CR]		@ reset processor  			b	. - -.at91_va_base_sdramc0: -	.word AT91_VA_BASE_SYS + AT91_DDRSDRC0 diff --git a/arch/arm/mach-at91/at91sam9rl.c b/arch/arm/mach-at91/at91sam9rl.c index fd60e226a98..63d9372eb18 100644 --- a/arch/arm/mach-at91/at91sam9rl.c +++ b/arch/arm/mach-at91/at91sam9rl.c @@ -288,19 +288,15 @@ static void __init at91sam9rl_ioremap_registers(void)  {  	at91_ioremap_shdwc(AT91SAM9RL_BASE_SHDWC);  	at91_ioremap_rstc(AT91SAM9RL_BASE_RSTC); +	at91_ioremap_ramc(0, AT91SAM9RL_BASE_SDRAMC, 512);  	at91sam926x_ioremap_pit(AT91SAM9RL_BASE_PIT);  	at91sam9_ioremap_smc(0, AT91SAM9RL_BASE_SMC); -} - -static void at91sam9rl_idle(void) -{ -	at91_sys_write(AT91_PMC_SCDR, AT91_PMC_PCK); -	cpu_do_idle(); +	at91_ioremap_matrix(AT91SAM9RL_BASE_MATRIX);  }  static void __init at91sam9rl_initialize(void)  { -	arm_pm_idle = at91sam9rl_idle; +	arm_pm_idle = at91sam9_idle;  	arm_pm_restart = at91sam9_alt_restart;  	at91_extern_irq = (1 << AT91SAM9RL_ID_IRQ0); diff --git a/arch/arm/mach-at91/at91sam9rl_devices.c b/arch/arm/mach-at91/at91sam9rl_devices.c index 9be71c11d0f..eda72e83037 100644 --- a/arch/arm/mach-at91/at91sam9rl_devices.c +++ b/arch/arm/mach-at91/at91sam9rl_devices.c @@ -20,6 +20,7 @@  #include <mach/board.h>  #include <mach/at91sam9rl.h>  #include <mach/at91sam9rl_matrix.h> +#include <mach/at91_matrix.h>  #include <mach/at91sam9_smc.h>  #include <mach/at_hdmac.h> @@ -265,8 +266,8 @@ void __init at91_add_device_nand(struct atmel_nand_data *data)  	if (!data)  		return; -	csa = at91_sys_read(AT91_MATRIX_EBICSA); -	at91_sys_write(AT91_MATRIX_EBICSA, csa | AT91_MATRIX_CS3A_SMC_SMARTMEDIA); +	csa = at91_matrix_read(AT91_MATRIX_EBICSA); +	at91_matrix_write(AT91_MATRIX_EBICSA, csa | AT91_MATRIX_CS3A_SMC_SMARTMEDIA);  	/* enable pin */  	if (gpio_is_valid(data->enable_pin)) @@ -682,6 +683,8 @@ static struct resource rtt_resources[] = {  		.start	= AT91SAM9RL_BASE_RTT,  		.end	= AT91SAM9RL_BASE_RTT + SZ_16 - 1,  		.flags	= IORESOURCE_MEM, +	}, { +		.flags	= IORESOURCE_MEM,  	}  }; @@ -689,11 +692,32 @@ static struct platform_device at91sam9rl_rtt_device = {  	.name		= "at91_rtt",  	.id		= 0,  	.resource	= rtt_resources, -	.num_resources	= ARRAY_SIZE(rtt_resources),  }; +#if IS_ENABLED(CONFIG_RTC_DRV_AT91SAM9) +static void __init at91_add_device_rtt_rtc(void) +{ +	at91sam9rl_rtt_device.name = "rtc-at91sam9"; +	/* +	 * The second resource is needed: +	 * GPBR will serve as the storage for RTC time offset +	 */ +	at91sam9rl_rtt_device.num_resources = 2; +	rtt_resources[1].start = AT91SAM9RL_BASE_GPBR + +				 4 * CONFIG_RTC_DRV_AT91SAM9_GPBR; +	rtt_resources[1].end = rtt_resources[1].start + 3; +} +#else +static void __init at91_add_device_rtt_rtc(void) +{ +	/* Only one resource is needed: RTT not used as RTC */ +	at91sam9rl_rtt_device.num_resources = 1; +} +#endif +  static void __init at91_add_device_rtt(void)  { +	at91_add_device_rtt_rtc();  	platform_device_register(&at91sam9rl_rtt_device);  } @@ -1128,7 +1152,6 @@ static inline void configure_usart3_pins(unsigned pins)  }  static struct platform_device *__initdata at91_uarts[ATMEL_MAX_UART];	/* the UARTs to use */ -struct platform_device *atmel_default_console_device;	/* the serial console device */  void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins)  { diff --git a/arch/arm/mach-at91/at91sam9x5.c b/arch/arm/mach-at91/at91sam9x5.c index 1c3444d2ee0..a34d96afa74 100644 --- a/arch/arm/mach-at91/at91sam9x5.c +++ b/arch/arm/mach-at91/at91sam9x5.c @@ -301,8 +301,7 @@ static void __init at91sam9x5_map_io(void)  static void __init at91sam9x5_ioremap_registers(void)  { -	if (of_at91sam926x_pit_init() < 0) -		panic("Impossible to find PIT\n"); +	at91_ioremap_ramc(0, AT91SAM9X5_BASE_DDRSDRC0, 512);  }  void __init at91sam9x5_initialize(void) @@ -317,10 +316,6 @@ void __init at91sam9x5_initialize(void)  /* --------------------------------------------------------------------   *  AT91SAM9x5 devices (temporary before modification of code)   * -------------------------------------------------------------------- */ -void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) {} -void __init at91_set_serial_console(unsigned portnr) {} -struct platform_device *atmel_default_console_device = NULL; -  void __init at91_add_device_nand(struct atmel_nand_data *data) {}  /* -------------------------------------------------------------------- diff --git a/arch/arm/mach-at91/at91x40.c b/arch/arm/mach-at91/at91x40.c index 0154b7f44ff..5400a1d6503 100644 --- a/arch/arm/mach-at91/at91x40.c +++ b/arch/arm/mach-at91/at91x40.c @@ -44,7 +44,7 @@ static void at91x40_idle(void)  	 * Disable the processor clock.  The processor will be automatically  	 * re-enabled by an interrupt or by a reset.  	 */ -	at91_sys_write(AT91_PS_CR, AT91_PS_CR_CPU); +	__raw_writel(AT91_PS_CR_CPU, AT91_PS_CR);  	cpu_do_idle();  } diff --git a/arch/arm/mach-at91/at91x40_time.c b/arch/arm/mach-at91/at91x40_time.c index dfff2895f4b..6ca680a1d5d 100644 --- a/arch/arm/mach-at91/at91x40_time.c +++ b/arch/arm/mach-at91/at91x40_time.c @@ -28,6 +28,12 @@  #include <asm/mach/time.h>  #include <mach/at91_tc.h> +#define at91_tc_read(field) \ +	__raw_readl(AT91_TC + field) + +#define at91_tc_write(field, value) \ +	__raw_writel(value, AT91_TC + field); +  /*   *	3 counter/timer units present.   */ @@ -37,12 +43,12 @@  static unsigned long at91x40_gettimeoffset(void)  { -	return (at91_sys_read(AT91_TC + AT91_TC_CLK1BASE + AT91_TC_CV) * 1000000 / (AT91X40_MASTER_CLOCK / 128)); +	return (at91_tc_read(AT91_TC_CLK1BASE + AT91_TC_CV) * 1000000 / (AT91X40_MASTER_CLOCK / 128));  }  static irqreturn_t at91x40_timer_interrupt(int irq, void *dev_id)  { -	at91_sys_read(AT91_TC + AT91_TC_CLK1BASE + AT91_TC_SR); +	at91_tc_read(AT91_TC_CLK1BASE + AT91_TC_SR);  	timer_tick();  	return IRQ_HANDLED;  } @@ -57,20 +63,20 @@ void __init at91x40_timer_init(void)  {  	unsigned int v; -	at91_sys_write(AT91_TC + AT91_TC_BCR, 0); -	v = at91_sys_read(AT91_TC + AT91_TC_BMR); +	at91_tc_write(AT91_TC_BCR, 0); +	v = at91_tc_read(AT91_TC_BMR);  	v = (v & ~AT91_TC_TC1XC1S) | AT91_TC_TC1XC1S_NONE; -	at91_sys_write(AT91_TC + AT91_TC_BMR, v); +	at91_tc_write(AT91_TC_BMR, v); -	at91_sys_write(AT91_TC + AT91_TC_CLK1BASE + AT91_TC_CCR, AT91_TC_CLKDIS); -	at91_sys_write(AT91_TC + AT91_TC_CLK1BASE + AT91_TC_CMR, (AT91_TC_TIMER_CLOCK4 | AT91_TC_CPCTRG)); -	at91_sys_write(AT91_TC + AT91_TC_CLK1BASE + AT91_TC_IDR, 0xffffffff); -	at91_sys_write(AT91_TC + AT91_TC_CLK1BASE + AT91_TC_RC, (AT91X40_MASTER_CLOCK / 128) / HZ - 1); -	at91_sys_write(AT91_TC + AT91_TC_CLK1BASE + AT91_TC_IER, (1<<4)); +	at91_tc_write(AT91_TC_CLK1BASE + AT91_TC_CCR, AT91_TC_CLKDIS); +	at91_tc_write(AT91_TC_CLK1BASE + AT91_TC_CMR, (AT91_TC_TIMER_CLOCK4 | AT91_TC_CPCTRG)); +	at91_tc_write(AT91_TC_CLK1BASE + AT91_TC_IDR, 0xffffffff); +	at91_tc_write(AT91_TC_CLK1BASE + AT91_TC_RC, (AT91X40_MASTER_CLOCK / 128) / HZ - 1); +	at91_tc_write(AT91_TC_CLK1BASE + AT91_TC_IER, (1<<4));  	setup_irq(AT91X40_ID_TC1, &at91x40_timer_irq); -	at91_sys_write(AT91_TC + AT91_TC_CLK1BASE + AT91_TC_CCR, (AT91_TC_SWTRG | AT91_TC_CLKEN)); +	at91_tc_write(AT91_TC_CLK1BASE + AT91_TC_CCR, (AT91_TC_SWTRG | AT91_TC_CLKEN));  }  struct sys_timer at91x40_timer = { diff --git a/arch/arm/mach-at91/board-cpu9krea.c b/arch/arm/mach-at91/board-cpu9krea.c index 9ab3d1ea326..989e1c5a9ca 100644 --- a/arch/arm/mach-at91/board-cpu9krea.c +++ b/arch/arm/mach-at91/board-cpu9krea.c @@ -43,6 +43,7 @@  #include <mach/board.h>  #include <mach/at91sam9_smc.h>  #include <mach/at91sam9260_matrix.h> +#include <mach/at91_matrix.h>  #include "sam9_smc.h"  #include "generic.h" @@ -238,8 +239,8 @@ static __init void cpu9krea_add_device_nor(void)  {  	unsigned long csa; -	csa = at91_sys_read(AT91_MATRIX_EBICSA); -	at91_sys_write(AT91_MATRIX_EBICSA, csa | AT91_MATRIX_VDDIOMSEL_3_3V); +	csa = at91_matrix_read(AT91_MATRIX_EBICSA); +	at91_matrix_write(AT91_MATRIX_EBICSA, csa | AT91_MATRIX_VDDIOMSEL_3_3V);  	/* configure chip-select 0 (NOR) */  	sam9_smc_configure(0, 0, &cpu9krea_nor_smc_config); diff --git a/arch/arm/mach-at91/board-cpuat91.c b/arch/arm/mach-at91/board-cpuat91.c index 368e1427ad9..e094cc81fe2 100644 --- a/arch/arm/mach-at91/board-cpuat91.c +++ b/arch/arm/mach-at91/board-cpuat91.c @@ -38,6 +38,7 @@  #include <mach/board.h>  #include <mach/at91rm9200_mc.h> +#include <mach/at91_ramc.h>  #include <mach/cpu.h>  #include "generic.h" diff --git a/arch/arm/mach-at91/board-dt.c b/arch/arm/mach-at91/board-dt.c index 05793156d17..583b72472ad 100644 --- a/arch/arm/mach-at91/board-dt.c +++ b/arch/arm/mach-at91/board-dt.c @@ -15,7 +15,7 @@  #include <linux/init.h>  #include <linux/module.h>  #include <linux/gpio.h> -#include <linux/irqdomain.h> +#include <linux/of.h>  #include <linux/of_irq.h>  #include <linux/of_platform.h> @@ -38,12 +38,6 @@ 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 */ @@ -88,15 +82,17 @@ static void __init ek_add_device_nand(void)  	at91_add_device_nand(&ek_nand_data);  } -static const struct of_device_id aic_of_match[] __initconst = { -	{ .compatible = "atmel,at91rm9200-aic", }, -	{}, +static const struct of_device_id irq_of_match[] __initconst = { + +	{ .compatible = "atmel,at91rm9200-aic", .data = at91_aic_of_init }, +	{ .compatible = "atmel,at91rm9200-gpio", .data = at91_gpio_of_irq_setup }, +	{ .compatible = "atmel,at91sam9x5-gpio", .data = at91_gpio_of_irq_setup }, +	{ /*sentinel*/ }  };  static void __init at91_dt_init_irq(void)  { -	irq_domain_generate_simple(aic_of_match, 0xfffff000, 0); -	at91_init_irq_default(); +	of_irq_init(irq_of_match);  }  static void __init at91_dt_device_init(void) diff --git a/arch/arm/mach-at91/board-eco920.c b/arch/arm/mach-at91/board-eco920.c index 07ef35b0ec2..f23aabef855 100644 --- a/arch/arm/mach-at91/board-eco920.c +++ b/arch/arm/mach-at91/board-eco920.c @@ -26,6 +26,7 @@  #include <mach/board.h>  #include <mach/at91rm9200_mc.h> +#include <mach/at91_ramc.h>  #include <mach/cpu.h>  #include "generic.h" @@ -110,7 +111,7 @@ static void __init eco920_board_init(void)  	at91_add_device_mmc(0, &eco920_mmc_data);  	platform_device_register(&eco920_flash); -	at91_sys_write(AT91_SMC_CSR(7),	AT91_SMC_RWHOLD_(1) +	at91_ramc_write(0, AT91_SMC_CSR(7),	AT91_SMC_RWHOLD_(1)  				| AT91_SMC_RWSETUP_(1)  				| AT91_SMC_DBW_8  				| AT91_SMC_WSEN @@ -122,7 +123,7 @@ static void __init eco920_board_init(void)  	at91_set_deglitch(AT91_PIN_PA23, 1);  /* Initialization of the Static Memory Controller for Chip Select 3 */ -	at91_sys_write(AT91_SMC_CSR(3), +	at91_ramc_write(0, AT91_SMC_CSR(3),  		AT91_SMC_DBW_16  |	/* 16 bit */  		AT91_SMC_WSEN    |  		AT91_SMC_NWS_(5) |	/* wait states */ diff --git a/arch/arm/mach-at91/board-kb9202.c b/arch/arm/mach-at91/board-kb9202.c index d75a4a2ad9c..bb991458201 100644 --- a/arch/arm/mach-at91/board-kb9202.c +++ b/arch/arm/mach-at91/board-kb9202.c @@ -38,6 +38,7 @@  #include <mach/board.h>  #include <mach/cpu.h>  #include <mach/at91rm9200_mc.h> +#include <mach/at91_ramc.h>  #include "generic.h" diff --git a/arch/arm/mach-at91/board-picotux200.c b/arch/arm/mach-at91/board-picotux200.c index ab024fa11d5..59e35dd1486 100644 --- a/arch/arm/mach-at91/board-picotux200.c +++ b/arch/arm/mach-at91/board-picotux200.c @@ -39,6 +39,7 @@  #include <mach/board.h>  #include <mach/at91rm9200_mc.h> +#include <mach/at91_ramc.h>  #include "generic.h" diff --git a/arch/arm/mach-at91/board-rm9200dk.c b/arch/arm/mach-at91/board-rm9200dk.c index 782f37946af..9083df04e7e 100644 --- a/arch/arm/mach-at91/board-rm9200dk.c +++ b/arch/arm/mach-at91/board-rm9200dk.c @@ -41,6 +41,7 @@  #include <mach/hardware.h>  #include <mach/board.h>  #include <mach/at91rm9200_mc.h> +#include <mach/at91_ramc.h>  #include "generic.h" diff --git a/arch/arm/mach-at91/board-rm9200ek.c b/arch/arm/mach-at91/board-rm9200ek.c index ef7c12a9224..11cbaa8946f 100644 --- a/arch/arm/mach-at91/board-rm9200ek.c +++ b/arch/arm/mach-at91/board-rm9200ek.c @@ -41,6 +41,7 @@  #include <mach/hardware.h>  #include <mach/board.h>  #include <mach/at91rm9200_mc.h> +#include <mach/at91_ramc.h>  #include "generic.h" diff --git a/arch/arm/mach-at91/board-snapper9260.c b/arch/arm/mach-at91/board-snapper9260.c index 4770db08e5a..3c2e3fcc310 100644 --- a/arch/arm/mach-at91/board-snapper9260.c +++ b/arch/arm/mach-at91/board-snapper9260.c @@ -145,11 +145,11 @@ static struct i2c_board_info __initdata snapper9260_i2c_devices[] = {  		/* Audio codec */  		I2C_BOARD_INFO("tlv320aic23", 0x1a),  	}, -	{ +}; + +static struct i2c_board_info __initdata snapper9260_i2c_isl1208 = {  		/* RTC */  		I2C_BOARD_INFO("isl1208", 0x6f), -		.irq = gpio_to_irq(AT91_PIN_PA31), -	},  };  static void __init snapper9260_add_device_nand(void) @@ -163,6 +163,10 @@ static void __init snapper9260_board_init(void)  {  	at91_add_device_i2c(snapper9260_i2c_devices,  			    ARRAY_SIZE(snapper9260_i2c_devices)); + +	snapper9260_i2c_isl1208.irq = gpio_to_irq(AT91_PIN_PA31); +	i2c_register_board_info(0, &snapper9260_i2c_isl1208, 1); +  	at91_add_device_serial();  	at91_add_device_usbh(&snapper9260_usbh_data);  	at91_add_device_udc(&snapper9260_udc_data); diff --git a/arch/arm/mach-at91/board-yl-9200.c b/arch/arm/mach-at91/board-yl-9200.c index bbd553e1cd9..52f460768f7 100644 --- a/arch/arm/mach-at91/board-yl-9200.c +++ b/arch/arm/mach-at91/board-yl-9200.c @@ -45,6 +45,7 @@  #include <mach/hardware.h>  #include <mach/board.h>  #include <mach/at91rm9200_mc.h> +#include <mach/at91_ramc.h>  #include <mach/cpu.h>  #include "generic.h" @@ -393,7 +394,7 @@ static void yl9200_init_video(void)  	at91_set_A_periph(AT91_PIN_PC6, 0);  	/* Initialization of the Static Memory Controller for Chip Select 2 */ -	at91_sys_write(AT91_SMC_CSR(2), AT91_SMC_DBW_16		/* 16 bit */ +	at91_ramc_write(0, AT91_SMC_CSR(2), AT91_SMC_DBW_16		/* 16 bit */  			| AT91_SMC_WSEN | AT91_SMC_NWS_(0x4)	/* wait states */  			| AT91_SMC_TDF_(0x100)			/* float time */  	); diff --git a/arch/arm/mach-at91/clock.c b/arch/arm/mach-at91/clock.c index a5291e0e700..be51ca7f694 100644 --- a/arch/arm/mach-at91/clock.c +++ b/arch/arm/mach-at91/clock.c @@ -28,9 +28,12 @@  #include <mach/at91_pmc.h>  #include <mach/cpu.h> +#include <asm/proc-fns.h> +  #include "clock.h"  #include "generic.h" +void __iomem *at91_pmc_base;  /*   * There's a lot more which can be done with clocks, including cpufreq @@ -123,11 +126,11 @@ static void pllb_mode(struct clk *clk, int is_on)  		value = 0;  	// REVISIT: Add work-around for AT91RM9200 Errata #26 ? -	at91_sys_write(AT91_CKGR_PLLBR, value); +	at91_pmc_write(AT91_CKGR_PLLBR, value);  	do {  		cpu_relax(); -	} while ((at91_sys_read(AT91_PMC_SR) & AT91_PMC_LOCKB) != is_on); +	} while ((at91_pmc_read(AT91_PMC_SR) & AT91_PMC_LOCKB) != is_on);  }  static struct clk pllb = { @@ -142,24 +145,24 @@ static struct clk pllb = {  static void pmc_sys_mode(struct clk *clk, int is_on)  {  	if (is_on) -		at91_sys_write(AT91_PMC_SCER, clk->pmc_mask); +		at91_pmc_write(AT91_PMC_SCER, clk->pmc_mask);  	else -		at91_sys_write(AT91_PMC_SCDR, clk->pmc_mask); +		at91_pmc_write(AT91_PMC_SCDR, clk->pmc_mask);  }  static void pmc_uckr_mode(struct clk *clk, int is_on)  { -	unsigned int uckr = at91_sys_read(AT91_CKGR_UCKR); +	unsigned int uckr = at91_pmc_read(AT91_CKGR_UCKR);  	if (is_on) {  		is_on = AT91_PMC_LOCKU; -		at91_sys_write(AT91_CKGR_UCKR, uckr | clk->pmc_mask); +		at91_pmc_write(AT91_CKGR_UCKR, uckr | clk->pmc_mask);  	} else -		at91_sys_write(AT91_CKGR_UCKR, uckr & ~(clk->pmc_mask)); +		at91_pmc_write(AT91_CKGR_UCKR, uckr & ~(clk->pmc_mask));  	do {  		cpu_relax(); -	} while ((at91_sys_read(AT91_PMC_SR) & AT91_PMC_LOCKU) != is_on); +	} while ((at91_pmc_read(AT91_PMC_SR) & AT91_PMC_LOCKU) != is_on);  }  /* USB function clocks (PLLB must be 48 MHz) */ @@ -195,9 +198,9 @@ struct clk mck = {  static void pmc_periph_mode(struct clk *clk, int is_on)  {  	if (is_on) -		at91_sys_write(AT91_PMC_PCER, clk->pmc_mask); +		at91_pmc_write(AT91_PMC_PCER, clk->pmc_mask);  	else -		at91_sys_write(AT91_PMC_PCDR, clk->pmc_mask); +		at91_pmc_write(AT91_PMC_PCDR, clk->pmc_mask);  }  static struct clk __init *at91_css_to_clk(unsigned long css) @@ -357,10 +360,10 @@ int clk_set_rate(struct clk *clk, unsigned long rate)  		if (actual && actual <= rate) {  			u32	pckr; -			pckr = at91_sys_read(AT91_PMC_PCKR(clk->id)); +			pckr = at91_pmc_read(AT91_PMC_PCKR(clk->id));  			pckr &= css_mask;	/* keep clock selection */  			pckr |= prescale << prescale_offset; -			at91_sys_write(AT91_PMC_PCKR(clk->id), pckr); +			at91_pmc_write(AT91_PMC_PCKR(clk->id), pckr);  			clk->rate_hz = actual;  			break;  		} @@ -394,7 +397,7 @@ int clk_set_parent(struct clk *clk, struct clk *parent)  	clk->rate_hz = parent->rate_hz;  	clk->parent = parent; -	at91_sys_write(AT91_PMC_PCKR(clk->id), parent->id); +	at91_pmc_write(AT91_PMC_PCKR(clk->id), parent->id);  	spin_unlock_irqrestore(&clk_lock, flags);  	return 0; @@ -413,7 +416,7 @@ static void __init init_programmable_clock(struct clk *clk)  	else  		css_mask = AT91_PMC_CSS; -	pckr = at91_sys_read(AT91_PMC_PCKR(clk->id)); +	pckr = at91_pmc_read(AT91_PMC_PCKR(clk->id));  	parent = at91_css_to_clk(pckr & css_mask);  	clk->parent = parent;  	clk->rate_hz = parent->rate_hz / pmc_prescaler_divider(pckr); @@ -430,19 +433,24 @@ static int at91_clk_show(struct seq_file *s, void *unused)  	u32		scsr, pcsr, uckr = 0, sr;  	struct clk	*clk; -	seq_printf(s, "SCSR = %8x\n", scsr = at91_sys_read(AT91_PMC_SCSR)); -	seq_printf(s, "PCSR = %8x\n", pcsr = at91_sys_read(AT91_PMC_PCSR)); -	seq_printf(s, "MOR  = %8x\n", at91_sys_read(AT91_CKGR_MOR)); -	seq_printf(s, "MCFR = %8x\n", at91_sys_read(AT91_CKGR_MCFR)); -	seq_printf(s, "PLLA = %8x\n", at91_sys_read(AT91_CKGR_PLLAR)); +	scsr = at91_pmc_read(AT91_PMC_SCSR); +	pcsr = at91_pmc_read(AT91_PMC_PCSR); +	sr = at91_pmc_read(AT91_PMC_SR); +	seq_printf(s, "SCSR = %8x\n", scsr); +	seq_printf(s, "PCSR = %8x\n", pcsr); +	seq_printf(s, "MOR  = %8x\n", at91_pmc_read(AT91_CKGR_MOR)); +	seq_printf(s, "MCFR = %8x\n", at91_pmc_read(AT91_CKGR_MCFR)); +	seq_printf(s, "PLLA = %8x\n", at91_pmc_read(AT91_CKGR_PLLAR));  	if (cpu_has_pllb()) -		seq_printf(s, "PLLB = %8x\n", at91_sys_read(AT91_CKGR_PLLBR)); -	if (cpu_has_utmi()) -		seq_printf(s, "UCKR = %8x\n", uckr = at91_sys_read(AT91_CKGR_UCKR)); -	seq_printf(s, "MCKR = %8x\n", at91_sys_read(AT91_PMC_MCKR)); +		seq_printf(s, "PLLB = %8x\n", at91_pmc_read(AT91_CKGR_PLLBR)); +	if (cpu_has_utmi()) { +		uckr = at91_pmc_read(AT91_CKGR_UCKR); +		seq_printf(s, "UCKR = %8x\n", uckr); +	} +	seq_printf(s, "MCKR = %8x\n", at91_pmc_read(AT91_PMC_MCKR));  	if (cpu_has_upll()) -		seq_printf(s, "USB  = %8x\n", at91_sys_read(AT91_PMC_USB)); -	seq_printf(s, "SR   = %8x\n", sr = at91_sys_read(AT91_PMC_SR)); +		seq_printf(s, "USB  = %8x\n", at91_pmc_read(AT91_PMC_USB)); +	seq_printf(s, "SR   = %8x\n", sr);  	seq_printf(s, "\n"); @@ -630,14 +638,14 @@ static void __init at91_pllb_usbfs_clock_init(unsigned long main_clock)  	if (cpu_is_at91rm9200()) {  		uhpck.pmc_mask = AT91RM9200_PMC_UHP;  		udpck.pmc_mask = AT91RM9200_PMC_UDP; -		at91_sys_write(AT91_PMC_SCER, AT91RM9200_PMC_MCKUDP); +		at91_pmc_write(AT91_PMC_SCER, AT91RM9200_PMC_MCKUDP);  	} else if (cpu_is_at91sam9260() || cpu_is_at91sam9261() ||  		   cpu_is_at91sam9263() || cpu_is_at91sam9g20() ||  		   cpu_is_at91sam9g10()) {  		uhpck.pmc_mask = AT91SAM926x_PMC_UHP;  		udpck.pmc_mask = AT91SAM926x_PMC_UDP;  	} -	at91_sys_write(AT91_CKGR_PLLBR, 0); +	at91_pmc_write(AT91_CKGR_PLLBR, 0);  	udpck.rate_hz = at91_usb_rate(&pllb, pllb.rate_hz, at91_pllb_usb_init);  	uhpck.rate_hz = at91_usb_rate(&pllb, pllb.rate_hz, at91_pllb_usb_init); @@ -654,13 +662,13 @@ static void __init at91_upll_usbfs_clock_init(unsigned long main_clock)  	/* Setup divider by 10 to reach 48 MHz */  	usbr |= ((10 - 1) << 8) & AT91_PMC_OHCIUSBDIV; -	at91_sys_write(AT91_PMC_USB, usbr); +	at91_pmc_write(AT91_PMC_USB, usbr);  	/* Now set uhpck values */  	uhpck.parent = &utmi_clk;  	uhpck.pmc_mask = AT91SAM926x_PMC_UHP;  	uhpck.rate_hz = utmi_clk.rate_hz; -	uhpck.rate_hz /= 1 + ((at91_sys_read(AT91_PMC_USB) & AT91_PMC_OHCIUSBDIV) >> 8); +	uhpck.rate_hz /= 1 + ((at91_pmc_read(AT91_PMC_USB) & AT91_PMC_OHCIUSBDIV) >> 8);  }  int __init at91_clock_init(unsigned long main_clock) @@ -669,6 +677,10 @@ int __init at91_clock_init(unsigned long main_clock)  	int i;  	int pll_overclock = false; +	at91_pmc_base = ioremap(AT91_PMC, 256); +	if (!at91_pmc_base) +		panic("Impossible to ioremap AT91_PMC 0x%x\n", AT91_PMC); +  	/*  	 * When the bootloader initialized the main oscillator correctly,  	 * there's no problem using the cycle counter.  But if it didn't, @@ -677,14 +689,14 @@ int __init at91_clock_init(unsigned long main_clock)  	 */  	if (!main_clock) {  		do { -			tmp = at91_sys_read(AT91_CKGR_MCFR); +			tmp = at91_pmc_read(AT91_CKGR_MCFR);  		} while (!(tmp & AT91_PMC_MAINRDY));  		main_clock = (tmp & AT91_PMC_MAINF) * (AT91_SLOW_CLOCK / 16);  	}  	main_clk.rate_hz = main_clock;  	/* report if PLLA is more than mildly overclocked */ -	plla.rate_hz = at91_pll_rate(&plla, main_clock, at91_sys_read(AT91_CKGR_PLLAR)); +	plla.rate_hz = at91_pll_rate(&plla, main_clock, at91_pmc_read(AT91_CKGR_PLLAR));  	if (cpu_has_300M_plla()) {  		if (plla.rate_hz > 300000000)  			pll_overclock = true; @@ -699,7 +711,7 @@ int __init at91_clock_init(unsigned long main_clock)  		pr_info("Clocks: PLLA overclocked, %ld MHz\n", plla.rate_hz / 1000000);  	if (cpu_has_plladiv2()) { -		mckr = at91_sys_read(AT91_PMC_MCKR); +		mckr = at91_pmc_read(AT91_PMC_MCKR);  		plla.rate_hz /= (1 << ((mckr & AT91_PMC_PLLADIV2) >> 12));	/* plla divisor by 2 */  	} @@ -739,7 +751,7 @@ int __init at91_clock_init(unsigned long main_clock)  	 * MCK and CPU derive from one of those primary clocks.  	 * For now, assume this parentage won't change.  	 */ -	mckr = at91_sys_read(AT91_PMC_MCKR); +	mckr = at91_pmc_read(AT91_PMC_MCKR);  	mck.parent = at91_css_to_clk(mckr & AT91_PMC_CSS);  	freq = mck.parent->rate_hz;  	freq /= pmc_prescaler_divider(mckr);					/* prescale */ @@ -812,9 +824,15 @@ static int __init at91_clock_reset(void)  		pr_debug("Clocks: disable unused %s\n", clk->name);  	} -	at91_sys_write(AT91_PMC_PCDR, pcdr); -	at91_sys_write(AT91_PMC_SCDR, scdr); +	at91_pmc_write(AT91_PMC_PCDR, pcdr); +	at91_pmc_write(AT91_PMC_SCDR, scdr);  	return 0;  }  late_initcall(at91_clock_reset); + +void at91sam9_idle(void) +{ +	at91_pmc_write(AT91_PMC_SCDR, AT91_PMC_PCK); +	cpu_do_idle(); +} diff --git a/arch/arm/mach-at91/generic.h b/arch/arm/mach-at91/generic.h index 7e8280e798c..459f01a4a54 100644 --- a/arch/arm/mach-at91/generic.h +++ b/arch/arm/mach-at91/generic.h @@ -9,6 +9,7 @@   */  #include <linux/clkdev.h> +#include <linux/of.h>   /* Map io */  extern void __init at91_map_io(void); @@ -25,9 +26,13 @@ extern void __init at91_init_irq_default(void);  extern void __init at91_init_interrupts(unsigned int priority[]);  extern void __init at91x40_init_interrupts(unsigned int priority[]);  extern void __init at91_aic_init(unsigned int priority[]); +extern int  __init at91_aic_of_init(struct device_node *node, +				    struct device_node *parent); +   /* Timer */  struct sys_timer; +extern void at91rm9200_ioremap_st(u32 addr);  extern struct sys_timer at91rm9200_timer;  extern void at91sam926x_ioremap_pit(u32 addr);  extern struct sys_timer at91sam926x_timer; @@ -56,6 +61,9 @@ struct device;  extern void at91_irq_suspend(void);  extern void at91_irq_resume(void); +/* idle */ +extern void at91sam9_idle(void); +  /* reset */  extern void at91_ioremap_rstc(u32 base_addr);  extern void at91sam9_alt_restart(char, const char *); @@ -64,6 +72,12 @@ extern void at91sam9g45_restart(char, const char *);  /* shutdown */  extern void at91_ioremap_shdwc(u32 base_addr); +/* Matrix */ +extern void at91_ioremap_matrix(u32 base_addr); + +/* Ram Controler */ +extern void at91_ioremap_ramc(int id, u32 addr, u32 size); +   /* GPIO */  #define AT91RM9200_PQFP		3	/* AT91RM9200 PQFP package has 3 banks */  #define AT91RM9200_BGA		4	/* AT91RM9200 BGA package has 4 banks */ @@ -74,5 +88,7 @@ struct at91_gpio_bank {  };  extern void __init at91_gpio_init(struct at91_gpio_bank *, int nr_banks);  extern void __init at91_gpio_irq_setup(void); +extern int  __init at91_gpio_of_irq_setup(struct device_node *node, +					  struct device_node *parent);  extern int at91_extern_irq; diff --git a/arch/arm/mach-at91/gpio.c b/arch/arm/mach-at91/gpio.c index 74d6783eeab..325837a264c 100644 --- a/arch/arm/mach-at91/gpio.c +++ b/arch/arm/mach-at91/gpio.c @@ -11,6 +11,7 @@  #include <linux/clk.h>  #include <linux/errno.h> +#include <linux/device.h>  #include <linux/gpio.h>  #include <linux/interrupt.h>  #include <linux/irq.h> @@ -20,6 +21,10 @@  #include <linux/list.h>  #include <linux/module.h>  #include <linux/io.h> +#include <linux/irqdomain.h> +#include <linux/of_address.h> +#include <linux/of_irq.h> +#include <linux/of_gpio.h>  #include <mach/hardware.h>  #include <mach/at91_pio.h> @@ -29,9 +34,12 @@  struct at91_gpio_chip {  	struct gpio_chip	chip;  	struct at91_gpio_chip	*next;		/* Bank sharing same clock */ -	int			id;		/* ID of register bank */ -	void __iomem		*regbase;	/* Base of register bank */ +	int			pioc_hwirq;	/* PIO bank interrupt identifier on AIC */ +	int			pioc_virq;	/* PIO bank Linux virtual interrupt */ +	int			pioc_idx;	/* PIO bank index */ +	void __iomem		*regbase;	/* PIO bank virtual address */  	struct clk		*clock;		/* associated clock */ +	struct irq_domain	*domain;	/* associated irq domain */  };  #define to_at91_gpio_chip(c) container_of(c, struct at91_gpio_chip, chip) @@ -43,8 +51,9 @@ static int at91_gpiolib_direction_output(struct gpio_chip *chip,  					 unsigned offset, int val);  static int at91_gpiolib_direction_input(struct gpio_chip *chip,  					unsigned offset); +static int at91_gpiolib_to_irq(struct gpio_chip *chip, unsigned offset); -#define AT91_GPIO_CHIP(name, base_gpio, nr_gpio)			\ +#define AT91_GPIO_CHIP(name, nr_gpio)					\  	{								\  		.chip = {						\  			.label		  = name,			\ @@ -53,20 +62,28 @@ static int at91_gpiolib_direction_input(struct gpio_chip *chip,  			.get		  = at91_gpiolib_get,		\  			.set		  = at91_gpiolib_set,		\  			.dbg_show	  = at91_gpiolib_dbg_show,	\ -			.base		  = base_gpio,			\ +			.to_irq		  = at91_gpiolib_to_irq,	\  			.ngpio		  = nr_gpio,			\  		},							\  	}  static struct at91_gpio_chip gpio_chip[] = { -	AT91_GPIO_CHIP("pioA", 0x00, 32), -	AT91_GPIO_CHIP("pioB", 0x20, 32), -	AT91_GPIO_CHIP("pioC", 0x40, 32), -	AT91_GPIO_CHIP("pioD", 0x60, 32), -	AT91_GPIO_CHIP("pioE", 0x80, 32), +	AT91_GPIO_CHIP("pioA", 32), +	AT91_GPIO_CHIP("pioB", 32), +	AT91_GPIO_CHIP("pioC", 32), +	AT91_GPIO_CHIP("pioD", 32), +	AT91_GPIO_CHIP("pioE", 32),  };  static int gpio_banks; +static unsigned long at91_gpio_caps; + +/* All PIO controllers support PIO3 features */ +#define AT91_GPIO_CAP_PIO3	(1 <<  0) + +#define has_pio3()	(at91_gpio_caps & AT91_GPIO_CAP_PIO3) + +/*--------------------------------------------------------------------------*/  static inline void __iomem *pin_to_controller(unsigned pin)  { @@ -83,6 +100,25 @@ static inline unsigned pin_to_mask(unsigned pin)  } +static char peripheral_function(void __iomem *pio, unsigned mask) +{ +	char	ret = 'X'; +	u8	select; + +	if (pio) { +		if (has_pio3()) { +			select = !!(__raw_readl(pio + PIO_ABCDSR1) & mask); +			select |= (!!(__raw_readl(pio + PIO_ABCDSR2) & mask) << 1); +			ret = 'A' + select; +		} else { +			ret = __raw_readl(pio + PIO_ABSR) & mask ? +							'B' : 'A'; +		} +	} + +	return ret; +} +  /*--------------------------------------------------------------------------*/  /* Not all hardware capabilities are exposed through these calls; they @@ -130,7 +166,14 @@ int __init_or_module at91_set_A_periph(unsigned pin, int use_pullup)  	__raw_writel(mask, pio + PIO_IDR);  	__raw_writel(mask, pio + (use_pullup ? PIO_PUER : PIO_PUDR)); -	__raw_writel(mask, pio + PIO_ASR); +	if (has_pio3()) { +		__raw_writel(__raw_readl(pio + PIO_ABCDSR1) & ~mask, +							pio + PIO_ABCDSR1); +		__raw_writel(__raw_readl(pio + PIO_ABCDSR2) & ~mask, +							pio + PIO_ABCDSR2); +	} else { +		__raw_writel(mask, pio + PIO_ASR); +	}  	__raw_writel(mask, pio + PIO_PDR);  	return 0;  } @@ -150,7 +193,14 @@ int __init_or_module at91_set_B_periph(unsigned pin, int use_pullup)  	__raw_writel(mask, pio + PIO_IDR);  	__raw_writel(mask, pio + (use_pullup ? PIO_PUER : PIO_PUDR)); -	__raw_writel(mask, pio + PIO_BSR); +	if (has_pio3()) { +		__raw_writel(__raw_readl(pio + PIO_ABCDSR1) | mask, +							pio + PIO_ABCDSR1); +		__raw_writel(__raw_readl(pio + PIO_ABCDSR2) & ~mask, +							pio + PIO_ABCDSR2); +	} else { +		__raw_writel(mask, pio + PIO_BSR); +	}  	__raw_writel(mask, pio + PIO_PDR);  	return 0;  } @@ -158,8 +208,50 @@ EXPORT_SYMBOL(at91_set_B_periph);  /* - * mux the pin to the gpio controller (instead of "A" or "B" peripheral), and - * configure it for an input. + * mux the pin to the "C" internal peripheral role. + */ +int __init_or_module at91_set_C_periph(unsigned pin, int use_pullup) +{ +	void __iomem	*pio = pin_to_controller(pin); +	unsigned	mask = pin_to_mask(pin); + +	if (!pio || !has_pio3()) +		return -EINVAL; + +	__raw_writel(mask, pio + PIO_IDR); +	__raw_writel(mask, pio + (use_pullup ? PIO_PUER : PIO_PUDR)); +	__raw_writel(__raw_readl(pio + PIO_ABCDSR1) & ~mask, pio + PIO_ABCDSR1); +	__raw_writel(__raw_readl(pio + PIO_ABCDSR2) | mask, pio + PIO_ABCDSR2); +	__raw_writel(mask, pio + PIO_PDR); +	return 0; +} +EXPORT_SYMBOL(at91_set_C_periph); + + +/* + * mux the pin to the "D" internal peripheral role. + */ +int __init_or_module at91_set_D_periph(unsigned pin, int use_pullup) +{ +	void __iomem	*pio = pin_to_controller(pin); +	unsigned	mask = pin_to_mask(pin); + +	if (!pio || !has_pio3()) +		return -EINVAL; + +	__raw_writel(mask, pio + PIO_IDR); +	__raw_writel(mask, pio + (use_pullup ? PIO_PUER : PIO_PUDR)); +	__raw_writel(__raw_readl(pio + PIO_ABCDSR1) | mask, pio + PIO_ABCDSR1); +	__raw_writel(__raw_readl(pio + PIO_ABCDSR2) | mask, pio + PIO_ABCDSR2); +	__raw_writel(mask, pio + PIO_PDR); +	return 0; +} +EXPORT_SYMBOL(at91_set_D_periph); + + +/* + * mux the pin to the gpio controller (instead of "A", "B", "C" + * or "D" peripheral), and configure it for an input.   */  int __init_or_module at91_set_gpio_input(unsigned pin, int use_pullup)  { @@ -179,8 +271,8 @@ EXPORT_SYMBOL(at91_set_gpio_input);  /* - * mux the pin to the gpio controller (instead of "A" or "B" peripheral), - * and configure it for an output. + * mux the pin to the gpio controller (instead of "A", "B", "C" + * or "D" peripheral), and configure it for an output.   */  int __init_or_module at91_set_gpio_output(unsigned pin, int value)  { @@ -210,12 +302,37 @@ int __init_or_module at91_set_deglitch(unsigned pin, int is_on)  	if (!pio)  		return -EINVAL; + +	if (has_pio3() && is_on) +		__raw_writel(mask, pio + PIO_IFSCDR);  	__raw_writel(mask, pio + (is_on ? PIO_IFER : PIO_IFDR));  	return 0;  }  EXPORT_SYMBOL(at91_set_deglitch);  /* + * enable/disable the debounce filter; + */ +int __init_or_module at91_set_debounce(unsigned pin, int is_on, int div) +{ +	void __iomem	*pio = pin_to_controller(pin); +	unsigned	mask = pin_to_mask(pin); + +	if (!pio || !has_pio3()) +		return -EINVAL; + +	if (is_on) { +		__raw_writel(mask, pio + PIO_IFSCER); +		__raw_writel(div & PIO_SCDR_DIV, pio + PIO_SCDR); +		__raw_writel(mask, pio + PIO_IFER); +	} else { +		__raw_writel(mask, pio + PIO_IFDR); +	} +	return 0; +} +EXPORT_SYMBOL(at91_set_debounce); + +/*   * enable/disable the multi-driver; This is only valid for output and   * allows the output pin to run as an open collector output.   */ @@ -233,6 +350,41 @@ int __init_or_module at91_set_multi_drive(unsigned pin, int is_on)  EXPORT_SYMBOL(at91_set_multi_drive);  /* + * enable/disable the pull-down. + * If pull-up already enabled while calling the function, we disable it. + */ +int __init_or_module at91_set_pulldown(unsigned pin, int is_on) +{ +	void __iomem	*pio = pin_to_controller(pin); +	unsigned	mask = pin_to_mask(pin); + +	if (!pio || !has_pio3()) +		return -EINVAL; + +	/* Disable pull-up anyway */ +	__raw_writel(mask, pio + PIO_PUDR); +	__raw_writel(mask, pio + (is_on ? PIO_PPDER : PIO_PPDDR)); +	return 0; +} +EXPORT_SYMBOL(at91_set_pulldown); + +/* + * disable Schmitt trigger + */ +int __init_or_module at91_disable_schmitt_trig(unsigned pin) +{ +	void __iomem	*pio = pin_to_controller(pin); +	unsigned	mask = pin_to_mask(pin); + +	if (!pio || !has_pio3()) +		return -EINVAL; + +	__raw_writel(__raw_readl(pio + PIO_SCHMITT) | mask, pio + PIO_SCHMITT); +	return 0; +} +EXPORT_SYMBOL(at91_disable_schmitt_trig); + +/*   * assuming the pin is muxed as a gpio output, set its value.   */  int at91_set_gpio_value(unsigned pin, int value) @@ -273,9 +425,9 @@ static u32 backups[MAX_GPIO_BANKS];  static int gpio_irq_set_wake(struct irq_data *d, unsigned state)  { -	unsigned	pin = irq_to_gpio(d->irq); -	unsigned	mask = pin_to_mask(pin); -	unsigned	bank = pin / 32; +	struct at91_gpio_chip *at91_gpio = irq_data_get_irq_chip_data(d); +	unsigned	mask = 1 << d->hwirq; +	unsigned	bank = at91_gpio->pioc_idx;  	if (unlikely(bank >= MAX_GPIO_BANKS))  		return -EINVAL; @@ -285,7 +437,7 @@ static int gpio_irq_set_wake(struct irq_data *d, unsigned state)  	else  		wakeups[bank] &= ~mask; -	irq_set_irq_wake(gpio_chip[bank].id, state); +	irq_set_irq_wake(at91_gpio->pioc_virq, state);  	return 0;  } @@ -301,9 +453,10 @@ void at91_gpio_suspend(void)  		__raw_writel(backups[i], pio + PIO_IDR);  		__raw_writel(wakeups[i], pio + PIO_IER); -		if (!wakeups[i]) +		if (!wakeups[i]) { +			clk_unprepare(gpio_chip[i].clock);  			clk_disable(gpio_chip[i].clock); -		else { +		} else {  #ifdef CONFIG_PM_DEBUG  			printk(KERN_DEBUG "GPIO-%c may wake for %08x\n", 'A'+i, wakeups[i]);  #endif @@ -318,8 +471,10 @@ void at91_gpio_resume(void)  	for (i = 0; i < gpio_banks; i++) {  		void __iomem	*pio = gpio_chip[i].regbase; -		if (!wakeups[i]) -			clk_enable(gpio_chip[i].clock); +		if (!wakeups[i]) { +			if (clk_prepare(gpio_chip[i].clock) == 0) +				clk_enable(gpio_chip[i].clock); +		}  		__raw_writel(wakeups[i], pio + PIO_IDR);  		__raw_writel(backups[i], pio + PIO_IER); @@ -335,7 +490,10 @@ void at91_gpio_resume(void)   * To use any AT91_PIN_* as an externally triggered IRQ, first call   * at91_set_gpio_input() then maybe enable its glitch filter.   * Then just request_irq() with the pin ID; it works like any ARM IRQ - * handler, though it always triggers on rising and falling edges. + * handler. + * First implementation always triggers on rising and falling edges + * whereas the newer PIO3 can be additionally configured to trigger on + * level, edge with any polarity.   *   * Alternatively, certain pins may be used directly as IRQ0..IRQ6 after   * configuring them with at91_set_a_periph() or at91_set_b_periph(). @@ -344,9 +502,9 @@ void at91_gpio_resume(void)  static void gpio_irq_mask(struct irq_data *d)  { -	unsigned	pin = irq_to_gpio(d->irq); -	void __iomem	*pio = pin_to_controller(pin); -	unsigned	mask = pin_to_mask(pin); +	struct at91_gpio_chip *at91_gpio = irq_data_get_irq_chip_data(d); +	void __iomem	*pio = at91_gpio->regbase; +	unsigned	mask = 1 << d->hwirq;  	if (pio)  		__raw_writel(mask, pio + PIO_IDR); @@ -354,9 +512,9 @@ static void gpio_irq_mask(struct irq_data *d)  static void gpio_irq_unmask(struct irq_data *d)  { -	unsigned	pin = irq_to_gpio(d->irq); -	void __iomem	*pio = pin_to_controller(pin); -	unsigned	mask = pin_to_mask(pin); +	struct at91_gpio_chip *at91_gpio = irq_data_get_irq_chip_data(d); +	void __iomem	*pio = at91_gpio->regbase; +	unsigned	mask = 1 << d->hwirq;  	if (pio)  		__raw_writel(mask, pio + PIO_IER); @@ -373,23 +531,66 @@ static int gpio_irq_type(struct irq_data *d, unsigned type)  	}  } +/* Alternate irq type for PIO3 support */ +static int alt_gpio_irq_type(struct irq_data *d, unsigned type) +{ +	struct at91_gpio_chip *at91_gpio = irq_data_get_irq_chip_data(d); +	void __iomem	*pio = at91_gpio->regbase; +	unsigned	mask = 1 << d->hwirq; + +	switch (type) { +	case IRQ_TYPE_EDGE_RISING: +		__raw_writel(mask, pio + PIO_ESR); +		__raw_writel(mask, pio + PIO_REHLSR); +		break; +	case IRQ_TYPE_EDGE_FALLING: +		__raw_writel(mask, pio + PIO_ESR); +		__raw_writel(mask, pio + PIO_FELLSR); +		break; +	case IRQ_TYPE_LEVEL_LOW: +		__raw_writel(mask, pio + PIO_LSR); +		__raw_writel(mask, pio + PIO_FELLSR); +		break; +	case IRQ_TYPE_LEVEL_HIGH: +		__raw_writel(mask, pio + PIO_LSR); +		__raw_writel(mask, pio + PIO_REHLSR); +		break; +	case IRQ_TYPE_EDGE_BOTH: +		/* +		 * disable additional interrupt modes: +		 * fall back to default behavior +		 */ +		__raw_writel(mask, pio + PIO_AIMDR); +		return 0; +	case IRQ_TYPE_NONE: +	default: +		pr_warn("AT91: No type for irq %d\n", gpio_to_irq(d->irq)); +		return -EINVAL; +	} + +	/* enable additional interrupt modes */ +	__raw_writel(mask, pio + PIO_AIMER); + +	return 0; +} +  static struct irq_chip gpio_irqchip = {  	.name		= "GPIO",  	.irq_disable	= gpio_irq_mask,  	.irq_mask	= gpio_irq_mask,  	.irq_unmask	= gpio_irq_unmask, -	.irq_set_type	= gpio_irq_type, +	/* .irq_set_type is set dynamically */  	.irq_set_wake	= gpio_irq_set_wake,  };  static void gpio_irq_handler(unsigned irq, struct irq_desc *desc)  { -	unsigned	irq_pin;  	struct irq_data *idata = irq_desc_get_irq_data(desc);  	struct irq_chip *chip = irq_data_get_irq_chip(idata);  	struct at91_gpio_chip *at91_gpio = irq_data_get_irq_chip_data(idata);  	void __iomem	*pio = at91_gpio->regbase; -	u32		isr; +	unsigned long	isr; +	int		n;  	/* temporarily mask (level sensitive) parent IRQ */  	chip->irq_ack(idata); @@ -407,13 +608,10 @@ static void gpio_irq_handler(unsigned irq, struct irq_desc *desc)  			continue;  		} -		irq_pin = gpio_to_irq(at91_gpio->chip.base); - -		while (isr) { -			if (isr & 1) -				generic_handle_irq(irq_pin); -			irq_pin++; -			isr >>= 1; +		n = find_first_bit(&isr, BITS_PER_LONG); +		while (n < BITS_PER_LONG) { +			generic_handle_irq(irq_find_mapping(at91_gpio->domain, n)); +			n = find_next_bit(&isr, BITS_PER_LONG, n + 1);  		}  	}  	chip->irq_unmask(idata); @@ -424,6 +622,33 @@ static void gpio_irq_handler(unsigned irq, struct irq_desc *desc)  #ifdef CONFIG_DEBUG_FS +static void gpio_printf(struct seq_file *s, void __iomem *pio, unsigned mask) +{ +	char	*trigger = NULL; +	char	*polarity = NULL; + +	if (__raw_readl(pio + PIO_IMR) & mask) { +		if (!has_pio3() || !(__raw_readl(pio + PIO_AIMMR) & mask )) { +			trigger = "edge"; +			polarity = "both"; +		} else { +			if (__raw_readl(pio + PIO_ELSR) & mask) { +				trigger = "level"; +				polarity = __raw_readl(pio + PIO_FRLHSR) & mask ? +					"high" : "low"; +			} else { +				trigger = "edge"; +				polarity = __raw_readl(pio + PIO_FRLHSR) & mask ? +						"rising" : "falling"; +			} +		} +		seq_printf(s, "IRQ:%s-%s\t", trigger, polarity); +	} else { +		seq_printf(s, "GPIO:%s\t\t", +				__raw_readl(pio + PIO_PDSR) & mask ? "1" : "0"); +	} +} +  static int at91_gpio_show(struct seq_file *s, void *unused)  {  	int bank, j; @@ -431,7 +656,7 @@ static int at91_gpio_show(struct seq_file *s, void *unused)  	/* print heading */  	seq_printf(s, "Pin\t");  	for (bank = 0; bank < gpio_banks; bank++) { -		seq_printf(s, "PIO%c\t", 'A' + bank); +		seq_printf(s, "PIO%c\t\t", 'A' + bank);  	};  	seq_printf(s, "\n\n"); @@ -445,11 +670,10 @@ static int at91_gpio_show(struct seq_file *s, void *unused)  			unsigned	mask = pin_to_mask(pin);  			if (__raw_readl(pio + PIO_PSR) & mask) -				seq_printf(s, "GPIO:%s", __raw_readl(pio + PIO_PDSR) & mask ? "1" : "0"); +				gpio_printf(s, pio, mask);  			else -				seq_printf(s, "%s", __raw_readl(pio + PIO_ABSR) & mask ? "B" : "A"); - -			seq_printf(s, "\t"); +				seq_printf(s, "%c\t\t", +						peripheral_function(pio, mask));  		}  		seq_printf(s, "\n"); @@ -488,46 +712,152 @@ postcore_initcall(at91_gpio_debugfs_init);   */  static struct lock_class_key gpio_lock_class; +#if defined(CONFIG_OF) +static int at91_gpio_irq_map(struct irq_domain *h, unsigned int virq, +							irq_hw_number_t hw) +{ +	struct at91_gpio_chip	*at91_gpio = h->host_data; + +	irq_set_lockdep_class(virq, &gpio_lock_class); + +	/* +	 * Can use the "simple" and not "edge" handler since it's +	 * shorter, and the AIC handles interrupts sanely. +	 */ +	irq_set_chip_and_handler(virq, &gpio_irqchip, +				 handle_simple_irq); +	set_irq_flags(virq, IRQF_VALID); +	irq_set_chip_data(virq, at91_gpio); + +	return 0; +} + +static struct irq_domain_ops at91_gpio_ops = { +	.map	= at91_gpio_irq_map, +	.xlate	= irq_domain_xlate_twocell, +}; + +int __init at91_gpio_of_irq_setup(struct device_node *node, +				     struct device_node *parent) +{ +	struct at91_gpio_chip	*prev = NULL; +	int			alias_idx = of_alias_get_id(node, "gpio"); +	struct at91_gpio_chip	*at91_gpio = &gpio_chip[alias_idx]; + +	/* Setup proper .irq_set_type function */ +	if (has_pio3()) +		gpio_irqchip.irq_set_type = alt_gpio_irq_type; +	else +		gpio_irqchip.irq_set_type = gpio_irq_type; + +	/* Disable irqs of this PIO controller */ +	__raw_writel(~0, at91_gpio->regbase + PIO_IDR); + +	/* Setup irq domain */ +	at91_gpio->domain = irq_domain_add_linear(node, at91_gpio->chip.ngpio, +						&at91_gpio_ops, at91_gpio); +	if (!at91_gpio->domain) +		panic("at91_gpio.%d: couldn't allocate irq domain (DT).\n", +			at91_gpio->pioc_idx); + +	/* Setup chained handler */ +	if (at91_gpio->pioc_idx) +		prev = &gpio_chip[at91_gpio->pioc_idx - 1]; + +	/* The toplevel handler handles one bank of GPIOs, except +	 * on some SoC it can handles up to three... +	 * We only set up the handler for the first of the list. +	 */ +	if (prev && prev->next == at91_gpio) +		return 0; + +	at91_gpio->pioc_virq = irq_create_mapping(irq_find_host(parent), +							at91_gpio->pioc_hwirq); +	irq_set_chip_data(at91_gpio->pioc_virq, at91_gpio); +	irq_set_chained_handler(at91_gpio->pioc_virq, gpio_irq_handler); + +	return 0; +} +#else +int __init at91_gpio_of_irq_setup(struct device_node *node, +				     struct device_node *parent) +{ +	return -EINVAL; +} +#endif + +/* + * irqdomain initialization: pile up irqdomains on top of AIC range + */ +static void __init at91_gpio_irqdomain(struct at91_gpio_chip *at91_gpio) +{ +	int irq_base; + +	irq_base = irq_alloc_descs(-1, 0, at91_gpio->chip.ngpio, 0); +	if (irq_base < 0) +		panic("at91_gpio.%d: error %d: couldn't allocate IRQ numbers.\n", +			at91_gpio->pioc_idx, irq_base); +	at91_gpio->domain = irq_domain_add_legacy(NULL, at91_gpio->chip.ngpio, +						  irq_base, 0, +						  &irq_domain_simple_ops, NULL); +	if (!at91_gpio->domain) +		panic("at91_gpio.%d: couldn't allocate irq domain.\n", +			at91_gpio->pioc_idx); +} +  /*   * Called from the processor-specific init to enable GPIO interrupt support.   */  void __init at91_gpio_irq_setup(void)  { -	unsigned		pioc, irq = gpio_to_irq(0); +	unsigned		pioc; +	int			gpio_irqnbr = 0;  	struct at91_gpio_chip	*this, *prev; +	/* Setup proper .irq_set_type function */ +	if (has_pio3()) +		gpio_irqchip.irq_set_type = alt_gpio_irq_type; +	else +		gpio_irqchip.irq_set_type = gpio_irq_type; +  	for (pioc = 0, this = gpio_chip, prev = NULL;  			pioc++ < gpio_banks;  			prev = this, this++) { -		unsigned	id = this->id; -		unsigned	i; +		int offset;  		__raw_writel(~0, this->regbase + PIO_IDR); -		for (i = 0, irq = gpio_to_irq(this->chip.base); i < 32; -		     i++, irq++) { -			irq_set_lockdep_class(irq, &gpio_lock_class); +		/* setup irq domain for this GPIO controller */ +		at91_gpio_irqdomain(this); + +		for (offset = 0; offset < this->chip.ngpio; offset++) { +			unsigned int virq = irq_find_mapping(this->domain, offset); +			irq_set_lockdep_class(virq, &gpio_lock_class);  			/*  			 * Can use the "simple" and not "edge" handler since it's  			 * shorter, and the AIC handles interrupts sanely.  			 */ -			irq_set_chip_and_handler(irq, &gpio_irqchip, +			irq_set_chip_and_handler(virq, &gpio_irqchip,  						 handle_simple_irq); -			set_irq_flags(irq, IRQF_VALID); +			set_irq_flags(virq, IRQF_VALID); +			irq_set_chip_data(virq, this); + +			gpio_irqnbr++;  		}  		/* The toplevel handler handles one bank of GPIOs, except -		 * AT91SAM9263_ID_PIOCDE handles three... PIOC is first in -		 * the list, so we only set up that handler. +		 * on some SoC it can handles up to three... +		 * We only set up the handler for the first of the list.  		 */  		if (prev && prev->next == this)  			continue; -		irq_set_chip_data(id, this); -		irq_set_chained_handler(id, gpio_irq_handler); +		this->pioc_virq = irq_create_mapping(NULL, this->pioc_hwirq); +		irq_set_chip_data(this->pioc_virq, this); +		irq_set_chained_handler(this->pioc_virq, gpio_irq_handler);  	} -	pr_info("AT91: %d gpio irqs in %d banks\n", irq - gpio_to_irq(0), gpio_banks); +	pr_info("AT91: %d gpio irqs in %d banks\n", gpio_irqnbr, gpio_banks);  }  /* gpiolib support */ @@ -593,48 +923,175 @@ static void at91_gpiolib_dbg_show(struct seq_file *s, struct gpio_chip *chip)  					   at91_get_gpio_value(pin) ?  					   "set" : "clear");  			else -				seq_printf(s, "[periph %s]\n", -					   __raw_readl(pio + PIO_ABSR) & -					   mask ? "B" : "A"); +				seq_printf(s, "[periph %c]\n", +					   peripheral_function(pio, mask));  		}  	}  } +static int at91_gpiolib_to_irq(struct gpio_chip *chip, unsigned offset) +{ +	struct at91_gpio_chip *at91_gpio = to_at91_gpio_chip(chip); +	int virq; + +	if (offset < chip->ngpio) +		virq = irq_create_mapping(at91_gpio->domain, offset); +	else +		virq = -ENXIO; + +	dev_dbg(chip->dev, "%s: request IRQ for GPIO %d, return %d\n", +				chip->label, offset + chip->base, virq); +	return virq; +} + +static int __init at91_gpio_setup_clk(int idx) +{ +	struct at91_gpio_chip *at91_gpio = &gpio_chip[idx]; + +	/* retreive PIO controller's clock */ +	at91_gpio->clock = clk_get_sys(NULL, at91_gpio->chip.label); +	if (IS_ERR(at91_gpio->clock)) { +		pr_err("at91_gpio.%d, failed to get clock, ignoring.\n", idx); +		goto err; +	} + +	if (clk_prepare(at91_gpio->clock)) +		goto clk_prep_err; + +	/* enable PIO controller's clock */ +	if (clk_enable(at91_gpio->clock)) { +		pr_err("at91_gpio.%d, failed to enable clock, ignoring.\n", idx); +		goto clk_err; +	} + +	return 0; + +clk_err: +	clk_unprepare(at91_gpio->clock); +clk_prep_err: +	clk_put(at91_gpio->clock); +err: +	return -EINVAL; +} + +#ifdef CONFIG_OF_GPIO +static void __init of_at91_gpio_init_one(struct device_node *np) +{ +	int alias_idx; +	struct at91_gpio_chip *at91_gpio; + +	if (!np) +		return; + +	alias_idx = of_alias_get_id(np, "gpio"); +	if (alias_idx >= MAX_GPIO_BANKS) { +		pr_err("at91_gpio, failed alias idx(%d) > MAX_GPIO_BANKS(%d), ignoring.\n", +						alias_idx, MAX_GPIO_BANKS); +		return; +	} + +	at91_gpio = &gpio_chip[alias_idx]; +	at91_gpio->chip.base = alias_idx * at91_gpio->chip.ngpio; + +	at91_gpio->regbase = of_iomap(np, 0); +	if (!at91_gpio->regbase) { +		pr_err("at91_gpio.%d, failed to map registers, ignoring.\n", +								alias_idx); +		return; +	} + +	/* Get the interrupts property */ +	if (of_property_read_u32(np, "interrupts", &at91_gpio->pioc_hwirq)) { +		pr_err("at91_gpio.%d, failed to get interrupts property, ignoring.\n", +								alias_idx); +		goto ioremap_err; +	} + +	/* Get capabilities from compatibility property */ +	if (of_device_is_compatible(np, "atmel,at91sam9x5-gpio")) +		at91_gpio_caps |= AT91_GPIO_CAP_PIO3; + +	/* Setup clock */ +	if (at91_gpio_setup_clk(alias_idx)) +		goto ioremap_err; + +	at91_gpio->chip.of_node = np; +	gpio_banks = max(gpio_banks, alias_idx + 1); +	at91_gpio->pioc_idx = alias_idx; +	return; + +ioremap_err: +	iounmap(at91_gpio->regbase); +} + +static int __init of_at91_gpio_init(void) +{ +	struct device_node *np = NULL; + +	/* +	 * This isn't ideal, but it gets things hooked up until this +	 * driver is converted into a platform_device +	 */ +	for_each_compatible_node(np, NULL, "atmel,at91rm9200-gpio") +		of_at91_gpio_init_one(np); + +	return gpio_banks > 0 ? 0 : -EINVAL; +} +#else +static int __init of_at91_gpio_init(void) +{ +	return -EINVAL; +} +#endif + +static void __init at91_gpio_init_one(int idx, u32 regbase, int pioc_hwirq) +{ +	struct at91_gpio_chip *at91_gpio = &gpio_chip[idx]; + +	at91_gpio->chip.base = idx * at91_gpio->chip.ngpio; +	at91_gpio->pioc_hwirq = pioc_hwirq; +	at91_gpio->pioc_idx = idx; + +	at91_gpio->regbase = ioremap(regbase, 512); +	if (!at91_gpio->regbase) { +		pr_err("at91_gpio.%d, failed to map registers, ignoring.\n", idx); +		return; +	} + +	if (at91_gpio_setup_clk(idx)) +		goto ioremap_err; + +	gpio_banks = max(gpio_banks, idx + 1); +	return; + +ioremap_err: +	iounmap(at91_gpio->regbase); +} +  /*   * Called from the processor-specific init to enable GPIO pin support.   */  void __init at91_gpio_init(struct at91_gpio_bank *data, int nr_banks)  { -	unsigned		i; +	unsigned i;  	struct at91_gpio_chip *at91_gpio, *last = NULL;  	BUG_ON(nr_banks > MAX_GPIO_BANKS); -	gpio_banks = nr_banks; +	if (of_at91_gpio_init() < 0) { +		/* No GPIO controller found in device tree */ +		for (i = 0; i < nr_banks; i++) +			at91_gpio_init_one(i, data[i].regbase, data[i].id); +	} -	for (i = 0; i < nr_banks; i++) { +	for (i = 0; i < gpio_banks; i++) {  		at91_gpio = &gpio_chip[i]; -		at91_gpio->id = data[i].id; -		at91_gpio->chip.base = i * 32; - -		at91_gpio->regbase = ioremap(data[i].regbase, 512); -		if (!at91_gpio->regbase) { -			pr_err("at91_gpio.%d, failed to map registers, ignoring.\n", i); -			continue; -		} - -		at91_gpio->clock = clk_get_sys(NULL, at91_gpio->chip.label); -		if (!at91_gpio->clock) { -			pr_err("at91_gpio.%d, failed to get clock, ignoring.\n", i); -			continue; -		} - -		/* enable PIO controller's clock */ -		clk_enable(at91_gpio->clock); - -		/* AT91SAM9263_ID_PIOCDE groups PIOC, PIOD, PIOE */ -		if (last && last->id == at91_gpio->id) +		/* +		 * GPIO controller are grouped on some SoC: +		 * PIOC, PIOD and PIOE can share the same IRQ line +		 */ +		if (last && last->pioc_hwirq == at91_gpio->pioc_hwirq)  			last->next = at91_gpio;  		last = at91_gpio; diff --git a/arch/arm/mach-at91/include/mach/at91_matrix.h b/arch/arm/mach-at91/include/mach/at91_matrix.h new file mode 100644 index 00000000000..02fae9de746 --- /dev/null +++ b/arch/arm/mach-at91/include/mach/at91_matrix.h @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2011 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> + * + * Under GPLv2 + */ + +#ifndef __MACH_AT91_MATRIX_H__ +#define __MACH_AT91_MATRIX_H__ + +#ifndef __ASSEMBLY__ +extern void __iomem *at91_matrix_base; + +#define at91_matrix_read(field) \ +	__raw_readl(at91_matrix_base + field) + +#define at91_matrix_write(field, value) \ +	__raw_writel(value, at91_matrix_base + field); + +#else +.extern at91_matrix_base +#endif + +#endif /* __MACH_AT91_MATRIX_H__ */ diff --git a/arch/arm/mach-at91/include/mach/at91_pio.h b/arch/arm/mach-at91/include/mach/at91_pio.h index c6a31bf8a5c..732b11c37f1 100644 --- a/arch/arm/mach-at91/include/mach/at91_pio.h +++ b/arch/arm/mach-at91/include/mach/at91_pio.h @@ -40,10 +40,35 @@  #define PIO_PUER	0x64	/* Pull-up Enable Register */  #define PIO_PUSR	0x68	/* Pull-up Status Register */  #define PIO_ASR		0x70	/* Peripheral A Select Register */ +#define PIO_ABCDSR1	0x70	/* Peripheral ABCD Select Register 1 [some sam9 only] */  #define PIO_BSR		0x74	/* Peripheral B Select Register */ +#define PIO_ABCDSR2	0x74	/* Peripheral ABCD Select Register 2 [some sam9 only] */  #define PIO_ABSR	0x78	/* AB Status Register */ +#define PIO_IFSCDR	0x80	/* Input Filter Slow Clock Disable Register */ +#define PIO_IFSCER	0x84	/* Input Filter Slow Clock Enable Register */ +#define PIO_IFSCSR	0x88	/* Input Filter Slow Clock Status Register */ +#define PIO_SCDR	0x8c	/* Slow Clock Divider Debouncing Register */ +#define		PIO_SCDR_DIV	(0x3fff <<  0)		/* Slow Clock Divider Mask */ +#define PIO_PPDDR	0x90	/* Pad Pull-down Disable Register */ +#define PIO_PPDER	0x94	/* Pad Pull-down Enable Register */ +#define PIO_PPDSR	0x98	/* Pad Pull-down Status Register */  #define PIO_OWER	0xa0	/* Output Write Enable Register */  #define PIO_OWDR	0xa4	/* Output Write Disable Register */  #define PIO_OWSR	0xa8	/* Output Write Status Register */ +#define PIO_AIMER	0xb0	/* Additional Interrupt Modes Enable Register */ +#define PIO_AIMDR	0xb4	/* Additional Interrupt Modes Disable Register */ +#define PIO_AIMMR	0xb8	/* Additional Interrupt Modes Mask Register */ +#define PIO_ESR		0xc0	/* Edge Select Register */ +#define PIO_LSR		0xc4	/* Level Select Register */ +#define PIO_ELSR	0xc8	/* Edge/Level Status Register */ +#define PIO_FELLSR	0xd0	/* Falling Edge/Low Level Select Register */ +#define PIO_REHLSR	0xd4	/* Rising Edge/ High Level Select Register */ +#define PIO_FRLHSR	0xd8	/* Fall/Rise - Low/High Status Register */ +#define PIO_SCHMITT	0x100	/* Schmitt Trigger Register */ + +#define ABCDSR_PERIPH_A	0x0 +#define ABCDSR_PERIPH_B	0x1 +#define ABCDSR_PERIPH_C	0x2 +#define ABCDSR_PERIPH_D	0x3  #endif diff --git a/arch/arm/mach-at91/include/mach/at91_pmc.h b/arch/arm/mach-at91/include/mach/at91_pmc.h index f9fdbbe0c53..36604782a78 100644 --- a/arch/arm/mach-at91/include/mach/at91_pmc.h +++ b/arch/arm/mach-at91/include/mach/at91_pmc.h @@ -16,10 +16,22 @@  #ifndef AT91_PMC_H  #define AT91_PMC_H -#define	AT91_PMC_SCER		(AT91_PMC + 0x00)	/* System Clock Enable Register */ -#define	AT91_PMC_SCDR		(AT91_PMC + 0x04)	/* System Clock Disable Register */ +#ifndef __ASSEMBLY__ +extern void __iomem *at91_pmc_base; -#define	AT91_PMC_SCSR		(AT91_PMC + 0x08)	/* System Clock Status Register */ +#define at91_pmc_read(field) \ +	__raw_readl(at91_pmc_base + field) + +#define at91_pmc_write(field, value) \ +	__raw_writel(value, at91_pmc_base + field) +#else +.extern at91_aic_base +#endif + +#define	AT91_PMC_SCER		0x00			/* System Clock Enable Register */ +#define	AT91_PMC_SCDR		0x04			/* System Clock Disable Register */ + +#define	AT91_PMC_SCSR		0x08			/* System Clock Status Register */  #define		AT91_PMC_PCK		(1 <<  0)		/* Processor Clock */  #define		AT91RM9200_PMC_UDP	(1 <<  1)		/* USB Devcice Port Clock [AT91RM9200 only] */  #define		AT91RM9200_PMC_MCKUDP	(1 <<  2)		/* USB Device Port Master Clock Automatic Disable on Suspend [AT91RM9200 only] */ @@ -34,17 +46,17 @@  #define		AT91_PMC_HCK0		(1 << 16)		/* AHB Clock (USB host) [AT91SAM9261 only] */  #define		AT91_PMC_HCK1		(1 << 17)		/* AHB Clock (LCD) [AT91SAM9261 only] */ -#define	AT91_PMC_PCER		(AT91_PMC + 0x10)	/* Peripheral Clock Enable Register */ -#define	AT91_PMC_PCDR		(AT91_PMC + 0x14)	/* Peripheral Clock Disable Register */ -#define	AT91_PMC_PCSR		(AT91_PMC + 0x18)	/* Peripheral Clock Status Register */ +#define	AT91_PMC_PCER		0x10			/* Peripheral Clock Enable Register */ +#define	AT91_PMC_PCDR		0x14			/* Peripheral Clock Disable Register */ +#define	AT91_PMC_PCSR		0x18			/* Peripheral Clock Status Register */ -#define	AT91_CKGR_UCKR		(AT91_PMC + 0x1C)	/* UTMI Clock Register [some SAM9] */ +#define	AT91_CKGR_UCKR		0x1C			/* UTMI Clock Register [some SAM9] */  #define		AT91_PMC_UPLLEN		(1   << 16)		/* UTMI PLL Enable */  #define		AT91_PMC_UPLLCOUNT	(0xf << 20)		/* UTMI PLL Start-up Time */  #define		AT91_PMC_BIASEN		(1   << 24)		/* UTMI BIAS Enable */  #define		AT91_PMC_BIASCOUNT	(0xf << 28)		/* UTMI BIAS Start-up Time */ -#define	AT91_CKGR_MOR		(AT91_PMC + 0x20)	/* Main Oscillator Register [not on SAM9RL] */ +#define	AT91_CKGR_MOR		0x20			/* Main Oscillator Register [not on SAM9RL] */  #define		AT91_PMC_MOSCEN		(1    <<  0)		/* Main Oscillator Enable */  #define		AT91_PMC_OSCBYPASS	(1    <<  1)		/* Oscillator Bypass */  #define		AT91_PMC_MOSCRCEN	(1    <<  3)		/* Main On-Chip RC Oscillator Enable [some SAM9] */ @@ -53,12 +65,12 @@  #define		AT91_PMC_MOSCSEL	(1    << 24)		/* Main Oscillator Selection [some SAM9] */  #define		AT91_PMC_CFDEN		(1    << 25)		/* Clock Failure Detector Enable [some SAM9] */ -#define	AT91_CKGR_MCFR		(AT91_PMC + 0x24)	/* Main Clock Frequency Register */ +#define	AT91_CKGR_MCFR		0x24			/* Main Clock Frequency Register */  #define		AT91_PMC_MAINF		(0xffff <<  0)		/* Main Clock Frequency */  #define		AT91_PMC_MAINRDY	(1	<< 16)		/* Main Clock Ready */ -#define	AT91_CKGR_PLLAR		(AT91_PMC + 0x28)	/* PLL A Register */ -#define	AT91_CKGR_PLLBR		(AT91_PMC + 0x2c)	/* PLL B Register */ +#define	AT91_CKGR_PLLAR		0x28			/* PLL A Register */ +#define	AT91_CKGR_PLLBR		0x2c			/* PLL B Register */  #define		AT91_PMC_DIV		(0xff  <<  0)		/* Divider */  #define		AT91_PMC_PLLCOUNT	(0x3f  <<  8)		/* PLL Counter */  #define		AT91_PMC_OUT		(3     << 14)		/* PLL Clock Frequency Range */ @@ -69,7 +81,7 @@  #define			AT91_PMC_USBDIV_4		(2 << 28)  #define		AT91_PMC_USB96M		(1     << 28)		/* Divider by 2 Enable (PLLB only) */ -#define	AT91_PMC_MCKR		(AT91_PMC + 0x30)	/* Master Clock Register */ +#define	AT91_PMC_MCKR		0x30			/* Master Clock Register */  #define		AT91_PMC_CSS		(3 <<  0)		/* Master Clock Selection */  #define			AT91_PMC_CSS_SLOW		(0 << 0)  #define			AT91_PMC_CSS_MAIN		(1 << 0) @@ -111,27 +123,27 @@  #define			AT91_PMC_PLLADIV2_OFF		(0 << 12)  #define			AT91_PMC_PLLADIV2_ON		(1 << 12) -#define	AT91_PMC_USB		(AT91_PMC + 0x38)	/* USB Clock Register [some SAM9 only] */ +#define	AT91_PMC_USB		0x38			/* USB Clock Register [some SAM9 only] */  #define		AT91_PMC_USBS		(0x1 <<  0)		/* USB OHCI Input clock selection */  #define			AT91_PMC_USBS_PLLA		(0 << 0)  #define			AT91_PMC_USBS_UPLL		(1 << 0)  #define		AT91_PMC_OHCIUSBDIV	(0xF <<  8)		/* Divider for USB OHCI Clock */ -#define	AT91_PMC_SMD		(AT91_PMC + 0x3c)	/* Soft Modem Clock Register [some SAM9 only] */ +#define	AT91_PMC_SMD		0x3c			/* Soft Modem Clock Register [some SAM9 only] */  #define		AT91_PMC_SMDS		(0x1  <<  0)		/* SMD input clock selection */  #define		AT91_PMC_SMD_DIV	(0x1f <<  8)		/* SMD input clock divider */  #define		AT91_PMC_SMDDIV(n)	(((n) <<  8) & AT91_PMC_SMD_DIV) -#define	AT91_PMC_PCKR(n)	(AT91_PMC + 0x40 + ((n) * 4))	/* Programmable Clock 0-N Registers */ +#define	AT91_PMC_PCKR(n)	(0x40 + ((n) * 4))	/* Programmable Clock 0-N Registers */  #define		AT91_PMC_ALT_PCKR_CSS	(0x7 <<  0)		/* Programmable Clock Source Selection [alternate length] */  #define			AT91_PMC_CSS_MASTER		(4 << 0)	/* [some SAM9 only] */  #define		AT91_PMC_CSSMCK		(0x1 <<  8)		/* CSS or Master Clock Selection */  #define			AT91_PMC_CSSMCK_CSS		(0 << 8)  #define			AT91_PMC_CSSMCK_MCK		(1 << 8) -#define	AT91_PMC_IER		(AT91_PMC + 0x60)	/* Interrupt Enable Register */ -#define	AT91_PMC_IDR		(AT91_PMC + 0x64)	/* Interrupt Disable Register */ -#define	AT91_PMC_SR		(AT91_PMC + 0x68)	/* Status Register */ +#define	AT91_PMC_IER		0x60			/* Interrupt Enable Register */ +#define	AT91_PMC_IDR		0x64			/* Interrupt Disable Register */ +#define	AT91_PMC_SR		0x68			/* Status Register */  #define		AT91_PMC_MOSCS		(1 <<  0)		/* MOSCS Flag */  #define		AT91_PMC_LOCKA		(1 <<  1)		/* PLLA Lock */  #define		AT91_PMC_LOCKB		(1 <<  2)		/* PLLB Lock */ @@ -144,18 +156,18 @@  #define		AT91_PMC_MOSCSELS	(1 << 16)		/* Main Oscillator Selection [some SAM9] */  #define		AT91_PMC_MOSCRCS	(1 << 17)		/* Main On-Chip RC [some SAM9] */  #define		AT91_PMC_CFDEV		(1 << 18)		/* Clock Failure Detector Event [some SAM9] */ -#define	AT91_PMC_IMR		(AT91_PMC + 0x6c)	/* Interrupt Mask Register */ +#define	AT91_PMC_IMR		0x6c			/* Interrupt Mask Register */ -#define AT91_PMC_PROT		(AT91_PMC + 0xe4)	/* Write Protect Mode Register [some SAM9] */ +#define AT91_PMC_PROT		0xe4			/* Write Protect Mode Register [some SAM9] */  #define		AT91_PMC_WPEN		(0x1  <<  0)		/* Write Protect Enable */  #define		AT91_PMC_WPKEY		(0xffffff << 8)		/* Write Protect Key */  #define		AT91_PMC_PROTKEY	(0x504d43 << 8)		/* Activation Code */ -#define AT91_PMC_WPSR		(AT91_PMC + 0xe8)	/* Write Protect Status Register [some SAM9] */ +#define AT91_PMC_WPSR		0xe8			/* Write Protect Status Register [some SAM9] */  #define		AT91_PMC_WPVS		(0x1  <<  0)		/* Write Protect Violation Status */  #define		AT91_PMC_WPVSRC		(0xffff  <<  8)		/* Write Protect Violation Source */ -#define AT91_PMC_PCR		(AT91_PMC + 0x10c)	/* Peripheral Control Register [some SAM9] */ +#define AT91_PMC_PCR		0x10c			/* Peripheral Control Register [some SAM9] */  #define		AT91_PMC_PCR_PID	(0x3f  <<  0)		/* Peripheral ID */  #define		AT91_PMC_PCR_CMD	(0x1  <<  12)		/* Command */  #define		AT91_PMC_PCR_DIV	(0x3  <<  16)		/* Divisor Value */ diff --git a/arch/arm/mach-at91/include/mach/at91_ramc.h b/arch/arm/mach-at91/include/mach/at91_ramc.h new file mode 100644 index 00000000000..d8aeb278614 --- /dev/null +++ b/arch/arm/mach-at91/include/mach/at91_ramc.h @@ -0,0 +1,32 @@ +/* + * Header file for the Atmel RAM Controller + * + * Copyright (C) 2011 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> + * + * Under GPLv2 only + */ + +#ifndef __AT91_RAMC_H__ +#define __AT91_RAMC_H__ + +#ifndef __ASSEMBLY__ +extern void __iomem *at91_ramc_base[]; + +#define at91_ramc_read(id, field) \ +	__raw_readl(at91_ramc_base[id] + field) + +#define at91_ramc_write(id, field, value) \ +	__raw_writel(value, at91_ramc_base[id] + field) +#else +.extern at91_ramc_base +#endif + +#define AT91_MEMCTRL_MC		0 +#define AT91_MEMCTRL_SDRAMC	1 +#define AT91_MEMCTRL_DDRSDR	2 + +#include <mach/at91rm9200_sdramc.h> +#include <mach/at91sam9_ddrsdr.h> +#include <mach/at91sam9_sdramc.h> + +#endif /* __AT91_RAMC_H__ */ diff --git a/arch/arm/mach-at91/include/mach/at91_st.h b/arch/arm/mach-at91/include/mach/at91_st.h index 8847173e410..969aac27109 100644 --- a/arch/arm/mach-at91/include/mach/at91_st.h +++ b/arch/arm/mach-at91/include/mach/at91_st.h @@ -16,34 +16,46 @@  #ifndef AT91_ST_H  #define AT91_ST_H -#define	AT91_ST_CR		(AT91_ST + 0x00)	/* Control Register */ +#ifndef __ASSEMBLY__ +extern void __iomem *at91_st_base; + +#define at91_st_read(field) \ +	__raw_readl(at91_st_base + field) + +#define at91_st_write(field, value) \ +	__raw_writel(value, at91_st_base + field); +#else +.extern at91_st_base +#endif + +#define	AT91_ST_CR		0x00			/* Control Register */  #define 	AT91_ST_WDRST		(1 << 0)		/* Watchdog Timer Restart */ -#define	AT91_ST_PIMR		(AT91_ST + 0x04)	/* Period Interval Mode Register */ +#define	AT91_ST_PIMR		0x04			/* Period Interval Mode Register */  #define		AT91_ST_PIV		(0xffff <<  0)		/* Period Interval Value */ -#define	AT91_ST_WDMR		(AT91_ST + 0x08)	/* Watchdog Mode Register */ +#define	AT91_ST_WDMR		0x08			/* Watchdog Mode Register */  #define		AT91_ST_WDV		(0xffff <<  0)		/* Watchdog Counter Value */  #define		AT91_ST_RSTEN		(1	<< 16)		/* Reset Enable */  #define		AT91_ST_EXTEN		(1	<< 17)		/* External Signal Assertion Enable */ -#define	AT91_ST_RTMR		(AT91_ST + 0x0c)	/* Real-time Mode Register */ +#define	AT91_ST_RTMR		0x0c			/* Real-time Mode Register */  #define		AT91_ST_RTPRES		(0xffff <<  0)		/* Real-time Prescalar Value */ -#define	AT91_ST_SR		(AT91_ST + 0x10)	/* Status Register */ +#define	AT91_ST_SR		0x10			/* Status Register */  #define		AT91_ST_PITS		(1 << 0)		/* Period Interval Timer Status */  #define		AT91_ST_WDOVF		(1 << 1) 		/* Watchdog Overflow */  #define		AT91_ST_RTTINC		(1 << 2) 		/* Real-time Timer Increment */  #define		AT91_ST_ALMS		(1 << 3) 		/* Alarm Status */ -#define	AT91_ST_IER		(AT91_ST + 0x14)	/* Interrupt Enable Register */ -#define	AT91_ST_IDR		(AT91_ST + 0x18)	/* Interrupt Disable Register */ -#define	AT91_ST_IMR		(AT91_ST + 0x1c)	/* Interrupt Mask Register */ +#define	AT91_ST_IER		0x14			/* Interrupt Enable Register */ +#define	AT91_ST_IDR		0x18			/* Interrupt Disable Register */ +#define	AT91_ST_IMR		0x1c			/* Interrupt Mask Register */ -#define	AT91_ST_RTAR		(AT91_ST + 0x20)	/* Real-time Alarm Register */ +#define	AT91_ST_RTAR		0x20			/* Real-time Alarm Register */  #define		AT91_ST_ALMV		(0xfffff << 0)		/* Alarm Value */ -#define	AT91_ST_CRTR		(AT91_ST + 0x24)	/* Current Real-time Register */ +#define	AT91_ST_CRTR		0x24			/* Current Real-time Register */  #define		AT91_ST_CRTV		(0xfffff << 0)		/* Current Real-Time Value */  #endif diff --git a/arch/arm/mach-at91/include/mach/at91rm9200.h b/arch/arm/mach-at91/include/mach/at91rm9200.h index bacb5114181..603e6aac2a4 100644 --- a/arch/arm/mach-at91/include/mach/at91rm9200.h +++ b/arch/arm/mach-at91/include/mach/at91rm9200.h @@ -77,26 +77,22 @@  /* - * System Peripherals (offset from AT91_BASE_SYS) + * System Peripherals   */ -#define AT91_PMC	(0xfffffc00 - AT91_BASE_SYS)	/* Power Management Controller */ -#define AT91_ST		(0xfffffd00 - AT91_BASE_SYS)	/* System Timer */ -#define AT91_MC		(0xffffff00 - AT91_BASE_SYS)	/* Memory Controllers */ -  #define AT91RM9200_BASE_DBGU	AT91_BASE_DBGU0	/* Debug Unit */  #define AT91RM9200_BASE_PIOA	0xfffff400	/* PIO Controller A */  #define AT91RM9200_BASE_PIOB	0xfffff600	/* PIO Controller B */  #define AT91RM9200_BASE_PIOC	0xfffff800	/* PIO Controller C */  #define AT91RM9200_BASE_PIOD	0xfffffa00	/* PIO Controller D */ +#define AT91RM9200_BASE_ST	0xfffffd00	/* System Timer */  #define AT91RM9200_BASE_RTC	0xfffffe00	/* Real-Time Clock */ +#define AT91RM9200_BASE_MC	0xffffff00	/* Memory Controllers */  #define AT91_USART0	AT91RM9200_BASE_US0  #define AT91_USART1	AT91RM9200_BASE_US1  #define AT91_USART2	AT91RM9200_BASE_US2  #define AT91_USART3	AT91RM9200_BASE_US3 -#define AT91_MATRIX	0	/* not supported */ -  /*   * Internal Memory.   */ diff --git a/arch/arm/mach-at91/include/mach/at91rm9200_mc.h b/arch/arm/mach-at91/include/mach/at91rm9200_mc.h index d34e4ed8934..aeaadfb452a 100644 --- a/arch/arm/mach-at91/include/mach/at91rm9200_mc.h +++ b/arch/arm/mach-at91/include/mach/at91rm9200_mc.h @@ -17,10 +17,10 @@  #define AT91RM9200_MC_H  /* Memory Controller */ -#define AT91_MC_RCR		(AT91_MC + 0x00)	/* MC Remap Control Register */ +#define AT91_MC_RCR		0x00			/* MC Remap Control Register */  #define		AT91_MC_RCB		(1 <<  0)		/* Remap Command Bit */ -#define AT91_MC_ASR		(AT91_MC + 0x04)	/* MC Abort Status Register */ +#define AT91_MC_ASR		0x04			/* MC Abort Status Register */  #define		AT91_MC_UNADD		(1 <<  0)		/* Undefined Address Abort Status */  #define		AT91_MC_MISADD		(1 <<  1)		/* Misaligned Address Abort Status */  #define		AT91_MC_ABTSZ		(3 <<  8)		/* Abort Size Status */ @@ -40,16 +40,16 @@  #define		AT91_MC_SVMST2		(1 << 26)		/* Saved UHP Abort Source */  #define		AT91_MC_SVMST3		(1 << 27)		/* Saved EMAC Abort Source */ -#define AT91_MC_AASR		(AT91_MC + 0x08)	/* MC Abort Address Status Register */ +#define AT91_MC_AASR		0x08			/* MC Abort Address Status Register */ -#define AT91_MC_MPR		(AT91_MC + 0x0c)	/* MC Master Priority Register */ +#define AT91_MC_MPR		0x0c			/* MC Master Priority Register */  #define		AT91_MPR_MSTP0		(7 <<  0)		/* ARM920T Priority */  #define		AT91_MPR_MSTP1		(7 <<  4)		/* PDC Priority */  #define		AT91_MPR_MSTP2		(7 <<  8)		/* UHP Priority */  #define		AT91_MPR_MSTP3		(7 << 12)		/* EMAC Priority */  /* External Bus Interface (EBI) registers */ -#define AT91_EBI_CSA		(AT91_MC + 0x60)	/* Chip Select Assignment Register */ +#define AT91_EBI_CSA		0x60			/* Chip Select Assignment Register */  #define		AT91_EBI_CS0A		(1 << 0)		/* Chip Select 0 Assignment */  #define			AT91_EBI_CS0A_SMC		(0 << 0)  #define			AT91_EBI_CS0A_BFC		(1 << 0) @@ -66,7 +66,7 @@  #define		AT91_EBI_DBPUC		(1 << 0)		/* Data Bus Pull-Up Configuration */  /* Static Memory Controller (SMC) registers */ -#define	AT91_SMC_CSR(n)		(AT91_MC + 0x70 + ((n) * 4))/* SMC Chip Select Register */ +#define	AT91_SMC_CSR(n)		(0x70 + ((n) * 4))	/* SMC Chip Select Register */  #define		AT91_SMC_NWS		(0x7f <<  0)		/* Number of Wait States */  #define			AT91_SMC_NWS_(x)	((x) << 0)  #define		AT91_SMC_WSEN		(1    <<  7)		/* Wait State Enable */ @@ -87,52 +87,8 @@  #define		AT91_SMC_RWHOLD		(7 << 28)		/* Read & Write Signal Hold Time */  #define			AT91_SMC_RWHOLD_(x)	((x) << 28) -/* SDRAM Controller registers */ -#define AT91_SDRAMC_MR		(AT91_MC + 0x90)	/* Mode Register */ -#define		AT91_SDRAMC_MODE	(0xf << 0)		/* Command Mode */ -#define			AT91_SDRAMC_MODE_NORMAL		(0 << 0) -#define			AT91_SDRAMC_MODE_NOP		(1 << 0) -#define			AT91_SDRAMC_MODE_PRECHARGE	(2 << 0) -#define			AT91_SDRAMC_MODE_LMR		(3 << 0) -#define			AT91_SDRAMC_MODE_REFRESH	(4 << 0) -#define		AT91_SDRAMC_DBW		(1   << 4)		/* Data Bus Width */ -#define			AT91_SDRAMC_DBW_32	(0 << 4) -#define			AT91_SDRAMC_DBW_16	(1 << 4) - -#define AT91_SDRAMC_TR		(AT91_MC + 0x94)	/* Refresh Timer Register */ -#define		AT91_SDRAMC_COUNT	(0xfff << 0)		/* Refresh Timer Count */ - -#define AT91_SDRAMC_CR		(AT91_MC + 0x98)	/* Configuration Register */ -#define		AT91_SDRAMC_NC		(3   <<  0)		/* Number of Column Bits */ -#define			AT91_SDRAMC_NC_8	(0 << 0) -#define			AT91_SDRAMC_NC_9	(1 << 0) -#define			AT91_SDRAMC_NC_10	(2 << 0) -#define			AT91_SDRAMC_NC_11	(3 << 0) -#define		AT91_SDRAMC_NR		(3   <<  2)		/* Number of Row Bits */ -#define			AT91_SDRAMC_NR_11	(0 << 2) -#define			AT91_SDRAMC_NR_12	(1 << 2) -#define			AT91_SDRAMC_NR_13	(2 << 2) -#define		AT91_SDRAMC_NB		(1   <<  4)		/* Number of Banks */ -#define			AT91_SDRAMC_NB_2	(0 << 4) -#define			AT91_SDRAMC_NB_4	(1 << 4) -#define		AT91_SDRAMC_CAS		(3   <<  5)		/* CAS Latency */ -#define			AT91_SDRAMC_CAS_2	(2 << 5) -#define		AT91_SDRAMC_TWR		(0xf <<  7)		/* Write Recovery Delay */ -#define		AT91_SDRAMC_TRC		(0xf << 11)		/* Row Cycle Delay */ -#define		AT91_SDRAMC_TRP		(0xf << 15)		/* Row Precharge Delay */ -#define		AT91_SDRAMC_TRCD	(0xf << 19)		/* Row to Column Delay */ -#define		AT91_SDRAMC_TRAS	(0xf << 23)		/* Active to Precharge Delay */ -#define		AT91_SDRAMC_TXSR	(0xf << 27)		/* Exit Self Refresh to Active Delay */ - -#define AT91_SDRAMC_SRR		(AT91_MC + 0x9c)	/* Self Refresh Register */ -#define AT91_SDRAMC_LPR		(AT91_MC + 0xa0)	/* Low Power Register */ -#define AT91_SDRAMC_IER		(AT91_MC + 0xa4)	/* Interrupt Enable Register */ -#define AT91_SDRAMC_IDR		(AT91_MC + 0xa8)	/* Interrupt Disable Register */ -#define AT91_SDRAMC_IMR		(AT91_MC + 0xac)	/* Interrupt Mask Register */ -#define AT91_SDRAMC_ISR		(AT91_MC + 0xb0)	/* Interrupt Status Register */ -  /* Burst Flash Controller register */ -#define AT91_BFC_MR		(AT91_MC + 0xc0)	/* Mode Register */ +#define AT91_BFC_MR		0xc0			/* Mode Register */  #define		AT91_BFC_BFCOM		(3   <<  0)		/* Burst Flash Controller Operating Mode */  #define			AT91_BFC_BFCOM_DISABLED	(0 << 0)  #define			AT91_BFC_BFCOM_ASYNC	(1 << 0) diff --git a/arch/arm/mach-at91/include/mach/at91rm9200_sdramc.h b/arch/arm/mach-at91/include/mach/at91rm9200_sdramc.h new file mode 100644 index 00000000000..aa047f458f1 --- /dev/null +++ b/arch/arm/mach-at91/include/mach/at91rm9200_sdramc.h @@ -0,0 +1,63 @@ +/* + * arch/arm/mach-at91/include/mach/at91rm9200_sdramc.h + * + * Copyright (C) 2005 Ivan Kokshaysky + * Copyright (C) SAN People + * + * Memory Controllers (SDRAMC only) - System peripherals registers. + * Based on AT91RM9200 datasheet revision E. + * + * 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. + */ + +#ifndef AT91RM9200_SDRAMC_H +#define AT91RM9200_SDRAMC_H + +/* SDRAM Controller registers */ +#define AT91RM9200_SDRAMC_MR		0x90			/* Mode Register */ +#define		AT91RM9200_SDRAMC_MODE	(0xf << 0)		/* Command Mode */ +#define			AT91RM9200_SDRAMC_MODE_NORMAL		(0 << 0) +#define			AT91RM9200_SDRAMC_MODE_NOP		(1 << 0) +#define			AT91RM9200_SDRAMC_MODE_PRECHARGE	(2 << 0) +#define			AT91RM9200_SDRAMC_MODE_LMR		(3 << 0) +#define			AT91RM9200_SDRAMC_MODE_REFRESH	(4 << 0) +#define		AT91RM9200_SDRAMC_DBW		(1   << 4)		/* Data Bus Width */ +#define			AT91RM9200_SDRAMC_DBW_32	(0 << 4) +#define			AT91RM9200_SDRAMC_DBW_16	(1 << 4) + +#define AT91RM9200_SDRAMC_TR		0x94			/* Refresh Timer Register */ +#define		AT91RM9200_SDRAMC_COUNT	(0xfff << 0)		/* Refresh Timer Count */ + +#define AT91RM9200_SDRAMC_CR		0x98			/* Configuration Register */ +#define		AT91RM9200_SDRAMC_NC		(3   <<  0)		/* Number of Column Bits */ +#define			AT91RM9200_SDRAMC_NC_8	(0 << 0) +#define			AT91RM9200_SDRAMC_NC_9	(1 << 0) +#define			AT91RM9200_SDRAMC_NC_10	(2 << 0) +#define			AT91RM9200_SDRAMC_NC_11	(3 << 0) +#define		AT91RM9200_SDRAMC_NR		(3   <<  2)		/* Number of Row Bits */ +#define			AT91RM9200_SDRAMC_NR_11	(0 << 2) +#define			AT91RM9200_SDRAMC_NR_12	(1 << 2) +#define			AT91RM9200_SDRAMC_NR_13	(2 << 2) +#define		AT91RM9200_SDRAMC_NB		(1   <<  4)		/* Number of Banks */ +#define			AT91RM9200_SDRAMC_NB_2	(0 << 4) +#define			AT91RM9200_SDRAMC_NB_4	(1 << 4) +#define		AT91RM9200_SDRAMC_CAS		(3   <<  5)		/* CAS Latency */ +#define			AT91RM9200_SDRAMC_CAS_2	(2 << 5) +#define		AT91RM9200_SDRAMC_TWR		(0xf <<  7)		/* Write Recovery Delay */ +#define		AT91RM9200_SDRAMC_TRC		(0xf << 11)		/* Row Cycle Delay */ +#define		AT91RM9200_SDRAMC_TRP		(0xf << 15)		/* Row Precharge Delay */ +#define		AT91RM9200_SDRAMC_TRCD	(0xf << 19)		/* Row to Column Delay */ +#define		AT91RM9200_SDRAMC_TRAS	(0xf << 23)		/* Active to Precharge Delay */ +#define		AT91RM9200_SDRAMC_TXSR	(0xf << 27)		/* Exit Self Refresh to Active Delay */ + +#define AT91RM9200_SDRAMC_SRR		0x9c			/* Self Refresh Register */ +#define AT91RM9200_SDRAMC_LPR		0xa0			/* Low Power Register */ +#define AT91RM9200_SDRAMC_IER		0xa4			/* Interrupt Enable Register */ +#define AT91RM9200_SDRAMC_IDR		0xa8			/* Interrupt Disable Register */ +#define AT91RM9200_SDRAMC_IMR		0xac			/* Interrupt Mask Register */ +#define AT91RM9200_SDRAMC_ISR		0xb0			/* Interrupt Status Register */ + +#endif diff --git a/arch/arm/mach-at91/include/mach/at91sam9260.h b/arch/arm/mach-at91/include/mach/at91sam9260.h index fa5ca278ade..08ae9afd00f 100644 --- a/arch/arm/mach-at91/include/mach/at91sam9260.h +++ b/arch/arm/mach-at91/include/mach/at91sam9260.h @@ -78,15 +78,12 @@  #define AT91SAM9260_BASE_ADC		0xfffe0000  /* - * System Peripherals (offset from AT91_BASE_SYS) + * System Peripherals   */ -#define AT91_SDRAMC0	(0xffffea00 - AT91_BASE_SYS) -#define AT91_MATRIX	(0xffffee00 - AT91_BASE_SYS) -#define AT91_PMC	(0xfffffc00 - AT91_BASE_SYS) -#define AT91_GPBR	(0xfffffd50 - AT91_BASE_SYS) -  #define AT91SAM9260_BASE_ECC	0xffffe800 +#define AT91SAM9260_BASE_SDRAMC	0xffffea00  #define AT91SAM9260_BASE_SMC	0xffffec00 +#define AT91SAM9260_BASE_MATRIX	0xffffee00  #define AT91SAM9260_BASE_DBGU	AT91_BASE_DBGU0  #define AT91SAM9260_BASE_PIOA	0xfffff400  #define AT91SAM9260_BASE_PIOB	0xfffff600 @@ -96,6 +93,7 @@  #define AT91SAM9260_BASE_RTT	0xfffffd20  #define AT91SAM9260_BASE_PIT	0xfffffd30  #define AT91SAM9260_BASE_WDT	0xfffffd40 +#define AT91SAM9260_BASE_GPBR	0xfffffd50  #define AT91_USART0	AT91SAM9260_BASE_US0  #define AT91_USART1	AT91SAM9260_BASE_US1 @@ -115,6 +113,8 @@  #define AT91SAM9260_SRAM0_SIZE	SZ_4K		/* Internal SRAM 0 size (4Kb) */  #define AT91SAM9260_SRAM1_BASE	0x00300000	/* Internal SRAM 1 base address */  #define AT91SAM9260_SRAM1_SIZE	SZ_4K		/* Internal SRAM 1 size (4Kb) */ +#define AT91SAM9260_SRAM_BASE	0x002FF000	/* Internal SRAM base address */ +#define AT91SAM9260_SRAM_SIZE	SZ_8K		/* Internal SRAM size (8Kb) */  #define AT91SAM9260_UHP_BASE	0x00500000	/* USB Host controller */ @@ -128,6 +128,8 @@  #define AT91SAM9G20_SRAM0_SIZE	SZ_16K		/* Internal SRAM 0 size (16Kb) */  #define AT91SAM9G20_SRAM1_BASE	0x00300000	/* Internal SRAM 1 base address */  #define AT91SAM9G20_SRAM1_SIZE	SZ_16K		/* Internal SRAM 1 size (16Kb) */ +#define AT91SAM9G20_SRAM_BASE	0x002FC000	/* Internal SRAM base address */ +#define AT91SAM9G20_SRAM_SIZE	SZ_32K		/* Internal SRAM size (32Kb) */  #define AT91SAM9G20_UHP_BASE	0x00500000	/* USB Host controller */ diff --git a/arch/arm/mach-at91/include/mach/at91sam9260_matrix.h b/arch/arm/mach-at91/include/mach/at91sam9260_matrix.h index 020f02ed921..f459df42062 100644 --- a/arch/arm/mach-at91/include/mach/at91sam9260_matrix.h +++ b/arch/arm/mach-at91/include/mach/at91sam9260_matrix.h @@ -15,12 +15,12 @@  #ifndef AT91SAM9260_MATRIX_H  #define AT91SAM9260_MATRIX_H -#define AT91_MATRIX_MCFG0	(AT91_MATRIX + 0x00)	/* Master Configuration Register 0 */ -#define AT91_MATRIX_MCFG1	(AT91_MATRIX + 0x04)	/* Master Configuration Register 1 */ -#define AT91_MATRIX_MCFG2	(AT91_MATRIX + 0x08)	/* Master Configuration Register 2 */ -#define AT91_MATRIX_MCFG3	(AT91_MATRIX + 0x0C)	/* Master Configuration Register 3 */ -#define AT91_MATRIX_MCFG4	(AT91_MATRIX + 0x10)	/* Master Configuration Register 4 */ -#define AT91_MATRIX_MCFG5	(AT91_MATRIX + 0x14)	/* Master Configuration Register 5 */ +#define AT91_MATRIX_MCFG0	0x00			/* Master Configuration Register 0 */ +#define AT91_MATRIX_MCFG1	0x04			/* Master Configuration Register 1 */ +#define AT91_MATRIX_MCFG2	0x08			/* Master Configuration Register 2 */ +#define AT91_MATRIX_MCFG3	0x0C			/* Master Configuration Register 3 */ +#define AT91_MATRIX_MCFG4	0x10			/* Master Configuration Register 4 */ +#define AT91_MATRIX_MCFG5	0x14			/* Master Configuration Register 5 */  #define		AT91_MATRIX_ULBT		(7 << 0)	/* Undefined Length Burst Type */  #define			AT91_MATRIX_ULBT_INFINITE	(0 << 0)  #define			AT91_MATRIX_ULBT_SINGLE		(1 << 0) @@ -28,11 +28,11 @@  #define			AT91_MATRIX_ULBT_EIGHT		(3 << 0)  #define			AT91_MATRIX_ULBT_SIXTEEN	(4 << 0) -#define AT91_MATRIX_SCFG0	(AT91_MATRIX + 0x40)	/* Slave Configuration Register 0 */ -#define AT91_MATRIX_SCFG1	(AT91_MATRIX + 0x44)	/* Slave Configuration Register 1 */ -#define AT91_MATRIX_SCFG2	(AT91_MATRIX + 0x48)	/* Slave Configuration Register 2 */ -#define AT91_MATRIX_SCFG3	(AT91_MATRIX + 0x4C)	/* Slave Configuration Register 3 */ -#define AT91_MATRIX_SCFG4	(AT91_MATRIX + 0x50)	/* Slave Configuration Register 4 */ +#define AT91_MATRIX_SCFG0	0x40			/* Slave Configuration Register 0 */ +#define AT91_MATRIX_SCFG1	0x44			/* Slave Configuration Register 1 */ +#define AT91_MATRIX_SCFG2	0x48			/* Slave Configuration Register 2 */ +#define AT91_MATRIX_SCFG3	0x4C			/* Slave Configuration Register 3 */ +#define AT91_MATRIX_SCFG4	0x50			/* Slave Configuration Register 4 */  #define		AT91_MATRIX_SLOT_CYCLE		(0xff <<  0)	/* Maximum Number of Allowed Cycles for a Burst */  #define		AT91_MATRIX_DEFMSTR_TYPE	(3    << 16)	/* Default Master Type */  #define			AT91_MATRIX_DEFMSTR_TYPE_NONE	(0 << 16) @@ -43,11 +43,11 @@  #define			AT91_MATRIX_ARBT_ROUND_ROBIN	(0 << 24)  #define			AT91_MATRIX_ARBT_FIXED_PRIORITY	(1 << 24) -#define AT91_MATRIX_PRAS0	(AT91_MATRIX + 0x80)	/* Priority Register A for Slave 0 */ -#define AT91_MATRIX_PRAS1	(AT91_MATRIX + 0x88)	/* Priority Register A for Slave 1 */ -#define AT91_MATRIX_PRAS2	(AT91_MATRIX + 0x90)	/* Priority Register A for Slave 2 */ -#define AT91_MATRIX_PRAS3	(AT91_MATRIX + 0x98)	/* Priority Register A for Slave 3 */ -#define AT91_MATRIX_PRAS4	(AT91_MATRIX + 0xA0)	/* Priority Register A for Slave 4 */ +#define AT91_MATRIX_PRAS0	0x80			/* Priority Register A for Slave 0 */ +#define AT91_MATRIX_PRAS1	0x88			/* Priority Register A for Slave 1 */ +#define AT91_MATRIX_PRAS2	0x90			/* Priority Register A for Slave 2 */ +#define AT91_MATRIX_PRAS3	0x98			/* Priority Register A for Slave 3 */ +#define AT91_MATRIX_PRAS4	0xA0			/* Priority Register A for Slave 4 */  #define		AT91_MATRIX_M0PR		(3 << 0)	/* Master 0 Priority */  #define		AT91_MATRIX_M1PR		(3 << 4)	/* Master 1 Priority */  #define		AT91_MATRIX_M2PR		(3 << 8)	/* Master 2 Priority */ @@ -55,11 +55,11 @@  #define		AT91_MATRIX_M4PR		(3 << 16)	/* Master 4 Priority */  #define		AT91_MATRIX_M5PR		(3 << 20)	/* Master 5 Priority */ -#define AT91_MATRIX_MRCR	(AT91_MATRIX + 0x100)	/* Master Remap Control Register */ +#define AT91_MATRIX_MRCR	0x100			/* Master Remap Control Register */  #define		AT91_MATRIX_RCB0		(1 << 0)	/* Remap Command for AHB Master 0 (ARM926EJ-S Instruction Master) */  #define		AT91_MATRIX_RCB1		(1 << 1)	/* Remap Command for AHB Master 1 (ARM926EJ-S Data Master) */ -#define AT91_MATRIX_EBICSA	(AT91_MATRIX + 0x11C)	/* EBI Chip Select Assignment Register */ +#define AT91_MATRIX_EBICSA	0x11C			/* EBI Chip Select Assignment Register */  #define		AT91_MATRIX_CS1A		(1 << 1)	/* Chip Select 1 Assignment */  #define			AT91_MATRIX_CS1A_SMC		(0 << 1)  #define			AT91_MATRIX_CS1A_SDRAMC		(1 << 1) diff --git a/arch/arm/mach-at91/include/mach/at91sam9261.h b/arch/arm/mach-at91/include/mach/at91sam9261.h index 7cde2d36570..44fbdc12ee6 100644 --- a/arch/arm/mach-at91/include/mach/at91sam9261.h +++ b/arch/arm/mach-at91/include/mach/at91sam9261.h @@ -63,14 +63,11 @@  /* - * System Peripherals (offset from AT91_BASE_SYS) + * System Peripherals   */ -#define AT91_SDRAMC0	(0xffffea00 - AT91_BASE_SYS) -#define AT91_MATRIX	(0xffffee00 - AT91_BASE_SYS) -#define AT91_PMC	(0xfffffc00 - AT91_BASE_SYS) -#define AT91_GPBR	(0xfffffd50 - AT91_BASE_SYS) -  #define AT91SAM9261_BASE_SMC	0xffffec00 +#define AT91SAM9261_BASE_MATRIX	0xffffee00 +#define AT91SAM9261_BASE_SDRAMC	0xffffea00  #define AT91SAM9261_BASE_DBGU	AT91_BASE_DBGU0  #define AT91SAM9261_BASE_PIOA	0xfffff400  #define AT91SAM9261_BASE_PIOB	0xfffff600 @@ -80,6 +77,7 @@  #define AT91SAM9261_BASE_RTT	0xfffffd20  #define AT91SAM9261_BASE_PIT	0xfffffd30  #define AT91SAM9261_BASE_WDT	0xfffffd40 +#define AT91SAM9261_BASE_GPBR	0xfffffd50  #define AT91_USART0	AT91SAM9261_BASE_US0  #define AT91_USART1	AT91SAM9261_BASE_US1 diff --git a/arch/arm/mach-at91/include/mach/at91sam9261_matrix.h b/arch/arm/mach-at91/include/mach/at91sam9261_matrix.h index 69c6501915d..a50cdf8b8ca 100644 --- a/arch/arm/mach-at91/include/mach/at91sam9261_matrix.h +++ b/arch/arm/mach-at91/include/mach/at91sam9261_matrix.h @@ -15,15 +15,15 @@  #ifndef AT91SAM9261_MATRIX_H  #define AT91SAM9261_MATRIX_H -#define AT91_MATRIX_MCFG	(AT91_MATRIX + 0x00)	/* Master Configuration Register */ +#define AT91_MATRIX_MCFG	0x00			/* Master Configuration Register */  #define		AT91_MATRIX_RCB0	(1 << 0)		/* Remap Command for AHB Master 0 (ARM926EJ-S Instruction Master) */  #define		AT91_MATRIX_RCB1	(1 << 1)		/* Remap Command for AHB Master 1 (ARM926EJ-S Data Master) */ -#define AT91_MATRIX_SCFG0	(AT91_MATRIX + 0x04)	/* Slave Configuration Register 0 */ -#define AT91_MATRIX_SCFG1	(AT91_MATRIX + 0x08)	/* Slave Configuration Register 1 */ -#define AT91_MATRIX_SCFG2	(AT91_MATRIX + 0x0C)	/* Slave Configuration Register 2 */ -#define AT91_MATRIX_SCFG3	(AT91_MATRIX + 0x10)	/* Slave Configuration Register 3 */ -#define AT91_MATRIX_SCFG4	(AT91_MATRIX + 0x14)	/* Slave Configuration Register 4 */ +#define AT91_MATRIX_SCFG0	0x04			/* Slave Configuration Register 0 */ +#define AT91_MATRIX_SCFG1	0x08			/* Slave Configuration Register 1 */ +#define AT91_MATRIX_SCFG2	0x0C			/* Slave Configuration Register 2 */ +#define AT91_MATRIX_SCFG3	0x10			/* Slave Configuration Register 3 */ +#define AT91_MATRIX_SCFG4	0x14			/* Slave Configuration Register 4 */  #define		AT91_MATRIX_SLOT_CYCLE		(0xff << 0)	/* Maximum Number of Allowed Cycles for a Burst */  #define		AT91_MATRIX_DEFMSTR_TYPE	(3    << 16)	/* Default Master Type */  #define			AT91_MATRIX_DEFMSTR_TYPE_NONE	(0 << 16) @@ -31,7 +31,7 @@  #define			AT91_MATRIX_DEFMSTR_TYPE_FIXED	(2 << 16)  #define		AT91_MATRIX_FIXED_DEFMSTR	(7    << 18)	/* Fixed Index of Default Master */ -#define AT91_MATRIX_TCR		(AT91_MATRIX + 0x24)	/* TCM Configuration Register */ +#define AT91_MATRIX_TCR		0x24			/* TCM Configuration Register */  #define		AT91_MATRIX_ITCM_SIZE		(0xf << 0)	/* Size of ITCM enabled memory block */  #define			AT91_MATRIX_ITCM_0		(0 << 0)  #define			AT91_MATRIX_ITCM_16		(5 << 0) @@ -43,7 +43,7 @@  #define			AT91_MATRIX_DTCM_32		(6 << 4)  #define			AT91_MATRIX_DTCM_64		(7 << 4) -#define AT91_MATRIX_EBICSA	(AT91_MATRIX + 0x30)	/* EBI Chip Select Assignment Register */ +#define AT91_MATRIX_EBICSA	0x30			/* EBI Chip Select Assignment Register */  #define		AT91_MATRIX_CS1A		(1 << 1)	/* Chip Select 1 Assignment */  #define			AT91_MATRIX_CS1A_SMC		(0 << 1)  #define			AT91_MATRIX_CS1A_SDRAMC		(1 << 1) @@ -58,7 +58,7 @@  #define			AT91_MATRIX_CS5A_SMC_CF2	(1 << 5)  #define		AT91_MATRIX_DBPUC		(1 << 8)	/* Data Bus Pull-up Configuration */ -#define AT91_MATRIX_USBPUCR	(AT91_MATRIX + 0x34)	/* USB Pad Pull-Up Control Register */ +#define AT91_MATRIX_USBPUCR	0x34			/* USB Pad Pull-Up Control Register */  #define		AT91_MATRIX_USBPUCR_PUON	(1 << 30)	/* USB Device PAD Pull-up Enable */  #endif diff --git a/arch/arm/mach-at91/include/mach/at91sam9263.h b/arch/arm/mach-at91/include/mach/at91sam9263.h index 5949abda962..d96cbb2e03c 100644 --- a/arch/arm/mach-at91/include/mach/at91sam9263.h +++ b/arch/arm/mach-at91/include/mach/at91sam9263.h @@ -72,18 +72,15 @@  #define AT91SAM9263_BASE_2DGE		0xfffc8000  /* - * System Peripherals (offset from AT91_BASE_SYS) + * System Peripherals   */ -#define AT91_SDRAMC0	(0xffffe200 - AT91_BASE_SYS) -#define AT91_SDRAMC1	(0xffffe800 - AT91_BASE_SYS) -#define AT91_MATRIX	(0xffffec00 - AT91_BASE_SYS) -#define AT91_PMC	(0xfffffc00 - AT91_BASE_SYS) -#define AT91_GPBR	(0xfffffd60 - AT91_BASE_SYS) -  #define AT91SAM9263_BASE_ECC0	0xffffe000 +#define AT91SAM9263_BASE_SDRAMC0 0xffffe200  #define AT91SAM9263_BASE_SMC0	0xffffe400  #define AT91SAM9263_BASE_ECC1	0xffffe600 +#define AT91SAM9263_BASE_SDRAMC1 0xffffe800  #define AT91SAM9263_BASE_SMC1	0xffffea00 +#define AT91SAM9263_BASE_MATRIX	0xffffec00  #define AT91SAM9263_BASE_DBGU	AT91_BASE_DBGU1  #define AT91SAM9263_BASE_PIOA	0xfffff200  #define AT91SAM9263_BASE_PIOB	0xfffff400 @@ -96,6 +93,7 @@  #define AT91SAM9263_BASE_PIT	0xfffffd30  #define AT91SAM9263_BASE_WDT	0xfffffd40  #define AT91SAM9263_BASE_RTT1	0xfffffd50 +#define AT91SAM9263_BASE_GPBR	0xfffffd60  #define AT91_USART0	AT91SAM9263_BASE_US0  #define AT91_USART1	AT91SAM9263_BASE_US1 diff --git a/arch/arm/mach-at91/include/mach/at91sam9263_matrix.h b/arch/arm/mach-at91/include/mach/at91sam9263_matrix.h index 9b3efd3eb2f..ebb5fdb565e 100644 --- a/arch/arm/mach-at91/include/mach/at91sam9263_matrix.h +++ b/arch/arm/mach-at91/include/mach/at91sam9263_matrix.h @@ -15,15 +15,15 @@  #ifndef AT91SAM9263_MATRIX_H  #define AT91SAM9263_MATRIX_H -#define AT91_MATRIX_MCFG0	(AT91_MATRIX + 0x00)	/* Master Configuration Register 0 */ -#define AT91_MATRIX_MCFG1	(AT91_MATRIX + 0x04)	/* Master Configuration Register 1 */ -#define AT91_MATRIX_MCFG2	(AT91_MATRIX + 0x08)	/* Master Configuration Register 2 */ -#define AT91_MATRIX_MCFG3	(AT91_MATRIX + 0x0C)	/* Master Configuration Register 3 */ -#define AT91_MATRIX_MCFG4	(AT91_MATRIX + 0x10)	/* Master Configuration Register 4 */ -#define AT91_MATRIX_MCFG5	(AT91_MATRIX + 0x14)	/* Master Configuration Register 5 */ -#define AT91_MATRIX_MCFG6	(AT91_MATRIX + 0x18)	/* Master Configuration Register 6 */ -#define AT91_MATRIX_MCFG7	(AT91_MATRIX + 0x1C)	/* Master Configuration Register 7 */ -#define AT91_MATRIX_MCFG8	(AT91_MATRIX + 0x20)	/* Master Configuration Register 8 */ +#define AT91_MATRIX_MCFG0	0x00			/* Master Configuration Register 0 */ +#define AT91_MATRIX_MCFG1	0x04			/* Master Configuration Register 1 */ +#define AT91_MATRIX_MCFG2	0x08			/* Master Configuration Register 2 */ +#define AT91_MATRIX_MCFG3	0x0C			/* Master Configuration Register 3 */ +#define AT91_MATRIX_MCFG4	0x10			/* Master Configuration Register 4 */ +#define AT91_MATRIX_MCFG5	0x14			/* Master Configuration Register 5 */ +#define AT91_MATRIX_MCFG6	0x18			/* Master Configuration Register 6 */ +#define AT91_MATRIX_MCFG7	0x1C			/* Master Configuration Register 7 */ +#define AT91_MATRIX_MCFG8	0x20			/* Master Configuration Register 8 */  #define		AT91_MATRIX_ULBT	(7 << 0)	/* Undefined Length Burst Type */  #define			AT91_MATRIX_ULBT_INFINITE	(0 << 0)  #define			AT91_MATRIX_ULBT_SINGLE		(1 << 0) @@ -31,14 +31,14 @@  #define			AT91_MATRIX_ULBT_EIGHT		(3 << 0)  #define			AT91_MATRIX_ULBT_SIXTEEN	(4 << 0) -#define AT91_MATRIX_SCFG0	(AT91_MATRIX + 0x40)	/* Slave Configuration Register 0 */ -#define AT91_MATRIX_SCFG1	(AT91_MATRIX + 0x44)	/* Slave Configuration Register 1 */ -#define AT91_MATRIX_SCFG2	(AT91_MATRIX + 0x48)	/* Slave Configuration Register 2 */ -#define AT91_MATRIX_SCFG3	(AT91_MATRIX + 0x4C)	/* Slave Configuration Register 3 */ -#define AT91_MATRIX_SCFG4	(AT91_MATRIX + 0x50)	/* Slave Configuration Register 4 */ -#define AT91_MATRIX_SCFG5	(AT91_MATRIX + 0x54)	/* Slave Configuration Register 5 */ -#define AT91_MATRIX_SCFG6	(AT91_MATRIX + 0x58)	/* Slave Configuration Register 6 */ -#define AT91_MATRIX_SCFG7	(AT91_MATRIX + 0x5C)	/* Slave Configuration Register 7 */ +#define AT91_MATRIX_SCFG0	0x40			/* Slave Configuration Register 0 */ +#define AT91_MATRIX_SCFG1	0x44			/* Slave Configuration Register 1 */ +#define AT91_MATRIX_SCFG2	0x48			/* Slave Configuration Register 2 */ +#define AT91_MATRIX_SCFG3	0x4C			/* Slave Configuration Register 3 */ +#define AT91_MATRIX_SCFG4	0x50			/* Slave Configuration Register 4 */ +#define AT91_MATRIX_SCFG5	0x54			/* Slave Configuration Register 5 */ +#define AT91_MATRIX_SCFG6	0x58			/* Slave Configuration Register 6 */ +#define AT91_MATRIX_SCFG7	0x5C			/* Slave Configuration Register 7 */  #define		AT91_MATRIX_SLOT_CYCLE		(0xff << 0)	/* Maximum Number of Allowed Cycles for a Burst */  #define		AT91_MATRIX_DEFMSTR_TYPE	(3    << 16)	/* Default Master Type */  #define			AT91_MATRIX_DEFMSTR_TYPE_NONE	(0 << 16) @@ -49,22 +49,22 @@  #define			AT91_MATRIX_ARBT_ROUND_ROBIN	(0 << 24)  #define			AT91_MATRIX_ARBT_FIXED_PRIORITY	(1 << 24) -#define AT91_MATRIX_PRAS0	(AT91_MATRIX + 0x80)	/* Priority Register A for Slave 0 */ -#define AT91_MATRIX_PRBS0	(AT91_MATRIX + 0x84)	/* Priority Register B for Slave 0 */ -#define AT91_MATRIX_PRAS1	(AT91_MATRIX + 0x88)	/* Priority Register A for Slave 1 */ -#define AT91_MATRIX_PRBS1	(AT91_MATRIX + 0x8C)	/* Priority Register B for Slave 1 */ -#define AT91_MATRIX_PRAS2	(AT91_MATRIX + 0x90)	/* Priority Register A for Slave 2 */ -#define AT91_MATRIX_PRBS2	(AT91_MATRIX + 0x94)	/* Priority Register B for Slave 2 */ -#define AT91_MATRIX_PRAS3	(AT91_MATRIX + 0x98)	/* Priority Register A for Slave 3 */ -#define AT91_MATRIX_PRBS3	(AT91_MATRIX + 0x9C)	/* Priority Register B for Slave 3 */ -#define AT91_MATRIX_PRAS4	(AT91_MATRIX + 0xA0)	/* Priority Register A for Slave 4 */ -#define AT91_MATRIX_PRBS4	(AT91_MATRIX + 0xA4)	/* Priority Register B for Slave 4 */ -#define AT91_MATRIX_PRAS5	(AT91_MATRIX + 0xA8)	/* Priority Register A for Slave 5 */ -#define AT91_MATRIX_PRBS5	(AT91_MATRIX + 0xAC)	/* Priority Register B for Slave 5 */ -#define AT91_MATRIX_PRAS6	(AT91_MATRIX + 0xB0)	/* Priority Register A for Slave 6 */ -#define AT91_MATRIX_PRBS6	(AT91_MATRIX + 0xB4)	/* Priority Register B for Slave 6 */ -#define AT91_MATRIX_PRAS7	(AT91_MATRIX + 0xB8)	/* Priority Register A for Slave 7 */ -#define AT91_MATRIX_PRBS7	(AT91_MATRIX + 0xBC)	/* Priority Register B for Slave 7 */ +#define AT91_MATRIX_PRAS0	0x80			/* Priority Register A for Slave 0 */ +#define AT91_MATRIX_PRBS0	0x84			/* Priority Register B for Slave 0 */ +#define AT91_MATRIX_PRAS1	0x88			/* Priority Register A for Slave 1 */ +#define AT91_MATRIX_PRBS1	0x8C			/* Priority Register B for Slave 1 */ +#define AT91_MATRIX_PRAS2	0x90			/* Priority Register A for Slave 2 */ +#define AT91_MATRIX_PRBS2	0x94			/* Priority Register B for Slave 2 */ +#define AT91_MATRIX_PRAS3	0x98			/* Priority Register A for Slave 3 */ +#define AT91_MATRIX_PRBS3	0x9C			/* Priority Register B for Slave 3 */ +#define AT91_MATRIX_PRAS4	0xA0			/* Priority Register A for Slave 4 */ +#define AT91_MATRIX_PRBS4	0xA4			/* Priority Register B for Slave 4 */ +#define AT91_MATRIX_PRAS5	0xA8			/* Priority Register A for Slave 5 */ +#define AT91_MATRIX_PRBS5	0xAC			/* Priority Register B for Slave 5 */ +#define AT91_MATRIX_PRAS6	0xB0			/* Priority Register A for Slave 6 */ +#define AT91_MATRIX_PRBS6	0xB4			/* Priority Register B for Slave 6 */ +#define AT91_MATRIX_PRAS7	0xB8			/* Priority Register A for Slave 7 */ +#define AT91_MATRIX_PRBS7	0xBC			/* Priority Register B for Slave 7 */  #define		AT91_MATRIX_M0PR		(3 << 0)	/* Master 0 Priority */  #define		AT91_MATRIX_M1PR		(3 << 4)	/* Master 1 Priority */  #define		AT91_MATRIX_M2PR		(3 << 8)	/* Master 2 Priority */ @@ -75,7 +75,7 @@  #define		AT91_MATRIX_M7PR		(3 << 28)	/* Master 7 Priority */  #define		AT91_MATRIX_M8PR		(3 << 0)	/* Master 8 Priority (in Register B) */ -#define AT91_MATRIX_MRCR	(AT91_MATRIX + 0x100)	/* Master Remap Control Register */ +#define AT91_MATRIX_MRCR	0x100			/* Master Remap Control Register */  #define		AT91_MATRIX_RCB0		(1 << 0)	/* Remap Command for AHB Master 0 (ARM926EJ-S Instruction Master) */  #define		AT91_MATRIX_RCB1		(1 << 1)	/* Remap Command for AHB Master 1 (ARM926EJ-S Data Master) */  #define		AT91_MATRIX_RCB2		(1 << 2) @@ -86,7 +86,7 @@  #define		AT91_MATRIX_RCB7		(1 << 7)  #define		AT91_MATRIX_RCB8		(1 << 8) -#define AT91_MATRIX_TCMR	(AT91_MATRIX + 0x114)	/* TCM Configuration Register */ +#define AT91_MATRIX_TCMR	0x114			/* TCM Configuration Register */  #define		AT91_MATRIX_ITCM_SIZE		(0xf << 0)	/* Size of ITCM enabled memory block */  #define			AT91_MATRIX_ITCM_0		(0 << 0)  #define			AT91_MATRIX_ITCM_16		(5 << 0) @@ -96,7 +96,7 @@  #define			AT91_MATRIX_DTCM_16		(5 << 4)  #define			AT91_MATRIX_DTCM_32		(6 << 4) -#define AT91_MATRIX_EBI0CSA	(AT91_MATRIX + 0x120)	/* EBI0 Chip Select Assignment Register */ +#define AT91_MATRIX_EBI0CSA	0x120			/* EBI0 Chip Select Assignment Register */  #define		AT91_MATRIX_EBI0_CS1A		(1 << 1)	/* Chip Select 1 Assignment */  #define			AT91_MATRIX_EBI0_CS1A_SMC		(0 << 1)  #define			AT91_MATRIX_EBI0_CS1A_SDRAMC		(1 << 1) @@ -114,7 +114,7 @@  #define			AT91_MATRIX_EBI0_VDDIOMSEL_1_8V		(0 << 16)  #define			AT91_MATRIX_EBI0_VDDIOMSEL_3_3V		(1 << 16) -#define AT91_MATRIX_EBI1CSA	(AT91_MATRIX + 0x124)	/* EBI1 Chip Select Assignment Register */ +#define AT91_MATRIX_EBI1CSA	0x124			/* EBI1 Chip Select Assignment Register */  #define		AT91_MATRIX_EBI1_CS1A		(1 << 1)	/* Chip Select 1 Assignment */  #define			AT91_MATRIX_EBI1_CS1A_SMC		(0 << 1)  #define			AT91_MATRIX_EBI1_CS1A_SDRAMC		(1 << 1) diff --git a/arch/arm/mach-at91/include/mach/at91sam9_ddrsdr.h b/arch/arm/mach-at91/include/mach/at91sam9_ddrsdr.h index 5d4a9f84658..0210797abf2 100644 --- a/arch/arm/mach-at91/include/mach/at91sam9_ddrsdr.h +++ b/arch/arm/mach-at91/include/mach/at91sam9_ddrsdr.h @@ -121,10 +121,4 @@  #define		AT91_DDRSDRC_WPVS	(1 << 0)		/* Write protect violation status */  #define		AT91_DDRSDRC_WPVSRC	(0xffff << 8)		/* Write protect violation source */ -/* Register access macros */ -#define at91_ramc_read(num, reg) \ -	at91_sys_read(AT91_DDRSDRC##num + reg) -#define at91_ramc_write(num, reg, value) \ -	at91_sys_write(AT91_DDRSDRC##num + reg, value) -  #endif diff --git a/arch/arm/mach-at91/include/mach/at91sam9_sdramc.h b/arch/arm/mach-at91/include/mach/at91sam9_sdramc.h index 100f5a59292..3d085a9a745 100644 --- a/arch/arm/mach-at91/include/mach/at91sam9_sdramc.h +++ b/arch/arm/mach-at91/include/mach/at91sam9_sdramc.h @@ -82,10 +82,4 @@  #define			AT91_SDRAMC_MD_SDRAM		0  #define			AT91_SDRAMC_MD_LOW_POWER_SDRAM	1 -/* Register access macros */ -#define at91_ramc_read(num, reg) \ -	at91_sys_read(AT91_SDRAMC##num + reg) -#define at91_ramc_write(num, reg, value) \ -	at91_sys_write(AT91_SDRAMC##num + reg, value) -  #endif diff --git a/arch/arm/mach-at91/include/mach/at91sam9g45.h b/arch/arm/mach-at91/include/mach/at91sam9g45.h index dd9c95ea086..d052abcff85 100644 --- a/arch/arm/mach-at91/include/mach/at91sam9g45.h +++ b/arch/arm/mach-at91/include/mach/at91sam9g45.h @@ -84,17 +84,14 @@  #define AT91SAM9G45_BASE_TC5		0xfffd4080  /* - * System Peripherals (offset from AT91_BASE_SYS) + * System Peripherals   */ -#define AT91_DDRSDRC1	(0xffffe400 - AT91_BASE_SYS) -#define AT91_DDRSDRC0	(0xffffe600 - AT91_BASE_SYS) -#define AT91_MATRIX	(0xffffea00 - AT91_BASE_SYS) -#define AT91_PMC	(0xfffffc00 - AT91_BASE_SYS) -#define AT91_GPBR	(0xfffffd60 - AT91_BASE_SYS) -  #define AT91SAM9G45_BASE_ECC	0xffffe200 +#define AT91SAM9G45_BASE_DDRSDRC1 0xffffe400 +#define AT91SAM9G45_BASE_DDRSDRC0 0xffffe600  #define AT91SAM9G45_BASE_DMA	0xffffec00  #define AT91SAM9G45_BASE_SMC	0xffffe800 +#define AT91SAM9G45_BASE_MATRIX	0xffffea00  #define AT91SAM9G45_BASE_DBGU	AT91_BASE_DBGU1  #define AT91SAM9G45_BASE_PIOA	0xfffff200  #define AT91SAM9G45_BASE_PIOB	0xfffff400 @@ -107,6 +104,7 @@  #define AT91SAM9G45_BASE_PIT	0xfffffd30  #define AT91SAM9G45_BASE_WDT	0xfffffd40  #define AT91SAM9G45_BASE_RTC	0xfffffdb0 +#define AT91SAM9G45_BASE_GPBR	0xfffffd60  #define AT91_USART0	AT91SAM9G45_BASE_US0  #define AT91_USART1	AT91SAM9G45_BASE_US1 diff --git a/arch/arm/mach-at91/include/mach/at91sam9g45_matrix.h b/arch/arm/mach-at91/include/mach/at91sam9g45_matrix.h index c972d60e0ae..b76e2ed2fbc 100644 --- a/arch/arm/mach-at91/include/mach/at91sam9g45_matrix.h +++ b/arch/arm/mach-at91/include/mach/at91sam9g45_matrix.h @@ -15,18 +15,18 @@  #ifndef AT91SAM9G45_MATRIX_H  #define AT91SAM9G45_MATRIX_H -#define AT91_MATRIX_MCFG0	(AT91_MATRIX + 0x00)	/* Master Configuration Register 0 */ -#define AT91_MATRIX_MCFG1	(AT91_MATRIX + 0x04)	/* Master Configuration Register 1 */ -#define AT91_MATRIX_MCFG2	(AT91_MATRIX + 0x08)	/* Master Configuration Register 2 */ -#define AT91_MATRIX_MCFG3	(AT91_MATRIX + 0x0C)	/* Master Configuration Register 3 */ -#define AT91_MATRIX_MCFG4	(AT91_MATRIX + 0x10)	/* Master Configuration Register 4 */ -#define AT91_MATRIX_MCFG5	(AT91_MATRIX + 0x14)	/* Master Configuration Register 5 */ -#define AT91_MATRIX_MCFG6	(AT91_MATRIX + 0x18)	/* Master Configuration Register 6 */ -#define AT91_MATRIX_MCFG7	(AT91_MATRIX + 0x1C)	/* Master Configuration Register 7 */ -#define AT91_MATRIX_MCFG8	(AT91_MATRIX + 0x20)	/* Master Configuration Register 8 */ -#define AT91_MATRIX_MCFG9	(AT91_MATRIX + 0x24)	/* Master Configuration Register 9 */ -#define AT91_MATRIX_MCFG10	(AT91_MATRIX + 0x28)	/* Master Configuration Register 10 */ -#define AT91_MATRIX_MCFG11	(AT91_MATRIX + 0x2C)	/* Master Configuration Register 11 */ +#define AT91_MATRIX_MCFG0	0x00			/* Master Configuration Register 0 */ +#define AT91_MATRIX_MCFG1	0x04			/* Master Configuration Register 1 */ +#define AT91_MATRIX_MCFG2	0x08			/* Master Configuration Register 2 */ +#define AT91_MATRIX_MCFG3	0x0C			/* Master Configuration Register 3 */ +#define AT91_MATRIX_MCFG4	0x10			/* Master Configuration Register 4 */ +#define AT91_MATRIX_MCFG5	0x14			/* Master Configuration Register 5 */ +#define AT91_MATRIX_MCFG6	0x18			/* Master Configuration Register 6 */ +#define AT91_MATRIX_MCFG7	0x1C			/* Master Configuration Register 7 */ +#define AT91_MATRIX_MCFG8	0x20			/* Master Configuration Register 8 */ +#define AT91_MATRIX_MCFG9	0x24			/* Master Configuration Register 9 */ +#define AT91_MATRIX_MCFG10	0x28			/* Master Configuration Register 10 */ +#define AT91_MATRIX_MCFG11	0x2C			/* Master Configuration Register 11 */  #define		AT91_MATRIX_ULBT	(7 << 0)	/* Undefined Length Burst Type */  #define			AT91_MATRIX_ULBT_INFINITE	(0 << 0)  #define			AT91_MATRIX_ULBT_SINGLE		(1 << 0) @@ -37,14 +37,14 @@  #define			AT91_MATRIX_ULBT_SIXTYFOUR	(6 << 0)  #define			AT91_MATRIX_ULBT_128		(7 << 0) -#define AT91_MATRIX_SCFG0	(AT91_MATRIX + 0x40)	/* Slave Configuration Register 0 */ -#define AT91_MATRIX_SCFG1	(AT91_MATRIX + 0x44)	/* Slave Configuration Register 1 */ -#define AT91_MATRIX_SCFG2	(AT91_MATRIX + 0x48)	/* Slave Configuration Register 2 */ -#define AT91_MATRIX_SCFG3	(AT91_MATRIX + 0x4C)	/* Slave Configuration Register 3 */ -#define AT91_MATRIX_SCFG4	(AT91_MATRIX + 0x50)	/* Slave Configuration Register 4 */ -#define AT91_MATRIX_SCFG5	(AT91_MATRIX + 0x54)	/* Slave Configuration Register 5 */ -#define AT91_MATRIX_SCFG6	(AT91_MATRIX + 0x58)	/* Slave Configuration Register 6 */ -#define AT91_MATRIX_SCFG7	(AT91_MATRIX + 0x5C)	/* Slave Configuration Register 7 */ +#define AT91_MATRIX_SCFG0	0x40			/* Slave Configuration Register 0 */ +#define AT91_MATRIX_SCFG1	0x44			/* Slave Configuration Register 1 */ +#define AT91_MATRIX_SCFG2	0x48			/* Slave Configuration Register 2 */ +#define AT91_MATRIX_SCFG3	0x4C			/* Slave Configuration Register 3 */ +#define AT91_MATRIX_SCFG4	0x50			/* Slave Configuration Register 4 */ +#define AT91_MATRIX_SCFG5	0x54			/* Slave Configuration Register 5 */ +#define AT91_MATRIX_SCFG6	0x58			/* Slave Configuration Register 6 */ +#define AT91_MATRIX_SCFG7	0x5C			/* Slave Configuration Register 7 */  #define		AT91_MATRIX_SLOT_CYCLE		(0x1ff << 0)	/* Maximum Number of Allowed Cycles for a Burst */  #define		AT91_MATRIX_DEFMSTR_TYPE	(3    << 16)	/* Default Master Type */  #define			AT91_MATRIX_DEFMSTR_TYPE_NONE	(0 << 16) @@ -52,22 +52,22 @@  #define			AT91_MATRIX_DEFMSTR_TYPE_FIXED	(2 << 16)  #define		AT91_MATRIX_FIXED_DEFMSTR	(0xf  << 18)	/* Fixed Index of Default Master */ -#define AT91_MATRIX_PRAS0	(AT91_MATRIX + 0x80)	/* Priority Register A for Slave 0 */ -#define AT91_MATRIX_PRBS0	(AT91_MATRIX + 0x84)	/* Priority Register B for Slave 0 */ -#define AT91_MATRIX_PRAS1	(AT91_MATRIX + 0x88)	/* Priority Register A for Slave 1 */ -#define AT91_MATRIX_PRBS1	(AT91_MATRIX + 0x8C)	/* Priority Register B for Slave 1 */ -#define AT91_MATRIX_PRAS2	(AT91_MATRIX + 0x90)	/* Priority Register A for Slave 2 */ -#define AT91_MATRIX_PRBS2	(AT91_MATRIX + 0x94)	/* Priority Register B for Slave 2 */ -#define AT91_MATRIX_PRAS3	(AT91_MATRIX + 0x98)	/* Priority Register A for Slave 3 */ -#define AT91_MATRIX_PRBS3	(AT91_MATRIX + 0x9C)	/* Priority Register B for Slave 3 */ -#define AT91_MATRIX_PRAS4	(AT91_MATRIX + 0xA0)	/* Priority Register A for Slave 4 */ -#define AT91_MATRIX_PRBS4	(AT91_MATRIX + 0xA4)	/* Priority Register B for Slave 4 */ -#define AT91_MATRIX_PRAS5	(AT91_MATRIX + 0xA8)	/* Priority Register A for Slave 5 */ -#define AT91_MATRIX_PRBS5	(AT91_MATRIX + 0xAC)	/* Priority Register B for Slave 5 */ -#define AT91_MATRIX_PRAS6	(AT91_MATRIX + 0xB0)	/* Priority Register A for Slave 6 */ -#define AT91_MATRIX_PRBS6	(AT91_MATRIX + 0xB4)	/* Priority Register B for Slave 6 */ -#define AT91_MATRIX_PRAS7	(AT91_MATRIX + 0xB8)	/* Priority Register A for Slave 7 */ -#define AT91_MATRIX_PRBS7	(AT91_MATRIX + 0xBC)	/* Priority Register B for Slave 7 */ +#define AT91_MATRIX_PRAS0	0x80			/* Priority Register A for Slave 0 */ +#define AT91_MATRIX_PRBS0	0x84			/* Priority Register B for Slave 0 */ +#define AT91_MATRIX_PRAS1	0x88			/* Priority Register A for Slave 1 */ +#define AT91_MATRIX_PRBS1	0x8C			/* Priority Register B for Slave 1 */ +#define AT91_MATRIX_PRAS2	0x90			/* Priority Register A for Slave 2 */ +#define AT91_MATRIX_PRBS2	0x94			/* Priority Register B for Slave 2 */ +#define AT91_MATRIX_PRAS3	0x98			/* Priority Register A for Slave 3 */ +#define AT91_MATRIX_PRBS3	0x9C			/* Priority Register B for Slave 3 */ +#define AT91_MATRIX_PRAS4	0xA0			/* Priority Register A for Slave 4 */ +#define AT91_MATRIX_PRBS4	0xA4			/* Priority Register B for Slave 4 */ +#define AT91_MATRIX_PRAS5	0xA8			/* Priority Register A for Slave 5 */ +#define AT91_MATRIX_PRBS5	0xAC			/* Priority Register B for Slave 5 */ +#define AT91_MATRIX_PRAS6	0xB0			/* Priority Register A for Slave 6 */ +#define AT91_MATRIX_PRBS6	0xB4			/* Priority Register B for Slave 6 */ +#define AT91_MATRIX_PRAS7	0xB8			/* Priority Register A for Slave 7 */ +#define AT91_MATRIX_PRBS7	0xBC			/* Priority Register B for Slave 7 */  #define		AT91_MATRIX_M0PR		(3 << 0)	/* Master 0 Priority */  #define		AT91_MATRIX_M1PR		(3 << 4)	/* Master 1 Priority */  #define		AT91_MATRIX_M2PR		(3 << 8)	/* Master 2 Priority */ @@ -81,7 +81,7 @@  #define		AT91_MATRIX_M10PR		(3 << 8)	/* Master 10 Priority (in Register B) */  #define		AT91_MATRIX_M11PR		(3 << 12)	/* Master 11 Priority (in Register B) */ -#define AT91_MATRIX_MRCR	(AT91_MATRIX + 0x100)	/* Master Remap Control Register */ +#define AT91_MATRIX_MRCR	0x100			/* Master Remap Control Register */  #define		AT91_MATRIX_RCB0		(1 << 0)	/* Remap Command for AHB Master 0 (ARM926EJ-S Instruction Master) */  #define		AT91_MATRIX_RCB1		(1 << 1)	/* Remap Command for AHB Master 1 (ARM926EJ-S Data Master) */  #define		AT91_MATRIX_RCB2		(1 << 2) @@ -95,7 +95,7 @@  #define		AT91_MATRIX_RCB10		(1 << 10)  #define		AT91_MATRIX_RCB11		(1 << 11) -#define AT91_MATRIX_TCMR	(AT91_MATRIX + 0x110)	/* TCM Configuration Register */ +#define AT91_MATRIX_TCMR	0x110			/* TCM Configuration Register */  #define		AT91_MATRIX_ITCM_SIZE		(0xf << 0)	/* Size of ITCM enabled memory block */  #define			AT91_MATRIX_ITCM_0		(0 << 0)  #define			AT91_MATRIX_ITCM_32		(6 << 0) @@ -107,12 +107,12 @@  #define			AT91_MATRIX_TCM_NO_WS		(0x0 << 11)  #define			AT91_MATRIX_TCM_ONE_WS		(0x1 << 11) -#define AT91_MATRIX_VIDEO	(AT91_MATRIX + 0x118)	/* Video Mode Configuration Register */ +#define AT91_MATRIX_VIDEO	0x118			/* Video Mode Configuration Register */  #define		AT91C_VDEC_SEL			(0x1 <<  0) /* Video Mode Selection */  #define			AT91C_VDEC_SEL_OFF		(0 << 0)  #define			AT91C_VDEC_SEL_ON		(1 << 0) -#define AT91_MATRIX_EBICSA	(AT91_MATRIX + 0x128)	/* EBI Chip Select Assignment Register */ +#define AT91_MATRIX_EBICSA	0x128			/* EBI Chip Select Assignment Register */  #define		AT91_MATRIX_EBI_CS1A		(1 << 1)	/* Chip Select 1 Assignment */  #define			AT91_MATRIX_EBI_CS1A_SMC		(0 << 1)  #define			AT91_MATRIX_EBI_CS1A_SDRAMC		(1 << 1) @@ -138,13 +138,13 @@  #define			AT91_MATRIX_EBI_DDR_IOSR_REDUCED	(0 << 18)  #define			AT91_MATRIX_EBI_DDR_IOSR_NORMAL		(1 << 18) -#define AT91_MATRIX_WPMR	(AT91_MATRIX + 0x1E4)	/* Write Protect Mode Register */ +#define AT91_MATRIX_WPMR	0x1E4			/* Write Protect Mode Register */  #define		AT91_MATRIX_WPMR_WPEN		(1 << 0)	/* Write Protect ENable */  #define			AT91_MATRIX_WPMR_WP_WPDIS		(0 << 0)  #define			AT91_MATRIX_WPMR_WP_WPEN		(1 << 0)  #define		AT91_MATRIX_WPMR_WPKEY		(0xFFFFFF << 8)	/* Write Protect KEY */ -#define AT91_MATRIX_WPSR	(AT91_MATRIX + 0x1E8)	/* Write Protect Status Register */ +#define AT91_MATRIX_WPSR	0x1E8			/* Write Protect Status Register */  #define		AT91_MATRIX_WPSR_WPVS		(1 << 0)	/* Write Protect Violation Status */  #define			AT91_MATRIX_WPSR_NO_WPV		(0 << 0)  #define			AT91_MATRIX_WPSR_WPV		(1 << 0) diff --git a/arch/arm/mach-at91/include/mach/at91sam9rl.h b/arch/arm/mach-at91/include/mach/at91sam9rl.h index d7bead7118d..e0073eb1014 100644 --- a/arch/arm/mach-at91/include/mach/at91sam9rl.h +++ b/arch/arm/mach-at91/include/mach/at91sam9rl.h @@ -69,15 +69,13 @@  /*   * System Peripherals (offset from AT91_BASE_SYS)   */ -#define AT91_SDRAMC0	(0xffffea00 - AT91_BASE_SYS) -#define AT91_MATRIX	(0xffffee00 - AT91_BASE_SYS) -#define AT91_PMC	(0xfffffc00 - AT91_BASE_SYS)  #define AT91_SCKCR	(0xfffffd50 - AT91_BASE_SYS) -#define AT91_GPBR	(0xfffffd60 - AT91_BASE_SYS)  #define AT91SAM9RL_BASE_DMA	0xffffe600  #define AT91SAM9RL_BASE_ECC	0xffffe800 +#define AT91SAM9RL_BASE_SDRAMC	0xffffea00  #define AT91SAM9RL_BASE_SMC	0xffffec00 +#define AT91SAM9RL_BASE_MATRIX	0xffffee00  #define AT91SAM9RL_BASE_DBGU	AT91_BASE_DBGU0  #define AT91SAM9RL_BASE_PIOA	0xfffff400  #define AT91SAM9RL_BASE_PIOB	0xfffff600 @@ -88,6 +86,7 @@  #define AT91SAM9RL_BASE_RTT	0xfffffd20  #define AT91SAM9RL_BASE_PIT	0xfffffd30  #define AT91SAM9RL_BASE_WDT	0xfffffd40 +#define AT91SAM9RL_BASE_GPBR	0xfffffd60  #define AT91SAM9RL_BASE_RTC	0xfffffe00  #define AT91_USART0	AT91SAM9RL_BASE_US0 diff --git a/arch/arm/mach-at91/include/mach/at91sam9rl_matrix.h b/arch/arm/mach-at91/include/mach/at91sam9rl_matrix.h index 5f9149071fe..6d160adadaf 100644 --- a/arch/arm/mach-at91/include/mach/at91sam9rl_matrix.h +++ b/arch/arm/mach-at91/include/mach/at91sam9rl_matrix.h @@ -14,12 +14,12 @@  #ifndef AT91SAM9RL_MATRIX_H  #define AT91SAM9RL_MATRIX_H -#define AT91_MATRIX_MCFG0	(AT91_MATRIX + 0x00)	/* Master Configuration Register 0 */ -#define AT91_MATRIX_MCFG1	(AT91_MATRIX + 0x04)	/* Master Configuration Register 1 */ -#define AT91_MATRIX_MCFG2	(AT91_MATRIX + 0x08)	/* Master Configuration Register 2 */ -#define AT91_MATRIX_MCFG3	(AT91_MATRIX + 0x0C)	/* Master Configuration Register 3 */ -#define AT91_MATRIX_MCFG4	(AT91_MATRIX + 0x10)	/* Master Configuration Register 4 */ -#define AT91_MATRIX_MCFG5	(AT91_MATRIX + 0x14)	/* Master Configuration Register 5 */ +#define AT91_MATRIX_MCFG0	0x00			/* Master Configuration Register 0 */ +#define AT91_MATRIX_MCFG1	0x04			/* Master Configuration Register 1 */ +#define AT91_MATRIX_MCFG2	0x08			/* Master Configuration Register 2 */ +#define AT91_MATRIX_MCFG3	0x0C			/* Master Configuration Register 3 */ +#define AT91_MATRIX_MCFG4	0x10			/* Master Configuration Register 4 */ +#define AT91_MATRIX_MCFG5	0x14			/* Master Configuration Register 5 */  #define		AT91_MATRIX_ULBT	(7 << 0)	/* Undefined Length Burst Type */  #define			AT91_MATRIX_ULBT_INFINITE	(0 << 0)  #define			AT91_MATRIX_ULBT_SINGLE		(1 << 0) @@ -27,12 +27,12 @@  #define			AT91_MATRIX_ULBT_EIGHT		(3 << 0)  #define			AT91_MATRIX_ULBT_SIXTEEN	(4 << 0) -#define AT91_MATRIX_SCFG0	(AT91_MATRIX + 0x40)	/* Slave Configuration Register 0 */ -#define AT91_MATRIX_SCFG1	(AT91_MATRIX + 0x44)	/* Slave Configuration Register 1 */ -#define AT91_MATRIX_SCFG2	(AT91_MATRIX + 0x48)	/* Slave Configuration Register 2 */ -#define AT91_MATRIX_SCFG3	(AT91_MATRIX + 0x4C)	/* Slave Configuration Register 3 */ -#define AT91_MATRIX_SCFG4	(AT91_MATRIX + 0x50)	/* Slave Configuration Register 4 */ -#define AT91_MATRIX_SCFG5	(AT91_MATRIX + 0x54)	/* Slave Configuration Register 5 */ +#define AT91_MATRIX_SCFG0	0x40			/* Slave Configuration Register 0 */ +#define AT91_MATRIX_SCFG1	0x44			/* Slave Configuration Register 1 */ +#define AT91_MATRIX_SCFG2	0x48			/* Slave Configuration Register 2 */ +#define AT91_MATRIX_SCFG3	0x4C			/* Slave Configuration Register 3 */ +#define AT91_MATRIX_SCFG4	0x50			/* Slave Configuration Register 4 */ +#define AT91_MATRIX_SCFG5	0x54			/* Slave Configuration Register 5 */  #define		AT91_MATRIX_SLOT_CYCLE		(0xff << 0)	/* Maximum Number of Allowed Cycles for a Burst */  #define		AT91_MATRIX_DEFMSTR_TYPE	(3    << 16)	/* Default Master Type */  #define			AT91_MATRIX_DEFMSTR_TYPE_NONE	(0 << 16) @@ -43,12 +43,12 @@  #define			AT91_MATRIX_ARBT_ROUND_ROBIN	(0 << 24)  #define			AT91_MATRIX_ARBT_FIXED_PRIORITY	(1 << 24) -#define AT91_MATRIX_PRAS0	(AT91_MATRIX + 0x80)	/* Priority Register A for Slave 0 */ -#define AT91_MATRIX_PRAS1	(AT91_MATRIX + 0x88)	/* Priority Register A for Slave 1 */ -#define AT91_MATRIX_PRAS2	(AT91_MATRIX + 0x90)	/* Priority Register A for Slave 2 */ -#define AT91_MATRIX_PRAS3	(AT91_MATRIX + 0x98)	/* Priority Register A for Slave 3 */ -#define AT91_MATRIX_PRAS4	(AT91_MATRIX + 0xA0)	/* Priority Register A for Slave 4 */ -#define AT91_MATRIX_PRAS5	(AT91_MATRIX + 0xA8)	/* Priority Register A for Slave 5 */ +#define AT91_MATRIX_PRAS0	0x80			/* Priority Register A for Slave 0 */ +#define AT91_MATRIX_PRAS1	0x88			/* Priority Register A for Slave 1 */ +#define AT91_MATRIX_PRAS2	0x90			/* Priority Register A for Slave 2 */ +#define AT91_MATRIX_PRAS3	0x98			/* Priority Register A for Slave 3 */ +#define AT91_MATRIX_PRAS4	0xA0			/* Priority Register A for Slave 4 */ +#define AT91_MATRIX_PRAS5	0xA8			/* Priority Register A for Slave 5 */  #define		AT91_MATRIX_M0PR		(3 << 0)	/* Master 0 Priority */  #define		AT91_MATRIX_M1PR		(3 << 4)	/* Master 1 Priority */  #define		AT91_MATRIX_M2PR		(3 << 8)	/* Master 2 Priority */ @@ -56,7 +56,7 @@  #define		AT91_MATRIX_M4PR		(3 << 16)	/* Master 4 Priority */  #define		AT91_MATRIX_M5PR		(3 << 20)	/* Master 5 Priority */ -#define AT91_MATRIX_MRCR	(AT91_MATRIX + 0x100)	/* Master Remap Control Register */ +#define AT91_MATRIX_MRCR	0x100			/* Master Remap Control Register */  #define		AT91_MATRIX_RCB0		(1 << 0)	/* Remap Command for AHB Master 0 (ARM926EJ-S Instruction Master) */  #define		AT91_MATRIX_RCB1		(1 << 1)	/* Remap Command for AHB Master 1 (ARM926EJ-S Data Master) */  #define		AT91_MATRIX_RCB2		(1 << 2) @@ -64,7 +64,7 @@  #define		AT91_MATRIX_RCB4		(1 << 4)  #define		AT91_MATRIX_RCB5		(1 << 5) -#define AT91_MATRIX_TCMR	(AT91_MATRIX + 0x114)	/* TCM Configuration Register */ +#define AT91_MATRIX_TCMR	0x114			/* TCM Configuration Register */  #define		AT91_MATRIX_ITCM_SIZE		(0xf << 0)	/* Size of ITCM enabled memory block */  #define			AT91_MATRIX_ITCM_0		(0 << 0)  #define			AT91_MATRIX_ITCM_16		(5 << 0) @@ -74,7 +74,7 @@  #define			AT91_MATRIX_DTCM_16		(5 << 4)  #define			AT91_MATRIX_DTCM_32		(6 << 4) -#define AT91_MATRIX_EBICSA	(AT91_MATRIX + 0x120)	/* EBI0 Chip Select Assignment Register */ +#define AT91_MATRIX_EBICSA	0x120			/* EBI0 Chip Select Assignment Register */  #define		AT91_MATRIX_CS1A		(1 << 1)	/* Chip Select 1 Assignment */  #define			AT91_MATRIX_CS1A_SMC		(0 << 1)  #define			AT91_MATRIX_CS1A_SDRAMC		(1 << 1) diff --git a/arch/arm/mach-at91/include/mach/at91sam9x5.h b/arch/arm/mach-at91/include/mach/at91sam9x5.h index 8476871a2f9..a297a77d88e 100644 --- a/arch/arm/mach-at91/include/mach/at91sam9x5.h +++ b/arch/arm/mach-at91/include/mach/at91sam9x5.h @@ -55,10 +55,9 @@  #define AT91SAM9X5_BASE_USART2	0xf8024000  /* - * System Peripherals (offset from AT91_BASE_SYS) + * System Peripherals   */ -#define AT91_DDRSDRC0	(0xffffe800 - AT91_BASE_SYS) -#define AT91_PMC	(0xfffffc00 - AT91_BASE_SYS) +#define AT91SAM9X5_BASE_DDRSDRC0	0xffffe800  /*   * Base addresses for early serial code (uncompress.h) diff --git a/arch/arm/mach-at91/include/mach/at91x40.h b/arch/arm/mach-at91/include/mach/at91x40.h index a57829f4fd1..90680217064 100644 --- a/arch/arm/mach-at91/include/mach/at91x40.h +++ b/arch/arm/mach-at91/include/mach/at91x40.h @@ -28,18 +28,18 @@  #define AT91X40_ID_IRQ2		18	/* External IRQ 2 */  /* - * System Peripherals (offset from AT91_BASE_SYS) + * System Peripherals   */  #define AT91_BASE_SYS	0xffc00000 -#define AT91_EBI	(0xffe00000 - AT91_BASE_SYS)	/* External Bus Interface */ -#define AT91_SF		(0xfff00000 - AT91_BASE_SYS)	/* Special Function */ -#define AT91_USART1	(0xfffcc000 - AT91_BASE_SYS)	/* USART 1 */ -#define AT91_USART0	(0xfffd0000 - AT91_BASE_SYS)	/* USART 0 */ -#define AT91_TC		(0xfffe0000 - AT91_BASE_SYS)	/* Timer Counter */ -#define AT91_PIOA	(0xffff0000 - AT91_BASE_SYS)	/* PIO Controller A */ -#define AT91_PS		(0xffff4000 - AT91_BASE_SYS)	/* Power Save */ -#define AT91_WD		(0xffff8000 - AT91_BASE_SYS)	/* Watchdog Timer */ +#define AT91_EBI	0xffe00000	/* External Bus Interface */ +#define AT91_SF		0xfff00000	/* Special Function */ +#define AT91_USART1	0xfffcc000	/* USART 1 */ +#define AT91_USART0	0xfffd0000	/* USART 0 */ +#define AT91_TC		0xfffe0000	/* Timer Counter */ +#define AT91_PIOA	0xffff0000	/* PIO Controller A */ +#define AT91_PS		0xffff4000	/* Power Save */ +#define AT91_WD		0xffff8000	/* Watchdog Timer */  /*   * The AT91x40 series doesn't have a debug unit like the other AT91 parts. diff --git a/arch/arm/mach-at91/include/mach/gpio.h b/arch/arm/mach-at91/include/mach/gpio.h index e3fd225121c..eed465ab0dd 100644 --- a/arch/arm/mach-at91/include/mach/gpio.h +++ b/arch/arm/mach-at91/include/mach/gpio.h @@ -191,10 +191,15 @@  extern int __init_or_module at91_set_GPIO_periph(unsigned pin, int use_pullup);  extern int __init_or_module at91_set_A_periph(unsigned pin, int use_pullup);  extern int __init_or_module at91_set_B_periph(unsigned pin, int use_pullup); +extern int __init_or_module at91_set_C_periph(unsigned pin, int use_pullup); +extern int __init_or_module at91_set_D_periph(unsigned pin, int use_pullup);  extern int __init_or_module at91_set_gpio_input(unsigned pin, int use_pullup);  extern int __init_or_module at91_set_gpio_output(unsigned pin, int value);  extern int __init_or_module at91_set_deglitch(unsigned pin, int is_on); +extern int __init_or_module at91_set_debounce(unsigned pin, int is_on, int div);  extern int __init_or_module at91_set_multi_drive(unsigned pin, int is_on); +extern int __init_or_module at91_set_pulldown(unsigned pin, int is_on); +extern int __init_or_module at91_disable_schmitt_trig(unsigned pin);  /* callable at any time */  extern int at91_set_gpio_value(unsigned pin, int value); @@ -204,18 +209,6 @@ extern int at91_get_gpio_value(unsigned pin);  extern void at91_gpio_suspend(void);  extern void at91_gpio_resume(void); -/*-------------------------------------------------------------------------*/ - -/* wrappers for "new style" GPIO calls. the old AT91-specific ones should - * eventually be removed (along with this errno.h inclusion), and the - * gpio request/free calls should probably be implemented. - */ - -#include <asm/errno.h> - -#define gpio_to_irq(gpio) (gpio + NR_AIC_IRQS) -#define irq_to_gpio(irq)  (irq - NR_AIC_IRQS) -  #endif	/* __ASSEMBLY__ */  #endif diff --git a/arch/arm/mach-at91/include/mach/hardware.h b/arch/arm/mach-at91/include/mach/hardware.h index fd7dce4f737..e9e29a6c386 100644 --- a/arch/arm/mach-at91/include/mach/hardware.h +++ b/arch/arm/mach-at91/include/mach/hardware.h @@ -59,9 +59,10 @@  /*   * On all at91 have the Advanced Interrupt Controller starts at address - * 0xfffff000 + * 0xfffff000 and the Power Management Controller starts at 0xfffffc00   */  #define AT91_AIC	0xfffff000 +#define AT91_PMC	0xfffffc00  /*   * Peripheral identifiers/interrupts. diff --git a/arch/arm/mach-at91/include/mach/io.h b/arch/arm/mach-at91/include/mach/io.h index 4ca09ef7ca2..4003001eca3 100644 --- a/arch/arm/mach-at91/include/mach/io.h +++ b/arch/arm/mach-at91/include/mach/io.h @@ -28,22 +28,4 @@  #define __io(a)		__typesafe_io(a)  #define __mem_pci(a)	(a) -#ifndef __ASSEMBLY__ - -static inline unsigned int at91_sys_read(unsigned int reg_offset) -{ -	void __iomem *addr = (void __iomem *)AT91_VA_BASE_SYS; - -	return __raw_readl(addr + reg_offset); -} - -static inline void at91_sys_write(unsigned int reg_offset, unsigned long value) -{ -	void __iomem *addr = (void __iomem *)AT91_VA_BASE_SYS; - -	__raw_writel(value, addr + reg_offset); -} - -#endif -  #endif diff --git a/arch/arm/mach-at91/irq.c b/arch/arm/mach-at91/irq.c index be6b639ecd7..cfcfcbe3626 100644 --- a/arch/arm/mach-at91/irq.c +++ b/arch/arm/mach-at91/irq.c @@ -24,6 +24,12 @@  #include <linux/module.h>  #include <linux/mm.h>  #include <linux/types.h> +#include <linux/irq.h> +#include <linux/of.h> +#include <linux/of_address.h> +#include <linux/of_irq.h> +#include <linux/irqdomain.h> +#include <linux/err.h>  #include <mach/hardware.h>  #include <asm/irq.h> @@ -34,22 +40,24 @@  #include <asm/mach/map.h>  void __iomem *at91_aic_base; +static struct irq_domain *at91_aic_domain; +static struct device_node *at91_aic_np;  static void at91_aic_mask_irq(struct irq_data *d)  {  	/* Disable interrupt on AIC */ -	at91_aic_write(AT91_AIC_IDCR, 1 << d->irq); +	at91_aic_write(AT91_AIC_IDCR, 1 << d->hwirq);  }  static void at91_aic_unmask_irq(struct irq_data *d)  {  	/* Enable interrupt on AIC */ -	at91_aic_write(AT91_AIC_IECR, 1 << d->irq); +	at91_aic_write(AT91_AIC_IECR, 1 << d->hwirq);  }  unsigned int at91_extern_irq; -#define is_extern_irq(irq) ((1 << (irq)) & at91_extern_irq) +#define is_extern_irq(hwirq) ((1 << (hwirq)) & at91_extern_irq)  static int at91_aic_set_type(struct irq_data *d, unsigned type)  { @@ -63,13 +71,13 @@ static int at91_aic_set_type(struct irq_data *d, unsigned type)  		srctype = AT91_AIC_SRCTYPE_RISING;  		break;  	case IRQ_TYPE_LEVEL_LOW: -		if ((d->irq == AT91_ID_FIQ) || is_extern_irq(d->irq))		/* only supported on external interrupts */ +		if ((d->hwirq == AT91_ID_FIQ) || is_extern_irq(d->hwirq))		/* only supported on external interrupts */  			srctype = AT91_AIC_SRCTYPE_LOW;  		else  			return -EINVAL;  		break;  	case IRQ_TYPE_EDGE_FALLING: -		if ((d->irq == AT91_ID_FIQ) || is_extern_irq(d->irq))		/* only supported on external interrupts */ +		if ((d->hwirq == AT91_ID_FIQ) || is_extern_irq(d->hwirq))		/* only supported on external interrupts */  			srctype = AT91_AIC_SRCTYPE_FALLING;  		else  			return -EINVAL; @@ -78,8 +86,8 @@ static int at91_aic_set_type(struct irq_data *d, unsigned type)  		return -EINVAL;  	} -	smr = at91_aic_read(AT91_AIC_SMR(d->irq)) & ~AT91_AIC_SRCTYPE; -	at91_aic_write(AT91_AIC_SMR(d->irq), smr | srctype); +	smr = at91_aic_read(AT91_AIC_SMR(d->hwirq)) & ~AT91_AIC_SRCTYPE; +	at91_aic_write(AT91_AIC_SMR(d->hwirq), smr | srctype);  	return 0;  } @@ -90,13 +98,13 @@ static u32 backups;  static int at91_aic_set_wake(struct irq_data *d, unsigned value)  { -	if (unlikely(d->irq >= 32)) +	if (unlikely(d->hwirq >= NR_AIC_IRQS))  		return -EINVAL;  	if (value) -		wakeups |= (1 << d->irq); +		wakeups |= (1 << d->hwirq);  	else -		wakeups &= ~(1 << d->irq); +		wakeups &= ~(1 << d->hwirq);  	return 0;  } @@ -127,46 +135,112 @@ static struct irq_chip at91_aic_chip = {  	.irq_set_wake	= at91_aic_set_wake,  }; +static void __init at91_aic_hw_init(unsigned int spu_vector) +{ +	int i; + +	/* +	 * Perform 8 End Of Interrupt Command to make sure AIC +	 * will not Lock out nIRQ +	 */ +	for (i = 0; i < 8; i++) +		at91_aic_write(AT91_AIC_EOICR, 0); + +	/* +	 * Spurious Interrupt ID in Spurious Vector Register. +	 * When there is no current interrupt, the IRQ Vector Register +	 * reads the value stored in AIC_SPU +	 */ +	at91_aic_write(AT91_AIC_SPU, spu_vector); + +	/* No debugging in AIC: Debug (Protect) Control Register */ +	at91_aic_write(AT91_AIC_DCR, 0); + +	/* Disable and clear all interrupts initially */ +	at91_aic_write(AT91_AIC_IDCR, 0xFFFFFFFF); +	at91_aic_write(AT91_AIC_ICCR, 0xFFFFFFFF); +} + +#if defined(CONFIG_OF) +static int at91_aic_irq_map(struct irq_domain *h, unsigned int virq, +							irq_hw_number_t hw) +{ +	/* Put virq number in Source Vector Register */ +	at91_aic_write(AT91_AIC_SVR(hw), virq); + +	/* Active Low interrupt, without priority */ +	at91_aic_write(AT91_AIC_SMR(hw), AT91_AIC_SRCTYPE_LOW); + +	irq_set_chip_and_handler(virq, &at91_aic_chip, handle_level_irq); +	set_irq_flags(virq, IRQF_VALID | IRQF_PROBE); + +	return 0; +} + +static struct irq_domain_ops at91_aic_irq_ops = { +	.map	= at91_aic_irq_map, +	.xlate	= irq_domain_xlate_twocell, +}; + +int __init at91_aic_of_init(struct device_node *node, +				     struct device_node *parent) +{ +	at91_aic_base = of_iomap(node, 0); +	at91_aic_np = node; + +	at91_aic_domain = irq_domain_add_linear(at91_aic_np, NR_AIC_IRQS, +						&at91_aic_irq_ops, NULL); +	if (!at91_aic_domain) +		panic("Unable to add AIC irq domain (DT)\n"); + +	irq_set_default_host(at91_aic_domain); + +	at91_aic_hw_init(NR_AIC_IRQS); + +	return 0; +} +#endif +  /*   * Initialize the AIC interrupt controller.   */  void __init at91_aic_init(unsigned int priority[NR_AIC_IRQS])  {  	unsigned int i; +	int irq_base;  	at91_aic_base = ioremap(AT91_AIC, 512); -  	if (!at91_aic_base) -		panic("Impossible to ioremap AT91_AIC\n"); +		panic("Unable to ioremap AIC registers\n"); + +	/* Add irq domain for AIC */ +	irq_base = irq_alloc_descs(-1, 0, NR_AIC_IRQS, 0); +	if (irq_base < 0) { +		WARN(1, "Cannot allocate irq_descs, assuming pre-allocated\n"); +		irq_base = 0; +	} +	at91_aic_domain = irq_domain_add_legacy(at91_aic_np, NR_AIC_IRQS, +						irq_base, 0, +						&irq_domain_simple_ops, NULL); + +	if (!at91_aic_domain) +		panic("Unable to add AIC irq domain\n"); + +	irq_set_default_host(at91_aic_domain);  	/*  	 * The IVR is used by macro get_irqnr_and_base to read and verify.  	 * The irq number is NR_AIC_IRQS when a spurious interrupt has occurred.  	 */  	for (i = 0; i < NR_AIC_IRQS; i++) { -		/* Put irq number in Source Vector Register: */ +		/* Put hardware irq number in Source Vector Register: */  		at91_aic_write(AT91_AIC_SVR(i), i);  		/* Active Low interrupt, with the specified priority */  		at91_aic_write(AT91_AIC_SMR(i), AT91_AIC_SRCTYPE_LOW | priority[i]);  		irq_set_chip_and_handler(i, &at91_aic_chip, handle_level_irq);  		set_irq_flags(i, IRQF_VALID | IRQF_PROBE); - -		/* Perform 8 End Of Interrupt Command to make sure AIC will not Lock out nIRQ */ -		if (i < 8) -			at91_aic_write(AT91_AIC_EOICR, 0);  	} -	/* -	 * Spurious Interrupt ID in Spurious Vector Register is NR_AIC_IRQS -	 * When there is no current interrupt, the IRQ Vector Register reads the value stored in AIC_SPU -	 */ -	at91_aic_write(AT91_AIC_SPU, NR_AIC_IRQS); - -	/* No debugging in AIC: Debug (Protect) Control Register */ -	at91_aic_write(AT91_AIC_DCR, 0); - -	/* Disable and clear all interrupts initially */ -	at91_aic_write(AT91_AIC_IDCR, 0xFFFFFFFF); -	at91_aic_write(AT91_AIC_ICCR, 0xFFFFFFFF); +	at91_aic_hw_init(NR_AIC_IRQS);  } diff --git a/arch/arm/mach-at91/pm.c b/arch/arm/mach-at91/pm.c index d554e6771b4..6c9d5e69ac2 100644 --- a/arch/arm/mach-at91/pm.c +++ b/arch/arm/mach-at91/pm.c @@ -136,7 +136,7 @@ static int at91_pm_verify_clocks(void)  	unsigned long scsr;  	int i; -	scsr = at91_sys_read(AT91_PMC_SCSR); +	scsr = at91_pmc_read(AT91_PMC_SCSR);  	/* USB must not be using PLLB */  	if (cpu_is_at91rm9200()) { @@ -160,7 +160,7 @@ static int at91_pm_verify_clocks(void)  		if ((scsr & (AT91_PMC_PCK0 << i)) == 0)  			continue; -		css = at91_sys_read(AT91_PMC_PCKR(i)) & AT91_PMC_CSS; +		css = at91_pmc_read(AT91_PMC_PCKR(i)) & AT91_PMC_CSS;  		if (css != AT91_PMC_CSS_SLOW) {  			pr_err("AT91: PM - Suspend-to-RAM with PCK%d src %d\n", i, css);  			return 0; @@ -188,13 +188,27 @@ int at91_suspend_entering_slow_clock(void)  EXPORT_SYMBOL(at91_suspend_entering_slow_clock); -static void (*slow_clock)(void); +static void (*slow_clock)(void __iomem *pmc, void __iomem *ramc0, +			  void __iomem *ramc1, int memctrl);  #ifdef CONFIG_AT91_SLOW_CLOCK -extern void at91_slow_clock(void); +extern void at91_slow_clock(void __iomem *pmc, void __iomem *ramc0, +			    void __iomem *ramc1, int memctrl);  extern u32 at91_slow_clock_sz;  #endif +void __iomem *at91_ramc_base[2]; + +void __init at91_ioremap_ramc(int id, u32 addr, u32 size) +{ +	if (id < 0 || id > 1) { +		pr_emerg("Wrong RAM controller id (%d), cannot continue\n", id); +		BUG(); +	} +	at91_ramc_base[id] = ioremap(addr, size); +	if (!at91_ramc_base[id]) +		panic("Impossible to ioremap ramc.%d 0x%x\n", id, addr); +}  static int at91_pm_enter(suspend_state_t state)  { @@ -203,7 +217,7 @@ static int at91_pm_enter(suspend_state_t state)  	pr_debug("AT91: PM - wake mask %08x, pm state %d\n",  			/* remember all the always-wake irqs */ -			(at91_sys_read(AT91_PMC_PCSR) +			(at91_pmc_read(AT91_PMC_PCSR)  					| (1 << AT91_ID_FIQ)  					| (1 << AT91_ID_SYS)  					| (at91_extern_irq)) @@ -228,11 +242,18 @@ static int at91_pm_enter(suspend_state_t state)  			 * turning off the main oscillator; reverse on wakeup.  			 */  			if (slow_clock) { +				int memctrl = AT91_MEMCTRL_SDRAMC; + +				if (cpu_is_at91rm9200()) +					memctrl = AT91_MEMCTRL_MC; +				else if (cpu_is_at91sam9g45()) +					memctrl = AT91_MEMCTRL_DDRSDR;  #ifdef CONFIG_AT91_SLOW_CLOCK  				/* copy slow_clock handler to SRAM, and call it */  				memcpy(slow_clock, at91_slow_clock, at91_slow_clock_sz);  #endif -				slow_clock(); +				slow_clock(at91_pmc_base, at91_ramc_base[0], +					   at91_ramc_base[1], memctrl);  				break;  			} else {  				pr_info("AT91: PM - no slow clock mode enabled ...\n"); @@ -301,7 +322,7 @@ static int __init at91_pm_init(void)  #ifdef CONFIG_ARCH_AT91RM9200  	/* AT91RM9200 SDRAM low-power mode cannot be used with self-refresh. */ -	at91_sys_write(AT91_SDRAMC_LPR, 0); +	at91_ramc_write(0, AT91RM9200_SDRAMC_LPR, 0);  #endif  	suspend_set_ops(&at91_pm_ops); diff --git a/arch/arm/mach-at91/pm.h b/arch/arm/mach-at91/pm.h index bba9ce1aaae..89f56f3a802 100644 --- a/arch/arm/mach-at91/pm.h +++ b/arch/arm/mach-at91/pm.h @@ -11,8 +11,9 @@  #ifndef __ARCH_ARM_MACH_AT91_PM  #define __ARCH_ARM_MACH_AT91_PM +#include <mach/at91_ramc.h>  #ifdef CONFIG_ARCH_AT91RM9200 -#include <mach/at91rm9200_mc.h> +#include <mach/at91rm9200_sdramc.h>  /*   * The AT91RM9200 goes into self-refresh mode with this command, and will @@ -26,7 +27,7 @@  static inline void at91rm9200_standby(void)  { -	u32 lpr = at91_sys_read(AT91_SDRAMC_LPR); +	u32 lpr = at91_ramc_read(0, AT91RM9200_SDRAMC_LPR);  	asm volatile(  		"b    1f\n\t" @@ -37,15 +38,14 @@ static inline void at91rm9200_standby(void)  		"    mcr    p15, 0, %0, c7, c0, 4\n\t"  		"    str    %5, [%1, %2]"  		: -		: "r" (0), "r" (AT91_BASE_SYS), "r" (AT91_SDRAMC_LPR), -		  "r" (1), "r" (AT91_SDRAMC_SRR), +		: "r" (0), "r" (AT91_BASE_SYS), "r" (AT91RM9200_SDRAMC_LPR), +		  "r" (1), "r" (AT91RM9200_SDRAMC_SRR),  		  "r" (lpr));  }  #define at91_standby at91rm9200_standby  #elif defined(CONFIG_ARCH_AT91SAM9G45) -#include <mach/at91sam9_ddrsdr.h>  /* We manage both DDRAM/SDRAM controllers, we need more than one value to   * remember. @@ -78,7 +78,6 @@ static inline void at91sam9g45_standby(void)  #define at91_standby at91sam9g45_standby  #else -#include <mach/at91sam9_sdramc.h>  #ifdef CONFIG_ARCH_AT91SAM9263  /* diff --git a/arch/arm/mach-at91/pm_slowclock.S b/arch/arm/mach-at91/pm_slowclock.S index f8539a8bcd6..db5452123f1 100644 --- a/arch/arm/mach-at91/pm_slowclock.S +++ b/arch/arm/mach-at91/pm_slowclock.S @@ -15,14 +15,7 @@  #include <linux/linkage.h>  #include <mach/hardware.h>  #include <mach/at91_pmc.h> - -#if defined(CONFIG_ARCH_AT91RM9200) -#include <mach/at91rm9200_mc.h> -#elif defined(CONFIG_ARCH_AT91SAM9G45) -#include <mach/at91sam9_ddrsdr.h> -#else -#include <mach/at91sam9_sdramc.h> -#endif +#include <mach/at91_ramc.h>  #ifdef CONFIG_ARCH_AT91SAM9263 @@ -46,17 +39,23 @@  #define PLLALOCK_TIMEOUT	1000  #define PLLBLOCK_TIMEOUT	1000 +pmc	.req	r0 +sdramc	.req	r1 +ramc1	.req	r2 +memctrl	.req	r3 +tmp1	.req	r4 +tmp2	.req	r5  /*   * Wait until master clock is ready (after switching master clock source)   */  	.macro wait_mckrdy -	mov	r4, #MCKRDY_TIMEOUT -1:	sub	r4, r4, #1 -	cmp	r4, #0 +	mov	tmp2, #MCKRDY_TIMEOUT +1:	sub	tmp2, tmp2, #1 +	cmp	tmp2, #0  	beq	2f -	ldr	r3, [r1, #(AT91_PMC_SR - AT91_PMC)] -	tst	r3, #AT91_PMC_MCKRDY +	ldr	tmp1, [pmc, #AT91_PMC_SR] +	tst	tmp1, #AT91_PMC_MCKRDY  	beq	1b  2:  	.endm @@ -65,12 +64,12 @@   * Wait until master oscillator has stabilized.   */  	.macro wait_moscrdy -	mov	r4, #MOSCRDY_TIMEOUT -1:	sub	r4, r4, #1 -	cmp	r4, #0 +	mov	tmp2, #MOSCRDY_TIMEOUT +1:	sub	tmp2, tmp2, #1 +	cmp	tmp2, #0  	beq	2f -	ldr	r3, [r1, #(AT91_PMC_SR - AT91_PMC)] -	tst	r3, #AT91_PMC_MOSCS +	ldr	tmp1, [pmc, #AT91_PMC_SR] +	tst	tmp1, #AT91_PMC_MOSCS  	beq	1b  2:  	.endm @@ -79,12 +78,12 @@   * Wait until PLLA has locked.   */  	.macro wait_pllalock -	mov	r4, #PLLALOCK_TIMEOUT -1:	sub	r4, r4, #1 -	cmp	r4, #0 +	mov	tmp2, #PLLALOCK_TIMEOUT +1:	sub	tmp2, tmp2, #1 +	cmp	tmp2, #0  	beq	2f -	ldr	r3, [r1, #(AT91_PMC_SR - AT91_PMC)] -	tst	r3, #AT91_PMC_LOCKA +	ldr	tmp1, [pmc, #AT91_PMC_SR] +	tst	tmp1, #AT91_PMC_LOCKA  	beq	1b  2:  	.endm @@ -93,79 +92,98 @@   * Wait until PLLB has locked.   */  	.macro wait_pllblock -	mov	r4, #PLLBLOCK_TIMEOUT -1:	sub	r4, r4, #1 -	cmp	r4, #0 +	mov	tmp2, #PLLBLOCK_TIMEOUT +1:	sub	tmp2, tmp2, #1 +	cmp	tmp2, #0  	beq	2f -	ldr	r3, [r1, #(AT91_PMC_SR - AT91_PMC)] -	tst	r3, #AT91_PMC_LOCKB +	ldr	tmp1, [pmc, #AT91_PMC_SR] +	tst	tmp1, #AT91_PMC_LOCKB  	beq	1b  2:  	.endm  	.text +/* void at91_slow_clock(void __iomem *pmc, void __iomem *sdramc, + *			void __iomem *ramc1, int memctrl) + */  ENTRY(at91_slow_clock)  	/* Save registers on stack */ -	stmfd	sp!, {r0 - r12, lr} +	stmfd	sp!, {r4 - r12, lr}  	/*  	 * Register usage: -	 *  R1 = Base address of AT91_PMC -	 *  R2 = Base address of RAM Controller (SDRAM, DDRSDR, or AT91_SYS) -	 *  R3 = temporary register +	 *  R0 = Base address of AT91_PMC +	 *  R1 = Base address of RAM Controller (SDRAM, DDRSDR, or AT91_SYS) +	 *  R2 = Base address of second RAM Controller or 0 if not present +	 *  R3 = Memory controller  	 *  R4 = temporary register -	 *  R5 = Base address of second RAM Controller or 0 if not present +	 *  R5 = temporary register  	 */ -	ldr	r1, .at91_va_base_pmc -	ldr	r2, .at91_va_base_sdramc -	ldr	r5, .at91_va_base_ramc1  	/* Drain write buffer */ -	mov	r0, #0 -	mcr	p15, 0, r0, c7, c10, 4 +	mov	tmp1, #0 +	mcr	p15, 0, tmp1, c7, c10, 4 + +	cmp	memctrl, #AT91_MEMCTRL_MC +	bne	ddr_sr_enable -#ifdef CONFIG_ARCH_AT91RM9200 +	/* +	 * at91rm9200 Memory controller +	 */  	/* Put SDRAM in self-refresh mode */ -	mov	r3, #1 -	str	r3, [r2, #AT91_SDRAMC_SRR] -#elif defined(CONFIG_ARCH_AT91SAM9G45) +	mov	tmp1, #1 +	str	tmp1, [sdramc, #AT91RM9200_SDRAMC_SRR] +	b	sdr_sr_done + +	/* +	 * DDRSDR Memory controller +	 */ +ddr_sr_enable: +	cmp	memctrl, #AT91_MEMCTRL_DDRSDR +	bne	sdr_sr_enable  	/* prepare for DDRAM self-refresh mode */ -	ldr	r3, [r2, #AT91_DDRSDRC_LPR] -	str	r3, .saved_sam9_lpr -	bic	r3, #AT91_DDRSDRC_LPCB -	orr	r3, #AT91_DDRSDRC_LPCB_SELF_REFRESH +	ldr	tmp1, [sdramc, #AT91_DDRSDRC_LPR] +	str	tmp1, .saved_sam9_lpr +	bic	tmp1, #AT91_DDRSDRC_LPCB +	orr	tmp1, #AT91_DDRSDRC_LPCB_SELF_REFRESH  	/* figure out if we use the second ram controller */ -	cmp	r5, #0 -	ldrne	r4, [r5, #AT91_DDRSDRC_LPR] -	strne	r4, .saved_sam9_lpr1 -	bicne	r4, #AT91_DDRSDRC_LPCB -	orrne	r4, #AT91_DDRSDRC_LPCB_SELF_REFRESH +	cmp	ramc1, #0 +	ldrne	tmp2, [ramc1, #AT91_DDRSDRC_LPR] +	strne	tmp2, .saved_sam9_lpr1 +	bicne	tmp2, #AT91_DDRSDRC_LPCB +	orrne	tmp2, #AT91_DDRSDRC_LPCB_SELF_REFRESH  	/* Enable DDRAM self-refresh mode */ -	str	r3, [r2, #AT91_DDRSDRC_LPR] -	strne	r4, [r5, #AT91_DDRSDRC_LPR] -#else +	str	tmp1, [sdramc, #AT91_DDRSDRC_LPR] +	strne	tmp2, [ramc1, #AT91_DDRSDRC_LPR] + +	b	sdr_sr_done + +	/* +	 * SDRAMC Memory controller +	 */ +sdr_sr_enable:  	/* Enable SDRAM self-refresh mode */ -	ldr	r3, [r2, #AT91_SDRAMC_LPR] -	str	r3, .saved_sam9_lpr +	ldr	tmp1, [sdramc, #AT91_SDRAMC_LPR] +	str	tmp1, .saved_sam9_lpr -	bic	r3, #AT91_SDRAMC_LPCB -	orr	r3, #AT91_SDRAMC_LPCB_SELF_REFRESH -	str	r3, [r2, #AT91_SDRAMC_LPR] -#endif +	bic	tmp1, #AT91_SDRAMC_LPCB +	orr	tmp1, #AT91_SDRAMC_LPCB_SELF_REFRESH +	str	tmp1, [sdramc, #AT91_SDRAMC_LPR] +sdr_sr_done:  	/* Save Master clock setting */ -	ldr	r3, [r1, #(AT91_PMC_MCKR - AT91_PMC)] -	str	r3, .saved_mckr +	ldr	tmp1, [pmc, #AT91_PMC_MCKR] +	str	tmp1, .saved_mckr  	/*  	 * Set the Master clock source to slow clock  	 */ -	bic	r3, r3, #AT91_PMC_CSS -	str	r3, [r1, #(AT91_PMC_MCKR - AT91_PMC)] +	bic	tmp1, tmp1, #AT91_PMC_CSS +	str	tmp1, [pmc, #AT91_PMC_MCKR]  	wait_mckrdy @@ -175,61 +193,61 @@ ENTRY(at91_slow_clock)  	 *  	 * See AT91RM9200 errata #27 and #28 for details.  	 */ -	mov	r3, #0 -	str	r3, [r1, #(AT91_PMC_MCKR - AT91_PMC)] +	mov	tmp1, #0 +	str	tmp1, [pmc, #AT91_PMC_MCKR]  	wait_mckrdy  #endif  	/* Save PLLA setting and disable it */ -	ldr	r3, [r1, #(AT91_CKGR_PLLAR - AT91_PMC)] -	str	r3, .saved_pllar +	ldr	tmp1, [pmc, #AT91_CKGR_PLLAR] +	str	tmp1, .saved_pllar -	mov	r3, #AT91_PMC_PLLCOUNT -	orr	r3, r3, #(1 << 29)		/* bit 29 always set */ -	str	r3, [r1, #(AT91_CKGR_PLLAR - AT91_PMC)] +	mov	tmp1, #AT91_PMC_PLLCOUNT +	orr	tmp1, tmp1, #(1 << 29)		/* bit 29 always set */ +	str	tmp1, [pmc, #AT91_CKGR_PLLAR]  	/* Save PLLB setting and disable it */ -	ldr	r3, [r1, #(AT91_CKGR_PLLBR - AT91_PMC)] -	str	r3, .saved_pllbr +	ldr	tmp1, [pmc, #AT91_CKGR_PLLBR] +	str	tmp1, .saved_pllbr -	mov	r3, #AT91_PMC_PLLCOUNT -	str	r3, [r1, #(AT91_CKGR_PLLBR - AT91_PMC)] +	mov	tmp1, #AT91_PMC_PLLCOUNT +	str	tmp1, [pmc, #AT91_CKGR_PLLBR]  	/* Turn off the main oscillator */ -	ldr	r3, [r1, #(AT91_CKGR_MOR - AT91_PMC)] -	bic	r3, r3, #AT91_PMC_MOSCEN -	str	r3, [r1, #(AT91_CKGR_MOR - AT91_PMC)] +	ldr	tmp1, [pmc, #AT91_CKGR_MOR] +	bic	tmp1, tmp1, #AT91_PMC_MOSCEN +	str	tmp1, [pmc, #AT91_CKGR_MOR]  	/* Wait for interrupt */ -	mcr	p15, 0, r0, c7, c0, 4 +	mcr	p15, 0, tmp1, c7, c0, 4  	/* Turn on the main oscillator */ -	ldr	r3, [r1, #(AT91_CKGR_MOR - AT91_PMC)] -	orr	r3, r3, #AT91_PMC_MOSCEN -	str	r3, [r1, #(AT91_CKGR_MOR - AT91_PMC)] +	ldr	tmp1, [pmc, #AT91_CKGR_MOR] +	orr	tmp1, tmp1, #AT91_PMC_MOSCEN +	str	tmp1, [pmc, #AT91_CKGR_MOR]  	wait_moscrdy  	/* Restore PLLB setting */ -	ldr	r3, .saved_pllbr -	str	r3, [r1, #(AT91_CKGR_PLLBR - AT91_PMC)] +	ldr	tmp1, .saved_pllbr +	str	tmp1, [pmc, #AT91_CKGR_PLLBR] -	tst	r3, #(AT91_PMC_MUL &  0xff0000) +	tst	tmp1, #(AT91_PMC_MUL &  0xff0000)  	bne	1f -	tst	r3, #(AT91_PMC_MUL & ~0xff0000) +	tst	tmp1, #(AT91_PMC_MUL & ~0xff0000)  	beq	2f  1:  	wait_pllblock  2:  	/* Restore PLLA setting */ -	ldr	r3, .saved_pllar -	str	r3, [r1, #(AT91_CKGR_PLLAR - AT91_PMC)] +	ldr	tmp1, .saved_pllar +	str	tmp1, [pmc, #AT91_CKGR_PLLAR] -	tst	r3, #(AT91_PMC_MUL &  0xff0000) +	tst	tmp1, #(AT91_PMC_MUL &  0xff0000)  	bne	3f -	tst	r3, #(AT91_PMC_MUL & ~0xff0000) +	tst	tmp1, #(AT91_PMC_MUL & ~0xff0000)  	beq	4f  3:  	wait_pllalock @@ -242,11 +260,11 @@ ENTRY(at91_slow_clock)  	 *  	 * See AT91RM9200 errata #27 and #28 for details.  	 */ -	ldr	r3, .saved_mckr -	tst	r3, #AT91_PMC_PRES +	ldr	tmp1, .saved_mckr +	tst	tmp1, #AT91_PMC_PRES  	beq	2f -	and	r3, r3, #AT91_PMC_PRES -	str	r3, [r1, #(AT91_PMC_MCKR - AT91_PMC)] +	and	tmp1, tmp1, #AT91_PMC_PRES +	str	tmp1, [pmc, #AT91_PMC_MCKR]  	wait_mckrdy  #endif @@ -254,31 +272,45 @@ ENTRY(at91_slow_clock)  	/*  	 * Restore master clock setting  	 */ -2:	ldr	r3, .saved_mckr -	str	r3, [r1, #(AT91_PMC_MCKR - AT91_PMC)] +2:	ldr	tmp1, .saved_mckr +	str	tmp1, [pmc, #AT91_PMC_MCKR]  	wait_mckrdy -#ifdef CONFIG_ARCH_AT91RM9200 -	/* Do nothing - self-refresh is automatically disabled. */ -#elif defined(CONFIG_ARCH_AT91SAM9G45) +	/* +	 * at91rm9200 Memory controller +	 * Do nothing - self-refresh is automatically disabled. +	 */ +	cmp	memctrl, #AT91_MEMCTRL_MC +	beq	ram_restored + +	/* +	 * DDRSDR Memory controller +	 */ +	cmp	memctrl, #AT91_MEMCTRL_DDRSDR +	bne	sdr_en_restore  	/* Restore LPR on AT91 with DDRAM */ -	ldr	r3, .saved_sam9_lpr -	str	r3, [r2, #AT91_DDRSDRC_LPR] +	ldr	tmp1, .saved_sam9_lpr +	str	tmp1, [sdramc, #AT91_DDRSDRC_LPR]  	/* if we use the second ram controller */ -	cmp	r5, #0 -	ldrne	r4, .saved_sam9_lpr1 -	strne	r4, [r5, #AT91_DDRSDRC_LPR] +	cmp	ramc1, #0 +	ldrne	tmp2, .saved_sam9_lpr1 +	strne	tmp2, [ramc1, #AT91_DDRSDRC_LPR] -#else +	b	ram_restored + +	/* +	 * SDRAMC Memory controller +	 */ +sdr_en_restore:  	/* Restore LPR on AT91 with SDRAM */ -	ldr	r3, .saved_sam9_lpr -	str	r3, [r2, #AT91_SDRAMC_LPR] -#endif +	ldr	tmp1, .saved_sam9_lpr +	str	tmp1, [sdramc, #AT91_SDRAMC_LPR] +ram_restored:  	/* Restore registers, and return */ -	ldmfd	sp!, {r0 - r12, pc} +	ldmfd	sp!, {r4 - r12, pc}  .saved_mckr: @@ -296,26 +328,5 @@ ENTRY(at91_slow_clock)  .saved_sam9_lpr1:  	.word 0 -.at91_va_base_pmc: -	.word AT91_VA_BASE_SYS + AT91_PMC - -#ifdef CONFIG_ARCH_AT91RM9200 -.at91_va_base_sdramc: -	.word AT91_VA_BASE_SYS -#elif defined(CONFIG_ARCH_AT91SAM9G45) -.at91_va_base_sdramc: -	.word AT91_VA_BASE_SYS + AT91_DDRSDRC0 -#else -.at91_va_base_sdramc: -	.word AT91_VA_BASE_SYS + AT91_SDRAMC0 -#endif - -.at91_va_base_ramc1: -#if defined(CONFIG_ARCH_AT91SAM9G45) -	.word AT91_VA_BASE_SYS + AT91_DDRSDRC1 -#else -	.word 0 -#endif -  ENTRY(at91_slow_clock_sz)  	.word .-at91_slow_clock diff --git a/arch/arm/mach-at91/setup.c b/arch/arm/mach-at91/setup.c index 620c67e8f81..372396c2ecb 100644 --- a/arch/arm/mach-at91/setup.c +++ b/arch/arm/mach-at91/setup.c @@ -276,6 +276,15 @@ void __init at91_ioremap_rstc(u32 base_addr)  		panic("Impossible to ioremap at91_rstc_base\n");  } +void __iomem *at91_matrix_base; + +void __init at91_ioremap_matrix(u32 base_addr) +{ +	at91_matrix_base = ioremap(base_addr, 512); +	if (!at91_matrix_base) +		panic("Impossible to ioremap at91_matrix_base\n"); +} +  void __init at91_initialize(unsigned long main_clock)  {  	at91_boot_soc.ioremap_registers(); diff --git a/arch/arm/mach-imx/Kconfig b/arch/arm/mach-imx/Kconfig index feeebde71de..52359f80c42 100644 --- a/arch/arm/mach-imx/Kconfig +++ b/arch/arm/mach-imx/Kconfig @@ -373,6 +373,14 @@ config MACH_IMX27IPCAM  	  Include support for IMX27 IPCAM platform. This includes specific  	  configurations for the board and its peripherals. +config MACH_IMX27_DT +	bool "Support i.MX27 platforms from device tree" +	select SOC_IMX27 +	select USE_OF +	help +	  Include support for Freescale i.MX27 based platforms +	  using the device tree for discovery +  endif  if ARCH_IMX_V6_V7 diff --git a/arch/arm/mach-imx/Makefile b/arch/arm/mach-imx/Makefile index 1ca9558723c..35fc450fa26 100644 --- a/arch/arm/mach-imx/Makefile +++ b/arch/arm/mach-imx/Makefile @@ -41,6 +41,7 @@ obj-$(CONFIG_MACH_EUKREA_MBIMX27_BASEBOARD) += eukrea_mbimx27-baseboard.o  obj-$(CONFIG_MACH_PCA100) += mach-pca100.o  obj-$(CONFIG_MACH_MXT_TD60) += mach-mxt_td60.o  obj-$(CONFIG_MACH_IMX27IPCAM) += mach-imx27ipcam.o +obj-$(CONFIG_MACH_IMX27_DT) += imx27-dt.o  # i.MX31 based machines  obj-$(CONFIG_MACH_MX31ADS) += mach-mx31ads.o diff --git a/arch/arm/mach-imx/Makefile.boot b/arch/arm/mach-imx/Makefile.boot index 6dfdbcc83af..3851d8a2787 100644 --- a/arch/arm/mach-imx/Makefile.boot +++ b/arch/arm/mach-imx/Makefile.boot @@ -38,5 +38,8 @@ zreladdr-$(CONFIG_SOC_IMX6Q)	+= 0x10008000  params_phys-$(CONFIG_SOC_IMX6Q)	:= 0x10000100  initrd_phys-$(CONFIG_SOC_IMX6Q)	:= 0x10800000 +dtb-$(CONFIG_MACH_IMX51_DT) += imx51-babbage.dtb +dtb-$(CONFIG_MACH_IMX53_DT) += imx53-ard.dtb imx53-evk.dtb \ +			       imx53-qsb.dtb imx53-smd.dtb  dtb-$(CONFIG_SOC_IMX6Q)	+= imx6q-arm2.dtb \  			   imx6q-sabrelite.dtb diff --git a/arch/arm/mach-imx/clock-imx27.c b/arch/arm/mach-imx/clock-imx27.c index dc2d7a511d9..b9a95ed7555 100644 --- a/arch/arm/mach-imx/clock-imx27.c +++ b/arch/arm/mach-imx/clock-imx27.c @@ -22,6 +22,7 @@  #include <linux/io.h>  #include <linux/module.h>  #include <linux/clkdev.h> +#include <linux/of.h>  #include <asm/div64.h> @@ -764,3 +765,20 @@ int __init mx27_clocks_init(unsigned long fref)  	return 0;  } +#ifdef CONFIG_OF +int __init mx27_clocks_init_dt(void) +{ +	struct device_node *np; +	u32 fref = 26000000; /* default */ + +	for_each_compatible_node(np, NULL, "fixed-clock") { +		if (!of_device_is_compatible(np, "fsl,imx-osc26m")) +			continue; + +		if (!of_property_read_u32(np, "clock-frequency", &fref)) +			break; +	} + +	return mx27_clocks_init(fref); +} +#endif diff --git a/arch/arm/mach-imx/imx27-dt.c b/arch/arm/mach-imx/imx27-dt.c new file mode 100644 index 00000000000..861ceb8232d --- /dev/null +++ b/arch/arm/mach-imx/imx27-dt.c @@ -0,0 +1,89 @@ +/* + * Copyright 2012 Sascha Hauer, Pengutronix + * + * 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/mx27.h> + +static const struct of_dev_auxdata imx27_auxdata_lookup[] __initconst = { +	OF_DEV_AUXDATA("fsl,imx27-uart", MX27_UART1_BASE_ADDR, "imx21-uart.0", NULL), +	OF_DEV_AUXDATA("fsl,imx27-uart", MX27_UART2_BASE_ADDR, "imx21-uart.1", NULL), +	OF_DEV_AUXDATA("fsl,imx27-uart", MX27_UART3_BASE_ADDR, "imx21-uart.2", NULL), +	OF_DEV_AUXDATA("fsl,imx27-fec", MX27_FEC_BASE_ADDR, "imx27-fec.0", NULL), +	OF_DEV_AUXDATA("fsl,imx27-i2c", MX27_I2C1_BASE_ADDR, "imx-i2c.0", NULL), +	OF_DEV_AUXDATA("fsl,imx27-i2c", MX27_I2C2_BASE_ADDR, "imx-i2c.1", NULL), +	OF_DEV_AUXDATA("fsl,imx27-cspi", MX27_CSPI1_BASE_ADDR, "imx27-cspi.0", NULL), +	OF_DEV_AUXDATA("fsl,imx27-cspi", MX27_CSPI2_BASE_ADDR, "imx27-cspi.1", NULL), +	OF_DEV_AUXDATA("fsl,imx27-cspi", MX27_CSPI3_BASE_ADDR, "imx27-cspi.2", NULL), +	OF_DEV_AUXDATA("fsl,imx27-wdt", MX27_WDOG_BASE_ADDR, "imx2-wdt.0", NULL), +	{ /* sentinel */ } +}; + +static int __init imx27_avic_add_irq_domain(struct device_node *np, +				struct device_node *interrupt_parent) +{ +	irq_domain_add_simple(np, 0); +	return 0; +} + +static int __init imx27_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; + +	irq_domain_add_simple(np, gpio_irq_base); + +	return 0; +} + +static const struct of_device_id imx27_irq_match[] __initconst = { +	{ .compatible = "fsl,imx27-avic", .data = imx27_avic_add_irq_domain, }, +	{ .compatible = "fsl,imx27-gpio", .data = imx27_gpio_add_irq_domain, }, +	{ /* sentinel */ } +}; + +static void __init imx27_dt_init(void) +{ +	of_irq_init(imx27_irq_match); + +	of_platform_populate(NULL, of_default_bus_match_table, +			     imx27_auxdata_lookup, NULL); +} + +static void __init imx27_timer_init(void) +{ +	mx27_clocks_init_dt(); +} + +static struct sys_timer imx27_timer = { +	.init = imx27_timer_init, +}; + +static const char *imx27_dt_board_compat[] __initdata = { +	"fsl,imx27", +	NULL +}; + +DT_MACHINE_START(IMX27_DT, "Freescale i.MX27 (Device Tree Support)") +	.map_io		= mx27_map_io, +	.init_early	= imx27_init_early, +	.init_irq	= mx27_init_irq, +	.handle_irq	= imx27_handle_irq, +	.timer		= &imx27_timer, +	.init_machine	= imx27_dt_init, +	.dt_compat	= imx27_dt_board_compat, +	.restart	= mxc_restart, +MACHINE_END diff --git a/arch/arm/mach-imx/imx51-dt.c b/arch/arm/mach-imx/imx51-dt.c index 1e03ef42faa..5cca573964f 100644 --- a/arch/arm/mach-imx/imx51-dt.c +++ b/arch/arm/mach-imx/imx51-dt.c @@ -104,6 +104,7 @@ static struct sys_timer imx51_timer = {  static const char *imx51_dt_board_compat[] __initdata = {  	"fsl,imx51-babbage", +	"fsl,imx51",  	NULL  }; diff --git a/arch/arm/mach-imx/imx53-dt.c b/arch/arm/mach-imx/imx53-dt.c index fd5be0f20fb..4172279b390 100644 --- a/arch/arm/mach-imx/imx53-dt.c +++ b/arch/arm/mach-imx/imx53-dt.c @@ -114,6 +114,7 @@ static const char *imx53_dt_board_compat[] __initdata = {  	"fsl,imx53-evk",  	"fsl,imx53-qsb",  	"fsl,imx53-smd", +	"fsl,imx53",  	NULL  }; diff --git a/arch/arm/mach-imx/mach-imx6q.c b/arch/arm/mach-imx/mach-imx6q.c index 21f54a8ecc8..7696dfa2bdb 100644 --- a/arch/arm/mach-imx/mach-imx6q.c +++ b/arch/arm/mach-imx/mach-imx6q.c @@ -131,6 +131,7 @@ static struct sys_timer imx6q_timer = {  static const char *imx6q_dt_compat[] __initdata = {  	"fsl,imx6q-arm2",  	"fsl,imx6q-sabrelite", +	"fsl,imx6q",  	NULL,  }; diff --git a/arch/arm/mach-mmp/Kconfig b/arch/arm/mach-mmp/Kconfig index 323d4c9e9f4..5a90b9a3ab6 100644 --- a/arch/arm/mach-mmp/Kconfig +++ b/arch/arm/mach-mmp/Kconfig @@ -2,6 +2,16 @@ if ARCH_MMP  menu "Marvell PXA168/910/MMP2 Implmentations" +config MACH_MMP_DT +	bool "Support MMP2 platforms from device tree" +	select CPU_PXA168 +	select CPU_PXA910 +	select USE_OF +	help +	  Include support for Marvell MMP2 based platforms using +	  the device tree. Needn't select any other machine while +	  MACH_MMP_DT is enabled. +  config MACH_ASPENITE  	bool "Marvell's PXA168 Aspenite Development Board"  	select CPU_PXA168 diff --git a/arch/arm/mach-mmp/Makefile b/arch/arm/mach-mmp/Makefile index ba254a71691..4fc0ff5dc96 100644 --- a/arch/arm/mach-mmp/Makefile +++ b/arch/arm/mach-mmp/Makefile @@ -18,5 +18,6 @@ obj-$(CONFIG_MACH_TTC_DKB)	+= ttc_dkb.o  obj-$(CONFIG_MACH_BROWNSTONE)	+= brownstone.o  obj-$(CONFIG_MACH_FLINT)	+= flint.o  obj-$(CONFIG_MACH_MARVELL_JASPER) += jasper.o +obj-$(CONFIG_MACH_MMP_DT)	+= mmp-dt.o  obj-$(CONFIG_MACH_TETON_BGA)	+= teton_bga.o  obj-$(CONFIG_MACH_GPLUGD)	+= gplugd.o diff --git a/arch/arm/mach-mmp/mmp-dt.c b/arch/arm/mach-mmp/mmp-dt.c new file mode 100644 index 00000000000..67075395e40 --- /dev/null +++ b/arch/arm/mach-mmp/mmp-dt.c @@ -0,0 +1,75 @@ +/* + *  linux/arch/arm/mach-mmp/mmp-dt.c + * + *  Copyright (C) 2012 Marvell Technology Group Ltd. + *  Author: Haojian Zhuang <haojian.zhuang@marvell.com> + * + *  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 + *  publishhed by the Free Software Foundation. + */ + +#include <linux/irq.h> +#include <linux/irqdomain.h> +#include <linux/of_irq.h> +#include <linux/of_platform.h> +#include <asm/mach/arch.h> +#include <mach/irqs.h> + +#include "common.h" + +extern struct sys_timer pxa168_timer; +extern void __init icu_init_irq(void); + +static const struct of_dev_auxdata mmp_auxdata_lookup[] __initconst = { +	OF_DEV_AUXDATA("mrvl,mmp-uart", 0xd4017000, "pxa2xx-uart.0", NULL), +	OF_DEV_AUXDATA("mrvl,mmp-uart", 0xd4018000, "pxa2xx-uart.1", NULL), +	OF_DEV_AUXDATA("mrvl,mmp-uart", 0xd4026000, "pxa2xx-uart.2", NULL), +	OF_DEV_AUXDATA("mrvl,mmp-twsi", 0xd4011000, "pxa2xx-i2c.0", NULL), +	OF_DEV_AUXDATA("mrvl,mmp-twsi", 0xd4025000, "pxa2xx-i2c.1", NULL), +	OF_DEV_AUXDATA("mrvl,mmp-gpio", 0xd4019000, "pxa-gpio", NULL), +	OF_DEV_AUXDATA("mrvl,mmp-rtc", 0xd4010000, "sa1100-rtc", NULL), +	{} +}; + +static int __init mmp_intc_add_irq_domain(struct device_node *np, +					   struct device_node *parent) +{ +	irq_domain_add_simple(np, 0); +	return 0; +} + +static int __init mmp_gpio_add_irq_domain(struct device_node *np, +					   struct device_node *parent) +{ +	irq_domain_add_simple(np, IRQ_GPIO_START); +	return 0; +} + +static const struct of_device_id mmp_irq_match[] __initconst = { +	{ .compatible = "mrvl,mmp-intc", .data = mmp_intc_add_irq_domain, }, +	{ .compatible = "mrvl,mmp-gpio", .data = mmp_gpio_add_irq_domain, }, +	{} +}; + +static void __init mmp_dt_init(void) +{ + +	of_irq_init(mmp_irq_match); + +	of_platform_populate(NULL, of_default_bus_match_table, +			     mmp_auxdata_lookup, NULL); +} + +static const char *pxa168_dt_board_compat[] __initdata = { +	"mrvl,pxa168-aspenite", +	NULL, +}; + +DT_MACHINE_START(PXA168_DT, "Marvell PXA168 (Device Tree Support)") +	.map_io		= mmp_map_io, +	.init_irq	= icu_init_irq, +	.timer		= &pxa168_timer, +	.init_machine	= mmp_dt_init, +	.dt_compat	= pxa168_dt_board_compat, +MACHINE_END diff --git a/arch/arm/mach-mmp/pxa168.c b/arch/arm/mach-mmp/pxa168.c index f10f87d8b66..f7d59c03fc6 100644 --- a/arch/arm/mach-mmp/pxa168.c +++ b/arch/arm/mach-mmp/pxa168.c @@ -64,6 +64,7 @@ static APBC_CLK(ssp4, PXA168_SSP4, 4, 0);  static APBC_CLK(ssp5, PXA168_SSP5, 4, 0);  static APBC_CLK(gpio, PXA168_GPIO, 0, 13000000);  static APBC_CLK(keypad, PXA168_KPC, 0, 32000); +static APBC_CLK(rtc, PXA168_RTC, 8, 32768);  static APMU_CLK(nand, NAND, 0x19b, 156000000);  static APMU_CLK(lcd, LCD, 0x7f, 312000000); @@ -92,6 +93,7 @@ static struct clk_lookup pxa168_clkregs[] = {  	INIT_CLKREG(&clk_keypad, "pxa27x-keypad", NULL),  	INIT_CLKREG(&clk_eth, "pxa168-eth", "MFUCLK"),  	INIT_CLKREG(&clk_usb, "pxa168-ehci", "PXA168-USBCLK"), +	INIT_CLKREG(&clk_rtc, "sa1100-rtc", NULL),  };  static int __init pxa168_init(void) diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig index 36b371face3..8141b76283a 100644 --- a/arch/arm/mach-omap2/Kconfig +++ b/arch/arm/mach-omap2/Kconfig @@ -117,7 +117,6 @@ comment "OMAP Board Type"  config MACH_OMAP_GENERIC  	bool "Generic OMAP2+ board"  	depends on ARCH_OMAP2PLUS -	select USE_OF  	default y  	help  	  Support for generic TI OMAP2+ boards using Flattened Device Tree. diff --git a/arch/arm/mach-omap2/board-generic.c b/arch/arm/mach-omap2/board-generic.c index 45fdfe2bd9d..74e1687b517 100644 --- a/arch/arm/mach-omap2/board-generic.c +++ b/arch/arm/mach-omap2/board-generic.c @@ -12,6 +12,7 @@   * published by the Free Software Foundation.   */  #include <linux/io.h> +#include <linux/of_irq.h>  #include <linux/of_platform.h>  #include <linux/irqdomain.h>  #include <linux/i2c/twl.h> @@ -24,33 +25,23 @@  #include "common.h"  #include "common-board-devices.h" -/* - * XXX: Still needed to boot until the i2c & twl driver is adapted to - * device-tree - */ -#ifdef CONFIG_ARCH_OMAP4 -static struct twl4030_platform_data sdp4430_twldata = { -	.irq_base	= TWL6030_IRQ_BASE, -	.irq_end	= TWL6030_IRQ_END, -}; - -static void __init omap4_i2c_init(void) -{ -	omap4_pmic_init("twl6030", &sdp4430_twldata); -} +#if !(defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)) +#define omap_intc_of_init	NULL +#endif +#ifndef CONFIG_ARCH_OMAP4 +#define gic_of_init		NULL  #endif -#ifdef CONFIG_ARCH_OMAP3 -static struct twl4030_platform_data beagle_twldata = { -	.irq_base	= TWL4030_IRQ_BASE, -	.irq_end	= TWL4030_IRQ_END, +static struct of_device_id irq_match[] __initdata = { +	{ .compatible = "ti,omap2-intc", .data = omap_intc_of_init, }, +	{ .compatible = "arm,cortex-a9-gic", .data = gic_of_init, }, +	{ }  }; -static void __init omap3_i2c_init(void) +static void __init omap_init_irq(void)  { -	omap3_pmic_init("twl4030", &beagle_twldata); +	of_irq_init(irq_match);  } -#endif  static struct of_device_id omap_dt_match_table[] __initdata = {  	{ .compatible = "simple-bus", }, @@ -58,51 +49,24 @@ static struct of_device_id omap_dt_match_table[] __initdata = {  	{ }  }; -static struct of_device_id intc_match[] __initdata = { -	{ .compatible = "ti,omap3-intc", }, -	{ .compatible = "arm,cortex-a9-gic", }, -	{ } -}; -  static void __init omap_generic_init(void)  { -	struct device_node *node = of_find_matching_node(NULL, intc_match); -	if (node) -		irq_domain_add_legacy(node, 32, 0, 0, &irq_domain_simple_ops, NULL); -  	omap_sdrc_init(NULL, NULL);  	of_platform_populate(NULL, omap_dt_match_table, NULL, NULL);  } -#ifdef CONFIG_ARCH_OMAP4 -static void __init omap4_init(void) -{ -	omap4_i2c_init(); -	omap_generic_init(); -} -#endif - -#ifdef CONFIG_ARCH_OMAP3 -static void __init omap3_init(void) -{ -	omap3_i2c_init(); -	omap_generic_init(); -} -#endif - -#if defined(CONFIG_SOC_OMAP2420) +#ifdef CONFIG_SOC_OMAP2420  static const char *omap242x_boards_compat[] __initdata = {  	"ti,omap2420",  	NULL,  };  DT_MACHINE_START(OMAP242X_DT, "Generic OMAP2420 (Flattened Device Tree)") -	.atag_offset	= 0x100,  	.reserve	= omap_reserve,  	.map_io		= omap242x_map_io,  	.init_early	= omap2420_init_early, -	.init_irq	= omap2_init_irq, +	.init_irq	= omap_init_irq,  	.handle_irq	= omap2_intc_handle_irq,  	.init_machine	= omap_generic_init,  	.timer		= &omap2_timer, @@ -111,18 +75,17 @@ DT_MACHINE_START(OMAP242X_DT, "Generic OMAP2420 (Flattened Device Tree)")  MACHINE_END  #endif -#if defined(CONFIG_SOC_OMAP2430) +#ifdef CONFIG_SOC_OMAP2430  static const char *omap243x_boards_compat[] __initdata = {  	"ti,omap2430",  	NULL,  };  DT_MACHINE_START(OMAP243X_DT, "Generic OMAP2430 (Flattened Device Tree)") -	.atag_offset	= 0x100,  	.reserve	= omap_reserve,  	.map_io		= omap243x_map_io,  	.init_early	= omap2430_init_early, -	.init_irq	= omap2_init_irq, +	.init_irq	= omap_init_irq,  	.handle_irq	= omap2_intc_handle_irq,  	.init_machine	= omap_generic_init,  	.timer		= &omap2_timer, @@ -131,18 +94,33 @@ DT_MACHINE_START(OMAP243X_DT, "Generic OMAP2430 (Flattened Device Tree)")  MACHINE_END  #endif -#if defined(CONFIG_ARCH_OMAP3) +#ifdef CONFIG_ARCH_OMAP3 +static struct twl4030_platform_data beagle_twldata = { +	.irq_base	= TWL4030_IRQ_BASE, +	.irq_end	= TWL4030_IRQ_END, +}; + +static void __init omap3_i2c_init(void) +{ +	omap3_pmic_init("twl4030", &beagle_twldata); +} + +static void __init omap3_init(void) +{ +	omap3_i2c_init(); +	omap_generic_init(); +} +  static const char *omap3_boards_compat[] __initdata = {  	"ti,omap3",  	NULL,  };  DT_MACHINE_START(OMAP3_DT, "Generic OMAP3 (Flattened Device Tree)") -	.atag_offset	= 0x100,  	.reserve	= omap_reserve,  	.map_io		= omap3_map_io,  	.init_early	= omap3430_init_early, -	.init_irq	= omap3_init_irq, +	.init_irq	= omap_init_irq,  	.handle_irq	= omap3_intc_handle_irq,  	.init_machine	= omap3_init,  	.timer		= &omap3_timer, @@ -151,18 +129,33 @@ DT_MACHINE_START(OMAP3_DT, "Generic OMAP3 (Flattened Device Tree)")  MACHINE_END  #endif -#if defined(CONFIG_ARCH_OMAP4) +#ifdef CONFIG_ARCH_OMAP4 +static struct twl4030_platform_data sdp4430_twldata = { +	.irq_base	= TWL6030_IRQ_BASE, +	.irq_end	= TWL6030_IRQ_END, +}; + +static void __init omap4_i2c_init(void) +{ +	omap4_pmic_init("twl6030", &sdp4430_twldata); +} + +static void __init omap4_init(void) +{ +	omap4_i2c_init(); +	omap_generic_init(); +} +  static const char *omap4_boards_compat[] __initdata = {  	"ti,omap4",  	NULL,  };  DT_MACHINE_START(OMAP4_DT, "Generic OMAP4 (Flattened Device Tree)") -	.atag_offset	= 0x100,  	.reserve	= omap_reserve,  	.map_io		= omap4_map_io,  	.init_early	= omap4430_init_early, -	.init_irq	= gic_init_irq, +	.init_irq	= omap_init_irq,  	.handle_irq	= gic_handle_irq,  	.init_machine	= omap4_init,  	.timer		= &omap4_timer, diff --git a/arch/arm/mach-omap2/common.h b/arch/arm/mach-omap2/common.h index 4897ec02e79..57da7f406e2 100644 --- a/arch/arm/mach-omap2/common.h +++ b/arch/arm/mach-omap2/common.h @@ -177,6 +177,18 @@ void omap3_intc_handle_irq(struct pt_regs *regs);  extern void __iomem *omap4_get_l2cache_base(void);  #endif +struct device_node; +#ifdef CONFIG_OF +int __init omap_intc_of_init(struct device_node *node, +			     struct device_node *parent); +#else +int __init omap_intc_of_init(struct device_node *node, +			     struct device_node *parent) +{ +	return 0; +} +#endif +  #ifdef CONFIG_SMP  extern void __iomem *omap4_get_scu_base(void);  #else diff --git a/arch/arm/mach-omap2/irq.c b/arch/arm/mach-omap2/irq.c index 6da2d0edee1..65f0d2571c9 100644 --- a/arch/arm/mach-omap2/irq.c +++ b/arch/arm/mach-omap2/irq.c @@ -11,12 +11,16 @@   * for more details.   */  #include <linux/kernel.h> +#include <linux/module.h>  #include <linux/init.h>  #include <linux/interrupt.h>  #include <linux/io.h>  #include <asm/exception.h>  #include <asm/mach/irq.h> +#include <linux/irqdomain.h> +#include <linux/of.h> +#include <linux/of_address.h>  #include <mach/hardware.h> @@ -60,6 +64,8 @@ static struct omap_irq_bank {  	},  }; +static struct irq_domain *domain; +  /* Structure to save interrupt controller context */  struct omap3_intc_regs {  	u32 sysconfig; @@ -150,17 +156,27 @@ omap_alloc_gc(void __iomem *base, unsigned int irq_start, unsigned int num)  				IRQ_NOREQUEST | IRQ_NOPROBE, 0);  } -static void __init omap_init_irq(u32 base, int nr_irqs) +static void __init omap_init_irq(u32 base, int nr_irqs, +				 struct device_node *node)  {  	void __iomem *omap_irq_base;  	unsigned long nr_of_irqs = 0;  	unsigned int nr_banks = 0; -	int i, j; +	int i, j, irq_base;  	omap_irq_base = ioremap(base, SZ_4K);  	if (WARN_ON(!omap_irq_base))  		return; +	irq_base = irq_alloc_descs(-1, 0, nr_irqs, 0); +	if (irq_base < 0) { +		pr_warn("Couldn't allocate IRQ numbers\n"); +		irq_base = 0; +	} + +	domain = irq_domain_add_legacy(node, nr_irqs, irq_base, 0, +				       &irq_domain_simple_ops, NULL); +  	for (i = 0; i < ARRAY_SIZE(irq_banks); i++) {  		struct omap_irq_bank *bank = irq_banks + i; @@ -169,36 +185,36 @@ static void __init omap_init_irq(u32 base, int nr_irqs)  		/* Static mapping, never released */  		bank->base_reg = ioremap(base, SZ_4K);  		if (!bank->base_reg) { -			printk(KERN_ERR "Could not ioremap irq bank%i\n", i); +			pr_err("Could not ioremap irq bank%i\n", i);  			continue;  		}  		omap_irq_bank_init_one(bank);  		for (j = 0; j < bank->nr_irqs; j += 32) -			omap_alloc_gc(bank->base_reg + j, j, 32); +			omap_alloc_gc(bank->base_reg + j, j + irq_base, 32);  		nr_of_irqs += bank->nr_irqs;  		nr_banks++;  	} -	printk(KERN_INFO "Total of %ld interrupts on %d active controller%s\n", -	       nr_of_irqs, nr_banks, nr_banks > 1 ? "s" : ""); +	pr_info("Total of %ld interrupts on %d active controller%s\n", +		nr_of_irqs, nr_banks, nr_banks > 1 ? "s" : "");  }  void __init omap2_init_irq(void)  { -	omap_init_irq(OMAP24XX_IC_BASE, 96); +	omap_init_irq(OMAP24XX_IC_BASE, 96, NULL);  }  void __init omap3_init_irq(void)  { -	omap_init_irq(OMAP34XX_IC_BASE, 96); +	omap_init_irq(OMAP34XX_IC_BASE, 96, NULL);  }  void __init ti81xx_init_irq(void)  { -	omap_init_irq(OMAP34XX_IC_BASE, 128); +	omap_init_irq(OMAP34XX_IC_BASE, 128, NULL);  }  static inline void omap_intc_handle_irq(void __iomem *base_addr, struct pt_regs *regs) @@ -228,8 +244,10 @@ out:  		irqnr = readl_relaxed(base_addr + INTCPS_SIR_IRQ_OFFSET);  		irqnr &= ACTIVEIRQ_MASK; -		if (irqnr) +		if (irqnr) { +			irqnr = irq_find_mapping(domain, irqnr);  			handle_IRQ(irqnr, regs); +		}  	} while (irqnr);  } @@ -239,6 +257,28 @@ asmlinkage void __exception_irq_entry omap2_intc_handle_irq(struct pt_regs *regs  	omap_intc_handle_irq(base_addr, regs);  } +int __init omap_intc_of_init(struct device_node *node, +			     struct device_node *parent) +{ +	struct resource res; +	u32 nr_irqs = 96; + +	if (WARN_ON(!node)) +		return -ENODEV; + +	if (of_address_to_resource(node, 0, &res)) { +		WARN(1, "unable to get intc registers\n"); +		return -EINVAL; +	} + +	if (of_property_read_u32(node, "ti,intc-size", &nr_irqs)) +		pr_warn("unable to get intc-size, default to %d\n", nr_irqs); + +	omap_init_irq(res.start, nr_irqs, of_node_get(node)); + +	return 0; +} +  #ifdef CONFIG_ARCH_OMAP3  static struct omap3_intc_regs intc_context[ARRAY_SIZE(irq_banks)]; diff --git a/arch/arm/mach-omap2/pm.c b/arch/arm/mach-omap2/pm.c index 52787b0eaec..a7bdec69a2b 100644 --- a/arch/arm/mach-omap2/pm.c +++ b/arch/arm/mach-omap2/pm.c @@ -295,6 +295,14 @@ postcore_initcall(omap2_common_pm_init);  static int __init omap2_common_pm_late_init(void)  { +	/* +	 * In the case of DT, the PMIC and SR initialization will be done using +	 * a completely different mechanism. +	 * Disable this part if a DT blob is available. +	 */ +	if (of_have_populated_dt()) +		return 0; +  	/* Init the voltage layer */  	omap_pmic_late_init();  	omap_voltage_late_init(); diff --git a/arch/arm/mach-vexpress/Kconfig b/arch/arm/mach-vexpress/Kconfig index 88c3ba151e8..cf8730d35e7 100644 --- a/arch/arm/mach-vexpress/Kconfig +++ b/arch/arm/mach-vexpress/Kconfig @@ -1,14 +1,55 @@  menu "Versatile Express platform type"  	depends on ARCH_VEXPRESS +config ARCH_VEXPRESS_CORTEX_A5_A9_ERRATA +	bool +	select ARM_ERRATA_720789 +	select ARM_ERRATA_751472 +	select PL310_ERRATA_753970 if CACHE_PL310 +	help +	  Provides common dependencies for Versatile Express platforms +	  based on Cortex-A5 and Cortex-A9 processors. In order to +	  build a working kernel, you must also enable relevant core +	  tile support or Flattened Device Tree based support options. +  config ARCH_VEXPRESS_CA9X4  	bool "Versatile Express Cortex-A9x4 tile" +	select ARCH_VEXPRESS_CORTEX_A5_A9_ERRATA +	select ARM_GIC  	select CPU_V7 +	select HAVE_SMP +	select MIGHT_HAVE_CACHE_L2X0 + +config ARCH_VEXPRESS_DT +	bool "Device Tree support for Versatile Express platforms" +	select ARCH_VEXPRESS_CORTEX_A5_A9_ERRATA  	select ARM_GIC -	select ARM_ERRATA_720789 -	select ARM_ERRATA_751472 -	select PL310_ERRATA_753970 +	select ARM_PATCH_PHYS_VIRT +	select AUTO_ZRELADDR +	select CPU_V7  	select HAVE_SMP  	select MIGHT_HAVE_CACHE_L2X0 +	select USE_OF +	help +	  New Versatile Express platforms require Flattened Device Tree to +	  be passed to the kernel. + +	  This option enables support for systems using Cortex processor based +	  ARM core and logic (FPGA) tiles on the Versatile Express motherboard, +	  for example: + +	  - CoreTile Express A5x2 (V2P-CA5s) +	  - CoreTile Express A9x4 (V2P-CA9) +	  - CoreTile Express A15x2 (V2P-CA15) +	  - LogicTile Express 13MG (V2F-2XV6) with A5, A7, A9 or A15 SMMs +	    (Soft Macrocell Models) +	  - Versatile Express RTSMs (Models) + +	  You must boot using a Flattened Device Tree in order to use these +	  platforms. The traditional (ATAGs) boot method is not usable on +	  these boards with this option. + +	  If your bootloader supports Flattened Device Tree based booting, +	  say Y here.  endmenu diff --git a/arch/arm/mach-vexpress/Makefile.boot b/arch/arm/mach-vexpress/Makefile.boot index 8630b3d10a4..909f85ebf5f 100644 --- a/arch/arm/mach-vexpress/Makefile.boot +++ b/arch/arm/mach-vexpress/Makefile.boot @@ -1,3 +1,9 @@ +# Those numbers are used only by the non-DT V2P-CA9 platform +# The DT-enabled ones require CONFIG_AUTO_ZRELADDR=y     zreladdr-y	+= 0x60008000  params_phys-y	:= 0x60000100  initrd_phys-y	:= 0x60800000 + +dtb-$(CONFIG_ARCH_VEXPRESS_DT)	+= vexpress-v2p-ca5s.dtb \ +				   vexpress-v2p-ca9.dtb \ +				   vexpress-v2p-ca15-tc1.dtb diff --git a/arch/arm/mach-vexpress/core.h b/arch/arm/mach-vexpress/core.h index 33c5a825aba..a3a4980770b 100644 --- a/arch/arm/mach-vexpress/core.h +++ b/arch/arm/mach-vexpress/core.h @@ -3,3 +3,5 @@  /* Tile's peripherals static mappings should start here */  #define V2T_PERIPH 0xf8200000 + +void vexpress_dt_smp_map_io(void); diff --git a/arch/arm/mach-vexpress/include/mach/debug-macro.S b/arch/arm/mach-vexpress/include/mach/debug-macro.S index fd9e6c7ea49..fa8224794e0 100644 --- a/arch/arm/mach-vexpress/include/mach/debug-macro.S +++ b/arch/arm/mach-vexpress/include/mach/debug-macro.S @@ -10,12 +10,34 @@   * published by the Free Software Foundation.   */ -#define DEBUG_LL_UART_OFFSET	0x00009000 +#define DEBUG_LL_PHYS_BASE		0x10000000 +#define DEBUG_LL_UART_OFFSET		0x00009000 + +#define DEBUG_LL_PHYS_BASE_RS1		0x1c000000 +#define DEBUG_LL_UART_OFFSET_RS1	0x00090000 + +#define DEBUG_LL_VIRT_BASE		0xf8000000  		.macro	addruart,rp,rv,tmp -		mov	\rp, #DEBUG_LL_UART_OFFSET -		orr	\rv, \rp, #0xf8000000	@ virtual base -		orr	\rp, \rp, #0x10000000	@ physical base + +		@ Make an educated guess regarding the memory map: +		@ - the original A9 core tile, which has MPCore peripherals +		@   located at 0x1e000000, should use UART at 0x10009000 +		@ - all other (RS1 complaint) tiles use UART mapped +		@   at 0x1c090000 +		mrc	p15, 4, \tmp, c15, c0, 0 +		cmp	\tmp, #0x1e000000 + +		@ Original memory map +		moveq	\rp, #DEBUG_LL_UART_OFFSET +		orreq	\rv, \rp, #DEBUG_LL_VIRT_BASE +		orreq	\rp, \rp, #DEBUG_LL_PHYS_BASE + +		@ RS1 memory map +		movne	\rp, #DEBUG_LL_UART_OFFSET_RS1 +		orrne	\rv, \rp, #DEBUG_LL_VIRT_BASE +		orrne	\rp, \rp, #DEBUG_LL_PHYS_BASE_RS1 +  		.endm  #include <asm/hardware/debug-pl01x.S> diff --git a/arch/arm/mach-vexpress/include/mach/irqs.h b/arch/arm/mach-vexpress/include/mach/irqs.h index 7054cbfc9de..4b10ee7657a 100644 --- a/arch/arm/mach-vexpress/include/mach/irqs.h +++ b/arch/arm/mach-vexpress/include/mach/irqs.h @@ -1,4 +1,4 @@  #define IRQ_LOCALTIMER		29  #define IRQ_LOCALWDOG		30 -#define NR_IRQS	128 +#define NR_IRQS	256 diff --git a/arch/arm/mach-vexpress/include/mach/motherboard.h b/arch/arm/mach-vexpress/include/mach/motherboard.h index b4c498c1dbe..31a92890893 100644 --- a/arch/arm/mach-vexpress/include/mach/motherboard.h +++ b/arch/arm/mach-vexpress/include/mach/motherboard.h @@ -117,6 +117,12 @@ int v2m_cfg_read(u32 devfn, u32 *data);  void v2m_flags_set(u32 data);  /* + * Miscellaneous + */ +#define SYS_MISC_MASTERSITE	(1 << 14) +#define SYS_PROCIDx_HBI_MASK	0xfff + +/*   * Core tile IDs   */  #define V2M_CT_ID_CA9		0x0c000191 diff --git a/arch/arm/mach-vexpress/include/mach/uncompress.h b/arch/arm/mach-vexpress/include/mach/uncompress.h index 7972c5748d0..7dab5596b86 100644 --- a/arch/arm/mach-vexpress/include/mach/uncompress.h +++ b/arch/arm/mach-vexpress/include/mach/uncompress.h @@ -22,7 +22,27 @@  #define AMBA_UART_CR(base)	(*(volatile unsigned char *)((base) + 0x30))  #define AMBA_UART_FR(base)	(*(volatile unsigned char *)((base) + 0x18)) -#define get_uart_base()	(0x10000000 + 0x00009000) +#define UART_BASE	0x10009000 +#define UART_BASE_RS1	0x1c090000 + +static unsigned long get_uart_base(void) +{ +	unsigned long mpcore_periph; + +	/* +	 * Make an educated guess regarding the memory map: +	 * - the original A9 core tile, which has MPCore peripherals +	 *   located at 0x1e000000, should use UART at 0x10009000 +	 * - all other (RS1 complaint) tiles use UART mapped +	 *   at 0x1c090000 +	 */ +	asm("mrc p15, 4, %0, c15, c0, 0" : "=r" (mpcore_periph)); + +	if (mpcore_periph == 0x1e000000) +		return UART_BASE; +	else +		return UART_BASE_RS1; +}  /*   * This does not append a newline diff --git a/arch/arm/mach-vexpress/platsmp.c b/arch/arm/mach-vexpress/platsmp.c index a1ed6d68597..14ba1128ae8 100644 --- a/arch/arm/mach-vexpress/platsmp.c +++ b/arch/arm/mach-vexpress/platsmp.c @@ -12,6 +12,11 @@  #include <linux/errno.h>  #include <linux/smp.h>  #include <linux/io.h> +#include <linux/of_fdt.h> + +#include <asm/smp_scu.h> +#include <asm/hardware/gic.h> +#include <asm/mach/map.h>  #include <mach/motherboard.h> @@ -19,13 +24,156 @@  extern void versatile_secondary_startup(void); +#if defined(CONFIG_OF) + +static enum { +	GENERIC_SCU, +	CORTEX_A9_SCU, +} vexpress_dt_scu __initdata = GENERIC_SCU; + +static struct map_desc vexpress_dt_cortex_a9_scu_map __initdata = { +	.virtual	= V2T_PERIPH, +	/* .pfn	set in vexpress_dt_init_cortex_a9_scu() */ +	.length		= SZ_128, +	.type		= MT_DEVICE, +}; + +static void *vexpress_dt_cortex_a9_scu_base __initdata; + +const static char *vexpress_dt_cortex_a9_match[] __initconst = { +	"arm,cortex-a5-scu", +	"arm,cortex-a9-scu", +	NULL +}; + +static int __init vexpress_dt_find_scu(unsigned long node, +		const char *uname, int depth, void *data) +{ +	if (of_flat_dt_match(node, vexpress_dt_cortex_a9_match)) { +		phys_addr_t phys_addr; +		__be32 *reg = of_get_flat_dt_prop(node, "reg", NULL); + +		if (WARN_ON(!reg)) +			return -EINVAL; + +		phys_addr = be32_to_cpup(reg); +		vexpress_dt_scu = CORTEX_A9_SCU; + +		vexpress_dt_cortex_a9_scu_map.pfn = __phys_to_pfn(phys_addr); +		iotable_init(&vexpress_dt_cortex_a9_scu_map, 1); +		vexpress_dt_cortex_a9_scu_base = ioremap(phys_addr, SZ_256); +		if (WARN_ON(!vexpress_dt_cortex_a9_scu_base)) +			return -EFAULT; +	} + +	return 0; +} + +void __init vexpress_dt_smp_map_io(void) +{ +	if (initial_boot_params) +		WARN_ON(of_scan_flat_dt(vexpress_dt_find_scu, NULL)); +} + +static int __init vexpress_dt_cpus_num(unsigned long node, const char *uname, +		int depth, void *data) +{ +	static int prev_depth = -1; +	static int nr_cpus = -1; + +	if (prev_depth > depth && nr_cpus > 0) +		return nr_cpus; + +	if (nr_cpus < 0 && strcmp(uname, "cpus") == 0) +		nr_cpus = 0; + +	if (nr_cpus >= 0) { +		const char *device_type = of_get_flat_dt_prop(node, +				"device_type", NULL); + +		if (device_type && strcmp(device_type, "cpu") == 0) +			nr_cpus++; +	} + +	prev_depth = depth; + +	return 0; +} + +static void __init vexpress_dt_smp_init_cpus(void) +{ +	int ncores = 0, i; + +	switch (vexpress_dt_scu) { +	case GENERIC_SCU: +		ncores = of_scan_flat_dt(vexpress_dt_cpus_num, NULL); +		break; +	case CORTEX_A9_SCU: +		ncores = scu_get_core_count(vexpress_dt_cortex_a9_scu_base); +		break; +	default: +		WARN_ON(1); +		break; +	} + +	if (ncores < 2) +		return; + +	if (ncores > nr_cpu_ids) { +		pr_warn("SMP: %u cores greater than maximum (%u), clipping\n", +				ncores, nr_cpu_ids); +		ncores = nr_cpu_ids; +	} + +	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) +{ +	int i; + +	switch (vexpress_dt_scu) { +	case GENERIC_SCU: +		for (i = 0; i < max_cpus; i++) +			set_cpu_present(i, true); +		break; +	case CORTEX_A9_SCU: +		scu_enable(vexpress_dt_cortex_a9_scu_base); +		break; +	default: +		WARN_ON(1); +		break; +	} +} + +#else + +static void __init vexpress_dt_smp_init_cpus(void) +{ +	WARN_ON(1); +} + +void __init vexpress_dt_smp_prepare_cpus(unsigned int max_cpus) +{ +	WARN_ON(1); +} + +#endif +  /*   * Initialise the CPU possible map early - this describes the CPUs   * which may be present or become present in the system.   */  void __init smp_init_cpus(void)  { -	ct_desc->init_cpu_map(); +	if (ct_desc) +		ct_desc->init_cpu_map(); +	else +		vexpress_dt_smp_init_cpus(); +  }  void __init platform_smp_prepare_cpus(unsigned int max_cpus) @@ -34,7 +182,10 @@ void __init platform_smp_prepare_cpus(unsigned int max_cpus)  	 * Initialise the present map, which describes the set of CPUs  	 * actually populated at the present time.  	 */ -	ct_desc->smp_enable(max_cpus); +	if (ct_desc) +		ct_desc->smp_enable(max_cpus); +	else +		vexpress_dt_smp_prepare_cpus(max_cpus);  	/*  	 * Write the address of secondary startup into the diff --git a/arch/arm/mach-vexpress/v2m.c b/arch/arm/mach-vexpress/v2m.c index 663a9883192..47cdcca5a7e 100644 --- a/arch/arm/mach-vexpress/v2m.c +++ b/arch/arm/mach-vexpress/v2m.c @@ -6,6 +6,10 @@  #include <linux/amba/mmci.h>  #include <linux/io.h>  #include <linux/init.h> +#include <linux/of_address.h> +#include <linux/of_fdt.h> +#include <linux/of_irq.h> +#include <linux/of_platform.h>  #include <linux/platform_device.h>  #include <linux/ata_platform.h>  #include <linux/smsc911x.h> @@ -21,6 +25,8 @@  #include <asm/mach/map.h>  #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 <asm/hardware/sp810.h>  #include <asm/hardware/gic.h> @@ -430,8 +436,9 @@ static void __init v2m_populate_ct_desc(void)  			ct_desc = ct_descs[i];  	if (!ct_desc) -		panic("vexpress: failed to populate core tile description " -		      "for tile ID 0x%8x\n", current_tile_id); +		panic("vexpress: this kernel does not support core tile ID 0x%08x when booting via ATAGs.\n" +		      "You may need a device tree blob or a different kernel to boot on this board.\n", +		      current_tile_id);  }  static void __init v2m_map_io(void) @@ -476,3 +483,205 @@ MACHINE_START(VEXPRESS, "ARM-Versatile Express")  	.init_machine	= v2m_init,  	.restart	= v2m_restart,  MACHINE_END + +#if defined(CONFIG_ARCH_VEXPRESS_DT) + +static struct map_desc v2m_rs1_io_desc __initdata = { +	.virtual	= V2M_PERIPH, +	.pfn		= __phys_to_pfn(0x1c000000), +	.length		= SZ_2M, +	.type		= MT_DEVICE, +}; + +static int __init v2m_dt_scan_memory_map(unsigned long node, const char *uname, +		int depth, void *data) +{ +	const char **map = data; + +	if (strcmp(uname, "motherboard") != 0) +		return 0; + +	*map = of_get_flat_dt_prop(node, "arm,v2m-memory-map", NULL); + +	return 1; +} + +void __init v2m_dt_map_io(void) +{ +	const char *map = NULL; + +	of_scan_flat_dt(v2m_dt_scan_memory_map, &map); + +	if (map && strcmp(map, "rs1") == 0) +		iotable_init(&v2m_rs1_io_desc, 1); +	else +		iotable_init(v2m_io_desc, ARRAY_SIZE(v2m_io_desc)); + +#if defined(CONFIG_SMP) +	vexpress_dt_smp_map_io(); +#endif +} + +static struct clk_lookup v2m_dt_lookups[] = { +	{	/* AMBA bus clock */ +		.con_id		= "apb_pclk", +		.clk		= &dummy_apb_pclk, +	}, {	/* SP804 timers */ +		.dev_id		= "sp804", +		.con_id		= "v2m-timer0", +		.clk		= &v2m_sp804_clk, +	}, {	/* SP804 timers */ +		.dev_id		= "sp804", +		.con_id		= "v2m-timer1", +		.clk		= &v2m_sp804_clk, +	}, {	/* PL180 MMCI */ +		.dev_id		= "mb:mmci", /* 10005000.mmci */ +		.clk		= &osc2_clk, +	}, {	/* PL050 KMI0 */ +		.dev_id		= "10006000.kmi", +		.clk		= &osc2_clk, +	}, {	/* PL050 KMI1 */ +		.dev_id		= "10007000.kmi", +		.clk		= &osc2_clk, +	}, {	/* PL011 UART0 */ +		.dev_id		= "10009000.uart", +		.clk		= &osc2_clk, +	}, {	/* PL011 UART1 */ +		.dev_id		= "1000a000.uart", +		.clk		= &osc2_clk, +	}, {	/* PL011 UART2 */ +		.dev_id		= "1000b000.uart", +		.clk		= &osc2_clk, +	}, {	/* PL011 UART3 */ +		.dev_id		= "1000c000.uart", +		.clk		= &osc2_clk, +	}, {	/* SP805 WDT */ +		.dev_id		= "1000f000.wdt", +		.clk		= &v2m_ref_clk, +	}, {	/* PL111 CLCD */ +		.dev_id		= "1001f000.clcd", +		.clk		= &osc1_clk, +	}, +	/* RS1 memory map */ +	{	/* PL180 MMCI */ +		.dev_id		= "mb:mmci", /* 1c050000.mmci */ +		.clk		= &osc2_clk, +	}, {	/* PL050 KMI0 */ +		.dev_id		= "1c060000.kmi", +		.clk		= &osc2_clk, +	}, {	/* PL050 KMI1 */ +		.dev_id		= "1c070000.kmi", +		.clk		= &osc2_clk, +	}, {	/* PL011 UART0 */ +		.dev_id		= "1c090000.uart", +		.clk		= &osc2_clk, +	}, {	/* PL011 UART1 */ +		.dev_id		= "1c0a0000.uart", +		.clk		= &osc2_clk, +	}, {	/* PL011 UART2 */ +		.dev_id		= "1c0b0000.uart", +		.clk		= &osc2_clk, +	}, {	/* PL011 UART3 */ +		.dev_id		= "1c0c0000.uart", +		.clk		= &osc2_clk, +	}, {	/* SP805 WDT */ +		.dev_id		= "1c0f0000.wdt", +		.clk		= &v2m_ref_clk, +	}, {	/* PL111 CLCD */ +		.dev_id		= "1c1f0000.clcd", +		.clk		= &osc1_clk, +	}, +}; + +void __init v2m_dt_init_early(void) +{ +	struct device_node *node; +	u32 dt_hbi; + +	node = of_find_compatible_node(NULL, NULL, "arm,vexpress-sysreg"); +	v2m_sysreg_base = of_iomap(node, 0); +	if (WARN_ON(!v2m_sysreg_base)) +		return; + +	/* Confirm board type against DT property, if available */ +	if (of_property_read_u32(allnodes, "arm,hbi", &dt_hbi) == 0) { +		u32 misc = readl(v2m_sysreg_base + V2M_SYS_MISC); +		u32 id = readl(v2m_sysreg_base + (misc & SYS_MISC_MASTERSITE ? +				V2M_SYS_PROCID1 : V2M_SYS_PROCID0)); +		u32 hbi = id & SYS_PROCIDx_HBI_MASK; + +		if (WARN_ON(dt_hbi != hbi)) +			pr_warning("vexpress: DT HBI (%x) is not matching " +					"hardware (%x)!\n", dt_hbi, hbi); +	} + +	clkdev_add_table(v2m_dt_lookups, ARRAY_SIZE(v2m_dt_lookups)); +	versatile_sched_clock_init(v2m_sysreg_base + V2M_SYS_24MHZ, 24000000); +} + +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; +	const char *path; +	int err; + +	node = of_find_compatible_node(NULL, NULL, "arm,sp810"); +	v2m_sysctl_init(of_iomap(node, 0)); + +	err = of_property_read_string(of_aliases, "arm,v2m_timer", &path); +	if (WARN_ON(err)) +		return; +	node = of_find_node_by_path(path); +	v2m_sp804_init(of_iomap(node, 0), irq_of_parse_and_map(node, 0)); +} + +static struct sys_timer v2m_dt_timer = { +	.init = v2m_dt_timer_init, +}; + +static struct of_dev_auxdata v2m_dt_auxdata_lookup[] __initdata = { +	OF_DEV_AUXDATA("arm,vexpress-flash", V2M_NOR0, "physmap-flash", +			&v2m_flash_data), +	OF_DEV_AUXDATA("arm,primecell", V2M_MMCI, "mb:mmci", &v2m_mmci_data), +	/* RS1 memory map */ +	OF_DEV_AUXDATA("arm,vexpress-flash", 0x08000000, "physmap-flash", +			&v2m_flash_data), +	OF_DEV_AUXDATA("arm,primecell", 0x1c050000, "mb:mmci", &v2m_mmci_data), +	{} +}; + +static void __init v2m_dt_init(void) +{ +	l2x0_of_init(0x00400000, 0xfe0fffff); +	of_platform_populate(NULL, of_default_bus_match_table, +			v2m_dt_auxdata_lookup, NULL); +	pm_power_off = v2m_power_off; +} + +const static char *v2m_dt_match[] __initconst = { +	"arm,vexpress", +	NULL, +}; + +DT_MACHINE_START(VEXPRESS_DT, "ARM-Versatile Express") +	.dt_compat	= v2m_dt_match, +	.map_io		= v2m_dt_map_io, +	.init_early	= v2m_dt_init_early, +	.init_irq	= v2m_dt_init_irq, +	.timer		= &v2m_dt_timer, +	.init_machine	= v2m_dt_init, +	.handle_irq	= gic_handle_irq, +	.restart	= v2m_restart, +MACHINE_END + +#endif diff --git a/arch/arm/plat-mxc/include/mach/common.h b/arch/arm/plat-mxc/include/mach/common.h index 7c24e5ab7d5..0319c4a0caf 100644 --- a/arch/arm/plat-mxc/include/mach/common.h +++ b/arch/arm/plat-mxc/include/mach/common.h @@ -65,6 +65,7 @@ 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 mx27_clocks_init_dt(void);  extern int mx51_clocks_init_dt(void);  extern int mx53_clocks_init_dt(void);  extern int mx6q_clocks_init(void); diff --git a/arch/arm/plat-omap/Kconfig b/arch/arm/plat-omap/Kconfig index 8f81503a4df..ce1e9b96ba1 100644 --- a/arch/arm/plat-omap/Kconfig +++ b/arch/arm/plat-omap/Kconfig @@ -14,6 +14,7 @@ config ARCH_OMAP1  	select CLKDEV_LOOKUP  	select CLKSRC_MMIO  	select GENERIC_IRQ_CHIP +	select IRQ_DOMAIN  	select HAVE_IDE  	select NEED_MACH_MEMORY_H  	help @@ -24,6 +25,8 @@ config ARCH_OMAP2PLUS  	select CLKDEV_LOOKUP  	select GENERIC_IRQ_CHIP  	select OMAP_DM_TIMER +	select USE_OF +	select PROC_DEVICETREE if PROC_FS  	help  	  "Systems based on OMAP2, OMAP3 or OMAP4" diff --git a/arch/arm/plat-omap/omap_device.c b/arch/arm/plat-omap/omap_device.c index 6de28ea3cd6..d50cbc6385b 100644 --- a/arch/arm/plat-omap/omap_device.c +++ b/arch/arm/plat-omap/omap_device.c @@ -340,7 +340,7 @@ static int omap_device_build_from_dt(struct platform_device *pdev)  	oh_cnt = of_property_count_strings(node, "ti,hwmods");  	if (!oh_cnt || IS_ERR_VALUE(oh_cnt)) { -		dev_warn(&pdev->dev, "No 'hwmods' to build omap_device\n"); +		dev_dbg(&pdev->dev, "No 'hwmods' to build omap_device\n");  		return -ENODEV;  	} diff --git a/arch/avr32/mach-at32ap/at32ap700x.c b/arch/avr32/mach-at32ap/at32ap700x.c index 402a7bb7266..889c544688c 100644 --- a/arch/avr32/mach-at32ap/at32ap700x.c +++ b/arch/avr32/mach-at32ap/at32ap700x.c @@ -1055,8 +1055,6 @@ struct platform_device *__init at32_add_device_usart(unsigned int id)  	return at32_usarts[id];  } -struct platform_device *atmel_default_console_device; -  void __init at32_setup_serial_console(unsigned int usart_id)  {  	atmel_default_console_device = at32_usarts[usart_id]; diff --git a/drivers/clocksource/tcb_clksrc.c b/drivers/clocksource/tcb_clksrc.c index 55d0f95f82f..32cb929b8eb 100644 --- a/drivers/clocksource/tcb_clksrc.c +++ b/drivers/clocksource/tcb_clksrc.c @@ -19,6 +19,8 @@   *   - Two channels combine to create a free-running 32 bit counter   *     with a base rate of 5+ MHz, packaged as a clocksource (with   *     resolution better than 200 nsec). + *   - Some chips support 32 bit counter. A single channel is used for + *     this 32 bit free-running counter. the second channel is not used.   *   *   - The third channel may be used to provide a 16-bit clockevent   *     source, used in either periodic or oneshot mode.  This runs @@ -54,6 +56,11 @@ static cycle_t tc_get_cycles(struct clocksource *cs)  	return (upper << 16) | lower;  } +static cycle_t tc_get_cycles32(struct clocksource *cs) +{ +	return __raw_readl(tcaddr + ATMEL_TC_REG(0, CV)); +} +  static struct clocksource clksrc = {  	.name           = "tcb_clksrc",  	.rating         = 200, @@ -209,6 +216,48 @@ static void __init setup_clkevents(struct atmel_tc *tc, int clk32k_divisor_idx)  #endif +static void __init tcb_setup_dual_chan(struct atmel_tc *tc, int mck_divisor_idx) +{ +	/* channel 0:  waveform mode, input mclk/8, clock TIOA0 on overflow */ +	__raw_writel(mck_divisor_idx			/* likely divide-by-8 */ +			| ATMEL_TC_WAVE +			| ATMEL_TC_WAVESEL_UP		/* free-run */ +			| ATMEL_TC_ACPA_SET		/* TIOA0 rises at 0 */ +			| ATMEL_TC_ACPC_CLEAR,		/* (duty cycle 50%) */ +			tcaddr + ATMEL_TC_REG(0, CMR)); +	__raw_writel(0x0000, tcaddr + ATMEL_TC_REG(0, RA)); +	__raw_writel(0x8000, tcaddr + ATMEL_TC_REG(0, RC)); +	__raw_writel(0xff, tcaddr + ATMEL_TC_REG(0, IDR));	/* no irqs */ +	__raw_writel(ATMEL_TC_CLKEN, tcaddr + ATMEL_TC_REG(0, CCR)); + +	/* channel 1:  waveform mode, input TIOA0 */ +	__raw_writel(ATMEL_TC_XC1			/* input: TIOA0 */ +			| ATMEL_TC_WAVE +			| ATMEL_TC_WAVESEL_UP,		/* free-run */ +			tcaddr + ATMEL_TC_REG(1, CMR)); +	__raw_writel(0xff, tcaddr + ATMEL_TC_REG(1, IDR));	/* no irqs */ +	__raw_writel(ATMEL_TC_CLKEN, tcaddr + ATMEL_TC_REG(1, CCR)); + +	/* chain channel 0 to channel 1*/ +	__raw_writel(ATMEL_TC_TC1XC1S_TIOA0, tcaddr + ATMEL_TC_BMR); +	/* then reset all the timers */ +	__raw_writel(ATMEL_TC_SYNC, tcaddr + ATMEL_TC_BCR); +} + +static void __init tcb_setup_single_chan(struct atmel_tc *tc, int mck_divisor_idx) +{ +	/* channel 0:  waveform mode, input mclk/8 */ +	__raw_writel(mck_divisor_idx			/* likely divide-by-8 */ +			| ATMEL_TC_WAVE +			| ATMEL_TC_WAVESEL_UP,		/* free-run */ +			tcaddr + ATMEL_TC_REG(0, CMR)); +	__raw_writel(0xff, tcaddr + ATMEL_TC_REG(0, IDR));	/* no irqs */ +	__raw_writel(ATMEL_TC_CLKEN, tcaddr + ATMEL_TC_REG(0, CCR)); + +	/* then reset all the timers */ +	__raw_writel(ATMEL_TC_SYNC, tcaddr + ATMEL_TC_BCR); +} +  static int __init tcb_clksrc_init(void)  {  	static char bootinfo[] __initdata @@ -260,34 +309,19 @@ static int __init tcb_clksrc_init(void)  			divided_rate / 1000000,  			((divided_rate + 500000) % 1000000) / 1000); -	/* tclib will give us three clocks no matter what the -	 * underlying platform supports. -	 */ -	clk_enable(tc->clk[1]); - -	/* channel 0:  waveform mode, input mclk/8, clock TIOA0 on overflow */ -	__raw_writel(best_divisor_idx			/* likely divide-by-8 */ -			| ATMEL_TC_WAVE -			| ATMEL_TC_WAVESEL_UP		/* free-run */ -			| ATMEL_TC_ACPA_SET		/* TIOA0 rises at 0 */ -			| ATMEL_TC_ACPC_CLEAR,		/* (duty cycle 50%) */ -			tcaddr + ATMEL_TC_REG(0, CMR)); -	__raw_writel(0x0000, tcaddr + ATMEL_TC_REG(0, RA)); -	__raw_writel(0x8000, tcaddr + ATMEL_TC_REG(0, RC)); -	__raw_writel(0xff, tcaddr + ATMEL_TC_REG(0, IDR));	/* no irqs */ -	__raw_writel(ATMEL_TC_CLKEN, tcaddr + ATMEL_TC_REG(0, CCR)); - -	/* channel 1:  waveform mode, input TIOA0 */ -	__raw_writel(ATMEL_TC_XC1			/* input: TIOA0 */ -			| ATMEL_TC_WAVE -			| ATMEL_TC_WAVESEL_UP,		/* free-run */ -			tcaddr + ATMEL_TC_REG(1, CMR)); -	__raw_writel(0xff, tcaddr + ATMEL_TC_REG(1, IDR));	/* no irqs */ -	__raw_writel(ATMEL_TC_CLKEN, tcaddr + ATMEL_TC_REG(1, CCR)); - -	/* chain channel 0 to channel 1, then reset all the timers */ -	__raw_writel(ATMEL_TC_TC1XC1S_TIOA0, tcaddr + ATMEL_TC_BMR); -	__raw_writel(ATMEL_TC_SYNC, tcaddr + ATMEL_TC_BCR); +	if (tc->tcb_config && tc->tcb_config->counter_width == 32) { +		/* use apropriate function to read 32 bit counter */ +		clksrc.read = tc_get_cycles32; +		/* setup ony channel 0 */ +		tcb_setup_single_chan(tc, best_divisor_idx); +	} else { +		/* tclib will give us three clocks no matter what the +		 * underlying platform supports. +		 */ +		clk_enable(tc->clk[1]); +		/* setup both channel 0 & 1 */ +		tcb_setup_dual_chan(tc, best_divisor_idx); +	}  	/* and away we go! */  	clocksource_register_hz(&clksrc, divided_rate); diff --git a/drivers/i2c/busses/i2c-pxa.c b/drivers/i2c/busses/i2c-pxa.c index d6036465099..f6733267fa9 100644 --- a/drivers/i2c/busses/i2c-pxa.c +++ b/drivers/i2c/busses/i2c-pxa.c @@ -29,6 +29,8 @@  #include <linux/errno.h>  #include <linux/interrupt.h>  #include <linux/i2c-pxa.h> +#include <linux/of.h> +#include <linux/of_device.h>  #include <linux/of_i2c.h>  #include <linux/platform_device.h>  #include <linux/err.h> @@ -1044,23 +1046,60 @@ static const struct i2c_algorithm i2c_pxa_pio_algorithm = {  	.functionality	= i2c_pxa_functionality,  }; -static int i2c_pxa_probe(struct platform_device *dev) +static struct of_device_id i2c_pxa_dt_ids[] = { +	{ .compatible = "mrvl,pxa-i2c", .data = (void *)REGS_PXA2XX }, +	{ .compatible = "mrvl,pwri2c", .data = (void *)REGS_PXA3XX }, +	{ .compatible = "mrvl,mmp-twsi", .data = (void *)REGS_PXA2XX }, +	{} +}; +MODULE_DEVICE_TABLE(of, i2c_pxa_dt_ids); + +static int i2c_pxa_probe_dt(struct platform_device *pdev, struct pxa_i2c *i2c, +			    enum pxa_i2c_types *i2c_types)  { -	struct pxa_i2c *i2c; -	struct resource *res; -	struct i2c_pxa_platform_data *plat = dev->dev.platform_data; -	const struct platform_device_id *id = platform_get_device_id(dev); -	enum pxa_i2c_types i2c_type = id->driver_data; +	struct device_node *np = pdev->dev.of_node; +	const struct of_device_id *of_id = +			of_match_device(i2c_pxa_dt_ids, &pdev->dev);  	int ret; -	int irq; -	res = platform_get_resource(dev, IORESOURCE_MEM, 0); -	irq = platform_get_irq(dev, 0); -	if (res == NULL || irq < 0) -		return -ENODEV; +	if (!of_id) +		return 1; +	ret = of_alias_get_id(np, "i2c"); +	if (ret < 0) { +		dev_err(&pdev->dev, "failed to get alias id, errno %d\n", ret); +		return ret; +	} +	pdev->id = ret; +	if (of_get_property(np, "mrvl,i2c-polling", NULL)) +		i2c->use_pio = 1; +	if (of_get_property(np, "mrvl,i2c-fast-mode", NULL)) +		i2c->fast_mode = 1; +	*i2c_types = (u32)(of_id->data); +	return 0; +} -	if (!request_mem_region(res->start, resource_size(res), res->name)) -		return -ENOMEM; +static int i2c_pxa_probe_pdata(struct platform_device *pdev, +			       struct pxa_i2c *i2c, +			       enum pxa_i2c_types *i2c_types) +{ +	struct i2c_pxa_platform_data *plat = pdev->dev.platform_data; +	const struct platform_device_id *id = platform_get_device_id(pdev); + +	*i2c_types = id->driver_data; +	if (plat) { +		i2c->use_pio = plat->use_pio; +		i2c->fast_mode = plat->fast_mode; +	} +	return 0; +} + +static int i2c_pxa_probe(struct platform_device *dev) +{ +	struct i2c_pxa_platform_data *plat = dev->dev.platform_data; +	enum pxa_i2c_types i2c_type; +	struct pxa_i2c *i2c; +	struct resource *res = NULL; +	int ret, irq;  	i2c = kzalloc(sizeof(struct pxa_i2c), GFP_KERNEL);  	if (!i2c) { @@ -1068,6 +1107,24 @@ static int i2c_pxa_probe(struct platform_device *dev)  		goto emalloc;  	} +	ret = i2c_pxa_probe_dt(dev, i2c, &i2c_type); +	if (ret > 0) +		ret = i2c_pxa_probe_pdata(dev, i2c, &i2c_type); +	if (ret < 0) +		goto eclk; + +	res = platform_get_resource(dev, IORESOURCE_MEM, 0); +	irq = platform_get_irq(dev, 0); +	if (res == NULL || irq < 0) { +		ret = -ENODEV; +		goto eclk; +	} + +	if (!request_mem_region(res->start, resource_size(res), res->name)) { +		ret = -ENOMEM; +		goto eclk; +	} +  	i2c->adap.owner   = THIS_MODULE;  	i2c->adap.retries = 5; @@ -1109,21 +1166,16 @@ static int i2c_pxa_probe(struct platform_device *dev)  	i2c->slave_addr = I2C_PXA_SLAVE_ADDR; -#ifdef CONFIG_I2C_PXA_SLAVE  	if (plat) { +#ifdef CONFIG_I2C_PXA_SLAVE  		i2c->slave_addr = plat->slave_addr;  		i2c->slave = plat->slave; -	}  #endif - -	clk_enable(i2c->clk); - -	if (plat) {  		i2c->adap.class = plat->class; -		i2c->use_pio = plat->use_pio; -		i2c->fast_mode = plat->fast_mode;  	} +	clk_enable(i2c->clk); +  	if (i2c->use_pio) {  		i2c->adap.algo = &i2c_pxa_pio_algorithm;  	} else { @@ -1234,6 +1286,7 @@ static struct platform_driver i2c_pxa_driver = {  		.name	= "pxa2xx-i2c",  		.owner	= THIS_MODULE,  		.pm	= I2C_PXA_DEV_PM_OPS, +		.of_match_table = i2c_pxa_dt_ids,  	},  	.id_table	= i2c_pxa_id_table,  }; diff --git a/drivers/misc/atmel_tclib.c b/drivers/misc/atmel_tclib.c index 4bcfc375973..c8d8e38d0d8 100644 --- a/drivers/misc/atmel_tclib.c +++ b/drivers/misc/atmel_tclib.c @@ -6,12 +6,10 @@  #include <linux/ioport.h>  #include <linux/kernel.h>  #include <linux/platform_device.h> +#include <linux/module.h>  #include <linux/slab.h>  #include <linux/export.h> - -/* Number of bytes to reserve for the iomem resource */ -#define ATMEL_TC_IOMEM_SIZE	256 - +#include <linux/of.h>  /*   * This is a thin library to solve the problem of how to portably allocate @@ -48,10 +46,17 @@ struct atmel_tc *atmel_tc_alloc(unsigned block, const char *name)  	struct atmel_tc		*tc;  	struct platform_device	*pdev = NULL;  	struct resource		*r; +	size_t			size;  	spin_lock(&tc_list_lock);  	list_for_each_entry(tc, &tc_list, node) { -		if (tc->pdev->id == block) { +		if (tc->pdev->dev.of_node) { +			if (of_alias_get_id(tc->pdev->dev.of_node, "tcb") +					== block) { +				pdev = tc->pdev; +				break; +			} +		} else if (tc->pdev->id == block) {  			pdev = tc->pdev;  			break;  		} @@ -61,11 +66,15 @@ struct atmel_tc *atmel_tc_alloc(unsigned block, const char *name)  		goto fail;  	r = platform_get_resource(pdev, IORESOURCE_MEM, 0); -	r = request_mem_region(r->start, ATMEL_TC_IOMEM_SIZE, name);  	if (!r)  		goto fail; -	tc->regs = ioremap(r->start, ATMEL_TC_IOMEM_SIZE); +	size = resource_size(r); +	r = request_mem_region(r->start, size, name); +	if (!r) +		goto fail; + +	tc->regs = ioremap(r->start, size);  	if (!tc->regs)  		goto fail_ioremap; @@ -76,7 +85,7 @@ out:  	return tc;  fail_ioremap: -	release_mem_region(r->start, ATMEL_TC_IOMEM_SIZE); +	release_mem_region(r->start, size);  fail:  	tc = NULL;  	goto out; @@ -96,7 +105,7 @@ void atmel_tc_free(struct atmel_tc *tc)  	spin_lock(&tc_list_lock);  	if (tc->regs) {  		iounmap(tc->regs); -		release_mem_region(tc->iomem->start, ATMEL_TC_IOMEM_SIZE); +		release_mem_region(tc->iomem->start, resource_size(tc->iomem));  		tc->regs = NULL;  		tc->iomem = NULL;  	} @@ -104,6 +113,30 @@ void atmel_tc_free(struct atmel_tc *tc)  }  EXPORT_SYMBOL_GPL(atmel_tc_free); +#if defined(CONFIG_OF) +static struct atmel_tcb_config tcb_rm9200_config = { +	.counter_width = 16, +}; + +static struct atmel_tcb_config tcb_sam9x5_config = { +	.counter_width = 32, +}; + +static const struct of_device_id atmel_tcb_dt_ids[] = { +	{ +		.compatible = "atmel,at91rm9200-tcb", +		.data = &tcb_rm9200_config, +	}, { +		.compatible = "atmel,at91sam9x5-tcb", +		.data = &tcb_sam9x5_config, +	}, { +		/* sentinel */ +	} +}; + +MODULE_DEVICE_TABLE(of, atmel_tcb_dt_ids); +#endif +  static int __init tc_probe(struct platform_device *pdev)  {  	struct atmel_tc *tc; @@ -129,6 +162,14 @@ static int __init tc_probe(struct platform_device *pdev)  		return -EINVAL;  	} +	/* Now take SoC information if available */ +	if (pdev->dev.of_node) { +		const struct of_device_id *match; +		match = of_match_node(atmel_tcb_dt_ids, pdev->dev.of_node); +		if (match) +			tc->tcb_config = match->data; +	} +  	tc->clk[0] = clk;  	tc->clk[1] = clk_get(&pdev->dev, "t1_clk");  	if (IS_ERR(tc->clk[1])) @@ -153,7 +194,10 @@ static int __init tc_probe(struct platform_device *pdev)  }  static struct platform_driver tc_driver = { -	.driver.name	= "atmel_tcb", +	.driver = { +		.name	= "atmel_tcb", +		.of_match_table	= of_match_ptr(atmel_tcb_dt_ids), +	},  };  static int __init tc_init(void) diff --git a/drivers/pcmcia/at91_cf.c b/drivers/pcmcia/at91_cf.c index 4902206f53d..1dd68f50263 100644 --- a/drivers/pcmcia/at91_cf.c +++ b/drivers/pcmcia/at91_cf.c @@ -26,6 +26,7 @@  #include <mach/board.h>  #include <mach/at91rm9200_mc.h> +#include <mach/at91_ramc.h>  /* @@ -156,7 +157,7 @@ static int at91_cf_set_io_map(struct pcmcia_socket *s, struct pccard_io_map *io)  	/*  	 * Use 16 bit accesses unless/until we need 8-bit i/o space.  	 */ -	csr = at91_sys_read(AT91_SMC_CSR(cf->board->chipselect)) & ~AT91_SMC_DBW; +	csr = at91_ramc_read(0, AT91_SMC_CSR(cf->board->chipselect)) & ~AT91_SMC_DBW;  	/*  	 * NOTE: this CF controller ignores IOIS16, so we can't really do @@ -175,7 +176,7 @@ static int at91_cf_set_io_map(struct pcmcia_socket *s, struct pccard_io_map *io)  		csr |= AT91_SMC_DBW_16;  		pr_debug("%s: 16bit i/o bus\n", driver_name);  	} -	at91_sys_write(AT91_SMC_CSR(cf->board->chipselect), csr); +	at91_ramc_write(0, AT91_SMC_CSR(cf->board->chipselect), csr);  	io->start = cf->socket.io_offset;  	io->stop = io->start + SZ_2K - 1; diff --git a/drivers/rtc/rtc-at91sam9.c b/drivers/rtc/rtc-at91sam9.c index 274a0aafe42..831868904e0 100644 --- a/drivers/rtc/rtc-at91sam9.c +++ b/drivers/rtc/rtc-at91sam9.c @@ -57,6 +57,7 @@ struct sam9_rtc {  	void __iomem		*rtt;  	struct rtc_device	*rtcdev;  	u32			imr; +	void __iomem		*gpbr;  };  #define rtt_readl(rtc, field) \ @@ -65,9 +66,9 @@ struct sam9_rtc {  	__raw_writel((val), (rtc)->rtt + AT91_RTT_ ## field)  #define gpbr_readl(rtc) \ -	at91_sys_read(AT91_GPBR + 4 * CONFIG_RTC_DRV_AT91SAM9_GPBR) +	__raw_readl((rtc)->gpbr)  #define gpbr_writel(rtc, val) \ -	at91_sys_write(AT91_GPBR + 4 * CONFIG_RTC_DRV_AT91SAM9_GPBR, (val)) +	__raw_writel((val), (rtc)->gpbr)  /*   * Read current time and date in RTC @@ -287,16 +288,19 @@ static const struct rtc_class_ops at91_rtc_ops = {  /*   * Initialize and install RTC driver   */ -static int __init at91_rtc_probe(struct platform_device *pdev) +static int __devinit at91_rtc_probe(struct platform_device *pdev)  { -	struct resource	*r; +	struct resource	*r, *r_gpbr;  	struct sam9_rtc	*rtc;  	int		ret;  	u32		mr;  	r = platform_get_resource(pdev, IORESOURCE_MEM, 0); -	if (!r) +	r_gpbr = platform_get_resource(pdev, IORESOURCE_MEM, 1); +	if (!r || !r_gpbr) { +		dev_err(&pdev->dev, "need 2 ressources\n");  		return -ENODEV; +	}  	rtc = kzalloc(sizeof *rtc, GFP_KERNEL);  	if (!rtc) @@ -314,6 +318,13 @@ static int __init at91_rtc_probe(struct platform_device *pdev)  		goto fail;  	} +	rtc->gpbr = ioremap(r_gpbr->start, resource_size(r_gpbr)); +	if (!rtc->gpbr) { +		dev_err(&pdev->dev, "failed to map gpbr registers, aborting.\n"); +		ret = -ENOMEM; +		goto fail_gpbr; +	} +  	mr = rtt_readl(rtc, MR);  	/* unless RTT is counting at 1 Hz, re-initialize it */ @@ -340,7 +351,7 @@ static int __init at91_rtc_probe(struct platform_device *pdev)  	if (ret) {  		dev_dbg(&pdev->dev, "can't share IRQ %d?\n", AT91_ID_SYS);  		rtc_device_unregister(rtc->rtcdev); -		goto fail; +		goto fail_register;  	}  	/* NOTE:  sam9260 rev A silicon has a ROM bug which resets the @@ -356,6 +367,8 @@ static int __init at91_rtc_probe(struct platform_device *pdev)  	return 0;  fail_register: +	iounmap(rtc->gpbr); +fail_gpbr:  	iounmap(rtc->rtt);  fail:  	platform_set_drvdata(pdev, NULL); @@ -366,7 +379,7 @@ fail:  /*   * Disable and remove the RTC driver   */ -static int __exit at91_rtc_remove(struct platform_device *pdev) +static int __devexit at91_rtc_remove(struct platform_device *pdev)  {  	struct sam9_rtc	*rtc = platform_get_drvdata(pdev);  	u32		mr = rtt_readl(rtc, MR); @@ -377,6 +390,7 @@ static int __exit at91_rtc_remove(struct platform_device *pdev)  	rtc_device_unregister(rtc->rtcdev); +	iounmap(rtc->gpbr);  	iounmap(rtc->rtt);  	platform_set_drvdata(pdev, NULL);  	kfree(rtc); @@ -440,63 +454,20 @@ static int at91_rtc_resume(struct platform_device *pdev)  #endif  static struct platform_driver at91_rtc_driver = { -	.driver.name	= "rtc-at91sam9", -	.driver.owner	= THIS_MODULE, -	.remove		= __exit_p(at91_rtc_remove), +	.probe		= at91_rtc_probe, +	.remove		= __devexit_p(at91_rtc_remove),  	.shutdown	= at91_rtc_shutdown,  	.suspend	= at91_rtc_suspend,  	.resume		= at91_rtc_resume, +	.driver		= { +		.name	= "rtc-at91sam9", +		.owner	= THIS_MODULE, +	},  }; -/* Chips can have more than one RTT module, and they can be used for more - * than just RTCs.  So we can't just register as "the" RTT driver. - * - * A normal approach in such cases is to create a library to allocate and - * free the modules.  Here we just use bus_find_device() as like such a - * library, binding directly ... no runtime "library" footprint is needed. - */ -static int __init at91_rtc_match(struct device *dev, void *v) -{ -	struct platform_device *pdev = to_platform_device(dev); -	int ret; - -	/* continue searching if this isn't the RTT we need */ -	if (strcmp("at91_rtt", pdev->name) != 0 -			|| pdev->id != CONFIG_RTC_DRV_AT91SAM9_RTT) -		goto fail; - -	/* else we found it ... but fail unless we can bind to the RTC driver */ -	if (dev->driver) { -		dev_dbg(dev, "busy, can't use as RTC!\n"); -		goto fail; -	} -	dev->driver = &at91_rtc_driver.driver; -	if (device_attach(dev) == 0) { -		dev_dbg(dev, "can't attach RTC!\n"); -		goto fail; -	} -	ret = at91_rtc_probe(pdev); -	if (ret == 0) -		return true; - -	dev_dbg(dev, "RTC probe err %d!\n", ret); -fail: -	return false; -} -  static int __init at91_rtc_init(void)  { -	int status; -	struct device *rtc; - -	status = platform_driver_register(&at91_rtc_driver); -	if (status) -		return status; -	rtc = bus_find_device(&platform_bus_type, NULL, -			NULL, at91_rtc_match); -	if (!rtc) -		platform_driver_unregister(&at91_rtc_driver); -	return rtc ? 0 : -ENODEV; +	return platform_driver_register(&at91_rtc_driver);  }  module_init(at91_rtc_init); diff --git a/drivers/tty/serial/atmel_serial.c b/drivers/tty/serial/atmel_serial.c index 10605ecc99a..f9a6be7a9be 100644 --- a/drivers/tty/serial/atmel_serial.c +++ b/drivers/tty/serial/atmel_serial.c @@ -1526,6 +1526,8 @@ void __init atmel_register_uart_fns(struct atmel_port_fns *fns)  	atmel_pops.set_wake	= fns->set_wake;  } +struct platform_device *atmel_default_console_device;	/* the serial console device */ +  #ifdef CONFIG_SERIAL_ATMEL_CONSOLE  static void atmel_console_putchar(struct uart_port *port, int ch)  { diff --git a/drivers/tty/serial/pxa.c b/drivers/tty/serial/pxa.c index e2fd3d8e0ab..5847a4b855f 100644 --- a/drivers/tty/serial/pxa.c +++ b/drivers/tty/serial/pxa.c @@ -36,6 +36,7 @@  #include <linux/circ_buf.h>  #include <linux/delay.h>  #include <linux/interrupt.h> +#include <linux/of.h>  #include <linux/platform_device.h>  #include <linux/tty.h>  #include <linux/tty_flip.h> @@ -44,6 +45,8 @@  #include <linux/io.h>  #include <linux/slab.h> +#define PXA_NAME_LEN		8 +  struct uart_pxa_port {  	struct uart_port        port;  	unsigned char           ier; @@ -51,7 +54,7 @@ struct uart_pxa_port {  	unsigned char           mcr;  	unsigned int            lsr_break_flag;  	struct clk		*clk; -	char			*name; +	char			name[PXA_NAME_LEN];  };  static inline unsigned int serial_in(struct uart_pxa_port *up, int offset) @@ -781,6 +784,31 @@ static const struct dev_pm_ops serial_pxa_pm_ops = {  };  #endif +static struct of_device_id serial_pxa_dt_ids[] = { +	{ .compatible = "mrvl,pxa-uart", }, +	{ .compatible = "mrvl,mmp-uart", }, +	{} +}; +MODULE_DEVICE_TABLE(of, serial_pxa_dt_ids); + +static int serial_pxa_probe_dt(struct platform_device *pdev, +			       struct uart_pxa_port *sport) +{ +	struct device_node *np = pdev->dev.of_node; +	int ret; + +	if (!np) +		return 1; + +	ret = of_alias_get_id(np, "serial"); +	if (ret < 0) { +		dev_err(&pdev->dev, "failed to get alias id, errno %d\n", ret); +		return ret; +	} +	sport->port.line = ret; +	return 0; +} +  static int serial_pxa_probe(struct platform_device *dev)  {  	struct uart_pxa_port *sport; @@ -808,20 +836,16 @@ static int serial_pxa_probe(struct platform_device *dev)  	sport->port.irq = irqres->start;  	sport->port.fifosize = 64;  	sport->port.ops = &serial_pxa_pops; -	sport->port.line = dev->id;  	sport->port.dev = &dev->dev;  	sport->port.flags = UPF_IOREMAP | UPF_BOOT_AUTOCONF;  	sport->port.uartclk = clk_get_rate(sport->clk); -	switch (dev->id) { -	case 0: sport->name = "FFUART"; break; -	case 1: sport->name = "BTUART"; break; -	case 2: sport->name = "STUART"; break; -	case 3: sport->name = "HWUART"; break; -	default: -		sport->name = "???"; -		break; -	} +	ret = serial_pxa_probe_dt(dev, sport); +	if (ret > 0) +		sport->port.line = dev->id; +	else if (ret < 0) +		goto err_clk; +	snprintf(sport->name, PXA_NAME_LEN - 1, "UART%d", sport->port.line + 1);  	sport->port.membase = ioremap(mmres->start, resource_size(mmres));  	if (!sport->port.membase) { @@ -829,7 +853,7 @@ static int serial_pxa_probe(struct platform_device *dev)  		goto err_clk;  	} -	serial_pxa_ports[dev->id] = sport; +	serial_pxa_ports[sport->port.line] = sport;  	uart_add_one_port(&serial_pxa_reg, &sport->port);  	platform_set_drvdata(dev, sport); @@ -866,6 +890,7 @@ static struct platform_driver serial_pxa_driver = {  #ifdef CONFIG_PM  		.pm	= &serial_pxa_pm_ops,  #endif +		.of_match_table = serial_pxa_dt_ids,  	},  }; diff --git a/drivers/usb/gadget/at91_udc.c b/drivers/usb/gadget/at91_udc.c index 15a8cdb2ded..2db5f68f796 100644 --- a/drivers/usb/gadget/at91_udc.c +++ b/drivers/usb/gadget/at91_udc.c @@ -40,6 +40,7 @@  #include <mach/board.h>  #include <mach/cpu.h>  #include <mach/at91sam9261_matrix.h> +#include <mach/at91_matrix.h>  #include "at91_udc.h" @@ -910,9 +911,9 @@ static void pullup(struct at91_udc *udc, int is_on)  		} else if (cpu_is_at91sam9261() || cpu_is_at91sam9g10()) {  			u32	usbpucr; -			usbpucr = at91_sys_read(AT91_MATRIX_USBPUCR); +			usbpucr = at91_matrix_read(AT91_MATRIX_USBPUCR);  			usbpucr |= AT91_MATRIX_USBPUCR_PUON; -			at91_sys_write(AT91_MATRIX_USBPUCR, usbpucr); +			at91_matrix_write(AT91_MATRIX_USBPUCR, usbpucr);  		}  	} else {  		stop_activity(udc); @@ -928,9 +929,9 @@ static void pullup(struct at91_udc *udc, int is_on)  		} else if (cpu_is_at91sam9261() || cpu_is_at91sam9g10()) {  			u32	usbpucr; -			usbpucr = at91_sys_read(AT91_MATRIX_USBPUCR); +			usbpucr = at91_matrix_read(AT91_MATRIX_USBPUCR);  			usbpucr &= ~AT91_MATRIX_USBPUCR_PUON; -			at91_sys_write(AT91_MATRIX_USBPUCR, usbpucr); +			at91_matrix_write(AT91_MATRIX_USBPUCR, usbpucr);  		}  		clk_off(udc);  	} diff --git a/drivers/usb/gadget/atmel_usba_udc.c b/drivers/usb/gadget/atmel_usba_udc.c index 5e10f651ad6..9f98508966d 100644 --- a/drivers/usb/gadget/atmel_usba_udc.c +++ b/drivers/usb/gadget/atmel_usba_udc.c @@ -332,12 +332,12 @@ static int vbus_is_present(struct usba_udc *udc)  static void toggle_bias(int is_on)  { -	unsigned int uckr = at91_sys_read(AT91_CKGR_UCKR); +	unsigned int uckr = at91_pmc_read(AT91_CKGR_UCKR);  	if (is_on) -		at91_sys_write(AT91_CKGR_UCKR, uckr | AT91_PMC_BIASEN); +		at91_pmc_write(AT91_CKGR_UCKR, uckr | AT91_PMC_BIASEN);  	else -		at91_sys_write(AT91_CKGR_UCKR, uckr & ~(AT91_PMC_BIASEN)); +		at91_pmc_write(AT91_CKGR_UCKR, uckr & ~(AT91_PMC_BIASEN));  }  #else diff --git a/drivers/usb/host/ohci-at91.c b/drivers/usb/host/ohci-at91.c index 77afabc77f9..8e855eb0bf8 100644 --- a/drivers/usb/host/ohci-at91.c +++ b/drivers/usb/host/ohci-at91.c @@ -448,10 +448,11 @@ static irqreturn_t ohci_hcd_at91_overcurrent_irq(int irq, void *data)  	/* From the GPIO notifying the over-current situation, find  	 * out the corresponding port */ -	gpio = irq_to_gpio(irq);  	for (port = 0; port < ARRAY_SIZE(pdata->overcurrent_pin); port++) { -		if (pdata->overcurrent_pin[port] == gpio) +		if (gpio_to_irq(pdata->overcurrent_pin[port]) == irq) { +			gpio = pdata->overcurrent_pin[port];  			break; +		}  	}  	if (port == ARRAY_SIZE(pdata->overcurrent_pin)) { diff --git a/drivers/watchdog/at91rm9200_wdt.c b/drivers/watchdog/at91rm9200_wdt.c index b3046dc4b56..7ceefd29ae1 100644 --- a/drivers/watchdog/at91rm9200_wdt.c +++ b/drivers/watchdog/at91rm9200_wdt.c @@ -51,7 +51,7 @@ static unsigned long at91wdt_busy;   */  static inline void at91_wdt_stop(void)  { -	at91_sys_write(AT91_ST_WDMR, AT91_ST_EXTEN); +	at91_st_write(AT91_ST_WDMR, AT91_ST_EXTEN);  }  /* @@ -59,9 +59,9 @@ static inline void at91_wdt_stop(void)   */  static inline void at91_wdt_start(void)  { -	at91_sys_write(AT91_ST_WDMR, AT91_ST_EXTEN | AT91_ST_RSTEN | +	at91_st_write(AT91_ST_WDMR, AT91_ST_EXTEN | AT91_ST_RSTEN |  				(((65536 * wdt_time) >> 8) & AT91_ST_WDV)); -	at91_sys_write(AT91_ST_CR, AT91_ST_WDRST); +	at91_st_write(AT91_ST_CR, AT91_ST_WDRST);  }  /* @@ -69,7 +69,7 @@ static inline void at91_wdt_start(void)   */  static inline void at91_wdt_reload(void)  { -	at91_sys_write(AT91_ST_CR, AT91_ST_WDRST); +	at91_st_write(AT91_ST_CR, AT91_ST_WDRST);  }  /* ......................................................................... */ diff --git a/include/linux/atmel_tc.h b/include/linux/atmel_tc.h index 53ba65e30ca..1d14b1dc1ae 100644 --- a/include/linux/atmel_tc.h +++ b/include/linux/atmel_tc.h @@ -34,10 +34,19 @@  struct clk;  /** + * struct atmel_tcb_config - SoC data for a Timer/Counter Block + * @counter_width: size in bits of a timer counter register + */ +struct atmel_tcb_config { +	size_t	counter_width; +}; + +/**   * struct atmel_tc - information about a Timer/Counter Block   * @pdev: physical device   * @iomem: resource associated with the I/O register   * @regs: mapping through which the I/O registers can be accessed + * @tcb_config: configuration data from SoC   * @irq: irq for each of the three channels   * @clk: internal clock source for each of the three channels   * @node: list node, for tclib internal use @@ -54,6 +63,7 @@ struct atmel_tc {  	struct platform_device	*pdev;  	struct resource		*iomem;  	void __iomem		*regs; +	struct atmel_tcb_config	*tcb_config;  	int			irq[3];  	struct clk		*clk[3];  	struct list_head	node;  |