public inbox for linux-omap@vger.kernel.org
 help / color / mirror / Atom feed
From: David Brownell <david-b@pacbell.net>
To: linux-omap-open-source@linux.omap.com
Subject: [PATCH 2.6.17-rc3-omap] omap_uwire byteswap bugfix
Date: Tue, 2 May 2006 22:15:48 -0700	[thread overview]
Message-ID: <200605022215.49062.david-b@pacbell.net> (raw)

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

I mentioned a while back that my original omap_uwire code had some bugs
that came from a bogus optimization ... here's a patch fixing them.
(Please merge...)

The consequence of that bogus optimization is that some SPI protocol
drivers (layered on top of this driver) would get data in strange byte
orders.  Hence for example an ads7846 issue that Juha and Imre noticed,
but were trying to fix at the wrong level.  (So in a moment I'll post
a separate patch for that driver.)

Other drivers layered on top of omap_uwire may also need to revisit
how they've handled byte order.

- Dave


[-- Attachment #2: omap-uwire.patch --]
[-- Type: text/x-diff, Size: 2442 bytes --]

Get rid of broken optimization in MicroWire driver:  don't try to morph
consecutive single-byte operations into one (faster) two-byte operation.
This resolves some byteswap problems.  (And consequently allows fixing
some bugs in at least the OMAP version of the ads7846 driver...)

Also, reject LSB-first device modes; this controller doesn't support them.

Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>

Index: osk/drivers/spi/omap_uwire.c
===================================================================
--- osk.orig/drivers/spi/omap_uwire.c	2006-04-22 14:41:22.000000000 -0700
+++ osk/drivers/spi/omap_uwire.c	2006-05-02 18:37:24.000000000 -0700
@@ -196,6 +196,9 @@ static int uwire_txrx(struct spi_device 
 	if (t->tx_buf && t->rx_buf)
 		return -EPERM;
 
+	if (!bits)
+		bits = 8;
+
 	w = spi->chip_select << 10;
 	w |= CS_CMD;
 
@@ -206,18 +209,15 @@ static int uwire_txrx(struct spi_device 
 
 		/* write one or two bytes at a time */
 		while (len >= 1) {
-			/* tx is msb-aligned */
+			/* tx bit 15 is first sent; we byteswap multibyte words
+			 * (msb-first) on the way out from memory.
+			 */
 			val = *buf++;
-			if (len > 1 && (!bits || bits > 8)) {
-				if (!bits)
-					bits = 16;
+			if (bits > 8) {
 				bytes = 2;
 				val |= *buf++ << 8;
-			} else {
-				if (!bits || bits > 8)
-					bits = 8;
+			} else
 				bytes = 1;
-			}
 			val <<= 16 - bits;
 
 #ifdef	VERBOSE
@@ -253,15 +253,10 @@ static int uwire_txrx(struct spi_device 
 
 		/* read one or two bytes at a time */
 		while (len) {
-			if (len > 1 && (!bits || bits > 8)) {
-				if (!bits)
-					bits = 16;
+			if (bits > 8) {
 				bytes = 2;
-			} else {
-				if (!bits || bits > 8)
-					bits = 8;
+			} else
 				bytes = 1;
-			}
 
 			/* start read */
 			val = START | w | (bits << 0);
@@ -275,7 +270,9 @@ static int uwire_txrx(struct spi_device 
 						RDRB, 0))
 				goto eio;
 
-			/* rx is lsb-aligned */
+			/* rx bit 0 is last received; multibyte words will
+			 * be properly byteswapped on the way to memory.
+			 */
 			val = uwire_read_reg(UWIRE_RDR);
 			val &= (1 << bits) - 1;
 			*buf++ = (u8) val;
@@ -320,6 +317,12 @@ static int uwire_setup(struct spi_device
 		goto done;
 	}
 
+	if (spi->mode & SPI_LSB_FIRST) {
+		pr_debug("%s: lsb first?\n", spi->dev.bus_id);
+		status = -EINVAL;
+		goto done;
+	}
+
 	/* mode 0..3, clock inverted separately;
 	 * standard nCS signaling;
 	 * don't treat DI=high as "not ready"

[-- Attachment #3: Type: text/plain, Size: 0 bytes --]



             reply	other threads:[~2006-05-03  5:15 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-05-03  5:15 David Brownell [this message]
2006-05-04 14:53 ` [PATCH 2.6.17-rc3-omap] omap_uwire byteswap bugfix Paul Mundt
2006-05-04 15:18   ` David Brownell
2006-05-04 17:07     ` David Brownell

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=200605022215.49062.david-b@pacbell.net \
    --to=david-b@pacbell.net \
    --cc=linux-omap-open-source@linux.omap.com \
    /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