gpio.c 60.5 KB
Newer Older
1 2 3 4 5
/*
 *  linux/arch/arm/plat-omap/gpio.c
 *
 * Support functions for OMAP GPIO
 *
6
 * Copyright (C) 2003-2005 Nokia Corporation
7
 * Written by Juha Yrjölä <juha.yrjola@nokia.com>
8
 *
9 10 11
 * Copyright (C) 2009 Texas Instruments
 * Added OMAP4 support - Santosh Shilimkar <santosh.shilimkar@ti.com>
 *
12 13 14 15 16 17 18 19
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */

#include <linux/init.h>
#include <linux/module.h>
#include <linux/interrupt.h>
20 21
#include <linux/sysdev.h>
#include <linux/err.h>
22
#include <linux/clk.h>
23
#include <linux/io.h>
24

25
#include <mach/hardware.h>
26
#include <asm/irq.h>
27 28
#include <mach/irqs.h>
#include <mach/gpio.h>
29
#include <asm/mach/irq.h>
30
#include <plat/powerdomain.h>
31 32 33 34

/*
 * OMAP1510 GPIO registers
 */
T
Tony Lindgren 已提交
35
#define OMAP1510_GPIO_BASE		0xfffce000
36 37 38 39 40 41 42 43 44 45 46 47 48
#define OMAP1510_GPIO_DATA_INPUT	0x00
#define OMAP1510_GPIO_DATA_OUTPUT	0x04
#define OMAP1510_GPIO_DIR_CONTROL	0x08
#define OMAP1510_GPIO_INT_CONTROL	0x0c
#define OMAP1510_GPIO_INT_MASK		0x10
#define OMAP1510_GPIO_INT_STATUS	0x14
#define OMAP1510_GPIO_PIN_CONTROL	0x18

#define OMAP1510_IH_GPIO_BASE		64

/*
 * OMAP1610 specific GPIO registers
 */
T
Tony Lindgren 已提交
49 50 51 52
#define OMAP1610_GPIO1_BASE		0xfffbe400
#define OMAP1610_GPIO2_BASE		0xfffbec00
#define OMAP1610_GPIO3_BASE		0xfffbb400
#define OMAP1610_GPIO4_BASE		0xfffbbc00
53 54 55 56 57
#define OMAP1610_GPIO_REVISION		0x0000
#define OMAP1610_GPIO_SYSCONFIG		0x0010
#define OMAP1610_GPIO_SYSSTATUS		0x0014
#define OMAP1610_GPIO_IRQSTATUS1	0x0018
#define OMAP1610_GPIO_IRQENABLE1	0x001c
58
#define OMAP1610_GPIO_WAKEUPENABLE	0x0028
59 60 61 62 63 64
#define OMAP1610_GPIO_DATAIN		0x002c
#define OMAP1610_GPIO_DATAOUT		0x0030
#define OMAP1610_GPIO_DIRECTION		0x0034
#define OMAP1610_GPIO_EDGE_CTRL1	0x0038
#define OMAP1610_GPIO_EDGE_CTRL2	0x003c
#define OMAP1610_GPIO_CLEAR_IRQENABLE1	0x009c
65
#define OMAP1610_GPIO_CLEAR_WAKEUPENA	0x00a8
66 67
#define OMAP1610_GPIO_CLEAR_DATAOUT	0x00b0
#define OMAP1610_GPIO_SET_IRQENABLE1	0x00dc
68
#define OMAP1610_GPIO_SET_WAKEUPENA	0x00e8
69 70 71
#define OMAP1610_GPIO_SET_DATAOUT	0x00f0

/*
72
 * OMAP7XX specific GPIO registers
73
 */
T
Tony Lindgren 已提交
74 75 76 77 78 79
#define OMAP7XX_GPIO1_BASE		0xfffbc000
#define OMAP7XX_GPIO2_BASE		0xfffbc800
#define OMAP7XX_GPIO3_BASE		0xfffbd000
#define OMAP7XX_GPIO4_BASE		0xfffbd800
#define OMAP7XX_GPIO5_BASE		0xfffbe000
#define OMAP7XX_GPIO6_BASE		0xfffbe800
80 81 82 83 84 85
#define OMAP7XX_GPIO_DATA_INPUT		0x00
#define OMAP7XX_GPIO_DATA_OUTPUT	0x04
#define OMAP7XX_GPIO_DIR_CONTROL	0x08
#define OMAP7XX_GPIO_INT_CONTROL	0x0c
#define OMAP7XX_GPIO_INT_MASK		0x10
#define OMAP7XX_GPIO_INT_STATUS		0x14
86

T
Tony Lindgren 已提交
87
#define OMAP1_MPUIO_VBASE		OMAP1_MPUIO_BASE
88

89 90 91
/*
 * omap24xx specific GPIO registers
 */
T
Tony Lindgren 已提交
92 93 94 95
#define OMAP242X_GPIO1_BASE		0x48018000
#define OMAP242X_GPIO2_BASE		0x4801a000
#define OMAP242X_GPIO3_BASE		0x4801c000
#define OMAP242X_GPIO4_BASE		0x4801e000
96

T
Tony Lindgren 已提交
97 98 99 100 101
#define OMAP243X_GPIO1_BASE		0x4900C000
#define OMAP243X_GPIO2_BASE		0x4900E000
#define OMAP243X_GPIO3_BASE		0x49010000
#define OMAP243X_GPIO4_BASE		0x49012000
#define OMAP243X_GPIO5_BASE		0x480B6000
102

103 104 105 106
#define OMAP24XX_GPIO_REVISION		0x0000
#define OMAP24XX_GPIO_SYSCONFIG		0x0010
#define OMAP24XX_GPIO_SYSSTATUS		0x0014
#define OMAP24XX_GPIO_IRQSTATUS1	0x0018
107 108
#define OMAP24XX_GPIO_IRQSTATUS2	0x0028
#define OMAP24XX_GPIO_IRQENABLE2	0x002c
109
#define OMAP24XX_GPIO_IRQENABLE1	0x001c
110
#define OMAP24XX_GPIO_WAKE_EN		0x0020
111 112 113 114 115 116 117 118
#define OMAP24XX_GPIO_CTRL		0x0030
#define OMAP24XX_GPIO_OE		0x0034
#define OMAP24XX_GPIO_DATAIN		0x0038
#define OMAP24XX_GPIO_DATAOUT		0x003c
#define OMAP24XX_GPIO_LEVELDETECT0	0x0040
#define OMAP24XX_GPIO_LEVELDETECT1	0x0044
#define OMAP24XX_GPIO_RISINGDETECT	0x0048
#define OMAP24XX_GPIO_FALLINGDETECT	0x004c
119 120
#define OMAP24XX_GPIO_DEBOUNCE_EN	0x0050
#define OMAP24XX_GPIO_DEBOUNCE_VAL	0x0054
121 122 123 124 125 126 127
#define OMAP24XX_GPIO_CLEARIRQENABLE1	0x0060
#define OMAP24XX_GPIO_SETIRQENABLE1	0x0064
#define OMAP24XX_GPIO_CLEARWKUENA	0x0080
#define OMAP24XX_GPIO_SETWKUENA		0x0084
#define OMAP24XX_GPIO_CLEARDATAOUT	0x0090
#define OMAP24XX_GPIO_SETDATAOUT	0x0094

128 129 130 131 132 133 134 135 136 137 138 139 140
#define OMAP4_GPIO_REVISION		0x0000
#define OMAP4_GPIO_SYSCONFIG		0x0010
#define OMAP4_GPIO_EOI			0x0020
#define OMAP4_GPIO_IRQSTATUSRAW0	0x0024
#define OMAP4_GPIO_IRQSTATUSRAW1	0x0028
#define OMAP4_GPIO_IRQSTATUS0		0x002c
#define OMAP4_GPIO_IRQSTATUS1		0x0030
#define OMAP4_GPIO_IRQSTATUSSET0	0x0034
#define OMAP4_GPIO_IRQSTATUSSET1	0x0038
#define OMAP4_GPIO_IRQSTATUSCLR0	0x003c
#define OMAP4_GPIO_IRQSTATUSCLR1	0x0040
#define OMAP4_GPIO_IRQWAKEN0		0x0044
#define OMAP4_GPIO_IRQWAKEN1		0x0048
141 142 143 144 145
#define OMAP4_GPIO_SYSSTATUS		0x0114
#define OMAP4_GPIO_IRQENABLE1		0x011c
#define OMAP4_GPIO_WAKE_EN		0x0120
#define OMAP4_GPIO_IRQSTATUS2		0x0128
#define OMAP4_GPIO_IRQENABLE2		0x012c
146 147 148 149 150 151 152 153 154 155
#define OMAP4_GPIO_CTRL			0x0130
#define OMAP4_GPIO_OE			0x0134
#define OMAP4_GPIO_DATAIN		0x0138
#define OMAP4_GPIO_DATAOUT		0x013c
#define OMAP4_GPIO_LEVELDETECT0		0x0140
#define OMAP4_GPIO_LEVELDETECT1		0x0144
#define OMAP4_GPIO_RISINGDETECT		0x0148
#define OMAP4_GPIO_FALLINGDETECT	0x014c
#define OMAP4_GPIO_DEBOUNCENABLE	0x0150
#define OMAP4_GPIO_DEBOUNCINGTIME	0x0154
156 157 158 159
#define OMAP4_GPIO_CLEARIRQENABLE1	0x0160
#define OMAP4_GPIO_SETIRQENABLE1	0x0164
#define OMAP4_GPIO_CLEARWKUENA		0x0180
#define OMAP4_GPIO_SETWKUENA		0x0184
160 161
#define OMAP4_GPIO_CLEARDATAOUT		0x0190
#define OMAP4_GPIO_SETDATAOUT		0x0194
162 163 164 165
/*
 * omap34xx specific GPIO registers
 */

T
Tony Lindgren 已提交
166 167 168 169 170 171
#define OMAP34XX_GPIO1_BASE		0x48310000
#define OMAP34XX_GPIO2_BASE		0x49050000
#define OMAP34XX_GPIO3_BASE		0x49052000
#define OMAP34XX_GPIO4_BASE		0x49054000
#define OMAP34XX_GPIO5_BASE		0x49056000
#define OMAP34XX_GPIO6_BASE		0x49058000
172

173 174 175
/*
 * OMAP44XX  specific GPIO registers
 */
T
Tony Lindgren 已提交
176 177 178 179 180 181
#define OMAP44XX_GPIO1_BASE             0x4a310000
#define OMAP44XX_GPIO2_BASE             0x48055000
#define OMAP44XX_GPIO3_BASE             0x48057000
#define OMAP44XX_GPIO4_BASE             0x48059000
#define OMAP44XX_GPIO5_BASE             0x4805B000
#define OMAP44XX_GPIO6_BASE             0x4805D000
182

183
struct gpio_bank {
T
Tony Lindgren 已提交
184
	unsigned long pbase;
185
	void __iomem *base;
186 187
	u16 irq;
	u16 virtual_irq_start;
188
	int method;
189
#if defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP2PLUS)
190 191
	u32 suspend_wakeup;
	u32 saved_wakeup;
192
#endif
193
#ifdef CONFIG_ARCH_OMAP2PLUS
194 195 196 197 198 199 200
	u32 non_wakeup_gpios;
	u32 enabled_non_wakeup_gpios;

	u32 saved_datain;
	u32 saved_fallingdetect;
	u32 saved_risingdetect;
#endif
201
	u32 level_mask;
202
	u32 toggle_mask;
203
	spinlock_t lock;
D
David Brownell 已提交
204
	struct gpio_chip chip;
205
	struct clk *dbck;
C
Charulatha V 已提交
206
	u32 mod_usage;
207
	u32 dbck_enable_mask;
208 209 210 211 212
};

#define METHOD_MPUIO		0
#define METHOD_GPIO_1510	1
#define METHOD_GPIO_1610	2
213
#define METHOD_GPIO_7XX		3
214
#define METHOD_GPIO_24XX	5
215
#define METHOD_GPIO_44XX	6
216

217
#ifdef CONFIG_ARCH_OMAP16XX
218
static struct gpio_bank gpio_bank_1610[5] = {
T
Tony Lindgren 已提交
219 220 221 222 223 224 225 226 227 228
	{ OMAP1_MPUIO_VBASE, NULL, INT_MPUIO, IH_MPUIO_BASE,
		METHOD_MPUIO },
	{ OMAP1610_GPIO1_BASE, NULL, INT_GPIO_BANK1, IH_GPIO_BASE,
		METHOD_GPIO_1610 },
	{ OMAP1610_GPIO2_BASE, NULL, INT_1610_GPIO_BANK2, IH_GPIO_BASE + 16,
		METHOD_GPIO_1610 },
	{ OMAP1610_GPIO3_BASE, NULL, INT_1610_GPIO_BANK3, IH_GPIO_BASE + 32,
		METHOD_GPIO_1610 },
	{ OMAP1610_GPIO4_BASE, NULL, INT_1610_GPIO_BANK4, IH_GPIO_BASE + 48,
		METHOD_GPIO_1610 },
229 230 231
};
#endif

232
#ifdef CONFIG_ARCH_OMAP15XX
233
static struct gpio_bank gpio_bank_1510[2] = {
T
Tony Lindgren 已提交
234 235 236 237
	{ OMAP1_MPUIO_VBASE, NULL, INT_MPUIO, IH_MPUIO_BASE,
		METHOD_MPUIO },
	{ OMAP1510_GPIO_BASE, NULL, INT_GPIO_BANK1, IH_GPIO_BASE,
		METHOD_GPIO_1510 }
238 239 240
};
#endif

241
#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
242
static struct gpio_bank gpio_bank_7xx[7] = {
T
Tony Lindgren 已提交
243 244 245 246 247 248 249 250 251 252 253 254 255 256
	{ OMAP1_MPUIO_VBASE, NULL, INT_7XX_MPUIO, IH_MPUIO_BASE,
		METHOD_MPUIO },
	{ OMAP7XX_GPIO1_BASE, NULL, INT_7XX_GPIO_BANK1, IH_GPIO_BASE,
		METHOD_GPIO_7XX },
	{ OMAP7XX_GPIO2_BASE, NULL, INT_7XX_GPIO_BANK2, IH_GPIO_BASE + 32,
		METHOD_GPIO_7XX },
	{ OMAP7XX_GPIO3_BASE, NULL, INT_7XX_GPIO_BANK3, IH_GPIO_BASE + 64,
		METHOD_GPIO_7XX },
	{ OMAP7XX_GPIO4_BASE, NULL, INT_7XX_GPIO_BANK4,  IH_GPIO_BASE + 96,
		METHOD_GPIO_7XX },
	{ OMAP7XX_GPIO5_BASE, NULL, INT_7XX_GPIO_BANK5,  IH_GPIO_BASE + 128,
		METHOD_GPIO_7XX },
	{ OMAP7XX_GPIO6_BASE, NULL, INT_7XX_GPIO_BANK6,  IH_GPIO_BASE + 160,
		METHOD_GPIO_7XX },
257 258 259
};
#endif

260
#ifdef CONFIG_ARCH_OMAP2
261 262

static struct gpio_bank gpio_bank_242x[4] = {
T
Tony Lindgren 已提交
263 264 265 266 267 268 269 270
	{ OMAP242X_GPIO1_BASE, NULL, INT_24XX_GPIO_BANK1, IH_GPIO_BASE,
		METHOD_GPIO_24XX },
	{ OMAP242X_GPIO2_BASE, NULL, INT_24XX_GPIO_BANK2, IH_GPIO_BASE + 32,
		METHOD_GPIO_24XX },
	{ OMAP242X_GPIO3_BASE, NULL, INT_24XX_GPIO_BANK3, IH_GPIO_BASE + 64,
		METHOD_GPIO_24XX },
	{ OMAP242X_GPIO4_BASE, NULL, INT_24XX_GPIO_BANK4, IH_GPIO_BASE + 96,
		METHOD_GPIO_24XX },
271
};
272 273

static struct gpio_bank gpio_bank_243x[5] = {
T
Tony Lindgren 已提交
274 275 276 277 278 279 280 281 282 283
	{ OMAP243X_GPIO1_BASE, NULL, INT_24XX_GPIO_BANK1, IH_GPIO_BASE,
		METHOD_GPIO_24XX },
	{ OMAP243X_GPIO2_BASE, NULL, INT_24XX_GPIO_BANK2, IH_GPIO_BASE + 32,
		METHOD_GPIO_24XX },
	{ OMAP243X_GPIO3_BASE, NULL, INT_24XX_GPIO_BANK3, IH_GPIO_BASE + 64,
		METHOD_GPIO_24XX },
	{ OMAP243X_GPIO4_BASE, NULL, INT_24XX_GPIO_BANK4, IH_GPIO_BASE + 96,
		METHOD_GPIO_24XX },
	{ OMAP243X_GPIO5_BASE, NULL, INT_24XX_GPIO_BANK5, IH_GPIO_BASE + 128,
		METHOD_GPIO_24XX },
284 285
};

286 287
#endif

288
#ifdef CONFIG_ARCH_OMAP3
289
static struct gpio_bank gpio_bank_34xx[6] = {
T
Tony Lindgren 已提交
290 291 292 293 294 295 296 297 298 299 300 301
	{ OMAP34XX_GPIO1_BASE, NULL, INT_34XX_GPIO_BANK1, IH_GPIO_BASE,
		METHOD_GPIO_24XX },
	{ OMAP34XX_GPIO2_BASE, NULL, INT_34XX_GPIO_BANK2, IH_GPIO_BASE + 32,
		METHOD_GPIO_24XX },
	{ OMAP34XX_GPIO3_BASE, NULL, INT_34XX_GPIO_BANK3, IH_GPIO_BASE + 64,
		METHOD_GPIO_24XX },
	{ OMAP34XX_GPIO4_BASE, NULL, INT_34XX_GPIO_BANK4, IH_GPIO_BASE + 96,
		METHOD_GPIO_24XX },
	{ OMAP34XX_GPIO5_BASE, NULL, INT_34XX_GPIO_BANK5, IH_GPIO_BASE + 128,
		METHOD_GPIO_24XX },
	{ OMAP34XX_GPIO6_BASE, NULL, INT_34XX_GPIO_BANK6, IH_GPIO_BASE + 160,
		METHOD_GPIO_24XX },
302 303
};

304 305 306 307 308 309 310 311 312 313 314 315
struct omap3_gpio_regs {
	u32 sysconfig;
	u32 irqenable1;
	u32 irqenable2;
	u32 wake_en;
	u32 ctrl;
	u32 oe;
	u32 leveldetect0;
	u32 leveldetect1;
	u32 risingdetect;
	u32 fallingdetect;
	u32 dataout;
316 317
};

318
static struct omap3_gpio_regs gpio_context[OMAP34XX_NR_GPIOS];
319 320
#endif

321 322
#ifdef CONFIG_ARCH_OMAP4
static struct gpio_bank gpio_bank_44xx[6] = {
323
	{ OMAP44XX_GPIO1_BASE, NULL, OMAP44XX_IRQ_GPIO1, IH_GPIO_BASE,
324
		METHOD_GPIO_44XX },
325
	{ OMAP44XX_GPIO2_BASE, NULL, OMAP44XX_IRQ_GPIO2, IH_GPIO_BASE + 32,
326
		METHOD_GPIO_44XX },
327
	{ OMAP44XX_GPIO3_BASE, NULL, OMAP44XX_IRQ_GPIO3, IH_GPIO_BASE + 64,
328
		METHOD_GPIO_44XX },
329
	{ OMAP44XX_GPIO4_BASE, NULL, OMAP44XX_IRQ_GPIO4, IH_GPIO_BASE + 96,
330
		METHOD_GPIO_44XX },
331
	{ OMAP44XX_GPIO5_BASE, NULL, OMAP44XX_IRQ_GPIO5, IH_GPIO_BASE + 128,
332
		METHOD_GPIO_44XX },
333
	{ OMAP44XX_GPIO6_BASE, NULL, OMAP44XX_IRQ_GPIO6, IH_GPIO_BASE + 160,
334
		METHOD_GPIO_44XX },
335 336 337 338
};

#endif

339 340 341 342 343
static struct gpio_bank *gpio_bank;
static int gpio_bank_count;

static inline struct gpio_bank *get_gpio_bank(int gpio)
{
344
	if (cpu_is_omap15xx()) {
345 346 347 348 349 350 351 352 353
		if (OMAP_GPIO_IS_MPUIO(gpio))
			return &gpio_bank[0];
		return &gpio_bank[1];
	}
	if (cpu_is_omap16xx()) {
		if (OMAP_GPIO_IS_MPUIO(gpio))
			return &gpio_bank[0];
		return &gpio_bank[1 + (gpio >> 4)];
	}
354
	if (cpu_is_omap7xx()) {
355 356 357 358
		if (OMAP_GPIO_IS_MPUIO(gpio))
			return &gpio_bank[0];
		return &gpio_bank[1 + (gpio >> 5)];
	}
359 360
	if (cpu_is_omap24xx())
		return &gpio_bank[gpio >> 5];
361
	if (cpu_is_omap34xx() || cpu_is_omap44xx())
362
		return &gpio_bank[gpio >> 5];
D
David Brownell 已提交
363 364
	BUG();
	return NULL;
365 366 367 368
}

static inline int get_gpio_index(int gpio)
{
369
	if (cpu_is_omap7xx())
370
		return gpio & 0x1f;
371 372
	if (cpu_is_omap24xx())
		return gpio & 0x1f;
373
	if (cpu_is_omap34xx() || cpu_is_omap44xx())
374
		return gpio & 0x1f;
375
	return gpio & 0x0f;
376 377 378 379 380 381
}

static inline int gpio_valid(int gpio)
{
	if (gpio < 0)
		return -1;
382
	if (cpu_class_is_omap1() && OMAP_GPIO_IS_MPUIO(gpio)) {
383
		if (gpio >= OMAP_MAX_GPIO_LINES + 16)
384 385 386
			return -1;
		return 0;
	}
387
	if (cpu_is_omap15xx() && gpio < 16)
388 389 390
		return 0;
	if ((cpu_is_omap16xx()) && gpio < 64)
		return 0;
391
	if (cpu_is_omap7xx() && gpio < 192)
392
		return 0;
393 394
	if (cpu_is_omap24xx() && gpio < 128)
		return 0;
395
	if ((cpu_is_omap34xx() || cpu_is_omap44xx()) && gpio < 192)
396
		return 0;
397 398 399 400 401
	return -1;
}

static int check_gpio(int gpio)
{
R
Roel Kluin 已提交
402
	if (unlikely(gpio_valid(gpio) < 0)) {
403 404 405 406 407 408 409 410 411
		printk(KERN_ERR "omap-gpio: invalid GPIO %d\n", gpio);
		dump_stack();
		return -1;
	}
	return 0;
}

static void _set_gpio_direction(struct gpio_bank *bank, int gpio, int is_input)
{
412
	void __iomem *reg = bank->base;
413 414 415
	u32 l;

	switch (bank->method) {
416
#ifdef CONFIG_ARCH_OMAP1
417 418 419
	case METHOD_MPUIO:
		reg += OMAP_MPUIO_IO_CNTL;
		break;
420 421
#endif
#ifdef CONFIG_ARCH_OMAP15XX
422 423 424
	case METHOD_GPIO_1510:
		reg += OMAP1510_GPIO_DIR_CONTROL;
		break;
425 426
#endif
#ifdef CONFIG_ARCH_OMAP16XX
427 428 429
	case METHOD_GPIO_1610:
		reg += OMAP1610_GPIO_DIRECTION;
		break;
430
#endif
431
#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
432 433
	case METHOD_GPIO_7XX:
		reg += OMAP7XX_GPIO_DIR_CONTROL;
434 435
		break;
#endif
436
#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
437 438 439
	case METHOD_GPIO_24XX:
		reg += OMAP24XX_GPIO_OE;
		break;
440 441
#endif
#if defined(CONFIG_ARCH_OMAP4)
442
	case METHOD_GPIO_44XX:
443 444
		reg += OMAP4_GPIO_OE;
		break;
445 446 447 448
#endif
	default:
		WARN_ON(1);
		return;
449 450 451 452 453 454 455 456 457 458 459
	}
	l = __raw_readl(reg);
	if (is_input)
		l |= 1 << gpio;
	else
		l &= ~(1 << gpio);
	__raw_writel(l, reg);
}

static void _set_gpio_dataout(struct gpio_bank *bank, int gpio, int enable)
{
460
	void __iomem *reg = bank->base;
461 462 463
	u32 l = 0;

	switch (bank->method) {
464
#ifdef CONFIG_ARCH_OMAP1
465 466 467 468 469 470 471 472
	case METHOD_MPUIO:
		reg += OMAP_MPUIO_OUTPUT;
		l = __raw_readl(reg);
		if (enable)
			l |= 1 << gpio;
		else
			l &= ~(1 << gpio);
		break;
473 474
#endif
#ifdef CONFIG_ARCH_OMAP15XX
475 476 477 478 479 480 481 482
	case METHOD_GPIO_1510:
		reg += OMAP1510_GPIO_DATA_OUTPUT;
		l = __raw_readl(reg);
		if (enable)
			l |= 1 << gpio;
		else
			l &= ~(1 << gpio);
		break;
483 484
#endif
#ifdef CONFIG_ARCH_OMAP16XX
485 486 487 488 489 490 491
	case METHOD_GPIO_1610:
		if (enable)
			reg += OMAP1610_GPIO_SET_DATAOUT;
		else
			reg += OMAP1610_GPIO_CLEAR_DATAOUT;
		l = 1 << gpio;
		break;
492
#endif
493
#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
494 495
	case METHOD_GPIO_7XX:
		reg += OMAP7XX_GPIO_DATA_OUTPUT;
496 497 498 499 500 501 502
		l = __raw_readl(reg);
		if (enable)
			l |= 1 << gpio;
		else
			l &= ~(1 << gpio);
		break;
#endif
503
#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
504 505 506 507 508 509 510
	case METHOD_GPIO_24XX:
		if (enable)
			reg += OMAP24XX_GPIO_SETDATAOUT;
		else
			reg += OMAP24XX_GPIO_CLEARDATAOUT;
		l = 1 << gpio;
		break;
511 512
#endif
#ifdef CONFIG_ARCH_OMAP4
513
	case METHOD_GPIO_44XX:
514 515 516 517 518 519
		if (enable)
			reg += OMAP4_GPIO_SETDATAOUT;
		else
			reg += OMAP4_GPIO_CLEARDATAOUT;
		l = 1 << gpio;
		break;
520
#endif
521
	default:
522
		WARN_ON(1);
523 524 525 526 527
		return;
	}
	__raw_writel(l, reg);
}

