Blame view

drivers/spi/spi-bitbang.c 13.1 KB
9904f22a7   David Brownell   [PATCH] spi: add ...
1
  /*
ca632f556   Grant Likely   spi: reorganize d...
2
   * polling/bitbanging SPI master controller driver utilities
9904f22a7   David Brownell   [PATCH] spi: add ...
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
   *
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License as published by
   * the Free Software Foundation; either version 2 of the License, or
   * (at your option) any later version.
   *
   * This program is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU General Public License for more details.
   *
   * You should have received a copy of the GNU General Public License
   * along with this program; if not, write to the Free Software
   * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   */
9904f22a7   David Brownell   [PATCH] spi: add ...
18
19
20
21
  #include <linux/init.h>
  #include <linux/spinlock.h>
  #include <linux/workqueue.h>
  #include <linux/interrupt.h>
d7614de42   Paul Gortmaker   spi: Add module.h...
22
  #include <linux/module.h>
9904f22a7   David Brownell   [PATCH] spi: add ...
23
24
25
  #include <linux/delay.h>
  #include <linux/errno.h>
  #include <linux/platform_device.h>
5a0e3ad6a   Tejun Heo   include cleanup: ...
26
  #include <linux/slab.h>
9904f22a7   David Brownell   [PATCH] spi: add ...
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
  
  #include <linux/spi/spi.h>
  #include <linux/spi/spi_bitbang.h>
  
  
  /*----------------------------------------------------------------------*/
  
  /*
   * FIRST PART (OPTIONAL):  word-at-a-time spi_transfer support.
   * Use this for GPIO or shift-register level hardware APIs.
   *
   * spi_bitbang_cs is in spi_device->controller_state, which is unavailable
   * to glue code.  These bitbang setup() and cleanup() routines are always
   * used, though maybe they're called from controller-aware code.
   *
   * chipselect() and friends may use use spi_device->controller_data and
   * controller registers as appropriate.
   *
   *
   * NOTE:  SPI controller pins can often be used as GPIO pins instead,
   * which means you could use a bitbang driver either to get hardware
   * working quickly, or testing for differences that aren't speed related.
   */
  
  struct spi_bitbang_cs {
  	unsigned	nsecs;	/* (clock cycle time)/2 */
  	u32		(*txrx_word)(struct spi_device *spi, unsigned nsecs,
  					u32 word, u8 bits);
  	unsigned	(*txrx_bufs)(struct spi_device *,
  					u32 (*txrx_word)(
  						struct spi_device *spi,
  						unsigned nsecs,
  						u32 word, u8 bits),
  					unsigned, struct spi_transfer *);
  };
  
  static unsigned bitbang_txrx_8(
  	struct spi_device	*spi,
  	u32			(*txrx_word)(struct spi_device *spi,
  					unsigned nsecs,
  					u32 word, u8 bits),
  	unsigned		ns,
  	struct spi_transfer	*t
  ) {
8c9926843   Anatolij Gustschin   spi/bitbang: init...
71
  	unsigned		bits = t->bits_per_word ? : spi->bits_per_word;
9904f22a7   David Brownell   [PATCH] spi: add ...
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
  	unsigned		count = t->len;
  	const u8		*tx = t->tx_buf;
  	u8			*rx = t->rx_buf;
  
  	while (likely(count > 0)) {
  		u8		word = 0;
  
  		if (tx)
  			word = *tx++;
  		word = txrx_word(spi, ns, word, bits);
  		if (rx)
  			*rx++ = word;
  		count -= 1;
  	}
  	return t->len - count;
  }
  
  static unsigned bitbang_txrx_16(
  	struct spi_device	*spi,
  	u32			(*txrx_word)(struct spi_device *spi,
  					unsigned nsecs,
  					u32 word, u8 bits),
  	unsigned		ns,
  	struct spi_transfer	*t
  ) {
8c9926843   Anatolij Gustschin   spi/bitbang: init...
97
  	unsigned		bits = t->bits_per_word ? : spi->bits_per_word;
9904f22a7   David Brownell   [PATCH] spi: add ...
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
  	unsigned		count = t->len;
  	const u16		*tx = t->tx_buf;
  	u16			*rx = t->rx_buf;
  
  	while (likely(count > 1)) {
  		u16		word = 0;
  
  		if (tx)
  			word = *tx++;
  		word = txrx_word(spi, ns, word, bits);
  		if (rx)
  			*rx++ = word;
  		count -= 2;
  	}
  	return t->len - count;
  }
  
  static unsigned bitbang_txrx_32(
  	struct spi_device	*spi,
  	u32			(*txrx_word)(struct spi_device *spi,
  					unsigned nsecs,
  					u32 word, u8 bits),
  	unsigned		ns,
  	struct spi_transfer	*t
  ) {
8c9926843   Anatolij Gustschin   spi/bitbang: init...
123
  	unsigned		bits = t->bits_per_word ? : spi->bits_per_word;
9904f22a7   David Brownell   [PATCH] spi: add ...
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
  	unsigned		count = t->len;
  	const u32		*tx = t->tx_buf;
  	u32			*rx = t->rx_buf;
  
  	while (likely(count > 3)) {
  		u32		word = 0;
  
  		if (tx)
  			word = *tx++;
  		word = txrx_word(spi, ns, word, bits);
  		if (rx)
  			*rx++ = word;
  		count -= 4;
  	}
  	return t->len - count;
  }
ff9f4771b   Kumar Gala   [PATCH] SPI: Rena...
140
  int spi_bitbang_setup_transfer(struct spi_device *spi, struct spi_transfer *t)
4cff33f94   Imre Deak   [PATCH] SPI: per-...
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
  {
  	struct spi_bitbang_cs	*cs = spi->controller_state;
  	u8			bits_per_word;
  	u32			hz;
  
  	if (t) {
  		bits_per_word = t->bits_per_word;
  		hz = t->speed_hz;
  	} else {
  		bits_per_word = 0;
  		hz = 0;
  	}
  
  	/* spi_transfer level calls that work per-word */
  	if (!bits_per_word)
  		bits_per_word = spi->bits_per_word;
  	if (bits_per_word <= 8)
  		cs->txrx_bufs = bitbang_txrx_8;
  	else if (bits_per_word <= 16)
  		cs->txrx_bufs = bitbang_txrx_16;
  	else if (bits_per_word <= 32)
  		cs->txrx_bufs = bitbang_txrx_32;
  	else
  		return -EINVAL;
  
  	/* nsecs = (clock period)/2 */
  	if (!hz)
  		hz = spi->max_speed_hz;
1e316d756   David Brownell   [PATCH] SPI: spi_...
169
170
171
172
173
  	if (hz) {
  		cs->nsecs = (1000000000/2) / hz;
  		if (cs->nsecs > (MAX_UDELAY_MS * 1000 * 1000))
  			return -EINVAL;
  	}
4cff33f94   Imre Deak   [PATCH] SPI: per-...
174
175
176
  
  	return 0;
  }
ff9f4771b   Kumar Gala   [PATCH] SPI: Rena...
177
  EXPORT_SYMBOL_GPL(spi_bitbang_setup_transfer);
4cff33f94   Imre Deak   [PATCH] SPI: per-...
178

9904f22a7   David Brownell   [PATCH] spi: add ...
179
180
181
182
183
184
185
  /**
   * spi_bitbang_setup - default setup for per-word I/O loops
   */
  int spi_bitbang_setup(struct spi_device *spi)
  {
  	struct spi_bitbang_cs	*cs = spi->controller_state;
  	struct spi_bitbang	*bitbang;
4cff33f94   Imre Deak   [PATCH] SPI: per-...
186
  	int			retval;
d52df2e2e   David Brownell   spi_bitbang: alwa...
187
  	unsigned long		flags;
9904f22a7   David Brownell   [PATCH] spi: add ...
188

ccf77cc4a   David Brownell   [PATCH] SPI: devi...
189
  	bitbang = spi_master_get_devdata(spi->master);
9904f22a7   David Brownell   [PATCH] spi: add ...
190
  	if (!cs) {
e94b17660   Christoph Lameter   [PATCH] slab: rem...
191
  		cs = kzalloc(sizeof *cs, GFP_KERNEL);
9904f22a7   David Brownell   [PATCH] spi: add ...
192
193
194
195
  		if (!cs)
  			return -ENOMEM;
  		spi->controller_state = cs;
  	}
9904f22a7   David Brownell   [PATCH] spi: add ...
196

9904f22a7   David Brownell   [PATCH] spi: add ...
197
198
199
200
  	/* per-word shift register access, in hardware or bitbanging */
  	cs->txrx_word = bitbang->txrx_word[spi->mode & (SPI_CPOL|SPI_CPHA)];
  	if (!cs->txrx_word)
  		return -EINVAL;
7f8c7619e   Hans-Peter Nilsson   [PATCH] spi_bitba...
201
  	retval = bitbang->setup_transfer(spi, NULL);
4cff33f94   Imre Deak   [PATCH] SPI: per-...
202
203
  	if (retval < 0)
  		return retval;
9904f22a7   David Brownell   [PATCH] spi: add ...
204

7d0771970   David Brownell   spi: move common ...
205
206
  	dev_dbg(&spi->dev, "%s, %u nsec/bit
  ", __func__, 2 * cs->nsecs);
9904f22a7   David Brownell   [PATCH] spi: add ...
207
208
209
210
211
212
213
  
  	/* NOTE we _need_ to call chipselect() early, ideally with adapter
  	 * setup, unless the hardware defaults cooperate to avoid confusion
  	 * between normal (active low) and inverted chipselects.
  	 */
  
  	/* deselect chip (low or high) */
d52df2e2e   David Brownell   spi_bitbang: alwa...
214
  	spin_lock_irqsave(&bitbang->lock, flags);
9904f22a7   David Brownell   [PATCH] spi: add ...
215
  	if (!bitbang->busy) {
8275c642c   Vitaly Wool   [PATCH] spi: use ...
216
  		bitbang->chipselect(spi, BITBANG_CS_INACTIVE);
9904f22a7   David Brownell   [PATCH] spi: add ...
217
218
  		ndelay(cs->nsecs);
  	}
d52df2e2e   David Brownell   spi_bitbang: alwa...
219
  	spin_unlock_irqrestore(&bitbang->lock, flags);
9904f22a7   David Brownell   [PATCH] spi: add ...
220
221
222
223
224
225
226
227
  
  	return 0;
  }
  EXPORT_SYMBOL_GPL(spi_bitbang_setup);
  
  /**
   * spi_bitbang_cleanup - default cleanup for per-word I/O loops
   */
0ffa02850   Hans-Peter Nilsson   [PATCH] SPI clean...
228
  void spi_bitbang_cleanup(struct spi_device *spi)
9904f22a7   David Brownell   [PATCH] spi: add ...
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
  {
  	kfree(spi->controller_state);
  }
  EXPORT_SYMBOL_GPL(spi_bitbang_cleanup);
  
  static int spi_bitbang_bufs(struct spi_device *spi, struct spi_transfer *t)
  {
  	struct spi_bitbang_cs	*cs = spi->controller_state;
  	unsigned		nsecs = cs->nsecs;
  
  	return cs->txrx_bufs(spi, cs->txrx_word, nsecs, t);
  }
  
  /*----------------------------------------------------------------------*/
  
  /*
   * SECOND PART ... simple transfer queue runner.
   *
   * This costs a task context per controller, running the queue by
   * performing each transfer in sequence.  Smarter hardware can queue
   * several DMA transfers at once, and process several controller queues
   * in parallel; this driver doesn't match such hardware very well.
   *
   * Drivers can provide word-at-a-time i/o primitives, or provide
   * transfer-at-a-time ones to leverage dma or fifo hardware.
   */
c4028958b   David Howells   WorkStruct: make ...
255
  static void bitbang_work(struct work_struct *work)
9904f22a7   David Brownell   [PATCH] spi: add ...
256
  {
c4028958b   David Howells   WorkStruct: make ...
257
258
  	struct spi_bitbang	*bitbang =
  		container_of(work, struct spi_bitbang, work);
9904f22a7   David Brownell   [PATCH] spi: add ...
259
260
261
262
263
264
265
266
  	unsigned long		flags;
  
  	spin_lock_irqsave(&bitbang->lock, flags);
  	bitbang->busy = 1;
  	while (!list_empty(&bitbang->queue)) {
  		struct spi_message	*m;
  		struct spi_device	*spi;
  		unsigned		nsecs;
8275c642c   Vitaly Wool   [PATCH] spi: use ...
267
  		struct spi_transfer	*t = NULL;
9904f22a7   David Brownell   [PATCH] spi: add ...
268
  		unsigned		tmp;
8275c642c   Vitaly Wool   [PATCH] spi: use ...
269
  		unsigned		cs_change;
9904f22a7   David Brownell   [PATCH] spi: add ...
270
  		int			status;
b8f2e7bb6   Brian Niebuhr   spi/bitbang: rein...
271
  		int			do_setup = -1;
9904f22a7   David Brownell   [PATCH] spi: add ...
272
273
274
275
276
  
  		m = container_of(bitbang->queue.next, struct spi_message,
  				queue);
  		list_del_init(&m->queue);
  		spin_unlock_irqrestore(&bitbang->lock, flags);
8275c642c   Vitaly Wool   [PATCH] spi: use ...
277
278
279
280
281
  		/* FIXME this is made-up ... the correct value is known to
  		 * word-at-a-time bitbang code, and presumably chipselect()
  		 * should enforce these requirements too?
  		 */
  		nsecs = 100;
9904f22a7   David Brownell   [PATCH] spi: add ...
282
283
  
  		spi = m->spi;
9904f22a7   David Brownell   [PATCH] spi: add ...
284
  		tmp = 0;
8275c642c   Vitaly Wool   [PATCH] spi: use ...
285
  		cs_change = 1;
9904f22a7   David Brownell   [PATCH] spi: add ...
286
  		status = 0;
8275c642c   Vitaly Wool   [PATCH] spi: use ...
287
  		list_for_each_entry (t, &m->transfers, transfer_list) {
9904f22a7   David Brownell   [PATCH] spi: add ...
288

529ba0d96   David Brownell   spi: bitbang bugf...
289
290
291
292
293
294
  			/* override speed or wordsize? */
  			if (t->speed_hz || t->bits_per_word)
  				do_setup = 1;
  
  			/* init (-1) or override (1) transfer params */
  			if (do_setup != 0) {
ea3065df7   Sascha Hauer   spi/bitbang: chec...
295
  				status = bitbang->setup_transfer(spi, t);
4cff33f94   Imre Deak   [PATCH] SPI: per-...
296
297
  				if (status < 0)
  					break;
b8f2e7bb6   Brian Niebuhr   spi/bitbang: rein...
298
299
  				if (do_setup == -1)
  					do_setup = 0;
4cff33f94   Imre Deak   [PATCH] SPI: per-...
300
  			}
8275c642c   Vitaly Wool   [PATCH] spi: use ...
301
302
303
304
305
306
307
308
  			/* set up default clock polarity, and activate chip;
  			 * this implicitly updates clock and spi modes as
  			 * previously recorded for this device via setup().
  			 * (and also deselects any other chip that might be
  			 * selected ...)
  			 */
  			if (cs_change) {
  				bitbang->chipselect(spi, BITBANG_CS_ACTIVE);
9904f22a7   David Brownell   [PATCH] spi: add ...
309
310
  				ndelay(nsecs);
  			}
8275c642c   Vitaly Wool   [PATCH] spi: use ...
311
  			cs_change = t->cs_change;
9904f22a7   David Brownell   [PATCH] spi: add ...
312
313
314
315
  			if (!t->tx_buf && !t->rx_buf && t->len) {
  				status = -EINVAL;
  				break;
  			}
8275c642c   Vitaly Wool   [PATCH] spi: use ...
316
317
318
319
  			/* transfer data.  the lower level code handles any
  			 * new dma mappings it needs. our caller always gave
  			 * us dma-safe buffers.
  			 */
9904f22a7   David Brownell   [PATCH] spi: add ...
320
  			if (t->len) {
8275c642c   Vitaly Wool   [PATCH] spi: use ...
321
322
  				/* REVISIT dma API still needs a designated
  				 * DMA_ADDR_INVALID; ~0 might be better.
9904f22a7   David Brownell   [PATCH] spi: add ...
323
  				 */
8275c642c   Vitaly Wool   [PATCH] spi: use ...
324
325
  				if (!m->is_dma_mapped)
  					t->rx_dma = t->tx_dma = 0;
9904f22a7   David Brownell   [PATCH] spi: add ...
326
327
  				status = bitbang->txrx_bufs(spi, t);
  			}
2cfb8ce8c   Jan Nikitenko   spi_bitbang: shor...
328
329
  			if (status > 0)
  				m->actual_length += status;
9904f22a7   David Brownell   [PATCH] spi: add ...
330
  			if (status != t->len) {
2cfb8ce8c   Jan Nikitenko   spi_bitbang: shor...
331
332
333
  				/* always report some kind of error */
  				if (status >= 0)
  					status = -EREMOTEIO;
9904f22a7   David Brownell   [PATCH] spi: add ...
334
335
  				break;
  			}
9904f22a7   David Brownell   [PATCH] spi: add ...
336
337
338
339
340
  			status = 0;
  
  			/* protocol tweaks before next transfer */
  			if (t->delay_usecs)
  				udelay(t->delay_usecs);
8275c642c   Vitaly Wool   [PATCH] spi: use ...
341
  			if (!cs_change)
9904f22a7   David Brownell   [PATCH] spi: add ...
342
  				continue;
8275c642c   Vitaly Wool   [PATCH] spi: use ...
343
344
  			if (t->transfer_list.next == &m->transfers)
  				break;
9904f22a7   David Brownell   [PATCH] spi: add ...
345

8275c642c   Vitaly Wool   [PATCH] spi: use ...
346
347
348
349
350
351
  			/* sometimes a short mid-message deselect of the chip
  			 * may be needed to terminate a mode or command
  			 */
  			ndelay(nsecs);
  			bitbang->chipselect(spi, BITBANG_CS_INACTIVE);
  			ndelay(nsecs);
9904f22a7   David Brownell   [PATCH] spi: add ...
352
  		}
9904f22a7   David Brownell   [PATCH] spi: add ...
353
354
  		m->status = status;
  		m->complete(m->context);
8275c642c   Vitaly Wool   [PATCH] spi: use ...
355
356
357
358
359
360
361
362
363
  		/* normally deactivate chipselect ... unless no error and
  		 * cs_change has hinted that the next message will probably
  		 * be for this chip too.
  		 */
  		if (!(status == 0 && cs_change)) {
  			ndelay(nsecs);
  			bitbang->chipselect(spi, BITBANG_CS_INACTIVE);
  			ndelay(nsecs);
  		}
9904f22a7   David Brownell   [PATCH] spi: add ...
364
365
366
367
368
369
370
371
372
373
374
375
376
377
  
  		spin_lock_irqsave(&bitbang->lock, flags);
  	}
  	bitbang->busy = 0;
  	spin_unlock_irqrestore(&bitbang->lock, flags);
  }
  
  /**
   * spi_bitbang_transfer - default submit to transfer queue
   */
  int spi_bitbang_transfer(struct spi_device *spi, struct spi_message *m)
  {
  	struct spi_bitbang	*bitbang;
  	unsigned long		flags;
1e316d756   David Brownell   [PATCH] SPI: spi_...
378
  	int			status = 0;
9904f22a7   David Brownell   [PATCH] spi: add ...
379
380
381
382
383
  
  	m->actual_length = 0;
  	m->status = -EINPROGRESS;
  
  	bitbang = spi_master_get_devdata(spi->master);
9904f22a7   David Brownell   [PATCH] spi: add ...
384
385
  
  	spin_lock_irqsave(&bitbang->lock, flags);
1e316d756   David Brownell   [PATCH] SPI: spi_...
386
387
388
389
390
391
  	if (!spi->max_speed_hz)
  		status = -ENETDOWN;
  	else {
  		list_add_tail(&m->queue, &bitbang->queue);
  		queue_work(bitbang->workqueue, &bitbang->work);
  	}
9904f22a7   David Brownell   [PATCH] spi: add ...
392
  	spin_unlock_irqrestore(&bitbang->lock, flags);
1e316d756   David Brownell   [PATCH] SPI: spi_...
393
  	return status;
9904f22a7   David Brownell   [PATCH] spi: add ...
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
  }
  EXPORT_SYMBOL_GPL(spi_bitbang_transfer);
  
  /*----------------------------------------------------------------------*/
  
  /**
   * spi_bitbang_start - start up a polled/bitbanging SPI master driver
   * @bitbang: driver handle
   *
   * Caller should have zero-initialized all parts of the structure, and then
   * provided callbacks for chip selection and I/O loops.  If the master has
   * a transfer method, its final step should call spi_bitbang_transfer; or,
   * that's the default if the transfer routine is not initialized.  It should
   * also set up the bus number and number of chipselects.
   *
   * For i/o loops, provide callbacks either per-word (for bitbanging, or for
   * hardware that basically exposes a shift register) or per-spi_transfer
   * (which takes better advantage of hardware like fifos or DMA engines).
   *
7f8c7619e   Hans-Peter Nilsson   [PATCH] spi_bitba...
413
414
415
416
   * Drivers using per-word I/O loops should use (or call) spi_bitbang_setup,
   * spi_bitbang_cleanup and spi_bitbang_setup_transfer to handle those spi
   * master methods.  Those methods are the defaults if the bitbang->txrx_bufs
   * routine isn't initialized.
9904f22a7   David Brownell   [PATCH] spi: add ...
417
418
419
420
421
422
423
424
425
426
427
   *
   * This routine registers the spi_master, which will process requests in a
   * dedicated task, keeping IRQs unblocked most of the time.  To stop
   * processing those requests, call spi_bitbang_stop().
   */
  int spi_bitbang_start(struct spi_bitbang *bitbang)
  {
  	int	status;
  
  	if (!bitbang->master || !bitbang->chipselect)
  		return -EINVAL;
c4028958b   David Howells   WorkStruct: make ...
428
  	INIT_WORK(&bitbang->work, bitbang_work);
9904f22a7   David Brownell   [PATCH] spi: add ...
429
430
  	spin_lock_init(&bitbang->lock);
  	INIT_LIST_HEAD(&bitbang->queue);
e7db06b5d   David Brownell   spi: move more sp...
431
432
  	if (!bitbang->master->mode_bits)
  		bitbang->master->mode_bits = SPI_CPOL | SPI_CPHA | bitbang->flags;
9904f22a7   David Brownell   [PATCH] spi: add ...
433
434
435
436
437
438
  	if (!bitbang->master->transfer)
  		bitbang->master->transfer = spi_bitbang_transfer;
  	if (!bitbang->txrx_bufs) {
  		bitbang->use_dma = 0;
  		bitbang->txrx_bufs = spi_bitbang_bufs;
  		if (!bitbang->master->setup) {
ff9f4771b   Kumar Gala   [PATCH] SPI: Rena...
439
440
441
  			if (!bitbang->setup_transfer)
  				bitbang->setup_transfer =
  					 spi_bitbang_setup_transfer;
9904f22a7   David Brownell   [PATCH] spi: add ...
442
443
444
445
446
  			bitbang->master->setup = spi_bitbang_setup;
  			bitbang->master->cleanup = spi_bitbang_cleanup;
  		}
  	} else if (!bitbang->master->setup)
  		return -EINVAL;
ea3065df7   Sascha Hauer   spi/bitbang: chec...
447
448
449
  	if (bitbang->master->transfer == spi_bitbang_transfer &&
  			!bitbang->setup_transfer)
  		return -EINVAL;
9904f22a7   David Brownell   [PATCH] spi: add ...
450
451
452
453
  
  	/* this task is the only thing to touch the SPI bits */
  	bitbang->busy = 0;
  	bitbang->workqueue = create_singlethread_workqueue(
35f74fcab   Kay Sievers   spi: struct devic...
454
  			dev_name(bitbang->master->dev.parent));
9904f22a7   David Brownell   [PATCH] spi: add ...
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
  	if (bitbang->workqueue == NULL) {
  		status = -EBUSY;
  		goto err1;
  	}
  
  	/* driver may get busy before register() returns, especially
  	 * if someone registered boardinfo for devices
  	 */
  	status = spi_register_master(bitbang->master);
  	if (status < 0)
  		goto err2;
  
  	return status;
  
  err2:
  	destroy_workqueue(bitbang->workqueue);
  err1:
  	return status;
  }
  EXPORT_SYMBOL_GPL(spi_bitbang_start);
  
  /**
   * spi_bitbang_stop - stops the task providing spi communication
   */
  int spi_bitbang_stop(struct spi_bitbang *bitbang)
  {
a836f5856   Chris Lesiak   [PATCH] spi: dest...
481
  	spi_unregister_master(bitbang->master);
9904f22a7   David Brownell   [PATCH] spi: add ...
482

a836f5856   Chris Lesiak   [PATCH] spi: dest...
483
  	WARN_ON(!list_empty(&bitbang->queue));
9904f22a7   David Brownell   [PATCH] spi: add ...
484
485
  
  	destroy_workqueue(bitbang->workqueue);
9904f22a7   David Brownell   [PATCH] spi: add ...
486
487
488
489
490
  	return 0;
  }
  EXPORT_SYMBOL_GPL(spi_bitbang_stop);
  
  MODULE_LICENSE("GPL");