diff options
| author | Wolfgang Denk <wd@denx.de> | 2011-11-08 00:38:52 +0100 | 
|---|---|---|
| committer | Wolfgang Denk <wd@denx.de> | 2011-11-08 00:38:52 +0100 | 
| commit | 688d8f33f27ea596efb6632388ee60360996eed0 (patch) | |
| tree | 961e812048557d4ac7062e6a7387f543e7d634af /drivers/i2c | |
| parent | 7ba6d591b5a6ec4ed502de7d94ff726bce13fe61 (diff) | |
| parent | 2026a119512a9cced2957221e83fef92b8211d26 (diff) | |
| download | olio-uboot-2014.01-688d8f33f27ea596efb6632388ee60360996eed0.tar.xz olio-uboot-2014.01-688d8f33f27ea596efb6632388ee60360996eed0.zip | |
Merge branch 'master' of git://git.denx.de/u-boot-arm
* 'master' of git://git.denx.de/u-boot-arm:
  Arm: re-introduce the MACH_TYPE_XXXXXX for EB_CPUX9K2 board
  arm: jadecpu: Readd MACH_TYPE_JADECPU
  at91: defined mach-types for otc570 board in board config file
  at91: defined mach-types for meesc board in board config file
  mx31pdk: Enable D and I caches
  ehci-mxc: remove incorrect comment
  README: Fix supported i.MX SoC list for CONFIG_MXC_SPI
  mx53: Turn off child clocks before reconfigure perclk_root
  qong: enable support for compressed images
  imx: imx31_phycore.h: fix checkpatch warnings
  vision2: Remove unused get_board_rev function
  mx53smd: Remove unused get_board_rev function
  mx53ard: Remove unused get_board_rev function
  mx53evk: Remove unused get_board_rev function
  mx53evk: Add RTC support
  mx53loco: Remove unused get_board_rev function
  mx53evk: Remove unneeded '1' from mx53evk.h
  OMAP3: mvblx: Initial support for mvBlueLYNX-X
  ARM: dig297: Define MACH_TYPE_OMAP3_CPS and CONFIG_MACH_TYPE
  omap3: mem: Move comments next to definitions
  omap3: mem: Clean-up whitespaces
  omap3: mem: Define and use common macros
  Davinci: ea20: added PREBOOT to configuration
  Davinci: ea20: added I2C support
  Davinci: ea20: added video support
  VIDEO: davinci: add framebuffer to da8xx
  ARM: Davinci: added missing registers to hardware.h
  Davinci: ea20: add gpios for LCD backlight control
  Davinci: ea20: add gpio for keeping power on in board_late_init
  Davinci: ea20: Add default U-Boot environment
  Davinci: ea20: Add early init to get early output from console
  Davinci: ea20: Add NAND support
  Davinci: ea20: set GPIOs to hold MII-Phy in reset and set UART0-Switch for console
  Davinci: ea20: set console on UART0
  arm, davinci: add cam_enc_4xx support
  arm926ejs, davinci: add missing spi defines for dm365
  arm926ejs, davinci: add cpuinfo for dm365
  arm, davinci: add lowlevel function for dm365 soc
  arm, davinci: add header files for dm365
  spl, nand: add 4bit HW ecc oob first nand_read_page function
  arm, davinci: add support for new spl framework
  spl: add option for adding post memory test to the SPL framework
  net, davinci_emac: make clock divider in MDIO control register configurable
  arm, usb, davinci: make USBPHY_CTL register configurable
  usb, davinci: add enable_vbus() weak function
  omap3evm: fix errors caused by multiple definitions
  omap3evm: Add (quick) configuration for NAND only
  omap3evm: Add (quick) configuration for MMC/SD only
  omap3evm: move common config options to new file
  omap3evm: Prepare to split configuration
  omap3evm: Reorder related config options
  omap/spl: actually enable the console
  davinci_emac: compilation fix, phy is array now
  omap3evm: Set environment variable 'ethaddr'
  arm, arm926: fix missing symbols in NAND_SPL mode
  arm, davinci: Add function lpsc_syncreset()
  arm, davinci: replace CONFIG_PRELOADER with CONFIG_SPL_BUILD
  arm/km: portl2 environment address update to P1B
  arm/km: adapt bootcounter evaluation
  arm/km: enable jffs2 cmds
  arm/km: trigger reconfiguration for the Xilinx FPGA
  arm/km: add boardid and hwkey to kernel command line
  ARM: Reintroduce MACH_TYPE_KM_KIRKWOOD for keymile ARM boards
  netspace_v2: enable I2C EEPROM support
  netspace_v2: fix SDRAM configuration
  armada100: define CONFIG_SYS_CACHELINE_SIZE
  pantheon: define CONFIG_SYS_CACHELINE_SIZE
  kirkwood: define CONFIG_SYS_CACHELINE_SIZE
  kirkwood: drop empty asm-offsets.s file
  arm/km/mgcoge3un: enhance "waitforne" feature
  arm/km: add variable waitforne to mgcoge3un
  gplugD: Fix for error:MACH_TYPE_SHEEVAD undeclared
  ARM: dreamplug: fix compilation
  ARM: DockStar: fix compilation
  ARM: netspace_v2: fix warnings
  am335x: Drop board_sysinfo struct
  am335x: Temporarily add MACH_TYPE define
  misc:pmic:samsung Enable PMIC driver at C210 Universal target
  dcache:s5p CONFIG_SYS_CACHELINE_SIZE added for s5p UNIVERSAL C210 target
  dcache:s5p CONFIG_SYS_CACHELINE_SIZE added for s5p GONI target
  smdkv310: use macro for mmc data read function address
  smdkv310: use spl framework for mmc spl
  SMDKV310: use get_ram_size() to validate dram size
  SMDKV310: Initialize board id using CONFIG_MACH_TYPE
  ORIGEN : use absolute paths and fix tool naming
  ORIGEN : enable device tree support
  MX25: tx25: Fix building due to missing MACH_TYPE
  mx31: Add board support for HALE TT-01
  mx31: add ESD control registers
  mx31: define pins and init for UART2 and CSPI3
  MX35: add support for flea3 board
  MX51: vision2: add MACH_TYPE in config file
  vision2: Remove unused header file
  mx51evk: Remove unused get_board_rev function
  mx51evk: Remove unneeded '1' from mx51evk.h
  I2C: Fix mxc_i2c.c problem on imx31_phycore
  mx35pdk: Add RTC support
  mx51evk: Use GPIO API for configuring the IOMUX
  mx51evk: Add RTC support
  rtc: Make mc13783-rtc driver generic
  qong: remove unneeded IOMUX settings
  qong: Use mx31_set_gpr to setup USBH2 pins
  mx31: Introduce mx31_set_gpr function
  mx31pdk: Add MC13783 PMIC support
  qong: remove unneeded "1" from qong.h
  misc: pmic: fix regression in pmic_fsl.c (SPI)
  mx5 configs: CONFIG_PRIME should really be CONFIG_ETHPRIME
  MX35: Drop unnecessary prototypes from imx-regs.h
  I2C: added I2C-2 and I2C-3 to MX35
  MX35: factorize common assembly code
  MX35: add reset cause as provided by other i.MX
  MX35: add pins definition for UART3
  MX35: added ESDC structure to imx-regs
