]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[bitbash] Add optional open() and close() methods for bit-bashing interfaces
authorMichael Brown <mcb30@ipxe.org>
Fri, 24 Aug 2012 16:25:14 +0000 (17:25 +0100)
committerMichael Brown <mcb30@ipxe.org>
Fri, 24 Aug 2012 16:26:10 +0000 (17:26 +0100)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/drivers/bitbash/i2c_bit.c
src/drivers/bitbash/spi_bit.c
src/include/ipxe/bitbash.h

index a72d145952dfc7435ef63530c208db47ed268935..decc8d80e7f4ffed3a40c6427fc105a651b0141a 100644 (file)
@@ -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;
 }
 
index 4a9af0a33acbf04b956152f7f41debce2c14390e..1b39d72fa4d3b8cad7c35ee52670ea76594365dc 100644 (file)
@@ -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;
 }
 
index 62b54b10f9ca9288ffb6e1c90216d408b98cb4b2..69d5d9e3ecbe9822bda1b4097b1bc8a353190228 100644 (file)
@@ -13,6 +13,18 @@ struct bit_basher;
 
 /** Bit-bashing operations */
 struct bit_basher_operations {
+       /**
+        * Open bit-bashing interface (optional)
+        *
+        * @v basher            Bit-bashing interface
+        */
+       void ( * open ) ( struct bit_basher *basher );
+       /**
+        * Close bit-bashing interface (optional)
+        *
+        * @v basher            Bit-bashing interface
+        */
+       void ( * close ) ( struct bit_basher *basher );
        /**
         * Set/clear output bit
         *
@@ -45,6 +57,26 @@ struct bit_basher {
        struct bit_basher_operations *op;
 };
 
+/**
+ * Open bit-bashing interface
+ *
+ * @v basher           Bit-bashing interface
+ */
+static inline void open_bit ( struct bit_basher *basher ) {
+       if ( basher->op->open )
+               basher->op->open ( basher );
+}
+
+/**
+ * Close bit-bashing interface
+ *
+ * @v basher           Bit-bashing interface
+ */
+static inline void close_bit ( struct bit_basher *basher ) {
+       if ( basher->op->close )
+               basher->op->close ( basher );
+}
+
 extern void write_bit ( struct bit_basher *basher, unsigned int bit_id,
                        unsigned long data );
 extern int read_bit ( struct bit_basher *basher, unsigned int bit_id );