On Fri, 25 Apr 2008 09:58:10 -0700, Troy Kisky wrote: > Ensure psc value gives a clock between 7-12 MHz > Signed-off-by: Troy Kisky <[EMAIL PROTECTED]> > Signed-off-by: Kevin Hilman <[EMAIL PROTECTED]> > --- > drivers/i2c/busses/i2c-davinci.c | 15 +++++++++++---- > 1 files changed, 11 insertions(+), 4 deletions(-) > > diff --git a/drivers/i2c/busses/i2c-davinci.c > b/drivers/i2c/busses/i2c-davinci.c > index 7ecbfc4..0e5a39c 100644 > --- a/drivers/i2c/busses/i2c-davinci.c > +++ b/drivers/i2c/busses/i2c-davinci.c > @@ -142,6 +142,7 @@ static int i2c_davinci_init(struct davinci_i2c_dev *dev) > struct davinci_i2c_platform_data *pdata = dev->dev->platform_data; > u16 psc; > u32 clk; > + u32 d; > u32 clkh; > u32 clkl; > u32 input_clock = clk_get_rate(dev->clk); > @@ -171,23 +172,29 @@ static int i2c_davinci_init(struct davinci_i2c_dev *dev) > * if PSC > 1 , d = 5 > */ > > - psc = 26; /* To get 1MHz clock */ > + /* get minimum of 7 MHz clock, but max of 12 MHz */ > + psc = (input_clock / 7000000) - 1; > + if ((input_clock / (psc + 1)) > 12000000) > + psc++; /* better to run under spec than over */ > + d = (psc >= 2)? 5 : 7 - psc; > > - clk = ((input_clock / (psc + 1)) / (pdata->bus_freq * 1000)) - 10; > - clkh = (50 * clk) / 100; > + clk = ((input_clock / (psc + 1)) / (pdata->bus_freq * 1000)) - (d<<1); > + clkh = clk>>1; > clkl = clk - clkh; > > davinci_i2c_write_reg(dev, DAVINCI_I2C_PSC_REG, psc); > davinci_i2c_write_reg(dev, DAVINCI_I2C_CLKH_REG, clkh); > davinci_i2c_write_reg(dev, DAVINCI_I2C_CLKL_REG, clkl); > > - dev_dbg(dev->dev, "CLK = %d\n", clk); > + dev_dbg(dev->dev, "input_clock = %d, CLK = %d\n", input_clock, clk); > dev_dbg(dev->dev, "PSC = %d\n", > davinci_i2c_read_reg(dev, DAVINCI_I2C_PSC_REG)); > dev_dbg(dev->dev, "CLKL = %d\n", > davinci_i2c_read_reg(dev, DAVINCI_I2C_CLKL_REG)); > dev_dbg(dev->dev, "CLKH = %d\n", > davinci_i2c_read_reg(dev, DAVINCI_I2C_CLKH_REG)); > + dev_dbg(dev->dev, "bus_freq = %dkHz, bus_delay = %d\n", > + pdata->bus_freq, pdata->bus_delay); > > /* Take the I2C module out of reset: */ > w = davinci_i2c_read_reg(dev, DAVINCI_I2C_MDR_REG);
Applied, with a few remaining coding-style cleanups, thanks. -- Jean Delvare _______________________________________________ i2c mailing list [email protected] http://lists.lm-sensors.org/mailman/listinfo/i2c
