gpio-omap.c 44.1 KB
Newer Older
1 2 3
/*
 * Support functions for OMAP GPIO
 *
4
 * Copyright (C) 2003-2005 Nokia Corporation
5
 * Written by Juha Yrjölä <juha.yrjola@nokia.com>
6
 *
7 8 9
 * Copyright (C) 2009 Texas Instruments
 * Added OMAP4 support - Santosh Shilimkar <santosh.shilimkar@ti.com>
 *
10 11 12 13 14 15 16 17
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */

#include <linux/init.h>
#include <linux/module.h>
#include <linux/interrupt.h>
18
#include <linux/syscore_ops.h>
19
#include <linux/err.h>
20
#include <linux/clk.h>
21
#include <linux/io.h>
22
#include <linux/cpu_pm.h>
23
#include <linux/device.h>
24
#include <linux/pm_runtime.h>
25
#include <linux/pm.h>
26 27
#include <linux/of.h>
#include <linux/of_device.h>
28
#include <linux/gpio/driver.h>
29
#include <linux/bitops.h>
30
#include <linux/platform_data/gpio-omap.h>
31

32
#define OMAP4_GPIO_DEBOUNCINGTIME_MASK 0xFF
33

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

49
struct gpio_bank {
50
	void __iomem *base;
51
	int irq;
52 53
	u32 non_wakeup_gpios;
	u32 enabled_non_wakeup_gpios;
54
	struct gpio_regs context;
55
	u32 saved_datain;
56
	u32 level_mask;
57
	u32 toggle_mask;
58
	raw_spinlock_t lock;
59
	raw_spinlock_t wa_lock;
D
David Brownell 已提交
60
	struct gpio_chip chip;
61
	struct clk *dbck;
62 63
	struct notifier_block nb;
	unsigned int is_suspended:1;
C
Charulatha V 已提交
64
	u32 mod_usage;
65
	u32 irq_usage;
66
	u32 dbck_enable_mask;
67
	bool dbck_enabled;
68
	bool is_mpuio;
69
	bool dbck_flag;
70
	bool loses_context;
71
	bool context_valid;
72
	int stride;
73
	u32 width;
74
	int context_loss_count;
75

76
	void (*set_dataout)(struct gpio_bank *bank, unsigned gpio, int enable);
77 78
	void (*set_dataout_multiple)(struct gpio_bank *bank,
				     unsigned long *mask, unsigned long *bits);
79
	int (*get_context_loss_count)(struct device *dev);
80 81

	struct omap_gpio_reg_offs *regs;
82 83
};

84
#define GPIO_MOD_CTRL_BIT	BIT(0)
85

86
#define BANK_USED(bank) (bank->mod_usage || bank->irq_usage)
87
#define LINE_USED(line, offset) (line & (BIT(offset)))
88

89 90
static void omap_gpio_unmask_irq(struct irq_data *d);

91
static inline struct gpio_bank *omap_irq_data_get_bank(struct irq_data *d)
92
{
93
	struct gpio_chip *chip = irq_data_get_irq_chip_data(d);
94
	return gpiochip_get_data(chip);
95 96
}

97 98
static void omap_set_gpio_direction(struct gpio_bank *bank, int gpio,
				    int is_input)
99
{
100
	void __iomem *reg = bank->base;
101 102
	u32 l;

103
	reg += bank->regs->direction;
104
	l = readl_relaxed(reg);
105
	if (is_input)
106
		l |= BIT(gpio);
107
	else
108
		l &= ~(BIT(gpio));
109
	writel_relaxed(l, reg);
110
	bank->context.oe = l;
111 112
}

113 114

/* set data out value using dedicate set/clear register */
115
static void omap_set_gpio_dataout_reg(struct gpio_bank *bank, unsigned offset,
116
				      int enable)
117
{
118
	void __iomem *reg = bank->base;
119
	u32 l = BIT(offset);
120

121
	if (enable) {
122
		reg += bank->regs->set_dataout;
123 124
		bank->context.dataout |= l;
	} else {
125
		reg += bank->regs->clr_dataout;
126 127
		bank->context.dataout &= ~l;
	}
128

129
	writel_relaxed(l, reg);
130 131
}

132
/* set data out value using mask register */
133
static void omap_set_gpio_dataout_mask(struct gpio_bank *bank, unsigned offset,
134
				       int enable)
135
{
136
	void __iomem *reg = bank->base + bank->regs->dataout;
137
	u32 gpio_bit = BIT(offset);
138
	u32 l;
139

140
	l = readl_relaxed(reg);
141 142 143 144
	if (enable)
		l |= gpio_bit;
	else
		l &= ~gpio_bit;
145
	writel_relaxed(l, reg);
146
	bank->context.dataout = l;
147 148
}

149
static int omap_get_gpio_datain(struct gpio_bank *bank, int offset)
150
{
151
	void __iomem *reg = bank->base + bank->regs->datain;
152

153
	return (readl_relaxed(reg) & (BIT(offset))) != 0;
154
}
155

156
static int omap_get_gpio_dataout(struct gpio_bank *bank, int offset)
157
{
158
	void __iomem *reg = bank->base + bank->regs->dataout;
159

160
	return (readl_relaxed(reg) & (BIT(offset))) != 0;
161 162
}

163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207
/* set multiple data out values using dedicate set/clear register */
static void omap_set_gpio_dataout_reg_multiple(struct gpio_bank *bank,
					       unsigned long *mask,
					       unsigned long *bits)
{
	void __iomem *reg = bank->base;
	u32 l;

	l = *bits & *mask;
	writel_relaxed(l, reg + bank->regs->set_dataout);
	bank->context.dataout |= l;

	l = ~*bits & *mask;
	writel_relaxed(l, reg + bank->regs->clr_dataout);
	bank->context.dataout &= ~l;
}

/* set multiple data out values using mask register */
static void omap_set_gpio_dataout_mask_multiple(struct gpio_bank *bank,
						unsigned long *mask,
						unsigned long *bits)
{
	void __iomem *reg = bank->base + bank->regs->dataout;
	u32 l = (readl_relaxed(reg) & ~*mask) | (*bits & *mask);

	writel_relaxed(l, reg);
	bank->context.dataout = l;
}

static unsigned long omap_get_gpio_datain_multiple(struct gpio_bank *bank,
					      unsigned long *mask)
{
	void __iomem *reg = bank->base + bank->regs->datain;

	return readl_relaxed(reg) & *mask;
}

static unsigned long omap_get_gpio_dataout_multiple(struct gpio_bank *bank,
					       unsigned long *mask)
{
	void __iomem *reg = bank->base + bank->regs->dataout;

	return readl_relaxed(reg) & *mask;
}

208
static inline void omap_gpio_rmw(void __iomem *base, u32 reg, u32 mask, bool set)
209
{
210
	int l = readl_relaxed(base + reg);
211

212
	if (set)
213 214 215 216
		l |= mask;
	else
		l &= ~mask;

217
	writel_relaxed(l, base + reg);
218
}
219

220
static inline void omap_gpio_dbck_enable(struct gpio_bank *bank)
221 222
{
	if (bank->dbck_enable_mask && !bank->dbck_enabled) {
223
		clk_enable(bank->dbck);
224
		bank->dbck_enabled = true;
225

226
		writel_relaxed(bank->dbck_enable_mask,
227
			     bank->base + bank->regs->debounce_en);
228 229 230
	}
}

231
static inline void omap_gpio_dbck_disable(struct gpio_bank *bank)
232 233
{
	if (bank->dbck_enable_mask && bank->dbck_enabled) {
234 235 236 237 238
		/*
		 * Disable debounce before cutting it's clock. If debounce is
		 * enabled but the clock is not, GPIO module seems to be unable
		 * to detect events and generate interrupts at least on OMAP3.
		 */
239
		writel_relaxed(0, bank->base + bank->regs->debounce_en);
240

241
		clk_disable(bank->dbck);
242 243 244 245
		bank->dbck_enabled = false;
	}
}

246
/**
247
 * omap2_set_gpio_debounce - low level gpio debounce time
248
 * @bank: the gpio bank we're acting upon
249
 * @offset: the gpio number on this @bank
250 251
 * @debounce: debounce time to use
 *
252 253 254
 * OMAP's debounce time is in 31us steps
 *   <debounce time> = (GPIO_DEBOUNCINGTIME[7:0].DEBOUNCETIME + 1) x 31
 * so we need to convert and round up to the closest unit.
255 256
 *
 * Return: 0 on success, negative error otherwise.
257
 */
