All of lore.kernel.org
 help / color / mirror / Atom feed
From: Geert Uytterhoeven <geert+renesas@glider.be>
To: Linus Walleij <linus.walleij@linaro.org>,
	Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>,
	Chris Paterson <Chris.Paterson2@renesas.com>,
	Biju Das <biju.das@bp.renesas.com>
Cc: linux-renesas-soc@vger.kernel.org, linux-gpio@vger.kernel.org,
	linux-kernel@vger.kernel.org,
	Geert Uytterhoeven <geert+renesas@glider.be>
Subject: [PATCH/RFT] pinctrl: renesas: rzv2m: Handle non-unique subnode names
Date: Mon,  3 Jul 2023 17:07:06 +0200	[thread overview]
Message-ID: <607bd6ab4905b0b1b119a06ef953fa1184505777.1688396717.git.geert+renesas@glider.be> (raw)

The eMMC and SDHI pin control configuration nodes in DT have subnodes
with the same names ("data" and "ctrl").  As the RZ/V2M pin control
driver considers only the names of the subnodes, this leads to
conflicts:

    pinctrl-rzv2m b6250000.pinctrl: pin P8_2 already requested by 85000000.mmc; cannot claim for 85020000.mmc
    pinctrl-rzv2m b6250000.pinctrl: pin-130 (85020000.mmc) status -22
    renesas_sdhi_internal_dmac 85020000.mmc: Error applying setting, reverse things back

Fix this by constructing unique names from the node names of both the
pin control configuration node and its child node, where appropriate.

Reported by: Fabrizio Castro <fabrizio.castro.jz@renesas.com>
Fixes: 92a9b825257614af ("pinctrl: renesas: Add RZ/V2M pin and gpio controller driver")
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
---
Untested on real hardware.
The RZ/G2L pin control drivers needs a similar fix.

Before:

    $ cat /sys/kernel/debug/pinctrl/b6250000.pinctrl/pingroups
    registered pin groups:
    group: data
    pin 130 (P8_2)
    pin 131 (P8_3)
    pin 132 (P8_4)
    pin 133 (P8_5)

    group: ctrl
    pin 128 (P8_0)
    pin 129 (P8_1)

    group: cd
    pin 135 (P8_7)

    $ cat /sys/kernel/debug/pinctrl/b6250000.pinctrl/pinmux-functions
    function 0: data, groups = [ data ]
    function 1: ctrl, groups = [ ctrl ]
    function 2: cd, groups = [ cd ]

After:

    $ cat /sys/kernel/debug/pinctrl/b6250000.pinctrl/pingroups
    registered pin groups:
    group: sd0.data
    pin 130 (P8_2)
    pin 131 (P8_3)
    pin 132 (P8_4)
    pin 133 (P8_5)

    group: emmc.data
    pin 0 (P0_0)
    pin 1 (P0_1)
    pin 2 (P0_2)
    pin 3 (P0_3)
    pin 4 (P0_4)
    pin 5 (P0_5)
    pin 6 (P0_6)
    pin 7 (P0_7)

    group: sd0.ctrl
    pin 128 (P8_0)
    pin 129 (P8_1)

    group: emmc.ctrl
    pin 10 (P0_10)
    pin 11 (P0_11)

    group: sd0.cd
    pin 135 (P8_7)

    group: sd0-uhs.data
    pin 130 (P8_2)
    pin 131 (P8_3)
    pin 132 (P8_4)
    pin 133 (P8_5)

    group: sd0-uhs.ctrl
    pin 128 (P8_0)
    pin 129 (P8_1)

    group: sd0-uhs.cd
    pin 135 (P8_7)

    $ cat /sys/kernel/debug/pinctrl/b6250000.pinctrl/pinmux-functions
    function 0: sd0.data, groups = [ sd0.data ]
    function 1: emmc.data, groups = [ emmc.data ]
    function 2: sd0.ctrl, groups = [ sd0.ctrl ]
    function 3: sd0.cd, groups = [ sd0.cd ]
    function 4: emmc.ctrl, groups = [ emmc.ctrl ]
    function 5: sd0-uhs.data, groups = [ sd0-uhs.data ]
    function 6: sd0-uhs.ctrl, groups = [ sd0-uhs.ctrl ]
    function 7: sd0-uhs.cd, groups = [ sd0-uhs.cd ]
---
 drivers/pinctrl/renesas/pinctrl-rzv2m.c | 28 ++++++++++++++++++-------
 1 file changed, 20 insertions(+), 8 deletions(-)

