gpio-omap.c 49.0 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
	u32 width;
58 59
};

60
#ifdef CONFIG_ARCH_OMAP3
61 62 63 64 65 66 67 68 69 70 71
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;
72 73
};

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	l = 1 << get_gpio_index(gpio);

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

	__raw_writel(debounce, reg);

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

	val = __raw_readl(reg);

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

	__raw_writel(val, reg);
}

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

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

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

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

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

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

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

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

	if (check_gpio(gpio) < 0)
631 632
		return -EINVAL;

633
	if (type & ~IRQ_TYPE_SENSE_MASK)
634
		return -EINVAL;
635 636

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

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

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

651
	return retval;
652 653 654 655
}

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

	switch (bank->method) {
659
#ifdef CONFIG_ARCH_OMAP15XX
660 661 662
	case METHOD_GPIO_1510:
		reg += OMAP1510_GPIO_INT_STATUS;
		break;
663 664
#endif
#ifdef CONFIG_ARCH_OMAP16XX
665 666 667
	case METHOD_GPIO_1610:
		reg += OMAP1610_GPIO_IRQSTATUS1;
		break;
668
#endif
669
#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
670 671
	case METHOD_GPIO_7XX:
		reg += OMAP7XX_GPIO_INT_STATUS;
672 673
		break;
#endif
674
#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
675 676 677
	case METHOD_GPIO_24XX:
		reg += OMAP24XX_GPIO_IRQSTATUS1;
		break;
678 679
#endif
#if defined(CONFIG_ARCH_OMAP4)
680
	case METHOD_GPIO_44XX:
681 682
		reg += OMAP4_GPIO_IRQSTATUS0;
		break;
683
#endif
684
	default:
685
		WARN_ON(1);
686 687 688
		return;
	}
	__raw_writel(gpio_mask, reg);
689 690

	/* Workaround for clearing DSP GPIO interrupts to allow retention */
691 692 693 694 695
	if (cpu_is_omap24xx() || cpu_is_omap34xx())
		reg = bank->base + OMAP24XX_GPIO_IRQSTATUS2;
	else if (cpu_is_omap44xx())
		reg = bank->base + OMAP4_GPIO_IRQSTATUS1;

696
	if (cpu_is_omap24xx() || cpu_is_omap34xx() || cpu_is_omap44xx())
697 698 699 700
		__raw_writel(gpio_mask, reg);

	/* Flush posted write for the irq status to avoid spurious interrupts */
	__raw_readl(reg);
701 702 703 704 705 706 707
}

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

708 709 710
static u32 _get_gpio_irqbank_mask(struct gpio_bank *bank)
{
	void __iomem *reg = bank->base;
711 712 713
	int inv = 0;
	u32 l;
	u32 mask;
714 715

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

760 761 762 763 764
	l = __raw_readl(reg);
	if (inv)
		l = ~l;
	l &= mask;
	return l;
765 766
}

