diff options
author | Greg Kroah-Hartman <gregkh@suse.de> | 2006-04-24 22:36:19 -0700 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2006-04-24 22:36:19 -0700 |
commit | e5cb7bc8503e718f6bfb0929fae876229e0067ac (patch) | |
tree | 4e39af48106be7d5e3b6ba757e90355cdc758744 /driver | |
parent | 915521c1df29905839fc5e372fc898bb4104f907 (diff) | |
download | patches-e5cb7bc8503e718f6bfb0929fae876229e0067ac.tar.gz |
spi driver added
Diffstat (limited to 'driver')
-rw-r--r-- | driver/spi-spi_bitbang-clocking-fixes.patch | 90 |
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); + |