528
static int _get_gpio_datain(struct gpio_bank *bank, int gpio)
529
{
530
	void __iomem *reg;
531 532

	if (check_gpio(gpio) < 0)
533
		return -EINVAL;
534 535
	reg = bank->base;
	switch (bank->method) {
536
#ifdef CONFIG_ARCH_OMAP1
537 538 539
	case METHOD_MPUIO:
		reg += OMAP_MPUIO_INPUT_LATCH;
		break;
540 541
#endif
#ifdef CONFIG_ARCH_OMAP15XX
542 543 544
	case METHOD_GPIO_1510:
		reg += OMAP1510_GPIO_DATA_INPUT;
		break;
545 546
#endif
#ifdef CONFIG_ARCH_OMAP16XX
547 548 549
	case METHOD_GPIO_1610:
		reg += OMAP1610_GPIO_DATAIN;
		break;
550
#endif
551
#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
552 553
	case METHOD_GPIO_7XX:
		reg += OMAP7XX_GPIO_DATA_INPUT;
554 555
		break;
#endif
556
#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
557 558 559
	case METHOD_GPIO_24XX:
		reg += OMAP24XX_GPIO_DATAIN;
		break;
560 561
#endif
#ifdef CONFIG_ARCH_OMAP4
562
	case METHOD_GPIO_44XX:
563 564
		reg += OMAP4_GPIO_DATAIN;
		break;
565
#endif
566
	default:
567
		return -EINVAL;
568
	}
569 570
	return (__raw_readl(reg)
			& (1 << get_gpio_index(gpio))) != 0;
571 572
}

573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596
static int _get_gpio_dataout(struct gpio_bank *bank, int gpio)
{
	void __iomem *reg;

	if (check_gpio(gpio) < 0)
		return -EINVAL;
	reg = bank->base;

	switch (bank->method) {
#ifdef CONFIG_ARCH_OMAP1
	case METHOD_MPUIO:
		reg += OMAP_MPUIO_OUTPUT;
		break;
#endif
#ifdef CONFIG_ARCH_OMAP15XX
	case METHOD_GPIO_1510:
		reg += OMAP1510_GPIO_DATA_OUTPUT;
		break;
#endif
#ifdef CONFIG_ARCH_OMAP16XX
	case METHOD_GPIO_1610:
		reg += OMAP1610_GPIO_DATAOUT;
		break;
#endif
597
#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
598 599
	case METHOD_GPIO_7XX:
		reg += OMAP7XX_GPIO_DATA_OUTPUT;
600 601
		break;
#endif
602
#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
603 604 605
	case METHOD_GPIO_24XX:
		reg += OMAP24XX_GPIO_DATAOUT;
		break;
606 607 608 609 610
#endif
#ifdef CONFIG_ARCH_OMAP4
	case METHOD_GPIO_44XX:
		reg += OMAP4_GPIO_DATAOUT;
		break;
611 612 613 614 615 616 617 618
#endif
	default:
		return -EINVAL;
	}

	return (__raw_readl(reg) & (1 << get_gpio_index(gpio))) != 0;
}

619 620 621 622 623 624 625 626
#define MOD_REG_BIT(reg, bit_mask, set)	\
do {	\
	int l = __raw_readl(base + reg); \
	if (set) l |= bit_mask; \
	else l &= ~bit_mask; \
	__raw_writel(l, base + reg); \
} while(0)

627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679
/**
 * _set_gpio_debounce - low level gpio debounce time
 * @bank: the gpio bank we're acting upon
 * @gpio: the gpio number on this @gpio
 * @debounce: debounce time to use
 *
 * OMAP's debounce time is in 31us steps so we need
 * to convert and round up to the closest unit.
 */
static void _set_gpio_debounce(struct gpio_bank *bank, unsigned gpio,
		unsigned debounce)
{
	void __iomem		*reg = bank->base;
	u32			val;
	u32			l;

	if (debounce < 32)
		debounce = 0x01;
	else if (debounce > 7936)
		debounce = 0xff;
	else
		debounce = (debounce / 0x1f) - 1;

	l = 1 << get_gpio_index(gpio);

	if (cpu_is_omap44xx())
		reg += OMAP4_GPIO_DEBOUNCINGTIME;
	else
		reg += OMAP24XX_GPIO_DEBOUNCE_VAL;

	__raw_writel(debounce, reg);

	reg = bank->base;
	if (cpu_is_omap44xx())
		reg += OMAP4_GPIO_DEBOUNCENABLE;
	else
		reg += OMAP24XX_GPIO_DEBOUNCE_EN;

	val = __raw_readl(reg);

	if (debounce) {
		val |= l;
		if (cpu_is_omap34xx() || cpu_is_omap44xx())
			clk_enable(bank->dbck);
	} else {
		val &= ~l;
		if (cpu_is_omap34xx() || cpu_is_omap44xx())
			clk_disable(bank->dbck);
	}

	__raw_writel(val, reg);
}

680 681 682 683
void omap_set_gpio_debounce(int gpio, int enable)
{
	struct gpio_bank *bank;
	void __iomem *reg;
D
David Brownell 已提交
684
	unsigned long flags;
685 686 687 688 689 690 691
	u32 val, l = 1 << get_gpio_index(gpio);

	if (cpu_class_is_omap1())
		return;

	bank = get_gpio_bank(gpio);
	reg = bank->base;
692 693 694 695 696 697

	if (cpu_is_omap44xx())
		reg += OMAP4_GPIO_DEBOUNCENABLE;
	else
		reg += OMAP24XX_GPIO_DEBOUNCE_EN;

C
Charulatha V 已提交
698 699 700 701
	if (!(bank->mod_usage & l)) {
		printk(KERN_ERR "GPIO %d not requested\n", gpio);
		return;
	}
D
David Brownell 已提交
702 703

	spin_lock_irqsave(&bank->lock, flags);
704 705
	val = __raw_readl(reg);

706
	if (enable && !(val & l))
707
		val |= l;
D
David Brownell 已提交
708
	else if (!enable && (val & l))
709
		val &= ~l;
710
	else
D
David Brownell 已提交
711
		goto done;
712

713
	if (cpu_is_omap34xx() || cpu_is_omap44xx()) {
714
		bank->dbck_enable_mask = val;
D
David Brownell 已提交
715 716 717 718 719
		if (enable)
			clk_enable(bank->dbck);
		else
			clk_disable(bank->dbck);
	}
720 721

	__raw_writel(val, reg);
D
David Brownell 已提交
722 723
done:
	spin_unlock_irqrestore(&bank->lock, flags);
724 725 726 727 728 729 730 731 732 733 734 735 736 737
}
EXPORT_SYMBOL(omap_set_gpio_debounce);

void omap_set_gpio_debounce_time(int gpio, int enc_time)
{
	struct gpio_bank *bank;
	void __iomem *reg;

	if (cpu_class_is_omap1())
		return;

	bank = get_gpio_bank(gpio);
	reg = bank->base;

C
Charulatha V 已提交
738 739 740 741 742
	if (!bank->mod_usage) {
		printk(KERN_ERR "GPIO not requested\n");
		return;
	}

743
	enc_time &= 0xff;
744 745 746 747 748 749

	if (cpu_is_omap44xx())
		reg += OMAP4_GPIO_DEBOUNCINGTIME;
	else
		reg += OMAP24XX_GPIO_DEBOUNCE_VAL;

750 751 752 753
	__raw_writel(enc_time, reg);
}
EXPORT_SYMBOL(omap_set_gpio_debounce_time);

754
#ifdef CONFIG_ARCH_OMAP2PLUS
755 756
static inline void set_24xx_gpio_triggering(struct gpio_bank *bank, int gpio,
						int trigger)
757
{
758
	void __iomem *base = bank->base;
759
	u32 gpio_bit = 1 << gpio;
760
	u32 val;
761

762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780
	if (cpu_is_omap44xx()) {
		MOD_REG_BIT(OMAP4_GPIO_LEVELDETECT0, gpio_bit,
			trigger & IRQ_TYPE_LEVEL_LOW);
		MOD_REG_BIT(OMAP4_GPIO_LEVELDETECT1, gpio_bit,
			trigger & IRQ_TYPE_LEVEL_HIGH);
		MOD_REG_BIT(OMAP4_GPIO_RISINGDETECT, gpio_bit,
			trigger & IRQ_TYPE_EDGE_RISING);
		MOD_REG_BIT(OMAP4_GPIO_FALLINGDETECT, gpio_bit,
			trigger & IRQ_TYPE_EDGE_FALLING);
	} else {
		MOD_REG_BIT(OMAP24XX_GPIO_LEVELDETECT0, gpio_bit,
			trigger & IRQ_TYPE_LEVEL_LOW);
		MOD_REG_BIT(OMAP24XX_GPIO_LEVELDETECT1, gpio_bit,
			trigger & IRQ_TYPE_LEVEL_HIGH);
		MOD_REG_BIT(OMAP24XX_GPIO_RISINGDETECT, gpio_bit,
			trigger & IRQ_TYPE_EDGE_RISING);
		MOD_REG_BIT(OMAP24XX_GPIO_FALLINGDETECT, gpio_bit,
			trigger & IRQ_TYPE_EDGE_FALLING);
	}
781
	if (likely(!(bank->non_wakeup_gpios & gpio_bit))) {
782 783 784 785 786 787 788 789 790 791 792
		if (cpu_is_omap44xx()) {
			if (trigger != 0)
				__raw_writel(1 << gpio, bank->base+
						OMAP4_GPIO_IRQWAKEN0);
			else {
				val = __raw_readl(bank->base +
							OMAP4_GPIO_IRQWAKEN0);
				__raw_writel(val & (~(1 << gpio)), bank->base +
							 OMAP4_GPIO_IRQWAKEN0);
			}
		} else {
793 794 795 796 797
			/*
			 * GPIO wakeup request can only be generated on edge
			 * transitions
			 */
			if (trigger & IRQ_TYPE_EDGE_BOTH)
798
				__raw_writel(1 << gpio, bank->base
799
					+ OMAP24XX_GPIO_SETWKUENA);
800 801
			else
				__raw_writel(1 << gpio, bank->base
802
					+ OMAP24XX_GPIO_CLEARWKUENA);
803
		}
T
Tero Kristo 已提交
804 805 806
	}
	/* This part needs to be executed always for OMAP34xx */
	if (cpu_is_omap34xx() || (bank->non_wakeup_gpios & gpio_bit)) {
807 808 809 810 811 812 813
		/*
		 * Log the edge gpio and manually trigger the IRQ
		 * after resume if the input level changes
		 * to avoid irq lost during PER RET/OFF mode
		 * Applies for omap2 non-wakeup gpio and all omap3 gpios
		 */
		if (trigger & IRQ_TYPE_EDGE_BOTH)
814 815 816 817
			bank->enabled_non_wakeup_gpios |= gpio_bit;
		else
			bank->enabled_non_wakeup_gpios &= ~gpio_bit;
	}
818

819 820 821 822 823 824 825 826 827
	if (cpu_is_omap44xx()) {
		bank->level_mask =
			__raw_readl(bank->base + OMAP4_GPIO_LEVELDETECT0) |
			__raw_readl(bank->base + OMAP4_GPIO_LEVELDETECT1);
	} else {
		bank->level_mask =
			__raw_readl(bank->base + OMAP24XX_GPIO_LEVELDETECT0) |
			__raw_readl(bank->base + OMAP24XX_GPIO_LEVELDETECT1);
	}
828
}
829
#endif
830

831
#ifdef CONFIG_ARCH_OMAP1
832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866
/*
 * This only applies to chips that can't do both rising and falling edge
 * detection at once.  For all other chips, this function is a noop.
 */
static void _toggle_gpio_edge_triggering(struct gpio_bank *bank, int gpio)
{
	void __iomem *reg = bank->base;
	u32 l = 0;

	switch (bank->method) {
	case METHOD_MPUIO:
		reg += OMAP_MPUIO_GPIO_INT_EDGE;
		break;
#ifdef CONFIG_ARCH_OMAP15XX
	case METHOD_GPIO_1510:
		reg += OMAP1510_GPIO_INT_CONTROL;
		break;
#endif
#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
	case METHOD_GPIO_7XX:
		reg += OMAP7XX_GPIO_INT_CONTROL;
		break;
#endif
	default:
		return;
	}

	l = __raw_readl(reg);
	if ((l >> gpio) & 1)
		l &= ~(1 << gpio);
	else
		l |= 1 << gpio;

	__raw_writel(l, reg);
}
867
#endif
868

