aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hwmon
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2013-09-03 13:43:35 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2013-09-03 13:43:35 -0400
commit7e75224188460ef2e6a6096e912aa4682ab76486 (patch)
tree99a3e77d20928ab4141909ce77b4fd25b83aaa3a /drivers/hwmon
parentbebcb928c820d0ee83aca4b192adc195e43e66a2 (diff)
parentf060c658b820141f18abd7b71586d628464a03ea (diff)
Merge tag 'hwmon-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging
Pull hwmon updates from Guenter Roeck: - new driver for HTU21D (humidity sensor) - add support for Fam16h (Kabini) to k10temp - add support for NCT6102D/6106D and NCT6791D to nct6775 driver - add support for ADS1115 to ads1015 driver - add support for hibernate to w83627ehf and nct6775 drivers - some minor cleanups * tag 'hwmon-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging: hwmon: (htu21) Add Measurement Specialties HTU21D support hwmon: Change my email address. hwmon: (k10temp) Add support for Fam16h (Kabini) hwmon: (adt7462) ADT7462_REG_VOLT_MAX() should return 0 hwmon: (ads1015) Add support for ADS1115 hwmon: (w83627ehf) Add support for hibernate hwmon: (nct6775) Add support for hibernate hwmon: use dev_get_platdata() hwmon: (nct6775) Fix size of data->temp array hwmon: (nct6775) Avoid using device platform data outside probe function hwmon: (nct6775) Add support for NCT6791D hwmon: (nct6775) Add support for beep attributes hwmon: (nct6775) Add support for critical low/high temperature limits on NCT6106 hwmon: (nct6775) Add support for NCT6102D/6106D hwmon: (nct6775) Support two SuperIO chips in the same system hwmon: (nct6775) Allocate attributes dynamically from templates hwmon: (coretemp) Atom CPUs don't support TjMax; no warning needed
Diffstat (limited to 'drivers/hwmon')
-rw-r--r--drivers/hwmon/Kconfig18
-rw-r--r--drivers/hwmon/Makefile1
-rw-r--r--drivers/hwmon/acpi_power_meter.c4
-rw-r--r--drivers/hwmon/ads1015.c27
-rw-r--r--drivers/hwmon/ads7828.c2
-rw-r--r--drivers/hwmon/adt7462.c8
-rw-r--r--drivers/hwmon/adt7470.c4
-rw-r--r--drivers/hwmon/coretemp.c14
-rw-r--r--drivers/hwmon/ds620.c2
-rw-r--r--drivers/hwmon/f71805f.c2
-rw-r--r--drivers/hwmon/f71882fg.c2
-rw-r--r--drivers/hwmon/f75375s.c3
-rw-r--r--drivers/hwmon/g762.c2
-rw-r--r--drivers/hwmon/gpio-fan.c2
-rw-r--r--drivers/hwmon/htu21.c199
-rw-r--r--drivers/hwmon/i5k_amb.c4
-rw-r--r--drivers/hwmon/ibmaem.c4
-rw-r--r--drivers/hwmon/ibmpex.c4
-rw-r--r--drivers/hwmon/ina2xx.c4
-rw-r--r--drivers/hwmon/it87.c6
-rw-r--r--drivers/hwmon/k10temp.c3
-rw-r--r--drivers/hwmon/lm87.c4
-rw-r--r--drivers/hwmon/max197.c2
-rw-r--r--drivers/hwmon/max6639.c2
-rw-r--r--drivers/hwmon/mcp3021.c7
-rw-r--r--drivers/hwmon/nct6775.c2531
-rw-r--r--drivers/hwmon/ntc_thermistor.c2
-rw-r--r--drivers/hwmon/pc87427.c4
-rw-r--r--drivers/hwmon/pmbus/pmbus_core.c2
-rw-r--r--drivers/hwmon/s3c-hwmon.c6
-rw-r--r--drivers/hwmon/sht15.c4
-rw-r--r--drivers/hwmon/smsc47m1.c4
-rw-r--r--drivers/hwmon/w83627ehf.c22
-rw-r--r--drivers/hwmon/w83627hf.c6
34 files changed, 1563 insertions, 1348 deletions
diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig
index e989f7fd645b..b3ab9d43bb3e 100644
--- a/drivers/hwmon/Kconfig
+++ b/drivers/hwmon/Kconfig
@@ -296,8 +296,8 @@ config SENSORS_K10TEMP
296 If you say yes here you get support for the temperature 296 If you say yes here you get support for the temperature
297 sensor(s) inside your CPU. Supported are later revisions of 297 sensor(s) inside your CPU. Supported are later revisions of
298 the AMD Family 10h and all revisions of the AMD Family 11h, 298 the AMD Family 10h and all revisions of the AMD Family 11h,
299 12h (Llano), 14h (Brazos) and 15h (Bulldozer/Trinity) 299 12h (Llano), 14h (Brazos), 15h (Bulldozer/Trinity) and
300 microarchitectures. 300 16h (Kabini) microarchitectures.
301 301
302 This driver can also be built as a module. If so, the module 302 This driver can also be built as a module. If so, the module
303 will be called k10temp. 303 will be called k10temp.
@@ -511,6 +511,16 @@ config SENSORS_HIH6130
511 This driver can also be built as a module. If so, the module 511 This driver can also be built as a module. If so, the module
512 will be called hih6130. 512 will be called hih6130.
513 513
514config SENSORS_HTU21
515 tristate "Measurement Specialties HTU21D humidity/temperature sensors"
516 depends on I2C
517 help
518 If you say yes here you get support for the Measurement Specialties
519 HTU21D humidity and temperature sensors.
520
521 This driver can also be built as a module. If so, the module
522 will be called htu21.
523
514config SENSORS_CORETEMP 524config SENSORS_CORETEMP
515 tristate "Intel Core/Core2/Atom temperature sensor" 525 tristate "Intel Core/Core2/Atom temperature sensor"
516 depends on X86 526 depends on X86
@@ -1202,8 +1212,8 @@ config SENSORS_ADS1015
1202 tristate "Texas Instruments ADS1015" 1212 tristate "Texas Instruments ADS1015"
1203 depends on I2C 1213 depends on I2C
1204 help 1214 help
1205 If you say yes here you get support for Texas Instruments ADS1015 1215 If you say yes here you get support for Texas Instruments
1206 12-bit 4-input ADC device. 1216 ADS1015/ADS1115 12/16-bit 4-input ADC device.
1207 1217
1208 This driver can also be built as a module. If so, the module 1218 This driver can also be built as a module. If so, the module
1209 will be called ads1015. 1219 will be called ads1015.
diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile
index 4f0fb5235f42..ec7cde06eb52 100644
--- a/drivers/hwmon/Makefile
+++ b/drivers/hwmon/Makefile
@@ -65,6 +65,7 @@ obj-$(CONFIG_SENSORS_GL518SM) += gl518sm.o
65obj-$(CONFIG_SENSORS_GL520SM) += gl520sm.o 65obj-$(CONFIG_SENSORS_GL520SM) += gl520sm.o
66obj-$(CONFIG_SENSORS_GPIO_FAN) += gpio-fan.o 66obj-$(CONFIG_SENSORS_GPIO_FAN) += gpio-fan.o
67obj-$(CONFIG_SENSORS_HIH6130) += hih6130.o 67obj-$(CONFIG_SENSORS_HIH6130) += hih6130.o
68obj-$(CONFIG_SENSORS_HTU21) += htu21.o
68obj-$(CONFIG_SENSORS_ULTRA45) += ultra45_env.o 69obj-$(CONFIG_SENSORS_ULTRA45) += ultra45_env.o
69obj-$(CONFIG_SENSORS_I5K_AMB) += i5k_amb.o 70obj-$(CONFIG_SENSORS_I5K_AMB) += i5k_amb.o
70obj-$(CONFIG_SENSORS_IBMAEM) += ibmaem.o 71obj-$(CONFIG_SENSORS_IBMAEM) += ibmaem.o
diff --git a/drivers/hwmon/acpi_power_meter.c b/drivers/hwmon/acpi_power_meter.c
index 6351aba8819c..a9e3d0152c0b 100644
--- a/drivers/hwmon/acpi_power_meter.c
+++ b/drivers/hwmon/acpi_power_meter.c
@@ -2,7 +2,7 @@
2 * A hwmon driver for ACPI 4.0 power meters 2 * A hwmon driver for ACPI 4.0 power meters
3 * Copyright (C) 2009 IBM 3 * Copyright (C) 2009 IBM
4 * 4 *
5 * Author: Darrick J. Wong <djwong@us.ibm.com> 5 * Author: Darrick J. Wong <darrick.wong@oracle.com>
6 * 6 *
7 * This program is free software; you can redistribute it and/or modify 7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by 8 * it under the terms of the GNU General Public License as published by
@@ -1001,7 +1001,7 @@ static void __exit acpi_power_meter_exit(void)
1001 acpi_bus_unregister_driver(&acpi_power_meter_driver); 1001 acpi_bus_unregister_driver(&acpi_power_meter_driver);
1002} 1002}
1003 1003
1004MODULE_AUTHOR("Darrick J. Wong <djwong@us.ibm.com>"); 1004MODULE_AUTHOR("Darrick J. Wong <darrick.wong@oracle.com>");
1005MODULE_DESCRIPTION("ACPI 4.0 power meter driver"); 1005MODULE_DESCRIPTION("ACPI 4.0 power meter driver");
1006MODULE_LICENSE("GPL"); 1006MODULE_LICENSE("GPL");
1007 1007
diff --git a/drivers/hwmon/ads1015.c b/drivers/hwmon/ads1015.c
index 2798246ad814..7f9dc2f86b63 100644
--- a/drivers/hwmon/ads1015.c
+++ b/drivers/hwmon/ads1015.c
@@ -46,17 +46,28 @@ static const unsigned int fullscale_table[8] = {
46 6144, 4096, 2048, 1024, 512, 256, 256, 256 }; 46 6144, 4096, 2048, 1024, 512, 256, 256, 256 };
47 47
48/* Data rates in samples per second */ 48/* Data rates in samples per second */
49static const unsigned int data_rate_table[8] = { 49static const unsigned int data_rate_table_1015[8] = {
50 128, 250, 490, 920, 1600, 2400, 3300, 3300 }; 50 128, 250, 490, 920, 1600, 2400, 3300, 3300
51};
52
53static const unsigned int data_rate_table_1115[8] = {
54 8, 16, 32, 64, 128, 250, 475, 860
55};
51 56
52#define ADS1015_DEFAULT_CHANNELS 0xff 57#define ADS1015_DEFAULT_CHANNELS 0xff
53#define ADS1015_DEFAULT_PGA 2 58#define ADS1015_DEFAULT_PGA 2
54#define ADS1015_DEFAULT_DATA_RATE 4 59#define ADS1015_DEFAULT_DATA_RATE 4
55 60
61enum ads1015_chips {
62 ads1015,
63 ads1115,
64};
65
56struct ads1015_data { 66struct ads1015_data {
57 struct device *hwmon_dev; 67 struct device *hwmon_dev;
58 struct mutex update_lock; /* mutex protect updates */ 68 struct mutex update_lock; /* mutex protect updates */
59 struct ads1015_channel_data channel_data[ADS1015_CHANNELS]; 69 struct ads1015_channel_data channel_data[ADS1015_CHANNELS];
70 enum ads1015_chips id;
60}; 71};
61 72
62static int ads1015_read_adc(struct i2c_client *client, unsigned int channel) 73static int ads1015_read_adc(struct i2c_client *client, unsigned int channel)
@@ -66,6 +77,8 @@ static int ads1015_read_adc(struct i2c_client *client, unsigned int channel)
66 unsigned int pga = data->channel_data[channel].pga; 77 unsigned int pga = data->channel_data[channel].pga;
67 unsigned int data_rate = data->channel_data[channel].data_rate; 78 unsigned int data_rate = data->channel_data[channel].data_rate;
68 unsigned int conversion_time_ms; 79 unsigned int conversion_time_ms;
80 const unsigned int * const rate_table = data->id == ads1115 ?
81 data_rate_table_1115 : data_rate_table_1015;
69 int res; 82 int res;
70 83
71 mutex_lock(&data->update_lock); 84 mutex_lock(&data->update_lock);
@@ -75,7 +88,7 @@ static int ads1015_read_adc(struct i2c_client *client, unsigned int channel)
75 if (res < 0) 88 if (res < 0)
76 goto err_unlock; 89 goto err_unlock;
77 config = res; 90 config = res;
78 conversion_time_ms = DIV_ROUND_UP(1000, data_rate_table[data_rate]); 91 conversion_time_ms = DIV_ROUND_UP(1000, rate_table[data_rate]);
79 92
80 /* setup and start single conversion */ 93 /* setup and start single conversion */
81 config &= 0x001f; 94 config &= 0x001f;
@@ -113,8 +126,9 @@ static int ads1015_reg_to_mv(struct i2c_client *client, unsigned int channel,
113 struct ads1015_data *data = i2c_get_clientdata(client); 126 struct ads1015_data *data = i2c_get_clientdata(client);
114 unsigned int pga = data->channel_data[channel].pga; 127 unsigned int pga = data->channel_data[channel].pga;
115 int fullscale = fullscale_table[pga]; 128 int fullscale = fullscale_table[pga];
129 const unsigned mask = data->id == ads1115 ? 0x7fff : 0x7ff0;
116 130
117 return DIV_ROUND_CLOSEST(reg * fullscale, 0x7ff0); 131 return DIV_ROUND_CLOSEST(reg * fullscale, mask);
118} 132}
119 133
120/* sysfs callback function */ 134/* sysfs callback function */
@@ -257,7 +271,7 @@ static int ads1015_probe(struct i2c_client *client,
257 GFP_KERNEL); 271 GFP_KERNEL);
258 if (!data) 272 if (!data)
259 return -ENOMEM; 273 return -ENOMEM;
260 274 data->id = id->driver_data;
261 i2c_set_clientdata(client, data); 275 i2c_set_clientdata(client, data);
262 mutex_init(&data->update_lock); 276 mutex_init(&data->update_lock);
263 277
@@ -286,7 +300,8 @@ exit_remove:
286} 300}
287 301
288static const struct i2c_device_id ads1015_id[] = { 302static const struct i2c_device_id ads1015_id[] = {
289 { "ads1015", 0 }, 303 { "ads1015", ads1015},
304 { "ads1115", ads1115},
290 { } 305 { }
291}; 306};
292MODULE_DEVICE_TABLE(i2c, ads1015_id); 307MODULE_DEVICE_TABLE(i2c, ads1015_id);
diff --git a/drivers/hwmon/ads7828.c b/drivers/hwmon/ads7828.c
index ba962ac4b81f..7092c78f814f 100644
--- a/drivers/hwmon/ads7828.c
+++ b/drivers/hwmon/ads7828.c
@@ -145,7 +145,7 @@ static int ads7828_remove(struct i2c_client *client)
145static int ads7828_probe(struct i2c_client *client, 145static int ads7828_probe(struct i2c_client *client,
146 const struct i2c_device_id *id) 146 const struct i2c_device_id *id)
147{ 147{
148 struct ads7828_platform_data *pdata = client->dev.platform_data; 148 struct ads7828_platform_data *pdata = dev_get_platdata(&client->dev);
149 struct ads7828_data *data; 149 struct ads7828_data *data;
150 int err; 150 int err;
151 151
diff --git a/drivers/hwmon/adt7462.c b/drivers/hwmon/adt7462.c
index 69481d3a3d23..addb5a4d5064 100644
--- a/drivers/hwmon/adt7462.c
+++ b/drivers/hwmon/adt7462.c
@@ -2,7 +2,7 @@
2 * A hwmon driver for the Analog Devices ADT7462 2 * A hwmon driver for the Analog Devices ADT7462
3 * Copyright (C) 2008 IBM 3 * Copyright (C) 2008 IBM
4 * 4 *
5 * Author: Darrick J. Wong <djwong@us.ibm.com> 5 * Author: Darrick J. Wong <darrick.wong@oracle.com>
6 * 6 *
7 * This program is free software; you can redistribute it and/or modify 7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by 8 * it under the terms of the GNU General Public License as published by
@@ -333,7 +333,7 @@ static int ADT7462_REG_VOLT_MAX(struct adt7462_data *data, int which)
333 return 0x4C; 333 return 0x4C;
334 break; 334 break;
335 } 335 }
336 return -ENODEV; 336 return 0;
337} 337}
338 338
339static int ADT7462_REG_VOLT_MIN(struct adt7462_data *data, int which) 339static int ADT7462_REG_VOLT_MIN(struct adt7462_data *data, int which)
@@ -392,7 +392,7 @@ static int ADT7462_REG_VOLT_MIN(struct adt7462_data *data, int which)
392 return 0x77; 392 return 0x77;
393 break; 393 break;
394 } 394 }
395 return -ENODEV; 395 return 0;
396} 396}
397 397
398static int ADT7462_REG_VOLT(struct adt7462_data *data, int which) 398static int ADT7462_REG_VOLT(struct adt7462_data *data, int which)
@@ -1970,6 +1970,6 @@ static int adt7462_remove(struct i2c_client *client)
1970 1970
1971module_i2c_driver(adt7462_driver); 1971module_i2c_driver(adt7462_driver);
1972 1972
1973MODULE_AUTHOR("Darrick J. Wong <djwong@us.ibm.com>"); 1973MODULE_AUTHOR("Darrick J. Wong <darrick.wong@oracle.com>");
1974MODULE_DESCRIPTION("ADT7462 driver"); 1974MODULE_DESCRIPTION("ADT7462 driver");
1975MODULE_LICENSE("GPL"); 1975MODULE_LICENSE("GPL");
diff --git a/drivers/hwmon/adt7470.c b/drivers/hwmon/adt7470.c
index 6099f50b28aa..0f4dea5ccf17 100644
--- a/drivers/hwmon/adt7470.c
+++ b/drivers/hwmon/adt7470.c
@@ -2,7 +2,7 @@
2 * A hwmon driver for the Analog Devices ADT7470 2 * A hwmon driver for the Analog Devices ADT7470
3 * Copyright (C) 2007 IBM 3 * Copyright (C) 2007 IBM
4 * 4 *
5 * Author: Darrick J. Wong <djwong@us.ibm.com> 5 * Author: Darrick J. Wong <darrick.wong@oracle.com>
6 * 6 *
7 * This program is free software; you can redistribute it and/or modify 7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by 8 * it under the terms of the GNU General Public License as published by
@@ -1314,6 +1314,6 @@ static int adt7470_remove(struct i2c_client *client)
1314 1314
1315module_i2c_driver(adt7470_driver); 1315module_i2c_driver(adt7470_driver);
1316 1316
1317MODULE_AUTHOR("Darrick J. Wong <djwong@us.ibm.com>"); 1317MODULE_AUTHOR("Darrick J. Wong <darrick.wong@oracle.com>");
1318MODULE_DESCRIPTION("ADT7470 driver"); 1318MODULE_DESCRIPTION("ADT7470 driver");
1319MODULE_LICENSE("GPL"); 1319MODULE_LICENSE("GPL");
diff --git a/drivers/hwmon/coretemp.c b/drivers/hwmon/coretemp.c
index 2e5e2dc47eaf..78be66176840 100644
--- a/drivers/hwmon/coretemp.c
+++ b/drivers/hwmon/coretemp.c
@@ -316,6 +316,18 @@ static int adjust_tjmax(struct cpuinfo_x86 *c, u32 id, struct device *dev)
316 return tjmax; 316 return tjmax;
317} 317}
318 318
319static bool cpu_has_tjmax(struct cpuinfo_x86 *c)
320{
321 u8 model = c->x86_model;
322
323 return model > 0xe &&
324 model != 0x1c &&
325 model != 0x26 &&
326 model != 0x27 &&
327 model != 0x35 &&
328 model != 0x36;
329}
330
319static int get_tjmax(struct cpuinfo_x86 *c, u32 id, struct device *dev) 331static int get_tjmax(struct cpuinfo_x86 *c, u32 id, struct device *dev)
320{ 332{
321 int err; 333 int err;
@@ -328,7 +340,7 @@ static int get_tjmax(struct cpuinfo_x86 *c, u32 id, struct device *dev)
328 */ 340 */
329 err = rdmsr_safe_on_cpu(id, MSR_IA32_TEMPERATURE_TARGET, &eax, &edx); 341 err = rdmsr_safe_on_cpu(id, MSR_IA32_TEMPERATURE_TARGET, &eax, &edx);
330 if (err) { 342 if (err) {
331 if (c->x86_model > 0xe && c->x86_model != 0x1c) 343 if (cpu_has_tjmax(c))
332 dev_warn(dev, "Unable to read TjMax from CPU %u\n", id); 344 dev_warn(dev, "Unable to read TjMax from CPU %u\n", id);
333 } else { 345 } else {
334 val = (eax >> 16) & 0xff; 346 val = (eax >> 16) & 0xff;
diff --git a/drivers/hwmon/ds620.c b/drivers/hwmon/ds620.c
index f1d6b422cf06..0918b9136588 100644
--- a/drivers/hwmon/ds620.c
+++ b/drivers/hwmon/ds620.c
@@ -77,7 +77,7 @@ struct ds620_data {
77 77
78static void ds620_init_client(struct i2c_client *client) 78static void ds620_init_client(struct i2c_client *client)
79{ 79{
80 struct ds620_platform_data *ds620_info = client->dev.platform_data; 80 struct ds620_platform_data *ds620_info = dev_get_platdata(&client->dev);
81 u16 conf, new_conf; 81 u16 conf, new_conf;
82 82
83 new_conf = conf = 83 new_conf = conf =
diff --git a/drivers/hwmon/f71805f.c b/drivers/hwmon/f71805f.c
index 0c9f3da242bf..15b7f5281def 100644
--- a/drivers/hwmon/f71805f.c
+++ b/drivers/hwmon/f71805f.c
@@ -1375,7 +1375,7 @@ static void f71805f_init_device(struct f71805f_data *data)
1375 1375
1376static int f71805f_probe(struct platform_device *pdev) 1376static int f71805f_probe(struct platform_device *pdev)
1377{ 1377{
1378 struct f71805f_sio_data *sio_data = pdev->dev.platform_data; 1378 struct f71805f_sio_data *sio_data = dev_get_platdata(&pdev->dev);
1379 struct f71805f_data *data; 1379 struct f71805f_data *data;
1380 struct resource *res; 1380 struct resource *res;
1381 int i, err; 1381 int i, err;
diff --git a/drivers/hwmon/f71882fg.c b/drivers/hwmon/f71882fg.c
index cfb02dd91aad..31b221eeee6c 100644
--- a/drivers/hwmon/f71882fg.c
+++ b/drivers/hwmon/f71882fg.c
@@ -2267,7 +2267,7 @@ static int f71882fg_create_fan_sysfs_files(
2267static int f71882fg_probe(struct platform_device *pdev) 2267static int f71882fg_probe(struct platform_device *pdev)
2268{ 2268{
2269 struct f71882fg_data *data; 2269 struct f71882fg_data *data;
2270 struct f71882fg_sio_data *sio_data = pdev->dev.platform_data; 2270 struct f71882fg_sio_data *sio_data = dev_get_platdata(&pdev->dev);
2271 int nr_fans = f71882fg_nr_fans[sio_data->type]; 2271 int nr_fans = f71882fg_nr_fans[sio_data->type];
2272 int nr_temps = f71882fg_nr_temps[sio_data->type]; 2272 int nr_temps = f71882fg_nr_temps[sio_data->type];
2273 int err, i; 2273 int err, i;
diff --git a/drivers/hwmon/f75375s.c b/drivers/hwmon/f75375s.c
index 9e300e567f15..a837b94977f4 100644
--- a/drivers/hwmon/f75375s.c
+++ b/drivers/hwmon/f75375s.c
@@ -832,7 +832,8 @@ static int f75375_probe(struct i2c_client *client,
832 const struct i2c_device_id *id) 832 const struct i2c_device_id *id)
833{ 833{
834 struct f75375_data *data; 834 struct f75375_data *data;
835 struct f75375s_platform_data *f75375s_pdata = client->dev.platform_data; 835 struct f75375s_platform_data *f75375s_pdata =
836 dev_get_platdata(&client->dev);
836 int err; 837 int err;
837 838
838 if (!i2c_check_functionality(client->adapter, 839 if (!i2c_check_functionality(client->adapter,
diff --git a/drivers/hwmon/g762.c b/drivers/hwmon/g762.c
index 73adf01b0ef2..b4b8b5bef718 100644
--- a/drivers/hwmon/g762.c
+++ b/drivers/hwmon/g762.c
@@ -717,7 +717,7 @@ static void g762_of_clock_disable(struct i2c_client *client) { }
717 717
718static int g762_pdata_prop_import(struct i2c_client *client) 718static int g762_pdata_prop_import(struct i2c_client *client)
719{ 719{
720 struct g762_platform_data *pdata = client->dev.platform_data; 720 struct g762_platform_data *pdata = dev_get_platdata(&client->dev);
721 int ret; 721 int ret;
722 722
723 if (!pdata) 723 if (!pdata)
diff --git a/drivers/hwmon/gpio-fan.c b/drivers/hwmon/gpio-fan.c
index 3104149795c5..b7d6a5704eb2 100644
--- a/drivers/hwmon/gpio-fan.c
+++ b/drivers/hwmon/gpio-fan.c
@@ -495,7 +495,7 @@ static int gpio_fan_probe(struct platform_device *pdev)
495{ 495{
496 int err; 496 int err;
497 struct gpio_fan_data *fan_data; 497 struct gpio_fan_data *fan_data;
498 struct gpio_fan_platform_data *pdata = pdev->dev.platform_data; 498 struct gpio_fan_platform_data *pdata = dev_get_platdata(&pdev->dev);
499 499
500#ifdef CONFIG_OF_GPIO 500#ifdef CONFIG_OF_GPIO
501 if (!pdata) { 501 if (!pdata) {
diff --git a/drivers/hwmon/htu21.c b/drivers/hwmon/htu21.c
new file mode 100644
index 000000000000..839086e0e951
--- /dev/null
+++ b/drivers/hwmon/htu21.c
@@ -0,0 +1,199 @@
1/*
2 * Measurement Specialties HTU21D humidity and temperature sensor driver
3 *
4 * Copyright (C) 2013 William Markezana <william.markezana@meas-spec.com>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 */
17
18#include <linux/module.h>
19#include <linux/init.h>
20#include <linux/slab.h>
21#include <linux/i2c.h>
22#include <linux/hwmon.h>
23#include <linux/hwmon-sysfs.h>
24#include <linux/err.h>
25#include <linux/mutex.h>
26#include <linux/device.h>
27#include <linux/jiffies.h>
28
29/* HTU21 Commands */
30#define HTU21_T_MEASUREMENT_HM 0xE3
31#define HTU21_RH_MEASUREMENT_HM 0xE5
32
33struct htu21 {
34 struct device *hwmon_dev;
35 struct mutex lock;
36 bool valid;
37 unsigned long last_update;
38 int temperature;
39 int humidity;
40};
41
42static inline int htu21_temp_ticks_to_millicelsius(int ticks)
43{
44 ticks &= ~0x0003; /* clear status bits */
45 /*
46 * Formula T = -46.85 + 175.72 * ST / 2^16 from datasheet p14,
47 * optimized for integer fixed point (3 digits) arithmetic
48 */
49 return ((21965 * ticks) >> 13) - 46850;
50}
51
52static inline int htu21_rh_ticks_to_per_cent_mille(int ticks)
53{
54 ticks &= ~0x0003; /* clear status bits */
55 /*
56 * Formula RH = -6 + 125 * SRH / 2^16 from datasheet p14,
57 * optimized for integer fixed point (3 digits) arithmetic
58 */
59 return ((15625 * ticks) >> 13) - 6000;
60}
61
62static int htu21_update_measurements(struct i2c_client *client)
63{
64 int ret = 0;
65 struct htu21 *htu21 = i2c_get_clientdata(client);
66
67 mutex_lock(&htu21->lock);
68
69 if (time_after(jiffies, htu21->last_update + HZ / 2) ||
70 !htu21->valid) {
71 ret = i2c_smbus_read_word_swapped(client,
72 HTU21_T_MEASUREMENT_HM);
73 if (ret < 0)
74 goto out;
75 htu21->temperature = htu21_temp_ticks_to_millicelsius(ret);
76 ret = i2c_smbus_read_word_swapped(client,
77 HTU21_RH_MEASUREMENT_HM);
78 if (ret < 0)
79 goto out;
80 htu21->humidity = htu21_rh_ticks_to_per_cent_mille(ret);
81 htu21->last_update = jiffies;
82 htu21->valid = true;
83 }
84out:
85 mutex_unlock(&htu21->lock);
86
87 return ret >= 0 ? 0 : ret;
88}
89
90static ssize_t htu21_show_temperature(struct device *dev,
91 struct device_attribute *attr, char *buf)
92{
93 struct i2c_client *client = to_i2c_client(dev);
94 struct htu21 *htu21 = i2c_get_clientdata(client);
95 int ret = htu21_update_measurements(client);
96 if (ret < 0)
97 return ret;
98 return sprintf(buf, "%d\n", htu21->temperature);
99}
100
101static ssize_t htu21_show_humidity(struct device *dev,
102 struct device_attribute *attr, char *buf)
103{
104 struct i2c_client *client = to_i2c_client(dev);
105 struct htu21 *htu21 = i2c_get_clientdata(client);
106 int ret = htu21_update_measurements(client);
107 if (ret < 0)
108 return ret;
109 return sprintf(buf, "%d\n", htu21->humidity);
110}
111
112static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO,
113 htu21_show_temperature, NULL, 0);
114static SENSOR_DEVICE_ATTR(humidity1_input, S_IRUGO,
115 htu21_show_humidity, NULL, 0);
116
117static struct attribute *htu21_attributes[] = {
118 &sensor_dev_attr_temp1_input.dev_attr.attr,
119 &sensor_dev_attr_humidity1_input.dev_attr.attr,
120 NULL
121};
122
123static const struct attribute_group htu21_group = {
124 .attrs = htu21_attributes,
125};
126
127static int htu21_probe(struct i2c_client *client,
128 const struct i2c_device_id *id)
129{
130 struct htu21 *htu21;
131 int err;
132
133 if (!i2c_check_functionality(client->adapter,
134 I2C_FUNC_SMBUS_READ_WORD_DATA)) {
135 dev_err(&client->dev,
136 "adapter does not support SMBus word transactions\n");
137 return -ENODEV;
138 }
139
140 htu21 = devm_kzalloc(&client->dev, sizeof(*htu21), GFP_KERNEL);
141 if (!htu21)
142 return -ENOMEM;
143
144 i2c_set_clientdata(client, htu21);
145
146 mutex_init(&htu21->lock);
147
148 err = sysfs_create_group(&client->dev.kobj, &htu21_group);
149 if (err) {
150 dev_dbg(&client->dev, "could not create sysfs files\n");
151 return err;
152 }
153 htu21->hwmon_dev = hwmon_device_register(&client->dev);
154 if (IS_ERR(htu21->hwmon_dev)) {
155 dev_dbg(&client->dev, "unable to register hwmon device\n");
156 err = PTR_ERR(htu21->hwmon_dev);
157 goto error;
158 }
159
160 dev_info(&client->dev, "initialized\n");
161
162 return 0;
163
164error:
165 sysfs_remove_group(&client->dev.kobj, &htu21_group);
166 return err;
167}
168
169static int htu21_remove(struct i2c_client *client)
170{
171 struct htu21 *htu21 = i2c_get_clientdata(client);
172
173 hwmon_device_unregister(htu21->hwmon_dev);
174 sysfs_remove_group(&client->dev.kobj, &htu21_group);
175
176 return 0;
177}
178
179static const struct i2c_device_id htu21_id[] = {
180 { "htu21", 0 },
181 { }
182};
183MODULE_DEVICE_TABLE(i2c, htu21_id);
184
185static struct i2c_driver htu21_driver = {
186 .class = I2C_CLASS_HWMON,
187 .driver = {
188 .name = "htu21",
189 },
190 .probe = htu21_probe,
191 .remove = htu21_remove,
192 .id_table = htu21_id,
193};
194
195module_i2c_driver(htu21_driver);
196
197MODULE_AUTHOR("William Markezana <william.markezana@meas-spec.com>");
198MODULE_DESCRIPTION("MEAS HTU21D humidity and temperature sensor driver");
199MODULE_LICENSE("GPL");
diff --git a/drivers/hwmon/i5k_amb.c b/drivers/hwmon/i5k_amb.c
index de058c278aa9..6c0080a3b902 100644
--- a/drivers/hwmon/i5k_amb.c
+++ b/drivers/hwmon/i5k_amb.c
@@ -3,7 +3,7 @@
3 * temperature sensors 3 * temperature sensors
4 * Copyright (C) 2007 IBM 4 * Copyright (C) 2007 IBM
5 * 5 *
6 * Author: Darrick J. Wong <djwong@us.ibm.com> 6 * Author: Darrick J. Wong <darrick.wong@oracle.com>
7 * 7 *
8 * This program is free software; you can redistribute it and/or modify 8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by 9 * it under the terms of the GNU General Public License as published by
@@ -609,7 +609,7 @@ static void __exit i5k_amb_exit(void)
609 platform_driver_unregister(&i5k_amb_driver); 609 platform_driver_unregister(&i5k_amb_driver);
610} 610}
611 611
612MODULE_AUTHOR("Darrick J. Wong <djwong@us.ibm.com>"); 612MODULE_AUTHOR("Darrick J. Wong <darrick.wong@oracle.com>");
613MODULE_DESCRIPTION("Intel 5000 chipset FB-DIMM AMB temperature sensor"); 613MODULE_DESCRIPTION("Intel 5000 chipset FB-DIMM AMB temperature sensor");
614MODULE_LICENSE("GPL"); 614MODULE_LICENSE("GPL");
615 615
diff --git a/drivers/hwmon/ibmaem.c b/drivers/hwmon/ibmaem.c
index 1429f6e177f4..e2b56a2b756c 100644
--- a/drivers/hwmon/ibmaem.c
+++ b/drivers/hwmon/ibmaem.c
@@ -3,7 +3,7 @@
3 * temperature/power/energy sensors and capping functionality. 3 * temperature/power/energy sensors and capping functionality.
4 * Copyright (C) 2008 IBM 4 * Copyright (C) 2008 IBM
5 * 5 *
6 * Author: Darrick J. Wong <djwong@us.ibm.com> 6 * Author: Darrick J. Wong <darrick.wong@oracle.com>
7 * 7 *
8 * This program is free software; you can redistribute it and/or modify 8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by 9 * it under the terms of the GNU General Public License as published by
@@ -1103,7 +1103,7 @@ static void __exit aem_exit(void)
1103 aem_delete(p1); 1103 aem_delete(p1);
1104} 1104}
1105 1105
1106MODULE_AUTHOR("Darrick J. Wong <djwong@us.ibm.com>"); 1106MODULE_AUTHOR("Darrick J. Wong <darrick.wong@oracle.com>");
1107MODULE_DESCRIPTION("IBM AEM power/temp/energy sensor driver"); 1107MODULE_DESCRIPTION("IBM AEM power/temp/energy sensor driver");
1108MODULE_LICENSE("GPL"); 1108MODULE_LICENSE("GPL");
1109 1109
diff --git a/drivers/hwmon/ibmpex.c b/drivers/hwmon/ibmpex.c
index 74b365ea01c7..20ab0fb85395 100644
--- a/drivers/hwmon/ibmpex.c
+++ b/drivers/hwmon/ibmpex.c
@@ -2,7 +2,7 @@
2 * A hwmon driver for the IBM PowerExecutive temperature/power sensors 2 * A hwmon driver for the IBM PowerExecutive temperature/power sensors
3 * Copyright (C) 2007 IBM 3 * Copyright (C) 2007 IBM
4 * 4 *
5 * Author: Darrick J. Wong <djwong@us.ibm.com> 5 * Author: Darrick J. Wong <darrick.wong@oracle.com>
6 * 6 *
7 * This program is free software; you can redistribute it and/or modify 7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by 8 * it under the terms of the GNU General Public License as published by
@@ -606,7 +606,7 @@ static void __exit ibmpex_exit(void)
606 ibmpex_bmc_delete(p); 606 ibmpex_bmc_delete(p);
607} 607}
608 608
609MODULE_AUTHOR("Darrick J. Wong <djwong@us.ibm.com>"); 609MODULE_AUTHOR("Darrick J. Wong <darrick.wong@oracle.com>");
610MODULE_DESCRIPTION("IBM PowerExecutive power/temperature sensor driver"); 610MODULE_DESCRIPTION("IBM PowerExecutive power/temperature sensor driver");
611MODULE_LICENSE("GPL"); 611MODULE_LICENSE("GPL");
612 612
diff --git a/drivers/hwmon/ina2xx.c b/drivers/hwmon/ina2xx.c
index d917a2d8c30f..18c062360ca7 100644
--- a/drivers/hwmon/ina2xx.c
+++ b/drivers/hwmon/ina2xx.c
@@ -232,9 +232,9 @@ static int ina2xx_probe(struct i2c_client *client,
232 if (!data) 232 if (!data)
233 return -ENOMEM; 233 return -ENOMEM;
234 234
235 if (client->dev.platform_data) { 235 if (dev_get_platdata(&client->dev)) {
236 pdata = 236 pdata =
237 (struct ina2xx_platform_data *)client->dev.platform_data; 237 (struct ina2xx_platform_data *)dev_get_platdata(&client->dev);
238 shunt = pdata->shunt_uohms; 238 shunt = pdata->shunt_uohms;
239 } else if (!of_property_read_u32(client->dev.of_node, 239 } else if (!of_property_read_u32(client->dev.of_node,
240 "shunt-resistor", &val)) { 240 "shunt-resistor", &val)) {
diff --git a/drivers/hwmon/it87.c b/drivers/hwmon/it87.c
index 72b21d5b1c62..29ffa27c60b8 100644
--- a/drivers/hwmon/it87.c
+++ b/drivers/hwmon/it87.c
@@ -1962,7 +1962,7 @@ exit:
1962static void it87_remove_files(struct device *dev) 1962static void it87_remove_files(struct device *dev)
1963{ 1963{
1964 struct it87_data *data = platform_get_drvdata(pdev); 1964 struct it87_data *data = platform_get_drvdata(pdev);
1965 struct it87_sio_data *sio_data = dev->platform_data; 1965 struct it87_sio_data *sio_data = dev_get_platdata(dev);
1966 int i; 1966 int i;
1967 1967
1968 sysfs_remove_group(&dev->kobj, &it87_group); 1968 sysfs_remove_group(&dev->kobj, &it87_group);
@@ -2014,7 +2014,7 @@ static int it87_probe(struct platform_device *pdev)
2014 struct it87_data *data; 2014 struct it87_data *data;
2015 struct resource *res; 2015 struct resource *res;
2016 struct device *dev = &pdev->dev; 2016 struct device *dev = &pdev->dev;
2017 struct it87_sio_data *sio_data = dev->platform_data; 2017 struct it87_sio_data *sio_data = dev_get_platdata(dev);
2018 int err = 0, i; 2018 int err = 0, i;
2019 int enable_pwm_interface; 2019 int enable_pwm_interface;
2020 int fan_beep_need_rw; 2020 int fan_beep_need_rw;
@@ -2316,7 +2316,7 @@ static int it87_check_pwm(struct device *dev)
2316/* Called when we have found a new IT87. */ 2316/* Called when we have found a new IT87. */
2317static void it87_init_device(struct platform_device *pdev) 2317static void it87_init_device(struct platform_device *pdev)
2318{ 2318{
2319 struct it87_sio_data *sio_data = pdev->dev.platform_data; 2319 struct it87_sio_data *sio_data = dev_get_platdata(&pdev->dev);
2320 struct it87_data *data = platform_get_drvdata(pdev); 2320 struct it87_data *data = platform_get_drvdata(pdev);
2321 int tmp, i; 2321 int tmp, i;
2322 u8 mask; 2322 u8 mask;
diff --git a/drivers/hwmon/k10temp.c b/drivers/hwmon/k10temp.c
index e3b037c73a7e..e633856370cf 100644
--- a/drivers/hwmon/k10temp.c
+++ b/drivers/hwmon/k10temp.c
@@ -1,5 +1,5 @@
1/* 1/*
2 * k10temp.c - AMD Family 10h/11h/12h/14h/15h processor hardware monitoring 2 * k10temp.c - AMD Family 10h/11h/12h/14h/15h/16h processor hardware monitoring
3 * 3 *
4 * Copyright (c) 2009 Clemens Ladisch <clemens@ladisch.de> 4 * Copyright (c) 2009 Clemens Ladisch <clemens@ladisch.de>
5 * 5 *
@@ -211,6 +211,7 @@ static DEFINE_PCI_DEVICE_TABLE(k10temp_id_table) = {
211 { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_CNB17H_F3) }, 211 { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_CNB17H_F3) },
212 { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_15H_NB_F3) }, 212 { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_15H_NB_F3) },
213 { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_15H_M10H_F3) }, 213 { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_15H_M10H_F3) },
214 { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_16H_NB_F3) },
214 {} 215 {}
215}; 216};
216MODULE_DEVICE_TABLE(pci, k10temp_id_table); 217MODULE_DEVICE_TABLE(pci, k10temp_id_table);
diff --git a/drivers/hwmon/lm87.c b/drivers/hwmon/lm87.c
index 16e45d702152..333092ce2465 100644
--- a/drivers/hwmon/lm87.c
+++ b/drivers/hwmon/lm87.c
@@ -855,8 +855,8 @@ static void lm87_init_client(struct i2c_client *client)
855{ 855{
856 struct lm87_data *data = i2c_get_clientdata(client); 856 struct lm87_data *data = i2c_get_clientdata(client);
857 857
858 if (client->dev.platform_data) { 858 if (dev_get_platdata(&client->dev)) {
859 data->channel = *(u8 *)client->dev.platform_data; 859 data->channel = *(u8 *)dev_get_platdata(&client->dev);
860 lm87_write_value(client, 860 lm87_write_value(client,
861 LM87_REG_CHANNEL_MODE, data->channel); 861 LM87_REG_CHANNEL_MODE, data->channel);
862 } else { 862 } else {
diff --git a/drivers/hwmon/max197.c b/drivers/hwmon/max197.c
index b5ebb9198c75..96dccaf919d1 100644
--- a/drivers/hwmon/max197.c
+++ b/drivers/hwmon/max197.c
@@ -261,7 +261,7 @@ static int max197_probe(struct platform_device *pdev)
261{ 261{
262 int ch, ret; 262 int ch, ret;
263 struct max197_data *data; 263 struct max197_data *data;
264 struct max197_platform_data *pdata = pdev->dev.platform_data; 264 struct max197_platform_data *pdata = dev_get_platdata(&pdev->dev);
265 enum max197_chips chip = platform_get_device_id(pdev)->driver_data; 265 enum max197_chips chip = platform_get_device_id(pdev)->driver_data;
266 266
267 if (pdata == NULL) { 267 if (pdata == NULL) {
diff --git a/drivers/hwmon/max6639.c b/drivers/hwmon/max6639.c
index 3e7b4269f5b9..066e587a18a5 100644
--- a/drivers/hwmon/max6639.c
+++ b/drivers/hwmon/max6639.c
@@ -428,7 +428,7 @@ static int max6639_init_client(struct i2c_client *client)
428{ 428{
429 struct max6639_data *data = i2c_get_clientdata(client); 429 struct max6639_data *data = i2c_get_clientdata(client);
430 struct max6639_platform_data *max6639_info = 430 struct max6639_platform_data *max6639_info =
431 client->dev.platform_data; 431 dev_get_platdata(&client->dev);
432 int i; 432 int i;
433 int rpm_range = 1; /* default: 4000 RPM */ 433 int rpm_range = 1; /* default: 4000 RPM */
434 int err; 434 int err;
diff --git a/drivers/hwmon/mcp3021.c b/drivers/hwmon/mcp3021.c
index eedb32292d6d..d219c06a857b 100644
--- a/drivers/hwmon/mcp3021.c
+++ b/drivers/hwmon/mcp3021.c
@@ -143,12 +143,13 @@ static int mcp3021_probe(struct i2c_client *client,
143 break; 143 break;
144 } 144 }
145 145
146 if (client->dev.platform_data) { 146 if (dev_get_platdata(&client->dev)) {
147 data->vdd = *(u32 *)client->dev.platform_data; 147 data->vdd = *(u32 *)dev_get_platdata(&client->dev);
148 if (data->vdd > MCP3021_VDD_MAX || data->vdd < MCP3021_VDD_MIN) 148 if (data->vdd > MCP3021_VDD_MAX || data->vdd < MCP3021_VDD_MIN)
149 return -EINVAL; 149 return -EINVAL;
150 } else 150 } else {
151 data->vdd = MCP3021_VDD_REF; 151 data->vdd = MCP3021_VDD_REF;
152 }
152 153
153 err = sysfs_create_file(&client->dev.kobj, &dev_attr_in0_input.attr); 154 err = sysfs_create_file(&client->dev.kobj, &dev_attr_in0_input.attr);
154 if (err) 155 if (err)
diff --git a/drivers/hwmon/nct6775.c b/drivers/hwmon/nct6775.c
index 99cec1825420..6eb03ce2cff4 100644
--- a/drivers/hwmon/nct6775.c
+++ b/drivers/hwmon/nct6775.c
@@ -33,9 +33,11 @@
33 * Supports the following chips: 33 * Supports the following chips:
34 * 34 *
35 * Chip #vin #fan #pwm #temp chip IDs man ID 35 * Chip #vin #fan #pwm #temp chip IDs man ID
36 * nct6106d 9 3 3 6+3 0xc450 0xc1 0x5ca3
36 * nct6775f 9 4 3 6+3 0xb470 0xc1 0x5ca3 37 * nct6775f 9 4 3 6+3 0xb470 0xc1 0x5ca3
37 * nct6776f 9 5 3 6+3 0xc330 0xc1 0x5ca3 38 * nct6776f 9 5 3 6+3 0xc330 0xc1 0x5ca3
38 * nct6779d 15 5 5 2+6 0xc560 0xc1 0x5ca3 39 * nct6779d 15 5 5 2+6 0xc560 0xc1 0x5ca3
40 * nct6791d 15 6 6 2+6 0xc800 0xc1 0x5ca3
39 * 41 *
40 * #temp lists the number of monitored temperature sources (first value) plus 42 * #temp lists the number of monitored temperature sources (first value) plus
41 * the number of directly connectable temperature sensors (second value). 43 * the number of directly connectable temperature sensors (second value).
@@ -59,13 +61,15 @@
59 61
60#define USE_ALTERNATE 62#define USE_ALTERNATE
61 63
62enum kinds { nct6775, nct6776, nct6779 }; 64enum kinds { nct6106, nct6775, nct6776, nct6779, nct6791 };
63 65
64/* used to set data->name = nct6775_device_names[data->sio_kind] */ 66/* used to set data->name = nct6775_device_names[data->sio_kind] */
65static const char * const nct6775_device_names[] = { 67static const char * const nct6775_device_names[] = {
68 "nct6106",
66 "nct6775", 69 "nct6775",
67 "nct6776", 70 "nct6776",
68 "nct6779", 71 "nct6779",
72 "nct6791",
69}; 73};
70 74
71static unsigned short force_id; 75static unsigned short force_id;
@@ -91,9 +95,11 @@ MODULE_PARM_DESC(fan_debounce, "Enable debouncing for fan RPM signal");
91#define SIO_REG_ENABLE 0x30 /* Logical device enable */ 95#define SIO_REG_ENABLE 0x30 /* Logical device enable */
92#define SIO_REG_ADDR 0x60 /* Logical device address (2 bytes) */ 96#define SIO_REG_ADDR 0x60 /* Logical device address (2 bytes) */
93 97
98#define SIO_NCT6106_ID 0xc450
94#define SIO_NCT6775_ID 0xb470 99#define SIO_NCT6775_ID 0xb470
95#define SIO_NCT6776_ID 0xc330 100#define SIO_NCT6776_ID 0xc330
96#define SIO_NCT6779_ID 0xc560 101#define SIO_NCT6779_ID 0xc560
102#define SIO_NCT6791_ID 0xc800
97#define SIO_ID_MASK 0xFFF0 103#define SIO_ID_MASK 0xFFF0
98 104
99enum pwm_enable { off, manual, thermal_cruise, speed_cruise, sf3, sf4 }; 105enum pwm_enable { off, manual, thermal_cruise, speed_cruise, sf3, sf4 };
@@ -167,7 +173,10 @@ superio_exit(int ioreg)
167#define NUM_TEMP 10 /* Max number of temp attribute sets w/ limits*/ 173#define NUM_TEMP 10 /* Max number of temp attribute sets w/ limits*/
168#define NUM_TEMP_FIXED 6 /* Max number of fixed temp attribute sets */ 174#define NUM_TEMP_FIXED 6 /* Max number of fixed temp attribute sets */
169 175
170#define NUM_REG_ALARM 4 /* Max number of alarm registers */ 176#define NUM_REG_ALARM 7 /* Max number of alarm registers */
177#define NUM_REG_BEEP 5 /* Max number of beep registers */
178
179#define NUM_FAN 6
171 180
172/* Common and NCT6775 specific data */ 181/* Common and NCT6775 specific data */
173 182
@@ -185,6 +194,7 @@ static const u16 NCT6775_REG_IN[] = {
185 194
186#define NCT6775_REG_VBAT 0x5D 195#define NCT6775_REG_VBAT 0x5D
187#define NCT6775_REG_DIODE 0x5E 196#define NCT6775_REG_DIODE 0x5E
197#define NCT6775_DIODE_MASK 0x02
188 198
189#define NCT6775_REG_FANDIV1 0x506 199#define NCT6775_REG_FANDIV1 0x506
190#define NCT6775_REG_FANDIV2 0x507 200#define NCT6775_REG_FANDIV2 0x507
@@ -193,7 +203,7 @@ static const u16 NCT6775_REG_IN[] = {
193 203
194static const u16 NCT6775_REG_ALARM[NUM_REG_ALARM] = { 0x459, 0x45A, 0x45B }; 204static const u16 NCT6775_REG_ALARM[NUM_REG_ALARM] = { 0x459, 0x45A, 0x45B };
195 205
196/* 0..15 voltages, 16..23 fans, 24..31 temperatures */ 206/* 0..15 voltages, 16..23 fans, 24..29 temperatures, 30..31 intrusion */
197 207
198static const s8 NCT6775_ALARM_BITS[] = { 208static const s8 NCT6775_ALARM_BITS[] = {
199 0, 1, 2, 3, 8, 21, 20, 16, /* in0.. in7 */ 209 0, 1, 2, 3, 8, 21, 20, 16, /* in0.. in7 */
@@ -208,6 +218,23 @@ static const s8 NCT6775_ALARM_BITS[] = {
208#define TEMP_ALARM_BASE 24 218#define TEMP_ALARM_BASE 24
209#define INTRUSION_ALARM_BASE 30 219#define INTRUSION_ALARM_BASE 30
210 220
221static const u16 NCT6775_REG_BEEP[NUM_REG_BEEP] = { 0x56, 0x57, 0x453, 0x4e };
222
223/*
224 * 0..14 voltages, 15 global beep enable, 16..23 fans, 24..29 temperatures,
225 * 30..31 intrusion
226 */
227static const s8 NCT6775_BEEP_BITS[] = {
228 0, 1, 2, 3, 8, 9, 10, 16, /* in0.. in7 */
229 17, -1, -1, -1, -1, -1, -1, /* in8..in14 */
230 21, /* global beep enable */
231 6, 7, 11, 28, -1, /* fan1..fan5 */
232 -1, -1, -1, /* unused */
233 4, 5, 13, -1, -1, -1, /* temp1..temp6 */
234 12, -1 }; /* intrusion0, intrusion1 */
235
236#define BEEP_ENABLE_BASE 15
237
211static const u8 NCT6775_REG_CR_CASEOPEN_CLR[] = { 0xe6, 0xee }; 238static const u8 NCT6775_REG_CR_CASEOPEN_CLR[] = { 0xe6, 0xee };
212static const u8 NCT6775_CR_CASEOPEN_CLR_MASK[] = { 0x20, 0x01 }; 239static const u8 NCT6775_CR_CASEOPEN_CLR_MASK[] = { 0x20, 0x01 };
213 240
@@ -217,27 +244,32 @@ static const u8 NCT6775_PWM_MODE_MASK[] = { 0x01, 0x02, 0x01 };
217 244
218/* Advanced Fan control, some values are common for all fans */ 245/* Advanced Fan control, some values are common for all fans */
219 246
220static const u16 NCT6775_REG_TARGET[] = { 0x101, 0x201, 0x301, 0x801, 0x901 }; 247static const u16 NCT6775_REG_TARGET[] = {
221static const u16 NCT6775_REG_FAN_MODE[] = { 0x102, 0x202, 0x302, 0x802, 0x902 }; 248 0x101, 0x201, 0x301, 0x801, 0x901, 0xa01 };
249static const u16 NCT6775_REG_FAN_MODE[] = {
250 0x102, 0x202, 0x302, 0x802, 0x902, 0xa02 };
222static const u16 NCT6775_REG_FAN_STEP_DOWN_TIME[] = { 251static const u16 NCT6775_REG_FAN_STEP_DOWN_TIME[] = {
223 0x103, 0x203, 0x303, 0x803, 0x903 }; 252 0x103, 0x203, 0x303, 0x803, 0x903, 0xa03 };
224static const u16 NCT6775_REG_FAN_STEP_UP_TIME[] = { 253static const u16 NCT6775_REG_FAN_STEP_UP_TIME[] = {
225 0x104, 0x204, 0x304, 0x804, 0x904 }; 254 0x104, 0x204, 0x304, 0x804, 0x904, 0xa04 };
226static const u16 NCT6775_REG_FAN_STOP_OUTPUT[] = { 255static const u16 NCT6775_REG_FAN_STOP_OUTPUT[] = {
227 0x105, 0x205, 0x305, 0x805, 0x905 }; 256 0x105, 0x205, 0x305, 0x805, 0x905, 0xa05 };
228static const u16 NCT6775_REG_FAN_START_OUTPUT[] 257static const u16 NCT6775_REG_FAN_START_OUTPUT[] = {
229 = { 0x106, 0x206, 0x306, 0x806, 0x906 }; 258 0x106, 0x206, 0x306, 0x806, 0x906, 0xa06 };
230static const u16 NCT6775_REG_FAN_MAX_OUTPUT[] = { 0x10a, 0x20a, 0x30a }; 259static const u16 NCT6775_REG_FAN_MAX_OUTPUT[] = { 0x10a, 0x20a, 0x30a };
231static const u16 NCT6775_REG_FAN_STEP_OUTPUT[] = { 0x10b, 0x20b, 0x30b }; 260static const u16 NCT6775_REG_FAN_STEP_OUTPUT[] = { 0x10b, 0x20b, 0x30b };
232 261
233static const u16 NCT6775_REG_FAN_STOP_TIME[] = { 262static const u16 NCT6775_REG_FAN_STOP_TIME[] = {
234 0x107, 0x207, 0x307, 0x807, 0x907 }; 263 0x107, 0x207, 0x307, 0x807, 0x907, 0xa07 };
235static const u16 NCT6775_REG_PWM[] = { 0x109, 0x209, 0x309, 0x809, 0x909 }; 264static const u16 NCT6775_REG_PWM[] = {
236static const u16 NCT6775_REG_PWM_READ[] = { 0x01, 0x03, 0x11, 0x13, 0x15 }; 265 0x109, 0x209, 0x309, 0x809, 0x909, 0xa09 };
266static const u16 NCT6775_REG_PWM_READ[] = {
267 0x01, 0x03, 0x11, 0x13, 0x15, 0xa09 };
237 268
238static const u16 NCT6775_REG_FAN[] = { 0x630, 0x632, 0x634, 0x636, 0x638 }; 269static const u16 NCT6775_REG_FAN[] = { 0x630, 0x632, 0x634, 0x636, 0x638 };
239static const u16 NCT6775_REG_FAN_MIN[] = { 0x3b, 0x3c, 0x3d }; 270static const u16 NCT6775_REG_FAN_MIN[] = { 0x3b, 0x3c, 0x3d };
240static const u16 NCT6775_REG_FAN_PULSES[] = { 0x641, 0x642, 0x643, 0x644, 0 }; 271static const u16 NCT6775_REG_FAN_PULSES[] = { 0x641, 0x642, 0x643, 0x644, 0 };
272static const u16 NCT6775_FAN_PULSE_SHIFT[] = { 0, 0, 0, 0, 0, 0 };
241 273
242static const u16 NCT6775_REG_TEMP[] = { 274static const u16 NCT6775_REG_TEMP[] = {
243 0x27, 0x150, 0x250, 0x62b, 0x62c, 0x62d }; 275 0x27, 0x150, 0x250, 0x62b, 0x62c, 0x62d };
@@ -253,25 +285,25 @@ static const u16 NCT6775_REG_TEMP_SOURCE[ARRAY_SIZE(NCT6775_REG_TEMP)] = {
253 0x621, 0x622, 0x623, 0x624, 0x625, 0x626 }; 285 0x621, 0x622, 0x623, 0x624, 0x625, 0x626 };
254 286
255static const u16 NCT6775_REG_TEMP_SEL[] = { 287static const u16 NCT6775_REG_TEMP_SEL[] = {
256 0x100, 0x200, 0x300, 0x800, 0x900 }; 288 0x100, 0x200, 0x300, 0x800, 0x900, 0xa00 };
257 289
258static const u16 NCT6775_REG_WEIGHT_TEMP_SEL[] = { 290static const u16 NCT6775_REG_WEIGHT_TEMP_SEL[] = {
259 0x139, 0x239, 0x339, 0x839, 0x939 }; 291 0x139, 0x239, 0x339, 0x839, 0x939, 0xa39 };
260static const u16 NCT6775_REG_WEIGHT_TEMP_STEP[] = { 292static const u16 NCT6775_REG_WEIGHT_TEMP_STEP[] = {
261 0x13a, 0x23a, 0x33a, 0x83a, 0x93a }; 293 0x13a, 0x23a, 0x33a, 0x83a, 0x93a, 0xa3a };
262static const u16 NCT6775_REG_WEIGHT_TEMP_STEP_TOL[] = { 294static const u16 NCT6775_REG_WEIGHT_TEMP_STEP_TOL[] = {
263 0x13b, 0x23b, 0x33b, 0x83b, 0x93b }; 295 0x13b, 0x23b, 0x33b, 0x83b, 0x93b, 0xa3b };
264static const u16 NCT6775_REG_WEIGHT_DUTY_STEP[] = { 296static const u16 NCT6775_REG_WEIGHT_DUTY_STEP[] = {
265 0x13c, 0x23c, 0x33c, 0x83c, 0x93c }; 297 0x13c, 0x23c, 0x33c, 0x83c, 0x93c, 0xa3c };
266static const u16 NCT6775_REG_WEIGHT_TEMP_BASE[] = { 298static const u16 NCT6775_REG_WEIGHT_TEMP_BASE[] = {
267 0x13d, 0x23d, 0x33d, 0x83d, 0x93d }; 299 0x13d, 0x23d, 0x33d, 0x83d, 0x93d, 0xa3d };
268 300
269static const u16 NCT6775_REG_TEMP_OFFSET[] = { 0x454, 0x455, 0x456 }; 301static const u16 NCT6775_REG_TEMP_OFFSET[] = { 0x454, 0x455, 0x456 };
270 302
271static const u16 NCT6775_REG_AUTO_TEMP[] = { 303static const u16 NCT6775_REG_AUTO_TEMP[] = {
272 0x121, 0x221, 0x321, 0x821, 0x921 }; 304 0x121, 0x221, 0x321, 0x821, 0x921, 0xa21 };
273static const u16 NCT6775_REG_AUTO_PWM[] = { 305static const u16 NCT6775_REG_AUTO_PWM[] = {
274 0x127, 0x227, 0x327, 0x827, 0x927 }; 306 0x127, 0x227, 0x327, 0x827, 0x927, 0xa27 };
275 307
276#define NCT6775_AUTO_TEMP(data, nr, p) ((data)->REG_AUTO_TEMP[nr] + (p)) 308#define NCT6775_AUTO_TEMP(data, nr, p) ((data)->REG_AUTO_TEMP[nr] + (p))
277#define NCT6775_AUTO_PWM(data, nr, p) ((data)->REG_AUTO_PWM[nr] + (p)) 309#define NCT6775_AUTO_PWM(data, nr, p) ((data)->REG_AUTO_PWM[nr] + (p))
@@ -279,9 +311,9 @@ static const u16 NCT6775_REG_AUTO_PWM[] = {
279static const u16 NCT6775_REG_CRITICAL_ENAB[] = { 0x134, 0x234, 0x334 }; 311static const u16 NCT6775_REG_CRITICAL_ENAB[] = { 0x134, 0x234, 0x334 };
280 312
281static const u16 NCT6775_REG_CRITICAL_TEMP[] = { 313static const u16 NCT6775_REG_CRITICAL_TEMP[] = {
282 0x135, 0x235, 0x335, 0x835, 0x935 }; 314 0x135, 0x235, 0x335, 0x835, 0x935, 0xa35 };
283static const u16 NCT6775_REG_CRITICAL_TEMP_TOLERANCE[] = { 315static const u16 NCT6775_REG_CRITICAL_TEMP_TOLERANCE[] = {
284 0x138, 0x238, 0x338, 0x838, 0x938 }; 316 0x138, 0x238, 0x338, 0x838, 0x938, 0xa38 };
285 317
286static const char *const nct6775_temp_label[] = { 318static const char *const nct6775_temp_label[] = {
287 "", 319 "",
@@ -325,17 +357,28 @@ static const s8 NCT6776_ALARM_BITS[] = {
325 4, 5, 13, -1, -1, -1, /* temp1..temp6 */ 357 4, 5, 13, -1, -1, -1, /* temp1..temp6 */
326 12, 9 }; /* intrusion0, intrusion1 */ 358 12, 9 }; /* intrusion0, intrusion1 */
327 359
360static const u16 NCT6776_REG_BEEP[NUM_REG_BEEP] = { 0xb2, 0xb3, 0xb4, 0xb5 };
361
362static const s8 NCT6776_BEEP_BITS[] = {
363 0, 1, 2, 3, 4, 5, 6, 7, /* in0.. in7 */
364 8, -1, -1, -1, -1, -1, -1, /* in8..in14 */
365 24, /* global beep enable */
366 25, 26, 27, 28, 29, /* fan1..fan5 */
367 -1, -1, -1, /* unused */
368 16, 17, 18, 19, 20, 21, /* temp1..temp6 */
369 30, 31 }; /* intrusion0, intrusion1 */
370
328static const u16 NCT6776_REG_TOLERANCE_H[] = { 371static const u16 NCT6776_REG_TOLERANCE_H[] = {
329 0x10c, 0x20c, 0x30c, 0x80c, 0x90c }; 372 0x10c, 0x20c, 0x30c, 0x80c, 0x90c, 0xa0c };
330 373
331static const u8 NCT6776_REG_PWM_MODE[] = { 0x04, 0, 0 }; 374static const u8 NCT6776_REG_PWM_MODE[] = { 0x04, 0, 0, 0, 0, 0 };
332static const u8 NCT6776_PWM_MODE_MASK[] = { 0x01, 0, 0 }; 375static const u8 NCT6776_PWM_MODE_MASK[] = { 0x01, 0, 0, 0, 0, 0 };
333 376
334static const u16 NCT6776_REG_FAN_MIN[] = { 0x63a, 0x63c, 0x63e, 0x640, 0x642 }; 377static const u16 NCT6776_REG_FAN_MIN[] = { 0x63a, 0x63c, 0x63e, 0x640, 0x642 };
335static const u16 NCT6776_REG_FAN_PULSES[] = { 0x644, 0x645, 0x646, 0, 0 }; 378static const u16 NCT6776_REG_FAN_PULSES[] = { 0x644, 0x645, 0x646, 0, 0 };
336 379
337static const u16 NCT6776_REG_WEIGHT_DUTY_BASE[] = { 380static const u16 NCT6776_REG_WEIGHT_DUTY_BASE[] = {
338 0x13e, 0x23e, 0x33e, 0x83e, 0x93e }; 381 0x13e, 0x23e, 0x33e, 0x83e, 0x93e, 0xa3e };
339 382
340static const u16 NCT6776_REG_TEMP_CONFIG[ARRAY_SIZE(NCT6775_REG_TEMP)] = { 383static const u16 NCT6776_REG_TEMP_CONFIG[ARRAY_SIZE(NCT6775_REG_TEMP)] = {
341 0x18, 0x152, 0x252, 0x628, 0x629, 0x62A }; 384 0x18, 0x152, 0x252, 0x628, 0x629, 0x62A };
@@ -390,14 +433,25 @@ static const s8 NCT6779_ALARM_BITS[] = {
390 4, 5, 13, -1, -1, -1, /* temp1..temp6 */ 433 4, 5, 13, -1, -1, -1, /* temp1..temp6 */
391 12, 9 }; /* intrusion0, intrusion1 */ 434 12, 9 }; /* intrusion0, intrusion1 */
392 435
393static const u16 NCT6779_REG_FAN[] = { 0x4b0, 0x4b2, 0x4b4, 0x4b6, 0x4b8 }; 436static const s8 NCT6779_BEEP_BITS[] = {
437 0, 1, 2, 3, 4, 5, 6, 7, /* in0.. in7 */
438 8, 9, 10, 11, 12, 13, 14, /* in8..in14 */
439 24, /* global beep enable */
440 25, 26, 27, 28, 29, /* fan1..fan5 */
441 -1, -1, -1, /* unused */
442 16, 17, -1, -1, -1, -1, /* temp1..temp6 */
443 30, 31 }; /* intrusion0, intrusion1 */
444
445static const u16 NCT6779_REG_FAN[] = {
446 0x4b0, 0x4b2, 0x4b4, 0x4b6, 0x4b8, 0x4ba };
394static const u16 NCT6779_REG_FAN_PULSES[] = { 447static const u16 NCT6779_REG_FAN_PULSES[] = {
395 0x644, 0x645, 0x646, 0x647, 0x648 }; 448 0x644, 0x645, 0x646, 0x647, 0x648, 0x649 };
396 449
397static const u16 NCT6779_REG_CRITICAL_PWM_ENABLE[] = { 450static const u16 NCT6779_REG_CRITICAL_PWM_ENABLE[] = {
398 0x136, 0x236, 0x336, 0x836, 0x936 }; 451 0x136, 0x236, 0x336, 0x836, 0x936, 0xa36 };
452#define NCT6779_CRITICAL_PWM_ENABLE_MASK 0x01
399static const u16 NCT6779_REG_CRITICAL_PWM[] = { 453static const u16 NCT6779_REG_CRITICAL_PWM[] = {
400 0x137, 0x237, 0x337, 0x837, 0x937 }; 454 0x137, 0x237, 0x337, 0x837, 0x937, 0xa37 };
401 455
402static const u16 NCT6779_REG_TEMP[] = { 0x27, 0x150 }; 456static const u16 NCT6779_REG_TEMP[] = { 0x27, 0x150 };
403static const u16 NCT6779_REG_TEMP_CONFIG[ARRAY_SIZE(NCT6779_REG_TEMP)] = { 457static const u16 NCT6779_REG_TEMP_CONFIG[ARRAY_SIZE(NCT6779_REG_TEMP)] = {
@@ -449,6 +503,122 @@ static const u16 NCT6779_REG_TEMP_ALTERNATE[ARRAY_SIZE(nct6779_temp_label) - 1]
449static const u16 NCT6779_REG_TEMP_CRIT[ARRAY_SIZE(nct6779_temp_label) - 1] 503static const u16 NCT6779_REG_TEMP_CRIT[ARRAY_SIZE(nct6779_temp_label) - 1]
450 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x709, 0x70a }; 504 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x709, 0x70a };
451 505
506/* NCT6791 specific data */
507
508#define NCT6791_REG_HM_IO_SPACE_LOCK_ENABLE 0x28
509
510static const u16 NCT6791_REG_ALARM[NUM_REG_ALARM] = {
511 0x459, 0x45A, 0x45B, 0x568, 0x45D };
512
513static const s8 NCT6791_ALARM_BITS[] = {
514 0, 1, 2, 3, 8, 21, 20, 16, /* in0.. in7 */
515 17, 24, 25, 26, 27, 28, 29, /* in8..in14 */
516 -1, /* unused */
517 6, 7, 11, 10, 23, 33, /* fan1..fan6 */
518 -1, -1, /* unused */
519 4, 5, 13, -1, -1, -1, /* temp1..temp6 */
520 12, 9 }; /* intrusion0, intrusion1 */
521
522
523/* NCT6102D/NCT6106D specific data */
524
525#define NCT6106_REG_VBAT 0x318
526#define NCT6106_REG_DIODE 0x319
527#define NCT6106_DIODE_MASK 0x01
528
529static const u16 NCT6106_REG_IN_MAX[] = {
530 0x90, 0x92, 0x94, 0x96, 0x98, 0x9a, 0x9e, 0xa0, 0xa2 };
531static const u16 NCT6106_REG_IN_MIN[] = {
532 0x91, 0x93, 0x95, 0x97, 0x99, 0x9b, 0x9f, 0xa1, 0xa3 };
533static const u16 NCT6106_REG_IN[] = {
534 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x07, 0x08, 0x09 };
535
536static const u16 NCT6106_REG_TEMP[] = { 0x10, 0x11, 0x12, 0x13, 0x14, 0x15 };
537static const u16 NCT6106_REG_TEMP_HYST[] = {
538 0xc3, 0xc7, 0xcb, 0xcf, 0xd3, 0xd7 };
539static const u16 NCT6106_REG_TEMP_OVER[] = {
540 0xc2, 0xc6, 0xca, 0xce, 0xd2, 0xd6 };
541static const u16 NCT6106_REG_TEMP_CRIT_L[] = {
542 0xc0, 0xc4, 0xc8, 0xcc, 0xd0, 0xd4 };
543static const u16 NCT6106_REG_TEMP_CRIT_H[] = {
544 0xc1, 0xc5, 0xc9, 0xcf, 0xd1, 0xd5 };
545static const u16 NCT6106_REG_TEMP_OFFSET[] = { 0x311, 0x312, 0x313 };
546static const u16 NCT6106_REG_TEMP_CONFIG[] = {
547 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc };
548
549static const u16 NCT6106_REG_FAN[] = { 0x20, 0x22, 0x24 };
550static const u16 NCT6106_REG_FAN_MIN[] = { 0xe0, 0xe2, 0xe4 };
551static const u16 NCT6106_REG_FAN_PULSES[] = { 0xf6, 0xf6, 0xf6, 0, 0 };
552static const u16 NCT6106_FAN_PULSE_SHIFT[] = { 0, 2, 4, 0, 0 };
553
554static const u8 NCT6106_REG_PWM_MODE[] = { 0xf3, 0xf3, 0xf3 };
555static const u8 NCT6106_PWM_MODE_MASK[] = { 0x01, 0x02, 0x04 };
556static const u16 NCT6106_REG_PWM[] = { 0x119, 0x129, 0x139 };
557static const u16 NCT6106_REG_PWM_READ[] = { 0x4a, 0x4b, 0x4c };
558static const u16 NCT6106_REG_FAN_MODE[] = { 0x113, 0x123, 0x133 };
559static const u16 NCT6106_REG_TEMP_SEL[] = { 0x110, 0x120, 0x130 };
560static const u16 NCT6106_REG_TEMP_SOURCE[] = {
561 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5 };
562
563static const u16 NCT6106_REG_CRITICAL_TEMP[] = { 0x11a, 0x12a, 0x13a };
564static const u16 NCT6106_REG_CRITICAL_TEMP_TOLERANCE[] = {
565 0x11b, 0x12b, 0x13b };
566
567static const u16 NCT6106_REG_CRITICAL_PWM_ENABLE[] = { 0x11c, 0x12c, 0x13c };
568#define NCT6106_CRITICAL_PWM_ENABLE_MASK 0x10
569static const u16 NCT6106_REG_CRITICAL_PWM[] = { 0x11d, 0x12d, 0x13d };
570
571static const u16 NCT6106_REG_FAN_STEP_UP_TIME[] = { 0x114, 0x124, 0x134 };
572static const u16 NCT6106_REG_FAN_STEP_DOWN_TIME[] = { 0x115, 0x125, 0x135 };
573static const u16 NCT6106_REG_FAN_STOP_OUTPUT[] = { 0x116, 0x126, 0x136 };
574static const u16 NCT6106_REG_FAN_START_OUTPUT[] = { 0x117, 0x127, 0x137 };
575static const u16 NCT6106_REG_FAN_STOP_TIME[] = { 0x118, 0x128, 0x138 };
576static const u16 NCT6106_REG_TOLERANCE_H[] = { 0x112, 0x122, 0x132 };
577
578static const u16 NCT6106_REG_TARGET[] = { 0x111, 0x121, 0x131 };
579
580static const u16 NCT6106_REG_WEIGHT_TEMP_SEL[] = { 0x168, 0x178, 0x188 };
581static const u16 NCT6106_REG_WEIGHT_TEMP_STEP[] = { 0x169, 0x179, 0x189 };
582static const u16 NCT6106_REG_WEIGHT_TEMP_STEP_TOL[] = { 0x16a, 0x17a, 0x18a };
583static const u16 NCT6106_REG_WEIGHT_DUTY_STEP[] = { 0x16b, 0x17b, 0x17c };
584static const u16 NCT6106_REG_WEIGHT_TEMP_BASE[] = { 0x16c, 0x17c, 0x18c };
585static const u16 NCT6106_REG_WEIGHT_DUTY_BASE[] = { 0x16d, 0x17d, 0x18d };
586
587static const u16 NCT6106_REG_AUTO_TEMP[] = { 0x160, 0x170, 0x180 };
588static const u16 NCT6106_REG_AUTO_PWM[] = { 0x164, 0x174, 0x184 };
589
590static const u16 NCT6106_REG_ALARM[NUM_REG_ALARM] = {
591 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d };
592
593static const s8 NCT6106_ALARM_BITS[] = {
594 0, 1, 2, 3, 4, 5, 7, 8, /* in0.. in7 */
595 9, -1, -1, -1, -1, -1, -1, /* in8..in14 */
596 -1, /* unused */
597 32, 33, 34, -1, -1, /* fan1..fan5 */
598 -1, -1, -1, /* unused */
599 16, 17, 18, 19, 20, 21, /* temp1..temp6 */
600 48, -1 /* intrusion0, intrusion1 */
601};
602
603static const u16 NCT6106_REG_BEEP[NUM_REG_BEEP] = {
604 0x3c0, 0x3c1, 0x3c2, 0x3c3, 0x3c4 };
605
606static const s8 NCT6106_BEEP_BITS[] = {
607 0, 1, 2, 3, 4, 5, 7, 8, /* in0.. in7 */
608 9, 10, 11, 12, -1, -1, -1, /* in8..in14 */
609 32, /* global beep enable */
610 24, 25, 26, 27, 28, /* fan1..fan5 */
611 -1, -1, -1, /* unused */
612 16, 17, 18, 19, 20, 21, /* temp1..temp6 */
613 34, -1 /* intrusion0, intrusion1 */
614};
615
616static const u16 NCT6106_REG_TEMP_ALTERNATE[ARRAY_SIZE(nct6776_temp_label) - 1]
617 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x51, 0x52, 0x54 };
618
619static const u16 NCT6106_REG_TEMP_CRIT[ARRAY_SIZE(nct6776_temp_label) - 1]
620 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x204, 0x205 };
621
452static enum pwm_enable reg_to_pwm_enable(int pwm, int mode) 622static enum pwm_enable reg_to_pwm_enable(int pwm, int mode)
453{ 623{
454 if (mode == 0 && pwm == 255) 624 if (mode == 0 && pwm == 255)
@@ -550,13 +720,18 @@ static inline u8 in_to_reg(u32 val, u8 nr)
550 720
551struct nct6775_data { 721struct nct6775_data {
552 int addr; /* IO base of hw monitor block */ 722 int addr; /* IO base of hw monitor block */
723 int sioreg; /* SIO register address */
553 enum kinds kind; 724 enum kinds kind;
554 const char *name; 725 const char *name;
555 726
556 struct device *hwmon_dev; 727 struct device *hwmon_dev;
728 struct attribute_group *group_in;
729 struct attribute_group *group_fan;
730 struct attribute_group *group_temp;
731 struct attribute_group *group_pwm;
557 732
558 u16 reg_temp[4][NUM_TEMP]; /* 0=temp, 1=temp_over, 2=temp_hyst, 733 u16 reg_temp[5][NUM_TEMP]; /* 0=temp, 1=temp_over, 2=temp_hyst,
559 * 3=temp_crit 734 * 3=temp_crit, 4=temp_lcrit
560 */ 735 */
561 u8 temp_src[NUM_TEMP]; 736 u8 temp_src[NUM_TEMP];
562 u16 reg_temp_config[NUM_TEMP]; 737 u16 reg_temp_config[NUM_TEMP];
@@ -566,8 +741,10 @@ struct nct6775_data {
566 u16 REG_CONFIG; 741 u16 REG_CONFIG;
567 u16 REG_VBAT; 742 u16 REG_VBAT;
568 u16 REG_DIODE; 743 u16 REG_DIODE;
744 u8 DIODE_MASK;
569 745
570 const s8 *ALARM_BITS; 746 const s8 *ALARM_BITS;
747 const s8 *BEEP_BITS;
571 748
572 const u16 *REG_VIN; 749 const u16 *REG_VIN;
573 const u16 *REG_IN_MINMAX[2]; 750 const u16 *REG_IN_MINMAX[2];
@@ -577,6 +754,7 @@ struct nct6775_data {
577 const u16 *REG_FAN_MODE; 754 const u16 *REG_FAN_MODE;
578 const u16 *REG_FAN_MIN; 755 const u16 *REG_FAN_MIN;
579 const u16 *REG_FAN_PULSES; 756 const u16 *REG_FAN_PULSES;
757 const u16 *FAN_PULSE_SHIFT;
580 const u16 *REG_FAN_TIME[3]; 758 const u16 *REG_FAN_TIME[3];
581 759
582 const u16 *REG_TOLERANCE_H; 760 const u16 *REG_TOLERANCE_H;
@@ -590,6 +768,10 @@ struct nct6775_data {
590 */ 768 */
591 const u16 *REG_PWM_READ; 769 const u16 *REG_PWM_READ;
592 770
771 const u16 *REG_CRITICAL_PWM_ENABLE;
772 u8 CRITICAL_PWM_ENABLE_MASK;
773 const u16 *REG_CRITICAL_PWM;
774
593 const u16 *REG_AUTO_TEMP; 775 const u16 *REG_AUTO_TEMP;
594 const u16 *REG_AUTO_PWM; 776 const u16 *REG_AUTO_PWM;
595 777
@@ -604,6 +786,7 @@ struct nct6775_data {
604 const u16 *REG_TEMP_OFFSET; 786 const u16 *REG_TEMP_OFFSET;
605 787
606 const u16 *REG_ALARM; 788 const u16 *REG_ALARM;
789 const u16 *REG_BEEP;
607 790
608 unsigned int (*fan_from_reg)(u16 reg, unsigned int divreg); 791 unsigned int (*fan_from_reg)(u16 reg, unsigned int divreg);
609 unsigned int (*fan_from_reg_min)(u16 reg, unsigned int divreg); 792 unsigned int (*fan_from_reg_min)(u16 reg, unsigned int divreg);
@@ -616,26 +799,30 @@ struct nct6775_data {
616 u8 bank; /* current register bank */ 799 u8 bank; /* current register bank */
617 u8 in_num; /* number of in inputs we have */ 800 u8 in_num; /* number of in inputs we have */
618 u8 in[15][3]; /* [0]=in, [1]=in_max, [2]=in_min */ 801 u8 in[15][3]; /* [0]=in, [1]=in_max, [2]=in_min */
619 unsigned int rpm[5]; 802 unsigned int rpm[NUM_FAN];
620 u16 fan_min[5]; 803 u16 fan_min[NUM_FAN];
621 u8 fan_pulses[5]; 804 u8 fan_pulses[NUM_FAN];
622 u8 fan_div[5]; 805 u8 fan_div[NUM_FAN];
623 u8 has_pwm; 806 u8 has_pwm;
624 u8 has_fan; /* some fan inputs can be disabled */ 807 u8 has_fan; /* some fan inputs can be disabled */
625 u8 has_fan_min; /* some fans don't have min register */ 808 u8 has_fan_min; /* some fans don't have min register */
626 bool has_fan_div; 809 bool has_fan_div;
627 810
628 u8 num_temp_alarms; /* 2 or 3 */ 811 u8 num_temp_alarms; /* 2, 3, or 6 */
812 u8 num_temp_beeps; /* 2, 3, or 6 */
629 u8 temp_fixed_num; /* 3 or 6 */ 813 u8 temp_fixed_num; /* 3 or 6 */
630 u8 temp_type[NUM_TEMP_FIXED]; 814 u8 temp_type[NUM_TEMP_FIXED];
631 s8 temp_offset[NUM_TEMP_FIXED]; 815 s8 temp_offset[NUM_TEMP_FIXED];
632 s16 temp[4][NUM_TEMP]; /* 0=temp, 1=temp_over, 2=temp_hyst, 816 s16 temp[5][NUM_TEMP]; /* 0=temp, 1=temp_over, 2=temp_hyst,
633 * 3=temp_crit */ 817 * 3=temp_crit, 4=temp_lcrit */
634 u64 alarms; 818 u64 alarms;
819 u64 beeps;
635 820
636 u8 pwm_num; /* number of pwm */ 821 u8 pwm_num; /* number of pwm */
637 u8 pwm_mode[5]; /* 1->DC variable voltage, 0->PWM variable duty cycle */ 822 u8 pwm_mode[NUM_FAN]; /* 1->DC variable voltage,
638 enum pwm_enable pwm_enable[5]; 823 * 0->PWM variable duty cycle
824 */
825 enum pwm_enable pwm_enable[NUM_FAN];
639 /* 0->off 826 /* 0->off
640 * 1->manual 827 * 1->manual
641 * 2->thermal cruise mode (also called SmartFan I) 828 * 2->thermal cruise mode (also called SmartFan I)
@@ -643,35 +830,37 @@ struct nct6775_data {
643 * 4->SmartFan III 830 * 4->SmartFan III
644 * 5->enhanced variable thermal cruise (SmartFan IV) 831 * 5->enhanced variable thermal cruise (SmartFan IV)
645 */ 832 */
646 u8 pwm[7][5]; /* [0]=pwm, [1]=pwm_start, [2]=pwm_floor, 833 u8 pwm[7][NUM_FAN]; /* [0]=pwm, [1]=pwm_start, [2]=pwm_floor,
647 * [3]=pwm_max, [4]=pwm_step, 834 * [3]=pwm_max, [4]=pwm_step,
648 * [5]=weight_duty_step, [6]=weight_duty_base 835 * [5]=weight_duty_step, [6]=weight_duty_base
649 */ 836 */
650 837
651 u8 target_temp[5]; 838 u8 target_temp[NUM_FAN];
652 u8 target_temp_mask; 839 u8 target_temp_mask;
653 u32 target_speed[5]; 840 u32 target_speed[NUM_FAN];
654 u32 target_speed_tolerance[5]; 841 u32 target_speed_tolerance[NUM_FAN];
655 u8 speed_tolerance_limit; 842 u8 speed_tolerance_limit;
656 843
657 u8 temp_tolerance[2][5]; 844 u8 temp_tolerance[2][NUM_FAN];
658 u8 tolerance_mask; 845 u8 tolerance_mask;
659 846
660 u8 fan_time[3][5]; /* 0 = stop_time, 1 = step_up, 2 = step_down */ 847 u8 fan_time[3][NUM_FAN]; /* 0 = stop_time, 1 = step_up, 2 = step_down */
661 848
662 /* Automatic fan speed control registers */ 849 /* Automatic fan speed control registers */
663 int auto_pwm_num; 850 int auto_pwm_num;
664 u8 auto_pwm[5][7]; 851 u8 auto_pwm[NUM_FAN][7];
665 u8 auto_temp[5][7]; 852 u8 auto_temp[NUM_FAN][7];
666 u8 pwm_temp_sel[5]; 853 u8 pwm_temp_sel[NUM_FAN];
667 u8 pwm_weight_temp_sel[5]; 854 u8 pwm_weight_temp_sel[NUM_FAN];
668 u8 weight_temp[3][5]; /* 0->temp_step, 1->temp_step_tol, 855 u8 weight_temp[3][NUM_FAN]; /* 0->temp_step, 1->temp_step_tol,
669 * 2->temp_base 856 * 2->temp_base
670 */ 857 */
671 858
672 u8 vid; 859 u8 vid;
673 u8 vrm; 860 u8 vrm;
674 861
862 bool have_vid;
863
675 u16 have_temp; 864 u16 have_temp;
676 u16 have_temp_fixed; 865 u16 have_temp_fixed;
677 u16 have_in; 866 u16 have_in;
@@ -688,9 +877,145 @@ struct nct6775_sio_data {
688 enum kinds kind; 877 enum kinds kind;
689}; 878};
690 879
880struct sensor_device_template {
881 struct device_attribute dev_attr;
882 union {
883 struct {
884 u8 nr;
885 u8 index;
886 } s;
887 int index;
888 } u;
889 bool s2; /* true if both index and nr are used */
890};
891
892struct sensor_device_attr_u {
893 union {
894 struct sensor_device_attribute a1;
895 struct sensor_device_attribute_2 a2;
896 } u;
897 char name[32];
898};
899
900#define __TEMPLATE_ATTR(_template, _mode, _show, _store) { \
901 .attr = {.name = _template, .mode = _mode }, \
902 .show = _show, \
903 .store = _store, \
904}
905
906#define SENSOR_DEVICE_TEMPLATE(_template, _mode, _show, _store, _index) \
907 { .dev_attr = __TEMPLATE_ATTR(_template, _mode, _show, _store), \
908 .u.index = _index, \
909 .s2 = false }
910
911#define SENSOR_DEVICE_TEMPLATE_2(_template, _mode, _show, _store, \
912 _nr, _index) \
913 { .dev_attr = __TEMPLATE_ATTR(_template, _mode, _show, _store), \
914 .u.s.index = _index, \
915 .u.s.nr = _nr, \
916 .s2 = true }
917
918#define SENSOR_TEMPLATE(_name, _template, _mode, _show, _store, _index) \
919static struct sensor_device_template sensor_dev_template_##_name \
920 = SENSOR_DEVICE_TEMPLATE(_template, _mode, _show, _store, \
921 _index)
922
923#define SENSOR_TEMPLATE_2(_name, _template, _mode, _show, _store, \
924 _nr, _index) \
925static struct sensor_device_template sensor_dev_template_##_name \
926 = SENSOR_DEVICE_TEMPLATE_2(_template, _mode, _show, _store, \
927 _nr, _index)
928
929struct sensor_template_group {
930 struct sensor_device_template **templates;
931 umode_t (*is_visible)(struct kobject *, struct attribute *, int);
932 int base;
933};
934
935static struct attribute_group *
936nct6775_create_attr_group(struct device *dev, struct sensor_template_group *tg,
937 int repeat)
938{
939 struct attribute_group *group;
940 struct sensor_device_attr_u *su;
941 struct sensor_device_attribute *a;
942 struct sensor_device_attribute_2 *a2;
943 struct attribute **attrs;
944 struct sensor_device_template **t;
945 int err, i, j, count;
946
947 if (repeat <= 0)
948 return ERR_PTR(-EINVAL);
949
950 t = tg->templates;
951 for (count = 0; *t; t++, count++)
952 ;
953
954 if (count == 0)
955 return ERR_PTR(-EINVAL);
956
957 group = devm_kzalloc(dev, sizeof(*group), GFP_KERNEL);
958 if (group == NULL)
959 return ERR_PTR(-ENOMEM);
960
961 attrs = devm_kzalloc(dev, sizeof(*attrs) * (repeat * count + 1),
962 GFP_KERNEL);
963 if (attrs == NULL)
964 return ERR_PTR(-ENOMEM);
965
966 su = devm_kzalloc(dev, sizeof(*su) * repeat * count,
967 GFP_KERNEL);
968 if (su == NULL)
969 return ERR_PTR(-ENOMEM);
970
971 group->attrs = attrs;
972 group->is_visible = tg->is_visible;
973
974 for (i = 0; i < repeat; i++) {
975 t = tg->templates;
976 for (j = 0; *t != NULL; j++) {
977 snprintf(su->name, sizeof(su->name),
978 (*t)->dev_attr.attr.name, tg->base + i);
979 if ((*t)->s2) {
980 a2 = &su->u.a2;
981 a2->dev_attr.attr.name = su->name;
982 a2->nr = (*t)->u.s.nr + i;
983 a2->index = (*t)->u.s.index;
984 a2->dev_attr.attr.mode =
985 (*t)->dev_attr.attr.mode;
986 a2->dev_attr.show = (*t)->dev_attr.show;
987 a2->dev_attr.store = (*t)->dev_attr.store;
988 *attrs = &a2->dev_attr.attr;
989 } else {
990 a = &su->u.a1;
991 a->dev_attr.attr.name = su->name;
992 a->index = (*t)->u.index + i;
993 a->dev_attr.attr.mode =
994 (*t)->dev_attr.attr.mode;
995 a->dev_attr.show = (*t)->dev_attr.show;
996 a->dev_attr.store = (*t)->dev_attr.store;
997 *attrs = &a->dev_attr.attr;
998 }
999 attrs++;
1000 su++;
1001 t++;
1002 }
1003 }
1004
1005 err = sysfs_create_group(&dev->kobj, group);
1006 if (err)
1007 return ERR_PTR(-ENOMEM);
1008
1009 return group;
1010}
1011
691static bool is_word_sized(struct nct6775_data *data, u16 reg) 1012static bool is_word_sized(struct nct6775_data *data, u16 reg)
692{ 1013{
693 switch (data->kind) { 1014 switch (data->kind) {
1015 case nct6106:
1016 return reg == 0x20 || reg == 0x22 || reg == 0x24 ||
1017 reg == 0xe0 || reg == 0xe2 || reg == 0xe4 ||
1018 reg == 0x111 || reg == 0x121 || reg == 0x131;
694 case nct6775: 1019 case nct6775:
695 return (((reg & 0xff00) == 0x100 || 1020 return (((reg & 0xff00) == 0x100 ||
696 (reg & 0xff00) == 0x200) && 1021 (reg & 0xff00) == 0x200) &&
@@ -714,8 +1039,9 @@ static bool is_word_sized(struct nct6775_data *data, u16 reg)
714 ((reg & 0xfff0) == 0x650 && (reg & 0x000f) >= 0x06) || 1039 ((reg & 0xfff0) == 0x650 && (reg & 0x000f) >= 0x06) ||
715 reg == 0x73 || reg == 0x75 || reg == 0x77; 1040 reg == 0x73 || reg == 0x75 || reg == 0x77;
716 case nct6779: 1041 case nct6779:
1042 case nct6791:
717 return reg == 0x150 || reg == 0x153 || reg == 0x155 || 1043 return reg == 0x150 || reg == 0x153 || reg == 0x155 ||
718 ((reg & 0xfff0) == 0x4b0 && (reg & 0x000f) < 0x09) || 1044 ((reg & 0xfff0) == 0x4b0 && (reg & 0x000f) < 0x0b) ||
719 reg == 0x402 || 1045 reg == 0x402 ||
720 reg == 0x63a || reg == 0x63c || reg == 0x63e || 1046 reg == 0x63a || reg == 0x63c || reg == 0x63e ||
721 reg == 0x640 || reg == 0x642 || 1047 reg == 0x640 || reg == 0x642 ||
@@ -1056,15 +1382,17 @@ static void nct6775_update_pwm_limits(struct device *dev)
1056 case nct6776: 1382 case nct6776:
1057 data->auto_pwm[i][data->auto_pwm_num] = 0xff; 1383 data->auto_pwm[i][data->auto_pwm_num] = 0xff;
1058 break; 1384 break;
1385 case nct6106:
1059 case nct6779: 1386 case nct6779:
1387 case nct6791:
1060 reg = nct6775_read_value(data, 1388 reg = nct6775_read_value(data,
1061 NCT6779_REG_CRITICAL_PWM_ENABLE[i]); 1389 data->REG_CRITICAL_PWM_ENABLE[i]);
1062 if (reg & 1) 1390 if (reg & data->CRITICAL_PWM_ENABLE_MASK)
1063 data->auto_pwm[i][data->auto_pwm_num] = 1391 reg = nct6775_read_value(data,
1064 nct6775_read_value(data, 1392 data->REG_CRITICAL_PWM[i]);
1065 NCT6779_REG_CRITICAL_PWM[i]);
1066 else 1393 else
1067 data->auto_pwm[i][data->auto_pwm_num] = 0xff; 1394 reg = 0xff;
1395 data->auto_pwm[i][data->auto_pwm_num] = reg;
1068 break; 1396 break;
1069 } 1397 }
1070 } 1398 }
@@ -1110,7 +1438,8 @@ static struct nct6775_data *nct6775_update_device(struct device *dev)
1110 data->fan_min[i] = nct6775_read_value(data, 1438 data->fan_min[i] = nct6775_read_value(data,
1111 data->REG_FAN_MIN[i]); 1439 data->REG_FAN_MIN[i]);
1112 data->fan_pulses[i] = 1440 data->fan_pulses[i] =
1113 nct6775_read_value(data, data->REG_FAN_PULSES[i]); 1441 (nct6775_read_value(data, data->REG_FAN_PULSES[i])
1442 >> data->FAN_PULSE_SHIFT[i]) & 0x03;
1114 1443
1115 nct6775_select_fan_div(dev, data, i, reg); 1444 nct6775_select_fan_div(dev, data, i, reg);
1116 } 1445 }
@@ -1143,6 +1472,15 @@ static struct nct6775_data *nct6775_update_device(struct device *dev)
1143 data->alarms |= ((u64)alarm) << (i << 3); 1472 data->alarms |= ((u64)alarm) << (i << 3);
1144 } 1473 }
1145 1474
1475 data->beeps = 0;
1476 for (i = 0; i < NUM_REG_BEEP; i++) {
1477 u8 beep;
1478 if (!data->REG_BEEP[i])
1479 continue;
1480 beep = nct6775_read_value(data, data->REG_BEEP[i]);
1481 data->beeps |= ((u64)beep) << (i << 3);
1482 }
1483
1146 data->last_updated = jiffies; 1484 data->last_updated = jiffies;
1147 data->valid = true; 1485 data->valid = true;
1148 } 1486 }
@@ -1230,224 +1568,138 @@ show_temp_alarm(struct device *dev, struct device_attribute *attr, char *buf)
1230 return sprintf(buf, "%u\n", alarm); 1568 return sprintf(buf, "%u\n", alarm);
1231} 1569}
1232 1570
1233static SENSOR_DEVICE_ATTR_2(in0_input, S_IRUGO, show_in_reg, NULL, 0, 0); 1571static ssize_t
1234static SENSOR_DEVICE_ATTR_2(in1_input, S_IRUGO, show_in_reg, NULL, 1, 0); 1572show_beep(struct device *dev, struct device_attribute *attr, char *buf)
1235static SENSOR_DEVICE_ATTR_2(in2_input, S_IRUGO, show_in_reg, NULL, 2, 0); 1573{
1236static SENSOR_DEVICE_ATTR_2(in3_input, S_IRUGO, show_in_reg, NULL, 3, 0); 1574 struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
1237static SENSOR_DEVICE_ATTR_2(in4_input, S_IRUGO, show_in_reg, NULL, 4, 0); 1575 struct nct6775_data *data = nct6775_update_device(dev);
1238static SENSOR_DEVICE_ATTR_2(in5_input, S_IRUGO, show_in_reg, NULL, 5, 0); 1576 int nr = data->BEEP_BITS[sattr->index];
1239static SENSOR_DEVICE_ATTR_2(in6_input, S_IRUGO, show_in_reg, NULL, 6, 0); 1577
1240static SENSOR_DEVICE_ATTR_2(in7_input, S_IRUGO, show_in_reg, NULL, 7, 0); 1578 return sprintf(buf, "%u\n",
1241static SENSOR_DEVICE_ATTR_2(in8_input, S_IRUGO, show_in_reg, NULL, 8, 0); 1579 (unsigned int)((data->beeps >> nr) & 0x01));
1242static SENSOR_DEVICE_ATTR_2(in9_input, S_IRUGO, show_in_reg, NULL, 9, 0); 1580}
1243static SENSOR_DEVICE_ATTR_2(in10_input, S_IRUGO, show_in_reg, NULL, 10, 0); 1581
1244static SENSOR_DEVICE_ATTR_2(in11_input, S_IRUGO, show_in_reg, NULL, 11, 0); 1582static ssize_t
1245static SENSOR_DEVICE_ATTR_2(in12_input, S_IRUGO, show_in_reg, NULL, 12, 0); 1583store_beep(struct device *dev, struct device_attribute *attr, const char *buf,
1246static SENSOR_DEVICE_ATTR_2(in13_input, S_IRUGO, show_in_reg, NULL, 13, 0); 1584 size_t count)
1247static SENSOR_DEVICE_ATTR_2(in14_input, S_IRUGO, show_in_reg, NULL, 14, 0); 1585{
1248 1586 struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
1249static SENSOR_DEVICE_ATTR(in0_alarm, S_IRUGO, show_alarm, NULL, 0); 1587 struct nct6775_data *data = dev_get_drvdata(dev);
1250static SENSOR_DEVICE_ATTR(in1_alarm, S_IRUGO, show_alarm, NULL, 1); 1588 int nr = data->BEEP_BITS[sattr->index];
1251static SENSOR_DEVICE_ATTR(in2_alarm, S_IRUGO, show_alarm, NULL, 2); 1589 int regindex = nr >> 3;
1252static SENSOR_DEVICE_ATTR(in3_alarm, S_IRUGO, show_alarm, NULL, 3); 1590 unsigned long val;
1253static SENSOR_DEVICE_ATTR(in4_alarm, S_IRUGO, show_alarm, NULL, 4); 1591
1254static SENSOR_DEVICE_ATTR(in5_alarm, S_IRUGO, show_alarm, NULL, 5); 1592 int err = kstrtoul(buf, 10, &val);
1255static SENSOR_DEVICE_ATTR(in6_alarm, S_IRUGO, show_alarm, NULL, 6); 1593 if (err < 0)
1256static SENSOR_DEVICE_ATTR(in7_alarm, S_IRUGO, show_alarm, NULL, 7); 1594 return err;
1257static SENSOR_DEVICE_ATTR(in8_alarm, S_IRUGO, show_alarm, NULL, 8); 1595 if (val > 1)
1258static SENSOR_DEVICE_ATTR(in9_alarm, S_IRUGO, show_alarm, NULL, 9); 1596 return -EINVAL;
1259static SENSOR_DEVICE_ATTR(in10_alarm, S_IRUGO, show_alarm, NULL, 10); 1597
1260static SENSOR_DEVICE_ATTR(in11_alarm, S_IRUGO, show_alarm, NULL, 11); 1598 mutex_lock(&data->update_lock);
1261static SENSOR_DEVICE_ATTR(in12_alarm, S_IRUGO, show_alarm, NULL, 12); 1599 if (val)
1262static SENSOR_DEVICE_ATTR(in13_alarm, S_IRUGO, show_alarm, NULL, 13); 1600 data->beeps |= (1ULL << nr);
1263static SENSOR_DEVICE_ATTR(in14_alarm, S_IRUGO, show_alarm, NULL, 14); 1601 else
1264 1602 data->beeps &= ~(1ULL << nr);
1265static SENSOR_DEVICE_ATTR_2(in0_min, S_IWUSR | S_IRUGO, show_in_reg, 1603 nct6775_write_value(data, data->REG_BEEP[regindex],
1266 store_in_reg, 0, 1); 1604 (data->beeps >> (regindex << 3)) & 0xff);
1267static SENSOR_DEVICE_ATTR_2(in1_min, S_IWUSR | S_IRUGO, show_in_reg, 1605 mutex_unlock(&data->update_lock);
1268 store_in_reg, 1, 1); 1606 return count;
1269static SENSOR_DEVICE_ATTR_2(in2_min, S_IWUSR | S_IRUGO, show_in_reg, 1607}
1270 store_in_reg, 2, 1); 1608
1271static SENSOR_DEVICE_ATTR_2(in3_min, S_IWUSR | S_IRUGO, show_in_reg, 1609static ssize_t
1272 store_in_reg, 3, 1); 1610show_temp_beep(struct device *dev, struct device_attribute *attr, char *buf)
1273static SENSOR_DEVICE_ATTR_2(in4_min, S_IWUSR | S_IRUGO, show_in_reg, 1611{
1274 store_in_reg, 4, 1); 1612 struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
1275static SENSOR_DEVICE_ATTR_2(in5_min, S_IWUSR | S_IRUGO, show_in_reg, 1613 struct nct6775_data *data = nct6775_update_device(dev);
1276 store_in_reg, 5, 1); 1614 unsigned int beep = 0;
1277static SENSOR_DEVICE_ATTR_2(in6_min, S_IWUSR | S_IRUGO, show_in_reg, 1615 int nr;
1278 store_in_reg, 6, 1); 1616
1279static SENSOR_DEVICE_ATTR_2(in7_min, S_IWUSR | S_IRUGO, show_in_reg, 1617 /*
1280 store_in_reg, 7, 1); 1618 * For temperatures, there is no fixed mapping from registers to beep
1281static SENSOR_DEVICE_ATTR_2(in8_min, S_IWUSR | S_IRUGO, show_in_reg, 1619 * enable bits. Beep enable bits are determined by the temperature
1282 store_in_reg, 8, 1); 1620 * source mapping.
1283static SENSOR_DEVICE_ATTR_2(in9_min, S_IWUSR | S_IRUGO, show_in_reg, 1621 */
1284 store_in_reg, 9, 1); 1622 nr = find_temp_source(data, sattr->index, data->num_temp_beeps);
1285static SENSOR_DEVICE_ATTR_2(in10_min, S_IWUSR | S_IRUGO, show_in_reg, 1623 if (nr >= 0) {
1286 store_in_reg, 10, 1); 1624 int bit = data->BEEP_BITS[nr + TEMP_ALARM_BASE];
1287static SENSOR_DEVICE_ATTR_2(in11_min, S_IWUSR | S_IRUGO, show_in_reg, 1625 beep = (data->beeps >> bit) & 0x01;
1288 store_in_reg, 11, 1); 1626 }
1289static SENSOR_DEVICE_ATTR_2(in12_min, S_IWUSR | S_IRUGO, show_in_reg, 1627 return sprintf(buf, "%u\n", beep);
1290 store_in_reg, 12, 1); 1628}
1291static SENSOR_DEVICE_ATTR_2(in13_min, S_IWUSR | S_IRUGO, show_in_reg, 1629
1292 store_in_reg, 13, 1); 1630static ssize_t
1293static SENSOR_DEVICE_ATTR_2(in14_min, S_IWUSR | S_IRUGO, show_in_reg, 1631store_temp_beep(struct device *dev, struct device_attribute *attr,
1294 store_in_reg, 14, 1); 1632 const char *buf, size_t count)
1295 1633{
1296static SENSOR_DEVICE_ATTR_2(in0_max, S_IWUSR | S_IRUGO, show_in_reg, 1634 struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
1297 store_in_reg, 0, 2); 1635 struct nct6775_data *data = dev_get_drvdata(dev);
1298static SENSOR_DEVICE_ATTR_2(in1_max, S_IWUSR | S_IRUGO, show_in_reg, 1636 int nr, bit, regindex;
1299 store_in_reg, 1, 2); 1637 unsigned long val;
1300static SENSOR_DEVICE_ATTR_2(in2_max, S_IWUSR | S_IRUGO, show_in_reg, 1638
1301 store_in_reg, 2, 2); 1639 int err = kstrtoul(buf, 10, &val);
1302static SENSOR_DEVICE_ATTR_2(in3_max, S_IWUSR | S_IRUGO, show_in_reg, 1640 if (err < 0)
1303 store_in_reg, 3, 2); 1641 return err;
1304static SENSOR_DEVICE_ATTR_2(in4_max, S_IWUSR | S_IRUGO, show_in_reg, 1642 if (val > 1)
1305 store_in_reg, 4, 2); 1643 return -EINVAL;
1306static SENSOR_DEVICE_ATTR_2(in5_max, S_IWUSR | S_IRUGO, show_in_reg, 1644
1307 store_in_reg, 5, 2); 1645 nr = find_temp_source(data, sattr->index, data->num_temp_beeps);
1308static SENSOR_DEVICE_ATTR_2(in6_max, S_IWUSR | S_IRUGO, show_in_reg, 1646 if (nr < 0)
1309 store_in_reg, 6, 2); 1647 return -ENODEV;
1310static SENSOR_DEVICE_ATTR_2(in7_max, S_IWUSR | S_IRUGO, show_in_reg, 1648
1311 store_in_reg, 7, 2); 1649 bit = data->BEEP_BITS[nr + TEMP_ALARM_BASE];
1312static SENSOR_DEVICE_ATTR_2(in8_max, S_IWUSR | S_IRUGO, show_in_reg, 1650 regindex = bit >> 3;
1313 store_in_reg, 8, 2); 1651
1314static SENSOR_DEVICE_ATTR_2(in9_max, S_IWUSR | S_IRUGO, show_in_reg, 1652 mutex_lock(&data->update_lock);
1315 store_in_reg, 9, 2); 1653 if (val)
1316static SENSOR_DEVICE_ATTR_2(in10_max, S_IWUSR | S_IRUGO, show_in_reg, 1654 data->beeps |= (1ULL << bit);
1317 store_in_reg, 10, 2); 1655 else
1318static SENSOR_DEVICE_ATTR_2(in11_max, S_IWUSR | S_IRUGO, show_in_reg, 1656 data->beeps &= ~(1ULL << bit);
1319 store_in_reg, 11, 2); 1657 nct6775_write_value(data, data->REG_BEEP[regindex],
1320static SENSOR_DEVICE_ATTR_2(in12_max, S_IWUSR | S_IRUGO, show_in_reg, 1658 (data->beeps >> (regindex << 3)) & 0xff);
1321 store_in_reg, 12, 2); 1659 mutex_unlock(&data->update_lock);
1322static SENSOR_DEVICE_ATTR_2(in13_max, S_IWUSR | S_IRUGO, show_in_reg, 1660
1323 store_in_reg, 13, 2); 1661 return count;
1324static SENSOR_DEVICE_ATTR_2(in14_max, S_IWUSR | S_IRUGO, show_in_reg, 1662}
1325 store_in_reg, 14, 2); 1663
1326 1664static umode_t nct6775_in_is_visible(struct kobject *kobj,
1327static struct attribute *nct6775_attributes_in[15][5] = { 1665 struct attribute *attr, int index)
1328 { 1666{
1329 &sensor_dev_attr_in0_input.dev_attr.attr, 1667 struct device *dev = container_of(kobj, struct device, kobj);
1330 &sensor_dev_attr_in0_min.dev_attr.attr, 1668 struct nct6775_data *data = dev_get_drvdata(dev);
1331 &sensor_dev_attr_in0_max.dev_attr.attr, 1669 int in = index / 5; /* voltage index */
1332 &sensor_dev_attr_in0_alarm.dev_attr.attr, 1670
1333 NULL 1671 if (!(data->have_in & (1 << in)))
1334 }, 1672 return 0;
1335 { 1673
1336 &sensor_dev_attr_in1_input.dev_attr.attr, 1674 return attr->mode;
1337 &sensor_dev_attr_in1_min.dev_attr.attr, 1675}
1338 &sensor_dev_attr_in1_max.dev_attr.attr, 1676
1339 &sensor_dev_attr_in1_alarm.dev_attr.attr, 1677SENSOR_TEMPLATE_2(in_input, "in%d_input", S_IRUGO, show_in_reg, NULL, 0, 0);
1340 NULL 1678SENSOR_TEMPLATE(in_alarm, "in%d_alarm", S_IRUGO, show_alarm, NULL, 0);
1341 }, 1679SENSOR_TEMPLATE(in_beep, "in%d_beep", S_IWUSR | S_IRUGO, show_beep, store_beep,
1342 { 1680 0);
1343 &sensor_dev_attr_in2_input.dev_attr.attr, 1681SENSOR_TEMPLATE_2(in_min, "in%d_min", S_IWUSR | S_IRUGO, show_in_reg,
1344 &sensor_dev_attr_in2_min.dev_attr.attr, 1682 store_in_reg, 0, 1);
1345 &sensor_dev_attr_in2_max.dev_attr.attr, 1683SENSOR_TEMPLATE_2(in_max, "in%d_max", S_IWUSR | S_IRUGO, show_in_reg,
1346 &sensor_dev_attr_in2_alarm.dev_attr.attr, 1684 store_in_reg, 0, 2);
1347 NULL 1685
1348 }, 1686/*
1349 { 1687 * nct6775_in_is_visible uses the index into the following array
1350 &sensor_dev_attr_in3_input.dev_attr.attr, 1688 * to determine if attributes should be created or not.
1351 &sensor_dev_attr_in3_min.dev_attr.attr, 1689 * Any change in order or content must be matched.
1352 &sensor_dev_attr_in3_max.dev_attr.attr, 1690 */
1353 &sensor_dev_attr_in3_alarm.dev_attr.attr, 1691static struct sensor_device_template *nct6775_attributes_in_template[] = {
1354 NULL 1692 &sensor_dev_template_in_input,
1355 }, 1693 &sensor_dev_template_in_alarm,
1356 { 1694 &sensor_dev_template_in_beep,
1357 &sensor_dev_attr_in4_input.dev_attr.attr, 1695 &sensor_dev_template_in_min,
1358 &sensor_dev_attr_in4_min.dev_attr.attr, 1696 &sensor_dev_template_in_max,
1359 &sensor_dev_attr_in4_max.dev_attr.attr, 1697 NULL
1360 &sensor_dev_attr_in4_alarm.dev_attr.attr,
1361 NULL
1362 },
1363 {
1364 &sensor_dev_attr_in5_input.dev_attr.attr,
1365 &sensor_dev_attr_in5_min.dev_attr.attr,
1366 &sensor_dev_attr_in5_max.dev_attr.attr,
1367 &sensor_dev_attr_in5_alarm.dev_attr.attr,
1368 NULL
1369 },
1370 {
1371 &sensor_dev_attr_in6_input.dev_attr.attr,
1372 &sensor_dev_attr_in6_min.dev_attr.attr,
1373 &sensor_dev_attr_in6_max.dev_attr.attr,
1374 &sensor_dev_attr_in6_alarm.dev_attr.attr,
1375 NULL
1376 },
1377 {
1378 &sensor_dev_attr_in7_input.dev_attr.attr,
1379 &sensor_dev_attr_in7_min.dev_attr.attr,
1380 &sensor_dev_attr_in7_max.dev_attr.attr,
1381 &sensor_dev_attr_in7_alarm.dev_attr.attr,
1382 NULL
1383 },
1384 {
1385 &sensor_dev_attr_in8_input.dev_attr.attr,
1386 &sensor_dev_attr_in8_min.dev_attr.attr,
1387 &sensor_dev_attr_in8_max.dev_attr.attr,
1388 &sensor_dev_attr_in8_alarm.dev_attr.attr,
1389 NULL
1390 },
1391 {
1392 &sensor_dev_attr_in9_input.dev_attr.attr,
1393 &sensor_dev_attr_in9_min.dev_attr.attr,
1394 &sensor_dev_attr_in9_max.dev_attr.attr,
1395 &sensor_dev_attr_in9_alarm.dev_attr.attr,
1396 NULL
1397 },
1398 {
1399 &sensor_dev_attr_in10_input.dev_attr.attr,
1400 &sensor_dev_attr_in10_min.dev_attr.attr,
1401 &sensor_dev_attr_in10_max.dev_attr.attr,
1402 &sensor_dev_attr_in10_alarm.dev_attr.attr,
1403 NULL
1404 },
1405 {
1406 &sensor_dev_attr_in11_input.dev_attr.attr,
1407 &sensor_dev_attr_in11_min.dev_attr.attr,
1408 &sensor_dev_attr_in11_max.dev_attr.attr,
1409 &sensor_dev_attr_in11_alarm.dev_attr.attr,
1410 NULL
1411 },
1412 {
1413 &sensor_dev_attr_in12_input.dev_attr.attr,
1414 &sensor_dev_attr_in12_min.dev_attr.attr,
1415 &sensor_dev_attr_in12_max.dev_attr.attr,
1416 &sensor_dev_attr_in12_alarm.dev_attr.attr,
1417 NULL
1418 },
1419 {
1420 &sensor_dev_attr_in13_input.dev_attr.attr,
1421 &sensor_dev_attr_in13_min.dev_attr.attr,
1422 &sensor_dev_attr_in13_max.dev_attr.attr,
1423 &sensor_dev_attr_in13_alarm.dev_attr.attr,
1424 NULL
1425 },
1426 {
1427 &sensor_dev_attr_in14_input.dev_attr.attr,
1428 &sensor_dev_attr_in14_min.dev_attr.attr,
1429 &sensor_dev_attr_in14_max.dev_attr.attr,
1430 &sensor_dev_attr_in14_alarm.dev_attr.attr,
1431 NULL
1432 },
1433}; 1698};
1434 1699
1435static const struct attribute_group nct6775_group_in[15] = { 1700static struct sensor_template_group nct6775_in_template_group = {
1436 { .attrs = nct6775_attributes_in[0] }, 1701 .templates = nct6775_attributes_in_template,
1437 { .attrs = nct6775_attributes_in[1] }, 1702 .is_visible = nct6775_in_is_visible,
1438 { .attrs = nct6775_attributes_in[2] },
1439 { .attrs = nct6775_attributes_in[3] },
1440 { .attrs = nct6775_attributes_in[4] },
1441 { .attrs = nct6775_attributes_in[5] },
1442 { .attrs = nct6775_attributes_in[6] },
1443 { .attrs = nct6775_attributes_in[7] },
1444 { .attrs = nct6775_attributes_in[8] },
1445 { .attrs = nct6775_attributes_in[9] },
1446 { .attrs = nct6775_attributes_in[10] },
1447 { .attrs = nct6775_attributes_in[11] },
1448 { .attrs = nct6775_attributes_in[12] },
1449 { .attrs = nct6775_attributes_in[13] },
1450 { .attrs = nct6775_attributes_in[14] },
1451}; 1703};
1452 1704
1453static ssize_t 1705static ssize_t
@@ -1592,6 +1844,7 @@ store_fan_pulses(struct device *dev, struct device_attribute *attr,
1592 int nr = sattr->index; 1844 int nr = sattr->index;
1593 unsigned long val; 1845 unsigned long val;
1594 int err; 1846 int err;
1847 u8 reg;
1595 1848
1596 err = kstrtoul(buf, 10, &val); 1849 err = kstrtoul(buf, 10, &val);
1597 if (err < 0) 1850 if (err < 0)
@@ -1602,60 +1855,68 @@ store_fan_pulses(struct device *dev, struct device_attribute *attr,
1602 1855
1603 mutex_lock(&data->update_lock); 1856 mutex_lock(&data->update_lock);
1604 data->fan_pulses[nr] = val & 3; 1857 data->fan_pulses[nr] = val & 3;
1605 nct6775_write_value(data, data->REG_FAN_PULSES[nr], val & 3); 1858 reg = nct6775_read_value(data, data->REG_FAN_PULSES[nr]);
1859 reg &= ~(0x03 << data->FAN_PULSE_SHIFT[nr]);
1860 reg |= (val & 3) << data->FAN_PULSE_SHIFT[nr];
1861 nct6775_write_value(data, data->REG_FAN_PULSES[nr], reg);
1606 mutex_unlock(&data->update_lock); 1862 mutex_unlock(&data->update_lock);
1607 1863
1608 return count; 1864 return count;
1609} 1865}
1610 1866
1611static struct sensor_device_attribute sda_fan_input[] = { 1867static umode_t nct6775_fan_is_visible(struct kobject *kobj,
1612 SENSOR_ATTR(fan1_input, S_IRUGO, show_fan, NULL, 0), 1868 struct attribute *attr, int index)
1613 SENSOR_ATTR(fan2_input, S_IRUGO, show_fan, NULL, 1), 1869{
1614 SENSOR_ATTR(fan3_input, S_IRUGO, show_fan, NULL, 2), 1870 struct device *dev = container_of(kobj, struct device, kobj);
1615 SENSOR_ATTR(fan4_input, S_IRUGO, show_fan, NULL, 3), 1871 struct nct6775_data *data = dev_get_drvdata(dev);
1616 SENSOR_ATTR(fan5_input, S_IRUGO, show_fan, NULL, 4), 1872 int fan = index / 6; /* fan index */
1617}; 1873 int nr = index % 6; /* attribute index */
1618 1874
1619static struct sensor_device_attribute sda_fan_alarm[] = { 1875 if (!(data->has_fan & (1 << fan)))
1620 SENSOR_ATTR(fan1_alarm, S_IRUGO, show_alarm, NULL, FAN_ALARM_BASE), 1876 return 0;
1621 SENSOR_ATTR(fan2_alarm, S_IRUGO, show_alarm, NULL, FAN_ALARM_BASE + 1),
1622 SENSOR_ATTR(fan3_alarm, S_IRUGO, show_alarm, NULL, FAN_ALARM_BASE + 2),
1623 SENSOR_ATTR(fan4_alarm, S_IRUGO, show_alarm, NULL, FAN_ALARM_BASE + 3),
1624 SENSOR_ATTR(fan5_alarm, S_IRUGO, show_alarm, NULL, FAN_ALARM_BASE + 4),
1625};
1626 1877
1627static struct sensor_device_attribute sda_fan_min[] = { 1878 if (nr == 1 && data->ALARM_BITS[FAN_ALARM_BASE + fan] == -1)
1628 SENSOR_ATTR(fan1_min, S_IWUSR | S_IRUGO, show_fan_min, 1879 return 0;
1629 store_fan_min, 0), 1880 if (nr == 2 && data->BEEP_BITS[FAN_ALARM_BASE + fan] == -1)
1630 SENSOR_ATTR(fan2_min, S_IWUSR | S_IRUGO, show_fan_min, 1881 return 0;
1631 store_fan_min, 1), 1882 if (nr == 4 && !(data->has_fan_min & (1 << fan)))
1632 SENSOR_ATTR(fan3_min, S_IWUSR | S_IRUGO, show_fan_min, 1883 return 0;
1633 store_fan_min, 2), 1884 if (nr == 5 && data->kind != nct6775)
1634 SENSOR_ATTR(fan4_min, S_IWUSR | S_IRUGO, show_fan_min, 1885 return 0;
1635 store_fan_min, 3), 1886
1636 SENSOR_ATTR(fan5_min, S_IWUSR | S_IRUGO, show_fan_min, 1887 return attr->mode;
1637 store_fan_min, 4), 1888}
1638};
1639 1889
1640static struct sensor_device_attribute sda_fan_pulses[] = { 1890SENSOR_TEMPLATE(fan_input, "fan%d_input", S_IRUGO, show_fan, NULL, 0);
1641 SENSOR_ATTR(fan1_pulses, S_IWUSR | S_IRUGO, show_fan_pulses, 1891SENSOR_TEMPLATE(fan_alarm, "fan%d_alarm", S_IRUGO, show_alarm, NULL,
1642 store_fan_pulses, 0), 1892 FAN_ALARM_BASE);
1643 SENSOR_ATTR(fan2_pulses, S_IWUSR | S_IRUGO, show_fan_pulses, 1893SENSOR_TEMPLATE(fan_beep, "fan%d_beep", S_IWUSR | S_IRUGO, show_beep,
1644 store_fan_pulses, 1), 1894 store_beep, FAN_ALARM_BASE);
1645 SENSOR_ATTR(fan3_pulses, S_IWUSR | S_IRUGO, show_fan_pulses, 1895SENSOR_TEMPLATE(fan_pulses, "fan%d_pulses", S_IWUSR | S_IRUGO, show_fan_pulses,
1646 store_fan_pulses, 2), 1896 store_fan_pulses, 0);
1647 SENSOR_ATTR(fan4_pulses, S_IWUSR | S_IRUGO, show_fan_pulses, 1897SENSOR_TEMPLATE(fan_min, "fan%d_min", S_IWUSR | S_IRUGO, show_fan_min,
1648 store_fan_pulses, 3), 1898 store_fan_min, 0);
1649 SENSOR_ATTR(fan5_pulses, S_IWUSR | S_IRUGO, show_fan_pulses, 1899SENSOR_TEMPLATE(fan_div, "fan%d_div", S_IRUGO, show_fan_div, NULL, 0);
1650 store_fan_pulses, 4), 1900
1901/*
1902 * nct6775_fan_is_visible uses the index into the following array
1903 * to determine if attributes should be created or not.
1904 * Any change in order or content must be matched.
1905 */
1906static struct sensor_device_template *nct6775_attributes_fan_template[] = {
1907 &sensor_dev_template_fan_input,
1908 &sensor_dev_template_fan_alarm, /* 1 */
1909 &sensor_dev_template_fan_beep, /* 2 */
1910 &sensor_dev_template_fan_pulses,
1911 &sensor_dev_template_fan_min, /* 4 */
1912 &sensor_dev_template_fan_div, /* 5 */
1913 NULL
1651}; 1914};
1652 1915
1653static struct sensor_device_attribute sda_fan_div[] = { 1916static struct sensor_template_group nct6775_fan_template_group = {
1654 SENSOR_ATTR(fan1_div, S_IRUGO, show_fan_div, NULL, 0), 1917 .templates = nct6775_attributes_fan_template,
1655 SENSOR_ATTR(fan2_div, S_IRUGO, show_fan_div, NULL, 1), 1918 .is_visible = nct6775_fan_is_visible,
1656 SENSOR_ATTR(fan3_div, S_IRUGO, show_fan_div, NULL, 2), 1919 .base = 1,
1657 SENSOR_ATTR(fan4_div, S_IRUGO, show_fan_div, NULL, 3),
1658 SENSOR_ATTR(fan5_div, S_IRUGO, show_fan_div, NULL, 4),
1659}; 1920};
1660 1921
1661static ssize_t 1922static ssize_t
@@ -1752,7 +2013,7 @@ store_temp_type(struct device *dev, struct device_attribute *attr,
1752 int nr = sattr->index; 2013 int nr = sattr->index;
1753 unsigned long val; 2014 unsigned long val;
1754 int err; 2015 int err;
1755 u8 vbat, diode, bit; 2016 u8 vbat, diode, vbit, dbit;
1756 2017
1757 err = kstrtoul(buf, 10, &val); 2018 err = kstrtoul(buf, 10, &val);
1758 if (err < 0) 2019 if (err < 0)
@@ -1764,16 +2025,17 @@ store_temp_type(struct device *dev, struct device_attribute *attr,
1764 mutex_lock(&data->update_lock); 2025 mutex_lock(&data->update_lock);
1765 2026
1766 data->temp_type[nr] = val; 2027 data->temp_type[nr] = val;
1767 vbat = nct6775_read_value(data, data->REG_VBAT) & ~(0x02 << nr); 2028 vbit = 0x02 << nr;
1768 diode = nct6775_read_value(data, data->REG_DIODE) & ~(0x02 << nr); 2029 dbit = data->DIODE_MASK << nr;
1769 bit = 0x02 << nr; 2030 vbat = nct6775_read_value(data, data->REG_VBAT) & ~vbit;
2031 diode = nct6775_read_value(data, data->REG_DIODE) & ~dbit;
1770 switch (val) { 2032 switch (val) {
1771 case 1: /* CPU diode (diode, current mode) */ 2033 case 1: /* CPU diode (diode, current mode) */
1772 vbat |= bit; 2034 vbat |= vbit;
1773 diode |= bit; 2035 diode |= dbit;
1774 break; 2036 break;
1775 case 3: /* diode, voltage mode */ 2037 case 3: /* diode, voltage mode */
1776 vbat |= bit; 2038 vbat |= dbit;
1777 break; 2039 break;
1778 case 4: /* thermistor */ 2040 case 4: /* thermistor */
1779 break; 2041 break;
@@ -1785,142 +2047,83 @@ store_temp_type(struct device *dev, struct device_attribute *attr,
1785 return count; 2047 return count;
1786} 2048}
1787 2049
1788static struct sensor_device_attribute_2 sda_temp_input[] = { 2050static umode_t nct6775_temp_is_visible(struct kobject *kobj,
1789 SENSOR_ATTR_2(temp1_input, S_IRUGO, show_temp, NULL, 0, 0), 2051 struct attribute *attr, int index)
1790 SENSOR_ATTR_2(temp2_input, S_IRUGO, show_temp, NULL, 1, 0), 2052{
1791 SENSOR_ATTR_2(temp3_input, S_IRUGO, show_temp, NULL, 2, 0), 2053 struct device *dev = container_of(kobj, struct device, kobj);
1792 SENSOR_ATTR_2(temp4_input, S_IRUGO, show_temp, NULL, 3, 0), 2054 struct nct6775_data *data = dev_get_drvdata(dev);
1793 SENSOR_ATTR_2(temp5_input, S_IRUGO, show_temp, NULL, 4, 0), 2055 int temp = index / 10; /* temp index */
1794 SENSOR_ATTR_2(temp6_input, S_IRUGO, show_temp, NULL, 5, 0), 2056 int nr = index % 10; /* attribute index */
1795 SENSOR_ATTR_2(temp7_input, S_IRUGO, show_temp, NULL, 6, 0),
1796 SENSOR_ATTR_2(temp8_input, S_IRUGO, show_temp, NULL, 7, 0),
1797 SENSOR_ATTR_2(temp9_input, S_IRUGO, show_temp, NULL, 8, 0),
1798 SENSOR_ATTR_2(temp10_input, S_IRUGO, show_temp, NULL, 9, 0),
1799};
1800 2057
1801static struct sensor_device_attribute sda_temp_label[] = { 2058 if (!(data->have_temp & (1 << temp)))
1802 SENSOR_ATTR(temp1_label, S_IRUGO, show_temp_label, NULL, 0), 2059 return 0;
1803 SENSOR_ATTR(temp2_label, S_IRUGO, show_temp_label, NULL, 1),
1804 SENSOR_ATTR(temp3_label, S_IRUGO, show_temp_label, NULL, 2),
1805 SENSOR_ATTR(temp4_label, S_IRUGO, show_temp_label, NULL, 3),
1806 SENSOR_ATTR(temp5_label, S_IRUGO, show_temp_label, NULL, 4),
1807 SENSOR_ATTR(temp6_label, S_IRUGO, show_temp_label, NULL, 5),
1808 SENSOR_ATTR(temp7_label, S_IRUGO, show_temp_label, NULL, 6),
1809 SENSOR_ATTR(temp8_label, S_IRUGO, show_temp_label, NULL, 7),
1810 SENSOR_ATTR(temp9_label, S_IRUGO, show_temp_label, NULL, 8),
1811 SENSOR_ATTR(temp10_label, S_IRUGO, show_temp_label, NULL, 9),
1812};
1813 2060
1814static struct sensor_device_attribute_2 sda_temp_max[] = { 2061 if (nr == 2 && find_temp_source(data, temp, data->num_temp_alarms) < 0)
1815 SENSOR_ATTR_2(temp1_max, S_IRUGO | S_IWUSR, show_temp, store_temp, 2062 return 0; /* alarm */
1816 0, 1),
1817 SENSOR_ATTR_2(temp2_max, S_IRUGO | S_IWUSR, show_temp, store_temp,
1818 1, 1),
1819 SENSOR_ATTR_2(temp3_max, S_IRUGO | S_IWUSR, show_temp, store_temp,
1820 2, 1),
1821 SENSOR_ATTR_2(temp4_max, S_IRUGO | S_IWUSR, show_temp, store_temp,
1822 3, 1),
1823 SENSOR_ATTR_2(temp5_max, S_IRUGO | S_IWUSR, show_temp, store_temp,
1824 4, 1),
1825 SENSOR_ATTR_2(temp6_max, S_IRUGO | S_IWUSR, show_temp, store_temp,
1826 5, 1),
1827 SENSOR_ATTR_2(temp7_max, S_IRUGO | S_IWUSR, show_temp, store_temp,
1828 6, 1),
1829 SENSOR_ATTR_2(temp8_max, S_IRUGO | S_IWUSR, show_temp, store_temp,
1830 7, 1),
1831 SENSOR_ATTR_2(temp9_max, S_IRUGO | S_IWUSR, show_temp, store_temp,
1832 8, 1),
1833 SENSOR_ATTR_2(temp10_max, S_IRUGO | S_IWUSR, show_temp, store_temp,
1834 9, 1),
1835};
1836 2063
1837static struct sensor_device_attribute_2 sda_temp_max_hyst[] = { 2064 if (nr == 3 && find_temp_source(data, temp, data->num_temp_beeps) < 0)
1838 SENSOR_ATTR_2(temp1_max_hyst, S_IRUGO | S_IWUSR, show_temp, store_temp, 2065 return 0; /* beep */
1839 0, 2),
1840 SENSOR_ATTR_2(temp2_max_hyst, S_IRUGO | S_IWUSR, show_temp, store_temp,
1841 1, 2),
1842 SENSOR_ATTR_2(temp3_max_hyst, S_IRUGO | S_IWUSR, show_temp, store_temp,
1843 2, 2),
1844 SENSOR_ATTR_2(temp4_max_hyst, S_IRUGO | S_IWUSR, show_temp, store_temp,
1845 3, 2),
1846 SENSOR_ATTR_2(temp5_max_hyst, S_IRUGO | S_IWUSR, show_temp, store_temp,
1847 4, 2),
1848 SENSOR_ATTR_2(temp6_max_hyst, S_IRUGO | S_IWUSR, show_temp, store_temp,
1849 5, 2),
1850 SENSOR_ATTR_2(temp7_max_hyst, S_IRUGO | S_IWUSR, show_temp, store_temp,
1851 6, 2),
1852 SENSOR_ATTR_2(temp8_max_hyst, S_IRUGO | S_IWUSR, show_temp, store_temp,
1853 7, 2),
1854 SENSOR_ATTR_2(temp9_max_hyst, S_IRUGO | S_IWUSR, show_temp, store_temp,
1855 8, 2),
1856 SENSOR_ATTR_2(temp10_max_hyst, S_IRUGO | S_IWUSR, show_temp, store_temp,
1857 9, 2),
1858};
1859 2066
1860static struct sensor_device_attribute_2 sda_temp_crit[] = { 2067 if (nr == 4 && !data->reg_temp[1][temp]) /* max */
1861 SENSOR_ATTR_2(temp1_crit, S_IRUGO | S_IWUSR, show_temp, store_temp, 2068 return 0;
1862 0, 3),
1863 SENSOR_ATTR_2(temp2_crit, S_IRUGO | S_IWUSR, show_temp, store_temp,
1864 1, 3),
1865 SENSOR_ATTR_2(temp3_crit, S_IRUGO | S_IWUSR, show_temp, store_temp,
1866 2, 3),
1867 SENSOR_ATTR_2(temp4_crit, S_IRUGO | S_IWUSR, show_temp, store_temp,
1868 3, 3),
1869 SENSOR_ATTR_2(temp5_crit, S_IRUGO | S_IWUSR, show_temp, store_temp,
1870 4, 3),
1871 SENSOR_ATTR_2(temp6_crit, S_IRUGO | S_IWUSR, show_temp, store_temp,
1872 5, 3),
1873 SENSOR_ATTR_2(temp7_crit, S_IRUGO | S_IWUSR, show_temp, store_temp,
1874 6, 3),
1875 SENSOR_ATTR_2(temp8_crit, S_IRUGO | S_IWUSR, show_temp, store_temp,
1876 7, 3),
1877 SENSOR_ATTR_2(temp9_crit, S_IRUGO | S_IWUSR, show_temp, store_temp,
1878 8, 3),
1879 SENSOR_ATTR_2(temp10_crit, S_IRUGO | S_IWUSR, show_temp, store_temp,
1880 9, 3),
1881};
1882 2069
1883static struct sensor_device_attribute sda_temp_offset[] = { 2070 if (nr == 5 && !data->reg_temp[2][temp]) /* max_hyst */
1884 SENSOR_ATTR(temp1_offset, S_IRUGO | S_IWUSR, show_temp_offset, 2071 return 0;
1885 store_temp_offset, 0), 2072
1886 SENSOR_ATTR(temp2_offset, S_IRUGO | S_IWUSR, show_temp_offset, 2073 if (nr == 6 && !data->reg_temp[3][temp]) /* crit */
1887 store_temp_offset, 1), 2074 return 0;
1888 SENSOR_ATTR(temp3_offset, S_IRUGO | S_IWUSR, show_temp_offset, 2075
1889 store_temp_offset, 2), 2076 if (nr == 7 && !data->reg_temp[4][temp]) /* lcrit */
1890 SENSOR_ATTR(temp4_offset, S_IRUGO | S_IWUSR, show_temp_offset, 2077 return 0;
1891 store_temp_offset, 3), 2078
1892 SENSOR_ATTR(temp5_offset, S_IRUGO | S_IWUSR, show_temp_offset, 2079 /* offset and type only apply to fixed sensors */
1893 store_temp_offset, 4), 2080 if (nr > 7 && !(data->have_temp_fixed & (1 << temp)))
1894 SENSOR_ATTR(temp6_offset, S_IRUGO | S_IWUSR, show_temp_offset, 2081 return 0;
1895 store_temp_offset, 5),
1896};
1897 2082
1898static struct sensor_device_attribute sda_temp_type[] = { 2083 return attr->mode;
1899 SENSOR_ATTR(temp1_type, S_IRUGO | S_IWUSR, show_temp_type, 2084}
1900 store_temp_type, 0), 2085
1901 SENSOR_ATTR(temp2_type, S_IRUGO | S_IWUSR, show_temp_type, 2086SENSOR_TEMPLATE_2(temp_input, "temp%d_input", S_IRUGO, show_temp, NULL, 0, 0);
1902 store_temp_type, 1), 2087SENSOR_TEMPLATE(temp_label, "temp%d_label", S_IRUGO, show_temp_label, NULL, 0);
1903 SENSOR_ATTR(temp3_type, S_IRUGO | S_IWUSR, show_temp_type, 2088SENSOR_TEMPLATE_2(temp_max, "temp%d_max", S_IRUGO | S_IWUSR, show_temp,
1904 store_temp_type, 2), 2089 store_temp, 0, 1);
1905 SENSOR_ATTR(temp4_type, S_IRUGO | S_IWUSR, show_temp_type, 2090SENSOR_TEMPLATE_2(temp_max_hyst, "temp%d_max_hyst", S_IRUGO | S_IWUSR,
1906 store_temp_type, 3), 2091 show_temp, store_temp, 0, 2);
1907 SENSOR_ATTR(temp5_type, S_IRUGO | S_IWUSR, show_temp_type, 2092SENSOR_TEMPLATE_2(temp_crit, "temp%d_crit", S_IRUGO | S_IWUSR, show_temp,
1908 store_temp_type, 4), 2093 store_temp, 0, 3);
1909 SENSOR_ATTR(temp6_type, S_IRUGO | S_IWUSR, show_temp_type, 2094SENSOR_TEMPLATE_2(temp_lcrit, "temp%d_lcrit", S_IRUGO | S_IWUSR, show_temp,
1910 store_temp_type, 5), 2095 store_temp, 0, 4);
2096SENSOR_TEMPLATE(temp_offset, "temp%d_offset", S_IRUGO | S_IWUSR,
2097 show_temp_offset, store_temp_offset, 0);
2098SENSOR_TEMPLATE(temp_type, "temp%d_type", S_IRUGO | S_IWUSR, show_temp_type,
2099 store_temp_type, 0);
2100SENSOR_TEMPLATE(temp_alarm, "temp%d_alarm", S_IRUGO, show_temp_alarm, NULL, 0);
2101SENSOR_TEMPLATE(temp_beep, "temp%d_beep", S_IRUGO | S_IWUSR, show_temp_beep,
2102 store_temp_beep, 0);
2103
2104/*
2105 * nct6775_temp_is_visible uses the index into the following array
2106 * to determine if attributes should be created or not.
2107 * Any change in order or content must be matched.
2108 */
2109static struct sensor_device_template *nct6775_attributes_temp_template[] = {
2110 &sensor_dev_template_temp_input,
2111 &sensor_dev_template_temp_label,
2112 &sensor_dev_template_temp_alarm, /* 2 */
2113 &sensor_dev_template_temp_beep, /* 3 */
2114 &sensor_dev_template_temp_max, /* 4 */
2115 &sensor_dev_template_temp_max_hyst, /* 5 */
2116 &sensor_dev_template_temp_crit, /* 6 */
2117 &sensor_dev_template_temp_lcrit, /* 7 */
2118 &sensor_dev_template_temp_offset, /* 8 */
2119 &sensor_dev_template_temp_type, /* 9 */
2120 NULL
1911}; 2121};
1912 2122
1913static struct sensor_device_attribute sda_temp_alarm[] = { 2123static struct sensor_template_group nct6775_temp_template_group = {
1914 SENSOR_ATTR(temp1_alarm, S_IRUGO, show_temp_alarm, NULL, 0), 2124 .templates = nct6775_attributes_temp_template,
1915 SENSOR_ATTR(temp2_alarm, S_IRUGO, show_temp_alarm, NULL, 1), 2125 .is_visible = nct6775_temp_is_visible,
1916 SENSOR_ATTR(temp3_alarm, S_IRUGO, show_temp_alarm, NULL, 2), 2126 .base = 1,
1917 SENSOR_ATTR(temp4_alarm, S_IRUGO, show_temp_alarm, NULL, 3),
1918 SENSOR_ATTR(temp5_alarm, S_IRUGO, show_temp_alarm, NULL, 4),
1919 SENSOR_ATTR(temp6_alarm, S_IRUGO, show_temp_alarm, NULL, 5),
1920 SENSOR_ATTR(temp7_alarm, S_IRUGO, show_temp_alarm, NULL, 6),
1921 SENSOR_ATTR(temp8_alarm, S_IRUGO, show_temp_alarm, NULL, 7),
1922 SENSOR_ATTR(temp9_alarm, S_IRUGO, show_temp_alarm, NULL, 8),
1923 SENSOR_ATTR(temp10_alarm, S_IRUGO, show_temp_alarm, NULL, 9),
1924}; 2127};
1925 2128
1926static ssize_t 2129static ssize_t
@@ -2422,77 +2625,19 @@ store_speed_tolerance(struct device *dev, struct device_attribute *attr,
2422 return count; 2625 return count;
2423} 2626}
2424 2627
2425static SENSOR_DEVICE_ATTR_2(pwm1, S_IWUSR | S_IRUGO, show_pwm, store_pwm, 0, 0); 2628SENSOR_TEMPLATE_2(pwm, "pwm%d", S_IWUSR | S_IRUGO, show_pwm, store_pwm, 0, 0);
2426static SENSOR_DEVICE_ATTR_2(pwm2, S_IWUSR | S_IRUGO, show_pwm, store_pwm, 1, 0); 2629SENSOR_TEMPLATE(pwm_mode, "pwm%d_mode", S_IWUSR | S_IRUGO, show_pwm_mode,
2427static SENSOR_DEVICE_ATTR_2(pwm3, S_IWUSR | S_IRUGO, show_pwm, store_pwm, 2, 0); 2630 store_pwm_mode, 0);
2428static SENSOR_DEVICE_ATTR_2(pwm4, S_IWUSR | S_IRUGO, show_pwm, store_pwm, 3, 0); 2631SENSOR_TEMPLATE(pwm_enable, "pwm%d_enable", S_IWUSR | S_IRUGO, show_pwm_enable,
2429static SENSOR_DEVICE_ATTR_2(pwm5, S_IWUSR | S_IRUGO, show_pwm, store_pwm, 4, 0); 2632 store_pwm_enable, 0);
2430 2633SENSOR_TEMPLATE(pwm_temp_sel, "pwm%d_temp_sel", S_IWUSR | S_IRUGO,
2431static SENSOR_DEVICE_ATTR(pwm1_mode, S_IWUSR | S_IRUGO, show_pwm_mode, 2634 show_pwm_temp_sel, store_pwm_temp_sel, 0);
2432 store_pwm_mode, 0); 2635SENSOR_TEMPLATE(pwm_target_temp, "pwm%d_target_temp", S_IWUSR | S_IRUGO,
2433static SENSOR_DEVICE_ATTR(pwm2_mode, S_IWUSR | S_IRUGO, show_pwm_mode, 2636 show_target_temp, store_target_temp, 0);
2434 store_pwm_mode, 1); 2637SENSOR_TEMPLATE(fan_target, "fan%d_target", S_IWUSR | S_IRUGO,
2435static SENSOR_DEVICE_ATTR(pwm3_mode, S_IWUSR | S_IRUGO, show_pwm_mode, 2638 show_target_speed, store_target_speed, 0);
2436 store_pwm_mode, 2); 2639SENSOR_TEMPLATE(fan_tolerance, "fan%d_tolerance", S_IWUSR | S_IRUGO,
2437static SENSOR_DEVICE_ATTR(pwm4_mode, S_IWUSR | S_IRUGO, show_pwm_mode, 2640 show_speed_tolerance, store_speed_tolerance, 0);
2438 store_pwm_mode, 3);
2439static SENSOR_DEVICE_ATTR(pwm5_mode, S_IWUSR | S_IRUGO, show_pwm_mode,
2440 store_pwm_mode, 4);
2441
2442static SENSOR_DEVICE_ATTR(pwm1_enable, S_IWUSR | S_IRUGO, show_pwm_enable,
2443 store_pwm_enable, 0);
2444static SENSOR_DEVICE_ATTR(pwm2_enable, S_IWUSR | S_IRUGO, show_pwm_enable,
2445 store_pwm_enable, 1);
2446static SENSOR_DEVICE_ATTR(pwm3_enable, S_IWUSR | S_IRUGO, show_pwm_enable,
2447 store_pwm_enable, 2);
2448static SENSOR_DEVICE_ATTR(pwm4_enable, S_IWUSR | S_IRUGO, show_pwm_enable,
2449 store_pwm_enable, 3);
2450static SENSOR_DEVICE_ATTR(pwm5_enable, S_IWUSR | S_IRUGO, show_pwm_enable,
2451 store_pwm_enable, 4);
2452
2453static SENSOR_DEVICE_ATTR(pwm1_temp_sel, S_IWUSR | S_IRUGO,
2454 show_pwm_temp_sel, store_pwm_temp_sel, 0);
2455static SENSOR_DEVICE_ATTR(pwm2_temp_sel, S_IWUSR | S_IRUGO,
2456 show_pwm_temp_sel, store_pwm_temp_sel, 1);
2457static SENSOR_DEVICE_ATTR(pwm3_temp_sel, S_IWUSR | S_IRUGO,
2458 show_pwm_temp_sel, store_pwm_temp_sel, 2);
2459static SENSOR_DEVICE_ATTR(pwm4_temp_sel, S_IWUSR | S_IRUGO,
2460 show_pwm_temp_sel, store_pwm_temp_sel, 3);
2461static SENSOR_DEVICE_ATTR(pwm5_temp_sel, S_IWUSR | S_IRUGO,
2462 show_pwm_temp_sel, store_pwm_temp_sel, 4);
2463
2464static SENSOR_DEVICE_ATTR(pwm1_target_temp, S_IWUSR | S_IRUGO, show_target_temp,
2465 store_target_temp, 0);
2466static SENSOR_DEVICE_ATTR(pwm2_target_temp, S_IWUSR | S_IRUGO, show_target_temp,
2467 store_target_temp, 1);
2468static SENSOR_DEVICE_ATTR(pwm3_target_temp, S_IWUSR | S_IRUGO, show_target_temp,
2469 store_target_temp, 2);
2470static SENSOR_DEVICE_ATTR(pwm4_target_temp, S_IWUSR | S_IRUGO, show_target_temp,
2471 store_target_temp, 3);
2472static SENSOR_DEVICE_ATTR(pwm5_target_temp, S_IWUSR | S_IRUGO, show_target_temp,
2473 store_target_temp, 4);
2474
2475static SENSOR_DEVICE_ATTR(fan1_target, S_IWUSR | S_IRUGO, show_target_speed,
2476 store_target_speed, 0);
2477static SENSOR_DEVICE_ATTR(fan2_target, S_IWUSR | S_IRUGO, show_target_speed,
2478 store_target_speed, 1);
2479static SENSOR_DEVICE_ATTR(fan3_target, S_IWUSR | S_IRUGO, show_target_speed,
2480 store_target_speed, 2);
2481static SENSOR_DEVICE_ATTR(fan4_target, S_IWUSR | S_IRUGO, show_target_speed,
2482 store_target_speed, 3);
2483static SENSOR_DEVICE_ATTR(fan5_target, S_IWUSR | S_IRUGO, show_target_speed,
2484 store_target_speed, 4);
2485
2486static SENSOR_DEVICE_ATTR(fan1_tolerance, S_IWUSR | S_IRUGO,
2487 show_speed_tolerance, store_speed_tolerance, 0);
2488static SENSOR_DEVICE_ATTR(fan2_tolerance, S_IWUSR | S_IRUGO,
2489 show_speed_tolerance, store_speed_tolerance, 1);
2490static SENSOR_DEVICE_ATTR(fan3_tolerance, S_IWUSR | S_IRUGO,
2491 show_speed_tolerance, store_speed_tolerance, 2);
2492static SENSOR_DEVICE_ATTR(fan4_tolerance, S_IWUSR | S_IRUGO,
2493 show_speed_tolerance, store_speed_tolerance, 3);
2494static SENSOR_DEVICE_ATTR(fan5_tolerance, S_IWUSR | S_IRUGO,
2495 show_speed_tolerance, store_speed_tolerance, 4);
2496 2641
2497/* Smart Fan registers */ 2642/* Smart Fan registers */
2498 2643
@@ -2531,79 +2676,18 @@ store_weight_temp(struct device *dev, struct device_attribute *attr,
2531 return count; 2676 return count;
2532} 2677}
2533 2678
2534static SENSOR_DEVICE_ATTR(pwm1_weight_temp_sel, S_IWUSR | S_IRUGO, 2679SENSOR_TEMPLATE(pwm_weight_temp_sel, "pwm%d_weight_temp_sel", S_IWUSR | S_IRUGO,
2535 show_pwm_weight_temp_sel, store_pwm_weight_temp_sel, 2680 show_pwm_weight_temp_sel, store_pwm_weight_temp_sel, 0);
2536 0); 2681SENSOR_TEMPLATE_2(pwm_weight_temp_step, "pwm%d_weight_temp_step",
2537static SENSOR_DEVICE_ATTR(pwm2_weight_temp_sel, S_IWUSR | S_IRUGO, 2682 S_IWUSR | S_IRUGO, show_weight_temp, store_weight_temp, 0, 0);
2538 show_pwm_weight_temp_sel, store_pwm_weight_temp_sel, 2683SENSOR_TEMPLATE_2(pwm_weight_temp_step_tol, "pwm%d_weight_temp_step_tol",
2539 1); 2684 S_IWUSR | S_IRUGO, show_weight_temp, store_weight_temp, 0, 1);
2540static SENSOR_DEVICE_ATTR(pwm3_weight_temp_sel, S_IWUSR | S_IRUGO, 2685SENSOR_TEMPLATE_2(pwm_weight_temp_step_base, "pwm%d_weight_temp_step_base",
2541 show_pwm_weight_temp_sel, store_pwm_weight_temp_sel, 2686 S_IWUSR | S_IRUGO, show_weight_temp, store_weight_temp, 0, 2);
2542 2); 2687SENSOR_TEMPLATE_2(pwm_weight_duty_step, "pwm%d_weight_duty_step",
2543static SENSOR_DEVICE_ATTR(pwm4_weight_temp_sel, S_IWUSR | S_IRUGO, 2688 S_IWUSR | S_IRUGO, show_pwm, store_pwm, 0, 5);
2544 show_pwm_weight_temp_sel, store_pwm_weight_temp_sel, 2689SENSOR_TEMPLATE_2(pwm_weight_duty_base, "pwm%d_weight_duty_base",
2545 3); 2690 S_IWUSR | S_IRUGO, show_pwm, store_pwm, 0, 6);
2546static SENSOR_DEVICE_ATTR(pwm5_weight_temp_sel, S_IWUSR | S_IRUGO,
2547 show_pwm_weight_temp_sel, store_pwm_weight_temp_sel,
2548 4);
2549
2550static SENSOR_DEVICE_ATTR_2(pwm1_weight_temp_step, S_IWUSR | S_IRUGO,
2551 show_weight_temp, store_weight_temp, 0, 0);
2552static SENSOR_DEVICE_ATTR_2(pwm2_weight_temp_step, S_IWUSR | S_IRUGO,
2553 show_weight_temp, store_weight_temp, 1, 0);
2554static SENSOR_DEVICE_ATTR_2(pwm3_weight_temp_step, S_IWUSR | S_IRUGO,
2555 show_weight_temp, store_weight_temp, 2, 0);
2556static SENSOR_DEVICE_ATTR_2(pwm4_weight_temp_step, S_IWUSR | S_IRUGO,
2557 show_weight_temp, store_weight_temp, 3, 0);
2558static SENSOR_DEVICE_ATTR_2(pwm5_weight_temp_step, S_IWUSR | S_IRUGO,
2559 show_weight_temp, store_weight_temp, 4, 0);
2560
2561static SENSOR_DEVICE_ATTR_2(pwm1_weight_temp_step_tol, S_IWUSR | S_IRUGO,
2562 show_weight_temp, store_weight_temp, 0, 1);
2563static SENSOR_DEVICE_ATTR_2(pwm2_weight_temp_step_tol, S_IWUSR | S_IRUGO,
2564 show_weight_temp, store_weight_temp, 1, 1);
2565static SENSOR_DEVICE_ATTR_2(pwm3_weight_temp_step_tol, S_IWUSR | S_IRUGO,
2566 show_weight_temp, store_weight_temp, 2, 1);
2567static SENSOR_DEVICE_ATTR_2(pwm4_weight_temp_step_tol, S_IWUSR | S_IRUGO,
2568 show_weight_temp, store_weight_temp, 3, 1);
2569static SENSOR_DEVICE_ATTR_2(pwm5_weight_temp_step_tol, S_IWUSR | S_IRUGO,
2570 show_weight_temp, store_weight_temp, 4, 1);
2571
2572static SENSOR_DEVICE_ATTR_2(pwm1_weight_temp_step_base, S_IWUSR | S_IRUGO,
2573 show_weight_temp, store_weight_temp, 0, 2);
2574static SENSOR_DEVICE_ATTR_2(pwm2_weight_temp_step_base, S_IWUSR | S_IRUGO,
2575 show_weight_temp, store_weight_temp, 1, 2);
2576static SENSOR_DEVICE_ATTR_2(pwm3_weight_temp_step_base, S_IWUSR | S_IRUGO,
2577 show_weight_temp, store_weight_temp, 2, 2);
2578static SENSOR_DEVICE_ATTR_2(pwm4_weight_temp_step_base, S_IWUSR | S_IRUGO,
2579 show_weight_temp, store_weight_temp, 3, 2);
2580static SENSOR_DEVICE_ATTR_2(pwm5_weight_temp_step_base, S_IWUSR | S_IRUGO,
2581 show_weight_temp, store_weight_temp, 4, 2);
2582
2583static SENSOR_DEVICE_ATTR_2(pwm1_weight_duty_step, S_IWUSR | S_IRUGO,
2584 show_pwm, store_pwm, 0, 5);
2585static SENSOR_DEVICE_ATTR_2(pwm2_weight_duty_step, S_IWUSR | S_IRUGO,
2586 show_pwm, store_pwm, 1, 5);
2587static SENSOR_DEVICE_ATTR_2(pwm3_weight_duty_step, S_IWUSR | S_IRUGO,
2588 show_pwm, store_pwm, 2, 5);
2589static SENSOR_DEVICE_ATTR_2(pwm4_weight_duty_step, S_IWUSR | S_IRUGO,
2590 show_pwm, store_pwm, 3, 5);
2591static SENSOR_DEVICE_ATTR_2(pwm5_weight_duty_step, S_IWUSR | S_IRUGO,
2592 show_pwm, store_pwm, 4, 5);
2593
2594/* duty_base is not supported on all chips */
2595static struct sensor_device_attribute_2 sda_weight_duty_base[] = {
2596 SENSOR_ATTR_2(pwm1_weight_duty_base, S_IWUSR | S_IRUGO,
2597 show_pwm, store_pwm, 0, 6),
2598 SENSOR_ATTR_2(pwm2_weight_duty_base, S_IWUSR | S_IRUGO,
2599 show_pwm, store_pwm, 1, 6),
2600 SENSOR_ATTR_2(pwm3_weight_duty_base, S_IWUSR | S_IRUGO,
2601 show_pwm, store_pwm, 2, 6),
2602 SENSOR_ATTR_2(pwm4_weight_duty_base, S_IWUSR | S_IRUGO,
2603 show_pwm, store_pwm, 3, 6),
2604 SENSOR_ATTR_2(pwm5_weight_duty_base, S_IWUSR | S_IRUGO,
2605 show_pwm, store_pwm, 4, 6),
2606};
2607 2691
2608static ssize_t 2692static ssize_t
2609show_fan_time(struct device *dev, struct device_attribute *attr, char *buf) 2693show_fan_time(struct device *dev, struct device_attribute *attr, char *buf)
@@ -2651,227 +2735,6 @@ show_name(struct device *dev, struct device_attribute *attr, char *buf)
2651 2735
2652static DEVICE_ATTR(name, S_IRUGO, show_name, NULL); 2736static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
2653 2737
2654static SENSOR_DEVICE_ATTR_2(pwm1_stop_time, S_IWUSR | S_IRUGO, show_fan_time,
2655 store_fan_time, 0, 0);
2656static SENSOR_DEVICE_ATTR_2(pwm2_stop_time, S_IWUSR | S_IRUGO, show_fan_time,
2657 store_fan_time, 1, 0);
2658static SENSOR_DEVICE_ATTR_2(pwm3_stop_time, S_IWUSR | S_IRUGO, show_fan_time,
2659 store_fan_time, 2, 0);
2660static SENSOR_DEVICE_ATTR_2(pwm4_stop_time, S_IWUSR | S_IRUGO, show_fan_time,
2661 store_fan_time, 3, 0);
2662static SENSOR_DEVICE_ATTR_2(pwm5_stop_time, S_IWUSR | S_IRUGO, show_fan_time,
2663 store_fan_time, 4, 0);
2664
2665static SENSOR_DEVICE_ATTR_2(pwm1_step_up_time, S_IWUSR | S_IRUGO, show_fan_time,
2666 store_fan_time, 0, 1);
2667static SENSOR_DEVICE_ATTR_2(pwm2_step_up_time, S_IWUSR | S_IRUGO, show_fan_time,
2668 store_fan_time, 1, 1);
2669static SENSOR_DEVICE_ATTR_2(pwm3_step_up_time, S_IWUSR | S_IRUGO, show_fan_time,
2670 store_fan_time, 2, 1);
2671static SENSOR_DEVICE_ATTR_2(pwm4_step_up_time, S_IWUSR | S_IRUGO, show_fan_time,
2672 store_fan_time, 3, 1);
2673static SENSOR_DEVICE_ATTR_2(pwm5_step_up_time, S_IWUSR | S_IRUGO, show_fan_time,
2674 store_fan_time, 4, 1);
2675
2676static SENSOR_DEVICE_ATTR_2(pwm1_step_down_time, S_IWUSR | S_IRUGO,
2677 show_fan_time, store_fan_time, 0, 2);
2678static SENSOR_DEVICE_ATTR_2(pwm2_step_down_time, S_IWUSR | S_IRUGO,
2679 show_fan_time, store_fan_time, 1, 2);
2680static SENSOR_DEVICE_ATTR_2(pwm3_step_down_time, S_IWUSR | S_IRUGO,
2681 show_fan_time, store_fan_time, 2, 2);
2682static SENSOR_DEVICE_ATTR_2(pwm4_step_down_time, S_IWUSR | S_IRUGO,
2683 show_fan_time, store_fan_time, 3, 2);
2684static SENSOR_DEVICE_ATTR_2(pwm5_step_down_time, S_IWUSR | S_IRUGO,
2685 show_fan_time, store_fan_time, 4, 2);
2686
2687static SENSOR_DEVICE_ATTR_2(pwm1_start, S_IWUSR | S_IRUGO, show_pwm,
2688 store_pwm, 0, 1);
2689static SENSOR_DEVICE_ATTR_2(pwm2_start, S_IWUSR | S_IRUGO, show_pwm,
2690 store_pwm, 1, 1);
2691static SENSOR_DEVICE_ATTR_2(pwm3_start, S_IWUSR | S_IRUGO, show_pwm,
2692 store_pwm, 2, 1);
2693static SENSOR_DEVICE_ATTR_2(pwm4_start, S_IWUSR | S_IRUGO, show_pwm,
2694 store_pwm, 3, 1);
2695static SENSOR_DEVICE_ATTR_2(pwm5_start, S_IWUSR | S_IRUGO, show_pwm,
2696 store_pwm, 4, 1);
2697
2698static SENSOR_DEVICE_ATTR_2(pwm1_floor, S_IWUSR | S_IRUGO, show_pwm,
2699 store_pwm, 0, 2);
2700static SENSOR_DEVICE_ATTR_2(pwm2_floor, S_IWUSR | S_IRUGO, show_pwm,
2701 store_pwm, 1, 2);
2702static SENSOR_DEVICE_ATTR_2(pwm3_floor, S_IWUSR | S_IRUGO, show_pwm,
2703 store_pwm, 2, 2);
2704static SENSOR_DEVICE_ATTR_2(pwm4_floor, S_IWUSR | S_IRUGO, show_pwm,
2705 store_pwm, 3, 2);
2706static SENSOR_DEVICE_ATTR_2(pwm5_floor, S_IWUSR | S_IRUGO, show_pwm,
2707 store_pwm, 4, 2);
2708
2709static SENSOR_DEVICE_ATTR_2(pwm1_temp_tolerance, S_IWUSR | S_IRUGO,
2710 show_temp_tolerance, store_temp_tolerance, 0, 0);
2711static SENSOR_DEVICE_ATTR_2(pwm2_temp_tolerance, S_IWUSR | S_IRUGO,
2712 show_temp_tolerance, store_temp_tolerance, 1, 0);
2713static SENSOR_DEVICE_ATTR_2(pwm3_temp_tolerance, S_IWUSR | S_IRUGO,
2714 show_temp_tolerance, store_temp_tolerance, 2, 0);
2715static SENSOR_DEVICE_ATTR_2(pwm4_temp_tolerance, S_IWUSR | S_IRUGO,
2716 show_temp_tolerance, store_temp_tolerance, 3, 0);
2717static SENSOR_DEVICE_ATTR_2(pwm5_temp_tolerance, S_IWUSR | S_IRUGO,
2718 show_temp_tolerance, store_temp_tolerance, 4, 0);
2719
2720static SENSOR_DEVICE_ATTR_2(pwm1_crit_temp_tolerance, S_IWUSR | S_IRUGO,
2721 show_temp_tolerance, store_temp_tolerance, 0, 1);
2722static SENSOR_DEVICE_ATTR_2(pwm2_crit_temp_tolerance, S_IWUSR | S_IRUGO,
2723 show_temp_tolerance, store_temp_tolerance, 1, 1);
2724static SENSOR_DEVICE_ATTR_2(pwm3_crit_temp_tolerance, S_IWUSR | S_IRUGO,
2725 show_temp_tolerance, store_temp_tolerance, 2, 1);
2726static SENSOR_DEVICE_ATTR_2(pwm4_crit_temp_tolerance, S_IWUSR | S_IRUGO,
2727 show_temp_tolerance, store_temp_tolerance, 3, 1);
2728static SENSOR_DEVICE_ATTR_2(pwm5_crit_temp_tolerance, S_IWUSR | S_IRUGO,
2729 show_temp_tolerance, store_temp_tolerance, 4, 1);
2730
2731/* pwm_max is not supported on all chips */
2732static struct sensor_device_attribute_2 sda_pwm_max[] = {
2733 SENSOR_ATTR_2(pwm1_max, S_IWUSR | S_IRUGO, show_pwm, store_pwm,
2734 0, 3),
2735 SENSOR_ATTR_2(pwm2_max, S_IWUSR | S_IRUGO, show_pwm, store_pwm,
2736 1, 3),
2737 SENSOR_ATTR_2(pwm3_max, S_IWUSR | S_IRUGO, show_pwm, store_pwm,
2738 2, 3),
2739 SENSOR_ATTR_2(pwm4_max, S_IWUSR | S_IRUGO, show_pwm, store_pwm,
2740 3, 3),
2741 SENSOR_ATTR_2(pwm5_max, S_IWUSR | S_IRUGO, show_pwm, store_pwm,
2742 4, 3),
2743};
2744
2745/* pwm_step is not supported on all chips */
2746static struct sensor_device_attribute_2 sda_pwm_step[] = {
2747 SENSOR_ATTR_2(pwm1_step, S_IWUSR | S_IRUGO, show_pwm, store_pwm, 0, 4),
2748 SENSOR_ATTR_2(pwm2_step, S_IWUSR | S_IRUGO, show_pwm, store_pwm, 1, 4),
2749 SENSOR_ATTR_2(pwm3_step, S_IWUSR | S_IRUGO, show_pwm, store_pwm, 2, 4),
2750 SENSOR_ATTR_2(pwm4_step, S_IWUSR | S_IRUGO, show_pwm, store_pwm, 3, 4),
2751 SENSOR_ATTR_2(pwm5_step, S_IWUSR | S_IRUGO, show_pwm, store_pwm, 4, 4),
2752};
2753
2754static struct attribute *nct6775_attributes_pwm[5][20] = {
2755 {
2756 &sensor_dev_attr_pwm1.dev_attr.attr,
2757 &sensor_dev_attr_pwm1_mode.dev_attr.attr,
2758 &sensor_dev_attr_pwm1_enable.dev_attr.attr,
2759 &sensor_dev_attr_pwm1_temp_sel.dev_attr.attr,
2760 &sensor_dev_attr_pwm1_temp_tolerance.dev_attr.attr,
2761 &sensor_dev_attr_pwm1_crit_temp_tolerance.dev_attr.attr,
2762 &sensor_dev_attr_pwm1_target_temp.dev_attr.attr,
2763 &sensor_dev_attr_fan1_target.dev_attr.attr,
2764 &sensor_dev_attr_fan1_tolerance.dev_attr.attr,
2765 &sensor_dev_attr_pwm1_stop_time.dev_attr.attr,
2766 &sensor_dev_attr_pwm1_step_up_time.dev_attr.attr,
2767 &sensor_dev_attr_pwm1_step_down_time.dev_attr.attr,
2768 &sensor_dev_attr_pwm1_start.dev_attr.attr,
2769 &sensor_dev_attr_pwm1_floor.dev_attr.attr,
2770 &sensor_dev_attr_pwm1_weight_temp_sel.dev_attr.attr,
2771 &sensor_dev_attr_pwm1_weight_temp_step.dev_attr.attr,
2772 &sensor_dev_attr_pwm1_weight_temp_step_tol.dev_attr.attr,
2773 &sensor_dev_attr_pwm1_weight_temp_step_base.dev_attr.attr,
2774 &sensor_dev_attr_pwm1_weight_duty_step.dev_attr.attr,
2775 NULL
2776 },
2777 {
2778 &sensor_dev_attr_pwm2.dev_attr.attr,
2779 &sensor_dev_attr_pwm2_mode.dev_attr.attr,
2780 &sensor_dev_attr_pwm2_enable.dev_attr.attr,
2781 &sensor_dev_attr_pwm2_temp_sel.dev_attr.attr,
2782 &sensor_dev_attr_pwm2_temp_tolerance.dev_attr.attr,
2783 &sensor_dev_attr_pwm2_crit_temp_tolerance.dev_attr.attr,
2784 &sensor_dev_attr_pwm2_target_temp.dev_attr.attr,
2785 &sensor_dev_attr_fan2_target.dev_attr.attr,
2786 &sensor_dev_attr_fan2_tolerance.dev_attr.attr,
2787 &sensor_dev_attr_pwm2_stop_time.dev_attr.attr,
2788 &sensor_dev_attr_pwm2_step_up_time.dev_attr.attr,
2789 &sensor_dev_attr_pwm2_step_down_time.dev_attr.attr,
2790 &sensor_dev_attr_pwm2_start.dev_attr.attr,
2791 &sensor_dev_attr_pwm2_floor.dev_attr.attr,
2792 &sensor_dev_attr_pwm2_weight_temp_sel.dev_attr.attr,
2793 &sensor_dev_attr_pwm2_weight_temp_step.dev_attr.attr,
2794 &sensor_dev_attr_pwm2_weight_temp_step_tol.dev_attr.attr,
2795 &sensor_dev_attr_pwm2_weight_temp_step_base.dev_attr.attr,
2796 &sensor_dev_attr_pwm2_weight_duty_step.dev_attr.attr,
2797 NULL
2798 },
2799 {
2800 &sensor_dev_attr_pwm3.dev_attr.attr,
2801 &sensor_dev_attr_pwm3_mode.dev_attr.attr,
2802 &sensor_dev_attr_pwm3_enable.dev_attr.attr,
2803 &sensor_dev_attr_pwm3_temp_sel.dev_attr.attr,
2804 &sensor_dev_attr_pwm3_temp_tolerance.dev_attr.attr,
2805 &sensor_dev_attr_pwm3_crit_temp_tolerance.dev_attr.attr,
2806 &sensor_dev_attr_pwm3_target_temp.dev_attr.attr,
2807 &sensor_dev_attr_fan3_target.dev_attr.attr,
2808 &sensor_dev_attr_fan3_tolerance.dev_attr.attr,
2809 &sensor_dev_attr_pwm3_stop_time.dev_attr.attr,
2810 &sensor_dev_attr_pwm3_step_up_time.dev_attr.attr,
2811 &sensor_dev_attr_pwm3_step_down_time.dev_attr.attr,
2812 &sensor_dev_attr_pwm3_start.dev_attr.attr,
2813 &sensor_dev_attr_pwm3_floor.dev_attr.attr,
2814 &sensor_dev_attr_pwm3_weight_temp_sel.dev_attr.attr,
2815 &sensor_dev_attr_pwm3_weight_temp_step.dev_attr.attr,
2816 &sensor_dev_attr_pwm3_weight_temp_step_tol.dev_attr.attr,
2817 &sensor_dev_attr_pwm3_weight_temp_step_base.dev_attr.attr,
2818 &sensor_dev_attr_pwm3_weight_duty_step.dev_attr.attr,
2819 NULL
2820 },
2821 {
2822 &sensor_dev_attr_pwm4.dev_attr.attr,
2823 &sensor_dev_attr_pwm4_mode.dev_attr.attr,
2824 &sensor_dev_attr_pwm4_enable.dev_attr.attr,
2825 &sensor_dev_attr_pwm4_temp_sel.dev_attr.attr,
2826 &sensor_dev_attr_pwm4_temp_tolerance.dev_attr.attr,
2827 &sensor_dev_attr_pwm4_crit_temp_tolerance.dev_attr.attr,
2828 &sensor_dev_attr_pwm4_target_temp.dev_attr.attr,
2829 &sensor_dev_attr_fan4_target.dev_attr.attr,
2830 &sensor_dev_attr_fan4_tolerance.dev_attr.attr,
2831 &sensor_dev_attr_pwm4_stop_time.dev_attr.attr,
2832 &sensor_dev_attr_pwm4_step_up_time.dev_attr.attr,
2833 &sensor_dev_attr_pwm4_step_down_time.dev_attr.attr,
2834 &sensor_dev_attr_pwm4_start.dev_attr.attr,
2835 &sensor_dev_attr_pwm4_floor.dev_attr.attr,
2836 &sensor_dev_attr_pwm4_weight_temp_sel.dev_attr.attr,
2837 &sensor_dev_attr_pwm4_weight_temp_step.dev_attr.attr,
2838 &sensor_dev_attr_pwm4_weight_temp_step_tol.dev_attr.attr,
2839 &sensor_dev_attr_pwm4_weight_temp_step_base.dev_attr.attr,
2840 &sensor_dev_attr_pwm4_weight_duty_step.dev_attr.attr,
2841 NULL
2842 },
2843 {
2844 &sensor_dev_attr_pwm5.dev_attr.attr,
2845 &sensor_dev_attr_pwm5_mode.dev_attr.attr,
2846 &sensor_dev_attr_pwm5_enable.dev_attr.attr,
2847 &sensor_dev_attr_pwm5_temp_sel.dev_attr.attr,
2848 &sensor_dev_attr_pwm5_temp_tolerance.dev_attr.attr,
2849 &sensor_dev_attr_pwm5_crit_temp_tolerance.dev_attr.attr,
2850 &sensor_dev_attr_pwm5_target_temp.dev_attr.attr,
2851 &sensor_dev_attr_fan5_target.dev_attr.attr,
2852 &sensor_dev_attr_fan5_tolerance.dev_attr.attr,
2853 &sensor_dev_attr_pwm5_stop_time.dev_attr.attr,
2854 &sensor_dev_attr_pwm5_step_up_time.dev_attr.attr,
2855 &sensor_dev_attr_pwm5_step_down_time.dev_attr.attr,
2856 &sensor_dev_attr_pwm5_start.dev_attr.attr,
2857 &sensor_dev_attr_pwm5_floor.dev_attr.attr,
2858 &sensor_dev_attr_pwm5_weight_temp_sel.dev_attr.attr,
2859 &sensor_dev_attr_pwm5_weight_temp_step.dev_attr.attr,
2860 &sensor_dev_attr_pwm5_weight_temp_step_tol.dev_attr.attr,
2861 &sensor_dev_attr_pwm5_weight_temp_step_base.dev_attr.attr,
2862 &sensor_dev_attr_pwm5_weight_duty_step.dev_attr.attr,
2863 NULL
2864 },
2865};
2866
2867static const struct attribute_group nct6775_group_pwm[5] = {
2868 { .attrs = nct6775_attributes_pwm[0] },
2869 { .attrs = nct6775_attributes_pwm[1] },
2870 { .attrs = nct6775_attributes_pwm[2] },
2871 { .attrs = nct6775_attributes_pwm[3] },
2872 { .attrs = nct6775_attributes_pwm[4] },
2873};
2874
2875static ssize_t 2738static ssize_t
2876show_auto_pwm(struct device *dev, struct device_attribute *attr, char *buf) 2739show_auto_pwm(struct device *dev, struct device_attribute *attr, char *buf)
2877{ 2740{
@@ -2927,17 +2790,19 @@ store_auto_pwm(struct device *dev, struct device_attribute *attr,
2927 break; 2790 break;
2928 case nct6776: 2791 case nct6776:
2929 break; /* always enabled, nothing to do */ 2792 break; /* always enabled, nothing to do */
2793 case nct6106:
2930 case nct6779: 2794 case nct6779:
2931 nct6775_write_value(data, NCT6779_REG_CRITICAL_PWM[nr], 2795 case nct6791:
2796 nct6775_write_value(data, data->REG_CRITICAL_PWM[nr],
2932 val); 2797 val);
2933 reg = nct6775_read_value(data, 2798 reg = nct6775_read_value(data,
2934 NCT6779_REG_CRITICAL_PWM_ENABLE[nr]); 2799 data->REG_CRITICAL_PWM_ENABLE[nr]);
2935 if (val == 255) 2800 if (val == 255)
2936 reg &= ~0x01; 2801 reg &= ~data->CRITICAL_PWM_ENABLE_MASK;
2937 else 2802 else
2938 reg |= 0x01; 2803 reg |= data->CRITICAL_PWM_ENABLE_MASK;
2939 nct6775_write_value(data, 2804 nct6775_write_value(data,
2940 NCT6779_REG_CRITICAL_PWM_ENABLE[nr], 2805 data->REG_CRITICAL_PWM_ENABLE[nr],
2941 reg); 2806 reg);
2942 break; 2807 break;
2943 } 2808 }
@@ -2992,155 +2857,140 @@ store_auto_temp(struct device *dev, struct device_attribute *attr,
2992 return count; 2857 return count;
2993} 2858}
2994 2859
2860static umode_t nct6775_pwm_is_visible(struct kobject *kobj,
2861 struct attribute *attr, int index)
2862{
2863 struct device *dev = container_of(kobj, struct device, kobj);
2864 struct nct6775_data *data = dev_get_drvdata(dev);
2865 int pwm = index / 36; /* pwm index */
2866 int nr = index % 36; /* attribute index */
2867
2868 if (!(data->has_pwm & (1 << pwm)))
2869 return 0;
2870
2871 if (nr == 19 && data->REG_PWM[3] == NULL) /* pwm_max */
2872 return 0;
2873 if (nr == 20 && data->REG_PWM[4] == NULL) /* pwm_step */
2874 return 0;
2875 if (nr == 21 && data->REG_PWM[6] == NULL) /* weight_duty_base */
2876 return 0;
2877
2878 if (nr >= 22 && nr <= 35) { /* auto point */
2879 int api = (nr - 22) / 2; /* auto point index */
2880
2881 if (api > data->auto_pwm_num)
2882 return 0;
2883 }
2884 return attr->mode;
2885}
2886
2887SENSOR_TEMPLATE_2(pwm_stop_time, "pwm%d_stop_time", S_IWUSR | S_IRUGO,
2888 show_fan_time, store_fan_time, 0, 0);
2889SENSOR_TEMPLATE_2(pwm_step_up_time, "pwm%d_step_up_time", S_IWUSR | S_IRUGO,
2890 show_fan_time, store_fan_time, 0, 1);
2891SENSOR_TEMPLATE_2(pwm_step_down_time, "pwm%d_step_down_time", S_IWUSR | S_IRUGO,
2892 show_fan_time, store_fan_time, 0, 2);
2893SENSOR_TEMPLATE_2(pwm_start, "pwm%d_start", S_IWUSR | S_IRUGO, show_pwm,
2894 store_pwm, 0, 1);
2895SENSOR_TEMPLATE_2(pwm_floor, "pwm%d_floor", S_IWUSR | S_IRUGO, show_pwm,
2896 store_pwm, 0, 2);
2897SENSOR_TEMPLATE_2(pwm_temp_tolerance, "pwm%d_temp_tolerance", S_IWUSR | S_IRUGO,
2898 show_temp_tolerance, store_temp_tolerance, 0, 0);
2899SENSOR_TEMPLATE_2(pwm_crit_temp_tolerance, "pwm%d_crit_temp_tolerance",
2900 S_IWUSR | S_IRUGO, show_temp_tolerance, store_temp_tolerance,
2901 0, 1);
2902
2903SENSOR_TEMPLATE_2(pwm_max, "pwm%d_max", S_IWUSR | S_IRUGO, show_pwm, store_pwm,
2904 0, 3);
2905
2906SENSOR_TEMPLATE_2(pwm_step, "pwm%d_step", S_IWUSR | S_IRUGO, show_pwm,
2907 store_pwm, 0, 4);
2908
2909SENSOR_TEMPLATE_2(pwm_auto_point1_pwm, "pwm%d_auto_point1_pwm",
2910 S_IWUSR | S_IRUGO, show_auto_pwm, store_auto_pwm, 0, 0);
2911SENSOR_TEMPLATE_2(pwm_auto_point1_temp, "pwm%d_auto_point1_temp",
2912 S_IWUSR | S_IRUGO, show_auto_temp, store_auto_temp, 0, 0);
2913
2914SENSOR_TEMPLATE_2(pwm_auto_point2_pwm, "pwm%d_auto_point2_pwm",
2915 S_IWUSR | S_IRUGO, show_auto_pwm, store_auto_pwm, 0, 1);
2916SENSOR_TEMPLATE_2(pwm_auto_point2_temp, "pwm%d_auto_point2_temp",
2917 S_IWUSR | S_IRUGO, show_auto_temp, store_auto_temp, 0, 1);
2918
2919SENSOR_TEMPLATE_2(pwm_auto_point3_pwm, "pwm%d_auto_point3_pwm",
2920 S_IWUSR | S_IRUGO, show_auto_pwm, store_auto_pwm, 0, 2);
2921SENSOR_TEMPLATE_2(pwm_auto_point3_temp, "pwm%d_auto_point3_temp",
2922 S_IWUSR | S_IRUGO, show_auto_temp, store_auto_temp, 0, 2);
2923
2924SENSOR_TEMPLATE_2(pwm_auto_point4_pwm, "pwm%d_auto_point4_pwm",
2925 S_IWUSR | S_IRUGO, show_auto_pwm, store_auto_pwm, 0, 3);
2926SENSOR_TEMPLATE_2(pwm_auto_point4_temp, "pwm%d_auto_point4_temp",
2927 S_IWUSR | S_IRUGO, show_auto_temp, store_auto_temp, 0, 3);
2928
2929SENSOR_TEMPLATE_2(pwm_auto_point5_pwm, "pwm%d_auto_point5_pwm",
2930 S_IWUSR | S_IRUGO, show_auto_pwm, store_auto_pwm, 0, 4);
2931SENSOR_TEMPLATE_2(pwm_auto_point5_temp, "pwm%d_auto_point5_temp",
2932 S_IWUSR | S_IRUGO, show_auto_temp, store_auto_temp, 0, 4);
2933
2934SENSOR_TEMPLATE_2(pwm_auto_point6_pwm, "pwm%d_auto_point6_pwm",
2935 S_IWUSR | S_IRUGO, show_auto_pwm, store_auto_pwm, 0, 5);
2936SENSOR_TEMPLATE_2(pwm_auto_point6_temp, "pwm%d_auto_point6_temp",
2937 S_IWUSR | S_IRUGO, show_auto_temp, store_auto_temp, 0, 5);
2938
2939SENSOR_TEMPLATE_2(pwm_auto_point7_pwm, "pwm%d_auto_point7_pwm",
2940 S_IWUSR | S_IRUGO, show_auto_pwm, store_auto_pwm, 0, 6);
2941SENSOR_TEMPLATE_2(pwm_auto_point7_temp, "pwm%d_auto_point7_temp",
2942 S_IWUSR | S_IRUGO, show_auto_temp, store_auto_temp, 0, 6);
2943
2995/* 2944/*
2996 * The number of auto-point trip points is chip dependent. 2945 * nct6775_pwm_is_visible uses the index into the following array
2997 * Need to check support while generating/removing attribute files. 2946 * to determine if attributes should be created or not.
2947 * Any change in order or content must be matched.
2998 */ 2948 */
2999static struct sensor_device_attribute_2 sda_auto_pwm_arrays[] = { 2949static struct sensor_device_template *nct6775_attributes_pwm_template[] = {
3000 SENSOR_ATTR_2(pwm1_auto_point1_pwm, S_IWUSR | S_IRUGO, 2950 &sensor_dev_template_pwm,
3001 show_auto_pwm, store_auto_pwm, 0, 0), 2951 &sensor_dev_template_pwm_mode,
3002 SENSOR_ATTR_2(pwm1_auto_point1_temp, S_IWUSR | S_IRUGO, 2952 &sensor_dev_template_pwm_enable,
3003 show_auto_temp, store_auto_temp, 0, 0), 2953 &sensor_dev_template_pwm_temp_sel,
3004 SENSOR_ATTR_2(pwm1_auto_point2_pwm, S_IWUSR | S_IRUGO, 2954 &sensor_dev_template_pwm_temp_tolerance,
3005 show_auto_pwm, store_auto_pwm, 0, 1), 2955 &sensor_dev_template_pwm_crit_temp_tolerance,
3006 SENSOR_ATTR_2(pwm1_auto_point2_temp, S_IWUSR | S_IRUGO, 2956 &sensor_dev_template_pwm_target_temp,
3007 show_auto_temp, store_auto_temp, 0, 1), 2957 &sensor_dev_template_fan_target,
3008 SENSOR_ATTR_2(pwm1_auto_point3_pwm, S_IWUSR | S_IRUGO, 2958 &sensor_dev_template_fan_tolerance,
3009 show_auto_pwm, store_auto_pwm, 0, 2), 2959 &sensor_dev_template_pwm_stop_time,
3010 SENSOR_ATTR_2(pwm1_auto_point3_temp, S_IWUSR | S_IRUGO, 2960 &sensor_dev_template_pwm_step_up_time,
3011 show_auto_temp, store_auto_temp, 0, 2), 2961 &sensor_dev_template_pwm_step_down_time,
3012 SENSOR_ATTR_2(pwm1_auto_point4_pwm, S_IWUSR | S_IRUGO, 2962 &sensor_dev_template_pwm_start,
3013 show_auto_pwm, store_auto_pwm, 0, 3), 2963 &sensor_dev_template_pwm_floor,
3014 SENSOR_ATTR_2(pwm1_auto_point4_temp, S_IWUSR | S_IRUGO, 2964 &sensor_dev_template_pwm_weight_temp_sel,
3015 show_auto_temp, store_auto_temp, 0, 3), 2965 &sensor_dev_template_pwm_weight_temp_step,
3016 SENSOR_ATTR_2(pwm1_auto_point5_pwm, S_IWUSR | S_IRUGO, 2966 &sensor_dev_template_pwm_weight_temp_step_tol,
3017 show_auto_pwm, store_auto_pwm, 0, 4), 2967 &sensor_dev_template_pwm_weight_temp_step_base,
3018 SENSOR_ATTR_2(pwm1_auto_point5_temp, S_IWUSR | S_IRUGO, 2968 &sensor_dev_template_pwm_weight_duty_step,
3019 show_auto_temp, store_auto_temp, 0, 4), 2969 &sensor_dev_template_pwm_max, /* 19 */
3020 SENSOR_ATTR_2(pwm1_auto_point6_pwm, S_IWUSR | S_IRUGO, 2970 &sensor_dev_template_pwm_step, /* 20 */
3021 show_auto_pwm, store_auto_pwm, 0, 5), 2971 &sensor_dev_template_pwm_weight_duty_base, /* 21 */
3022 SENSOR_ATTR_2(pwm1_auto_point6_temp, S_IWUSR | S_IRUGO, 2972 &sensor_dev_template_pwm_auto_point1_pwm, /* 22 */
3023 show_auto_temp, store_auto_temp, 0, 5), 2973 &sensor_dev_template_pwm_auto_point1_temp,
3024 SENSOR_ATTR_2(pwm1_auto_point7_pwm, S_IWUSR | S_IRUGO, 2974 &sensor_dev_template_pwm_auto_point2_pwm,
3025 show_auto_pwm, store_auto_pwm, 0, 6), 2975 &sensor_dev_template_pwm_auto_point2_temp,
3026 SENSOR_ATTR_2(pwm1_auto_point7_temp, S_IWUSR | S_IRUGO, 2976 &sensor_dev_template_pwm_auto_point3_pwm,
3027 show_auto_temp, store_auto_temp, 0, 6), 2977 &sensor_dev_template_pwm_auto_point3_temp,
3028 2978 &sensor_dev_template_pwm_auto_point4_pwm,
3029 SENSOR_ATTR_2(pwm2_auto_point1_pwm, S_IWUSR | S_IRUGO, 2979 &sensor_dev_template_pwm_auto_point4_temp,
3030 show_auto_pwm, store_auto_pwm, 1, 0), 2980 &sensor_dev_template_pwm_auto_point5_pwm,
3031 SENSOR_ATTR_2(pwm2_auto_point1_temp, S_IWUSR | S_IRUGO, 2981 &sensor_dev_template_pwm_auto_point5_temp,
3032 show_auto_temp, store_auto_temp, 1, 0), 2982 &sensor_dev_template_pwm_auto_point6_pwm,
3033 SENSOR_ATTR_2(pwm2_auto_point2_pwm, S_IWUSR | S_IRUGO, 2983 &sensor_dev_template_pwm_auto_point6_temp,
3034 show_auto_pwm, store_auto_pwm, 1, 1), 2984 &sensor_dev_template_pwm_auto_point7_pwm,
3035 SENSOR_ATTR_2(pwm2_auto_point2_temp, S_IWUSR | S_IRUGO, 2985 &sensor_dev_template_pwm_auto_point7_temp, /* 35 */
3036 show_auto_temp, store_auto_temp, 1, 1), 2986
3037 SENSOR_ATTR_2(pwm2_auto_point3_pwm, S_IWUSR | S_IRUGO, 2987 NULL
3038 show_auto_pwm, store_auto_pwm, 1, 2), 2988};
3039 SENSOR_ATTR_2(pwm2_auto_point3_temp, S_IWUSR | S_IRUGO, 2989
3040 show_auto_temp, store_auto_temp, 1, 2), 2990static struct sensor_template_group nct6775_pwm_template_group = {
3041 SENSOR_ATTR_2(pwm2_auto_point4_pwm, S_IWUSR | S_IRUGO, 2991 .templates = nct6775_attributes_pwm_template,
3042 show_auto_pwm, store_auto_pwm, 1, 3), 2992 .is_visible = nct6775_pwm_is_visible,
3043 SENSOR_ATTR_2(pwm2_auto_point4_temp, S_IWUSR | S_IRUGO, 2993 .base = 1,
3044 show_auto_temp, store_auto_temp, 1, 3),
3045 SENSOR_ATTR_2(pwm2_auto_point5_pwm, S_IWUSR | S_IRUGO,
3046 show_auto_pwm, store_auto_pwm, 1, 4),
3047 SENSOR_ATTR_2(pwm2_auto_point5_temp, S_IWUSR | S_IRUGO,
3048 show_auto_temp, store_auto_temp, 1, 4),
3049 SENSOR_ATTR_2(pwm2_auto_point6_pwm, S_IWUSR | S_IRUGO,
3050 show_auto_pwm, store_auto_pwm, 1, 5),
3051 SENSOR_ATTR_2(pwm2_auto_point6_temp, S_IWUSR | S_IRUGO,
3052 show_auto_temp, store_auto_temp, 1, 5),
3053 SENSOR_ATTR_2(pwm2_auto_point7_pwm, S_IWUSR | S_IRUGO,
3054 show_auto_pwm, store_auto_pwm, 1, 6),
3055 SENSOR_ATTR_2(pwm2_auto_point7_temp, S_IWUSR | S_IRUGO,
3056 show_auto_temp, store_auto_temp, 1, 6),
3057
3058 SENSOR_ATTR_2(pwm3_auto_point1_pwm, S_IWUSR | S_IRUGO,
3059 show_auto_pwm, store_auto_pwm, 2, 0),
3060 SENSOR_ATTR_2(pwm3_auto_point1_temp, S_IWUSR | S_IRUGO,
3061 show_auto_temp, store_auto_temp, 2, 0),
3062 SENSOR_ATTR_2(pwm3_auto_point2_pwm, S_IWUSR | S_IRUGO,
3063 show_auto_pwm, store_auto_pwm, 2, 1),
3064 SENSOR_ATTR_2(pwm3_auto_point2_temp, S_IWUSR | S_IRUGO,
3065 show_auto_temp, store_auto_temp, 2, 1),
3066 SENSOR_ATTR_2(pwm3_auto_point3_pwm, S_IWUSR | S_IRUGO,
3067 show_auto_pwm, store_auto_pwm, 2, 2),
3068 SENSOR_ATTR_2(pwm3_auto_point3_temp, S_IWUSR | S_IRUGO,
3069 show_auto_temp, store_auto_temp, 2, 2),
3070 SENSOR_ATTR_2(pwm3_auto_point4_pwm, S_IWUSR | S_IRUGO,
3071 show_auto_pwm, store_auto_pwm, 2, 3),
3072 SENSOR_ATTR_2(pwm3_auto_point4_temp, S_IWUSR | S_IRUGO,
3073 show_auto_temp, store_auto_temp, 2, 3),
3074 SENSOR_ATTR_2(pwm3_auto_point5_pwm, S_IWUSR | S_IRUGO,
3075 show_auto_pwm, store_auto_pwm, 2, 4),
3076 SENSOR_ATTR_2(pwm3_auto_point5_temp, S_IWUSR | S_IRUGO,
3077 show_auto_temp, store_auto_temp, 2, 4),
3078 SENSOR_ATTR_2(pwm3_auto_point6_pwm, S_IWUSR | S_IRUGO,
3079 show_auto_pwm, store_auto_pwm, 2, 5),
3080 SENSOR_ATTR_2(pwm3_auto_point6_temp, S_IWUSR | S_IRUGO,
3081 show_auto_temp, store_auto_temp, 2, 5),
3082 SENSOR_ATTR_2(pwm3_auto_point7_pwm, S_IWUSR | S_IRUGO,
3083 show_auto_pwm, store_auto_pwm, 2, 6),
3084 SENSOR_ATTR_2(pwm3_auto_point7_temp, S_IWUSR | S_IRUGO,
3085 show_auto_temp, store_auto_temp, 2, 6),
3086
3087 SENSOR_ATTR_2(pwm4_auto_point1_pwm, S_IWUSR | S_IRUGO,
3088 show_auto_pwm, store_auto_pwm, 3, 0),
3089 SENSOR_ATTR_2(pwm4_auto_point1_temp, S_IWUSR | S_IRUGO,
3090 show_auto_temp, store_auto_temp, 3, 0),
3091 SENSOR_ATTR_2(pwm4_auto_point2_pwm, S_IWUSR | S_IRUGO,
3092 show_auto_pwm, store_auto_pwm, 3, 1),
3093 SENSOR_ATTR_2(pwm4_auto_point2_temp, S_IWUSR | S_IRUGO,
3094 show_auto_temp, store_auto_temp, 3, 1),
3095 SENSOR_ATTR_2(pwm4_auto_point3_pwm, S_IWUSR | S_IRUGO,
3096 show_auto_pwm, store_auto_pwm, 3, 2),
3097 SENSOR_ATTR_2(pwm4_auto_point3_temp, S_IWUSR | S_IRUGO,
3098 show_auto_temp, store_auto_temp, 3, 2),
3099 SENSOR_ATTR_2(pwm4_auto_point4_pwm, S_IWUSR | S_IRUGO,
3100 show_auto_pwm, store_auto_pwm, 3, 3),
3101 SENSOR_ATTR_2(pwm4_auto_point4_temp, S_IWUSR | S_IRUGO,
3102 show_auto_temp, store_auto_temp, 3, 3),
3103 SENSOR_ATTR_2(pwm4_auto_point5_pwm, S_IWUSR | S_IRUGO,
3104 show_auto_pwm, store_auto_pwm, 3, 4),
3105 SENSOR_ATTR_2(pwm4_auto_point5_temp, S_IWUSR | S_IRUGO,
3106 show_auto_temp, store_auto_temp, 3, 4),
3107 SENSOR_ATTR_2(pwm4_auto_point6_pwm, S_IWUSR | S_IRUGO,
3108 show_auto_pwm, store_auto_pwm, 3, 5),
3109 SENSOR_ATTR_2(pwm4_auto_point6_temp, S_IWUSR | S_IRUGO,
3110 show_auto_temp, store_auto_temp, 3, 5),
3111 SENSOR_ATTR_2(pwm4_auto_point7_pwm, S_IWUSR | S_IRUGO,
3112 show_auto_pwm, store_auto_pwm, 3, 6),
3113 SENSOR_ATTR_2(pwm4_auto_point7_temp, S_IWUSR | S_IRUGO,
3114 show_auto_temp, store_auto_temp, 3, 6),
3115
3116 SENSOR_ATTR_2(pwm5_auto_point1_pwm, S_IWUSR | S_IRUGO,
3117 show_auto_pwm, store_auto_pwm, 4, 0),
3118 SENSOR_ATTR_2(pwm5_auto_point1_temp, S_IWUSR | S_IRUGO,
3119 show_auto_temp, store_auto_temp, 4, 0),
3120 SENSOR_ATTR_2(pwm5_auto_point2_pwm, S_IWUSR | S_IRUGO,
3121 show_auto_pwm, store_auto_pwm, 4, 1),
3122 SENSOR_ATTR_2(pwm5_auto_point2_temp, S_IWUSR | S_IRUGO,
3123 show_auto_temp, store_auto_temp, 4, 1),
3124 SENSOR_ATTR_2(pwm5_auto_point3_pwm, S_IWUSR | S_IRUGO,
3125 show_auto_pwm, store_auto_pwm, 4, 2),
3126 SENSOR_ATTR_2(pwm5_auto_point3_temp, S_IWUSR | S_IRUGO,
3127 show_auto_temp, store_auto_temp, 4, 2),
3128 SENSOR_ATTR_2(pwm5_auto_point4_pwm, S_IWUSR | S_IRUGO,
3129 show_auto_pwm, store_auto_pwm, 4, 3),
3130 SENSOR_ATTR_2(pwm5_auto_point4_temp, S_IWUSR | S_IRUGO,
3131 show_auto_temp, store_auto_temp, 4, 3),
3132 SENSOR_ATTR_2(pwm5_auto_point5_pwm, S_IWUSR | S_IRUGO,
3133 show_auto_pwm, store_auto_pwm, 4, 4),
3134 SENSOR_ATTR_2(pwm5_auto_point5_temp, S_IWUSR | S_IRUGO,
3135 show_auto_temp, store_auto_temp, 4, 4),
3136 SENSOR_ATTR_2(pwm5_auto_point6_pwm, S_IWUSR | S_IRUGO,
3137 show_auto_pwm, store_auto_pwm, 4, 5),
3138 SENSOR_ATTR_2(pwm5_auto_point6_temp, S_IWUSR | S_IRUGO,
3139 show_auto_temp, store_auto_temp, 4, 5),
3140 SENSOR_ATTR_2(pwm5_auto_point7_pwm, S_IWUSR | S_IRUGO,
3141 show_auto_pwm, store_auto_pwm, 4, 6),
3142 SENSOR_ATTR_2(pwm5_auto_point7_temp, S_IWUSR | S_IRUGO,
3143 show_auto_temp, store_auto_temp, 4, 6),
3144}; 2994};
3145 2995
3146static ssize_t 2996static ssize_t
@@ -3159,7 +3009,6 @@ clear_caseopen(struct device *dev, struct device_attribute *attr,
3159 const char *buf, size_t count) 3009 const char *buf, size_t count)
3160{ 3010{
3161 struct nct6775_data *data = dev_get_drvdata(dev); 3011 struct nct6775_data *data = dev_get_drvdata(dev);
3162 struct nct6775_sio_data *sio_data = dev->platform_data;
3163 int nr = to_sensor_dev_attr(attr)->index - INTRUSION_ALARM_BASE; 3012 int nr = to_sensor_dev_attr(attr)->index - INTRUSION_ALARM_BASE;
3164 unsigned long val; 3013 unsigned long val;
3165 u8 reg; 3014 u8 reg;
@@ -3175,19 +3024,19 @@ clear_caseopen(struct device *dev, struct device_attribute *attr,
3175 * The CR registers are the same for all chips, and not all chips 3024 * The CR registers are the same for all chips, and not all chips
3176 * support clearing the caseopen status through "regular" registers. 3025 * support clearing the caseopen status through "regular" registers.
3177 */ 3026 */
3178 ret = superio_enter(sio_data->sioreg); 3027 ret = superio_enter(data->sioreg);
3179 if (ret) { 3028 if (ret) {
3180 count = ret; 3029 count = ret;
3181 goto error; 3030 goto error;
3182 } 3031 }
3183 3032
3184 superio_select(sio_data->sioreg, NCT6775_LD_ACPI); 3033 superio_select(data->sioreg, NCT6775_LD_ACPI);
3185 reg = superio_inb(sio_data->sioreg, NCT6775_REG_CR_CASEOPEN_CLR[nr]); 3034 reg = superio_inb(data->sioreg, NCT6775_REG_CR_CASEOPEN_CLR[nr]);
3186 reg |= NCT6775_CR_CASEOPEN_CLR_MASK[nr]; 3035 reg |= NCT6775_CR_CASEOPEN_CLR_MASK[nr];
3187 superio_outb(sio_data->sioreg, NCT6775_REG_CR_CASEOPEN_CLR[nr], reg); 3036 superio_outb(data->sioreg, NCT6775_REG_CR_CASEOPEN_CLR[nr], reg);
3188 reg &= ~NCT6775_CR_CASEOPEN_CLR_MASK[nr]; 3037 reg &= ~NCT6775_CR_CASEOPEN_CLR_MASK[nr];
3189 superio_outb(sio_data->sioreg, NCT6775_REG_CR_CASEOPEN_CLR[nr], reg); 3038 superio_outb(data->sioreg, NCT6775_REG_CR_CASEOPEN_CLR[nr], reg);
3190 superio_exit(sio_data->sioreg); 3039 superio_exit(data->sioreg);
3191 3040
3192 data->valid = false; /* Force cache refresh */ 3041 data->valid = false; /* Force cache refresh */
3193error: 3042error:
@@ -3195,71 +3044,79 @@ error:
3195 return count; 3044 return count;
3196} 3045}
3197 3046
3198static struct sensor_device_attribute sda_caseopen[] = { 3047static SENSOR_DEVICE_ATTR(intrusion0_alarm, S_IWUSR | S_IRUGO, show_alarm,
3199 SENSOR_ATTR(intrusion0_alarm, S_IWUSR | S_IRUGO, show_alarm, 3048 clear_caseopen, INTRUSION_ALARM_BASE);
3200 clear_caseopen, INTRUSION_ALARM_BASE), 3049static SENSOR_DEVICE_ATTR(intrusion1_alarm, S_IWUSR | S_IRUGO, show_alarm,
3201 SENSOR_ATTR(intrusion1_alarm, S_IWUSR | S_IRUGO, show_alarm, 3050 clear_caseopen, INTRUSION_ALARM_BASE + 1);
3202 clear_caseopen, INTRUSION_ALARM_BASE + 1), 3051static SENSOR_DEVICE_ATTR(intrusion0_beep, S_IWUSR | S_IRUGO, show_beep,
3203}; 3052 store_beep, INTRUSION_ALARM_BASE);
3204 3053static SENSOR_DEVICE_ATTR(intrusion1_beep, S_IWUSR | S_IRUGO, show_beep,
3205/* 3054 store_beep, INTRUSION_ALARM_BASE + 1);
3206 * Driver and device management 3055static SENSOR_DEVICE_ATTR(beep_enable, S_IWUSR | S_IRUGO, show_beep,
3207 */ 3056 store_beep, BEEP_ENABLE_BASE);
3208 3057
3209static void nct6775_device_remove_files(struct device *dev) 3058static umode_t nct6775_other_is_visible(struct kobject *kobj,
3059 struct attribute *attr, int index)
3210{ 3060{
3211 /* 3061 struct device *dev = container_of(kobj, struct device, kobj);
3212 * some entries in the following arrays may not have been used in
3213 * device_create_file(), but device_remove_file() will ignore them
3214 */
3215 int i;
3216 struct nct6775_data *data = dev_get_drvdata(dev); 3062 struct nct6775_data *data = dev_get_drvdata(dev);
3217 3063
3218 for (i = 0; i < data->pwm_num; i++) 3064 if (index == 1 && !data->have_vid)
3219 sysfs_remove_group(&dev->kobj, &nct6775_group_pwm[i]); 3065 return 0;
3220 3066
3221 for (i = 0; i < ARRAY_SIZE(sda_pwm_max); i++) 3067 if (index == 2 || index == 3) {
3222 device_remove_file(dev, &sda_pwm_max[i].dev_attr); 3068 if (data->ALARM_BITS[INTRUSION_ALARM_BASE + index - 2] < 0)
3069 return 0;
3070 }
3071
3072 if (index == 4 || index == 5) {
3073 if (data->BEEP_BITS[INTRUSION_ALARM_BASE + index - 4] < 0)
3074 return 0;
3075 }
3223 3076
3224 for (i = 0; i < ARRAY_SIZE(sda_pwm_step); i++) 3077 return attr->mode;
3225 device_remove_file(dev, &sda_pwm_step[i].dev_attr); 3078}
3226 3079
3227 for (i = 0; i < ARRAY_SIZE(sda_weight_duty_base); i++) 3080/*
3228 device_remove_file(dev, &sda_weight_duty_base[i].dev_attr); 3081 * nct6775_other_is_visible uses the index into the following array
3082 * to determine if attributes should be created or not.
3083 * Any change in order or content must be matched.
3084 */
3085static struct attribute *nct6775_attributes_other[] = {
3086 &dev_attr_name.attr,
3087 &dev_attr_cpu0_vid.attr, /* 1 */
3088 &sensor_dev_attr_intrusion0_alarm.dev_attr.attr, /* 2 */
3089 &sensor_dev_attr_intrusion1_alarm.dev_attr.attr, /* 3 */
3090 &sensor_dev_attr_intrusion0_beep.dev_attr.attr, /* 4 */
3091 &sensor_dev_attr_intrusion1_beep.dev_attr.attr, /* 5 */
3092 &sensor_dev_attr_beep_enable.dev_attr.attr, /* 6 */
3093
3094 NULL
3095};
3229 3096
3230 for (i = 0; i < ARRAY_SIZE(sda_auto_pwm_arrays); i++) 3097static const struct attribute_group nct6775_group_other = {
3231 device_remove_file(dev, &sda_auto_pwm_arrays[i].dev_attr); 3098 .attrs = nct6775_attributes_other,
3099 .is_visible = nct6775_other_is_visible,
3100};
3232 3101
3233 for (i = 0; i < data->in_num; i++) 3102/*
3234 sysfs_remove_group(&dev->kobj, &nct6775_group_in[i]); 3103 * Driver and device management
3104 */
3235 3105
3236 for (i = 0; i < 5; i++) { 3106static void nct6775_device_remove_files(struct device *dev)
3237 device_remove_file(dev, &sda_fan_input[i].dev_attr); 3107{
3238 device_remove_file(dev, &sda_fan_alarm[i].dev_attr); 3108 struct nct6775_data *data = dev_get_drvdata(dev);
3239 device_remove_file(dev, &sda_fan_div[i].dev_attr);
3240 device_remove_file(dev, &sda_fan_min[i].dev_attr);
3241 device_remove_file(dev, &sda_fan_pulses[i].dev_attr);
3242 }
3243 for (i = 0; i < NUM_TEMP; i++) {
3244 if (!(data->have_temp & (1 << i)))
3245 continue;
3246 device_remove_file(dev, &sda_temp_input[i].dev_attr);
3247 device_remove_file(dev, &sda_temp_label[i].dev_attr);
3248 device_remove_file(dev, &sda_temp_max[i].dev_attr);
3249 device_remove_file(dev, &sda_temp_max_hyst[i].dev_attr);
3250 device_remove_file(dev, &sda_temp_crit[i].dev_attr);
3251 device_remove_file(dev, &sda_temp_alarm[i].dev_attr);
3252 if (!(data->have_temp_fixed & (1 << i)))
3253 continue;
3254 device_remove_file(dev, &sda_temp_type[i].dev_attr);
3255 device_remove_file(dev, &sda_temp_offset[i].dev_attr);
3256 }
3257 3109
3258 device_remove_file(dev, &sda_caseopen[0].dev_attr); 3110 if (data->group_pwm)
3259 device_remove_file(dev, &sda_caseopen[1].dev_attr); 3111 sysfs_remove_group(&dev->kobj, data->group_pwm);
3112 if (data->group_in)
3113 sysfs_remove_group(&dev->kobj, data->group_in);
3114 if (data->group_fan)
3115 sysfs_remove_group(&dev->kobj, data->group_fan);
3116 if (data->group_temp)
3117 sysfs_remove_group(&dev->kobj, data->group_temp);
3260 3118
3261 device_remove_file(dev, &dev_attr_name); 3119 sysfs_remove_group(&dev->kobj, &nct6775_group_other);
3262 device_remove_file(dev, &dev_attr_cpu0_vid);
3263} 3120}
3264 3121
3265/* Get the monitoring functions started */ 3122/* Get the monitoring functions started */
@@ -3297,68 +3154,78 @@ static inline void nct6775_init_device(struct nct6775_data *data)
3297 for (i = 0; i < data->temp_fixed_num; i++) { 3154 for (i = 0; i < data->temp_fixed_num; i++) {
3298 if (!(data->have_temp_fixed & (1 << i))) 3155 if (!(data->have_temp_fixed & (1 << i)))
3299 continue; 3156 continue;
3300 if ((tmp & (0x02 << i))) /* diode */ 3157 if ((tmp & (data->DIODE_MASK << i))) /* diode */
3301 data->temp_type[i] = 3 - ((diode >> i) & 0x02); 3158 data->temp_type[i]
3159 = 3 - ((diode >> i) & data->DIODE_MASK);
3302 else /* thermistor */ 3160 else /* thermistor */
3303 data->temp_type[i] = 4; 3161 data->temp_type[i] = 4;
3304 } 3162 }
3305} 3163}
3306 3164
3307static int 3165static void
3308nct6775_check_fan_inputs(const struct nct6775_sio_data *sio_data, 3166nct6775_check_fan_inputs(struct nct6775_data *data)
3309 struct nct6775_data *data)
3310{ 3167{
3168 bool fan3pin, fan4pin, fan4min, fan5pin, fan6pin;
3169 bool pwm3pin, pwm4pin, pwm5pin, pwm6pin;
3170 int sioreg = data->sioreg;
3311 int regval; 3171 int regval;
3312 bool fan3pin, fan3min, fan4pin, fan4min, fan5pin;
3313 bool pwm3pin, pwm4pin, pwm5pin;
3314 int ret;
3315
3316 ret = superio_enter(sio_data->sioreg);
3317 if (ret)
3318 return ret;
3319 3172
3320 /* fan4 and fan5 share some pins with the GPIO and serial flash */ 3173 /* fan4 and fan5 share some pins with the GPIO and serial flash */
3321 if (data->kind == nct6775) { 3174 if (data->kind == nct6775) {
3322 regval = superio_inb(sio_data->sioreg, 0x2c); 3175 regval = superio_inb(sioreg, 0x2c);
3323 3176
3324 fan3pin = regval & (1 << 6); 3177 fan3pin = regval & (1 << 6);
3325 fan3min = fan3pin;
3326 pwm3pin = regval & (1 << 7); 3178 pwm3pin = regval & (1 << 7);
3327 3179
3328 /* On NCT6775, fan4 shares pins with the fdc interface */ 3180 /* On NCT6775, fan4 shares pins with the fdc interface */
3329 fan4pin = !(superio_inb(sio_data->sioreg, 0x2A) & 0x80); 3181 fan4pin = !(superio_inb(sioreg, 0x2A) & 0x80);
3330 fan4min = 0; 3182 fan4min = false;
3331 fan5pin = 0; 3183 fan5pin = false;
3332 pwm4pin = 0; 3184 fan6pin = false;
3333 pwm5pin = 0; 3185 pwm4pin = false;
3186 pwm5pin = false;
3187 pwm6pin = false;
3334 } else if (data->kind == nct6776) { 3188 } else if (data->kind == nct6776) {
3335 bool gpok = superio_inb(sio_data->sioreg, 0x27) & 0x80; 3189 bool gpok = superio_inb(sioreg, 0x27) & 0x80;
3336 3190
3337 superio_select(sio_data->sioreg, NCT6775_LD_HWM); 3191 superio_select(sioreg, NCT6775_LD_HWM);
3338 regval = superio_inb(sio_data->sioreg, SIO_REG_ENABLE); 3192 regval = superio_inb(sioreg, SIO_REG_ENABLE);
3339 3193
3340 if (regval & 0x80) 3194 if (regval & 0x80)
3341 fan3pin = gpok; 3195 fan3pin = gpok;
3342 else 3196 else
3343 fan3pin = !(superio_inb(sio_data->sioreg, 0x24) & 0x40); 3197 fan3pin = !(superio_inb(sioreg, 0x24) & 0x40);
3344 3198
3345 if (regval & 0x40) 3199 if (regval & 0x40)
3346 fan4pin = gpok; 3200 fan4pin = gpok;
3347 else 3201 else
3348 fan4pin = superio_inb(sio_data->sioreg, 0x1C) & 0x01; 3202 fan4pin = superio_inb(sioreg, 0x1C) & 0x01;
3349 3203
3350 if (regval & 0x20) 3204 if (regval & 0x20)
3351 fan5pin = gpok; 3205 fan5pin = gpok;
3352 else 3206 else
3353 fan5pin = superio_inb(sio_data->sioreg, 0x1C) & 0x02; 3207 fan5pin = superio_inb(sioreg, 0x1C) & 0x02;
3354 3208
3355 fan4min = fan4pin; 3209 fan4min = fan4pin;
3356 fan3min = fan3pin; 3210 fan6pin = false;
3357 pwm3pin = fan3pin; 3211 pwm3pin = fan3pin;
3358 pwm4pin = 0; 3212 pwm4pin = false;
3359 pwm5pin = 0; 3213 pwm5pin = false;
3360 } else { /* NCT6779D */ 3214 pwm6pin = false;
3361 regval = superio_inb(sio_data->sioreg, 0x1c); 3215 } else if (data->kind == nct6106) {
3216 regval = superio_inb(sioreg, 0x24);
3217 fan3pin = !(regval & 0x80);
3218 pwm3pin = regval & 0x08;
3219
3220 fan4pin = false;
3221 fan4min = false;
3222 fan5pin = false;
3223 fan6pin = false;
3224 pwm4pin = false;
3225 pwm5pin = false;
3226 pwm6pin = false;
3227 } else { /* NCT6779D or NCT6791D */
3228 regval = superio_inb(sioreg, 0x1c);
3362 3229
3363 fan3pin = !(regval & (1 << 5)); 3230 fan3pin = !(regval & (1 << 5));
3364 fan4pin = !(regval & (1 << 6)); 3231 fan4pin = !(regval & (1 << 6));
@@ -3368,22 +3235,25 @@ nct6775_check_fan_inputs(const struct nct6775_sio_data *sio_data,
3368 pwm4pin = !(regval & (1 << 1)); 3235 pwm4pin = !(regval & (1 << 1));
3369 pwm5pin = !(regval & (1 << 2)); 3236 pwm5pin = !(regval & (1 << 2));
3370 3237
3371 fan3min = fan3pin;
3372 fan4min = fan4pin; 3238 fan4min = fan4pin;
3373 }
3374
3375 superio_exit(sio_data->sioreg);
3376 3239
3377 data->has_fan = data->has_fan_min = 0x03; /* fan1 and fan2 */ 3240 if (data->kind == nct6791) {
3378 data->has_fan |= fan3pin << 2; 3241 regval = superio_inb(sioreg, 0x2d);
3379 data->has_fan_min |= fan3min << 2; 3242 fan6pin = (regval & (1 << 1));
3380 3243 pwm6pin = (regval & (1 << 0));
3381 data->has_fan |= (fan4pin << 3) | (fan5pin << 4); 3244 } else { /* NCT6779D */
3382 data->has_fan_min |= (fan4min << 3) | (fan5pin << 4); 3245 fan6pin = false;
3383 3246 pwm6pin = false;
3384 data->has_pwm = 0x03 | (pwm3pin << 2) | (pwm4pin << 3) | (pwm5pin << 4); 3247 }
3248 }
3385 3249
3386 return 0; 3250 /* fan 1 and 2 (0x03) are always present */
3251 data->has_fan = 0x03 | (fan3pin << 2) | (fan4pin << 3) |
3252 (fan5pin << 4) | (fan6pin << 5);
3253 data->has_fan_min = 0x03 | (fan3pin << 2) | (fan4min << 3) |
3254 (fan5pin << 4);
3255 data->has_pwm = 0x03 | (pwm3pin << 2) | (pwm4pin << 3) |
3256 (pwm5pin << 4) | (pwm6pin << 5);
3387} 3257}
3388 3258
3389static void add_temp_sensors(struct nct6775_data *data, const u16 *regp, 3259static void add_temp_sensors(struct nct6775_data *data, const u16 *regp,
@@ -3415,16 +3285,17 @@ static void add_temp_sensors(struct nct6775_data *data, const u16 *regp,
3415static int nct6775_probe(struct platform_device *pdev) 3285static int nct6775_probe(struct platform_device *pdev)
3416{ 3286{
3417 struct device *dev = &pdev->dev; 3287 struct device *dev = &pdev->dev;
3418 struct nct6775_sio_data *sio_data = dev->platform_data; 3288 struct nct6775_sio_data *sio_data = dev_get_platdata(dev);
3419 struct nct6775_data *data; 3289 struct nct6775_data *data;
3420 struct resource *res; 3290 struct resource *res;
3421 int i, s, err = 0; 3291 int i, s, err = 0;
3422 int src, mask, available; 3292 int src, mask, available;
3423 const u16 *reg_temp, *reg_temp_over, *reg_temp_hyst, *reg_temp_config; 3293 const u16 *reg_temp, *reg_temp_over, *reg_temp_hyst, *reg_temp_config;
3424 const u16 *reg_temp_alternate, *reg_temp_crit; 3294 const u16 *reg_temp_alternate, *reg_temp_crit;
3295 const u16 *reg_temp_crit_l = NULL, *reg_temp_crit_h = NULL;
3425 int num_reg_temp; 3296 int num_reg_temp;
3426 bool have_vid = false;
3427 u8 cr2a; 3297 u8 cr2a;
3298 struct attribute_group *group;
3428 3299
3429 res = platform_get_resource(pdev, IORESOURCE_IO, 0); 3300 res = platform_get_resource(pdev, IORESOURCE_IO, 0);
3430 if (!devm_request_region(&pdev->dev, res->start, IOREGION_LENGTH, 3301 if (!devm_request_region(&pdev->dev, res->start, IOREGION_LENGTH,
@@ -3437,6 +3308,7 @@ static int nct6775_probe(struct platform_device *pdev)
3437 return -ENOMEM; 3308 return -ENOMEM;
3438 3309
3439 data->kind = sio_data->kind; 3310 data->kind = sio_data->kind;
3311 data->sioreg = sio_data->sioreg;
3440 data->addr = res->start; 3312 data->addr = res->start;
3441 mutex_init(&data->update_lock); 3313 mutex_init(&data->update_lock);
3442 data->name = nct6775_device_names[data->kind]; 3314 data->name = nct6775_device_names[data->kind];
@@ -3444,6 +3316,75 @@ static int nct6775_probe(struct platform_device *pdev)
3444 platform_set_drvdata(pdev, data); 3316 platform_set_drvdata(pdev, data);
3445 3317
3446 switch (data->kind) { 3318 switch (data->kind) {
3319 case nct6106:
3320 data->in_num = 9;
3321 data->pwm_num = 3;
3322 data->auto_pwm_num = 4;
3323 data->temp_fixed_num = 3;
3324 data->num_temp_alarms = 6;
3325 data->num_temp_beeps = 6;
3326
3327 data->fan_from_reg = fan_from_reg13;
3328 data->fan_from_reg_min = fan_from_reg13;
3329
3330 data->temp_label = nct6776_temp_label;
3331 data->temp_label_num = ARRAY_SIZE(nct6776_temp_label);
3332
3333 data->REG_VBAT = NCT6106_REG_VBAT;
3334 data->REG_DIODE = NCT6106_REG_DIODE;
3335 data->DIODE_MASK = NCT6106_DIODE_MASK;
3336 data->REG_VIN = NCT6106_REG_IN;
3337 data->REG_IN_MINMAX[0] = NCT6106_REG_IN_MIN;
3338 data->REG_IN_MINMAX[1] = NCT6106_REG_IN_MAX;
3339 data->REG_TARGET = NCT6106_REG_TARGET;
3340 data->REG_FAN = NCT6106_REG_FAN;
3341 data->REG_FAN_MODE = NCT6106_REG_FAN_MODE;
3342 data->REG_FAN_MIN = NCT6106_REG_FAN_MIN;
3343 data->REG_FAN_PULSES = NCT6106_REG_FAN_PULSES;
3344 data->FAN_PULSE_SHIFT = NCT6106_FAN_PULSE_SHIFT;
3345 data->REG_FAN_TIME[0] = NCT6106_REG_FAN_STOP_TIME;
3346 data->REG_FAN_TIME[1] = NCT6106_REG_FAN_STEP_UP_TIME;
3347 data->REG_FAN_TIME[2] = NCT6106_REG_FAN_STEP_DOWN_TIME;
3348 data->REG_PWM[0] = NCT6106_REG_PWM;
3349 data->REG_PWM[1] = NCT6106_REG_FAN_START_OUTPUT;
3350 data->REG_PWM[2] = NCT6106_REG_FAN_STOP_OUTPUT;
3351 data->REG_PWM[5] = NCT6106_REG_WEIGHT_DUTY_STEP;
3352 data->REG_PWM[6] = NCT6106_REG_WEIGHT_DUTY_BASE;
3353 data->REG_PWM_READ = NCT6106_REG_PWM_READ;
3354 data->REG_PWM_MODE = NCT6106_REG_PWM_MODE;
3355 data->PWM_MODE_MASK = NCT6106_PWM_MODE_MASK;
3356 data->REG_AUTO_TEMP = NCT6106_REG_AUTO_TEMP;
3357 data->REG_AUTO_PWM = NCT6106_REG_AUTO_PWM;
3358 data->REG_CRITICAL_TEMP = NCT6106_REG_CRITICAL_TEMP;
3359 data->REG_CRITICAL_TEMP_TOLERANCE
3360 = NCT6106_REG_CRITICAL_TEMP_TOLERANCE;
3361 data->REG_CRITICAL_PWM_ENABLE = NCT6106_REG_CRITICAL_PWM_ENABLE;
3362 data->CRITICAL_PWM_ENABLE_MASK
3363 = NCT6106_CRITICAL_PWM_ENABLE_MASK;
3364 data->REG_CRITICAL_PWM = NCT6106_REG_CRITICAL_PWM;
3365 data->REG_TEMP_OFFSET = NCT6106_REG_TEMP_OFFSET;
3366 data->REG_TEMP_SOURCE = NCT6106_REG_TEMP_SOURCE;
3367 data->REG_TEMP_SEL = NCT6106_REG_TEMP_SEL;
3368 data->REG_WEIGHT_TEMP_SEL = NCT6106_REG_WEIGHT_TEMP_SEL;
3369 data->REG_WEIGHT_TEMP[0] = NCT6106_REG_WEIGHT_TEMP_STEP;
3370 data->REG_WEIGHT_TEMP[1] = NCT6106_REG_WEIGHT_TEMP_STEP_TOL;
3371 data->REG_WEIGHT_TEMP[2] = NCT6106_REG_WEIGHT_TEMP_BASE;
3372 data->REG_ALARM = NCT6106_REG_ALARM;
3373 data->ALARM_BITS = NCT6106_ALARM_BITS;
3374 data->REG_BEEP = NCT6106_REG_BEEP;
3375 data->BEEP_BITS = NCT6106_BEEP_BITS;
3376
3377 reg_temp = NCT6106_REG_TEMP;
3378 num_reg_temp = ARRAY_SIZE(NCT6106_REG_TEMP);
3379 reg_temp_over = NCT6106_REG_TEMP_OVER;
3380 reg_temp_hyst = NCT6106_REG_TEMP_HYST;
3381 reg_temp_config = NCT6106_REG_TEMP_CONFIG;
3382 reg_temp_alternate = NCT6106_REG_TEMP_ALTERNATE;
3383 reg_temp_crit = NCT6106_REG_TEMP_CRIT;
3384 reg_temp_crit_l = NCT6106_REG_TEMP_CRIT_L;
3385 reg_temp_crit_h = NCT6106_REG_TEMP_CRIT_H;
3386
3387 break;
3447 case nct6775: 3388 case nct6775:
3448 data->in_num = 9; 3389 data->in_num = 9;
3449 data->pwm_num = 3; 3390 data->pwm_num = 3;
@@ -3451,8 +3392,10 @@ static int nct6775_probe(struct platform_device *pdev)
3451 data->has_fan_div = true; 3392 data->has_fan_div = true;
3452 data->temp_fixed_num = 3; 3393 data->temp_fixed_num = 3;
3453 data->num_temp_alarms = 3; 3394 data->num_temp_alarms = 3;
3395 data->num_temp_beeps = 3;
3454 3396
3455 data->ALARM_BITS = NCT6775_ALARM_BITS; 3397 data->ALARM_BITS = NCT6775_ALARM_BITS;
3398 data->BEEP_BITS = NCT6775_BEEP_BITS;
3456 3399
3457 data->fan_from_reg = fan_from_reg16; 3400 data->fan_from_reg = fan_from_reg16;
3458 data->fan_from_reg_min = fan_from_reg8; 3401 data->fan_from_reg_min = fan_from_reg8;
@@ -3466,6 +3409,7 @@ static int nct6775_probe(struct platform_device *pdev)
3466 data->REG_CONFIG = NCT6775_REG_CONFIG; 3409 data->REG_CONFIG = NCT6775_REG_CONFIG;
3467 data->REG_VBAT = NCT6775_REG_VBAT; 3410 data->REG_VBAT = NCT6775_REG_VBAT;
3468 data->REG_DIODE = NCT6775_REG_DIODE; 3411 data->REG_DIODE = NCT6775_REG_DIODE;
3412 data->DIODE_MASK = NCT6775_DIODE_MASK;
3469 data->REG_VIN = NCT6775_REG_IN; 3413 data->REG_VIN = NCT6775_REG_IN;
3470 data->REG_IN_MINMAX[0] = NCT6775_REG_IN_MIN; 3414 data->REG_IN_MINMAX[0] = NCT6775_REG_IN_MIN;
3471 data->REG_IN_MINMAX[1] = NCT6775_REG_IN_MAX; 3415 data->REG_IN_MINMAX[1] = NCT6775_REG_IN_MAX;
@@ -3474,6 +3418,7 @@ static int nct6775_probe(struct platform_device *pdev)
3474 data->REG_FAN_MODE = NCT6775_REG_FAN_MODE; 3418 data->REG_FAN_MODE = NCT6775_REG_FAN_MODE;
3475 data->REG_FAN_MIN = NCT6775_REG_FAN_MIN; 3419 data->REG_FAN_MIN = NCT6775_REG_FAN_MIN;
3476 data->REG_FAN_PULSES = NCT6775_REG_FAN_PULSES; 3420 data->REG_FAN_PULSES = NCT6775_REG_FAN_PULSES;
3421 data->FAN_PULSE_SHIFT = NCT6775_FAN_PULSE_SHIFT;
3477 data->REG_FAN_TIME[0] = NCT6775_REG_FAN_STOP_TIME; 3422 data->REG_FAN_TIME[0] = NCT6775_REG_FAN_STOP_TIME;
3478 data->REG_FAN_TIME[1] = NCT6775_REG_FAN_STEP_UP_TIME; 3423 data->REG_FAN_TIME[1] = NCT6775_REG_FAN_STEP_UP_TIME;
3479 data->REG_FAN_TIME[2] = NCT6775_REG_FAN_STEP_DOWN_TIME; 3424 data->REG_FAN_TIME[2] = NCT6775_REG_FAN_STEP_DOWN_TIME;
@@ -3499,6 +3444,7 @@ static int nct6775_probe(struct platform_device *pdev)
3499 data->REG_WEIGHT_TEMP[1] = NCT6775_REG_WEIGHT_TEMP_STEP_TOL; 3444 data->REG_WEIGHT_TEMP[1] = NCT6775_REG_WEIGHT_TEMP_STEP_TOL;
3500 data->REG_WEIGHT_TEMP[2] = NCT6775_REG_WEIGHT_TEMP_BASE; 3445 data->REG_WEIGHT_TEMP[2] = NCT6775_REG_WEIGHT_TEMP_BASE;
3501 data->REG_ALARM = NCT6775_REG_ALARM; 3446 data->REG_ALARM = NCT6775_REG_ALARM;
3447 data->REG_BEEP = NCT6775_REG_BEEP;
3502 3448
3503 reg_temp = NCT6775_REG_TEMP; 3449 reg_temp = NCT6775_REG_TEMP;
3504 num_reg_temp = ARRAY_SIZE(NCT6775_REG_TEMP); 3450 num_reg_temp = ARRAY_SIZE(NCT6775_REG_TEMP);
@@ -3516,8 +3462,10 @@ static int nct6775_probe(struct platform_device *pdev)
3516 data->has_fan_div = false; 3462 data->has_fan_div = false;
3517 data->temp_fixed_num = 3; 3463 data->temp_fixed_num = 3;
3518 data->num_temp_alarms = 3; 3464 data->num_temp_alarms = 3;
3465 data->num_temp_beeps = 6;
3519 3466
3520 data->ALARM_BITS = NCT6776_ALARM_BITS; 3467 data->ALARM_BITS = NCT6776_ALARM_BITS;
3468 data->BEEP_BITS = NCT6776_BEEP_BITS;
3521 3469
3522 data->fan_from_reg = fan_from_reg13; 3470 data->fan_from_reg = fan_from_reg13;
3523 data->fan_from_reg_min = fan_from_reg13; 3471 data->fan_from_reg_min = fan_from_reg13;
@@ -3531,6 +3479,7 @@ static int nct6775_probe(struct platform_device *pdev)
3531 data->REG_CONFIG = NCT6775_REG_CONFIG; 3479 data->REG_CONFIG = NCT6775_REG_CONFIG;
3532 data->REG_VBAT = NCT6775_REG_VBAT; 3480 data->REG_VBAT = NCT6775_REG_VBAT;
3533 data->REG_DIODE = NCT6775_REG_DIODE; 3481 data->REG_DIODE = NCT6775_REG_DIODE;
3482 data->DIODE_MASK = NCT6775_DIODE_MASK;
3534 data->REG_VIN = NCT6775_REG_IN; 3483 data->REG_VIN = NCT6775_REG_IN;
3535 data->REG_IN_MINMAX[0] = NCT6775_REG_IN_MIN; 3484 data->REG_IN_MINMAX[0] = NCT6775_REG_IN_MIN;
3536 data->REG_IN_MINMAX[1] = NCT6775_REG_IN_MAX; 3485 data->REG_IN_MINMAX[1] = NCT6775_REG_IN_MAX;
@@ -3539,6 +3488,7 @@ static int nct6775_probe(struct platform_device *pdev)
3539 data->REG_FAN_MODE = NCT6775_REG_FAN_MODE; 3488 data->REG_FAN_MODE = NCT6775_REG_FAN_MODE;
3540 data->REG_FAN_MIN = NCT6776_REG_FAN_MIN; 3489 data->REG_FAN_MIN = NCT6776_REG_FAN_MIN;
3541 data->REG_FAN_PULSES = NCT6776_REG_FAN_PULSES; 3490 data->REG_FAN_PULSES = NCT6776_REG_FAN_PULSES;
3491 data->FAN_PULSE_SHIFT = NCT6775_FAN_PULSE_SHIFT;
3542 data->REG_FAN_TIME[0] = NCT6775_REG_FAN_STOP_TIME; 3492 data->REG_FAN_TIME[0] = NCT6775_REG_FAN_STOP_TIME;
3543 data->REG_FAN_TIME[1] = NCT6775_REG_FAN_STEP_UP_TIME; 3493 data->REG_FAN_TIME[1] = NCT6775_REG_FAN_STEP_UP_TIME;
3544 data->REG_FAN_TIME[2] = NCT6775_REG_FAN_STEP_DOWN_TIME; 3494 data->REG_FAN_TIME[2] = NCT6775_REG_FAN_STEP_DOWN_TIME;
@@ -3564,6 +3514,7 @@ static int nct6775_probe(struct platform_device *pdev)
3564 data->REG_WEIGHT_TEMP[1] = NCT6775_REG_WEIGHT_TEMP_STEP_TOL; 3514 data->REG_WEIGHT_TEMP[1] = NCT6775_REG_WEIGHT_TEMP_STEP_TOL;
3565 data->REG_WEIGHT_TEMP[2] = NCT6775_REG_WEIGHT_TEMP_BASE; 3515 data->REG_WEIGHT_TEMP[2] = NCT6775_REG_WEIGHT_TEMP_BASE;
3566 data->REG_ALARM = NCT6775_REG_ALARM; 3516 data->REG_ALARM = NCT6775_REG_ALARM;
3517 data->REG_BEEP = NCT6776_REG_BEEP;
3567 3518
3568 reg_temp = NCT6775_REG_TEMP; 3519 reg_temp = NCT6775_REG_TEMP;
3569 num_reg_temp = ARRAY_SIZE(NCT6775_REG_TEMP); 3520 num_reg_temp = ARRAY_SIZE(NCT6775_REG_TEMP);
@@ -3581,8 +3532,10 @@ static int nct6775_probe(struct platform_device *pdev)
3581 data->has_fan_div = false; 3532 data->has_fan_div = false;
3582 data->temp_fixed_num = 6; 3533 data->temp_fixed_num = 6;
3583 data->num_temp_alarms = 2; 3534 data->num_temp_alarms = 2;
3535 data->num_temp_beeps = 2;
3584 3536
3585 data->ALARM_BITS = NCT6779_ALARM_BITS; 3537 data->ALARM_BITS = NCT6779_ALARM_BITS;
3538 data->BEEP_BITS = NCT6779_BEEP_BITS;
3586 3539
3587 data->fan_from_reg = fan_from_reg13; 3540 data->fan_from_reg = fan_from_reg13;
3588 data->fan_from_reg_min = fan_from_reg13; 3541 data->fan_from_reg_min = fan_from_reg13;
@@ -3596,6 +3549,7 @@ static int nct6775_probe(struct platform_device *pdev)
3596 data->REG_CONFIG = NCT6775_REG_CONFIG; 3549 data->REG_CONFIG = NCT6775_REG_CONFIG;
3597 data->REG_VBAT = NCT6775_REG_VBAT; 3550 data->REG_VBAT = NCT6775_REG_VBAT;
3598 data->REG_DIODE = NCT6775_REG_DIODE; 3551 data->REG_DIODE = NCT6775_REG_DIODE;
3552 data->DIODE_MASK = NCT6775_DIODE_MASK;
3599 data->REG_VIN = NCT6779_REG_IN; 3553 data->REG_VIN = NCT6779_REG_IN;
3600 data->REG_IN_MINMAX[0] = NCT6775_REG_IN_MIN; 3554 data->REG_IN_MINMAX[0] = NCT6775_REG_IN_MIN;
3601 data->REG_IN_MINMAX[1] = NCT6775_REG_IN_MAX; 3555 data->REG_IN_MINMAX[1] = NCT6775_REG_IN_MAX;
@@ -3604,6 +3558,7 @@ static int nct6775_probe(struct platform_device *pdev)
3604 data->REG_FAN_MODE = NCT6775_REG_FAN_MODE; 3558 data->REG_FAN_MODE = NCT6775_REG_FAN_MODE;
3605 data->REG_FAN_MIN = NCT6776_REG_FAN_MIN; 3559 data->REG_FAN_MIN = NCT6776_REG_FAN_MIN;
3606 data->REG_FAN_PULSES = NCT6779_REG_FAN_PULSES; 3560 data->REG_FAN_PULSES = NCT6779_REG_FAN_PULSES;
3561 data->FAN_PULSE_SHIFT = NCT6775_FAN_PULSE_SHIFT;
3607 data->REG_FAN_TIME[0] = NCT6775_REG_FAN_STOP_TIME; 3562 data->REG_FAN_TIME[0] = NCT6775_REG_FAN_STOP_TIME;
3608 data->REG_FAN_TIME[1] = NCT6775_REG_FAN_STEP_UP_TIME; 3563 data->REG_FAN_TIME[1] = NCT6775_REG_FAN_STEP_UP_TIME;
3609 data->REG_FAN_TIME[2] = NCT6775_REG_FAN_STEP_DOWN_TIME; 3564 data->REG_FAN_TIME[2] = NCT6775_REG_FAN_STEP_DOWN_TIME;
@@ -3621,6 +3576,10 @@ static int nct6775_probe(struct platform_device *pdev)
3621 data->REG_CRITICAL_TEMP = NCT6775_REG_CRITICAL_TEMP; 3576 data->REG_CRITICAL_TEMP = NCT6775_REG_CRITICAL_TEMP;
3622 data->REG_CRITICAL_TEMP_TOLERANCE 3577 data->REG_CRITICAL_TEMP_TOLERANCE
3623 = NCT6775_REG_CRITICAL_TEMP_TOLERANCE; 3578 = NCT6775_REG_CRITICAL_TEMP_TOLERANCE;
3579 data->REG_CRITICAL_PWM_ENABLE = NCT6779_REG_CRITICAL_PWM_ENABLE;
3580 data->CRITICAL_PWM_ENABLE_MASK
3581 = NCT6779_CRITICAL_PWM_ENABLE_MASK;
3582 data->REG_CRITICAL_PWM = NCT6779_REG_CRITICAL_PWM;
3624 data->REG_TEMP_OFFSET = NCT6779_REG_TEMP_OFFSET; 3583 data->REG_TEMP_OFFSET = NCT6779_REG_TEMP_OFFSET;
3625 data->REG_TEMP_SOURCE = NCT6775_REG_TEMP_SOURCE; 3584 data->REG_TEMP_SOURCE = NCT6775_REG_TEMP_SOURCE;
3626 data->REG_TEMP_SEL = NCT6775_REG_TEMP_SEL; 3585 data->REG_TEMP_SEL = NCT6775_REG_TEMP_SEL;
@@ -3629,6 +3588,81 @@ static int nct6775_probe(struct platform_device *pdev)
3629 data->REG_WEIGHT_TEMP[1] = NCT6775_REG_WEIGHT_TEMP_STEP_TOL; 3588 data->REG_WEIGHT_TEMP[1] = NCT6775_REG_WEIGHT_TEMP_STEP_TOL;
3630 data->REG_WEIGHT_TEMP[2] = NCT6775_REG_WEIGHT_TEMP_BASE; 3589 data->REG_WEIGHT_TEMP[2] = NCT6775_REG_WEIGHT_TEMP_BASE;
3631 data->REG_ALARM = NCT6779_REG_ALARM; 3590 data->REG_ALARM = NCT6779_REG_ALARM;
3591 data->REG_BEEP = NCT6776_REG_BEEP;
3592
3593 reg_temp = NCT6779_REG_TEMP;
3594 num_reg_temp = ARRAY_SIZE(NCT6779_REG_TEMP);
3595 reg_temp_over = NCT6779_REG_TEMP_OVER;
3596 reg_temp_hyst = NCT6779_REG_TEMP_HYST;
3597 reg_temp_config = NCT6779_REG_TEMP_CONFIG;
3598 reg_temp_alternate = NCT6779_REG_TEMP_ALTERNATE;
3599 reg_temp_crit = NCT6779_REG_TEMP_CRIT;
3600
3601 break;
3602 case nct6791:
3603 data->in_num = 15;
3604 data->pwm_num = 6;
3605 data->auto_pwm_num = 4;
3606 data->has_fan_div = false;
3607 data->temp_fixed_num = 6;
3608 data->num_temp_alarms = 2;
3609 data->num_temp_beeps = 2;
3610
3611 data->ALARM_BITS = NCT6791_ALARM_BITS;
3612 data->BEEP_BITS = NCT6779_BEEP_BITS;
3613
3614 data->fan_from_reg = fan_from_reg13;
3615 data->fan_from_reg_min = fan_from_reg13;
3616 data->target_temp_mask = 0xff;
3617 data->tolerance_mask = 0x07;
3618 data->speed_tolerance_limit = 63;
3619
3620 data->temp_label = nct6779_temp_label;
3621 data->temp_label_num = ARRAY_SIZE(nct6779_temp_label);
3622
3623 data->REG_CONFIG = NCT6775_REG_CONFIG;
3624 data->REG_VBAT = NCT6775_REG_VBAT;
3625 data->REG_DIODE = NCT6775_REG_DIODE;
3626 data->DIODE_MASK = NCT6775_DIODE_MASK;
3627 data->REG_VIN = NCT6779_REG_IN;
3628 data->REG_IN_MINMAX[0] = NCT6775_REG_IN_MIN;
3629 data->REG_IN_MINMAX[1] = NCT6775_REG_IN_MAX;
3630 data->REG_TARGET = NCT6775_REG_TARGET;
3631 data->REG_FAN = NCT6779_REG_FAN;
3632 data->REG_FAN_MODE = NCT6775_REG_FAN_MODE;
3633 data->REG_FAN_MIN = NCT6776_REG_FAN_MIN;
3634 data->REG_FAN_PULSES = NCT6779_REG_FAN_PULSES;
3635 data->FAN_PULSE_SHIFT = NCT6775_FAN_PULSE_SHIFT;
3636 data->REG_FAN_TIME[0] = NCT6775_REG_FAN_STOP_TIME;
3637 data->REG_FAN_TIME[1] = NCT6775_REG_FAN_STEP_UP_TIME;
3638 data->REG_FAN_TIME[2] = NCT6775_REG_FAN_STEP_DOWN_TIME;
3639 data->REG_TOLERANCE_H = NCT6776_REG_TOLERANCE_H;
3640 data->REG_PWM[0] = NCT6775_REG_PWM;
3641 data->REG_PWM[1] = NCT6775_REG_FAN_START_OUTPUT;
3642 data->REG_PWM[2] = NCT6775_REG_FAN_STOP_OUTPUT;
3643 data->REG_PWM[5] = NCT6775_REG_WEIGHT_DUTY_STEP;
3644 data->REG_PWM[6] = NCT6776_REG_WEIGHT_DUTY_BASE;
3645 data->REG_PWM_READ = NCT6775_REG_PWM_READ;
3646 data->REG_PWM_MODE = NCT6776_REG_PWM_MODE;
3647 data->PWM_MODE_MASK = NCT6776_PWM_MODE_MASK;
3648 data->REG_AUTO_TEMP = NCT6775_REG_AUTO_TEMP;
3649 data->REG_AUTO_PWM = NCT6775_REG_AUTO_PWM;
3650 data->REG_CRITICAL_TEMP = NCT6775_REG_CRITICAL_TEMP;
3651 data->REG_CRITICAL_TEMP_TOLERANCE
3652 = NCT6775_REG_CRITICAL_TEMP_TOLERANCE;
3653 data->REG_CRITICAL_PWM_ENABLE = NCT6779_REG_CRITICAL_PWM_ENABLE;
3654 data->CRITICAL_PWM_ENABLE_MASK
3655 = NCT6779_CRITICAL_PWM_ENABLE_MASK;
3656 data->REG_CRITICAL_PWM = NCT6779_REG_CRITICAL_PWM;
3657 data->REG_TEMP_OFFSET = NCT6779_REG_TEMP_OFFSET;
3658 data->REG_TEMP_SOURCE = NCT6775_REG_TEMP_SOURCE;
3659 data->REG_TEMP_SEL = NCT6775_REG_TEMP_SEL;
3660 data->REG_WEIGHT_TEMP_SEL = NCT6775_REG_WEIGHT_TEMP_SEL;
3661 data->REG_WEIGHT_TEMP[0] = NCT6775_REG_WEIGHT_TEMP_STEP;
3662 data->REG_WEIGHT_TEMP[1] = NCT6775_REG_WEIGHT_TEMP_STEP_TOL;
3663 data->REG_WEIGHT_TEMP[2] = NCT6775_REG_WEIGHT_TEMP_BASE;
3664 data->REG_ALARM = NCT6791_REG_ALARM;
3665 data->REG_BEEP = NCT6776_REG_BEEP;
3632 3666
3633 reg_temp = NCT6779_REG_TEMP; 3667 reg_temp = NCT6779_REG_TEMP;
3634 num_reg_temp = ARRAY_SIZE(NCT6779_REG_TEMP); 3668 num_reg_temp = ARRAY_SIZE(NCT6779_REG_TEMP);
@@ -3700,6 +3734,13 @@ static int nct6775_probe(struct platform_device *pdev)
3700 data->reg_temp[0][src - 1] = reg_temp[i]; 3734 data->reg_temp[0][src - 1] = reg_temp[i];
3701 data->reg_temp[1][src - 1] = reg_temp_over[i]; 3735 data->reg_temp[1][src - 1] = reg_temp_over[i];
3702 data->reg_temp[2][src - 1] = reg_temp_hyst[i]; 3736 data->reg_temp[2][src - 1] = reg_temp_hyst[i];
3737 if (reg_temp_crit_h && reg_temp_crit_h[i])
3738 data->reg_temp[3][src - 1] = reg_temp_crit_h[i];
3739 else if (reg_temp_crit[src - 1])
3740 data->reg_temp[3][src - 1]
3741 = reg_temp_crit[src - 1];
3742 if (reg_temp_crit_l && reg_temp_crit_l[i])
3743 data->reg_temp[4][src - 1] = reg_temp_crit_l[i];
3703 data->reg_temp_config[src - 1] = reg_temp_config[i]; 3744 data->reg_temp_config[src - 1] = reg_temp_config[i];
3704 data->temp_src[src - 1] = src; 3745 data->temp_src[src - 1] = src;
3705 continue; 3746 continue;
@@ -3714,8 +3755,12 @@ static int nct6775_probe(struct platform_device *pdev)
3714 data->reg_temp[1][s] = reg_temp_over[i]; 3755 data->reg_temp[1][s] = reg_temp_over[i];
3715 data->reg_temp[2][s] = reg_temp_hyst[i]; 3756 data->reg_temp[2][s] = reg_temp_hyst[i];
3716 data->reg_temp_config[s] = reg_temp_config[i]; 3757 data->reg_temp_config[s] = reg_temp_config[i];
3717 if (reg_temp_crit[src - 1]) 3758 if (reg_temp_crit_h && reg_temp_crit_h[i])
3759 data->reg_temp[3][s] = reg_temp_crit_h[i];
3760 else if (reg_temp_crit[src - 1])
3718 data->reg_temp[3][s] = reg_temp_crit[src - 1]; 3761 data->reg_temp[3][s] = reg_temp_crit[src - 1];
3762 if (reg_temp_crit_l && reg_temp_crit_l[i])
3763 data->reg_temp[4][s] = reg_temp_crit_l[i];
3719 3764
3720 data->temp_src[s] = src; 3765 data->temp_src[s] = src;
3721 s++; 3766 s++;
@@ -3767,12 +3812,14 @@ static int nct6775_probe(struct platform_device *pdev)
3767 cr2a = superio_inb(sio_data->sioreg, 0x2a); 3812 cr2a = superio_inb(sio_data->sioreg, 0x2a);
3768 switch (data->kind) { 3813 switch (data->kind) {
3769 case nct6775: 3814 case nct6775:
3770 have_vid = (cr2a & 0x40); 3815 data->have_vid = (cr2a & 0x40);
3771 break; 3816 break;
3772 case nct6776: 3817 case nct6776:
3773 have_vid = (cr2a & 0x60) == 0x40; 3818 data->have_vid = (cr2a & 0x60) == 0x40;
3774 break; 3819 break;
3820 case nct6106:
3775 case nct6779: 3821 case nct6779:
3822 case nct6791:
3776 break; 3823 break;
3777 } 3824 }
3778 3825
@@ -3780,7 +3827,7 @@ static int nct6775_probe(struct platform_device *pdev)
3780 * Read VID value 3827 * Read VID value
3781 * We can get the VID input values directly at logical device D 0xe3. 3828 * We can get the VID input values directly at logical device D 0xe3.
3782 */ 3829 */
3783 if (have_vid) { 3830 if (data->have_vid) {
3784 superio_select(sio_data->sioreg, NCT6775_LD_VID); 3831 superio_select(sio_data->sioreg, NCT6775_LD_VID);
3785 data->vid = superio_inb(sio_data->sioreg, 0xe3); 3832 data->vid = superio_inb(sio_data->sioreg, 0xe3);
3786 data->vrm = vid_which_vrm(); 3833 data->vrm = vid_which_vrm();
@@ -3793,6 +3840,9 @@ static int nct6775_probe(struct platform_device *pdev)
3793 tmp = superio_inb(sio_data->sioreg, 3840 tmp = superio_inb(sio_data->sioreg,
3794 NCT6775_REG_CR_FAN_DEBOUNCE); 3841 NCT6775_REG_CR_FAN_DEBOUNCE);
3795 switch (data->kind) { 3842 switch (data->kind) {
3843 case nct6106:
3844 tmp |= 0xe0;
3845 break;
3796 case nct6775: 3846 case nct6775:
3797 tmp |= 0x1e; 3847 tmp |= 0x1e;
3798 break; 3848 break;
@@ -3800,6 +3850,9 @@ static int nct6775_probe(struct platform_device *pdev)
3800 case nct6779: 3850 case nct6779:
3801 tmp |= 0x3e; 3851 tmp |= 0x3e;
3802 break; 3852 break;
3853 case nct6791:
3854 tmp |= 0x7e;
3855 break;
3803 } 3856 }
3804 superio_outb(sio_data->sioreg, NCT6775_REG_CR_FAN_DEBOUNCE, 3857 superio_outb(sio_data->sioreg, NCT6775_REG_CR_FAN_DEBOUNCE,
3805 tmp); 3858 tmp);
@@ -3807,157 +3860,47 @@ static int nct6775_probe(struct platform_device *pdev)
3807 data->name); 3860 data->name);
3808 } 3861 }
3809 3862
3810 superio_exit(sio_data->sioreg); 3863 nct6775_check_fan_inputs(data);
3811
3812 if (have_vid) {
3813 err = device_create_file(dev, &dev_attr_cpu0_vid);
3814 if (err)
3815 return err;
3816 }
3817 3864
3818 err = nct6775_check_fan_inputs(sio_data, data); 3865 superio_exit(sio_data->sioreg);
3819 if (err)
3820 goto exit_remove;
3821 3866
3822 /* Read fan clock dividers immediately */ 3867 /* Read fan clock dividers immediately */
3823 nct6775_init_fan_common(dev, data); 3868 nct6775_init_fan_common(dev, data);
3824 3869
3825 /* Register sysfs hooks */ 3870 /* Register sysfs hooks */
3826 for (i = 0; i < data->pwm_num; i++) { 3871 group = nct6775_create_attr_group(dev, &nct6775_pwm_template_group,
3827 if (!(data->has_pwm & (1 << i))) 3872 data->pwm_num);
3828 continue; 3873 if (IS_ERR(group)) {
3829 3874 err = PTR_ERR(group);
3830 err = sysfs_create_group(&dev->kobj, &nct6775_group_pwm[i]); 3875 goto exit_remove;
3831 if (err)
3832 goto exit_remove;
3833
3834 if (data->REG_PWM[3]) {
3835 err = device_create_file(dev,
3836 &sda_pwm_max[i].dev_attr);
3837 if (err)
3838 goto exit_remove;
3839 }
3840 if (data->REG_PWM[4]) {
3841 err = device_create_file(dev,
3842 &sda_pwm_step[i].dev_attr);
3843 if (err)
3844 goto exit_remove;
3845 }
3846 if (data->REG_PWM[6]) {
3847 err = device_create_file(dev,
3848 &sda_weight_duty_base[i].dev_attr);
3849 if (err)
3850 goto exit_remove;
3851 }
3852 }
3853 for (i = 0; i < ARRAY_SIZE(sda_auto_pwm_arrays); i++) {
3854 struct sensor_device_attribute_2 *attr =
3855 &sda_auto_pwm_arrays[i];
3856
3857 if (!(data->has_pwm & (1 << attr->nr)))
3858 continue;
3859 if (attr->index > data->auto_pwm_num)
3860 continue;
3861 err = device_create_file(dev, &attr->dev_attr);
3862 if (err)
3863 goto exit_remove;
3864 }
3865
3866 for (i = 0; i < data->in_num; i++) {
3867 if (!(data->have_in & (1 << i)))
3868 continue;
3869 err = sysfs_create_group(&dev->kobj, &nct6775_group_in[i]);
3870 if (err)
3871 goto exit_remove;
3872 } 3876 }
3877 data->group_pwm = group;
3873 3878
3874 for (i = 0; i < 5; i++) { 3879 group = nct6775_create_attr_group(dev, &nct6775_in_template_group,
3875 if (data->has_fan & (1 << i)) { 3880 fls(data->have_in));
3876 err = device_create_file(dev, 3881 if (IS_ERR(group)) {
3877 &sda_fan_input[i].dev_attr); 3882 err = PTR_ERR(group);
3878 if (err) 3883 goto exit_remove;
3879 goto exit_remove;
3880 if (data->ALARM_BITS[FAN_ALARM_BASE + i] >= 0) {
3881 err = device_create_file(dev,
3882 &sda_fan_alarm[i].dev_attr);
3883 if (err)
3884 goto exit_remove;
3885 }
3886 if (data->kind != nct6776 &&
3887 data->kind != nct6779) {
3888 err = device_create_file(dev,
3889 &sda_fan_div[i].dev_attr);
3890 if (err)
3891 goto exit_remove;
3892 }
3893 if (data->has_fan_min & (1 << i)) {
3894 err = device_create_file(dev,
3895 &sda_fan_min[i].dev_attr);
3896 if (err)
3897 goto exit_remove;
3898 }
3899 err = device_create_file(dev,
3900 &sda_fan_pulses[i].dev_attr);
3901 if (err)
3902 goto exit_remove;
3903 }
3904 } 3884 }
3885 data->group_in = group;
3905 3886
3906 for (i = 0; i < NUM_TEMP; i++) { 3887 group = nct6775_create_attr_group(dev, &nct6775_fan_template_group,
3907 if (!(data->have_temp & (1 << i))) 3888 fls(data->has_fan));
3908 continue; 3889 if (IS_ERR(group)) {
3909 err = device_create_file(dev, &sda_temp_input[i].dev_attr); 3890 err = PTR_ERR(group);
3910 if (err) 3891 goto exit_remove;
3911 goto exit_remove;
3912 if (data->temp_label) {
3913 err = device_create_file(dev,
3914 &sda_temp_label[i].dev_attr);
3915 if (err)
3916 goto exit_remove;
3917 }
3918 if (data->reg_temp[1][i]) {
3919 err = device_create_file(dev,
3920 &sda_temp_max[i].dev_attr);
3921 if (err)
3922 goto exit_remove;
3923 }
3924 if (data->reg_temp[2][i]) {
3925 err = device_create_file(dev,
3926 &sda_temp_max_hyst[i].dev_attr);
3927 if (err)
3928 goto exit_remove;
3929 }
3930 if (data->reg_temp[3][i]) {
3931 err = device_create_file(dev,
3932 &sda_temp_crit[i].dev_attr);
3933 if (err)
3934 goto exit_remove;
3935 }
3936 if (find_temp_source(data, i, data->num_temp_alarms) >= 0) {
3937 err = device_create_file(dev,
3938 &sda_temp_alarm[i].dev_attr);
3939 if (err)
3940 goto exit_remove;
3941 }
3942 if (!(data->have_temp_fixed & (1 << i)))
3943 continue;
3944 err = device_create_file(dev, &sda_temp_type[i].dev_attr);
3945 if (err)
3946 goto exit_remove;
3947 err = device_create_file(dev, &sda_temp_offset[i].dev_attr);
3948 if (err)
3949 goto exit_remove;
3950 } 3892 }
3893 data->group_fan = group;
3951 3894
3952 for (i = 0; i < ARRAY_SIZE(sda_caseopen); i++) { 3895 group = nct6775_create_attr_group(dev, &nct6775_temp_template_group,
3953 if (data->ALARM_BITS[INTRUSION_ALARM_BASE + i] < 0) 3896 fls(data->have_temp));
3954 continue; 3897 if (IS_ERR(group)) {
3955 err = device_create_file(dev, &sda_caseopen[i].dev_attr); 3898 err = PTR_ERR(group);
3956 if (err) 3899 goto exit_remove;
3957 goto exit_remove;
3958 } 3900 }
3901 data->group_temp = group;
3959 3902
3960 err = device_create_file(dev, &dev_attr_name); 3903 err = sysfs_create_group(&dev->kobj, &nct6775_group_other);
3961 if (err) 3904 if (err)
3962 goto exit_remove; 3905 goto exit_remove;
3963 3906
@@ -3988,11 +3931,10 @@ static int nct6775_remove(struct platform_device *pdev)
3988static int nct6775_suspend(struct device *dev) 3931static int nct6775_suspend(struct device *dev)
3989{ 3932{
3990 struct nct6775_data *data = nct6775_update_device(dev); 3933 struct nct6775_data *data = nct6775_update_device(dev);
3991 struct nct6775_sio_data *sio_data = dev->platform_data;
3992 3934
3993 mutex_lock(&data->update_lock); 3935 mutex_lock(&data->update_lock);
3994 data->vbat = nct6775_read_value(data, data->REG_VBAT); 3936 data->vbat = nct6775_read_value(data, data->REG_VBAT);
3995 if (sio_data->kind == nct6775) { 3937 if (data->kind == nct6775) {
3996 data->fandiv1 = nct6775_read_value(data, NCT6775_REG_FANDIV1); 3938 data->fandiv1 = nct6775_read_value(data, NCT6775_REG_FANDIV1);
3997 data->fandiv2 = nct6775_read_value(data, NCT6775_REG_FANDIV2); 3939 data->fandiv2 = nct6775_read_value(data, NCT6775_REG_FANDIV2);
3998 } 3940 }
@@ -4004,7 +3946,6 @@ static int nct6775_suspend(struct device *dev)
4004static int nct6775_resume(struct device *dev) 3946static int nct6775_resume(struct device *dev)
4005{ 3947{
4006 struct nct6775_data *data = dev_get_drvdata(dev); 3948 struct nct6775_data *data = dev_get_drvdata(dev);
4007 struct nct6775_sio_data *sio_data = dev->platform_data;
4008 int i, j; 3949 int i, j;
4009 3950
4010 mutex_lock(&data->update_lock); 3951 mutex_lock(&data->update_lock);
@@ -4041,7 +3982,7 @@ static int nct6775_resume(struct device *dev)
4041 3982
4042 /* Restore other settings */ 3983 /* Restore other settings */
4043 nct6775_write_value(data, data->REG_VBAT, data->vbat); 3984 nct6775_write_value(data, data->REG_VBAT, data->vbat);
4044 if (sio_data->kind == nct6775) { 3985 if (data->kind == nct6775) {
4045 nct6775_write_value(data, NCT6775_REG_FANDIV1, data->fandiv1); 3986 nct6775_write_value(data, NCT6775_REG_FANDIV1, data->fandiv1);
4046 nct6775_write_value(data, NCT6775_REG_FANDIV2, data->fandiv2); 3987 nct6775_write_value(data, NCT6775_REG_FANDIV2, data->fandiv2);
4047 } 3988 }
@@ -4056,6 +3997,8 @@ static int nct6775_resume(struct device *dev)
4056static const struct dev_pm_ops nct6775_dev_pm_ops = { 3997static const struct dev_pm_ops nct6775_dev_pm_ops = {
4057 .suspend = nct6775_suspend, 3998 .suspend = nct6775_suspend,
4058 .resume = nct6775_resume, 3999 .resume = nct6775_resume,
4000 .freeze = nct6775_suspend,
4001 .restore = nct6775_resume,
4059}; 4002};
4060 4003
4061#define NCT6775_DEV_PM_OPS (&nct6775_dev_pm_ops) 4004#define NCT6775_DEV_PM_OPS (&nct6775_dev_pm_ops)
@@ -4074,17 +4017,19 @@ static struct platform_driver nct6775_driver = {
4074}; 4017};
4075 4018
4076static const char * const nct6775_sio_names[] __initconst = { 4019static const char * const nct6775_sio_names[] __initconst = {
4020 "NCT6106D",
4077 "NCT6775F", 4021 "NCT6775F",
4078 "NCT6776D/F", 4022 "NCT6776D/F",
4079 "NCT6779D", 4023 "NCT6779D",
4024 "NCT6791D",
4080}; 4025};
4081 4026
4082/* nct6775_find() looks for a '627 in the Super-I/O config space */ 4027/* nct6775_find() looks for a '627 in the Super-I/O config space */
4083static int __init nct6775_find(int sioaddr, unsigned short *addr, 4028static int __init nct6775_find(int sioaddr, struct nct6775_sio_data *sio_data)
4084 struct nct6775_sio_data *sio_data)
4085{ 4029{
4086 u16 val; 4030 u16 val;
4087 int err; 4031 int err;
4032 int addr;
4088 4033
4089 err = superio_enter(sioaddr); 4034 err = superio_enter(sioaddr);
4090 if (err) 4035 if (err)
@@ -4096,6 +4041,9 @@ static int __init nct6775_find(int sioaddr, unsigned short *addr,
4096 val = (superio_inb(sioaddr, SIO_REG_DEVID) << 8) 4041 val = (superio_inb(sioaddr, SIO_REG_DEVID) << 8)
4097 | superio_inb(sioaddr, SIO_REG_DEVID + 1); 4042 | superio_inb(sioaddr, SIO_REG_DEVID + 1);
4098 switch (val & SIO_ID_MASK) { 4043 switch (val & SIO_ID_MASK) {
4044 case SIO_NCT6106_ID:
4045 sio_data->kind = nct6106;
4046 break;
4099 case SIO_NCT6775_ID: 4047 case SIO_NCT6775_ID:
4100 sio_data->kind = nct6775; 4048 sio_data->kind = nct6775;
4101 break; 4049 break;
@@ -4105,6 +4053,9 @@ static int __init nct6775_find(int sioaddr, unsigned short *addr,
4105 case SIO_NCT6779_ID: 4053 case SIO_NCT6779_ID:
4106 sio_data->kind = nct6779; 4054 sio_data->kind = nct6779;
4107 break; 4055 break;
4056 case SIO_NCT6791_ID:
4057 sio_data->kind = nct6791;
4058 break;
4108 default: 4059 default:
4109 if (val != 0xffff) 4060 if (val != 0xffff)
4110 pr_debug("unsupported chip ID: 0x%04x\n", val); 4061 pr_debug("unsupported chip ID: 0x%04x\n", val);
@@ -4116,8 +4067,8 @@ static int __init nct6775_find(int sioaddr, unsigned short *addr,
4116 superio_select(sioaddr, NCT6775_LD_HWM); 4067 superio_select(sioaddr, NCT6775_LD_HWM);
4117 val = (superio_inb(sioaddr, SIO_REG_ADDR) << 8) 4068 val = (superio_inb(sioaddr, SIO_REG_ADDR) << 8)
4118 | superio_inb(sioaddr, SIO_REG_ADDR + 1); 4069 | superio_inb(sioaddr, SIO_REG_ADDR + 1);
4119 *addr = val & IOREGION_ALIGNMENT; 4070 addr = val & IOREGION_ALIGNMENT;
4120 if (*addr == 0) { 4071 if (addr == 0) {
4121 pr_err("Refusing to enable a Super-I/O device with a base I/O port 0\n"); 4072 pr_err("Refusing to enable a Super-I/O device with a base I/O port 0\n");
4122 superio_exit(sioaddr); 4073 superio_exit(sioaddr);
4123 return -ENODEV; 4074 return -ENODEV;
@@ -4129,13 +4080,22 @@ static int __init nct6775_find(int sioaddr, unsigned short *addr,
4129 pr_warn("Forcibly enabling Super-I/O. Sensor is probably unusable.\n"); 4080 pr_warn("Forcibly enabling Super-I/O. Sensor is probably unusable.\n");
4130 superio_outb(sioaddr, SIO_REG_ENABLE, val | 0x01); 4081 superio_outb(sioaddr, SIO_REG_ENABLE, val | 0x01);
4131 } 4082 }
4083 if (sio_data->kind == nct6791) {
4084 val = superio_inb(sioaddr, NCT6791_REG_HM_IO_SPACE_LOCK_ENABLE);
4085 if (val & 0x10) {
4086 pr_info("Enabling hardware monitor logical device mappings.\n");
4087 superio_outb(sioaddr,
4088 NCT6791_REG_HM_IO_SPACE_LOCK_ENABLE,
4089 val & ~0x10);
4090 }
4091 }
4132 4092
4133 superio_exit(sioaddr); 4093 superio_exit(sioaddr);
4134 pr_info("Found %s or compatible chip at %#x\n", 4094 pr_info("Found %s or compatible chip at %#x:%#x\n",
4135 nct6775_sio_names[sio_data->kind], *addr); 4095 nct6775_sio_names[sio_data->kind], sioaddr, addr);
4136 sio_data->sioreg = sioaddr; 4096 sio_data->sioreg = sioaddr;
4137 4097
4138 return 0; 4098 return addr;
4139} 4099}
4140 4100
4141/* 4101/*
@@ -4144,14 +4104,20 @@ static int __init nct6775_find(int sioaddr, unsigned short *addr,
4144 * track of the nct6775 driver. But since we platform_device_alloc(), we 4104 * track of the nct6775 driver. But since we platform_device_alloc(), we
4145 * must keep track of the device 4105 * must keep track of the device
4146 */ 4106 */
4147static struct platform_device *pdev; 4107static struct platform_device *pdev[2];
4148 4108
4149static int __init sensors_nct6775_init(void) 4109static int __init sensors_nct6775_init(void)
4150{ 4110{
4151 int err; 4111 int i, err;
4152 unsigned short address; 4112 bool found = false;
4113 int address;
4153 struct resource res; 4114 struct resource res;
4154 struct nct6775_sio_data sio_data; 4115 struct nct6775_sio_data sio_data;
4116 int sioaddr[2] = { 0x2e, 0x4e };
4117
4118 err = platform_driver_register(&nct6775_driver);
4119 if (err)
4120 return err;
4155 4121
4156 /* 4122 /*
4157 * initialize sio_data->kind and sio_data->sioreg. 4123 * initialize sio_data->kind and sio_data->sioreg.
@@ -4160,64 +4126,71 @@ static int __init sensors_nct6775_init(void)
4160 * driver will probe 0x2e and 0x4e and auto-detect the presence of a 4126 * driver will probe 0x2e and 0x4e and auto-detect the presence of a
4161 * nct6775 hardware monitor, and call probe() 4127 * nct6775 hardware monitor, and call probe()
4162 */ 4128 */
4163 if (nct6775_find(0x2e, &address, &sio_data) && 4129 for (i = 0; i < ARRAY_SIZE(pdev); i++) {
4164 nct6775_find(0x4e, &address, &sio_data)) 4130 address = nct6775_find(sioaddr[i], &sio_data);
4165 return -ENODEV; 4131 if (address <= 0)
4166 4132 continue;
4167 err = platform_driver_register(&nct6775_driver);
4168 if (err)
4169 goto exit;
4170 4133
4171 pdev = platform_device_alloc(DRVNAME, address); 4134 found = true;
4172 if (!pdev) {
4173 err = -ENOMEM;
4174 pr_err("Device allocation failed\n");
4175 goto exit_unregister;
4176 }
4177 4135
4178 err = platform_device_add_data(pdev, &sio_data, 4136 pdev[i] = platform_device_alloc(DRVNAME, address);
4179 sizeof(struct nct6775_sio_data)); 4137 if (!pdev[i]) {
4180 if (err) { 4138 err = -ENOMEM;
4181 pr_err("Platform data allocation failed\n"); 4139 goto exit_device_put;
4182 goto exit_device_put; 4140 }
4183 }
4184 4141
4185 memset(&res, 0, sizeof(res)); 4142 err = platform_device_add_data(pdev[i], &sio_data,
4186 res.name = DRVNAME; 4143 sizeof(struct nct6775_sio_data));
4187 res.start = address + IOREGION_OFFSET; 4144 if (err)
4188 res.end = address + IOREGION_OFFSET + IOREGION_LENGTH - 1; 4145 goto exit_device_put;
4189 res.flags = IORESOURCE_IO; 4146
4147 memset(&res, 0, sizeof(res));
4148 res.name = DRVNAME;
4149 res.start = address + IOREGION_OFFSET;
4150 res.end = address + IOREGION_OFFSET + IOREGION_LENGTH - 1;
4151 res.flags = IORESOURCE_IO;
4152
4153 err = acpi_check_resource_conflict(&res);
4154 if (err) {
4155 platform_device_put(pdev[i]);
4156 pdev[i] = NULL;
4157 continue;
4158 }
4190 4159
4191 err = acpi_check_resource_conflict(&res); 4160 err = platform_device_add_resources(pdev[i], &res, 1);
4192 if (err) 4161 if (err)
4193 goto exit_device_put; 4162 goto exit_device_put;
4194 4163
4195 err = platform_device_add_resources(pdev, &res, 1); 4164 /* platform_device_add calls probe() */
4196 if (err) { 4165 err = platform_device_add(pdev[i]);
4197 pr_err("Device resource addition failed (%d)\n", err); 4166 if (err)
4198 goto exit_device_put; 4167 goto exit_device_put;
4199 } 4168 }
4200 4169 if (!found) {
4201 /* platform_device_add calls probe() */ 4170 err = -ENODEV;
4202 err = platform_device_add(pdev); 4171 goto exit_unregister;
4203 if (err) {
4204 pr_err("Device addition failed (%d)\n", err);
4205 goto exit_device_put;
4206 } 4172 }
4207 4173
4208 return 0; 4174 return 0;
4209 4175
4210exit_device_put: 4176exit_device_put:
4211 platform_device_put(pdev); 4177 for (i = 0; i < ARRAY_SIZE(pdev); i++) {
4178 if (pdev[i])
4179 platform_device_put(pdev[i]);
4180 }
4212exit_unregister: 4181exit_unregister:
4213 platform_driver_unregister(&nct6775_driver); 4182 platform_driver_unregister(&nct6775_driver);
4214exit:
4215 return err; 4183 return err;
4216} 4184}
4217 4185
4218static void __exit sensors_nct6775_exit(void) 4186static void __exit sensors_nct6775_exit(void)
4219{ 4187{
4220 platform_device_unregister(pdev); 4188 int i;
4189
4190 for (i = 0; i < ARRAY_SIZE(pdev); i++) {
4191 if (pdev[i])
4192 platform_device_unregister(pdev[i]);
4193 }
4221 platform_driver_unregister(&nct6775_driver); 4194 platform_driver_unregister(&nct6775_driver);
4222} 4195}
4223 4196
diff --git a/drivers/hwmon/ntc_thermistor.c b/drivers/hwmon/ntc_thermistor.c
index 830a842d796a..8c23203915af 100644
--- a/drivers/hwmon/ntc_thermistor.c
+++ b/drivers/hwmon/ntc_thermistor.c
@@ -424,7 +424,7 @@ static int ntc_thermistor_probe(struct platform_device *pdev)
424 if (IS_ERR(pdata)) 424 if (IS_ERR(pdata))
425 return PTR_ERR(pdata); 425 return PTR_ERR(pdata);
426 else if (pdata == NULL) 426 else if (pdata == NULL)
427 pdata = pdev->dev.platform_data; 427 pdata = dev_get_platdata(&pdev->dev);
428 428
429 if (!pdata) { 429 if (!pdata) {
430 dev_err(&pdev->dev, "No platform init data supplied.\n"); 430 dev_err(&pdev->dev, "No platform init data supplied.\n");
diff --git a/drivers/hwmon/pc87427.c b/drivers/hwmon/pc87427.c
index ea606860d2b2..6e6ea4437bb6 100644
--- a/drivers/hwmon/pc87427.c
+++ b/drivers/hwmon/pc87427.c
@@ -983,7 +983,7 @@ static int pc87427_request_regions(struct platform_device *pdev,
983 983
984static void pc87427_init_device(struct device *dev) 984static void pc87427_init_device(struct device *dev)
985{ 985{
986 struct pc87427_sio_data *sio_data = dev->platform_data; 986 struct pc87427_sio_data *sio_data = dev_get_platdata(dev);
987 struct pc87427_data *data = dev_get_drvdata(dev); 987 struct pc87427_data *data = dev_get_drvdata(dev);
988 int i; 988 int i;
989 u8 reg; 989 u8 reg;
@@ -1075,7 +1075,7 @@ static void pc87427_remove_files(struct device *dev)
1075 1075
1076static int pc87427_probe(struct platform_device *pdev) 1076static int pc87427_probe(struct platform_device *pdev)
1077{ 1077{
1078 struct pc87427_sio_data *sio_data = pdev->dev.platform_data; 1078 struct pc87427_sio_data *sio_data = dev_get_platdata(&pdev->dev);
1079 struct pc87427_data *data; 1079 struct pc87427_data *data;
1080 int i, err, res_count; 1080 int i, err, res_count;
1081 1081
diff --git a/drivers/hwmon/pmbus/pmbus_core.c b/drivers/hwmon/pmbus/pmbus_core.c
index 9add60920ac0..9319fcf142d9 100644
--- a/drivers/hwmon/pmbus/pmbus_core.c
+++ b/drivers/hwmon/pmbus/pmbus_core.c
@@ -1726,7 +1726,7 @@ int pmbus_do_probe(struct i2c_client *client, const struct i2c_device_id *id,
1726 struct pmbus_driver_info *info) 1726 struct pmbus_driver_info *info)
1727{ 1727{
1728 struct device *dev = &client->dev; 1728 struct device *dev = &client->dev;
1729 const struct pmbus_platform_data *pdata = dev->platform_data; 1729 const struct pmbus_platform_data *pdata = dev_get_platdata(dev);
1730 struct pmbus_data *data; 1730 struct pmbus_data *data;
1731 int ret; 1731 int ret;
1732 1732
diff --git a/drivers/hwmon/s3c-hwmon.c b/drivers/hwmon/s3c-hwmon.c
index a9f7e804f1e4..73bd64e8c30a 100644
--- a/drivers/hwmon/s3c-hwmon.c
+++ b/drivers/hwmon/s3c-hwmon.c
@@ -165,7 +165,7 @@ static ssize_t s3c_hwmon_ch_show(struct device *dev,
165{ 165{
166 struct sensor_device_attribute *sen_attr = to_sensor_dev_attr(attr); 166 struct sensor_device_attribute *sen_attr = to_sensor_dev_attr(attr);
167 struct s3c_hwmon *hwmon = platform_get_drvdata(to_platform_device(dev)); 167 struct s3c_hwmon *hwmon = platform_get_drvdata(to_platform_device(dev));
168 struct s3c_hwmon_pdata *pdata = dev->platform_data; 168 struct s3c_hwmon_pdata *pdata = dev_get_platdata(dev);
169 struct s3c_hwmon_chcfg *cfg; 169 struct s3c_hwmon_chcfg *cfg;
170 int ret; 170 int ret;
171 171
@@ -194,7 +194,7 @@ static ssize_t s3c_hwmon_label_show(struct device *dev,
194 char *buf) 194 char *buf)
195{ 195{
196 struct sensor_device_attribute *sen_attr = to_sensor_dev_attr(attr); 196 struct sensor_device_attribute *sen_attr = to_sensor_dev_attr(attr);
197 struct s3c_hwmon_pdata *pdata = dev->platform_data; 197 struct s3c_hwmon_pdata *pdata = dev_get_platdata(dev);
198 struct s3c_hwmon_chcfg *cfg; 198 struct s3c_hwmon_chcfg *cfg;
199 199
200 cfg = pdata->in[sen_attr->index]; 200 cfg = pdata->in[sen_attr->index];
@@ -274,7 +274,7 @@ static void s3c_hwmon_remove_attr(struct device *dev,
274*/ 274*/
275static int s3c_hwmon_probe(struct platform_device *dev) 275static int s3c_hwmon_probe(struct platform_device *dev)
276{ 276{
277 struct s3c_hwmon_pdata *pdata = dev->dev.platform_data; 277 struct s3c_hwmon_pdata *pdata = dev_get_platdata(&dev->dev);
278 struct s3c_hwmon *hwmon; 278 struct s3c_hwmon *hwmon;
279 int ret = 0; 279 int ret = 0;
280 int i; 280 int i;
diff --git a/drivers/hwmon/sht15.c b/drivers/hwmon/sht15.c
index ab5dc3af4cfb..97cd45a8432c 100644
--- a/drivers/hwmon/sht15.c
+++ b/drivers/hwmon/sht15.c
@@ -940,11 +940,11 @@ static int sht15_probe(struct platform_device *pdev)
940 data->dev = &pdev->dev; 940 data->dev = &pdev->dev;
941 init_waitqueue_head(&data->wait_queue); 941 init_waitqueue_head(&data->wait_queue);
942 942
943 if (pdev->dev.platform_data == NULL) { 943 if (dev_get_platdata(&pdev->dev) == NULL) {
944 dev_err(&pdev->dev, "no platform data supplied\n"); 944 dev_err(&pdev->dev, "no platform data supplied\n");
945 return -EINVAL; 945 return -EINVAL;
946 } 946 }
947 data->pdata = pdev->dev.platform_data; 947 data->pdata = dev_get_platdata(&pdev->dev);
948 data->supply_uv = data->pdata->supply_mv * 1000; 948 data->supply_uv = data->pdata->supply_mv * 1000;
949 if (data->pdata->checksum) 949 if (data->pdata->checksum)
950 data->checksumming = true; 950 data->checksumming = true;
diff --git a/drivers/hwmon/smsc47m1.c b/drivers/hwmon/smsc47m1.c
index 6d8255ccf07a..05cb814539cb 100644
--- a/drivers/hwmon/smsc47m1.c
+++ b/drivers/hwmon/smsc47m1.c
@@ -668,7 +668,7 @@ static void smsc47m1_remove_files(struct device *dev)
668static int __init smsc47m1_probe(struct platform_device *pdev) 668static int __init smsc47m1_probe(struct platform_device *pdev)
669{ 669{
670 struct device *dev = &pdev->dev; 670 struct device *dev = &pdev->dev;
671 struct smsc47m1_sio_data *sio_data = dev->platform_data; 671 struct smsc47m1_sio_data *sio_data = dev_get_platdata(dev);
672 struct smsc47m1_data *data; 672 struct smsc47m1_data *data;
673 struct resource *res; 673 struct resource *res;
674 int err; 674 int err;
@@ -940,7 +940,7 @@ exit_device:
940static void __exit sm_smsc47m1_exit(void) 940static void __exit sm_smsc47m1_exit(void)
941{ 941{
942 platform_driver_unregister(&smsc47m1_driver); 942 platform_driver_unregister(&smsc47m1_driver);
943 smsc47m1_restore(pdev->dev.platform_data); 943 smsc47m1_restore(dev_get_platdata(&pdev->dev));
944 platform_device_unregister(pdev); 944 platform_device_unregister(pdev);
945} 945}
946 946
diff --git a/drivers/hwmon/w83627ehf.c b/drivers/hwmon/w83627ehf.c
index 004801e6fbb9..23ff210513d3 100644
--- a/drivers/hwmon/w83627ehf.c
+++ b/drivers/hwmon/w83627ehf.c
@@ -673,7 +673,7 @@ static void w83627ehf_write_fan_div(struct w83627ehf_data *data, int nr)
673static void w83627ehf_write_fan_div_common(struct device *dev, 673static void w83627ehf_write_fan_div_common(struct device *dev,
674 struct w83627ehf_data *data, int nr) 674 struct w83627ehf_data *data, int nr)
675{ 675{
676 struct w83627ehf_sio_data *sio_data = dev->platform_data; 676 struct w83627ehf_sio_data *sio_data = dev_get_platdata(dev);
677 677
678 if (sio_data->kind == nct6776) 678 if (sio_data->kind == nct6776)
679 ; /* no dividers, do nothing */ 679 ; /* no dividers, do nothing */
@@ -724,7 +724,7 @@ static void w83627ehf_update_fan_div(struct w83627ehf_data *data)
724static void w83627ehf_update_fan_div_common(struct device *dev, 724static void w83627ehf_update_fan_div_common(struct device *dev,
725 struct w83627ehf_data *data) 725 struct w83627ehf_data *data)
726{ 726{
727 struct w83627ehf_sio_data *sio_data = dev->platform_data; 727 struct w83627ehf_sio_data *sio_data = dev_get_platdata(dev);
728 728
729 if (sio_data->kind == nct6776) 729 if (sio_data->kind == nct6776)
730 ; /* no dividers, do nothing */ 730 ; /* no dividers, do nothing */
@@ -781,7 +781,7 @@ static void w83627ehf_update_pwm(struct w83627ehf_data *data)
781static void w83627ehf_update_pwm_common(struct device *dev, 781static void w83627ehf_update_pwm_common(struct device *dev,
782 struct w83627ehf_data *data) 782 struct w83627ehf_data *data)
783{ 783{
784 struct w83627ehf_sio_data *sio_data = dev->platform_data; 784 struct w83627ehf_sio_data *sio_data = dev_get_platdata(dev);
785 785
786 if (sio_data->kind == nct6775 || sio_data->kind == nct6776) 786 if (sio_data->kind == nct6775 || sio_data->kind == nct6776)
787 nct6775_update_pwm(data); 787 nct6775_update_pwm(data);
@@ -792,7 +792,7 @@ static void w83627ehf_update_pwm_common(struct device *dev,
792static struct w83627ehf_data *w83627ehf_update_device(struct device *dev) 792static struct w83627ehf_data *w83627ehf_update_device(struct device *dev)
793{ 793{
794 struct w83627ehf_data *data = dev_get_drvdata(dev); 794 struct w83627ehf_data *data = dev_get_drvdata(dev);
795 struct w83627ehf_sio_data *sio_data = dev->platform_data; 795 struct w83627ehf_sio_data *sio_data = dev_get_platdata(dev);
796 796
797 int i; 797 int i;
798 798
@@ -1392,7 +1392,7 @@ store_pwm_mode(struct device *dev, struct device_attribute *attr,
1392{ 1392{
1393 struct w83627ehf_data *data = dev_get_drvdata(dev); 1393 struct w83627ehf_data *data = dev_get_drvdata(dev);
1394 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); 1394 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
1395 struct w83627ehf_sio_data *sio_data = dev->platform_data; 1395 struct w83627ehf_sio_data *sio_data = dev_get_platdata(dev);
1396 int nr = sensor_attr->index; 1396 int nr = sensor_attr->index;
1397 unsigned long val; 1397 unsigned long val;
1398 int err; 1398 int err;
@@ -1448,7 +1448,7 @@ store_pwm_enable(struct device *dev, struct device_attribute *attr,
1448 const char *buf, size_t count) 1448 const char *buf, size_t count)
1449{ 1449{
1450 struct w83627ehf_data *data = dev_get_drvdata(dev); 1450 struct w83627ehf_data *data = dev_get_drvdata(dev);
1451 struct w83627ehf_sio_data *sio_data = dev->platform_data; 1451 struct w83627ehf_sio_data *sio_data = dev_get_platdata(dev);
1452 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); 1452 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
1453 int nr = sensor_attr->index; 1453 int nr = sensor_attr->index;
1454 unsigned long val; 1454 unsigned long val;
@@ -1527,7 +1527,7 @@ store_tolerance(struct device *dev, struct device_attribute *attr,
1527 const char *buf, size_t count) 1527 const char *buf, size_t count)
1528{ 1528{
1529 struct w83627ehf_data *data = dev_get_drvdata(dev); 1529 struct w83627ehf_data *data = dev_get_drvdata(dev);
1530 struct w83627ehf_sio_data *sio_data = dev->platform_data; 1530 struct w83627ehf_sio_data *sio_data = dev_get_platdata(dev);
1531 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); 1531 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
1532 int nr = sensor_attr->index; 1532 int nr = sensor_attr->index;
1533 u16 reg; 1533 u16 reg;
@@ -2065,7 +2065,7 @@ w83627ehf_check_fan_inputs(const struct w83627ehf_sio_data *sio_data,
2065static int w83627ehf_probe(struct platform_device *pdev) 2065static int w83627ehf_probe(struct platform_device *pdev)
2066{ 2066{
2067 struct device *dev = &pdev->dev; 2067 struct device *dev = &pdev->dev;
2068 struct w83627ehf_sio_data *sio_data = dev->platform_data; 2068 struct w83627ehf_sio_data *sio_data = dev_get_platdata(dev);
2069 struct w83627ehf_data *data; 2069 struct w83627ehf_data *data;
2070 struct resource *res; 2070 struct resource *res;
2071 u8 en_vrm10; 2071 u8 en_vrm10;
@@ -2618,7 +2618,7 @@ static int w83627ehf_remove(struct platform_device *pdev)
2618static int w83627ehf_suspend(struct device *dev) 2618static int w83627ehf_suspend(struct device *dev)
2619{ 2619{
2620 struct w83627ehf_data *data = w83627ehf_update_device(dev); 2620 struct w83627ehf_data *data = w83627ehf_update_device(dev);
2621 struct w83627ehf_sio_data *sio_data = dev->platform_data; 2621 struct w83627ehf_sio_data *sio_data = dev_get_platdata(dev);
2622 2622
2623 mutex_lock(&data->update_lock); 2623 mutex_lock(&data->update_lock);
2624 data->vbat = w83627ehf_read_value(data, W83627EHF_REG_VBAT); 2624 data->vbat = w83627ehf_read_value(data, W83627EHF_REG_VBAT);
@@ -2634,7 +2634,7 @@ static int w83627ehf_suspend(struct device *dev)
2634static int w83627ehf_resume(struct device *dev) 2634static int w83627ehf_resume(struct device *dev)
2635{ 2635{
2636 struct w83627ehf_data *data = dev_get_drvdata(dev); 2636 struct w83627ehf_data *data = dev_get_drvdata(dev);
2637 struct w83627ehf_sio_data *sio_data = dev->platform_data; 2637 struct w83627ehf_sio_data *sio_data = dev_get_platdata(dev);
2638 int i; 2638 int i;
2639 2639
2640 mutex_lock(&data->update_lock); 2640 mutex_lock(&data->update_lock);
@@ -2694,6 +2694,8 @@ static int w83627ehf_resume(struct device *dev)
2694static const struct dev_pm_ops w83627ehf_dev_pm_ops = { 2694static const struct dev_pm_ops w83627ehf_dev_pm_ops = {
2695 .suspend = w83627ehf_suspend, 2695 .suspend = w83627ehf_suspend,
2696 .resume = w83627ehf_resume, 2696 .resume = w83627ehf_resume,
2697 .freeze = w83627ehf_suspend,
2698 .restore = w83627ehf_resume,
2697}; 2699};
2698 2700
2699#define W83627EHF_DEV_PM_OPS (&w83627ehf_dev_pm_ops) 2701#define W83627EHF_DEV_PM_OPS (&w83627ehf_dev_pm_ops)
diff --git a/drivers/hwmon/w83627hf.c b/drivers/hwmon/w83627hf.c
index 3b9ef2d23452..cb9cd326ecb5 100644
--- a/drivers/hwmon/w83627hf.c
+++ b/drivers/hwmon/w83627hf.c
@@ -1415,7 +1415,7 @@ static const struct attribute_group w83627hf_group_opt = {
1415static int w83627hf_probe(struct platform_device *pdev) 1415static int w83627hf_probe(struct platform_device *pdev)
1416{ 1416{
1417 struct device *dev = &pdev->dev; 1417 struct device *dev = &pdev->dev;
1418 struct w83627hf_sio_data *sio_data = dev->platform_data; 1418 struct w83627hf_sio_data *sio_data = dev_get_platdata(dev);
1419 struct w83627hf_data *data; 1419 struct w83627hf_data *data;
1420 struct resource *res; 1420 struct resource *res;
1421 int err, i; 1421 int err, i;
@@ -1636,7 +1636,7 @@ static int w83627hf_read_value(struct w83627hf_data *data, u16 reg)
1636 1636
1637static int w83627thf_read_gpio5(struct platform_device *pdev) 1637static int w83627thf_read_gpio5(struct platform_device *pdev)
1638{ 1638{
1639 struct w83627hf_sio_data *sio_data = pdev->dev.platform_data; 1639 struct w83627hf_sio_data *sio_data = dev_get_platdata(&pdev->dev);
1640 int res = 0xff, sel; 1640 int res = 0xff, sel;
1641 1641
1642 superio_enter(sio_data); 1642 superio_enter(sio_data);
@@ -1669,7 +1669,7 @@ exit:
1669 1669
1670static int w83687thf_read_vid(struct platform_device *pdev) 1670static int w83687thf_read_vid(struct platform_device *pdev)
1671{ 1671{
1672 struct w83627hf_sio_data *sio_data = pdev->dev.platform_data; 1672 struct w83627hf_sio_data *sio_data = dev_get_platdata(&pdev->dev);
1673 int res = 0xff; 1673 int res = 0xff;
1674 1674
1675 superio_enter(sio_data); 1675 superio_enter(sio_data);