]> git.karo-electronics.de Git - linux-beck.git/commitdiff
i2c: rcar: honor additional i2c timings from DT
authorWolfram Sang <wsa+renesas@sang-engineering.com>
Tue, 8 Dec 2015 09:37:49 +0000 (10:37 +0100)
committerWolfram Sang <wsa@the-dreams.de>
Mon, 14 Dec 2015 09:51:10 +0000 (10:51 +0100)
Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
Documentation/devicetree/bindings/i2c/i2c-rcar.txt
drivers/i2c/busses/i2c-rcar.c

index ea406eb20fa5ad117b3590cd88c6f1fa13253c2a..95e97223a71c83005c1d0acca9b39c7479f34002 100644 (file)
@@ -20,6 +20,10 @@ Optional properties:
   propoerty indicates the default frequency 100 kHz.
 - clocks: clock specifier.
 
+- i2c-scl-falling-time-ns: see i2c.txt
+- i2c-scl-internal-delay-ns: see i2c.txt
+- i2c-scl-rising-time-ns: see i2c.txt
+
 Examples :
 
 i2c0: i2c@e6508000 {
index c663f4389bf8980376236a6cf63c25cdf065928c..b2389c492579cff10bf8d40bba30955043fb6383 100644 (file)
@@ -164,12 +164,15 @@ static int rcar_i2c_bus_barrier(struct rcar_i2c_priv *priv)
 
 static int rcar_i2c_clock_calculate(struct rcar_i2c_priv *priv, struct i2c_timings *t)
 {
-       u32 scgd, cdf, round, ick, scl, cdf_width;
+       u32 scgd, cdf, round, ick, sum, scl, cdf_width;
        unsigned long rate;
        struct device *dev = rcar_i2c_priv_to_dev(priv);
 
        /* Fall back to previously used values if not supplied */
        t->bus_freq_hz = t->bus_freq_hz ?: 100000;
+       t->scl_fall_ns = t->scl_fall_ns ?: 35;
+       t->scl_rise_ns = t->scl_rise_ns ?: 200;
+       t->scl_int_delay_ns = t->scl_int_delay_ns ?: 50;
 
        switch (priv->devtype) {
        case I2C_RCAR_GEN1:
@@ -193,9 +196,9 @@ static int rcar_i2c_clock_calculate(struct rcar_i2c_priv *priv, struct i2c_timin
         * SCL  = ick / (20 + SCGD * 8 + F[(ticf + tr + intd) * ick])
         *
         * ick  : I2C internal clock < 20 MHz
-        * ticf : I2C SCL falling time  =  35 ns here
-        * tr   : I2C SCL rising  time  = 200 ns here
-        * intd : LSI internal delay    =  50 ns here
+        * ticf : I2C SCL falling time
+        * tr   : I2C SCL rising  time
+        * intd : LSI internal delay
         * clkp : peripheral_clk
         * F[]  : integer up-valuation
         */
@@ -211,12 +214,12 @@ static int rcar_i2c_clock_calculate(struct rcar_i2c_priv *priv, struct i2c_timin
         * it is impossible to calculate large scale
         * number on u32. separate it
         *
-        * F[(ticf + tr + intd) * ick]
-        *  = F[(35 + 200 + 50)ns * ick]
-        *  = F[285 * ick / 1000000000]
-        *  = F[(ick / 1000000) * 285 / 1000]
+        * F[(ticf + tr + intd) * ick] with sum = (ticf + tr + intd)
+        *  = F[sum * ick / 1000000000]
+        *  = F[(ick / 1000000) * sum / 1000]
         */
-       round = (ick + 500000) / 1000000 * 285;
+       sum = t->scl_fall_ns + t->scl_rise_ns + t->scl_int_delay_ns;
+       round = (ick + 500000) / 1000000 * sum;
        round = (round + 500) / 1000;
 
        /*