All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH V4 0/4] Improve I2C for orion5x, kirkwood and ED Mini V2
@ 2010-08-27 16:26 Albert Aribaud
  2010-08-27 16:26 ` [U-Boot] [PATCH V4 1/4] suen3: remove CONFIG_HARD_I2C and related defines Albert Aribaud
                   ` (4 more replies)
  0 siblings, 5 replies; 13+ messages in thread
From: Albert Aribaud @ 2010-08-27 16:26 UTC (permalink / raw)
  To: u-boot

SUMMARY:

This patchset improves the driver for the Marvell TWSI interface found
on orion5x and kirkwood SoCs and adds I2C support to the orion5x-based
ED Mini V2 board. The mvtwsi driver is a complete rewrite, 50% shorter
in source code lines, 25% smaller in object size, much simpler and way
faster than the kirkwood_i2c driver it replaces.

PATCH SET:

Patch 1 removes dependencies on kirwkood_i2c from suen3, the only
board that mentioned it. Patch 2 renames the driver from kirkwood_i2c
to mvtwsi. Patch 3 replaces the old code with the new one. Patch 4
adds support for I2C in orion5x-based ED Mini V2.

TESTS:

This driver has been tested on an ED Mini V2 with basic u-boot i2c
commands, on an 5C372a RTC and an HT24LC08 1 KB eeprom (read+write).

HISTORY:

V1:	Initial submission as an addition rather than a replacement.

V2:	Fixed copyright line.
	Made mvtwsi a replacement for kirkwood_i2c.
	Made patches checkpatch-clean: 0 errors, 0 warnings.
	Various cosmetic changes.
	Removed useless i2c_end() function.

V3:	Reduced line lengths below 78 characters.
	Removed blank line after function description block comment.

V4:	Changed CONFIG_I2C_DRIVER_MVTWSI into CONFIG_I2C_MVTWSI.
	Really fixed copyright line.
	Added and documented kirkwood support.
	Shortened extended_slave_address into xtnd_slave_addr.
	Added explanation on default/init baudrate value.
	Moved I2C config settings under #ifdef CONFIG_CMD_I2C.

Albert Aribaud (4):
  suen3: remove CONFIG_HARD_I2C and related defines
  i2c: rename kirkwood_i2c to mvtwsi
  i2c: rewrite mvtwsi, support orion5x and kirkwood
  edminiv2: add I2C support using mvtwsi driver

 drivers/i2c/Makefile       |    2 +-
 drivers/i2c/kirkwood_i2c.c |  496 --------------------------------------------
 drivers/i2c/mvtwsi.c       |  428 ++++++++++++++++++++++++++++++++++++++
 include/configs/edminiv2.h |   11 +
 include/configs/km_arm.h   |    8 -
 5 files changed, 440 insertions(+), 505 deletions(-)
 delete mode 100644 drivers/i2c/kirkwood_i2c.c
 create mode 100644 drivers/i2c/mvtwsi.c

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [U-Boot] [PATCH V4 1/4] suen3: remove CONFIG_HARD_I2C and related defines
  2010-08-27 16:26 [U-Boot] [PATCH V4 0/4] Improve I2C for orion5x, kirkwood and ED Mini V2 Albert Aribaud
@ 2010-08-27 16:26 ` Albert Aribaud
  2010-08-30  9:29   ` Prafulla Wadaskar
  2010-08-27 16:26 ` [U-Boot] [PATCH V4 2/4] i2c: rename kirkwood_i2c to mvtwsi Albert Aribaud
                   ` (3 subsequent siblings)
  4 siblings, 1 reply; 13+ messages in thread
From: Albert Aribaud @ 2010-08-27 16:26 UTC (permalink / raw)
  To: u-boot

These are not used on this board, which uses soft I2C instead.

Signed-off-by: Albert Aribaud <albert.aribaud@free.fr>
---
 include/configs/km_arm.h |    8 --------
 1 files changed, 0 insertions(+), 8 deletions(-)

diff --git a/include/configs/km_arm.h b/include/configs/km_arm.h
index 6519c90..1617e69 100644
--- a/include/configs/km_arm.h
+++ b/include/configs/km_arm.h
@@ -142,16 +142,8 @@
 /*
  * I2C related stuff
  */
-#undef	CONFIG_HARD_I2C		/* I2C with hardware support */
 #define	CONFIG_SOFT_I2C		/* I2C bit-banged	*/
 
-#if defined(CONFIG_HARD_I2C)
-#define	CONFIG_I2C_KIRKWOOD
-#define	CONFIG_I2C_KW_REG_BASE		KW_TWSI_BASE
-#define	CONFIG_SYS_I2C_SLAVE		0x0
-#define	CONFIG_SYS_I2C_SPEED		100000
-#endif
-
 #define	CONFIG_KIRKWOOD_GPIO		/* Enable GPIO Support */
 #if defined(CONFIG_SOFT_I2C)
 #ifndef __ASSEMBLY__
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [U-Boot] [PATCH V4 2/4] i2c: rename kirkwood_i2c to mvtwsi
  2010-08-27 16:26 [U-Boot] [PATCH V4 0/4] Improve I2C for orion5x, kirkwood and ED Mini V2 Albert Aribaud
  2010-08-27 16:26 ` [U-Boot] [PATCH V4 1/4] suen3: remove CONFIG_HARD_I2C and related defines Albert Aribaud
@ 2010-08-27 16:26 ` Albert Aribaud
  2010-08-30  9:45   ` Prafulla Wadaskar
  2010-08-27 16:26 ` [U-Boot] [PATCH V4 3/4] i2c: rewrite mvtwsi, support orion5x and kirkwood Albert Aribaud
                   ` (2 subsequent siblings)
  4 siblings, 1 reply; 13+ messages in thread
From: Albert Aribaud @ 2010-08-27 16:26 UTC (permalink / raw)
  To: u-boot

This driver is not kirkwood-specific and can also be used
e.g. by orion5x. Rename to a SoC-neutral name.

Signed-off-by: Albert Aribaud <albert.aribaud@free.fr>
---
 drivers/i2c/Makefile                     |    2 +-
 drivers/i2c/{kirkwood_i2c.c => mvtwsi.c} |    0
 2 files changed, 1 insertions(+), 1 deletions(-)
 rename drivers/i2c/{kirkwood_i2c.c => mvtwsi.c} (100%)

diff --git a/drivers/i2c/Makefile b/drivers/i2c/Makefile
index d2c2515..8921ff9 100644
--- a/drivers/i2c/Makefile
+++ b/drivers/i2c/Makefile
@@ -28,7 +28,7 @@ LIB	:= $(obj)libi2c.a
 COBJS-$(CONFIG_BFIN_TWI_I2C) += bfin-twi_i2c.o
 COBJS-$(CONFIG_DRIVER_DAVINCI_I2C) += davinci_i2c.o
 COBJS-$(CONFIG_FSL_I2C) += fsl_i2c.o
-COBJS-$(CONFIG_I2C_KIRKWOOD) += kirkwood_i2c.o
+COBJS-$(CONFIG_I2C_MVTWSI) += mvtwsi.o
 COBJS-$(CONFIG_I2C_MXC) += mxc_i2c.o
 COBJS-$(CONFIG_DRIVER_OMAP1510_I2C) += omap1510_i2c.o
 COBJS-$(CONFIG_DRIVER_OMAP24XX_I2C) += omap24xx_i2c.o
diff --git a/drivers/i2c/kirkwood_i2c.c b/drivers/i2c/mvtwsi.c
similarity index 100%
rename from drivers/i2c/kirkwood_i2c.c
rename to drivers/i2c/mvtwsi.c
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [U-Boot] [PATCH V4 3/4] i2c: rewrite mvtwsi, support orion5x and kirkwood
  2010-08-27 16:26 [U-Boot] [PATCH V4 0/4] Improve I2C for orion5x, kirkwood and ED Mini V2 Albert Aribaud
  2010-08-27 16:26 ` [U-Boot] [PATCH V4 1/4] suen3: remove CONFIG_HARD_I2C and related defines Albert Aribaud
  2010-08-27 16:26 ` [U-Boot] [PATCH V4 2/4] i2c: rename kirkwood_i2c to mvtwsi Albert Aribaud
@ 2010-08-27 16:26 ` Albert Aribaud
  2010-08-30  9:45   ` Prafulla Wadaskar
  2010-08-27 16:26 ` [U-Boot] [PATCH V4 4/4] edminiv2: add I2C support using mvtwsi driver Albert Aribaud
  2010-08-30 13:34 ` [U-Boot] [PATCH V4 0/4] Improve I2C for orion5x, kirkwood and ED Mini V2 Heiko Schocher
  4 siblings, 1 reply; 13+ messages in thread
From: Albert Aribaud @ 2010-08-27 16:26 UTC (permalink / raw)
  To: u-boot

This rewrite of the mvtwsi driver is 25% smaller and much
faster and simpler than the previous code.

Signed-off-by: Albert Aribaud <albert.aribaud@free.fr>
---
 drivers/i2c/mvtwsi.c |  750 +++++++++++++++++++++++---------------------------
 1 files changed, 341 insertions(+), 409 deletions(-)

diff --git a/drivers/i2c/mvtwsi.c b/drivers/i2c/mvtwsi.c
index a4409be..16a536f 100644
--- a/drivers/i2c/mvtwsi.c
+++ b/drivers/i2c/mvtwsi.c
@@ -1,11 +1,9 @@
 /*
- * Driver for the i2c controller on the Marvell line of host bridges
- * (e.g, gt642[46]0, mv643[46]0, mv644[46]0, Orion SoC family),
- * and Kirkwood family.
+ * Driver for the TWSI (i2c) controller found on the Marvell
+ * orion5x and kirkwood SoC families.
  *
- * Based on:
- * Author: Mark A. Greer <mgreer@mvista.com>
- * 2005 (c) MontaVista, Software, Inc.
+ * Author: Albert Aribaud <albert.aribaud@free.fr>
+ * Copyright (c) 2010 Albert Aribaud.
  *
  * See file CREDITS for list of people who contributed to this
  * project.
@@ -24,473 +22,407 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
  * MA 02110-1301 USA
- *
- * ported from Linux to u-boot
- * (C) Copyright 2009
- * Heiko Schocher, DENX Software Engineering, hs at denx.de.
  */
+
 #include <common.h>
 #include <i2c.h>
-#include <asm/arch/kirkwood.h>
 #include <asm/errno.h>
 #include <asm/io.h>
 
-DECLARE_GLOBAL_DATA_PTR;
+/*
+ * include a file that will provide CONFIG_I2C_MVTWSI_BASE
+ * and possibly other settings
+ */
 
-static unsigned int i2c_bus_num __attribute__ ((section (".data"))) = 0;
-#if defined(CONFIG_I2C_MUX)
-static unsigned int i2c_bus_num_mux __attribute__ ((section ("data"))) = 0;
+#if defined(CONFIG_ORION5X)
+#include <asm/arch/orion5x.h>
+#elif defined(CONFIG_KIRKWOOD)
+#include <asm/arch/kirkwood.h>
+#else
+#error Driver mvtwsi not supported by SoC or board
 #endif
 
-/* Register defines */
-#define	KW_I2C_REG_SLAVE_ADDR			0x00
-#define	KW_I2C_REG_DATA				0x04
-#define	KW_I2C_REG_CONTROL			0x08
-#define	KW_I2C_REG_STATUS			0x0c
-#define	KW_I2C_REG_BAUD				0x0c
-#define	KW_I2C_REG_EXT_SLAVE_ADDR		0x10
-#define	KW_I2C_REG_SOFT_RESET			0x1c
-
-#define	KW_I2C_REG_CONTROL_ACK			0x00000004
-#define	KW_I2C_REG_CONTROL_IFLG			0x00000008
-#define	KW_I2C_REG_CONTROL_STOP			0x00000010
-#define	KW_I2C_REG_CONTROL_START		0x00000020
-#define	KW_I2C_REG_CONTROL_TWSIEN		0x00000040
-#define	KW_I2C_REG_CONTROL_INTEN		0x00000080
-
-/* Ctlr status values */
-#define	KW_I2C_STATUS_BUS_ERR			0x00
-#define	KW_I2C_STATUS_MAST_START		0x08
-#define	KW_I2C_STATUS_MAST_REPEAT_START		0x10
-#define	KW_I2C_STATUS_MAST_WR_ADDR_ACK		0x18
-#define	KW_I2C_STATUS_MAST_WR_ADDR_NO_ACK	0x20
-#define	KW_I2C_STATUS_MAST_WR_ACK		0x28
-#define	KW_I2C_STATUS_MAST_WR_NO_ACK		0x30
-#define	KW_I2C_STATUS_MAST_LOST_ARB		0x38
-#define	KW_I2C_STATUS_MAST_RD_ADDR_ACK		0x40
-#define	KW_I2C_STATUS_MAST_RD_ADDR_NO_ACK	0x48
-#define	KW_I2C_STATUS_MAST_RD_DATA_ACK		0x50
-#define	KW_I2C_STATUS_MAST_RD_DATA_NO_ACK	0x58
-#define	KW_I2C_STATUS_MAST_WR_ADDR_2_ACK	0xd0
-#define	KW_I2C_STATUS_MAST_WR_ADDR_2_NO_ACK	0xd8
-#define	KW_I2C_STATUS_MAST_RD_ADDR_2_ACK	0xe0
-#define	KW_I2C_STATUS_MAST_RD_ADDR_2_NO_ACK	0xe8
-#define	KW_I2C_STATUS_NO_STATUS			0xf8
-
-/* Driver states */
-enum {
-	KW_I2C_STATE_INVALID,
-	KW_I2C_STATE_IDLE,
-	KW_I2C_STATE_WAITING_FOR_START_COND,
-	KW_I2C_STATE_WAITING_FOR_ADDR_1_ACK,
-	KW_I2C_STATE_WAITING_FOR_ADDR_2_ACK,
-	KW_I2C_STATE_WAITING_FOR_SLAVE_ACK,
-	KW_I2C_STATE_WAITING_FOR_SLAVE_DATA,
-};
+/*
+ * TWSI register structure
+ */
 
-/* Driver actions */
-enum {
-	KW_I2C_ACTION_INVALID,
-	KW_I2C_ACTION_CONTINUE,
-	KW_I2C_ACTION_SEND_START,
-	KW_I2C_ACTION_SEND_ADDR_1,
-	KW_I2C_ACTION_SEND_ADDR_2,
-	KW_I2C_ACTION_SEND_DATA,
-	KW_I2C_ACTION_RCV_DATA,
-	KW_I2C_ACTION_RCV_DATA_STOP,
-	KW_I2C_ACTION_SEND_STOP,
+struct  mvtwsi_registers {
+	u32 slave_address;
+	u32 data;
+	u32 control;
+	union {
+		u32 status;	/* when reading */
+		u32 baudrate;	/* when writing */
+	};
+	u32 xtnd_slave_addr;
+	u32 reserved[2];
+	u32 soft_reset;
 };
 
-/* defines to get compatible with Linux driver */
-#define IRQ_NONE	0x0
-#define IRQ_HANDLED	0x01
+/*
+ * Control register fields
+ */
 
-#define I2C_M_TEN	0x01
-#define I2C_M_RD	0x02
-#define	I2C_M_REV_DIR_ADDR	0x04;
+#define	MVTWSI_CONTROL_ACK	0x00000004
+#define	MVTWSI_CONTROL_IFLG	0x00000008
+#define	MVTWSI_CONTROL_STOP	0x00000010
+#define	MVTWSI_CONTROL_START	0x00000020
+#define	MVTWSI_CONTROL_TWSIEN	0x00000040
+#define	MVTWSI_CONTROL_INTEN	0x00000080
 
-struct i2c_msg {
-	u32	addr;
-	u32	flags;
-	u8	*buf;
-	u32	len;
-};
+/*
+ * Status register values -- only those expected in normal master
+ * operation on non-10-bit-address devices; whatever status we don't
+ * expect in nominal conditions (bus errors, arbitration losses,
+ * missing ACKs...) we just pass back to the caller as an error
+ * code.
+ */
 
-struct kirkwood_i2c_data {
-	int			irq;
-	u32			state;
-	u32			action;
-	u32			aborting;
-	u32			cntl_bits;
-	void			*reg_base;
-	u32			reg_base_p;
-	u32			reg_size;
-	u32			addr1;
-	u32			addr2;
-	u32			bytes_left;
-	u32			byte_posn;
-	u32			block;
-	int			rc;
-	u32			freq_m;
-	u32			freq_n;
-	struct i2c_msg		*msg;
-};
+#define	MVTWSI_STATUS_START		0x08
+#define	MVTWSI_STATUS_REPEATED_START	0x10
+#define	MVTWSI_STATUS_ADDR_W_ACK	0x18
+#define	MVTWSI_STATUS_DATA_W_ACK	0x28
+#define	MVTWSI_STATUS_ADDR_R_ACK	0x40
+#define	MVTWSI_STATUS_ADDR_R_NAK	0x48
+#define	MVTWSI_STATUS_DATA_R_ACK	0x50
+#define	MVTWSI_STATUS_DATA_R_NAK	0x58
+#define	MVTWSI_STATUS_IDLE		0xF8
+
+/*
+ * The single instance of the controller we'll be dealing with
+ */
 
-static struct kirkwood_i2c_data __drv_data __attribute__ ((section (".data")));
-static struct kirkwood_i2c_data *drv_data = &__drv_data;
-static struct i2c_msg __i2c_msg __attribute__ ((section (".data")));
-static struct i2c_msg *kirkwood_i2c_msg = &__i2c_msg;
+static struct  mvtwsi_registers *twsi =
+	(struct  mvtwsi_registers *) CONFIG_I2C_MVTWSI_BASE;
 
 /*
- *****************************************************************************
- *
- *	Finite State Machine & Interrupt Routines
- *
- *****************************************************************************
+ * Returned statuses are 0 for success and nonzero otherwise.
+ * Currently, cmd_i2c and cmd_eeprom do not interpret an error status.
+ * Thus to ease debugging, the return status contains some debug info:
+ * - bits 31..24 are error class: 1 is timeout, 2 is 'status mismatch'.
+ * - bits 23..16 are the last value of the control register.
+ * - bits 15..8 are the last value of the status register.
+ * - bits 7..0 are the expected value of the status register.
  */
 
-static inline int abs(int n)
-{
-	 if(n >= 0)
-		return n;
-	else
-		return n * -1;
-}
+#define MVTWSI_ERROR_WRONG_STATUS	0x01
+#define MVTWSI_ERROR_TIMEOUT		0x02
 
-static void kirkwood_calculate_speed(int speed)
-{
-	int	calcspeed;
-	int	diff;
-	int	best_diff = CONFIG_SYS_TCLK;
-	int	best_speed = 0;
-	int	m, n;
-	int	tmp[8] = {2, 4, 8, 16, 32, 64, 128, 256};
+#define MVTWSI_ERROR(ec, lc, ls, es) (((ec << 24) & 0xFF000000) | \
+	((lc << 16) & 0x00FF0000) | ((ls<<8) & 0x0000FF00) | (es & 0xFF))
 
-	for (n = 0; n < 8; n++) {
-		for (m = 0; m < 16; m++) {
-			calcspeed = CONFIG_SYS_TCLK / (10 * (m + 1) * tmp[n]);
-			diff = abs((speed - calcspeed));
-			if ( diff < best_diff) {
-				best_diff = diff;
-				best_speed = calcspeed;
-				drv_data->freq_m = m;
-				drv_data->freq_n = n;
-			}
+/*
+ * Wait for IFLG to raise, or return 'timeout'; then if status is as expected,
+ * return 0 (ok) or return 'wrong status'.
+ */
+static int twsi_wait(int expected_status)
+{
+	int control, status;
+	int timeout = 1000;
+
+	do {
+		control = readl(&twsi->control);
+		if (control & MVTWSI_CONTROL_IFLG) {
+			status = readl(&twsi->status);
+			if (status == expected_status)
+				return 0;
+			else
+				return MVTWSI_ERROR(
+					MVTWSI_ERROR_WRONG_STATUS,
+					control, status, expected_status);
 		}
-	}
+		udelay(10); /* one clock cycle at 100 kHz */
+	} while (timeout--);
+	status = readl(&twsi->status);
+	return MVTWSI_ERROR(
+		MVTWSI_ERROR_TIMEOUT, control, status, expected_status);
 }
 
-/* Reset hardware and initialize FSM */
-static void
-kirkwood_i2c_hw_init(int speed, int slaveadd)
+/*
+ * These flags are ORed to any write to the control register
+ * They allow global setting of TWSIEN and ACK.
+ * By default none are set.
+ * twsi_start() sets TWSIEN (in case the controller was disabled)
+ * twsi_recv() sets ACK or resets it depending on expected status.
+ */
+static u8 twsi_control_flags = MVTWSI_CONTROL_TWSIEN;
+
+/*
+ * Assert the START condition, either in a single I2C transaction
+ * or inside back-to-back ones (repeated starts).
+ */
+static int twsi_start(int expected_status)
 {
-	drv_data->state = KW_I2C_STATE_IDLE;
-
-	kirkwood_calculate_speed(speed);
-	writel(0, CONFIG_I2C_KW_REG_BASE + KW_I2C_REG_SOFT_RESET);
-	writel((((drv_data->freq_m & 0xf) << 3) | (drv_data->freq_n & 0x7)),
-		CONFIG_I2C_KW_REG_BASE + KW_I2C_REG_BAUD);
-	writel(slaveadd, CONFIG_I2C_KW_REG_BASE + KW_I2C_REG_SLAVE_ADDR);
-	writel(0, CONFIG_I2C_KW_REG_BASE + KW_I2C_REG_EXT_SLAVE_ADDR);
-	writel(KW_I2C_REG_CONTROL_TWSIEN | KW_I2C_REG_CONTROL_STOP,
-		CONFIG_I2C_KW_REG_BASE + KW_I2C_REG_CONTROL);
+	/* globally set TWSIEN in case it was not */
+	twsi_control_flags |= MVTWSI_CONTROL_TWSIEN;
+	/* assert START */
+	writel(twsi_control_flags | MVTWSI_CONTROL_START, &twsi->control);
+	/* wait for controller to process START */
+	return twsi_wait(expected_status);
 }
 
-static void
-kirkwood_i2c_fsm(u32 status)
+/*
+ * Send a byte (i2c address or data).
+ */
+static int twsi_send(u8 byte, int expected_status)
 {
-	/*
-	 * If state is idle, then this is likely the remnants of an old
-	 * operation that driver has given up on or the user has killed.
-	 * If so, issue the stop condition and go to idle.
-	 */
-	if (drv_data->state == KW_I2C_STATE_IDLE) {
-		drv_data->action = KW_I2C_ACTION_SEND_STOP;
-		return;
-	}
-
-	/* The status from the ctlr [mostly] tells us what to do next */
-	switch (status) {
-	/* Start condition interrupt */
-	case KW_I2C_STATUS_MAST_START: /* 0x08 */
-	case KW_I2C_STATUS_MAST_REPEAT_START: /* 0x10 */
-		drv_data->action = KW_I2C_ACTION_SEND_ADDR_1;
-		drv_data->state = KW_I2C_STATE_WAITING_FOR_ADDR_1_ACK;
-		break;
-
-	/* Performing a write */
-	case KW_I2C_STATUS_MAST_WR_ADDR_ACK: /* 0x18 */
-		if (drv_data->msg->flags & I2C_M_TEN) {
-			drv_data->action = KW_I2C_ACTION_SEND_ADDR_2;
-			drv_data->state =
-				KW_I2C_STATE_WAITING_FOR_ADDR_2_ACK;
-			break;
-		}
-		/* FALLTHRU */
-	case KW_I2C_STATUS_MAST_WR_ADDR_2_ACK: /* 0xd0 */
-	case KW_I2C_STATUS_MAST_WR_ACK: /* 0x28 */
-		if ((drv_data->bytes_left == 0)
-				|| (drv_data->aborting
-					&& (drv_data->byte_posn != 0))) {
-			drv_data->action = KW_I2C_ACTION_SEND_STOP;
-			drv_data->state = KW_I2C_STATE_IDLE;
-		} else {
-			drv_data->action = KW_I2C_ACTION_SEND_DATA;
-			drv_data->state =
-				KW_I2C_STATE_WAITING_FOR_SLAVE_ACK;
-			drv_data->bytes_left--;
-		}
-		break;
-
-	/* Performing a read */
-	case KW_I2C_STATUS_MAST_RD_ADDR_ACK: /* 40 */
-		if (drv_data->msg->flags & I2C_M_TEN) {
-			drv_data->action = KW_I2C_ACTION_SEND_ADDR_2;
-			drv_data->state =
-				KW_I2C_STATE_WAITING_FOR_ADDR_2_ACK;
-			break;
-		}
-		/* FALLTHRU */
-	case KW_I2C_STATUS_MAST_RD_ADDR_2_ACK: /* 0xe0 */
-		if (drv_data->bytes_left == 0) {
-			drv_data->action = KW_I2C_ACTION_SEND_STOP;
-			drv_data->state = KW_I2C_STATE_IDLE;
-			break;
-		}
-		/* FALLTHRU */
-	case KW_I2C_STATUS_MAST_RD_DATA_ACK: /* 0x50 */
-		if (status != KW_I2C_STATUS_MAST_RD_DATA_ACK)
-			drv_data->action = KW_I2C_ACTION_CONTINUE;
-		else {
-			drv_data->action = KW_I2C_ACTION_RCV_DATA;
-			drv_data->bytes_left--;
-		}
-		drv_data->state = KW_I2C_STATE_WAITING_FOR_SLAVE_DATA;
-
-		if ((drv_data->bytes_left == 1) || drv_data->aborting)
-			drv_data->cntl_bits &= ~KW_I2C_REG_CONTROL_ACK;
-		break;
-
-	case KW_I2C_STATUS_MAST_RD_DATA_NO_ACK: /* 0x58 */
-		drv_data->action = KW_I2C_ACTION_RCV_DATA_STOP;
-		drv_data->state = KW_I2C_STATE_IDLE;
-		break;
-
-	case KW_I2C_STATUS_MAST_WR_ADDR_NO_ACK: /* 0x20 */
-	case KW_I2C_STATUS_MAST_WR_NO_ACK: /* 30 */
-	case KW_I2C_STATUS_MAST_RD_ADDR_NO_ACK: /* 48 */
-		/* Doesn't seem to be a device at other end */
-		drv_data->action = KW_I2C_ACTION_SEND_STOP;
-		drv_data->state = KW_I2C_STATE_IDLE;
-		drv_data->rc = -ENODEV;
-		break;
-
-	default:
-		printf("kirkwood_i2c_fsm: Ctlr Error -- state: 0x%x, "
-			"status: 0x%x, addr: 0x%x, flags: 0x%x\n",
-			 drv_data->state, status, drv_data->msg->addr,
-			 drv_data->msg->flags);
-		drv_data->action = KW_I2C_ACTION_SEND_STOP;
-		kirkwood_i2c_hw_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
-		drv_data->rc = -EIO;
-	}
+	/* put byte in data register for sending */
+	writel(byte, &twsi->data);
+	/* clear any pending interrupt -- that'll cause sending */
+	writel(twsi_control_flags, &twsi->control);
+	/* wait for controller to receive byte and check ACK */
+	return twsi_wait(expected_status);
 }
 
-static void
-kirkwood_i2c_do_action(void)
+/*
+ * Receive a byte.
+ * Global mvtwsi_control_flags variable says if we should ack or nak.
+ */
+static int twsi_recv(u8 *byte)
 {
-	switch(drv_data->action) {
-	case KW_I2C_ACTION_CONTINUE:
-		writel(drv_data->cntl_bits,
-			CONFIG_I2C_KW_REG_BASE + KW_I2C_REG_CONTROL);
-		break;
-
-	case KW_I2C_ACTION_SEND_START:
-		writel(drv_data->cntl_bits | KW_I2C_REG_CONTROL_START,
-			CONFIG_I2C_KW_REG_BASE + KW_I2C_REG_CONTROL);
-		break;
-
-	case KW_I2C_ACTION_SEND_ADDR_1:
-		writel(drv_data->addr1,
-			CONFIG_I2C_KW_REG_BASE + KW_I2C_REG_DATA);
-		writel(drv_data->cntl_bits,
-			CONFIG_I2C_KW_REG_BASE + KW_I2C_REG_CONTROL);
-		break;
-
-	case KW_I2C_ACTION_SEND_ADDR_2:
-		writel(drv_data->addr2,
-			CONFIG_I2C_KW_REG_BASE + KW_I2C_REG_DATA);
-		writel(drv_data->cntl_bits,
-			CONFIG_I2C_KW_REG_BASE + KW_I2C_REG_CONTROL);
-		break;
-
-	case KW_I2C_ACTION_SEND_DATA:
-		writel(drv_data->msg->buf[drv_data->byte_posn++],
-			CONFIG_I2C_KW_REG_BASE + KW_I2C_REG_DATA);
-		writel(drv_data->cntl_bits,
-			CONFIG_I2C_KW_REG_BASE + KW_I2C_REG_CONTROL);
-		break;
-
-	case KW_I2C_ACTION_RCV_DATA:
-		drv_data->msg->buf[drv_data->byte_posn++] =
-			readl(CONFIG_I2C_KW_REG_BASE + KW_I2C_REG_DATA);
-		writel(drv_data->cntl_bits,
-			CONFIG_I2C_KW_REG_BASE + KW_I2C_REG_CONTROL);
-		break;
-
-	case KW_I2C_ACTION_RCV_DATA_STOP:
-		drv_data->msg->buf[drv_data->byte_posn++] =
-			readl(CONFIG_I2C_KW_REG_BASE + KW_I2C_REG_DATA);
-		drv_data->cntl_bits &= ~KW_I2C_REG_CONTROL_INTEN;
-		writel(drv_data->cntl_bits | KW_I2C_REG_CONTROL_STOP,
-			CONFIG_I2C_KW_REG_BASE + KW_I2C_REG_CONTROL);
-		drv_data->block = 0;
-		break;
-
-	case KW_I2C_ACTION_INVALID:
-	default:
-		printf("kirkwood_i2c_do_action: Invalid action: %d\n",
-			drv_data->action);
-		drv_data->rc = -EIO;
-		/* FALLTHRU */
-	case KW_I2C_ACTION_SEND_STOP:
-		drv_data->cntl_bits &= ~KW_I2C_REG_CONTROL_INTEN;
-		writel(drv_data->cntl_bits | KW_I2C_REG_CONTROL_STOP,
-			CONFIG_I2C_KW_REG_BASE + KW_I2C_REG_CONTROL);
-		drv_data->block = 0;
-		break;
-	}
+	int expected_status, status;
+
+	/* compute expected status based on ACK bit in global control flags */
+	if (twsi_control_flags & MVTWSI_CONTROL_ACK)
+		expected_status = MVTWSI_STATUS_DATA_R_ACK;
+	else
+		expected_status = MVTWSI_STATUS_DATA_R_NAK;
+	/* acknowledge *previous state* and launch receive */
+	writel(twsi_control_flags, &twsi->control);
+	/* wait for controller to receive byte and assert ACK or NAK */
+	status = twsi_wait(expected_status);
+	/* if we did receive expected byte then store it */
+	if (status == 0)
+		*byte = readl(&twsi->data);
+	/* return status */
+	return status;
 }
 
-static	int
-kirkwood_i2c_intr(void)
+/*
+ * Assert the STOP condition.
+ * This is also used to force the bus back in idle (SDA=SCL=1).
+ */
+static int twsi_stop(int status)
 {
-	u32		status;
-	u32		ctrl;
-	int		rc = IRQ_NONE;
-
-	ctrl = readl(CONFIG_I2C_KW_REG_BASE + KW_I2C_REG_CONTROL);
-	while ((ctrl & KW_I2C_REG_CONTROL_IFLG) &&
-		(drv_data->rc == 0)) {
-		status = readl(CONFIG_I2C_KW_REG_BASE + KW_I2C_REG_STATUS);
-		kirkwood_i2c_fsm(status);
-		kirkwood_i2c_do_action();
-		rc = IRQ_HANDLED;
-		ctrl = readl(CONFIG_I2C_KW_REG_BASE + KW_I2C_REG_CONTROL);
-		udelay(1000);
-	}
-	return rc;
+	int control, stop_status;
+	int timeout = 1000;
+
+	/* assert STOP */
+	control = MVTWSI_CONTROL_TWSIEN | MVTWSI_CONTROL_STOP;
+	writel(control, &twsi->control);
+	/* wait for IDLE; IFLG won't rise so twsi_wait() is no use. */
+	do {
+		stop_status = readl(&twsi->status);
+		if (stop_status == MVTWSI_STATUS_IDLE)
+			break;
+		udelay(10); /* one clock cycle at 100 kHz */
+	} while (timeout--);
+	control = readl(&twsi->control);
+	if (stop_status != MVTWSI_STATUS_IDLE)
+		if (status == 0)
+			status = MVTWSI_ERROR(
+				MVTWSI_ERROR_TIMEOUT,
+				control, status, MVTWSI_STATUS_IDLE);
+	return status;
 }
 
-static void
-kirkwood_i2c_doio(struct i2c_msg *msg)
-{
-	int	ret;
+/*
+ * Ugly formula to convert m and n values to a frequency comes from
+ * TWSI specifications
+ */
 
-	while ((drv_data->rc == 0) && (drv_data->state != KW_I2C_STATE_IDLE)) {
-		/* poll Status register */
-		ret = kirkwood_i2c_intr();
-		if (ret == IRQ_NONE)
-			udelay(10);
-	}
+#define TWSI_FREQUENCY(m, n) \
+	((u8) (CONFIG_SYS_TCLK / (10 * (m + 1) * 2 * (1 << n))))
+
+/*
+ * These are required to be reprogrammed before enabling the controller
+ * because a reset loses them.
+ * Default values come from the spec, but a twsi_reset will change them.
+ * twsi_slave_address left uninitialized lest checkpatch.pl complains.
+ */
+
+/* Baudrate generator: m (bits 7..4) =4, n (bits 3..0) =4 */
+static u8 twsi_baud_rate = 0x44; /* baudrate at controller reset */
+/* Default frequency corresponding to default m=4, n=4 */
+static u8 twsi_actual_speed = TWSI_FREQUENCY(4, 4);
+/* Default slave address is 0 (so is an uninitialized static) */
+static u8 twsi_slave_address;
+
+/*
+ * Reset controller.
+ * Called@end of i2c_init unsuccessful i2c transactions.
+ * Controller reset also resets the baud rate and slave address, so
+ * re-establish them.
+ */
+static void twsi_reset(void)
+{
+	/* ensure controller will be enabled by any twsi*() function */
+	twsi_control_flags = MVTWSI_CONTROL_TWSIEN;
+	/* reset controller */
+	writel(0, &twsi->soft_reset);
+	/* wait 2 ms -- this is what the Marvell LSP does */
+	udelay(20000);
+	/* set baud rate */
+	writel(twsi_baud_rate, &twsi->baudrate);
+	/* set slave address even though we don't use it */
+	writel(twsi_slave_address, &twsi->slave_address);
+	writel(0, &twsi->xtnd_slave_addr);
+	/* assert STOP but don't care for the result */
+	(void) twsi_stop(0);
 }
 
-static void
-kirkwood_i2c_prepare_for_io(struct i2c_msg *msg)
+/*
+ * I2C init called by cmd_i2c when doing 'i2c reset'.
+ * Sets baud to the highest possible value not exceeding requested one.
+ */
+void i2c_init(int requested_speed, int slaveadd)
 {
-	u32	dir = 0;
-
-	drv_data->msg = msg;
-	drv_data->byte_posn = 0;
-	drv_data->bytes_left = msg->len;
-	drv_data->aborting = 0;
-	drv_data->rc = 0;
-	/* in u-boot we use no IRQs */
-	drv_data->cntl_bits = KW_I2C_REG_CONTROL_ACK | KW_I2C_REG_CONTROL_TWSIEN;
-
-	if (msg->flags & I2C_M_RD)
-		dir = 1;
-	if (msg->flags & I2C_M_TEN) {
-		drv_data->addr1 = 0xf0 | (((u32)msg->addr & 0x300) >> 7) | dir;
-		drv_data->addr2 = (u32)msg->addr & 0xff;
-	} else {
-		drv_data->addr1 = ((u32)msg->addr & 0x7f) << 1 | dir;
-		drv_data->addr2 = 0;
+	int	tmp_speed, highest_speed, n, m;
+	int	baud = 0x44; /* baudrate at controller reset */
+
+	/* use actual speed to collect progressively higher values */
+	highest_speed = 0;
+	/* compute m, n setting for highest speed not above requested speed */
+	for (n = 0; n < 8; n++) {
+		for (m = 0; m < 16; m++) {
+			tmp_speed = TWSI_FREQUENCY(m, n);
+			if ((tmp_speed <= requested_speed)
+			 && (tmp_speed > highest_speed)) {
+				highest_speed = tmp_speed;
+				baud = (m << 3) | n;
+			}
+		}
 	}
-	/* OK, no start it (from kirkwood_i2c_execute_msg())*/
-	drv_data->action = KW_I2C_ACTION_SEND_START;
-	drv_data->state = KW_I2C_STATE_WAITING_FOR_START_COND;
-	drv_data->block = 1;
-	kirkwood_i2c_do_action();
+	/* save baud rate and slave for later calls to twsi_reset */
+	twsi_baud_rate = baud;
+	twsi_actual_speed = highest_speed;
+	twsi_slave_address = slaveadd;
+	/* reset controller */
+	twsi_reset();
 }
 
-void
-i2c_init(int speed, int slaveadd)
+/*
+ * Begin I2C transaction with expected start status, at given address.
+ * Common to i2c_probe, i2c_read and i2c_write.
+ * Expected address status will derive from direction bit (bit 0) in addr.
+ */
+static int i2c_begin(int expected_start_status, u8 addr)
 {
-	kirkwood_i2c_hw_init(speed, slaveadd);
+	int status, expected_addr_status;
+
+	/* compute expected address status from direction bit in addr */
+	if (addr & 1) /* reading */
+		expected_addr_status = MVTWSI_STATUS_ADDR_R_ACK;
+	else /* writing */
+		expected_addr_status = MVTWSI_STATUS_ADDR_W_ACK;
+	/* assert START */
+	status = twsi_start(expected_start_status);
+	/* send out the address if the start went well */
+	if (status == 0)
+		status = twsi_send(addr, expected_addr_status);
+	/* return ok or status of first failure to caller */
+	return status;
 }
 
-int
-i2c_read(u8 dev, uint addr, int alen, u8 *data, int length)
+/*
+ * I2C probe called by cmd_i2c when doing 'i2c probe'.
+ * Begin read, nak data byte, end.
+ */
+int i2c_probe(uchar chip)
 {
-	kirkwood_i2c_msg->buf = data;
-	kirkwood_i2c_msg->len = length;
-	kirkwood_i2c_msg->addr = dev;
-	kirkwood_i2c_msg->flags = I2C_M_RD;
-
-	kirkwood_i2c_prepare_for_io(kirkwood_i2c_msg);
-	kirkwood_i2c_doio(kirkwood_i2c_msg);
-	return drv_data->rc;
+	u8 dummy_byte;
+	int status;
+
+	/* begin i2c read */
+	status = i2c_begin(MVTWSI_STATUS_START, (chip << 1) | 1);
+	/* dummy read was accepted: receive byte but NAK it. */
+	if (status == 0)
+		status = twsi_recv(&dummy_byte);
+	/* Stop transaction */
+	twsi_stop(0);
+	/* return 0 or status of first failure */
+	return status;
 }
 
-int
-i2c_write(u8 dev, uint addr, int alen, u8 *data, int length)
+/*
+ * I2C read called by cmd_i2c when doing 'i2c read' and by cmd_eeprom.c
+ * Begin write, send address byte(s), begin read, receive data bytes, end.
+ *
+ * NOTE: some EEPROMS want a stop right before the second start, while
+ * some will choke if it is there. Deciding which we should do is eeprom
+ * stuff, not i2c, but@the moment the APIs won't let us put it in
+ * cmd_eeprom, so we have to choose here, and for the moment that'll be
+ * a repeated start without a preceding stop.
+ */
+int i2c_read(u8 dev, uint addr, int alen, u8 *data, int length)
 {
-	kirkwood_i2c_msg->buf = data;
-	kirkwood_i2c_msg->len = length;
-	kirkwood_i2c_msg->addr = dev;
-	kirkwood_i2c_msg->flags = 0;
-
-	kirkwood_i2c_prepare_for_io(kirkwood_i2c_msg);
-	kirkwood_i2c_doio(kirkwood_i2c_msg);
-	return drv_data->rc;
+	int status;
+
+	/* begin i2c write to send the address bytes */
+	status = i2c_begin(MVTWSI_STATUS_START, (dev << 1));
+	/* send addr bytes */
+	while ((status == 0) && alen--)
+		status = twsi_send(addr >> (8*alen),
+			MVTWSI_STATUS_DATA_W_ACK);
+	/* begin i2c read to receive eeprom data bytes */
+	if (status == 0)
+		status = i2c_begin(
+			MVTWSI_STATUS_REPEATED_START, (dev << 1) | 1);
+	/* prepare ACK if@least one byte must be received */
+	if (length > 0)
+		twsi_control_flags |= MVTWSI_CONTROL_ACK;
+	/* now receive actual bytes */
+	while ((status == 0) && length--) {
+		/* reset NAK if we if no more to read now */
+		if (length == 0)
+			twsi_control_flags &= ~MVTWSI_CONTROL_ACK;
+		/* read current byte */
+		status = twsi_recv(data++);
+	}
+	/* Stop transaction */
+	status = twsi_stop(status);
+	/* return 0 or status of first failure */
+	return status;
 }
 
-int
-i2c_probe(uchar chip)
+/*
+ * I2C write called by cmd_i2c when doing 'i2c write' and by cmd_eeprom.c
+ * Begin write, send address byte(s), send data bytes, end.
+ */
+int i2c_write(u8 dev, uint addr, int alen, u8 *data, int length)
 {
-	return i2c_read(chip, 0, 0, NULL, 0);
+	int status;
+
+	/* begin i2c write to send the eeprom adress bytes then data bytes */
+	status = i2c_begin(MVTWSI_STATUS_START, (dev << 1));
+	/* send addr bytes */
+	while ((status == 0) && alen--)
+		status = twsi_send(addr >> (8*alen),
+			MVTWSI_STATUS_DATA_W_ACK);
+	/* send data bytes */
+	while ((status == 0) && (length-- > 0))
+		status = twsi_send(*(data++), MVTWSI_STATUS_DATA_W_ACK);
+	/* Stop transaction */
+	status = twsi_stop(status);
+	/* return 0 or status of first failure */
+	return status;
 }
 
+/*
+ * Bus set routine: we only support bus 0.
+ */
 int i2c_set_bus_num(unsigned int bus)
 {
-#if defined(CONFIG_I2C_MUX)
-	if (bus < CONFIG_SYS_MAX_I2C_BUS) {
-		i2c_bus_num = bus;
-	} else {
-		int	ret;
-
-		ret = i2x_mux_select_mux(bus);
-		if (ret)
-			return ret;
-		i2c_bus_num = 0;
-	}
-	i2c_bus_num_mux = bus;
-#else
 	if (bus > 0) {
 		return -1;
 	}
-
-	i2c_bus_num = bus;
-#endif
 	return 0;
 }
 
+/*
+ * Bus get routine: hard-return bus 0.
+ */
 unsigned int i2c_get_bus_num(void)
 {
-#if defined(CONFIG_I2C_MUX)
-	return i2c_bus_num_mux;
-#else
-	return i2c_bus_num;
-#endif
+	return 0;
 }
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [U-Boot] [PATCH V4 4/4] edminiv2: add I2C support using mvtwsi driver
  2010-08-27 16:26 [U-Boot] [PATCH V4 0/4] Improve I2C for orion5x, kirkwood and ED Mini V2 Albert Aribaud
                   ` (2 preceding siblings ...)
  2010-08-27 16:26 ` [U-Boot] [PATCH V4 3/4] i2c: rewrite mvtwsi, support orion5x and kirkwood Albert Aribaud
@ 2010-08-27 16:26 ` Albert Aribaud
  2010-08-30  9:46   ` Prafulla Wadaskar
  2010-08-30 13:34 ` [U-Boot] [PATCH V4 0/4] Improve I2C for orion5x, kirkwood and ED Mini V2 Heiko Schocher
  4 siblings, 1 reply; 13+ messages in thread
