Skip to content

Commit a42c7d9

Browse files
Prathamesh SheteLinus Walleij
authored andcommitted
pinctrl: tegra: Use correct offset for pin group
Function tegra_pinctrl_gpio_request_enable() and tegra_pinctrl_gpio_disable_free() uses pin offset instead of group offset, causing the driver to use wrong offset to enable gpio. Add a helper function tegra_pinctrl_get_group() to parse the pin group and determine correct offset. Signed-off-by: Kartik K <kkartik@nvidia.com> Signed-off-by: Prathamesh Shete <pshete@nvidia.com> Link: https://lore.kernel.org/r/20211025110959.27751-1-pshete@nvidia.com Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
1 parent c7892ae commit a42c7d9

1 file changed

Lines changed: 31 additions & 2 deletions

File tree

drivers/pinctrl/tegra/pinctrl-tegra.c

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,29 @@ static int tegra_pinctrl_set_mux(struct pinctrl_dev *pctldev,
275275
return 0;
276276
}
277277

278+
static struct tegra_pingroup *tegra_pinctrl_get_group(struct pinctrl_dev *pctldev,
279+
unsigned int offset)
280+
{
281+
struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);
282+
struct tegra_pingroup *g;
283+
unsigned int group, num_pins, j;
284+
const unsigned int *pins;
285+
int ret;
286+
287+
for (group = 0; group < pmx->soc->ngroups; ++group) {
288+
ret = tegra_pinctrl_get_group_pins(pctldev, group, &pins, &num_pins);
289+
if (ret < 0)
290+
continue;
291+
for (j = 0; j < num_pins; j++) {
292+
if (offset == pins[j])
293+
return &pmx->soc->groups[group];
294+
}
295+
}
296+
297+
dev_err(pctldev->dev, "Pingroup not found for pin %u\n", offset);
298+
return NULL;
299+
}
300+
278301
static int tegra_pinctrl_gpio_request_enable(struct pinctrl_dev *pctldev,
279302
struct pinctrl_gpio_range *range,
280303
unsigned int offset)
@@ -286,7 +309,10 @@ static int tegra_pinctrl_gpio_request_enable(struct pinctrl_dev *pctldev,
286309
if (!pmx->soc->sfsel_in_mux)
287310
return 0;
288311

289-
group = &pmx->soc->groups[offset];
312+
group = tegra_pinctrl_get_group(pctldev, offset);
313+
314+
if (!group)
315+
return -EINVAL;
290316

291317
if (group->mux_reg < 0 || group->sfsel_bit < 0)
292318
return -EINVAL;
@@ -309,7 +335,10 @@ static void tegra_pinctrl_gpio_disable_free(struct pinctrl_dev *pctldev,
309335
if (!pmx->soc->sfsel_in_mux)
310336
return;
311337

312-
group = &pmx->soc->groups[offset];
338+
group = tegra_pinctrl_get_group(pctldev, offset);
339+
340+
if (!group)
341+
return -EINVAL;
313342

314343
if (group->mux_reg < 0 || group->sfsel_bit < 0)
315344
return;

0 commit comments

Comments
 (0)