gpio-omap.c 44.3 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 957 958 959 960
{
	struct gpio_bank *bank;
	unsigned long flags;
	void __iomem *reg;
	int dir;

961
	bank = gpiochip_get_data(chip);
962
	reg = bank->base + bank->regs->direction;
963
	raw_spin_lock_irqsave(&bank->lock, flags);
964
	dir = !!(readl_relaxed(reg) & BIT(offset));
965
	raw_spin_unlock_irqrestore(&bank->lock, flags);
966 967 968
	return dir;
}

969
static int omap_gpio_input(struct gpio_chip *chip, unsigned offset)
D
David Brownell 已提交
970 971 972 973
{
	struct gpio_bank *bank;
	unsigned long flags;

974
	bank = gpiochip_get_data(chip);
975
	raw_spin_lock_irqsave(&bank->lock, flags);
976
	omap_set_gpio_direction(bank, offset, 1);
977
	raw_spin_unlock_irqrestore(&bank->lock, flags);
D
David Brownell 已提交
978 979 980
	return 0;
}

981
static int omap_gpio_get(struct gpio_chip *chip, unsigned offset)
D
David Brownell 已提交
982
{
983 984
	struct gpio_bank *bank;

985
	bank = gpiochip_get_data(chip);
986

987
	if (omap_gpio_is_input(bank, offset))
988
		return omap_get_gpio_datain(bank, offset);
989
	else
990
		return omap_get_gpio_dataout(bank, offset);
D
David Brownell 已提交
991 992
}

993
static int omap_gpio_output(struct gpio_chip *chip, unsigned offset, int value)
D
David Brownell 已提交
994 995 996 997
{
	struct gpio_bank *bank;
	unsigned long flags;

998
	bank = gpiochip_get_data(chip);
999
	raw_spin_lock_irqsave(&bank->lock, flags);
1000
	bank->set_dataout(bank, offset, value);
1001
	omap_set_gpio_direction(bank, offset, 0);
1002
	raw_spin_unlock_irqrestore(&bank->lock, flags);
1003
	return 0;
D
David Brownell 已提交
1004 1005
}

1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025
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;
}

1026 1027
static int omap_gpio_debounce(struct gpio_chip *chip, unsigned offset,
			      unsigned debounce)
1028 1029 1030
{
	struct gpio_bank *bank;
	unsigned long flags;
1031
	int ret;
1032

1033
	bank = gpiochip_get_data(chip);
1034

1035
	raw_spin_lock_irqsave(&bank->lock, flags);
1036
	ret = omap2_set_gpio_debounce(bank, offset, debounce);
1037
	raw_spin_unlock_irqrestore(&bank->lock, flags);
1038

1039 1040 1041 1042 1043 1044
	if (ret)
		dev_info(chip->parent,
			 "Could not set line %u debounce to %u microseconds (%d)",
			 offset, debounce, ret);

	return ret;
1045 1046
}

1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058
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);
}

1059
static void omap_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
D
David Brownell 已提交
1060 1061 1062 1063
{
	struct gpio_bank *bank;
	unsigned long flags;

1064
	bank = gpiochip_get_data(chip);
1065
	raw_spin_lock_irqsave(&bank->lock, flags);
1066
	bank->set_dataout(bank, offset, value);
1067
	raw_spin_unlock_irqrestore(&bank->lock, flags);
D
David Brownell 已提交
1068 1069
}

1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080
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 已提交
1081 1082
/*---------------------------------------------------------------------*/

1083
static void omap_gpio_show_rev(struct gpio_bank *bank)
T
Tony Lindgren 已提交
1084
{
1085
	static bool called;
T
Tony Lindgren 已提交
1086 1087
	u32 rev;

1088
	if (called || bank->regs->revision == USHRT_MAX)
T
Tony Lindgren 已提交
1089 1090
		return;

1091
	rev = readw_relaxed(bank->base + bank->regs->revision);
1092
	pr_info("OMAP GPIO hardware version %d.%d\n",
T
Tony Lindgren 已提交
1093
		(rev >> 4) & 0x0f, rev & 0x0f);
1094 1095

	called = true;
T
Tony Lindgren 已提交
1096 1097
}

1098
static void omap_gpio_mod_init(struct gpio_bank *bank)
1099
{
1100 1101
	void __iomem *base = bank->base;
	u32 l = 0xffffffff;
1102

1103 1104 1105
	if (bank->width == 16)
		l = 0xffff;

1106
	if (bank->is_mpuio) {
1107
		writel_relaxed(l, bank->base + bank->regs->irqenable);
1108
		return;
1109
	}
1110

1111 1112 1113 1114
	omap_gpio_rmw(base, bank->regs->irqenable, l,
		      bank->regs->irqenable_inv);
	omap_gpio_rmw(base, bank->regs->irqstatus, l,
		      !bank->regs->irqenable_inv);
1115
	if (bank->regs->debounce_en)
1116
		writel_relaxed(0, base + bank->regs->debounce_en);
1117

1118
	/* Save OE default value (0xffffffff) in the context */
1119
	bank->context.oe = readl_relaxed(bank->base + bank->regs->direction);
1120 1121
	 /* Initialize interface clk ungated, module enabled */
	if (bank->regs->ctrl)
1122
		writel_relaxed(0, base + bank->regs->ctrl);
1123 1124
}

N
Nishanth Menon 已提交
1125
static int omap_gpio_chip_init(struct gpio_bank *bank, struct irq_chip *irqc)
1126
{
1127
	struct gpio_irq_chip *irq;
1128
	static int gpio;
1129
	const char *label;
1130
	int irq_base = 0;
1131
	int ret;
1132 1133 1134 1135 1136 1137 1138

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

1162 1163 1164 1165 1166
#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.
	 */
1167 1168
	irq_base = devm_irq_alloc_descs(bank->chip.parent,
					-1, 0, bank->width, 0);
1169
	if (irq_base < 0) {
1170
		dev_err(bank->chip.parent, "Couldn't allocate IRQ numbers\n");
1171 1172 1173 1174
		return -ENODEV;
	}
#endif

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

1179 1180 1181 1182 1183 1184 1185
	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;
1186

1187
	ret = gpiochip_add_data(&bank->chip, bank);
1188
	if (ret) {
1189
		dev_err(bank->chip.parent,
1190 1191
			"Could not register gpio chip %d\n", ret);
		return ret;
1192 1193
	}

1194 1195 1196
	ret = devm_request_irq(bank->chip.parent, bank->irq,
			       omap_gpio_irq_handler,
			       0, dev_name(bank->chip.parent), bank);
1197 1198 1199
	if (ret)
		gpiochip_remove(&bank->chip);

1200 1201 1202
	if (!bank->is_mpuio)
		gpio += bank->width;

1203
	return ret;
1204 1205
}

A
Arnd Bergmann 已提交
1206
static void omap_gpio_init_context(struct gpio_bank *p)
1207
{
A
Arnd Bergmann 已提交
1208 1209
	struct omap_gpio_reg_offs *regs = p->regs;
	void __iomem *base = p->base;
1210

A
Arnd Bergmann 已提交
1211 1212 1213 1214 1215 1216 1217 1218 1219
	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);
1220

A
Arnd Bergmann 已提交
1221 1222 1223 1224
	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);
1225

A
Arnd Bergmann 已提交
1226
	p->context_valid = true;
1227 1228
}

A
Arnd Bergmann 已提交
1229
static void omap_gpio_restore_context(struct gpio_bank *bank)
1230
{
A
Arnd Bergmann 已提交
1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248
	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 已提交
1249

A
Arnd Bergmann 已提交
1250 1251 1252 1253 1254
	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);
1255 1256
	}

A
Arnd Bergmann 已提交
1257 1258 1259 1260
	writel_relaxed(bank->context.irqenable1,
				bank->base + bank->regs->irqenable);
	writel_relaxed(bank->context.irqenable2,
				bank->base + bank->regs->irqenable2);
1261 1262
}

1263
static void omap_gpio_idle(struct gpio_bank *bank, bool may_lose_context)
1264
{
1265
	struct device *dev = bank->chip.parent;
1266 1267 1268 1269
	void __iomem *base = bank->base;
	u32 nowake;

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

1271 1272 1273
	if (!bank->enabled_non_wakeup_gpios)
		goto update_gpio_context_count;

1274
	if (!may_lose_context)
1275
		goto update_gpio_context_count;
1276

1277
	/*
1278
	 * If going to OFF, remove triggering for all wkup domain
1279 1280 1281
	 * non-wakeup GPIOs.  Otherwise spurious IRQs will be
	 * generated.  See OMAP2420 Errata item 1.101.
	 */
1282 1283 1284 1285 1286
	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);
	}
1287

1288
update_gpio_context_count:
1289 1290
	if (bank->get_context_loss_count)
		bank->context_loss_count =
1291
				bank->get_context_loss_count(dev);
1292

1293
	omap_gpio_dbck_disable(bank);
1294 1295
}