767 768
static void _enable_gpio_irqbank(struct gpio_bank *bank, int gpio_mask, int enable)
{
769
	void __iomem *reg = bank->base;
770 771 772
	u32 l;

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

842 843 844 845 846 847 848 849 850 851
/*
 * 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)
{
852
	unsigned long uninitialized_var(flags);
D
David Brownell 已提交
853

854
	switch (bank->method) {
855
#ifdef CONFIG_ARCH_OMAP16XX
D
David Brownell 已提交
856
	case METHOD_MPUIO:
857
	case METHOD_GPIO_1610:
D
David Brownell 已提交
858
		spin_lock_irqsave(&bank->lock, flags);
859
		if (enable)
860
			bank->suspend_wakeup |= (1 << gpio);
861
		else
862
			bank->suspend_wakeup &= ~(1 << gpio);
D
David Brownell 已提交
863
		spin_unlock_irqrestore(&bank->lock, flags);
864
		return 0;
865
#endif
866
#ifdef CONFIG_ARCH_OMAP2PLUS
867
	case METHOD_GPIO_24XX:
868
	case METHOD_GPIO_44XX:
D
David Brownell 已提交
869 870 871
		if (bank->non_wakeup_gpios & (1 << gpio)) {
			printk(KERN_ERR "Unable to modify wakeup on "
					"non-wakeup GPIO%d\n",
872
			       (bank - gpio_bank) * bank->width + gpio);
D
David Brownell 已提交
873 874
			return -EINVAL;
		}
D
David Brownell 已提交
875
		spin_lock_irqsave(&bank->lock, flags);
876
		if (enable)
877
			bank->suspend_wakeup |= (1 << gpio);
878
		else
879
			bank->suspend_wakeup &= ~(1 << gpio);
D
David Brownell 已提交
880
		spin_unlock_irqrestore(&bank->lock, flags);
881 882
		return 0;
#endif
883 884 885 886 887 888 889
	default:
		printk(KERN_ERR "Can't enable GPIO wakeup for method %i\n",
		       bank->method);
		return -EINVAL;
	}
}

890 891 892 893 894
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);
895
	_set_gpio_triggering(bank, get_gpio_index(gpio), IRQ_TYPE_NONE);
896 897
}

898
/* Use disable_irq_wake() and enable_irq_wake() functions from drivers */
899
static int gpio_wake_enable(struct irq_data *d, unsigned int enable)
900
{
901
	unsigned int gpio = d->irq - IH_GPIO_BASE;
902 903 904 905 906
	struct gpio_bank *bank;
	int retval;

	if (check_gpio(gpio) < 0)
		return -ENODEV;
907
	bank = irq_data_get_irq_chip_data(d);
908 909 910 911 912
	retval = _set_gpio_wakeup(bank, get_gpio_index(gpio), enable);

	return retval;
}

913
static int omap_gpio_request(struct gpio_chip *chip, unsigned offset)
914
{
915
	struct gpio_bank *bank = container_of(chip, struct gpio_bank, chip);
D
David Brownell 已提交
916
	unsigned long flags;
D
David Brownell 已提交
917

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

920 921 922
	/* Set trigger to none. You need to enable the desired trigger with
	 * request_irq() or set_irq_type().
	 */
923
	_set_gpio_triggering(bank, offset, IRQ_TYPE_NONE);
924

925
#ifdef CONFIG_ARCH_OMAP15XX
926
	if (bank->method == METHOD_GPIO_1510) {
927
		void __iomem *reg;
928

929
		/* Claim the pin for MPU */
930
		reg = bank->base + OMAP1510_GPIO_PIN_CONTROL;
931
		__raw_writel(__raw_readl(reg) | (1 << offset), reg);
932 933
	}
#endif
C
Charulatha V 已提交
934 935
	if (!cpu_class_is_omap1()) {
		if (!bank->mod_usage) {
936
			void __iomem *reg = bank->base;
C
Charulatha V 已提交
937
			u32 ctrl;
938 939 940 941 942 943

			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 已提交
944
			/* Module is enabled, clocks are not gated */
945 946
			ctrl &= 0xFFFFFFFE;
			__raw_writel(ctrl, reg);
C
Charulatha V 已提交
947 948 949
		}
		bank->mod_usage |= 1 << offset;
	}
D
David Brownell 已提交
950
	spin_unlock_irqrestore(&bank->lock, flags);
951 952 953 954

	return 0;
}

955
static void omap_gpio_free(struct gpio_chip *chip, unsigned offset)
956
{
957
	struct gpio_bank *bank = container_of(chip, struct gpio_bank, chip);
D
David Brownell 已提交
958
	unsigned long flags;
959

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

			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 已提交
993 994
			/* Module is disabled, clocks are gated */
			ctrl |= 1;
995
			__raw_writel(ctrl, reg);
C
Charulatha V 已提交
996 997
		}
	}
998
	_reset_gpio(bank, bank->chip.base + offset);
D
David Brownell 已提交
999
	spin_unlock_irqrestore(&bank->lock, flags);
1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010
}

/*
 * 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.
 */
