Merge branch 'i2c-for-linus' of git://jdelvare.pck.nerim.net/jdelvare-2.6
* 'i2c-for-linus' of git://jdelvare.pck.nerim.net/jdelvare-2.6: i2c/ds1374: Check workqueue creation status i2c-i801: Restore the device state before leaving i2c-amd8111: Missed cleanup
This commit is contained in:
commit
fffda91e2e
3 changed files with 31 additions and 1 deletions
|
@ -254,7 +254,8 @@ static s32 amd8111_access(struct i2c_adapter * adap, u16 addr,
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case I2C_SMBUS_BLOCK_PROC_CALL:
|
case I2C_SMBUS_BLOCK_PROC_CALL:
|
||||||
len = min_t(u8, data->block[0], 31);
|
len = min_t(u8, data->block[0],
|
||||||
|
I2C_SMBUS_BLOCK_MAX - 1);
|
||||||
amd_ec_write(smbus, AMD_SMB_CMD, command);
|
amd_ec_write(smbus, AMD_SMB_CMD, command);
|
||||||
amd_ec_write(smbus, AMD_SMB_BCNT, len);
|
amd_ec_write(smbus, AMD_SMB_BCNT, len);
|
||||||
for (i = 0; i < len; i++)
|
for (i = 0; i < len; i++)
|
||||||
|
|
|
@ -97,6 +97,7 @@ static int i801_block_transaction(union i2c_smbus_data *data, char read_write,
|
||||||
int command, int hwpec);
|
int command, int hwpec);
|
||||||
|
|
||||||
static unsigned long i801_smba;
|
static unsigned long i801_smba;
|
||||||
|
static unsigned char i801_original_hstcfg;
|
||||||
static struct pci_driver i801_driver;
|
static struct pci_driver i801_driver;
|
||||||
static struct pci_dev *I801_dev;
|
static struct pci_dev *I801_dev;
|
||||||
static int isich4;
|
static int isich4;
|
||||||
|
@ -510,6 +511,7 @@ static int __devinit i801_probe(struct pci_dev *dev, const struct pci_device_id
|
||||||
}
|
}
|
||||||
|
|
||||||
pci_read_config_byte(I801_dev, SMBHSTCFG, &temp);
|
pci_read_config_byte(I801_dev, SMBHSTCFG, &temp);
|
||||||
|
i801_original_hstcfg = temp;
|
||||||
temp &= ~SMBHSTCFG_I2C_EN; /* SMBus timing */
|
temp &= ~SMBHSTCFG_I2C_EN; /* SMBus timing */
|
||||||
if (!(temp & SMBHSTCFG_HST_EN)) {
|
if (!(temp & SMBHSTCFG_HST_EN)) {
|
||||||
dev_info(&dev->dev, "Enabling SMBus device\n");
|
dev_info(&dev->dev, "Enabling SMBus device\n");
|
||||||
|
@ -543,6 +545,7 @@ static int __devinit i801_probe(struct pci_dev *dev, const struct pci_device_id
|
||||||
static void __devexit i801_remove(struct pci_dev *dev)
|
static void __devexit i801_remove(struct pci_dev *dev)
|
||||||
{
|
{
|
||||||
i2c_del_adapter(&i801_adapter);
|
i2c_del_adapter(&i801_adapter);
|
||||||
|
pci_write_config_byte(I801_dev, SMBHSTCFG, i801_original_hstcfg);
|
||||||
pci_release_region(dev, SMBBAR);
|
pci_release_region(dev, SMBBAR);
|
||||||
/*
|
/*
|
||||||
* do not call pci_disable_device(dev) since it can cause hard hangs on
|
* do not call pci_disable_device(dev) since it can cause hard hangs on
|
||||||
|
@ -550,11 +553,33 @@ static void __devexit i801_remove(struct pci_dev *dev)
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_PM
|
||||||
|
static int i801_suspend(struct pci_dev *dev, pm_message_t mesg)
|
||||||
|
{
|
||||||
|
pci_save_state(dev);
|
||||||
|
pci_write_config_byte(dev, SMBHSTCFG, i801_original_hstcfg);
|
||||||
|
pci_set_power_state(dev, pci_choose_state(dev, mesg));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int i801_resume(struct pci_dev *dev)
|
||||||
|
{
|
||||||
|
pci_set_power_state(dev, PCI_D0);
|
||||||
|
pci_restore_state(dev);
|
||||||
|
return pci_enable_device(dev);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#define i801_suspend NULL
|
||||||
|
#define i801_resume NULL
|
||||||
|
#endif
|
||||||
|
|
||||||
static struct pci_driver i801_driver = {
|
static struct pci_driver i801_driver = {
|
||||||
.name = "i801_smbus",
|
.name = "i801_smbus",
|
||||||
.id_table = i801_ids,
|
.id_table = i801_ids,
|
||||||
.probe = i801_probe,
|
.probe = i801_probe,
|
||||||
.remove = __devexit_p(i801_remove),
|
.remove = __devexit_p(i801_remove),
|
||||||
|
.suspend = i801_suspend,
|
||||||
|
.resume = i801_resume,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __init i2c_i801_init(void)
|
static int __init i2c_i801_init(void)
|
||||||
|
|
|
@ -207,6 +207,10 @@ static int ds1374_probe(struct i2c_adapter *adap, int addr, int kind)
|
||||||
client->driver = &ds1374_driver;
|
client->driver = &ds1374_driver;
|
||||||
|
|
||||||
ds1374_workqueue = create_singlethread_workqueue("ds1374");
|
ds1374_workqueue = create_singlethread_workqueue("ds1374");
|
||||||
|
if (!ds1374_workqueue) {
|
||||||
|
kfree(client);
|
||||||
|
return -ENOMEM; /* most expected reason */
|
||||||
|
}
|
||||||
|
|
||||||
if ((rc = i2c_attach_client(client)) != 0) {
|
if ((rc = i2c_attach_client(client)) != 0) {
|
||||||
kfree(client);
|
kfree(client);
|
||||||
|
|
Loading…
Reference in a new issue