public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
* [U-Boot] [PATCH 0/9] ARM: tegra: pinmux: Tegra210 support
@ 2015-02-24 21:08 Stephen Warren
  2015-02-24 21:08 ` [U-Boot] [PATCH 1/9] ARM: tegra: pinmux: add note re: drive group field defines Stephen Warren
                   ` (10 more replies)
  0 siblings, 11 replies; 20+ messages in thread
From: Stephen Warren @ 2015-02-24 21:08 UTC (permalink / raw)
  To: u-boot

From: Stephen Warren <swarren@nvidia.com>

This series performs a few small cleanups to or parameterizations of the
existing Tegra pinmux driver, and adds Tegra210 support. The Tegra210
code isn't actually used yet, since the balance of the Tegra210 support
is not yet present. However, it should start appearing soon.

I've at least compile-tested this by over-writing the Tegra124 pinmux
driver and Jetson TK1 board pinmux data tables with the Tegra210 versions.

TomW, note I made a couple minor tweaks since the latest version I sent
internally; let's apply this version upstream.

Stephen Warren (9):
  ARM: tegra: pinmux: add note re: drive group field defines
  ARM: tegra: pinmux: simplify some defines
  ARM: tegra: pinmux: handle feature removal on newer SoCs
  ARM: tegra: pinmux: move some type definitions
  ARM: tegra: pinmux: partially handle varying register layouts
  ARM: tegra: pinmux: support hsm/schmitt on pins
  ARM: tegra: pinmux: account for different drivegroup base registers
  ARM: tegra: pinmux: support Tegra210's e_io_hv pin option
  ARM: tegra: pinmux: add Tegra210 support

 arch/arm/cpu/tegra-common/pinmux-common.c   | 211 ++++++++++++--
 arch/arm/cpu/tegra210-common/pinmux.c       | 195 +++++++++++++
 arch/arm/include/asm/arch-tegra/pinmux.h    | 107 ++++---
 arch/arm/include/asm/arch-tegra114/pinmux.h |  14 +-
 arch/arm/include/asm/arch-tegra124/pinmux.h |  14 +-
 arch/arm/include/asm/arch-tegra20/pinmux.h  |   1 +
 arch/arm/include/asm/arch-tegra210/pinmux.h | 416 ++++++++++++++++++++++++++++
 arch/arm/include/asm/arch-tegra30/pinmux.h  |  11 +-
 8 files changed, 906 insertions(+), 63 deletions(-)
 create mode 100644 arch/arm/cpu/tegra210-common/pinmux.c
 create mode 100644 arch/arm/include/asm/arch-tegra210/pinmux.h

-- 
1.9.1

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [U-Boot] [PATCH 1/9] ARM: tegra: pinmux: add note re: drive group field defines
  2015-02-24 21:08 [U-Boot] [PATCH 0/9] ARM: tegra: pinmux: Tegra210 support Stephen Warren
@ 2015-02-24 21:08 ` Stephen Warren
  2015-02-24 23:44   ` Simon Glass
  2015-02-24 21:08 ` [U-Boot] [PATCH 2/9] ARM: tegra: pinmux: simplify some defines Stephen Warren
                   ` (9 subsequent siblings)
  10 siblings, 1 reply; 20+ messages in thread
From: Stephen Warren @ 2015-02-24 21:08 UTC (permalink / raw)
  To: u-boot

From: Stephen Warren <swarren@nvidia.com>

Tegra's drive group registers have a remarkably inconsistent layout. The
current U-Boot driver doesn't take this into account at all. Add a
comment to describe the issue, so at least anyone debugging the driver
will be aware of this. To solve this, we'd need to add a per-drive-group
data structure describing the layout for the individual register. Since
we don't set up too many drive groups in U-Boot at present, this
hopefully isn't causing too much practical issue. Still, we probably need
to fix this sometime.

Wth Tegra210, the register layout becomes almost entirely consistent, so
this problem partially solves itself over time.

Signed-off-by: Stephen Warren <swarren@nvidia.com>
---
 arch/arm/cpu/tegra-common/pinmux-common.c | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/arch/arm/cpu/tegra-common/pinmux-common.c b/arch/arm/cpu/tegra-common/pinmux-common.c
index 64baed45d591..0bef6e246357 100644
--- a/arch/arm/cpu/tegra-common/pinmux-common.c
+++ b/arch/arm/cpu/tegra-common/pinmux-common.c
@@ -347,6 +347,21 @@ void pinmux_config_pingrp_table(const struct pmux_pingrp_config *config,
 #define SCHMT_SHIFT	3
 #define LPMD_SHIFT	4
 #define LPMD_MASK	(3 << LPMD_SHIFT)
+/*
+ * Note that the following DRV* and SLW* defines are accurate for many drive
+ * groups on many SoCs. We really need a per-group data structure to solve
+ * this, since the fields are in different positions/sizes in different
+ * registers (for different groups).
+ *
+ * On Tegra30/114/124, the DRV*_SHIFT values vary.
+ * On Tegra30, the SLW*_SHIFT values vary.
+ * On Tegra30/114/124/210, the DRV*_MASK values vary, although the values
+ *   below are wide enough to cover the widest fields, and hopefully don't
+ *   interfere with any other fields.
+ * On Tegra30, the SLW*_MASK values vary, but we can't use a value that's
+ *   wide enough to cover all cases, since that would cause the field to
+ *   overlap with other fields in the narrower cases.
+ */
 #define DRVDN_SHIFT	12
 #define DRVDN_MASK	(0x7F << DRVDN_SHIFT)
 #define DRVUP_SHIFT	20
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [U-Boot] [PATCH 2/9] ARM: tegra: pinmux: simplify some defines
  2015-02-24 21:08 [U-Boot] [PATCH 0/9] ARM: tegra: pinmux: Tegra210 support Stephen Warren
  2015-02-24 21:08 ` [U-Boot] [PATCH 1/9] ARM: tegra: pinmux: add note re: drive group field defines Stephen Warren
@ 2015-02-24 21:08 ` Stephen Warren
  2015-02-24 21:08 ` [U-Boot] [PATCH 3/9] ARM: tegra: pinmux: handle feature removal on newer SoCs Stephen Warren
                   ` (8 subsequent siblings)
  10 siblings, 0 replies; 20+ messages in thread
From: Stephen Warren @ 2015-02-24 21:08 UTC (permalink / raw)
  To: u-boot

From: Stephen Warren <swarren@nvidia.com>

Future SoCs have a slightly different combination of pinmux options per
pin. This will be simpler to handle if we simply have one define per
option, rather than grouping various options together, in combinations
that don't align with future chips.

Signed-off-by: Stephen Warren <swarren@nvidia.com>
---
 arch/arm/cpu/tegra-common/pinmux-common.c   | 44 ++++++++++++++++++++---------
 arch/arm/include/asm/arch-tegra/pinmux.h    | 34 ++++++++++++++--------
 arch/arm/include/asm/arch-tegra114/pinmux.h | 10 +++++--
 arch/arm/include/asm/arch-tegra124/pinmux.h | 10 +++++--
 arch/arm/include/asm/arch-tegra30/pinmux.h  |  7 +++--
 5 files changed, 73 insertions(+), 32 deletions(-)

diff --git a/arch/arm/cpu/tegra-common/pinmux-common.c b/arch/arm/cpu/tegra-common/pinmux-common.c
index 0bef6e246357..5d4d2e9c3002 100644
--- a/arch/arm/cpu/tegra-common/pinmux-common.c
+++ b/arch/arm/cpu/tegra-common/pinmux-common.c
@@ -24,31 +24,37 @@
 #define pmux_pin_tristate_isvalid(tristate) \
 	(((tristate) >= PMUX_TRI_NORMAL) && ((tristate) <= PMUX_TRI_TRISTATE))
 
-#ifdef TEGRA_PMX_HAS_PIN_IO_BIT_ETC
+#ifdef TEGRA_PMX_PINS_HAVE_E_INPUT
 /* return 1 if a pin_io_is in range */
 #define pmux_pin_io_isvalid(io) \
 	(((io) >= PMUX_PIN_OUTPUT) && ((io) <= PMUX_PIN_INPUT))
+#endif
 
+#ifdef TEGRA_PMX_PINS_HAVE_LOCK
 /* return 1 if a pin_lock is in range */
 #define pmux_pin_lock_isvalid(lock) \
 	(((lock) >= PMUX_PIN_LOCK_DISABLE) && ((lock) <= PMUX_PIN_LOCK_ENABLE))
+#endif
 
+#ifdef TEGRA_PMX_PINS_HAVE_OD
 /* return 1 if a pin_od is in range */
 #define pmux_pin_od_isvalid(od) \
 	(((od) >= PMUX_PIN_OD_DISABLE) && ((od) <= PMUX_PIN_OD_ENABLE))
+#endif
 
+#ifdef TEGRA_PMX_PINS_HAVE_IO_RESET
 /* return 1 if a pin_ioreset_is in range */
 #define pmux_pin_ioreset_isvalid(ioreset) \
 	(((ioreset) >= PMUX_PIN_IO_RESET_DISABLE) && \
 	 ((ioreset) <= PMUX_PIN_IO_RESET_ENABLE))
+#endif
 
-#ifdef TEGRA_PMX_HAS_RCV_SEL
+#ifdef TEGRA_PMX_PINS_HAVE_RCV_SEL
 /* return 1 if a pin_rcv_sel_is in range */
 #define pmux_pin_rcv_sel_isvalid(rcv_sel) \
 	(((rcv_sel) >= PMUX_PIN_RCV_SEL_NORMAL) && \
 	 ((rcv_sel) <= PMUX_PIN_RCV_SEL_HIGH))
-#endif /* TEGRA_PMX_HAS_RCV_SEL */
-#endif /* TEGRA_PMX_HAS_PIN_IO_BIT_ETC */
+#endif
 
 #define _R(offset)	(u32 *)(NV_PA_APB_MISC_BASE + (offset))
 
@@ -86,7 +92,7 @@
 #define IO_RESET_SHIFT	8
 #define RCV_SEL_SHIFT	9
 
-#if !defined(CONFIG_TEGRA20) && !defined(CONFIG_TEGRA30)
+#ifdef TEGRA_PMX_SOC_HAS_IO_CLAMPING
 /* This register/field only exists on Tegra114 and later */
 #define APB_MISC_PP_PINMUX_GLOBAL_0 0x40
 #define CLAMP_INPUTS_WHEN_TRISTATED 1
@@ -180,7 +186,7 @@ void pinmux_tristate_disable(enum pmux_pingrp pin)
 	pinmux_set_tristate(pin, PMUX_TRI_NORMAL);
 }
 
-#ifdef TEGRA_PMX_HAS_PIN_IO_BIT_ETC
+#ifdef TEGRA_PMX_PINS_HAVE_E_INPUT
 void pinmux_set_io(enum pmux_pingrp pin, enum pmux_pin_io io)
 {
 	u32 *reg = REG(pin);
@@ -200,7 +206,9 @@ void pinmux_set_io(enum pmux_pingrp pin, enum pmux_pin_io io)
 		val &= ~(1 << IO_SHIFT);
 	writel(val, reg);
 }
+#endif
 
+#ifdef TEGRA_PMX_PINS_HAVE_LOCK
 static void pinmux_set_lock(enum pmux_pingrp pin, enum pmux_pin_lock lock)
 {
 	u32 *reg = REG(pin);
@@ -225,7 +233,9 @@ static void pinmux_set_lock(enum pmux_pingrp pin, enum pmux_pin_lock lock)
 
 	return;
 }
+#endif
 
+#ifdef TEGRA_PMX_PINS_HAVE_OD
 static void pinmux_set_od(enum pmux_pingrp pin, enum pmux_pin_od od)
 {
 	u32 *reg = REG(pin);
@@ -247,7 +257,9 @@ static void pinmux_set_od(enum pmux_pingrp pin, enum pmux_pin_od od)
 
 	return;
 }
+#endif
 
