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

Reply via email to