On 22/11/2015 20:26, Noble Pepper wrote: > 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.
ok, i had a look at the core.c but not in that detail. i'll have another look tomorrow to see if i can think of another solution. > > 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 <openwrtm...@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@10000000 { >>>> + uartlite@c00 { >>>> + status = "okay"; >>>> + }; >>>> + }; >>>> +}; >>>> /include/ "rt5350.dtsi" >>>> >>>> / { >>>> @@ -5,6 +12,9 @@ >>>> model = "VoCore"; >>>> >>>> palmbus@10000000 { >>>> + uart@500 { >>>> + status = "okay"; >>>> + }; >>>> gpio1: gpio@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@lists.openwrt.org https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel