> -----Original Message----- > From: Tom Rix [mailto:tom....@windriver.com] > Sent: Wednesday, June 10, 2009 7:54 AM > > 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);
This is a repeat story of what happened in linux-omap and kernel. We had a similar discussion in [1] and related patch [2] to change equations. I have the same reservations with this patch: a) using speed as default does not scale for all board combinations. b) need flexible option to provide scll and sclh on a platform basis. Regards, Nishanth Menon Ref: [1] http://marc.info/?t=123540865900002&r=1&w=2 [2] http://marc.info/?l=linux-omap&m=122770723311340&w=2 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot