Skip to content

Commit 7b3c314

Browse files
committed
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 <[email protected]> (cherry picked from commit 355b1f2153463bf838e928ffcab871e32cc5081f)
1 parent 1c60143 commit 7b3c314

File tree

1 file changed

+15
-12
lines changed

1 file changed

+15
-12
lines changed

drivers/pinctrl/freescale/pinctrl-imx.c

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/*
22
* Core driver for the imx pin controller
33
*
4-
* Copyright (C) 2012-2015 Freescale Semiconductor, Inc.
4+
* Copyright (C) 2012-2016 Freescale Semiconductor, Inc.
55
* Copyright (C) 2012 Linaro Ltd.
66
*
77
* Author: Dong Aisheng <[email protected]>
@@ -485,13 +485,6 @@ static const struct pinconf_ops imx_pinconf_ops = {
485485
.pin_config_group_dbg_show = imx_pinconf_group_dbg_show,
486486
};
487487

488-
static struct pinctrl_desc imx_pinctrl_desc = {
489-
.pctlops = &imx_pctrl_ops,
490-
.pmxops = &imx_pmx_ops,
491-
.confops = &imx_pinconf_ops,
492-
.owner = THIS_MODULE,
493-
};
494-
495488
/*
496489
* Each pin represented in fsl,pins consists of 5 u32 PIN_FUNC_ID and
497490
* 1 u32 CONFIG, so 24 types in total for each pin.
@@ -659,6 +652,7 @@ int imx_pinctrl_probe(struct platform_device *pdev,
659652
struct device_node *np;
660653
struct imx_pinctrl *ipctl;
661654
struct resource *res;
655+
struct pinctrl_desc *imx_pinctrl_desc;
662656
int ret, i;
663657

664658
if (!info || !info->pins || !info->npins) {
@@ -667,6 +661,11 @@ int imx_pinctrl_probe(struct platform_device *pdev,
667661
}
668662
info->dev = &pdev->dev;
669663

664+
imx_pinctrl_desc = devm_kzalloc(&pdev->dev, sizeof(*imx_pinctrl_desc),
665+
GFP_KERNEL);
666+
if (!imx_pinctrl_desc)
667+
return -ENOMEM;
668+
670669
/* Create state holders etc for this driver */
671670
ipctl = devm_kzalloc(&pdev->dev, sizeof(*ipctl), GFP_KERNEL);
672671
if (!ipctl)
@@ -704,9 +703,13 @@ int imx_pinctrl_probe(struct platform_device *pdev,
704703
of_node_put(np);
705704
}
706705

707-
imx_pinctrl_desc.name = dev_name(&pdev->dev);
708-
imx_pinctrl_desc.pins = info->pins;
709-
imx_pinctrl_desc.npins = info->npins;
706+
imx_pinctrl_desc->name = dev_name(&pdev->dev);
707+
imx_pinctrl_desc->pins = info->pins;
708+
imx_pinctrl_desc->npins = info->npins;
709+
imx_pinctrl_desc->pctlops = &imx_pctrl_ops;
710+
imx_pinctrl_desc->pmxops = &imx_pmx_ops;
711+
imx_pinctrl_desc->confops = &imx_pinconf_ops;
712+
imx_pinctrl_desc->owner = THIS_MODULE;
710713

711714
ret = imx_pinctrl_probe_dt(pdev, info);
712715
if (ret) {
@@ -717,7 +720,7 @@ int imx_pinctrl_probe(struct platform_device *pdev,
717720
ipctl->info = info;
718721
ipctl->dev = info->dev;
719722
platform_set_drvdata(pdev, ipctl);
720-
ipctl->pctl = pinctrl_register(&imx_pinctrl_desc, &pdev->dev, ipctl);
723+
ipctl->pctl = pinctrl_register(imx_pinctrl_desc, &pdev->dev, ipctl);
721724
if (!ipctl->pctl) {
722725
dev_err(&pdev->dev, "could not register IMX pinctrl driver\n");
723726
return -EINVAL;

0 commit comments

Comments
 (0)