On 14:37 Thu 13 Dec     , Linus Walleij wrote:
> From: Gabriel Fernandez <[email protected]>
> 
> This implements pin multiplexing and pin configuration for the
> Nomadik pin controller using the device tree.
> 
> Cc: Lee Jones <[email protected]>
> Cc: [email protected]
> Signed-off-by: Gabriel Fernandez <[email protected]>
> Signed-off-by: Linus Walleij <[email protected]>
> ---
>  .../devicetree/bindings/pinctrl/ste,nomadik.txt    | 111 +++++++++
>  drivers/pinctrl/pinctrl-nomadik.c                  | 250 
> +++++++++++++++++++++
>  2 files changed, 361 insertions(+)
>  create mode 100644 Documentation/devicetree/bindings/pinctrl/ste,nomadik.txt
> 
> diff --git a/Documentation/devicetree/bindings/pinctrl/ste,nomadik.txt 
> b/Documentation/devicetree/bindings/pinctrl/ste,nomadik.txt
> new file mode 100644
> index 0000000..02ff731
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/pinctrl/ste,nomadik.txt
> @@ -0,0 +1,111 @@
> +ST Ericsson Nomadik pinmux controller
> +
> +Required properties:
> +- compatible: "stericsson,nmk_pinctrl"
> +- reg: Should contain the register physical address and length of the PRCMU.
> +
> +Please refer to pinctrl-bindings.txt in this directory for details of the
> +common pinctrl bindings used by client devices, including the meaning of the
> +phrase "pin configuration node".
> +
> +ST Ericsson's pin configuration nodes act as a container for an abitrary 
> number of
> +subnodes. Each of these subnodes represents some desired configuration for a
> +pin, a group, or a list of pins or groups. This configuration can include the
> +mux function to select on those pin(s)/group(s), and various pin 
> configuration
> +parameters, such as inputn output, pull up, pull down...
> +
> +The name of each subnode is not important; all subnodes should be enumerated
> +and processed purely based on their content.
> +
> +Required subnode-properties:
> +- ste,pins : An array of strings. Each string contains the name of a pin or
> +    group.
> +
> +Optional subnode-properties:
> +- ste,function: A string containing the name of the function to mux to the
> +  pin or group.
> +
> +- ste,input:                 no parameter, set pin in input with no pull 
> mode.
> +- ste,input_pull_up:         no parameter, set pin in input with pull up 
> mode.
> +- ste,input_pull_down:               no parameter, set pin in input with 
> pull down mode.
> +
> +- ste,output:                        integer, 0: output low, 1: output high, 
> 2: output (value is not specified).
> +- ste,sleep_mode:            integer, 0: sleep mode disable, 1: sleep mode 
> enable.
> +
> +- ste,sleep_input:           no parameter, set pin in sleep input with no 
> pull mode.
> +- ste,sleep_input_pull_up:   no parameter, set pin in sleep input with pull 
> up mode.
> +- ste,sleep_input_pull_down: no parameter, set pin in sleep input with pull 
> down mode.
> +
> +- ste,sleep_output:          integer, 0: sleep output low, 1: sleep output 
> high, 2: sleep output (value is not specified).
> +
> +- ste,sleep_wakeup:          interger, 0: disable sleep wakeup mode, 1: 
> enable sleep wake up mode.
> +- ste,sleep_gpio:            interger, 0: disable sleep gpio mode, 1: enable 
> sleep gpio mode.
> +
> +- ste,sleep_pdis_mode:               integer, 0: pdis disabled, 1: pdis 
> enable.
> +
> +
> +Valid values for pin and group name are in 
> Drivers/pinctrl/pinctrl-nomadik-db8500.c
> +
> +Example board file extract:
> +
> +     pinctrl {
> +             compatible = "stericsson,nmk_pinctrl";
> +             reg = <0x80157000 0x2000>;
> +
> +             pinctrl-names = "default";
> +             pinctrl-0 = <&uart0_default_mode>;
???

those 2 are wired


> +
> +             uart0 {
> +                     uart0_default_mux: uart0_mux {
> +                             u0_default_mux {
> +                                     ste,function = "u0";
> +                                     ste,pins = "u0_a_1";
> +                                     };
> +                     };
> +                     uart0_default_mode: uart0_default {
> +                             uart0_default_cfg1 {
> +                                     ste,pins = "GPIO0", "GPIO2";
> +                                     ste,input_pull_up;
> +                             };
> +
> +                             uart0_default_cfg2 {
> +                                     ste,pins = "GPIO1", "GPIO3";
> +                                     ste,output = <1>;
> +                             };
> +                     };
> +                     uart0_sleep_mode: uart0_sleep {
> +                             uart0_sleep_cfg1 {
> +                                     ste,pins = "GPIO0", "GPIO2";
> +                                     ste,sleep_mode = <0>;
> +                                     ste,sleep_input;
> +                                     ste,sleep_wakeup_mode = <1>;
> +                                     ste,sleep_pdis_mode = <0>;
> +                             };
> +                             uart0_sleep_cfg2 {
> +                                     ste,pins = "GPIO1";
> +                                     ste,sleep_mode = <0>;
> +                                     ste,sleep_output = <1>;
> +                                     ste,sleep_wakeup_mode = <1>;
> +                                     ste,sleep_pdis_mode = <0>;
> +                             };
> +                             uart0_sleep_cfg3 {
> +                                     ste,pins = "GPIO3";
> +                                     ste,sleep_mode = <0>;
> +                                     ste,sleep_output = <2>;
> +                                     ste,sleep_wakeup_mode = <1>;
> +                                     ste,sleep_pdis_mode = <0>;
> +                             };

with such bindings you will endup with 1000s of node

take a loook on at91 how we did to avoid this
> +                     };
> +             };
> +     };
> +
> +     uart@80120000 {
> +             compatible = "arm,pl011", "arm,primecell";
> +             reg = <0x80120000 0x1000>;
> +             interrupts = <0 11 0x4>;
> +
> +             pinctrl-names = "default","sleep";
> +             pinctrl-0 = <&uart0_default_mux>, <&uart0_default_mode>;
> +             pinctrl-1 = <&uart0_sleep_mode>;
> +     };
> +
> diff --git a/drivers/pinctrl/pinctrl-nomadik.c 
> b/drivers/pinctrl/pinctrl-nomadik.c
> index 1068faa..90b25ee 100644
> --- a/drivers/pinctrl/pinctrl-nomadik.c
> +++ b/drivers/pinctrl/pinctrl-nomadik.c
> @@ -25,6 +25,7 @@
>  #include <linux/irqdomain.h>
>  #include <linux/slab.h>
>  #include <linux/of_device.h>
> +#include <linux/pinctrl/machine.h>
>  #include <linux/pinctrl/pinctrl.h>
>  #include <linux/pinctrl/pinmux.h>
>  #include <linux/pinctrl/pinconf.h>
> @@ -1503,11 +1504,260 @@ static void nmk_pin_dbg_show(struct pinctrl_dev 
> *pctldev, struct seq_file *s,
>       nmk_gpio_dbg_show_one(s, pctldev, chip, offset - chip->base, offset);
>  }
>  
> +static void nmk_pinctrl_dt_free_map(struct pinctrl_dev *pctldev,
> +             struct pinctrl_map *map, unsigned num_maps)
> +{
> +     int i;
> +
> +     for (i = 0; i < num_maps; i++)
> +             if (map[i].type == PIN_MAP_TYPE_CONFIGS_PIN)
> +                     kfree(map[i].data.configs.configs);
> +     kfree(map);
> +}
> +
> +static int nmk_dt_reserve_map(struct pinctrl_map **map, unsigned 
> *reserved_maps,
> +             unsigned *num_maps, unsigned reserve)
> +{
> +     unsigned old_num = *reserved_maps;
> +     unsigned new_num = *num_maps + reserve;
> +     struct pinctrl_map *new_map;
> +
> +     if (old_num >= new_num)
> +             return 0;
> +
> +     new_map = krealloc(*map, sizeof(*new_map) * new_num, GFP_KERNEL);
> +     if (!new_map)
> +             return -ENOMEM;
devm_
> +
> +     memset(new_map + old_num, 0, (new_num - old_num) * sizeof(*new_map));
> +
> +     *map = new_map;
> +     *reserved_maps = new_num;
> +
> +     return 0;
> +}
> +

Best Regards,
J.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to