+#ifdef TEGRA_PMX_PINS_HAVE_IO_RESET
 static void pinmux_set_ioreset(enum pmux_pingrp pin,
 				enum pmux_pin_ioreset ioreset)
 {
@@ -270,8 +282,9 @@ static void pinmux_set_ioreset(enum pmux_pingrp pin,
 
 	return;
 }
+#endif
 
-#ifdef TEGRA_PMX_HAS_RCV_SEL
+#ifdef TEGRA_PMX_PINS_HAVE_RCV_SEL
 static void pinmux_set_rcv_sel(enum pmux_pingrp pin,
 				enum pmux_pin_rcv_sel rcv_sel)
 {
@@ -294,8 +307,7 @@ static void pinmux_set_rcv_sel(enum pmux_pingrp pin,
 
 	return;
 }
-#endif /* TEGRA_PMX_HAS_RCV_SEL */
-#endif /* TEGRA_PMX_HAS_PIN_IO_BIT_ETC */
+#endif
 
 static void pinmux_config_pingrp(const struct pmux_pingrp_config *config)
 {
@@ -304,14 +316,20 @@ static void pinmux_config_pingrp(const struct pmux_pingrp_config *config)
 	pinmux_set_func(pin, config->func);
 	pinmux_set_pullupdown(pin, config->pull);
 	pinmux_set_tristate(pin, config->tristate);
-#ifdef TEGRA_PMX_HAS_PIN_IO_BIT_ETC
+#ifdef TEGRA_PMX_PINS_HAVE_E_INPUT
 	pinmux_set_io(pin, config->io);
+#endif
+#ifdef TEGRA_PMX_PINS_HAVE_LOCK
 	pinmux_set_lock(pin, config->lock);
+#endif
+#ifdef TEGRA_PMX_PINS_HAVE_OD
 	pinmux_set_od(pin, config->od);
+#endif
+#ifdef TEGRA_PMX_PINS_HAVE_IO_RESET
 	pinmux_set_ioreset(pin, config->ioreset);
-#ifdef TEGRA_PMX_HAS_RCV_SEL
-	pinmux_set_rcv_sel(pin, config->rcv_sel);
 #endif
+#ifdef TEGRA_PMX_PINS_HAVE_RCV_SEL
+	pinmux_set_rcv_sel(pin, config->rcv_sel);
 #endif
 }
 
@@ -324,7 +342,7 @@ void pinmux_config_pingrp_table(const struct pmux_pingrp_config *config,
 		pinmux_config_pingrp(&config[i]);
 }
 
-#ifdef TEGRA_PMX_HAS_DRVGRPS
+#ifdef TEGRA_PMX_SOC_HAS_DRVGRPS
 
 #define pmux_drvgrp_isvalid(pd) (((pd) >= 0) && ((pd) < PMUX_DRVGRP_COUNT))
 
diff --git a/arch/arm/include/asm/arch-tegra/pinmux.h b/arch/arm/include/asm/arch-tegra/pinmux.h
index ab764960fa7f..c95c9738f310 100644
--- a/arch/arm/include/asm/arch-tegra/pinmux.h
+++ b/arch/arm/include/asm/arch-tegra/pinmux.h
@@ -23,39 +23,45 @@ enum pmux_tristate {
 	PMUX_TRI_TRISTATE = 1,
 };
 
-#ifdef TEGRA_PMX_HAS_PIN_IO_BIT_ETC
+#ifdef TEGRA_PMX_PINS_HAVE_E_INPUT
 enum pmux_pin_io {
 	PMUX_PIN_OUTPUT = 0,
 	PMUX_PIN_INPUT = 1,
 	PMUX_PIN_NONE,
 };
+#endif
 
+#ifdef TEGRA_PMX_PINS_HAVE_LOCK
 enum pmux_pin_lock {
 	PMUX_PIN_LOCK_DEFAULT = 0,
 	PMUX_PIN_LOCK_DISABLE,
 	PMUX_PIN_LOCK_ENABLE,
 };
+#endif
 
+#ifdef TEGRA_PMX_PINS_HAVE_OD
 enum pmux_pin_od {
 	PMUX_PIN_OD_DEFAULT = 0,
 	PMUX_PIN_OD_DISABLE,
 	PMUX_PIN_OD_ENABLE,
 };
+#endif
 
+#ifdef TEGRA_PMX_PINS_HAVE_IO_RESET
 enum pmux_pin_ioreset {
 	PMUX_PIN_IO_RESET_DEFAULT = 0,
 	PMUX_PIN_IO_RESET_DISABLE,
 	PMUX_PIN_IO_RESET_ENABLE,
 };
+#endif
 
-#ifdef TEGRA_PMX_HAS_RCV_SEL
+#ifdef TEGRA_PMX_PINS_HAVE_RCV_SEL
 enum pmux_pin_rcv_sel {
 	PMUX_PIN_RCV_SEL_DEFAULT = 0,
 	PMUX_PIN_RCV_SEL_NORMAL,
 	PMUX_PIN_RCV_SEL_HIGH,
 };
-#endif /* TEGRA_PMX_HAS_RCV_SEL */
-#endif /* TEGRA_PMX_HAS_PIN_IO_BIT_ETC */
+#endif
 
 /*
  * This defines the configuration for a pin, including the function assigned,
@@ -68,19 +74,25 @@ struct pmux_pingrp_config {
 	u32 func:8;		/* function to assign PMUX_FUNC_... */
 	u32 pull:2;		/* pull up/down/normal PMUX_PULL_...*/
 	u32 tristate:2;		/* tristate or normal PMUX_TRI_...  */
-#ifdef TEGRA_PMX_HAS_PIN_IO_BIT_ETC
+#ifdef TEGRA_PMX_PINS_HAVE_E_INPUT
 	u32 io:2;		/* input or output PMUX_PIN_...     */
+#endif
+#ifdef TEGRA_PMX_PINS_HAVE_LOCK
 	u32 lock:2;		/* lock enable/disable PMUX_PIN...  */
+#endif
+#ifdef TEGRA_PMX_PINS_HAVE_OD
 	u32 od:2;		/* open-drain or push-pull driver   */
+#endif
+#ifdef TEGRA_PMX_PINS_HAVE_IO_RESET
 	u32 ioreset:2;		/* input/output reset PMUX_PIN...   */
-#ifdef TEGRA_PMX_HAS_RCV_SEL
+#endif
+#ifdef TEGRA_PMX_PINS_HAVE_RCV_SEL
 	u32 rcv_sel:2;		/* select between High and Normal  */
 				/* VIL/VIH receivers */
 #endif
-#endif
 };
 
-#if !defined(CONFIG_TEGRA20) && !defined(CONFIG_TEGRA30)
+#ifdef TEGRA_PMX_SOC_HAS_IO_CLAMPING
 /* Set/clear the pinmux CLAMP_INPUTS_WHEN_TRISTATED bit */
 void pinmux_set_tristate_input_clamping(void);
 void pinmux_clear_tristate_input_clamping(void);
@@ -98,7 +110,7 @@ void pinmux_tristate_enable(enum pmux_pingrp pin);
 /* Set a pin group to normal (non tristate) */
 void pinmux_tristate_disable(enum pmux_pingrp pin);
 
-#ifdef TEGRA_PMX_HAS_PIN_IO_BIT_ETC
+#ifdef TEGRA_PMX_PINS_HAVE_E_INPUT
 /* Set a pin group as input or output */
 void pinmux_set_io(enum pmux_pingrp pin, enum pmux_pin_io io);
 #endif
@@ -112,7 +124,7 @@ void pinmux_set_io(enum pmux_pingrp pin, enum pmux_pin_io io);
 void pinmux_config_pingrp_table(const struct pmux_pingrp_config *config,
 				int len);
 
-#ifdef TEGRA_PMX_HAS_DRVGRPS
+#ifdef TEGRA_PMX_SOC_HAS_DRVGRPS
 
 #define PMUX_SLWF_MIN	0
 #define PMUX_SLWF_MAX	3
@@ -176,7 +188,7 @@ struct pmux_drvgrp_config {
 void pinmux_config_drvgrp_table(const struct pmux_drvgrp_config *config,
 				int len);
 
-#endif /* TEGRA_PMX_HAS_DRVGRPS */
+#endif /* TEGRA_PMX_SOC_HAS_DRVGRPS */
 
 struct pmux_pingrp_desc {
 	u8 funcs[4];
diff --git a/arch/arm/include/asm/arch-tegra114/pinmux.h b/arch/arm/include/asm/arch-tegra114/pinmux.h
index b86562ac6dee..06a7572f0db6 100644
--- a/arch/arm/include/asm/arch-tegra114/pinmux.h
+++ b/arch/arm/include/asm/arch-tegra114/pinmux.h
@@ -313,9 +313,13 @@ enum pmux_func {
 	PMUX_FUNC_COUNT,
 };
 
-#define TEGRA_PMX_HAS_PIN_IO_BIT_ETC
-#define TEGRA_PMX_HAS_RCV_SEL
-#define TEGRA_PMX_HAS_DRVGRPS
+#define TEGRA_PMX_SOC_HAS_IO_CLAMPING
+#define TEGRA_PMX_SOC_HAS_DRVGRPS
+#define TEGRA_PMX_PINS_HAVE_E_INPUT
+#define TEGRA_PMX_PINS_HAVE_LOCK
+#define TEGRA_PMX_PINS_HAVE_OD
+#define TEGRA_PMX_PINS_HAVE_IO_RESET
+#define TEGRA_PMX_PINS_HAVE_RCV_SEL
 #include <asm/arch-tegra/pinmux.h>
 
 #endif /* _TEGRA114_PINMUX_H_ */
diff --git a/arch/arm/include/asm/arch-tegra124/pinmux.h b/arch/arm/include/asm/arch-tegra124/pinmux.h
index 1884935a579e..c440f9fe5aff 100644
--- a/arch/arm/include/asm/arch-tegra124/pinmux.h
+++ b/arch/arm/include/asm/arch-tegra124/pinmux.h
@@ -335,9 +335,13 @@ enum pmux_func {
 	PMUX_FUNC_COUNT,
 };
 
-#define TEGRA_PMX_HAS_PIN_IO_BIT_ETC
-#define TEGRA_PMX_HAS_RCV_SEL
-#define TEGRA_PMX_HAS_DRVGRPS
+#define TEGRA_PMX_SOC_HAS_IO_CLAMPING
+#define TEGRA_PMX_SOC_HAS_DRVGRPS
+#define TEGRA_PMX_PINS_HAVE_E_INPUT
+#define TEGRA_PMX_PINS_HAVE_LOCK
+#define TEGRA_PMX_PINS_HAVE_OD
+#define TEGRA_PMX_PINS_HAVE_IO_RESET
+#define TEGRA_PMX_PINS_HAVE_RCV_SEL
 #include <asm/arch-tegra/pinmux.h>
 
 #endif /* _TEGRA124_PINMUX_H_ */
diff --git a/arch/arm/include/asm/arch-tegra30/pinmux.h b/arch/arm/include/asm/arch-tegra30/pinmux.h
index a42e00990f0c..e9046ff36fdd 100644
--- a/arch/arm/include/asm/arch-tegra30/pinmux.h
+++ b/arch/arm/include/asm/arch-tegra30/pinmux.h
@@ -391,8 +391,11 @@ enum pmux_func {
 	PMUX_FUNC_COUNT,
 };
 
-#define TEGRA_PMX_HAS_PIN_IO_BIT_ETC
-#define TEGRA_PMX_HAS_DRVGRPS
+#define TEGRA_PMX_SOC_HAS_DRVGRPS
+#define TEGRA_PMX_PINS_HAVE_E_INPUT
+#define TEGRA_PMX_PINS_HAVE_LOCK
+#define TEGRA_PMX_PINS_HAVE_OD
+#define TEGRA_PMX_PINS_HAVE_IO_RESET
 #include <asm/arch-tegra/pinmux.h>
 
 #endif /* _TEGRA30_PINMUX_H_ */
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [U-Boot] [PATCH 3/9] ARM: tegra: pinmux: handle feature removal on newer SoCs
  2015-02-24 21:08 [U-Boot] [PATCH 0/9] ARM: tegra: pinmux: Tegra210 support Stephen Warren
  2015-02-24 21:08 ` [U-Boot] [PATCH 1/9] ARM: tegra: pinmux: add note re: drive group field defines Stephen Warren
  2015-02-24 21:08 ` [U-Boot] [PATCH 2/9] ARM: tegra: pinmux: simplify some defines Stephen Warren
@ 2015-02-24 21:08 ` Stephen Warren
  2015-02-24 21:08 ` [U-Boot] [PATCH 4/9] ARM: tegra: pinmux: move some type definitions Stephen Warren
                   ` (7 subsequent siblings)
  10 siblings, 0 replies; 20+ messages in thread
From: Stephen Warren @ 2015-02-24 21:08 UTC (permalink / raw)
  To: u-boot

From: Stephen Warren <swarren@nvidia.com>

On some future SoCs, some of the per-drive-group features no longer
exist. Add some ifdefs to support this.

Signed-off-by: Stephen Warren <swarren@nvidia.com>
---
 arch/arm/cpu/tegra-common/pinmux-common.c   | 24 ++++++++++++++++++++++++
 arch/arm/include/asm/arch-tegra/pinmux.h    | 12 ++++++++++++
 arch/arm/include/asm/arch-tegra114/pinmux.h |  3 +++
 arch/arm/include/asm/arch-tegra124/pinmux.h |  3 +++
 arch/arm/include/asm/arch-tegra30/pinmux.h  |  3 +++
 5 files changed, 45 insertions(+)

diff --git a/arch/arm/cpu/tegra-common/pinmux-common.c b/arch/arm/cpu/tegra-common/pinmux-common.c
index 5d4d2e9c3002..f24e8c4c50ca 100644
--- a/arch/arm/cpu/tegra-common/pinmux-common.c
+++ b/arch/arm/cpu/tegra-common/pinmux-common.c
@@ -352,19 +352,31 @@ void pinmux_config_pingrp_table(const struct pmux_pingrp_config *config,
 #define pmux_drv_isvalid(drv) \
 	(((drv) >= PMUX_DRVUP_MIN) && ((drv) <= PMUX_DRVUP_MAX))
 
+#ifdef TEGRA_PMX_GRPS_HAVE_LPMD
 #define pmux_lpmd_isvalid(lpm) \
 	(((lpm) >= PMUX_LPMD_X8) && ((lpm) <= PMUX_LPMD_X))
+#endif
 
+#ifdef TEGRA_PMX_GRPS_HAVE_SCHMT
 #define pmux_schmt_isvalid(schmt) \
 	(((schmt) >= PMUX_SCHMT_DISABLE) && ((schmt) <= PMUX_SCHMT_ENABLE))
+#endif
 
+#ifdef TEGRA_PMX_GRPS_HAVE_HSM
 #define pmux_hsm_isvalid(hsm) \
 	(((hsm) >= PMUX_HSM_DISABLE) && ((hsm) <= PMUX_HSM_ENABLE))
+#endif
 
+#ifdef TEGRA_PMX_GRPS_HAVE_HSM
 #define HSM_SHIFT	2
+#endif
+#ifdef TEGRA_PMX_GRPS_HAVE_SCHMT
 #define SCHMT_SHIFT	3
+#endif
+#ifdef TEGRA_PMX_GRPS_HAVE_LPMD
 #define LPMD_SHIFT	4
 #define LPMD_MASK	(3 << LPMD_SHIFT)
+#endif
 /*
  * Note that the following DRV* and SLW* defines are accurate for many drive
  * groups on many SoCs. We really need a per-group data structure to solve
@@ -473,6 +485,7 @@ static void pinmux_set_drvdn(enum pmux_drvgrp grp, int drvdn)
 	return;
 }
 
+#ifdef TEGRA_PMX_GRPS_HAVE_LPMD
 static void pinmux_set_lpmd(enum pmux_drvgrp grp, enum pmux_lpmd lpmd)
 {
 	u32 *reg = DRV_REG(grp);
@@ -493,7 +506,9 @@ static void pinmux_set_lpmd(enum pmux_drvgrp grp, enum pmux_lpmd lpmd)
 
 	return;
 }
+#endif
 
+#ifdef TEGRA_PMX_GRPS_HAVE_SCHMT
 static void pinmux_set_schmt(enum pmux_drvgrp grp, enum pmux_schmt schmt)
 {
 	u32 *reg = DRV_REG(grp);
@@ -516,7 +531,9 @@ static void pinmux_set_schmt(enum pmux_drvgrp grp, enum pmux_schmt schmt)
 
 	return;
 }
+#endif
 
+#ifdef TEGRA_PMX_GRPS_HAVE_HSM
 static void pinmux_set_hsm(enum pmux_drvgrp grp, enum pmux_hsm hsm)
 {
 	u32 *reg = DRV_REG(grp);
@@ -539,6 +556,7 @@ static void pinmux_set_hsm(enum pmux_drvgrp grp, enum pmux_hsm hsm)
 
 	return;
 }
+#endif
 
 static void pinmux_config_drvgrp(const struct pmux_drvgrp_config *config)
 {
@@ -548,9 +566,15 @@ static void pinmux_config_drvgrp(const struct pmux_drvgrp_config *config)
 	pinmux_set_drvdn_slwr(grp, config->slwr);
 	pinmux_set_drvup(grp, config->drvup);
 	pinmux_set_drvdn(grp, config->drvdn);
+#ifdef TEGRA_PMX_GRPS_HAVE_LPMD
 	pinmux_set_lpmd(grp, config->lpmd);
+#endif
+#ifdef TEGRA_PMX_GRPS_HAVE_SCHMT
 	pinmux_set_schmt(grp, config->schmt);
+#endif
+#ifdef TEGRA_PMX_GRPS_HAVE_HSM
 	pinmux_set_hsm(grp, config->hsm);
+#endif
 }
 
 void pinmux_config_drvgrp_table(const struct pmux_drvgrp_config *config,
diff --git a/arch/arm/include/asm/arch-tegra/pinmux.h b/arch/arm/include/asm/arch-tegra/pinmux.h
index c95c9738f310..cb61aa1fa185 100644
--- a/arch/arm/include/asm/arch-tegra/pinmux.h
+++ b/arch/arm/include/asm/arch-tegra/pinmux.h
@@ -142,6 +142,7 @@ void pinmux_config_pingrp_table(const struct pmux_pingrp_config *config,
 #define PMUX_DRVDN_MAX	127
 #define PMUX_DRVDN_NONE	-1
 
+#ifdef TEGRA_PMX_GRPS_HAVE_LPMD
 /* Defines a pin group cfg's low-power mode select */
 enum pmux_lpmd {
 	PMUX_LPMD_X8 = 0,
@@ -150,20 +151,25 @@ enum pmux_lpmd {
 	PMUX_LPMD_X,
 	PMUX_LPMD_NONE = -1,
 };
+#endif
 
+#ifdef TEGRA_PMX_GRPS_HAVE_SCHMT
 /* Defines whether a pin group cfg's schmidt is enabled or not */
 enum pmux_schmt {
 	PMUX_SCHMT_DISABLE = 0,
 	PMUX_SCHMT_ENABLE = 1,
 	PMUX_SCHMT_NONE = -1,
 };
+#endif
 
+#ifdef TEGRA_PMX_GRPS_HAVE_HSM
 /* Defines whether a pin group cfg's high-speed mode is enabled or not */
 enum pmux_hsm {
 	PMUX_HSM_DISABLE = 0,
 	PMUX_HSM_ENABLE = 1,
 	PMUX_HSM_NONE = -1,
 };
+#endif
 
 /*
  * This defines the configuration for a pin group's pad control config
@@ -174,9 +180,15 @@ struct pmux_drvgrp_config {
 	u32 slwr:3;		/* rising edge slew          */
 	u32 drvup:8;		/* pull-up drive strength    */
 	u32 drvdn:8;		/* pull-down drive strength  */
+#ifdef TEGRA_PMX_GRPS_HAVE_LPMD
 	u32 lpmd:3;		/* low-power mode selection  */
+#endif
+#ifdef TEGRA_PMX_GRPS_HAVE_SCHMT
 	u32 schmt:2;		/* schmidt enable            */
+#endif
+#ifdef TEGRA_PMX_GRPS_HAVE_HSM
 	u32 hsm:2;		/* high-speed mode enable    */
+#endif
 };
 
 /**
diff --git a/arch/arm/include/asm/arch-tegra114/pinmux.h b/arch/arm/include/asm/arch-tegra114/pinmux.h
index 06a7572f0db6..4848c95c5580 100644
--- a/arch/arm/include/asm/arch-tegra114/pinmux.h
+++ b/arch/arm/include/asm/arch-tegra114/pinmux.h
@@ -315,6 +315,9 @@ enum pmux_func {
 
 #define TEGRA_PMX_SOC_HAS_IO_CLAMPING
 #define TEGRA_PMX_SOC_HAS_DRVGRPS
+#define TEGRA_PMX_GRPS_HAVE_LPMD
+#define TEGRA_PMX_GRPS_HAVE_SCHMT
+#define TEGRA_PMX_GRPS_HAVE_HSM
 #define TEGRA_PMX_PINS_HAVE_E_INPUT
 #define TEGRA_PMX_PINS_HAVE_LOCK
 #define TEGRA_PMX_PINS_HAVE_OD
diff --git a/arch/arm/include/asm/arch-tegra124/pinmux.h b/arch/arm/include/asm/arch-tegra124/pinmux.h
index c440f9fe5aff..4e6b88ec0e6d 100644
--- a/arch/arm/include/asm/arch-tegra124/pinmux.h
+++ b/arch/arm/include/asm/arch-tegra124/pinmux.h
@@ -337,6 +337,9 @@ enum pmux_func {
 
 #define TEGRA_PMX_SOC_HAS_IO_CLAMPING
 #define TEGRA_PMX_SOC_HAS_DRVGRPS
+#define TEGRA_PMX_GRPS_HAVE_LPMD
+#define TEGRA_PMX_GRPS_HAVE_SCHMT
+#define TEGRA_PMX_GRPS_HAVE_HSM
 #define TEGRA_PMX_PINS_HAVE_E_INPUT
 #define TEGRA_PMX_PINS_HAVE_LOCK
 #define TEGRA_PMX_PINS_HAVE_OD
diff --git a/arch/arm/include/asm/arch-tegra30/pinmux.h b/arch/arm/include/asm/arch-tegra30/pinmux.h
index e9046ff36fdd..56117a4b1ba1 100644
--- a/arch/arm/include/asm/arch-tegra30/pinmux.h
+++ b/arch/arm/include/asm/arch-tegra30/pinmux.h
@@ -392,6 +392,9 @@ enum pmux_func {
 };
 
 #define TEGRA_PMX_SOC_HAS_DRVGRPS
+#define TEGRA_PMX_GRPS_HAVE_LPMD
+#define TEGRA_PMX_GRPS_HAVE_SCHMT
+#define TEGRA_PMX_GRPS_HAVE_HSM
 #define TEGRA_PMX_PINS_HAVE_E_INPUT
 #define TEGRA_PMX_PINS_HAVE_LOCK
 #define TEGRA_PMX_PINS_HAVE_OD
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [U-Boot] [PATCH 4/9] ARM: tegra: pinmux: move some type definitions
  2015-02-24 21:08 [U-Boot] [PATCH 0/9] ARM: tegra: pinmux: Tegra210 support Stephen Warren
                   ` (2 preceding siblings ...)
  2015-02-24 21:08 ` [U-Boot] [PATCH 3/9] ARM: tegra: pinmux: handle feature removal on newer SoCs Stephen Warren
@ 2015-02-24 21:08 ` Stephen Warren
  2015-02-24 21:08 ` [U-Boot] [PATCH 5/9] ARM: tegra: pinmux: partially handle varying register layouts Stephen Warren
                   ` (6 subsequent siblings)
  10 siblings, 0 replies; 20+ messages in thread
From: Stephen Warren @ 2015-02-24 21:08 UTC (permalink / raw)
  To: u-boot

From: Stephen Warren <swarren@nvidia.com>

On some future SoCs, some per-drive-group features became per-pin
features. Move all type definitions early in the header so they can
be enabled irrespective of the setting of TEGRA_PMX_SOC_HAS_DRVGRPS.

Signed-off-by: Stephen Warren <swarren@nvidia.com>
---
 arch/arm/cpu/tegra-common/pinmux-common.c | 30 ++++++++--------
 arch/arm/include/asm/arch-tegra/pinmux.h  | 58 +++++++++++++++----------------
 2 files changed, 44 insertions(+), 44 deletions(-)

diff --git a/arch/arm/cpu/tegra-common/pinmux-common.c b/arch/arm/cpu/tegra-common/pinmux-common.c
index f24e8c4c50ca..843c688200b3 100644
--- a/arch/arm/cpu/tegra-common/pinmux-common.c
+++ b/arch/arm/cpu/tegra-common/pinmux-common.c
@@ -56,6 +56,21 @@
 	 ((rcv_sel) <= PMUX_PIN_RCV_SEL_HIGH))
 #endif
 
+#ifdef TEGRA_PMX_GRPS_HAVE_LPMD
+#define pmux_lpmd_isvalid(lpm) \
+	(((lpm) >= PMUX_LPMD_X8) && ((lpm) <= PMUX_LPMD_X))
+#endif
+
+#ifdef TEGRA_PMX_GRPS_HAVE_SCHMT
+#define pmux_schmt_isvalid(schmt) \
+	(((schmt) >= PMUX_SCHMT_DISABLE) && ((schmt) <= PMUX_SCHMT_ENABLE))
+#endif
+
+#ifdef TEGRA_PMX_GRPS_HAVE_HSM
+#define pmux_hsm_isvalid(hsm) \
+	(((hsm) >= PMUX_HSM_DISABLE) && ((hsm) <= PMUX_HSM_ENABLE))
+#endif
+
 #define _R(offset)	(u32 *)(NV_PA_APB_MISC_BASE + (offset))
 
 #if defined(CONFIG_TEGRA20)
@@ -352,21 +367,6 @@ void pinmux_config_pingrp_table(const struct pmux_pingrp_config *config,
 #define pmux_drv_isvalid(drv) \
 	(((drv) >= PMUX_DRVUP_MIN) && ((drv) <= PMUX_DRVUP_MAX))
 
-#ifdef TEGRA_PMX_GRPS_HAVE_LPMD
-#define pmux_lpmd_isvalid(lpm) \
-	(((lpm) >= PMUX_LPMD_X8) && ((lpm) <= PMUX_LPMD_X))
-#endif
-
-#ifdef TEGRA_PMX_GRPS_HAVE_SCHMT
-#define pmux_schmt_isvalid(schmt) \
-	(((schmt) >= PMUX_SCHMT_DISABLE) && ((schmt) <= PMUX_SCHMT_ENABLE))
-#endif
-
-#ifdef TEGRA_PMX_GRPS_HAVE_HSM
-#define pmux_hsm_isvalid(hsm) \
-	(((hsm) >= PMUX_HSM_DISABLE) && ((hsm) <= PMUX_HSM_ENABLE))
-#endif
-
 #ifdef TEGRA_PMX_GRPS_HAVE_HSM
 #define HSM_SHIFT	2
 #endif
diff --git a/arch/arm/include/asm/arch-tegra/pinmux.h b/arch/arm/include/asm/arch-tegra/pinmux.h
index cb61aa1fa185..1562fa410c42 100644
--- a/arch/arm/include/asm/arch-tegra/pinmux.h
+++ b/arch/arm/include/asm/arch-tegra/pinmux.h
@@ -63,6 +63,35 @@ enum pmux_pin_rcv_sel {
 };
 #endif
 
+#ifdef TEGRA_PMX_GRPS_HAVE_LPMD
+/* Defines a pin group cfg's low-power mode select */
+enum pmux_lpmd {
+	PMUX_LPMD_X8 = 0,
+	PMUX_LPMD_X4,
+	PMUX_LPMD_X2,
+	PMUX_LPMD_X,
+	PMUX_LPMD_NONE = -1,
+};
+#endif
+
+#ifdef TEGRA_PMX_GRPS_HAVE_SCHMT
+/* Defines whether a pin group cfg's schmidt is enabled or not */
+enum pmux_schmt {
+	PMUX_SCHMT_DISABLE = 0,
+	PMUX_SCHMT_ENABLE = 1,
+	PMUX_SCHMT_NONE = -1,
+};
+#endif
+
+#ifdef TEGRA_PMX_GRPS_HAVE_HSM
+/* Defines whether a pin group cfg's high-speed mode is enabled or not */
+enum pmux_hsm {
+	PMUX_HSM_DISABLE = 0,
+	PMUX_HSM_ENABLE = 1,
+	PMUX_HSM_NONE = -1,
+};
+#endif
+
 /*
  * This defines the configuration for a pin, including the function assigned,
  * pull up/down settings and tristate settings. Having set up one of these
@@ -142,35 +171,6 @@ void pinmux_config_pingrp_table(const struct pmux_pingrp_config *config,
 #define PMUX_DRVDN_MAX	127
 #define PMUX_DRVDN_NONE	-1
 
-#ifdef TEGRA_PMX_GRPS_HAVE_LPMD
-/* Defines a pin group cfg's low-power mode select */
-enum pmux_lpmd {
-	PMUX_LPMD_X8 = 0,
-	PMUX_LPMD_X4,
-	PMUX_LPMD_X2,
-	PMUX_LPMD_X,
-	PMUX_LPMD_NONE = -1,
-};
-#endif
-
-#ifdef TEGRA_PMX_GRPS_HAVE_SCHMT
-/* Defines whether a pin group cfg's schmidt is enabled or not */
-enum pmux_schmt {
-	PMUX_SCHMT_DISABLE = 0,
-	PMUX_SCHMT_ENABLE = 1,
-	PMUX_SCHMT_NONE = -1,
-};
-#endif
-
-#ifdef TEGRA_PMX_GRPS_HAVE_HSM
-/* Defines whether a pin group cfg's high-speed mode is enabled or not */
-enum pmux_hsm {
-	PMUX_HSM_DISABLE = 0,
-	PMUX_HSM_ENABLE = 1,
-	PMUX_HSM_NONE = -1,
-};
-#endif
-
 /*
  * This defines the configuration for a pin group's pad control config
  */
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [U-Boot] [PATCH 5/9] ARM: tegra: pinmux: partially handle varying register layouts
  2015-02-24 21:08 [U-Boot] [PATCH 0/9] ARM: tegra: pinmux: Tegra210 support Stephen Warren
                   ` (3 preceding siblings ...)
  2015-02-24 21:08 ` [U-Boot] [PATCH 4/9] ARM: tegra: pinmux: move some type definitions Stephen Warren
@ 2015-02-24 21:08 ` Stephen Warren
  2015-02-24 21:08 ` [U-Boot] [PATCH 6/9] ARM: tegra: pinmux: support hsm/schmitt on pins Stephen Warren
                   ` (5 subsequent siblings)
  10 siblings, 0 replies; 20+ messages in thread
From: Stephen Warren @ 2015-02-24 21:08 UTC (permalink / raw)
  To: u-boot

From: Stephen Warren <swarren@nvidia.com>

Tegra210 moves some bits around in the pinmux registers. Update the code
to handle this.

This doesn't attempt to address the issues with the group-to-group varying
drive group register layout mentioned earlier. This patch handles the
SoC-to-SoC differences in the mux register layout.

Signed-off-by: Stephen Warren <swarren@nvidia.com>
---
 arch/arm/cpu/tegra-common/pinmux-common.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/arch/arm/cpu/tegra-common/pinmux-common.c b/arch/arm/cpu/tegra-common/pinmux-common.c
index 843c688200b3..1730d20312b0 100644
--- a/arch/arm/cpu/tegra-common/pinmux-common.c
+++ b/arch/arm/cpu/tegra-common/pinmux-common.c
@@ -101,11 +101,23 @@
 
 #define DRV_REG(group)	_R(0x868 + ((group) * 4))
 
+/*
+ * We could force arch-tegraNN/pinmux.h to define all of these. However,
+ * that's a lot of defines, and for now it's manageable to just put a
+ * special case here. It's possible this decision will change with future
+ * SoCs.
+ */
+#ifdef CONFIG_TEGRA210
+#define IO_SHIFT	6
+#define LOCK_SHIFT	7
+#define OD_SHIFT	11
+#else
 #define IO_SHIFT	5
 #define OD_SHIFT	6
 #define LOCK_SHIFT	7
 #define IO_RESET_SHIFT	8
 #define RCV_SEL_SHIFT	9
+#endif
 
 #ifdef TEGRA_PMX_SOC_HAS_IO_CLAMPING
 /* This register/field only exists on Tegra114 and later */
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [U-Boot] [PATCH 6/9] ARM: tegra: pinmux: support hsm/schmitt on pins
  2015-02-24 21:08 [U-Boot] [PATCH 0/9] ARM: tegra: pinmux: Tegra210 support Stephen Warren
                   ` (4 preceding siblings ...)
  2015-02-24 21:08 ` [U-Boot] [PATCH 5/9] ARM: tegra: pinmux: partially handle varying register layouts Stephen Warren
@ 2015-02-24 21:08 ` Stephen Warren
  2015-02-24 21:08 ` [U-Boot] [PATCH 7/9] ARM: tegra: pinmux: account for different drivegroup base registers Stephen Warren
                   ` (4 subsequent siblings)
  10 siblings, 0 replies; 20+ messages in thread
From: Stephen Warren @ 2015-02-24 21:08 UTC (permalink / raw)
  To: u-boot

From: Stephen Warren <swarren@nvidia.com>

T210 support HSM and Schmitt options in the pinmux register (previous
chips placed these options in the drive group register). Update the
code to handle this.

Signed-off-by: Stephen Warren <swarren@nvidia.com>
---
 arch/arm/cpu/tegra-common/pinmux-common.c | 66 ++++++++++++++++++++++++++++++-
 arch/arm/include/asm/arch-tegra/pinmux.h  | 10 ++++-
 2 files changed, 72 insertions(+), 4 deletions(-)

diff --git a/arch/arm/cpu/tegra-common/pinmux-common.c b/arch/arm/cpu/tegra-common/pinmux-common.c
index 1730d20312b0..b4ed153a2e32 100644
--- a/arch/arm/cpu/tegra-common/pinmux-common.c
+++ b/arch/arm/cpu/tegra-common/pinmux-common.c
@@ -61,12 +61,12 @@
 	(((lpm) >= PMUX_LPMD_X8) && ((lpm) <= PMUX_LPMD_X))
 #endif
 
-#ifdef TEGRA_PMX_GRPS_HAVE_SCHMT
+#if defined(TEGRA_PMX_PINS_HAVE_SCHMT) || defined(TEGRA_PMX_GRPS_HAVE_SCHMT)
 #define pmux_schmt_isvalid(schmt) \
 	(((schmt) >= PMUX_SCHMT_DISABLE) && ((schmt) <= PMUX_SCHMT_ENABLE))
 #endif
 
-#ifdef TEGRA_PMX_GRPS_HAVE_HSM
+#if defined(TEGRA_PMX_PINS_HAVE_HSM) || defined(TEGRA_PMX_GRPS_HAVE_HSM)
 #define pmux_hsm_isvalid(hsm) \
 	(((hsm) >= PMUX_HSM_DISABLE) && ((hsm) <= PMUX_HSM_ENABLE))
 #endif
@@ -110,7 +110,13 @@
 #ifdef CONFIG_TEGRA210
 #define IO_SHIFT	6
 #define LOCK_SHIFT	7
+#ifdef TEGRA_PMX_PINS_HAVE_HSM
+#define HSM_SHIFT	9
+#endif
 #define OD_SHIFT	11
+#ifdef TEGRA_PMX_PINS_HAVE_SCHMT
+#define SCHMT_SHIFT	12
+#endif
 #else
 #define IO_SHIFT	5
 #define OD_SHIFT	6
@@ -336,6 +342,56 @@ static void pinmux_set_rcv_sel(enum pmux_pingrp pin,
 }
 #endif
 
+#ifdef TEGRA_PMX_PINS_HAVE_SCHMT
+static void pinmux_set_schmt(enum pmux_pingrp pin, enum pmux_schmt schmt)
+{
+	u32 *reg = REG(grp);
+	u32 val;
+
+	/* NONE means unspecified/do not change/use POR value */
+	if (schmt == PMUX_SCHMT_NONE)
+		return;
+
+	/* Error check pad */
+	assert(pmux_pingrp_isvalid(pin));
+	assert(pmux_schmt_isvalid(schmt));
+
+	val = readl(reg);
+	if (schmt == PMUX_SCHMT_ENABLE)
+		val |= (1 << SCHMT_SHIFT);
+	else
+		val &= ~(1 << SCHMT_SHIFT);
+	writel(val, reg);
+
+	return;
+}
+#endif
+
+#ifdef TEGRA_PMX_PINS_HAVE_HSM
+static void pinmux_set_hsm(enum pmux_pingrp pin, enum pmux_hsm hsm)
+{
+	u32 *reg = REG(grp);
+	u32 val;
+
+	/* NONE means unspecified/do not change/use POR value */
+	if (hsm == PMUX_HSM_NONE)
+		return;
+
+	/* Error check pad */
+	assert(pmux_pingrp_isvalid(pin));
+	assert(pmux_hsm_isvalid(hsm));
+
+	val = readl(reg);
+	if (hsm == PMUX_HSM_ENABLE)
+		val |= (1 << HSM_SHIFT);
+	else
+		val &= ~(1 << HSM_SHIFT);
+	writel(val, reg);
+
+	return;
+}
+#endif
+
 static void pinmux_config_pingrp(const struct pmux_pingrp_config *config)
 {
 	enum pmux_pingrp pin = config->pingrp;
@@ -358,6 +414,12 @@ static void pinmux_config_pingrp(const struct pmux_pingrp_config *config)
 #ifdef TEGRA_PMX_PINS_HAVE_RCV_SEL
 	pinmux_set_rcv_sel(pin, config->rcv_sel);
 #endif
+#ifdef TEGRA_PMX_PINS_HAVE_SCHMT
+	pinmux_set_schmt(pin, config->schmt);
+#endif
+#ifdef TEGRA_PMX_PINS_HAVE_HSM
+	pinmux_set_hsm(pin, config->hsm);
+#endif
 }
 
 void pinmux_config_pingrp_table(const struct pmux_pingrp_config *config,
diff --git a/arch/arm/include/asm/arch-tegra/pinmux.h b/arch/arm/include/asm/arch-tegra/pinmux.h
index 1562fa410c42..d87da10e0d7d 100644
--- a/arch/arm/include/asm/arch-tegra/pinmux.h
+++ b/arch/arm/include/asm/arch-tegra/pinmux.h
@@ -74,7 +74,7 @@ enum pmux_lpmd {
 };
 #endif
 
-#ifdef TEGRA_PMX_GRPS_HAVE_SCHMT
+#if defined(TEGRA_PMX_PINS_HAVE_SCHMT) || defined(TEGRA_PMX_GRPS_HAVE_SCHMT)
 /* Defines whether a pin group cfg's schmidt is enabled or not */
 enum pmux_schmt {
 	PMUX_SCHMT_DISABLE = 0,
@@ -83,7 +83,7 @@ enum pmux_schmt {
 };
 #endif
 
-#ifdef TEGRA_PMX_GRPS_HAVE_HSM
+#if defined(TEGRA_PMX_PINS_HAVE_HSM) || defined(TEGRA_PMX_GRPS_HAVE_HSM)
 /* Defines whether a pin group cfg's high-speed mode is enabled or not */
 enum pmux_hsm {
 	PMUX_HSM_DISABLE = 0,
@@ -119,6 +119,12 @@ struct pmux_pingrp_config {
 	u32 rcv_sel:2;		/* select between High and Normal  */
 				/* VIL/VIH receivers */
 #endif
+#ifdef TEGRA_PMX_PINS_HAVE_SCHMT
+	u32 schmt:2;		/* schmitt enable            */
+#endif
+#ifdef TEGRA_PMX_PINS_HAVE_HSM
+	u32 hsm:2;		/* high-speed mode enable    */
+#endif
 };
 
 #ifdef TEGRA_PMX_SOC_HAS_IO_CLAMPING
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [U-Boot] [PATCH 7/9] ARM: tegra: pinmux: account for different drivegroup base registers
  2015-02-24 21:08 [U-Boot] [PATCH 0/9] ARM: tegra: pinmux: Tegra210 support Stephen Warren
                   ` (5 preceding siblings ...)
  2015-02-24 21:08 ` [U-Boot] [PATCH 6/9] ARM: tegra: pinmux: support hsm/schmitt on pins Stephen Warren
@ 2015-02-24 21:08 ` Stephen Warren
  2015-02-24 21:08 ` [U-Boot] [PATCH 8/9] ARM: tegra: pinmux: support Tegra210's e_io_hv pin option Stephen Warren
                   ` (3 subsequent siblings)
  10 siblings, 0 replies; 20+ messages in thread
From: Stephen Warren @ 2015-02-24 21:08 UTC (permalink / raw)
  To: u-boot

From: Stephen Warren <swarren@nvidia.com>

Tegra210 starts its drive group registers at a different offset from the
APB MISC register block that other SoCs. Update the code to handle this.

Signed-off-by: Stephen Warren <swarren@nvidia.com>
---
 arch/arm/cpu/tegra-common/pinmux-common.c   | 2 +-
 arch/arm/include/asm/arch-tegra114/pinmux.h | 1 +
 arch/arm/include/asm/arch-tegra124/pinmux.h | 1 +
 arch/arm/include/asm/arch-tegra20/pinmux.h  | 1 +
 arch/arm/include/asm/arch-tegra30/pinmux.h  | 1 +
 5 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/arch/arm/cpu/tegra-common/pinmux-common.c b/arch/arm/cpu/tegra-common/pinmux-common.c
index b4ed153a2e32..9bf30869712e 100644
--- a/arch/arm/cpu/tegra-common/pinmux-common.c
+++ b/arch/arm/cpu/tegra-common/pinmux-common.c
@@ -99,7 +99,7 @@
 
 #endif /* CONFIG_TEGRA20 */
 
-#define DRV_REG(group)	_R(0x868 + ((group) * 4))
+#define DRV_REG(group)	_R(TEGRA_PMX_SOC_DRV_GROUP_BASE_REG + ((group) * 4))
 
 /*
  * We could force arch-tegraNN/pinmux.h to define all of these. However,
diff --git a/arch/arm/include/asm/arch-tegra114/pinmux.h b/arch/arm/include/asm/arch-tegra114/pinmux.h
index 4848c95c5580..38d8b9cf4d03 100644
--- a/arch/arm/include/asm/arch-tegra114/pinmux.h
+++ b/arch/arm/include/asm/arch-tegra114/pinmux.h
@@ -313,6 +313,7 @@ enum pmux_func {
 	PMUX_FUNC_COUNT,
 };
 
+#define TEGRA_PMX_SOC_DRV_GROUP_BASE_REG 0x868
 #define TEGRA_PMX_SOC_HAS_IO_CLAMPING
 #define TEGRA_PMX_SOC_HAS_DRVGRPS
 #define TEGRA_PMX_GRPS_HAVE_LPMD
diff --git a/arch/arm/include/asm/arch-tegra124/pinmux.h b/arch/arm/include/asm/arch-tegra124/pinmux.h
index 4e6b88ec0e6d..78bc9e6f178b 100644
--- a/arch/arm/include/asm/arch-tegra124/pinmux.h
+++ b/arch/arm/include/asm/arch-tegra124/pinmux.h
@@ -335,6 +335,7 @@ enum pmux_func {
 	PMUX_FUNC_COUNT,
 };
 
+#define TEGRA_PMX_SOC_DRV_GROUP_BASE_REG 0x868
 #define TEGRA_PMX_SOC_HAS_IO_CLAMPING
 #define TEGRA_PMX_SOC_HAS_DRVGRPS
 #define TEGRA_PMX_GRPS_HAVE_LPMD
diff --git a/arch/arm/include/asm/arch-tegra20/pinmux.h b/arch/arm/include/asm/arch-tegra20/pinmux.h
index f7bc97fe5f73..bf35d50ba316 100644
--- a/arch/arm/include/asm/arch-tegra20/pinmux.h
+++ b/arch/arm/include/asm/arch-tegra20/pinmux.h
@@ -233,6 +233,7 @@ enum pmux_func {
 	PMUX_FUNC_COUNT,
 };
 
+#define TEGRA_PMX_SOC_DRV_GROUP_BASE_REG 0x868
 #include <asm/arch-tegra/pinmux.h>
 
 #endif /* _TEGRA20_PINMUX_H_ */
diff --git a/arch/arm/include/asm/arch-tegra30/pinmux.h b/arch/arm/include/asm/arch-tegra30/pinmux.h
index 56117a4b1ba1..3358bf7ce386 100644
--- a/arch/arm/include/asm/arch-tegra30/pinmux.h
+++ b/arch/arm/include/asm/arch-tegra30/pinmux.h
@@ -391,6 +391,7 @@ enum pmux_func {
 	PMUX_FUNC_COUNT,
 };
 
+#define TEGRA_PMX_SOC_DRV_GROUP_BASE_REG 0x868
 #define TEGRA_PMX_SOC_HAS_DRVGRPS
 #define TEGRA_PMX_GRPS_HAVE_LPMD
 #define TEGRA_PMX_GRPS_HAVE_SCHMT
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [U-Boot] [PATCH 8/9] ARM: tegra: pinmux: support Tegra210's e_io_hv pin option
  2015-02-24 21:08 [U-Boot] [PATCH 0/9] ARM: tegra: pinmux: Tegra210 support Stephen Warren
                   ` (6 preceding siblings ...)
  2015-02-24 21:08 ` [U-Boot] [PATCH 7/9] ARM: tegra: pinmux: account for different drivegroup base registers Stephen Warren
@ 2015-02-24 21:08 ` Stephen Warren
  2015-02-24 21:08 ` [U-Boot] [PATCH 9/9] ARM: tegra: pinmux: add Tegra210 support Stephen Warren
                   ` (2 subsequent siblings)
  10 siblings, 0 replies; 20+ messages in thread
From: Stephen Warren @ 2015-02-24 21:08 UTC (permalink / raw)
  To: u-boot

From: Stephen Warren <swarren@nvidia.com>

Tegra210 has a per-pin option named e_io_hv, which indicates that the
pin's input path should be configured to be 3.3v-tolerant. Add support
for this.

Note that this is very similar to previous chip's rcv_sel option.
However, since the Tegra TRM names this option differently for the
different chips, we support the new name so that the code exactly matches
the naming in the TRM, to avoid confusion.

This patch incorporates a few fixes from Tom Warren <twarren@nvidia.com>.

Signed-off-by: Stephen Warren <swarren@nvidia.com>
---
 arch/arm/cpu/tegra-common/pinmux-common.c | 36 +++++++++++++++++++++++++++++++
 arch/arm/include/asm/arch-tegra/pinmux.h  | 11 ++++++++++
 2 files changed, 47 insertions(+)

diff --git a/arch/arm/cpu/tegra-common/pinmux-common.c b/arch/arm/cpu/tegra-common/pinmux-common.c
index 9bf30869712e..912f65e98b06 100644
--- a/arch/arm/cpu/tegra-common/pinmux-common.c
+++ b/arch/arm/cpu/tegra-common/pinmux-common.c
@@ -56,6 +56,13 @@
 	 ((rcv_sel) <= PMUX_PIN_RCV_SEL_HIGH))
 #endif
 
+#ifdef TEGRA_PMX_PINS_HAVE_E_IO_HV
+/* return 1 if a pin_e_io_hv is in range */
+#define pmux_pin_e_io_hv_isvalid(e_io_hv) \
+	(((e_io_hv) >= PMUX_PIN_E_IO_HV_NORMAL) && \
+	 ((e_io_hv) <= PMUX_PIN_E_IO_HV_HIGH))
+#endif
+
 #ifdef TEGRA_PMX_GRPS_HAVE_LPMD
 #define pmux_lpmd_isvalid(lpm) \
 	(((lpm) >= PMUX_LPMD_X8) && ((lpm) <= PMUX_LPMD_X))
@@ -113,6 +120,7 @@
 #ifdef TEGRA_PMX_PINS_HAVE_HSM
 #define HSM_SHIFT	9
 #endif
+#define E_IO_HV_SHIFT	10
 #define OD_SHIFT	11
 #ifdef TEGRA_PMX_PINS_HAVE_SCHMT
 #define SCHMT_SHIFT	12
@@ -342,6 +350,31 @@ static void pinmux_set_rcv_sel(enum pmux_pingrp pin,
 }
 #endif
 
+#ifdef TEGRA_PMX_PINS_HAVE_E_IO_HV
+static void pinmux_set_e_io_hv(enum pmux_pingrp pin,
+				enum pmux_pin_e_io_hv e_io_hv)
+{
+	u32 *reg = REG(pin);
+	u32 val;
+
+	if (e_io_hv == PMUX_PIN_E_IO_HV_DEFAULT)
+		return;
+
+	/* Error check on pin and e_io_hv */
+	assert(pmux_pingrp_isvalid(pin));
+	assert(pmux_pin_e_io_hv_isvalid(e_io_hv));
+
+	val = readl(reg);
+	if (e_io_hv == PMUX_PIN_E_IO_HV_HIGH)
+		val |= (1 << E_IO_HV_SHIFT);
+	else
+		val &= ~(1 << E_IO_HV_SHIFT);
+	writel(val, reg);
+
+	return;
+}
+#endif
+
 #ifdef TEGRA_PMX_PINS_HAVE_SCHMT
 static void pinmux_set_schmt(enum pmux_pingrp pin, enum pmux_schmt schmt)
 {
@@ -414,6 +447,9 @@ static void pinmux_config_pingrp(const struct pmux_pingrp_config *config)
 #ifdef TEGRA_PMX_PINS_HAVE_RCV_SEL
 	pinmux_set_rcv_sel(pin, config->rcv_sel);
 #endif
+#ifdef TEGRA_PMX_PINS_HAVE_E_IO_HV
+	pinmux_set_e_io_hv(pin, config->e_io_hv);
+#endif
 #ifdef TEGRA_PMX_PINS_HAVE_SCHMT
 	pinmux_set_schmt(pin, config->schmt);
 #endif
diff --git a/arch/arm/include/asm/arch-tegra/pinmux.h b/arch/arm/include/asm/arch-tegra/pinmux.h
index d87da10e0d7d..4212e5769930 100644
--- a/arch/arm/include/asm/arch-tegra/pinmux.h
+++ b/arch/arm/include/asm/arch-tegra/pinmux.h
@@ -63,6 +63,14 @@ enum pmux_pin_rcv_sel {
 };
 #endif
 
+#ifdef TEGRA_PMX_PINS_HAVE_E_IO_HV
+enum pmux_pin_e_io_hv {
+	PMUX_PIN_E_IO_HV_DEFAULT = 0,
+	PMUX_PIN_E_IO_HV_NORMAL,
+	PMUX_PIN_E_IO_HV_HIGH,
+};
+#endif
+
 #ifdef TEGRA_PMX_GRPS_HAVE_LPMD
 /* Defines a pin group cfg's low-power mode select */
 enum pmux_lpmd {
@@ -119,6 +127,9 @@ struct pmux_pingrp_config {
 	u32 rcv_sel:2;		/* select between High and Normal  */
 				/* VIL/VIH receivers */
 #endif
+#ifdef TEGRA_PMX_PINS_HAVE_E_IO_HV
+	u32 e_io_hv:2;		/* select 3.3v tolerant receivers */
+#endif
 #ifdef TEGRA_PMX_PINS_HAVE_SCHMT
 	u32 schmt:2;		/* schmitt enable            */
 #endif
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [U-Boot] [PATCH 9/9] ARM: tegra: pinmux: add Tegra210 support
  2015-02-24 21:08 [U-Boot] [PATCH 0/9] ARM: tegra: pinmux: Tegra210 support Stephen Warren
                   ` (7 preceding siblings ...)
  2015-02-24 21:08 ` [U-Boot] [PATCH 8/9] ARM: tegra: pinmux: support Tegra210's e_io_hv pin option Stephen Warren
@ 2015-02-24 21:08 ` Stephen Warren
  2015-02-24 23:44 ` [U-Boot] [PATCH 0/9] ARM: tegra: pinmux: " Simon Glass
  2015-03-03 20:20 ` Stephen Warren
  10 siblings, 0 replies; 20+ messages in thread
From: Stephen Warren @ 2015-02-24 21:08 UTC (permalink / raw)
  To: u-boot

From: Stephen Warren <swarren@nvidia.com>

This patch incorporates a few fixes from Tom Warren <twarren@nvidia.com>.

Signed-off-by: Stephen Warren <swarren@nvidia.com>
---
 arch/arm/cpu/tegra210-common/pinmux.c       | 195 +++++++++++++
 arch/arm/include/asm/arch-tegra210/pinmux.h | 416 ++++++++++++++++++++++++++++
 2 files changed, 611 insertions(+)
 create mode 100644 arch/arm/cpu/tegra210-common/pinmux.c
 create mode 100644 arch/arm/include/asm/arch-tegra210/pinmux.h

diff --git a/arch/arm/cpu/tegra210-common/pinmux.c b/arch/arm/cpu/tegra210-common/pinmux.c
new file mode 100644
index 000000000000..a29c76b1fae6
--- /dev/null
+++ b/arch/arm/cpu/tegra210-common/pinmux.c
@@ -0,0 +1,195 @@
+/*
+ * Copyright (c) 2015, NVIDIA CORPORATION. All rights reserved.
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/arch/pinmux.h>
+
+#define PIN(pin, f0, f1, f2, f3)	\
+	{				\
+		.funcs = {		\
+			PMUX_FUNC_##f0,	\
+			PMUX_FUNC_##f1,	\
+			PMUX_FUNC_##f2,	\
+			PMUX_FUNC_##f3,	\
+		},			\
+	}
+
+#define PIN_RESERVED {}
+
+static const struct pmux_pingrp_desc tegra210_pingroups[] = {
+	/*  pin,                  f0,         f1,     f2,    f3 */
+	/* Offset 0x3000 */
+	PIN(SDMMC1_CLK_PM0,       SDMMC1,     RSVD1,  RSVD2, RSVD3),
+	PIN(SDMMC1_CMD_PM1,       SDMMC1,     SPI3,   RSVD2, RSVD3),
+	PIN(SDMMC1_DAT3_PM2,      SDMMC1,     SPI3,   RSVD2, RSVD3),
+	PIN(SDMMC1_DAT2_PM3,      SDMMC1,     SPI3,   RSVD2, RSVD3),
+	PIN(SDMMC1_DAT1_PM4,      SDMMC1,     SPI3,   RSVD2, RSVD3),
+	PIN(SDMMC1_DAT0_PM5,      SDMMC1,     RSVD1,  RSVD2, RSVD3),
+	PIN_RESERVED,
+	/* Offset 0x301c */
+	PIN(SDMMC3_CLK_PP0,       SDMMC3,     RSVD1,  RSVD2, RSVD3),
+	PIN(SDMMC3_CMD_PP1,       SDMMC3,     RSVD1,  RSVD2, RSVD3),
+	PIN(SDMMC3_DAT0_PP5,      SDMMC3,     RSVD1,  RSVD2, RSVD3),
+	PIN(SDMMC3_DAT1_PP4,      SDMMC3,     RSVD1,  RSVD2, RSVD3),
+	PIN(SDMMC3_DAT2_PP3,      SDMMC3,     RSVD1,  RSVD2, RSVD3),
+	PIN(SDMMC3_DAT3_PP2,      SDMMC3,     RSVD1,  RSVD2, RSVD3),
+	PIN_RESERVED,
+	/* Offset 0x3038 */
+	PIN(PEX_L0_RST_N_PA0,     PE0,        RSVD1,  RSVD2, RSVD3),
+	PIN(PEX_L0_CLKREQ_N_PA1,  PE0,        RSVD1,  RSVD2, RSVD3),
+	PIN(PEX_WAKE_N_PA2,       PE,         RSVD1,  RSVD2, RSVD3),
+	PIN(PEX_L1_RST_N_PA3,     PE1,        RSVD1,  RSVD2, RSVD3),
+	PIN(PEX_L1_CLKREQ_N_PA4,  PE1,        RSVD1,  RSVD2, RSVD3),
+	PIN(SATA_LED_ACTIVE_PA5,  SATA,       RSVD1,  RSVD2, RSVD3),
+	PIN(SPI1_MOSI_PC0,        SPI1,       RSVD1,  RSVD2, RSVD3),
+	PIN(SPI1_MISO_PC1,        SPI1,       RSVD1,  RSVD2, RSVD3),
+	PIN(SPI1_SCK_PC2,         SPI1,       RSVD1,  RSVD2, RSVD3),
+	PIN(SPI1_CS0_PC3,         SPI1,       RSVD1,  RSVD2, RSVD3),
+	PIN(SPI1_CS1_PC4,         SPI1,       RSVD1,  RSVD2, RSVD3),
+	PIN(SPI2_MOSI_PB4,        SPI2,       DTV,    RSVD2, RSVD3),
+	PIN(SPI2_MISO_PB5,        SPI2,       DTV,    RSVD2, RSVD3),
+	PIN(SPI2_SCK_PB6,         SPI2,       DTV,    RSVD2, RSVD3),
+	PIN(SPI2_CS0_PB7,         SPI2,       DTV,    RSVD2, RSVD3),
+	PIN(SPI2_CS1_PDD0,        SPI2,       RSVD1,  RSVD2, RSVD3),
+	PIN(SPI4_MOSI_PC7,        SPI4,       RSVD1,  RSVD2, RSVD3),
+	PIN(SPI4_MISO_PD0,        SPI4,       RSVD1,  RSVD2, RSVD3),
+	PIN(SPI4_SCK_PC5,         SPI4,       RSVD1,  RSVD2, RSVD3),
+	PIN(SPI4_CS0_PC6,         SPI4,       RSVD1,  RSVD2, RSVD3),
+	PIN(QSPI_SCK_PEE0,        QSPI,       RSVD1,  RSVD2, RSVD3),
+	PIN(QSPI_CS_N_PEE1,       QSPI,       RSVD1,  RSVD2, RSVD3),
+	PIN(QSPI_IO0_PEE2,        QSPI,       RSVD1,  RSVD2, RSVD3),
+	PIN(QSPI_IO1_PEE3,        QSPI,       RSVD1,  RSVD2, RSVD3),
+	PIN(QSPI_IO2_PEE4,        QSPI,       RSVD1,  RSVD2, RSVD3),
+	PIN(QSPI_IO3_PEE5,        QSPI,       RSVD1,  RSVD2, RSVD3),
+	PIN_RESERVED,
+	/* Offset 0x30a4 */
+	PIN(DMIC1_CLK_PE0,        DMIC1,      I2S3,   RSVD2, RSVD3),
+	PIN(DMIC1_DAT_PE1,        DMIC1,      I2S3,   RSVD2, RSVD3),
+	PIN(DMIC2_CLK_PE2,        DMIC2,      I2S3,   RSVD2, RSVD3),
+	PIN(DMIC2_DAT_PE3,        DMIC2,      I2S3,   RSVD2, RSVD3),
+	PIN(DMIC3_CLK_PE4,        DMIC3,      I2S5A,  RSVD2, RSVD3),
+	PIN(DMIC3_DAT_PE5,        DMIC3,      I2S5A,  RSVD2, RSVD3),
+	PIN(GEN1_I2C_SCL_PJ1,     I2C1,       RSVD1,  RSVD2, RSVD3),
+	PIN(GEN1_I2C_SDA_PJ0,     I2C1,       RSVD1,  RSVD2, RSVD3),
+	PIN(GEN2_I2C_SCL_PJ2,     I2C2,       RSVD1,  RSVD2, RSVD3),
+	PIN(GEN2_I2C_SDA_PJ3,     I2C2,       RSVD1,  RSVD2, RSVD3),
+	PIN(GEN3_I2C_SCL_PF0,     I2C3,       RSVD1,  RSVD2, RSVD3),
+	PIN(GEN3_I2C_SDA_PF1,     I2C3,       RSVD1,  RSVD2, RSVD3),
+	PIN(CAM_I2C_SCL_PS2,      I2C3,       I2CVI,  RSVD2, RSVD3),
+	PIN(CAM_I2C_SDA_PS3,      I2C3,       I2CVI,  RSVD2, RSVD3),
+	PIN(PWR_I2C_SCL_PY3,      I2CPMU,     RSVD1,  RSVD2, RSVD3),
+	PIN(PWR_I2C_SDA_PY4,      I2CPMU,     RSVD1,  RSVD2, RSVD3),
+	PIN(UART1_TX_PU0,         UARTA,      RSVD1,  RSVD2, RSVD3),
+	PIN(UART1_RX_PU1,         UARTA,      RSVD1,  RSVD2, RSVD3),
+	PIN(UART1_RTS_PU2,        UARTA,      RSVD1,  RSVD2, RSVD3),
+	PIN(UART1_CTS_PU3,        UARTA,      RSVD1,  RSVD2, RSVD3),
+	PIN(UART2_TX_PG0,         UARTB,      I2S4A,  SPDIF, UART),
+	PIN(UART2_RX_PG1,         UARTB,      I2S4A,  SPDIF, UART),
+	PIN(UART2_RTS_PG2,        UARTB,      I2S4A,  RSVD2, UART),
+	PIN(UART2_CTS_PG3,        UARTB,      I2S4A,  RSVD2, UART),
+	PIN(UART3_TX_PD1,         UARTC,      SPI4,   RSVD2, RSVD3),
+	PIN(UART3_RX_PD2,         UARTC,      SPI4,   RSVD2, RSVD3),
+	PIN(UART3_RTS_PD3,        UARTC,      SPI4,   RSVD2, RSVD3),
+	PIN(UART3_CTS_PD4,        UARTC,      SPI4,   RSVD2, RSVD3),
+	PIN(UART4_TX_PI4,         UARTD,      UART,   RSVD2, RSVD3),
+	PIN(UART4_RX_PI5,         UARTD,      UART,   RSVD2, RSVD3),
+	PIN(UART4_RTS_PI6,        UARTD,      UART,   RSVD2, RSVD3),
+	PIN(UART4_CTS_PI7,        UARTD,      UART,   RSVD2, RSVD3),
+	PIN(DAP1_FS_PB0,          I2S1,       RSVD1,  RSVD2, RSVD3),
+	PIN(DAP1_DIN_PB1,         I2S1,       RSVD1,  RSVD2, RSVD3),
+	PIN(DAP1_DOUT_PB2,        I2S1,       RSVD1,  RSVD2, RSVD3),
+	PIN(DAP1_SCLK_PB3,        I2S1,       RSVD1,  RSVD2, RSVD3),
+	PIN(DAP2_FS_PAA0,         I2S2,       RSVD1,  RSVD2, RSVD3),
+	PIN(DAP2_DIN_PAA2,        I2S2,       RSVD1,  RSVD2, RSVD3),
+	PIN(DAP2_DOUT_PAA3,       I2S2,       RSVD1,  RSVD2, RSVD3),
+	PIN(DAP2_SCLK_PAA1,       I2S2,       RSVD1,  RSVD2, RSVD3),
+	PIN(DAP4_FS_PJ4,          I2S4B,      RSVD1,  RSVD2, RSVD3),
+	PIN(DAP4_DIN_PJ5,         I2S4B,      RSVD1,  RSVD2, RSVD3),
+	PIN(DAP4_DOUT_PJ6,        I2S4B,      RSVD1,  RSVD2, RSVD3),
+	PIN(DAP4_SCLK_PJ7,        I2S4B,      RSVD1,  RSVD2, RSVD3),
+	PIN(CAM1_MCLK_PS0,        EXTPERIPH3, RSVD1,  RSVD2, RSVD3),
+	PIN(CAM2_MCLK_PS1,        EXTPERIPH3, RSVD1,  RSVD2, RSVD3),
+	PIN(JTAG_RTCK,            JTAG,       RSVD1,  RSVD2, RSVD3),
+	PIN(CLK_32K_IN,           CLK,        RSVD1,  RSVD2, RSVD3),
+	PIN(CLK_32K_OUT_PY5,      SOC,        BLINK,  RSVD2, RSVD3),
+	PIN(BATT_BCL,             BCL,        RSVD1,  RSVD2, RSVD3),
+	PIN(CLK_REQ,              SYS,        RSVD1,  RSVD2, RSVD3),
+	PIN(CPU_PWR_REQ,          CPU,        RSVD1,  RSVD2, RSVD3),
+	PIN(PWR_INT_N,            PMI,        RSVD1,  RSVD2, RSVD3),
+	PIN(SHUTDOWN,             SHUTDOWN,   RSVD1,  RSVD2, RSVD3),
+	PIN(CORE_PWR_REQ,         CORE,       RSVD1,  RSVD2, RSVD3),
+	PIN(AUD_MCLK_PBB0,        AUD,        RSVD1,  RSVD2, RSVD3),
+	PIN(DVFS_PWM_PBB1,        RSVD0,      CLDVFS, SPI3,  RSVD3),
+	PIN(DVFS_CLK_PBB2,        RSVD0,      CLDVFS, SPI3,  RSVD3),
+	PIN(GPIO_X1_AUD_PBB3,     RSVD0,      RSVD1,  SPI3,  RSVD3),
+	PIN(GPIO_X3_AUD_PBB4,     RSVD0,      RSVD1,  SPI3,  RSVD3),
+	PIN(PCC7,                 RSVD0,      RSVD1,  RSVD2, RSVD3),
+	PIN(HDMI_CEC_PCC0,        CEC,        RSVD1,  RSVD2, RSVD3),
+	PIN(HDMI_INT_DP_HPD_PCC1, DP,         RSVD1,  RSVD2, RSVD3),
+	PIN(SPDIF_OUT_PCC2,       SPDIF,      RSVD1,  RSVD2, RSVD3),
+	PIN(SPDIF_IN_PCC3,        SPDIF,      RSVD1,  RSVD2, RSVD3),
+	PIN(USB_VBUS_EN0_PCC4,    USB,        RSVD1,  RSVD2, RSVD3),
+	PIN(USB_VBUS_EN1_PCC5,    USB,        RSVD1,  RSVD2, RSVD3),
+	PIN(DP_HPD0_PCC6,         DP,         RSVD1,  RSVD2, RSVD3),
+	PIN(WIFI_EN_PH0,          RSVD0,      RSVD1,  RSVD2, RSVD3),
+	PIN(WIFI_RST_PH1,         RSVD0,      RSVD1,  RSVD2, RSVD3),
+	PIN(WIFI_WAKE_AP_PH2,     RSVD0,      RSVD1,  RSVD2, RSVD3),
+	PIN(AP_WAKE_BT_PH3,       RSVD0,      UARTB,  SPDIF, RSVD3),
+	PIN(BT_RST_PH4,           RSVD0,      UARTB,  SPDIF, RSVD3),
+	PIN(BT_WAKE_AP_PH5,       RSVD0,      RSVD1,  RSVD2, RSVD3),
+	PIN(AP_WAKE_NFC_PH7,      RSVD0,      RSVD1,  RSVD2, RSVD3),
+	PIN(NFC_EN_PI0,           RSVD0,      RSVD1,  RSVD2, RSVD3),
+	PIN(NFC_INT_PI1,          RSVD0,      RSVD1,  RSVD2, RSVD3),
+	PIN(GPS_EN_PI2,           RSVD0,      RSVD1,  RSVD2, RSVD3),
+	PIN(GPS_RST_PI3,          RSVD0,      RSVD1,  RSVD2, RSVD3),
+	PIN(CAM_RST_PS4,          VGP1,       RSVD1,  RSVD2, RSVD3),
+	PIN(CAM_AF_EN_PS5,        VIMCLK,     VGP2,   RSVD2, RSVD3),
+	PIN(CAM_FLASH_EN_PS6,     VIMCLK,     VGP3,   RSVD2, RSVD3),
+	PIN(CAM1_PWDN_PS7,        VGP4,       RSVD1,  RSVD2, RSVD3),
+	PIN(CAM2_PWDN_PT0,        VGP5,       RSVD1,  RSVD2, RSVD3),
+	PIN(CAM1_STROBE_PT1,      VGP6,       RSVD1,  RSVD2, RSVD3),
+	PIN(LCD_TE_PY2,           DISPLAYA,   RSVD1,  RSVD2, RSVD3),
+	PIN(LCD_BL_PWM_PV0,       DISPLAYA,   PWM0,   SOR0,  RSVD3),
+	PIN(LCD_BL_EN_PV1,        RSVD0,      RSVD1,  RSVD2, RSVD3),
+	PIN(LCD_RST_PV2,          RSVD0,      RSVD1,  RSVD2, RSVD3),
+	PIN(LCD_GPIO1_PV3,        DISPLAYB,   RSVD1,  RSVD2, RSVD3),
+	PIN(LCD_GPIO2_PV4,        DISPLAYB,   PWM1,   RSVD2, SOR1),
+	PIN(AP_READY_PV5,         RSVD0,      RSVD1,  RSVD2, RSVD3),
+	PIN(TOUCH_RST_PV6,        RSVD0,      RSVD1,  RSVD2, RSVD3),
+	PIN(TOUCH_CLK_PV7,        TOUCH,      RSVD1,  RSVD2, RSVD3),
+	PIN(MODEM_WAKE_AP_PX0,    RSVD0,      RSVD1,  RSVD2, RSVD3),
+	PIN(TOUCH_INT_PX1,        RSVD0,      RSVD1,  RSVD2, RSVD3),
+	PIN(MOTION_INT_PX2,       RSVD0,      RSVD1,  RSVD2, RSVD3),
+	PIN(ALS_PROX_INT_PX3,     RSVD0,      RSVD1,  RSVD2, RSVD3),
+	PIN(TEMP_ALERT_PX4,       RSVD0,      RSVD1,  RSVD2, RSVD3),
+	PIN(BUTTON_POWER_ON_PX5,  RSVD0,      RSVD1,  RSVD2, RSVD3),
+	PIN(BUTTON_VOL_UP_PX6,    RSVD0,      RSVD1,  RSVD2, RSVD3),
+	PIN(BUTTON_VOL_DOWN_PX7,  RSVD0,      RSVD1,  RSVD2, RSVD3),
+	PIN(BUTTON_SLIDE_SW_PY0,  RSVD0,      RSVD1,  RSVD2, RSVD3),
+	PIN(BUTTON_HOME_PY1,      RSVD0,      RSVD1,  RSVD2, RSVD3),
+	PIN(PA6,                  SATA,       RSVD1,  RSVD2, RSVD3),
+	PIN(PE6,                  RSVD0,      I2S5A,  PWM2,  RSVD3),
+	PIN(PE7,                  RSVD0,      I2S5A,  PWM3,  RSVD3),
+	PIN(PH6,                  RSVD0,      RSVD1,  RSVD2, RSVD3),
+	PIN(PK0,                  IQC0,       I2S5B,  RSVD2, RSVD3),
+	PIN(PK1,                  IQC0,       I2S5B,  RSVD2, RSVD3),
+	PIN(PK2,                  IQC0,       I2S5B,  RSVD2, RSVD3),
+	PIN(PK3,                  IQC0,       I2S5B,  RSVD2, RSVD3),
+	PIN(PK4,                  IQC1,       RSVD1,  RSVD2, RSVD3),
+	PIN(PK5,                  IQC1,       RSVD1,  RSVD2, RSVD3),
+	PIN(PK6,                  IQC1,       RSVD1,  RSVD2, RSVD3),
+	PIN(PK7,                  IQC1,       RSVD1,  RSVD2, RSVD3),
+	PIN(PL0,                  RSVD0,      RSVD1,  RSVD2, RSVD3),
+	PIN(PL1,                  SOC,        RSVD1,  RSVD2, RSVD3),
+	PIN(PZ0,                  VIMCLK2,    RSVD1,  RSVD2, RSVD3),
+	PIN(PZ1,                  VIMCLK2,    SDMMC1, RSVD2, RSVD3),
+	PIN(PZ2,                  SDMMC3,     CCLA,   RSVD2, RSVD3),
+	PIN(PZ3,                  SDMMC3,     RSVD1,  RSVD2, RSVD3),
+	PIN(PZ4,                  SDMMC1,     RSVD1,  RSVD2, RSVD3),
+	PIN(PZ5,                  SOC,        RSVD1,  RSVD2, RSVD3),
+};
+const struct pmux_pingrp_desc *tegra_soc_pingroups = tegra210_pingroups;
diff --git a/arch/arm/include/asm/arch-tegra210/pinmux.h b/arch/arm/include/asm/arch-tegra210/pinmux.h
new file mode 100644
index 000000000000..af3b55f0d7b8
--- /dev/null
+++ b/arch/arm/include/asm/arch-tegra210/pinmux.h
@@ -0,0 +1,416 @@
+/*
+ * Copyright (c) 2015, NVIDIA CORPORATION. All rights reserved.
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#ifndef _TEGRA210_PINMUX_H_
+#define _TEGRA210_PINMUX_H_
+
+enum pmux_pingrp {
+	PMUX_PINGRP_SDMMC1_CLK_PM0,
+	PMUX_PINGRP_SDMMC1_CMD_PM1,
+	PMUX_PINGRP_SDMMC1_DAT3_PM2,
+	PMUX_PINGRP_SDMMC1_DAT2_PM3,
+	PMUX_PINGRP_SDMMC1_DAT1_PM4,
+	PMUX_PINGRP_SDMMC1_DAT0_PM5,
+	PMUX_PINGRP_SDMMC3_CLK_PP0 = (0x1c / 4),
+	PMUX_PINGRP_SDMMC3_CMD_PP1,
+	PMUX_PINGRP_SDMMC3_DAT0_PP5,
+	PMUX_PINGRP_SDMMC3_DAT1_PP4,
+	PMUX_PINGRP_SDMMC3_DAT2_PP3,
+	PMUX_PINGRP_SDMMC3_DAT3_PP2,
+	PMUX_PINGRP_PEX_L0_RST_N_PA0 = (0x38 / 4),
+	PMUX_PINGRP_PEX_L0_CLKREQ_N_PA1,
+	PMUX_PINGRP_PEX_WAKE_N_PA2,
+	PMUX_PINGRP_PEX_L1_RST_N_PA3,
+	PMUX_PINGRP_PEX_L1_CLKREQ_N_PA4,
+	PMUX_PINGRP_SATA_LED_ACTIVE_PA5,
+	PMUX_PINGRP_SPI1_MOSI_PC0,
+	PMUX_PINGRP_SPI1_MISO_PC1,
+	PMUX_PINGRP_SPI1_SCK_PC2,
+	PMUX_PINGRP_SPI1_CS0_PC3,
+	PMUX_PINGRP_SPI1_CS1_PC4,
+	PMUX_PINGRP_SPI2_MOSI_PB4,
+	PMUX_PINGRP_SPI2_MISO_PB5,
+	PMUX_PINGRP_SPI2_SCK_PB6,
+	PMUX_PINGRP_SPI2_CS0_PB7,
+	PMUX_PINGRP_SPI2_CS1_PDD0,
+	PMUX_PINGRP_SPI4_MOSI_PC7,
+	PMUX_PINGRP_SPI4_MISO_PD0,
+	PMUX_PINGRP_SPI4_SCK_PC5,
+	PMUX_PINGRP_SPI4_CS0_PC6,
+	PMUX_PINGRP_QSPI_SCK_PEE0,
+	PMUX_PINGRP_QSPI_CS_N_PEE1,
+	PMUX_PINGRP_QSPI_IO0_PEE2,
+	PMUX_PINGRP_QSPI_IO1_PEE3,
+	PMUX_PINGRP_QSPI_IO2_PEE4,
+	PMUX_PINGRP_QSPI_IO3_PEE5,
+	PMUX_PINGRP_DMIC1_CLK_PE0 = (0xa4 / 4),
+	PMUX_PINGRP_DMIC1_DAT_PE1,
+	PMUX_PINGRP_DMIC2_CLK_PE2,
+	PMUX_PINGRP_DMIC2_DAT_PE3,
+	PMUX_PINGRP_DMIC3_CLK_PE4,
+	PMUX_PINGRP_DMIC3_DAT_PE5,
+	PMUX_PINGRP_GEN1_I2C_SCL_PJ1,
+	PMUX_PINGRP_GEN1_I2C_SDA_PJ0,
+	PMUX_PINGRP_GEN2_I2C_SCL_PJ2,
+	PMUX_PINGRP_GEN2_I2C_SDA_PJ3,
+	PMUX_PINGRP_GEN3_I2C_SCL_PF0,
+	PMUX_PINGRP_GEN3_I2C_SDA_PF1,
+	PMUX_PINGRP_CAM_I2C_SCL_PS2,
+	PMUX_PINGRP_CAM_I2C_SDA_PS3,
+	PMUX_PINGRP_PWR_I2C_SCL_PY3,
+	PMUX_PINGRP_PWR_I2C_SDA_PY4,
+	PMUX_PINGRP_UART1_TX_PU0,
+	PMUX_PINGRP_UART1_RX_PU1,
+	PMUX_PINGRP_UART1_RTS_PU2,
+	PMUX_PINGRP_UART1_CTS_PU3,
+	PMUX_PINGRP_UART2_TX_PG0,
+	PMUX_PINGRP_UART2_RX_PG1,
+	PMUX_PINGRP_UART2_RTS_PG2,
+	PMUX_PINGRP_UART2_CTS_PG3,
+	PMUX_PINGRP_UART3_TX_PD1,
+	PMUX_PINGRP_UART3_RX_PD2,
+	PMUX_PINGRP_UART3_RTS_PD3,
+	PMUX_PINGRP_UART3_CTS_PD4,
+	PMUX_PINGRP_UART4_TX_PI4,
+	PMUX_PINGRP_UART4_RX_PI5,
+	PMUX_PINGRP_UART4_RTS_PI6,
+	PMUX_PINGRP_UART4_CTS_PI7,
+	PMUX_PINGRP_DAP1_FS_PB0,
+	PMUX_PINGRP_DAP1_DIN_PB1,
+	PMUX_PINGRP_DAP1_DOUT_PB2,
+	PMUX_PINGRP_DAP1_SCLK_PB3,
+	PMUX_PINGRP_DAP2_FS_PAA0,
+	PMUX_PINGRP_DAP2_DIN_PAA2,
+	PMUX_PINGRP_DAP2_DOUT_PAA3,
+	PMUX_PINGRP_DAP2_SCLK_PAA1,
+	PMUX_PINGRP_DAP4_FS_PJ4,
+	PMUX_PINGRP_DAP4_DIN_PJ5,
+	PMUX_PINGRP_DAP4_DOUT_PJ6,
+	PMUX_PINGRP_DAP4_SCLK_PJ7,
+	PMUX_PINGRP_CAM1_MCLK_PS0,
+	PMUX_PINGRP_CAM2_MCLK_PS1,
+	PMUX_PINGRP_JTAG_RTCK,
+	PMUX_PINGRP_CLK_32K_IN,
+	PMUX_PINGRP_CLK_32K_OUT_PY5,
+	PMUX_PINGRP_BATT_BCL,
+	PMUX_PINGRP_CLK_REQ,
+	PMUX_PINGRP_CPU_PWR_REQ,
+	PMUX_PINGRP_PWR_INT_N,
+	PMUX_PINGRP_SHUTDOWN,
+	PMUX_PINGRP_CORE_PWR_REQ,
+	PMUX_PINGRP_AUD_MCLK_PBB0,
+	PMUX_PINGRP_DVFS_PWM_PBB1,
+	PMUX_PINGRP_DVFS_CLK_PBB2,
+	PMUX_PINGRP_GPIO_X1_AUD_PBB3,
+	PMUX_PINGRP_GPIO_X3_AUD_PBB4,
+	PMUX_PINGRP_PCC7,
+	PMUX_PINGRP_HDMI_CEC_PCC0,
+	PMUX_PINGRP_HDMI_INT_DP_HPD_PCC1,
+	PMUX_PINGRP_SPDIF_OUT_PCC2,
+	PMUX_PINGRP_SPDIF_IN_PCC3,
+	PMUX_PINGRP_USB_VBUS_EN0_PCC4,
+	PMUX_PINGRP_USB_VBUS_EN1_PCC5,
+	PMUX_PINGRP_DP_HPD0_PCC6,
+	PMUX_PINGRP_WIFI_EN_PH0,
+	PMUX_PINGRP_WIFI_RST_PH1,
+	PMUX_PINGRP_WIFI_WAKE_AP_PH2,
+	PMUX_PINGRP_AP_WAKE_BT_PH3,
+	PMUX_PINGRP_BT_RST_PH4,
+	PMUX_PINGRP_BT_WAKE_AP_PH5,
+	PMUX_PINGRP_AP_WAKE_NFC_PH7,
+	PMUX_PINGRP_NFC_EN_PI0,
+	PMUX_PINGRP_NFC_INT_PI1,
+	PMUX_PINGRP_GPS_EN_PI2,
+	PMUX_PINGRP_GPS_RST_PI3,
+	PMUX_PINGRP_CAM_RST_PS4,
+	PMUX_PINGRP_CAM_AF_EN_PS5,
+	PMUX_PINGRP_CAM_FLASH_EN_PS6,
+	PMUX_PINGRP_CAM1_PWDN_PS7,
+	PMUX_PINGRP_CAM2_PWDN_PT0,
+	PMUX_PINGRP_CAM1_STROBE_PT1,
+	PMUX_PINGRP_LCD_TE_PY2,
+	PMUX_PINGRP_LCD_BL_PWM_PV0,
+	PMUX_PINGRP_LCD_BL_EN_PV1,
+	PMUX_PINGRP_LCD_RST_PV2,
+	PMUX_PINGRP_LCD_GPIO1_PV3,
+	PMUX_PINGRP_LCD_GPIO2_PV4,
+	PMUX_PINGRP_AP_READY_PV5,
+	PMUX_PINGRP_TOUCH_RST_PV6,
+	PMUX_PINGRP_TOUCH_CLK_PV7,
+	PMUX_PINGRP_MODEM_WAKE_AP_PX0,
+	PMUX_PINGRP_TOUCH_INT_PX1,
+	PMUX_PINGRP_MOTION_INT_PX2,
+	PMUX_PINGRP_ALS_PROX_INT_PX3,
+	PMUX_PINGRP_TEMP_ALERT_PX4,
+	PMUX_PINGRP_BUTTON_POWER_ON_PX5,
+	PMUX_PINGRP_BUTTON_VOL_UP_PX6,
+	PMUX_PINGRP_BUTTON_VOL_DOWN_PX7,
+	PMUX_PINGRP_BUTTON_SLIDE_SW_PY0,
+	PMUX_PINGRP_BUTTON_HOME_PY1,
+	PMUX_PINGRP_PA6,
+	PMUX_PINGRP_PE6,
+	PMUX_PINGRP_PE7,
+	PMUX_PINGRP_PH6,
+	PMUX_PINGRP_PK0,
+	PMUX_PINGRP_PK1,
+	PMUX_PINGRP_PK2,
+	PMUX_PINGRP_PK3,
+	PMUX_PINGRP_PK4,
+	PMUX_PINGRP_PK5,
+	PMUX_PINGRP_PK6,
+	PMUX_PINGRP_PK7,
+	PMUX_PINGRP_PL0,
+	PMUX_PINGRP_PL1,
+	PMUX_PINGRP_PZ0,
+	PMUX_PINGRP_PZ1,
+	PMUX_PINGRP_PZ2,
+	PMUX_PINGRP_PZ3,
+	PMUX_PINGRP_PZ4,
+	PMUX_PINGRP_PZ5,
+	PMUX_PINGRP_COUNT,
+};
+
+enum pmux_drvgrp {
+	PMUX_DRVGRP_ALS_PROX_INT = (0x10 / 4),
+	PMUX_DRVGRP_AP_READY,
+	PMUX_DRVGRP_AP_WAKE_BT,
+	PMUX_DRVGRP_AP_WAKE_NFC,
+	PMUX_DRVGRP_AUD_MCLK,
+	PMUX_DRVGRP_BATT_BCL,
+	PMUX_DRVGRP_BT_RST,
+	PMUX_DRVGRP_BT_WAKE_AP,
+	PMUX_DRVGRP_BUTTON_HOME,
+	PMUX_DRVGRP_BUTTON_POWER_ON,
+	PMUX_DRVGRP_BUTTON_SLIDE_SW,
+	PMUX_DRVGRP_BUTTON_VOL_DOWN,
+	PMUX_DRVGRP_BUTTON_VOL_UP,
+	PMUX_DRVGRP_CAM1_MCLK,
+	PMUX_DRVGRP_CAM1_PWDN,
+	PMUX_DRVGRP_CAM1_STROBE,
+	PMUX_DRVGRP_CAM2_MCLK,
+	PMUX_DRVGRP_CAM2_PWDN,
+	PMUX_DRVGRP_CAM_AF_EN,
+	PMUX_DRVGRP_CAM_FLASH_EN,
+	PMUX_DRVGRP_CAM_I2C_SCL,
+	PMUX_DRVGRP_CAM_I2C_SDA,
+	PMUX_DRVGRP_CAM_RST,
+	PMUX_DRVGRP_CLK_32K_IN,
+	PMUX_DRVGRP_CLK_32K_OUT,
+	PMUX_DRVGRP_CLK_REQ,
+	PMUX_DRVGRP_CORE_PWR_REQ,
+	PMUX_DRVGRP_CPU_PWR_REQ,
+	PMUX_DRVGRP_DAP1_DIN,
+	PMUX_DRVGRP_DAP1_DOUT,
+	PMUX_DRVGRP_DAP1_FS,
+	PMUX_DRVGRP_DAP1_SCLK,
+	PMUX_DRVGRP_DAP2_DIN,
+	PMUX_DRVGRP_DAP2_DOUT,
+	PMUX_DRVGRP_DAP2_FS,
+	PMUX_DRVGRP_DAP2_SCLK,
+	PMUX_DRVGRP_DAP4_DIN,
+	PMUX_DRVGRP_DAP4_DOUT,
+	PMUX_DRVGRP_DAP4_FS,
+	PMUX_DRVGRP_DAP4_SCLK,
+	PMUX_DRVGRP_DMIC1_CLK,
+	PMUX_DRVGRP_DMIC1_DAT,
+	PMUX_DRVGRP_DMIC2_CLK,
+	PMUX_DRVGRP_DMIC2_DAT,
+	PMUX_DRVGRP_DMIC3_CLK,
+	PMUX_DRVGRP_DMIC3_DAT,
+	PMUX_DRVGRP_DP_HPD0,
+	PMUX_DRVGRP_DVFS_CLK,
+	PMUX_DRVGRP_DVFS_PWM,
+	PMUX_DRVGRP_GEN1_I2C_SCL,
+	PMUX_DRVGRP_GEN1_I2C_SDA,
+	PMUX_DRVGRP_GEN2_I2C_SCL,
+	PMUX_DRVGRP_GEN2_I2C_SDA,
+	PMUX_DRVGRP_GEN3_I2C_SCL,
+	PMUX_DRVGRP_GEN3_I2C_SDA,
+	PMUX_DRVGRP_PA6,
+	PMUX_DRVGRP_PCC7,
+	PMUX_DRVGRP_PE6,
+	PMUX_DRVGRP_PE7,
+	PMUX_DRVGRP_PH6,
+	PMUX_DRVGRP_PK0,
+	PMUX_DRVGRP_PK1,
+	PMUX_DRVGRP_PK2,
+	PMUX_DRVGRP_PK3,
+	PMUX_DRVGRP_PK4,
+	PMUX_DRVGRP_PK5,
+	PMUX_DRVGRP_PK6,
+	PMUX_DRVGRP_PK7,
+	PMUX_DRVGRP_PL0,
+	PMUX_DRVGRP_PL1,
+	PMUX_DRVGRP_PZ0,
+	PMUX_DRVGRP_PZ1,
+	PMUX_DRVGRP_PZ2,
+	PMUX_DRVGRP_PZ3,
+	PMUX_DRVGRP_PZ4,
+	PMUX_DRVGRP_PZ5,
+	PMUX_DRVGRP_GPIO_X1_AUD,
+	PMUX_DRVGRP_GPIO_X3_AUD,
+	PMUX_DRVGRP_GPS_EN,
+	PMUX_DRVGRP_GPS_RST,
+	PMUX_DRVGRP_HDMI_CEC,
+	PMUX_DRVGRP_HDMI_INT_DP_HPD,
+	PMUX_DRVGRP_JTAG_RTCK,
+	PMUX_DRVGRP_LCD_BL_EN,
+	PMUX_DRVGRP_LCD_BL_PWM,
+	PMUX_DRVGRP_LCD_GPIO1,
+	PMUX_DRVGRP_LCD_GPIO2,
+	PMUX_DRVGRP_LCD_RST,
+	PMUX_DRVGRP_LCD_TE,
+	PMUX_DRVGRP_MODEM_WAKE_AP,
+	PMUX_DRVGRP_MOTION_INT,
+	PMUX_DRVGRP_NFC_EN,
+	PMUX_DRVGRP_NFC_INT,
+	PMUX_DRVGRP_PEX_L0_CLKREQ_N,
+	PMUX_DRVGRP_PEX_L0_RST_N,
+	PMUX_DRVGRP_PEX_L1_CLKREQ_N,
+	PMUX_DRVGRP_PEX_L1_RST_N,
+	PMUX_DRVGRP_PEX_WAKE_N,
+	PMUX_DRVGRP_PWR_I2C_SCL,
+	PMUX_DRVGRP_PWR_I2C_SDA,
+	PMUX_DRVGRP_PWR_INT_N,
+	PMUX_DRVGRP_QSPI_SCK = (0x1bc / 4),
+	PMUX_DRVGRP_SATA_LED_ACTIVE,
+	PMUX_DRVGRP_SDMMC1,
+	PMUX_DRVGRP_SDMMC2,
+	PMUX_DRVGRP_SDMMC3 = (0x1dc / 4),
+	PMUX_DRVGRP_SDMMC4,
+	PMUX_DRVGRP_SHUTDOWN = (0x1f4 / 4),
+	PMUX_DRVGRP_SPDIF_IN,
+	PMUX_DRVGRP_SPDIF_OUT,
+	PMUX_DRVGRP_SPI1_CS0,
+	PMUX_DRVGRP_SPI1_CS1,
+	PMUX_DRVGRP_SPI1_MISO,
+	PMUX_DRVGRP_SPI1_MOSI,
+	PMUX_DRVGRP_SPI1_SCK,
+	PMUX_DRVGRP_SPI2_CS0,
+	PMUX_DRVGRP_SPI2_CS1,
+	PMUX_DRVGRP_SPI2_MISO,
+	PMUX_DRVGRP_SPI2_MOSI,
+	PMUX_DRVGRP_SPI2_SCK,
+	PMUX_DRVGRP_SPI4_CS0,
+	PMUX_DRVGRP_SPI4_MISO,
+	PMUX_DRVGRP_SPI4_MOSI,
+	PMUX_DRVGRP_SPI4_SCK,
+	PMUX_DRVGRP_TEMP_ALERT,
+	PMUX_DRVGRP_TOUCH_CLK,
+	PMUX_DRVGRP_TOUCH_INT,
+	PMUX_DRVGRP_TOUCH_RST,
+	PMUX_DRVGRP_UART1_CTS,
+	PMUX_DRVGRP_UART1_RTS,
+	PMUX_DRVGRP_UART1_RX,
+	PMUX_DRVGRP_UART1_TX,
+	PMUX_DRVGRP_UART2_CTS,
+	PMUX_DRVGRP_UART2_RTS,
+	PMUX_DRVGRP_UART2_RX,
+	PMUX_DRVGRP_UART2_TX,
+	PMUX_DRVGRP_UART3_CTS,
+	PMUX_DRVGRP_UART3_RTS,
+	PMUX_DRVGRP_UART3_RX,
+	PMUX_DRVGRP_UART3_TX,
+	PMUX_DRVGRP_UART4_CTS,
+	PMUX_DRVGRP_UART4_RTS,
+	PMUX_DRVGRP_UART4_RX,
+	PMUX_DRVGRP_UART4_TX,
+	PMUX_DRVGRP_USB_VBUS_EN0,
+	PMUX_DRVGRP_USB_VBUS_EN1,
+	PMUX_DRVGRP_WIFI_EN,
+	PMUX_DRVGRP_WIFI_RST,
+	PMUX_DRVGRP_WIFI_WAKE_AP,
+	PMUX_DRVGRP_COUNT,
+};
+
+enum pmux_func {
+	PMUX_FUNC_DEFAULT,
+	PMUX_FUNC_AUD,
+	PMUX_FUNC_BCL,
+	PMUX_FUNC_BLINK,
+	PMUX_FUNC_CCLA,
+	PMUX_FUNC_CEC,
+	PMUX_FUNC_CLDVFS,
+	PMUX_FUNC_CLK,
+	PMUX_FUNC_CORE,
+	PMUX_FUNC_CPU,
+	PMUX_FUNC_DISPLAYA,
+	PMUX_FUNC_DISPLAYB,
+	PMUX_FUNC_DMIC1,
+	PMUX_FUNC_DMIC2,
+	PMUX_FUNC_DMIC3,
+	PMUX_FUNC_DP,
+	PMUX_FUNC_DTV,
+	PMUX_FUNC_EXTPERIPH3,
+	PMUX_FUNC_I2C1,
+	PMUX_FUNC_I2C2,
+	PMUX_FUNC_I2C3,
+	PMUX_FUNC_I2CPMU,
+	PMUX_FUNC_I2CVI,
+	PMUX_FUNC_I2S1,
+	PMUX_FUNC_I2S2,
+	PMUX_FUNC_I2S3,
+	PMUX_FUNC_I2S4A,
+	PMUX_FUNC_I2S4B,
+	PMUX_FUNC_I2S5A,
+	PMUX_FUNC_I2S5B,
+	PMUX_FUNC_IQC0,
+	PMUX_FUNC_IQC1,
+	PMUX_FUNC_JTAG,
+	PMUX_FUNC_PE,
+	PMUX_FUNC_PE0,
+	PMUX_FUNC_PE1,
+	PMUX_FUNC_PMI,
+	PMUX_FUNC_PWM0,
+	PMUX_FUNC_PWM1,
+	PMUX_FUNC_PWM2,
+	PMUX_FUNC_PWM3,
+	PMUX_FUNC_QSPI,
+	PMUX_FUNC_SATA,
+	PMUX_FUNC_SDMMC1,
+	PMUX_FUNC_SDMMC3,
+	PMUX_FUNC_SHUTDOWN,
+	PMUX_FUNC_SOC,
+	PMUX_FUNC_SOR0,
+	PMUX_FUNC_SOR1,
+	PMUX_FUNC_SPDIF,
+	PMUX_FUNC_SPI1,
+	PMUX_FUNC_SPI2,
+	PMUX_FUNC_SPI3,
+	PMUX_FUNC_SPI4,
+	PMUX_FUNC_SYS,
+	PMUX_FUNC_TOUCH,
+	PMUX_FUNC_UART,
+	PMUX_FUNC_UARTA,
+	PMUX_FUNC_UARTB,
+	PMUX_FUNC_UARTC,
+	PMUX_FUNC_UARTD,
+	PMUX_FUNC_USB,
+	PMUX_FUNC_VGP1,
+	PMUX_FUNC_VGP2,
+	PMUX_FUNC_VGP3,
+	PMUX_FUNC_VGP4,
+	PMUX_FUNC_VGP5,
+	PMUX_FUNC_VGP6,
+	PMUX_FUNC_VIMCLK,
+	PMUX_FUNC_VIMCLK2,
+	PMUX_FUNC_RSVD0,
+	PMUX_FUNC_RSVD1,
+	PMUX_FUNC_RSVD2,
+	PMUX_FUNC_RSVD3,
+	PMUX_FUNC_COUNT,
+};
+
+#define TEGRA_PMX_SOC_DRV_GROUP_BASE_REG 0x8d4
+#define TEGRA_PMX_SOC_HAS_IO_CLAMPING
+#define TEGRA_PMX_SOC_HAS_DRVGRPS
+#define TEGRA_PMX_PINS_HAVE_E_INPUT
+#define TEGRA_PMX_PINS_HAVE_LOCK
+#define TEGRA_PMX_PINS_HAVE_OD
+#define TEGRA_PMX_PINS_HAVE_E_IO_HV
+#include <asm/arch-tegra/pinmux.h>
+
+#endif /* _TEGRA210_PINMUX_H_ */
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [U-Boot] [PATCH 0/9] ARM: tegra: pinmux: Tegra210 support
  2015-02-24 21:08 [U-Boot] [PATCH 0/9] ARM: tegra: pinmux: Tegra210 support Stephen Warren
                   ` (8 preceding siblings ...)
  2015-02-24 21:08 ` [U-Boot] [PATCH 9/9] ARM: tegra: pinmux: add Tegra210 support Stephen Warren
@ 2015-02-24 23:44 ` Simon Glass
  2015-02-25  0:06   ` Stephen Warren
  2015-03-03 20:20 ` Stephen Warren
  10 siblings, 1 reply; 20+ messages in thread
From: Simon Glass @ 2015-02-24 23:44 UTC (permalink / raw)
  To: u-boot

Hi Stephen,

On 24 February 2015 at 14:08, Stephen Warren <swarren@wwwdotorg.org> wrote:
> From: Stephen Warren <swarren@nvidia.com>
>
> This series performs a few small cleanups to or parameterizations of the
> existing Tegra pinmux driver, and adds Tegra210 support. The Tegra210
> code isn't actually used yet, since the balance of the Tegra210 support
> is not yet present. However, it should start appearing soon.
>
> I've at least compile-tested this by over-writing the Tegra124 pinmux
> driver and Jetson TK1 board pinmux data tables with the Tegra210 versions.
>
> TomW, note I made a couple minor tweaks since the latest version I sent
> internally; let's apply this version upstream.
>
> Stephen Warren (9):
>   ARM: tegra: pinmux: add note re: drive group field defines
>   ARM: tegra: pinmux: simplify some defines
>   ARM: tegra: pinmux: handle feature removal on newer SoCs
>   ARM: tegra: pinmux: move some type definitions
>   ARM: tegra: pinmux: partially handle varying register layouts
>   ARM: tegra: pinmux: support hsm/schmitt on pins
>   ARM: tegra: pinmux: account for different drivegroup base registers
>   ARM: tegra: pinmux: support Tegra210's e_io_hv pin option
>   ARM: tegra: pinmux: add Tegra210 support

Does the Linux side look similar to this? The use of #defines seem
like a potential temporary solution but I hope it doesn't stay that
way.

It feels like maybe we need to define an API that would suit all Tegra chips?

>
>  arch/arm/cpu/tegra-common/pinmux-common.c   | 211 ++++++++++++--
>  arch/arm/cpu/tegra210-common/pinmux.c       | 195 +++++++++++++
>  arch/arm/include/asm/arch-tegra/pinmux.h    | 107 ++++---
>  arch/arm/include/asm/arch-tegra114/pinmux.h |  14 +-
>  arch/arm/include/asm/arch-tegra124/pinmux.h |  14 +-
>  arch/arm/include/asm/arch-tegra20/pinmux.h  |   1 +
>  arch/arm/include/asm/arch-tegra210/pinmux.h | 416 ++++++++++++++++++++++++++++
>  arch/arm/include/asm/arch-tegra30/pinmux.h  |  11 +-
>  8 files changed, 906 insertions(+), 63 deletions(-)
>  create mode 100644 arch/arm/cpu/tegra210-common/pinmux.c
>  create mode 100644 arch/arm/include/asm/arch-tegra210/pinmux.h
>
> --
> 1.9.1
>

Regards,
Simon

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [U-Boot] [PATCH 1/9] ARM: tegra: pinmux: add note re: drive group field defines
  2015-02-24 21:08 ` [U-Boot] [PATCH 1/9] ARM: tegra: pinmux: add note re: drive group field defines Stephen Warren
@ 2015-02-24 23:44   ` Simon Glass
  2015-02-25  0:08     ` Stephen Warren
  0 siblings, 1 reply; 20+ messages in thread
From: Simon Glass @ 2015-02-24 23:44 UTC (permalink / raw)
  To: u-boot

Hi Stephen,

On 24 February 2015 at 14:08, Stephen Warren <swarren@wwwdotorg.org> wrote:
> From: Stephen Warren <swarren@nvidia.com>
>
> Tegra's drive group registers have a remarkably inconsistent layout. The
> current U-Boot driver doesn't take this into account at all. Add a
> comment to describe the issue, so at least anyone debugging the driver
> will be aware of this. To solve this, we'd need to add a per-drive-group
> data structure describing the layout for the individual register. Since
> we don't set up too many drive groups in U-Boot at present, this
> hopefully isn't causing too much practical issue. Still, we probably need
> to fix this sometime.
>
> Wth Tegra210, the register layout becomes almost entirely consistent, so
> this problem partially solves itself over time.
>
> Signed-off-by: Stephen Warren <swarren@nvidia.com>
> ---
>  arch/arm/cpu/tegra-common/pinmux-common.c | 15 +++++++++++++++
>  1 file changed, 15 insertions(+)
>
> diff --git a/arch/arm/cpu/tegra-common/pinmux-common.c b/arch/arm/cpu/tegra-common/pinmux-common.c
> index 64baed45d591..0bef6e246357 100644
> --- a/arch/arm/cpu/tegra-common/pinmux-common.c
> +++ b/arch/arm/cpu/tegra-common/pinmux-common.c
> @@ -347,6 +347,21 @@ void pinmux_config_pingrp_table(const struct pmux_pingrp_config *config,
>  #define SCHMT_SHIFT    3
>  #define LPMD_SHIFT     4
>  #define LPMD_MASK      (3 << LPMD_SHIFT)
> +/*
> + * Note that the following DRV* and SLW* defines are accurate for many drive

Do you mean 'accurate'? That seems like a good thing so wonder if this
should be reworded a bit compared to your commit message.

> + * groups on many SoCs. We really need a per-group data structure to solve
> + * this, since the fields are in different positions/sizes in different
> + * registers (for different groups).
> + *
> + * On Tegra30/114/124, the DRV*_SHIFT values vary.
> + * On Tegra30, the SLW*_SHIFT values vary.
> + * On Tegra30/114/124/210, the DRV*_MASK values vary, although the values
> + *   below are wide enough to cover the widest fields, and hopefully don't
> + *   interfere with any other fields.
> + * On Tegra30, the SLW*_MASK values vary, but we can't use a value that's
> + *   wide enough to cover all cases, since that would cause the field to
> + *   overlap with other fields in the narrower cases.
> + */
>  #define DRVDN_SHIFT    12
>  #define DRVDN_MASK     (0x7F << DRVDN_SHIFT)
>  #define DRVUP_SHIFT    20
> --
> 1.9.1
>

Regards,
Simon

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [U-Boot] [PATCH 0/9] ARM: tegra: pinmux: Tegra210 support
  2015-02-24 23:44 ` [U-Boot] [PATCH 0/9] ARM: tegra: pinmux: " Simon Glass
@ 2015-02-25  0:06   ` Stephen Warren
  2015-02-26  0:54     ` Simon Glass
  0 siblings, 1 reply; 20+ messages in thread
From: Stephen Warren @ 2015-02-25  0:06 UTC (permalink / raw)
  To: u-boot

On 02/24/2015 04:44 PM, Simon Glass wrote:
> Hi Stephen,
>
> On 24 February 2015 at 14:08, Stephen Warren <swarren@wwwdotorg.org> wrote:
>> From: Stephen Warren <swarren@nvidia.com>
>>
>> This series performs a few small cleanups to or parameterizations of the
>> existing Tegra pinmux driver, and adds Tegra210 support. The Tegra210
>> code isn't actually used yet, since the balance of the Tegra210 support
>> is not yet present. However, it should start appearing soon.
>>
>> I've at least compile-tested this by over-writing the Tegra124 pinmux
>> driver and Jetson TK1 board pinmux data tables with the Tegra210 versions.
>>
>> TomW, note I made a couple minor tweaks since the latest version I sent
>> internally; let's apply this version upstream.
>>
>> Stephen Warren (9):
>>    ARM: tegra: pinmux: add note re: drive group field defines
>>    ARM: tegra: pinmux: simplify some defines
>>    ARM: tegra: pinmux: handle feature removal on newer SoCs
>>    ARM: tegra: pinmux: move some type definitions
>>    ARM: tegra: pinmux: partially handle varying register layouts
>>    ARM: tegra: pinmux: support hsm/schmitt on pins
>>    ARM: tegra: pinmux: account for different drivegroup base registers
>>    ARM: tegra: pinmux: support Tegra210's e_io_hv pin option
>>    ARM: tegra: pinmux: add Tegra210 support
>
> Does the Linux side look similar to this? The use of #defines seem
> like a potential temporary solution but I hope it doesn't stay that
> way.
>
> It feels like maybe we need to define an API that would suit all Tegra chips?

The Linux side was already a bit more parameterized, so the Tegra210 
support series doesn't have as many patches as the U-Boot series. 
However, that comes at the cost of the per-SoC "drivers" having much 
larger data tables, so I don't expect we'd want to adopt in U-Boot the 
same level of driver parameterization as Linux.

You can find the kernel patches on the linux-tegra mailing list; I 
posted them roughly the same time as the U-Boot patches.

The U-Boot API to the pinmux driver is already identical across all 
chips (at least Tegra114+; Tegra20 and perhaps Tegra30 boards might use 
some more fine-grained APIs in what I'd assert is a legacy fashion); the 
board file simply calls gpio_config_table(), 
pinmux_config_pingrp_table(), and pinmux_config_drvgrp_table(), passing 
the relevant data table to each. The only difference between SoCs is the 
set of fields in the data table, since each SoC has a different feature 
set. While we could reduce the number of ifdefs and unify the structs 
across chips, this would be at the cost of bloating structs with fields 
that aren't supported, and including functions to apply settings that 
will never be used by any pin's data table entries, thus using more 
.text and .rodata space without good reason.

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [U-Boot] [PATCH 1/9] ARM: tegra: pinmux: add note re: drive group field defines
  2015-02-24 23:44   ` Simon Glass
@ 2015-02-25  0:08     ` Stephen Warren
  2015-02-26  0:55       ` Simon Glass
  0 siblings, 1 reply; 20+ messages in thread
From: Stephen Warren @ 2015-02-25  0:08 UTC (permalink / raw)
  To: u-boot

On 02/24/2015 04:44 PM, Simon Glass wrote:
> Hi Stephen,
>
> On 24 February 2015 at 14:08, Stephen Warren <swarren@wwwdotorg.org> wrote:
>> From: Stephen Warren <swarren@nvidia.com>
>>
>> Tegra's drive group registers have a remarkably inconsistent layout. The
>> current U-Boot driver doesn't take this into account at all. Add a
>> comment to describe the issue, so at least anyone debugging the driver
>> will be aware of this. To solve this, we'd need to add a per-drive-group
>> data structure describing the layout for the individual register. Since
>> we don't set up too many drive groups in U-Boot at present, this
>> hopefully isn't causing too much practical issue. Still, we probably need
>> to fix this sometime.
>>
>> Wth Tegra210, the register layout becomes almost entirely consistent, so
>> this problem partially solves itself over time.
>>
>> Signed-off-by: Stephen Warren <swarren@nvidia.com>
>> ---
>>   arch/arm/cpu/tegra-common/pinmux-common.c | 15 +++++++++++++++
>>   1 file changed, 15 insertions(+)
>>
>> diff --git a/arch/arm/cpu/tegra-common/pinmux-common.c b/arch/arm/cpu/tegra-common/pinmux-common.c
>> index 64baed45d591..0bef6e246357 100644
>> --- a/arch/arm/cpu/tegra-common/pinmux-common.c
>> +++ b/arch/arm/cpu/tegra-common/pinmux-common.c
>> @@ -347,6 +347,21 @@ void pinmux_config_pingrp_table(const struct pmux_pingrp_config *config,
>>   #define SCHMT_SHIFT    3
>>   #define LPMD_SHIFT     4
>>   #define LPMD_MASK      (3 << LPMD_SHIFT)
>> +/*
>> + * Note that the following DRV* and SLW* defines are accurate for many drive
>
> Do you mean 'accurate'? That seems like a good thing so wonder if this
> should be reworded a bit compared to your commit message.

I think "accurate" is correct; the defines accurately describe the 
layout of the register in many cases, but not all. In cases where the 
register layout is different, the defines are not accurate for those 
cases. I suppose "correct" and "incorrect" would be suitable synonyms 
for "accurate" and "not accurate" if you wish.

>> + * groups on many SoCs. We really need a per-group data structure to solve
>> + * this, since the fields are in different positions/sizes in different
>> + * registers (for different groups).
>> + *
>> + * On Tegra30/114/124, the DRV*_SHIFT values vary.
>> + * On Tegra30, the SLW*_SHIFT values vary.
>> + * On Tegra30/114/124/210, the DRV*_MASK values vary, although the values
>> + *   below are wide enough to cover the widest fields, and hopefully don't
>> + *   interfere with any other fields.
>> + * On Tegra30, the SLW*_MASK values vary, but we can't use a value that's
>> + *   wide enough to cover all cases, since that would cause the field to
>> + *   overlap with other fields in the narrower cases.
>> + */
>>   #define DRVDN_SHIFT    12
>>   #define DRVDN_MASK     (0x7F << DRVDN_SHIFT)
>>   #define DRVUP_SHIFT    20
>> --
>> 1.9.1

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [U-Boot] [PATCH 0/9] ARM: tegra: pinmux: Tegra210 support
  2015-02-25  0:06   ` Stephen Warren
@ 2015-02-26  0:54     ` Simon Glass
  2015-02-26  3:44       ` Stephen Warren
  0 siblings, 1 reply; 20+ messages in thread
From: Simon Glass @ 2015-02-26  0:54 UTC (permalink / raw)
  To: u-boot

Hi Stephen,

On 24 February 2015 at 17:06, Stephen Warren <swarren@wwwdotorg.org> wrote:
> On 02/24/2015 04:44 PM, Simon Glass wrote:
>>
>> Hi Stephen,
>>
>> On 24 February 2015 at 14:08, Stephen Warren <swarren@wwwdotorg.org>
>> wrote:
>>>
>>> From: Stephen Warren <swarren@nvidia.com>
>>>
>>> This series performs a few small cleanups to or parameterizations of the
>>> existing Tegra pinmux driver, and adds Tegra210 support. The Tegra210
>>> code isn't actually used yet, since the balance of the Tegra210 support
>>> is not yet present. However, it should start appearing soon.
>>>
>>> I've at least compile-tested this by over-writing the Tegra124 pinmux
>>> driver and Jetson TK1 board pinmux data tables with the Tegra210
>>> versions.
>>>
>>> TomW, note I made a couple minor tweaks since the latest version I sent
>>> internally; let's apply this version upstream.
>>>
>>> Stephen Warren (9):
>>>    ARM: tegra: pinmux: add note re: drive group field defines
>>>    ARM: tegra: pinmux: simplify some defines
>>>    ARM: tegra: pinmux: handle feature removal on newer SoCs
>>>    ARM: tegra: pinmux: move some type definitions
>>>    ARM: tegra: pinmux: partially handle varying register layouts
>>>    ARM: tegra: pinmux: support hsm/schmitt on pins
>>>    ARM: tegra: pinmux: account for different drivegroup base registers
>>>    ARM: tegra: pinmux: support Tegra210's e_io_hv pin option
>>>    ARM: tegra: pinmux: add Tegra210 support
>>
>>
>> Does the Linux side look similar to this? The use of #defines seem
>> like a potential temporary solution but I hope it doesn't stay that
>> way.
>>
>> It feels like maybe we need to define an API that would suit all Tegra
>> chips?
>
>
> The Linux side was already a bit more parameterized, so the Tegra210 support
> series doesn't have as many patches as the U-Boot series. However, that
> comes at the cost of the per-SoC "drivers" having much larger data tables,
> so I don't expect we'd want to adopt in U-Boot the same level of driver
> parameterization as Linux.

I see - do you know how much bigger the tables are?

>
> You can find the kernel patches on the linux-tegra mailing list; I posted
> them roughly the same time as the U-Boot patches.
>
> The U-Boot API to the pinmux driver is already identical across all chips
> (at least Tegra114+; Tegra20 and perhaps Tegra30 boards might use some more
> fine-grained APIs in what I'd assert is a legacy fashion); the board file
> simply calls gpio_config_table(), pinmux_config_pingrp_table(), and
> pinmux_config_drvgrp_table(), passing the relevant data table to each. The
> only difference between SoCs is the set of fields in the data table, since
> each SoC has a different feature set. While we could reduce the number of
> ifdefs and unify the structs across chips, this would be at the cost of
> bloating structs with fields that aren't supported, and including functions
> to apply settings that will never be used by any pin's data table entries,
> thus using more .text and .rodata space without good reason.

OK, well that's up to you, I suppose I was talking about the
lower-level API, and probably that ties in with the discussion about a
pinctl layer. Let's see what happens in the future.

Regards,
Simon

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [U-Boot] [PATCH 1/9] ARM: tegra: pinmux: add note re: drive group field defines
  2015-02-25  0:08     ` Stephen Warren
@ 2015-02-26  0:55       ` Simon Glass
  0 siblings, 0 replies; 20+ messages in thread
From: Simon Glass @ 2015-02-26  0:55 UTC (permalink / raw)
  To: u-boot

Hi Stephen,

On 24 February 2015 at 17:08, Stephen Warren <swarren@wwwdotorg.org> wrote:
> On 02/24/2015 04:44 PM, Simon Glass wrote:
>>
>> Hi Stephen,
>>
>> On 24 February 2015 at 14:08, Stephen Warren <swarren@wwwdotorg.org>
>> wrote:
>>>
>>> From: Stephen Warren <swarren@nvidia.com>
>>>
>>> Tegra's drive group registers have a remarkably inconsistent layout. The
>>> current U-Boot driver doesn't take this into account at all. Add a
>>> comment to describe the issue, so at least anyone debugging the driver
>>> will be aware of this. To solve this, we'd need to add a per-drive-group
>>> data structure describing the layout for the individual register. Since
>>> we don't set up too many drive groups in U-Boot at present, this
>>> hopefully isn't causing too much practical issue. Still, we probably need
>>> to fix this sometime.
>>>
>>> Wth Tegra210, the register layout becomes almost entirely consistent, so
>>> this problem partially solves itself over time.
>>>
>>> Signed-off-by: Stephen Warren <swarren@nvidia.com>
>>> ---
>>>   arch/arm/cpu/tegra-common/pinmux-common.c | 15 +++++++++++++++
>>>   1 file changed, 15 insertions(+)
>>>
>>> diff --git a/arch/arm/cpu/tegra-common/pinmux-common.c
>>> b/arch/arm/cpu/tegra-common/pinmux-common.c
>>> index 64baed45d591..0bef6e246357 100644
>>> --- a/arch/arm/cpu/tegra-common/pinmux-common.c
>>> +++ b/arch/arm/cpu/tegra-common/pinmux-common.c
>>> @@ -347,6 +347,21 @@ void pinmux_config_pingrp_table(const struct
>>> pmux_pingrp_config *config,
>>>   #define SCHMT_SHIFT    3
>>>   #define LPMD_SHIFT     4
>>>   #define LPMD_MASK      (3 << LPMD_SHIFT)
>>> +/*
>>> + * Note that the following DRV* and SLW* defines are accurate for many
>>> drive
>>
>>
>> Do you mean 'accurate'? That seems like a good thing so wonder if this
>> should be reworded a bit compared to your commit message.
>
>
> I think "accurate" is correct; the defines accurately describe the layout of
> the register in many cases, but not all. In cases where the register layout
> is different, the defines are not accurate for those cases. I suppose
> "correct" and "incorrect" would be suitable synonyms for "accurate" and "not
> accurate" if you wish.

That's OK, I suppose I was expecting the comment to say that it is
accurate for many but not all. But it's not important.

>
>
>>> + * groups on many SoCs. We really need a per-group data structure to
>>> solve
>>> + * this, since the fields are in different positions/sizes in different
>>> + * registers (for different groups).
>>> + *
>>> + * On Tegra30/114/124, the DRV*_SHIFT values vary.
>>> + * On Tegra30, the SLW*_SHIFT values vary.
>>> + * On Tegra30/114/124/210, the DRV*_MASK values vary, although the
>>> values
>>> + *   below are wide enough to cover the widest fields, and hopefully
>>> don't
>>> + *   interfere with any other fields.
>>> + * On Tegra30, the SLW*_MASK values vary, but we can't use a value
>>> that's
>>> + *   wide enough to cover all cases, since that would cause the field to
>>> + *   overlap with other fields in the narrower cases.
>>> + */
>>>   #define DRVDN_SHIFT    12
>>>   #define DRVDN_MASK     (0x7F << DRVDN_SHIFT)
>>>   #define DRVUP_SHIFT    20
>>> --
>>> 1.9.1
>
>

Regards,
Simon

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [U-Boot] [PATCH 0/9] ARM: tegra: pinmux: Tegra210 support
  2015-02-26  0:54     ` Simon Glass
@ 2015-02-26  3:44       ` Stephen Warren
  2015-02-28  5:12         ` Simon Glass
  0 siblings, 1 reply; 20+ messages in thread
From: Stephen Warren @ 2015-02-26  3:44 UTC (permalink / raw)
  To: u-boot

On 02/25/2015 05:54 PM, Simon Glass wrote:
> On 24 February 2015 at 17:06, Stephen Warren <swarren@wwwdotorg.org> wrote:
>> On 02/24/2015 04:44 PM, Simon Glass wrote:
>>> On 24 February 2015 at 14:08, Stephen Warren <swarren@wwwdotorg.org>
>>> wrote:
>>>> This series performs a few small cleanups to or parameterizations of the
>>>> existing Tegra pinmux driver, and adds Tegra210 support. The Tegra210
>>>> code isn't actually used yet, since the balance of the Tegra210 support
>>>> is not yet present. However, it should start appearing soon.
...
>>>> Stephen Warren (9):
>>>>    ARM: tegra: pinmux: add note re: drive group field defines
>>>>    ARM: tegra: pinmux: simplify some defines
>>>>    ARM: tegra: pinmux: handle feature removal on newer SoCs
>>>>    ARM: tegra: pinmux: move some type definitions
>>>>    ARM: tegra: pinmux: partially handle varying register layouts
>>>>    ARM: tegra: pinmux: support hsm/schmitt on pins
>>>>    ARM: tegra: pinmux: account for different drivegroup base registers
>>>>    ARM: tegra: pinmux: support Tegra210's e_io_hv pin option
>>>>    ARM: tegra: pinmux: add Tegra210 support
>>>
>>> Does the Linux side look similar to this? The use of #defines seem
>>> like a potential temporary solution but I hope it doesn't stay that
>>> way.
...
>> The Linux side was already a bit more parameterized, so the Tegra210 support
>> series doesn't have as many patches as the U-Boot series. However, that
>> comes at the cost of the per-SoC "drivers" having much larger data tables,
>> so I don't expect we'd want to adopt in U-Boot the same level of driver
>> parameterization as Linux.
> 
> I see - do you know how much bigger the tables are?

Kernel per-SoC files:

   text	   data	    bss	    dec	    hex	filename
  25532	   1068	      0	  26600	   67e8	pinctrl-tegra30.o
  18744	   1032	      0	  19776	   4d40	pinctrl-tegra114.o
  19868	   1128	      0	  20996	   5204	pinctrl-tegra124.o
  16296	    972	      0	  17268	   4374	pinctrl-tegra210.o

U-Boot per-SoC files, although these could actually be reduced to zero
if we re-wrote the per-board pinmux tables to use FUNC0..3 enums (i.e.
raw HW register mux values) and hence got rid of the need to map a mux
enum to FUNC0..3 values. Auto-generation of the per-board files would
make pretty easy, if all boards were in tegra-pinmux-scripts.

   text	   data	    bss	    dec	    hex	filename
    996	      4	      0	   1000	    3e8	.../tegra30/pinmux.o
   1036	      4	      0	   1040	    410	.../tegra114/pinmux.o
   1076	      4	      0	   1080	    438	.../tegra124/pinmux.o

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [U-Boot] [PATCH 0/9] ARM: tegra: pinmux: Tegra210 support
  2015-02-26  3:44       ` Stephen Warren
@ 2015-02-28  5:12         ` Simon Glass
  0 siblings, 0 replies; 20+ messages in thread
From: Simon Glass @ 2015-02-28  5:12 UTC (permalink / raw)
  To: u-boot

Hi Stephen,

On 25 February 2015 at 20:44, Stephen Warren <swarren@wwwdotorg.org> wrote:
> On 02/25/2015 05:54 PM, Simon Glass wrote:
>> On 24 February 2015 at 17:06, Stephen Warren <swarren@wwwdotorg.org> wrote:
>>> On 02/24/2015 04:44 PM, Simon Glass wrote:
>>>> On 24 February 2015 at 14:08, Stephen Warren <swarren@wwwdotorg.org>
>>>> wrote:
>>>>> This series performs a few small cleanups to or parameterizations of the
>>>>> existing Tegra pinmux driver, and adds Tegra210 support. The Tegra210
>>>>> code isn't actually used yet, since the balance of the Tegra210 support
>>>>> is not yet present. However, it should start appearing soon.
> ...
>>>>> Stephen Warren (9):
>>>>>    ARM: tegra: pinmux: add note re: drive group field defines
>>>>>    ARM: tegra: pinmux: simplify some defines
>>>>>    ARM: tegra: pinmux: handle feature removal on newer SoCs
>>>>>    ARM: tegra: pinmux: move some type definitions
>>>>>    ARM: tegra: pinmux: partially handle varying register layouts
>>>>>    ARM: tegra: pinmux: support hsm/schmitt on pins
>>>>>    ARM: tegra: pinmux: account for different drivegroup base registers
>>>>>    ARM: tegra: pinmux: support Tegra210's e_io_hv pin option
>>>>>    ARM: tegra: pinmux: add Tegra210 support
>>>>
>>>> Does the Linux side look similar to this? The use of #defines seem
>>>> like a potential temporary solution but I hope it doesn't stay that
>>>> way.
> ...
>>> The Linux side was already a bit more parameterized, so the Tegra210 support
>>> series doesn't have as many patches as the U-Boot series. However, that
>>> comes at the cost of the per-SoC "drivers" having much larger data tables,
>>> so I don't expect we'd want to adopt in U-Boot the same level of driver
>>> parameterization as Linux.
>>
>> I see - do you know how much bigger the tables are?
>
> Kernel per-SoC files:
>
>    text    data     bss     dec     hex filename
>   25532    1068       0   26600    67e8 pinctrl-tegra30.o
>   18744    1032       0   19776    4d40 pinctrl-tegra114.o
>   19868    1128       0   20996    5204 pinctrl-tegra124.o
>   16296     972       0   17268    4374 pinctrl-tegra210.o
>
> U-Boot per-SoC files, although these could actually be reduced to zero
> if we re-wrote the per-board pinmux tables to use FUNC0..3 enums (i.e.
> raw HW register mux values) and hence got rid of the need to map a mux
> enum to FUNC0..3 values. Auto-generation of the per-board files would
> make pretty easy, if all boards were in tegra-pinmux-scripts.
>
>    text    data     bss     dec     hex filename
>     996       4       0    1000     3e8 .../tegra30/pinmux.o
>    1036       4       0    1040     410 .../tegra114/pinmux.o
>    1076       4       0    1080     438 .../tegra124/pinmux.o

Wow that's pretty compelling! I suppose removing the #ifdefs wouldn't
bloat it that much, but it sounds like we should stick with what you
have.

Regards,
Simon

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [U-Boot] [PATCH 0/9] ARM: tegra: pinmux: Tegra210 support
  2015-02-24 21:08 [U-Boot] [PATCH 0/9] ARM: tegra: pinmux: Tegra210 support Stephen Warren
                   ` (9 preceding siblings ...)
  2015-02-24 23:44 ` [U-Boot] [PATCH 0/9] ARM: tegra: pinmux: " Simon Glass
@ 2015-03-03 20:20 ` Stephen Warren
  2015-03-03 20:58   ` Tom Warren
  10 siblings, 1 reply; 20+ messages in thread
From: Stephen Warren @ 2015-03-03 20:20 UTC (permalink / raw)
  To: u-boot

On 02/24/2015 02:08 PM, Stephen Warren wrote:
> This series performs a few small cleanups to or parameterizations of the
> existing Tegra pinmux driver, and adds Tegra210 support. The Tegra210
> code isn't actually used yet, since the balance of the Tegra210 support
> is not yet present. However, it should start appearing soon.
>
> I've at least compile-tested this by over-writing the Tegra124 pinmux
> driver and Jetson TK1 board pinmux data tables with the Tegra210 versions.
>
> TomW, note I made a couple minor tweaks since the latest version I sent
> internally; let's apply this version upstream.

Tom,

Are you waiting for anything before applying this series?

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [U-Boot] [PATCH 0/9] ARM: tegra: pinmux: Tegra210 support
  2015-03-03 20:20 ` Stephen Warren
@ 2015-03-03 20:58   ` Tom Warren
  0 siblings, 0 replies; 20+ messages in thread
From: Tom Warren @ 2015-03-03 20:58 UTC (permalink / raw)
  To: u-boot

I'm using this locally, so I'll apply it and push a new u-boot-tegra/next.

> -----Original Message-----
> From: Stephen Warren [mailto:swarren at wwwdotorg.org]
> Sent: Tuesday, March 03, 2015 1:20 PM
> To: Tom Warren
> Cc: u-boot at lists.denx.de; Simon Glass; Stephen Warren
> Subject: Re: [U-Boot] [PATCH 0/9] ARM: tegra: pinmux: Tegra210 support
> 
> On 02/24/2015 02:08 PM, Stephen Warren wrote:
> > This series performs a few small cleanups to or parameterizations of
> > the existing Tegra pinmux driver, and adds Tegra210 support. The
> > Tegra210 code isn't actually used yet, since the balance of the
> > Tegra210 support is not yet present. However, it should start appearing
> soon.
> >
> > I've at least compile-tested this by over-writing the Tegra124 pinmux
> > driver and Jetson TK1 board pinmux data tables with the Tegra210 versions.
> >
> > TomW, note I made a couple minor tweaks since the latest version I
> > sent internally; let's apply this version upstream.
> 
> Tom,
> 
> Are you waiting for anything before applying this series?
-----------------------------------------------------------------------------------
This email message is for the sole use of the intended recipient(s) and may contain
confidential information.  Any unauthorized review, use, disclosure or distribution
is prohibited.  If you are not the intended recipient, please contact the sender by
reply email and destroy all copies of the original message.
-----------------------------------------------------------------------------------

^ permalink raw reply	[flat|nested] 20+ messages in thread

end of thread, other threads:[~2015-03-03 20:58 UTC | newest]

Thread overview: 20+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-02-24 21:08 [U-Boot] [PATCH 0/9] ARM: tegra: pinmux: Tegra210 support Stephen Warren
2015-02-24 21:08 ` [U-Boot] [PATCH 1/9] ARM: tegra: pinmux: add note re: drive group field defines Stephen Warren
2015-02-24 23:44   ` Simon Glass
2015-02-25  0:08     ` Stephen Warren
2015-02-26  0:55       ` Simon Glass
2015-02-24 21:08 ` [U-Boot] [PATCH 2/9] ARM: tegra: pinmux: simplify some defines Stephen Warren
2015-02-24 21:08 ` [U-Boot] [PATCH 3/9] ARM: tegra: pinmux: handle feature removal on newer SoCs Stephen Warren
2015-02-24 21:08 ` [U-Boot] [PATCH 4/9] ARM: tegra: pinmux: move some type definitions Stephen Warren
2015-02-24 21:08 ` [U-Boot] [PATCH 5/9] ARM: tegra: pinmux: partially handle varying register layouts Stephen Warren
2015-02-24 21:08 ` [U-Boot] [PATCH 6/9] ARM: tegra: pinmux: support hsm/schmitt on pins Stephen Warren
2015-02-24 21:08 ` [U-Boot] [PATCH 7/9] ARM: tegra: pinmux: account for different drivegroup base registers Stephen Warren
2015-02-24 21:08 ` [U-Boot] [PATCH 8/9] ARM: tegra: pinmux: support Tegra210's e_io_hv pin option Stephen Warren
2015-02-24 21:08 ` [U-Boot] [PATCH 9/9] ARM: tegra: pinmux: add Tegra210 support Stephen Warren
2015-02-24 23:44 ` [U-Boot] [PATCH 0/9] ARM: tegra: pinmux: " Simon Glass
2015-02-25  0:06   ` Stephen Warren
2015-02-26  0:54     ` Simon Glass
2015-02-26  3:44       ` Stephen Warren
2015-02-28  5:12         ` Simon Glass
2015-03-03 20:20 ` Stephen Warren
2015-03-03 20:58   ` Tom Warren

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox