gpio-omap.c 40.8 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 52
	const struct omap_gpio_reg_offs *regs;

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

78
	void (*set_dataout)(struct gpio_bank *bank, unsigned gpio, int enable);
79
	int (*get_context_loss_count)(struct device *dev);
80 81
};

82
#define GPIO_MOD_CTRL_BIT	BIT(0)
83

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

87 88
static void omap_gpio_unmask_irq(struct irq_data *d);

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

95
static inline u32 omap_gpio_rmw(void __iomem *reg, u32 mask, bool set)
96
{
97
	u32 val = readl_relaxed(reg);
98

99 100
	if (set)
		val |= mask;
101
	else
102 103 104 105 106 107 108 109 110 111 112 113
		val &= ~mask;

	writel_relaxed(val, reg);

	return val;
}

static void omap_set_gpio_direction(struct gpio_bank *bank, int gpio,
				    int is_input)
{
	bank->context.oe = omap_gpio_rmw(bank->base + bank->regs->direction,
					 BIT(gpio), is_input);
114 115
}

116 117

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

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

132
	writel_relaxed(l, reg);
133 134
}

135
/* set data out value using mask register */
136
static void omap_set_gpio_dataout_mask(struct gpio_bank *bank, unsigned offset,
137
				       int enable)
138
{
139 140
	bank->context.dataout = omap_gpio_rmw(bank->base + bank->regs->dataout,
					      BIT(offset), enable);
141
}
142

143
static inline void omap_gpio_dbck_enable(struct gpio_bank *bank)
144 145
{
	if (bank->dbck_enable_mask && !bank->dbck_enabled) {
146
		clk_enable(bank->dbck);
147
		bank->dbck_enabled = true;
148

149
		writel_relaxed(bank->dbck_enable_mask,
150
			     bank->base + bank->regs->debounce_en);
151 152 153
	}
}

154
static inline void omap_gpio_dbck_disable(struct gpio_bank *bank)
155 156
{
	if (bank->dbck_enable_mask && bank->dbck_enabled) {
157 158 159 160 161
		/*
		 * 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.
		 */
162
		writel_relaxed(0, bank->base + bank->regs->debounce_en);
163

164
		clk_disable(bank->dbck);
165 166 167 168
		bank->dbck_enabled = false;
	}
}

169
/**
170
 * omap2_set_gpio_debounce - low level gpio debounce time
171
 * @bank: the gpio bank we're acting upon
172
 * @offset: the gpio number on this @bank
173 174
 * @debounce: debounce time to use
 *
175 176 177
 * 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.
178 179
 *
 * Return: 0 on success, negative error otherwise.
180
 */
181 182
static int omap2_set_gpio_debounce(struct gpio_bank *bank, unsigned offset,
				   unsigned debounce)
183 184 185
{
	u32			val;
	u32			l;
186
	bool			enable = !!debounce;
187

188
	if (!bank->dbck_flag)
189
		return -ENOTSUPP;
190

191 192
	if (enable) {
		debounce = DIV_ROUND_UP(debounce, 31) - 1;
193 194
		if ((debounce & OMAP4_GPIO_DEBOUNCINGTIME_MASK) != debounce)
			return -EINVAL;
195
	}
196

197
	l = BIT(offset);
198

199
	clk_enable(bank->dbck);
200
	writel_relaxed(debounce, bank->base + bank->regs->debounce);
201

202
	val = omap_gpio_rmw(bank->base + bank->regs->debounce_en, l, enable);
203
	bank->dbck_enable_mask = val;
204

205
	clk_disable(bank->dbck);
206 207 208 209 210 211 212 213
	/*
	 * 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.
	 */
214
	omap_gpio_dbck_enable(bank);
215 216 217 218
	if (bank->dbck_enable_mask) {
		bank->context.debounce = debounce;
		bank->context.debounce_en = val;
	}
219 220

	return 0;
221 222
}

223
/**
224
 * omap_clear_gpio_debounce - clear debounce settings for a gpio
225
 * @bank: the gpio bank we're acting upon
226
 * @offset: the gpio number on this @bank
227 228 229 230 231 232
 *
 * 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.
 */
233
static void omap_clear_gpio_debounce(struct gpio_bank *bank, unsigned offset)
234
{
235
	u32 gpio_bit = BIT(offset);
236 237 238 239 240 241 242 243 244

	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;
245
        writel_relaxed(bank->context.debounce_en,
246 247 248 249
		     bank->base + bank->regs->debounce_en);

	if (!bank->dbck_enable_mask) {
		bank->context.debounce = 0;
250
		writel_relaxed(bank->context.debounce, bank->base +
251
			     bank->regs->debounce);
252
		clk_disable(bank->dbck);
253 254 255 256
		bank->dbck_enabled = false;
	}
}

257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272
/*
 * 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;
}

273
static inline void omap_set_gpio_trigger(struct gpio_bank *bank, int gpio,
274
						unsigned trigger)
275
{
276
	void __iomem *base = bank->base;
277
	u32 gpio_bit = BIT(gpio);
278

279
	omap_gpio_rmw(base + bank->regs->leveldetect0, gpio_bit,
280
		      trigger & IRQ_TYPE_LEVEL_LOW);
281
	omap_gpio_rmw(base + bank->regs->leveldetect1, gpio_bit,
282
		      trigger & IRQ_TYPE_LEVEL_HIGH);
283 284 285 286 287 288

	/*
	 * 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.
	 */
289
	omap_gpio_rmw(base + bank->regs->risingdetect, gpio_bit,
290
		      trigger & (IRQ_TYPE_EDGE_RISING | IRQ_TYPE_LEVEL_HIGH));
291
	omap_gpio_rmw(base + bank->regs->fallingdetect, gpio_bit,
292
		      trigger & (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_LEVEL_LOW));
293

294
	bank->context.leveldetect0 =
295
			readl_relaxed(bank->base + bank->regs->leveldetect0);
296
	bank->context.leveldetect1 =
297
			readl_relaxed(bank->base + bank->regs->leveldetect1);
298
	bank->context.risingdetect =
299
			readl_relaxed(bank->base + bank->regs->risingdetect);
300
	bank->context.fallingdetect =
301
			readl_relaxed(bank->base + bank->regs->fallingdetect);
302

303 304 305
	bank->level_mask = bank->context.leveldetect0 |
			   bank->context.leveldetect1;

306
	/* This part needs to be executed always for OMAP{34xx, 44xx} */
307
	if (!bank->regs->irqctrl && !omap_gpio_is_off_wakeup_capable(bank, gpio)) {
308 309 310 311 312 313 314
		/*
		 * 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)
315 316 317 318
			bank->enabled_non_wakeup_gpios |= gpio_bit;
		else
			bank->enabled_non_wakeup_gpios &= ~gpio_bit;
	}
319 320
}

321 322 323 324
/*
 * 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.
 */
325
static void omap_toggle_gpio_edge_triggering(struct gpio_bank *bank, int gpio)
326
{
327 328
	if (IS_ENABLED(CONFIG_ARCH_OMAP1) && bank->regs->irqctrl) {
		void __iomem *reg = bank->base + bank->regs->irqctrl;
329

330 331
		writel_relaxed(readl_relaxed(reg) ^ BIT(gpio), reg);
	}
332 333
}

334 335
static int omap_set_gpio_triggering(struct gpio_bank *bank, int gpio,
				    unsigned trigger)
336 337 338
{
	void __iomem *reg = bank->base;
	u32 l = 0;
339

340
	if (bank->regs->leveldetect0 && bank->regs->wkup_en) {
341
		omap_set_gpio_trigger(bank, gpio, trigger);
342 343 344
	} else if (bank->regs->irqctrl) {
		reg += bank->regs->irqctrl;

345
		l = readl_relaxed(reg);
346
		if ((trigger & IRQ_TYPE_SENSE_MASK) == IRQ_TYPE_EDGE_BOTH)
347
			bank->toggle_mask |= BIT(gpio);
348
		if (trigger & IRQ_TYPE_EDGE_RISING)
349
			l |= BIT(gpio);
350
		else if (trigger & IRQ_TYPE_EDGE_FALLING)
351
			l &= ~(BIT(gpio));
352
		else
353 354
			return -EINVAL;

355
		writel_relaxed(l, reg);
356
	} else if (bank->regs->edgectrl1) {
357
		if (gpio & 0x08)
358
			reg += bank->regs->edgectrl2;
359
		else
360 361
			reg += bank->regs->edgectrl1;

362
		gpio &= 0x07;
363
		l = readl_relaxed(reg);
364
		l &= ~(3 << (gpio << 1));
365
		if (trigger & IRQ_TYPE_EDGE_RISING)
366
			l |= 2 << (gpio << 1);
367
		if (trigger & IRQ_TYPE_EDGE_FALLING)
368
			l |= BIT(gpio << 1);
369
		writel_relaxed(l, reg);
370
	}
371
	return 0;
372 373
}

374
static void omap_enable_gpio_module(struct gpio_bank *bank, unsigned offset)
375 376 377 378 379
{
	if (bank->regs->pinctrl) {
		void __iomem *reg = bank->base + bank->regs->pinctrl;

		/* Claim the pin for MPU */
380
		writel_relaxed(readl_relaxed(reg) | (BIT(offset)), reg);
381 382 383 384 385 386
	}

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

387
		ctrl = readl_relaxed(reg);
388 389
		/* Module is enabled, clocks are not gated */
		ctrl &= ~GPIO_MOD_CTRL_BIT;
390
		writel_relaxed(ctrl, reg);
391 392 393 394
		bank->context.ctrl = ctrl;
	}
}

395
static void omap_disable_gpio_module(struct gpio_bank *bank, unsigned offset)
396 397 398 399 400
{
	if (bank->regs->ctrl && !BANK_USED(bank)) {
		void __iomem *reg = bank->base + bank->regs->ctrl;
		u32 ctrl;

401
		ctrl = readl_relaxed(reg);
402 403
		/* Module is disabled, clocks are gated */
		ctrl |= GPIO_MOD_CTRL_BIT;
404
		writel_relaxed(ctrl, reg);
405 406 407 408
		bank->context.ctrl = ctrl;
	}
}

409
static int omap_gpio_is_input(struct gpio_bank *bank, unsigned offset)
410 411 412
{
	void __iomem *reg = bank->base + bank->regs->direction;

413
	return readl_relaxed(reg) & BIT(offset);
414 415
}

