13 #include <linux/kernel.h>
19 #include <mach/regs-gpio.h>
20 #include <mach/regs-clock.h>
66 static int s5p64x0_gpiolib_rbank_4bit2_input(
struct gpio_chip *
chip,
69 struct s3c_gpio_chip *ourchip = to_s3c_gpio(chip);
91 s3c_gpio_lock(ourchip, flags);
97 s3c_gpio_unlock(ourchip, flags);
102 static int s5p64x0_gpiolib_rbank_4bit2_output(
struct gpio_chip *chip,
103 unsigned int offset,
int value)
105 struct s3c_gpio_chip *ourchip = to_s3c_gpio(chip);
106 void __iomem *base = ourchip->base;
111 unsigned con_offset =
offset;
113 switch (con_offset) {
129 s3c_gpio_lock(ourchip, flags);
144 s3c_gpio_unlock(ourchip, flags);
150 unsigned int off,
unsigned int cfg)
163 shift = (off & 7) * 4;
167 shift = ((off + 1) & 7) * 4;
170 shift = ((off + 1) & 7) * 4;
174 if (s3c_gpio_is_cfg_special(cfg)) {
180 con &= ~(0xf << shift);
187 static struct s3c_gpio_cfg s5p64x0_gpio_cfgs[] = {
197 .set_config = s3c_gpio_setcfg_s3c24xx,
198 .get_config = s3c_gpio_getcfg_s3c24xx,
201 .set_config = s3c_gpio_setcfg_s3c24xx,
202 .get_config = s3c_gpio_getcfg_s3c24xx,
205 .set_config = s3c_gpio_setcfg_s3c24xx,
206 .get_config = s3c_gpio_getcfg_s3c24xx,
210 static struct s3c_gpio_chip s5p6440_gpio_4bit[] = {
213 .config = &s5p64x0_gpio_cfgs[1],
221 .config = &s5p64x0_gpio_cfgs[1],
229 .config = &s5p64x0_gpio_cfgs[1],
237 .config = &s5p64x0_gpio_cfgs[1],
246 static struct s3c_gpio_chip s5p6440_gpio_4bit2[] = {
249 .config = &s5p64x0_gpio_cfgs[1],
258 static struct s3c_gpio_chip s5p6440_gpio_rbank_4bit2[] = {
261 .config = &s5p64x0_gpio_cfgs[2],
270 static struct s3c_gpio_chip s5p6440_gpio_2bit[] = {
273 .config = &s5p64x0_gpio_cfgs[5],
281 .config = &s5p64x0_gpio_cfgs[3],
289 .config = &s5p64x0_gpio_cfgs[3],
297 .config = &s5p64x0_gpio_cfgs[4],
305 .config = &s5p64x0_gpio_cfgs[5],
314 static struct s3c_gpio_chip s5p6450_gpio_4bit[] = {
317 .config = &s5p64x0_gpio_cfgs[1],
325 .config = &s5p64x0_gpio_cfgs[1],
333 .config = &s5p64x0_gpio_cfgs[1],
341 .config = &s5p64x0_gpio_cfgs[1],
349 .config = &s5p64x0_gpio_cfgs[1],
358 static struct s3c_gpio_chip s5p6450_gpio_4bit2[] = {
361 .config = &s5p64x0_gpio_cfgs[1],
369 .config = &s5p64x0_gpio_cfgs[1],
378 static struct s3c_gpio_chip s5p6450_gpio_rbank_4bit2[] = {
381 .config = &s5p64x0_gpio_cfgs[2],
390 static struct s3c_gpio_chip s5p6450_gpio_2bit[] = {
393 .config = &s5p64x0_gpio_cfgs[5],
401 .config = &s5p64x0_gpio_cfgs[3],
409 .config = &s5p64x0_gpio_cfgs[3],
417 .config = &s5p64x0_gpio_cfgs[4],
425 .config = &s5p64x0_gpio_cfgs[5],
433 .config = &s5p64x0_gpio_cfgs[4],
441 .config = &s5p64x0_gpio_cfgs[5],
452 for (; nr_chips > 0; nr_chips--, chipcfg++) {
453 if (!chipcfg->set_config)
454 chipcfg->set_config = s3c_gpio_setcfg_s3c64xx_4bit;
455 if (!chipcfg->get_config)
456 chipcfg->get_config = s3c_gpio_getcfg_s3c64xx_4bit;
457 if (!chipcfg->set_pull)
458 chipcfg->set_pull = s3c_gpio_setpull_updown;
459 if (!chipcfg->get_pull)
460 chipcfg->get_pull = s3c_gpio_getpull_updown;
464 static void __init s5p64x0_gpio_add_rbank_4bit2(
struct s3c_gpio_chip *chip,
467 for (; nr_chips > 0; nr_chips--, chip++) {
468 chip->chip.direction_input = s5p64x0_gpiolib_rbank_4bit2_input;
469 chip->chip.direction_output =
470 s5p64x0_gpiolib_rbank_4bit2_output;
471 s3c_gpiolib_add(chip);
475 static int __init s5p64x0_gpiolib_init(
void)
481 samsung_gpiolib_add_2bit_chips(s5p6450_gpio_2bit,
484 samsung_gpiolib_add_4bit_chips(s5p6450_gpio_4bit,
487 samsung_gpiolib_add_4bit2_chips(s5p6450_gpio_4bit2,
490 s5p64x0_gpio_add_rbank_4bit2(s5p6450_gpio_rbank_4bit2,
493 samsung_gpiolib_add_2bit_chips(s5p6440_gpio_2bit,
496 samsung_gpiolib_add_4bit_chips(s5p6440_gpio_4bit,
499 samsung_gpiolib_add_4bit2_chips(s5p6440_gpio_4bit2,
502 s5p64x0_gpio_add_rbank_4bit2(s5p6440_gpio_rbank_4bit2,