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 
15 struct ucb1400_gpio_data *ucbdata;
16 
ucb1400_gpio_dir_in(struct gpio_chip * gc,unsigned off)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 
ucb1400_gpio_dir_out(struct gpio_chip * gc,unsigned off,int val)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 
ucb1400_gpio_get(struct gpio_chip * gc,unsigned off)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 
ucb1400_gpio_set(struct gpio_chip * gc,unsigned off,int val)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 
ucb1400_gpio_probe(struct platform_device * dev)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 
ucb1400_gpio_remove(struct platform_device * dev)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 
ucb1400_gpio_set_data(struct ucb1400_gpio_data * data)106 void __init ucb1400_gpio_set_data(struct ucb1400_gpio_data *data)
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");
115