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.000000000 +0530
> +++ linux-omap-2.6/drivers/w1/masters/omap_hdq.c      2008-09-24 
> 14:41:43.000000000 +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

Reply via email to