416
static void omap_gpio_init_irq(struct gpio_bank *bank, unsigned offset)
417 418 419 420 421
{
	if (!LINE_USED(bank->mod_usage, offset)) {
		omap_enable_gpio_module(bank, offset);
		omap_set_gpio_direction(bank, offset, 1);
	}
422
	bank->irq_usage |= BIT(offset);
423 424
}

425
static int omap_gpio_irq_type(struct irq_data *d, unsigned type)
426
{
427
	struct gpio_bank *bank = omap_irq_data_get_bank(d);
428
	int retval;
D
David Brownell 已提交
429
	unsigned long flags;
430
	unsigned offset = d->hwirq;
431

432
	if (type & ~IRQ_TYPE_SENSE_MASK)
433
		return -EINVAL;
434

435 436
	if (!bank->regs->leveldetect0 &&
		(type & (IRQ_TYPE_LEVEL_LOW|IRQ_TYPE_LEVEL_HIGH)))
437 438
		return -EINVAL;

439
	raw_spin_lock_irqsave(&bank->lock, flags);
440
	retval = omap_set_gpio_triggering(bank, offset, type);
441
	if (retval) {
442
		raw_spin_unlock_irqrestore(&bank->lock, flags);
443
		goto error;
444
	}
445
	omap_gpio_init_irq(bank, offset);
446
	if (!omap_gpio_is_input(bank, offset)) {
447
		raw_spin_unlock_irqrestore(&bank->lock, flags);
448 449
		retval = -EINVAL;
		goto error;
450
	}
451
	raw_spin_unlock_irqrestore(&bank->lock, flags);
452 453

	if (type & (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH))
454
		irq_set_handler_locked(d, handle_level_irq);
455
	else if (type & (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING))
456 457 458 459 460 461 462
		/*
		 * 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);
463

464 465 466
	return 0;

error:
467
	return retval;
468 469
}

470
static void omap_clear_gpio_irqbank(struct gpio_bank *bank, int gpio_mask)
471
{
472
	void __iomem *reg = bank->base;
473

474
	reg += bank->regs->irqstatus;
475
	writel_relaxed(gpio_mask, reg);
476 477

	/* Workaround for clearing DSP GPIO interrupts to allow retention */
478 479
	if (bank->regs->irqstatus2) {
		reg = bank->base + bank->regs->irqstatus2;
480
		writel_relaxed(gpio_mask, reg);
481
	}
482 483

	/* Flush posted write for the irq status to avoid spurious interrupts */
484
	readl_relaxed(reg);
485 486
}

487 488
static inline void omap_clear_gpio_irqstatus(struct gpio_bank *bank,
					     unsigned offset)
489
{
490
	omap_clear_gpio_irqbank(bank, BIT(offset));
491 492
}

493
static u32 omap_get_gpio_irqbank_mask(struct gpio_bank *bank)
494 495
{
	void __iomem *reg = bank->base;
496
	u32 l;
497
	u32 mask = (BIT(bank->width)) - 1;
498

499
	reg += bank->regs->irqenable;
500
	l = readl_relaxed(reg);
501
	if (bank->regs->irqenable_inv)
502 503 504
		l = ~l;
	l &= mask;
	return l;
505 506
}

507 508
static inline void omap_set_gpio_irqenable(struct gpio_bank *bank,
					   unsigned offset, int enable)
509 510
{
	void __iomem *reg = bank->base;
511 512 513 514 515 516 517 518 519 520 521
	u32 gpio_mask = BIT(offset);

	if (bank->regs->set_irqenable && bank->regs->clr_irqenable) {
		if (enable) {
			reg += bank->regs->set_irqenable;
			bank->context.irqenable1 |= gpio_mask;
		} else {
			reg += bank->regs->clr_irqenable;
			bank->context.irqenable1 &= ~gpio_mask;
		}
		writel_relaxed(gpio_mask, reg);
522
	} else {
523 524 525
		bank->context.irqenable1 =
			omap_gpio_rmw(reg + bank->regs->irqenable, gpio_mask,
				      enable ^ bank->regs->irqenable_inv);
526
	}
527 528 529 530 531 532 533 534 535 536 537 538 539

	/*
	 * Program GPIO wakeup along with IRQ enable to satisfy OMAP4430 TRM
	 * note requiring correlation between the IRQ enable registers and
	 * the wakeup registers.  In any case, we want wakeup from idle
	 * enabled for the GPIOs which support this feature.
	 */
	if (bank->regs->wkup_en &&
	    (bank->regs->edgectrl1 || !(bank->non_wakeup_gpios & gpio_mask))) {
		bank->context.wake_en =
			omap_gpio_rmw(bank->base + bank->regs->wkup_en,
				      gpio_mask, enable);
	}
540 541
}

542
/* Use disable_irq_wake() and enable_irq_wake() functions from drivers */
543
static int omap_gpio_wake_enable(struct irq_data *d, unsigned int enable)
544
{
545
	struct gpio_bank *bank = omap_irq_data_get_bank(d);
546

547
	return irq_set_irq_wake(bank->irq, enable);
548 549
}

550 551 552 553 554 555 556 557 558
/*
 * 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.
 */
