Re: [PATCH v3 03/10] spi/pxa2xx: convert to the pump message infrastructure
On Tue, Jan 22, 2013 at 12:26:26PM +0200, Mika Westerberg wrote: > The SPI core provides infrastructure for standard message queueing so use > that instead of handling everything in the driver. This simplifies the > driver. Applied, thanks. signature.asc Description: Digital signature
Re: [PATCH v3 03/10] spi/pxa2xx: convert to the pump message infrastructure
On Tue, Jan 22, 2013 at 12:26:26PM +0200, Mika Westerberg wrote: The SPI core provides infrastructure for standard message queueing so use that instead of handling everything in the driver. This simplifies the driver. Applied, thanks. signature.asc Description: Digital signature
[PATCH v3 03/10] spi/pxa2xx: convert to the pump message infrastructure
The SPI core provides infrastructure for standard message queueing so use that instead of handling everything in the driver. This simplifies the driver. Signed-off-by: Mika Westerberg Acked-by: Linus Walleij --- drivers/spi/spi-pxa2xx.c | 212 +++--- 1 file changed, 12 insertions(+), 200 deletions(-) diff --git a/drivers/spi/spi-pxa2xx.c b/drivers/spi/spi-pxa2xx.c index ef0a786..a241891 100644 --- a/drivers/spi/spi-pxa2xx.c +++ b/drivers/spi/spi-pxa2xx.c @@ -85,9 +85,6 @@ DEFINE_SSP_REG(SSPSP, 0x2c) #define DONE_STATE ((void*)2) #define ERROR_STATE ((void*)-1) -#define QUEUE_RUNNING 0 -#define QUEUE_STOPPED 1 - struct driver_data { /* Driver model hookup */ struct platform_device *pdev; @@ -117,14 +114,6 @@ struct driver_data { u32 clear_sr; u32 mask_sr; - /* Driver message queue */ - struct workqueue_struct *workqueue; - struct work_struct pump_messages; - spinlock_t lock; - struct list_head queue; - int busy; - int run; - /* Message Transfer pump */ struct tasklet_struct pump_transfers; @@ -173,8 +162,6 @@ struct chip_data { void (*cs_control)(u32 command); }; -static void pump_messages(struct work_struct *work); - static void cs_assert(struct driver_data *drv_data) { struct chip_data *chip = drv_data->cur_chip; @@ -444,15 +431,11 @@ static void unmap_dma_buffers(struct driver_data *drv_data) static void giveback(struct driver_data *drv_data) { struct spi_transfer* last_transfer; - unsigned long flags; struct spi_message *msg; - spin_lock_irqsave(_data->lock, flags); msg = drv_data->cur_msg; drv_data->cur_msg = NULL; drv_data->cur_transfer = NULL; - queue_work(drv_data->workqueue, _data->pump_messages); - spin_unlock_irqrestore(_data->lock, flags); last_transfer = list_entry(msg->transfers.prev, struct spi_transfer, @@ -481,13 +464,7 @@ static void giveback(struct driver_data *drv_data) */ /* get a pointer to the next message, if any */ - spin_lock_irqsave(_data->lock, flags); - if (list_empty(_data->queue)) - next_msg = NULL; - else - next_msg = list_entry(drv_data->queue.next, - struct spi_message, queue); - spin_unlock_irqrestore(_data->lock, flags); + next_msg = spi_get_next_queued_message(drv_data->master); /* see if the next and current messages point * to the same chip @@ -498,10 +475,7 @@ static void giveback(struct driver_data *drv_data) cs_deassert(drv_data); } - msg->state = NULL; - if (msg->complete) - msg->complete(msg->context); - + spi_finalize_current_message(drv_data->master); drv_data->cur_chip = NULL; } @@ -1176,31 +1150,12 @@ static void pump_transfers(unsigned long data) write_SSCR1(cr1, reg); } -static void pump_messages(struct work_struct *work) +static int pxa2xx_spi_transfer_one_message(struct spi_master *master, + struct spi_message *msg) { - struct driver_data *drv_data = - container_of(work, struct driver_data, pump_messages); - unsigned long flags; - - /* Lock queue and check for queue work */ - spin_lock_irqsave(_data->lock, flags); - if (list_empty(_data->queue) || drv_data->run == QUEUE_STOPPED) { - drv_data->busy = 0; - spin_unlock_irqrestore(_data->lock, flags); - return; - } - - /* Make sure we are not already running a message */ - if (drv_data->cur_msg) { - spin_unlock_irqrestore(_data->lock, flags); - return; - } - - /* Extract head of queue */ - drv_data->cur_msg = list_entry(drv_data->queue.next, - struct spi_message, queue); - list_del_init(_data->cur_msg->queue); + struct driver_data *drv_data = spi_master_get_devdata(master); + drv_data->cur_msg = msg; /* Initial message state*/ drv_data->cur_msg->state = START_STATE; drv_data->cur_transfer = list_entry(drv_data->cur_msg->transfers.next, @@ -1213,34 +1168,6 @@ static void pump_messages(struct work_struct *work) /* Mark as busy and launch transfers */ tasklet_schedule(_data->pump_transfers); - - drv_data->busy = 1; - spin_unlock_irqrestore(_data->lock, flags); -} - -static int transfer(struct spi_device *spi, struct spi_message *msg) -{ - struct driver_data *drv_data = spi_master_get_devdata(spi->master); - unsigned long flags; - - spin_lock_irqsave(_data->lock, flags); - - if (drv_data->run ==
[PATCH v3 03/10] spi/pxa2xx: convert to the pump message infrastructure
The SPI core provides infrastructure for standard message queueing so use that instead of handling everything in the driver. This simplifies the driver. Signed-off-by: Mika Westerberg mika.westerb...@linux.intel.com Acked-by: Linus Walleij linus.wall...@linaro.org --- drivers/spi/spi-pxa2xx.c | 212 +++--- 1 file changed, 12 insertions(+), 200 deletions(-) diff --git a/drivers/spi/spi-pxa2xx.c b/drivers/spi/spi-pxa2xx.c index ef0a786..a241891 100644 --- a/drivers/spi/spi-pxa2xx.c +++ b/drivers/spi/spi-pxa2xx.c @@ -85,9 +85,6 @@ DEFINE_SSP_REG(SSPSP, 0x2c) #define DONE_STATE ((void*)2) #define ERROR_STATE ((void*)-1) -#define QUEUE_RUNNING 0 -#define QUEUE_STOPPED 1 - struct driver_data { /* Driver model hookup */ struct platform_device *pdev; @@ -117,14 +114,6 @@ struct driver_data { u32 clear_sr; u32 mask_sr; - /* Driver message queue */ - struct workqueue_struct *workqueue; - struct work_struct pump_messages; - spinlock_t lock; - struct list_head queue; - int busy; - int run; - /* Message Transfer pump */ struct tasklet_struct pump_transfers; @@ -173,8 +162,6 @@ struct chip_data { void (*cs_control)(u32 command); }; -static void pump_messages(struct work_struct *work); - static void cs_assert(struct driver_data *drv_data) { struct chip_data *chip = drv_data-cur_chip; @@ -444,15 +431,11 @@ static void unmap_dma_buffers(struct driver_data *drv_data) static void giveback(struct driver_data *drv_data) { struct spi_transfer* last_transfer; - unsigned long flags; struct spi_message *msg; - spin_lock_irqsave(drv_data-lock, flags); msg = drv_data-cur_msg; drv_data-cur_msg = NULL; drv_data-cur_transfer = NULL; - queue_work(drv_data-workqueue, drv_data-pump_messages); - spin_unlock_irqrestore(drv_data-lock, flags); last_transfer = list_entry(msg-transfers.prev, struct spi_transfer, @@ -481,13 +464,7 @@ static void giveback(struct driver_data *drv_data) */ /* get a pointer to the next message, if any */ - spin_lock_irqsave(drv_data-lock, flags); - if (list_empty(drv_data-queue)) - next_msg = NULL; - else - next_msg = list_entry(drv_data-queue.next, - struct spi_message, queue); - spin_unlock_irqrestore(drv_data-lock, flags); + next_msg = spi_get_next_queued_message(drv_data-master); /* see if the next and current messages point * to the same chip @@ -498,10 +475,7 @@ static void giveback(struct driver_data *drv_data) cs_deassert(drv_data); } - msg-state = NULL; - if (msg-complete) - msg-complete(msg-context); - + spi_finalize_current_message(drv_data-master); drv_data-cur_chip = NULL; } @@ -1176,31 +1150,12 @@ static void pump_transfers(unsigned long data) write_SSCR1(cr1, reg); } -static void pump_messages(struct work_struct *work) +static int pxa2xx_spi_transfer_one_message(struct spi_master *master, + struct spi_message *msg) { - struct driver_data *drv_data = - container_of(work, struct driver_data, pump_messages); - unsigned long flags; - - /* Lock queue and check for queue work */ - spin_lock_irqsave(drv_data-lock, flags); - if (list_empty(drv_data-queue) || drv_data-run == QUEUE_STOPPED) { - drv_data-busy = 0; - spin_unlock_irqrestore(drv_data-lock, flags); - return; - } - - /* Make sure we are not already running a message */ - if (drv_data-cur_msg) { - spin_unlock_irqrestore(drv_data-lock, flags); - return; - } - - /* Extract head of queue */ - drv_data-cur_msg = list_entry(drv_data-queue.next, - struct spi_message, queue); - list_del_init(drv_data-cur_msg-queue); + struct driver_data *drv_data = spi_master_get_devdata(master); + drv_data-cur_msg = msg; /* Initial message state*/ drv_data-cur_msg-state = START_STATE; drv_data-cur_transfer = list_entry(drv_data-cur_msg-transfers.next, @@ -1213,34 +1168,6 @@ static void pump_messages(struct work_struct *work) /* Mark as busy and launch transfers */ tasklet_schedule(drv_data-pump_transfers); - - drv_data-busy = 1; - spin_unlock_irqrestore(drv_data-lock, flags); -} - -static int transfer(struct spi_device *spi, struct spi_message *msg) -{ - struct driver_data *drv_data = spi_master_get_devdata(spi-master); - unsigned long flags; - -