|
@@ -146,6 +146,7 @@
|
|
|
#define SMBHSTCFG_HST_EN 1
|
|
|
#define SMBHSTCFG_SMB_SMI_EN 2
|
|
|
#define SMBHSTCFG_I2C_EN 4
|
|
|
+#define SMBHSTCFG_SPD_WD 0x10
|
|
|
|
|
|
/* TCO configuration bits for TCOCTL */
|
|
|
#define TCOCTL_EN 0x0100
|
|
@@ -865,9 +866,16 @@ static s32 i801_access(struct i2c_adapter *adap, u16 addr,
|
|
|
block = 1;
|
|
|
break;
|
|
|
case I2C_SMBUS_I2C_BLOCK_DATA:
|
|
|
- /* NB: page 240 of ICH5 datasheet shows that the R/#W
|
|
|
- * bit should be cleared here, even when reading */
|
|
|
- outb_p((addr & 0x7f) << 1, SMBHSTADD(priv));
|
|
|
+ /*
|
|
|
+ * NB: page 240 of ICH5 datasheet shows that the R/#W
|
|
|
+ * bit should be cleared here, even when reading.
|
|
|
+ * However if SPD Write Disable is set (Lynx Point and later),
|
|
|
+ * the read will fail if we don't set the R/#W bit.
|
|
|
+ */
|
|
|
+ outb_p(((addr & 0x7f) << 1) |
|
|
|
+ ((priv->original_hstcfg & SMBHSTCFG_SPD_WD) ?
|
|
|
+ (read_write & 0x01) : 0),
|
|
|
+ SMBHSTADD(priv));
|
|
|
if (read_write == I2C_SMBUS_READ) {
|
|
|
/* NB: page 240 of ICH5 datasheet also shows
|
|
|
* that DATA1 is the cmd field when reading */
|
|
@@ -1573,6 +1581,8 @@ static int i801_probe(struct pci_dev *dev, const struct pci_device_id *id)
|
|
|
/* Disable SMBus interrupt feature if SMBus using SMI# */
|
|
|
priv->features &= ~FEATURE_IRQ;
|
|
|
}
|
|
|
+ if (temp & SMBHSTCFG_SPD_WD)
|
|
|
+ dev_info(&dev->dev, "SPD Write Disable is set\n");
|
|
|
|
|
|
/* Clear special mode bits */
|
|
|
if (priv->features & (FEATURE_SMBUS_PEC | FEATURE_BLOCK_BUFFER))
|