Skip to content

Commit

Permalink
pinctrl: sunxi: Search the description array by pin id
Browse files Browse the repository at this point in the history
Avoid to use expensive string manipulation functions and search by pin
id when possible.

Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
  • Loading branch information
Maxime Ripard authored and Linus Walleij committed Jun 16, 2013
1 parent 79bae27 commit 814d4f2
Showing 1 changed file with 29 additions and 21 deletions.
50 changes: 29 additions & 21 deletions drivers/pinctrl/pinctrl-sunxi.c
Original file line number Diff line number Diff line change
Expand Up @@ -1399,6 +1399,31 @@ sunxi_pinctrl_desc_find_function_by_name(struct sunxi_pinctrl *pctl,
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)
{
struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
Expand Down Expand Up @@ -1680,37 +1705,20 @@ sunxi_pmx_gpio_set_direction(struct pinctrl_dev *pctldev,
{
struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
struct sunxi_desc_function *desc;
char pin_name[SUNXI_PIN_NAME_MAX_LEN];
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)
func = "gpio_in";
else
func = "gpio_out";

desc = sunxi_pinctrl_desc_find_function_by_name(pctl,
pin_name,
func);
if (!desc) {
ret = -EINVAL;
goto error;
}
desc = sunxi_pinctrl_desc_find_function_by_pin(pctl, offset, func);
if (!desc)
return -EINVAL;

sunxi_pmx_set(pctldev, offset, desc->muxval);

ret = 0;

error:
return ret;
return 0;
}

static const struct pinmux_ops sunxi_pmx_ops = {
Expand Down

0 comments on commit 814d4f2

Please sign in to comment.