diff options
Diffstat (limited to 'drivers/spi/spi.c')
-rw-r--r-- | drivers/spi/spi.c | 642 |
1 files changed, 642 insertions, 0 deletions
diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c new file mode 100644 index 000000000000..791c4dc550ae --- /dev/null +++ b/drivers/spi/spi.c | |||
@@ -0,0 +1,642 @@ | |||
1 | /* | ||
2 | * spi.c - SPI init/core code | ||
3 | * | ||
4 | * Copyright (C) 2005 David Brownell | ||
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 as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
19 | */ | ||
20 | |||
21 | #include <linux/autoconf.h> | ||
22 | #include <linux/kernel.h> | ||
23 | #include <linux/device.h> | ||
24 | #include <linux/init.h> | ||
25 | #include <linux/cache.h> | ||
26 | #include <linux/spi/spi.h> | ||
27 | |||
28 | |||
29 | /* SPI bustype and spi_master class are registered after board init code | ||
30 | * provides the SPI device tables, ensuring that both are present by the | ||
31 | * time controller driver registration causes spi_devices to "enumerate". | ||
32 | */ | ||
33 | static void spidev_release(struct device *dev) | ||
34 | { | ||
35 | const struct spi_device *spi = to_spi_device(dev); | ||
36 | |||
37 | /* spi masters may cleanup for released devices */ | ||
38 | if (spi->master->cleanup) | ||
39 | spi->master->cleanup(spi); | ||
40 | |||
41 | spi_master_put(spi->master); | ||
42 | kfree(dev); | ||
43 | } | ||
44 | |||
45 | static ssize_t | ||
46 | modalias_show(struct device *dev, struct device_attribute *a, char *buf) | ||
47 | { | ||
48 | const struct spi_device *spi = to_spi_device(dev); | ||
49 | |||
50 | return snprintf(buf, BUS_ID_SIZE + 1, "%s\n", spi->modalias); | ||
51 | } | ||
52 | |||
53 | static struct device_attribute spi_dev_attrs[] = { | ||
54 | __ATTR_RO(modalias), | ||
55 | __ATTR_NULL, | ||
56 | }; | ||
57 | |||
58 | /* modalias support makes "modprobe $MODALIAS" new-style hotplug work, | ||
59 | * and the sysfs version makes coldplug work too. | ||
60 | */ | ||
61 | |||
62 | static int spi_match_device(struct device *dev, struct device_driver *drv) | ||
63 | { | ||
64 | const struct spi_device *spi = to_spi_device(dev); | ||
65 | |||
66 | return strncmp(spi->modalias, drv->name, BUS_ID_SIZE) == 0; | ||
67 | } | ||
68 | |||
69 | static int spi_uevent(struct device *dev, char **envp, int num_envp, | ||
70 | char *buffer, int buffer_size) | ||
71 | { | ||
72 | const struct spi_device *spi = to_spi_device(dev); | ||
73 | |||
74 | envp[0] = buffer; | ||
75 | snprintf(buffer, buffer_size, "MODALIAS=%s", spi->modalias); | ||
76 | envp[1] = NULL; | ||
77 | return 0; | ||
78 | } | ||
79 | |||
80 | #ifdef CONFIG_PM | ||
81 | |||
82 | /* | ||
83 | * NOTE: the suspend() method for an spi_master controller driver | ||
84 | * should verify that all its child devices are marked as suspended; | ||
85 | * suspend requests delivered through sysfs power/state files don't | ||
86 | * enforce such constraints. | ||
87 | */ | ||
88 | static int spi_suspend(struct device *dev, pm_message_t message) | ||
89 | { | ||
90 | int value; | ||
91 | struct spi_driver *drv = to_spi_driver(dev->driver); | ||
92 | |||
93 | if (!drv->suspend) | ||
94 | return 0; | ||
95 | |||
96 | /* suspend will stop irqs and dma; no more i/o */ | ||
97 | value = drv->suspend(to_spi_device(dev), message); | ||
98 | if (value == 0) | ||
99 | dev->power.power_state = message; | ||
100 | return value; | ||
101 | } | ||
102 | |||
103 | static int spi_resume(struct device *dev) | ||
104 | { | ||
105 | int value; | ||
106 | struct spi_driver *drv = to_spi_driver(dev->driver); | ||
107 | |||
108 | if (!drv->resume) | ||
109 | return 0; | ||
110 | |||
111 | /* resume may restart the i/o queue */ | ||
112 | value = drv->resume(to_spi_device(dev)); | ||
113 | if (value == 0) | ||
114 | dev->power.power_state = PMSG_ON; | ||
115 | return value; | ||
116 | } | ||
117 | |||
118 | #else | ||
119 | #define spi_suspend NULL | ||
120 | #define spi_resume NULL | ||
121 | #endif | ||
122 | |||
123 | struct bus_type spi_bus_type = { | ||
124 | .name = "spi", | ||
125 | .dev_attrs = spi_dev_attrs, | ||
126 | .match = spi_match_device, | ||
127 | .uevent = spi_uevent, | ||
128 | .suspend = spi_suspend, | ||
129 | .resume = spi_resume, | ||
130 | }; | ||
131 | EXPORT_SYMBOL_GPL(spi_bus_type); | ||
132 | |||
133 | |||
134 | static int spi_drv_probe(struct device *dev) | ||
135 | { | ||
136 | const struct spi_driver *sdrv = to_spi_driver(dev->driver); | ||
137 | |||
138 | return sdrv->probe(to_spi_device(dev)); | ||
139 | } | ||
140 | |||
141 | static int spi_drv_remove(struct device *dev) | ||
142 | { | ||
143 | const struct spi_driver *sdrv = to_spi_driver(dev->driver); | ||
144 | |||
145 | return sdrv->remove(to_spi_device(dev)); | ||
146 | } | ||
147 | |||
148 | static void spi_drv_shutdown(struct device *dev) | ||
149 | { | ||
150 | const struct spi_driver *sdrv = to_spi_driver(dev->driver); | ||
151 | |||
152 | sdrv->shutdown(to_spi_device(dev)); | ||
153 | } | ||
154 | |||
155 | int spi_register_driver(struct spi_driver *sdrv) | ||
156 | { | ||
157 | sdrv->driver.bus = &spi_bus_type; | ||
158 | if (sdrv->probe) | ||
159 | sdrv->driver.probe = spi_drv_probe; | ||
160 | if (sdrv->remove) | ||
161 | sdrv->driver.remove = spi_drv_remove; | ||
162 | if (sdrv->shutdown) | ||
163 | sdrv->driver.shutdown = spi_drv_shutdown; | ||
164 | return driver_register(&sdrv->driver); | ||
165 | } | ||
166 | EXPORT_SYMBOL_GPL(spi_register_driver); | ||
167 | |||
168 | /*-------------------------------------------------------------------------*/ | ||
169 | |||
170 | /* SPI devices should normally not be created by SPI device drivers; that | ||
171 | * would make them board-specific. Similarly with SPI master drivers. | ||
172 | * Device registration normally goes into like arch/.../mach.../board-YYY.c | ||
173 | * with other readonly (flashable) information about mainboard devices. | ||
174 | */ | ||
175 | |||
176 | struct boardinfo { | ||
177 | struct list_head list; | ||
178 | unsigned n_board_info; | ||
179 | struct spi_board_info board_info[0]; | ||
180 | }; | ||
181 | |||
182 | static LIST_HEAD(board_list); | ||
183 | static DECLARE_MUTEX(board_lock); | ||
184 | |||
185 | |||
186 | /* On typical mainboards, this is purely internal; and it's not needed | ||
187 | * after board init creates the hard-wired devices. Some development | ||
188 | * platforms may not be able to use spi_register_board_info though, and | ||
189 | * this is exported so that for example a USB or parport based adapter | ||
190 | * driver could add devices (which it would learn about out-of-band). | ||
191 | */ | ||
192 | struct spi_device *__init_or_module | ||
193 | spi_new_device(struct spi_master *master, struct spi_board_info *chip) | ||
194 | { | ||
195 | struct spi_device *proxy; | ||
196 | struct device *dev = master->cdev.dev; | ||
197 | int status; | ||
198 | |||
199 | /* NOTE: caller did any chip->bus_num checks necessary */ | ||
200 | |||
201 | if (!spi_master_get(master)) | ||
202 | return NULL; | ||
203 | |||
204 | proxy = kzalloc(sizeof *proxy, GFP_KERNEL); | ||
205 | if (!proxy) { | ||
206 | dev_err(dev, "can't alloc dev for cs%d\n", | ||
207 | chip->chip_select); | ||
208 | goto fail; | ||
209 | } | ||
210 | proxy->master = master; | ||
211 | proxy->chip_select = chip->chip_select; | ||
212 | proxy->max_speed_hz = chip->max_speed_hz; | ||
213 | proxy->irq = chip->irq; | ||
214 | proxy->modalias = chip->modalias; | ||
215 | |||
216 | snprintf(proxy->dev.bus_id, sizeof proxy->dev.bus_id, | ||
217 | "%s.%u", master->cdev.class_id, | ||
218 | chip->chip_select); | ||
219 | proxy->dev.parent = dev; | ||
220 | proxy->dev.bus = &spi_bus_type; | ||
221 | proxy->dev.platform_data = (void *) chip->platform_data; | ||
222 | proxy->controller_data = chip->controller_data; | ||
223 | proxy->controller_state = NULL; | ||
224 | proxy->dev.release = spidev_release; | ||
225 | |||
226 | /* drivers may modify this default i/o setup */ | ||
227 | status = master->setup(proxy); | ||
228 | if (status < 0) { | ||
229 | dev_dbg(dev, "can't %s %s, status %d\n", | ||
230 | "setup", proxy->dev.bus_id, status); | ||
231 | goto fail; | ||
232 | } | ||
233 | |||
234 | /* driver core catches callers that misbehave by defining | ||
235 | * devices that already exist. | ||
236 | */ | ||
237 | status = device_register(&proxy->dev); | ||
238 | if (status < 0) { | ||
239 | dev_dbg(dev, "can't %s %s, status %d\n", | ||
240 | "add", proxy->dev.bus_id, status); | ||
241 | goto fail; | ||
242 | } | ||
243 | dev_dbg(dev, "registered child %s\n", proxy->dev.bus_id); | ||
244 | return proxy; | ||
245 | |||
246 | fail: | ||
247 | spi_master_put(master); | ||
248 | kfree(proxy); | ||
249 | return NULL; | ||
250 | } | ||
251 | EXPORT_SYMBOL_GPL(spi_new_device); | ||
252 | |||
253 | /* | ||
254 | * Board-specific early init code calls this (probably during arch_initcall) | ||
255 | * with segments of the SPI device table. Any device nodes are created later, | ||
256 | * after the relevant parent SPI controller (bus_num) is defined. We keep | ||
257 | * this table of devices forever, so that reloading a controller driver will | ||
258 | * not make Linux forget about these hard-wired devices. | ||
259 | * | ||
260 | * Other code can also call this, e.g. a particular add-on board might provide | ||
261 | * SPI devices through its expansion connector, so code initializing that board | ||
262 | * would naturally declare its SPI devices. | ||
263 | * | ||
264 | * The board info passed can safely be __initdata ... but be careful of | ||
265 | * any embedded pointers (platform_data, etc), they're copied as-is. | ||
266 | */ | ||
267 | int __init | ||
268 | spi_register_board_info(struct spi_board_info const *info, unsigned n) | ||
269 | { | ||
270 | struct boardinfo *bi; | ||
271 | |||
272 | bi = kmalloc(sizeof(*bi) + n * sizeof *info, GFP_KERNEL); | ||
273 | if (!bi) | ||
274 | return -ENOMEM; | ||
275 | bi->n_board_info = n; | ||
276 | memcpy(bi->board_info, info, n * sizeof *info); | ||
277 | |||
278 | down(&board_lock); | ||
279 | list_add_tail(&bi->list, &board_list); | ||
280 | up(&board_lock); | ||
281 | return 0; | ||
282 | } | ||
283 | EXPORT_SYMBOL_GPL(spi_register_board_info); | ||
284 | |||
285 | /* FIXME someone should add support for a __setup("spi", ...) that | ||
286 | * creates board info from kernel command lines | ||
287 | */ | ||
288 | |||
289 | static void __init_or_module | ||
290 | scan_boardinfo(struct spi_master *master) | ||
291 | { | ||
292 | struct boardinfo *bi; | ||
293 | struct device *dev = master->cdev.dev; | ||
294 | |||
295 | down(&board_lock); | ||
296 | list_for_each_entry(bi, &board_list, list) { | ||
297 | struct spi_board_info *chip = bi->board_info; | ||
298 | unsigned n; | ||
299 | |||
300 | for (n = bi->n_board_info; n > 0; n--, chip++) { | ||
301 | if (chip->bus_num != master->bus_num) | ||
302 | continue; | ||
303 | /* some controllers only have one chip, so they | ||
304 | * might not use chipselects. otherwise, the | ||
305 | * chipselects are numbered 0..max. | ||
306 | */ | ||
307 | if (chip->chip_select >= master->num_chipselect | ||
308 | && master->num_chipselect) { | ||
309 | dev_dbg(dev, "cs%d > max %d\n", | ||
310 | chip->chip_select, | ||
311 | master->num_chipselect); | ||
312 | continue; | ||
313 | } | ||
314 | (void) spi_new_device(master, chip); | ||
315 | } | ||
316 | } | ||
317 | up(&board_lock); | ||
318 | } | ||
319 | |||
320 | /*-------------------------------------------------------------------------*/ | ||
321 | |||
322 | static void spi_master_release(struct class_device *cdev) | ||
323 | { | ||
324 | struct spi_master *master; | ||
325 | |||
326 | master = container_of(cdev, struct spi_master, cdev); | ||
327 | kfree(master); | ||
328 | } | ||
329 | |||
330 | static struct class spi_master_class = { | ||
331 | .name = "spi_master", | ||
332 | .owner = THIS_MODULE, | ||
333 | .release = spi_master_release, | ||
334 | }; | ||
335 | |||
336 | |||
337 | /** | ||
338 | * spi_alloc_master - allocate SPI master controller | ||
339 | * @dev: the controller, possibly using the platform_bus | ||
340 | * @size: how much driver-private data to preallocate; the pointer to this | ||
341 | * memory is in the class_data field of the returned class_device, | ||
342 | * accessible with spi_master_get_devdata(). | ||
343 | * | ||
344 | * This call is used only by SPI master controller drivers, which are the | ||
345 | * only ones directly touching chip registers. It's how they allocate | ||
346 | * an spi_master structure, prior to calling spi_add_master(). | ||
347 | * | ||
348 | * This must be called from context that can sleep. It returns the SPI | ||
349 | * master structure on success, else NULL. | ||
350 | * | ||
351 | * The caller is responsible for assigning the bus number and initializing | ||
352 | * the master's methods before calling spi_add_master(); and (after errors | ||
353 | * adding the device) calling spi_master_put() to prevent a memory leak. | ||
354 | */ | ||
355 | struct spi_master * __init_or_module | ||
356 | spi_alloc_master(struct device *dev, unsigned size) | ||
357 | { | ||
358 | struct spi_master *master; | ||
359 | |||
360 | if (!dev) | ||
361 | return NULL; | ||
362 | |||
363 | master = kzalloc(size + sizeof *master, SLAB_KERNEL); | ||
364 | if (!master) | ||
365 | return NULL; | ||
366 | |||
367 | class_device_initialize(&master->cdev); | ||
368 | master->cdev.class = &spi_master_class; | ||
369 | master->cdev.dev = get_device(dev); | ||
370 | spi_master_set_devdata(master, &master[1]); | ||
371 | |||
372 | return master; | ||
373 | } | ||
374 | EXPORT_SYMBOL_GPL(spi_alloc_master); | ||
375 | |||
376 | /** | ||
377 | * spi_register_master - register SPI master controller | ||
378 | * @master: initialized master, originally from spi_alloc_master() | ||
379 | * | ||
380 | * SPI master controllers connect to their drivers using some non-SPI bus, | ||
381 | * such as the platform bus. The final stage of probe() in that code | ||
382 | * includes calling spi_register_master() to hook up to this SPI bus glue. | ||
383 | * | ||
384 | * SPI controllers use board specific (often SOC specific) bus numbers, | ||
385 | * and board-specific addressing for SPI devices combines those numbers | ||
386 | * with chip select numbers. Since SPI does not directly support dynamic | ||
387 | * device identification, boards need configuration tables telling which | ||
388 | * chip is at which address. | ||
389 | * | ||
390 | * This must be called from context that can sleep. It returns zero on | ||
391 | * success, else a negative error code (dropping the master's refcount). | ||
392 | * After a successful return, the caller is responsible for calling | ||
393 | * spi_unregister_master(). | ||
394 | */ | ||
395 | int __init_or_module | ||
396 | spi_register_master(struct spi_master *master) | ||
397 | { | ||
398 | static atomic_t dyn_bus_id = ATOMIC_INIT(0); | ||
399 | struct device *dev = master->cdev.dev; | ||
400 | int status = -ENODEV; | ||
401 | int dynamic = 0; | ||
402 | |||
403 | if (!dev) | ||
404 | return -ENODEV; | ||
405 | |||
406 | /* convention: dynamically assigned bus IDs count down from the max */ | ||
407 | if (master->bus_num == 0) { | ||
408 | master->bus_num = atomic_dec_return(&dyn_bus_id); | ||
409 | dynamic = 1; | ||
410 | } | ||
411 | |||
412 | /* register the device, then userspace will see it. | ||
413 | * registration fails if the bus ID is in use. | ||
414 | */ | ||
415 | snprintf(master->cdev.class_id, sizeof master->cdev.class_id, | ||
416 | "spi%u", master->bus_num); | ||
417 | status = class_device_add(&master->cdev); | ||
418 | if (status < 0) | ||
419 | goto done; | ||
420 | dev_dbg(dev, "registered master %s%s\n", master->cdev.class_id, | ||
421 | dynamic ? " (dynamic)" : ""); | ||
422 | |||
423 | /* populate children from any spi device tables */ | ||
424 | scan_boardinfo(master); | ||
425 | status = 0; | ||
426 | done: | ||
427 | return status; | ||
428 | } | ||
429 | EXPORT_SYMBOL_GPL(spi_register_master); | ||
430 | |||
431 | |||
432 | static int __unregister(struct device *dev, void *unused) | ||
433 | { | ||
434 | /* note: before about 2.6.14-rc1 this would corrupt memory: */ | ||
435 | spi_unregister_device(to_spi_device(dev)); | ||
436 | return 0; | ||
437 | } | ||
438 | |||
439 | /** | ||
440 | * spi_unregister_master - unregister SPI master controller | ||
441 | * @master: the master being unregistered | ||
442 | * | ||
443 | * This call is used only by SPI master controller drivers, which are the | ||
444 | * only ones directly touching chip registers. | ||
445 | * | ||
446 | * This must be called from context that can sleep. | ||
447 | */ | ||
448 | void spi_unregister_master(struct spi_master *master) | ||
449 | { | ||
450 | (void) device_for_each_child(master->cdev.dev, NULL, __unregister); | ||
451 | class_device_unregister(&master->cdev); | ||
452 | master->cdev.dev = NULL; | ||
453 | } | ||
454 | EXPORT_SYMBOL_GPL(spi_unregister_master); | ||
455 | |||
456 | /** | ||
457 | * spi_busnum_to_master - look up master associated with bus_num | ||
458 | * @bus_num: the master's bus number | ||
459 | * | ||
460 | * This call may be used with devices that are registered after | ||
461 | * arch init time. It returns a refcounted pointer to the relevant | ||
462 | * spi_master (which the caller must release), or NULL if there is | ||
463 | * no such master registered. | ||
464 | */ | ||
465 | struct spi_master *spi_busnum_to_master(u16 bus_num) | ||
466 | { | ||
467 | if (bus_num) { | ||
468 | char name[8]; | ||
469 | struct kobject *bus; | ||
470 | |||
471 | snprintf(name, sizeof name, "spi%u", bus_num); | ||
472 | bus = kset_find_obj(&spi_master_class.subsys.kset, name); | ||
473 | if (bus) | ||
474 | return container_of(bus, struct spi_master, cdev.kobj); | ||
475 | } | ||
476 | return NULL; | ||
477 | } | ||
478 | EXPORT_SYMBOL_GPL(spi_busnum_to_master); | ||
479 | |||
480 | |||
481 | /*-------------------------------------------------------------------------*/ | ||
482 | |||
483 | static void spi_complete(void *arg) | ||
484 | { | ||
485 | complete(arg); | ||
486 | } | ||
487 | |||
488 | /** | ||
489 | * spi_sync - blocking/synchronous SPI data transfers | ||
490 | * @spi: device with which data will be exchanged | ||
491 | * @message: describes the data transfers | ||
492 | * | ||
493 | * This call may only be used from a context that may sleep. The sleep | ||
494 | * is non-interruptible, and has no timeout. Low-overhead controller | ||
495 | * drivers may DMA directly into and out of the message buffers. | ||
496 | * | ||
497 | * Note that the SPI device's chip select is active during the message, | ||
498 | * and then is normally disabled between messages. Drivers for some | ||
499 | * frequently-used devices may want to minimize costs of selecting a chip, | ||
500 | * by leaving it selected in anticipation that the next message will go | ||
501 | * to the same chip. (That may increase power usage.) | ||
502 | * | ||
503 | * Also, the caller is guaranteeing that the memory associated with the | ||
504 | * message will not be freed before this call returns. | ||
505 | * | ||
506 | * The return value is a negative error code if the message could not be | ||
507 | * submitted, else zero. When the value is zero, then message->status is | ||
508 | * also defined: it's the completion code for the transfer, either zero | ||
509 | * or a negative error code from the controller driver. | ||
510 | */ | ||
511 | int spi_sync(struct spi_device *spi, struct spi_message *message) | ||
512 | { | ||
513 | DECLARE_COMPLETION(done); | ||
514 | int status; | ||
515 | |||
516 | message->complete = spi_complete; | ||
517 | message->context = &done; | ||
518 | status = spi_async(spi, message); | ||
519 | if (status == 0) | ||
520 | wait_for_completion(&done); | ||
521 | message->context = NULL; | ||
522 | return status; | ||
523 | } | ||
524 | EXPORT_SYMBOL_GPL(spi_sync); | ||
525 | |||
526 | #define SPI_BUFSIZ (SMP_CACHE_BYTES) | ||
527 | |||
528 | static u8 *buf; | ||
529 | |||
530 | /** | ||
531 | * spi_write_then_read - SPI synchronous write followed by read | ||
532 | * @spi: device with which data will be exchanged | ||
533 | * @txbuf: data to be written (need not be dma-safe) | ||
534 | * @n_tx: size of txbuf, in bytes | ||
535 | * @rxbuf: buffer into which data will be read | ||
536 | * @n_rx: size of rxbuf, in bytes (need not be dma-safe) | ||
537 | * | ||
538 | * This performs a half duplex MicroWire style transaction with the | ||
539 | * device, sending txbuf and then reading rxbuf. The return value | ||
540 | * is zero for success, else a negative errno status code. | ||
541 | * This call may only be used from a context that may sleep. | ||
542 | * | ||
543 | * Parameters to this routine are always copied using a small buffer; | ||
544 | * performance-sensitive or bulk transfer code should instead use | ||
545 | * spi_{async,sync}() calls with dma-safe buffers. | ||
546 | */ | ||
547 | int spi_write_then_read(struct spi_device *spi, | ||
548 | const u8 *txbuf, unsigned n_tx, | ||
549 | u8 *rxbuf, unsigned n_rx) | ||
550 | { | ||
551 | static DECLARE_MUTEX(lock); | ||
552 | |||
553 | int status; | ||
554 | struct spi_message message; | ||
555 | struct spi_transfer x[2]; | ||
556 | u8 *local_buf; | ||
557 | |||
558 | /* Use preallocated DMA-safe buffer. We can't avoid copying here, | ||
559 | * (as a pure convenience thing), but we can keep heap costs | ||
560 | * out of the hot path ... | ||
561 | */ | ||
562 | if ((n_tx + n_rx) > SPI_BUFSIZ) | ||
563 | return -EINVAL; | ||
564 | |||
565 | spi_message_init(&message); | ||
566 | memset(x, 0, sizeof x); | ||
567 | if (n_tx) { | ||
568 | x[0].len = n_tx; | ||
569 | spi_message_add_tail(&x[0], &message); | ||
570 | } | ||
571 | if (n_rx) { | ||
572 | x[1].len = n_rx; | ||
573 | spi_message_add_tail(&x[1], &message); | ||
574 | } | ||
575 | |||
576 | /* ... unless someone else is using the pre-allocated buffer */ | ||
577 | if (down_trylock(&lock)) { | ||
578 | local_buf = kmalloc(SPI_BUFSIZ, GFP_KERNEL); | ||
579 | if (!local_buf) | ||
580 | return -ENOMEM; | ||
581 | } else | ||
582 | local_buf = buf; | ||
583 | |||
584 | memcpy(local_buf, txbuf, n_tx); | ||
585 | x[0].tx_buf = local_buf; | ||
586 | x[1].rx_buf = local_buf + n_tx; | ||
587 | |||
588 | /* do the i/o */ | ||
589 | status = spi_sync(spi, &message); | ||
590 | if (status == 0) { | ||
591 | memcpy(rxbuf, x[1].rx_buf, n_rx); | ||
592 | status = message.status; | ||
593 | } | ||
594 | |||
595 | if (x[0].tx_buf == buf) | ||
596 | up(&lock); | ||
597 | else | ||
598 | kfree(local_buf); | ||
599 | |||
600 | return status; | ||
601 | } | ||
602 | EXPORT_SYMBOL_GPL(spi_write_then_read); | ||
603 | |||
604 | /*-------------------------------------------------------------------------*/ | ||
605 | |||
606 | static int __init spi_init(void) | ||
607 | { | ||
608 | int status; | ||
609 | |||
610 | buf = kmalloc(SPI_BUFSIZ, SLAB_KERNEL); | ||
611 | if (!buf) { | ||
612 | status = -ENOMEM; | ||
613 | goto err0; | ||
614 | } | ||
615 | |||
616 | status = bus_register(&spi_bus_type); | ||
617 | if (status < 0) | ||
618 | goto err1; | ||
619 | |||
620 | status = class_register(&spi_master_class); | ||
621 | if (status < 0) | ||
622 | goto err2; | ||
623 | return 0; | ||
624 | |||
625 | err2: | ||
626 | bus_unregister(&spi_bus_type); | ||
627 | err1: | ||
628 | kfree(buf); | ||
629 | buf = NULL; | ||
630 | err0: | ||
631 | return status; | ||
632 | } | ||
633 | |||
634 | /* board_info is normally registered in arch_initcall(), | ||
635 | * but even essential drivers wait till later | ||
636 | * | ||
637 | * REVISIT only boardinfo really needs static linking. the rest (device and | ||
638 | * driver registration) _could_ be dynamically linked (modular) ... costs | ||
639 | * include needing to have boardinfo data structures be much more public. | ||
640 | */ | ||
641 | subsys_initcall(spi_init); | ||
642 | |||