Re: [PATCH 8/10] HDQ driver:protect the shared flag

2008-09-25 Thread Felipe Balbi
On Thu, Sep 25, 2008 at 12:28:22PM +0530, ext Gadiyar, Anand wrote:
> From: Madhusudhan Chikkature <[EMAIL PROTECTED]>
> 
> This patch moves the shared variable into the local structure and
> protects its updation.
> 
> Signed-off-by: Madhusudhan Chikkature <[EMAIL PROTECTED]>
Acked-by: Felipe Balbi <[EMAIL PROTECTED]>
> ---
>  drivers/w1/masters/omap_hdq.c |   52 
> ++
>  1 files changed, 38 insertions(+), 14 deletions(-)
> 
> Index: linux-omap-2.6/drivers/w1/masters/omap_hdq.c
> ===
> --- linux-omap-2.6.orig/drivers/w1/masters/omap_hdq.c 2008-09-24 
> 11:49:45.0 +0530
> +++ linux-omap-2.6/drivers/w1/masters/omap_hdq.c  2008-09-24 
> 14:41:43.0 +0530
> @@ -61,6 +61,12 @@ struct hdq_data {
>   struct  clk *hdq_fck;
>   u8  hdq_irqstatus;
>   spinlock_t  hdq_spinlock;
> + /*
> +  * Used to control the call to omap_hdq_get and omap_hdq_put.
> +  * HDQ Protocol: Write the CMD|REG_address first, followed by
> +  * the data wrire or read.
> +  */
> + int init_trans;
>  };
>  
>  static int omap_hdq_get(struct hdq_data *hdq_data);
> @@ -505,13 +511,6 @@ omap_hdq_put(struct hdq_data *hdq_data)
>  }
>  
>  /*
> - * Used to control the call to omap_hdq_get and omap_hdq_put.
> - * HDQ Protocol: Write the CMD|REG_address first, followed by
> - * the data wrire or read.
> - */
> -static int init_trans;
> -
> -/*
>   * Read a byte of data from the device.
>   */
>  static u8 omap_w1_read_byte(void *_hdq)
> @@ -522,14 +521,26 @@ static u8 omap_w1_read_byte(void *_hdq)
>  
>   ret = hdq_read_byte(hdq_data, &val);
>   if (ret) {
> - init_trans = 0;
> + ret = mutex_lock_interruptible(&hdq_data->hdq_mutex);
> + if (ret < 0) {
> + dev_dbg(hdq_data->dev, "Could not acquire mutex\n");
> + return -EINTR;
> + }
> + hdq_data->init_trans = 0;
> + mutex_unlock(&hdq_data->hdq_mutex);
>   omap_hdq_put(hdq_data);
>   return -1;
>   }
>  
>   /* Write followed by a read, release the module */
> - if (init_trans) {
> - init_trans = 0;
> + if (hdq_data->init_trans) {
> + ret = mutex_lock_interruptible(&hdq_data->hdq_mutex);
> + if (ret < 0) {
> + dev_dbg(hdq_data->dev, "Could not acquire mutex\n");
> + return -EINTR;
> + }
> + hdq_data->init_trans = 0;
> + mutex_unlock(&hdq_data->hdq_mutex);
>   omap_hdq_put(hdq_data);
>   }
>  
> @@ -542,21 +553,34 @@ static u8 omap_w1_read_byte(void *_hdq)
>  static void omap_w1_write_byte(void *_hdq, u8 byte)
>  {
>   struct hdq_data *hdq_data = _hdq;
> + int ret;
>   u8 status;
>  
>   /* First write to initialize the transfer */
> - if (init_trans == 0)
> + if (hdq_data->init_trans == 0)
>   omap_hdq_get(hdq_data);
>  
> - init_trans++;
> + ret = mutex_lock_interruptible(&hdq_data->hdq_mutex);
> + if (ret < 0) {
> + dev_dbg(hdq_data->dev, "Could not acquire mutex\n");
> + return;
> + }
> + hdq_data->init_trans++;
> + mutex_unlock(&hdq_data->hdq_mutex);
>  
>   hdq_write_byte(hdq_data, byte, &status);
>   dev_dbg(hdq_data->dev, "Ctrl status %x\n", status);
>  
>   /* Second write, data transfered. Release the module */
> - if (init_trans > 1) {
> + if (hdq_data->init_trans > 1) {
>   omap_hdq_put(hdq_data);
> - init_trans = 0;
> + ret = mutex_lock_interruptible(&hdq_data->hdq_mutex);
> + if (ret < 0) {
> + dev_dbg(hdq_data->dev, "Could not acquire mutex\n");
> + return;
> + }
> + hdq_data->init_trans = 0;
> + mutex_unlock(&hdq_data->hdq_mutex);
>   }
>  
>   return;--
> To unsubscribe from this list: send the line "unsubscribe linux-omap" in
> the body of a message to [EMAIL PROTECTED]
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

-- 
balbi
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 8/10] HDQ driver:protect the shared flag

2008-09-24 Thread Gadiyar, Anand
From: Madhusudhan Chikkature <[EMAIL PROTECTED]>

This patch moves the shared variable into the local structure and
protects its updation.

Signed-off-by: Madhusudhan Chikkature <[EMAIL PROTECTED]>
---
 drivers/w1/masters/omap_hdq.c |   52 ++
 1 files changed, 38 insertions(+), 14 deletions(-)

Index: linux-omap-2.6/drivers/w1/masters/omap_hdq.c
===
--- linux-omap-2.6.orig/drivers/w1/masters/omap_hdq.c   2008-09-24 
11:49:45.0 +0530
+++ linux-omap-2.6/drivers/w1/masters/omap_hdq.c2008-09-24 
14:41:43.0 +0530
@@ -61,6 +61,12 @@ struct hdq_data {
struct  clk *hdq_fck;
u8  hdq_irqstatus;
spinlock_t  hdq_spinlock;
+   /*
+* Used to control the call to omap_hdq_get and omap_hdq_put.
+* HDQ Protocol: Write the CMD|REG_address first, followed by
+* the data wrire or read.
+*/
+   int init_trans;
 };
 
 static int omap_hdq_get(struct hdq_data *hdq_data);
@@ -505,13 +511,6 @@ omap_hdq_put(struct hdq_data *hdq_data)
 }
 
 /*
- * Used to control the call to omap_hdq_get and omap_hdq_put.
- * HDQ Protocol: Write the CMD|REG_address first, followed by
- * the data wrire or read.
- */
-static int init_trans;
-
-/*
  * Read a byte of data from the device.
  */
 static u8 omap_w1_read_byte(void *_hdq)
@@ -522,14 +521,26 @@ static u8 omap_w1_read_byte(void *_hdq)
 
ret = hdq_read_byte(hdq_data, &val);
if (ret) {
-   init_trans = 0;
+   ret = mutex_lock_interruptible(&hdq_data->hdq_mutex);
+   if (ret < 0) {
+   dev_dbg(hdq_data->dev, "Could not acquire mutex\n");
+   return -EINTR;
+   }
+   hdq_data->init_trans = 0;
+   mutex_unlock(&hdq_data->hdq_mutex);
omap_hdq_put(hdq_data);
return -1;
}
 
/* Write followed by a read, release the module */
-   if (init_trans) {
-   init_trans = 0;
+   if (hdq_data->init_trans) {
+   ret = mutex_lock_interruptible(&hdq_data->hdq_mutex);
+   if (ret < 0) {
+   dev_dbg(hdq_data->dev, "Could not acquire mutex\n");
+   return -EINTR;
+   }
+   hdq_data->init_trans = 0;
+   mutex_unlock(&hdq_data->hdq_mutex);
omap_hdq_put(hdq_data);
}
 
@@ -542,21 +553,34 @@ static u8 omap_w1_read_byte(void *_hdq)
 static void omap_w1_write_byte(void *_hdq, u8 byte)
 {
struct hdq_data *hdq_data = _hdq;
+   int ret;
u8 status;
 
/* First write to initialize the transfer */
-   if (init_trans == 0)
+   if (hdq_data->init_trans == 0)
omap_hdq_get(hdq_data);
 
-   init_trans++;
+   ret = mutex_lock_interruptible(&hdq_data->hdq_mutex);
+   if (ret < 0) {
+   dev_dbg(hdq_data->dev, "Could not acquire mutex\n");
+   return;
+   }
+   hdq_data->init_trans++;
+   mutex_unlock(&hdq_data->hdq_mutex);
 
hdq_write_byte(hdq_data, byte, &status);
dev_dbg(hdq_data->dev, "Ctrl status %x\n", status);
 
/* Second write, data transfered. Release the module */
-   if (init_trans > 1) {
+   if (hdq_data->init_trans > 1) {
omap_hdq_put(hdq_data);
-   init_trans = 0;
+   ret = mutex_lock_interruptible(&hdq_data->hdq_mutex);
+   if (ret < 0) {
+   dev_dbg(hdq_data->dev, "Could not acquire mutex\n");
+   return;
+   }
+   hdq_data->init_trans = 0;
+   mutex_unlock(&hdq_data->hdq_mutex);
}
 
return;--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html