1011
static void gpio_irq_handler(unsigned int irq, struct irq_desc *desc)
1012
{
1013
	void __iomem *isr_reg = NULL;
1014
	u32 isr;
1015
	unsigned int gpio_irq, gpio_index;
1016
	struct gpio_bank *bank;
1017 1018
	u32 retrigger = 0;
	int unmasked = 0;
1019
	struct irq_chip *chip = irq_desc_get_chip(desc);
1020

1021
	chained_irq_enter(chip, desc);
1022

T
Thomas Gleixner 已提交
1023
	bank = irq_get_handler_data(irq);
1024
#ifdef CONFIG_ARCH_OMAP1
1025
	if (bank->method == METHOD_MPUIO)
1026 1027
		isr_reg = bank->base +
				OMAP_MPUIO_GPIO_INT / bank->stride;
1028
#endif
1029
#ifdef CONFIG_ARCH_OMAP15XX
1030 1031 1032 1033 1034 1035 1036
	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
1037
#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
1038 1039
	if (bank->method == METHOD_GPIO_7XX)
		isr_reg = bank->base + OMAP7XX_GPIO_INT_STATUS;
1040
#endif
1041
#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
1042 1043
	if (bank->method == METHOD_GPIO_24XX)
		isr_reg = bank->base + OMAP24XX_GPIO_IRQSTATUS1;
1044 1045
#endif
#if defined(CONFIG_ARCH_OMAP4)
1046
	if (bank->method == METHOD_GPIO_44XX)
1047
		isr_reg = bank->base + OMAP4_GPIO_IRQSTATUS0;
1048
#endif
1049 1050 1051 1052

	if (WARN_ON(!isr_reg))
		goto exit;

1053
	while(1) {
1054
		u32 isr_saved, level_mask = 0;
1055
		u32 enabled;
1056

1057 1058
		enabled = _get_gpio_irqbank_mask(bank);
		isr_saved = isr = __raw_readl(isr_reg) & enabled;
1059 1060 1061 1062

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

1063
		if (cpu_class_is_omap2()) {
1064
			level_mask = bank->level_mask & enabled;
1065
		}
1066 1067 1068 1069 1070 1071 1072 1073 1074 1075

		/* 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 */
1076 1077
		if (!level_mask && !unmasked) {
			unmasked = 1;
1078
			chained_irq_exit(chip, desc);
1079
		}
1080

1081 1082
		isr |= retrigger;
		retrigger = 0;
1083 1084 1085 1086 1087
		if (!isr)
			break;

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

1090 1091
			if (!(isr & 1))
				continue;
1092

1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104
#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

1105
			generic_handle_irq(gpio_irq);
1106
		}
1107
	}
1108 1109 1110 1111
	/* 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 */
1112
exit:
1113
	if (!unmasked)
1114
		chained_irq_exit(chip, desc);
1115 1116
}

1117
static void gpio_irq_shutdown(struct irq_data *d)
1118
{
1119 1120
	unsigned int gpio = d->irq - IH_GPIO_BASE;
	struct gpio_bank *bank = irq_data_get_irq_chip_data(d);
1121
	unsigned long flags;
1122

1123
	spin_lock_irqsave(&bank->lock, flags);
1124
	_reset_gpio(bank, gpio);
1125
	spin_unlock_irqrestore(&bank->lock, flags);
1126 1127
}

1128
static void gpio_ack_irq(struct irq_data *d)
1129
{
1130 1131
	unsigned int gpio = d->irq - IH_GPIO_BASE;
	struct gpio_bank *bank = irq_data_get_irq_chip_data(d);
1132 1133 1134 1135

	_clear_gpio_irqstatus(bank, gpio);
}

1136
static void gpio_mask_irq(struct irq_data *d)
1137
{
1138 1139
	unsigned int gpio = d->irq - IH_GPIO_BASE;
	struct gpio_bank *bank = irq_data_get_irq_chip_data(d);
1140
	unsigned long flags;
1141

1142
	spin_lock_irqsave(&bank->lock, flags);
1143
	_set_gpio_irqenable(bank, gpio, 0);
1144
	_set_gpio_triggering(bank, get_gpio_index(gpio), IRQ_TYPE_NONE);
1145
	spin_unlock_irqrestore(&bank->lock, flags);
1146 1147
}

1148
static void gpio_unmask_irq(struct irq_data *d)
1149
{
1150 1151
	unsigned int gpio = d->irq - IH_GPIO_BASE;
	struct gpio_bank *bank = irq_data_get_irq_chip_data(d);
1152
	unsigned int irq_mask = 1 << get_gpio_index(gpio);
1153
	u32 trigger = irqd_get_trigger_type(d);
1154
	unsigned long flags;
1155

1156
	spin_lock_irqsave(&bank->lock, flags);
1157 1158
	if (trigger)
		_set_gpio_triggering(bank, get_gpio_index(gpio), trigger);
1159 1160 1161 1162 1163 1164 1165

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

K
Kevin Hilman 已提交
1167
	_set_gpio_irqenable(bank, gpio, 1);
1168
	spin_unlock_irqrestore(&bank->lock, flags);
1169 1170
}