Diffstat (limited to 'drivers/i2c')
| -rw-r--r-- | drivers/i2c/mxc_i2c.c | 41 | 
1 files changed, 30 insertions, 11 deletions
| diff --git a/drivers/i2c/mxc_i2c.c b/drivers/i2c/mxc_i2c.c index 2869d7cec..c88ac7cf9 100644 --- a/drivers/i2c/mxc_i2c.c +++ b/drivers/i2c/mxc_i2c.c @@ -37,6 +37,7 @@  #include <asm/arch/clock.h>  #include <asm/arch/imx-regs.h> +#include <i2c.h>  struct mxc_i2c_regs {  	uint32_t	iadr; @@ -73,6 +74,10 @@ struct mxc_i2c_regs {  #define I2C_BASE        I2C2_BASE_ADDR  #elif defined(CONFIG_SYS_I2C_MX35_PORT1)  #define I2C_BASE	I2C_BASE_ADDR +#elif defined(CONFIG_SYS_I2C_MX35_PORT2) +#define I2C_BASE	I2C2_BASE_ADDR +#elif defined(CONFIG_SYS_I2C_MX35_PORT3) +#define I2C_BASE	I2C3_BASE_ADDR  #else  #error "define CONFIG_SYS_I2C_MX<Processor>_PORTx to use the mx I2C driver"  #endif @@ -95,16 +100,14 @@ static u16 i2c_clk_div[50][2] = {  	{ 3072,	0x1E }, { 3840,	0x1F }  }; -static u8 clk_div; -  /*   * Calculate and set proper clock divider   */ -static void i2c_imx_set_clk(unsigned int rate) +static uint8_t i2c_imx_get_clk(unsigned int rate)  { -	struct mxc_i2c_regs *i2c_regs = (struct mxc_i2c_regs *)I2C_BASE;  	unsigned int i2c_clk_rate;  	unsigned int div; +	u8 clk_div;  #if defined(CONFIG_MX31)  	struct clock_control_regs *sc_regs = @@ -127,7 +130,7 @@ static void i2c_imx_set_clk(unsigned int rate)  			;  	/* Store divider value */ -	writeb(i2c_clk_div[clk_div][1], &i2c_regs->ifdr); +	return clk_div;  }  /* @@ -146,7 +149,13 @@ void i2c_reset(void)   */  void i2c_init(int speed, int unused)  { -	i2c_imx_set_clk(speed); +	struct mxc_i2c_regs *i2c_regs = (struct mxc_i2c_regs *)I2C_BASE; +	u8 clk_idx = i2c_imx_get_clk(speed); +	u8 idx = i2c_clk_div[clk_idx][1]; + +	/* Store divider value */ +	writeb(idx, &i2c_regs->ifdr); +  	i2c_reset();  } @@ -164,6 +173,13 @@ int i2c_set_bus_speed(unsigned int speed)   */  unsigned int i2c_get_bus_speed(void)  { +	struct mxc_i2c_regs *i2c_regs = (struct mxc_i2c_regs *)I2C_BASE; +	u8 clk_idx = readb(&i2c_regs->ifdr); +	u8 clk_div; + +	for (clk_div = 0; i2c_clk_div[clk_div][1] != clk_idx; clk_div++) +		; +  	return mxc_get_clock(MXC_IPG_PERCLK) / i2c_clk_div[clk_div][0];  } @@ -232,8 +248,12 @@ int i2c_imx_start(void)  	struct mxc_i2c_regs *i2c_regs = (struct mxc_i2c_regs *)I2C_BASE;  	unsigned int temp = 0;  	int result; +	int speed = i2c_get_bus_speed(); +	u8 clk_idx = i2c_imx_get_clk(speed); +	u8 idx = i2c_clk_div[clk_idx][1]; -	writeb(i2c_clk_div[clk_div][1], &i2c_regs->ifdr); +	/* Store divider value */ +	writeb(idx, &i2c_regs->ifdr);  	/* Enable I2C controller */  	writeb(0, &i2c_regs->i2sr); @@ -306,11 +326,10 @@ int i2c_imx_set_chip_addr(uchar chip, int read)  int i2c_imx_set_reg_addr(uint addr, int alen)  {  	struct mxc_i2c_regs *i2c_regs = (struct mxc_i2c_regs *)I2C_BASE; -	int ret; -	int i; +	int ret = 0; -	for (i = 0; i < (8 * alen); i += 8) { -		writeb((addr >> i) & 0xff, &i2c_regs->i2dr); +	while (alen--) { +		writeb((addr >> (alen * 8)) & 0xff, &i2c_regs->i2dr);  		ret = i2c_imx_trx_complete();  		if (ret) |