diff options
author | H. Peter Anvin <hpa@zytor.com> | 2010-02-03 16:06:41 -0800 |
---|---|---|
committer | H. Peter Anvin <hpa@zytor.com> | 2010-02-03 16:06:41 -0800 |
commit | addaeaeb3949d576c4e0eb5cfc133b7c3bcfa8fa (patch) | |
tree | 2ffea726dc494e87ecc9f506bc6a2bc9242730e3 /gpxe/src/drivers/nvs/threewire.c | |
parent | 5c0f48e49f8d7d084810ecf0b98a76aaebb44835 (diff) | |
parent | e7a5f95432132c8fc8f8ede39fda1d368002ddd8 (diff) | |
download | syslinux.git-addaeaeb3949d576c4e0eb5cfc133b7c3bcfa8fa.tar.gz syslinux.git-addaeaeb3949d576c4e0eb5cfc133b7c3bcfa8fa.tar.xz syslinux.git-addaeaeb3949d576c4e0eb5cfc133b7c3bcfa8fa.zip |
Merge branch 'master' into i915res
Diffstat (limited to 'gpxe/src/drivers/nvs/threewire.c')
-rw-r--r-- | gpxe/src/drivers/nvs/threewire.c | 55 |
1 files changed, 49 insertions, 6 deletions
diff --git a/gpxe/src/drivers/nvs/threewire.c b/gpxe/src/drivers/nvs/threewire.c index dbecf909..8e521389 100644 --- a/gpxe/src/drivers/nvs/threewire.c +++ b/gpxe/src/drivers/nvs/threewire.c @@ -16,7 +16,10 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +FILE_LICENCE ( GPL2_OR_LATER ); + #include <stddef.h> +#include <string.h> #include <assert.h> #include <unistd.h> #include <gpxe/threewire.h> @@ -40,13 +43,21 @@ int threewire_read ( struct nvs_device *nvs, unsigned int address, void *data, size_t len ) { struct spi_device *device = nvs_to_spi ( nvs ); struct spi_bus *bus = device->bus; + int rc; assert ( bus->mode == SPI_MODE_THREEWIRE ); - DBG ( "3wire %p reading %zd bytes at %04x\n", device, len, address ); + DBGC ( device, "3wire %p reading %zd bytes at %04x\n", + device, len, address ); - return bus->rw ( bus, device, THREEWIRE_READ, address, - NULL, data, len ); + if ( ( rc = bus->rw ( bus, device, THREEWIRE_READ, address, + NULL, data, len ) ) != 0 ) { + DBGC ( device, "3wire %p could not read: %s\n", + device, strerror ( rc ) ); + return rc; + } + + return 0; } /** @@ -66,17 +77,24 @@ int threewire_write ( struct nvs_device *nvs, unsigned int address, assert ( bus->mode == SPI_MODE_THREEWIRE ); - DBG ( "3wire %p writing %zd bytes at %04x\n", device, len, address ); + DBGC ( device, "3wire %p writing %zd bytes at %04x\n", + device, len, address ); /* Enable device for writing */ if ( ( rc = bus->rw ( bus, device, THREEWIRE_EWEN, - THREEWIRE_EWEN_ADDRESS, NULL, NULL, 0 ) ) != 0 ) + THREEWIRE_EWEN_ADDRESS, NULL, NULL, 0 ) ) != 0 ){ + DBGC ( device, "3wire %p could not enable writing: %s\n", + device, strerror ( rc ) ); return rc; + } /* Write data */ if ( ( rc = bus->rw ( bus, device, THREEWIRE_WRITE, address, - data, NULL, len ) ) != 0 ) + data, NULL, len ) ) != 0 ) { + DBGC ( device, "3wire %p could not write: %s\n", + device, strerror ( rc ) ); return rc; + } /* Our model of an SPI bus doesn't provide a mechanism for * "assert CS, wait for MISO to become high, so just wait for @@ -86,3 +104,28 @@ int threewire_write ( struct nvs_device *nvs, unsigned int address, return 0; } + +/** + * Autodetect device address length + * + * @v device SPI device + * @ret rc Return status code + */ +int threewire_detect_address_len ( struct spi_device *device ) { + struct nvs_device *nvs = &device->nvs; + int rc; + + DBGC ( device, "3wire %p autodetecting address length\n", device ); + + device->address_len = SPI_AUTODETECT_ADDRESS_LEN; + if ( ( rc = threewire_read ( nvs, 0, NULL, + ( 1 << nvs->word_len_log2 ) ) ) != 0 ) { + DBGC ( device, "3wire %p could not autodetect address " + "length: %s\n", device, strerror ( rc ) ); + return rc; + } + + DBGC ( device, "3wire %p autodetected address length %d\n", + device, device->address_len ); + return 0; +} |