All of lore.kernel.org
 help / color / mirror / Atom feed
From: Tom Rix <Tom.Rix@windriver.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH 1/4] OMAP3 I2C Fix the sampling clock.
Date: Wed, 10 Jun 2009 07:53:49 -0500	[thread overview]
Message-ID: <1244638432-30893-2-git-send-email-Tom.Rix@windriver.com> (raw)
In-Reply-To: <1244638432-30893-1-git-send-email-Tom.Rix@windriver.com>

This problem is seen on Zoom1 and Zoom2 in the startup and
when i2c probe is used

Before :

In:    serial
Out:   serial
Err:   serial
timed out in wait_for_bb: I2C_STAT=1000
timed out in wait_for_bb: I2C_STAT=1000
timed out in wait_for_bb: I2C_STAT=1000
timed out in wait_for_pin: I2C_STAT=1000
I2C read: I/O error
timed out in wait_for_bb: I2C_STAT=1000
timed out in wait_for_bb: I2C_STAT=1000
Die ID #327c00020000000004013ddd05026013
Hit any key to stop autoboot:  0
OMAP3 Zoom1# i2c probe
Valid chip addresses:timed out in wait_for_bb: I2C_STAT=1000
 02 03 04 05 06 07 08 09 0A 0B 0C 0D <snip>

After :

In:    serial
Out:   serial
Err:   serial
Die ID #327c00020000000004013ddd05026013
Hit any key to stop autoboot:  0
OMAP3 Zoom1# i2c probe
Valid chip addresses: 48 49 4A 4B

The addresses are for the twl4030.

The prescalar that converts the function clock to the sampling
clock is hardcoded to 0.  The reference manual recommends 7
if the function clock is 96MHz.

Instead of just changing the hardcoded values, the prescalar
is calculated from the value I2C_IP_CLK.

The i2c #defines are in kHz.  The speed passed into the
i2c init routine is in Hz.  To be consistent, change the
defines to be in Hz.

This was runtime verified on Zoom1, Zoom2, Beagle and Overo.
The 400kHz case was verifed on a test Zoom2 configuration.

Signed-off-by: Tom Rix <Tom.Rix@windriver.com>
---
 drivers/i2c/omap24xx_i2c.c       |   54 +++++++++++++++++++++++++++++++++-----
 include/asm-arm/arch-omap3/i2c.h |   16 +++++-----
 2 files changed, 55 insertions(+), 15 deletions(-)

diff --git a/drivers/i2c/omap24xx_i2c.c b/drivers/i2c/omap24xx_i2c.c
index 6784603..81947e6 100644
--- a/drivers/i2c/omap24xx_i2c.c
+++ b/drivers/i2c/omap24xx_i2c.c
@@ -31,7 +31,49 @@ static void flush_fifo(void);
 
 void i2c_init (int speed, int slaveadd)
 {
-	u16 scl;
+	int psc, iclk, scll, sclh;
+
+	/* Only handle standard and fast speeds */
+	if ((speed != OMAP_I2C_STANDARD) &&
+	    (speed != OMAP_I2C_FAST_MODE)) {
+		printf("Error : I2C unsupported speed %d\n", speed);
+		return;
+	}
+
+	/*
+	 * Calculate the prescalar to go from from the function clock
+	 * to the internal sampling clock, 12MHz.
+	 */
+	psc = I2C_PSC_MAX;
+	while (psc >= I2C_PSC_MIN) {
+		iclk = I2C_IP_CLK / (psc + 1);
+		if (12000000 <= iclk)
+			break;
+		psc--;
+	}
+	if (psc < I2C_PSC_MIN) {
+		printf("Error : I2C unsupported prescalar %d\n", psc);
+		return;
+	}
+
+	/*
+	 * How the low and high time periods are calculated
+	 * See the OMAP3xxx Reference Manual for more details
+	 *
+	 * tlow + thigh = 1 / speed
+	 * thigh = tlow, nice square wave..
+	 *
+	 * tlow = 1 / (2 * speed) = (scll + 7) / iclk;
+	 * scll + 7 = iclk / 2 * speed
+	 * sclh + 5 = iclk / 2 * speed
+	 */
+	scll = sclh = iclk / (2 * speed);
+	scll -= 7;
+	sclh -= 5;
+	if ((scll < 0) || (sclh < 0)) {
+		printf("Error : I2C initializing clock\n");
+		return;
+	}
 
 	writew(0x2, I2C_SYSC); /* for ES2 after soft reset */
 	udelay(1000);
@@ -42,12 +84,10 @@ void i2c_init (int speed, int slaveadd)
 		udelay (50000);
 	}
 
-	/* 12MHz I2C module clock */
-	writew (0, I2C_PSC);
-	speed = speed/1000;		    /* 100 or 400 */
-	scl = ((12000/(speed*2)) - 7);	/* use 7 when PSC = 0 */
-	writew (scl, I2C_SCLL);
-	writew (scl, I2C_SCLH);
+	writew(psc, I2C_PSC);
+	writew(scll, I2C_SCLL);
+	writew(sclh, I2C_SCLH);
+
 	/* own address */
 	writew (slaveadd, I2C_OA);
 	writew (I2C_CON_EN, I2C_CON);
diff --git a/include/asm-arm/arch-omap3/i2c.h b/include/asm-arm/arch-omap3/i2c.h
index 3937f35..09afca0 100644
--- a/include/asm-arm/arch-omap3/i2c.h
+++ b/include/asm-arm/arch-omap3/i2c.h
@@ -112,14 +112,14 @@
 #define I2C_SCLH_HSSCLH		8
 #define I2C_SCLH_HSSCLH_M	0xFF
 
-#define OMAP_I2C_STANDARD	100
-#define OMAP_I2C_FAST_MODE	400
-#define OMAP_I2C_HIGH_SPEED	3400
-
-#define SYSTEM_CLOCK_12		12000
-#define SYSTEM_CLOCK_13		13000
-#define SYSTEM_CLOCK_192	19200
-#define SYSTEM_CLOCK_96		96000
+#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
 
 #define I2C_IP_CLK		SYSTEM_CLOCK_96
 #define I2C_PSC_MAX		0x0f
-- 
1.6.0.5

  reply	other threads:[~2009-06-10 12:53 UTC|newest]

Thread overview: 44+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-06-10 12:53 [U-Boot] Zoom hw reset Tom Rix
2009-06-10 12:53 ` Tom Rix [this message]
2009-06-10 12:53   ` [U-Boot] [PATCH 2/4] I2C Add initial support for TWL4030 Tom Rix
2009-06-10 12:53     ` [U-Boot] [PATCH 3/4] ZOOM2 Add power reset button Tom Rix
2009-06-10 12:53       ` [U-Boot] [PATCH 4/4] ZOOM1 " Tom Rix
2009-06-12 21:46         ` Jean-Christophe PLAGNIOL-VILLARD
2009-06-12 21:57           ` Tom
2009-06-12 23:08             ` Menon, Nishanth
2009-06-13  2:28               ` Tom
2009-06-13 14:16                 ` Tom
2009-06-13 14:26                   ` Nishanth Menon
2009-06-10 14:27       ` [U-Boot] [PATCH 3/4] ZOOM2 " Peter Tyser
2009-06-10 14:43         ` Menon, Nishanth
2009-06-10 15:43           ` Dirk Behme
2009-06-10 16:16             ` Menon, Nishanth
2009-06-10 16:25               ` Peter Tyser
2009-06-10 18:08                 ` Heiko Schocher
2009-06-10 18:27                 ` Menon, Nishanth
2009-06-10 18:21                   ` Heiko Schocher
2009-06-10 18:50                     ` Menon, Nishanth
2009-06-10 20:27                   ` Jean-Christophe PLAGNIOL-VILLARD
2009-06-12 13:02                     ` Tom
2009-06-13 14:27                       ` Jean-Christophe PLAGNIOL-VILLARD
2009-06-10 18:06               ` Heiko Schocher
2009-06-10 18:04             ` Heiko Schocher
2009-06-10 17:56         ` Heiko Schocher
2009-06-10 17:48       ` Heiko Schocher
2009-06-10 14:46     ` [U-Boot] [PATCH 2/4] I2C Add initial support for TWL4030 Menon, Nishanth
2009-06-10 17:59       ` Heiko Schocher
2009-06-10 17:45     ` Heiko Schocher
2009-07-19  9:19     ` Wolfgang Denk
2009-07-19 15:23       ` Heiko Schocher
2009-07-19 17:06         ` Tom
2009-07-20  9:12           ` Heiko Schocher
2009-07-22 21:41             ` Jean-Christophe PLAGNIOL-VILLARD
2009-07-20 15:38           ` Dirk Behme
2009-06-10 14:52   ` [U-Boot] [PATCH 1/4] OMAP3 I2C Fix the sampling clock Menon, Nishanth
2009-06-11  2:43     ` Tom
2009-06-11  4:12       ` Menon, Nishanth
2009-06-11 14:02         ` Tom
2009-06-12 21:44           ` Jean-Christophe PLAGNIOL-VILLARD
2009-06-12 22:06             ` Tom
2009-06-17 22:31             ` [U-Boot] RFC " Tom
2009-06-12 21:41         ` [U-Boot] " Jean-Christophe PLAGNIOL-VILLARD

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1244638432-30893-2-git-send-email-Tom.Rix@windriver.com \
    --to=tom.rix@windriver.com \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.