[PATCH v3 RFC] i2c: rk3x: handle dynamic clock rate changes correctly

Doug Anderson dianders at chromium.org
Wed Sep 17 09:26:08 PDT 2014


Max,

On Tue, Sep 16, 2014 at 4:13 PM, Max Schwarz <max.schwarz at online.de> wrote:
> diff --git a/drivers/i2c/busses/i2c-rk3x.c b/drivers/i2c/busses/i2c-rk3x.c
> index 93cfc83..c13fabc 100644
> --- a/drivers/i2c/busses/i2c-rk3x.c
> +++ b/drivers/i2c/busses/i2c-rk3x.c
> @@ -97,6 +97,8 @@ struct rk3x_i2c {
>         /* Hardware resources */
>         void __iomem *regs;
>         struct clk *clk;
> +       struct notifier_block clk_rate_nb;
> +       unsigned long clk_freq;

Is it just me, or is "clk_freq" a write-only member of this structure?
 If it is, perhaps it could be removed.

I guess if it were not write only I'd expect it would be used in
rk3x_i2c_set_scl_rate(), but it's not.


> +static void rk3x_i2c_set_scl_rate(struct rk3x_i2c *i2c, unsigned long scl_rate)
> +{
> +       unsigned long i2c_rate = clk_get_rate(i2c->clk);
> +       unsigned int div;
> +       int ret;
> +
> +       ret = rk3x_i2c_calc_div(i2c_rate, scl_rate, &div);
> +
> +       WARN_ONCE(ret != 0, "Could not reach desired SCL freq %lu", scl_rate);
> +
> +       /*
> +        * We might be called from rk3x_i2c_probe or from the clk rate change
> +        * notifier. In that case, the i2c clk is not running. So enable it
> +        * explicitly here during the register write.

It's now in _both_ cases that the i2c clk is not running, right?
...so we could just remove this comment totally?  Enabling a clock
around an i2c_write() doesn't seem incredibly noteworthy and it's now
consistent among the two callers...



More information about the Linux-rockchip mailing list