[PATCH] i2c: rcar_i2c: Enable configuring SCL rise and fall times
Adam Ford
aford173 at gmail.com
Mon Sep 20 14:21:57 CEST 2021
On Tue, Aug 24, 2021 at 9:10 AM Adam Ford <aford173 at gmail.com> wrote:
>
> The Linux i2c driver supports i2c-scl-rising-time-ns,
> and i2c-scl-falling-time-ns, but U-Boot uses hard-coded values
> for these values.
>
> Update the calculation by fetching them from the device tree if
> present and use the previous values as the default if they are
> missing.
>
> Signed-off-by: Adam Ford <aford173 at gmail.com>
>
Do I have the right people in copy? I was hoping to get some feedback
on this. My boards use the i2c-scl-rising-time-ns to help properly
set the i2c clocking.
thanks
adam
> diff --git a/drivers/i2c/rcar_i2c.c b/drivers/i2c/rcar_i2c.c
> index 14bb6603d5..d9ece5e3a8 100644
> --- a/drivers/i2c/rcar_i2c.c
> +++ b/drivers/i2c/rcar_i2c.c
> @@ -64,6 +64,8 @@ enum rcar_i2c_type {
> struct rcar_i2c_priv {
> void __iomem *base;
> struct clk clk;
> + u32 fall_ns;
> + u32 rise_ns;
> u32 intdelay;
> u32 icccr;
> enum rcar_i2c_type type;
> @@ -278,7 +280,7 @@ static int rcar_i2c_set_speed(struct udevice *dev, uint bus_freq_hz)
> * = F[sum * ick / 1000000000]
> * = F[(ick / 1000000) * sum / 1000]
> */
> - sum = 35 + 200 + priv->intdelay;
> + sum = priv->fall_ns + priv->rise_ns + priv->intdelay;
> round = (ick + 500000) / 1000000 * sum;
> round = (round + 500) / 1000;
>
> @@ -323,6 +325,10 @@ static int rcar_i2c_probe(struct udevice *dev)
> int ret;
>
> priv->base = dev_read_addr_ptr(dev);
> + priv->rise_ns = dev_read_u32_default(dev,
> + "i2c-scl-rising-time-ns", 200);
> + priv->fall_ns = dev_read_u32_default(dev,
> + "i2c-scl-falling-time-ns", 35);
> priv->intdelay = dev_read_u32_default(dev,
> "i2c-scl-internal-delay-ns", 5);
> priv->type = dev_get_driver_data(dev);
> --
> 2.25.1
>
More information about the U-Boot
mailing list