From: Albert Aribaud @ 2010-08-27 16:26 UTC (permalink / raw)
  To: u-boot


Signed-off-by: Albert Aribaud <albert.aribaud@free.fr>
---
 include/configs/edminiv2.h |   11 +++++++++++
 1 files changed, 11 insertions(+), 0 deletions(-)

diff --git a/include/configs/edminiv2.h b/include/configs/edminiv2.h
index 57dd165..ccfc660 100644
--- a/include/configs/edminiv2.h
+++ b/include/configs/edminiv2.h
@@ -132,6 +132,7 @@
  */
 #include <config_cmd_default.h>
 #define CONFIG_CMD_IDE
+#define CONFIG_CMD_I2C
 
 /*
  * Network
@@ -182,6 +183,16 @@
 #endif /* CMD_IDE */
 
 /*
+ * I2C related stuff
+ */
+#ifdef CONFIG_CMD_I2C
+#define CONFIG_I2C_MVTWSI
+#define CONFIG_I2C_MVTWSI_BASE		ORION5X_TWSI_BASE
+#define CONFIG_SYS_I2C_SLAVE		0x0
+#define CONFIG_SYS_I2C_SPEED		100000
+#endif
+
+/*
  *  Environment variables configurations
  */
 #define CONFIG_ENV_IS_IN_FLASH		1
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [U-Boot] [PATCH V4 1/4] suen3: remove CONFIG_HARD_I2C and related defines
  2010-08-27 16:26 ` [U-Boot] [PATCH V4 1/4] suen3: remove CONFIG_HARD_I2C and related defines Albert Aribaud
@ 2010-08-30  9:29   ` Prafulla Wadaskar
  2010-08-30  9:38     ` Heiko Schocher
  0 siblings, 1 reply; 13+ messages in thread
From: Prafulla Wadaskar @ 2010-08-30  9:29 UTC (permalink / raw)
  To: u-boot

 

> -----Original Message-----
> From: u-boot-bounces at lists.denx.de 
> [mailto:u-boot-bounces at lists.denx.de] On Behalf Of Albert Aribaud
> Sent: Friday, August 27, 2010 9:56 PM
> To: u-boot at lists.denx.de
> Subject: [U-Boot] [PATCH V4 1/4] suen3: remove 
> CONFIG_HARD_I2C and related defines
> 
> These are not used on this board, which uses soft I2C instead.
> 
> Signed-off-by: Albert Aribaud <albert.aribaud@free.fr>
> ---
>  include/configs/km_arm.h |    8 --------
>  1 files changed, 0 insertions(+), 8 deletions(-)
> 
> diff --git a/include/configs/km_arm.h b/include/configs/km_arm.h
> index 6519c90..1617e69 100644
> --- a/include/configs/km_arm.h
> +++ b/include/configs/km_arm.h
> @@ -142,16 +142,8 @@
>  /*
>   * I2C related stuff
>   */
> -#undef	CONFIG_HARD_I2C		/* I2C with hardware support */
>  #define	CONFIG_SOFT_I2C		/* I2C bit-banged	*/
>  
> -#if defined(CONFIG_HARD_I2C)
> -#define	CONFIG_I2C_KIRKWOOD
> -#define	CONFIG_I2C_KW_REG_BASE		KW_TWSI_BASE
> -#define	CONFIG_SYS_I2C_SLAVE		0x0
> -#define	CONFIG_SYS_I2C_SPEED		100000
> -#endif
> -
>  #define	CONFIG_KIRKWOOD_GPIO		/* Enable GPIO 
> Support */
>  #if defined(CONFIG_SOFT_I2C)
>  #ifndef __ASSEMBLY__

Hi Heiko
There are no issues to apply this patch.
I hope this is okay with you?
Pls ack.

Regards..
Prafulla . .

> -- 
> 1.7.1
> 
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot
> 

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [U-Boot] [PATCH V4 1/4] suen3: remove CONFIG_HARD_I2C and related defines
  2010-08-30  9:29   ` Prafulla Wadaskar
@ 2010-08-30  9:38     ` Heiko Schocher
  2010-08-30  9:44       ` Prafulla Wadaskar
  0 siblings, 1 reply; 13+ messages in thread
From: Heiko Schocher @ 2010-08-30  9:38 UTC (permalink / raw)
  To: u-boot

Hello Prafulla,

Prafulla Wadaskar wrote:
>> -----Original Message-----
>> From: u-boot-bounces at lists.denx.de 
>> [mailto:u-boot-bounces at lists.denx.de] On Behalf Of Albert Aribaud
>> Sent: Friday, August 27, 2010 9:56 PM
>> To: u-boot at lists.denx.de
>> Subject: [U-Boot] [PATCH V4 1/4] suen3: remove 
>> CONFIG_HARD_I2C and related defines
>>
>> These are not used on this board, which uses soft I2C instead.
>>
>> Signed-off-by: Albert Aribaud <albert.aribaud@free.fr>
>> ---
>>  include/configs/km_arm.h |    8 --------
>>  1 files changed, 0 insertions(+), 8 deletions(-)
>>
>> diff --git a/include/configs/km_arm.h b/include/configs/km_arm.h
>> index 6519c90..1617e69 100644
>> --- a/include/configs/km_arm.h
>> +++ b/include/configs/km_arm.h
>> @@ -142,16 +142,8 @@
>>  /*
>>   * I2C related stuff
>>   */
>> -#undef	CONFIG_HARD_I2C		/* I2C with hardware support */
>>  #define	CONFIG_SOFT_I2C		/* I2C bit-banged	*/
>>  
>> -#if defined(CONFIG_HARD_I2C)
>> -#define	CONFIG_I2C_KIRKWOOD
>> -#define	CONFIG_I2C_KW_REG_BASE		KW_TWSI_BASE
>> -#define	CONFIG_SYS_I2C_SLAVE		0x0
>> -#define	CONFIG_SYS_I2C_SPEED		100000
>> -#endif
>> -
>>  #define	CONFIG_KIRKWOOD_GPIO		/* Enable GPIO 
>> Support */
>>  #if defined(CONFIG_SOFT_I2C)
>>  #ifndef __ASSEMBLY__
> 
> Hi Heiko
> There are no issues to apply this patch.
> I hope this is okay with you?
> Pls ack.

