gpio-omap.c 49.1 KB
Newer Older
1 2 3
/*
 * Support functions for OMAP GPIO
 *
4
 * Copyright (C) 2003-2005 Nokia Corporation
5
 * Written by Juha Yrjölä <juha.yrjola@nokia.com>
6
 *
7 8 9
 * Copyright (C) 2009 Texas Instruments
 * Added OMAP4 support - Santosh Shilimkar <santosh.shilimkar@ti.com>
 *
10 11 12 13 14 15 16 17
 * 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>
18
#include <linux/syscore_ops.h>
19
#include <linux/err.h>
20
#include <linux/clk.h>
21
#include <linux/io.h>
22 23
#include <linux/slab.h>
#include <linux/pm_runtime.h>
24

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

struct gpio_bank {
T
Tony Lindgren 已提交
32
	unsigned long pbase;
33
	void __iomem *base;
34 35
	u16 irq;
	u16 virtual_irq_start;
36
	int method;
37
#if defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP2PLUS)
38 39
	u32 suspend_wakeup;
	u32 saved_wakeup;
40 41 42 43 44 45 46
#endif
	u32 non_wakeup_gpios;
	u32 enabled_non_wakeup_gpios;

	u32 saved_datain;
	u32 saved_fallingdetect;
	u32 saved_risingdetect;
47
	u32 level_mask;
48
	u32 toggle_mask;
49
	spinlock_t lock;
D
David Brownell 已提交
50
	struct gpio_chip chip;
51
	struct clk *dbck;
C
Charulatha V 已提交
52
	u32 mod_usage;
53
	u32 dbck_enable_mask;
54 55
	struct device *dev;
	bool dbck_flag;
56
	int stride;
57 58
};

59
#ifdef CONFIG_ARCH_OMAP3
60 61 62 63 64 65 66 67 68 69 70
struct omap3_gpio_regs {
	u32 irqenable1;
	u32 irqenable2;
	u32 wake_en;
	u32 ctrl;
	u32 oe;
	u32 leveldetect0;
	u32 leveldetect1;
	u32 risingdetect;
	u32 fallingdetect;
	u32 dataout;
71 72
};

73
static struct omap3_gpio_regs gpio_context[OMAP34XX_NR_GPIOS];
74 75
#endif

76 77 78 79 80
/*
 * TODO: Cleanup gpio_bank usage as it is having information
 * related to all instances of the device
 */
static struct gpio_bank *gpio_bank;
81

82
static int bank_width;
83

84 85
/* TODO: Analyze removing gpio_bank_count usage from driver code */
int gpio_bank_count;
86 87 88

static inline struct gpio_bank *get_gpio_bank(int gpio)
{
89
	if (cpu_is_omap15xx()) {
90 91 92 93 94 95 96 97 98
		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)];
	}
99
	if (cpu_is_omap7xx()) {
100 101 102 103
		if (OMAP_GPIO_IS_MPUIO(gpio))
			return &gpio_bank[0];
		return &gpio_bank[1 + (gpio >> 5)];
	}
104 105
	if (cpu_is_omap24xx())
		return &gpio_bank[gpio >> 5];
106
	if (cpu_is_omap34xx() || cpu_is_omap44xx())
107
		return &gpio_bank[gpio >> 5];
D
David Brownell 已提交
108 109
	BUG();
	return NULL;
110 111 112 113
}

static inline int get_gpio_index(int gpio)
{
114
	if (cpu_is_omap7xx())
115
		return gpio & 0x1f;
116 117
	if (cpu_is_omap24xx())
		return gpio & 0x1f;
118
	if (cpu_is_omap34xx() || cpu_is_omap44xx())
119
		return gpio & 0x1f;
120
	return gpio & 0x0f;
121 122 123 124 125 126
}

static inline int gpio_valid(int gpio)
{
	if (gpio < 0)
		return -1;
127
	if (cpu_class_is_omap1() && OMAP_GPIO_IS_MPUIO(gpio)) {
128
		if (gpio >= OMAP_MAX_GPIO_LINES + 16)
129 130 131
			return -1;
		return 0;
	}
132
	if (cpu_is_omap15xx() && gpio < 16)
133 134 135
		return 0;
	if ((cpu_is_omap16xx()) && gpio < 64)
		return 0;
136
	if (cpu_is_omap7xx() && gpio < 192)
137
		return 0;
138 139 140
	if (cpu_is_omap2420() && gpio < 128)
		return 0;
	if (cpu_is_omap2430() && gpio < 160)
141
		return 0;
142
	if ((cpu_is_omap34xx() || cpu_is_omap44xx()) && gpio < 192)
143
		return 0;
144 145 146 147 148
	return -1;
}

static int check_gpio(int gpio)
{
R
Roel Kluin 已提交
149
	if (unlikely(gpio_valid(gpio) < 0)) {
150 151 152 153 154 155 156 157 158
		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)
{
159
	void __iomem *reg = bank->base;
160 161 162
	u32 l;

	switch (bank->method) {
163
#ifdef CONFIG_ARCH_OMAP1
164
	case METHOD_MPUIO:
165
		reg += OMAP_MPUIO_IO_CNTL / bank->stride;
166
		break;
167 168
#endif
#ifdef CONFIG_ARCH_OMAP15XX
169 170 171
	case METHOD_GPIO_1510:
		reg += OMAP1510_GPIO_DIR_CONTROL;
		break;
172 173
#endif
#ifdef CONFIG_ARCH_OMAP16XX
174 175 176
	case METHOD_GPIO_1610:
		reg += OMAP1610_GPIO_DIRECTION;
		break;
177
#endif
178
#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
179 180
	case METHOD_GPIO_7XX:
		reg += OMAP7XX_GPIO_DIR_CONTROL;
181 182
		break;
#endif
183
#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
184 185 186
	case METHOD_GPIO_24XX:
		reg += OMAP24XX_GPIO_OE;
		break;
187 188
#endif
#if defined(CONFIG_ARCH_OMAP4)
189
	case METHOD_GPIO_44XX:
190 191
		reg += OMAP4_GPIO_OE;
		break;
192 193 194 195
#endif
	default:
		WARN_ON(1);
		return;
196 197 198 199 200 201 202 203 204 205 206
	}
	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)
{
207
	void __iomem *reg = bank->base;
208 209 210
	u32 l = 0;

	switch (bank->method) {
211
#ifdef CONFIG_ARCH_OMAP1
212
	case METHOD_MPUIO:
213
		reg += OMAP_MPUIO_OUTPUT / bank->stride;
214 215 216 217 218 219
		l = __raw_readl(reg);
		if (enable)
			l |= 1 << gpio;
		else
			l &= ~(1 << gpio);
		break;
220 221
#endif
#ifdef CONFIG_ARCH_OMAP15XX
222 223 224 225 226 227 228 229
	case METHOD_GPIO_1510:
		reg += OMAP1510_GPIO_DATA_OUTPUT;
		l = __raw_readl(reg);
		if (enable)
			l |= 1 << gpio;
		else
			l &= ~(1 << gpio);
		break;
230 231
#endif
#ifdef CONFIG_ARCH_OMAP16XX
232 233 234 235 236 237 238
	case METHOD_GPIO_1610:
		if (enable)
			reg += OMAP1610_GPIO_SET_DATAOUT;
		else
			reg += OMAP1610_GPIO_CLEAR_DATAOUT;
		l = 1 << gpio;
		break;
239
#endif
240
#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
241 242
	case METHOD_GPIO_7XX:
		reg += OMAP7XX_GPIO_DATA_OUTPUT;
243 244 245 246 247 248 249
		l = __raw_readl(reg);
		if (enable)
			l |= 1 << gpio;
		else
			l &= ~(1 << gpio);
		break;
#endif
250
#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
251 252 253 254 255 256 257
	case METHOD_GPIO_24XX:
		if (enable)
			reg += OMAP24XX_GPIO_SETDATAOUT;
		else
			reg += OMAP24XX_GPIO_CLEARDATAOUT;
		l = 1 << gpio;
		break;
258 259
#endif
#ifdef CONFIG_ARCH_OMAP4
260
	case METHOD_GPIO_44XX:
261 262 263 264 265 266
		if (enable)
			reg += OMAP4_GPIO_SETDATAOUT;
		else
			reg += OMAP4_GPIO_CLEARDATAOUT;
		l = 1 << gpio;
		break;
267
#endif
268
	default:
269
		WARN_ON(1);
270 271 272 273 274
		return;
	}
	__raw_writel(l, reg);
}

275
static int _get_gpio_datain(struct gpio_bank *bank, int gpio)
276
{
277
	void __iomem *reg;
278 279

	if (check_gpio(gpio) < 0)
280
		return -EINVAL;
281 282
	reg = bank->base;
	switch (bank->method) {
283
#ifdef CONFIG_ARCH_OMAP1
284
	case METHOD_MPUIO:
285
		reg += OMAP_MPUIO_INPUT_LATCH / bank->stride;
286
		break;
287 288
#endif
#ifdef CONFIG_ARCH_OMAP15XX
289 290 291
	case METHOD_GPIO_1510:
		reg += OMAP1510_GPIO_DATA_INPUT;
		break;
292 293
#endif
#ifdef CONFIG_ARCH_OMAP16XX
294 295 296
	case METHOD_GPIO_1610:
		reg += OMAP1610_GPIO_DATAIN;
		break;
297
#endif
298
#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
299 300
	case METHOD_GPIO_7XX:
		reg += OMAP7XX_GPIO_DATA_INPUT;
301 302
		break;
#endif
303
#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
304 305 306
	case METHOD_GPIO_24XX:
		reg += OMAP24XX_GPIO_DATAIN;
		break;
307 308
#endif
#ifdef CONFIG_ARCH_OMAP4
309
	case METHOD_GPIO_44XX:
310 311
		reg += OMAP4_GPIO_DATAIN;
		break;
312
#endif
313
	default:
314
		return -EINVAL;
315
	}
316 317
	return (__raw_readl(reg)
			& (1 << get_gpio_index(gpio))) != 0;
318 319
}

320 321 322 323 324 325 326 327 328 329 330
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:
331
		reg += OMAP_MPUIO_OUTPUT / bank->stride;
332 333 334 335 336 337 338 339 340 341 342 343
		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
344
#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
345 346
	case METHOD_GPIO_7XX:
		reg += OMAP7XX_GPIO_DATA_OUTPUT;
347 348
		break;
#endif
349
#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
350 351 352
	case METHOD_GPIO_24XX:
		reg += OMAP24XX_GPIO_DATAOUT;
		break;
353 354 355 356 357
#endif
#ifdef CONFIG_ARCH_OMAP4
	case METHOD_GPIO_44XX:
		reg += OMAP4_GPIO_DATAOUT;
		break;
358 359 360 361 362 363 364 365
#endif
	default:
		return -EINVAL;
	}

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

