gpio-omap.c 45.2 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 61

	void (*set_dataout)(struct gpio_bank *bank, int gpio, int enable);

	struct omap_gpio_reg_offs *regs;
62 63
};

64
#ifdef CONFIG_ARCH_OMAP3
65 66 67 68 69 70 71 72 73 74 75
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;
76 77
};

78
static struct omap3_gpio_regs gpio_context[OMAP34XX_NR_GPIOS];
79 80
#endif

81 82 83 84 85
/*
 * TODO: Cleanup gpio_bank usage as it is having information
 * related to all instances of the device
 */
static struct gpio_bank *gpio_bank;
86

87 88
/* TODO: Analyze removing gpio_bank_count usage from driver code */
int gpio_bank_count;
89

90 91 92
#define GPIO_INDEX(bank, gpio) (gpio % bank->width)
#define GPIO_BIT(bank, gpio) (1 << GPIO_INDEX(bank, gpio))

93 94 95 96
static inline int gpio_valid(int gpio)
{
	if (gpio < 0)
		return -1;
97
	if (cpu_class_is_omap1() && OMAP_GPIO_IS_MPUIO(gpio)) {
98
		if (gpio >= OMAP_MAX_GPIO_LINES + 16)
99 100 101
			return -1;
		return 0;
	}
102
	if (cpu_is_omap15xx() && gpio < 16)
103 104 105
		return 0;
	if ((cpu_is_omap16xx()) && gpio < 64)
		return 0;
106
	if (cpu_is_omap7xx() && gpio < 192)
107
		return 0;
108 109 110
	if (cpu_is_omap2420() && gpio < 128)
		return 0;
	if (cpu_is_omap2430() && gpio < 160)
111
		return 0;
112
	if ((cpu_is_omap34xx() || cpu_is_omap44xx()) && gpio < 192)
113
		return 0;
114 115 116 117 118
	return -1;
}

static int check_gpio(int gpio)
{
R
Roel Kluin 已提交
119
	if (unlikely(gpio_valid(gpio) < 0)) {
120 121 122 123 124 125 126 127 128
		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)
{
129
	void __iomem *reg = bank->base;
130 131
	u32 l;

132
	reg += bank->regs->direction;
133 134 135 136 137 138 139 140
	l = __raw_readl(reg);
	if (is_input)
		l |= 1 << gpio;
	else
		l &= ~(1 << gpio);
	__raw_writel(l, reg);
}

141 142 143

/* set data out value using dedicate set/clear register */
static void _set_gpio_dataout_reg(struct gpio_bank *bank, int gpio, int enable)
144
{
145
	void __iomem *reg = bank->base;
146
	u32 l = GPIO_BIT(bank, gpio);
147

148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167
	if (enable)
		reg += bank->regs->set_dataout;
	else
		reg += bank->regs->clr_dataout;

	__raw_writel(l, reg);
}

/* set data out value using mask register */
static void _set_gpio_dataout_mask(struct gpio_bank *bank, int gpio, int enable)
{
	void __iomem *reg = bank->base + bank->regs->dataout;
	u32 gpio_bit = GPIO_BIT(bank, gpio);
	u32 l;

	l = __raw_readl(reg);
	if (enable)
		l |= gpio_bit;
	else
		l &= ~gpio_bit;
168 169 170
	__raw_writel(l, reg);
}

171
static int _get_gpio_datain(struct gpio_bank *bank, int gpio)
172
{
173
	void __iomem *reg = bank->base + bank->regs->datain;
174 175

	if (check_gpio(gpio) < 0)
176
		return -EINVAL;
177 178

	return (__raw_readl(reg) & GPIO_BIT(bank, gpio)) != 0;
179 180
}

181 182
static int _get_gpio_dataout(struct gpio_bank *bank, int gpio)
{
183
	void __iomem *reg = bank->base + bank->regs->dataout;
184 185 186 187

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

188
	return (__raw_readl(reg) & GPIO_BIT(bank, gpio)) != 0;
189 190
}

191 192 193 194 195 196 197 198
#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)

199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214
/**
 * _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;

215 216 217
	if (!bank->dbck_flag)
		return;

218 219 220 221 222 223 224
	if (debounce < 32)
		debounce = 0x01;
	else if (debounce > 7936)
		debounce = 0xff;
	else
		debounce = (debounce / 0x1f) - 1;

225
	l = GPIO_BIT(bank, gpio);
226

227
	if (bank->method == METHOD_GPIO_44XX)
228 229 230 231 232 233 234
		reg += OMAP4_GPIO_DEBOUNCINGTIME;
	else
		reg += OMAP24XX_GPIO_DEBOUNCE_VAL;

	__raw_writel(debounce, reg);

	reg = bank->base;
235
	if (bank->method == METHOD_GPIO_44XX)
236 237 238 239 240 241 242 243
		reg += OMAP4_GPIO_DEBOUNCENABLE;
	else
		reg += OMAP24XX_GPIO_DEBOUNCE_EN;

	val = __raw_readl(reg);

	if (debounce) {
		val |= l;
244
		clk_enable(bank->dbck);
245 246
	} else {
		val &= ~l;
247
		clk_disable(bank->dbck);
248
	}
249
	bank->dbck_enable_mask = val;
250 251 252 253

	__raw_writel(val, reg);
}

254
#ifdef CONFIG_ARCH_OMAP2PLUS
255 256
static inline void set_24xx_gpio_triggering(struct gpio_bank *bank, int gpio,
						int trigger)
257
{
258
	void __iomem *base = bank->base;
259 260
	u32 gpio_bit = 1 << gpio;

261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279
	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);
	}
280
	if (likely(!(bank->non_wakeup_gpios & gpio_bit))) {
281
		if (cpu_is_omap44xx()) {
282 283
			MOD_REG_BIT(OMAP4_GPIO_IRQWAKEN0, gpio_bit,
				trigger != 0);
284
		} else {
285 286 287 288 289
			/*
			 * GPIO wakeup request can only be generated on edge
			 * transitions
			 */
			if (trigger & IRQ_TYPE_EDGE_BOTH)
290
				__raw_writel(1 << gpio, bank->base
291
					+ OMAP24XX_GPIO_SETWKUENA);
292 293
			else
				__raw_writel(1 << gpio, bank->base
294
					+ OMAP24XX_GPIO_CLEARWKUENA);
295
		}
