gpio-mmio.c 16.9 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
#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>
59
#include <linux/gpio/driver.h>
60
#include <linux/slab.h>
61
#include <linux/bitops.h>
62 63
#include <linux/platform_device.h>
#include <linux/mod_devicetable.h>
64 65
#include <linux/of.h>
#include <linux/of_device.h>
66

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

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

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

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

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

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

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

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

109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
static void bgpio_write16be(void __iomem *reg, unsigned long data)
{
	iowrite16be(data, reg);
}

static unsigned long bgpio_read16be(void __iomem *reg)
{
	return ioread16be(reg);
}

static void bgpio_write32be(void __iomem *reg, unsigned long data)
{
	iowrite32be(data, reg);
}

static unsigned long bgpio_read32be(void __iomem *reg)
{
	return ioread32be(reg);
}

129
static unsigned long bgpio_pin2mask(struct gpio_chip *gc, unsigned int pin)
130
{
131
	return BIT(pin);
132 133
}

134
static unsigned long bgpio_pin2mask_be(struct gpio_chip *gc,
135 136
				       unsigned int pin)
{
137
	return BIT(gc->bgpio_bits - 1 - pin);
138 139
}

140 141
static int bgpio_get_set(struct gpio_chip *gc, unsigned int gpio)
{
142
	unsigned long pinmask = gc->pin2mask(gc, gpio);
143

144 145
	if (gc->bgpio_dir & pinmask)
		return !!(gc->read_reg(gc->reg_set) & pinmask);
146
	else
147
		return !!(gc->read_reg(gc->reg_dat) & pinmask);
148 149
}

150 151
static int bgpio_get(struct gpio_chip *gc, unsigned int gpio)
{
152
	return !!(gc->read_reg(gc->reg_dat) & gc->pin2mask(gc, gpio));
153 154
}

155 156 157 158
static void bgpio_set_none(struct gpio_chip *gc, unsigned int gpio, int val)
{
}

159 160
static void bgpio_set(struct gpio_chip *gc, unsigned int gpio, int val)
{
161
	unsigned long mask = gc->pin2mask(gc, gpio);
162 163
	unsigned long flags;

164
	spin_lock_irqsave(&gc->bgpio_lock, flags);
165 166

	if (val)
167
		gc->bgpio_data |= mask;
168
	else
169
		gc->bgpio_data &= ~mask;
170

171
	gc->write_reg(gc->reg_dat, gc->bgpio_data);
172

173
	spin_unlock_irqrestore(&gc->bgpio_lock, flags);
174 175
}

176 177 178
static void bgpio_set_with_clear(struct gpio_chip *gc, unsigned int gpio,
				 int val)
{
179
	unsigned long mask = gc->pin2mask(gc, gpio);
180 181

	if (val)
182
		gc->write_reg(gc->reg_set, mask);
183
	else
184
		gc->write_reg(gc->reg_clr, mask);
185 186
}

187 188
static void bgpio_set_set(struct gpio_chip *gc, unsigned int gpio, int val)
{
189
	unsigned long mask = gc->pin2mask(gc, gpio);
190 191
	unsigned long flags;

192
	spin_lock_irqsave(&gc->bgpio_lock, flags);
193 194

	if (val)
195
		gc->bgpio_data |= mask;
196
	else
197
		gc->bgpio_data &= ~mask;
198

199
	gc->write_reg(gc->reg_set, gc->bgpio_data);
200

201
	spin_unlock_irqrestore(&gc->bgpio_lock, flags);
202 203
}

204
static void bgpio_multiple_get_masks(struct gpio_chip *gc,
205 206 207 208 209 210 211 212 213
				     unsigned long *mask, unsigned long *bits,
				     unsigned long *set_mask,
				     unsigned long *clear_mask)
{
	int i;

	*set_mask = 0;
	*clear_mask = 0;

214
	for (i = 0; i < gc->bgpio_bits; i++) {
215 216 217 218
		if (*mask == 0)
			break;
		if (__test_and_clear_bit(i, mask)) {
			if (test_bit(i, bits))
219
				*set_mask |= gc->pin2mask(gc, i);
220
			else
221
				*clear_mask |= gc->pin2mask(gc, i);
222 223 224 225
		}
	}
}

226
static void bgpio_set_multiple_single_reg(struct gpio_chip *gc,
227 228 229 230 231 232 233
					  unsigned long *mask,
					  unsigned long *bits,
					  void __iomem *reg)
{
	unsigned long flags;
	unsigned long set_mask, clear_mask;

234
	spin_lock_irqsave(&gc->bgpio_lock, flags);
235

236
	bgpio_multiple_get_masks(gc, mask, bits, &set_mask, &clear_mask);
237

238 239
	gc->bgpio_data |= set_mask;
	gc->bgpio_data &= ~clear_mask;
240

241
	gc->write_reg(reg, gc->bgpio_data);
242

243
	spin_unlock_irqrestore(&gc->bgpio_lock, flags);
244 245 246 247 248
}

static void bgpio_set_multiple(struct gpio_chip *gc, unsigned long *mask,
			       unsigned long *bits)
{
249
	bgpio_set_multiple_single_reg(gc, mask, bits, gc->reg_dat);
250 251 252 253 254
}

static void bgpio_set_multiple_set(struct gpio_chip *gc, unsigned long *mask,
				   unsigned long *bits)
{
255
	bgpio_set_multiple_single_reg(gc, mask, bits, gc->reg_set);
256 257 258 259 260 261 262 263
}

static void bgpio_set_multiple_with_clear(struct gpio_chip *gc,
					  unsigned long *mask,
					  unsigned long *bits)
{
	unsigned long set_mask, clear_mask;

264
	bgpio_multiple_get_masks(gc, mask, bits, &set_mask, &clear_mask);
265 266

	if (set_mask)
267
		gc->write_reg(gc->reg_set, set_mask);
268
	if (clear_mask)
269
		gc->write_reg(gc->reg_clr, clear_mask);
270 271
}

272 273 274 275 276
static int bgpio_simple_dir_in(struct gpio_chip *gc, unsigned int gpio)
{
	return 0;
}

277 278 279 280 281 282
static int bgpio_dir_out_err(struct gpio_chip *gc, unsigned int gpio,
				int val)
{
	return -EINVAL;
}

283 284 285 286 287 288 289 290
static int bgpio_simple_dir_out(struct gpio_chip *gc, unsigned int gpio,
				int val)
{
	gc->set(gc, gpio, val);

	return 0;
}

291 292
static int bgpio_dir_in(struct gpio_chip *gc, unsigned int gpio)
{
293 294
	unsigned long flags;

295
	spin_lock_irqsave(&gc->bgpio_lock, flags);
296

297 298
	gc->bgpio_dir &= ~gc->pin2mask(gc, gpio);
	gc->write_reg(gc->reg_dir, gc->bgpio_dir);
299

300
	spin_unlock_irqrestore(&gc->bgpio_lock, flags);
301

302 303 304
	return 0;
}

305 306
static int bgpio_get_dir(struct gpio_chip *gc, unsigned int gpio)
{
307 308
	/* Return 0 if output, 1 of input */
	return !(gc->read_reg(gc->reg_dir) & gc->pin2mask(gc, gpio));
309 310
}

311 312
static int bgpio_dir_out(struct gpio_chip *gc, unsigned int gpio, int val)
{
313 314 315 316
	unsigned long flags;

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

317
	spin_lock_irqsave(&gc->bgpio_lock, flags);
318

319 320
	gc->bgpio_dir |= gc->pin2mask(gc, gpio);
	gc->write_reg(gc->reg_dir, gc->bgpio_dir);
321

322
	spin_unlock_irqrestore(&gc->bgpio_lock, flags);
323 324 325 326 327 328 329 330

	return 0;
}

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

331
	spin_lock_irqsave(&gc->bgpio_lock, flags);
332

333 334
	gc->bgpio_dir |= gc->pin2mask(gc, gpio);
	gc->write_reg(gc->reg_dir, gc->bgpio_dir);
335

336
	spin_unlock_irqrestore(&gc->bgpio_lock, flags);
337 338 339 340 341 342 343 344

	return 0;
}

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

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

347
	spin_lock_irqsave(&gc->bgpio_lock, flags);
348

349 350
	gc->bgpio_dir &= ~gc->pin2mask(gc, gpio);
	gc->write_reg(gc->reg_dir, gc->bgpio_dir);
351

352
	spin_unlock_irqrestore(&gc->bgpio_lock, flags);
353

354 355 356
	return 0;
}

357 358
static int bgpio_get_dir_inv(struct gpio_chip *gc, unsigned int gpio)
{
359 360
	/* Return 0 if output, 1 if input */
	return !!(gc->read_reg(gc->reg_dir) & gc->pin2mask(gc, gpio));
361 362
}

363
static int bgpio_setup_accessors(struct device *dev,
364
				 struct gpio_chip *gc,
365 366
				 bool bit_be,
				 bool byte_be)
367
{
368

369
	switch (gc->bgpio_bits) {
370
	case 8:
371 372
		gc->read_reg	= bgpio_read8;
		gc->write_reg	= bgpio_write8;
373 374
		break;
	case 16:
375
		if (byte_be) {
376 377
			gc->read_reg	= bgpio_read16be;
			gc->write_reg	= bgpio_write16be;
378
		} else {
379 380
			gc->read_reg	= bgpio_read16;
			gc->write_reg	= bgpio_write16;
381
		}
382 383
		break;
	case 32:
384
		if (byte_be) {
385 386
			gc->read_reg	= bgpio_read32be;
			gc->write_reg	= bgpio_write32be;
387
		} else {
388 389
			gc->read_reg	= bgpio_read32;
			gc->write_reg	= bgpio_write32;
390
		}
391 392 393
		break;
#if BITS_PER_LONG >= 64
	case 64:
394 395 396 397 398
		if (byte_be) {
			dev_err(dev,
				"64 bit big endian byte order unsupported\n");
			return -EINVAL;
		} else {
399 400
			gc->read_reg	= bgpio_read64;
			gc->write_reg	= bgpio_write64;
401
		}
402 403 404
		break;
#endif /* BITS_PER_LONG >= 64 */
	default:
405
		dev_err(dev, "unsupported data width %u bits\n", gc->bgpio_bits);
406 407 408
		return -EINVAL;
	}

409
	gc->pin2mask = bit_be ? bgpio_pin2mask_be : bgpio_pin2mask;
410 411 412 413

	return 0;
}

414 415
/*
 * Create the device and allocate the resources.  For setting GPIO's there are
416
 * three supported configurations:
417
 *
418
 *	- single input/output register resource (named "dat").
419
 *	- set/clear pair (named "set" and "clr").
420 421
 *	- single output register resource and single input resource ("set" and
 *	dat").
422 423 424 425 426
 *
 * 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.
427 428 429 430 431 432 433 434
 *
 * 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.
435
 */
436
static int bgpio_setup_io(struct gpio_chip *gc,
437 438
			  void __iomem *dat,
			  void __iomem *set,
439 440
			  void __iomem *clr,
			  unsigned long flags)
441
{
442

443 444
	gc->reg_dat = dat;
	if (!gc->reg_dat)
445
		return -EINVAL;
446

447
	if (set && clr) {
448 449 450 451
		gc->reg_set = set;
		gc->reg_clr = clr;
		gc->set = bgpio_set_with_clear;
		gc->set_multiple = bgpio_set_multiple_with_clear;
452
	} else if (set && !clr) {
453 454 455
		gc->reg_set = set;
		gc->set = bgpio_set_set;
		gc->set_multiple = bgpio_set_multiple_set;
456
	} else if (flags & BGPIOF_NO_OUTPUT) {
457 458
		gc->set = bgpio_set_none;
		gc->set_multiple = NULL;
459
	} else {
460 461
		gc->set = bgpio_set;
		gc->set_multiple = bgpio_set_multiple;
462 463
	}

464 465
	if (!(flags & BGPIOF_UNREADABLE_REG_SET) &&
	    (flags & BGPIOF_READ_OUTPUT_REG_SET))
466
		gc->get = bgpio_get_set;
467
	else
468
		gc->get = bgpio_get;
469

470 471 472
	return 0;
}

473
static int bgpio_setup_direction(struct gpio_chip *gc,
474
				 void __iomem *dirout,
475 476
				 void __iomem *dirin,
				 unsigned long flags)
477
{
478
	if (dirout && dirin) {
479
		return -EINVAL;
480
	} else if (dirout) {
481 482 483 484
		gc->reg_dir = dirout;
		gc->direction_output = bgpio_dir_out;
		gc->direction_input = bgpio_dir_in;
		gc->get_direction = bgpio_get_dir;
485
	} else if (dirin) {
486 487 488 489
		gc->reg_dir = dirin;
		gc->direction_output = bgpio_dir_out_inv;
		gc->direction_input = bgpio_dir_in_inv;
		gc->get_direction = bgpio_get_dir_inv;
490
	} else {
491
		if (flags & BGPIOF_NO_OUTPUT)
492
			gc->direction_output = bgpio_dir_out_err;
493
		else
494 495
			gc->direction_output = bgpio_simple_dir_out;
		gc->direction_input = bgpio_simple_dir_in;
496 497 498 499 500
	}

	return 0;
}

501 502 503 504 505 506 507 508
static int bgpio_request(struct gpio_chip *chip, unsigned gpio_pin)
{
	if (gpio_pin < chip->ngpio)
		return 0;

	return -EINVAL;
}

509
int bgpio_init(struct gpio_chip *gc, struct device *dev,
510 511
	       unsigned long sz, void __iomem *dat, void __iomem *set,
	       void __iomem *clr, void __iomem *dirout, void __iomem *dirin,
512
	       unsigned long flags)
513 514 515
{
	int ret;

516 517
	if (!is_power_of_2(sz))
		return -EINVAL;
518

519 520
	gc->bgpio_bits = sz * 8;
	if (gc->bgpio_bits > BITS_PER_LONG)
521 522
		return -EINVAL;

523 524 525 526 527 528
	spin_lock_init(&gc->bgpio_lock);
	gc->parent = dev;
	gc->label = dev_name(dev);
	gc->base = -1;
	gc->ngpio = gc->bgpio_bits;
	gc->request = bgpio_request;
529

530
	ret = bgpio_setup_io(gc, dat, set, clr, flags);
531 532
	if (ret)
		return ret;
533

534
	ret = bgpio_setup_accessors(dev, gc, flags & BGPIOF_BIG_ENDIAN,
535
				    flags & BGPIOF_BIG_ENDIAN_BYTE_ORDER);
536 537
	if (ret)
		return ret;
538

539
	ret = bgpio_setup_direction(gc, dirout, dirin, flags);
540 541 542
	if (ret)
		return ret;

543 544
	gc->bgpio_data = gc->read_reg(gc->reg_dat);
	if (gc->set == bgpio_set_set &&
545
			!(flags & BGPIOF_UNREADABLE_REG_SET))
546 547 548
		gc->bgpio_data = gc->read_reg(gc->reg_set);
	if (gc->reg_dir && !(flags & BGPIOF_UNREADABLE_REG_DIR))
		gc->bgpio_dir = gc->read_reg(gc->reg_dir);
549

550 551 552
	return ret;
}
EXPORT_SYMBOL_GPL(bgpio_init);
553

554
#if IS_ENABLED(CONFIG_GPIO_GENERIC_PLATFORM)
555

556 557
static void __iomem *bgpio_map(struct platform_device *pdev,
			       const char *name,
558
			       resource_size_t sane_sz)
559 560 561 562 563
{
	struct resource *r;
	resource_size_t sz;

	r = platform_get_resource_byname(pdev, IORESOURCE_MEM, name);
564
	if (!r)
565
		return NULL;
566 567

	sz = resource_size(r);
568 569
	if (sz != sane_sz)
		return IOMEM_ERR_PTR(-EINVAL);
570

571
	return devm_ioremap_resource(&pdev->dev, r);
572 573
}

574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604
#ifdef CONFIG_OF
static const struct of_device_id bgpio_of_match[] = {
	{ }
};
MODULE_DEVICE_TABLE(of, bgpio_of_match);

static struct bgpio_pdata *bgpio_parse_dt(struct platform_device *pdev,
					  unsigned long *flags)
{
	struct bgpio_pdata *pdata;

	if (!of_match_device(bgpio_of_match, &pdev->dev))
		return NULL;

	pdata = devm_kzalloc(&pdev->dev, sizeof(struct bgpio_pdata),
			     GFP_KERNEL);
	if (!pdata)
		return ERR_PTR(-ENOMEM);

	pdata->base = -1;

	return pdata;
}
#else
static struct bgpio_pdata *bgpio_parse_dt(struct platform_device *pdev,
					  unsigned long *flags)
{
	return NULL;
}
#endif /* CONFIG_OF */

B
Bill Pemberton 已提交
605
static int bgpio_pdev_probe(struct platform_device *pdev)
606 607 608 609 610 611 612 613 614
{
	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;
615
	unsigned long flags = 0;
616
	int err;
617
	struct gpio_chip *gc;
618 619 620 621 622 623 624 625 626 627
	struct bgpio_pdata *pdata;

	pdata = bgpio_parse_dt(pdev, &flags);
	if (IS_ERR(pdata))
		return PTR_ERR(pdata);

	if (!pdata) {
		pdata = dev_get_platdata(dev);
		flags = pdev->id_entry->driver_data;
	}
628 629 630 631 632 633 634

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

	sz = resource_size(r);

635 636 637
	dat = bgpio_map(pdev, "dat", sz);
	if (IS_ERR(dat))
		return PTR_ERR(dat);
638

639 640 641
	set = bgpio_map(pdev, "set", sz);
	if (IS_ERR(set))
		return PTR_ERR(set);
642

643 644 645
	clr = bgpio_map(pdev, "clr", sz);
	if (IS_ERR(clr))
		return PTR_ERR(clr);
646

647 648 649
	dirout = bgpio_map(pdev, "dirout", sz);
	if (IS_ERR(dirout))
		return PTR_ERR(dirout);
650

651 652 653
	dirin = bgpio_map(pdev, "dirin", sz);
	if (IS_ERR(dirin))
		return PTR_ERR(dirin);
654

655 656
	gc = devm_kzalloc(&pdev->dev, sizeof(*gc), GFP_KERNEL);
	if (!gc)
657 658
		return -ENOMEM;

659
	err = bgpio_init(gc, dev, sz, dat, set, clr, dirout, dirin, flags);
660 661 662 663
	if (err)
		return err;

	if (pdata) {
664
		if (pdata->label)
665 666
			gc->label = pdata->label;
		gc->base = pdata->base;
667
		if (pdata->ngpio > 0)
668
			gc->ngpio = pdata->ngpio;
669 670
	}

671
	platform_set_drvdata(pdev, gc);
672

673
	return devm_gpiochip_add_data(&pdev->dev, gc, NULL);
674 675 676
}

static const struct platform_device_id bgpio_id_table[] = {
677 678 679 680 681 682 683 684
	{
		.name		= "basic-mmio-gpio",
		.driver_data	= 0,
	}, {
		.name		= "basic-mmio-gpio-be",
		.driver_data	= BGPIOF_BIG_ENDIAN,
	},
	{ }
685 686 687 688 689 690
};
MODULE_DEVICE_TABLE(platform, bgpio_id_table);

static struct platform_driver bgpio_driver = {
	.driver = {
		.name = "basic-mmio-gpio",
691
		.of_match_table = of_match_ptr(bgpio_of_match),
692 693
	},
	.id_table = bgpio_id_table,
694
	.probe = bgpio_pdev_probe,
695 696
};

697
module_platform_driver(bgpio_driver);
698

G
Grant Likely 已提交
699
#endif /* CONFIG_GPIO_GENERIC_PLATFORM */
700 701 702 703

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