forked from Minki/linux
3edad321b1
Marvell EBU SoCs such as Armada 370/XP, Orion5x (88f5xxx) and Discovery (mv78xx0) supports a Device Bus controller to access several kinds of memories and I/O devices (NOR, NAND, SRAM, FPGA). This commit adds a driver to handle this controller. So far only Armada 370, Armada XP and Discovery SoCs are supported. The driver must be registered through a device tree node; as explained in the binding document. For each child node in the device tree, this driver will: * set timing parameters * register a child device * setup an address decoding window, using the mbus driver Keep in mind the address decoding window setup is only a temporary hack. This code will be removed from this devbus driver as soon as a proper device tree binding for the mbus driver is added. Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com> Acked-by: Arnd Bergmann <arnd@arndb.de> Acked-by: Jason Cooper <jason@lakedaemon.net> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
157 lines
5.7 KiB
Plaintext
157 lines
5.7 KiB
Plaintext
Device tree bindings for MVEBU Device Bus controllers
|
|
|
|
The Device Bus controller available in some Marvell's SoC allows to control
|
|
different types of standard memory and I/O devices such as NOR, NAND, and FPGA.
|
|
The actual devices are instantiated from the child nodes of a Device Bus node.
|
|
|
|
Required properties:
|
|
|
|
- compatible: Currently only Armada 370/XP SoC are supported,
|
|
with this compatible string:
|
|
|
|
marvell,mvebu-devbus
|
|
|
|
- reg: A resource specifier for the register space.
|
|
This is the base address of a chip select within
|
|
the controller's register space.
|
|
(see the example below)
|
|
|
|
- #address-cells: Must be set to 1
|
|
- #size-cells: Must be set to 1
|
|
- ranges: Must be set up to reflect the memory layout with four
|
|
integer values for each chip-select line in use:
|
|
0 <physical address of mapping> <size>
|
|
|
|
Mandatory timing properties for child nodes:
|
|
|
|
Read parameters:
|
|
|
|
- devbus,turn-off-ps: Defines the time during which the controller does not
|
|
drive the AD bus after the completion of a device read.
|
|
This prevents contentions on the Device Bus after a read
|
|
cycle from a slow device.
|
|
|
|
- devbus,bus-width: Defines the bus width (e.g. <16>)
|
|
|
|
- devbus,badr-skew-ps: Defines the time delay from from A[2:0] toggle,
|
|
to read data sample. This parameter is useful for
|
|
synchronous pipelined devices, where the address
|
|
precedes the read data by one or two cycles.
|
|
|
|
- devbus,acc-first-ps: Defines the time delay from the negation of
|
|
ALE[0] to the cycle that the first read data is sampled
|
|
by the controller.
|
|
|
|
- devbus,acc-next-ps: Defines the time delay between the cycle that
|
|
samples data N and the cycle that samples data N+1
|
|
(in burst accesses).
|
|
|
|
- devbus,rd-setup-ps: Defines the time delay between DEV_CSn assertion to
|
|
DEV_OEn assertion. If set to 0 (default),
|
|
DEV_OEn and DEV_CSn are asserted at the same cycle.
|
|
This parameter has no affect on <acc-first-ps> parameter
|
|
(no affect on first data sample). Set <rd-setup-ps>
|
|
to a value smaller than <acc-first-ps>.
|
|
|
|
- devbus,rd-hold-ps: Defines the time between the last data sample to the
|
|
de-assertion of DEV_CSn. If set to 0 (default),
|
|
DEV_OEn and DEV_CSn are de-asserted at the same cycle
|
|
(the cycle of the last data sample).
|
|
This parameter has no affect on DEV_OEn de-assertion.
|
|
DEV_OEn is always de-asserted the next cycle after
|
|
last data sampled. Also this parameter has no
|
|
affect on <turn-off-ps> parameter.
|
|
Set <rd-hold-ps> to a value smaller than <turn-off-ps>.
|
|
|
|
Write parameters:
|
|
|
|
- devbus,ale-wr-ps: Defines the time delay from the ALE[0] negation cycle
|
|
to the DEV_WEn assertion.
|
|
|
|
- devbus,wr-low-ps: Defines the time during which DEV_WEn is active.
|
|
A[2:0] and Data are kept valid as long as DEV_WEn
|
|
is active. This parameter defines the setup time of
|
|
address and data to DEV_WEn rise.
|
|
|
|
- devbus,wr-high-ps: Defines the time during which DEV_WEn is kept
|
|
inactive (high) between data beats of a burst write.
|
|
DEV_A[2:0] and Data are kept valid (do not toggle) for
|
|
<wr-high-ps> - <tick> ps.
|
|
This parameter defines the hold time of address and
|
|
data after DEV_WEn rise.
|
|
|
|
- devbus,sync-enable: Synchronous device enable.
|
|
1: True
|
|
0: False
|
|
|
|
An example for an Armada XP GP board, with a 16 MiB NOR device as child
|
|
is showed below. Note that the Device Bus driver is in charge of allocating
|
|
the mbus address decoding window for each of its child devices.
|
|
The window is created using the chip select specified in the child
|
|
device node together with the base address and size specified in the ranges
|
|
property. For instance, in the example below the allocated decoding window
|
|
will start at base address 0xf0000000, with a size 0x1000000 (16 MiB)
|
|
for chip select 0 (a.k.a DEV_BOOTCS).
|
|
|
|
This address window handling is done in this mvebu-devbus only as a temporary
|
|
solution. It will be removed when the support for mbus device tree binding is
|
|
added.
|
|
|
|
The reg property implicitly specifies the chip select as this:
|
|
|
|
0x10400: DEV_BOOTCS
|
|
0x10408: DEV_CS0
|
|
0x10410: DEV_CS1
|
|
0x10418: DEV_CS2
|
|
0x10420: DEV_CS3
|
|
|
|
Example:
|
|
|
|
devbus-bootcs@d0010400 {
|
|
status = "okay";
|
|
ranges = <0 0xf0000000 0x1000000>; /* @addr 0xf0000000, size 0x1000000 */
|
|
#address-cells = <1>;
|
|
#size-cells = <1>;
|
|
|
|
/* Device Bus parameters are required */
|
|
|
|
/* Read parameters */
|
|
devbus,bus-width = <8>;
|
|
devbus,turn-off-ps = <60000>;
|
|
devbus,badr-skew-ps = <0>;
|
|
devbus,acc-first-ps = <124000>;
|
|
devbus,acc-next-ps = <248000>;
|
|
devbus,rd-setup-ps = <0>;
|
|
devbus,rd-hold-ps = <0>;
|
|
|
|
/* Write parameters */
|
|
devbus,sync-enable = <0>;
|
|
devbus,wr-high-ps = <60000>;
|
|
devbus,wr-low-ps = <60000>;
|
|
devbus,ale-wr-ps = <60000>;
|
|
|
|
flash@0 {
|
|
compatible = "cfi-flash";
|
|
|
|
/* 16 MiB */
|
|
reg = <0 0x1000000>;
|
|
bank-width = <2>;
|
|
#address-cells = <1>;
|
|
#size-cells = <1>;
|
|
|
|
/*
|
|
* We split the 16 MiB in two partitions,
|
|
* just as an example.
|
|
*/
|
|
partition@0 {
|
|
label = "First";
|
|
reg = <0 0x800000>;
|
|
};
|
|
|
|
partition@800000 {
|
|
label = "Second";
|
|
reg = <0x800000 0x800000>;
|
|
};
|
|
};
|
|
};
|