559
static irqreturn_t omap_gpio_irq_handler(int irq, void *gpiobank)
560
{
561
	void __iomem *isr_reg = NULL;
562
	u32 enabled, isr, edge;
563
	unsigned int bit;
564 565
	struct gpio_bank *bank = gpiobank;
	unsigned long wa_lock_flags;
566
	unsigned long lock_flags;
567

568
	isr_reg = bank->base + bank->regs->irqstatus;
569 570 571
	if (WARN_ON(!isr_reg))
		goto exit;

572 573 574
	if (WARN_ONCE(!pm_runtime_active(bank->chip.parent),
		      "gpio irq%i while runtime suspended?\n", irq))
		return IRQ_NONE;
575

576
	while (1) {
577 578
		raw_spin_lock_irqsave(&bank->lock, lock_flags);

579
		enabled = omap_get_gpio_irqbank_mask(bank);
580
		isr = readl_relaxed(isr_reg) & enabled;
581

582 583 584 585 586 587 588 589
		/*
		 * 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);
590

591 592
		raw_spin_unlock_irqrestore(&bank->lock, lock_flags);

593 594 595
		if (!isr)
			break;

596 597
		while (isr) {
			bit = __ffs(isr);
598
			isr &= ~(BIT(bit));
599

600
			raw_spin_lock_irqsave(&bank->lock, lock_flags);
601 602 603 604 605 606 607
			/*
			 * 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.
			 */
608
			if (bank->toggle_mask & (BIT(bit)))
609
				omap_toggle_gpio_edge_triggering(bank, bit);
610

611 612
			raw_spin_unlock_irqrestore(&bank->lock, lock_flags);

613 614
			raw_spin_lock_irqsave(&bank->wa_lock, wa_lock_flags);

615
			generic_handle_irq(irq_find_mapping(bank->chip.irq.domain,
616
							    bit));
617 618 619

			raw_spin_unlock_irqrestore(&bank->wa_lock,
						   wa_lock_flags);
620
		}
621
	}
622
exit:
623
	return IRQ_HANDLED;
624 625
}

626 627 628 629
static unsigned int omap_gpio_irq_startup(struct irq_data *d)
{
	struct gpio_bank *bank = omap_irq_data_get_bank(d);
	unsigned long flags;
630
	unsigned offset = d->hwirq;
631

632
	raw_spin_lock_irqsave(&bank->lock, flags);
633 634 635 636 637 638

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

639
	raw_spin_unlock_irqrestore(&bank->lock, flags);
640 641 642 643 644
	omap_gpio_unmask_irq(d);

	return 0;
}

645
static void omap_gpio_irq_shutdown(struct irq_data *d)
646
{
647
	struct gpio_bank *bank = omap_irq_data_get_bank(d);
648
	unsigned long flags;
649
	unsigned offset = d->hwirq;
650

651
	raw_spin_lock_irqsave(&bank->lock, flags);
652
	bank->irq_usage &= ~(BIT(offset));
653
	omap_set_gpio_triggering(bank, offset, IRQ_TYPE_NONE);
654 655
	omap_clear_gpio_irqstatus(bank, offset);
	omap_set_gpio_irqenable(bank, offset, 0);
656 657
	if (!LINE_USED(bank->mod_usage, offset))
		omap_clear_gpio_debounce(bank, offset);
658
	omap_disable_gpio_module(bank, offset);
659
	raw_spin_unlock_irqrestore(&bank->lock, flags);
660 661 662 663 664 665
}

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

666
	pm_runtime_get_sync(bank->chip.parent);
667 668 669 670 671
}

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

673
	pm_runtime_put(bank->chip.parent);
674 675
}

676
static void omap_gpio_mask_irq(struct irq_data *d)
677
{
678
	struct gpio_bank *bank = omap_irq_data_get_bank(d);
679
	unsigned offset = d->hwirq;
680
	unsigned long flags;
681

682
	raw_spin_lock_irqsave(&bank->lock, flags);
683
	omap_set_gpio_triggering(bank, offset, IRQ_TYPE_NONE);
684
	omap_set_gpio_irqenable(bank, offset, 0);
685
	raw_spin_unlock_irqrestore(&bank->lock, flags);
686 687
}

688
static void omap_gpio_unmask_irq(struct irq_data *d)
689
{
690
	struct gpio_bank *bank = omap_irq_data_get_bank(d);
691
	unsigned offset = d->hwirq;
692
	u32 trigger = irqd_get_trigger_type(d);
693
	unsigned long flags;
694

695
	raw_spin_lock_irqsave(&bank->lock, flags);
696 697 698 699 700 701 702
	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.
	 */
703 704
	if (bank->regs->leveldetect0 && bank->regs->wkup_en &&
	    trigger & (IRQ_TYPE_LEVEL_HIGH | IRQ_TYPE_LEVEL_LOW))
705
		omap_clear_gpio_irqstatus(bank, offset);
706

707 708 709
	if (trigger)
		omap_set_gpio_triggering(bank, offset, trigger);

710
	raw_spin_unlock_irqrestore(&bank->lock, flags);
711 712
}

713 714
/*---------------------------------------------------------------------*/

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

722
	raw_spin_lock_irqsave(&bank->lock, flags);
