From: Gabriel Fernandez <gabriel.fernan...@stericsson.com> The "ste,config" property will contain the pin config node. It will be easier to define a pin configuration and use it by reference without duplicating lines tedious.
Other cleanups to the initial DT patch. This will all be squashed into the original DT submission. Signed-off-by: Gabriel Fernandez <gabriel.fernan...@stericsson.com> Signed-off-by: Linus Walleij <linus.wall...@linaro.org> --- ChangeLog v1->v2: - Moved bias definition into the pin controller in the documentation. --- .../devicetree/bindings/pinctrl/ste,nomadik.txt | 47 ++++++++++++++-------- drivers/pinctrl/pinctrl-nomadik.c | 40 ++++++++++++------ 2 files changed, 58 insertions(+), 29 deletions(-) diff --git a/Documentation/devicetree/bindings/pinctrl/ste,nomadik.txt b/Documentation/devicetree/bindings/pinctrl/ste,nomadik.txt index 8639234..9a2f3f4 100644 --- a/Documentation/devicetree/bindings/pinctrl/ste,nomadik.txt +++ b/Documentation/devicetree/bindings/pinctrl/ste,nomadik.txt @@ -26,11 +26,12 @@ Optional subnode-properties: - ste,function: A string containing the name of the function to mux to the pin or group. -- ste,input : <0/1/2/3> +- ste,config: Handle of pin configuration node (e.g. ste,config = <&slpm_in_wkup_pdis>) + +- ste,input : <0/1/2> 0: input with no pull 1: input with pull up, 2: input with pull down, - 3: input and keep last input configuration (no pull, pull up or pull down). - ste,output: <0/1/2> 0: output low, @@ -41,10 +42,11 @@ Optional subnode-properties: 0: sleep mode disable, 1: sleep mode enable. -- ste,sleep-input: <0/1/2> +- ste,sleep-input: <0/1/2/3> 0: sleep input with no pull, 1: sleep input with pull up, 2: sleep input with pull down. + 3: sleep input and keep last input configuration (no pull, pull up or pull down). - ste,sleep-output: <0/1/2> 0: sleep output low, @@ -70,14 +72,34 @@ Example board file extract: reg = <0x80157000 0x2000>; pinctrl-names = "default"; - pinctrl-0 = <&uart0_default_mode>; + + slpm_in_wkup_pdis: slpm_in_wkup_pdis { + ste,sleep = <1>; + ste,sleep-input = <3>; + ste,sleep-wakeup = <1>; + ste,sleep-pull-disable = <0>; + }; + + slpm_out_hi_wkup_pdis: slpm_out_hi_wkup_pdis { + ste,sleep = <1>; + ste,sleep-output = <1>; + ste,sleep-wakeup = <1>; + ste,sleep-pull-disable = <0>; + }; + + slpm_out_wkup_pdis: slpm_out_wkup_pdis { + ste,sleep = <1>; + ste,sleep-output = <2>; + ste,sleep-wakeup = <1>; + ste,sleep-pull-disable = <0>; + }; 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 { @@ -93,24 +115,15 @@ Example board file extract: uart0_sleep_mode: uart0_sleep { uart0_sleep_cfg1 { ste,pins = "GPIO0", "GPIO2"; - ste,sleep = <0>; - ste,sleep-input = <0>; - ste,sleep-wakeup = <1>; - ste,sleep-pull-disable = <0>; + ste,config = <&slpm_in_wkup_pdis>; }; uart0_sleep_cfg2 { ste,pins = "GPIO1"; - ste,sleep = <0>; - ste,sleep-output = <1>; - ste,sleep-wakeup = <1>; - ste,sleep-pull-disable = <0>; + ste,config = <&slpm_out_hi_wkup_pdis>; }; uart0_sleep_cfg3 { ste,pins = "GPIO3"; - ste,sleep = <0>; - ste,sleep-output = <2>; - ste,sleep-wakeup = <1>; - ste,sleep-pull-disable = <0>; + ste,config = <&slpm_out_wkup_pdis>; }; }; }; diff --git a/drivers/pinctrl/pinctrl-nomadik.c b/drivers/pinctrl/pinctrl-nomadik.c index 451c1ab..314bcbe 100644 --- a/drivers/pinctrl/pinctrl-nomadik.c +++ b/drivers/pinctrl/pinctrl-nomadik.c @@ -1659,36 +1659,52 @@ static const char *nmk_find_pin_name(struct pinctrl_dev *pctldev, const char *pi return NULL; } +static bool nmk_pinctrl_dt_get_config(struct device_node *np, + unsigned long *configs) +{ + bool has_config = 0; + unsigned long cfg = 0; + int i, val, ret; + + for (i = 0; i < ARRAY_SIZE(nmk_cfg_params); i++) { + ret = of_property_read_u32(np, + nmk_cfg_params[i].property, &val); + if (ret != -EINVAL) { + if (nmk_dt_pin_config(i, val, &cfg) == 0) { + *configs |= cfg; + has_config = 1; + } + } + } + + return has_config; +} + int nmk_pinctrl_dt_subnode_to_map(struct pinctrl_dev *pctldev, struct device_node *np, struct pinctrl_map **map, unsigned *reserved_maps, unsigned *num_maps) { - int ret, i; + int ret; const char *function = NULL; unsigned long configs = 0; bool has_config = 0; unsigned reserve = 0; struct property *prop; const char *group, *gpio_name; + struct device_node *np_config; ret = of_property_read_string(np, "ste,function", &function); if (ret >= 0) reserve = 1; - for (i = 0; i < ARRAY_SIZE(nmk_cfg_params); i++) { - unsigned long cfg = 0; - int val; + has_config = nmk_pinctrl_dt_get_config(np, &configs); + + np_config = of_parse_phandle(np, "ste,config", 0); + if (np_config) + has_config |= nmk_pinctrl_dt_get_config(np_config, &configs); - ret = of_property_read_u32(np, nmk_cfg_params[i].property, &val); - if (ret != -EINVAL) { - if (nmk_dt_pin_config(i, val, &cfg) == 0) { - configs |= cfg; - has_config = 1; - } - } - } ret = of_property_count_strings(np, "ste,pins"); if (ret < 0) goto exit; -- 1.7.11.3 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/