Skip to content

Commit ba9c474

Browse files
HoratiuVulturlinusw
authored andcommitted
pinctrl: ocelot: Fix pincfg
The blamed commit changed to use regmaps instead of __iomem. But it didn't update the register offsets to be at word offset, so it uses byte offset. Another issue with the same commit is that it has a limit of 32 registers which is incorrect. The sparx5 has 64 while lan966x has 77. Fixes: 076d9e7 ("pinctrl: ocelot: convert pinctrl to regmap") Acked-by: Colin Foster <colin.foster@in-advantage.com> Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com> Signed-off-by: Horatiu Vultur <horatiu.vultur@microchip.com> Link: https://lore.kernel.org/r/20220713193750.4079621-3-horatiu.vultur@microchip.com Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
1 parent dc62db7 commit ba9c474

File tree

1 file changed

+13
-6
lines changed

1 file changed

+13
-6
lines changed

drivers/pinctrl/pinctrl-ocelot.c

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1334,7 +1334,9 @@ static int ocelot_hw_get_value(struct ocelot_pinctrl *info,
13341334
const struct ocelot_pincfg_data *opd = info->pincfg_data;
13351335
u32 regcfg;
13361336

1337-
ret = regmap_read(info->pincfg, pin, &regcfg);
1337+
ret = regmap_read(info->pincfg,
1338+
pin * regmap_get_reg_stride(info->pincfg),
1339+
&regcfg);
13381340
if (ret)
13391341
return ret;
13401342

@@ -1366,14 +1368,18 @@ static int ocelot_pincfg_clrsetbits(struct ocelot_pinctrl *info, u32 regaddr,
13661368
u32 val;
13671369
int ret;
13681370

1369-
ret = regmap_read(info->pincfg, regaddr, &val);
1371+
ret = regmap_read(info->pincfg,
1372+
regaddr * regmap_get_reg_stride(info->pincfg),
1373+
&val);
13701374
if (ret)
13711375
return ret;
13721376

13731377
val &= ~clrbits;
13741378
val |= setbits;
13751379

1376-
ret = regmap_write(info->pincfg, regaddr, val);
1380+
ret = regmap_write(info->pincfg,
1381+
regaddr * regmap_get_reg_stride(info->pincfg),
1382+
val);
13771383

13781384
return ret;
13791385
}
@@ -1933,15 +1939,16 @@ static const struct of_device_id ocelot_pinctrl_of_match[] = {
19331939
{},
19341940
};
19351941

1936-
static struct regmap *ocelot_pinctrl_create_pincfg(struct platform_device *pdev)
1942+
static struct regmap *ocelot_pinctrl_create_pincfg(struct platform_device *pdev,
1943+
const struct ocelot_pinctrl *info)
19371944
{
19381945
void __iomem *base;
19391946

19401947
const struct regmap_config regmap_config = {
19411948
.reg_bits = 32,
19421949
.val_bits = 32,
19431950
.reg_stride = 4,
1944-
.max_register = 32,
1951+
.max_register = info->desc->npins * 4,
19451952
.name = "pincfg",
19461953
};
19471954

@@ -2009,7 +2016,7 @@ static int ocelot_pinctrl_probe(struct platform_device *pdev)
20092016

20102017
/* Pinconf registers */
20112018
if (info->desc->confops) {
2012-
pincfg = ocelot_pinctrl_create_pincfg(pdev);
2019+
pincfg = ocelot_pinctrl_create_pincfg(pdev, info);
20132020
if (IS_ERR(pincfg))
20142021
dev_dbg(dev, "Failed to create pincfg regmap\n");
20152022
else

0 commit comments

Comments
 (0)