mirror of
https://github.com/followmsi/android_kernel_google_msm.git
synced 2024-11-06 23:17:41 +00:00
ARM: More device tree support updates
This branch contains a number of updates for device tree support on several ARM platforms, in particular: * AT91 continues the device tree conversion adding support for a number of on-chip drivers and other functionality * ux500 adds probing of some of the core SoC blocks through device tree * Initial device tree support for ST SPEAr600 platforms * kirkwood continues the conversion to device-tree probing -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) iQIcBAABAgAGBQJPcp12AAoJEIwa5zzehBx3c2oQAKkHhJFxYFaUSfAqUNQJtyLP ntNyjANchckGcmoGFRRn5q17leSW+GsPopeJF0uTSOq5xojrQJJnrfKCQmgTtdzt KiD9qJqF3bsM5PxdjkeQljiAirPZSKvyA6gZaPKozZb+NMk3ZMd3hYYi3j3EWR/c 8C9HzwyuXUOKOQ1tHuQHEYnLAtcdVTpUnDGsQItD2Shw5H+AcoN1T00z6kWtXYoJ z/sFtBVvPxqozEEWbTEg2vm0XfT2ENlOIfHoOj+G2EfcVTjh4pSoD0TXwS11vjfX UEniGsdCSkQn0yKVuuLTNKy7BPkWXBUTxy6duIQMSs/57lgFEb9/+f5kgAol+Sdi OeUW4gYkZ8uAk2zOD4p1TGDZT/YHWQ2X3Wq2EhYNsYjZgbNCTlIIocet8jZ6Zfcm f7DdADS8ot8xFcZxMH7CFJ28cmEjhyGMSrMcrAq7HXrkX0ppFutF0CYkY/43uQ/h AGmP9wKi38PB1eXK44eAF25fRvT7ty7CiCBT88i8UZ3unj6raVbsGfqhvf5PbCki oX8dKFjPRRE4bj+8Si7LCTR00AIFMLxuftJw45L4syk+l6Y0y+b0HMBE3E/q7bbR dLBu3V/HHVMnuZv6vVgvI+dkZ9R6v2ychfoyKNh/AKvgXmr90diYbT0XAkcfSPk7 +yy69EZA59UvLTxt9BmN =wiKV -----END PGP SIGNATURE----- Merge tag 'dt2' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc Pull "ARM: More device tree support updates" from Olof Johansson: "This branch contains a number of updates for device tree support on several ARM platforms, in particular: * AT91 continues the device tree conversion adding support for a number of on-chip drivers and other functionality * ux500 adds probing of some of the core SoC blocks through device tree * Initial device tree support for ST SPEAr600 platforms * kirkwood continues the conversion to device-tree probing" Manually merge arch/arm/mach-ux500/Kconfig due to MACH_U8500 rename, and drivers/usb/gadget/at91_udc.c due to header file include cleanups. Also do an "evil merge" for the MACH_U8500 config option rename that the affected RMI4 touchscreen driver in staging. It's called MACH_MOP500 now, and it was missed during previous merges. * tag 'dt2' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc: (48 commits) ARM: SPEAr600: Add device-tree support to SPEAr600 boards ARM: ux500: Provide local timer support for Device Tree ARM: ux500: Enable PL022 SSP Controller in Device Tree ARM: ux500: Enable PL310 Level 2 Cache Controller in Device Tree ARM: ux500: Enable PL011 AMBA UART Controller for Device Tree ARM: ux500: Enable Cortex-A9 GIC (Generic Interrupt Controller) in Device Tree ARM: ux500: db8500: list most devices in the snowball device tree ARM: ux500: split dts file for snowball into generic part ARM: ux500: combine the board init functions for DT boot ARM: ux500: Initial Device Tree support for Snowball ARM: ux500: CONFIG: Enable Device Tree support for future endeavours ARM: kirkwood: use devicetree for rtc-mv ARM: kirkwood: rtc-mv devicetree bindings ARM: kirkwood: fdt: define uart[01] as disabled, enable uart0 ARM: kirkwood: fdt: facilitate new boards during fdt migration ARM: kirkwood: fdt: absorb kirkwood_init() ARM: kirkwood: fdt: use mrvl ticker symbol ARM: orion: wdt: use resource vice direct access ARM: Kirkwood: Remove tclk from kirkwood_asoc_platform_data. ARM: orion: spi: remove enable_clock_fix which is not used ...
This commit is contained in:
commit
09893ee845
96 changed files with 2539 additions and 558 deletions
|
@ -30,3 +30,63 @@ One interrupt per TC channel in a TC block:
|
|||
reg = <0xfffdc000 0x100>;
|
||||
interrupts = <26 4 27 4 28 4>;
|
||||
};
|
||||
|
||||
RSTC Reset Controller required properties:
|
||||
- compatible: Should be "atmel,<chip>-rstc".
|
||||
<chip> can be "at91sam9260" or "at91sam9g45"
|
||||
- reg: Should contain registers location and length
|
||||
|
||||
Example:
|
||||
|
||||
rstc@fffffd00 {
|
||||
compatible = "atmel,at91sam9260-rstc";
|
||||
reg = <0xfffffd00 0x10>;
|
||||
};
|
||||
|
||||
RAMC SDRAM/DDR Controller required properties:
|
||||
- compatible: Should be "atmel,at91sam9260-sdramc",
|
||||
"atmel,at91sam9g45-ddramc",
|
||||
- reg: Should contain registers location and length
|
||||
For at91sam9263 and at91sam9g45 you must specify 2 entries.
|
||||
|
||||
Examples:
|
||||
|
||||
ramc0: ramc@ffffe800 {
|
||||
compatible = "atmel,at91sam9g45-ddramc";
|
||||
reg = <0xffffe800 0x200>;
|
||||
};
|
||||
|
||||
ramc0: ramc@ffffe400 {
|
||||
compatible = "atmel,at91sam9g45-ddramc";
|
||||
reg = <0xffffe400 0x200
|
||||
0xffffe600 0x200>;
|
||||
};
|
||||
|
||||
SHDWC Shutdown Controller
|
||||
|
||||
required properties:
|
||||
- compatible: Should be "atmel,<chip>-shdwc".
|
||||
<chip> can be "at91sam9260", "at91sam9rl" or "at91sam9x5".
|
||||
- reg: Should contain registers location and length
|
||||
|
||||
optional properties:
|
||||
- atmel,wakeup-mode: String, operation mode of the wakeup mode.
|
||||
Supported values are: "none", "high", "low", "any".
|
||||
- atmel,wakeup-counter: Counter on Wake-up 0 (between 0x0 and 0xf).
|
||||
|
||||
optional at91sam9260 properties:
|
||||
- atmel,wakeup-rtt-timer: boolean to enable Real-time Timer Wake-up.
|
||||
|
||||
optional at91sam9rl properties:
|
||||
- atmel,wakeup-rtc-timer: boolean to enable Real-time Clock Wake-up.
|
||||
- atmel,wakeup-rtt-timer: boolean to enable Real-time Timer Wake-up.
|
||||
|
||||
optional at91sam9x5 properties:
|
||||
- atmel,wakeup-rtc-timer: boolean to enable Real-time Clock Wake-up.
|
||||
|
||||
Example:
|
||||
|
||||
rstc@fffffd00 {
|
||||
compatible = "atmel,at91sam9260-rstc";
|
||||
reg = <0xfffffd00 0x10>;
|
||||
};
|
||||
|
|
11
Documentation/devicetree/bindings/arm/atmel-pmc.txt
Normal file
11
Documentation/devicetree/bindings/arm/atmel-pmc.txt
Normal file
|
@ -0,0 +1,11 @@
|
|||
* Power Management Controller (PMC)
|
||||
|
||||
Required properties:
|
||||
- compatible: Should be "atmel,at91rm9200-pmc"
|
||||
- reg: Should contain PMC registers location and length
|
||||
|
||||
Examples:
|
||||
pmc: pmc@fffffc00 {
|
||||
compatible = "atmel,at91rm9200-pmc";
|
||||
reg = <0xfffffc00 0x100>;
|
||||
};
|
8
Documentation/devicetree/bindings/arm/spear.txt
Normal file
8
Documentation/devicetree/bindings/arm/spear.txt
Normal file
|
@ -0,0 +1,8 @@
|
|||
ST SPEAr Platforms Device Tree Bindings
|
||||
---------------------------------------
|
||||
|
||||
Boards with the ST SPEAr600 SoC shall have the following properties:
|
||||
|
||||
Required root node property:
|
||||
|
||||
compatible = "st,spear600";
|
32
Documentation/devicetree/bindings/gpio/gpio_i2c.txt
Normal file
32
Documentation/devicetree/bindings/gpio/gpio_i2c.txt
Normal file
|
@ -0,0 +1,32 @@
|
|||
Device-Tree bindings for i2c gpio driver
|
||||
|
||||
Required properties:
|
||||
- compatible = "i2c-gpio";
|
||||
- gpios: sda and scl gpio
|
||||
|
||||
|
||||
Optional properties:
|
||||
- i2c-gpio,sda-open-drain: sda as open drain
|
||||
- i2c-gpio,scl-open-drain: scl as open drain
|
||||
- i2c-gpio,scl-output-only: scl as output only
|
||||
- i2c-gpio,delay-us: delay between GPIO operations (may depend on each platform)
|
||||
- i2c-gpio,timeout-ms: timeout to get data
|
||||
|
||||
Example nodes:
|
||||
|
||||
i2c@0 {
|
||||
compatible = "i2c-gpio";
|
||||
gpios = <&pioA 23 0 /* sda */
|
||||
&pioA 24 0 /* scl */
|
||||
>;
|
||||
i2c-gpio,sda-open-drain;
|
||||
i2c-gpio,scl-open-drain;
|
||||
i2c-gpio,delay-us = <2>; /* ~100 kHz */
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
rv3029c2@56 {
|
||||
compatible = "rv3029c2";
|
||||
reg = <0x56>;
|
||||
};
|
||||
};
|
41
Documentation/devicetree/bindings/mtd/atmel-nand.txt
Normal file
41
Documentation/devicetree/bindings/mtd/atmel-nand.txt
Normal file
|
@ -0,0 +1,41 @@
|
|||
Atmel NAND flash
|
||||
|
||||
Required properties:
|
||||
- compatible : "atmel,at91rm9200-nand".
|
||||
- reg : should specify localbus address and size used for the chip,
|
||||
and if availlable the ECC.
|
||||
- atmel,nand-addr-offset : offset for the address latch.
|
||||
- atmel,nand-cmd-offset : offset for the command latch.
|
||||
- #address-cells, #size-cells : Must be present if the device has sub-nodes
|
||||
representing partitions.
|
||||
|
||||
- gpios : specifies the gpio pins to control the NAND device. detect is an
|
||||
optional gpio and may be set to 0 if not present.
|
||||
|
||||
Optional properties:
|
||||
- nand-ecc-mode : String, operation mode of the NAND ecc mode, soft by default.
|
||||
Supported values are: "none", "soft", "hw", "hw_syndrome", "hw_oob_first",
|
||||
"soft_bch".
|
||||
- nand-bus-width : 8 or 16 bus width if not present 8
|
||||
- nand-on-flash-bbt: boolean to enable on flash bbt option if not present false
|
||||
|
||||
Examples:
|
||||
nand0: nand@40000000,0 {
|
||||
compatible = "atmel,at91rm9200-nand";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
reg = <0x40000000 0x10000000
|
||||
0xffffe800 0x200
|
||||
>;
|
||||
atmel,nand-addr-offset = <21>;
|
||||
atmel,nand-cmd-offset = <22>;
|
||||
nand-on-flash-bbt;
|
||||
nand-ecc-mode = "soft";
|
||||
gpios = <&pioC 13 0
|
||||
&pioC 14 0
|
||||
0
|
||||
>;
|
||||
partition@0 {
|
||||
...
|
||||
};
|
||||
};
|
7
Documentation/devicetree/bindings/mtd/nand.txt
Normal file
7
Documentation/devicetree/bindings/mtd/nand.txt
Normal file
|
@ -0,0 +1,7 @@
|
|||
* MTD generic binding
|
||||
|
||||
- nand-ecc-mode : String, operation mode of the NAND ecc mode.
|
||||
Supported values are: "none", "soft", "hw", "hw_syndrome", "hw_oob_first",
|
||||
"soft_bch".
|
||||
- nand-bus-width : 8 or 16 bus width if not present 8
|
||||
- nand-on-flash-bbt: boolean to enable on flash bbt option if not present false
|
49
Documentation/devicetree/bindings/usb/atmel-usb.txt
Normal file
49
Documentation/devicetree/bindings/usb/atmel-usb.txt
Normal file
|
@ -0,0 +1,49 @@
|
|||
Atmel SOC USB controllers
|
||||
|
||||
OHCI
|
||||
|
||||
Required properties:
|
||||
- compatible: Should be "atmel,at91rm9200-ohci" for USB controllers
|
||||
used in host mode.
|
||||
- num-ports: Number of ports.
|
||||
- atmel,vbus-gpio: If present, specifies a gpio that needs to be
|
||||
activated for the bus to be powered.
|
||||
- atmel,oc-gpio: If present, specifies a gpio that needs to be
|
||||
activated for the overcurrent detection.
|
||||
|
||||
usb0: ohci@00500000 {
|
||||
compatible = "atmel,at91rm9200-ohci", "usb-ohci";
|
||||
reg = <0x00500000 0x100000>;
|
||||
interrupts = <20 4>;
|
||||
num-ports = <2>;
|
||||
};
|
||||
|
||||
EHCI
|
||||
|
||||
Required properties:
|
||||
- compatible: Should be "atmel,at91sam9g45-ehci" for USB controllers
|
||||
used in host mode.
|
||||
|
||||
usb1: ehci@00800000 {
|
||||
compatible = "atmel,at91sam9g45-ehci", "usb-ehci";
|
||||
reg = <0x00800000 0x100000>;
|
||||
interrupts = <22 4>;
|
||||
};
|
||||
|
||||
AT91 USB device controller
|
||||
|
||||
Required properties:
|
||||
- compatible: Should be "atmel,at91rm9200-udc"
|
||||
- reg: Address and length of the register set for the device
|
||||
- interrupts: Should contain macb interrupt
|
||||
|
||||
Optional properties:
|
||||
- atmel,vbus-gpio: If present, specifies a gpio that needs to be
|
||||
activated for the bus to be powered.
|
||||
|
||||
usb1: gadget@fffa4000 {
|
||||
compatible = "atmel,at91rm9200-udc";
|
||||
reg = <0xfffa4000 0x4000>;
|
||||
interrupts = <10 4>;
|
||||
atmel,vbus-gpio = <&pioC 5 0>;
|
||||
};
|
|
@ -11,3 +11,16 @@ Required properties :
|
|||
- phy_type : Should be one of "ulpi" or "utmi".
|
||||
- nvidia,vbus-gpio : If present, specifies a gpio that needs to be
|
||||
activated for the bus to be powered.
|
||||
|
||||
Optional properties:
|
||||
- dr_mode : dual role mode. Indicates the working mode for
|
||||
nvidia,tegra20-ehci compatible controllers. Can be "host", "peripheral",
|
||||
or "otg". Default to "host" if not defined for backward compatibility.
|
||||
host means this is a host controller
|
||||
peripheral means it is device controller
|
||||
otg means it can operate as either ("on the go")
|
||||
- nvidia,has-legacy-mode : boolean indicates whether this controller can
|
||||
operate in legacy mode (as APX 2500 / 2600). In legacy mode some
|
||||
registers are accessed through the APB_MISC base address instead of
|
||||
the USB controller. Since this is a legacy issue it probably does not
|
||||
warrant a compatible string of its own.
|
||||
|
|
|
@ -59,6 +59,26 @@
|
|||
reg = <0xfffff000 0x200>;
|
||||
};
|
||||
|
||||
ramc0: ramc@ffffea00 {
|
||||
compatible = "atmel,at91sam9260-sdramc";
|
||||
reg = <0xffffea00 0x200>;
|
||||
};
|
||||
|
||||
pmc: pmc@fffffc00 {
|
||||
compatible = "atmel,at91rm9200-pmc";
|
||||
reg = <0xfffffc00 0x100>;
|
||||
};
|
||||
|
||||
rstc@fffffd00 {
|
||||
compatible = "atmel,at91sam9260-rstc";
|
||||
reg = <0xfffffd00 0x10>;
|
||||
};
|
||||
|
||||
shdwc@fffffd10 {
|
||||
compatible = "atmel,at91sam9260-shdwc";
|
||||
reg = <0xfffffd10 0x10>;
|
||||
};
|
||||
|
||||
pit: timer@fffffd30 {
|
||||
compatible = "atmel,at91sam9260-pit";
|
||||
reg = <0xfffffd30 0xf>;
|
||||
|
@ -171,6 +191,49 @@
|
|||
interrupts = <21 4>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
usb1: gadget@fffa4000 {
|
||||
compatible = "atmel,at91rm9200-udc";
|
||||
reg = <0xfffa4000 0x4000>;
|
||||
interrupts = <10 4>;
|
||||
status = "disabled";
|
||||
};
|
||||
};
|
||||
|
||||
nand0: nand@40000000 {
|
||||
compatible = "atmel,at91rm9200-nand";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
reg = <0x40000000 0x10000000
|
||||
0xffffe800 0x200
|
||||
>;
|
||||
atmel,nand-addr-offset = <21>;
|
||||
atmel,nand-cmd-offset = <22>;
|
||||
gpios = <&pioC 13 0
|
||||
&pioC 14 0
|
||||
0
|
||||
>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
usb0: ohci@00500000 {
|
||||
compatible = "atmel,at91rm9200-ohci", "usb-ohci";
|
||||
reg = <0x00500000 0x100000>;
|
||||
interrupts = <20 4>;
|
||||
status = "disabled";
|
||||
};
|
||||
};
|
||||
|
||||
i2c@0 {
|
||||
compatible = "i2c-gpio";
|
||||
gpios = <&pioA 23 0 /* sda */
|
||||
&pioA 24 0 /* scl */
|
||||
>;
|
||||
i2c-gpio,sda-open-drain;
|
||||
i2c-gpio,scl-open-drain;
|
||||
i2c-gpio,delay-us = <2>; /* ~100 kHz */
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
status = "disabled";
|
||||
};
|
||||
};
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
compatible = "atmel,at91sam9g25ek", "atmel,at91sam9x5ek", "atmel,at91sam9x5", "atmel,at91sam9";
|
||||
|
||||
chosen {
|
||||
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";
|
||||
bootargs = "128M console=ttyS0,115200 root=/dev/mtdblock1 rw rootfstype=ubifs ubi.mtd=1 root=ubi0:rootfs";
|
||||
};
|
||||
|
||||
ahb {
|
||||
|
@ -33,5 +33,17 @@
|
|||
status = "okay";
|
||||
};
|
||||
};
|
||||
|
||||
usb0: ohci@00600000 {
|
||||
status = "okay";
|
||||
num-ports = <2>;
|
||||
atmel,vbus-gpio = <&pioD 19 0
|
||||
&pioD 20 0
|
||||
>;
|
||||
};
|
||||
|
||||
usb1: ehci@00700000 {
|
||||
status = "okay";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
|
|
@ -60,6 +60,22 @@
|
|||
reg = <0xfffff000 0x200>;
|
||||
};
|
||||
|
||||
ramc0: ramc@ffffe400 {
|
||||
compatible = "atmel,at91sam9g45-ddramc";
|
||||
reg = <0xffffe400 0x200
|
||||
0xffffe600 0x200>;
|
||||
};
|
||||
|
||||
pmc: pmc@fffffc00 {
|
||||
compatible = "atmel,at91rm9200-pmc";
|
||||
reg = <0xfffffc00 0x100>;
|
||||
};
|
||||
|
||||
rstc@fffffd00 {
|
||||
compatible = "atmel,at91sam9g45-rstc";
|
||||
reg = <0xfffffd00 0x10>;
|
||||
};
|
||||
|
||||
pit: timer@fffffd30 {
|
||||
compatible = "atmel,at91sam9260-pit";
|
||||
reg = <0xfffffd30 0xf>;
|
||||
|
@ -67,6 +83,11 @@
|
|||
};
|
||||
|
||||
|
||||
shdwc@fffffd10 {
|
||||
compatible = "atmel,at91sam9rl-shdwc";
|
||||
reg = <0xfffffd10 0x10>;
|
||||
};
|
||||
|
||||
tcb0: timer@fff7c000 {
|
||||
compatible = "atmel,at91rm9200-tcb";
|
||||
reg = <0xfff7c000 0x100>;
|
||||
|
@ -180,5 +201,48 @@
|
|||
status = "disabled";
|
||||
};
|
||||
};
|
||||
|
||||
nand0: nand@40000000 {
|
||||
compatible = "atmel,at91rm9200-nand";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
reg = <0x40000000 0x10000000
|
||||
0xffffe200 0x200
|
||||
>;
|
||||
atmel,nand-addr-offset = <21>;
|
||||
atmel,nand-cmd-offset = <22>;
|
||||
gpios = <&pioC 8 0
|
||||
&pioC 14 0
|
||||
0
|
||||
>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
usb0: ohci@00700000 {
|
||||
compatible = "atmel,at91rm9200-ohci", "usb-ohci";
|
||||
reg = <0x00700000 0x100000>;
|
||||
interrupts = <22 4>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
usb1: ehci@00800000 {
|
||||
compatible = "atmel,at91sam9g45-ehci", "usb-ehci";
|
||||
reg = <0x00800000 0x100000>;
|
||||
interrupts = <22 4>;
|
||||
status = "disabled";
|
||||
};
|
||||
};
|
||||
|
||||
i2c@0 {
|
||||
compatible = "i2c-gpio";
|
||||
gpios = <&pioA 20 0 /* sda */
|
||||
&pioA 21 0 /* scl */
|
||||
>;
|
||||
i2c-gpio,sda-open-drain;
|
||||
i2c-gpio,scl-open-drain;
|
||||
i2c-gpio,delay-us = <5>; /* ~100 kHz */
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
status = "disabled";
|
||||
};
|
||||
};
|
||||
|
|
|
@ -14,13 +14,24 @@
|
|||
compatible = "atmel,at91sam9m10g45ek", "atmel,at91sam9g45", "atmel,at91sam9";
|
||||
|
||||
chosen {
|
||||
bootargs = "mem=64M console=ttyS0,115200 mtdparts=atmel_nand:4M(bootstrap/uboot/kernel)ro,60M(rootfs),-(data) root=/dev/mtdblock1 rw rootfstype=jffs2";
|
||||
bootargs = "mem=64M console=ttyS0,115200 root=/dev/mtdblock1 rw rootfstype=jffs2";
|
||||
};
|
||||
|
||||
memory@70000000 {
|
||||
reg = <0x70000000 0x4000000>;
|
||||
};
|
||||
|
||||
clocks {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
ranges;
|
||||
|
||||
main_clock: clock@0 {
|
||||
compatible = "atmel,osc", "fixed-clock";
|
||||
clock-frequency = <12000000>;
|
||||
};
|
||||
};
|
||||
|
||||
ahb {
|
||||
apb {
|
||||
dbgu: serial@ffffee00 {
|
||||
|
@ -36,6 +47,39 @@
|
|||
status = "okay";
|
||||
};
|
||||
};
|
||||
|
||||
nand0: nand@40000000 {
|
||||
nand-bus-width = <8>;
|
||||
nand-ecc-mode = "soft";
|
||||
nand-on-flash-bbt;
|
||||
status = "okay";
|
||||
|
||||
boot@0 {
|
||||
label = "bootstrap/uboot/kernel";
|
||||
reg = <0x0 0x400000>;
|
||||
};
|
||||
|
||||
rootfs@400000 {
|
||||
label = "rootfs";
|
||||
reg = <0x400000 0x3C00000>;
|
||||
};
|
||||
|
||||
data@4000000 {
|
||||
label = "data";
|
||||
reg = <0x4000000 0xC000000>;
|
||||
};
|
||||
};
|
||||
|
||||
usb0: ohci@00700000 {
|
||||
status = "okay";
|
||||
num-ports = <2>;
|
||||
atmel,vbus-gpio = <&pioD 1 0
|
||||
&pioD 3 0>;
|
||||
};
|
||||
|
||||
usb1: ehci@00800000 {
|
||||
status = "okay";
|
||||
};
|
||||
};
|
||||
|
||||
leds {
|
||||
|
|
|
@ -58,6 +58,26 @@
|
|||
reg = <0xfffff000 0x200>;
|
||||
};
|
||||
|
||||
ramc0: ramc@ffffe800 {
|
||||
compatible = "atmel,at91sam9g45-ddramc";
|
||||
reg = <0xffffe800 0x200>;
|
||||
};
|
||||
|
||||
pmc: pmc@fffffc00 {
|
||||
compatible = "atmel,at91rm9200-pmc";
|
||||
reg = <0xfffffc00 0x100>;
|
||||
};
|
||||
|
||||
rstc@fffffe00 {
|
||||
compatible = "atmel,at91sam9g45-rstc";
|
||||
reg = <0xfffffe00 0x10>;
|
||||
};
|
||||
|
||||
shdwc@fffffe10 {
|
||||
compatible = "atmel,at91sam9x5-shdwc";
|
||||
reg = <0xfffffe10 0x10>;
|
||||
};
|
||||
|
||||
pit: timer@fffffe30 {
|
||||
compatible = "atmel,at91sam9260-pit";
|
||||
reg = <0xfffffe30 0xf>;
|
||||
|
@ -172,5 +192,73 @@
|
|||
status = "disabled";
|
||||
};
|
||||
};
|
||||
|
||||
nand0: nand@40000000 {
|
||||
compatible = "atmel,at91rm9200-nand";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
reg = <0x40000000 0x10000000
|
||||
>;
|
||||
atmel,nand-addr-offset = <21>;
|
||||
atmel,nand-cmd-offset = <22>;
|
||||
gpios = <&pioC 8 0
|
||||
&pioC 14 0
|
||||
0
|
||||
>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
usb0: ohci@00600000 {
|
||||
compatible = "atmel,at91rm9200-ohci", "usb-ohci";
|
||||
reg = <0x00600000 0x100000>;
|
||||
interrupts = <22 4>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
usb1: ehci@00700000 {
|
||||
compatible = "atmel,at91sam9g45-ehci", "usb-ehci";
|
||||
reg = <0x00700000 0x100000>;
|
||||
interrupts = <22 4>;
|
||||
status = "disabled";
|
||||
};
|
||||
};
|
||||
|
||||
i2c@0 {
|
||||
compatible = "i2c-gpio";
|
||||
gpios = <&pioA 30 0 /* sda */
|
||||
&pioA 31 0 /* scl */
|
||||
>;
|
||||
i2c-gpio,sda-open-drain;
|
||||
i2c-gpio,scl-open-drain;
|
||||
i2c-gpio,delay-us = <2>; /* ~100 kHz */
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
i2c@1 {
|
||||
compatible = "i2c-gpio";
|
||||
gpios = <&pioC 0 0 /* sda */
|
||||
&pioC 1 0 /* scl */
|
||||
>;
|
||||
i2c-gpio,sda-open-drain;
|
||||
i2c-gpio,scl-open-drain;
|
||||
i2c-gpio,delay-us = <2>; /* ~100 kHz */
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
i2c@2 {
|
||||
compatible = "i2c-gpio";
|
||||
gpios = <&pioB 4 0 /* sda */
|
||||
&pioB 5 0 /* scl */
|
||||
>;
|
||||
i2c-gpio,sda-open-drain;
|
||||
i2c-gpio,scl-open-drain;
|
||||
i2c-gpio,delay-us = <2>; /* ~100 kHz */
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
status = "disabled";
|
||||
};
|
||||
};
|
||||
|
|
|
@ -12,6 +12,51 @@
|
|||
reg = <0x20000000 0x8000000>;
|
||||
};
|
||||
|
||||
clocks {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
ranges;
|
||||
|
||||
main_clock: clock@0 {
|
||||
compatible = "atmel,osc", "fixed-clock";
|
||||
clock-frequency = <12000000>;
|
||||
};
|
||||
};
|
||||
|
||||
ahb {
|
||||
nand0: nand@40000000 {
|
||||
nand-bus-width = <8>;
|
||||
nand-ecc-mode = "soft";
|
||||
nand-on-flash-bbt;
|
||||
status = "okay";
|
||||
|
||||
at91bootstrap@0 {
|
||||
label = "at91bootstrap";
|
||||
reg = <0x0 0x40000>;
|
||||
};
|
||||
|
||||
uboot@40000 {
|
||||
label = "u-boot";
|
||||
reg = <0x40000 0x80000>;
|
||||
};
|
||||
|
||||
ubootenv@c0000 {
|
||||
label = "U-Boot Env";
|
||||
reg = <0xc0000 0x140000>;
|
||||
};
|
||||
|
||||
kernel@200000 {
|
||||
label = "kernel";
|
||||
reg = <0x200000 0x600000>;
|
||||
};
|
||||
|
||||
rootfs@800000 {
|
||||
label = "rootfs";
|
||||
reg = <0x800000 0x1f800000>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
leds {
|
||||
compatible = "gpio-leds";
|
||||
|
||||
|
|
275
arch/arm/boot/dts/db8500.dtsi
Normal file
275
arch/arm/boot/dts/db8500.dtsi
Normal file
|
@ -0,0 +1,275 @@
|
|||
/*
|
||||
* Copyright 2012 Linaro Ltd
|
||||
*
|
||||
* The code contained herein is licensed under the GNU General Public
|
||||
* License. You may obtain a copy of the GNU General Public License
|
||||
* Version 2 or later at the following locations:
|
||||
*
|
||||
* http://www.opensource.org/licenses/gpl-license.html
|
||||
* http://www.gnu.org/copyleft/gpl.html
|
||||
*/
|
||||
|
||||
/include/ "skeleton.dtsi"
|
||||
|
||||
/ {
|
||||
soc-u9500 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "stericsson,db8500";
|
||||
interrupt-parent = <&intc>;
|
||||
ranges;
|
||||
|
||||
intc: interrupt-controller@a0411000 {
|
||||
compatible = "arm,cortex-a9-gic";
|
||||
#interrupt-cells = <3>;
|
||||
#address-cells = <1>;
|
||||
interrupt-controller;
|
||||
interrupt-parent;
|
||||
reg = <0xa0411000 0x1000>,
|
||||
<0xa0410100 0x100>;
|
||||
};
|
||||
|
||||
L2: l2-cache {
|
||||
compatible = "arm,pl310-cache";
|
||||
reg = <0xa0412000 0x1000>;
|
||||
interrupts = <0 13 4>;
|
||||
cache-unified;
|
||||
cache-level = <2>;
|
||||
};
|
||||
|
||||
pmu {
|
||||
compatible = "arm,cortex-a9-pmu";
|
||||
interrupts = <0 7 0x4>;
|
||||
};
|
||||
|
||||
timer@a0410600 {
|
||||
compatible = "arm,cortex-a9-twd-timer";
|
||||
reg = <0xa0410600 0x20>;
|
||||
interrupts = <1 13 0x304>;
|
||||
};
|
||||
|
||||
rtc@80154000 {
|
||||
compatible = "stericsson,db8500-rtc";
|
||||
reg = <0x80154000 0x1000>;
|
||||
interrupts = <0 18 0x4>;
|
||||
};
|
||||
|
||||
gpio0: gpio@8012e000 {
|
||||
compatible = "stericsson,db8500-gpio",
|
||||
"stmicroelectronics,nomadik-gpio";
|
||||
reg = <0x8012e000 0x80>;
|
||||
interrupts = <0 119 0x4>;
|
||||
supports-sleepmode;
|
||||
gpio-controller;
|
||||
};
|
||||
|
||||
gpio1: gpio@8012e080 {
|
||||
compatible = "stericsson,db8500-gpio",
|
||||
"stmicroelectronics,nomadik-gpio";
|
||||
reg = <0x8012e080 0x80>;
|
||||
interrupts = <0 120 0x4>;
|
||||
supports-sleepmode;
|
||||
gpio-controller;
|
||||
};
|
||||
|
||||
gpio2: gpio@8000e000 {
|
||||
compatible = "stericsson,db8500-gpio",
|
||||
"stmicroelectronics,nomadik-gpio";
|
||||
reg = <0x8000e000 0x80>;
|
||||
interrupts = <0 121 0x4>;
|
||||
supports-sleepmode;
|
||||
gpio-controller;
|
||||
};
|
||||
|
||||
gpio3: gpio@8000e080 {
|
||||
compatible = "stericsson,db8500-gpio",
|
||||
"stmicroelectronics,nomadik-gpio";
|
||||
reg = <0x8000e080 0x80>;
|
||||
interrupts = <0 122 0x4>;
|
||||
supports-sleepmode;
|
||||
gpio-controller;
|
||||
};
|
||||
|
||||
gpio4: gpio@8000e100 {
|
||||
compatible = "stericsson,db8500-gpio",
|
||||
"stmicroelectronics,nomadik-gpio";
|
||||
reg = <0x8000e100 0x80>;
|
||||
interrupts = <0 123 0x4>;
|
||||
supports-sleepmode;
|
||||
gpio-controller;
|
||||
};
|
||||
|
||||
gpio5: gpio@8000e180 {
|
||||
compatible = "stericsson,db8500-gpio",
|
||||
"stmicroelectronics,nomadik-gpio";
|
||||
reg = <0x8000e180 0x80>;
|
||||
interrupts = <0 124 0x4>;
|
||||
supports-sleepmode;
|
||||
gpio-controller;
|
||||
};
|
||||
|
||||
gpio6: gpio@8011e000 {
|
||||
compatible = "stericsson,db8500-gpio",
|
||||
"stmicroelectronics,nomadik-gpio";
|
||||
reg = <0x8011e000 0x80>;
|
||||
interrupts = <0 125 0x4>;
|
||||
supports-sleepmode;
|
||||
gpio-controller;
|
||||
};
|
||||
|
||||
gpio7: gpio@8011e080 {
|
||||
compatible = "stericsson,db8500-gpio",
|
||||
"stmicroelectronics,nomadik-gpio";
|
||||
reg = <0x8011e080 0x80>;
|
||||
interrupts = <0 126 0x4>;
|
||||
supports-sleepmode;
|
||||
gpio-controller;
|
||||
};
|
||||
|
||||
gpio8: gpio@a03fe000 {
|
||||
compatible = "stericsson,db8500-gpio",
|
||||
"stmicroelectronics,nomadik-gpio";
|
||||
reg = <0xa03fe000 0x80>;
|
||||
interrupts = <0 127 0x4>;
|
||||
supports-sleepmode;
|
||||
gpio-controller;
|
||||
};
|
||||
|
||||
usb@a03e0000 {
|
||||
compatible = "stericsson,db8500-musb",
|
||||
"mentor,musb";
|
||||
reg = <0xa03e0000 0x10000>;
|
||||
interrupts = <0 23 0x4>;
|
||||
};
|
||||
|
||||
dma-controller@801C0000 {
|
||||
compatible = "stericsson,db8500-dma40",
|
||||
"stericsson,dma40";
|
||||
reg = <0x801C0000 0x1000 0x40010000 0x800>;
|
||||
interrupts = <0 25 0x4>;
|
||||
};
|
||||
|
||||
prcmu@80157000 {
|
||||
compatible = "stericsson,db8500-prcmu";
|
||||
reg = <0x80157000 0x1000>;
|
||||
interrupts = <46 47>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
ab8500@5 {
|
||||
compatible = "stericsson,ab8500";
|
||||
reg = <5>; /* mailbox 5 is i2c */
|
||||
interrupts = <0 40 0x4>;
|
||||
};
|
||||
};
|
||||
|
||||
i2c@80004000 {
|
||||
compatible = "stericsson,db8500-i2c", "stmicroelectronics,nomadik-i2c";
|
||||
reg = <0x80004000 0x1000>;
|
||||
interrupts = <0 21 0x4>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
};
|
||||
|
||||
i2c@80122000 {
|
||||
compatible = "stericsson,db8500-i2c", "stmicroelectronics,nomadik-i2c";
|
||||
reg = <0x80122000 0x1000>;
|
||||
interrupts = <0 22 0x4>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
};
|
||||
|
||||
i2c@80128000 {
|
||||
compatible = "stericsson,db8500-i2c", "stmicroelectronics,nomadik-i2c";
|
||||
reg = <0x80128000 0x1000>;
|
||||
interrupts = <0 55 0x4>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
};
|
||||
|
||||
i2c@80110000 {
|
||||
compatible = "stericsson,db8500-i2c", "stmicroelectronics,nomadik-i2c";
|
||||
reg = <0x80110000 0x1000>;
|
||||
interrupts = <0 12 0x4>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
};
|
||||
|
||||
i2c@8012a000 {
|
||||
compatible = "stericsson,db8500-i2c", "stmicroelectronics,nomadik-i2c";
|
||||
reg = <0x8012a000 0x1000>;
|
||||
interrupts = <0 51 0x4>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
};
|
||||
|
||||
ssp@80002000 {
|
||||
compatible = "arm,pl022", "arm,primecell";
|
||||
reg = <80002000 0x1000>;
|
||||
interrupts = <0 14 0x4>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
status = "disabled";
|
||||
|
||||
// Add one of these for each child device
|
||||
cs-gpios = <&gpio0 31 &gpio4 14 &gpio4 16 &gpio6 22 &gpio7 0>;
|
||||
|
||||
};
|
||||
|
||||
uart@80120000 {
|
||||
compatible = "arm,pl011", "arm,primecell";
|
||||
reg = <0x80120000 0x1000>;
|
||||
interrupts = <0 11 0x4>;
|
||||
status = "disabled";
|
||||
};
|
||||
uart@80121000 {
|
||||
compatible = "arm,pl011", "arm,primecell";
|
||||
reg = <0x80121000 0x1000>;
|
||||
interrupts = <0 19 0x4>;
|
||||
status = "disabled";
|
||||
};
|
||||
uart@80007000 {
|
||||
compatible = "arm,pl011", "arm,primecell";
|
||||
reg = <0x80007000 0x1000>;
|
||||
interrupts = <0 26 0x4>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
sdi@80126000 {
|
||||
compatible = "arm,pl18x", "arm,primecell";
|
||||
reg = <0x80126000 0x1000>;
|
||||
interrupts = <0 60 0x4>;
|
||||
status = "disabled";
|
||||
};
|
||||
sdi@80118000 {
|
||||
compatible = "arm,pl18x", "arm,primecell";
|
||||
reg = <0x80118000 0x1000>;
|
||||
interrupts = <0 50 0x4>;
|
||||
status = "disabled";
|
||||
};
|
||||
sdi@80005000 {
|
||||
compatible = "arm,pl18x", "arm,primecell";
|
||||
reg = <0x80005000 0x1000>;
|
||||
interrupts = <0 41 0x4>;
|
||||
status = "disabled";
|
||||
};
|
||||
sdi@80119000 {
|
||||
compatible = "arm,pl18x", "arm,primecell";
|
||||
reg = <0x80119000 0x1000>;
|
||||
interrupts = <0 59 0x4>;
|
||||
status = "disabled";
|
||||
};
|
||||
sdi@80114000 {
|
||||
compatible = "arm,pl18x", "arm,primecell";
|
||||
reg = <0x80114000 0x1000>;
|
||||
interrupts = <0 99 0x4>;
|
||||
status = "disabled";
|
||||
};
|
||||
sdi@80008000 {
|
||||
compatible = "arm,pl18x", "arm,primecell";
|
||||
reg = <0x80114000 0x1000>;
|
||||
interrupts = <0 100 0x4>;
|
||||
status = "disabled";
|
||||
};
|
||||
};
|
||||
};
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
/ {
|
||||
model = "Globalscale Technologies Dreamplug";
|
||||
compatible = "globalscale,dreamplug-003-ds2001", "globalscale,dreamplug", "marvell,kirkwood-88f6281", "marvell,kirkwood";
|
||||
compatible = "globalscale,dreamplug-003-ds2001", "globalscale,dreamplug", "mrvl,kirkwood-88f6281", "mrvl,kirkwood";
|
||||
|
||||
memory {
|
||||
device_type = "memory";
|
||||
|
@ -15,11 +15,10 @@
|
|||
bootargs = "console=ttyS0,115200n8 earlyprintk";
|
||||
};
|
||||
|
||||
serial@f1012000 {
|
||||
compatible = "ns16550a";
|
||||
reg = <0xf1012000 0xff>;
|
||||
reg-shift = <2>;
|
||||
interrupts = <33>;
|
||||
clock-frequency = <200000000>;
|
||||
ocp@f1000000 {
|
||||
serial@12000 {
|
||||
clock-frequency = <200000000>;
|
||||
status = "ok";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
|
|
@ -1,6 +1,36 @@
|
|||
/include/ "skeleton.dtsi"
|
||||
|
||||
/ {
|
||||
compatible = "marvell,kirkwood";
|
||||
};
|
||||
compatible = "mrvl,kirkwood";
|
||||
|
||||
ocp@f1000000 {
|
||||
compatible = "simple-bus";
|
||||
ranges = <0 0xf1000000 0x1000000>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
serial@12000 {
|
||||
compatible = "ns16550a";
|
||||
reg = <0x12000 0x100>;
|
||||
reg-shift = <2>;
|
||||
interrupts = <33>;
|
||||
/* set clock-frequency in board dts */
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
serial@12100 {
|
||||
compatible = "ns16550a";
|
||||
reg = <0x12100 0x100>;
|
||||
reg-shift = <2>;
|
||||
interrupts = <34>;
|
||||
/* set clock-frequency in board dts */
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
rtc@10300 {
|
||||
compatible = "mrvl,kirkwood-rtc", "mrvl,orion-rtc";
|
||||
reg = <0x10300 0x20>;
|
||||
interrupts = <53>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
|
139
arch/arm/boot/dts/snowball.dts
Normal file
139
arch/arm/boot/dts/snowball.dts
Normal file
|
@ -0,0 +1,139 @@
|
|||
/*
|
||||
* Copyright 2011 ST-Ericsson AB
|
||||
*
|
||||
* The code contained herein is licensed under the GNU General Public
|
||||
* License. You may obtain a copy of the GNU General Public License
|
||||
* Version 2 or later at the following locations:
|
||||
*
|
||||
* http://www.opensource.org/licenses/gpl-license.html
|
||||
* http://www.gnu.org/copyleft/gpl.html
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
/include/ "db8500.dtsi"
|
||||
|
||||
/ {
|
||||
model = "Calao Systems Snowball platform with device tree";
|
||||
compatible = "calaosystems,snowball-a9500";
|
||||
|
||||
memory {
|
||||
reg = <0x00000000 0x20000000>;
|
||||
};
|
||||
|
||||
gpio_keys {
|
||||
compatible = "gpio-keys";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
button@1 {
|
||||
debounce_interval = <50>;
|
||||
wakeup = <1>;
|
||||
linux,code = <2>;
|
||||
label = "userpb";
|
||||
gpios = <&gpio1 0>;
|
||||
};
|
||||
button@2 {
|
||||
debounce_interval = <50>;
|
||||
wakeup = <1>;
|
||||
linux,code = <3>;
|
||||
label = "userpb";
|
||||
gpios = <&gpio4 23>;
|
||||
};
|
||||
button@3 {
|
||||
debounce_interval = <50>;
|
||||
wakeup = <1>;
|
||||
linux,code = <4>;
|
||||
label = "userpb";
|
||||
gpios = <&gpio4 23>;
|
||||
};
|
||||
button@4 {
|
||||
debounce_interval = <50>;
|
||||
wakeup = <1>;
|
||||
linux,code = <5>;
|
||||
label = "userpb";
|
||||
gpios = <&gpio5 1>;
|
||||
};
|
||||
button@5 {
|
||||
debounce_interval = <50>;
|
||||
wakeup = <1>;
|
||||
linux,code = <6>;
|
||||
label = "userpb";
|
||||
gpios = <&gpio5 2>;
|
||||
};
|
||||
};
|
||||
|
||||
leds {
|
||||
compatible = "gpio-leds";
|
||||
used-led {
|
||||
label = "user_led";
|
||||
gpios = <&gpio4 14>;
|
||||
};
|
||||
};
|
||||
|
||||
soc-u9500 {
|
||||
|
||||
external-bus@50000000 {
|
||||
compatible = "simple-bus";
|
||||
reg = <0x50000000 0x10000000>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
ranges;
|
||||
|
||||
ethernet@50000000 {
|
||||
compatible = "smsc,9111";
|
||||
reg = <0x50000000 0x10000>;
|
||||
interrupts = <12>;
|
||||
interrupt-parent = <&gpio4>;
|
||||
};
|
||||
};
|
||||
|
||||
sdi@80126000 {
|
||||
status = "enabled";
|
||||
cd-gpios = <&gpio6 26>;
|
||||
};
|
||||
|
||||
sdi@80114000 {
|
||||
status = "enabled";
|
||||
};
|
||||
|
||||
uart@80120000 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
uart@80121000 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
uart@80007000 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
i2c@80004000 {
|
||||
tc3589x@42 {
|
||||
//compatible = "tc3589x";
|
||||
reg = <0x42>;
|
||||
interrupts = <25>;
|
||||
interrupt-parent = <&gpio6>;
|
||||
};
|
||||
tps61052@33 {
|
||||
//compatible = "tps61052";
|
||||
reg = <0x33>;
|
||||
};
|
||||
};
|
||||
|
||||
i2c@80128000 {
|
||||
lp5521@0x33 {
|
||||
// compatible = "lp5521";
|
||||
reg = <0x33>;
|
||||
};
|
||||
lp5521@0x34 {
|
||||
// compatible = "lp5521";
|
||||
reg = <0x34>;
|
||||
};
|
||||
bh1780@0x29 {
|
||||
// compatible = "rohm,bh1780gli";
|
||||
reg = <0x33>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
47
arch/arm/boot/dts/spear600-evb.dts
Normal file
47
arch/arm/boot/dts/spear600-evb.dts
Normal file
|
@ -0,0 +1,47 @@
|
|||
/*
|
||||
* Copyright 2012 Stefan Roese <sr@denx.de>
|
||||
*
|
||||
* The code contained herein is licensed under the GNU General Public
|
||||
* License. You may obtain a copy of the GNU General Public License
|
||||
* Version 2 or later at the following locations:
|
||||
*
|
||||
* http://www.opensource.org/licenses/gpl-license.html
|
||||
* http://www.gnu.org/copyleft/gpl.html
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
/include/ "spear600.dtsi"
|
||||
|
||||
/ {
|
||||
model = "ST SPEAr600 Evaluation Board";
|
||||
compatible = "st,spear600-evb", "st,spear600";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
memory {
|
||||
device_type = "memory";
|
||||
reg = <0 0x10000000>;
|
||||
};
|
||||
|
||||
ahb {
|
||||
gmac: ethernet@e0800000 {
|
||||
phy-mode = "gmii";
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
apb {
|
||||
serial@d0000000 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
serial@d0080000 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
i2c@d0200000 {
|
||||
clock-frequency = <400000>;
|
||||
status = "okay";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
174
arch/arm/boot/dts/spear600.dtsi
Normal file
174
arch/arm/boot/dts/spear600.dtsi
Normal file
|
@ -0,0 +1,174 @@
|
|||
/*
|
||||
* Copyright 2012 Stefan Roese <sr@denx.de>
|
||||
*
|
||||
* The code contained herein is licensed under the GNU General Public
|
||||
* License. You may obtain a copy of the GNU General Public License
|
||||
* Version 2 or later at the following locations:
|
||||
*
|
||||
* http://www.opensource.org/licenses/gpl-license.html
|
||||
* http://www.gnu.org/copyleft/gpl.html
|
||||
*/
|
||||
|
||||
/include/ "skeleton.dtsi"
|
||||
|
||||
/ {
|
||||
compatible = "st,spear600";
|
||||
|
||||
cpus {
|
||||
cpu@0 {
|
||||
compatible = "arm,arm926ejs";
|
||||
};
|
||||
};
|
||||
|
||||
memory {
|
||||
device_type = "memory";
|
||||
reg = <0 0x40000000>;
|
||||
};
|
||||
|
||||
ahb {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "simple-bus";
|
||||
ranges = <0xd0000000 0xd0000000 0x30000000>;
|
||||
|
||||
vic0: interrupt-controller@f1100000 {
|
||||
compatible = "arm,pl190-vic";
|
||||
interrupt-controller;
|
||||
reg = <0xf1100000 0x1000>;
|
||||
#interrupt-cells = <1>;
|
||||
};
|
||||
|
||||
vic1: interrupt-controller@f1000000 {
|
||||
compatible = "arm,pl190-vic";
|
||||
interrupt-controller;
|
||||
reg = <0xf1000000 0x1000>;
|
||||
#interrupt-cells = <1>;
|
||||
};
|
||||
|
||||
gmac: ethernet@e0800000 {
|
||||
compatible = "st,spear600-gmac";
|
||||
reg = <0xe0800000 0x8000>;
|
||||
interrupt-parent = <&vic1>;
|
||||
interrupts = <24 23>;
|
||||
interrupt-names = "macirq", "eth_wake_irq";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
fsmc: flash@d1800000 {
|
||||
compatible = "st,spear600-fsmc-nand";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
reg = <0xd1800000 0x1000 /* FSMC Register */
|
||||
0xd2000000 0x4000>; /* NAND Base */
|
||||
reg-names = "fsmc_regs", "nand_data";
|
||||
st,ale-off = <0x20000>;
|
||||
st,cle-off = <0x10000>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
smi: flash@fc000000 {
|
||||
compatible = "st,spear600-smi";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
reg = <0xfc000000 0x1000>;
|
||||
interrupt-parent = <&vic1>;
|
||||
interrupts = <12>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
ehci@e1800000 {
|
||||
compatible = "st,spear600-ehci", "usb-ehci";
|
||||
reg = <0xe1800000 0x1000>;
|
||||
interrupt-parent = <&vic1>;
|
||||
interrupts = <27>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
ehci@e2000000 {
|
||||
compatible = "st,spear600-ehci", "usb-ehci";
|
||||
reg = <0xe2000000 0x1000>;
|
||||
interrupt-parent = <&vic1>;
|
||||
interrupts = <29>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
ohci@e1900000 {
|
||||
compatible = "st,spear600-ohci", "usb-ohci";
|
||||
reg = <0xe1900000 0x1000>;
|
||||
interrupt-parent = <&vic1>;
|
||||
interrupts = <26>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
ohci@e2100000 {
|
||||
compatible = "st,spear600-ohci", "usb-ohci";
|
||||
reg = <0xe2100000 0x1000>;
|
||||
interrupt-parent = <&vic1>;
|
||||
interrupts = <28>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
apb {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "simple-bus";
|
||||
ranges = <0xd0000000 0xd0000000 0x30000000>;
|
||||
|
||||
serial@d0000000 {
|
||||
compatible = "arm,pl011", "arm,primecell";
|
||||
reg = <0xd0000000 0x1000>;
|
||||
interrupt-parent = <&vic0>;
|
||||
interrupts = <24>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
serial@d0080000 {
|
||||
compatible = "arm,pl011", "arm,primecell";
|
||||
reg = <0xd0080000 0x1000>;
|
||||
interrupt-parent = <&vic0>;
|
||||
interrupts = <25>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
/* local/cpu GPIO */
|
||||
gpio0: gpio@f0100000 {
|
||||
#gpio-cells = <2>;
|
||||
compatible = "arm,pl061", "arm,primecell";
|
||||
gpio-controller;
|
||||
reg = <0xf0100000 0x1000>;
|
||||
interrupt-parent = <&vic0>;
|
||||
interrupts = <18>;
|
||||
};
|
||||
|
||||
/* basic GPIO */
|
||||
gpio1: gpio@fc980000 {
|
||||
#gpio-cells = <2>;
|
||||
compatible = "arm,pl061", "arm,primecell";
|
||||
gpio-controller;
|
||||
reg = <0xfc980000 0x1000>;
|
||||
interrupt-parent = <&vic1>;
|
||||
interrupts = <19>;
|
||||
};
|
||||
|
||||
/* appl GPIO */
|
||||
gpio2: gpio@d8100000 {
|
||||
#gpio-cells = <2>;
|
||||
compatible = "arm,pl061", "arm,primecell";
|
||||
gpio-controller;
|
||||
reg = <0xd8100000 0x1000>;
|
||||
interrupt-parent = <&vic1>;
|
||||
interrupts = <4>;
|
||||
};
|
||||
|
||||
i2c@d0200000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "snps,designware-i2c";
|
||||
reg = <0xd0200000 0x1000>;
|
||||
interrupt-parent = <&vic0>;
|
||||
interrupts = <28>;
|
||||
status = "disabled";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
|
@ -112,6 +112,7 @@
|
|||
|
||||
usb@c5000000 {
|
||||
nvidia,vbus-gpio = <&gpio 24 0>; /* PD0 */
|
||||
dr_mode = "otg";
|
||||
};
|
||||
|
||||
gpio-keys {
|
||||
|
|
|
@ -190,6 +190,7 @@
|
|||
reg = <0xc5000000 0x4000>;
|
||||
interrupts = < 0 20 0x04 >;
|
||||
phy_type = "utmi";
|
||||
nvidia,has-legacy-mode;
|
||||
};
|
||||
|
||||
usb@c5004000 {
|
||||
|
|
96
arch/arm/boot/dts/usb_a9g20-dab-mmx.dtsi
Normal file
96
arch/arm/boot/dts/usb_a9g20-dab-mmx.dtsi
Normal file
|
@ -0,0 +1,96 @@
|
|||
/*
|
||||
* calao-dab-mmx.dtsi - Device Tree Include file for Calao DAB-MMX Daughter Board
|
||||
*
|
||||
* Copyright (C) 2011 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
|
||||
*
|
||||
* Licensed under GPLv2.
|
||||
*/
|
||||
|
||||
/ {
|
||||
ahb {
|
||||
apb {
|
||||
usart1: serial@fffb4000 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
usart3: serial@fffd0000 {
|
||||
status = "okay";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
i2c-gpio@0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
leds {
|
||||
compatible = "gpio-leds";
|
||||
|
||||
user_led1 {
|
||||
label = "user_led1";
|
||||
gpios = <&pioB 20 1>;
|
||||
};
|
||||
|
||||
/*
|
||||
* led already used by mother board but active as high
|
||||
* user_led2 {
|
||||
* label = "user_led2";
|
||||
* gpios = <&pioB 21 1>;
|
||||
* };
|
||||
*/
|
||||
user_led3 {
|
||||
label = "user_led3";
|
||||
gpios = <&pioB 22 1>;
|
||||
};
|
||||
|
||||
user_led4 {
|
||||
label = "user_led4";
|
||||
gpios = <&pioB 23 1>;
|
||||
};
|
||||
|
||||
red {
|
||||
label = "red";
|
||||
gpios = <&pioB 24 1>;
|
||||
};
|
||||
|
||||
orange {
|
||||
label = "orange";
|
||||
gpios = <&pioB 30 1>;
|
||||
};
|
||||
|
||||
green {
|
||||
label = "green";
|
||||
gpios = <&pioB 31 1>;
|
||||
};
|
||||
};
|
||||
|
||||
gpio_keys {
|
||||
compatible = "gpio-keys";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
user_pb1 {
|
||||
label = "user_pb1";
|
||||
gpios = <&pioB 25 1>;
|
||||
linux,code = <0x100>;
|
||||
};
|
||||
|
||||
user_pb2 {
|
||||
label = "user_pb2";
|
||||
gpios = <&pioB 13 1>;
|
||||
linux,code = <0x101>;
|
||||
};
|
||||
|
||||
user_pb3 {
|
||||
label = "user_pb3";
|
||||
gpios = <&pioA 26 1>;
|
||||
linux,code = <0x102>;
|
||||
};
|
||||
|
||||
user_pb4 {
|
||||
label = "user_pb4";
|
||||
gpios = <&pioC 9 1>;
|
||||
linux,code = <0x103>;
|
||||
};
|
||||
};
|
||||
};
|
|
@ -13,13 +13,24 @@
|
|||
compatible = "calao,usb-a9g20", "atmel,at91sam9g20", "atmel,at91sam9";
|
||||
|
||||
chosen {
|
||||
bootargs = "mem=64M console=ttyS0,115200 mtdparts=atmel_nand:128k(at91bootstrap),256k(barebox)ro,128k(bareboxenv),128k(bareboxenv2),4M(kernel),120M(rootfs),-(data) root=/dev/mtdblock5 rw rootfstype=ubifs";
|
||||
bootargs = "mem=64M console=ttyS0,115200 root=/dev/mtdblock5 rw rootfstype=ubifs";
|
||||
};
|
||||
|
||||
memory@20000000 {
|
||||
reg = <0x20000000 0x4000000>;
|
||||
};
|
||||
|
||||
clocks {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
ranges;
|
||||
|
||||
main_clock: clock@0 {
|
||||
compatible = "atmel,osc", "fixed-clock";
|
||||
clock-frequency = <12000000>;
|
||||
};
|
||||
};
|
||||
|
||||
ahb {
|
||||
apb {
|
||||
dbgu: serial@fffff200 {
|
||||
|
@ -30,6 +41,58 @@
|
|||
phy-mode = "rmii";
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
usb1: gadget@fffa4000 {
|
||||
atmel,vbus-gpio = <&pioC 5 0>;
|
||||
status = "okay";
|
||||
};
|
||||
};
|
||||
|
||||
nand0: nand@40000000 {
|
||||
nand-bus-width = <8>;
|
||||
nand-ecc-mode = "soft";
|
||||
nand-on-flash-bbt;
|
||||
status = "okay";
|
||||
|
||||
at91bootstrap@0 {
|
||||
label = "at91bootstrap";
|
||||
reg = <0x0 0x20000>;
|
||||
};
|
||||
|
||||
barebox@20000 {
|
||||
label = "barebox";
|
||||
reg = <0x20000 0x40000>;
|
||||
};
|
||||
|
||||
bareboxenv@60000 {
|
||||
label = "bareboxenv";
|
||||
reg = <0x60000 0x20000>;
|
||||
};
|
||||
|
||||
bareboxenv2@80000 {
|
||||
label = "bareboxenv2";
|
||||
reg = <0x80000 0x20000>;
|
||||
};
|
||||
|
||||
kernel@a0000 {
|
||||
label = "kernel";
|
||||
reg = <0xa0000 0x400000>;
|
||||
};
|
||||
|
||||
rootfs@4a0000 {
|
||||
label = "rootfs";
|
||||
reg = <0x4a0000 0x7800000>;
|
||||
};
|
||||
|
||||
data@7ca0000 {
|
||||
label = "data";
|
||||
reg = <0x7ca0000 0x8360000>;
|
||||
};
|
||||
};
|
||||
|
||||
usb0: ohci@00500000 {
|
||||
num-ports = <2>;
|
||||
status = "okay";
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -55,4 +118,13 @@
|
|||
gpio-key,wakeup;
|
||||
};
|
||||
};
|
||||
|
||||
i2c@0 {
|
||||
status = "okay";
|
||||
|
||||
rv3029c2@56 {
|
||||
compatible = "rv3029c2";
|
||||
reg = <0x56>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
|
|
@ -74,6 +74,8 @@ CONFIG_LEGACY_PTY_COUNT=16
|
|||
CONFIG_SERIAL_ATMEL=y
|
||||
CONFIG_SERIAL_ATMEL_CONSOLE=y
|
||||
CONFIG_HW_RANDOM=y
|
||||
CONFIG_I2C=y
|
||||
CONFIG_I2C_GPIO=y
|
||||
CONFIG_SPI=y
|
||||
CONFIG_SPI_ATMEL=y
|
||||
CONFIG_SPI_SPIDEV=y
|
||||
|
@ -105,6 +107,7 @@ CONFIG_LEDS_TRIGGERS=y
|
|||
CONFIG_LEDS_TRIGGER_TIMER=y
|
||||
CONFIG_LEDS_TRIGGER_HEARTBEAT=y
|
||||
CONFIG_RTC_CLASS=y
|
||||
CONFIG_RTC_DRV_RV3029C2=y
|
||||
CONFIG_RTC_DRV_AT91SAM9=y
|
||||
CONFIG_EXT2_FS=y
|
||||
CONFIG_MSDOS_FS=y
|
||||
|
|
|
@ -13,6 +13,7 @@ CONFIG_UX500_SOC_DB8500=y
|
|||
CONFIG_MACH_HREFV60=y
|
||||
CONFIG_MACH_SNOWBALL=y
|
||||
CONFIG_MACH_U5500=y
|
||||
CONFIG_MACH_UX500_DT=y
|
||||
CONFIG_NO_HZ=y
|
||||
CONFIG_HIGH_RES_TIMERS=y
|
||||
CONFIG_SMP=y
|
||||
|
|
|
@ -20,9 +20,11 @@ config HAVE_AT91_USART5
|
|||
|
||||
config AT91_SAM9_ALT_RESET
|
||||
bool
|
||||
default !ARCH_AT91X40
|
||||
|
||||
config AT91_SAM9G45_RESET
|
||||
bool
|
||||
default !ARCH_AT91X40
|
||||
|
||||
menu "Atmel AT91 System-on-Chip"
|
||||
|
||||
|
@ -45,7 +47,6 @@ config ARCH_AT91SAM9260
|
|||
select HAVE_AT91_USART4
|
||||
select HAVE_AT91_USART5
|
||||
select HAVE_NET_MACB
|
||||
select AT91_SAM9_ALT_RESET
|
||||
|
||||
config ARCH_AT91SAM9261
|
||||
bool "AT91SAM9261"
|
||||
|
@ -53,7 +54,6 @@ config ARCH_AT91SAM9261
|
|||
select GENERIC_CLOCKEVENTS
|
||||
select HAVE_FB_ATMEL
|
||||
select HAVE_AT91_DBGU0
|
||||
select AT91_SAM9_ALT_RESET
|
||||
|
||||
config ARCH_AT91SAM9G10
|
||||
bool "AT91SAM9G10"
|
||||
|
@ -61,7 +61,6 @@ config ARCH_AT91SAM9G10
|
|||
select GENERIC_CLOCKEVENTS
|
||||
select HAVE_AT91_DBGU0
|
||||
select HAVE_FB_ATMEL
|
||||
select AT91_SAM9_ALT_RESET
|
||||
|
||||
config ARCH_AT91SAM9263
|
||||
bool "AT91SAM9263"
|
||||
|
@ -70,7 +69,6 @@ config ARCH_AT91SAM9263
|
|||
select HAVE_FB_ATMEL
|
||||
select HAVE_NET_MACB
|
||||
select HAVE_AT91_DBGU1
|
||||
select AT91_SAM9_ALT_RESET
|
||||
|
||||
config ARCH_AT91SAM9RL
|
||||
bool "AT91SAM9RL"
|
||||
|
@ -79,7 +77,6 @@ config ARCH_AT91SAM9RL
|
|||
select HAVE_AT91_USART3
|
||||
select HAVE_FB_ATMEL
|
||||
select HAVE_AT91_DBGU0
|
||||
select AT91_SAM9_ALT_RESET
|
||||
|
||||
config ARCH_AT91SAM9G20
|
||||
bool "AT91SAM9G20"
|
||||
|
@ -90,7 +87,6 @@ config ARCH_AT91SAM9G20
|
|||
select HAVE_AT91_USART4
|
||||
select HAVE_AT91_USART5
|
||||
select HAVE_NET_MACB
|
||||
select AT91_SAM9_ALT_RESET
|
||||
|
||||
config ARCH_AT91SAM9G45
|
||||
bool "AT91SAM9G45"
|
||||
|
@ -100,7 +96,6 @@ config ARCH_AT91SAM9G45
|
|||
select HAVE_FB_ATMEL
|
||||
select HAVE_NET_MACB
|
||||
select HAVE_AT91_DBGU1
|
||||
select AT91_SAM9G45_RESET
|
||||
|
||||
config ARCH_AT91SAM9X5
|
||||
bool "AT91SAM9x5 family"
|
||||
|
@ -109,7 +104,6 @@ config ARCH_AT91SAM9X5
|
|||
select HAVE_FB_ATMEL
|
||||
select HAVE_NET_MACB
|
||||
select HAVE_AT91_DBGU0
|
||||
select AT91_SAM9G45_RESET
|
||||
|
||||
config ARCH_AT91X40
|
||||
bool "AT91x40"
|
||||
|
|
|
@ -216,6 +216,7 @@ static struct clk_lookup periph_clocks_lookups[] = {
|
|||
CLKDEV_CON_DEV_ID("t0_clk", "fffdc000.timer", &tc3_clk),
|
||||
CLKDEV_CON_DEV_ID("t1_clk", "fffdc000.timer", &tc4_clk),
|
||||
CLKDEV_CON_DEV_ID("t2_clk", "fffdc000.timer", &tc5_clk),
|
||||
CLKDEV_CON_DEV_ID("hclk", "500000.ohci", &ohci_clk),
|
||||
/* fake hclk clock */
|
||||
CLKDEV_CON_DEV_ID("hclk", "at91_ohci", &ohci_clk),
|
||||
CLKDEV_CON_ID("pioA", &pioA_clk),
|
||||
|
|
|
@ -232,6 +232,8 @@ static struct clk_lookup periph_clocks_lookups[] = {
|
|||
/* more tc lookup table for DT entries */
|
||||
CLKDEV_CON_DEV_ID("t0_clk", "fff7c000.timer", &tcb0_clk),
|
||||
CLKDEV_CON_DEV_ID("t0_clk", "fffd4000.timer", &tcb0_clk),
|
||||
CLKDEV_CON_DEV_ID("hclk", "700000.ohci", &uhphs_clk),
|
||||
CLKDEV_CON_DEV_ID("ehci_clk", "800000.ehci", &uhphs_clk),
|
||||
/* fake hclk clock */
|
||||
CLKDEV_CON_DEV_ID("hclk", "at91_ohci", &uhphs_clk),
|
||||
CLKDEV_CON_ID("pioA", &pioA_clk),
|
||||
|
|
|
@ -131,7 +131,7 @@ static struct clk dma1_clk = {
|
|||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk uhphs_clk = {
|
||||
.name = "uhphs_clk",
|
||||
.name = "uhphs",
|
||||
.pmc_mask = 1 << AT91SAM9X5_ID_UHPHS,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
|
@ -230,6 +230,9 @@ static struct clk_lookup periph_clocks_lookups[] = {
|
|||
/* additional fake clock for macb_hclk */
|
||||
CLKDEV_CON_DEV_ID("hclk", "f802c000.ethernet", &macb0_clk),
|
||||
CLKDEV_CON_DEV_ID("hclk", "f8030000.ethernet", &macb1_clk),
|
||||
CLKDEV_CON_DEV_ID("hclk", "600000.ohci", &uhphs_clk),
|
||||
CLKDEV_CON_DEV_ID("ohci_clk", "600000.ohci", &uhphs_clk),
|
||||
CLKDEV_CON_DEV_ID("ehci_clk", "700000.ehci", &uhphs_clk),
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -299,25 +302,14 @@ static void __init at91sam9x5_map_io(void)
|
|||
at91_init_sram(0, AT91SAM9X5_SRAM_BASE, AT91SAM9X5_SRAM_SIZE);
|
||||
}
|
||||
|
||||
static void __init at91sam9x5_ioremap_registers(void)
|
||||
{
|
||||
at91_ioremap_ramc(0, AT91SAM9X5_BASE_DDRSDRC0, 512);
|
||||
}
|
||||
|
||||
void __init at91sam9x5_initialize(void)
|
||||
{
|
||||
arm_pm_restart = at91sam9g45_restart;
|
||||
at91_extern_irq = (1 << AT91SAM9X5_ID_IRQ0);
|
||||
|
||||
/* Register GPIO subsystem (using DT) */
|
||||
at91_gpio_init(NULL, 0);
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------
|
||||
* AT91SAM9x5 devices (temporary before modification of code)
|
||||
* -------------------------------------------------------------------- */
|
||||
void __init at91_add_device_nand(struct atmel_nand_data *data) {}
|
||||
|
||||
/* --------------------------------------------------------------------
|
||||
* Interrupt initialization
|
||||
* -------------------------------------------------------------------- */
|
||||
|
@ -362,7 +354,6 @@ static unsigned int at91sam9x5_default_irq_priority[NR_AIC_IRQS] __initdata = {
|
|||
struct at91_init_soc __initdata at91sam9x5_soc = {
|
||||
.map_io = at91sam9x5_map_io,
|
||||
.default_irq_priority = at91sam9x5_default_irq_priority,
|
||||
.ioremap_registers = at91sam9x5_ioremap_registers,
|
||||
.register_clocks = at91sam9x5_register_clocks,
|
||||
.init = at91sam9x5_initialize,
|
||||
};
|
||||
|
|
|
@ -138,6 +138,7 @@ static struct atmel_nand_data __initdata afeb9260_nand_data = {
|
|||
.rdy_pin = AT91_PIN_PC13,
|
||||
.enable_pin = AT91_PIN_PC14,
|
||||
.bus_width_16 = 0,
|
||||
.ecc_mode = NAND_ECC_SOFT,
|
||||
.parts = afeb9260_nand_partition,
|
||||
.num_parts = ARRAY_SIZE(afeb9260_nand_partition),
|
||||
.det_pin = -EINVAL,
|
||||
|
|
|
@ -140,6 +140,7 @@ static struct atmel_nand_data __initdata cam60_nand_data = {
|
|||
.det_pin = -EINVAL,
|
||||
.rdy_pin = AT91_PIN_PA9,
|
||||
.enable_pin = AT91_PIN_PA7,
|
||||
.ecc_mode = NAND_ECC_SOFT,
|
||||
.parts = cam60_nand_partition,
|
||||
.num_parts = ARRAY_SIZE(cam60_nand_partition),
|
||||
};
|
||||
|
|
|
@ -117,6 +117,7 @@ static struct atmel_nand_data __initdata cpu9krea_nand_data = {
|
|||
.enable_pin = AT91_PIN_PC14,
|
||||
.bus_width_16 = 0,
|
||||
.det_pin = -EINVAL,
|
||||
.ecc_mode = NAND_ECC_SOFT,
|
||||
};
|
||||
|
||||
#ifdef CONFIG_MACH_CPU9260
|
||||
|
|
|
@ -19,10 +19,7 @@
|
|||
#include <linux/of_irq.h>
|
||||
#include <linux/of_platform.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/board.h>
|
||||
#include <mach/system_rev.h>
|
||||
#include <mach/at91sam9_smc.h>
|
||||
|
||||
#include <asm/setup.h>
|
||||
#include <asm/irq.h>
|
||||
|
@ -30,58 +27,9 @@
|
|||
#include <asm/mach/map.h>
|
||||
#include <asm/mach/irq.h>
|
||||
|
||||
#include "sam9_smc.h"
|
||||
#include "generic.h"
|
||||
|
||||
|
||||
static void __init ek_init_early(void)
|
||||
{
|
||||
/* Initialize processor: 12.000 MHz crystal */
|
||||
at91_initialize(12000000);
|
||||
}
|
||||
|
||||
/* det_pin is not connected */
|
||||
static struct atmel_nand_data __initdata ek_nand_data = {
|
||||
.ale = 21,
|
||||
.cle = 22,
|
||||
.det_pin = -EINVAL,
|
||||
.rdy_pin = AT91_PIN_PC8,
|
||||
.enable_pin = AT91_PIN_PC14,
|
||||
};
|
||||
|
||||
static struct sam9_smc_config __initdata ek_nand_smc_config = {
|
||||
.ncs_read_setup = 0,
|
||||
.nrd_setup = 2,
|
||||
.ncs_write_setup = 0,
|
||||
.nwe_setup = 2,
|
||||
|
||||
.ncs_read_pulse = 4,
|
||||
.nrd_pulse = 4,
|
||||
.ncs_write_pulse = 4,
|
||||
.nwe_pulse = 4,
|
||||
|
||||
.read_cycle = 7,
|
||||
.write_cycle = 7,
|
||||
|
||||
.mode = AT91_SMC_READMODE | AT91_SMC_WRITEMODE | AT91_SMC_EXNWMODE_DISABLE,
|
||||
.tdf_cycles = 3,
|
||||
};
|
||||
|
||||
static void __init ek_add_device_nand(void)
|
||||
{
|
||||
ek_nand_data.bus_width_16 = board_have_nand_16bit();
|
||||
/* setup bus-width (8 or 16) */
|
||||
if (ek_nand_data.bus_width_16)
|
||||
ek_nand_smc_config.mode |= AT91_SMC_DBW_16;
|
||||
else
|
||||
ek_nand_smc_config.mode |= AT91_SMC_DBW_8;
|
||||
|
||||
/* configure chip-select 3 (NAND) */
|
||||
sam9_smc_configure(0, 3, &ek_nand_smc_config);
|
||||
|
||||
at91_add_device_nand(&ek_nand_data);
|
||||
}
|
||||
|
||||
static const struct of_device_id irq_of_match[] __initconst = {
|
||||
|
||||
{ .compatible = "atmel,at91rm9200-aic", .data = at91_aic_of_init },
|
||||
|
@ -98,9 +46,6 @@ static void __init at91_dt_init_irq(void)
|
|||
static void __init at91_dt_device_init(void)
|
||||
{
|
||||
of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
|
||||
|
||||
/* NAND */
|
||||
ek_add_device_nand();
|
||||
}
|
||||
|
||||
static const char *at91_dt_board_compat[] __initdata = {
|
||||
|
@ -114,7 +59,7 @@ DT_MACHINE_START(at91sam_dt, "Atmel AT91SAM (Device Tree)")
|
|||
/* Maintainer: Atmel */
|
||||
.timer = &at91sam926x_timer,
|
||||
.map_io = at91_map_io,
|
||||
.init_early = ek_init_early,
|
||||
.init_early = at91_dt_initialize,
|
||||
.init_irq = at91_dt_init_irq,
|
||||
.init_machine = at91_dt_device_init,
|
||||
.dt_compat = at91_dt_board_compat,
|
||||
|
|
|
@ -108,6 +108,7 @@ static struct atmel_nand_data __initdata kb9202_nand_data = {
|
|||
.det_pin = -EINVAL,
|
||||
.rdy_pin = AT91_PIN_PC29,
|
||||
.enable_pin = AT91_PIN_PC28,
|
||||
.ecc_mode = NAND_ECC_SOFT,
|
||||
.parts = kb9202_nand_partition,
|
||||
.num_parts = ARRAY_SIZE(kb9202_nand_partition),
|
||||
};
|
||||
|
|
|
@ -190,6 +190,7 @@ static struct atmel_nand_data __initdata neocore926_nand_data = {
|
|||
.rdy_pin = AT91_PIN_PB19,
|
||||
.rdy_pin_active_low = 1,
|
||||
.enable_pin = AT91_PIN_PD15,
|
||||
.ecc_mode = NAND_ECC_SOFT,
|
||||
.parts = neocore926_nand_partition,
|
||||
.num_parts = ARRAY_SIZE(neocore926_nand_partition),
|
||||
.det_pin = -EINVAL,
|
||||
|
|
|
@ -138,6 +138,8 @@ static struct atmel_nand_data __initdata ek_nand_data = {
|
|||
.det_pin = -EINVAL,
|
||||
.rdy_pin = AT91_PIN_PC13,
|
||||
.enable_pin = AT91_PIN_PC14,
|
||||
.ecc_mode = NAND_ECC_SOFT,
|
||||
.on_flash_bbt = 1,
|
||||
.parts = ek_nand_partition,
|
||||
.num_parts = ARRAY_SIZE(ek_nand_partition),
|
||||
};
|
||||
|
|
|
@ -150,6 +150,8 @@ static struct atmel_nand_data __initdata dk_nand_data = {
|
|||
.det_pin = AT91_PIN_PB1,
|
||||
.rdy_pin = AT91_PIN_PC2,
|
||||
.enable_pin = -EINVAL,
|
||||
.ecc_mode = NAND_ECC_SOFT,
|
||||
.on_flash_bbt = 1,
|
||||
.parts = dk_nand_partition,
|
||||
.num_parts = ARRAY_SIZE(dk_nand_partition),
|
||||
};
|
||||
|
|
|
@ -139,6 +139,7 @@ static struct atmel_nand_data __initdata ek_nand_data = {
|
|||
.det_pin = -EINVAL,
|
||||
.rdy_pin = AT91_PIN_PC13,
|
||||
.enable_pin = AT91_PIN_PC14,
|
||||
.ecc_mode = NAND_ECC_SOFT,
|
||||
.parts = ek_nand_partition,
|
||||
.num_parts = ARRAY_SIZE(ek_nand_partition),
|
||||
};
|
||||
|
|
|
@ -181,6 +181,8 @@ static struct atmel_nand_data __initdata ek_nand_data = {
|
|||
.det_pin = -EINVAL,
|
||||
.rdy_pin = AT91_PIN_PC13,
|
||||
.enable_pin = AT91_PIN_PC14,
|
||||
.ecc_mode = NAND_ECC_SOFT,
|
||||
.on_flash_bbt = 1,
|
||||
.parts = ek_nand_partition,
|
||||
.num_parts = ARRAY_SIZE(ek_nand_partition),
|
||||
};
|
||||
|
|
|
@ -187,6 +187,8 @@ static struct atmel_nand_data __initdata ek_nand_data = {
|
|||
.det_pin = -EINVAL,
|
||||
.rdy_pin = AT91_PIN_PC15,
|
||||
.enable_pin = AT91_PIN_PC14,
|
||||
.ecc_mode = NAND_ECC_SOFT,
|
||||
.on_flash_bbt = 1,
|
||||
.parts = ek_nand_partition,
|
||||
.num_parts = ARRAY_SIZE(ek_nand_partition),
|
||||
};
|
||||
|
|
|
@ -187,6 +187,8 @@ static struct atmel_nand_data __initdata ek_nand_data = {
|
|||
.det_pin = -EINVAL,
|
||||
.rdy_pin = AT91_PIN_PA22,
|
||||
.enable_pin = AT91_PIN_PD15,
|
||||
.ecc_mode = NAND_ECC_SOFT,
|
||||
.on_flash_bbt = 1,
|
||||
.parts = ek_nand_partition,
|
||||
.num_parts = ARRAY_SIZE(ek_nand_partition),
|
||||
};
|
||||
|
|
|
@ -166,6 +166,8 @@ static struct atmel_nand_data __initdata ek_nand_data = {
|
|||
.rdy_pin = AT91_PIN_PC13,
|
||||
.enable_pin = AT91_PIN_PC14,
|
||||
.det_pin = -EINVAL,
|
||||
.ecc_mode = NAND_ECC_SOFT,
|
||||
.on_flash_bbt = 1,
|
||||
.parts = ek_nand_partition,
|
||||
.num_parts = ARRAY_SIZE(ek_nand_partition),
|
||||
};
|
||||
|
|
|
@ -148,6 +148,8 @@ static struct atmel_nand_data __initdata ek_nand_data = {
|
|||
.rdy_pin = AT91_PIN_PC8,
|
||||
.enable_pin = AT91_PIN_PC14,
|
||||
.det_pin = -EINVAL,
|
||||
.ecc_mode = NAND_ECC_SOFT,
|
||||
.on_flash_bbt = 1,
|
||||
.parts = ek_nand_partition,
|
||||
.num_parts = ARRAY_SIZE(ek_nand_partition),
|
||||
};
|
||||
|
|
|
@ -94,6 +94,8 @@ static struct atmel_nand_data __initdata ek_nand_data = {
|
|||
.det_pin = -EINVAL,
|
||||
.rdy_pin = AT91_PIN_PD17,
|
||||
.enable_pin = AT91_PIN_PB6,
|
||||
.ecc_mode = NAND_ECC_SOFT,
|
||||
.on_flash_bbt = 1,
|
||||
.parts = ek_nand_partition,
|
||||
.num_parts = ARRAY_SIZE(ek_nand_partition),
|
||||
};
|
||||
|
|
|
@ -110,6 +110,7 @@ static struct atmel_nand_data __initdata snapper9260_nand_data = {
|
|||
.bus_width_16 = 0,
|
||||
.enable_pin = -EINVAL,
|
||||
.det_pin = -EINVAL,
|
||||
.ecc_mode = NAND_ECC_SOFT,
|
||||
};
|
||||
|
||||
static struct sam9_smc_config __initdata snapper9260_nand_smc_config = {
|
||||
|
|
|
@ -86,6 +86,7 @@ static struct atmel_nand_data __initdata nand_data = {
|
|||
.enable_pin = AT91_PIN_PC14,
|
||||
.bus_width_16 = 0,
|
||||
.det_pin = -EINVAL,
|
||||
.ecc_mode = NAND_ECC_SOFT,
|
||||
};
|
||||
|
||||
static struct sam9_smc_config __initdata nand_smc_config = {
|
||||
|
|
|
@ -198,6 +198,8 @@ static struct atmel_nand_data __initdata ek_nand_data = {
|
|||
.det_pin = -EINVAL,
|
||||
.rdy_pin = AT91_PIN_PA22,
|
||||
.enable_pin = AT91_PIN_PD15,
|
||||
.ecc_mode = NAND_ECC_SOFT,
|
||||
.on_flash_bbt = 1,
|
||||
.parts = ek_nand_partition,
|
||||
.num_parts = ARRAY_SIZE(ek_nand_partition),
|
||||
};
|
||||
|
|
|
@ -182,6 +182,7 @@ static struct atmel_nand_data __initdata yl9200_nand_data = {
|
|||
.det_pin = -EINVAL,
|
||||
.rdy_pin = AT91_PIN_PC14, /* R/!B (Sheet10) */
|
||||
.enable_pin = AT91_PIN_PC15, /* !CE (Sheet10) */
|
||||
.ecc_mode = NAND_ECC_SOFT,
|
||||
.parts = yl9200_nand_partition,
|
||||
.num_parts = ARRAY_SIZE(yl9200_nand_partition),
|
||||
};
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
#include <linux/delay.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/of_address.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/at91_pmc.h>
|
||||
|
@ -671,16 +672,12 @@ static void __init at91_upll_usbfs_clock_init(unsigned long main_clock)
|
|||
uhpck.rate_hz /= 1 + ((at91_pmc_read(AT91_PMC_USB) & AT91_PMC_OHCIUSBDIV) >> 8);
|
||||
}
|
||||
|
||||
int __init at91_clock_init(unsigned long main_clock)
|
||||
static int __init at91_pmc_init(unsigned long main_clock)
|
||||
{
|
||||
unsigned tmp, freq, mckr;
|
||||
int i;
|
||||
int pll_overclock = false;
|
||||
|
||||
at91_pmc_base = ioremap(AT91_PMC, 256);
|
||||
if (!at91_pmc_base)
|
||||
panic("Impossible to ioremap AT91_PMC 0x%x\n", AT91_PMC);
|
||||
|
||||
/*
|
||||
* When the bootloader initialized the main oscillator correctly,
|
||||
* there's no problem using the cycle counter. But if it didn't,
|
||||
|
@ -802,6 +799,55 @@ int __init at91_clock_init(unsigned long main_clock)
|
|||
return 0;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_OF)
|
||||
static struct of_device_id pmc_ids[] = {
|
||||
{ .compatible = "atmel,at91rm9200-pmc" },
|
||||
{ /*sentinel*/ }
|
||||
};
|
||||
|
||||
static struct of_device_id osc_ids[] = {
|
||||
{ .compatible = "atmel,osc" },
|
||||
{ /*sentinel*/ }
|
||||
};
|
||||
|
||||
int __init at91_dt_clock_init(void)
|
||||
{
|
||||
struct device_node *np;
|
||||
u32 main_clock = 0;
|
||||
|
||||
np = of_find_matching_node(NULL, pmc_ids);
|
||||
if (!np)
|
||||
panic("unable to find compatible pmc node in dtb\n");
|
||||
|
||||
at91_pmc_base = of_iomap(np, 0);
|
||||
if (!at91_pmc_base)
|
||||
panic("unable to map pmc cpu registers\n");
|
||||
|
||||
of_node_put(np);
|
||||
|
||||
/* retrieve the freqency of fixed clocks from device tree */
|
||||
np = of_find_matching_node(NULL, osc_ids);
|
||||
if (np) {
|
||||
u32 rate;
|
||||
if (!of_property_read_u32(np, "clock-frequency", &rate))
|
||||
main_clock = rate;
|
||||
}
|
||||
|
||||
of_node_put(np);
|
||||
|
||||
return at91_pmc_init(main_clock);
|
||||
}
|
||||
#endif
|
||||
|
||||
int __init at91_clock_init(unsigned long main_clock)
|
||||
{
|
||||
at91_pmc_base = ioremap(AT91_PMC, 256);
|
||||
if (!at91_pmc_base)
|
||||
panic("Impossible to ioremap AT91_PMC 0x%x\n", AT91_PMC);
|
||||
|
||||
return at91_pmc_init(main_clock);
|
||||
}
|
||||
|
||||
/*
|
||||
* Several unused clocks may be active. Turn them off.
|
||||
*/
|
||||
|
|
|
@ -20,6 +20,7 @@ extern void __init at91_init_sram(int bank, unsigned long base,
|
|||
extern void __init at91rm9200_set_type(int type);
|
||||
extern void __init at91_initialize(unsigned long main_clock);
|
||||
extern void __init at91x40_initialize(unsigned long main_clock);
|
||||
extern void __init at91_dt_initialize(void);
|
||||
|
||||
/* Interrupts */
|
||||
extern void __init at91_init_irq_default(void);
|
||||
|
@ -52,6 +53,7 @@ extern void __init at91sam9rl_set_console_clock(int id);
|
|||
extern void __init at91sam9g45_set_console_clock(int id);
|
||||
#ifdef CONFIG_AT91_PMC_UNIT
|
||||
extern int __init at91_clock_init(unsigned long main_clock);
|
||||
extern int __init at91_dt_clock_init(void);
|
||||
#else
|
||||
static int inline at91_clock_init(unsigned long main_clock) { return 0; }
|
||||
#endif
|
||||
|
|
|
@ -36,9 +36,11 @@ extern void __iomem *at91_shdwc_base;
|
|||
#define AT91_SHDW_WKMODE0_HIGH 1
|
||||
#define AT91_SHDW_WKMODE0_LOW 2
|
||||
#define AT91_SHDW_WKMODE0_ANYLEVEL 3
|
||||
#define AT91_SHDW_CPTWK0 (0xf << 4) /* Counter On Wake Up 0 */
|
||||
#define AT91_SHDW_CPTWK0_MAX 0xf /* Maximum Counter On Wake Up 0 */
|
||||
#define AT91_SHDW_CPTWK0 (AT91_SHDW_CPTWK0_MAX << 4) /* Counter On Wake Up 0 */
|
||||
#define AT91_SHDW_CPTWK0_(x) ((x) << 4)
|
||||
#define AT91_SHDW_RTTWKEN (1 << 16) /* Real Time Timer Wake-up Enable */
|
||||
#define AT91_SHDW_RTCWKEN (1 << 17) /* Real Time Clock Wake-up Enable */
|
||||
|
||||
#define AT91_SHDW_SR 0x08 /* Shut Down Status Register */
|
||||
#define AT91_SHDW_WAKEUP0 (1 << 0) /* Wake-up 0 Status */
|
||||
|
|
|
@ -54,11 +54,6 @@
|
|||
#define AT91SAM9X5_BASE_USART1 0xf8020000
|
||||
#define AT91SAM9X5_BASE_USART2 0xf8024000
|
||||
|
||||
/*
|
||||
* System Peripherals
|
||||
*/
|
||||
#define AT91SAM9X5_BASE_DDRSDRC0 0xffffe800
|
||||
|
||||
/*
|
||||
* Base addresses for early serial code (uncompress.h)
|
||||
*/
|
||||
|
|
|
@ -41,6 +41,7 @@
|
|||
#include <sound/atmel-ac97c.h>
|
||||
#include <linux/serial.h>
|
||||
#include <linux/platform_data/macb.h>
|
||||
#include <linux/platform_data/atmel.h>
|
||||
|
||||
/* USB Device */
|
||||
struct at91_udc_data {
|
||||
|
@ -98,20 +99,6 @@ extern void __init at91_add_device_usbh(struct at91_usbh_data *data);
|
|||
extern void __init at91_add_device_usbh_ohci(struct at91_usbh_data *data);
|
||||
extern void __init at91_add_device_usbh_ehci(struct at91_usbh_data *data);
|
||||
|
||||
/* NAND / SmartMedia */
|
||||
struct atmel_nand_data {
|
||||
int enable_pin; /* chip enable */
|
||||
int det_pin; /* card detect */
|
||||
int rdy_pin; /* ready/busy */
|
||||
u8 rdy_pin_active_low; /* rdy_pin value is inverted */
|
||||
u8 ale; /* address line number connected to ALE */
|
||||
u8 cle; /* address line number connected to CLE */
|
||||
u8 bus_width_16; /* buswidth is 16 bit */
|
||||
u8 correction_cap; /* PMECC correction capability */
|
||||
u16 sector_size; /* Sector size for PMECC */
|
||||
struct mtd_partition *parts;
|
||||
unsigned int num_parts;
|
||||
};
|
||||
extern void __init at91_add_device_nand(struct atmel_nand_data *data);
|
||||
|
||||
/* I2C*/
|
||||
|
|
|
@ -197,19 +197,6 @@ extern void at91_slow_clock(void __iomem *pmc, void __iomem *ramc0,
|
|||
extern u32 at91_slow_clock_sz;
|
||||
#endif
|
||||
|
||||
void __iomem *at91_ramc_base[2];
|
||||
|
||||
void __init at91_ioremap_ramc(int id, u32 addr, u32 size)
|
||||
{
|
||||
if (id < 0 || id > 1) {
|
||||
pr_emerg("Wrong RAM controller id (%d), cannot continue\n", id);
|
||||
BUG();
|
||||
}
|
||||
at91_ramc_base[id] = ioremap(addr, size);
|
||||
if (!at91_ramc_base[id])
|
||||
panic("Impossible to ioremap ramc.%d 0x%x\n", id, addr);
|
||||
}
|
||||
|
||||
static int at91_pm_enter(suspend_state_t state)
|
||||
{
|
||||
at91_gpio_suspend();
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
#include <linux/io.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/pm.h>
|
||||
#include <linux/of_address.h>
|
||||
|
||||
#include <asm/mach/map.h>
|
||||
|
||||
|
@ -51,6 +52,19 @@ void __init at91_init_interrupts(unsigned int *priority)
|
|||
at91_gpio_irq_setup();
|
||||
}
|
||||
|
||||
void __iomem *at91_ramc_base[2];
|
||||
|
||||
void __init at91_ioremap_ramc(int id, u32 addr, u32 size)
|
||||
{
|
||||
if (id < 0 || id > 1) {
|
||||
pr_emerg("Wrong RAM controller id (%d), cannot continue\n", id);
|
||||
BUG();
|
||||
}
|
||||
at91_ramc_base[id] = ioremap(addr, size);
|
||||
if (!at91_ramc_base[id])
|
||||
panic("Impossible to ioremap ramc.%d 0x%x\n", id, addr);
|
||||
}
|
||||
|
||||
static struct map_desc sram_desc[2] __initdata;
|
||||
|
||||
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)
|
|||
panic("Impossible to ioremap at91_matrix_base\n");
|
||||
}
|
||||
|
||||
#if defined(CONFIG_OF)
|
||||
static struct of_device_id rstc_ids[] = {
|
||||
{ .compatible = "atmel,at91sam9260-rstc", .data = at91sam9_alt_restart },
|
||||
{ .compatible = "atmel,at91sam9g45-rstc", .data = at91sam9g45_restart },
|
||||
{ /*sentinel*/ }
|
||||
};
|
||||
|
||||
static void at91_dt_rstc(void)
|
||||
{
|
||||
struct device_node *np;
|
||||
const struct of_device_id *of_id;
|
||||
|
||||
np = of_find_matching_node(NULL, rstc_ids);
|
||||
if (!np)
|
||||
panic("unable to find compatible rstc node in dtb\n");
|
||||
|
||||
at91_rstc_base = of_iomap(np, 0);
|
||||
if (!at91_rstc_base)
|
||||
panic("unable to map rstc cpu registers\n");
|
||||
|
||||
of_id = of_match_node(rstc_ids, np);
|
||||
if (!of_id)
|
||||
panic("AT91: rtsc no restart function availlable\n");
|
||||
|
||||
arm_pm_restart = of_id->data;
|
||||
|
||||
of_node_put(np);
|
||||
}
|
||||
|
||||
static struct of_device_id ramc_ids[] = {
|
||||
{ .compatible = "atmel,at91sam9260-sdramc" },
|
||||
{ .compatible = "atmel,at91sam9g45-ddramc" },
|
||||
{ /*sentinel*/ }
|
||||
};
|
||||
|
||||
static void at91_dt_ramc(void)
|
||||
{
|
||||
struct device_node *np;
|
||||
|
||||
np = of_find_matching_node(NULL, ramc_ids);
|
||||
if (!np)
|
||||
panic("unable to find compatible ram conroller node in dtb\n");
|
||||
|
||||
at91_ramc_base[0] = of_iomap(np, 0);
|
||||
if (!at91_ramc_base[0])
|
||||
panic("unable to map ramc[0] cpu registers\n");
|
||||
/* the controller may have 2 banks */
|
||||
at91_ramc_base[1] = of_iomap(np, 1);
|
||||
|
||||
of_node_put(np);
|
||||
}
|
||||
|
||||
static struct of_device_id shdwc_ids[] = {
|
||||
{ .compatible = "atmel,at91sam9260-shdwc", },
|
||||
{ .compatible = "atmel,at91sam9rl-shdwc", },
|
||||
{ .compatible = "atmel,at91sam9x5-shdwc", },
|
||||
{ /*sentinel*/ }
|
||||
};
|
||||
|
||||
static const char *shdwc_wakeup_modes[] = {
|
||||
[AT91_SHDW_WKMODE0_NONE] = "none",
|
||||
[AT91_SHDW_WKMODE0_HIGH] = "high",
|
||||
[AT91_SHDW_WKMODE0_LOW] = "low",
|
||||
[AT91_SHDW_WKMODE0_ANYLEVEL] = "any",
|
||||
};
|
||||
|
||||
const int at91_dtget_shdwc_wakeup_mode(struct device_node *np)
|
||||
{
|
||||
const char *pm;
|
||||
int err, i;
|
||||
|
||||
err = of_property_read_string(np, "atmel,wakeup-mode", &pm);
|
||||
if (err < 0)
|
||||
return AT91_SHDW_WKMODE0_ANYLEVEL;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(shdwc_wakeup_modes); i++)
|
||||
if (!strcasecmp(pm, shdwc_wakeup_modes[i]))
|
||||
return i;
|
||||
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static void at91_dt_shdwc(void)
|
||||
{
|
||||
struct device_node *np;
|
||||
int wakeup_mode;
|
||||
u32 reg;
|
||||
u32 mode = 0;
|
||||
|
||||
np = of_find_matching_node(NULL, shdwc_ids);
|
||||
if (!np) {
|
||||
pr_debug("AT91: unable to find compatible shutdown (shdwc) conroller node in dtb\n");
|
||||
return;
|
||||
}
|
||||
|
||||
at91_shdwc_base = of_iomap(np, 0);
|
||||
if (!at91_shdwc_base)
|
||||
panic("AT91: unable to map shdwc cpu registers\n");
|
||||
|
||||
wakeup_mode = at91_dtget_shdwc_wakeup_mode(np);
|
||||
if (wakeup_mode < 0) {
|
||||
pr_warn("AT91: shdwc unknown wakeup mode\n");
|
||||
goto end;
|
||||
}
|
||||
|
||||
if (!of_property_read_u32(np, "atmel,wakeup-counter", ®)) {
|
||||
if (reg > AT91_SHDW_CPTWK0_MAX) {
|
||||
pr_warn("AT91: shdwc wakeup conter 0x%x > 0x%x reduce it to 0x%x\n",
|
||||
reg, AT91_SHDW_CPTWK0_MAX, AT91_SHDW_CPTWK0_MAX);
|
||||
reg = AT91_SHDW_CPTWK0_MAX;
|
||||
}
|
||||
mode |= AT91_SHDW_CPTWK0_(reg);
|
||||
}
|
||||
|
||||
if (of_property_read_bool(np, "atmel,wakeup-rtc-timer"))
|
||||
mode |= AT91_SHDW_RTCWKEN;
|
||||
|
||||
if (of_property_read_bool(np, "atmel,wakeup-rtt-timer"))
|
||||
mode |= AT91_SHDW_RTTWKEN;
|
||||
|
||||
at91_shdwc_write(AT91_SHDW_MR, wakeup_mode | mode);
|
||||
|
||||
end:
|
||||
pm_power_off = at91sam9_poweroff;
|
||||
|
||||
of_node_put(np);
|
||||
}
|
||||
|
||||
void __init at91_dt_initialize(void)
|
||||
{
|
||||
at91_dt_rstc();
|
||||
at91_dt_ramc();
|
||||
at91_dt_shdwc();
|
||||
|
||||
/* Init clock subsystem */
|
||||
at91_dt_clock_init();
|
||||
|
||||
/* Register the processor-specific clocks */
|
||||
at91_boot_soc.register_clocks();
|
||||
|
||||
at91_boot_soc.init();
|
||||
}
|
||||
#endif
|
||||
|
||||
void __init at91_initialize(unsigned long main_clock)
|
||||
{
|
||||
at91_boot_soc.ioremap_registers();
|
||||
|
|
|
@ -21,3 +21,4 @@ obj-$(CONFIG_MACH_T5325) += t5325-setup.o
|
|||
|
||||
obj-$(CONFIG_CPU_IDLE) += cpuidle.o
|
||||
obj-$(CONFIG_ARCH_KIRKWOOD_DT) += board-dt.o
|
||||
obj-$(CONFIG_MACH_DREAMPLUG_DT) += board-dreamplug.o
|
||||
|
|
152
arch/arm/mach-kirkwood/board-dreamplug.c
Normal file
152
arch/arm/mach-kirkwood/board-dreamplug.c
Normal file
|
@ -0,0 +1,152 @@
|
|||
/*
|
||||
* Copyright 2012 (C), Jason Cooper <jason@lakedaemon.net>
|
||||
*
|
||||
* arch/arm/mach-kirkwood/board-dreamplug.c
|
||||
*
|
||||
* Marvell DreamPlug Reference Board Init for drivers not converted to
|
||||
* flattened device tree yet.
|
||||
*
|
||||
* This file is licensed under the terms of the GNU General Public
|
||||
* License version 2. This program is licensed "as is" without any
|
||||
* warranty of any kind, whether express or implied.
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/ata_platform.h>
|
||||
#include <linux/mv643xx_eth.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/of_fdt.h>
|
||||
#include <linux/of_irq.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/mtd/physmap.h>
|
||||
#include <linux/spi/flash.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/spi/orion_spi.h>
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/map.h>
|
||||
#include <mach/kirkwood.h>
|
||||
#include <mach/bridge-regs.h>
|
||||
#include <plat/mvsdio.h>
|
||||
#include "common.h"
|
||||
#include "mpp.h"
|
||||
|
||||
struct mtd_partition dreamplug_partitions[] = {
|
||||
{
|
||||
.name = "u-boot",
|
||||
.size = SZ_512K,
|
||||
.offset = 0,
|
||||
},
|
||||
{
|
||||
.name = "u-boot env",
|
||||
.size = SZ_64K,
|
||||
.offset = SZ_512K + SZ_512K,
|
||||
},
|
||||
{
|
||||
.name = "dtb",
|
||||
.size = SZ_64K,
|
||||
.offset = SZ_512K + SZ_512K + SZ_512K,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct flash_platform_data dreamplug_spi_slave_data = {
|
||||
.type = "mx25l1606e",
|
||||
.name = "spi_flash",
|
||||
.parts = dreamplug_partitions,
|
||||
.nr_parts = ARRAY_SIZE(dreamplug_partitions),
|
||||
};
|
||||
|
||||
static struct spi_board_info __initdata dreamplug_spi_slave_info[] = {
|
||||
{
|
||||
.modalias = "m25p80",
|
||||
.platform_data = &dreamplug_spi_slave_data,
|
||||
.irq = -1,
|
||||
.max_speed_hz = 50000000,
|
||||
.bus_num = 0,
|
||||
.chip_select = 0,
|
||||
},
|
||||
};
|
||||
|
||||
static struct mv643xx_eth_platform_data dreamplug_ge00_data = {
|
||||
.phy_addr = MV643XX_ETH_PHY_ADDR(0),
|
||||
};
|
||||
|
||||
static struct mv643xx_eth_platform_data dreamplug_ge01_data = {
|
||||
.phy_addr = MV643XX_ETH_PHY_ADDR(1),
|
||||
};
|
||||
|
||||
static struct mv_sata_platform_data dreamplug_sata_data = {
|
||||
.n_ports = 1,
|
||||
};
|
||||
|
||||
static struct mvsdio_platform_data dreamplug_mvsdio_data = {
|
||||
/* unfortunately the CD signal has not been connected */
|
||||
};
|
||||
|
||||
static struct gpio_led dreamplug_led_pins[] = {
|
||||
{
|
||||
.name = "dreamplug:blue:bluetooth",
|
||||
.gpio = 47,
|
||||
.active_low = 1,
|
||||
},
|
||||
{
|
||||
.name = "dreamplug:green:wifi",
|
||||
.gpio = 48,
|
||||
.active_low = 1,
|
||||
},
|
||||
{
|
||||
.name = "dreamplug:green:wifi_ap",
|
||||
.gpio = 49,
|
||||
.active_low = 1,
|
||||
},
|
||||
};
|
||||
|
||||
static struct gpio_led_platform_data dreamplug_led_data = {
|
||||
.leds = dreamplug_led_pins,
|
||||
.num_leds = ARRAY_SIZE(dreamplug_led_pins),
|
||||
};
|
||||
|
||||
static struct platform_device dreamplug_leds = {
|
||||
.name = "leds-gpio",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &dreamplug_led_data,
|
||||
}
|
||||
};
|
||||
|
||||
static unsigned int dreamplug_mpp_config[] __initdata = {
|
||||
MPP0_SPI_SCn,
|
||||
MPP1_SPI_MOSI,
|
||||
MPP2_SPI_SCK,
|
||||
MPP3_SPI_MISO,
|
||||
MPP47_GPIO, /* Bluetooth LED */
|
||||
MPP48_GPIO, /* Wifi LED */
|
||||
MPP49_GPIO, /* Wifi AP LED */
|
||||
0
|
||||
};
|
||||
|
||||
void __init dreamplug_init(void)
|
||||
{
|
||||
/*
|
||||
* Basic setup. Needs to be called early.
|
||||
*/
|
||||
kirkwood_mpp_conf(dreamplug_mpp_config);
|
||||
|
||||
spi_register_board_info(dreamplug_spi_slave_info,
|
||||
ARRAY_SIZE(dreamplug_spi_slave_info));
|
||||
kirkwood_spi_init();
|
||||
|
||||
kirkwood_ehci_init();
|
||||
kirkwood_ge00_init(&dreamplug_ge00_data);
|
||||
kirkwood_ge01_init(&dreamplug_ge01_data);
|
||||
kirkwood_sata_init(&dreamplug_sata_data);
|
||||
kirkwood_sdio_init(&dreamplug_mvsdio_data);
|
||||
|
||||
platform_device_register(&dreamplug_leds);
|
||||
}
|
|
@ -3,7 +3,7 @@
|
|||
*
|
||||
* arch/arm/mach-kirkwood/board-dt.c
|
||||
*
|
||||
* Marvell DreamPlug Reference Board Setup
|
||||
* Flattened Device Tree board initialization
|
||||
*
|
||||
* This file is licensed under the terms of the GNU General Public
|
||||
* License version 2. This program is licensed "as is" without any
|
||||
|
@ -12,150 +12,45 @@
|
|||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/ata_platform.h>
|
||||
#include <linux/mv643xx_eth.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/of_fdt.h>
|
||||
#include <linux/of_irq.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/mtd/physmap.h>
|
||||
#include <linux/spi/flash.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/spi/orion_spi.h>
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <mach/kirkwood.h>
|
||||
#include <plat/mvsdio.h>
|
||||
#include <asm/mach/map.h>
|
||||
#include <mach/bridge-regs.h>
|
||||
#include "common.h"
|
||||
#include "mpp.h"
|
||||
|
||||
static struct of_device_id kirkwood_dt_match_table[] __initdata = {
|
||||
{ .compatible = "simple-bus", },
|
||||
{ }
|
||||
};
|
||||
|
||||
struct mtd_partition dreamplug_partitions[] = {
|
||||
{
|
||||
.name = "u-boot",
|
||||
.size = SZ_512K,
|
||||
.offset = 0,
|
||||
},
|
||||
{
|
||||
.name = "u-boot env",
|
||||
.size = SZ_64K,
|
||||
.offset = SZ_512K + SZ_512K,
|
||||
},
|
||||
{
|
||||
.name = "dtb",
|
||||
.size = SZ_64K,
|
||||
.offset = SZ_512K + SZ_512K + SZ_512K,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct flash_platform_data dreamplug_spi_slave_data = {
|
||||
.type = "mx25l1606e",
|
||||
.name = "spi_flash",
|
||||
.parts = dreamplug_partitions,
|
||||
.nr_parts = ARRAY_SIZE(dreamplug_partitions),
|
||||
};
|
||||
|
||||
static struct spi_board_info __initdata dreamplug_spi_slave_info[] = {
|
||||
{
|
||||
.modalias = "m25p80",
|
||||
.platform_data = &dreamplug_spi_slave_data,
|
||||
.irq = -1,
|
||||
.max_speed_hz = 50000000,
|
||||
.bus_num = 0,
|
||||
.chip_select = 0,
|
||||
},
|
||||
};
|
||||
|
||||
static struct mv643xx_eth_platform_data dreamplug_ge00_data = {
|
||||
.phy_addr = MV643XX_ETH_PHY_ADDR(0),
|
||||
};
|
||||
|
||||
static struct mv643xx_eth_platform_data dreamplug_ge01_data = {
|
||||
.phy_addr = MV643XX_ETH_PHY_ADDR(1),
|
||||
};
|
||||
|
||||
static struct mv_sata_platform_data dreamplug_sata_data = {
|
||||
.n_ports = 1,
|
||||
};
|
||||
|
||||
static struct mvsdio_platform_data dreamplug_mvsdio_data = {
|
||||
/* unfortunately the CD signal has not been connected */
|
||||
};
|
||||
|
||||
static struct gpio_led dreamplug_led_pins[] = {
|
||||
{
|
||||
.name = "dreamplug:blue:bluetooth",
|
||||
.gpio = 47,
|
||||
.active_low = 1,
|
||||
},
|
||||
{
|
||||
.name = "dreamplug:green:wifi",
|
||||
.gpio = 48,
|
||||
.active_low = 1,
|
||||
},
|
||||
{
|
||||
.name = "dreamplug:green:wifi_ap",
|
||||
.gpio = 49,
|
||||
.active_low = 1,
|
||||
},
|
||||
};
|
||||
|
||||
static struct gpio_led_platform_data dreamplug_led_data = {
|
||||
.leds = dreamplug_led_pins,
|
||||
.num_leds = ARRAY_SIZE(dreamplug_led_pins),
|
||||
};
|
||||
|
||||
static struct platform_device dreamplug_leds = {
|
||||
.name = "leds-gpio",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &dreamplug_led_data,
|
||||
}
|
||||
};
|
||||
|
||||
static unsigned int dreamplug_mpp_config[] __initdata = {
|
||||
MPP0_SPI_SCn,
|
||||
MPP1_SPI_MOSI,
|
||||
MPP2_SPI_SCK,
|
||||
MPP3_SPI_MISO,
|
||||
MPP47_GPIO, /* Bluetooth LED */
|
||||
MPP48_GPIO, /* Wifi LED */
|
||||
MPP49_GPIO, /* Wifi AP LED */
|
||||
0
|
||||
};
|
||||
|
||||
static void __init dreamplug_init(void)
|
||||
{
|
||||
/*
|
||||
* Basic setup. Needs to be called early.
|
||||
*/
|
||||
kirkwood_mpp_conf(dreamplug_mpp_config);
|
||||
|
||||
spi_register_board_info(dreamplug_spi_slave_info,
|
||||
ARRAY_SIZE(dreamplug_spi_slave_info));
|
||||
kirkwood_spi_init();
|
||||
|
||||
kirkwood_ehci_init();
|
||||
kirkwood_ge00_init(&dreamplug_ge00_data);
|
||||
kirkwood_ge01_init(&dreamplug_ge01_data);
|
||||
kirkwood_sata_init(&dreamplug_sata_data);
|
||||
kirkwood_sdio_init(&dreamplug_mvsdio_data);
|
||||
|
||||
platform_device_register(&dreamplug_leds);
|
||||
}
|
||||
|
||||
static void __init kirkwood_dt_init(void)
|
||||
{
|
||||
kirkwood_init();
|
||||
pr_info("Kirkwood: %s, TCLK=%d.\n", kirkwood_id(), kirkwood_tclk);
|
||||
|
||||
/*
|
||||
* Disable propagation of mbus errors to the CPU local bus,
|
||||
* as this causes mbus errors (which can occur for example
|
||||
* for PCI aborts) to throw CPU aborts, which we're not set
|
||||
* up to deal with.
|
||||
*/
|
||||
writel(readl(CPU_CONFIG) & ~CPU_CONFIG_ERROR_PROP, CPU_CONFIG);
|
||||
|
||||
kirkwood_setup_cpu_mbus();
|
||||
|
||||
#ifdef CONFIG_CACHE_FEROCEON_L2
|
||||
kirkwood_l2_init();
|
||||
#endif
|
||||
|
||||
/* internal devices that every board has */
|
||||
kirkwood_wdt_init();
|
||||
kirkwood_xor0_init();
|
||||
kirkwood_xor1_init();
|
||||
kirkwood_crypto_init();
|
||||
|
||||
#ifdef CONFIG_KEXEC
|
||||
kexec_reinit = kirkwood_enable_pcie;
|
||||
#endif
|
||||
|
||||
if (of_machine_is_compatible("globalscale,dreamplug"))
|
||||
dreamplug_init();
|
||||
|
|
|
@ -279,7 +279,7 @@ void __init kirkwood_crypto_init(void)
|
|||
/*****************************************************************************
|
||||
* XOR0
|
||||
****************************************************************************/
|
||||
static void __init kirkwood_xor0_init(void)
|
||||
void __init kirkwood_xor0_init(void)
|
||||
{
|
||||
kirkwood_clk_ctrl |= CGC_XOR0;
|
||||
|
||||
|
@ -291,7 +291,7 @@ static void __init kirkwood_xor0_init(void)
|
|||
/*****************************************************************************
|
||||
* XOR1
|
||||
****************************************************************************/
|
||||
static void __init kirkwood_xor1_init(void)
|
||||
void __init kirkwood_xor1_init(void)
|
||||
{
|
||||
kirkwood_clk_ctrl |= CGC_XOR1;
|
||||
|
||||
|
@ -303,7 +303,7 @@ static void __init kirkwood_xor1_init(void)
|
|||
/*****************************************************************************
|
||||
* Watchdog
|
||||
****************************************************************************/
|
||||
static void __init kirkwood_wdt_init(void)
|
||||
void __init kirkwood_wdt_init(void)
|
||||
{
|
||||
orion_wdt_init(kirkwood_tclk);
|
||||
}
|
||||
|
@ -392,7 +392,7 @@ void __init kirkwood_audio_init(void)
|
|||
/*
|
||||
* Identify device ID and revision.
|
||||
*/
|
||||
static char * __init kirkwood_id(void)
|
||||
char * __init kirkwood_id(void)
|
||||
{
|
||||
u32 dev, rev;
|
||||
|
||||
|
@ -435,7 +435,7 @@ static char * __init kirkwood_id(void)
|
|||
}
|
||||
}
|
||||
|
||||
static void __init kirkwood_l2_init(void)
|
||||
void __init kirkwood_l2_init(void)
|
||||
{
|
||||
#ifdef CONFIG_CACHE_FEROCEON_L2_WRITETHROUGH
|
||||
writel(readl(L2_CONFIG_REG) | L2_WRITETHROUGH, L2_CONFIG_REG);
|
||||
|
@ -450,7 +450,6 @@ void __init kirkwood_init(void)
|
|||
{
|
||||
printk(KERN_INFO "Kirkwood: %s, TCLK=%d.\n",
|
||||
kirkwood_id(), kirkwood_tclk);
|
||||
kirkwood_i2s_data.tclk = kirkwood_tclk;
|
||||
|
||||
/*
|
||||
* Disable propagation of mbus errors to the CPU local bus,
|
||||
|
|
|
@ -51,6 +51,21 @@ void kirkwood_nand_init_rnb(struct mtd_partition *parts, int nr_parts, int (*dev
|
|||
void kirkwood_audio_init(void);
|
||||
void kirkwood_restart(char, const char *);
|
||||
|
||||
/* board init functions for boards not fully converted to fdt */
|
||||
#ifdef CONFIG_MACH_DREAMPLUG_DT
|
||||
void dreamplug_init(void);
|
||||
#else
|
||||
static inline void dreamplug_init(void) {};
|
||||
#endif
|
||||
|
||||
/* early init functions not converted to fdt yet */
|
||||
char *kirkwood_id(void);
|
||||
void kirkwood_l2_init(void);
|
||||
void kirkwood_wdt_init(void);
|
||||
void kirkwood_xor0_init(void);
|
||||
void kirkwood_xor1_init(void);
|
||||
void kirkwood_crypto_init(void);
|
||||
|
||||
extern int kirkwood_tclk;
|
||||
extern struct sys_timer kirkwood_timer;
|
||||
|
||||
|
|
|
@ -5,11 +5,12 @@
|
|||
if ARCH_SPEAR6XX
|
||||
|
||||
menu "SPEAr6xx Implementations"
|
||||
config BOARD_SPEAR600_EVB
|
||||
bool "SPEAr600 Evaluation Board"
|
||||
config BOARD_SPEAR600_DT
|
||||
bool "SPEAr600 generic board configured via device-tree"
|
||||
select MACH_SPEAR600
|
||||
select USE_OF
|
||||
help
|
||||
Supports ST SPEAr600 Evaluation Board
|
||||
Supports ST SPEAr600 boards configured via the device-tree
|
||||
|
||||
endmenu
|
||||
|
||||
|
|
|
@ -4,9 +4,3 @@
|
|||
|
||||
# common files
|
||||
obj-y += clock.o spear6xx.o
|
||||
|
||||
# spear600 specific files
|
||||
obj-$(CONFIG_MACH_SPEAR600) += spear600.o
|
||||
|
||||
# spear600 boards files
|
||||
obj-$(CONFIG_BOARD_SPEAR600_EVB) += spear600_evb.o
|
||||
|
|
|
@ -641,8 +641,8 @@ static struct clk_lookup spear_clk_lookups[] = {
|
|||
{ .con_id = "gpt0_synth_clk", .clk = &gpt0_synth_clk},
|
||||
{ .con_id = "gpt2_synth_clk", .clk = &gpt2_synth_clk},
|
||||
{ .con_id = "gpt3_synth_clk", .clk = &gpt3_synth_clk},
|
||||
{ .dev_id = "uart0", .clk = &uart0_clk},
|
||||
{ .dev_id = "uart1", .clk = &uart1_clk},
|
||||
{ .dev_id = "d0000000.serial", .clk = &uart0_clk},
|
||||
{ .dev_id = "d0080000.serial", .clk = &uart1_clk},
|
||||
{ .dev_id = "firda", .clk = &firda_clk},
|
||||
{ .dev_id = "clcd", .clk = &clcd_clk},
|
||||
{ .dev_id = "gpt0", .clk = &gpt0_clk},
|
||||
|
@ -655,20 +655,20 @@ static struct clk_lookup spear_clk_lookups[] = {
|
|||
{ .con_id = "usbh.1_clk", .clk = &usbh1_clk},
|
||||
/* clock derived from ahb clk */
|
||||
{ .con_id = "apb_clk", .clk = &apb_clk},
|
||||
{ .dev_id = "i2c_designware.0", .clk = &i2c_clk},
|
||||
{ .dev_id = "d0200000.i2c", .clk = &i2c_clk},
|
||||
{ .dev_id = "dma", .clk = &dma_clk},
|
||||
{ .dev_id = "jpeg", .clk = &jpeg_clk},
|
||||
{ .dev_id = "gmac", .clk = &gmac_clk},
|
||||
{ .dev_id = "smi", .clk = &smi_clk},
|
||||
{ .con_id = "fsmc", .clk = &fsmc_clk},
|
||||
{ .dev_id = "fsmc-nand", .clk = &fsmc_clk},
|
||||
/* clock derived from apb clk */
|
||||
{ .dev_id = "adc", .clk = &adc_clk},
|
||||
{ .dev_id = "ssp-pl022.0", .clk = &ssp0_clk},
|
||||
{ .dev_id = "ssp-pl022.1", .clk = &ssp1_clk},
|
||||
{ .dev_id = "ssp-pl022.2", .clk = &ssp2_clk},
|
||||
{ .dev_id = "gpio0", .clk = &gpio0_clk},
|
||||
{ .dev_id = "gpio1", .clk = &gpio1_clk},
|
||||
{ .dev_id = "gpio2", .clk = &gpio2_clk},
|
||||
{ .dev_id = "f0100000.gpio", .clk = &gpio0_clk},
|
||||
{ .dev_id = "fc980000.gpio", .clk = &gpio1_clk},
|
||||
{ .dev_id = "d8100000.gpio", .clk = &gpio2_clk},
|
||||
};
|
||||
|
||||
void __init spear6xx_clk_init(void)
|
||||
|
|
|
@ -1,25 +0,0 @@
|
|||
/*
|
||||
* arch/arm/mach-spear6xx/spear600.c
|
||||
*
|
||||
* SPEAr600 machine source file
|
||||
*
|
||||
* Copyright (C) 2009 ST Microelectronics
|
||||
* Rajeev Kumar<rajeev-dlh.kumar@st.com>
|
||||
*
|
||||
* This file is licensed under the terms of the GNU General Public
|
||||
* License version 2. This program is licensed "as is" without any
|
||||
* warranty of any kind, whether express or implied.
|
||||
*/
|
||||
|
||||
#include <linux/ptrace.h>
|
||||
#include <asm/irq.h>
|
||||
#include <mach/generic.h>
|
||||
#include <mach/hardware.h>
|
||||
|
||||
/* Add spear600 specific devices here */
|
||||
|
||||
void __init spear600_init(void)
|
||||
{
|
||||
/* call spear6xx family common init function */
|
||||
spear6xx_init();
|
||||
}
|
|
@ -1,54 +0,0 @@
|
|||
/*
|
||||
* arch/arm/mach-spear6xx/spear600_evb.c
|
||||
*
|
||||
* SPEAr600 evaluation board source file
|
||||
*
|
||||
* Copyright (C) 2009 ST Microelectronics
|
||||
* Viresh Kumar<viresh.kumar@st.com>
|
||||
*
|
||||
* This file is licensed under the terms of the GNU General Public
|
||||
* License version 2. This program is licensed "as is" without any
|
||||
* warranty of any kind, whether express or implied.
|
||||
*/
|
||||
|
||||
#include <asm/hardware/vic.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach-types.h>
|
||||
#include <mach/generic.h>
|
||||
#include <mach/hardware.h>
|
||||
|
||||
static struct amba_device *amba_devs[] __initdata = {
|
||||
&gpio_device[0],
|
||||
&gpio_device[1],
|
||||
&gpio_device[2],
|
||||
&uart_device[0],
|
||||
&uart_device[1],
|
||||
};
|
||||
|
||||
static struct platform_device *plat_devs[] __initdata = {
|
||||
};
|
||||
|
||||
static void __init spear600_evb_init(void)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
/* call spear600 machine init function */
|
||||
spear600_init();
|
||||
|
||||
/* Add Platform Devices */
|
||||
platform_add_devices(plat_devs, ARRAY_SIZE(plat_devs));
|
||||
|
||||
/* Add Amba Devices */
|
||||
for (i = 0; i < ARRAY_SIZE(amba_devs); i++)
|
||||
amba_device_register(amba_devs[i], &iomem_resource);
|
||||
}
|
||||
|
||||
MACHINE_START(SPEAR600, "ST-SPEAR600-EVB")
|
||||
.atag_offset = 0x100,
|
||||
.map_io = spear6xx_map_io,
|
||||
.init_irq = spear6xx_init_irq,
|
||||
.handle_irq = vic_handle_irq,
|
||||
.timer = &spear6xx_timer,
|
||||
.init_machine = spear600_evb_init,
|
||||
.restart = spear_restart,
|
||||
MACHINE_END
|
|
@ -6,111 +6,21 @@
|
|||
* Copyright (C) 2009 ST Microelectronics
|
||||
* Rajeev Kumar<rajeev-dlh.kumar@st.com>
|
||||
*
|
||||
* Copyright 2012 Stefan Roese <sr@denx.de>
|
||||
*
|
||||
* This file is licensed under the terms of the GNU General Public
|
||||
* License version 2. This program is licensed "as is" without any
|
||||
* warranty of any kind, whether express or implied.
|
||||
*/
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/amba/pl061.h>
|
||||
#include <linux/ptrace.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/of_irq.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <asm/hardware/vic.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <mach/generic.h>
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/irqs.h>
|
||||
|
||||
/* Add spear6xx machines common devices here */
|
||||
/* uart device registration */
|
||||
struct amba_device uart_device[] = {
|
||||
{
|
||||
.dev = {
|
||||
.init_name = "uart0",
|
||||
},
|
||||
.res = {
|
||||
.start = SPEAR6XX_ICM1_UART0_BASE,
|
||||
.end = SPEAR6XX_ICM1_UART0_BASE + SZ_4K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
.irq = {IRQ_UART_0},
|
||||
}, {
|
||||
.dev = {
|
||||
.init_name = "uart1",
|
||||
},
|
||||
.res = {
|
||||
.start = SPEAR6XX_ICM1_UART1_BASE,
|
||||
.end = SPEAR6XX_ICM1_UART1_BASE + SZ_4K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
.irq = {IRQ_UART_1},
|
||||
}
|
||||
};
|
||||
|
||||
/* gpio device registration */
|
||||
static struct pl061_platform_data gpio_plat_data[] = {
|
||||
{
|
||||
.gpio_base = 0,
|
||||
.irq_base = SPEAR_GPIO0_INT_BASE,
|
||||
}, {
|
||||
.gpio_base = 8,
|
||||
.irq_base = SPEAR_GPIO1_INT_BASE,
|
||||
}, {
|
||||
.gpio_base = 16,
|
||||
.irq_base = SPEAR_GPIO2_INT_BASE,
|
||||
},
|
||||
};
|
||||
|
||||
struct amba_device gpio_device[] = {
|
||||
{
|
||||
.dev = {
|
||||
.init_name = "gpio0",
|
||||
.platform_data = &gpio_plat_data[0],
|
||||
},
|
||||
.res = {
|
||||
.start = SPEAR6XX_CPU_GPIO_BASE,
|
||||
.end = SPEAR6XX_CPU_GPIO_BASE + SZ_4K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
.irq = {IRQ_LOCAL_GPIO},
|
||||
}, {
|
||||
.dev = {
|
||||
.init_name = "gpio1",
|
||||
.platform_data = &gpio_plat_data[1],
|
||||
},
|
||||
.res = {
|
||||
.start = SPEAR6XX_ICM3_GPIO_BASE,
|
||||
.end = SPEAR6XX_ICM3_GPIO_BASE + SZ_4K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
.irq = {IRQ_BASIC_GPIO},
|
||||
}, {
|
||||
.dev = {
|
||||
.init_name = "gpio2",
|
||||
.platform_data = &gpio_plat_data[2],
|
||||
},
|
||||
.res = {
|
||||
.start = SPEAR6XX_ICM2_GPIO_BASE,
|
||||
.end = SPEAR6XX_ICM2_GPIO_BASE + SZ_4K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
.irq = {IRQ_APPL_GPIO},
|
||||
}
|
||||
};
|
||||
|
||||
/* This will add devices, and do machine specific tasks */
|
||||
void __init spear6xx_init(void)
|
||||
{
|
||||
/* nothing to do for now */
|
||||
}
|
||||
|
||||
/* This will initialize vic */
|
||||
void __init spear6xx_init_irq(void)
|
||||
{
|
||||
vic_init((void __iomem *)VA_SPEAR6XX_CPU_VIC_PRI_BASE, 0, ~0, 0);
|
||||
vic_init((void __iomem *)VA_SPEAR6XX_CPU_VIC_SEC_BASE, 32, ~0, 0);
|
||||
}
|
||||
|
||||
/* Following will create static virtual/physical mappings */
|
||||
static struct map_desc spear6xx_io_desc[] __initdata = {
|
||||
|
@ -181,3 +91,33 @@ static void __init spear6xx_timer_init(void)
|
|||
struct sys_timer spear6xx_timer = {
|
||||
.init = spear6xx_timer_init,
|
||||
};
|
||||
|
||||
static void __init spear600_dt_init(void)
|
||||
{
|
||||
of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
|
||||
}
|
||||
|
||||
static const char *spear600_dt_board_compat[] = {
|
||||
"st,spear600",
|
||||
NULL
|
||||
};
|
||||
|
||||
static const struct of_device_id vic_of_match[] __initconst = {
|
||||
{ .compatible = "arm,pl190-vic", .data = vic_of_init, },
|
||||
{ /* Sentinel */ }
|
||||
};
|
||||
|
||||
static void __init spear6xx_dt_init_irq(void)
|
||||
{
|
||||
of_irq_init(vic_of_match);
|
||||
}
|
||||
|
||||
DT_MACHINE_START(SPEAR600_DT, "ST SPEAr600 (Flattened Device Tree)")
|
||||
.map_io = spear6xx_map_io,
|
||||
.init_irq = spear6xx_dt_init_irq,
|
||||
.handle_irq = vic_handle_irq,
|
||||
.timer = &spear6xx_timer,
|
||||
.init_machine = spear600_dt_init,
|
||||
.restart = spear_restart,
|
||||
.dt_compat = spear600_dt_board_compat,
|
||||
MACHINE_END
|
||||
|
|
|
@ -58,6 +58,12 @@ config UX500_AUTO_PLATFORM
|
|||
At least one platform needs to be selected in order to build
|
||||
a working kernel. If everything else is disabled, this
|
||||
automatically enables MACH_MOP500.
|
||||
|
||||
config MACH_UX500_DT
|
||||
bool "Generic U8500 support using device tree"
|
||||
depends on MACH_MOP500
|
||||
select USE_OF
|
||||
|
||||
endmenu
|
||||
|
||||
config UX500_DEBUG_UART
|
||||
|
|
|
@ -2,3 +2,4 @@
|
|||
params_phys-y := 0x00000100
|
||||
initrd_phys-y := 0x00800000
|
||||
|
||||
dtb-$(CONFIG_MACH_SNOWBALL) += snowball.dtb
|
||||
|
|
|
@ -30,6 +30,9 @@
|
|||
#include <linux/gpio_keys.h>
|
||||
#include <linux/delay.h>
|
||||
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_platform.h>
|
||||
|
||||
#include <linux/leds.h>
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
|
@ -440,7 +443,7 @@ static struct stedma40_chan_cfg ssp0_dma_cfg_tx = {
|
|||
};
|
||||
#endif
|
||||
|
||||
static struct pl022_ssp_controller ssp0_platform_data = {
|
||||
static struct pl022_ssp_controller ssp0_plat = {
|
||||
.bus_id = 0,
|
||||
#ifdef CONFIG_STE_DMA40
|
||||
.enable_dma = 1,
|
||||
|
@ -458,7 +461,7 @@ static struct pl022_ssp_controller ssp0_platform_data = {
|
|||
|
||||
static void __init mop500_spi_init(struct device *parent)
|
||||
{
|
||||
db8500_add_ssp0(parent, &ssp0_platform_data);
|
||||
db8500_add_ssp0(parent, &ssp0_plat);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_STE_DMA40
|
||||
|
@ -618,6 +621,7 @@ static void __init mop500_init_machine(void)
|
|||
|
||||
mop500_pins_init();
|
||||
|
||||
/* FIXME: parent of ab8500 should be prcmu */
|
||||
for (i = 0; i < ARRAY_SIZE(mop500_platform_devs); i++)
|
||||
mop500_platform_devs[i]->dev.parent = parent;
|
||||
|
||||
|
@ -738,3 +742,94 @@ MACHINE_START(SNOWBALL, "Calao Systems Snowball platform")
|
|||
.handle_irq = gic_handle_irq,
|
||||
.init_machine = snowball_init_machine,
|
||||
MACHINE_END
|
||||
|
||||
#ifdef CONFIG_MACH_UX500_DT
|
||||
|
||||
struct of_dev_auxdata u8500_auxdata_lookup[] __initdata = {
|
||||
OF_DEV_AUXDATA("arm,pl011", 0x80120000, "uart0", &uart0_plat),
|
||||
OF_DEV_AUXDATA("arm,pl011", 0x80121000, "uart1", &uart1_plat),
|
||||
OF_DEV_AUXDATA("arm,pl011", 0x80007000, "uart2", &uart2_plat),
|
||||
OF_DEV_AUXDATA("arm,pl022", 0x80002000, "ssp0", &ssp0_plat),
|
||||
{},
|
||||
};
|
||||
|
||||
static const struct of_device_id u8500_soc_node[] = {
|
||||
/* only create devices below soc node */
|
||||
{ .compatible = "stericsson,db8500", },
|
||||
{ },
|
||||
};
|
||||
|
||||
static void __init u8500_init_machine(void)
|
||||
{
|
||||
struct device *parent = NULL;
|
||||
int i2c0_devs;
|
||||
int i;
|
||||
|
||||
parent = u8500_init_devices();
|
||||
i2c0_devs = ARRAY_SIZE(mop500_i2c0_devices);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(mop500_platform_devs); i++)
|
||||
mop500_platform_devs[i]->dev.parent = parent;
|
||||
for (i = 0; i < ARRAY_SIZE(snowball_platform_devs); i++)
|
||||
snowball_platform_devs[i]->dev.parent = parent;
|
||||
|
||||
/* automatically probe child nodes of db8500 device */
|
||||
of_platform_populate(NULL, u8500_soc_node, u8500_auxdata_lookup, parent);
|
||||
|
||||
if (of_machine_is_compatible("st-ericsson,mop500")) {
|
||||
mop500_gpio_keys[0].gpio = GPIO_PROX_SENSOR;
|
||||
mop500_pins_init();
|
||||
|
||||
platform_add_devices(mop500_platform_devs,
|
||||
ARRAY_SIZE(mop500_platform_devs));
|
||||
|
||||
mop500_sdi_init(parent);
|
||||
} else if (of_machine_is_compatible("calaosystems,snowball-a9500")) {
|
||||
snowball_pins_init();
|
||||
platform_add_devices(snowball_platform_devs,
|
||||
ARRAY_SIZE(snowball_platform_devs));
|
||||
|
||||
snowball_sdi_init(parent);
|
||||
} else if (of_machine_is_compatible("st-ericsson,hrefv60+")) {
|
||||
/*
|
||||
* The HREFv60 board removed a GPIO expander and routed
|
||||
* all these GPIO pins to the internal GPIO controller
|
||||
* instead.
|
||||
*/
|
||||
mop500_gpio_keys[0].gpio = HREFV60_PROX_SENSE_GPIO;
|
||||
i2c0_devs -= NUM_PRE_V60_I2C0_DEVICES;
|
||||
hrefv60_pins_init();
|
||||
platform_add_devices(mop500_platform_devs,
|
||||
ARRAY_SIZE(mop500_platform_devs));
|
||||
|
||||
hrefv60_sdi_init(parent);
|
||||
}
|
||||
mop500_i2c_init(parent);
|
||||
|
||||
i2c_register_board_info(0, mop500_i2c0_devices, i2c0_devs);
|
||||
i2c_register_board_info(2, mop500_i2c2_devices,
|
||||
ARRAY_SIZE(mop500_i2c2_devices));
|
||||
|
||||
/* This board has full regulator constraints */
|
||||
regulator_has_full_constraints();
|
||||
}
|
||||
|
||||
static const char * u8500_dt_board_compat[] = {
|
||||
"calaosystems,snowball-a9500",
|
||||
"st-ericsson,hrefv60+",
|
||||
"st-ericsson,u8500",
|
||||
"st-ericsson,mop500",
|
||||
NULL,
|
||||
};
|
||||
|
||||
|
||||
DT_MACHINE_START(U8500_DT, "ST-Ericsson U8500 platform (Device Tree Support)")
|
||||
.map_io = u8500_map_io,
|
||||
.init_irq = ux500_init_irq,
|
||||
/* we re-use nomadik timer here */
|
||||
.timer = &ux500_timer,
|
||||
.handle_irq = gic_handle_irq,
|
||||
.init_machine = u8500_init_machine,
|
||||
.dt_compat = u8500_dt_board_compat,
|
||||
MACHINE_END
|
||||
#endif
|
||||
|
|
|
@ -5,6 +5,8 @@
|
|||
*/
|
||||
|
||||
#include <linux/io.h>
|
||||
#include <linux/of.h>
|
||||
|
||||
#include <asm/cacheflush.h>
|
||||
#include <asm/hardware/cache-l2x0.h>
|
||||
#include <mach/hardware.h>
|
||||
|
@ -45,7 +47,10 @@ static int __init ux500_l2x0_init(void)
|
|||
ux500_l2x0_unlock();
|
||||
|
||||
/* 64KB way size, 8 way associativity, force WA */
|
||||
l2x0_init(l2x0_base, 0x3e060000, 0xc0000fff);
|
||||
if (of_have_populated_dt())
|
||||
l2x0_of_init(0x3e060000, 0xc0000fff);
|
||||
else
|
||||
l2x0_init(l2x0_base, 0x3e060000, 0xc0000fff);
|
||||
|
||||
/*
|
||||
* We can't disable l2 as we are in non secure mode, currently
|
||||
|
|
|
@ -16,6 +16,8 @@
|
|||
#include <linux/err.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/stat.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_irq.h>
|
||||
|
||||
#include <asm/hardware/gic.h>
|
||||
#include <asm/mach/map.h>
|
||||
|
@ -28,6 +30,11 @@
|
|||
|
||||
void __iomem *_PRCMU_BASE;
|
||||
|
||||
static const struct of_device_id ux500_dt_irq_match[] = {
|
||||
{ .compatible = "arm,cortex-a9-gic", .data = gic_of_init, },
|
||||
{},
|
||||
};
|
||||
|
||||
void __init ux500_init_irq(void)
|
||||
{
|
||||
void __iomem *dist_base;
|
||||
|
@ -42,7 +49,12 @@ void __init ux500_init_irq(void)
|
|||
} else
|
||||
ux500_unknown_soc();
|
||||
|
||||
gic_init(0, 29, dist_base, cpu_base);
|
||||
#ifdef CONFIG_OF
|
||||
if (of_have_populated_dt())
|
||||
of_irq_init(ux500_dt_irq_match);
|
||||
else
|
||||
#endif
|
||||
gic_init(0, 29, dist_base, cpu_base);
|
||||
|
||||
/*
|
||||
* Init clocks here so that they are available for system timer
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
#include <linux/io.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/clksrc-dbx500-prcmu.h>
|
||||
#include <linux/of.h>
|
||||
|
||||
#include <asm/smp_twd.h>
|
||||
|
||||
|
@ -30,9 +31,13 @@ static void __init ux500_twd_init(void)
|
|||
twd_local_timer = cpu_is_u5500() ? &u5500_twd_local_timer :
|
||||
&u8500_twd_local_timer;
|
||||
|
||||
err = twd_local_timer_register(twd_local_timer);
|
||||
if (err)
|
||||
pr_err("twd_local_timer_register failed %d\n", err);
|
||||
if (of_have_populated_dt())
|
||||
twd_local_timer_of_register();
|
||||
else {
|
||||
err = twd_local_timer_register(twd_local_timer);
|
||||
if (err)
|
||||
pr_err("twd_local_timer_register failed %d\n", err);
|
||||
}
|
||||
}
|
||||
#else
|
||||
#define ux500_twd_init() do { } while(0)
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
#include <plat/orion_wdt.h>
|
||||
#include <plat/mv_xor.h>
|
||||
#include <plat/ehci-orion.h>
|
||||
#include <mach/bridge-regs.h>
|
||||
|
||||
/* Fill in the resources structure and link it into the platform
|
||||
device structure. There is always a memory region, and nearly
|
||||
|
@ -568,13 +569,17 @@ void __init orion_spi_1_init(unsigned long mapbase,
|
|||
****************************************************************************/
|
||||
static struct orion_wdt_platform_data orion_wdt_data;
|
||||
|
||||
static struct resource orion_wdt_resource =
|
||||
DEFINE_RES_MEM(TIMER_VIRT_BASE, 0x28);
|
||||
|
||||
static struct platform_device orion_wdt_device = {
|
||||
.name = "orion_wdt",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &orion_wdt_data,
|
||||
},
|
||||
.num_resources = 0,
|
||||
.resource = &orion_wdt_resource,
|
||||
.num_resources = 1,
|
||||
};
|
||||
|
||||
void __init orion_wdt_init(unsigned long tclk)
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
#define __PLAT_AUDIO_H
|
||||
|
||||
struct kirkwood_asoc_platform_data {
|
||||
u32 tclk;
|
||||
int burst;
|
||||
};
|
||||
#endif
|
||||
|
|
|
@ -97,6 +97,7 @@ static struct atmel_nand_data atngw100mkii_nand_data __initdata = {
|
|||
.rdy_pin = GPIO_PIN_PB(28),
|
||||
.enable_pin = GPIO_PIN_PE(23),
|
||||
.bus_width_16 = true,
|
||||
.ecc_mode = NAND_ECC_SOFT,
|
||||
.parts = nand_partitions,
|
||||
.num_parts = ARRAY_SIZE(nand_partitions),
|
||||
};
|
||||
|
|
|
@ -95,6 +95,7 @@ static struct atmel_nand_data atstk1006_nand_data __initdata = {
|
|||
.ale = 22,
|
||||
.rdy_pin = GPIO_PIN_PB(30),
|
||||
.enable_pin = GPIO_PIN_PB(29),
|
||||
.ecc_mode = NAND_ECC_SOFT,
|
||||
.parts = nand_partitions,
|
||||
.num_parts = ARRAY_SIZE(num_partitions),
|
||||
};
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
#include <linux/types.h>
|
||||
#include <linux/serial.h>
|
||||
#include <linux/platform_data/macb.h>
|
||||
#include <linux/platform_data/atmel_nand.h>
|
||||
|
||||
#define GPIO_PIN_NONE (-1)
|
||||
|
||||
|
@ -116,18 +117,6 @@ struct platform_device *
|
|||
at32_add_device_cf(unsigned int id, unsigned int extint,
|
||||
struct cf_platform_data *data);
|
||||
|
||||
/* NAND / SmartMedia */
|
||||
struct atmel_nand_data {
|
||||
int enable_pin; /* chip enable */
|
||||
int det_pin; /* card detect */
|
||||
int rdy_pin; /* ready/busy */
|
||||
u8 rdy_pin_active_low; /* rdy_pin value is inverted */
|
||||
u8 ale; /* address line number connected to ALE */
|
||||
u8 cle; /* address line number connected to CLE */
|
||||
u8 bus_width_16; /* buswidth is 16 bit */
|
||||
struct mtd_partition *parts;
|
||||
unsigned int num_parts;
|
||||
};
|
||||
struct platform_device *
|
||||
at32_add_device_nand(unsigned int id, struct atmel_nand_data *data);
|
||||
|
||||
|
|
|
@ -14,8 +14,15 @@
|
|||
#include <linux/module.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/of_gpio.h>
|
||||
#include <linux/of_i2c.h>
|
||||
|
||||
#include <asm/gpio.h>
|
||||
struct i2c_gpio_private_data {
|
||||
struct i2c_adapter adap;
|
||||
struct i2c_algo_bit_data bit_data;
|
||||
struct i2c_gpio_platform_data pdata;
|
||||
};
|
||||
|
||||
/* Toggle SDA by changing the direction of the pin */
|
||||
static void i2c_gpio_setsda_dir(void *data, int state)
|
||||
|
@ -78,24 +85,62 @@ static int i2c_gpio_getscl(void *data)
|
|||
return gpio_get_value(pdata->scl_pin);
|
||||
}
|
||||
|
||||
static int __devinit of_i2c_gpio_probe(struct device_node *np,
|
||||
struct i2c_gpio_platform_data *pdata)
|
||||
{
|
||||
u32 reg;
|
||||
|
||||
if (of_gpio_count(np) < 2)
|
||||
return -ENODEV;
|
||||
|
||||
pdata->sda_pin = of_get_gpio(np, 0);
|
||||
pdata->scl_pin = of_get_gpio(np, 1);
|
||||
|
||||
if (!gpio_is_valid(pdata->sda_pin) || !gpio_is_valid(pdata->scl_pin)) {
|
||||
pr_err("%s: invalid GPIO pins, sda=%d/scl=%d\n",
|
||||
np->full_name, pdata->sda_pin, pdata->scl_pin);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
of_property_read_u32(np, "i2c-gpio,delay-us", &pdata->udelay);
|
||||
|
||||
if (!of_property_read_u32(np, "i2c-gpio,timeout-ms", ®))
|
||||
pdata->timeout = msecs_to_jiffies(reg);
|
||||
|
||||
pdata->sda_is_open_drain =
|
||||
of_property_read_bool(np, "i2c-gpio,sda-open-drain");
|
||||
pdata->scl_is_open_drain =
|
||||
of_property_read_bool(np, "i2c-gpio,scl-open-drain");
|
||||
pdata->scl_is_output_only =
|
||||
of_property_read_bool(np, "i2c-gpio,scl-output-only");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __devinit i2c_gpio_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct i2c_gpio_private_data *priv;
|
||||
struct i2c_gpio_platform_data *pdata;
|
||||
struct i2c_algo_bit_data *bit_data;
|
||||
struct i2c_adapter *adap;
|
||||
int ret;
|
||||
|
||||
pdata = pdev->dev.platform_data;
|
||||
if (!pdata)
|
||||
return -ENXIO;
|
||||
priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
|
||||
if (!priv)
|
||||
return -ENOMEM;
|
||||
adap = &priv->adap;
|
||||
bit_data = &priv->bit_data;
|
||||
pdata = &priv->pdata;
|
||||
|
||||
ret = -ENOMEM;
|
||||
adap = kzalloc(sizeof(struct i2c_adapter), GFP_KERNEL);
|
||||
if (!adap)
|
||||
goto err_alloc_adap;
|
||||
bit_data = kzalloc(sizeof(struct i2c_algo_bit_data), GFP_KERNEL);
|
||||
if (!bit_data)
|
||||
goto err_alloc_bit_data;
|
||||
if (pdev->dev.of_node) {
|
||||
ret = of_i2c_gpio_probe(pdev->dev.of_node, pdata);
|
||||
if (ret)
|
||||
return ret;
|
||||
} else {
|
||||
if (!pdev->dev.platform_data)
|
||||
return -ENXIO;
|
||||
memcpy(pdata, pdev->dev.platform_data, sizeof(*pdata));
|
||||
}
|
||||
|
||||
ret = gpio_request(pdata->sda_pin, "sda");
|
||||
if (ret)
|
||||
|
@ -143,6 +188,7 @@ static int __devinit i2c_gpio_probe(struct platform_device *pdev)
|
|||
adap->algo_data = bit_data;
|
||||
adap->class = I2C_CLASS_HWMON | I2C_CLASS_SPD;
|
||||
adap->dev.parent = &pdev->dev;
|
||||
adap->dev.of_node = pdev->dev.of_node;
|
||||
|
||||
/*
|
||||
* If "dev->id" is negative we consider it as zero.
|
||||
|
@ -154,7 +200,9 @@ static int __devinit i2c_gpio_probe(struct platform_device *pdev)
|
|||
if (ret)
|
||||
goto err_add_bus;
|
||||
|
||||
platform_set_drvdata(pdev, adap);
|
||||
of_i2c_register_devices(adap);
|
||||
|
||||
platform_set_drvdata(pdev, priv);
|
||||
|
||||
dev_info(&pdev->dev, "using pins %u (SDA) and %u (SCL%s)\n",
|
||||
pdata->sda_pin, pdata->scl_pin,
|
||||
|
@ -168,34 +216,40 @@ err_add_bus:
|
|||
err_request_scl:
|
||||
gpio_free(pdata->sda_pin);
|
||||
err_request_sda:
|
||||
kfree(bit_data);
|
||||
err_alloc_bit_data:
|
||||
kfree(adap);
|
||||
err_alloc_adap:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int __devexit i2c_gpio_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct i2c_gpio_private_data *priv;
|
||||
struct i2c_gpio_platform_data *pdata;
|
||||
struct i2c_adapter *adap;
|
||||
|
||||
adap = platform_get_drvdata(pdev);
|
||||
pdata = pdev->dev.platform_data;
|
||||
priv = platform_get_drvdata(pdev);
|
||||
adap = &priv->adap;
|
||||
pdata = &priv->pdata;
|
||||
|
||||
i2c_del_adapter(adap);
|
||||
gpio_free(pdata->scl_pin);
|
||||
gpio_free(pdata->sda_pin);
|
||||
kfree(adap->algo_data);
|
||||
kfree(adap);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_OF)
|
||||
static const struct of_device_id i2c_gpio_dt_ids[] = {
|
||||
{ .compatible = "i2c-gpio", },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
|
||||
MODULE_DEVICE_TABLE(of, i2c_gpio_dt_ids);
|
||||
#endif
|
||||
|
||||
static struct platform_driver i2c_gpio_driver = {
|
||||
.driver = {
|
||||
.name = "i2c-gpio",
|
||||
.owner = THIS_MODULE,
|
||||
.of_match_table = of_match_ptr(i2c_gpio_dt_ids),
|
||||
},
|
||||
.probe = i2c_gpio_probe,
|
||||
.remove = __devexit_p(i2c_gpio_remove),
|
||||
|
|
|
@ -27,6 +27,10 @@
|
|||
#include <linux/module.h>
|
||||
#include <linux/moduleparam.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/of_gpio.h>
|
||||
#include <linux/of_mtd.h>
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/nand.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
|
@ -34,22 +38,10 @@
|
|||
#include <linux/dmaengine.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/platform_data/atmel.h>
|
||||
|
||||
#include <mach/board.h>
|
||||
#include <mach/cpu.h>
|
||||
|
||||
#ifdef CONFIG_MTD_NAND_ATMEL_ECC_HW
|
||||
#define hard_ecc 1
|
||||
#else
|
||||
#define hard_ecc 0
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MTD_NAND_ATMEL_ECC_NONE
|
||||
#define no_ecc 1
|
||||
#else
|
||||
#define no_ecc 0
|
||||
#endif
|
||||
|
||||
static int use_dma = 1;
|
||||
module_param(use_dma, int, 0);
|
||||
|
||||
|
@ -95,7 +87,7 @@ struct atmel_nand_host {
|
|||
struct mtd_info mtd;
|
||||
void __iomem *io_base;
|
||||
dma_addr_t io_phys;
|
||||
struct atmel_nand_data *board;
|
||||
struct atmel_nand_data board;
|
||||
struct device *dev;
|
||||
void __iomem *ecc;
|
||||
|
||||
|
@ -113,8 +105,8 @@ static int cpu_has_dma(void)
|
|||
*/
|
||||
static void atmel_nand_enable(struct atmel_nand_host *host)
|
||||
{
|
||||
if (gpio_is_valid(host->board->enable_pin))
|
||||
gpio_set_value(host->board->enable_pin, 0);
|
||||
if (gpio_is_valid(host->board.enable_pin))
|
||||
gpio_set_value(host->board.enable_pin, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -122,8 +114,8 @@ static void atmel_nand_enable(struct atmel_nand_host *host)
|
|||
*/
|
||||
static void atmel_nand_disable(struct atmel_nand_host *host)
|
||||
{
|
||||
if (gpio_is_valid(host->board->enable_pin))
|
||||
gpio_set_value(host->board->enable_pin, 1);
|
||||
if (gpio_is_valid(host->board.enable_pin))
|
||||
gpio_set_value(host->board.enable_pin, 1);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -144,9 +136,9 @@ static void atmel_nand_cmd_ctrl(struct mtd_info *mtd, int cmd, unsigned int ctrl
|
|||
return;
|
||||
|
||||
if (ctrl & NAND_CLE)
|
||||
writeb(cmd, host->io_base + (1 << host->board->cle));
|
||||
writeb(cmd, host->io_base + (1 << host->board.cle));
|
||||
else
|
||||
writeb(cmd, host->io_base + (1 << host->board->ale));
|
||||
writeb(cmd, host->io_base + (1 << host->board.ale));
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -157,8 +149,8 @@ static int atmel_nand_device_ready(struct mtd_info *mtd)
|
|||
struct nand_chip *nand_chip = mtd->priv;
|
||||
struct atmel_nand_host *host = nand_chip->priv;
|
||||
|
||||
return gpio_get_value(host->board->rdy_pin) ^
|
||||
!!host->board->rdy_pin_active_low;
|
||||
return gpio_get_value(host->board.rdy_pin) ^
|
||||
!!host->board.rdy_pin_active_low;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -273,7 +265,7 @@ static void atmel_read_buf(struct mtd_info *mtd, u8 *buf, int len)
|
|||
if (atmel_nand_dma_op(mtd, buf, len, 1) == 0)
|
||||
return;
|
||||
|
||||
if (host->board->bus_width_16)
|
||||
if (host->board.bus_width_16)
|
||||
atmel_read_buf16(mtd, buf, len);
|
||||
else
|
||||
atmel_read_buf8(mtd, buf, len);
|
||||
|
@ -289,7 +281,7 @@ static void atmel_write_buf(struct mtd_info *mtd, const u8 *buf, int len)
|
|||
if (atmel_nand_dma_op(mtd, (void *)buf, len, 0) == 0)
|
||||
return;
|
||||
|
||||
if (host->board->bus_width_16)
|
||||
if (host->board.bus_width_16)
|
||||
atmel_write_buf16(mtd, buf, len);
|
||||
else
|
||||
atmel_write_buf8(mtd, buf, len);
|
||||
|
@ -481,6 +473,56 @@ static void atmel_nand_hwctl(struct mtd_info *mtd, int mode)
|
|||
}
|
||||
}
|
||||
|
||||
#if defined(CONFIG_OF)
|
||||
static int __devinit atmel_of_init_port(struct atmel_nand_host *host,
|
||||
struct device_node *np)
|
||||
{
|
||||
u32 val;
|
||||
int ecc_mode;
|
||||
struct atmel_nand_data *board = &host->board;
|
||||
enum of_gpio_flags flags;
|
||||
|
||||
if (of_property_read_u32(np, "atmel,nand-addr-offset", &val) == 0) {
|
||||
if (val >= 32) {
|
||||
dev_err(host->dev, "invalid addr-offset %u\n", val);
|
||||
return -EINVAL;
|
||||
}
|
||||
board->ale = val;
|
||||
}
|
||||
|
||||
if (of_property_read_u32(np, "atmel,nand-cmd-offset", &val) == 0) {
|
||||
if (val >= 32) {
|
||||
dev_err(host->dev, "invalid cmd-offset %u\n", val);
|
||||
return -EINVAL;
|
||||
}
|
||||
board->cle = val;
|
||||
}
|
||||
|
||||
ecc_mode = of_get_nand_ecc_mode(np);
|
||||
|
||||
board->ecc_mode = ecc_mode < 0 ? NAND_ECC_SOFT : ecc_mode;
|
||||
|
||||
board->on_flash_bbt = of_get_nand_on_flash_bbt(np);
|
||||
|
||||
if (of_get_nand_bus_width(np) == 16)
|
||||
board->bus_width_16 = 1;
|
||||
|
||||
board->rdy_pin = of_get_gpio_flags(np, 0, &flags);
|
||||
board->rdy_pin_active_low = (flags == OF_GPIO_ACTIVE_LOW);
|
||||
|
||||
board->enable_pin = of_get_gpio(np, 1);
|
||||
board->det_pin = of_get_gpio(np, 2);
|
||||
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
static int __devinit atmel_of_init_port(struct atmel_nand_host *host,
|
||||
struct device_node *np)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Probe for the NAND device.
|
||||
*/
|
||||
|
@ -491,6 +533,7 @@ static int __init atmel_nand_probe(struct platform_device *pdev)
|
|||
struct nand_chip *nand_chip;
|
||||
struct resource *regs;
|
||||
struct resource *mem;
|
||||
struct mtd_part_parser_data ppdata = {};
|
||||
int res;
|
||||
|
||||
mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
|
@ -517,8 +560,15 @@ static int __init atmel_nand_probe(struct platform_device *pdev)
|
|||
|
||||
mtd = &host->mtd;
|
||||
nand_chip = &host->nand_chip;
|
||||
host->board = pdev->dev.platform_data;
|
||||
host->dev = &pdev->dev;
|
||||
if (pdev->dev.of_node) {
|
||||
res = atmel_of_init_port(host, pdev->dev.of_node);
|
||||
if (res)
|
||||
goto err_nand_ioremap;
|
||||
} else {
|
||||
memcpy(&host->board, pdev->dev.platform_data,
|
||||
sizeof(struct atmel_nand_data));
|
||||
}
|
||||
|
||||
nand_chip->priv = host; /* link the private data structures */
|
||||
mtd->priv = nand_chip;
|
||||
|
@ -529,26 +579,25 @@ static int __init atmel_nand_probe(struct platform_device *pdev)
|
|||
nand_chip->IO_ADDR_W = host->io_base;
|
||||
nand_chip->cmd_ctrl = atmel_nand_cmd_ctrl;
|
||||
|
||||
if (gpio_is_valid(host->board->rdy_pin))
|
||||
if (gpio_is_valid(host->board.rdy_pin))
|
||||
nand_chip->dev_ready = atmel_nand_device_ready;
|
||||
|
||||
nand_chip->ecc.mode = host->board.ecc_mode;
|
||||
|
||||
regs = platform_get_resource(pdev, IORESOURCE_MEM, 1);
|
||||
if (!regs && hard_ecc) {
|
||||
if (!regs && nand_chip->ecc.mode == NAND_ECC_HW) {
|
||||
printk(KERN_ERR "atmel_nand: can't get I/O resource "
|
||||
"regs\nFalling back on software ECC\n");
|
||||
nand_chip->ecc.mode = NAND_ECC_SOFT;
|
||||
}
|
||||
|
||||
nand_chip->ecc.mode = NAND_ECC_SOFT; /* enable ECC */
|
||||
if (no_ecc)
|
||||
nand_chip->ecc.mode = NAND_ECC_NONE;
|
||||
if (hard_ecc && regs) {
|
||||
if (nand_chip->ecc.mode == NAND_ECC_HW) {
|
||||
host->ecc = ioremap(regs->start, resource_size(regs));
|
||||
if (host->ecc == NULL) {
|
||||
printk(KERN_ERR "atmel_nand: ioremap failed\n");
|
||||
res = -EIO;
|
||||
goto err_ecc_ioremap;
|
||||
}
|
||||
nand_chip->ecc.mode = NAND_ECC_HW;
|
||||
nand_chip->ecc.calculate = atmel_nand_calculate;
|
||||
nand_chip->ecc.correct = atmel_nand_correct;
|
||||
nand_chip->ecc.hwctl = atmel_nand_hwctl;
|
||||
|
@ -558,7 +607,7 @@ static int __init atmel_nand_probe(struct platform_device *pdev)
|
|||
|
||||
nand_chip->chip_delay = 20; /* 20us command delay time */
|
||||
|
||||
if (host->board->bus_width_16) /* 16-bit bus width */
|
||||
if (host->board.bus_width_16) /* 16-bit bus width */
|
||||
nand_chip->options |= NAND_BUSWIDTH_16;
|
||||
|
||||
nand_chip->read_buf = atmel_read_buf;
|
||||
|
@ -567,15 +616,15 @@ static int __init atmel_nand_probe(struct platform_device *pdev)
|
|||
platform_set_drvdata(pdev, host);
|
||||
atmel_nand_enable(host);
|
||||
|
||||
if (gpio_is_valid(host->board->det_pin)) {
|
||||
if (gpio_get_value(host->board->det_pin)) {
|
||||
if (gpio_is_valid(host->board.det_pin)) {
|
||||
if (gpio_get_value(host->board.det_pin)) {
|
||||
printk(KERN_INFO "No SmartMedia card inserted.\n");
|
||||
res = -ENXIO;
|
||||
goto err_no_card;
|
||||
}
|
||||
}
|
||||
|
||||
if (on_flash_bbt) {
|
||||
if (host->board.on_flash_bbt || on_flash_bbt) {
|
||||
printk(KERN_INFO "atmel_nand: Use On Flash BBT\n");
|
||||
nand_chip->bbt_options |= NAND_BBT_USE_FLASH;
|
||||
}
|
||||
|
@ -650,8 +699,9 @@ static int __init atmel_nand_probe(struct platform_device *pdev)
|
|||
}
|
||||
|
||||
mtd->name = "atmel_nand";
|
||||
res = mtd_device_parse_register(mtd, NULL, 0,
|
||||
host->board->parts, host->board->num_parts);
|
||||
ppdata.of_node = pdev->dev.of_node;
|
||||
res = mtd_device_parse_register(mtd, NULL, &ppdata,
|
||||
host->board.parts, host->board.num_parts);
|
||||
if (!res)
|
||||
return res;
|
||||
|
||||
|
@ -695,11 +745,21 @@ static int __exit atmel_nand_remove(struct platform_device *pdev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_OF)
|
||||
static const struct of_device_id atmel_nand_dt_ids[] = {
|
||||
{ .compatible = "atmel,at91rm9200-nand" },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
|
||||
MODULE_DEVICE_TABLE(of, atmel_nand_dt_ids);
|
||||
#endif
|
||||
|
||||
static struct platform_driver atmel_nand_driver = {
|
||||
.remove = __exit_p(atmel_nand_remove),
|
||||
.driver = {
|
||||
.name = "atmel_nand",
|
||||
.owner = THIS_MODULE,
|
||||
.of_match_table = of_match_ptr(atmel_nand_dt_ids),
|
||||
},
|
||||
};
|
||||
|
||||
|
|
|
@ -91,4 +91,8 @@ config OF_PCI_IRQ
|
|||
help
|
||||
OpenFirmware PCI IRQ routing helpers
|
||||
|
||||
config OF_MTD
|
||||
depends on MTD
|
||||
def_bool y
|
||||
|
||||
endmenu # OF
|
||||
|
|
|
@ -12,3 +12,4 @@ obj-$(CONFIG_OF_SELFTEST) += selftest.o
|
|||
obj-$(CONFIG_OF_MDIO) += of_mdio.o
|
||||
obj-$(CONFIG_OF_PCI) += of_pci.o
|
||||
obj-$(CONFIG_OF_PCI_IRQ) += of_pci_irq.o
|
||||
obj-$(CONFIG_OF_MTD) += of_mtd.o
|
||||
|
|
85
drivers/of/of_mtd.c
Normal file
85
drivers/of/of_mtd.c
Normal file
|
@ -0,0 +1,85 @@
|
|||
/*
|
||||
* Copyright 2012 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
|
||||
*
|
||||
* OF helpers for mtd.
|
||||
*
|
||||
* This file is released under the GPLv2
|
||||
*
|
||||
*/
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/of_mtd.h>
|
||||
#include <linux/mtd/nand.h>
|
||||
#include <linux/export.h>
|
||||
|
||||
/**
|
||||
* It maps 'enum nand_ecc_modes_t' found in include/linux/mtd/nand.h
|
||||
* into the device tree binding of 'nand-ecc', so that MTD
|
||||
* device driver can get nand ecc from device tree.
|
||||
*/
|
||||
static const char *nand_ecc_modes[] = {
|
||||
[NAND_ECC_NONE] = "none",
|
||||
[NAND_ECC_SOFT] = "soft",
|
||||
[NAND_ECC_HW] = "hw",
|
||||
[NAND_ECC_HW_SYNDROME] = "hw_syndrome",
|
||||
[NAND_ECC_HW_OOB_FIRST] = "hw_oob_first",
|
||||
[NAND_ECC_SOFT_BCH] = "soft_bch",
|
||||
};
|
||||
|
||||
/**
|
||||
* of_get_nand_ecc_mode - Get nand ecc mode for given device_node
|
||||
* @np: Pointer to the given device_node
|
||||
*
|
||||
* The function gets ecc mode string from property 'nand-ecc-mode',
|
||||
* and return its index in nand_ecc_modes table, or errno in error case.
|
||||
*/
|
||||
const int of_get_nand_ecc_mode(struct device_node *np)
|
||||
{
|
||||
const char *pm;
|
||||
int err, i;
|
||||
|
||||
err = of_property_read_string(np, "nand-ecc-mode", &pm);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(nand_ecc_modes); i++)
|
||||
if (!strcasecmp(pm, nand_ecc_modes[i]))
|
||||
return i;
|
||||
|
||||
return -ENODEV;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(of_get_nand_ecc_mode);
|
||||
|
||||
/**
|
||||
* of_get_nand_bus_width - Get nand bus witdh for given device_node
|
||||
* @np: Pointer to the given device_node
|
||||
*
|
||||
* return bus width option, or errno in error case.
|
||||
*/
|
||||
int of_get_nand_bus_width(struct device_node *np)
|
||||
{
|
||||
u32 val;
|
||||
|
||||
if (of_property_read_u32(np, "nand-bus-width", &val))
|
||||
return 8;
|
||||
|
||||
switch(val) {
|
||||
case 8:
|
||||
case 16:
|
||||
return val;
|
||||
default:
|
||||
return -EIO;
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(of_get_nand_bus_width);
|
||||
|
||||
/**
|
||||
* of_get_nand_on_flash_bbt - Get nand on flash bbt for given device_node
|
||||
* @np: Pointer to the given device_node
|
||||
*
|
||||
* return true if present false other wise
|
||||
*/
|
||||
bool of_get_nand_on_flash_bbt(struct device_node *np)
|
||||
{
|
||||
return of_property_read_bool(np, "nand-on-flash-bbt");
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(of_get_nand_on_flash_bbt);
|
|
@ -12,6 +12,7 @@
|
|||
#include <linux/bcd.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/gfp.h>
|
||||
#include <linux/module.h>
|
||||
|
@ -294,11 +295,19 @@ static int __exit mv_rtc_remove(struct platform_device *pdev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
static struct of_device_id rtc_mv_of_match_table[] = {
|
||||
{ .compatible = "mrvl,orion-rtc", },
|
||||
{}
|
||||
};
|
||||
#endif
|
||||
|
||||
static struct platform_driver mv_rtc_driver = {
|
||||
.remove = __exit_p(mv_rtc_remove),
|
||||
.driver = {
|
||||
.name = "rtc-mv",
|
||||
.owner = THIS_MODULE,
|
||||
.of_match_table = of_match_ptr(rtc_mv_of_match_table),
|
||||
},
|
||||
};
|
||||
|
||||
|
|
|
@ -359,11 +359,6 @@ static int orion_spi_setup(struct spi_device *spi)
|
|||
|
||||
orion_spi = spi_master_get_devdata(spi->master);
|
||||
|
||||
/* Fix ac timing if required. */
|
||||
if (orion_spi->spi_info->enable_clock_fix)
|
||||
orion_spi_setbits(orion_spi, ORION_SPI_IF_CONFIG_REG,
|
||||
(1 << 14));
|
||||
|
||||
if ((spi->max_speed_hz == 0)
|
||||
|| (spi->max_speed_hz > orion_spi->max_speed))
|
||||
spi->max_speed_hz = orion_spi->max_speed;
|
||||
|
|
|
@ -2,4 +2,4 @@
|
|||
# Makefile for the RMI4 touchscreen driver.
|
||||
#
|
||||
obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_I2C_RMI4) += synaptics_i2c_rmi4.o
|
||||
obj-$(CONFIG_MACH_U8500) += board-mop500-u8500uib-rmi4.o
|
||||
obj-$(CONFIG_MACH_MOP500) += board-mop500-u8500uib-rmi4.o
|
||||
|
|
|
@ -44,7 +44,7 @@ config USB_ARCH_HAS_EHCI
|
|||
default y if PPC_MPC512x
|
||||
default y if ARCH_IXP4XX
|
||||
default y if ARCH_W90X900
|
||||
default y if ARCH_AT91SAM9G45
|
||||
default y if ARCH_AT91
|
||||
default y if ARCH_MXC
|
||||
default y if ARCH_OMAP3
|
||||
default y if ARCH_CNS3XXX
|
||||
|
|
|
@ -137,7 +137,7 @@ choice
|
|||
|
||||
config USB_AT91
|
||||
tristate "Atmel AT91 USB Device Port"
|
||||
depends on ARCH_AT91 && !ARCH_AT91SAM9RL && !ARCH_AT91SAM9G45
|
||||
depends on ARCH_AT91
|
||||
help
|
||||
Many Atmel AT91 processors (such as the AT91RM2000) have a
|
||||
full speed USB Device Port with support for five configurable
|
||||
|
|
|
@ -29,6 +29,8 @@
|
|||
#include <linux/clk.h>
|
||||
#include <linux/usb/ch9.h>
|
||||
#include <linux/usb/gadget.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_gpio.h>
|
||||
|
||||
#include <asm/byteorder.h>
|
||||
#include <mach/hardware.h>
|
||||
|
@ -1707,7 +1709,27 @@ static void at91udc_shutdown(struct platform_device *dev)
|
|||
spin_unlock_irqrestore(&udc->lock, flags);
|
||||
}
|
||||
|
||||
static int __init at91udc_probe(struct platform_device *pdev)
|
||||
static void __devinit at91udc_of_init(struct at91_udc *udc,
|
||||
struct device_node *np)
|
||||
{
|
||||
struct at91_udc_data *board = &udc->board;
|
||||
u32 val;
|
||||
enum of_gpio_flags flags;
|
||||
|
||||
if (of_property_read_u32(np, "atmel,vbus-polled", &val) == 0)
|
||||
board->vbus_polled = 1;
|
||||
|
||||
board->vbus_pin = of_get_named_gpio_flags(np, "atmel,vbus-gpio", 0,
|
||||
&flags);
|
||||
board->vbus_active_low = (flags & OF_GPIO_ACTIVE_LOW) ? 1 : 0;
|
||||
|
||||
board->pullup_pin = of_get_named_gpio_flags(np, "atmel,pullup-gpio", 0,
|
||||
&flags);
|
||||
|
||||
board->pullup_active_low = (flags & OF_GPIO_ACTIVE_LOW) ? 1 : 0;
|
||||
}
|
||||
|
||||
static int __devinit at91udc_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
struct at91_udc *udc;
|
||||
|
@ -1742,7 +1764,11 @@ static int __init at91udc_probe(struct platform_device *pdev)
|
|||
/* init software state */
|
||||
udc = &controller;
|
||||
udc->gadget.dev.parent = dev;
|
||||
udc->board = *(struct at91_udc_data *) dev->platform_data;
|
||||
if (pdev->dev.of_node)
|
||||
at91udc_of_init(udc, pdev->dev.of_node);
|
||||
else
|
||||
memcpy(&udc->board, dev->platform_data,
|
||||
sizeof(struct at91_udc_data));
|
||||
udc->pdev = pdev;
|
||||
udc->enabled = 0;
|
||||
spin_lock_init(&udc->lock);
|
||||
|
@ -1971,6 +1997,15 @@ static int at91udc_resume(struct platform_device *pdev)
|
|||
#define at91udc_resume NULL
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_OF)
|
||||
static const struct of_device_id at91_udc_dt_ids[] = {
|
||||
{ .compatible = "atmel,at91rm9200-udc" },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
|
||||
MODULE_DEVICE_TABLE(of, at91_udc_dt_ids);
|
||||
#endif
|
||||
|
||||
static struct platform_driver at91_udc_driver = {
|
||||
.remove = __exit_p(at91udc_remove),
|
||||
.shutdown = at91udc_shutdown,
|
||||
|
@ -1979,6 +2014,7 @@ static struct platform_driver at91_udc_driver = {
|
|||
.driver = {
|
||||
.name = (char *) driver_name,
|
||||
.owner = THIS_MODULE,
|
||||
.of_match_table = of_match_ptr(at91_udc_dt_ids),
|
||||
},
|
||||
};
|
||||
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
|
||||
#include <linux/clk.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/of_platform.h>
|
||||
|
||||
/* interface and function clocks */
|
||||
static struct clk *iclk, *fclk;
|
||||
|
@ -115,6 +116,8 @@ static const struct hc_driver ehci_atmel_hc_driver = {
|
|||
.clear_tt_buffer_complete = ehci_clear_tt_buffer_complete,
|
||||
};
|
||||
|
||||
static u64 at91_ehci_dma_mask = DMA_BIT_MASK(32);
|
||||
|
||||
static int __devinit ehci_atmel_drv_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct usb_hcd *hcd;
|
||||
|
@ -137,6 +140,13 @@ static int __devinit ehci_atmel_drv_probe(struct platform_device *pdev)
|
|||
goto fail_create_hcd;
|
||||
}
|
||||
|
||||
/* Right now device-tree probed devices don't get dma_mask set.
|
||||
* Since shared usb code relies on it, set it here for now.
|
||||
* Once we have dma capability bindings this can go away.
|
||||
*/
|
||||
if (!pdev->dev.dma_mask)
|
||||
pdev->dev.dma_mask = &at91_ehci_dma_mask;
|
||||
|
||||
hcd = usb_create_hcd(driver, &pdev->dev, dev_name(&pdev->dev));
|
||||
if (!hcd) {
|
||||
retval = -ENOMEM;
|
||||
|
@ -225,9 +235,21 @@ static int __devexit ehci_atmel_drv_remove(struct platform_device *pdev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
static const struct of_device_id atmel_ehci_dt_ids[] = {
|
||||
{ .compatible = "atmel,at91sam9g45-ehci" },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
|
||||
MODULE_DEVICE_TABLE(of, atmel_ehci_dt_ids);
|
||||
#endif
|
||||
|
||||
static struct platform_driver ehci_atmel_driver = {
|
||||
.probe = ehci_atmel_drv_probe,
|
||||
.remove = __devexit_p(ehci_atmel_drv_remove),
|
||||
.shutdown = usb_hcd_platform_shutdown,
|
||||
.driver.name = "atmel-ehci",
|
||||
.driver = {
|
||||
.name = "atmel-ehci",
|
||||
.of_match_table = of_match_ptr(atmel_ehci_dt_ids),
|
||||
},
|
||||
};
|
||||
|
|
|
@ -14,6 +14,8 @@
|
|||
|
||||
#include <linux/clk.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/of_gpio.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <asm/gpio.h>
|
||||
|
@ -477,13 +479,109 @@ static irqreturn_t ohci_hcd_at91_overcurrent_irq(int irq, void *data)
|
|||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
static const struct of_device_id at91_ohci_dt_ids[] = {
|
||||
{ .compatible = "atmel,at91rm9200-ohci" },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
|
||||
MODULE_DEVICE_TABLE(of, at91_ohci_dt_ids);
|
||||
|
||||
static u64 at91_ohci_dma_mask = DMA_BIT_MASK(32);
|
||||
|
||||
static int __devinit ohci_at91_of_init(struct platform_device *pdev)
|
||||
{
|
||||
struct device_node *np = pdev->dev.of_node;
|
||||
int i, ret, gpio;
|
||||
enum of_gpio_flags flags;
|
||||
struct at91_usbh_data *pdata;
|
||||
u32 ports;
|
||||
|
||||
if (!np)
|
||||
return 0;
|
||||
|
||||
/* Right now device-tree probed devices don't get dma_mask set.
|
||||
* Since shared usb code relies on it, set it here for now.
|
||||
* Once we have dma capability bindings this can go away.
|
||||
*/
|
||||
if (!pdev->dev.dma_mask)
|
||||
pdev->dev.dma_mask = &at91_ohci_dma_mask;
|
||||
|
||||
pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);
|
||||
if (!pdata)
|
||||
return -ENOMEM;
|
||||
|
||||
if (!of_property_read_u32(np, "num-ports", &ports))
|
||||
pdata->ports = ports;
|
||||
|
||||
for (i = 0; i < 2; i++) {
|
||||
gpio = of_get_named_gpio_flags(np, "atmel,vbus-gpio", i, &flags);
|
||||
pdata->vbus_pin[i] = gpio;
|
||||
if (!gpio_is_valid(gpio))
|
||||
continue;
|
||||
pdata->vbus_pin_active_low[i] = flags & OF_GPIO_ACTIVE_LOW;
|
||||
ret = gpio_request(gpio, "ohci_vbus");
|
||||
if (ret) {
|
||||
dev_warn(&pdev->dev, "can't request vbus gpio %d", gpio);
|
||||
continue;
|
||||
}
|
||||
ret = gpio_direction_output(gpio, !(flags & OF_GPIO_ACTIVE_LOW) ^ 1);
|
||||
if (ret)
|
||||
dev_warn(&pdev->dev, "can't put vbus gpio %d as output %d",
|
||||
!(flags & OF_GPIO_ACTIVE_LOW) ^ 1, gpio);
|
||||
}
|
||||
|
||||
for (i = 0; i < 2; i++) {
|
||||
gpio = of_get_named_gpio_flags(np, "atmel,oc-gpio", i, &flags);
|
||||
pdata->overcurrent_pin[i] = gpio;
|
||||
if (!gpio_is_valid(gpio))
|
||||
continue;
|
||||
ret = gpio_request(gpio, "ohci_overcurrent");
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "can't request overcurrent gpio %d", gpio);
|
||||
continue;
|
||||
}
|
||||
|
||||
ret = gpio_direction_input(gpio);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "can't configure overcurrent gpio %d as input", gpio);
|
||||
continue;
|
||||
}
|
||||
|
||||
ret = request_irq(gpio_to_irq(gpio),
|
||||
ohci_hcd_at91_overcurrent_irq,
|
||||
IRQF_SHARED, "ohci_overcurrent", pdev);
|
||||
if (ret) {
|
||||
gpio_free(gpio);
|
||||
dev_warn(& pdev->dev, "cannot get GPIO IRQ for overcurrent\n");
|
||||
}
|
||||
}
|
||||
|
||||
pdev->dev.platform_data = pdata;
|
||||
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
static int __devinit ohci_at91_of_init(struct platform_device *pdev)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
static int ohci_hcd_at91_drv_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct at91_usbh_data *pdata = pdev->dev.platform_data;
|
||||
struct at91_usbh_data *pdata;
|
||||
int i;
|
||||
|
||||
i = ohci_at91_of_init(pdev);
|
||||
|
||||
if (i)
|
||||
return i;
|
||||
|
||||
pdata = pdev->dev.platform_data;
|
||||
|
||||
if (pdata) {
|
||||
for (i = 0; i < ARRAY_SIZE(pdata->vbus_pin); i++) {
|
||||
if (!gpio_is_valid(pdata->vbus_pin[i]))
|
||||
|
@ -596,5 +694,6 @@ static struct platform_driver ohci_hcd_at91_driver = {
|
|||
.driver = {
|
||||
.name = "at91_ohci",
|
||||
.owner = THIS_MODULE,
|
||||
.of_match_table = of_match_ptr(at91_ohci_dt_ids),
|
||||
},
|
||||
};
|
||||
|
|
|
@ -28,9 +28,9 @@
|
|||
/*
|
||||
* Watchdog timer block registers.
|
||||
*/
|
||||
#define TIMER_CTRL (TIMER_VIRT_BASE + 0x0000)
|
||||
#define TIMER_CTRL 0x0000
|
||||
#define WDT_EN 0x0010
|
||||
#define WDT_VAL (TIMER_VIRT_BASE + 0x0024)
|
||||
#define WDT_VAL 0x0024
|
||||
|
||||
#define WDT_MAX_CYCLE_COUNT 0xffffffff
|
||||
#define WDT_IN_USE 0
|
||||
|
@ -40,6 +40,7 @@ static int nowayout = WATCHDOG_NOWAYOUT;
|
|||
static int heartbeat = -1; /* module parameter (seconds) */
|
||||
static unsigned int wdt_max_duration; /* (seconds) */
|
||||
static unsigned int wdt_tclk;
|
||||
static void __iomem *wdt_reg;
|
||||
static unsigned long wdt_status;
|
||||
static DEFINE_SPINLOCK(wdt_lock);
|
||||
|
||||
|
@ -48,7 +49,7 @@ static void orion_wdt_ping(void)
|
|||
spin_lock(&wdt_lock);
|
||||
|
||||
/* Reload watchdog duration */
|
||||
writel(wdt_tclk * heartbeat, WDT_VAL);
|
||||
writel(wdt_tclk * heartbeat, wdt_reg + WDT_VAL);
|
||||
|
||||
spin_unlock(&wdt_lock);
|
||||
}
|
||||
|
@ -60,7 +61,7 @@ static void orion_wdt_enable(void)
|
|||
spin_lock(&wdt_lock);
|
||||
|
||||
/* Set watchdog duration */
|
||||
writel(wdt_tclk * heartbeat, WDT_VAL);
|
||||
writel(wdt_tclk * heartbeat, wdt_reg + WDT_VAL);
|
||||
|
||||
/* Clear watchdog timer interrupt */
|
||||
reg = readl(BRIDGE_CAUSE);
|
||||
|
@ -68,9 +69,9 @@ static void orion_wdt_enable(void)
|
|||
writel(reg, BRIDGE_CAUSE);
|
||||
|
||||
/* Enable watchdog timer */
|
||||
reg = readl(TIMER_CTRL);
|
||||
reg = readl(wdt_reg + TIMER_CTRL);
|
||||
reg |= WDT_EN;
|
||||
writel(reg, TIMER_CTRL);
|
||||
writel(reg, wdt_reg + TIMER_CTRL);
|
||||
|
||||
/* Enable reset on watchdog */
|
||||
reg = readl(RSTOUTn_MASK);
|
||||
|
@ -92,9 +93,9 @@ static void orion_wdt_disable(void)
|
|||
writel(reg, RSTOUTn_MASK);
|
||||
|
||||
/* Disable watchdog timer */
|
||||
reg = readl(TIMER_CTRL);
|
||||
reg = readl(wdt_reg + TIMER_CTRL);
|
||||
reg &= ~WDT_EN;
|
||||
writel(reg, TIMER_CTRL);
|
||||
writel(reg, wdt_reg + TIMER_CTRL);
|
||||
|
||||
spin_unlock(&wdt_lock);
|
||||
}
|
||||
|
@ -102,7 +103,7 @@ static void orion_wdt_disable(void)
|
|||
static int orion_wdt_get_timeleft(int *time_left)
|
||||
{
|
||||
spin_lock(&wdt_lock);
|
||||
*time_left = readl(WDT_VAL) / wdt_tclk;
|
||||
*time_left = readl(wdt_reg + WDT_VAL) / wdt_tclk;
|
||||
spin_unlock(&wdt_lock);
|
||||
return 0;
|
||||
}
|
||||
|
@ -236,6 +237,7 @@ static struct miscdevice orion_wdt_miscdev = {
|
|||
static int __devinit orion_wdt_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct orion_wdt_platform_data *pdata = pdev->dev.platform_data;
|
||||
struct resource *res;
|
||||
int ret;
|
||||
|
||||
if (pdata) {
|
||||
|
@ -245,6 +247,10 @@ static int __devinit orion_wdt_probe(struct platform_device *pdev)
|
|||
return -ENODEV;
|
||||
}
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
|
||||
wdt_reg = ioremap(res->start, resource_size(res));
|
||||
|
||||
if (orion_wdt_miscdev.parent)
|
||||
return -EBUSY;
|
||||
orion_wdt_miscdev.parent = &pdev->dev;
|
||||
|
|
|
@ -361,6 +361,22 @@ static inline int of_machine_is_compatible(const char *compat)
|
|||
#define of_match_node(_matches, _node) NULL
|
||||
#endif /* CONFIG_OF */
|
||||
|
||||
/**
|
||||
* of_property_read_bool - Findfrom a property
|
||||
* @np: device node from which the property value is to be read.
|
||||
* @propname: name of the property to be searched.
|
||||
*
|
||||
* Search for a property in a device node.
|
||||
* Returns true if the property exist false otherwise.
|
||||
*/
|
||||
static inline bool of_property_read_bool(const struct device_node *np,
|
||||
const char *propname)
|
||||
{
|
||||
struct property *prop = of_find_property(np, propname, NULL);
|
||||
|
||||
return prop ? true : false;
|
||||
}
|
||||
|
||||
static inline int of_property_read_u32(const struct device_node *np,
|
||||
const char *propname,
|
||||
u32 *out_value)
|
||||
|
|
19
include/linux/of_mtd.h
Normal file
19
include/linux/of_mtd.h
Normal file
|
@ -0,0 +1,19 @@
|
|||
/*
|
||||
* Copyright 2012 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
|
||||
*
|
||||
* OF helpers for mtd.
|
||||
*
|
||||
* This file is released under the GPLv2
|
||||
*/
|
||||
|
||||
#ifndef __LINUX_OF_MTD_H
|
||||
#define __LINUX_OF_NET_H
|
||||
|
||||
#ifdef CONFIG_OF_MTD
|
||||
#include <linux/of.h>
|
||||
extern const int of_get_nand_ecc_mode(struct device_node *np);
|
||||
int of_get_nand_bus_width(struct device_node *np);
|
||||
bool of_get_nand_on_flash_bbt(struct device_node *np);
|
||||
#endif
|
||||
|
||||
#endif /* __LINUX_OF_MTD_H */
|
27
include/linux/platform_data/atmel.h
Normal file
27
include/linux/platform_data/atmel.h
Normal file
|
@ -0,0 +1,27 @@
|
|||
/*
|
||||
* atmel platform data
|
||||
*
|
||||
* GPL v2 Only
|
||||
*/
|
||||
|
||||
#ifndef __ATMEL_NAND_H__
|
||||
#define __ATMEL_NAND_H__
|
||||
|
||||
#include <linux/mtd/nand.h>
|
||||
|
||||
/* NAND / SmartMedia */
|
||||
struct atmel_nand_data {
|
||||
int enable_pin; /* chip enable */
|
||||
int det_pin; /* card detect */
|
||||
int rdy_pin; /* ready/busy */
|
||||
u8 rdy_pin_active_low; /* rdy_pin value is inverted */
|
||||
u8 ale; /* address line number connected to ALE */
|
||||
u8 cle; /* address line number connected to CLE */
|
||||
u8 bus_width_16; /* buswidth is 16 bit */
|
||||
u8 ecc_mode; /* ecc mode */
|
||||
u8 on_flash_bbt; /* bbt on flash */
|
||||
struct mtd_partition *parts;
|
||||
unsigned int num_parts;
|
||||
};
|
||||
|
||||
#endif /* __ATMEL_NAND_H__ */
|
|
@ -11,7 +11,6 @@
|
|||
|
||||
struct orion_spi_info {
|
||||
u32 tclk; /* no <linux/clk.h> support yet */
|
||||
u32 enable_clock_fix;
|
||||
};
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue