gpio.c 11.6 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12
/*
 * arch/arm/plat-orion/gpio.c
 *
 * Marvell Orion SoC GPIO handling.
 *
 * This file is licensed under the terms of the GNU General Public
 * License version 2.  This program is licensed "as is" without any
 * warranty of any kind, whether express or implied.
 */

#include <linux/kernel.h>
#include <linux/init.h>
13
#include <linux/irq.h>
14 15 16 17
#include <linux/module.h>
#include <linux/spinlock.h>
#include <linux/bitops.h>
#include <linux/io.h>
18
#include <linux/gpio.h>
19

20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
/*
 * GPIO unit register offsets.
 */
#define GPIO_OUT_OFF		0x0000
#define GPIO_IO_CONF_OFF	0x0004
#define GPIO_BLINK_EN_OFF	0x0008
#define GPIO_IN_POL_OFF		0x000c
#define GPIO_DATA_IN_OFF	0x0010
#define GPIO_EDGE_CAUSE_OFF	0x0014
#define GPIO_EDGE_MASK_OFF	0x0018
#define GPIO_LEVEL_MASK_OFF	0x001c

struct orion_gpio_chip {
	struct gpio_chip	chip;
	spinlock_t		lock;
	void __iomem		*base;
	unsigned long		valid_input;
	unsigned long		valid_output;
	int			mask_offset;
	int			secondary_irq_base;
};

static void __iomem *GPIO_OUT(struct orion_gpio_chip *ochip)
{
	return ochip->base + GPIO_OUT_OFF;
}

static void __iomem *GPIO_IO_CONF(struct orion_gpio_chip *ochip)
{
	return ochip->base + GPIO_IO_CONF_OFF;
}

static void __iomem *GPIO_BLINK_EN(struct orion_gpio_chip *ochip)
{
	return ochip->base + GPIO_BLINK_EN_OFF;
}

static void __iomem *GPIO_IN_POL(struct orion_gpio_chip *ochip)
{
	return ochip->base + GPIO_IN_POL_OFF;
}

static void __iomem *GPIO_DATA_IN(struct orion_gpio_chip *ochip)
{
	return ochip->base + GPIO_DATA_IN_OFF;
}

static void __iomem *GPIO_EDGE_CAUSE(struct orion_gpio_chip *ochip)
{
	return ochip->base + GPIO_EDGE_CAUSE_OFF;
}

static void __iomem *GPIO_EDGE_MASK(struct orion_gpio_chip *ochip)
{
	return ochip->base + ochip->mask_offset + GPIO_EDGE_MASK_OFF;
}

static void __iomem *GPIO_LEVEL_MASK(struct orion_gpio_chip *ochip)
{
	return ochip->base + ochip->mask_offset + GPIO_LEVEL_MASK_OFF;
}

82

83 84 85 86 87
static struct orion_gpio_chip orion_gpio_chips[2];
static int orion_gpio_chip_count;

static inline void
__set_direction(struct orion_gpio_chip *ochip, unsigned pin, int input)
88 89 90
{
	u32 u;

91
	u = readl(GPIO_IO_CONF(ochip));
92
	if (input)
93
		u |= 1 << pin;
94
	else
95 96
		u &= ~(1 << pin);
	writel(u, GPIO_IO_CONF(ochip));
97 98
}

99
static void __set_level(struct orion_gpio_chip *ochip, unsigned pin, int high)
100 101 102
{
	u32 u;

103
	u = readl(GPIO_OUT(ochip));
104
	if (high)
105
		u |= 1 << pin;
106
	else
107 108
		u &= ~(1 << pin);
	writel(u, GPIO_OUT(ochip));
109 110
}

111 112
static inline void
__set_blinking(struct orion_gpio_chip *ochip, unsigned pin, int blink)
113
{
114
	u32 u;
115

116
	u = readl(GPIO_BLINK_EN(ochip));
117
	if (blink)
118
		u |= 1 << pin;
119
	else
120 121
		u &= ~(1 << pin);
	writel(u, GPIO_BLINK_EN(ochip));
122
}
123

124 125
static inline int
orion_gpio_is_valid(struct orion_gpio_chip *ochip, unsigned pin, int mode)
126
{
127 128 129 130 131 132 133 134 135 136
	if (pin >= ochip->chip.ngpio)
		goto err_out;

	if ((mode & GPIO_INPUT_OK) && !test_bit(pin, &ochip->valid_input))
		goto err_out;

	if ((mode & GPIO_OUTPUT_OK) && !test_bit(pin, &ochip->valid_output))
		goto err_out;

	return 1;
137

138 139 140
err_out:
	pr_debug("%s: invalid GPIO %d\n", __func__, pin);
	return false;
141 142
}

