[APPLIED] [PATCH 10/10] omap mailbox: OMAP4 Mailbox-driver Patch to support tasklet implementation

2009-11-17 Thread Tony Lindgren
This patch has been applied to the linux-omap
by youw fwiendly patch wobot.

Branch in linux-omap: for-next

Initial commit ID (Likely to change): 02a9bc601402df9544f35820fbef72c1b096344c

PatchWorks
http://patchwork.kernel.org/patch/59793/

Git (Likely to change, and takes a while to get mirrored)
http://git.kernel.org/?p=linux/kernel/git/tmlind/linux-omap-2.6.git;a=commit;h=02a9bc601402df9544f35820fbef72c1b096344c


--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 10/10] omap mailbox: OMAP4 Mailbox-driver Patch to support tasklet implementation

2009-11-13 Thread C.A, Subramaniam
From 5fd7c2bfae11879edfcae7db073deb11bea1f584 Mon Sep 17 00:00:00 2001
From: C A Subramaniam subramaniam...@ti.com
Date: Fri, 13 Nov 2009 15:59:58 +0530
Subject: [PATCH 10/10] omap mailbox: OMAP4 Mailbox-driver Patch to support 
tasklet implementation

This patch uses a tasklet implementation for
sending mailbox messages.

Signed-off-by: C A Subramaniam subramaniam...@ti.com
Signed-off-by: Ramesh Gupta G grgu...@ti.com
Signed-off-by: Hiroshi DOYU hiroshi.d...@nokia.com
---
 arch/arm/plat-omap/include/plat/mailbox.h |8 +++-
 arch/arm/plat-omap/mailbox.c  |   59 
 2 files changed, 23 insertions(+), 44 deletions(-)

diff --git a/arch/arm/plat-omap/include/plat/mailbox.h 
b/arch/arm/plat-omap/include/plat/mailbox.h
index bf06953..729166b 100644
--- a/arch/arm/plat-omap/include/plat/mailbox.h
+++ b/arch/arm/plat-omap/include/plat/mailbox.h
@@ -6,6 +6,7 @@
 #include linux/wait.h
 #include linux/workqueue.h
 #include linux/blkdev.h
+#include linux/interrupt.h
 
 typedef u32 mbox_msg_t;
 struct omap_mbox;
@@ -28,8 +29,10 @@ struct omap_mbox_ops {
int (*fifo_empty)(struct omap_mbox *mbox);
int (*fifo_full)(struct omap_mbox *mbox);
/* irq */
-   void(*enable_irq)(struct omap_mbox *mbox, omap_mbox_irq_t 
irq);
-   void(*disable_irq)(struct omap_mbox *mbox, omap_mbox_irq_t 
irq);
+   void(*enable_irq)(struct omap_mbox *mbox,
+   omap_mbox_irq_t irq);
+   void(*disable_irq)(struct omap_mbox *mbox,
+   omap_mbox_irq_t irq);
void(*ack_irq)(struct omap_mbox *mbox, omap_mbox_irq_t irq);
int (*is_irq)(struct omap_mbox *mbox, omap_mbox_irq_t irq);
/* ctx */
@@ -41,6 +44,7 @@ struct omap_mbox_queue {
spinlock_t  lock;
struct request_queue*queue;
struct work_struct  work;
+   struct tasklet_struct   tasklet;
int (*callback)(void *);
struct omap_mbox*mbox;
 };
diff --git a/arch/arm/plat-omap/mailbox.c b/arch/arm/plat-omap/mailbox.c
index 4d7947e..8e90633 100644
--- a/arch/arm/plat-omap/mailbox.c
+++ b/arch/arm/plat-omap/mailbox.c
@@ -80,74 +80,45 @@ static int __mbox_msg_send(struct omap_mbox *mbox, 
mbox_msg_t msg)
return ret;
 }
 
-struct omap_msg_tx_data {
-   mbox_msg_t  msg;
-};
-
-static void omap_msg_tx_end_io(struct request *rq, int error)
-{
-   kfree(rq-special);
-   __blk_put_request(rq-q, rq);
-}
 
 int omap_mbox_msg_send(struct omap_mbox *mbox, mbox_msg_t msg)
 {
-   struct omap_msg_tx_data *tx_data;
+
struct request *rq;
struct request_queue *q = mbox-txq-queue;
 
-   tx_data = kmalloc(sizeof(*tx_data), GFP_ATOMIC);
-   if (unlikely(!tx_data))
-   return -ENOMEM;
-
rq = blk_get_request(q, WRITE, GFP_ATOMIC);
-   if (unlikely(!rq)) {
-   kfree(tx_data);
+   if (unlikely(!rq))
return -ENOMEM;
-   }
 
-   tx_data-msg = msg;
-   rq-end_io = omap_msg_tx_end_io;
-   blk_insert_request(q, rq, 0, tx_data);
+   blk_insert_request(q, rq, 0, (void *) msg);
+   tasklet_schedule(mbox-txq-tasklet);
 
-   schedule_work(mbox-txq-work);
return 0;
 }
 EXPORT_SYMBOL(omap_mbox_msg_send);
 
-static void mbox_tx_work(struct work_struct *work)
+static void mbox_tx_tasklet(unsigned long tx_data)
 {
int ret;
struct request *rq;
-   struct omap_mbox_queue *mq = container_of(work,
-   struct omap_mbox_queue, work);
-   struct omap_mbox *mbox = mq-queue-queuedata;
+   struct omap_mbox *mbox = (struct omap_mbox *)tx_data;
struct request_queue *q = mbox-txq-queue;
 
while (1) {
-   struct omap_msg_tx_data *tx_data;
 
-   spin_lock(q-queue_lock);
rq = blk_fetch_request(q);
-   spin_unlock(q-queue_lock);
 
if (!rq)
break;
 
-   tx_data = rq-special;
-
-   ret = __mbox_msg_send(mbox, tx_data-msg);
+   ret = __mbox_msg_send(mbox, (mbox_msg_t)rq-special);
if (ret) {
omap_mbox_enable_irq(mbox, IRQ_TX);
-   spin_lock(q-queue_lock);
blk_requeue_request(q, rq);
-   spin_unlock(q-queue_lock);
return;
}
-
-   spin_lock(q-queue_lock);
-   __blk_end_request_all(rq, 0);
-   spin_unlock(q-queue_lock);
+   blk_end_request_all(rq, 0);
}
 }
 
@@ -192,7 +163,7 @@ static void __mbox_tx_interrupt(struct omap_mbox *mbox)
 {
omap_mbox_disable_irq(mbox, IRQ_TX);
ack_mbox_irq(mbox, IRQ_TX);
-   schedule_work(mbox-txq-work);
+   tasklet_schedule(mbox

RE: [PATCH 10/10] omap mailbox: OMAP4 Mailbox-driver Patch to support tasklet implementation

2009-09-14 Thread C.A, Subramaniam
Hi Hiroshi,
Sorry for the delayed response. 

 -Original Message-
 From: Hiroshi DOYU [mailto:hiroshi.d...@nokia.com] 
 Sent: Thursday, September 10, 2009 5:59 PM
 To: C.A, Subramaniam
 Cc: linux-omap@vger.kernel.org; t...@atomide.com; 
 r...@arm.linux.org.uk; Kanigeri, Hari; Gupta, Ramesh
 Subject: Re: [PATCH 10/10] omap mailbox: OMAP4 Mailbox-driver 
 Patch to support tasklet implementation
 
 From: ext C.A, Subramaniam subramaniam...@ti.com
 Subject: RE: [PATCH 10/10] omap mailbox: OMAP4 Mailbox-driver 
 Patch to support tasklet implementation
 Date: Thu, 10 Sep 2009 13:46:53 +0200
 
  
   
  Hi Hiroshi,
  
   -Original Message-
   From: Hiroshi DOYU [mailto:hiroshi.d...@nokia.com]
   Sent: Wednesday, September 09, 2009 2:32 PM
   To: C.A, Subramaniam
   Cc: linux-omap@vger.kernel.org; t...@atomide.com; 
   r...@arm.linux.org.uk; Kanigeri, Hari; Gupta, Ramesh
   Subject: Re: [PATCH 10/10] omap mailbox: OMAP4 
 Mailbox-driver Patch 
   to support tasklet implementation
   
   Hi Subbu,
   
   From: ext C.A, Subramaniam subramaniam...@ti.com
   Subject: RE: [PATCH 10/10] omap mailbox: OMAP4 
 Mailbox-driver Patch 
   to support tasklet implementation
   Date: Tue, 8 Sep 2009 19:43:48 +0200
   
   [...]
   
 As I described in the comment on [PATCH 8/10], I think
   that it would
 be better to keep mach-omap2/mailbox.c simple and 
 to add some 
 additional logic on plat-omap/mailbox.c.
 
 Would it be possbile to move this tasklet implementation to 
 plat-omap/mailbox.c?

The implementation of the tasklet itself is maintained in 
plat-omap/mailbox.c Since, I wanted to maintain a separate
   tasklet for
each mailbox instance used to send messages from MPU, I had to 
associate the the tasklet to the mailbox. Hence, the
   changes were done
in mach-omap2/mailbox.c

Please give your comments on this approach.
   
   Wouldn't just converting work_queue to tasklet work like below?
   
   (I havne't tested this at all, though...)
   
   diff --git a/arch/arm/plat-omap/include/mach/mailbox.h
   b/arch/arm/plat-omap/include/mach/mailbox.h
   index b7a6991..1f4e53e 100644
   --- a/arch/arm/plat-omap/include/mach/mailbox.h
   +++ b/arch/arm/plat-omap/include/mach/mailbox.h
   @@ -52,6 +52,8 @@ struct omap_mbox {

 struct omap_mbox_queue  *txq, *rxq;

   + struct tasklet_struct   tx_tasklet;
   +
 struct omap_mbox_ops*ops;

 mbox_msg_t  seq_snd, seq_rcv;
  
  Moved the tasklet structure to the omap_mbox_queue as follows:
 
 This is better.
 
  
  @@ -40,7 +43,8 @@ struct omap_mbox_ops {  struct omap_mbox_queue {
  spinlock_t  lock;
  struct request_queue*queue;
  -   struct work_struct  work;
  +   struct work_struct  rx_work;
  +   struct tasklet_struct   tx_tasklet;
  int (*callback)(void *);
  struct omap_mbox*mbox;
   };
 
 
 I think that rx_/tx_ prefix may not be necessary if you add 
 tasklet feature in omap_mbox_queue as followed since 
 omap_mbox_queue can be considered as s/w queue which can 
 evoke workqueue/tasklet accordingly.
 
 
 + struct work_struct  work;
 + struct tasklet_struct   tasklet;
   int (*callback)(void *);
   struct omap_mbox*mbox;
  };

This is fine. Will remove rx_ and tx_ prefix.
 
 
  
  Also chagned the omap_mbox_msg_send(). Removed the struct 
 omap_msg_tx_data.
  
   
   int omap_mbox_msg_send(struct omap_mbox *mbox, mbox_msg_t msg)  {
  -   struct omap_msg_tx_data *tx_data;
  +
  struct request *rq;
  struct request_queue *q = mbox-txq-queue;
   
  -   tx_data = kmalloc(sizeof(*tx_data), GFP_ATOMIC);
  -   if (unlikely(!tx_data))
  -   return -ENOMEM;
  -
  rq = blk_get_request(q, WRITE, GFP_ATOMIC);
  -   if (unlikely(!rq)) {
  -   kfree(tx_data);
  +   if (unlikely(!rq))
  return -ENOMEM;
  -   }
   
  -   tx_data-msg = msg;
  -   rq-end_io = omap_msg_tx_end_io;
  -   blk_insert_request(q, rq, 0, tx_data);
  +   blk_insert_request(q, rq, 0, (void *) msg);
  +   tasklet_schedule(mbox-txq-tx_tasklet);
   
  -   schedule_work(mbox-txq-work);
  return 0;
   }
   EXPORT_SYMBOL(omap_mbox_msg_send);
  
   diff --git a/arch/arm/plat-omap/mailbox.c 
   b/arch/arm/plat-omap/mailbox.c index 40424ed..37267ca 100644
   --- a/arch/arm/plat-omap/mailbox.c
   +++ b/arch/arm/plat-omap/mailbox.c
   @@ -184,22 +184,17 @@ int omap_mbox_msg_send(struct 
 omap_mbox *mbox, 
   mbox_msg_t msg, void* arg)  } EXPORT_SYMBOL(omap_mbox_msg_send);

   -static void mbox_tx_work(struct work_struct *work)
   +static void mbox_tx_tasklet(unsigned long data)
{
 int ret;
 struct request *rq;
   - struct omap_mbox_queue *mq = container_of(work,
   - struct omap_mbox_queue, work);
   - struct omap_mbox *mbox = mq-queue-queuedata;
   + struct omap_mbox *mbox = (struct omap_mbox *)data;
 struct request_queue *q = mbox-txq-queue

RE: [PATCH 10/10] omap mailbox: OMAP4 Mailbox-driver Patch to support tasklet implementation

2009-09-10 Thread C.A, Subramaniam
 
Hi Hiroshi,

 -Original Message-
 From: Hiroshi DOYU [mailto:hiroshi.d...@nokia.com] 
 Sent: Wednesday, September 09, 2009 2:32 PM
 To: C.A, Subramaniam
 Cc: linux-omap@vger.kernel.org; t...@atomide.com; 
 r...@arm.linux.org.uk; Kanigeri, Hari; Gupta, Ramesh
 Subject: Re: [PATCH 10/10] omap mailbox: OMAP4 Mailbox-driver 
 Patch to support tasklet implementation
 
 Hi Subbu,
 
 From: ext C.A, Subramaniam subramaniam...@ti.com
 Subject: RE: [PATCH 10/10] omap mailbox: OMAP4 Mailbox-driver 
 Patch to support tasklet implementation
 Date: Tue, 8 Sep 2009 19:43:48 +0200
 
 [...]
 
   As I described in the comment on [PATCH 8/10], I think 
 that it would 
   be better to keep mach-omap2/mailbox.c simple and to add some 
   additional logic on plat-omap/mailbox.c.
   
   Would it be possbile to move this tasklet implementation to 
   plat-omap/mailbox.c?
  
  The implementation of the tasklet itself is maintained in 
  plat-omap/mailbox.c Since, I wanted to maintain a separate 
 tasklet for 
  each mailbox instance used to send messages from MPU, I had to 
  associate the the tasklet to the mailbox. Hence, the 
 changes were done 
  in mach-omap2/mailbox.c
  
  Please give your comments on this approach.
 
 Wouldn't just converting work_queue to tasklet work like below?
 
 (I havne't tested this at all, though...)
 
 diff --git a/arch/arm/plat-omap/include/mach/mailbox.h 
 b/arch/arm/plat-omap/include/mach/mailbox.h
 index b7a6991..1f4e53e 100644
 --- a/arch/arm/plat-omap/include/mach/mailbox.h
 +++ b/arch/arm/plat-omap/include/mach/mailbox.h
 @@ -52,6 +52,8 @@ struct omap_mbox {
  
   struct omap_mbox_queue  *txq, *rxq;
  
 + struct tasklet_struct   tx_tasklet;
 +
   struct omap_mbox_ops*ops;
  
   mbox_msg_t  seq_snd, seq_rcv;

Moved the tasklet structure to the omap_mbox_queue as follows:

@@ -40,7 +43,8 @@ struct omap_mbox_ops {
 struct omap_mbox_queue {
spinlock_t  lock;
struct request_queue*queue;
-   struct work_struct  work;
+   struct work_struct  rx_work;
+   struct tasklet_struct   tx_tasklet;
int (*callback)(void *);
struct omap_mbox*mbox;
 };

Also chagned the omap_mbox_msg_send(). Removed the struct omap_msg_tx_data.

 
 int omap_mbox_msg_send(struct omap_mbox *mbox, mbox_msg_t msg)
 {
-   struct omap_msg_tx_data *tx_data;
+
struct request *rq;
struct request_queue *q = mbox-txq-queue;
 
-   tx_data = kmalloc(sizeof(*tx_data), GFP_ATOMIC);
-   if (unlikely(!tx_data))
-   return -ENOMEM;
-
rq = blk_get_request(q, WRITE, GFP_ATOMIC);
-   if (unlikely(!rq)) {
-   kfree(tx_data);
+   if (unlikely(!rq))
return -ENOMEM;
-   }
 
-   tx_data-msg = msg;
-   rq-end_io = omap_msg_tx_end_io;
-   blk_insert_request(q, rq, 0, tx_data);
+   blk_insert_request(q, rq, 0, (void *) msg);
+   tasklet_schedule(mbox-txq-tx_tasklet);
 
-   schedule_work(mbox-txq-work);
return 0;
 }
 EXPORT_SYMBOL(omap_mbox_msg_send);

 diff --git a/arch/arm/plat-omap/mailbox.c 
 b/arch/arm/plat-omap/mailbox.c index 40424ed..37267ca 100644
 --- a/arch/arm/plat-omap/mailbox.c
 +++ b/arch/arm/plat-omap/mailbox.c
 @@ -184,22 +184,17 @@ int omap_mbox_msg_send(struct omap_mbox 
 *mbox, mbox_msg_t msg, void* arg)  }  
 EXPORT_SYMBOL(omap_mbox_msg_send);
  
 -static void mbox_tx_work(struct work_struct *work)
 +static void mbox_tx_tasklet(unsigned long data)
  {
   int ret;
   struct request *rq;
 - struct omap_mbox_queue *mq = container_of(work,
 - struct omap_mbox_queue, work);
 - struct omap_mbox *mbox = mq-queue-queuedata;
 + struct omap_mbox *mbox = (struct omap_mbox *)data;
   struct request_queue *q = mbox-txq-queue;
  
   while (1) {
   struct omap_msg_tx_data *tx_data;
  
 - spin_lock(q-queue_lock);
   rq = blk_fetch_request(q);
 - spin_unlock(q-queue_lock);
 -
   if (!rq)
   break;
  
 @@ -208,15 +203,10 @@ static void mbox_tx_work(struct 
 work_struct *work)
   ret = __mbox_msg_send(mbox, tx_data-msg, tx_data-arg);
   if (ret) {
   enable_mbox_irq(mbox, IRQ_TX);
 - spin_lock(q-queue_lock);
   blk_requeue_request(q, rq);
 - spin_unlock(q-queue_lock);
   return;
   }
 -
 - spin_lock(q-queue_lock);
   __blk_end_request_all(rq, 0);
 - spin_unlock(q-queue_lock);
   }
  }
  

Changed the mbox_tx_tasklet as follows:

-static void mbox_tx_work(struct work_struct *work)
+static void mbox_tx_tasklet(unsigned long tx_data)
 {
int ret;
struct request *rq;
-   struct omap_mbox_queue *mq = container_of(work,
-   struct omap_mbox_queue, work);
-   struct

Re: [PATCH 10/10] omap mailbox: OMAP4 Mailbox-driver Patch to support tasklet implementation

2009-09-10 Thread Hiroshi DOYU
From: ext C.A, Subramaniam subramaniam...@ti.com
Subject: RE: [PATCH 10/10] omap mailbox: OMAP4 Mailbox-driver Patch to support 
tasklet implementation
Date: Thu, 10 Sep 2009 13:46:53 +0200

 
  
 Hi Hiroshi,
 
  -Original Message-
  From: Hiroshi DOYU [mailto:hiroshi.d...@nokia.com] 
  Sent: Wednesday, September 09, 2009 2:32 PM
  To: C.A, Subramaniam
  Cc: linux-omap@vger.kernel.org; t...@atomide.com; 
  r...@arm.linux.org.uk; Kanigeri, Hari; Gupta, Ramesh
  Subject: Re: [PATCH 10/10] omap mailbox: OMAP4 Mailbox-driver 
  Patch to support tasklet implementation
  
  Hi Subbu,
  
  From: ext C.A, Subramaniam subramaniam...@ti.com
  Subject: RE: [PATCH 10/10] omap mailbox: OMAP4 Mailbox-driver 
  Patch to support tasklet implementation
  Date: Tue, 8 Sep 2009 19:43:48 +0200
  
  [...]
  
As I described in the comment on [PATCH 8/10], I think 
  that it would 
be better to keep mach-omap2/mailbox.c simple and to add some 
additional logic on plat-omap/mailbox.c.

Would it be possbile to move this tasklet implementation to 
plat-omap/mailbox.c?
   
   The implementation of the tasklet itself is maintained in 
   plat-omap/mailbox.c Since, I wanted to maintain a separate 
  tasklet for 
   each mailbox instance used to send messages from MPU, I had to 
   associate the the tasklet to the mailbox. Hence, the 
  changes were done 
   in mach-omap2/mailbox.c
   
   Please give your comments on this approach.
  
  Wouldn't just converting work_queue to tasklet work like below?
  
  (I havne't tested this at all, though...)
  
  diff --git a/arch/arm/plat-omap/include/mach/mailbox.h 
  b/arch/arm/plat-omap/include/mach/mailbox.h
  index b7a6991..1f4e53e 100644
  --- a/arch/arm/plat-omap/include/mach/mailbox.h
  +++ b/arch/arm/plat-omap/include/mach/mailbox.h
  @@ -52,6 +52,8 @@ struct omap_mbox {
   
  struct omap_mbox_queue  *txq, *rxq;
   
  +   struct tasklet_struct   tx_tasklet;
  +
  struct omap_mbox_ops*ops;
   
  mbox_msg_t  seq_snd, seq_rcv;
 
 Moved the tasklet structure to the omap_mbox_queue as follows:

This is better.

 
 @@ -40,7 +43,8 @@ struct omap_mbox_ops {
  struct omap_mbox_queue {
   spinlock_t  lock;
   struct request_queue*queue;
 - struct work_struct  work;
 + struct work_struct  rx_work;
 + struct tasklet_struct   tx_tasklet;
   int (*callback)(void *);
   struct omap_mbox*mbox;
  };


I think that rx_/tx_ prefix may not be necessary if you add tasklet
feature in omap_mbox_queue as followed since omap_mbox_queue can
be considered as s/w queue which can evoke workqueue/tasklet
accordingly.


+   struct work_struct  work;
+   struct tasklet_struct   tasklet;
int (*callback)(void *);
struct omap_mbox*mbox;
 };


 
 Also chagned the omap_mbox_msg_send(). Removed the struct omap_msg_tx_data.
 
  
  int omap_mbox_msg_send(struct omap_mbox *mbox, mbox_msg_t msg)
  {
 - struct omap_msg_tx_data *tx_data;
 +
   struct request *rq;
   struct request_queue *q = mbox-txq-queue;
  
 - tx_data = kmalloc(sizeof(*tx_data), GFP_ATOMIC);
 - if (unlikely(!tx_data))
 - return -ENOMEM;
 -
   rq = blk_get_request(q, WRITE, GFP_ATOMIC);
 - if (unlikely(!rq)) {
 - kfree(tx_data);
 + if (unlikely(!rq))
   return -ENOMEM;
 - }
  
 - tx_data-msg = msg;
 - rq-end_io = omap_msg_tx_end_io;
 - blk_insert_request(q, rq, 0, tx_data);
 + blk_insert_request(q, rq, 0, (void *) msg);
 + tasklet_schedule(mbox-txq-tx_tasklet);
  
 - schedule_work(mbox-txq-work);
   return 0;
  }
  EXPORT_SYMBOL(omap_mbox_msg_send);
 
  diff --git a/arch/arm/plat-omap/mailbox.c 
  b/arch/arm/plat-omap/mailbox.c index 40424ed..37267ca 100644
  --- a/arch/arm/plat-omap/mailbox.c
  +++ b/arch/arm/plat-omap/mailbox.c
  @@ -184,22 +184,17 @@ int omap_mbox_msg_send(struct omap_mbox 
  *mbox, mbox_msg_t msg, void* arg)  }  
  EXPORT_SYMBOL(omap_mbox_msg_send);
   
  -static void mbox_tx_work(struct work_struct *work)
  +static void mbox_tx_tasklet(unsigned long data)
   {
  int ret;
  struct request *rq;
  -   struct omap_mbox_queue *mq = container_of(work,
  -   struct omap_mbox_queue, work);
  -   struct omap_mbox *mbox = mq-queue-queuedata;
  +   struct omap_mbox *mbox = (struct omap_mbox *)data;
  struct request_queue *q = mbox-txq-queue;
   
  while (1) {
  struct omap_msg_tx_data *tx_data;
   
  -   spin_lock(q-queue_lock);
  rq = blk_fetch_request(q);
  -   spin_unlock(q-queue_lock);
  -
  if (!rq)
  break;
   
  @@ -208,15 +203,10 @@ static void mbox_tx_work(struct 
  work_struct *work)
  ret = __mbox_msg_send(mbox, tx_data-msg, tx_data-arg);
  if (ret) {
  enable_mbox_irq(mbox, IRQ_TX);
  -   spin_lock(q-queue_lock

RE: [PATCH 10/10] omap mailbox: OMAP4 Mailbox-driver Patch to support tasklet implementation

2009-09-09 Thread C.A, Subramaniam
 Hi Hiroshi,

 -Original Message-
 From: Hiroshi DOYU [mailto:hiroshi.d...@nokia.com] 
 Sent: Wednesday, September 09, 2009 2:32 PM
 To: C.A, Subramaniam
 Cc: linux-omap@vger.kernel.org; t...@atomide.com; 
 r...@arm.linux.org.uk; Kanigeri, Hari; Gupta, Ramesh
 Subject: Re: [PATCH 10/10] omap mailbox: OMAP4 Mailbox-driver 
 Patch to support tasklet implementation
 
 Hi Subbu,
 
 From: ext C.A, Subramaniam subramaniam...@ti.com
 Subject: RE: [PATCH 10/10] omap mailbox: OMAP4 Mailbox-driver 
 Patch to support tasklet implementation
 Date: Tue, 8 Sep 2009 19:43:48 +0200
 
 [...]
 
   As I described in the comment on [PATCH 8/10], I think 
 that it would 
   be better to keep mach-omap2/mailbox.c simple and to add some 
   additional logic on plat-omap/mailbox.c.
   
   Would it be possbile to move this tasklet implementation to 
   plat-omap/mailbox.c?
  
  The implementation of the tasklet itself is maintained in 
  plat-omap/mailbox.c Since, I wanted to maintain a separate 
 tasklet for 
  each mailbox instance used to send messages from MPU, I had to 
  associate the the tasklet to the mailbox. Hence, the 
 changes were done 
  in mach-omap2/mailbox.c
  
  Please give your comments on this approach.
 
 Wouldn't just converting work_queue to tasklet work like below?
 
 (I havne't tested this at all, though...)
I will try that out and let you know. Also your approach seems better
as you are replacing the work queue implementaion as well.  
 
 diff --git a/arch/arm/plat-omap/include/mach/mailbox.h 
 b/arch/arm/plat-omap/include/mach/mailbox.h
 index b7a6991..1f4e53e 100644
 --- a/arch/arm/plat-omap/include/mach/mailbox.h
 +++ b/arch/arm/plat-omap/include/mach/mailbox.h
 @@ -52,6 +52,8 @@ struct omap_mbox {
  
   struct omap_mbox_queue  *txq, *rxq;
  
 + struct tasklet_struct   tx_tasklet;
 +
   struct omap_mbox_ops*ops;
  
   mbox_msg_t  seq_snd, seq_rcv;
 diff --git a/arch/arm/plat-omap/mailbox.c 
 b/arch/arm/plat-omap/mailbox.c index 40424ed..37267ca 100644
 --- a/arch/arm/plat-omap/mailbox.c
 +++ b/arch/arm/plat-omap/mailbox.c
 @@ -184,22 +184,17 @@ int omap_mbox_msg_send(struct omap_mbox 
 *mbox, mbox_msg_t msg, void* arg)  }  
 EXPORT_SYMBOL(omap_mbox_msg_send);
  
 -static void mbox_tx_work(struct work_struct *work)
 +static void mbox_tx_tasklet(unsigned long data)
  {
   int ret;
   struct request *rq;
 - struct omap_mbox_queue *mq = container_of(work,
 - struct omap_mbox_queue, work);
 - struct omap_mbox *mbox = mq-queue-queuedata;
 + struct omap_mbox *mbox = (struct omap_mbox *)data;
   struct request_queue *q = mbox-txq-queue;
  
   while (1) {
   struct omap_msg_tx_data *tx_data;
  
 - spin_lock(q-queue_lock);
   rq = blk_fetch_request(q);
 - spin_unlock(q-queue_lock);
 -
   if (!rq)
   break;
  
 @@ -208,15 +203,10 @@ static void mbox_tx_work(struct 
 work_struct *work)
   ret = __mbox_msg_send(mbox, tx_data-msg, tx_data-arg);
   if (ret) {
   enable_mbox_irq(mbox, IRQ_TX);
 - spin_lock(q-queue_lock);
   blk_requeue_request(q, rq);
 - spin_unlock(q-queue_lock);
   return;
   }
 -
 - spin_lock(q-queue_lock);
   __blk_end_request_all(rq, 0);
 - spin_unlock(q-queue_lock);
   }
  }
  
 @@ -266,7 +256,7 @@ static void __mbox_tx_interrupt(struct 
 omap_mbox *mbox)  {
   disable_mbox_irq(mbox, IRQ_TX);
   ack_mbox_irq(mbox, IRQ_TX);
 - schedule_work(mbox-txq-work);
 + tasklet_schedule(mbox-tx_tasklet);
  }
  
  static void __mbox_rx_interrupt(struct omap_mbox *mbox) @@ 
 -434,7 +424,9 @@ static int omap_mbox_init(struct omap_mbox *mbox)
   goto fail_request_irq;
   }
  
 - mq = mbox_queue_alloc(mbox, mbox_txq_fn, mbox_tx_work);
 + tasklet_init(mbox-tx_tasklet, mbox_tx_tasklet, 
 (unsigned long)mbox);
 +
 + mq = mbox_queue_alloc(mbox, mbox_txq_fn, NULL);
   if (!mq) {
   ret = -ENOMEM;
   goto fail_alloc_txq;
 
 --
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


RE: [PATCH 10/10] omap mailbox: OMAP4 Mailbox-driver Patch to support tasklet implementation

2009-09-08 Thread C.A, Subramaniam
Hi Hiroshi, 

 -Original Message-
 From: Hiroshi DOYU [mailto:hiroshi.d...@nokia.com] 
 Sent: Monday, September 07, 2009 2:20 PM
 To: C.A, Subramaniam
 Cc: linux-omap@vger.kernel.org; t...@atomide.com; 
 r...@arm.linux.org.uk; Kanigeri, Hari; Gupta, Ramesh
 Subject: Re: [PATCH 10/10] omap mailbox: OMAP4 Mailbox-driver 
 Patch to support tasklet implementation
 
 From: ext C.A, Subramaniam subramaniam...@ti.com
 Subject: [PATCH 10/10] omap mailbox: OMAP4 Mailbox-driver 
 Patch to support tasklet implementation
 Date: Fri, 4 Sep 2009 13:48:45 +0200
 
  From e759173e77f73fabce5177b4f685df20b16c6922 Mon Sep 17 
 00:00:00 2001
  From: C A Subramaniam subramaniam...@ti.com
  Date: Thu, 3 Sep 2009 17:42:35 +0530
  Subject: [PATCH 10/10] omap mailbox: OMAP4 Mailbox-driver 
 Patch to support tasklet
 implementation
  
  This patch uses a tasklet implementation for sending 
 mailbox messages.
  
  Signed-off-by: C A Subramaniam subramaniam...@ti.com
  Signed-off-by: Ramesh Gupta G grgu...@ti.com
  ---
   arch/arm/mach-omap2/mailbox.c |   43 ++-
   arch/arm/plat-omap/include/mach/mailbox.h |   16 +-
   arch/arm/plat-omap/mailbox.c  |   80 
 ++---
   3 files changed, 81 insertions(+), 58 deletions(-)
  
  diff --git a/arch/arm/mach-omap2/mailbox.c 
  b/arch/arm/mach-omap2/mailbox.c index 52a1670..45aea98 100644
  --- a/arch/arm/mach-omap2/mailbox.c
  +++ b/arch/arm/mach-omap2/mailbox.c
  @@ -236,6 +237,17 @@ static struct omap_mbox_ops omap2_mbox_ops = {
  .restore_ctx= omap2_mbox_restore_ctx,
   };
   
  +
  +static struct omap_mbox_task omap_mbox_1_tasklet = {
  +   .arg= NULL,
  +};
  +
  +static struct omap_mbox_task omap_mbox_2_tasklet = {
  +   .arg= NULL,
  +};
 
 As I described in the comment on [PATCH 8/10], I think that 
 it would be better to keep mach-omap2/mailbox.c simple and 
 to add some additional logic on plat-omap/mailbox.c.
 
 Would it be possbile to move this tasklet implementation to 
 plat-omap/mailbox.c?

The implementation of the tasklet itself is maintained in plat-omap/mailbox.c
Since, I wanted to maintain a separate tasklet for each mailbox
instance used to send messages from MPU, I had to associate the the tasklet
to the mailbox. Hence, the changes were done in mach-omap2/mailbox.c

Please give your comments on this approach.

 
  +
  +
  +
   /*
* MAILBOX 0: ARM - DSP,
* MAILBOX 1: ARM - DSP.
  @@ -272,6 +284,7 @@ struct omap_mbox mbox_1_info = {
  .name   = mailbox-1,
  .ops= omap2_mbox_ops,
  .priv   = omap2_mbox_1_priv,
  +   .tx_tasklet = omap_mbox_1_tasklet,
   };
   EXPORT_SYMBOL(mbox_1_info);
   #else
  @@ -305,8 +318,10 @@ struct omap_mbox mbox_2_info = {
  .name   = mailbox-2,
  .ops= omap2_mbox_ops,
  .priv   = omap2_mbox_2_priv,
  +   .tx_tasklet = omap_mbox_2_tasklet,
   };
   EXPORT_SYMBOL(mbox_2_info);
  +
   #endif
   
   
  diff --git a/arch/arm/plat-omap/include/mach/mailbox.h 
  b/arch/arm/plat-omap/include/mach/mailbox.h
  index bf06953..5271345 100644
  --- a/arch/arm/plat-omap/include/mach/mailbox.h
  +++ b/arch/arm/plat-omap/include/mach/mailbox.h
  @@ -28,8 +28,10 @@ struct omap_mbox_ops {
  int (*fifo_empty)(struct omap_mbox *mbox);
  int (*fifo_full)(struct omap_mbox *mbox);
  /* irq */
  -   void(*enable_irq)(struct omap_mbox *mbox, 
 omap_mbox_irq_t irq);
  -   void(*disable_irq)(struct omap_mbox *mbox, 
 omap_mbox_irq_t irq);
  +   void(*enable_irq)(struct omap_mbox *mbox,
  +   omap_mbox_irq_t irq);
  +   void(*disable_irq)(struct omap_mbox *mbox,
  +   omap_mbox_irq_t irq);
  void(*ack_irq)(struct omap_mbox *mbox, 
 omap_mbox_irq_t irq);
  int (*is_irq)(struct omap_mbox *mbox, 
 omap_mbox_irq_t irq);
  /* ctx */
  @@ -45,12 +47,22 @@ struct omap_mbox_queue {
  struct omap_mbox*mbox;
   };
   
  +struct omap_mbox_task{
  +   spinlock_t  lock;
  +   struct tasklet_struct   *t;
  +   mbox_msg_t  msg;
  +   void*arg;
  +};
  +
  +
   struct omap_mbox {
  char*name;
  unsigned intirq;
   
  struct omap_mbox_queue  *txq, *rxq;
   
  +   struct omap_mbox_task   *tx_tasklet;
  +
  struct omap_mbox_ops*ops;
   
  mbox_msg_t  seq_snd, seq_rcv;
  diff --git a/arch/arm/plat-omap/mailbox.c 
  b/arch/arm/plat-omap/mailbox.c index 84cf6af..b5e53d4 100644
  --- a/arch/arm/plat-omap/mailbox.c
  +++ b/arch/arm/plat-omap/mailbox.c
  @@ -63,60 +63,49 @@ static inline int is_mbox_irq(struct omap_mbox 
  *mbox, omap_mbox_irq_t irq)
   /*
* message sender
*/
  -static int __mbox_msg_send(struct omap_mbox *mbox, mbox_msg_t msg)
  +static void __mbox_msg_send(unsigned long tx)
   {
  +   struct omap_mbox_task *tx_data

Re: [PATCH 10/10] omap mailbox: OMAP4 Mailbox-driver Patch to support tasklet implementation

2009-09-07 Thread Hiroshi DOYU
From: ext C.A, Subramaniam subramaniam...@ti.com
Subject: [PATCH 10/10] omap mailbox: OMAP4 Mailbox-driver Patch to support 
tasklet implementation
Date: Fri, 4 Sep 2009 13:48:45 +0200

 From e759173e77f73fabce5177b4f685df20b16c6922 Mon Sep 17 00:00:00 2001
 From: C A Subramaniam subramaniam...@ti.com
 Date: Thu, 3 Sep 2009 17:42:35 +0530
 Subject: [PATCH 10/10] omap mailbox: OMAP4 Mailbox-driver Patch to support 
 tasklet
implementation
 
 This patch uses a tasklet implementation for
 sending mailbox messages.
 
 Signed-off-by: C A Subramaniam subramaniam...@ti.com
 Signed-off-by: Ramesh Gupta G grgu...@ti.com
 ---
  arch/arm/mach-omap2/mailbox.c |   43 ++-
  arch/arm/plat-omap/include/mach/mailbox.h |   16 +-
  arch/arm/plat-omap/mailbox.c  |   80 
 ++---
  3 files changed, 81 insertions(+), 58 deletions(-)
 
 diff --git a/arch/arm/mach-omap2/mailbox.c b/arch/arm/mach-omap2/mailbox.c
 index 52a1670..45aea98 100644
 --- a/arch/arm/mach-omap2/mailbox.c
 +++ b/arch/arm/mach-omap2/mailbox.c
 @@ -236,6 +237,17 @@ static struct omap_mbox_ops omap2_mbox_ops = {
   .restore_ctx= omap2_mbox_restore_ctx,
  };
  
 +
 +static struct omap_mbox_task omap_mbox_1_tasklet = {
 + .arg= NULL,
 +};
 +
 +static struct omap_mbox_task omap_mbox_2_tasklet = {
 + .arg= NULL,
 +};

As I described in the comment on [PATCH 8/10], I think that it would
be better to keep mach-omap2/mailbox.c simple and to add some
additional logic on plat-omap/mailbox.c.

Would it be possbile to move this tasklet implementation to
plat-omap/mailbox.c?

 +
 +
 +
  /*
   * MAILBOX 0: ARM - DSP,
   * MAILBOX 1: ARM - DSP.
 @@ -272,6 +284,7 @@ struct omap_mbox mbox_1_info = {
   .name   = mailbox-1,
   .ops= omap2_mbox_ops,
   .priv   = omap2_mbox_1_priv,
 + .tx_tasklet = omap_mbox_1_tasklet,
  };
  EXPORT_SYMBOL(mbox_1_info);
  #else
 @@ -305,8 +318,10 @@ struct omap_mbox mbox_2_info = {
   .name   = mailbox-2,
   .ops= omap2_mbox_ops,
   .priv   = omap2_mbox_2_priv,
 + .tx_tasklet = omap_mbox_2_tasklet,
  };
  EXPORT_SYMBOL(mbox_2_info);
 +
  #endif
  
  
 diff --git a/arch/arm/plat-omap/include/mach/mailbox.h 
 b/arch/arm/plat-omap/include/mach/mailbox.h
 index bf06953..5271345 100644
 --- a/arch/arm/plat-omap/include/mach/mailbox.h
 +++ b/arch/arm/plat-omap/include/mach/mailbox.h
 @@ -28,8 +28,10 @@ struct omap_mbox_ops {
   int (*fifo_empty)(struct omap_mbox *mbox);
   int (*fifo_full)(struct omap_mbox *mbox);
   /* irq */
 - void(*enable_irq)(struct omap_mbox *mbox, omap_mbox_irq_t 
 irq);
 - void(*disable_irq)(struct omap_mbox *mbox, omap_mbox_irq_t 
 irq);
 + void(*enable_irq)(struct omap_mbox *mbox,
 + omap_mbox_irq_t irq);
 + void(*disable_irq)(struct omap_mbox *mbox,
 + omap_mbox_irq_t irq);
   void(*ack_irq)(struct omap_mbox *mbox, omap_mbox_irq_t irq);
   int (*is_irq)(struct omap_mbox *mbox, omap_mbox_irq_t irq);
   /* ctx */
 @@ -45,12 +47,22 @@ struct omap_mbox_queue {
   struct omap_mbox*mbox;
  };
  
 +struct omap_mbox_task{
 + spinlock_t  lock;
 + struct tasklet_struct   *t;
 + mbox_msg_t  msg;
 + void*arg;
 +};
 +
 +
  struct omap_mbox {
   char*name;
   unsigned intirq;
  
   struct omap_mbox_queue  *txq, *rxq;
  
 + struct omap_mbox_task   *tx_tasklet;
 +
   struct omap_mbox_ops*ops;
  
   mbox_msg_t  seq_snd, seq_rcv;
 diff --git a/arch/arm/plat-omap/mailbox.c b/arch/arm/plat-omap/mailbox.c
 index 84cf6af..b5e53d4 100644
 --- a/arch/arm/plat-omap/mailbox.c
 +++ b/arch/arm/plat-omap/mailbox.c
 @@ -63,60 +63,49 @@ static inline int is_mbox_irq(struct omap_mbox *mbox, 
 omap_mbox_irq_t irq)
  /*
   * message sender
   */
 -static int __mbox_msg_send(struct omap_mbox *mbox, mbox_msg_t msg)
 +static void __mbox_msg_send(unsigned long tx)
  {
 + struct omap_mbox_task *tx_data  =  (struct omap_mbox_task *)tx;
 + struct omap_mbox *mbox = (struct omap_mbox *)tx_data-arg;
 + mbox_msg_t msg = tx_data-msg;
   int ret = 0, i = 1000;
  
   while (mbox_fifo_full(mbox)) {
 - if (mbox-ops-type == OMAP_MBOX_TYPE2)
 - return -1;
 - if (--i == 0)
 - return -1;
 + if (mbox-ops-type == OMAP_MBOX_TYPE2) {
 + printk(KERN_ERR Invalid mailbox type\n);
 + return ;
 + }
 + if (--i == 0) {
 + printk(KERN_ERR Time out writing to mailbox\n);
 + return ;
 + }
   udelay(1);
   }
   mbox_fifo_write(mbox, msg);
 - return ret;
 -}
 -
 -struct

[PATCH 10/10] omap mailbox: OMAP4 Mailbox-driver Patch to support tasklet implementation

2009-09-04 Thread C.A, Subramaniam
From e759173e77f73fabce5177b4f685df20b16c6922 Mon Sep 17 00:00:00 2001
From: C A Subramaniam subramaniam...@ti.com
Date: Thu, 3 Sep 2009 17:42:35 +0530
Subject: [PATCH 10/10] omap mailbox: OMAP4 Mailbox-driver Patch to support 
tasklet
   implementation

This patch uses a tasklet implementation for
sending mailbox messages.

Signed-off-by: C A Subramaniam subramaniam...@ti.com
Signed-off-by: Ramesh Gupta G grgu...@ti.com
---
 arch/arm/mach-omap2/mailbox.c |   43 ++-
 arch/arm/plat-omap/include/mach/mailbox.h |   16 +-
 arch/arm/plat-omap/mailbox.c  |   80 ++---
 3 files changed, 81 insertions(+), 58 deletions(-)

diff --git a/arch/arm/mach-omap2/mailbox.c b/arch/arm/mach-omap2/mailbox.c
index 52a1670..45aea98 100644
--- a/arch/arm/mach-omap2/mailbox.c
+++ b/arch/arm/mach-omap2/mailbox.c
@@ -236,6 +237,17 @@ static struct omap_mbox_ops omap2_mbox_ops = {
.restore_ctx= omap2_mbox_restore_ctx,
 };
 
+
+static struct omap_mbox_task omap_mbox_1_tasklet = {
+   .arg= NULL,
+};
+
+static struct omap_mbox_task omap_mbox_2_tasklet = {
+   .arg= NULL,
+};
+
+
+
 /*
  * MAILBOX 0: ARM - DSP,
  * MAILBOX 1: ARM - DSP.
@@ -272,6 +284,7 @@ struct omap_mbox mbox_1_info = {
.name   = mailbox-1,
.ops= omap2_mbox_ops,
.priv   = omap2_mbox_1_priv,
+   .tx_tasklet = omap_mbox_1_tasklet,
 };
 EXPORT_SYMBOL(mbox_1_info);
 #else
@@ -305,8 +318,10 @@ struct omap_mbox mbox_2_info = {
.name   = mailbox-2,
.ops= omap2_mbox_ops,
.priv   = omap2_mbox_2_priv,
+   .tx_tasklet = omap_mbox_2_tasklet,
 };
 EXPORT_SYMBOL(mbox_2_info);
+
 #endif
 
 
diff --git a/arch/arm/plat-omap/include/mach/mailbox.h 
b/arch/arm/plat-omap/include/mach/mailbox.h
index bf06953..5271345 100644
--- a/arch/arm/plat-omap/include/mach/mailbox.h
+++ b/arch/arm/plat-omap/include/mach/mailbox.h
@@ -28,8 +28,10 @@ struct omap_mbox_ops {
int (*fifo_empty)(struct omap_mbox *mbox);
int (*fifo_full)(struct omap_mbox *mbox);
/* irq */
-   void(*enable_irq)(struct omap_mbox *mbox, omap_mbox_irq_t 
irq);
-   void(*disable_irq)(struct omap_mbox *mbox, omap_mbox_irq_t 
irq);
+   void(*enable_irq)(struct omap_mbox *mbox,
+   omap_mbox_irq_t irq);
+   void(*disable_irq)(struct omap_mbox *mbox,
+   omap_mbox_irq_t irq);
void(*ack_irq)(struct omap_mbox *mbox, omap_mbox_irq_t irq);
int (*is_irq)(struct omap_mbox *mbox, omap_mbox_irq_t irq);
/* ctx */
@@ -45,12 +47,22 @@ struct omap_mbox_queue {
struct omap_mbox*mbox;
 };
 
+struct omap_mbox_task{
+   spinlock_t  lock;
+   struct tasklet_struct   *t;
+   mbox_msg_t  msg;
+   void*arg;
+};
+
+
 struct omap_mbox {
char*name;
unsigned intirq;
 
struct omap_mbox_queue  *txq, *rxq;
 
+   struct omap_mbox_task   *tx_tasklet;
+
struct omap_mbox_ops*ops;
 
mbox_msg_t  seq_snd, seq_rcv;
diff --git a/arch/arm/plat-omap/mailbox.c b/arch/arm/plat-omap/mailbox.c
index 84cf6af..b5e53d4 100644
--- a/arch/arm/plat-omap/mailbox.c
+++ b/arch/arm/plat-omap/mailbox.c
@@ -63,60 +63,49 @@ static inline int is_mbox_irq(struct omap_mbox *mbox, 
omap_mbox_irq_t irq)
 /*
  * message sender
  */
-static int __mbox_msg_send(struct omap_mbox *mbox, mbox_msg_t msg)
+static void __mbox_msg_send(unsigned long tx)
 {
+   struct omap_mbox_task *tx_data  =  (struct omap_mbox_task *)tx;
+   struct omap_mbox *mbox = (struct omap_mbox *)tx_data-arg;
+   mbox_msg_t msg = tx_data-msg;
int ret = 0, i = 1000;
 
while (mbox_fifo_full(mbox)) {
-   if (mbox-ops-type == OMAP_MBOX_TYPE2)
-   return -1;
-   if (--i == 0)
-   return -1;
+   if (mbox-ops-type == OMAP_MBOX_TYPE2) {
+   printk(KERN_ERR Invalid mailbox type\n);
+   return ;
+   }
+   if (--i == 0) {
+   printk(KERN_ERR Time out writing to mailbox\n);
+   return ;
+   }
udelay(1);
}
mbox_fifo_write(mbox, msg);
-   return ret;
-}
-
-struct omap_msg_tx_data {
-   mbox_msg_t  msg;
-   void*arg;
-};
+   tx_data-arg = NULL;
+   spin_unlock((mbox-tx_tasklet-lock));
 
-static void omap_msg_tx_end_io(struct request *rq, int error)
-{
-   kfree(rq-special);
-   __blk_put_request(rq-q, rq);
+   return;
 }
 
+
 int omap_mbox_msg_send(struct omap_mbox *mbox, mbox_msg_t msg)
 {
-   struct omap_msg_tx_data *tx_data;
-   struct request *rq;
-   struct