Hi Chris,
On Wed, Oct 18, 2017 at 4:04 PM, Chris Brandt <[email protected]> wrote:
> Remove the restriction that the parent clock has to be a specific frequency
> and also allow any speed to be supported.
>
> Signed-off-by: Chris Brandt <[email protected]>
Thanks for your patch!
> --- a/drivers/i2c/busses/i2c-riic.c
> +++ b/drivers/i2c/busses/i2c-riic.c
> @@ -288,48 +283,101 @@ static const struct i2c_algorithm riic_algo = {
> .functionality = riic_func,
> };
>
> -static int riic_init_hw(struct riic_dev *riic, u32 spd)
> +static int riic_init_hw(struct riic_dev *riic, struct i2c_timings *t)
> {
> + /*
> + * Determine reference clock rate. We must be able to get the desired
> + * frequency with only 62 clock ticks max (31 high, 31 low).
> + * Aim for a duty of 60% LOW, 40% HIGH.
> + */
> + total_ticks = rate / t->bus_freq_hz;
> + if (rate % t->bus_freq_hz) /* round up */
> + total_ticks++;
DIV_ROUND_UP()
> + /*
> + * Remove clock ticks for rise and fall times. Convert ns to clock
> + * ticks.
> + */
> + brl -= t->scl_fall_ns / (1000000000/rate);
> + brh -= t->scl_rise_ns / (1000000000/rate);
To avoid losing too much precision by the division, you can rewrite this as
e.g.
brl -= t->scl_fall_ns * rate / 1000000000;
("scl_fall_ns * rate" should not overflow).
Perhaps DIV_ROUND_UP(), too?
> + pr_debug("i2c-riic: freq=%lu, duty=%d, fall=%lu, rise=%lu, cks=%d,
> brl=%d, brh=%d\n",
> + rate/total_ticks, ((brl+3)*100)/(brl+brh+6),
> + t->scl_fall_ns / (1000000000/rate),
> + t->scl_rise_ns / (1000000000/rate), cks, brl, brh);
Likewise (or: reuse the values from above?).
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- [email protected]
In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds