diff options
Diffstat (limited to 'drivers/i2c')
-rw-r--r-- | drivers/i2c/Makefile | 2 | ||||
-rw-r--r-- | drivers/i2c/mxs_i2c.c | 49 |
2 files changed, 30 insertions, 21 deletions
diff --git a/drivers/i2c/Makefile b/drivers/i2c/Makefile index 416ea4f2c83..3191680ca24 100644 --- a/drivers/i2c/Makefile +++ b/drivers/i2c/Makefile @@ -8,7 +8,6 @@ obj-$(CONFIG_BFIN_TWI_I2C) += bfin-twi_i2c.o obj-$(CONFIG_DW_I2C) += designware_i2c.o obj-$(CONFIG_I2C_MV) += mv_i2c.o -obj-$(CONFIG_I2C_MXS) += mxs_i2c.o obj-$(CONFIG_PCA9564_I2C) += pca9564_i2c.o obj-$(CONFIG_TSI108_I2C) += tsi108_i2c.o obj-$(CONFIG_U8500_I2C) += u8500_i2c.o @@ -21,6 +20,7 @@ obj-$(CONFIG_SYS_I2C_IHS) += ihs_i2c.o obj-$(CONFIG_SYS_I2C_KONA) += kona_i2c.o obj-$(CONFIG_SYS_I2C_MVTWSI) += mvtwsi.o obj-$(CONFIG_SYS_I2C_MXC) += mxc_i2c.o +obj-$(CONFIG_SYS_I2C_MXS) += mxs_i2c.o obj-$(CONFIG_SYS_I2C_OMAP24XX) += omap24xx_i2c.o obj-$(CONFIG_SYS_I2C_OMAP34XX) += omap24xx_i2c.o obj-$(CONFIG_SYS_I2C_PPC4XX) += ppc4xx_i2c.o diff --git a/drivers/i2c/mxs_i2c.c b/drivers/i2c/mxs_i2c.c index cc313a6937a..9594008a9db 100644 --- a/drivers/i2c/mxs_i2c.c +++ b/drivers/i2c/mxs_i2c.c @@ -29,11 +29,25 @@ static struct mxs_i2c_regs *mxs_i2c_get_base(struct i2c_adapter *adap) return (struct mxs_i2c_regs *)MXS_I2C0_BASE; } +static unsigned int mxs_i2c_get_bus_speed(void) +{ + struct mxs_i2c_regs *i2c_regs = mxs_i2c_get_base(NULL); + uint32_t clk = mxc_get_clock(MXC_XTAL_CLK); + uint32_t timing0; + + timing0 = readl(&i2c_regs->hw_i2c_timing0); + /* + * This is a reverse version of the algorithm presented in + * i2c_set_bus_speed(). Please refer there for details. + */ + return clk / ((((timing0 >> 16) - 3) * 2) + 38); +} + static void mxs_i2c_reset(void) { struct mxs_i2c_regs *i2c_regs = mxs_i2c_get_base(NULL); int ret; - int speed = i2c_get_bus_speed(); + int speed = mxs_i2c_get_bus_speed(); ret = mxs_reset_block(&i2c_regs->hw_i2c_ctrl0_reg); if (ret) { @@ -165,7 +179,9 @@ err: return 1; } -int i2c_read(uchar chip, uint addr, int alen, uchar *buffer, int len) +static int mxs_i2c_if_read(struct i2c_adapter *adap, uint8_t chip, + uint addr, int alen, uint8_t *buffer, + int len) { struct mxs_i2c_regs *i2c_regs = mxs_i2c_get_base(NULL); uint32_t tmp = 0; @@ -214,7 +230,9 @@ int i2c_read(uchar chip, uint addr, int alen, uchar *buffer, int len) return 0; } -int i2c_write(uchar chip, uint addr, int alen, uchar *buffer, int len) +static int mxs_i2c_if_write(struct i2c_adapter *adap, uint8_t chip, + uint addr, int alen, uint8_t *buffer, + int len) { int ret; ret = mxs_i2c_write(chip, addr, alen, buffer, len, 1); @@ -230,7 +248,7 @@ int i2c_write(uchar chip, uint addr, int alen, uchar *buffer, int len) return ret; } -int i2c_probe(uchar chip) +static int mxs_i2c_probe(struct i2c_adapter *adap, uint8_t chip) { int ret; ret = mxs_i2c_write(chip, 0, 1, NULL, 0, 1); @@ -240,7 +258,7 @@ int i2c_probe(uchar chip) return ret; } -int i2c_set_bus_speed(unsigned int speed) +static uint mxs_i2c_set_bus_speed(struct i2c_adapter *adap, uint speed) { struct mxs_i2c_regs *i2c_regs = mxs_i2c_get_base(NULL); /* @@ -281,24 +299,15 @@ int i2c_set_bus_speed(unsigned int speed) return 0; } -unsigned int i2c_get_bus_speed(void) -{ - struct mxs_i2c_regs *i2c_regs = mxs_i2c_get_base(NULL); - uint32_t clk = mxc_get_clock(MXC_XTAL_CLK); - uint32_t timing0; - - timing0 = readl(&i2c_regs->hw_i2c_timing0); - /* - * This is a reverse version of the algorithm presented in - * i2c_set_bus_speed(). Please refer there for details. - */ - return clk / ((((timing0 >> 16) - 3) * 2) + 38); -} - -void i2c_init(int speed, int slaveadd) +static void mxs_i2c_init(struct i2c_adapter *adap, int speed, int slaveaddr) { mxs_i2c_reset(); i2c_set_bus_speed(speed); return; } + +U_BOOT_I2C_ADAP_COMPLETE(mxs0, mxs_i2c_init, mxs_i2c_probe, + mxs_i2c_if_read, mxs_i2c_if_write, + mxs_i2c_set_bus_speed, + CONFIG_SYS_I2C_SPEED, 0, 0) |