1296
static void omap_gpio_unidle(struct gpio_bank *bank)
1297
{
1298
	struct device *dev = bank->chip.parent;
1299
	u32 l = 0, gen, gen0, gen1;
1300
	int c;
1301

1302 1303 1304 1305 1306 1307 1308 1309 1310 1311
	/*
	 * 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 =
1312
				bank->get_context_loss_count(dev);
1313 1314
	}

1315
	omap_gpio_dbck_enable(bank);
1316

1317 1318
	if (bank->loses_context) {
		if (!bank->get_context_loss_count) {
1319 1320
			omap_gpio_restore_context(bank);
		} else {
1321
			c = bank->get_context_loss_count(dev);
1322 1323 1324
			if (c != bank->context_loss_count) {
				omap_gpio_restore_context(bank);
			} else {
1325
				return;
1326
			}
1327
		}
1328 1329 1330 1331 1332 1333
	} 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);
1334
	}
1335

1336
	l = readl_relaxed(bank->base + bank->regs->datain);
1337

1338 1339 1340 1341 1342 1343 1344 1345
	/*
	 * 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;
1346

1347 1348 1349 1350
	/*
	 * No need to generate IRQs for the rising edge for gpio IRQs
	 * configured with falling edge only; and vice versa.
	 */
1351
	gen0 = l & bank->context.fallingdetect;
1352
	gen0 &= bank->saved_datain;
1353

1354
	gen1 = l & bank->context.risingdetect;
1355
	gen1 &= ~(bank->saved_datain);
1356

1357
	/* FIXME: Consider GPIO IRQs with level detections properly! */
1358 1359
	gen = l & (~(bank->context.fallingdetect) &
					 ~(bank->context.risingdetect));
1360 1361
	/* Consider all GPIO IRQs needed to be updated */
	gen |= gen0 | gen1;
1362

1363 1364
	if (gen) {
		u32 old0, old1;
1365

1366 1367
		old0 = readl_relaxed(bank->base + bank->regs->leveldetect0);
		old1 = readl_relaxed(bank->base + bank->regs->leveldetect1);
1368

1369
		if (!bank->regs->irqstatus_raw0) {
1370
			writel_relaxed(old0 | gen, bank->base +
1371
						bank->regs->leveldetect0);
1372
			writel_relaxed(old1 | gen, bank->base +
1373
						bank->regs->leveldetect1);
1374
		}
1375

1376
		if (bank->regs->irqstatus_raw0) {
1377
			writel_relaxed(old0 | l, bank->base +
1378
						bank->regs->leveldetect0);
1379
			writel_relaxed(old1 | l, bank->base +
1380
						bank->regs->leveldetect1);
1381
		}
1382 1383
		writel_relaxed(old0, bank->base + bank->regs->leveldetect0);
		writel_relaxed(old1, bank->base + bank->regs->leveldetect1);
1384 1385 1386
	}
}

A
Arnd Bergmann 已提交
1387 1388
static int gpio_omap_cpu_notifier(struct notifier_block *nb,
				  unsigned long cmd, void *v)
1389
{
A
Arnd Bergmann 已提交
1390 1391
	struct gpio_bank *bank;
	unsigned long flags;
1392

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

A
Arnd Bergmann 已提交
1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409
	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);
1410

A
Arnd Bergmann 已提交
1411
	return NOTIFY_OK;
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 1439 1440 1441 1442 1443 1444 1445
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,
1446 1447
	.irqstatus_raw0 =	OMAP4_GPIO_IRQSTATUSRAW0,
	.irqstatus_raw1 =	OMAP4_GPIO_IRQSTATUSRAW1,
1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461
	.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,
};

1462
static const struct omap_gpio_platform_data omap2_pdata = {
1463 1464 1465 1466 1467
	.regs = &omap2_gpio_regs,
	.bank_width = 32,
	.dbck_flag = false,
};

1468
static const struct omap_gpio_platform_data omap3_pdata = {
1469 1470 1471 1472 1473
	.regs = &omap2_gpio_regs,
	.bank_width = 32,
	.dbck_flag = true,
};

1474
static const struct omap_gpio_platform_data omap4_pdata = {
1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495
	.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 已提交
1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522

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 已提交
1523
	irqc->irq_ack = dummy_irq_chip.irq_ack,
A
Arnd Bergmann 已提交
1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553
	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);
1554 1555
#endif

A
Arnd Bergmann 已提交
1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579
	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 */
1580
	bank->base = devm_platform_ioremap_resource(pdev, 0);
A
Arnd Bergmann 已提交
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 1610 1611 1612 1613 1614 1615 1616
	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);

1617 1618
	bank->nb.notifier_call = gpio_omap_cpu_notifier;
	cpu_pm_register_notifier(&bank->nb);
A
Arnd Bergmann 已提交
1619 1620 1621 1622 1623 1624 1625 1626 1627 1628

	pm_runtime_put(dev);

	return 0;
}

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

1629
	cpu_pm_unregister_notifier(&bank->nb);
A
Arnd Bergmann 已提交
1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647
	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);

1648
	return 0;
A
Arnd Bergmann 已提交
1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660
}

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

1661
	return 0;
A
Arnd Bergmann 已提交
1662 1663 1664 1665 1666 1667 1668
}

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

1669 1670
static struct platform_driver omap_gpio_driver = {
	.probe		= omap_gpio_probe,
1671
	.remove		= omap_gpio_remove,
1672 1673
	.driver		= {
		.name	= "omap_gpio",
1674
		.pm	= &gpio_pm_ops,
A
Arnd Bergmann 已提交
1675
		.of_match_table = omap_gpio_match,
1676 1677 1678
	},
};

1679
/*
1680 1681 1682
 * gpio driver register needs to be done before
 * machine_init functions access gpio APIs.
 * Hence omap_gpio_drv_reg() is a postcore_initcall.
1683
 */
1684
static int __init omap_gpio_drv_reg(void)
1685
{
1686
	return platform_driver_register(&omap_gpio_driver);
1687
}
1688
postcore_initcall(omap_gpio_drv_reg);
1689 1690 1691 1692 1693 1694 1695 1696 1697 1698

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