linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/5] arm64: berlin: add pinctrl support
@ 2015-09-19 10:02 Jisheng Zhang
  2015-09-19 10:02 ` [PATCH 1/5] pinctrl: berlin: regmap as an extra argument of berlin_pinctrl_probe() Jisheng Zhang
                   ` (4 more replies)
  0 siblings, 5 replies; 10+ messages in thread
From: Jisheng Zhang @ 2015-09-19 10:02 UTC (permalink / raw)
  To: sebastian.hesselbarth, linus.walleij, antoine.tenart,
	catalin.marinas, will.deacon, mark.rutland, robh+dt, pawel.moll,
	ijc+devicetree, galak
  Cc: devicetree, linux-arm-kernel, linux-gpio, linux-kernel, Jisheng Zhang

This series adds support for Marvell berlin4ct pin-controller, allowing
to configure the pin muxing from the device tree.

This series applies on top of patches adding GPIO support for berlin4ct[1].

[1] http://lists.infradead.org/pipermail/linux-arm-kernel/2015-September/371106.html

Jisheng Zhang (5):
  pinctrl: berlin: regmap as an extra argument of berlin_pinctrl_probe()
  pinctrl: berlin: add the berlin4ct pinctrl driver
  arm64: berlin: add the pinctrl dependency for Marvell Berlin SoCs
  pinctrl: dt-binding: document berlin4ct SoC
  arm64: dts: berlin4ct: add the pinctrl node and muxing setup for uart0

 .../devicetree/bindings/pinctrl/berlin,pinctrl.txt |   5 +-
 arch/arm64/Kconfig.platforms                       |   1 +
 arch/arm64/boot/dts/marvell/berlin4ct.dtsi         |  27 ++
 drivers/pinctrl/berlin/Kconfig                     |   5 +
 drivers/pinctrl/berlin/Makefile                    |   1 +
 drivers/pinctrl/berlin/berlin-bg2.c                |   9 +-
 drivers/pinctrl/berlin/berlin-bg2cd.c              |   9 +-
 drivers/pinctrl/berlin/berlin-bg2q.c               |   9 +-
 drivers/pinctrl/berlin/berlin.c                    |   8 +-
 drivers/pinctrl/berlin/berlin.h                    |   1 +
 drivers/pinctrl/berlin/berlin4ct.c                 | 503 +++++++++++++++++++++
 11 files changed, 567 insertions(+), 11 deletions(-)
 create mode 100644 drivers/pinctrl/berlin/berlin4ct.c

-- 
2.5.1


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

* [PATCH 1/5] pinctrl: berlin: regmap as an extra argument of berlin_pinctrl_probe()
  2015-09-19 10:02 [PATCH 0/5] arm64: berlin: add pinctrl support Jisheng Zhang
@ 2015-09-19 10:02 ` Jisheng Zhang
  2015-09-19 10:02 ` [PATCH 2/5] pinctrl: berlin: add the berlin4ct pinctrl driver Jisheng Zhang
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 10+ messages in thread
From: Jisheng Zhang @ 2015-09-19 10:02 UTC (permalink / raw)
  To: sebastian.hesselbarth, linus.walleij, antoine.tenart,
	catalin.marinas, will.deacon, mark.rutland, robh+dt, pawel.moll,
	ijc+devicetree, galak
  Cc: devicetree, linux-arm-kernel, linux-gpio, linux-kernel, Jisheng Zhang

Let berlin_pinctrl_probe() accepts an extra argument: regmap, this is to
prepare for the next berlin4ct support, where we won't use simple-mfd
any more.

Signed-off-by: Jisheng Zhang <jszhang@marvell.com>
---
 drivers/pinctrl/berlin/berlin-bg2.c   | 9 ++++++++-
 drivers/pinctrl/berlin/berlin-bg2cd.c | 9 ++++++++-
 drivers/pinctrl/berlin/berlin-bg2q.c  | 9 ++++++++-
 drivers/pinctrl/berlin/berlin.c       | 8 +-------
 drivers/pinctrl/berlin/berlin.h       | 1 +
 5 files changed, 26 insertions(+), 10 deletions(-)

