Skip to content

Commit

Permalink
i2c: i801: Check if interrupts are disabled
Browse files Browse the repository at this point in the history
There is a control bit in the PCI configuration space which disables
interrupts. If this bit is set, the driver should not try to make use
of interrupts, it won't receive any.

Signed-off-by: Jean Delvare <jdelvare@suse.de>
Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
  • Loading branch information
Jean Delvare authored and Wolfram Sang committed Nov 12, 2014
1 parent ae94471 commit aeb8a3d
Showing 1 changed file with 20 additions and 0 deletions.
20 changes: 20 additions & 0 deletions drivers/i2c/busses/i2c-i801.c
Original file line number Diff line number Diff line change
@@ -109,12 +109,16 @@

/* PCI Address Constants */
#define SMBBAR 4
#define SMBPCICTL 0x004
#define SMBPCISTS 0x006
#define SMBHSTCFG 0x040

/* Host status bits for SMBPCISTS */
#define SMBPCISTS_INTS 0x08

/* Control bits for SMBPCICTL */
#define SMBPCICTL_INTDIS 0x0400

/* Host configuration bits for SMBHSTCFG */
#define SMBHSTCFG_HST_EN 1
#define SMBHSTCFG_SMB_SMI_EN 2
@@ -1231,6 +1235,22 @@ static int i801_probe(struct pci_dev *dev, const struct pci_device_id *id)
/* Default timeout in interrupt mode: 200 ms */
priv->adapter.timeout = HZ / 5;

if (priv->features & FEATURE_IRQ) {
u16 pcictl, pcists;

/* Complain if an interrupt is already pending */
pci_read_config_word(priv->pci_dev, SMBPCISTS, &pcists);
if (pcists & SMBPCISTS_INTS)
dev_warn(&dev->dev, "An interrupt is pending!\n");

/* Check if interrupts have been disabled */
pci_read_config_word(priv->pci_dev, SMBPCICTL, &pcictl);
if (pcictl & SMBPCICTL_INTDIS) {
dev_info(&dev->dev, "Interrupts are disabled\n");
priv->features &= ~FEATURE_IRQ;
}
}

if (priv->features & FEATURE_IRQ) {
init_waitqueue_head(&priv->waitq);

0 comments on commit aeb8a3d

Please sign in to comment.