123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
- NVIDIA Tegra186 GPIO controllers
- Tegra186 contains two GPIO controllers; a main controller and an "AON"
- controller. This binding document applies to both controllers. The register
- layouts for the controllers share many similarities, but also some significant
- differences. Hence, this document describes closely related but different
- bindings and compatible values.
- The Tegra186 GPIO controller allows software to set the IO direction of, and
- read/write the value of, numerous GPIO signals. Routing of GPIO signals to
- package balls is under the control of a separate pin controller HW block. Two
- major sets of registers exist:
- a) Security registers, which allow configuration of allowed access to the GPIO
- register set. These registers exist in a single contiguous block of physical
- address space. The size of this block, and the security features available,
- varies between the different GPIO controllers.
- Access to this set of registers is not necessary in all circumstances. Code
- that wishes to configure access to the GPIO registers needs access to these
- registers to do so. Code which simply wishes to read or write GPIO data does not
- need access to these registers.
- b) GPIO registers, which allow manipulation of the GPIO signals. In some GPIO
- controllers, these registers are exposed via multiple "physical aliases" in
- address space, each of which access the same underlying state. See the hardware
- documentation for rationale. Any particular GPIO client is expected to access
- just one of these physical aliases.
- Tegra HW documentation describes a unified naming convention for all GPIOs
- implemented by the SoC. Each GPIO is assigned to a port, and a port may control
- a number of GPIOs. Thus, each GPIO is named according to an alphabetical port
- name and an integer GPIO name within the port. For example, GPIO_PA0, GPIO_PN6,
- or GPIO_PCC3.
- The number of ports implemented by each GPIO controller varies. The number of
- implemented GPIOs within each port varies. GPIO registers within a controller
- are grouped and laid out according to the port they affect.
- The mapping from port name to the GPIO controller that implements that port, and
- the mapping from port name to register offset within a controller, are both
- extremely non-linear. The header file <dt-bindings/gpio/tegra186-gpio.h>
- describes the port-level mapping. In that file, the naming convention for ports
- matches the HW documentation. The values chosen for the names are alphabetically
- sorted within a particular controller. Drivers need to map between the DT GPIO
- IDs and HW register offsets using a lookup table.
- Each GPIO controller can generate a number of interrupt signals. Each signal
- represents the aggregate status for all GPIOs within a set of ports. Thus, the
- number of interrupt signals generated by a controller varies as a rough function
- of the number of ports it implements. Note that the HW documentation refers to
- both the overall controller HW module and the sets-of-ports as "controllers".
- Each GPIO controller in fact generates multiple interrupts signals for each set
- of ports. Each GPIO may be configured to feed into a specific one of the
- interrupt signals generated by a set-of-ports. The intent is for each generated
- signal to be routed to a different CPU, thus allowing different CPUs to each
- handle subsets of the interrupts within a port. The status of each of these
- per-port-set signals is reported via a separate register. Thus, a driver needs
- to know which status register to observe. This binding currently defines no
- configuration mechanism for this. By default, drivers should use register
- GPIO_${port}_INTERRUPT_STATUS_G1_0. Future revisions to the binding could
- define a property to configure this.
- Required properties:
- - compatible
- Array of strings.
- One of:
- - "nvidia,tegra186-gpio".
- - "nvidia,tegra186-gpio-aon".
- - reg-names
- Array of strings.
- Contains a list of names for the register spaces described by the reg
- property. May contain the following entries, in any order:
- - "gpio": Mandatory. GPIO control registers. This may cover either:
- a) The single physical alias that this OS should use.
- b) All physical aliases that exist in the controller. This is
- appropriate when the OS is responsible for managing assignment of
- the physical aliases.
- - "security": Optional. Security configuration registers.
- Users of this binding MUST look up entries in the reg property by name,
- using this reg-names property to do so.
- - reg
- Array of (physical base address, length) tuples.
- Must contain one entry per entry in the reg-names property, in a matching
- order.
- - interrupts
- Array of interrupt specifiers.
- The interrupt outputs from the HW block, one per set of ports, in the
- order the HW manual describes them. The number of entries required varies
- depending on compatible value:
- - "nvidia,tegra186-gpio": 6 entries.
- - "nvidia,tegra186-gpio-aon": 1 entry.
- - gpio-controller
- Boolean.
- Marks the device node as a GPIO controller/provider.
- - #gpio-cells
- Single-cell integer.
- Must be <2>.
- Indicates how many cells are used in a consumer's GPIO specifier.
- In the specifier:
- - The first cell is the pin number.
- See <dt-bindings/gpio/tegra186-gpio.h>.
- - The second cell contains flags:
- - Bit 0 specifies polarity
- - 0: Active-high (normal).
- - 1: Active-low (inverted).
- - interrupt-controller
- Boolean.
- Marks the device node as an interrupt controller/provider.
- - #interrupt-cells
- Single-cell integer.
- Must be <2>.
- Indicates how many cells are used in a consumer's interrupt specifier.
- In the specifier:
- - The first cell is the GPIO number.
- See <dt-bindings/gpio/tegra186-gpio.h>.
- - The second cell is contains flags:
- - Bits [3:0] indicate trigger type and level:
- - 1: Low-to-high edge triggered.
- - 2: High-to-low edge triggered.
- - 4: Active high level-sensitive.
- - 8: Active low level-sensitive.
- Valid combinations are 1, 2, 3, 4, 8.
- Example:
- #include <dt-bindings/interrupt-controller/irq.h>
- gpio@2200000 {
- compatible = "nvidia,tegra186-gpio";
- reg-names = "security", "gpio";
- reg =
- <0x0 0x2200000 0x0 0x10000>,
- <0x0 0x2210000 0x0 0x10000>;
- interrupts =
- <0 47 IRQ_TYPE_LEVEL_HIGH>,
- <0 50 IRQ_TYPE_LEVEL_HIGH>,
- <0 53 IRQ_TYPE_LEVEL_HIGH>,
- <0 56 IRQ_TYPE_LEVEL_HIGH>,
- <0 59 IRQ_TYPE_LEVEL_HIGH>,
- <0 180 IRQ_TYPE_LEVEL_HIGH>;
- gpio-controller;
- #gpio-cells = <2>;
- interrupt-controller;
- #interrupt-cells = <2>;
- };
- gpio@c2f0000 {
- compatible = "nvidia,tegra186-gpio-aon";
- reg-names = "security", "gpio";
- reg =
- <0x0 0xc2f0000 0x0 0x1000>,
- <0x0 0xc2f1000 0x0 0x1000>;
- interrupts =
- <0 60 IRQ_TYPE_LEVEL_HIGH>;
- gpio-controller;
- #gpio-cells = <2>;
- interrupt-controller;
- #interrupt-cells = <2>;
- };
|