• D
    i2c: s3c2410: do not generate STOP for QUIRK_HDMIPHY · 0da2e776
    Daniel Kurtz 提交于
    The datasheet says that the STOP sequence should be:
     1) I2CSTAT.5 = 0	- Clear BUSY (or 'generate STOP')
     2) I2CCON.4 = 0	- Clear IRQPEND
     3) Wait until the stop condition takes effect.
     4*) I2CSTAT.4 = 0 	- Clear TXRXEN
    
    Where, step "4*" is only for buses with the "HDMIPHY" quirk.
    
    However, after much experimentation, it appears that:
     a) normal buses automatically clear BUSY and transition from
        Master->Slave when they complete generating a STOP condition.
        Therefore, step (3) can be done in doxfer() by polling I2CCON.4
        after starting the STOP generation here.
     b) HDMIPHY bus does neither, so there is no way to do step 3.
        There is no indication when this bus has finished generating STOP.
    
    In fact, we have found that as soon as the IRQPEND bit is cleared in
    step 2, the HDMIPHY bus generates the STOP condition, and then immediately
    starts transferring another data byte, even though the bus is supposedly
    stopped.  This is presumably because the bus is still in "Master" mode,
    and its BUSY bit is still set.
    
    To avoid these extra post-STOP transactions on HDMI phy devices, we just
    disable Serial Output on the bus (I2CSTAT.4 = 0) directly, instead of
    first generating a proper STOP condition.  This should float SDA & SCK
    terminating the transfer.  Subsequent transfers start with a proper START
    condition, and proceed normally.
    
    The HDMIPHY bus is an internal bus that always has exactly two devices,
    the host as Master and the HDMIPHY device as the slave. Skipping the STOP
    condition has been tested on this bus and works.
    
    Also, since we disable the bus directly from the isr, we can skip the bus
    idle polling loop at the end of doxfer().
    Signed-off-by: NDaniel Kurtz <djkurtz@chromium.org>
    Signed-off-by: NNaveen Krishna Chatradhi <ch.naveen@samsung.com>
    Signed-off-by: NWolfram Sang <w.sang@pengutronix.de>
    0da2e776
i2c-s3c2410.c 27.9 KB