Skip to contentSkip to conversation

of: Add NVIDIA Tegra XUSB pad controller binding

PATCH Superseded Thierry Reding 3 participants 8 messages Jun 17, 2014 – Jun 19, 2014

Subsystems (3)

v4 of 5 Superseded Latest is v5 →

lore
Share & tools
lore
#0 lore raw

PATCH v4 1/4 of: Add NVIDIA Tegra XUSB pad controller binding

From: Thierry Reding <[email protected]>

This patch adds the device tree binding documentation for the XUSB pad controller found on NVIDIA Tegra SoCs. It exposes both pinmuxing and PHY capabilities.

---
Changes in v4:
- drop unneeded #address-cells = <0> and #size-cells = <0>

Changes in v2:
- move header file to this patch and refer to it in the binding
- update example to match the latest binding

 .../pinctrl/nvidia,tegra124-xusb-padctl.txt        | 127 +++++++++++++++++++++
 include/dt-bindings/pinctrl/pinctrl-tegra-xusb.h   |   7 ++
 2 files changed, 134 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/pinctrl/nvidia,tegra124-xusb-padctl.txt
 create mode 100644 include/dt-bindings/pinctrl/pinctrl-tegra-xusb.h
Documentation/devicetree/bindings/pinctrl/nvidia,tegra124-xusb-padctl.txt new file +127 -0
new file mode 100644
index 000000000000..2f9c0bd66457
@@ -0,0 +1,127 @@
+Device tree binding for NVIDIA Tegra XUSB pad controller
+========================================================
+
+The Tegra XUSB pad controller manages a set of lanes, each of which can be
+assigned to one out of a set of different pads. Some of these pads have an
+associated PHY that must be powered up before the pad can be used.
+
+This document defines the device-specific binding for the XUSB pad controller.
+
+Refer to pinctrl-bindings.txt in this directory for generic information about
+pin controller device tree bindings and ../phy/phy-bindings.txt for details on
+how to describe and reference PHYs in device trees.
+
+Required properties:
+--------------------
+- compatible: should be "nvidia,tegra124-xusb-padctl"
+- reg: Physical base address and length of the controller's registers.
+- resets: Must contain an entry for each entry in reset-names.
+  See ../reset/reset.txt for details.
+- reset-names: Must include the following entries:
+  - padctl
+- #phy-cells: Should be 1. The specifier is the index of the PHY to reference.
+  See <dt-bindings/pinctrl/pinctrl-tegra-xusb.h> for the list of valid values.
+
+Lane muxing:
+------------
+
+Child nodes contain the pinmux configurations following the conventions from
+the pinctrl-bindings.txt document. Typically a single, static configuration is
+given and applied at boot time.
+
+Each subnode describes groups of lanes along with parameters and pads that
+they should be assigned to. The name of these subnodes is not important. All
+subnodes should be parsed solely based on their content.
+
+Each subnode only applies the parameters that are explicitly listed. In other
+words, if a subnode that lists a function but no pin configuration parameters
+implies no information about any pin configuration parameters. Similarly, a
+subnode that describes only an IDDQ parameter implies no information about
+what function the pins are assigned to. For this reason even seemingly boolean
+values are actually tristates in this binding: unspecified, off or on.
+Unspecified is represented as an absent property, and off/on are represented
+as integer values 0 and 1.
+
+Required properties:
+- nvidia,lanes: An array of strings. Each string is the name of a lane.
+
+Optional properties:
+- nvidia,function: A string that is the name of the function (pad) that the
+  pin or group should be assigned to. Valid values for function names are
+  listed below.
+- nvidia,iddq: Enables IDDQ mode of the lane. (0: no, 1: yes)
+
+Note that not all of these properties are valid for all lanes. Lanes can be
+divided into three groups:
+
+  - otg-0, otg-1, otg-2:
+
+    Valid functions for this group are: "snps", "xusb", "uart", "rsvd".
+
+    The nvidia,iddq property does not apply to this group.
+
+  - ulpi-0, hsic-0, hsic-1:
+
+    Valid functions for this group are: "snps", "xusb".
+
+    The nvidia,iddq property does not apply to this group.
+
+  - pcie-0, pcie-1, pcie-2, pcie-3, pcie-4, sata-0:
+
+    Valid functions for this group are: "pcie", "usb3", "sata", "rsvd".
+
+
+Example:
+========
+
+SoC file extract:
+-----------------
+
+	padctl at 0,7009f000 {
+		compatible = "nvidia,tegra124-xusb-padctl";
+		reg = <0x0 0x7009f000 0x0 0x1000>;
+		resets = <&tegra_car 142>;
+		reset-names = "padctl";
+
+		#phy-cells = <1>;
+	};
+
+Board file extract:
+-------------------
+
+	pcie-controller at 0,01003000 {
+		...
+
+		phys = <&padctl 0>;
+		phy-names = "pcie";
+
+		...
+	};
+
+	...
+
+	padctl: padctl at 0,7009f000 {
+		pinctrl-0 = <&padctl_default>;
+		pinctrl-names = "default";
+
+		padctl_default: pinmux {
+			usb3 {
+				nvidia,lanes = "pcie-0", "pcie-1";
+				nvidia,function = "usb3";
+				nvidia,iddq = <0>;
+			};
+
+			pcie {
+				nvidia,lanes = "pcie-2", "pcie-3",
+					       "pcie-4";
+				nvidia,function = "pcie";
+				nvidia,iddq = <0>;
+			};
+
+			sata {
+				nvidia,lanes = "sata-0";
+				nvidia,function = "sata";
+				nvidia,iddq = <0>;
+			};
+		};
+	};
include/dt-bindings/pinctrl/pinctrl-tegra-xusb.h new file +7 -0
new file mode 100644
index 000000000000..914d56da9324
@@ -0,0 +1,7 @@
+#ifndef _DT_BINDINGS_PINCTRL_TEGRA_XUSB_H
+#define _DT_BINDINGS_PINCTRL_TEGRA_XUSB_H 1
+
+#define TEGRA_XUSB_PADCTL_PCIE 0
+#define TEGRA_XUSB_PADCTL_SATA 1
+
+#endif /* _DT_BINDINGS_PINCTRL_TEGRA_XUSB_H */
Signature · 1 line
1.9.2
#1 lore raw

