gpio-omap.c 35.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
#include <linux/pm.h>
25

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

32 33
#define OFF_MODE	1

34 35
static LIST_HEAD(omap_gpio_list);

36 37 38 39 40 41 42 43 44 45 46 47 48
struct gpio_regs {
	u32 irqenable1;
	u32 irqenable2;
	u32 wake_en;
	u32 ctrl;
	u32 oe;
	u32 leveldetect0;
	u32 leveldetect1;
	u32 risingdetect;
	u32 fallingdetect;
	u32 dataout;
};

49
struct gpio_bank {
50
	struct list_head node;
T
Tony Lindgren 已提交
51
	unsigned long pbase;
52
	void __iomem *base;
53 54
	u16 irq;
	u16 virtual_irq_start;
55 56
	u32 suspend_wakeup;
	u32 saved_wakeup;
57 58
	u32 non_wakeup_gpios;
	u32 enabled_non_wakeup_gpios;
59
	struct gpio_regs context;
60 61 62
	u32 saved_datain;
	u32 saved_fallingdetect;
	u32 saved_risingdetect;
63
	u32 level_mask;
64
	u32 toggle_mask;
65
	spinlock_t lock;
D
David Brownell 已提交
66
	struct gpio_chip chip;
67
	struct clk *dbck;
C
Charulatha V 已提交
68
	u32 mod_usage;
69
	u32 dbck_enable_mask;
70
	struct device *dev;
71
	bool is_mpuio;
72
	bool dbck_flag;
73
	bool loses_context;
74
	int stride;
75
	u32 width;
76
	int context_loss_count;
77
	u16 id;
78 79
	int power_mode;
	bool workaround_enabled;
80 81

	void (*set_dataout)(struct gpio_bank *bank, int gpio, int enable);
82
	int (*get_context_loss_count)(struct device *dev);
83 84

	struct omap_gpio_reg_offs *regs;
85 86
};

87 88
#define GPIO_INDEX(bank, gpio) (gpio % bank->width)
#define GPIO_BIT(bank, gpio) (1 << GPIO_INDEX(bank, gpio))
89
#define GPIO_MOD_CTRL_BIT	BIT(0)
90 91 92

static void _set_gpio_direction(struct gpio_bank *bank, int gpio, int is_input)
{
93
	void __iomem *reg = bank->base;
94 95
	u32 l;

96
	reg += bank->regs->direction;
97 98 99 100 101 102 103 104
	l = __raw_readl(reg);
	if (is_input)
		l |= 1 << gpio;
	else
		l &= ~(1 << gpio);
	__raw_writel(l, reg);
}

105 106 107

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

112 113 114 115
	if (enable)
		reg += bank->regs->set_dataout;
	else
		reg += bank->regs->clr_dataout;
116 117 118 119

	__raw_writel(l, reg);
}

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

127 128 129 130 131
	l = __raw_readl(reg);
	if (enable)
		l |= gpio_bit;
	else
		l &= ~gpio_bit;
132 133 134
	__raw_writel(l, reg);
}

135 136
static int _get_gpio_datain(struct gpio_bank *bank, int gpio)
{
137
	void __iomem *reg = bank->base + bank->regs->datain;
138

139
	return (__raw_readl(reg) & GPIO_BIT(bank, gpio)) != 0;
140
}
141 142 143

static int _get_gpio_dataout(struct gpio_bank *bank, int gpio)
{
144
	void __iomem *reg = bank->base + bank->regs->dataout;
145

146
	return (__raw_readl(reg) & GPIO_BIT(bank, gpio)) != 0;
147 148
}

149 150 151 152 153 154 155 156 157 158 159
static inline void _gpio_rmw(void __iomem *base, u32 reg, u32 mask, bool set)
{
	int l = __raw_readl(base + reg);

	if (set) 
		l |= mask;
	else
		l &= ~mask;

	__raw_writel(l, base + reg);
}
160

161 162 163 164 165 166 167 168 169 170 171 172
/**
 * _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)
{
173
	void __iomem		*reg;
174 175 176
	u32			val;
	u32			l;

177 178 179
	if (!bank->dbck_flag)
		return;

180 181 182 183 184 185 186
	if (debounce < 32)
		debounce = 0x01;
	else if (debounce > 7936)
		debounce = 0xff;
	else
		debounce = (debounce / 0x1f) - 1;

187
	l = GPIO_BIT(bank, gpio);
188

189
	reg = bank->base + bank->regs->debounce;
190 191
	__raw_writel(debounce, reg);

192
	reg = bank->base + bank->regs->debounce_en;
193 194 195 196
	val = __raw_readl(reg);

	if (debounce) {
		val |= l;
197
		clk_enable(bank->dbck);
198 199
	} else {
		val &= ~l;
200
		clk_disable(bank->dbck);
201
	}
202
	bank->dbck_enable_mask = val;
203 204 205 206

	__raw_writel(val, reg);
}

207
static inline void set_gpio_trigger(struct gpio_bank *bank, int gpio,
208
						int trigger)
209
{
210
	void __iomem *base = bank->base;
211 212
	u32 gpio_bit = 1 << gpio;

213 214 215 216 217 218 219 220 221 222 223 224
	_gpio_rmw(base, bank->regs->leveldetect0, gpio_bit,
		  trigger & IRQ_TYPE_LEVEL_LOW);
	_gpio_rmw(base, bank->regs->leveldetect1, gpio_bit,
		  trigger & IRQ_TYPE_LEVEL_HIGH);
	_gpio_rmw(base, bank->regs->risingdetect, gpio_bit,
		  trigger & IRQ_TYPE_EDGE_RISING);
	_gpio_rmw(base, bank->regs->fallingdetect, gpio_bit,
		  trigger & IRQ_TYPE_EDGE_FALLING);

	if (likely(!(bank->non_wakeup_gpios & gpio_bit)))
		_gpio_rmw(base, bank->regs->wkup_en, gpio_bit, trigger != 0);

225
	/* This part needs to be executed always for OMAP{34xx, 44xx} */
