diff options
author | Peng Fan <peng.fan@nxp.com> | 2016-05-16 12:56:44 +0800 |
---|---|---|
committer | Peng Fan <peng.fan@nxp.com> | 2016-05-24 09:22:14 +0800 |
commit | 7b3c3142157d8faa09788cfd7b64cd5c5d741370 (patch) | |
tree | 3a138ce040d4d9a030db653e00dd9596ac24c0ce | |
parent | 1c60143f43252a1c5cc94b600ed32fcd0c74648c (diff) |
MLK-12795 pinctrl: imx: fix initialization of imx_pinctrl_desc
To i.MX7D and i.MX6ULL, we need to support multiple iomux controller,
but we only have one imx_pinctrl_desc with type static. This means
different iomux controller share one imx_pinctrl_desc variable.
The value filled into imx_pinctrl_desc when probing the first iomuxc
node will be overriden when probing the second one.
This will incur errors, such as
'mx7d-pinctrl 30330000.iomuxc: could not map pin config for
"MX7D_PAD_LCD_DATA00"'
In this patch, dynamically allocate imx_pinctrl_desc for each iomux
controller to fix the issue.
Signed-off-by: Peng Fan <peng.fan@nxp.com>
(cherry picked from commit 355b1f2153463bf838e928ffcab871e32cc5081f)
-rw-r--r-- | drivers/pinctrl/freescale/pinctrl-imx.c | 27 |
1 files changed, 15 insertions, 12 deletions
diff --git a/drivers/pinctrl/freescale/pinctrl-imx.c b/drivers/pinctrl/freescale/pinctrl-imx.c index f3644cf4aa3a..9613856e3a09 100644 --- a/drivers/pinctrl/freescale/pinctrl-imx.c +++ b/drivers/pinctrl/freescale/pinctrl-imx.c @@ -1,7 +1,7 @@ /* * Core driver for the imx pin controller * - * Copyright (C) 2012-2015 Freescale Semiconductor, Inc. + * Copyright (C) 2012-2016 Freescale Semiconductor, Inc. * Copyright (C) 2012 Linaro Ltd. * * Author: Dong Aisheng <dong.aisheng@linaro.org> @@ -485,13 +485,6 @@ static const struct pinconf_ops imx_pinconf_ops = { .pin_config_group_dbg_show = imx_pinconf_group_dbg_show, }; -static struct pinctrl_desc imx_pinctrl_desc = { - .pctlops = &imx_pctrl_ops, - .pmxops = &imx_pmx_ops, - .confops = &imx_pinconf_ops, - .owner = THIS_MODULE, -}; - /* * Each pin represented in fsl,pins consists of 5 u32 PIN_FUNC_ID and * 1 u32 CONFIG, so 24 types in total for each pin. @@ -659,6 +652,7 @@ int imx_pinctrl_probe(struct platform_device *pdev, struct device_node *np; struct imx_pinctrl *ipctl; struct resource *res; + struct pinctrl_desc *imx_pinctrl_desc; int ret, i; if (!info || !info->pins || !info->npins) { @@ -667,6 +661,11 @@ int imx_pinctrl_probe(struct platform_device *pdev, } info->dev = &pdev->dev; + imx_pinctrl_desc = devm_kzalloc(&pdev->dev, sizeof(*imx_pinctrl_desc), + GFP_KERNEL); + if (!imx_pinctrl_desc) + return -ENOMEM; + /* Create state holders etc for this driver */ ipctl = devm_kzalloc(&pdev->dev, sizeof(*ipctl), GFP_KERNEL); if (!ipctl) @@ -704,9 +703,13 @@ int imx_pinctrl_probe(struct platform_device *pdev, of_node_put(np); } - imx_pinctrl_desc.name = dev_name(&pdev->dev); - imx_pinctrl_desc.pins = info->pins; - imx_pinctrl_desc.npins = info->npins; + imx_pinctrl_desc->name = dev_name(&pdev->dev); + imx_pinctrl_desc->pins = info->pins; + imx_pinctrl_desc->npins = info->npins; + imx_pinctrl_desc->pctlops = &imx_pctrl_ops; + imx_pinctrl_desc->pmxops = &imx_pmx_ops; + imx_pinctrl_desc->confops = &imx_pinconf_ops; + imx_pinctrl_desc->owner = THIS_MODULE; ret = imx_pinctrl_probe_dt(pdev, info); if (ret) { @@ -717,7 +720,7 @@ int imx_pinctrl_probe(struct platform_device *pdev, ipctl->info = info; ipctl->dev = info->dev; platform_set_drvdata(pdev, ipctl); - ipctl->pctl = pinctrl_register(&imx_pinctrl_desc, &pdev->dev, ipctl); + ipctl->pctl = pinctrl_register(imx_pinctrl_desc, &pdev->dev, ipctl); if (!ipctl->pctl) { dev_err(&pdev->dev, "could not register IMX pinctrl driver\n"); return -EINVAL; |