258 259
static int omap2_set_gpio_debounce(struct gpio_bank *bank, unsigned offset,
				   unsigned debounce)
260
{
261
	void __iomem		*reg;
262 263
	u32			val;
	u32			l;
264
	bool			enable = !!debounce;
265

266
	if (!bank->dbck_flag)
267
		return -ENOTSUPP;
268

269 270
	if (enable) {
		debounce = DIV_ROUND_UP(debounce, 31) - 1;
271 272
		if ((debounce & OMAP4_GPIO_DEBOUNCINGTIME_MASK) != debounce)
			return -EINVAL;
273
	}
274

275
	l = BIT(offset);
276

277
	clk_enable(bank->dbck);
278
	reg = bank->base + bank->regs->debounce;
279
	writel_relaxed(debounce, reg);
280

281
	reg = bank->base + bank->regs->debounce_en;
282
	val = readl_relaxed(reg);
283

284
	if (enable)
285
		val |= l;
286
	else
287
		val &= ~l;
288
	bank->dbck_enable_mask = val;
289

290
	writel_relaxed(val, reg);
291
	clk_disable(bank->dbck);
292 293 294 295 296 297 298 299
	/*
	 * Enable debounce clock per module.
	 * This call is mandatory because in omap_gpio_request() when
	 * *_runtime_get_sync() is called,  _gpio_dbck_enable() within
	 * runtime callbck fails to turn on dbck because dbck_enable_mask
	 * used within _gpio_dbck_enable() is still not initialized at
	 * that point. Therefore we have to enable dbck here.
	 */
300
	omap_gpio_dbck_enable(bank);
301 302 303 304
	if (bank->dbck_enable_mask) {
		bank->context.debounce = debounce;
		bank->context.debounce_en = val;
	}
305 306

	return 0;
307 308
}

309
/**
310
 * omap_clear_gpio_debounce - clear debounce settings for a gpio
311
 * @bank: the gpio bank we're acting upon
312
 * @offset: the gpio number on this @bank
313 314 315 316 317 318
 *
 * If a gpio is using debounce, then clear the debounce enable bit and if
 * this is the only gpio in this bank using debounce, then clear the debounce
 * time too. The debounce clock will also be disabled when calling this function
 * if this is the only gpio in the bank using debounce.
 */
319
static void omap_clear_gpio_debounce(struct gpio_bank *bank, unsigned offset)
320
{
321
	u32 gpio_bit = BIT(offset);
322 323 324 325 326 327 328 329 330

	if (!bank->dbck_flag)
		return;

	if (!(bank->dbck_enable_mask & gpio_bit))
		return;

	bank->dbck_enable_mask &= ~gpio_bit;
	bank->context.debounce_en &= ~gpio_bit;
331
        writel_relaxed(bank->context.debounce_en,
332 333 334 335
		     bank->base + bank->regs->debounce_en);

	if (!bank->dbck_enable_mask) {
		bank->context.debounce = 0;
336
		writel_relaxed(bank->context.debounce, bank->base +
337
			     bank->regs->debounce);
338
		clk_disable(bank->dbck);
339 340 341 342
		bank->dbck_enabled = false;
	}
}

343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358
/*
 * Off mode wake-up capable GPIOs in bank(s) that are in the wakeup domain.
 * See TRM section for GPIO for "Wake-Up Generation" for the list of GPIOs
 * in wakeup domain. If bank->non_wakeup_gpios is not configured, assume none
 * are capable waking up the system from off mode.
 */
static bool omap_gpio_is_off_wakeup_capable(struct gpio_bank *bank, u32 gpio_mask)
{
	u32 no_wake = bank->non_wakeup_gpios;

	if (no_wake)
		return !!(~no_wake & gpio_mask);

	return false;
}

359
static inline void omap_set_gpio_trigger(struct gpio_bank *bank, int gpio,
360
						unsigned trigger)
361
{
362
	void __iomem *base = bank->base;
363
	u32 gpio_bit = BIT(gpio);
364

365 366 367 368
	omap_gpio_rmw(base, bank->regs->leveldetect0, gpio_bit,
		      trigger & IRQ_TYPE_LEVEL_LOW);
	omap_gpio_rmw(base, bank->regs->leveldetect1, gpio_bit,
		      trigger & IRQ_TYPE_LEVEL_HIGH);
369 370 371 372 373 374

	/*
	 * We need the edge detection enabled for to allow the GPIO block
	 * to be woken from idle state.  Set the appropriate edge detection
	 * in addition to the level detection.
	 */
375
	omap_gpio_rmw(base, bank->regs->risingdetect, gpio_bit,
376
		      trigger & (IRQ_TYPE_EDGE_RISING | IRQ_TYPE_LEVEL_HIGH));
377
	omap_gpio_rmw(base, bank->regs->fallingdetect, gpio_bit,
378
		      trigger & (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_LEVEL_LOW));
379

380
	bank->context.leveldetect0 =
381
			readl_relaxed(bank->base + bank->regs->leveldetect0);
382
	bank->context.leveldetect1 =
383
			readl_relaxed(bank->base + bank->regs->leveldetect1);
384
	bank->context.risingdetect =
385
			readl_relaxed(bank->base + bank->regs->risingdetect);
386
	bank->context.fallingdetect =
387
			readl_relaxed(bank->base + bank->regs->fallingdetect);
388 389

	if (likely(!(bank->non_wakeup_gpios & gpio_bit))) {
390 391 392
		omap_gpio_rmw(base, bank->regs->wkup_en, gpio_bit, trigger != 0);
		bank->context.wake_en =
			readl_relaxed(bank->base + bank->regs->wkup_en);
393
	}
394

395
	/* This part needs to be executed always for OMAP{34xx, 44xx} */
396
	if (!bank->regs->irqctrl && !omap_gpio_is_off_wakeup_capable(bank, gpio)) {
397 398 399 400 401 402 403
		/*
		 * 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)
404 405 406 407
			bank->enabled_non_wakeup_gpios |= gpio_bit;
		else
			bank->enabled_non_wakeup_gpios &= ~gpio_bit;
	}
408

409
	bank->level_mask =
410 411
		readl_relaxed(bank->base + bank->regs->leveldetect0) |
		readl_relaxed(bank->base + bank->regs->leveldetect1);
412 413
}

414
#ifdef CONFIG_ARCH_OMAP1
415 416 417 418
/*
 * 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.
 */
419
static void omap_toggle_gpio_edge_triggering(struct gpio_bank *bank, int gpio)
420 421 422 423
{
	void __iomem *reg = bank->base;
	u32 l = 0;

424
	if (!bank->regs->irqctrl)
425
		return;
426 427

	reg += bank->regs->irqctrl;
428

429
	l = readl_relaxed(reg);
430
	if ((l >> gpio) & 1)
431
		l &= ~(BIT(gpio));
432
	else
433
		l |= BIT(gpio);
434

435
	writel_relaxed(l, reg);
436
}
437
#else
438
static void omap_toggle_gpio_edge_triggering(struct gpio_bank *bank, int gpio) {}
439
#endif
440

441 442
static int omap_set_gpio_triggering(struct gpio_bank *bank, int gpio,
				    unsigned trigger)
443 444
{
	void __iomem *reg = bank->base;
445
	void __iomem *base = bank->base;
446
	u32 l = 0;
447

448
	if (bank->regs->leveldetect0 && bank->regs->wkup_en) {
449
		omap_set_gpio_trigger(bank, gpio, trigger);
450 451 452
	} else if (bank->regs->irqctrl) {
		reg += bank->regs->irqctrl;

453
		l = readl_relaxed(reg);
454
		if ((trigger & IRQ_TYPE_SENSE_MASK) == IRQ_TYPE_EDGE_BOTH)
455
			bank->toggle_mask |= BIT(gpio);
456
		if (trigger & IRQ_TYPE_EDGE_RISING)
457
			l |= BIT(gpio);
458
		else if (trigger & IRQ_TYPE_EDGE_FALLING)
459
			l &= ~(BIT(gpio));
460
		else
461 462
			return -EINVAL;

463
		writel_relaxed(l, reg);
464
	} else if (bank->regs->edgectrl1) {
465
		if (gpio & 0x08)
466
			reg += bank->regs->edgectrl2;
467
		else
468 469
			reg += bank->regs->edgectrl1;

470
		gpio &= 0x07;
471
		l = readl_relaxed(reg);
472
		l &= ~(3 << (gpio << 1));
473
		if (trigger & IRQ_TYPE_EDGE_RISING)
474
			l |= 2 << (gpio << 1);
475
		if (trigger & IRQ_TYPE_EDGE_FALLING)
476
			l |= BIT(gpio << 1);
477 478

		/* Enable wake-up during idle for dynamic tick */
479
		omap_gpio_rmw(base, bank->regs->wkup_en, BIT(gpio), trigger);
480
		bank->context.wake_en =
481 482
			readl_relaxed(bank->base + bank->regs->wkup_en);
		writel_relaxed(l, reg);
483
	}
484
	return 0;
485 486
}

487
static void omap_enable_gpio_module(struct gpio_bank *bank, unsigned offset)
488 489 490 491 492
{
	if (bank->regs->pinctrl) {
		void __iomem *reg = bank->base + bank->regs->pinctrl;

		/* Claim the pin for MPU */
493
		writel_relaxed(readl_relaxed(reg) | (BIT(offset)), reg);
494 495 496 497 498 499
	}

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

500
		ctrl = readl_relaxed(reg);
501 502
		/* Module is enabled, clocks are not gated */
		ctrl &= ~GPIO_MOD_CTRL_BIT;
503
		writel_relaxed(ctrl, reg);
504 505 506 507
		bank->context.ctrl = ctrl;
	}
}

508
static void omap_disable_gpio_module(struct gpio_bank *bank, unsigned offset)
509 510 511 512 513 514 515
{
	void __iomem *base = bank->base;

	if (bank->regs->wkup_en &&
	    !LINE_USED(bank->mod_usage, offset) &&
	    !LINE_USED(bank->irq_usage, offset)) {
		/* Disable wake-up during idle for dynamic tick */
516
		omap_gpio_rmw(base, bank->regs->wkup_en, BIT(offset), 0);
517
		bank->context.wake_en =
518
			readl_relaxed(bank->base + bank->regs->wkup_en);
519 520 521 522 523 524
	}

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

525
		ctrl = readl_relaxed(reg);
526 527
		/* Module is disabled, clocks are gated */
		ctrl |= GPIO_MOD_CTRL_BIT;
528
		writel_relaxed(ctrl, reg);
529 530 531 532
		bank->context.ctrl = ctrl;
	}
}