Acked-by: Heiko Schocher<hs@denx.de>

If you ack the patchset, I can add it to u-boot-i2c.git

bye,
Heiko
-- 
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [U-Boot] [PATCH V4 1/4] suen3: remove CONFIG_HARD_I2C and related defines
  2010-08-30  9:38     ` Heiko Schocher
@ 2010-08-30  9:44       ` Prafulla Wadaskar
  2010-08-30 10:50         ` Albert ARIBAUD
  0 siblings, 1 reply; 13+ messages in thread
From: Prafulla Wadaskar @ 2010-08-30  9:44 UTC (permalink / raw)
  To: u-boot

 

> -----Original Message-----
> From: Heiko Schocher [mailto:hs at denx.de] 
> Sent: Monday, August 30, 2010 3:08 PM
> To: Prafulla Wadaskar
> Cc: Albert Aribaud; u-boot at lists.denx.de; Ashish Karkare; 
> Prabhanjan Sarnaik
> Subject: Re: [U-Boot] [PATCH V4 1/4] suen3: remove 
> CONFIG_HARD_I2C and related defines
> 
> Hello Prafulla,
> 
> Prafulla Wadaskar wrote:
> >> -----Original Message-----
> >> From: u-boot-bounces at lists.denx.de 
> >> [mailto:u-boot-bounces at lists.denx.de] On Behalf Of Albert Aribaud
> >> Sent: Friday, August 27, 2010 9:56 PM
> >> To: u-boot at lists.denx.de
> >> Subject: [U-Boot] [PATCH V4 1/4] suen3: remove 
> >> CONFIG_HARD_I2C and related defines
> >>
> >> These are not used on this board, which uses soft I2C instead.
> >>
> >> Signed-off-by: Albert Aribaud <albert.aribaud@free.fr>
> >> ---
> >>  include/configs/km_arm.h |    8 --------
> >>  1 files changed, 0 insertions(+), 8 deletions(-)
> >>
> >> diff --git a/include/configs/km_arm.h b/include/configs/km_arm.h
> >> index 6519c90..1617e69 100644
> >> --- a/include/configs/km_arm.h
> >> +++ b/include/configs/km_arm.h
> >> @@ -142,16 +142,8 @@
> >>  /*
> >>   * I2C related stuff
> >>   */
> >> -#undef	CONFIG_HARD_I2C		/* I2C with hardware support */
> >>  #define	CONFIG_SOFT_I2C		/* I2C bit-banged	*/
> >>  
> >> -#if defined(CONFIG_HARD_I2C)
> >> -#define	CONFIG_I2C_KIRKWOOD
> >> -#define	CONFIG_I2C_KW_REG_BASE		KW_TWSI_BASE
> >> -#define	CONFIG_SYS_I2C_SLAVE		0x0
> >> -#define	CONFIG_SYS_I2C_SPEED		100000
> >> -#endif
> >> -
> >>  #define	CONFIG_KIRKWOOD_GPIO		/* Enable GPIO 
> >> Support */
> >>  #if defined(CONFIG_SOFT_I2C)
> >>  #ifndef __ASSEMBLY__
> > 
> > Hi Heiko
> > There are no issues to apply this patch.
> > I hope this is okay with you?
> > Pls ack.
> 
> Acked-by: Heiko Schocher<hs@denx.de>
> 
> If you ack the patchset, I can add it to u-boot-i2c.git

Acked-by: Prafulla Wadaskar <prafulla@marvell.com>

Regards..
Prafulla . .

> 
> bye,
> Heiko
> -- 
> DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
> HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
> 

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [U-Boot] [PATCH V4 2/4] i2c: rename kirkwood_i2c to mvtwsi
  2010-08-27 16:26 ` [U-Boot] [PATCH V4 2/4] i2c: rename kirkwood_i2c to mvtwsi Albert Aribaud
