aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--target/linux/ramips/patches-5.15/808-pinctrl-mtmips-support-requesting-different-function.patch45
1 files changed, 45 insertions, 0 deletions
diff --git a/target/linux/ramips/patches-5.15/808-pinctrl-mtmips-support-requesting-different-function.patch b/target/linux/ramips/patches-5.15/808-pinctrl-mtmips-support-requesting-different-function.patch
new file mode 100644
index 0000000000..047808f1e6
--- /dev/null
+++ b/target/linux/ramips/patches-5.15/808-pinctrl-mtmips-support-requesting-different-function.patch
@@ -0,0 +1,45 @@
+From: Shiji Yang <yangshiji66@outlook.com>
+Date: Wed, 26 Jul 2023 01:32:55 +0800
+Subject: [PATCH] pinctrl: mtmips: support requesting different functions for
+ same group
+
+Sometimes pinctrl consumers may request different functions for the
+same pin group in different situations. This patch can help to reset
+the group function flag when requesting a different function.
+
+Signed-off-by: Shiji Yang <yangshiji66@outlook.com>
+---
+ drivers/pinctrl/ralink/pinctrl-ralink.c | 21 +++++++++++++++++----
+ 1 file changed, 17 insertions(+), 4 deletions(-)
+
+--- a/drivers/pinctrl/ralink/pinctrl-ralink.c
++++ b/drivers/pinctrl/ralink/pinctrl-ralink.c
+@@ -123,11 +123,24 @@ static int ralink_pmx_group_enable(struc
+ int i;
+ int shift;
+
+- /* dont allow double use */
++ /*
++ * for the same pin group, if request a different function,
++ * then clear the group function flag and continue, else exit.
++ */
+ if (p->groups[group].enabled) {
+- dev_err(p->dev, "%s is already enabled\n",
+- p->groups[group].name);
+- return 0;
++ for (i = 0; i < p->groups[group].func_count; i++) {
++ if (p->groups[group].func[i].enabled == 1) {
++ if (!strcmp(p->func[func]->name,
++ p->groups[group].func[i].name))
++ return 0;
++ p->groups[group].func[i].enabled = 0;
++ break;
++ }
++ }
++
++ /* exit if request the "gpio" function again */
++ if (i == p->groups[group].func_count && func == 0)
++ return 0;
+ }
+
+ p->groups[group].enabled = 1;