Merge tag 'driver-core-3.6-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git...
[firefly-linux-kernel-4.4.55.git] / drivers / w1 / masters / omap_hdq.c
index 291897c881be5c67462ec86d6dafb0b073097a5d..4b0fcf3c2d035f8aba0d0e0ba938f34df6621ef2 100644 (file)
@@ -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;
        }