i2c: i801: Restore configuration at shutdown
authorJean Delvare <jdelvare@suse.de>
Wed, 11 Apr 2018 16:05:34 +0000 (18:05 +0200)
committerWolfram Sang <wsa@the-dreams.de>
Wed, 11 Apr 2018 21:08:13 +0000 (23:08 +0200)
On some systems, the BIOS expects certain SMBus register values to
match the hardware defaults. Restore these configuration registers at
shutdown time to avoid confusing the BIOS. This avoids hard-locking
such systems upon reboot.

Signed-off-by: Jean Delvare <jdelvare@suse.de>
Tested-by: Jason Andryuk <jandryuk@gmail.com>
Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
Cc: stable@vger.kernel.org
drivers/i2c/busses/i2c-i801.c

index 17aa20a55642d40b51d673df7f51770179672b28..e0d59e9ff3c6de53b5c94a54fbd21e88713ecd1b 100644 (file)
@@ -1701,6 +1701,15 @@ static void i801_remove(struct pci_dev *dev)
         */
 }
 
+static void i801_shutdown(struct pci_dev *dev)
+{
+       struct i801_priv *priv = pci_get_drvdata(dev);
+
+       /* Restore config registers to avoid hard hang on some systems */
+       i801_disable_host_notify(priv);
+       pci_write_config_byte(dev, SMBHSTCFG, priv->original_hstcfg);
+}
+
 #ifdef CONFIG_PM
 static int i801_suspend(struct device *dev)
 {
@@ -1730,6 +1739,7 @@ static struct pci_driver i801_driver = {
        .id_table       = i801_ids,
        .probe          = i801_probe,
        .remove         = i801_remove,
+       .shutdown       = i801_shutdown,
        .driver         = {
                .pm     = &i801_pm_ops,
        },