366 367 368 369 370 371 372 373
#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)

374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389
/**
 * _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;

390 391 392
	if (!bank->dbck_flag)
		return;

393 394 395 396 397 398 399 400 401
	if (debounce < 32)
		debounce = 0x01;
	else if (debounce > 7936)
		debounce = 0xff;
	else
		debounce = (debounce / 0x1f) - 1;

	l = 1 << get_gpio_index(gpio);

402
	if (bank->method == METHOD_GPIO_44XX)
403 404 405 406 407 408 409
		reg += OMAP4_GPIO_DEBOUNCINGTIME;
	else
		reg += OMAP24XX_GPIO_DEBOUNCE_VAL;

	__raw_writel(debounce, reg);

	reg = bank->base;
410
	if (bank->method == METHOD_GPIO_44XX)
411 412 413 414 415 416 417 418
		reg += OMAP4_GPIO_DEBOUNCENABLE;
	else
		reg += OMAP24XX_GPIO_DEBOUNCE_EN;

	val = __raw_readl(reg);

	if (debounce) {
		val |= l;
419
		clk_enable(bank->dbck);
420 421
	} else {
		val &= ~l;
422
		clk_disable(bank->dbck);
423
	}
424
	bank->dbck_enable_mask = val;
425 426 427 428

	__raw_writel(val, reg);
}

429
#ifdef CONFIG_ARCH_OMAP2PLUS
430 431
static inline void set_24xx_gpio_triggering(struct gpio_bank *bank, int gpio,
						int trigger)
432
{
433
	void __iomem *base = bank->base;
434 435
	u32 gpio_bit = 1 << gpio;

436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454
	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);
	}
455
	if (likely(!(bank->non_wakeup_gpios & gpio_bit))) {
456
		if (cpu_is_omap44xx()) {
457 458
			MOD_REG_BIT(OMAP4_GPIO_IRQWAKEN0, gpio_bit,
				trigger != 0);
459
		} else {
460 461 462 463 464
			/*
			 * GPIO wakeup request can only be generated on edge
			 * transitions
			 */
			if (trigger & IRQ_TYPE_EDGE_BOTH)
465
				__raw_writel(1 << gpio, bank->base
466
					+ OMAP24XX_GPIO_SETWKUENA);
467 468
			else
				__raw_writel(1 << gpio, bank->base
469
					+ OMAP24XX_GPIO_CLEARWKUENA);
470
		}
T
Tero Kristo 已提交
471
	}