diff --git a/drivers/pinctrl/berlin/berlin-bg2.c b/drivers/pinctrl/berlin/berlin-bg2.c
index 274c553..b2be9be 100644
--- a/drivers/pinctrl/berlin/berlin-bg2.c
+++ b/drivers/pinctrl/berlin/berlin-bg2.c
@@ -233,8 +233,15 @@ static int berlin2_pinctrl_probe(struct platform_device *pdev)
 {
 	const struct of_device_id *match =
 		of_match_device(berlin2_pinctrl_match, &pdev->dev);
+	struct device *dev = &pdev->dev;
+	struct device_node *parent_np = of_get_parent(dev->of_node);
+	struct regmap *regmap = syscon_node_to_regmap(parent_np);
 
-	return berlin_pinctrl_probe(pdev, match->data);
+	of_node_put(parent_np);
+	if (IS_ERR(regmap))
+		return PTR_ERR(regmap);
+
+	return berlin_pinctrl_probe(pdev, regmap, match->data);
 }
 
 static struct platform_driver berlin2_pinctrl_driver = {
diff --git a/drivers/pinctrl/berlin/berlin-bg2cd.c b/drivers/pinctrl/berlin/berlin-bg2cd.c
index 0cb793a..f88a6e5 100644
--- a/drivers/pinctrl/berlin/berlin-bg2cd.c
+++ b/drivers/pinctrl/berlin/berlin-bg2cd.c
@@ -176,8 +176,15 @@ static int berlin2cd_pinctrl_probe(struct platform_device *pdev)
 {
 	const struct of_device_id *match =
 		of_match_device(berlin2cd_pinctrl_match, &pdev->dev);
+	struct device *dev = &pdev->dev;
+	struct device_node *parent_np = of_get_parent(dev->of_node);
+	struct regmap *regmap = syscon_node_to_regmap(parent_np);
 
-	return berlin_pinctrl_probe(pdev, match->data);
+	of_node_put(parent_np);
+	if (IS_ERR(regmap))
+		return PTR_ERR(regmap);
+
+	return berlin_pinctrl_probe(pdev, regmap, match->data);
 }
 
 static struct platform_driver berlin2cd_pinctrl_driver = {
diff --git a/drivers/pinctrl/berlin/berlin-bg2q.c b/drivers/pinctrl/berlin/berlin-bg2q.c
index a466054..c0bc0ec 100644
--- a/drivers/pinctrl/berlin/berlin-bg2q.c
+++ b/drivers/pinctrl/berlin/berlin-bg2q.c
@@ -395,8 +395,15 @@ static int berlin2q_pinctrl_probe(struct platform_device *pdev)
 {
 	const struct of_device_id *match =
 		of_match_device(berlin2q_pinctrl_match, &pdev->dev);
+	struct device *dev = &pdev->dev;
+	struct device_node *parent_np = of_get_parent(dev->of_node);
+	struct regmap *regmap = syscon_node_to_regmap(parent_np);
 
-	return berlin_pinctrl_probe(pdev, match->data);
+	of_node_put(parent_np);
+	if (IS_ERR(regmap))
+		return PTR_ERR(regmap);
+
+	return berlin_pinctrl_probe(pdev, regmap, match->data);
 }
 
 static struct platform_driver berlin2q_pinctrl_driver = {
diff --git a/drivers/pinctrl/berlin/berlin.c b/drivers/pinctrl/berlin/berlin.c
index f495806..6d593b5 100644
--- a/drivers/pinctrl/berlin/berlin.c
+++ b/drivers/pinctrl/berlin/berlin.c
@@ -293,19 +293,13 @@ static struct pinctrl_desc berlin_pctrl_desc = {
 };
 
 int berlin_pinctrl_probe(struct platform_device *pdev,
+			 struct regmap *regmap,
 			 const struct berlin_pinctrl_desc *desc)
 {
 	struct device *dev = &pdev->dev;
-	struct device_node *parent_np = of_get_parent(dev->of_node);
 	struct berlin_pinctrl *pctrl;
-	struct regmap *regmap;
 	int ret;
 
-	regmap = syscon_node_to_regmap(parent_np);
-	of_node_put(parent_np);
-	if (IS_ERR(regmap))
-		return PTR_ERR(regmap);
-
 	pctrl = devm_kzalloc(dev, sizeof(*pctrl), GFP_KERNEL);
 	if (!pctrl)
 		return -ENOMEM;
diff --git a/drivers/pinctrl/berlin/berlin.h b/drivers/pinctrl/berlin/berlin.h
index e1aa841..bf5781a 100644
--- a/drivers/pinctrl/berlin/berlin.h
+++ b/drivers/pinctrl/berlin/berlin.h
@@ -56,6 +56,7 @@ struct berlin_pinctrl_function {
 #define BERLIN_PINCTRL_FUNCTION_UNKNOWN		{}
 
 int berlin_pinctrl_probe(struct platform_device *pdev,
+			 struct regmap *regmap,
 			 const struct berlin_pinctrl_desc *desc);
 
 #endif /* __PINCTRL_BERLIN_H */
-- 
2.5.1


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

* [PATCH 2/5] pinctrl: berlin: add the berlin4ct pinctrl driver
  2015-09-19 10:02 [PATCH 0/5] arm64: berlin: add pinctrl support Jisheng Zhang
  2015-09-19 10:02 ` [PATCH 1/5] pinctrl: berlin: regmap as an extra argument of berlin_pinctrl_probe() Jisheng Zhang
@ 2015-09-19 10:02 ` Jisheng Zhang
  2015-09-20 19:32   ` Sebastian Hesselbarth
  2015-09-19 10:02 ` [PATCH 3/5] arm64: berlin: add the pinctrl dependency for Marvell Berlin SoCs Jisheng Zhang
                   ` (2 subsequent siblings)
  4 siblings, 1 reply; 10+ messages in thread
From: Jisheng Zhang @ 2015-09-19 10:02 UTC (permalink / raw)
  To: sebastian.hesselbarth, linus.walleij, antoine.tenart,
	catalin.marinas, will.deacon, mark.rutland, robh+dt, pawel.moll,
	ijc+devicetree, galak
  Cc: devicetree, linux-arm-kernel, linux-gpio, linux-kernel, Jisheng Zhang

Add the pin-controller driver for Marvell Berlin BG4CT SoC, with definition
of its groups and functions. This uses the core Berlin pinctrl driver.

Signed-off-by: Jisheng Zhang <jszhang@marvell.com>
---
 drivers/pinctrl/berlin/Kconfig     |   5 +
 drivers/pinctrl/berlin/Makefile    |   1 +
 drivers/pinctrl/berlin/berlin4ct.c | 503 +++++++++++++++++++++++++++++++++++++
 3 files changed, 509 insertions(+)
 create mode 100644 drivers/pinctrl/berlin/berlin4ct.c

diff --git a/drivers/pinctrl/berlin/Kconfig b/drivers/pinctrl/berlin/Kconfig
index b18322b..eac4d28 100644
--- a/drivers/pinctrl/berlin/Kconfig
+++ b/drivers/pinctrl/berlin/Kconfig
@@ -17,4 +17,9 @@ config PINCTRL_BERLIN_BG2Q
 	bool
 	select PINCTRL_BERLIN
 
+config PINCTRL_BERLIN4CT
+	depends on OF && (ARCH_BERLIN || COMPILE_TEST)
+	bool "Marvell berlin4ct pin controller driver"
+	select PINCTRL_BERLIN
+
 endif
diff --git a/drivers/pinctrl/berlin/Makefile b/drivers/pinctrl/berlin/Makefile
index deb0c6b..c8fe2a0 100644
--- a/drivers/pinctrl/berlin/Makefile
+++ b/drivers/pinctrl/berlin/Makefile
@@ -2,3 +2,4 @@ obj-$(CONFIG_PINCTRL_BERLIN)		+= berlin.o
 obj-$(CONFIG_PINCTRL_BERLIN_BG2)	+= berlin-bg2.o
 obj-$(CONFIG_PINCTRL_BERLIN_BG2CD)	+= berlin-bg2cd.o
 obj-$(CONFIG_PINCTRL_BERLIN_BG2Q)	+= berlin-bg2q.o
+obj-$(CONFIG_PINCTRL_BERLIN4CT)		+= berlin4ct.o
diff --git a/drivers/pinctrl/berlin/berlin4ct.c b/drivers/pinctrl/berlin/berlin4ct.c
new file mode 100644
index 0000000..2960e16
--- /dev/null
+++ b/drivers/pinctrl/berlin/berlin4ct.c
@@ -0,0 +1,503 @@
+/*
+ * Marvell berlin4ct pinctrl driver
+ *
+ * Copyright (C) 2015 Marvell Technology Group Ltd.
+ *
+ * Jisheng Zhang <jszhang@marvell.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <linux/module.h>
+#include <linux/of_device.h>
+#include <linux/platform_device.h>
+#include <linux/regmap.h>
+
+#include "berlin.h"
+
+static const struct berlin_desc_group berlin4ct_soc_pinctrl_groups[] = {
+	BERLIN_PINCTRL_GROUP("EMMC_RSTn", 0x0, 0x3, 0x00,
+			BERLIN_PINCTRL_FUNCTION(0x0, "emmc_rstn"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "gpio47")),
+	BERLIN_PINCTRL_GROUP("NAND_IO0", 0x0, 0x3, 0x03,
+			BERLIN_PINCTRL_FUNCTION(0x0, "nand_io0"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "rgmii_rxd0"),
+			BERLIN_PINCTRL_FUNCTION(0x2, "sd1_clk"),
+			BERLIN_PINCTRL_FUNCTION(0x3, "gpio0")),
+	BERLIN_PINCTRL_GROUP("NAND_IO1", 0x0, 0x3, 0x06,
+			BERLIN_PINCTRL_FUNCTION(0x0, "nand_io1"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "rgmii_rxd1"),
+			BERLIN_PINCTRL_FUNCTION(0x2, "sd1_cdn"),
+			BERLIN_PINCTRL_FUNCTION(0x3, "gpio1")),
+	BERLIN_PINCTRL_GROUP("NAND_IO2", 0x0, 0x3, 0x09,
+			BERLIN_PINCTRL_FUNCTION(0x0, "nand_io2"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "rgmii_rxd2"),
+			BERLIN_PINCTRL_FUNCTION(0x2, "sd1_dat0"),
+			BERLIN_PINCTRL_FUNCTION(0x3, "gpio2")),
+	BERLIN_PINCTRL_GROUP("NAND_IO3", 0x0, 0x3, 0x0c,
+			BERLIN_PINCTRL_FUNCTION(0x0, "nand_io3"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "rgmii_rxd3"),
+			BERLIN_PINCTRL_FUNCTION(0x2, "sd1_dat1"),
+			BERLIN_PINCTRL_FUNCTION(0x3, "gpio3")),
+	BERLIN_PINCTRL_GROUP("NAND_IO4", 0x0, 0x3, 0x0f,
+			BERLIN_PINCTRL_FUNCTION(0x0, "nand_io4"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "rgmii_rxc"),
+			BERLIN_PINCTRL_FUNCTION(0x2, "sd1_dat2"),
+			BERLIN_PINCTRL_FUNCTION(0x3, "gpio4")),
+	BERLIN_PINCTRL_GROUP("NAND_IO5", 0x0, 0x3, 0x12,
+			BERLIN_PINCTRL_FUNCTION(0x0, "nand_io5"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "rgmii_rxctl"),
+			BERLIN_PINCTRL_FUNCTION(0x2, "sd1_dat3"),
+			BERLIN_PINCTRL_FUNCTION(0x3, "gpio5")),
+	BERLIN_PINCTRL_GROUP("NAND_IO6", 0x0, 0x3, 0x15,
+			BERLIN_PINCTRL_FUNCTION(0x0, "nand_io6"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "rgmii_mdc"),
+			BERLIN_PINCTRL_FUNCTION(0x2, "sd1_cmd"),
+			BERLIN_PINCTRL_FUNCTION(0x3, "gpio6")),
+	BERLIN_PINCTRL_GROUP("NAND_IO7", 0x0, 0x3, 0x18,
+			BERLIN_PINCTRL_FUNCTION(0x0, "nand_io7"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "rgmii_mdio"),
+			BERLIN_PINCTRL_FUNCTION(0x2, "sd1_wp"),
+			BERLIN_PINCTRL_FUNCTION(0x3, "gpio7")),
+	BERLIN_PINCTRL_GROUP("NAND_ALE", 0x0, 0x3, 0x1b,
+			BERLIN_PINCTRL_FUNCTION(0x0, "nand_ale"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "rgmii_txd0"),
+			BERLIN_PINCTRL_FUNCTION(0x3, "gpio8")),
+	BERLIN_PINCTRL_GROUP("NAND_CLE", 0x4, 0x3, 0x00,
+			BERLIN_PINCTRL_FUNCTION(0x0, "nand_cle"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "rgmii_txd1"),
+			BERLIN_PINCTRL_FUNCTION(0x3, "gpio9")),
+	BERLIN_PINCTRL_GROUP("NAND_WEn", 0x4, 0x3, 0x03,
+			BERLIN_PINCTRL_FUNCTION(0x0, "nand_wen"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "rgmii_txd2"),
+			BERLIN_PINCTRL_FUNCTION(0x3, "gpio10")),
+	BERLIN_PINCTRL_GROUP("NAND_REn", 0x4, 0x3, 0x06,
+			BERLIN_PINCTRL_FUNCTION(0x0, "nand_ren"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "rgmii_txd3"),
+			BERLIN_PINCTRL_FUNCTION(0x3, "gpio11")),
+	BERLIN_PINCTRL_GROUP("NAND_WPn", 0x4, 0x3, 0x09,
+			BERLIN_PINCTRL_FUNCTION(0x0, "nand_wpn"),
+			BERLIN_PINCTRL_FUNCTION(0x3, "gpio12")),
+	BERLIN_PINCTRL_GROUP("NAND_CEn", 0x4, 0x3, 0x0c,
+			BERLIN_PINCTRL_FUNCTION(0x0, "nand_cen"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "rgmii_txc"),
+			BERLIN_PINCTRL_FUNCTION(0x3, "gpio13")),
+	BERLIN_PINCTRL_GROUP("NAND_RDY", 0x4, 0x3, 0x0f,
+			BERLIN_PINCTRL_FUNCTION(0x0, "nand_rdy"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "rgmii_txctl"),
+			BERLIN_PINCTRL_FUNCTION(0x3, "gpio14")),
+	BERLIN_PINCTRL_GROUP("SD0_CLK", 0x4, 0x3, 0x12,
+			BERLIN_PINCTRL_FUNCTION(0x0, "gpio29"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "sd0_clk"),
+			BERLIN_PINCTRL_FUNCTION(0x2, "sts4_clk"),
+			BERLIN_PINCTRL_FUNCTION(0x5, "v4g_dbg8"),
+			BERLIN_PINCTRL_FUNCTION(0x7, "phy_dbg8")),
+	BERLIN_PINCTRL_GROUP("SD0_DAT0", 0x4, 0x3, 0x15,
+			BERLIN_PINCTRL_FUNCTION(0x0, "gpio30"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "sd0_dat0"),
+			BERLIN_PINCTRL_FUNCTION(0x2, "sts4_sop"),
+			BERLIN_PINCTRL_FUNCTION(0x5, "v4g_dbg9"),
+			BERLIN_PINCTRL_FUNCTION(0x7, "phy_dbg9")),
+	BERLIN_PINCTRL_GROUP("SD0_DAT1", 0x4, 0x3, 0x18,
+			BERLIN_PINCTRL_FUNCTION(0x0, "gpio31"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "sd0_dat1"),
+			BERLIN_PINCTRL_FUNCTION(0x2, "sts4_sd"),
+			BERLIN_PINCTRL_FUNCTION(0x5, "v4g_dbg10"),
+			BERLIN_PINCTRL_FUNCTION(0x7, "phy_dbg10")),
+	BERLIN_PINCTRL_GROUP("SD0_DAT2", 0x4, 0x3, 0x1b,
+			BERLIN_PINCTRL_FUNCTION(0x0, "gpio32"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "sd0_dat2"),
+			BERLIN_PINCTRL_FUNCTION(0x2, "sts4_vald"),
+			BERLIN_PINCTRL_FUNCTION(0x5, "v4g_dbg11"),
+			BERLIN_PINCTRL_FUNCTION(0x7, "phy_dbg11")),
+	BERLIN_PINCTRL_GROUP("SD0_DAT3", 0x8, 0x3, 0x00,
+			BERLIN_PINCTRL_FUNCTION(0x0, "gpio33"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "sd0_dat3"),
+			BERLIN_PINCTRL_FUNCTION(0x2, "sts5_clk"),
+			BERLIN_PINCTRL_FUNCTION(0x5, "v4g_dbg12"),
+			BERLIN_PINCTRL_FUNCTION(0x7, "phy_dbg12")),
+	BERLIN_PINCTRL_GROUP("SD0_CDn", 0x8, 0x3, 0x03,
+			BERLIN_PINCTRL_FUNCTION(0x0, "gpio34"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "sd0_cdn"),
+			BERLIN_PINCTRL_FUNCTION(0x2, "sts5_sop"),
+			BERLIN_PINCTRL_FUNCTION(0x5, "v4g_dbg13"),
+			BERLIN_PINCTRL_FUNCTION(0x7, "phy_dbg13")),
+	BERLIN_PINCTRL_GROUP("SD0_CMD", 0x8, 0x3, 0x06,
+			BERLIN_PINCTRL_FUNCTION(0x0, "gpio35"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "sd0_cmd"),
+			BERLIN_PINCTRL_FUNCTION(0x2, "sts5_sd"),
+			BERLIN_PINCTRL_FUNCTION(0x5, "v4g_dbg14"),
+			BERLIN_PINCTRL_FUNCTION(0x7, "phy_dbg14")),
+	BERLIN_PINCTRL_GROUP("SD0_WP", 0x8, 0x3, 0x09,
+			BERLIN_PINCTRL_FUNCTION(0x0, "gpio36"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "sd0_wp"),
+			BERLIN_PINCTRL_FUNCTION(0x2, "sts5_vald"),
+			BERLIN_PINCTRL_FUNCTION(0x5, "v4g_dbg15"),
+			BERLIN_PINCTRL_FUNCTION(0x7, "phy_dbg15")),
+	BERLIN_PINCTRL_GROUP("STS0_CLK", 0x8, 0x3, 0x0c,
+			BERLIN_PINCTRL_FUNCTION(0x0, "gpio21"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "sts0_clk"),
+			BERLIN_PINCTRL_FUNCTION(0x2, "cpupll_clko"),
+			BERLIN_PINCTRL_FUNCTION(0x5, "v4g_dbg0"),
+			BERLIN_PINCTRL_FUNCTION(0x7, "phy_dbg0")),
+	BERLIN_PINCTRL_GROUP("STS0_SOP", 0x8, 0x3, 0x0f,
+			BERLIN_PINCTRL_FUNCTION(0x0, "gpio22"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "sts0_sop"),
+			BERLIN_PINCTRL_FUNCTION(0x2, "syspll_clko"),
+			BERLIN_PINCTRL_FUNCTION(0x5, "v4g_dbg1"),
+			BERLIN_PINCTRL_FUNCTION(0x7, "phy_dbg1")),
+	BERLIN_PINCTRL_GROUP("STS0_SD", 0x8, 0x3, 0x12,
+			BERLIN_PINCTRL_FUNCTION(0x0, "gpio23"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "sts0_sd"),
+			BERLIN_PINCTRL_FUNCTION(0x2, "mempll_clko"),
+			BERLIN_PINCTRL_FUNCTION(0x5, "v4g_dbg2"),
+			BERLIN_PINCTRL_FUNCTION(0x7, "phy_dbg2")),
+	BERLIN_PINCTRL_GROUP("STS0_VALD", 0x8, 0x3, 0x15,
+			BERLIN_PINCTRL_FUNCTION(0x0, "gpio24"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "sts0_vald"),
+			BERLIN_PINCTRL_FUNCTION(0x5, "v4g_dbg3"),
+			BERLIN_PINCTRL_FUNCTION(0x7, "phy_dbg3")),
+	BERLIN_PINCTRL_GROUP("STS1_CLK", 0x8, 0x3, 0x18,
+			BERLIN_PINCTRL_FUNCTION(0x0, "gpio25"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "sts1_clk"),
+			BERLIN_PINCTRL_FUNCTION(0x2, "pwm0"),
+			BERLIN_PINCTRL_FUNCTION(0x5, "v4g_dbg4"),
+			BERLIN_PINCTRL_FUNCTION(0x7, "phy_dbg4")),
+	BERLIN_PINCTRL_GROUP("STS1_SOP", 0x8, 0x3, 0x1b,
+			BERLIN_PINCTRL_FUNCTION(0x0, "gpio26"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "sts1_sop"),
+			BERLIN_PINCTRL_FUNCTION(0x2, "pwm1"),
+			BERLIN_PINCTRL_FUNCTION(0x5, "v4g_dbg5"),
+			BERLIN_PINCTRL_FUNCTION(0x7, "phy_dbg5")),
+	BERLIN_PINCTRL_GROUP("STS1_SD", 0xc, 0x3, 0x00,
+			BERLIN_PINCTRL_FUNCTION(0x0, "gpio27"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "sts1_sd"),
+			BERLIN_PINCTRL_FUNCTION(0x2, "pwm2"),
+			BERLIN_PINCTRL_FUNCTION(0x5, "v4g_dbg6"),
+			BERLIN_PINCTRL_FUNCTION(0x7, "phy_dbg6")),
+	BERLIN_PINCTRL_GROUP("STS1_VALD", 0xc, 0x3, 0x03,
+			BERLIN_PINCTRL_FUNCTION(0x0, "gpio28"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "sts1_vald"),
+			BERLIN_PINCTRL_FUNCTION(0x2, "pwm3"),
+			BERLIN_PINCTRL_FUNCTION(0x5, "v4g_dbg7"),
+			BERLIN_PINCTRL_FUNCTION(0x7, "phy_dbg7")),
+	BERLIN_PINCTRL_GROUP("SCRD0_RST", 0xc, 0x3, 0x06,
+			BERLIN_PINCTRL_FUNCTION(0x0, "gpio15"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "scrd0_rst"),
+			BERLIN_PINCTRL_FUNCTION(0x3, "sd1a_clk")),
+	BERLIN_PINCTRL_GROUP("SCRD0_DCLK", 0xc, 0x3, 0x09,
+			BERLIN_PINCTRL_FUNCTION(0x0, "gpio16"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "scrd0_dclk"),
+			BERLIN_PINCTRL_FUNCTION(0x3, "sd1a_cmd")),
+	BERLIN_PINCTRL_GROUP("SCRD0_GPIO0", 0xc, 0x3, 0x0c,
+			BERLIN_PINCTRL_FUNCTION(0x0, "gpio17"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "scrd0_gpio0"),
+			BERLIN_PINCTRL_FUNCTION(0x2, "sif_dio"),
+			BERLIN_PINCTRL_FUNCTION(0x3, "sd1a_dat0")),
+	BERLIN_PINCTRL_GROUP("SCRD0_GPIO1", 0xc, 0x3, 0x0f,
+			BERLIN_PINCTRL_FUNCTION(0x0, "gpio18"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "scrd0_gpio1"),
+			BERLIN_PINCTRL_FUNCTION(0x2, "sif_clk"),
+			BERLIN_PINCTRL_FUNCTION(0x3, "sd1a_dat1")),
+	BERLIN_PINCTRL_GROUP("SCRD0_DIO", 0xc, 0x3, 0x12,
+			BERLIN_PINCTRL_FUNCTION(0x0, "gpio19"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "scrd0_dio"),
+			BERLIN_PINCTRL_FUNCTION(0x2, "sif_den"),
+			BERLIN_PINCTRL_FUNCTION(0x3, "sd1a_dat2")),
+	BERLIN_PINCTRL_GROUP("SCRD0_CRD_PRES", 0xc, 0x3, 0x15,
+			BERLIN_PINCTRL_FUNCTION(0x0, "gpio20"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "scrd0_crd_pres"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "sd1a_dat3")),
+	BERLIN_PINCTRL_GROUP("SPI1_SS0n", 0xc, 0x3, 0x18,
+			BERLIN_PINCTRL_FUNCTION(0x0, "spi1_ss0n"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "gpio37"),
+			BERLIN_PINCTRL_FUNCTION(0x2, "sts2_clk")),
+	BERLIN_PINCTRL_GROUP("SPI1_SS1n", 0xc, 0x3, 0x1b,
+			BERLIN_PINCTRL_FUNCTION(0x0, "spi1_ss1n"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "gpio38"),
+			BERLIN_PINCTRL_FUNCTION(0x2, "sts2_sop"),
+			BERLIN_PINCTRL_FUNCTION(0x4, "pwm1")),
+	BERLIN_PINCTRL_GROUP("SPI1_SS2n", 0x10, 0x3, 0x00,
+			BERLIN_PINCTRL_FUNCTION(0x0, "spi1_ss2n"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "gpio39"),
+			BERLIN_PINCTRL_FUNCTION(0x2, "sts2_sd"),
+			BERLIN_PINCTRL_FUNCTION(0x4, "pwm0")),
+	BERLIN_PINCTRL_GROUP("SPI1_SS3n", 0x10, 0x3, 0x03,
+			BERLIN_PINCTRL_FUNCTION(0x0, "spi1_ss3n"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "gpio40"),
+			BERLIN_PINCTRL_FUNCTION(0x2, "sts2_vald")),
+	BERLIN_PINCTRL_GROUP("SPI1_SCLK", 0x10, 0x3, 0x06,
+			BERLIN_PINCTRL_FUNCTION(0x0, "spi1_sclk"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "gpio41"),
+			BERLIN_PINCTRL_FUNCTION(0x2, "sts3_clk")),
+	BERLIN_PINCTRL_GROUP("SPI1_SDO", 0x10, 0x3, 0x09,
+			BERLIN_PINCTRL_FUNCTION(0x0, "spi1_sdo"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "gpio42"),
+			BERLIN_PINCTRL_FUNCTION(0x2, "sts3_sop")),
+	BERLIN_PINCTRL_GROUP("SPI1_SDI", 0x10, 0x3, 0x0c,
+			BERLIN_PINCTRL_FUNCTION(0x0, "spi1_sdi"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "gpio43"),
+			BERLIN_PINCTRL_FUNCTION(0x2, "sts3_sd")),
+	BERLIN_PINCTRL_GROUP("USB0_DRV_VBUS", 0x10, 0x3, 0x0f,
+			BERLIN_PINCTRL_FUNCTION(0x0, "gpio44"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "usb0_drv_vbus"),
+			BERLIN_PINCTRL_FUNCTION(0x2, "sts3_vald")),
+	BERLIN_PINCTRL_GROUP("TW0_SCL", 0x10, 0x3, 0x12,
+			BERLIN_PINCTRL_FUNCTION(0x0, "gpio45"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "tw0_scl")),
+	BERLIN_PINCTRL_GROUP("TW0_SDA", 0x10, 0x3, 0x15,
+			BERLIN_PINCTRL_FUNCTION(0x0, "gpio46"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "tw0_sda")),
+};
+
+static const struct berlin_desc_group berlin4ct_soc_aviopinctrl_groups[] = {
+	BERLIN_PINCTRL_GROUP("TX_EDDC_SCL", 0x0, 0x3, 0x00,
+			BERLIN_PINCTRL_FUNCTION(0x0, "avio_gpio0"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "tx_eddc_scl"),
+			BERLIN_PINCTRL_FUNCTION(0x2, "tw1_scl")),
+	BERLIN_PINCTRL_GROUP("TX_EDDC_SDA", 0x0, 0x3, 0x03,
+			BERLIN_PINCTRL_FUNCTION(0x0, "avio_gpio1"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "tx_eddc_sda"),
+			BERLIN_PINCTRL_FUNCTION(0x2, "tw1_sda")),
+	BERLIN_PINCTRL_GROUP("I2S1_LRCKO", 0x0, 0x3, 0x06,
+			BERLIN_PINCTRL_FUNCTION(0x0, "avio_gpio2"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "i2s1_lrcko"),
+			BERLIN_PINCTRL_FUNCTION(0x3, "sts6_clk"),
+			BERLIN_PINCTRL_FUNCTION(0x4, "adac_dbg0"),
+			BERLIN_PINCTRL_FUNCTION(0x6, "sd1b_clk"),
+			BERLIN_PINCTRL_FUNCTION(0x7, "avio_dbg0")),
+	BERLIN_PINCTRL_GROUP("I2S1_BCLKO", 0x0, 0x3, 0x09,
+			BERLIN_PINCTRL_FUNCTION(0x0, "avio_gpio3"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "i2s1_bclko"),
+			BERLIN_PINCTRL_FUNCTION(0x3, "sts6_sop"),
+			BERLIN_PINCTRL_FUNCTION(0x4, "adac_dbg1"),
+			BERLIN_PINCTRL_FUNCTION(0x6, "sd1b_cmd"),
+			BERLIN_PINCTRL_FUNCTION(0x7, "avio_dbg1")),
+	BERLIN_PINCTRL_GROUP("I2S1_DO", 0x0, 0x3, 0x0c,
+			BERLIN_PINCTRL_FUNCTION(0x0, "avio_gpio4"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "i2s1_do"),
+			BERLIN_PINCTRL_FUNCTION(0x3, "sts6_sd"),
+			BERLIN_PINCTRL_FUNCTION(0x4, "adac_dbg2"),
+			BERLIN_PINCTRL_FUNCTION(0x6, "sd1b_dat0"),
+			BERLIN_PINCTRL_FUNCTION(0x7, "avio_dbg2")),
+	BERLIN_PINCTRL_GROUP("I2S1_MCLK", 0x0, 0x3, 0x0f,
+			BERLIN_PINCTRL_FUNCTION(0x0, "avio_gpio5"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "i2s1_mclk"),
+			BERLIN_PINCTRL_FUNCTION(0x3, "sts6_vald"),
+			BERLIN_PINCTRL_FUNCTION(0x4, "adac_test_mclk"),
+			BERLIN_PINCTRL_FUNCTION(0x6, "sd1b_dat1"),
+			BERLIN_PINCTRL_FUNCTION(0x7, "avio_dbg3")),
+	BERLIN_PINCTRL_GROUP("SPDIFO", 0x0, 0x3, 0x12,
+			BERLIN_PINCTRL_FUNCTION(0x0, "avio_gpio6"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "spdifo"),
+			BERLIN_PINCTRL_FUNCTION(0x2, "avpll_clko"),
+			BERLIN_PINCTRL_FUNCTION(0x4, "adac_dbg3")),
+	BERLIN_PINCTRL_GROUP("I2S2_MCLK", 0x0, 0x3, 0x15,
+			BERLIN_PINCTRL_FUNCTION(0x0, "avio_gpio7"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "i2s2_mclk"),
+			BERLIN_PINCTRL_FUNCTION(0x4, "hdmi_fbclk"),
+			BERLIN_PINCTRL_FUNCTION(0x5, "pdm_clko")),
+	BERLIN_PINCTRL_GROUP("I2S2_LRCKI", 0x0, 0x3, 0x18,
+			BERLIN_PINCTRL_FUNCTION(0x0, "avio_gpio8"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "i2s2_lrcki"),
+			BERLIN_PINCTRL_FUNCTION(0x2, "pwm0"),
+			BERLIN_PINCTRL_FUNCTION(0x3, "sts7_clk"),
+			BERLIN_PINCTRL_FUNCTION(0x4, "adac_test_lrck"),
+			BERLIN_PINCTRL_FUNCTION(0x6, "sd1b_dat2")),
+	BERLIN_PINCTRL_GROUP("I2S2_BCLKI", 0x0, 0x3, 0x1b,
+			BERLIN_PINCTRL_FUNCTION(0x0, "avio_gpio9"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "i2s2_bclki"),
+			BERLIN_PINCTRL_FUNCTION(0x2, "pwm1"),
+			BERLIN_PINCTRL_FUNCTION(0x3, "sts7_sop"),
+			BERLIN_PINCTRL_FUNCTION(0x4, "adac_test_bclk"),
+			BERLIN_PINCTRL_FUNCTION(0x6, "sd1b_dat3")),
+	BERLIN_PINCTRL_GROUP("I2S2_DI0", 0x4, 0x3, 0x00,
+			BERLIN_PINCTRL_FUNCTION(0x0, "avio_gpio10"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "i2s2_di0"),
+			BERLIN_PINCTRL_FUNCTION(0x2, "pwm2"),
+			BERLIN_PINCTRL_FUNCTION(0x3, "sts7_sd"),
+			BERLIN_PINCTRL_FUNCTION(0x4, "adac_test_sdin"),
+			BERLIN_PINCTRL_FUNCTION(0x5, "pdm_di0"),
+			BERLIN_PINCTRL_FUNCTION(0x6, "sd1b_cdn")),
+	BERLIN_PINCTRL_GROUP("I2S2_DI1", 0x4, 0x3, 0x03,
+			BERLIN_PINCTRL_FUNCTION(0x0, "avio_gpio11"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "i2s2_di1"),
+			BERLIN_PINCTRL_FUNCTION(0x2, "pwm3"),
+			BERLIN_PINCTRL_FUNCTION(0x3, "sts7_vald"),
+			BERLIN_PINCTRL_FUNCTION(0x4, "adac_test_pwmclk"),
+			BERLIN_PINCTRL_FUNCTION(0x5, "pdm_di1"),
+			BERLIN_PINCTRL_FUNCTION(0x6, "sd1b_wp")),
+};
+
+static const struct berlin_desc_group berlin4ct_sysmgr_pinctrl_groups[] = {
+	BERLIN_PINCTRL_GROUP("SM_TW2_SCL", 0x0, 0x3, 0x00,
+			BERLIN_PINCTRL_FUNCTION(0x0, "sm_gpio19"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "sm_tw2_scl")),
+	BERLIN_PINCTRL_GROUP("SM_TW2_SDA", 0x0, 0x3, 0x03,
+			BERLIN_PINCTRL_FUNCTION(0x0, "sm_gpio20"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "sm_tw2_sda")),
+	BERLIN_PINCTRL_GROUP("SM_TW3_SCL", 0x0, 0x3, 0x06,
+			BERLIN_PINCTRL_FUNCTION(0x0, "sm_gpio21"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "sm_tw3_scl")),
+	BERLIN_PINCTRL_GROUP("SM_TW3_SDA", 0x0, 0x3, 0x09,
+			BERLIN_PINCTRL_FUNCTION(0x0, "sm_gpio22"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "sm_tw3_sda")),
+	BERLIN_PINCTRL_GROUP("SM_TMS", 0x0, 0x3, 0x0c,
+			BERLIN_PINCTRL_FUNCTION(0x0, "sm_tms"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "sm_gpio0"),
+			BERLIN_PINCTRL_FUNCTION(0x2, "pwm0")),
+	BERLIN_PINCTRL_GROUP("SM_TDI", 0x0, 0x3, 0x0f,
+			BERLIN_PINCTRL_FUNCTION(0x0, "sm_tdi"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "sm_gpio1"),
+			BERLIN_PINCTRL_FUNCTION(0x2, "pwm1")),
+	BERLIN_PINCTRL_GROUP("SM_TDO", 0x0, 0x3, 0x12,
+			BERLIN_PINCTRL_FUNCTION(0x0, "sm_tdo"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "sm_gpio2")),
+	BERLIN_PINCTRL_GROUP("SM_URT0_TXD", 0x0, 0x3, 0x15,
+			BERLIN_PINCTRL_FUNCTION(0x0, "sm_urt0_txd"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "sm_gpio3")),
+	BERLIN_PINCTRL_GROUP("SM_URT0_RXD", 0x0, 0x3, 0x18,
+			BERLIN_PINCTRL_FUNCTION(0x0, "sm_urt0_rxd"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "sm_gpio4")),
+	BERLIN_PINCTRL_GROUP("SM_URT1_TXD", 0x0, 0x3, 0x1b,
+			BERLIN_PINCTRL_FUNCTION(0x0, "sm_gpio5"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "sm_urt1_txd"),
+			BERLIN_PINCTRL_FUNCTION(0x2, "eth1_rxclk"),
+			BERLIN_PINCTRL_FUNCTION(0x3, "pwm2"),
+			BERLIN_PINCTRL_FUNCTION(0x4, "sm_timer0"),
+			BERLIN_PINCTRL_FUNCTION(0x5, "clk_25m")),
+	BERLIN_PINCTRL_GROUP("SM_URT1_RXD", 0x4, 0x3, 0x00,
+			BERLIN_PINCTRL_FUNCTION(0x0, "sm_gpio6"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "sm_urt1_rxd"),
+			BERLIN_PINCTRL_FUNCTION(0x3, "pwm3"),
+			BERLIN_PINCTRL_FUNCTION(0x4, "sm_timer1")),
+	BERLIN_PINCTRL_GROUP("SM_SPI2_SS0n", 0x4, 0x3, 0x03,
+			BERLIN_PINCTRL_FUNCTION(0x0, "sm_spi2_ss0n"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "sm_gpio7")),
+	BERLIN_PINCTRL_GROUP("SM_SPI2_SS1n", 0x4, 0x3, 0x06,
+			BERLIN_PINCTRL_FUNCTION(0x0, "sm_gpio8"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "sm_spi2_ss1n")),
+	BERLIN_PINCTRL_GROUP("SM_SPI2_SS2n", 0x4, 0x3, 0x09,
+			BERLIN_PINCTRL_FUNCTION(0x0, "sm_gpio9"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "sm_spi2_ss2n"),
+			BERLIN_PINCTRL_FUNCTION(0x2, "eth1_mdc"),
+			BERLIN_PINCTRL_FUNCTION(0x3, "pwm0"),
+			BERLIN_PINCTRL_FUNCTION(0x4, "sm_timer0"),
+			BERLIN_PINCTRL_FUNCTION(0x5, "clk_25m")),
+	BERLIN_PINCTRL_GROUP("SM_SPI2_SS3n", 0x4, 0x3, 0x0c,
+			BERLIN_PINCTRL_FUNCTION(0x0, "sm_gpio10"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "sm_spi2_ss3n"),
+			BERLIN_PINCTRL_FUNCTION(0x2, "eth1_mdio"),
+			BERLIN_PINCTRL_FUNCTION(0x3, "pwm1"),
+			BERLIN_PINCTRL_FUNCTION(0x4, "sm_timer1")),
+	BERLIN_PINCTRL_GROUP("SM_SPI2_SDO", 0x4, 0x3, 0x0f,
+			BERLIN_PINCTRL_FUNCTION(0x0, "sm_spi2_sdo"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "sm_gpio11")),
+	BERLIN_PINCTRL_GROUP("SM_SPI2_SDI", 0x4, 0x3, 0x12,
+			BERLIN_PINCTRL_FUNCTION(0x0, "sm_spi2_sdi"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "sm_gpio12")),
+	BERLIN_PINCTRL_GROUP("SM_SPI2_SCLK", 0x4, 0x3, 0x15,
+			BERLIN_PINCTRL_FUNCTION(0x0, "sm_spi2_sclk"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "sm_gpio13")),
+	BERLIN_PINCTRL_GROUP("SM_FE_LED0", 0x4, 0x3, 0x18,
+			BERLIN_PINCTRL_FUNCTION(0x0, "sm_gpio14"),
+			BERLIN_PINCTRL_FUNCTION(0x2, "sm_fe_led0")),
+	BERLIN_PINCTRL_GROUP("SM_FE_LED1", 0x4, 0x3, 0x1b,
+			BERLIN_PINCTRL_FUNCTION(0x0, "sm_pwr_ok"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "sm_gpio15"),
+			BERLIN_PINCTRL_FUNCTION(0x2, "sm_fe_led1")),
+	BERLIN_PINCTRL_GROUP("SM_FE_LED2", 0x8, 0x3, 0x00,
+			BERLIN_PINCTRL_FUNCTION(0x0, "sm_gpio16"),
+			BERLIN_PINCTRL_FUNCTION(0x2, "sm_fe_led2")),
+	BERLIN_PINCTRL_GROUP("SM_HDMI_HPD", 0x8, 0x3, 0x03,
+			BERLIN_PINCTRL_FUNCTION(0x0, "sm_gpio17"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "sm_hdmi_hpd")),
+	BERLIN_PINCTRL_GROUP("SM_HDMI_CEC", 0x8, 0x3, 0x06,
+			BERLIN_PINCTRL_FUNCTION(0x0, "sm_gpio18"),
+			BERLIN_PINCTRL_FUNCTION(0x1, "sm_hdmi_cec")),
+};
+
+static const struct berlin_pinctrl_desc berlin4ct_soc_pinctrl_data = {
+	.groups = berlin4ct_soc_pinctrl_groups,
+	.ngroups = ARRAY_SIZE(berlin4ct_soc_pinctrl_groups),
+};
+
+static const struct berlin_pinctrl_desc berlin4ct_soc_aviopinctrl_data = {
+	.groups = berlin4ct_soc_aviopinctrl_groups,
+	.ngroups = ARRAY_SIZE(berlin4ct_soc_aviopinctrl_groups),
+};
+
+static const struct berlin_pinctrl_desc berlin4ct_sysmgr_pinctrl_data = {
+	.groups = berlin4ct_sysmgr_pinctrl_groups,
+	.ngroups = ARRAY_SIZE(berlin4ct_sysmgr_pinctrl_groups),
+};
+
+static const struct of_device_id berlin4ct_pinctrl_match[] = {
+	{
+		.compatible = "marvell,berlin4ct-soc-pinctrl",
+		.data = &berlin4ct_soc_pinctrl_data,
+	},
+	{
+		.compatible = "marvell,berlin4ct-avio-pinctrl",
+		.data = &berlin4ct_soc_aviopinctrl_data,
+	},
+	{
+		.compatible = "marvell,berlin4ct-sm-pinctrl",
+		.data = &berlin4ct_sysmgr_pinctrl_data,
+	},
+	{}
+};
+MODULE_DEVICE_TABLE(of, berlin4ct_pinctrl_match);
+
+static int berlin4ct_pinctrl_probe(struct platform_device *pdev)
+{
+	const struct of_device_id *match =
+		of_match_device(berlin4ct_pinctrl_match, &pdev->dev);
+	struct regmap_config *rmconfig;
+	struct regmap *regmap;
+	struct resource *res;
+	void __iomem *base;
+
+	rmconfig = devm_kzalloc(&pdev->dev, sizeof(*rmconfig), GFP_KERNEL);
+	if (!rmconfig)
+		return -ENOMEM;
+
+	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+	base = devm_ioremap_resource(&pdev->dev, res);
+	if (IS_ERR(base))
+		return PTR_ERR(base);
+
+	rmconfig->reg_bits = 32,
+	rmconfig->val_bits = 32,
+	rmconfig->reg_stride = 4,
+	rmconfig->max_register = resource_size(res);
+
+	regmap = devm_regmap_init_mmio(&pdev->dev, base, rmconfig);
+	if (IS_ERR(regmap))
+		return PTR_ERR(regmap);
+
+	return berlin_pinctrl_probe(pdev, regmap, match->data);
+}
+
+static struct platform_driver berlin4ct_pinctrl_driver = {
+	.probe	= berlin4ct_pinctrl_probe,
+	.driver	= {
+		.name = "berlin4ct-pinctrl",
+		.of_match_table = berlin4ct_pinctrl_match,
+	},
+};
+module_platform_driver(berlin4ct_pinctrl_driver);
+
+MODULE_AUTHOR("Jisheng Zhang <jszhang@marvell.com>");
+MODULE_DESCRIPTION("Marvell berlin4ct pinctrl driver");
+MODULE_LICENSE("GPL");
-- 
2.5.1


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

* [PATCH 3/5] arm64: berlin: add the pinctrl dependency for Marvell Berlin SoCs
  2015-09-19 10:02 [PATCH 0/5] arm64: berlin: add pinctrl support Jisheng Zhang
  2015-09-19 10:02 ` [PATCH 1/5] pinctrl: berlin: regmap as an extra argument of berlin_pinctrl_probe() Jisheng Zhang
  2015-09-19 10:02 ` [PATCH 2/5] pinctrl: berlin: add the berlin4ct pinctrl driver Jisheng Zhang
@ 2015-09-19 10:02 ` Jisheng Zhang
  2015-09-19 10:02 ` [PATCH 4/5] pinctrl: dt-binding: document berlin4ct SoC Jisheng Zhang
  2015-09-19 10:02 ` [PATCH 5/5] arm64: dts: berlin4ct: add the pinctrl node and muxing setup for uart0 Jisheng Zhang
  4 siblings, 0 replies; 10+ messages in thread
From: Jisheng Zhang @ 2015-09-19 10:02 UTC (permalink / raw)
  To: sebastian.hesselbarth, linus.walleij, antoine.tenart,
	catalin.marinas, will.deacon, mark.rutland, robh+dt, pawel.moll,
	ijc+devicetree, galak
  Cc: devicetree, linux-arm-kernel, linux-gpio, linux-kernel, Jisheng Zhang

This is to add the pinctrl dependency for Marvell Berlin SoCs.

Signed-off-by: Jisheng Zhang <jszhang@marvell.com>
---
 arch/arm64/Kconfig.platforms | 1 +
 1 file changed, 1 insertion(+)

diff --git a/arch/arm64/Kconfig.platforms b/arch/arm64/Kconfig.platforms
index c6e2c75..3d17ee2 100644
--- a/arch/arm64/Kconfig.platforms
+++ b/arch/arm64/Kconfig.platforms
@@ -9,6 +9,7 @@ config ARCH_BERLIN
 	bool "Marvell Berlin SoC Family"
 	select ARCH_REQUIRE_GPIOLIB
 	select DW_APB_ICTL
+	select PINCTRL
 	help
 	  This enables support for Marvell Berlin SoC Family
 
-- 
2.5.1


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

* [PATCH 4/5] pinctrl: dt-binding: document berlin4ct SoC
  2015-09-19 10:02 [PATCH 0/5] arm64: berlin: add pinctrl support Jisheng Zhang
                   ` (2 preceding siblings ...)
  2015-09-19 10:02 ` [PATCH 3/5] arm64: berlin: add the pinctrl dependency for Marvell Berlin SoCs Jisheng Zhang
@ 2015-09-19 10:02 ` Jisheng Zhang
  2015-09-19 10:02 ` [PATCH 5/5] arm64: dts: berlin4ct: add the pinctrl node and muxing setup for uart0 Jisheng Zhang
  4 siblings, 0 replies; 10+ messages in thread
From: Jisheng Zhang @ 2015-09-19 10:02 UTC (permalink / raw)
  To: sebastian.hesselbarth, linus.walleij, antoine.tenart,
	catalin.marinas, will.deacon, mark.rutland, robh+dt, pawel.moll,
	ijc+devicetree, galak
  Cc: devicetree, linux-arm-kernel, linux-gpio, linux-kernel, Jisheng Zhang

Add berlin4ct to existing berlin pinctrl device tree binding.

Signed-off-by: Jisheng Zhang <jszhang@marvell.com>
---
 Documentation/devicetree/bindings/pinctrl/berlin,pinctrl.txt | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/Documentation/devicetree/bindings/pinctrl/berlin,pinctrl.txt b/Documentation/devicetree/bindings/pinctrl/berlin,pinctrl.txt
index a8bb5e2..0580860 100644
--- a/Documentation/devicetree/bindings/pinctrl/berlin,pinctrl.txt
+++ b/Documentation/devicetree/bindings/pinctrl/berlin,pinctrl.txt
@@ -20,7 +20,10 @@ Required properties:
 	"marvell,berlin2cd-soc-pinctrl",
 	"marvell,berlin2cd-system-pinctrl",
 	"marvell,berlin2q-soc-pinctrl",
-	"marvell,berlin2q-system-pinctrl"
+	"marvell,berlin2q-system-pinctrl",
+	"marvell,berlin4ct-avio-pinctrl",
+	"marvell,berlin4ct-sm-pinctrl",
+	"marvell,berlin4ct-soc-pinctrl"
 
 Required subnode-properties:
 - groups: a list of strings describing the group names.
-- 
2.5.1


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

* [PATCH 5/5] arm64: dts: berlin4ct: add the pinctrl node and muxing setup for uart0
  2015-09-19 10:02 [PATCH 0/5] arm64: berlin: add pinctrl support Jisheng Zhang
                   ` (3 preceding siblings ...)
  2015-09-19 10:02 ` [PATCH 4/5] pinctrl: dt-binding: document berlin4ct SoC Jisheng Zhang
@ 2015-09-19 10:02 ` Jisheng Zhang
  2015-09-20 19:38   ` Sebastian Hesselbarth
  4 siblings, 1 reply; 10+ messages in thread
From: Jisheng Zhang @ 2015-09-19 10:02 UTC (permalink / raw)
  To: sebastian.hesselbarth, linus.walleij, antoine.tenart,
	catalin.marinas, will.deacon, mark.rutland, robh+dt, pawel.moll,
	ijc+devicetree, galak
  Cc: devicetree, linux-arm-kernel, linux-gpio, linux-kernel, Jisheng Zhang

Add the avio, soc, sm pinctrl nodes for Marvell berlin4ct SoC. This
patch also adds urt0 txd and rxd muxing setup in the dtsi because uart0
always use them to work, no other possibilities.

Signed-off-by: Jisheng Zhang <jszhang@marvell.com>
---
 arch/arm64/boot/dts/marvell/berlin4ct.dtsi | 27 +++++++++++++++++++++++++++
 1 file changed, 27 insertions(+)

diff --git a/arch/arm64/boot/dts/marvell/berlin4ct.dtsi b/arch/arm64/boot/dts/marvell/berlin4ct.dtsi
index a3b5f1d..4566e4e 100644
--- a/arch/arm64/boot/dts/marvell/berlin4ct.dtsi
+++ b/arch/arm64/boot/dts/marvell/berlin4ct.dtsi
@@ -225,6 +225,16 @@
 			};
 		};
 
+		soc_pinctrl: pinctrl@ea8000 {
+			compatible = "marvell,berlin4ct-soc-pinctrl";
+			reg = <0xea8000 0x14>;
+		};
+
+		avio_pinctrl: pinctrl@ea8400 {
+			compatible = "marvell,berlin4ct-avio-pinctrl";
+			reg = <0xea8400 8>;
+		};
+
 		apb@fc0000 {
 			compatible = "simple-bus";
 			#address-cells = <1>;
@@ -278,6 +288,23 @@
 				clocks = <&osc>;
 				reg-shift = <2>;
 				status = "disabled";
+				pinctrl-0 = <&urt0_txd_pmux>, <&urt0_rxd_pmux>;
+				pinctrl-names = "default", "default";
+			};
+		};
+
+		sm_pinctrl: pinctrl@fe2200 {
+			compatible = "marvell,berlin4ct-sm-pinctrl";
+			reg = <0xfe2200 0xc>;
+
+			urt0_txd_pmux: urt0_txd-pmux {
+				groups = "SM_URT0_TXD";
+				function = "sm_urt0_txd";
+			};
+
+			urt0_rxd_pmux: urt0_rxd-pmux {
+				groups = "SM_URT0_RXD";
+				function = "sm_urt0_rxd";
 			};
 		};
 	};
-- 
2.5.1


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

* Re: [PATCH 2/5] pinctrl: berlin: add the berlin4ct pinctrl driver
  2015-09-19 10:02 ` [PATCH 2/5] pinctrl: berlin: add the berlin4ct pinctrl driver Jisheng Zhang
@ 2015-09-20 19:32   ` Sebastian Hesselbarth
  2015-09-21  7:27     ` Jisheng Zhang
  2015-09-21 12:06     ` Jisheng Zhang
  0 siblings, 2 replies; 10+ messages in thread
From: Sebastian Hesselbarth @ 2015-09-20 19:32 UTC (permalink / raw)
  To: Jisheng Zhang, linus.walleij, antoine.tenart, catalin.marinas,
	will.deacon, mark.rutland, robh+dt, pawel.moll, ijc+devicetree,
	galak
  Cc: devicetree, linux-arm-kernel, linux-gpio, linux-kernel

On 19.09.2015 12:02, Jisheng Zhang wrote:
> Add the pin-controller driver for Marvell Berlin BG4CT SoC, with definition
> of its groups and functions. This uses the core Berlin pinctrl driver.
>
> Signed-off-by: Jisheng Zhang <jszhang@marvell.com>
> ---
[...]
> diff --git a/drivers/pinctrl/berlin/berlin4ct.c b/drivers/pinctrl/berlin/berlin4ct.c
> new file mode 100644
> index 0000000..2960e16
> --- /dev/null
> +++ b/drivers/pinctrl/berlin/berlin4ct.c
> @@ -0,0 +1,503 @@
> +/*
> + * Marvell berlin4ct pinctrl driver
[...]
> +static const struct berlin_desc_group berlin4ct_soc_pinctrl_groups[] = {
> +	BERLIN_PINCTRL_GROUP("EMMC_RSTn", 0x0, 0x3, 0x00,
> +			BERLIN_PINCTRL_FUNCTION(0x0, "emmc_rstn"),
> +			BERLIN_PINCTRL_FUNCTION(0x1, "gpio47")),

Jisheng,

I am fine with naming the groups after the 0x0 function but
the functions themselves should be named after a generic
name, e.g. "emmc" instead of "emmc_rstn".

That will allow to add pinmux nodes like

uart_pmx {
	groups = "SM_UART0_TXD", "SM_UART0_RXD";
	function = "uart0";
};

instead of two separate nodes like in patch 5/5.

You should however keep the actual pin function e.g. in a comment
after the function define above:

BERLIN_PINCTRL_GROUP("EMMC_RSTn", 0x0, 0x3, 0x00,
	BERLIN_PINCTRL_FUNCTION(0x0, "emmc"),	/* RESETn */
	BERLIN_PINCTRL_FUNCTION(0x1, "gpio")),	/* GPIO47 */

