summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeng Fan <peng.fan@nxp.com>2016-05-16 12:56:44 +0800
committerPeng Fan <peng.fan@nxp.com>2016-05-24 09:22:14 +0800
commit7b3c3142157d8faa09788cfd7b64cd5c5d741370 (patch)
tree3a138ce040d4d9a030db653e00dd9596ac24c0ce
parent1c60143f43252a1c5cc94b600ed32fcd0c74648c (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.c27
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;