• Jarkko Nikula's avatar
    i2c: designware: Implement generic polling mode code for Wangxun 10Gb NIC · 197ecada
    Jarkko Nikula authored
    I got an idea the i2c-designware should not need duplicated state
    machines for the interrupt and polling modes. The IP is practically the
    same and state transitions happens in response to the events that can be
    observed from the DW_IC_RAW_INTR_STAT register. Either by interrupts or
    by polling.
    
    Another reasons are the interrupt mode is the most tested, has handling
    for special cases as well as transmit abort handling and those are
    missing from two polling mode quirks.
    
    Patch implements a generic polling mode by using existing code for
    interrupt mode. This is done by moving event handling from the
    i2c_dw_isr() into a new i2c_dw_process_transfer() that will be called
    both from the i2c_dw_isr() and a polling loop.
    
    Polling loop is implemented in a new i2c_dw_wait_transfer() that is
    shared between both modes. In interrupt mode it waits for the completion
    object as before. In polling mode both completion object and
    DW_IC_RAW_INTR_STAT are polled to determine completed transfer and state
    transitions.
    
    Loop tries to save power by sleeping "stetson guessed" range between
    3 and 25 µS which falls between 10 cycles of High-speed mode 3.4 Mb/s
    and Fast mode 400 kHz. With it the CPU usage was reduced under heavy
    Fast mode I2C transfer without much increase in total transfer time but
    otherwise no more effort has been put to optimize this.
    
    I decided to convert the txgbe_i2c_dw_xfer_quirk() straight to generic
    polling mode code in this patch. It doesn't have HW dependent quirks
    like the amd_i2c_dw_xfer_quirk() does have and without users this patch
    is needless.
    Signed-off-by: default avatarJarkko Nikula <jarkko.nikula@linux.intel.com>
    Tested-by: default avatarJiawen Wu <jiawenwu@trustnetic.com>
    Signed-off-by: default avatarAndi Shyti <andi.shyti@kernel.org>
    197ecada
i2c-designware-master.c 26.6 KB