diff options
author | Ingo Molnar <mingo@elte.hu> | 2008-08-11 05:19:20 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-08-11 05:19:20 -0400 |
commit | 8067794bec1cc5de1431102cf0a6a1c7ce75cd85 (patch) | |
tree | 2bfa0fba060d253bbd972282b29a3d60c3e7cb7f /drivers/gpio | |
parent | 7ab6af7ab69df8c9c5fbc380004fb81187742096 (diff) | |
parent | 796aadeb1b2db9b5d463946766c5bbfd7717158c (diff) |
Merge branch 'linus' into x86/x2apic
Conflicts:
arch/x86/kernel/genapic_64.c
Manual merge:
arch/x86/kernel/genx2apic_uv_x.c
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'drivers/gpio')
-rw-r--r-- | drivers/gpio/Kconfig | 85 | ||||
-rw-r--r-- | drivers/gpio/Makefile | 4 | ||||
-rw-r--r-- | drivers/gpio/bt8xxgpio.c | 348 | ||||
-rw-r--r-- | drivers/gpio/gpiolib.c | 536 | ||||
-rw-r--r-- | drivers/gpio/max732x.c | 385 | ||||
-rw-r--r-- | drivers/gpio/mcp23s08.c | 134 | ||||
-rw-r--r-- | drivers/gpio/pca953x.c | 1 | ||||
-rw-r--r-- | drivers/gpio/pcf857x.c | 1 |
8 files changed, 1445 insertions, 49 deletions
diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig index fced1909cbba..dbd42d6c93a7 100644 --- a/drivers/gpio/Kconfig +++ b/drivers/gpio/Kconfig | |||
@@ -2,15 +2,40 @@ | |||
2 | # GPIO infrastructure and expanders | 2 | # GPIO infrastructure and expanders |
3 | # | 3 | # |
4 | 4 | ||
5 | config HAVE_GPIO_LIB | 5 | config ARCH_WANT_OPTIONAL_GPIOLIB |
6 | bool | 6 | bool |
7 | help | 7 | help |
8 | Select this config option from the architecture Kconfig, if | ||
9 | it is possible to use gpiolib on the architecture, but let the | ||
10 | user decide whether to actually build it or not. | ||
11 | Select this instead of ARCH_REQUIRE_GPIOLIB, if your architecture does | ||
12 | not depend on GPIOs being available, but rather let the user | ||
13 | decide whether he needs it or not. | ||
14 | |||
15 | config ARCH_REQUIRE_GPIOLIB | ||
16 | bool | ||
17 | select GPIOLIB | ||
18 | help | ||
8 | Platforms select gpiolib if they use this infrastructure | 19 | Platforms select gpiolib if they use this infrastructure |
9 | for all their GPIOs, usually starting with ones integrated | 20 | for all their GPIOs, usually starting with ones integrated |
10 | into SOC processors. | 21 | into SOC processors. |
22 | Selecting this from the architecture code will cause the gpiolib | ||
23 | code to always get built in. | ||
24 | |||
25 | |||
26 | |||
27 | menuconfig GPIOLIB | ||
28 | bool "GPIO Support" | ||
29 | depends on ARCH_WANT_OPTIONAL_GPIOLIB || ARCH_REQUIRE_GPIOLIB | ||
30 | select GENERIC_GPIO | ||
31 | help | ||
32 | This enables GPIO support through the generic GPIO library. | ||
33 | You only need to enable this, if you also want to enable | ||
34 | one or more of the GPIO expansion card drivers below. | ||
11 | 35 | ||
12 | menu "GPIO Support" | 36 | If unsure, say N. |
13 | depends on HAVE_GPIO_LIB | 37 | |
38 | if GPIOLIB | ||
14 | 39 | ||
15 | config DEBUG_GPIO | 40 | config DEBUG_GPIO |
16 | bool "Debug GPIO calls" | 41 | bool "Debug GPIO calls" |
@@ -23,10 +48,44 @@ config DEBUG_GPIO | |||
23 | slower. The diagnostics help catch the type of setup errors | 48 | slower. The diagnostics help catch the type of setup errors |
24 | that are most common when setting up new platforms or boards. | 49 | that are most common when setting up new platforms or boards. |
25 | 50 | ||
51 | config GPIO_SYSFS | ||
52 | bool "/sys/class/gpio/... (sysfs interface)" | ||
53 | depends on SYSFS && EXPERIMENTAL | ||
54 | help | ||
55 | Say Y here to add a sysfs interface for GPIOs. | ||
56 | |||
57 | This is mostly useful to work around omissions in a system's | ||
58 | kernel support. Those are common in custom and semicustom | ||
59 | hardware assembled using standard kernels with a minimum of | ||
60 | custom patches. In those cases, userspace code may import | ||
61 | a given GPIO from the kernel, if no kernel driver requested it. | ||
62 | |||
63 | Kernel drivers may also request that a particular GPIO be | ||
64 | exported to userspace; this can be useful when debugging. | ||
65 | |||
26 | # put expanders in the right section, in alphabetical order | 66 | # put expanders in the right section, in alphabetical order |
27 | 67 | ||
28 | comment "I2C GPIO expanders:" | 68 | comment "I2C GPIO expanders:" |
29 | 69 | ||
70 | config GPIO_MAX732X | ||
71 | tristate "MAX7319, MAX7320-7327 I2C Port Expanders" | ||
72 | depends on I2C | ||
73 | help | ||
74 | Say yes here to support the MAX7319, MAX7320-7327 series of I2C | ||
75 | Port Expanders. Each IO port on these chips has a fixed role of | ||
76 | Input (designated by 'I'), Push-Pull Output ('O'), or Open-Drain | ||
77 | Input and Output (designed by 'P'). The combinations are listed | ||
78 | below: | ||
79 | |||
80 | 8 bits: max7319 (8I), max7320 (8O), max7321 (8P), | ||
81 | max7322 (4I4O), max7323 (4P4O) | ||
82 | |||
83 | 16 bits: max7324 (8I8O), max7325 (8P8O), | ||
84 | max7326 (4I12O), max7327 (4P12O) | ||
85 | |||
86 | Board setup code must specify the model to use, and the start | ||
87 | number for these GPIOs. | ||
88 | |||
30 | config GPIO_PCA953X | 89 | config GPIO_PCA953X |
31 | tristate "PCA953x, PCA955x, and MAX7310 I/O ports" | 90 | tristate "PCA953x, PCA955x, and MAX7310 I/O ports" |
32 | depends on I2C | 91 | depends on I2C |
@@ -68,6 +127,24 @@ config GPIO_PCF857X | |||
68 | This driver provides an in-kernel interface to those GPIOs using | 127 | This driver provides an in-kernel interface to those GPIOs using |
69 | platform-neutral GPIO calls. | 128 | platform-neutral GPIO calls. |
70 | 129 | ||
130 | comment "PCI GPIO expanders:" | ||
131 | |||
132 | config GPIO_BT8XX | ||
133 | tristate "BT8XX GPIO abuser" | ||
134 | depends on PCI && VIDEO_BT848=n | ||
135 | help | ||
136 | The BT8xx frame grabber chip has 24 GPIO pins than can be abused | ||
137 | as a cheap PCI GPIO card. | ||
138 | |||
139 | This chip can be found on Miro, Hauppauge and STB TV-cards. | ||
140 | |||
141 | The card needs to be physically altered for using it as a | ||
142 | GPIO card. For more information on how to build a GPIO card | ||
143 | from a BT8xx TV card, see the documentation file at | ||
144 | Documentation/bt8xxgpio.txt | ||
145 | |||
146 | If unsure, say N. | ||
147 | |||
71 | comment "SPI GPIO expanders:" | 148 | comment "SPI GPIO expanders:" |
72 | 149 | ||
73 | config GPIO_MAX7301 | 150 | config GPIO_MAX7301 |
@@ -83,4 +160,4 @@ config GPIO_MCP23S08 | |||
83 | SPI driver for Microchip MCP23S08 I/O expander. This provides | 160 | SPI driver for Microchip MCP23S08 I/O expander. This provides |
84 | a GPIO interface supporting inputs and outputs. | 161 | a GPIO interface supporting inputs and outputs. |
85 | 162 | ||
86 | endmenu | 163 | endif |
diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile index 16e796dc5410..01b4bbde1956 100644 --- a/drivers/gpio/Makefile +++ b/drivers/gpio/Makefile | |||
@@ -2,9 +2,11 @@ | |||
2 | 2 | ||
3 | ccflags-$(CONFIG_DEBUG_GPIO) += -DDEBUG | 3 | ccflags-$(CONFIG_DEBUG_GPIO) += -DDEBUG |
4 | 4 | ||
5 | obj-$(CONFIG_HAVE_GPIO_LIB) += gpiolib.o | 5 | obj-$(CONFIG_GPIOLIB) += gpiolib.o |
6 | 6 | ||
7 | obj-$(CONFIG_GPIO_MAX7301) += max7301.o | 7 | obj-$(CONFIG_GPIO_MAX7301) += max7301.o |
8 | obj-$(CONFIG_GPIO_MAX732X) += max732x.o | ||
8 | obj-$(CONFIG_GPIO_MCP23S08) += mcp23s08.o | 9 | obj-$(CONFIG_GPIO_MCP23S08) += mcp23s08.o |
9 | obj-$(CONFIG_GPIO_PCA953X) += pca953x.o | 10 | obj-$(CONFIG_GPIO_PCA953X) += pca953x.o |
10 | obj-$(CONFIG_GPIO_PCF857X) += pcf857x.o | 11 | obj-$(CONFIG_GPIO_PCF857X) += pcf857x.o |
12 | obj-$(CONFIG_GPIO_BT8XX) += bt8xxgpio.o | ||
diff --git a/drivers/gpio/bt8xxgpio.c b/drivers/gpio/bt8xxgpio.c new file mode 100644 index 000000000000..7a1168249dd5 --- /dev/null +++ b/drivers/gpio/bt8xxgpio.c | |||
@@ -0,0 +1,348 @@ | |||
1 | /* | ||
2 | |||
3 | bt8xx GPIO abuser | ||
4 | |||
5 | Copyright (C) 2008 Michael Buesch <mb@bu3sch.de> | ||
6 | |||
7 | Please do _only_ contact the people listed _above_ with issues related to this driver. | ||
8 | All the other people listed below are not related to this driver. Their names | ||
9 | are only here, because this driver is derived from the bt848 driver. | ||
10 | |||
11 | |||
12 | Derived from the bt848 driver: | ||
13 | |||
14 | Copyright (C) 1996,97,98 Ralph Metzler | ||
15 | & Marcus Metzler | ||
16 | (c) 1999-2002 Gerd Knorr | ||
17 | |||
18 | some v4l2 code lines are taken from Justin's bttv2 driver which is | ||
19 | (c) 2000 Justin Schoeman | ||
20 | |||
21 | V4L1 removal from: | ||
22 | (c) 2005-2006 Nickolay V. Shmyrev | ||
23 | |||
24 | Fixes to be fully V4L2 compliant by | ||
25 | (c) 2006 Mauro Carvalho Chehab | ||
26 | |||
27 | Cropping and overscan support | ||
28 | Copyright (C) 2005, 2006 Michael H. Schimek | ||
29 | Sponsored by OPQ Systems AB | ||
30 | |||
31 | This program is free software; you can redistribute it and/or modify | ||
32 | it under the terms of the GNU General Public License as published by | ||
33 | the Free Software Foundation; either version 2 of the License, or | ||
34 | (at your option) any later version. | ||
35 | |||
36 | This program is distributed in the hope that it will be useful, | ||
37 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
38 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
39 | GNU General Public License for more details. | ||
40 | |||
41 | You should have received a copy of the GNU General Public License | ||
42 | along with this program; if not, write to the Free Software | ||
43 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
44 | */ | ||
45 | |||
46 | #include <linux/module.h> | ||
47 | #include <linux/pci.h> | ||
48 | #include <linux/spinlock.h> | ||
49 | |||
50 | #include <asm/gpio.h> | ||
51 | |||
52 | /* Steal the hardware definitions from the bttv driver. */ | ||
53 | #include "../media/video/bt8xx/bt848.h" | ||
54 | |||
55 | |||
56 | #define BT8XXGPIO_NR_GPIOS 24 /* We have 24 GPIO pins */ | ||
57 | |||
58 | |||
59 | struct bt8xxgpio { | ||
60 | spinlock_t lock; | ||
61 | |||
62 | void __iomem *mmio; | ||
63 | struct pci_dev *pdev; | ||
64 | struct gpio_chip gpio; | ||
65 | |||
66 | #ifdef CONFIG_PM | ||
67 | u32 saved_outen; | ||
68 | u32 saved_data; | ||
69 | #endif | ||
70 | }; | ||
71 | |||
72 | #define bgwrite(dat, adr) writel((dat), bg->mmio+(adr)) | ||
73 | #define bgread(adr) readl(bg->mmio+(adr)) | ||
74 | |||
75 | |||
76 | static int modparam_gpiobase = -1/* dynamic */; | ||
77 | module_param_named(gpiobase, modparam_gpiobase, int, 0444); | ||
78 | MODULE_PARM_DESC(gpiobase, "The GPIO number base. -1 means dynamic, which is the default."); | ||
79 | |||
80 | |||
81 | static int bt8xxgpio_gpio_direction_input(struct gpio_chip *gpio, unsigned nr) | ||
82 | { | ||
83 | struct bt8xxgpio *bg = container_of(gpio, struct bt8xxgpio, gpio); | ||
84 | unsigned long flags; | ||
85 | u32 outen, data; | ||
86 | |||
87 | spin_lock_irqsave(&bg->lock, flags); | ||
88 | |||
89 | data = bgread(BT848_GPIO_DATA); | ||
90 | data &= ~(1 << nr); | ||
91 | bgwrite(data, BT848_GPIO_DATA); | ||
92 | |||
93 | outen = bgread(BT848_GPIO_OUT_EN); | ||
94 | outen &= ~(1 << nr); | ||
95 | bgwrite(outen, BT848_GPIO_OUT_EN); | ||
96 | |||
97 | spin_unlock_irqrestore(&bg->lock, flags); | ||
98 | |||
99 | return 0; | ||
100 | } | ||
101 | |||
102 | static int bt8xxgpio_gpio_get(struct gpio_chip *gpio, unsigned nr) | ||
103 | { | ||
104 | struct bt8xxgpio *bg = container_of(gpio, struct bt8xxgpio, gpio); | ||
105 | unsigned long flags; | ||
106 | u32 val; | ||
107 | |||
108 | spin_lock_irqsave(&bg->lock, flags); | ||
109 | val = bgread(BT848_GPIO_DATA); | ||
110 | spin_unlock_irqrestore(&bg->lock, flags); | ||
111 | |||
112 | return !!(val & (1 << nr)); | ||
113 | } | ||
114 | |||
115 | static int bt8xxgpio_gpio_direction_output(struct gpio_chip *gpio, | ||
116 | unsigned nr, int val) | ||
117 | { | ||
118 | struct bt8xxgpio *bg = container_of(gpio, struct bt8xxgpio, gpio); | ||
119 | unsigned long flags; | ||
120 | u32 outen, data; | ||
121 | |||
122 | spin_lock_irqsave(&bg->lock, flags); | ||
123 | |||
124 | outen = bgread(BT848_GPIO_OUT_EN); | ||
125 | outen |= (1 << nr); | ||
126 | bgwrite(outen, BT848_GPIO_OUT_EN); | ||
127 | |||
128 | data = bgread(BT848_GPIO_DATA); | ||
129 | if (val) | ||
130 | data |= (1 << nr); | ||
131 | else | ||
132 | data &= ~(1 << nr); | ||
133 | bgwrite(data, BT848_GPIO_DATA); | ||
134 | |||
135 | spin_unlock_irqrestore(&bg->lock, flags); | ||
136 | |||
137 | return 0; | ||
138 | } | ||
139 | |||
140 | static void bt8xxgpio_gpio_set(struct gpio_chip *gpio, | ||
141 | unsigned nr, int val) | ||
142 | { | ||
143 | struct bt8xxgpio *bg = container_of(gpio, struct bt8xxgpio, gpio); | ||
144 | unsigned long flags; | ||
145 | u32 data; | ||
146 | |||
147 | spin_lock_irqsave(&bg->lock, flags); | ||
148 | |||
149 | data = bgread(BT848_GPIO_DATA); | ||
150 | if (val) | ||
151 | data |= (1 << nr); | ||
152 | else | ||
153 | data &= ~(1 << nr); | ||
154 | bgwrite(data, BT848_GPIO_DATA); | ||
155 | |||
156 | spin_unlock_irqrestore(&bg->lock, flags); | ||
157 | } | ||
158 | |||
159 | static void bt8xxgpio_gpio_setup(struct bt8xxgpio *bg) | ||
160 | { | ||
161 | struct gpio_chip *c = &bg->gpio; | ||
162 | |||
163 | c->label = bg->pdev->dev.bus_id; | ||
164 | c->owner = THIS_MODULE; | ||
165 | c->direction_input = bt8xxgpio_gpio_direction_input; | ||
166 | c->get = bt8xxgpio_gpio_get; | ||
167 | c->direction_output = bt8xxgpio_gpio_direction_output; | ||
168 | c->set = bt8xxgpio_gpio_set; | ||
169 | c->dbg_show = NULL; | ||
170 | c->base = modparam_gpiobase; | ||
171 | c->ngpio = BT8XXGPIO_NR_GPIOS; | ||
172 | c->can_sleep = 0; | ||
173 | } | ||
174 | |||
175 | static int bt8xxgpio_probe(struct pci_dev *dev, | ||
176 | const struct pci_device_id *pci_id) | ||
177 | { | ||
178 | struct bt8xxgpio *bg; | ||
179 | int err; | ||
180 | |||
181 | bg = kzalloc(sizeof(*bg), GFP_KERNEL); | ||
182 | if (!bg) | ||
183 | return -ENOMEM; | ||
184 | |||
185 | bg->pdev = dev; | ||
186 | spin_lock_init(&bg->lock); | ||
187 | |||
188 | err = pci_enable_device(dev); | ||
189 | if (err) { | ||
190 | printk(KERN_ERR "bt8xxgpio: Can't enable device.\n"); | ||
191 | goto err_freebg; | ||
192 | } | ||
193 | if (!request_mem_region(pci_resource_start(dev, 0), | ||
194 | pci_resource_len(dev, 0), | ||
195 | "bt8xxgpio")) { | ||
196 | printk(KERN_WARNING "bt8xxgpio: Can't request iomem (0x%llx).\n", | ||
197 | (unsigned long long)pci_resource_start(dev, 0)); | ||
198 | err = -EBUSY; | ||
199 | goto err_disable; | ||
200 | } | ||
201 | pci_set_master(dev); | ||
202 | pci_set_drvdata(dev, bg); | ||
203 | |||
204 | bg->mmio = ioremap(pci_resource_start(dev, 0), 0x1000); | ||
205 | if (!bg->mmio) { | ||
206 | printk(KERN_ERR "bt8xxgpio: ioremap() failed\n"); | ||
207 | err = -EIO; | ||
208 | goto err_release_mem; | ||
209 | } | ||
210 | |||
211 | /* Disable interrupts */ | ||
212 | bgwrite(0, BT848_INT_MASK); | ||
213 | |||
214 | /* gpio init */ | ||
215 | bgwrite(0, BT848_GPIO_DMA_CTL); | ||
216 | bgwrite(0, BT848_GPIO_REG_INP); | ||
217 | bgwrite(0, BT848_GPIO_OUT_EN); | ||
218 | |||
219 | bt8xxgpio_gpio_setup(bg); | ||
220 | err = gpiochip_add(&bg->gpio); | ||
221 | if (err) { | ||
222 | printk(KERN_ERR "bt8xxgpio: Failed to register GPIOs\n"); | ||
223 | goto err_release_mem; | ||
224 | } | ||
225 | |||
226 | printk(KERN_INFO "bt8xxgpio: Abusing BT8xx card for GPIOs %d to %d\n", | ||
227 | bg->gpio.base, bg->gpio.base + BT8XXGPIO_NR_GPIOS - 1); | ||
228 | |||
229 | return 0; | ||
230 | |||
231 | err_release_mem: | ||
232 | release_mem_region(pci_resource_start(dev, 0), | ||
233 | pci_resource_len(dev, 0)); | ||
234 | pci_set_drvdata(dev, NULL); | ||
235 | err_disable: | ||
236 | pci_disable_device(dev); | ||
237 | err_freebg: | ||
238 | kfree(bg); | ||
239 | |||
240 | return err; | ||
241 | } | ||
242 | |||
243 | static void bt8xxgpio_remove(struct pci_dev *pdev) | ||
244 | { | ||
245 | struct bt8xxgpio *bg = pci_get_drvdata(pdev); | ||
246 | |||
247 | gpiochip_remove(&bg->gpio); | ||
248 | |||
249 | bgwrite(0, BT848_INT_MASK); | ||
250 | bgwrite(~0x0, BT848_INT_STAT); | ||
251 | bgwrite(0x0, BT848_GPIO_OUT_EN); | ||
252 | |||
253 | iounmap(bg->mmio); | ||
254 | release_mem_region(pci_resource_start(pdev, 0), | ||
255 | pci_resource_len(pdev, 0)); | ||
256 | pci_disable_device(pdev); | ||
257 | |||
258 | pci_set_drvdata(pdev, NULL); | ||
259 | kfree(bg); | ||
260 | } | ||
261 | |||
262 | #ifdef CONFIG_PM | ||
263 | static int bt8xxgpio_suspend(struct pci_dev *pdev, pm_message_t state) | ||
264 | { | ||
265 | struct bt8xxgpio *bg = pci_get_drvdata(pdev); | ||
266 | unsigned long flags; | ||
267 | |||
268 | spin_lock_irqsave(&bg->lock, flags); | ||
269 | |||
270 | bg->saved_outen = bgread(BT848_GPIO_OUT_EN); | ||
271 | bg->saved_data = bgread(BT848_GPIO_DATA); | ||
272 | |||
273 | bgwrite(0, BT848_INT_MASK); | ||
274 | bgwrite(~0x0, BT848_INT_STAT); | ||
275 | bgwrite(0x0, BT848_GPIO_OUT_EN); | ||
276 | |||
277 | spin_unlock_irqrestore(&bg->lock, flags); | ||
278 | |||
279 | pci_save_state(pdev); | ||
280 | pci_disable_device(pdev); | ||
281 | pci_set_power_state(pdev, pci_choose_state(pdev, state)); | ||
282 | |||
283 | return 0; | ||
284 | } | ||
285 | |||
286 | static int bt8xxgpio_resume(struct pci_dev *pdev) | ||
287 | { | ||
288 | struct bt8xxgpio *bg = pci_get_drvdata(pdev); | ||
289 | unsigned long flags; | ||
290 | int err; | ||
291 | |||
292 | pci_set_power_state(pdev, 0); | ||
293 | err = pci_enable_device(pdev); | ||
294 | if (err) | ||
295 | return err; | ||
296 | pci_restore_state(pdev); | ||
297 | |||
298 | spin_lock_irqsave(&bg->lock, flags); | ||
299 | |||
300 | bgwrite(0, BT848_INT_MASK); | ||
301 | bgwrite(0, BT848_GPIO_DMA_CTL); | ||
302 | bgwrite(0, BT848_GPIO_REG_INP); | ||
303 | bgwrite(bg->saved_outen, BT848_GPIO_OUT_EN); | ||
304 | bgwrite(bg->saved_data & bg->saved_outen, | ||
305 | BT848_GPIO_DATA); | ||
306 | |||
307 | spin_unlock_irqrestore(&bg->lock, flags); | ||
308 | |||
309 | return 0; | ||
310 | } | ||
311 | #else | ||
312 | #define bt8xxgpio_suspend NULL | ||
313 | #define bt8xxgpio_resume NULL | ||
314 | #endif /* CONFIG_PM */ | ||
315 | |||
316 | static struct pci_device_id bt8xxgpio_pci_tbl[] = { | ||
317 | { PCI_DEVICE(PCI_VENDOR_ID_BROOKTREE, PCI_DEVICE_ID_BT848) }, | ||
318 | { PCI_DEVICE(PCI_VENDOR_ID_BROOKTREE, PCI_DEVICE_ID_BT849) }, | ||
319 | { PCI_DEVICE(PCI_VENDOR_ID_BROOKTREE, PCI_DEVICE_ID_BT878) }, | ||
320 | { PCI_DEVICE(PCI_VENDOR_ID_BROOKTREE, PCI_DEVICE_ID_BT879) }, | ||
321 | { 0, }, | ||
322 | }; | ||
323 | MODULE_DEVICE_TABLE(pci, bt8xxgpio_pci_tbl); | ||
324 | |||
325 | static struct pci_driver bt8xxgpio_pci_driver = { | ||
326 | .name = "bt8xxgpio", | ||
327 | .id_table = bt8xxgpio_pci_tbl, | ||
328 | .probe = bt8xxgpio_probe, | ||
329 | .remove = bt8xxgpio_remove, | ||
330 | .suspend = bt8xxgpio_suspend, | ||
331 | .resume = bt8xxgpio_resume, | ||
332 | }; | ||
333 | |||
334 | static int bt8xxgpio_init(void) | ||
335 | { | ||
336 | return pci_register_driver(&bt8xxgpio_pci_driver); | ||
337 | } | ||
338 | module_init(bt8xxgpio_init) | ||
339 | |||
340 | static void bt8xxgpio_exit(void) | ||
341 | { | ||
342 | pci_unregister_driver(&bt8xxgpio_pci_driver); | ||
343 | } | ||
344 | module_exit(bt8xxgpio_exit) | ||
345 | |||
346 | MODULE_LICENSE("GPL"); | ||
347 | MODULE_AUTHOR("Michael Buesch"); | ||
348 | MODULE_DESCRIPTION("Abuse a BT8xx framegrabber card as generic GPIO card"); | ||
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index beaf6b3a37dc..8d2940517c99 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c | |||
@@ -2,8 +2,11 @@ | |||
2 | #include <linux/module.h> | 2 | #include <linux/module.h> |
3 | #include <linux/irq.h> | 3 | #include <linux/irq.h> |
4 | #include <linux/spinlock.h> | 4 | #include <linux/spinlock.h> |
5 | 5 | #include <linux/device.h> | |
6 | #include <asm/gpio.h> | 6 | #include <linux/err.h> |
7 | #include <linux/debugfs.h> | ||
8 | #include <linux/seq_file.h> | ||
9 | #include <linux/gpio.h> | ||
7 | 10 | ||
8 | 11 | ||
9 | /* Optional implementation infrastructure for GPIO interfaces. | 12 | /* Optional implementation infrastructure for GPIO interfaces. |
@@ -44,6 +47,8 @@ struct gpio_desc { | |||
44 | #define FLAG_REQUESTED 0 | 47 | #define FLAG_REQUESTED 0 |
45 | #define FLAG_IS_OUT 1 | 48 | #define FLAG_IS_OUT 1 |
46 | #define FLAG_RESERVED 2 | 49 | #define FLAG_RESERVED 2 |
50 | #define FLAG_EXPORT 3 /* protected by sysfs_lock */ | ||
51 | #define FLAG_SYSFS 4 /* exported via /sys/class/gpio/control */ | ||
47 | 52 | ||
48 | #ifdef CONFIG_DEBUG_FS | 53 | #ifdef CONFIG_DEBUG_FS |
49 | const char *label; | 54 | const char *label; |
@@ -151,6 +156,482 @@ err: | |||
151 | return ret; | 156 | return ret; |
152 | } | 157 | } |
153 | 158 | ||
159 | #ifdef CONFIG_GPIO_SYSFS | ||
160 | |||
161 | /* lock protects against unexport_gpio() being called while | ||
162 | * sysfs files are active. | ||
163 | */ | ||
164 | static DEFINE_MUTEX(sysfs_lock); | ||
165 | |||
166 | /* | ||
167 | * /sys/class/gpio/gpioN... only for GPIOs that are exported | ||
168 | * /direction | ||
169 | * * MAY BE OMITTED if kernel won't allow direction changes | ||
170 | * * is read/write as "in" or "out" | ||
171 | * * may also be written as "high" or "low", initializing | ||
172 | * output value as specified ("out" implies "low") | ||
173 | * /value | ||
174 | * * always readable, subject to hardware behavior | ||
175 | * * may be writable, as zero/nonzero | ||
176 | * | ||
177 | * REVISIT there will likely be an attribute for configuring async | ||
178 | * notifications, e.g. to specify polling interval or IRQ trigger type | ||
179 | * that would for example trigger a poll() on the "value". | ||
180 | */ | ||
181 | |||
182 | static ssize_t gpio_direction_show(struct device *dev, | ||
183 | struct device_attribute *attr, char *buf) | ||
184 | { | ||
185 | const struct gpio_desc *desc = dev_get_drvdata(dev); | ||
186 | ssize_t status; | ||
187 | |||
188 | mutex_lock(&sysfs_lock); | ||
189 | |||
190 | if (!test_bit(FLAG_EXPORT, &desc->flags)) | ||
191 | status = -EIO; | ||
192 | else | ||
193 | status = sprintf(buf, "%s\n", | ||
194 | test_bit(FLAG_IS_OUT, &desc->flags) | ||
195 | ? "out" : "in"); | ||
196 | |||
197 | mutex_unlock(&sysfs_lock); | ||
198 | return status; | ||
199 | } | ||
200 | |||
201 | static ssize_t gpio_direction_store(struct device *dev, | ||
202 | struct device_attribute *attr, const char *buf, size_t size) | ||
203 | { | ||
204 | const struct gpio_desc *desc = dev_get_drvdata(dev); | ||
205 | unsigned gpio = desc - gpio_desc; | ||
206 | ssize_t status; | ||
207 | |||
208 | mutex_lock(&sysfs_lock); | ||
209 | |||
210 | if (!test_bit(FLAG_EXPORT, &desc->flags)) | ||
211 | status = -EIO; | ||
212 | else if (sysfs_streq(buf, "high")) | ||
213 | status = gpio_direction_output(gpio, 1); | ||
214 | else if (sysfs_streq(buf, "out") || sysfs_streq(buf, "low")) | ||
215 | status = gpio_direction_output(gpio, 0); | ||
216 | else if (sysfs_streq(buf, "in")) | ||
217 | status = gpio_direction_input(gpio); | ||
218 | else | ||
219 | status = -EINVAL; | ||
220 | |||
221 | mutex_unlock(&sysfs_lock); | ||
222 | return status ? : size; | ||
223 | } | ||
224 | |||
225 | static const DEVICE_ATTR(direction, 0644, | ||
226 | gpio_direction_show, gpio_direction_store); | ||
227 | |||
228 | static ssize_t gpio_value_show(struct device *dev, | ||
229 | struct device_attribute *attr, char *buf) | ||
230 | { | ||
231 | const struct gpio_desc *desc = dev_get_drvdata(dev); | ||
232 | unsigned gpio = desc - gpio_desc; | ||
233 | ssize_t status; | ||
234 | |||
235 | mutex_lock(&sysfs_lock); | ||
236 | |||
237 | if (!test_bit(FLAG_EXPORT, &desc->flags)) | ||
238 | status = -EIO; | ||
239 | else | ||
240 | status = sprintf(buf, "%d\n", gpio_get_value_cansleep(gpio)); | ||
241 | |||
242 | mutex_unlock(&sysfs_lock); | ||
243 | return status; | ||
244 | } | ||
245 | |||
246 | static ssize_t gpio_value_store(struct device *dev, | ||
247 | struct device_attribute *attr, const char *buf, size_t size) | ||
248 | { | ||
249 | const struct gpio_desc *desc = dev_get_drvdata(dev); | ||
250 | unsigned gpio = desc - gpio_desc; | ||
251 | ssize_t status; | ||
252 | |||
253 | mutex_lock(&sysfs_lock); | ||
254 | |||
255 | if (!test_bit(FLAG_EXPORT, &desc->flags)) | ||
256 | status = -EIO; | ||
257 | else if (!test_bit(FLAG_IS_OUT, &desc->flags)) | ||
258 | status = -EPERM; | ||
259 | else { | ||
260 | long value; | ||
261 | |||
262 | status = strict_strtol(buf, 0, &value); | ||
263 | if (status == 0) { | ||
264 | gpio_set_value_cansleep(gpio, value != 0); | ||
265 | status = size; | ||
266 | } | ||
267 | } | ||
268 | |||
269 | mutex_unlock(&sysfs_lock); | ||
270 | return status; | ||
271 | } | ||
272 | |||
273 | static /*const*/ DEVICE_ATTR(value, 0644, | ||
274 | gpio_value_show, gpio_value_store); | ||
275 | |||
276 | static const struct attribute *gpio_attrs[] = { | ||
277 | &dev_attr_direction.attr, | ||
278 | &dev_attr_value.attr, | ||
279 | NULL, | ||
280 | }; | ||
281 | |||
282 | static const struct attribute_group gpio_attr_group = { | ||
283 | .attrs = (struct attribute **) gpio_attrs, | ||
284 | }; | ||
285 | |||
286 | /* | ||
287 | * /sys/class/gpio/gpiochipN/ | ||
288 | * /base ... matching gpio_chip.base (N) | ||
289 | * /label ... matching gpio_chip.label | ||
290 | * /ngpio ... matching gpio_chip.ngpio | ||
291 | */ | ||
292 | |||
293 | static ssize_t chip_base_show(struct device *dev, | ||
294 | struct device_attribute *attr, char *buf) | ||
295 | { | ||
296 | const struct gpio_chip *chip = dev_get_drvdata(dev); | ||
297 | |||
298 | return sprintf(buf, "%d\n", chip->base); | ||
299 | } | ||
300 | static DEVICE_ATTR(base, 0444, chip_base_show, NULL); | ||
301 | |||
302 | static ssize_t chip_label_show(struct device *dev, | ||
303 | struct device_attribute *attr, char *buf) | ||
304 | { | ||
305 | const struct gpio_chip *chip = dev_get_drvdata(dev); | ||
306 | |||
307 | return sprintf(buf, "%s\n", chip->label ? : ""); | ||
308 | } | ||
309 | static DEVICE_ATTR(label, 0444, chip_label_show, NULL); | ||
310 | |||
311 | static ssize_t chip_ngpio_show(struct device *dev, | ||
312 | struct device_attribute *attr, char *buf) | ||
313 | { | ||
314 | const struct gpio_chip *chip = dev_get_drvdata(dev); | ||
315 | |||
316 | return sprintf(buf, "%u\n", chip->ngpio); | ||
317 | } | ||
318 | static DEVICE_ATTR(ngpio, 0444, chip_ngpio_show, NULL); | ||
319 | |||
320 | static const struct attribute *gpiochip_attrs[] = { | ||
321 | &dev_attr_base.attr, | ||
322 | &dev_attr_label.attr, | ||
323 | &dev_attr_ngpio.attr, | ||
324 | NULL, | ||
325 | }; | ||
326 | |||
327 | static const struct attribute_group gpiochip_attr_group = { | ||
328 | .attrs = (struct attribute **) gpiochip_attrs, | ||
329 | }; | ||
330 | |||
331 | /* | ||
332 | * /sys/class/gpio/export ... write-only | ||
333 | * integer N ... number of GPIO to export (full access) | ||
334 | * /sys/class/gpio/unexport ... write-only | ||
335 | * integer N ... number of GPIO to unexport | ||
336 | */ | ||
337 | static ssize_t export_store(struct class *class, const char *buf, size_t len) | ||
338 | { | ||
339 | long gpio; | ||
340 | int status; | ||
341 | |||
342 | status = strict_strtol(buf, 0, &gpio); | ||
343 | if (status < 0) | ||
344 | goto done; | ||
345 | |||
346 | /* No extra locking here; FLAG_SYSFS just signifies that the | ||
347 | * request and export were done by on behalf of userspace, so | ||
348 | * they may be undone on its behalf too. | ||
349 | */ | ||
350 | |||
351 | status = gpio_request(gpio, "sysfs"); | ||
352 | if (status < 0) | ||
353 | goto done; | ||
354 | |||
355 | status = gpio_export(gpio, true); | ||
356 | if (status < 0) | ||
357 | gpio_free(gpio); | ||
358 | else | ||
359 | set_bit(FLAG_SYSFS, &gpio_desc[gpio].flags); | ||
360 | |||
361 | done: | ||
362 | if (status) | ||
363 | pr_debug("%s: status %d\n", __func__, status); | ||
364 | return status ? : len; | ||
365 | } | ||
366 | |||
367 | static ssize_t unexport_store(struct class *class, const char *buf, size_t len) | ||
368 | { | ||
369 | long gpio; | ||
370 | int status; | ||
371 | |||
372 | status = strict_strtol(buf, 0, &gpio); | ||
373 | if (status < 0) | ||
374 | goto done; | ||
375 | |||
376 | status = -EINVAL; | ||
377 | |||
378 | /* reject bogus commands (gpio_unexport ignores them) */ | ||
379 | if (!gpio_is_valid(gpio)) | ||
380 | goto done; | ||
381 | |||
382 | /* No extra locking here; FLAG_SYSFS just signifies that the | ||
383 | * request and export were done by on behalf of userspace, so | ||
384 | * they may be undone on its behalf too. | ||
385 | */ | ||
386 | if (test_and_clear_bit(FLAG_SYSFS, &gpio_desc[gpio].flags)) { | ||
387 | status = 0; | ||
388 | gpio_free(gpio); | ||
389 | } | ||
390 | done: | ||
391 | if (status) | ||
392 | pr_debug("%s: status %d\n", __func__, status); | ||
393 | return status ? : len; | ||
394 | } | ||
395 | |||
396 | static struct class_attribute gpio_class_attrs[] = { | ||
397 | __ATTR(export, 0200, NULL, export_store), | ||
398 | __ATTR(unexport, 0200, NULL, unexport_store), | ||
399 | __ATTR_NULL, | ||
400 | }; | ||
401 | |||
402 | static struct class gpio_class = { | ||
403 | .name = "gpio", | ||
404 | .owner = THIS_MODULE, | ||
405 | |||
406 | .class_attrs = gpio_class_attrs, | ||
407 | }; | ||
408 | |||
409 | |||
410 | /** | ||
411 | * gpio_export - export a GPIO through sysfs | ||
412 | * @gpio: gpio to make available, already requested | ||
413 | * @direction_may_change: true if userspace may change gpio direction | ||
414 | * Context: arch_initcall or later | ||
415 | * | ||
416 | * When drivers want to make a GPIO accessible to userspace after they | ||
417 | * have requested it -- perhaps while debugging, or as part of their | ||
418 | * public interface -- they may use this routine. If the GPIO can | ||
419 | * change direction (some can't) and the caller allows it, userspace | ||
420 | * will see "direction" sysfs attribute which may be used to change | ||
421 | * the gpio's direction. A "value" attribute will always be provided. | ||
422 | * | ||
423 | * Returns zero on success, else an error. | ||
424 | */ | ||
425 | int gpio_export(unsigned gpio, bool direction_may_change) | ||
426 | { | ||
427 | unsigned long flags; | ||
428 | struct gpio_desc *desc; | ||
429 | int status = -EINVAL; | ||
430 | |||
431 | /* can't export until sysfs is available ... */ | ||
432 | if (!gpio_class.p) { | ||
433 | pr_debug("%s: called too early!\n", __func__); | ||
434 | return -ENOENT; | ||
435 | } | ||
436 | |||
437 | if (!gpio_is_valid(gpio)) | ||
438 | goto done; | ||
439 | |||
440 | mutex_lock(&sysfs_lock); | ||
441 | |||
442 | spin_lock_irqsave(&gpio_lock, flags); | ||
443 | desc = &gpio_desc[gpio]; | ||
444 | if (test_bit(FLAG_REQUESTED, &desc->flags) | ||
445 | && !test_bit(FLAG_EXPORT, &desc->flags)) { | ||
446 | status = 0; | ||
447 | if (!desc->chip->direction_input | ||
448 | || !desc->chip->direction_output) | ||
449 | direction_may_change = false; | ||
450 | } | ||
451 | spin_unlock_irqrestore(&gpio_lock, flags); | ||
452 | |||
453 | if (status == 0) { | ||
454 | struct device *dev; | ||
455 | |||
456 | dev = device_create(&gpio_class, desc->chip->dev, MKDEV(0, 0), | ||
457 | desc, "gpio%d", gpio); | ||
458 | if (dev) { | ||
459 | if (direction_may_change) | ||
460 | status = sysfs_create_group(&dev->kobj, | ||
461 | &gpio_attr_group); | ||
462 | else | ||
463 | status = device_create_file(dev, | ||
464 | &dev_attr_value); | ||
465 | if (status != 0) | ||
466 | device_unregister(dev); | ||
467 | } else | ||
468 | status = -ENODEV; | ||
469 | if (status == 0) | ||
470 | set_bit(FLAG_EXPORT, &desc->flags); | ||
471 | } | ||
472 | |||
473 | mutex_unlock(&sysfs_lock); | ||
474 | |||
475 | done: | ||
476 | if (status) | ||
477 | pr_debug("%s: gpio%d status %d\n", __func__, gpio, status); | ||
478 | |||
479 | return status; | ||
480 | } | ||
481 | EXPORT_SYMBOL_GPL(gpio_export); | ||
482 | |||
483 | static int match_export(struct device *dev, void *data) | ||
484 | { | ||
485 | return dev_get_drvdata(dev) == data; | ||
486 | } | ||
487 | |||
488 | /** | ||
489 | * gpio_unexport - reverse effect of gpio_export() | ||
490 | * @gpio: gpio to make unavailable | ||
491 | * | ||
492 | * This is implicit on gpio_free(). | ||
493 | */ | ||
494 | void gpio_unexport(unsigned gpio) | ||
495 | { | ||
496 | struct gpio_desc *desc; | ||
497 | int status = -EINVAL; | ||
498 | |||
499 | if (!gpio_is_valid(gpio)) | ||
500 | goto done; | ||
501 | |||
502 | mutex_lock(&sysfs_lock); | ||
503 | |||
504 | desc = &gpio_desc[gpio]; | ||
505 | if (test_bit(FLAG_EXPORT, &desc->flags)) { | ||
506 | struct device *dev = NULL; | ||
507 | |||
508 | dev = class_find_device(&gpio_class, NULL, desc, match_export); | ||
509 | if (dev) { | ||
510 | clear_bit(FLAG_EXPORT, &desc->flags); | ||
511 | put_device(dev); | ||
512 | device_unregister(dev); | ||
513 | status = 0; | ||
514 | } else | ||
515 | status = -ENODEV; | ||
516 | } | ||
517 | |||
518 | mutex_unlock(&sysfs_lock); | ||
519 | done: | ||
520 | if (status) | ||
521 | pr_debug("%s: gpio%d status %d\n", __func__, gpio, status); | ||
522 | } | ||
523 | EXPORT_SYMBOL_GPL(gpio_unexport); | ||
524 | |||
525 | static int gpiochip_export(struct gpio_chip *chip) | ||
526 | { | ||
527 | int status; | ||
528 | struct device *dev; | ||
529 | |||
530 | /* Many systems register gpio chips for SOC support very early, | ||
531 | * before driver model support is available. In those cases we | ||
532 | * export this later, in gpiolib_sysfs_init() ... here we just | ||
533 | * verify that _some_ field of gpio_class got initialized. | ||
534 | */ | ||
535 | if (!gpio_class.p) | ||
536 | return 0; | ||
537 | |||
538 | /* use chip->base for the ID; it's already known to be unique */ | ||
539 | mutex_lock(&sysfs_lock); | ||
540 | dev = device_create(&gpio_class, chip->dev, MKDEV(0, 0), chip, | ||
541 | "gpiochip%d", chip->base); | ||
542 | if (dev) { | ||
543 | status = sysfs_create_group(&dev->kobj, | ||
544 | &gpiochip_attr_group); | ||
545 | } else | ||
546 | status = -ENODEV; | ||
547 | chip->exported = (status == 0); | ||
548 | mutex_unlock(&sysfs_lock); | ||
549 | |||
550 | if (status) { | ||
551 | unsigned long flags; | ||
552 | unsigned gpio; | ||
553 | |||
554 | spin_lock_irqsave(&gpio_lock, flags); | ||
555 | gpio = chip->base; | ||
556 | while (gpio_desc[gpio].chip == chip) | ||
557 | gpio_desc[gpio++].chip = NULL; | ||
558 | spin_unlock_irqrestore(&gpio_lock, flags); | ||
559 | |||
560 | pr_debug("%s: chip %s status %d\n", __func__, | ||
561 | chip->label, status); | ||
562 | } | ||
563 | |||
564 | return status; | ||
565 | } | ||
566 | |||
567 | static void gpiochip_unexport(struct gpio_chip *chip) | ||
568 | { | ||
569 | int status; | ||
570 | struct device *dev; | ||
571 | |||
572 | mutex_lock(&sysfs_lock); | ||
573 | dev = class_find_device(&gpio_class, NULL, chip, match_export); | ||
574 | if (dev) { | ||
575 | put_device(dev); | ||
576 | device_unregister(dev); | ||
577 | chip->exported = 0; | ||
578 | status = 0; | ||
579 | } else | ||
580 | status = -ENODEV; | ||
581 | mutex_unlock(&sysfs_lock); | ||
582 | |||
583 | if (status) | ||
584 | pr_debug("%s: chip %s status %d\n", __func__, | ||
585 | chip->label, status); | ||
586 | } | ||
587 | |||
588 | static int __init gpiolib_sysfs_init(void) | ||
589 | { | ||
590 | int status; | ||
591 | unsigned long flags; | ||
592 | unsigned gpio; | ||
593 | |||
594 | status = class_register(&gpio_class); | ||
595 | if (status < 0) | ||
596 | return status; | ||
597 | |||
598 | /* Scan and register the gpio_chips which registered very | ||
599 | * early (e.g. before the class_register above was called). | ||
600 | * | ||
601 | * We run before arch_initcall() so chip->dev nodes can have | ||
602 | * registered, and so arch_initcall() can always gpio_export(). | ||
603 | */ | ||
604 | spin_lock_irqsave(&gpio_lock, flags); | ||
605 | for (gpio = 0; gpio < ARCH_NR_GPIOS; gpio++) { | ||
606 | struct gpio_chip *chip; | ||
607 | |||
608 | chip = gpio_desc[gpio].chip; | ||
609 | if (!chip || chip->exported) | ||
610 | continue; | ||
611 | |||
612 | spin_unlock_irqrestore(&gpio_lock, flags); | ||
613 | status = gpiochip_export(chip); | ||
614 | spin_lock_irqsave(&gpio_lock, flags); | ||
615 | } | ||
616 | spin_unlock_irqrestore(&gpio_lock, flags); | ||
617 | |||
618 | |||
619 | return status; | ||
620 | } | ||
621 | postcore_initcall(gpiolib_sysfs_init); | ||
622 | |||
623 | #else | ||
624 | static inline int gpiochip_export(struct gpio_chip *chip) | ||
625 | { | ||
626 | return 0; | ||
627 | } | ||
628 | |||
629 | static inline void gpiochip_unexport(struct gpio_chip *chip) | ||
630 | { | ||
631 | } | ||
632 | |||
633 | #endif /* CONFIG_GPIO_SYSFS */ | ||
634 | |||
154 | /** | 635 | /** |
155 | * gpiochip_add() - register a gpio_chip | 636 | * gpiochip_add() - register a gpio_chip |
156 | * @chip: the chip to register, with chip->base initialized | 637 | * @chip: the chip to register, with chip->base initialized |
@@ -160,6 +641,11 @@ err: | |||
160 | * because the chip->base is invalid or already associated with a | 641 | * because the chip->base is invalid or already associated with a |
161 | * different chip. Otherwise it returns zero as a success code. | 642 | * different chip. Otherwise it returns zero as a success code. |
162 | * | 643 | * |
644 | * When gpiochip_add() is called very early during boot, so that GPIOs | ||
645 | * can be freely used, the chip->dev device must be registered before | ||
646 | * the gpio framework's arch_initcall(). Otherwise sysfs initialization | ||
647 | * for GPIOs will fail rudely. | ||
648 | * | ||
163 | * If chip->base is negative, this requests dynamic assignment of | 649 | * If chip->base is negative, this requests dynamic assignment of |
164 | * a range of valid GPIOs. | 650 | * a range of valid GPIOs. |
165 | */ | 651 | */ |
@@ -182,7 +668,7 @@ int gpiochip_add(struct gpio_chip *chip) | |||
182 | base = gpiochip_find_base(chip->ngpio); | 668 | base = gpiochip_find_base(chip->ngpio); |
183 | if (base < 0) { | 669 | if (base < 0) { |
184 | status = base; | 670 | status = base; |
185 | goto fail_unlock; | 671 | goto unlock; |
186 | } | 672 | } |
187 | chip->base = base; | 673 | chip->base = base; |
188 | } | 674 | } |
@@ -197,12 +683,23 @@ int gpiochip_add(struct gpio_chip *chip) | |||
197 | if (status == 0) { | 683 | if (status == 0) { |
198 | for (id = base; id < base + chip->ngpio; id++) { | 684 | for (id = base; id < base + chip->ngpio; id++) { |
199 | gpio_desc[id].chip = chip; | 685 | gpio_desc[id].chip = chip; |
200 | gpio_desc[id].flags = 0; | 686 | |
687 | /* REVISIT: most hardware initializes GPIOs as | ||
688 | * inputs (often with pullups enabled) so power | ||
689 | * usage is minimized. Linux code should set the | ||
690 | * gpio direction first thing; but until it does, | ||
691 | * we may expose the wrong direction in sysfs. | ||
692 | */ | ||
693 | gpio_desc[id].flags = !chip->direction_input | ||
694 | ? (1 << FLAG_IS_OUT) | ||
695 | : 0; | ||
201 | } | 696 | } |
202 | } | 697 | } |
203 | 698 | ||
204 | fail_unlock: | 699 | unlock: |
205 | spin_unlock_irqrestore(&gpio_lock, flags); | 700 | spin_unlock_irqrestore(&gpio_lock, flags); |
701 | if (status == 0) | ||
702 | status = gpiochip_export(chip); | ||
206 | fail: | 703 | fail: |
207 | /* failures here can mean systems won't boot... */ | 704 | /* failures here can mean systems won't boot... */ |
208 | if (status) | 705 | if (status) |
@@ -239,6 +736,10 @@ int gpiochip_remove(struct gpio_chip *chip) | |||
239 | } | 736 | } |
240 | 737 | ||
241 | spin_unlock_irqrestore(&gpio_lock, flags); | 738 | spin_unlock_irqrestore(&gpio_lock, flags); |
739 | |||
740 | if (status == 0) | ||
741 | gpiochip_unexport(chip); | ||
742 | |||
242 | return status; | 743 | return status; |
243 | } | 744 | } |
244 | EXPORT_SYMBOL_GPL(gpiochip_remove); | 745 | EXPORT_SYMBOL_GPL(gpiochip_remove); |
@@ -296,6 +797,8 @@ void gpio_free(unsigned gpio) | |||
296 | return; | 797 | return; |
297 | } | 798 | } |
298 | 799 | ||
800 | gpio_unexport(gpio); | ||
801 | |||
299 | spin_lock_irqsave(&gpio_lock, flags); | 802 | spin_lock_irqsave(&gpio_lock, flags); |
300 | 803 | ||
301 | desc = &gpio_desc[gpio]; | 804 | desc = &gpio_desc[gpio]; |
@@ -534,10 +1037,6 @@ EXPORT_SYMBOL_GPL(gpio_set_value_cansleep); | |||
534 | 1037 | ||
535 | #ifdef CONFIG_DEBUG_FS | 1038 | #ifdef CONFIG_DEBUG_FS |
536 | 1039 | ||
537 | #include <linux/debugfs.h> | ||
538 | #include <linux/seq_file.h> | ||
539 | |||
540 | |||
541 | static void gpiolib_dbg_show(struct seq_file *s, struct gpio_chip *chip) | 1040 | static void gpiolib_dbg_show(struct seq_file *s, struct gpio_chip *chip) |
542 | { | 1041 | { |
543 | unsigned i; | 1042 | unsigned i; |
@@ -614,17 +1113,28 @@ static int gpiolib_show(struct seq_file *s, void *unused) | |||
614 | /* REVISIT this isn't locked against gpio_chip removal ... */ | 1113 | /* REVISIT this isn't locked against gpio_chip removal ... */ |
615 | 1114 | ||
616 | for (gpio = 0; gpio_is_valid(gpio); gpio++) { | 1115 | for (gpio = 0; gpio_is_valid(gpio); gpio++) { |
1116 | struct device *dev; | ||
1117 | |||
617 | if (chip == gpio_desc[gpio].chip) | 1118 | if (chip == gpio_desc[gpio].chip) |
618 | continue; | 1119 | continue; |
619 | chip = gpio_desc[gpio].chip; | 1120 | chip = gpio_desc[gpio].chip; |
620 | if (!chip) | 1121 | if (!chip) |
621 | continue; | 1122 | continue; |
622 | 1123 | ||
623 | seq_printf(s, "%sGPIOs %d-%d, %s%s:\n", | 1124 | seq_printf(s, "%sGPIOs %d-%d", |
624 | started ? "\n" : "", | 1125 | started ? "\n" : "", |
625 | chip->base, chip->base + chip->ngpio - 1, | 1126 | chip->base, chip->base + chip->ngpio - 1); |
626 | chip->label ? : "generic", | 1127 | dev = chip->dev; |
627 | chip->can_sleep ? ", can sleep" : ""); | 1128 | if (dev) |
1129 | seq_printf(s, ", %s/%s", | ||
1130 | dev->bus ? dev->bus->name : "no-bus", | ||
1131 | dev->bus_id); | ||
1132 | if (chip->label) | ||
1133 | seq_printf(s, ", %s", chip->label); | ||
1134 | if (chip->can_sleep) | ||
1135 | seq_printf(s, ", can sleep"); | ||
1136 | seq_printf(s, ":\n"); | ||
1137 | |||
628 | started = 1; | 1138 | started = 1; |
629 | if (chip->dbg_show) | 1139 | if (chip->dbg_show) |
630 | chip->dbg_show(s, chip); | 1140 | chip->dbg_show(s, chip); |
diff --git a/drivers/gpio/max732x.c b/drivers/gpio/max732x.c new file mode 100644 index 000000000000..b51c8135ca28 --- /dev/null +++ b/drivers/gpio/max732x.c | |||
@@ -0,0 +1,385 @@ | |||
1 | /* | ||
2 | * max732x.c - I2C Port Expander with 8/16 I/O | ||
3 | * | ||
4 | * Copyright (C) 2007 Marvell International Ltd. | ||
5 | * Copyright (C) 2008 Jack Ren <jack.ren@marvell.com> | ||
6 | * Copyright (C) 2008 Eric Miao <eric.miao@marvell.com> | ||
7 | * | ||
8 | * Derived from drivers/gpio/pca953x.c | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License as published by | ||
12 | * the Free Software Foundation; version 2 of the License. | ||
13 | */ | ||
14 | |||
15 | #include <linux/module.h> | ||
16 | #include <linux/init.h> | ||
17 | #include <linux/slab.h> | ||
18 | #include <linux/string.h> | ||
19 | #include <linux/gpio.h> | ||
20 | |||
21 | #include <linux/i2c.h> | ||
22 | #include <linux/i2c/max732x.h> | ||
23 | |||
24 | |||
25 | /* | ||
26 | * Each port of MAX732x (including MAX7319) falls into one of the | ||
27 | * following three types: | ||
28 | * | ||
29 | * - Push Pull Output | ||
30 | * - Input | ||
31 | * - Open Drain I/O | ||
32 | * | ||
33 | * designated by 'O', 'I' and 'P' individually according to MAXIM's | ||
34 | * datasheets. | ||
35 | * | ||
36 | * There are two groups of I/O ports, each group usually includes | ||
37 | * up to 8 I/O ports, and is accessed by a specific I2C address: | ||
38 | * | ||
39 | * - Group A : by I2C address 0b'110xxxx | ||
40 | * - Group B : by I2C address 0b'101xxxx | ||
41 | * | ||
42 | * where 'xxxx' is decided by the connections of pin AD2/AD0. The | ||
43 | * address used also affects the initial state of output signals. | ||
44 | * | ||
45 | * Within each group of ports, there are five known combinations of | ||
46 | * I/O ports: 4I4O, 4P4O, 8I, 8P, 8O, see the definitions below for | ||
47 | * the detailed organization of these ports. | ||
48 | * | ||
49 | * GPIO numbers start from 'gpio_base + 0' to 'gpio_base + 8/16', | ||
50 | * and GPIOs from GROUP_A are numbered before those from GROUP_B | ||
51 | * (if there are two groups). | ||
52 | * | ||
53 | * NOTE: MAX7328/MAX7329 are drop-in replacements for PCF8574/a, so | ||
54 | * they are not supported by this driver. | ||
55 | */ | ||
56 | |||
57 | #define PORT_NONE 0x0 /* '/' No Port */ | ||
58 | #define PORT_OUTPUT 0x1 /* 'O' Push-Pull, Output Only */ | ||
59 | #define PORT_INPUT 0x2 /* 'I' Input Only */ | ||
60 | #define PORT_OPENDRAIN 0x3 /* 'P' Open-Drain, I/O */ | ||
61 | |||
62 | #define IO_4I4O 0x5AA5 /* O7 O6 I5 I4 I3 I2 O1 O0 */ | ||
63 | #define IO_4P4O 0x5FF5 /* O7 O6 P5 P4 P3 P2 O1 O0 */ | ||
64 | #define IO_8I 0xAAAA /* I7 I6 I5 I4 I3 I2 I1 I0 */ | ||
65 | #define IO_8P 0xFFFF /* P7 P6 P5 P4 P3 P2 P1 P0 */ | ||
66 | #define IO_8O 0x5555 /* O7 O6 O5 O4 O3 O2 O1 O0 */ | ||
67 | |||
68 | #define GROUP_A(x) ((x) & 0xffff) /* I2C Addr: 0b'110xxxx */ | ||
69 | #define GROUP_B(x) ((x) << 16) /* I2C Addr: 0b'101xxxx */ | ||
70 | |||
71 | static const struct i2c_device_id max732x_id[] = { | ||
72 | { "max7319", GROUP_A(IO_8I) }, | ||
73 | { "max7320", GROUP_B(IO_8O) }, | ||
74 | { "max7321", GROUP_A(IO_8P) }, | ||
75 | { "max7322", GROUP_A(IO_4I4O) }, | ||
76 | { "max7323", GROUP_A(IO_4P4O) }, | ||
77 | { "max7324", GROUP_A(IO_8I) | GROUP_B(IO_8O) }, | ||
78 | { "max7325", GROUP_A(IO_8P) | GROUP_B(IO_8O) }, | ||
79 | { "max7326", GROUP_A(IO_4I4O) | GROUP_B(IO_8O) }, | ||
80 | { "max7327", GROUP_A(IO_4P4O) | GROUP_B(IO_8O) }, | ||
81 | { }, | ||
82 | }; | ||
83 | MODULE_DEVICE_TABLE(i2c, max732x_id); | ||
84 | |||
85 | struct max732x_chip { | ||
86 | struct gpio_chip gpio_chip; | ||
87 | |||
88 | struct i2c_client *client; /* "main" client */ | ||
89 | struct i2c_client *client_dummy; | ||
90 | struct i2c_client *client_group_a; | ||
91 | struct i2c_client *client_group_b; | ||
92 | |||
93 | unsigned int mask_group_a; | ||
94 | unsigned int dir_input; | ||
95 | unsigned int dir_output; | ||
96 | |||
97 | struct mutex lock; | ||
98 | uint8_t reg_out[2]; | ||
99 | }; | ||
100 | |||
101 | static int max732x_write(struct max732x_chip *chip, int group_a, uint8_t val) | ||
102 | { | ||
103 | struct i2c_client *client; | ||
104 | int ret; | ||
105 | |||
106 | client = group_a ? chip->client_group_a : chip->client_group_b; | ||
107 | ret = i2c_smbus_write_byte(client, val); | ||
108 | if (ret < 0) { | ||
109 | dev_err(&client->dev, "failed writing\n"); | ||
110 | return ret; | ||
111 | } | ||
112 | |||
113 | return 0; | ||
114 | } | ||
115 | |||
116 | static int max732x_read(struct max732x_chip *chip, int group_a, uint8_t *val) | ||
117 | { | ||
118 | struct i2c_client *client; | ||
119 | int ret; | ||
120 | |||
121 | client = group_a ? chip->client_group_a : chip->client_group_b; | ||
122 | ret = i2c_smbus_read_byte(client); | ||
123 | if (ret < 0) { | ||
124 | dev_err(&client->dev, "failed reading\n"); | ||
125 | return ret; | ||
126 | } | ||
127 | |||
128 | *val = (uint8_t)ret; | ||
129 | return 0; | ||
130 | } | ||
131 | |||
132 | static inline int is_group_a(struct max732x_chip *chip, unsigned off) | ||
133 | { | ||
134 | return (1u << off) & chip->mask_group_a; | ||
135 | } | ||
136 | |||
137 | static int max732x_gpio_get_value(struct gpio_chip *gc, unsigned off) | ||
138 | { | ||
139 | struct max732x_chip *chip; | ||
140 | uint8_t reg_val; | ||
141 | int ret; | ||
142 | |||
143 | chip = container_of(gc, struct max732x_chip, gpio_chip); | ||
144 | |||
145 | ret = max732x_read(chip, is_group_a(chip, off), ®_val); | ||
146 | if (ret < 0) | ||
147 | return 0; | ||
148 | |||
149 | return reg_val & (1u << (off & 0x7)); | ||
150 | } | ||
151 | |||
152 | static void max732x_gpio_set_value(struct gpio_chip *gc, unsigned off, int val) | ||
153 | { | ||
154 | struct max732x_chip *chip; | ||
155 | uint8_t reg_out, mask = 1u << (off & 0x7); | ||
156 | int ret; | ||
157 | |||
158 | chip = container_of(gc, struct max732x_chip, gpio_chip); | ||
159 | |||
160 | mutex_lock(&chip->lock); | ||
161 | |||
162 | reg_out = (off > 7) ? chip->reg_out[1] : chip->reg_out[0]; | ||
163 | reg_out = (val) ? reg_out | mask : reg_out & ~mask; | ||
164 | |||
165 | ret = max732x_write(chip, is_group_a(chip, off), reg_out); | ||
166 | if (ret < 0) | ||
167 | goto out; | ||
168 | |||
169 | /* update the shadow register then */ | ||
170 | if (off > 7) | ||
171 | chip->reg_out[1] = reg_out; | ||
172 | else | ||
173 | chip->reg_out[0] = reg_out; | ||
174 | out: | ||
175 | mutex_unlock(&chip->lock); | ||
176 | } | ||
177 | |||
178 | static int max732x_gpio_direction_input(struct gpio_chip *gc, unsigned off) | ||
179 | { | ||
180 | struct max732x_chip *chip; | ||
181 | unsigned int mask = 1u << off; | ||
182 | |||
183 | chip = container_of(gc, struct max732x_chip, gpio_chip); | ||
184 | |||
185 | if ((mask & chip->dir_input) == 0) { | ||
186 | dev_dbg(&chip->client->dev, "%s port %d is output only\n", | ||
187 | chip->client->name, off); | ||
188 | return -EACCES; | ||
189 | } | ||
190 | |||
191 | return 0; | ||
192 | } | ||
193 | |||
194 | static int max732x_gpio_direction_output(struct gpio_chip *gc, | ||
195 | unsigned off, int val) | ||
196 | { | ||
197 | struct max732x_chip *chip; | ||
198 | unsigned int mask = 1u << off; | ||
199 | |||
200 | chip = container_of(gc, struct max732x_chip, gpio_chip); | ||
201 | |||
202 | if ((mask & chip->dir_output) == 0) { | ||
203 | dev_dbg(&chip->client->dev, "%s port %d is input only\n", | ||
204 | chip->client->name, off); | ||
205 | return -EACCES; | ||
206 | } | ||
207 | |||
208 | max732x_gpio_set_value(gc, off, val); | ||
209 | return 0; | ||
210 | } | ||
211 | |||
212 | static int __devinit max732x_setup_gpio(struct max732x_chip *chip, | ||
213 | const struct i2c_device_id *id, | ||
214 | unsigned gpio_start) | ||
215 | { | ||
216 | struct gpio_chip *gc = &chip->gpio_chip; | ||
217 | uint32_t id_data = id->driver_data; | ||
218 | int i, port = 0; | ||
219 | |||
220 | for (i = 0; i < 16; i++, id_data >>= 2) { | ||
221 | unsigned int mask = 1 << port; | ||
222 | |||
223 | switch (id_data & 0x3) { | ||
224 | case PORT_OUTPUT: | ||
225 | chip->dir_output |= mask; | ||
226 | break; | ||
227 | case PORT_INPUT: | ||
228 | chip->dir_input |= mask; | ||
229 | break; | ||
230 | case PORT_OPENDRAIN: | ||
231 | chip->dir_output |= mask; | ||
232 | chip->dir_input |= mask; | ||
233 | break; | ||
234 | default: | ||
235 | continue; | ||
236 | } | ||
237 | |||
238 | if (i < 8) | ||
239 | chip->mask_group_a |= mask; | ||
240 | port++; | ||
241 | } | ||
242 | |||
243 | if (chip->dir_input) | ||
244 | gc->direction_input = max732x_gpio_direction_input; | ||
245 | if (chip->dir_output) { | ||
246 | gc->direction_output = max732x_gpio_direction_output; | ||
247 | gc->set = max732x_gpio_set_value; | ||
248 | } | ||
249 | gc->get = max732x_gpio_get_value; | ||
250 | gc->can_sleep = 1; | ||
251 | |||
252 | gc->base = gpio_start; | ||
253 | gc->ngpio = port; | ||
254 | gc->label = chip->client->name; | ||
255 | gc->owner = THIS_MODULE; | ||
256 | |||
257 | return port; | ||
258 | } | ||
259 | |||
260 | static int __devinit max732x_probe(struct i2c_client *client, | ||
261 | const struct i2c_device_id *id) | ||
262 | { | ||
263 | struct max732x_platform_data *pdata; | ||
264 | struct max732x_chip *chip; | ||
265 | struct i2c_client *c; | ||
266 | uint16_t addr_a, addr_b; | ||
267 | int ret, nr_port; | ||
268 | |||
269 | pdata = client->dev.platform_data; | ||
270 | if (pdata == NULL) | ||
271 | return -ENODEV; | ||
272 | |||
273 | chip = kzalloc(sizeof(struct max732x_chip), GFP_KERNEL); | ||
274 | if (chip == NULL) | ||
275 | return -ENOMEM; | ||
276 | chip->client = client; | ||
277 | |||
278 | nr_port = max732x_setup_gpio(chip, id, pdata->gpio_base); | ||
279 | |||
280 | addr_a = (client->addr & 0x0f) | 0x60; | ||
281 | addr_b = (client->addr & 0x0f) | 0x50; | ||
282 | |||
283 | switch (client->addr & 0x70) { | ||
284 | case 0x60: | ||
285 | chip->client_group_a = client; | ||
286 | if (nr_port > 7) { | ||
287 | c = i2c_new_dummy(client->adapter, addr_b); | ||
288 | chip->client_group_b = chip->client_dummy = c; | ||
289 | } | ||
290 | break; | ||
291 | case 0x50: | ||
292 | chip->client_group_b = client; | ||
293 | if (nr_port > 7) { | ||
294 | c = i2c_new_dummy(client->adapter, addr_a); | ||
295 | chip->client_group_a = chip->client_dummy = c; | ||
296 | } | ||
297 | break; | ||
298 | default: | ||
299 | dev_err(&client->dev, "invalid I2C address specified %02x\n", | ||
300 | client->addr); | ||
301 | ret = -EINVAL; | ||
302 | goto out_failed; | ||
303 | } | ||
304 | |||
305 | mutex_init(&chip->lock); | ||
306 | |||
307 | max732x_read(chip, is_group_a(chip, 0), &chip->reg_out[0]); | ||
308 | if (nr_port > 7) | ||
309 | max732x_read(chip, is_group_a(chip, 8), &chip->reg_out[1]); | ||
310 | |||
311 | ret = gpiochip_add(&chip->gpio_chip); | ||
312 | if (ret) | ||
313 | goto out_failed; | ||
314 | |||
315 | if (pdata->setup) { | ||
316 | ret = pdata->setup(client, chip->gpio_chip.base, | ||
317 | chip->gpio_chip.ngpio, pdata->context); | ||
318 | if (ret < 0) | ||
319 | dev_warn(&client->dev, "setup failed, %d\n", ret); | ||
320 | } | ||
321 | |||
322 | i2c_set_clientdata(client, chip); | ||
323 | return 0; | ||
324 | |||
325 | out_failed: | ||
326 | kfree(chip); | ||
327 | return ret; | ||
328 | } | ||
329 | |||
330 | static int __devexit max732x_remove(struct i2c_client *client) | ||
331 | { | ||
332 | struct max732x_platform_data *pdata = client->dev.platform_data; | ||
333 | struct max732x_chip *chip = i2c_get_clientdata(client); | ||
334 | int ret; | ||
335 | |||
336 | if (pdata->teardown) { | ||
337 | ret = pdata->teardown(client, chip->gpio_chip.base, | ||
338 | chip->gpio_chip.ngpio, pdata->context); | ||
339 | if (ret < 0) { | ||
340 | dev_err(&client->dev, "%s failed, %d\n", | ||
341 | "teardown", ret); | ||
342 | return ret; | ||
343 | } | ||
344 | } | ||
345 | |||
346 | ret = gpiochip_remove(&chip->gpio_chip); | ||
347 | if (ret) { | ||
348 | dev_err(&client->dev, "%s failed, %d\n", | ||
349 | "gpiochip_remove()", ret); | ||
350 | return ret; | ||
351 | } | ||
352 | |||
353 | /* unregister any dummy i2c_client */ | ||
354 | if (chip->client_dummy) | ||
355 | i2c_unregister_device(chip->client_dummy); | ||
356 | |||
357 | kfree(chip); | ||
358 | return 0; | ||
359 | } | ||
360 | |||
361 | static struct i2c_driver max732x_driver = { | ||
362 | .driver = { | ||
363 | .name = "max732x", | ||
364 | .owner = THIS_MODULE, | ||
365 | }, | ||
366 | .probe = max732x_probe, | ||
367 | .remove = __devexit_p(max732x_remove), | ||
368 | .id_table = max732x_id, | ||
369 | }; | ||
370 | |||
371 | static int __init max732x_init(void) | ||
372 | { | ||
373 | return i2c_add_driver(&max732x_driver); | ||
374 | } | ||
375 | module_init(max732x_init); | ||
376 | |||
377 | static void __exit max732x_exit(void) | ||
378 | { | ||
379 | i2c_del_driver(&max732x_driver); | ||
380 | } | ||
381 | module_exit(max732x_exit); | ||
382 | |||
383 | MODULE_AUTHOR("Eric Miao <eric.miao@marvell.com>"); | ||
384 | MODULE_DESCRIPTION("GPIO expander driver for MAX732X"); | ||
385 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/gpio/mcp23s08.c b/drivers/gpio/mcp23s08.c index 7f92fdd5f0e2..8a1b405fefda 100644 --- a/drivers/gpio/mcp23s08.c +++ b/drivers/gpio/mcp23s08.c | |||
@@ -40,15 +40,26 @@ struct mcp23s08 { | |||
40 | struct spi_device *spi; | 40 | struct spi_device *spi; |
41 | u8 addr; | 41 | u8 addr; |
42 | 42 | ||
43 | u8 cache[11]; | ||
43 | /* lock protects the cached values */ | 44 | /* lock protects the cached values */ |
44 | struct mutex lock; | 45 | struct mutex lock; |
45 | u8 cache[11]; | ||
46 | 46 | ||
47 | struct gpio_chip chip; | 47 | struct gpio_chip chip; |
48 | 48 | ||
49 | struct work_struct work; | 49 | struct work_struct work; |
50 | }; | 50 | }; |
51 | 51 | ||
52 | /* A given spi_device can represent up to four mcp23s08 chips | ||
53 | * sharing the same chipselect but using different addresses | ||
54 | * (e.g. chips #0 and #3 might be populated, but not #1 or $2). | ||
55 | * Driver data holds all the per-chip data. | ||
56 | */ | ||
57 | struct mcp23s08_driver_data { | ||
58 | unsigned ngpio; | ||
59 | struct mcp23s08 *mcp[4]; | ||
60 | struct mcp23s08 chip[]; | ||
61 | }; | ||
62 | |||
52 | static int mcp23s08_read(struct mcp23s08 *mcp, unsigned reg) | 63 | static int mcp23s08_read(struct mcp23s08 *mcp, unsigned reg) |
53 | { | 64 | { |
54 | u8 tx[2], rx[1]; | 65 | u8 tx[2], rx[1]; |
@@ -208,25 +219,18 @@ done: | |||
208 | 219 | ||
209 | /*----------------------------------------------------------------------*/ | 220 | /*----------------------------------------------------------------------*/ |
210 | 221 | ||
211 | static int mcp23s08_probe(struct spi_device *spi) | 222 | static int mcp23s08_probe_one(struct spi_device *spi, unsigned addr, |
223 | unsigned base, unsigned pullups) | ||
212 | { | 224 | { |
213 | struct mcp23s08 *mcp; | 225 | struct mcp23s08_driver_data *data = spi_get_drvdata(spi); |
214 | struct mcp23s08_platform_data *pdata; | 226 | struct mcp23s08 *mcp = data->mcp[addr]; |
215 | int status; | 227 | int status; |
216 | int do_update = 0; | 228 | int do_update = 0; |
217 | 229 | ||
218 | pdata = spi->dev.platform_data; | ||
219 | if (!pdata || pdata->slave > 3 || !pdata->base) | ||
220 | return -ENODEV; | ||
221 | |||
222 | mcp = kzalloc(sizeof *mcp, GFP_KERNEL); | ||
223 | if (!mcp) | ||
224 | return -ENOMEM; | ||
225 | |||
226 | mutex_init(&mcp->lock); | 230 | mutex_init(&mcp->lock); |
227 | 231 | ||
228 | mcp->spi = spi; | 232 | mcp->spi = spi; |
229 | mcp->addr = 0x40 | (pdata->slave << 1); | 233 | mcp->addr = 0x40 | (addr << 1); |
230 | 234 | ||
231 | mcp->chip.label = "mcp23s08", | 235 | mcp->chip.label = "mcp23s08", |
232 | 236 | ||
@@ -236,26 +240,28 @@ static int mcp23s08_probe(struct spi_device *spi) | |||
236 | mcp->chip.set = mcp23s08_set; | 240 | mcp->chip.set = mcp23s08_set; |
237 | mcp->chip.dbg_show = mcp23s08_dbg_show; | 241 | mcp->chip.dbg_show = mcp23s08_dbg_show; |
238 | 242 | ||
239 | mcp->chip.base = pdata->base; | 243 | mcp->chip.base = base; |
240 | mcp->chip.ngpio = 8; | 244 | mcp->chip.ngpio = 8; |
241 | mcp->chip.can_sleep = 1; | 245 | mcp->chip.can_sleep = 1; |
246 | mcp->chip.dev = &spi->dev; | ||
242 | mcp->chip.owner = THIS_MODULE; | 247 | mcp->chip.owner = THIS_MODULE; |
243 | 248 | ||
244 | spi_set_drvdata(spi, mcp); | 249 | /* verify MCP_IOCON.SEQOP = 0, so sequential reads work, |
245 | 250 | * and MCP_IOCON.HAEN = 1, so we work with all chips. | |
246 | /* verify MCP_IOCON.SEQOP = 0, so sequential reads work */ | 251 | */ |
247 | status = mcp23s08_read(mcp, MCP_IOCON); | 252 | status = mcp23s08_read(mcp, MCP_IOCON); |
248 | if (status < 0) | 253 | if (status < 0) |
249 | goto fail; | 254 | goto fail; |
250 | if (status & IOCON_SEQOP) { | 255 | if ((status & IOCON_SEQOP) || !(status & IOCON_HAEN)) { |
251 | status &= ~IOCON_SEQOP; | 256 | status &= ~IOCON_SEQOP; |
257 | status |= IOCON_HAEN; | ||
252 | status = mcp23s08_write(mcp, MCP_IOCON, (u8) status); | 258 | status = mcp23s08_write(mcp, MCP_IOCON, (u8) status); |
253 | if (status < 0) | 259 | if (status < 0) |
254 | goto fail; | 260 | goto fail; |
255 | } | 261 | } |
256 | 262 | ||
257 | /* configure ~100K pullups */ | 263 | /* configure ~100K pullups */ |
258 | status = mcp23s08_write(mcp, MCP_GPPU, pdata->pullups); | 264 | status = mcp23s08_write(mcp, MCP_GPPU, pullups); |
259 | if (status < 0) | 265 | if (status < 0) |
260 | goto fail; | 266 | goto fail; |
261 | 267 | ||
@@ -282,11 +288,58 @@ static int mcp23s08_probe(struct spi_device *spi) | |||
282 | tx[1] = MCP_IPOL; | 288 | tx[1] = MCP_IPOL; |
283 | memcpy(&tx[2], &mcp->cache[MCP_IPOL], sizeof(tx) - 2); | 289 | memcpy(&tx[2], &mcp->cache[MCP_IPOL], sizeof(tx) - 2); |
284 | status = spi_write_then_read(mcp->spi, tx, sizeof tx, NULL, 0); | 290 | status = spi_write_then_read(mcp->spi, tx, sizeof tx, NULL, 0); |
285 | 291 | if (status < 0) | |
286 | /* FIXME check status... */ | 292 | goto fail; |
287 | } | 293 | } |
288 | 294 | ||
289 | status = gpiochip_add(&mcp->chip); | 295 | status = gpiochip_add(&mcp->chip); |
296 | fail: | ||
297 | if (status < 0) | ||
298 | dev_dbg(&spi->dev, "can't setup chip %d, --> %d\n", | ||
299 | addr, status); | ||
300 | return status; | ||
301 | } | ||
302 | |||
303 | static int mcp23s08_probe(struct spi_device *spi) | ||
304 | { | ||
305 | struct mcp23s08_platform_data *pdata; | ||
306 | unsigned addr; | ||
307 | unsigned chips = 0; | ||
308 | struct mcp23s08_driver_data *data; | ||
309 | int status; | ||
310 | unsigned base; | ||
311 | |||
312 | pdata = spi->dev.platform_data; | ||
313 | if (!pdata || !gpio_is_valid(pdata->base)) | ||
314 | return -ENODEV; | ||
315 | |||
316 | for (addr = 0; addr < 4; addr++) { | ||
317 | if (!pdata->chip[addr].is_present) | ||
318 | continue; | ||
319 | chips++; | ||
320 | } | ||
321 | if (!chips) | ||
322 | return -ENODEV; | ||
323 | |||
324 | data = kzalloc(sizeof *data + chips * sizeof(struct mcp23s08), | ||
325 | GFP_KERNEL); | ||
326 | if (!data) | ||
327 | return -ENOMEM; | ||
328 | spi_set_drvdata(spi, data); | ||
329 | |||
330 | base = pdata->base; | ||
331 | for (addr = 0; addr < 4; addr++) { | ||
332 | if (!pdata->chip[addr].is_present) | ||
333 | continue; | ||
334 | chips--; | ||
335 | data->mcp[addr] = &data->chip[chips]; | ||
336 | status = mcp23s08_probe_one(spi, addr, base, | ||
337 | pdata->chip[addr].pullups); | ||
338 | if (status < 0) | ||
339 | goto fail; | ||
340 | base += 8; | ||
341 | } | ||
342 | data->ngpio = base - pdata->base; | ||
290 | 343 | ||
291 | /* NOTE: these chips have a relatively sane IRQ framework, with | 344 | /* NOTE: these chips have a relatively sane IRQ framework, with |
292 | * per-signal masking and level/edge triggering. It's not yet | 345 | * per-signal masking and level/edge triggering. It's not yet |
@@ -294,8 +347,9 @@ static int mcp23s08_probe(struct spi_device *spi) | |||
294 | */ | 347 | */ |
295 | 348 | ||
296 | if (pdata->setup) { | 349 | if (pdata->setup) { |
297 | status = pdata->setup(spi, mcp->chip.base, | 350 | status = pdata->setup(spi, |
298 | mcp->chip.ngpio, pdata->context); | 351 | pdata->base, data->ngpio, |
352 | pdata->context); | ||
299 | if (status < 0) | 353 | if (status < 0) |
300 | dev_dbg(&spi->dev, "setup --> %d\n", status); | 354 | dev_dbg(&spi->dev, "setup --> %d\n", status); |
301 | } | 355 | } |
@@ -303,19 +357,29 @@ static int mcp23s08_probe(struct spi_device *spi) | |||
303 | return 0; | 357 | return 0; |
304 | 358 | ||
305 | fail: | 359 | fail: |
306 | kfree(mcp); | 360 | for (addr = 0; addr < 4; addr++) { |
361 | int tmp; | ||
362 | |||
363 | if (!data->mcp[addr]) | ||
364 | continue; | ||
365 | tmp = gpiochip_remove(&data->mcp[addr]->chip); | ||
366 | if (tmp < 0) | ||
367 | dev_err(&spi->dev, "%s --> %d\n", "remove", tmp); | ||
368 | } | ||
369 | kfree(data); | ||
307 | return status; | 370 | return status; |
308 | } | 371 | } |
309 | 372 | ||
310 | static int mcp23s08_remove(struct spi_device *spi) | 373 | static int mcp23s08_remove(struct spi_device *spi) |
311 | { | 374 | { |
312 | struct mcp23s08 *mcp = spi_get_drvdata(spi); | 375 | struct mcp23s08_driver_data *data = spi_get_drvdata(spi); |
313 | struct mcp23s08_platform_data *pdata = spi->dev.platform_data; | 376 | struct mcp23s08_platform_data *pdata = spi->dev.platform_data; |
377 | unsigned addr; | ||
314 | int status = 0; | 378 | int status = 0; |
315 | 379 | ||
316 | if (pdata->teardown) { | 380 | if (pdata->teardown) { |
317 | status = pdata->teardown(spi, | 381 | status = pdata->teardown(spi, |
318 | mcp->chip.base, mcp->chip.ngpio, | 382 | pdata->base, data->ngpio, |
319 | pdata->context); | 383 | pdata->context); |
320 | if (status < 0) { | 384 | if (status < 0) { |
321 | dev_err(&spi->dev, "%s --> %d\n", "teardown", status); | 385 | dev_err(&spi->dev, "%s --> %d\n", "teardown", status); |
@@ -323,11 +387,20 @@ static int mcp23s08_remove(struct spi_device *spi) | |||
323 | } | 387 | } |
324 | } | 388 | } |
325 | 389 | ||
326 | status = gpiochip_remove(&mcp->chip); | 390 | for (addr = 0; addr < 4; addr++) { |
391 | int tmp; | ||
392 | |||
393 | if (!data->mcp[addr]) | ||
394 | continue; | ||
395 | |||
396 | tmp = gpiochip_remove(&data->mcp[addr]->chip); | ||
397 | if (tmp < 0) { | ||
398 | dev_err(&spi->dev, "%s --> %d\n", "remove", tmp); | ||
399 | status = tmp; | ||
400 | } | ||
401 | } | ||
327 | if (status == 0) | 402 | if (status == 0) |
328 | kfree(mcp); | 403 | kfree(data); |
329 | else | ||
330 | dev_err(&spi->dev, "%s --> %d\n", "remove", status); | ||
331 | return status; | 404 | return status; |
332 | } | 405 | } |
333 | 406 | ||
@@ -355,4 +428,3 @@ static void __exit mcp23s08_exit(void) | |||
355 | module_exit(mcp23s08_exit); | 428 | module_exit(mcp23s08_exit); |
356 | 429 | ||
357 | MODULE_LICENSE("GPL"); | 430 | MODULE_LICENSE("GPL"); |
358 | |||
diff --git a/drivers/gpio/pca953x.c b/drivers/gpio/pca953x.c index a380730b61ab..cc8468692ae0 100644 --- a/drivers/gpio/pca953x.c +++ b/drivers/gpio/pca953x.c | |||
@@ -188,6 +188,7 @@ static void pca953x_setup_gpio(struct pca953x_chip *chip, int gpios) | |||
188 | gc->base = chip->gpio_start; | 188 | gc->base = chip->gpio_start; |
189 | gc->ngpio = gpios; | 189 | gc->ngpio = gpios; |
190 | gc->label = chip->client->name; | 190 | gc->label = chip->client->name; |
191 | gc->dev = &chip->client->dev; | ||
191 | gc->owner = THIS_MODULE; | 192 | gc->owner = THIS_MODULE; |
192 | } | 193 | } |
193 | 194 | ||
diff --git a/drivers/gpio/pcf857x.c b/drivers/gpio/pcf857x.c index d25d356c4f20..fc9c6ae739ee 100644 --- a/drivers/gpio/pcf857x.c +++ b/drivers/gpio/pcf857x.c | |||
@@ -200,6 +200,7 @@ static int pcf857x_probe(struct i2c_client *client, | |||
200 | 200 | ||
201 | gpio->chip.base = pdata->gpio_base; | 201 | gpio->chip.base = pdata->gpio_base; |
202 | gpio->chip.can_sleep = 1; | 202 | gpio->chip.can_sleep = 1; |
203 | gpio->chip.dev = &client->dev; | ||
203 | gpio->chip.owner = THIS_MODULE; | 204 | gpio->chip.owner = THIS_MODULE; |
204 | 205 | ||
205 | /* NOTE: the OnSemi jlc1562b is also largely compatible with | 206 | /* NOTE: the OnSemi jlc1562b is also largely compatible with |