gpio-generic.c 13.0 KB
Newer Older
1
/*
G
Grant Likely 已提交
2
 * Generic driver for memory-mapped GPIO controllers.
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 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
 *
 * Copyright 2008 MontaVista Software, Inc.
 * Copyright 2008,2010 Anton Vorontsov <cbouatmailru@gmail.com>
 *
 * This program is free software; you can redistribute  it and/or modify it
 * under  the terms of  the GNU General  Public License as published by the
 * Free Software Foundation;  either version 2 of the  License, or (at your
 * option) any later version.
 *
 * ....``.```~~~~````.`.`.`.`.```````'',,,.........`````......`.......
 * ...``                                                         ```````..
 * ..The simplest form of a GPIO controller that the driver supports is``
 *  `.just a single "data" register, where GPIO state can be read and/or `
 *    `,..written. ,,..``~~~~ .....``.`.`.~~.```.`.........``````.```````
 *        `````````
                                    ___
_/~~|___/~|   . ```~~~~~~       ___/___\___     ,~.`.`.`.`````.~~...,,,,...
__________|~$@~~~        %~    /o*o*o*o*o*o\   .. Implementing such a GPIO .
o        `                     ~~~~\___/~~~~    ` controller in FPGA is ,.`
                                                 `....trivial..'~`.```.```
 *                                                    ```````
 *  .```````~~~~`..`.``.``.
 * .  The driver supports  `...       ,..```.`~~~```````````````....````.``,,
 * .   big-endian notation, just`.  .. A bit more sophisticated controllers ,
 *  . register the device with -be`. .with a pair of set/clear-bit registers ,
 *   `.. suffix.  ```~~`````....`.`   . affecting the data register and the .`
 *     ``.`.``...```                  ```.. output pins are also supported.`
 *                        ^^             `````.`````````.,``~``~``~~``````
 *                                                   .                  ^^
 *   ,..`.`.`...````````````......`.`.`.`.`.`..`.`.`..
 * .. The expectation is that in at least some cases .    ,-~~~-,
 *  .this will be used with roll-your-own ASIC/FPGA .`     \   /
 *  .logic in Verilog or VHDL. ~~~`````````..`````~~`       \ /
 *  ..````````......```````````                             \o_
 *                                                           |
 *                              ^^                          / \
 *
 *           ...`````~~`.....``.`..........``````.`.``.```........``.
 *            `  8, 16, 32 and 64 bits registers are supported, and``.
 *            . the number of GPIOs is determined by the width of   ~
 *             .. the registers. ,............```.`.`..`.`.~~~.`.`.`~
 *               `.......````.```
 */

#include <linux/init.h>
48
#include <linux/err.h>
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
#include <linux/bug.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/spinlock.h>
#include <linux/compiler.h>
#include <linux/types.h>
#include <linux/errno.h>
#include <linux/log2.h>
#include <linux/ioport.h>
#include <linux/io.h>
#include <linux/gpio.h>
#include <linux/slab.h>
#include <linux/platform_device.h>
#include <linux/mod_devicetable.h>
#include <linux/basic_mmio_gpio.h>

65
static void bgpio_write8(void __iomem *reg, unsigned long data)
66
{
67
	writeb(data, reg);
68 69
}

70
static unsigned long bgpio_read8(void __iomem *reg)
71
{
72
	return readb(reg);
73 74 75 76
}

static void bgpio_write16(void __iomem *reg, unsigned long data)
{
77
	writew(data, reg);
78 79 80 81
}

static unsigned long bgpio_read16(void __iomem *reg)
{
82
	return readw(reg);
83 84 85 86
}

static void bgpio_write32(void __iomem *reg, unsigned long data)
{
87
	writel(data, reg);
88 89 90 91
}

static unsigned long bgpio_read32(void __iomem *reg)
{
92
	return readl(reg);
93 94
}

95
#if BITS_PER_LONG >= 64
96 97
static void bgpio_write64(void __iomem *reg, unsigned long data)
{
98
	writeq(data, reg);
99 100 101 102
}

static unsigned long bgpio_read64(void __iomem *reg)
{
103
	return readq(reg);
104
}
105
#endif /* BITS_PER_LONG >= 64 */
106 107 108

static unsigned long bgpio_pin2mask(struct bgpio_chip *bgc, unsigned int pin)
{
109 110 111 112 113 114 115
	return 1 << pin;
}

static unsigned long bgpio_pin2mask_be(struct bgpio_chip *bgc,
				       unsigned int pin)
{
	return 1 << (bgc->bits - 1 - pin);
116 117 118 119 120 121
}

static int bgpio_get(struct gpio_chip *gc, unsigned int gpio)
{
	struct bgpio_chip *bgc = to_bgpio_chip(gc);

122
	return bgc->read_reg(bgc->reg_dat) & bgc->pin2mask(bgc, gpio);
123 124 125 126 127
}

