From nobody Mon May 25 07:55:19 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9A3C3409E16; Tue, 19 May 2026 09:37:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779183450; cv=none; b=TNWHmrQLWpiu2fnpVJntRpvDLDDboRvoItZxmmgRXiQ1dJclKznJwwiXGRpQbzyTAZ+Sd48Il5uVYenFAnnailV4Ep+92jp+DmV6Dk6cVmlQ0O0FPx0vCh8x5clCJqLx6NIihwl+ySMRK9vDkGSt/nhmwlxdZya2l8VMmugU+Ps= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779183450; c=relaxed/simple; bh=RFyrFTiNvN7xCwsRMUno2FUHCmve5OC3JrfqhPiTFJI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=UwuzHLanFed1jt3XqBkn628Jfbhk40QhRJPOTYE5kctEodGNEm+2d75pv5rpaliscaWj69B7PRiPKjKc6kag6AIhf4FZ20vfBW/2VhxhYExPMv8zKHJA7jzvbsm9ppwDywxOUztCFk0nWCPK7RmNmQJU0+ceIv2u7affC/2+AyM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=bv/kf4aU; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="bv/kf4aU" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8BFE0C2BCC6; Tue, 19 May 2026 09:37:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1779183450; bh=RFyrFTiNvN7xCwsRMUno2FUHCmve5OC3JrfqhPiTFJI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=bv/kf4aU8lc5/mevxSccRStEldhW3GXPxrki7RGX8i27r4wSdpwjHfGfyAL9uMRwu yZz7LBn+oBSfUHwgGJg0u4Mk1Ni+A6MrF94XX+wtpZTib3TEs901qzKHyFO7ss0P2k qMNDF0S/hDIwYp91PKssMf7iJT+h9esiphi4swjwqrhbnj/WRzb+jD23IQhQ2EhwYx gjhmYK3TU2goDj75SzDTgmCUUVlTdxMe+HvnWz2r58/+W+xusU6nGBl5+xjLmGHzxu TStjzL4l9uNBe29zdqN46yXqc6MYQ+rfJHSXIllRK/dIHqVrNKjiMp3K0R8C2/v8e5 Q72TGYTewNEwA== From: Conor Dooley To: Linus Walleij Cc: conor@kernel.org, Conor Dooley , Yixun Lan , Troy Mitchell , linux-gpio@vger.kernel.org, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, spacemit@lists.linux.dev Subject: [PATCH v2 1/4] pinctrl: generic: change signature of pinctrl_generic_to_map() to pass void data Date: Tue, 19 May 2026 10:37:22 +0100 Message-ID: <20260519-plod-irritable-632bb27b8110@spud> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260519-germinate-ageless-631033d22797@spud> References: <20260519-germinate-ageless-631033d22797@spud> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=2818; i=conor.dooley@microchip.com; h=from:subject:message-id; bh=IKzfFin2jBmcdZM/cVLi/EAoXE7JtVz0kxmyuCS5/1c=; b=owGbwMvMwCVWscWwfUFT0iXG02pJDFk8+kHH5N7O3LX9DZ/M5Pdrl+7d+v7Y3VW72A/fTFn2I L55fpbzsY5SFgYxLgZZMUWWxNt9LVLr/7jscO55CzOHlQlkCAMXpwBMpGEmI8M8nu0+Cus8C6+1 iqSX7Z5wLXjGH9Grn+Y2NBW1zdNnyNJi+Kf1MVeX55V96tqAo+XHSqcEXDbVfm6kmZT3+PZkbY2 2r/wA X-Developer-Key: i=conor.dooley@microchip.com; a=openpgp; fpr=F9ECA03CF54F12CD01F1655722E2C55B37CF380C Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Conor Dooley In order to make pinctrl_generic_to_map() usable for controllers that use pinmux, change the functions char array pointer that it passes to pinctrl_generic_add_group() to a void pointer. In the pinmux case this property will contain the mux setting as a number rather than as strings in the pins + functions case. Signed-off-by: Conor Dooley --- drivers/pinctrl/pinconf.h | 6 ++---- drivers/pinctrl/pinctrl-generic.c | 5 ++--- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/drivers/pinctrl/pinconf.h b/drivers/pinctrl/pinconf.h index 9711d16c38b62..b2fb757cc6ecb 100644 --- a/drivers/pinctrl/pinconf.h +++ b/drivers/pinctrl/pinconf.h @@ -177,8 +177,7 @@ int pinctrl_generic_to_map(struct pinctrl_dev *pctldev,= struct device_node *pare struct device_node *np, struct pinctrl_map **maps, unsigned int *num_maps, unsigned int *num_reserved_maps, const char **group_name, unsigned int ngroups, - const char **functions, unsigned int *pins, - unsigned int npins); + void *data, unsigned int *pins, unsigned int npins); #else static inline int pinctrl_generic_pins_function_dt_node_to_map(struct pinctrl_dev *pctldev, @@ -194,8 +193,7 @@ pinctrl_generic_to_map(struct pinctrl_dev *pctldev, str= uct device_node *parent, struct device_node *np, struct pinctrl_map **maps, unsigned int *num_maps, unsigned int *num_reserved_maps, const char **group_name, unsigned int ngroups, - const char **functions, unsigned int *pins, - unsigned int npins) + void *data, unsigned int *pins, unsigned int npins) { return -ENOTSUPP; } diff --git a/drivers/pinctrl/pinctrl-generic.c b/drivers/pinctrl/pinctrl-ge= neric.c index e4cd16ce2bda3..a3faad7911cbf 100644 --- a/drivers/pinctrl/pinctrl-generic.c +++ b/drivers/pinctrl/pinctrl-generic.c @@ -21,8 +21,7 @@ int pinctrl_generic_to_map(struct pinctrl_dev *pctldev, s= truct device_node *pare struct device_node *np, struct pinctrl_map **maps, unsigned int *num_maps, unsigned int *num_reserved_maps, const char **group_names, unsigned int ngroups, - const char **functions, unsigned int *pins, - unsigned int npins) + void *data, unsigned int *pins, unsigned int npins) { struct device *dev =3D pctldev->dev; unsigned int num_configs; @@ -45,7 +44,7 @@ int pinctrl_generic_to_map(struct pinctrl_dev *pctldev, s= truct device_node *pare if (ret < 0) return ret; =20 - ret =3D pinctrl_generic_add_group(pctldev, group_name, pins, npins, funct= ions); + ret =3D pinctrl_generic_add_group(pctldev, group_name, pins, npins, data); if (ret < 0) return dev_err_probe(dev, ret, "failed to add group %s: %d\n", group_name, ret); --=20 2.53.0 From nobody Mon May 25 07:55:19 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A727C43CEEA; Tue, 19 May 2026 09:37:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779183452; cv=none; b=hTqfjUO64qcMiB3FuE0COmwcb8R+f0dTMfrMhRPVN6cjopElXcOZe8dSRpcU7f3NaOtvt6SjlGtMTjbQ2Rgk7Jy4FXUyQsrx7Cc63OTVewuDMKkreOVgXW2TeQHynhkSxopwBL0T+7FB73j1PWjjmxBIFQGlHmqP/LXNjkyC8Qs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779183452; c=relaxed/simple; bh=29NbVoajZTtTH3m99IJaWbdrnfsufS249hOJeHdzXU8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=F92mpLU9K76iOlZqcW7mdcWf6bACPd7rP4yy2P/7XZx0KglLjo7/c08J4WPQAFWbf3ibfkZZnKyb5vHN1H9VC0D81bjgOF1ftX/+PLj+DJFvEanPz/Y5+i19xK8vDz5a3xMMIWJUM0GGwxCCx+hqD24js/sCP4TEAhSn7tXsL/g= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=jMFgm7Dl; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="jMFgm7Dl" Received: by smtp.kernel.org (Postfix) with ESMTPSA id BF393C2BCF5; Tue, 19 May 2026 09:37:30 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1779183452; bh=29NbVoajZTtTH3m99IJaWbdrnfsufS249hOJeHdzXU8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=jMFgm7DlWGoa7FcFXbiQRhV9j8RlzxJgmeRJBLRuVhaqBejVJ/8z9J/lMaHtm2QnC R11PoknF+h93yNyjpJQ4ew5cakznV/a2eYDlUsSDo+G2ZmQa1VS9FLa0t9PAqa2/lu S/xwtETlFhe4WXerU3y/7Rd/Eex1xLjXOrl+/00KOMlDMIaENnF6rak2vkWHzqV8zX LF/k5gJr6VU4MWi+MrXbc5BknbfMIebrsNr/zsoNK4pL3SpGLBohmNsfOXxckHiqjC jIRVMoMj7fKrIX+Em8rUG5StGkHrZjOvM+AzGOu8a/2BWFMpLYDRrLsGrjuir8N5AJ 1wTPWlwC20qzw== From: Conor Dooley To: Linus Walleij Cc: conor@kernel.org, Conor Dooley , Yixun Lan , Troy Mitchell , linux-gpio@vger.kernel.org, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, spacemit@lists.linux.dev Subject: [PATCH v2 2/4] pinctrl: add new generic groups/function creation function for pinmux Date: Tue, 19 May 2026 10:37:23 +0100 Message-ID: <20260519-storm-karma-e457ea68904a@spud> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260519-germinate-ageless-631033d22797@spud> References: <20260519-germinate-ageless-631033d22797@spud> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=7907; i=conor.dooley@microchip.com; h=from:subject:message-id; bh=m1LZQAbTBJymAR9P4E9u1jLAfhLsJ/LYRIX80WcFFg0=; b=owGbwMvMwCVWscWwfUFT0iXG02pJDFk8+kGvFH9+Xf4miyuntTJEiMfpaY/eK22BgxrpfT62W fdWxAp1lLIwiHExyIopsiTe7muRWv/HZYdzz1uYOaxMIEMYuDgFYCIFWYwMr/9bf90voBU99+/q 55On35M77einOqHqud+5hPmZ7LPPv2Fk+GK9/W2AVk1LzvR6dY7sqbsTl944K7BH+qr3TLaoPt1 7HAA= X-Developer-Key: i=conor.dooley@microchip.com; a=openpgp; fpr=F9ECA03CF54F12CD01F1655722E2C55B37CF380C Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Conor Dooley Akin to my recently added pinctrl_generic_pins_functions_dt_node_to_map(), create an analogue that performs the same role of dynamically creating groups at runtime for controllers using the pinmux property. The pinmux property is freeform, so this function mandates that the upper 16 bits contain the pin and the lower 16 bits contains the mux setting. The group's data pointer is populated with an array of the mux settings for each pin it contains. Since the node parsing and subsequent pinctrl core function calls are practically identical to the pins + functions case, other than which properties are examined, it makes sense to extract the common code from pinctrl_generic_pins_function_dt_node_to_map() into a generic function that takes the case-specific devicetree parsing function as an argument. Signed-off-by: Conor Dooley --- drivers/pinctrl/pinconf.h | 14 ++++ drivers/pinctrl/pinctrl-generic.c | 119 ++++++++++++++++++++++++------ 2 files changed, 112 insertions(+), 21 deletions(-) diff --git a/drivers/pinctrl/pinconf.h b/drivers/pinctrl/pinconf.h index b2fb757cc6ecb..2e40512fed776 100644 --- a/drivers/pinctrl/pinconf.h +++ b/drivers/pinctrl/pinconf.h @@ -173,6 +173,11 @@ int pinctrl_generic_pins_function_dt_node_to_map(struc= t pinctrl_dev *pctldev, struct pinctrl_map **maps, unsigned int *num_maps); =20 +int pinctrl_generic_pinmux_dt_node_to_map(struct pinctrl_dev *pctldev, + struct device_node *np, + struct pinctrl_map **maps, + unsigned int *num_maps); + int pinctrl_generic_to_map(struct pinctrl_dev *pctldev, struct device_node= *parent, struct device_node *np, struct pinctrl_map **maps, unsigned int *num_maps, unsigned int *num_reserved_maps, @@ -188,6 +193,15 @@ pinctrl_generic_pins_function_dt_node_to_map(struct pi= nctrl_dev *pctldev, return -ENOTSUPP; } =20 +static inline int +pinctrl_generic_pinmux_dt_node_to_map(struct pinctrl_dev *pctldev, + struct device_node *np, + struct pinctrl_map **maps, + unsigned int *num_maps) +{ + return -ENOTSUPP; +} + static inline int pinctrl_generic_to_map(struct pinctrl_dev *pctldev, struct device_node *pa= rent, struct device_node *np, struct pinctrl_map **maps, diff --git a/drivers/pinctrl/pinctrl-generic.c b/drivers/pinctrl/pinctrl-ge= neric.c index a3faad7911cbf..9759b0186bcc2 100644 --- a/drivers/pinctrl/pinctrl-generic.c +++ b/drivers/pinctrl/pinctrl-generic.c @@ -119,17 +119,64 @@ static int pinctrl_generic_pins_function_dt_subnode_t= o_map(struct pinctrl_dev *p functions, pins, npins); } =20 -/* - * For platforms that do not define groups or functions in the driver, but - * instead use the devicetree to describe them. This function will, unlike - * pinconf_generic_dt_node_to_map() etc which rely on driver defined groups - * and functions, create them in addition to parsing pinconf properties and - * adding mappings. - */ -int pinctrl_generic_pins_function_dt_node_to_map(struct pinctrl_dev *pctld= ev, - struct device_node *np, - struct pinctrl_map **maps, - unsigned int *num_maps) +static int pinctrl_generic_pinmux_dt_subnode_to_map(struct pinctrl_dev *pc= tldev, + struct device_node *parent, + struct device_node *np, + struct pinctrl_map **maps, + unsigned int *num_maps, + unsigned int *num_reserved_maps, + const char **group_names, + unsigned int ngroups) +{ + struct device *dev =3D pctldev->dev; + unsigned int *pins, *muxes; + int npins, ret; + + npins =3D of_property_count_u32_elems(np, "pinmux"); + + if (npins < 1) { + dev_err(dev, "invalid pinctrl group %pOFn.%pOFn %d\n", + parent, np, npins); + return npins; + } + + pins =3D devm_kcalloc(dev, npins, sizeof(*pins), GFP_KERNEL); + if (!pins) + return -ENOMEM; + + muxes =3D devm_kcalloc(dev, npins, sizeof(*muxes), GFP_KERNEL); + if (!muxes) + return -ENOMEM; + + for (int i =3D 0; i < npins; i++) { + unsigned int pinmux; + + ret =3D of_property_read_u32_index(np, "pinmux", i, &pinmux); + if (ret) + return ret; + + pins[i] =3D pinmux >> 16; + muxes[i] =3D pinmux & GENMASK(15, 0); + } + + return pinctrl_generic_to_map(pctldev, parent, np, maps, num_maps, + num_reserved_maps, group_names, ngroups, + muxes, pins, npins); +} + +static int pinctrl_generic_dt_node_to_map(struct pinctrl_dev *pctldev, + struct device_node *np, + struct pinctrl_map **maps, + unsigned int *num_maps, + int (dt_subnode_to_map)( + struct pinctrl_dev *, + struct device_node *, + struct device_node *, + struct pinctrl_map **, + unsigned int *, + unsigned int *, + const char **, + unsigned int)) { struct device *dev =3D pctldev->dev; struct device_node *child_np; @@ -152,11 +199,8 @@ int pinctrl_generic_pins_function_dt_node_to_map(struc= t pinctrl_dev *pctldev, if (!group_names) return -ENOMEM; =20 - ret =3D pinctrl_generic_pins_function_dt_subnode_to_map(pctldev, np, np, - maps, num_maps, - &num_reserved_maps, - group_names, - ngroups); + ret =3D dt_subnode_to_map(pctldev, np, np, maps, num_maps, + &num_reserved_maps, group_names, ngroups); if (ret) { pinctrl_utils_free_map(pctldev, *maps, *num_maps); return dev_err_probe(dev, ret, "error figuring out mappings for %s\n", n= p->name); @@ -180,11 +224,8 @@ int pinctrl_generic_pins_function_dt_node_to_map(struc= t pinctrl_dev *pctldev, =20 ngroups =3D 0; for_each_available_child_of_node_scoped(np, child_np) { - ret =3D pinctrl_generic_pins_function_dt_subnode_to_map(pctldev, np, chi= ld_np, - maps, num_maps, - &num_reserved_maps, - group_names, - ngroups); + ret =3D dt_subnode_to_map(pctldev, np, child_np, maps, num_maps, + &num_reserved_maps, group_names, ngroups); if (ret) { pinctrl_utils_free_map(pctldev, *maps, *num_maps); return dev_err_probe(dev, ret, "error figuring out mappings for %s\n", @@ -202,4 +243,40 @@ int pinctrl_generic_pins_function_dt_node_to_map(struc= t pinctrl_dev *pctldev, =20 return 0; } + +/* + * For platforms that do not define groups or functions in the driver, but + * instead use the devicetree to describe them. This function will, unlike + * pinconf_generic_dt_node_to_map() etc which rely on driver defined groups + * and functions, create them in addition to parsing pinconf properties and + * adding mappings. + */ +int pinctrl_generic_pins_function_dt_node_to_map(struct pinctrl_dev *pctld= ev, + struct device_node *np, + struct pinctrl_map **maps, + unsigned int *num_maps) +{ + return pinctrl_generic_dt_node_to_map(pctldev, np, maps, num_maps, + &pinctrl_generic_pins_function_dt_subnode_to_map); +} EXPORT_SYMBOL_GPL(pinctrl_generic_pins_function_dt_node_to_map); + +/* + * For platforms that do not define groups or functions in the driver, but + * instead use the devicetree to describe them. This function will, unlike + * pinconf_generic_dt_node_to_map() etc which rely on driver defined groups + * and functions, create them in addition to parsing pinconf properties and + * adding mappings. + * + * It assumes that the upper 16 bits of the pinmux items contain the pin + * and the lower 16 the mux setting. + */ +int pinctrl_generic_pinmux_dt_node_to_map(struct pinctrl_dev *pctldev, + struct device_node *np, + struct pinctrl_map **maps, + unsigned int *num_maps) +{ + return pinctrl_generic_dt_node_to_map(pctldev, np, maps, num_maps, + &pinctrl_generic_pinmux_dt_subnode_to_map); +}; +EXPORT_SYMBOL_GPL(pinctrl_generic_pinmux_dt_node_to_map); --=20 2.53.0 From nobody Mon May 25 07:55:19 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2A7FE44D6A1; Tue, 19 May 2026 09:37:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779183455; cv=none; b=tKib/aEE3/xzO1cnG7YQ5O4PyrsLCAsEDF8UGYtrBYHyLur458OBXcwcAtOYZGKbxNQ0IqRi6ryUTMkTAQlD2ZDfL9At5fPfP6dc3BJEQcH2aRcHmliWNynKS59adjTChZftwyTaAXxJzIR8QZ+CVt4r/xs4HbcghjFCQaxcwNM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779183455; c=relaxed/simple; bh=xE0yM6A77psZsLR6G5jWJtzbeOJz9NLGG0dttBDqrrY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=dY2a+fMQD2eqs3+zSqrNl+JaFWcw7LSmtIxH9voCjn8WROoj1kY32Qjc/1kuDnE7x1aYEHizX+ozlLoyCox48bKTBoYxs6BsgRakunuV6JNJJu7vS0wfrzo35y0QVdYEAYROhMyYaUe7QkPWI/s9aHz/Ux53WltKCgWLfOrd3SY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=A5R4J9RG; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="A5R4J9RG" Received: by smtp.kernel.org (Postfix) with ESMTPSA id F30DBC2BCB3; Tue, 19 May 2026 09:37:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1779183454; bh=xE0yM6A77psZsLR6G5jWJtzbeOJz9NLGG0dttBDqrrY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=A5R4J9RGWZrtC+CDtgo1UQygPvsSfAnVrI4nkqLzvtvP4JC2DNGad4E6ZEZPIu00g WoMia1+XVWrtrha+EDztMWJviWsEhdU2SADjzmxcrlkTceEeI9eO9/Jy+h2JrfREOy 2bVYQ+KzW+6hRvgI//WkZcJRKfV2qI2sBJg0Hm41Nmd4GEPbloIfvgHxEPuLXCxrwB jN10QHpucT/rlb4VYaCLZxOkjqUg/nDJJQWL4EabYDuERC12M/4jVAbDhvMnEr1GlO bH2l1mVjI8ZiGm0Am/ZAOHZPb7+ifh4mvXQwsmohCrpCY5UJoTi1kLIqtlig0TmpBQ sLLK5jthnoa1g== From: Conor Dooley To: Linus Walleij Cc: conor@kernel.org, Conor Dooley , Yixun Lan , Troy Mitchell , linux-gpio@vger.kernel.org, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, spacemit@lists.linux.dev Subject: [PATCH v2 3/4] pinctrl: spacemit: delete spacemit_pctrl_check_power() Date: Tue, 19 May 2026 10:37:24 +0100 Message-ID: <20260519-absinthe-undercook-95dcc685e90e@spud> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260519-germinate-ageless-631033d22797@spud> References: <20260519-germinate-ageless-631033d22797@spud> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=2257; i=conor.dooley@microchip.com; h=from:subject:message-id; bh=nbzbm22qq7GdIPOZjV8ZHzX0ozzp95ML+4OpjtQggdc=; b=owGbwMvMwCVWscWwfUFT0iXG02pJDFk8+sHGU3iyJrnkC3+a0tQp5SR4+rtVmljCz+NG0dl9W pxrdN93lLIwiHExyIopsiTe7muRWv/HZYdzz1uYOaxMIEMYuDgFYCLenxn+6T4/LqVoo3Py1bRt n3ayPJ8xUbL81KvNGf0t2ZGqvt4C/owMb9fKyM6R4S85E/Hr3NtZM5XjC7WlvkoJJ+5r3OYwk4m ZAQA= X-Developer-Key: i=conor.dooley@microchip.com; a=openpgp; fpr=F9ECA03CF54F12CD01F1655722E2C55B37CF380C Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Conor Dooley As far as I can tell spacemit_pctrl_check_power(), called during the custom implementation of dt_node_to_map, is redundant because the driver's implementation generate_config performs the check too. Removing this would allow the driver to use the newly added common function pinctrl_generic_pinmux_dt_node_to_map(). Signed-off-by: Conor Dooley --- drivers/pinctrl/spacemit/pinctrl-k1.c | 37 --------------------------- 1 file changed, 37 deletions(-) diff --git a/drivers/pinctrl/spacemit/pinctrl-k1.c b/drivers/pinctrl/spacem= it/pinctrl-k1.c index b0be62b1c8161..95c891c4c8fb4 100644 --- a/drivers/pinctrl/spacemit/pinctrl-k1.c +++ b/drivers/pinctrl/spacemit/pinctrl-k1.c @@ -409,38 +409,6 @@ static inline u32 spacemit_get_drive_strength_mA(enum = spacemit_pin_io_type type, } } =20 -static int spacemit_pctrl_check_power(struct pinctrl_dev *pctldev, - struct device_node *dn, - struct spacemit_pin_mux_config *pinmuxs, - int num_pins, const char *grpname) -{ - struct spacemit_pinctrl *pctrl =3D pinctrl_dev_get_drvdata(pctldev); - struct device *dev =3D pctrl->dev; - enum spacemit_pin_io_type type; - u32 power =3D 0, i; - - of_property_read_u32(dn, "power-source", &power); - - for (i =3D 0; i < num_pins; i++) { - type =3D spacemit_to_pin_io_type(pinmuxs[i].pin); - - if (type !=3D IO_TYPE_EXTERNAL) - continue; - - switch (power) { - case PIN_POWER_STATE_1V8: - case PIN_POWER_STATE_3V3: - break; - default: - dev_err(dev, "group %s has unsupported power\n", - grpname); - return -ENOTSUPP; - } - } - - return 0; -} - static void spacemit_set_io_pwr_domain(struct spacemit_pinctrl *pctrl, const struct spacemit_pin *spin, const enum spacemit_pin_io_type type) @@ -548,11 +516,6 @@ static int spacemit_pctrl_dt_node_to_map(struct pinctr= l_dev *pctldev, return dev_err_probe(dev, -ENODEV, "failed to get pin %d\n", pins[i]); } =20 - ret =3D spacemit_pctrl_check_power(pctldev, child, pinmuxs, - npins, grpname); - if (ret < 0) - return ret; - map[nmaps].type =3D PIN_MAP_TYPE_MUX_GROUP; map[nmaps].data.mux.function =3D np->name; map[nmaps].data.mux.group =3D grpname; --=20 2.53.0 From nobody Mon May 25 07:55:19 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 53ECF4611EE; Tue, 19 May 2026 09:37:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779183457; cv=none; b=JtW9bJlJq8riT+H9wxGLUkq+N/y76tbPUyixt6qc3c+UbpO0uYX2hNSs+2GDux9ncMBx3PBLcUVbbFxuuMbS2q7endkK1DVanA3i02LD+MeMKoC5It5YuoXs8ulNerZtNT6XAvxwVTm3F1GOjQ2TVXmRMhdvefGGGgVDOAMsW0o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779183457; c=relaxed/simple; bh=8pnXCimxvUfNZJTuvj5cbE0l0aw6K9TRDdNYEip+NcE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=snpXhc1UHLlyYKz7TojqrIR7uTabUddfmcva9s0iiiRc2w5itIn469VRVZA7KDRfD0NJOYbo01PdV63hhXPicFte4DvBWxWwoTQdV2bIBLGNmQrgdq6prtgGwVdlAoQgrunU9U6VnTCGlyzgm7RJ320hXXjaj3NIoysoK9OXgCc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Iw5Xoizd; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Iw5Xoizd" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 32644C2BCF5; Tue, 19 May 2026 09:37:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1779183457; bh=8pnXCimxvUfNZJTuvj5cbE0l0aw6K9TRDdNYEip+NcE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Iw5Xoizd4zvKo/tB/LOHquuUCFSvBVE7YDhESTHbzWQXIVyzkt8Bh0B0XHB4nUWXq dsAmlNJ+3jCidfiFkDSTuKvQHIlM2REmSXCN4SOnoqUBhIX6yDyyG1gUSmfqHcAGbH tjVN/yeJJJi2CB+Kdh2YTFL+iJQc6lEuhAA0mp5yHV/S8T2Onk4DIKYbXAEawB3TMC LM/3qcL0IDHdBQKIG32JJZUIHvD9rl5lkVZvXfwGpmaqpp7zOtIK/d4meaukRjeQi/ Z/WsPZe9u1gM/vIyZYJA8m0lcv3MnVllyuOESM5syK6d4HvAilA2WKeh/Skdnofg3u JhDPlHZbmQHQQ== From: Conor Dooley To: Linus Walleij Cc: conor@kernel.org, Conor Dooley , Yixun Lan , Troy Mitchell , linux-gpio@vger.kernel.org, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, spacemit@lists.linux.dev Subject: [PATCH v2 4/4] pinctrl: spacemit: move over to generic pinmux dt_node_to_map implementation Date: Tue, 19 May 2026 10:37:25 +0100 Message-ID: <20260519-cosmetics-careless-0e9a219c51ef@spud> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260519-germinate-ageless-631033d22797@spud> References: <20260519-germinate-ageless-631033d22797@spud> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=6986; i=conor.dooley@microchip.com; h=from:subject:message-id; bh=W023L0/ELOiyf4uTaGH6YKjJuH+4shQM+HkkXMqZAK4=; b=owGbwMvMwCVWscWwfUFT0iXG02pJDFk8+sFrJhQ2MF99LXCk4c+n+jXvHF8rvr7gsbB4dcbpS +fOhez81FHKwiDGxSArpsiSeLuvRWr9H5cdzj1vYeawMoEMYeDiFICJNOoxMixk8NPRE17iuOuC +l+LoN1BJoGbDrrwfzo3xSHlc9lWGU2Gf/Z+Ot/4tm7Nac5v3t3TOtV/W9iZXUv/dTZ8eNARskT xDAcA X-Developer-Key: i=conor.dooley@microchip.com; a=openpgp; fpr=F9ECA03CF54F12CD01F1655722E2C55B37CF380C Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Conor Dooley Replace the custom implementation of dt_node_to_map with pinctrl_generic_dt_node_to_map() to demonstrate its use. spacemit_pin_mux_config didn't provide much value in the first place, because the group contains the information required to look up the spacemit_pin struct corresponding to a pin, so there's no loss in functionality as a result of the generic function carrying only the mux data in the group's data pointer rather than having an array of spacemit_pin_mux_config structs. Signed-off-by: Conor Dooley Reviewed-by: Troy Mitchell --- drivers/pinctrl/spacemit/Kconfig | 4 +- drivers/pinctrl/spacemit/pinctrl-k1.c | 140 ++------------------------ 2 files changed, 12 insertions(+), 132 deletions(-) diff --git a/drivers/pinctrl/spacemit/Kconfig b/drivers/pinctrl/spacemit/Kc= onfig index c021d51033d16..b2365deffe1be 100644 --- a/drivers/pinctrl/spacemit/Kconfig +++ b/drivers/pinctrl/spacemit/Kconfig @@ -8,9 +8,7 @@ config PINCTRL_SPACEMIT_K1 depends on ARCH_SPACEMIT || COMPILE_TEST depends on OF default ARCH_SPACEMIT - select GENERIC_PINCTRL_GROUPS - select GENERIC_PINMUX_FUNCTIONS - select GENERIC_PINCONF + select GENERIC_PINCTRL help Say Y to select the pinctrl driver for K1/K3 SoC. This pin controller allows selecting the mux function for diff --git a/drivers/pinctrl/spacemit/pinctrl-k1.c b/drivers/pinctrl/spacem= it/pinctrl-k1.c index 95c891c4c8fb4..394ef0cd26bcc 100644 --- a/drivers/pinctrl/spacemit/pinctrl-k1.c +++ b/drivers/pinctrl/spacemit/pinctrl-k1.c @@ -114,11 +114,6 @@ struct spacemit_pinctrl_data { const struct spacemit_pinctrl_dconf *dconf; }; =20 -struct spacemit_pin_mux_config { - const struct spacemit_pin *pin; - u32 config; -}; - /* map pin id to pinctrl register offset, refer MFPR definition */ static unsigned int spacemit_k1_pin_to_offset(unsigned int pin) { @@ -228,16 +223,6 @@ static inline void __iomem *spacemit_pin_to_reg(struct= spacemit_pinctrl *pctrl, return pctrl->regs + pctrl->data->pin_to_offset(pin); } =20 -static u16 spacemit_dt_get_pin(u32 value) -{ - return value >> 16; -} - -static u16 spacemit_dt_get_pin_mux(u32 value) -{ - return value & GENMASK(15, 0); -} - static const struct spacemit_pin *spacemit_get_pin(struct spacemit_pinctrl= *pctrl, unsigned long pin) { @@ -445,121 +430,12 @@ static void spacemit_set_io_pwr_domain(struct spacem= it_pinctrl *pctrl, writel_relaxed(val, pctrl->regs + IO_PWR_DOMAIN_OFFSET + offset); } =20 -static int spacemit_pctrl_dt_node_to_map(struct pinctrl_dev *pctldev, - struct device_node *np, - struct pinctrl_map **maps, - unsigned int *num_maps) -{ - struct spacemit_pinctrl *pctrl =3D pinctrl_dev_get_drvdata(pctldev); - struct device *dev =3D pctrl->dev; - struct device_node *child; - struct pinctrl_map *map; - const char **grpnames; - const char *grpname; - int ngroups =3D 0; - int nmaps =3D 0; - int ret; - - for_each_available_child_of_node(np, child) - ngroups +=3D 1; - - grpnames =3D devm_kcalloc(dev, ngroups, sizeof(*grpnames), GFP_KERNEL); - if (!grpnames) - return -ENOMEM; - - map =3D kzalloc_objs(*map, ngroups * 2); - if (!map) - return -ENOMEM; - - ngroups =3D 0; - guard(mutex)(&pctrl->mutex); - for_each_available_child_of_node_scoped(np, child) { - struct spacemit_pin_mux_config *pinmuxs; - unsigned int config, *pins; - int i, npins; - - npins =3D of_property_count_u32_elems(child, "pinmux"); - - if (npins < 1) { - dev_err(dev, "invalid pinctrl group %pOFn.%pOFn\n", - np, child); - return -EINVAL; - } - - grpname =3D devm_kasprintf(dev, GFP_KERNEL, "%pOFn.%pOFn", - np, child); - if (!grpname) - return -ENOMEM; - - grpnames[ngroups++] =3D grpname; - - pins =3D devm_kcalloc(dev, npins, sizeof(*pins), GFP_KERNEL); - if (!pins) - return -ENOMEM; - - pinmuxs =3D devm_kcalloc(dev, npins, sizeof(*pinmuxs), GFP_KERNEL); - if (!pinmuxs) - return -ENOMEM; - - for (i =3D 0; i < npins; i++) { - ret =3D of_property_read_u32_index(child, "pinmux", - i, &config); - - if (ret) - return -EINVAL; - - pins[i] =3D spacemit_dt_get_pin(config); - pinmuxs[i].config =3D config; - pinmuxs[i].pin =3D spacemit_get_pin(pctrl, pins[i]); - - if (!pinmuxs[i].pin) - return dev_err_probe(dev, -ENODEV, "failed to get pin %d\n", pins[i]); - } - - map[nmaps].type =3D PIN_MAP_TYPE_MUX_GROUP; - map[nmaps].data.mux.function =3D np->name; - map[nmaps].data.mux.group =3D grpname; - nmaps +=3D 1; - - ret =3D pinctrl_generic_add_group(pctldev, grpname, - pins, npins, pinmuxs); - if (ret < 0) - return dev_err_probe(dev, ret, "failed to add group %s: %d\n", grpname,= ret); - - ret =3D pinconf_generic_parse_dt_config(child, pctldev, - &map[nmaps].data.configs.configs, - &map[nmaps].data.configs.num_configs); - if (ret) - return dev_err_probe(dev, ret, "failed to parse pin config of group %s\= n", - grpname); - - if (map[nmaps].data.configs.num_configs =3D=3D 0) - continue; - - map[nmaps].type =3D PIN_MAP_TYPE_CONFIGS_GROUP; - map[nmaps].data.configs.group_or_pin =3D grpname; - nmaps +=3D 1; - } - - ret =3D pinmux_generic_add_function(pctldev, np->name, - grpnames, ngroups, NULL); - if (ret < 0) { - pinctrl_utils_free_map(pctldev, map, nmaps); - return dev_err_probe(dev, ret, "error adding function %s\n", np->name); - } - - *maps =3D map; - *num_maps =3D nmaps; - - return 0; -} - static const struct pinctrl_ops spacemit_pctrl_ops =3D { .get_groups_count =3D pinctrl_generic_get_group_count, .get_group_name =3D pinctrl_generic_get_group_name, .get_group_pins =3D pinctrl_generic_get_group_pins, .pin_dbg_show =3D spacemit_pctrl_dbg_show, - .dt_node_to_map =3D spacemit_pctrl_dt_node_to_map, + .dt_node_to_map =3D pinctrl_generic_pinmux_dt_node_to_map, .dt_free_map =3D pinctrl_utils_free_map, }; =20 @@ -568,8 +444,8 @@ static int spacemit_pmx_set_mux(struct pinctrl_dev *pct= ldev, { struct spacemit_pinctrl *pctrl =3D pinctrl_dev_get_drvdata(pctldev); const struct group_desc *group; - const struct spacemit_pin_mux_config *configs; unsigned int i, mux; + unsigned int *configs; void __iomem *reg; =20 group =3D pinctrl_generic_get_group(pctldev, gsel); @@ -579,11 +455,17 @@ static int spacemit_pmx_set_mux(struct pinctrl_dev *p= ctldev, configs =3D group->data; =20 for (i =3D 0; i < group->grp.npins; i++) { - const struct spacemit_pin *spin =3D configs[i].pin; - u32 value =3D configs[i].config; + const struct spacemit_pin *spin; + u32 value =3D configs[i]; + + spin =3D spacemit_get_pin(pctrl, group->grp.pins[i]); + if (!spin) { + dev_err(pctrl->dev, "Invalid pin %u\n", group->grp.pins[i]); + return -EINVAL; + } =20 reg =3D spacemit_pin_to_reg(pctrl, spin->pin); - mux =3D spacemit_dt_get_pin_mux(value); + mux =3D value; =20 guard(raw_spinlock_irqsave)(&pctrl->lock); value =3D readl_relaxed(reg) & ~PAD_MUX; --=20 2.53.0