[PATCH] pinctrl/nomadik: Add Device Tree support
Jean-Christophe PLAGNIOL-VILLARD
plagnioj at jcrosoft.com
Thu Dec 13 10:27:33 EST 2012
On 14:37 Thu 13 Dec , Linus Walleij wrote:
> From: Gabriel Fernandez <gabriel.fernandez at stericsson.com>
>
> This implements pin multiplexing and pin configuration for the
> Nomadik pin controller using the device tree.
>
> Cc: Lee Jones <lee.jones at linaro.org>
> Cc: devicetree-discuss at lists.ozlabs.org
> Signed-off-by: Gabriel Fernandez <gabriel.fernandez at stericsson.com>
> Signed-off-by: Linus Walleij <linus.walleij at linaro.org>
> ---
> .../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 at 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.
More information about the linux-arm-kernel
mailing list