T
Tero Kristo 已提交
296 297 298
	}
	/* This part needs to be executed always for OMAP34xx */
	if (cpu_is_omap34xx() || (bank->non_wakeup_gpios & gpio_bit)) {
299 300 301 302 303 304 305
		/*
		 * 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)
306 307 308 309
			bank->enabled_non_wakeup_gpios |= gpio_bit;
		else
			bank->enabled_non_wakeup_gpios &= ~gpio_bit;
	}
310

311 312 313 314 315 316 317 318 319
	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);
	}
320
}
321
#endif
322

323
#ifdef CONFIG_ARCH_OMAP1
324 325 326 327 328 329 330 331 332 333 334
/*
 * 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:
335
		reg += OMAP_MPUIO_GPIO_INT_EDGE / bank->stride;
336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358
		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);
}
359
#endif
360

361 362 363 364
static int _set_gpio_triggering(struct gpio_bank *bank, int gpio, int trigger)
{
	void __iomem *reg = bank->base;
	u32 l = 0;
365 366

	switch (bank->method) {
367
#ifdef CONFIG_ARCH_OMAP1
368
	case METHOD_MPUIO:
369
		reg += OMAP_MPUIO_GPIO_INT_EDGE / bank->stride;
370
		l = __raw_readl(reg);
371
		if ((trigger & IRQ_TYPE_SENSE_MASK) == IRQ_TYPE_EDGE_BOTH)
372
			bank->toggle_mask |= 1 << gpio;
373
		if (trigger & IRQ_TYPE_EDGE_RISING)
374
			l |= 1 << gpio;
375
		else if (trigger & IRQ_TYPE_EDGE_FALLING)
376
			l &= ~(1 << gpio);
377 378
		else
			goto bad;
379
		break;
380 381
#endif
#ifdef CONFIG_ARCH_OMAP15XX
382 383 384
	case METHOD_GPIO_1510:
		reg += OMAP1510_GPIO_INT_CONTROL;
		l = __raw_readl(reg);
385
		if ((trigger & IRQ_TYPE_SENSE_MASK) == IRQ_TYPE_EDGE_BOTH)
386
			bank->toggle_mask |= 1 << gpio;
387
		if (trigger & IRQ_TYPE_EDGE_RISING)
388
			l |= 1 << gpio;
389
		else if (trigger & IRQ_TYPE_EDGE_FALLING)
390
			l &= ~(1 << gpio);
391 392
		else
			goto bad;
393
		break;
394
#endif
395
#ifdef CONFIG_ARCH_OMAP16XX
396 397 398 399 400 401 402 403
	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));
404
		if (trigger & IRQ_TYPE_EDGE_RISING)
405
			l |= 2 << (gpio << 1);
406
		if (trigger & IRQ_TYPE_EDGE_FALLING)
407
			l |= 1 << (gpio << 1);
408 409 410 411 412
		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);
413
		break;
414
#endif
415
#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
416 417
	case METHOD_GPIO_7XX:
		reg += OMAP7XX_GPIO_INT_CONTROL;
418
		l = __raw_readl(reg);
419
		if ((trigger & IRQ_TYPE_SENSE_MASK) == IRQ_TYPE_EDGE_BOTH)
420
			bank->toggle_mask |= 1 << gpio;
421 422 423 424 425 426 427 428
		if (trigger & IRQ_TYPE_EDGE_RISING)
			l |= 1 << gpio;
		else if (trigger & IRQ_TYPE_EDGE_FALLING)
			l &= ~(1 << gpio);
		else
			goto bad;
		break;
#endif
429
#ifdef CONFIG_ARCH_OMAP2PLUS
430
	case METHOD_GPIO_24XX:
431
	case METHOD_GPIO_44XX:
432
		set_24xx_gpio_triggering(bank, gpio, trigger);
433
		return 0;
434
#endif
435
	default:
436
		goto bad;
437
	}
438 439 440 441
	__raw_writel(l, reg);
	return 0;
bad:
	return -EINVAL;
442 443
}

444
static int gpio_irq_type(struct irq_data *d, unsigned type)
445 446
{
	struct gpio_bank *bank;
447 448
	unsigned gpio;
	int retval;
D
David Brownell 已提交
449
	unsigned long flags;
450

451 452
	if (!cpu_class_is_omap2() && d->irq > IH_MPUIO_BASE)
		gpio = OMAP_MPUIO(d->irq - IH_MPUIO_BASE);
453
	else
454
		gpio = d->irq - IH_GPIO_BASE;
455 456

	if (check_gpio(gpio) < 0)
457 458
		return -EINVAL;

459
	if (type & ~IRQ_TYPE_SENSE_MASK)
460
		return -EINVAL;
461 462

	/* OMAP1 allows only only edge triggering */
463
	if (!cpu_class_is_omap2()
464
			&& (type & (IRQ_TYPE_LEVEL_LOW|IRQ_TYPE_LEVEL_HIGH)))
465 466
		return -EINVAL;

467
	bank = irq_data_get_irq_chip_data(d);
D
David Brownell 已提交
468
	spin_lock_irqsave(&bank->lock, flags);
469
	retval = _set_gpio_triggering(bank, GPIO_INDEX(bank, gpio), type);
D
David Brownell 已提交
470
	spin_unlock_irqrestore(&bank->lock, flags);
471 472

	if (type & (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH))
T
Thomas Gleixner 已提交
473
		__irq_set_handler_locked(d->irq, handle_level_irq);
474
	else if (type & (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING))
T
Thomas Gleixner 已提交
475
		__irq_set_handler_locked(d->irq, handle_edge_irq);
476

477
	return retval;
478 479 480 481
}