869 870 871 872
static int _set_gpio_triggering(struct gpio_bank *bank, int gpio, int trigger)
{
	void __iomem *reg = bank->base;
	u32 l = 0;
873 874

	switch (bank->method) {
875
#ifdef CONFIG_ARCH_OMAP1
876 877 878
	case METHOD_MPUIO:
		reg += OMAP_MPUIO_GPIO_INT_EDGE;
		l = __raw_readl(reg);
879
		if ((trigger & IRQ_TYPE_SENSE_MASK) == IRQ_TYPE_EDGE_BOTH)
880
			bank->toggle_mask |= 1 << gpio;
881
		if (trigger & IRQ_TYPE_EDGE_RISING)
882
			l |= 1 << gpio;
883
		else if (trigger & IRQ_TYPE_EDGE_FALLING)
884
			l &= ~(1 << gpio);
885 886
		else
			goto bad;
887
		break;
888 889
#endif
#ifdef CONFIG_ARCH_OMAP15XX
890 891 892
	case METHOD_GPIO_1510:
		reg += OMAP1510_GPIO_INT_CONTROL;
		l = __raw_readl(reg);
893
		if ((trigger & IRQ_TYPE_SENSE_MASK) == IRQ_TYPE_EDGE_BOTH)
894
			bank->toggle_mask |= 1 << gpio;
895
		if (trigger & IRQ_TYPE_EDGE_RISING)
896
			l |= 1 << gpio;
897
		else if (trigger & IRQ_TYPE_EDGE_FALLING)
898
			l &= ~(1 << gpio);
899 900
		else
			goto bad;
901
		break;
902
#endif
903
#ifdef CONFIG_ARCH_OMAP16XX
904 905 906 907 908 909 910 911
	case METHOD_GPIO_1610:
		if (gpio & 0x08)
			reg += OMAP1610_GPIO_EDGE_CTRL2;
		else
			reg += OMAP1610_GPIO_EDGE_CTRL1;
		gpio &= 0x07;
		l = __raw_readl(reg);
		l &= ~(3 << (gpio << 1));
912
		if (trigger & IRQ_TYPE_EDGE_RISING)
913
			l |= 2 << (gpio << 1);
914
		if (trigger & IRQ_TYPE_EDGE_FALLING)
915
			l |= 1 << (gpio << 1);
916 917 918 919 920
		if (trigger)
			/* Enable wake-up during idle for dynamic tick */
			__raw_writel(1 << gpio, bank->base + OMAP1610_GPIO_SET_WAKEUPENA);
		else
			__raw_writel(1 << gpio, bank->base + OMAP1610_GPIO_CLEAR_WAKEUPENA);
921
		break;
922
#endif
923
#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
924 925
	case METHOD_GPIO_7XX:
		reg += OMAP7XX_GPIO_INT_CONTROL;
926
		l = __raw_readl(reg);
927
		if ((trigger & IRQ_TYPE_SENSE_MASK) == IRQ_TYPE_EDGE_BOTH)
928
			bank->toggle_mask |= 1 << gpio;
929 930 931 932 933 934 935 936
		if (trigger & IRQ_TYPE_EDGE_RISING)
			l |= 1 << gpio;
		else if (trigger & IRQ_TYPE_EDGE_FALLING)
			l &= ~(1 << gpio);
		else
			goto bad;
		break;
#endif
937
#ifdef CONFIG_ARCH_OMAP2PLUS
938
	case METHOD_GPIO_24XX:
939
	case METHOD_GPIO_44XX:
940
		set_24xx_gpio_triggering(bank, gpio, trigger);
941
		break;
942
#endif
943
	default:
944
		goto bad;
945
	}
946 947 948 949
	__raw_writel(l, reg);
	return 0;
bad:
	return -EINVAL;
950 951
}

952
static int gpio_irq_type(unsigned irq, unsigned type)
953 954
{
	struct gpio_bank *bank;
955 956
	unsigned gpio;
	int retval;
D
David Brownell 已提交
957
	unsigned long flags;
958

959
	if (!cpu_class_is_omap2() && irq > IH_MPUIO_BASE)
960 961 962
		gpio = OMAP_MPUIO(irq - IH_MPUIO_BASE);
	else
		gpio = irq - IH_GPIO_BASE;
963 964

	if (check_gpio(gpio) < 0)
965 966
		return -EINVAL;

967
	if (type & ~IRQ_TYPE_SENSE_MASK)
968
		return -EINVAL;
969 970

	/* OMAP1 allows only only edge triggering */
971
	if (!cpu_class_is_omap2()
972
			&& (type & (IRQ_TYPE_LEVEL_LOW|IRQ_TYPE_LEVEL_HIGH)))
973 974
		return -EINVAL;

975
	bank = get_irq_chip_data(irq);
D
David Brownell 已提交
976
	spin_lock_irqsave(&bank->lock, flags);
977
	retval = _set_gpio_triggering(bank, get_gpio_index(gpio), type);
978 979 980 981
	if (retval == 0) {
		irq_desc[irq].status &= ~IRQ_TYPE_SENSE_MASK;
		irq_desc[irq].status |= type;
	}
D
David Brownell 已提交
982
	spin_unlock_irqrestore(&bank->lock, flags);
983 984 985 986 987 988

	if (type & (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH))
		__set_irq_handler_unlocked(irq, handle_level_irq);
	else if (type & (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING))
		__set_irq_handler_unlocked(irq, handle_edge_irq);

989
	return retval;
990 991 992 993
}

static void _clear_gpio_irqbank(struct gpio_bank *bank, int gpio_mask)
{
994
	void __iomem *reg = bank->base;
995 996

	switch (bank->method) {
997
#ifdef CONFIG_ARCH_OMAP1
998 999 1000 1001
	case METHOD_MPUIO:
		/* MPUIO irqstatus is reset by reading the status register,
		 * so do nothing here */
		return;
1002 1003
#endif
#ifdef CONFIG_ARCH_OMAP15XX
1004 1005 1006
	case METHOD_GPIO_1510:
		reg += OMAP1510_GPIO_INT_STATUS;
		break;
1007 1008
#endif
#ifdef CONFIG_ARCH_OMAP16XX
1009 1010 1011
	case METHOD_GPIO_1610:
		reg += OMAP1610_GPIO_IRQSTATUS1;
		break;
1012
#endif
1013
#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
1014 1015
	case METHOD_GPIO_7XX:
		reg += OMAP7XX_GPIO_INT_STATUS;
1016 1017
		break;
#endif
1018
#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
1019 1020 1021
	case METHOD_GPIO_24XX:
		reg += OMAP24XX_GPIO_IRQSTATUS1;
		break;
1022 1023
#endif
#if defined(CONFIG_ARCH_OMAP4)
1024
	case METHOD_GPIO_44XX:
1025 1026
		reg += OMAP4_GPIO_IRQSTATUS0;
		break;
1027
#endif
1028
	default:
1029
		WARN_ON(1);
1030 1031 1032
		return;
	}
	__raw_writel(gpio_mask, reg);
1033 1034

	/* Workaround for clearing DSP GPIO interrupts to allow retention */
1035 1036 1037 1038 1039
	if (cpu_is_omap24xx() || cpu_is_omap34xx())
		reg = bank->base + OMAP24XX_GPIO_IRQSTATUS2;
	else if (cpu_is_omap44xx())
		reg = bank->base + OMAP4_GPIO_IRQSTATUS1;

1040
	if (cpu_is_omap24xx() || cpu_is_omap34xx() || cpu_is_omap44xx()) {
1041 1042 1043 1044
		__raw_writel(gpio_mask, reg);

	/* Flush posted write for the irq status to avoid spurious interrupts */
	__raw_readl(reg);
1045
	}
1046 1047 1048 1049 1050 1051 1052
}

static inline void _clear_gpio_irqstatus(struct gpio_bank *bank, int gpio)
{
	_clear_gpio_irqbank(bank, 1 << get_gpio_index(gpio));
}

1053 1054 1055
static u32 _get_gpio_irqbank_mask(struct gpio_bank *bank)
{
	void __iomem *reg = bank->base;
1056 1057 1058
	int inv = 0;
	u32 l;
	u32 mask;
1059 1060

	switch (bank->method) {
1061
#ifdef CONFIG_ARCH_OMAP1
1062 1063
	case METHOD_MPUIO:
		reg += OMAP_MPUIO_GPIO_MASKIT;
1064 1065
		mask = 0xffff;
		inv = 1;
1066
		break;
1067 1068
#endif
#ifdef CONFIG_ARCH_OMAP15XX
1069 1070
	case METHOD_GPIO_1510:
		reg += OMAP1510_GPIO_INT_MASK;
1071 1072
		mask = 0xffff;
		inv = 1;
1073
		break;
1074 1075
#endif
#ifdef CONFIG_ARCH_OMAP16XX
1076 1077
	case METHOD_GPIO_1610:
		reg += OMAP1610_GPIO_IRQENABLE1;
1078
		mask = 0xffff;
1079
		break;
1080
#endif
1081
#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
1082 1083
	case METHOD_GPIO_7XX:
		reg += OMAP7XX_GPIO_INT_MASK;
1084 1085 1086 1087
		mask = 0xffffffff;
		inv = 1;
		break;
#endif
1088
#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
1089 1090
	case METHOD_GPIO_24XX:
		reg += OMAP24XX_GPIO_IRQENABLE1;
1091
		mask = 0xffffffff;
1092
		break;
1093 1094
#endif
#if defined(CONFIG_ARCH_OMAP4)
1095
	case METHOD_GPIO_44XX:
1096 1097 1098
		reg += OMAP4_GPIO_IRQSTATUSSET0;
		mask = 0xffffffff;
		break;
1099
#endif
1100
	default:
1101
		WARN_ON(1);
1102 1103 1104
		return 0;
	}

1105 1106 1107 1108 1109
	l = __raw_readl(reg);
	if (inv)
		l = ~l;
	l &= mask;
	return l;
1110 1111
}

1112 1113
static void _enable_gpio_irqbank(struct gpio_bank *bank, int gpio_mask, int enable)
{
1114
	void __iomem *reg = bank->base;
1115 1116 1117
	u32 l;

	switch (bank->method) {
1118
#ifdef CONFIG_ARCH_OMAP1
1119 1120 1121 1122 1123 1124 1125 1126
	case METHOD_MPUIO:
		reg += OMAP_MPUIO_GPIO_MASKIT;
		l = __raw_readl(reg);
		if (enable)
			l &= ~(gpio_mask);
		else
			l |= gpio_mask;
		break;
1127 1128
#endif
#ifdef CONFIG_ARCH_OMAP15XX
1129 1130 1131 1132 1133 1134 1135 1136
	case METHOD_GPIO_1510:
		reg += OMAP1510_GPIO_INT_MASK;
		l = __raw_readl(reg);
		if (enable)
			l &= ~(gpio_mask);
		else
			l |= gpio_mask;
		break;
1137 1138
#endif
#ifdef CONFIG_ARCH_OMAP16XX
1139 1140 1141 1142 1143 1144 1145
	case METHOD_GPIO_1610:
		if (enable)
			reg += OMAP1610_GPIO_SET_IRQENABLE1;
		else
			reg += OMAP1610_GPIO_CLEAR_IRQENABLE1;
		l = gpio_mask;
		break;
1146
#endif
1147
#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
1148 1149
	case METHOD_GPIO_7XX:
		reg += OMAP7XX_GPIO_INT_MASK;
1150 1151 1152 1153 1154 1155 1156
		l = __raw_readl(reg);
		if (enable)
			l &= ~(gpio_mask);
		else
			l |= gpio_mask;
		break;
#endif
1157
#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
1158 1159 1160 1161 1162 1163 1164
	case METHOD_GPIO_24XX:
		if (enable)
			reg += OMAP24XX_GPIO_SETIRQENABLE1;
		else
			reg += OMAP24XX_GPIO_CLEARIRQENABLE1;
		l = gpio_mask;
		break;
1165 1166
#endif
#ifdef CONFIG_ARCH_OMAP4
1167
	case METHOD_GPIO_44XX:
1168 1169 1170 1171 1172 1173
		if (enable)
			reg += OMAP4_GPIO_IRQSTATUSSET0;
		else
			reg += OMAP4_GPIO_IRQSTATUSCLR0;
		l = gpio_mask;
		break;
1174
#endif
1175
	default:
1176
		WARN_ON(1);
1177 1178 1179 1180 1181 1182 1183 1184 1185 1186
		return;
	}
	__raw_writel(l, reg);
}

static inline void _set_gpio_irqenable(struct gpio_bank *bank, int gpio, int enable)
{
	_enable_gpio_irqbank(bank, 1 << get_gpio_index(gpio), enable);
}

1187 1188 1189 1190 1191 1192 1193 1194 1195 1196
/*
 * Note that ENAWAKEUP needs to be enabled in GPIO_SYSCONFIG register.
 * 1510 does not seem to have a wake-up register. If JTAG is connected
 * to the target, system will wake up always on GPIO events. While
 * system is running all registered GPIO interrupts need to have wake-up
 * enabled. When system is suspended, only selected GPIO interrupts need
 * to have wake-up enabled.
 */
