Skip to content

Commit 2025172

Browse files
committed
spi/bitbang: Use core message pump
Convert drivers using bitbang to use the core mesasge pump infrastructure, saving some code and meaning that these drivers get to take advantage of work done on improving the core implementation. Signed-off-by: Mark Brown <broonie@linaro.org>
1 parent 91b3085 commit 2025172

File tree

2 files changed

+30
-74
lines changed

2 files changed

+30
-74
lines changed

drivers/spi/spi-bitbang.c

Lines changed: 30 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,21 @@ static int spi_bitbang_bufs(struct spi_device *spi, struct spi_transfer *t)
255255
* Drivers can provide word-at-a-time i/o primitives, or provide
256256
* transfer-at-a-time ones to leverage dma or fifo hardware.
257257
*/
258+
259+
static int spi_bitbang_prepare_hardware(struct spi_master *spi)
260+
{
261+
struct spi_bitbang *bitbang;
262+
unsigned long flags;
263+
264+
bitbang = spi_master_get_devdata(spi);
265+
266+
spin_lock_irqsave(&bitbang->lock, flags);
267+
bitbang->busy = 1;
268+
spin_unlock_irqrestore(&bitbang->lock, flags);
269+
270+
return 0;
271+
}
272+
258273
static int spi_bitbang_transfer_one(struct spi_device *spi,
259274
struct spi_message *m)
260275
{
@@ -346,7 +361,6 @@ static int spi_bitbang_transfer_one(struct spi_device *spi,
346361
}
347362

348363
m->status = status;
349-
m->complete(m->context);
350364

351365
/* normally deactivate chipselect ... unless no error and
352366
* cs_change has hinted that the next message will probably
@@ -358,54 +372,23 @@ static int spi_bitbang_transfer_one(struct spi_device *spi,
358372
ndelay(nsecs);
359373
}
360374

361-
return status;
362-
}
363-
364-
static void bitbang_work(struct work_struct *work)
365-
{
366-
struct spi_bitbang *bitbang =
367-
container_of(work, struct spi_bitbang, work);
368-
unsigned long flags;
369-
struct spi_message *m, *_m;
370-
371-
spin_lock_irqsave(&bitbang->lock, flags);
372-
bitbang->busy = 1;
373-
list_for_each_entry_safe(m, _m, &bitbang->queue, queue) {
374-
list_del(&m->queue);
375-
spin_unlock_irqrestore(&bitbang->lock, flags);
376-
377-
spi_bitbang_transfer_one(m->spi, m);
375+
spi_finalize_current_message(spi->master);
378376

379-
spin_lock_irqsave(&bitbang->lock, flags);
380-
}
381-
bitbang->busy = 0;
382-
spin_unlock_irqrestore(&bitbang->lock, flags);
377+
return status;
383378
}
384379

385-
/**
386-
* spi_bitbang_transfer - default submit to transfer queue
387-
*/
388-
static int spi_bitbang_transfer(struct spi_device *spi, struct spi_message *m)
380+
static int spi_bitbang_unprepare_hardware(struct spi_master *spi)
389381
{
390-
struct spi_bitbang *bitbang;
382+
struct spi_bitbang *bitbang;
391383
unsigned long flags;
392-
int status = 0;
393-
394-
m->actual_length = 0;
395-
m->status = -EINPROGRESS;
396384

397-
bitbang = spi_master_get_devdata(spi->master);
385+
bitbang = spi_master_get_devdata(spi);
398386

399387
spin_lock_irqsave(&bitbang->lock, flags);
400-
if (!spi->max_speed_hz)
401-
status = -ENETDOWN;
402-
else {
403-
list_add_tail(&m->queue, &bitbang->queue);
404-
queue_work(bitbang->workqueue, &bitbang->work);
405-
}
388+
bitbang->busy = 0;
406389
spin_unlock_irqrestore(&bitbang->lock, flags);
407390

408-
return status;
391+
return 0;
409392
}
410393

411394
/*----------------------------------------------------------------------*/
@@ -436,20 +419,22 @@ static int spi_bitbang_transfer(struct spi_device *spi, struct spi_message *m)
436419
int spi_bitbang_start(struct spi_bitbang *bitbang)
437420
{
438421
struct spi_master *master = bitbang->master;
439-
int status;
440422

441423
if (!master || !bitbang->chipselect)
442424
return -EINVAL;
443425

444-
INIT_WORK(&bitbang->work, bitbang_work);
445426
spin_lock_init(&bitbang->lock);
446-
INIT_LIST_HEAD(&bitbang->queue);
447427

448428
if (!master->mode_bits)
449429
master->mode_bits = SPI_CPOL | SPI_CPHA | bitbang->flags;
450430

451-
if (!master->transfer)
452-
master->transfer = spi_bitbang_transfer;
431+
if (master->transfer || master->transfer_one_message)
432+
return -EINVAL;
433+
434+
master->prepare_transfer_hardware = spi_bitbang_prepare_hardware;
435+
master->unprepare_transfer_hardware = spi_bitbang_unprepare_hardware;
436+
master->transfer_one_message = spi_bitbang_transfer_one;
437+
453438
if (!bitbang->txrx_bufs) {
454439
bitbang->use_dma = 0;
455440
bitbang->txrx_bufs = spi_bitbang_bufs;
@@ -462,32 +447,11 @@ int spi_bitbang_start(struct spi_bitbang *bitbang)
462447
}
463448
} else if (!master->setup)
464449
return -EINVAL;
465-
if (master->transfer == spi_bitbang_transfer &&
466-
!bitbang->setup_transfer)
467-
return -EINVAL;
468-
469-
/* this task is the only thing to touch the SPI bits */
470-
bitbang->busy = 0;
471-
bitbang->workqueue = create_singlethread_workqueue(
472-
dev_name(master->dev.parent));
473-
if (bitbang->workqueue == NULL) {
474-
status = -EBUSY;
475-
goto err1;
476-
}
477450

478451
/* driver may get busy before register() returns, especially
479452
* if someone registered boardinfo for devices
480453
*/
481-
status = spi_register_master(master);
482-
if (status < 0)
483-
goto err2;
484-
485-
return status;
486-
487-
err2:
488-
destroy_workqueue(bitbang->workqueue);
489-
err1:
490-
return status;
454+
return spi_register_master(master);
491455
}
492456
EXPORT_SYMBOL_GPL(spi_bitbang_start);
493457

@@ -498,10 +462,6 @@ int spi_bitbang_stop(struct spi_bitbang *bitbang)
498462
{
499463
spi_unregister_master(bitbang->master);
500464

501-
WARN_ON(!list_empty(&bitbang->queue));
502-
503-
destroy_workqueue(bitbang->workqueue);
504-
505465
return 0;
506466
}
507467
EXPORT_SYMBOL_GPL(spi_bitbang_stop);

include/linux/spi/spi_bitbang.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,7 @@
44
#include <linux/workqueue.h>
55

66
struct spi_bitbang {
7-
struct workqueue_struct *workqueue;
8-
struct work_struct work;
9-
107
spinlock_t lock;
11-
struct list_head queue;
128
u8 busy;
139
u8 use_dma;
1410
u8 flags; /* extra spi->mode support */

0 commit comments

Comments
 (0)