Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
gpio-ucb1400.c
Go to the documentation of this file.
1 /*
2  * Philips UCB1400 GPIO driver
3  *
4  * Author: Marek Vasut <[email protected]>
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 
16 
17 static 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 
25 static 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 
34 static 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 
41 static 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 
48 static 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 
78 err:
79  return err;
80 
81 }
82 
83 static 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 
98 static 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 
107 {
108  ucbdata = data;
109 }
110 
111 module_platform_driver(ucb1400_gpio_driver);
112 
113 MODULE_DESCRIPTION("Philips UCB1400 GPIO driver");
114 MODULE_LICENSE("GPL");