Move per-transition delays from generic bit-bashing layer to i2c layer
[people/xl0/gpxe.git] / src / drivers / bitbash / i2c_bit.c
index 9524d63..2551bb4 100644 (file)
  * that provides two lines: SCL (clock) and SDA (data).
  */
 
  * that provides two lines: SCL (clock) and SDA (data).
  */
 
+/**
+ * Delay between output state changes
+ *
+ * Max rated i2c speed (for the basic i2c protocol) is 100kbps,
+ * i.e. 200k clock transitions per second.
+ */
+static void i2c_delay ( void ) {
+       udelay ( I2C_UDELAY );
+}
+
 /**
  * Set state of I2C SCL line
  *
  * @v basher           Bit-bashing interface
  * @v state            New state of SCL
  */
 /**
  * Set state of I2C SCL line
  *
  * @v basher           Bit-bashing interface
  * @v state            New state of SCL
  */
-static inline __attribute__ (( always_inline )) void
-setscl ( struct bit_basher *basher, int state ) {
+static void setscl ( struct bit_basher *basher, int state ) {
        write_bit ( basher, I2C_BIT_SCL, state );
        write_bit ( basher, I2C_BIT_SCL, state );
+       i2c_delay();
 }
 
 /**
 }
 
 /**
@@ -48,9 +58,9 @@ setscl ( struct bit_basher *basher, int state ) {
  * @v basher           Bit-bashing interface
  * @v state            New state of SDA
  */
  * @v basher           Bit-bashing interface
  * @v state            New state of SDA
  */
-static inline __attribute__ (( always_inline )) void
-setsda ( struct bit_basher *basher, int state ) {
+static void setsda ( struct bit_basher *basher, int state ) {
        write_bit ( basher, I2C_BIT_SDA, state );
        write_bit ( basher, I2C_BIT_SDA, state );
+       i2c_delay();
 }
 
 /**
 }
 
 /**
@@ -59,8 +69,7 @@ setsda ( struct bit_basher *basher, int state ) {
  * @v basher           Bit-bashing interface
  * @ret state          State of SDA
  */
  * @v basher           Bit-bashing interface
  * @ret state          State of SDA
  */
-static inline __attribute__ (( always_inline )) int
-getsda ( struct bit_basher *basher ) {
+static int getsda ( struct bit_basher *basher ) {
        return read_bit ( basher, I2C_BIT_SDA );
 }
 
        return read_bit ( basher, I2C_BIT_SDA );
 }
 
@@ -153,7 +162,7 @@ static uint8_t i2c_recv_byte ( struct bit_basher *basher ) {
        /* Receive byte */
        for ( i = 8 ; i ; i-- ) {
                value <<= 1;
        /* Receive byte */
        for ( i = 8 ; i ; i-- ) {
                value <<= 1;
-               value |= i2c_recv_bit ( basher );
+               value |= ( i2c_recv_bit ( basher ) & 0x1 );
        }
 
        /* Send NACK */
        }
 
        /* Send NACK */
@@ -308,6 +317,5 @@ void init_i2c_bit_basher ( struct i2c_bit_basher *i2cbit ) {
        assert ( basher->write != NULL );
        i2cbit->i2c.read = i2c_bit_read;
        i2cbit->i2c.write = i2c_bit_write;
        assert ( basher->write != NULL );
        i2cbit->i2c.read = i2c_bit_read;
        i2cbit->i2c.write = i2c_bit_write;
-       basher->udelay = I2C_UDELAY;
        i2c_stop ( basher );
 }
        i2c_stop ( basher );
 }