PATCH v4 2/4 pinctrl: Add NVIDIA Tegra XUSB pad controller support

From: Thierry Reding <[email protected]>

The XUSB pad controller found on NVIDIA Tegra SoCs provides several pads that lanes can be assigned to in order to support a variety of interface
options: USB 2.0, USB 3.0, PCIe and SATA.

In addition to the pin controller used to assign lanes to pads two PHYs are exposed to allow the bricks for PCIe and SATA to be powered up and down by PCIe and SATA drivers.

---
Changes in v4:
- invert IDDQ logic, since the register bits are IDDQ disables

Changes in v3:
- use separate variables for configuration value and register value to avoid overwriting the former when accessing registers

Changes in v2:
- remove unused tegra124_groups array
- move header file to binding patch
- default to y for ARCH_TEGRA

 drivers/pinctrl/Kconfig              |   6 +
 drivers/pinctrl/Makefile             |   1 +
 drivers/pinctrl/pinctrl-tegra-xusb.c | 897 +++++++++++++++++++++++++++++++++++
 3 files changed, 904 insertions(+)
 create mode 100644 drivers/pinctrl/pinctrl-tegra-xusb.c
drivers/pinctrl/Kconfig +6 -0
index 0042ccb46b9a..0fa42be8df00 100644
@@ -328,6 +328,12 @@ config PINCTRL_TEGRA124
 	bool
 	select PINCTRL_TEGRA
 
+config PINCTRL_TEGRA_XUSB
+	def_bool y if ARCH_TEGRA
+	select GENERIC_PHY
+	select PINCONF
+	select PINMUX
+
 config PINCTRL_TZ1090
 	bool "Toumaz Xenif TZ1090 pin control driver"
 	depends on SOC_TZ1090
drivers/pinctrl/Makefile +1 -0
index c4b5d405b8f5..df8878839b44 100644
@@ -55,6 +55,7 @@ obj-$(CONFIG_PINCTRL_TEGRA20)	+= pinctrl-tegra20.o
 obj-$(CONFIG_PINCTRL_TEGRA30)	+= pinctrl-tegra30.o
 obj-$(CONFIG_PINCTRL_TEGRA114)	+= pinctrl-tegra114.o
 obj-$(CONFIG_PINCTRL_TEGRA124)	+= pinctrl-tegra124.o
+obj-$(CONFIG_PINCTRL_TEGRA_XUSB)	+= pinctrl-tegra-xusb.o
 obj-$(CONFIG_PINCTRL_TZ1090)	+= pinctrl-tz1090.o
 obj-$(CONFIG_PINCTRL_TZ1090_PDC)	+= pinctrl-tz1090-pdc.o
 obj-$(CONFIG_PINCTRL_U300)	+= pinctrl-u300.o
drivers/pinctrl/pinctrl-tegra-xusb.c new file +897 -0

897 lines not on this page · raw message

Signature · 1 line
1.9.2
#2 lore raw

PATCH v4 2/4 pinctrl: Add NVIDIA Tegra XUSB pad controller support

Quoted 17 lines · Thierry Reding
drivers/pinctrl/pinctrl-tegra-xusb.c new file +17 -0
+static int tegra_xusb_padctl_pinconf_group_get(struct pinctrl_dev *pinctrl,
+                                              unsigned int group,
+                                              unsigned long *config)
+{
+       struct tegra_xusb_padctl *padctl = pinctrl_dev_get_drvdata(pinctrl);
+       const struct tegra_xusb_padctl_lane *lane;
+       enum tegra_xusb_padctl_param param;
+       u32 value;
+
+       param = TEGRA_XUSB_PADCTL_UNPACK_PARAM(*config);
+       lane = &padctl->soc->lanes[group];
+
+       switch (param) {
+       case TEGRA_XUSB_PADCTL_IDDQ:
+               value = padctl_readl(padctl, lane->offset);
+               value = (value >> lane->iddq) & 0x1;
+               *config = TEGRA_XUSB_PADCTL_PACK(param, value);

drivers/pinctrl/pinctrl-tegra-xusb.c line 343

Quoted 10 lines
drivers/pinctrl/pinctrl-tegra-xusb.c new file +10 -0
+               break;
+
+       default:
+               dev_err(padctl->dev, "invalid configuration parameter: %04x\n",
+                       param);
+               return -ENOTSUPP;
+       }
+
+       return 0;
+}

