gpio-omap.c 35.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
#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
	bool dbck_enabled;
71
	struct device *dev;
72
	bool is_mpuio;
73
	bool dbck_flag;
74
	bool loses_context;
75
	int stride;
76
	u32 width;
77
	int context_loss_count;
78
	u16 id;
79 80
	int power_mode;
	bool workaround_enabled;
81 82

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

	struct omap_gpio_reg_offs *regs;
86 87
};

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

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

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

106 107 108

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

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

	__raw_writel(l, reg);
}

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

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

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

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

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

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

150 151 152 153 154 155 156 157 158 159 160
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);
}
161

162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177
static inline void _gpio_dbck_enable(struct gpio_bank *bank)
{
	if (bank->dbck_enable_mask && !bank->dbck_enabled) {
		clk_enable(bank->dbck);
		bank->dbck_enabled = true;
	}
}

static inline void _gpio_dbck_disable(struct gpio_bank *bank)
{
	if (bank->dbck_enable_mask && bank->dbck_enabled) {
		clk_disable(bank->dbck);
		bank->dbck_enabled = false;
	}
}

178 179 180 181 182 183 184 185 186 187 188 189
/**
 * _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)
{
190
	void __iomem		*reg;
191 192 193
	u32			val;
	u32			l;

194 195 196
	if (!bank->dbck_flag)
		return;

197 198 199 200 201 202 203
	if (debounce < 32)
		debounce = 0x01;
	else if (debounce > 7936)
		debounce = 0xff;
	else
		debounce = (debounce / 0x1f) - 1;

204
	l = GPIO_BIT(bank, gpio);
205

206
	reg = bank->base + bank->regs->debounce;
207 208
	__raw_writel(debounce, reg);

209
	reg = bank->base + bank->regs->debounce_en;
210 211 212 213
	val = __raw_readl(reg);

	if (debounce) {
		val |= l;
214
		clk_enable(bank->dbck);
215 216
	} else {
		val &= ~l;
217
		clk_disable(bank->dbck);
218
	}
219
	bank->dbck_enable_mask = val;
220 221 222 223

	__raw_writel(val, reg);
}

224
static inline void set_gpio_trigger(struct gpio_bank *bank, int gpio,
225
						int trigger)
226
{
227
	void __iomem *base = bank->base;
228 229
	u32 gpio_bit = 1 << gpio;

230 231 232 233 234 235 236 237 238 239 240 241
	_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);

242
	/* This part needs to be executed always for OMAP{34xx, 44xx} */
243 244 245 246 247 248 249
	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;
		}

250 251 252 253 254 255 256
		/*
		 * 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)
257 258 259 260
			bank->enabled_non_wakeup_gpios |= gpio_bit;
		else
			bank->enabled_non_wakeup_gpios &= ~gpio_bit;
	}
261

262
exit:
263 264 265
	bank->level_mask =
		__raw_readl(bank->base + bank->regs->leveldetect0) |
		__raw_readl(bank->base + bank->regs->leveldetect1);
266 267
}

268
#ifdef CONFIG_ARCH_OMAP1
269 270 271 272 273 274 275 276 277
/*
 * 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;

278
	if (!bank->regs->irqctrl)
279
		return;
280 281

	reg += bank->regs->irqctrl;
282 283 284 285 286 287 288 289 290

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

	__raw_writel(l, reg);
}
291 292
#else
static void _toggle_gpio_edge_triggering(struct gpio_bank *bank, int gpio) {}
293
#endif
294

295 296 297
static int _set_gpio_triggering(struct gpio_bank *bank, int gpio, int trigger)
{
	void __iomem *reg = bank->base;
298
	void __iomem *base = bank->base;
299
	u32 l = 0;
300

301 302 303 304 305
	if (bank->regs->leveldetect0 && bank->regs->wkup_en) {
		set_gpio_trigger(bank, gpio, trigger);
	} else if (bank->regs->irqctrl) {
		reg += bank->regs->irqctrl;

306
		l = __raw_readl(reg);
307
		if ((trigger & IRQ_TYPE_SENSE_MASK) == IRQ_TYPE_EDGE_BOTH)
308
			bank->toggle_mask |= 1 << gpio;
309
		if (trigger & IRQ_TYPE_EDGE_RISING)
310
			l |= 1 << gpio;
311
		else if (trigger & IRQ_TYPE_EDGE_FALLING)
312
			l &= ~(1 << gpio);
313
		else
314 315 316 317
			return -EINVAL;

		__raw_writel(l, reg);
	} else if (bank->regs->edgectrl1) {
318
		if (gpio & 0x08)
319
			reg += bank->regs->edgectrl2;
320
		else
321 322
			reg += bank->regs->edgectrl1;

323 324 325
		gpio &= 0x07;
		l = __raw_readl(reg);
		l &= ~(3 << (gpio << 1));
326
		if (trigger & IRQ_TYPE_EDGE_RISING)
327
			l |= 2 << (gpio << 1);
328
		if (trigger & IRQ_TYPE_EDGE_FALLING)
329
			l |= 1 << (gpio << 1);
330 331 332 333

		/* Enable wake-up during idle for dynamic tick */
		_gpio_rmw(base, bank->regs->wkup_en, 1 << gpio, trigger);
		__raw_writel(l, reg);
334
	}
335
	return 0;
336 337
}

338
static int gpio_irq_type(struct irq_data *d, unsigned type)
339 340
{
	struct gpio_bank *bank;
341 342
	unsigned gpio;
	int retval;
D
David Brownell 已提交
343
	unsigned long flags;
344

345 346
	if (!cpu_class_is_omap2() && d->irq > IH_MPUIO_BASE)
		gpio = OMAP_MPUIO(d->irq - IH_MPUIO_BASE);
347
	else
348
		gpio = d->irq - IH_GPIO_BASE;
349

350
	if (type & ~IRQ_TYPE_SENSE_MASK)
351
		return -EINVAL;
352

353 354 355 356
	bank = irq_data_get_irq_chip_data(d);

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

D
David Brownell 已提交
359
	spin_lock_irqsave(&bank->lock, flags);
360
	retval = _set_gpio_triggering(bank, GPIO_INDEX(bank, gpio), type);
D
David Brownell 已提交
361
	spin_unlock_irqrestore(&bank->lock, flags);
362 363

	if (type & (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH))
T
Thomas Gleixner 已提交
364
		__irq_set_handler_locked(d->irq, handle_level_irq);
365
	else if (type & (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING))
T
Thomas Gleixner 已提交
366
		__irq_set_handler_locked(d->irq, handle_edge_irq);
367

368
	return retval;
369 370 371 372
}

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

375
	reg += bank->regs->irqstatus;
376
	__raw_writel(gpio_mask, reg);
377 378

	/* Workaround for clearing DSP GPIO interrupts to allow retention */
379 380
	if (bank->regs->irqstatus2) {
		reg = bank->base + bank->regs->irqstatus2;
381
		__raw_writel(gpio_mask, reg);
382
	}
383 384 385

	/* Flush posted write for the irq status to avoid spurious interrupts */
	__raw_readl(reg);
386 387 388 389
}

static inline void _clear_gpio_irqstatus(struct gpio_bank *bank, int gpio)
{
390
	_clear_gpio_irqbank(bank, GPIO_BIT(bank, gpio));
391 392
}

393 394 395
static u32 _get_gpio_irqbank_mask(struct gpio_bank *bank)
{
	void __iomem *reg = bank->base;
396
	u32 l;
397
	u32 mask = (1 << bank->width) - 1;
398

399
	reg += bank->regs->irqenable;
400
	l = __raw_readl(reg);
401
	if (bank->regs->irqenable_inv)
402 403 404
		l = ~l;
	l &= mask;
	return l;
405 406
}

407
static void _enable_gpio_irqbank(struct gpio_bank *bank, int gpio_mask)
408
{
409
	void __iomem *reg = bank->base;
410 411
	u32 l;

412 413 414 415 416
	if (bank->regs->set_irqenable) {
		reg += bank->regs->set_irqenable;
		l = gpio_mask;
	} else {
		reg += bank->regs->irqenable;
417
		l = __raw_readl(reg);
418 419
		if (bank->regs->irqenable_inv)
			l &= ~gpio_mask;
420 421
		else
			l |= gpio_mask;
422 423 424 425 426 427 428 429 430 431 432 433
	}

	__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;
434
		l = gpio_mask;
435 436
	} else {
		reg += bank->regs->irqenable;
437
		l = __raw_readl(reg);
438
		if (bank->regs->irqenable_inv)
439
			l |= gpio_mask;
440
		else
441
			l &= ~gpio_mask;
442
	}
443

444 445 446 447 448
	__raw_writel(l, reg);
}

static inline void _set_gpio_irqenable(struct gpio_bank *bank, int gpio, int enable)
{
449
	_enable_gpio_irqbank(bank, GPIO_BIT(bank, gpio));
450 451
}

452 453 454 455 456 457 458 459 460 461
/*
 * 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)
{
462 463
	u32 gpio_bit = GPIO_BIT(bank, gpio);
	unsigned long flags;
D
David Brownell 已提交
464

465 466 467
	if (bank->non_wakeup_gpios & gpio_bit) {
		dev_err(bank->dev, 
			"Unable to modify wakeup on non-wakeup GPIO%d\n", gpio);
468 469
		return -EINVAL;
	}
470 471 472 473 474 475 476 477 478 479

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

482 483
static void _reset_gpio(struct gpio_bank *bank, int gpio)
{
484
	_set_gpio_direction(bank, GPIO_INDEX(bank, gpio), 1);
485 486
	_set_gpio_irqenable(bank, gpio, 0);
	_clear_gpio_irqstatus(bank, gpio);
487
	_set_gpio_triggering(bank, GPIO_INDEX(bank, gpio), IRQ_TYPE_NONE);
488 489
}

490
/* Use disable_irq_wake() and enable_irq_wake() functions from drivers */
491
static int gpio_wake_enable(struct irq_data *d, unsigned int enable)
492
{
493
	unsigned int gpio = d->irq - IH_GPIO_BASE;
494 495 496
	struct gpio_bank *bank;
	int retval;

497
	bank = irq_data_get_irq_chip_data(d);
498
	retval = _set_gpio_wakeup(bank, gpio, enable);
499 500 501 502

	return retval;
}

503
static int omap_gpio_request(struct gpio_chip *chip, unsigned offset)
504
{
505
	struct gpio_bank *bank = container_of(chip, struct gpio_bank, chip);
D
David Brownell 已提交
506
	unsigned long flags;
D
David Brownell 已提交
507

508 509 510 511 512 513
	/*
	 * If this is the first gpio_request for the bank,
	 * enable the bank module.
	 */
	if (!bank->mod_usage)
		pm_runtime_get_sync(bank->dev);
514

515
	spin_lock_irqsave(&bank->lock, flags);
516 517 518
	/* Set trigger to none. You need to enable the desired trigger with
	 * request_irq() or set_irq_type().
	 */
519
	_set_gpio_triggering(bank, offset, IRQ_TYPE_NONE);
520

521 522
	if (bank->regs->pinctrl) {
		void __iomem *reg = bank->base + bank->regs->pinctrl;
523

524
		/* Claim the pin for MPU */
525
		__raw_writel(__raw_readl(reg) | (1 << offset), reg);
526
	}
527

528 529 530 531 532 533 534 535
	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 已提交
536
	}
537 538 539

	bank->mod_usage |= 1 << offset;

D
David Brownell 已提交
540
	spin_unlock_irqrestore(&bank->lock, flags);
541 542 543 544

	return 0;
}

545
static void omap_gpio_free(struct gpio_chip *chip, unsigned offset)
546
{
547
	struct gpio_bank *bank = container_of(chip, struct gpio_bank, chip);
548
	void __iomem *base = bank->base;
D
David Brownell 已提交
549
	unsigned long flags;
550

D
David Brownell 已提交
551
	spin_lock_irqsave(&bank->lock, flags);
552 553

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

557 558 559 560 561 562 563 564 565 566
	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 已提交
567
	}
568

569
	_reset_gpio(bank, bank->chip.base + offset);
D
David Brownell 已提交
570
	spin_unlock_irqrestore(&bank->lock, flags);
571 572 573 574 575 576 577

	/*
	 * 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);
578 579 580 581 582 583 584 585 586 587 588
}

/*
 * 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.
 */
589
static void gpio_irq_handler(unsigned int irq, struct irq_desc *desc)
590
{
591
	void __iomem *isr_reg = NULL;
592
	u32 isr;
593
	unsigned int gpio_irq, gpio_index;
594
	struct gpio_bank *bank;
595 596
	u32 retrigger = 0;
	int unmasked = 0;
597
	struct irq_chip *chip = irq_desc_get_chip(desc);
598

599
	chained_irq_enter(chip, desc);
600

T
Thomas Gleixner 已提交
601
	bank = irq_get_handler_data(irq);
602
	isr_reg = bank->base + bank->regs->irqstatus;
603
	pm_runtime_get_sync(bank->dev);
604 605 606 607

	if (WARN_ON(!isr_reg))
		goto exit;

608
	while(1) {
609
		u32 isr_saved, level_mask = 0;
610
		u32 enabled;
611

612 613
		enabled = _get_gpio_irqbank_mask(bank);
		isr_saved = isr = __raw_readl(isr_reg) & enabled;
614

615
		if (bank->level_mask)
616
			level_mask = bank->level_mask & enabled;
617 618 619 620

		/* clear edge sensitive interrupts before handler(s) are
		called so that we don't miss any interrupt occurred while
		executing them */
621
		_disable_gpio_irqbank(bank, isr_saved & ~level_mask);
622
		_clear_gpio_irqbank(bank, isr_saved & ~level_mask);
623
		_enable_gpio_irqbank(bank, isr_saved & ~level_mask);
624 625 626

		/* if there is only edge sensitive GPIO pin interrupts
		configured, we could unmask GPIO bank interrupt immediately */
627 628
		if (!level_mask && !unmasked) {
			unmasked = 1;
629
			chained_irq_exit(chip, desc);
630
		}
631

632 633
		isr |= retrigger;
		retrigger = 0;
634 635 636 637 638
		if (!isr)
			break;

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

641 642
			if (!(isr & 1))
				continue;
643

644 645 646 647 648 649 650 651 652 653
			/*
			 * 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);

654
			generic_handle_irq(gpio_irq);
655
		}
656
	}
657 658 659 660
	/* 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 */
661
exit:
662
	if (!unmasked)
663
		chained_irq_exit(chip, desc);
664
	pm_runtime_put(bank->dev);
665 666
}

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

673
	spin_lock_irqsave(&bank->lock, flags);
674
	_reset_gpio(bank, gpio);
675
	spin_unlock_irqrestore(&bank->lock, flags);
676 677
}

678
static void gpio_ack_irq(struct irq_data *d)
679
{
680 681
	unsigned int gpio = d->irq - IH_GPIO_BASE;
	struct gpio_bank *bank = irq_data_get_irq_chip_data(d);
682 683 684 685

	_clear_gpio_irqstatus(bank, gpio);
}

686
static void gpio_mask_irq(struct irq_data *d)
687
{
688 689
	unsigned int gpio = d->irq - IH_GPIO_BASE;
	struct gpio_bank *bank = irq_data_get_irq_chip_data(d);
690
	unsigned long flags;
691

692
	spin_lock_irqsave(&bank->lock, flags);
693
	_set_gpio_irqenable(bank, gpio, 0);
694
	_set_gpio_triggering(bank, GPIO_INDEX(bank, gpio), IRQ_TYPE_NONE);
695
	spin_unlock_irqrestore(&bank->lock, flags);
696 697
}

698
static void gpio_unmask_irq(struct irq_data *d)
699
{
700 701
	unsigned int gpio = d->irq - IH_GPIO_BASE;
	struct gpio_bank *bank = irq_data_get_irq_chip_data(d);
702
	unsigned int irq_mask = GPIO_BIT(bank, gpio);
703
	u32 trigger = irqd_get_trigger_type(d);
704
	unsigned long flags;
705

706
	spin_lock_irqsave(&bank->lock, flags);
707
	if (trigger)
708
		_set_gpio_triggering(bank, GPIO_INDEX(bank, gpio), trigger);
709 710 711 712 713 714 715

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

K
Kevin Hilman 已提交
717
	_set_gpio_irqenable(bank, gpio, 1);
718
	spin_unlock_irqrestore(&bank->lock, flags);
719 720
}

721 722
static struct irq_chip gpio_irq_chip = {
	.name		= "GPIO",
723 724 725 726 727 728
	.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,
729 730 731 732
};

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

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

D
David Brownell 已提交
741
	spin_lock_irqsave(&bank->lock, flags);
D
David Brownell 已提交
742 743
	bank->saved_wakeup = __raw_readl(mask_reg);
	__raw_writel(0xffff & ~bank->suspend_wakeup, mask_reg);
D
David Brownell 已提交
744
	spin_unlock_irqrestore(&bank->lock, flags);
D
David Brownell 已提交
745 746 747 748

	return 0;
}

749
static int omap_mpuio_resume_noirq(struct device *dev)
D
David Brownell 已提交
750
{
751
	struct platform_device *pdev = to_platform_device(dev);
D
David Brownell 已提交
752
	struct gpio_bank	*bank = platform_get_drvdata(pdev);
753 754
	void __iomem		*mask_reg = bank->base +
					OMAP_MPUIO_GPIO_MASKIT / bank->stride;
D
David Brownell 已提交
755
	unsigned long		flags;
D
David Brownell 已提交
756

D
David Brownell 已提交
757
	spin_lock_irqsave(&bank->lock, flags);
D
David Brownell 已提交
758
	__raw_writel(bank->saved_wakeup, mask_reg);
D
David Brownell 已提交
759
	spin_unlock_irqrestore(&bank->lock, flags);
D
David Brownell 已提交
760 761 762 763

	return 0;
}

764
static const struct dev_pm_ops omap_mpuio_dev_pm_ops = {
765 766 767 768
	.suspend_noirq = omap_mpuio_suspend_noirq,
	.resume_noirq = omap_mpuio_resume_noirq,
};

769
/* use platform_driver for this. */
D
David Brownell 已提交
770 771 772
static struct platform_driver omap_mpuio_driver = {
	.driver		= {
		.name	= "mpuio",
773
		.pm	= &omap_mpuio_dev_pm_ops,
D
David Brownell 已提交
774 775 776 777 778 779 780 781 782 783 784 785
	},
};

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

786
static inline void mpuio_init(struct gpio_bank *bank)
D
David Brownell 已提交
787
{
788
	platform_set_drvdata(&omap_mpuio_device, bank);
789

D
David Brownell 已提交
790 791 792 793
	if (platform_driver_register(&omap_mpuio_driver) == 0)
		(void) platform_device_register(&omap_mpuio_device);
}

794
/*---------------------------------------------------------------------*/
795

D
David Brownell 已提交
796 797 798 799 800 801 802 803 804 805 806 807
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;
}

808 809
static int gpio_is_input(struct gpio_bank *bank, int mask)
{
810
	void __iomem *reg = bank->base + bank->regs->direction;
811 812 813 814

	return __raw_readl(reg) & mask;
}

D
David Brownell 已提交
815 816
static int gpio_get(struct gpio_chip *chip, unsigned offset)
{
817 818 819 820 821 822
	struct gpio_bank *bank;
	void __iomem *reg;
	int gpio;
	u32 mask;

	gpio = chip->base + offset;
C
Charulatha V 已提交
823
	bank = container_of(chip, struct gpio_bank, chip);
824
	reg = bank->base;
825
	mask = GPIO_BIT(bank, gpio);
826 827 828 829 830

	if (gpio_is_input(bank, mask))
		return _get_gpio_datain(bank, gpio);
	else
		return _get_gpio_dataout(bank, gpio);
D
David Brownell 已提交
831 832 833 834 835 836 837 838 839
}

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);
840
	bank->set_dataout(bank, offset, value);
D
David Brownell 已提交
841 842 843 844 845
	_set_gpio_direction(bank, offset, 0);
	spin_unlock_irqrestore(&bank->lock, flags);
	return 0;
}

846 847 848 849 850 851 852
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);
853 854 855 856 857 858 859

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

860 861 862 863 864 865 866
	spin_lock_irqsave(&bank->lock, flags);
	_set_gpio_debounce(bank, offset, debounce);
	spin_unlock_irqrestore(&bank->lock, flags);

	return 0;
}

D
David Brownell 已提交
867 868 869 870 871 872 873
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);
874
	bank->set_dataout(bank, offset, value);
D
David Brownell 已提交
875 876 877
	spin_unlock_irqrestore(&bank->lock, flags);
}

878 879 880 881 882 883 884 885
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 已提交
886 887
/*---------------------------------------------------------------------*/

888
static void __init omap_gpio_show_rev(struct gpio_bank *bank)
T
Tony Lindgren 已提交
889
{
890
	static bool called;
T
Tony Lindgren 已提交
891 892
	u32 rev;

893
	if (called || bank->regs->revision == USHRT_MAX)
T
Tony Lindgren 已提交
894 895
		return;

896 897
	rev = __raw_readw(bank->base + bank->regs->revision);
	pr_info("OMAP GPIO hardware version %d.%d\n",
T
Tony Lindgren 已提交
898
		(rev >> 4) & 0x0f, rev & 0x0f);
899 900

	called = true;
T
Tony Lindgren 已提交
901 902
}

903 904 905 906 907
/* 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;

908
static void omap_gpio_mod_init(struct gpio_bank *bank)
909
{
910 911
	void __iomem *base = bank->base;
	u32 l = 0xffffffff;
912

913 914 915
	if (bank->width == 16)
		l = 0xffff;

916
	if (bank->is_mpuio) {
917 918
		__raw_writel(l, bank->base + bank->regs->irqenable);
		return;
919
	}
920 921 922 923 924 925 926 927 928

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

929 930
	/* Save OE default value (0xffffffff) in the context */
	bank->context.oe = __raw_readl(bank->base + bank->regs->direction);
