diff options
author | Michael Brown <mcb30@etherboot.org> | 2006-06-14 00:22:50 +0000 |
---|---|---|
committer | Michael Brown <mcb30@etherboot.org> | 2006-06-14 00:22:50 +0000 |
commit | 3b51c719d305d4bfe8e99003f28d7cd48e0d9f4e (patch) | |
tree | c366d04ad10c78c82309d1f1bcff601caf13f277 /src/drivers/nvs | |
parent | ab4f96e525fe082b0750867cc50d03becf018048 (diff) | |
download | ipxe-3b51c719d305d4bfe8e99003f28d7cd48e0d9f4e.tar.gz |
Generalise three-wire interface to generic SPI interface.
Update rtl8139 driver to instantiate an SPI interface with a three-wire
device attached.
Diffstat (limited to 'src/drivers/nvs')
-rw-r--r-- | src/drivers/nvs/threewire.c | 49 |
1 files changed, 19 insertions, 30 deletions
diff --git a/src/drivers/nvs/threewire.c b/src/drivers/nvs/threewire.c index 4673606d9..92f9a24b7 100644 --- a/src/drivers/nvs/threewire.c +++ b/src/drivers/nvs/threewire.c @@ -16,53 +16,42 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include <timer.h> -#include <gpxe/nvs/threewire.h> +#include <stddef.h> +#include <byteswap.h> +#include <gpxe/spi.h> +#include <gpxe/threewire.h> /** @file * - * Three-wire serial interface + * Three-wire serial devices * */ /** * Read from a three-wire device * - * @v three Three-wire interface + * @v three Three-wire device * @v address Address * @ret data Data */ -unsigned long threewire_read ( struct threewire *three, +unsigned long threewire_read ( struct threewire_device *three, unsigned long address ) { - struct threewire_operations *ops = three->ops; - unsigned long command; - unsigned long data; - int i; + struct spi_interface *spi = three->spi; + uint32_t data; - ops->setcs ( three, 1 ); - - /* Send command and address */ - command = threewire_cmd_read ( three, address ); - for ( i = ( threewire_cmd_len ( three ) - 1 ) ; i >= 0 ; i-- ) { - ops->setdi ( three, ( command >> i ) & 0x1 ); - udelay ( three->udelay ); - ops->setsk ( three, 1 ); - udelay ( three->udelay ); - ops->setsk ( three, 0 ); - } + /* Activate chip select line */ + spi->select_slave ( spi, three->slave ); + /* Send command and address */ + data = cpu_to_le32 ( threewire_cmd_read ( three, address ) ); + spi->transfer ( spi, &data, NULL, threewire_cmd_len ( three ) ); + /* Read back data */ data = 0; - for ( i = three->datasize ; i ; i-- ) { - udelay ( three->udelay ); - ops->setsk ( three, 1 ); - udelay ( three->udelay ); - data <<= 1; - data |= ops->getdo ( three ); - ops->setsk ( three, 0 ); - } + spi->transfer ( spi, NULL, &data, three->datasize ); - ops->setcs ( three, 0 ); + /* Deactivate chip select line */ + spi->deselect_slave ( spi ); - return data; + return le32_to_cpu ( data );; } |