goldfish: R.I.P.
[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