Skip to content

Commit

Permalink
pinctrl: ocelot: Fix pincfg
Browse files Browse the repository at this point in the history
[ Upstream commit ba9c474 ]

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>
Signed-off-by: Sasha Levin <sashal@kernel.org>
  • Loading branch information
HoratiuVultur authored and gregkh committed Jul 29, 2022
1 parent 96a8a80 commit b20ead0
Showing 1 changed file with 13 additions and 6 deletions.
19 changes: 13 additions & 6 deletions drivers/pinctrl/pinctrl-ocelot.c
Original file line number Diff line number Diff line change
Expand Up @@ -1327,7 +1327,9 @@ static int ocelot_hw_get_value(struct ocelot_pinctrl *info,
const struct ocelot_pincfg_data *opd = info->pincfg_data;
u32 regcfg;

ret = regmap_read(info->pincfg, pin, &regcfg);
ret = regmap_read(info->pincfg,
pin * regmap_get_reg_stride(info->pincfg),
&regcfg);
if (ret)
return ret;

Expand Down Expand Up @@ -1359,14 +1361,18 @@ static int ocelot_pincfg_clrsetbits(struct ocelot_pinctrl *info, u32 regaddr,
u32 val;
int ret;

ret = regmap_read(info->pincfg, regaddr, &val);
ret = regmap_read(info->pincfg,
regaddr * regmap_get_reg_stride(info->pincfg),
&val);
if (ret)
return ret;

val &= ~clrbits;
val |= setbits;

ret = regmap_write(info->pincfg, regaddr, val);
ret = regmap_write(info->pincfg,
regaddr * regmap_get_reg_stride(info->pincfg),
val);

return ret;
}
Expand Down Expand Up @@ -1926,15 +1932,16 @@ static const struct of_device_id ocelot_pinctrl_of_match[] = {
{},
};

static struct regmap *ocelot_pinctrl_create_pincfg(struct platform_device *pdev)
static struct regmap *ocelot_pinctrl_create_pincfg(struct platform_device *pdev,
const struct ocelot_pinctrl *info)
{
void __iomem *base;

const struct regmap_config regmap_config = {
.reg_bits = 32,
.val_bits = 32,
.reg_stride = 4,
.max_register = 32,
.max_register = info->desc->npins * 4,
.name = "pincfg",
};

Expand Down Expand Up @@ -1995,7 +2002,7 @@ static int ocelot_pinctrl_probe(struct platform_device *pdev)

/* Pinconf registers */
if (info->desc->confops) {
pincfg = ocelot_pinctrl_create_pincfg(pdev);
pincfg = ocelot_pinctrl_create_pincfg(pdev, info);
if (IS_ERR(pincfg))
dev_dbg(dev, "Failed to create pincfg regmap\n");
else
Expand Down

0 comments on commit b20ead0

Please sign in to comment.