X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=drivers%2Fi2c%2Fsoft_i2c.c;h=69b5f42205f427255344ad55913896d426774464;hb=5eb522a68c3573419f42e321dccf4b01b584dbe8;hp=ed5f5b26949e837e1beff5000f2f0643eb7458f6;hpb=1b6275dfb173bd2edb8f208dd050d6f47ae39654;p=u-boot diff --git a/drivers/i2c/soft_i2c.c b/drivers/i2c/soft_i2c.c index ed5f5b2694..69b5f42205 100644 --- a/drivers/i2c/soft_i2c.c +++ b/drivers/i2c/soft_i2c.c @@ -30,9 +30,13 @@ #include #include #endif -#ifdef CONFIG_AT91RM9200 /* need this for the at91rm9200 */ +#if defined(CONFIG_AT91FAMILY) #include #include +#include +#ifdef CONFIG_AT91_LEGACY +#include +#endif #endif #ifdef CONFIG_IXP425 /* only valid for IXP425 */ #include @@ -45,20 +49,70 @@ #endif #include +#if defined(CONFIG_SOFT_I2C_GPIO_SCL) +# include + +# ifndef I2C_GPIO_SYNC +# define I2C_GPIO_SYNC +# endif + +# ifndef I2C_INIT +# define I2C_INIT \ + do { \ + gpio_request(CONFIG_SOFT_I2C_GPIO_SCL, "soft_i2c"); \ + gpio_request(CONFIG_SOFT_I2C_GPIO_SDA, "soft_i2c"); \ + } while (0) +# endif + +# ifndef I2C_ACTIVE +# define I2C_ACTIVE do { } while (0) +# endif + +# ifndef I2C_TRISTATE +# define I2C_TRISTATE do { } while (0) +# endif + +# ifndef I2C_READ +# define I2C_READ gpio_get_value(CONFIG_SOFT_I2C_GPIO_SDA) +# endif + +# ifndef I2C_SDA +# define I2C_SDA(bit) \ + do { \ + if (bit) \ + gpio_direction_input(CONFIG_SOFT_I2C_GPIO_SDA); \ + else \ + gpio_direction_output(CONFIG_SOFT_I2C_GPIO_SDA, 0); \ + I2C_GPIO_SYNC; \ + } while (0) +# endif + +# ifndef I2C_SCL +# define I2C_SCL(bit) \ + do { \ + gpio_direction_output(CONFIG_SOFT_I2C_GPIO_SCL, bit); \ + I2C_GPIO_SYNC; \ + } while (0) +# endif + +# ifndef I2C_DELAY +# define I2C_DELAY udelay(5) /* 1/4 I2C clock duration */ +# endif + +#endif + /* #define DEBUG_I2C */ #ifdef DEBUG_I2C DECLARE_GLOBAL_DATA_PTR; #endif - /*----------------------------------------------------------------------- * Definitions */ #define RETRIES 0 - #define I2C_ACK 0 /* PD_SDA level to ack a byte */ #define I2C_NOACK 1 /* PD_SDA level to noack a byte */ @@ -154,7 +208,6 @@ static void send_stop(void) I2C_TRISTATE; } - /*----------------------------------------------------------------------- * ack should be I2C_ACK or I2C_NOACK */ @@ -174,7 +227,6 @@ static void send_ack(int ack) I2C_DELAY; } - /*----------------------------------------------------------------------- * Send 8 bits and look for an acknowledgement. */ @@ -246,20 +298,6 @@ int i2c_set_bus_num(unsigned int bus) #endif return 0; } - -/* TODO: add 100/400k switching */ -unsigned int i2c_get_bus_speed(void) -{ - return CONFIG_SYS_I2C_SPEED; -} - -int i2c_set_bus_speed(unsigned int speed) -{ - if (speed != CONFIG_SYS_I2C_SPEED) - return -1; - - return 0; -} #endif /*-----------------------------------------------------------------------