472 473 474
	/* This part needs to be executed always for OMAP{34xx, 44xx} */
	if (cpu_is_omap34xx() || cpu_is_omap44xx() ||
			(bank->non_wakeup_gpios & gpio_bit)) {
475 476 477 478 479 480 481
		/*
		 * 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)
482 483 484 485
			bank->enabled_non_wakeup_gpios |= gpio_bit;
		else
			bank->enabled_non_wakeup_gpios &= ~gpio_bit;
	}
486

487 488 489 490 491 492 493 494 495
	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);
	}
496
}
497
#endif
498

499
#ifdef CONFIG_ARCH_OMAP1
500 501 502 503 504 505 506 507 508 509 510
/*
 * 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:
511
		reg += OMAP_MPUIO_GPIO_INT_EDGE / bank->stride;
512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534
		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);
}
535
#endif
536

537 538 539 540
static int _set_gpio_triggering(struct gpio_bank *bank, int gpio, int trigger)
{
	void __iomem *reg = bank->base;
	u32 l = 0;
541 542

	switch (bank->method) {
543
#ifdef CONFIG_ARCH_OMAP1
544
	case METHOD_MPUIO:
545
		reg += OMAP_MPUIO_GPIO_INT_EDGE / bank->stride;
546
		l = __raw_readl(reg);
547
		if ((trigger & IRQ_TYPE_SENSE_MASK) == IRQ_TYPE_EDGE_BOTH)
548
			bank->toggle_mask |= 1 << gpio;
549
		if (trigger & IRQ_TYPE_EDGE_RISING)
550
			l |= 1 << gpio;
551
		else if (trigger & IRQ_TYPE_EDGE_FALLING)
552
			l &= ~(1 << gpio);
553 554
		else
			goto bad;
555
		break;
556 557
#endif
#ifdef CONFIG_ARCH_OMAP15XX
558 559 560
	case METHOD_GPIO_1510:
		reg += OMAP1510_GPIO_INT_CONTROL;
		l = __raw_readl(reg);
561
		if ((trigger & IRQ_TYPE_SENSE_MASK) == IRQ_TYPE_EDGE_BOTH)
562
			bank->toggle_mask |= 1 << gpio;
563
		if (trigger & IRQ_TYPE_EDGE_RISING)
564
			l |= 1 << gpio;
565
		else if (trigger & IRQ_TYPE_EDGE_FALLING)
566
			l &= ~(1 << gpio);
567 568
		else
			goto bad;
569
		break;
570
#endif
571
#ifdef CONFIG_ARCH_OMAP16XX
572 573 574 575 576 577 578 579
	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));
580
		if (trigger & IRQ_TYPE_EDGE_RISING)
581
			l |= 2 << (gpio << 1);
582
		if (trigger & IRQ_TYPE_EDGE_FALLING)
583
			l |= 1 << (gpio << 1);
584 585 586 587 588
		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);
589
		break;
590
#endif
591
#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
592 593
	case METHOD_GPIO_7XX:
		reg += OMAP7XX_GPIO_INT_CONTROL;
594
		l = __raw_readl(reg);
595
		if ((trigger & IRQ_TYPE_SENSE_MASK) == IRQ_TYPE_EDGE_BOTH)
596
			bank->toggle_mask |= 1 << gpio;
597 598 599 600 601 602 603 604
		if (trigger & IRQ_TYPE_EDGE_RISING)
			l |= 1 << gpio;
		else if (trigger & IRQ_TYPE_EDGE_FALLING)
			l &= ~(1 << gpio);
		else
			goto bad;
		break;
#endif
605
#ifdef CONFIG_ARCH_OMAP2PLUS
606
	case METHOD_GPIO_24XX:
607
	case METHOD_GPIO_44XX:
608
		set_24xx_gpio_triggering(bank, gpio, trigger);
609
		return 0;
610
#endif
611
	default:
612
		goto bad;
613
	}
614 615 616 617
	__raw_writel(l, reg);
	return 0;
bad:
	return -EINVAL;
618 619
}

620
static int gpio_irq_type(struct irq_data *d, unsigned type)
621 622
{
	struct gpio_bank *bank;
623 624
	unsigned gpio;
	int retval;
D
David Brownell 已提交
625
	unsigned long flags;
626

627 628
	if (!cpu_class_is_omap2() && d->irq > IH_MPUIO_BASE)
		gpio = OMAP_MPUIO(d->irq - IH_MPUIO_BASE);
629
	else
630
		gpio = d->irq - IH_GPIO_BASE;
631 632

	if (check_gpio(gpio) < 0)
633 634
		return -EINVAL;

635
	if (type & ~IRQ_TYPE_SENSE_MASK)
636
		return -EINVAL;
637 638

	/* OMAP1 allows only only edge triggering */
639
	if (!cpu_class_is_omap2()
640
			&& (type & (IRQ_TYPE_LEVEL_LOW|IRQ_TYPE_LEVEL_HIGH)))
641 642
		return -EINVAL;

643
	bank = irq_data_get_irq_chip_data(d);
D
David Brownell 已提交
644
	spin_lock_irqsave(&bank->lock, flags);
645
	retval = _set_gpio_triggering(bank, get_gpio_index(gpio), type);
D
David Brownell 已提交
646
	spin_unlock_irqrestore(&bank->lock, flags);
647 648

	if (type & (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH))
T
Thomas Gleixner 已提交
649
		__irq_set_handler_locked(d->irq, handle_level_irq);
650
	else if (type & (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING))
T
Thomas Gleixner 已提交
651
		__irq_set_handler_locked(d->irq, handle_edge_irq);
652

653
	return retval;
654 655 656 657
}

static void _clear_gpio_irqbank(struct gpio_bank *bank, int gpio_mask)
{
658
	void __iomem *reg = bank->base;
659 660

	switch (bank->method) {
661
#ifdef CONFIG_ARCH_OMAP1
662 663 664 665
	case METHOD_MPUIO:
		/* MPUIO irqstatus is reset by reading the status register,
		 * so do nothing here */
		return;
666 667
#endif
#ifdef CONFIG_ARCH_OMAP15XX
668 669 670
	case METHOD_GPIO_1510:
		reg += OMAP1510_GPIO_INT_STATUS;
		break;
671 672
#endif
#ifdef CONFIG_ARCH_OMAP16XX
673 674 675
	case METHOD_GPIO_1610:
		reg += OMAP1610_GPIO_IRQSTATUS1;
		break;
676
#endif
677
#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
678 679
	case METHOD_GPIO_7XX:
		reg += OMAP7XX_GPIO_INT_STATUS;
680 681
		break;
#endif
682
#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
683 684 685
	case METHOD_GPIO_24XX:
		reg += OMAP24XX_GPIO_IRQSTATUS1;
		break;
686 687
#endif
#if defined(CONFIG_ARCH_OMAP4)
688
	case METHOD_GPIO_44XX:
689 690
		reg += OMAP4_GPIO_IRQSTATUS0;
		break;
691
#endif
692
	default:
693
		WARN_ON(1);
694 695 696
		return;
	}
	__raw_writel(gpio_mask, reg);
697 698

	/* Workaround for clearing DSP GPIO interrupts to allow retention */
699 700 701 702 703
	if (cpu_is_omap24xx() || cpu_is_omap34xx())
		reg = bank->base + OMAP24XX_GPIO_IRQSTATUS2;
	else if (cpu_is_omap44xx())
		reg = bank->base + OMAP4_GPIO_IRQSTATUS1;

704
	if (cpu_is_omap24xx() || cpu_is_omap34xx() || cpu_is_omap44xx()) {
705 706 707 708
		__raw_writel(gpio_mask, reg);

	/* Flush posted write for the irq status to avoid spurious interrupts */
	__raw_readl(reg);
709
	}
710 711 712 713 714 715 716
}

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

717 718 719
static u32 _get_gpio_irqbank_mask(struct gpio_bank *bank)
{
	void __iomem *reg = bank->base;
720 721 722
	int inv = 0;
	u32 l;
	u32 mask;
723 724

	switch (bank->method) {
725
#ifdef CONFIG_ARCH_OMAP1
726
	case METHOD_MPUIO:
727
		reg += OMAP_MPUIO_GPIO_MASKIT / bank->stride;
728 729
		mask = 0xffff;
		inv = 1;
730
		break;
731 732
#endif
#ifdef CONFIG_ARCH_OMAP15XX
733 734
	case METHOD_GPIO_1510:
		reg += OMAP1510_GPIO_INT_MASK;
735 736
		mask = 0xffff;
		inv = 1;
737
		break;
738 739
#endif
#ifdef CONFIG_ARCH_OMAP16XX
740 741
	case METHOD_GPIO_1610:
		reg += OMAP1610_GPIO_IRQENABLE1;
742
		mask = 0xffff;
743
		break;
744
#endif
745
#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
746 747
	case METHOD_GPIO_7XX:
		reg += OMAP7XX_GPIO_INT_MASK;
748 749 750 751
		mask = 0xffffffff;
		inv = 1;
		break;
#endif
752
#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
753 754
	case METHOD_GPIO_24XX:
		reg += OMAP24XX_GPIO_IRQENABLE1;
755
		mask = 0xffffffff;
756
		break;
757 758
#endif
#if defined(CONFIG_ARCH_OMAP4)
759
	case METHOD_GPIO_44XX:
760 761 762
		reg += OMAP4_GPIO_IRQSTATUSSET0;
		mask = 0xffffffff;
		break;
763
#endif
764
	default:
765
		WARN_ON(1);
766 767 768
		return 0;
	}

769 770 771 772 773
	l = __raw_readl(reg);
	if (inv)
		l = ~l;
	l &= mask;
	return l;
774 775
}

776 777
static void _enable_gpio_irqbank(struct gpio_bank *bank, int gpio_mask, int enable)
{
778
	void __iomem *reg = bank->base;
779 780 781
	u32 l;

	switch (bank->method) {
782
#ifdef CONFIG_ARCH_OMAP1
783
	case METHOD_MPUIO:
784
		reg += OMAP_MPUIO_GPIO_MASKIT / bank->stride;
785 786 787 788 789 790
		l = __raw_readl(reg);
		if (enable)
			l &= ~(gpio_mask);
		else
			l |= gpio_mask;
		break;
791 792
#endif
#ifdef CONFIG_ARCH_OMAP15XX
793 794 795 796 797 798 799 800
	case METHOD_GPIO_1510:
		reg += OMAP1510_GPIO_INT_MASK;
		l = __raw_readl(reg);
		if (enable)
			l &= ~(gpio_mask);
		else
			l |= gpio_mask;
		break;
801 802
#endif
#ifdef CONFIG_ARCH_OMAP16XX
803 804 805 806 807 808 809
	case METHOD_GPIO_1610:
		if (enable)
			reg += OMAP1610_GPIO_SET_IRQENABLE1;
		else
			reg += OMAP1610_GPIO_CLEAR_IRQENABLE1;
		l = gpio_mask;
		break;
810
#endif
811
#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
812 813
	case METHOD_GPIO_7XX:
		reg += OMAP7XX_GPIO_INT_MASK;
814 815 816 817 818 819 820
		l = __raw_readl(reg);
		if (enable)
			l &= ~(gpio_mask);
		else
			l |= gpio_mask;
		break;
#endif
821
#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
822 823 824 825 826 827 828
	case METHOD_GPIO_24XX:
		if (enable)
			reg += OMAP24XX_GPIO_SETIRQENABLE1;
		else
			reg += OMAP24XX_GPIO_CLEARIRQENABLE1;
		l = gpio_mask;
		break;
829 830
#endif
#ifdef CONFIG_ARCH_OMAP4
831
	case METHOD_GPIO_44XX:
832 833 834 835 836 837
		if (enable)
			reg += OMAP4_GPIO_IRQSTATUSSET0;
		else
			reg += OMAP4_GPIO_IRQSTATUSCLR0;
		l = gpio_mask;
		break;
838
#endif
839
	default:
840
		WARN_ON(1);
841 842 843 844 845 846 847 848 849 850
		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);
}

851 852 853 854 855 856 857 858 859 860
/*
 * 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)
{
861
	unsigned long uninitialized_var(flags);
D
David Brownell 已提交
862

863
	switch (bank->method) {
864
#ifdef CONFIG_ARCH_OMAP16XX
D
David Brownell 已提交
865
	case METHOD_MPUIO:
866
	case METHOD_GPIO_1610:
D
David Brownell 已提交
867
		spin_lock_irqsave(&bank->lock, flags);
868
		if (enable)
869
			bank->suspend_wakeup |= (1 << gpio);
870
		else
871
			bank->suspend_wakeup &= ~(1 << gpio);
D
David Brownell 已提交
872
		spin_unlock_irqrestore(&bank->lock, flags);
873
		return 0;
874
#endif
875
#ifdef CONFIG_ARCH_OMAP2PLUS
876
	case METHOD_GPIO_24XX:
877
	case METHOD_GPIO_44XX:
D
David Brownell 已提交
878 879 880 881 882 883
		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 已提交
884
		spin_lock_irqsave(&bank->lock, flags);
885
		if (enable)
886
			bank->suspend_wakeup |= (1 << gpio);
887
		else
888
			bank->suspend_wakeup &= ~(1 << gpio);
D
David Brownell 已提交
889
		spin_unlock_irqrestore(&bank->lock, flags);
890 891
		return 0;
#endif
892 893 894 895 896 897 898
	default:
		printk(KERN_ERR "Can't enable GPIO wakeup for method %i\n",
		       bank->method);
		return -EINVAL;
	}
}

899 900 901 902 903
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);
904
	_set_gpio_triggering(bank, get_gpio_index(gpio), IRQ_TYPE_NONE);
905 906
}

907
/* Use disable_irq_wake() and enable_irq_wake() functions from drivers */
908
static int gpio_wake_enable(struct irq_data *d, unsigned int enable)
909
{
910
	unsigned int gpio = d->irq - IH_GPIO_BASE;
911 912 913 914 915
	struct gpio_bank *bank;
	int retval;

	if (check_gpio(gpio) < 0)
		return -ENODEV;
916
	bank = irq_data_get_irq_chip_data(d);
917 918 919 920 921
	retval = _set_gpio_wakeup(bank, get_gpio_index(gpio), enable);

	return retval;
}

922
static int omap_gpio_request(struct gpio_chip *chip, unsigned offset)
923
{
924
	struct gpio_bank *bank = container_of(chip, struct gpio_bank, chip);
D
David Brownell 已提交
925
	unsigned long flags;
D
David Brownell 已提交
926

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

929 930 931
	/* Set trigger to none. You need to enable the desired trigger with
	 * request_irq() or set_irq_type().
	 */
932
	_set_gpio_triggering(bank, offset, IRQ_TYPE_NONE);
933

934
#ifdef CONFIG_ARCH_OMAP15XX
935
	if (bank->method == METHOD_GPIO_1510) {
936
		void __iomem *reg;
937

938
		/* Claim the pin for MPU */
939
		reg = bank->base + OMAP1510_GPIO_PIN_CONTROL;
940
		__raw_writel(__raw_readl(reg) | (1 << offset), reg);
941 942
	}
#endif
C
Charulatha V 已提交
943 944
	if (!cpu_class_is_omap1()) {
		if (!bank->mod_usage) {
945
			void __iomem *reg = bank->base;
C
Charulatha V 已提交
946
			u32 ctrl;
947 948 949 950 951 952

			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 已提交
953
			/* Module is enabled, clocks are not gated */
954 955
			ctrl &= 0xFFFFFFFE;
			__raw_writel(ctrl, reg);
C
Charulatha V 已提交
956 957 958
		}
		bank->mod_usage |= 1 << offset;
	}
D
David Brownell 已提交
959
	spin_unlock_irqrestore(&bank->lock, flags);
960 961 962 963

	return 0;
}

964
static void omap_gpio_free(struct gpio_chip *chip, unsigned offset)
965
{
966
	struct gpio_bank *bank = container_of(chip, struct gpio_bank, chip);
D
David Brownell 已提交
967
	unsigned long flags;
968

D
David Brownell 已提交
969
	spin_lock_irqsave(&bank->lock, flags);
970 971 972 973
#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;
974
		__raw_writel(1 << offset, reg);
975 976
	}
#endif
977 978
#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
	if (bank->method == METHOD_GPIO_24XX) {
979 980
		/* Disable wake-up during idle for dynamic tick */
		void __iomem *reg = bank->base + OMAP24XX_GPIO_CLEARWKUENA;
981
		__raw_writel(1 << offset, reg);
982
	}
983 984 985 986 987 988 989
#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);
	}
990
#endif
C
Charulatha V 已提交
991 992 993
	if (!cpu_class_is_omap1()) {
		bank->mod_usage &= ~(1 << offset);
		if (!bank->mod_usage) {
994
			void __iomem *reg = bank->base;
C
Charulatha V 已提交
995
			u32 ctrl;
996 997 998 999 1000 1001

			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 已提交
1002 1003
			/* Module is disabled, clocks are gated */
			ctrl |= 1;
1004
			__raw_writel(ctrl, reg);
C
Charulatha V 已提交
1005 1006
		}
	}
1007
	_reset_gpio(bank, bank->chip.base + offset);
D
David Brownell 已提交
1008
	spin_unlock_irqrestore(&bank->lock, flags);
1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019
}

/*
 * 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.
 */
