1 /* linux/arch/arm/plat-s3c24xx/gpiolib.c
3 * Copyright (c) 2008-2010 Simtec Electronics
4 * http://armlinux.simtec.co.uk/
5 * Ben Dooks <ben@simtec.co.uk>
7 * S3C24XX GPIOlib support
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License.
14 #include <linux/kernel.h>
15 #include <linux/init.h>
16 #include <linux/module.h>
17 #include <linux/interrupt.h>
18 #include <linux/sysdev.h>
19 #include <linux/ioport.h>
21 #include <linux/gpio.h>
23 #include <plat/gpio-core.h>
24 #include <plat/gpio-cfg.h>
25 #include <plat/gpio-cfg-helpers.h>
26 #include <mach/hardware.h>
30 #include <mach/regs-gpio.h>
32 static int s3c24xx_gpiolib_banka_input(struct gpio_chip
*chip
, unsigned offset
)
37 static int s3c24xx_gpiolib_banka_output(struct gpio_chip
*chip
,
38 unsigned offset
, int value
)
40 struct s3c_gpio_chip
*ourchip
= to_s3c_gpio(chip
);
41 void __iomem
*base
= ourchip
->base
;
46 local_irq_save(flags
);
48 con
= __raw_readl(base
+ 0x00);
49 dat
= __raw_readl(base
+ 0x04);
51 dat
&= ~(1 << offset
);
55 __raw_writel(dat
, base
+ 0x04);
57 con
&= ~(1 << offset
);
59 __raw_writel(con
, base
+ 0x00);
60 __raw_writel(dat
, base
+ 0x04);
62 local_irq_restore(flags
);
66 static int s3c24xx_gpiolib_bankf_toirq(struct gpio_chip
*chip
, unsigned offset
)
69 return IRQ_EINT0
+ offset
;
72 return IRQ_EINT4
+ offset
- 4;
77 static int s3c24xx_gpiolib_bankg_toirq(struct gpio_chip
*chip
, unsigned offset
)
79 return IRQ_EINT8
+ offset
;
82 static struct s3c_gpio_cfg s3c24xx_gpiocfg_banka
= {
83 .set_config
= s3c_gpio_setcfg_s3c24xx_a
,
84 .get_config
= s3c_gpio_getcfg_s3c24xx_a
,
87 struct s3c_gpio_cfg s3c24xx_gpiocfg_default
= {
88 .set_config
= s3c_gpio_setcfg_s3c24xx
,
89 .get_config
= s3c_gpio_getcfg_s3c24xx
,
92 struct s3c_gpio_chip s3c24xx_gpios
[] = {
94 .base
= S3C2410_GPACON
,
95 .pm
= __gpio_pm(&s3c_gpio_pm_1bit
),
96 .config
= &s3c24xx_gpiocfg_banka
,
98 .base
= S3C2410_GPA(0),
102 .direction_input
= s3c24xx_gpiolib_banka_input
,
103 .direction_output
= s3c24xx_gpiolib_banka_output
,
107 .base
= S3C2410_GPBCON
,
108 .pm
= __gpio_pm(&s3c_gpio_pm_2bit
),
110 .base
= S3C2410_GPB(0),
111 .owner
= THIS_MODULE
,
117 .base
= S3C2410_GPCCON
,
118 .pm
= __gpio_pm(&s3c_gpio_pm_2bit
),
120 .base
= S3C2410_GPC(0),
121 .owner
= THIS_MODULE
,
127 .base
= S3C2410_GPDCON
,
128 .pm
= __gpio_pm(&s3c_gpio_pm_2bit
),
130 .base
= S3C2410_GPD(0),
131 .owner
= THIS_MODULE
,
137 .base
= S3C2410_GPECON
,
138 .pm
= __gpio_pm(&s3c_gpio_pm_2bit
),
140 .base
= S3C2410_GPE(0),
142 .owner
= THIS_MODULE
,
147 .base
= S3C2410_GPFCON
,
148 .pm
= __gpio_pm(&s3c_gpio_pm_2bit
),
150 .base
= S3C2410_GPF(0),
151 .owner
= THIS_MODULE
,
154 .to_irq
= s3c24xx_gpiolib_bankf_toirq
,
158 .base
= S3C2410_GPGCON
,
159 .pm
= __gpio_pm(&s3c_gpio_pm_2bit
),
161 .base
= S3C2410_GPG(0),
162 .owner
= THIS_MODULE
,
165 .to_irq
= s3c24xx_gpiolib_bankg_toirq
,
168 .base
= S3C2410_GPHCON
,
169 .pm
= __gpio_pm(&s3c_gpio_pm_2bit
),
171 .base
= S3C2410_GPH(0),
172 .owner
= THIS_MODULE
,
177 /* GPIOS for the S3C2443 and later devices. */
179 .base
= S3C2440_GPJCON
,
180 .pm
= __gpio_pm(&s3c_gpio_pm_2bit
),
182 .base
= S3C2410_GPJ(0),
183 .owner
= THIS_MODULE
,
188 .base
= S3C2443_GPKCON
,
189 .pm
= __gpio_pm(&s3c_gpio_pm_2bit
),
191 .base
= S3C2410_GPK(0),
192 .owner
= THIS_MODULE
,
197 .base
= S3C2443_GPLCON
,
198 .pm
= __gpio_pm(&s3c_gpio_pm_2bit
),
200 .base
= S3C2410_GPL(0),
201 .owner
= THIS_MODULE
,
206 .base
= S3C2443_GPMCON
,
207 .pm
= __gpio_pm(&s3c_gpio_pm_2bit
),
209 .base
= S3C2410_GPM(0),
210 .owner
= THIS_MODULE
,
218 static __init
int s3c24xx_gpiolib_init(void)
220 struct s3c_gpio_chip
*chip
= s3c24xx_gpios
;
223 for (gpn
= 0; gpn
< ARRAY_SIZE(s3c24xx_gpios
); gpn
++, chip
++) {
225 chip
->config
= &s3c24xx_gpiocfg_default
;
227 s3c_gpiolib_add(chip
);
233 core_initcall(s3c24xx_gpiolib_init
);