Commit b775c389 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: (k10temp) Update documentation for Fam12h
  hwmon-vid: Fix typo in VIA CPU name
  hwmon: (f71882fg) Add support for the F71869A
  hwmon: Use <> rather than () around my e-mail address
  hwmon: (emc6w201) Properly handle all errors
parents 9508d805 af75d5b7
...@@ -22,6 +22,10 @@ Supported chips: ...@@ -22,6 +22,10 @@ Supported chips:
Prefix: 'f71869' Prefix: 'f71869'
Addresses scanned: none, address read from Super I/O config space Addresses scanned: none, address read from Super I/O config space
Datasheet: Available from the Fintek website Datasheet: Available from the Fintek website
* Fintek F71869A
Prefix: 'f71869a'
Addresses scanned: none, address read from Super I/O config space
Datasheet: Not public
* Fintek F71882FG and F71883FG * Fintek F71882FG and F71883FG
Prefix: 'f71882fg' Prefix: 'f71882fg'
Addresses scanned: none, address read from Super I/O config space Addresses scanned: none, address read from Super I/O config space
......
...@@ -9,8 +9,8 @@ Supported chips: ...@@ -9,8 +9,8 @@ Supported chips:
Socket S1G3: Athlon II, Sempron, Turion II Socket S1G3: Athlon II, Sempron, Turion II
* AMD Family 11h processors: * AMD Family 11h processors:
Socket S1G2: Athlon (X2), Sempron (X2), Turion X2 (Ultra) Socket S1G2: Athlon (X2), Sempron (X2), Turion X2 (Ultra)
* AMD Family 12h processors: "Llano" * AMD Family 12h processors: "Llano" (E2/A4/A6/A8-Series)
* AMD Family 14h processors: "Brazos" (C/E/G-Series) * AMD Family 14h processors: "Brazos" (C/E/G/Z-Series)
* AMD Family 15h processors: "Bulldozer" * AMD Family 15h processors: "Bulldozer"
Prefix: 'k10temp' Prefix: 'k10temp'
...@@ -20,12 +20,16 @@ Supported chips: ...@@ -20,12 +20,16 @@ Supported chips:
http://support.amd.com/us/Processor_TechDocs/31116.pdf http://support.amd.com/us/Processor_TechDocs/31116.pdf
BIOS and Kernel Developer's Guide (BKDG) for AMD Family 11h Processors: BIOS and Kernel Developer's Guide (BKDG) for AMD Family 11h Processors:
http://support.amd.com/us/Processor_TechDocs/41256.pdf http://support.amd.com/us/Processor_TechDocs/41256.pdf
BIOS and Kernel Developer's Guide (BKDG) for AMD Family 12h Processors:
http://support.amd.com/us/Processor_TechDocs/41131.pdf
BIOS and Kernel Developer's Guide (BKDG) for AMD Family 14h Models 00h-0Fh Processors: BIOS and Kernel Developer's Guide (BKDG) for AMD Family 14h Models 00h-0Fh Processors:
http://support.amd.com/us/Processor_TechDocs/43170.pdf http://support.amd.com/us/Processor_TechDocs/43170.pdf
Revision Guide for AMD Family 10h Processors: Revision Guide for AMD Family 10h Processors:
http://support.amd.com/us/Processor_TechDocs/41322.pdf http://support.amd.com/us/Processor_TechDocs/41322.pdf
Revision Guide for AMD Family 11h Processors: Revision Guide for AMD Family 11h Processors:
http://support.amd.com/us/Processor_TechDocs/41788.pdf http://support.amd.com/us/Processor_TechDocs/41788.pdf
Revision Guide for AMD Family 12h Processors:
http://support.amd.com/us/Processor_TechDocs/44739.pdf
Revision Guide for AMD Family 14h Models 00h-0Fh Processors: Revision Guide for AMD Family 14h Models 00h-0Fh Processors:
http://support.amd.com/us/Processor_TechDocs/47534.pdf http://support.amd.com/us/Processor_TechDocs/47534.pdf
AMD Family 11h Processor Power and Thermal Data Sheet for Notebooks: AMD Family 11h Processor Power and Thermal Data Sheet for Notebooks:
......
...@@ -333,7 +333,7 @@ config SENSORS_F71882FG ...@@ -333,7 +333,7 @@ config SENSORS_F71882FG
F71858FG F71858FG
F71862FG F71862FG
F71863FG F71863FG
F71869F/E F71869F/E/A
F71882FG F71882FG
F71883FG F71883FG
F71889FG/ED/A F71889FG/ED/A
......
...@@ -78,8 +78,9 @@ static u16 emc6w201_read16(struct i2c_client *client, u8 reg) ...@@ -78,8 +78,9 @@ static u16 emc6w201_read16(struct i2c_client *client, u8 reg)
lsb = i2c_smbus_read_byte_data(client, reg); lsb = i2c_smbus_read_byte_data(client, reg);
msb = i2c_smbus_read_byte_data(client, reg + 1); msb = i2c_smbus_read_byte_data(client, reg + 1);
if (lsb < 0 || msb < 0) { if (unlikely(lsb < 0 || msb < 0)) {
dev_err(&client->dev, "16-bit read failed at 0x%02x\n", reg); dev_err(&client->dev, "%d-bit %s failed at 0x%02x\n",
16, "read", reg);
return 0xFFFF; /* Arbitrary value */ return 0xFFFF; /* Arbitrary value */
} }
...@@ -95,10 +96,39 @@ static int emc6w201_write16(struct i2c_client *client, u8 reg, u16 val) ...@@ -95,10 +96,39 @@ static int emc6w201_write16(struct i2c_client *client, u8 reg, u16 val)
int err; int err;
err = i2c_smbus_write_byte_data(client, reg, val & 0xff); err = i2c_smbus_write_byte_data(client, reg, val & 0xff);
if (!err) if (likely(!err))
err = i2c_smbus_write_byte_data(client, reg + 1, val >> 8); err = i2c_smbus_write_byte_data(client, reg + 1, val >> 8);
if (err < 0) if (unlikely(err < 0))
dev_err(&client->dev, "16-bit write failed at 0x%02x\n", reg); dev_err(&client->dev, "%d-bit %s failed at 0x%02x\n",
16, "write", reg);
return err;
}
/* Read 8-bit value from register */
static u8 emc6w201_read8(struct i2c_client *client, u8 reg)
{
int val;
val = i2c_smbus_read_byte_data(client, reg);
if (unlikely(val < 0)) {
dev_err(&client->dev, "%d-bit %s failed at 0x%02x\n",
8, "read", reg);
return 0x00; /* Arbitrary value */
}
return val;
}
/* Write 8-bit value to register */
static int emc6w201_write8(struct i2c_client *client, u8 reg, u8 val)
{
int err;
err = i2c_smbus_write_byte_data(client, reg, val);
if (unlikely(err < 0))
dev_err(&client->dev, "%d-bit %s failed at 0x%02x\n",
8, "write", reg);
return err; return err;
} }
...@@ -114,25 +144,25 @@ static struct emc6w201_data *emc6w201_update_device(struct device *dev) ...@@ -114,25 +144,25 @@ static struct emc6w201_data *emc6w201_update_device(struct device *dev)
if (time_after(jiffies, data->last_updated + HZ) || !data->valid) { if (time_after(jiffies, data->last_updated + HZ) || !data->valid) {
for (nr = 0; nr < 6; nr++) { for (nr = 0; nr < 6; nr++) {
data->in[input][nr] = data->in[input][nr] =
i2c_smbus_read_byte_data(client, emc6w201_read8(client,
EMC6W201_REG_IN(nr)); EMC6W201_REG_IN(nr));
data->in[min][nr] = data->in[min][nr] =
i2c_smbus_read_byte_data(client, emc6w201_read8(client,
EMC6W201_REG_IN_LOW(nr)); EMC6W201_REG_IN_LOW(nr));
data->in[max][nr] = data->in[max][nr] =
i2c_smbus_read_byte_data(client, emc6w201_read8(client,
EMC6W201_REG_IN_HIGH(nr)); EMC6W201_REG_IN_HIGH(nr));
} }
for (nr = 0; nr < 6; nr++) { for (nr = 0; nr < 6; nr++) {
data->temp[input][nr] = data->temp[input][nr] =
i2c_smbus_read_byte_data(client, emc6w201_read8(client,
EMC6W201_REG_TEMP(nr)); EMC6W201_REG_TEMP(nr));
data->temp[min][nr] = data->temp[min][nr] =
i2c_smbus_read_byte_data(client, emc6w201_read8(client,
EMC6W201_REG_TEMP_LOW(nr)); EMC6W201_REG_TEMP_LOW(nr));
data->temp[max][nr] = data->temp[max][nr] =
i2c_smbus_read_byte_data(client, emc6w201_read8(client,
EMC6W201_REG_TEMP_HIGH(nr)); EMC6W201_REG_TEMP_HIGH(nr));
} }
...@@ -192,7 +222,7 @@ static ssize_t set_in(struct device *dev, struct device_attribute *devattr, ...@@ -192,7 +222,7 @@ static ssize_t set_in(struct device *dev, struct device_attribute *devattr,
mutex_lock(&data->update_lock); mutex_lock(&data->update_lock);
data->in[sf][nr] = SENSORS_LIMIT(val, 0, 255); data->in[sf][nr] = SENSORS_LIMIT(val, 0, 255);
err = i2c_smbus_write_byte_data(client, reg, data->in[sf][nr]); err = emc6w201_write8(client, reg, data->in[sf][nr]);
mutex_unlock(&data->update_lock); mutex_unlock(&data->update_lock);
return err < 0 ? err : count; return err < 0 ? err : count;
...@@ -229,7 +259,7 @@ static ssize_t set_temp(struct device *dev, struct device_attribute *devattr, ...@@ -229,7 +259,7 @@ static ssize_t set_temp(struct device *dev, struct device_attribute *devattr,
mutex_lock(&data->update_lock); mutex_lock(&data->update_lock);
data->temp[sf][nr] = SENSORS_LIMIT(val, -127, 128); data->temp[sf][nr] = SENSORS_LIMIT(val, -127, 128);
err = i2c_smbus_write_byte_data(client, reg, data->temp[sf][nr]); err = emc6w201_write8(client, reg, data->temp[sf][nr]);
mutex_unlock(&data->update_lock); mutex_unlock(&data->update_lock);
return err < 0 ? err : count; return err < 0 ? err : count;
...@@ -444,7 +474,7 @@ static int emc6w201_detect(struct i2c_client *client, ...@@ -444,7 +474,7 @@ static int emc6w201_detect(struct i2c_client *client,
/* Check configuration */ /* Check configuration */
config = i2c_smbus_read_byte_data(client, EMC6W201_REG_CONFIG); config = i2c_smbus_read_byte_data(client, EMC6W201_REG_CONFIG);
if ((config & 0xF4) != 0x04) if (config < 0 || (config & 0xF4) != 0x04)
return -ENODEV; return -ENODEV;
if (!(config & 0x01)) { if (!(config & 0x01)) {
dev_err(&client->dev, "Monitoring not enabled\n"); dev_err(&client->dev, "Monitoring not enabled\n");
......
...@@ -52,6 +52,7 @@ ...@@ -52,6 +52,7 @@
#define SIO_F71858_ID 0x0507 /* Chipset ID */ #define SIO_F71858_ID 0x0507 /* Chipset ID */
#define SIO_F71862_ID 0x0601 /* Chipset ID */ #define SIO_F71862_ID 0x0601 /* Chipset ID */
#define SIO_F71869_ID 0x0814 /* Chipset ID */ #define SIO_F71869_ID 0x0814 /* Chipset ID */
#define SIO_F71869A_ID 0x1007 /* Chipset ID */
#define SIO_F71882_ID 0x0541 /* Chipset ID */ #define SIO_F71882_ID 0x0541 /* Chipset ID */
#define SIO_F71889_ID 0x0723 /* Chipset ID */ #define SIO_F71889_ID 0x0723 /* Chipset ID */
#define SIO_F71889E_ID 0x0909 /* Chipset ID */ #define SIO_F71889E_ID 0x0909 /* Chipset ID */
...@@ -108,8 +109,8 @@ static unsigned short force_id; ...@@ -108,8 +109,8 @@ static unsigned short force_id;
module_param(force_id, ushort, 0); module_param(force_id, ushort, 0);
MODULE_PARM_DESC(force_id, "Override the detected device ID"); MODULE_PARM_DESC(force_id, "Override the detected device ID");
enum chips { f71808e, f71808a, f71858fg, f71862fg, f71869, f71882fg, f71889fg, enum chips { f71808e, f71808a, f71858fg, f71862fg, f71869, f71869a, f71882fg,
f71889ed, f71889a, f8000, f81865f }; f71889fg, f71889ed, f71889a, f8000, f81865f };
static const char *f71882fg_names[] = { static const char *f71882fg_names[] = {
"f71808e", "f71808e",
...@@ -117,6 +118,7 @@ static const char *f71882fg_names[] = { ...@@ -117,6 +118,7 @@ static const char *f71882fg_names[] = {
"f71858fg", "f71858fg",
"f71862fg", "f71862fg",
"f71869", /* Both f71869f and f71869e, reg. compatible and same id */ "f71869", /* Both f71869f and f71869e, reg. compatible and same id */
"f71869a",
"f71882fg", "f71882fg",
"f71889fg", /* f81801u too, same id */ "f71889fg", /* f81801u too, same id */
"f71889ed", "f71889ed",
...@@ -131,6 +133,7 @@ static const char f71882fg_has_in[][F71882FG_MAX_INS] = { ...@@ -131,6 +133,7 @@ static const char f71882fg_has_in[][F71882FG_MAX_INS] = {
[f71858fg] = { 1, 1, 1, 0, 0, 0, 0, 0, 0 }, [f71858fg] = { 1, 1, 1, 0, 0, 0, 0, 0, 0 },
[f71862fg] = { 1, 1, 1, 1, 1, 1, 1, 1, 1 }, [f71862fg] = { 1, 1, 1, 1, 1, 1, 1, 1, 1 },
[f71869] = { 1, 1, 1, 1, 1, 1, 1, 1, 1 }, [f71869] = { 1, 1, 1, 1, 1, 1, 1, 1, 1 },
[f71869a] = { 1, 1, 1, 1, 1, 1, 1, 1, 1 },
[f71882fg] = { 1, 1, 1, 1, 1, 1, 1, 1, 1 }, [f71882fg] = { 1, 1, 1, 1, 1, 1, 1, 1, 1 },
[f71889fg] = { 1, 1, 1, 1, 1, 1, 1, 1, 1 }, [f71889fg] = { 1, 1, 1, 1, 1, 1, 1, 1, 1 },
[f71889ed] = { 1, 1, 1, 1, 1, 1, 1, 1, 1 }, [f71889ed] = { 1, 1, 1, 1, 1, 1, 1, 1, 1 },
...@@ -145,6 +148,7 @@ static const char f71882fg_has_in1_alarm[] = { ...@@ -145,6 +148,7 @@ static const char f71882fg_has_in1_alarm[] = {
[f71858fg] = 0, [f71858fg] = 0,
[f71862fg] = 0, [f71862fg] = 0,
[f71869] = 0, [f71869] = 0,
[f71869a] = 0,
[f71882fg] = 1, [f71882fg] = 1,
[f71889fg] = 1, [f71889fg] = 1,
[f71889ed] = 1, [f71889ed] = 1,
...@@ -159,6 +163,7 @@ static const char f71882fg_fan_has_beep[] = { ...@@ -159,6 +163,7 @@ static const char f71882fg_fan_has_beep[] = {
[f71858fg] = 0, [f71858fg] = 0,
[f71862fg] = 1, [f71862fg] = 1,
[f71869] = 1, [f71869] = 1,
[f71869a] = 1,
[f71882fg] = 1, [f71882fg] = 1,
[f71889fg] = 1, [f71889fg] = 1,
[f71889ed] = 1, [f71889ed] = 1,
...@@ -173,6 +178,7 @@ static const char f71882fg_nr_fans[] = { ...@@ -173,6 +178,7 @@ static const char f71882fg_nr_fans[] = {
[f71858fg] = 3, [f71858fg] = 3,
[f71862fg] = 3, [f71862fg] = 3,
[f71869] = 3, [f71869] = 3,
[f71869a] = 3,
[f71882fg] = 4, [f71882fg] = 4,
[f71889fg] = 3, [f71889fg] = 3,
[f71889ed] = 3, [f71889ed] = 3,
...@@ -187,6 +193,7 @@ static const char f71882fg_temp_has_beep[] = { ...@@ -187,6 +193,7 @@ static const char f71882fg_temp_has_beep[] = {
[f71858fg] = 0, [f71858fg] = 0,
[f71862fg] = 1, [f71862fg] = 1,
[f71869] = 1, [f71869] = 1,
[f71869a] = 1,
[f71882fg] = 1, [f71882fg] = 1,
[f71889fg] = 1, [f71889fg] = 1,
[f71889ed] = 1, [f71889ed] = 1,
...@@ -201,6 +208,7 @@ static const char f71882fg_nr_temps[] = { ...@@ -201,6 +208,7 @@ static const char f71882fg_nr_temps[] = {
[f71858fg] = 3, [f71858fg] = 3,
[f71862fg] = 3, [f71862fg] = 3,
[f71869] = 3, [f71869] = 3,
[f71869a] = 3,
[f71882fg] = 3, [f71882fg] = 3,
[f71889fg] = 3, [f71889fg] = 3,
[f71889ed] = 3, [f71889ed] = 3,
...@@ -2243,6 +2251,7 @@ static int __devinit f71882fg_probe(struct platform_device *pdev) ...@@ -2243,6 +2251,7 @@ static int __devinit f71882fg_probe(struct platform_device *pdev)
case f71808e: case f71808e:
case f71808a: case f71808a:
case f71869: case f71869:
case f71869a:
/* These always have signed auto point temps */ /* These always have signed auto point temps */
data->auto_point_temp_signed = 1; data->auto_point_temp_signed = 1;
/* Fall through to select correct fan/pwm reg bank! */ /* Fall through to select correct fan/pwm reg bank! */
...@@ -2305,6 +2314,7 @@ static int __devinit f71882fg_probe(struct platform_device *pdev) ...@@ -2305,6 +2314,7 @@ static int __devinit f71882fg_probe(struct platform_device *pdev)
case f71808e: case f71808e:
case f71808a: case f71808a:
case f71869: case f71869:
case f71869a:
case f71889fg: case f71889fg:
case f71889ed: case f71889ed:
case f71889a: case f71889a:
...@@ -2528,6 +2538,9 @@ static int __init f71882fg_find(int sioaddr, unsigned short *address, ...@@ -2528,6 +2538,9 @@ static int __init f71882fg_find(int sioaddr, unsigned short *address,
case SIO_F71869_ID: case SIO_F71869_ID:
sio_data->type = f71869; sio_data->type = f71869;
break; break;
case SIO_F71869A_ID:
sio_data->type = f71869a;
break;
case SIO_F71882_ID: case SIO_F71882_ID:
sio_data->type = f71882fg; sio_data->type = f71882fg;
break; break;
...@@ -2662,7 +2675,7 @@ static void __exit f71882fg_exit(void) ...@@ -2662,7 +2675,7 @@ static void __exit f71882fg_exit(void)
} }
MODULE_DESCRIPTION("F71882FG Hardware Monitoring Driver"); MODULE_DESCRIPTION("F71882FG Hardware Monitoring Driver");
MODULE_AUTHOR("Hans Edgington, Hans de Goede (hdegoede@redhat.com)"); MODULE_AUTHOR("Hans Edgington, Hans de Goede <hdegoede@redhat.com>");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
module_init(f71882fg_init); module_init(f71882fg_init);
......
...@@ -202,7 +202,7 @@ static struct vrm_model vrm_models[] = { ...@@ -202,7 +202,7 @@ static struct vrm_model vrm_models[] = {
{X86_VENDOR_CENTAUR, 0x6, 0x7, ANY, 85}, /* Eden ESP/Ezra */ {X86_VENDOR_CENTAUR, 0x6, 0x7, ANY, 85}, /* Eden ESP/Ezra */
{X86_VENDOR_CENTAUR, 0x6, 0x8, 0x7, 85}, /* Ezra T */ {X86_VENDOR_CENTAUR, 0x6, 0x8, 0x7, 85}, /* Ezra T */
{X86_VENDOR_CENTAUR, 0x6, 0x9, 0x7, 85}, /* Nemiah */ {X86_VENDOR_CENTAUR, 0x6, 0x9, 0x7, 85}, /* Nehemiah */
{X86_VENDOR_CENTAUR, 0x6, 0x9, ANY, 17}, /* C3-M, Eden-N */ {X86_VENDOR_CENTAUR, 0x6, 0x9, ANY, 17}, /* C3-M, Eden-N */
{X86_VENDOR_CENTAUR, 0x6, 0xA, 0x7, 0}, /* No information */ {X86_VENDOR_CENTAUR, 0x6, 0xA, 0x7, 0}, /* No information */
{X86_VENDOR_CENTAUR, 0x6, 0xA, ANY, 13}, /* C7, Esther */ {X86_VENDOR_CENTAUR, 0x6, 0xA, ANY, 13}, /* C7, Esther */
......
...@@ -887,7 +887,7 @@ static void __exit sch5627_exit(void) ...@@ -887,7 +887,7 @@ static void __exit sch5627_exit(void)
} }
MODULE_DESCRIPTION("SMSC SCH5627 Hardware Monitoring Driver"); MODULE_DESCRIPTION("SMSC SCH5627 Hardware Monitoring Driver");
MODULE_AUTHOR("Hans de Goede (hdegoede@redhat.com)"); MODULE_AUTHOR("Hans de Goede <hdegoede@redhat.com>");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
module_init(sch5627_init); module_init(sch5627_init);
......
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