226 227 228 229 230 231 232
	if (!bank->regs->irqctrl) {
		/* On omap24xx proceed only when valid GPIO bit is set */
		if (bank->non_wakeup_gpios) {
			if (!(bank->non_wakeup_gpios & gpio_bit))
				goto exit;
		}

233 234 235 236 237 238 239
		/*
		 * 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)
240 241 242 243
			bank->enabled_non_wakeup_gpios |= gpio_bit;
		else
			bank->enabled_non_wakeup_gpios &= ~gpio_bit;
	}
244

245
exit:
246 247 248
	bank->level_mask =
		__raw_readl(bank->base + bank->regs->leveldetect0) |
		__raw_readl(bank->base + bank->regs->leveldetect1);
249 250
}

251
#ifdef CONFIG_ARCH_OMAP1
252 253 254 255 256 257 258 259 260
/*
 * 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;

261
	if (!bank->regs->irqctrl)
262
		return;
263 264

	reg += bank->regs->irqctrl;
265 266 267 268 269 270 271 272 273

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

	__raw_writel(l, reg);
}
274 275
#else
static void _toggle_gpio_edge_triggering(struct gpio_bank *bank, int gpio) {}
276
#endif
277

278 279 280
static int _set_gpio_triggering(struct gpio_bank *bank, int gpio, int trigger)
{
	void __iomem *reg = bank->base;
281
	void __iomem *base = bank->base;
282
	u32 l = 0;
283

284 285 286 287 288
	if (bank->regs->leveldetect0 && bank->regs->wkup_en) {
		set_gpio_trigger(bank, gpio, trigger);
	} else if (bank->regs->irqctrl) {
		reg += bank->regs->irqctrl;

289
		l = __raw_readl(reg);
290
		if ((trigger & IRQ_TYPE_SENSE_MASK) == IRQ_TYPE_EDGE_BOTH)
291
			bank->toggle_mask |= 1 << gpio;
292
		if (trigger & IRQ_TYPE_EDGE_RISING)
293
			l |= 1 << gpio;
294
		else if (trigger & IRQ_TYPE_EDGE_FALLING)
295
			l &= ~(1 << gpio);
296
		else
297 298 299 300
			return -EINVAL;

		__raw_writel(l, reg);
	} else if (bank->regs->edgectrl1) {
301
		if (gpio & 0x08)
302
			reg += bank->regs->edgectrl2;
303
		else
304 305
			reg += bank->regs->edgectrl1;

306 307 308
		gpio &= 0x07;
		l = __raw_readl(reg);
		l &= ~(3 << (gpio << 1));
309
		if (trigger & IRQ_TYPE_EDGE_RISING)
310
			l |= 2 << (gpio << 1);
311
		if (trigger & IRQ_TYPE_EDGE_FALLING)
312
			l |= 1 << (gpio << 1);
313 314 315 316

		/* Enable wake-up during idle for dynamic tick */
		_gpio_rmw(base, bank->regs->wkup_en, 1 << gpio, trigger);
		__raw_writel(l, reg);
317
	}
318
	return 0;
319 320
}

321
static int gpio_irq_type(struct irq_data *d, unsigned type)
322 323
{
	struct gpio_bank *bank;
324 325
	unsigned gpio;
	int retval;
D
David Brownell 已提交
326
	unsigned long flags;
327

328 329
	if (!cpu_class_is_omap2() && d->irq > IH_MPUIO_BASE)
		gpio = OMAP_MPUIO(d->irq - IH_MPUIO_BASE);
330
	else
331
		gpio = d->irq - IH_GPIO_BASE;
332

333
	if (type & ~IRQ_TYPE_SENSE_MASK)
334
		return -EINVAL;
335

336 337 338 339
	bank = irq_data_get_irq_chip_data(d);

	if (!bank->regs->leveldetect0 &&
		(type & (IRQ_TYPE_LEVEL_LOW|IRQ_TYPE_LEVEL_HIGH)))
340 341
		return -EINVAL;

D
David Brownell 已提交
342
	spin_lock_irqsave(&bank->lock, flags);
343
	retval = _set_gpio_triggering(bank, GPIO_INDEX(bank, gpio), type);
D
David Brownell 已提交
344
	spin_unlock_irqrestore(&bank->lock, flags);
345 346

	if (type & (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH))
T
Thomas Gleixner 已提交
347
		__irq_set_handler_locked(d->irq, handle_level_irq);
348
	else if (type & (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING))
T
Thomas Gleixner 已提交
349
		__irq_set_handler_locked(d->irq, handle_edge_irq);
350

351
	return retval;
352 353 354 355
}

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

358
	reg += bank->regs->irqstatus;
359
	__raw_writel(gpio_mask, reg);
360 361

	/* Workaround for clearing DSP GPIO interrupts to allow retention */
362 363
	if (bank->regs->irqstatus2) {
		reg = bank->base + bank->regs->irqstatus2;
364
		__raw_writel(gpio_mask, reg);
365
	}
366 367 368

	/* Flush posted write for the irq status to avoid spurious interrupts */
	__raw_readl(reg);
369 370 371 372
}

static inline void _clear_gpio_irqstatus(struct gpio_bank *bank, int gpio)
{
373
	_clear_gpio_irqbank(bank, GPIO_BIT(bank, gpio));
374 375
}

376 377 378
static u32 _get_gpio_irqbank_mask(struct gpio_bank *bank)
{
	void __iomem *reg = bank->base;
379
	u32 l;
380
	u32 mask = (1 << bank->width) - 1;
381

382
	reg += bank->regs->irqenable;
383
	l = __raw_readl(reg);
384
	if (bank->regs->irqenable_inv)
385 386 387
		l = ~l;
	l &= mask;
	return l;
388 389
}

390
static void _enable_gpio_irqbank(struct gpio_bank *bank, int gpio_mask)
391
{
392
	void __iomem *reg = bank->base;
393 394
	u32 l;

395 396 397 398 399
	if (bank->regs->set_irqenable) {
		reg += bank->regs->set_irqenable;
		l = gpio_mask;
	} else {
		reg += bank->regs->irqenable;
400
		l = __raw_readl(reg);
401 402
		if (bank->regs->irqenable_inv)
			l &= ~gpio_mask;
403 404
		else
			l |= gpio_mask;
405 406 407 408 409 410 411 412 413 414 415 416
	}

	__raw_writel(l, reg);
}

static void _disable_gpio_irqbank(struct gpio_bank *bank, int gpio_mask)
{
	void __iomem *reg = bank->base;
	u32 l;

	if (bank->regs->clr_irqenable) {
		reg += bank->regs->clr_irqenable;
417
		l = gpio_mask;
418 419
	} else {
		reg += bank->regs->irqenable;
420
		l = __raw_readl(reg);
421
		if (bank->regs->irqenable_inv)
422
			l |= gpio_mask;
423
		else
424
			l &= ~gpio_mask;
425
	}
426

427 428 429 430 431
	__raw_writel(l, reg);
}

static inline void _set_gpio_irqenable(struct gpio_bank *bank, int gpio, int enable)
{
432
	_enable_gpio_irqbank(bank, GPIO_BIT(bank, gpio));
433 434
}

435 436 437 438 439 440 441 442 443 444
/*
 * 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)
{
445 446
	u32 gpio_bit = GPIO_BIT(bank, gpio);
	unsigned long flags;
D
David Brownell 已提交
447

448 449 450
	if (bank->non_wakeup_gpios & gpio_bit) {
		dev_err(bank->dev, 
			"Unable to modify wakeup on non-wakeup GPIO%d\n", gpio);
451 452
		return -EINVAL;
	}
453 454 455 456 457 458 459 460 461 462

	spin_lock_irqsave(&bank->lock, flags);
	if (enable)
		bank->suspend_wakeup |= gpio_bit;
	else
		bank->suspend_wakeup &= ~gpio_bit;

	spin_unlock_irqrestore(&bank->lock, flags);

	return 0;
463 464
}

465 466
static void _reset_gpio(struct gpio_bank *bank, int gpio)
{
467
	_set_gpio_direction(bank, GPIO_INDEX(bank, gpio), 1);
468 469
	_set_gpio_irqenable(bank, gpio, 0);
	_clear_gpio_irqstatus(bank, gpio);
470
	_set_gpio_triggering(bank, GPIO_INDEX(bank, gpio), IRQ_TYPE_NONE);
471 472
}

473
/* Use disable_irq_wake() and enable_irq_wake() functions from drivers */
474
static int gpio_wake_enable(struct irq_data *d, unsigned int enable)
475
{
476
	unsigned int gpio = d->irq - IH_GPIO_BASE;
477 478 479
	struct gpio_bank *bank;
	int retval;

480
	bank = irq_data_get_irq_chip_data(d);
481
	retval = _set_gpio_wakeup(bank, gpio, enable);
482 483 484 485

	return retval;
}

486
static int omap_gpio_request(struct gpio_chip *chip, unsigned offset)
487
{
488
	struct gpio_bank *bank = container_of(chip, struct gpio_bank, chip);
D
David Brownell 已提交
489
	unsigned long flags;
D
David Brownell 已提交
490

491 492 493 494 495 496
	/*
	 * If this is the first gpio_request for the bank,
	 * enable the bank module.
	 */
	if (!bank->mod_usage)
		pm_runtime_get_sync(bank->dev);
497

498
	spin_lock_irqsave(&bank->lock, flags);
499 500 501
	/* Set trigger to none. You need to enable the desired trigger with
	 * request_irq() or set_irq_type().
	 */
502
	_set_gpio_triggering(bank, offset, IRQ_TYPE_NONE);
503

504 505
	if (bank->regs->pinctrl) {
		void __iomem *reg = bank->base + bank->regs->pinctrl;
506

507
		/* Claim the pin for MPU */
508
		__raw_writel(__raw_readl(reg) | (1 << offset), reg);
509
	}
510

511 512 513 514 515 516 517 518
	if (bank->regs->ctrl && !bank->mod_usage) {
		void __iomem *reg = bank->base + bank->regs->ctrl;
		u32 ctrl;

		ctrl = __raw_readl(reg);
		/* Module is enabled, clocks are not gated */
		ctrl &= ~GPIO_MOD_CTRL_BIT;
		__raw_writel(ctrl, reg);
C
Charulatha V 已提交
519
	}
520 521 522

	bank->mod_usage |= 1 << offset;

D
David Brownell 已提交
523
	spin_unlock_irqrestore(&bank->lock, flags);
524 525 526 527

	return 0;
}

528
static void omap_gpio_free(struct gpio_chip *chip, unsigned offset)
529
{
530
	struct gpio_bank *bank = container_of(chip, struct gpio_bank, chip);
531
	void __iomem *base = bank->base;
D
David Brownell 已提交
532
	unsigned long flags;
533

D
David Brownell 已提交
534
	spin_lock_irqsave(&bank->lock, flags);
535 536

	if (bank->regs->wkup_en)
537
		/* Disable wake-up during idle for dynamic tick */
538 539
		_gpio_rmw(base, bank->regs->wkup_en, 1 << offset, 0);

540 541 542 543 544 545 546 547 548 549
	bank->mod_usage &= ~(1 << offset);

	if (bank->regs->ctrl && !bank->mod_usage) {
		void __iomem *reg = bank->base + bank->regs->ctrl;
		u32 ctrl;

		ctrl = __raw_readl(reg);
		/* Module is disabled, clocks are gated */
		ctrl |= GPIO_MOD_CTRL_BIT;
		__raw_writel(ctrl, reg);
C
Charulatha V 已提交
550
	}
551

552
	_reset_gpio(bank, bank->chip.base + offset);
D
David Brownell 已提交
553
	spin_unlock_irqrestore(&bank->lock, flags);
554 555 556 557 558 559 560

	/*
	 * If this is the last gpio to be freed in the bank,
	 * disable the bank module.
	 */
	if (!bank->mod_usage)
		pm_runtime_put(bank->dev);
561 562 563 564 565 566 567 568 569 570 571
}

