i2c: rcar_i2c: Enable configuring SCL rise and fall times
authorAdam Ford <aford173@gmail.com>
Tue, 24 Aug 2021 14:10:31 +0000 (09:10 -0500)
committerHeiko Schocher <hs@denx.de>
Tue, 28 Sep 2021 04:34:14 +0000 (06:34 +0200)
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@gmail.com>
Reviewed-by: Heiko Schocher <hs@denx.de>
drivers/i2c/rcar_i2c.c

index 14bb660..d9ece5e 100644 (file)
@@ -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);