linux/drivers/gpio/gpio-ucb1400.c
<<
>>
Prefs
   1/*
   2 * Philips UCB1400 GPIO driver
   3 *
   4 * Author: Marek Vasut <marek.vasut@gmail.com>
   5 *
   6 * This program is free software; you can redistribute it and/or modify
   7 * it under the terms of the GNU General Public License version 2 as
   8 * published by the Free Software Foundation.
   9 *
  10 */
  11
  12#include <linux/module.h>
  13#include <linux/ucb1400.h>
  14
  15struct ucb1400_gpio_data *ucbdata;
  16
  17static int ucb1400_gpio_dir_in(struct gpio_chip *gc, unsigned off)
  18{
  19        struct ucb1400_gpio *gpio;
  20        gpio = container_of(gc, struct ucb1400_gpio, gc);
  21        ucb1400_gpio_set_direction(gpio->ac97, off, 0);
  22        return 0;
  23}
  24
  25static int ucb1400_gpio_dir_out(struct gpio_chip *gc, unsigned off, int val)
  26{
  27        struct ucb1400_gpio *gpio;
  28        gpio = container_of(gc, struct ucb1400_gpio, gc);
  29        ucb1400_gpio_set_direction(gpio->ac97, off, 1);
  30        ucb1400_gpio_set_value(gpio->ac97, off, val);
  31        return 0;
  32}
  33
  34static int ucb1400_gpio_get(struct gpio_chip *gc, unsigned off)
  35{
  36        struct ucb1400_gpio *gpio;
  37        gpio = container_of(gc, struct ucb1400_gpio, gc);
  38        return ucb1400_gpio_get_value(gpio->ac97, off);
  39}
  40
  41static void ucb1400_gpio_set(struct gpio_chip *gc, unsigned off, int val)
  42{
  43        struct ucb1400_gpio *gpio;
  44        gpio = container_of(gc, struct ucb1400_gpio, gc);
  45        ucb1400_gpio_set_value(gpio->ac97, off, val);
  46}
  47
  48static int ucb1400_gpio_probe(struct platform_device *dev)
  49{
  50        struct ucb1400_gpio *ucb = dev->dev.platform_data;
  51        int err = 0;
  52
  53        if (!(ucbdata && ucbdata->gpio_offset)) {
  54                err = -EINVAL;
  55                goto err;
  56        }
  57
  58        platform_set_drvdata(dev, ucb);
  59
  60        ucb->gc.label = "ucb1400_gpio";
  61        ucb->gc.base = ucbdata->gpio_offset;
  62        ucb->gc.ngpio = 10;
  63        ucb->gc.owner = THIS_MODULE;
  64
  65        ucb->gc.direction_input = ucb1400_gpio_dir_in;
  66        ucb->gc.direction_output = ucb1400_gpio_dir_out;
  67        ucb->gc.get = ucb1400_gpio_get;
  68        ucb->gc.set = ucb1400_gpio_set;
  69        ucb->gc.can_sleep = 1;
  70
  71        err = gpiochip_add(&ucb->gc);
  72        if (err)
  73                goto err;
  74
  75        if (ucbdata && ucbdata->gpio_setup)
  76                err = ucbdata->gpio_setup(&dev->dev, ucb->gc.ngpio);
  77
  78err:
  79        return err;
  80
  81}
  82
  83static int ucb1400_gpio_remove(struct platform_device *dev)
  84{
  85        int err = 0;
  86        struct ucb1400_gpio *ucb = platform_get_drvdata(dev);
  87
  88        if (ucbdata && ucbdata->gpio_teardown) {
  89                err = ucbdata->gpio_teardown(&dev->dev, ucb->gc.ngpio);
  90                if (err)
  91                        return err;
  92        }
  93
  94        err = gpiochip_remove(&ucb->gc);
  95        return err;
  96}
  97
  98static struct platform_driver ucb1400_gpio_driver = {
  99        .probe  = ucb1400_gpio_probe,
 100        .remove = ucb1400_gpio_remove,
 101        .driver = {
 102                .name   = "ucb1400_gpio"
 103        },
 104};
 105
 106void __init ucb1400_gpio_set_data(struct ucb1400_gpio_data *data)
 107{
 108        ucbdata = data;
 109}
 110
 111module_platform_driver(ucb1400_gpio_driver);
 112
 113MODULE_DESCRIPTION("Philips UCB1400 GPIO driver");
 114MODULE_LICENSE("GPL");
 115