diff options
Diffstat (limited to 'drivers/pinctrl/freescale')
-rw-r--r-- | drivers/pinctrl/freescale/pinctrl-imx.c | 72 | ||||
-rw-r--r-- | drivers/pinctrl/freescale/pinctrl-imx1.c | 1 | ||||
-rw-r--r-- | drivers/pinctrl/freescale/pinctrl-imx21.c | 1 | ||||
-rw-r--r-- | drivers/pinctrl/freescale/pinctrl-imx23.c | 1 | ||||
-rw-r--r-- | drivers/pinctrl/freescale/pinctrl-imx25.c | 1 | ||||
-rw-r--r-- | drivers/pinctrl/freescale/pinctrl-imx27.c | 1 | ||||
-rw-r--r-- | drivers/pinctrl/freescale/pinctrl-imx28.c | 1 | ||||
-rw-r--r-- | drivers/pinctrl/freescale/pinctrl-imx35.c | 1 | ||||
-rw-r--r-- | drivers/pinctrl/freescale/pinctrl-imx50.c | 1 | ||||
-rw-r--r-- | drivers/pinctrl/freescale/pinctrl-imx51.c | 1 | ||||
-rw-r--r-- | drivers/pinctrl/freescale/pinctrl-imx53.c | 1 | ||||
-rw-r--r-- | drivers/pinctrl/freescale/pinctrl-imx6dl.c | 1 | ||||
-rw-r--r-- | drivers/pinctrl/freescale/pinctrl-imx6q.c | 1 | ||||
-rw-r--r-- | drivers/pinctrl/freescale/pinctrl-imx6sl.c | 1 | ||||
-rw-r--r-- | drivers/pinctrl/freescale/pinctrl-imx6sx.c | 1 | ||||
-rw-r--r-- | drivers/pinctrl/freescale/pinctrl-mxs.c | 25 | ||||
-rw-r--r-- | drivers/pinctrl/freescale/pinctrl-vf610.c | 1 |
17 files changed, 97 insertions, 15 deletions
diff --git a/drivers/pinctrl/freescale/pinctrl-imx.c b/drivers/pinctrl/freescale/pinctrl-imx.c index f2446769247f..52f2b9404fe0 100644 --- a/drivers/pinctrl/freescale/pinctrl-imx.c +++ b/drivers/pinctrl/freescale/pinctrl-imx.c @@ -294,11 +294,83 @@ static int imx_pmx_get_groups(struct pinctrl_dev *pctldev, unsigned selector, return 0; } +static int imx_pmx_gpio_request_enable(struct pinctrl_dev *pctldev, + struct pinctrl_gpio_range *range, unsigned offset) +{ + struct imx_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev); + const struct imx_pinctrl_soc_info *info = ipctl->info; + const struct imx_pin_reg *pin_reg; + struct imx_pin_group *grp; + struct imx_pin *imx_pin; + unsigned int pin, group; + u32 reg; + + /* Currently implementation only for shared mux/conf register */ + if (!(info->flags & SHARE_MUX_CONF_REG)) + return -EINVAL; + + pin_reg = &info->pin_regs[offset]; + if (pin_reg->mux_reg == -1) + return -EINVAL; + + /* Find the pinctrl config with GPIO mux mode for the requested pin */ + for (group = 0; group < info->ngroups; group++) { + grp = &info->groups[group]; + for (pin = 0; pin < grp->npins; pin++) { + imx_pin = &grp->pins[pin]; + if (imx_pin->pin == offset && !imx_pin->mux_mode) + goto mux_pin; + } + } + + return -EINVAL; + +mux_pin: + reg = readl(ipctl->base + pin_reg->mux_reg); + reg &= ~(0x7 << 20); + reg |= imx_pin->config; + writel(reg, ipctl->base + pin_reg->mux_reg); + + return 0; +} + +static int imx_pmx_gpio_set_direction(struct pinctrl_dev *pctldev, + struct pinctrl_gpio_range *range, unsigned offset, bool input) +{ + struct imx_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev); + const struct imx_pinctrl_soc_info *info = ipctl->info; + const struct imx_pin_reg *pin_reg; + u32 reg; + + /* + * Only Vybrid has the input/output buffer enable flags (IBE/OBE) + * They are part of the shared mux/conf register. + */ + if (!(info->flags & SHARE_MUX_CONF_REG)) + return -EINVAL; + + pin_reg = &info->pin_regs[offset]; + if (pin_reg->mux_reg == -1) + return -EINVAL; + + /* IBE always enabled allows us to read the value "on the wire" */ + reg = readl(ipctl->base + pin_reg->mux_reg); + if (input) + reg &= ~0x2; + else + reg |= 0x2; + writel(reg, ipctl->base + pin_reg->mux_reg); + + return 0; +} + static const struct pinmux_ops imx_pmx_ops = { .get_functions_count = imx_pmx_get_funcs_count, .get_function_name = imx_pmx_get_func_name, .get_function_groups = imx_pmx_get_groups, .set_mux = imx_pmx_set, + .gpio_request_enable = imx_pmx_gpio_request_enable, + .gpio_set_direction = imx_pmx_gpio_set_direction, }; static int imx_pinconf_get(struct pinctrl_dev *pctldev, diff --git a/drivers/pinctrl/freescale/pinctrl-imx1.c b/drivers/pinctrl/freescale/pinctrl-imx1.c index 533a6e519648..d3bacb7d6d37 100644 --- a/drivers/pinctrl/freescale/pinctrl-imx1.c +++ b/drivers/pinctrl/freescale/pinctrl-imx1.c @@ -267,7 +267,6 @@ MODULE_DEVICE_TABLE(of, imx1_pinctrl_of_match); static struct platform_driver imx1_pinctrl_driver = { .driver = { .name = "imx1-pinctrl", - .owner = THIS_MODULE, .of_match_table = imx1_pinctrl_of_match, }, .remove = imx1_pinctrl_core_remove, diff --git a/drivers/pinctrl/freescale/pinctrl-imx21.c b/drivers/pinctrl/freescale/pinctrl-imx21.c index 1b3b2311b033..9d9aca3dbd7e 100644 --- a/drivers/pinctrl/freescale/pinctrl-imx21.c +++ b/drivers/pinctrl/freescale/pinctrl-imx21.c @@ -330,7 +330,6 @@ MODULE_DEVICE_TABLE(of, imx21_pinctrl_of_match); static struct platform_driver imx21_pinctrl_driver = { .driver = { .name = "imx21-pinctrl", - .owner = THIS_MODULE, .of_match_table = imx21_pinctrl_of_match, }, .remove = imx1_pinctrl_core_remove, diff --git a/drivers/pinctrl/freescale/pinctrl-imx23.c b/drivers/pinctrl/freescale/pinctrl-imx23.c index df79096becb0..955cbf4f094f 100644 --- a/drivers/pinctrl/freescale/pinctrl-imx23.c +++ b/drivers/pinctrl/freescale/pinctrl-imx23.c @@ -281,7 +281,6 @@ MODULE_DEVICE_TABLE(of, imx23_pinctrl_of_match); static struct platform_driver imx23_pinctrl_driver = { .driver = { .name = "imx23-pinctrl", - .owner = THIS_MODULE, .of_match_table = imx23_pinctrl_of_match, }, .probe = imx23_pinctrl_probe, diff --git a/drivers/pinctrl/freescale/pinctrl-imx25.c b/drivers/pinctrl/freescale/pinctrl-imx25.c index 550e6d77ac2b..8d1013a040c9 100644 --- a/drivers/pinctrl/freescale/pinctrl-imx25.c +++ b/drivers/pinctrl/freescale/pinctrl-imx25.c @@ -328,7 +328,6 @@ static int imx25_pinctrl_probe(struct platform_device *pdev) static struct platform_driver imx25_pinctrl_driver = { .driver = { .name = "imx25-pinctrl", - .owner = THIS_MODULE, .of_match_table = of_match_ptr(imx25_pinctrl_of_match), }, .probe = imx25_pinctrl_probe, diff --git a/drivers/pinctrl/freescale/pinctrl-imx27.c b/drivers/pinctrl/freescale/pinctrl-imx27.c index 945eccadea74..a461d5881f37 100644 --- a/drivers/pinctrl/freescale/pinctrl-imx27.c +++ b/drivers/pinctrl/freescale/pinctrl-imx27.c @@ -402,7 +402,6 @@ static int imx27_pinctrl_probe(struct platform_device *pdev) static struct platform_driver imx27_pinctrl_driver = { .driver = { .name = "imx27-pinctrl", - .owner = THIS_MODULE, .of_match_table = of_match_ptr(imx27_pinctrl_of_match), }, .probe = imx27_pinctrl_probe, diff --git a/drivers/pinctrl/freescale/pinctrl-imx28.c b/drivers/pinctrl/freescale/pinctrl-imx28.c index 3bd45da21229..5082efec4f72 100644 --- a/drivers/pinctrl/freescale/pinctrl-imx28.c +++ b/drivers/pinctrl/freescale/pinctrl-imx28.c @@ -397,7 +397,6 @@ MODULE_DEVICE_TABLE(of, imx28_pinctrl_of_match); static struct platform_driver imx28_pinctrl_driver = { .driver = { .name = "imx28-pinctrl", - .owner = THIS_MODULE, .of_match_table = imx28_pinctrl_of_match, }, .probe = imx28_pinctrl_probe, diff --git a/drivers/pinctrl/freescale/pinctrl-imx35.c b/drivers/pinctrl/freescale/pinctrl-imx35.c index 6bfbcd0112c1..9109c10c5dab 100644 --- a/drivers/pinctrl/freescale/pinctrl-imx35.c +++ b/drivers/pinctrl/freescale/pinctrl-imx35.c @@ -1018,7 +1018,6 @@ static int imx35_pinctrl_probe(struct platform_device *pdev) static struct platform_driver imx35_pinctrl_driver = { .driver = { .name = "imx35-pinctrl", - .owner = THIS_MODULE, .of_match_table = imx35_pinctrl_of_match, }, .probe = imx35_pinctrl_probe, diff --git a/drivers/pinctrl/freescale/pinctrl-imx50.c b/drivers/pinctrl/freescale/pinctrl-imx50.c index e8bd604ab147..51b31df96273 100644 --- a/drivers/pinctrl/freescale/pinctrl-imx50.c +++ b/drivers/pinctrl/freescale/pinctrl-imx50.c @@ -404,7 +404,6 @@ static int imx50_pinctrl_probe(struct platform_device *pdev) static struct platform_driver imx50_pinctrl_driver = { .driver = { .name = "imx50-pinctrl", - .owner = THIS_MODULE, .of_match_table = of_match_ptr(imx50_pinctrl_of_match), }, .probe = imx50_pinctrl_probe, diff --git a/drivers/pinctrl/freescale/pinctrl-imx51.c b/drivers/pinctrl/freescale/pinctrl-imx51.c index b818051db7c9..8dec494aa2c6 100644 --- a/drivers/pinctrl/freescale/pinctrl-imx51.c +++ b/drivers/pinctrl/freescale/pinctrl-imx51.c @@ -781,7 +781,6 @@ static int imx51_pinctrl_probe(struct platform_device *pdev) static struct platform_driver imx51_pinctrl_driver = { .driver = { .name = "imx51-pinctrl", - .owner = THIS_MODULE, .of_match_table = imx51_pinctrl_of_match, }, .probe = imx51_pinctrl_probe, diff --git a/drivers/pinctrl/freescale/pinctrl-imx53.c b/drivers/pinctrl/freescale/pinctrl-imx53.c index 1884d53cf750..7344d340013c 100644 --- a/drivers/pinctrl/freescale/pinctrl-imx53.c +++ b/drivers/pinctrl/freescale/pinctrl-imx53.c @@ -467,7 +467,6 @@ static int imx53_pinctrl_probe(struct platform_device *pdev) static struct platform_driver imx53_pinctrl_driver = { .driver = { .name = "imx53-pinctrl", - .owner = THIS_MODULE, .of_match_table = imx53_pinctrl_of_match, }, .probe = imx53_pinctrl_probe, diff --git a/drivers/pinctrl/freescale/pinctrl-imx6dl.c b/drivers/pinctrl/freescale/pinctrl-imx6dl.c index 656c4b08cc2e..6805c678c3b2 100644 --- a/drivers/pinctrl/freescale/pinctrl-imx6dl.c +++ b/drivers/pinctrl/freescale/pinctrl-imx6dl.c @@ -473,7 +473,6 @@ static int imx6dl_pinctrl_probe(struct platform_device *pdev) static struct platform_driver imx6dl_pinctrl_driver = { .driver = { .name = "imx6dl-pinctrl", - .owner = THIS_MODULE, .of_match_table = imx6dl_pinctrl_of_match, }, .probe = imx6dl_pinctrl_probe, diff --git a/drivers/pinctrl/freescale/pinctrl-imx6q.c b/drivers/pinctrl/freescale/pinctrl-imx6q.c index 59bb5b4ec0f6..4d1fcb861ac1 100644 --- a/drivers/pinctrl/freescale/pinctrl-imx6q.c +++ b/drivers/pinctrl/freescale/pinctrl-imx6q.c @@ -479,7 +479,6 @@ static int imx6q_pinctrl_probe(struct platform_device *pdev) static struct platform_driver imx6q_pinctrl_driver = { .driver = { .name = "imx6q-pinctrl", - .owner = THIS_MODULE, .of_match_table = imx6q_pinctrl_of_match, }, .probe = imx6q_pinctrl_probe, diff --git a/drivers/pinctrl/freescale/pinctrl-imx6sl.c b/drivers/pinctrl/freescale/pinctrl-imx6sl.c index e0924bd7b98c..83fa5f19ae89 100644 --- a/drivers/pinctrl/freescale/pinctrl-imx6sl.c +++ b/drivers/pinctrl/freescale/pinctrl-imx6sl.c @@ -380,7 +380,6 @@ static int imx6sl_pinctrl_probe(struct platform_device *pdev) static struct platform_driver imx6sl_pinctrl_driver = { .driver = { .name = "imx6sl-pinctrl", - .owner = THIS_MODULE, .of_match_table = imx6sl_pinctrl_of_match, }, .probe = imx6sl_pinctrl_probe, diff --git a/drivers/pinctrl/freescale/pinctrl-imx6sx.c b/drivers/pinctrl/freescale/pinctrl-imx6sx.c index 840344c8580d..0d78fe690818 100644 --- a/drivers/pinctrl/freescale/pinctrl-imx6sx.c +++ b/drivers/pinctrl/freescale/pinctrl-imx6sx.c @@ -383,7 +383,6 @@ static int imx6sx_pinctrl_probe(struct platform_device *pdev) static struct platform_driver imx6sx_pinctrl_driver = { .driver = { .name = "imx6sx-pinctrl", - .owner = THIS_MODULE, .of_match_table = of_match_ptr(imx6sx_pinctrl_of_match), }, .probe = imx6sx_pinctrl_probe, diff --git a/drivers/pinctrl/freescale/pinctrl-mxs.c b/drivers/pinctrl/freescale/pinctrl-mxs.c index f98c6bb0f769..646d5c244af1 100644 --- a/drivers/pinctrl/freescale/pinctrl-mxs.c +++ b/drivers/pinctrl/freescale/pinctrl-mxs.c @@ -445,6 +445,31 @@ static int mxs_pinctrl_probe_dt(struct platform_device *pdev, if (of_property_read_u32(child, "reg", &val)) continue; if (strcmp(fn, child->name)) { + struct device_node *child2; + + /* + * This reference is dropped by + * of_get_next_child(np, * child) + */ + of_node_get(child); + + /* + * The logic parsing the functions from dt currently + * doesn't handle if functions with the same name are + * not grouped together. Only the first contiguous + * cluster is usable for each function name. This is a + * bug that is not trivial to fix, but at least warn + * about it. + */ + for (child2 = of_get_next_child(np, child); + child2 != NULL; + child2 = of_get_next_child(np, child2)) { + if (!strcmp(child2->name, fn)) + dev_warn(&pdev->dev, + "function nodes must be grouped by name (failed for: %s)", + fn); + } + f = &soc->functions[idxf++]; f->name = fn = child->name; } diff --git a/drivers/pinctrl/freescale/pinctrl-vf610.c b/drivers/pinctrl/freescale/pinctrl-vf610.c index b788e1578954..fc86276892fd 100644 --- a/drivers/pinctrl/freescale/pinctrl-vf610.c +++ b/drivers/pinctrl/freescale/pinctrl-vf610.c @@ -315,7 +315,6 @@ static int vf610_pinctrl_probe(struct platform_device *pdev) static struct platform_driver vf610_pinctrl_driver = { .driver = { .name = "vf610-pinctrl", - .owner = THIS_MODULE, .of_match_table = vf610_pinctrl_of_match, }, .probe = vf610_pinctrl_probe, |