static void _clear_gpio_irqbank(struct gpio_bank *bank, int gpio_mask)
{
482
	void __iomem *reg = bank->base;
483 484

	switch (bank->method) {
485
#ifdef CONFIG_ARCH_OMAP15XX
486 487 488
	case METHOD_GPIO_1510:
		reg += OMAP1510_GPIO_INT_STATUS;
		break;
489 490
#endif
#ifdef CONFIG_ARCH_OMAP16XX
491 492 493
	case METHOD_GPIO_1610:
		reg += OMAP1610_GPIO_IRQSTATUS1;
		break;
494
#endif
495
#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
496 497
	case METHOD_GPIO_7XX:
		reg += OMAP7XX_GPIO_INT_STATUS;
498 499
		break;
#endif
500
#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
501 502 503
	case METHOD_GPIO_24XX:
		reg += OMAP24XX_GPIO_IRQSTATUS1;
		break;
504 505
#endif
#if defined(CONFIG_ARCH_OMAP4)
506
	case METHOD_GPIO_44XX:
507 508
		reg += OMAP4_GPIO_IRQSTATUS0;
		break;
509
#endif
510
	default:
511
		WARN_ON(1);
512 513 514
		return;
	}
	__raw_writel(gpio_mask, reg);
515 516

	/* Workaround for clearing DSP GPIO interrupts to allow retention */
517 518 519 520 521
	if (cpu_is_omap24xx() || cpu_is_omap34xx())
		reg = bank->base + OMAP24XX_GPIO_IRQSTATUS2;
	else if (cpu_is_omap44xx())
		reg = bank->base + OMAP4_GPIO_IRQSTATUS1;

522
	if (cpu_is_omap24xx() || cpu_is_omap34xx() || cpu_is_omap44xx())
523 524 525 526
		__raw_writel(gpio_mask, reg);

	/* Flush posted write for the irq status to avoid spurious interrupts */
	__raw_readl(reg);
527 528 529 530
}

static inline void _clear_gpio_irqstatus(struct gpio_bank *bank, int gpio)
{
531
	_clear_gpio_irqbank(bank, GPIO_BIT(bank, gpio));
532 533
}

534 535 536
static u32 _get_gpio_irqbank_mask(struct gpio_bank *bank)
{
	void __iomem *reg = bank->base;
537 538
	int inv = 0;
	u32 l;
539
	u32 mask = (1 << bank->width) - 1;
540 541

	switch (bank->method) {
542
#ifdef CONFIG_ARCH_OMAP1
543
	case METHOD_MPUIO:
544
		reg += OMAP_MPUIO_GPIO_MASKIT / bank->stride;
545
		inv = 1;
546
		break;
547 548
#endif
#ifdef CONFIG_ARCH_OMAP15XX
549 550
	case METHOD_GPIO_1510:
		reg += OMAP1510_GPIO_INT_MASK;
551
		inv = 1;
552
		break;
553 554
#endif
#ifdef CONFIG_ARCH_OMAP16XX
555 556 557
	case METHOD_GPIO_1610:
		reg += OMAP1610_GPIO_IRQENABLE1;
		break;
558
#endif
559
#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
560 561
	case METHOD_GPIO_7XX:
		reg += OMAP7XX_GPIO_INT_MASK;
562 563 564
		inv = 1;
		break;
#endif
565
#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
566 567 568
	case METHOD_GPIO_24XX:
		reg += OMAP24XX_GPIO_IRQENABLE1;
		break;
569 570
#endif
#if defined(CONFIG_ARCH_OMAP4)
571
	case METHOD_GPIO_44XX:
572 573
		reg += OMAP4_GPIO_IRQSTATUSSET0;
		break;
574
#endif
575
	default:
576
		WARN_ON(1);
577 578 579
		return 0;
	}

580 581 582 583 584
	l = __raw_readl(reg);
	if (inv)
		l = ~l;
	l &= mask;
	return l;
585 586
}

587 588
static void _enable_gpio_irqbank(struct gpio_bank *bank, int gpio_mask, int enable)
{
589
	void __iomem *reg = bank->base;
590 591 592
	u32 l;

	switch (bank->method) {
593
#ifdef CONFIG_ARCH_OMAP1
594
	case METHOD_MPUIO:
595
		reg += OMAP_MPUIO_GPIO_MASKIT / bank->stride;
596 597 598 599 600 601
		l = __raw_readl(reg);
		if (enable)
			l &= ~(gpio_mask);
		else
			l |= gpio_mask;
		break;
602 603
#endif
#ifdef CONFIG_ARCH_OMAP15XX
604 605 606 607 608 609 610 611
	case METHOD_GPIO_1510:
		reg += OMAP1510_GPIO_INT_MASK;
		l = __raw_readl(reg);
		if (enable)
			l &= ~(gpio_mask);
		else
			l |= gpio_mask;
		break;
612 613
#endif
#ifdef CONFIG_ARCH_OMAP16XX
614 615 616 617 618 619 620
	case METHOD_GPIO_1610:
		if (enable)
			reg += OMAP1610_GPIO_SET_IRQENABLE1;
		else
			reg += OMAP1610_GPIO_CLEAR_IRQENABLE1;
		l = gpio_mask;
		break;
621
#endif
622
#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
623 624
	case METHOD_GPIO_7XX:
		reg += OMAP7XX_GPIO_INT_MASK;
625 626 627 628 629 630 631
		l = __raw_readl(reg);
		if (enable)
			l &= ~(gpio_mask);
		else
			l |= gpio_mask;
		break;
#endif
632
#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
633 634 635 636 637 638 639
	case METHOD_GPIO_24XX:
		if (enable)
			reg += OMAP24XX_GPIO_SETIRQENABLE1;
		else
			reg += OMAP24XX_GPIO_CLEARIRQENABLE1;
		l = gpio_mask;
		break;
640 641
#endif
#ifdef CONFIG_ARCH_OMAP4
642
	case METHOD_GPIO_44XX:
643 644 645 646 647 648
		if (enable)
			reg += OMAP4_GPIO_IRQSTATUSSET0;
		else
			reg += OMAP4_GPIO_IRQSTATUSCLR0;
		l = gpio_mask;
		break;
649
#endif
650
	default:
651
		WARN_ON(1);
652 653 654 655 656 657 658
		return;
	}
	__raw_writel(l, reg);
}

static inline void _set_gpio_irqenable(struct gpio_bank *bank, int gpio, int enable)
{
659
	_enable_gpio_irqbank(bank, GPIO_BIT(bank, gpio), enable);
660 661
}

662 663 664 665 666 667 668 669 670 671
/*
 * 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)
{
672
	unsigned long uninitialized_var(flags);
D
David Brownell 已提交
673

674
	switch (bank->method) {
675
#ifdef CONFIG_ARCH_OMAP16XX
D
David Brownell 已提交
676
	case METHOD_MPUIO:
677
	case METHOD_GPIO_1610:
D
David Brownell 已提交
678
		spin_lock_irqsave(&bank->lock, flags);
679
		if (enable)
680
			bank->suspend_wakeup |= (1 << gpio);
681
		else
682
			bank->suspend_wakeup &= ~(1 << gpio);
D
David Brownell 已提交
683
		spin_unlock_irqrestore(&bank->lock, flags);
684
		return 0;
685
#endif
686
#ifdef CONFIG_ARCH_OMAP2PLUS
687
	case METHOD_GPIO_24XX:
688
	case METHOD_GPIO_44XX:
D
David Brownell 已提交
689 690 691
		if (bank->non_wakeup_gpios & (1 << gpio)) {
			printk(KERN_ERR "Unable to modify wakeup on "
					"non-wakeup GPIO%d\n",
692
			       (bank - gpio_bank) * bank->width + gpio);
D
David Brownell 已提交
693 694
			return -EINVAL;
		}
D
David Brownell 已提交
695
		spin_lock_irqsave(&bank->lock, flags);
696
		if (enable)
697
			bank->suspend_wakeup |= (1 << gpio);
698
		else
699
			bank->suspend_wakeup &= ~(1 << gpio);
D
David Brownell 已提交
700
		spin_unlock_irqrestore(&bank->lock, flags);
701 702
		return 0;
#endif
703 704 705 706 707 708 709
	default:
		printk(KERN_ERR "Can't enable GPIO wakeup for method %i\n",
		       bank->method);
		return -EINVAL;
	}
}

710 711
static void _reset_gpio(struct gpio_bank *bank, int gpio)
{
712
	_set_gpio_direction(bank, GPIO_INDEX(bank, gpio), 1);
713 714
	_set_gpio_irqenable(bank, gpio, 0);
	_clear_gpio_irqstatus(bank, gpio);
715
	_set_gpio_triggering(bank, GPIO_INDEX(bank, gpio), IRQ_TYPE_NONE);
716 717
}

718
/* Use disable_irq_wake() and enable_irq_wake() functions from drivers */
719
static int gpio_wake_enable(struct irq_data *d, unsigned int enable)
720
{
721
	unsigned int gpio = d->irq - IH_GPIO_BASE;
722 723 724 725 726
	struct gpio_bank *bank;
	int retval;

	if (check_gpio(gpio) < 0)
		return -ENODEV;
727
	bank = irq_data_get_irq_chip_data(d);
728
	retval = _set_gpio_wakeup(bank, GPIO_INDEX(bank, gpio), enable);
729 730 731 732

	return retval;
}

733
static int omap_gpio_request(struct gpio_chip *chip, unsigned offset)
734
{
735
	struct gpio_bank *bank = container_of(chip, struct gpio_bank, chip);
D
David Brownell 已提交
736
	unsigned long flags;
D
David Brownell 已提交
737

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

740 741 742
	/* Set trigger to none. You need to enable the desired trigger with
	 * request_irq() or set_irq_type().
	 */
743
	_set_gpio_triggering(bank, offset, IRQ_TYPE_NONE);
744

745
#ifdef CONFIG_ARCH_OMAP15XX
746
	if (bank->method == METHOD_GPIO_1510) {
747
		void __iomem *reg;
748

749
		/* Claim the pin for MPU */
750
		reg = bank->base + OMAP1510_GPIO_PIN_CONTROL;
751
		__raw_writel(__raw_readl(reg) | (1 << offset), reg);
752 753
	}
#endif
C
Charulatha V 已提交
754 755
	if (!cpu_class_is_omap1()) {
		if (!bank->mod_usage) {
756
			void __iomem *reg = bank->base;
C
Charulatha V 已提交
757
			u32 ctrl;
758 759 760 761 762 763

			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 已提交
764
			/* Module is enabled, clocks are not gated */
765 766
			ctrl &= 0xFFFFFFFE;
			__raw_writel(ctrl, reg);
C
Charulatha V 已提交
767 768 769
		}
		bank->mod_usage |= 1 << offset;
	}
D
David Brownell 已提交
770
	spin_unlock_irqrestore(&bank->lock, flags);
771 772 773 774

	return 0;
}

775
static void omap_gpio_free(struct gpio_chip *chip, unsigned offset)
776
{
777
	struct gpio_bank *bank = container_of(chip, struct gpio_bank, chip);
D
David Brownell 已提交
778
	unsigned long flags;
779

D
David Brownell 已提交
780
	spin_lock_irqsave(&bank->lock, flags);
781 782 783 784
#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;
785
		__raw_writel(1 << offset, reg);
786 787
	}
#endif
788 789
#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
	if (bank->method == METHOD_GPIO_24XX) {
790 791
		/* Disable wake-up during idle for dynamic tick */
		void __iomem *reg = bank->base + OMAP24XX_GPIO_CLEARWKUENA;
792
		__raw_writel(1 << offset, reg);
793
	}
794 795 796 797 798 799 800
#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);
	}
801
#endif
C
Charulatha V 已提交
802 803 804
	if (!cpu_class_is_omap1()) {
		bank->mod_usage &= ~(1 << offset);
		if (!bank->mod_usage) {
805
			void __iomem *reg = bank->base;
C
Charulatha V 已提交
806
			u32 ctrl;
807 808 809 810 811 812

			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 已提交
813 814
			/* Module is disabled, clocks are gated */
			ctrl |= 1;
815
			__raw_writel(ctrl, reg);
C
Charulatha V 已提交
816 817
		}
	}
818
	_reset_gpio(bank, bank->chip.base + offset);
D
David Brownell 已提交
819
	spin_unlock_irqrestore(&bank->lock, flags);
820 821 822 823 824 825 826 827 828 829 830
}

/*
 * 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.
 */