static int _set_gpio_wakeup(struct gpio_bank *bank, int gpio, int enable)
{
1197
	unsigned long uninitialized_var(flags);
D
David Brownell 已提交
1198

1199
	switch (bank->method) {
1200
#ifdef CONFIG_ARCH_OMAP16XX
D
David Brownell 已提交
1201
	case METHOD_MPUIO:
1202
	case METHOD_GPIO_1610:
D
David Brownell 已提交
1203
		spin_lock_irqsave(&bank->lock, flags);
1204
		if (enable)
1205
			bank->suspend_wakeup |= (1 << gpio);
1206
		else
1207
			bank->suspend_wakeup &= ~(1 << gpio);
D
David Brownell 已提交
1208
		spin_unlock_irqrestore(&bank->lock, flags);
1209
		return 0;
1210
#endif
1211
#ifdef CONFIG_ARCH_OMAP2PLUS
1212
	case METHOD_GPIO_24XX:
1213
	case METHOD_GPIO_44XX:
D
David Brownell 已提交
1214 1215 1216 1217 1218 1219
		if (bank->non_wakeup_gpios & (1 << gpio)) {
			printk(KERN_ERR "Unable to modify wakeup on "
					"non-wakeup GPIO%d\n",
					(bank - gpio_bank) * 32 + gpio);
			return -EINVAL;
		}
D
David Brownell 已提交
1220
		spin_lock_irqsave(&bank->lock, flags);
1221
		if (enable)
1222
			bank->suspend_wakeup |= (1 << gpio);
1223
		else
1224
			bank->suspend_wakeup &= ~(1 << gpio);
D
David Brownell 已提交
1225
		spin_unlock_irqrestore(&bank->lock, flags);
1226 1227
		return 0;
#endif
1228 1229 1230 1231 1232 1233 1234
	default:
		printk(KERN_ERR "Can't enable GPIO wakeup for method %i\n",
		       bank->method);
		return -EINVAL;
	}
}

1235 1236 1237 1238 1239
static void _reset_gpio(struct gpio_bank *bank, int gpio)
{
	_set_gpio_direction(bank, get_gpio_index(gpio), 1);
	_set_gpio_irqenable(bank, gpio, 0);
	_clear_gpio_irqstatus(bank, gpio);
1240
	_set_gpio_triggering(bank, get_gpio_index(gpio), IRQ_TYPE_NONE);
1241 1242
}

1243 1244 1245 1246 1247 1248 1249 1250 1251
/* Use disable_irq_wake() and enable_irq_wake() functions from drivers */
static int gpio_wake_enable(unsigned int irq, unsigned int enable)
{
	unsigned int gpio = irq - IH_GPIO_BASE;
	struct gpio_bank *bank;
	int retval;

	if (check_gpio(gpio) < 0)
		return -ENODEV;
1252
	bank = get_irq_chip_data(irq);
1253 1254 1255 1256 1257
	retval = _set_gpio_wakeup(bank, get_gpio_index(gpio), enable);

	return retval;
}

1258
static int omap_gpio_request(struct gpio_chip *chip, unsigned offset)
1259
{
1260
	struct gpio_bank *bank = container_of(chip, struct gpio_bank, chip);
D
David Brownell 已提交
1261
	unsigned long flags;
D
David Brownell 已提交
1262

D
David Brownell 已提交
1263
	spin_lock_irqsave(&bank->lock, flags);
1264

1265 1266 1267
	/* Set trigger to none. You need to enable the desired trigger with
	 * request_irq() or set_irq_type().
	 */
1268
	_set_gpio_triggering(bank, offset, IRQ_TYPE_NONE);
1269

1270
#ifdef CONFIG_ARCH_OMAP15XX
1271
	if (bank->method == METHOD_GPIO_1510) {
1272
		void __iomem *reg;
1273

1274
		/* Claim the pin for MPU */
1275
		reg = bank->base + OMAP1510_GPIO_PIN_CONTROL;
1276
		__raw_writel(__raw_readl(reg) | (1 << offset), reg);
1277 1278
	}
#endif
C
Charulatha V 已提交
1279 1280
	if (!cpu_class_is_omap1()) {
		if (!bank->mod_usage) {
1281
			void __iomem *reg = bank->base;
C
Charulatha V 已提交
1282
			u32 ctrl;
1283 1284 1285 1286 1287 1288

			if (cpu_is_omap24xx() || cpu_is_omap34xx())
				reg += OMAP24XX_GPIO_CTRL;
			else if (cpu_is_omap44xx())
				reg += OMAP4_GPIO_CTRL;
			ctrl = __raw_readl(reg);
C
Charulatha V 已提交
1289
			/* Module is enabled, clocks are not gated */
1290 1291
			ctrl &= 0xFFFFFFFE;
			__raw_writel(ctrl, reg);
C
Charulatha V 已提交
1292 1293 1294
		}
		bank->mod_usage |= 1 << offset;
	}
D
David Brownell 已提交
1295
	spin_unlock_irqrestore(&bank->lock, flags);
1296 1297 1298 1299

	return 0;
}

1300
static void omap_gpio_free(struct gpio_chip *chip, unsigned offset)
1301
{
1302
	struct gpio_bank *bank = container_of(chip, struct gpio_bank, chip);
D
David Brownell 已提交
1303
	unsigned long flags;
1304

D
David Brownell 已提交
1305
	spin_lock_irqsave(&bank->lock, flags);
1306 1307 1308 1309
#ifdef CONFIG_ARCH_OMAP16XX
	if (bank->method == METHOD_GPIO_1610) {
		/* Disable wake-up during idle for dynamic tick */
		void __iomem *reg = bank->base + OMAP1610_GPIO_CLEAR_WAKEUPENA;
1310
		__raw_writel(1 << offset, reg);
1311 1312
	}
#endif
1313 1314
#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
	if (bank->method == METHOD_GPIO_24XX) {
1315 1316
		/* Disable wake-up during idle for dynamic tick */
		void __iomem *reg = bank->base + OMAP24XX_GPIO_CLEARWKUENA;
1317
		__raw_writel(1 << offset, reg);
1318
	}
1319 1320 1321 1322 1323 1324 1325
#endif
#ifdef CONFIG_ARCH_OMAP4
	if (bank->method == METHOD_GPIO_44XX) {
		/* Disable wake-up during idle for dynamic tick */
		void __iomem *reg = bank->base + OMAP4_GPIO_IRQWAKEN0;
		__raw_writel(1 << offset, reg);
	}
1326
#endif
C
Charulatha V 已提交
1327 1328 1329
	if (!cpu_class_is_omap1()) {
		bank->mod_usage &= ~(1 << offset);
		if (!bank->mod_usage) {
1330
			void __iomem *reg = bank->base;
C
Charulatha V 已提交
1331
			u32 ctrl;
1332 1333 1334 1335 1336 1337

			if (cpu_is_omap24xx() || cpu_is_omap34xx())
				reg += OMAP24XX_GPIO_CTRL;
			else if (cpu_is_omap44xx())
				reg += OMAP4_GPIO_CTRL;
			ctrl = __raw_readl(reg);
C
Charulatha V 已提交
1338 1339
			/* Module is disabled, clocks are gated */
			ctrl |= 1;
1340
			__raw_writel(ctrl, reg);
C
Charulatha V 已提交
1341 1342
		}
	}
1343
	_reset_gpio(bank, bank->chip.base + offset);
D
David Brownell 已提交
1344
	spin_unlock_irqrestore(&bank->lock, flags);
1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355
}

/*
 * We need to unmask the GPIO bank interrupt as soon as possible to
 * avoid missing GPIO interrupts for other lines in the bank.
 * Then we need to mask-read-clear-unmask the triggered GPIO lines
 * in the bank to avoid missing nested interrupts for a GPIO line.
 * If we wait to unmask individual GPIO lines in the bank after the
 * line's interrupt handler has been run, we may miss some nested
 * interrupts.
 */
1356
static void gpio_irq_handler(unsigned int irq, struct irq_desc *desc)
1357
{
1358
	void __iomem *isr_reg = NULL;
1359
	u32 isr;
1360
	unsigned int gpio_irq, gpio_index;
1361
	struct gpio_bank *bank;
1362 1363
	u32 retrigger = 0;
	int unmasked = 0;
1364 1365 1366

	desc->chip->ack(irq);

1367
	bank = get_irq_data(irq);
1368
#ifdef CONFIG_ARCH_OMAP1
1369 1370
	if (bank->method == METHOD_MPUIO)
		isr_reg = bank->base + OMAP_MPUIO_GPIO_INT;
1371
#endif
1372
#ifdef CONFIG_ARCH_OMAP15XX
1373 1374 1375 1376 1377 1378 1379
	if (bank->method == METHOD_GPIO_1510)
		isr_reg = bank->base + OMAP1510_GPIO_INT_STATUS;
#endif
#if defined(CONFIG_ARCH_OMAP16XX)
	if (bank->method == METHOD_GPIO_1610)
		isr_reg = bank->base + OMAP1610_GPIO_IRQSTATUS1;
#endif
1380
#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
1381 1382
	if (bank->method == METHOD_GPIO_7XX)
		isr_reg = bank->base + OMAP7XX_GPIO_INT_STATUS;
1383
#endif
1384
#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
1385 1386
	if (bank->method == METHOD_GPIO_24XX)
		isr_reg = bank->base + OMAP24XX_GPIO_IRQSTATUS1;
1387 1388
#endif
#if defined(CONFIG_ARCH_OMAP4)
1389
	if (bank->method == METHOD_GPIO_44XX)
1390
		isr_reg = bank->base + OMAP4_GPIO_IRQSTATUS0;
1391 1392
#endif
	while(1) {
1393
		u32 isr_saved, level_mask = 0;
1394
		u32 enabled;
1395

1396 1397
		enabled = _get_gpio_irqbank_mask(bank);
		isr_saved = isr = __raw_readl(isr_reg) & enabled;
1398 1399 1400 1401

		if (cpu_is_omap15xx() && (bank->method == METHOD_MPUIO))
			isr &= 0x0000ffff;

1402
		if (cpu_class_is_omap2()) {
1403
			level_mask = bank->level_mask & enabled;
1404
		}
1405 1406 1407 1408 1409 1410 1411 1412 1413 1414

		/* clear edge sensitive interrupts before handler(s) are
		called so that we don't miss any interrupt occurred while
		executing them */
		_enable_gpio_irqbank(bank, isr_saved & ~level_mask, 0);
		_clear_gpio_irqbank(bank, isr_saved & ~level_mask);
		_enable_gpio_irqbank(bank, isr_saved & ~level_mask, 1);

		/* if there is only edge sensitive GPIO pin interrupts
		configured, we could unmask GPIO bank interrupt immediately */
1415 1416
		if (!level_mask && !unmasked) {
			unmasked = 1;
1417
			desc->chip->unmask(irq);
1418
		}
1419

1420 1421
		isr |= retrigger;
		retrigger = 0;
1422 1423 1424 1425 1426
		if (!isr)
			break;

		gpio_irq = bank->virtual_irq_start;
		for (; isr != 0; isr >>= 1, gpio_irq++) {
1427 1428
			gpio_index = get_gpio_index(irq_to_gpio(gpio_irq));

1429 1430
			if (!(isr & 1))
				continue;
1431

1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443
#ifdef CONFIG_ARCH_OMAP1
			/*
			 * Some chips can't respond to both rising and falling
			 * at the same time.  If this irq was requested with
			 * both flags, we need to flip the ICR data for the IRQ
			 * to respond to the IRQ for the opposite direction.
			 * This will be indicated in the bank toggle_mask.
			 */
			if (bank->toggle_mask & (1 << gpio_index))
				_toggle_gpio_edge_triggering(bank, gpio_index);
#endif

1444
			generic_handle_irq(gpio_irq);
1445
		}
1446
	}
1447 1448 1449 1450 1451 1452 1453
	/* if bank has any level sensitive GPIO pin interrupt
	configured, we must unmask the bank interrupt only after
	handler(s) are executed in order to avoid spurious bank
	interrupt */
	if (!unmasked)
		desc->chip->unmask(irq);

1454 1455
}

1456 1457 1458
static void gpio_irq_shutdown(unsigned int irq)
{
	unsigned int gpio = irq - IH_GPIO_BASE;
1459
	struct gpio_bank *bank = get_irq_chip_data(irq);
1460 1461 1462 1463

	_reset_gpio(bank, gpio);
}

1464 1465 1466
static void gpio_ack_irq(unsigned int irq)
{
	unsigned int gpio = irq - IH_GPIO_BASE;
1467
	struct gpio_bank *bank = get_irq_chip_data(irq);
1468 1469 1470 1471 1472 1473 1474

	_clear_gpio_irqstatus(bank, gpio);
}

static void gpio_mask_irq(unsigned int irq)
{
	unsigned int gpio = irq - IH_GPIO_BASE;
1475
	struct gpio_bank *bank = get_irq_chip_data(irq);
1476 1477

	_set_gpio_irqenable(bank, gpio, 0);
1478
	_set_gpio_triggering(bank, get_gpio_index(gpio), IRQ_TYPE_NONE);
1479 1480 1481 1482 1483
}