/*
 * 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.
 */
572
static void gpio_irq_handler(unsigned int irq, struct irq_desc *desc)
573
{
574
	void __iomem *isr_reg = NULL;
575
	u32 isr;
576
	unsigned int gpio_irq, gpio_index;
577
	struct gpio_bank *bank;
578 579
	u32 retrigger = 0;
	int unmasked = 0;
580
	struct irq_chip *chip = irq_desc_get_chip(desc);
581

582
	chained_irq_enter(chip, desc);
583

T
Thomas Gleixner 已提交
584
	bank = irq_get_handler_data(irq);
585
	isr_reg = bank->base + bank->regs->irqstatus;
586
	pm_runtime_get_sync(bank->dev);
587 588 589 590

	if (WARN_ON(!isr_reg))
		goto exit;

591
	while(1) {
592
		u32 isr_saved, level_mask = 0;
593
		u32 enabled;
594

595 596
		enabled = _get_gpio_irqbank_mask(bank);
		isr_saved = isr = __raw_readl(isr_reg) & enabled;
597

598
		if (bank->level_mask)
599
			level_mask = bank->level_mask & enabled;
600 601 602 603

		/* clear edge sensitive interrupts before handler(s) are
		called so that we don't miss any interrupt occurred while
		executing them */
604
		_disable_gpio_irqbank(bank, isr_saved & ~level_mask);
605
		_clear_gpio_irqbank(bank, isr_saved & ~level_mask);
606
		_enable_gpio_irqbank(bank, isr_saved & ~level_mask);
607 608 609

		/* if there is only edge sensitive GPIO pin interrupts
		configured, we could unmask GPIO bank interrupt immediately */
610 611
		if (!level_mask && !unmasked) {
			unmasked = 1;
612
			chained_irq_exit(chip, desc);
613
		}
614

615 616
		isr |= retrigger;
		retrigger = 0;
617 618 619 620 621
		if (!isr)
			break;

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

624 625
			if (!(isr & 1))
				continue;
626

627 628 629 630 631 632 633 634 635 636
			/*
			 * 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);

637
			generic_handle_irq(gpio_irq);
638
		}
639
	}
640 641 642 643
	/* 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 */
644
exit:
645
	if (!unmasked)
646
		chained_irq_exit(chip, desc);
647
	pm_runtime_put(bank->dev);
648 649
}

650
static void gpio_irq_shutdown(struct irq_data *d)
651
{
652 653
	unsigned int gpio = d->irq - IH_GPIO_BASE;
	struct gpio_bank *bank = irq_data_get_irq_chip_data(d);
654
	unsigned long flags;
655

656
	spin_lock_irqsave(&bank->lock, flags);
657
	_reset_gpio(bank, gpio);
658
	spin_unlock_irqrestore(&bank->lock, flags);
659 660
}

661
static void gpio_ack_irq(struct irq_data *d)
662
{
663 664
	unsigned int gpio = d->irq - IH_GPIO_BASE;
	struct gpio_bank *bank = irq_data_get_irq_chip_data(d);
665 666 667 668

	_clear_gpio_irqstatus(bank, gpio);
}

669
static void gpio_mask_irq(struct irq_data *d)
670
{
671 672
	unsigned int gpio = d->irq - IH_GPIO_BASE;
	struct gpio_bank *bank = irq_data_get_irq_chip_data(d);
673
	unsigned long flags;
674

675
	spin_lock_irqsave(&bank->lock, flags);
676
	_set_gpio_irqenable(bank, gpio, 0);
677
	_set_gpio_triggering(bank, GPIO_INDEX(bank, gpio), IRQ_TYPE_NONE);
678
	spin_unlock_irqrestore(&bank->lock, flags);
679 680
}

681
static void gpio_unmask_irq(struct irq_data *d)
682
{
683 684
	unsigned int gpio = d->irq - IH_GPIO_BASE;
	struct gpio_bank *bank = irq_data_get_irq_chip_data(d);
685
	unsigned int irq_mask = GPIO_BIT(bank, gpio);
686
	u32 trigger = irqd_get_trigger_type(d);
687
	unsigned long flags;
688

689
	spin_lock_irqsave(&bank->lock, flags);
690
	if (trigger)
691
		_set_gpio_triggering(bank, GPIO_INDEX(bank, gpio), trigger);
692 693 694 695 696 697 698

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

K
Kevin Hilman 已提交
700
	_set_gpio_irqenable(bank, gpio, 1);
701
	spin_unlock_irqrestore(&bank->lock, flags);
702 703
}

704 705
static struct irq_chip gpio_irq_chip = {
	.name		= "GPIO",
706 707 708 709 710 711
	.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,
712 713 714 715
};

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

716
static int omap_mpuio_suspend_noirq(struct device *dev)
D
David Brownell 已提交
717
{
718
	struct platform_device *pdev = to_platform_device(dev);
D
David Brownell 已提交
719
	struct gpio_bank	*bank = platform_get_drvdata(pdev);
720 721
	void __iomem		*mask_reg = bank->base +
					OMAP_MPUIO_GPIO_MASKIT / bank->stride;
D
David Brownell 已提交
722
	unsigned long		flags;
D
David Brownell 已提交
723

D
David Brownell 已提交
724
	spin_lock_irqsave(&bank->lock, flags);
D
David Brownell 已提交
725 726
	bank->saved_wakeup = __raw_readl(mask_reg);
	__raw_writel(0xffff & ~bank->suspend_wakeup, mask_reg);
D
David Brownell 已提交
727
	spin_unlock_irqrestore(&bank->lock, flags);
D
David Brownell 已提交
728 729 730 731

	return 0;
}

732
static int omap_mpuio_resume_noirq(struct device *dev)
D
David Brownell 已提交
733
{
734
	struct platform_device *pdev = to_platform_device(dev);
D
David Brownell 已提交
735
	struct gpio_bank	*bank = platform_get_drvdata(pdev);
736 737
	void __iomem		*mask_reg = bank->base +
					OMAP_MPUIO_GPIO_MASKIT / bank->stride;
D
David Brownell 已提交
738
	unsigned long		flags;
D
David Brownell 已提交
739

D
David Brownell 已提交
740
	spin_lock_irqsave(&bank->lock, flags);
D
David Brownell 已提交
741
	__raw_writel(bank->saved_wakeup, mask_reg);
D
David Brownell 已提交
742
	spin_unlock_irqrestore(&bank->lock, flags);
D
David Brownell 已提交
743 744 745 746

	return 0;
}

747
static const struct dev_pm_ops omap_mpuio_dev_pm_ops = {
748 749 750 751
	.suspend_noirq = omap_mpuio_suspend_noirq,
	.resume_noirq = omap_mpuio_resume_noirq,
};

752
/* use platform_driver for this. */
D
David Brownell 已提交
753 754 755
static struct platform_driver omap_mpuio_driver = {
	.driver		= {
		.name	= "mpuio",
756
		.pm	= &omap_mpuio_dev_pm_ops,
D
David Brownell 已提交
757 758 759 760 761 762 763 764 765 766 767 768
	},
};

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

769
static inline void mpuio_init(struct gpio_bank *bank)
D
David Brownell 已提交
770
{
771
	platform_set_drvdata(&omap_mpuio_device, bank);
772

D
David Brownell 已提交
773 774 775 776
	if (platform_driver_register(&omap_mpuio_driver) == 0)
		(void) platform_device_register(&omap_mpuio_device);
}

777
/*---------------------------------------------------------------------*/
778

D
David Brownell 已提交
779 780 781 782 783 784 785 786 787 788 789 790
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;
}

