Commit 3771834b authored by Hongzhou Yang's avatar Hongzhou Yang Committed by Greg Kroah-Hartman

pinctrl: mediatek: Fix multiple registration issue.

commit d48c2c02 upstream.

Since our common driver need support main chip and PMU
at the same time, that means it will register two
pinctrl device, and the pinctrl_desc structure should
be used two times.

But pinctrl_desc use global static definition, then
the latest registered pinctrl device will overwrite
the old one's, all members in pinctrl_desc will set to
the new one's, such as name, pins and pins numbers, etc.
This is a bug.

Move pinctrl_desc into mtk_pinctrl, assign new value for
each pinctrl device to fix it.
Signed-off-by: default avatarHongzhou Yang <hongzhou.yang@mediatek.com>
Reviewed-by: default avatarAxel Lin <axel.lin@ingics.com>
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent b626fbd4
...@@ -1202,12 +1202,6 @@ static int mtk_pctrl_build_state(struct platform_device *pdev) ...@@ -1202,12 +1202,6 @@ static int mtk_pctrl_build_state(struct platform_device *pdev)
return 0; return 0;
} }
static struct pinctrl_desc mtk_pctrl_desc = {
.confops = &mtk_pconf_ops,
.pctlops = &mtk_pctrl_ops,
.pmxops = &mtk_pmx_ops,
};
int mtk_pctrl_init(struct platform_device *pdev, int mtk_pctrl_init(struct platform_device *pdev,
const struct mtk_pinctrl_devdata *data, const struct mtk_pinctrl_devdata *data,
struct regmap *regmap) struct regmap *regmap)
...@@ -1265,12 +1259,17 @@ int mtk_pctrl_init(struct platform_device *pdev, ...@@ -1265,12 +1259,17 @@ int mtk_pctrl_init(struct platform_device *pdev,
for (i = 0; i < pctl->devdata->npins; i++) for (i = 0; i < pctl->devdata->npins; i++)
pins[i] = pctl->devdata->pins[i].pin; pins[i] = pctl->devdata->pins[i].pin;
mtk_pctrl_desc.name = dev_name(&pdev->dev);
mtk_pctrl_desc.owner = THIS_MODULE; pctl->pctl_desc.name = dev_name(&pdev->dev);
mtk_pctrl_desc.pins = pins; pctl->pctl_desc.owner = THIS_MODULE;
mtk_pctrl_desc.npins = pctl->devdata->npins; pctl->pctl_desc.pins = pins;
pctl->pctl_desc.npins = pctl->devdata->npins;
pctl->pctl_desc.confops = &mtk_pconf_ops;
pctl->pctl_desc.pctlops = &mtk_pctrl_ops;
pctl->pctl_desc.pmxops = &mtk_pmx_ops;
pctl->dev = &pdev->dev; pctl->dev = &pdev->dev;
pctl->pctl_dev = pinctrl_register(&mtk_pctrl_desc, &pdev->dev, pctl);
pctl->pctl_dev = pinctrl_register(&pctl->pctl_desc, &pdev->dev, pctl);
if (IS_ERR(pctl->pctl_dev)) { if (IS_ERR(pctl->pctl_dev)) {
dev_err(&pdev->dev, "couldn't register pinctrl driver\n"); dev_err(&pdev->dev, "couldn't register pinctrl driver\n");
return PTR_ERR(pctl->pctl_dev); return PTR_ERR(pctl->pctl_dev);
......
...@@ -256,6 +256,7 @@ struct mtk_pinctrl_devdata { ...@@ -256,6 +256,7 @@ struct mtk_pinctrl_devdata {
struct mtk_pinctrl { struct mtk_pinctrl {
struct regmap *regmap1; struct regmap *regmap1;
struct regmap *regmap2; struct regmap *regmap2;
struct pinctrl_desc pctl_desc;
struct device *dev; struct device *dev;
struct gpio_chip *chip; struct gpio_chip *chip;
struct mtk_pinctrl_group *groups; struct mtk_pinctrl_group *groups;
......
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