1020
static void gpio_irq_handler(unsigned int irq, struct irq_desc *desc)
1021
{
1022
	void __iomem *isr_reg = NULL;
1023
	u32 isr;
1024
	unsigned int gpio_irq, gpio_index;
1025
	struct gpio_bank *bank;
1026 1027
	u32 retrigger = 0;
	int unmasked = 0;
1028
	struct irq_chip *chip = irq_desc_get_chip(desc);
1029

1030
	chained_irq_enter(chip, desc);
1031

T
Thomas Gleixner 已提交
1032
	bank = irq_get_handler_data(irq);
1033
#ifdef CONFIG_ARCH_OMAP1
1034
	if (bank->method == METHOD_MPUIO)
1035 1036
		isr_reg = bank->base +
				OMAP_MPUIO_GPIO_INT / bank->stride;
1037
#endif
1038
#ifdef CONFIG_ARCH_OMAP15XX
1039 1040 1041 1042 1043 1044 1045
	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
1046
#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
1047 1048
	if (bank->method == METHOD_GPIO_7XX)
		isr_reg = bank->base + OMAP7XX_GPIO_INT_STATUS;
1049
#endif
1050
#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
1051 1052
	if (bank->method == METHOD_GPIO_24XX)
		isr_reg = bank->base + OMAP24XX_GPIO_IRQSTATUS1;
1053 1054
#endif
#if defined(CONFIG_ARCH_OMAP4)
1055
	if (bank->method == METHOD_GPIO_44XX)
1056
		isr_reg = bank->base + OMAP4_GPIO_IRQSTATUS0;
1057
#endif
1058 1059 1060 1061

	if (WARN_ON(!isr_reg))
		goto exit;

1062
	while(1) {
1063
		u32 isr_saved, level_mask = 0;
1064
		u32 enabled;
1065

1066 1067
		enabled = _get_gpio_irqbank_mask(bank);
		isr_saved = isr = __raw_readl(isr_reg) & enabled;
1068 1069 1070 1071

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

1072
		if (cpu_class_is_omap2()) {
1073
			level_mask = bank->level_mask & enabled;
1074
		}
1075 1076 1077 1078 1079 1080 1081 1082 1083 1084

		/* 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 */
1085 1086
		if (!level_mask && !unmasked) {
			unmasked = 1;
1087
			chained_irq_exit(chip, desc);
1088
		}
1089

1090 1091
		isr |= retrigger;
		retrigger = 0;
1092 1093 1094 1095 1096
		if (!isr)
			break;

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

1099 1100
			if (!(isr & 1))
				continue;
1101

1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113
#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

1114
			generic_handle_irq(gpio_irq);
1115
		}
1116
	}
1117 1118 1119 1120
	/* 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 */
1121
exit:
1122
	if (!unmasked)
1123
		chained_irq_exit(chip, desc);
1124 1125
}

1126
static void gpio_irq_shutdown(struct irq_data *d)
1127
{
1128 1129
	unsigned int gpio = d->irq - IH_GPIO_BASE;
	struct gpio_bank *bank = irq_data_get_irq_chip_data(d);
1130
	unsigned long flags;
1131

1132
	spin_lock_irqsave(&bank->lock, flags);
1133
	_reset_gpio(bank, gpio);
1134
	spin_unlock_irqrestore(&bank->lock, flags);
1135 1136
}

1137
static void gpio_ack_irq(struct irq_data *d)
1138
{
1139 1140
	unsigned int gpio = d->irq - IH_GPIO_BASE;
	struct gpio_bank *bank = irq_data_get_irq_chip_data(d);
1141 1142 1143 1144

	_clear_gpio_irqstatus(bank, gpio);
}

1145
static void gpio_mask_irq(struct irq_data *d)
1146
{
1147 1148
	unsigned int gpio = d->irq - IH_GPIO_BASE;
	struct gpio_bank *bank = irq_data_get_irq_chip_data(d);
1149
	unsigned long flags;
1150

1151
	spin_lock_irqsave(&bank->lock, flags);
1152
	_set_gpio_irqenable(bank, gpio, 0);
1153
	_set_gpio_triggering(bank, get_gpio_index(gpio), IRQ_TYPE_NONE);
1154
	spin_unlock_irqrestore(&bank->lock, flags);
1155 1156
}

1157
static void gpio_unmask_irq(struct irq_data *d)
1158
{
1159 1160
	unsigned int gpio = d->irq - IH_GPIO_BASE;
	struct gpio_bank *bank = irq_data_get_irq_chip_data(d);
1161
	unsigned int irq_mask = 1 << get_gpio_index(gpio);
1162
	u32 trigger = irqd_get_trigger_type(d);
1163
	unsigned long flags;
1164

1165
	spin_lock_irqsave(&bank->lock, flags);
1166 1167
	if (trigger)
		_set_gpio_triggering(bank, get_gpio_index(gpio), trigger);
1168 1169 1170 1171 1172 1173 1174

	/* 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);
	}
1175

K
Kevin Hilman 已提交
1176
	_set_gpio_irqenable(bank, gpio, 1);
1177
	spin_unlock_irqrestore(&bank->lock, flags);
1178 1179
}

1180 1181
static struct irq_chip gpio_irq_chip = {
	.name		= "GPIO",
1182 1183 1184 1185 1186 1187
	.irq_shutdown	= gpio_irq_shutdown,
	.irq_ack	= gpio_ack_irq,
	.irq_mask	= gpio_mask_irq,
	.irq_unmask	= gpio_unmask_irq,
	.irq_set_type	= gpio_irq_type,
	.irq_set_wake	= gpio_wake_enable,
1188 1189 1190 1191 1192 1193 1194 1195
};

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

#ifdef CONFIG_ARCH_OMAP1

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

1196
static void mpuio_ack_irq(struct irq_data *d)
1197 1198 1199 1200
{
	/* The ISR is reset automatically, so do nothing here. */
}

1201
static void mpuio_mask_irq(struct irq_data *d)
1202
{
1203 1204
	unsigned int gpio = OMAP_MPUIO(d->irq - IH_MPUIO_BASE);
	struct gpio_bank *bank = irq_data_get_irq_chip_data(d);
1205 1206 1207 1208

	_set_gpio_irqenable(bank, gpio, 0);
}

1209
static void mpuio_unmask_irq(struct irq_data *d)
1210
{
1211 1212
	unsigned int gpio = OMAP_MPUIO(d->irq - IH_MPUIO_BASE);
	struct gpio_bank *bank = irq_data_get_irq_chip_data(d);
1213 1214 1215 1216

	_set_gpio_irqenable(bank, gpio, 1);
}

1217 1218
static struct irq_chip mpuio_irq_chip = {
	.name		= "MPUIO",
1219 1220 1221 1222
	.irq_ack	= mpuio_ack_irq,
	.irq_mask	= mpuio_mask_irq,
	.irq_unmask	= mpuio_unmask_irq,
	.irq_set_type	= gpio_irq_type,
D
David Brownell 已提交
1223 1224
#ifdef CONFIG_ARCH_OMAP16XX
	/* REVISIT: assuming only 16xx supports MPUIO wake events */
1225
	.irq_set_wake	= gpio_wake_enable,
D
David Brownell 已提交
1226
#endif
1227 1228
};

1229 1230 1231

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

D
David Brownell 已提交
1232 1233 1234 1235 1236

#ifdef CONFIG_ARCH_OMAP16XX

#include <linux/platform_device.h>

1237
static int omap_mpuio_suspend_noirq(struct device *dev)
D
David Brownell 已提交
1238
{
1239
	struct platform_device *pdev = to_platform_device(dev);
D
David Brownell 已提交
1240
	struct gpio_bank	*bank = platform_get_drvdata(pdev);
1241 1242
	void __iomem		*mask_reg = bank->base +
					OMAP_MPUIO_GPIO_MASKIT / bank->stride;
D
David Brownell 已提交
1243
	unsigned long		flags;
D
David Brownell 已提交
1244

D
David Brownell 已提交
1245
	spin_lock_irqsave(&bank->lock, flags);
D
David Brownell 已提交
1246 1247
	bank->saved_wakeup = __raw_readl(mask_reg);
	__raw_writel(0xffff & ~bank->suspend_wakeup, mask_reg);
D
David Brownell 已提交
1248
	spin_unlock_irqrestore(&bank->lock, flags);
D
David Brownell 已提交
1249 1250 1251 1252

	return 0;
}

