Move per-transition delays from generic bit-bashing layer to i2c layer
authorMichael Brown <mcb30@etherboot.org>
Wed, 14 Jun 2006 00:20:35 +0000 (00:20 +0000)
committerMichael Brown <mcb30@etherboot.org>
Wed, 14 Jun 2006 00:20:35 +0000 (00:20 +0000)
(since SPI bit-bashing will require different delay semantics).

src/drivers/bitbash/bitbash.c
src/drivers/bitbash/i2c_bit.c
src/include/gpxe/bitbash.h

index 92abe1a..19add4c 100644 (file)
@@ -38,7 +38,6 @@
 void write_bit ( struct bit_basher *basher, unsigned int bit_id,
                 unsigned long data ) {
        basher->write ( basher, bit_id, ( data ? -1UL : 0 ) );
-       udelay ( basher->udelay );
 }
 
 /**
index cc73968..2551bb4 100644 (file)
  * 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
  */
-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 );
+       i2c_delay();
 }
 
 /**
@@ -48,9 +58,9 @@ setscl ( struct bit_basher *basher, int state ) {
  * @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 );
+       i2c_delay();
 }
 
 /**
@@ -59,8 +69,7 @@ setsda ( struct bit_basher *basher, int state ) {
  * @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 );
 }
 
@@ -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;
-       basher->udelay = I2C_UDELAY;
        i2c_stop ( basher );
 }
index 9bee391..f479b5a 100644 (file)
@@ -33,8 +33,6 @@ struct bit_basher {
         * @ret non-zero        Input is a logic 1
         */
        int ( * read ) ( struct bit_basher *basher, unsigned int bit_id );
-       /** Delay between subsequent calls to write(), in microseconds */
-       unsigned int udelay;
 };
 
 extern void write_bit ( struct bit_basher *basher, unsigned int bit_id,