diff options
| -rw-r--r-- | board/keymile/common/common.c | 71 | ||||
| -rw-r--r-- | board/keymile/common/common.h | 3 | ||||
| -rw-r--r-- | board/keymile/km83xx/Makefile | 2 | ||||
| -rw-r--r-- | board/keymile/km83xx/km83xx_i2c.c | 88 | 
4 files changed, 98 insertions, 66 deletions
diff --git a/board/keymile/common/common.c b/board/keymile/common/common.c index 612dd2a05..f26230648 100644 --- a/board/keymile/common/common.c +++ b/board/keymile/common/common.c @@ -39,7 +39,10 @@  #include <i2c.h>  #endif +#if !defined(CONFIG_MPC83xx)  static void i2c_write_start_seq(void); +#endif +  DECLARE_GLOBAL_DATA_PTR;  /* @@ -89,9 +92,7 @@ int set_km_env(void)  	return 0;  } -#define DELAY_ABORT_SEQ		62  /* @200kHz 9 clocks = 44us, 62us is ok */ -#define DELAY_HALF_PERIOD	(500 / (CONFIG_SYS_I2C_SPEED / 1000)) - +#if defined(CONFIG_SYS_I2C_INIT_BOARD)  #if !defined(CONFIG_MPC83xx)  static void i2c_write_start_seq(void)  { @@ -171,68 +172,6 @@ int i2c_make_abort(void)  #endif  	return ret;  } -#endif /* !MPC83xx */ - -#if defined(CONFIG_MPC83xx) -static void i2c_write_start_seq(void) -{ -	struct fsl_i2c *dev; -	dev = (struct fsl_i2c *) (CONFIG_SYS_IMMR + CONFIG_SYS_I2C_OFFSET); -	udelay(DELAY_ABORT_SEQ); -	out_8(&dev->cr, (I2C_CR_MEN | I2C_CR_MSTA)); -	udelay(DELAY_ABORT_SEQ); -	out_8(&dev->cr, (I2C_CR_MEN)); -} - -int i2c_make_abort(void) -{ -	struct fsl_i2c *dev; -	dev = (struct fsl_i2c *) (CONFIG_SYS_IMMR + CONFIG_SYS_I2C_OFFSET); -	uchar	dummy; -	uchar   last; -	int     nbr_read = 0; -	int     i = 0; -	int	    ret = 0; - -	/* wait after each operation to finsh with a delay */ -	out_8(&dev->cr, (I2C_CR_MSTA)); -	udelay(DELAY_ABORT_SEQ); -	out_8(&dev->cr, (I2C_CR_MEN | I2C_CR_MSTA)); -	udelay(DELAY_ABORT_SEQ); -	dummy = in_8(&dev->dr); -	udelay(DELAY_ABORT_SEQ); -	last = in_8(&dev->dr); -	nbr_read++; - -	/* -	 * do read until the last bit is 1, but stop if the full eeprom is -	 * read. -	 */ -	while (((last & 0x01) != 0x01) && -		(nbr_read < CONFIG_SYS_IVM_EEPROM_MAX_LEN)) { -		udelay(DELAY_ABORT_SEQ); -		last = in_8(&dev->dr); -		nbr_read++; -	} -	if ((last & 0x01) != 0x01) -		ret = -2; -	if ((last != 0xff) || (nbr_read > 1)) -		printf("[INFO] i2c abort after %d bytes (0x%02x)\n", -			nbr_read, last); -	udelay(DELAY_ABORT_SEQ); -	out_8(&dev->cr, (I2C_CR_MEN)); -	udelay(DELAY_ABORT_SEQ); -	/* clear status reg */ -	out_8(&dev->sr, 0); - -	for (i = 0; i < 5; i++) -		i2c_write_start_seq(); -	if (ret != 0) -		printf("[ERROR] i2c abort failed after %d bytes (0x%02x)\n", -			nbr_read, last); - -	return ret; -}  #endif  /** @@ -244,6 +183,8 @@ void i2c_init_board(void)  	/* Now run the AbortSequence() */  	i2c_make_abort();  } +#endif +  #if !defined(MACH_TYPE_KM_KIRKWOOD)  int ethernet_present(void) diff --git a/board/keymile/common/common.h b/board/keymile/common/common.h index 0fb19cf33..6c1f6400c 100644 --- a/board/keymile/common/common.h +++ b/board/keymile/common/common.h @@ -136,6 +136,9 @@ int fdt_get_node_and_value(void *blob,  				char *propname,  				void **var); +#define DELAY_ABORT_SEQ		62  /* @200kHz 9 clocks = 44us, 62us is ok */ +#define DELAY_HALF_PERIOD	(500 / (CONFIG_SYS_I2C_SPEED / 1000)) +  int i2c_soft_read_pin(void);  int i2c_make_abort(void);  #endif /* __KEYMILE_COMMON_H */ diff --git a/board/keymile/km83xx/Makefile b/board/keymile/km83xx/Makefile index 72945e283..472768a66 100644 --- a/board/keymile/km83xx/Makefile +++ b/board/keymile/km83xx/Makefile @@ -28,7 +28,7 @@ endif  LIB	= $(obj)lib$(BOARD).o -COBJS	+= $(BOARD).o ../common/common.o ../common/ivm.o +COBJS	+= $(BOARD).o ../common/common.o ../common/ivm.o $(BOARD)_i2c.o  SRCS	:= $(SOBJS:.o=.S) $(COBJS:.o=.c)  OBJS	:= $(addprefix $(obj),$(COBJS)) diff --git a/board/keymile/km83xx/km83xx_i2c.c b/board/keymile/km83xx/km83xx_i2c.c new file mode 100644 index 000000000..be177753c --- /dev/null +++ b/board/keymile/km83xx/km83xx_i2c.c @@ -0,0 +1,88 @@ +/* + * (C) Copyright 2011 + * Holger Brunck, Keymile GmbH Hannover, holger.brunck@keymile.com + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#include <common.h> +#include <i2c.h> +#include <asm/io.h> +#include <linux/ctype.h> +#include "../common/common.h" + +static void i2c_write_start_seq(void) +{ +	struct fsl_i2c *dev; +	dev = (struct fsl_i2c *) (CONFIG_SYS_IMMR + CONFIG_SYS_I2C_OFFSET); +	udelay(DELAY_ABORT_SEQ); +	out_8(&dev->cr, (I2C_CR_MEN | I2C_CR_MSTA)); +	udelay(DELAY_ABORT_SEQ); +	out_8(&dev->cr, (I2C_CR_MEN)); +} + +int i2c_make_abort(void) +{ +	struct fsl_i2c *dev; +	dev = (struct fsl_i2c *) (CONFIG_SYS_IMMR + CONFIG_SYS_I2C_OFFSET); +	uchar	dummy; +	uchar   last; +	int     nbr_read = 0; +	int     i = 0; +	int	    ret = 0; + +	/* wait after each operation to finsh with a delay */ +	out_8(&dev->cr, (I2C_CR_MSTA)); +	udelay(DELAY_ABORT_SEQ); +	out_8(&dev->cr, (I2C_CR_MEN | I2C_CR_MSTA)); +	udelay(DELAY_ABORT_SEQ); +	dummy = in_8(&dev->dr); +	udelay(DELAY_ABORT_SEQ); +	last = in_8(&dev->dr); +	nbr_read++; + +	/* +	 * do read until the last bit is 1, but stop if the full eeprom is +	 * read. +	 */ +	while (((last & 0x01) != 0x01) && +		(nbr_read < CONFIG_SYS_IVM_EEPROM_MAX_LEN)) { +		udelay(DELAY_ABORT_SEQ); +		last = in_8(&dev->dr); +		nbr_read++; +	} +	if ((last & 0x01) != 0x01) +		ret = -2; +	if ((last != 0xff) || (nbr_read > 1)) +		printf("[INFO] i2c abort after %d bytes (0x%02x)\n", +			nbr_read, last); +	udelay(DELAY_ABORT_SEQ); +	out_8(&dev->cr, (I2C_CR_MEN)); +	udelay(DELAY_ABORT_SEQ); +	/* clear status reg */ +	out_8(&dev->sr, 0); + +	for (i = 0; i < 5; i++) +		i2c_write_start_seq(); +	if (ret != 0) +		printf("[ERROR] i2c abort failed after %d bytes (0x%02x)\n", +			nbr_read, last); + +	return ret; +}  |