1171 1172
static struct irq_chip gpio_irq_chip = {
	.name		= "GPIO",
1173 1174 1175 1176 1177 1178
	.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,
1179 1180 1181 1182 1183 1184 1185 1186
};

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

#ifdef CONFIG_ARCH_OMAP1

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

1187
static void mpuio_ack_irq(struct irq_data *d)
1188 1189 1190 1191
{
	/* The ISR is reset automatically, so do nothing here. */
}

1192
static void mpuio_mask_irq(struct irq_data *d)
1193
{
1194 1195
	unsigned int gpio = OMAP_MPUIO(d->irq - IH_MPUIO_BASE);
	struct gpio_bank *bank = irq_data_get_irq_chip_data(d);
1196 1197 1198 1199

	_set_gpio_irqenable(bank, gpio, 0);
}

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

	_set_gpio_irqenable(bank, gpio, 1);
}

1208 1209
static struct irq_chip mpuio_irq_chip = {
	.name		= "MPUIO",
1210 1211 1212 1213
	.irq_ack	= mpuio_ack_irq,
	.irq_mask	= mpuio_mask_irq,
	.irq_unmask	= mpuio_unmask_irq,
	.irq_set_type	= gpio_irq_type,
D
David Brownell 已提交
1214 1215
#ifdef CONFIG_ARCH_OMAP16XX
	/* REVISIT: assuming only 16xx supports MPUIO wake events */
1216
	.irq_set_wake	= gpio_wake_enable,
D
David Brownell 已提交
1217
#endif
1218 1219
};

1220 1221 1222

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

D
David Brownell 已提交
1223 1224 1225 1226 1227

#ifdef CONFIG_ARCH_OMAP16XX

#include <linux/platform_device.h>

1228
static int omap_mpuio_suspend_noirq(struct device *dev)
D
David Brownell 已提交
1229
{
1230
	struct platform_device *pdev = to_platform_device(dev);
D
David Brownell 已提交
1231
	struct gpio_bank	*bank = platform_get_drvdata(pdev);
1232 1233
	void __iomem		*mask_reg = bank->base +
					OMAP_MPUIO_GPIO_MASKIT / bank->stride;
D
David Brownell 已提交
1234
	unsigned long		flags;
D
David Brownell 已提交
1235

D
David Brownell 已提交
1236
	spin_lock_irqsave(&bank->lock, flags);
D
David Brownell 已提交
1237 1238
	bank->saved_wakeup = __raw_readl(mask_reg);
	__raw_writel(0xffff & ~bank->suspend_wakeup, mask_reg);
D
David Brownell 已提交
1239
	spin_unlock_irqrestore(&bank->lock, flags);
D
David Brownell 已提交
1240 1241 1242 1243

	return 0;
}

1244
static int omap_mpuio_resume_noirq(struct device *dev)
D
David Brownell 已提交
1245
{
1246
	struct platform_device *pdev = to_platform_device(dev);
D
David Brownell 已提交
1247
	struct gpio_bank	*bank = platform_get_drvdata(pdev);
1248 1249
	void __iomem		*mask_reg = bank->base +
					OMAP_MPUIO_GPIO_MASKIT / bank->stride;
D
David Brownell 已提交
1250
	unsigned long		flags;
D
David Brownell 已提交
1251

D
David Brownell 已提交
1252
	spin_lock_irqsave(&bank->lock, flags);
D
David Brownell 已提交
1253
	__raw_writel(bank->saved_wakeup, mask_reg);
D
David Brownell 已提交
1254
	spin_unlock_irqrestore(&bank->lock, flags);
D
David Brownell 已提交
1255 1256 1257 1258

	return 0;
}

1259
static const struct dev_pm_ops omap_mpuio_dev_pm_ops = {
1260 1261 1262 1263
	.suspend_noirq = omap_mpuio_suspend_noirq,
	.resume_noirq = omap_mpuio_resume_noirq,
};

1264
/* use platform_driver for this. */
D
David Brownell 已提交
1265 1266 1267
static struct platform_driver omap_mpuio_driver = {
	.driver		= {
		.name	= "mpuio",
1268
		.pm	= &omap_mpuio_dev_pm_ops,
D
David Brownell 已提交
1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282
	},
};

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

D
David Brownell 已提交
1286 1287 1288 1289 1290 1291 1292 1293
	if (platform_driver_register(&omap_mpuio_driver) == 0)
		(void) platform_device_register(&omap_mpuio_device);
}

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

1294 1295 1296 1297 1298
#else

extern struct irq_chip mpuio_irq_chip;

#define bank_is_mpuio(bank)	0
D
David Brownell 已提交
1299
static inline void mpuio_init(void) {}
1300 1301 1302 1303

#endif

/*---------------------------------------------------------------------*/
1304

D
David Brownell 已提交
1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320
/* 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;
}

1321 1322 1323 1324 1325 1326
static int gpio_is_input(struct gpio_bank *bank, int mask)
{
	void __iomem *reg = bank->base;

	switch (bank->method) {
	case METHOD_MPUIO:
1327
		reg += OMAP_MPUIO_IO_CNTL / bank->stride;
1328 1329 1330 1331 1332 1333 1334
		break;
	case METHOD_GPIO_1510:
		reg += OMAP1510_GPIO_DIR_CONTROL;
		break;
	case METHOD_GPIO_1610:
		reg += OMAP1610_GPIO_DIRECTION;
		break;
1335 1336
	case METHOD_GPIO_7XX:
		reg += OMAP7XX_GPIO_DIR_CONTROL;
1337 1338 1339 1340
		break;
	case METHOD_GPIO_24XX:
		reg += OMAP24XX_GPIO_OE;
		break;
1341 1342 1343 1344 1345 1346
	case METHOD_GPIO_44XX:
		reg += OMAP4_GPIO_OE;
		break;
	default:
		WARN_ONCE(1, "gpio_is_input: incorrect OMAP GPIO method");
		return -EINVAL;
1347 1348 1349 1350
	}
	return __raw_readl(reg) & mask;
}

D
David Brownell 已提交
1351 1352
static int gpio_get(struct gpio_chip *chip, unsigned offset)
{
1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366
	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 已提交
1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381
}

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

1382 1383 1384 1385 1386 1387 1388
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);
1389 1390 1391 1392 1393 1394 1395

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

1396 1397 1398 1399 1400 1401 1402
	spin_lock_irqsave(&bank->lock, flags);
	_set_gpio_debounce(bank, offset, debounce);
	spin_unlock_irqrestore(&bank->lock, flags);

	return 0;
}

D
David Brownell 已提交
1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413
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);
}

1414 1415 1416 1417 1418 1419 1420 1421
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 已提交
1422 1423
/*---------------------------------------------------------------------*/

1424
static void __init omap_gpio_show_rev(struct gpio_bank *bank)
T
Tony Lindgren 已提交
1425 1426 1427
{
	u32 rev;

1428 1429
	if (cpu_is_omap16xx() && !(bank->method != METHOD_MPUIO))
		rev = __raw_readw(bank->base + OMAP1610_GPIO_REVISION);
T
Tony Lindgren 已提交
1430
	else if (cpu_is_omap24xx() || cpu_is_omap34xx())
1431
		rev = __raw_readl(bank->base + OMAP24XX_GPIO_REVISION);
T
Tony Lindgren 已提交
1432
	else if (cpu_is_omap44xx())
1433
		rev = __raw_readl(bank->base + OMAP4_GPIO_REVISION);
T
Tony Lindgren 已提交
1434 1435 1436 1437 1438 1439 1440
	else
		return;

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

1441 1442 1443 1444 1445
/* 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;

1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458
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 */
1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487
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))
1488 1489
			__raw_writew(0xffff, bank->base +
				OMAP_MPUIO_GPIO_MASKIT / bank->stride);
1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519
		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);
		}
	}
}

1520
static void __devinit omap_gpio_chip_init(struct gpio_bank *bank)
1521
{
1522
	int j;
1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546
	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;
1547
		gpio += bank->width;
1548
	}
1549
	bank->chip.ngpio = bank->width;
1550 1551 1552 1553

	gpiochip_add(&bank->chip);

	for (j = bank->virtual_irq_start;
1554
		     j < bank->virtual_irq_start + bank->width; j++) {
1555
		irq_set_lockdep_class(j, &gpio_lock_class);
T
Thomas Gleixner 已提交
1556
		irq_set_chip_data(j, bank);
1557
		if (bank_is_mpuio(bank))
T
Thomas Gleixner 已提交
1558
			irq_set_chip(j, &mpuio_irq_chip);
1559
		else
T
Thomas Gleixner 已提交
1560 1561
			irq_set_chip(j, &gpio_irq_chip);
		irq_set_handler(j, handle_simple_irq);
1562 1563
		set_irq_flags(j, IRQF_VALID);
	}
T
Thomas Gleixner 已提交
1564 1565
	irq_set_chained_handler(bank->irq, gpio_irq_handler);
	irq_set_handler_data(bank->irq, bank);
1566 1567
}

1568
static int __devinit omap_gpio_probe(struct platform_device *pdev)
1569
{
1570 1571 1572 1573
	static int gpio_init_done;
	struct omap_gpio_platform_data *pdata;
	struct resource *res;
	int id;
1574 1575
	struct gpio_bank *bank;

1576 1577
	if (!pdev->dev.platform_data)
		return -EINVAL;
1578

1579
	pdata = pdev->dev.platform_data;
1580

1581 1582
	if (!gpio_init_done) {
		int ret;
1583

1584 1585 1586
		ret = init_gpio_info(pdev);
		if (ret)
			return ret;
1587 1588
	}

1589 1590
	id = pdev->id;
	bank = &gpio_bank[id];
1591

1592 1593 1594 1595
	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;
1596
	}
1597

1598 1599 1600 1601 1602
	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;
1603
	bank->stride = pdata->bank_stride;
1604
	bank->width = pdata->bank_width;
T
Tony Lindgren 已提交
1605

1606
	spin_lock_init(&bank->lock);
T
Tony Lindgren 已提交
1607

1608 1609 1610 1611 1612 1613
	/* 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;
	}
1614

1615 1616 1617 1618
	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;
1619 1620
	}

1621 1622 1623 1624 1625
	pm_runtime_enable(bank->dev);
	pm_runtime_get_sync(bank->dev);

	omap_gpio_mod_init(bank, id);
	omap_gpio_chip_init(bank);
1626
	omap_gpio_show_rev(bank);
T
Tony Lindgren 已提交
1627

1628 1629 1630
	if (!gpio_init_done)
		gpio_init_done = 1;

1631 1632 1633
	return 0;
}

1634
#if defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP2PLUS)
1635
static int omap_gpio_suspend(void)
1636 1637 1638
{
	int i;

1639
	if (!cpu_class_is_omap2() && !cpu_is_omap16xx())
1640 1641 1642 1643 1644 1645 1646
		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 已提交
1647
		unsigned long flags;
1648 1649

		switch (bank->method) {
1650
#ifdef CONFIG_ARCH_OMAP16XX
1651 1652 1653 1654 1655
		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;
1656
#endif
1657
#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
1658
		case METHOD_GPIO_24XX:
1659
			wake_status = bank->base + OMAP24XX_GPIO_WAKE_EN;
1660 1661 1662
			wake_clear = bank->base + OMAP24XX_GPIO_CLEARWKUENA;
			wake_set = bank->base + OMAP24XX_GPIO_SETWKUENA;
			break;
1663 1664
#endif
#ifdef CONFIG_ARCH_OMAP4
1665
		case METHOD_GPIO_44XX:
1666 1667 1668 1669
			wake_status = bank->base + OMAP4_GPIO_IRQWAKEN0;
			wake_clear = bank->base + OMAP4_GPIO_IRQWAKEN0;
			wake_set = bank->base + OMAP4_GPIO_IRQWAKEN0;
			break;
1670
#endif
1671 1672 1673 1674
		default:
			continue;
		}

D
David Brownell 已提交
1675
		spin_lock_irqsave(&bank->lock, flags);
1676 1677 1678
		bank->saved_wakeup = __raw_readl(wake_status);
		__raw_writel(0xffffffff, wake_clear);
		__raw_writel(bank->suspend_wakeup, wake_set);
D
David Brownell 已提交
1679
		spin_unlock_irqrestore(&bank->lock, flags);
1680 1681 1682 1683 1684
	}

	return 0;
}

1685
static void omap_gpio_resume(void)
1686 1687 1688
{
	int i;

1689
	if (!cpu_class_is_omap2() && !cpu_is_omap16xx())
1690
		return;
1691 1692 1693 1694 1695

	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 已提交
1696
		unsigned long flags;
1697 1698

		switch (bank->method) {
1699
#ifdef CONFIG_ARCH_OMAP16XX
1700 1701 1702 1703
		case METHOD_GPIO_1610:
			wake_clear = bank->base + OMAP1610_GPIO_CLEAR_WAKEUPENA;
			wake_set = bank->base + OMAP1610_GPIO_SET_WAKEUPENA;
			break;
1704
#endif
1705
#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
1706
		case METHOD_GPIO_24XX:
1707 1708
			wake_clear = bank->base + OMAP24XX_GPIO_CLEARWKUENA;
			wake_set = bank->base + OMAP24XX_GPIO_SETWKUENA;
1709
			break;
1710 1711
#endif
#ifdef CONFIG_ARCH_OMAP4
1712
		case METHOD_GPIO_44XX:
1713 1714 1715
			wake_clear = bank->base + OMAP4_GPIO_IRQWAKEN0;
			wake_set = bank->base + OMAP4_GPIO_IRQWAKEN0;
			break;
1716
#endif
1717 1718 1719 1720
		default:
			continue;
		}

D
David Brownell 已提交
1721
		spin_lock_irqsave(&bank->lock, flags);
1722 1723
		__raw_writel(0xffffffff, wake_clear);
		__raw_writel(bank->saved_wakeup, wake_set);
D
David Brownell 已提交
1724
		spin_unlock_irqrestore(&bank->lock, flags);
1725 1726 1727
	}
}

1728
static struct syscore_ops omap_gpio_syscore_ops = {
1729 1730 1731 1732
	.suspend	= omap_gpio_suspend,
	.resume		= omap_gpio_resume,
};

1733 1734
#endif

1735
#ifdef CONFIG_ARCH_OMAP2PLUS
1736 1737 1738

static int workaround_enabled;

1739
void omap2_gpio_prepare_for_idle(int off_mode)
1740 1741
{
	int i, c = 0;
T
Tero Kristo 已提交
1742
	int min = 0;
1743

T
Tero Kristo 已提交
1744 1745
	if (cpu_is_omap34xx())
		min = 1;
1746

T
Tero Kristo 已提交
1747
	for (i = min; i < gpio_bank_count; i++) {
1748
		struct gpio_bank *bank = &gpio_bank[i];
1749
		u32 l1 = 0, l2 = 0;
1750
		int j;
1751

1752
		for (j = 0; j < hweight_long(bank->dbck_enable_mask); j++)
1753 1754
			clk_disable(bank->dbck);

1755
		if (!off_mode)
1756 1757 1758 1759 1760
			continue;

		/* If going to OFF, remove triggering for all
		 * non-wakeup GPIOs.  Otherwise spurious IRQs will be
		 * generated.  See OMAP2420 Errata item 1.101. */
1761 1762
		if (!(bank->enabled_non_wakeup_gpios))
			continue;
1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781

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

1782 1783 1784 1785
		bank->saved_fallingdetect = l1;
		bank->saved_risingdetect = l2;
		l1 &= ~bank->enabled_non_wakeup_gpios;
		l2 &= ~bank->enabled_non_wakeup_gpios;
1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798

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

1799 1800 1801 1802 1803 1804 1805 1806 1807
		c++;
	}
	if (!c) {
		workaround_enabled = 0;
		return;
	}
	workaround_enabled = 1;
}

1808
void omap2_gpio_resume_after_idle(void)
1809 1810
{
	int i;
T
Tero Kristo 已提交
1811
	int min = 0;
1812

T
Tero Kristo 已提交
1813 1814 1815
	if (cpu_is_omap34xx())
		min = 1;
	for (i = min; i < gpio_bank_count; i++) {
1816
		struct gpio_bank *bank = &gpio_bank[i];
1817
		u32 l = 0, gen, gen0, gen1;
1818
		int j;
1819

1820
		for (j = 0; j < hweight_long(bank->dbck_enable_mask); j++)
1821 1822
			clk_enable(bank->dbck);

1823 1824 1825
		if (!workaround_enabled)
			continue;

1826 1827
		if (!(bank->enabled_non_wakeup_gpios))
			continue;
1828 1829 1830

		if (cpu_is_omap24xx() || cpu_is_omap34xx()) {
			__raw_writel(bank->saved_fallingdetect,
1831
				 bank->base + OMAP24XX_GPIO_FALLINGDETECT);
1832
			__raw_writel(bank->saved_risingdetect,
1833
				 bank->base + OMAP24XX_GPIO_RISINGDETECT);
1834 1835 1836 1837 1838
			l = __raw_readl(bank->base + OMAP24XX_GPIO_DATAIN);
		}

		if (cpu_is_omap44xx()) {
			__raw_writel(bank->saved_fallingdetect,
1839
				 bank->base + OMAP4_GPIO_FALLINGDETECT);
1840
			__raw_writel(bank->saved_risingdetect,
1841
				 bank->base + OMAP4_GPIO_RISINGDETECT);
1842 1843 1844
			l = __raw_readl(bank->base + OMAP4_GPIO_DATAIN);
		}

1845 1846 1847 1848 1849
		/* 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 已提交
1850
		l &= bank->enabled_non_wakeup_gpios;
1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868

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

1871
			if (cpu_is_omap24xx() || cpu_is_omap34xx()) {
1872 1873 1874 1875
				old0 = __raw_readl(bank->base +
					OMAP24XX_GPIO_LEVELDETECT0);
				old1 = __raw_readl(bank->base +
					OMAP24XX_GPIO_LEVELDETECT1);
1876
				__raw_writel(old0 | gen, bank->base +
1877
					OMAP24XX_GPIO_LEVELDETECT0);
1878
				__raw_writel(old1 | gen, bank->base +
1879
					OMAP24XX_GPIO_LEVELDETECT1);
1880
				__raw_writel(old0, bank->base +
1881
					OMAP24XX_GPIO_LEVELDETECT0);
1882
				__raw_writel(old1, bank->base +
1883 1884 1885 1886 1887
					OMAP24XX_GPIO_LEVELDETECT1);
			}

			if (cpu_is_omap44xx()) {
				old0 = __raw_readl(bank->base +
1888
						OMAP4_GPIO_LEVELDETECT0);
1889
				old1 = __raw_readl(bank->base +
1890
						OMAP4_GPIO_LEVELDETECT1);
1891
				__raw_writel(old0 | l, bank->base +
1892
						OMAP4_GPIO_LEVELDETECT0);
1893
				__raw_writel(old1 | l, bank->base +
1894
						OMAP4_GPIO_LEVELDETECT1);
1895
				__raw_writel(old0, bank->base +
1896
						OMAP4_GPIO_LEVELDETECT0);
1897
				__raw_writel(old1, bank->base +
1898
						OMAP4_GPIO_LEVELDETECT1);
1899
			}
1900 1901 1902 1903 1904
		}
	}

}

1905 1906
#endif

1907
#ifdef CONFIG_ARCH_OMAP3
1908 1909 1910 1911 1912 1913 1914 1915 1916 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
/* 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

1970 1971 1972 1973 1974 1975 1976
static struct platform_driver omap_gpio_driver = {
	.probe		= omap_gpio_probe,
	.driver		= {
		.name	= "omap_gpio",
	},
};

1977
/*
1978 1979 1980
 * gpio driver register needs to be done before
 * machine_init functions access gpio APIs.
 * Hence omap_gpio_drv_reg() is a postcore_initcall.
1981
 */
1982
static int __init omap_gpio_drv_reg(void)
1983
{
1984
	return platform_driver_register(&omap_gpio_driver);
1985
}
1986
postcore_initcall(omap_gpio_drv_reg);
1987

1988 1989
static int __init omap_gpio_sysinit(void)
{
D
David Brownell 已提交
1990 1991
	mpuio_init();

1992
#if defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP2PLUS)
1993 1994
	if (cpu_is_omap16xx() || cpu_class_is_omap2())
		register_syscore_ops(&omap_gpio_syscore_ops);
1995 1996
#endif

1997
	return 0;
1998 1999 2000
}

arch_initcall(omap_gpio_sysinit);