| From 71324fdc72ef0163e57631aa814a9a81e9e4770b Mon Sep 17 00:00:00 2001 |
| From: Andrew Jeffery <andrew@aj.id.au> |
| Date: Wed, 20 Apr 2016 11:24:17 +0930 |
| Subject: pinctrl: exynos5440: Use off-stack memory for pinctrl_gpio_range |
| |
| From: Andrew Jeffery <andrew@aj.id.au> |
| |
| commit 71324fdc72ef0163e57631aa814a9a81e9e4770b upstream. |
| |
| The range is registered into a linked list which can be referenced |
| throughout the lifetime of the driver. Ensure the range's memory is useful |
| for the same lifetime by adding it to the driver's private data structure. |
| |
| The bug was introduced in the driver's initial commit, which was present in |
| v3.10. |
| |
| Fixes: f0b9a7e521fa ("pinctrl: exynos5440: add pinctrl driver for Samsung EXYNOS5440 SoC") |
| Signed-off-by: Andrew Jeffery <andrew@aj.id.au> |
| Acked-by: Tomasz Figa <tomasz.figa@gmail.com> |
| Reviewed-by: Krzysztof Kozlowski <k.kozlowski@samsung.com> |
| Signed-off-by: Linus Walleij <linus.walleij@linaro.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/pinctrl/samsung/pinctrl-exynos5440.c | 15 ++++++++------- |
| 1 file changed, 8 insertions(+), 7 deletions(-) |
| |
| --- a/drivers/pinctrl/samsung/pinctrl-exynos5440.c |
| +++ b/drivers/pinctrl/samsung/pinctrl-exynos5440.c |
| @@ -107,6 +107,7 @@ struct exynos5440_pmx_func { |
| * @nr_groups: number of pin groups available. |
| * @pmx_functions: list of pin functions parsed from device tree. |
| * @nr_functions: number of pin functions available. |
| + * @range: gpio range to register with pinctrl |
| */ |
| struct exynos5440_pinctrl_priv_data { |
| void __iomem *reg_base; |
| @@ -117,6 +118,7 @@ struct exynos5440_pinctrl_priv_data { |
| unsigned int nr_groups; |
| const struct exynos5440_pmx_func *pmx_functions; |
| unsigned int nr_functions; |
| + struct pinctrl_gpio_range range; |
| }; |
| |
| /** |
| @@ -742,7 +744,6 @@ static int exynos5440_pinctrl_register(s |
| struct pinctrl_desc *ctrldesc; |
| struct pinctrl_dev *pctl_dev; |
| struct pinctrl_pin_desc *pindesc, *pdesc; |
| - struct pinctrl_gpio_range grange; |
| char *pin_names; |
| int pin, ret; |
| |
| @@ -794,12 +795,12 @@ static int exynos5440_pinctrl_register(s |
| return PTR_ERR(pctl_dev); |
| } |
| |
| - grange.name = "exynos5440-pctrl-gpio-range"; |
| - grange.id = 0; |
| - grange.base = 0; |
| - grange.npins = EXYNOS5440_MAX_PINS; |
| - grange.gc = priv->gc; |
| - pinctrl_add_gpio_range(pctl_dev, &grange); |
| + priv->range.name = "exynos5440-pctrl-gpio-range"; |
| + priv->range.id = 0; |
| + priv->range.base = 0; |
| + priv->range.npins = EXYNOS5440_MAX_PINS; |
| + priv->range.gc = priv->gc; |
| + pinctrl_add_gpio_range(pctl_dev, &priv->range); |
| return 0; |
| } |
| |