931 932 933
	 /* Initialize interface clk ungated, module enabled */
	if (bank->regs->ctrl)
		_gpio_rmw(base, bank->regs->ctrl, 0, 1);
934 935
}

936 937 938 939 940 941 942 943 944
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);
945 946 947 948 949
	if (!gc) {
		dev_err(bank->dev, "Memory alloc failed for gc\n");
		return;
	}

950 951 952 953 954 955
	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;
956 957

	if (bank->regs->wkup_en)
958 959 960 961 962 963 964
		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);
}

965
static void __devinit omap_gpio_chip_init(struct gpio_bank *bank)
966
{
967
	int j;
968 969 970 971 972 973 974 975 976 977 978 979 980 981
	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;
982
	if (bank->is_mpuio) {
983
		bank->chip.label = "mpuio";
984 985
		if (bank->regs->wkup_en)
			bank->chip.dev = &omap_mpuio_device.dev;
986 987 988 989
		bank->chip.base = OMAP_MPUIO(0);
	} else {
		bank->chip.label = "gpio";
		bank->chip.base = gpio;
990
		gpio += bank->width;
991
	}
992
	bank->chip.ngpio = bank->width;
993 994 995 996

	gpiochip_add(&bank->chip);

	for (j = bank->virtual_irq_start;
997
		     j < bank->virtual_irq_start + bank->width; j++) {
998
		irq_set_lockdep_class(j, &gpio_lock_class);
T
Thomas Gleixner 已提交
999
		irq_set_chip_data(j, bank);
1000
		if (bank->is_mpuio) {
1001 1002
			omap_mpuio_alloc_gc(bank, j, bank->width);
		} else {
T
Thomas Gleixner 已提交
1003
			irq_set_chip(j, &gpio_irq_chip);
1004 1005 1006
			irq_set_handler(j, handle_simple_irq);
			set_irq_flags(j, IRQF_VALID);
		}
1007
	}
T
Thomas Gleixner 已提交
1008 1009
	irq_set_chained_handler(bank->irq, gpio_irq_handler);
	irq_set_handler_data(bank->irq, bank);
1010 1011
}

1012
static int __devinit omap_gpio_probe(struct platform_device *pdev)
1013
{
1014 1015
	struct omap_gpio_platform_data *pdata;
	struct resource *res;
1016
	struct gpio_bank *bank;
1017
	int ret = 0;
1018

1019 1020 1021
	if (!pdev->dev.platform_data) {
		ret = -EINVAL;
		goto err_exit;
1022 1023
	}

1024 1025 1026 1027 1028 1029
	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;
	}
1030

1031 1032
	res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
	if (unlikely(!res)) {
1033 1034 1035 1036
		dev_err(&pdev->dev, "GPIO Bank %i Invalid IRQ resource\n",
				pdev->id);
		ret = -ENODEV;
		goto err_free;
1037
	}
1038

1039
	bank->irq = res->start;
1040 1041 1042
	bank->id = pdev->id;

	pdata = pdev->dev.platform_data;
1043 1044 1045
	bank->virtual_irq_start = pdata->virtual_irq_start;
	bank->dev = &pdev->dev;
	bank->dbck_flag = pdata->dbck_flag;
1046
	bank->stride = pdata->bank_stride;
1047
	bank->width = pdata->bank_width;
1048
	bank->is_mpuio = pdata->is_mpuio;
1049
	bank->non_wakeup_gpios = pdata->non_wakeup_gpios;
1050
	bank->loses_context = pdata->loses_context;
1051
	bank->get_context_loss_count = pdata->get_context_loss_count;
1052 1053 1054 1055 1056 1057
	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 已提交
1058

1059
	spin_lock_init(&bank->lock);
T
Tony Lindgren 已提交
1060

1061 1062 1063
	/* Static mapping, never released */
	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	if (unlikely(!res)) {
1064 1065 1066 1067
		dev_err(&pdev->dev, "GPIO Bank %i Invalid mem resource\n",
				pdev->id);
		ret = -ENODEV;
		goto err_free;
1068
	}
1069

1070 1071
	bank->base = ioremap(res->start, resource_size(res));
	if (!bank->base) {
1072 1073 1074 1075
		dev_err(&pdev->dev, "Could not ioremap gpio bank%i\n",
				pdev->id);
		ret = -ENOMEM;
		goto err_free;
1076 1077
	}