1253
static int omap_mpuio_resume_noirq(struct device *dev)
D
David Brownell 已提交
1254
{
1255
	struct platform_device *pdev = to_platform_device(dev);
D
David Brownell 已提交
1256
	struct gpio_bank	*bank = platform_get_drvdata(pdev);
1257 1258
	void __iomem		*mask_reg = bank->base +
					OMAP_MPUIO_GPIO_MASKIT / bank->stride;
D
David Brownell 已提交
1259
	unsigned long		flags;
D
David Brownell 已提交
1260

D
David Brownell 已提交
1261
	spin_lock_irqsave(&bank->lock, flags);
D
David Brownell 已提交
1262
	__raw_writel(bank->saved_wakeup, mask_reg);
D
David Brownell 已提交
1263
	spin_unlock_irqrestore(&bank->lock, flags);
D
David Brownell 已提交
1264 1265 1266 1267

	return 0;
}

1268
static const struct dev_pm_ops omap_mpuio_dev_pm_ops = {
1269 1270 1271 1272
	.suspend_noirq = omap_mpuio_suspend_noirq,
	.resume_noirq = omap_mpuio_resume_noirq,
};

1273
/* use platform_driver for this. */
D
David Brownell 已提交
1274 1275 1276
static struct platform_driver omap_mpuio_driver = {
	.driver		= {
		.name	= "mpuio",
1277
		.pm	= &omap_mpuio_dev_pm_ops,
D
David Brownell 已提交
1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291
	},
};

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)
{
1292 1293
	struct gpio_bank *bank = get_gpio_bank(OMAP_MPUIO(0));
	platform_set_drvdata(&omap_mpuio_device, bank);
1294

D
David Brownell 已提交
1295 1296 1297 1298 1299 1300 1301 1302
	if (platform_driver_register(&omap_mpuio_driver) == 0)
		(void) platform_device_register(&omap_mpuio_device);
}

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

1303 1304 1305 1306 1307
#else

extern struct irq_chip mpuio_irq_chip;

#define bank_is_mpuio(bank)	0
D
David Brownell 已提交
1308
static inline void mpuio_init(void) {}
1309 1310 1311 1312

#endif

/*---------------------------------------------------------------------*/
1313

D
David Brownell 已提交
1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329
/* 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;
}

1330 1331 1332 1333 1334 1335
static int gpio_is_input(struct gpio_bank *bank, int mask)
{
	void __iomem *reg = bank->base;

	switch (bank->method) {
	case METHOD_MPUIO:
1336
		reg += OMAP_MPUIO_IO_CNTL / bank->stride;
1337 1338 1339 1340 1341 1342 1343
		break;
	case METHOD_GPIO_1510:
		reg += OMAP1510_GPIO_DIR_CONTROL;
		break;
	case METHOD_GPIO_1610:
		reg += OMAP1610_GPIO_DIRECTION;
		break;
1344 1345
	case METHOD_GPIO_7XX:
		reg += OMAP7XX_GPIO_DIR_CONTROL;
1346 1347 1348 1349
		break;
	case METHOD_GPIO_24XX:
		reg += OMAP24XX_GPIO_OE;
		break;
1350 1351 1352 1353 1354 1355
	case METHOD_GPIO_44XX:
		reg += OMAP4_GPIO_OE;
		break;
	default:
		WARN_ONCE(1, "gpio_is_input: incorrect OMAP GPIO method");
		return -EINVAL;
1356 1357 1358 1359
	}
	return __raw_readl(reg) & mask;
}

D
David Brownell 已提交
1360 1361
static int gpio_get(struct gpio_chip *chip, unsigned offset)
{
1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375
	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 已提交
1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390
}

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;
}

1391 1392 1393 1394 1395 1396 1397
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);
1398 1399 1400 1401 1402 1403 1404

	if (!bank->dbck) {
		bank->dbck = clk_get(bank->dev, "dbclk");
		if (IS_ERR(bank->dbck))
			dev_err(bank->dev, "Could not get gpio dbck\n");
	}

1405 1406 1407 1408 1409 1410 1411
	spin_lock_irqsave(&bank->lock, flags);
	_set_gpio_debounce(bank, offset, debounce);
	spin_unlock_irqrestore(&bank->lock, flags);

	return 0;
}

D
David Brownell 已提交
1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422
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);
}

1423 1424 1425 1426 1427 1428 1429 1430
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 已提交
1431 1432
/*---------------------------------------------------------------------*/

1433
static void __init omap_gpio_show_rev(struct gpio_bank *bank)
T
Tony Lindgren 已提交
1434 1435 1436
{
	u32 rev;

1437 1438
	if (cpu_is_omap16xx() && !(bank->method != METHOD_MPUIO))
		rev = __raw_readw(bank->base + OMAP1610_GPIO_REVISION);
T
Tony Lindgren 已提交
1439
	else if (cpu_is_omap24xx() || cpu_is_omap34xx())
1440
		rev = __raw_readl(bank->base + OMAP24XX_GPIO_REVISION);
T
Tony Lindgren 已提交
1441
	else if (cpu_is_omap44xx())
1442
		rev = __raw_readl(bank->base + OMAP4_GPIO_REVISION);
T
Tony Lindgren 已提交
1443 1444 1445 1446 1447 1448 1449
	else
		return;

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

1450 1451 1452 1453 1454
/* 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;

1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467
static inline int init_gpio_info(struct platform_device *pdev)
{
	/* TODO: Analyze removing gpio_bank_count usage from driver code */
	gpio_bank = kzalloc(gpio_bank_count * sizeof(struct gpio_bank),
				GFP_KERNEL);
	if (!gpio_bank) {
		dev_err(&pdev->dev, "Memory alloc failed for gpio_bank\n");
		return -ENOMEM;
	}
	return 0;
}

/* TODO: Cleanup cpu_is_* checks */
1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496
static void omap_gpio_mod_init(struct gpio_bank *bank, int id)
{
	if (cpu_class_is_omap2()) {
		if (cpu_is_omap44xx()) {
			__raw_writel(0xffffffff, bank->base +
					OMAP4_GPIO_IRQSTATUSCLR0);
			__raw_writel(0x00000000, bank->base +
					 OMAP4_GPIO_DEBOUNCENABLE);
			/* Initialize interface clk ungated, module enabled */
			__raw_writel(0, bank->base + OMAP4_GPIO_CTRL);
		} else if (cpu_is_omap34xx()) {
			__raw_writel(0x00000000, bank->base +
					OMAP24XX_GPIO_IRQENABLE1);
			__raw_writel(0xffffffff, bank->base +
					OMAP24XX_GPIO_IRQSTATUS1);
			__raw_writel(0x00000000, bank->base +
					OMAP24XX_GPIO_DEBOUNCE_EN);

			/* Initialize interface clk ungated, module enabled */
			__raw_writel(0, bank->base + OMAP24XX_GPIO_CTRL);
		} else if (cpu_is_omap24xx()) {
			static const u32 non_wakeup_gpios[] = {
				0xe203ffc0, 0x08700040
			};
			if (id < ARRAY_SIZE(non_wakeup_gpios))
				bank->non_wakeup_gpios = non_wakeup_gpios[id];
		}
	} else if (cpu_class_is_omap1()) {
		if (bank_is_mpuio(bank))
1497 1498
			__raw_writew(0xffff, bank->base +
				OMAP_MPUIO_GPIO_MASKIT / bank->stride);
1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528
		if (cpu_is_omap15xx() && bank->method == METHOD_GPIO_1510) {
			__raw_writew(0xffff, bank->base
						+ OMAP1510_GPIO_INT_MASK);
			__raw_writew(0x0000, bank->base
						+ OMAP1510_GPIO_INT_STATUS);
		}
		if (cpu_is_omap16xx() && bank->method == METHOD_GPIO_1610) {
			__raw_writew(0x0000, bank->base
						+ OMAP1610_GPIO_IRQENABLE1);
			__raw_writew(0xffff, bank->base
						+ OMAP1610_GPIO_IRQSTATUS1);
			__raw_writew(0x0014, bank->base
						+ OMAP1610_GPIO_SYSCONFIG);

			/*
			 * Enable system clock for GPIO module.
			 * The CAM_CLK_CTRL *is* really the right place.
			 */
			omap_writel(omap_readl(ULPD_CAM_CLK_CTRL) | 0x04,
						ULPD_CAM_CLK_CTRL);
		}
		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);
		}
	}
}