533
static int omap_gpio_is_input(struct gpio_bank *bank, unsigned offset)
534 535 536
{
	void __iomem *reg = bank->base + bank->regs->direction;

537
	return readl_relaxed(reg) & BIT(offset);
538 539
}

540
static void omap_gpio_init_irq(struct gpio_bank *bank, unsigned offset)
541 542 543 544 545
{
	if (!LINE_USED(bank->mod_usage, offset)) {
		omap_enable_gpio_module(bank, offset);
		omap_set_gpio_direction(bank, offset, 1);
	}
546
	bank->irq_usage |= BIT(offset);
547 548
}

549
static int omap_gpio_irq_type(struct irq_data *d, unsigned type)
550
{
551
	struct gpio_bank *bank = omap_irq_data_get_bank(d);
552
	int retval;
D
David Brownell 已提交
553
	unsigned long flags;
554
	unsigned offset = d->hwirq;
555

556
	if (type & ~IRQ_TYPE_SENSE_MASK)
557
		return -EINVAL;
558

559 560
	if (!bank->regs->leveldetect0 &&
		(type & (IRQ_TYPE_LEVEL_LOW|IRQ_TYPE_LEVEL_HIGH)))
561 562
		return -EINVAL;

563
	raw_spin_lock_irqsave(&bank->lock, flags);
564
	retval = omap_set_gpio_triggering(bank, offset, type);
565
	if (retval) {
566
		raw_spin_unlock_irqrestore(&bank->lock, flags);
567
		goto error;
568
	}
569
	omap_gpio_init_irq(bank, offset);
570
	if (!omap_gpio_is_input(bank, offset)) {
571
		raw_spin_unlock_irqrestore(&bank->lock, flags);
572 573
		retval = -EINVAL;
		goto error;
574
	}
575
	raw_spin_unlock_irqrestore(&bank->lock, flags);
576 577

	if (type & (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH))
578
		irq_set_handler_locked(d, handle_level_irq);
579
	else if (type & (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING))
580 581 582 583 584 585 586
		/*
		 * Edge IRQs are already cleared/acked in irq_handler and
		 * not need to be masked, as result handle_edge_irq()
		 * logic is excessed here and may cause lose of interrupts.
		 * So just use handle_simple_irq.
		 */
		irq_set_handler_locked(d, handle_simple_irq);
587

588 589 590
	return 0;

error:
591
	return retval;
592 593
}

594
static void omap_clear_gpio_irqbank(struct gpio_bank *bank, int gpio_mask)
595
{
596
	void __iomem *reg = bank->base;
597

598
	reg += bank->regs->irqstatus;
599
	writel_relaxed(gpio_mask, reg);
600 601

	/* Workaround for clearing DSP GPIO interrupts to allow retention */
602 603
	if (bank->regs->irqstatus2) {
		reg = bank->base + bank->regs->irqstatus2;
604
		writel_relaxed(gpio_mask, reg);
605
	}
606 607

	/* Flush posted write for the irq status to avoid spurious interrupts */
608
	readl_relaxed(reg);
609 610
}

611 612
static inline void omap_clear_gpio_irqstatus(struct gpio_bank *bank,
					     unsigned offset)
613
{
614
	omap_clear_gpio_irqbank(bank, BIT(offset));
615 616
}

617
static u32 omap_get_gpio_irqbank_mask(struct gpio_bank *bank)
618 619
{
	void __iomem *reg = bank->base;
620
	u32 l;
621
	u32 mask = (BIT(bank->width)) - 1;
622

623
	reg += bank->regs->irqenable;
624
	l = readl_relaxed(reg);
625
	if (bank->regs->irqenable_inv)
626 627 628
		l = ~l;
	l &= mask;
	return l;
629 630
}

631
static void omap_enable_gpio_irqbank(struct gpio_bank *bank, int gpio_mask)
632
{
633
	void __iomem *reg = bank->base;
634 635
	u32 l;

636 637 638
	if (bank->regs->set_irqenable) {
		reg += bank->regs->set_irqenable;
		l = gpio_mask;
639
		bank->context.irqenable1 |= gpio_mask;
640 641
	} else {
		reg += bank->regs->irqenable;
642
		l = readl_relaxed(reg);
643 644
		if (bank->regs->irqenable_inv)
			l &= ~gpio_mask;
645 646
		else
			l |= gpio_mask;
647
		bank->context.irqenable1 = l;
648 649
	}

650
	writel_relaxed(l, reg);
651 652
}

653
static void omap_disable_gpio_irqbank(struct gpio_bank *bank, int gpio_mask)
654 655 656 657 658 659
{
	void __iomem *reg = bank->base;
	u32 l;

	if (bank->regs->clr_irqenable) {
		reg += bank->regs->clr_irqenable;
660
		l = gpio_mask;
661
		bank->context.irqenable1 &= ~gpio_mask;
662 663
	} else {
		reg += bank->regs->irqenable;
664
		l = readl_relaxed(reg);
665
		if (bank->regs->irqenable_inv)
666
			l |= gpio_mask;
667
		else
668
			l &= ~gpio_mask;
669
		bank->context.irqenable1 = l;
670
	}
671

672
	writel_relaxed(l, reg);
673 674
}

675 676
static inline void omap_set_gpio_irqenable(struct gpio_bank *bank,
					   unsigned offset, int enable)
677
{
678
	if (enable)
679
		omap_enable_gpio_irqbank(bank, BIT(offset));
680
	else
681
		omap_disable_gpio_irqbank(bank, BIT(offset));
682 683
}

684
/* Use disable_irq_wake() and enable_irq_wake() functions from drivers */
685
static int omap_gpio_wake_enable(struct irq_data *d, unsigned int enable)
686
{
687
	struct gpio_bank *bank = omap_irq_data_get_bank(d);
688

689
	return irq_set_irq_wake(bank->irq, enable);
690 691
}

692 693 694 695 696 697 698 699 700
/*
 * 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.
 */
701
static irqreturn_t omap_gpio_irq_handler(int irq, void *gpiobank)
702
{
703
	void __iomem *isr_reg = NULL;
704
	u32 enabled, isr, edge;
705
	unsigned int bit;
706 707
	struct gpio_bank *bank = gpiobank;
	unsigned long wa_lock_flags;
708
	unsigned long lock_flags;
709

710
	isr_reg = bank->base + bank->regs->irqstatus;
711 712 713
	if (WARN_ON(!isr_reg))
		goto exit;

714 715 716
	if (WARN_ONCE(!pm_runtime_active(bank->chip.parent),
		      "gpio irq%i while runtime suspended?\n", irq))
		return IRQ_NONE;
717

718
	while (1) {
719 720
		raw_spin_lock_irqsave(&bank->lock, lock_flags);

721
		enabled = omap_get_gpio_irqbank_mask(bank);
722
		isr = readl_relaxed(isr_reg) & enabled;
723

724 725 726 727 728 729 730 731
		/*
		 * Clear edge sensitive interrupts before calling handler(s)
		 * so subsequent edge transitions are not missed while the
		 * handlers are running.
		 */
		edge = isr & ~bank->level_mask;
		if (edge)
			omap_clear_gpio_irqbank(bank, edge);
732

733 734
		raw_spin_unlock_irqrestore(&bank->lock, lock_flags);

735 736 737
		if (!isr)
			break;

738 739
		while (isr) {
			bit = __ffs(isr);
740
			isr &= ~(BIT(bit));
741

742
			raw_spin_lock_irqsave(&bank->lock, lock_flags);
743 744 745 746 747 748 749
			/*
			 * 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.
			 */
750
			if (bank->toggle_mask & (BIT(bit)))
751
				omap_toggle_gpio_edge_triggering(bank, bit);
752

753 754
			raw_spin_unlock_irqrestore(&bank->lock, lock_flags);

755 756
			raw_spin_lock_irqsave(&bank->wa_lock, wa_lock_flags);

757
			generic_handle_irq(irq_find_mapping(bank->chip.irq.domain,
758
							    bit));
759 760 761

			raw_spin_unlock_irqrestore(&bank->wa_lock,
						   wa_lock_flags);
762
		}
763
	}
764
exit:
765
	return IRQ_HANDLED;
766 767
}

768 769 770 771
static unsigned int omap_gpio_irq_startup(struct irq_data *d)
{
	struct gpio_bank *bank = omap_irq_data_get_bank(d);
	unsigned long flags;
772
	unsigned offset = d->hwirq;
773

774
	raw_spin_lock_irqsave(&bank->lock, flags);
775 776 777 778 779 780 781 782

	if (!LINE_USED(bank->mod_usage, offset))
		omap_set_gpio_direction(bank, offset, 1);
	else if (!omap_gpio_is_input(bank, offset))
		goto err;
	omap_enable_gpio_module(bank, offset);
	bank->irq_usage |= BIT(offset);

783
	raw_spin_unlock_irqrestore(&bank->lock, flags);
784 785 786
	omap_gpio_unmask_irq(d);

	return 0;
787
err:
788
	raw_spin_unlock_irqrestore(&bank->lock, flags);
789
	return -EINVAL;
790 791
}

792
static void omap_gpio_irq_shutdown(struct irq_data *d)
793
{
794
	struct gpio_bank *bank = omap_irq_data_get_bank(d);
795
	unsigned long flags;
796
	unsigned offset = d->hwirq;
797

798
	raw_spin_lock_irqsave(&bank->lock, flags);
799
	bank->irq_usage &= ~(BIT(offset));
800
	omap_set_gpio_triggering(bank, offset, IRQ_TYPE_NONE);
801 802
	omap_clear_gpio_irqstatus(bank, offset);
	omap_set_gpio_irqenable(bank, offset, 0);
803 804
	if (!LINE_USED(bank->mod_usage, offset))
		omap_clear_gpio_debounce(bank, offset);
805
	omap_disable_gpio_module(bank, offset);
806
	raw_spin_unlock_irqrestore(&bank->lock, flags);
807 808 809 810 811 812
}

static void omap_gpio_irq_bus_lock(struct irq_data *data)
{
	struct gpio_bank *bank = omap_irq_data_get_bank(data);

813
	pm_runtime_get_sync(bank->chip.parent);
814 815 816 817 818
}

static void gpio_irq_bus_sync_unlock(struct irq_data *data)
{
	struct gpio_bank *bank = omap_irq_data_get_bank(data);
819

820
	pm_runtime_put(bank->chip.parent);
821 822
}

823
static void omap_gpio_mask_irq(struct irq_data *d)
824
{
825
	struct gpio_bank *bank = omap_irq_data_get_bank(d);
826
	unsigned offset = d->hwirq;
827
	unsigned long flags;
828

829
	raw_spin_lock_irqsave(&bank->lock, flags);
830
	omap_set_gpio_triggering(bank, offset, IRQ_TYPE_NONE);
831
	omap_set_gpio_irqenable(bank, offset, 0);
832
	raw_spin_unlock_irqrestore(&bank->lock, flags);
833 834
}

835
static void omap_gpio_unmask_irq(struct irq_data *d)
836
{
837
	struct gpio_bank *bank = omap_irq_data_get_bank(d);
838
	unsigned offset = d->hwirq;
839
	u32 trigger = irqd_get_trigger_type(d);
840
	unsigned long flags;
841

842
	raw_spin_lock_irqsave(&bank->lock, flags);
843 844 845 846 847 848 849
	omap_set_gpio_irqenable(bank, offset, 1);

	/*
	 * For level-triggered GPIOs, clearing must be done after the source
	 * is cleared, thus after the handler has run. OMAP4 needs this done
	 * after enabing the interrupt to clear the wakeup status.
	 */
850 851
	if (bank->regs->leveldetect0 && bank->regs->wkup_en &&
	    trigger & (IRQ_TYPE_LEVEL_HIGH | IRQ_TYPE_LEVEL_LOW))
852
		omap_clear_gpio_irqstatus(bank, offset);
853

854 855 856
	if (trigger)
		omap_set_gpio_triggering(bank, offset, trigger);

857
	raw_spin_unlock_irqrestore(&bank->lock, flags);
858 859
}

860 861
/*---------------------------------------------------------------------*/

862
static int omap_mpuio_suspend_noirq(struct device *dev)
D
David Brownell 已提交
863
{
864
	struct gpio_bank	*bank = dev_get_drvdata(dev);
865 866
	void __iomem		*mask_reg = bank->base +
					OMAP_MPUIO_GPIO_MASKIT / bank->stride;
D
David Brownell 已提交
867
	unsigned long		flags;
D
David Brownell 已提交
868

869
	raw_spin_lock_irqsave(&bank->lock, flags);
870
	writel_relaxed(0xffff & ~bank->context.wake_en, mask_reg);
871
	raw_spin_unlock_irqrestore(&bank->lock, flags);
D
David Brownell 已提交
872 873 874 875

	return 0;
}

876
static int omap_mpuio_resume_noirq(struct device *dev)
D
David Brownell 已提交
877
{
878
	struct gpio_bank	*bank = dev_get_drvdata(dev);
879 880
	void __iomem		*mask_reg = bank->base +
					OMAP_MPUIO_GPIO_MASKIT / bank->stride;
D
David Brownell 已提交
881
	unsigned long		flags;
D
David Brownell 已提交
882

883
	raw_spin_lock_irqsave(&bank->lock, flags);
884
	writel_relaxed(bank->context.wake_en, mask_reg);
885
	raw_spin_unlock_irqrestore(&bank->lock, flags);
D
David Brownell 已提交
886 887 888 889

	return 0;
}

890
static const struct dev_pm_ops omap_mpuio_dev_pm_ops = {
891 892 893 894
	.suspend_noirq = omap_mpuio_suspend_noirq,
	.resume_noirq = omap_mpuio_resume_noirq,
};

895
/* use platform_driver for this. */
D
David Brownell 已提交
896 897 898
static struct platform_driver omap_mpuio_driver = {
	.driver		= {
		.name	= "mpuio",
899
		.pm	= &omap_mpuio_dev_pm_ops,
D
David Brownell 已提交
900 901 902 903 904 905 906 907 908 909 910 911
	},
};

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

912
static inline void omap_mpuio_init(struct gpio_bank *bank)
D
David Brownell 已提交
913
{
914
	platform_set_drvdata(&omap_mpuio_device, bank);
915

D
David Brownell 已提交
916 917 918 919
	if (platform_driver_register(&omap_mpuio_driver) == 0)
		(void) platform_device_register(&omap_mpuio_device);
}

920
/*---------------------------------------------------------------------*/
921

922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953
static int omap_gpio_request(struct gpio_chip *chip, unsigned offset)
{
	struct gpio_bank *bank = gpiochip_get_data(chip);
	unsigned long flags;

	pm_runtime_get_sync(chip->parent);

	raw_spin_lock_irqsave(&bank->lock, flags);
	omap_enable_gpio_module(bank, offset);
	bank->mod_usage |= BIT(offset);
	raw_spin_unlock_irqrestore(&bank->lock, flags);

	return 0;
}

static void omap_gpio_free(struct gpio_chip *chip, unsigned offset)
{
	struct gpio_bank *bank = gpiochip_get_data(chip);
	unsigned long flags;

	raw_spin_lock_irqsave(&bank->lock, flags);
	bank->mod_usage &= ~(BIT(offset));
	if (!LINE_USED(bank->irq_usage, offset)) {
		omap_set_gpio_direction(bank, offset, 1);
		omap_clear_gpio_debounce(bank, offset);
	}
	omap_disable_gpio_module(bank, offset);
	raw_spin_unlock_irqrestore(&bank->lock, flags);

	pm_runtime_put(chip->parent);
}

954
static int omap_gpio_get_direction(struct gpio_chip *chip, unsigned offset)
955
{
956
	struct gpio_bank *bank = gpiochip_get_data(chip);
957

958 959
	return !!(readl_relaxed(bank->base + bank->regs->direction) &
		  BIT(offset));
960 961
}

962
static int omap_gpio_input(struct gpio_chip *chip, unsigned offset)
D
David Brownell 已提交
963 964 965 966
{
	struct gpio_bank *bank;
	unsigned long flags;

967
	bank = gpiochip_get_data(chip);
968
	raw_spin_lock_irqsave(&bank->lock, flags);
969
	omap_set_gpio_direction(bank, offset, 1);
970
	raw_spin_unlock_irqrestore(&bank->lock, flags);
D
David Brownell 已提交
971 972 973
	return 0;
}

974
static int omap_gpio_get(struct gpio_chip *chip, unsigned offset)
D
David Brownell 已提交
975
{
976 977
	struct gpio_bank *bank;

978
	bank = gpiochip_get_data(chip);
979

980
	if (omap_gpio_is_input(bank, offset))
981
		return omap_get_gpio_datain(bank, offset);
982
	else
983
		return omap_get_gpio_dataout(bank, offset);
D
David Brownell 已提交
984 985
}

986
static int omap_gpio_output(struct gpio_chip *chip, unsigned offset, int value)
D
David Brownell 已提交
987 988 989 990
{
	struct gpio_bank *bank;
	unsigned long flags;

991
	bank = gpiochip_get_data(chip);
992
	raw_spin_lock_irqsave(&bank->lock, flags);
993
	bank->set_dataout(bank, offset, value);
994
	omap_set_gpio_direction(bank, offset, 0);
995
	raw_spin_unlock_irqrestore(&bank->lock, flags);
996
	return 0;
D
David Brownell 已提交
997 998
}

999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018
static int omap_gpio_get_multiple(struct gpio_chip *chip, unsigned long *mask,
				  unsigned long *bits)
{
	struct gpio_bank *bank = gpiochip_get_data(chip);
	void __iomem *reg = bank->base + bank->regs->direction;
	unsigned long in = readl_relaxed(reg), l;

	*bits = 0;

	l = in & *mask;
	if (l)
		*bits |= omap_get_gpio_datain_multiple(bank, &l);

	l = ~in & *mask;
	if (l)
		*bits |= omap_get_gpio_dataout_multiple(bank, &l);

	return 0;
}

1019 1020
static int omap_gpio_debounce(struct gpio_chip *chip, unsigned offset,
			      unsigned debounce)
1021 1022 1023
{
	struct gpio_bank *bank;
	unsigned long flags;
1024
	int ret;
1025

1026
	bank = gpiochip_get_data(chip);
1027

1028
	raw_spin_lock_irqsave(&bank->lock, flags);
1029
	ret = omap2_set_gpio_debounce(bank, offset, debounce);
1030
	raw_spin_unlock_irqrestore(&bank->lock, flags);
1031

1032 1033 1034 1035 1036 1037
	if (ret)
		dev_info(chip->parent,
			 "Could not set line %u debounce to %u microseconds (%d)",
			 offset, debounce, ret);

	return ret;
1038 1039
}

1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051
static int omap_gpio_set_config(struct gpio_chip *chip, unsigned offset,
				unsigned long config)
{
	u32 debounce;

	if (pinconf_to_config_param(config) != PIN_CONFIG_INPUT_DEBOUNCE)
		return -ENOTSUPP;

	debounce = pinconf_to_config_argument(config);
	return omap_gpio_debounce(chip, offset, debounce);
}

1052
static void omap_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
D
David Brownell 已提交
1053 1054 1055 1056
{
	struct gpio_bank *bank;
	unsigned long flags;

1057
	bank = gpiochip_get_data(chip);
1058
	raw_spin_lock_irqsave(&bank->lock, flags);
1059
	bank->set_dataout(bank, offset, value);
1060
	raw_spin_unlock_irqrestore(&bank->lock, flags);
D
David Brownell 已提交
1061 1062
}

1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073
static void omap_gpio_set_multiple(struct gpio_chip *chip, unsigned long *mask,
				   unsigned long *bits)
{
	struct gpio_bank *bank = gpiochip_get_data(chip);
	unsigned long flags;

	raw_spin_lock_irqsave(&bank->lock, flags);
	bank->set_dataout_multiple(bank, mask, bits);
	raw_spin_unlock_irqrestore(&bank->lock, flags);
}

D
David Brownell 已提交
1074 1075
/*---------------------------------------------------------------------*/

1076
static void omap_gpio_show_rev(struct gpio_bank *bank)
T
Tony Lindgren 已提交
1077
{
1078
	static bool called;
T
Tony Lindgren 已提交
1079 1080
	u32 rev;

1081
	if (called || bank->regs->revision == USHRT_MAX)
T
Tony Lindgren 已提交
1082 1083
		return;

1084
	rev = readw_relaxed(bank->base + bank->regs->revision);
1085
	pr_info("OMAP GPIO hardware version %d.%d\n",
T
Tony Lindgren 已提交
1086
		(rev >> 4) & 0x0f, rev & 0x0f);
1087 1088

	called = true;
T
Tony Lindgren 已提交
1089 1090
}

1091
static void omap_gpio_mod_init(struct gpio_bank *bank)
1092
{
1093 1094
	void __iomem *base = bank->base;
	u32 l = 0xffffffff;
1095

1096 1097 1098
	if (bank->width == 16)
		l = 0xffff;

1099
	if (bank->is_mpuio) {
1100
		writel_relaxed(l, bank->base + bank->regs->irqenable);
1101
		return;
1102
	}
1103

1104 1105 1106 1107
	omap_gpio_rmw(base, bank->regs->irqenable, l,
		      bank->regs->irqenable_inv);
	omap_gpio_rmw(base, bank->regs->irqstatus, l,
		      !bank->regs->irqenable_inv);
1108
	if (bank->regs->debounce_en)
1109
		writel_relaxed(0, base + bank->regs->debounce_en);
1110

1111
	/* Save OE default value (0xffffffff) in the context */
1112
	bank->context.oe = readl_relaxed(bank->base + bank->regs->direction);
1113 1114
	 /* Initialize interface clk ungated, module enabled */
	if (bank->regs->ctrl)
1115
		writel_relaxed(0, base + bank->regs->ctrl);
1116 1117
}

N
Nishanth Menon 已提交
1118
static int omap_gpio_chip_init(struct gpio_bank *bank, struct irq_chip *irqc)
1119
{
1120
	struct gpio_irq_chip *irq;
1121
	static int gpio;
1122
	const char *label;
1123
	int irq_base = 0;
1124
	int ret;
1125 1126 1127 1128 1129 1130 1131

	/*
	 * 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;
1132 1133 1134
	bank->chip.get_direction = omap_gpio_get_direction;
	bank->chip.direction_input = omap_gpio_input;
	bank->chip.get = omap_gpio_get;
1135
	bank->chip.get_multiple = omap_gpio_get_multiple;
1136
	bank->chip.direction_output = omap_gpio_output;
1137
	bank->chip.set_config = omap_gpio_set_config;
1138
	bank->chip.set = omap_gpio_set;
1139
	bank->chip.set_multiple = omap_gpio_set_multiple;
1140
	if (bank->is_mpuio) {
1141
		bank->chip.label = "mpuio";
1142
		if (bank->regs->wkup_en)
1143
			bank->chip.parent = &omap_mpuio_device.dev;
1144 1145
		bank->chip.base = OMAP_MPUIO(0);
	} else {
1146 1147 1148 1149 1150
		label = devm_kasprintf(bank->chip.parent, GFP_KERNEL, "gpio-%d-%d",
				       gpio, gpio + bank->width - 1);
		if (!label)
			return -ENOMEM;
		bank->chip.label = label;
1151 1152
		bank->chip.base = gpio;
	}
1153
	bank->chip.ngpio = bank->width;
1154

1155 1156 1157 1158 1159
#ifdef CONFIG_ARCH_OMAP1
	/*
	 * REVISIT: Once we have OMAP1 supporting SPARSE_IRQ, we can drop
	 * irq_alloc_descs() since a base IRQ offset will no longer be needed.
	 */
1160 1161
	irq_base = devm_irq_alloc_descs(bank->chip.parent,
					-1, 0, bank->width, 0);
1162
	if (irq_base < 0) {
1163
		dev_err(bank->chip.parent, "Couldn't allocate IRQ numbers\n");
1164 1165 1166 1167
		return -ENODEV;
	}
#endif

1168
	/* MPUIO is a bit different, reading IRQ status clears it */
R
Russell King 已提交
1169 1170
	if (bank->is_mpuio && !bank->regs->wkup_en)
		irqc->irq_set_wake = NULL;
1171

1172 1173 1174 1175 1176 1177 1178
	irq = &bank->chip.irq;
	irq->chip = irqc;
	irq->handler = handle_bad_irq;
	irq->default_type = IRQ_TYPE_NONE;
	irq->num_parents = 1;
	irq->parents = &bank->irq;
	irq->first = irq_base;
1179

1180
	ret = gpiochip_add_data(&bank->chip, bank);
1181
	if (ret) {
1182
		dev_err(bank->chip.parent,
1183 1184
			"Could not register gpio chip %d\n", ret);
		return ret;
1185 1186
	}

1187 1188 1189
	ret = devm_request_irq(bank->chip.parent, bank->irq,
			       omap_gpio_irq_handler,
			       0, dev_name(bank->chip.parent), bank);
1190 1191 1192
	if (ret)
		gpiochip_remove(&bank->chip);

1193 1194 1195
	if (!bank->is_mpuio)
		gpio += bank->width;

1196
	return ret;
1197 1198
}

A
Arnd Bergmann 已提交
1199
static void omap_gpio_init_context(struct gpio_bank *p)
1200
{
A
Arnd Bergmann 已提交
1201 1202
	struct omap_gpio_reg_offs *regs = p->regs;
	void __iomem *base = p->base;
1203

A
Arnd Bergmann 已提交
1204 1205 1206 1207 1208 1209 1210 1211 1212
	p->context.ctrl		= readl_relaxed(base + regs->ctrl);
	p->context.oe		= readl_relaxed(base + regs->direction);
	p->context.wake_en	= readl_relaxed(base + regs->wkup_en);
	p->context.leveldetect0	= readl_relaxed(base + regs->leveldetect0);
	p->context.leveldetect1	= readl_relaxed(base + regs->leveldetect1);
	p->context.risingdetect	= readl_relaxed(base + regs->risingdetect);
	p->context.fallingdetect = readl_relaxed(base + regs->fallingdetect);
	p->context.irqenable1	= readl_relaxed(base + regs->irqenable);
	p->context.irqenable2	= readl_relaxed(base + regs->irqenable2);
1213

A
Arnd Bergmann 已提交
1214 1215 1216 1217
	if (regs->set_dataout && p->regs->clr_dataout)
		p->context.dataout = readl_relaxed(base + regs->set_dataout);
	else
		p->context.dataout = readl_relaxed(base + regs->dataout);
1218

A
Arnd Bergmann 已提交
1219
	p->context_valid = true;
1220 1221
}

A
Arnd Bergmann 已提交
1222
static void omap_gpio_restore_context(struct gpio_bank *bank)
1223
{
A
Arnd Bergmann 已提交
1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241
	writel_relaxed(bank->context.wake_en,
				bank->base + bank->regs->wkup_en);
	writel_relaxed(bank->context.ctrl, bank->base + bank->regs->ctrl);
	writel_relaxed(bank->context.leveldetect0,
				bank->base + bank->regs->leveldetect0);
	writel_relaxed(bank->context.leveldetect1,
				bank->base + bank->regs->leveldetect1);
	writel_relaxed(bank->context.risingdetect,
				bank->base + bank->regs->risingdetect);
	writel_relaxed(bank->context.fallingdetect,
				bank->base + bank->regs->fallingdetect);
	if (bank->regs->set_dataout && bank->regs->clr_dataout)
		writel_relaxed(bank->context.dataout,
				bank->base + bank->regs->set_dataout);
	else
		writel_relaxed(bank->context.dataout,
				bank->base + bank->regs->dataout);
	writel_relaxed(bank->context.oe, bank->base + bank->regs->direction);
T
Tony Lindgren 已提交
1242

A
Arnd Bergmann 已提交
1243 1244 1245 1246 1247
	if (bank->dbck_enable_mask) {
		writel_relaxed(bank->context.debounce, bank->base +
					bank->regs->debounce);
		writel_relaxed(bank->context.debounce_en,
					bank->base + bank->regs->debounce_en);
1248 1249
	}

A
Arnd Bergmann 已提交
1250 1251 1252 1253
	writel_relaxed(bank->context.irqenable1,
				bank->base + bank->regs->irqenable);
	writel_relaxed(bank->context.irqenable2,
				bank->base + bank->regs->irqenable2);
1254 1255
}

1256
static void omap_gpio_idle(struct gpio_bank *bank, bool may_lose_context)
1257
{
1258
	struct device *dev = bank->chip.parent;
1259 1260 1261 1262
	void __iomem *base = bank->base;
	u32 nowake;

	bank->saved_datain = readl_relaxed(base + bank->regs->datain);
1263

1264 1265 1266
	if (!bank->enabled_non_wakeup_gpios)
		goto update_gpio_context_count;

1267
	if (!may_lose_context)
1268
		goto update_gpio_context_count;
1269

1270
	/*
1271
	 * If going to OFF, remove triggering for all wkup domain
1272 1273 1274
	 * non-wakeup GPIOs.  Otherwise spurious IRQs will be
	 * generated.  See OMAP2420 Errata item 1.101.
	 */
1275 1276 1277 1278 1279
	if (!bank->loses_context && bank->enabled_non_wakeup_gpios) {
		nowake = bank->enabled_non_wakeup_gpios;
		omap_gpio_rmw(base, bank->regs->fallingdetect, nowake, ~nowake);
		omap_gpio_rmw(base, bank->regs->risingdetect, nowake, ~nowake);
	}
1280

1281
update_gpio_context_count:
1282 1283
	if (bank->get_context_loss_count)
		bank->context_loss_count =
1284
				bank->get_context_loss_count(dev);
1285

1286
	omap_gpio_dbck_disable(bank);
1287 1288
}