diff --git a/drivers/pinctrl/renesas/pinctrl-rzv2m.c b/drivers/pinctrl/renesas/pinctrl-rzv2m.c
index e5472293bc7fb247..35b23c1a5684d3e4 100644
--- a/drivers/pinctrl/renesas/pinctrl-rzv2m.c
+++ b/drivers/pinctrl/renesas/pinctrl-rzv2m.c
@@ -209,6 +209,7 @@ static int rzv2m_map_add_config(struct pinctrl_map *map,
 
 static int rzv2m_dt_subnode_to_map(struct pinctrl_dev *pctldev,
 				   struct device_node *np,
+				   struct device_node *parent,
 				   struct pinctrl_map **map,
 				   unsigned int *num_maps,
 				   unsigned int *index)
@@ -226,6 +227,7 @@ static int rzv2m_dt_subnode_to_map(struct pinctrl_dev *pctldev,
 	struct property *prop;
 	int ret, gsel, fsel;
 	const char **pin_fn;
+	const char *name;
 	const char *pin;
 
 	pinmux = of_find_property(np, "pinmux", NULL);
@@ -309,8 +311,19 @@ static int rzv2m_dt_subnode_to_map(struct pinctrl_dev *pctldev,
 		psel_val[i] = MUX_FUNC(value);
 	}
 
+	if (parent) {
+		name = devm_kasprintf(pctrl->dev, GFP_KERNEL, "%pOFn.%pOFn",
+				      parent, np);
+		if (!name) {
+			ret = -ENOMEM;
+			goto done;
+		}
+	} else {
+		name = np->name;
+	}
+
 	/* Register a single pin group listing all the pins we read from DT */
-	gsel = pinctrl_generic_add_group(pctldev, np->name, pins, num_pinmux, NULL);
+	gsel = pinctrl_generic_add_group(pctldev, name, pins, num_pinmux, NULL);
 	if (gsel < 0) {
 		ret = gsel;
 		goto done;
@@ -320,17 +333,16 @@ static int rzv2m_dt_subnode_to_map(struct pinctrl_dev *pctldev,
 	 * Register a single group function where the 'data' is an array PSEL
 	 * register values read from DT.
 	 */
-	pin_fn[0] = np->name;
-	fsel = pinmux_generic_add_function(pctldev, np->name, pin_fn, 1,
-					   psel_val);
+	pin_fn[0] = name;
+	fsel = pinmux_generic_add_function(pctldev, name, pin_fn, 1, psel_val);
 	if (fsel < 0) {
 		ret = fsel;
 		goto remove_group;
 	}
 
 	maps[idx].type = PIN_MAP_TYPE_MUX_GROUP;
-	maps[idx].data.mux.group = np->name;
-	maps[idx].data.mux.function = np->name;
+	maps[idx].data.mux.group = name;
+	maps[idx].data.mux.function = name;
 	idx++;
 
 	dev_dbg(pctrl->dev, "Parsed %pOF with %d pins\n", np, num_pinmux);
@@ -377,7 +389,7 @@ static int rzv2m_dt_node_to_map(struct pinctrl_dev *pctldev,
 	index = 0;
 
 	for_each_child_of_node(np, child) {
-		ret = rzv2m_dt_subnode_to_map(pctldev, child, map,
+		ret = rzv2m_dt_subnode_to_map(pctldev, child, np, map,
 					      num_maps, &index);
 		if (ret < 0) {
 			of_node_put(child);
@@ -386,7 +398,7 @@ static int rzv2m_dt_node_to_map(struct pinctrl_dev *pctldev,
 	}
 
 	if (*num_maps == 0) {
-		ret = rzv2m_dt_subnode_to_map(pctldev, np, map,
+		ret = rzv2m_dt_subnode_to_map(pctldev, np, NULL, map,
 					      num_maps, &index);
 		if (ret < 0)
 			goto done;
-- 
2.34.1


             reply	other threads:[~2023-07-03 15:07 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-07-03 15:07 Geert Uytterhoeven [this message]
2023-07-04  9:03 ` [PATCH/RFT] pinctrl: renesas: rzv2m: Handle non-unique subnode names Chris Paterson
2023-07-04  9:06 ` Linus Walleij
2023-07-04  9:13   ` Biju Das
2023-07-04 15:48 ` Fabrizio Castro
2023-07-05  9:45   ` Geert Uytterhoeven

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=607bd6ab4905b0b1b119a06ef953fa1184505777.1688396717.git.geert+renesas@glider.be \
    --to=geert+renesas@glider.be \
    --cc=Chris.Paterson2@renesas.com \
    --cc=biju.das@bp.renesas.com \
    --cc=linus.walleij@linaro.org \
    --cc=linux-gpio@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-renesas-soc@vger.kernel.org \
    --cc=prabhakar.mahadev-lad.rj@bp.renesas.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.