> +	BERLIN_PINCTRL_GROUP("NAND_IO0", 0x0, 0x3, 0x03,
> +			BERLIN_PINCTRL_FUNCTION(0x0, "nand_io0"),
> +			BERLIN_PINCTRL_FUNCTION(0x1, "rgmii_rxd0"),
> +			BERLIN_PINCTRL_FUNCTION(0x2, "sd1_clk"),
> +			BERLIN_PINCTRL_FUNCTION(0x3, "gpio0")),
[...]
> +	BERLIN_PINCTRL_GROUP("SD0_CLK", 0x4, 0x3, 0x12,
> +			BERLIN_PINCTRL_FUNCTION(0x0, "gpio29"),
> +			BERLIN_PINCTRL_FUNCTION(0x1, "sd0_clk"),
> +			BERLIN_PINCTRL_FUNCTION(0x2, "sts4_clk"),

Please find a better name for "sts" whatever it is for.

> +			BERLIN_PINCTRL_FUNCTION(0x5, "v4g_dbg8"),

ditto for "v4g"

> +			BERLIN_PINCTRL_FUNCTION(0x7, "phy_dbg8")),
[...]
> +	BERLIN_PINCTRL_GROUP("SCRD0_RST", 0xc, 0x3, 0x06,
> +			BERLIN_PINCTRL_FUNCTION(0x0, "gpio15"),
> +			BERLIN_PINCTRL_FUNCTION(0x1, "scrd0_rst"),

ditto for "scrd0"

> +			BERLIN_PINCTRL_FUNCTION(0x3, "sd1a_clk")),
> +	BERLIN_PINCTRL_GROUP("SCRD0_DCLK", 0xc, 0x3, 0x09,
> +			BERLIN_PINCTRL_FUNCTION(0x0, "gpio16"),
> +			BERLIN_PINCTRL_FUNCTION(0x1, "scrd0_dclk"),
> +			BERLIN_PINCTRL_FUNCTION(0x3, "sd1a_cmd")),