static void gpio_unmask_irq(unsigned int irq)
{
	unsigned int gpio = irq - IH_GPIO_BASE;
1484
	struct gpio_bank *bank = get_irq_chip_data(irq);
1485
	unsigned int irq_mask = 1 << get_gpio_index(gpio);
1486 1487 1488 1489 1490
	struct irq_desc *desc = irq_to_desc(irq);
	u32 trigger = desc->status & IRQ_TYPE_SENSE_MASK;

	if (trigger)
		_set_gpio_triggering(bank, get_gpio_index(gpio), trigger);
1491 1492 1493 1494 1495 1496 1497

	/* For level-triggered GPIOs, the clearing must be done after
	 * the HW source is cleared, thus after the handler has run */
	if (bank->level_mask & irq_mask) {
		_set_gpio_irqenable(bank, gpio, 0);
		_clear_gpio_irqstatus(bank, gpio);
	}
1498

K
Kevin Hilman 已提交
1499
	_set_gpio_irqenable(bank, gpio, 1);
1500 1501
}

1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517
static struct irq_chip gpio_irq_chip = {
	.name		= "GPIO",
	.shutdown	= gpio_irq_shutdown,
	.ack		= gpio_ack_irq,
	.mask		= gpio_mask_irq,
	.unmask		= gpio_unmask_irq,
	.set_type	= gpio_irq_type,
	.set_wake	= gpio_wake_enable,
};

/*---------------------------------------------------------------------*/

#ifdef CONFIG_ARCH_OMAP1

/* MPUIO uses the always-on 32k clock */

1518 1519 1520 1521 1522 1523 1524 1525
static void mpuio_ack_irq(unsigned int irq)
{
	/* The ISR is reset automatically, so do nothing here. */
}

static void mpuio_mask_irq(unsigned int irq)
{
	unsigned int gpio = OMAP_MPUIO(irq - IH_MPUIO_BASE);
1526
	struct gpio_bank *bank = get_irq_chip_data(irq);
1527 1528 1529 1530 1531 1532 1533

	_set_gpio_irqenable(bank, gpio, 0);
}

static void mpuio_unmask_irq(unsigned int irq)
{
	unsigned int gpio = OMAP_MPUIO(irq - IH_MPUIO_BASE);
1534
	struct gpio_bank *bank = get_irq_chip_data(irq);
1535 1536 1537 1538

	_set_gpio_irqenable(bank, gpio, 1);
}

1539 1540 1541 1542 1543
static struct irq_chip mpuio_irq_chip = {
	.name		= "MPUIO",
	.ack		= mpuio_ack_irq,
	.mask		= mpuio_mask_irq,
	.unmask		= mpuio_unmask_irq,
1544
	.set_type	= gpio_irq_type,
D
David Brownell 已提交
1545 1546 1547 1548
#ifdef CONFIG_ARCH_OMAP16XX
	/* REVISIT: assuming only 16xx supports MPUIO wake events */
	.set_wake	= gpio_wake_enable,
#endif
1549 1550
};

1551 1552 1553

#define bank_is_mpuio(bank)	((bank)->method == METHOD_MPUIO)

D
David Brownell 已提交
1554 1555 1556 1557 1558

#ifdef CONFIG_ARCH_OMAP16XX

#include <linux/platform_device.h>

1559
static int omap_mpuio_suspend_noirq(struct device *dev)
D
David Brownell 已提交
1560
{
1561
	struct platform_device *pdev = to_platform_device(dev);
D
David Brownell 已提交
1562 1563
	struct gpio_bank	*bank = platform_get_drvdata(pdev);
	void __iomem		*mask_reg = bank->base + OMAP_MPUIO_GPIO_MASKIT;
D
David Brownell 已提交
1564
	unsigned long		flags;
D
David Brownell 已提交
1565

D
David Brownell 已提交
1566
	spin_lock_irqsave(&bank->lock, flags);
D
David Brownell 已提交
1567 1568
	bank->saved_wakeup = __raw_readl(mask_reg);
	__raw_writel(0xffff & ~bank->suspend_wakeup, mask_reg);
D
David Brownell 已提交
1569
	spin_unlock_irqrestore(&bank->lock, flags);
D
David Brownell 已提交
1570 1571 1572 1573

	return 0;
}

1574
static int omap_mpuio_resume_noirq(struct device *dev)
D
David Brownell 已提交
1575
{
1576
	struct platform_device *pdev = to_platform_device(dev);
D
David Brownell 已提交
1577 1578
	struct gpio_bank	*bank = platform_get_drvdata(pdev);
	void __iomem		*mask_reg = bank->base + OMAP_MPUIO_GPIO_MASKIT;
D
David Brownell 已提交
1579
	unsigned long		flags;
D
David Brownell 已提交
1580

D
David Brownell 已提交
1581
	spin_lock_irqsave(&bank->lock, flags);
D
David Brownell 已提交
1582
	__raw_writel(bank->saved_wakeup, mask_reg);
D
David Brownell 已提交
1583
	spin_unlock_irqrestore(&bank->lock, flags);
D
David Brownell 已提交
1584 1585 1586 1587

	return 0;
}

1588
static const struct dev_pm_ops omap_mpuio_dev_pm_ops = {
1589 1590 1591 1592
	.suspend_noirq = omap_mpuio_suspend_noirq,
	.resume_noirq = omap_mpuio_resume_noirq,
};

D
David Brownell 已提交
1593 1594 1595 1596 1597 1598
/* use platform_driver for this, now that there's no longer any
 * point to sys_device (other than not disturbing old code).
 */
static struct platform_driver omap_mpuio_driver = {
	.driver		= {
		.name	= "mpuio",
1599
		.pm	= &omap_mpuio_dev_pm_ops,
D
David Brownell 已提交
1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613
	},
};

static struct platform_device omap_mpuio_device = {
	.name		= "mpuio",
	.id		= -1,
	.dev = {
		.driver = &omap_mpuio_driver.driver,
	}
	/* could list the /proc/iomem resources */
};

static inline void mpuio_init(void)
{
1614 1615
	platform_set_drvdata(&omap_mpuio_device, &gpio_bank_1610[0]);

D
David Brownell 已提交
1616 1617 1618 1619 1620 1621 1622 1623
	if (platform_driver_register(&omap_mpuio_driver) == 0)
		(void) platform_device_register(&omap_mpuio_device);
}

#else
static inline void mpuio_init(void) {}
#endif	/* 16xx */

1624 1625 1626 1627 1628
#else

extern struct irq_chip mpuio_irq_chip;

#define bank_is_mpuio(bank)	0
D
David Brownell 已提交
1629
static inline void mpuio_init(void) {}
1630 1631 1632 1633

#endif

/*---------------------------------------------------------------------*/
1634

D
David Brownell 已提交
1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650
/* REVISIT these are stupid implementations!  replace by ones that
 * don't switch on METHOD_* and which mostly avoid spinlocks
 */

static int gpio_input(struct gpio_chip *chip, unsigned offset)
{
	struct gpio_bank *bank;
	unsigned long flags;

	bank = container_of(chip, struct gpio_bank, chip);
	spin_lock_irqsave(&bank->lock, flags);
	_set_gpio_direction(bank, offset, 1);
	spin_unlock_irqrestore(&bank->lock, flags);
	return 0;
}

1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664
static int gpio_is_input(struct gpio_bank *bank, int mask)
{
	void __iomem *reg = bank->base;

	switch (bank->method) {
	case METHOD_MPUIO:
		reg += OMAP_MPUIO_IO_CNTL;
		break;
	case METHOD_GPIO_1510:
		reg += OMAP1510_GPIO_DIR_CONTROL;
		break;
	case METHOD_GPIO_1610:
		reg += OMAP1610_GPIO_DIRECTION;
		break;
1665 1666
	case METHOD_GPIO_7XX:
		reg += OMAP7XX_GPIO_DIR_CONTROL;
1667 1668 1669 1670
		break;
	case METHOD_GPIO_24XX:
		reg += OMAP24XX_GPIO_OE;
		break;
1671 1672 1673 1674 1675 1676
	case METHOD_GPIO_44XX:
		reg += OMAP4_GPIO_OE;
		break;
	default:
		WARN_ONCE(1, "gpio_is_input: incorrect OMAP GPIO method");
		return -EINVAL;
1677 1678 1679 1680
	}
	return __raw_readl(reg) & mask;
}

D
David Brownell 已提交
1681 1682
static int gpio_get(struct gpio_chip *chip, unsigned offset)
{
1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696
	struct gpio_bank *bank;
	void __iomem *reg;
	int gpio;
	u32 mask;

	gpio = chip->base + offset;
	bank = get_gpio_bank(gpio);
	reg = bank->base;
	mask = 1 << get_gpio_index(gpio);

	if (gpio_is_input(bank, mask))
		return _get_gpio_datain(bank, gpio);
	else
		return _get_gpio_dataout(bank, gpio);
D
David Brownell 已提交
1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711
}

static int gpio_output(struct gpio_chip *chip, unsigned offset, int value)
{
	struct gpio_bank *bank;
	unsigned long flags;

	bank = container_of(chip, struct gpio_bank, chip);
	spin_lock_irqsave(&bank->lock, flags);
	_set_gpio_dataout(bank, offset, value);
	_set_gpio_direction(bank, offset, 0);
	spin_unlock_irqrestore(&bank->lock, flags);
	return 0;
}

1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725
static int gpio_debounce(struct gpio_chip *chip, unsigned offset,
		unsigned debounce)
{
	struct gpio_bank *bank;
	unsigned long flags;

	bank = container_of(chip, struct gpio_bank, chip);
	spin_lock_irqsave(&bank->lock, flags);
	_set_gpio_debounce(bank, offset, debounce);
	spin_unlock_irqrestore(&bank->lock, flags);

	return 0;
}

D
David Brownell 已提交
1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736
static void gpio_set(struct gpio_chip *chip, unsigned offset, int value)
{
	struct gpio_bank *bank;
	unsigned long flags;

	bank = container_of(chip, struct gpio_bank, chip);
	spin_lock_irqsave(&bank->lock, flags);
	_set_gpio_dataout(bank, offset, value);
	spin_unlock_irqrestore(&bank->lock, flags);
}

1737 1738 1739 1740 1741 1742 1743 1744
static int gpio_2irq(struct gpio_chip *chip, unsigned offset)
{
	struct gpio_bank *bank;

	bank = container_of(chip, struct gpio_bank, chip);
	return bank->virtual_irq_start + offset;
}

D
David Brownell 已提交
1745 1746
/*---------------------------------------------------------------------*/

1747
static int initialized;
1748
#if defined(CONFIG_ARCH_OMAP1) || defined(CONFIG_ARCH_OMAP2)
1749
static struct clk * gpio_ick;
1750 1751 1752
#endif

#if defined(CONFIG_ARCH_OMAP2)
1753
static struct clk * gpio_fck;
1754
#endif
1755

1756
#if defined(CONFIG_ARCH_OMAP2430)
1757 1758 1759 1760
static struct clk * gpio5_ick;
static struct clk * gpio5_fck;
#endif

1761
#if defined(CONFIG_ARCH_OMAP3) || defined(CONFIG_ARCH_OMAP4)
1762 1763 1764
static struct clk *gpio_iclks[OMAP34XX_NR_GPIOS];
#endif

T
Tony Lindgren 已提交
1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781
static void __init omap_gpio_show_rev(void)
{
	u32 rev;

	if (cpu_is_omap16xx())
		rev = __raw_readw(gpio_bank[1].base + OMAP1610_GPIO_REVISION);
	else if (cpu_is_omap24xx() || cpu_is_omap34xx())
		rev = __raw_readl(gpio_bank[0].base + OMAP24XX_GPIO_REVISION);
	else if (cpu_is_omap44xx())
		rev = __raw_readl(gpio_bank[0].base + OMAP4_GPIO_REVISION);
	else
		return;

	printk(KERN_INFO "OMAP GPIO hardware version %d.%d\n",
		(rev >> 4) & 0x0f, rev & 0x0f);
}

1782 1783 1784 1785 1786
/* This lock class tells lockdep that GPIO irqs are in a different
 * category than their parents, so it won't report false recursion.
 */
static struct lock_class_key gpio_lock_class;