static void bgpio_set(struct gpio_chip *gc, unsigned int gpio, int val)
{
	struct bgpio_chip *bgc = to_bgpio_chip(gc);
128
	unsigned long mask = bgc->pin2mask(bgc, gpio);
129 130 131 132 133 134 135 136 137
	unsigned long flags;

	spin_lock_irqsave(&bgc->lock, flags);

	if (val)
		bgc->data |= mask;
	else
		bgc->data &= ~mask;

138
	bgc->write_reg(bgc->reg_dat, bgc->data);
139 140 141 142

	spin_unlock_irqrestore(&bgc->lock, flags);
}

143 144 145 146 147 148 149 150 151 152 153 154
static void bgpio_set_with_clear(struct gpio_chip *gc, unsigned int gpio,
				 int val)
{
	struct bgpio_chip *bgc = to_bgpio_chip(gc);
	unsigned long mask = bgc->pin2mask(bgc, gpio);

	if (val)
		bgc->write_reg(bgc->reg_set, mask);
	else
		bgc->write_reg(bgc->reg_clr, mask);
}

155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172
static void bgpio_set_set(struct gpio_chip *gc, unsigned int gpio, int val)
{
	struct bgpio_chip *bgc = to_bgpio_chip(gc);
	unsigned long mask = bgc->pin2mask(bgc, gpio);
	unsigned long flags;

	spin_lock_irqsave(&bgc->lock, flags);

	if (val)
		bgc->data |= mask;
	else
		bgc->data &= ~mask;

	bgc->write_reg(bgc->reg_set, bgc->data);

	spin_unlock_irqrestore(&bgc->lock, flags);
}

173 174 175 176 177 178 179 180 181 182 183 184 185
static int bgpio_simple_dir_in(struct gpio_chip *gc, unsigned int gpio)
{
	return 0;
}

static int bgpio_simple_dir_out(struct gpio_chip *gc, unsigned int gpio,
				int val)
{
	gc->set(gc, gpio, val);

	return 0;
}

186 187
static int bgpio_dir_in(struct gpio_chip *gc, unsigned int gpio)
{
188 189 190 191 192 193 194 195 196 197
	struct bgpio_chip *bgc = to_bgpio_chip(gc);
	unsigned long flags;

	spin_lock_irqsave(&bgc->lock, flags);

	bgc->dir &= ~bgc->pin2mask(bgc, gpio);
	bgc->write_reg(bgc->reg_dir, bgc->dir);

	spin_unlock_irqrestore(&bgc->lock, flags);

198 199 200 201 202
	return 0;
}

static int bgpio_dir_out(struct gpio_chip *gc, unsigned int gpio, int val)
{
203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237
	struct bgpio_chip *bgc = to_bgpio_chip(gc);
	unsigned long flags;

	gc->set(gc, gpio, val);

	spin_lock_irqsave(&bgc->lock, flags);

	bgc->dir |= bgc->pin2mask(bgc, gpio);
	bgc->write_reg(bgc->reg_dir, bgc->dir);

	spin_unlock_irqrestore(&bgc->lock, flags);

	return 0;
}

static int bgpio_dir_in_inv(struct gpio_chip *gc, unsigned int gpio)
{
	struct bgpio_chip *bgc = to_bgpio_chip(gc);
	unsigned long flags;

	spin_lock_irqsave(&bgc->lock, flags);

	bgc->dir |= bgc->pin2mask(bgc, gpio);
	bgc->write_reg(bgc->reg_dir, bgc->dir);

	spin_unlock_irqrestore(&bgc->lock, flags);

	return 0;
}

static int bgpio_dir_out_inv(struct gpio_chip *gc, unsigned int gpio, int val)
{
	struct bgpio_chip *bgc = to_bgpio_chip(gc);
	unsigned long flags;

238 239
	gc->set(gc, gpio, val);

240 241 242 243 244 245 246
	spin_lock_irqsave(&bgc->lock, flags);

	bgc->dir &= ~bgc->pin2mask(bgc, gpio);
	bgc->write_reg(bgc->reg_dir, bgc->dir);

	spin_unlock_irqrestore(&bgc->lock, flags);

247 248 249
	return 0;
}

250 251 252
static int bgpio_setup_accessors(struct device *dev,
				 struct bgpio_chip *bgc,
				 bool be)
253
{
254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274

	switch (bgc->bits) {
	case 8:
		bgc->read_reg	= bgpio_read8;
		bgc->write_reg	= bgpio_write8;
		break;
	case 16:
		bgc->read_reg	= bgpio_read16;
		bgc->write_reg	= bgpio_write16;
		break;
	case 32:
		bgc->read_reg	= bgpio_read32;
		bgc->write_reg	= bgpio_write32;
		break;
#if BITS_PER_LONG >= 64
	case 64:
		bgc->read_reg	= bgpio_read64;
		bgc->write_reg	= bgpio_write64;
		break;
#endif /* BITS_PER_LONG >= 64 */
	default:
275
		dev_err(dev, "unsupported data width %u bits\n", bgc->bits);
276 277 278
		return -EINVAL;
	}

279
	bgc->pin2mask = be ? bgpio_pin2mask_be : bgpio_pin2mask;
280 281 282 283

	return 0;
}

284 285
/*
 * Create the device and allocate the resources.  For setting GPIO's there are
286
 * three supported configurations:
287
 *
288
 *	- single input/output register resource (named "dat").
289
 *	- set/clear pair (named "set" and "clr").
290 291
 *	- single output register resource and single input resource ("set" and
 *	dat").
292 293 294 295 296
 *
 * For the single output register, this drives a 1 by setting a bit and a zero
 * by clearing a bit.  For the set clr pair, this drives a 1 by setting a bit
 * in the set register and clears it by setting a bit in the clear register.
 * The configuration is detected by which resources are present.
297 298 299 300 301 302 303 304
 *
 * For setting the GPIO direction, there are three supported configurations:
 *
 *	- simple bidirection GPIO that requires no configuration.
 *	- an output direction register (named "dirout") where a 1 bit
 *	indicates the GPIO is an output.
 *	- an input direction register (named "dirin") where a 1 bit indicates
 *	the GPIO is an input.
305
 */
306 307 308 309
static int bgpio_setup_io(struct bgpio_chip *bgc,
			  void __iomem *dat,
			  void __iomem *set,
			  void __iomem *clr)
310
{
311

312
	bgc->reg_dat = dat;
313
	if (!bgc->reg_dat)
314
		return -EINVAL;
315

316 317 318
	if (set && clr) {
		bgc->reg_set = set;
		bgc->reg_clr = clr;
319
		bgc->gc.set = bgpio_set_with_clear;
320 321
	} else if (set && !clr) {
		bgc->reg_set = set;
322
		bgc->gc.set = bgpio_set_set;
323 324
	} else {
		bgc->gc.set = bgpio_set;
325 326
	}

327 328
	bgc->gc.get = bgpio_get;

329 330 331
	return 0;
}

332 333 334
static int bgpio_setup_direction(struct bgpio_chip *bgc,
				 void __iomem *dirout,
				 void __iomem *dirin)
335
{
336
	if (dirout && dirin) {
337
		return -EINVAL;
338 339
	} else if (dirout) {
		bgc->reg_dir = dirout;
340 341
		bgc->gc.direction_output = bgpio_dir_out;
		bgc->gc.direction_input = bgpio_dir_in;
342 343
	} else if (dirin) {
		bgc->reg_dir = dirin;
344 345 346 347 348 349 350 351 352 353
		bgc->gc.direction_output = bgpio_dir_out_inv;
		bgc->gc.direction_input = bgpio_dir_in_inv;
	} else {
		bgc->gc.direction_output = bgpio_simple_dir_out;
		bgc->gc.direction_input = bgpio_simple_dir_in;
	}

	return 0;
}

354
int bgpio_remove(struct bgpio_chip *bgc)
355 356 357 358 359 360 361 362 363
{
	int err = gpiochip_remove(&bgc->gc);

	kfree(bgc);

	return err;
}
EXPORT_SYMBOL_GPL(bgpio_remove);

364 365 366
int bgpio_init(struct bgpio_chip *bgc, struct device *dev,
	       unsigned long sz, void __iomem *dat, void __iomem *set,
	       void __iomem *clr, void __iomem *dirout, void __iomem *dirin,
367
	       unsigned long flags)
368 369 370
{
	int ret;

371 372
	if (!is_power_of_2(sz))
		return -EINVAL;
373

374 375 376 377 378 379 380 381 382 383 384
	bgc->bits = sz * 8;
	if (bgc->bits > BITS_PER_LONG)
		return -EINVAL;

	spin_lock_init(&bgc->lock);
	bgc->gc.dev = dev;
	bgc->gc.label = dev_name(dev);
	bgc->gc.base = -1;
	bgc->gc.ngpio = bgc->bits;

	ret = bgpio_setup_io(bgc, dat, set, clr);
385 386
	if (ret)
		return ret;
387

388
	ret = bgpio_setup_accessors(dev, bgc, flags & BGPIOF_BIG_ENDIAN);
389 390
	if (ret)
		return ret;
391

392
	ret = bgpio_setup_direction(bgc, dirout, dirin);
393 394 395
	if (ret)
		return ret;

396
	bgc->data = bgc->read_reg(bgc->reg_dat);
397 398 399 400 401
	if (bgc->gc.set == bgpio_set_set &&
			!(flags & BGPIOF_UNREADABLE_REG_SET))
		bgc->data = bgc->read_reg(bgc->reg_set);
	if (bgc->reg_dir && !(flags & BGPIOF_UNREADABLE_REG_DIR))
		bgc->dir = bgc->read_reg(bgc->reg_dir);
402

403 404 405
	return ret;
}
EXPORT_SYMBOL_GPL(bgpio_init);
406

G
Grant Likely 已提交
407
#ifdef CONFIG_GPIO_GENERIC_PLATFORM
408

409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442
static void __iomem *bgpio_map(struct platform_device *pdev,
			       const char *name,
			       resource_size_t sane_sz,
			       int *err)
{
	struct device *dev = &pdev->dev;
	struct resource *r;
	resource_size_t start;
	resource_size_t sz;
	void __iomem *ret;

	*err = 0;

	r = platform_get_resource_byname(pdev, IORESOURCE_MEM, name);
	if (!r)
		return NULL;

	sz = resource_size(r);
	if (sz != sane_sz) {
		*err = -EINVAL;
		return NULL;
	}

	start = r->start;
	if (!devm_request_mem_region(dev, start, sz, r->name)) {
		*err = -EBUSY;
		return NULL;
	}

	ret = devm_ioremap(dev, start, sz);
	if (!ret) {
		*err = -ENOMEM;
		return NULL;
	}
443 444 445 446

	return ret;
}

B
Bill Pemberton 已提交
447
static int bgpio_pdev_probe(struct platform_device *pdev)
448 449 450 451 452 453 454 455 456
{
	struct device *dev = &pdev->dev;
	struct resource *r;
	void __iomem *dat;
	void __iomem *set;
	void __iomem *clr;
	void __iomem *dirout;
	void __iomem *dirin;
	unsigned long sz;
457
	unsigned long flags = 0;
458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487
	int err;
	struct bgpio_chip *bgc;
	struct bgpio_pdata *pdata = dev_get_platdata(dev);

	r = platform_get_resource_byname(pdev, IORESOURCE_MEM, "dat");
	if (!r)
		return -EINVAL;

	sz = resource_size(r);

	dat = bgpio_map(pdev, "dat", sz, &err);
	if (!dat)
		return err ? err : -EINVAL;

	set = bgpio_map(pdev, "set", sz, &err);
	if (err)
		return err;

	clr = bgpio_map(pdev, "clr", sz, &err);
	if (err)
		return err;

	dirout = bgpio_map(pdev, "dirout", sz, &err);
	if (err)
		return err;

	dirin = bgpio_map(pdev, "dirin", sz, &err);
	if (err)
		return err;

488 489
	if (!strcmp(platform_get_device_id(pdev)->name, "basic-mmio-gpio-be"))
		flags |= BGPIOF_BIG_ENDIAN;
490 491 492 493 494

	bgc = devm_kzalloc(&pdev->dev, sizeof(*bgc), GFP_KERNEL);
	if (!bgc)
		return -ENOMEM;

495
	err = bgpio_init(bgc, dev, sz, dat, set, clr, dirout, dirin, flags);
496 497 498 499 500 501 502 503 504 505 506 507 508 509
	if (err)
		return err;

	if (pdata) {
		bgc->gc.base = pdata->base;
		if (pdata->ngpio > 0)
			bgc->gc.ngpio = pdata->ngpio;
	}

	platform_set_drvdata(pdev, bgc);

	return gpiochip_add(&bgc->gc);
}

B
Bill Pemberton 已提交
510
static int bgpio_pdev_remove(struct platform_device *pdev)
511
{
512
	struct bgpio_chip *bgc = platform_get_drvdata(pdev);
513

514
	return bgpio_remove(bgc);
515 516 517 518 519 520 521 522 523 524 525 526 527 528
}

static const struct platform_device_id bgpio_id_table[] = {
	{ "basic-mmio-gpio", },
	{ "basic-mmio-gpio-be", },
	{},
};
MODULE_DEVICE_TABLE(platform, bgpio_id_table);

static struct platform_driver bgpio_driver = {
	.driver = {
		.name = "basic-mmio-gpio",
	},
	.id_table = bgpio_id_table,
529
	.probe = bgpio_pdev_probe,
B
Bill Pemberton 已提交
530
	.remove = bgpio_pdev_remove,
531 532
};

533
module_platform_driver(bgpio_driver);
534

G
Grant Likely 已提交
535
#endif /* CONFIG_GPIO_GENERIC_PLATFORM */
536 537 538 539

MODULE_DESCRIPTION("Driver for basic memory-mapped GPIO controllers");
MODULE_AUTHOR("Anton Vorontsov <cbouatmailru@gmail.com>");
MODULE_LICENSE("GPL");