Commit 814d4f2e authored by Maxime Ripard's avatar Maxime Ripard Committed by Linus Walleij

pinctrl: sunxi: Search the description array by pin id

Avoid to use expensive string manipulation functions and search by pin
id when possible.
Signed-off-by: default avatarMaxime Ripard <maxime.ripard@free-electrons.com>
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
parent 79bae27f
...@@ -1399,6 +1399,31 @@ sunxi_pinctrl_desc_find_function_by_name(struct sunxi_pinctrl *pctl, ...@@ -1399,6 +1399,31 @@ sunxi_pinctrl_desc_find_function_by_name(struct sunxi_pinctrl *pctl,
return NULL; return NULL;
} }
static struct sunxi_desc_function *
sunxi_pinctrl_desc_find_function_by_pin(struct sunxi_pinctrl *pctl,
const u16 pin_num,
const char *func_name)
{
int i;
for (i = 0; i < pctl->desc->npins; i++) {
const struct sunxi_desc_pin *pin = pctl->desc->pins + i;
if (pin->pin.number == pin_num) {
struct sunxi_desc_function *func = pin->functions;
while (func->name) {
if (!strcmp(func->name, func_name))
return func;
func++;
}
}
}
return NULL;
}
static int sunxi_pctrl_get_groups_count(struct pinctrl_dev *pctldev) static int sunxi_pctrl_get_groups_count(struct pinctrl_dev *pctldev)
{ {
struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
...@@ -1680,37 +1705,20 @@ sunxi_pmx_gpio_set_direction(struct pinctrl_dev *pctldev, ...@@ -1680,37 +1705,20 @@ sunxi_pmx_gpio_set_direction(struct pinctrl_dev *pctldev,
{ {
struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
struct sunxi_desc_function *desc; struct sunxi_desc_function *desc;
char pin_name[SUNXI_PIN_NAME_MAX_LEN];
const char *func; const char *func;
u8 bank, pin;
int ret;
bank = (offset) / PINS_PER_BANK;
pin = (offset) % PINS_PER_BANK;
ret = sprintf(pin_name, "P%c%d", 'A' + bank, pin);
if (!ret)
goto error;
if (input) if (input)
func = "gpio_in"; func = "gpio_in";
else else
func = "gpio_out"; func = "gpio_out";
desc = sunxi_pinctrl_desc_find_function_by_name(pctl, desc = sunxi_pinctrl_desc_find_function_by_pin(pctl, offset, func);
pin_name, if (!desc)
func); return -EINVAL;
if (!desc) {
ret = -EINVAL;
goto error;
}
sunxi_pmx_set(pctldev, offset, desc->muxval); sunxi_pmx_set(pctldev, offset, desc->muxval);
ret = 0; return 0;
error:
return ret;
} }
static const struct pinmux_ops sunxi_pmx_ops = { static const struct pinmux_ops sunxi_pmx_ops = {
......
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