@ 2010-08-30  9:45   ` Prafulla Wadaskar
  0 siblings, 0 replies; 13+ messages in thread
From: Prafulla Wadaskar @ 2010-08-30  9:45 UTC (permalink / raw)
  To: u-boot

 

> -----Original Message-----
> From: u-boot-bounces at lists.denx.de 
> [mailto:u-boot-bounces at lists.denx.de] On Behalf Of Albert Aribaud
> Sent: Friday, August 27, 2010 9:56 PM
> To: u-boot at lists.denx.de
> Subject: [U-Boot] [PATCH V4 2/4] i2c: rename kirkwood_i2c to mvtwsi
> 
> This driver is not kirkwood-specific and can also be used
> e.g. by orion5x. Rename to a SoC-neutral name.
> 
> Signed-off-by: Albert Aribaud <albert.aribaud@free.fr>
> ---
>  drivers/i2c/Makefile                     |    2 +-
>  drivers/i2c/{kirkwood_i2c.c => mvtwsi.c} |    0
>  2 files changed, 1 insertions(+), 1 deletions(-)
>  rename drivers/i2c/{kirkwood_i2c.c => mvtwsi.c} (100%)
> 
> diff --git a/drivers/i2c/Makefile b/drivers/i2c/Makefile
> index d2c2515..8921ff9 100644
> --- a/drivers/i2c/Makefile
> +++ b/drivers/i2c/Makefile
> @@ -28,7 +28,7 @@ LIB	:= $(obj)libi2c.a
>  COBJS-$(CONFIG_BFIN_TWI_I2C) += bfin-twi_i2c.o
>  COBJS-$(CONFIG_DRIVER_DAVINCI_I2C) += davinci_i2c.o
>  COBJS-$(CONFIG_FSL_I2C) += fsl_i2c.o
> -COBJS-$(CONFIG_I2C_KIRKWOOD) += kirkwood_i2c.o
> +COBJS-$(CONFIG_I2C_MVTWSI) += mvtwsi.o
>  COBJS-$(CONFIG_I2C_MXC) += mxc_i2c.o
>  COBJS-$(CONFIG_DRIVER_OMAP1510_I2C) += omap1510_i2c.o
>  COBJS-$(CONFIG_DRIVER_OMAP24XX_I2C) += omap24xx_i2c.o
> diff --git a/drivers/i2c/kirkwood_i2c.c b/drivers/i2c/mvtwsi.c
> similarity index 100%
> rename from drivers/i2c/kirkwood_i2c.c
> rename to drivers/i2c/mvtwsi.c

Acked-by: Prafulla Wadaskar <prafulla@marvell.com>

Regards..
Prafulla . .

> -- 
> 1.7.1
> 
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot
> 

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [U-Boot] [PATCH V4 3/4] i2c: rewrite mvtwsi, support orion5x and kirkwood
  2010-08-27 16:26 ` [U-Boot] [PATCH V4 3/4] i2c: rewrite mvtwsi, support orion5x and kirkwood Albert Aribaud