791 792
static int gpio_is_input(struct gpio_bank *bank, int mask)
{
793
	void __iomem *reg = bank->base + bank->regs->direction;
794 795 796 797

	return __raw_readl(reg) & mask;
}

D
David Brownell 已提交
798 799
static int gpio_get(struct gpio_chip *chip, unsigned offset)
{
800 801 802 803 804 805
	struct gpio_bank *bank;
	void __iomem *reg;
	int gpio;
	u32 mask;

	gpio = chip->base + offset;
C
Charulatha V 已提交
806
	bank = container_of(chip, struct gpio_bank, chip);
807
	reg = bank->base;
808
	mask = GPIO_BIT(bank, gpio);
809 810 811 812 813

	if (gpio_is_input(bank, mask))
		return _get_gpio_datain(bank, gpio);
	else
		return _get_gpio_dataout(bank, gpio);
D
David Brownell 已提交
814 815 816 817 818 819 820 821 822
}

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);
823
	bank->set_dataout(bank, offset, value);
D
David Brownell 已提交
824 825 826 827 828
	_set_gpio_direction(bank, offset, 0);
	spin_unlock_irqrestore(&bank->lock, flags);
	return 0;
}

829 830 831 832 833 834 835
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);
836 837 838 839 840 841 842

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

843 844 845 846 847 848 849
	spin_lock_irqsave(&bank->lock, flags);
	_set_gpio_debounce(bank, offset, debounce);
	spin_unlock_irqrestore(&bank->lock, flags);

	return 0;
}

D
David Brownell 已提交
850 851 852 853 854 855 856
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);
857
	bank->set_dataout(bank, offset, value);
D
David Brownell 已提交
858 859 860
	spin_unlock_irqrestore(&bank->lock, flags);
}

861 862 863 864 865 866 867 868
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 已提交
869 870
/*---------------------------------------------------------------------*/

871
static void __init omap_gpio_show_rev(struct gpio_bank *bank)
T
Tony Lindgren 已提交
872
{
873
	static bool called;
T
Tony Lindgren 已提交
874 875
	u32 rev;

876
	if (called || bank->regs->revision == USHRT_MAX)
T
Tony Lindgren 已提交
877 878
		return;

879 880
	rev = __raw_readw(bank->base + bank->regs->revision);
	pr_info("OMAP GPIO hardware version %d.%d\n",
T
Tony Lindgren 已提交
881
		(rev >> 4) & 0x0f, rev & 0x0f);
882 883

	called = true;
T
Tony Lindgren 已提交
884 885
}

886 887 888 889 890
/* 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;

891
static void omap_gpio_mod_init(struct gpio_bank *bank)
892
{
893 894
	void __iomem *base = bank->base;
	u32 l = 0xffffffff;
895

896 897 898
	if (bank->width == 16)
		l = 0xffff;

899
	if (bank->is_mpuio) {
900 901
		__raw_writel(l, bank->base + bank->regs->irqenable);
		return;
902
	}
903 904 905 906 907 908 909 910 911

	_gpio_rmw(base, bank->regs->irqenable, l, bank->regs->irqenable_inv);
	_gpio_rmw(base, bank->regs->irqstatus, l,
					bank->regs->irqenable_inv == false);
	_gpio_rmw(base, bank->regs->irqenable, l, bank->regs->debounce_en != 0);
	_gpio_rmw(base, bank->regs->irqenable, l, bank->regs->ctrl != 0);
	if (bank->regs->debounce_en)
		_gpio_rmw(base, bank->regs->debounce_en, 0, 1);

912 913
	/* Save OE default value (0xffffffff) in the context */
	bank->context.oe = __raw_readl(bank->base + bank->regs->direction);
914 915 916
	 /* Initialize interface clk ungated, module enabled */
	if (bank->regs->ctrl)
		_gpio_rmw(base, bank->regs->ctrl, 0, 1);
917 918
}

