summaryrefslogtreecommitdiffstats
path: root/src/drivers/bitbash
diff options
context:
space:
mode:
authorMichael Brown2012-08-24 18:25:14 +0200
committerMichael Brown2012-08-24 18:26:10 +0200
commitd1949f2737e44b1e0cdc6695ab867bc70002fcea (patch)
treeda270a66cf1429e04718f1b1f5aa7ed27395b595 /src/drivers/bitbash
parent[realtek] Forcibly enable advertisement of 1000Mbps speeds (diff)
downloadipxe-d1949f2737e44b1e0cdc6695ab867bc70002fcea.tar.gz
ipxe-d1949f2737e44b1e0cdc6695ab867bc70002fcea.tar.xz
ipxe-d1949f2737e44b1e0cdc6695ab867bc70002fcea.zip
[bitbash] Add optional open() and close() methods for bit-bashing interfaces
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/drivers/bitbash')
-rw-r--r--src/drivers/bitbash/i2c_bit.c11
-rw-r--r--src/drivers/bitbash/spi_bit.c6
2 files changed, 16 insertions, 1 deletions
diff --git a/src/drivers/bitbash/i2c_bit.c b/src/drivers/bitbash/i2c_bit.c
index a72d1459..decc8d80 100644
--- a/src/drivers/bitbash/i2c_bit.c
+++ b/src/drivers/bitbash/i2c_bit.c
@@ -239,6 +239,7 @@ static int i2c_reset ( struct bit_basher *basher ) {
* pull SDA low while SCL is high (which creates a start
* condition).
*/
+ open_bit ( basher );
setscl ( basher, 0 );
setsda ( basher, 1 );
for ( i = 0 ; i < I2C_RESET_MAX_CYCLES ; i++ ) {
@@ -251,6 +252,7 @@ static int i2c_reset ( struct bit_basher *basher ) {
i2c_stop ( basher );
DBGC ( basher, "I2CBIT %p reset after %d attempts\n",
basher, ( i + 1 ) );
+ close_bit ( basher );
return 0;
}
setscl ( basher, 0 );
@@ -258,6 +260,7 @@ static int i2c_reset ( struct bit_basher *basher ) {
DBGC ( basher, "I2CBIT %p could not reset after %d attempts\n",
basher, i );
+ close_bit ( basher );
return -ETIMEDOUT;
}
@@ -285,6 +288,8 @@ static int i2c_bit_read ( struct i2c_interface *i2c,
DBGC ( basher, "I2CBIT %p reading from device %x: ",
basher, i2cdev->dev_addr );
+ open_bit ( basher );
+
for ( ; ; data++, offset++ ) {
/* Select device for writing */
@@ -312,6 +317,7 @@ static int i2c_bit_read ( struct i2c_interface *i2c,
DBGC ( basher, "%s\n", ( rc ? "failed" : "" ) );
i2c_stop ( basher );
+ close_bit ( basher );
return rc;
}
@@ -339,6 +345,8 @@ static int i2c_bit_write ( struct i2c_interface *i2c,
DBGC ( basher, "I2CBIT %p writing to device %x: ",
basher, i2cdev->dev_addr );
+ open_bit ( basher );
+
for ( ; ; data++, offset++ ) {
/* Select device for writing */
@@ -359,9 +367,10 @@ static int i2c_bit_write ( struct i2c_interface *i2c,
if ( ( rc = i2c_send_byte ( basher, *data ) ) != 0 )
break;
}
-
+
DBGC ( basher, "%s\n", ( rc ? "failed" : "" ) );
i2c_stop ( basher );
+ close_bit ( basher );
return rc;
}
diff --git a/src/drivers/bitbash/spi_bit.c b/src/drivers/bitbash/spi_bit.c
index 4a9af0a3..1b39d72f 100644
--- a/src/drivers/bitbash/spi_bit.c
+++ b/src/drivers/bitbash/spi_bit.c
@@ -163,6 +163,9 @@ static int spi_bit_rw ( struct spi_bus *bus, struct spi_device *device,
uint32_t tmp_address;
uint32_t tmp_address_detect;
+ /* Open bit-bashing interface */
+ open_bit ( &spibit->basher );
+
/* Deassert chip select to reset specified slave */
spi_bit_set_slave_select ( spibit, device->slave, DESELECT_SLAVE );
@@ -214,6 +217,9 @@ static int spi_bit_rw ( struct spi_bus *bus, struct spi_device *device,
/* Deassert chip select on specified slave */
spi_bit_set_slave_select ( spibit, device->slave, DESELECT_SLAVE );
+ /* Close bit-bashing interface */
+ close_bit ( &spibit->basher );
+
return 0;
}