831
static void gpio_irq_handler(unsigned int irq, struct irq_desc *desc)
832
{
833
	void __iomem *isr_reg = NULL;
834
	u32 isr;
835
	unsigned int gpio_irq, gpio_index;
836
	struct gpio_bank *bank;
837 838
	u32 retrigger = 0;
	int unmasked = 0;
839
	struct irq_chip *chip = irq_desc_get_chip(desc);
840

841
	chained_irq_enter(chip, desc);
842

T
Thomas Gleixner 已提交
843
	bank = irq_get_handler_data(irq);
844
#ifdef CONFIG_ARCH_OMAP1
845
	if (bank->method == METHOD_MPUIO)
846 847
		isr_reg = bank->base +
				OMAP_MPUIO_GPIO_INT / bank->stride;
848
#endif
849
#ifdef CONFIG_ARCH_OMAP15XX
850 851 852 853 854 855 856
	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
857
#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
858 859
	if (bank->method == METHOD_GPIO_7XX)
		isr_reg = bank->base + OMAP7XX_GPIO_INT_STATUS;
860
#endif
861
#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
862 863
	if (bank->method == METHOD_GPIO_24XX)
		isr_reg = bank->base + OMAP24XX_GPIO_IRQSTATUS1;
864 865
#endif
#if defined(CONFIG_ARCH_OMAP4)
866
	if (bank->method == METHOD_GPIO_44XX)
867
		isr_reg = bank->base + OMAP4_GPIO_IRQSTATUS0;
868
#endif
869 870 871 872

	if (WARN_ON(!isr_reg))
		goto exit;

873
	while(1) {
874
		u32 isr_saved, level_mask = 0;
875
		u32 enabled;
876

877 878
		enabled = _get_gpio_irqbank_mask(bank);
		isr_saved = isr = __raw_readl(isr_reg) & enabled;
879 880 881 882

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

883
		if (cpu_class_is_omap2()) {
884
			level_mask = bank->level_mask & enabled;
885
		}
886 887 888 889 890 891 892 893 894 895

		/* 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 */
896 897
		if (!level_mask && !unmasked) {
			unmasked = 1;
898
			chained_irq_exit(chip, desc);
899
		}
900

901 902
		isr |= retrigger;
		retrigger = 0;
903 904 905 906 907
		if (!isr)
			break;

		gpio_irq = bank->virtual_irq_start;
		for (; isr != 0; isr >>= 1, gpio_irq++) {
908
			gpio_index = GPIO_INDEX(bank, irq_to_gpio(gpio_irq));
909

910 911
			if (!(isr & 1))
				continue;
912

913 914 915 916 917 918 919 920 921 922 923 924
#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

925
			generic_handle_irq(gpio_irq);
926
		}
927
	}
928 929 930 931
	/* 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 */
932
exit:
933
	if (!unmasked)
934
		chained_irq_exit(chip, desc);
935 936
}

937
static void gpio_irq_shutdown(struct irq_data *d)
938
{
939 940
	unsigned int gpio = d->irq - IH_GPIO_BASE;
	struct gpio_bank *bank = irq_data_get_irq_chip_data(d);
941
	unsigned long flags;
942

943
	spin_lock_irqsave(&bank->lock, flags);
944
	_reset_gpio(bank, gpio);
945
	spin_unlock_irqrestore(&bank->lock, flags);
946 947
}

948
static void gpio_ack_irq(struct irq_data *d)
949
{
950 951
	unsigned int gpio = d->irq - IH_GPIO_BASE;
	struct gpio_bank *bank = irq_data_get_irq_chip_data(d);
952 953 954 955

	_clear_gpio_irqstatus(bank, gpio);
}

956
static void gpio_mask_irq(struct irq_data *d)
957
{
958 959
	unsigned int gpio = d->irq - IH_GPIO_BASE;
	struct gpio_bank *bank = irq_data_get_irq_chip_data(d);
960
	unsigned long flags;
961

962
	spin_lock_irqsave(&bank->lock, flags);
963
	_set_gpio_irqenable(bank, gpio, 0);
964
	_set_gpio_triggering(bank, GPIO_INDEX(bank, gpio), IRQ_TYPE_NONE);
965
	spin_unlock_irqrestore(&bank->lock, flags);
966 967
}

968
static void gpio_unmask_irq(struct irq_data *d)
969
{
970 971
	unsigned int gpio = d->irq - IH_GPIO_BASE;
	struct gpio_bank *bank = irq_data_get_irq_chip_data(d);
972
	unsigned int irq_mask = GPIO_BIT(bank, gpio);
973
	u32 trigger = irqd_get_trigger_type(d);
974
	unsigned long flags;
975

976
	spin_lock_irqsave(&bank->lock, flags);
977
	if (trigger)
978
		_set_gpio_triggering(bank, GPIO_INDEX(bank, gpio), trigger);
979 980 981 982 983 984 985

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

K
Kevin Hilman 已提交
987
	_set_gpio_irqenable(bank, gpio, 1);
988
	spin_unlock_irqrestore(&bank->lock, flags);
989 990
}

991 992
static struct irq_chip gpio_irq_chip = {
	.name		= "GPIO",
993 994 995 996 997 998
	.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,
999 1000 1001 1002 1003 1004 1005 1006
};

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

#ifdef CONFIG_ARCH_OMAP1

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

1007
static void mpuio_ack_irq(struct irq_data *d)
1008 1009 1010 1011
{
	/* The ISR is reset automatically, so do nothing here. */
}

1012
static void mpuio_mask_irq(struct irq_data *d)
1013
{
1014 1015
	unsigned int gpio = OMAP_MPUIO(d->irq - IH_MPUIO_BASE);
	struct gpio_bank *bank = irq_data_get_irq_chip_data(d);
1016 1017 1018 1019

	_set_gpio_irqenable(bank, gpio, 0);
}

1020
static void mpuio_unmask_irq(struct irq_data *d)
1021
{
1022 1023
	unsigned int gpio = OMAP_MPUIO(d->irq - IH_MPUIO_BASE);
	struct gpio_bank *bank = irq_data_get_irq_chip_data(d);
1024 1025 1026 1027

	_set_gpio_irqenable(bank, gpio, 1);
}

1028 1029
static struct irq_chip mpuio_irq_chip = {
	.name		= "MPUIO",
1030 1031 1032 1033
	.irq_ack	= mpuio_ack_irq,
	.irq_mask	= mpuio_mask_irq,
	.irq_unmask	= mpuio_unmask_irq,
	.irq_set_type	= gpio_irq_type,
D
David Brownell 已提交
1034 1035
#ifdef CONFIG_ARCH_OMAP16XX
	/* REVISIT: assuming only 16xx supports MPUIO wake events */
1036
	.irq_set_wake	= gpio_wake_enable,
D
David Brownell 已提交
1037
#endif
1038 1039
};

1040 1041 1042

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

D
David Brownell 已提交
1043 1044 1045 1046 1047

#ifdef CONFIG_ARCH_OMAP16XX

#include <linux/platform_device.h>