723
	writel_relaxed(0xffff & ~bank->context.wake_en, mask_reg);
724
	raw_spin_unlock_irqrestore(&bank->lock, flags);
D
David Brownell 已提交
725 726 727 728

	return 0;
}

729
static int omap_mpuio_resume_noirq(struct device *dev)
D
David Brownell 已提交
730
{
731
	struct gpio_bank	*bank = dev_get_drvdata(dev);
732 733
	void __iomem		*mask_reg = bank->base +
					OMAP_MPUIO_GPIO_MASKIT / bank->stride;
D
David Brownell 已提交
734
	unsigned long		flags;
D
David Brownell 已提交
735

736
	raw_spin_lock_irqsave(&bank->lock, flags);
737
	writel_relaxed(bank->context.wake_en, mask_reg);
738
	raw_spin_unlock_irqrestore(&bank->lock, flags);
D
David Brownell 已提交
739 740 741 742

	return 0;
}

743
static const struct dev_pm_ops omap_mpuio_dev_pm_ops = {
744 745 746 747
	.suspend_noirq = omap_mpuio_suspend_noirq,
	.resume_noirq = omap_mpuio_resume_noirq,
};

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

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

765
static inline void omap_mpuio_init(struct gpio_bank *bank)
D
David Brownell 已提交
766
{
767
	platform_set_drvdata(&omap_mpuio_device, bank);
768

D
David Brownell 已提交
769 770 771 772
	if (platform_driver_register(&omap_mpuio_driver) == 0)
		(void) platform_device_register(&omap_mpuio_device);
}

773
/*---------------------------------------------------------------------*/
774

775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806
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);
}

807
static int omap_gpio_get_direction(struct gpio_chip *chip, unsigned offset)
808
{
809
	struct gpio_bank *bank = gpiochip_get_data(chip);
810

811 812
	return !!(readl_relaxed(bank->base + bank->regs->direction) &
		  BIT(offset));
813 814
}

815
static int omap_gpio_input(struct gpio_chip *chip, unsigned offset)
D
David Brownell 已提交
816 817 818 819
{
	struct gpio_bank *bank;
	unsigned long flags;

820
	bank = gpiochip_get_data(chip);
821
	raw_spin_lock_irqsave(&bank->lock, flags);
822
	omap_set_gpio_direction(bank, offset, 1);
823
	raw_spin_unlock_irqrestore(&bank->lock, flags);
D
David Brownell 已提交
824 825 826
	return 0;
}

827
static int omap_gpio_get(struct gpio_chip *chip, unsigned offset)
D
David Brownell 已提交
828
{
R
Russell King 已提交
829 830
	struct gpio_bank *bank = gpiochip_get_data(chip);
	void __iomem *reg;
831

832
	if (omap_gpio_is_input(bank, offset))
R
Russell King 已提交
833
		reg = bank->base + bank->regs->datain;
834
	else
R
Russell King 已提交
835 836 837
		reg = bank->base + bank->regs->dataout;

	return (readl_relaxed(reg) & BIT(offset)) != 0;
D
David Brownell 已提交
838 839
}

840
static int omap_gpio_output(struct gpio_chip *chip, unsigned offset, int value)
D
David Brownell 已提交
841 842 843 844
{
	struct gpio_bank *bank;
	unsigned long flags;

845
	bank = gpiochip_get_data(chip);
846
	raw_spin_lock_irqsave(&bank->lock, flags);
847
	bank->set_dataout(bank, offset, value);
848
	omap_set_gpio_direction(bank, offset, 0);
849
	raw_spin_unlock_irqrestore(&bank->lock, flags);
850
	return 0;
D
David Brownell 已提交
851 852
}

853 854 855 856
static int omap_gpio_get_multiple(struct gpio_chip *chip, unsigned long *mask,
				  unsigned long *bits)
{
	struct gpio_bank *bank = gpiochip_get_data(chip);
857 858 859 860
	void __iomem *base = bank->base;
	u32 direction, m, val = 0;

	direction = readl_relaxed(base + bank->regs->direction);
861

862 863 864
	m = direction & *mask;
	if (m)
		val |= readl_relaxed(base + bank->regs->datain) & m;
865

866 867 868
	m = ~direction & *mask;
	if (m)
		val |= readl_relaxed(base + bank->regs->dataout) & m;
869

870
	*bits = val;
871 872 873 874

	return 0;
}

875 876
static int omap_gpio_debounce(struct gpio_chip *chip, unsigned offset,
			      unsigned debounce)
877 878 879
{
	struct gpio_bank *bank;
	unsigned long flags;
880
	int ret;
881

882
	bank = gpiochip_get_data(chip);
883

884
	raw_spin_lock_irqsave(&bank->lock, flags);
885
	ret = omap2_set_gpio_debounce(bank, offset, debounce);
886
	raw_spin_unlock_irqrestore(&bank->lock, flags);
887

888 889 890 891 892 893
	if (ret)
		dev_info(chip->parent,
			 "Could not set line %u debounce to %u microseconds (%d)",
			 offset, debounce, ret);

	return ret;
894 895
}

896 897 898 899 900 901 902 903 904 905 906 907
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);
}

908
static void omap_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
D
David Brownell 已提交
909 910 911 912
{
	struct gpio_bank *bank;
	unsigned long flags;

913
	bank = gpiochip_get_data(chip);
914
	raw_spin_lock_irqsave(&bank->lock, flags);
915
	bank->set_dataout(bank, offset, value);
916
	raw_spin_unlock_irqrestore(&bank->lock, flags);
D
David Brownell 已提交
917 918
}

919 920 921 922
static void omap_gpio_set_multiple(struct gpio_chip *chip, unsigned long *mask,
				   unsigned long *bits)
{
	struct gpio_bank *bank = gpiochip_get_data(chip);
923
	void __iomem *reg = bank->base + bank->regs->dataout;
924
	unsigned long flags;
925
	u32 l;
926 927

	raw_spin_lock_irqsave(&bank->lock, flags);
928 929 930
	l = (readl_relaxed(reg) & ~*mask) | (*bits & *mask);
	writel_relaxed(l, reg);
	bank->context.dataout = l;
931 932 933
	raw_spin_unlock_irqrestore(&bank->lock, flags);
}

D
David Brownell 已提交
934 935
/*---------------------------------------------------------------------*/

936
static void omap_gpio_show_rev(struct gpio_bank *bank)
T
Tony Lindgren 已提交
937
{
938
	static bool called;
T
Tony Lindgren 已提交
939 940
	u32 rev;

941
	if (called || bank->regs->revision == USHRT_MAX)
T
Tony Lindgren 已提交
942 943
		return;

944
	rev = readw_relaxed(bank->base + bank->regs->revision);
945
	pr_info("OMAP GPIO hardware version %d.%d\n",
T
Tony Lindgren 已提交
946
		(rev >> 4) & 0x0f, rev & 0x0f);
947 948

	called = true;
T
Tony Lindgren 已提交
949 950
}

951
static void omap_gpio_mod_init(struct gpio_bank *bank)
952
{
953 954
	void __iomem *base = bank->base;
	u32 l = 0xffffffff;
955

956 957 958
	if (bank->width == 16)
		l = 0xffff;

959
	if (bank->is_mpuio) {
960
		writel_relaxed(l, bank->base + bank->regs->irqenable);
961
		return;
962
	}
963

964
	omap_gpio_rmw(base + bank->regs->irqenable, l,
965
		      bank->regs->irqenable_inv);
966
	omap_gpio_rmw(base + bank->regs->irqstatus, l,
967
		      !bank->regs->irqenable_inv);
968
	if (bank->regs->debounce_en)
969
		writel_relaxed(0, base + bank->regs->debounce_en);
970

971
	/* Save OE default value (0xffffffff) in the context */
972
	bank->context.oe = readl_relaxed(bank->base + bank->regs->direction);
973 974
	 /* Initialize interface clk ungated, module enabled */
	if (bank->regs->ctrl)
975
		writel_relaxed(0, base + bank->regs->ctrl);
976 977
}

N
Nishanth Menon 已提交
978
static int omap_gpio_chip_init(struct gpio_bank *bank, struct irq_chip *irqc)
979
{
980
	struct gpio_irq_chip *irq;
981
	static int gpio;
982
	const char *label;
983
	int irq_base = 0;
984
	int ret;
985 986 987 988 989 990 991

	/*
	 * 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;
992 993 994
	bank->chip.get_direction = omap_gpio_get_direction;
	bank->chip.direction_input = omap_gpio_input;
	bank->chip.get = omap_gpio_get;
995
	bank->chip.get_multiple = omap_gpio_get_multiple;
996
	bank->chip.direction_output = omap_gpio_output;
997
	bank->chip.set_config = omap_gpio_set_config;
998
	bank->chip.set = omap_gpio_set;
999
	bank->chip.set_multiple = omap_gpio_set_multiple;
1000
	if (bank->is_mpuio) {
1001
		bank->chip.label = "mpuio";
1002
		if (bank->regs->wkup_en)
1003
			bank->chip.parent = &omap_mpuio_device.dev;
1004 1005
		bank->chip.base = OMAP_MPUIO(0);
	} else {
1006 1007 1008 1009 1010
		label = devm_kasprintf(bank->chip.parent, GFP_KERNEL, "gpio-%d-%d",
				       gpio, gpio + bank->width - 1);
		if (!label)
			return -ENOMEM;
		bank->chip.label = label;
1011 1012
		bank->chip.base = gpio;
	}
1013
	bank->chip.ngpio = bank->width;
1014

1015 1016 1017 1018 1019
#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.
	 */
1020 1021
	irq_base = devm_irq_alloc_descs(bank->chip.parent,
					-1, 0, bank->width, 0);
1022
	if (irq_base < 0) {
1023
		dev_err(bank->chip.parent, "Couldn't allocate IRQ numbers\n");
1024 1025 1026 1027
		return -ENODEV;
	}
#endif

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

1032 1033 1034 1035 1036 1037 1038
	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;
1039

1040
	ret = gpiochip_add_data(&bank->chip, bank);
1041
	if (ret) {
1042
		dev_err(bank->chip.parent,
1043 1044
			"Could not register gpio chip %d\n", ret);
		return ret;
1045 1046
	}

1047 1048 1049
	ret = devm_request_irq(bank->chip.parent, bank->irq,
			       omap_gpio_irq_handler,
			       0, dev_name(bank->chip.parent), bank);
1050 1051 1052
	if (ret)
		gpiochip_remove(&bank->chip);

1053 1054 1055
	if (!bank->is_mpuio)
		gpio += bank->width;

1056
	return ret;
1057 1058
}