919 920 921 922 923 924 925 926 927
static __init void
omap_mpuio_alloc_gc(struct gpio_bank *bank, unsigned int irq_start,
		    unsigned int num)
{
	struct irq_chip_generic *gc;
	struct irq_chip_type *ct;

	gc = irq_alloc_generic_chip("MPUIO", 1, irq_start, bank->base,
				    handle_simple_irq);
928 929 930 931 932
	if (!gc) {
		dev_err(bank->dev, "Memory alloc failed for gc\n");
		return;
	}

933 934 935 936 937 938
	ct = gc->chip_types;

	/* NOTE: No ack required, reading IRQ status clears it. */
	ct->chip.irq_mask = irq_gc_mask_set_bit;
	ct->chip.irq_unmask = irq_gc_mask_clr_bit;
	ct->chip.irq_set_type = gpio_irq_type;
939 940

	if (bank->regs->wkup_en)
941 942 943 944 945 946 947
		ct->chip.irq_set_wake = gpio_wake_enable,

	ct->regs.mask = OMAP_MPUIO_GPIO_INT / bank->stride;
	irq_setup_generic_chip(gc, IRQ_MSK(num), IRQ_GC_INIT_MASK_CACHE,
			       IRQ_NOREQUEST | IRQ_NOPROBE, 0);
}

948
static void __devinit omap_gpio_chip_init(struct gpio_bank *bank)
949
{
950
	int j;
951 952 953 954 955 956 957 958 959 960 961 962 963 964
	static int gpio;

	/*
	 * 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;
965
	if (bank->is_mpuio) {
966
		bank->chip.label = "mpuio";
967 968
		if (bank->regs->wkup_en)
			bank->chip.dev = &omap_mpuio_device.dev;
969 970 971 972
		bank->chip.base = OMAP_MPUIO(0);
	} else {
		bank->chip.label = "gpio";
		bank->chip.base = gpio;
973
		gpio += bank->width;
974
	}
975
	bank->chip.ngpio = bank->width;
976 977 978 979

	gpiochip_add(&bank->chip);

	for (j = bank->virtual_irq_start;
980
		     j < bank->virtual_irq_start + bank->width; j++) {
981
		irq_set_lockdep_class(j, &gpio_lock_class);
T
Thomas Gleixner 已提交
982
		irq_set_chip_data(j, bank);
983
		if (bank->is_mpuio) {
984 985
			omap_mpuio_alloc_gc(bank, j, bank->width);
		} else {
T
Thomas Gleixner 已提交
986
			irq_set_chip(j, &gpio_irq_chip);
987 988 989
			irq_set_handler(j, handle_simple_irq);
			set_irq_flags(j, IRQF_VALID);
		}
990
	}
T
Thomas Gleixner 已提交
991 992
	irq_set_chained_handler(bank->irq, gpio_irq_handler);
	irq_set_handler_data(bank->irq, bank);
993 994
}

995
static int __devinit omap_gpio_probe(struct platform_device *pdev)
996
{
997 998
	struct omap_gpio_platform_data *pdata;
	struct resource *res;
999
	struct gpio_bank *bank;
1000
	int ret = 0;
1001

1002 1003 1004
	if (!pdev->dev.platform_data) {
		ret = -EINVAL;
		goto err_exit;
1005 1006
	}

1007 1008 1009 1010 1011 1012
	bank = kzalloc(sizeof(struct gpio_bank), GFP_KERNEL);
	if (!bank) {
		dev_err(&pdev->dev, "Memory alloc failed for gpio_bank\n");
		ret = -ENOMEM;
		goto err_exit;
	}
1013

1014 1015
	res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
	if (unlikely(!res)) {
1016 1017 1018 1019
		dev_err(&pdev->dev, "GPIO Bank %i Invalid IRQ resource\n",
				pdev->id);
		ret = -ENODEV;
		goto err_free;
1020
	}
1021

1022
	bank->irq = res->start;
1023 1024 1025
	bank->id = pdev->id;

	pdata = pdev->dev.platform_data;
1026 1027 1028
	bank->virtual_irq_start = pdata->virtual_irq_start;
	bank->dev = &pdev->dev;
	bank->dbck_flag = pdata->dbck_flag;
1029
	bank->stride = pdata->bank_stride;
1030
	bank->width = pdata->bank_width;
1031
	bank->is_mpuio = pdata->is_mpuio;
1032
	bank->non_wakeup_gpios = pdata->non_wakeup_gpios;
1033
	bank->loses_context = pdata->loses_context;
1034
	bank->get_context_loss_count = pdata->get_context_loss_count;
1035 1036 1037 1038 1039 1040
	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;
T
Tony Lindgren 已提交
1041

1042
	spin_lock_init(&bank->lock);
T
Tony Lindgren 已提交
1043

1044 1045 1046
	/* Static mapping, never released */
	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	if (unlikely(!res)) {
1047 1048 1049 1050
		dev_err(&pdev->dev, "GPIO Bank %i Invalid mem resource\n",
				pdev->id);
		ret = -ENODEV;
		goto err_free;
1051
	}
1052

1053 1054
	bank->base = ioremap(res->start, resource_size(res));
	if (!bank->base) {
1055 1056 1057 1058
		dev_err(&pdev->dev, "Could not ioremap gpio bank%i\n",
				pdev->id);
		ret = -ENOMEM;
		goto err_free;
1059 1060
	}

1061 1062
	platform_set_drvdata(pdev, bank);

1063
	pm_runtime_enable(bank->dev);
1064
	pm_runtime_irq_safe(bank->dev);
1065 1066
	pm_runtime_get_sync(bank->dev);

1067
	if (bank->is_mpuio)
1068 1069
		mpuio_init(bank);

1070
	omap_gpio_mod_init(bank);
1071
	omap_gpio_chip_init(bank);
1072
	omap_gpio_show_rev(bank);
T
Tony Lindgren 已提交
1073

1074 1075
	pm_runtime_put(bank->dev);

1076
	list_add_tail(&bank->node, &omap_gpio_list);
1077

1078 1079 1080 1081 1082 1083
	return ret;

err_free:
	kfree(bank);
err_exit:
	return ret;
1084 1085
}