1529
static void __devinit omap_gpio_chip_init(struct gpio_bank *bank)
1530
{
1531
	int j;
1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563
	static int gpio;

	bank->mod_usage = 0;
	/*
	 * REVISIT eventually switch from OMAP-specific gpio structs
	 * over to the generic ones
	 */
	bank->chip.request = omap_gpio_request;
	bank->chip.free = omap_gpio_free;
	bank->chip.direction_input = gpio_input;
	bank->chip.get = gpio_get;
	bank->chip.direction_output = gpio_output;
	bank->chip.set_debounce = gpio_debounce;
	bank->chip.set = gpio_set;
	bank->chip.to_irq = gpio_2irq;
	if (bank_is_mpuio(bank)) {
		bank->chip.label = "mpuio";
#ifdef CONFIG_ARCH_OMAP16XX
		bank->chip.dev = &omap_mpuio_device.dev;
#endif
		bank->chip.base = OMAP_MPUIO(0);
	} else {
		bank->chip.label = "gpio";
		bank->chip.base = gpio;
		gpio += bank_width;
	}
	bank->chip.ngpio = bank_width;

	gpiochip_add(&bank->chip);

	for (j = bank->virtual_irq_start;
		     j < bank->virtual_irq_start + bank_width; j++) {
1564
		irq_set_lockdep_class(j, &gpio_lock_class);
T
Thomas Gleixner 已提交
1565
		irq_set_chip_data(j, bank);
1566
		if (bank_is_mpuio(bank))
T
Thomas Gleixner 已提交
1567
			irq_set_chip(j, &mpuio_irq_chip);
1568
		else
T
Thomas Gleixner 已提交
1569 1570
			irq_set_chip(j, &gpio_irq_chip);
		irq_set_handler(j, handle_simple_irq);
1571 1572
		set_irq_flags(j, IRQF_VALID);
	}
T
Thomas Gleixner 已提交
1573 1574
	irq_set_chained_handler(bank->irq, gpio_irq_handler);
	irq_set_handler_data(bank->irq, bank);
1575 1576
}

1577
static int __devinit omap_gpio_probe(struct platform_device *pdev)
1578
{
1579 1580 1581 1582
	static int gpio_init_done;
	struct omap_gpio_platform_data *pdata;
	struct resource *res;
	int id;
1583 1584
	struct gpio_bank *bank;

1585 1586
	if (!pdev->dev.platform_data)
		return -EINVAL;
1587

1588
	pdata = pdev->dev.platform_data;
1589

1590 1591
	if (!gpio_init_done) {
		int ret;
1592

1593 1594 1595
		ret = init_gpio_info(pdev);
		if (ret)
			return ret;
1596 1597
	}

1598 1599
	id = pdev->id;
	bank = &gpio_bank[id];
1600

1601 1602 1603 1604
	res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
	if (unlikely(!res)) {
		dev_err(&pdev->dev, "GPIO Bank %i Invalid IRQ resource\n", id);
		return -ENODEV;
1605
	}
1606

1607 1608 1609 1610 1611
	bank->irq = res->start;
	bank->virtual_irq_start = pdata->virtual_irq_start;
	bank->method = pdata->bank_type;
	bank->dev = &pdev->dev;
	bank->dbck_flag = pdata->dbck_flag;
1612
	bank->stride = pdata->bank_stride;
1613
	bank_width = pdata->bank_width;
T
Tony Lindgren 已提交
1614

1615
	spin_lock_init(&bank->lock);
T
Tony Lindgren 已提交
1616

1617 1618 1619 1620 1621 1622
	/* Static mapping, never released */
	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	if (unlikely(!res)) {
		dev_err(&pdev->dev, "GPIO Bank %i Invalid mem resource\n", id);
		return -ENODEV;
	}
1623

1624 1625 1626 1627
	bank->base = ioremap(res->start, resource_size(res));
	if (!bank->base) {
		dev_err(&pdev->dev, "Could not ioremap gpio bank%i\n", id);
		return -ENOMEM;
1628 1629
	}

1630 1631 1632 1633 1634
	pm_runtime_enable(bank->dev);
	pm_runtime_get_sync(bank->dev);

	omap_gpio_mod_init(bank, id);
	omap_gpio_chip_init(bank);
1635
	omap_gpio_show_rev(bank);
T
Tony Lindgren 已提交
1636

1637 1638 1639
	if (!gpio_init_done)
		gpio_init_done = 1;

1640 1641 1642
	return 0;
}

1643
#if defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP2PLUS)
1644
static int omap_gpio_suspend(void)
1645 1646 1647
{
	int i;

1648
	if (!cpu_class_is_omap2() && !cpu_is_omap16xx())
1649 1650 1651 1652 1653 1654 1655
		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 已提交
1656
		unsigned long flags;
1657 1658

		switch (bank->method) {
1659
#ifdef CONFIG_ARCH_OMAP16XX
1660 1661 1662 1663 1664
		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;
1665
#endif
1666
#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
1667
		case METHOD_GPIO_24XX:
1668
			wake_status = bank->base + OMAP24XX_GPIO_WAKE_EN;
1669 1670 1671
			wake_clear = bank->base + OMAP24XX_GPIO_CLEARWKUENA;
			wake_set = bank->base + OMAP24XX_GPIO_SETWKUENA;
			break;
1672 1673
#endif
#ifdef CONFIG_ARCH_OMAP4
1674
		case METHOD_GPIO_44XX:
1675 1676 1677 1678
			wake_status = bank->base + OMAP4_GPIO_IRQWAKEN0;
			wake_clear = bank->base + OMAP4_GPIO_IRQWAKEN0;
			wake_set = bank->base + OMAP4_GPIO_IRQWAKEN0;
			break;
1679
#endif
1680 1681 1682 1683
		default:
			continue;
		}

D
David Brownell 已提交
1684
		spin_lock_irqsave(&bank->lock, flags);
1685 1686 1687
		bank->saved_wakeup = __raw_readl(wake_status);
		__raw_writel(0xffffffff, wake_clear);
		__raw_writel(bank->suspend_wakeup, wake_set);
D
David Brownell 已提交
1688
		spin_unlock_irqrestore(&bank->lock, flags);
1689 1690 1691 1692 1693
	}

	return 0;
}

