forked from luck/tmp_suning_uos_patched
i2c: i801: Check if interrupts are disabled
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>
This commit is contained in:
parent
ae94471717
commit
aeb8a3d16a
@ -109,12 +109,16 @@
|
|||||||
|
|
||||||
/* PCI Address Constants */
|
/* PCI Address Constants */
|
||||||
#define SMBBAR 4
|
#define SMBBAR 4
|
||||||
|
#define SMBPCICTL 0x004
|
||||||
#define SMBPCISTS 0x006
|
#define SMBPCISTS 0x006
|
||||||
#define SMBHSTCFG 0x040
|
#define SMBHSTCFG 0x040
|
||||||
|
|
||||||
/* Host status bits for SMBPCISTS */
|
/* Host status bits for SMBPCISTS */
|
||||||
#define SMBPCISTS_INTS 0x08
|
#define SMBPCISTS_INTS 0x08
|
||||||
|
|
||||||
|
/* Control bits for SMBPCICTL */
|
||||||
|
#define SMBPCICTL_INTDIS 0x0400
|
||||||
|
|
||||||
/* Host configuration bits for SMBHSTCFG */
|
/* Host configuration bits for SMBHSTCFG */
|
||||||
#define SMBHSTCFG_HST_EN 1
|
#define SMBHSTCFG_HST_EN 1
|
||||||
#define SMBHSTCFG_SMB_SMI_EN 2
|
#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 */
|
/* Default timeout in interrupt mode: 200 ms */
|
||||||
priv->adapter.timeout = HZ / 5;
|
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) {
|
if (priv->features & FEATURE_IRQ) {
|
||||||
init_waitqueue_head(&priv->waitq);
|
init_waitqueue_head(&priv->waitq);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user