All of lore.kernel.org
 help / color / mirror / Atom feed
From: felipe.balbi@nokia.com
To: Linux OMAP Mailing List <linux-omap@vger.kernel.org>
Cc: Felipe Balbi <felipe.balbi@nokia.com>
Subject: [RFC PATCH 11/37] cbus: handle possible errors on cbus_send/receive_bit
Date: Wed,  7 Apr 2010 19:04:02 +0300	[thread overview]
Message-ID: <1270656268-7034-12-git-send-email-felipe.balbi@nokia.com> (raw)
In-Reply-To: <1270656268-7034-1-git-send-email-felipe.balbi@nokia.com>

From: Felipe Balbi <felipe.balbi@nokia.com>

gpio_direction_input might fail and we have
to handle that possibility. While at that,
also add the device pointer to struct cbus_host
and use that for printing debugging messages and
make cbus_receive_bit return int.

Signed-off-by: Felipe Balbi <felipe.balbi@nokia.com>
---
 drivers/cbus/cbus.c |   68 +++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 53 insertions(+), 15 deletions(-)

diff --git a/drivers/cbus/cbus.c b/drivers/cbus/cbus.c
index 285bf23..0791251 100644
--- a/drivers/cbus/cbus.c
+++ b/drivers/cbus/cbus.c
@@ -47,35 +47,44 @@
 
 struct cbus_host {
 	/* host lock */
-	spinlock_t lock;
+	spinlock_t	lock;
 
-	int	clk_gpio;
-	int	dat_gpio;
-	int	sel_gpio;
+	struct device	*dev;
+
+	int		clk_gpio;
+	int		dat_gpio;
+	int		sel_gpio;
 };
 
 static struct cbus_host *cbus_host;
 
-static void cbus_send_bit(struct cbus_host *host, int bit, int set_to_input)
+static int cbus_send_bit(struct cbus_host *host, int bit, int set_to_input)
 {
+	int ret = 0;
+
 	gpio_set_value(host->dat_gpio, bit ? 1 : 0);
 	gpio_set_value(host->clk_gpio, 1);
 
 	/* The data bit is read on the rising edge of CLK */
 	if (set_to_input)
-		gpio_direction_input(host->dat_gpio);
+		ret = gpio_direction_input(host->dat_gpio);
 
 	gpio_set_value(host->clk_gpio, 0);
+
+	return ret;
 }
 
-static u8 cbus_receive_bit(struct cbus_host *host)
+static int cbus_receive_bit(struct cbus_host *host)
 {
-	u8 ret;
+	int ret;
 
 	gpio_set_value(host->clk_gpio, 1);
 	ret = gpio_get_value(host->dat_gpio);
+	if (ret < 0)
+		goto out;
 	gpio_set_value(host->clk_gpio, 0);
 
+out:
 	return ret;
 }
 
@@ -83,6 +92,7 @@ static int cbus_transfer(struct cbus_host *host, unsigned rw, unsigned dev,
 		unsigned reg, unsigned data)
 {
 	unsigned long flags;
+	int ret = 0;
 	int i;
 
 	/* We don't want interrupts disturbing our transfer */
@@ -95,11 +105,20 @@ 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--)
-		cbus_send_bit(host, dev & (1 << (i - 1)), 0);
+	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;
+		}
+	}
 
 	/* Send the rw flag */
-	cbus_send_bit(host, rw, 0);
+	ret = cbus_send_bit(host, rw, 0);
+	if (ret < 0) {
+		dev_dbg(host->dev, "failed sending read/write flag\n");
+		goto out;
+	}
 
 	/* Send the register address */
 	for (i = 5; i > 0; i--) {
@@ -108,21 +127,38 @@ static int cbus_transfer(struct cbus_host *host, unsigned rw, unsigned dev,
 		if (rw && i == 1)
 			set_to_input = 1;
 
-		cbus_send_bit(host, reg & (1 << (i - 1)), set_to_input);
+		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;
+		}
 	}
 
 	if (!rw) {
-		for (i = 16; i > 0; i--)
-			cbus_send_bit(host, data & (1 << (i - 1)), 0);
+		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;
+			}
+		}
 	} 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);
 		}
+
+		/* return the data received */
+		ret = data;
 	}
 
 	/* Indicate end of transfer, SEL goes up until next transfer */
@@ -130,9 +166,10 @@ static int cbus_transfer(struct cbus_host *host, unsigned rw, unsigned dev,
 	gpio_set_value(host->clk_gpio, 1);
 	gpio_set_value(host->clk_gpio, 0);
 
+out:
 	spin_unlock_irqrestore(&host->lock, flags);
 
-	return data;
+	return ret;
 }
 
 /*
@@ -168,6 +205,7 @@ static int __init cbus_bus_probe(struct platform_device *pdev)
 	chost->clk_gpio = pdata->clk_gpio;
 	chost->dat_gpio = pdata->dat_gpio;
 	chost->sel_gpio = pdata->sel_gpio;
+	chost->dev = &pdev->dev;
 
 	ret = gpio_request(chost->clk_gpio, "CBUS clk");
 	if (ret < 0)
-- 
1.7.0.rc0.33.g7c3932


  parent reply	other threads:[~2010-04-07 16:04 UTC|newest]

Thread overview: 41+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-04-07 16:03 [RFC PATCH 00/37] cbus patches felipe.balbi
2010-04-07 16:03 ` [RFC PATCH 01/37] cbus: convert u32 base to void __iomem *base felipe.balbi
2010-04-07 16:03 ` [RFC PATCH 02/37] cbus: NULL global variable on exit felipe.balbi
2010-04-07 16:03 ` [RFC PATCH 03/37] cbus: checkpatch.pl fix on cbus.c felipe.balbi
2010-04-07 16:03 ` [RFC PATCH 04/37] cbus: don't export the global cbus_host variable felipe.balbi
2010-04-07 16:03 ` [RFC PATCH 05/37] cbus: rely on gpiolib felipe.balbi
2010-04-07 16:03 ` [RFC PATCH 06/37] cbus: no ternary on return felipe.balbi
2010-04-07 16:03 ` [RFC PATCH 07/37] cbus: add read/write flag to cbus_transfer felipe.balbi
2010-04-07 16:03 ` [RFC PATCH 08/37] cbus: don't type case when issuing read/write felipe.balbi
2010-04-07 16:04 ` [RFC PATCH 09/37] cbus: fix a resource leakage felipe.balbi
2010-04-07 16:04 ` [RFC PATCH 10/37] cbus: move cbus_host definition to C source felipe.balbi
2010-04-07 16:04 ` felipe.balbi [this message]
2010-04-07 16:04 ` [RFC PATCH 12/37] cbus: introduce cbus_send/receive_data wrappers felipe.balbi
2010-04-07 16:04 ` [RFC PATCH 13/37] cbus: add kerneldoc felipe.balbi
2010-04-07 16:04 ` [RFC PATCH 14/37] cbus: retu-wdt: fix compile breakage felipe.balbi
2010-04-07 16:04 ` [RFC PATCH 15/37] cbus: retu: fix compile breakage on retu-headset felipe.balbi
2010-04-07 16:04 ` [RFC PATCH 16/37] cbus: retu: split one MODULE_AUTHOR into several felipe.balbi
2010-04-07 16:04 ` [RFC PATCH 17/37] cbus: retu: don't assing ret inside the if () felipe.balbi
2010-04-07 16:04 ` [RFC PATCH 18/37] cbus: retu: convert printk to dev_* felipe.balbi
2010-04-07 16:04 ` [RFC PATCH 19/37] cbus: retu: convert to a platform_driver felipe.balbi
2010-04-07 16:04 ` [RFC PATCH 20/37] cbus: tahvo: split MODULE_AUTHOR into several entries felipe.balbi
2010-04-07 16:04 ` [RFC PATCH 21/37] cbus: tahvo: move EXPORT_SYMBOL macros closer to functions felipe.balbi
2010-04-07 16:04 ` [RFC PATCH 22/37] cbus: tahvo: don't assign ret inside if () felipe.balbi
2010-04-07 16:04 ` [RFC PATCH 23/37] cbus: tahvo: convert printk into dev_* felipe.balbi
2010-04-07 16:04 ` [RFC PATCH 24/37] cbus: tahvo: convert to platform_driver felipe.balbi
2010-04-07 16:04 ` [RFC PATCH 25/37] cbus: retu: allocate platform_device for Retu's children felipe.balbi
2010-04-07 16:04 ` [RFC PATCH 26/37] cbus: retu-pwrbutton: convert to platform_driver felipe.balbi
2010-04-07 16:04 ` [RFC PATCH 27/37] cbus: retu-headset: simplify module_init felipe.balbi
2010-04-07 16:04 ` [RFC PATCH 28/37] cbus: retu-rtc: remove platform_device code felipe.balbi
2010-04-07 16:04 ` [RFC PATCH 29/37] cbus: retu-rtc: convert to platform_driver felipe.balbi
2010-04-07 16:04 ` [RFC PATCH 30/37] cbus: retu-rtc: split MODULE_AUTHOR into several entries felipe.balbi
2010-04-07 16:04 ` [RFC PATCH 31/37] cbus: retu-rtc: get rid of globals felipe.balbi
2010-04-07 16:04 ` [RFC PATCH 32/37] cbus: retu-rtc: move retu_rtc_barrier up on source code felipe.balbi
2010-04-07 16:04 ` [RFC PATCH 33/37] cbus: retu-rtc: make checkpatch.pl happy felipe.balbi
2010-04-07 16:04 ` [RFC PATCH 34/37] cbus: retu-rtc: switch to rtc class device felipe.balbi
2010-04-07 16:04 ` [RFC PATCH 35/37] cbus: retu-wdt: remove the platform_device felipe.balbi
2010-04-07 16:04 ` [RFC PATCH 36/37] cbus: retu-wtd: convert to platform_driver felipe.balbi
2010-04-07 16:04 ` [RFC PATCH 37/37] cbus: retu-wdt: misc cleanup on retu-wdt driver felipe.balbi
2010-04-08  9:23 ` [RFC PATCH 00/37] cbus patches Tony Lindgren
2010-04-24  0:45   ` Tony Lindgren
2010-04-26  5:25     ` Felipe Balbi

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1270656268-7034-12-git-send-email-felipe.balbi@nokia.com \
    --to=felipe.balbi@nokia.com \
    --cc=linux-omap@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.