mtd: sst25l: fix multi-part messages with broken spi masters
authorH Hartley Sweeten <hartleys@visionengravers.com>
Thu, 29 Apr 2010 18:34:24 +0000 (13:34 -0500)
committerDavid Woodhouse <David.Woodhouse@intel.com>
Fri, 14 May 2010 00:52:24 +0000 (01:52 +0100)
commit0ffe0ce36e07185c693e3ff06ab5b3b6c30780ee
tree10fe97a074fae701e167a02024d0252c5e837b52
parent46f3e88bd9da010e76a9049d55cf9013560b5903
mtd: sst25l: fix multi-part messages with broken spi masters

Some SPI masters (ep93xx) have limitations when using the SFRMOUT
signal for the spi device chip select.  The SFRMOUT signal is
only asserted as long as the spi transmit fifo contains data.  As
soon as the last bit is clocked into the receive fifo it gets
deasserted.

The functions sst25l_status and sst25l_match_device use the API
function spi_write_then_read to write a command to the flash then
read the response back.  This API function creates a two part spi
message for the write then read.  When this message is transferred
the SFRMOUT signal ends up getting deasserted after the command
phase.  This causes the command to get aborted by the device so
the read phase returns invalid data.

By changing sst25l_status and sst25l_match_device to use a single
transfer synchronous message, the SFRMOUT signal stays asserted
during the entire message so the correct data always gets returned.

This change will have no effect on SPI masters which use a chip
select mechanism (GPIO's, etc.) which does stay asserted correctly.
As a bonus, the single transfer synchronous messages complete faster
than multi-part messages.

Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
drivers/mtd/devices/sst25l.c