blob: e7fb3b004e77b6f3ce90121a41074fa075ddb489 [file] [log] [blame]
Kukjin Kim5b1bab22010-11-25 14:21:48 +09001/* linux/arch/arm/mach-s5p64x0/gpiolib.c
Kukjin Kim42d828d2010-01-19 15:31:17 +09002 *
Kukjin Kim5dd33d82010-09-08 16:23:05 +09003 * Copyright (c) 2009-2010 Samsung Electronics Co., Ltd.
4 * http://www.samsung.com
Kukjin Kim42d828d2010-01-19 15:31:17 +09005 *
Kukjin Kim5dd33d82010-09-08 16:23:05 +09006 * S5P64X0 - GPIOlib support
Kukjin Kim42d828d2010-01-19 15:31:17 +09007 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
Kukjin Kim5dd33d82010-09-08 16:23:05 +090011*/
Kukjin Kim42d828d2010-01-19 15:31:17 +090012
13#include <linux/kernel.h>
14#include <linux/irq.h>
15#include <linux/io.h>
Kukjin Kim1c739c72010-08-05 07:54:49 +090016#include <linux/gpio.h>
17
Kukjin Kim42d828d2010-01-19 15:31:17 +090018#include <mach/map.h>
Kukjin Kim42d828d2010-01-19 15:31:17 +090019#include <mach/regs-gpio.h>
Kukjin Kimf50266d2010-11-25 14:17:01 +090020#include <mach/regs-clock.h>
Kukjin Kim1c739c72010-08-05 07:54:49 +090021
Kukjin Kim42d828d2010-01-19 15:31:17 +090022#include <plat/gpio-core.h>
23#include <plat/gpio-cfg.h>
24#include <plat/gpio-cfg-helpers.h>
25
Kukjin Kim5dd33d82010-09-08 16:23:05 +090026/*
27 * S5P6440 GPIO bank summary:
28 *
29 * Bank GPIOs Style SlpCon ExtInt Group
30 * A 6 4Bit Yes 1
31 * B 7 4Bit Yes 1
32 * C 8 4Bit Yes 2
33 * F 2 2Bit Yes 4 [1]
34 * G 7 4Bit Yes 5
35 * H 10 4Bit[2] Yes 6
36 * I 16 2Bit Yes None
37 * J 12 2Bit Yes None
38 * N 16 2Bit No IRQ_EINT
39 * P 8 2Bit Yes 8
40 * R 15 4Bit[2] Yes 8
41 *
Kukjin Kimf50266d2010-11-25 14:17:01 +090042 * S5P6450 GPIO bank summary:
43 *
44 * Bank GPIOs Style SlpCon ExtInt Group
45 * A 6 4Bit Yes 1
46 * B 7 4Bit Yes 1
47 * C 8 4Bit Yes 2
48 * D 8 4Bit Yes None
49 * F 2 2Bit Yes None
50 * G 14 4Bit[2] Yes 5
51 * H 10 4Bit[2] Yes 6
52 * I 16 2Bit Yes None
53 * J 12 2Bit Yes None
54 * K 5 4Bit Yes None
55 * N 16 2Bit No IRQ_EINT
56 * P 11 2Bit Yes 8
57 * Q 14 2Bit Yes None
58 * R 15 4Bit[2] Yes None
59 * S 8 2Bit Yes None
60 *
Kukjin Kim5dd33d82010-09-08 16:23:05 +090061 * [1] BANKF pins 14,15 do not form part of the external interrupt sources
62 * [2] BANK has two control registers, GPxCON0 and GPxCON1
63 */
64
65static int s5p64x0_gpiolib_rbank_4bit2_input(struct gpio_chip *chip,
Kukjin Kim42d828d2010-01-19 15:31:17 +090066 unsigned int offset)
67{
68 struct s3c_gpio_chip *ourchip = to_s3c_gpio(chip);
69 void __iomem *base = ourchip->base;
70 void __iomem *regcon = base;
71 unsigned long con;
Ben Dooks6a399542010-05-19 16:31:49 +090072 unsigned long flags;
Kukjin Kim42d828d2010-01-19 15:31:17 +090073
74 switch (offset) {
75 case 6:
76 offset += 1;
77 case 0:
78 case 1:
79 case 2:
80 case 3:
81 case 4:
82 case 5:
83 regcon -= 4;
84 break;
85 default:
86 offset -= 7;
87 break;
88 }
89
Ben Dooks6a399542010-05-19 16:31:49 +090090 s3c_gpio_lock(ourchip, flags);
91
Kukjin Kim42d828d2010-01-19 15:31:17 +090092 con = __raw_readl(regcon);
93 con &= ~(0xf << con_4bit_shift(offset));
94 __raw_writel(con, regcon);
95
Ben Dooks6a399542010-05-19 16:31:49 +090096 s3c_gpio_unlock(ourchip, flags);
97
Kukjin Kim42d828d2010-01-19 15:31:17 +090098 return 0;
99}
100
Kukjin Kim5dd33d82010-09-08 16:23:05 +0900101static int s5p64x0_gpiolib_rbank_4bit2_output(struct gpio_chip *chip,
Kukjin Kim42d828d2010-01-19 15:31:17 +0900102 unsigned int offset, int value)
103{
104 struct s3c_gpio_chip *ourchip = to_s3c_gpio(chip);
105 void __iomem *base = ourchip->base;
106 void __iomem *regcon = base;
107 unsigned long con;
108 unsigned long dat;
Ben Dooks6a399542010-05-19 16:31:49 +0900109 unsigned long flags;
Kukjin Kim42d828d2010-01-19 15:31:17 +0900110 unsigned con_offset = offset;
111
112 switch (con_offset) {
113 case 6:
114 con_offset += 1;
115 case 0:
116 case 1:
117 case 2:
118 case 3:
119 case 4:
120 case 5:
121 regcon -= 4;
122 break;
123 default:
124 con_offset -= 7;
125 break;
126 }
127
Ben Dooks6a399542010-05-19 16:31:49 +0900128 s3c_gpio_lock(ourchip, flags);
129
Kukjin Kim42d828d2010-01-19 15:31:17 +0900130 con = __raw_readl(regcon);
131 con &= ~(0xf << con_4bit_shift(con_offset));
132 con |= 0x1 << con_4bit_shift(con_offset);
133
134 dat = __raw_readl(base + GPIODAT_OFF);
135 if (value)
136 dat |= 1 << offset;
137 else
138 dat &= ~(1 << offset);
139
140 __raw_writel(con, regcon);
141 __raw_writel(dat, base + GPIODAT_OFF);
142
Ben Dooks6a399542010-05-19 16:31:49 +0900143 s3c_gpio_unlock(ourchip, flags);
144
Kukjin Kim42d828d2010-01-19 15:31:17 +0900145 return 0;
146}
147
Kukjin Kim5dd33d82010-09-08 16:23:05 +0900148int s5p64x0_gpio_setcfg_4bit_rbank(struct s3c_gpio_chip *chip,
Kukjin Kim42d828d2010-01-19 15:31:17 +0900149 unsigned int off, unsigned int cfg)
150{
151 void __iomem *reg = chip->base;
152 unsigned int shift;
153 u32 con;
154
155 switch (off) {
156 case 0:
157 case 1:
158 case 2:
159 case 3:
160 case 4:
161 case 5:
162 shift = (off & 7) * 4;
163 reg -= 4;
164 break;
165 case 6:
166 shift = ((off + 1) & 7) * 4;
167 reg -= 4;
168 default:
169 shift = ((off + 1) & 7) * 4;
170 break;
171 }
172
173 if (s3c_gpio_is_cfg_special(cfg)) {
174 cfg &= 0xf;
175 cfg <<= shift;
176 }
177
178 con = __raw_readl(reg);
179 con &= ~(0xf << shift);
180 con |= cfg;
181 __raw_writel(con, reg);
182
183 return 0;
184}
185
Kukjin Kim5dd33d82010-09-08 16:23:05 +0900186static struct s3c_gpio_cfg s5p64x0_gpio_cfgs[] = {
Kukjin Kim42d828d2010-01-19 15:31:17 +0900187 {
188 .cfg_eint = 0,
189 }, {
190 .cfg_eint = 7,
191 }, {
192 .cfg_eint = 3,
Kukjin Kim5dd33d82010-09-08 16:23:05 +0900193 .set_config = s5p64x0_gpio_setcfg_4bit_rbank,
Kukjin Kim42d828d2010-01-19 15:31:17 +0900194 }, {
195 .cfg_eint = 0,
196 .set_config = s3c_gpio_setcfg_s3c24xx,
Ben Dooks97a33992010-05-06 10:27:16 +0900197 .get_config = s3c_gpio_getcfg_s3c24xx,
Kukjin Kim42d828d2010-01-19 15:31:17 +0900198 }, {
199 .cfg_eint = 2,
200 .set_config = s3c_gpio_setcfg_s3c24xx,
Ben Dooks97a33992010-05-06 10:27:16 +0900201 .get_config = s3c_gpio_getcfg_s3c24xx,
Kukjin Kim42d828d2010-01-19 15:31:17 +0900202 }, {
203 .cfg_eint = 3,
204 .set_config = s3c_gpio_setcfg_s3c24xx,
Ben Dooks97a33992010-05-06 10:27:16 +0900205 .get_config = s3c_gpio_getcfg_s3c24xx,
Kukjin Kim42d828d2010-01-19 15:31:17 +0900206 },
207};
208
209static struct s3c_gpio_chip s5p6440_gpio_4bit[] = {
210 {
Kukjin Kimf50266d2010-11-25 14:17:01 +0900211 .base = S5P64X0_GPA_BASE,
Kukjin Kim5dd33d82010-09-08 16:23:05 +0900212 .config = &s5p64x0_gpio_cfgs[1],
Kukjin Kim42d828d2010-01-19 15:31:17 +0900213 .chip = {
214 .base = S5P6440_GPA(0),
215 .ngpio = S5P6440_GPIO_A_NR,
216 .label = "GPA",
217 },
218 }, {
Kukjin Kimf50266d2010-11-25 14:17:01 +0900219 .base = S5P64X0_GPB_BASE,
Kukjin Kim5dd33d82010-09-08 16:23:05 +0900220 .config = &s5p64x0_gpio_cfgs[1],
Kukjin Kim42d828d2010-01-19 15:31:17 +0900221 .chip = {
222 .base = S5P6440_GPB(0),
223 .ngpio = S5P6440_GPIO_B_NR,
224 .label = "GPB",
225 },
226 }, {
Kukjin Kimf50266d2010-11-25 14:17:01 +0900227 .base = S5P64X0_GPC_BASE,
Kukjin Kim5dd33d82010-09-08 16:23:05 +0900228 .config = &s5p64x0_gpio_cfgs[1],
Kukjin Kim42d828d2010-01-19 15:31:17 +0900229 .chip = {
230 .base = S5P6440_GPC(0),
231 .ngpio = S5P6440_GPIO_C_NR,
232 .label = "GPC",
233 },
234 }, {
Kukjin Kimf50266d2010-11-25 14:17:01 +0900235 .base = S5P64X0_GPG_BASE,
Kukjin Kim5dd33d82010-09-08 16:23:05 +0900236 .config = &s5p64x0_gpio_cfgs[1],
Kukjin Kim42d828d2010-01-19 15:31:17 +0900237 .chip = {
238 .base = S5P6440_GPG(0),
239 .ngpio = S5P6440_GPIO_G_NR,
240 .label = "GPG",
241 },
242 },
243};
244
245static struct s3c_gpio_chip s5p6440_gpio_4bit2[] = {
246 {
Kukjin Kimf50266d2010-11-25 14:17:01 +0900247 .base = S5P64X0_GPH_BASE + 0x4,
Kukjin Kim5dd33d82010-09-08 16:23:05 +0900248 .config = &s5p64x0_gpio_cfgs[1],
Kukjin Kim42d828d2010-01-19 15:31:17 +0900249 .chip = {
250 .base = S5P6440_GPH(0),
251 .ngpio = S5P6440_GPIO_H_NR,
252 .label = "GPH",
253 },
254 },
255};
256
Kukjin Kim5dd33d82010-09-08 16:23:05 +0900257static struct s3c_gpio_chip s5p6440_gpio_rbank_4bit2[] = {
Kukjin Kim42d828d2010-01-19 15:31:17 +0900258 {
Kukjin Kimf50266d2010-11-25 14:17:01 +0900259 .base = S5P64X0_GPR_BASE + 0x4,
Kukjin Kim5dd33d82010-09-08 16:23:05 +0900260 .config = &s5p64x0_gpio_cfgs[2],
Kukjin Kim42d828d2010-01-19 15:31:17 +0900261 .chip = {
262 .base = S5P6440_GPR(0),
263 .ngpio = S5P6440_GPIO_R_NR,
264 .label = "GPR",
265 },
266 },
267};
268
269static struct s3c_gpio_chip s5p6440_gpio_2bit[] = {
270 {
Kukjin Kimf50266d2010-11-25 14:17:01 +0900271 .base = S5P64X0_GPF_BASE,
Kukjin Kim5dd33d82010-09-08 16:23:05 +0900272 .config = &s5p64x0_gpio_cfgs[5],
Kukjin Kim42d828d2010-01-19 15:31:17 +0900273 .chip = {
274 .base = S5P6440_GPF(0),
275 .ngpio = S5P6440_GPIO_F_NR,
276 .label = "GPF",
277 },
278 }, {
Kukjin Kimf50266d2010-11-25 14:17:01 +0900279 .base = S5P64X0_GPI_BASE,
Kukjin Kim5dd33d82010-09-08 16:23:05 +0900280 .config = &s5p64x0_gpio_cfgs[3],
Kukjin Kim42d828d2010-01-19 15:31:17 +0900281 .chip = {
282 .base = S5P6440_GPI(0),
283 .ngpio = S5P6440_GPIO_I_NR,
284 .label = "GPI",
285 },
286 }, {
Kukjin Kimf50266d2010-11-25 14:17:01 +0900287 .base = S5P64X0_GPJ_BASE,
Kukjin Kim5dd33d82010-09-08 16:23:05 +0900288 .config = &s5p64x0_gpio_cfgs[3],
Kukjin Kim42d828d2010-01-19 15:31:17 +0900289 .chip = {
290 .base = S5P6440_GPJ(0),
291 .ngpio = S5P6440_GPIO_J_NR,
292 .label = "GPJ",
293 },
294 }, {
Kukjin Kimf50266d2010-11-25 14:17:01 +0900295 .base = S5P64X0_GPN_BASE,
Kukjin Kim5dd33d82010-09-08 16:23:05 +0900296 .config = &s5p64x0_gpio_cfgs[4],
Kukjin Kim42d828d2010-01-19 15:31:17 +0900297 .chip = {
298 .base = S5P6440_GPN(0),
299 .ngpio = S5P6440_GPIO_N_NR,
300 .label = "GPN",
301 },
302 }, {
Kukjin Kimf50266d2010-11-25 14:17:01 +0900303 .base = S5P64X0_GPP_BASE,
Kukjin Kim5dd33d82010-09-08 16:23:05 +0900304 .config = &s5p64x0_gpio_cfgs[5],
Kukjin Kim42d828d2010-01-19 15:31:17 +0900305 .chip = {
306 .base = S5P6440_GPP(0),
307 .ngpio = S5P6440_GPIO_P_NR,
308 .label = "GPP",
309 },
310 },
311};
312
Kukjin Kimf50266d2010-11-25 14:17:01 +0900313static struct s3c_gpio_chip s5p6450_gpio_4bit[] = {
314 {
315 .base = S5P64X0_GPA_BASE,
316 .config = &s5p64x0_gpio_cfgs[1],
317 .chip = {
318 .base = S5P6450_GPA(0),
319 .ngpio = S5P6450_GPIO_A_NR,
320 .label = "GPA",
321 },
322 }, {
323 .base = S5P64X0_GPB_BASE,
324 .config = &s5p64x0_gpio_cfgs[1],
325 .chip = {
326 .base = S5P6450_GPB(0),
327 .ngpio = S5P6450_GPIO_B_NR,
328 .label = "GPB",
329 },
330 }, {
331 .base = S5P64X0_GPC_BASE,
332 .config = &s5p64x0_gpio_cfgs[1],
333 .chip = {
334 .base = S5P6450_GPC(0),
335 .ngpio = S5P6450_GPIO_C_NR,
336 .label = "GPC",
337 },
338 }, {
339 .base = S5P6450_GPD_BASE,
340 .config = &s5p64x0_gpio_cfgs[1],
341 .chip = {
342 .base = S5P6450_GPD(0),
343 .ngpio = S5P6450_GPIO_D_NR,
344 .label = "GPD",
345 },
346 }, {
347 .base = S5P6450_GPK_BASE,
348 .config = &s5p64x0_gpio_cfgs[1],
349 .chip = {
350 .base = S5P6450_GPK(0),
351 .ngpio = S5P6450_GPIO_K_NR,
352 .label = "GPK",
353 },
354 },
355};
356
357static struct s3c_gpio_chip s5p6450_gpio_4bit2[] = {
358 {
359 .base = S5P64X0_GPG_BASE + 0x4,
360 .config = &s5p64x0_gpio_cfgs[1],
361 .chip = {
362 .base = S5P6450_GPG(0),
363 .ngpio = S5P6450_GPIO_G_NR,
364 .label = "GPG",
365 },
366 }, {
367 .base = S5P64X0_GPH_BASE + 0x4,
368 .config = &s5p64x0_gpio_cfgs[1],
369 .chip = {
370 .base = S5P6450_GPH(0),
371 .ngpio = S5P6450_GPIO_H_NR,
372 .label = "GPH",
373 },
374 },
375};
376
377static struct s3c_gpio_chip s5p6450_gpio_rbank_4bit2[] = {
378 {
379 .base = S5P64X0_GPR_BASE + 0x4,
380 .config = &s5p64x0_gpio_cfgs[2],
381 .chip = {
382 .base = S5P6450_GPR(0),
383 .ngpio = S5P6450_GPIO_R_NR,
384 .label = "GPR",
385 },
386 },
387};
388
389static struct s3c_gpio_chip s5p6450_gpio_2bit[] = {
390 {
391 .base = S5P64X0_GPF_BASE,
392 .config = &s5p64x0_gpio_cfgs[5],
393 .chip = {
394 .base = S5P6450_GPF(0),
395 .ngpio = S5P6450_GPIO_F_NR,
396 .label = "GPF",
397 },
398 }, {
399 .base = S5P64X0_GPI_BASE,
400 .config = &s5p64x0_gpio_cfgs[3],
401 .chip = {
402 .base = S5P6450_GPI(0),
403 .ngpio = S5P6450_GPIO_I_NR,
404 .label = "GPI",
405 },
406 }, {
407 .base = S5P64X0_GPJ_BASE,
408 .config = &s5p64x0_gpio_cfgs[3],
409 .chip = {
410 .base = S5P6450_GPJ(0),
411 .ngpio = S5P6450_GPIO_J_NR,
412 .label = "GPJ",
413 },
414 }, {
415 .base = S5P64X0_GPN_BASE,
416 .config = &s5p64x0_gpio_cfgs[4],
417 .chip = {
418 .base = S5P6450_GPN(0),
419 .ngpio = S5P6450_GPIO_N_NR,
420 .label = "GPN",
421 },
422 }, {
423 .base = S5P64X0_GPP_BASE,
424 .config = &s5p64x0_gpio_cfgs[5],
425 .chip = {
426 .base = S5P6450_GPP(0),
427 .ngpio = S5P6450_GPIO_P_NR,
428 .label = "GPP",
429 },
430 }, {
431 .base = S5P6450_GPQ_BASE,
432 .config = &s5p64x0_gpio_cfgs[4],
433 .chip = {
434 .base = S5P6450_GPQ(0),
435 .ngpio = S5P6450_GPIO_Q_NR,
436 .label = "GPQ",
437 },
438 }, {
439 .base = S5P6450_GPS_BASE,
440 .config = &s5p64x0_gpio_cfgs[5],
441 .chip = {
442 .base = S5P6450_GPS(0),
443 .ngpio = S5P6450_GPIO_S_NR,
444 .label = "GPS",
445 },
446 },
447};
448
Kukjin Kim5dd33d82010-09-08 16:23:05 +0900449void __init s5p64x0_gpiolib_set_cfg(struct s3c_gpio_cfg *chipcfg, int nr_chips)
Kukjin Kim42d828d2010-01-19 15:31:17 +0900450{
451 for (; nr_chips > 0; nr_chips--, chipcfg++) {
452 if (!chipcfg->set_config)
453 chipcfg->set_config = s3c_gpio_setcfg_s3c64xx_4bit;
Ben Dooks97a33992010-05-06 10:27:16 +0900454 if (!chipcfg->get_config)
455 chipcfg->get_config = s3c_gpio_getcfg_s3c64xx_4bit;
Kukjin Kim42d828d2010-01-19 15:31:17 +0900456 if (!chipcfg->set_pull)
457 chipcfg->set_pull = s3c_gpio_setpull_updown;
458 if (!chipcfg->get_pull)
459 chipcfg->get_pull = s3c_gpio_getpull_updown;
460 }
461}
462
Kukjin Kim5dd33d82010-09-08 16:23:05 +0900463static void __init s5p64x0_gpio_add_rbank_4bit2(struct s3c_gpio_chip *chip,
Kukjin Kim42d828d2010-01-19 15:31:17 +0900464 int nr_chips)
465{
466 for (; nr_chips > 0; nr_chips--, chip++) {
Kukjin Kim5dd33d82010-09-08 16:23:05 +0900467 chip->chip.direction_input = s5p64x0_gpiolib_rbank_4bit2_input;
Kukjin Kim42d828d2010-01-19 15:31:17 +0900468 chip->chip.direction_output =
Kukjin Kim5dd33d82010-09-08 16:23:05 +0900469 s5p64x0_gpiolib_rbank_4bit2_output;
Kukjin Kim42d828d2010-01-19 15:31:17 +0900470 s3c_gpiolib_add(chip);
471 }
472}
473
Kukjin Kimf50266d2010-11-25 14:17:01 +0900474static int __init s5p64x0_gpiolib_init(void)
Kukjin Kim42d828d2010-01-19 15:31:17 +0900475{
Kukjin Kimf50266d2010-11-25 14:17:01 +0900476 unsigned int chipid;
Kukjin Kim42d828d2010-01-19 15:31:17 +0900477
Kukjin Kimbb1d7002010-11-24 11:00:16 +0900478 chipid = __raw_readl(S5P64X0_SYS_ID);
479
Kukjin Kim5dd33d82010-09-08 16:23:05 +0900480 s5p64x0_gpiolib_set_cfg(s5p64x0_gpio_cfgs,
481 ARRAY_SIZE(s5p64x0_gpio_cfgs));
Kukjin Kim42d828d2010-01-19 15:31:17 +0900482
Kukjin Kimf50266d2010-11-25 14:17:01 +0900483 if ((chipid & 0xff000) == 0x50000) {
Kukjin Kimbb1d7002010-11-24 11:00:16 +0900484 samsung_gpiolib_add_2bit_chips(s5p6450_gpio_2bit,
485 ARRAY_SIZE(s5p6450_gpio_2bit));
Kukjin Kim42d828d2010-01-19 15:31:17 +0900486
Kukjin Kimf50266d2010-11-25 14:17:01 +0900487 samsung_gpiolib_add_4bit_chips(s5p6450_gpio_4bit,
488 ARRAY_SIZE(s5p6450_gpio_4bit));
Kukjin Kim42d828d2010-01-19 15:31:17 +0900489
Kukjin Kimf50266d2010-11-25 14:17:01 +0900490 samsung_gpiolib_add_4bit2_chips(s5p6450_gpio_4bit2,
491 ARRAY_SIZE(s5p6450_gpio_4bit2));
Kukjin Kim42d828d2010-01-19 15:31:17 +0900492
Kukjin Kimf50266d2010-11-25 14:17:01 +0900493 s5p64x0_gpio_add_rbank_4bit2(s5p6450_gpio_rbank_4bit2,
494 ARRAY_SIZE(s5p6450_gpio_rbank_4bit2));
495 } else {
Kukjin Kimbb1d7002010-11-24 11:00:16 +0900496 samsung_gpiolib_add_2bit_chips(s5p6440_gpio_2bit,
497 ARRAY_SIZE(s5p6440_gpio_2bit));
Kukjin Kimf50266d2010-11-25 14:17:01 +0900498
499 samsung_gpiolib_add_4bit_chips(s5p6440_gpio_4bit,
500 ARRAY_SIZE(s5p6440_gpio_4bit));
501
502 samsung_gpiolib_add_4bit2_chips(s5p6440_gpio_4bit2,
503 ARRAY_SIZE(s5p6440_gpio_4bit2));
504
505 s5p64x0_gpio_add_rbank_4bit2(s5p6440_gpio_rbank_4bit2,
506 ARRAY_SIZE(s5p6440_gpio_rbank_4bit2));
507 }
Kukjin Kim42d828d2010-01-19 15:31:17 +0900508
509 return 0;
510}
Abhilash Kesavanf85cbea2010-12-03 20:45:48 +0900511core_initcall(s5p64x0_gpiolib_init);