@ 2010-08-30  9:45   ` Prafulla Wadaskar
  0 siblings, 0 replies; 13+ messages in thread
From: Prafulla Wadaskar @ 2010-08-30  9:45 UTC (permalink / raw)
  To: u-boot

 

> -----Original Message-----
> From: u-boot-bounces at lists.denx.de 
> [mailto:u-boot-bounces at lists.denx.de] On Behalf Of Albert Aribaud
> Sent: Friday, August 27, 2010 9:56 PM
> To: u-boot at lists.denx.de
> Subject: [U-Boot] [PATCH V4 3/4] i2c: rewrite mvtwsi, support 
> orion5x and kirkwood
> 
> This rewrite of the mvtwsi driver is 25% smaller and much
> faster and simpler than the previous code.
> 
> Signed-off-by: Albert Aribaud <albert.aribaud@free.fr>
> ---
>  drivers/i2c/mvtwsi.c |  750 
> +++++++++++++++++++++++---------------------------
>  1 files changed, 341 insertions(+), 409 deletions(-)
> 

Acked-by: Prafulla Wadaskar <prafulla@marvell.com>

Regards..
Prafulla . .

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [U-Boot] [PATCH V4 4/4] edminiv2: add I2C support using mvtwsi driver
  2010-08-27 16:26 ` [U-Boot] [PATCH V4 4/4] edminiv2: add I2C support using mvtwsi driver Albert Aribaud
