Re: [PATCH v3 03/10] spi/pxa2xx: convert to the pump message infrastructure

2013-01-25 Thread Mark Brown
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

2013-01-25 Thread Mark Brown
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

2013-01-22 Thread Mika Westerberg
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

2013-01-22 Thread Mika Westerberg
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;
-
-