1078 1079
	platform_set_drvdata(pdev, bank);

1080
	pm_runtime_enable(bank->dev);
1081
	pm_runtime_irq_safe(bank->dev);
1082 1083
	pm_runtime_get_sync(bank->dev);

1084
	if (bank->is_mpuio)
1085 1086
		mpuio_init(bank);

1087
	omap_gpio_mod_init(bank);
1088
	omap_gpio_chip_init(bank);
1089
	omap_gpio_show_rev(bank);
T
Tony Lindgren 已提交
1090

1091 1092
	pm_runtime_put(bank->dev);

1093
	list_add_tail(&bank->node, &omap_gpio_list);
1094

1095 1096 1097 1098 1099 1100
	return ret;

err_free:
	kfree(bank);
err_exit:
	return ret;
1101 1102
}

1103 1104 1105 1106
#ifdef CONFIG_ARCH_OMAP2PLUS

#if defined(CONFIG_PM_SLEEP)
static int omap_gpio_suspend(struct device *dev)
1107
{
1108 1109 1110 1111 1112
	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;
1113

1114 1115
	if (!bank->mod_usage || !bank->loses_context)
		return 0;
1116

1117 1118
	if (!bank->regs->wkup_en || !bank->suspend_wakeup)
		return 0;
1119

1120
	wakeup_enable = bank->base + bank->regs->wkup_en;
1121

1122 1123 1124 1125 1126
	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);
1127 1128 1129 1130

	return 0;
}

1131
static int omap_gpio_resume(struct device *dev)
1132
{
1133 1134 1135 1136
	struct platform_device *pdev = to_platform_device(dev);
	struct gpio_bank *bank = platform_get_drvdata(pdev);
	void __iomem *base = bank->base;
	unsigned long flags;
1137

1138 1139
	if (!bank->mod_usage || !bank->loses_context)
		return 0;
1140

1141 1142
	if (!bank->regs->wkup_en || !bank->saved_wakeup)
		return 0;
1143

1144 1145 1146 1147
	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);
1148

1149 1150 1151
	return 0;
}
#endif /* CONFIG_PM_SLEEP */
1152

1153
#if defined(CONFIG_PM_RUNTIME)
1154 1155
static void omap_gpio_save_context(struct gpio_bank *bank);
static void omap_gpio_restore_context(struct gpio_bank *bank);
1156

1157
static int omap_gpio_runtime_suspend(struct device *dev)
1158
{
1159 1160 1161 1162
	struct platform_device *pdev = to_platform_device(dev);
	struct gpio_bank *bank = platform_get_drvdata(pdev);
	u32 l1 = 0, l2 = 0;
	unsigned long flags;
1163

1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175
	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;
1176

1177 1178 1179 1180
	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);
1181

1182 1183 1184 1185
	bank->saved_fallingdetect = l1;
	bank->saved_risingdetect = l2;
	l1 &= ~bank->enabled_non_wakeup_gpios;
	l2 &= ~bank->enabled_non_wakeup_gpios;
1186

1187 1188
	__raw_writel(l1, bank->base + bank->regs->fallingdetect);
	__raw_writel(l2, bank->base + bank->regs->risingdetect);
1189

1190
	bank->workaround_enabled = true;
1191

1192
save_gpio_context:
1193 1194
	if (bank->get_context_loss_count)
		bank->context_loss_count =
1195 1196
				bank->get_context_loss_count(bank->dev);

1197
	omap_gpio_save_context(bank);
1198
	_gpio_dbck_disable(bank);
1199
	spin_unlock_irqrestore(&bank->lock, flags);
1200

1201
	return 0;
1202 1203
}

1204
static int omap_gpio_runtime_resume(struct device *dev)
1205
{
1206 1207 1208 1209 1210
	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;
1211

1212
	spin_lock_irqsave(&bank->lock, flags);
1213
	_gpio_dbck_enable(bank);
1214 1215 1216 1217
	if (!bank->enabled_non_wakeup_gpios || !bank->workaround_enabled) {
		spin_unlock_irqrestore(&bank->lock, flags);
		return 0;
	}
1218

1219 1220 1221 1222 1223 1224 1225 1226 1227
	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;
1228
		}
1229
	}
1230

1231 1232 1233 1234 1235
	__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);
1236

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

