Commit cefbf1a1 authored by Maxime Ripard's avatar Maxime Ripard Committed by Linus Walleij

pinctrl: sunxi: Support generic binding

Our bindings are mostly irrelevant now that we have generic pinctrl
bindings that cover exactly the same uses cases.

Add support for the new ones, and obviously keep our old binding support in
order to keep the ABI stable.
Acked-by: default avatarChen-Yu Tsai <wens@csie.org>
Signed-off-by: default avatarMaxime Ripard <maxime.ripard@free-electrons.com>
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
parent f0a8548b
...@@ -149,18 +149,33 @@ static int sunxi_pctrl_get_group_pins(struct pinctrl_dev *pctldev, ...@@ -149,18 +149,33 @@ static int sunxi_pctrl_get_group_pins(struct pinctrl_dev *pctldev,
static bool sunxi_pctrl_has_bias_prop(struct device_node *node) static bool sunxi_pctrl_has_bias_prop(struct device_node *node)
{ {
return of_find_property(node, "allwinner,pull", NULL); return of_find_property(node, "bias-pull-up", NULL) ||
of_find_property(node, "bias-pull-down", NULL) ||
of_find_property(node, "bias-disable", NULL) ||
of_find_property(node, "allwinner,pull", NULL);
} }
static bool sunxi_pctrl_has_drive_prop(struct device_node *node) static bool sunxi_pctrl_has_drive_prop(struct device_node *node)
{ {
return of_find_property(node, "allwinner,drive", NULL); return of_find_property(node, "drive-strength", NULL) ||
of_find_property(node, "allwinner,drive", NULL);
} }
static int sunxi_pctrl_parse_bias_prop(struct device_node *node) static int sunxi_pctrl_parse_bias_prop(struct device_node *node)
{ {
u32 val; u32 val;
/* Try the new style binding */
if (of_find_property(node, "bias-pull-up", NULL))
return PIN_CONFIG_BIAS_PULL_UP;
if (of_find_property(node, "bias-pull-down", NULL))
return PIN_CONFIG_BIAS_PULL_DOWN;
if (of_find_property(node, "bias-disable", NULL))
return PIN_CONFIG_BIAS_DISABLE;
/* And fall back to the old binding */
if (of_property_read_u32(node, "allwinner,pull", &val)) if (of_property_read_u32(node, "allwinner,pull", &val))
return -EINVAL; return -EINVAL;
...@@ -180,6 +195,21 @@ static int sunxi_pctrl_parse_drive_prop(struct device_node *node) ...@@ -180,6 +195,21 @@ static int sunxi_pctrl_parse_drive_prop(struct device_node *node)
{ {
u32 val; u32 val;
/* Try the new style binding */
if (!of_property_read_u32(node, "drive-strength", &val)) {
/* We can't go below 10mA ... */
if (val < 10)
return -EINVAL;
/* ... and only up to 40 mA ... */
if (val > 40)
val = 40;
/* by steps of 10 mA */
return rounddown(val, 10);
}
/* And then fall back to the old binding */
if (of_property_read_u32(node, "allwinner,drive", &val)) if (of_property_read_u32(node, "allwinner,drive", &val))
return -EINVAL; return -EINVAL;
...@@ -191,6 +221,12 @@ static const char *sunxi_pctrl_parse_function_prop(struct device_node *node) ...@@ -191,6 +221,12 @@ static const char *sunxi_pctrl_parse_function_prop(struct device_node *node)
const char *function; const char *function;
int ret; int ret;
/* Try the generic binding */
ret = of_property_read_string(node, "function", &function);
if (!ret)
return function;
/* And fall back to our legacy one */
ret = of_property_read_string(node, "allwinner,function", &function); ret = of_property_read_string(node, "allwinner,function", &function);
if (!ret) if (!ret)
return function; return function;
...@@ -203,6 +239,14 @@ static const char *sunxi_pctrl_find_pins_prop(struct device_node *node, ...@@ -203,6 +239,14 @@ static const char *sunxi_pctrl_find_pins_prop(struct device_node *node,
{ {
int count; int count;
/* Try the generic binding */
count = of_property_count_strings(node, "pins");
if (count > 0) {
*npins = count;
return "pins";
}
/* And fall back to our legacy one */
count = of_property_count_strings(node, "allwinner,pins"); count = of_property_count_strings(node, "allwinner,pins");
if (count > 0) { if (count > 0) {
*npins = count; *npins = count;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment