• Shinya Kuribayashi's avatar
    i2c-designware: Improved _HCNT/_LCNT calculation · d60c7e81
    Shinya Kuribayashi authored
    * Calculate with accurate conditional expressions from DW manuals.
    * Round ic_clk by adding 0.5 as it's important at high ic_clk rate.
    * Take into account "tHD;STA" issue for _HCNT calculation.
    * Take into account "tf" for _LCNT calculation.
    * Add "cond" and "offset" fot further correction requirements.
    
    For _HCNT calculation, there's one issue needs to be carefully
    considered; DesignWare I2C core doesn't seem to have solid strategy
    to meet the tHD;STA timing spec.  If you configure _HCNT based on the
    tHIGH timing spec, it easily results in violation of the tHD;STA spec.
    
    After many trials, we came to the conclusion that the tHD;STA period
    is proportional to (_HCNT + 3).  For the safety's sake, this should be
    selected by default.
    
    As for _LCNT calculation, DW I2C core has one characteristic behavior;
    he starts counting the SCL CNTs for the LOW period of the SCL clock
    (tLOW) as soon as it pulls the SCL line.  At that time, he doesn't take
    into account the fall time of SCL signal (tf), IOW, he starts counting
    CNTs without confirming the SCL input voltage has dropped to below VIL.
    
    This characteristics becomes a problem on some platforms where tf is
    considerably long, and results in violation of the tLOW timing spec.
    
    To make the driver configurable as much as possible for various cases,
    we'd have separated arguments "tf" and "offset", and for safety default
    values should be 0.3 us and 0, respectively.
    Signed-off-by: default avatarShinya Kuribayashi <shinya.kuribayashi@necel.com>
    Acked-by: default avatarBaruch Siach <baruch@tkos.co.il>
    Signed-off-by: default avatarBen Dooks <ben-linux@fluff.org>
    d60c7e81
i2c-designware.c 20.3 KB