• Shinya Kuribayashi's avatar
    i2c: i2c-sh_mobile: calculate clock parameters at driver probing time · 7b0e6292
    Shinya Kuribayashi authored
    Currently SCL clock parameters (ICCH/ICCL) are calculated in
    activate_ch(), which gets called every time sh_mobile_i2c_xfer() is
    processed, while each I2C bus speed is system-defined and in general
    those parameters do not have to be updated over I2C transactions.
    
    The only reason I could see having it transaction-time is to adjust
    ICCH/ICCL values according to the operating frequency of the I2C
    hardware block, in the face of DFS (Dynamic Frequency Scaling).
    
    However, this won't be necessary.
    
    The operating frequency of the I2C hardware block can change _even_
    in the middle of I2C transactions.  There is no way to prevent it
    from happening, and I2C hardware block can work with such dynamic
    frequency change, of course.
    
    Another is that ICCH/ICCL clock parameters optimized for the faster
    operating frequency, can also be applied to the slower operating
    frequency, as long as slave devices work.  However, the converse is
    not true.  It would violate SCL timing specs of the I2C standard.
    
    What we can do now is to calculate the ICCH/ICCL clock parameters
    according to the fastest operating clock of the I2C hardware block.
    And if that's the case, that calculation should be done just once
    at driver-module-init time.
    
    This patch moves ICCH/ICCL calculating part from activate_ch() into
    sh_mobile_i2c_init(), and call it from sh_mobile_i2c_probe().
    
    Note that sh_mobile_i2c_init() just prepares clock parameters using
    the clock rate and platform data provided, but does _not_ make any
    hardware I/O accesses.  We don't have to care about run-time PM
    maintenance here.
    Signed-off-by: default avatarShinya Kuribayashi <shinya.kuribayashi.px@renesas.com>
    Signed-off-by: default avatarWolfram Sang <w.sang@pengutronix.de>
    7b0e6292
i2c-sh_mobile.c 20.5 KB