diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-07-22 14:50:57 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-07-22 14:50:57 -0700 | 
| commit | c7c8518498e82591d7784452f5674c3aeb4d079c (patch) | |
| tree | 790ff7e6b6741daf32ec686b9a302b957b07c0f4 /drivers/gpio/gpio-ucb1400.c | |
| parent | ece236ce2fad9c27a6fd2530f899289025194bce (diff) | |
| parent | 591567a5ea25852f20b7ef2953f6f72020121199 (diff) | |
| download | olio-linux-3.10-c7c8518498e82591d7784452f5674c3aeb4d079c.tar.xz olio-linux-3.10-c7c8518498e82591d7784452f5674c3aeb4d079c.zip  | |
Merge branch 'gpio/next' of git://git.secretlab.ca/git/linux-2.6
* 'gpio/next' of git://git.secretlab.ca/git/linux-2.6: (61 commits)
  gpio/mxc/mxs: fix build error introduced by the irq_gc_ack() renaming
  mcp23s08: add i2c support
  mcp23s08: isolate spi specific parts
  mcp23s08: get rid of setup/teardown callbacks
  gpio/tegra: dt: add binding for gpio polarity
  mcp23s08: remove unused work queue
  gpio/da9052: remove a redundant assignment for gpio->da9052
  gpio/mxc: add device tree probe support
  ARM: mxc: use ARCH_NR_GPIOS to define gpio number
  gpio/mxc: get rid of the uses of cpu_is_mx()
  gpio/mxc: add missing initialization of basic_mmio_gpio shadow variables
  gpio: Move mpc5200 gpio driver to drivers/gpio
  GPIO: DA9052 GPIO module v3
  gpio/tegra: Use engineering names in DT compatible property
  of/gpio: Add new method for getting gpios under different property names
  gpio/dt: Refine GPIO device tree binding
  gpio/ml-ioh: fix off-by-one for displaying variable i in dev_err
  gpio/pca953x: Deprecate meaningless device-tree bindings
  gpio/pca953x: Remove dynamic platform data pointer
  gpio/pca953x: Fix IRQ support.
  ...
Diffstat (limited to 'drivers/gpio/gpio-ucb1400.c')
| -rw-r--r-- | drivers/gpio/gpio-ucb1400.c | 125 | 
1 files changed, 125 insertions, 0 deletions
diff --git a/drivers/gpio/gpio-ucb1400.c b/drivers/gpio/gpio-ucb1400.c new file mode 100644 index 00000000000..50e6bd1392c --- /dev/null +++ b/drivers/gpio/gpio-ucb1400.c @@ -0,0 +1,125 @@ +/* + * Philips UCB1400 GPIO driver + * + * Author: Marek Vasut <marek.vasut@gmail.com> + * + * 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/module.h> +#include <linux/ucb1400.h> + +struct ucb1400_gpio_data *ucbdata; + +static int ucb1400_gpio_dir_in(struct gpio_chip *gc, unsigned off) +{ +	struct ucb1400_gpio *gpio; +	gpio = container_of(gc, struct ucb1400_gpio, gc); +	ucb1400_gpio_set_direction(gpio->ac97, off, 0); +	return 0; +} + +static int ucb1400_gpio_dir_out(struct gpio_chip *gc, unsigned off, int val) +{ +	struct ucb1400_gpio *gpio; +	gpio = container_of(gc, struct ucb1400_gpio, gc); +	ucb1400_gpio_set_direction(gpio->ac97, off, 1); +	ucb1400_gpio_set_value(gpio->ac97, off, val); +	return 0; +} + +static int ucb1400_gpio_get(struct gpio_chip *gc, unsigned off) +{ +	struct ucb1400_gpio *gpio; +	gpio = container_of(gc, struct ucb1400_gpio, gc); +	return ucb1400_gpio_get_value(gpio->ac97, off); +} + +static void ucb1400_gpio_set(struct gpio_chip *gc, unsigned off, int val) +{ +	struct ucb1400_gpio *gpio; +	gpio = container_of(gc, struct ucb1400_gpio, gc); +	ucb1400_gpio_set_value(gpio->ac97, off, val); +} + +static int ucb1400_gpio_probe(struct platform_device *dev) +{ +	struct ucb1400_gpio *ucb = dev->dev.platform_data; +	int err = 0; + +	if (!(ucbdata && ucbdata->gpio_offset)) { +		err = -EINVAL; +		goto err; +	} + +	platform_set_drvdata(dev, ucb); + +	ucb->gc.label = "ucb1400_gpio"; +	ucb->gc.base = ucbdata->gpio_offset; +	ucb->gc.ngpio = 10; +	ucb->gc.owner = THIS_MODULE; + +	ucb->gc.direction_input = ucb1400_gpio_dir_in; +	ucb->gc.direction_output = ucb1400_gpio_dir_out; +	ucb->gc.get = ucb1400_gpio_get; +	ucb->gc.set = ucb1400_gpio_set; +	ucb->gc.can_sleep = 1; + +	err = gpiochip_add(&ucb->gc); +	if (err) +		goto err; + +	if (ucbdata && ucbdata->gpio_setup) +		err = ucbdata->gpio_setup(&dev->dev, ucb->gc.ngpio); + +err: +	return err; + +} + +static int ucb1400_gpio_remove(struct platform_device *dev) +{ +	int err = 0; +	struct ucb1400_gpio *ucb = platform_get_drvdata(dev); + +	if (ucbdata && ucbdata->gpio_teardown) { +		err = ucbdata->gpio_teardown(&dev->dev, ucb->gc.ngpio); +		if (err) +			return err; +	} + +	err = gpiochip_remove(&ucb->gc); +	return err; +} + +static struct platform_driver ucb1400_gpio_driver = { +	.probe	= ucb1400_gpio_probe, +	.remove	= ucb1400_gpio_remove, +	.driver	= { +		.name	= "ucb1400_gpio" +	}, +}; + +static int __init ucb1400_gpio_init(void) +{ +	return platform_driver_register(&ucb1400_gpio_driver); +} + +static void __exit ucb1400_gpio_exit(void) +{ +	platform_driver_unregister(&ucb1400_gpio_driver); +} + +void __init ucb1400_gpio_set_data(struct ucb1400_gpio_data *data) +{ +	ucbdata = data; +} + +module_init(ucb1400_gpio_init); +module_exit(ucb1400_gpio_exit); + +MODULE_DESCRIPTION("Philips UCB1400 GPIO driver"); +MODULE_LICENSE("GPL");  |