Re: [PATCH V2] ARM: tegra: add DT binding for Tegra186 GPIO controllers

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




On Tue, Apr 12, 2016 at 7:46 PM, Stephen Warren <swarren@xxxxxxxxxxxxx> wrote:

> From: Stephen Warren <swarren@xxxxxxxxxx>
>
> Tegra186 contains two separate but mostly similar GPIO controllers.
> Register layout differs significantly from previous Tegra generations, and
> so a new binding is required to describe them in device tree. This patch
> adds that binding.
>
> Signed-off-by: Stephen Warren <swarren@xxxxxxxxxx>
> Acked-by: Rob Herring <robh@xxxxxxxxxx>
> ---
> v2: Increase indentation to make lists more readable.

Very interesting patch!

> +a) Security registers, which allow configuration of allowed access to the GPIO
> +register set. These registers exist in a single contguous block of physical

^ speling: contiguous?

> +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.

I suspect that the Tegra definition of a "port" is close to what other people
call a "bank" like I try to define in this patch?
http://marc.info/?l=linux-gpio&m=145941547420164&w=2

> +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.

That actually warrants the concept of gpio-bank = <n>;

> + 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.

Again that use case. Can you please enter the mentioned thread
and provide some input on how you see this working?

Neil Armstrong provided a driver using the GPIO ranges for
cross-reference to the pin controller as the basis for finding
what is here the port ID. I don't know if that is such a great
idea.

I noticed that the #defines in that tegra186-gpio.h file are not used
in the example below. Something seems wrong: this mapping must
be important. I don't see which of the required properties it should go
into either.

> +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.

Clever. Seems like something other hardware engineers should pick
up on.

> +/* GPIOs implemented by main GPIO controller */
> +#define TEGRA_MAIN_GPIO_PORT_A 0
> +#define TEGRA_MAIN_GPIO_PORT_B 1
> +#define TEGRA_MAIN_GPIO_PORT_C 2
> +#define TEGRA_MAIN_GPIO_PORT_D 3
> +#define TEGRA_MAIN_GPIO_PORT_E 4
> +#define TEGRA_MAIN_GPIO_PORT_F 5
> +#define TEGRA_MAIN_GPIO_PORT_G 6
> +#define TEGRA_MAIN_GPIO_PORT_H 7
> +#define TEGRA_MAIN_GPIO_PORT_I 8
> +#define TEGRA_MAIN_GPIO_PORT_J 9
> +#define TEGRA_MAIN_GPIO_PORT_K 10
> +#define TEGRA_MAIN_GPIO_PORT_L 11
> +#define TEGRA_MAIN_GPIO_PORT_M 12
> +#define TEGRA_MAIN_GPIO_PORT_N 13
> +#define TEGRA_MAIN_GPIO_PORT_O 14
> +#define TEGRA_MAIN_GPIO_PORT_P 15
> +#define TEGRA_MAIN_GPIO_PORT_Q 16
> +#define TEGRA_MAIN_GPIO_PORT_R 17
> +#define TEGRA_MAIN_GPIO_PORT_T 18
> +#define TEGRA_MAIN_GPIO_PORT_X 19
> +#define TEGRA_MAIN_GPIO_PORT_Y 20
> +#define TEGRA_MAIN_GPIO_PORT_BB 21
> +#define TEGRA_MAIN_GPIO_PORT_CC 22
> +
> +#define TEGRA_MAIN_GPIO(port, offset) \
> +       ((TEGRA_MAIN_GPIO_PORT_##port * 8) + offset)
> +
> +/* GPIOs implemented by AON GPIO controller */
> +#define TEGRA_AON_GPIO_PORT_S 0
> +#define TEGRA_AON_GPIO_PORT_U 1
> +#define TEGRA_AON_GPIO_PORT_V 2
> +#define TEGRA_AON_GPIO_PORT_W 3
> +#define TEGRA_AON_GPIO_PORT_Z 4
> +#define TEGRA_AON_GPIO_PORT_AA 5
> +#define TEGRA_AON_GPIO_PORT_EE 6
> +#define TEGRA_AON_GPIO_PORT_FF 7
> +
> +#define TEGRA_AON_GPIO(port, offset) \
> +       ((TEGRA_AON_GPIO_PORT_##port * 8) + offset)

So we definately need this stuff used in the example.

Yours,
Linus Walleij
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Device Tree Compilter]     [Device Tree Spec]     [Linux Driver Backports]     [Video for Linux]     [Linux USB Devel]     [Linux PCI Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Yosemite Backpacking]
  Powered by Linux