1086 1087 1088 1089
#ifdef CONFIG_ARCH_OMAP2PLUS

#if defined(CONFIG_PM_SLEEP)
static int omap_gpio_suspend(struct device *dev)
1090
{
1091 1092 1093 1094 1095
	struct platform_device *pdev = to_platform_device(dev);
	struct gpio_bank *bank = platform_get_drvdata(pdev);
	void __iomem *base = bank->base;
	void __iomem *wakeup_enable;
	unsigned long flags;
1096

1097 1098
	if (!bank->mod_usage || !bank->loses_context)
		return 0;
1099

1100 1101
	if (!bank->regs->wkup_en || !bank->suspend_wakeup)
		return 0;
1102

1103
	wakeup_enable = bank->base + bank->regs->wkup_en;
1104

1105 1106 1107 1108 1109
	spin_lock_irqsave(&bank->lock, flags);
	bank->saved_wakeup = __raw_readl(wakeup_enable);
	_gpio_rmw(base, bank->regs->wkup_en, 0xffffffff, 0);
	_gpio_rmw(base, bank->regs->wkup_en, bank->suspend_wakeup, 1);
	spin_unlock_irqrestore(&bank->lock, flags);
1110 1111 1112 1113

	return 0;
}

1114
static int omap_gpio_resume(struct device *dev)
1115
{
1116 1117 1118 1119
	struct platform_device *pdev = to_platform_device(dev);
	struct gpio_bank *bank = platform_get_drvdata(pdev);
	void __iomem *base = bank->base;
	unsigned long flags;
1120

1121 1122
	if (!bank->mod_usage || !bank->loses_context)
		return 0;
1123

1124 1125
	if (!bank->regs->wkup_en || !bank->saved_wakeup)
		return 0;
1126

1127 1128 1129 1130
	spin_lock_irqsave(&bank->lock, flags);
	_gpio_rmw(base, bank->regs->wkup_en, 0xffffffff, 0);
	_gpio_rmw(base, bank->regs->wkup_en, bank->saved_wakeup, 1);
	spin_unlock_irqrestore(&bank->lock, flags);
1131

1132 1133 1134
	return 0;
}
#endif /* CONFIG_PM_SLEEP */
1135

1136
#if defined(CONFIG_PM_RUNTIME)
1137 1138
static void omap_gpio_save_context(struct gpio_bank *bank);
static void omap_gpio_restore_context(struct gpio_bank *bank);
1139

1140
static int omap_gpio_runtime_suspend(struct device *dev)
1141
{
1142 1143 1144 1145
	struct platform_device *pdev = to_platform_device(dev);
	struct gpio_bank *bank = platform_get_drvdata(pdev);
	u32 l1 = 0, l2 = 0;
	unsigned long flags;
1146

1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158
	spin_lock_irqsave(&bank->lock, flags);
	if (bank->power_mode != OFF_MODE) {
		bank->power_mode = 0;
		goto save_gpio_context;
	}
	/*
	 * If going to OFF, remove triggering for all
	 * non-wakeup GPIOs.  Otherwise spurious IRQs will be
	 * generated.  See OMAP2420 Errata item 1.101.
	 */
	if (!(bank->enabled_non_wakeup_gpios))
		goto save_gpio_context;
1159

1160 1161 1162 1163
	bank->saved_datain = __raw_readl(bank->base +
						bank->regs->datain);
	l1 = __raw_readl(bank->base + bank->regs->fallingdetect);
	l2 = __raw_readl(bank->base + bank->regs->risingdetect);
1164

1165 1166 1167 1168
	bank->saved_fallingdetect = l1;
	bank->saved_risingdetect = l2;
	l1 &= ~bank->enabled_non_wakeup_gpios;
	l2 &= ~bank->enabled_non_wakeup_gpios;
1169

1170 1171
	__raw_writel(l1, bank->base + bank->regs->fallingdetect);
	__raw_writel(l2, bank->base + bank->regs->risingdetect);
1172

1173
	bank->workaround_enabled = true;
1174

1175
save_gpio_context:
1176 1177
	if (bank->get_context_loss_count)
		bank->context_loss_count =
1178 1179
				bank->get_context_loss_count(bank->dev);

1180 1181
	omap_gpio_save_context(bank);
	spin_unlock_irqrestore(&bank->lock, flags);
1182

1183
	return 0;
1184 1185
}

1186
static int omap_gpio_runtime_resume(struct device *dev)
1187
{
1188 1189 1190 1191 1192
	struct platform_device *pdev = to_platform_device(dev);
	struct gpio_bank *bank = platform_get_drvdata(pdev);
	int context_lost_cnt_after;
	u32 l = 0, gen, gen0, gen1;
	unsigned long flags;
1193

1194 1195 1196 1197 1198
	spin_lock_irqsave(&bank->lock, flags);
	if (!bank->enabled_non_wakeup_gpios || !bank->workaround_enabled) {
		spin_unlock_irqrestore(&bank->lock, flags);
		return 0;
	}
1199

1200 1201 1202 1203 1204 1205 1206 1207 1208
	if (bank->get_context_loss_count) {
		context_lost_cnt_after =
			bank->get_context_loss_count(bank->dev);
		if (context_lost_cnt_after != bank->context_loss_count ||
						!context_lost_cnt_after) {
			omap_gpio_restore_context(bank);
		} else {
			spin_unlock_irqrestore(&bank->lock, flags);
			return 0;
1209
		}
1210
	}
1211

1212 1213 1214 1215 1216
	__raw_writel(bank->saved_fallingdetect,
			bank->base + bank->regs->fallingdetect);
	__raw_writel(bank->saved_risingdetect,
			bank->base + bank->regs->risingdetect);
	l = __raw_readl(bank->base + bank->regs->datain);
1217

1218 1219 1220 1221 1222 1223 1224 1225
	/*
	 * 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;
	l &= bank->enabled_non_wakeup_gpios;
1226

1227 1228 1229 1230 1231 1232
	/*
	 * 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;
1233

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

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

1242 1243
	if (gen) {
		u32 old0, old1;
1244

1245 1246
		old0 = __raw_readl(bank->base + bank->regs->leveldetect0);
		old1 = __raw_readl(bank->base + bank->regs->leveldetect1);
1247

1248 1249
		if (cpu_is_omap24xx() || cpu_is_omap34xx()) {
			__raw_writel(old0 | gen, bank->base +
1250
						bank->regs->leveldetect0);
1251
			__raw_writel(old1 | gen, bank->base +
1252
						bank->regs->leveldetect1);
1253
		}
1254

1255 1256
		if (cpu_is_omap44xx()) {
			__raw_writel(old0 | l, bank->base +
1257
						bank->regs->leveldetect0);
1258
			__raw_writel(old1 | l, bank->base +
1259
						bank->regs->leveldetect1);
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 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304
		__raw_writel(old0, bank->base + bank->regs->leveldetect0);
		__raw_writel(old1, bank->base + bank->regs->leveldetect1);
	}

	bank->workaround_enabled = false;
	spin_unlock_irqrestore(&bank->lock, flags);

	return 0;
}
#endif /* CONFIG_PM_RUNTIME */

void omap2_gpio_prepare_for_idle(int pwr_mode)
{
	struct gpio_bank *bank;

	list_for_each_entry(bank, &omap_gpio_list, node) {
		int j;

		if (!bank->mod_usage || !bank->loses_context)
			continue;

		bank->power_mode = pwr_mode;

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

		pm_runtime_put_sync_suspend(bank->dev);
	}
}

void omap2_gpio_resume_after_idle(void)
{
	struct gpio_bank *bank;

	list_for_each_entry(bank, &omap_gpio_list, node) {
		int j;

		if (!bank->mod_usage || !bank->loses_context)
			continue;

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

		pm_runtime_get_sync(bank->dev);
1305 1306 1307
	}
}

1308
#if defined(CONFIG_PM_RUNTIME)
1309
static void omap_gpio_save_context(struct gpio_bank *bank)
1310
{
1311
	bank->context.irqenable1 =
1312
			__raw_readl(bank->base + bank->regs->irqenable);
1313
	bank->context.irqenable2 =
1314
			__raw_readl(bank->base + bank->regs->irqenable2);
1315
	bank->context.wake_en =
1316 1317 1318
			__raw_readl(bank->base + bank->regs->wkup_en);
	bank->context.ctrl = __raw_readl(bank->base + bank->regs->ctrl);
	bank->context.oe = __raw_readl(bank->base + bank->regs->direction);
1319
	bank->context.leveldetect0 =
1320
			__raw_readl(bank->base + bank->regs->leveldetect0);
1321
	bank->context.leveldetect1 =
1322
			__raw_readl(bank->base + bank->regs->leveldetect1);
1323
	bank->context.risingdetect =
1324
			__raw_readl(bank->base + bank->regs->risingdetect);
1325
	bank->context.fallingdetect =
1326 1327
			__raw_readl(bank->base + bank->regs->fallingdetect);
	bank->context.dataout = __raw_readl(bank->base + bank->regs->dataout);
1328 1329
}

1330
static void omap_gpio_restore_context(struct gpio_bank *bank)
1331
{
1332
	__raw_writel(bank->context.irqenable1,
1333
				bank->base + bank->regs->irqenable);
1334
	__raw_writel(bank->context.irqenable2,
1335
				bank->base + bank->regs->irqenable2);
1336
	__raw_writel(bank->context.wake_en,
1337 1338 1339
				bank->base + bank->regs->wkup_en);
	__raw_writel(bank->context.ctrl, bank->base + bank->regs->ctrl);
	__raw_writel(bank->context.oe, bank->base + bank->regs->direction);
1340
	__raw_writel(bank->context.leveldetect0,
1341
				bank->base + bank->regs->leveldetect0);
1342
	__raw_writel(bank->context.leveldetect1,
1343
				bank->base + bank->regs->leveldetect1);
1344
	__raw_writel(bank->context.risingdetect,
1345
				bank->base + bank->regs->risingdetect);
1346
	__raw_writel(bank->context.fallingdetect,
1347 1348
				bank->base + bank->regs->fallingdetect);
	__raw_writel(bank->context.dataout, bank->base + bank->regs->dataout);
1349
}
1350
#endif /* CONFIG_PM_RUNTIME */
1351 1352 1353
#else
#define omap_gpio_suspend NULL
#define omap_gpio_resume NULL
1354 1355
#define omap_gpio_runtime_suspend NULL
#define omap_gpio_runtime_resume NULL
1356 1357
#endif

1358 1359
static const struct dev_pm_ops gpio_pm_ops = {
	SET_SYSTEM_SLEEP_PM_OPS(omap_gpio_suspend, omap_gpio_resume)
1360 1361
	SET_RUNTIME_PM_OPS(omap_gpio_runtime_suspend, omap_gpio_runtime_resume,
									NULL)
1362 1363
};

1364 1365 1366 1367
static struct platform_driver omap_gpio_driver = {
	.probe		= omap_gpio_probe,
	.driver		= {
		.name	= "omap_gpio",
1368
		.pm	= &gpio_pm_ops,
1369 1370 1371
	},
};

1372
/*
1373 1374 1375
 * gpio driver register needs to be done before
 * machine_init functions access gpio APIs.
 * Hence omap_gpio_drv_reg() is a postcore_initcall.
1376
 */
1377
static int __init omap_gpio_drv_reg(void)
1378
{
1379
	return platform_driver_register(&omap_gpio_driver);
1380
}
1381
postcore_initcall(omap_gpio_drv_reg);