[RFC 2/8] gpio: mxc: Support for initialization as submodule
Shawn Guo
shawn.guo at linaro.org
Mon Jul 29 23:43:57 EDT 2013
On Sat, Jul 27, 2013 at 05:26:42PM +0200, Markus Pargmann wrote:
> On imx27 and imx21, there is no clear seperation between iomux control
> registers and GPIO data registers. For easier pingroup definitions, the
> gpio drivers will be initialized as subnodes of the iomux controller. It
> is necessary to share the registers between iomux and gpio.
>
> This patch adds support to pass a register memory region via platform
> data.
>
> Signed-off-by: Markus Pargmann <mpa at pengutronix.de>
> ---
> drivers/gpio/gpio-mxc.c | 35 +++++++++++++++++++----------------
> include/linux/gpio-mxc.h | 17 +++++++++++++++++
> 2 files changed, 36 insertions(+), 16 deletions(-)
> create mode 100644 include/linux/gpio-mxc.h
Since the header is created only for holding platform_data, we should
probably put it into include/linux/platform_data/.
>
> diff --git a/drivers/gpio/gpio-mxc.c b/drivers/gpio/gpio-mxc.c
> index cee040f..0c4e32c 100644
> --- a/drivers/gpio/gpio-mxc.c
> +++ b/drivers/gpio/gpio-mxc.c
> @@ -26,6 +26,7 @@
> #include <linux/irqdomain.h>
> #include <linux/irqchip/chained_irq.h>
> #include <linux/gpio.h>
> +#include <linux/gpio-mxc.h>
> #include <linux/platform_device.h>
> #include <linux/slab.h>
> #include <linux/basic_mmio_gpio.h>
> @@ -400,6 +401,7 @@ static int mxc_gpio_probe(struct platform_device *pdev)
> struct device_node *np = pdev->dev.of_node;
> struct mxc_gpio_port *port;
> struct resource *iores;
> + struct mxc_gpio_platform_data *pdata = pdev->dev.platform_data;
> int irq_base;
> int err;
>
> @@ -410,27 +412,28 @@ static int mxc_gpio_probe(struct platform_device *pdev)
> if (!port)
> return -ENOMEM;
>
> - iores = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> - if (!iores) {
> - return -ENODEV;
> - }
> -
> - if (!devm_request_mem_region(&pdev->dev, iores->start,
> - resource_size(iores), pdev->name)) {
> - return -EBUSY;
> - }
> -
> - port->base = devm_ioremap(&pdev->dev, iores->start,
> - resource_size(iores));
> - if (!port->base) {
> - return -ENOMEM;
> + if (pdata) {
> + port->base = pdata->base;
> + iores = NULL;
Why is this needed?
> + } else {
> + iores = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> + if (!iores)
> + return -ENODEV;
> +
> + if (!devm_request_mem_region(&pdev->dev, iores->start,
> + resource_size(iores), pdev->name))
> + return -EBUSY;
> +
> + port->base = devm_ioremap(&pdev->dev, iores->start,
> + resource_size(iores));
> + if (!port->base)
> + return -ENOMEM;
> }
>
> port->irq_high = platform_get_irq(pdev, 1);
> port->irq = platform_get_irq(pdev, 0);
> - if (port->irq < 0) {
> + if (port->irq < 0)
> return -EINVAL;
> - }
The change belongs to patch #1.
Shawn
>
> /* disable the interrupt and clear the status */
> writel(0, port->base + GPIO_IMR);
> diff --git a/include/linux/gpio-mxc.h b/include/linux/gpio-mxc.h
> new file mode 100644
> index 0000000..6be51bc
> --- /dev/null
> +++ b/include/linux/gpio-mxc.h
> @@ -0,0 +1,17 @@
> +#ifndef _LINUX_GPIO_MXC_H
> +#define _LINUX_GPIO_MXC_H
> +
> +#include <linux/types.h>
> +
> +/*
> + * MXC GPIO driver platform data. If this platform data is passed to the
> + * driver, it will use the memory base defined in the struct. This is used for
> + * iomuxc drivers on imx21 and imx27, where the GPIO data register is embedded
> + * between the iomuxc registers.
> + */
> +
> +struct mxc_gpio_platform_data {
> + void __iomem *base;
> +};
> +
> +#endif /* _LINUX_GPIO_MXC_H */
> --
> 1.8.3.2
>
More information about the linux-arm-kernel
mailing list