unsigned int speed)
{
int half_period;
- int clk_rate;
if (speed == 0)
return -EINVAL;
- if (adap->hwadapnr == 2)
- /* OTG I2C clock source is different. */
- clk_rate = get_periph_clk_rate();
- else
- clk_rate = get_hclk_clk_rate();
- half_period = (clk_rate / speed) / 2;
-
- if ((half_period > 255) || (half_period < 0))
- return -EINVAL;
+ /* OTG I2C clock source and CLK registers are different */
+ if (adap->hwadapnr == 2) {
+ half_period = (get_periph_clk_rate() / speed) / 2;
+ if (half_period > 0xFF)
+ return -EINVAL;
+ } else {
+ half_period = (get_hclk_clk_rate() / speed) / 2;
+ if (half_period > 0x3FF)
+ return -EINVAL;
+ }
writel(half_period, &lpc32xx_i2c[adap->hwadapnr]->clk_hi);
writel(half_period, &lpc32xx_i2c[adap->hwadapnr]->clk_lo);
/* soft reset (auto-clears) */
writel(LPC32XX_I2C_SOFT_RESET, &i2c->ctrl);
- /* set HI and LO periods for about 350 kHz */
+ /* set HI and LO periods for half of the default speed */
lpc32xx_i2c_set_bus_speed(adap, requested_speed);
}