143 144 145
/*
 * GENERIC_GPIO primitives.
 */
146 147 148 149 150 151 152 153 154 155 156 157
static int orion_gpio_request(struct gpio_chip *chip, unsigned pin)
{
	struct orion_gpio_chip *ochip =
		container_of(chip, struct orion_gpio_chip, chip);

	if (orion_gpio_is_valid(ochip, pin, GPIO_INPUT_OK) ||
	    orion_gpio_is_valid(ochip, pin, GPIO_OUTPUT_OK))
		return 0;

	return -EINVAL;
}

158
static int orion_gpio_direction_input(struct gpio_chip *chip, unsigned pin)
159
{
160 161
	struct orion_gpio_chip *ochip =
		container_of(chip, struct orion_gpio_chip, chip);
162 163
	unsigned long flags;

164
	if (!orion_gpio_is_valid(ochip, pin, GPIO_INPUT_OK))
165 166
		return -EINVAL;

167 168 169
	spin_lock_irqsave(&ochip->lock, flags);
	__set_direction(ochip, pin, 1);
	spin_unlock_irqrestore(&ochip->lock, flags);
170 171 172 173

	return 0;
}

174
static int orion_gpio_get(struct gpio_chip *chip, unsigned pin)
175
{
176 177
	struct orion_gpio_chip *ochip =
		container_of(chip, struct orion_gpio_chip, chip);
178 179
	int val;

180 181 182 183 184
	if (readl(GPIO_IO_CONF(ochip)) & (1 << pin)) {
		val = readl(GPIO_DATA_IN(ochip)) ^ readl(GPIO_IN_POL(ochip));
	} else {
		val = readl(GPIO_OUT(ochip));
	}
185

186
	return (val >> pin) & 1;
187 188
}

189 190
static int
orion_gpio_direction_output(struct gpio_chip *chip, unsigned pin, int value)
191
{
192 193
	struct orion_gpio_chip *ochip =
		container_of(chip, struct orion_gpio_chip, chip);
194
	unsigned long flags;
195

196
	if (!orion_gpio_is_valid(ochip, pin, GPIO_OUTPUT_OK))
197
		return -EINVAL;
198

199 200 201 202 203
	spin_lock_irqsave(&ochip->lock, flags);
	__set_blinking(ochip, pin, 0);
	__set_level(ochip, pin, value);
	__set_direction(ochip, pin, 0);
	spin_unlock_irqrestore(&ochip->lock, flags);
204 205

	return 0;
206 207
}

208
static void orion_gpio_set(struct gpio_chip *chip, unsigned pin, int value)
209
{
210 211
	struct orion_gpio_chip *ochip =
		container_of(chip, struct orion_gpio_chip, chip);
212 213
	unsigned long flags;

214 215 216
	spin_lock_irqsave(&ochip->lock, flags);
	__set_level(ochip, pin, value);
	spin_unlock_irqrestore(&ochip->lock, flags);
217 218
}

219
static int orion_gpio_to_irq(struct gpio_chip *chip, unsigned pin)
220
{
221 222
	struct orion_gpio_chip *ochip =
		container_of(chip, struct orion_gpio_chip, chip);
223

224
	return ochip->secondary_irq_base + pin;
225
}
226

227

228 229 230
/*
 * Orion-specific GPIO API extensions.
 */
231 232 233 234 235 236 237 238 239 240 241 242 243 244 245
static struct orion_gpio_chip *orion_gpio_chip_find(int pin)
{
	int i;

	for (i = 0; i < orion_gpio_chip_count; i++) {
		struct orion_gpio_chip *ochip = orion_gpio_chips + i;
		struct gpio_chip *chip = &ochip->chip;

		if (pin >= chip->base && pin < chip->base + chip->ngpio)
			return ochip;
	}

	return NULL;
}

246 247
void __init orion_gpio_set_unused(unsigned pin)
{
248 249 250 251 252 253 254
	struct orion_gpio_chip *ochip = orion_gpio_chip_find(pin);

	if (ochip == NULL)
		return;

	pin -= ochip->chip.base;

255
	/* Configure as output, drive low. */
256 257
	__set_level(ochip, pin, 0);
	__set_direction(ochip, pin, 0);
258 259
}

260
void __init orion_gpio_set_valid(unsigned pin, int mode)
261
{
262 263 264 265 266 267 268
	struct orion_gpio_chip *ochip = orion_gpio_chip_find(pin);

	if (ochip == NULL)
		return;

	pin -= ochip->chip.base;

269 270
	if (mode == 1)
		mode = GPIO_INPUT_OK | GPIO_OUTPUT_OK;
271

272
	if (mode & GPIO_INPUT_OK)
273
		__set_bit(pin, &ochip->valid_input);
274
	else
275 276
		__clear_bit(pin, &ochip->valid_input);

277
	if (mode & GPIO_OUTPUT_OK)
278
		__set_bit(pin, &ochip->valid_output);
279
	else
280
		__clear_bit(pin, &ochip->valid_output);
281 282 283 284
}

void orion_gpio_set_blink(unsigned pin, int blink)
{
285
	struct orion_gpio_chip *ochip = orion_gpio_chip_find(pin);
286 287
	unsigned long flags;

288 289
	if (ochip == NULL)
		return;
290

291 292 293 294
	spin_lock_irqsave(&ochip->lock, flags);
	__set_level(ochip, pin, 0);
	__set_blinking(ochip, pin, blink);
	spin_unlock_irqrestore(&ochip->lock, flags);
295 296
}
EXPORT_SYMBOL(orion_gpio_set_blink);
297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324


/*****************************************************************************
 * Orion GPIO IRQ
 *
 * GPIO_IN_POL register controls whether GPIO_DATA_IN will hold the same
 * value of the line or the opposite value.
 *
 * Level IRQ handlers: DATA_IN is used directly as cause register.
 *                     Interrupt are masked by LEVEL_MASK registers.
 * Edge IRQ handlers:  Change in DATA_IN are latched in EDGE_CAUSE.
 *                     Interrupt are masked by EDGE_MASK registers.
 * Both-edge handlers: Similar to regular Edge handlers, but also swaps
 *                     the polarity to catch the next line transaction.
 *                     This is a race condition that might not perfectly
 *                     work on some use cases.
 *
 * Every eight GPIO lines are grouped (OR'ed) before going up to main
 * cause register.
 *
 *                    EDGE  cause    mask
 *        data-in   /--------| |-----| |----\
 *     -----| |-----                         ---- to main cause reg
 *           X      \----------------| |----/
 *        polarity    LEVEL          mask
 *
 ****************************************************************************/

325
static int gpio_irq_set_type(struct irq_data *d, u32 type)
326
{
327 328 329
	struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
	struct irq_chip_type *ct = irq_data_get_chip_type(d);
	struct orion_gpio_chip *ochip = gc->private;
330
	int pin;
331 332
	u32 u;

333
	pin = d->irq - gc->irq_base;
334 335

	u = readl(GPIO_IO_CONF(ochip)) & (1 << pin);
336 337
	if (!u) {
		printk(KERN_ERR "orion gpio_irq_set_type failed "
338
				"(irq %d, pin %d).\n", d->irq, pin);
339 340 341
		return -EINVAL;
	}

342 343
	type &= IRQ_TYPE_SENSE_MASK;
	if (type == IRQ_TYPE_NONE)
344
		return -EINVAL;
345 346 347 348 349

	/* Check if we need to change chip and handler */
	if (!(ct->type & type))
		if (irq_setup_alt_chip(d, type))
			return -EINVAL;
350 351 352 353 354

	/*
	 * Configure interrupt polarity.
	 */
	if (type == IRQ_TYPE_EDGE_RISING || type == IRQ_TYPE_LEVEL_HIGH) {
355 356 357
		u = readl(GPIO_IN_POL(ochip));
		u &= ~(1 << pin);
		writel(u, GPIO_IN_POL(ochip));
358
	} else if (type == IRQ_TYPE_EDGE_FALLING || type == IRQ_TYPE_LEVEL_LOW) {
359 360 361
		u = readl(GPIO_IN_POL(ochip));
		u |= 1 << pin;
		writel(u, GPIO_IN_POL(ochip));
362 363 364
	} else if (type == IRQ_TYPE_EDGE_BOTH) {
		u32 v;

365
		v = readl(GPIO_IN_POL(ochip)) ^ readl(GPIO_DATA_IN(ochip));
366 367 368 369

		/*
		 * set initial polarity based on current input level
		 */
370 371 372
		u = readl(GPIO_IN_POL(ochip));
		if (v & (1 << pin))
			u |= 1 << pin;		/* falling */
373
		else
374 375
			u &= ~(1 << pin);	/* rising */
		writel(u, GPIO_IN_POL(ochip));
376 377 378 379 380
	}

	return 0;
}

381 382 383 384
void __init orion_gpio_init(int gpio_base, int ngpio,
			    u32 base, int mask_offset, int secondary_irq_base)
{
	struct orion_gpio_chip *ochip;
385 386
	struct irq_chip_generic *gc;
	struct irq_chip_type *ct;
387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419

	if (orion_gpio_chip_count == ARRAY_SIZE(orion_gpio_chips))
		return;

	ochip = orion_gpio_chips + orion_gpio_chip_count;
	ochip->chip.label = "orion_gpio";
	ochip->chip.request = orion_gpio_request;
	ochip->chip.direction_input = orion_gpio_direction_input;
	ochip->chip.get = orion_gpio_get;
	ochip->chip.direction_output = orion_gpio_direction_output;
	ochip->chip.set = orion_gpio_set;
	ochip->chip.to_irq = orion_gpio_to_irq;
	ochip->chip.base = gpio_base;
	ochip->chip.ngpio = ngpio;
	ochip->chip.can_sleep = 0;
	spin_lock_init(&ochip->lock);
	ochip->base = (void __iomem *)base;
	ochip->valid_input = 0;
	ochip->valid_output = 0;
	ochip->mask_offset = mask_offset;
	ochip->secondary_irq_base = secondary_irq_base;

	gpiochip_add(&ochip->chip);

	orion_gpio_chip_count++;

	/*
	 * Mask and clear GPIO interrupts.
	 */
	writel(0, GPIO_EDGE_CAUSE(ochip));
	writel(0, GPIO_EDGE_MASK(ochip));
	writel(0, GPIO_LEVEL_MASK(ochip));

420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442
	gc = irq_alloc_generic_chip("orion_gpio_irq", 2, secondary_irq_base,
				    ochip->base, handle_level_irq);
	gc->private = ochip;

	ct = gc->chip_types;
	ct->regs.mask = ochip->mask_offset + GPIO_LEVEL_MASK_OFF;
	ct->type = IRQ_TYPE_LEVEL_HIGH | IRQ_TYPE_LEVEL_LOW;
	ct->chip.irq_mask = irq_gc_mask_clr_bit;
	ct->chip.irq_unmask = irq_gc_mask_set_bit;
	ct->chip.irq_set_type = gpio_irq_set_type;

	ct++;
	ct->regs.mask = ochip->mask_offset + GPIO_EDGE_MASK_OFF;
	ct->regs.ack = GPIO_EDGE_CAUSE_OFF;
	ct->type = IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING;
	ct->chip.irq_ack = irq_gc_ack;
	ct->chip.irq_mask = irq_gc_mask_clr_bit;
	ct->chip.irq_unmask = irq_gc_mask_set_bit;
	ct->chip.irq_set_type = gpio_irq_set_type;
	ct->handler = handle_edge_irq;

	irq_setup_generic_chip(gc, IRQ_MSK(ngpio), IRQ_GC_INIT_MASK_CACHE,
			       IRQ_NOREQUEST, IRQ_LEVEL | IRQ_NOPROBE);
443 444
}

445 446
void orion_gpio_irq_handler(int pinoff)
{
447
	struct orion_gpio_chip *ochip;
T
Thomas Gleixner 已提交
448
	u32 cause, type;
449
	int i;
450

451 452 453
	ochip = orion_gpio_chip_find(pinoff);
	if (ochip == NULL)
		return;
454

455 456
	cause = readl(GPIO_DATA_IN(ochip)) & readl(GPIO_LEVEL_MASK(ochip));
	cause |= readl(GPIO_EDGE_CAUSE(ochip)) & readl(GPIO_EDGE_MASK(ochip));
457

458 459 460 461 462 463
	for (i = 0; i < ochip->chip.ngpio; i++) {
		int irq;

		irq = ochip->secondary_irq_base + i;

		if (!(cause & (1 << i)))
464 465
			continue;

T
Thomas Gleixner 已提交
466 467
		type = irqd_get_trigger_type(irq_get_irq_data(irq));
		if ((type & IRQ_TYPE_SENSE_MASK) == IRQ_TYPE_EDGE_BOTH) {
468 469 470
			/* Swap polarity (race with GPIO line) */
			u32 polarity;

471 472 473
			polarity = readl(GPIO_IN_POL(ochip));
			polarity ^= 1 << i;
			writel(polarity, GPIO_IN_POL(ochip));
474
		}
T
Thomas Gleixner 已提交
475
		generic_handle_irq(irq);
476 477
	}
}