aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorDavid Brownell <david-b@pacbell.net>2006-01-08 16:34:23 -0500
committerGreg Kroah-Hartman <gregkh@suse.de>2006-01-13 19:29:54 -0500
commitb885244eb2628e0b8206e7edaaa6a314da78e9a4 (patch)
treee548fb3a94603c4a5406920c97246a78fe16b64a /include
parent1d6432fe10c3e724e307dd7137cd293a0edcae80 (diff)
[PATCH] spi: add spi_driver to SPI framework
This is a refresh of the "Simple SPI Framework" found in 2.6.15-rc3-mm1 which makes the following changes: * There's now a "struct spi_driver". This increase the footprint of the core a bit, since it now includes code to do what the driver core was previously handling directly. Documentation and comments were updated to match. * spi_alloc_master() now does class_device_initialize(), so it can at least be refcounted before spi_register_master(). To match, spi_register_master() switched over to class_device_add(). * States explicitly that after transfer errors, spi_devices will be deselected. We want fault recovery procedures to work the same for all controller drivers. * Minor tweaks: controller_data no longer points to readonly data; prevent some potential cast-from-null bugs with container_of calls; clarifies some existing kerneldoc, And a few small cleanups. Signed-off-by: David Brownell <dbrownell@users.sourceforge.net> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'include')
-rw-r--r--include/linux/spi/spi.h75
1 files changed, 52 insertions, 23 deletions
diff --git a/include/linux/spi/spi.h b/include/linux/spi/spi.h
index 51a6769114df..c851b3d13208 100644
--- a/include/linux/spi/spi.h
+++ b/include/linux/spi/spi.h
@@ -20,13 +20,8 @@
20#define __LINUX_SPI_H 20#define __LINUX_SPI_H
21 21
22/* 22/*
23 * INTERFACES between SPI master drivers and infrastructure 23 * INTERFACES between SPI master-side drivers and SPI infrastructure.
24 * (There's no SPI slave support for Linux yet...) 24 * (There's no SPI slave support for Linux yet...)
25 *
26 * A "struct device_driver" for an spi_device uses "spi_bus_type" and
27 * needs no special API wrappers (much like platform_bus). These drivers
28 * are bound to devices based on their names (much like platform_bus),
29 * and are available in dev->driver.
30 */ 25 */
31extern struct bus_type spi_bus_type; 26extern struct bus_type spi_bus_type;
32 27
@@ -46,8 +41,8 @@ extern struct bus_type spi_bus_type;
46 * @irq: Negative, or the number passed to request_irq() to receive 41 * @irq: Negative, or the number passed to request_irq() to receive
47 * interrupts from this device. 42 * interrupts from this device.
48 * @controller_state: Controller's runtime state 43 * @controller_state: Controller's runtime state
49 * @controller_data: Static board-specific definitions for controller, such 44 * @controller_data: Board-specific definitions for controller, such as
50 * as FIFO initialization parameters; from board_info.controller_data 45 * FIFO initialization parameters; from board_info.controller_data
51 * 46 *
52 * An spi_device is used to interchange data between an SPI slave 47 * An spi_device is used to interchange data between an SPI slave
53 * (usually a discrete chip) and CPU memory. 48 * (usually a discrete chip) and CPU memory.
@@ -63,31 +58,32 @@ struct spi_device {
63 u32 max_speed_hz; 58 u32 max_speed_hz;
64 u8 chip_select; 59 u8 chip_select;
65 u8 mode; 60 u8 mode;
66#define SPI_CPHA 0x01 /* clock phase */ 61#define SPI_CPHA 0x01 /* clock phase */
67#define SPI_CPOL 0x02 /* clock polarity */ 62#define SPI_CPOL 0x02 /* clock polarity */
68#define SPI_MODE_0 (0|0) 63#define SPI_MODE_0 (0|0)
69#define SPI_MODE_1 (0|SPI_CPHA) 64#define SPI_MODE_1 (0|SPI_CPHA) /* (original MicroWire) */
70#define SPI_MODE_2 (SPI_CPOL|0) 65#define SPI_MODE_2 (SPI_CPOL|0)
71#define SPI_MODE_3 (SPI_CPOL|SPI_CPHA) 66#define SPI_MODE_3 (SPI_CPOL|SPI_CPHA)
72#define SPI_CS_HIGH 0x04 /* chipselect active high? */ 67#define SPI_CS_HIGH 0x04 /* chipselect active high? */
73 u8 bits_per_word; 68 u8 bits_per_word;
74 int irq; 69 int irq;
75 void *controller_state; 70 void *controller_state;
76 const void *controller_data; 71 void *controller_data;
77 const char *modalias; 72 const char *modalias;
78 73
79 // likely need more hooks for more protocol options affecting how 74 // likely need more hooks for more protocol options affecting how
80 // the controller talks to its chips, like: 75 // the controller talks to each chip, like:
81 // - bit order (default is wordwise msb-first) 76 // - bit order (default is wordwise msb-first)
82 // - memory packing (12 bit samples into low bits, others zeroed) 77 // - memory packing (12 bit samples into low bits, others zeroed)
83 // - priority 78 // - priority
79 // - drop chipselect after each word
84 // - chipselect delays 80 // - chipselect delays
85 // - ... 81 // - ...
86}; 82};
87 83
88static inline struct spi_device *to_spi_device(struct device *dev) 84static inline struct spi_device *to_spi_device(struct device *dev)
89{ 85{
90 return container_of(dev, struct spi_device, dev); 86 return dev ? container_of(dev, struct spi_device, dev) : NULL;
91} 87}
92 88
93/* most drivers won't need to care about device refcounting */ 89/* most drivers won't need to care about device refcounting */
@@ -117,12 +113,38 @@ static inline void spi_set_ctldata(struct spi_device *spi, void *state)
117struct spi_message; 113struct spi_message;
118 114
119 115
116
117struct spi_driver {
118 int (*probe)(struct spi_device *spi);
119 int (*remove)(struct spi_device *spi);
120 void (*shutdown)(struct spi_device *spi);
121 int (*suspend)(struct spi_device *spi, pm_message_t mesg);
122 int (*resume)(struct spi_device *spi);
123 struct device_driver driver;
124};
125
126static inline struct spi_driver *to_spi_driver(struct device_driver *drv)
127{
128 return drv ? container_of(drv, struct spi_driver, driver) : NULL;
129}
130
131extern int spi_register_driver(struct spi_driver *sdrv);
132
133static inline void spi_unregister_driver(struct spi_driver *sdrv)
134{
135 if (!sdrv)
136 return;
137 driver_unregister(&sdrv->driver);
138}
139
140
141
120/** 142/**
121 * struct spi_master - interface to SPI master controller 143 * struct spi_master - interface to SPI master controller
122 * @cdev: class interface to this driver 144 * @cdev: class interface to this driver
123 * @bus_num: board-specific (and often SOC-specific) identifier for a 145 * @bus_num: board-specific (and often SOC-specific) identifier for a
124 * given SPI controller. 146 * given SPI controller.
125 * @num_chipselects: chipselects are used to distinguish individual 147 * @num_chipselect: chipselects are used to distinguish individual
126 * SPI slaves, and are numbered from zero to num_chipselects. 148 * SPI slaves, and are numbered from zero to num_chipselects.
127 * each slave has a chipselect signal, but it's common that not 149 * each slave has a chipselect signal, but it's common that not
128 * every chipselect is connected to a slave. 150 * every chipselect is connected to a slave.
@@ -275,7 +297,8 @@ struct spi_transfer {
275 * addresses for each transfer buffer 297 * addresses for each transfer buffer
276 * @complete: called to report transaction completions 298 * @complete: called to report transaction completions
277 * @context: the argument to complete() when it's called 299 * @context: the argument to complete() when it's called
278 * @actual_length: how many bytes were transferd 300 * @actual_length: the total number of bytes that were transferred in all
301 * successful segments
279 * @status: zero for success, else negative errno 302 * @status: zero for success, else negative errno
280 * @queue: for use by whichever driver currently owns the message 303 * @queue: for use by whichever driver currently owns the message
281 * @state: for use by whichever driver currently owns the message 304 * @state: for use by whichever driver currently owns the message
@@ -295,7 +318,7 @@ struct spi_message {
295 * 318 *
296 * Some controller drivers (message-at-a-time queue processing) 319 * Some controller drivers (message-at-a-time queue processing)
297 * could provide that as their default scheduling algorithm. But 320 * could provide that as their default scheduling algorithm. But
298 * others (with multi-message pipelines) would need a flag to 321 * others (with multi-message pipelines) could need a flag to
299 * tell them about such special cases. 322 * tell them about such special cases.
300 */ 323 */
301 324
@@ -346,6 +369,13 @@ spi_setup(struct spi_device *spi)
346 * FIFO order, messages may go to different devices in other orders. 369 * FIFO order, messages may go to different devices in other orders.
347 * Some device might be higher priority, or have various "hard" access 370 * Some device might be higher priority, or have various "hard" access
348 * time requirements, for example. 371 * time requirements, for example.
372 *
373 * On detection of any fault during the transfer, processing of
374 * the entire message is aborted, and the device is deselected.
375 * Until returning from the associated message completion callback,
376 * no other spi_message queued to that device will be processed.
377 * (This rule applies equally to all the synchronous transfer calls,
378 * which are wrappers around this core asynchronous primitive.)
349 */ 379 */
350static inline int 380static inline int
351spi_async(struct spi_device *spi, struct spi_message *message) 381spi_async(struct spi_device *spi, struct spi_message *message)
@@ -484,12 +514,12 @@ struct spi_board_info {
484 * "modalias" is normally the driver name. 514 * "modalias" is normally the driver name.
485 * 515 *
486 * platform_data goes to spi_device.dev.platform_data, 516 * platform_data goes to spi_device.dev.platform_data,
487 * controller_data goes to spi_device.platform_data, 517 * controller_data goes to spi_device.controller_data,
488 * irq is copied too 518 * irq is copied too
489 */ 519 */
490 char modalias[KOBJ_NAME_LEN]; 520 char modalias[KOBJ_NAME_LEN];
491 const void *platform_data; 521 const void *platform_data;
492 const void *controller_data; 522 void *controller_data;
493 int irq; 523 int irq;
494 524
495 /* slower signaling on noisy or low voltage boards */ 525 /* slower signaling on noisy or low voltage boards */
@@ -525,9 +555,8 @@ spi_register_board_info(struct spi_board_info const *info, unsigned n)
525 555
526 556
527/* If you're hotplugging an adapter with devices (parport, usb, etc) 557/* If you're hotplugging an adapter with devices (parport, usb, etc)
528 * use spi_new_device() to describe each device. You can also call 558 * use spi_new_device() to describe each device. You would then call
529 * spi_unregister_device() to get start making that device vanish, 559 * spi_unregister_device() to start making that device vanish.
530 * but normally that would be handled by spi_unregister_master().
531 */ 560 */
532extern struct spi_device * 561extern struct spi_device *
533spi_new_device(struct spi_master *, struct spi_board_info *); 562spi_new_device(struct spi_master *, struct spi_board_info *);