linux-spi.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Magnus Damm <magnus.damm@gmail.com>
To: Grant Likely <grant.likely@secretlab.ca>
Cc: spi-devel-general@lists.sourceforge.net,
	dbrownell@users.sourceforge.net, linux-kernel@vger.kernel.org,
	akpm@linux-foundation.org
Subject: Re: [PATCH] spi: Allow using spi_bitbang_setup() with custom txrx_bufs()
Date: Thu, 26 Nov 2009 15:47:17 +0900	[thread overview]
Message-ID: <aec7e5c30911252247i344f5bf3pb0240b9c23878bf5@mail.gmail.com> (raw)
In-Reply-To: <fa686aa40911251415q624f3610n92cbc20437b12bf6@mail.gmail.com>

[-- Attachment #1: Type: text/plain, Size: 1761 bytes --]

Hi Grant,

On Thu, Nov 26, 2009 at 7:15 AM, Grant Likely <grant.likely@secretlab.ca> wrote:
> On Wed, Nov 25, 2009 at 1:26 AM, Magnus Damm <magnus.damm@gmail.com> wrote:
>> This patch modifies the shared spi bitbanging code
>> to allow using spi_bitbang_setup() even though the
>> txrx_word[] callbacks are unset. Useful for drivers
>> that want to make use of spi_bitbang_setup() but
>> have their own txrx_bufs() callback.

>> @@ -196,9 +205,11 @@ int spi_bitbang_setup(struct spi_device
>>        }
>>
>>        /* per-word shift register access, in hardware or bitbanging */
>> -       cs->txrx_word = bitbang->txrx_word[spi->mode & (SPI_CPOL|SPI_CPHA)];
>> -       if (!cs->txrx_word)
>> -               return -EINVAL;
>> +       if (bitbang->txrx_bufs == spi_bitbang_bufs) {
>> +               cs->txrx_word = bitbang->txrx_word[spi->mode & mode_mask];
>> +               if (!cs->txrx_word)
>> +                       return -EINVAL;
>> +       }
>
> Hmmm... this smells like an ugly hack to me.  It seems to me that if
> some bitbang backend drivers don't want this code, then it should be
> encoded into a callback so it can be overridden.  Thoughts.

Yeah, it's far from clean. I want to make use of spi_bitbang_setup()
in my MSIOF driver, but I want to avoid dummy txtx_word[] callbacks
that will be unused since i'm using a driver specific
bitbang->txrx_bufs function.

I guess the attached patch is slightly cleaner? I like the idea of
letting bitbang drivers use shared code for
spi_bitbang_setup()/spi_bitbang_cleanup() with their private
setup_transfer() function which in turn calls
spi_bitbang_setup_transfer(). My impression is that there's quite a
bit of duplicated setup()/cleanup() code.

/ magnus

[-- Attachment #2: linux-2.6.33-pre-spi-word-mode-setup-20091126.patch --]
[-- Type: application/octet-stream, Size: 3503 bytes --]

From: Magnus Damm <damm@opensource.se>

Signed-off-by: Magnus Damm <damm@opensource.se>
---

 drivers/spi/spi_bitbang.c       |   37 ++++++++++++++++++++++++++++++-------
 drivers/spi/spi_gpio.c          |    2 +-
 include/linux/spi/spi_bitbang.h |    1 +
 3 files changed, 32 insertions(+), 8 deletions(-)

--- 0001/drivers/spi/spi_bitbang.c
+++ work/drivers/spi/spi_bitbang.c	2009-11-26 14:59:53.000000000 +0900
@@ -177,7 +177,7 @@ int spi_bitbang_setup_transfer(struct sp
 EXPORT_SYMBOL_GPL(spi_bitbang_setup_transfer);
 
 /**
- * spi_bitbang_setup - default setup for per-word I/O loops
+ * spi_bitbang_setup - setup function when bitbang->txrx_word[] are unused
  */
 int spi_bitbang_setup(struct spi_device *spi)
 {
@@ -195,11 +195,6 @@ int spi_bitbang_setup(struct spi_device 
 		spi->controller_state = cs;
 	}
 
-	/* per-word shift register access, in hardware or bitbanging */
-	cs->txrx_word = bitbang->txrx_word[spi->mode & (SPI_CPOL|SPI_CPHA)];
-	if (!cs->txrx_word)
-		return -EINVAL;
-
 	retval = bitbang->setup_transfer(spi, NULL);
 	if (retval < 0)
 		return retval;
@@ -224,6 +219,32 @@ int spi_bitbang_setup(struct spi_device 
 EXPORT_SYMBOL_GPL(spi_bitbang_setup);
 
 /**
+ * spi_bitbang_setup_word_mode - default setup for per-word I/O loops
+ */
+int spi_bitbang_setup_word_mode(struct spi_device *spi)
+{
+	struct spi_bitbang_cs	*cs;
+	struct spi_bitbang	*bitbang;
+	void			*txrx_word;
+	int			retval;
+
+	bitbang = spi_master_get_devdata(spi->master);
+
+	/* per-word shift register access, in hardware or bitbanging */
+	txrx_word = bitbang->txrx_word[spi->mode & (SPI_CPOL | SPI_CPHA)];
+	if (!txrx_word)
+		return -EINVAL;
+
+	retval = spi_bitbang_setup(spi);
+	if (!retval) {
+		cs = spi->controller_state;
+		cs->txrx_word = txrx_word;
+	}
+	return retval;
+}
+EXPORT_SYMBOL_GPL(spi_bitbang_setup_word_mode);
+
+/**
  * spi_bitbang_cleanup - default cleanup for per-word I/O loops
  */
 void spi_bitbang_cleanup(struct spi_device *spi)
@@ -455,6 +476,8 @@ int spi_bitbang_start(struct spi_bitbang
 
 	if (!bitbang->master->transfer)
 		bitbang->master->transfer = spi_bitbang_transfer;
+
+	/* "word mode" when spi_bitbang_bufs() are used */
 	if (!bitbang->txrx_bufs) {
 		bitbang->use_dma = 0;
 		bitbang->txrx_bufs = spi_bitbang_bufs;
@@ -462,7 +485,7 @@ int spi_bitbang_start(struct spi_bitbang
 			if (!bitbang->setup_transfer)
 				bitbang->setup_transfer =
 					 spi_bitbang_setup_transfer;
-			bitbang->master->setup = spi_bitbang_setup;
+			bitbang->master->setup = spi_bitbang_setup_word_mode;
 			bitbang->master->cleanup = spi_bitbang_cleanup;
 		}
 	} else if (!bitbang->master->setup)
--- 0001/drivers/spi/spi_gpio.c
+++ work/drivers/spi/spi_gpio.c	2009-11-26 14:53:37.000000000 +0900
@@ -201,7 +201,7 @@ static int spi_gpio_setup(struct spi_dev
 		}
 	}
 	if (!status)
-		status = spi_bitbang_setup(spi);
+		status = spi_bitbang_setup_word_mode(spi);
 	if (status) {
 		if (!spi->controller_state && cs != SPI_GPIO_NO_CHIPSELECT)
 			gpio_free(cs);
--- 0001/include/linux/spi/spi_bitbang.h
+++ work/include/linux/spi/spi_bitbang.h	2009-11-26 14:54:08.000000000 +0900
@@ -58,6 +58,7 @@ struct spi_bitbang {
  * methods, if you like.
  */
 extern int spi_bitbang_setup(struct spi_device *spi);
+extern int spi_bitbang_setup_word_mode(struct spi_device *spi);
 extern void spi_bitbang_cleanup(struct spi_device *spi);
 extern int spi_bitbang_transfer(struct spi_device *spi, struct spi_message *m);
 extern int spi_bitbang_setup_transfer(struct spi_device *spi,

  reply	other threads:[~2009-11-26  6:47 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-11-25  8:26 [PATCH] spi: Allow using spi_bitbang_setup() with custom txrx_bufs() Magnus Damm
2009-11-25 22:15 ` Grant Likely
2009-11-26  6:47   ` Magnus Damm [this message]
2009-11-26  7:21     ` Grant Likely
2009-11-26  7:50       ` Magnus Damm
2009-11-26 14:45         ` Grant Likely

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=aec7e5c30911252247i344f5bf3pb0240b9c23878bf5@mail.gmail.com \
    --to=magnus.damm@gmail.com \
    --cc=akpm@linux-foundation.org \
    --cc=dbrownell@users.sourceforge.net \
    --cc=grant.likely@secretlab.ca \
    --cc=linux-kernel@vger.kernel.org \
    --cc=spi-devel-general@lists.sourceforge.net \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).