From ab4f96e525fe082b0750867cc50d03becf018048 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Wed, 14 Jun 2006 00:20:35 +0000 Subject: [PATCH] Move per-transition delays from generic bit-bashing layer to i2c layer (since SPI bit-bashing will require different delay semantics). --- src/drivers/bitbash/bitbash.c | 1 - src/drivers/bitbash/i2c_bit.c | 22 +++++++++++++++------- src/include/gpxe/bitbash.h | 2 -- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/drivers/bitbash/bitbash.c b/src/drivers/bitbash/bitbash.c index 92abe1a7..19add4ce 100644 --- a/src/drivers/bitbash/bitbash.c +++ b/src/drivers/bitbash/bitbash.c @@ -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 ); } /** diff --git a/src/drivers/bitbash/i2c_bit.c b/src/drivers/bitbash/i2c_bit.c index cc73968b..2551bb4f 100644 --- a/src/drivers/bitbash/i2c_bit.c +++ b/src/drivers/bitbash/i2c_bit.c @@ -31,15 +31,25 @@ * 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 ); } diff --git a/src/include/gpxe/bitbash.h b/src/include/gpxe/bitbash.h index 9bee3913..f479b5ad 100644 --- a/src/include/gpxe/bitbash.h +++ b/src/include/gpxe/bitbash.h @@ -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,