What is the "a" for in "sd1a" ? There is a "sd1b" below so I
guess that there is two pinmux groups that mux sd1?

> +	BERLIN_PINCTRL_GROUP("SCRD0_GPIO0", 0xc, 0x3, 0x0c,
> +			BERLIN_PINCTRL_FUNCTION(0x0, "gpio17"),
> +			BERLIN_PINCTRL_FUNCTION(0x1, "scrd0_gpio0"),
> +			BERLIN_PINCTRL_FUNCTION(0x2, "sif_dio"),

What kind of interface is "sif" ?

> +			BERLIN_PINCTRL_FUNCTION(0x3, "sd1a_dat0")),
[...]
> +static const struct berlin_desc_group berlin4ct_soc_aviopinctrl_groups[] = {
> +	BERLIN_PINCTRL_GROUP("TX_EDDC_SCL", 0x0, 0x3, 0x00,
> +			BERLIN_PINCTRL_FUNCTION(0x0, "avio_gpio0"),
> +			BERLIN_PINCTRL_FUNCTION(0x1, "tx_eddc_scl"),
> +			BERLIN_PINCTRL_FUNCTION(0x2, "tw1_scl")),
> +	BERLIN_PINCTRL_GROUP("TX_EDDC_SDA", 0x0, 0x3, 0x03,
> +			BERLIN_PINCTRL_FUNCTION(0x0, "avio_gpio1"),
> +			BERLIN_PINCTRL_FUNCTION(0x1, "tx_eddc_sda"),
> +			BERLIN_PINCTRL_FUNCTION(0x2, "tw1_sda")),
> +	BERLIN_PINCTRL_GROUP("I2S1_LRCKO", 0x0, 0x3, 0x06,
> +			BERLIN_PINCTRL_FUNCTION(0x0, "avio_gpio2"),
> +			BERLIN_PINCTRL_FUNCTION(0x1, "i2s1_lrcko"),
> +			BERLIN_PINCTRL_FUNCTION(0x3, "sts6_clk"),
> +			BERLIN_PINCTRL_FUNCTION(0x4, "adac_dbg0"),
> +			BERLIN_PINCTRL_FUNCTION(0x6, "sd1b_clk"),
> +			BERLIN_PINCTRL_FUNCTION(0x7, "avio_dbg0")),
[...]
> +static const struct berlin_desc_group berlin4ct_sysmgr_pinctrl_groups[] = {
> +	BERLIN_PINCTRL_GROUP("SM_TW2_SCL", 0x0, 0x3, 0x00,
> +			BERLIN_PINCTRL_FUNCTION(0x0, "sm_gpio19"),
> +			BERLIN_PINCTRL_FUNCTION(0x1, "sm_tw2_scl")),

I'd say, remove the "sm_" prefix for all of the SM functions if
there is no collusion with any of the other functions.

> +	BERLIN_PINCTRL_GROUP("SM_TW2_SDA", 0x0, 0x3, 0x03,
> +			BERLIN_PINCTRL_FUNCTION(0x0, "sm_gpio20"),
> +			BERLIN_PINCTRL_FUNCTION(0x1, "sm_tw2_sda")),
> +	BERLIN_PINCTRL_GROUP("SM_TW3_SCL", 0x0, 0x3, 0x06,
> +			BERLIN_PINCTRL_FUNCTION(0x0, "sm_gpio21"),
> +			BERLIN_PINCTRL_FUNCTION(0x1, "sm_tw3_scl")),
> +	BERLIN_PINCTRL_GROUP("SM_TW3_SDA", 0x0, 0x3, 0x09,
> +			BERLIN_PINCTRL_FUNCTION(0x0, "sm_gpio22"),
> +			BERLIN_PINCTRL_FUNCTION(0x1, "sm_tw3_sda")),
> +	BERLIN_PINCTRL_GROUP("SM_TMS", 0x0, 0x3, 0x0c,
> +			BERLIN_PINCTRL_FUNCTION(0x0, "sm_tms"),

Please use function "jtag" instead.

> +			BERLIN_PINCTRL_FUNCTION(0x1, "sm_gpio0"),
> +			BERLIN_PINCTRL_FUNCTION(0x2, "pwm0")),
> +	BERLIN_PINCTRL_GROUP("SM_TDI", 0x0, 0x3, 0x0f,
> +			BERLIN_PINCTRL_FUNCTION(0x0, "sm_tdi"),
> +			BERLIN_PINCTRL_FUNCTION(0x1, "sm_gpio1"),
> +			BERLIN_PINCTRL_FUNCTION(0x2, "pwm1")),
> +	BERLIN_PINCTRL_GROUP("SM_TDO", 0x0, 0x3, 0x12,
> +			BERLIN_PINCTRL_FUNCTION(0x0, "sm_tdo"),
> +			BERLIN_PINCTRL_FUNCTION(0x1, "sm_gpio2")),
> +	BERLIN_PINCTRL_GROUP("SM_URT0_TXD", 0x0, 0x3, 0x15,
> +			BERLIN_PINCTRL_FUNCTION(0x0, "sm_urt0_txd"),

Please avoid abbreviating acronyms even more, we can afford the
few extra bytes.

[...]
> +	BERLIN_PINCTRL_GROUP("SM_URT1_TXD", 0x0, 0x3, 0x1b,
> +			BERLIN_PINCTRL_FUNCTION(0x0, "sm_gpio5"),
> +			BERLIN_PINCTRL_FUNCTION(0x1, "sm_urt1_txd"),
> +			BERLIN_PINCTRL_FUNCTION(0x2, "eth1_rxclk"),
> +			BERLIN_PINCTRL_FUNCTION(0x3, "pwm2"),
> +			BERLIN_PINCTRL_FUNCTION(0x4, "sm_timer0"),
> +			BERLIN_PINCTRL_FUNCTION(0x5, "clk_25m")),

"clko" ?

Sebastian

[...]
> +static int berlin4ct_pinctrl_probe(struct platform_device *pdev)
> +{
> +	const struct of_device_id *match =
> +		of_match_device(berlin4ct_pinctrl_match, &pdev->dev);
> +	struct regmap_config *rmconfig;
> +	struct regmap *regmap;
> +	struct resource *res;
> +	void __iomem *base;
> +
> +	rmconfig = devm_kzalloc(&pdev->dev, sizeof(*rmconfig), GFP_KERNEL);
> +	if (!rmconfig)
> +		return -ENOMEM;
> +
> +	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> +	base = devm_ioremap_resource(&pdev->dev, res);
> +	if (IS_ERR(base))
> +		return PTR_ERR(base);
> +
> +	rmconfig->reg_bits = 32,
> +	rmconfig->val_bits = 32,
> +	rmconfig->reg_stride = 4,
> +	rmconfig->max_register = resource_size(res);
> +
> +	regmap = devm_regmap_init_mmio(&pdev->dev, base, rmconfig);
> +	if (IS_ERR(regmap))
> +		return PTR_ERR(regmap);
> +
> +	return berlin_pinctrl_probe(pdev, regmap, match->data);
> +}
> +
> +static struct platform_driver berlin4ct_pinctrl_driver = {
> +	.probe	= berlin4ct_pinctrl_probe,
> +	.driver	= {
> +		.name = "berlin4ct-pinctrl",
> +		.of_match_table = berlin4ct_pinctrl_match,
> +	},
> +};
> +module_platform_driver(berlin4ct_pinctrl_driver);
> +
> +MODULE_AUTHOR("Jisheng Zhang <jszhang@marvell.com>");
> +MODULE_DESCRIPTION("Marvell berlin4ct pinctrl driver");
> +MODULE_LICENSE("GPL");
>


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

* Re: [PATCH 5/5] arm64: dts: berlin4ct: add the pinctrl node and muxing setup for uart0
  2015-09-19 10:02 ` [PATCH 5/5] arm64: dts: berlin4ct: add the pinctrl node and muxing setup for uart0 Jisheng Zhang
@ 2015-09-20 19:38   ` Sebastian Hesselbarth
  0 siblings, 0 replies; 10+ messages in thread
From: Sebastian Hesselbarth @ 2015-09-20 19:38 UTC (permalink / raw)
  To: Jisheng Zhang, linus.walleij, antoine.tenart, catalin.marinas,
	will.deacon, mark.rutland, robh+dt, pawel.moll, ijc+devicetree,
	galak
  Cc: devicetree, linux-arm-kernel, linux-gpio, linux-kernel

On 19.09.2015 12:02, Jisheng Zhang wrote:
> Add the avio, soc, sm pinctrl nodes for Marvell berlin4ct SoC. This
> patch also adds urt0 txd and rxd muxing setup in the dtsi because uart0
> always use them to work, no other possibilities.

Please split the patch into two:
one adding the pinctrl nodes and
one adding the default pinmux to uart0 node.

> Signed-off-by: Jisheng Zhang <jszhang@marvell.com>
> ---
>   arch/arm64/boot/dts/marvell/berlin4ct.dtsi | 27 +++++++++++++++++++++++++++
>   1 file changed, 27 insertions(+)
>
> diff --git a/arch/arm64/boot/dts/marvell/berlin4ct.dtsi b/arch/arm64/boot/dts/marvell/berlin4ct.dtsi
> index a3b5f1d..4566e4e 100644
> --- a/arch/arm64/boot/dts/marvell/berlin4ct.dtsi
> +++ b/arch/arm64/boot/dts/marvell/berlin4ct.dtsi
> @@ -225,6 +225,16 @@
>   			};
>   		};
>
> +		soc_pinctrl: pinctrl@ea8000 {
> +			compatible = "marvell,berlin4ct-soc-pinctrl";
> +			reg = <0xea8000 0x14>;
> +		};
> +
> +		avio_pinctrl: pinctrl@ea8400 {
> +			compatible = "marvell,berlin4ct-avio-pinctrl";
> +			reg = <0xea8400 8>;

s/8/0x8/

> +		};
> +
>   		apb@fc0000 {
>   			compatible = "simple-bus";
>   			#address-cells = <1>;
> @@ -278,6 +288,23 @@
>   				clocks = <&osc>;
>   				reg-shift = <2>;
>   				status = "disabled";
> +				pinctrl-0 = <&urt0_txd_pmux>, <&urt0_rxd_pmux>;
> +				pinctrl-names = "default", "default";

pinctrl-names = "default", "default"; refers to pinctrl-0 and pinctrl-1
respectively. There is no pinctrl-1, so please remove the second
pinctrl-names element.

> +			};
> +		};
> +
> +		sm_pinctrl: pinctrl@fe2200 {
> +			compatible = "marvell,berlin4ct-sm-pinctrl";
> +			reg = <0xfe2200 0xc>;
> +
> +			urt0_txd_pmux: urt0_txd-pmux {
> +				groups = "SM_URT0_TXD";
> +				function = "sm_urt0_txd";
> +			};
> +
> +			urt0_rxd_pmux: urt0_rxd-pmux {
> +				groups = "SM_URT0_RXD";
> +				function = "sm_urt0_rxd";

If you change the driver to generic function names ("uart0") this
boils down to a single

uart0_pmux: uart0-pmux {
	groups = "SM_UART0_TXD", "SM_UART0_RXD";
	function = "uart0";
};

pinmux node and the reference in uart0 node to

pinctrl-0 = <&uart0_pmux>;
pinctrl-names = "default";

Sebastian

>   			};
>   		};
>   	};
>


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