@ 2010-08-30  9:46   ` Prafulla Wadaskar
  0 siblings, 0 replies; 13+ messages in thread
From: Prafulla Wadaskar @ 2010-08-30  9:46 UTC (permalink / raw)
  To: u-boot

 

> -----Original Message-----
> From: u-boot-bounces at lists.denx.de 
> [mailto:u-boot-bounces at lists.denx.de] On Behalf Of Albert Aribaud
> Sent: Friday, August 27, 2010 9:56 PM
> To: u-boot at lists.denx.de
> Subject: [U-Boot] [PATCH V4 4/4] edminiv2: add I2C support 
> using mvtwsi driver
> 
> 
> Signed-off-by: Albert Aribaud <albert.aribaud@free.fr>
> ---
>  include/configs/edminiv2.h |   11 +++++++++++
>  1 files changed, 11 insertions(+), 0 deletions(-)
> 
> diff --git a/include/configs/edminiv2.h b/include/configs/edminiv2.h
> index 57dd165..ccfc660 100644
> --- a/include/configs/edminiv2.h
> +++ b/include/configs/edminiv2.h
> @@ -132,6 +132,7 @@
>   */
>  #include <config_cmd_default.h>
>  #define CONFIG_CMD_IDE
> +#define CONFIG_CMD_I2C
>  
>  /*
>   * Network
> @@ -182,6 +183,16 @@
>  #endif /* CMD_IDE */
>  
>  /*
> + * I2C related stuff
> + */
> +#ifdef CONFIG_CMD_I2C
> +#define CONFIG_I2C_MVTWSI
> +#define CONFIG_I2C_MVTWSI_BASE		ORION5X_TWSI_BASE
> +#define CONFIG_SYS_I2C_SLAVE		0x0
> +#define CONFIG_SYS_I2C_SPEED		100000
> +#endif


Acked-by: Prafulla Wadaskar <prafulla@marvell.com>

Regards..
Prafulla . .

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [U-Boot] [PATCH V4 1/4] suen3: remove CONFIG_HARD_I2C and related defines
  2010-08-30  9:44       ` Prafulla Wadaskar
@ 2010-08-30 10:50         ` Albert ARIBAUD
  0 siblings, 0 replies; 13+ messages in thread
From: Albert ARIBAUD @ 2010-08-30 10:50 UTC (permalink / raw)
  To: u-boot

Le 30/08/2010 11:44, Prafulla Wadaskar a ?crit :

>> Acked-by: Heiko Schocher<hs@denx.de>

> Acked-by: Prafulla Wadaskar<prafulla@marvell.com>

Thanks to both of you.

Amicalement,
-- 
Albert.

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [U-Boot] [PATCH V4 0/4] Improve I2C for orion5x, kirkwood and ED Mini V2
  2010-08-27 16:26 [U-Boot] [PATCH V4 0/4] Improve I2C for orion5x, kirkwood and ED Mini V2 Albert Aribaud
                   ` (3 preceding siblings ...)
  2010-08-27 16:26 ` [U-Boot] [PATCH V4 4/4] edminiv2: add I2C support using mvtwsi driver Albert Aribaud
@ 2010-08-30 13:34 ` Heiko Schocher
  4 siblings, 0 replies; 13+ messages in thread
From: Heiko Schocher @ 2010-08-30 13:34 UTC (permalink / raw)
  To: u-boot

Hello Albert,

Albert Aribaud wrote:
> SUMMARY:
> 
> This patchset improves the driver for the Marvell TWSI interface found
> on orion5x and kirkwood SoCs and adds I2C support to the orion5x-based
> ED Mini V2 board. The mvtwsi driver is a complete rewrite, 50% shorter
> in source code lines, 25% smaller in object size, much simpler and way
> faster than the kirkwood_i2c driver it replaces.
> 
> PATCH SET:
> 
> Patch 1 removes dependencies on kirwkood_i2c from suen3, the only
> board that mentioned it. Patch 2 renames the driver from kirkwood_i2c
> to mvtwsi. Patch 3 replaces the old code with the new one. Patch 4
> adds support for I2C in orion5x-based ED Mini V2.
> 
> TESTS:
> 
> This driver has been tested on an ED Mini V2 with basic u-boot i2c
> commands, on an 5C372a RTC and an HT24LC08 1 KB eeprom (read+write).
> 
> HISTORY:
> 
> V1:	Initial submission as an addition rather than a replacement.
> 
> V2:	Fixed copyright line.
> 	Made mvtwsi a replacement for kirkwood_i2c.
> 	Made patches checkpatch-clean: 0 errors, 0 warnings.
> 	Various cosmetic changes.
> 	Removed useless i2c_end() function.
> 
> V3:	Reduced line lengths below 78 characters.
> 	Removed blank line after function description block comment.
> 
> V4:	Changed CONFIG_I2C_DRIVER_MVTWSI into CONFIG_I2C_MVTWSI.
> 	Really fixed copyright line.
> 	Added and documented kirkwood support.
> 	Shortened extended_slave_address into xtnd_slave_addr.
> 	Added explanation on default/init baudrate value.
> 	Moved I2C config settings under #ifdef CONFIG_CMD_I2C.
> 
> Albert Aribaud (4):
>   suen3: remove CONFIG_HARD_I2C and related defines
>   i2c: rename kirkwood_i2c to mvtwsi
>   i2c: rewrite mvtwsi, support orion5x and kirkwood
>   edminiv2: add I2C support using mvtwsi driver
> 
>  drivers/i2c/Makefile       |    2 +-
>  drivers/i2c/kirkwood_i2c.c |  496 --------------------------------------------
>  drivers/i2c/mvtwsi.c       |  428 ++++++++++++++++++++++++++++++++++++++
>  include/configs/edminiv2.h |   11 +
>  include/configs/km_arm.h   |    8 -
>  5 files changed, 440 insertions(+), 505 deletions(-)
>  delete mode 100644 drivers/i2c/kirkwood_i2c.c
>  create mode 100644 drivers/i2c/mvtwsi.c

applied to u-boot-i2c.git

Thanks!

bye,
Heiko
-- 
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2010-08-30 13:34 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-08-27 16:26 [U-Boot] [PATCH V4 0/4] Improve I2C for orion5x, kirkwood and ED Mini V2 Albert Aribaud
2010-08-27 16:26 ` [U-Boot] [PATCH V4 1/4] suen3: remove CONFIG_HARD_I2C and related defines Albert Aribaud
2010-08-30  9:29   ` Prafulla Wadaskar
2010-08-30  9:38     ` Heiko Schocher
2010-08-30  9:44       ` Prafulla Wadaskar
2010-08-30 10:50         ` Albert ARIBAUD
2010-08-27 16:26 ` [U-Boot] [PATCH V4 2/4] i2c: rename kirkwood_i2c to mvtwsi Albert Aribaud
2010-08-30  9:45   ` Prafulla Wadaskar
2010-08-27 16:26 ` [U-Boot] [PATCH V4 3/4] i2c: rewrite mvtwsi, support orion5x and kirkwood Albert Aribaud
2010-08-30  9:45   ` Prafulla Wadaskar
2010-08-27 16:26 ` [U-Boot] [PATCH V4 4/4] edminiv2: add I2C support using mvtwsi driver Albert Aribaud
2010-08-30  9:46   ` Prafulla Wadaskar
2010-08-30 13:34 ` [U-Boot] [PATCH V4 0/4] Improve I2C for orion5x, kirkwood and ED Mini V2 Heiko Schocher

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.