summaryrefslogtreecommitdiffstats
path: root/src/drivers/nvs
diff options
context:
space:
mode:
authorMichael Brown2006-06-14 02:22:50 +0200
committerMichael Brown2006-06-14 02:22:50 +0200
commit3b51c719d305d4bfe8e99003f28d7cd48e0d9f4e (patch)
treec366d04ad10c78c82309d1f1bcff601caf13f277 /src/drivers/nvs
parentMove per-transition delays from generic bit-bashing layer to i2c layer (diff)
downloadipxe-3b51c719d305d4bfe8e99003f28d7cd48e0d9f4e.tar.gz
ipxe-3b51c719d305d4bfe8e99003f28d7cd48e0d9f4e.tar.xz
ipxe-3b51c719d305d4bfe8e99003f28d7cd48e0d9f4e.zip
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.c49
1 files changed, 19 insertions, 30 deletions
diff --git a/src/drivers/nvs/threewire.c b/src/drivers/nvs/threewire.c
index 4673606d..92f9a24b 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 );;
}