[PATCH 2/2] gpio/exynos: Add support for Exynos4x12 SoC
Joonyoung Shim
jy0922.shim at samsung.com
Thu May 17 22:54:02 EDT 2012
Add to cc Grant Likely and Linus Walleij
On 05/18/2012 11:18 AM, Joonyoung Shim wrote:
> Exynos4x12 GPIO part1 and part2 layouts are different with that of
> Exynos4210. So, it needs to support gpios for Exynos4x12 SoC. This
> doesn't support GPVx Exynos4x12 GPIO part4 yet.
>
> In the Exynos4x12 GPIO part1 and part2, the interval of base register
> offset is 0x20 but GPF0, GPJ0, GPK0 and GPM0 ignore the 0x20 interval
> and have new value. The interrupt reg offset also is about GPF0 and GPK0
> too. Refer the below layout.
>
> - Exynos4x12 GPIO Part1
> GPIO Base offset Interrupt reg offset
> GPA0 0x000 0x00
> GPA1 0x020 0x04
> GPB 0x040 0x08
> GPC0 0x060 0x0C
> GPC1 0x080 0x10
> GPD0 0x0A0 0x14
> GPD1 0x0C0 0x18
> ...
> GPF0 0x180 0x30
> GPF1 0x1A0 0x34
> GPF2 0x1C0 0x38
> GPF3 0x1E0 0x3C
> ...
> GPJ0 0x240 0x40
> GPJ1 0x260 0x44
>
> - Exynos4x12 GPIO Part2
> ...
> GPK0 0x040 0x08
> GPK1 0x060 0x0C
> GPK2 0x080 0x10
> GPK3 0x0A0 0x14
> GPL0 0x0C0 0x18
> GPL1 0x0E0 0x1C
> GPL2 0x100 0x20
> GPY0 0x120 x
> GPY1 0x140 x
> GPY2 0x160 x
> GPY3 0x180 x
> GPY4 0x1A0 x
> GPY5 0x1C0 x
> GPY6 0x1E0 x
> ...
> GPM0 0x260 0x24
> GPM1 0x280 0x28
> GPM2 0x2A0 0x2C
> GPM3 0x2C0 0x30
> GPM4 0x2E0 0x34
> GPX0 0xC00 x
> GPX1 0xC20 x
> GPX2 0xC40 x
> GPX3 0xC60 x
>
> Signed-off-by: Joonyoung Shim<jy0922.shim at samsung.com>
> Signed-off-by: Kyungmin Park<kyungmin.park at samsung.com>
> ---
> arch/arm/mach-exynos/include/mach/gpio.h | 28 +++-
> arch/arm/mach-exynos/include/mach/irqs.h | 6 -
> drivers/gpio/gpio-samsung.c | 334 +++++++++++++++++++++++++++---
> 3 files changed, 327 insertions(+), 41 deletions(-)
>
> diff --git a/arch/arm/mach-exynos/include/mach/gpio.h b/arch/arm/mach-exynos/include/mach/gpio.h
> index 21c9bf1..2103d14 100644
> --- a/arch/arm/mach-exynos/include/mach/gpio.h
> +++ b/arch/arm/mach-exynos/include/mach/gpio.h
> @@ -26,11 +26,13 @@
> #define EXYNOS4_GPIO_C1_NR (5)
> #define EXYNOS4_GPIO_D0_NR (4)
> #define EXYNOS4_GPIO_D1_NR (4)
> +
> #define EXYNOS4210_GPIO_E0_NR (5)
> #define EXYNOS4210_GPIO_E1_NR (8)
> #define EXYNOS4210_GPIO_E2_NR (6)
> #define EXYNOS4210_GPIO_E3_NR (8)
> #define EXYNOS4210_GPIO_E4_NR (8)
> +
> #define EXYNOS4_GPIO_F0_NR (8)
> #define EXYNOS4_GPIO_F1_NR (8)
> #define EXYNOS4_GPIO_F2_NR (8)
> @@ -44,6 +46,13 @@
> #define EXYNOS4_GPIO_L0_NR (8)
> #define EXYNOS4_GPIO_L1_NR (3)
> #define EXYNOS4_GPIO_L2_NR (8)
> +
> +#define EXYNOS4X12_GPIO_M0_NR (8)
> +#define EXYNOS4X12_GPIO_M1_NR (7)
> +#define EXYNOS4X12_GPIO_M2_NR (5)
> +#define EXYNOS4X12_GPIO_M3_NR (8)
> +#define EXYNOS4X12_GPIO_M4_NR (8)
> +
> #define EXYNOS4_GPIO_X0_NR (8)
> #define EXYNOS4_GPIO_X1_NR (8)
> #define EXYNOS4_GPIO_X2_NR (8)
> @@ -67,12 +76,20 @@ enum exynos4_gpio_number {
> EXYNOS4_GPIO_C1_START = EXYNOS_GPIO_NEXT(EXYNOS4_GPIO_C0),
> EXYNOS4_GPIO_D0_START = EXYNOS_GPIO_NEXT(EXYNOS4_GPIO_C1),
> EXYNOS4_GPIO_D1_START = EXYNOS_GPIO_NEXT(EXYNOS4_GPIO_D0),
> +
> EXYNOS4210_GPIO_E0_START = EXYNOS_GPIO_NEXT(EXYNOS4_GPIO_D1),
> EXYNOS4210_GPIO_E1_START = EXYNOS_GPIO_NEXT(EXYNOS4210_GPIO_E0),
> EXYNOS4210_GPIO_E2_START = EXYNOS_GPIO_NEXT(EXYNOS4210_GPIO_E1),
> EXYNOS4210_GPIO_E3_START = EXYNOS_GPIO_NEXT(EXYNOS4210_GPIO_E2),
> EXYNOS4210_GPIO_E4_START = EXYNOS_GPIO_NEXT(EXYNOS4210_GPIO_E3),
> - EXYNOS4_GPIO_F0_START = EXYNOS_GPIO_NEXT(EXYNOS4210_GPIO_E4),
> +
> + EXYNOS4X12_GPIO_M0_START = EXYNOS_GPIO_NEXT(EXYNOS4_GPIO_D1),
> + EXYNOS4X12_GPIO_M1_START = EXYNOS_GPIO_NEXT(EXYNOS4X12_GPIO_M0),
> + EXYNOS4X12_GPIO_M2_START = EXYNOS_GPIO_NEXT(EXYNOS4X12_GPIO_M1),
> + EXYNOS4X12_GPIO_M3_START = EXYNOS_GPIO_NEXT(EXYNOS4X12_GPIO_M2),
> + EXYNOS4X12_GPIO_M4_START = EXYNOS_GPIO_NEXT(EXYNOS4X12_GPIO_M3),
> +
> + EXYNOS4_GPIO_F0_START = EXYNOS_GPIO_NEXT(EXYNOS4X12_GPIO_M4),
> EXYNOS4_GPIO_F1_START = EXYNOS_GPIO_NEXT(EXYNOS4_GPIO_F0),
> EXYNOS4_GPIO_F2_START = EXYNOS_GPIO_NEXT(EXYNOS4_GPIO_F1),
> EXYNOS4_GPIO_F3_START = EXYNOS_GPIO_NEXT(EXYNOS4_GPIO_F2),
> @@ -108,11 +125,13 @@ enum exynos4_gpio_number {
> #define EXYNOS4_GPC1(_nr) (EXYNOS4_GPIO_C1_START + (_nr))
> #define EXYNOS4_GPD0(_nr) (EXYNOS4_GPIO_D0_START + (_nr))
> #define EXYNOS4_GPD1(_nr) (EXYNOS4_GPIO_D1_START + (_nr))
> +
> #define EXYNOS4210_GPE0(_nr) (EXYNOS4210_GPIO_E0_START + (_nr))
> #define EXYNOS4210_GPE1(_nr) (EXYNOS4210_GPIO_E1_START + (_nr))
> #define EXYNOS4210_GPE2(_nr) (EXYNOS4210_GPIO_E2_START + (_nr))
> #define EXYNOS4210_GPE3(_nr) (EXYNOS4210_GPIO_E3_START + (_nr))
> #define EXYNOS4210_GPE4(_nr) (EXYNOS4210_GPIO_E4_START + (_nr))
> +
> #define EXYNOS4_GPF0(_nr) (EXYNOS4_GPIO_F0_START + (_nr))
> #define EXYNOS4_GPF1(_nr) (EXYNOS4_GPIO_F1_START + (_nr))
> #define EXYNOS4_GPF2(_nr) (EXYNOS4_GPIO_F2_START + (_nr))
> @@ -126,6 +145,13 @@ enum exynos4_gpio_number {
> #define EXYNOS4_GPL0(_nr) (EXYNOS4_GPIO_L0_START + (_nr))
> #define EXYNOS4_GPL1(_nr) (EXYNOS4_GPIO_L1_START + (_nr))
> #define EXYNOS4_GPL2(_nr) (EXYNOS4_GPIO_L2_START + (_nr))
> +
> +#define EXYNOS4X12_GPM0(_nr) (EXYNOS4X12_GPIO_M0_START + (_nr))
> +#define EXYNOS4X12_GPM1(_nr) (EXYNOS4X12_GPIO_M1_START + (_nr))
> +#define EXYNOS4X12_GPM2(_nr) (EXYNOS4X12_GPIO_M2_START + (_nr))
> +#define EXYNOS4X12_GPM3(_nr) (EXYNOS4X12_GPIO_M3_START + (_nr))
> +#define EXYNOS4X12_GPM4(_nr) (EXYNOS4X12_GPIO_M4_START + (_nr))
> +
> #define EXYNOS4_GPX0(_nr) (EXYNOS4_GPIO_X0_START + (_nr))
> #define EXYNOS4_GPX1(_nr) (EXYNOS4_GPIO_X1_START + (_nr))
> #define EXYNOS4_GPX2(_nr) (EXYNOS4_GPIO_X2_START + (_nr))
> diff --git a/arch/arm/mach-exynos/include/mach/irqs.h b/arch/arm/mach-exynos/include/mach/irqs.h
> index 561553a..cc6f31a 100644
> --- a/arch/arm/mach-exynos/include/mach/irqs.h
> +++ b/arch/arm/mach-exynos/include/mach/irqs.h
> @@ -167,9 +167,6 @@
>
> #define EXYNOS4_MAX_COMBINER_NR 16
>
> -#define EXYNOS4_IRQ_GPIO1_NR_GROUPS 16
> -#define EXYNOS4_IRQ_GPIO2_NR_GROUPS 9
> -
> /*
> * For Compatibility:
> * the default is for EXYNOS4, and
> @@ -231,9 +228,6 @@
> #define IRQ_FIMD0_VSYNC EXYNOS4_IRQ_FIMD0_VSYNC
> #define IRQ_FIMD0_SYSTEM EXYNOS4_IRQ_FIMD0_SYSTEM
>
> -#define IRQ_GPIO1_NR_GROUPS EXYNOS4_IRQ_GPIO1_NR_GROUPS
> -#define IRQ_GPIO2_NR_GROUPS EXYNOS4_IRQ_GPIO2_NR_GROUPS
> -
> /* For EXYNOS5 SoCs */
>
> #define EXYNOS5_IRQ_MDMA0 IRQ_SPI(33)
> diff --git a/drivers/gpio/gpio-samsung.c b/drivers/gpio/gpio-samsung.c
> index eda34e6..d57f93a 100644
> --- a/drivers/gpio/gpio-samsung.c
> +++ b/drivers/gpio/gpio-samsung.c
> @@ -2126,7 +2126,7 @@ static struct samsung_gpio_chip s5pv210_gpios_4bit[] = {
> */
>
> #ifdef CONFIG_ARCH_EXYNOS4
> -static struct samsung_gpio_chip exynos4_gpios_1[] = {
> +static struct samsung_gpio_chip exynos4210_gpios_1[] = {
> {
> .chip = {
> .base = EXYNOS4_GPA0(0),
> @@ -2225,10 +2225,93 @@ static struct samsung_gpio_chip exynos4_gpios_1[] = {
> },
> },
> };
> -#endif
>
> -#ifdef CONFIG_ARCH_EXYNOS4
> -static struct samsung_gpio_chip exynos4_gpios_2[] = {
> +static struct samsung_gpio_chip exynos4x12_gpios_1[] = {
> + {
> + .chip = {
> + .base = EXYNOS4_GPA0(0),
> + .ngpio = EXYNOS4_GPIO_A0_NR,
> + .label = "GPA0",
> + },
> + }, {
> + .chip = {
> + .base = EXYNOS4_GPA1(0),
> + .ngpio = EXYNOS4_GPIO_A1_NR,
> + .label = "GPA1",
> + },
> + }, {
> + .chip = {
> + .base = EXYNOS4_GPB(0),
> + .ngpio = EXYNOS4_GPIO_B_NR,
> + .label = "GPB",
> + },
> + }, {
> + .chip = {
> + .base = EXYNOS4_GPC0(0),
> + .ngpio = EXYNOS4_GPIO_C0_NR,
> + .label = "GPC0",
> + },
> + }, {
> + .chip = {
> + .base = EXYNOS4_GPC1(0),
> + .ngpio = EXYNOS4_GPIO_C1_NR,
> + .label = "GPC1",
> + },
> + }, {
> + .chip = {
> + .base = EXYNOS4_GPD0(0),
> + .ngpio = EXYNOS4_GPIO_D0_NR,
> + .label = "GPD0",
> + },
> + }, {
> + .chip = {
> + .base = EXYNOS4_GPD1(0),
> + .ngpio = EXYNOS4_GPIO_D1_NR,
> + .label = "GPD1",
> + },
> + }, {
> + .base = (void *)0x180,
> + .group = 12,
> + .chip = {
> + .base = EXYNOS4_GPF0(0),
> + .ngpio = EXYNOS4_GPIO_F0_NR,
> + .label = "GPF0",
> + },
> + }, {
> + .chip = {
> + .base = EXYNOS4_GPF1(0),
> + .ngpio = EXYNOS4_GPIO_F1_NR,
> + .label = "GPF1",
> + },
> + }, {
> + .chip = {
> + .base = EXYNOS4_GPF2(0),
> + .ngpio = EXYNOS4_GPIO_F2_NR,
> + .label = "GPF2",
> + },
> + }, {
> + .chip = {
> + .base = EXYNOS4_GPF3(0),
> + .ngpio = EXYNOS4_GPIO_F3_NR,
> + .label = "GPF3",
> + },
> + }, {
> + .base = (void *)0x240,
> + .chip = {
> + .base = EXYNOS4_GPJ0(0),
> + .ngpio = EXYNOS4_GPIO_J0_NR,
> + .label = "GPJ0",
> + },
> + }, {
> + .chip = {
> + .base = EXYNOS4_GPJ1(0),
> + .ngpio = EXYNOS4_GPIO_J1_NR,
> + .label = "GPJ1",
> + },
> + },
> +};
> +
> +static struct samsung_gpio_chip exynos4210_gpios_2[] = {
> {
> .chip = {
> .base = EXYNOS4_GPJ0(0),
> @@ -2333,6 +2416,172 @@ static struct samsung_gpio_chip exynos4_gpios_2[] = {
> .label = "GPY6",
> },
> }, {
> + .base = (void *)0xC00,
> + .config =&samsung_gpio_cfgs[9],
> + .irq_base = IRQ_EINT(0),
> + .chip = {
> + .base = EXYNOS4_GPX0(0),
> + .ngpio = EXYNOS4_GPIO_X0_NR,
> + .label = "GPX0",
> + .to_irq = samsung_gpiolib_to_irq,
> + },
> + }, {
> + .config =&samsung_gpio_cfgs[9],
> + .irq_base = IRQ_EINT(8),
> + .chip = {
> + .base = EXYNOS4_GPX1(0),
> + .ngpio = EXYNOS4_GPIO_X1_NR,
> + .label = "GPX1",
> + .to_irq = samsung_gpiolib_to_irq,
> + },
> + }, {
> + .config =&samsung_gpio_cfgs[9],
> + .irq_base = IRQ_EINT(16),
> + .chip = {
> + .base = EXYNOS4_GPX2(0),
> + .ngpio = EXYNOS4_GPIO_X2_NR,
> + .label = "GPX2",
> + .to_irq = samsung_gpiolib_to_irq,
> + },
> + }, {
> + .config =&samsung_gpio_cfgs[9],
> + .irq_base = IRQ_EINT(24),
> + .chip = {
> + .base = EXYNOS4_GPX3(0),
> + .ngpio = EXYNOS4_GPIO_X3_NR,
> + .label = "GPX3",
> + .to_irq = samsung_gpiolib_to_irq,
> + },
> + },
> +};
> +
> +static struct samsung_gpio_chip exynos4x12_gpios_2[] = {
> + {
> + .base = (void *)0x040,
> + .group = 20,
> + .chip = {
> + .base = EXYNOS4_GPK0(0),
> + .ngpio = EXYNOS4_GPIO_K0_NR,
> + .label = "GPK0",
> + },
> + }, {
> + .chip = {
> + .base = EXYNOS4_GPK1(0),
> + .ngpio = EXYNOS4_GPIO_K1_NR,
> + .label = "GPK1",
> + },
> + }, {
> + .chip = {
> + .base = EXYNOS4_GPK2(0),
> + .ngpio = EXYNOS4_GPIO_K2_NR,
> + .label = "GPK2",
> + },
> + }, {
> + .chip = {
> + .base = EXYNOS4_GPK3(0),
> + .ngpio = EXYNOS4_GPIO_K3_NR,
> + .label = "GPK3",
> + },
> + }, {
> + .chip = {
> + .base = EXYNOS4_GPL0(0),
> + .ngpio = EXYNOS4_GPIO_L0_NR,
> + .label = "GPL0",
> + },
> + }, {
> + .chip = {
> + .base = EXYNOS4_GPL1(0),
> + .ngpio = EXYNOS4_GPIO_L1_NR,
> + .label = "GPL1",
> + },
> + }, {
> + .chip = {
> + .base = EXYNOS4_GPL2(0),
> + .ngpio = EXYNOS4_GPIO_L2_NR,
> + .label = "GPL2",
> + },
> + }, {
> + .config =&samsung_gpio_cfgs[8],
> + .chip = {
> + .base = EXYNOS4_GPY0(0),
> + .ngpio = EXYNOS4_GPIO_Y0_NR,
> + .label = "GPY0",
> + },
> + }, {
> + .config =&samsung_gpio_cfgs[8],
> + .chip = {
> + .base = EXYNOS4_GPY1(0),
> + .ngpio = EXYNOS4_GPIO_Y1_NR,
> + .label = "GPY1",
> + },
> + }, {
> + .config =&samsung_gpio_cfgs[8],
> + .chip = {
> + .base = EXYNOS4_GPY2(0),
> + .ngpio = EXYNOS4_GPIO_Y2_NR,
> + .label = "GPY2",
> + },
> + }, {
> + .config =&samsung_gpio_cfgs[8],
> + .chip = {
> + .base = EXYNOS4_GPY3(0),
> + .ngpio = EXYNOS4_GPIO_Y3_NR,
> + .label = "GPY3",
> + },
> + }, {
> + .config =&samsung_gpio_cfgs[8],
> + .chip = {
> + .base = EXYNOS4_GPY4(0),
> + .ngpio = EXYNOS4_GPIO_Y4_NR,
> + .label = "GPY4",
> + },
> + }, {
> + .config =&samsung_gpio_cfgs[8],
> + .chip = {
> + .base = EXYNOS4_GPY5(0),
> + .ngpio = EXYNOS4_GPIO_Y5_NR,
> + .label = "GPY5",
> + },
> + }, {
> + .config =&samsung_gpio_cfgs[8],
> + .chip = {
> + .base = EXYNOS4_GPY6(0),
> + .ngpio = EXYNOS4_GPIO_Y6_NR,
> + .label = "GPY6",
> + },
> + }, {
> + .base = (void *)0x260,
> + .chip = {
> + .base = EXYNOS4X12_GPM0(0),
> + .ngpio = EXYNOS4X12_GPIO_M0_NR,
> + .label = "GPM0",
> + },
> + }, {
> + .chip = {
> + .base = EXYNOS4X12_GPM1(0),
> + .ngpio = EXYNOS4X12_GPIO_M1_NR,
> + .label = "GPM1",
> + },
> + }, {
> + .chip = {
> + .base = EXYNOS4X12_GPM2(0),
> + .ngpio = EXYNOS4X12_GPIO_M2_NR,
> + .label = "GPM2",
> + },
> + }, {
> + .chip = {
> + .base = EXYNOS4X12_GPM3(0),
> + .ngpio = EXYNOS4X12_GPIO_M3_NR,
> + .label = "GPM3",
> + },
> + }, {
> + .chip = {
> + .base = EXYNOS4X12_GPM4(0),
> + .ngpio = EXYNOS4X12_GPIO_M4_NR,
> + .label = "GPM4",
> + },
> + }, {
> + .base = (void *)0xC00,
> .config =&samsung_gpio_cfgs[9],
> .irq_base = IRQ_EINT(0),
> .chip = {
> @@ -2370,9 +2619,7 @@ static struct samsung_gpio_chip exynos4_gpios_2[] = {
> },
> },
> };
> -#endif
>
> -#ifdef CONFIG_ARCH_EXYNOS4
> static struct samsung_gpio_chip exynos4_gpios_3[] = {
> {
> .chip = {
> @@ -2727,7 +2974,7 @@ static __init int samsung_gpiolib_init(void)
> {
> struct samsung_gpio_chip *chip;
> int i, nr_chips;
> -#if defined(CONFIG_CPU_EXYNOS4210) || defined(CONFIG_SOC_EXYNOS5250)
> +#if defined(CONFIG_ARCH_EXYNOS4) || defined(CONFIG_SOC_EXYNOS5250)
> void __iomem *gpio_base1, *gpio_base2, *gpio_base3, *gpio_base4;
> #endif
> int group = 0;
> @@ -2794,9 +3041,12 @@ static __init int samsung_gpiolib_init(void)
> #if defined(CONFIG_CPU_S5PV210)&& defined(CONFIG_S5P_GPIO_INT)
> s5p_register_gpioint_bank(IRQ_GPIOINT, 0, S5P_GPIOINT_GROUP_MAXNR);
> #endif
> - } else if (soc_is_exynos4210()) {
> -#ifdef CONFIG_CPU_EXYNOS4210
> - void __iomem *gpx_base;
> + } else if (soc_is_exynos4210() || soc_is_exynos4212() ||
> + soc_is_exynos4412()) {
> +#ifdef CONFIG_ARCH_EXYNOS4
> + struct samsung_gpio_chip *chip_p;
> + int offset = 0;
> + int group1 = 0;
>
> /* gpio part1 */
> gpio_base1 = ioremap(EXYNOS4_PA_GPIO1, SZ_4K);
> @@ -2805,19 +3055,31 @@ static __init int samsung_gpiolib_init(void)
> goto err_ioremap1;
> }
>
> - chip = exynos4_gpios_1;
> - nr_chips = ARRAY_SIZE(exynos4_gpios_1);
> + if (soc_is_exynos4210()) {
> + chip = chip_p = exynos4210_gpios_1;
> + nr_chips = ARRAY_SIZE(exynos4210_gpios_1);
> + } else {
> + chip = chip_p = exynos4x12_gpios_1;
> + nr_chips = ARRAY_SIZE(exynos4x12_gpios_1);
> + }
>
> for (i = 0; i< nr_chips; i++, chip++) {
> if (!chip->config) {
> chip->config =&exynos_gpio_cfg;
> + if (chip->group)
> + group = chip->group;
> chip->group = group++;
> }
> - exynos_gpiolib_attach_ofnode(chip,
> - EXYNOS4_PA_GPIO1, i * 0x20);
> +
> + if (chip->base)
> + offset = (u32)chip->base;
> + chip->base = gpio_base1 + offset;
> + offset += 0x20;
> +
> + exynos_gpiolib_attach_ofnode(chip, EXYNOS4_PA_GPIO1, 0);
> }
> - samsung_gpiolib_add_4bit_chips(exynos4_gpios_1,
> - nr_chips, gpio_base1);
> + samsung_gpiolib_add_4bit_chips(chip_p, nr_chips, gpio_base1);
> + group1 = group;
>
> /* gpio part2 */
> gpio_base2 = ioremap(EXYNOS4_PA_GPIO2, SZ_4K);
> @@ -2826,25 +3088,32 @@ static __init int samsung_gpiolib_init(void)
> goto err_ioremap2;
> }
>
> - /* need to set base address for gpx */
> - chip =&exynos4_gpios_2[16];
> - gpx_base = gpio_base2 + 0xC00;
> - for (i = 0; i< 4; i++, chip++, gpx_base += 0x20)
> - chip->base = gpx_base;
> + if (soc_is_exynos4210()) {
> + chip = chip_p = exynos4210_gpios_2;
> + nr_chips = ARRAY_SIZE(exynos4210_gpios_2);
> + } else {
> + chip = chip_p = exynos4x12_gpios_2;
> + nr_chips = ARRAY_SIZE(exynos4x12_gpios_2);
> + }
>
> - chip = exynos4_gpios_2;
> - nr_chips = ARRAY_SIZE(exynos4_gpios_2);
> + offset = 0;
>
> for (i = 0; i< nr_chips; i++, chip++) {
> if (!chip->config) {
> chip->config =&exynos_gpio_cfg;
> + if (chip->group)
> + group = chip->group;
> chip->group = group++;
> }
> - exynos_gpiolib_attach_ofnode(chip,
> - EXYNOS4_PA_GPIO2, i * 0x20);
> +
> + if (chip->base)
> + offset = (u32)chip->base;
> + chip->base = gpio_base2 + offset;
> + offset += 0x20;
> +
> + exynos_gpiolib_attach_ofnode(chip, EXYNOS4_PA_GPIO2, 0);
> }
> - samsung_gpiolib_add_4bit_chips(exynos4_gpios_2,
> - nr_chips, gpio_base2);
> + samsung_gpiolib_add_4bit_chips(chip_p, nr_chips, gpio_base2);
>
> /* gpio part3 */
> gpio_base3 = ioremap(EXYNOS4_PA_GPIO3, SZ_256);
> @@ -2867,12 +3136,9 @@ static __init int samsung_gpiolib_init(void)
> samsung_gpiolib_add_4bit_chips(exynos4_gpios_3,
> nr_chips, gpio_base3);
>
> -#if defined(CONFIG_CPU_EXYNOS4210)&& defined(CONFIG_S5P_GPIO_INT)
> - s5p_register_gpioint_bank(IRQ_GPIO_XA, 0, IRQ_GPIO1_NR_GROUPS);
> - s5p_register_gpioint_bank(IRQ_GPIO_XB, IRQ_GPIO1_NR_GROUPS, IRQ_GPIO2_NR_GROUPS);
> -#endif
> -
> -#endif /* CONFIG_CPU_EXYNOS4210 */
> + s5p_register_gpioint_bank(IRQ_GPIO_XA, 0, group1);
> + s5p_register_gpioint_bank(IRQ_GPIO_XB, group1, group - group1);
> +#endif /* CONFIG_ARCH_EXYNOS4 */
> } else if (soc_is_exynos5250()) {
> #ifdef CONFIG_SOC_EXYNOS5250
> void __iomem *gpx_base;
> @@ -2984,7 +3250,7 @@ static __init int samsung_gpiolib_init(void)
>
> return 0;
>
> -#if defined(CONFIG_CPU_EXYNOS4210) || defined(CONFIG_SOC_EXYNOS5250)
> +#if defined(CONFIG_ARCH_EXYNOS4) || defined(CONFIG_SOC_EXYNOS5250)
> err_ioremap4:
> iounmap(gpio_base3);
> err_ioremap3:
More information about the linux-arm-kernel
mailing list