A
Arnd Bergmann 已提交
1059
static void omap_gpio_init_context(struct gpio_bank *p)
1060
{
1061
	const struct omap_gpio_reg_offs *regs = p->regs;
A
Arnd Bergmann 已提交
1062
	void __iomem *base = p->base;
1063

A
Arnd Bergmann 已提交
1064 1065 1066 1067 1068 1069 1070 1071 1072
	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);
1073
	p->context.dataout	= readl_relaxed(base + regs->dataout);
1074

A
Arnd Bergmann 已提交
1075
	p->context_valid = true;
1076 1077
}

A
Arnd Bergmann 已提交
1078
static void omap_gpio_restore_context(struct gpio_bank *bank)
1079
{
1080
	const struct omap_gpio_reg_offs *regs = bank->regs;
1081 1082 1083 1084 1085 1086 1087 1088 1089 1090
	void __iomem *base = bank->base;

	writel_relaxed(bank->context.wake_en, base + regs->wkup_en);
	writel_relaxed(bank->context.ctrl, base + regs->ctrl);
	writel_relaxed(bank->context.leveldetect0, base + regs->leveldetect0);
	writel_relaxed(bank->context.leveldetect1, base + regs->leveldetect1);
	writel_relaxed(bank->context.risingdetect, base + regs->risingdetect);
	writel_relaxed(bank->context.fallingdetect, base + regs->fallingdetect);
	writel_relaxed(bank->context.dataout, base + regs->dataout);
	writel_relaxed(bank->context.oe, base + regs->direction);
T
Tony Lindgren 已提交
1091

A
Arnd Bergmann 已提交
1092
	if (bank->dbck_enable_mask) {
1093
		writel_relaxed(bank->context.debounce, base + regs->debounce);
A
Arnd Bergmann 已提交
1094
		writel_relaxed(bank->context.debounce_en,
1095
			       base + regs->debounce_en);
1096 1097
	}

1098 1099
	writel_relaxed(bank->context.irqenable1, base + regs->irqenable);
	writel_relaxed(bank->context.irqenable2, base + regs->irqenable2);
1100 1101
}

1102
static void omap_gpio_idle(struct gpio_bank *bank, bool may_lose_context)
1103
{
1104
	struct device *dev = bank->chip.parent;
1105 1106 1107 1108
	void __iomem *base = bank->base;
	u32 nowake;

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

1110 1111 1112
	if (!bank->enabled_non_wakeup_gpios)
		goto update_gpio_context_count;

1113
	if (!may_lose_context)
1114
		goto update_gpio_context_count;
1115

1116
	/*
1117
	 * If going to OFF, remove triggering for all wkup domain
1118 1119 1120
	 * non-wakeup GPIOs.  Otherwise spurious IRQs will be
	 * generated.  See OMAP2420 Errata item 1.101.
	 */
1121 1122
	if (!bank->loses_context && bank->enabled_non_wakeup_gpios) {
		nowake = bank->enabled_non_wakeup_gpios;
1123 1124
		omap_gpio_rmw(base + bank->regs->fallingdetect, nowake, ~nowake);
		omap_gpio_rmw(base + bank->regs->risingdetect, nowake, ~nowake);
1125
	}
1126

1127
update_gpio_context_count:
1128 1129
	if (bank->get_context_loss_count)
		bank->context_loss_count =
1130
				bank->get_context_loss_count(dev);
1131

1132
	omap_gpio_dbck_disable(bank);
1133 1134
}

1135
static void omap_gpio_unidle(struct gpio_bank *bank)
1136
{
1137
	struct device *dev = bank->chip.parent;
1138
	u32 l = 0, gen, gen0, gen1;
1139
	int c;
1140

1141 1142 1143 1144 1145 1146 1147 1148 1149 1150
	/*
	 * 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 =
1151
				bank->get_context_loss_count(dev);
1152 1153
	}

1154
	omap_gpio_dbck_enable(bank);
1155

1156 1157
	if (bank->loses_context) {
		if (!bank->get_context_loss_count) {
1158 1159
			omap_gpio_restore_context(bank);
		} else {
1160
			c = bank->get_context_loss_count(dev);
1161 1162 1163
			if (c != bank->context_loss_count) {
				omap_gpio_restore_context(bank);
			} else {
1164
				return;
1165
			}
1166
		}
1167 1168 1169 1170 1171 1172
	} 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);
1173
	}
1174

1175
	l = readl_relaxed(bank->base + bank->regs->datain);
1176

1177 1178 1179 1180 1181 1182 1183 1184
	/*
	 * 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;
1185

1186 1187 1188 1189
	/*
	 * No need to generate IRQs for the rising edge for gpio IRQs
	 * configured with falling edge only; and vice versa.
	 */
1190
	gen0 = l & bank->context.fallingdetect;
1191
	gen0 &= bank->saved_datain;
1192

1193
	gen1 = l & bank->context.risingdetect;
1194
	gen1 &= ~(bank->saved_datain);
1195

1196
	/* FIXME: Consider GPIO IRQs with level detections properly! */
1197 1198
	gen = l & (~(bank->context.fallingdetect) &
					 ~(bank->context.risingdetect));
1199 1200
	/* Consider all GPIO IRQs needed to be updated */
	gen |= gen0 | gen1;
1201

1202 1203
	if (gen) {
		u32 old0, old1;
1204

1205 1206
		old0 = readl_relaxed(bank->base + bank->regs->leveldetect0);
		old1 = readl_relaxed(bank->base + bank->regs->leveldetect1);
1207

1208
		if (!bank->regs->irqstatus_raw0) {
1209
			writel_relaxed(old0 | gen, bank->base +
1210
						bank->regs->leveldetect0);
1211
			writel_relaxed(old1 | gen, bank->base +
1212
						bank->regs->leveldetect1);
1213
		}
1214

1215
		if (bank->regs->irqstatus_raw0) {
1216
			writel_relaxed(old0 | l, bank->base +
1217
						bank->regs->leveldetect0);
1218
			writel_relaxed(old1 | l, bank->base +
1219
						bank->regs->leveldetect1);
1220
		}
1221 1222
		writel_relaxed(old0, bank->base + bank->regs->leveldetect0);
		writel_relaxed(old1, bank->base + bank->regs->leveldetect1);
1223 1224 1225
	}
}

A
Arnd Bergmann 已提交
1226 1227
static int gpio_omap_cpu_notifier(struct notifier_block *nb,
				  unsigned long cmd, void *v)
1228
{
A
Arnd Bergmann 已提交
1229 1230
	struct gpio_bank *bank;
	unsigned long flags;
1231

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

A
Arnd Bergmann 已提交
1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248
	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);
1249

A
Arnd Bergmann 已提交
1250
	return NOTIFY_OK;
1251 1252
}

1253
static const struct omap_gpio_reg_offs omap2_gpio_regs = {
1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275
	.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,
};

1276
static const struct omap_gpio_reg_offs omap4_gpio_regs = {
1277 1278 1279 1280 1281 1282 1283 1284
	.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,
1285 1286
	.irqstatus_raw0 =	OMAP4_GPIO_IRQSTATUSRAW0,
	.irqstatus_raw1 =	OMAP4_GPIO_IRQSTATUSRAW1,
1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300
	.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,
};

1301
static const struct omap_gpio_platform_data omap2_pdata = {
1302 1303 1304 1305 1306
	.regs = &omap2_gpio_regs,
	.bank_width = 32,
	.dbck_flag = false,
};

1307
static const struct omap_gpio_platform_data omap3_pdata = {
1308 1309 1310 1311 1312
	.regs = &omap2_gpio_regs,
	.bank_width = 32,
	.dbck_flag = true,
};

1313
static const struct omap_gpio_platform_data omap4_pdata = {
1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334
	.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 已提交
1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361

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 已提交
1362
	irqc->irq_ack = dummy_irq_chip.irq_ack,
A
Arnd Bergmann 已提交
1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392
	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);
1393 1394
#endif

A
Arnd Bergmann 已提交
1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405
	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;
	}

1406
	if (bank->regs->set_dataout && bank->regs->clr_dataout)
A
Arnd Bergmann 已提交
1407
		bank->set_dataout = omap_set_gpio_dataout_reg;
1408
	else
A
Arnd Bergmann 已提交
1409 1410 1411 1412 1413 1414
		bank->set_dataout = omap_set_gpio_dataout_mask;

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

	/* Static mapping, never released */
1415
	bank->base = devm_platform_ioremap_resource(pdev, 0);
A
Arnd Bergmann 已提交
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 1446 1447 1448 1449 1450 1451
	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);

1452 1453
	bank->nb.notifier_call = gpio_omap_cpu_notifier;
	cpu_pm_register_notifier(&bank->nb);
A
Arnd Bergmann 已提交
1454 1455 1456 1457 1458 1459 1460 1461 1462 1463

	pm_runtime_put(dev);

	return 0;
}

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

1464
	cpu_pm_unregister_notifier(&bank->nb);
A
Arnd Bergmann 已提交
1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482
	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);

1483
	return 0;
A
Arnd Bergmann 已提交
1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495
}

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

1496
	return 0;
A
Arnd Bergmann 已提交
1497 1498 1499 1500 1501 1502 1503
}

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

1504 1505
static struct platform_driver omap_gpio_driver = {
	.probe		= omap_gpio_probe,
1506
	.remove		= omap_gpio_remove,
1507 1508
	.driver		= {
		.name	= "omap_gpio",
1509
		.pm	= &gpio_pm_ops,
A
Arnd Bergmann 已提交
1510
		.of_match_table = omap_gpio_match,
1511 1512 1513
	},
};

1514
/*
1515 1516 1517
 * gpio driver register needs to be done before
 * machine_init functions access gpio APIs.
 * Hence omap_gpio_drv_reg() is a postcore_initcall.
1518
 */
1519
static int __init omap_gpio_drv_reg(void)
1520
{
1521
	return platform_driver_register(&omap_gpio_driver);
1522
}
1523
postcore_initcall(omap_gpio_drv_reg);
1524 1525 1526 1527 1528 1529 1530 1531 1532 1533

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