Commit 46e85f5f authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'hwmon-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jdelvare/staging

* 'hwmon-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jdelvare/staging:
  hwmon: (w83627ehf) Add support for the W83627UHG
  hwmon: (w83627ehf) Clean up probe function
  hwmon: (w83627ehf) Properly report PECI and AMD-SI sensor types
  hwmon: Use i2c_smbus_{read,write}_word_swapped
  hwmon: (smsc47b397) Fix checkpatch errors
  hwmon: (lm90) Make code more readable
  hwmon: (lm90) Fix warnings
  hwmon: (ibmaem) Avoid repeated memory allocations
  hwmon: (ibmaem) Make instance initializations independent
  hwmon: (ibmaem) Fix error paths
  hwmon: (lm73) Make detection less problematic
  hwmon: Avoid building drivers for powerpc that read/write ISA addresses
parents b2409fb6 eff7687d
...@@ -14,6 +14,10 @@ Supported chips: ...@@ -14,6 +14,10 @@ Supported chips:
Prefix: 'w83627dhg' Prefix: 'w83627dhg'
Addresses scanned: ISA address retrieved from Super I/O registers Addresses scanned: ISA address retrieved from Super I/O registers
Datasheet: not available Datasheet: not available
* Winbond W83627UHG
Prefix: 'w83627uhg'
Addresses scanned: ISA address retrieved from Super I/O registers
Datasheet: available from www.nuvoton.com
* Winbond W83667HG * Winbond W83667HG
Prefix: 'w83667hg' Prefix: 'w83667hg'
Addresses scanned: ISA address retrieved from Super I/O registers Addresses scanned: ISA address retrieved from Super I/O registers
...@@ -42,14 +46,13 @@ Description ...@@ -42,14 +46,13 @@ Description
----------- -----------
This driver implements support for the Winbond W83627EHF, W83627EHG, This driver implements support for the Winbond W83627EHF, W83627EHG,
W83627DHG, W83627DHG-P, W83667HG, W83667HG-B, W83667HG-I (NCT6775F), W83627DHG, W83627DHG-P, W83627UHG, W83667HG, W83667HG-B, W83667HG-I
and NCT6776F super I/O chips. We will refer to them collectively as (NCT6775F), and NCT6776F super I/O chips. We will refer to them collectively
Winbond chips. as Winbond chips.
The chips implement three temperature sensors (up to four for 667HG-B, and nine The chips implement 2 to 4 temperature sensors (9 for NCT6775F and NCT6776F),
for NCT6775F and NCT6776F), five fan rotation speed sensors, ten analog voltage 2 to 5 fan rotation speed sensors, 8 to 10 analog voltage sensors, one VID
sensors (only nine for the 627DHG), one VID (6 pins for the 627EHF/EHG, 8 pins (except for 627UHG), alarms with beep warnings (control unimplemented),
for the 627DHG and 667HG), alarms with beep warnings (control unimplemented),
and some automatic fan regulation strategies (plus manual fan control mode). and some automatic fan regulation strategies (plus manual fan control mode).
The temperature sensor sources on W82677HG-B, NCT6775F, and NCT6776F are The temperature sensor sources on W82677HG-B, NCT6775F, and NCT6776F are
...@@ -86,17 +89,16 @@ follows: ...@@ -86,17 +89,16 @@ follows:
temp1 -> pwm1 temp1 -> pwm1
temp2 -> pwm2 temp2 -> pwm2
temp3 -> pwm3 temp3 -> pwm3 (not on 627UHG)
prog -> pwm4 (not on 667HG and 667HG-B; the programmable setting is not prog -> pwm4 (not on 667HG and 667HG-B; the programmable setting is not
supported by the driver) supported by the driver)
/sys files /sys files
---------- ----------
name - this is a standard hwmon device entry. For the W83627EHF and W83627EHG, name - this is a standard hwmon device entry, it contains the name of
it is set to "w83627ehf", for the W83627DHG it is set to "w83627dhg", the device (see the prefix in the list of supported devices at
for the W83667HG and W83667HG-B it is set to "w83667hg", for NCT6775F it the top of this file)
is set to "nct6775", and for NCT6776F it is set to "nct6776".
pwm[1-4] - this file stores PWM duty cycle or DC value (fan speed) in range: pwm[1-4] - this file stores PWM duty cycle or DC value (fan speed) in range:
0 (stop) to 255 (full) 0 (stop) to 255 (full)
......
...@@ -335,6 +335,7 @@ config SENSORS_I5K_AMB ...@@ -335,6 +335,7 @@ config SENSORS_I5K_AMB
config SENSORS_F71805F config SENSORS_F71805F
tristate "Fintek F71805F/FG, F71806F/FG and F71872F/FG" tristate "Fintek F71805F/FG, F71806F/FG and F71872F/FG"
depends on !PPC
help help
If you say yes here you get support for hardware monitoring If you say yes here you get support for hardware monitoring
features of the Fintek F71805F/FG, F71806F/FG and F71872F/FG features of the Fintek F71805F/FG, F71806F/FG and F71872F/FG
...@@ -345,6 +346,7 @@ config SENSORS_F71805F ...@@ -345,6 +346,7 @@ config SENSORS_F71805F
config SENSORS_F71882FG config SENSORS_F71882FG
tristate "Fintek F71882FG and compatibles" tristate "Fintek F71882FG and compatibles"
depends on !PPC
help help
If you say yes here you get support for hardware monitoring If you say yes here you get support for hardware monitoring
features of many Fintek Super-I/O (LPC) chips. The currently features of many Fintek Super-I/O (LPC) chips. The currently
...@@ -468,6 +470,7 @@ config SENSORS_IBMPEX ...@@ -468,6 +470,7 @@ config SENSORS_IBMPEX
config SENSORS_IT87 config SENSORS_IT87
tristate "ITE IT87xx and compatibles" tristate "ITE IT87xx and compatibles"
depends on !PPC
select HWMON_VID select HWMON_VID
help help
If you say yes here you get support for ITE IT8705F, IT8712F, If you say yes here you get support for ITE IT8705F, IT8712F,
...@@ -824,6 +827,7 @@ config SENSORS_NTC_THERMISTOR ...@@ -824,6 +827,7 @@ config SENSORS_NTC_THERMISTOR
config SENSORS_PC87360 config SENSORS_PC87360
tristate "National Semiconductor PC87360 family" tristate "National Semiconductor PC87360 family"
depends on !PPC
select HWMON_VID select HWMON_VID
help help
If you say yes here you get access to the hardware monitoring If you say yes here you get access to the hardware monitoring
...@@ -837,6 +841,7 @@ config SENSORS_PC87360 ...@@ -837,6 +841,7 @@ config SENSORS_PC87360
config SENSORS_PC87427 config SENSORS_PC87427
tristate "National Semiconductor PC87427" tristate "National Semiconductor PC87427"
depends on !PPC
help help
If you say yes here you get access to the hardware monitoring If you say yes here you get access to the hardware monitoring
functions of the National Semiconductor PC87427 Super-I/O chip. functions of the National Semiconductor PC87427 Super-I/O chip.
...@@ -928,7 +933,7 @@ config SENSORS_SMM665 ...@@ -928,7 +933,7 @@ config SENSORS_SMM665
config SENSORS_DME1737 config SENSORS_DME1737
tristate "SMSC DME1737, SCH311x and compatibles" tristate "SMSC DME1737, SCH311x and compatibles"
depends on I2C && EXPERIMENTAL depends on I2C && EXPERIMENTAL && !PPC
select HWMON_VID select HWMON_VID
help help
If you say yes here you get support for the hardware monitoring If you say yes here you get support for the hardware monitoring
...@@ -970,6 +975,7 @@ config SENSORS_EMC6W201 ...@@ -970,6 +975,7 @@ config SENSORS_EMC6W201
config SENSORS_SMSC47M1 config SENSORS_SMSC47M1
tristate "SMSC LPC47M10x and compatibles" tristate "SMSC LPC47M10x and compatibles"
depends on !PPC
help help
If you say yes here you get support for the integrated fan If you say yes here you get support for the integrated fan
monitoring and control capabilities of the SMSC LPC47B27x, monitoring and control capabilities of the SMSC LPC47B27x,
...@@ -1003,7 +1009,7 @@ config SENSORS_SMSC47M192 ...@@ -1003,7 +1009,7 @@ config SENSORS_SMSC47M192
config SENSORS_SMSC47B397 config SENSORS_SMSC47B397
tristate "SMSC LPC47B397-NC" tristate "SMSC LPC47B397-NC"
depends on EXPERIMENTAL depends on EXPERIMENTAL && !PPC
help help
If you say yes here you get support for the SMSC LPC47B397-NC If you say yes here you get support for the SMSC LPC47B397-NC
sensor chip. sensor chip.
...@@ -1017,6 +1023,7 @@ config SENSORS_SCH56XX_COMMON ...@@ -1017,6 +1023,7 @@ config SENSORS_SCH56XX_COMMON
config SENSORS_SCH5627 config SENSORS_SCH5627
tristate "SMSC SCH5627" tristate "SMSC SCH5627"
depends on !PPC
select SENSORS_SCH56XX_COMMON select SENSORS_SCH56XX_COMMON
help help
If you say yes here you get support for the hardware monitoring If you say yes here you get support for the hardware monitoring
...@@ -1027,6 +1034,7 @@ config SENSORS_SCH5627 ...@@ -1027,6 +1034,7 @@ config SENSORS_SCH5627
config SENSORS_SCH5636 config SENSORS_SCH5636
tristate "SMSC SCH5636" tristate "SMSC SCH5636"
depends on !PPC
select SENSORS_SCH56XX_COMMON select SENSORS_SCH56XX_COMMON
help help
SMSC SCH5636 Super I/O chips include an embedded microcontroller for SMSC SCH5636 Super I/O chips include an embedded microcontroller for
...@@ -1150,6 +1158,7 @@ config SENSORS_VIA686A ...@@ -1150,6 +1158,7 @@ config SENSORS_VIA686A
config SENSORS_VT1211 config SENSORS_VT1211
tristate "VIA VT1211" tristate "VIA VT1211"
depends on !PPC
select HWMON_VID select HWMON_VID
help help
If you say yes here then you get support for hardware monitoring If you say yes here then you get support for hardware monitoring
...@@ -1262,6 +1271,7 @@ config SENSORS_W83L786NG ...@@ -1262,6 +1271,7 @@ config SENSORS_W83L786NG
config SENSORS_W83627HF config SENSORS_W83627HF
tristate "Winbond W83627HF, W83627THF, W83637HF, W83687THF, W83697HF" tristate "Winbond W83627HF, W83627THF, W83637HF, W83687THF, W83697HF"
depends on !PPC
select HWMON_VID select HWMON_VID
help help
If you say yes here you get support for the Winbond W836X7 series If you say yes here you get support for the Winbond W836X7 series
...@@ -1272,7 +1282,8 @@ config SENSORS_W83627HF ...@@ -1272,7 +1282,8 @@ config SENSORS_W83627HF
will be called w83627hf. will be called w83627hf.
config SENSORS_W83627EHF config SENSORS_W83627EHF
tristate "Winbond W83627EHF/EHG/DHG, W83667HG, NCT6775F, NCT6776F" tristate "Winbond W83627EHF/EHG/DHG/UHG, W83667HG, NCT6775F, NCT6776F"
depends on !PPC
select HWMON_VID select HWMON_VID
help help
If you say yes here you get support for the hardware If you say yes here you get support for the hardware
...@@ -1281,7 +1292,8 @@ config SENSORS_W83627EHF ...@@ -1281,7 +1292,8 @@ config SENSORS_W83627EHF
This driver also supports the W83627EHG, which is the lead-free This driver also supports the W83627EHG, which is the lead-free
version of the W83627EHF, and the W83627DHG, which is a similar version of the W83627EHF, and the W83627DHG, which is a similar
chip suited for specific Intel processors that use PECI such as chip suited for specific Intel processors that use PECI such as
the Core 2 Duo. the Core 2 Duo. And also the W83627UHG, which is a stripped down
version of the W83627DHG (as far as hardware monitoring goes.)
This driver also supports Nuvoton W83667HG, W83667HG-B, NCT6775F This driver also supports Nuvoton W83667HG, W83667HG-B, NCT6775F
(also known as W83667HG-I), and NCT6776F. (also known as W83667HG-I), and NCT6776F.
......
...@@ -58,10 +58,9 @@ static inline int ad7414_temp_from_reg(s16 reg) ...@@ -58,10 +58,9 @@ static inline int ad7414_temp_from_reg(s16 reg)
static inline int ad7414_read(struct i2c_client *client, u8 reg) static inline int ad7414_read(struct i2c_client *client, u8 reg)
{ {
if (reg == AD7414_REG_TEMP) { if (reg == AD7414_REG_TEMP)
int value = i2c_smbus_read_word_data(client, reg); return i2c_smbus_read_word_swapped(client, reg);
return (value < 0) ? value : swab16(value); else
} else
return i2c_smbus_read_byte_data(client, reg); return i2c_smbus_read_byte_data(client, reg);
} }
......
...@@ -76,20 +76,6 @@ static struct i2c_driver ad7418_driver = { ...@@ -76,20 +76,6 @@ static struct i2c_driver ad7418_driver = {
.id_table = ad7418_id, .id_table = ad7418_id,
}; };
/* All registers are word-sized, except for the configuration registers.
* AD7418 uses a high-byte first convention. Do NOT use those functions to
* access the configuration registers CONF and CONF2, as they are byte-sized.
*/
static inline int ad7418_read(struct i2c_client *client, u8 reg)
{
return swab16(i2c_smbus_read_word_data(client, reg));
}
static inline int ad7418_write(struct i2c_client *client, u8 reg, u16 value)
{
return i2c_smbus_write_word_data(client, reg, swab16(value));
}
static void ad7418_init_client(struct i2c_client *client) static void ad7418_init_client(struct i2c_client *client)
{ {
struct ad7418_data *data = i2c_get_clientdata(client); struct ad7418_data *data = i2c_get_clientdata(client);
...@@ -128,7 +114,9 @@ static struct ad7418_data *ad7418_update_device(struct device *dev) ...@@ -128,7 +114,9 @@ static struct ad7418_data *ad7418_update_device(struct device *dev)
udelay(30); udelay(30);
for (i = 0; i < 3; i++) { for (i = 0; i < 3; i++) {
data->temp[i] = ad7418_read(client, AD7418_REG_TEMP[i]); data->temp[i] =
i2c_smbus_read_word_swapped(client,
AD7418_REG_TEMP[i]);
} }
for (i = 0, ch = 4; i < data->adc_max; i++, ch--) { for (i = 0, ch = 4; i < data->adc_max; i++, ch--) {
...@@ -138,11 +126,12 @@ static struct ad7418_data *ad7418_update_device(struct device *dev) ...@@ -138,11 +126,12 @@ static struct ad7418_data *ad7418_update_device(struct device *dev)
udelay(15); udelay(15);
data->in[data->adc_max - 1 - i] = data->in[data->adc_max - 1 - i] =
ad7418_read(client, AD7418_REG_ADC); i2c_smbus_read_word_swapped(client,
AD7418_REG_ADC);
} }
/* restore old configuration value */ /* restore old configuration value */
ad7418_write(client, AD7418_REG_CONF, cfg); i2c_smbus_write_word_swapped(client, AD7418_REG_CONF, cfg);
data->last_updated = jiffies; data->last_updated = jiffies;
data->valid = 1; data->valid = 1;
...@@ -182,7 +171,9 @@ static ssize_t set_temp(struct device *dev, struct device_attribute *devattr, ...@@ -182,7 +171,9 @@ static ssize_t set_temp(struct device *dev, struct device_attribute *devattr,
mutex_lock(&data->lock); mutex_lock(&data->lock);
data->temp[attr->index] = LM75_TEMP_TO_REG(temp); data->temp[attr->index] = LM75_TEMP_TO_REG(temp);
ad7418_write(client, AD7418_REG_TEMP[attr->index], data->temp[attr->index]); i2c_smbus_write_word_swapped(client,
AD7418_REG_TEMP[attr->index],
data->temp[attr->index]);
mutex_unlock(&data->lock); mutex_unlock(&data->lock);
return count; return count;
} }
......
...@@ -59,19 +59,6 @@ struct ads1015_data { ...@@ -59,19 +59,6 @@ struct ads1015_data {
struct ads1015_channel_data channel_data[ADS1015_CHANNELS]; struct ads1015_channel_data channel_data[ADS1015_CHANNELS];
}; };
static s32 ads1015_read_reg(struct i2c_client *client, unsigned int reg)
{
s32 data = i2c_smbus_read_word_data(client, reg);
return (data < 0) ? data : swab16(data);
}
static s32 ads1015_write_reg(struct i2c_client *client, unsigned int reg,
u16 val)
{
return i2c_smbus_write_word_data(client, reg, swab16(val));
}
static int ads1015_read_value(struct i2c_client *client, unsigned int channel, static int ads1015_read_value(struct i2c_client *client, unsigned int channel,
int *value) int *value)
{ {
...@@ -87,7 +74,7 @@ static int ads1015_read_value(struct i2c_client *client, unsigned int channel, ...@@ -87,7 +74,7 @@ static int ads1015_read_value(struct i2c_client *client, unsigned int channel,
mutex_lock(&data->update_lock); mutex_lock(&data->update_lock);
/* get channel parameters */ /* get channel parameters */
res = ads1015_read_reg(client, ADS1015_CONFIG); res = i2c_smbus_read_word_swapped(client, ADS1015_CONFIG);
if (res < 0) if (res < 0)
goto err_unlock; goto err_unlock;
config = res; config = res;
...@@ -101,13 +88,13 @@ static int ads1015_read_value(struct i2c_client *client, unsigned int channel, ...@@ -101,13 +88,13 @@ static int ads1015_read_value(struct i2c_client *client, unsigned int channel,
config |= (pga & 0x0007) << 9; config |= (pga & 0x0007) << 9;
config |= (data_rate & 0x0007) << 5; config |= (data_rate & 0x0007) << 5;
res = ads1015_write_reg(client, ADS1015_CONFIG, config); res = i2c_smbus_write_word_swapped(client, ADS1015_CONFIG, config);
if (res < 0) if (res < 0)
goto err_unlock; goto err_unlock;
/* wait until conversion finished */ /* wait until conversion finished */
msleep(conversion_time_ms); msleep(conversion_time_ms);
res = ads1015_read_reg(client, ADS1015_CONFIG); res = i2c_smbus_read_word_swapped(client, ADS1015_CONFIG);
if (res < 0) if (res < 0)
goto err_unlock; goto err_unlock;
config = res; config = res;
...@@ -117,7 +104,7 @@ static int ads1015_read_value(struct i2c_client *client, unsigned int channel, ...@@ -117,7 +104,7 @@ static int ads1015_read_value(struct i2c_client *client, unsigned int channel,
goto err_unlock; goto err_unlock;
} }
res = ads1015_read_reg(client, ADS1015_CONVERSION); res = i2c_smbus_read_word_swapped(client, ADS1015_CONVERSION);
if (res < 0) if (res < 0)
goto err_unlock; goto err_unlock;
conversion = res; conversion = res;
......
...@@ -74,13 +74,6 @@ static int ads7828_detect(struct i2c_client *client, ...@@ -74,13 +74,6 @@ static int ads7828_detect(struct i2c_client *client,
static int ads7828_probe(struct i2c_client *client, static int ads7828_probe(struct i2c_client *client,
const struct i2c_device_id *id); const struct i2c_device_id *id);
/* The ADS7828 returns the 12-bit sample in two bytes,
these are read as a word then byte-swapped */
static u16 ads7828_read_value(struct i2c_client *client, u8 reg)
{
return swab16(i2c_smbus_read_word_data(client, reg));
}
static inline u8 channel_cmd_byte(int ch) static inline u8 channel_cmd_byte(int ch)
{ {
/* cmd byte C2,C1,C0 - see datasheet */ /* cmd byte C2,C1,C0 - see datasheet */
...@@ -104,7 +97,8 @@ static struct ads7828_data *ads7828_update_device(struct device *dev) ...@@ -104,7 +97,8 @@ static struct ads7828_data *ads7828_update_device(struct device *dev)
for (ch = 0; ch < ADS7828_NCH; ch++) { for (ch = 0; ch < ADS7828_NCH; ch++) {
u8 cmd = channel_cmd_byte(ch); u8 cmd = channel_cmd_byte(ch);
data->adc_input[ch] = ads7828_read_value(client, cmd); data->adc_input[ch] =
i2c_smbus_read_word_swapped(client, cmd);
} }
data->last_updated = jiffies; data->last_updated = jiffies;
data->valid = 1; data->valid = 1;
...@@ -203,7 +197,7 @@ static int ads7828_detect(struct i2c_client *client, ...@@ -203,7 +197,7 @@ static int ads7828_detect(struct i2c_client *client,
for (ch = 0; ch < ADS7828_NCH; ch++) { for (ch = 0; ch < ADS7828_NCH; ch++) {
u16 in_data; u16 in_data;
u8 cmd = channel_cmd_byte(ch); u8 cmd = channel_cmd_byte(ch);
in_data = ads7828_read_value(client, cmd); in_data = i2c_smbus_read_word_swapped(client, cmd);
if (in_data & 0xF000) { if (in_data & 0xF000) {
pr_debug("%s : Doesn't look like an ads7828 device\n", pr_debug("%s : Doesn't look like an ads7828 device\n",
__func__); __func__);
......
...@@ -829,17 +829,17 @@ static int asb100_read_value(struct i2c_client *client, u16 reg) ...@@ -829,17 +829,17 @@ static int asb100_read_value(struct i2c_client *client, u16 reg)
/* 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 */
res = swab16(i2c_smbus_read_word_data(cl, 0)); res = i2c_smbus_read_word_swapped(cl, 0);
break; break;
case 0x52: /* CONFIG */ case 0x52: /* CONFIG */
res = i2c_smbus_read_byte_data(cl, 1); res = i2c_smbus_read_byte_data(cl, 1);
break; break;
case 0x53: /* HYST */ case 0x53: /* HYST */
res = swab16(i2c_smbus_read_word_data(cl, 2)); res = i2c_smbus_read_word_swapped(cl, 2);
break; break;
case 0x55: /* MAX */ case 0x55: /* MAX */
default: default:
res = swab16(i2c_smbus_read_word_data(cl, 3)); res = i2c_smbus_read_word_swapped(cl, 3);
break; break;
} }
} }
...@@ -877,10 +877,10 @@ static void asb100_write_value(struct i2c_client *client, u16 reg, u16 value) ...@@ -877,10 +877,10 @@ static void asb100_write_value(struct i2c_client *client, u16 reg, u16 value)
i2c_smbus_write_byte_data(cl, 1, value & 0xff); i2c_smbus_write_byte_data(cl, 1, value & 0xff);
break; break;
case 0x53: /* HYST */ case 0x53: /* HYST */
i2c_smbus_write_word_data(cl, 2, swab16(value)); i2c_smbus_write_word_swapped(cl, 2, value);
break; break;
case 0x55: /* MAX */ case 0x55: /* MAX */
i2c_smbus_write_word_data(cl, 3, swab16(value)); i2c_smbus_write_word_swapped(cl, 3, value);
break; break;
} }
} }
......
...@@ -80,24 +80,6 @@ struct ds1621_data { ...@@ -80,24 +80,6 @@ struct ds1621_data {
u8 conf; /* Register encoding, combined */ u8 conf; /* Register encoding, combined */
}; };
/* Temperature registers are word-sized.
DS1621 uses a high-byte first convention, which is exactly opposite to
the SMBus standard. */
static int ds1621_read_temp(struct i2c_client *client, u8 reg)
{
int ret;
ret = i2c_smbus_read_word_data(client, reg);
if (ret < 0)
return ret;
return swab16(ret);
}
static int ds1621_write_temp(struct i2c_client *client, u8 reg, u16 value)
{
return i2c_smbus_write_word_data(client, reg, swab16(value));
}
static void ds1621_init_client(struct i2c_client *client) static void ds1621_init_client(struct i2c_client *client)
{ {
u8 conf, new_conf; u8 conf, new_conf;
...@@ -136,7 +118,7 @@ static struct ds1621_data *ds1621_update_client(struct device *dev) ...@@ -136,7 +118,7 @@ static struct ds1621_data *ds1621_update_client(struct device *dev)
data->conf = i2c_smbus_read_byte_data(client, DS1621_REG_CONF); data->conf = i2c_smbus_read_byte_data(client, DS1621_REG_CONF);
for (i = 0; i < ARRAY_SIZE(data->temp); i++) for (i = 0; i < ARRAY_SIZE(data->temp); i++)
data->temp[i] = ds1621_read_temp(client, data->temp[i] = i2c_smbus_read_word_swapped(client,
DS1621_REG_TEMP[i]); DS1621_REG_TEMP[i]);
/* reset alarms if necessary */ /* reset alarms if necessary */
...@@ -177,7 +159,7 @@ static ssize_t set_temp(struct device *dev, struct device_attribute *da, ...@@ -177,7 +159,7 @@ static ssize_t set_temp(struct device *dev, struct device_attribute *da,
mutex_lock(&data->update_lock); mutex_lock(&data->update_lock);
data->temp[attr->index] = val; data->temp[attr->index] = val;
ds1621_write_temp(client, DS1621_REG_TEMP[attr->index], i2c_smbus_write_word_swapped(client, DS1621_REG_TEMP[attr->index],
data->temp[attr->index]); data->temp[attr->index]);
mutex_unlock(&data->update_lock); mutex_unlock(&data->update_lock);
return count; return count;
......
...@@ -75,33 +75,13 @@ struct ds620_data { ...@@ -75,33 +75,13 @@ struct ds620_data {
s16 temp[3]; /* Register values, word */ s16 temp[3]; /* Register values, word */
}; };
/*
* Temperature registers are word-sized.
* DS620 uses a high-byte first convention, which is exactly opposite to
* the SMBus standard.
*/
static int ds620_read_temp(struct i2c_client *client, u8 reg)
{
int ret;
ret = i2c_smbus_read_word_data(client, reg);
if (ret < 0)
return ret;
return swab16(ret);
}
static int ds620_write_temp(struct i2c_client *client, u8 reg, u16 value)
{
return i2c_smbus_write_word_data(client, reg, swab16(value));
}
static void ds620_init_client(struct i2c_client *client) static void ds620_init_client(struct i2c_client *client)
{ {
struct ds620_platform_data *ds620_info = client->dev.platform_data; struct ds620_platform_data *ds620_info = client->dev.platform_data;
u16 conf, new_conf; u16 conf, new_conf;
new_conf = conf = new_conf = conf =
swab16(i2c_smbus_read_word_data(client, DS620_REG_CONF)); i2c_smbus_read_word_swapped(client, DS620_REG_CONF);
/* switch to continuous conversion mode */ /* switch to continuous conversion mode */
new_conf &= ~DS620_REG_CONFIG_1SHOT; new_conf &= ~DS620_REG_CONFIG_1SHOT;
...@@ -118,8 +98,7 @@ static void ds620_init_client(struct i2c_client *client) ...@@ -118,8 +98,7 @@ static void ds620_init_client(struct i2c_client *client)
new_conf |= DS620_REG_CONFIG_R1 | DS620_REG_CONFIG_R0; new_conf |= DS620_REG_CONFIG_R1 | DS620_REG_CONFIG_R0;
if (conf != new_conf) if (conf != new_conf)
i2c_smbus_write_word_data(client, DS620_REG_CONF, i2c_smbus_write_word_swapped(client, DS620_REG_CONF, new_conf);
swab16(new_conf));
/* start conversion */ /* start conversion */
i2c_smbus_write_byte(client, DS620_COM_START); i2c_smbus_write_byte(client, DS620_COM_START);
...@@ -141,7 +120,7 @@ static struct ds620_data *ds620_update_client(struct device *dev) ...@@ -141,7 +120,7 @@ static struct ds620_data *ds620_update_client(struct device *dev)
dev_dbg(&client->dev, "Starting ds620 update\n"); dev_dbg(&client->dev, "Starting ds620 update\n");
for (i = 0; i < ARRAY_SIZE(data->temp); i++) { for (i = 0; i < ARRAY_SIZE(data->temp); i++) {
res = ds620_read_temp(client, res = i2c_smbus_read_word_swapped(client,
DS620_REG_TEMP[i]); DS620_REG_TEMP[i]);
if (res < 0) { if (res < 0) {
ret = ERR_PTR(res); ret = ERR_PTR(res);
...@@ -191,7 +170,7 @@ static ssize_t set_temp(struct device *dev, struct device_attribute *da, ...@@ -191,7 +170,7 @@ static ssize_t set_temp(struct device *dev, struct device_attribute *da,
mutex_lock(&data->update_lock); mutex_lock(&data->update_lock);
data->temp[attr->index] = val; data->temp[attr->index] = val;
ds620_write_temp(client, DS620_REG_TEMP[attr->index], i2c_smbus_write_word_swapped(client, DS620_REG_TEMP[attr->index],
data->temp[attr->index]); data->temp[attr->index]);
mutex_unlock(&data->update_lock); mutex_unlock(&data->update_lock);
return count; return count;
...@@ -210,16 +189,15 @@ static ssize_t show_alarm(struct device *dev, struct device_attribute *da, ...@@ -210,16 +189,15 @@ static ssize_t show_alarm(struct device *dev, struct device_attribute *da,
return PTR_ERR(data); return PTR_ERR(data);
/* reset alarms if necessary */ /* reset alarms if necessary */
res = i2c_smbus_read_word_data(client, DS620_REG_CONF); res = i2c_smbus_read_word_swapped(client, DS620_REG_CONF);
if (res < 0) if (res < 0)
return res; return res;
conf = swab16(res); new_conf = conf = res;
new_conf = conf;
new_conf &= ~attr->index; new_conf &= ~attr->index;
if (conf != new_conf) { if (conf != new_conf) {
res = i2c_smbus_write_word_data(client, DS620_REG_CONF, res = i2c_smbus_write_word_swapped(client, DS620_REG_CONF,
swab16(new_conf)); new_conf);
if (res < 0) if (res < 0)
return res; return res;
} }
......
...@@ -591,7 +591,7 @@ static int gl518_remove(struct i2c_client *client) ...@@ -591,7 +591,7 @@ static int gl518_remove(struct i2c_client *client)
static int gl518_read_value(struct i2c_client *client, u8 reg) static int gl518_read_value(struct i2c_client *client, u8 reg)
{ {
if ((reg >= 0x07) && (reg <= 0x0c)) if ((reg >= 0x07) && (reg <= 0x0c))
return swab16(i2c_smbus_read_word_data(client, reg)); return i2c_smbus_read_word_swapped(client, reg);
else else
return i2c_smbus_read_byte_data(client, reg); return i2c_smbus_read_byte_data(client, reg);
} }
...@@ -599,7 +599,7 @@ static int gl518_read_value(struct i2c_client *client, u8 reg) ...@@ -599,7 +599,7 @@ static int gl518_read_value(struct i2c_client *client, u8 reg)
static int gl518_write_value(struct i2c_client *client, u8 reg, u16 value) static int gl518_write_value(struct i2c_client *client, u8 reg, u16 value)
{ {
if ((reg >= 0x07) && (reg <= 0x0c)) if ((reg >= 0x07) && (reg <= 0x0c))
return i2c_smbus_write_word_data(client, reg, swab16(value)); return i2c_smbus_write_word_swapped(client, reg, value);
else else
return i2c_smbus_write_byte_data(client, reg, value); return i2c_smbus_write_byte_data(client, reg, value);
} }
......
...@@ -821,7 +821,7 @@ static int gl520_remove(struct i2c_client *client) ...@@ -821,7 +821,7 @@ static int gl520_remove(struct i2c_client *client)
static int gl520_read_value(struct i2c_client *client, u8 reg) static int gl520_read_value(struct i2c_client *client, u8 reg)
{ {
if ((reg >= 0x07) && (reg <= 0x0c)) if ((reg >= 0x07) && (reg <= 0x0c))
return swab16(i2c_smbus_read_word_data(client, reg)); return i2c_smbus_read_word_swapped(client, reg);
else else
return i2c_smbus_read_byte_data(client, reg); return i2c_smbus_read_byte_data(client, reg);
} }
...@@ -829,7 +829,7 @@ static int gl520_read_value(struct i2c_client *client, u8 reg) ...@@ -829,7 +829,7 @@ static int gl520_read_value(struct i2c_client *client, u8 reg)
static int gl520_write_value(struct i2c_client *client, u8 reg, u16 value) static int gl520_write_value(struct i2c_client *client, u8 reg, u16 value)
{ {
if ((reg >= 0x07) && (reg <= 0x0c)) if ((reg >= 0x07) && (reg <= 0x0c))
return i2c_smbus_write_word_data(client, reg, swab16(value)); return i2c_smbus_write_word_swapped(client, reg, value);
else else
return i2c_smbus_write_byte_data(client, reg, value); return i2c_smbus_write_byte_data(client, reg, value);
} }
......
...@@ -147,8 +147,9 @@ struct aem_data { ...@@ -147,8 +147,9 @@ struct aem_data {
int id; int id;
struct aem_ipmi_data ipmi; struct aem_ipmi_data ipmi;
/* Function to update sensors */ /* Function and buffer to update sensors */
void (*update)(struct aem_data *data); void (*update)(struct aem_data *data);
struct aem_read_sensor_resp *rs_resp;
/* /*
* AEM 1.x sensors: * AEM 1.x sensors:
...@@ -245,8 +246,6 @@ static void aem_bmc_gone(int iface); ...@@ -245,8 +246,6 @@ static void aem_bmc_gone(int iface);
static void aem_msg_handler(struct ipmi_recv_msg *msg, void *user_msg_data); static void aem_msg_handler(struct ipmi_recv_msg *msg, void *user_msg_data);
static void aem_remove_sensors(struct aem_data *data); static void aem_remove_sensors(struct aem_data *data);
static int aem_init_aem1(struct aem_ipmi_data *probe);
static int aem_init_aem2(struct aem_ipmi_data *probe);
static int aem1_find_sensors(struct aem_data *data); static int aem1_find_sensors(struct aem_data *data);
static int aem2_find_sensors(struct aem_data *data); static int aem2_find_sensors(struct aem_data *data);
static void update_aem1_sensors(struct aem_data *data); static void update_aem1_sensors(struct aem_data *data);
...@@ -357,13 +356,14 @@ static void aem_msg_handler(struct ipmi_recv_msg *msg, void *user_msg_data) ...@@ -357,13 +356,14 @@ static void aem_msg_handler(struct ipmi_recv_msg *msg, void *user_msg_data)
/* Sensor support functions */ /* Sensor support functions */
/* Read a sensor value */ /* Read a sensor value; must be called with data->lock held */
static int aem_read_sensor(struct aem_data *data, u8 elt, u8 reg, static int aem_read_sensor(struct aem_data *data, u8 elt, u8 reg,
void *buf, size_t size) void *buf, size_t size)
{ {
int rs_size, res; int rs_size, res;
struct aem_read_sensor_req rs_req; struct aem_read_sensor_req rs_req;
struct aem_read_sensor_resp *rs_resp; /* Use preallocated rx buffer */
struct aem_read_sensor_resp *rs_resp = data->rs_resp;
struct aem_ipmi_data *ipmi = &data->ipmi; struct aem_ipmi_data *ipmi = &data->ipmi;
/* AEM registers are 1, 2, 4 or 8 bytes */ /* AEM registers are 1, 2, 4 or 8 bytes */
...@@ -389,10 +389,6 @@ static int aem_read_sensor(struct aem_data *data, u8 elt, u8 reg, ...@@ -389,10 +389,6 @@ static int aem_read_sensor(struct aem_data *data, u8 elt, u8 reg,
ipmi->tx_message.data_len = sizeof(rs_req); ipmi->tx_message.data_len = sizeof(rs_req);
rs_size = sizeof(*rs_resp) + size; rs_size = sizeof(*rs_resp) + size;
rs_resp = kzalloc(rs_size, GFP_KERNEL);
if (!rs_resp)
return -ENOMEM;
ipmi->rx_msg_data = rs_resp; ipmi->rx_msg_data = rs_resp;
ipmi->rx_msg_len = rs_size; ipmi->rx_msg_len = rs_size;
...@@ -435,7 +431,6 @@ static int aem_read_sensor(struct aem_data *data, u8 elt, u8 reg, ...@@ -435,7 +431,6 @@ static int aem_read_sensor(struct aem_data *data, u8 elt, u8 reg,
res = 0; res = 0;
out: out:
kfree(rs_resp);
return res; return res;
} }
...@@ -493,6 +488,7 @@ static void aem_delete(struct aem_data *data) ...@@ -493,6 +488,7 @@ static void aem_delete(struct aem_data *data)
{ {
list_del(&data->list); list_del(&data->list);
aem_remove_sensors(data); aem_remove_sensors(data);
kfree(data->rs_resp);
hwmon_device_unregister(data->hwmon_dev); hwmon_device_unregister(data->hwmon_dev);
ipmi_destroy_user(data->ipmi.user); ipmi_destroy_user(data->ipmi.user);
platform_set_drvdata(data->pdev, NULL); platform_set_drvdata(data->pdev, NULL);
...@@ -570,24 +566,31 @@ static int aem_init_aem1_inst(struct aem_ipmi_data *probe, u8 module_handle) ...@@ -570,24 +566,31 @@ static int aem_init_aem1_inst(struct aem_ipmi_data *probe, u8 module_handle)
platform_set_drvdata(data->pdev, data); platform_set_drvdata(data->pdev, data);
/* Set up IPMI interface */ /* Set up IPMI interface */
if (aem_init_ipmi_data(&data->ipmi, probe->interface, res = aem_init_ipmi_data(&data->ipmi, probe->interface,
probe->bmc_device)) probe->bmc_device);
if (res)
goto ipmi_err; goto ipmi_err;
/* Register with hwmon */ /* Register with hwmon */
data->hwmon_dev = hwmon_device_register(&data->pdev->dev); data->hwmon_dev = hwmon_device_register(&data->pdev->dev);
if (IS_ERR(data->hwmon_dev)) { if (IS_ERR(data->hwmon_dev)) {
dev_err(&data->pdev->dev, "Unable to register hwmon " dev_err(&data->pdev->dev, "Unable to register hwmon "
"device for IPMI interface %d\n", "device for IPMI interface %d\n",
probe->interface); probe->interface);
res = PTR_ERR(data->hwmon_dev);
goto hwmon_reg_err; goto hwmon_reg_err;
} }
data->update = update_aem1_sensors; data->update = update_aem1_sensors;
data->rs_resp = kzalloc(sizeof(*(data->rs_resp)) + 8, GFP_KERNEL);
if (!data->rs_resp) {
res = -ENOMEM;
goto alloc_resp_err;
}
/* Find sensors */ /* Find sensors */
if (aem1_find_sensors(data)) res = aem1_find_sensors(data);
if (res)
goto sensor_err; goto sensor_err;
/* Add to our list of AEM devices */ /* Add to our list of AEM devices */
...@@ -599,6 +602,8 @@ static int aem_init_aem1_inst(struct aem_ipmi_data *probe, u8 module_handle) ...@@ -599,6 +602,8 @@ static int aem_init_aem1_inst(struct aem_ipmi_data *probe, u8 module_handle)
return 0; return 0;
sensor_err: sensor_err:
kfree(data->rs_resp);
alloc_resp_err:
hwmon_device_unregister(data->hwmon_dev); hwmon_device_unregister(data->hwmon_dev);
hwmon_reg_err: hwmon_reg_err:
ipmi_destroy_user(data->ipmi.user); ipmi_destroy_user(data->ipmi.user);
...@@ -614,7 +619,7 @@ static int aem_init_aem1_inst(struct aem_ipmi_data *probe, u8 module_handle) ...@@ -614,7 +619,7 @@ static int aem_init_aem1_inst(struct aem_ipmi_data *probe, u8 module_handle)
} }
/* Find and initialize all AEM1 instances */ /* Find and initialize all AEM1 instances */
static int aem_init_aem1(struct aem_ipmi_data *probe) static void aem_init_aem1(struct aem_ipmi_data *probe)
{ {
int num, i, err; int num, i, err;
...@@ -625,11 +630,8 @@ static int aem_init_aem1(struct aem_ipmi_data *probe) ...@@ -625,11 +630,8 @@ static int aem_init_aem1(struct aem_ipmi_data *probe)
dev_err(probe->bmc_device, dev_err(probe->bmc_device,
"Error %d initializing AEM1 0x%X\n", "Error %d initializing AEM1 0x%X\n",
err, i); err, i);
return err;
} }
} }
return 0;
} }
/* Probe functions for AEM2 devices */ /* Probe functions for AEM2 devices */
...@@ -704,24 +706,31 @@ static int aem_init_aem2_inst(struct aem_ipmi_data *probe, ...@@ -704,24 +706,31 @@ static int aem_init_aem2_inst(struct aem_ipmi_data *probe,
platform_set_drvdata(data->pdev, data); platform_set_drvdata(data->pdev, data);
/* Set up IPMI interface */ /* Set up IPMI interface */
if (aem_init_ipmi_data(&data->ipmi, probe->interface, res = aem_init_ipmi_data(&data->ipmi, probe->interface,
probe->bmc_device)) probe->bmc_device);
if (res)
goto ipmi_err; goto ipmi_err;
/* Register with hwmon */ /* Register with hwmon */
data->hwmon_dev = hwmon_device_register(&data->pdev->dev); data->hwmon_dev = hwmon_device_register(&data->pdev->dev);
if (IS_ERR(data->hwmon_dev)) { if (IS_ERR(data->hwmon_dev)) {
dev_err(&data->pdev->dev, "Unable to register hwmon " dev_err(&data->pdev->dev, "Unable to register hwmon "
"device for IPMI interface %d\n", "device for IPMI interface %d\n",
probe->interface); probe->interface);
res = PTR_ERR(data->hwmon_dev);
goto hwmon_reg_err; goto hwmon_reg_err;
} }
data->update = update_aem2_sensors; data->update = update_aem2_sensors;
data->rs_resp = kzalloc(sizeof(*(data->rs_resp)) + 8, GFP_KERNEL);
if (!data->rs_resp) {
res = -ENOMEM;
goto alloc_resp_err;
}
/* Find sensors */ /* Find sensors */
if (aem2_find_sensors(data)) res = aem2_find_sensors(data);
if (res)
goto sensor_err; goto sensor_err;
/* Add to our list of AEM devices */ /* Add to our list of AEM devices */
...@@ -733,6 +742,8 @@ static int aem_init_aem2_inst(struct aem_ipmi_data *probe, ...@@ -733,6 +742,8 @@ static int aem_init_aem2_inst(struct aem_ipmi_data *probe,
return 0; return 0;
sensor_err: sensor_err:
kfree(data->rs_resp);
alloc_resp_err:
hwmon_device_unregister(data->hwmon_dev); hwmon_device_unregister(data->hwmon_dev);
hwmon_reg_err: hwmon_reg_err:
ipmi_destroy_user(data->ipmi.user); ipmi_destroy_user(data->ipmi.user);
...@@ -748,7 +759,7 @@ static int aem_init_aem2_inst(struct aem_ipmi_data *probe, ...@@ -748,7 +759,7 @@ static int aem_init_aem2_inst(struct aem_ipmi_data *probe,
} }
/* Find and initialize all AEM2 instances */ /* Find and initialize all AEM2 instances */
static int aem_init_aem2(struct aem_ipmi_data *probe) static void aem_init_aem2(struct aem_ipmi_data *probe)
{ {
struct aem_find_instance_resp fi_resp; struct aem_find_instance_resp fi_resp;
int err; int err;
...@@ -767,12 +778,9 @@ static int aem_init_aem2(struct aem_ipmi_data *probe) ...@@ -767,12 +778,9 @@ static int aem_init_aem2(struct aem_ipmi_data *probe)
dev_err(probe->bmc_device, dev_err(probe->bmc_device,
"Error %d initializing AEM2 0x%X\n", "Error %d initializing AEM2 0x%X\n",
err, fi_resp.module_handle); err, fi_resp.module_handle);
return err;
} }
i++; i++;
} }
return 0;
} }
/* Probe a BMC for AEM firmware instances */ /* Probe a BMC for AEM firmware instances */
......
...@@ -154,8 +154,6 @@ static int jc42_probe(struct i2c_client *client, ...@@ -154,8 +154,6 @@ static int jc42_probe(struct i2c_client *client,
const struct i2c_device_id *id); const struct i2c_device_id *id);
static int jc42_detect(struct i2c_client *client, struct i2c_board_info *info); static int jc42_detect(struct i2c_client *client, struct i2c_board_info *info);
static int jc42_remove(struct i2c_client *client); static int jc42_remove(struct i2c_client *client);
static int jc42_read_value(struct i2c_client *client, u8 reg);
static int jc42_write_value(struct i2c_client *client, u8 reg, u16 value);
static struct jc42_data *jc42_update_device(struct device *dev); static struct jc42_data *jc42_update_device(struct device *dev);
...@@ -187,7 +185,7 @@ static int jc42_suspend(struct device *dev) ...@@ -187,7 +185,7 @@ static int jc42_suspend(struct device *dev)
struct jc42_data *data = i2c_get_clientdata(client); struct jc42_data *data = i2c_get_clientdata(client);
data->config |= JC42_CFG_SHUTDOWN; data->config |= JC42_CFG_SHUTDOWN;
jc42_write_value(client, JC42_REG_CONFIG, data->config); i2c_smbus_write_word_swapped(client, JC42_REG_CONFIG, data->config);
return 0; return 0;
} }
...@@ -197,7 +195,7 @@ static int jc42_resume(struct device *dev) ...@@ -197,7 +195,7 @@ static int jc42_resume(struct device *dev)
struct jc42_data *data = i2c_get_clientdata(client); struct jc42_data *data = i2c_get_clientdata(client);
data->config &= ~JC42_CFG_SHUTDOWN; data->config &= ~JC42_CFG_SHUTDOWN;
jc42_write_value(client, JC42_REG_CONFIG, data->config); i2c_smbus_write_word_swapped(client, JC42_REG_CONFIG, data->config);
return 0; return 0;
} }
...@@ -315,7 +313,7 @@ static ssize_t set_##value(struct device *dev, \ ...@@ -315,7 +313,7 @@ static ssize_t set_##value(struct device *dev, \
return -EINVAL; \ return -EINVAL; \
mutex_lock(&data->update_lock); \ mutex_lock(&data->update_lock); \
data->value = jc42_temp_to_reg(val, data->extended); \ data->value = jc42_temp_to_reg(val, data->extended); \
err = jc42_write_value(client, reg, data->value); \ err = i2c_smbus_write_word_swapped(client, reg, data->value); \
if (err < 0) \ if (err < 0) \
ret = err; \ ret = err; \
mutex_unlock(&data->update_lock); \ mutex_unlock(&data->update_lock); \
...@@ -357,7 +355,8 @@ static ssize_t set_temp_crit_hyst(struct device *dev, ...@@ -357,7 +355,8 @@ static ssize_t set_temp_crit_hyst(struct device *dev,
data->config = (data->config data->config = (data->config
& ~(JC42_CFG_HYST_MASK << JC42_CFG_HYST_SHIFT)) & ~(JC42_CFG_HYST_MASK << JC42_CFG_HYST_SHIFT))
| (hyst << JC42_CFG_HYST_SHIFT); | (hyst << JC42_CFG_HYST_SHIFT);
err = jc42_write_value(client, JC42_REG_CONFIG, data->config); err = i2c_smbus_write_word_swapped(client, JC42_REG_CONFIG,
data->config);
if (err < 0) if (err < 0)
ret = err; ret = err;
mutex_unlock(&data->update_lock); mutex_unlock(&data->update_lock);
...@@ -452,10 +451,10 @@ static int jc42_detect(struct i2c_client *new_client, ...@@ -452,10 +451,10 @@ static int jc42_detect(struct i2c_client *new_client,
I2C_FUNC_SMBUS_WORD_DATA)) I2C_FUNC_SMBUS_WORD_DATA))
return -ENODEV; return -ENODEV;
cap = jc42_read_value(new_client, JC42_REG_CAP); cap = i2c_smbus_read_word_swapped(new_client, JC42_REG_CAP);
config = jc42_read_value(new_client, JC42_REG_CONFIG); config = i2c_smbus_read_word_swapped(new_client, JC42_REG_CONFIG);
manid = jc42_read_value(new_client, JC42_REG_MANID); manid = i2c_smbus_read_word_swapped(new_client, JC42_REG_MANID);
devid = jc42_read_value(new_client, JC42_REG_DEVICEID); devid = i2c_smbus_read_word_swapped(new_client, JC42_REG_DEVICEID);
if (cap < 0 || config < 0 || manid < 0 || devid < 0) if (cap < 0 || config < 0 || manid < 0 || devid < 0)
return -ENODEV; return -ENODEV;
...@@ -489,14 +488,14 @@ static int jc42_probe(struct i2c_client *new_client, ...@@ -489,14 +488,14 @@ static int jc42_probe(struct i2c_client *new_client,
i2c_set_clientdata(new_client, data); i2c_set_clientdata(new_client, data);
mutex_init(&data->update_lock); mutex_init(&data->update_lock);
cap = jc42_read_value(new_client, JC42_REG_CAP); cap = i2c_smbus_read_word_swapped(new_client, JC42_REG_CAP);
if (cap < 0) { if (cap < 0) {
err = -EINVAL; err = -EINVAL;
goto exit_free; goto exit_free;
} }
data->extended = !!(cap & JC42_CAP_RANGE); data->extended = !!(cap & JC42_CAP_RANGE);
config = jc42_read_value(new_client, JC42_REG_CONFIG); config = i2c_smbus_read_word_swapped(new_client, JC42_REG_CONFIG);
if (config < 0) { if (config < 0) {
err = -EINVAL; err = -EINVAL;
goto exit_free; goto exit_free;
...@@ -504,7 +503,8 @@ static int jc42_probe(struct i2c_client *new_client, ...@@ -504,7 +503,8 @@ static int jc42_probe(struct i2c_client *new_client,
data->orig_config = config; data->orig_config = config;
if (config & JC42_CFG_SHUTDOWN) { if (config & JC42_CFG_SHUTDOWN) {
config &= ~JC42_CFG_SHUTDOWN; config &= ~JC42_CFG_SHUTDOWN;
jc42_write_value(new_client, JC42_REG_CONFIG, config); i2c_smbus_write_word_swapped(new_client, JC42_REG_CONFIG,
config);
} }
data->config = config; data->config = config;
...@@ -535,25 +535,12 @@ static int jc42_remove(struct i2c_client *client) ...@@ -535,25 +535,12 @@ static int jc42_remove(struct i2c_client *client)
hwmon_device_unregister(data->hwmon_dev); hwmon_device_unregister(data->hwmon_dev);
sysfs_remove_group(&client->dev.kobj, &jc42_group); sysfs_remove_group(&client->dev.kobj, &jc42_group);
if (data->config != data->orig_config) if (data->config != data->orig_config)
jc42_write_value(client, JC42_REG_CONFIG, data->orig_config); i2c_smbus_write_word_swapped(client, JC42_REG_CONFIG,
data->orig_config);
kfree(data); kfree(data);
return 0; return 0;
} }
/* All registers are word-sized. */
static int jc42_read_value(struct i2c_client *client, u8 reg)
{
int ret = i2c_smbus_read_word_data(client, reg);
if (ret < 0)
return ret;
return swab16(ret);
}
static int jc42_write_value(struct i2c_client *client, u8 reg, u16 value)
{
return i2c_smbus_write_word_data(client, reg, swab16(value));
}
static struct jc42_data *jc42_update_device(struct device *dev) static struct jc42_data *jc42_update_device(struct device *dev)
{ {
struct i2c_client *client = to_i2c_client(dev); struct i2c_client *client = to_i2c_client(dev);
...@@ -564,28 +551,29 @@ static struct jc42_data *jc42_update_device(struct device *dev) ...@@ -564,28 +551,29 @@ static struct jc42_data *jc42_update_device(struct device *dev)
mutex_lock(&data->update_lock); mutex_lock(&data->update_lock);
if (time_after(jiffies, data->last_updated + HZ) || !data->valid) { if (time_after(jiffies, data->last_updated + HZ) || !data->valid) {
val = jc42_read_value(client, JC42_REG_TEMP); val = i2c_smbus_read_word_swapped(client, JC42_REG_TEMP);
if (val < 0) { if (val < 0) {
ret = ERR_PTR(val); ret = ERR_PTR(val);
goto abort; goto abort;
} }
data->temp_input = val; data->temp_input = val;
val = jc42_read_value(client, JC42_REG_TEMP_CRITICAL); val = i2c_smbus_read_word_swapped(client,
JC42_REG_TEMP_CRITICAL);
if (val < 0) { if (val < 0) {
ret = ERR_PTR(val); ret = ERR_PTR(val);
goto abort; goto abort;
} }
data->temp_crit = val; data->temp_crit = val;
val = jc42_read_value(client, JC42_REG_TEMP_LOWER); val = i2c_smbus_read_word_swapped(client, JC42_REG_TEMP_LOWER);
if (val < 0) { if (val < 0) {
ret = ERR_PTR(val); ret = ERR_PTR(val);
goto abort; goto abort;
} }
data->temp_min = val; data->temp_min = val;
val = jc42_read_value(client, JC42_REG_TEMP_UPPER); val = i2c_smbus_read_word_swapped(client, JC42_REG_TEMP_UPPER);
if (val < 0) { if (val < 0) {
ret = ERR_PTR(val); ret = ERR_PTR(val);
goto abort; goto abort;
......
...@@ -34,7 +34,7 @@ static const unsigned short normal_i2c[] = { 0x48, 0x49, 0x4a, 0x4c, ...@@ -34,7 +34,7 @@ static const unsigned short normal_i2c[] = { 0x48, 0x49, 0x4a, 0x4c,
#define LM73_REG_CTRL 0x04 #define LM73_REG_CTRL 0x04
#define LM73_REG_ID 0x07 #define LM73_REG_ID 0x07
#define LM73_ID 0x9001 /* or 0x190 after a swab16() */ #define LM73_ID 0x9001 /* 0x0190, byte-swapped */
#define DRVNAME "lm73" #define DRVNAME "lm73"
#define LM73_TEMP_MIN (-40) #define LM73_TEMP_MIN (-40)
#define LM73_TEMP_MAX 150 #define LM73_TEMP_MAX 150
...@@ -57,7 +57,7 @@ static ssize_t set_temp(struct device *dev, struct device_attribute *da, ...@@ -57,7 +57,7 @@ static ssize_t set_temp(struct device *dev, struct device_attribute *da,
/* Write value */ /* Write value */
value = (short) SENSORS_LIMIT(temp/250, (LM73_TEMP_MIN*4), value = (short) SENSORS_LIMIT(temp/250, (LM73_TEMP_MIN*4),
(LM73_TEMP_MAX*4)) << 5; (LM73_TEMP_MAX*4)) << 5;
i2c_smbus_write_word_data(client, attr->index, swab16(value)); i2c_smbus_write_word_swapped(client, attr->index, value);
return count; return count;
} }
...@@ -68,8 +68,8 @@ static ssize_t show_temp(struct device *dev, struct device_attribute *da, ...@@ -68,8 +68,8 @@ static ssize_t show_temp(struct device *dev, struct device_attribute *da,
struct i2c_client *client = to_i2c_client(dev); struct i2c_client *client = to_i2c_client(dev);
/* use integer division instead of equivalent right shift to /* use integer division instead of equivalent right shift to
guarantee arithmetic shift and preserve the sign */ guarantee arithmetic shift and preserve the sign */
int temp = ((s16) (swab16(i2c_smbus_read_word_data(client, int temp = ((s16) (i2c_smbus_read_word_swapped(client,
attr->index)))*250) / 32; attr->index))*250) / 32;
return sprintf(buf, "%d\n", temp); return sprintf(buf, "%d\n", temp);
} }
...@@ -150,17 +150,31 @@ static int lm73_detect(struct i2c_client *new_client, ...@@ -150,17 +150,31 @@ static int lm73_detect(struct i2c_client *new_client,
struct i2c_board_info *info) struct i2c_board_info *info)
{ {
struct i2c_adapter *adapter = new_client->adapter; struct i2c_adapter *adapter = new_client->adapter;
u16 id; int id, ctrl, conf;
u8 ctrl;
if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA | if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA |
I2C_FUNC_SMBUS_WORD_DATA)) I2C_FUNC_SMBUS_WORD_DATA))
return -ENODEV; return -ENODEV;
/*
* Do as much detection as possible with byte reads first, as word
* reads can confuse other devices.
*/
ctrl = i2c_smbus_read_byte_data(new_client, LM73_REG_CTRL);
if (ctrl < 0 || (ctrl & 0x10))
return -ENODEV;
conf = i2c_smbus_read_byte_data(new_client, LM73_REG_CONF);
if (conf < 0 || (conf & 0x0c))
return -ENODEV;
id = i2c_smbus_read_byte_data(new_client, LM73_REG_ID);
if (id < 0 || id != (LM73_ID & 0xff))
return -ENODEV;
/* Check device ID */ /* Check device ID */
id = i2c_smbus_read_word_data(new_client, LM73_REG_ID); id = i2c_smbus_read_word_data(new_client, LM73_REG_ID);
ctrl = i2c_smbus_read_byte_data(new_client, LM73_REG_CTRL); if (id < 0 || id != LM73_ID)
if ((id != LM73_ID) || (ctrl & 0x10))
return -ENODEV; return -ENODEV;
strlcpy(info->type, "lm73", I2C_NAME_SIZE); strlcpy(info->type, "lm73", I2C_NAME_SIZE);
......
...@@ -384,13 +384,10 @@ static struct i2c_driver lm75_driver = { ...@@ -384,13 +384,10 @@ static struct i2c_driver lm75_driver = {
*/ */
static int lm75_read_value(struct i2c_client *client, u8 reg) static int lm75_read_value(struct i2c_client *client, u8 reg)
{ {
int value;
if (reg == LM75_REG_CONF) if (reg == LM75_REG_CONF)
return i2c_smbus_read_byte_data(client, reg); return i2c_smbus_read_byte_data(client, reg);
else
value = i2c_smbus_read_word_data(client, reg); return i2c_smbus_read_word_swapped(client, reg);
return (value < 0) ? value : swab16(value);
} }
static int lm75_write_value(struct i2c_client *client, u8 reg, u16 value) static int lm75_write_value(struct i2c_client *client, u8 reg, u16 value)
...@@ -398,7 +395,7 @@ static int lm75_write_value(struct i2c_client *client, u8 reg, u16 value) ...@@ -398,7 +395,7 @@ static int lm75_write_value(struct i2c_client *client, u8 reg, u16 value)
if (reg == LM75_REG_CONF) if (reg == LM75_REG_CONF)
return i2c_smbus_write_byte_data(client, reg, value); return i2c_smbus_write_byte_data(client, reg, value);
else else
return i2c_smbus_write_word_data(client, reg, swab16(value)); return i2c_smbus_write_word_swapped(client, reg, value);
} }
static struct lm75_data *lm75_update_device(struct device *dev) static struct lm75_data *lm75_update_device(struct device *dev)
......
...@@ -365,7 +365,7 @@ static u16 lm77_read_value(struct i2c_client *client, u8 reg) ...@@ -365,7 +365,7 @@ static u16 lm77_read_value(struct i2c_client *client, u8 reg)
if (reg == LM77_REG_CONF) if (reg == LM77_REG_CONF)
return i2c_smbus_read_byte_data(client, reg); return i2c_smbus_read_byte_data(client, reg);
else else
return swab16(i2c_smbus_read_word_data(client, reg)); return i2c_smbus_read_word_swapped(client, reg);
} }
static int lm77_write_value(struct i2c_client *client, u8 reg, u16 value) static int lm77_write_value(struct i2c_client *client, u8 reg, u16 value)
...@@ -373,7 +373,7 @@ static int lm77_write_value(struct i2c_client *client, u8 reg, u16 value) ...@@ -373,7 +373,7 @@ static int lm77_write_value(struct i2c_client *client, u8 reg, u16 value)
if (reg == LM77_REG_CONF) if (reg == LM77_REG_CONF)
return i2c_smbus_write_byte_data(client, reg, value); return i2c_smbus_write_byte_data(client, reg, value);
else else
return i2c_smbus_write_word_data(client, reg, swab16(value)); return i2c_smbus_write_word_swapped(client, reg, value);
} }
static void lm77_init_client(struct i2c_client *client) static void lm77_init_client(struct i2c_client *client)
......
This diff is collapsed.
...@@ -117,16 +117,16 @@ static struct lm92_data *lm92_update_device(struct device *dev) ...@@ -117,16 +117,16 @@ static struct lm92_data *lm92_update_device(struct device *dev)
if (time_after(jiffies, data->last_updated + HZ) if (time_after(jiffies, data->last_updated + HZ)
|| !data->valid) { || !data->valid) {
dev_dbg(&client->dev, "Updating lm92 data\n"); dev_dbg(&client->dev, "Updating lm92 data\n");
data->temp1_input = swab16(i2c_smbus_read_word_data(client, data->temp1_input = i2c_smbus_read_word_swapped(client,
LM92_REG_TEMP)); LM92_REG_TEMP);
data->temp1_hyst = swab16(i2c_smbus_read_word_data(client, data->temp1_hyst = i2c_smbus_read_word_swapped(client,
LM92_REG_TEMP_HYST)); LM92_REG_TEMP_HYST);
data->temp1_crit = swab16(i2c_smbus_read_word_data(client, data->temp1_crit = i2c_smbus_read_word_swapped(client,
LM92_REG_TEMP_CRIT)); LM92_REG_TEMP_CRIT);
data->temp1_min = swab16(i2c_smbus_read_word_data(client, data->temp1_min = i2c_smbus_read_word_swapped(client,
LM92_REG_TEMP_LOW)); LM92_REG_TEMP_LOW);
data->temp1_max = swab16(i2c_smbus_read_word_data(client, data->temp1_max = i2c_smbus_read_word_swapped(client,
LM92_REG_TEMP_HIGH)); LM92_REG_TEMP_HIGH);
data->last_updated = jiffies; data->last_updated = jiffies;
data->valid = 1; data->valid = 1;
...@@ -158,7 +158,7 @@ static ssize_t set_##value(struct device *dev, struct device_attribute *attr, co ...@@ -158,7 +158,7 @@ static ssize_t set_##value(struct device *dev, struct device_attribute *attr, co
\ \
mutex_lock(&data->update_lock); \ mutex_lock(&data->update_lock); \
data->value = TEMP_TO_REG(val); \ data->value = TEMP_TO_REG(val); \
i2c_smbus_write_word_data(client, reg, swab16(data->value)); \ i2c_smbus_write_word_swapped(client, reg, data->value); \
mutex_unlock(&data->update_lock); \ mutex_unlock(&data->update_lock); \
return count; \ return count; \
} }
...@@ -194,8 +194,8 @@ static ssize_t set_temp1_crit_hyst(struct device *dev, struct device_attribute * ...@@ -194,8 +194,8 @@ static ssize_t set_temp1_crit_hyst(struct device *dev, struct device_attribute *
mutex_lock(&data->update_lock); mutex_lock(&data->update_lock);
data->temp1_hyst = TEMP_FROM_REG(data->temp1_crit) - val; data->temp1_hyst = TEMP_FROM_REG(data->temp1_crit) - val;
i2c_smbus_write_word_data(client, LM92_REG_TEMP_HYST, i2c_smbus_write_word_swapped(client, LM92_REG_TEMP_HYST,
swab16(TEMP_TO_REG(data->temp1_hyst))); TEMP_TO_REG(data->temp1_hyst));
mutex_unlock(&data->update_lock); mutex_unlock(&data->update_lock);
return count; return count;
} }
......
...@@ -137,10 +137,10 @@ static int max16065_read_adc(struct i2c_client *client, int reg) ...@@ -137,10 +137,10 @@ static int max16065_read_adc(struct i2c_client *client, int reg)
{ {
int rv; int rv;
rv = i2c_smbus_read_word_data(client, reg); rv = i2c_smbus_read_word_swapped(client, reg);
if (unlikely(rv < 0)) if (unlikely(rv < 0))
return rv; return rv;
return ((rv & 0xff) << 2) | ((rv >> 14) & 0x03); return rv >> 6;
} }
static struct max16065_data *max16065_update_device(struct device *dev) static struct max16065_data *max16065_update_device(struct device *dev)
......
...@@ -82,25 +82,6 @@ static inline int sht21_rh_ticks_to_per_cent_mille(int ticks) ...@@ -82,25 +82,6 @@ static inline int sht21_rh_ticks_to_per_cent_mille(int ticks)
return ((15625 * ticks) >> 13) - 6000; return ((15625 * ticks) >> 13) - 6000;
} }
/**
* sht21_read_word_data() - read word from register
* @client: I2C client device
* @reg: I2C command byte
*
* Returns value, negative errno on error.
*/
static inline int sht21_read_word_data(struct i2c_client *client, u8 reg)
{
int ret = i2c_smbus_read_word_data(client, reg);
if (ret < 0)
return ret;
/*
* SMBus specifies low byte first, but the SHT21 returns MSB
* first, so we have to swab16 the values
*/
return swab16(ret);
}
/** /**
* sht21_update_measurements() - get updated measurements from device * sht21_update_measurements() - get updated measurements from device
* @client: I2C client device * @client: I2C client device
...@@ -119,11 +100,12 @@ static int sht21_update_measurements(struct i2c_client *client) ...@@ -119,11 +100,12 @@ static int sht21_update_measurements(struct i2c_client *client)
* maximum two measurements per second at 12bit accuracy shall be made. * maximum two measurements per second at 12bit accuracy shall be made.
*/ */
if (time_after(jiffies, sht21->last_update + HZ / 2) || !sht21->valid) { if (time_after(jiffies, sht21->last_update + HZ / 2) || !sht21->valid) {
ret = sht21_read_word_data(client, SHT21_TRIG_T_MEASUREMENT_HM); ret = i2c_smbus_read_word_swapped(client,
SHT21_TRIG_T_MEASUREMENT_HM);
if (ret < 0) if (ret < 0)
goto out; goto out;
sht21->temperature = sht21_temp_ticks_to_millicelsius(ret); sht21->temperature = sht21_temp_ticks_to_millicelsius(ret);
ret = sht21_read_word_data(client, ret = i2c_smbus_read_word_swapped(client,
SHT21_TRIG_RH_MEASUREMENT_HM); SHT21_TRIG_RH_MEASUREMENT_HM);
if (ret < 0) if (ret < 0)
goto out; goto out;
......
...@@ -214,33 +214,26 @@ static int smm665_read_adc(struct smm665_data *data, int adc) ...@@ -214,33 +214,26 @@ static int smm665_read_adc(struct smm665_data *data, int adc)
* *
* Neither i2c_smbus_read_byte() nor * Neither i2c_smbus_read_byte() nor
* i2c_smbus_read_block_data() worked here, * i2c_smbus_read_block_data() worked here,
* so use i2c_smbus_read_word_data() instead. * so use i2c_smbus_read_word_swapped() instead.
* We could also try to use i2c_master_recv(), * We could also try to use i2c_master_recv(),
* but that is not always supported. * but that is not always supported.
*/ */
rv = i2c_smbus_read_word_data(client, 0); rv = i2c_smbus_read_word_swapped(client, 0);
if (rv < 0) { if (rv < 0) {
dev_dbg(&client->dev, "Failed to read ADC value: error %d", rv); dev_dbg(&client->dev, "Failed to read ADC value: error %d", rv);
return -1; return -1;
} }
/* /*
* Validate/verify readback adc channel (in bit 11..14). * Validate/verify readback adc channel (in bit 11..14).
* High byte is in lower 8 bit of rv, so only shift by 3.
*/ */
radc = (rv >> 3) & 0x0f; radc = (rv >> 11) & 0x0f;
if (radc != adc) { if (radc != adc) {
dev_dbg(&client->dev, "Unexpected RADC: Expected %d got %d", dev_dbg(&client->dev, "Unexpected RADC: Expected %d got %d",
adc, radc); adc, radc);
return -EIO; return -EIO;
} }
/*
* Chip replies with H/L, while SMBus expects L/H.
* Thus, byte order is reversed, and we have to swap
* the result.
*/
rv = swab16(rv) & SMM665_ADC_MASK;
return rv; return rv & SMM665_ADC_MASK;
} }
static struct smm665_data *smm665_update_device(struct device *dev) static struct smm665_data *smm665_update_device(struct device *dev)
......
...@@ -113,7 +113,7 @@ struct smsc47b397_data { ...@@ -113,7 +113,7 @@ struct smsc47b397_data {
u8 temp[4]; u8 temp[4];
}; };
static int smsc47b397_read_value(struct smsc47b397_data* data, u8 reg) static int smsc47b397_read_value(struct smsc47b397_data *data, u8 reg)
{ {
int res; int res;
...@@ -265,7 +265,8 @@ static int __devinit smsc47b397_probe(struct platform_device *pdev) ...@@ -265,7 +265,8 @@ static int __devinit smsc47b397_probe(struct platform_device *pdev)
return -EBUSY; return -EBUSY;
} }
if (!(data = kzalloc(sizeof(struct smsc47b397_data), GFP_KERNEL))) { data = kzalloc(sizeof(struct smsc47b397_data), GFP_KERNEL);
if (!data) {
err = -ENOMEM; err = -ENOMEM;
goto error_release; goto error_release;
} }
...@@ -276,7 +277,8 @@ static int __devinit smsc47b397_probe(struct platform_device *pdev) ...@@ -276,7 +277,8 @@ static int __devinit smsc47b397_probe(struct platform_device *pdev)
mutex_init(&data->update_lock); mutex_init(&data->update_lock);
platform_set_drvdata(pdev, data); platform_set_drvdata(pdev, data);
if ((err = sysfs_create_group(&dev->kobj, &smsc47b397_group))) err = sysfs_create_group(&dev->kobj, &smsc47b397_group);
if (err)
goto error_free; goto error_free;
data->hwmon_dev = hwmon_device_register(dev); data->hwmon_dev = hwmon_device_register(dev);
...@@ -345,7 +347,7 @@ static int __init smsc47b397_find(unsigned short *addr) ...@@ -345,7 +347,7 @@ static int __init smsc47b397_find(unsigned short *addr)
superio_enter(); superio_enter();
id = force_id ? force_id : superio_inb(SUPERIO_REG_DEVID); id = force_id ? force_id : superio_inb(SUPERIO_REG_DEVID);
switch(id) { switch (id) {
case 0x81: case 0x81:
name = "SCH5307-NS"; name = "SCH5307-NS";
break; break;
...@@ -379,7 +381,8 @@ static int __init smsc47b397_init(void) ...@@ -379,7 +381,8 @@ static int __init smsc47b397_init(void)
unsigned short address; unsigned short address;
int ret; int ret;
if ((ret = smsc47b397_find(&address))) ret = smsc47b397_find(&address);
if (ret)
return ret; return ret;
ret = platform_driver_register(&smsc47b397_driver); ret = platform_driver_register(&smsc47b397_driver);
......
...@@ -55,19 +55,6 @@ struct tmp102 { ...@@ -55,19 +55,6 @@ struct tmp102 {
int temp[3]; int temp[3];
}; };
/* SMBus specifies low byte first, but the TMP102 returns high byte first,
* so we have to swab16 the values */
static inline int tmp102_read_reg(struct i2c_client *client, u8 reg)
{
int result = i2c_smbus_read_word_data(client, reg);
return result < 0 ? result : swab16(result);
}
static inline int tmp102_write_reg(struct i2c_client *client, u8 reg, u16 val)
{
return i2c_smbus_write_word_data(client, reg, swab16(val));
}
/* convert left adjusted 13-bit TMP102 register value to milliCelsius */ /* convert left adjusted 13-bit TMP102 register value to milliCelsius */
static inline int tmp102_reg_to_mC(s16 val) static inline int tmp102_reg_to_mC(s16 val)
{ {
...@@ -94,7 +81,8 @@ static struct tmp102 *tmp102_update_device(struct i2c_client *client) ...@@ -94,7 +81,8 @@ static struct tmp102 *tmp102_update_device(struct i2c_client *client)
if (time_after(jiffies, tmp102->last_update + HZ / 3)) { if (time_after(jiffies, tmp102->last_update + HZ / 3)) {
int i; int i;
for (i = 0; i < ARRAY_SIZE(tmp102->temp); ++i) { for (i = 0; i < ARRAY_SIZE(tmp102->temp); ++i) {
int status = tmp102_read_reg(client, tmp102_reg[i]); int status = i2c_smbus_read_word_swapped(client,
tmp102_reg[i]);
if (status > -1) if (status > -1)
tmp102->temp[i] = tmp102_reg_to_mC(status); tmp102->temp[i] = tmp102_reg_to_mC(status);
} }
...@@ -130,7 +118,7 @@ static ssize_t tmp102_set_temp(struct device *dev, ...@@ -130,7 +118,7 @@ static ssize_t tmp102_set_temp(struct device *dev,
mutex_lock(&tmp102->lock); mutex_lock(&tmp102->lock);
tmp102->temp[sda->index] = val; tmp102->temp[sda->index] = val;
status = tmp102_write_reg(client, tmp102_reg[sda->index], status = i2c_smbus_write_word_swapped(client, tmp102_reg[sda->index],
tmp102_mC_to_reg(val)); tmp102_mC_to_reg(val));
mutex_unlock(&tmp102->lock); mutex_unlock(&tmp102->lock);
return status ? : count; return status ? : count;
...@@ -178,18 +166,19 @@ static int __devinit tmp102_probe(struct i2c_client *client, ...@@ -178,18 +166,19 @@ static int __devinit tmp102_probe(struct i2c_client *client,
} }
i2c_set_clientdata(client, tmp102); i2c_set_clientdata(client, tmp102);
status = tmp102_read_reg(client, TMP102_CONF_REG); status = i2c_smbus_read_word_swapped(client, TMP102_CONF_REG);
if (status < 0) { if (status < 0) {
dev_err(&client->dev, "error reading config register\n"); dev_err(&client->dev, "error reading config register\n");
goto fail_free; goto fail_free;
} }
tmp102->config_orig = status; tmp102->config_orig = status;
status = tmp102_write_reg(client, TMP102_CONF_REG, TMP102_CONFIG); status = i2c_smbus_write_word_swapped(client, TMP102_CONF_REG,
TMP102_CONFIG);
if (status < 0) { if (status < 0) {
dev_err(&client->dev, "error writing config register\n"); dev_err(&client->dev, "error writing config register\n");
goto fail_restore_config; goto fail_restore_config;
} }
status = tmp102_read_reg(client, TMP102_CONF_REG); status = i2c_smbus_read_word_swapped(client, TMP102_CONF_REG);
if (status < 0) { if (status < 0) {
dev_err(&client->dev, "error reading config register\n"); dev_err(&client->dev, "error reading config register\n");
goto fail_restore_config; goto fail_restore_config;
...@@ -222,7 +211,8 @@ static int __devinit tmp102_probe(struct i2c_client *client, ...@@ -222,7 +211,8 @@ static int __devinit tmp102_probe(struct i2c_client *client,
fail_remove_sysfs: fail_remove_sysfs:
sysfs_remove_group(&client->dev.kobj, &tmp102_attr_group); sysfs_remove_group(&client->dev.kobj, &tmp102_attr_group);
fail_restore_config: fail_restore_config:
tmp102_write_reg(client, TMP102_CONF_REG, tmp102->config_orig); i2c_smbus_write_word_swapped(client, TMP102_CONF_REG,
tmp102->config_orig);
fail_free: fail_free:
kfree(tmp102); kfree(tmp102);
...@@ -240,9 +230,9 @@ static int __devexit tmp102_remove(struct i2c_client *client) ...@@ -240,9 +230,9 @@ static int __devexit tmp102_remove(struct i2c_client *client)
if (tmp102->config_orig & TMP102_CONF_SD) { if (tmp102->config_orig & TMP102_CONF_SD) {
int config; int config;
config = tmp102_read_reg(client, TMP102_CONF_REG); config = i2c_smbus_read_word_swapped(client, TMP102_CONF_REG);
if (config >= 0) if (config >= 0)
tmp102_write_reg(client, TMP102_CONF_REG, i2c_smbus_write_word_swapped(client, TMP102_CONF_REG,
config | TMP102_CONF_SD); config | TMP102_CONF_SD);
} }
...@@ -257,12 +247,12 @@ static int tmp102_suspend(struct device *dev) ...@@ -257,12 +247,12 @@ static int tmp102_suspend(struct device *dev)
struct i2c_client *client = to_i2c_client(dev); struct i2c_client *client = to_i2c_client(dev);
int config; int config;
config = tmp102_read_reg(client, TMP102_CONF_REG); config = i2c_smbus_read_word_swapped(client, TMP102_CONF_REG);
if (config < 0) if (config < 0)
return config; return config;
config |= TMP102_CONF_SD; config |= TMP102_CONF_SD;
return tmp102_write_reg(client, TMP102_CONF_REG, config); return i2c_smbus_write_word_swapped(client, TMP102_CONF_REG, config);
} }
static int tmp102_resume(struct device *dev) static int tmp102_resume(struct device *dev)
...@@ -270,12 +260,12 @@ static int tmp102_resume(struct device *dev) ...@@ -270,12 +260,12 @@ static int tmp102_resume(struct device *dev)
struct i2c_client *client = to_i2c_client(dev); struct i2c_client *client = to_i2c_client(dev);
int config; int config;
config = tmp102_read_reg(client, TMP102_CONF_REG); config = i2c_smbus_read_word_swapped(client, TMP102_CONF_REG);
if (config < 0) if (config < 0)
return config; return config;
config &= ~TMP102_CONF_SD; config &= ~TMP102_CONF_SD;
return tmp102_write_reg(client, TMP102_CONF_REG, config); return i2c_smbus_write_word_swapped(client, TMP102_CONF_REG, config);
} }
static const struct dev_pm_ops tmp102_dev_pm_ops = { static const struct dev_pm_ops tmp102_dev_pm_ops = {
......
This diff is collapsed.
...@@ -1245,17 +1245,17 @@ w83781d_read_value_i2c(struct w83781d_data *data, u16 reg) ...@@ -1245,17 +1245,17 @@ w83781d_read_value_i2c(struct w83781d_data *data, u16 reg)
/* 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 */
res = swab16(i2c_smbus_read_word_data(cl, 0)); res = i2c_smbus_read_word_swapped(cl, 0);
break; break;
case 0x52: /* CONFIG */ case 0x52: /* CONFIG */
res = i2c_smbus_read_byte_data(cl, 1); res = i2c_smbus_read_byte_data(cl, 1);
break; break;
case 0x53: /* HYST */ case 0x53: /* HYST */
res = swab16(i2c_smbus_read_word_data(cl, 2)); res = i2c_smbus_read_word_swapped(cl, 2);
break; break;
case 0x55: /* OVER */ case 0x55: /* OVER */
default: default:
res = swab16(i2c_smbus_read_word_data(cl, 3)); res = i2c_smbus_read_word_swapped(cl, 3);
break; break;
} }
} }
...@@ -1289,10 +1289,10 @@ w83781d_write_value_i2c(struct w83781d_data *data, u16 reg, u16 value) ...@@ -1289,10 +1289,10 @@ w83781d_write_value_i2c(struct w83781d_data *data, u16 reg, u16 value)
i2c_smbus_write_byte_data(cl, 1, value & 0xff); i2c_smbus_write_byte_data(cl, 1, value & 0xff);
break; break;
case 0x53: /* HYST */ case 0x53: /* HYST */
i2c_smbus_write_word_data(cl, 2, swab16(value)); i2c_smbus_write_word_swapped(cl, 2, value);
break; break;
case 0x55: /* OVER */ case 0x55: /* OVER */
i2c_smbus_write_word_data(cl, 3, swab16(value)); i2c_smbus_write_word_swapped(cl, 3, value);
break; break;
} }
} }
......
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