1048
static int omap_mpuio_suspend_noirq(struct device *dev)
D
David Brownell 已提交
1049
{
1050
	struct platform_device *pdev = to_platform_device(dev);
D
David Brownell 已提交
1051
	struct gpio_bank	*bank = platform_get_drvdata(pdev);
1052 1053
	void __iomem		*mask_reg = bank->base +
					OMAP_MPUIO_GPIO_MASKIT / bank->stride;
D
David Brownell 已提交
1054
	unsigned long		flags;
D
David Brownell 已提交
1055

D
David Brownell 已提交
1056
	spin_lock_irqsave(&bank->lock, flags);
D
David Brownell 已提交
1057 1058
	bank->saved_wakeup = __raw_readl(mask_reg);
	__raw_writel(0xffff & ~bank->suspend_wakeup, mask_reg);
D
David Brownell 已提交
1059
	spin_unlock_irqrestore(&bank->lock, flags);
D
David Brownell 已提交
1060 1061 1062 1063

	return 0;
}

1064
static int omap_mpuio_resume_noirq(struct device *dev)
D
David Brownell 已提交
1065
{
1066
	struct platform_device *pdev = to_platform_device(dev);
D
David Brownell 已提交
1067
	struct gpio_bank	*bank = platform_get_drvdata(pdev);
1068 1069
	void __iomem		*mask_reg = bank->base +
					OMAP_MPUIO_GPIO_MASKIT / bank->stride;
D
David Brownell 已提交
1070
	unsigned long		flags;
D
David Brownell 已提交
1071

D
David Brownell 已提交
1072
	spin_lock_irqsave(&bank->lock, flags);
D
David Brownell 已提交
1073
	__raw_writel(bank->saved_wakeup, mask_reg);
D
David Brownell 已提交
1074
	spin_unlock_irqrestore(&bank->lock, flags);
D
David Brownell 已提交
1075 1076 1077 1078

	return 0;
}

1079
static const struct dev_pm_ops omap_mpuio_dev_pm_ops = {
1080 1081 1082 1083
	.suspend_noirq = omap_mpuio_suspend_noirq,
	.resume_noirq = omap_mpuio_resume_noirq,
};

1084
/* use platform_driver for this. */
D
David Brownell 已提交
1085 1086 1087
static struct platform_driver omap_mpuio_driver = {
	.driver		= {
		.name	= "mpuio",
1088
		.pm	= &omap_mpuio_dev_pm_ops,
D
David Brownell 已提交
1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102
	},
};

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)
{
C
Charulatha V 已提交
1103
	struct gpio_bank *bank = &gpio_bank[0];
1104
	platform_set_drvdata(&omap_mpuio_device, bank);
1105

D
David Brownell 已提交
1106 1107 1108 1109 1110 1111 1112 1113
	if (platform_driver_register(&omap_mpuio_driver) == 0)
		(void) platform_device_register(&omap_mpuio_device);
}

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

1114 1115 1116 1117 1118
#else

extern struct irq_chip mpuio_irq_chip;

#define bank_is_mpuio(bank)	0
D
David Brownell 已提交
1119
static inline void mpuio_init(void) {}
1120 1121 1122 1123

#endif

/*---------------------------------------------------------------------*/
1124

D
David Brownell 已提交
1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140
/* 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;
}

1141 1142
static int gpio_is_input(struct gpio_bank *bank, int mask)
{
1143
	void __iomem *reg = bank->base + bank->regs->direction;
1144 1145 1146 1147

	return __raw_readl(reg) & mask;
}

D
David Brownell 已提交
1148 1149
static int gpio_get(struct gpio_chip *chip, unsigned offset)
{
1150 1151 1152 1153 1154 1155
	struct gpio_bank *bank;
	void __iomem *reg;
	int gpio;
	u32 mask;

	gpio = chip->base + offset;
C
Charulatha V 已提交
1156
	bank = container_of(chip, struct gpio_bank, chip);
1157
	reg = bank->base;
1158
	mask = GPIO_BIT(bank, gpio);
1159 1160 1161 1162 1163

	if (gpio_is_input(bank, mask))
		return _get_gpio_datain(bank, gpio);
	else
		return _get_gpio_dataout(bank, gpio);
D
David Brownell 已提交
1164 1165 1166 1167 1168 1169 1170 1171 1172
}

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);
1173
	bank->set_dataout(bank, offset, value);
D
David Brownell 已提交
1174 1175 1176 1177 1178
	_set_gpio_direction(bank, offset, 0);
	spin_unlock_irqrestore(&bank->lock, flags);
	return 0;
}

1179 1180 1181 1182 1183 1184 1185
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);
1186 1187 1188 1189 1190 1191 1192

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

1193 1194 1195 1196 1197 1198 1199
	spin_lock_irqsave(&bank->lock, flags);
	_set_gpio_debounce(bank, offset, debounce);
	spin_unlock_irqrestore(&bank->lock, flags);

	return 0;
}

D
David Brownell 已提交
1200 1201 1202 1203 1204 1205 1206
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);
1207
	bank->set_dataout(bank, offset, value);
D
David Brownell 已提交
1208 1209 1210
	spin_unlock_irqrestore(&bank->lock, flags);
}

1211 1212 1213 1214 1215 1216 1217 1218
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 已提交
1219 1220
/*---------------------------------------------------------------------*/

1221
static void __init omap_gpio_show_rev(struct gpio_bank *bank)
T
Tony Lindgren 已提交
1222 1223 1224
{
	u32 rev;

1225 1226
	if (cpu_is_omap16xx() && !(bank->method != METHOD_MPUIO))
		rev = __raw_readw(bank->base + OMAP1610_GPIO_REVISION);
T
Tony Lindgren 已提交
1227
	else if (cpu_is_omap24xx() || cpu_is_omap34xx())
1228
		rev = __raw_readl(bank->base + OMAP24XX_GPIO_REVISION);
T
Tony Lindgren 已提交
1229
	else if (cpu_is_omap44xx())
1230
		rev = __raw_readl(bank->base + OMAP4_GPIO_REVISION);
T
Tony Lindgren 已提交
1231 1232 1233 1234 1235 1236 1237
	else
		return;

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

1238 1239 1240 1241 1242
/* 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;

1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255
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 */
1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284
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))
1285 1286
			__raw_writew(0xffff, bank->base +
				OMAP_MPUIO_GPIO_MASKIT / bank->stride);
1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316
		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);
		}
	}
}

1317
static void __devinit omap_gpio_chip_init(struct gpio_bank *bank)
1318
{
1319
	int j;
1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343
	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;
1344
		gpio += bank->width;
1345
	}
1346
	bank->chip.ngpio = bank->width;
1347 1348 1349 1350

	gpiochip_add(&bank->chip);

	for (j = bank->virtual_irq_start;
1351
		     j < bank->virtual_irq_start + bank->width; j++) {
1352
		irq_set_lockdep_class(j, &gpio_lock_class);
T
Thomas Gleixner 已提交
1353
		irq_set_chip_data(j, bank);
1354
		if (bank_is_mpuio(bank))
T
Thomas Gleixner 已提交
1355
			irq_set_chip(j, &mpuio_irq_chip);
1356
		else
T
Thomas Gleixner 已提交
1357 1358
			irq_set_chip(j, &gpio_irq_chip);
		irq_set_handler(j, handle_simple_irq);
1359 1360
		set_irq_flags(j, IRQF_VALID);
	}
T
Thomas Gleixner 已提交
1361 1362
	irq_set_chained_handler(bank->irq, gpio_irq_handler);
	irq_set_handler_data(bank->irq, bank);
1363 1364
}

1365
static int __devinit omap_gpio_probe(struct platform_device *pdev)
1366
{
1367 1368 1369 1370
	static int gpio_init_done;
	struct omap_gpio_platform_data *pdata;
	struct resource *res;
	int id;
1371 1372
	struct gpio_bank *bank;

1373 1374
	if (!pdev->dev.platform_data)
		return -EINVAL;
1375

1376
	pdata = pdev->dev.platform_data;
1377

1378 1379
	if (!gpio_init_done) {
		int ret;
1380

1381 1382 1383
		ret = init_gpio_info(pdev);
		if (ret)
			return ret;
1384 1385
	}

1386 1387
	id = pdev->id;
	bank = &gpio_bank[id];
1388

1389 1390 1391 1392
	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;
1393
	}
1394

1395 1396 1397 1398 1399
	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;
1400
	bank->stride = pdata->bank_stride;
1401
	bank->width = pdata->bank_width;
T
Tony Lindgren 已提交
1402

1403 1404 1405 1406 1407 1408 1409
	bank->regs = pdata->regs;

	if (bank->regs->set_dataout && bank->regs->clr_dataout)
		bank->set_dataout = _set_gpio_dataout_reg;
	else
		bank->set_dataout = _set_gpio_dataout_mask;

1410
	spin_lock_init(&bank->lock);
T
Tony Lindgren 已提交
1411

1412 1413 1414 1415 1416 1417
	/* 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;
	}
1418

1419 1420 1421 1422
	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;
1423 1424
	}

1425 1426 1427 1428 1429
	pm_runtime_enable(bank->dev);
	pm_runtime_get_sync(bank->dev);

	omap_gpio_mod_init(bank, id);
	omap_gpio_chip_init(bank);
1430
	omap_gpio_show_rev(bank);
T
Tony Lindgren 已提交
1431

1432 1433 1434
	if (!gpio_init_done)
		gpio_init_done = 1;

1435 1436 1437
	return 0;
}

1438
#if defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP2PLUS)
1439
static int omap_gpio_suspend(void)
1440 1441 1442
{
	int i;

1443
	if (!cpu_class_is_omap2() && !cpu_is_omap16xx())
1444 1445 1446 1447 1448 1449 1450
		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 已提交
1451
		unsigned long flags;
1452 1453

		switch (bank->method) {
1454
#ifdef CONFIG_ARCH_OMAP16XX
1455 1456 1457 1458 1459
		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;
1460
#endif
1461
#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
1462
		case METHOD_GPIO_24XX:
1463
			wake_status = bank->base + OMAP24XX_GPIO_WAKE_EN;
1464 1465 1466
			wake_clear = bank->base + OMAP24XX_GPIO_CLEARWKUENA;
			wake_set = bank->base + OMAP24XX_GPIO_SETWKUENA;
			break;
1467 1468
#endif
#ifdef CONFIG_ARCH_OMAP4
1469
		case METHOD_GPIO_44XX:
1470 1471 1472 1473
			wake_status = bank->base + OMAP4_GPIO_IRQWAKEN0;
			wake_clear = bank->base + OMAP4_GPIO_IRQWAKEN0;
			wake_set = bank->base + OMAP4_GPIO_IRQWAKEN0;
			break;
1474
#endif
1475 1476 1477 1478
		default:
			continue;
		}

D
David Brownell 已提交
1479
		spin_lock_irqsave(&bank->lock, flags);
1480 1481 1482
		bank->saved_wakeup = __raw_readl(wake_status);
		__raw_writel(0xffffffff, wake_clear);
		__raw_writel(bank->suspend_wakeup, wake_set);
D
David Brownell 已提交
1483
		spin_unlock_irqrestore(&bank->lock, flags);
1484 1485 1486 1487 1488
	}

	return 0;
}

1489
static void omap_gpio_resume(void)
1490 1491 1492
{
	int i;

1493
	if (!cpu_class_is_omap2() && !cpu_is_omap16xx())
1494
		return;
1495 1496 1497 1498 1499

	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 已提交
1500
		unsigned long flags;
1501 1502

		switch (bank->method) {
1503
#ifdef CONFIG_ARCH_OMAP16XX
1504 1505 1506 1507
		case METHOD_GPIO_1610:
			wake_clear = bank->base + OMAP1610_GPIO_CLEAR_WAKEUPENA;
			wake_set = bank->base + OMAP1610_GPIO_SET_WAKEUPENA;
			break;
1508
#endif
1509
#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
1510
		case METHOD_GPIO_24XX:
1511 1512
			wake_clear = bank->base + OMAP24XX_GPIO_CLEARWKUENA;
			wake_set = bank->base + OMAP24XX_GPIO_SETWKUENA;
1513
			break;
1514 1515
#endif
#ifdef CONFIG_ARCH_OMAP4
1516
		case METHOD_GPIO_44XX:
1517 1518 1519
			wake_clear = bank->base + OMAP4_GPIO_IRQWAKEN0;
			wake_set = bank->base + OMAP4_GPIO_IRQWAKEN0;
			break;
1520
#endif
1521 1522 1523 1524
		default:
			continue;
		}

D
David Brownell 已提交
1525
		spin_lock_irqsave(&bank->lock, flags);
1526 1527
		__raw_writel(0xffffffff, wake_clear);
		__raw_writel(bank->saved_wakeup, wake_set);
D
David Brownell 已提交
1528
		spin_unlock_irqrestore(&bank->lock, flags);
1529 1530 1531
	}
}

1532
static struct syscore_ops omap_gpio_syscore_ops = {
1533 1534 1535 1536
	.suspend	= omap_gpio_suspend,
	.resume		= omap_gpio_resume,
};

1537 1538
#endif

1539
#ifdef CONFIG_ARCH_OMAP2PLUS
1540 1541 1542

static int workaround_enabled;

1543
void omap2_gpio_prepare_for_idle(int off_mode)
1544 1545
{
	int i, c = 0;
T
Tero Kristo 已提交
1546
	int min = 0;
1547

T
Tero Kristo 已提交
1548 1549
	if (cpu_is_omap34xx())
		min = 1;
1550

T
Tero Kristo 已提交
1551
	for (i = min; i < gpio_bank_count; i++) {
1552
		struct gpio_bank *bank = &gpio_bank[i];
1553
		u32 l1 = 0, l2 = 0;
1554
		int j;
1555

1556
		for (j = 0; j < hweight_long(bank->dbck_enable_mask); j++)
1557 1558
			clk_disable(bank->dbck);

1559
		if (!off_mode)
1560 1561 1562 1563 1564
			continue;

		/* If going to OFF, remove triggering for all
		 * non-wakeup GPIOs.  Otherwise spurious IRQs will be
		 * generated.  See OMAP2420 Errata item 1.101. */
1565 1566
		if (!(bank->enabled_non_wakeup_gpios))
			continue;
1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585

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

1586 1587 1588 1589
		bank->saved_fallingdetect = l1;
		bank->saved_risingdetect = l2;
		l1 &= ~bank->enabled_non_wakeup_gpios;
		l2 &= ~bank->enabled_non_wakeup_gpios;
1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602

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

1603 1604 1605 1606 1607 1608 1609 1610 1611
		c++;
	}
	if (!c) {
		workaround_enabled = 0;
		return;
	}
	workaround_enabled = 1;
}

1612
void omap2_gpio_resume_after_idle(void)
1613 1614
{
	int i;
T
Tero Kristo 已提交
1615
	int min = 0;
1616

T
Tero Kristo 已提交
1617 1618 1619
	if (cpu_is_omap34xx())
		min = 1;
	for (i = min; i < gpio_bank_count; i++) {
1620
		struct gpio_bank *bank = &gpio_bank[i];
1621
		u32 l = 0, gen, gen0, gen1;
1622
		int j;
1623

1624
		for (j = 0; j < hweight_long(bank->dbck_enable_mask); j++)
1625 1626
			clk_enable(bank->dbck);

1627 1628 1629
		if (!workaround_enabled)
			continue;

1630 1631
		if (!(bank->enabled_non_wakeup_gpios))
			continue;
1632 1633 1634

		if (cpu_is_omap24xx() || cpu_is_omap34xx()) {
			__raw_writel(bank->saved_fallingdetect,
1635
				 bank->base + OMAP24XX_GPIO_FALLINGDETECT);
1636
			__raw_writel(bank->saved_risingdetect,
1637
				 bank->base + OMAP24XX_GPIO_RISINGDETECT);
1638 1639 1640 1641 1642
			l = __raw_readl(bank->base + OMAP24XX_GPIO_DATAIN);
		}

		if (cpu_is_omap44xx()) {
			__raw_writel(bank->saved_fallingdetect,
1643
				 bank->base + OMAP4_GPIO_FALLINGDETECT);
1644
			__raw_writel(bank->saved_risingdetect,
1645
				 bank->base + OMAP4_GPIO_RISINGDETECT);
1646 1647 1648
			l = __raw_readl(bank->base + OMAP4_GPIO_DATAIN);
		}

1649 1650 1651 1652 1653
		/* 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 已提交
1654
		l &= bank->enabled_non_wakeup_gpios;
1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672

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

1675
			if (cpu_is_omap24xx() || cpu_is_omap34xx()) {
1676 1677 1678 1679
				old0 = __raw_readl(bank->base +
					OMAP24XX_GPIO_LEVELDETECT0);
				old1 = __raw_readl(bank->base +
					OMAP24XX_GPIO_LEVELDETECT1);
1680
				__raw_writel(old0 | gen, bank->base +
1681
					OMAP24XX_GPIO_LEVELDETECT0);
1682
				__raw_writel(old1 | gen, bank->base +
1683
					OMAP24XX_GPIO_LEVELDETECT1);
1684
				__raw_writel(old0, bank->base +
1685
					OMAP24XX_GPIO_LEVELDETECT0);
1686
				__raw_writel(old1, bank->base +
1687 1688 1689 1690 1691
					OMAP24XX_GPIO_LEVELDETECT1);
			}

			if (cpu_is_omap44xx()) {
				old0 = __raw_readl(bank->base +
1692
						OMAP4_GPIO_LEVELDETECT0);
1693
				old1 = __raw_readl(bank->base +
1694
						OMAP4_GPIO_LEVELDETECT1);
1695
				__raw_writel(old0 | l, bank->base +
1696
						OMAP4_GPIO_LEVELDETECT0);
1697
				__raw_writel(old1 | l, bank->base +
1698
						OMAP4_GPIO_LEVELDETECT1);
1699
				__raw_writel(old0, bank->base +
1700
						OMAP4_GPIO_LEVELDETECT0);
1701
				__raw_writel(old1, bank->base +
1702
						OMAP4_GPIO_LEVELDETECT1);
1703
			}
1704 1705 1706 1707 1708
		}
	}

}

1709 1710
#endif

1711
#ifdef CONFIG_ARCH_OMAP3
1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773
/* 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

1774 1775 1776 1777 1778 1779 1780
static struct platform_driver omap_gpio_driver = {
	.probe		= omap_gpio_probe,
	.driver		= {
		.name	= "omap_gpio",
	},
};

1781
/*
1782 1783 1784
 * gpio driver register needs to be done before
 * machine_init functions access gpio APIs.
 * Hence omap_gpio_drv_reg() is a postcore_initcall.
1785
 */
1786
static int __init omap_gpio_drv_reg(void)
1787
{
1788
	return platform_driver_register(&omap_gpio_driver);
1789
}
1790
postcore_initcall(omap_gpio_drv_reg);
1791

1792 1793
static int __init omap_gpio_sysinit(void)
{
D
David Brownell 已提交
1794 1795
	mpuio_init();

1796
#if defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP2PLUS)
1797 1798
	if (cpu_is_omap16xx() || cpu_class_is_omap2())
		register_syscore_ops(&omap_gpio_syscore_ops);
1799 1800
#endif

1801
	return 0;
1802 1803 1804
}

arch_initcall(omap_gpio_sysinit);