[OpenWrt-Devel] [PATCH] ramips:Allow funcs in multiple groups in pinctrl-rt2880.c for UARTF pin sharing

Noble Pepper openwrtmail at noblepepper.com
Sun Nov 22 14:26:38 EST 2015


Hi, thanks for looking at this. 

I actually tried this approach before deciding groups that are not a
fixed set of pins would require modifying pinctrl/pinmux.c and possibly
pinctrl/core.c thus would affect a lot more than just the ralink
drivers.

The problem arises when pinmux_enable_setting() in pinmux.c calls
rt2880_get_group_pins() without any information about which function is
to be used. pinmux_enable_setting() then allocates the pins thus
obtained before calling rt2880_pmx_group_enable (specifying which
function) and the damage is already done.

The section titled "PINMUX interfaces" in Documentation/pinctrl.txt
seems to imply that a group is a fixed set of pins and pinmux.c and
core.c look to have been written assuming this is true.

Regards, Noble

On Sat, 2015-11-21 at 21:32 +0100, John Crispin wrote:
> Hi,
> 
> i had a closer look at the code. what you want to do instead of adding 2
> dummy muxes is to modify
> 
> static int rt2880_pmx_group_enable(struct pinctrl_dev *pctrldev,
> 
> and change this part
> 
>         /* mark the pins as gpio */
>         for (i = 0; i < p->groups[group].func[0].pin_count; i++)
>                 p->gpio[p->groups[group].func[0].pins[i]] = 1;
> 
> to not use [0] but the real mux which will enable the upper 4 gpio for
> gpio usage.
> 
> 	John
> 
> On 03/11/2015 13:26, Noble Pepper wrote:
> > 
> > Signed-off-by: Noble Pepper <openwrtmail at noblepepper.com>
> > ---
> > Existing pinctrl-rt2880.c code only kept track of one pin group that
> > functions other than gpio may use. Functions in rt305x.c had differing
> > numbers of pins which caused rt2880_get_group_pins() to sometimes return
> > incorrect pins. Example: when trying to use "gpio uartf" function pins
> > 7-14 instead of 7-10 may be claimed for uartf preventing using gpio on
> > pins 11-14. Usage of groups and functions added to rt305x.c is shown in
> > VOCORE.dtsi. 
> > 
> > 
> >>  target/linux/ramips/dts/VOCORE.dtsi                | 40 ++++-----
> >>  ...ralink-allow-functions-on-multiple-groups.patch | 98 ++++++++++++++++++++++
> >>  2 files changed, 119 insertions(+), 19 deletions(-)
> >>  create mode 100644 target/linux/ramips/patches-3.18/0031-pinctrl-ralink-allow-functions-on-multiple-groups.patch
> >>
> >> diff --git a/target/linux/ramips/dts/VOCORE.dtsi b/target/linux/ramips/dts/VOCORE.dtsi
> >> index ff031fa..a5a213f 100644
> >> --- a/target/linux/ramips/dts/VOCORE.dtsi
> >> +++ b/target/linux/ramips/dts/VOCORE.dtsi
> >> @@ -1,3 +1,10 @@
> >> +/ {
> >> +	palmbus at 10000000 {
> >> +		uartlite at c00 {
> >> +    			status = "okay";
> >> +		};
> >> +	};
> >> +};
> >>  /include/ "rt5350.dtsi"
> >>  
> >>  / {
> >> @@ -5,6 +12,9 @@
> >>  	model = "VoCore";
> >>  
> >>  	palmbus at 10000000 {
> >> +		uart at 500 {
> >> +    			status = "okay";
> >> +		};
> >>  		gpio1: gpio at 660 {
> >>  			status = "okay";
> >>  		};
> >> @@ -25,9 +35,15 @@
> >>  	};
> >>  
> >>  	pinctrl {
> >> +		uartf_pins: uartf {
> >> +			uartf {
> >> +				ralink,group = "uartf_low";
> >> +				ralink,function = "gpio uartf";
> >> +			};
> >> +		};
> >>  		state_default: pinctrl0 {
> >>  			gpio {
> >> -				ralink,group = "jtag", "uartf", "led";
> >> +				ralink,group = "jtag", "led", "uartf_high";
> >>  				ralink,function = "gpio";
> >>  			};
> >>  		};
> >> @@ -64,25 +80,11 @@
> >>  		};
> >>  
> >>  		/* UARTF */
> >> -		gpio7 {
> >> -			/* UARTF_RTS_N */
> >> -			gpio-export,name = "gpio7";
> >> +		gpio11 {
> >> +			/* uartf_dtr_n */
> >> +			gpio-export,name = "gpio11";
> >>  			gpio-export,direction_may_change = <1>;
> >> -			gpios = <&gpio0 7 0>;
> >> -		};
> >> -
> >> -		gpio8 {
> >> -			/* UARTF_TXD */
> >> -			gpio-export,name = "gpio8";
> >> -			gpio-export,direction_may_change = <1>;
> >> -			gpios = <&gpio0 8 0>;
> >> -		};
> >> -
> >> -		gpio9 {
> >> -			/* UARTF_CTS_N */
> >> -			gpio-export,name = "gpio9";
> >> -			gpio-export,direction_may_change = <1>;
> >> -			gpios = <&gpio0 9 0>;
> >> +			gpios = <&gpio0 11 0>;
> >>  		};
> >>  
> >>  		gpio12 {
> >> diff --git a/target/linux/ramips/patches-3.18/0031-pinctrl-ralink-allow-functions-on-multiple-groups.patch b/target/linux/ramips/patches-3.18/0031-pinctrl-ralink-allow-functions-on-multiple-groups.patch
> >> new file mode 100644
> >> index 0000000..1eab406
> >> --- /dev/null
> >> +++ b/target/linux/ramips/patches-3.18/0031-pinctrl-ralink-allow-functions-on-multiple-groups.patch
> >> @@ -0,0 +1,98 @@
> >> +diff -Naur a/arch/mips/include/asm/mach-ralink/pinmux.h b/arch/mips/include/asm/mach-ralink/pinmux.h
> >> +--- a/arch/mips/include/asm/mach-ralink/pinmux.h	2015-11-02 05:32:57.227437903 -0600
> >> ++++ b/arch/mips/include/asm/mach-ralink/pinmux.h	2015-11-03 02:50:33.128049900 -0600
> >> +@@ -31,6 +31,7 @@
> >> + 	int *pins;
> >> + 
> >> + 	int *groups;
> >> ++	int **group_names;
> >> + 	int group_count;
> >> + 
> >> + 	int enabled;
> >> +diff -Naur a/arch/mips/ralink/rt305x.c b/arch/mips/ralink/rt305x.c
> >> +--- a/arch/mips/ralink/rt305x.c	2015-11-02 05:33:44.932237317 -0600
> >> ++++ b/arch/mips/ralink/rt305x.c	2015-11-03 02:49:49.255271419 -0600
> >> +@@ -23,6 +23,22 @@
> >> + 
> >> + static struct rt2880_pmx_func i2c_func[] =  { FUNC("i2c", 0, 1, 2) };
> >> + static struct rt2880_pmx_func spi_func[] = { FUNC("spi", 0, 3, 4) };
> >> ++static struct rt2880_pmx_func uartf_low_func[] = {
> >> ++	FUNC("pcm uartf", RT305X_GPIO_MODE_PCM_UARTF, 7, 4),
> >> ++	FUNC("pcm i2s", RT305X_GPIO_MODE_PCM_I2S, 7, 4),
> >> ++	FUNC("uartf i2s", RT305X_GPIO_MODE_I2S_UARTF, 7, 4),
> >> ++	FUNC("pcm gpio", RT305X_GPIO_MODE_PCM_GPIO, 7, 4),
> >> ++	FUNC("gpio uartf", RT305X_GPIO_MODE_GPIO_UARTF, 7, 4),
> >> ++	FUNC("gpio i2s", RT305X_GPIO_MODE_GPIO_I2S, 7, 4),
> >> ++};
> >> ++static struct rt2880_pmx_func uartf_high_func[] = {
> >> ++	FUNC("pcm uartf", RT305X_GPIO_MODE_PCM_UARTF, 11, 4),
> >> ++	FUNC("pcm i2s", RT305X_GPIO_MODE_PCM_I2S, 11, 4),
> >> ++	FUNC("uartf i2s", RT305X_GPIO_MODE_I2S_UARTF, 11, 4),
> >> ++	FUNC("pcm gpio", RT305X_GPIO_MODE_PCM_GPIO, 11, 4),
> >> ++	FUNC("gpio uartf", RT305X_GPIO_MODE_GPIO_UARTF, 11, 4),
> >> ++	FUNC("gpio i2s", RT305X_GPIO_MODE_GPIO_I2S, 11, 4),
> >> ++};
> >> + static struct rt2880_pmx_func uartf_func[] = {
> >> + 	FUNC("uartf", RT305X_GPIO_MODE_UARTF, 7, 8),
> >> + 	FUNC("pcm uartf", RT305X_GPIO_MODE_PCM_UARTF, 7, 8),
> >> +@@ -80,6 +96,10 @@
> >> + 	GRP("spi", spi_func, 1, RT305X_GPIO_MODE_SPI),
> >> + 	GRP("uartf", uartf_func, RT305X_GPIO_MODE_UART0_MASK,
> >> + 		RT305X_GPIO_MODE_UART0_SHIFT),
> >> ++	GRP("uartf_low", uartf_low_func, RT305X_GPIO_MODE_GPIO_UARTF,
> >> ++		RT305X_GPIO_MODE_UART0_SHIFT),
> >> ++	GRP("uartf_high", uartf_high_func, RT305X_GPIO_MODE_GPIO_UARTF,
> >> ++		RT305X_GPIO_MODE_UART0_SHIFT),
> >> + 	GRP("uartlite", uartlite_func, 1, RT305X_GPIO_MODE_UART1),
> >> + 	GRP("jtag", jtag_func, 1, RT305X_GPIO_MODE_JTAG),
> >> + 	GRP("led", rt5350_led_func, 1, RT5350_GPIO_MODE_PHY_LED),
> >> +diff -Naur a/drivers/pinctrl/pinctrl-rt2880.c b/drivers/pinctrl/pinctrl-rt2880.c
> >> +--- a/drivers/pinctrl/pinctrl-rt2880.c	2015-11-02 05:34:31.585019384 -0600
> >> ++++ b/drivers/pinctrl/pinctrl-rt2880.c	2015-11-03 02:51:30.981079814 -0600
> >> +@@ -188,12 +188,8 @@
> >> + 				unsigned * const num_groups)
> >> + {
> >> + 	struct rt2880_priv *p = pinctrl_dev_get_drvdata(pctrldev);
> >> +-
> >> +-	if (p->func[func]->group_count == 1)
> >> +-		*groups = &p->group_names[p->func[func]->groups[0]];
> >> +-	else
> >> +-		*groups = p->group_names;
> >> +-
> >> ++	if (p->func[func]->group_count != 0)
> >> ++		*groups = p->func[func]->group_names;
> >> + 	*num_groups = p->func[func]->group_count;
> >> + 
> >> + 	return 0;
> >> +@@ -319,12 +315,30 @@
> >> + 	for (i = 0; i < p->group_count; i++) {
> >> + 		for (j = 0; j < p->groups[i].func_count; j++) {
> >> + 			f[c] = &p->groups[i].func[j];
> >> +-			f[c]->groups = devm_kzalloc(p->dev, sizeof(int), GFP_KERNEL);
> >> ++			f[c]->groups = devm_kzalloc(p->dev, sizeof(int) * p->group_count, GFP_KERNEL);
> >> ++			if (!f[c]->groups)
> >> ++					return -1;
> >> ++			f[c]->group_names = devm_kzalloc(p->dev, sizeof(char *) * p->group_count, GFP_KERNEL);
> >> ++			if (!f[c]->group_names)
> >> ++					return -1;
> >> + 			f[c]->groups[0] = i;
> >> + 			f[c]->group_count = 1;
> >> + 			c++;
> >> + 		}
> >> + 	}
> >> ++	f[0]->group_names = p->group_names;
> >> ++	for (c = 1; c < p->func_count; c++) {
> >> ++		f[c]->group_count = 0;
> >> ++		for (i = 0; i < p->group_count; i++) {
> >> ++			for (j = 0; j < p->groups[i].func_count; j++) {
> >> ++				if (strcmp(f[c]->name, p->groups[i].func[j].name) == 0) {
> >> ++					f[c]->groups[f[c]->group_count] = i;
> >> ++					f[c]->group_names[f[c]->group_count] = p->groups[i].name;
> >> ++					f[c]->group_count++;
> >> ++				}
> >> ++			}
> >> ++		}
> >> ++	}
> >> + 	return 0;
> >> + }
> >> + 
> >> -- 
> >> 2.1.4
_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel



More information about the openwrt-devel mailing list