aboutsummaryrefslogtreecommitdiffstats
path: root/driver
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@suse.de>2006-04-24 22:36:19 -0700
committerGreg Kroah-Hartman <gregkh@suse.de>2006-04-24 22:36:19 -0700
commite5cb7bc8503e718f6bfb0929fae876229e0067ac (patch)
tree4e39af48106be7d5e3b6ba757e90355cdc758744 /driver
parent915521c1df29905839fc5e372fc898bb4104f907 (diff)
downloadpatches-e5cb7bc8503e718f6bfb0929fae876229e0067ac.tar.gz
spi driver added
Diffstat (limited to 'driver')
-rw-r--r--driver/spi-spi_bitbang-clocking-fixes.patch90
1 files changed, 90 insertions, 0 deletions
diff --git a/driver/spi-spi_bitbang-clocking-fixes.patch b/driver/spi-spi_bitbang-clocking-fixes.patch
new file mode 100644
index 0000000000000..082ed054111f5
--- /dev/null
+++ b/driver/spi-spi_bitbang-clocking-fixes.patch
@@ -0,0 +1,90 @@
+From david-b@pacbell.net Thu Apr 6 23:03:36 2006
+From: David Brownell <david-b@pacbell.net>
+To: Greg KH <greg@kroah.com>
+Subject: SPI: spi_bitbang: clocking fixes
+Date: Thu, 6 Apr 2006 22:25:56 -0700
+Message-Id: <200604062225.56448.david-b@pacbell.net>
+
+This fixes two problems triggered by the MMC stack updating clocks:
+
+ - SPI masters driver should accept a max clock speed of zero; that's one
+ convention for marking idle devices. (Presumably that helps controllers
+ that don't autogate clocks to "off" when not in use.)
+
+ - There are more than 1000 nanoseconds per millisecond; setting the clock
+ down to 125 KHz now works properly.
+
+Showing once again that Zero (http://en.wikipedia.org/wiki/Zero) is still
+an inexhaustible number of bugs.
+
+Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+
+---
+ drivers/spi/spi_bitbang.c | 24 ++++++++++++++----------
+ 1 file changed, 14 insertions(+), 10 deletions(-)
+
+--- gregkh-2.6.orig/drivers/spi/spi_bitbang.c
++++ gregkh-2.6/drivers/spi/spi_bitbang.c
+@@ -167,9 +167,11 @@ int spi_bitbang_setup_transfer(struct sp
+ /* nsecs = (clock period)/2 */
+ if (!hz)
+ hz = spi->max_speed_hz;
+- cs->nsecs = (1000000000/2) / hz;
+- if (cs->nsecs > MAX_UDELAY_MS * 1000)
+- return -EINVAL;
++ if (hz) {
++ cs->nsecs = (1000000000/2) / hz;
++ if (cs->nsecs > (MAX_UDELAY_MS * 1000 * 1000))
++ return -EINVAL;
++ }
+
+ return 0;
+ }
+@@ -184,9 +186,6 @@ int spi_bitbang_setup(struct spi_device
+ struct spi_bitbang *bitbang;
+ int retval;
+
+- if (!spi->max_speed_hz)
+- return -EINVAL;
+-
+ bitbang = spi_master_get_devdata(spi->master);
+
+ /* REVISIT: some systems will want to support devices using lsb-first
+@@ -216,7 +215,7 @@ int spi_bitbang_setup(struct spi_device
+ if (retval < 0)
+ return retval;
+
+- dev_dbg(&spi->dev, "%s, mode %d, %u bits/w, %u nsec\n",
++ dev_dbg(&spi->dev, "%s, mode %d, %u bits/w, %u nsec/bit\n",
+ __FUNCTION__, spi->mode & (SPI_CPOL | SPI_CPHA),
+ spi->bits_per_word, 2 * cs->nsecs);
+
+@@ -405,6 +404,7 @@ int spi_bitbang_transfer(struct spi_devi
+ {
+ struct spi_bitbang *bitbang;
+ unsigned long flags;
++ int status = 0;
+
+ m->actual_length = 0;
+ m->status = -EINPROGRESS;
+@@ -414,11 +414,15 @@ int spi_bitbang_transfer(struct spi_devi
+ return -ESHUTDOWN;
+
+ spin_lock_irqsave(&bitbang->lock, flags);
+- list_add_tail(&m->queue, &bitbang->queue);
+- queue_work(bitbang->workqueue, &bitbang->work);
++ if (!spi->max_speed_hz)
++ status = -ENETDOWN;
++ else {
++ list_add_tail(&m->queue, &bitbang->queue);
++ queue_work(bitbang->workqueue, &bitbang->work);
++ }
+ spin_unlock_irqrestore(&bitbang->lock, flags);
+
+- return 0;
++ return status;
+ }
+ EXPORT_SYMBOL_GPL(spi_bitbang_transfer);
+