On Tue, Oct 06, 2009 at 08:13:23PM +0200, Jean Delvare wrote: > As kind is now hard-coded to -1, there is room for code clean-ups. > > Signed-off-by: Jean Delvare <khali@xxxxxxxxxxxx> For the max6650 and lm93 part: Reviewed-by: Hans J. Koch <hjk@xxxxxxxxxxxxx> Acked-by: Hans J. Koch <hjk@xxxxxxxxxxxxx> Thanks, Hans > CC: Corentin Labbe <corentin.labbe@xxxxxxxxxxx> > Cc: Mark M. Hoffman <mhoffman@xxxxxxxxxxxxx> > Cc: Juerg Haefliger <juergh@xxxxxxxxx> > Cc: Riku Voipio <riku.vipio@xxxxxx> > Cc: Hans J. Koch <hjk@xxxxxxxxxxxxx> > Cc: Rudolf Marek <r.marek@xxxxxxxxxxxx> > --- > drivers/hwmon/adm1026.c | 47 +++++++++++++------------------- > drivers/hwmon/adm1029.c | 57 +++++++++++---------------------------- > drivers/hwmon/adm1031.c | 26 ++++------------- > drivers/hwmon/adm9240.c | 61 +++++++++++++++-------------------------- > drivers/hwmon/ads7828.c | 22 ++++++--------- > drivers/hwmon/adt7462.c | 27 +++++++----------- > drivers/hwmon/adt7470.c | 27 +++++++----------- > drivers/hwmon/adt7473.c | 27 +++++++----------- > drivers/hwmon/adt7475.c | 14 ++++----- > drivers/hwmon/asb100.c | 55 ++++++++++++------------------------- > drivers/hwmon/dme1737.c | 32 +++++++--------------- > drivers/hwmon/ds1621.c | 22 ++++++--------- > drivers/hwmon/f75375s.c | 31 ++++++--------------- > drivers/hwmon/fschmd.c | 53 ++++++++++++++++-------------------- > drivers/hwmon/gl518sm.c | 29 ++++--------------- > drivers/hwmon/gl520sm.c | 12 +++----- > drivers/hwmon/lm63.c | 50 +++++++++++++++------------------- > drivers/hwmon/lm75.c | 54 +++++++++++++++++-------------------- > drivers/hwmon/lm78.c | 60 ++++++++++++++--------------------------- > drivers/hwmon/lm87.c | 41 ++++++++++++---------------- > drivers/hwmon/lm92.c | 29 ++++++------------- > drivers/hwmon/lm93.c | 32 +++++++--------------- > drivers/hwmon/lm95241.c | 48 ++++++--------------------------- > drivers/hwmon/max1619.c | 64 +++++++++++++------------------------------- > drivers/hwmon/max6650.c | 20 +------------ > drivers/hwmon/smsc47m192.c | 28 ++++++++----------- > drivers/hwmon/thmc50.c | 31 +++++---------------- > drivers/hwmon/w83793.c | 53 ++++++++++++------------------------ > drivers/hwmon/w83l786ng.c | 58 ++++++++++++--------------------------- > 29 files changed, 394 insertions(+), 716 deletions(-) > > --- linux-2.6.32-rc3.orig/drivers/hwmon/adm1026.c 2009-10-06 10:33:15.000000000 +0200 > +++ linux-2.6.32-rc3/drivers/hwmon/adm1026.c 2009-10-06 12:53:55.000000000 +0200 > @@ -1672,35 +1672,26 @@ static int adm1026_detect(struct i2c_cli > i2c_adapter_id(client->adapter), client->addr, > company, verstep); > > - /* If auto-detecting, Determine the chip type. */ > - if (kind <= 0) { > - dev_dbg(&adapter->dev, "Autodetecting device at %d,0x%02x " > - "...\n", i2c_adapter_id(adapter), address); > - if (company == ADM1026_COMPANY_ANALOG_DEV > - && verstep == ADM1026_VERSTEP_ADM1026) { > - kind = adm1026; > - } else if (company == ADM1026_COMPANY_ANALOG_DEV > - && (verstep & 0xf0) == ADM1026_VERSTEP_GENERIC) { > - dev_err(&adapter->dev, "Unrecognized stepping " > - "0x%02x. Defaulting to ADM1026.\n", verstep); > - kind = adm1026; > - } else if ((verstep & 0xf0) == ADM1026_VERSTEP_GENERIC) { > - dev_err(&adapter->dev, "Found version/stepping " > - "0x%02x. Assuming generic ADM1026.\n", > - verstep); > - kind = any_chip; > - } else { > - dev_dbg(&adapter->dev, "Autodetection failed\n"); > - /* Not an ADM1026 ... */ > - if (kind == 0) { /* User used force=x,y */ > - dev_err(&adapter->dev, "Generic ADM1026 not " > - "found at %d,0x%02x. Try " > - "force_adm1026.\n", > - i2c_adapter_id(adapter), address); > - } > - return -ENODEV; > - } > + /* Determine the chip type. */ > + dev_dbg(&adapter->dev, "Autodetecting device at %d,0x%02x...\n", > + i2c_adapter_id(adapter), address); > + if (company == ADM1026_COMPANY_ANALOG_DEV > + && verstep == ADM1026_VERSTEP_ADM1026) { > + /* Analog Devices ADM1026 */ > + } else if (company == ADM1026_COMPANY_ANALOG_DEV > + && (verstep & 0xf0) == ADM1026_VERSTEP_GENERIC) { > + dev_err(&adapter->dev, "Unrecognized stepping " > + "0x%02x. Defaulting to ADM1026.\n", verstep); > + } else if ((verstep & 0xf0) == ADM1026_VERSTEP_GENERIC) { > + dev_err(&adapter->dev, "Found version/stepping " > + "0x%02x. Assuming generic ADM1026.\n", > + verstep); > + } else { > + dev_dbg(&adapter->dev, "Autodetection failed\n"); > + /* Not an ADM1026... */ > + return -ENODEV; > } > + > strlcpy(info->type, "adm1026", I2C_NAME_SIZE); > > return 0; > --- linux-2.6.32-rc3.orig/drivers/hwmon/adm1029.c 2009-10-06 10:33:15.000000000 +0200 > +++ linux-2.6.32-rc3/drivers/hwmon/adm1029.c 2009-10-06 12:53:55.000000000 +0200 > @@ -301,59 +301,36 @@ static int adm1029_detect(struct i2c_cli > struct i2c_board_info *info) > { > struct i2c_adapter *adapter = client->adapter; > + u8 man_id, chip_id, temp_devices_installed, nb_fan_support; > > if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) > return -ENODEV; > > - /* Now we do the detection and identification. A negative kind > - * means that the driver was loaded with no force parameter > - * (default), so we must both detect and identify the chip > - * (actually there is only one possible kind of chip for now, adm1029). > - * A zero kind means that the driver was loaded with the force > - * parameter, the detection step shall be skipped. A positive kind > - * means that the driver was loaded with the force parameter and a > - * given kind of chip is requested, so both the detection and the > - * identification steps are skipped. */ > - > - /* Default to an adm1029 if forced */ > - if (kind == 0) > - kind = adm1029; > - > /* ADM1029 doesn't have CHIP ID, check just MAN ID > * For better detection we check also ADM1029_TEMP_DEVICES_INSTALLED, > * ADM1029_REG_NB_FAN_SUPPORT and compare it with possible values > * documented > */ > > - if (kind <= 0) { /* identification */ > - u8 man_id, chip_id, temp_devices_installed, nb_fan_support; > - > - man_id = i2c_smbus_read_byte_data(client, ADM1029_REG_MAN_ID); > - chip_id = i2c_smbus_read_byte_data(client, ADM1029_REG_CHIP_ID); > - temp_devices_installed = i2c_smbus_read_byte_data(client, > + man_id = i2c_smbus_read_byte_data(client, ADM1029_REG_MAN_ID); > + chip_id = i2c_smbus_read_byte_data(client, ADM1029_REG_CHIP_ID); > + temp_devices_installed = i2c_smbus_read_byte_data(client, > ADM1029_REG_TEMP_DEVICES_INSTALLED); > - nb_fan_support = i2c_smbus_read_byte_data(client, > + nb_fan_support = i2c_smbus_read_byte_data(client, > ADM1029_REG_NB_FAN_SUPPORT); > - /* 0x41 is Analog Devices */ > - if (man_id == 0x41 && (temp_devices_installed & 0xf9) == 0x01 > - && nb_fan_support == 0x03) { > - if ((chip_id & 0xF0) == 0x00) { > - kind = adm1029; > - } else { > - /* There are no "official" CHIP ID, so actually > - * we use Major/Minor revision for that */ > - printk(KERN_INFO > - "adm1029: Unknown major revision %x, " > - "please let us know\n", chip_id); > - } > - } > - > - if (kind <= 0) { /* identification failed */ > - pr_debug("adm1029: Unsupported chip (man_id=0x%02X, " > - "chip_id=0x%02X)\n", man_id, chip_id); > - return -ENODEV; > - } > + /* 0x41 is Analog Devices */ > + if (man_id != 0x41 || (temp_devices_installed & 0xf9) != 0x01 > + || nb_fan_support != 0x03) > + return -ENODEV; > + > + if ((chip_id & 0xF0) != 0x00) { > + /* There are no "official" CHIP ID, so actually > + * we use Major/Minor revision for that */ > + pr_info("adm1029: Unknown major revision %x, " > + "please let us know\n", chip_id); > + return -ENODEV; > } > + > strlcpy(info->type, "adm1029", I2C_NAME_SIZE); > > return 0; > --- linux-2.6.32-rc3.orig/drivers/hwmon/adm1031.c 2009-10-06 10:33:15.000000000 +0200 > +++ linux-2.6.32-rc3/drivers/hwmon/adm1031.c 2009-10-06 12:53:55.000000000 +0200 > @@ -817,31 +817,19 @@ static int adm1031_detect(struct i2c_cli > struct i2c_board_info *info) > { > struct i2c_adapter *adapter = client->adapter; > - const char *name = ""; > + const char *name; > + int id, co; > > if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) > return -ENODEV; > > - if (kind < 0) { > - int id, co; > - id = i2c_smbus_read_byte_data(client, 0x3d); > - co = i2c_smbus_read_byte_data(client, 0x3e); > + id = i2c_smbus_read_byte_data(client, 0x3d); > + co = i2c_smbus_read_byte_data(client, 0x3e); > > - if (!((id == 0x31 || id == 0x30) && co == 0x41)) > - return -ENODEV; > - kind = (id == 0x30) ? adm1030 : adm1031; > - } > - > - if (kind <= 0) > - kind = adm1031; > + if (!((id == 0x31 || id == 0x30) && co == 0x41)) > + return -ENODEV; > + name = (id == 0x30) ? "adm1030" : "adm1031"; > > - /* Given the detected chip type, set the chip name and the > - * auto fan control helper table. */ > - if (kind == adm1030) { > - name = "adm1030"; > - } else if (kind == adm1031) { > - name = "adm1031"; > - } > strlcpy(info->type, name, I2C_NAME_SIZE); > > return 0; > --- linux-2.6.32-rc3.orig/drivers/hwmon/adm9240.c 2009-10-06 10:33:15.000000000 +0200 > +++ linux-2.6.32-rc3/drivers/hwmon/adm9240.c 2009-10-06 12:53:55.000000000 +0200 > @@ -556,51 +556,34 @@ static int adm9240_detect(struct i2c_cli > if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) > return -ENODEV; > > - if (kind == 0) { > - kind = adm9240; > - } > - > - if (kind < 0) { > - > - /* verify chip: reg address should match i2c address */ > - if (i2c_smbus_read_byte_data(new_client, ADM9240_REG_I2C_ADDR) > - != address) { > - dev_err(&adapter->dev, "detect fail: address match, " > - "0x%02x\n", address); > - return -ENODEV; > - } > - > - /* check known chip manufacturer */ > - man_id = i2c_smbus_read_byte_data(new_client, > - ADM9240_REG_MAN_ID); > - if (man_id == 0x23) { > - kind = adm9240; > - } else if (man_id == 0xda) { > - kind = ds1780; > - } else if (man_id == 0x01) { > - kind = lm81; > - } else { > - dev_err(&adapter->dev, "detect fail: unknown manuf, " > - "0x%02x\n", man_id); > - return -ENODEV; > - } > - > - /* successful detect, print chip info */ > - die_rev = i2c_smbus_read_byte_data(new_client, > - ADM9240_REG_DIE_REV); > - dev_info(&adapter->dev, "found %s revision %u\n", > - man_id == 0x23 ? "ADM9240" : > - man_id == 0xda ? "DS1780" : "LM81", die_rev); > + /* verify chip: reg address should match i2c address */ > + if (i2c_smbus_read_byte_data(new_client, ADM9240_REG_I2C_ADDR) > + != address) { > + dev_err(&adapter->dev, "detect fail: address match, 0x%02x\n", > + address); > + return -ENODEV; > } > > - /* either forced or detected chip kind */ > - if (kind == adm9240) { > + /* check known chip manufacturer */ > + man_id = i2c_smbus_read_byte_data(new_client, ADM9240_REG_MAN_ID); > + if (man_id == 0x23) { > name = "adm9240"; > - } else if (kind == ds1780) { > + } else if (man_id == 0xda) { > name = "ds1780"; > - } else if (kind == lm81) { > + } else if (man_id == 0x01) { > name = "lm81"; > + } else { > + dev_err(&adapter->dev, "detect fail: unknown manuf, 0x%02x\n", > + man_id); > + return -ENODEV; > } > + > + /* successful detect, print chip info */ > + die_rev = i2c_smbus_read_byte_data(new_client, ADM9240_REG_DIE_REV); > + dev_info(&adapter->dev, "found %s revision %u\n", > + man_id == 0x23 ? "ADM9240" : > + man_id == 0xda ? "DS1780" : "LM81", die_rev); > + > strlcpy(info->type, name, I2C_NAME_SIZE); > > return 0; > --- linux-2.6.32-rc3.orig/drivers/hwmon/ads7828.c 2009-10-06 10:33:15.000000000 +0200 > +++ linux-2.6.32-rc3/drivers/hwmon/ads7828.c 2009-10-06 12:53:55.000000000 +0200 > @@ -191,6 +191,7 @@ static int ads7828_detect(struct i2c_cli > struct i2c_board_info *info) > { > struct i2c_adapter *adapter = client->adapter; > + int ch; > > /* Check we have a valid client */ > if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_READ_WORD_DATA)) > @@ -202,20 +203,17 @@ static int ads7828_detect(struct i2c_cli > - Read from the 8 channel addresses > - Check the top 4 bits of each result are not set (12 data bits) > */ > - if (kind < 0) { > - int ch; > - for (ch = 0; ch < ADS7828_NCH; ch++) { > - u16 in_data; > - u8 cmd = channel_cmd_byte(ch); > - in_data = ads7828_read_value(client, cmd); > - if (in_data & 0xF000) { > - printk(KERN_DEBUG > - "%s : Doesn't look like an ads7828 device\n", > - __func__); > - return -ENODEV; > - } > + for (ch = 0; ch < ADS7828_NCH; ch++) { > + u16 in_data; > + u8 cmd = channel_cmd_byte(ch); > + in_data = ads7828_read_value(client, cmd); > + if (in_data & 0xF000) { > + pr_debug("%s : Doesn't look like an ads7828 device\n", > + __func__); > + return -ENODEV; > } > } > + > strlcpy(info->type, "ads7828", I2C_NAME_SIZE); > > return 0; > --- linux-2.6.32-rc3.orig/drivers/hwmon/adt7462.c 2009-10-06 10:33:15.000000000 +0200 > +++ linux-2.6.32-rc3/drivers/hwmon/adt7462.c 2009-10-06 12:53:55.000000000 +0200 > @@ -1906,27 +1906,22 @@ static int adt7462_detect(struct i2c_cli > struct i2c_board_info *info) > { > struct i2c_adapter *adapter = client->adapter; > + int vendor, device, revision; > > if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) > return -ENODEV; > > - if (kind <= 0) { > - int vendor, device, revision; > + vendor = i2c_smbus_read_byte_data(client, ADT7462_REG_VENDOR); > + if (vendor != ADT7462_VENDOR) > + return -ENODEV; > + > + device = i2c_smbus_read_byte_data(client, ADT7462_REG_DEVICE); > + if (device != ADT7462_DEVICE) > + return -ENODEV; > > - vendor = i2c_smbus_read_byte_data(client, ADT7462_REG_VENDOR); > - if (vendor != ADT7462_VENDOR) > - return -ENODEV; > - > - device = i2c_smbus_read_byte_data(client, ADT7462_REG_DEVICE); > - if (device != ADT7462_DEVICE) > - return -ENODEV; > - > - revision = i2c_smbus_read_byte_data(client, > - ADT7462_REG_REVISION); > - if (revision != ADT7462_REVISION) > - return -ENODEV; > - } else > - dev_dbg(&adapter->dev, "detection forced\n"); > + revision = i2c_smbus_read_byte_data(client, ADT7462_REG_REVISION); > + if (revision != ADT7462_REVISION) > + return -ENODEV; > > strlcpy(info->type, "adt7462", I2C_NAME_SIZE); > > --- linux-2.6.32-rc3.orig/drivers/hwmon/adt7470.c 2009-10-06 10:33:15.000000000 +0200 > +++ linux-2.6.32-rc3/drivers/hwmon/adt7470.c 2009-10-06 12:53:55.000000000 +0200 > @@ -1229,27 +1229,22 @@ static int adt7470_detect(struct i2c_cli > struct i2c_board_info *info) > { > struct i2c_adapter *adapter = client->adapter; > + int vendor, device, revision; > > if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) > return -ENODEV; > > - if (kind <= 0) { > - int vendor, device, revision; > + vendor = i2c_smbus_read_byte_data(client, ADT7470_REG_VENDOR); > + if (vendor != ADT7470_VENDOR) > + return -ENODEV; > + > + device = i2c_smbus_read_byte_data(client, ADT7470_REG_DEVICE); > + if (device != ADT7470_DEVICE) > + return -ENODEV; > > - vendor = i2c_smbus_read_byte_data(client, ADT7470_REG_VENDOR); > - if (vendor != ADT7470_VENDOR) > - return -ENODEV; > - > - device = i2c_smbus_read_byte_data(client, ADT7470_REG_DEVICE); > - if (device != ADT7470_DEVICE) > - return -ENODEV; > - > - revision = i2c_smbus_read_byte_data(client, > - ADT7470_REG_REVISION); > - if (revision != ADT7470_REVISION) > - return -ENODEV; > - } else > - dev_dbg(&adapter->dev, "detection forced\n"); > + revision = i2c_smbus_read_byte_data(client, ADT7470_REG_REVISION); > + if (revision != ADT7470_REVISION) > + return -ENODEV; > > strlcpy(info->type, "adt7470", I2C_NAME_SIZE); > > --- linux-2.6.32-rc3.orig/drivers/hwmon/adt7473.c 2009-10-06 10:33:15.000000000 +0200 > +++ linux-2.6.32-rc3/drivers/hwmon/adt7473.c 2009-10-06 12:53:55.000000000 +0200 > @@ -1090,27 +1090,22 @@ static int adt7473_detect(struct i2c_cli > struct i2c_board_info *info) > { > struct i2c_adapter *adapter = client->adapter; > + int vendor, device, revision; > > if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) > return -ENODEV; > > - if (kind <= 0) { > - int vendor, device, revision; > + vendor = i2c_smbus_read_byte_data(client, ADT7473_REG_VENDOR); > + if (vendor != ADT7473_VENDOR) > + return -ENODEV; > + > + device = i2c_smbus_read_byte_data(client, ADT7473_REG_DEVICE); > + if (device != ADT7473_DEVICE) > + return -ENODEV; > > - vendor = i2c_smbus_read_byte_data(client, ADT7473_REG_VENDOR); > - if (vendor != ADT7473_VENDOR) > - return -ENODEV; > - > - device = i2c_smbus_read_byte_data(client, ADT7473_REG_DEVICE); > - if (device != ADT7473_DEVICE) > - return -ENODEV; > - > - revision = i2c_smbus_read_byte_data(client, > - ADT7473_REG_REVISION); > - if (revision != ADT7473_REV_68 && revision != ADT7473_REV_69) > - return -ENODEV; > - } else > - dev_dbg(&adapter->dev, "detection forced\n"); > + revision = i2c_smbus_read_byte_data(client, ADT7473_REG_REVISION); > + if (revision != ADT7473_REV_68 && revision != ADT7473_REV_69) > + return -ENODEV; > > strlcpy(info->type, "adt7473", I2C_NAME_SIZE); > > --- linux-2.6.32-rc3.orig/drivers/hwmon/adt7475.c 2009-10-06 10:33:15.000000000 +0200 > +++ linux-2.6.32-rc3/drivers/hwmon/adt7475.c 2009-10-06 12:53:55.000000000 +0200 > @@ -975,14 +975,12 @@ static int adt7475_detect(struct i2c_cli > if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) > return -ENODEV; > > - if (kind <= 0) { > - if (adt7475_read(REG_VENDID) != 0x41 || > - adt7475_read(REG_DEVID) != 0x75) { > - dev_err(&adapter->dev, > - "Couldn't detect a adt7475 part at 0x%02x\n", > - (unsigned int)client->addr); > - return -ENODEV; > - } > + if (adt7475_read(REG_VENDID) != 0x41 || > + adt7475_read(REG_DEVID) != 0x75) { > + dev_err(&adapter->dev, > + "Couldn't detect a adt7475 part at 0x%02x\n", > + (unsigned int)client->addr); > + return -ENODEV; > } > > strlcpy(info->type, adt7475_id[0].name, I2C_NAME_SIZE); > --- linux-2.6.32-rc3.orig/drivers/hwmon/asb100.c 2009-10-06 10:33:15.000000000 +0200 > +++ linux-2.6.32-rc3/drivers/hwmon/asb100.c 2009-10-06 12:53:55.000000000 +0200 > @@ -701,6 +701,7 @@ static int asb100_detect(struct i2c_clie > struct i2c_board_info *info) > { > struct i2c_adapter *adapter = client->adapter; > + int val1, val2; > > if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) { > pr_debug("asb100.o: detect failed, " > @@ -708,50 +709,30 @@ static int asb100_detect(struct i2c_clie > return -ENODEV; > } > > - /* The chip may be stuck in some other bank than bank 0. This may > - make reading other information impossible. Specify a force=... or > - force_*=... parameter, and the chip will be reset to the right > - bank. */ > - if (kind < 0) { > - > - int val1 = i2c_smbus_read_byte_data(client, ASB100_REG_BANK); > - int val2 = i2c_smbus_read_byte_data(client, ASB100_REG_CHIPMAN); > - > - /* If we're in bank 0 */ > - if ((!(val1 & 0x07)) && > - /* Check for ASB100 ID (low byte) */ > - (((!(val1 & 0x80)) && (val2 != 0x94)) || > - /* Check for ASB100 ID (high byte ) */ > - ((val1 & 0x80) && (val2 != 0x06)))) { > - pr_debug("asb100.o: detect failed, " > - "bad chip id 0x%02x!\n", val2); > - return -ENODEV; > - } > + val1 = i2c_smbus_read_byte_data(client, ASB100_REG_BANK); > + val2 = i2c_smbus_read_byte_data(client, ASB100_REG_CHIPMAN); > > - } /* kind < 0 */ > + /* If we're in bank 0 */ > + if ((!(val1 & 0x07)) && > + /* Check for ASB100 ID (low byte) */ > + (((!(val1 & 0x80)) && (val2 != 0x94)) || > + /* Check for ASB100 ID (high byte ) */ > + ((val1 & 0x80) && (val2 != 0x06)))) { > + pr_debug("asb100: detect failed, bad chip id 0x%02x!\n", val2); > + return -ENODEV; > + } > > - /* We have either had a force parameter, or we have already detected > - Winbond. Put it now into bank 0 and Vendor ID High Byte */ > + /* Put it now into bank 0 and Vendor ID High Byte */ > i2c_smbus_write_byte_data(client, ASB100_REG_BANK, > (i2c_smbus_read_byte_data(client, ASB100_REG_BANK) & 0x78) > | 0x80); > > /* Determine the chip type. */ > - if (kind <= 0) { > - int val1 = i2c_smbus_read_byte_data(client, ASB100_REG_WCHIPID); > - int val2 = i2c_smbus_read_byte_data(client, ASB100_REG_CHIPMAN); > - > - if ((val1 == 0x31) && (val2 == 0x06)) > - kind = asb100; > - else { > - if (kind == 0) > - dev_warn(&adapter->dev, "ignoring " > - "'force' parameter for unknown chip " > - "at adapter %d, address 0x%02x.\n", > - i2c_adapter_id(adapter), client->addr); > - return -ENODEV; > - } > - } > + val1 = i2c_smbus_read_byte_data(client, ASB100_REG_WCHIPID); > + val2 = i2c_smbus_read_byte_data(client, ASB100_REG_CHIPMAN); > + > + if (val1 != 0x31 || val2 != 0x06) > + return -ENODEV; > > strlcpy(info->type, "asb100", I2C_NAME_SIZE); > > --- linux-2.6.32-rc3.orig/drivers/hwmon/dme1737.c 2009-10-06 10:33:15.000000000 +0200 > +++ linux-2.6.32-rc3/drivers/hwmon/dme1737.c 2009-10-06 12:53:55.000000000 +0200 > @@ -2201,33 +2201,23 @@ static int dme1737_i2c_detect(struct i2c > return -ENODEV; > } > > - /* A negative kind means that the driver was loaded with no force > - * parameter (default), so we must identify the chip. */ > - if (kind < 0) { > - company = i2c_smbus_read_byte_data(client, DME1737_REG_COMPANY); > - verstep = i2c_smbus_read_byte_data(client, DME1737_REG_VERSTEP); > + company = i2c_smbus_read_byte_data(client, DME1737_REG_COMPANY); > + verstep = i2c_smbus_read_byte_data(client, DME1737_REG_VERSTEP); > > - if (company == DME1737_COMPANY_SMSC && > - (verstep & DME1737_VERSTEP_MASK) == DME1737_VERSTEP) { > - kind = dme1737; > - } else if (company == DME1737_COMPANY_SMSC && > - verstep == SCH5027_VERSTEP) { > - kind = sch5027; > - } else { > - return -ENODEV; > - } > - } > - > - if (kind == sch5027) { > + if (company == DME1737_COMPANY_SMSC && > + verstep == SCH5027_VERSTEP) { > name = "sch5027"; > - } else { > - kind = dme1737; > + > + } else if (company == DME1737_COMPANY_SMSC && > + (verstep & DME1737_VERSTEP_MASK) == DME1737_VERSTEP) { > name = "dme1737"; > + } else { > + return -ENODEV; > } > > dev_info(dev, "Found a %s chip at 0x%02x (rev 0x%02x).\n", > - kind == sch5027 ? "SCH5027" : "DME1737", client->addr, > - verstep); > + verstep == SCH5027_VERSTEP ? "SCH5027" : "DME1737", > + client->addr, verstep); > strlcpy(info->type, name, I2C_NAME_SIZE); > > return 0; > --- linux-2.6.32-rc3.orig/drivers/hwmon/ds1621.c 2009-10-06 10:33:15.000000000 +0200 > +++ linux-2.6.32-rc3/drivers/hwmon/ds1621.c 2009-10-06 12:53:55.000000000 +0200 > @@ -237,20 +237,16 @@ static int ds1621_detect(struct i2c_clie > return -ENODEV; > > /* Now, we do the remaining detection. It is lousy. */ > - if (kind < 0) { > - /* The NVB bit should be low if no EEPROM write has been > - requested during the latest 10ms, which is highly > - improbable in our case. */ > - conf = i2c_smbus_read_byte_data(client, DS1621_REG_CONF); > - if (conf < 0 || conf & DS1621_REG_CONFIG_NVB) > + /* The NVB bit should be low if no EEPROM write has been requested > + during the latest 10ms, which is highly improbable in our case. */ > + conf = i2c_smbus_read_byte_data(client, DS1621_REG_CONF); > + if (conf < 0 || conf & DS1621_REG_CONFIG_NVB) > + return -ENODEV; > + /* The 7 lowest bits of a temperature should always be 0. */ > + for (i = 0; i < ARRAY_SIZE(DS1621_REG_TEMP); i++) { > + temp = i2c_smbus_read_word_data(client, DS1621_REG_TEMP[i]); > + if (temp < 0 || (temp & 0x7f00)) > return -ENODEV; > - /* The 7 lowest bits of a temperature should always be 0. */ > - for (i = 0; i < ARRAY_SIZE(DS1621_REG_TEMP); i++) { > - temp = i2c_smbus_read_word_data(client, > - DS1621_REG_TEMP[i]); > - if (temp < 0 || (temp & 0x7f00)) > - return -ENODEV; > - } > } > > strlcpy(info->type, "ds1621", I2C_NAME_SIZE); > --- linux-2.6.32-rc3.orig/drivers/hwmon/f75375s.c 2009-10-06 10:33:15.000000000 +0200 > +++ linux-2.6.32-rc3/drivers/hwmon/f75375s.c 2009-10-06 12:53:55.000000000 +0200 > @@ -681,30 +681,19 @@ static int f75375_detect(struct i2c_clie > struct i2c_board_info *info) > { > struct i2c_adapter *adapter = client->adapter; > - u8 version = 0; > - const char *name = ""; > + u8 vendid, chipid, version; > + const char *name; > > - if (kind < 0) { > - u16 vendid = f75375_read16(client, F75375_REG_VENDOR); > - u16 chipid = f75375_read16(client, F75375_CHIP_ID); > - version = f75375_read8(client, F75375_REG_VERSION); > - if (chipid == 0x0306 && vendid == 0x1934) { > - kind = f75375; > - } else if (chipid == 0x0204 && vendid == 0x1934) { > - kind = f75373; > - } else { > - dev_err(&adapter->dev, > - "failed,%02X,%02X,%02X\n", > - chipid, version, vendid); > - return -ENODEV; > - } > - } > - > - if (kind == f75375) { > + vendid = f75375_read16(client, F75375_REG_VENDOR); > + chipid = f75375_read16(client, F75375_CHIP_ID); > + if (chipid == 0x0306 && vendid == 0x1934) > name = "f75375"; > - } else if (kind == f75373) { > + else if (chipid == 0x0204 && vendid == 0x1934) > name = "f75373"; > - } > + else > + return -ENODEV; > + > + version = f75375_read8(client, F75375_REG_VERSION); > dev_info(&adapter->dev, "found %s version: %02X\n", name, version); > strlcpy(info->type, name, I2C_NAME_SIZE); > > --- linux-2.6.32-rc3.orig/drivers/hwmon/fschmd.c 2009-10-06 10:33:15.000000000 +0200 > +++ linux-2.6.32-rc3/drivers/hwmon/fschmd.c 2009-10-06 12:57:25.000000000 +0200 > @@ -1000,43 +1000,38 @@ static void fschmd_dmi_decode(const stru > } > } > > -static int fschmd_detect(struct i2c_client *client, int kind, > +static int fschmd_detect(struct i2c_client *client, int _kind, > struct i2c_board_info *info) > { > + enum chips kind; > struct i2c_adapter *adapter = client->adapter; > + char id[4]; > > if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) > return -ENODEV; > > /* Detect & Identify the chip */ > - if (kind <= 0) { > - char id[4]; > - > - id[0] = i2c_smbus_read_byte_data(client, > - FSCHMD_REG_IDENT_0); > - id[1] = i2c_smbus_read_byte_data(client, > - FSCHMD_REG_IDENT_1); > - id[2] = i2c_smbus_read_byte_data(client, > - FSCHMD_REG_IDENT_2); > - id[3] = '\0'; > - > - if (!strcmp(id, "PEG")) > - kind = fscpos; > - else if (!strcmp(id, "HER")) > - kind = fscher; > - else if (!strcmp(id, "SCY")) > - kind = fscscy; > - else if (!strcmp(id, "HRC")) > - kind = fschrc; > - else if (!strcmp(id, "HMD")) > - kind = fschmd; > - else if (!strcmp(id, "HDS")) > - kind = fschds; > - else if (!strcmp(id, "SYL")) > - kind = fscsyl; > - else > - return -ENODEV; > - } > + id[0] = i2c_smbus_read_byte_data(client, FSCHMD_REG_IDENT_0); > + id[1] = i2c_smbus_read_byte_data(client, FSCHMD_REG_IDENT_1); > + id[2] = i2c_smbus_read_byte_data(client, FSCHMD_REG_IDENT_2); > + id[3] = '\0'; > + > + if (!strcmp(id, "PEG")) > + kind = fscpos; > + else if (!strcmp(id, "HER")) > + kind = fscher; > + else if (!strcmp(id, "SCY")) > + kind = fscscy; > + else if (!strcmp(id, "HRC")) > + kind = fschrc; > + else if (!strcmp(id, "HMD")) > + kind = fschmd; > + else if (!strcmp(id, "HDS")) > + kind = fschds; > + else if (!strcmp(id, "SYL")) > + kind = fscsyl; > + else > + return -ENODEV; > > strlcpy(info->type, fschmd_id[kind - 1].name, I2C_NAME_SIZE); > > --- linux-2.6.32-rc3.orig/drivers/hwmon/gl518sm.c 2009-10-06 10:33:15.000000000 +0200 > +++ linux-2.6.32-rc3/drivers/hwmon/gl518sm.c 2009-10-06 12:53:55.000000000 +0200 > @@ -488,36 +488,21 @@ static int gl518_detect(struct i2c_clien > struct i2c_board_info *info) > { > struct i2c_adapter *adapter = client->adapter; > - int i; > + int rev; > > if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA | > I2C_FUNC_SMBUS_WORD_DATA)) > return -ENODEV; > > /* Now, we do the remaining detection. */ > - > - if (kind < 0) { > - if ((gl518_read_value(client, GL518_REG_CHIP_ID) != 0x80) > - || (gl518_read_value(client, GL518_REG_CONF) & 0x80)) > - return -ENODEV; > - } > + if ((gl518_read_value(client, GL518_REG_CHIP_ID) != 0x80) > + || (gl518_read_value(client, GL518_REG_CONF) & 0x80)) > + return -ENODEV; > > /* Determine the chip type. */ > - if (kind <= 0) { > - i = gl518_read_value(client, GL518_REG_REVISION); > - if (i == 0x00) { > - kind = gl518sm_r00; > - } else if (i == 0x80) { > - kind = gl518sm_r80; > - } else { > - if (kind <= 0) > - dev_info(&adapter->dev, > - "Ignoring 'force' parameter for unknown " > - "chip at adapter %d, address 0x%02x\n", > - i2c_adapter_id(adapter), client->addr); > - return -ENODEV; > - } > - } > + rev = gl518_read_value(client, GL518_REG_REVISION); > + if (rev != 0x00 && rev != 0x80) > + return -ENODEV; > > strlcpy(info->type, "gl518sm", I2C_NAME_SIZE); > > --- linux-2.6.32-rc3.orig/drivers/hwmon/gl520sm.c 2009-10-06 10:33:15.000000000 +0200 > +++ linux-2.6.32-rc3/drivers/hwmon/gl520sm.c 2009-10-06 12:53:55.000000000 +0200 > @@ -691,13 +691,11 @@ static int gl520_detect(struct i2c_clien > return -ENODEV; > > /* Determine the chip type. */ > - if (kind < 0) { > - if ((gl520_read_value(client, GL520_REG_CHIP_ID) != 0x20) || > - ((gl520_read_value(client, GL520_REG_REVISION) & 0x7f) != 0x00) || > - ((gl520_read_value(client, GL520_REG_CONF) & 0x80) != 0x00)) { > - dev_dbg(&client->dev, "Unknown chip type, skipping\n"); > - return -ENODEV; > - } > + if ((gl520_read_value(client, GL520_REG_CHIP_ID) != 0x20) || > + ((gl520_read_value(client, GL520_REG_REVISION) & 0x7f) != 0x00) || > + ((gl520_read_value(client, GL520_REG_CONF) & 0x80) != 0x00)) { > + dev_dbg(&client->dev, "Unknown chip type, skipping\n"); > + return -ENODEV; > } > > strlcpy(info->type, "gl520sm", I2C_NAME_SIZE); > --- linux-2.6.32-rc3.orig/drivers/hwmon/lm63.c 2009-10-06 10:33:15.000000000 +0200 > +++ linux-2.6.32-rc3/drivers/hwmon/lm63.c 2009-10-06 12:53:55.000000000 +0200 > @@ -427,40 +427,34 @@ static int lm63_detect(struct i2c_client > struct i2c_board_info *info) > { > struct i2c_adapter *adapter = new_client->adapter; > + u8 man_id, chip_id, reg_config1, reg_config2; > + u8 reg_alert_status, reg_alert_mask; > > if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) > return -ENODEV; > > - if (kind < 0) { /* must identify */ > - u8 man_id, chip_id, reg_config1, reg_config2; > - u8 reg_alert_status, reg_alert_mask; > + man_id = i2c_smbus_read_byte_data(new_client, LM63_REG_MAN_ID); > + chip_id = i2c_smbus_read_byte_data(new_client, LM63_REG_CHIP_ID); > > - man_id = i2c_smbus_read_byte_data(new_client, > - LM63_REG_MAN_ID); > - chip_id = i2c_smbus_read_byte_data(new_client, > - LM63_REG_CHIP_ID); > - reg_config1 = i2c_smbus_read_byte_data(new_client, > - LM63_REG_CONFIG1); > - reg_config2 = i2c_smbus_read_byte_data(new_client, > - LM63_REG_CONFIG2); > - reg_alert_status = i2c_smbus_read_byte_data(new_client, > - LM63_REG_ALERT_STATUS); > - reg_alert_mask = i2c_smbus_read_byte_data(new_client, > - LM63_REG_ALERT_MASK); > + reg_config1 = i2c_smbus_read_byte_data(new_client, > + LM63_REG_CONFIG1); > + reg_config2 = i2c_smbus_read_byte_data(new_client, > + LM63_REG_CONFIG2); > + reg_alert_status = i2c_smbus_read_byte_data(new_client, > + LM63_REG_ALERT_STATUS); > + reg_alert_mask = i2c_smbus_read_byte_data(new_client, > + LM63_REG_ALERT_MASK); > > - if (man_id == 0x01 /* National Semiconductor */ > - && chip_id == 0x41 /* LM63 */ > - && (reg_config1 & 0x18) == 0x00 > - && (reg_config2 & 0xF8) == 0x00 > - && (reg_alert_status & 0x20) == 0x00 > - && (reg_alert_mask & 0xA4) == 0xA4) { > - kind = lm63; > - } else { /* failed */ > - dev_dbg(&adapter->dev, "Unsupported chip " > - "(man_id=0x%02X, chip_id=0x%02X).\n", > - man_id, chip_id); > - return -ENODEV; > - } > + if (man_id != 0x01 /* National Semiconductor */ > + || chip_id != 0x41 /* LM63 */ > + || (reg_config1 & 0x18) != 0x00 > + || (reg_config2 & 0xF8) != 0x00 > + || (reg_alert_status & 0x20) != 0x00 > + || (reg_alert_mask & 0xA4) != 0xA4) { > + dev_dbg(&adapter->dev, > + "Unsupported chip (man_id=0x%02X, chip_id=0x%02X)\n", > + man_id, chip_id); > + return -ENODEV; > } > > strlcpy(info->type, "lm63", I2C_NAME_SIZE); > --- linux-2.6.32-rc3.orig/drivers/hwmon/lm75.c 2009-10-06 10:33:15.000000000 +0200 > +++ linux-2.6.32-rc3/drivers/hwmon/lm75.c 2009-10-06 12:53:55.000000000 +0200 > @@ -239,6 +239,7 @@ static int lm75_detect(struct i2c_client > { > struct i2c_adapter *adapter = new_client->adapter; > int i; > + int cur, conf, hyst, os; > > if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA | > I2C_FUNC_SMBUS_WORD_DATA)) > @@ -251,40 +252,35 @@ static int lm75_detect(struct i2c_client > The cycling+unused addresses combination is not tested, > since it would significantly slow the detection down and would > hardly add any value. */ > - if (kind < 0) { > - int cur, conf, hyst, os; > > - /* Unused addresses */ > - cur = i2c_smbus_read_word_data(new_client, 0); > - conf = i2c_smbus_read_byte_data(new_client, 1); > - hyst = i2c_smbus_read_word_data(new_client, 2); > - if (i2c_smbus_read_word_data(new_client, 4) != hyst > - || i2c_smbus_read_word_data(new_client, 5) != hyst > - || i2c_smbus_read_word_data(new_client, 6) != hyst > - || i2c_smbus_read_word_data(new_client, 7) != hyst) > - return -ENODEV; > - os = i2c_smbus_read_word_data(new_client, 3); > - if (i2c_smbus_read_word_data(new_client, 4) != os > - || i2c_smbus_read_word_data(new_client, 5) != os > - || i2c_smbus_read_word_data(new_client, 6) != os > - || i2c_smbus_read_word_data(new_client, 7) != os) > - return -ENODEV; > + /* Unused addresses */ > + cur = i2c_smbus_read_word_data(new_client, 0); > + conf = i2c_smbus_read_byte_data(new_client, 1); > + hyst = i2c_smbus_read_word_data(new_client, 2); > + if (i2c_smbus_read_word_data(new_client, 4) != hyst > + || i2c_smbus_read_word_data(new_client, 5) != hyst > + || i2c_smbus_read_word_data(new_client, 6) != hyst > + || i2c_smbus_read_word_data(new_client, 7) != hyst) > + return -ENODEV; > + os = i2c_smbus_read_word_data(new_client, 3); > + if (i2c_smbus_read_word_data(new_client, 4) != os > + || i2c_smbus_read_word_data(new_client, 5) != os > + || i2c_smbus_read_word_data(new_client, 6) != os > + || i2c_smbus_read_word_data(new_client, 7) != os) > + return -ENODEV; > > - /* Unused bits */ > - if (conf & 0xe0) > - return -ENODEV; > + /* Unused bits */ > + if (conf & 0xe0) > + return -ENODEV; > > - /* Addresses cycling */ > - for (i = 8; i < 0xff; i += 8) > - if (i2c_smbus_read_byte_data(new_client, i + 1) != conf > - || i2c_smbus_read_word_data(new_client, i + 2) != hyst > - || i2c_smbus_read_word_data(new_client, i + 3) != os) > - return -ENODEV; > + /* Addresses cycling */ > + for (i = 8; i < 0xff; i += 8) { > + if (i2c_smbus_read_byte_data(new_client, i + 1) != conf > + || i2c_smbus_read_word_data(new_client, i + 2) != hyst > + || i2c_smbus_read_word_data(new_client, i + 3) != os) > + return -ENODEV; > } > > - /* NOTE: we treat "force=..." and "force_lm75=..." the same. > - * Only new-style driver binding distinguishes chip types. > - */ > strlcpy(info->type, "lm75", I2C_NAME_SIZE); > > return 0; > --- linux-2.6.32-rc3.orig/drivers/hwmon/lm78.c 2009-10-06 10:33:15.000000000 +0200 > +++ linux-2.6.32-rc3/drivers/hwmon/lm78.c 2009-10-06 12:53:55.000000000 +0200 > @@ -576,52 +576,34 @@ static int lm78_i2c_detect(struct i2c_cl > if (isa) > mutex_lock(&isa->update_lock); > > - if (kind < 0) { > - if ((i2c_smbus_read_byte_data(client, LM78_REG_CONFIG) & 0x80) > - || i2c_smbus_read_byte_data(client, LM78_REG_I2C_ADDR) > - != address) > - goto err_nodev; > - > - /* Explicitly prevent the misdetection of Winbond chips */ > - i = i2c_smbus_read_byte_data(client, 0x4f); > - if (i == 0xa3 || i == 0x5c) > - goto err_nodev; > - } > + if ((i2c_smbus_read_byte_data(client, LM78_REG_CONFIG) & 0x80) > + || i2c_smbus_read_byte_data(client, LM78_REG_I2C_ADDR) != address) > + goto err_nodev; > + > + /* Explicitly prevent the misdetection of Winbond chips */ > + i = i2c_smbus_read_byte_data(client, 0x4f); > + if (i == 0xa3 || i == 0x5c) > + goto err_nodev; > > /* Determine the chip type. */ > - if (kind <= 0) { > - i = i2c_smbus_read_byte_data(client, LM78_REG_CHIPID); > - if (i == 0x00 || i == 0x20 /* LM78 */ > - || i == 0x40) /* LM78-J */ > - kind = lm78; > - else if ((i & 0xfe) == 0xc0) > - kind = lm79; > - else { > - if (kind == 0) > - dev_warn(&adapter->dev, "Ignoring 'force' " > - "parameter for unknown chip at " > - "adapter %d, address 0x%02x\n", > - i2c_adapter_id(adapter), address); > - goto err_nodev; > - } > - > - if (lm78_alias_detect(client, i)) { > - dev_dbg(&adapter->dev, "Device at 0x%02x appears to " > - "be the same as ISA device\n", address); > - goto err_nodev; > - } > + i = i2c_smbus_read_byte_data(client, LM78_REG_CHIPID); > + if (i == 0x00 || i == 0x20 /* LM78 */ > + || i == 0x40) /* LM78-J */ > + client_name = "lm78"; > + else if ((i & 0xfe) == 0xc0) > + client_name = "lm79"; > + else > + goto err_nodev; > + > + if (lm78_alias_detect(client, i)) { > + dev_dbg(&adapter->dev, "Device at 0x%02x appears to " > + "be the same as ISA device\n", address); > + goto err_nodev; > } > > if (isa) > mutex_unlock(&isa->update_lock); > > - switch (kind) { > - case lm79: > - client_name = "lm79"; > - break; > - default: > - client_name = "lm78"; > - } > strlcpy(info->type, client_name, I2C_NAME_SIZE); > > return 0; > --- linux-2.6.32-rc3.orig/drivers/hwmon/lm87.c 2009-10-06 10:33:15.000000000 +0200 > +++ linux-2.6.32-rc3/drivers/hwmon/lm87.c 2009-10-06 12:53:55.000000000 +0200 > @@ -666,37 +666,32 @@ static int lm87_detect(struct i2c_client > struct i2c_board_info *info) > { > struct i2c_adapter *adapter = new_client->adapter; > - static const char *names[] = { "lm87", "adm1024" }; > + const char *name; > + u8 cid, rev; > > if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) > return -ENODEV; > > - /* Default to an LM87 if forced */ > - if (kind == 0) > - kind = lm87; > + if (lm87_read_value(new_client, LM87_REG_CONFIG) & 0x80) > + return -ENODEV; > > /* Now, we do the remaining detection. */ > - if (kind < 0) { > - u8 cid = lm87_read_value(new_client, LM87_REG_COMPANY_ID); > - u8 rev = lm87_read_value(new_client, LM87_REG_REVISION); > - > - if (cid == 0x02 /* National Semiconductor */ > - && (rev >= 0x01 && rev <= 0x08)) > - kind = lm87; > - else if (cid == 0x41 /* Analog Devices */ > - && (rev & 0xf0) == 0x10) > - kind = adm1024; > - > - if (kind < 0 > - || (lm87_read_value(new_client, LM87_REG_CONFIG) & 0x80)) { > - dev_dbg(&adapter->dev, > - "LM87 detection failed at 0x%02x.\n", > - new_client->addr); > - return -ENODEV; > - } > + cid = lm87_read_value(new_client, LM87_REG_COMPANY_ID); > + rev = lm87_read_value(new_client, LM87_REG_REVISION); > + > + if (cid == 0x02 /* National Semiconductor */ > + && (rev >= 0x01 && rev <= 0x08)) > + name = "lm87"; > + else if (cid == 0x41 /* Analog Devices */ > + && (rev & 0xf0) == 0x10) > + name = "adm1024"; > + else { > + dev_dbg(&adapter->dev, "LM87 detection failed at 0x%02x\n", > + new_client->addr); > + return -ENODEV; > } > > - strlcpy(info->type, names[kind - 1], I2C_NAME_SIZE); > + strlcpy(info->type, name, I2C_NAME_SIZE); > > return 0; > } > --- linux-2.6.32-rc3.orig/drivers/hwmon/lm92.c 2009-10-06 10:33:15.000000000 +0200 > +++ linux-2.6.32-rc3/drivers/hwmon/lm92.c 2009-10-06 12:53:55.000000000 +0200 > @@ -323,31 +323,22 @@ static int lm92_detect(struct i2c_client > struct i2c_board_info *info) > { > struct i2c_adapter *adapter = new_client->adapter; > + u8 config; > + u16 man_id; > > if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA > | I2C_FUNC_SMBUS_WORD_DATA)) > return -ENODEV; > > - /* A negative kind means that the driver was loaded with no force > - parameter (default), so we must identify the chip. */ > - if (kind < 0) { > - u8 config = i2c_smbus_read_byte_data(new_client, > - LM92_REG_CONFIG); > - u16 man_id = i2c_smbus_read_word_data(new_client, > - LM92_REG_MAN_ID); > + config = i2c_smbus_read_byte_data(new_client, LM92_REG_CONFIG); > + man_id = i2c_smbus_read_word_data(new_client, LM92_REG_MAN_ID); > > - if ((config & 0xe0) == 0x00 > - && man_id == 0x0180) { > - pr_info("lm92: Found National Semiconductor LM92 chip\n"); > - kind = lm92; > - } else > - if (max6635_check(new_client)) { > - pr_info("lm92: Found Maxim MAX6635 chip\n"); > - kind = lm92; /* No separate prefix */ > - } > - else > - return -ENODEV; > - } > + if ((config & 0xe0) == 0x00 && man_id == 0x0180) > + pr_info("lm92: Found National Semiconductor LM92 chip\n"); > + else if (max6635_check(new_client)) > + pr_info("lm92: Found Maxim MAX6635 chip\n"); > + else > + return -ENODEV; > > strlcpy(info->type, "lm92", I2C_NAME_SIZE); > > --- linux-2.6.32-rc3.orig/drivers/hwmon/lm93.c 2009-10-06 10:33:15.000000000 +0200 > +++ linux-2.6.32-rc3/drivers/hwmon/lm93.c 2009-10-06 12:53:55.000000000 +0200 > @@ -2505,34 +2505,24 @@ static int lm93_detect(struct i2c_client > struct i2c_board_info *info) > { > struct i2c_adapter *adapter = client->adapter; > + int mfr, ver; > > if (!i2c_check_functionality(adapter, LM93_SMBUS_FUNC_MIN)) > return -ENODEV; > > /* detection */ > - if (kind < 0) { > - int mfr = lm93_read_byte(client, LM93_REG_MFR_ID); > - > - if (mfr != 0x01) { > - dev_dbg(&adapter->dev,"detect failed, " > - "bad manufacturer id 0x%02x!\n", mfr); > - return -ENODEV; > - } > + mfr = lm93_read_byte(client, LM93_REG_MFR_ID); > + if (mfr != 0x01) { > + dev_dbg(&adapter->dev, > + "detect failed, bad manufacturer id 0x%02x!\n", mfr); > + return -ENODEV; > } > > - if (kind <= 0) { > - int ver = lm93_read_byte(client, LM93_REG_VER); > - > - if ((ver == LM93_MFR_ID) || (ver == LM93_MFR_ID_PROTOTYPE)) { > - kind = lm93; > - } else { > - dev_dbg(&adapter->dev,"detect failed, " > - "bad version id 0x%02x!\n", ver); > - if (kind == 0) > - dev_dbg(&adapter->dev, > - "(ignored 'force' parameter)\n"); > - return -ENODEV; > - } > + ver = lm93_read_byte(client, LM93_REG_VER); > + if (ver != LM93_MFR_ID && ver != LM93_MFR_ID_PROTOTYPE) { > + dev_dbg(&adapter->dev, > + "detect failed, bad version id 0x%02x!\n", ver); > + return -ENODEV; > } > > strlcpy(info->type, "lm93", I2C_NAME_SIZE); > --- linux-2.6.32-rc3.orig/drivers/hwmon/lm95241.c 2009-10-06 10:33:15.000000000 +0200 > +++ linux-2.6.32-rc3/drivers/hwmon/lm95241.c 2009-10-06 12:53:55.000000000 +0200 > @@ -315,51 +315,23 @@ static int lm95241_detect(struct i2c_cli > { > struct i2c_adapter *adapter = new_client->adapter; > int address = new_client->addr; > - const char *name = ""; > + const char *name; > > if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) > return -ENODEV; > > - /* > - * Now we do the remaining detection. A negative kind means that > - * the driver was loaded with no force parameter (default), so we > - * must both detect and identify the chip. A zero kind means that > - * the driver was loaded with the force parameter, the detection > - * step shall be skipped. A positive kind means that the driver > - * was loaded with the force parameter and a given kind of chip is > - * requested, so both the detection and the identification steps > - * are skipped. > - */ > - if (kind < 0) { /* detection */ > - if ((i2c_smbus_read_byte_data(new_client, LM95241_REG_R_MAN_ID) > - != MANUFACTURER_ID) > - || (i2c_smbus_read_byte_data(new_client, LM95241_REG_R_CHIP_ID) > - < DEFAULT_REVISION)) { > - dev_dbg(&adapter->dev, > - "LM95241 detection failed at 0x%02x.\n", > - address); > - return -ENODEV; > - } > - } > - > - if (kind <= 0) { /* identification */ > - if ((i2c_smbus_read_byte_data(new_client, LM95241_REG_R_MAN_ID) > - == MANUFACTURER_ID) > - && (i2c_smbus_read_byte_data(new_client, LM95241_REG_R_CHIP_ID) > - >= DEFAULT_REVISION)) { > - > - kind = lm95241; > - > - if (kind <= 0) { /* identification failed */ > - dev_info(&adapter->dev, "Unsupported chip\n"); > - return -ENODEV; > - } > - } > + if ((i2c_smbus_read_byte_data(new_client, LM95241_REG_R_MAN_ID) > + == MANUFACTURER_ID) > + && (i2c_smbus_read_byte_data(new_client, LM95241_REG_R_CHIP_ID) > + >= DEFAULT_REVISION)) { > + name = "lm95241"; > + } else { > + dev_dbg(&adapter->dev, "LM95241 detection failed at 0x%02x\n", > + address); > + return -ENODEV; > } > > /* Fill the i2c board info */ > - if (kind == lm95241) > - name = "lm95241"; > strlcpy(info->type, name, I2C_NAME_SIZE); > return 0; > } > --- linux-2.6.32-rc3.orig/drivers/hwmon/max1619.c 2009-10-06 10:33:15.000000000 +0200 > +++ linux-2.6.32-rc3/drivers/hwmon/max1619.c 2009-10-06 12:53:55.000000000 +0200 > @@ -226,58 +226,34 @@ static const struct attribute_group max1 > */ > > /* Return 0 if detection is successful, -ENODEV otherwise */ > -static int max1619_detect(struct i2c_client *new_client, int kind, > +static int max1619_detect(struct i2c_client *client, int kind, > struct i2c_board_info *info) > { > - struct i2c_adapter *adapter = new_client->adapter; > - u8 reg_config=0, reg_convrate=0, reg_status=0; > + struct i2c_adapter *adapter = client->adapter; > + u8 reg_config, reg_convrate, reg_status, man_id, chip_id; > > if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) > return -ENODEV; > > - /* > - * Now we do the remaining detection. A negative kind means that > - * the driver was loaded with no force parameter (default), so we > - * must both detect and identify the chip. A zero kind means that > - * the driver was loaded with the force parameter, the detection > - * step shall be skipped. A positive kind means that the driver > - * was loaded with the force parameter and a given kind of chip is > - * requested, so both the detection and the identification steps > - * are skipped. > - */ > - if (kind < 0) { /* detection */ > - reg_config = i2c_smbus_read_byte_data(new_client, > - MAX1619_REG_R_CONFIG); > - reg_convrate = i2c_smbus_read_byte_data(new_client, > - MAX1619_REG_R_CONVRATE); > - reg_status = i2c_smbus_read_byte_data(new_client, > - MAX1619_REG_R_STATUS); > - if ((reg_config & 0x03) != 0x00 > - || reg_convrate > 0x07 || (reg_status & 0x61 ) !=0x00) { > - dev_dbg(&adapter->dev, > - "MAX1619 detection failed at 0x%02x.\n", > - new_client->addr); > - return -ENODEV; > - } > + /* detection */ > + reg_config = i2c_smbus_read_byte_data(client, MAX1619_REG_R_CONFIG); > + reg_convrate = i2c_smbus_read_byte_data(client, MAX1619_REG_R_CONVRATE); > + reg_status = i2c_smbus_read_byte_data(client, MAX1619_REG_R_STATUS); > + if ((reg_config & 0x03) != 0x00 > + || reg_convrate > 0x07 || (reg_status & 0x61) != 0x00) { > + dev_dbg(&adapter->dev, "MAX1619 detection failed at 0x%02x\n", > + client->addr); > + return -ENODEV; > } > > - if (kind <= 0) { /* identification */ > - u8 man_id, chip_id; > - > - man_id = i2c_smbus_read_byte_data(new_client, > - MAX1619_REG_R_MAN_ID); > - chip_id = i2c_smbus_read_byte_data(new_client, > - MAX1619_REG_R_CHIP_ID); > - > - if ((man_id == 0x4D) && (chip_id == 0x04)) > - kind = max1619; > - > - if (kind <= 0) { /* identification failed */ > - dev_info(&adapter->dev, > - "Unsupported chip (man_id=0x%02X, " > - "chip_id=0x%02X).\n", man_id, chip_id); > - return -ENODEV; > - } > + /* identification */ > + man_id = i2c_smbus_read_byte_data(client, MAX1619_REG_R_MAN_ID); > + chip_id = i2c_smbus_read_byte_data(client, MAX1619_REG_R_CHIP_ID); > + if (man_id != 0x4D || chip_id != 0x04) { > + dev_info(&adapter->dev, > + "Unsupported chip (man_id=0x%02X, chip_id=0x%02X).\n", > + man_id, chip_id); > + return -ENODEV; > } > > strlcpy(info->type, "max1619", I2C_NAME_SIZE); > --- linux-2.6.32-rc3.orig/drivers/hwmon/max6650.c 2009-10-06 10:33:15.000000000 +0200 > +++ linux-2.6.32-rc3/drivers/hwmon/max6650.c 2009-10-06 12:53:55.000000000 +0200 > @@ -534,7 +534,7 @@ static int max6650_detect(struct i2c_cli > struct i2c_adapter *adapter = client->adapter; > int address = client->addr; > > - dev_dbg(&adapter->dev, "max6650_detect called, kind = %d\n", kind); > + dev_dbg(&adapter->dev, "max6650_detect called\n"); > > if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) { > dev_dbg(&adapter->dev, "max6650: I2C bus doesn't support " > @@ -542,23 +542,7 @@ static int max6650_detect(struct i2c_cli > return -ENODEV; > } > > - /* > - * Now we do the remaining detection. A negative kind means that > - * the driver was loaded with no force parameter (default), so we > - * must both detect and identify the chip (actually there is only > - * one possible kind of chip for now, max6650). A zero kind means that > - * the driver was loaded with the force parameter, the detection > - * step shall be skipped. A positive kind means that the driver > - * was loaded with the force parameter and a given kind of chip is > - * requested, so both the detection and the identification steps > - * are skipped. > - * > - * Currently I can find no way to distinguish between a MAX6650 and > - * a MAX6651. This driver has only been tried on the former. > - */ > - > - if ((kind < 0) && > - ( (i2c_smbus_read_byte_data(client, MAX6650_REG_CONFIG) & 0xC0) > + if (((i2c_smbus_read_byte_data(client, MAX6650_REG_CONFIG) & 0xC0) > ||(i2c_smbus_read_byte_data(client, MAX6650_REG_GPIO_STAT) & 0xE0) > ||(i2c_smbus_read_byte_data(client, MAX6650_REG_ALARM_EN) & 0xE0) > ||(i2c_smbus_read_byte_data(client, MAX6650_REG_ALARM) & 0xE0) > --- linux-2.6.32-rc3.orig/drivers/hwmon/smsc47m192.c 2009-10-06 10:33:15.000000000 +0200 > +++ linux-2.6.32-rc3/drivers/hwmon/smsc47m192.c 2009-10-06 12:53:55.000000000 +0200 > @@ -491,24 +491,22 @@ static int smsc47m192_detect(struct i2c_ > return -ENODEV; > > /* Detection criteria from sensors_detect script */ > - if (kind < 0) { > - if (i2c_smbus_read_byte_data(client, > + version = i2c_smbus_read_byte_data(client, SMSC47M192_REG_VERSION); > + if (i2c_smbus_read_byte_data(client, > SMSC47M192_REG_COMPANY_ID) == 0x55 > - && ((version = i2c_smbus_read_byte_data(client, > - SMSC47M192_REG_VERSION)) & 0xf0) == 0x20 > - && (i2c_smbus_read_byte_data(client, > + && (version & 0xf0) == 0x20 > + && (i2c_smbus_read_byte_data(client, > SMSC47M192_REG_VID) & 0x70) == 0x00 > - && (i2c_smbus_read_byte_data(client, > + && (i2c_smbus_read_byte_data(client, > SMSC47M192_REG_VID4) & 0xfe) == 0x80) { > - dev_info(&adapter->dev, > - "found SMSC47M192 or compatible, " > - "version 2, stepping A%d\n", version & 0x0f); > - } else { > - dev_dbg(&adapter->dev, > - "SMSC47M192 detection failed at 0x%02x\n", > - client->addr); > - return -ENODEV; > - } > + dev_info(&adapter->dev, > + "found SMSC47M192 or compatible, " > + "version 2, stepping A%d\n", version & 0x0f); > + } else { > + dev_dbg(&adapter->dev, > + "SMSC47M192 detection failed at 0x%02x\n", > + client->addr); > + return -ENODEV; > } > > strlcpy(info->type, "smsc47m192", I2C_NAME_SIZE); > --- linux-2.6.32-rc3.orig/drivers/hwmon/thmc50.c 2009-10-06 10:33:15.000000000 +0200 > +++ linux-2.6.32-rc3/drivers/hwmon/thmc50.c 2009-10-06 12:53:55.000000000 +0200 > @@ -289,7 +289,6 @@ static int thmc50_detect(struct i2c_clie > unsigned revision; > unsigned config; > struct i2c_adapter *adapter = client->adapter; > - int err = 0; > const char *type_name; > > if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) { > @@ -301,31 +300,13 @@ static int thmc50_detect(struct i2c_clie > pr_debug("thmc50: Probing for THMC50 at 0x%2X on bus %d\n", > client->addr, i2c_adapter_id(client->adapter)); > > - /* Now, we do the remaining detection. */ > company = i2c_smbus_read_byte_data(client, THMC50_REG_COMPANY_ID); > revision = i2c_smbus_read_byte_data(client, THMC50_REG_DIE_CODE); > config = i2c_smbus_read_byte_data(client, THMC50_REG_CONF); > + if (revision < 0xc0 || (config & 0x10)) > + return -ENODEV; > > - if (kind == 0) > - kind = thmc50; > - else if (kind < 0) { > - err = -ENODEV; > - if (revision >= 0xc0 && ((config & 0x10) == 0)) { > - if (company == 0x49) { > - kind = thmc50; > - err = 0; > - } else if (company == 0x41) { > - kind = adm1022; > - err = 0; > - } > - } > - } > - if (err == -ENODEV) { > - pr_debug("thmc50: Detection of THMC50/ADM1022 failed\n"); > - return err; > - } > - > - if (kind == adm1022) { > + if (company == 0x41) { > int id = i2c_adapter_id(client->adapter); > int i; > > @@ -340,9 +321,13 @@ static int thmc50_detect(struct i2c_clie > config); > break; > } > - } else { > + } else if (company == 0x49) { > type_name = "thmc50"; > + } else { > + pr_debug("thmc50: Detection of THMC50/ADM1022 failed\n"); > + return -ENODEV; > } > + > pr_debug("thmc50: Detected %s (version %x, revision %x)\n", > type_name, (revision >> 4) - 0xc, revision & 0xf); > > --- linux-2.6.32-rc3.orig/drivers/hwmon/w83793.c 2009-10-06 10:33:15.000000000 +0200 > +++ linux-2.6.32-rc3/drivers/hwmon/w83793.c 2009-10-06 12:53:55.000000000 +0200 > @@ -1164,7 +1164,7 @@ ERROR_SC_0: > static int w83793_detect(struct i2c_client *client, int kind, > struct i2c_board_info *info) > { > - u8 tmp, bank; > + u8 tmp, bank, chip_id; > struct i2c_adapter *adapter = client->adapter; > unsigned short address = client->addr; > > @@ -1174,44 +1174,27 @@ static int w83793_detect(struct i2c_clie > > bank = i2c_smbus_read_byte_data(client, W83793_REG_BANKSEL); > > - if (kind < 0) { > - tmp = bank & 0x80 ? 0x5c : 0xa3; > - /* Check Winbond vendor ID */ > - if (tmp != i2c_smbus_read_byte_data(client, > - W83793_REG_VENDORID)) { > - pr_debug("w83793: Detection failed at check " > - "vendor id\n"); > - return -ENODEV; > - } > - > - /* If Winbond chip, address of chip and W83793_REG_I2C_ADDR > - should match */ > - if ((bank & 0x07) == 0 > - && i2c_smbus_read_byte_data(client, W83793_REG_I2C_ADDR) != > - (address << 1)) { > - pr_debug("w83793: Detection failed at check " > - "i2c addr\n"); > - return -ENODEV; > - } > - > + tmp = bank & 0x80 ? 0x5c : 0xa3; > + /* Check Winbond vendor ID */ > + if (tmp != i2c_smbus_read_byte_data(client, W83793_REG_VENDORID)) { > + pr_debug("w83793: Detection failed at check vendor id\n"); > + return -ENODEV; > } > > - /* We have either had a force parameter, or we have already detected the > - Winbond. Determine the chip type now */ > - > - if (kind <= 0) { > - if (0x7b == i2c_smbus_read_byte_data(client, > - W83793_REG_CHIPID)) { > - kind = w83793; > - } else { > - if (kind == 0) > - dev_warn(&adapter->dev, "w83793: Ignoring " > - "'force' parameter for unknown chip " > - "at address 0x%02x\n", address); > - return -ENODEV; > - } > + /* If Winbond chip, address of chip and W83793_REG_I2C_ADDR > + should match */ > + if ((bank & 0x07) == 0 > + && i2c_smbus_read_byte_data(client, W83793_REG_I2C_ADDR) != > + (address << 1)) { > + pr_debug("w83793: Detection failed at check i2c addr\n"); > + return -ENODEV; > } > > + /* Determine the chip type now */ > + chip_id = i2c_smbus_read_byte_data(client, W83793_REG_CHIPID); > + if (chip_id != 0x7b) > + return -ENODEV; > + > strlcpy(info->type, "w83793", I2C_NAME_SIZE); > > return 0; > --- linux-2.6.32-rc3.orig/drivers/hwmon/w83l786ng.c 2009-10-06 10:33:15.000000000 +0200 > +++ linux-2.6.32-rc3/drivers/hwmon/w83l786ng.c 2009-10-06 12:53:55.000000000 +0200 > @@ -590,53 +590,31 @@ w83l786ng_detect(struct i2c_client *clie > struct i2c_board_info *info) > { > struct i2c_adapter *adapter = client->adapter; > + u16 man_id; > + u8 chip_id; > > if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) { > return -ENODEV; > } > > - /* > - * Now we do the remaining detection. A negative kind means that > - * the driver was loaded with no force parameter (default), so we > - * must both detect and identify the chip (actually there is only > - * one possible kind of chip for now, W83L786NG). A zero kind means > - * that the driver was loaded with the force parameter, the detection > - * step shall be skipped. A positive kind means that the driver > - * was loaded with the force parameter and a given kind of chip is > - * requested, so both the detection and the identification steps > - * are skipped. > - */ > - if (kind < 0) { /* detection */ > - if (((w83l786ng_read_value(client, > - W83L786NG_REG_CONFIG) & 0x80) != 0x00)) { > - dev_dbg(&adapter->dev, > - "W83L786NG detection failed at 0x%02x.\n", > - client->addr); > - return -ENODEV; > - } > + /* Detection */ > + if ((w83l786ng_read_value(client, W83L786NG_REG_CONFIG) & 0x80)) { > + dev_dbg(&adapter->dev, "W83L786NG detection failed at 0x%02x\n", > + client->addr); > + return -ENODEV; > } > > - if (kind <= 0) { /* identification */ > - u16 man_id; > - u8 chip_id; > - > - man_id = (w83l786ng_read_value(client, > - W83L786NG_REG_MAN_ID1) << 8) + > - w83l786ng_read_value(client, W83L786NG_REG_MAN_ID2); > - chip_id = w83l786ng_read_value(client, W83L786NG_REG_CHIP_ID); > - > - if (man_id == 0x5CA3) { /* Winbond */ > - if (chip_id == 0x80) { /* W83L786NG */ > - kind = w83l786ng; > - } > - } > - > - if (kind <= 0) { /* identification failed */ > - dev_info(&adapter->dev, > - "Unsupported chip (man_id=0x%04X, " > - "chip_id=0x%02X).\n", man_id, chip_id); > - return -ENODEV; > - } > + /* Identification */ > + man_id = (w83l786ng_read_value(client, W83L786NG_REG_MAN_ID1) << 8) + > + w83l786ng_read_value(client, W83L786NG_REG_MAN_ID2); > + chip_id = w83l786ng_read_value(client, W83L786NG_REG_CHIP_ID); > + > + if (man_id != 0x5CA3 || /* Winbond */ > + chip_id != 0x80) { /* W83L786NG */ > + dev_dbg(&adapter->dev, > + "Unsupported chip (man_id=0x%04X, chip_id=0x%02X)\n", > + man_id, chip_id); > + return -ENODEV; > } > > strlcpy(info->type, "w83l786ng", I2C_NAME_SIZE); > > > -- > Jean Delvare _______________________________________________ lm-sensors mailing list lm-sensors@xxxxxxxxxxxxxx http://lists.lm-sensors.org/mailman/listinfo/lm-sensors