From: Felipe Balbi <[email protected]>

encapsulate the for loop on those wrappers and
make the code easier to follow.

Signed-off-by: Felipe Balbi <[email protected]>
---
 drivers/cbus/cbus.c |   96 +++++++++++++++++++++++++++++++--------------------
 1 files changed, 58 insertions(+), 38 deletions(-)

diff --git a/drivers/cbus/cbus.c b/drivers/cbus/cbus.c
index 0791251..bae7b3e 100644
--- a/drivers/cbus/cbus.c
+++ b/drivers/cbus/cbus.c
@@ -58,7 +58,8 @@ struct cbus_host {
 
 static struct cbus_host *cbus_host;
 
-static int cbus_send_bit(struct cbus_host *host, int bit, int set_to_input)
+static int cbus_send_bit(struct cbus_host *host, unsigned bit,
+               unsigned input)
 {
        int ret = 0;
 
@@ -66,7 +67,7 @@ static int cbus_send_bit(struct cbus_host *host, int bit, int 
set_to_input)
        gpio_set_value(host->clk_gpio, 1);
 
        /* The data bit is read on the rising edge of CLK */
-       if (set_to_input)
+       if (input)
                ret = gpio_direction_input(host->dat_gpio);
 
        gpio_set_value(host->clk_gpio, 0);
@@ -74,6 +75,23 @@ static int cbus_send_bit(struct cbus_host *host, int bit, 
int set_to_input)
        return ret;
 }
 
+static int cbus_send_data(struct cbus_host *host, unsigned data, unsigned len,
+               unsigned input)
+{
+       int ret = 0;
+       int i;
+
+       for (i = len; i > 0; i--) {
+               ret = cbus_send_bit(host, data & (1 << (i - 1)),
+                               input && (i == 1));
+               if (ret < 0)
+                       goto out;
+       }
+
+out:
+       return ret;
+}
+
 static int cbus_receive_bit(struct cbus_host *host)
 {
        int ret;
@@ -88,12 +106,31 @@ out:
        return ret;
 }
 
+static int cbus_receive_data(struct cbus_host *host, unsigned len)
+{
+       int ret = 0;
+       int i;
+
+       for (i = 16; i > 0; i--) {
+               int bit = cbus_receive_bit(host);
+
+               if (bit < 0)
+                       goto out;
+
+               if (bit)
+                       ret |= 1 << (i - 1);
+       }
+
+out:
+       return ret;
+}
+
 static int cbus_transfer(struct cbus_host *host, unsigned rw, unsigned dev,
                unsigned reg, unsigned data)
 {
        unsigned long flags;
+       int input = 0;
        int ret = 0;
-       int i;
 
        /* We don't want interrupts disturbing our transfer */
        spin_lock_irqsave(&host->lock, flags);
@@ -105,12 +142,10 @@ static int cbus_transfer(struct cbus_host *host, unsigned 
rw, unsigned dev,
        gpio_direction_output(host->dat_gpio, 1);
 
        /* Send the device address */
-       for (i = 3; i > 0; i--) {
-               ret = cbus_send_bit(host, dev & (1 << (i - 1)), 0);
-               if (ret < 0) {
-                       dev_dbg(host->dev, "failed sending device addr\n");
-                       goto out;
-               }
+       ret = cbus_send_data(host, dev, 3, 0);
+       if (ret < 0) {
+               dev_dbg(host->dev, "failed sending device addr\n");
+               goto out;
        }
 
        /* Send the rw flag */
@@ -121,44 +156,29 @@ static int cbus_transfer(struct cbus_host *host, unsigned 
rw, unsigned dev,
        }
 
        /* Send the register address */
-       for (i = 5; i > 0; i--) {
-               int set_to_input = 0;
-
-               if (rw && i == 1)
-                       set_to_input = 1;
+       if (rw)
+               input = true;
 
-               ret = cbus_send_bit(host, reg & (1 << (i - 1)), set_to_input);
-               if (ret < 0) {
-                       dev_dbg(host->dev, "failed sending register addr\n");
-                       goto out;
-               }
+       ret = cbus_send_data(host, reg, 5, input);
+       if (ret < 0) {
+               dev_dbg(host->dev, "failed sending register addr\n");
+               goto out;
        }
 
        if (!rw) {
-               for (i = 16; i > 0; i--) {
-                       ret = cbus_send_bit(host, data & (1 << (i - 1)), 0);
-                       if (ret < 0) {
-                               dev_dbg(host->dev, "failed sending data\n");
-                               goto out;
-                       }
+               ret = cbus_send_data(host, data, 16, 0);
+               if (ret < 0) {
+                       dev_dbg(host->dev, "failed sending data\n");
+                       goto out;
                }
        } else {
                gpio_set_value(host->clk_gpio, 1);
 
-               for (i = 16; i > 0; i--) {
-                       u8 bit = cbus_receive_bit(host);
-
-                       if (bit < 0) {
-                               dev_dbg(host->dev, "failed receiving data\n");
-                               goto out;
-                       }
-
-                       if (bit)
-                               data |= 1 << (i - 1);
+               ret = cbus_receive_data(host, 16);
+               if (ret < 0) {
+                       dev_dbg(host->dev, "failed receiving data\n");
+                       goto out;
                }
-
-               /* return the data received */
-               ret = data;
        }
 
        /* Indicate end of transfer, SEL goes up until next transfer */
-- 
1.7.0.rc0.33.g7c3932

--
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