[rdc] convert gpio code to use gpiolib, make rdc321x:dmz led work again
[openwrt.git] / target / linux / s3c24xx / patches-2.6.30 / 060-spi-gpio-non-blocking.patch
1 --- a/arch/arm/mach-s3c2410/include/mach/spi-gpio.h
2 +++ b/arch/arm/mach-s3c2410/include/mach/spi-gpio.h
3 @@ -21,7 +21,8 @@ struct s3c2410_spigpio_info {
4 int num_chipselect;
5 int bus_num;
6
7 - void (*chip_select)(struct s3c2410_spigpio_info *spi, int cs);
8 + int non_blocking_transfer;
9 + void (*chip_select)(struct s3c2410_spigpio_info *spi, int csid, int cs);
10 };
11
12
13 --- a/drivers/spi/spi_bitbang.c
14 +++ b/drivers/spi/spi_bitbang.c
15 @@ -264,6 +264,123 @@ static int spi_bitbang_bufs(struct spi_d
16 * Drivers can provide word-at-a-time i/o primitives, or provide
17 * transfer-at-a-time ones to leverage dma or fifo hardware.
18 */
19 +
20 +/* Synchronous non blocking transfer */
21 +int
22 +spi_bitbang_transfer_sync(struct spi_device *spi, struct spi_message *m)
23 +{
24 + struct spi_bitbang *bitbang = spi_master_get_devdata(spi->master);
25 + struct spi_transfer *t;
26 + unsigned long flags;
27 + int cs_change = 1;
28 + int status;
29 + int nsecs;
30 + int (*setup_transfer)(struct spi_device *, struct spi_transfer *);
31 +
32 + /* FIXME this is made-up ... the correct value is known to
33 + * word-at-a-time bitbang code, and presumably chipselect()
34 + * should enforce these requirements too?
35 + */
36 + nsecs = 100;
37 + cs_change = 1;
38 + status = 0;
39 + setup_transfer = NULL;
40 +
41 + local_irq_save(flags);
42 + list_for_each_entry (t, &m->transfers, transfer_list) {
43 + /* override or restore speed and wordsize */
44 + if (t->speed_hz || t->bits_per_word) {
45 + setup_transfer = bitbang->setup_transfer;
46 + if (!setup_transfer) {
47 + status = -ENOPROTOOPT;
48 + break;
49 + }
50 + }
51 + if (setup_transfer) {
52 + status = setup_transfer(spi, t);
53 + if (status < 0)
54 + break;
55 + }
56 +
57 + /* set up default clock polarity, and activate chip;
58 + * this implicitly updates clock and spi modes as
59 + * previously recorded for this device via setup().
60 + * (and also deselects any other chip that might be
61 + * selected ...)
62 + */
63 +
64 + if (cs_change) {
65 + bitbang->chipselect(spi, BITBANG_CS_ACTIVE);
66 + ndelay(nsecs);
67 + }
68 +
69 + cs_change = t->cs_change;
70 + if (!t->tx_buf && !t->rx_buf && t->len) {
71 + status = -EINVAL;
72 + break;
73 + }
74 +
75 + /* transfer data. the lower level code handles any
76 + * new dma mappings it needs. our caller always gave
77 + * us dma-safe buffers.
78 + */
79 + if (t->len) {
80 + /* REVISIT dma API still needs a designated
81 + * DMA_ADDR_INVALID; ~0 might be better.
82 + */
83 + if (!m->is_dma_mapped)
84 + t->rx_dma = t->tx_dma = 0;
85 + status = bitbang->txrx_bufs(spi, t);
86 + }
87 +
88 + if (status > 0)
89 + m->actual_length += status;
90 + if (status != t->len) {
91 + /* always report some kind of error */
92 + if (status >= 0)
93 + status = -EREMOTEIO;
94 + break;
95 + }
96 + status = 0;
97 + /* protocol tweaks before next transfer */
98 + if (t->delay_usecs)
99 + udelay(t->delay_usecs);
100 + if (!cs_change)
101 + continue;
102 + if (t->transfer_list.next == &m->transfers)
103 + break;
104 + /* sometimes a short mid-message deselect of the chip
105 + * may be needed to terminate a mode or command
106 + */
107 + ndelay(nsecs);
108 + bitbang->chipselect(spi, BITBANG_CS_INACTIVE);
109 + ndelay(nsecs);
110 + }
111 +
112 + m->status = status;
113 + if (m->complete)
114 + m->complete(m->context);
115 +
116 + /* restore speed and wordsize */
117 + if (setup_transfer)
118 + setup_transfer(spi, NULL);
119 +
120 + /* normally deactivate chipselect ... unless no error and
121 + * cs_change has hinted that the next message will probably
122 + * be for this chip too.
123 + */
124 + if (!(status == 0 && cs_change)) {
125 + ndelay(nsecs);
126 + bitbang->chipselect(spi, BITBANG_CS_INACTIVE);
127 + ndelay(nsecs);
128 + }
129 +
130 + local_irq_restore(flags);
131 +
132 + return status;
133 +}
134 +EXPORT_SYMBOL_GPL(spi_bitbang_transfer_sync);
135 +
136 static void bitbang_work(struct work_struct *work)
137 {
138 struct spi_bitbang *bitbang =
139 @@ -274,120 +391,13 @@ static void bitbang_work(struct work_str
140 bitbang->busy = 1;
141 while (!list_empty(&bitbang->queue)) {
142 struct spi_message *m;
143 - struct spi_device *spi;
144 - unsigned nsecs;
145 - struct spi_transfer *t = NULL;
146 - unsigned tmp;
147 - unsigned cs_change;
148 - int status;
149 - int (*setup_transfer)(struct spi_device *,
150 - struct spi_transfer *);
151
152 m = container_of(bitbang->queue.next, struct spi_message,
153 queue);
154 list_del_init(&m->queue);
155 - spin_unlock_irqrestore(&bitbang->lock, flags);
156 -
157 - /* FIXME this is made-up ... the correct value is known to
158 - * word-at-a-time bitbang code, and presumably chipselect()
159 - * should enforce these requirements too?
160 - */
161 - nsecs = 100;
162 -
163 - spi = m->spi;
164 - tmp = 0;
165 - cs_change = 1;
166 - status = 0;
167 - setup_transfer = NULL;
168 -
169 - list_for_each_entry (t, &m->transfers, transfer_list) {
170 -
171 - /* override or restore speed and wordsize */
172 - if (t->speed_hz || t->bits_per_word) {
173 - setup_transfer = bitbang->setup_transfer;
174 - if (!setup_transfer) {
175 - status = -ENOPROTOOPT;
176 - break;
177 - }
178 - }
179 - if (setup_transfer) {
180 - status = setup_transfer(spi, t);
181 - if (status < 0)
182 - break;
183 - }
184 -
185 - /* set up default clock polarity, and activate chip;
186 - * this implicitly updates clock and spi modes as
187 - * previously recorded for this device via setup().
188 - * (and also deselects any other chip that might be
189 - * selected ...)
190 - */
191 - if (cs_change) {
192 - bitbang->chipselect(spi, BITBANG_CS_ACTIVE);
193 - ndelay(nsecs);
194 - }
195 - cs_change = t->cs_change;
196 - if (!t->tx_buf && !t->rx_buf && t->len) {
197 - status = -EINVAL;
198 - break;
199 - }
200 -
201 - /* transfer data. the lower level code handles any
202 - * new dma mappings it needs. our caller always gave
203 - * us dma-safe buffers.
204 - */
205 - if (t->len) {
206 - /* REVISIT dma API still needs a designated
207 - * DMA_ADDR_INVALID; ~0 might be better.
208 - */
209 - if (!m->is_dma_mapped)
210 - t->rx_dma = t->tx_dma = 0;
211 - status = bitbang->txrx_bufs(spi, t);
212 - }
213 - if (status > 0)
214 - m->actual_length += status;
215 - if (status != t->len) {
216 - /* always report some kind of error */
217 - if (status >= 0)
218 - status = -EREMOTEIO;
219 - break;
220 - }
221 - status = 0;
222 -
223 - /* protocol tweaks before next transfer */
224 - if (t->delay_usecs)
225 - udelay(t->delay_usecs);
226 -
227 - if (!cs_change)
228 - continue;
229 - if (t->transfer_list.next == &m->transfers)
230 - break;
231 -
232 - /* sometimes a short mid-message deselect of the chip
233 - * may be needed to terminate a mode or command
234 - */
235 - ndelay(nsecs);
236 - bitbang->chipselect(spi, BITBANG_CS_INACTIVE);
237 - ndelay(nsecs);
238 - }
239 -
240 - m->status = status;
241 - m->complete(m->context);
242 -
243 - /* restore speed and wordsize */
244 - if (setup_transfer)
245 - setup_transfer(spi, NULL);
246 -
247 - /* normally deactivate chipselect ... unless no error and
248 - * cs_change has hinted that the next message will probably
249 - * be for this chip too.
250 - */
251 - if (!(status == 0 && cs_change)) {
252 - ndelay(nsecs);
253 - bitbang->chipselect(spi, BITBANG_CS_INACTIVE);
254 - ndelay(nsecs);
255 - }
256
257 + spin_unlock_irqrestore(&bitbang->lock, flags);
258 + spi_bitbang_transfer_sync(m->spi, m);
259 spin_lock_irqsave(&bitbang->lock, flags);
260 }
261 bitbang->busy = 0;
262 @@ -459,6 +469,9 @@ int spi_bitbang_start(struct spi_bitbang
263
264 if (!bitbang->master->transfer)
265 bitbang->master->transfer = spi_bitbang_transfer;
266 + if (!bitbang->master->transfer_sync && bitbang->non_blocking_transfer)
267 + bitbang->master->transfer_sync = spi_bitbang_transfer_sync;
268 +
269 if (!bitbang->txrx_bufs) {
270 bitbang->use_dma = 0;
271 bitbang->txrx_bufs = spi_bitbang_bufs;
272 --- a/drivers/spi/spi_s3c24xx_gpio.c
273 +++ b/drivers/spi/spi_s3c24xx_gpio.c
274 @@ -91,7 +91,7 @@ static void s3c2410_spigpio_chipselect(s
275 struct s3c2410_spigpio *sg = spidev_to_sg(dev);
276
277 if (sg->info && sg->info->chip_select)
278 - (sg->info->chip_select)(sg->info, value);
279 + (sg->info->chip_select)(sg->info, dev->chip_select, value);
280 }
281
282 static int s3c2410_spigpio_probe(struct platform_device *dev)
283 @@ -112,14 +112,17 @@ static int s3c2410_spigpio_probe(struct
284
285 platform_set_drvdata(dev, sp);
286
287 - /* copy in the plkatform data */
288 + /* copy in the platform data */
289 info = sp->info = dev->dev.platform_data;
290
291 + master->num_chipselect = info->num_chipselect;
292 +
293 /* setup spi bitbang adaptor */
294 sp->bitbang.master = spi_master_get(master);
295 sp->bitbang.master->bus_num = info->bus_num;
296 sp->bitbang.master->num_chipselect = info->num_chipselect;
297 sp->bitbang.chipselect = s3c2410_spigpio_chipselect;
298 + sp->bitbang.non_blocking_transfer = info->non_blocking_transfer;
299
300 sp->bitbang.txrx_word[SPI_MODE_0] = s3c2410_spigpio_txrx_mode0;
301 sp->bitbang.txrx_word[SPI_MODE_1] = s3c2410_spigpio_txrx_mode1;
302 --- a/include/linux/mmc/core.h
303 +++ b/include/linux/mmc/core.h
304 @@ -129,6 +129,8 @@ struct mmc_request {
305 struct mmc_host;
306 struct mmc_card;
307
308 +extern void mmc_flush_scheduled_work(void);
309 +
310 extern void mmc_wait_for_req(struct mmc_host *, struct mmc_request *);
311 extern int mmc_wait_for_cmd(struct mmc_host *, struct mmc_command *, int);
312 extern int mmc_wait_for_app_cmd(struct mmc_host *, struct mmc_card *,
313 --- a/include/linux/mmc/sdio_ids.h
314 +++ b/include/linux/mmc/sdio_ids.h
315 @@ -25,5 +25,9 @@
316
317 #define SDIO_VENDOR_ID_MARVELL 0x02df
318 #define SDIO_DEVICE_ID_MARVELL_LIBERTAS 0x9103
319 +#define SDIO_DEVICE_ID_MARVELL_88W8688 0x9104
320 +#define SDIO_VENDOR_ID_ATHEROS 0x0271
321 +#define SDIO_DEVICE_ID_ATHEROS_AR6001 0x0100
322 +#define SDIO_DEVICE_ID_ATHEROS_AR6002 0x0200
323
324 #endif
325 --- a/include/linux/spi/spi_bitbang.h
326 +++ b/include/linux/spi/spi_bitbang.h
327 @@ -31,6 +31,9 @@ struct spi_bitbang {
328 u8 use_dma;
329 u8 flags; /* extra spi->mode support */
330
331 + /* Support for synchronous non blocking transfers */
332 + int non_blocking_transfer;
333 +
334 struct spi_master *master;
335
336 /* setup_transfer() changes clock and/or wordsize to match settings
337 @@ -62,6 +65,8 @@ extern void spi_bitbang_cleanup(struct s
338 extern int spi_bitbang_transfer(struct spi_device *spi, struct spi_message *m);
339 extern int spi_bitbang_setup_transfer(struct spi_device *spi,
340 struct spi_transfer *t);
341 +extern int spi_bitbang_transfer_sync(struct spi_device *spi,
342 + struct spi_message *m);
343
344 /* start or stop queue processing */
345 extern int spi_bitbang_start(struct spi_bitbang *spi);
346 --- a/include/linux/spi/spi.h
347 +++ b/include/linux/spi/spi.h
348 @@ -204,7 +204,6 @@ static inline void spi_unregister_driver
349 * SPI slaves, and are numbered from zero to num_chipselects.
350 * each slave has a chipselect signal, but it's common that not
351 * every chipselect is connected to a slave.
352 - * @dma_alignment: SPI controller constraint on DMA buffers alignment.
353 * @setup: updates the device mode and clocking records used by a
354 * device's SPI controller; protocol code may call this. This
355 * must fail if an unrecognized or unsupported mode is requested.
356 @@ -240,17 +239,7 @@ struct spi_master {
357 */
358 u16 num_chipselect;
359
360 - /* some SPI controllers pose alignment requirements on DMAable
361 - * buffers; let protocol drivers know about these requirements.
362 - */
363 - u16 dma_alignment;
364 -
365 - /* Setup mode and clock, etc (spi driver may call many times).
366 - *
367 - * IMPORTANT: this may be called when transfers to another
368 - * device are active. DO NOT UPDATE SHARED REGISTERS in ways
369 - * which could break those transfers.
370 - */
371 + /* setup mode and clock, etc (spi driver may call many times) */
372 int (*setup)(struct spi_device *spi);
373
374 /* bidirectional bulk transfers
375 @@ -275,6 +264,13 @@ struct spi_master {
376 int (*transfer)(struct spi_device *spi,
377 struct spi_message *mesg);
378
379 + /*
380 + * Synchronous non blocking transfer function. Should guarantee
381 + * data availability when it returns
382 + */
383 + int (*transfer_sync)(struct spi_device *spi,
384 + struct spi_message *mesg);
385 +
386 /* called on release() to free memory provided by spi_master */
387 void (*cleanup)(struct spi_device *spi);
388 };
389 @@ -584,6 +580,29 @@ spi_async(struct spi_device *spi, struct
390 return spi->master->transfer(spi, message);
391 }
392
393 +/**
394 + * spi_non_blocking_transfer - Synchronous, non blocking transfer
395 + * @spi: device with which data will be exchanged
396 + * @message: describes the data transfers with optional completion handlers
397 + * Context: any (irqs may be blocked, etc)
398 + *
399 + * Data is guaranteed to be written or read when this function returns.
400 + *
401 + * Note : This may not be supported by all spi masters.
402 + */
403 +
404 +static inline int
405 +spi_non_blocking_transfer(struct spi_device *spi, struct spi_message *message)
406 +{
407 + if (unlikely(!spi->master->transfer_sync)) {
408 + dev_err(&spi->master->dev,
409 + "non-blocking transfers not supported\n");
410 + return -EIO;
411 + }
412 +
413 + return spi->master->transfer_sync(spi, message);
414 +}
415 +
416 /*---------------------------------------------------------------------------*/
417
418 /* All these synchronous SPI transfer routines are utilities layered
This page took 0.07031 seconds and 5 git commands to generate.