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
					
				| @ -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 New Issue
	
	Block a user