diff options
Diffstat (limited to 'drivers/gpio/gpio-pxa.c')
| -rw-r--r-- | drivers/gpio/gpio-pxa.c | 106 | 
1 files changed, 73 insertions, 33 deletions
diff --git a/drivers/gpio/gpio-pxa.c b/drivers/gpio/gpio-pxa.c index 9cc108d2b77..fe74b0cc2bc 100644 --- a/drivers/gpio/gpio-pxa.c +++ b/drivers/gpio/gpio-pxa.c @@ -86,20 +86,61 @@ struct pxa_gpio_chip {  #endif  }; -enum { +enum pxa_gpio_type {  	PXA25X_GPIO = 0,  	PXA26X_GPIO,  	PXA27X_GPIO,  	PXA3XX_GPIO,  	PXA93X_GPIO,  	MMP_GPIO = 0x10, +	MMP2_GPIO, +}; + +struct pxa_gpio_id { +	enum pxa_gpio_type	type; +	int			gpio_nums;  };  static DEFINE_SPINLOCK(gpio_lock);  static struct pxa_gpio_chip *pxa_gpio_chips; -static int gpio_type; +static enum pxa_gpio_type gpio_type;  static void __iomem *gpio_reg_base; +static struct pxa_gpio_id pxa25x_id = { +	.type		= PXA25X_GPIO, +	.gpio_nums	= 85, +}; + +static struct pxa_gpio_id pxa26x_id = { +	.type		= PXA26X_GPIO, +	.gpio_nums	= 90, +}; + +static struct pxa_gpio_id pxa27x_id = { +	.type		= PXA27X_GPIO, +	.gpio_nums	= 121, +}; + +static struct pxa_gpio_id pxa3xx_id = { +	.type		= PXA3XX_GPIO, +	.gpio_nums	= 128, +}; + +static struct pxa_gpio_id pxa93x_id = { +	.type		= PXA93X_GPIO, +	.gpio_nums	= 192, +}; + +static struct pxa_gpio_id mmp_id = { +	.type		= MMP_GPIO, +	.gpio_nums	= 128, +}; + +static struct pxa_gpio_id mmp2_id = { +	.type		= MMP2_GPIO, +	.gpio_nums	= 192, +}; +  #define for_each_gpio_chip(i, c)			\  	for (i = 0, c = &pxa_gpio_chips[0]; i <= pxa_last_gpio; i += 32, c++) @@ -432,40 +473,27 @@ static struct irq_chip pxa_muxed_gpio_chip = {  	.irq_set_wake	= pxa_gpio_set_wake,  }; -static int pxa_gpio_nums(void) +static int pxa_gpio_nums(struct platform_device *pdev)  { +	const struct platform_device_id *id = platform_get_device_id(pdev); +	struct pxa_gpio_id *pxa_id = (struct pxa_gpio_id *)id->driver_data;  	int count = 0; -#ifdef CONFIG_ARCH_PXA -	if (cpu_is_pxa25x()) { -#ifdef CONFIG_CPU_PXA26x -		count = 89; -		gpio_type = PXA26X_GPIO; -#elif defined(CONFIG_PXA25x) -		count = 84; -		gpio_type = PXA26X_GPIO; -#endif /* CONFIG_CPU_PXA26x */ -	} else if (cpu_is_pxa27x()) { -		count = 120; -		gpio_type = PXA27X_GPIO; -	} else if (cpu_is_pxa93x()) { -		count = 191; -		gpio_type = PXA93X_GPIO; -	} else if (cpu_is_pxa3xx()) { -		count = 127; -		gpio_type = PXA3XX_GPIO; -	} -#endif /* CONFIG_ARCH_PXA */ - -#ifdef CONFIG_ARCH_MMP -	if (cpu_is_pxa168() || cpu_is_pxa910()) { -		count = 127; -		gpio_type = MMP_GPIO; -	} else if (cpu_is_mmp2()) { -		count = 191; -		gpio_type = MMP_GPIO; +	switch (pxa_id->type) { +	case PXA25X_GPIO: +	case PXA26X_GPIO: +	case PXA27X_GPIO: +	case PXA3XX_GPIO: +	case PXA93X_GPIO: +	case MMP_GPIO: +	case MMP2_GPIO: +		gpio_type = pxa_id->type; +		count = pxa_id->gpio_nums - 1; +		break; +	default: +		count = -EINVAL; +		break;  	} -#endif /* CONFIG_ARCH_MMP */  	return count;  } @@ -548,7 +576,7 @@ static int pxa_gpio_probe(struct platform_device *pdev)  	ret = pxa_gpio_probe_dt(pdev);  	if (ret < 0) { -		pxa_last_gpio = pxa_gpio_nums(); +		pxa_last_gpio = pxa_gpio_nums(pdev);  #ifdef CONFIG_ARCH_PXA  		if (gpio_is_pxa_type(gpio_type))  			irq_base = PXA_GPIO_TO_IRQ(0); @@ -635,12 +663,24 @@ static int pxa_gpio_probe(struct platform_device *pdev)  	return 0;  } +static const struct platform_device_id gpio_id_table[] = { +	{ "pxa25x-gpio",	(unsigned long)&pxa25x_id }, +	{ "pxa26x-gpio",	(unsigned long)&pxa26x_id }, +	{ "pxa27x-gpio",	(unsigned long)&pxa27x_id }, +	{ "pxa3xx-gpio",	(unsigned long)&pxa3xx_id }, +	{ "pxa93x-gpio",	(unsigned long)&pxa93x_id }, +	{ "mmp-gpio",		(unsigned long)&mmp_id }, +	{ "mmp2-gpio",		(unsigned long)&mmp2_id }, +	{ }, +}; +  static struct platform_driver pxa_gpio_driver = {  	.probe		= pxa_gpio_probe,  	.driver		= {  		.name	= "pxa-gpio",  		.of_match_table = of_match_ptr(pxa_gpio_dt_ids),  	}, +	.id_table	= gpio_id_table,  };  module_platform_driver(pxa_gpio_driver);  |