diff options
| author | Heiko Schocher <hs@denx.de> | 2013-01-29 08:53:15 +0100 | 
|---|---|---|
| committer | Heiko Schocher <hs@denx.de> | 2013-07-23 05:54:29 +0200 | 
| commit | ea818dbbcd59300b56014ac2d67798a54994eb9b (patch) | |
| tree | fbdedc80f785873f96e79893a1a813504af57580 /drivers/i2c/soft_i2c.c | |
| parent | 3f4978c713255c8406875fbdf23ffed1129bc44b (diff) | |
| download | olio-uboot-2014.01-ea818dbbcd59300b56014ac2d67798a54994eb9b.tar.xz olio-uboot-2014.01-ea818dbbcd59300b56014ac2d67798a54994eb9b.zip | |
i2c, soft-i2c: switch to new multibus/multiadapter support
- added to soft_i2c driver new multibus/multiadpater support
- adapted all config files, which uses this driver
Signed-off-by: Heiko Schocher <hs@denx.de>
Cc: Simon Glass <sjg@chromium.org>
Cc: Stephen Warren <swarren@wwwdotorg.org>
Diffstat (limited to 'drivers/i2c/soft_i2c.c')
| -rw-r--r-- | drivers/i2c/soft_i2c.c | 104 | 
1 files changed, 57 insertions, 47 deletions
| diff --git a/drivers/i2c/soft_i2c.c b/drivers/i2c/soft_i2c.c index ae3c57392..12693041d 100644 --- a/drivers/i2c/soft_i2c.c +++ b/drivers/i2c/soft_i2c.c @@ -1,4 +1,8 @@  /* + * (C) Copyright 2009 + * Heiko Schocher, DENX Software Engineering, hs@denx.de. + * Changes for multibus/multiadapter I2C support. + *   * (C) Copyright 2001, 2002   * Wolfgang Denk, DENX Software Engineering, wd@denx.de.   * @@ -103,14 +107,30 @@  /* #define	DEBUG_I2C	*/ -#ifdef DEBUG_I2C  DECLARE_GLOBAL_DATA_PTR; + +#ifndef	I2C_SOFT_DECLARATIONS +# if defined(CONFIG_MPC8260) +#  define I2C_SOFT_DECLARATIONS volatile ioport_t *iop = \ +		ioport_addr((immap_t *)CONFIG_SYS_IMMR, I2C_PORT); +# elif defined(CONFIG_8xx) +#  define I2C_SOFT_DECLARATIONS	volatile immap_t *immr = \ +		(immap_t *)CONFIG_SYS_IMMR; +# else +#  define I2C_SOFT_DECLARATIONS +# endif +#endif + +#if !defined(CONFIG_SYS_SOFT_I2C_SPEED) +#define CONFIG_SYS_SOFT_I2C_SPEED CONFIG_SYS_I2C_SPEED +#endif +#if !defined(CONFIG_SYS_SOFT_I2C_SLAVE) +#define CONFIG_SYS_SOFT_I2C_SLAVE CONFIG_SYS_I2C_SLAVE  #endif  /*-----------------------------------------------------------------------   * Definitions   */ -  #define RETRIES		0  #define I2C_ACK		0		/* PD_SDA level to ack a byte */ @@ -125,10 +145,6 @@ DECLARE_GLOBAL_DATA_PTR;  #define PRINTD(fmt,args...)  #endif -#if defined(CONFIG_I2C_MULTI_BUS) -static unsigned int i2c_bus_num __attribute__ ((section (".data"))) = 0; -#endif /* CONFIG_I2C_MULTI_BUS */ -  /*-----------------------------------------------------------------------   * Local functions   */ @@ -267,39 +283,6 @@ static int write_byte(uchar data)  	return(nack);	/* not a nack is an ack */  } -#if defined(CONFIG_I2C_MULTI_BUS) -/* - * Functions for multiple I2C bus handling - */ -unsigned int i2c_get_bus_num(void) -{ -	return i2c_bus_num; -} - -int i2c_set_bus_num(unsigned int bus) -{ -#if defined(CONFIG_I2C_MUX) -	if (bus < CONFIG_SYS_MAX_I2C_BUS) { -		i2c_bus_num = bus; -	} else { -		int	ret; - -		ret = i2x_mux_select_mux(bus); -		i2c_init_board(); -		if (ret == 0) -			i2c_bus_num = bus; -		else -			return ret; -	} -#else -	if (bus >= CONFIG_SYS_MAX_I2C_BUS) -		return -1; -	i2c_bus_num = bus; -#endif -	return 0; -} -#endif -  /*-----------------------------------------------------------------------   * if ack == I2C_ACK, ACK the byte so can continue reading, else   * send I2C_NOACK to end the read. @@ -330,14 +313,10 @@ static uchar read_byte(int ack)  	return(data);  } -/*=====================================================================*/ -/*                         Public Functions                            */ -/*=====================================================================*/ -  /*-----------------------------------------------------------------------   * Initialization   */ -void i2c_init (int speed, int slaveaddr) +static void soft_i2c_init(struct i2c_adapter *adap, int speed, int slaveaddr)  {  #if defined(CONFIG_SYS_I2C_INIT_BOARD)  	/* call board specific i2c bus reset routine before accessing the   */ @@ -360,7 +339,7 @@ void i2c_init (int speed, int slaveaddr)   * completion of EEPROM writes since the chip stops responding until   * the write completes (typically 10mSec).   */ -int i2c_probe(uchar addr) +static int soft_i2c_probe(struct i2c_adapter *adap, uint8_t addr)  {  	int rc; @@ -378,7 +357,8 @@ int i2c_probe(uchar addr)  /*-----------------------------------------------------------------------   * Read bytes   */ -int  i2c_read(uchar chip, uint addr, int alen, uchar *buffer, int len) +static int  soft_i2c_read(struct i2c_adapter *adap, uchar chip, uint addr, +			int alen, uchar *buffer, int len)  {  	int shift;  	PRINTD("i2c_read: chip %02X addr %02X alen %d buffer %p len %d\n", @@ -452,7 +432,8 @@ int  i2c_read(uchar chip, uint addr, int alen, uchar *buffer, int len)  /*-----------------------------------------------------------------------   * Write bytes   */ -int  i2c_write(uchar chip, uint addr, int alen, uchar *buffer, int len) +static int  soft_i2c_write(struct i2c_adapter *adap, uchar chip, uint addr, +			int alen, uchar *buffer, int len)  {  	int shift, failures = 0; @@ -482,3 +463,32 @@ int  i2c_write(uchar chip, uint addr, int alen, uchar *buffer, int len)  	send_stop();  	return(failures);  } + +/* + * Register soft i2c adapters + */ +U_BOOT_I2C_ADAP_COMPLETE(soft0, soft_i2c_init, soft_i2c_probe, +			 soft_i2c_read, soft_i2c_write, NULL, +			 CONFIG_SYS_I2C_SOFT_SPEED, CONFIG_SYS_I2C_SOFT_SLAVE, +			 0) +#if defined(I2C_SOFT_DECLARATIONS2) +U_BOOT_I2C_ADAP_COMPLETE(soft1, soft_i2c_init, soft_i2c_probe, +			 soft_i2c_read, soft_i2c_write, NULL, +			 CONFIG_SYS_I2C_SOFT_SPEED_2, +			 CONFIG_SYS_I2C_SOFT_SLAVE_2, +			 1) +#endif +#if defined(I2C_SOFT_DECLARATIONS3) +U_BOOT_I2C_ADAP_COMPLETE(soft2, soft_i2c_init, soft_i2c_probe, +			 soft_i2c_read, soft_i2c_write, NULL, +			 CONFIG_SYS_I2C_SOFT_SPEED_3, +			 CONFIG_SYS_I2C_SOFT_SLAVE_3, +			 2) +#endif +#if defined(I2C_SOFT_DECLARATIONS4) +U_BOOT_I2C_ADAP_COMPLETE(soft3, soft_i2c_init, soft_i2c_probe, +			 soft_i2c_read, soft_i2c_write, NULL, +			 CONFIG_SYS_I2C_SOFT_SPEED_4, +			 CONFIG_SYS_I2C_SOFT_SLAVE_4, +			 3) +#endif |