[U-Boot] [PATCH 5/5] i2c: omap24xx: Convert fully to DM_I2C
Heiko Schocher
hs at denx.de
Wed Jan 20 05:50:41 CET 2016
Hello Christophe,
Am 18.01.2016 um 22:22 schrieb Christophe Ricard:
> Hi Heiko,
>
> I was expecting such kind of feedback on this one :).
> I had myself to hack around between the MLO and the u-boot.img to get it working.
>
> For omap, i think twlxxxx drivers are kind of the main item to convert.
>
> Would you accept to take the first 4 patches until the board are fully ready for the 5th one ?
Yes. If they have no checkpatch errors and apply clean ;-)
I try to look at it, today.
bye,
Heiko
>
> Best Regards
> Christophe
>
> 2016-01-18 7:04 GMT+01:00 Heiko Schocher <hs at denx.de <mailto:hs at denx.de>>:
>
> Hello Christophe,
>
> Am 17.01.2016 um 12:09 schrieb Christophe Ricard:
>
> For several reasons:
> - code clarity
> - DM trends in u-boot
> ...
>
> It is better to make omap24xx_i2c driver 100% DM_I2C based.
>
> Signed-off-by: Christophe Ricard <christophe-h.ricard at st.com
> <mailto:christophe-h.ricard at st.com>>
> ---
>
> drivers/i2c/omap24xx_i2c.c | 447 +++++++++++++++++----------------------------
> drivers/i2c/omap24xx_i2c.h | 154 ----------------
> 2 files changed, 163 insertions(+), 438 deletions(-)
> delete mode 100644 drivers/i2c/omap24xx_i2c.h
>
>
> Full Ack .. but does this patch does not breeak boards, which use this
> driver, and are not converted to DM ? I think, we could remove the
> old style only, if all boards are converted ...
>
> bye,
> Heiko
>
>
> diff --git a/drivers/i2c/omap24xx_i2c.c b/drivers/i2c/omap24xx_i2c.c
> index 774edaf..baccb89 100644
> --- a/drivers/i2c/omap24xx_i2c.c
> +++ b/drivers/i2c/omap24xx_i2c.c
> @@ -49,31 +49,164 @@
> #include <asm/io.h>
> #include <asm/errno.h>
>
> -#include "omap24xx_i2c.h"
> -
>
>
> ?
>
> Why do you remove the header file, and move all definitions into the
> c file?
>
>
> DECLARE_GLOBAL_DATA_PTR;
>
> +/* I2C masks */
> +
> +/* I2C Interrupt Enable Register (I2C_IE): */
> +#define I2C_IE_GC_IE (1 << 5)
> +#define I2C_IE_XRDY_IE (1 << 4) /* Transmit data ready interrupt enable */
> +#define I2C_IE_RRDY_IE (1 << 3) /* Receive data ready interrupt enable */
> +#define I2C_IE_ARDY_IE (1 << 2) /* Register access ready interrupt enable */
> +#define I2C_IE_NACK_IE (1 << 1) /* No acknowledgment interrupt enable */
> +#define I2C_IE_AL_IE (1 << 0) /* Arbitration lost interrupt enable */
> +
> +/* I2C Status Register (I2C_STAT): */
> +
> +#define I2C_STAT_SBD (1 << 15) /* Single byte data */
> +#define I2C_STAT_BB (1 << 12) /* Bus busy */
> +#define I2C_STAT_ROVR (1 << 11) /* Receive overrun */
> +#define I2C_STAT_XUDF (1 << 10) /* Transmit underflow */
> +#define I2C_STAT_AAS (1 << 9) /* Address as slave */
> +#define I2C_STAT_GC (1 << 5)
> +#define I2C_STAT_XRDY (1 << 4) /* Transmit data ready */
> +#define I2C_STAT_RRDY (1 << 3) /* Receive data ready */
> +#define I2C_STAT_ARDY (1 << 2) /* Register access ready */
> +#define I2C_STAT_NACK (1 << 1) /* No acknowledgment interrupt enable */
> +#define I2C_STAT_AL (1 << 0) /* Arbitration lost interrupt enable */
> +
> +/* I2C Interrupt Code Register (I2C_INTCODE): */
> +
> +#define I2C_INTCODE_MASK 7
> +#define I2C_INTCODE_NONE 0
> +#define I2C_INTCODE_AL 1 /* Arbitration lost */
> +#define I2C_INTCODE_NAK 2 /* No acknowledgement/general call */
> +#define I2C_INTCODE_ARDY 3 /* Register access ready */
> +#define I2C_INTCODE_RRDY 4 /* Rcv data ready */
> +#define I2C_INTCODE_XRDY 5 /* Xmit data ready */
> +
> +/* I2C Buffer Configuration Register (I2C_BUF): */
> +
> +#define I2C_BUF_RDMA_EN (1 << 15) /* Receive DMA channel enable */
> +#define I2C_BUF_XDMA_EN (1 << 7) /* Transmit DMA channel enable */
> +
> +/* I2C Configuration Register (I2C_CON): */
> +
> +#define I2C_CON_EN (1 << 15) /* I2C module enable */
> +#define I2C_CON_BE (1 << 14) /* Big endian mode */
> +#define I2C_CON_STB (1 << 11) /* Start byte mode (master mode only) */
> +#define I2C_CON_MST (1 << 10) /* Master/slave mode */
> +#define I2C_CON_TRX (1 << 9) /* Transmitter/receiver mode */
> + /* (master mode only) */
> +#define I2C_CON_XA (1 << 8) /* Expand address */
> +#define I2C_CON_STP (1 << 1) /* Stop condition (master mode only) */
> +#define I2C_CON_STT (1 << 0) /* Start condition (master mode only) */
> +
> +/* I2C System Test Register (I2C_SYSTEST): */
> +
> +#define I2C_SYSTEST_ST_EN (1 << 15) /* System test enable */
> +#define I2C_SYSTEST_FREE (1 << 14) /* Free running mode, on brkpoint) */
> +#define I2C_SYSTEST_TMODE_MASK (3 << 12) /* Test mode select */
> +#define I2C_SYSTEST_TMODE_SHIFT (12) /* Test mode select */
> +#define I2C_SYSTEST_SCL_I (1 << 3) /* SCL line sense input value */
> +#define I2C_SYSTEST_SCL_O (1 << 2) /* SCL line drive output value */
> +#define I2C_SYSTEST_SDA_I (1 << 1) /* SDA line sense input value */
> +#define I2C_SYSTEST_SDA_O (1 << 0) /* SDA line drive output value */
> +
> +/* I2C System Status Register (I2C_SYSS): */
> +
> +#define I2C_SYSS_RDONE (1 << 0) /* Internel reset monitoring */
> +
> +#define I2C_SCLL_SCLL 0
> +#define I2C_SCLL_SCLL_M 0xFF
> +#define I2C_SCLL_HSSCLL 8
> +#define I2C_SCLH_HSSCLL_M 0xFF
> +#define I2C_SCLH_SCLH 0
> +#define I2C_SCLH_SCLH_M 0xFF
> +#define I2C_SCLH_HSSCLH 8
> +#define I2C_SCLH_HSSCLH_M 0xFF
> +
> +#define OMAP_I2C_STANDARD 100000
> +#define OMAP_I2C_FAST_MODE 400000
> +#define OMAP_I2C_HIGH_SPEED 3400000
> +
> +#define SYSTEM_CLOCK_12 12000000
> +#define SYSTEM_CLOCK_13 13000000
> +#define SYSTEM_CLOCK_192 19200000
> +#define SYSTEM_CLOCK_96 96000000
> +
> +/* Use the reference value of 96MHz if not explicitly set by the board */
> +#ifndef I2C_IP_CLK
> +#define I2C_IP_CLK SYSTEM_CLOCK_96
> +#endif
> +
> +/*
> + * The reference minimum clock for high speed is 19.2MHz.
> + * The linux 2.6.30 kernel uses this value.
> + * The reference minimum clock for fast mode is 9.6MHz
> + * The reference minimum clock for standard mode is 4MHz
> + * In TRM, the value of 12MHz is used.
> + */
> +#ifndef I2C_INTERNAL_SAMPLING_CLK
> +#define I2C_INTERNAL_SAMPLING_CLK 19200000
> +#endif
> +
> +/*
> + * The equation for the low and high time is
> + * tlow = scll + scll_trim = (sampling clock * tlow_duty) / speed
> + * thigh = sclh + sclh_trim = (sampling clock * (1 - tlow_duty)) / speed
> + *
> + * If the duty cycle is 50%
> + *
> + * tlow = scll + scll_trim = sampling clock / (2 * speed)
> + * thigh = sclh + sclh_trim = sampling clock / (2 * speed)
> + *
> + * In TRM
> + * scll_trim = 7
> + * sclh_trim = 5
> + *
> + * The linux 2.6.30 kernel uses
> + * scll_trim = 6
> + * sclh_trim = 6
> + *
> + * These are the trim values for standard and fast speed
> + */
> +#ifndef I2C_FASTSPEED_SCLL_TRIM
> +#define I2C_FASTSPEED_SCLL_TRIM 6
> +#endif
> +#ifndef I2C_FASTSPEED_SCLH_TRIM
> +#define I2C_FASTSPEED_SCLH_TRIM 6
> +#endif
> +
> +/* These are the trim values for high speed */
> +#ifndef I2C_HIGHSPEED_PHASE_ONE_SCLL_TRIM
> +#define I2C_HIGHSPEED_PHASE_ONE_SCLL_TRIM I2C_FASTSPEED_SCLL_TRIM
> +#endif
> +#ifndef I2C_HIGHSPEED_PHASE_ONE_SCLH_TRIM
> +#define I2C_HIGHSPEED_PHASE_ONE_SCLH_TRIM I2C_FASTSPEED_SCLH_TRIM
> +#endif
> +#ifndef I2C_HIGHSPEED_PHASE_TWO_SCLL_TRIM
> +#define I2C_HIGHSPEED_PHASE_TWO_SCLL_TRIM I2C_FASTSPEED_SCLL_TRIM
> +#endif
> +#ifndef I2C_HIGHSPEED_PHASE_TWO_SCLH_TRIM
> +#define I2C_HIGHSPEED_PHASE_TWO_SCLH_TRIM I2C_FASTSPEED_SCLH_TRIM
> +#endif
> +
> +#define I2C_PSC_MAX 0x0f
> +#define I2C_PSC_MIN 0x00
> +
> #define I2C_TIMEOUT 1000
>
> -#ifdef CONFIG_DM_I2C
> struct omap24_i2c_bus {
> int bus_num;
> int waitdelay;
> unsigned clock_frequency;
> struct i2c *i2c_base;
> };
> -#endif
>
> -#ifdef CONFIG_SYS_I2C
> -static int wait_for_bb(struct i2c_adapter *adap);
> -static struct i2c *omap24_get_base(struct i2c_adapter *adap);
> -static u16 wait_for_event(struct i2c_adapter *adap);
> -static void flush_fifo(struct i2c_adapter *adap);
> -#else
> static int wait_for_bb(struct udevice *dev);
> static u16 wait_for_event(struct udevice *dev);
> static void flush_fifo(struct udevice *dev);
> -#endif
>
> static int omap24_i2c_findpsc(u32 *pscl, u32 *psch, uint speed)
> {
> @@ -109,26 +242,14 @@ static int omap24_i2c_findpsc(u32 *pscl, u32 *psch, uint speed)
> return -1;
> }
>
> -#ifdef CONFIG_SYS_I2C
> -static uint omap24_i2c_setspeed(struct i2c_adapter *adap, uint speed)
> -#else
> static int omap24_i2c_setspeed(struct udevice *adap, unsigned int speed)
> -#endif
> {
> - struct i2c *i2c_base;
> + struct omap24_i2c_bus *i2c_bus = dev_get_priv(adap);
> + struct i2c *i2c_base = i2c_bus->i2c_base;
> int psc, fsscll = 0, fssclh = 0;
> int hsscll = 0, hssclh = 0;
> u32 scll = 0, sclh = 0;
>
> -#ifdef CONFIG_SYS_I2C
> - i2c_base = omap24_get_base(adap);
> -#else
> - struct omap24_i2c_bus *i2c_bus;
> -
> - i2c_bus = dev_get_priv(adap);
> - i2c_base = i2c_bus->i2c_base;
> -#endif
> -
> if (speed > 400000) {
> unsigned long scl;
>
> @@ -166,13 +287,8 @@ static int omap24_i2c_setspeed(struct udevice *adap, unsigned int speed)
> scll = (unsigned int)hsscll << 8 | (unsigned int)fsscll;
> sclh = (unsigned int)hssclh << 8 | (unsigned int)fssclh;
>
> -#ifdef CONFIG_SYS_I2C
> - adap->speed = speed;
> - adap->waitdelay = (10000000 / speed) * 8; /* wait for 20 clkperiods */
> -#else
> i2c_bus->clock_frequency = speed;
> i2c_bus->waitdelay = (10000000 / speed) * 8; /* wait for 20 clkperiods */
> -#endif
> } else {
> /* Standard and fast speed */
> psc = omap24_i2c_findpsc(&scll, &sclh, speed);
> @@ -181,13 +297,8 @@ static int omap24_i2c_setspeed(struct udevice *adap, unsigned int speed)
> return -1;
> }
>
> -#ifdef CONFIG_SYS_I2C
> - adap->speed = speed;
> - adap->waitdelay = (10000000 / speed) * 2; /* wait for 20 clkperiods */
> -#else
> i2c_bus->clock_frequency = speed;
> i2c_bus->waitdelay = (10000000 / speed) * 2; /* wait for 20 clkperiods */
> -#endif
> }
>
> writew(0, &i2c_base->con);
> @@ -200,26 +311,14 @@ static int omap24_i2c_setspeed(struct udevice *adap, unsigned int speed)
> return 0;
> }
>
> -#ifdef CONFIG_SYS_I2C
> -static void omap24_i2c_deblock(struct i2c_adapter *adap)
> -#else
> static int omap24_i2c_deblock(struct udevice *adap)
> -#endif
> {
> - struct i2c *i2c_base;
> + struct omap24_i2c_bus *i2c_bus = dev_get_priv(adap);
> + struct i2c *i2c_base = i2c_bus->i2c_base;
> int i;
> u16 systest;
> u16 orgsystest;
>
> -#ifdef CONFIG_SYS_I2C
> - i2c_base = omap24_get_base(adap);
> -#else
> - struct omap24_i2c_bus *i2c_bus;
> -
> - i2c_bus = dev_get_priv(adap);
> - i2c_base = i2c_bus->i2c_base;
> -#endif
> -
> /* set test mode ST_EN = 1 */
> orgsystest = readw(&i2c_base->systest);
> systest = orgsystest;
> @@ -258,30 +357,16 @@ static int omap24_i2c_deblock(struct udevice *adap)
> /* restore original mode */
> writew(orgsystest, &i2c_base->systest);
>
> -#ifdef CONFIG_DM_I2C
> return 0;
> -#endif
> }
>
> -#ifdef CONFIG_SYS_I2C
> -static void omap24_i2c_init(struct i2c_adapter *adap, int speed, int slaveadd)
> -#else
> static void omap24_i2c_init(struct udevice *adap, int speed, int slaveadd)
> -#endif
> {
> - struct i2c *i2c_base;
> + struct omap24_i2c_bus *i2c_bus = dev_get_priv(adap);
> + struct i2c *i2c_base = i2c_bus->i2c_base;
> int timeout = I2C_TIMEOUT;
> int deblock = 1;
>
> -#ifdef CONFIG_SYS_I2C
> - i2c_base = omap24_get_base(adap);
> -#else
> - struct omap24_i2c_bus *i2c_bus;
> -
> - i2c_bus = dev_get_priv(adap);
> - i2c_base = i2c_bus->i2c_base;
> -#endif
> -
> retry:
> if (readw(&i2c_base->con) & I2C_CON_EN) {
> writew(0, &i2c_base->con);
> @@ -329,24 +414,12 @@ retry:
> }
> }
>
> -#ifdef CONFIG_SYS_I2C
> -static void flush_fifo(struct i2c_adapter *adap)
> -#else
> static void flush_fifo(struct udevice *adap)
> -#endif
> {
> - struct i2c *i2c_base;
> + struct omap24_i2c_bus *i2c_bus = dev_get_priv(adap);
> + struct i2c *i2c_base = i2c_bus->i2c_base;
> u16 stat;
>
> -#ifdef CONFIG_SYS_I2C
> - i2c_base = omap24_get_base(adap);
> -#else
> - struct omap24_i2c_bus *i2c_bus;
> -
> - i2c_bus = dev_get_priv(adap);
> - i2c_base = i2c_bus->i2c_base;
> -#endif
> -
> /*
> * note: if you try and read data when its not there or ready
> * you get a bus error
> @@ -366,25 +439,13 @@ static void flush_fifo(struct udevice *adap)
> * i2c_probe: Use write access. Allows to identify addresses that are
> * write-only (like the config register of dual-port EEPROMs)
> */
> -#ifdef CONFIG_SYS_I2C
> -static int omap24_i2c_probe(struct i2c_adapter *adap, uchar chip)
> -#else
> static int omap24_i2c_probe(struct udevice *adap, uint chip, uint chip_flags)
> -#endif
> {
> - struct i2c *i2c_base;
> + struct omap24_i2c_bus *i2c_bus = dev_get_priv(adap);
> + struct i2c *i2c_base = i2c_bus->i2c_base;
> u16 status;
> int res = 1; /* default = fail */
>
> -#ifdef CONFIG_SYS_I2C
> - i2c_base = omap24_get_base(adap);
> -#else
> - struct omap24_i2c_bus *i2c_bus;
> -
> - i2c_bus = dev_get_priv(adap);
> - i2c_base = i2c_bus->i2c_base;
> -#endif
> -
> if (chip == readw(&i2c_base->oa))
> return res;
>
> @@ -407,26 +468,16 @@ static int omap24_i2c_probe(struct udevice *adap, uint chip, uint
> chip_flags)
> * silent exit is desired upon unconfigured bus, remove the
> * following 'if' section:
> */
> - if (status == I2C_STAT_XRDY) {
> -#ifdef CONFIG_SYS_I2C
> - printf("i2c_probe: pads on bus %d probably not configured
> (status=0x%x)\n",
> - adap->hwadapnr, status);
> -#else
> + if (status == I2C_STAT_XRDY)
> printf("i2c_probe: pads on bus %d probably not configured
> (status=0x%x)\n",
> i2c_bus->bus_num, status);
> -#endif
> - }
> goto pr_exit;
> }
>
> /* Check for ACK (!NAK) */
> if (!(status & I2C_STAT_NACK)) {
> res = 0; /* Device found */
> -#ifdef CONFIG_SYS_I2C
> - udelay(adap->waitdelay);/* Required by AM335X in SPL */
> -#else
> udelay(i2c_bus->waitdelay);
> -#endif
> /* Abort transfer (force idle state) */
> writew(I2C_CON_MST | I2C_CON_TRX, &i2c_base->con); /* Reset */
> udelay(1000);
> @@ -452,26 +503,14 @@ pr_exit:
> * or that do not need a register address at all (such as some clock
> * distributors).
> */
> -#ifdef CONFIG_SYS_I2C
> -static int omap24_i2c_read(struct i2c_adapter *adap, uchar chip, uint addr,
> - int alen, uchar *buffer, int len)
> -#else
> static int omap24_i2c_read(struct udevice *adap, uchar chip, uint addr,
> int alen, uchar *buffer, int len)
> -#endif
> {
> - struct i2c *i2c_base;
> + struct omap24_i2c_bus *i2c_bus = dev_get_priv(adap);
> + struct i2c *i2c_base = i2c_bus->i2c_base;
> int i2c_error = 0;
> u16 status;
>
> -#ifdef CONFIG_SYS_I2C
> - i2c_base = omap24_get_base(adap);
> -#else
> - struct omap24_i2c_bus *i2c_bus;
> -
> - i2c_bus = dev_get_priv(adap);
> - i2c_base = i2c_bus->i2c_base;
> -#endif
> if (alen < 0) {
> puts("I2C read: addr len < 0\n");
> return 1;
> @@ -521,13 +560,8 @@ static int omap24_i2c_read(struct udevice *adap, uchar chip, uint addr,
> /* Try to identify bus that is not padconf'd for I2C */
> if (status == I2C_STAT_XRDY) {
> i2c_error = 2;
> -#ifdef CONFIG_SYS_I2C
> - printf("i2c_read (addr phase): pads on bus %d probably not
> configured (status=0x%x)\n",
> - adap->hwadapnr, status);
> -#else
> printf("i2c_read (addr phase): pads on bus %d probably not
> configured (status=0x%x)\n",
> i2c_bus->bus_num, status);
> -#endif
> goto rd_exit;
> }
> if (status == 0 || (status & I2C_STAT_NACK)) {
> @@ -570,13 +604,8 @@ static int omap24_i2c_read(struct udevice *adap, uchar chip, uint addr,
> */
> if (status == I2C_STAT_XRDY) {
> i2c_error = 2;
> -#ifdef CONFIG_SYS_I2C
> - printf("i2c_read (data phase): pads on bus %d probably not
> configured (status=0x%x)\n",
> - adap->hwadapnr, status);
> -#else
> printf("i2c_read (data phase): pads on bus %d probably not
> configured (status=0x%x)\n",
> i2c_bus->bus_num, status);
> -#endif
> goto rd_exit;
> }
> if (status == 0 || (status & I2C_STAT_NACK)) {
> @@ -600,29 +629,16 @@ rd_exit:
> }
>
> /* i2c_write: Address (reg offset) may be 0, 1 or 2 bytes long. */
> -#ifdef CONFIG_SYS_I2C
> -static int omap24_i2c_write(struct i2c_adapter *adap, uchar chip, uint addr,
> - int alen, uchar *buffer, int len)
> -#else
> static int omap24_i2c_write(struct udevice *adap, uchar chip, uint addr,
> int alen, uchar *buffer, int len)
> -#endif
> {
> - struct i2c *i2c_base;
> + struct omap24_i2c_bus *i2c_bus = dev_get_priv(adap);
> + struct i2c *i2c_base = i2c_bus->i2c_base;
> int i;
> u16 status;
> int i2c_error = 0;
> int timeout = I2C_TIMEOUT;
>
> -#ifdef CONFIG_SYS_I2C
> - i2c_base = omap24_get_base(adap);
> -#else
> - struct omap24_i2c_bus *i2c_bus;
> -
> - i2c_bus = dev_get_priv(adap);
> - i2c_base = i2c_bus->i2c_base;
> -#endif
> -
> if (alen < 0) {
> puts("I2C write: addr len < 0\n");
> return 1;
> @@ -667,13 +683,8 @@ static int omap24_i2c_write(struct udevice *adap, uchar chip, uint addr,
> /* Try to identify bus that is not padconf'd for I2C */
> if (status == I2C_STAT_XRDY) {
> i2c_error = 2;
> -#ifdef CONFIG_SYS_I2C
> - printf("i2c_write: pads on bus %d probably not configured
> (status=0x%x)\n",
> - adap->hwadapnr, status);
> -#else
> printf("i2c_write: pads on bus %d probably not configured
> (status=0x%x)\n",
> i2c_bus->bus_num, status);
> -#endif
> goto wr_exit;
> }
> if (status == 0 || (status & I2C_STAT_NACK)) {
> @@ -732,25 +743,13 @@ wr_exit:
> * Wait for the bus to be free by checking the Bus Busy (BB)
> * bit to become clear
> */
> -#ifdef CONFIG_SYS_I2C
> -static int wait_for_bb(struct i2c_adapter *adap)
> -#else
> static int wait_for_bb(struct udevice *adap)
> -#endif
> {
> - struct i2c *i2c_base;
> + struct omap24_i2c_bus *i2c_bus = dev_get_priv(adap);
> + struct i2c *i2c_base = i2c_bus->i2c_base;
> int timeout = I2C_TIMEOUT;
> u16 stat;
>
> -#ifdef CONFIG_SYS_I2C
> - i2c_base = omap24_get_base(adap);
> -#else
> - struct omap24_i2c_bus *i2c_bus;
> -
> - i2c_bus = dev_get_priv(adap);
> - i2c_base = i2c_bus->i2c_base;
> -#endif
> -
> writew(0xFFFF, &i2c_base->stat); /* clear current interrupts...*/
> #if defined(CONFIG_OMAP243X) || defined(CONFIG_OMAP34XX)
> while ((stat = readw(&i2c_base->stat) & I2C_STAT_BB) && timeout--) {
> @@ -760,11 +759,7 @@ static int wait_for_bb(struct udevice *adap)
> I2C_STAT_BB) && timeout--) {
> #endif
> writew(stat, &i2c_base->stat);
> -#ifdef CONFIG_SYS_I2C
> - udelay(adap->waitdelay);
> -#else
> udelay(i2c_bus->waitdelay);
> -#endif
> }
>
> if (timeout <= 0) {
> @@ -780,31 +775,15 @@ static int wait_for_bb(struct udevice *adap)
> * Wait for the I2C controller to complete current action
> * and update status
> */
> -#ifdef CONFIG_SYS_I2C
> -static u16 wait_for_event(struct i2c_adapter *adap)
> -#else
> static u16 wait_for_event(struct udevice *adap)
> -#endif
> {
> - struct i2c *i2c_base;
> + struct omap24_i2c_bus *i2c_bus = dev_get_priv(adap);
> + struct i2c *i2c_base = i2c_bus->i2c_base;
> u16 status;
> int timeout = I2C_TIMEOUT;
>
> -#ifdef CONFIG_SYS_I2C
> - i2c_base = omap24_get_base(adap);
> -#else
> - struct omap24_i2c_bus *i2c_bus;
> -
> - i2c_bus = dev_get_priv(adap);
> - i2c_base = i2c_bus->i2c_base;
> -#endif
> -
> do {
> -#ifdef CONFIG_SYS_I2C
> - udelay(adap->waitdelay);
> -#else
> udelay(i2c_bus->waitdelay);
> -#endif
> #if defined(CONFIG_OMAP243X) || defined(CONFIG_OMAP34XX)
> status = readw(&i2c_base->stat);
> #else
> @@ -823,13 +802,8 @@ static u16 wait_for_event(struct udevice *adap)
> * If status is still 0 here, probably the bus pads have
> * not been configured for I2C, and/or pull-ups are missing.
> */
> -#ifdef CONFIG_SYS_I2C
> - printf("Check if pads/pull-ups of bus %d are properly configured\n",
> - adap->hwadapnr);
> -#else
> printf("Check if pads/pull-ups of bus %d are properly configured\n",
> i2c_bus->bus_num);
> -#endif
> writew(0xFFFF, &i2c_base->stat);
> status = 0;
> }
> @@ -837,100 +811,6 @@ static u16 wait_for_event(struct udevice *adap)
> return status;
> }
>
> -#ifdef CONFIG_SYS_I2C
> -static struct i2c *omap24_get_base(struct i2c_adapter *adap)
> -{
> - switch (adap->hwadapnr) {
> - case 0:
> - return (struct i2c *)I2C_BASE1;
> - break;
> - case 1:
> - return (struct i2c *)I2C_BASE2;
> - break;
> -#if (I2C_BUS_MAX > 2)
> - case 2:
> - return (struct i2c *)I2C_BASE3;
> - break;
> -#if (I2C_BUS_MAX > 3)
> - case 3:
> - return (struct i2c *)I2C_BASE4;
> - break;
> -#if (I2C_BUS_MAX > 4)
> - case 4:
> - return (struct i2c *)I2C_BASE5;
> - break;
> -#endif
> -#endif
> -#endif
> - default:
> - printf("wrong hwadapnr: %d\n", adap->hwadapnr);
> - break;
> - }
> - return NULL;
> -}
> -
> -#if !defined(CONFIG_SYS_OMAP24_I2C_SPEED1)
> -#define CONFIG_SYS_OMAP24_I2C_SPEED1 CONFIG_SYS_OMAP24_I2C_SPEED
> -#endif
> -#if !defined(CONFIG_SYS_OMAP24_I2C_SLAVE1)
> -#define CONFIG_SYS_OMAP24_I2C_SLAVE1 CONFIG_SYS_OMAP24_I2C_SLAVE
> -#endif
> -
> -U_BOOT_I2C_ADAP_COMPLETE(omap24_0, omap24_i2c_init, omap24_i2c_probe,
> - omap24_i2c_read, omap24_i2c_write, omap24_i2c_setspeed,
> - CONFIG_SYS_OMAP24_I2C_SPEED,
> - CONFIG_SYS_OMAP24_I2C_SLAVE,
> - 0)
> -U_BOOT_I2C_ADAP_COMPLETE(omap24_1, omap24_i2c_init, omap24_i2c_probe,
> - omap24_i2c_read, omap24_i2c_write, omap24_i2c_setspeed,
> - CONFIG_SYS_OMAP24_I2C_SPEED1,
> - CONFIG_SYS_OMAP24_I2C_SLAVE1,
> - 1)
> -#if (I2C_BUS_MAX > 2)
> -#if !defined(CONFIG_SYS_OMAP24_I2C_SPEED2)
> -#define CONFIG_SYS_OMAP24_I2C_SPEED2 CONFIG_SYS_OMAP24_I2C_SPEED
> -#endif
> -#if !defined(CONFIG_SYS_OMAP24_I2C_SLAVE2)
> -#define CONFIG_SYS_OMAP24_I2C_SLAVE2 CONFIG_SYS_OMAP24_I2C_SLAVE
> -#endif
> -
> -U_BOOT_I2C_ADAP_COMPLETE(omap24_2, omap24_i2c_init, omap24_i2c_probe,
> - omap24_i2c_read, omap24_i2c_write, NULL,
> - CONFIG_SYS_OMAP24_I2C_SPEED2,
> - CONFIG_SYS_OMAP24_I2C_SLAVE2,
> - 2)
> -#if (I2C_BUS_MAX > 3)
> -#if !defined(CONFIG_SYS_OMAP24_I2C_SPEED3)
> -#define CONFIG_SYS_OMAP24_I2C_SPEED3 CONFIG_SYS_OMAP24_I2C_SPEED
> -#endif
> -#if !defined(CONFIG_SYS_OMAP24_I2C_SLAVE3)
> -#define CONFIG_SYS_OMAP24_I2C_SLAVE3 CONFIG_SYS_OMAP24_I2C_SLAVE
> -#endif
> -
> -U_BOOT_I2C_ADAP_COMPLETE(omap24_3, omap24_i2c_init, omap24_i2c_probe,
> - omap24_i2c_read, omap24_i2c_write, NULL,
> - CONFIG_SYS_OMAP24_I2C_SPEED3,
> - CONFIG_SYS_OMAP24_I2C_SLAVE3,
> - 3)
> -#if (I2C_BUS_MAX > 4)
> -#if !defined(CONFIG_SYS_OMAP24_I2C_SPEED4)
> -#define CONFIG_SYS_OMAP24_I2C_SPEED4 CONFIG_SYS_OMAP24_I2C_SPEED
> -#endif
> -#if !defined(CONFIG_SYS_OMAP24_I2C_SLAVE4)
> -#define CONFIG_SYS_OMAP24_I2C_SLAVE4 CONFIG_SYS_OMAP24_I2C_SLAVE
> -#endif
> -
> -U_BOOT_I2C_ADAP_COMPLETE(omap24_4, omap24_i2c_init, omap24_i2c_probe,
> - omap24_i2c_read, omap24_i2c_write, NULL,
> - CONFIG_SYS_OMAP24_I2C_SPEED4,
> - CONFIG_SYS_OMAP24_I2C_SLAVE4,
> - 4)
> -#endif
> -#endif
> -#endif
> -#endif
> -
> -#ifdef CONFIG_DM_I2C
> static int omap24_i2c_xfer(struct udevice *adap, struct i2c_msg *msg,
> int nmsgs)
> {
> @@ -996,4 +876,3 @@ U_BOOT_DRIVER(omap_i2c) = {
> .priv_auto_alloc_size = sizeof(struct omap24_i2c_bus),
> .ops = &omap24_i2c_ops,
> };
> -#endif
> diff --git a/drivers/i2c/omap24xx_i2c.h b/drivers/i2c/omap24xx_i2c.h
> deleted file mode 100644
> index 3dae295..0000000
> --- a/drivers/i2c/omap24xx_i2c.h
> +++ /dev/null
> @@ -1,154 +0,0 @@
> -/*
> - * (C) Copyright 2004-2010
> - * Texas Instruments, <www.ti.com <http://www.ti.com>>
> - *
> - * SPDX-License-Identifier: GPL-2.0+
> - */
> -#ifndef _OMAP2PLUS_I2C_H_
> -#define _OMAP2PLUS_I2C_H_
> -
> -/* I2C masks */
> -
> -/* I2C Interrupt Enable Register (I2C_IE): */
> -#define I2C_IE_GC_IE (1 << 5)
> -#define I2C_IE_XRDY_IE (1 << 4) /* Transmit data ready interrupt enable */
> -#define I2C_IE_RRDY_IE (1 << 3) /* Receive data ready interrupt enable */
> -#define I2C_IE_ARDY_IE (1 << 2) /* Register access ready interrupt enable */
> -#define I2C_IE_NACK_IE (1 << 1) /* No acknowledgment interrupt enable */
> -#define I2C_IE_AL_IE (1 << 0) /* Arbitration lost interrupt enable */
> -
> -/* I2C Status Register (I2C_STAT): */
> -
> -#define I2C_STAT_SBD (1 << 15) /* Single byte data */
> -#define I2C_STAT_BB (1 << 12) /* Bus busy */
> -#define I2C_STAT_ROVR (1 << 11) /* Receive overrun */
> -#define I2C_STAT_XUDF (1 << 10) /* Transmit underflow */
> -#define I2C_STAT_AAS (1 << 9) /* Address as slave */
> -#define I2C_STAT_GC (1 << 5)
> -#define I2C_STAT_XRDY (1 << 4) /* Transmit data ready */
> -#define I2C_STAT_RRDY (1 << 3) /* Receive data ready */
> -#define I2C_STAT_ARDY (1 << 2) /* Register access ready */
> -#define I2C_STAT_NACK (1 << 1) /* No acknowledgment interrupt enable */
> -#define I2C_STAT_AL (1 << 0) /* Arbitration lost interrupt enable */
> -
> -/* I2C Interrupt Code Register (I2C_INTCODE): */
> -
> -#define I2C_INTCODE_MASK 7
> -#define I2C_INTCODE_NONE 0
> -#define I2C_INTCODE_AL 1 /* Arbitration lost */
> -#define I2C_INTCODE_NAK 2 /* No acknowledgement/general call */
> -#define I2C_INTCODE_ARDY 3 /* Register access ready */
> -#define I2C_INTCODE_RRDY 4 /* Rcv data ready */
> -#define I2C_INTCODE_XRDY 5 /* Xmit data ready */
> -
> -/* I2C Buffer Configuration Register (I2C_BUF): */
> -
> -#define I2C_BUF_RDMA_EN (1 << 15) /* Receive DMA channel enable */
> -#define I2C_BUF_XDMA_EN (1 << 7) /* Transmit DMA channel enable */
> -
> -/* I2C Configuration Register (I2C_CON): */
> -
> -#define I2C_CON_EN (1 << 15) /* I2C module enable */
> -#define I2C_CON_BE (1 << 14) /* Big endian mode */
> -#define I2C_CON_STB (1 << 11) /* Start byte mode (master mode only) */
> -#define I2C_CON_MST (1 << 10) /* Master/slave mode */
> -#define I2C_CON_TRX (1 << 9) /* Transmitter/receiver mode */
> - /* (master mode only) */
> -#define I2C_CON_XA (1 << 8) /* Expand address */
> -#define I2C_CON_STP (1 << 1) /* Stop condition (master mode only) */
> -#define I2C_CON_STT (1 << 0) /* Start condition (master mode only) */
> -
> -/* I2C System Test Register (I2C_SYSTEST): */
> -
> -#define I2C_SYSTEST_ST_EN (1 << 15) /* System test enable */
> -#define I2C_SYSTEST_FREE (1 << 14) /* Free running mode, on brkpoint) */
> -#define I2C_SYSTEST_TMODE_MASK (3 << 12) /* Test mode select */
> -#define I2C_SYSTEST_TMODE_SHIFT (12) /* Test mode select */
> -#define I2C_SYSTEST_SCL_I (1 << 3) /* SCL line sense input value */
> -#define I2C_SYSTEST_SCL_O (1 << 2) /* SCL line drive output value */
> -#define I2C_SYSTEST_SDA_I (1 << 1) /* SDA line sense input value */
> -#define I2C_SYSTEST_SDA_O (1 << 0) /* SDA line drive output value */
> -
> -/* I2C System Status Register (I2C_SYSS): */
> -
> -#define I2C_SYSS_RDONE (1 << 0) /* Internel reset monitoring */
> -
> -#define I2C_SCLL_SCLL 0
> -#define I2C_SCLL_SCLL_M 0xFF
> -#define I2C_SCLL_HSSCLL 8
> -#define I2C_SCLH_HSSCLL_M 0xFF
> -#define I2C_SCLH_SCLH 0
> -#define I2C_SCLH_SCLH_M 0xFF
> -#define I2C_SCLH_HSSCLH 8
> -#define I2C_SCLH_HSSCLH_M 0xFF
> -
> -#define OMAP_I2C_STANDARD 100000
> -#define OMAP_I2C_FAST_MODE 400000
> -#define OMAP_I2C_HIGH_SPEED 3400000
> -
> -#define SYSTEM_CLOCK_12 12000000
> -#define SYSTEM_CLOCK_13 13000000
> -#define SYSTEM_CLOCK_192 19200000
> -#define SYSTEM_CLOCK_96 96000000
> -
> -/* Use the reference value of 96MHz if not explicitly set by the board */
> -#ifndef I2C_IP_CLK
> -#define I2C_IP_CLK SYSTEM_CLOCK_96
> -#endif
> -
> -/*
> - * The reference minimum clock for high speed is 19.2MHz.
> - * The linux 2.6.30 kernel uses this value.
> - * The reference minimum clock for fast mode is 9.6MHz
> - * The reference minimum clock for standard mode is 4MHz
> - * In TRM, the value of 12MHz is used.
> - */
> -#ifndef I2C_INTERNAL_SAMPLING_CLK
> -#define I2C_INTERNAL_SAMPLING_CLK 19200000
> -#endif
> -
> -/*
> - * The equation for the low and high time is
> - * tlow = scll + scll_trim = (sampling clock * tlow_duty) / speed
> - * thigh = sclh + sclh_trim = (sampling clock * (1 - tlow_duty)) / speed
> - *
> - * If the duty cycle is 50%
> - *
> - * tlow = scll + scll_trim = sampling clock / (2 * speed)
> - * thigh = sclh + sclh_trim = sampling clock / (2 * speed)
> - *
> - * In TRM
> - * scll_trim = 7
> - * sclh_trim = 5
> - *
> - * The linux 2.6.30 kernel uses
> - * scll_trim = 6
> - * sclh_trim = 6
> - *
> - * These are the trim values for standard and fast speed
> - */
> -#ifndef I2C_FASTSPEED_SCLL_TRIM
> -#define I2C_FASTSPEED_SCLL_TRIM 6
> -#endif
> -#ifndef I2C_FASTSPEED_SCLH_TRIM
> -#define I2C_FASTSPEED_SCLH_TRIM 6
> -#endif
> -
> -/* These are the trim values for high speed */
> -#ifndef I2C_HIGHSPEED_PHASE_ONE_SCLL_TRIM
> -#define I2C_HIGHSPEED_PHASE_ONE_SCLL_TRIM I2C_FASTSPEED_SCLL_TRIM
> -#endif
> -#ifndef I2C_HIGHSPEED_PHASE_ONE_SCLH_TRIM
> -#define I2C_HIGHSPEED_PHASE_ONE_SCLH_TRIM I2C_FASTSPEED_SCLH_TRIM
> -#endif
> -#ifndef I2C_HIGHSPEED_PHASE_TWO_SCLL_TRIM
> -#define I2C_HIGHSPEED_PHASE_TWO_SCLL_TRIM I2C_FASTSPEED_SCLL_TRIM
> -#endif
> -#ifndef I2C_HIGHSPEED_PHASE_TWO_SCLH_TRIM
> -#define I2C_HIGHSPEED_PHASE_TWO_SCLH_TRIM I2C_FASTSPEED_SCLH_TRIM
> -#endif
> -
> -#define I2C_PSC_MAX 0x0f
> -#define I2C_PSC_MIN 0x00
> -
> -#endif /* _OMAP24XX_I2C_H_ */
>
>
> --
> DENX Software Engineering GmbH, Managing Director: Wolfgang Denk
> HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
>
>
--
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
More information about the U-Boot
mailing list