aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHongzhou Yang <hongzhou.yang@mediatek.com>2015-08-25 20:32:45 -0400
committerLinus Walleij <linus.walleij@linaro.org>2015-08-26 08:37:44 -0400
commitd48c2c02645392483f2b88b050d21ce1db6997b3 (patch)
tree2d8066941940c7ebbe422ecb434df8d04af5f6d5
parent580a7ee93317b901358f497c2de34f7a66066963 (diff)
pinctrl: mediatek: Fix multiple registration issue.
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. Cc: stable@vger.kernel.org # v4.1+ Signed-off-by: Hongzhou Yang <hongzhou.yang@mediatek.com> Reviewed-by: Axel Lin <axel.lin@ingics.com> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
-rw-r--r--drivers/pinctrl/mediatek/pinctrl-mtk-common.c21
-rw-r--r--drivers/pinctrl/mediatek/pinctrl-mtk-common.h1
2 files changed, 11 insertions, 11 deletions
diff --git a/drivers/pinctrl/mediatek/pinctrl-mtk-common.c b/drivers/pinctrl/mediatek/pinctrl-mtk-common.c
index 23f2de07f598..f6cdeee6e63b 100644
--- a/drivers/pinctrl/mediatek/pinctrl-mtk-common.c
+++ b/drivers/pinctrl/mediatek/pinctrl-mtk-common.c
@@ -1202,12 +1202,6 @@ static int mtk_pctrl_build_state(struct platform_device *pdev)
1202 return 0; 1202 return 0;
1203} 1203}
1204 1204
1205static struct pinctrl_desc mtk_pctrl_desc = {
1206 .confops = &mtk_pconf_ops,
1207 .pctlops = &mtk_pctrl_ops,
1208 .pmxops = &mtk_pmx_ops,
1209};
1210
1211int mtk_pctrl_init(struct platform_device *pdev, 1205int mtk_pctrl_init(struct platform_device *pdev,
1212 const struct mtk_pinctrl_devdata *data, 1206 const struct mtk_pinctrl_devdata *data,
1213 struct regmap *regmap) 1207 struct regmap *regmap)
@@ -1265,12 +1259,17 @@ int mtk_pctrl_init(struct platform_device *pdev,
1265 1259
1266 for (i = 0; i < pctl->devdata->npins; i++) 1260 for (i = 0; i < pctl->devdata->npins; i++)
1267 pins[i] = pctl->devdata->pins[i].pin; 1261 pins[i] = pctl->devdata->pins[i].pin;
1268 mtk_pctrl_desc.name = dev_name(&pdev->dev); 1262
1269 mtk_pctrl_desc.owner = THIS_MODULE; 1263 pctl->pctl_desc.name = dev_name(&pdev->dev);
1270 mtk_pctrl_desc.pins = pins; 1264 pctl->pctl_desc.owner = THIS_MODULE;
1271 mtk_pctrl_desc.npins = pctl->devdata->npins; 1265 pctl->pctl_desc.pins = pins;
1266 pctl->pctl_desc.npins = pctl->devdata->npins;
1267 pctl->pctl_desc.confops = &mtk_pconf_ops;
1268 pctl->pctl_desc.pctlops = &mtk_pctrl_ops;
1269 pctl->pctl_desc.pmxops = &mtk_pmx_ops;
1272 pctl->dev = &pdev->dev; 1270 pctl->dev = &pdev->dev;
1273 pctl->pctl_dev = pinctrl_register(&mtk_pctrl_desc, &pdev->dev, pctl); 1271
1272 pctl->pctl_dev = pinctrl_register(&pctl->pctl_desc, &pdev->dev, pctl);
1274 if (IS_ERR(pctl->pctl_dev)) { 1273 if (IS_ERR(pctl->pctl_dev)) {
1275 dev_err(&pdev->dev, "couldn't register pinctrl driver\n"); 1274 dev_err(&pdev->dev, "couldn't register pinctrl driver\n");
1276 return PTR_ERR(pctl->pctl_dev); 1275 return PTR_ERR(pctl->pctl_dev);
diff --git a/drivers/pinctrl/mediatek/pinctrl-mtk-common.h b/drivers/pinctrl/mediatek/pinctrl-mtk-common.h
index 30213e514c2f..c532c23c70b4 100644
--- a/drivers/pinctrl/mediatek/pinctrl-mtk-common.h
+++ b/drivers/pinctrl/mediatek/pinctrl-mtk-common.h
@@ -256,6 +256,7 @@ struct mtk_pinctrl_devdata {
256struct mtk_pinctrl { 256struct mtk_pinctrl {
257 struct regmap *regmap1; 257 struct regmap *regmap1;
258 struct regmap *regmap2; 258 struct regmap *regmap2;
259 struct pinctrl_desc pctl_desc;
259 struct device *dev; 260 struct device *dev;
260 struct gpio_chip *chip; 261 struct gpio_chip *chip;
261 struct mtk_pinctrl_group *groups; 262 struct mtk_pinctrl_group *groups;