Skip to content
  • Daniel Kurtz's avatar
    i2c-i801: Enable IRQ for SMBus transactions · 636752bc
    Daniel Kurtz authored
    
    
    Add a new 'feature' to i2c-i801 to enable using PCI interrupts.
    When the feature is enabled, then an isr is installed for the device's
    PCI IRQ.
    
    An I2C/SMBus transaction is always terminated by one of the following
    interrupt sources: FAILED, BUS_ERR, DEV_ERR, or on success: INTR.
    
    When the isr fires for one of these cases, it sets the ->status variable
    and wakes up the waitq.  The waitq then saves off the status code, and
    clears ->status (in preparation for some future transaction).
    The SMBus controller generates an INTR irq at the end of each
    transaction where INTREN was set in the HST_CNT register.
    
    No locking is needed around accesses to priv->status since all writes to
    it are serialized: it is only ever set once in the isr at the end of a
    transaction, and cleared while no interrupts can occur.  In addition, the
    I2C adapter lock guarantees that entire I2C transactions for a single
    adapter are always serialized.
    
    For this patch, the INTREN bit is set only for SMBus block, byte and word
    transactions, but not for I2C reads or writes.  The use of the DS
    (BYTE_DONE) interrupt with byte-by-byte I2C transactions is implemented in
    a subsequent patch.
    
    The interrupt feature has only been enabled for COUGARPOINT hardware.
    In addition, it is disabled if SMBus is using the SMI# interrupt.
    
    Signed-off-by: default avatarDaniel Kurtz <djkurtz@chromium.org>
    Signed-off-by: default avatarJean Delvare <khali@linux-fr.org>
    636752bc