diff options
96 files changed, 2536 insertions, 555 deletions
diff --git a/Documentation/devicetree/bindings/arm/atmel-at91.txt b/Documentation/devicetree/bindings/arm/atmel-at91.txt index 1aeaf6f2a1ba..ecc81e368715 100644 --- a/Documentation/devicetree/bindings/arm/atmel-at91.txt +++ b/Documentation/devicetree/bindings/arm/atmel-at91.txt | |||
| @@ -30,3 +30,63 @@ One interrupt per TC channel in a TC block: | |||
| 30 | reg = <0xfffdc000 0x100>; | 30 | reg = <0xfffdc000 0x100>; |
| 31 | interrupts = <26 4 27 4 28 4>; | 31 | interrupts = <26 4 27 4 28 4>; |
| 32 | }; | 32 | }; |
| 33 | |||
| 34 | RSTC Reset Controller required properties: | ||
| 35 | - compatible: Should be "atmel,<chip>-rstc". | ||
| 36 | <chip> can be "at91sam9260" or "at91sam9g45" | ||
| 37 | - reg: Should contain registers location and length | ||
| 38 | |||
| 39 | Example: | ||
| 40 | |||
| 41 | rstc@fffffd00 { | ||
| 42 | compatible = "atmel,at91sam9260-rstc"; | ||
| 43 | reg = <0xfffffd00 0x10>; | ||
| 44 | }; | ||
| 45 | |||
| 46 | RAMC SDRAM/DDR Controller required properties: | ||
| 47 | - compatible: Should be "atmel,at91sam9260-sdramc", | ||
| 48 | "atmel,at91sam9g45-ddramc", | ||
| 49 | - reg: Should contain registers location and length | ||
| 50 | For at91sam9263 and at91sam9g45 you must specify 2 entries. | ||
| 51 | |||
| 52 | Examples: | ||
| 53 | |||
| 54 | ramc0: ramc@ffffe800 { | ||
| 55 | compatible = "atmel,at91sam9g45-ddramc"; | ||
| 56 | reg = <0xffffe800 0x200>; | ||
| 57 | }; | ||
| 58 | |||
| 59 | ramc0: ramc@ffffe400 { | ||
| 60 | compatible = "atmel,at91sam9g45-ddramc"; | ||
| 61 | reg = <0xffffe400 0x200 | ||
| 62 | 0xffffe600 0x200>; | ||
| 63 | }; | ||
| 64 | |||
| 65 | SHDWC Shutdown Controller | ||
| 66 | |||
| 67 | required properties: | ||
| 68 | - compatible: Should be "atmel,<chip>-shdwc". | ||
| 69 | <chip> can be "at91sam9260", "at91sam9rl" or "at91sam9x5". | ||
| 70 | - reg: Should contain registers location and length | ||
| 71 | |||
| 72 | optional properties: | ||
| 73 | - atmel,wakeup-mode: String, operation mode of the wakeup mode. | ||
| 74 | Supported values are: "none", "high", "low", "any". | ||
| 75 | - atmel,wakeup-counter: Counter on Wake-up 0 (between 0x0 and 0xf). | ||
| 76 | |||
| 77 | optional at91sam9260 properties: | ||
| 78 | - atmel,wakeup-rtt-timer: boolean to enable Real-time Timer Wake-up. | ||
| 79 | |||
| 80 | optional at91sam9rl properties: | ||
| 81 | - atmel,wakeup-rtc-timer: boolean to enable Real-time Clock Wake-up. | ||
| 82 | - atmel,wakeup-rtt-timer: boolean to enable Real-time Timer Wake-up. | ||
| 83 | |||
| 84 | optional at91sam9x5 properties: | ||
| 85 | - atmel,wakeup-rtc-timer: boolean to enable Real-time Clock Wake-up. | ||
| 86 | |||
| 87 | Example: | ||
| 88 | |||
| 89 | rstc@fffffd00 { | ||
| 90 | compatible = "atmel,at91sam9260-rstc"; | ||
| 91 | reg = <0xfffffd00 0x10>; | ||
| 92 | }; | ||
diff --git a/Documentation/devicetree/bindings/arm/atmel-pmc.txt b/Documentation/devicetree/bindings/arm/atmel-pmc.txt new file mode 100644 index 000000000000..389bed5056e8 --- /dev/null +++ b/Documentation/devicetree/bindings/arm/atmel-pmc.txt | |||
| @@ -0,0 +1,11 @@ | |||
| 1 | * Power Management Controller (PMC) | ||
| 2 | |||
| 3 | Required properties: | ||
| 4 | - compatible: Should be "atmel,at91rm9200-pmc" | ||
| 5 | - reg: Should contain PMC registers location and length | ||
| 6 | |||
| 7 | Examples: | ||
| 8 | pmc: pmc@fffffc00 { | ||
| 9 | compatible = "atmel,at91rm9200-pmc"; | ||
| 10 | reg = <0xfffffc00 0x100>; | ||
| 11 | }; | ||
diff --git a/Documentation/devicetree/bindings/arm/spear.txt b/Documentation/devicetree/bindings/arm/spear.txt new file mode 100644 index 000000000000..f8e54f092328 --- /dev/null +++ b/Documentation/devicetree/bindings/arm/spear.txt | |||
| @@ -0,0 +1,8 @@ | |||
| 1 | ST SPEAr Platforms Device Tree Bindings | ||
| 2 | --------------------------------------- | ||
| 3 | |||
| 4 | Boards with the ST SPEAr600 SoC shall have the following properties: | ||
| 5 | |||
| 6 | Required root node property: | ||
| 7 | |||
| 8 | compatible = "st,spear600"; | ||
diff --git a/Documentation/devicetree/bindings/gpio/gpio_i2c.txt b/Documentation/devicetree/bindings/gpio/gpio_i2c.txt new file mode 100644 index 000000000000..4f8ec947c6bd --- /dev/null +++ b/Documentation/devicetree/bindings/gpio/gpio_i2c.txt | |||
| @@ -0,0 +1,32 @@ | |||
| 1 | Device-Tree bindings for i2c gpio driver | ||
| 2 | |||
| 3 | Required properties: | ||
| 4 | - compatible = "i2c-gpio"; | ||
| 5 | - gpios: sda and scl gpio | ||
| 6 | |||
| 7 | |||
| 8 | Optional properties: | ||
| 9 | - i2c-gpio,sda-open-drain: sda as open drain | ||
| 10 | - i2c-gpio,scl-open-drain: scl as open drain | ||
| 11 | - i2c-gpio,scl-output-only: scl as output only | ||
| 12 | - i2c-gpio,delay-us: delay between GPIO operations (may depend on each platform) | ||
| 13 | - i2c-gpio,timeout-ms: timeout to get data | ||
| 14 | |||
| 15 | Example nodes: | ||
| 16 | |||
| 17 | i2c@0 { | ||
| 18 | compatible = "i2c-gpio"; | ||
| 19 | gpios = <&pioA 23 0 /* sda */ | ||
| 20 | &pioA 24 0 /* scl */ | ||
| 21 | >; | ||
| 22 | i2c-gpio,sda-open-drain; | ||
| 23 | i2c-gpio,scl-open-drain; | ||
| 24 | i2c-gpio,delay-us = <2>; /* ~100 kHz */ | ||
| 25 | #address-cells = <1>; | ||
| 26 | #size-cells = <0>; | ||
| 27 | |||
| 28 | rv3029c2@56 { | ||
| 29 | compatible = "rv3029c2"; | ||
| 30 | reg = <0x56>; | ||
| 31 | }; | ||
| 32 | }; | ||
diff --git a/Documentation/devicetree/bindings/mtd/atmel-nand.txt b/Documentation/devicetree/bindings/mtd/atmel-nand.txt new file mode 100644 index 000000000000..5903ecf6e895 --- /dev/null +++ b/Documentation/devicetree/bindings/mtd/atmel-nand.txt | |||
| @@ -0,0 +1,41 @@ | |||
| 1 | Atmel NAND flash | ||
| 2 | |||
| 3 | Required properties: | ||
| 4 | - compatible : "atmel,at91rm9200-nand". | ||
| 5 | - reg : should specify localbus address and size used for the chip, | ||
| 6 | and if availlable the ECC. | ||
| 7 | - atmel,nand-addr-offset : offset for the address latch. | ||
| 8 | - atmel,nand-cmd-offset : offset for the command latch. | ||
| 9 | - #address-cells, #size-cells : Must be present if the device has sub-nodes | ||
| 10 | representing partitions. | ||
| 11 | |||
| 12 | - gpios : specifies the gpio pins to control the NAND device. detect is an | ||
| 13 | optional gpio and may be set to 0 if not present. | ||
| 14 | |||
| 15 | Optional properties: | ||
| 16 | - nand-ecc-mode : String, operation mode of the NAND ecc mode, soft by default. | ||
| 17 | Supported values are: "none", "soft", "hw", "hw_syndrome", "hw_oob_first", | ||
| 18 | "soft_bch". | ||
| 19 | - nand-bus-width : 8 or 16 bus width if not present 8 | ||
| 20 | - nand-on-flash-bbt: boolean to enable on flash bbt option if not present false | ||
| 21 | |||
| 22 | Examples: | ||
| 23 | nand0: nand@40000000,0 { | ||
| 24 | compatible = "atmel,at91rm9200-nand"; | ||
| 25 | #address-cells = <1>; | ||
| 26 | #size-cells = <1>; | ||
| 27 | reg = <0x40000000 0x10000000 | ||
| 28 | 0xffffe800 0x200 | ||
| 29 | >; | ||
| 30 | atmel,nand-addr-offset = <21>; | ||
| 31 | atmel,nand-cmd-offset = <22>; | ||
| 32 | nand-on-flash-bbt; | ||
| 33 | nand-ecc-mode = "soft"; | ||
| 34 | gpios = <&pioC 13 0 | ||
| 35 | &pioC 14 0 | ||
| 36 | 0 | ||
| 37 | >; | ||
| 38 | partition@0 { | ||
| 39 | ... | ||
| 40 | }; | ||
| 41 | }; | ||
diff --git a/Documentation/devicetree/bindings/mtd/nand.txt b/Documentation/devicetree/bindings/mtd/nand.txt new file mode 100644 index 000000000000..03855c8c492a --- /dev/null +++ b/Documentation/devicetree/bindings/mtd/nand.txt | |||
| @@ -0,0 +1,7 @@ | |||
| 1 | * MTD generic binding | ||
| 2 | |||
| 3 | - nand-ecc-mode : String, operation mode of the NAND ecc mode. | ||
| 4 | Supported values are: "none", "soft", "hw", "hw_syndrome", "hw_oob_first", | ||
| 5 | "soft_bch". | ||
| 6 | - nand-bus-width : 8 or 16 bus width if not present 8 | ||
| 7 | - nand-on-flash-bbt: boolean to enable on flash bbt option if not present false | ||
diff --git a/Documentation/devicetree/bindings/usb/atmel-usb.txt b/Documentation/devicetree/bindings/usb/atmel-usb.txt new file mode 100644 index 000000000000..60bd2150a3e6 --- /dev/null +++ b/Documentation/devicetree/bindings/usb/atmel-usb.txt | |||
| @@ -0,0 +1,49 @@ | |||
| 1 | Atmel SOC USB controllers | ||
| 2 | |||
| 3 | OHCI | ||
| 4 | |||
| 5 | Required properties: | ||
| 6 | - compatible: Should be "atmel,at91rm9200-ohci" for USB controllers | ||
| 7 | used in host mode. | ||
| 8 | - num-ports: Number of ports. | ||
| 9 | - atmel,vbus-gpio: If present, specifies a gpio that needs to be | ||
| 10 | activated for the bus to be powered. | ||
| 11 | - atmel,oc-gpio: If present, specifies a gpio that needs to be | ||
| 12 | activated for the overcurrent detection. | ||
| 13 | |||
| 14 | usb0: ohci@00500000 { | ||
| 15 | compatible = "atmel,at91rm9200-ohci", "usb-ohci"; | ||
| 16 | reg = <0x00500000 0x100000>; | ||
| 17 | interrupts = <20 4>; | ||
| 18 | num-ports = <2>; | ||
| 19 | }; | ||
| 20 | |||
| 21 | EHCI | ||
| 22 | |||
| 23 | Required properties: | ||
| 24 | - compatible: Should be "atmel,at91sam9g45-ehci" for USB controllers | ||
| 25 | used in host mode. | ||
| 26 | |||
| 27 | usb1: ehci@00800000 { | ||
| 28 | compatible = "atmel,at91sam9g45-ehci", "usb-ehci"; | ||
| 29 | reg = <0x00800000 0x100000>; | ||
| 30 | interrupts = <22 4>; | ||
| 31 | }; | ||
| 32 | |||
| 33 | AT91 USB device controller | ||
| 34 | |||
| 35 | Required properties: | ||
| 36 | - compatible: Should be "atmel,at91rm9200-udc" | ||
| 37 | - reg: Address and length of the register set for the device | ||
| 38 | - interrupts: Should contain macb interrupt | ||
| 39 | |||
| 40 | Optional properties: | ||
| 41 | - atmel,vbus-gpio: If present, specifies a gpio that needs to be | ||
| 42 | activated for the bus to be powered. | ||
| 43 | |||
| 44 | usb1: gadget@fffa4000 { | ||
| 45 | compatible = "atmel,at91rm9200-udc"; | ||
| 46 | reg = <0xfffa4000 0x4000>; | ||
| 47 | interrupts = <10 4>; | ||
| 48 | atmel,vbus-gpio = <&pioC 5 0>; | ||
| 49 | }; | ||
diff --git a/Documentation/devicetree/bindings/usb/tegra-usb.txt b/Documentation/devicetree/bindings/usb/tegra-usb.txt index 035d63d5646d..007005ddbe12 100644 --- a/Documentation/devicetree/bindings/usb/tegra-usb.txt +++ b/Documentation/devicetree/bindings/usb/tegra-usb.txt | |||
| @@ -11,3 +11,16 @@ Required properties : | |||
| 11 | - phy_type : Should be one of "ulpi" or "utmi". | 11 | - phy_type : Should be one of "ulpi" or "utmi". |
| 12 | - nvidia,vbus-gpio : If present, specifies a gpio that needs to be | 12 | - nvidia,vbus-gpio : If present, specifies a gpio that needs to be |
| 13 | activated for the bus to be powered. | 13 | activated for the bus to be powered. |
| 14 | |||
| 15 | Optional properties: | ||
| 16 | - dr_mode : dual role mode. Indicates the working mode for | ||
| 17 | nvidia,tegra20-ehci compatible controllers. Can be "host", "peripheral", | ||
| 18 | or "otg". Default to "host" if not defined for backward compatibility. | ||
| 19 | host means this is a host controller | ||
| 20 | peripheral means it is device controller | ||
| 21 | otg means it can operate as either ("on the go") | ||
| 22 | - nvidia,has-legacy-mode : boolean indicates whether this controller can | ||
| 23 | operate in legacy mode (as APX 2500 / 2600). In legacy mode some | ||
| 24 | registers are accessed through the APB_MISC base address instead of | ||
| 25 | the USB controller. Since this is a legacy issue it probably does not | ||
| 26 | warrant a compatible string of its own. | ||
diff --git a/arch/arm/boot/dts/at91sam9g20.dtsi b/arch/arm/boot/dts/at91sam9g20.dtsi index a100db03ec90..92f36627e7f8 100644 --- a/arch/arm/boot/dts/at91sam9g20.dtsi +++ b/arch/arm/boot/dts/at91sam9g20.dtsi | |||
| @@ -59,6 +59,26 @@ | |||
| 59 | reg = <0xfffff000 0x200>; | 59 | reg = <0xfffff000 0x200>; |
| 60 | }; | 60 | }; |
| 61 | 61 | ||
| 62 | ramc0: ramc@ffffea00 { | ||
| 63 | compatible = "atmel,at91sam9260-sdramc"; | ||
| 64 | reg = <0xffffea00 0x200>; | ||
| 65 | }; | ||
| 66 | |||
| 67 | pmc: pmc@fffffc00 { | ||
| 68 | compatible = "atmel,at91rm9200-pmc"; | ||
| 69 | reg = <0xfffffc00 0x100>; | ||
| 70 | }; | ||
| 71 | |||
| 72 | rstc@fffffd00 { | ||
| 73 | compatible = "atmel,at91sam9260-rstc"; | ||
| 74 | reg = <0xfffffd00 0x10>; | ||
| 75 | }; | ||
| 76 | |||
| 77 | shdwc@fffffd10 { | ||
| 78 | compatible = "atmel,at91sam9260-shdwc"; | ||
| 79 | reg = <0xfffffd10 0x10>; | ||
| 80 | }; | ||
| 81 | |||
| 62 | pit: timer@fffffd30 { | 82 | pit: timer@fffffd30 { |
| 63 | compatible = "atmel,at91sam9260-pit"; | 83 | compatible = "atmel,at91sam9260-pit"; |
| 64 | reg = <0xfffffd30 0xf>; | 84 | reg = <0xfffffd30 0xf>; |
| @@ -171,6 +191,49 @@ | |||
| 171 | interrupts = <21 4>; | 191 | interrupts = <21 4>; |
| 172 | status = "disabled"; | 192 | status = "disabled"; |
| 173 | }; | 193 | }; |
| 194 | |||
| 195 | usb1: gadget@fffa4000 { | ||
| 196 | compatible = "atmel,at91rm9200-udc"; | ||
| 197 | reg = <0xfffa4000 0x4000>; | ||
| 198 | interrupts = <10 4>; | ||
| 199 | status = "disabled"; | ||
| 200 | }; | ||
| 201 | }; | ||
| 202 | |||
| 203 | nand0: nand@40000000 { | ||
| 204 | compatible = "atmel,at91rm9200-nand"; | ||
| 205 | #address-cells = <1>; | ||
| 206 | #size-cells = <1>; | ||
| 207 | reg = <0x40000000 0x10000000 | ||
| 208 | 0xffffe800 0x200 | ||
| 209 | >; | ||
| 210 | atmel,nand-addr-offset = <21>; | ||
| 211 | atmel,nand-cmd-offset = <22>; | ||
| 212 | gpios = <&pioC 13 0 | ||
| 213 | &pioC 14 0 | ||
| 214 | 0 | ||
| 215 | >; | ||
| 216 | status = "disabled"; | ||
| 174 | }; | 217 | }; |
| 218 | |||
| 219 | usb0: ohci@00500000 { | ||
| 220 | compatible = "atmel,at91rm9200-ohci", "usb-ohci"; | ||
| 221 | reg = <0x00500000 0x100000>; | ||
| 222 | interrupts = <20 4>; | ||
| 223 | status = "disabled"; | ||
| 224 | }; | ||
| 225 | }; | ||
| 226 | |||
| 227 | i2c@0 { | ||
| 228 | compatible = "i2c-gpio"; | ||
| 229 | gpios = <&pioA 23 0 /* sda */ | ||
| 230 | &pioA 24 0 /* scl */ | ||
| 231 | >; | ||
| 232 | i2c-gpio,sda-open-drain; | ||
| 233 | i2c-gpio,scl-open-drain; | ||
| 234 | i2c-gpio,delay-us = <2>; /* ~100 kHz */ | ||
| 235 | #address-cells = <1>; | ||
| 236 | #size-cells = <0>; | ||
| 237 | status = "disabled"; | ||
| 175 | }; | 238 | }; |
| 176 | }; | 239 | }; |
diff --git a/arch/arm/boot/dts/at91sam9g25ek.dts b/arch/arm/boot/dts/at91sam9g25ek.dts index e64eb932083b..ac0dc0031dda 100644 --- a/arch/arm/boot/dts/at91sam9g25ek.dts +++ b/arch/arm/boot/dts/at91sam9g25ek.dts | |||
| @@ -15,7 +15,7 @@ | |||
| 15 | compatible = "atmel,at91sam9g25ek", "atmel,at91sam9x5ek", "atmel,at91sam9x5", "atmel,at91sam9"; | 15 | compatible = "atmel,at91sam9g25ek", "atmel,at91sam9x5ek", "atmel,at91sam9x5", "atmel,at91sam9"; |
| 16 | 16 | ||
| 17 | chosen { | 17 | chosen { |
| 18 | bootargs = "128M console=ttyS0,115200 mtdparts=atmel_nand:8M(bootstrap/uboot/kernel)ro,-(rootfs) root=/dev/mtdblock1 rw rootfstype=ubifs ubi.mtd=1 root=ubi0:rootfs"; | 18 | bootargs = "128M console=ttyS0,115200 root=/dev/mtdblock1 rw rootfstype=ubifs ubi.mtd=1 root=ubi0:rootfs"; |
| 19 | }; | 19 | }; |
| 20 | 20 | ||
| 21 | ahb { | 21 | ahb { |
| @@ -33,5 +33,17 @@ | |||
| 33 | status = "okay"; | 33 | status = "okay"; |
| 34 | }; | 34 | }; |
| 35 | }; | 35 | }; |
| 36 | |||
| 37 | usb0: ohci@00600000 { | ||
| 38 | status = "okay"; | ||
| 39 | num-ports = <2>; | ||
| 40 | atmel,vbus-gpio = <&pioD 19 0 | ||
| 41 | &pioD 20 0 | ||
| 42 | >; | ||
| 43 | }; | ||
| 44 | |||
| 45 | usb1: ehci@00700000 { | ||
| 46 | status = "okay"; | ||
| 47 | }; | ||
| 36 | }; | 48 | }; |
| 37 | }; | 49 | }; |
diff --git a/arch/arm/boot/dts/at91sam9g45.dtsi b/arch/arm/boot/dts/at91sam9g45.dtsi index f779667159b1..3d0c32fb218f 100644 --- a/arch/arm/boot/dts/at91sam9g45.dtsi +++ b/arch/arm/boot/dts/at91sam9g45.dtsi | |||
| @@ -60,6 +60,22 @@ | |||
| 60 | reg = <0xfffff000 0x200>; | 60 | reg = <0xfffff000 0x200>; |
| 61 | }; | 61 | }; |
| 62 | 62 | ||
| 63 | ramc0: ramc@ffffe400 { | ||
| 64 | compatible = "atmel,at91sam9g45-ddramc"; | ||
| 65 | reg = <0xffffe400 0x200 | ||
| 66 | 0xffffe600 0x200>; | ||
| 67 | }; | ||
| 68 | |||
| 69 | pmc: pmc@fffffc00 { | ||
| 70 | compatible = "atmel,at91rm9200-pmc"; | ||
| 71 | reg = <0xfffffc00 0x100>; | ||
| 72 | }; | ||
| 73 | |||
| 74 | rstc@fffffd00 { | ||
| 75 | compatible = "atmel,at91sam9g45-rstc"; | ||
| 76 | reg = <0xfffffd00 0x10>; | ||
| 77 | }; | ||
| 78 | |||
| 63 | pit: timer@fffffd30 { | 79 | pit: timer@fffffd30 { |
| 64 | compatible = "atmel,at91sam9260-pit"; | 80 | compatible = "atmel,at91sam9260-pit"; |
| 65 | reg = <0xfffffd30 0xf>; | 81 | reg = <0xfffffd30 0xf>; |
| @@ -67,6 +83,11 @@ | |||
| 67 | }; | 83 | }; |
| 68 | 84 | ||
| 69 | 85 | ||
| 86 | shdwc@fffffd10 { | ||
| 87 | compatible = "atmel,at91sam9rl-shdwc"; | ||
| 88 | reg = <0xfffffd10 0x10>; | ||
| 89 | }; | ||
| 90 | |||
| 70 | tcb0: timer@fff7c000 { | 91 | tcb0: timer@fff7c000 { |
| 71 | compatible = "atmel,at91rm9200-tcb"; | 92 | compatible = "atmel,at91rm9200-tcb"; |
| 72 | reg = <0xfff7c000 0x100>; | 93 | reg = <0xfff7c000 0x100>; |
| @@ -180,5 +201,48 @@ | |||
| 180 | status = "disabled"; | 201 | status = "disabled"; |
| 181 | }; | 202 | }; |
| 182 | }; | 203 | }; |
| 204 | |||
| 205 | nand0: nand@40000000 { | ||
| 206 | compatible = "atmel,at91rm9200-nand"; | ||
| 207 | #address-cells = <1>; | ||
| 208 | #size-cells = <1>; | ||
| 209 | reg = <0x40000000 0x10000000 | ||
| 210 | 0xffffe200 0x200 | ||
| 211 | >; | ||
| 212 | atmel,nand-addr-offset = <21>; | ||
| 213 | atmel,nand-cmd-offset = <22>; | ||
| 214 | gpios = <&pioC 8 0 | ||
| 215 | &pioC 14 0 | ||
| 216 | 0 | ||
| 217 | >; | ||
| 218 | status = "disabled"; | ||
| 219 | }; | ||
| 220 | |||
| 221 | usb0: ohci@00700000 { | ||
| 222 | compatible = "atmel,at91rm9200-ohci", "usb-ohci"; | ||
| 223 | reg = <0x00700000 0x100000>; | ||
| 224 | interrupts = <22 4>; | ||
| 225 | status = "disabled"; | ||
| 226 | }; | ||
| 227 | |||
| 228 | usb1: ehci@00800000 { | ||
| 229 | compatible = "atmel,at91sam9g45-ehci", "usb-ehci"; | ||
| 230 | reg = <0x00800000 0x100000>; | ||
| 231 | interrupts = <22 4>; | ||
| 232 | status = "disabled"; | ||
| 233 | }; | ||
| 234 | }; | ||
| 235 | |||
| 236 | i2c@0 { | ||
| 237 | compatible = "i2c-gpio"; | ||
| 238 | gpios = <&pioA 20 0 /* sda */ | ||
| 239 | &pioA 21 0 /* scl */ | ||
| 240 | >; | ||
| 241 | i2c-gpio,sda-open-drain; | ||
| 242 | i2c-gpio,scl-open-drain; | ||
| 243 | i2c-gpio,delay-us = <5>; /* ~100 kHz */ | ||
| 244 | #address-cells = <1>; | ||
| 245 | #size-cells = <0>; | ||
| 246 | status = "disabled"; | ||
| 183 | }; | 247 | }; |
| 184 | }; | 248 | }; |
diff --git a/arch/arm/boot/dts/at91sam9m10g45ek.dts b/arch/arm/boot/dts/at91sam9m10g45ek.dts index 15e25f903cad..c4c8ae4123d5 100644 --- a/arch/arm/boot/dts/at91sam9m10g45ek.dts +++ b/arch/arm/boot/dts/at91sam9m10g45ek.dts | |||
| @@ -14,13 +14,24 @@ | |||
| 14 | compatible = "atmel,at91sam9m10g45ek", "atmel,at91sam9g45", "atmel,at91sam9"; | 14 | compatible = "atmel,at91sam9m10g45ek", "atmel,at91sam9g45", "atmel,at91sam9"; |
| 15 | 15 | ||
| 16 | chosen { | 16 | chosen { |
| 17 | bootargs = "mem=64M console=ttyS0,115200 mtdparts=atmel_nand:4M(bootstrap/uboot/kernel)ro,60M(rootfs),-(data) root=/dev/mtdblock1 rw rootfstype=jffs2"; | 17 | bootargs = "mem=64M console=ttyS0,115200 root=/dev/mtdblock1 rw rootfstype=jffs2"; |
| 18 | }; | 18 | }; |
| 19 | 19 | ||
| 20 | memory@70000000 { | 20 | memory@70000000 { |
| 21 | reg = <0x70000000 0x4000000>; | 21 | reg = <0x70000000 0x4000000>; |
| 22 | }; | 22 | }; |
| 23 | 23 | ||
| 24 | clocks { | ||
| 25 | #address-cells = <1>; | ||
| 26 | #size-cells = <1>; | ||
| 27 | ranges; | ||
| 28 | |||
| 29 | main_clock: clock@0 { | ||
| 30 | compatible = "atmel,osc", "fixed-clock"; | ||
| 31 | clock-frequency = <12000000>; | ||
| 32 | }; | ||
| 33 | }; | ||
| 34 | |||
| 24 | ahb { | 35 | ahb { |
| 25 | apb { | 36 | apb { |
| 26 | dbgu: serial@ffffee00 { | 37 | dbgu: serial@ffffee00 { |
| @@ -36,6 +47,39 @@ | |||
| 36 | status = "okay"; | 47 | status = "okay"; |
| 37 | }; | 48 | }; |
| 38 | }; | 49 | }; |
| 50 | |||
| 51 | nand0: nand@40000000 { | ||
| 52 | nand-bus-width = <8>; | ||
| 53 | nand-ecc-mode = "soft"; | ||
| 54 | nand-on-flash-bbt; | ||
| 55 | status = "okay"; | ||
| 56 | |||
| 57 | boot@0 { | ||
| 58 | label = "bootstrap/uboot/kernel"; | ||
| 59 | reg = <0x0 0x400000>; | ||
| 60 | }; | ||
| 61 | |||
| 62 | rootfs@400000 { | ||
| 63 | label = "rootfs"; | ||
| 64 | reg = <0x400000 0x3C00000>; | ||
| 65 | }; | ||
| 66 | |||
| 67 | data@4000000 { | ||
| 68 | label = "data"; | ||
| 69 | reg = <0x4000000 0xC000000>; | ||
| 70 | }; | ||
| 71 | }; | ||
| 72 | |||
| 73 | usb0: ohci@00700000 { | ||
| 74 | status = "okay"; | ||
| 75 | num-ports = <2>; | ||
| 76 | atmel,vbus-gpio = <&pioD 1 0 | ||
| 77 | &pioD 3 0>; | ||
| 78 | }; | ||
| 79 | |||
| 80 | usb1: ehci@00800000 { | ||
| 81 | status = "okay"; | ||
| 82 | }; | ||
| 39 | }; | 83 | }; |
| 40 | 84 | ||
| 41 | leds { | 85 | leds { |
diff --git a/arch/arm/boot/dts/at91sam9x5.dtsi b/arch/arm/boot/dts/at91sam9x5.dtsi index a02e636d8a57..c111001f254e 100644 --- a/arch/arm/boot/dts/at91sam9x5.dtsi +++ b/arch/arm/boot/dts/at91sam9x5.dtsi | |||
| @@ -58,6 +58,26 @@ | |||
| 58 | reg = <0xfffff000 0x200>; | 58 | reg = <0xfffff000 0x200>; |
| 59 | }; | 59 | }; |
| 60 | 60 | ||
| 61 | ramc0: ramc@ffffe800 { | ||
| 62 | compatible = "atmel,at91sam9g45-ddramc"; | ||
| 63 | reg = <0xffffe800 0x200>; | ||
| 64 | }; | ||
| 65 | |||
| 66 | pmc: pmc@fffffc00 { | ||
| 67 | compatible = "atmel,at91rm9200-pmc"; | ||
| 68 | reg = <0xfffffc00 0x100>; | ||
| 69 | }; | ||
| 70 | |||
| 71 | rstc@fffffe00 { | ||
| 72 | compatible = "atmel,at91sam9g45-rstc"; | ||
| 73 | reg = <0xfffffe00 0x10>; | ||
| 74 | }; | ||
| 75 | |||
| 76 | shdwc@fffffe10 { | ||
| 77 | compatible = "atmel,at91sam9x5-shdwc"; | ||
| 78 | reg = <0xfffffe10 0x10>; | ||
| 79 | }; | ||
| 80 | |||
| 61 | pit: timer@fffffe30 { | 81 | pit: timer@fffffe30 { |
| 62 | compatible = "atmel,at91sam9260-pit"; | 82 | compatible = "atmel,at91sam9260-pit"; |
| 63 | reg = <0xfffffe30 0xf>; | 83 | reg = <0xfffffe30 0xf>; |
| @@ -172,5 +192,73 @@ | |||
| 172 | status = "disabled"; | 192 | status = "disabled"; |
| 173 | }; | 193 | }; |
| 174 | }; | 194 | }; |
| 195 | |||
| 196 | nand0: nand@40000000 { | ||
| 197 | compatible = "atmel,at91rm9200-nand"; | ||
| 198 | #address-cells = <1>; | ||
| 199 | #size-cells = <1>; | ||
| 200 | reg = <0x40000000 0x10000000 | ||
| 201 | >; | ||
| 202 | atmel,nand-addr-offset = <21>; | ||
| 203 | atmel,nand-cmd-offset = <22>; | ||
| 204 | gpios = <&pioC 8 0 | ||
| 205 | &pioC 14 0 | ||
| 206 | 0 | ||
| 207 | >; | ||
| 208 | status = "disabled"; | ||
| 209 | }; | ||
| 210 | |||
| 211 | usb0: ohci@00600000 { | ||
| 212 | compatible = "atmel,at91rm9200-ohci", "usb-ohci"; | ||
| 213 | reg = <0x00600000 0x100000>; | ||
| 214 | interrupts = <22 4>; | ||
| 215 | status = "disabled"; | ||
| 216 | }; | ||
| 217 | |||
| 218 | usb1: ehci@00700000 { | ||
| 219 | compatible = "atmel,at91sam9g45-ehci", "usb-ehci"; | ||
| 220 | reg = <0x00700000 0x100000>; | ||
| 221 | interrupts = <22 4>; | ||
| 222 | status = "disabled"; | ||
| 223 | }; | ||
| 224 | }; | ||
| 225 | |||
| 226 | i2c@0 { | ||
| 227 | compatible = "i2c-gpio"; | ||
| 228 | gpios = <&pioA 30 0 /* sda */ | ||
| 229 | &pioA 31 0 /* scl */ | ||
| 230 | >; | ||
| 231 | i2c-gpio,sda-open-drain; | ||
| 232 | i2c-gpio,scl-open-drain; | ||
| 233 | i2c-gpio,delay-us = <2>; /* ~100 kHz */ | ||
| 234 | #address-cells = <1>; | ||
| 235 | #size-cells = <0>; | ||
| 236 | status = "disabled"; | ||
| 237 | }; | ||
| 238 | |||
| 239 | i2c@1 { | ||
| 240 | compatible = "i2c-gpio"; | ||
| 241 | gpios = <&pioC 0 0 /* sda */ | ||
| 242 | &pioC 1 0 /* scl */ | ||
| 243 | >; | ||
| 244 | i2c-gpio,sda-open-drain; | ||
| 245 | i2c-gpio,scl-open-drain; | ||
| 246 | i2c-gpio,delay-us = <2>; /* ~100 kHz */ | ||
| 247 | #address-cells = <1>; | ||
| 248 | #size-cells = <0>; | ||
| 249 | status = "disabled"; | ||
| 250 | }; | ||
| 251 | |||
| 252 | i2c@2 { | ||
| 253 | compatible = "i2c-gpio"; | ||
| 254 | gpios = <&pioB 4 0 /* sda */ | ||
| 255 | &pioB 5 0 /* scl */ | ||
| 256 | >; | ||
| 257 | i2c-gpio,sda-open-drain; | ||
| 258 | i2c-gpio,scl-open-drain; | ||
| 259 | i2c-gpio,delay-us = <2>; /* ~100 kHz */ | ||
| 260 | #address-cells = <1>; | ||
| 261 | #size-cells = <0>; | ||
| 262 | status = "disabled"; | ||
| 175 | }; | 263 | }; |
| 176 | }; | 264 | }; |
diff --git a/arch/arm/boot/dts/at91sam9x5cm.dtsi b/arch/arm/boot/dts/at91sam9x5cm.dtsi index 64ae3e890259..67936f83c694 100644 --- a/arch/arm/boot/dts/at91sam9x5cm.dtsi +++ b/arch/arm/boot/dts/at91sam9x5cm.dtsi | |||
| @@ -12,6 +12,51 @@ | |||
| 12 | reg = <0x20000000 0x8000000>; | 12 | reg = <0x20000000 0x8000000>; |
| 13 | }; | 13 | }; |
| 14 | 14 | ||
| 15 | clocks { | ||
| 16 | #address-cells = <1>; | ||
| 17 | #size-cells = <1>; | ||
| 18 | ranges; | ||
| 19 | |||
| 20 | main_clock: clock@0 { | ||
| 21 | compatible = "atmel,osc", "fixed-clock"; | ||
| 22 | clock-frequency = <12000000>; | ||
| 23 | }; | ||
| 24 | }; | ||
| 25 | |||
| 26 | ahb { | ||
| 27 | nand0: nand@40000000 { | ||
| 28 | nand-bus-width = <8>; | ||
| 29 | nand-ecc-mode = "soft"; | ||
| 30 | nand-on-flash-bbt; | ||
| 31 | status = "okay"; | ||
| 32 | |||
| 33 | at91bootstrap@0 { | ||
| 34 | label = "at91bootstrap"; | ||
| 35 | reg = <0x0 0x40000>; | ||
| 36 | }; | ||
| 37 | |||
| 38 | uboot@40000 { | ||
| 39 | label = "u-boot"; | ||
| 40 | reg = <0x40000 0x80000>; | ||
| 41 | }; | ||
| 42 | |||
| 43 | ubootenv@c0000 { | ||
| 44 | label = "U-Boot Env"; | ||
| 45 | reg = <0xc0000 0x140000>; | ||
| 46 | }; | ||
| 47 | |||
| 48 | kernel@200000 { | ||
| 49 | label = "kernel"; | ||
| 50 | reg = <0x200000 0x600000>; | ||
| 51 | }; | ||
| 52 | |||
| 53 | rootfs@800000 { | ||
| 54 | label = "rootfs"; | ||
| 55 | reg = <0x800000 0x1f800000>; | ||
| 56 | }; | ||
| 57 | }; | ||
| 58 | }; | ||
| 59 | |||
| 15 | leds { | 60 | leds { |
| 16 | compatible = "gpio-leds"; | 61 | compatible = "gpio-leds"; |
| 17 | 62 | ||
diff --git a/arch/arm/boot/dts/db8500.dtsi b/arch/arm/boot/dts/db8500.dtsi new file mode 100644 index 000000000000..d73dce645667 --- /dev/null +++ b/arch/arm/boot/dts/db8500.dtsi | |||
| @@ -0,0 +1,275 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2012 Linaro Ltd | ||
| 3 | * | ||
| 4 | * The code contained herein is licensed under the GNU General Public | ||
| 5 | * License. You may obtain a copy of the GNU General Public License | ||
| 6 | * Version 2 or later at the following locations: | ||
| 7 | * | ||
| 8 | * http://www.opensource.org/licenses/gpl-license.html | ||
| 9 | * http://www.gnu.org/copyleft/gpl.html | ||
| 10 | */ | ||
| 11 | |||
| 12 | /include/ "skeleton.dtsi" | ||
| 13 | |||
| 14 | / { | ||
| 15 | soc-u9500 { | ||
| 16 | #address-cells = <1>; | ||
| 17 | #size-cells = <1>; | ||
| 18 | compatible = "stericsson,db8500"; | ||
| 19 | interrupt-parent = <&intc>; | ||
| 20 | ranges; | ||
| 21 | |||
| 22 | intc: interrupt-controller@a0411000 { | ||
| 23 | compatible = "arm,cortex-a9-gic"; | ||
| 24 | #interrupt-cells = <3>; | ||
| 25 | #address-cells = <1>; | ||
| 26 | interrupt-controller; | ||
| 27 | interrupt-parent; | ||
| 28 | reg = <0xa0411000 0x1000>, | ||
| 29 | <0xa0410100 0x100>; | ||
| 30 | }; | ||
| 31 | |||
| 32 | L2: l2-cache { | ||
| 33 | compatible = "arm,pl310-cache"; | ||
| 34 | reg = <0xa0412000 0x1000>; | ||
| 35 | interrupts = <0 13 4>; | ||
| 36 | cache-unified; | ||
| 37 | cache-level = <2>; | ||
| 38 | }; | ||
| 39 | |||
| 40 | pmu { | ||
| 41 | compatible = "arm,cortex-a9-pmu"; | ||
| 42 | interrupts = <0 7 0x4>; | ||
| 43 | }; | ||
| 44 | |||
| 45 | timer@a0410600 { | ||
| 46 | compatible = "arm,cortex-a9-twd-timer"; | ||
| 47 | reg = <0xa0410600 0x20>; | ||
| 48 | interrupts = <1 13 0x304>; | ||
| 49 | }; | ||
| 50 | |||
| 51 | rtc@80154000 { | ||
| 52 | compatible = "stericsson,db8500-rtc"; | ||
| 53 | reg = <0x80154000 0x1000>; | ||
| 54 | interrupts = <0 18 0x4>; | ||
| 55 | }; | ||
| 56 | |||
| 57 | gpio0: gpio@8012e000 { | ||
| 58 | compatible = "stericsson,db8500-gpio", | ||
| 59 | "stmicroelectronics,nomadik-gpio"; | ||
| 60 | reg = <0x8012e000 0x80>; | ||
| 61 | interrupts = <0 119 0x4>; | ||
| 62 | supports-sleepmode; | ||
| 63 | gpio-controller; | ||
| 64 | }; | ||
| 65 | |||
| 66 | gpio1: gpio@8012e080 { | ||
| 67 | compatible = "stericsson,db8500-gpio", | ||
| 68 | "stmicroelectronics,nomadik-gpio"; | ||
| 69 | reg = <0x8012e080 0x80>; | ||
| 70 | interrupts = <0 120 0x4>; | ||
| 71 | supports-sleepmode; | ||
| 72 | gpio-controller; | ||
| 73 | }; | ||
| 74 | |||
| 75 | gpio2: gpio@8000e000 { | ||
| 76 | compatible = "stericsson,db8500-gpio", | ||
| 77 | "stmicroelectronics,nomadik-gpio"; | ||
| 78 | reg = <0x8000e000 0x80>; | ||
| 79 | interrupts = <0 121 0x4>; | ||
| 80 | supports-sleepmode; | ||
| 81 | gpio-controller; | ||
| 82 | }; | ||
| 83 | |||
| 84 | gpio3: gpio@8000e080 { | ||
| 85 | compatible = "stericsson,db8500-gpio", | ||
| 86 | "stmicroelectronics,nomadik-gpio"; | ||
| 87 | reg = <0x8000e080 0x80>; | ||
| 88 | interrupts = <0 122 0x4>; | ||
| 89 | supports-sleepmode; | ||
| 90 | gpio-controller; | ||
| 91 | }; | ||
| 92 | |||
| 93 | gpio4: gpio@8000e100 { | ||
| 94 | compatible = "stericsson,db8500-gpio", | ||
| 95 | "stmicroelectronics,nomadik-gpio"; | ||
| 96 | reg = <0x8000e100 0x80>; | ||
| 97 | interrupts = <0 123 0x4>; | ||
| 98 | supports-sleepmode; | ||
| 99 | gpio-controller; | ||
| 100 | }; | ||
| 101 | |||
| 102 | gpio5: gpio@8000e180 { | ||
| 103 | compatible = "stericsson,db8500-gpio", | ||
| 104 | "stmicroelectronics,nomadik-gpio"; | ||
| 105 | reg = <0x8000e180 0x80>; | ||
| 106 | interrupts = <0 124 0x4>; | ||
| 107 | supports-sleepmode; | ||
| 108 | gpio-controller; | ||
| 109 | }; | ||
| 110 | |||
| 111 | gpio6: gpio@8011e000 { | ||
| 112 | compatible = "stericsson,db8500-gpio", | ||
| 113 | "stmicroelectronics,nomadik-gpio"; | ||
| 114 | reg = <0x8011e000 0x80>; | ||
| 115 | interrupts = <0 125 0x4>; | ||
| 116 | supports-sleepmode; | ||
| 117 | gpio-controller; | ||
| 118 | }; | ||
| 119 | |||
| 120 | gpio7: gpio@8011e080 { | ||
| 121 | compatible = "stericsson,db8500-gpio", | ||
| 122 | "stmicroelectronics,nomadik-gpio"; | ||
| 123 | reg = <0x8011e080 0x80>; | ||
| 124 | interrupts = <0 126 0x4>; | ||
| 125 | supports-sleepmode; | ||
| 126 | gpio-controller; | ||
| 127 | }; | ||
| 128 | |||
| 129 | gpio8: gpio@a03fe000 { | ||
| 130 | compatible = "stericsson,db8500-gpio", | ||
| 131 | "stmicroelectronics,nomadik-gpio"; | ||
| 132 | reg = <0xa03fe000 0x80>; | ||
| 133 | interrupts = <0 127 0x4>; | ||
| 134 | supports-sleepmode; | ||
| 135 | gpio-controller; | ||
| 136 | }; | ||
| 137 | |||
| 138 | usb@a03e0000 { | ||
| 139 | compatible = "stericsson,db8500-musb", | ||
| 140 | "mentor,musb"; | ||
| 141 | reg = <0xa03e0000 0x10000>; | ||
| 142 | interrupts = <0 23 0x4>; | ||
| 143 | }; | ||
| 144 | |||
| 145 | dma-controller@801C0000 { | ||
| 146 | compatible = "stericsson,db8500-dma40", | ||
| 147 | "stericsson,dma40"; | ||
| 148 | reg = <0x801C0000 0x1000 0x40010000 0x800>; | ||
| 149 | interrupts = <0 25 0x4>; | ||
| 150 | }; | ||
| 151 | |||
| 152 | prcmu@80157000 { | ||
| 153 | compatible = "stericsson,db8500-prcmu"; | ||
| 154 | reg = <0x80157000 0x1000>; | ||
| 155 | interrupts = <46 47>; | ||
| 156 | #address-cells = <1>; | ||
| 157 | #size-cells = <0>; | ||
| 158 | |||
| 159 | ab8500@5 { | ||
| 160 | compatible = "stericsson,ab8500"; | ||
| 161 | reg = <5>; /* mailbox 5 is i2c */ | ||
| 162 | interrupts = <0 40 0x4>; | ||
| 163 | }; | ||
| 164 | }; | ||
| 165 | |||
| 166 | i2c@80004000 { | ||
| 167 | compatible = "stericsson,db8500-i2c", "stmicroelectronics,nomadik-i2c"; | ||
| 168 | reg = <0x80004000 0x1000>; | ||
| 169 | interrupts = <0 21 0x4>; | ||
| 170 | #address-cells = <1>; | ||
| 171 | #size-cells = <0>; | ||
| 172 | }; | ||
| 173 | |||
| 174 | i2c@80122000 { | ||
| 175 | compatible = "stericsson,db8500-i2c", "stmicroelectronics,nomadik-i2c"; | ||
| 176 | reg = <0x80122000 0x1000>; | ||
| 177 | interrupts = <0 22 0x4>; | ||
| 178 | #address-cells = <1>; | ||
| 179 | #size-cells = <0>; | ||
| 180 | }; | ||
| 181 | |||
| 182 | i2c@80128000 { | ||
| 183 | compatible = "stericsson,db8500-i2c", "stmicroelectronics,nomadik-i2c"; | ||
| 184 | reg = <0x80128000 0x1000>; | ||
| 185 | interrupts = <0 55 0x4>; | ||
| 186 | #address-cells = <1>; | ||
| 187 | #size-cells = <0>; | ||
| 188 | }; | ||
| 189 | |||
| 190 | i2c@80110000 { | ||
| 191 | compatible = "stericsson,db8500-i2c", "stmicroelectronics,nomadik-i2c"; | ||
| 192 | reg = <0x80110000 0x1000>; | ||
| 193 | interrupts = <0 12 0x4>; | ||
| 194 | #address-cells = <1>; | ||
| 195 | #size-cells = <0>; | ||
| 196 | }; | ||
| 197 | |||
| 198 | i2c@8012a000 { | ||
| 199 | compatible = "stericsson,db8500-i2c", "stmicroelectronics,nomadik-i2c"; | ||
| 200 | reg = <0x8012a000 0x1000>; | ||
| 201 | interrupts = <0 51 0x4>; | ||
| 202 | #address-cells = <1>; | ||
| 203 | #size-cells = <0>; | ||
| 204 | }; | ||
| 205 | |||
| 206 | ssp@80002000 { | ||
| 207 | compatible = "arm,pl022", "arm,primecell"; | ||
| 208 | reg = <80002000 0x1000>; | ||
| 209 | interrupts = <0 14 0x4>; | ||
| 210 | #address-cells = <1>; | ||
| 211 | #size-cells = <0>; | ||
| 212 | status = "disabled"; | ||
| 213 | |||
| 214 | // Add one of these for each child device | ||
| 215 | cs-gpios = <&gpio0 31 &gpio4 14 &gpio4 16 &gpio6 22 &gpio7 0>; | ||
| 216 | |||
| 217 | }; | ||
| 218 | |||
| 219 | uart@80120000 { | ||
| 220 | compatible = "arm,pl011", "arm,primecell"; | ||
| 221 | reg = <0x80120000 0x1000>; | ||
| 222 | interrupts = <0 11 0x4>; | ||
| 223 | status = "disabled"; | ||
| 224 | }; | ||
| 225 | uart@80121000 { | ||
| 226 | compatible = "arm,pl011", "arm,primecell"; | ||
| 227 | reg = <0x80121000 0x1000>; | ||
| 228 | interrupts = <0 19 0x4>; | ||
| 229 | status = "disabled"; | ||
| 230 | }; | ||
| 231 | uart@80007000 { | ||
| 232 | compatible = "arm,pl011", "arm,primecell"; | ||
| 233 | reg = <0x80007000 0x1000>; | ||
| 234 | interrupts = <0 26 0x4>; | ||
| 235 | status = "disabled"; | ||
| 236 | }; | ||
| 237 | |||
| 238 | sdi@80126000 { | ||
| 239 | compatible = "arm,pl18x", "arm,primecell"; | ||
| 240 | reg = <0x80126000 0x1000>; | ||
| 241 | interrupts = <0 60 0x4>; | ||
| 242 | status = "disabled"; | ||
| 243 | }; | ||
| 244 | sdi@80118000 { | ||
| 245 | compatible = "arm,pl18x", "arm,primecell"; | ||
| 246 | reg = <0x80118000 0x1000>; | ||
| 247 | interrupts = <0 50 0x4>; | ||
| 248 | status = "disabled"; | ||
| 249 | }; | ||
| 250 | sdi@80005000 { | ||
| 251 | compatible = "arm,pl18x", "arm,primecell"; | ||
| 252 | reg = <0x80005000 0x1000>; | ||
| 253 | interrupts = <0 41 0x4>; | ||
| 254 | status = "disabled"; | ||
| 255 | }; | ||
| 256 | sdi@80119000 { | ||
| 257 | compatible = "arm,pl18x", "arm,primecell"; | ||
| 258 | reg = <0x80119000 0x1000>; | ||
| 259 | interrupts = <0 59 0x4>; | ||
| 260 | status = "disabled"; | ||
| 261 | }; | ||
| 262 | sdi@80114000 { | ||
| 263 | compatible = "arm,pl18x", "arm,primecell"; | ||
| 264 | reg = <0x80114000 0x1000>; | ||
| 265 | interrupts = <0 99 0x4>; | ||
| 266 | status = "disabled"; | ||
| 267 | }; | ||
| 268 | sdi@80008000 { | ||
| 269 | compatible = "arm,pl18x", "arm,primecell"; | ||
| 270 | reg = <0x80114000 0x1000>; | ||
| 271 | interrupts = <0 100 0x4>; | ||
| 272 | status = "disabled"; | ||
| 273 | }; | ||
| 274 | }; | ||
| 275 | }; | ||
diff --git a/arch/arm/boot/dts/kirkwood-dreamplug.dts b/arch/arm/boot/dts/kirkwood-dreamplug.dts index 8a5dff807b45..a5376b84227f 100644 --- a/arch/arm/boot/dts/kirkwood-dreamplug.dts +++ b/arch/arm/boot/dts/kirkwood-dreamplug.dts | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | 4 | ||
| 5 | / { | 5 | / { |
| 6 | model = "Globalscale Technologies Dreamplug"; | 6 | model = "Globalscale Technologies Dreamplug"; |
| 7 | compatible = "globalscale,dreamplug-003-ds2001", "globalscale,dreamplug", "marvell,kirkwood-88f6281", "marvell,kirkwood"; | 7 | compatible = "globalscale,dreamplug-003-ds2001", "globalscale,dreamplug", "mrvl,kirkwood-88f6281", "mrvl,kirkwood"; |
| 8 | 8 | ||
| 9 | memory { | 9 | memory { |
| 10 | device_type = "memory"; | 10 | device_type = "memory"; |
| @@ -15,11 +15,10 @@ | |||
| 15 | bootargs = "console=ttyS0,115200n8 earlyprintk"; | 15 | bootargs = "console=ttyS0,115200n8 earlyprintk"; |
| 16 | }; | 16 | }; |
| 17 | 17 | ||
| 18 | serial@f1012000 { | 18 | ocp@f1000000 { |
| 19 | compatible = "ns16550a"; | 19 | serial@12000 { |
| 20 | reg = <0xf1012000 0xff>; | 20 | clock-frequency = <200000000>; |
| 21 | reg-shift = <2>; | 21 | status = "ok"; |
| 22 | interrupts = <33>; | 22 | }; |
| 23 | clock-frequency = <200000000>; | ||
| 24 | }; | 23 | }; |
| 25 | }; | 24 | }; |
diff --git a/arch/arm/boot/dts/kirkwood.dtsi b/arch/arm/boot/dts/kirkwood.dtsi index 771c6bbeb29a..3474ef890945 100644 --- a/arch/arm/boot/dts/kirkwood.dtsi +++ b/arch/arm/boot/dts/kirkwood.dtsi | |||
| @@ -1,6 +1,36 @@ | |||
| 1 | /include/ "skeleton.dtsi" | 1 | /include/ "skeleton.dtsi" |
| 2 | 2 | ||
| 3 | / { | 3 | / { |
| 4 | compatible = "marvell,kirkwood"; | 4 | compatible = "mrvl,kirkwood"; |
| 5 | }; | 5 | |
| 6 | ocp@f1000000 { | ||
| 7 | compatible = "simple-bus"; | ||
| 8 | ranges = <0 0xf1000000 0x1000000>; | ||
| 9 | #address-cells = <1>; | ||
| 10 | #size-cells = <1>; | ||
| 11 | |||
| 12 | serial@12000 { | ||
| 13 | compatible = "ns16550a"; | ||
| 14 | reg = <0x12000 0x100>; | ||
| 15 | reg-shift = <2>; | ||
| 16 | interrupts = <33>; | ||
| 17 | /* set clock-frequency in board dts */ | ||
| 18 | status = "disabled"; | ||
| 19 | }; | ||
| 6 | 20 | ||
| 21 | serial@12100 { | ||
| 22 | compatible = "ns16550a"; | ||
| 23 | reg = <0x12100 0x100>; | ||
| 24 | reg-shift = <2>; | ||
| 25 | interrupts = <34>; | ||
| 26 | /* set clock-frequency in board dts */ | ||
| 27 | status = "disabled"; | ||
| 28 | }; | ||
| 29 | |||
| 30 | rtc@10300 { | ||
| 31 | compatible = "mrvl,kirkwood-rtc", "mrvl,orion-rtc"; | ||
| 32 | reg = <0x10300 0x20>; | ||
| 33 | interrupts = <53>; | ||
| 34 | }; | ||
| 35 | }; | ||
| 36 | }; | ||
diff --git a/arch/arm/boot/dts/snowball.dts b/arch/arm/boot/dts/snowball.dts new file mode 100644 index 000000000000..359c6d679156 --- /dev/null +++ b/arch/arm/boot/dts/snowball.dts | |||
| @@ -0,0 +1,139 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2011 ST-Ericsson AB | ||
| 3 | * | ||
| 4 | * The code contained herein is licensed under the GNU General Public | ||
| 5 | * License. You may obtain a copy of the GNU General Public License | ||
| 6 | * Version 2 or later at the following locations: | ||
| 7 | * | ||
| 8 | * http://www.opensource.org/licenses/gpl-license.html | ||
| 9 | * http://www.gnu.org/copyleft/gpl.html | ||
| 10 | */ | ||
| 11 | |||
| 12 | /dts-v1/; | ||
| 13 | /include/ "db8500.dtsi" | ||
| 14 | |||
| 15 | / { | ||
| 16 | model = "Calao Systems Snowball platform with device tree"; | ||
| 17 | compatible = "calaosystems,snowball-a9500"; | ||
| 18 | |||
| 19 | memory { | ||
| 20 | reg = <0x00000000 0x20000000>; | ||
| 21 | }; | ||
| 22 | |||
| 23 | gpio_keys { | ||
| 24 | compatible = "gpio-keys"; | ||
| 25 | #address-cells = <1>; | ||
| 26 | #size-cells = <0>; | ||
| 27 | |||
| 28 | button@1 { | ||
| 29 | debounce_interval = <50>; | ||
| 30 | wakeup = <1>; | ||
| 31 | linux,code = <2>; | ||
| 32 | label = "userpb"; | ||
| 33 | gpios = <&gpio1 0>; | ||
| 34 | }; | ||
| 35 | button@2 { | ||
| 36 | debounce_interval = <50>; | ||
| 37 | wakeup = <1>; | ||
| 38 | linux,code = <3>; | ||
| 39 | label = "userpb"; | ||
| 40 | gpios = <&gpio4 23>; | ||
| 41 | }; | ||
| 42 | button@3 { | ||
| 43 | debounce_interval = <50>; | ||
| 44 | wakeup = <1>; | ||
| 45 | linux,code = <4>; | ||
| 46 | label = "userpb"; | ||
| 47 | gpios = <&gpio4 23>; | ||
| 48 | }; | ||
| 49 | button@4 { | ||
| 50 | debounce_interval = <50>; | ||
| 51 | wakeup = <1>; | ||
| 52 | linux,code = <5>; | ||
| 53 | label = "userpb"; | ||
| 54 | gpios = <&gpio5 1>; | ||
| 55 | }; | ||
| 56 | button@5 { | ||
| 57 | debounce_interval = <50>; | ||
| 58 | wakeup = <1>; | ||
| 59 | linux,code = <6>; | ||
| 60 | label = "userpb"; | ||
| 61 | gpios = <&gpio5 2>; | ||
| 62 | }; | ||
| 63 | }; | ||
| 64 | |||
| 65 | leds { | ||
| 66 | compatible = "gpio-leds"; | ||
| 67 | used-led { | ||
| 68 | label = "user_led"; | ||
| 69 | gpios = <&gpio4 14>; | ||
| 70 | }; | ||
| 71 | }; | ||
| 72 | |||
| 73 | soc-u9500 { | ||
| 74 | |||
| 75 | external-bus@50000000 { | ||
| 76 | compatible = "simple-bus"; | ||
| 77 | reg = <0x50000000 0x10000000>; | ||
| 78 | #address-cells = <1>; | ||
| 79 | #size-cells = <1>; | ||
| 80 | ranges; | ||
| 81 | |||
| 82 | ethernet@50000000 { | ||
| 83 | compatible = "smsc,9111"; | ||
| 84 | reg = <0x50000000 0x10000>; | ||
| 85 | interrupts = <12>; | ||
| 86 | interrupt-parent = <&gpio4>; | ||
| 87 | }; | ||
| 88 | }; | ||
| 89 | |||
| 90 | sdi@80126000 { | ||
| 91 | status = "enabled"; | ||
| 92 | cd-gpios = <&gpio6 26>; | ||
| 93 | }; | ||
| 94 | |||
| 95 | sdi@80114000 { | ||
| 96 | status = "enabled"; | ||
| 97 | }; | ||
| 98 | |||
| 99 | uart@80120000 { | ||
| 100 | status = "okay"; | ||
| 101 | }; | ||
| 102 | |||
| 103 | uart@80121000 { | ||
| 104 | status = "okay"; | ||
| 105 | }; | ||
| 106 | |||
| 107 | uart@80007000 { | ||
| 108 | status = "okay"; | ||
| 109 | }; | ||
| 110 | |||
| 111 | i2c@80004000 { | ||
| 112 | tc3589x@42 { | ||
| 113 | //compatible = "tc3589x"; | ||
| 114 | reg = <0x42>; | ||
| 115 | interrupts = <25>; | ||
| 116 | interrupt-parent = <&gpio6>; | ||
| 117 | }; | ||
| 118 | tps61052@33 { | ||
| 119 | //compatible = "tps61052"; | ||
| 120 | reg = <0x33>; | ||
| 121 | }; | ||
| 122 | }; | ||
| 123 | |||
| 124 | i2c@80128000 { | ||
| 125 | lp5521@0x33 { | ||
| 126 | // compatible = "lp5521"; | ||
| 127 | reg = <0x33>; | ||
| 128 | }; | ||
| 129 | lp5521@0x34 { | ||
| 130 | // compatible = "lp5521"; | ||
| 131 | reg = <0x34>; | ||
| 132 | }; | ||
| 133 | bh1780@0x29 { | ||
| 134 | // compatible = "rohm,bh1780gli"; | ||
| 135 | reg = <0x33>; | ||
| 136 | }; | ||
| 137 | }; | ||
| 138 | }; | ||
| 139 | }; | ||
diff --git a/arch/arm/boot/dts/spear600-evb.dts b/arch/arm/boot/dts/spear600-evb.dts new file mode 100644 index 000000000000..636292e18c90 --- /dev/null +++ b/arch/arm/boot/dts/spear600-evb.dts | |||
| @@ -0,0 +1,47 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2012 Stefan Roese <sr@denx.de> | ||
| 3 | * | ||
| 4 | * The code contained herein is licensed under the GNU General Public | ||
| 5 | * License. You may obtain a copy of the GNU General Public License | ||
| 6 | * Version 2 or later at the following locations: | ||
| 7 | * | ||
| 8 | * http://www.opensource.org/licenses/gpl-license.html | ||
| 9 | * http://www.gnu.org/copyleft/gpl.html | ||
| 10 | */ | ||
| 11 | |||
| 12 | /dts-v1/; | ||
| 13 | /include/ "spear600.dtsi" | ||
| 14 | |||
| 15 | / { | ||
| 16 | model = "ST SPEAr600 Evaluation Board"; | ||
| 17 | compatible = "st,spear600-evb", "st,spear600"; | ||
| 18 | #address-cells = <1>; | ||
| 19 | #size-cells = <1>; | ||
| 20 | |||
| 21 | memory { | ||
| 22 | device_type = "memory"; | ||
| 23 | reg = <0 0x10000000>; | ||
| 24 | }; | ||
| 25 | |||
| 26 | ahb { | ||
| 27 | gmac: ethernet@e0800000 { | ||
| 28 | phy-mode = "gmii"; | ||
| 29 | status = "okay"; | ||
| 30 | }; | ||
| 31 | |||
| 32 | apb { | ||
| 33 | serial@d0000000 { | ||
| 34 | status = "okay"; | ||
| 35 | }; | ||
| 36 | |||
| 37 | serial@d0080000 { | ||
| 38 | status = "okay"; | ||
| 39 | }; | ||
| 40 | |||
| 41 | i2c@d0200000 { | ||
| 42 | clock-frequency = <400000>; | ||
| 43 | status = "okay"; | ||
| 44 | }; | ||
| 45 | }; | ||
| 46 | }; | ||
| 47 | }; | ||
diff --git a/arch/arm/boot/dts/spear600.dtsi b/arch/arm/boot/dts/spear600.dtsi new file mode 100644 index 000000000000..ebe0885a2b98 --- /dev/null +++ b/arch/arm/boot/dts/spear600.dtsi | |||
| @@ -0,0 +1,174 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2012 Stefan Roese <sr@denx.de> | ||
| 3 | * | ||
| 4 | * The code contained herein is licensed under the GNU General Public | ||
| 5 | * License. You may obtain a copy of the GNU General Public License | ||
| 6 | * Version 2 or later at the following locations: | ||
| 7 | * | ||
| 8 | * http://www.opensource.org/licenses/gpl-license.html | ||
| 9 | * http://www.gnu.org/copyleft/gpl.html | ||
| 10 | */ | ||
| 11 | |||
| 12 | /include/ "skeleton.dtsi" | ||
| 13 | |||
| 14 | / { | ||
| 15 | compatible = "st,spear600"; | ||
| 16 | |||
| 17 | cpus { | ||
| 18 | cpu@0 { | ||
| 19 | compatible = "arm,arm926ejs"; | ||
| 20 | }; | ||
| 21 | }; | ||
| 22 | |||
| 23 | memory { | ||
| 24 | device_type = "memory"; | ||
| 25 | reg = <0 0x40000000>; | ||
| 26 | }; | ||
| 27 | |||
| 28 | ahb { | ||
| 29 | #address-cells = <1>; | ||
| 30 | #size-cells = <1>; | ||
| 31 | compatible = "simple-bus"; | ||
| 32 | ranges = <0xd0000000 0xd0000000 0x30000000>; | ||
| 33 | |||
| 34 | vic0: interrupt-controller@f1100000 { | ||
| 35 | compatible = "arm,pl190-vic"; | ||
| 36 | interrupt-controller; | ||
| 37 | reg = <0xf1100000 0x1000>; | ||
| 38 | #interrupt-cells = <1>; | ||
| 39 | }; | ||
| 40 | |||
| 41 | vic1: interrupt-controller@f1000000 { | ||
| 42 | compatible = "arm,pl190-vic"; | ||
| 43 | interrupt-controller; | ||
| 44 | reg = <0xf1000000 0x1000>; | ||
| 45 | #interrupt-cells = <1>; | ||
| 46 | }; | ||
| 47 | |||
| 48 | gmac: ethernet@e0800000 { | ||
| 49 | compatible = "st,spear600-gmac"; | ||
| 50 | reg = <0xe0800000 0x8000>; | ||
| 51 | interrupt-parent = <&vic1>; | ||
| 52 | interrupts = <24 23>; | ||
| 53 | interrupt-names = "macirq", "eth_wake_irq"; | ||
| 54 | status = "disabled"; | ||
| 55 | }; | ||
| 56 | |||
| 57 | fsmc: flash@d1800000 { | ||
| 58 | compatible = "st,spear600-fsmc-nand"; | ||
| 59 | #address-cells = <1>; | ||
| 60 | #size-cells = <1>; | ||
| 61 | reg = <0xd1800000 0x1000 /* FSMC Register */ | ||
| 62 | 0xd2000000 0x4000>; /* NAND Base */ | ||
| 63 | reg-names = "fsmc_regs", "nand_data"; | ||
| 64 | st,ale-off = <0x20000>; | ||
| 65 | st,cle-off = <0x10000>; | ||
| 66 | status = "disabled"; | ||
| 67 | }; | ||
| 68 | |||
| 69 | smi: flash@fc000000 { | ||
| 70 | compatible = "st,spear600-smi"; | ||
| 71 | #address-cells = <1>; | ||
| 72 | #size-cells = <1>; | ||
| 73 | reg = <0xfc000000 0x1000>; | ||
| 74 | interrupt-parent = <&vic1>; | ||
| 75 | interrupts = <12>; | ||
| 76 | status = "disabled"; | ||
| 77 | }; | ||
| 78 | |||
| 79 | ehci@e1800000 { | ||
| 80 | compatible = "st,spear600-ehci", "usb-ehci"; | ||
| 81 | reg = <0xe1800000 0x1000>; | ||
| 82 | interrupt-parent = <&vic1>; | ||
| 83 | interrupts = <27>; | ||
| 84 | status = "disabled"; | ||
| 85 | }; | ||
| 86 | |||
| 87 | ehci@e2000000 { | ||
| 88 | compatible = "st,spear600-ehci", "usb-ehci"; | ||
| 89 | reg = <0xe2000000 0x1000>; | ||
| 90 | interrupt-parent = <&vic1>; | ||
| 91 | interrupts = <29>; | ||
| 92 | status = "disabled"; | ||
| 93 | }; | ||
| 94 | |||
| 95 | ohci@e1900000 { | ||
| 96 | compatible = "st,spear600-ohci", "usb-ohci"; | ||
| 97 | reg = <0xe1900000 0x1000>; | ||
| 98 | interrupt-parent = <&vic1>; | ||
| 99 | interrupts = <26>; | ||
| 100 | status = "disabled"; | ||
| 101 | }; | ||
| 102 | |||
| 103 | ohci@e2100000 { | ||
| 104 | compatible = "st,spear600-ohci", "usb-ohci"; | ||
| 105 | reg = <0xe2100000 0x1000>; | ||
| 106 | interrupt-parent = <&vic1>; | ||
| 107 | interrupts = <28>; | ||
| 108 | status = "disabled"; | ||
| 109 | }; | ||
| 110 | |||
| 111 | apb { | ||
| 112 | #address-cells = <1>; | ||
| 113 | #size-cells = <1>; | ||
| 114 | compatible = "simple-bus"; | ||
| 115 | ranges = <0xd0000000 0xd0000000 0x30000000>; | ||
| 116 | |||
| 117 | serial@d0000000 { | ||
| 118 | compatible = "arm,pl011", "arm,primecell"; | ||
| 119 | reg = <0xd0000000 0x1000>; | ||
| 120 | interrupt-parent = <&vic0>; | ||
| 121 | interrupts = <24>; | ||
| 122 | status = "disabled"; | ||
| 123 | }; | ||
| 124 | |||
| 125 | serial@d0080000 { | ||
| 126 | compatible = "arm,pl011", "arm,primecell"; | ||
| 127 | reg = <0xd0080000 0x1000>; | ||
| 128 | interrupt-parent = <&vic0>; | ||
| 129 | interrupts = <25>; | ||
| 130 | status = "disabled"; | ||
| 131 | }; | ||
| 132 | |||
| 133 | /* local/cpu GPIO */ | ||
| 134 | gpio0: gpio@f0100000 { | ||
| 135 | #gpio-cells = <2>; | ||
| 136 | compatible = "arm,pl061", "arm,primecell"; | ||
| 137 | gpio-controller; | ||
| 138 | reg = <0xf0100000 0x1000>; | ||
| 139 | interrupt-parent = <&vic0>; | ||
| 140 | interrupts = <18>; | ||
| 141 | }; | ||
| 142 | |||
| 143 | /* basic GPIO */ | ||
| 144 | gpio1: gpio@fc980000 { | ||
| 145 | #gpio-cells = <2>; | ||
| 146 | compatible = "arm,pl061", "arm,primecell"; | ||
| 147 | gpio-controller; | ||
| 148 | reg = <0xfc980000 0x1000>; | ||
| 149 | interrupt-parent = <&vic1>; | ||
| 150 | interrupts = <19>; | ||
| 151 | }; | ||
| 152 | |||
| 153 | /* appl GPIO */ | ||
| 154 | gpio2: gpio@d8100000 { | ||
| 155 | #gpio-cells = <2>; | ||
| 156 | compatible = "arm,pl061", "arm,primecell"; | ||
| 157 | gpio-controller; | ||
| 158 | reg = <0xd8100000 0x1000>; | ||
| 159 | interrupt-parent = <&vic1>; | ||
| 160 | interrupts = <4>; | ||
| 161 | }; | ||
| 162 | |||
| 163 | i2c@d0200000 { | ||
| 164 | #address-cells = <1>; | ||
| 165 | #size-cells = <0>; | ||
| 166 | compatible = "snps,designware-i2c"; | ||
| 167 | reg = <0xd0200000 0x1000>; | ||
| 168 | interrupt-parent = <&vic0>; | ||
| 169 | interrupts = <28>; | ||
| 170 | status = "disabled"; | ||
| 171 | }; | ||
| 172 | }; | ||
| 173 | }; | ||
| 174 | }; | ||
diff --git a/arch/arm/boot/dts/tegra-seaboard.dts b/arch/arm/boot/dts/tegra-seaboard.dts index 876d5c92ce36..dbf1c5a171c2 100644 --- a/arch/arm/boot/dts/tegra-seaboard.dts +++ b/arch/arm/boot/dts/tegra-seaboard.dts | |||
| @@ -112,6 +112,7 @@ | |||
| 112 | 112 | ||
| 113 | usb@c5000000 { | 113 | usb@c5000000 { |
| 114 | nvidia,vbus-gpio = <&gpio 24 0>; /* PD0 */ | 114 | nvidia,vbus-gpio = <&gpio 24 0>; /* PD0 */ |
| 115 | dr_mode = "otg"; | ||
| 115 | }; | 116 | }; |
| 116 | 117 | ||
| 117 | gpio-keys { | 118 | gpio-keys { |
diff --git a/arch/arm/boot/dts/tegra20.dtsi b/arch/arm/boot/dts/tegra20.dtsi index aff8a175aa40..108e894a8926 100644 --- a/arch/arm/boot/dts/tegra20.dtsi +++ b/arch/arm/boot/dts/tegra20.dtsi | |||
| @@ -190,6 +190,7 @@ | |||
| 190 | reg = <0xc5000000 0x4000>; | 190 | reg = <0xc5000000 0x4000>; |
| 191 | interrupts = < 0 20 0x04 >; | 191 | interrupts = < 0 20 0x04 >; |
| 192 | phy_type = "utmi"; | 192 | phy_type = "utmi"; |
| 193 | nvidia,has-legacy-mode; | ||
| 193 | }; | 194 | }; |
| 194 | 195 | ||
| 195 | usb@c5004000 { | 196 | usb@c5004000 { |
diff --git a/arch/arm/boot/dts/usb_a9g20-dab-mmx.dtsi b/arch/arm/boot/dts/usb_a9g20-dab-mmx.dtsi new file mode 100644 index 000000000000..ad3eca17c436 --- /dev/null +++ b/arch/arm/boot/dts/usb_a9g20-dab-mmx.dtsi | |||
| @@ -0,0 +1,96 @@ | |||
| 1 | /* | ||
| 2 | * calao-dab-mmx.dtsi - Device Tree Include file for Calao DAB-MMX Daughter Board | ||
| 3 | * | ||
| 4 | * Copyright (C) 2011 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> | ||
| 5 | * | ||
| 6 | * Licensed under GPLv2. | ||
| 7 | */ | ||
| 8 | |||
| 9 | / { | ||
| 10 | ahb { | ||
| 11 | apb { | ||
| 12 | usart1: serial@fffb4000 { | ||
| 13 | status = "okay"; | ||
| 14 | }; | ||
| 15 | |||
| 16 | usart3: serial@fffd0000 { | ||
| 17 | status = "okay"; | ||
| 18 | }; | ||
| 19 | }; | ||
| 20 | }; | ||
| 21 | |||
| 22 | i2c-gpio@0 { | ||
| 23 | status = "okay"; | ||
| 24 | }; | ||
| 25 | |||
| 26 | leds { | ||
| 27 | compatible = "gpio-leds"; | ||
| 28 | |||
| 29 | user_led1 { | ||
| 30 | label = "user_led1"; | ||
| 31 | gpios = <&pioB 20 1>; | ||
| 32 | }; | ||
| 33 | |||
| 34 | /* | ||
| 35 | * led already used by mother board but active as high | ||
| 36 | * user_led2 { | ||
| 37 | * label = "user_led2"; | ||
| 38 | * gpios = <&pioB 21 1>; | ||
| 39 | * }; | ||
| 40 | */ | ||
| 41 | user_led3 { | ||
| 42 | label = "user_led3"; | ||
| 43 | gpios = <&pioB 22 1>; | ||
| 44 | }; | ||
| 45 | |||
| 46 | user_led4 { | ||
| 47 | label = "user_led4"; | ||
| 48 | gpios = <&pioB 23 1>; | ||
| 49 | }; | ||
| 50 | |||
| 51 | red { | ||
| 52 | label = "red"; | ||
| 53 | gpios = <&pioB 24 1>; | ||
| 54 | }; | ||
| 55 | |||
| 56 | orange { | ||
| 57 | label = "orange"; | ||
| 58 | gpios = <&pioB 30 1>; | ||
| 59 | }; | ||
| 60 | |||
| 61 | green { | ||
| 62 | label = "green"; | ||
| 63 | gpios = <&pioB 31 1>; | ||
| 64 | }; | ||
| 65 | }; | ||
| 66 | |||
| 67 | gpio_keys { | ||
| 68 | compatible = "gpio-keys"; | ||
| 69 | #address-cells = <1>; | ||
| 70 | #size-cells = <0>; | ||
| 71 | |||
| 72 | user_pb1 { | ||
| 73 | label = "user_pb1"; | ||
| 74 | gpios = <&pioB 25 1>; | ||
| 75 | linux,code = <0x100>; | ||
| 76 | }; | ||
| 77 | |||
| 78 | user_pb2 { | ||
| 79 | label = "user_pb2"; | ||
| 80 | gpios = <&pioB 13 1>; | ||
| 81 | linux,code = <0x101>; | ||
| 82 | }; | ||
| 83 | |||
| 84 | user_pb3 { | ||
| 85 | label = "user_pb3"; | ||
| 86 | gpios = <&pioA 26 1>; | ||
| 87 | linux,code = <0x102>; | ||
| 88 | }; | ||
| 89 | |||
| 90 | user_pb4 { | ||
| 91 | label = "user_pb4"; | ||
| 92 | gpios = <&pioC 9 1>; | ||
| 93 | linux,code = <0x103>; | ||
| 94 | }; | ||
| 95 | }; | ||
| 96 | }; | ||
diff --git a/arch/arm/boot/dts/usb_a9g20.dts b/arch/arm/boot/dts/usb_a9g20.dts index d74545a2a77c..3b3c4e0fa79f 100644 --- a/arch/arm/boot/dts/usb_a9g20.dts +++ b/arch/arm/boot/dts/usb_a9g20.dts | |||
| @@ -13,13 +13,24 @@ | |||
| 13 | compatible = "calao,usb-a9g20", "atmel,at91sam9g20", "atmel,at91sam9"; | 13 | compatible = "calao,usb-a9g20", "atmel,at91sam9g20", "atmel,at91sam9"; |
| 14 | 14 | ||
| 15 | chosen { | 15 | chosen { |
| 16 | bootargs = "mem=64M console=ttyS0,115200 mtdparts=atmel_nand:128k(at91bootstrap),256k(barebox)ro,128k(bareboxenv),128k(bareboxenv2),4M(kernel),120M(rootfs),-(data) root=/dev/mtdblock5 rw rootfstype=ubifs"; | 16 | bootargs = "mem=64M console=ttyS0,115200 root=/dev/mtdblock5 rw rootfstype=ubifs"; |
| 17 | }; | 17 | }; |
| 18 | 18 | ||
| 19 | memory@20000000 { | 19 | memory@20000000 { |
| 20 | reg = <0x20000000 0x4000000>; | 20 | reg = <0x20000000 0x4000000>; |
| 21 | }; | 21 | }; |
| 22 | 22 | ||
| 23 | clocks { | ||
| 24 | #address-cells = <1>; | ||
| 25 | #size-cells = <1>; | ||
| 26 | ranges; | ||
| 27 | |||
| 28 | main_clock: clock@0 { | ||
| 29 | compatible = "atmel,osc", "fixed-clock"; | ||
| 30 | clock-frequency = <12000000>; | ||
| 31 | }; | ||
| 32 | }; | ||
| 33 | |||
| 23 | ahb { | 34 | ahb { |
| 24 | apb { | 35 | apb { |
| 25 | dbgu: serial@fffff200 { | 36 | dbgu: serial@fffff200 { |
| @@ -30,6 +41,58 @@ | |||
| 30 | phy-mode = "rmii"; | 41 | phy-mode = "rmii"; |
| 31 | status = "okay"; | 42 | status = "okay"; |
| 32 | }; | 43 | }; |
| 44 | |||
| 45 | usb1: gadget@fffa4000 { | ||
| 46 | atmel,vbus-gpio = <&pioC 5 0>; | ||
| 47 | status = "okay"; | ||
| 48 | }; | ||
| 49 | }; | ||
| 50 | |||
| 51 | nand0: nand@40000000 { | ||
| 52 | nand-bus-width = <8>; | ||
| 53 | nand-ecc-mode = "soft"; | ||
| 54 | nand-on-flash-bbt; | ||
| 55 | status = "okay"; | ||
| 56 | |||
| 57 | at91bootstrap@0 { | ||
| 58 | label = "at91bootstrap"; | ||
| 59 | reg = <0x0 0x20000>; | ||
| 60 | }; | ||
| 61 | |||
| 62 | barebox@20000 { | ||
| 63 | label = "barebox"; | ||
| 64 | reg = <0x20000 0x40000>; | ||
| 65 | }; | ||
| 66 | |||
| 67 | bareboxenv@60000 { | ||
| 68 | label = "bareboxenv"; | ||
| 69 | reg = <0x60000 0x20000>; | ||
| 70 | }; | ||
| 71 | |||
| 72 | bareboxenv2@80000 { | ||
| 73 | label = "bareboxenv2"; | ||
| 74 | reg = <0x80000 0x20000>; | ||
| 75 | }; | ||
| 76 | |||
| 77 | kernel@a0000 { | ||
| 78 | label = "kernel"; | ||
| 79 | reg = <0xa0000 0x400000>; | ||
| 80 | }; | ||
| 81 | |||
| 82 | rootfs@4a0000 { | ||
| 83 | label = "rootfs"; | ||
| 84 | reg = <0x4a0000 0x7800000>; | ||
| 85 | }; | ||
| 86 | |||
| 87 | data@7ca0000 { | ||
| 88 | label = "data"; | ||
| 89 | reg = <0x7ca0000 0x8360000>; | ||
| 90 | }; | ||
| 91 | }; | ||
| 92 | |||
| 93 | usb0: ohci@00500000 { | ||
| 94 | num-ports = <2>; | ||
| 95 | status = "okay"; | ||
| 33 | }; | 96 | }; |
| 34 | }; | 97 | }; |
| 35 | 98 | ||
| @@ -55,4 +118,13 @@ | |||
| 55 | gpio-key,wakeup; | 118 | gpio-key,wakeup; |
| 56 | }; | 119 | }; |
| 57 | }; | 120 | }; |
| 121 | |||
| 122 | i2c@0 { | ||
| 123 | status = "okay"; | ||
| 124 | |||
| 125 | rv3029c2@56 { | ||
| 126 | compatible = "rv3029c2"; | ||
| 127 | reg = <0x56>; | ||
| 128 | }; | ||
| 129 | }; | ||
| 58 | }; | 130 | }; |
diff --git a/arch/arm/configs/at91sam9g20_defconfig b/arch/arm/configs/at91sam9g20_defconfig index 9123568d9a8d..994d331b2319 100644 --- a/arch/arm/configs/at91sam9g20_defconfig +++ b/arch/arm/configs/at91sam9g20_defconfig | |||
| @@ -74,6 +74,8 @@ CONFIG_LEGACY_PTY_COUNT=16 | |||
| 74 | CONFIG_SERIAL_ATMEL=y | 74 | CONFIG_SERIAL_ATMEL=y |
| 75 | CONFIG_SERIAL_ATMEL_CONSOLE=y | 75 | CONFIG_SERIAL_ATMEL_CONSOLE=y |
| 76 | CONFIG_HW_RANDOM=y | 76 | CONFIG_HW_RANDOM=y |
| 77 | CONFIG_I2C=y | ||
| 78 | CONFIG_I2C_GPIO=y | ||
| 77 | CONFIG_SPI=y | 79 | CONFIG_SPI=y |
| 78 | CONFIG_SPI_ATMEL=y | 80 | CONFIG_SPI_ATMEL=y |
| 79 | CONFIG_SPI_SPIDEV=y | 81 | CONFIG_SPI_SPIDEV=y |
| @@ -105,6 +107,7 @@ CONFIG_LEDS_TRIGGERS=y | |||
| 105 | CONFIG_LEDS_TRIGGER_TIMER=y | 107 | CONFIG_LEDS_TRIGGER_TIMER=y |
| 106 | CONFIG_LEDS_TRIGGER_HEARTBEAT=y | 108 | CONFIG_LEDS_TRIGGER_HEARTBEAT=y |
| 107 | CONFIG_RTC_CLASS=y | 109 | CONFIG_RTC_CLASS=y |
| 110 | CONFIG_RTC_DRV_RV3029C2=y | ||
| 108 | CONFIG_RTC_DRV_AT91SAM9=y | 111 | CONFIG_RTC_DRV_AT91SAM9=y |
| 109 | CONFIG_EXT2_FS=y | 112 | CONFIG_EXT2_FS=y |
| 110 | CONFIG_MSDOS_FS=y | 113 | CONFIG_MSDOS_FS=y |
diff --git a/arch/arm/configs/u8500_defconfig b/arch/arm/configs/u8500_defconfig index 2d7b6e7b7271..889d73ac1ae1 100644 --- a/arch/arm/configs/u8500_defconfig +++ b/arch/arm/configs/u8500_defconfig | |||
| @@ -13,6 +13,7 @@ CONFIG_UX500_SOC_DB8500=y | |||
| 13 | CONFIG_MACH_HREFV60=y | 13 | CONFIG_MACH_HREFV60=y |
| 14 | CONFIG_MACH_SNOWBALL=y | 14 | CONFIG_MACH_SNOWBALL=y |
| 15 | CONFIG_MACH_U5500=y | 15 | CONFIG_MACH_U5500=y |
| 16 | CONFIG_MACH_UX500_DT=y | ||
| 16 | CONFIG_NO_HZ=y | 17 | CONFIG_NO_HZ=y |
| 17 | CONFIG_HIGH_RES_TIMERS=y | 18 | CONFIG_HIGH_RES_TIMERS=y |
| 18 | CONFIG_SMP=y | 19 | CONFIG_SMP=y |
diff --git a/arch/arm/mach-at91/Kconfig b/arch/arm/mach-at91/Kconfig index e55cdcbd81fb..45db05d8d94c 100644 --- a/arch/arm/mach-at91/Kconfig +++ b/arch/arm/mach-at91/Kconfig | |||
| @@ -20,9 +20,11 @@ config HAVE_AT91_USART5 | |||
| 20 | 20 | ||
| 21 | config AT91_SAM9_ALT_RESET | 21 | config AT91_SAM9_ALT_RESET |
| 22 | bool | 22 | bool |
| 23 | default !ARCH_AT91X40 | ||
| 23 | 24 | ||
| 24 | config AT91_SAM9G45_RESET | 25 | config AT91_SAM9G45_RESET |
| 25 | bool | 26 | bool |
| 27 | default !ARCH_AT91X40 | ||
| 26 | 28 | ||
| 27 | menu "Atmel AT91 System-on-Chip" | 29 | menu "Atmel AT91 System-on-Chip" |
| 28 | 30 | ||
| @@ -45,7 +47,6 @@ config ARCH_AT91SAM9260 | |||
| 45 | select HAVE_AT91_USART4 | 47 | select HAVE_AT91_USART4 |
| 46 | select HAVE_AT91_USART5 | 48 | select HAVE_AT91_USART5 |
| 47 | select HAVE_NET_MACB | 49 | select HAVE_NET_MACB |
| 48 | select AT91_SAM9_ALT_RESET | ||
| 49 | 50 | ||
| 50 | config ARCH_AT91SAM9261 | 51 | config ARCH_AT91SAM9261 |
| 51 | bool "AT91SAM9261" | 52 | bool "AT91SAM9261" |
| @@ -53,7 +54,6 @@ config ARCH_AT91SAM9261 | |||
| 53 | select GENERIC_CLOCKEVENTS | 54 | select GENERIC_CLOCKEVENTS |
| 54 | select HAVE_FB_ATMEL | 55 | select HAVE_FB_ATMEL |
| 55 | select HAVE_AT91_DBGU0 | 56 | select HAVE_AT91_DBGU0 |
| 56 | select AT91_SAM9_ALT_RESET | ||
| 57 | 57 | ||
| 58 | config ARCH_AT91SAM9G10 | 58 | config ARCH_AT91SAM9G10 |
| 59 | bool "AT91SAM9G10" | 59 | bool "AT91SAM9G10" |
| @@ -61,7 +61,6 @@ config ARCH_AT91SAM9G10 | |||
| 61 | select GENERIC_CLOCKEVENTS | 61 | select GENERIC_CLOCKEVENTS |
| 62 | select HAVE_AT91_DBGU0 | 62 | select HAVE_AT91_DBGU0 |
| 63 | select HAVE_FB_ATMEL | 63 | select HAVE_FB_ATMEL |
| 64 | select AT91_SAM9_ALT_RESET | ||
| 65 | 64 | ||
| 66 | config ARCH_AT91SAM9263 | 65 | config ARCH_AT91SAM9263 |
| 67 | bool "AT91SAM9263" | 66 | bool "AT91SAM9263" |
| @@ -70,7 +69,6 @@ config ARCH_AT91SAM9263 | |||
| 70 | select HAVE_FB_ATMEL | 69 | select HAVE_FB_ATMEL |
| 71 | select HAVE_NET_MACB | 70 | select HAVE_NET_MACB |
| 72 | select HAVE_AT91_DBGU1 | 71 | select HAVE_AT91_DBGU1 |
| 73 | select AT91_SAM9_ALT_RESET | ||
| 74 | 72 | ||
| 75 | config ARCH_AT91SAM9RL | 73 | config ARCH_AT91SAM9RL |
| 76 | bool "AT91SAM9RL" | 74 | bool "AT91SAM9RL" |
| @@ -79,7 +77,6 @@ config ARCH_AT91SAM9RL | |||
| 79 | select HAVE_AT91_USART3 | 77 | select HAVE_AT91_USART3 |
| 80 | select HAVE_FB_ATMEL | 78 | select HAVE_FB_ATMEL |
| 81 | select HAVE_AT91_DBGU0 | 79 | select HAVE_AT91_DBGU0 |
| 82 | select AT91_SAM9_ALT_RESET | ||
| 83 | 80 | ||
| 84 | config ARCH_AT91SAM9G20 | 81 | config ARCH_AT91SAM9G20 |
| 85 | bool "AT91SAM9G20" | 82 | bool "AT91SAM9G20" |
| @@ -90,7 +87,6 @@ config ARCH_AT91SAM9G20 | |||
| 90 | select HAVE_AT91_USART4 | 87 | select HAVE_AT91_USART4 |
| 91 | select HAVE_AT91_USART5 | 88 | select HAVE_AT91_USART5 |
| 92 | select HAVE_NET_MACB | 89 | select HAVE_NET_MACB |
| 93 | select AT91_SAM9_ALT_RESET | ||
| 94 | 90 | ||
| 95 | config ARCH_AT91SAM9G45 | 91 | config ARCH_AT91SAM9G45 |
| 96 | bool "AT91SAM9G45" | 92 | bool "AT91SAM9G45" |
| @@ -100,7 +96,6 @@ config ARCH_AT91SAM9G45 | |||
| 100 | select HAVE_FB_ATMEL | 96 | select HAVE_FB_ATMEL |
| 101 | select HAVE_NET_MACB | 97 | select HAVE_NET_MACB |
| 102 | select HAVE_AT91_DBGU1 | 98 | select HAVE_AT91_DBGU1 |
| 103 | select AT91_SAM9G45_RESET | ||
| 104 | 99 | ||
| 105 | config ARCH_AT91SAM9X5 | 100 | config ARCH_AT91SAM9X5 |
| 106 | bool "AT91SAM9x5 family" | 101 | bool "AT91SAM9x5 family" |
| @@ -109,7 +104,6 @@ config ARCH_AT91SAM9X5 | |||
| 109 | select HAVE_FB_ATMEL | 104 | select HAVE_FB_ATMEL |
| 110 | select HAVE_NET_MACB | 105 | select HAVE_NET_MACB |
| 111 | select HAVE_AT91_DBGU0 | 106 | select HAVE_AT91_DBGU0 |
| 112 | select AT91_SAM9G45_RESET | ||
| 113 | 107 | ||
| 114 | config ARCH_AT91X40 | 108 | config ARCH_AT91X40 |
| 115 | bool "AT91x40" | 109 | bool "AT91x40" |
diff --git a/arch/arm/mach-at91/at91sam9260.c b/arch/arm/mach-at91/at91sam9260.c index 14b5a9c9a514..d1e5750a6a04 100644 --- a/arch/arm/mach-at91/at91sam9260.c +++ b/arch/arm/mach-at91/at91sam9260.c | |||
| @@ -216,6 +216,7 @@ static struct clk_lookup periph_clocks_lookups[] = { | |||
| 216 | CLKDEV_CON_DEV_ID("t0_clk", "fffdc000.timer", &tc3_clk), | 216 | CLKDEV_CON_DEV_ID("t0_clk", "fffdc000.timer", &tc3_clk), |
| 217 | CLKDEV_CON_DEV_ID("t1_clk", "fffdc000.timer", &tc4_clk), | 217 | CLKDEV_CON_DEV_ID("t1_clk", "fffdc000.timer", &tc4_clk), |
| 218 | CLKDEV_CON_DEV_ID("t2_clk", "fffdc000.timer", &tc5_clk), | 218 | CLKDEV_CON_DEV_ID("t2_clk", "fffdc000.timer", &tc5_clk), |
| 219 | CLKDEV_CON_DEV_ID("hclk", "500000.ohci", &ohci_clk), | ||
| 219 | /* fake hclk clock */ | 220 | /* fake hclk clock */ |
| 220 | CLKDEV_CON_DEV_ID("hclk", "at91_ohci", &ohci_clk), | 221 | CLKDEV_CON_DEV_ID("hclk", "at91_ohci", &ohci_clk), |
| 221 | CLKDEV_CON_ID("pioA", &pioA_clk), | 222 | CLKDEV_CON_ID("pioA", &pioA_clk), |
diff --git a/arch/arm/mach-at91/at91sam9g45.c b/arch/arm/mach-at91/at91sam9g45.c index 0014573dfe17..df3bceacc86c 100644 --- a/arch/arm/mach-at91/at91sam9g45.c +++ b/arch/arm/mach-at91/at91sam9g45.c | |||
| @@ -232,6 +232,8 @@ static struct clk_lookup periph_clocks_lookups[] = { | |||
| 232 | /* more tc lookup table for DT entries */ | 232 | /* more tc lookup table for DT entries */ |
| 233 | CLKDEV_CON_DEV_ID("t0_clk", "fff7c000.timer", &tcb0_clk), | 233 | CLKDEV_CON_DEV_ID("t0_clk", "fff7c000.timer", &tcb0_clk), |
| 234 | CLKDEV_CON_DEV_ID("t0_clk", "fffd4000.timer", &tcb0_clk), | 234 | CLKDEV_CON_DEV_ID("t0_clk", "fffd4000.timer", &tcb0_clk), |
| 235 | CLKDEV_CON_DEV_ID("hclk", "700000.ohci", &uhphs_clk), | ||
| 236 | CLKDEV_CON_DEV_ID("ehci_clk", "800000.ehci", &uhphs_clk), | ||
| 235 | /* fake hclk clock */ | 237 | /* fake hclk clock */ |
| 236 | CLKDEV_CON_DEV_ID("hclk", "at91_ohci", &uhphs_clk), | 238 | CLKDEV_CON_DEV_ID("hclk", "at91_ohci", &uhphs_clk), |
| 237 | CLKDEV_CON_ID("pioA", &pioA_clk), | 239 | CLKDEV_CON_ID("pioA", &pioA_clk), |
diff --git a/arch/arm/mach-at91/at91sam9x5.c b/arch/arm/mach-at91/at91sam9x5.c index a34d96afa746..b6831eeb7b76 100644 --- a/arch/arm/mach-at91/at91sam9x5.c +++ b/arch/arm/mach-at91/at91sam9x5.c | |||
| @@ -131,7 +131,7 @@ static struct clk dma1_clk = { | |||
| 131 | .type = CLK_TYPE_PERIPHERAL, | 131 | .type = CLK_TYPE_PERIPHERAL, |
| 132 | }; | 132 | }; |
| 133 | static struct clk uhphs_clk = { | 133 | static struct clk uhphs_clk = { |
| 134 | .name = "uhphs_clk", | 134 | .name = "uhphs", |
| 135 | .pmc_mask = 1 << AT91SAM9X5_ID_UHPHS, | 135 | .pmc_mask = 1 << AT91SAM9X5_ID_UHPHS, |
| 136 | .type = CLK_TYPE_PERIPHERAL, | 136 | .type = CLK_TYPE_PERIPHERAL, |
| 137 | }; | 137 | }; |
| @@ -230,6 +230,9 @@ static struct clk_lookup periph_clocks_lookups[] = { | |||
| 230 | /* additional fake clock for macb_hclk */ | 230 | /* additional fake clock for macb_hclk */ |
| 231 | CLKDEV_CON_DEV_ID("hclk", "f802c000.ethernet", &macb0_clk), | 231 | CLKDEV_CON_DEV_ID("hclk", "f802c000.ethernet", &macb0_clk), |
| 232 | CLKDEV_CON_DEV_ID("hclk", "f8030000.ethernet", &macb1_clk), | 232 | CLKDEV_CON_DEV_ID("hclk", "f8030000.ethernet", &macb1_clk), |
| 233 | CLKDEV_CON_DEV_ID("hclk", "600000.ohci", &uhphs_clk), | ||
| 234 | CLKDEV_CON_DEV_ID("ohci_clk", "600000.ohci", &uhphs_clk), | ||
| 235 | CLKDEV_CON_DEV_ID("ehci_clk", "700000.ehci", &uhphs_clk), | ||
| 233 | }; | 236 | }; |
| 234 | 237 | ||
| 235 | /* | 238 | /* |
| @@ -299,14 +302,8 @@ static void __init at91sam9x5_map_io(void) | |||
| 299 | at91_init_sram(0, AT91SAM9X5_SRAM_BASE, AT91SAM9X5_SRAM_SIZE); | 302 | at91_init_sram(0, AT91SAM9X5_SRAM_BASE, AT91SAM9X5_SRAM_SIZE); |
| 300 | } | 303 | } |
| 301 | 304 | ||
| 302 | static void __init at91sam9x5_ioremap_registers(void) | ||
| 303 | { | ||
| 304 | at91_ioremap_ramc(0, AT91SAM9X5_BASE_DDRSDRC0, 512); | ||
| 305 | } | ||
| 306 | |||
| 307 | void __init at91sam9x5_initialize(void) | 305 | void __init at91sam9x5_initialize(void) |
| 308 | { | 306 | { |
| 309 | arm_pm_restart = at91sam9g45_restart; | ||
| 310 | at91_extern_irq = (1 << AT91SAM9X5_ID_IRQ0); | 307 | at91_extern_irq = (1 << AT91SAM9X5_ID_IRQ0); |
| 311 | 308 | ||
| 312 | /* Register GPIO subsystem (using DT) */ | 309 | /* Register GPIO subsystem (using DT) */ |
| @@ -314,11 +311,6 @@ void __init at91sam9x5_initialize(void) | |||
| 314 | } | 311 | } |
| 315 | 312 | ||
| 316 | /* -------------------------------------------------------------------- | 313 | /* -------------------------------------------------------------------- |
| 317 | * AT91SAM9x5 devices (temporary before modification of code) | ||
| 318 | * -------------------------------------------------------------------- */ | ||
| 319 | void __init at91_add_device_nand(struct atmel_nand_data *data) {} | ||
| 320 | |||
| 321 | /* -------------------------------------------------------------------- | ||
| 322 | * Interrupt initialization | 314 | * Interrupt initialization |
| 323 | * -------------------------------------------------------------------- */ | 315 | * -------------------------------------------------------------------- */ |
| 324 | /* | 316 | /* |
| @@ -362,7 +354,6 @@ static unsigned int at91sam9x5_default_irq_priority[NR_AIC_IRQS] __initdata = { | |||
| 362 | struct at91_init_soc __initdata at91sam9x5_soc = { | 354 | struct at91_init_soc __initdata at91sam9x5_soc = { |
| 363 | .map_io = at91sam9x5_map_io, | 355 | .map_io = at91sam9x5_map_io, |
| 364 | .default_irq_priority = at91sam9x5_default_irq_priority, | 356 | .default_irq_priority = at91sam9x5_default_irq_priority, |
| 365 | .ioremap_registers = at91sam9x5_ioremap_registers, | ||
| 366 | .register_clocks = at91sam9x5_register_clocks, | 357 | .register_clocks = at91sam9x5_register_clocks, |
| 367 | .init = at91sam9x5_initialize, | 358 | .init = at91sam9x5_initialize, |
| 368 | }; | 359 | }; |
diff --git a/arch/arm/mach-at91/board-afeb-9260v1.c b/arch/arm/mach-at91/board-afeb-9260v1.c index 3bb40694b02d..161efbaa1029 100644 --- a/arch/arm/mach-at91/board-afeb-9260v1.c +++ b/arch/arm/mach-at91/board-afeb-9260v1.c | |||
| @@ -138,6 +138,7 @@ static struct atmel_nand_data __initdata afeb9260_nand_data = { | |||
| 138 | .rdy_pin = AT91_PIN_PC13, | 138 | .rdy_pin = AT91_PIN_PC13, |
| 139 | .enable_pin = AT91_PIN_PC14, | 139 | .enable_pin = AT91_PIN_PC14, |
| 140 | .bus_width_16 = 0, | 140 | .bus_width_16 = 0, |
| 141 | .ecc_mode = NAND_ECC_SOFT, | ||
| 141 | .parts = afeb9260_nand_partition, | 142 | .parts = afeb9260_nand_partition, |
| 142 | .num_parts = ARRAY_SIZE(afeb9260_nand_partition), | 143 | .num_parts = ARRAY_SIZE(afeb9260_nand_partition), |
| 143 | .det_pin = -EINVAL, | 144 | .det_pin = -EINVAL, |
diff --git a/arch/arm/mach-at91/board-cam60.c b/arch/arm/mach-at91/board-cam60.c index 8510e9e54988..c6d44ee0c77e 100644 --- a/arch/arm/mach-at91/board-cam60.c +++ b/arch/arm/mach-at91/board-cam60.c | |||
| @@ -140,6 +140,7 @@ static struct atmel_nand_data __initdata cam60_nand_data = { | |||
| 140 | .det_pin = -EINVAL, | 140 | .det_pin = -EINVAL, |
| 141 | .rdy_pin = AT91_PIN_PA9, | 141 | .rdy_pin = AT91_PIN_PA9, |
| 142 | .enable_pin = AT91_PIN_PA7, | 142 | .enable_pin = AT91_PIN_PA7, |
| 143 | .ecc_mode = NAND_ECC_SOFT, | ||
| 143 | .parts = cam60_nand_partition, | 144 | .parts = cam60_nand_partition, |
| 144 | .num_parts = ARRAY_SIZE(cam60_nand_partition), | 145 | .num_parts = ARRAY_SIZE(cam60_nand_partition), |
| 145 | }; | 146 | }; |
diff --git a/arch/arm/mach-at91/board-cpu9krea.c b/arch/arm/mach-at91/board-cpu9krea.c index 989e1c5a9ca0..5f3680e7c883 100644 --- a/arch/arm/mach-at91/board-cpu9krea.c +++ b/arch/arm/mach-at91/board-cpu9krea.c | |||
| @@ -117,6 +117,7 @@ static struct atmel_nand_data __initdata cpu9krea_nand_data = { | |||
| 117 | .enable_pin = AT91_PIN_PC14, | 117 | .enable_pin = AT91_PIN_PC14, |
| 118 | .bus_width_16 = 0, | 118 | .bus_width_16 = 0, |
| 119 | .det_pin = -EINVAL, | 119 | .det_pin = -EINVAL, |
| 120 | .ecc_mode = NAND_ECC_SOFT, | ||
| 120 | }; | 121 | }; |
| 121 | 122 | ||
| 122 | #ifdef CONFIG_MACH_CPU9260 | 123 | #ifdef CONFIG_MACH_CPU9260 |
diff --git a/arch/arm/mach-at91/board-dt.c b/arch/arm/mach-at91/board-dt.c index 583b72472ad9..c18d4d307801 100644 --- a/arch/arm/mach-at91/board-dt.c +++ b/arch/arm/mach-at91/board-dt.c | |||
| @@ -19,10 +19,7 @@ | |||
| 19 | #include <linux/of_irq.h> | 19 | #include <linux/of_irq.h> |
| 20 | #include <linux/of_platform.h> | 20 | #include <linux/of_platform.h> |
| 21 | 21 | ||
| 22 | #include <mach/hardware.h> | ||
| 23 | #include <mach/board.h> | 22 | #include <mach/board.h> |
| 24 | #include <mach/system_rev.h> | ||
| 25 | #include <mach/at91sam9_smc.h> | ||
| 26 | 23 | ||
| 27 | #include <asm/setup.h> | 24 | #include <asm/setup.h> |
| 28 | #include <asm/irq.h> | 25 | #include <asm/irq.h> |
| @@ -30,58 +27,9 @@ | |||
| 30 | #include <asm/mach/map.h> | 27 | #include <asm/mach/map.h> |
| 31 | #include <asm/mach/irq.h> | 28 | #include <asm/mach/irq.h> |
| 32 | 29 | ||
| 33 | #include "sam9_smc.h" | ||
| 34 | #include "generic.h" | 30 | #include "generic.h" |
| 35 | 31 | ||
| 36 | 32 | ||
| 37 | static void __init ek_init_early(void) | ||
| 38 | { | ||
| 39 | /* Initialize processor: 12.000 MHz crystal */ | ||
| 40 | at91_initialize(12000000); | ||
| 41 | } | ||
| 42 | |||
| 43 | /* det_pin is not connected */ | ||
| 44 | static struct atmel_nand_data __initdata ek_nand_data = { | ||
| 45 | .ale = 21, | ||
| 46 | .cle = 22, | ||
| 47 | .det_pin = -EINVAL, | ||
| 48 | .rdy_pin = AT91_PIN_PC8, | ||
| 49 | .enable_pin = AT91_PIN_PC14, | ||
| 50 | }; | ||
| 51 | |||
| 52 | static struct sam9_smc_config __initdata ek_nand_smc_config = { | ||
| 53 | .ncs_read_setup = 0, | ||
| 54 | .nrd_setup = 2, | ||
| 55 | .ncs_write_setup = 0, | ||
| 56 | .nwe_setup = 2, | ||
| 57 | |||
| 58 | .ncs_read_pulse = 4, | ||
| 59 | .nrd_pulse = 4, | ||
| 60 | .ncs_write_pulse = 4, | ||
| 61 | .nwe_pulse = 4, | ||
| 62 | |||
| 63 | .read_cycle = 7, | ||
| 64 | .write_cycle = 7, | ||
| 65 | |||
| 66 | .mode = AT91_SMC_READMODE | AT91_SMC_WRITEMODE | AT91_SMC_EXNWMODE_DISABLE, | ||
| 67 | .tdf_cycles = 3, | ||
| 68 | }; | ||
| 69 | |||
| 70 | static void __init ek_add_device_nand(void) | ||
| 71 | { | ||
| 72 | ek_nand_data.bus_width_16 = board_have_nand_16bit(); | ||
| 73 | /* setup bus-width (8 or 16) */ | ||
| 74 | if (ek_nand_data.bus_width_16) | ||
| 75 | ek_nand_smc_config.mode |= AT91_SMC_DBW_16; | ||
| 76 | else | ||
| 77 | ek_nand_smc_config.mode |= AT91_SMC_DBW_8; | ||
| 78 | |||
| 79 | /* configure chip-select 3 (NAND) */ | ||
| 80 | sam9_smc_configure(0, 3, &ek_nand_smc_config); | ||
| 81 | |||
| 82 | at91_add_device_nand(&ek_nand_data); | ||
| 83 | } | ||
| 84 | |||
| 85 | static const struct of_device_id irq_of_match[] __initconst = { | 33 | static const struct of_device_id irq_of_match[] __initconst = { |
| 86 | 34 | ||
| 87 | { .compatible = "atmel,at91rm9200-aic", .data = at91_aic_of_init }, | 35 | { .compatible = "atmel,at91rm9200-aic", .data = at91_aic_of_init }, |
| @@ -98,9 +46,6 @@ static void __init at91_dt_init_irq(void) | |||
| 98 | static void __init at91_dt_device_init(void) | 46 | static void __init at91_dt_device_init(void) |
| 99 | { | 47 | { |
| 100 | of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); | 48 | of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); |
| 101 | |||
| 102 | /* NAND */ | ||
| 103 | ek_add_device_nand(); | ||
| 104 | } | 49 | } |
| 105 | 50 | ||
| 106 | static const char *at91_dt_board_compat[] __initdata = { | 51 | static const char *at91_dt_board_compat[] __initdata = { |
| @@ -114,7 +59,7 @@ DT_MACHINE_START(at91sam_dt, "Atmel AT91SAM (Device Tree)") | |||
| 114 | /* Maintainer: Atmel */ | 59 | /* Maintainer: Atmel */ |
| 115 | .timer = &at91sam926x_timer, | 60 | .timer = &at91sam926x_timer, |
| 116 | .map_io = at91_map_io, | 61 | .map_io = at91_map_io, |
| 117 | .init_early = ek_init_early, | 62 | .init_early = at91_dt_initialize, |
| 118 | .init_irq = at91_dt_init_irq, | 63 | .init_irq = at91_dt_init_irq, |
| 119 | .init_machine = at91_dt_device_init, | 64 | .init_machine = at91_dt_device_init, |
| 120 | .dt_compat = at91_dt_board_compat, | 65 | .dt_compat = at91_dt_board_compat, |
diff --git a/arch/arm/mach-at91/board-kb9202.c b/arch/arm/mach-at91/board-kb9202.c index bb9914582013..59b92aab9bcf 100644 --- a/arch/arm/mach-at91/board-kb9202.c +++ b/arch/arm/mach-at91/board-kb9202.c | |||
| @@ -108,6 +108,7 @@ static struct atmel_nand_data __initdata kb9202_nand_data = { | |||
| 108 | .det_pin = -EINVAL, | 108 | .det_pin = -EINVAL, |
| 109 | .rdy_pin = AT91_PIN_PC29, | 109 | .rdy_pin = AT91_PIN_PC29, |
| 110 | .enable_pin = AT91_PIN_PC28, | 110 | .enable_pin = AT91_PIN_PC28, |
| 111 | .ecc_mode = NAND_ECC_SOFT, | ||
| 111 | .parts = kb9202_nand_partition, | 112 | .parts = kb9202_nand_partition, |
| 112 | .num_parts = ARRAY_SIZE(kb9202_nand_partition), | 113 | .num_parts = ARRAY_SIZE(kb9202_nand_partition), |
| 113 | }; | 114 | }; |
diff --git a/arch/arm/mach-at91/board-neocore926.c b/arch/arm/mach-at91/board-neocore926.c index 3f8617c0e04e..57d5f6a4726a 100644 --- a/arch/arm/mach-at91/board-neocore926.c +++ b/arch/arm/mach-at91/board-neocore926.c | |||
| @@ -190,6 +190,7 @@ static struct atmel_nand_data __initdata neocore926_nand_data = { | |||
| 190 | .rdy_pin = AT91_PIN_PB19, | 190 | .rdy_pin = AT91_PIN_PB19, |
| 191 | .rdy_pin_active_low = 1, | 191 | .rdy_pin_active_low = 1, |
| 192 | .enable_pin = AT91_PIN_PD15, | 192 | .enable_pin = AT91_PIN_PD15, |
| 193 | .ecc_mode = NAND_ECC_SOFT, | ||
| 193 | .parts = neocore926_nand_partition, | 194 | .parts = neocore926_nand_partition, |
| 194 | .num_parts = ARRAY_SIZE(neocore926_nand_partition), | 195 | .num_parts = ARRAY_SIZE(neocore926_nand_partition), |
| 195 | .det_pin = -EINVAL, | 196 | .det_pin = -EINVAL, |
diff --git a/arch/arm/mach-at91/board-qil-a9260.c b/arch/arm/mach-at91/board-qil-a9260.c index e029d220cb84..b6ed5ed7081a 100644 --- a/arch/arm/mach-at91/board-qil-a9260.c +++ b/arch/arm/mach-at91/board-qil-a9260.c | |||
| @@ -138,6 +138,8 @@ static struct atmel_nand_data __initdata ek_nand_data = { | |||
| 138 | .det_pin = -EINVAL, | 138 | .det_pin = -EINVAL, |
| 139 | .rdy_pin = AT91_PIN_PC13, | 139 | .rdy_pin = AT91_PIN_PC13, |
| 140 | .enable_pin = AT91_PIN_PC14, | 140 | .enable_pin = AT91_PIN_PC14, |
| 141 | .ecc_mode = NAND_ECC_SOFT, | ||
| 142 | .on_flash_bbt = 1, | ||
| 141 | .parts = ek_nand_partition, | 143 | .parts = ek_nand_partition, |
| 142 | .num_parts = ARRAY_SIZE(ek_nand_partition), | 144 | .num_parts = ARRAY_SIZE(ek_nand_partition), |
| 143 | }; | 145 | }; |
diff --git a/arch/arm/mach-at91/board-rm9200dk.c b/arch/arm/mach-at91/board-rm9200dk.c index 9083df04e7ed..01332aa538b2 100644 --- a/arch/arm/mach-at91/board-rm9200dk.c +++ b/arch/arm/mach-at91/board-rm9200dk.c | |||
| @@ -150,6 +150,8 @@ static struct atmel_nand_data __initdata dk_nand_data = { | |||
| 150 | .det_pin = AT91_PIN_PB1, | 150 | .det_pin = AT91_PIN_PB1, |
| 151 | .rdy_pin = AT91_PIN_PC2, | 151 | .rdy_pin = AT91_PIN_PC2, |
| 152 | .enable_pin = -EINVAL, | 152 | .enable_pin = -EINVAL, |
| 153 | .ecc_mode = NAND_ECC_SOFT, | ||
| 154 | .on_flash_bbt = 1, | ||
| 153 | .parts = dk_nand_partition, | 155 | .parts = dk_nand_partition, |
| 154 | .num_parts = ARRAY_SIZE(dk_nand_partition), | 156 | .num_parts = ARRAY_SIZE(dk_nand_partition), |
| 155 | }; | 157 | }; |
diff --git a/arch/arm/mach-at91/board-sam9-l9260.c b/arch/arm/mach-at91/board-sam9-l9260.c index 84bce587735f..e8b116b6cba6 100644 --- a/arch/arm/mach-at91/board-sam9-l9260.c +++ b/arch/arm/mach-at91/board-sam9-l9260.c | |||
| @@ -139,6 +139,7 @@ static struct atmel_nand_data __initdata ek_nand_data = { | |||
| 139 | .det_pin = -EINVAL, | 139 | .det_pin = -EINVAL, |
| 140 | .rdy_pin = AT91_PIN_PC13, | 140 | .rdy_pin = AT91_PIN_PC13, |
| 141 | .enable_pin = AT91_PIN_PC14, | 141 | .enable_pin = AT91_PIN_PC14, |
| 142 | .ecc_mode = NAND_ECC_SOFT, | ||
| 142 | .parts = ek_nand_partition, | 143 | .parts = ek_nand_partition, |
| 143 | .num_parts = ARRAY_SIZE(ek_nand_partition), | 144 | .num_parts = ARRAY_SIZE(ek_nand_partition), |
| 144 | }; | 145 | }; |
diff --git a/arch/arm/mach-at91/board-sam9260ek.c b/arch/arm/mach-at91/board-sam9260ek.c index be8233bcabdc..d5aec55b0eb4 100644 --- a/arch/arm/mach-at91/board-sam9260ek.c +++ b/arch/arm/mach-at91/board-sam9260ek.c | |||
| @@ -181,6 +181,8 @@ static struct atmel_nand_data __initdata ek_nand_data = { | |||
| 181 | .det_pin = -EINVAL, | 181 | .det_pin = -EINVAL, |
| 182 | .rdy_pin = AT91_PIN_PC13, | 182 | .rdy_pin = AT91_PIN_PC13, |
| 183 | .enable_pin = AT91_PIN_PC14, | 183 | .enable_pin = AT91_PIN_PC14, |
| 184 | .ecc_mode = NAND_ECC_SOFT, | ||
| 185 | .on_flash_bbt = 1, | ||
| 184 | .parts = ek_nand_partition, | 186 | .parts = ek_nand_partition, |
| 185 | .num_parts = ARRAY_SIZE(ek_nand_partition), | 187 | .num_parts = ARRAY_SIZE(ek_nand_partition), |
| 186 | }; | 188 | }; |
diff --git a/arch/arm/mach-at91/board-sam9261ek.c b/arch/arm/mach-at91/board-sam9261ek.c index 40895072a1a7..c3f994462864 100644 --- a/arch/arm/mach-at91/board-sam9261ek.c +++ b/arch/arm/mach-at91/board-sam9261ek.c | |||
| @@ -187,6 +187,8 @@ static struct atmel_nand_data __initdata ek_nand_data = { | |||
| 187 | .det_pin = -EINVAL, | 187 | .det_pin = -EINVAL, |
| 188 | .rdy_pin = AT91_PIN_PC15, | 188 | .rdy_pin = AT91_PIN_PC15, |
| 189 | .enable_pin = AT91_PIN_PC14, | 189 | .enable_pin = AT91_PIN_PC14, |
| 190 | .ecc_mode = NAND_ECC_SOFT, | ||
| 191 | .on_flash_bbt = 1, | ||
| 190 | .parts = ek_nand_partition, | 192 | .parts = ek_nand_partition, |
| 191 | .num_parts = ARRAY_SIZE(ek_nand_partition), | 193 | .num_parts = ARRAY_SIZE(ek_nand_partition), |
| 192 | }; | 194 | }; |
diff --git a/arch/arm/mach-at91/board-sam9263ek.c b/arch/arm/mach-at91/board-sam9263ek.c index 29f66052fe63..66f0ddf4b2ae 100644 --- a/arch/arm/mach-at91/board-sam9263ek.c +++ b/arch/arm/mach-at91/board-sam9263ek.c | |||
| @@ -187,6 +187,8 @@ static struct atmel_nand_data __initdata ek_nand_data = { | |||
| 187 | .det_pin = -EINVAL, | 187 | .det_pin = -EINVAL, |
| 188 | .rdy_pin = AT91_PIN_PA22, | 188 | .rdy_pin = AT91_PIN_PA22, |
| 189 | .enable_pin = AT91_PIN_PD15, | 189 | .enable_pin = AT91_PIN_PD15, |
| 190 | .ecc_mode = NAND_ECC_SOFT, | ||
| 191 | .on_flash_bbt = 1, | ||
| 190 | .parts = ek_nand_partition, | 192 | .parts = ek_nand_partition, |
| 191 | .num_parts = ARRAY_SIZE(ek_nand_partition), | 193 | .num_parts = ARRAY_SIZE(ek_nand_partition), |
| 192 | }; | 194 | }; |
diff --git a/arch/arm/mach-at91/board-sam9g20ek.c b/arch/arm/mach-at91/board-sam9g20ek.c index 843d6286c6f4..8923ec9f5831 100644 --- a/arch/arm/mach-at91/board-sam9g20ek.c +++ b/arch/arm/mach-at91/board-sam9g20ek.c | |||
| @@ -166,6 +166,8 @@ static struct atmel_nand_data __initdata ek_nand_data = { | |||
| 166 | .rdy_pin = AT91_PIN_PC13, | 166 | .rdy_pin = AT91_PIN_PC13, |
| 167 | .enable_pin = AT91_PIN_PC14, | 167 | .enable_pin = AT91_PIN_PC14, |
| 168 | .det_pin = -EINVAL, | 168 | .det_pin = -EINVAL, |
| 169 | .ecc_mode = NAND_ECC_SOFT, | ||
| 170 | .on_flash_bbt = 1, | ||
| 169 | .parts = ek_nand_partition, | 171 | .parts = ek_nand_partition, |
| 170 | .num_parts = ARRAY_SIZE(ek_nand_partition), | 172 | .num_parts = ARRAY_SIZE(ek_nand_partition), |
| 171 | }; | 173 | }; |
diff --git a/arch/arm/mach-at91/board-sam9m10g45ek.c b/arch/arm/mach-at91/board-sam9m10g45ek.c index 57497e2b8878..e1bea73e6b30 100644 --- a/arch/arm/mach-at91/board-sam9m10g45ek.c +++ b/arch/arm/mach-at91/board-sam9m10g45ek.c | |||
| @@ -148,6 +148,8 @@ static struct atmel_nand_data __initdata ek_nand_data = { | |||
| 148 | .rdy_pin = AT91_PIN_PC8, | 148 | .rdy_pin = AT91_PIN_PC8, |
| 149 | .enable_pin = AT91_PIN_PC14, | 149 | .enable_pin = AT91_PIN_PC14, |
| 150 | .det_pin = -EINVAL, | 150 | .det_pin = -EINVAL, |
| 151 | .ecc_mode = NAND_ECC_SOFT, | ||
| 152 | .on_flash_bbt = 1, | ||
| 151 | .parts = ek_nand_partition, | 153 | .parts = ek_nand_partition, |
| 152 | .num_parts = ARRAY_SIZE(ek_nand_partition), | 154 | .num_parts = ARRAY_SIZE(ek_nand_partition), |
| 153 | }; | 155 | }; |
diff --git a/arch/arm/mach-at91/board-sam9rlek.c b/arch/arm/mach-at91/board-sam9rlek.c index c1366d0032bf..b109ce2ba864 100644 --- a/arch/arm/mach-at91/board-sam9rlek.c +++ b/arch/arm/mach-at91/board-sam9rlek.c | |||
| @@ -94,6 +94,8 @@ static struct atmel_nand_data __initdata ek_nand_data = { | |||
| 94 | .det_pin = -EINVAL, | 94 | .det_pin = -EINVAL, |
| 95 | .rdy_pin = AT91_PIN_PD17, | 95 | .rdy_pin = AT91_PIN_PD17, |
| 96 | .enable_pin = AT91_PIN_PB6, | 96 | .enable_pin = AT91_PIN_PB6, |
| 97 | .ecc_mode = NAND_ECC_SOFT, | ||
| 98 | .on_flash_bbt = 1, | ||
| 97 | .parts = ek_nand_partition, | 99 | .parts = ek_nand_partition, |
| 98 | .num_parts = ARRAY_SIZE(ek_nand_partition), | 100 | .num_parts = ARRAY_SIZE(ek_nand_partition), |
| 99 | }; | 101 | }; |
diff --git a/arch/arm/mach-at91/board-snapper9260.c b/arch/arm/mach-at91/board-snapper9260.c index 3c2e3fcc310c..ebc9d01ce742 100644 --- a/arch/arm/mach-at91/board-snapper9260.c +++ b/arch/arm/mach-at91/board-snapper9260.c | |||
| @@ -110,6 +110,7 @@ static struct atmel_nand_data __initdata snapper9260_nand_data = { | |||
| 110 | .bus_width_16 = 0, | 110 | .bus_width_16 = 0, |
| 111 | .enable_pin = -EINVAL, | 111 | .enable_pin = -EINVAL, |
| 112 | .det_pin = -EINVAL, | 112 | .det_pin = -EINVAL, |
| 113 | .ecc_mode = NAND_ECC_SOFT, | ||
| 113 | }; | 114 | }; |
| 114 | 115 | ||
| 115 | static struct sam9_smc_config __initdata snapper9260_nand_smc_config = { | 116 | static struct sam9_smc_config __initdata snapper9260_nand_smc_config = { |
diff --git a/arch/arm/mach-at91/board-stamp9g20.c b/arch/arm/mach-at91/board-stamp9g20.c index 72eb3b4d9ab6..7640049410a0 100644 --- a/arch/arm/mach-at91/board-stamp9g20.c +++ b/arch/arm/mach-at91/board-stamp9g20.c | |||
| @@ -86,6 +86,7 @@ static struct atmel_nand_data __initdata nand_data = { | |||
| 86 | .enable_pin = AT91_PIN_PC14, | 86 | .enable_pin = AT91_PIN_PC14, |
| 87 | .bus_width_16 = 0, | 87 | .bus_width_16 = 0, |
| 88 | .det_pin = -EINVAL, | 88 | .det_pin = -EINVAL, |
| 89 | .ecc_mode = NAND_ECC_SOFT, | ||
| 89 | }; | 90 | }; |
| 90 | 91 | ||
| 91 | static struct sam9_smc_config __initdata nand_smc_config = { | 92 | static struct sam9_smc_config __initdata nand_smc_config = { |
diff --git a/arch/arm/mach-at91/board-usb-a926x.c b/arch/arm/mach-at91/board-usb-a926x.c index 26c36fc2d1e5..b7483a3d0980 100644 --- a/arch/arm/mach-at91/board-usb-a926x.c +++ b/arch/arm/mach-at91/board-usb-a926x.c | |||
| @@ -198,6 +198,8 @@ static struct atmel_nand_data __initdata ek_nand_data = { | |||
| 198 | .det_pin = -EINVAL, | 198 | .det_pin = -EINVAL, |
| 199 | .rdy_pin = AT91_PIN_PA22, | 199 | .rdy_pin = AT91_PIN_PA22, |
| 200 | .enable_pin = AT91_PIN_PD15, | 200 | .enable_pin = AT91_PIN_PD15, |
| 201 | .ecc_mode = NAND_ECC_SOFT, | ||
| 202 | .on_flash_bbt = 1, | ||
| 201 | .parts = ek_nand_partition, | 203 | .parts = ek_nand_partition, |
| 202 | .num_parts = ARRAY_SIZE(ek_nand_partition), | 204 | .num_parts = ARRAY_SIZE(ek_nand_partition), |
| 203 | }; | 205 | }; |
diff --git a/arch/arm/mach-at91/board-yl-9200.c b/arch/arm/mach-at91/board-yl-9200.c index 52f460768f71..38dd279d30b2 100644 --- a/arch/arm/mach-at91/board-yl-9200.c +++ b/arch/arm/mach-at91/board-yl-9200.c | |||
| @@ -182,6 +182,7 @@ static struct atmel_nand_data __initdata yl9200_nand_data = { | |||
| 182 | .det_pin = -EINVAL, | 182 | .det_pin = -EINVAL, |
| 183 | .rdy_pin = AT91_PIN_PC14, /* R/!B (Sheet10) */ | 183 | .rdy_pin = AT91_PIN_PC14, /* R/!B (Sheet10) */ |
| 184 | .enable_pin = AT91_PIN_PC15, /* !CE (Sheet10) */ | 184 | .enable_pin = AT91_PIN_PC15, /* !CE (Sheet10) */ |
| 185 | .ecc_mode = NAND_ECC_SOFT, | ||
| 185 | .parts = yl9200_nand_partition, | 186 | .parts = yl9200_nand_partition, |
| 186 | .num_parts = ARRAY_SIZE(yl9200_nand_partition), | 187 | .num_parts = ARRAY_SIZE(yl9200_nand_partition), |
| 187 | }; | 188 | }; |
diff --git a/arch/arm/mach-at91/clock.c b/arch/arm/mach-at91/clock.c index be51ca7f694d..a0f4d7424cdc 100644 --- a/arch/arm/mach-at91/clock.c +++ b/arch/arm/mach-at91/clock.c | |||
| @@ -23,6 +23,7 @@ | |||
| 23 | #include <linux/delay.h> | 23 | #include <linux/delay.h> |
| 24 | #include <linux/clk.h> | 24 | #include <linux/clk.h> |
| 25 | #include <linux/io.h> | 25 | #include <linux/io.h> |
| 26 | #include <linux/of_address.h> | ||
| 26 | 27 | ||
| 27 | #include <mach/hardware.h> | 28 | #include <mach/hardware.h> |
| 28 | #include <mach/at91_pmc.h> | 29 | #include <mach/at91_pmc.h> |
| @@ -671,16 +672,12 @@ static void __init at91_upll_usbfs_clock_init(unsigned long main_clock) | |||
| 671 | uhpck.rate_hz /= 1 + ((at91_pmc_read(AT91_PMC_USB) & AT91_PMC_OHCIUSBDIV) >> 8); | 672 | uhpck.rate_hz /= 1 + ((at91_pmc_read(AT91_PMC_USB) & AT91_PMC_OHCIUSBDIV) >> 8); |
| 672 | } | 673 | } |
| 673 | 674 | ||
| 674 | int __init at91_clock_init(unsigned long main_clock) | 675 | static int __init at91_pmc_init(unsigned long main_clock) |
| 675 | { | 676 | { |
| 676 | unsigned tmp, freq, mckr; | 677 | unsigned tmp, freq, mckr; |
| 677 | int i; | 678 | int i; |
| 678 | int pll_overclock = false; | 679 | int pll_overclock = false; |
| 679 | 680 | ||
| 680 | at91_pmc_base = ioremap(AT91_PMC, 256); | ||
| 681 | if (!at91_pmc_base) | ||
| 682 | panic("Impossible to ioremap AT91_PMC 0x%x\n", AT91_PMC); | ||
| 683 | |||
| 684 | /* | 681 | /* |
| 685 | * When the bootloader initialized the main oscillator correctly, | 682 | * When the bootloader initialized the main oscillator correctly, |
| 686 | * there's no problem using the cycle counter. But if it didn't, | 683 | * there's no problem using the cycle counter. But if it didn't, |
| @@ -802,6 +799,55 @@ int __init at91_clock_init(unsigned long main_clock) | |||
| 802 | return 0; | 799 | return 0; |
| 803 | } | 800 | } |
| 804 | 801 | ||
| 802 | #if defined(CONFIG_OF) | ||
| 803 | static struct of_device_id pmc_ids[] = { | ||
| 804 | { .compatible = "atmel,at91rm9200-pmc" }, | ||
| 805 | { /*sentinel*/ } | ||
| 806 | }; | ||
| 807 | |||
| 808 | static struct of_device_id osc_ids[] = { | ||
| 809 | { .compatible = "atmel,osc" }, | ||
| 810 | { /*sentinel*/ } | ||
| 811 | }; | ||
| 812 | |||
| 813 | int __init at91_dt_clock_init(void) | ||
| 814 | { | ||
| 815 | struct device_node *np; | ||
| 816 | u32 main_clock = 0; | ||
| 817 | |||
| 818 | np = of_find_matching_node(NULL, pmc_ids); | ||
| 819 | if (!np) | ||
| 820 | panic("unable to find compatible pmc node in dtb\n"); | ||
| 821 | |||
| 822 | at91_pmc_base = of_iomap(np, 0); | ||
| 823 | if (!at91_pmc_base) | ||
| 824 | panic("unable to map pmc cpu registers\n"); | ||
| 825 | |||
| 826 | of_node_put(np); | ||
| 827 | |||
| 828 | /* retrieve the freqency of fixed clocks from device tree */ | ||
| 829 | np = of_find_matching_node(NULL, osc_ids); | ||
| 830 | if (np) { | ||
| 831 | u32 rate; | ||
| 832 | if (!of_property_read_u32(np, "clock-frequency", &rate)) | ||
| 833 | main_clock = rate; | ||
| 834 | } | ||
| 835 | |||
| 836 | of_node_put(np); | ||
| 837 | |||
| 838 | return at91_pmc_init(main_clock); | ||
| 839 | } | ||
| 840 | #endif | ||
| 841 | |||
| 842 | int __init at91_clock_init(unsigned long main_clock) | ||
| 843 | { | ||
| 844 | at91_pmc_base = ioremap(AT91_PMC, 256); | ||
| 845 | if (!at91_pmc_base) | ||
| 846 | panic("Impossible to ioremap AT91_PMC 0x%x\n", AT91_PMC); | ||
| 847 | |||
| 848 | return at91_pmc_init(main_clock); | ||
| 849 | } | ||
| 850 | |||
| 805 | /* | 851 | /* |
| 806 | * Several unused clocks may be active. Turn them off. | 852 | * Several unused clocks may be active. Turn them off. |
| 807 | */ | 853 | */ |
diff --git a/arch/arm/mach-at91/generic.h b/arch/arm/mach-at91/generic.h index 459f01a4a546..dd9b346c451d 100644 --- a/arch/arm/mach-at91/generic.h +++ b/arch/arm/mach-at91/generic.h | |||
| @@ -20,6 +20,7 @@ extern void __init at91_init_sram(int bank, unsigned long base, | |||
| 20 | extern void __init at91rm9200_set_type(int type); | 20 | extern void __init at91rm9200_set_type(int type); |
| 21 | extern void __init at91_initialize(unsigned long main_clock); | 21 | extern void __init at91_initialize(unsigned long main_clock); |
| 22 | extern void __init at91x40_initialize(unsigned long main_clock); | 22 | extern void __init at91x40_initialize(unsigned long main_clock); |
| 23 | extern void __init at91_dt_initialize(void); | ||
| 23 | 24 | ||
| 24 | /* Interrupts */ | 25 | /* Interrupts */ |
| 25 | extern void __init at91_init_irq_default(void); | 26 | extern void __init at91_init_irq_default(void); |
| @@ -52,6 +53,7 @@ extern void __init at91sam9rl_set_console_clock(int id); | |||
| 52 | extern void __init at91sam9g45_set_console_clock(int id); | 53 | extern void __init at91sam9g45_set_console_clock(int id); |
| 53 | #ifdef CONFIG_AT91_PMC_UNIT | 54 | #ifdef CONFIG_AT91_PMC_UNIT |
| 54 | extern int __init at91_clock_init(unsigned long main_clock); | 55 | extern int __init at91_clock_init(unsigned long main_clock); |
| 56 | extern int __init at91_dt_clock_init(void); | ||
| 55 | #else | 57 | #else |
| 56 | static int inline at91_clock_init(unsigned long main_clock) { return 0; } | 58 | static int inline at91_clock_init(unsigned long main_clock) { return 0; } |
| 57 | #endif | 59 | #endif |
diff --git a/arch/arm/mach-at91/include/mach/at91_shdwc.h b/arch/arm/mach-at91/include/mach/at91_shdwc.h index 1d4fe822c77a..60478ea8bd46 100644 --- a/arch/arm/mach-at91/include/mach/at91_shdwc.h +++ b/arch/arm/mach-at91/include/mach/at91_shdwc.h | |||
| @@ -36,9 +36,11 @@ extern void __iomem *at91_shdwc_base; | |||
| 36 | #define AT91_SHDW_WKMODE0_HIGH 1 | 36 | #define AT91_SHDW_WKMODE0_HIGH 1 |
| 37 | #define AT91_SHDW_WKMODE0_LOW 2 | 37 | #define AT91_SHDW_WKMODE0_LOW 2 |
| 38 | #define AT91_SHDW_WKMODE0_ANYLEVEL 3 | 38 | #define AT91_SHDW_WKMODE0_ANYLEVEL 3 |
| 39 | #define AT91_SHDW_CPTWK0 (0xf << 4) /* Counter On Wake Up 0 */ | 39 | #define AT91_SHDW_CPTWK0_MAX 0xf /* Maximum Counter On Wake Up 0 */ |
| 40 | #define AT91_SHDW_CPTWK0 (AT91_SHDW_CPTWK0_MAX << 4) /* Counter On Wake Up 0 */ | ||
| 40 | #define AT91_SHDW_CPTWK0_(x) ((x) << 4) | 41 | #define AT91_SHDW_CPTWK0_(x) ((x) << 4) |
| 41 | #define AT91_SHDW_RTTWKEN (1 << 16) /* Real Time Timer Wake-up Enable */ | 42 | #define AT91_SHDW_RTTWKEN (1 << 16) /* Real Time Timer Wake-up Enable */ |
| 43 | #define AT91_SHDW_RTCWKEN (1 << 17) /* Real Time Clock Wake-up Enable */ | ||
| 42 | 44 | ||
| 43 | #define AT91_SHDW_SR 0x08 /* Shut Down Status Register */ | 45 | #define AT91_SHDW_SR 0x08 /* Shut Down Status Register */ |
| 44 | #define AT91_SHDW_WAKEUP0 (1 << 0) /* Wake-up 0 Status */ | 46 | #define AT91_SHDW_WAKEUP0 (1 << 0) /* Wake-up 0 Status */ |
diff --git a/arch/arm/mach-at91/include/mach/at91sam9x5.h b/arch/arm/mach-at91/include/mach/at91sam9x5.h index a297a77d88e2..88e43d534cdf 100644 --- a/arch/arm/mach-at91/include/mach/at91sam9x5.h +++ b/arch/arm/mach-at91/include/mach/at91sam9x5.h | |||
| @@ -55,11 +55,6 @@ | |||
| 55 | #define AT91SAM9X5_BASE_USART2 0xf8024000 | 55 | #define AT91SAM9X5_BASE_USART2 0xf8024000 |
| 56 | 56 | ||
| 57 | /* | 57 | /* |
| 58 | * System Peripherals | ||
| 59 | */ | ||
| 60 | #define AT91SAM9X5_BASE_DDRSDRC0 0xffffe800 | ||
| 61 | |||
| 62 | /* | ||
| 63 | * Base addresses for early serial code (uncompress.h) | 58 | * Base addresses for early serial code (uncompress.h) |
| 64 | */ | 59 | */ |
| 65 | #define AT91_DBGU AT91_BASE_DBGU0 | 60 | #define AT91_DBGU AT91_BASE_DBGU0 |
diff --git a/arch/arm/mach-at91/include/mach/board.h b/arch/arm/mach-at91/include/mach/board.h index dc8d6d4f17cf..544a5d5ce416 100644 --- a/arch/arm/mach-at91/include/mach/board.h +++ b/arch/arm/mach-at91/include/mach/board.h | |||
| @@ -41,6 +41,7 @@ | |||
| 41 | #include <sound/atmel-ac97c.h> | 41 | #include <sound/atmel-ac97c.h> |
| 42 | #include <linux/serial.h> | 42 | #include <linux/serial.h> |
| 43 | #include <linux/platform_data/macb.h> | 43 | #include <linux/platform_data/macb.h> |
| 44 | #include <linux/platform_data/atmel.h> | ||
| 44 | 45 | ||
| 45 | /* USB Device */ | 46 | /* USB Device */ |
| 46 | struct at91_udc_data { | 47 | struct at91_udc_data { |
| @@ -98,20 +99,6 @@ extern void __init at91_add_device_usbh(struct at91_usbh_data *data); | |||
| 98 | extern void __init at91_add_device_usbh_ohci(struct at91_usbh_data *data); | 99 | extern void __init at91_add_device_usbh_ohci(struct at91_usbh_data *data); |
| 99 | extern void __init at91_add_device_usbh_ehci(struct at91_usbh_data *data); | 100 | extern void __init at91_add_device_usbh_ehci(struct at91_usbh_data *data); |
| 100 | 101 | ||
| 101 | /* NAND / SmartMedia */ | ||
| 102 | struct atmel_nand_data { | ||
| 103 | int enable_pin; /* chip enable */ | ||
| 104 | int det_pin; /* card detect */ | ||
| 105 | int rdy_pin; /* ready/busy */ | ||
| 106 | u8 rdy_pin_active_low; /* rdy_pin value is inverted */ | ||
| 107 | u8 ale; /* address line number connected to ALE */ | ||
| 108 | u8 cle; /* address line number connected to CLE */ | ||
| 109 | u8 bus_width_16; /* buswidth is 16 bit */ | ||
| 110 | u8 correction_cap; /* PMECC correction capability */ | ||
| 111 | u16 sector_size; /* Sector size for PMECC */ | ||
| 112 | struct mtd_partition *parts; | ||
| 113 | unsigned int num_parts; | ||
| 114 | }; | ||
| 115 | extern void __init at91_add_device_nand(struct atmel_nand_data *data); | 102 | extern void __init at91_add_device_nand(struct atmel_nand_data *data); |
| 116 | 103 | ||
| 117 | /* I2C*/ | 104 | /* I2C*/ |
diff --git a/arch/arm/mach-at91/pm.c b/arch/arm/mach-at91/pm.c index 6c9d5e69ac28..f630250c6b87 100644 --- a/arch/arm/mach-at91/pm.c +++ b/arch/arm/mach-at91/pm.c | |||
| @@ -197,19 +197,6 @@ extern void at91_slow_clock(void __iomem *pmc, void __iomem *ramc0, | |||
| 197 | extern u32 at91_slow_clock_sz; | 197 | extern u32 at91_slow_clock_sz; |
| 198 | #endif | 198 | #endif |
| 199 | 199 | ||
| 200 | void __iomem *at91_ramc_base[2]; | ||
| 201 | |||
| 202 | void __init at91_ioremap_ramc(int id, u32 addr, u32 size) | ||
| 203 | { | ||
| 204 | if (id < 0 || id > 1) { | ||
| 205 | pr_emerg("Wrong RAM controller id (%d), cannot continue\n", id); | ||
| 206 | BUG(); | ||
| 207 | } | ||
| 208 | at91_ramc_base[id] = ioremap(addr, size); | ||
| 209 | if (!at91_ramc_base[id]) | ||
| 210 | panic("Impossible to ioremap ramc.%d 0x%x\n", id, addr); | ||
| 211 | } | ||
| 212 | |||
| 213 | static int at91_pm_enter(suspend_state_t state) | 200 | static int at91_pm_enter(suspend_state_t state) |
| 214 | { | 201 | { |
| 215 | at91_gpio_suspend(); | 202 | at91_gpio_suspend(); |
diff --git a/arch/arm/mach-at91/setup.c b/arch/arm/mach-at91/setup.c index 372396c2ecb6..1083739e3065 100644 --- a/arch/arm/mach-at91/setup.c +++ b/arch/arm/mach-at91/setup.c | |||
| @@ -9,6 +9,7 @@ | |||
| 9 | #include <linux/io.h> | 9 | #include <linux/io.h> |
| 10 | #include <linux/mm.h> | 10 | #include <linux/mm.h> |
| 11 | #include <linux/pm.h> | 11 | #include <linux/pm.h> |
| 12 | #include <linux/of_address.h> | ||
| 12 | 13 | ||
| 13 | #include <asm/mach/map.h> | 14 | #include <asm/mach/map.h> |
| 14 | 15 | ||
| @@ -51,6 +52,19 @@ void __init at91_init_interrupts(unsigned int *priority) | |||
| 51 | at91_gpio_irq_setup(); | 52 | at91_gpio_irq_setup(); |
| 52 | } | 53 | } |
| 53 | 54 | ||
| 55 | void __iomem *at91_ramc_base[2]; | ||
| 56 | |||
| 57 | void __init at91_ioremap_ramc(int id, u32 addr, u32 size) | ||
| 58 | { | ||
| 59 | if (id < 0 || id > 1) { | ||
| 60 | pr_emerg("Wrong RAM controller id (%d), cannot continue\n", id); | ||
| 61 | BUG(); | ||
| 62 | } | ||
| 63 | at91_ramc_base[id] = ioremap(addr, size); | ||
| 64 | if (!at91_ramc_base[id]) | ||
| 65 | panic("Impossible to ioremap ramc.%d 0x%x\n", id, addr); | ||
| 66 | } | ||
| 67 | |||
| 54 | static struct map_desc sram_desc[2] __initdata; | 68 | static struct map_desc sram_desc[2] __initdata; |
| 55 | 69 | ||
| 56 | void __init at91_init_sram(int bank, unsigned long base, unsigned int length) | 70 | void __init at91_init_sram(int bank, unsigned long base, unsigned int length) |
| @@ -285,6 +299,150 @@ void __init at91_ioremap_matrix(u32 base_addr) | |||
| 285 | panic("Impossible to ioremap at91_matrix_base\n"); | 299 | panic("Impossible to ioremap at91_matrix_base\n"); |
| 286 | } | 300 | } |
| 287 | 301 | ||
| 302 | #if defined(CONFIG_OF) | ||
| 303 | static struct of_device_id rstc_ids[] = { | ||
| 304 | { .compatible = "atmel,at91sam9260-rstc", .data = at91sam9_alt_restart }, | ||
| 305 | { .compatible = "atmel,at91sam9g45-rstc", .data = at91sam9g45_restart }, | ||
| 306 | { /*sentinel*/ } | ||
| 307 | }; | ||
| 308 | |||
| 309 | static void at91_dt_rstc(void) | ||
| 310 | { | ||
| 311 | struct device_node *np; | ||
| 312 | const struct of_device_id *of_id; | ||
| 313 | |||
| 314 | np = of_find_matching_node(NULL, rstc_ids); | ||
| 315 | if (!np) | ||
| 316 | panic("unable to find compatible rstc node in dtb\n"); | ||
| 317 | |||
| 318 | at91_rstc_base = of_iomap(np, 0); | ||
| 319 | if (!at91_rstc_base) | ||
| 320 | panic("unable to map rstc cpu registers\n"); | ||
| 321 | |||
| 322 | of_id = of_match_node(rstc_ids, np); | ||
| 323 | if (!of_id) | ||
| 324 | panic("AT91: rtsc no restart function availlable\n"); | ||
| 325 | |||
| 326 | arm_pm_restart = of_id->data; | ||
| 327 | |||
| 328 | of_node_put(np); | ||
| 329 | } | ||
| 330 | |||
| 331 | static struct of_device_id ramc_ids[] = { | ||
| 332 | { .compatible = "atmel,at91sam9260-sdramc" }, | ||
| 333 | { .compatible = "atmel,at91sam9g45-ddramc" }, | ||
| 334 | { /*sentinel*/ } | ||
| 335 | }; | ||
| 336 | |||
| 337 | static void at91_dt_ramc(void) | ||
| 338 | { | ||
| 339 | struct device_node *np; | ||
| 340 | |||
| 341 | np = of_find_matching_node(NULL, ramc_ids); | ||
| 342 | if (!np) | ||
| 343 | panic("unable to find compatible ram conroller node in dtb\n"); | ||
| 344 | |||
| 345 | at91_ramc_base[0] = of_iomap(np, 0); | ||
| 346 | if (!at91_ramc_base[0]) | ||
| 347 | panic("unable to map ramc[0] cpu registers\n"); | ||
| 348 | /* the controller may have 2 banks */ | ||
| 349 | at91_ramc_base[1] = of_iomap(np, 1); | ||
| 350 | |||
| 351 | of_node_put(np); | ||
| 352 | } | ||
| 353 | |||
| 354 | static struct of_device_id shdwc_ids[] = { | ||
| 355 | { .compatible = "atmel,at91sam9260-shdwc", }, | ||
| 356 | { .compatible = "atmel,at91sam9rl-shdwc", }, | ||
| 357 | { .compatible = "atmel,at91sam9x5-shdwc", }, | ||
| 358 | { /*sentinel*/ } | ||
| 359 | }; | ||
| 360 | |||
| 361 | static const char *shdwc_wakeup_modes[] = { | ||
| 362 | [AT91_SHDW_WKMODE0_NONE] = "none", | ||
| 363 | [AT91_SHDW_WKMODE0_HIGH] = "high", | ||
| 364 | [AT91_SHDW_WKMODE0_LOW] = "low", | ||
| 365 | [AT91_SHDW_WKMODE0_ANYLEVEL] = "any", | ||
| 366 | }; | ||
| 367 | |||
| 368 | const int at91_dtget_shdwc_wakeup_mode(struct device_node *np) | ||
| 369 | { | ||
| 370 | const char *pm; | ||
| 371 | int err, i; | ||
| 372 | |||
| 373 | err = of_property_read_string(np, "atmel,wakeup-mode", &pm); | ||
| 374 | if (err < 0) | ||
| 375 | return AT91_SHDW_WKMODE0_ANYLEVEL; | ||
| 376 | |||
| 377 | for (i = 0; i < ARRAY_SIZE(shdwc_wakeup_modes); i++) | ||
| 378 | if (!strcasecmp(pm, shdwc_wakeup_modes[i])) | ||
| 379 | return i; | ||
| 380 | |||
| 381 | return -ENODEV; | ||
| 382 | } | ||
| 383 | |||
| 384 | static void at91_dt_shdwc(void) | ||
| 385 | { | ||
| 386 | struct device_node *np; | ||
| 387 | int wakeup_mode; | ||
| 388 | u32 reg; | ||
| 389 | u32 mode = 0; | ||
| 390 | |||
| 391 | np = of_find_matching_node(NULL, shdwc_ids); | ||
| 392 | if (!np) { | ||
| 393 | pr_debug("AT91: unable to find compatible shutdown (shdwc) conroller node in dtb\n"); | ||
| 394 | return; | ||
| 395 | } | ||
| 396 | |||
| 397 | at91_shdwc_base = of_iomap(np, 0); | ||
| 398 | if (!at91_shdwc_base) | ||
| 399 | panic("AT91: unable to map shdwc cpu registers\n"); | ||
| 400 | |||
| 401 | wakeup_mode = at91_dtget_shdwc_wakeup_mode(np); | ||
| 402 | if (wakeup_mode < 0) { | ||
| 403 | pr_warn("AT91: shdwc unknown wakeup mode\n"); | ||
| 404 | goto end; | ||
| 405 | } | ||
| 406 | |||
| 407 | if (!of_property_read_u32(np, "atmel,wakeup-counter", ®)) { | ||
| 408 | if (reg > AT91_SHDW_CPTWK0_MAX) { | ||
| 409 | pr_warn("AT91: shdwc wakeup conter 0x%x > 0x%x reduce it to 0x%x\n", | ||
| 410 | reg, AT91_SHDW_CPTWK0_MAX, AT91_SHDW_CPTWK0_MAX); | ||
| 411 | reg = AT91_SHDW_CPTWK0_MAX; | ||
| 412 | } | ||
| 413 | mode |= AT91_SHDW_CPTWK0_(reg); | ||
| 414 | } | ||
| 415 | |||
| 416 | if (of_property_read_bool(np, "atmel,wakeup-rtc-timer")) | ||
| 417 | mode |= AT91_SHDW_RTCWKEN; | ||
| 418 | |||
| 419 | if (of_property_read_bool(np, "atmel,wakeup-rtt-timer")) | ||
| 420 | mode |= AT91_SHDW_RTTWKEN; | ||
| 421 | |||
| 422 | at91_shdwc_write(AT91_SHDW_MR, wakeup_mode | mode); | ||
| 423 | |||
| 424 | end: | ||
| 425 | pm_power_off = at91sam9_poweroff; | ||
| 426 | |||
| 427 | of_node_put(np); | ||
| 428 | } | ||
| 429 | |||
| 430 | void __init at91_dt_initialize(void) | ||
| 431 | { | ||
| 432 | at91_dt_rstc(); | ||
| 433 | at91_dt_ramc(); | ||
| 434 | at91_dt_shdwc(); | ||
| 435 | |||
| 436 | /* Init clock subsystem */ | ||
| 437 | at91_dt_clock_init(); | ||
| 438 | |||
| 439 | /* Register the processor-specific clocks */ | ||
| 440 | at91_boot_soc.register_clocks(); | ||
| 441 | |||
| 442 | at91_boot_soc.init(); | ||
| 443 | } | ||
| 444 | #endif | ||
| 445 | |||
| 288 | void __init at91_initialize(unsigned long main_clock) | 446 | void __init at91_initialize(unsigned long main_clock) |
| 289 | { | 447 | { |
| 290 | at91_boot_soc.ioremap_registers(); | 448 | at91_boot_soc.ioremap_registers(); |
diff --git a/arch/arm/mach-kirkwood/Makefile b/arch/arm/mach-kirkwood/Makefile index acbc5e1db06f..e299a9576bf0 100644 --- a/arch/arm/mach-kirkwood/Makefile +++ b/arch/arm/mach-kirkwood/Makefile | |||
| @@ -21,3 +21,4 @@ obj-$(CONFIG_MACH_T5325) += t5325-setup.o | |||
| 21 | 21 | ||
| 22 | obj-$(CONFIG_CPU_IDLE) += cpuidle.o | 22 | obj-$(CONFIG_CPU_IDLE) += cpuidle.o |
| 23 | obj-$(CONFIG_ARCH_KIRKWOOD_DT) += board-dt.o | 23 | obj-$(CONFIG_ARCH_KIRKWOOD_DT) += board-dt.o |
| 24 | obj-$(CONFIG_MACH_DREAMPLUG_DT) += board-dreamplug.o | ||
diff --git a/arch/arm/mach-kirkwood/board-dreamplug.c b/arch/arm/mach-kirkwood/board-dreamplug.c new file mode 100644 index 000000000000..985453994dd3 --- /dev/null +++ b/arch/arm/mach-kirkwood/board-dreamplug.c | |||
| @@ -0,0 +1,152 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2012 (C), Jason Cooper <jason@lakedaemon.net> | ||
| 3 | * | ||
| 4 | * arch/arm/mach-kirkwood/board-dreamplug.c | ||
| 5 | * | ||
| 6 | * Marvell DreamPlug Reference Board Init for drivers not converted to | ||
| 7 | * flattened device tree yet. | ||
| 8 | * | ||
| 9 | * This file is licensed under the terms of the GNU General Public | ||
| 10 | * License version 2. This program is licensed "as is" without any | ||
| 11 | * warranty of any kind, whether express or implied. | ||
| 12 | */ | ||
| 13 | |||
| 14 | #include <linux/kernel.h> | ||
| 15 | #include <linux/init.h> | ||
| 16 | #include <linux/platform_device.h> | ||
| 17 | #include <linux/mtd/partitions.h> | ||
| 18 | #include <linux/ata_platform.h> | ||
| 19 | #include <linux/mv643xx_eth.h> | ||
| 20 | #include <linux/of.h> | ||
| 21 | #include <linux/of_address.h> | ||
| 22 | #include <linux/of_fdt.h> | ||
| 23 | #include <linux/of_irq.h> | ||
| 24 | #include <linux/of_platform.h> | ||
| 25 | #include <linux/gpio.h> | ||
| 26 | #include <linux/leds.h> | ||
| 27 | #include <linux/mtd/physmap.h> | ||
| 28 | #include <linux/spi/flash.h> | ||
| 29 | #include <linux/spi/spi.h> | ||
| 30 | #include <linux/spi/orion_spi.h> | ||
| 31 | #include <asm/mach-types.h> | ||
| 32 | #include <asm/mach/arch.h> | ||
| 33 | #include <asm/mach/map.h> | ||
| 34 | #include <mach/kirkwood.h> | ||
| 35 | #include <mach/bridge-regs.h> | ||
| 36 | #include <plat/mvsdio.h> | ||
| 37 | #include "common.h" | ||
| 38 | #include "mpp.h" | ||
| 39 | |||
| 40 | struct mtd_partition dreamplug_partitions[] = { | ||
| 41 | { | ||
| 42 | .name = "u-boot", | ||
| 43 | .size = SZ_512K, | ||
| 44 | .offset = 0, | ||
| 45 | }, | ||
| 46 | { | ||
| 47 | .name = "u-boot env", | ||
| 48 | .size = SZ_64K, | ||
| 49 | .offset = SZ_512K + SZ_512K, | ||
| 50 | }, | ||
| 51 | { | ||
| 52 | .name = "dtb", | ||
| 53 | .size = SZ_64K, | ||
| 54 | .offset = SZ_512K + SZ_512K + SZ_512K, | ||
| 55 | }, | ||
| 56 | }; | ||
| 57 | |||
| 58 | static const struct flash_platform_data dreamplug_spi_slave_data = { | ||
| 59 | .type = "mx25l1606e", | ||
| 60 | .name = "spi_flash", | ||
| 61 | .parts = dreamplug_partitions, | ||
| 62 | .nr_parts = ARRAY_SIZE(dreamplug_partitions), | ||
| 63 | }; | ||
| 64 | |||
| 65 | static struct spi_board_info __initdata dreamplug_spi_slave_info[] = { | ||
| 66 | { | ||
| 67 | .modalias = "m25p80", | ||
| 68 | .platform_data = &dreamplug_spi_slave_data, | ||
| 69 | .irq = -1, | ||
| 70 | .max_speed_hz = 50000000, | ||
| 71 | .bus_num = 0, | ||
| 72 | .chip_select = 0, | ||
| 73 | }, | ||
| 74 | }; | ||
| 75 | |||
| 76 | static struct mv643xx_eth_platform_data dreamplug_ge00_data = { | ||
| 77 | .phy_addr = MV643XX_ETH_PHY_ADDR(0), | ||
| 78 | }; | ||
| 79 | |||
| 80 | static struct mv643xx_eth_platform_data dreamplug_ge01_data = { | ||
| 81 | .phy_addr = MV643XX_ETH_PHY_ADDR(1), | ||
| 82 | }; | ||
| 83 | |||
| 84 | static struct mv_sata_platform_data dreamplug_sata_data = { | ||
| 85 | .n_ports = 1, | ||
| 86 | }; | ||
| 87 | |||
| 88 | static struct mvsdio_platform_data dreamplug_mvsdio_data = { | ||
| 89 | /* unfortunately the CD signal has not been connected */ | ||
| 90 | }; | ||
| 91 | |||
| 92 | static struct gpio_led dreamplug_led_pins[] = { | ||
| 93 | { | ||
| 94 | .name = "dreamplug:blue:bluetooth", | ||
| 95 | .gpio = 47, | ||
| 96 | .active_low = 1, | ||
| 97 | }, | ||
| 98 | { | ||
| 99 | .name = "dreamplug:green:wifi", | ||
| 100 | .gpio = 48, | ||
| 101 | .active_low = 1, | ||
| 102 | }, | ||
| 103 | { | ||
| 104 | .name = "dreamplug:green:wifi_ap", | ||
| 105 | .gpio = 49, | ||
| 106 | .active_low = 1, | ||
| 107 | }, | ||
| 108 | }; | ||
| 109 | |||
| 110 | static struct gpio_led_platform_data dreamplug_led_data = { | ||
| 111 | .leds = dreamplug_led_pins, | ||
| 112 | .num_leds = ARRAY_SIZE(dreamplug_led_pins), | ||
| 113 | }; | ||
| 114 | |||
| 115 | static struct platform_device dreamplug_leds = { | ||
| 116 | .name = "leds-gpio", | ||
| 117 | .id = -1, | ||
| 118 | .dev = { | ||
| 119 | .platform_data = &dreamplug_led_data, | ||
| 120 | } | ||
| 121 | }; | ||
| 122 | |||
| 123 | static unsigned int dreamplug_mpp_config[] __initdata = { | ||
| 124 | MPP0_SPI_SCn, | ||
| 125 | MPP1_SPI_MOSI, | ||
| 126 | MPP2_SPI_SCK, | ||
| 127 | MPP3_SPI_MISO, | ||
| 128 | MPP47_GPIO, /* Bluetooth LED */ | ||
| 129 | MPP48_GPIO, /* Wifi LED */ | ||
| 130 | MPP49_GPIO, /* Wifi AP LED */ | ||
| 131 | 0 | ||
| 132 | }; | ||
| 133 | |||
| 134 | void __init dreamplug_init(void) | ||
| 135 | { | ||
| 136 | /* | ||
| 137 | * Basic setup. Needs to be called early. | ||
| 138 | */ | ||
| 139 | kirkwood_mpp_conf(dreamplug_mpp_config); | ||
| 140 | |||
| 141 | spi_register_board_info(dreamplug_spi_slave_info, | ||
| 142 | ARRAY_SIZE(dreamplug_spi_slave_info)); | ||
| 143 | kirkwood_spi_init(); | ||
| 144 | |||
| 145 | kirkwood_ehci_init(); | ||
| 146 | kirkwood_ge00_init(&dreamplug_ge00_data); | ||
| 147 | kirkwood_ge01_init(&dreamplug_ge01_data); | ||
| 148 | kirkwood_sata_init(&dreamplug_sata_data); | ||
| 149 | kirkwood_sdio_init(&dreamplug_mvsdio_data); | ||
| 150 | |||
| 151 | platform_device_register(&dreamplug_leds); | ||
| 152 | } | ||
diff --git a/arch/arm/mach-kirkwood/board-dt.c b/arch/arm/mach-kirkwood/board-dt.c index fbe6405602ed..1c672d9e6656 100644 --- a/arch/arm/mach-kirkwood/board-dt.c +++ b/arch/arm/mach-kirkwood/board-dt.c | |||
| @@ -3,7 +3,7 @@ | |||
| 3 | * | 3 | * |
| 4 | * arch/arm/mach-kirkwood/board-dt.c | 4 | * arch/arm/mach-kirkwood/board-dt.c |
| 5 | * | 5 | * |
| 6 | * Marvell DreamPlug Reference Board Setup | 6 | * Flattened Device Tree board initialization |
| 7 | * | 7 | * |
| 8 | * This file is licensed under the terms of the GNU General Public | 8 | * This file is licensed under the terms of the GNU General Public |
| 9 | * License version 2. This program is licensed "as is" without any | 9 | * License version 2. This program is licensed "as is" without any |
| @@ -12,150 +12,45 @@ | |||
| 12 | 12 | ||
| 13 | #include <linux/kernel.h> | 13 | #include <linux/kernel.h> |
| 14 | #include <linux/init.h> | 14 | #include <linux/init.h> |
| 15 | #include <linux/platform_device.h> | ||
| 16 | #include <linux/mtd/partitions.h> | ||
| 17 | #include <linux/ata_platform.h> | ||
| 18 | #include <linux/mv643xx_eth.h> | ||
| 19 | #include <linux/of.h> | 15 | #include <linux/of.h> |
| 20 | #include <linux/of_address.h> | ||
| 21 | #include <linux/of_fdt.h> | ||
| 22 | #include <linux/of_irq.h> | ||
| 23 | #include <linux/of_platform.h> | 16 | #include <linux/of_platform.h> |
| 24 | #include <linux/gpio.h> | ||
| 25 | #include <linux/leds.h> | ||
| 26 | #include <linux/mtd/physmap.h> | ||
| 27 | #include <linux/spi/flash.h> | ||
| 28 | #include <linux/spi/spi.h> | ||
| 29 | #include <linux/spi/orion_spi.h> | ||
| 30 | #include <asm/mach-types.h> | ||
| 31 | #include <asm/mach/arch.h> | 17 | #include <asm/mach/arch.h> |
| 32 | #include <mach/kirkwood.h> | 18 | #include <asm/mach/map.h> |
| 33 | #include <plat/mvsdio.h> | 19 | #include <mach/bridge-regs.h> |
| 34 | #include "common.h" | 20 | #include "common.h" |
| 35 | #include "mpp.h" | ||
| 36 | 21 | ||
| 37 | static struct of_device_id kirkwood_dt_match_table[] __initdata = { | 22 | static struct of_device_id kirkwood_dt_match_table[] __initdata = { |
| 38 | { .compatible = "simple-bus", }, | 23 | { .compatible = "simple-bus", }, |
| 39 | { } | 24 | { } |
| 40 | }; | 25 | }; |
| 41 | 26 | ||
| 42 | struct mtd_partition dreamplug_partitions[] = { | 27 | static void __init kirkwood_dt_init(void) |
| 43 | { | ||
| 44 | .name = "u-boot", | ||
| 45 | .size = SZ_512K, | ||
| 46 | .offset = 0, | ||
| 47 | }, | ||
| 48 | { | ||
| 49 | .name = "u-boot env", | ||
| 50 | .size = SZ_64K, | ||
| 51 | .offset = SZ_512K + SZ_512K, | ||
| 52 | }, | ||
| 53 | { | ||
| 54 | .name = "dtb", | ||
| 55 | .size = SZ_64K, | ||
| 56 | .offset = SZ_512K + SZ_512K + SZ_512K, | ||
| 57 | }, | ||
| 58 | }; | ||
| 59 | |||
| 60 | static const struct flash_platform_data dreamplug_spi_slave_data = { | ||
| 61 | .type = "mx25l1606e", | ||
| 62 | .name = "spi_flash", | ||
| 63 | .parts = dreamplug_partitions, | ||
| 64 | .nr_parts = ARRAY_SIZE(dreamplug_partitions), | ||
| 65 | }; | ||
| 66 | |||
| 67 | static struct spi_board_info __initdata dreamplug_spi_slave_info[] = { | ||
| 68 | { | ||
| 69 | .modalias = "m25p80", | ||
| 70 | .platform_data = &dreamplug_spi_slave_data, | ||
| 71 | .irq = -1, | ||
| 72 | .max_speed_hz = 50000000, | ||
| 73 | .bus_num = 0, | ||
| 74 | .chip_select = 0, | ||
| 75 | }, | ||
| 76 | }; | ||
| 77 | |||
| 78 | static struct mv643xx_eth_platform_data dreamplug_ge00_data = { | ||
| 79 | .phy_addr = MV643XX_ETH_PHY_ADDR(0), | ||
| 80 | }; | ||
| 81 | |||
| 82 | static struct mv643xx_eth_platform_data dreamplug_ge01_data = { | ||
| 83 | .phy_addr = MV643XX_ETH_PHY_ADDR(1), | ||
| 84 | }; | ||
| 85 | |||
| 86 | static struct mv_sata_platform_data dreamplug_sata_data = { | ||
| 87 | .n_ports = 1, | ||
| 88 | }; | ||
| 89 | |||
| 90 | static struct mvsdio_platform_data dreamplug_mvsdio_data = { | ||
| 91 | /* unfortunately the CD signal has not been connected */ | ||
| 92 | }; | ||
| 93 | |||
| 94 | static struct gpio_led dreamplug_led_pins[] = { | ||
| 95 | { | ||
| 96 | .name = "dreamplug:blue:bluetooth", | ||
| 97 | .gpio = 47, | ||
| 98 | .active_low = 1, | ||
| 99 | }, | ||
| 100 | { | ||
| 101 | .name = "dreamplug:green:wifi", | ||
| 102 | .gpio = 48, | ||
| 103 | .active_low = 1, | ||
| 104 | }, | ||
| 105 | { | ||
| 106 | .name = "dreamplug:green:wifi_ap", | ||
| 107 | .gpio = 49, | ||
| 108 | .active_low = 1, | ||
| 109 | }, | ||
| 110 | }; | ||
| 111 | |||
| 112 | static struct gpio_led_platform_data dreamplug_led_data = { | ||
| 113 | .leds = dreamplug_led_pins, | ||
| 114 | .num_leds = ARRAY_SIZE(dreamplug_led_pins), | ||
| 115 | }; | ||
| 116 | |||
| 117 | static struct platform_device dreamplug_leds = { | ||
| 118 | .name = "leds-gpio", | ||
| 119 | .id = -1, | ||
| 120 | .dev = { | ||
| 121 | .platform_data = &dreamplug_led_data, | ||
| 122 | } | ||
| 123 | }; | ||
| 124 | |||
| 125 | static unsigned int dreamplug_mpp_config[] __initdata = { | ||
| 126 | MPP0_SPI_SCn, | ||
| 127 | MPP1_SPI_MOSI, | ||
| 128 | MPP2_SPI_SCK, | ||
| 129 | MPP3_SPI_MISO, | ||
| 130 | MPP47_GPIO, /* Bluetooth LED */ | ||
| 131 | MPP48_GPIO, /* Wifi LED */ | ||
| 132 | MPP49_GPIO, /* Wifi AP LED */ | ||
| 133 | 0 | ||
| 134 | }; | ||
| 135 | |||
| 136 | static void __init dreamplug_init(void) | ||
| 137 | { | 28 | { |
| 29 | pr_info("Kirkwood: %s, TCLK=%d.\n", kirkwood_id(), kirkwood_tclk); | ||
| 30 | |||
| 138 | /* | 31 | /* |
| 139 | * Basic setup. Needs to be called early. | 32 | * Disable propagation of mbus errors to the CPU local bus, |
| 33 | * as this causes mbus errors (which can occur for example | ||
| 34 | * for PCI aborts) to throw CPU aborts, which we're not set | ||
| 35 | * up to deal with. | ||
| 140 | */ | 36 | */ |
| 141 | kirkwood_mpp_conf(dreamplug_mpp_config); | 37 | writel(readl(CPU_CONFIG) & ~CPU_CONFIG_ERROR_PROP, CPU_CONFIG); |
| 142 | 38 | ||
| 143 | spi_register_board_info(dreamplug_spi_slave_info, | 39 | kirkwood_setup_cpu_mbus(); |
| 144 | ARRAY_SIZE(dreamplug_spi_slave_info)); | ||
| 145 | kirkwood_spi_init(); | ||
| 146 | 40 | ||
| 147 | kirkwood_ehci_init(); | 41 | #ifdef CONFIG_CACHE_FEROCEON_L2 |
| 148 | kirkwood_ge00_init(&dreamplug_ge00_data); | 42 | kirkwood_l2_init(); |
| 149 | kirkwood_ge01_init(&dreamplug_ge01_data); | 43 | #endif |
| 150 | kirkwood_sata_init(&dreamplug_sata_data); | ||
| 151 | kirkwood_sdio_init(&dreamplug_mvsdio_data); | ||
| 152 | 44 | ||
| 153 | platform_device_register(&dreamplug_leds); | 45 | /* internal devices that every board has */ |
| 154 | } | 46 | kirkwood_wdt_init(); |
| 47 | kirkwood_xor0_init(); | ||
| 48 | kirkwood_xor1_init(); | ||
| 49 | kirkwood_crypto_init(); | ||
| 155 | 50 | ||
| 156 | static void __init kirkwood_dt_init(void) | 51 | #ifdef CONFIG_KEXEC |
| 157 | { | 52 | kexec_reinit = kirkwood_enable_pcie; |
| 158 | kirkwood_init(); | 53 | #endif |
| 159 | 54 | ||
| 160 | if (of_machine_is_compatible("globalscale,dreamplug")) | 55 | if (of_machine_is_compatible("globalscale,dreamplug")) |
| 161 | dreamplug_init(); | 56 | dreamplug_init(); |
diff --git a/arch/arm/mach-kirkwood/common.c b/arch/arm/mach-kirkwood/common.c index 77d4852e19f2..a02cae881f2f 100644 --- a/arch/arm/mach-kirkwood/common.c +++ b/arch/arm/mach-kirkwood/common.c | |||
| @@ -279,7 +279,7 @@ void __init kirkwood_crypto_init(void) | |||
| 279 | /***************************************************************************** | 279 | /***************************************************************************** |
| 280 | * XOR0 | 280 | * XOR0 |
| 281 | ****************************************************************************/ | 281 | ****************************************************************************/ |
| 282 | static void __init kirkwood_xor0_init(void) | 282 | void __init kirkwood_xor0_init(void) |
| 283 | { | 283 | { |
| 284 | kirkwood_clk_ctrl |= CGC_XOR0; | 284 | kirkwood_clk_ctrl |= CGC_XOR0; |
| 285 | 285 | ||
| @@ -291,7 +291,7 @@ static void __init kirkwood_xor0_init(void) | |||
| 291 | /***************************************************************************** | 291 | /***************************************************************************** |
| 292 | * XOR1 | 292 | * XOR1 |
| 293 | ****************************************************************************/ | 293 | ****************************************************************************/ |
| 294 | static void __init kirkwood_xor1_init(void) | 294 | void __init kirkwood_xor1_init(void) |
| 295 | { | 295 | { |
| 296 | kirkwood_clk_ctrl |= CGC_XOR1; | 296 | kirkwood_clk_ctrl |= CGC_XOR1; |
| 297 | 297 | ||
| @@ -303,7 +303,7 @@ static void __init kirkwood_xor1_init(void) | |||
| 303 | /***************************************************************************** | 303 | /***************************************************************************** |
| 304 | * Watchdog | 304 | * Watchdog |
| 305 | ****************************************************************************/ | 305 | ****************************************************************************/ |
| 306 | static void __init kirkwood_wdt_init(void) | 306 | void __init kirkwood_wdt_init(void) |
| 307 | { | 307 | { |
| 308 | orion_wdt_init(kirkwood_tclk); | 308 | orion_wdt_init(kirkwood_tclk); |
| 309 | } | 309 | } |
| @@ -392,7 +392,7 @@ void __init kirkwood_audio_init(void) | |||
| 392 | /* | 392 | /* |
| 393 | * Identify device ID and revision. | 393 | * Identify device ID and revision. |
| 394 | */ | 394 | */ |
| 395 | static char * __init kirkwood_id(void) | 395 | char * __init kirkwood_id(void) |
| 396 | { | 396 | { |
| 397 | u32 dev, rev; | 397 | u32 dev, rev; |
| 398 | 398 | ||
| @@ -435,7 +435,7 @@ static char * __init kirkwood_id(void) | |||
| 435 | } | 435 | } |
| 436 | } | 436 | } |
| 437 | 437 | ||
| 438 | static void __init kirkwood_l2_init(void) | 438 | void __init kirkwood_l2_init(void) |
| 439 | { | 439 | { |
| 440 | #ifdef CONFIG_CACHE_FEROCEON_L2_WRITETHROUGH | 440 | #ifdef CONFIG_CACHE_FEROCEON_L2_WRITETHROUGH |
| 441 | writel(readl(L2_CONFIG_REG) | L2_WRITETHROUGH, L2_CONFIG_REG); | 441 | writel(readl(L2_CONFIG_REG) | L2_WRITETHROUGH, L2_CONFIG_REG); |
| @@ -450,7 +450,6 @@ void __init kirkwood_init(void) | |||
| 450 | { | 450 | { |
| 451 | printk(KERN_INFO "Kirkwood: %s, TCLK=%d.\n", | 451 | printk(KERN_INFO "Kirkwood: %s, TCLK=%d.\n", |
| 452 | kirkwood_id(), kirkwood_tclk); | 452 | kirkwood_id(), kirkwood_tclk); |
| 453 | kirkwood_i2s_data.tclk = kirkwood_tclk; | ||
| 454 | 453 | ||
| 455 | /* | 454 | /* |
| 456 | * Disable propagation of mbus errors to the CPU local bus, | 455 | * Disable propagation of mbus errors to the CPU local bus, |
diff --git a/arch/arm/mach-kirkwood/common.h b/arch/arm/mach-kirkwood/common.h index 9071a397136d..fa8e7689c436 100644 --- a/arch/arm/mach-kirkwood/common.h +++ b/arch/arm/mach-kirkwood/common.h | |||
| @@ -51,6 +51,21 @@ void kirkwood_nand_init_rnb(struct mtd_partition *parts, int nr_parts, int (*dev | |||
| 51 | void kirkwood_audio_init(void); | 51 | void kirkwood_audio_init(void); |
| 52 | void kirkwood_restart(char, const char *); | 52 | void kirkwood_restart(char, const char *); |
| 53 | 53 | ||
| 54 | /* board init functions for boards not fully converted to fdt */ | ||
| 55 | #ifdef CONFIG_MACH_DREAMPLUG_DT | ||
| 56 | void dreamplug_init(void); | ||
| 57 | #else | ||
| 58 | static inline void dreamplug_init(void) {}; | ||
| 59 | #endif | ||
| 60 | |||
| 61 | /* early init functions not converted to fdt yet */ | ||
| 62 | char *kirkwood_id(void); | ||
| 63 | void kirkwood_l2_init(void); | ||
| 64 | void kirkwood_wdt_init(void); | ||
| 65 | void kirkwood_xor0_init(void); | ||
| 66 | void kirkwood_xor1_init(void); | ||
| 67 | void kirkwood_crypto_init(void); | ||
| 68 | |||
| 54 | extern int kirkwood_tclk; | 69 | extern int kirkwood_tclk; |
| 55 | extern struct sys_timer kirkwood_timer; | 70 | extern struct sys_timer kirkwood_timer; |
| 56 | 71 | ||
diff --git a/arch/arm/mach-spear6xx/Kconfig b/arch/arm/mach-spear6xx/Kconfig index ff4ae5ba00f1..fbe298bd1d92 100644 --- a/arch/arm/mach-spear6xx/Kconfig +++ b/arch/arm/mach-spear6xx/Kconfig | |||
| @@ -5,11 +5,12 @@ | |||
| 5 | if ARCH_SPEAR6XX | 5 | if ARCH_SPEAR6XX |
| 6 | 6 | ||
| 7 | menu "SPEAr6xx Implementations" | 7 | menu "SPEAr6xx Implementations" |
| 8 | config BOARD_SPEAR600_EVB | 8 | config BOARD_SPEAR600_DT |
| 9 | bool "SPEAr600 Evaluation Board" | 9 | bool "SPEAr600 generic board configured via device-tree" |
| 10 | select MACH_SPEAR600 | 10 | select MACH_SPEAR600 |
| 11 | select USE_OF | ||
| 11 | help | 12 | help |
| 12 | Supports ST SPEAr600 Evaluation Board | 13 | Supports ST SPEAr600 boards configured via the device-tree |
| 13 | 14 | ||
| 14 | endmenu | 15 | endmenu |
| 15 | 16 | ||
diff --git a/arch/arm/mach-spear6xx/Makefile b/arch/arm/mach-spear6xx/Makefile index cc1a4d82d459..76e5750552fc 100644 --- a/arch/arm/mach-spear6xx/Makefile +++ b/arch/arm/mach-spear6xx/Makefile | |||
| @@ -4,9 +4,3 @@ | |||
| 4 | 4 | ||
| 5 | # common files | 5 | # common files |
| 6 | obj-y += clock.o spear6xx.o | 6 | obj-y += clock.o spear6xx.o |
| 7 | |||
| 8 | # spear600 specific files | ||
| 9 | obj-$(CONFIG_MACH_SPEAR600) += spear600.o | ||
| 10 | |||
| 11 | # spear600 boards files | ||
| 12 | obj-$(CONFIG_BOARD_SPEAR600_EVB) += spear600_evb.o | ||
diff --git a/arch/arm/mach-spear6xx/clock.c b/arch/arm/mach-spear6xx/clock.c index ac70e0d88fef..358f2800f17b 100644 --- a/arch/arm/mach-spear6xx/clock.c +++ b/arch/arm/mach-spear6xx/clock.c | |||
| @@ -641,8 +641,8 @@ static struct clk_lookup spear_clk_lookups[] = { | |||
| 641 | { .con_id = "gpt0_synth_clk", .clk = &gpt0_synth_clk}, | 641 | { .con_id = "gpt0_synth_clk", .clk = &gpt0_synth_clk}, |
| 642 | { .con_id = "gpt2_synth_clk", .clk = &gpt2_synth_clk}, | 642 | { .con_id = "gpt2_synth_clk", .clk = &gpt2_synth_clk}, |
| 643 | { .con_id = "gpt3_synth_clk", .clk = &gpt3_synth_clk}, | 643 | { .con_id = "gpt3_synth_clk", .clk = &gpt3_synth_clk}, |
| 644 | { .dev_id = "uart0", .clk = &uart0_clk}, | 644 | { .dev_id = "d0000000.serial", .clk = &uart0_clk}, |
| 645 | { .dev_id = "uart1", .clk = &uart1_clk}, | 645 | { .dev_id = "d0080000.serial", .clk = &uart1_clk}, |
| 646 | { .dev_id = "firda", .clk = &firda_clk}, | 646 | { .dev_id = "firda", .clk = &firda_clk}, |
| 647 | { .dev_id = "clcd", .clk = &clcd_clk}, | 647 | { .dev_id = "clcd", .clk = &clcd_clk}, |
| 648 | { .dev_id = "gpt0", .clk = &gpt0_clk}, | 648 | { .dev_id = "gpt0", .clk = &gpt0_clk}, |
| @@ -655,20 +655,20 @@ static struct clk_lookup spear_clk_lookups[] = { | |||
| 655 | { .con_id = "usbh.1_clk", .clk = &usbh1_clk}, | 655 | { .con_id = "usbh.1_clk", .clk = &usbh1_clk}, |
| 656 | /* clock derived from ahb clk */ | 656 | /* clock derived from ahb clk */ |
| 657 | { .con_id = "apb_clk", .clk = &apb_clk}, | 657 | { .con_id = "apb_clk", .clk = &apb_clk}, |
| 658 | { .dev_id = "i2c_designware.0", .clk = &i2c_clk}, | 658 | { .dev_id = "d0200000.i2c", .clk = &i2c_clk}, |
| 659 | { .dev_id = "dma", .clk = &dma_clk}, | 659 | { .dev_id = "dma", .clk = &dma_clk}, |
| 660 | { .dev_id = "jpeg", .clk = &jpeg_clk}, | 660 | { .dev_id = "jpeg", .clk = &jpeg_clk}, |
| 661 | { .dev_id = "gmac", .clk = &gmac_clk}, | 661 | { .dev_id = "gmac", .clk = &gmac_clk}, |
| 662 | { .dev_id = "smi", .clk = &smi_clk}, | 662 | { .dev_id = "smi", .clk = &smi_clk}, |
| 663 | { .con_id = "fsmc", .clk = &fsmc_clk}, | 663 | { .dev_id = "fsmc-nand", .clk = &fsmc_clk}, |
| 664 | /* clock derived from apb clk */ | 664 | /* clock derived from apb clk */ |
| 665 | { .dev_id = "adc", .clk = &adc_clk}, | 665 | { .dev_id = "adc", .clk = &adc_clk}, |
| 666 | { .dev_id = "ssp-pl022.0", .clk = &ssp0_clk}, | 666 | { .dev_id = "ssp-pl022.0", .clk = &ssp0_clk}, |
| 667 | { .dev_id = "ssp-pl022.1", .clk = &ssp1_clk}, | 667 | { .dev_id = "ssp-pl022.1", .clk = &ssp1_clk}, |
| 668 | { .dev_id = "ssp-pl022.2", .clk = &ssp2_clk}, | 668 | { .dev_id = "ssp-pl022.2", .clk = &ssp2_clk}, |
| 669 | { .dev_id = "gpio0", .clk = &gpio0_clk}, | 669 | { .dev_id = "f0100000.gpio", .clk = &gpio0_clk}, |
| 670 | { .dev_id = "gpio1", .clk = &gpio1_clk}, | 670 | { .dev_id = "fc980000.gpio", .clk = &gpio1_clk}, |
| 671 | { .dev_id = "gpio2", .clk = &gpio2_clk}, | 671 | { .dev_id = "d8100000.gpio", .clk = &gpio2_clk}, |
| 672 | }; | 672 | }; |
| 673 | 673 | ||
| 674 | void __init spear6xx_clk_init(void) | 674 | void __init spear6xx_clk_init(void) |
diff --git a/arch/arm/mach-spear6xx/spear600.c b/arch/arm/mach-spear6xx/spear600.c deleted file mode 100644 index d0e6eeae9b04..000000000000 --- a/arch/arm/mach-spear6xx/spear600.c +++ /dev/null | |||
| @@ -1,25 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * arch/arm/mach-spear6xx/spear600.c | ||
| 3 | * | ||
| 4 | * SPEAr600 machine source file | ||
| 5 | * | ||
| 6 | * Copyright (C) 2009 ST Microelectronics | ||
| 7 | * Rajeev Kumar<rajeev-dlh.kumar@st.com> | ||
| 8 | * | ||
| 9 | * This file is licensed under the terms of the GNU General Public | ||
| 10 | * License version 2. This program is licensed "as is" without any | ||
| 11 | * warranty of any kind, whether express or implied. | ||
| 12 | */ | ||
| 13 | |||
| 14 | #include <linux/ptrace.h> | ||
| 15 | #include <asm/irq.h> | ||
| 16 | #include <mach/generic.h> | ||
| 17 | #include <mach/hardware.h> | ||
| 18 | |||
| 19 | /* Add spear600 specific devices here */ | ||
| 20 | |||
| 21 | void __init spear600_init(void) | ||
| 22 | { | ||
| 23 | /* call spear6xx family common init function */ | ||
| 24 | spear6xx_init(); | ||
| 25 | } | ||
diff --git a/arch/arm/mach-spear6xx/spear600_evb.c b/arch/arm/mach-spear6xx/spear600_evb.c deleted file mode 100644 index c6e4254741cc..000000000000 --- a/arch/arm/mach-spear6xx/spear600_evb.c +++ /dev/null | |||
| @@ -1,54 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * arch/arm/mach-spear6xx/spear600_evb.c | ||
| 3 | * | ||
| 4 | * SPEAr600 evaluation board source file | ||
| 5 | * | ||
| 6 | * Copyright (C) 2009 ST Microelectronics | ||
| 7 | * Viresh Kumar<viresh.kumar@st.com> | ||
| 8 | * | ||
| 9 | * This file is licensed under the terms of the GNU General Public | ||
| 10 | * License version 2. This program is licensed "as is" without any | ||
| 11 | * warranty of any kind, whether express or implied. | ||
| 12 | */ | ||
| 13 | |||
| 14 | #include <asm/hardware/vic.h> | ||
| 15 | #include <asm/mach/arch.h> | ||
| 16 | #include <asm/mach-types.h> | ||
| 17 | #include <mach/generic.h> | ||
| 18 | #include <mach/hardware.h> | ||
| 19 | |||
| 20 | static struct amba_device *amba_devs[] __initdata = { | ||
| 21 | &gpio_device[0], | ||
| 22 | &gpio_device[1], | ||
| 23 | &gpio_device[2], | ||
| 24 | &uart_device[0], | ||
| 25 | &uart_device[1], | ||
| 26 | }; | ||
| 27 | |||
| 28 | static struct platform_device *plat_devs[] __initdata = { | ||
| 29 | }; | ||
| 30 | |||
| 31 | static void __init spear600_evb_init(void) | ||
| 32 | { | ||
| 33 | unsigned int i; | ||
| 34 | |||
| 35 | /* call spear600 machine init function */ | ||
| 36 | spear600_init(); | ||
| 37 | |||
| 38 | /* Add Platform Devices */ | ||
| 39 | platform_add_devices(plat_devs, ARRAY_SIZE(plat_devs)); | ||
| 40 | |||
| 41 | /* Add Amba Devices */ | ||
| 42 | for (i = 0; i < ARRAY_SIZE(amba_devs); i++) | ||
| 43 | amba_device_register(amba_devs[i], &iomem_resource); | ||
| 44 | } | ||
| 45 | |||
| 46 | MACHINE_START(SPEAR600, "ST-SPEAR600-EVB") | ||
| 47 | .atag_offset = 0x100, | ||
| 48 | .map_io = spear6xx_map_io, | ||
| 49 | .init_irq = spear6xx_init_irq, | ||
| 50 | .handle_irq = vic_handle_irq, | ||
| 51 | .timer = &spear6xx_timer, | ||
| 52 | .init_machine = spear600_evb_init, | ||
| 53 | .restart = spear_restart, | ||
| 54 | MACHINE_END | ||
diff --git a/arch/arm/mach-spear6xx/spear6xx.c b/arch/arm/mach-spear6xx/spear6xx.c index b997b1b10ba0..2ed8b14c82c8 100644 --- a/arch/arm/mach-spear6xx/spear6xx.c +++ b/arch/arm/mach-spear6xx/spear6xx.c | |||
| @@ -6,111 +6,21 @@ | |||
| 6 | * Copyright (C) 2009 ST Microelectronics | 6 | * Copyright (C) 2009 ST Microelectronics |
| 7 | * Rajeev Kumar<rajeev-dlh.kumar@st.com> | 7 | * Rajeev Kumar<rajeev-dlh.kumar@st.com> |
| 8 | * | 8 | * |
| 9 | * Copyright 2012 Stefan Roese <sr@denx.de> | ||
| 10 | * | ||
| 9 | * This file is licensed under the terms of the GNU General Public | 11 | * This file is licensed under the terms of the GNU General Public |
| 10 | * License version 2. This program is licensed "as is" without any | 12 | * License version 2. This program is licensed "as is" without any |
| 11 | * warranty of any kind, whether express or implied. | 13 | * warranty of any kind, whether express or implied. |
| 12 | */ | 14 | */ |
| 13 | 15 | ||
| 14 | #include <linux/types.h> | 16 | #include <linux/of.h> |
| 15 | #include <linux/amba/pl061.h> | 17 | #include <linux/of_address.h> |
| 16 | #include <linux/ptrace.h> | 18 | #include <linux/of_irq.h> |
| 17 | #include <linux/io.h> | 19 | #include <linux/of_platform.h> |
| 18 | #include <asm/hardware/vic.h> | 20 | #include <asm/hardware/vic.h> |
| 19 | #include <asm/irq.h> | ||
| 20 | #include <asm/mach/arch.h> | 21 | #include <asm/mach/arch.h> |
| 21 | #include <mach/generic.h> | 22 | #include <mach/generic.h> |
| 22 | #include <mach/hardware.h> | 23 | #include <mach/hardware.h> |
| 23 | #include <mach/irqs.h> | ||
| 24 | |||
| 25 | /* Add spear6xx machines common devices here */ | ||
| 26 | /* uart device registration */ | ||
| 27 | struct amba_device uart_device[] = { | ||
| 28 | { | ||
| 29 | .dev = { | ||
| 30 | .init_name = "uart0", | ||
| 31 | }, | ||
| 32 | .res = { | ||
| 33 | .start = SPEAR6XX_ICM1_UART0_BASE, | ||
| 34 | .end = SPEAR6XX_ICM1_UART0_BASE + SZ_4K - 1, | ||
| 35 | .flags = IORESOURCE_MEM, | ||
| 36 | }, | ||
| 37 | .irq = {IRQ_UART_0}, | ||
| 38 | }, { | ||
| 39 | .dev = { | ||
| 40 | .init_name = "uart1", | ||
| 41 | }, | ||
| 42 | .res = { | ||
| 43 | .start = SPEAR6XX_ICM1_UART1_BASE, | ||
| 44 | .end = SPEAR6XX_ICM1_UART1_BASE + SZ_4K - 1, | ||
| 45 | .flags = IORESOURCE_MEM, | ||
| 46 | }, | ||
| 47 | .irq = {IRQ_UART_1}, | ||
| 48 | } | ||
| 49 | }; | ||
| 50 | |||
| 51 | /* gpio device registration */ | ||
| 52 | static struct pl061_platform_data gpio_plat_data[] = { | ||
| 53 | { | ||
| 54 | .gpio_base = 0, | ||
| 55 | .irq_base = SPEAR_GPIO0_INT_BASE, | ||
| 56 | }, { | ||
| 57 | .gpio_base = 8, | ||
| 58 | .irq_base = SPEAR_GPIO1_INT_BASE, | ||
| 59 | }, { | ||
| 60 | .gpio_base = 16, | ||
| 61 | .irq_base = SPEAR_GPIO2_INT_BASE, | ||
| 62 | }, | ||
| 63 | }; | ||
| 64 | |||
| 65 | struct amba_device gpio_device[] = { | ||
| 66 | { | ||
| 67 | .dev = { | ||
| 68 | .init_name = "gpio0", | ||
| 69 | .platform_data = &gpio_plat_data[0], | ||
| 70 | }, | ||
| 71 | .res = { | ||
| 72 | .start = SPEAR6XX_CPU_GPIO_BASE, | ||
| 73 | .end = SPEAR6XX_CPU_GPIO_BASE + SZ_4K - 1, | ||
| 74 | .flags = IORESOURCE_MEM, | ||
| 75 | }, | ||
| 76 | .irq = {IRQ_LOCAL_GPIO}, | ||
| 77 | }, { | ||
| 78 | .dev = { | ||
| 79 | .init_name = "gpio1", | ||
| 80 | .platform_data = &gpio_plat_data[1], | ||
| 81 | }, | ||
| 82 | .res = { | ||
| 83 | .start = SPEAR6XX_ICM3_GPIO_BASE, | ||
| 84 | .end = SPEAR6XX_ICM3_GPIO_BASE + SZ_4K - 1, | ||
| 85 | .flags = IORESOURCE_MEM, | ||
| 86 | }, | ||
| 87 | .irq = {IRQ_BASIC_GPIO}, | ||
| 88 | }, { | ||
| 89 | .dev = { | ||
| 90 | .init_name = "gpio2", | ||
| 91 | .platform_data = &gpio_plat_data[2], | ||
| 92 | }, | ||
| 93 | .res = { | ||
| 94 | .start = SPEAR6XX_ICM2_GPIO_BASE, | ||
| 95 | .end = SPEAR6XX_ICM2_GPIO_BASE + SZ_4K - 1, | ||
| 96 | .flags = IORESOURCE_MEM, | ||
| 97 | }, | ||
| 98 | .irq = {IRQ_APPL_GPIO}, | ||
| 99 | } | ||
| 100 | }; | ||
| 101 | |||
| 102 | /* This will add devices, and do machine specific tasks */ | ||
| 103 | void __init spear6xx_init(void) | ||
| 104 | { | ||
| 105 | /* nothing to do for now */ | ||
| 106 | } | ||
| 107 | |||
| 108 | /* This will initialize vic */ | ||
| 109 | void __init spear6xx_init_irq(void) | ||
| 110 | { | ||
| 111 | vic_init((void __iomem *)VA_SPEAR6XX_CPU_VIC_PRI_BASE, 0, ~0, 0); | ||
| 112 | vic_init((void __iomem *)VA_SPEAR6XX_CPU_VIC_SEC_BASE, 32, ~0, 0); | ||
| 113 | } | ||
| 114 | 24 | ||
| 115 | /* Following will create static virtual/physical mappings */ | 25 | /* Following will create static virtual/physical mappings */ |
| 116 | static struct map_desc spear6xx_io_desc[] __initdata = { | 26 | static struct map_desc spear6xx_io_desc[] __initdata = { |
| @@ -181,3 +91,33 @@ static void __init spear6xx_timer_init(void) | |||
| 181 | struct sys_timer spear6xx_timer = { | 91 | struct sys_timer spear6xx_timer = { |
| 182 | .init = spear6xx_timer_init, | 92 | .init = spear6xx_timer_init, |
| 183 | }; | 93 | }; |
| 94 | |||
| 95 | static void __init spear600_dt_init(void) | ||
| 96 | { | ||
| 97 | of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); | ||
| 98 | } | ||
| 99 | |||
| 100 | static const char *spear600_dt_board_compat[] = { | ||
| 101 | "st,spear600", | ||
| 102 | NULL | ||
| 103 | }; | ||
| 104 | |||
| 105 | static const struct of_device_id vic_of_match[] __initconst = { | ||
| 106 | { .compatible = "arm,pl190-vic", .data = vic_of_init, }, | ||
| 107 | { /* Sentinel */ } | ||
| 108 | }; | ||
| 109 | |||
| 110 | static void __init spear6xx_dt_init_irq(void) | ||
| 111 | { | ||
| 112 | of_irq_init(vic_of_match); | ||
| 113 | } | ||
| 114 | |||
| 115 | DT_MACHINE_START(SPEAR600_DT, "ST SPEAr600 (Flattened Device Tree)") | ||
| 116 | .map_io = spear6xx_map_io, | ||
| 117 | .init_irq = spear6xx_dt_init_irq, | ||
| 118 | .handle_irq = vic_handle_irq, | ||
| 119 | .timer = &spear6xx_timer, | ||
| 120 | .init_machine = spear600_dt_init, | ||
| 121 | .restart = spear_restart, | ||
| 122 | .dt_compat = spear600_dt_board_compat, | ||
| 123 | MACHINE_END | ||
diff --git a/arch/arm/mach-ux500/Kconfig b/arch/arm/mach-ux500/Kconfig index 8904d18de01a..880d02ec89d4 100644 --- a/arch/arm/mach-ux500/Kconfig +++ b/arch/arm/mach-ux500/Kconfig | |||
| @@ -58,6 +58,12 @@ config UX500_AUTO_PLATFORM | |||
| 58 | At least one platform needs to be selected in order to build | 58 | At least one platform needs to be selected in order to build |
| 59 | a working kernel. If everything else is disabled, this | 59 | a working kernel. If everything else is disabled, this |
| 60 | automatically enables MACH_MOP500. | 60 | automatically enables MACH_MOP500. |
| 61 | |||
| 62 | config MACH_UX500_DT | ||
| 63 | bool "Generic U8500 support using device tree" | ||
| 64 | depends on MACH_MOP500 | ||
| 65 | select USE_OF | ||
| 66 | |||
| 61 | endmenu | 67 | endmenu |
| 62 | 68 | ||
| 63 | config UX500_DEBUG_UART | 69 | config UX500_DEBUG_UART |
diff --git a/arch/arm/mach-ux500/Makefile.boot b/arch/arm/mach-ux500/Makefile.boot index ff0a4b5b0a82..dd5cd00e2554 100644 --- a/arch/arm/mach-ux500/Makefile.boot +++ b/arch/arm/mach-ux500/Makefile.boot | |||
| @@ -2,3 +2,4 @@ | |||
| 2 | params_phys-y := 0x00000100 | 2 | params_phys-y := 0x00000100 |
| 3 | initrd_phys-y := 0x00800000 | 3 | initrd_phys-y := 0x00800000 |
| 4 | 4 | ||
| 5 | dtb-$(CONFIG_MACH_SNOWBALL) += snowball.dtb | ||
diff --git a/arch/arm/mach-ux500/board-mop500.c b/arch/arm/mach-ux500/board-mop500.c index 29d330374994..77d03c1fbd04 100644 --- a/arch/arm/mach-ux500/board-mop500.c +++ b/arch/arm/mach-ux500/board-mop500.c | |||
| @@ -30,6 +30,9 @@ | |||
| 30 | #include <linux/gpio_keys.h> | 30 | #include <linux/gpio_keys.h> |
| 31 | #include <linux/delay.h> | 31 | #include <linux/delay.h> |
| 32 | 32 | ||
| 33 | #include <linux/of.h> | ||
| 34 | #include <linux/of_platform.h> | ||
| 35 | |||
| 33 | #include <linux/leds.h> | 36 | #include <linux/leds.h> |
| 34 | #include <asm/mach-types.h> | 37 | #include <asm/mach-types.h> |
| 35 | #include <asm/mach/arch.h> | 38 | #include <asm/mach/arch.h> |
| @@ -440,7 +443,7 @@ static struct stedma40_chan_cfg ssp0_dma_cfg_tx = { | |||
| 440 | }; | 443 | }; |
| 441 | #endif | 444 | #endif |
| 442 | 445 | ||
| 443 | static struct pl022_ssp_controller ssp0_platform_data = { | 446 | static struct pl022_ssp_controller ssp0_plat = { |
| 444 | .bus_id = 0, | 447 | .bus_id = 0, |
| 445 | #ifdef CONFIG_STE_DMA40 | 448 | #ifdef CONFIG_STE_DMA40 |
| 446 | .enable_dma = 1, | 449 | .enable_dma = 1, |
| @@ -458,7 +461,7 @@ static struct pl022_ssp_controller ssp0_platform_data = { | |||
| 458 | 461 | ||
| 459 | static void __init mop500_spi_init(struct device *parent) | 462 | static void __init mop500_spi_init(struct device *parent) |
| 460 | { | 463 | { |
| 461 | db8500_add_ssp0(parent, &ssp0_platform_data); | 464 | db8500_add_ssp0(parent, &ssp0_plat); |
| 462 | } | 465 | } |
| 463 | 466 | ||
| 464 | #ifdef CONFIG_STE_DMA40 | 467 | #ifdef CONFIG_STE_DMA40 |
| @@ -618,6 +621,7 @@ static void __init mop500_init_machine(void) | |||
| 618 | 621 | ||
| 619 | mop500_pins_init(); | 622 | mop500_pins_init(); |
| 620 | 623 | ||
| 624 | /* FIXME: parent of ab8500 should be prcmu */ | ||
| 621 | for (i = 0; i < ARRAY_SIZE(mop500_platform_devs); i++) | 625 | for (i = 0; i < ARRAY_SIZE(mop500_platform_devs); i++) |
| 622 | mop500_platform_devs[i]->dev.parent = parent; | 626 | mop500_platform_devs[i]->dev.parent = parent; |
| 623 | 627 | ||
| @@ -738,3 +742,94 @@ MACHINE_START(SNOWBALL, "Calao Systems Snowball platform") | |||
| 738 | .handle_irq = gic_handle_irq, | 742 | .handle_irq = gic_handle_irq, |
| 739 | .init_machine = snowball_init_machine, | 743 | .init_machine = snowball_init_machine, |
| 740 | MACHINE_END | 744 | MACHINE_END |
| 745 | |||
| 746 | #ifdef CONFIG_MACH_UX500_DT | ||
| 747 | |||
| 748 | struct of_dev_auxdata u8500_auxdata_lookup[] __initdata = { | ||
| 749 | OF_DEV_AUXDATA("arm,pl011", 0x80120000, "uart0", &uart0_plat), | ||
| 750 | OF_DEV_AUXDATA("arm,pl011", 0x80121000, "uart1", &uart1_plat), | ||
| 751 | OF_DEV_AUXDATA("arm,pl011", 0x80007000, "uart2", &uart2_plat), | ||
| 752 | OF_DEV_AUXDATA("arm,pl022", 0x80002000, "ssp0", &ssp0_plat), | ||
| 753 | {}, | ||
| 754 | }; | ||
| 755 | |||
| 756 | static const struct of_device_id u8500_soc_node[] = { | ||
| 757 | /* only create devices below soc node */ | ||
| 758 | { .compatible = "stericsson,db8500", }, | ||
| 759 | { }, | ||
| 760 | }; | ||
| 761 | |||
| 762 | static void __init u8500_init_machine(void) | ||
| 763 | { | ||
| 764 | struct device *parent = NULL; | ||
| 765 | int i2c0_devs; | ||
| 766 | int i; | ||
| 767 | |||
| 768 | parent = u8500_init_devices(); | ||
| 769 | i2c0_devs = ARRAY_SIZE(mop500_i2c0_devices); | ||
| 770 | |||
| 771 | for (i = 0; i < ARRAY_SIZE(mop500_platform_devs); i++) | ||
| 772 | mop500_platform_devs[i]->dev.parent = parent; | ||
| 773 | for (i = 0; i < ARRAY_SIZE(snowball_platform_devs); i++) | ||
| 774 | snowball_platform_devs[i]->dev.parent = parent; | ||
| 775 | |||
| 776 | /* automatically probe child nodes of db8500 device */ | ||
| 777 | of_platform_populate(NULL, u8500_soc_node, u8500_auxdata_lookup, parent); | ||
| 778 | |||
| 779 | if (of_machine_is_compatible("st-ericsson,mop500")) { | ||
| 780 | mop500_gpio_keys[0].gpio = GPIO_PROX_SENSOR; | ||
| 781 | mop500_pins_init(); | ||
| 782 | |||
| 783 | platform_add_devices(mop500_platform_devs, | ||
| 784 | ARRAY_SIZE(mop500_platform_devs)); | ||
| 785 | |||
| 786 | mop500_sdi_init(parent); | ||
| 787 | } else if (of_machine_is_compatible("calaosystems,snowball-a9500")) { | ||
| 788 | snowball_pins_init(); | ||
| 789 | platform_add_devices(snowball_platform_devs, | ||
| 790 | ARRAY_SIZE(snowball_platform_devs)); | ||
| 791 | |||
| 792 | snowball_sdi_init(parent); | ||
| 793 | } else if (of_machine_is_compatible("st-ericsson,hrefv60+")) { | ||
| 794 | /* | ||
| 795 | * The HREFv60 board removed a GPIO expander and routed | ||
| 796 | * all these GPIO pins to the internal GPIO controller | ||
| 797 | * instead. | ||
| 798 | */ | ||
| 799 | mop500_gpio_keys[0].gpio = HREFV60_PROX_SENSE_GPIO; | ||
| 800 | i2c0_devs -= NUM_PRE_V60_I2C0_DEVICES; | ||
| 801 | hrefv60_pins_init(); | ||
| 802 | platform_add_devices(mop500_platform_devs, | ||
| 803 | ARRAY_SIZE(mop500_platform_devs)); | ||
| 804 | |||
| 805 | hrefv60_sdi_init(parent); | ||
| 806 | } | ||
| 807 | mop500_i2c_init(parent); | ||
| 808 | |||
| 809 | i2c_register_board_info(0, mop500_i2c0_devices, i2c0_devs); | ||
| 810 | i2c_register_board_info(2, mop500_i2c2_devices, | ||
| 811 | ARRAY_SIZE(mop500_i2c2_devices)); | ||
| 812 | |||
| 813 | /* This board has full regulator constraints */ | ||
| 814 | regulator_has_full_constraints(); | ||
| 815 | } | ||
| 816 | |||
| 817 | static const char * u8500_dt_board_compat[] = { | ||
| 818 | "calaosystems,snowball-a9500", | ||
| 819 | "st-ericsson,hrefv60+", | ||
| 820 | "st-ericsson,u8500", | ||
| 821 | "st-ericsson,mop500", | ||
| 822 | NULL, | ||
| 823 | }; | ||
| 824 | |||
| 825 | |||
| 826 | DT_MACHINE_START(U8500_DT, "ST-Ericsson U8500 platform (Device Tree Support)") | ||
| 827 | .map_io = u8500_map_io, | ||
| 828 | .init_irq = ux500_init_irq, | ||
| 829 | /* we re-use nomadik timer here */ | ||
| 830 | .timer = &ux500_timer, | ||
| 831 | .handle_irq = gic_handle_irq, | ||
| 832 | .init_machine = u8500_init_machine, | ||
| 833 | .dt_compat = u8500_dt_board_compat, | ||
| 834 | MACHINE_END | ||
| 835 | #endif | ||
diff --git a/arch/arm/mach-ux500/cache-l2x0.c b/arch/arm/mach-ux500/cache-l2x0.c index da5569d83d58..77a75ed0df67 100644 --- a/arch/arm/mach-ux500/cache-l2x0.c +++ b/arch/arm/mach-ux500/cache-l2x0.c | |||
| @@ -5,6 +5,8 @@ | |||
| 5 | */ | 5 | */ |
| 6 | 6 | ||
| 7 | #include <linux/io.h> | 7 | #include <linux/io.h> |
| 8 | #include <linux/of.h> | ||
| 9 | |||
| 8 | #include <asm/cacheflush.h> | 10 | #include <asm/cacheflush.h> |
| 9 | #include <asm/hardware/cache-l2x0.h> | 11 | #include <asm/hardware/cache-l2x0.h> |
| 10 | #include <mach/hardware.h> | 12 | #include <mach/hardware.h> |
| @@ -45,7 +47,10 @@ static int __init ux500_l2x0_init(void) | |||
| 45 | ux500_l2x0_unlock(); | 47 | ux500_l2x0_unlock(); |
| 46 | 48 | ||
| 47 | /* 64KB way size, 8 way associativity, force WA */ | 49 | /* 64KB way size, 8 way associativity, force WA */ |
| 48 | l2x0_init(l2x0_base, 0x3e060000, 0xc0000fff); | 50 | if (of_have_populated_dt()) |
| 51 | l2x0_of_init(0x3e060000, 0xc0000fff); | ||
| 52 | else | ||
| 53 | l2x0_init(l2x0_base, 0x3e060000, 0xc0000fff); | ||
| 49 | 54 | ||
| 50 | /* | 55 | /* |
| 51 | * We can't disable l2 as we are in non secure mode, currently | 56 | * We can't disable l2 as we are in non secure mode, currently |
diff --git a/arch/arm/mach-ux500/cpu.c b/arch/arm/mach-ux500/cpu.c index 6242e88e5fd3..d11f3892a27d 100644 --- a/arch/arm/mach-ux500/cpu.c +++ b/arch/arm/mach-ux500/cpu.c | |||
| @@ -16,6 +16,8 @@ | |||
| 16 | #include <linux/err.h> | 16 | #include <linux/err.h> |
| 17 | #include <linux/slab.h> | 17 | #include <linux/slab.h> |
| 18 | #include <linux/stat.h> | 18 | #include <linux/stat.h> |
| 19 | #include <linux/of.h> | ||
| 20 | #include <linux/of_irq.h> | ||
| 19 | 21 | ||
| 20 | #include <asm/hardware/gic.h> | 22 | #include <asm/hardware/gic.h> |
| 21 | #include <asm/mach/map.h> | 23 | #include <asm/mach/map.h> |
| @@ -28,6 +30,11 @@ | |||
| 28 | 30 | ||
| 29 | void __iomem *_PRCMU_BASE; | 31 | void __iomem *_PRCMU_BASE; |
| 30 | 32 | ||
| 33 | static const struct of_device_id ux500_dt_irq_match[] = { | ||
| 34 | { .compatible = "arm,cortex-a9-gic", .data = gic_of_init, }, | ||
| 35 | {}, | ||
| 36 | }; | ||
| 37 | |||
| 31 | void __init ux500_init_irq(void) | 38 | void __init ux500_init_irq(void) |
| 32 | { | 39 | { |
| 33 | void __iomem *dist_base; | 40 | void __iomem *dist_base; |
| @@ -42,7 +49,12 @@ void __init ux500_init_irq(void) | |||
| 42 | } else | 49 | } else |
| 43 | ux500_unknown_soc(); | 50 | ux500_unknown_soc(); |
| 44 | 51 | ||
| 45 | gic_init(0, 29, dist_base, cpu_base); | 52 | #ifdef CONFIG_OF |
| 53 | if (of_have_populated_dt()) | ||
| 54 | of_irq_init(ux500_dt_irq_match); | ||
| 55 | else | ||
| 56 | #endif | ||
| 57 | gic_init(0, 29, dist_base, cpu_base); | ||
| 46 | 58 | ||
| 47 | /* | 59 | /* |
| 48 | * Init clocks here so that they are available for system timer | 60 | * Init clocks here so that they are available for system timer |
diff --git a/arch/arm/mach-ux500/timer.c b/arch/arm/mach-ux500/timer.c index e9d580702fbb..d37df98b5c32 100644 --- a/arch/arm/mach-ux500/timer.c +++ b/arch/arm/mach-ux500/timer.c | |||
| @@ -7,6 +7,7 @@ | |||
| 7 | #include <linux/io.h> | 7 | #include <linux/io.h> |
| 8 | #include <linux/errno.h> | 8 | #include <linux/errno.h> |
| 9 | #include <linux/clksrc-dbx500-prcmu.h> | 9 | #include <linux/clksrc-dbx500-prcmu.h> |
| 10 | #include <linux/of.h> | ||
| 10 | 11 | ||
| 11 | #include <asm/smp_twd.h> | 12 | #include <asm/smp_twd.h> |
| 12 | 13 | ||
| @@ -30,9 +31,13 @@ static void __init ux500_twd_init(void) | |||
| 30 | twd_local_timer = cpu_is_u5500() ? &u5500_twd_local_timer : | 31 | twd_local_timer = cpu_is_u5500() ? &u5500_twd_local_timer : |
| 31 | &u8500_twd_local_timer; | 32 | &u8500_twd_local_timer; |
| 32 | 33 | ||
| 33 | err = twd_local_timer_register(twd_local_timer); | 34 | if (of_have_populated_dt()) |
| 34 | if (err) | 35 | twd_local_timer_of_register(); |
| 35 | pr_err("twd_local_timer_register failed %d\n", err); | 36 | else { |
| 37 | err = twd_local_timer_register(twd_local_timer); | ||
| 38 | if (err) | ||
| 39 | pr_err("twd_local_timer_register failed %d\n", err); | ||
| 40 | } | ||
| 36 | } | 41 | } |
| 37 | #else | 42 | #else |
| 38 | #define ux500_twd_init() do { } while(0) | 43 | #define ux500_twd_init() do { } while(0) |
diff --git a/arch/arm/plat-orion/common.c b/arch/arm/plat-orion/common.c index 089899a7db72..74daf5ed1432 100644 --- a/arch/arm/plat-orion/common.c +++ b/arch/arm/plat-orion/common.c | |||
| @@ -21,6 +21,7 @@ | |||
| 21 | #include <plat/orion_wdt.h> | 21 | #include <plat/orion_wdt.h> |
| 22 | #include <plat/mv_xor.h> | 22 | #include <plat/mv_xor.h> |
| 23 | #include <plat/ehci-orion.h> | 23 | #include <plat/ehci-orion.h> |
| 24 | #include <mach/bridge-regs.h> | ||
| 24 | 25 | ||
| 25 | /* Fill in the resources structure and link it into the platform | 26 | /* Fill in the resources structure and link it into the platform |
| 26 | device structure. There is always a memory region, and nearly | 27 | device structure. There is always a memory region, and nearly |
| @@ -568,13 +569,17 @@ void __init orion_spi_1_init(unsigned long mapbase, | |||
| 568 | ****************************************************************************/ | 569 | ****************************************************************************/ |
| 569 | static struct orion_wdt_platform_data orion_wdt_data; | 570 | static struct orion_wdt_platform_data orion_wdt_data; |
| 570 | 571 | ||
| 572 | static struct resource orion_wdt_resource = | ||
| 573 | DEFINE_RES_MEM(TIMER_VIRT_BASE, 0x28); | ||
| 574 | |||
| 571 | static struct platform_device orion_wdt_device = { | 575 | static struct platform_device orion_wdt_device = { |
| 572 | .name = "orion_wdt", | 576 | .name = "orion_wdt", |
| 573 | .id = -1, | 577 | .id = -1, |
| 574 | .dev = { | 578 | .dev = { |
| 575 | .platform_data = &orion_wdt_data, | 579 | .platform_data = &orion_wdt_data, |
| 576 | }, | 580 | }, |
| 577 | .num_resources = 0, | 581 | .resource = &orion_wdt_resource, |
| 582 | .num_resources = 1, | ||
| 578 | }; | 583 | }; |
| 579 | 584 | ||
| 580 | void __init orion_wdt_init(unsigned long tclk) | 585 | void __init orion_wdt_init(unsigned long tclk) |
diff --git a/arch/arm/plat-orion/include/plat/audio.h b/arch/arm/plat-orion/include/plat/audio.h index 885f8abd927b..d6a55bd2e578 100644 --- a/arch/arm/plat-orion/include/plat/audio.h +++ b/arch/arm/plat-orion/include/plat/audio.h | |||
| @@ -2,7 +2,6 @@ | |||
| 2 | #define __PLAT_AUDIO_H | 2 | #define __PLAT_AUDIO_H |
| 3 | 3 | ||
| 4 | struct kirkwood_asoc_platform_data { | 4 | struct kirkwood_asoc_platform_data { |
| 5 | u32 tclk; | ||
| 6 | int burst; | 5 | int burst; |
| 7 | }; | 6 | }; |
| 8 | #endif | 7 | #endif |
diff --git a/arch/avr32/boards/atngw100/setup.c b/arch/avr32/boards/atngw100/setup.c index 7c756fb189f7..afeae8978a8d 100644 --- a/arch/avr32/boards/atngw100/setup.c +++ b/arch/avr32/boards/atngw100/setup.c | |||
| @@ -97,6 +97,7 @@ static struct atmel_nand_data atngw100mkii_nand_data __initdata = { | |||
| 97 | .rdy_pin = GPIO_PIN_PB(28), | 97 | .rdy_pin = GPIO_PIN_PB(28), |
| 98 | .enable_pin = GPIO_PIN_PE(23), | 98 | .enable_pin = GPIO_PIN_PE(23), |
| 99 | .bus_width_16 = true, | 99 | .bus_width_16 = true, |
| 100 | .ecc_mode = NAND_ECC_SOFT, | ||
| 100 | .parts = nand_partitions, | 101 | .parts = nand_partitions, |
| 101 | .num_parts = ARRAY_SIZE(nand_partitions), | 102 | .num_parts = ARRAY_SIZE(nand_partitions), |
| 102 | }; | 103 | }; |
diff --git a/arch/avr32/boards/atstk1000/atstk1002.c b/arch/avr32/boards/atstk1000/atstk1002.c index c56ddac85d61..dc5263321480 100644 --- a/arch/avr32/boards/atstk1000/atstk1002.c +++ b/arch/avr32/boards/atstk1000/atstk1002.c | |||
| @@ -95,6 +95,7 @@ static struct atmel_nand_data atstk1006_nand_data __initdata = { | |||
| 95 | .ale = 22, | 95 | .ale = 22, |
| 96 | .rdy_pin = GPIO_PIN_PB(30), | 96 | .rdy_pin = GPIO_PIN_PB(30), |
| 97 | .enable_pin = GPIO_PIN_PB(29), | 97 | .enable_pin = GPIO_PIN_PB(29), |
| 98 | .ecc_mode = NAND_ECC_SOFT, | ||
| 98 | .parts = nand_partitions, | 99 | .parts = nand_partitions, |
| 99 | .num_parts = ARRAY_SIZE(num_partitions), | 100 | .num_parts = ARRAY_SIZE(num_partitions), |
| 100 | }; | 101 | }; |
diff --git a/arch/avr32/mach-at32ap/include/mach/board.h b/arch/avr32/mach-at32ap/include/mach/board.h index 67b111ce332d..71733866cb4f 100644 --- a/arch/avr32/mach-at32ap/include/mach/board.h +++ b/arch/avr32/mach-at32ap/include/mach/board.h | |||
| @@ -7,6 +7,7 @@ | |||
| 7 | #include <linux/types.h> | 7 | #include <linux/types.h> |
| 8 | #include <linux/serial.h> | 8 | #include <linux/serial.h> |
| 9 | #include <linux/platform_data/macb.h> | 9 | #include <linux/platform_data/macb.h> |
| 10 | #include <linux/platform_data/atmel_nand.h> | ||
| 10 | 11 | ||
| 11 | #define GPIO_PIN_NONE (-1) | 12 | #define GPIO_PIN_NONE (-1) |
| 12 | 13 | ||
| @@ -116,18 +117,6 @@ struct platform_device * | |||
| 116 | at32_add_device_cf(unsigned int id, unsigned int extint, | 117 | at32_add_device_cf(unsigned int id, unsigned int extint, |
| 117 | struct cf_platform_data *data); | 118 | struct cf_platform_data *data); |
| 118 | 119 | ||
| 119 | /* NAND / SmartMedia */ | ||
| 120 | struct atmel_nand_data { | ||
| 121 | int enable_pin; /* chip enable */ | ||
| 122 | int det_pin; /* card detect */ | ||
| 123 | int rdy_pin; /* ready/busy */ | ||
| 124 | u8 rdy_pin_active_low; /* rdy_pin value is inverted */ | ||
| 125 | u8 ale; /* address line number connected to ALE */ | ||
| 126 | u8 cle; /* address line number connected to CLE */ | ||
| 127 | u8 bus_width_16; /* buswidth is 16 bit */ | ||
| 128 | struct mtd_partition *parts; | ||
| 129 | unsigned int num_parts; | ||
| 130 | }; | ||
| 131 | struct platform_device * | 120 | struct platform_device * |
| 132 | at32_add_device_nand(unsigned int id, struct atmel_nand_data *data); | 121 | at32_add_device_nand(unsigned int id, struct atmel_nand_data *data); |
| 133 | 122 | ||
diff --git a/drivers/i2c/busses/i2c-gpio.c b/drivers/i2c/busses/i2c-gpio.c index a651779d9ff7..c0330a41db03 100644 --- a/drivers/i2c/busses/i2c-gpio.c +++ b/drivers/i2c/busses/i2c-gpio.c | |||
| @@ -14,8 +14,15 @@ | |||
| 14 | #include <linux/module.h> | 14 | #include <linux/module.h> |
| 15 | #include <linux/slab.h> | 15 | #include <linux/slab.h> |
| 16 | #include <linux/platform_device.h> | 16 | #include <linux/platform_device.h> |
| 17 | 17 | #include <linux/gpio.h> | |
| 18 | #include <asm/gpio.h> | 18 | #include <linux/of_gpio.h> |
| 19 | #include <linux/of_i2c.h> | ||
| 20 | |||
| 21 | struct i2c_gpio_private_data { | ||
| 22 | struct i2c_adapter adap; | ||
| 23 | struct i2c_algo_bit_data bit_data; | ||
| 24 | struct i2c_gpio_platform_data pdata; | ||
| 25 | }; | ||
| 19 | 26 | ||
| 20 | /* Toggle SDA by changing the direction of the pin */ | 27 | /* Toggle SDA by changing the direction of the pin */ |
| 21 | static void i2c_gpio_setsda_dir(void *data, int state) | 28 | static void i2c_gpio_setsda_dir(void *data, int state) |
| @@ -78,24 +85,62 @@ static int i2c_gpio_getscl(void *data) | |||
| 78 | return gpio_get_value(pdata->scl_pin); | 85 | return gpio_get_value(pdata->scl_pin); |
| 79 | } | 86 | } |
| 80 | 87 | ||
| 88 | static int __devinit of_i2c_gpio_probe(struct device_node *np, | ||
| 89 | struct i2c_gpio_platform_data *pdata) | ||
| 90 | { | ||
| 91 | u32 reg; | ||
| 92 | |||
| 93 | if (of_gpio_count(np) < 2) | ||
| 94 | return -ENODEV; | ||
| 95 | |||
| 96 | pdata->sda_pin = of_get_gpio(np, 0); | ||
| 97 | pdata->scl_pin = of_get_gpio(np, 1); | ||
| 98 | |||
| 99 | if (!gpio_is_valid(pdata->sda_pin) || !gpio_is_valid(pdata->scl_pin)) { | ||
| 100 | pr_err("%s: invalid GPIO pins, sda=%d/scl=%d\n", | ||
| 101 | np->full_name, pdata->sda_pin, pdata->scl_pin); | ||
| 102 | return -ENODEV; | ||
| 103 | } | ||
| 104 | |||
| 105 | of_property_read_u32(np, "i2c-gpio,delay-us", &pdata->udelay); | ||
| 106 | |||
| 107 | if (!of_property_read_u32(np, "i2c-gpio,timeout-ms", ®)) | ||
| 108 | pdata->timeout = msecs_to_jiffies(reg); | ||
| 109 | |||
| 110 | pdata->sda_is_open_drain = | ||
| 111 | of_property_read_bool(np, "i2c-gpio,sda-open-drain"); | ||
| 112 | pdata->scl_is_open_drain = | ||
| 113 | of_property_read_bool(np, "i2c-gpio,scl-open-drain"); | ||
| 114 | pdata->scl_is_output_only = | ||
| 115 | of_property_read_bool(np, "i2c-gpio,scl-output-only"); | ||
| 116 | |||
| 117 | return 0; | ||
| 118 | } | ||
| 119 | |||
| 81 | static int __devinit i2c_gpio_probe(struct platform_device *pdev) | 120 | static int __devinit i2c_gpio_probe(struct platform_device *pdev) |
| 82 | { | 121 | { |
| 122 | struct i2c_gpio_private_data *priv; | ||
| 83 | struct i2c_gpio_platform_data *pdata; | 123 | struct i2c_gpio_platform_data *pdata; |
| 84 | struct i2c_algo_bit_data *bit_data; | 124 | struct i2c_algo_bit_data *bit_data; |
| 85 | struct i2c_adapter *adap; | 125 | struct i2c_adapter *adap; |
| 86 | int ret; | 126 | int ret; |
| 87 | 127 | ||
| 88 | pdata = pdev->dev.platform_data; | 128 | priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); |
| 89 | if (!pdata) | 129 | if (!priv) |
| 90 | return -ENXIO; | 130 | return -ENOMEM; |
| 91 | 131 | adap = &priv->adap; | |
| 92 | ret = -ENOMEM; | 132 | bit_data = &priv->bit_data; |
| 93 | adap = kzalloc(sizeof(struct i2c_adapter), GFP_KERNEL); | 133 | pdata = &priv->pdata; |
| 94 | if (!adap) | 134 | |
| 95 | goto err_alloc_adap; | 135 | if (pdev->dev.of_node) { |
| 96 | bit_data = kzalloc(sizeof(struct i2c_algo_bit_data), GFP_KERNEL); | 136 | ret = of_i2c_gpio_probe(pdev->dev.of_node, pdata); |
| 97 | if (!bit_data) | 137 | if (ret) |
| 98 | goto err_alloc_bit_data; | 138 | return ret; |
| 139 | } else { | ||
| 140 | if (!pdev->dev.platform_data) | ||
| 141 | return -ENXIO; | ||
| 142 | memcpy(pdata, pdev->dev.platform_data, sizeof(*pdata)); | ||
| 143 | } | ||
| 99 | 144 | ||
| 100 | ret = gpio_request(pdata->sda_pin, "sda"); | 145 | ret = gpio_request(pdata->sda_pin, "sda"); |
| 101 | if (ret) | 146 | if (ret) |
| @@ -143,6 +188,7 @@ static int __devinit i2c_gpio_probe(struct platform_device *pdev) | |||
| 143 | adap->algo_data = bit_data; | 188 | adap->algo_data = bit_data; |
| 144 | adap->class = I2C_CLASS_HWMON | I2C_CLASS_SPD; | 189 | adap->class = I2C_CLASS_HWMON | I2C_CLASS_SPD; |
| 145 | adap->dev.parent = &pdev->dev; | 190 | adap->dev.parent = &pdev->dev; |
| 191 | adap->dev.of_node = pdev->dev.of_node; | ||
| 146 | 192 | ||
| 147 | /* | 193 | /* |
| 148 | * If "dev->id" is negative we consider it as zero. | 194 | * If "dev->id" is negative we consider it as zero. |
| @@ -154,7 +200,9 @@ static int __devinit i2c_gpio_probe(struct platform_device *pdev) | |||
| 154 | if (ret) | 200 | if (ret) |
| 155 | goto err_add_bus; | 201 | goto err_add_bus; |
| 156 | 202 | ||
| 157 | platform_set_drvdata(pdev, adap); | 203 | of_i2c_register_devices(adap); |
| 204 | |||
| 205 | platform_set_drvdata(pdev, priv); | ||
| 158 | 206 | ||
| 159 | dev_info(&pdev->dev, "using pins %u (SDA) and %u (SCL%s)\n", | 207 | dev_info(&pdev->dev, "using pins %u (SDA) and %u (SCL%s)\n", |
| 160 | pdata->sda_pin, pdata->scl_pin, | 208 | pdata->sda_pin, pdata->scl_pin, |
| @@ -168,34 +216,40 @@ err_add_bus: | |||
| 168 | err_request_scl: | 216 | err_request_scl: |
| 169 | gpio_free(pdata->sda_pin); | 217 | gpio_free(pdata->sda_pin); |
| 170 | err_request_sda: | 218 | err_request_sda: |
| 171 | kfree(bit_data); | ||
| 172 | err_alloc_bit_data: | ||
| 173 | kfree(adap); | ||
| 174 | err_alloc_adap: | ||
| 175 | return ret; | 219 | return ret; |
| 176 | } | 220 | } |
| 177 | 221 | ||
| 178 | static int __devexit i2c_gpio_remove(struct platform_device *pdev) | 222 | static int __devexit i2c_gpio_remove(struct platform_device *pdev) |
| 179 | { | 223 | { |
| 224 | struct i2c_gpio_private_data *priv; | ||
| 180 | struct i2c_gpio_platform_data *pdata; | 225 | struct i2c_gpio_platform_data *pdata; |
| 181 | struct i2c_adapter *adap; | 226 | struct i2c_adapter *adap; |
| 182 | 227 | ||
| 183 | adap = platform_get_drvdata(pdev); | 228 | priv = platform_get_drvdata(pdev); |
| 184 | pdata = pdev->dev.platform_data; | 229 | adap = &priv->adap; |
| 230 | pdata = &priv->pdata; | ||
| 185 | 231 | ||
| 186 | i2c_del_adapter(adap); | 232 | i2c_del_adapter(adap); |
| 187 | gpio_free(pdata->scl_pin); | 233 | gpio_free(pdata->scl_pin); |
| 188 | gpio_free(pdata->sda_pin); | 234 | gpio_free(pdata->sda_pin); |
| 189 | kfree(adap->algo_data); | ||
| 190 | kfree(adap); | ||
| 191 | 235 | ||
| 192 | return 0; | 236 | return 0; |
| 193 | } | 237 | } |
| 194 | 238 | ||
| 239 | #if defined(CONFIG_OF) | ||
| 240 | static const struct of_device_id i2c_gpio_dt_ids[] = { | ||
| 241 | { .compatible = "i2c-gpio", }, | ||
| 242 | { /* sentinel */ } | ||
| 243 | }; | ||
| 244 | |||
| 245 | MODULE_DEVICE_TABLE(of, i2c_gpio_dt_ids); | ||
| 246 | #endif | ||
| 247 | |||
| 195 | static struct platform_driver i2c_gpio_driver = { | 248 | static struct platform_driver i2c_gpio_driver = { |
| 196 | .driver = { | 249 | .driver = { |
| 197 | .name = "i2c-gpio", | 250 | .name = "i2c-gpio", |
| 198 | .owner = THIS_MODULE, | 251 | .owner = THIS_MODULE, |
| 252 | .of_match_table = of_match_ptr(i2c_gpio_dt_ids), | ||
| 199 | }, | 253 | }, |
| 200 | .probe = i2c_gpio_probe, | 254 | .probe = i2c_gpio_probe, |
| 201 | .remove = __devexit_p(i2c_gpio_remove), | 255 | .remove = __devexit_p(i2c_gpio_remove), |
diff --git a/drivers/mtd/nand/atmel_nand.c b/drivers/mtd/nand/atmel_nand.c index 35b4fb55dbd6..ae7e37d9ac17 100644 --- a/drivers/mtd/nand/atmel_nand.c +++ b/drivers/mtd/nand/atmel_nand.c | |||
| @@ -27,6 +27,10 @@ | |||
| 27 | #include <linux/module.h> | 27 | #include <linux/module.h> |
| 28 | #include <linux/moduleparam.h> | 28 | #include <linux/moduleparam.h> |
| 29 | #include <linux/platform_device.h> | 29 | #include <linux/platform_device.h> |
| 30 | #include <linux/of.h> | ||
| 31 | #include <linux/of_device.h> | ||
| 32 | #include <linux/of_gpio.h> | ||
| 33 | #include <linux/of_mtd.h> | ||
| 30 | #include <linux/mtd/mtd.h> | 34 | #include <linux/mtd/mtd.h> |
| 31 | #include <linux/mtd/nand.h> | 35 | #include <linux/mtd/nand.h> |
| 32 | #include <linux/mtd/partitions.h> | 36 | #include <linux/mtd/partitions.h> |
| @@ -34,22 +38,10 @@ | |||
| 34 | #include <linux/dmaengine.h> | 38 | #include <linux/dmaengine.h> |
| 35 | #include <linux/gpio.h> | 39 | #include <linux/gpio.h> |
| 36 | #include <linux/io.h> | 40 | #include <linux/io.h> |
| 41 | #include <linux/platform_data/atmel.h> | ||
| 37 | 42 | ||
| 38 | #include <mach/board.h> | ||
| 39 | #include <mach/cpu.h> | 43 | #include <mach/cpu.h> |
| 40 | 44 | ||
| 41 | #ifdef CONFIG_MTD_NAND_ATMEL_ECC_HW | ||
| 42 | #define hard_ecc 1 | ||
| 43 | #else | ||
| 44 | #define hard_ecc 0 | ||
| 45 | #endif | ||
| 46 | |||
| 47 | #ifdef CONFIG_MTD_NAND_ATMEL_ECC_NONE | ||
| 48 | #define no_ecc 1 | ||
| 49 | #else | ||
| 50 | #define no_ecc 0 | ||
| 51 | #endif | ||
| 52 | |||
| 53 | static int use_dma = 1; | 45 | static int use_dma = 1; |
| 54 | module_param(use_dma, int, 0); | 46 | module_param(use_dma, int, 0); |
| 55 | 47 | ||
| @@ -95,7 +87,7 @@ struct atmel_nand_host { | |||
| 95 | struct mtd_info mtd; | 87 | struct mtd_info mtd; |
| 96 | void __iomem *io_base; | 88 | void __iomem *io_base; |
| 97 | dma_addr_t io_phys; | 89 | dma_addr_t io_phys; |
| 98 | struct atmel_nand_data *board; | 90 | struct atmel_nand_data board; |
| 99 | struct device *dev; | 91 | struct device *dev; |
| 100 | void __iomem *ecc; | 92 | void __iomem *ecc; |
| 101 | 93 | ||
| @@ -113,8 +105,8 @@ static int cpu_has_dma(void) | |||
| 113 | */ | 105 | */ |
| 114 | static void atmel_nand_enable(struct atmel_nand_host *host) | 106 | static void atmel_nand_enable(struct atmel_nand_host *host) |
| 115 | { | 107 | { |
| 116 | if (gpio_is_valid(host->board->enable_pin)) | 108 | if (gpio_is_valid(host->board.enable_pin)) |
| 117 | gpio_set_value(host->board->enable_pin, 0); | 109 | gpio_set_value(host->board.enable_pin, 0); |
| 118 | } | 110 | } |
| 119 | 111 | ||
| 120 | /* | 112 | /* |
| @@ -122,8 +114,8 @@ static void atmel_nand_enable(struct atmel_nand_host *host) | |||
| 122 | */ | 114 | */ |
| 123 | static void atmel_nand_disable(struct atmel_nand_host *host) | 115 | static void atmel_nand_disable(struct atmel_nand_host *host) |
| 124 | { | 116 | { |
| 125 | if (gpio_is_valid(host->board->enable_pin)) | 117 | if (gpio_is_valid(host->board.enable_pin)) |
| 126 | gpio_set_value(host->board->enable_pin, 1); | 118 | gpio_set_value(host->board.enable_pin, 1); |
| 127 | } | 119 | } |
| 128 | 120 | ||
| 129 | /* | 121 | /* |
| @@ -144,9 +136,9 @@ static void atmel_nand_cmd_ctrl(struct mtd_info *mtd, int cmd, unsigned int ctrl | |||
| 144 | return; | 136 | return; |
| 145 | 137 | ||
| 146 | if (ctrl & NAND_CLE) | 138 | if (ctrl & NAND_CLE) |
| 147 | writeb(cmd, host->io_base + (1 << host->board->cle)); | 139 | writeb(cmd, host->io_base + (1 << host->board.cle)); |
| 148 | else | 140 | else |
| 149 | writeb(cmd, host->io_base + (1 << host->board->ale)); | 141 | writeb(cmd, host->io_base + (1 << host->board.ale)); |
| 150 | } | 142 | } |
| 151 | 143 | ||
| 152 | /* | 144 | /* |
| @@ -157,8 +149,8 @@ static int atmel_nand_device_ready(struct mtd_info *mtd) | |||
| 157 | struct nand_chip *nand_chip = mtd->priv; | 149 | struct nand_chip *nand_chip = mtd->priv; |
| 158 | struct atmel_nand_host *host = nand_chip->priv; | 150 | struct atmel_nand_host *host = nand_chip->priv; |
| 159 | 151 | ||
| 160 | return gpio_get_value(host->board->rdy_pin) ^ | 152 | return gpio_get_value(host->board.rdy_pin) ^ |
| 161 | !!host->board->rdy_pin_active_low; | 153 | !!host->board.rdy_pin_active_low; |
| 162 | } | 154 | } |
| 163 | 155 | ||
| 164 | /* | 156 | /* |
| @@ -273,7 +265,7 @@ static void atmel_read_buf(struct mtd_info *mtd, u8 *buf, int len) | |||
| 273 | if (atmel_nand_dma_op(mtd, buf, len, 1) == 0) | 265 | if (atmel_nand_dma_op(mtd, buf, len, 1) == 0) |
| 274 | return; | 266 | return; |
| 275 | 267 | ||
| 276 | if (host->board->bus_width_16) | 268 | if (host->board.bus_width_16) |
| 277 | atmel_read_buf16(mtd, buf, len); | 269 | atmel_read_buf16(mtd, buf, len); |
| 278 | else | 270 | else |
| 279 | atmel_read_buf8(mtd, buf, len); | 271 | atmel_read_buf8(mtd, buf, len); |
| @@ -289,7 +281,7 @@ static void atmel_write_buf(struct mtd_info *mtd, const u8 *buf, int len) | |||
| 289 | if (atmel_nand_dma_op(mtd, (void *)buf, len, 0) == 0) | 281 | if (atmel_nand_dma_op(mtd, (void *)buf, len, 0) == 0) |
| 290 | return; | 282 | return; |
| 291 | 283 | ||
| 292 | if (host->board->bus_width_16) | 284 | if (host->board.bus_width_16) |
| 293 | atmel_write_buf16(mtd, buf, len); | 285 | atmel_write_buf16(mtd, buf, len); |
| 294 | else | 286 | else |
| 295 | atmel_write_buf8(mtd, buf, len); | 287 | atmel_write_buf8(mtd, buf, len); |
| @@ -481,6 +473,56 @@ static void atmel_nand_hwctl(struct mtd_info *mtd, int mode) | |||
| 481 | } | 473 | } |
| 482 | } | 474 | } |
| 483 | 475 | ||
| 476 | #if defined(CONFIG_OF) | ||
| 477 | static int __devinit atmel_of_init_port(struct atmel_nand_host *host, | ||
| 478 | struct device_node *np) | ||
| 479 | { | ||
| 480 | u32 val; | ||
| 481 | int ecc_mode; | ||
| 482 | struct atmel_nand_data *board = &host->board; | ||
| 483 | enum of_gpio_flags flags; | ||
| 484 | |||
| 485 | if (of_property_read_u32(np, "atmel,nand-addr-offset", &val) == 0) { | ||
| 486 | if (val >= 32) { | ||
| 487 | dev_err(host->dev, "invalid addr-offset %u\n", val); | ||
| 488 | return -EINVAL; | ||
| 489 | } | ||
| 490 | board->ale = val; | ||
| 491 | } | ||
| 492 | |||
| 493 | if (of_property_read_u32(np, "atmel,nand-cmd-offset", &val) == 0) { | ||
| 494 | if (val >= 32) { | ||
| 495 | dev_err(host->dev, "invalid cmd-offset %u\n", val); | ||
| 496 | return -EINVAL; | ||
| 497 | } | ||
| 498 | board->cle = val; | ||
| 499 | } | ||
| 500 | |||
| 501 | ecc_mode = of_get_nand_ecc_mode(np); | ||
| 502 | |||
| 503 | board->ecc_mode = ecc_mode < 0 ? NAND_ECC_SOFT : ecc_mode; | ||
| 504 | |||
| 505 | board->on_flash_bbt = of_get_nand_on_flash_bbt(np); | ||
| 506 | |||
| 507 | if (of_get_nand_bus_width(np) == 16) | ||
| 508 | board->bus_width_16 = 1; | ||
| 509 | |||
| 510 | board->rdy_pin = of_get_gpio_flags(np, 0, &flags); | ||
| 511 | board->rdy_pin_active_low = (flags == OF_GPIO_ACTIVE_LOW); | ||
| 512 | |||
| 513 | board->enable_pin = of_get_gpio(np, 1); | ||
| 514 | board->det_pin = of_get_gpio(np, 2); | ||
| 515 | |||
| 516 | return 0; | ||
| 517 | } | ||
| 518 | #else | ||
| 519 | static int __devinit atmel_of_init_port(struct atmel_nand_host *host, | ||
| 520 | struct device_node *np) | ||
| 521 | { | ||
| 522 | return -EINVAL; | ||
| 523 | } | ||
| 524 | #endif | ||
| 525 | |||
| 484 | /* | 526 | /* |
| 485 | * Probe for the NAND device. | 527 | * Probe for the NAND device. |
| 486 | */ | 528 | */ |
| @@ -491,6 +533,7 @@ static int __init atmel_nand_probe(struct platform_device *pdev) | |||
| 491 | struct nand_chip *nand_chip; | 533 | struct nand_chip *nand_chip; |
| 492 | struct resource *regs; | 534 | struct resource *regs; |
| 493 | struct resource *mem; | 535 | struct resource *mem; |
| 536 | struct mtd_part_parser_data ppdata = {}; | ||
| 494 | int res; | 537 | int res; |
| 495 | 538 | ||
| 496 | mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 539 | mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| @@ -517,8 +560,15 @@ static int __init atmel_nand_probe(struct platform_device *pdev) | |||
| 517 | 560 | ||
| 518 | mtd = &host->mtd; | 561 | mtd = &host->mtd; |
| 519 | nand_chip = &host->nand_chip; | 562 | nand_chip = &host->nand_chip; |
| 520 | host->board = pdev->dev.platform_data; | ||
| 521 | host->dev = &pdev->dev; | 563 | host->dev = &pdev->dev; |
| 564 | if (pdev->dev.of_node) { | ||
| 565 | res = atmel_of_init_port(host, pdev->dev.of_node); | ||
| 566 | if (res) | ||
| 567 | goto err_nand_ioremap; | ||
| 568 | } else { | ||
| 569 | memcpy(&host->board, pdev->dev.platform_data, | ||
| 570 | sizeof(struct atmel_nand_data)); | ||
| 571 | } | ||
| 522 | 572 | ||
| 523 | nand_chip->priv = host; /* link the private data structures */ | 573 | nand_chip->priv = host; /* link the private data structures */ |
| 524 | mtd->priv = nand_chip; | 574 | mtd->priv = nand_chip; |
| @@ -529,26 +579,25 @@ static int __init atmel_nand_probe(struct platform_device *pdev) | |||
| 529 | nand_chip->IO_ADDR_W = host->io_base; | 579 | nand_chip->IO_ADDR_W = host->io_base; |
| 530 | nand_chip->cmd_ctrl = atmel_nand_cmd_ctrl; | 580 | nand_chip->cmd_ctrl = atmel_nand_cmd_ctrl; |
| 531 | 581 | ||
| 532 | if (gpio_is_valid(host->board->rdy_pin)) | 582 | if (gpio_is_valid(host->board.rdy_pin)) |
| 533 | nand_chip->dev_ready = atmel_nand_device_ready; | 583 | nand_chip->dev_ready = atmel_nand_device_ready; |
| 534 | 584 | ||
| 585 | nand_chip->ecc.mode = host->board.ecc_mode; | ||
| 586 | |||
| 535 | regs = platform_get_resource(pdev, IORESOURCE_MEM, 1); | 587 | regs = platform_get_resource(pdev, IORESOURCE_MEM, 1); |
| 536 | if (!regs && hard_ecc) { | 588 | if (!regs && nand_chip->ecc.mode == NAND_ECC_HW) { |
| 537 | printk(KERN_ERR "atmel_nand: can't get I/O resource " | 589 | printk(KERN_ERR "atmel_nand: can't get I/O resource " |
| 538 | "regs\nFalling back on software ECC\n"); | 590 | "regs\nFalling back on software ECC\n"); |
| 591 | nand_chip->ecc.mode = NAND_ECC_SOFT; | ||
| 539 | } | 592 | } |
| 540 | 593 | ||
| 541 | nand_chip->ecc.mode = NAND_ECC_SOFT; /* enable ECC */ | 594 | if (nand_chip->ecc.mode == NAND_ECC_HW) { |
| 542 | if (no_ecc) | ||
| 543 | nand_chip->ecc.mode = NAND_ECC_NONE; | ||
| 544 | if (hard_ecc && regs) { | ||
| 545 | host->ecc = ioremap(regs->start, resource_size(regs)); | 595 | host->ecc = ioremap(regs->start, resource_size(regs)); |
| 546 | if (host->ecc == NULL) { | 596 | if (host->ecc == NULL) { |
| 547 | printk(KERN_ERR "atmel_nand: ioremap failed\n"); | 597 | printk(KERN_ERR "atmel_nand: ioremap failed\n"); |
| 548 | res = -EIO; | 598 | res = -EIO; |
| 549 | goto err_ecc_ioremap; | 599 | goto err_ecc_ioremap; |
| 550 | } | 600 | } |
| 551 | nand_chip->ecc.mode = NAND_ECC_HW; | ||
| 552 | nand_chip->ecc.calculate = atmel_nand_calculate; | 601 | nand_chip->ecc.calculate = atmel_nand_calculate; |
| 553 | nand_chip->ecc.correct = atmel_nand_correct; | 602 | nand_chip->ecc.correct = atmel_nand_correct; |
| 554 | nand_chip->ecc.hwctl = atmel_nand_hwctl; | 603 | nand_chip->ecc.hwctl = atmel_nand_hwctl; |
| @@ -558,7 +607,7 @@ static int __init atmel_nand_probe(struct platform_device *pdev) | |||
| 558 | 607 | ||
| 559 | nand_chip->chip_delay = 20; /* 20us command delay time */ | 608 | nand_chip->chip_delay = 20; /* 20us command delay time */ |
| 560 | 609 | ||
| 561 | if (host->board->bus_width_16) /* 16-bit bus width */ | 610 | if (host->board.bus_width_16) /* 16-bit bus width */ |
| 562 | nand_chip->options |= NAND_BUSWIDTH_16; | 611 | nand_chip->options |= NAND_BUSWIDTH_16; |
| 563 | 612 | ||
| 564 | nand_chip->read_buf = atmel_read_buf; | 613 | nand_chip->read_buf = atmel_read_buf; |
| @@ -567,15 +616,15 @@ static int __init atmel_nand_probe(struct platform_device *pdev) | |||
| 567 | platform_set_drvdata(pdev, host); | 616 | platform_set_drvdata(pdev, host); |
| 568 | atmel_nand_enable(host); | 617 | atmel_nand_enable(host); |
| 569 | 618 | ||
| 570 | if (gpio_is_valid(host->board->det_pin)) { | 619 | if (gpio_is_valid(host->board.det_pin)) { |
| 571 | if (gpio_get_value(host->board->det_pin)) { | 620 | if (gpio_get_value(host->board.det_pin)) { |
| 572 | printk(KERN_INFO "No SmartMedia card inserted.\n"); | 621 | printk(KERN_INFO "No SmartMedia card inserted.\n"); |
| 573 | res = -ENXIO; | 622 | res = -ENXIO; |
| 574 | goto err_no_card; | 623 | goto err_no_card; |
| 575 | } | 624 | } |
| 576 | } | 625 | } |
| 577 | 626 | ||
| 578 | if (on_flash_bbt) { | 627 | if (host->board.on_flash_bbt || on_flash_bbt) { |
| 579 | printk(KERN_INFO "atmel_nand: Use On Flash BBT\n"); | 628 | printk(KERN_INFO "atmel_nand: Use On Flash BBT\n"); |
| 580 | nand_chip->bbt_options |= NAND_BBT_USE_FLASH; | 629 | nand_chip->bbt_options |= NAND_BBT_USE_FLASH; |
| 581 | } | 630 | } |
| @@ -650,8 +699,9 @@ static int __init atmel_nand_probe(struct platform_device *pdev) | |||
| 650 | } | 699 | } |
| 651 | 700 | ||
| 652 | mtd->name = "atmel_nand"; | 701 | mtd->name = "atmel_nand"; |
| 653 | res = mtd_device_parse_register(mtd, NULL, 0, | 702 | ppdata.of_node = pdev->dev.of_node; |
| 654 | host->board->parts, host->board->num_parts); | 703 | res = mtd_device_parse_register(mtd, NULL, &ppdata, |
| 704 | host->board.parts, host->board.num_parts); | ||
| 655 | if (!res) | 705 | if (!res) |
| 656 | return res; | 706 | return res; |
| 657 | 707 | ||
| @@ -695,11 +745,21 @@ static int __exit atmel_nand_remove(struct platform_device *pdev) | |||
| 695 | return 0; | 745 | return 0; |
| 696 | } | 746 | } |
| 697 | 747 | ||
| 748 | #if defined(CONFIG_OF) | ||
| 749 | static const struct of_device_id atmel_nand_dt_ids[] = { | ||
| 750 | { .compatible = "atmel,at91rm9200-nand" }, | ||
| 751 | { /* sentinel */ } | ||
| 752 | }; | ||
| 753 | |||
| 754 | MODULE_DEVICE_TABLE(of, atmel_nand_dt_ids); | ||
| 755 | #endif | ||
| 756 | |||
| 698 | static struct platform_driver atmel_nand_driver = { | 757 | static struct platform_driver atmel_nand_driver = { |
| 699 | .remove = __exit_p(atmel_nand_remove), | 758 | .remove = __exit_p(atmel_nand_remove), |
| 700 | .driver = { | 759 | .driver = { |
| 701 | .name = "atmel_nand", | 760 | .name = "atmel_nand", |
| 702 | .owner = THIS_MODULE, | 761 | .owner = THIS_MODULE, |
| 762 | .of_match_table = of_match_ptr(atmel_nand_dt_ids), | ||
| 703 | }, | 763 | }, |
| 704 | }; | 764 | }; |
| 705 | 765 | ||
diff --git a/drivers/of/Kconfig b/drivers/of/Kconfig index 6ea51dcbc728..8e84ce9765a9 100644 --- a/drivers/of/Kconfig +++ b/drivers/of/Kconfig | |||
| @@ -91,4 +91,8 @@ config OF_PCI_IRQ | |||
| 91 | help | 91 | help |
| 92 | OpenFirmware PCI IRQ routing helpers | 92 | OpenFirmware PCI IRQ routing helpers |
| 93 | 93 | ||
| 94 | config OF_MTD | ||
| 95 | depends on MTD | ||
| 96 | def_bool y | ||
| 97 | |||
| 94 | endmenu # OF | 98 | endmenu # OF |
diff --git a/drivers/of/Makefile b/drivers/of/Makefile index a73f5a51ff4c..aa90e602c8a7 100644 --- a/drivers/of/Makefile +++ b/drivers/of/Makefile | |||
| @@ -12,3 +12,4 @@ obj-$(CONFIG_OF_SELFTEST) += selftest.o | |||
| 12 | obj-$(CONFIG_OF_MDIO) += of_mdio.o | 12 | obj-$(CONFIG_OF_MDIO) += of_mdio.o |
| 13 | obj-$(CONFIG_OF_PCI) += of_pci.o | 13 | obj-$(CONFIG_OF_PCI) += of_pci.o |
| 14 | obj-$(CONFIG_OF_PCI_IRQ) += of_pci_irq.o | 14 | obj-$(CONFIG_OF_PCI_IRQ) += of_pci_irq.o |
| 15 | obj-$(CONFIG_OF_MTD) += of_mtd.o | ||
diff --git a/drivers/of/of_mtd.c b/drivers/of/of_mtd.c new file mode 100644 index 000000000000..e7cad627a5d1 --- /dev/null +++ b/drivers/of/of_mtd.c | |||
| @@ -0,0 +1,85 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2012 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> | ||
| 3 | * | ||
| 4 | * OF helpers for mtd. | ||
| 5 | * | ||
| 6 | * This file is released under the GPLv2 | ||
| 7 | * | ||
| 8 | */ | ||
| 9 | #include <linux/kernel.h> | ||
| 10 | #include <linux/of_mtd.h> | ||
| 11 | #include <linux/mtd/nand.h> | ||
| 12 | #include <linux/export.h> | ||
| 13 | |||
| 14 | /** | ||
| 15 | * It maps 'enum nand_ecc_modes_t' found in include/linux/mtd/nand.h | ||
| 16 | * into the device tree binding of 'nand-ecc', so that MTD | ||
| 17 | * device driver can get nand ecc from device tree. | ||
| 18 | */ | ||
| 19 | static const char *nand_ecc_modes[] = { | ||
| 20 | [NAND_ECC_NONE] = "none", | ||
| 21 | [NAND_ECC_SOFT] = "soft", | ||
| 22 | [NAND_ECC_HW] = "hw", | ||
| 23 | [NAND_ECC_HW_SYNDROME] = "hw_syndrome", | ||
| 24 | [NAND_ECC_HW_OOB_FIRST] = "hw_oob_first", | ||
| 25 | [NAND_ECC_SOFT_BCH] = "soft_bch", | ||
| 26 | }; | ||
| 27 | |||
| 28 | /** | ||
| 29 | * of_get_nand_ecc_mode - Get nand ecc mode for given device_node | ||
| 30 | * @np: Pointer to the given device_node | ||
| 31 | * | ||
| 32 | * The function gets ecc mode string from property 'nand-ecc-mode', | ||
| 33 | * and return its index in nand_ecc_modes table, or errno in error case. | ||
| 34 | */ | ||
| 35 | const int of_get_nand_ecc_mode(struct device_node *np) | ||
| 36 | { | ||
| 37 | const char *pm; | ||
| 38 | int err, i; | ||
| 39 | |||
| 40 | err = of_property_read_string(np, "nand-ecc-mode", &pm); | ||
| 41 | if (err < 0) | ||
| 42 | return err; | ||
| 43 | |||
| 44 | for (i = 0; i < ARRAY_SIZE(nand_ecc_modes); i++) | ||
| 45 | if (!strcasecmp(pm, nand_ecc_modes[i])) | ||
| 46 | return i; | ||
| 47 | |||
| 48 | return -ENODEV; | ||
| 49 | } | ||
| 50 | EXPORT_SYMBOL_GPL(of_get_nand_ecc_mode); | ||
| 51 | |||
| 52 | /** | ||
| 53 | * of_get_nand_bus_width - Get nand bus witdh for given device_node | ||
| 54 | * @np: Pointer to the given device_node | ||
| 55 | * | ||
| 56 | * return bus width option, or errno in error case. | ||
| 57 | */ | ||
| 58 | int of_get_nand_bus_width(struct device_node *np) | ||
| 59 | { | ||
| 60 | u32 val; | ||
| 61 | |||
| 62 | if (of_property_read_u32(np, "nand-bus-width", &val)) | ||
| 63 | return 8; | ||
| 64 | |||
| 65 | switch(val) { | ||
| 66 | case 8: | ||
| 67 | case 16: | ||
| 68 | return val; | ||
| 69 | default: | ||
| 70 | return -EIO; | ||
| 71 | } | ||
| 72 | } | ||
| 73 | EXPORT_SYMBOL_GPL(of_get_nand_bus_width); | ||
| 74 | |||
| 75 | /** | ||
| 76 | * of_get_nand_on_flash_bbt - Get nand on flash bbt for given device_node | ||
| 77 | * @np: Pointer to the given device_node | ||
| 78 | * | ||
| 79 | * return true if present false other wise | ||
| 80 | */ | ||
| 81 | bool of_get_nand_on_flash_bbt(struct device_node *np) | ||
| 82 | { | ||
| 83 | return of_property_read_bool(np, "nand-on-flash-bbt"); | ||
| 84 | } | ||
| 85 | EXPORT_SYMBOL_GPL(of_get_nand_on_flash_bbt); | ||
diff --git a/drivers/rtc/rtc-mv.c b/drivers/rtc/rtc-mv.c index 1300962486d1..b2185f4255aa 100644 --- a/drivers/rtc/rtc-mv.c +++ b/drivers/rtc/rtc-mv.c | |||
| @@ -12,6 +12,7 @@ | |||
| 12 | #include <linux/bcd.h> | 12 | #include <linux/bcd.h> |
| 13 | #include <linux/io.h> | 13 | #include <linux/io.h> |
| 14 | #include <linux/platform_device.h> | 14 | #include <linux/platform_device.h> |
| 15 | #include <linux/of.h> | ||
| 15 | #include <linux/delay.h> | 16 | #include <linux/delay.h> |
| 16 | #include <linux/gfp.h> | 17 | #include <linux/gfp.h> |
| 17 | #include <linux/module.h> | 18 | #include <linux/module.h> |
| @@ -294,11 +295,19 @@ static int __exit mv_rtc_remove(struct platform_device *pdev) | |||
| 294 | return 0; | 295 | return 0; |
| 295 | } | 296 | } |
| 296 | 297 | ||
| 298 | #ifdef CONFIG_OF | ||
| 299 | static struct of_device_id rtc_mv_of_match_table[] = { | ||
| 300 | { .compatible = "mrvl,orion-rtc", }, | ||
| 301 | {} | ||
| 302 | }; | ||
| 303 | #endif | ||
| 304 | |||
| 297 | static struct platform_driver mv_rtc_driver = { | 305 | static struct platform_driver mv_rtc_driver = { |
| 298 | .remove = __exit_p(mv_rtc_remove), | 306 | .remove = __exit_p(mv_rtc_remove), |
| 299 | .driver = { | 307 | .driver = { |
| 300 | .name = "rtc-mv", | 308 | .name = "rtc-mv", |
| 301 | .owner = THIS_MODULE, | 309 | .owner = THIS_MODULE, |
| 310 | .of_match_table = of_match_ptr(rtc_mv_of_match_table), | ||
| 302 | }, | 311 | }, |
| 303 | }; | 312 | }; |
| 304 | 313 | ||
diff --git a/drivers/spi/spi-orion.c b/drivers/spi/spi-orion.c index 13448c832c44..e496f799b7a9 100644 --- a/drivers/spi/spi-orion.c +++ b/drivers/spi/spi-orion.c | |||
| @@ -359,11 +359,6 @@ static int orion_spi_setup(struct spi_device *spi) | |||
| 359 | 359 | ||
| 360 | orion_spi = spi_master_get_devdata(spi->master); | 360 | orion_spi = spi_master_get_devdata(spi->master); |
| 361 | 361 | ||
| 362 | /* Fix ac timing if required. */ | ||
| 363 | if (orion_spi->spi_info->enable_clock_fix) | ||
| 364 | orion_spi_setbits(orion_spi, ORION_SPI_IF_CONFIG_REG, | ||
| 365 | (1 << 14)); | ||
| 366 | |||
| 367 | if ((spi->max_speed_hz == 0) | 362 | if ((spi->max_speed_hz == 0) |
| 368 | || (spi->max_speed_hz > orion_spi->max_speed)) | 363 | || (spi->max_speed_hz > orion_spi->max_speed)) |
| 369 | spi->max_speed_hz = orion_spi->max_speed; | 364 | spi->max_speed_hz = orion_spi->max_speed; |
diff --git a/drivers/staging/ste_rmi4/Makefile b/drivers/staging/ste_rmi4/Makefile index 176f46900571..e4c03351420f 100644 --- a/drivers/staging/ste_rmi4/Makefile +++ b/drivers/staging/ste_rmi4/Makefile | |||
| @@ -2,4 +2,4 @@ | |||
| 2 | # Makefile for the RMI4 touchscreen driver. | 2 | # Makefile for the RMI4 touchscreen driver. |
| 3 | # | 3 | # |
| 4 | obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_I2C_RMI4) += synaptics_i2c_rmi4.o | 4 | obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_I2C_RMI4) += synaptics_i2c_rmi4.o |
| 5 | obj-$(CONFIG_MACH_U8500) += board-mop500-u8500uib-rmi4.o | 5 | obj-$(CONFIG_MACH_MOP500) += board-mop500-u8500uib-rmi4.o |
diff --git a/drivers/usb/Kconfig b/drivers/usb/Kconfig index 48ac6e781ba2..cbd8f5f80596 100644 --- a/drivers/usb/Kconfig +++ b/drivers/usb/Kconfig | |||
| @@ -44,7 +44,7 @@ config USB_ARCH_HAS_EHCI | |||
| 44 | default y if PPC_MPC512x | 44 | default y if PPC_MPC512x |
| 45 | default y if ARCH_IXP4XX | 45 | default y if ARCH_IXP4XX |
| 46 | default y if ARCH_W90X900 | 46 | default y if ARCH_W90X900 |
| 47 | default y if ARCH_AT91SAM9G45 | 47 | default y if ARCH_AT91 |
| 48 | default y if ARCH_MXC | 48 | default y if ARCH_MXC |
| 49 | default y if ARCH_OMAP3 | 49 | default y if ARCH_OMAP3 |
| 50 | default y if ARCH_CNS3XXX | 50 | default y if ARCH_CNS3XXX |
diff --git a/drivers/usb/gadget/Kconfig b/drivers/usb/gadget/Kconfig index 26c0b75f152e..2633f7595116 100644 --- a/drivers/usb/gadget/Kconfig +++ b/drivers/usb/gadget/Kconfig | |||
| @@ -137,7 +137,7 @@ choice | |||
| 137 | 137 | ||
| 138 | config USB_AT91 | 138 | config USB_AT91 |
| 139 | tristate "Atmel AT91 USB Device Port" | 139 | tristate "Atmel AT91 USB Device Port" |
| 140 | depends on ARCH_AT91 && !ARCH_AT91SAM9RL && !ARCH_AT91SAM9G45 | 140 | depends on ARCH_AT91 |
| 141 | help | 141 | help |
| 142 | Many Atmel AT91 processors (such as the AT91RM2000) have a | 142 | Many Atmel AT91 processors (such as the AT91RM2000) have a |
| 143 | full speed USB Device Port with support for five configurable | 143 | full speed USB Device Port with support for five configurable |
diff --git a/drivers/usb/gadget/at91_udc.c b/drivers/usb/gadget/at91_udc.c index 2db5f68f7960..36fd2b4b49a2 100644 --- a/drivers/usb/gadget/at91_udc.c +++ b/drivers/usb/gadget/at91_udc.c | |||
| @@ -29,6 +29,8 @@ | |||
| 29 | #include <linux/clk.h> | 29 | #include <linux/clk.h> |
| 30 | #include <linux/usb/ch9.h> | 30 | #include <linux/usb/ch9.h> |
| 31 | #include <linux/usb/gadget.h> | 31 | #include <linux/usb/gadget.h> |
| 32 | #include <linux/of.h> | ||
| 33 | #include <linux/of_gpio.h> | ||
| 32 | 34 | ||
| 33 | #include <asm/byteorder.h> | 35 | #include <asm/byteorder.h> |
| 34 | #include <mach/hardware.h> | 36 | #include <mach/hardware.h> |
| @@ -1707,7 +1709,27 @@ static void at91udc_shutdown(struct platform_device *dev) | |||
| 1707 | spin_unlock_irqrestore(&udc->lock, flags); | 1709 | spin_unlock_irqrestore(&udc->lock, flags); |
| 1708 | } | 1710 | } |
| 1709 | 1711 | ||
| 1710 | static int __init at91udc_probe(struct platform_device *pdev) | 1712 | static void __devinit at91udc_of_init(struct at91_udc *udc, |
| 1713 | struct device_node *np) | ||
| 1714 | { | ||
| 1715 | struct at91_udc_data *board = &udc->board; | ||
| 1716 | u32 val; | ||
| 1717 | enum of_gpio_flags flags; | ||
| 1718 | |||
| 1719 | if (of_property_read_u32(np, "atmel,vbus-polled", &val) == 0) | ||
| 1720 | board->vbus_polled = 1; | ||
| 1721 | |||
| 1722 | board->vbus_pin = of_get_named_gpio_flags(np, "atmel,vbus-gpio", 0, | ||
| 1723 | &flags); | ||
| 1724 | board->vbus_active_low = (flags & OF_GPIO_ACTIVE_LOW) ? 1 : 0; | ||
| 1725 | |||
| 1726 | board->pullup_pin = of_get_named_gpio_flags(np, "atmel,pullup-gpio", 0, | ||
| 1727 | &flags); | ||
| 1728 | |||
| 1729 | board->pullup_active_low = (flags & OF_GPIO_ACTIVE_LOW) ? 1 : 0; | ||
| 1730 | } | ||
| 1731 | |||
| 1732 | static int __devinit at91udc_probe(struct platform_device *pdev) | ||
| 1711 | { | 1733 | { |
| 1712 | struct device *dev = &pdev->dev; | 1734 | struct device *dev = &pdev->dev; |
| 1713 | struct at91_udc *udc; | 1735 | struct at91_udc *udc; |
| @@ -1742,7 +1764,11 @@ static int __init at91udc_probe(struct platform_device *pdev) | |||
| 1742 | /* init software state */ | 1764 | /* init software state */ |
| 1743 | udc = &controller; | 1765 | udc = &controller; |
| 1744 | udc->gadget.dev.parent = dev; | 1766 | udc->gadget.dev.parent = dev; |
| 1745 | udc->board = *(struct at91_udc_data *) dev->platform_data; | 1767 | if (pdev->dev.of_node) |
| 1768 | at91udc_of_init(udc, pdev->dev.of_node); | ||
| 1769 | else | ||
| 1770 | memcpy(&udc->board, dev->platform_data, | ||
| 1771 | sizeof(struct at91_udc_data)); | ||
| 1746 | udc->pdev = pdev; | 1772 | udc->pdev = pdev; |
| 1747 | udc->enabled = 0; | 1773 | udc->enabled = 0; |
| 1748 | spin_lock_init(&udc->lock); | 1774 | spin_lock_init(&udc->lock); |
| @@ -1971,6 +1997,15 @@ static int at91udc_resume(struct platform_device *pdev) | |||
| 1971 | #define at91udc_resume NULL | 1997 | #define at91udc_resume NULL |
| 1972 | #endif | 1998 | #endif |
| 1973 | 1999 | ||
| 2000 | #if defined(CONFIG_OF) | ||
| 2001 | static const struct of_device_id at91_udc_dt_ids[] = { | ||
| 2002 | { .compatible = "atmel,at91rm9200-udc" }, | ||
| 2003 | { /* sentinel */ } | ||
| 2004 | }; | ||
| 2005 | |||
| 2006 | MODULE_DEVICE_TABLE(of, at91_udc_dt_ids); | ||
| 2007 | #endif | ||
| 2008 | |||
| 1974 | static struct platform_driver at91_udc_driver = { | 2009 | static struct platform_driver at91_udc_driver = { |
| 1975 | .remove = __exit_p(at91udc_remove), | 2010 | .remove = __exit_p(at91udc_remove), |
| 1976 | .shutdown = at91udc_shutdown, | 2011 | .shutdown = at91udc_shutdown, |
| @@ -1979,6 +2014,7 @@ static struct platform_driver at91_udc_driver = { | |||
| 1979 | .driver = { | 2014 | .driver = { |
| 1980 | .name = (char *) driver_name, | 2015 | .name = (char *) driver_name, |
| 1981 | .owner = THIS_MODULE, | 2016 | .owner = THIS_MODULE, |
| 2017 | .of_match_table = of_match_ptr(at91_udc_dt_ids), | ||
| 1982 | }, | 2018 | }, |
| 1983 | }; | 2019 | }; |
| 1984 | 2020 | ||
diff --git a/drivers/usb/host/ehci-atmel.c b/drivers/usb/host/ehci-atmel.c index a5a3ef1f0096..19f318ababa2 100644 --- a/drivers/usb/host/ehci-atmel.c +++ b/drivers/usb/host/ehci-atmel.c | |||
| @@ -13,6 +13,7 @@ | |||
| 13 | 13 | ||
| 14 | #include <linux/clk.h> | 14 | #include <linux/clk.h> |
| 15 | #include <linux/platform_device.h> | 15 | #include <linux/platform_device.h> |
| 16 | #include <linux/of_platform.h> | ||
| 16 | 17 | ||
| 17 | /* interface and function clocks */ | 18 | /* interface and function clocks */ |
| 18 | static struct clk *iclk, *fclk; | 19 | static struct clk *iclk, *fclk; |
| @@ -115,6 +116,8 @@ static const struct hc_driver ehci_atmel_hc_driver = { | |||
| 115 | .clear_tt_buffer_complete = ehci_clear_tt_buffer_complete, | 116 | .clear_tt_buffer_complete = ehci_clear_tt_buffer_complete, |
| 116 | }; | 117 | }; |
| 117 | 118 | ||
| 119 | static u64 at91_ehci_dma_mask = DMA_BIT_MASK(32); | ||
| 120 | |||
| 118 | static int __devinit ehci_atmel_drv_probe(struct platform_device *pdev) | 121 | static int __devinit ehci_atmel_drv_probe(struct platform_device *pdev) |
| 119 | { | 122 | { |
| 120 | struct usb_hcd *hcd; | 123 | struct usb_hcd *hcd; |
| @@ -137,6 +140,13 @@ static int __devinit ehci_atmel_drv_probe(struct platform_device *pdev) | |||
| 137 | goto fail_create_hcd; | 140 | goto fail_create_hcd; |
| 138 | } | 141 | } |
| 139 | 142 | ||
| 143 | /* Right now device-tree probed devices don't get dma_mask set. | ||
| 144 | * Since shared usb code relies on it, set it here for now. | ||
| 145 | * Once we have dma capability bindings this can go away. | ||
| 146 | */ | ||
| 147 | if (!pdev->dev.dma_mask) | ||
| 148 | pdev->dev.dma_mask = &at91_ehci_dma_mask; | ||
| 149 | |||
| 140 | hcd = usb_create_hcd(driver, &pdev->dev, dev_name(&pdev->dev)); | 150 | hcd = usb_create_hcd(driver, &pdev->dev, dev_name(&pdev->dev)); |
| 141 | if (!hcd) { | 151 | if (!hcd) { |
| 142 | retval = -ENOMEM; | 152 | retval = -ENOMEM; |
| @@ -225,9 +235,21 @@ static int __devexit ehci_atmel_drv_remove(struct platform_device *pdev) | |||
| 225 | return 0; | 235 | return 0; |
| 226 | } | 236 | } |
| 227 | 237 | ||
| 238 | #ifdef CONFIG_OF | ||
| 239 | static const struct of_device_id atmel_ehci_dt_ids[] = { | ||
| 240 | { .compatible = "atmel,at91sam9g45-ehci" }, | ||
| 241 | { /* sentinel */ } | ||
| 242 | }; | ||
| 243 | |||
| 244 | MODULE_DEVICE_TABLE(of, atmel_ehci_dt_ids); | ||
| 245 | #endif | ||
| 246 | |||
| 228 | static struct platform_driver ehci_atmel_driver = { | 247 | static struct platform_driver ehci_atmel_driver = { |
| 229 | .probe = ehci_atmel_drv_probe, | 248 | .probe = ehci_atmel_drv_probe, |
| 230 | .remove = __devexit_p(ehci_atmel_drv_remove), | 249 | .remove = __devexit_p(ehci_atmel_drv_remove), |
| 231 | .shutdown = usb_hcd_platform_shutdown, | 250 | .shutdown = usb_hcd_platform_shutdown, |
| 232 | .driver.name = "atmel-ehci", | 251 | .driver = { |
| 252 | .name = "atmel-ehci", | ||
| 253 | .of_match_table = of_match_ptr(atmel_ehci_dt_ids), | ||
| 254 | }, | ||
| 233 | }; | 255 | }; |
diff --git a/drivers/usb/host/ohci-at91.c b/drivers/usb/host/ohci-at91.c index 8e855eb0bf89..db8963f5fbce 100644 --- a/drivers/usb/host/ohci-at91.c +++ b/drivers/usb/host/ohci-at91.c | |||
| @@ -14,6 +14,8 @@ | |||
| 14 | 14 | ||
| 15 | #include <linux/clk.h> | 15 | #include <linux/clk.h> |
| 16 | #include <linux/platform_device.h> | 16 | #include <linux/platform_device.h> |
| 17 | #include <linux/of_platform.h> | ||
| 18 | #include <linux/of_gpio.h> | ||
| 17 | 19 | ||
| 18 | #include <mach/hardware.h> | 20 | #include <mach/hardware.h> |
| 19 | #include <asm/gpio.h> | 21 | #include <asm/gpio.h> |
| @@ -477,13 +479,109 @@ static irqreturn_t ohci_hcd_at91_overcurrent_irq(int irq, void *data) | |||
| 477 | return IRQ_HANDLED; | 479 | return IRQ_HANDLED; |
| 478 | } | 480 | } |
| 479 | 481 | ||
| 482 | #ifdef CONFIG_OF | ||
| 483 | static const struct of_device_id at91_ohci_dt_ids[] = { | ||
| 484 | { .compatible = "atmel,at91rm9200-ohci" }, | ||
| 485 | { /* sentinel */ } | ||
| 486 | }; | ||
| 487 | |||
| 488 | MODULE_DEVICE_TABLE(of, at91_ohci_dt_ids); | ||
| 489 | |||
| 490 | static u64 at91_ohci_dma_mask = DMA_BIT_MASK(32); | ||
| 491 | |||
| 492 | static int __devinit ohci_at91_of_init(struct platform_device *pdev) | ||
| 493 | { | ||
| 494 | struct device_node *np = pdev->dev.of_node; | ||
| 495 | int i, ret, gpio; | ||
| 496 | enum of_gpio_flags flags; | ||
| 497 | struct at91_usbh_data *pdata; | ||
| 498 | u32 ports; | ||
| 499 | |||
| 500 | if (!np) | ||
| 501 | return 0; | ||
| 502 | |||
| 503 | /* Right now device-tree probed devices don't get dma_mask set. | ||
| 504 | * Since shared usb code relies on it, set it here for now. | ||
| 505 | * Once we have dma capability bindings this can go away. | ||
| 506 | */ | ||
| 507 | if (!pdev->dev.dma_mask) | ||
| 508 | pdev->dev.dma_mask = &at91_ohci_dma_mask; | ||
| 509 | |||
| 510 | pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL); | ||
| 511 | if (!pdata) | ||
| 512 | return -ENOMEM; | ||
| 513 | |||
| 514 | if (!of_property_read_u32(np, "num-ports", &ports)) | ||
| 515 | pdata->ports = ports; | ||
| 516 | |||
| 517 | for (i = 0; i < 2; i++) { | ||
| 518 | gpio = of_get_named_gpio_flags(np, "atmel,vbus-gpio", i, &flags); | ||
| 519 | pdata->vbus_pin[i] = gpio; | ||
| 520 | if (!gpio_is_valid(gpio)) | ||
| 521 | continue; | ||
| 522 | pdata->vbus_pin_active_low[i] = flags & OF_GPIO_ACTIVE_LOW; | ||
| 523 | ret = gpio_request(gpio, "ohci_vbus"); | ||
| 524 | if (ret) { | ||
| 525 | dev_warn(&pdev->dev, "can't request vbus gpio %d", gpio); | ||
| 526 | continue; | ||
| 527 | } | ||
| 528 | ret = gpio_direction_output(gpio, !(flags & OF_GPIO_ACTIVE_LOW) ^ 1); | ||
| 529 | if (ret) | ||
| 530 | dev_warn(&pdev->dev, "can't put vbus gpio %d as output %d", | ||
| 531 | !(flags & OF_GPIO_ACTIVE_LOW) ^ 1, gpio); | ||
| 532 | } | ||
| 533 | |||
| 534 | for (i = 0; i < 2; i++) { | ||
| 535 | gpio = of_get_named_gpio_flags(np, "atmel,oc-gpio", i, &flags); | ||
| 536 | pdata->overcurrent_pin[i] = gpio; | ||
| 537 | if (!gpio_is_valid(gpio)) | ||
| 538 | continue; | ||
| 539 | ret = gpio_request(gpio, "ohci_overcurrent"); | ||
| 540 | if (ret) { | ||
| 541 | dev_err(&pdev->dev, "can't request overcurrent gpio %d", gpio); | ||
| 542 | continue; | ||
| 543 | } | ||
| 544 | |||
| 545 | ret = gpio_direction_input(gpio); | ||
| 546 | if (ret) { | ||
| 547 | dev_err(&pdev->dev, "can't configure overcurrent gpio %d as input", gpio); | ||
| 548 | continue; | ||
| 549 | } | ||
| 550 | |||
| 551 | ret = request_irq(gpio_to_irq(gpio), | ||
| 552 | ohci_hcd_at91_overcurrent_irq, | ||
| 553 | IRQF_SHARED, "ohci_overcurrent", pdev); | ||
| 554 | if (ret) { | ||
| 555 | gpio_free(gpio); | ||
| 556 | dev_warn(& pdev->dev, "cannot get GPIO IRQ for overcurrent\n"); | ||
| 557 | } | ||
| 558 | } | ||
| 559 | |||
| 560 | pdev->dev.platform_data = pdata; | ||
| 561 | |||
| 562 | return 0; | ||
| 563 | } | ||
| 564 | #else | ||
| 565 | static int __devinit ohci_at91_of_init(struct platform_device *pdev) | ||
| 566 | { | ||
| 567 | return 0; | ||
| 568 | } | ||
| 569 | #endif | ||
| 570 | |||
| 480 | /*-------------------------------------------------------------------------*/ | 571 | /*-------------------------------------------------------------------------*/ |
| 481 | 572 | ||
| 482 | static int ohci_hcd_at91_drv_probe(struct platform_device *pdev) | 573 | static int ohci_hcd_at91_drv_probe(struct platform_device *pdev) |
| 483 | { | 574 | { |
| 484 | struct at91_usbh_data *pdata = pdev->dev.platform_data; | 575 | struct at91_usbh_data *pdata; |
| 485 | int i; | 576 | int i; |
| 486 | 577 | ||
| 578 | i = ohci_at91_of_init(pdev); | ||
| 579 | |||
| 580 | if (i) | ||
| 581 | return i; | ||
| 582 | |||
| 583 | pdata = pdev->dev.platform_data; | ||
| 584 | |||
| 487 | if (pdata) { | 585 | if (pdata) { |
| 488 | for (i = 0; i < ARRAY_SIZE(pdata->vbus_pin); i++) { | 586 | for (i = 0; i < ARRAY_SIZE(pdata->vbus_pin); i++) { |
| 489 | if (!gpio_is_valid(pdata->vbus_pin[i])) | 587 | if (!gpio_is_valid(pdata->vbus_pin[i])) |
| @@ -596,5 +694,6 @@ static struct platform_driver ohci_hcd_at91_driver = { | |||
| 596 | .driver = { | 694 | .driver = { |
| 597 | .name = "at91_ohci", | 695 | .name = "at91_ohci", |
| 598 | .owner = THIS_MODULE, | 696 | .owner = THIS_MODULE, |
| 697 | .of_match_table = of_match_ptr(at91_ohci_dt_ids), | ||
| 599 | }, | 698 | }, |
| 600 | }; | 699 | }; |
diff --git a/drivers/watchdog/orion_wdt.c b/drivers/watchdog/orion_wdt.c index 4ad78f868515..1368e4ca3100 100644 --- a/drivers/watchdog/orion_wdt.c +++ b/drivers/watchdog/orion_wdt.c | |||
| @@ -28,9 +28,9 @@ | |||
| 28 | /* | 28 | /* |
| 29 | * Watchdog timer block registers. | 29 | * Watchdog timer block registers. |
| 30 | */ | 30 | */ |
| 31 | #define TIMER_CTRL (TIMER_VIRT_BASE + 0x0000) | 31 | #define TIMER_CTRL 0x0000 |
| 32 | #define WDT_EN 0x0010 | 32 | #define WDT_EN 0x0010 |
| 33 | #define WDT_VAL (TIMER_VIRT_BASE + 0x0024) | 33 | #define WDT_VAL 0x0024 |
| 34 | 34 | ||
| 35 | #define WDT_MAX_CYCLE_COUNT 0xffffffff | 35 | #define WDT_MAX_CYCLE_COUNT 0xffffffff |
| 36 | #define WDT_IN_USE 0 | 36 | #define WDT_IN_USE 0 |
| @@ -40,6 +40,7 @@ static int nowayout = WATCHDOG_NOWAYOUT; | |||
| 40 | static int heartbeat = -1; /* module parameter (seconds) */ | 40 | static int heartbeat = -1; /* module parameter (seconds) */ |
| 41 | static unsigned int wdt_max_duration; /* (seconds) */ | 41 | static unsigned int wdt_max_duration; /* (seconds) */ |
| 42 | static unsigned int wdt_tclk; | 42 | static unsigned int wdt_tclk; |
| 43 | static void __iomem *wdt_reg; | ||
| 43 | static unsigned long wdt_status; | 44 | static unsigned long wdt_status; |
| 44 | static DEFINE_SPINLOCK(wdt_lock); | 45 | static DEFINE_SPINLOCK(wdt_lock); |
| 45 | 46 | ||
| @@ -48,7 +49,7 @@ static void orion_wdt_ping(void) | |||
| 48 | spin_lock(&wdt_lock); | 49 | spin_lock(&wdt_lock); |
| 49 | 50 | ||
| 50 | /* Reload watchdog duration */ | 51 | /* Reload watchdog duration */ |
| 51 | writel(wdt_tclk * heartbeat, WDT_VAL); | 52 | writel(wdt_tclk * heartbeat, wdt_reg + WDT_VAL); |
| 52 | 53 | ||
| 53 | spin_unlock(&wdt_lock); | 54 | spin_unlock(&wdt_lock); |
| 54 | } | 55 | } |
| @@ -60,7 +61,7 @@ static void orion_wdt_enable(void) | |||
| 60 | spin_lock(&wdt_lock); | 61 | spin_lock(&wdt_lock); |
| 61 | 62 | ||
| 62 | /* Set watchdog duration */ | 63 | /* Set watchdog duration */ |
| 63 | writel(wdt_tclk * heartbeat, WDT_VAL); | 64 | writel(wdt_tclk * heartbeat, wdt_reg + WDT_VAL); |
| 64 | 65 | ||
| 65 | /* Clear watchdog timer interrupt */ | 66 | /* Clear watchdog timer interrupt */ |
| 66 | reg = readl(BRIDGE_CAUSE); | 67 | reg = readl(BRIDGE_CAUSE); |
| @@ -68,9 +69,9 @@ static void orion_wdt_enable(void) | |||
| 68 | writel(reg, BRIDGE_CAUSE); | 69 | writel(reg, BRIDGE_CAUSE); |
| 69 | 70 | ||
| 70 | /* Enable watchdog timer */ | 71 | /* Enable watchdog timer */ |
| 71 | reg = readl(TIMER_CTRL); | 72 | reg = readl(wdt_reg + TIMER_CTRL); |
| 72 | reg |= WDT_EN; | 73 | reg |= WDT_EN; |
| 73 | writel(reg, TIMER_CTRL); | 74 | writel(reg, wdt_reg + TIMER_CTRL); |
| 74 | 75 | ||
| 75 | /* Enable reset on watchdog */ | 76 | /* Enable reset on watchdog */ |
| 76 | reg = readl(RSTOUTn_MASK); | 77 | reg = readl(RSTOUTn_MASK); |
| @@ -92,9 +93,9 @@ static void orion_wdt_disable(void) | |||
| 92 | writel(reg, RSTOUTn_MASK); | 93 | writel(reg, RSTOUTn_MASK); |
| 93 | 94 | ||
| 94 | /* Disable watchdog timer */ | 95 | /* Disable watchdog timer */ |
| 95 | reg = readl(TIMER_CTRL); | 96 | reg = readl(wdt_reg + TIMER_CTRL); |
| 96 | reg &= ~WDT_EN; | 97 | reg &= ~WDT_EN; |
| 97 | writel(reg, TIMER_CTRL); | 98 | writel(reg, wdt_reg + TIMER_CTRL); |
| 98 | 99 | ||
| 99 | spin_unlock(&wdt_lock); | 100 | spin_unlock(&wdt_lock); |
| 100 | } | 101 | } |
| @@ -102,7 +103,7 @@ static void orion_wdt_disable(void) | |||
| 102 | static int orion_wdt_get_timeleft(int *time_left) | 103 | static int orion_wdt_get_timeleft(int *time_left) |
| 103 | { | 104 | { |
| 104 | spin_lock(&wdt_lock); | 105 | spin_lock(&wdt_lock); |
| 105 | *time_left = readl(WDT_VAL) / wdt_tclk; | 106 | *time_left = readl(wdt_reg + WDT_VAL) / wdt_tclk; |
| 106 | spin_unlock(&wdt_lock); | 107 | spin_unlock(&wdt_lock); |
| 107 | return 0; | 108 | return 0; |
| 108 | } | 109 | } |
| @@ -236,6 +237,7 @@ static struct miscdevice orion_wdt_miscdev = { | |||
| 236 | static int __devinit orion_wdt_probe(struct platform_device *pdev) | 237 | static int __devinit orion_wdt_probe(struct platform_device *pdev) |
| 237 | { | 238 | { |
| 238 | struct orion_wdt_platform_data *pdata = pdev->dev.platform_data; | 239 | struct orion_wdt_platform_data *pdata = pdev->dev.platform_data; |
| 240 | struct resource *res; | ||
| 239 | int ret; | 241 | int ret; |
| 240 | 242 | ||
| 241 | if (pdata) { | 243 | if (pdata) { |
| @@ -245,6 +247,10 @@ static int __devinit orion_wdt_probe(struct platform_device *pdev) | |||
| 245 | return -ENODEV; | 247 | return -ENODEV; |
| 246 | } | 248 | } |
| 247 | 249 | ||
| 250 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
| 251 | |||
| 252 | wdt_reg = ioremap(res->start, resource_size(res)); | ||
| 253 | |||
| 248 | if (orion_wdt_miscdev.parent) | 254 | if (orion_wdt_miscdev.parent) |
| 249 | return -EBUSY; | 255 | return -EBUSY; |
| 250 | orion_wdt_miscdev.parent = &pdev->dev; | 256 | orion_wdt_miscdev.parent = &pdev->dev; |
diff --git a/include/linux/of.h b/include/linux/of.h index d46a18ffbebb..ba5d8494f2e1 100644 --- a/include/linux/of.h +++ b/include/linux/of.h | |||
| @@ -361,6 +361,22 @@ static inline int of_machine_is_compatible(const char *compat) | |||
| 361 | #define of_match_node(_matches, _node) NULL | 361 | #define of_match_node(_matches, _node) NULL |
| 362 | #endif /* CONFIG_OF */ | 362 | #endif /* CONFIG_OF */ |
| 363 | 363 | ||
| 364 | /** | ||
| 365 | * of_property_read_bool - Findfrom a property | ||
| 366 | * @np: device node from which the property value is to be read. | ||
| 367 | * @propname: name of the property to be searched. | ||
| 368 | * | ||
| 369 | * Search for a property in a device node. | ||
| 370 | * Returns true if the property exist false otherwise. | ||
| 371 | */ | ||
| 372 | static inline bool of_property_read_bool(const struct device_node *np, | ||
| 373 | const char *propname) | ||
| 374 | { | ||
| 375 | struct property *prop = of_find_property(np, propname, NULL); | ||
| 376 | |||
| 377 | return prop ? true : false; | ||
| 378 | } | ||
| 379 | |||
| 364 | static inline int of_property_read_u32(const struct device_node *np, | 380 | static inline int of_property_read_u32(const struct device_node *np, |
| 365 | const char *propname, | 381 | const char *propname, |
| 366 | u32 *out_value) | 382 | u32 *out_value) |
diff --git a/include/linux/of_mtd.h b/include/linux/of_mtd.h new file mode 100644 index 000000000000..bae1b6094c63 --- /dev/null +++ b/include/linux/of_mtd.h | |||
| @@ -0,0 +1,19 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2012 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> | ||
| 3 | * | ||
| 4 | * OF helpers for mtd. | ||
| 5 | * | ||
| 6 | * This file is released under the GPLv2 | ||
| 7 | */ | ||
| 8 | |||
| 9 | #ifndef __LINUX_OF_MTD_H | ||
| 10 | #define __LINUX_OF_NET_H | ||
| 11 | |||
| 12 | #ifdef CONFIG_OF_MTD | ||
| 13 | #include <linux/of.h> | ||
| 14 | extern const int of_get_nand_ecc_mode(struct device_node *np); | ||
| 15 | int of_get_nand_bus_width(struct device_node *np); | ||
| 16 | bool of_get_nand_on_flash_bbt(struct device_node *np); | ||
| 17 | #endif | ||
| 18 | |||
| 19 | #endif /* __LINUX_OF_MTD_H */ | ||
diff --git a/include/linux/platform_data/atmel.h b/include/linux/platform_data/atmel.h new file mode 100644 index 000000000000..d056263545b1 --- /dev/null +++ b/include/linux/platform_data/atmel.h | |||
| @@ -0,0 +1,27 @@ | |||
| 1 | /* | ||
| 2 | * atmel platform data | ||
| 3 | * | ||
| 4 | * GPL v2 Only | ||
| 5 | */ | ||
| 6 | |||
| 7 | #ifndef __ATMEL_NAND_H__ | ||
| 8 | #define __ATMEL_NAND_H__ | ||
| 9 | |||
| 10 | #include <linux/mtd/nand.h> | ||
| 11 | |||
| 12 | /* NAND / SmartMedia */ | ||
| 13 | struct atmel_nand_data { | ||
| 14 | int enable_pin; /* chip enable */ | ||
| 15 | int det_pin; /* card detect */ | ||
| 16 | int rdy_pin; /* ready/busy */ | ||
| 17 | u8 rdy_pin_active_low; /* rdy_pin value is inverted */ | ||
| 18 | u8 ale; /* address line number connected to ALE */ | ||
| 19 | u8 cle; /* address line number connected to CLE */ | ||
| 20 | u8 bus_width_16; /* buswidth is 16 bit */ | ||
| 21 | u8 ecc_mode; /* ecc mode */ | ||
| 22 | u8 on_flash_bbt; /* bbt on flash */ | ||
| 23 | struct mtd_partition *parts; | ||
| 24 | unsigned int num_parts; | ||
| 25 | }; | ||
| 26 | |||
| 27 | #endif /* __ATMEL_NAND_H__ */ | ||
diff --git a/include/linux/spi/orion_spi.h b/include/linux/spi/orion_spi.h index decf6d8c77b7..b4d9fa6f797c 100644 --- a/include/linux/spi/orion_spi.h +++ b/include/linux/spi/orion_spi.h | |||
| @@ -11,7 +11,6 @@ | |||
| 11 | 11 | ||
| 12 | struct orion_spi_info { | 12 | struct orion_spi_info { |
| 13 | u32 tclk; /* no <linux/clk.h> support yet */ | 13 | u32 tclk; /* no <linux/clk.h> support yet */ |
| 14 | u32 enable_clock_fix; | ||
| 15 | }; | 14 | }; |
| 16 | 15 | ||
| 17 | 16 | ||
