Commit 015744f5 authored by Linus Torvalds's avatar Linus Torvalds

Merge bk://kernel.bkbits.net/gregkh/linux/i2c-2.5

into home.transmeta.com:/home/torvalds/v2.5/linux
parents 8a80abf7 fdc47311
...@@ -177,17 +177,18 @@ static int ali15x3_setup(struct pci_dev *ALI15X3_dev) ...@@ -177,17 +177,18 @@ static int ali15x3_setup(struct pci_dev *ALI15X3_dev)
if(force_addr) { if(force_addr) {
dev_info(&ALI15X3_dev->dev, "forcing ISA address 0x%04X\n", dev_info(&ALI15X3_dev->dev, "forcing ISA address 0x%04X\n",
ali15x3_smba); ali15x3_smba);
if (PCIBIOS_SUCCESSFUL != if (PCIBIOS_SUCCESSFUL != pci_write_config_word(ALI15X3_dev,
pci_write_config_word(ALI15X3_dev, SMBBA, ali15x3_smba)) SMBBA,
return -ENODEV; ali15x3_smba))
if (PCIBIOS_SUCCESSFUL != goto error;
pci_read_config_word(ALI15X3_dev, SMBBA, &a)) if (PCIBIOS_SUCCESSFUL != pci_read_config_word(ALI15X3_dev,
return -ENODEV; SMBBA, &a))
goto error;
if ((a & ~(ALI15X3_SMB_IOSIZE - 1)) != ali15x3_smba) { if ((a & ~(ALI15X3_SMB_IOSIZE - 1)) != ali15x3_smba) {
/* make sure it works */ /* make sure it works */
dev_err(&ALI15X3_dev->dev, dev_err(&ALI15X3_dev->dev,
"force address failed - not supported?\n"); "force address failed - not supported?\n");
return -ENODEV; goto error;
} }
} }
/* check if whole device is enabled */ /* check if whole device is enabled */
...@@ -219,6 +220,9 @@ static int ali15x3_setup(struct pci_dev *ALI15X3_dev) ...@@ -219,6 +220,9 @@ static int ali15x3_setup(struct pci_dev *ALI15X3_dev)
dev_dbg(&ALI15X3_dev->dev, "iALI15X3_smba = 0x%X\n", ali15x3_smba); dev_dbg(&ALI15X3_dev->dev, "iALI15X3_smba = 0x%X\n", ali15x3_smba);
return 0; return 0;
error:
release_region(ali15x3_smba, ALI15X3_SMB_IOSIZE);
return -ENODEV;
} }
/* Internally used pause function */ /* Internally used pause function */
......
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
82801BA 2443 82801BA 2443
82801CA/CAM 2483 82801CA/CAM 2483
82801DB 24C3 (HW PEC supported, 32 byte buffer not supported) 82801DB 24C3 (HW PEC supported, 32 byte buffer not supported)
82801EB 24D3 (HW PEC supported, 32 byte buffer not supported)
This driver supports several versions of Intel's I/O Controller Hubs (ICH). This driver supports several versions of Intel's I/O Controller Hubs (ICH).
For SMBus support, they are similar to the PIIX4 and are part For SMBus support, they are similar to the PIIX4 and are part
...@@ -121,7 +122,8 @@ static int i801_setup(struct pci_dev *dev) ...@@ -121,7 +122,8 @@ static int i801_setup(struct pci_dev *dev)
return -ENODEV; return -ENODEV;
I801_dev = dev; I801_dev = dev;
if (dev->device == PCI_DEVICE_ID_INTEL_82801DB_3) if ((dev->device == PCI_DEVICE_ID_INTEL_82801DB_3) ||
(dev->device == PCI_DEVICE_ID_INTEL_82801EB_3))
isich4 = 1; isich4 = 1;
else else
isich4 = 0; isich4 = 0;
...@@ -585,6 +587,12 @@ static struct pci_device_id i801_ids[] __devinitdata = { ...@@ -585,6 +587,12 @@ static struct pci_device_id i801_ids[] __devinitdata = {
.subvendor = PCI_ANY_ID, .subvendor = PCI_ANY_ID,
.subdevice = PCI_ANY_ID, .subdevice = PCI_ANY_ID,
}, },
{
.vendor = PCI_VENDOR_ID_INTEL,
.device = PCI_DEVICE_ID_INTEL_82801EB_3,
.subvendor = PCI_ANY_ID,
.subdevice = PCI_ANY_ID,
},
{ 0, } { 0, }
}; };
......
...@@ -62,6 +62,20 @@ config SENSORS_LM85 ...@@ -62,6 +62,20 @@ config SENSORS_LM85
in the lm_sensors package, which you can download at in the lm_sensors package, which you can download at
http://www.lm-sensors.nu http://www.lm-sensors.nu
config SENSORS_LM78
tristate " National Semiconductors LM78 and compatibles"
depends on I2C && EXPERIMENTAL
help
If you say yes here you get support for National Semiconductor LM78,
LM78-J and LM79. This can also be built as a module which can be
inserted and removed while the kernel is running.
The module will be called lm78.
You will also need the latest user-space utilties: you can find them
in the lm_sensors package, which you can download at
http://www.lm-sensors.nu
config SENSORS_VIA686A config SENSORS_VIA686A
tristate " VIA686A" tristate " VIA686A"
depends on I2C && EXPERIMENTAL depends on I2C && EXPERIMENTAL
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
obj-$(CONFIG_SENSORS_ADM1021) += adm1021.o obj-$(CONFIG_SENSORS_ADM1021) += adm1021.o
obj-$(CONFIG_SENSORS_IT87) += it87.o obj-$(CONFIG_SENSORS_IT87) += it87.o
obj-$(CONFIG_SENSORS_LM75) += lm75.o obj-$(CONFIG_SENSORS_LM75) += lm75.o
obj-$(CONFIG_SENSORS_LM78) += lm78.o
obj-$(CONFIG_SENSORS_LM85) += lm85.o obj-$(CONFIG_SENSORS_LM85) += lm85.o
obj-$(CONFIG_SENSORS_VIA686A) += via686a.o obj-$(CONFIG_SENSORS_VIA686A) += via686a.o
obj-$(CONFIG_SENSORS_W83781D) += w83781d.o obj-$(CONFIG_SENSORS_W83781D) += w83781d.o
...@@ -88,8 +88,8 @@ SENSORS_INSMOD_8(adm1021, adm1023, max1617, max1617a, thmc10, lm84, gl523sm, mc1 ...@@ -88,8 +88,8 @@ SENSORS_INSMOD_8(adm1021, adm1023, max1617, max1617a, thmc10, lm84, gl523sm, mc1
these macros are called: arguments may be evaluated more than once. these macros are called: arguments may be evaluated more than once.
Fixing this is just not worth it. */ Fixing this is just not worth it. */
/* Conversions note: 1021 uses normal integer signed-byte format*/ /* Conversions note: 1021 uses normal integer signed-byte format*/
#define TEMP_FROM_REG(val) (val > 127 ? val-256 : val) #define TEMP_FROM_REG(val) (val > 127 ? (val-256)*1000 : val*1000)
#define TEMP_TO_REG(val) (SENSORS_LIMIT((val < 0 ? val+256 : val),0,255)) #define TEMP_TO_REG(val) (SENSORS_LIMIT((val < 0 ? (val/1000)+256 : val/1000),0,255))
/* Initial values */ /* Initial values */
...@@ -172,8 +172,18 @@ show(temp_input); ...@@ -172,8 +172,18 @@ show(temp_input);
show(remote_temp_max); show(remote_temp_max);
show(remote_temp_hyst); show(remote_temp_hyst);
show(remote_temp_input); show(remote_temp_input);
show(alarms);
show(die_code); #define show2(value) \
static ssize_t show_##value(struct device *dev, char *buf) \
{ \
struct i2c_client *client = to_i2c_client(dev); \
struct adm1021_data *data = i2c_get_clientdata(client); \
\
adm1021_update_client(client); \
return sprintf(buf, "%d\n", data->value); \
}
show2(alarms);
show2(die_code);
#define set(value, reg) \ #define set(value, reg) \
static ssize_t set_##value(struct device *dev, const char *buf, size_t count) \ static ssize_t set_##value(struct device *dev, const char *buf, size_t count) \
......
This diff is collapsed.
...@@ -148,20 +148,17 @@ static int lm85_scaling[] = { /* .001 Volts */ ...@@ -148,20 +148,17 @@ static int lm85_scaling[] = { /* .001 Volts */
#define SCALE(val,from,to) (((val)*(to) + ((from)/2))/(from)) #define SCALE(val,from,to) (((val)*(to) + ((from)/2))/(from))
#define INS_TO_REG(n,val) (SENSORS_LIMIT(SCALE(val,lm85_scaling[n],192),0,255)) #define INS_TO_REG(n,val) (SENSORS_LIMIT(SCALE(val,lm85_scaling[n],192),0,255))
#define INSEXT_FROM_REG(n,val,ext) (SCALE((val)*4 + (ext),192*4,lm85_scaling[n])) #define INSEXT_FROM_REG(n,val,ext) (SCALE((val)*4 + (ext),192*4,lm85_scaling[n]))
/*
#define INS_FROM_REG(n,val) (INSEXT_FROM_REG(n,val,0)) #define INS_FROM_REG(n,val) (INSEXT_FROM_REG(n,val,0))
*/
#define INS_FROM_REG(n,val) ( ( (val*4*lm85_scaling[n]) + (192*4/2) ) / (192*4) )
/* FAN speed is measured using 90kHz clock */ /* FAN speed is measured using 90kHz clock */
#define FAN_TO_REG(val) (SENSORS_LIMIT( (val)<=0?0: 5400000/(val),0,65534)) #define FAN_TO_REG(val) (SENSORS_LIMIT( (val)<=0?0: 5400000/(val),0,65534))
#define FAN_FROM_REG(val) ((val)==0?-1:(val)==0xffff?0:5400000/(val)) #define FAN_FROM_REG(val) ((val)==0?-1:(val)==0xffff?0:5400000/(val))
/* Temperature is reported in .01 degC increments */ /* Temperature is reported in .001 degC increments */
#define TEMP_TO_REG(val) (SENSORS_LIMIT(((val)+50)/100,-127,127)) #define TEMP_TO_REG(val) (SENSORS_LIMIT(((val)+500)/1000,-127,127))
#define TEMPEXT_FROM_REG(val,ext) ((val)*100 + (ext)*25) #define TEMPEXT_FROM_REG(val,ext) ((val)*1000 + (ext)*250)
#define TEMP_FROM_REG(val) (TEMPEXT_FROM_REG(val,0)) #define TEMP_FROM_REG(val) (TEMPEXT_FROM_REG(val,0))
#define EXTTEMP_TO_REG(val) (SENSORS_LIMIT((val)/25,-127,127)) #define EXTTEMP_TO_REG(val) (SENSORS_LIMIT((val)/250,-127,127))
#define PWM_TO_REG(val) (SENSORS_LIMIT(val,0,255)) #define PWM_TO_REG(val) (SENSORS_LIMIT(val,0,255))
#define PWM_FROM_REG(val) (val) #define PWM_FROM_REG(val) (val)
...@@ -437,10 +434,13 @@ static ssize_t set_fan_min(struct device *dev, const char *buf, ...@@ -437,10 +434,13 @@ static ssize_t set_fan_min(struct device *dev, const char *buf,
{ {
struct i2c_client *client = to_i2c_client(dev); struct i2c_client *client = to_i2c_client(dev);
struct lm85_data *data = i2c_get_clientdata(client); struct lm85_data *data = i2c_get_clientdata(client);
int val;
int val = simple_strtol(buf, NULL, 10); down(&data->update_lock);
val = simple_strtol(buf, NULL, 10);
data->fan_min[nr] = FAN_TO_REG(val); data->fan_min[nr] = FAN_TO_REG(val);
lm85_write_value(client, LM85_REG_FAN_MIN(nr), data->fan_min[nr]); lm85_write_value(client, LM85_REG_FAN_MIN(nr), data->fan_min[nr]);
up(&data->update_lock);
return count; return count;
} }
...@@ -528,10 +528,13 @@ static ssize_t set_pwm(struct device *dev, const char *buf, ...@@ -528,10 +528,13 @@ static ssize_t set_pwm(struct device *dev, const char *buf,
{ {
struct i2c_client *client = to_i2c_client(dev); struct i2c_client *client = to_i2c_client(dev);
struct lm85_data *data = i2c_get_clientdata(client); struct lm85_data *data = i2c_get_clientdata(client);
int val;
int val = simple_strtol(buf, NULL, 10); down(&data->update_lock);
val = simple_strtol(buf, NULL, 10);
data->pwm[nr] = PWM_TO_REG(val); data->pwm[nr] = PWM_TO_REG(val);
lm85_write_value(client, LM85_REG_PWM(nr), data->pwm[nr]); lm85_write_value(client, LM85_REG_PWM(nr), data->pwm[nr]);
up(&data->update_lock);
return count; return count;
} }
static ssize_t show_pwm_enable(struct device *dev, char *buf, int nr) static ssize_t show_pwm_enable(struct device *dev, char *buf, int nr)
...@@ -590,10 +593,13 @@ static ssize_t set_in_min(struct device *dev, const char *buf, ...@@ -590,10 +593,13 @@ static ssize_t set_in_min(struct device *dev, const char *buf,
{ {
struct i2c_client *client = to_i2c_client(dev); struct i2c_client *client = to_i2c_client(dev);
struct lm85_data *data = i2c_get_clientdata(client); struct lm85_data *data = i2c_get_clientdata(client);
int val;
int val = simple_strtol(buf, NULL, 10); down(&data->update_lock);
val = simple_strtol(buf, NULL, 10);
data->in_min[nr] = INS_TO_REG(nr, val); data->in_min[nr] = INS_TO_REG(nr, val);
lm85_write_value(client, LM85_REG_IN_MIN(nr), data->in_min[nr]); lm85_write_value(client, LM85_REG_IN_MIN(nr), data->in_min[nr]);
up(&data->update_lock);
return count; return count;
} }
static ssize_t show_in_max(struct device *dev, char *buf, int nr) static ssize_t show_in_max(struct device *dev, char *buf, int nr)
...@@ -609,10 +615,13 @@ static ssize_t set_in_max(struct device *dev, const char *buf, ...@@ -609,10 +615,13 @@ static ssize_t set_in_max(struct device *dev, const char *buf,
{ {
struct i2c_client *client = to_i2c_client(dev); struct i2c_client *client = to_i2c_client(dev);
struct lm85_data *data = i2c_get_clientdata(client); struct lm85_data *data = i2c_get_clientdata(client);
int val;
int val = simple_strtol(buf, NULL, 10); down(&data->update_lock);
val = simple_strtol(buf, NULL, 10);
data->in_max[nr] = INS_TO_REG(nr, val); data->in_max[nr] = INS_TO_REG(nr, val);
lm85_write_value(client, LM85_REG_IN_MAX(nr), data->in_max[nr]); lm85_write_value(client, LM85_REG_IN_MAX(nr), data->in_max[nr]);
up(&data->update_lock);
return count; return count;
} }
#define show_in_reg(offset) \ #define show_in_reg(offset) \
...@@ -673,10 +682,13 @@ static ssize_t set_temp_min(struct device *dev, const char *buf, ...@@ -673,10 +682,13 @@ static ssize_t set_temp_min(struct device *dev, const char *buf,
{ {
struct i2c_client *client = to_i2c_client(dev); struct i2c_client *client = to_i2c_client(dev);
struct lm85_data *data = i2c_get_clientdata(client); struct lm85_data *data = i2c_get_clientdata(client);
int val;
int val = simple_strtol(buf, NULL, 10); down(&data->update_lock);
val = simple_strtol(buf, NULL, 10);
data->temp_min[nr] = TEMP_TO_REG(val); data->temp_min[nr] = TEMP_TO_REG(val);
lm85_write_value(client, LM85_REG_TEMP_MIN(nr), data->temp_min[nr]); lm85_write_value(client, LM85_REG_TEMP_MIN(nr), data->temp_min[nr]);
up(&data->update_lock);
return count; return count;
} }
static ssize_t show_temp_max(struct device *dev, char *buf, int nr) static ssize_t show_temp_max(struct device *dev, char *buf, int nr)
...@@ -692,10 +704,13 @@ static ssize_t set_temp_max(struct device *dev, const char *buf, ...@@ -692,10 +704,13 @@ static ssize_t set_temp_max(struct device *dev, const char *buf,
{ {
struct i2c_client *client = to_i2c_client(dev); struct i2c_client *client = to_i2c_client(dev);
struct lm85_data *data = i2c_get_clientdata(client); struct lm85_data *data = i2c_get_clientdata(client);
int val;
int val = simple_strtol(buf, NULL, 10); down(&data->update_lock);
val = simple_strtol(buf, NULL, 10);
data->temp_max[nr] = TEMP_TO_REG(val); data->temp_max[nr] = TEMP_TO_REG(val);
lm85_write_value(client, LM85_REG_TEMP_MAX(nr), data->temp_max[nr]); lm85_write_value(client, LM85_REG_TEMP_MAX(nr), data->temp_max[nr]);
up(&data->update_lock);
return count; return count;
} }
#define show_temp_reg(offset) \ #define show_temp_reg(offset) \
......
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
asb100 "bach" (type_name = as99127f) 0x30 0x0694 yes no asb100 "bach" (type_name = as99127f) 0x30 0x0694 yes no
w83781d 7 3 0 3 0x10 0x5ca3 yes yes w83781d 7 3 0 3 0x10 0x5ca3 yes yes
w83627hf 9 3 2 3 0x20 0x5ca3 yes yes(LPC) w83627hf 9 3 2 3 0x20 0x5ca3 yes yes(LPC)
w83627thf 9 3 2 3 0x90 0x5ca3 no yes(LPC)
w83782d 9 3 2-4 3 0x30 0x5ca3 yes yes w83782d 9 3 2-4 3 0x30 0x5ca3 yes yes
w83783s 5-6 3 2 1-2 0x40 0x5ca3 yes no w83783s 5-6 3 2 1-2 0x40 0x5ca3 yes no
w83697hf 8 2 2 2 0x60 0x5ca3 no yes(LPC) w83697hf 8 2 2 2 0x60 0x5ca3 no yes(LPC)
...@@ -299,8 +300,8 @@ struct w83781d_data { ...@@ -299,8 +300,8 @@ struct w83781d_data {
char valid; /* !=0 if following fields are valid */ char valid; /* !=0 if following fields are valid */
unsigned long last_updated; /* In jiffies */ unsigned long last_updated; /* In jiffies */
struct i2c_client *lm75; /* for secondary I2C addresses */ struct i2c_client *lm75[2]; /* for secondary I2C addresses */
/* pointer to array of 2 subclients */ /* array of 2 pointers to subclients */
u8 in[9]; /* Register value - 8 & 9 for 782D only */ u8 in[9]; /* Register value - 8 & 9 for 782D only */
u8 in_max[9]; /* Register value - 8 & 9 for 782D only */ u8 in_max[9]; /* Register value - 8 & 9 for 782D only */
...@@ -1043,12 +1044,12 @@ w83781d_detect_subclients(struct i2c_adapter *adapter, int address, int kind, ...@@ -1043,12 +1044,12 @@ w83781d_detect_subclients(struct i2c_adapter *adapter, int address, int kind,
const char *client_name; const char *client_name;
struct w83781d_data *data = i2c_get_clientdata(new_client); struct w83781d_data *data = i2c_get_clientdata(new_client);
if (!(data->lm75 = kmalloc(2 * sizeof (struct i2c_client), data->lm75[0] = kmalloc(sizeof(struct i2c_client), GFP_KERNEL);
GFP_KERNEL))) { if (!(data->lm75[0])) {
err = -ENOMEM; err = -ENOMEM;
goto ERROR_SC_0; goto ERROR_SC_0;
} }
memset(data->lm75, 0x00, 2 * sizeof (struct i2c_client)); memset(data->lm75[0], 0x00, sizeof (struct i2c_client));
id = i2c_adapter_id(adapter); id = i2c_adapter_id(adapter);
...@@ -1066,25 +1067,33 @@ w83781d_detect_subclients(struct i2c_adapter *adapter, int address, int kind, ...@@ -1066,25 +1067,33 @@ w83781d_detect_subclients(struct i2c_adapter *adapter, int address, int kind,
w83781d_write_value(new_client, W83781D_REG_I2C_SUBADDR, w83781d_write_value(new_client, W83781D_REG_I2C_SUBADDR,
(force_subclients[2] & 0x07) | (force_subclients[2] & 0x07) |
((force_subclients[3] & 0x07) << 4)); ((force_subclients[3] & 0x07) << 4));
data->lm75[0].addr = force_subclients[2]; data->lm75[0]->addr = force_subclients[2];
} else { } else {
val1 = w83781d_read_value(new_client, W83781D_REG_I2C_SUBADDR); val1 = w83781d_read_value(new_client, W83781D_REG_I2C_SUBADDR);
data->lm75[0].addr = 0x48 + (val1 & 0x07); data->lm75[0]->addr = 0x48 + (val1 & 0x07);
} }
if (kind != w83783s) { if (kind != w83783s) {
data->lm75[1] = kmalloc(sizeof(struct i2c_client), GFP_KERNEL);
if (!(data->lm75[1])) {
err = -ENOMEM;
goto ERROR_SC_1;
}
memset(data->lm75[1], 0x0, sizeof(struct i2c_client));
if (force_subclients[0] == id && if (force_subclients[0] == id &&
force_subclients[1] == address) { force_subclients[1] == address) {
data->lm75[1].addr = force_subclients[3]; data->lm75[1]->addr = force_subclients[3];
} else { } else {
data->lm75[1].addr = 0x48 + ((val1 >> 4) & 0x07); data->lm75[1]->addr = 0x48 + ((val1 >> 4) & 0x07);
} }
if (data->lm75[0].addr == data->lm75[1].addr) { if (data->lm75[0]->addr == data->lm75[1]->addr) {
dev_err(&new_client->dev, dev_err(&new_client->dev,
"Duplicate addresses 0x%x for subclients.\n", "Duplicate addresses 0x%x for subclients.\n",
data->lm75[0].addr); data->lm75[0]->addr);
err = -EBUSY; err = -EBUSY;
goto ERROR_SC_1; goto ERROR_SC_2;
} }
} }
...@@ -1103,19 +1112,19 @@ w83781d_detect_subclients(struct i2c_adapter *adapter, int address, int kind, ...@@ -1103,19 +1112,19 @@ w83781d_detect_subclients(struct i2c_adapter *adapter, int address, int kind,
for (i = 0; i <= 1; i++) { for (i = 0; i <= 1; i++) {
/* store all data in w83781d */ /* store all data in w83781d */
i2c_set_clientdata(&data->lm75[i], NULL); i2c_set_clientdata(data->lm75[i], NULL);
data->lm75[i].adapter = adapter; data->lm75[i]->adapter = adapter;
data->lm75[i].driver = &w83781d_driver; data->lm75[i]->driver = &w83781d_driver;
data->lm75[i].flags = 0; data->lm75[i]->flags = 0;
strlcpy(data->lm75[i].dev.name, client_name, strlcpy(data->lm75[i]->dev.name, client_name,
DEVICE_NAME_SIZE); DEVICE_NAME_SIZE);
if ((err = i2c_attach_client(&(data->lm75[i])))) { if ((err = i2c_attach_client(data->lm75[i]))) {
dev_err(&new_client->dev, "Subclient %d " dev_err(&new_client->dev, "Subclient %d "
"registration at address 0x%x " "registration at address 0x%x "
"failed.\n", i, data->lm75[i].addr); "failed.\n", i, data->lm75[i]->addr);
if (i == 1) if (i == 1)
goto ERROR_SC_3;
goto ERROR_SC_2; goto ERROR_SC_2;
goto ERROR_SC_1;
} }
if (kind == w83783s) if (kind == w83783s)
break; break;
...@@ -1124,10 +1133,14 @@ w83781d_detect_subclients(struct i2c_adapter *adapter, int address, int kind, ...@@ -1124,10 +1133,14 @@ w83781d_detect_subclients(struct i2c_adapter *adapter, int address, int kind,
return 0; return 0;
/* Undo inits in case of errors */ /* Undo inits in case of errors */
ERROR_SC_3:
i2c_detach_client(data->lm75[0]);
ERROR_SC_2: ERROR_SC_2:
i2c_detach_client(&(data->lm75[0])); if (NULL != data->lm75[1])
kfree(data->lm75[1]);
ERROR_SC_1: ERROR_SC_1:
kfree(data->lm75); if (NULL != data->lm75[0])
kfree(data->lm75[0]);
ERROR_SC_0: ERROR_SC_0:
return err; return err;
} }
...@@ -1273,7 +1286,7 @@ w83781d_detect(struct i2c_adapter *adapter, int address, int kind) ...@@ -1273,7 +1286,7 @@ w83781d_detect(struct i2c_adapter *adapter, int address, int kind)
kind = w83782d; kind = w83782d;
else if (val1 == 0x40 && vendid == winbond && !is_isa) else if (val1 == 0x40 && vendid == winbond && !is_isa)
kind = w83783s; kind = w83783s;
else if (val1 == 0x20 && vendid == winbond) else if ((val1 == 0x20 || val1 == 0x90) && vendid == winbond)
kind = w83627hf; kind = w83627hf;
else if (val1 == 0x30 && vendid == asus && !is_isa) else if (val1 == 0x30 && vendid == asus && !is_isa)
kind = as99127f; kind = as99127f;
...@@ -1297,6 +1310,9 @@ w83781d_detect(struct i2c_adapter *adapter, int address, int kind) ...@@ -1297,6 +1310,9 @@ w83781d_detect(struct i2c_adapter *adapter, int address, int kind)
} else if (kind == w83783s) { } else if (kind == w83783s) {
client_name = "W83783S chip"; client_name = "W83783S chip";
} else if (kind == w83627hf) { } else if (kind == w83627hf) {
if (val1 == 0x90)
client_name = "W83627THF chip";
else
client_name = "W83627HF chip"; client_name = "W83627HF chip";
} else if (kind == as99127f) { } else if (kind == as99127f) {
client_name = "AS99127F chip"; client_name = "AS99127F chip";
...@@ -1326,7 +1342,8 @@ w83781d_detect(struct i2c_adapter *adapter, int address, int kind) ...@@ -1326,7 +1342,8 @@ w83781d_detect(struct i2c_adapter *adapter, int address, int kind)
kind, new_client))) kind, new_client)))
goto ERROR3; goto ERROR3;
} else { } else {
data->lm75 = NULL; data->lm75[0] = NULL;
data->lm75[1] = NULL;
} }
device_create_file_in(new_client, 0); device_create_file_in(new_client, 0);
...@@ -1409,20 +1426,11 @@ w83781d_detect(struct i2c_adapter *adapter, int address, int kind) ...@@ -1409,20 +1426,11 @@ w83781d_detect(struct i2c_adapter *adapter, int address, int kind)
static int static int
w83781d_detach_client(struct i2c_client *client) w83781d_detach_client(struct i2c_client *client)
{ {
struct w83781d_data *data = i2c_get_clientdata(client);
int err; int err;
/* release ISA region or I2C subclients first */ if (i2c_is_isa_client(client))
if (i2c_is_isa_client(client)) {
release_region(client->addr, W83781D_EXTENT); release_region(client->addr, W83781D_EXTENT);
} else {
i2c_detach_client(&data->lm75[0]);
if (data->type != w83783s)
i2c_detach_client(&data->lm75[1]);
kfree(data->lm75);
}
/* now it's safe to scrap the rest */
if ((err = i2c_detach_client(client))) { if ((err = i2c_detach_client(client))) {
dev_err(&client->dev, dev_err(&client->dev,
"Client deregistration failed, client not detached.\n"); "Client deregistration failed, client not detached.\n");
...@@ -1484,7 +1492,7 @@ w83781d_read_value(struct i2c_client *client, u16 reg) ...@@ -1484,7 +1492,7 @@ w83781d_read_value(struct i2c_client *client, u16 reg)
res = i2c_smbus_read_byte_data(client, reg & 0xff); res = i2c_smbus_read_byte_data(client, reg & 0xff);
} else { } else {
/* switch to subclient */ /* switch to subclient */
cl = &data->lm75[bank - 1]; cl = data->lm75[bank - 1];
/* convert from ISA to LM75 I2C addresses */ /* convert from ISA to LM75 I2C addresses */
switch (reg & 0xff) { switch (reg & 0xff) {
case 0x50: /* TEMP */ case 0x50: /* TEMP */
...@@ -1555,7 +1563,7 @@ w83781d_write_value(struct i2c_client *client, u16 reg, u16 value) ...@@ -1555,7 +1563,7 @@ w83781d_write_value(struct i2c_client *client, u16 reg, u16 value)
value & 0xff); value & 0xff);
} else { } else {
/* switch to subclient */ /* switch to subclient */
cl = &data->lm75[bank - 1]; cl = data->lm75[bank - 1];
/* convert from ISA to LM75 I2C addresses */ /* convert from ISA to LM75 I2C addresses */
switch (reg & 0xff) { switch (reg & 0xff) {
case 0x52: /* CONFIG */ case 0x52: /* CONFIG */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment