diff options
Diffstat (limited to 'drivers/i2c')
| -rw-r--r-- | drivers/i2c/busses/Kconfig | 2 | ||||
| -rw-r--r-- | drivers/i2c/busses/i2c-piix4.c | 8 | ||||
| -rw-r--r-- | drivers/i2c/busses/i2c-pnx.c | 9 | ||||
| -rw-r--r-- | drivers/i2c/chips/tsl2550.c | 3 | ||||
| -rw-r--r-- | drivers/i2c/i2c-core.c | 11 | 
5 files changed, 26 insertions, 7 deletions
diff --git a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig index 737335ff2b2..e8fe7f169e2 100644 --- a/drivers/i2c/busses/Kconfig +++ b/drivers/i2c/busses/Kconfig @@ -128,7 +128,7 @@ config I2C_PIIX4  	    ATI SB600  	    ATI SB700  	    ATI SB800 -	    AMD SB900 +	    AMD Hudson-2  	    Serverworks OSB4  	    Serverworks CSB5  	    Serverworks CSB6 diff --git a/drivers/i2c/busses/i2c-piix4.c b/drivers/i2c/busses/i2c-piix4.c index d26a972aaca..1e245e9cad3 100644 --- a/drivers/i2c/busses/i2c-piix4.c +++ b/drivers/i2c/busses/i2c-piix4.c @@ -22,7 +22,7 @@  	Intel PIIX4, 440MX  	Serverworks OSB4, CSB5, CSB6, HT-1000, HT-1100  	ATI IXP200, IXP300, IXP400, SB600, SB700, SB800 -	AMD SB900 +	AMD Hudson-2  	SMSC Victory66     Note: we assume there can only be one device, with one SMBus interface. @@ -233,9 +233,9 @@ static int __devinit piix4_setup_sb800(struct pci_dev *PIIX4_dev,  	unsigned short smba_idx = 0xcd6;  	u8 smba_en_lo, smba_en_hi, i2ccfg, i2ccfg_offset = 0x10, smb_en = 0x2c; -	/* SB800 SMBus does not support forcing address */ +	/* SB800 and later SMBus does not support forcing address */  	if (force || force_addr) { -		dev_err(&PIIX4_dev->dev, "SB800 SMBus does not support " +		dev_err(&PIIX4_dev->dev, "SMBus does not support "  			"forcing address!\n");  		return -EINVAL;  	} @@ -480,7 +480,7 @@ static struct pci_device_id piix4_ids[] = {  	{ PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_IXP300_SMBUS) },  	{ PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_IXP400_SMBUS) },  	{ PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_SBX00_SMBUS) }, -	{ PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_SB900_SMBUS) }, +	{ PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_HUDSON2_SMBUS) },  	{ PCI_DEVICE(PCI_VENDOR_ID_SERVERWORKS,  		     PCI_DEVICE_ID_SERVERWORKS_OSB4) },  	{ PCI_DEVICE(PCI_VENDOR_ID_SERVERWORKS, diff --git a/drivers/i2c/busses/i2c-pnx.c b/drivers/i2c/busses/i2c-pnx.c index 6ff6c20f1e7..fbab6846ae6 100644 --- a/drivers/i2c/busses/i2c-pnx.c +++ b/drivers/i2c/busses/i2c-pnx.c @@ -19,7 +19,9 @@  #include <linux/completion.h>  #include <linux/platform_device.h>  #include <linux/i2c-pnx.h> +#include <linux/io.h>  #include <mach/hardware.h> +#include <mach/i2c.h>  #include <asm/irq.h>  #include <asm/uaccess.h> @@ -54,6 +56,9 @@ static inline void i2c_pnx_arm_timer(struct i2c_adapter *adap)  	struct timer_list *timer = &data->mif.timer;  	int expires = I2C_PNX_TIMEOUT / (1000 / HZ); +	if (expires <= 1) +		expires = 2; +  	del_timer_sync(timer);  	dev_dbg(&adap->dev, "Timer armed at %lu plus %u jiffies.\n", @@ -645,7 +650,7 @@ static int __devinit i2c_pnx_probe(struct platform_device *pdev)  	return 0;  out_irq: -	free_irq(alg_data->irq, alg_data); +	free_irq(alg_data->irq, i2c_pnx->adapter);  out_clock:  	i2c_pnx->set_clock_stop(pdev);  out_unmap: @@ -664,7 +669,7 @@ static int __devexit i2c_pnx_remove(struct platform_device *pdev)  	struct i2c_adapter *adap = i2c_pnx->adapter;  	struct i2c_pnx_algo_data *alg_data = adap->algo_data; -	free_irq(alg_data->irq, alg_data); +	free_irq(alg_data->irq, i2c_pnx->adapter);  	i2c_del_adapter(adap);  	i2c_pnx->set_clock_stop(pdev);  	iounmap((void *)alg_data->ioaddr); diff --git a/drivers/i2c/chips/tsl2550.c b/drivers/i2c/chips/tsl2550.c index aa96bd2d27e..a0702f36a72 100644 --- a/drivers/i2c/chips/tsl2550.c +++ b/drivers/i2c/chips/tsl2550.c @@ -257,6 +257,7 @@ static DEVICE_ATTR(operating_mode, S_IWUSR | S_IRUGO,  static ssize_t __tsl2550_show_lux(struct i2c_client *client, char *buf)  { +	struct tsl2550_data *data = i2c_get_clientdata(client);  	u8 ch0, ch1;  	int ret; @@ -274,6 +275,8 @@ static ssize_t __tsl2550_show_lux(struct i2c_client *client, char *buf)  	ret = tsl2550_calculate_lux(ch0, ch1);  	if (ret < 0)  		return ret; +	if (data->operating_mode == 1) +		ret *= 5;  	return sprintf(buf, "%d\n", ret);  } diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c index 8d80fceca6a..29650435514 100644 --- a/drivers/i2c/i2c-core.c +++ b/drivers/i2c/i2c-core.c @@ -762,6 +762,7 @@ int i2c_del_adapter(struct i2c_adapter *adap)  {  	int res = 0;  	struct i2c_adapter *found; +	struct i2c_client *client, *next;  	/* First make sure that this adapter was ever added */  	mutex_lock(&core_lock); @@ -781,6 +782,16 @@ int i2c_del_adapter(struct i2c_adapter *adap)  	if (res)  		return res; +	/* Remove devices instantiated from sysfs */ +	list_for_each_entry_safe(client, next, &userspace_devices, detected) { +		if (client->adapter == adap) { +			dev_dbg(&adap->dev, "Removing %s at 0x%x\n", +				client->name, client->addr); +			list_del(&client->detected); +			i2c_unregister_device(client); +		} +	} +  	/* Detach any active clients. This can't fail, thus we do not  	   checking the returned value. */  	res = device_for_each_child(&adap->dev, NULL, __unregister_client);  |