1787 1788 1789
static int __init _omap_gpio_init(void)
{
	int i;
D
David Brownell 已提交
1790
	int gpio = 0;
1791
	struct gpio_bank *bank;
T
Tony Lindgren 已提交
1792
	int bank_size = SZ_8K;	/* Module 4KB + L4 4KB except on omap1 */
1793
	char clk_name[11];
1794 1795 1796

	initialized = 1;

1797
#if defined(CONFIG_ARCH_OMAP1)
1798
	if (cpu_is_omap15xx()) {
1799 1800
		gpio_ick = clk_get(NULL, "arm_gpio_ck");
		if (IS_ERR(gpio_ick))
1801 1802
			printk("Could not get arm_gpio_ck\n");
		else
1803
			clk_enable(gpio_ick);
1804
	}
1805 1806 1807
#endif
#if defined(CONFIG_ARCH_OMAP2)
	if (cpu_class_is_omap2()) {
1808 1809 1810 1811
		gpio_ick = clk_get(NULL, "gpios_ick");
		if (IS_ERR(gpio_ick))
			printk("Could not get gpios_ick\n");
		else
1812
			clk_enable(gpio_ick);
1813
		gpio_fck = clk_get(NULL, "gpios_fck");
1814
		if (IS_ERR(gpio_fck))
1815 1816
			printk("Could not get gpios_fck\n");
		else
1817
			clk_enable(gpio_fck);
1818 1819

		/*
1820
		 * On 2430 & 3430 GPIO 5 uses CORE L4 ICLK
1821
		 */
1822
#if defined(CONFIG_ARCH_OMAP2430)
1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835
		if (cpu_is_omap2430()) {
			gpio5_ick = clk_get(NULL, "gpio5_ick");
			if (IS_ERR(gpio5_ick))
				printk("Could not get gpio5_ick\n");
			else
				clk_enable(gpio5_ick);
			gpio5_fck = clk_get(NULL, "gpio5_fck");
			if (IS_ERR(gpio5_fck))
				printk("Could not get gpio5_fck\n");
			else
				clk_enable(gpio5_fck);
		}
#endif
1836 1837 1838
	}
#endif

1839 1840
#if defined(CONFIG_ARCH_OMAP3) || defined(CONFIG_ARCH_OMAP4)
	if (cpu_is_omap34xx() || cpu_is_omap44xx()) {
1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851
		for (i = 0; i < OMAP34XX_NR_GPIOS; i++) {
			sprintf(clk_name, "gpio%d_ick", i + 1);
			gpio_iclks[i] = clk_get(NULL, clk_name);
			if (IS_ERR(gpio_iclks[i]))
				printk(KERN_ERR "Could not get %s\n", clk_name);
			else
				clk_enable(gpio_iclks[i]);
		}
	}
#endif

1852

1853
#ifdef CONFIG_ARCH_OMAP15XX
1854
	if (cpu_is_omap15xx()) {
1855 1856
		gpio_bank_count = 2;
		gpio_bank = gpio_bank_1510;
T
Tony Lindgren 已提交
1857
		bank_size = SZ_2K;
1858 1859 1860 1861 1862 1863
	}
#endif
#if defined(CONFIG_ARCH_OMAP16XX)
	if (cpu_is_omap16xx()) {
		gpio_bank_count = 5;
		gpio_bank = gpio_bank_1610;
T
Tony Lindgren 已提交
1864
		bank_size = SZ_2K;
1865 1866
	}
#endif
1867 1868
#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
	if (cpu_is_omap7xx()) {
1869
		gpio_bank_count = 7;
1870
		gpio_bank = gpio_bank_7xx;
T
Tony Lindgren 已提交
1871
		bank_size = SZ_2K;
1872 1873
	}
#endif
1874
#ifdef CONFIG_ARCH_OMAP2
1875
	if (cpu_is_omap242x()) {
1876
		gpio_bank_count = 4;
1877 1878 1879 1880 1881
		gpio_bank = gpio_bank_242x;
	}
	if (cpu_is_omap243x()) {
		gpio_bank_count = 5;
		gpio_bank = gpio_bank_243x;
1882
	}
1883
#endif
1884
#ifdef CONFIG_ARCH_OMAP3
1885 1886 1887 1888
	if (cpu_is_omap34xx()) {
		gpio_bank_count = OMAP34XX_NR_GPIOS;
		gpio_bank = gpio_bank_34xx;
	}
1889 1890 1891 1892 1893 1894
#endif
#ifdef CONFIG_ARCH_OMAP4
	if (cpu_is_omap44xx()) {
		gpio_bank_count = OMAP34XX_NR_GPIOS;
		gpio_bank = gpio_bank_44xx;
	}
1895 1896 1897 1898 1899 1900
#endif
	for (i = 0; i < gpio_bank_count; i++) {
		int j, gpio_count = 16;

		bank = &gpio_bank[i];
		spin_lock_init(&bank->lock);
T
Tony Lindgren 已提交
1901 1902 1903 1904 1905 1906 1907 1908

		/* Static mapping, never released */
		bank->base = ioremap(bank->pbase, bank_size);
		if (!bank->base) {
			printk(KERN_ERR "Could not ioremap gpio bank%i\n", i);
			continue;
		}

1909
		if (bank_is_mpuio(bank))
1910
			__raw_writew(0xffff, bank->base + OMAP_MPUIO_GPIO_MASKIT);
1911
		if (cpu_is_omap15xx() && bank->method == METHOD_GPIO_1510) {
1912 1913 1914
			__raw_writew(0xffff, bank->base + OMAP1510_GPIO_INT_MASK);
			__raw_writew(0x0000, bank->base + OMAP1510_GPIO_INT_STATUS);
		}
1915
		if (cpu_is_omap16xx() && bank->method == METHOD_GPIO_1610) {
1916 1917
			__raw_writew(0x0000, bank->base + OMAP1610_GPIO_IRQENABLE1);
			__raw_writew(0xffff, bank->base + OMAP1610_GPIO_IRQSTATUS1);
1918
			__raw_writew(0x0014, bank->base + OMAP1610_GPIO_SYSCONFIG);
1919
		}
1920 1921 1922
		if (cpu_is_omap7xx() && bank->method == METHOD_GPIO_7XX) {
			__raw_writel(0xffffffff, bank->base + OMAP7XX_GPIO_INT_MASK);
			__raw_writel(0x00000000, bank->base + OMAP7XX_GPIO_INT_STATUS);
1923

1924
			gpio_count = 32; /* 7xx has 32-bit GPIOs */
1925
		}
1926

1927
#ifdef CONFIG_ARCH_OMAP2PLUS
1928 1929
		if ((bank->method == METHOD_GPIO_24XX) ||
				(bank->method == METHOD_GPIO_44XX)) {
1930 1931 1932
			static const u32 non_wakeup_gpios[] = {
				0xe203ffc0, 0x08700040
			};
1933 1934 1935

			if (cpu_is_omap44xx()) {
				__raw_writel(0xffffffff, bank->base +
1936
						OMAP4_GPIO_IRQSTATUSCLR0);
1937
				__raw_writew(0x0015, bank->base +
1938
						OMAP4_GPIO_SYSCONFIG);
1939
				__raw_writel(0x00000000, bank->base +
1940
						 OMAP4_GPIO_DEBOUNCENABLE);
1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962
				/*
				 * Initialize interface clock ungated,
				 * module enabled
				 */
				__raw_writel(0, bank->base + OMAP4_GPIO_CTRL);
			} else {
				__raw_writel(0x00000000, bank->base +
						OMAP24XX_GPIO_IRQENABLE1);
				__raw_writel(0xffffffff, bank->base +
						OMAP24XX_GPIO_IRQSTATUS1);
				__raw_writew(0x0015, bank->base +
						OMAP24XX_GPIO_SYSCONFIG);
				__raw_writel(0x00000000, bank->base +
						OMAP24XX_GPIO_DEBOUNCE_EN);

				/*
				 * Initialize interface clock ungated,
				 * module enabled
				 */
				__raw_writel(0, bank->base +
						OMAP24XX_GPIO_CTRL);
			}
T
Tero Kristo 已提交
1963 1964
			if (cpu_is_omap24xx() &&
			    i < ARRAY_SIZE(non_wakeup_gpios))
1965
				bank->non_wakeup_gpios = non_wakeup_gpios[i];
1966 1967
			gpio_count = 32;
		}
1968
#endif
C
Charulatha V 已提交
1969 1970

		bank->mod_usage = 0;
D
David Brownell 已提交
1971 1972 1973
		/* REVISIT eventually switch from OMAP-specific gpio structs
		 * over to the generic ones
		 */
1974 1975
		bank->chip.request = omap_gpio_request;
		bank->chip.free = omap_gpio_free;
D
David Brownell 已提交
1976 1977 1978
		bank->chip.direction_input = gpio_input;
		bank->chip.get = gpio_get;
		bank->chip.direction_output = gpio_output;
1979
		bank->chip.set_debounce = gpio_debounce;
D
David Brownell 已提交
1980
		bank->chip.set = gpio_set;
1981
		bank->chip.to_irq = gpio_2irq;
D
David Brownell 已提交
1982 1983
		if (bank_is_mpuio(bank)) {
			bank->chip.label = "mpuio";
1984
#ifdef CONFIG_ARCH_OMAP16XX
D
David Brownell 已提交
1985 1986
			bank->chip.dev = &omap_mpuio_device.dev;
#endif
D
David Brownell 已提交
1987 1988 1989 1990 1991 1992 1993 1994 1995 1996
			bank->chip.base = OMAP_MPUIO(0);
		} else {
			bank->chip.label = "gpio";
			bank->chip.base = gpio;
			gpio += gpio_count;
		}
		bank->chip.ngpio = gpio_count;

		gpiochip_add(&bank->chip);

1997 1998
		for (j = bank->virtual_irq_start;
		     j < bank->virtual_irq_start + gpio_count; j++) {
1999
			lockdep_set_class(&irq_desc[j].lock, &gpio_lock_class);
2000
			set_irq_chip_data(j, bank);
2001
			if (bank_is_mpuio(bank))
2002 2003 2004
				set_irq_chip(j, &mpuio_irq_chip);
			else
				set_irq_chip(j, &gpio_irq_chip);
2005
			set_irq_handler(j, handle_simple_irq);
2006 2007 2008 2009
			set_irq_flags(j, IRQF_VALID);
		}
		set_irq_chained_handler(bank->irq, gpio_irq_handler);
		set_irq_data(bank->irq, bank);
2010

2011
		if (cpu_is_omap34xx() || cpu_is_omap44xx()) {
2012 2013 2014 2015 2016
			sprintf(clk_name, "gpio%d_dbck", i + 1);
			bank->dbck = clk_get(NULL, clk_name);
			if (IS_ERR(bank->dbck))
				printk(KERN_ERR "Could not get %s\n", clk_name);
		}
2017 2018 2019 2020
	}

	/* Enable system clock for GPIO module.
	 * The CAM_CLK_CTRL *is* really the right place. */
2021
	if (cpu_is_omap16xx())
2022 2023
		omap_writel(omap_readl(ULPD_CAM_CLK_CTRL) | 0x04, ULPD_CAM_CLK_CTRL);

2024 2025 2026
	/* Enable autoidle for the OCP interface */
	if (cpu_is_omap24xx())
		omap_writel(1 << 0, 0x48019010);
2027 2028
	if (cpu_is_omap34xx())
		omap_writel(1 << 0, 0x48306814);
2029

T
Tony Lindgren 已提交
2030 2031
	omap_gpio_show_rev();

2032 2033 2034
	return 0;
}

2035
#if defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP2PLUS)
2036 2037 2038 2039
static int omap_gpio_suspend(struct sys_device *dev, pm_message_t mesg)
{
	int i;

2040
	if (!cpu_class_is_omap2() && !cpu_is_omap16xx())
2041 2042 2043 2044 2045 2046 2047
		return 0;

	for (i = 0; i < gpio_bank_count; i++) {
		struct gpio_bank *bank = &gpio_bank[i];
		void __iomem *wake_status;
		void __iomem *wake_clear;
		void __iomem *wake_set;
D
David Brownell 已提交
2048
		unsigned long flags;
2049 2050

		switch (bank->method) {
2051
#ifdef CONFIG_ARCH_OMAP16XX
2052 2053 2054 2055 2056
		case METHOD_GPIO_1610:
			wake_status = bank->base + OMAP1610_GPIO_WAKEUPENABLE;
			wake_clear = bank->base + OMAP1610_GPIO_CLEAR_WAKEUPENA;
			wake_set = bank->base + OMAP1610_GPIO_SET_WAKEUPENA;
			break;
2057
#endif
2058
#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
2059
		case METHOD_GPIO_24XX:
2060
			wake_status = bank->base + OMAP24XX_GPIO_WAKE_EN;
2061 2062 2063
			wake_clear = bank->base + OMAP24XX_GPIO_CLEARWKUENA;
			wake_set = bank->base + OMAP24XX_GPIO_SETWKUENA;
			break;
2064 2065
#endif
#ifdef CONFIG_ARCH_OMAP4
2066
		case METHOD_GPIO_44XX:
2067 2068 2069 2070
			wake_status = bank->base + OMAP4_GPIO_IRQWAKEN0;
			wake_clear = bank->base + OMAP4_GPIO_IRQWAKEN0;
			wake_set = bank->base + OMAP4_GPIO_IRQWAKEN0;
			break;
2071
#endif
2072 2073 2074 2075
		default:
			continue;
		}

D
David Brownell 已提交
2076
		spin_lock_irqsave(&bank->lock, flags);
2077 2078 2079
		bank->saved_wakeup = __raw_readl(wake_status);
		__raw_writel(0xffffffff, wake_clear);
		__raw_writel(bank->suspend_wakeup, wake_set);
D
David Brownell 已提交
2080
		spin_unlock_irqrestore(&bank->lock, flags);
2081 2082 2083 2084 2085 2086 2087 2088 2089
	}

	return 0;
}

