mirror of
https://github.com/torvalds/linux.git
synced 2024-12-15 07:33:56 +00:00
4b7f48d395
The UniPhier System Bus is an external bus that connects on-board devices to the UniPhier SoC. Each bank (chip select) is dynamically mapped to the CPU-viewed address base via the bus controller. The bus controller must be configured before any access to the bus. This driver parses the "ranges" property of the System Bus node and initialized the bus controller. After the bus becomes ready, devices below it are populated. Note: Each bank can be mapped anywhere in the supported address space; there is nothing preventing us from assigning bank 0 on 0x42000000, 0x43000000, or anywhere as long as such region is not used by others. So, the "ranges" is just one possible software configuration, which does not seem to fit in device tree because device tree is a hardware description language. However, of_translate_address() requires "ranges" in every bus node between CPUs and device mapped on the CPU address space. In other words, "ranges" properties must be statically defined in device tree. After some discussion, I decided the dynamic address reassignment by the driver is too bothersome. Instead, the device tree should provide a reasonable translation setup that the OS can rely on. Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com> Acked-by: Rob Herring <robh@kernel.org> Acked-by: Arnd Bergmann <arnd@arndb.de> Signed-off-by: Olof Johansson <olof@lixom.net>
67 lines
2.6 KiB
Plaintext
67 lines
2.6 KiB
Plaintext
UniPhier System Bus
|
|
|
|
The UniPhier System Bus is an external bus that connects on-board devices to
|
|
the UniPhier SoC. It is a simple (semi-)parallel bus with address, data, and
|
|
some control signals. It supports up to 8 banks (chip selects).
|
|
|
|
Before any access to the bus, the bus controller must be configured; the bus
|
|
controller registers provide the control for the translation from the offset
|
|
within each bank to the CPU-viewed address. The needed setup includes the base
|
|
address, the size of each bank. Optionally, some timing parameters can be
|
|
optimized for faster bus access.
|
|
|
|
Required properties:
|
|
- compatible: should be "socionext,uniphier-system-bus".
|
|
- reg: offset and length of the register set for the bus controller device.
|
|
- #address-cells: should be 2. The first cell is the bank number (chip select).
|
|
The second cell is the address offset within the bank.
|
|
- #size-cells: should be 1.
|
|
- ranges: should provide a proper address translation from the System Bus to
|
|
the parent bus.
|
|
|
|
Note:
|
|
The address region(s) that can be assigned for the System Bus is implementation
|
|
defined. Some SoCs can use 0x00000000-0x0fffffff and 0x40000000-0x4fffffff,
|
|
while other SoCs can only use 0x40000000-0x4fffffff. There might be additional
|
|
limitations depending on SoCs and the boot mode. The address translation is
|
|
arbitrary as long as the banks are assigned in the supported address space with
|
|
the required alignment and they do not overlap one another.
|
|
For example, it is possible to map:
|
|
bank 0 to 0x42000000-0x43ffffff, bank 5 to 0x46000000-0x46ffffff
|
|
It is also possible to map:
|
|
bank 0 to 0x48000000-0x49ffffff, bank 5 to 0x44000000-0x44ffffff
|
|
There is no reason to stick to a particular translation mapping, but the
|
|
"ranges" property should provide a "reasonable" default that is known to work.
|
|
The software should initialize the bus controller according to it.
|
|
|
|
Example:
|
|
|
|
system-bus {
|
|
compatible = "socionext,uniphier-system-bus";
|
|
reg = <0x58c00000 0x400>;
|
|
#address-cells = <2>;
|
|
#size-cells = <1>;
|
|
ranges = <1 0x00000000 0x42000000 0x02000000
|
|
5 0x00000000 0x46000000 0x01000000>;
|
|
|
|
ethernet@1,01f00000 {
|
|
compatible = "smsc,lan9115";
|
|
reg = <1 0x01f00000 0x1000>;
|
|
interrupts = <0 48 4>
|
|
phy-mode = "mii";
|
|
};
|
|
|
|
uart@5,00200000 {
|
|
compatible = "ns16550a";
|
|
reg = <5 0x00200000 0x20>;
|
|
interrupts = <0 49 4>
|
|
clock-frequency = <12288000>;
|
|
};
|
|
};
|
|
|
|
In this example,
|
|
- the Ethernet device is connected at the offset 0x01f00000 of CS1 and
|
|
mapped to 0x43f00000 of the parent bus.
|
|
- the UART device is connected at the offset 0x00200000 of CS5 and
|
|
mapped to 0x46200000 of the parent bus.
|