|  | * Device tree bindings for Texas instruments AEMIF controller | 
|  |  | 
|  | The Async External Memory Interface (EMIF16/AEMIF) controller is intended to | 
|  | provide a glue-less interface to a variety of asynchronous memory devices like | 
|  | ASRA M, NOR and NAND memory. A total of 256M bytes of any of these memories | 
|  | can be accessed at any given time via four chip selects with 64M byte access | 
|  | per chip select. Synchronous memories such as DDR1 SD RAM, SDR SDRAM | 
|  | and Mobile SDR are not supported. | 
|  |  | 
|  | Documentation: | 
|  | Davinci DM646x - http://www.ti.com/lit/ug/sprueq7c/sprueq7c.pdf | 
|  | OMAP-L138 (DA850) - http://www.ti.com/lit/ug/spruh77a/spruh77a.pdf | 
|  | Kestone - http://www.ti.com/lit/ug/sprugz3a/sprugz3a.pdf | 
|  |  | 
|  | Required properties: | 
|  |  | 
|  | - compatible:		"ti,davinci-aemif" | 
|  | "ti,keystone-aemif" | 
|  | "ti,da850-aemif" | 
|  |  | 
|  | - reg:			contains offset/length value for AEMIF control registers | 
|  | space. | 
|  |  | 
|  | - #address-cells:	Must be 2. The partition number has to be encoded in the | 
|  | first address cell and it may accept values 0..N-1 | 
|  | (N - total number of partitions). It's recommended to | 
|  | assign N-1 number for the control partition. The second | 
|  | cell is the offset into the partition. | 
|  |  | 
|  | - #size-cells:		Must be set to 1. | 
|  |  | 
|  | - ranges:		Contains memory regions. There are two types of | 
|  | ranges/partitions: | 
|  | - CS-specific partition/range. If continuous, must be | 
|  | set up to reflect the memory layout for 4 chipselects, | 
|  | if not then additional range/partition can be added and | 
|  | child device can select the proper one. | 
|  | - control partition which is common for all CS | 
|  | interfaces. | 
|  |  | 
|  | - clocks:		the clock feeding the controller clock. Required only | 
|  | if clock tree data present in device tree. | 
|  | See clock-bindings.txt | 
|  |  | 
|  | - clock-names:		clock name. It has to be "aemif". Required only if clock | 
|  | tree data present in device tree, in another case don't | 
|  | use it. | 
|  | See clock-bindings.txt | 
|  |  | 
|  | - clock-ranges:		Empty property indicating that child nodes can inherit | 
|  | named clocks. Required only if clock tree data present | 
|  | in device tree. | 
|  | See clock-bindings.txt | 
|  |  | 
|  |  | 
|  | Child chip-select (cs) nodes contain the memory devices nodes connected to | 
|  | such as NOR (e.g. cfi-flash) and NAND (ti,davinci-nand, see davinci-nand.txt). | 
|  | There might be board specific devices like FPGAs. | 
|  |  | 
|  | Required child cs node properties: | 
|  |  | 
|  | - #address-cells:	Must be 2. | 
|  |  | 
|  | - #size-cells:		Must be 1. | 
|  |  | 
|  | - ranges:		Empty property indicating that child nodes can inherit | 
|  | memory layout. | 
|  |  | 
|  | - clock-ranges:		Empty property indicating that child nodes can inherit | 
|  | named clocks. Required only if clock tree data present | 
|  | in device tree. | 
|  |  | 
|  | - ti,cs-chipselect:	number of chipselect. Indicates on the aemif driver | 
|  | which chipselect is used for accessing the memory. For | 
|  | compatibles "ti,davinci-aemif" and "ti,keystone-aemif" | 
|  | it can be in range [0-3]. For compatible | 
|  | "ti,da850-aemif" range is [2-5]. | 
|  |  | 
|  | Optional child cs node properties: | 
|  |  | 
|  | - ti,cs-bus-width:		width of the asynchronous device's data bus | 
|  | 8 or 16 if not preset 8 | 
|  |  | 
|  | - ti,cs-select-strobe-mode:	enable/disable select strobe mode | 
|  | In select strobe mode chip select behaves as | 
|  | the strobe and is active only during the strobe | 
|  | period. If present then enable. | 
|  |  | 
|  | - ti,cs-extended-wait-mode:	enable/disable extended wait mode | 
|  | if set, the controller monitors the EMIFWAIT pin | 
|  | mapped to that chip select to determine if the | 
|  | device wants to extend the strobe period. If | 
|  | present then enable. | 
|  |  | 
|  | - ti,cs-min-turnaround-ns:	minimum turn around time, ns | 
|  | Time between the end of one asynchronous memory | 
|  | access and the start of another asynchronous | 
|  | memory access. This delay is not incurred | 
|  | between a read followed by read or a write | 
|  | followed by a write to same chip select. | 
|  |  | 
|  | - ti,cs-read-setup-ns:		read setup width, ns | 
|  | Time between the beginning of a memory cycle | 
|  | and the activation of read strobe. | 
|  | Minimum value is 1 (0 treated as 1). | 
|  |  | 
|  | - ti,cs-read-strobe-ns:		read strobe width, ns | 
|  | Time between the activation and deactivation of | 
|  | the read strobe. | 
|  | Minimum value is 1 (0 treated as 1). | 
|  |  | 
|  | - ti,cs-read-hold-ns:		read hold width, ns | 
|  | Time between the deactivation of the read | 
|  | strobe and the end of the cycle (which may be | 
|  | either an address change or the deactivation of | 
|  | the chip select signal. | 
|  | Minimum value is 1 (0 treated as 1). | 
|  |  | 
|  | - ti,cs-write-setup-ns:		write setup width, ns | 
|  | Time between the beginning of a memory cycle | 
|  | and the activation of write strobe. | 
|  | Minimum value is 1 (0 treated as 1). | 
|  |  | 
|  | - ti,cs-write-strobe-ns:	write strobe width, ns | 
|  | Time between the activation and deactivation of | 
|  | the write strobe. | 
|  | Minimum value is 1 (0 treated as 1). | 
|  |  | 
|  | - ti,cs-write-hold-ns:		write hold width, ns | 
|  | Time between the deactivation of the write | 
|  | strobe and the end of the cycle (which may be | 
|  | either an address change or the deactivation of | 
|  | the chip select signal. | 
|  | Minimum value is 1 (0 treated as 1). | 
|  |  | 
|  | If any of the above parameters are absent, current parameter value will be taken | 
|  | from the corresponding HW reg. | 
|  |  | 
|  | Example for aemif, davinci nand and nor flash chip select shown below. | 
|  |  | 
|  | memory-controller@21000a00 { | 
|  | compatible = "ti,davinci-aemif"; | 
|  | #address-cells = <2>; | 
|  | #size-cells = <1>; | 
|  | clocks = <&clkaemif 0>; | 
|  | clock-names = "aemif"; | 
|  | clock-ranges; | 
|  | reg = <0x21000A00 0x00000100>; | 
|  | ranges = <0 0 0x70000000 0x10000000 | 
|  | 1 0 0x21000A00 0x00000100>; | 
|  | /* | 
|  | * Partition0: CS-specific memory range which is | 
|  | * implemented as continuous physical memory region | 
|  | * Partition1: control memory range | 
|  | */ | 
|  |  | 
|  | nand:cs2 { | 
|  | #address-cells = <2>; | 
|  | #size-cells = <1>; | 
|  | clock-ranges; | 
|  | ranges; | 
|  |  | 
|  | ti,cs-chipselect = <2>; | 
|  | /* all timings in nanoseconds */ | 
|  | ti,cs-min-turnaround-ns = <0>; | 
|  | ti,cs-read-hold-ns = <7>; | 
|  | ti,cs-read-strobe-ns = <42>; | 
|  | ti,cs-read-setup-ns = <14>; | 
|  | ti,cs-write-hold-ns = <7>; | 
|  | ti,cs-write-strobe-ns = <42>; | 
|  | ti,cs-write-setup-ns = <14>; | 
|  |  | 
|  | nand@0,0x8000000 { | 
|  | compatible = "ti,davinci-nand"; | 
|  | reg = <0 0x8000000 0x4000000 | 
|  | 1 0x0000000 0x0000100>; | 
|  | /* | 
|  | * Partition0, offset 0x8000000, size 0x4000000 | 
|  | * Partition1, offset 0x0000000, size 0x0000100 | 
|  | */ | 
|  |  | 
|  | .. see davinci-nand.txt | 
|  | }; | 
|  | }; | 
|  |  | 
|  | nor:cs0 { | 
|  | #address-cells = <2>; | 
|  | #size-cells = <1>; | 
|  | clock-ranges; | 
|  | ranges; | 
|  |  | 
|  | ti,cs-chipselect = <0>; | 
|  | /* all timings in nanoseconds */ | 
|  | ti,cs-min-turnaround-ns = <0>; | 
|  | ti,cs-read-hold-ns = <8>; | 
|  | ti,cs-read-strobe-ns = <40>; | 
|  | ti,cs-read-setup-ns = <14>; | 
|  | ti,cs-write-hold-ns = <7>; | 
|  | ti,cs-write-strobe-ns = <40>; | 
|  | ti,cs-write-setup-ns = <14>; | 
|  | ti,cs-bus-width = <16>; | 
|  |  | 
|  | flash@0,0x0000000 { | 
|  | compatible = "cfi-flash"; | 
|  | reg = <0 0x0000000 0x4000000>; | 
|  |  | 
|  | ... | 
|  | }; | 
|  | }; | 
|  | }; |