On Thu, Sep 25, 2008 at 12:28:22PM +0530, ext Gadiyar, Anand wrote: > From: Madhusudhan Chikkature <madhu.cr@xxxxxx> > > This patch moves the shared variable into the local structure and > protects its updation. > > Signed-off-by: Madhusudhan Chikkature <madhu.cr@xxxxxx> Acked-by: Felipe Balbi <felipe.balbi@xxxxxxxxx> > --- > 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 majordomo@xxxxxxxxxxxxxxx > 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 majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html