diff options
Diffstat (limited to 'drivers/w1/masters/omap_hdq.c')
| -rw-r--r-- | drivers/w1/masters/omap_hdq.c | 30 | 
1 files changed, 14 insertions, 16 deletions
diff --git a/drivers/w1/masters/omap_hdq.c b/drivers/w1/masters/omap_hdq.c index 291897c881b..4b0fcf3c2d0 100644 --- a/drivers/w1/masters/omap_hdq.c +++ b/drivers/w1/masters/omap_hdq.c @@ -178,6 +178,7 @@ static int hdq_write_byte(struct hdq_data *hdq_data, u8 val, u8 *status)  		hdq_data->hdq_irqstatus, OMAP_HDQ_TIMEOUT);  	if (ret == 0) {  		dev_dbg(hdq_data->dev, "TX wait elapsed\n"); +		ret = -ETIMEDOUT;  		goto out;  	} @@ -185,7 +186,7 @@ static int hdq_write_byte(struct hdq_data *hdq_data, u8 val, u8 *status)  	/* check irqstatus */  	if (!(*status & OMAP_HDQ_INT_STATUS_TXCOMPLETE)) {  		dev_dbg(hdq_data->dev, "timeout waiting for" -			"TXCOMPLETE/RXCOMPLETE, %x", *status); +			" TXCOMPLETE/RXCOMPLETE, %x", *status);  		ret = -ETIMEDOUT;  		goto out;  	} @@ -196,7 +197,7 @@ static int hdq_write_byte(struct hdq_data *hdq_data, u8 val, u8 *status)  			OMAP_HDQ_FLAG_CLEAR, &tmp_status);  	if (ret) {  		dev_dbg(hdq_data->dev, "timeout waiting GO bit" -			"return to zero, %x", tmp_status); +			" return to zero, %x", tmp_status);  	}  out: @@ -339,7 +340,7 @@ static int omap_hdq_break(struct hdq_data *hdq_data)  			&tmp_status);  	if (ret)  		dev_dbg(hdq_data->dev, "timeout waiting INIT&GO bits" -			"return to zero, %x", tmp_status); +			" return to zero, %x", tmp_status);  out:  	mutex_unlock(&hdq_data->hdq_mutex); @@ -351,7 +352,6 @@ static int hdq_read_byte(struct hdq_data *hdq_data, u8 *val)  {  	int ret = 0;  	u8 status; -	unsigned long timeout = jiffies + OMAP_HDQ_TIMEOUT;  	ret = mutex_lock_interruptible(&hdq_data->hdq_mutex);  	if (ret < 0) { @@ -369,22 +369,20 @@ static int hdq_read_byte(struct hdq_data *hdq_data, u8 *val)  			OMAP_HDQ_CTRL_STATUS_DIR | OMAP_HDQ_CTRL_STATUS_GO,  			OMAP_HDQ_CTRL_STATUS_DIR | OMAP_HDQ_CTRL_STATUS_GO);  		/* -		 * The RX comes immediately after TX. It -		 * triggers another interrupt before we -		 * sleep. So we have to wait for RXCOMPLETE bit. +		 * The RX comes immediately after TX.  		 */ -		while (!(hdq_data->hdq_irqstatus -			& OMAP_HDQ_INT_STATUS_RXCOMPLETE) -			&& time_before(jiffies, timeout)) { -			schedule_timeout_uninterruptible(1); -		} +		wait_event_timeout(hdq_wait_queue, +				   (hdq_data->hdq_irqstatus +				    & OMAP_HDQ_INT_STATUS_RXCOMPLETE), +				   OMAP_HDQ_TIMEOUT); +  		hdq_reg_merge(hdq_data, OMAP_HDQ_CTRL_STATUS, 0,  			OMAP_HDQ_CTRL_STATUS_DIR);  		status = hdq_data->hdq_irqstatus;  		/* check irqstatus */  		if (!(status & OMAP_HDQ_INT_STATUS_RXCOMPLETE)) {  			dev_dbg(hdq_data->dev, "timeout waiting for" -				"RXCOMPLETE, %x", status); +				" RXCOMPLETE, %x", status);  			ret = -ETIMEDOUT;  			goto out;  		} @@ -394,7 +392,7 @@ static int hdq_read_byte(struct hdq_data *hdq_data, u8 *val)  out:  	mutex_unlock(&hdq_data->hdq_mutex);  rtn: -	return 0; +	return ret;  } @@ -456,7 +454,7 @@ static int omap_hdq_put(struct hdq_data *hdq_data)  	if (0 == hdq_data->hdq_usecount) {  		dev_dbg(hdq_data->dev, "attempt to decrement use count" -			"when it is zero"); +			" when it is zero");  		ret = -EINVAL;  	} else {  		hdq_data->hdq_usecount--; @@ -524,7 +522,7 @@ static void omap_w1_write_byte(void *_hdq, u8 byte)  	mutex_unlock(&hdq_data->hdq_mutex);  	ret = hdq_write_byte(hdq_data, byte, &status); -	if (ret == 0) { +	if (ret < 0) {  		dev_dbg(hdq_data->dev, "TX failure:Ctrl status %x\n", status);  		return;  	}  |