[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