diff options
author | Hongzhou Yang <hongzhou.yang@mediatek.com> | 2015-08-25 20:32:45 -0400 |
---|---|---|
committer | Linus Walleij <linus.walleij@linaro.org> | 2015-08-26 08:37:44 -0400 |
commit | d48c2c02645392483f2b88b050d21ce1db6997b3 (patch) | |
tree | 2d8066941940c7ebbe422ecb434df8d04af5f6d5 | |
parent | 580a7ee93317b901358f497c2de34f7a66066963 (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.c | 21 | ||||
-rw-r--r-- | drivers/pinctrl/mediatek/pinctrl-mtk-common.h | 1 |
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 | ||
1205 | static struct pinctrl_desc mtk_pctrl_desc = { | ||
1206 | .confops = &mtk_pconf_ops, | ||
1207 | .pctlops = &mtk_pctrl_ops, | ||
1208 | .pmxops = &mtk_pmx_ops, | ||
1209 | }; | ||
1210 | |||
1211 | int mtk_pctrl_init(struct platform_device *pdev, | 1205 | int 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 { | |||
256 | struct mtk_pinctrl { | 256 | struct 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; |