1246 1247 1248 1249 1250 1251
	/*
	 * 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;
1252

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

1256 1257 1258 1259
	/* 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;
1260

1261 1262
	if (gen) {
		u32 old0, old1;
1263

1264 1265
		old0 = __raw_readl(bank->base + bank->regs->leveldetect0);
		old1 = __raw_readl(bank->base + bank->regs->leveldetect1);
1266

1267 1268
		if (cpu_is_omap24xx() || cpu_is_omap34xx()) {
			__raw_writel(old0 | gen, bank->base +
1269
						bank->regs->leveldetect0);
1270
			__raw_writel(old1 | gen, bank->base +
1271
						bank->regs->leveldetect1);
1272
		}
1273

1274 1275
		if (cpu_is_omap44xx()) {
			__raw_writel(old0 | l, bank->base +
1276
						bank->regs->leveldetect0);
1277
			__raw_writel(old1 | l, bank->base +
1278
						bank->regs->leveldetect1);
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 1305 1306 1307 1308 1309 1310 1311 1312 1313
		__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) {
		if (!bank->mod_usage || !bank->loses_context)
			continue;

		bank->power_mode = pwr_mode;

		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) {
		if (!bank->mod_usage || !bank->loses_context)
			continue;

		pm_runtime_get_sync(bank->dev);
1314 1315 1316
	}
}

1317
#if defined(CONFIG_PM_RUNTIME)
1318
static void omap_gpio_save_context(struct gpio_bank *bank)
1319
{
1320
	bank->context.irqenable1 =
1321
			__raw_readl(bank->base + bank->regs->irqenable);
1322
	bank->context.irqenable2 =
1323
			__raw_readl(bank->base + bank->regs->irqenable2);
1324
	bank->context.wake_en =
1325 1326 1327
			__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);
1328
	bank->context.leveldetect0 =
1329
			__raw_readl(bank->base + bank->regs->leveldetect0);
1330
	bank->context.leveldetect1 =
1331
			__raw_readl(bank->base + bank->regs->leveldetect1);
1332
	bank->context.risingdetect =
1333
			__raw_readl(bank->base + bank->regs->risingdetect);
1334
	bank->context.fallingdetect =
1335 1336
			__raw_readl(bank->base + bank->regs->fallingdetect);
	bank->context.dataout = __raw_readl(bank->base + bank->regs->dataout);
1337 1338
}

1339
static void omap_gpio_restore_context(struct gpio_bank *bank)
1340
{
1341
	__raw_writel(bank->context.irqenable1,
1342
				bank->base + bank->regs->irqenable);
1343
	__raw_writel(bank->context.irqenable2,
1344
				bank->base + bank->regs->irqenable2);
1345
	__raw_writel(bank->context.wake_en,
1346 1347 1348
				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);
1349
	__raw_writel(bank->context.leveldetect0,
1350
				bank->base + bank->regs->leveldetect0);
1351
	__raw_writel(bank->context.leveldetect1,
1352
				bank->base + bank->regs->leveldetect1);
1353
	__raw_writel(bank->context.risingdetect,
1354
				bank->base + bank->regs->risingdetect);
1355
	__raw_writel(bank->context.fallingdetect,
1356 1357
				bank->base + bank->regs->fallingdetect);
	__raw_writel(bank->context.dataout, bank->base + bank->regs->dataout);
1358
}
1359
#endif /* CONFIG_PM_RUNTIME */
1360 1361 1362
#else
#define omap_gpio_suspend NULL
#define omap_gpio_resume NULL
1363 1364
#define omap_gpio_runtime_suspend NULL
#define omap_gpio_runtime_resume NULL
1365 1366
#endif

1367 1368
static const struct dev_pm_ops gpio_pm_ops = {
	SET_SYSTEM_SLEEP_PM_OPS(omap_gpio_suspend, omap_gpio_resume)
1369 1370
	SET_RUNTIME_PM_OPS(omap_gpio_runtime_suspend, omap_gpio_runtime_resume,
									NULL)
1371 1372
};

1373 1374 1375 1376
static struct platform_driver omap_gpio_driver = {
	.probe		= omap_gpio_probe,
	.driver		= {
		.name	= "omap_gpio",
1377
		.pm	= &gpio_pm_ops,
1378 1379 1380
	},
};

1381
/*
1382 1383 1384
 * gpio driver register needs to be done before
 * machine_init functions access gpio APIs.
 * Hence omap_gpio_drv_reg() is a postcore_initcall.
1385
 */
1386
static int __init omap_gpio_drv_reg(void)
1387
{
1388
	return platform_driver_register(&omap_gpio_driver);
1389
}
1390
postcore_initcall(omap_gpio_drv_reg);