* Re: [PATCH 2/5] pinctrl: berlin: add the berlin4ct pinctrl driver
  2015-09-20 19:32   ` Sebastian Hesselbarth
@ 2015-09-21  7:27     ` Jisheng Zhang
  2015-09-21 12:06     ` Jisheng Zhang
  1 sibling, 0 replies; 10+ messages in thread
From: Jisheng Zhang @ 2015-09-21  7:27 UTC (permalink / raw)
  To: Sebastian Hesselbarth
  Cc: linus.walleij, antoine.tenart, catalin.marinas, will.deacon,
	mark.rutland, robh+dt, pawel.moll, ijc+devicetree, galak,
	devicetree, linux-arm-kernel, linux-gpio, linux-kernel

Dear Sebastian,

On Sun, 20 Sep 2015 21:32:37 +0200
Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com> wrote:

> On 19.09.2015 12:02, Jisheng Zhang wrote:
> > Add the pin-controller driver for Marvell Berlin BG4CT SoC, with definition
> > of its groups and functions. This uses the core Berlin pinctrl driver.
> >
> > Signed-off-by: Jisheng Zhang <jszhang@marvell.com>
> > ---
> [...]
> > diff --git a/drivers/pinctrl/berlin/berlin4ct.c b/drivers/pinctrl/berlin/berlin4ct.c
> > new file mode 100644
> > index 0000000..2960e16
> > --- /dev/null
> > +++ b/drivers/pinctrl/berlin/berlin4ct.c
> > @@ -0,0 +1,503 @@
> > +/*
> > + * Marvell berlin4ct pinctrl driver
> [...]
> > +static const struct berlin_desc_group berlin4ct_soc_pinctrl_groups[] = {
> > +	BERLIN_PINCTRL_GROUP("EMMC_RSTn", 0x0, 0x3, 0x00,
> > +			BERLIN_PINCTRL_FUNCTION(0x0, "emmc_rstn"),
> > +			BERLIN_PINCTRL_FUNCTION(0x1, "gpio47")),
> 
> Jisheng,
> 
> I am fine with naming the groups after the 0x0 function but
> the functions themselves should be named after a generic
> name, e.g. "emmc" instead of "emmc_rstn".

This seems better. Will change in newer version.

> 
> That will allow to add pinmux nodes like
> 
> uart_pmx {
> 	groups = "SM_UART0_TXD", "SM_UART0_RXD";
> 	function = "uart0";
> };
> 
> instead of two separate nodes like in patch 5/5.
> 
> You should however keep the actual pin function e.g. in a comment
> after the function define above:
> 
> BERLIN_PINCTRL_GROUP("EMMC_RSTn", 0x0, 0x3, 0x00,
> 	BERLIN_PINCTRL_FUNCTION(0x0, "emmc"),	/* RESETn */
> 	BERLIN_PINCTRL_FUNCTION(0x1, "gpio")),	/* GPIO47 */
> 
> > +	BERLIN_PINCTRL_GROUP("NAND_IO0", 0x0, 0x3, 0x03,
> > +			BERLIN_PINCTRL_FUNCTION(0x0, "nand_io0"),
> > +			BERLIN_PINCTRL_FUNCTION(0x1, "rgmii_rxd0"),
> > +			BERLIN_PINCTRL_FUNCTION(0x2, "sd1_clk"),
> > +			BERLIN_PINCTRL_FUNCTION(0x3, "gpio0")),
> [...]
> > +	BERLIN_PINCTRL_GROUP("SD0_CLK", 0x4, 0x3, 0x12,
> > +			BERLIN_PINCTRL_FUNCTION(0x0, "gpio29"),
> > +			BERLIN_PINCTRL_FUNCTION(0x1, "sd0_clk"),
> > +			BERLIN_PINCTRL_FUNCTION(0x2, "sts4_clk"),
> 
> Please find a better name for "sts" whatever it is for.

sts is one kind of HW component, and that's what we called it.

> 
> > +			BERLIN_PINCTRL_FUNCTION(0x5, "v4g_dbg8"),
> 
> ditto for "v4g"

v4g is another kind of HW component which is called as "v4g"

> 
> > +			BERLIN_PINCTRL_FUNCTION(0x7, "phy_dbg8")),
> [...]
> > +	BERLIN_PINCTRL_GROUP("SCRD0_RST", 0xc, 0x3, 0x06,
> > +			BERLIN_PINCTRL_FUNCTION(0x0, "gpio15"),
> > +			BERLIN_PINCTRL_FUNCTION(0x1, "scrd0_rst"),
> 
> ditto for "scrd0"

scrd stands for smartcard. But it's what HW/ASIC call them

> 
> > +			BERLIN_PINCTRL_FUNCTION(0x3, "sd1a_clk")),
> > +	BERLIN_PINCTRL_GROUP("SCRD0_DCLK", 0xc, 0x3, 0x09,
> > +			BERLIN_PINCTRL_FUNCTION(0x0, "gpio16"),
> > +			BERLIN_PINCTRL_FUNCTION(0x1, "scrd0_dclk"),
> > +			BERLIN_PINCTRL_FUNCTION(0x3, "sd1a_cmd")),
> 
> What is the "a" for in "sd1a" ? There is a "sd1b" below so I
> guess that there is two pinmux groups that mux sd1?

Yes, correct.

> 
> > +	BERLIN_PINCTRL_GROUP("SCRD0_GPIO0", 0xc, 0x3, 0x0c,
> > +			BERLIN_PINCTRL_FUNCTION(0x0, "gpio17"),
> > +			BERLIN_PINCTRL_FUNCTION(0x1, "scrd0_gpio0"),
> > +			BERLIN_PINCTRL_FUNCTION(0x2, "sif_dio"),
> 
> What kind of interface is "sif" ?

serial interface, ASIC called it as SIF

> 
> > +			BERLIN_PINCTRL_FUNCTION(0x3, "sd1a_dat0")),
> [...]
> > +static const struct berlin_desc_group berlin4ct_soc_aviopinctrl_groups[] = {
> > +	BERLIN_PINCTRL_GROUP("TX_EDDC_SCL", 0x0, 0x3, 0x00,
> > +			BERLIN_PINCTRL_FUNCTION(0x0, "avio_gpio0"),
> > +			BERLIN_PINCTRL_FUNCTION(0x1, "tx_eddc_scl"),
> > +			BERLIN_PINCTRL_FUNCTION(0x2, "tw1_scl")),
> > +	BERLIN_PINCTRL_GROUP("TX_EDDC_SDA", 0x0, 0x3, 0x03,
> > +			BERLIN_PINCTRL_FUNCTION(0x0, "avio_gpio1"),
> > +			BERLIN_PINCTRL_FUNCTION(0x1, "tx_eddc_sda"),
> > +			BERLIN_PINCTRL_FUNCTION(0x2, "tw1_sda")),
> > +	BERLIN_PINCTRL_GROUP("I2S1_LRCKO", 0x0, 0x3, 0x06,
> > +			BERLIN_PINCTRL_FUNCTION(0x0, "avio_gpio2"),
> > +			BERLIN_PINCTRL_FUNCTION(0x1, "i2s1_lrcko"),
> > +			BERLIN_PINCTRL_FUNCTION(0x3, "sts6_clk"),
> > +			BERLIN_PINCTRL_FUNCTION(0x4, "adac_dbg0"),
> > +			BERLIN_PINCTRL_FUNCTION(0x6, "sd1b_clk"),
> > +			BERLIN_PINCTRL_FUNCTION(0x7, "avio_dbg0")),
> [...]
> > +static const struct berlin_desc_group berlin4ct_sysmgr_pinctrl_groups[] = {
> > +	BERLIN_PINCTRL_GROUP("SM_TW2_SCL", 0x0, 0x3, 0x00,
> > +			BERLIN_PINCTRL_FUNCTION(0x0, "sm_gpio19"),
> > +			BERLIN_PINCTRL_FUNCTION(0x1, "sm_tw2_scl")),
> 
> I'd say, remove the "sm_" prefix for all of the SM functions if
> there is no collusion with any of the other functions.

Could I keep "sm_" prefix for SM GPIOs?

> 
> > +	BERLIN_PINCTRL_GROUP("SM_TW2_SDA", 0x0, 0x3, 0x03,
> > +			BERLIN_PINCTRL_FUNCTION(0x0, "sm_gpio20"),
> > +			BERLIN_PINCTRL_FUNCTION(0x1, "sm_tw2_sda")),
> > +	BERLIN_PINCTRL_GROUP("SM_TW3_SCL", 0x0, 0x3, 0x06,
> > +			BERLIN_PINCTRL_FUNCTION(0x0, "sm_gpio21"),
> > +			BERLIN_PINCTRL_FUNCTION(0x1, "sm_tw3_scl")),
> > +	BERLIN_PINCTRL_GROUP("SM_TW3_SDA", 0x0, 0x3, 0x09,
> > +			BERLIN_PINCTRL_FUNCTION(0x0, "sm_gpio22"),
> > +			BERLIN_PINCTRL_FUNCTION(0x1, "sm_tw3_sda")),
> > +	BERLIN_PINCTRL_GROUP("SM_TMS", 0x0, 0x3, 0x0c,
> > +			BERLIN_PINCTRL_FUNCTION(0x0, "sm_tms"),
> 
> Please use function "jtag" instead.

OK. So I also need to name "jtag" in below sm_tdi, sm_sdo, right?

> 
> > +			BERLIN_PINCTRL_FUNCTION(0x1, "sm_gpio0"),
> > +			BERLIN_PINCTRL_FUNCTION(0x2, "pwm0")),
> > +	BERLIN_PINCTRL_GROUP("SM_TDI", 0x0, 0x3, 0x0f,
> > +			BERLIN_PINCTRL_FUNCTION(0x0, "sm_tdi"),
> > +			BERLIN_PINCTRL_FUNCTION(0x1, "sm_gpio1"),
> > +			BERLIN_PINCTRL_FUNCTION(0x2, "pwm1")),
> > +	BERLIN_PINCTRL_GROUP("SM_TDO", 0x0, 0x3, 0x12,
> > +			BERLIN_PINCTRL_FUNCTION(0x0, "sm_tdo"),
> > +			BERLIN_PINCTRL_FUNCTION(0x1, "sm_gpio2")),
> > +	BERLIN_PINCTRL_GROUP("SM_URT0_TXD", 0x0, 0x3, 0x15,
> > +			BERLIN_PINCTRL_FUNCTION(0x0, "sm_urt0_txd"),
> 
> Please avoid abbreviating acronyms even more, we can afford the
> few extra bytes.
> 
> [...]
> > +	BERLIN_PINCTRL_GROUP("SM_URT1_TXD", 0x0, 0x3, 0x1b,
> > +			BERLIN_PINCTRL_FUNCTION(0x0, "sm_gpio5"),
> > +			BERLIN_PINCTRL_FUNCTION(0x1, "sm_urt1_txd"),
> > +			BERLIN_PINCTRL_FUNCTION(0x2, "eth1_rxclk"),
> > +			BERLIN_PINCTRL_FUNCTION(0x3, "pwm2"),
> > +			BERLIN_PINCTRL_FUNCTION(0x4, "sm_timer0"),
> > +			BERLIN_PINCTRL_FUNCTION(0x5, "clk_25m")),
> 
> "clko" ?

This is for 25m clk output. but ASIC calls this clk_25m, there's no "o".

> 
> Sebastian
> 
> [...]
> > +static int berlin4ct_pinctrl_probe(struct platform_device *pdev)
> > +{
> > +	const struct of_device_id *match =
> > +		of_match_device(berlin4ct_pinctrl_match, &pdev->dev);
> > +	struct regmap_config *rmconfig;
> > +	struct regmap *regmap;
> > +	struct resource *res;
> > +	void __iomem *base;
> > +
> > +	rmconfig = devm_kzalloc(&pdev->dev, sizeof(*rmconfig), GFP_KERNEL);
> > +	if (!rmconfig)
> > +		return -ENOMEM;
> > +
> > +	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> > +	base = devm_ioremap_resource(&pdev->dev, res);
> > +	if (IS_ERR(base))
> > +		return PTR_ERR(base);
> > +
> > +	rmconfig->reg_bits = 32,
> > +	rmconfig->val_bits = 32,
> > +	rmconfig->reg_stride = 4,
> > +	rmconfig->max_register = resource_size(res);
> > +
> > +	regmap = devm_regmap_init_mmio(&pdev->dev, base, rmconfig);
> > +	if (IS_ERR(regmap))
> > +		return PTR_ERR(regmap);
> > +
> > +	return berlin_pinctrl_probe(pdev, regmap, match->data);
> > +}
> > +
> > +static struct platform_driver berlin4ct_pinctrl_driver = {
> > +	.probe	= berlin4ct_pinctrl_probe,
> > +	.driver	= {
> > +		.name = "berlin4ct-pinctrl",
> > +		.of_match_table = berlin4ct_pinctrl_match,
> > +	},
> > +};
> > +module_platform_driver(berlin4ct_pinctrl_driver);
> > +
> > +MODULE_AUTHOR("Jisheng Zhang <jszhang@marvell.com>");
> > +MODULE_DESCRIPTION("Marvell berlin4ct pinctrl driver");
> > +MODULE_LICENSE("GPL");
> >
> 


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

* Re: [PATCH 2/5] pinctrl: berlin: add the berlin4ct pinctrl driver
  2015-09-20 19:32   ` Sebastian Hesselbarth
  2015-09-21  7:27     ` Jisheng Zhang
@ 2015-09-21 12:06     ` Jisheng Zhang
  1 sibling, 0 replies; 10+ messages in thread