1694
static void omap_gpio_resume(void)
1695 1696 1697
{
	int i;

1698
	if (!cpu_class_is_omap2() && !cpu_is_omap16xx())
1699
		return;
1700 1701 1702 1703 1704

	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 已提交
1705
		unsigned long flags;
1706 1707

		switch (bank->method) {
1708
#ifdef CONFIG_ARCH_OMAP16XX
1709 1710 1711 1712
		case METHOD_GPIO_1610:
			wake_clear = bank->base + OMAP1610_GPIO_CLEAR_WAKEUPENA;
			wake_set = bank->base + OMAP1610_GPIO_SET_WAKEUPENA;
			break;
1713
#endif
1714
#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
1715
		case METHOD_GPIO_24XX:
1716 1717
			wake_clear = bank->base + OMAP24XX_GPIO_CLEARWKUENA;
			wake_set = bank->base + OMAP24XX_GPIO_SETWKUENA;
1718
			break;
1719 1720
#endif
#ifdef CONFIG_ARCH_OMAP4
1721
		case METHOD_GPIO_44XX:
1722 1723 1724
			wake_clear = bank->base + OMAP4_GPIO_IRQWAKEN0;
			wake_set = bank->base + OMAP4_GPIO_IRQWAKEN0;
			break;
1725
#endif
1726 1727 1728 1729
		default:
			continue;
		}

D
David Brownell 已提交
1730
		spin_lock_irqsave(&bank->lock, flags);
1731 1732
		__raw_writel(0xffffffff, wake_clear);
		__raw_writel(bank->saved_wakeup, wake_set);
D
David Brownell 已提交
1733
		spin_unlock_irqrestore(&bank->lock, flags);
1734 1735 1736
	}
}

1737
static struct syscore_ops omap_gpio_syscore_ops = {
1738 1739 1740 1741
	.suspend	= omap_gpio_suspend,
	.resume		= omap_gpio_resume,
};

1742 1743
#endif

1744
#ifdef CONFIG_ARCH_OMAP2PLUS
1745 1746 1747

static int workaround_enabled;

1748
void omap2_gpio_prepare_for_idle(int off_mode)
1749 1750
{
	int i, c = 0;
T
Tero Kristo 已提交
1751
	int min = 0;
1752

T
Tero Kristo 已提交
1753 1754
	if (cpu_is_omap34xx())
		min = 1;
1755

T
Tero Kristo 已提交
1756
	for (i = min; i < gpio_bank_count; i++) {
1757
		struct gpio_bank *bank = &gpio_bank[i];
1758
		u32 l1 = 0, l2 = 0;
1759
		int j;
1760

1761
		for (j = 0; j < hweight_long(bank->dbck_enable_mask); j++)
1762 1763
			clk_disable(bank->dbck);

1764
		if (!off_mode)
1765 1766 1767 1768 1769
			continue;

		/* If going to OFF, remove triggering for all
		 * non-wakeup GPIOs.  Otherwise spurious IRQs will be
		 * generated.  See OMAP2420 Errata item 1.101. */
1770 1771
		if (!(bank->enabled_non_wakeup_gpios))
			continue;
1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790

		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);
		}

1791 1792 1793 1794
		bank->saved_fallingdetect = l1;
		bank->saved_risingdetect = l2;
		l1 &= ~bank->enabled_non_wakeup_gpios;
		l2 &= ~bank->enabled_non_wakeup_gpios;
1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807

		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);
		}

1808 1809 1810 1811 1812 1813 1814 1815 1816
		c++;
	}
	if (!c) {
		workaround_enabled = 0;
		return;
	}
	workaround_enabled = 1;
}

1817
void omap2_gpio_resume_after_idle(void)
1818 1819
{
	int i;
T
Tero Kristo 已提交
1820
	int min = 0;
1821

T
Tero Kristo 已提交
1822 1823 1824
	if (cpu_is_omap34xx())
		min = 1;
	for (i = min; i < gpio_bank_count; i++) {
1825
		struct gpio_bank *bank = &gpio_bank[i];
1826
		u32 l = 0, gen, gen0, gen1;
1827
		int j;
1828

1829
		for (j = 0; j < hweight_long(bank->dbck_enable_mask); j++)
1830 1831
			clk_enable(bank->dbck);

1832 1833 1834
		if (!workaround_enabled)
			continue;

1835 1836
		if (!(bank->enabled_non_wakeup_gpios))
			continue;
1837 1838 1839

		if (cpu_is_omap24xx() || cpu_is_omap34xx()) {
			__raw_writel(bank->saved_fallingdetect,
1840
				 bank->base + OMAP24XX_GPIO_FALLINGDETECT);
1841
			__raw_writel(bank->saved_risingdetect,
1842
				 bank->base + OMAP24XX_GPIO_RISINGDETECT);
1843 1844 1845 1846 1847
			l = __raw_readl(bank->base + OMAP24XX_GPIO_DATAIN);
		}

		if (cpu_is_omap44xx()) {
			__raw_writel(bank->saved_fallingdetect,
1848
				 bank->base + OMAP4_GPIO_FALLINGDETECT);
1849
			__raw_writel(bank->saved_risingdetect,
1850
				 bank->base + OMAP4_GPIO_RISINGDETECT);
1851 1852 1853
			l = __raw_readl(bank->base + OMAP4_GPIO_DATAIN);
		}

1854 1855 1856 1857 1858
		/* 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 已提交
1859
		l &= bank->enabled_non_wakeup_gpios;
1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877

		/*
		 * 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) {
1878
			u32 old0, old1;
1879

1880
			if (cpu_is_omap24xx() || cpu_is_omap34xx()) {
1881 1882 1883 1884
				old0 = __raw_readl(bank->base +
					OMAP24XX_GPIO_LEVELDETECT0);
				old1 = __raw_readl(bank->base +
					OMAP24XX_GPIO_LEVELDETECT1);
1885
				__raw_writel(old0 | gen, bank->base +
1886
					OMAP24XX_GPIO_LEVELDETECT0);
1887
				__raw_writel(old1 | gen, bank->base +
1888
					OMAP24XX_GPIO_LEVELDETECT1);
1889
				__raw_writel(old0, bank->base +
1890
					OMAP24XX_GPIO_LEVELDETECT0);
1891
				__raw_writel(old1, bank->base +
1892 1893 1894 1895 1896
					OMAP24XX_GPIO_LEVELDETECT1);
			}

			if (cpu_is_omap44xx()) {
				old0 = __raw_readl(bank->base +
1897
						OMAP4_GPIO_LEVELDETECT0);
1898
				old1 = __raw_readl(bank->base +
1899
						OMAP4_GPIO_LEVELDETECT1);
1900
				__raw_writel(old0 | l, bank->base +
1901
						OMAP4_GPIO_LEVELDETECT0);
1902
				__raw_writel(old1 | l, bank->base +
1903
						OMAP4_GPIO_LEVELDETECT1);
1904
				__raw_writel(old0, bank->base +
1905
						OMAP4_GPIO_LEVELDETECT0);
1906
				__raw_writel(old1, bank->base +
1907
						OMAP4_GPIO_LEVELDETECT1);
1908
			}
1909 1910 1911 1912 1913
		}
	}

}

1914 1915
#endif

1916
#ifdef CONFIG_ARCH_OMAP3
1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978
/* 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].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].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

1979 1980 1981 1982 1983 1984 1985
static struct platform_driver omap_gpio_driver = {
	.probe		= omap_gpio_probe,
	.driver		= {
		.name	= "omap_gpio",
	},
};

1986
/*
1987 1988 1989
 * gpio driver register needs to be done before
 * machine_init functions access gpio APIs.
 * Hence omap_gpio_drv_reg() is a postcore_initcall.
1990
 */
1991
static int __init omap_gpio_drv_reg(void)
1992
{
1993
	return platform_driver_register(&omap_gpio_driver);
1994
}
1995
postcore_initcall(omap_gpio_drv_reg);
1996

1997 1998
static int __init omap_gpio_sysinit(void)
{
D
David Brownell 已提交
1999 2000
	mpuio_init();

2001
#if defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP2PLUS)
2002 2003
	if (cpu_is_omap16xx() || cpu_class_is_omap2())
		register_syscore_ops(&omap_gpio_syscore_ops);
2004 2005
#endif

2006
	return 0;
2007 2008 2009
}

arch_initcall(omap_gpio_sysinit);