static int omap_gpio_resume(struct sys_device *dev)
{
	int i;

2090
	if (!cpu_class_is_omap2() && !cpu_is_omap16xx())
2091 2092 2093 2094 2095 2096
		return 0;

	for (i = 0; i < gpio_bank_count; i++) {
		struct gpio_bank *bank = &gpio_bank[i];
		void __iomem *wake_clear;
		void __iomem *wake_set;
D
David Brownell 已提交
2097
		unsigned long flags;
2098 2099

		switch (bank->method) {
2100
#ifdef CONFIG_ARCH_OMAP16XX
2101 2102 2103 2104
		case METHOD_GPIO_1610:
			wake_clear = bank->base + OMAP1610_GPIO_CLEAR_WAKEUPENA;
			wake_set = bank->base + OMAP1610_GPIO_SET_WAKEUPENA;
			break;
2105
#endif
2106
#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
2107
		case METHOD_GPIO_24XX:
2108 2109
			wake_clear = bank->base + OMAP24XX_GPIO_CLEARWKUENA;
			wake_set = bank->base + OMAP24XX_GPIO_SETWKUENA;
2110
			break;
2111 2112
#endif
#ifdef CONFIG_ARCH_OMAP4
2113
		case METHOD_GPIO_44XX:
2114 2115 2116
			wake_clear = bank->base + OMAP4_GPIO_IRQWAKEN0;
			wake_set = bank->base + OMAP4_GPIO_IRQWAKEN0;
			break;
2117
#endif
2118 2119 2120 2121
		default:
			continue;
		}

D
David Brownell 已提交
2122
		spin_lock_irqsave(&bank->lock, flags);
2123 2124
		__raw_writel(0xffffffff, wake_clear);
		__raw_writel(bank->saved_wakeup, wake_set);
D
David Brownell 已提交
2125
		spin_unlock_irqrestore(&bank->lock, flags);
2126 2127 2128 2129 2130 2131
	}

	return 0;
}

static struct sysdev_class omap_gpio_sysclass = {
2132
	.name		= "gpio",
2133 2134 2135 2136 2137 2138 2139 2140
	.suspend	= omap_gpio_suspend,
	.resume		= omap_gpio_resume,
};

static struct sys_device omap_gpio_device = {
	.id		= 0,
	.cls		= &omap_gpio_sysclass,
};
2141 2142 2143

#endif

2144
#ifdef CONFIG_ARCH_OMAP2PLUS
2145 2146 2147

static int workaround_enabled;

2148
void omap2_gpio_prepare_for_idle(int power_state)
2149 2150
{
	int i, c = 0;
T
Tero Kristo 已提交
2151
	int min = 0;
2152

T
Tero Kristo 已提交
2153 2154
	if (cpu_is_omap34xx())
		min = 1;
2155

T
Tero Kristo 已提交
2156
	for (i = min; i < gpio_bank_count; i++) {
2157 2158 2159
		struct gpio_bank *bank = &gpio_bank[i];
		u32 l1, l2;

2160 2161 2162
		if (bank->dbck_enable_mask)
			clk_disable(bank->dbck);

2163 2164 2165 2166 2167 2168
		if (power_state > PWRDM_POWER_OFF)
			continue;

		/* If going to OFF, remove triggering for all
		 * non-wakeup GPIOs.  Otherwise spurious IRQs will be
		 * generated.  See OMAP2420 Errata item 1.101. */
2169 2170
		if (!(bank->enabled_non_wakeup_gpios))
			continue;
2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189

		if (cpu_is_omap24xx() || cpu_is_omap34xx()) {
			bank->saved_datain = __raw_readl(bank->base +
					OMAP24XX_GPIO_DATAIN);
			l1 = __raw_readl(bank->base +
					OMAP24XX_GPIO_FALLINGDETECT);
			l2 = __raw_readl(bank->base +
					OMAP24XX_GPIO_RISINGDETECT);
		}

		if (cpu_is_omap44xx()) {
			bank->saved_datain = __raw_readl(bank->base +
						OMAP4_GPIO_DATAIN);
			l1 = __raw_readl(bank->base +
						OMAP4_GPIO_FALLINGDETECT);
			l2 = __raw_readl(bank->base +
						OMAP4_GPIO_RISINGDETECT);
		}

2190 2191 2192 2193
		bank->saved_fallingdetect = l1;
		bank->saved_risingdetect = l2;
		l1 &= ~bank->enabled_non_wakeup_gpios;
		l2 &= ~bank->enabled_non_wakeup_gpios;
2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206

		if (cpu_is_omap24xx() || cpu_is_omap34xx()) {
			__raw_writel(l1, bank->base +
					OMAP24XX_GPIO_FALLINGDETECT);
			__raw_writel(l2, bank->base +
					OMAP24XX_GPIO_RISINGDETECT);
		}

		if (cpu_is_omap44xx()) {
			__raw_writel(l1, bank->base + OMAP4_GPIO_FALLINGDETECT);
			__raw_writel(l2, bank->base + OMAP4_GPIO_RISINGDETECT);
		}

2207 2208 2209 2210 2211 2212 2213 2214 2215
		c++;
	}
	if (!c) {
		workaround_enabled = 0;
		return;
	}
	workaround_enabled = 1;
}

2216
void omap2_gpio_resume_after_idle(void)
2217 2218
{
	int i;
T
Tero Kristo 已提交
2219
	int min = 0;
2220

T
Tero Kristo 已提交
2221 2222 2223
	if (cpu_is_omap34xx())
		min = 1;
	for (i = min; i < gpio_bank_count; i++) {
2224
		struct gpio_bank *bank = &gpio_bank[i];
2225
		u32 l, gen, gen0, gen1;
2226

2227 2228 2229
		if (bank->dbck_enable_mask)
			clk_enable(bank->dbck);

2230 2231 2232
		if (!workaround_enabled)
			continue;

2233 2234
		if (!(bank->enabled_non_wakeup_gpios))
			continue;
2235 2236 2237

		if (cpu_is_omap24xx() || cpu_is_omap34xx()) {
			__raw_writel(bank->saved_fallingdetect,
2238
				 bank->base + OMAP24XX_GPIO_FALLINGDETECT);
2239
			__raw_writel(bank->saved_risingdetect,
2240
				 bank->base + OMAP24XX_GPIO_RISINGDETECT);
2241 2242 2243 2244 2245
			l = __raw_readl(bank->base + OMAP24XX_GPIO_DATAIN);
		}

		if (cpu_is_omap44xx()) {
			__raw_writel(bank->saved_fallingdetect,
2246
				 bank->base + OMAP4_GPIO_FALLINGDETECT);
2247
			__raw_writel(bank->saved_risingdetect,
2248
				 bank->base + OMAP4_GPIO_RISINGDETECT);
2249 2250 2251
			l = __raw_readl(bank->base + OMAP4_GPIO_DATAIN);
		}

2252 2253 2254 2255 2256
		/* Check if any of the non-wakeup interrupt GPIOs have changed
		 * state.  If so, generate an IRQ by software.  This is
		 * horribly racy, but it's the best we can do to work around
		 * this silicon bug. */
		l ^= bank->saved_datain;
T
Tero Kristo 已提交
2257
		l &= bank->enabled_non_wakeup_gpios;
2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275

		/*
		 * No need to generate IRQs for the rising edge for gpio IRQs
		 * configured with falling edge only; and vice versa.
		 */
		gen0 = l & bank->saved_fallingdetect;
		gen0 &= bank->saved_datain;

		gen1 = l & bank->saved_risingdetect;
		gen1 &= ~(bank->saved_datain);

		/* FIXME: Consider GPIO IRQs with level detections properly! */
		gen = l & (~(bank->saved_fallingdetect) &
				~(bank->saved_risingdetect));
		/* Consider all GPIO IRQs needed to be updated */
		gen |= gen0 | gen1;

		if (gen) {
2276
			u32 old0, old1;
2277

2278
			if (cpu_is_omap24xx() || cpu_is_omap34xx()) {
2279 2280 2281 2282
				old0 = __raw_readl(bank->base +
					OMAP24XX_GPIO_LEVELDETECT0);
				old1 = __raw_readl(bank->base +
					OMAP24XX_GPIO_LEVELDETECT1);
2283
				__raw_writel(old0 | gen, bank->base +
2284
					OMAP24XX_GPIO_LEVELDETECT0);
2285
				__raw_writel(old1 | gen, bank->base +
2286
					OMAP24XX_GPIO_LEVELDETECT1);
2287
				__raw_writel(old0, bank->base +
2288
					OMAP24XX_GPIO_LEVELDETECT0);
2289
				__raw_writel(old1, bank->base +
2290 2291 2292 2293 2294
					OMAP24XX_GPIO_LEVELDETECT1);
			}

			if (cpu_is_omap44xx()) {
				old0 = __raw_readl(bank->base +
2295
						OMAP4_GPIO_LEVELDETECT0);
2296
				old1 = __raw_readl(bank->base +
2297
						OMAP4_GPIO_LEVELDETECT1);
2298
				__raw_writel(old0 | l, bank->base +
2299
						OMAP4_GPIO_LEVELDETECT0);
2300
				__raw_writel(old1 | l, bank->base +
2301
						OMAP4_GPIO_LEVELDETECT1);
2302
				__raw_writel(old0, bank->base +
2303
						OMAP4_GPIO_LEVELDETECT0);
2304
				__raw_writel(old1, bank->base +
2305
						OMAP4_GPIO_LEVELDETECT1);
2306
			}
2307 2308 2309 2310 2311
		}
	}

}

2312 2313
#endif

2314
#ifdef CONFIG_ARCH_OMAP3
2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380
/* save the registers of bank 2-6 */
void omap_gpio_save_context(void)
{
	int i;

	/* saving banks from 2-6 only since GPIO1 is in WKUP */
	for (i = 1; i < gpio_bank_count; i++) {
		struct gpio_bank *bank = &gpio_bank[i];
		gpio_context[i].sysconfig =
			__raw_readl(bank->base + OMAP24XX_GPIO_SYSCONFIG);
		gpio_context[i].irqenable1 =
			__raw_readl(bank->base + OMAP24XX_GPIO_IRQENABLE1);
		gpio_context[i].irqenable2 =
			__raw_readl(bank->base + OMAP24XX_GPIO_IRQENABLE2);
		gpio_context[i].wake_en =
			__raw_readl(bank->base + OMAP24XX_GPIO_WAKE_EN);
		gpio_context[i].ctrl =
			__raw_readl(bank->base + OMAP24XX_GPIO_CTRL);
		gpio_context[i].oe =
			__raw_readl(bank->base + OMAP24XX_GPIO_OE);
		gpio_context[i].leveldetect0 =
			__raw_readl(bank->base + OMAP24XX_GPIO_LEVELDETECT0);
		gpio_context[i].leveldetect1 =
			__raw_readl(bank->base + OMAP24XX_GPIO_LEVELDETECT1);
		gpio_context[i].risingdetect =
			__raw_readl(bank->base + OMAP24XX_GPIO_RISINGDETECT);
		gpio_context[i].fallingdetect =
			__raw_readl(bank->base + OMAP24XX_GPIO_FALLINGDETECT);
		gpio_context[i].dataout =
			__raw_readl(bank->base + OMAP24XX_GPIO_DATAOUT);
	}
}

/* restore the required registers of bank 2-6 */
void omap_gpio_restore_context(void)
{
	int i;

	for (i = 1; i < gpio_bank_count; i++) {
		struct gpio_bank *bank = &gpio_bank[i];
		__raw_writel(gpio_context[i].sysconfig,
				bank->base + OMAP24XX_GPIO_SYSCONFIG);
		__raw_writel(gpio_context[i].irqenable1,
				bank->base + OMAP24XX_GPIO_IRQENABLE1);
		__raw_writel(gpio_context[i].irqenable2,
				bank->base + OMAP24XX_GPIO_IRQENABLE2);
		__raw_writel(gpio_context[i].wake_en,
				bank->base + OMAP24XX_GPIO_WAKE_EN);
		__raw_writel(gpio_context[i].ctrl,
				bank->base + OMAP24XX_GPIO_CTRL);
		__raw_writel(gpio_context[i].oe,
				bank->base + OMAP24XX_GPIO_OE);
		__raw_writel(gpio_context[i].leveldetect0,
				bank->base + OMAP24XX_GPIO_LEVELDETECT0);
		__raw_writel(gpio_context[i].leveldetect1,
				bank->base + OMAP24XX_GPIO_LEVELDETECT1);
		__raw_writel(gpio_context[i].risingdetect,
				bank->base + OMAP24XX_GPIO_RISINGDETECT);
		__raw_writel(gpio_context[i].fallingdetect,
				bank->base + OMAP24XX_GPIO_FALLINGDETECT);
		__raw_writel(gpio_context[i].dataout,
				bank->base + OMAP24XX_GPIO_DATAOUT);
	}
}
#endif

2381 2382
/*
 * This may get called early from board specific init
2383
 * for boards that have interrupts routed via FPGA.
2384
 */
2385
int __init omap_gpio_init(void)
2386 2387 2388 2389 2390 2391 2392
{
	if (!initialized)
		return _omap_gpio_init();
	else
		return 0;
}

2393 2394 2395 2396 2397 2398 2399
static int __init omap_gpio_sysinit(void)
{
	int ret = 0;

	if (!initialized)
		ret = _omap_gpio_init();

D
David Brownell 已提交
2400 2401
	mpuio_init();

2402
#if defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP2PLUS)
2403
	if (cpu_is_omap16xx() || cpu_class_is_omap2()) {
2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415
		if (ret == 0) {
			ret = sysdev_class_register(&omap_gpio_sysclass);
			if (ret == 0)
				ret = sysdev_register(&omap_gpio_device);
		}
	}
#endif

	return ret;
}

arch_initcall(omap_gpio_sysinit);