From: Jisheng Zhang @ 2015-09-21 12:06 UTC (permalink / raw)
  To: Sebastian Hesselbarth
  Cc: linus.walleij, antoine.tenart, catalin.marinas, will.deacon,
	mark.rutland, robh+dt, pawel.moll, ijc+devicetree, galak,
	devicetree, linux-arm-kernel, linux-gpio, linux-kernel

Dear Sebastian,

On Sun, 20 Sep 2015 21:32:37 +0200
Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com> wrote:

> > +	BERLIN_PINCTRL_GROUP("SM_TDO", 0x0, 0x3, 0x12,
> > +			BERLIN_PINCTRL_FUNCTION(0x0, "sm_tdo"),
> > +			BERLIN_PINCTRL_FUNCTION(0x1, "sm_gpio2")),
> > +	BERLIN_PINCTRL_GROUP("SM_URT0_TXD", 0x0, 0x3, 0x15,
> > +			BERLIN_PINCTRL_FUNCTION(0x0, "sm_urt0_txd"),  
> 
> Please avoid abbreviating acronyms even more, we can afford the
> few extra bytes.

In the 2nd version, I kept using HW names, for example:

1. "urt0" as the function name,

2. "SM_URT0_TXD" as the pin name (group name)

to keep sync with HW, especially the pin names are the same as HW's, because
that's what HW doc, sch, etc. call them. IMHO, using a different name with HW
is not a good idea, what do you think?

Thanks,
Jisheng

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

end of thread, other threads:[~2015-09-21 12:10 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-09-19 10:02 [PATCH 0/5] arm64: berlin: add pinctrl support Jisheng Zhang
2015-09-19 10:02 ` [PATCH 1/5] pinctrl: berlin: regmap as an extra argument of berlin_pinctrl_probe() Jisheng Zhang
2015-09-19 10:02 ` [PATCH 2/5] pinctrl: berlin: add the berlin4ct pinctrl driver Jisheng Zhang
2015-09-20 19:32   ` Sebastian Hesselbarth
2015-09-21  7:27     ` Jisheng Zhang
2015-09-21 12:06     ` Jisheng Zhang
2015-09-19 10:02 ` [PATCH 3/5] arm64: berlin: add the pinctrl dependency for Marvell Berlin SoCs Jisheng Zhang
2015-09-19 10:02 ` [PATCH 4/5] pinctrl: dt-binding: document berlin4ct SoC Jisheng Zhang
2015-09-19 10:02 ` [PATCH 5/5] arm64: dts: berlin4ct: add the pinctrl node and muxing setup for uart0 Jisheng Zhang
2015-09-20 19:38   ` Sebastian Hesselbarth

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).