I guess `value' should also be negated here?

#3 lore raw

PATCH v4 3/4 ARM: tegra: tegra124: Add XUSB pad controller

In reply to Thierry Reding

From: Thierry Reding <[email protected]>

The device tree node in the SoC file contains only the resources (such as registers, resets, ...) but none of the lane assignment information since that's board specific and belongs in the board file.

---
Changes in v2:
- include dt-bindings/pinctrl/pinctrl-tegra-xusb.h so that board files don't have to include it explicitly
- remove unneeded #address-cells/#size-cells = <0>
- add padctl label for XUSB pad controller node

 arch/arm/boot/dts/tegra124.dtsi | 10 ++++++++++
 1 file changed, 10 insertions(+)
arch/arm/boot/dts/tegra124.dtsi +10 -0
index 6e6bc4e8185c..b7cb944b2faa 100644
@@ -1,6 +1,7 @@
 #include <dt-bindings/clock/tegra124-car.h>
 #include <dt-bindings/gpio/tegra-gpio.h>
 #include <dt-bindings/pinctrl/pinctrl-tegra.h>
+#include <dt-bindings/pinctrl/pinctrl-tegra-xusb.h>
 #include <dt-bindings/interrupt-controller/arm-gic.h>
 
 #include "skeleton.dtsi"
@@ -449,6 +450,15 @@
 		clock-names = "pclk", "clk32k_in";
 	};
 
+	padctl: padctl at 0,7009f000 {
+		compatible = "nvidia,tegra124-xusb-padctl";
+		reg = <0x0 0x7009f000 0x0 0x1000>;
+		resets = <&tegra_car 142>;
+		reset-names = "padctl";
+
+		#phy-cells = <1>;
+	};
+
 	sdhci at 0,700b0000 {
 		compatible = "nvidia,tegra124-sdhci";
 		reg = <0x0 0x700b0000 0x0 0x200>;
Signature · 1 line
1.9.2
#4 lore raw

PATCH v4 4/4 ARM: tegra: jetson-tk1: Add XUSB pad controller

In reply to Thierry Reding

From: Thierry Reding <[email protected]>

Assign lanes to the XUSB pads as used on the Jetson TK1.

---
 arch/arm/boot/dts/tegra124-jetson-tk1.dts | 26 ++++++++++++++++++++++++++
 1 file changed, 26 insertions(+)
arch/arm/boot/dts/tegra124-jetson-tk1.dts +26 -0
index e31fb61a81d3..38d30877057c 100644
@@ -1619,6 +1619,32 @@
 		nvidia,sys-clock-req-active-high;
 	};
 
+	padctl at 0,7009f000 {
+		pinctrl-0 = <&padctl_default>;
+		pinctrl-names = "default";
+
+		padctl_default: pinmux {
+			usb3 {
+				nvidia,lanes = "pcie-0", "pcie-1";
+				nvidia,function = "usb3";
+				nvidia,iddq = <0>;
+			};
+
+			pcie {
+				nvidia,lanes = "pcie-2", "pcie-3",
+					       "pcie-4";
+				nvidia,function = "pcie";
+				nvidia,iddq = <0>;
+			};
+
+			sata {
+				nvidia,lanes = "sata-0";
+				nvidia,function = "sata";
+				nvidia,iddq = <0>;
+			};
+		};
+	};
+
 	/* SD card */
 	sdhci at 0,700b0400 {
 		status = "okay";
Signature · 1 line
1.9.2
#5 lore raw

PATCH v4 1/4 of: Add NVIDIA Tegra XUSB pad controller binding

In reply to Thierry Reding
Quoted 5 lines · Thierry Reding

From: Thierry Reding <[email protected]>

This patch adds the device tree binding documentation for the XUSB pad controller found on NVIDIA Tegra SoCs. It exposes both pinmuxing and PHY capabilities.

Thanks. I'll wait for a Tested-by from Mikko and an Acked-by from Linus before taking this series.

#6 lore raw

PATCH v4 1/4 of: Add NVIDIA Tegra XUSB pad controller binding

Quoted 10 lines · Stephen Warren
Quoted 5 lines · Thierry Reding

From: Thierry Reding <[email protected]>

This patch adds the device tree binding documentation for the XUSB pad controller found on NVIDIA Tegra SoCs. It exposes both pinmuxing and PHY capabilities.

Thanks. I'll wait for a Tested-by from Mikko and an Acked-by from Linus before taking this series.

With or without negation added to group_get (see reply to 2/4), the series:

#7 lore raw

PATCH v4 1/4 of: Add NVIDIA Tegra XUSB pad controller binding

Quoted 8 lines · Mikko Perttunen
Quoted 7 lines · Stephen Warren
Quoted 5 lines · Thierry Reding

From: Thierry Reding <[email protected]>

This patch adds the device tree binding documentation for the XUSB pad controller found on NVIDIA Tegra SoCs. It exposes both pinmuxing and PHY capabilities.

Quoted 7 lines
Quoted 3 lines

Thanks. I'll wait for a Tested-by from Mikko and an Acked-by from Linus before taking this series.

With or without negation added to group_get (see reply to 2/4), the series:

Thanks. I just sent out another series which addresses the missing negation in group_get() and the missing BIT() around lane->iddq in various places as discussed on IRC.

I've also added debugfs support which helps verifying that group_get() now behaves properly.

Thierry
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20140619/5db9f7ce/attachment.sig>