| * 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>; |
| |
| ... |
| }; |
| }; |
| }; |