[U-Boot] [PATCH] blackfin: rename blackfin i2c driver to adi

This driver is not only used on blackfin. So it's better to rename it and access i2c registers by standard io functions. Fix coding style as well.
Signed-off-by: Scott Jiang scott.jiang.linux@gmail.com --- drivers/i2c/Makefile | 2 +- drivers/i2c/{bfin-twi_i2c.c => adi_i2c.c} | 154 +++++++++++++++-------------- include/configs/bct-brettl2.h | 2 +- include/configs/bf518f-ezbrd.h | 2 +- include/configs/bf526-ezbrd.h | 2 +- include/configs/bf527-ad7160-eval.h | 2 +- include/configs/bf527-ezkit.h | 2 +- include/configs/bf527-sdp.h | 2 +- include/configs/bf537-minotaur.h | 2 +- include/configs/bf537-pnav.h | 2 +- include/configs/bf537-srv1.h | 2 +- include/configs/bf537-stamp.h | 2 +- include/configs/bf538f-ezkit.h | 2 +- include/configs/bf548-ezkit.h | 2 +- include/configs/bf609-ezkit.h | 2 +- include/configs/br4.h | 2 +- include/configs/cm-bf527.h | 2 +- include/configs/cm-bf537e.h | 2 +- include/configs/cm-bf537u.h | 2 +- include/configs/cm-bf548.h | 2 +- include/configs/pr1.h | 2 +- include/configs/tcm-bf518.h | 2 +- include/configs/tcm-bf537.h | 2 +- 23 files changed, 103 insertions(+), 95 deletions(-) rename drivers/i2c/{bfin-twi_i2c.c => adi_i2c.c} (72%)
diff --git a/drivers/i2c/Makefile b/drivers/i2c/Makefile index d067897..b7f0098 100644 --- a/drivers/i2c/Makefile +++ b/drivers/i2c/Makefile @@ -5,7 +5,7 @@ # SPDX-License-Identifier: GPL-2.0+ #
-obj-$(CONFIG_BFIN_TWI_I2C) += bfin-twi_i2c.o +obj-$(CONFIG_ADI_I2C) += adi_i2c.o obj-$(CONFIG_I2C_MV) += mv_i2c.o obj-$(CONFIG_PCA9564_I2C) += pca9564_i2c.o obj-$(CONFIG_TSI108_I2C) += tsi108_i2c.o diff --git a/drivers/i2c/bfin-twi_i2c.c b/drivers/i2c/adi_i2c.c similarity index 72% rename from drivers/i2c/bfin-twi_i2c.c rename to drivers/i2c/adi_i2c.c index cfab064..c971f03 100644 --- a/drivers/i2c/bfin-twi_i2c.c +++ b/drivers/i2c/adi_i2c.c @@ -1,7 +1,7 @@ /* - * i2c.c - driver for Blackfin on-chip TWI/I2C + * i2c.c - driver for ADI TWI/I2C * - * Copyright (c) 2006-2010 Analog Devices Inc. + * Copyright (c) 2006-2014 Analog Devices Inc. * * Licensed under the GPL-2 or later. */ @@ -9,9 +9,9 @@ #include <common.h> #include <i2c.h>
-#include <asm/blackfin.h> #include <asm/clock.h> -#include <asm/mach-common/bits/twi.h> +#include <asm/twi.h> +#include <asm/io.h>
/* Every register is 32bit aligned, but only 16bits in size */ #define ureg(name) u16 name; u16 __pad_##name; @@ -40,7 +40,7 @@ struct twi_regs { #ifdef TWI_CLKDIV #define TWI0_CLKDIV TWI_CLKDIV #endif -static volatile struct twi_regs *twi = (void *)TWI0_CLKDIV; +static struct twi_regs *twi = (void *)TWI0_CLKDIV;
#ifdef DEBUG # define dmemset(s, c, n) memset(s, c, n) @@ -94,53 +94,54 @@ struct i2c_msg { */ static int wait_for_completion(struct i2c_msg *msg) { - uint16_t int_stat; + u16 int_stat, ctl; ulong timebase = get_timer(0);
do { - int_stat = twi->int_stat; + int_stat = readw(&twi->int_stat);
if (int_stat & XMTSERV) { debugi("processing XMTSERV"); - twi->int_stat = XMTSERV; - SSYNC(); + writew(XMTSERV, &twi->int_stat); if (msg->alen) { - twi->xmt_data8 = *(msg->abuf++); + writew(*(msg->abuf++), &twi->xmt_data8); --msg->alen; } else if (!(msg->flags & I2C_M_COMBO) && msg->len) { - twi->xmt_data8 = *(msg->buf++); + writew(*(msg->buf++), &twi->xmt_data8); --msg->len; } else { - twi->master_ctl |= (msg->flags & I2C_M_COMBO) ? RSTART | MDIR : STOP; - SSYNC(); + ctl = readw(&twi->master_ctl); + if (msg->flags & I2C_M_COMBO) + writew(ctl | RSTART | MDIR, + &twi->master_ctl); + else + writew(ctl | STOP, &twi->master_ctl); } } if (int_stat & RCVSERV) { debugi("processing RCVSERV"); - twi->int_stat = RCVSERV; - SSYNC(); + writew(RCVSERV, &twi->int_stat); if (msg->len) { - *(msg->buf++) = twi->rcv_data8; + *(msg->buf++) = readw(&twi->rcv_data8); --msg->len; } else if (msg->flags & I2C_M_STOP) { - twi->master_ctl |= STOP; - SSYNC(); + ctl = readw(&twi->master_ctl); + writew(ctl | STOP, &twi->master_ctl); } } if (int_stat & MERR) { debugi("processing MERR"); - twi->int_stat = MERR; - SSYNC(); + writew(MERR, &twi->int_stat); return msg->len; } if (int_stat & MCOMP) { debugi("processing MCOMP"); - twi->int_stat = MCOMP; - SSYNC(); + writew(MCOMP, &twi->int_stat); if (msg->flags & I2C_M_COMBO && msg->len) { - twi->master_ctl = (twi->master_ctl & ~RSTART) | + ctl = readw(&twi->master_ctl); + ctl = (ctl & ~RSTART) | (min(msg->len, 0xff) << 6) | MEN | MDIR; - SSYNC(); + writew(ctl, &twi->master_ctl); } else break; } @@ -161,8 +162,11 @@ static int wait_for_completion(struct i2c_msg *msg) * Here we just get the i2c stuff all prepped and ready, and then tail off * into wait_for_completion() for all the bits to go. */ -static int i2c_transfer(uchar chip, uint addr, int alen, uchar *buffer, int len, u8 flags) +static int i2c_transfer(uchar chip, uint addr, int alen, uchar *buffer, + int len, u8 flags) { + int ret; + u16 ctl; uchar addr_buffer[] = { (addr >> 0), (addr >> 8), @@ -175,62 +179,59 @@ static int i2c_transfer(uchar chip, uint addr, int alen, uchar *buffer, int len, .abuf = addr_buffer, .alen = alen, }; - int ret;
dmemset(buffer, 0xff, len); - debugi("chip=0x%x addr=0x%02x alen=%i buf[0]=0x%02x len=%i flags=0x%02x[%s] ", - chip, addr, alen, buffer[0], len, flags, (flags & I2C_M_READ ? "rd" : "wr")); + debugi("chip=0x%x addr=0x%02x alen=%i buf[0]=0x%02x len=%i ", + chip, addr, alen, buffer[0], len); + debugi("flags=0x%02x[%s] ", flags, + (flags & I2C_M_READ ? "rd" : "wr"));
/* wait for things to settle */ - while (twi->master_stat & BUSBUSY) + while (readw(&twi->master_stat) & BUSBUSY) if (ctrlc()) return 1;
/* Set Transmit device address */ - twi->master_addr = chip; + writew(chip, &twi->master_addr);
/* Clear the FIFO before starting things */ - twi->fifo_ctl = XMTFLUSH | RCVFLUSH; - SSYNC(); - twi->fifo_ctl = 0; - SSYNC(); + writew(XMTFLUSH | RCVFLUSH, &twi->fifo_ctl); + writew(0, &twi->fifo_ctl);
/* prime the pump */ if (msg.alen) { len = (msg.flags & I2C_M_COMBO) ? msg.alen : msg.alen + len; debugi("first byte=0x%02x", *msg.abuf); - twi->xmt_data8 = *(msg.abuf++); + writew(*(msg.abuf++), &twi->xmt_data8); --msg.alen; } else if (!(msg.flags & I2C_M_READ) && msg.len) { debugi("first byte=0x%02x", *msg.buf); - twi->xmt_data8 = *(msg.buf++); + writew(*(msg.buf++), &twi->xmt_data8); --msg.len; }
/* clear int stat */ - twi->master_stat = -1; - twi->int_stat = -1; - twi->int_mask = 0; - SSYNC(); + writew(-1, &twi->master_stat); + writew(-1, &twi->int_stat); + writew(0, &twi->int_mask);
/* Master enable */ - twi->master_ctl = - (twi->master_ctl & FAST) | - (min(len, 0xff) << 6) | MEN | - ((msg.flags & I2C_M_READ) ? MDIR : 0); - SSYNC(); - debugi("CTL=0x%04x", twi->master_ctl); + ctl = readw(&twi->master_ctl); + ctl = (ctl & FAST) | (min(len, 0xff) << 6) | MEN | + ((msg.flags & I2C_M_READ) ? MDIR : 0); + writew(ctl, &twi->master_ctl);
/* process the rest */ ret = wait_for_completion(&msg); debugi("ret=%d", ret);
if (ret) { - twi->master_ctl &= ~MEN; - twi->control &= ~TWI_ENA; - SSYNC(); - twi->control |= TWI_ENA; - SSYNC(); + ctl = readw(&twi->master_ctl) & ~MEN; + writew(ctl, &twi->master_ctl); + ctl = readw(&twi->control) & ~TWI_ENA; + writew(ctl, &twi->control); + ctl = readw(&twi->control) | TWI_ENA; + writew(ctl, &twi->control); }
return ret; @@ -247,10 +248,11 @@ int i2c_set_bus_speed(unsigned int speed) /* Set TWI interface clock */ if (clkdiv < I2C_DUTY_MAX || clkdiv > I2C_DUTY_MIN) return -1; - twi->clkdiv = (clkdiv << 8) | (clkdiv & 0xff); + clkdiv = (clkdiv << 8) | (clkdiv & 0xff); + writew(clkdiv, &twi->clkdiv);
/* Don't turn it on */ - twi->master_ctl = (speed > 100000 ? FAST : 0); + writew(speed > 100000 ? FAST : 0, &twi->master_ctl);
return 0; } @@ -261,8 +263,9 @@ int i2c_set_bus_speed(unsigned int speed) */ unsigned int i2c_get_bus_speed(void) { + u16 clkdiv = readw(&twi->clkdiv) & 0xff; /* 10 MHz / (2 * CLKDIV) -> 5 MHz / CLKDIV */ - return 5000000 / (twi->clkdiv & 0xff); + return 5000000 / clkdiv; }
/** @@ -275,27 +278,22 @@ unsigned int i2c_get_bus_speed(void) */ void i2c_init(int speed, int slaveaddr) { - uint8_t prescale = ((get_i2c_clk() / 1000 / 1000 + 5) / 10) & 0x7F; + u16 prescale = ((get_i2c_clk() / 1000 / 1000 + 5) / 10) & 0x7F;
/* Set TWI internal clock as 10MHz */ - twi->control = prescale; + writew(prescale, &twi->control);
/* Set TWI interface clock as specified */ i2c_set_bus_speed(speed);
/* Enable it */ - twi->control = TWI_ENA | prescale; - SSYNC(); + writew(TWI_ENA | prescale, &twi->control);
- debugi("CONTROL:0x%04x CLKDIV:0x%04x", twi->control, twi->clkdiv); + debugi("CONTROL:0x%04x CLKDIV:0x%04x", readw(&twi->control), + readw(&twi->clkdiv));
#if CONFIG_SYS_I2C_SLAVE # error I2C slave support not tested/supported - /* If they want us as a slave, do it */ - if (slaveaddr) { - twi->slave_addr = slaveaddr; - twi->slave_ctl = SEN; - } #endif }
@@ -321,7 +319,8 @@ int i2c_probe(uchar chip) */ int i2c_read(uchar chip, uint addr, int alen, uchar *buffer, int len) { - return i2c_transfer(chip, addr, alen, buffer, len, (alen ? I2C_M_COMBO : I2C_M_READ)); + return i2c_transfer(chip, addr, alen, buffer, + len, (alen ? I2C_M_COMBO : I2C_M_READ)); }
/** @@ -347,15 +346,21 @@ int i2c_set_bus_num(unsigned int bus) { switch (bus) { #if CONFIG_SYS_MAX_I2C_BUS > 0 - case 0: twi = (void *)TWI0_CLKDIV; return 0; + case 0: + twi = (void *)TWI0_CLKDIV; + return 0; #endif #if CONFIG_SYS_MAX_I2C_BUS > 1 - case 1: twi = (void *)TWI1_CLKDIV; return 0; + case 1: + twi = (void *)TWI1_CLKDIV; + return 0; #endif #if CONFIG_SYS_MAX_I2C_BUS > 2 - case 2: twi = (void *)TWI2_CLKDIV; return 0; + case 2: + twi = (void *)TWI2_CLKDIV; + return 0; #endif - default: return -1; + default: return -1; } }
@@ -366,14 +371,17 @@ unsigned int i2c_get_bus_num(void) { switch ((unsigned long)twi) { #if CONFIG_SYS_MAX_I2C_BUS > 0 - case TWI0_CLKDIV: return 0; + case TWI0_CLKDIV: + return 0; #endif #if CONFIG_SYS_MAX_I2C_BUS > 1 - case TWI1_CLKDIV: return 1; + case TWI1_CLKDIV: + return 1; #endif #if CONFIG_SYS_MAX_I2C_BUS > 2 - case TWI2_CLKDIV: return 2; + case TWI2_CLKDIV: + return 2; #endif - default: return -1; + default: return -1; } } diff --git a/include/configs/bct-brettl2.h b/include/configs/bct-brettl2.h index d0828d5..25f3e11 100644 --- a/include/configs/bct-brettl2.h +++ b/include/configs/bct-brettl2.h @@ -122,7 +122,7 @@ /* * I2C Settings */ -#define CONFIG_BFIN_TWI_I2C 1 +#define CONFIG_ADI_I2C 1 #define CONFIG_HARD_I2C 1
diff --git a/include/configs/bf518f-ezbrd.h b/include/configs/bf518f-ezbrd.h index 20f6ed1..a6b02db 100644 --- a/include/configs/bf518f-ezbrd.h +++ b/include/configs/bf518f-ezbrd.h @@ -134,7 +134,7 @@ /* * I2C Settings */ -#define CONFIG_BFIN_TWI_I2C 1 +#define CONFIG_ADI_I2C 1 #define CONFIG_HARD_I2C 1
diff --git a/include/configs/bf526-ezbrd.h b/include/configs/bf526-ezbrd.h index c33d035..b7bc75a 100644 --- a/include/configs/bf526-ezbrd.h +++ b/include/configs/bf526-ezbrd.h @@ -131,7 +131,7 @@ /* * I2C Settings */ -#define CONFIG_BFIN_TWI_I2C 1 +#define CONFIG_ADI_I2C 1 #define CONFIG_HARD_I2C 1
diff --git a/include/configs/bf527-ad7160-eval.h b/include/configs/bf527-ad7160-eval.h index b497f26..a5de11e 100644 --- a/include/configs/bf527-ad7160-eval.h +++ b/include/configs/bf527-ad7160-eval.h @@ -119,7 +119,7 @@ /* * I2C Settings */ -#define CONFIG_BFIN_TWI_I2C 1 +#define CONFIG_ADI_I2C 1 #define CONFIG_HARD_I2C 1
diff --git a/include/configs/bf527-ezkit.h b/include/configs/bf527-ezkit.h index 0bca53f..f3c23d2 100644 --- a/include/configs/bf527-ezkit.h +++ b/include/configs/bf527-ezkit.h @@ -134,7 +134,7 @@ /* * I2C Settings */ -#define CONFIG_BFIN_TWI_I2C 1 +#define CONFIG_ADI_I2C 1 #define CONFIG_HARD_I2C 1
diff --git a/include/configs/bf527-sdp.h b/include/configs/bf527-sdp.h index 9d43b81..c35cd6d 100644 --- a/include/configs/bf527-sdp.h +++ b/include/configs/bf527-sdp.h @@ -103,7 +103,7 @@ /* * I2C Settings */ -#define CONFIG_BFIN_TWI_I2C 1 +#define CONFIG_ADI_I2C 1 #define CONFIG_HARD_I2C 1
diff --git a/include/configs/bf537-minotaur.h b/include/configs/bf537-minotaur.h index 3bc364c..aada1ae 100644 --- a/include/configs/bf537-minotaur.h +++ b/include/configs/bf537-minotaur.h @@ -121,7 +121,7 @@ /* * I2C settings */ -#define CONFIG_BFIN_TWI_I2C 1 +#define CONFIG_ADI_I2C 1 #define CONFIG_HARD_I2C 1 #define CONFIG_SYS_I2C_SPEED 50000 #define CONFIG_SYS_I2C_SLAVE 0 diff --git a/include/configs/bf537-pnav.h b/include/configs/bf537-pnav.h index ba74a69..e5b24d2 100644 --- a/include/configs/bf537-pnav.h +++ b/include/configs/bf537-pnav.h @@ -142,7 +142,7 @@ /* * I2C settings */ -#define CONFIG_BFIN_TWI_I2C 1 +#define CONFIG_ADI_I2C 1 #define CONFIG_HARD_I2C 1
diff --git a/include/configs/bf537-srv1.h b/include/configs/bf537-srv1.h index 0b723cf..638cda8 100644 --- a/include/configs/bf537-srv1.h +++ b/include/configs/bf537-srv1.h @@ -120,7 +120,7 @@ /* * I2C settings */ -#define CONFIG_BFIN_TWI_I2C 1 +#define CONFIG_ADI_I2C 1 #define CONFIG_HARD_I2C 1 #define CONFIG_SYS_I2C_SPEED 50000 #define CONFIG_SYS_I2C_SLAVE 0 diff --git a/include/configs/bf537-stamp.h b/include/configs/bf537-stamp.h index 29f9316..8d59f7f 100644 --- a/include/configs/bf537-stamp.h +++ b/include/configs/bf537-stamp.h @@ -128,7 +128,7 @@ /* * I2C Settings */ -#define CONFIG_BFIN_TWI_I2C 1 +#define CONFIG_ADI_I2C 1 #define CONFIG_HARD_I2C 1
diff --git a/include/configs/bf538f-ezkit.h b/include/configs/bf538f-ezkit.h index a655282..27f2dc9 100644 --- a/include/configs/bf538f-ezkit.h +++ b/include/configs/bf538f-ezkit.h @@ -126,7 +126,7 @@ /* * I2C Settings */ -#define CONFIG_BFIN_TWI_I2C 1 +#define CONFIG_ADI_I2C 1 #define CONFIG_HARD_I2C 1
diff --git a/include/configs/bf548-ezkit.h b/include/configs/bf548-ezkit.h index da5f029..c54d2fa 100644 --- a/include/configs/bf548-ezkit.h +++ b/include/configs/bf548-ezkit.h @@ -134,7 +134,7 @@ /* * I2C Settings */ -#define CONFIG_BFIN_TWI_I2C 1 +#define CONFIG_ADI_I2C 1 #define CONFIG_HARD_I2C 1
diff --git a/include/configs/bf609-ezkit.h b/include/configs/bf609-ezkit.h index 12192ff..cc9e786 100644 --- a/include/configs/bf609-ezkit.h +++ b/include/configs/bf609-ezkit.h @@ -81,7 +81,7 @@ #define CONFIG_PHYLIB
/* i2c Settings */ -#define CONFIG_BFIN_TWI_I2C +#define CONFIG_ADI_I2C #define CONFIG_HARD_I2C
/* diff --git a/include/configs/br4.h b/include/configs/br4.h index 3f24008..4be4e84 100644 --- a/include/configs/br4.h +++ b/include/configs/br4.h @@ -102,7 +102,7 @@ /* * I2C Settings */ -#define CONFIG_BFIN_TWI_I2C +#define CONFIG_ADI_I2C #define CONFIG_HARD_I2C
diff --git a/include/configs/cm-bf527.h b/include/configs/cm-bf527.h index f5351ad..6a9064e 100644 --- a/include/configs/cm-bf527.h +++ b/include/configs/cm-bf527.h @@ -113,7 +113,7 @@ /* * I2C Settings */ -#define CONFIG_BFIN_TWI_I2C 1 +#define CONFIG_ADI_I2C 1 #define CONFIG_HARD_I2C 1
diff --git a/include/configs/cm-bf537e.h b/include/configs/cm-bf537e.h index 1729b44..e80ed8c 100644 --- a/include/configs/cm-bf537e.h +++ b/include/configs/cm-bf537e.h @@ -122,7 +122,7 @@ /* * I2C Settings */ -#define CONFIG_BFIN_TWI_I2C 1 +#define CONFIG_ADI_I2C 1 #define CONFIG_HARD_I2C 1
diff --git a/include/configs/cm-bf537u.h b/include/configs/cm-bf537u.h index 272aa74..4740081 100644 --- a/include/configs/cm-bf537u.h +++ b/include/configs/cm-bf537u.h @@ -120,7 +120,7 @@ /* * I2C Settings */ -#define CONFIG_BFIN_TWI_I2C 1 +#define CONFIG_ADI_I2C 1 #define CONFIG_HARD_I2C 1
diff --git a/include/configs/cm-bf548.h b/include/configs/cm-bf548.h index 7f27eda..7c9d1cd 100644 --- a/include/configs/cm-bf548.h +++ b/include/configs/cm-bf548.h @@ -104,7 +104,7 @@ /* * I2C Settings */ -#define CONFIG_BFIN_TWI_I2C 1 +#define CONFIG_ADI_I2C 1 #define CONFIG_HARD_I2C 1
diff --git a/include/configs/pr1.h b/include/configs/pr1.h index 0f57e86..d737840 100644 --- a/include/configs/pr1.h +++ b/include/configs/pr1.h @@ -102,7 +102,7 @@ /* * I2C Settings */ -#define CONFIG_BFIN_TWI_I2C +#define CONFIG_ADI_I2C #define CONFIG_HARD_I2C
diff --git a/include/configs/tcm-bf518.h b/include/configs/tcm-bf518.h index 6673026..4de48cf 100644 --- a/include/configs/tcm-bf518.h +++ b/include/configs/tcm-bf518.h @@ -103,7 +103,7 @@ /* * I2C Settings */ -#define CONFIG_BFIN_TWI_I2C 1 +#define CONFIG_ADI_I2C 1 #define CONFIG_HARD_I2C 1
diff --git a/include/configs/tcm-bf537.h b/include/configs/tcm-bf537.h index 9998343..909aee3 100644 --- a/include/configs/tcm-bf537.h +++ b/include/configs/tcm-bf537.h @@ -122,7 +122,7 @@ /* * I2C Settings */ -#define CONFIG_BFIN_TWI_I2C 1 +#define CONFIG_ADI_I2C 1 #define CONFIG_HARD_I2C 1

Hello Scott,
Am 01.11.2014 07:08, schrieb Scott Jiang:
something is wrong with your clock ... patch is not yet in patchwork ...
This driver is not only used on blackfin. So it's better to rename it and access i2c registers by standard io functions. Fix coding style as well.
Signed-off-by: Scott Jiangscott.jiang.linux@gmail.com
drivers/i2c/Makefile | 2 +- drivers/i2c/{bfin-twi_i2c.c => adi_i2c.c} | 154 +++++++++++++++-------------- include/configs/bct-brettl2.h | 2 +- include/configs/bf518f-ezbrd.h | 2 +- include/configs/bf526-ezbrd.h | 2 +- include/configs/bf527-ad7160-eval.h | 2 +- include/configs/bf527-ezkit.h | 2 +- include/configs/bf527-sdp.h | 2 +- include/configs/bf537-minotaur.h | 2 +- include/configs/bf537-pnav.h | 2 +- include/configs/bf537-srv1.h | 2 +- include/configs/bf537-stamp.h | 2 +- include/configs/bf538f-ezkit.h | 2 +- include/configs/bf548-ezkit.h | 2 +- include/configs/bf609-ezkit.h | 2 +- include/configs/br4.h | 2 +- include/configs/cm-bf527.h | 2 +- include/configs/cm-bf537e.h | 2 +- include/configs/cm-bf537u.h | 2 +- include/configs/cm-bf548.h | 2 +- include/configs/pr1.h | 2 +- include/configs/tcm-bf518.h | 2 +- include/configs/tcm-bf537.h | 2 +- 23 files changed, 103 insertions(+), 95 deletions(-) rename drivers/i2c/{bfin-twi_i2c.c => adi_i2c.c} (72%)
Thanks for this work ... some "nitpicks" ...
diff --git a/drivers/i2c/Makefile b/drivers/i2c/Makefile index d067897..b7f0098 100644 --- a/drivers/i2c/Makefile +++ b/drivers/i2c/Makefile @@ -5,7 +5,7 @@ # SPDX-License-Identifier: GPL-2.0+ #
-obj-$(CONFIG_BFIN_TWI_I2C) += bfin-twi_i2c.o +obj-$(CONFIG_ADI_I2C) += adi_i2c.o
please use something like "CONFIG_SYS_I2C_ADI" and please convert this driver to CONFIG_SYS_I2C framework ...
obj-$(CONFIG_I2C_MV) += mv_i2c.o obj-$(CONFIG_PCA9564_I2C) += pca9564_i2c.o obj-$(CONFIG_TSI108_I2C) += tsi108_i2c.o diff --git a/drivers/i2c/bfin-twi_i2c.c b/drivers/i2c/adi_i2c.c similarity index 72% rename from drivers/i2c/bfin-twi_i2c.c rename to drivers/i2c/adi_i2c.c index cfab064..c971f03 100644 --- a/drivers/i2c/bfin-twi_i2c.c +++ b/drivers/i2c/adi_i2c.c @@ -1,7 +1,7 @@ /*
- i2c.c - driver for Blackfin on-chip TWI/I2C
- i2c.c - driver for ADI TWI/I2C
- Copyright (c) 2006-2010 Analog Devices Inc.
*/
- Copyright (c) 2006-2014 Analog Devices Inc.
- Licensed under the GPL-2 or later.
@@ -9,9 +9,9 @@ #include<common.h> #include<i2c.h>
-#include<asm/blackfin.h> #include<asm/clock.h> -#include<asm/mach-common/bits/twi.h> +#include<asm/twi.h> +#include<asm/io.h>
/* Every register is 32bit aligned, but only 16bits in size */ #define ureg(name) u16 name; u16 __pad_##name; @@ -40,7 +40,7 @@ struct twi_regs { #ifdef TWI_CLKDIV #define TWI0_CLKDIV TWI_CLKDIV #endif -static volatile struct twi_regs *twi = (void *)TWI0_CLKDIV; +static struct twi_regs *twi = (void *)TWI0_CLKDIV;
#ifdef DEBUG # define dmemset(s, c, n) memset(s, c, n) @@ -94,53 +94,54 @@ struct i2c_msg { */ static int wait_for_completion(struct i2c_msg *msg) {
- uint16_t int_stat;
- u16 int_stat, ctl;
This change is not related to the subject of the patch, please split this into seperate patches ...
ulong timebase = get_timer(0);
do {
int_stat = twi->int_stat;
int_stat = readw(&twi->int_stat);
Here too... please fix globally.
if (int_stat& XMTSERV) { debugi("processing XMTSERV");
twi->int_stat = XMTSERV;
SSYNC();
writew(XMTSERV,&twi->int_stat);
Here too...
if (msg->alen) {
twi->xmt_data8 = *(msg->abuf++);
writew(*(msg->abuf++),&twi->xmt_data8); --msg->alen; } else if (!(msg->flags& I2C_M_COMBO)&& msg->len) {
twi->xmt_data8 = *(msg->buf++);
writew(*(msg->buf++),&twi->xmt_data8); --msg->len; } else {
twi->master_ctl |= (msg->flags& I2C_M_COMBO) ? RSTART | MDIR : STOP;
SSYNC();
ctl = readw(&twi->master_ctl);
if (msg->flags& I2C_M_COMBO)
writew(ctl | RSTART | MDIR,
&twi->master_ctl);
else
} if (int_stat& RCVSERV) { debugi("processing RCVSERV");writew(ctl | STOP,&twi->master_ctl); }
twi->int_stat = RCVSERV;
SSYNC();
writew(RCVSERV,&twi->int_stat); if (msg->len) {
*(msg->buf++) = twi->rcv_data8;
*(msg->buf++) = readw(&twi->rcv_data8); --msg->len; } else if (msg->flags& I2C_M_STOP) {
twi->master_ctl |= STOP;
SSYNC();
ctl = readw(&twi->master_ctl);
} if (int_stat& MERR) { debugi("processing MERR");writew(ctl | STOP,&twi->master_ctl); }
twi->int_stat = MERR;
SSYNC();
} if (int_stat& MCOMP) { debugi("processing MCOMP");writew(MERR,&twi->int_stat); return msg->len;
twi->int_stat = MCOMP;
SSYNC();
writew(MCOMP,&twi->int_stat); if (msg->flags& I2C_M_COMBO&& msg->len) {
twi->master_ctl = (twi->master_ctl& ~RSTART) |
ctl = readw(&twi->master_ctl);
ctl = (ctl& ~RSTART) | (min(msg->len, 0xff)<< 6) | MEN | MDIR;
SSYNC();
}writew(ctl,&twi->master_ctl); } else break;
@@ -161,8 +162,11 @@ static int wait_for_completion(struct i2c_msg *msg)
- Here we just get the i2c stuff all prepped and ready, and then tail off
- into wait_for_completion() for all the bits to go.
*/ -static int i2c_transfer(uchar chip, uint addr, int alen, uchar *buffer, int len, u8 flags) +static int i2c_transfer(uchar chip, uint addr, int alen, uchar *buffer,
{int len, u8 flags)
- int ret;
- u16 ctl; uchar addr_buffer[] = { (addr>> 0), (addr>> 8),
@@ -175,62 +179,59 @@ static int i2c_transfer(uchar chip, uint addr, int alen, uchar *buffer, int len, .abuf = addr_buffer, .alen = alen, };
int ret;
dmemset(buffer, 0xff, len);
debugi("chip=0x%x addr=0x%02x alen=%i buf[0]=0x%02x len=%i flags=0x%02x[%s] ",
chip, addr, alen, buffer[0], len, flags, (flags& I2C_M_READ ? "rd" : "wr"));
debugi("chip=0x%x addr=0x%02x alen=%i buf[0]=0x%02x len=%i ",
chip, addr, alen, buffer[0], len);
debugi("flags=0x%02x[%s] ", flags,
(flags& I2C_M_READ ? "rd" : "wr"));
/* wait for things to settle */
- while (twi->master_stat& BUSBUSY)
while (readw(&twi->master_stat)& BUSBUSY) if (ctrlc()) return 1;
/* Set Transmit device address */
- twi->master_addr = chip;
writew(chip,&twi->master_addr);
/* Clear the FIFO before starting things */
- twi->fifo_ctl = XMTFLUSH | RCVFLUSH;
- SSYNC();
- twi->fifo_ctl = 0;
- SSYNC();
writew(XMTFLUSH | RCVFLUSH,&twi->fifo_ctl);
writew(0,&twi->fifo_ctl);
/* prime the pump */ if (msg.alen) { len = (msg.flags& I2C_M_COMBO) ? msg.alen : msg.alen + len; debugi("first byte=0x%02x", *msg.abuf);
twi->xmt_data8 = *(msg.abuf++);
--msg.alen; } else if (!(msg.flags& I2C_M_READ)&& msg.len) { debugi("first byte=0x%02x", *msg.buf);writew(*(msg.abuf++),&twi->xmt_data8);
twi->xmt_data8 = *(msg.buf++);
writew(*(msg.buf++),&twi->xmt_data8);
--msg.len; }
/* clear int stat */
- twi->master_stat = -1;
- twi->int_stat = -1;
- twi->int_mask = 0;
- SSYNC();
writew(-1,&twi->master_stat);
writew(-1,&twi->int_stat);
writew(0,&twi->int_mask);
/* Master enable */
- twi->master_ctl =
(twi->master_ctl& FAST) |
(min(len, 0xff)<< 6) | MEN |
((msg.flags& I2C_M_READ) ? MDIR : 0);
- SSYNC();
- debugi("CTL=0x%04x", twi->master_ctl);
ctl = readw(&twi->master_ctl);
ctl = (ctl& FAST) | (min(len, 0xff)<< 6) | MEN |
((msg.flags& I2C_M_READ) ? MDIR : 0);
writew(ctl,&twi->master_ctl);
/* process the rest */ ret = wait_for_completion(&msg); debugi("ret=%d", ret);
if (ret) {
twi->master_ctl&= ~MEN;
twi->control&= ~TWI_ENA;
SSYNC();
twi->control |= TWI_ENA;
SSYNC();
ctl = readw(&twi->master_ctl)& ~MEN;
writew(ctl,&twi->master_ctl);
ctl = readw(&twi->control)& ~TWI_ENA;
writew(ctl,&twi->control);
ctl = readw(&twi->control) | TWI_ENA;
writew(ctl,&twi->control);
}
return ret;
@@ -247,10 +248,11 @@ int i2c_set_bus_speed(unsigned int speed) /* Set TWI interface clock */ if (clkdiv< I2C_DUTY_MAX || clkdiv> I2C_DUTY_MIN) return -1;
- twi->clkdiv = (clkdiv<< 8) | (clkdiv& 0xff);
clkdiv = (clkdiv<< 8) | (clkdiv& 0xff);
writew(clkdiv,&twi->clkdiv);
/* Don't turn it on */
- twi->master_ctl = (speed> 100000 ? FAST : 0);
writew(speed> 100000 ? FAST : 0,&twi->master_ctl);
return 0; }
@@ -261,8 +263,9 @@ int i2c_set_bus_speed(unsigned int speed) */ unsigned int i2c_get_bus_speed(void) {
- u16 clkdiv = readw(&twi->clkdiv)& 0xff; /* 10 MHz / (2 * CLKDIV) -> 5 MHz / CLKDIV */
- return 5000000 / (twi->clkdiv& 0xff);
return 5000000 / clkdiv; }
/**
@@ -275,27 +278,22 @@ unsigned int i2c_get_bus_speed(void) */ void i2c_init(int speed, int slaveaddr) {
- uint8_t prescale = ((get_i2c_clk() / 1000 / 1000 + 5) / 10)& 0x7F;
u16 prescale = ((get_i2c_clk() / 1000 / 1000 + 5) / 10)& 0x7F;
/* Set TWI internal clock as 10MHz */
- twi->control = prescale;
writew(prescale,&twi->control);
/* Set TWI interface clock as specified */ i2c_set_bus_speed(speed);
/* Enable it */
- twi->control = TWI_ENA | prescale;
- SSYNC();
- writew(TWI_ENA | prescale,&twi->control);
- debugi("CONTROL:0x%04x CLKDIV:0x%04x", twi->control, twi->clkdiv);
debugi("CONTROL:0x%04x CLKDIV:0x%04x", readw(&twi->control),
readw(&twi->clkdiv));
#if CONFIG_SYS_I2C_SLAVE # error I2C slave support not tested/supported
- /* If they want us as a slave, do it */
- if (slaveaddr) {
twi->slave_addr = slaveaddr;
twi->slave_ctl = SEN;
- } #endif }
@@ -321,7 +319,8 @@ int i2c_probe(uchar chip) */ int i2c_read(uchar chip, uint addr, int alen, uchar *buffer, int len) {
- return i2c_transfer(chip, addr, alen, buffer, len, (alen ? I2C_M_COMBO : I2C_M_READ));
return i2c_transfer(chip, addr, alen, buffer,
len, (alen ? I2C_M_COMBO : I2C_M_READ));
}
/**
@@ -347,15 +346,21 @@ int i2c_set_bus_num(unsigned int bus) { switch (bus) { #if CONFIG_SYS_MAX_I2C_BUS> 0
case 0: twi = (void *)TWI0_CLKDIV; return 0;
- case 0:
twi = (void *)TWI0_CLKDIV;
#endif #if CONFIG_SYS_MAX_I2C_BUS> 1return 0;
case 1: twi = (void *)TWI1_CLKDIV; return 0;
- case 1:
twi = (void *)TWI1_CLKDIV;
#endif #if CONFIG_SYS_MAX_I2C_BUS> 2return 0;
case 2: twi = (void *)TWI2_CLKDIV; return 0;
- case 2:
twi = (void *)TWI2_CLKDIV;
#endifreturn 0;
default: return -1;
- default: return -1; } }
@@ -366,14 +371,17 @@ unsigned int i2c_get_bus_num(void) { switch ((unsigned long)twi) { #if CONFIG_SYS_MAX_I2C_BUS> 0
case TWI0_CLKDIV: return 0;
- case TWI0_CLKDIV:
#endif #if CONFIG_SYS_MAX_I2C_BUS> 1return 0;
case TWI1_CLKDIV: return 1;
- case TWI1_CLKDIV:
#endif #if CONFIG_SYS_MAX_I2C_BUS> 2return 1;
case TWI2_CLKDIV: return 2;
- case TWI2_CLKDIV:
#endifreturn 2;
default: return -1;
- default: return -1; } }
diff --git a/include/configs/bct-brettl2.h b/include/configs/bct-brettl2.h index d0828d5..25f3e11 100644 --- a/include/configs/bct-brettl2.h +++ b/include/configs/bct-brettl2.h @@ -122,7 +122,7 @@ /*
- I2C Settings
*/ -#define CONFIG_BFIN_TWI_I2C 1 +#define CONFIG_ADI_I2C 1 #define CONFIG_HARD_I2C 1
Please get rid of HARD_I2C ... thanks!
[...]
bye, Heiko

Hi Heiko,
static int wait_for_completion(struct i2c_msg *msg) {
uint16_t int_stat;
u16 int_stat, ctl;
This change is not related to the subject of the patch, please split this into seperate patches ...
ulong timebase = get_timer(0); do {
int_stat = twi->int_stat;
int_stat = readw(&twi->int_stat);
Here too... please fix globally.
This patch is to modify blackfin specific string or api to generic. So I use standard io api readl/writel here. I'm not sure what you mean.
Scott

Hello Scott Jiang,
Am 31.10.2014 08:12, schrieb Scott Jiang:
Hi Heiko,
static int wait_for_completion(struct i2c_msg *msg) {
uint16_t int_stat;
u16 int_stat, ctl;
This change is not related to the subject of the patch, please split this into seperate patches ...
ulong timebase = get_timer(0); do {
int_stat = twi->int_stat;
int_stat = readw(&twi->int_stat);
Here too... please fix globally.
This patch is to modify blackfin specific string or api to generic. So I use standard io api readl/writel here. I'm not sure what you mean.
The use of the generic i/o accessors would be a seperate patch... subject something like "blackfin i2c: use generic io accessors"
and put the rename specific changes into "blackfin: rename blackfin i2c driver to adi"
bye, Heiko
participants (2)
-
Heiko Schocher
-
Scott Jiang