1289
static void omap_gpio_unidle(struct gpio_bank *bank)
1290
{
1291
	struct device *dev = bank->chip.parent;
1292
	u32 l = 0, gen, gen0, gen1;
1293
	int c;
1294

1295 1296 1297 1298 1299 1300 1301 1302 1303 1304
	/*
	 * On the first resume during the probe, the context has not
	 * been initialised and so initialise it now. Also initialise
	 * the context loss count.
	 */
	if (bank->loses_context && !bank->context_valid) {
		omap_gpio_init_context(bank);

		if (bank->get_context_loss_count)
			bank->context_loss_count =
1305
				bank->get_context_loss_count(dev);
1306 1307
	}

1308
	omap_gpio_dbck_enable(bank);
1309

1310 1311
	if (bank->loses_context) {
		if (!bank->get_context_loss_count) {
1312 1313
			omap_gpio_restore_context(bank);
		} else {
1314
			c = bank->get_context_loss_count(dev);
1315 1316 1317
			if (c != bank->context_loss_count) {
				omap_gpio_restore_context(bank);
			} else {
1318
				return;
1319
			}
1320
		}
1321 1322 1323 1324 1325 1326
	} else {
		/* Restore changes done for OMAP2420 errata 1.101 */
		writel_relaxed(bank->context.fallingdetect,
			       bank->base + bank->regs->fallingdetect);
		writel_relaxed(bank->context.risingdetect,
			       bank->base + bank->regs->risingdetect);
1327
	}
1328

1329
	l = readl_relaxed(bank->base + bank->regs->datain);
1330

1331 1332 1333 1334 1335 1336 1337 1338
	/*
	 * 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;
1339

1340 1341 1342 1343
	/*
	 * No need to generate IRQs for the rising edge for gpio IRQs
	 * configured with falling edge only; and vice versa.
	 */
1344
	gen0 = l & bank->context.fallingdetect;
1345
	gen0 &= bank->saved_datain;
1346

1347
	gen1 = l & bank->context.risingdetect;
1348
	gen1 &= ~(bank->saved_datain);
1349

1350
	/* FIXME: Consider GPIO IRQs with level detections properly! */
1351 1352
	gen = l & (~(bank->context.fallingdetect) &
					 ~(bank->context.risingdetect));
1353 1354
	/* Consider all GPIO IRQs needed to be updated */
	gen |= gen0 | gen1;
1355

1356 1357
	if (gen) {
		u32 old0, old1;
1358

1359 1360
		old0 = readl_relaxed(bank->base + bank->regs->leveldetect0);
		old1 = readl_relaxed(bank->base + bank->regs->leveldetect1);
1361

1362
		if (!bank->regs->irqstatus_raw0) {
1363
			writel_relaxed(old0 | gen, bank->base +
1364
						bank->regs->leveldetect0);
1365
			writel_relaxed(old1 | gen, bank->base +
1366
						bank->regs->leveldetect1);
1367
		}
1368

1369
		if (bank->regs->irqstatus_raw0) {
1370
			writel_relaxed(old0 | l, bank->base +
1371
						bank->regs->leveldetect0);
1372
			writel_relaxed(old1 | l, bank->base +
1373
						bank->regs->leveldetect1);
1374
		}
1375 1376
		writel_relaxed(old0, bank->base + bank->regs->leveldetect0);
		writel_relaxed(old1, bank->base + bank->regs->leveldetect1);
1377 1378 1379
	}
}

A
Arnd Bergmann 已提交
1380 1381
static int gpio_omap_cpu_notifier(struct notifier_block *nb,
				  unsigned long cmd, void *v)
1382
{
A
Arnd Bergmann 已提交
1383 1384
	struct gpio_bank *bank;
	unsigned long flags;
1385

A
Arnd Bergmann 已提交
1386
	bank = container_of(nb, struct gpio_bank, nb);
1387

A
Arnd Bergmann 已提交
1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402
	raw_spin_lock_irqsave(&bank->lock, flags);
	switch (cmd) {
	case CPU_CLUSTER_PM_ENTER:
		if (bank->is_suspended)
			break;
		omap_gpio_idle(bank, true);
		break;
	case CPU_CLUSTER_PM_ENTER_FAILED:
	case CPU_CLUSTER_PM_EXIT:
		if (bank->is_suspended)
			break;
		omap_gpio_unidle(bank);
		break;
	}
	raw_spin_unlock_irqrestore(&bank->lock, flags);
1403

A
Arnd Bergmann 已提交
1404
	return NOTIFY_OK;
1405 1406
}

1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438
static struct omap_gpio_reg_offs omap2_gpio_regs = {
	.revision =		OMAP24XX_GPIO_REVISION,
	.direction =		OMAP24XX_GPIO_OE,
	.datain =		OMAP24XX_GPIO_DATAIN,
	.dataout =		OMAP24XX_GPIO_DATAOUT,
	.set_dataout =		OMAP24XX_GPIO_SETDATAOUT,
	.clr_dataout =		OMAP24XX_GPIO_CLEARDATAOUT,
	.irqstatus =		OMAP24XX_GPIO_IRQSTATUS1,
	.irqstatus2 =		OMAP24XX_GPIO_IRQSTATUS2,
	.irqenable =		OMAP24XX_GPIO_IRQENABLE1,
	.irqenable2 =		OMAP24XX_GPIO_IRQENABLE2,
	.set_irqenable =	OMAP24XX_GPIO_SETIRQENABLE1,
	.clr_irqenable =	OMAP24XX_GPIO_CLEARIRQENABLE1,
	.debounce =		OMAP24XX_GPIO_DEBOUNCE_VAL,
	.debounce_en =		OMAP24XX_GPIO_DEBOUNCE_EN,
	.ctrl =			OMAP24XX_GPIO_CTRL,
	.wkup_en =		OMAP24XX_GPIO_WAKE_EN,
	.leveldetect0 =		OMAP24XX_GPIO_LEVELDETECT0,
	.leveldetect1 =		OMAP24XX_GPIO_LEVELDETECT1,
	.risingdetect =		OMAP24XX_GPIO_RISINGDETECT,
	.fallingdetect =	OMAP24XX_GPIO_FALLINGDETECT,
};

static struct omap_gpio_reg_offs omap4_gpio_regs = {
	.revision =		OMAP4_GPIO_REVISION,
	.direction =		OMAP4_GPIO_OE,
	.datain =		OMAP4_GPIO_DATAIN,
	.dataout =		OMAP4_GPIO_DATAOUT,
	.set_dataout =		OMAP4_GPIO_SETDATAOUT,
	.clr_dataout =		OMAP4_GPIO_CLEARDATAOUT,
	.irqstatus =		OMAP4_GPIO_IRQSTATUS0,
	.irqstatus2 =		OMAP4_GPIO_IRQSTATUS1,
1439 1440
	.irqstatus_raw0 =	OMAP4_GPIO_IRQSTATUSRAW0,
	.irqstatus_raw1 =	OMAP4_GPIO_IRQSTATUSRAW1,
1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454
	.irqenable =		OMAP4_GPIO_IRQSTATUSSET0,
	.irqenable2 =		OMAP4_GPIO_IRQSTATUSSET1,
	.set_irqenable =	OMAP4_GPIO_IRQSTATUSSET0,
	.clr_irqenable =	OMAP4_GPIO_IRQSTATUSCLR0,
	.debounce =		OMAP4_GPIO_DEBOUNCINGTIME,
	.debounce_en =		OMAP4_GPIO_DEBOUNCENABLE,
	.ctrl =			OMAP4_GPIO_CTRL,
	.wkup_en =		OMAP4_GPIO_IRQWAKEN0,
	.leveldetect0 =		OMAP4_GPIO_LEVELDETECT0,
	.leveldetect1 =		OMAP4_GPIO_LEVELDETECT1,
	.risingdetect =		OMAP4_GPIO_RISINGDETECT,
	.fallingdetect =	OMAP4_GPIO_FALLINGDETECT,
};

1455
static const struct omap_gpio_platform_data omap2_pdata = {
1456 1457 1458 1459 1460
	.regs = &omap2_gpio_regs,
	.bank_width = 32,
	.dbck_flag = false,
};

1461
static const struct omap_gpio_platform_data omap3_pdata = {
1462 1463 1464 1465 1466
	.regs = &omap2_gpio_regs,
	.bank_width = 32,
	.dbck_flag = true,
};

1467
static const struct omap_gpio_platform_data omap4_pdata = {
1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488
	.regs = &omap4_gpio_regs,
	.bank_width = 32,
	.dbck_flag = true,
};

static const struct of_device_id omap_gpio_match[] = {
	{
		.compatible = "ti,omap4-gpio",
		.data = &omap4_pdata,
	},
	{
		.compatible = "ti,omap3-gpio",
		.data = &omap3_pdata,
	},
	{
		.compatible = "ti,omap2-gpio",
		.data = &omap2_pdata,
	},
	{ },
};
MODULE_DEVICE_TABLE(of, omap_gpio_match);
A
Arnd Bergmann 已提交
1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515

static int omap_gpio_probe(struct platform_device *pdev)
{
	struct device *dev = &pdev->dev;
	struct device_node *node = dev->of_node;
	const struct of_device_id *match;
	const struct omap_gpio_platform_data *pdata;
	struct gpio_bank *bank;
	struct irq_chip *irqc;
	int ret;

	match = of_match_device(of_match_ptr(omap_gpio_match), dev);

	pdata = match ? match->data : dev_get_platdata(dev);
	if (!pdata)
		return -EINVAL;

	bank = devm_kzalloc(dev, sizeof(*bank), GFP_KERNEL);
	if (!bank)
		return -ENOMEM;

	irqc = devm_kzalloc(dev, sizeof(*irqc), GFP_KERNEL);
	if (!irqc)
		return -ENOMEM;

	irqc->irq_startup = omap_gpio_irq_startup,
	irqc->irq_shutdown = omap_gpio_irq_shutdown,
R
Russell King 已提交
1516
	irqc->irq_ack = dummy_irq_chip.irq_ack,
A
Arnd Bergmann 已提交
1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546
	irqc->irq_mask = omap_gpio_mask_irq,
	irqc->irq_unmask = omap_gpio_unmask_irq,
	irqc->irq_set_type = omap_gpio_irq_type,
	irqc->irq_set_wake = omap_gpio_wake_enable,
	irqc->irq_bus_lock = omap_gpio_irq_bus_lock,
	irqc->irq_bus_sync_unlock = gpio_irq_bus_sync_unlock,
	irqc->name = dev_name(&pdev->dev);
	irqc->flags = IRQCHIP_MASK_ON_SUSPEND;
	irqc->parent_device = dev;

	bank->irq = platform_get_irq(pdev, 0);
	if (bank->irq <= 0) {
		if (!bank->irq)
			bank->irq = -ENXIO;
		if (bank->irq != -EPROBE_DEFER)
			dev_err(dev,
				"can't get irq resource ret=%d\n", bank->irq);
		return bank->irq;
	}

	bank->chip.parent = dev;
	bank->chip.owner = THIS_MODULE;
	bank->dbck_flag = pdata->dbck_flag;
	bank->stride = pdata->bank_stride;
	bank->width = pdata->bank_width;
	bank->is_mpuio = pdata->is_mpuio;
	bank->non_wakeup_gpios = pdata->non_wakeup_gpios;
	bank->regs = pdata->regs;
#ifdef CONFIG_OF_GPIO
	bank->chip.of_node = of_node_get(node);
1547 1548
#endif

A
Arnd Bergmann 已提交
1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572
	if (node) {
		if (!of_property_read_bool(node, "ti,gpio-always-on"))
			bank->loses_context = true;
	} else {
		bank->loses_context = pdata->loses_context;

		if (bank->loses_context)
			bank->get_context_loss_count =
				pdata->get_context_loss_count;
	}

	if (bank->regs->set_dataout && bank->regs->clr_dataout) {
		bank->set_dataout = omap_set_gpio_dataout_reg;
		bank->set_dataout_multiple = omap_set_gpio_dataout_reg_multiple;
	} else {
		bank->set_dataout = omap_set_gpio_dataout_mask;
		bank->set_dataout_multiple =
				omap_set_gpio_dataout_mask_multiple;
	}

	raw_spin_lock_init(&bank->lock);
	raw_spin_lock_init(&bank->wa_lock);

	/* Static mapping, never released */
1573
	bank->base = devm_platform_ioremap_resource(pdev, 0);
A
Arnd Bergmann 已提交
1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609
	if (IS_ERR(bank->base)) {
		return PTR_ERR(bank->base);
	}

	if (bank->dbck_flag) {
		bank->dbck = devm_clk_get(dev, "dbclk");
		if (IS_ERR(bank->dbck)) {
			dev_err(dev,
				"Could not get gpio dbck. Disable debounce\n");
			bank->dbck_flag = false;
		} else {
			clk_prepare(bank->dbck);
		}
	}

	platform_set_drvdata(pdev, bank);

	pm_runtime_enable(dev);
	pm_runtime_get_sync(dev);

	if (bank->is_mpuio)
		omap_mpuio_init(bank);

	omap_gpio_mod_init(bank);

	ret = omap_gpio_chip_init(bank, irqc);
	if (ret) {
		pm_runtime_put_sync(dev);
		pm_runtime_disable(dev);
		if (bank->dbck_flag)
			clk_unprepare(bank->dbck);
		return ret;
	}

	omap_gpio_show_rev(bank);

1610 1611
	bank->nb.notifier_call = gpio_omap_cpu_notifier;
	cpu_pm_register_notifier(&bank->nb);
A
Arnd Bergmann 已提交
1612 1613 1614 1615 1616 1617 1618 1619 1620 1621

	pm_runtime_put(dev);

	return 0;
}

static int omap_gpio_remove(struct platform_device *pdev)
{
	struct gpio_bank *bank = platform_get_drvdata(pdev);

1622
	cpu_pm_unregister_notifier(&bank->nb);
A
Arnd Bergmann 已提交
1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640
	gpiochip_remove(&bank->chip);
	pm_runtime_disable(&pdev->dev);
	if (bank->dbck_flag)
		clk_unprepare(bank->dbck);

	return 0;
}

static int __maybe_unused omap_gpio_runtime_suspend(struct device *dev)
{
	struct gpio_bank *bank = dev_get_drvdata(dev);
	unsigned long flags;

	raw_spin_lock_irqsave(&bank->lock, flags);
	omap_gpio_idle(bank, true);
	bank->is_suspended = true;
	raw_spin_unlock_irqrestore(&bank->lock, flags);

1641
	return 0;
A
Arnd Bergmann 已提交
1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653
}

static int __maybe_unused omap_gpio_runtime_resume(struct device *dev)
{
	struct gpio_bank *bank = dev_get_drvdata(dev);
	unsigned long flags;

	raw_spin_lock_irqsave(&bank->lock, flags);
	omap_gpio_unidle(bank);
	bank->is_suspended = false;
	raw_spin_unlock_irqrestore(&bank->lock, flags);

1654
	return 0;
A
Arnd Bergmann 已提交
1655 1656 1657 1658 1659 1660 1661
}

static const struct dev_pm_ops gpio_pm_ops = {
	SET_RUNTIME_PM_OPS(omap_gpio_runtime_suspend, omap_gpio_runtime_resume,
									NULL)
};

1662 1663
static struct platform_driver omap_gpio_driver = {
	.probe		= omap_gpio_probe,
1664
	.remove		= omap_gpio_remove,
1665 1666
	.driver		= {
		.name	= "omap_gpio",
1667
		.pm	= &gpio_pm_ops,
A
Arnd Bergmann 已提交
1668
		.of_match_table = omap_gpio_match,
1669 1670 1671
	},
};

1672
/*
1673 1674 1675
 * gpio driver register needs to be done before
 * machine_init functions access gpio APIs.
 * Hence omap_gpio_drv_reg() is a postcore_initcall.
1676
 */
1677
static int __init omap_gpio_drv_reg(void)
1678
{
1679
	return platform_driver_register(&omap_gpio_driver);
1680
}
1681
postcore_initcall(omap_gpio_drv_reg);
1682 1683 1684 1685 1686 1687 1688 1689 1690 1691

static void __exit omap_gpio_exit(void)
{
	platform_driver_unregister(&omap_gpio_driver);
}
module_exit(omap_gpio_exit);

MODULE_DESCRIPTION("omap gpio driver");
MODULE_ALIAS("platform:gpio-omap");
MODULE_LICENSE("GPL v2");