diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-09-03 13:43:35 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-09-03 13:43:35 -0400 |
commit | 7e75224188460ef2e6a6096e912aa4682ab76486 (patch) | |
tree | 99a3e77d20928ab4141909ce77b4fd25b83aaa3a /drivers/hwmon | |
parent | bebcb928c820d0ee83aca4b192adc195e43e66a2 (diff) | |
parent | f060c658b820141f18abd7b71586d628464a03ea (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')
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 | ||
514 | config 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 | |||
514 | config SENSORS_CORETEMP | 524 | config 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 | |||
65 | obj-$(CONFIG_SENSORS_GL520SM) += gl520sm.o | 65 | obj-$(CONFIG_SENSORS_GL520SM) += gl520sm.o |
66 | obj-$(CONFIG_SENSORS_GPIO_FAN) += gpio-fan.o | 66 | obj-$(CONFIG_SENSORS_GPIO_FAN) += gpio-fan.o |
67 | obj-$(CONFIG_SENSORS_HIH6130) += hih6130.o | 67 | obj-$(CONFIG_SENSORS_HIH6130) += hih6130.o |
68 | obj-$(CONFIG_SENSORS_HTU21) += htu21.o | ||
68 | obj-$(CONFIG_SENSORS_ULTRA45) += ultra45_env.o | 69 | obj-$(CONFIG_SENSORS_ULTRA45) += ultra45_env.o |
69 | obj-$(CONFIG_SENSORS_I5K_AMB) += i5k_amb.o | 70 | obj-$(CONFIG_SENSORS_I5K_AMB) += i5k_amb.o |
70 | obj-$(CONFIG_SENSORS_IBMAEM) += ibmaem.o | 71 | obj-$(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 | ||
1004 | MODULE_AUTHOR("Darrick J. Wong <djwong@us.ibm.com>"); | 1004 | MODULE_AUTHOR("Darrick J. Wong <darrick.wong@oracle.com>"); |
1005 | MODULE_DESCRIPTION("ACPI 4.0 power meter driver"); | 1005 | MODULE_DESCRIPTION("ACPI 4.0 power meter driver"); |
1006 | MODULE_LICENSE("GPL"); | 1006 | MODULE_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 */ |
49 | static const unsigned int data_rate_table[8] = { | 49 | static 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 | |||
53 | static 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 | ||
61 | enum ads1015_chips { | ||
62 | ads1015, | ||
63 | ads1115, | ||
64 | }; | ||
65 | |||
56 | struct ads1015_data { | 66 | struct 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 | ||
62 | static int ads1015_read_adc(struct i2c_client *client, unsigned int channel) | 73 | static 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 | ||
288 | static const struct i2c_device_id ads1015_id[] = { | 302 | static const struct i2c_device_id ads1015_id[] = { |
289 | { "ads1015", 0 }, | 303 | { "ads1015", ads1015}, |
304 | { "ads1115", ads1115}, | ||
290 | { } | 305 | { } |
291 | }; | 306 | }; |
292 | MODULE_DEVICE_TABLE(i2c, ads1015_id); | 307 | MODULE_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) | |||
145 | static int ads7828_probe(struct i2c_client *client, | 145 | static 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 | ||
339 | static int ADT7462_REG_VOLT_MIN(struct adt7462_data *data, int which) | 339 | static 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 | ||
398 | static int ADT7462_REG_VOLT(struct adt7462_data *data, int which) | 398 | static int ADT7462_REG_VOLT(struct adt7462_data *data, int which) |
@@ -1970,6 +1970,6 @@ static int adt7462_remove(struct i2c_client *client) | |||
1970 | 1970 | ||
1971 | module_i2c_driver(adt7462_driver); | 1971 | module_i2c_driver(adt7462_driver); |
1972 | 1972 | ||
1973 | MODULE_AUTHOR("Darrick J. Wong <djwong@us.ibm.com>"); | 1973 | MODULE_AUTHOR("Darrick J. Wong <darrick.wong@oracle.com>"); |
1974 | MODULE_DESCRIPTION("ADT7462 driver"); | 1974 | MODULE_DESCRIPTION("ADT7462 driver"); |
1975 | MODULE_LICENSE("GPL"); | 1975 | MODULE_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 | ||
1315 | module_i2c_driver(adt7470_driver); | 1315 | module_i2c_driver(adt7470_driver); |
1316 | 1316 | ||
1317 | MODULE_AUTHOR("Darrick J. Wong <djwong@us.ibm.com>"); | 1317 | MODULE_AUTHOR("Darrick J. Wong <darrick.wong@oracle.com>"); |
1318 | MODULE_DESCRIPTION("ADT7470 driver"); | 1318 | MODULE_DESCRIPTION("ADT7470 driver"); |
1319 | MODULE_LICENSE("GPL"); | 1319 | MODULE_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 | ||
319 | static 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 | |||
319 | static int get_tjmax(struct cpuinfo_x86 *c, u32 id, struct device *dev) | 331 | static 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 | ||
78 | static void ds620_init_client(struct i2c_client *client) | 78 | static 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 | ||
1376 | static int f71805f_probe(struct platform_device *pdev) | 1376 | static 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( | |||
2267 | static int f71882fg_probe(struct platform_device *pdev) | 2267 | static 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 | ||
718 | static int g762_pdata_prop_import(struct i2c_client *client) | 718 | static 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 | |||
33 | struct 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 | |||
42 | static 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 | |||
52 | static 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 | |||
62 | static 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 | } | ||
84 | out: | ||
85 | mutex_unlock(&htu21->lock); | ||
86 | |||
87 | return ret >= 0 ? 0 : ret; | ||
88 | } | ||
89 | |||
90 | static 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 | |||
101 | static 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 | |||
112 | static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, | ||
113 | htu21_show_temperature, NULL, 0); | ||
114 | static SENSOR_DEVICE_ATTR(humidity1_input, S_IRUGO, | ||
115 | htu21_show_humidity, NULL, 0); | ||
116 | |||
117 | static 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 | |||
123 | static const struct attribute_group htu21_group = { | ||
124 | .attrs = htu21_attributes, | ||
125 | }; | ||
126 | |||
127 | static 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 | |||
164 | error: | ||
165 | sysfs_remove_group(&client->dev.kobj, &htu21_group); | ||
166 | return err; | ||
167 | } | ||
168 | |||
169 | static 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 | |||
179 | static const struct i2c_device_id htu21_id[] = { | ||
180 | { "htu21", 0 }, | ||
181 | { } | ||
182 | }; | ||
183 | MODULE_DEVICE_TABLE(i2c, htu21_id); | ||
184 | |||
185 | static 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 | |||
195 | module_i2c_driver(htu21_driver); | ||
196 | |||
197 | MODULE_AUTHOR("William Markezana <william.markezana@meas-spec.com>"); | ||
198 | MODULE_DESCRIPTION("MEAS HTU21D humidity and temperature sensor driver"); | ||
199 | MODULE_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 | ||
612 | MODULE_AUTHOR("Darrick J. Wong <djwong@us.ibm.com>"); | 612 | MODULE_AUTHOR("Darrick J. Wong <darrick.wong@oracle.com>"); |
613 | MODULE_DESCRIPTION("Intel 5000 chipset FB-DIMM AMB temperature sensor"); | 613 | MODULE_DESCRIPTION("Intel 5000 chipset FB-DIMM AMB temperature sensor"); |
614 | MODULE_LICENSE("GPL"); | 614 | MODULE_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 | ||
1106 | MODULE_AUTHOR("Darrick J. Wong <djwong@us.ibm.com>"); | 1106 | MODULE_AUTHOR("Darrick J. Wong <darrick.wong@oracle.com>"); |
1107 | MODULE_DESCRIPTION("IBM AEM power/temp/energy sensor driver"); | 1107 | MODULE_DESCRIPTION("IBM AEM power/temp/energy sensor driver"); |
1108 | MODULE_LICENSE("GPL"); | 1108 | MODULE_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 | ||
609 | MODULE_AUTHOR("Darrick J. Wong <djwong@us.ibm.com>"); | 609 | MODULE_AUTHOR("Darrick J. Wong <darrick.wong@oracle.com>"); |
610 | MODULE_DESCRIPTION("IBM PowerExecutive power/temperature sensor driver"); | 610 | MODULE_DESCRIPTION("IBM PowerExecutive power/temperature sensor driver"); |
611 | MODULE_LICENSE("GPL"); | 611 | MODULE_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: | |||
1962 | static void it87_remove_files(struct device *dev) | 1962 | static 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. */ |
2317 | static void it87_init_device(struct platform_device *pdev) | 2317 | static 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 | }; |
216 | MODULE_DEVICE_TABLE(pci, k10temp_id_table); | 217 | MODULE_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 | ||
62 | enum kinds { nct6775, nct6776, nct6779 }; | 64 | enum 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] */ |
65 | static const char * const nct6775_device_names[] = { | 67 | static 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 | ||
71 | static unsigned short force_id; | 75 | static 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 | ||
99 | enum pwm_enable { off, manual, thermal_cruise, speed_cruise, sf3, sf4 }; | 105 | enum 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 | ||
194 | static const u16 NCT6775_REG_ALARM[NUM_REG_ALARM] = { 0x459, 0x45A, 0x45B }; | 204 | static 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 | ||
198 | static const s8 NCT6775_ALARM_BITS[] = { | 208 | static 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 | ||
221 | static 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 | */ | ||
227 | static 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 | |||
211 | static const u8 NCT6775_REG_CR_CASEOPEN_CLR[] = { 0xe6, 0xee }; | 238 | static const u8 NCT6775_REG_CR_CASEOPEN_CLR[] = { 0xe6, 0xee }; |
212 | static const u8 NCT6775_CR_CASEOPEN_CLR_MASK[] = { 0x20, 0x01 }; | 239 | static 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 | ||
220 | static const u16 NCT6775_REG_TARGET[] = { 0x101, 0x201, 0x301, 0x801, 0x901 }; | 247 | static const u16 NCT6775_REG_TARGET[] = { |
221 | static const u16 NCT6775_REG_FAN_MODE[] = { 0x102, 0x202, 0x302, 0x802, 0x902 }; | 248 | 0x101, 0x201, 0x301, 0x801, 0x901, 0xa01 }; |
249 | static const u16 NCT6775_REG_FAN_MODE[] = { | ||
250 | 0x102, 0x202, 0x302, 0x802, 0x902, 0xa02 }; | ||
222 | static const u16 NCT6775_REG_FAN_STEP_DOWN_TIME[] = { | 251 | static const u16 NCT6775_REG_FAN_STEP_DOWN_TIME[] = { |
223 | 0x103, 0x203, 0x303, 0x803, 0x903 }; | 252 | 0x103, 0x203, 0x303, 0x803, 0x903, 0xa03 }; |
224 | static const u16 NCT6775_REG_FAN_STEP_UP_TIME[] = { | 253 | static const u16 NCT6775_REG_FAN_STEP_UP_TIME[] = { |
225 | 0x104, 0x204, 0x304, 0x804, 0x904 }; | 254 | 0x104, 0x204, 0x304, 0x804, 0x904, 0xa04 }; |
226 | static const u16 NCT6775_REG_FAN_STOP_OUTPUT[] = { | 255 | static const u16 NCT6775_REG_FAN_STOP_OUTPUT[] = { |
227 | 0x105, 0x205, 0x305, 0x805, 0x905 }; | 256 | 0x105, 0x205, 0x305, 0x805, 0x905, 0xa05 }; |
228 | static const u16 NCT6775_REG_FAN_START_OUTPUT[] | 257 | static const u16 NCT6775_REG_FAN_START_OUTPUT[] = { |
229 | = { 0x106, 0x206, 0x306, 0x806, 0x906 }; | 258 | 0x106, 0x206, 0x306, 0x806, 0x906, 0xa06 }; |
230 | static const u16 NCT6775_REG_FAN_MAX_OUTPUT[] = { 0x10a, 0x20a, 0x30a }; | 259 | static const u16 NCT6775_REG_FAN_MAX_OUTPUT[] = { 0x10a, 0x20a, 0x30a }; |
231 | static const u16 NCT6775_REG_FAN_STEP_OUTPUT[] = { 0x10b, 0x20b, 0x30b }; | 260 | static const u16 NCT6775_REG_FAN_STEP_OUTPUT[] = { 0x10b, 0x20b, 0x30b }; |
232 | 261 | ||
233 | static const u16 NCT6775_REG_FAN_STOP_TIME[] = { | 262 | static const u16 NCT6775_REG_FAN_STOP_TIME[] = { |
234 | 0x107, 0x207, 0x307, 0x807, 0x907 }; | 263 | 0x107, 0x207, 0x307, 0x807, 0x907, 0xa07 }; |
235 | static const u16 NCT6775_REG_PWM[] = { 0x109, 0x209, 0x309, 0x809, 0x909 }; | 264 | static const u16 NCT6775_REG_PWM[] = { |
236 | static const u16 NCT6775_REG_PWM_READ[] = { 0x01, 0x03, 0x11, 0x13, 0x15 }; | 265 | 0x109, 0x209, 0x309, 0x809, 0x909, 0xa09 }; |
266 | static const u16 NCT6775_REG_PWM_READ[] = { | ||
267 | 0x01, 0x03, 0x11, 0x13, 0x15, 0xa09 }; | ||
237 | 268 | ||
238 | static const u16 NCT6775_REG_FAN[] = { 0x630, 0x632, 0x634, 0x636, 0x638 }; | 269 | static const u16 NCT6775_REG_FAN[] = { 0x630, 0x632, 0x634, 0x636, 0x638 }; |
239 | static const u16 NCT6775_REG_FAN_MIN[] = { 0x3b, 0x3c, 0x3d }; | 270 | static const u16 NCT6775_REG_FAN_MIN[] = { 0x3b, 0x3c, 0x3d }; |
240 | static const u16 NCT6775_REG_FAN_PULSES[] = { 0x641, 0x642, 0x643, 0x644, 0 }; | 271 | static const u16 NCT6775_REG_FAN_PULSES[] = { 0x641, 0x642, 0x643, 0x644, 0 }; |
272 | static const u16 NCT6775_FAN_PULSE_SHIFT[] = { 0, 0, 0, 0, 0, 0 }; | ||
241 | 273 | ||
242 | static const u16 NCT6775_REG_TEMP[] = { | 274 | static 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 | ||
255 | static const u16 NCT6775_REG_TEMP_SEL[] = { | 287 | static const u16 NCT6775_REG_TEMP_SEL[] = { |
256 | 0x100, 0x200, 0x300, 0x800, 0x900 }; | 288 | 0x100, 0x200, 0x300, 0x800, 0x900, 0xa00 }; |
257 | 289 | ||
258 | static const u16 NCT6775_REG_WEIGHT_TEMP_SEL[] = { | 290 | static const u16 NCT6775_REG_WEIGHT_TEMP_SEL[] = { |
259 | 0x139, 0x239, 0x339, 0x839, 0x939 }; | 291 | 0x139, 0x239, 0x339, 0x839, 0x939, 0xa39 }; |
260 | static const u16 NCT6775_REG_WEIGHT_TEMP_STEP[] = { | 292 | static const u16 NCT6775_REG_WEIGHT_TEMP_STEP[] = { |
261 | 0x13a, 0x23a, 0x33a, 0x83a, 0x93a }; | 293 | 0x13a, 0x23a, 0x33a, 0x83a, 0x93a, 0xa3a }; |
262 | static const u16 NCT6775_REG_WEIGHT_TEMP_STEP_TOL[] = { | 294 | static const u16 NCT6775_REG_WEIGHT_TEMP_STEP_TOL[] = { |
263 | 0x13b, 0x23b, 0x33b, 0x83b, 0x93b }; | 295 | 0x13b, 0x23b, 0x33b, 0x83b, 0x93b, 0xa3b }; |
264 | static const u16 NCT6775_REG_WEIGHT_DUTY_STEP[] = { | 296 | static const u16 NCT6775_REG_WEIGHT_DUTY_STEP[] = { |
265 | 0x13c, 0x23c, 0x33c, 0x83c, 0x93c }; | 297 | 0x13c, 0x23c, 0x33c, 0x83c, 0x93c, 0xa3c }; |
266 | static const u16 NCT6775_REG_WEIGHT_TEMP_BASE[] = { | 298 | static const u16 NCT6775_REG_WEIGHT_TEMP_BASE[] = { |
267 | 0x13d, 0x23d, 0x33d, 0x83d, 0x93d }; | 299 | 0x13d, 0x23d, 0x33d, 0x83d, 0x93d, 0xa3d }; |
268 | 300 | ||
269 | static const u16 NCT6775_REG_TEMP_OFFSET[] = { 0x454, 0x455, 0x456 }; | 301 | static const u16 NCT6775_REG_TEMP_OFFSET[] = { 0x454, 0x455, 0x456 }; |
270 | 302 | ||
271 | static const u16 NCT6775_REG_AUTO_TEMP[] = { | 303 | static const u16 NCT6775_REG_AUTO_TEMP[] = { |
272 | 0x121, 0x221, 0x321, 0x821, 0x921 }; | 304 | 0x121, 0x221, 0x321, 0x821, 0x921, 0xa21 }; |
273 | static const u16 NCT6775_REG_AUTO_PWM[] = { | 305 | static 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[] = { | |||
279 | static const u16 NCT6775_REG_CRITICAL_ENAB[] = { 0x134, 0x234, 0x334 }; | 311 | static const u16 NCT6775_REG_CRITICAL_ENAB[] = { 0x134, 0x234, 0x334 }; |
280 | 312 | ||
281 | static const u16 NCT6775_REG_CRITICAL_TEMP[] = { | 313 | static const u16 NCT6775_REG_CRITICAL_TEMP[] = { |
282 | 0x135, 0x235, 0x335, 0x835, 0x935 }; | 314 | 0x135, 0x235, 0x335, 0x835, 0x935, 0xa35 }; |
283 | static const u16 NCT6775_REG_CRITICAL_TEMP_TOLERANCE[] = { | 315 | static const u16 NCT6775_REG_CRITICAL_TEMP_TOLERANCE[] = { |
284 | 0x138, 0x238, 0x338, 0x838, 0x938 }; | 316 | 0x138, 0x238, 0x338, 0x838, 0x938, 0xa38 }; |
285 | 317 | ||
286 | static const char *const nct6775_temp_label[] = { | 318 | static 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 | ||
360 | static const u16 NCT6776_REG_BEEP[NUM_REG_BEEP] = { 0xb2, 0xb3, 0xb4, 0xb5 }; | ||
361 | |||
362 | static 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 | |||
328 | static const u16 NCT6776_REG_TOLERANCE_H[] = { | 371 | static const u16 NCT6776_REG_TOLERANCE_H[] = { |
329 | 0x10c, 0x20c, 0x30c, 0x80c, 0x90c }; | 372 | 0x10c, 0x20c, 0x30c, 0x80c, 0x90c, 0xa0c }; |
330 | 373 | ||
331 | static const u8 NCT6776_REG_PWM_MODE[] = { 0x04, 0, 0 }; | 374 | static const u8 NCT6776_REG_PWM_MODE[] = { 0x04, 0, 0, 0, 0, 0 }; |
332 | static const u8 NCT6776_PWM_MODE_MASK[] = { 0x01, 0, 0 }; | 375 | static const u8 NCT6776_PWM_MODE_MASK[] = { 0x01, 0, 0, 0, 0, 0 }; |
333 | 376 | ||
334 | static const u16 NCT6776_REG_FAN_MIN[] = { 0x63a, 0x63c, 0x63e, 0x640, 0x642 }; | 377 | static const u16 NCT6776_REG_FAN_MIN[] = { 0x63a, 0x63c, 0x63e, 0x640, 0x642 }; |
335 | static const u16 NCT6776_REG_FAN_PULSES[] = { 0x644, 0x645, 0x646, 0, 0 }; | 378 | static const u16 NCT6776_REG_FAN_PULSES[] = { 0x644, 0x645, 0x646, 0, 0 }; |
336 | 379 | ||
337 | static const u16 NCT6776_REG_WEIGHT_DUTY_BASE[] = { | 380 | static const u16 NCT6776_REG_WEIGHT_DUTY_BASE[] = { |
338 | 0x13e, 0x23e, 0x33e, 0x83e, 0x93e }; | 381 | 0x13e, 0x23e, 0x33e, 0x83e, 0x93e, 0xa3e }; |
339 | 382 | ||
340 | static const u16 NCT6776_REG_TEMP_CONFIG[ARRAY_SIZE(NCT6775_REG_TEMP)] = { | 383 | static 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 | ||
393 | static const u16 NCT6779_REG_FAN[] = { 0x4b0, 0x4b2, 0x4b4, 0x4b6, 0x4b8 }; | 436 | static 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 | |||
445 | static const u16 NCT6779_REG_FAN[] = { | ||
446 | 0x4b0, 0x4b2, 0x4b4, 0x4b6, 0x4b8, 0x4ba }; | ||
394 | static const u16 NCT6779_REG_FAN_PULSES[] = { | 447 | static const u16 NCT6779_REG_FAN_PULSES[] = { |
395 | 0x644, 0x645, 0x646, 0x647, 0x648 }; | 448 | 0x644, 0x645, 0x646, 0x647, 0x648, 0x649 }; |
396 | 449 | ||
397 | static const u16 NCT6779_REG_CRITICAL_PWM_ENABLE[] = { | 450 | static 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 | ||
399 | static const u16 NCT6779_REG_CRITICAL_PWM[] = { | 453 | static const u16 NCT6779_REG_CRITICAL_PWM[] = { |
400 | 0x137, 0x237, 0x337, 0x837, 0x937 }; | 454 | 0x137, 0x237, 0x337, 0x837, 0x937, 0xa37 }; |
401 | 455 | ||
402 | static const u16 NCT6779_REG_TEMP[] = { 0x27, 0x150 }; | 456 | static const u16 NCT6779_REG_TEMP[] = { 0x27, 0x150 }; |
403 | static const u16 NCT6779_REG_TEMP_CONFIG[ARRAY_SIZE(NCT6779_REG_TEMP)] = { | 457 | static 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] | |||
449 | static const u16 NCT6779_REG_TEMP_CRIT[ARRAY_SIZE(nct6779_temp_label) - 1] | 503 | static 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 | |||
510 | static const u16 NCT6791_REG_ALARM[NUM_REG_ALARM] = { | ||
511 | 0x459, 0x45A, 0x45B, 0x568, 0x45D }; | ||
512 | |||
513 | static 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 | |||
529 | static const u16 NCT6106_REG_IN_MAX[] = { | ||
530 | 0x90, 0x92, 0x94, 0x96, 0x98, 0x9a, 0x9e, 0xa0, 0xa2 }; | ||
531 | static const u16 NCT6106_REG_IN_MIN[] = { | ||
532 | 0x91, 0x93, 0x95, 0x97, 0x99, 0x9b, 0x9f, 0xa1, 0xa3 }; | ||
533 | static const u16 NCT6106_REG_IN[] = { | ||
534 | 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x07, 0x08, 0x09 }; | ||
535 | |||
536 | static const u16 NCT6106_REG_TEMP[] = { 0x10, 0x11, 0x12, 0x13, 0x14, 0x15 }; | ||
537 | static const u16 NCT6106_REG_TEMP_HYST[] = { | ||
538 | 0xc3, 0xc7, 0xcb, 0xcf, 0xd3, 0xd7 }; | ||
539 | static const u16 NCT6106_REG_TEMP_OVER[] = { | ||
540 | 0xc2, 0xc6, 0xca, 0xce, 0xd2, 0xd6 }; | ||
541 | static const u16 NCT6106_REG_TEMP_CRIT_L[] = { | ||
542 | 0xc0, 0xc4, 0xc8, 0xcc, 0xd0, 0xd4 }; | ||
543 | static const u16 NCT6106_REG_TEMP_CRIT_H[] = { | ||
544 | 0xc1, 0xc5, 0xc9, 0xcf, 0xd1, 0xd5 }; | ||
545 | static const u16 NCT6106_REG_TEMP_OFFSET[] = { 0x311, 0x312, 0x313 }; | ||
546 | static const u16 NCT6106_REG_TEMP_CONFIG[] = { | ||
547 | 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc }; | ||
548 | |||
549 | static const u16 NCT6106_REG_FAN[] = { 0x20, 0x22, 0x24 }; | ||
550 | static const u16 NCT6106_REG_FAN_MIN[] = { 0xe0, 0xe2, 0xe4 }; | ||
551 | static const u16 NCT6106_REG_FAN_PULSES[] = { 0xf6, 0xf6, 0xf6, 0, 0 }; | ||
552 | static const u16 NCT6106_FAN_PULSE_SHIFT[] = { 0, 2, 4, 0, 0 }; | ||
553 | |||
554 | static const u8 NCT6106_REG_PWM_MODE[] = { 0xf3, 0xf3, 0xf3 }; | ||
555 | static const u8 NCT6106_PWM_MODE_MASK[] = { 0x01, 0x02, 0x04 }; | ||
556 | static const u16 NCT6106_REG_PWM[] = { 0x119, 0x129, 0x139 }; | ||
557 | static const u16 NCT6106_REG_PWM_READ[] = { 0x4a, 0x4b, 0x4c }; | ||
558 | static const u16 NCT6106_REG_FAN_MODE[] = { 0x113, 0x123, 0x133 }; | ||
559 | static const u16 NCT6106_REG_TEMP_SEL[] = { 0x110, 0x120, 0x130 }; | ||
560 | static const u16 NCT6106_REG_TEMP_SOURCE[] = { | ||
561 | 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5 }; | ||
562 | |||
563 | static const u16 NCT6106_REG_CRITICAL_TEMP[] = { 0x11a, 0x12a, 0x13a }; | ||
564 | static const u16 NCT6106_REG_CRITICAL_TEMP_TOLERANCE[] = { | ||
565 | 0x11b, 0x12b, 0x13b }; | ||
566 | |||
567 | static const u16 NCT6106_REG_CRITICAL_PWM_ENABLE[] = { 0x11c, 0x12c, 0x13c }; | ||
568 | #define NCT6106_CRITICAL_PWM_ENABLE_MASK 0x10 | ||
569 | static const u16 NCT6106_REG_CRITICAL_PWM[] = { 0x11d, 0x12d, 0x13d }; | ||
570 | |||
571 | static const u16 NCT6106_REG_FAN_STEP_UP_TIME[] = { 0x114, 0x124, 0x134 }; | ||
572 | static const u16 NCT6106_REG_FAN_STEP_DOWN_TIME[] = { 0x115, 0x125, 0x135 }; | ||
573 | static const u16 NCT6106_REG_FAN_STOP_OUTPUT[] = { 0x116, 0x126, 0x136 }; | ||
574 | static const u16 NCT6106_REG_FAN_START_OUTPUT[] = { 0x117, 0x127, 0x137 }; | ||
575 | static const u16 NCT6106_REG_FAN_STOP_TIME[] = { 0x118, 0x128, 0x138 }; | ||
576 | static const u16 NCT6106_REG_TOLERANCE_H[] = { 0x112, 0x122, 0x132 }; | ||
577 | |||
578 | static const u16 NCT6106_REG_TARGET[] = { 0x111, 0x121, 0x131 }; | ||
579 | |||
580 | static const u16 NCT6106_REG_WEIGHT_TEMP_SEL[] = { 0x168, 0x178, 0x188 }; | ||
581 | static const u16 NCT6106_REG_WEIGHT_TEMP_STEP[] = { 0x169, 0x179, 0x189 }; | ||
582 | static const u16 NCT6106_REG_WEIGHT_TEMP_STEP_TOL[] = { 0x16a, 0x17a, 0x18a }; | ||
583 | static const u16 NCT6106_REG_WEIGHT_DUTY_STEP[] = { 0x16b, 0x17b, 0x17c }; | ||
584 | static const u16 NCT6106_REG_WEIGHT_TEMP_BASE[] = { 0x16c, 0x17c, 0x18c }; | ||
585 | static const u16 NCT6106_REG_WEIGHT_DUTY_BASE[] = { 0x16d, 0x17d, 0x18d }; | ||
586 | |||
587 | static const u16 NCT6106_REG_AUTO_TEMP[] = { 0x160, 0x170, 0x180 }; | ||
588 | static const u16 NCT6106_REG_AUTO_PWM[] = { 0x164, 0x174, 0x184 }; | ||
589 | |||
590 | static const u16 NCT6106_REG_ALARM[NUM_REG_ALARM] = { | ||
591 | 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d }; | ||
592 | |||
593 | static 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 | |||
603 | static const u16 NCT6106_REG_BEEP[NUM_REG_BEEP] = { | ||
604 | 0x3c0, 0x3c1, 0x3c2, 0x3c3, 0x3c4 }; | ||
605 | |||
606 | static 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 | |||
616 | static 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 | |||
619 | static 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 | |||
452 | static enum pwm_enable reg_to_pwm_enable(int pwm, int mode) | 622 | static 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 | ||
551 | struct nct6775_data { | 721 | struct 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 | ||
880 | struct 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 | |||
892 | struct 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) \ | ||
919 | static 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) \ | ||
925 | static struct sensor_device_template sensor_dev_template_##_name \ | ||
926 | = SENSOR_DEVICE_TEMPLATE_2(_template, _mode, _show, _store, \ | ||
927 | _nr, _index) | ||
928 | |||
929 | struct sensor_template_group { | ||
930 | struct sensor_device_template **templates; | ||
931 | umode_t (*is_visible)(struct kobject *, struct attribute *, int); | ||
932 | int base; | ||
933 | }; | ||
934 | |||
935 | static struct attribute_group * | ||
936 | nct6775_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 | |||
691 | static bool is_word_sized(struct nct6775_data *data, u16 reg) | 1012 | static 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 | ||
1233 | static SENSOR_DEVICE_ATTR_2(in0_input, S_IRUGO, show_in_reg, NULL, 0, 0); | 1571 | static ssize_t |
1234 | static SENSOR_DEVICE_ATTR_2(in1_input, S_IRUGO, show_in_reg, NULL, 1, 0); | 1572 | show_beep(struct device *dev, struct device_attribute *attr, char *buf) |
1235 | static SENSOR_DEVICE_ATTR_2(in2_input, S_IRUGO, show_in_reg, NULL, 2, 0); | 1573 | { |
1236 | static 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); |
1237 | static SENSOR_DEVICE_ATTR_2(in4_input, S_IRUGO, show_in_reg, NULL, 4, 0); | 1575 | struct nct6775_data *data = nct6775_update_device(dev); |
1238 | static SENSOR_DEVICE_ATTR_2(in5_input, S_IRUGO, show_in_reg, NULL, 5, 0); | 1576 | int nr = data->BEEP_BITS[sattr->index]; |
1239 | static SENSOR_DEVICE_ATTR_2(in6_input, S_IRUGO, show_in_reg, NULL, 6, 0); | 1577 | |
1240 | static SENSOR_DEVICE_ATTR_2(in7_input, S_IRUGO, show_in_reg, NULL, 7, 0); | 1578 | return sprintf(buf, "%u\n", |
1241 | static SENSOR_DEVICE_ATTR_2(in8_input, S_IRUGO, show_in_reg, NULL, 8, 0); | 1579 | (unsigned int)((data->beeps >> nr) & 0x01)); |
1242 | static SENSOR_DEVICE_ATTR_2(in9_input, S_IRUGO, show_in_reg, NULL, 9, 0); | 1580 | } |
1243 | static SENSOR_DEVICE_ATTR_2(in10_input, S_IRUGO, show_in_reg, NULL, 10, 0); | 1581 | |
1244 | static SENSOR_DEVICE_ATTR_2(in11_input, S_IRUGO, show_in_reg, NULL, 11, 0); | 1582 | static ssize_t |
1245 | static SENSOR_DEVICE_ATTR_2(in12_input, S_IRUGO, show_in_reg, NULL, 12, 0); | 1583 | store_beep(struct device *dev, struct device_attribute *attr, const char *buf, |
1246 | static SENSOR_DEVICE_ATTR_2(in13_input, S_IRUGO, show_in_reg, NULL, 13, 0); | 1584 | size_t count) |
1247 | static 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); | |
1249 | static SENSOR_DEVICE_ATTR(in0_alarm, S_IRUGO, show_alarm, NULL, 0); | 1587 | struct nct6775_data *data = dev_get_drvdata(dev); |
1250 | static SENSOR_DEVICE_ATTR(in1_alarm, S_IRUGO, show_alarm, NULL, 1); | 1588 | int nr = data->BEEP_BITS[sattr->index]; |
1251 | static SENSOR_DEVICE_ATTR(in2_alarm, S_IRUGO, show_alarm, NULL, 2); | 1589 | int regindex = nr >> 3; |
1252 | static SENSOR_DEVICE_ATTR(in3_alarm, S_IRUGO, show_alarm, NULL, 3); | 1590 | unsigned long val; |
1253 | static SENSOR_DEVICE_ATTR(in4_alarm, S_IRUGO, show_alarm, NULL, 4); | 1591 | |
1254 | static SENSOR_DEVICE_ATTR(in5_alarm, S_IRUGO, show_alarm, NULL, 5); | 1592 | int err = kstrtoul(buf, 10, &val); |
1255 | static SENSOR_DEVICE_ATTR(in6_alarm, S_IRUGO, show_alarm, NULL, 6); | 1593 | if (err < 0) |
1256 | static SENSOR_DEVICE_ATTR(in7_alarm, S_IRUGO, show_alarm, NULL, 7); | 1594 | return err; |
1257 | static SENSOR_DEVICE_ATTR(in8_alarm, S_IRUGO, show_alarm, NULL, 8); | 1595 | if (val > 1) |
1258 | static SENSOR_DEVICE_ATTR(in9_alarm, S_IRUGO, show_alarm, NULL, 9); | 1596 | return -EINVAL; |
1259 | static SENSOR_DEVICE_ATTR(in10_alarm, S_IRUGO, show_alarm, NULL, 10); | 1597 | |
1260 | static SENSOR_DEVICE_ATTR(in11_alarm, S_IRUGO, show_alarm, NULL, 11); | 1598 | mutex_lock(&data->update_lock); |
1261 | static SENSOR_DEVICE_ATTR(in12_alarm, S_IRUGO, show_alarm, NULL, 12); | 1599 | if (val) |
1262 | static SENSOR_DEVICE_ATTR(in13_alarm, S_IRUGO, show_alarm, NULL, 13); | 1600 | data->beeps |= (1ULL << nr); |
1263 | static SENSOR_DEVICE_ATTR(in14_alarm, S_IRUGO, show_alarm, NULL, 14); | 1601 | else |
1264 | 1602 | data->beeps &= ~(1ULL << nr); | |
1265 | static 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); |
1267 | static 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; |
1269 | static SENSOR_DEVICE_ATTR_2(in2_min, S_IWUSR | S_IRUGO, show_in_reg, | 1607 | } |
1270 | store_in_reg, 2, 1); | 1608 | |
1271 | static SENSOR_DEVICE_ATTR_2(in3_min, S_IWUSR | S_IRUGO, show_in_reg, | 1609 | static ssize_t |
1272 | store_in_reg, 3, 1); | 1610 | show_temp_beep(struct device *dev, struct device_attribute *attr, char *buf) |
1273 | static 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); |
1275 | static 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; |
1277 | static SENSOR_DEVICE_ATTR_2(in6_min, S_IWUSR | S_IRUGO, show_in_reg, | 1615 | int nr; |
1278 | store_in_reg, 6, 1); | 1616 | |
1279 | static 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 |
1281 | static 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. |
1283 | static 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); |
1285 | static 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]; |
1287 | static 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 | } |
1289 | static 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 | } |
1291 | static SENSOR_DEVICE_ATTR_2(in13_min, S_IWUSR | S_IRUGO, show_in_reg, | 1629 | |
1292 | store_in_reg, 13, 1); | 1630 | static ssize_t |
1293 | static SENSOR_DEVICE_ATTR_2(in14_min, S_IWUSR | S_IRUGO, show_in_reg, | 1631 | store_temp_beep(struct device *dev, struct device_attribute *attr, |
1294 | store_in_reg, 14, 1); | 1632 | const char *buf, size_t count) |
1295 | 1633 | { | |
1296 | static 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); |
1298 | static 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; |
1300 | static 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); |
1302 | static 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; |
1304 | static 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; |
1306 | static 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); |
1308 | static 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; |
1310 | static 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]; |
1312 | static SENSOR_DEVICE_ATTR_2(in8_max, S_IWUSR | S_IRUGO, show_in_reg, | 1650 | regindex = bit >> 3; |
1313 | store_in_reg, 8, 2); | 1651 | |
1314 | static 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) |
1316 | static 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 |
1318 | static 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], |
1320 | static 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); |
1322 | static SENSOR_DEVICE_ATTR_2(in13_max, S_IWUSR | S_IRUGO, show_in_reg, | 1660 | |
1323 | store_in_reg, 13, 2); | 1661 | return count; |
1324 | static SENSOR_DEVICE_ATTR_2(in14_max, S_IWUSR | S_IRUGO, show_in_reg, | 1662 | } |
1325 | store_in_reg, 14, 2); | 1663 | |
1326 | 1664 | static umode_t nct6775_in_is_visible(struct kobject *kobj, | |
1327 | static 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, | 1677 | SENSOR_TEMPLATE_2(in_input, "in%d_input", S_IRUGO, show_in_reg, NULL, 0, 0); |
1340 | NULL | 1678 | SENSOR_TEMPLATE(in_alarm, "in%d_alarm", S_IRUGO, show_alarm, NULL, 0); |
1341 | }, | 1679 | SENSOR_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, | 1681 | SENSOR_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, | 1683 | SENSOR_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, | 1691 | static 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 | ||
1435 | static const struct attribute_group nct6775_group_in[15] = { | 1700 | static 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 | ||
1453 | static ssize_t | 1705 | static 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 | ||
1611 | static struct sensor_device_attribute sda_fan_input[] = { | 1867 | static 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 | ||
1619 | static 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 | ||
1627 | static 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 | ||
1640 | static struct sensor_device_attribute sda_fan_pulses[] = { | 1890 | SENSOR_TEMPLATE(fan_input, "fan%d_input", S_IRUGO, show_fan, NULL, 0); |
1641 | SENSOR_ATTR(fan1_pulses, S_IWUSR | S_IRUGO, show_fan_pulses, | 1891 | SENSOR_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, | 1893 | SENSOR_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, | 1895 | SENSOR_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, | 1897 | SENSOR_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, | 1899 | SENSOR_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 | */ | ||
1906 | static 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 | ||
1653 | static struct sensor_device_attribute sda_fan_div[] = { | 1916 | static 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 | ||
1661 | static ssize_t | 1922 | static 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 | ||
1788 | static struct sensor_device_attribute_2 sda_temp_input[] = { | 2050 | static 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 | ||
1801 | static 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 | ||
1814 | static 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 | ||
1837 | static 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 | ||
1860 | static 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 | ||
1883 | static 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 | ||
1898 | static 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, | 2086 | SENSOR_TEMPLATE_2(temp_input, "temp%d_input", S_IRUGO, show_temp, NULL, 0, 0); |
1902 | store_temp_type, 1), | 2087 | SENSOR_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, | 2088 | SENSOR_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, | 2090 | SENSOR_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, | 2092 | SENSOR_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, | 2094 | SENSOR_TEMPLATE_2(temp_lcrit, "temp%d_lcrit", S_IRUGO | S_IWUSR, show_temp, |
1910 | store_temp_type, 5), | 2095 | store_temp, 0, 4); |
2096 | SENSOR_TEMPLATE(temp_offset, "temp%d_offset", S_IRUGO | S_IWUSR, | ||
2097 | show_temp_offset, store_temp_offset, 0); | ||
2098 | SENSOR_TEMPLATE(temp_type, "temp%d_type", S_IRUGO | S_IWUSR, show_temp_type, | ||
2099 | store_temp_type, 0); | ||
2100 | SENSOR_TEMPLATE(temp_alarm, "temp%d_alarm", S_IRUGO, show_temp_alarm, NULL, 0); | ||
2101 | SENSOR_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 | */ | ||
2109 | static 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 | ||
1913 | static struct sensor_device_attribute sda_temp_alarm[] = { | 2123 | static 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 | ||
1926 | static ssize_t | 2129 | static 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 | ||
2425 | static SENSOR_DEVICE_ATTR_2(pwm1, S_IWUSR | S_IRUGO, show_pwm, store_pwm, 0, 0); | 2628 | SENSOR_TEMPLATE_2(pwm, "pwm%d", S_IWUSR | S_IRUGO, show_pwm, store_pwm, 0, 0); |
2426 | static SENSOR_DEVICE_ATTR_2(pwm2, S_IWUSR | S_IRUGO, show_pwm, store_pwm, 1, 0); | 2629 | SENSOR_TEMPLATE(pwm_mode, "pwm%d_mode", S_IWUSR | S_IRUGO, show_pwm_mode, |
2427 | static SENSOR_DEVICE_ATTR_2(pwm3, S_IWUSR | S_IRUGO, show_pwm, store_pwm, 2, 0); | 2630 | store_pwm_mode, 0); |
2428 | static SENSOR_DEVICE_ATTR_2(pwm4, S_IWUSR | S_IRUGO, show_pwm, store_pwm, 3, 0); | 2631 | SENSOR_TEMPLATE(pwm_enable, "pwm%d_enable", S_IWUSR | S_IRUGO, show_pwm_enable, |
2429 | static SENSOR_DEVICE_ATTR_2(pwm5, S_IWUSR | S_IRUGO, show_pwm, store_pwm, 4, 0); | 2632 | store_pwm_enable, 0); |
2430 | 2633 | SENSOR_TEMPLATE(pwm_temp_sel, "pwm%d_temp_sel", S_IWUSR | S_IRUGO, | |
2431 | static 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); | 2635 | SENSOR_TEMPLATE(pwm_target_temp, "pwm%d_target_temp", S_IWUSR | S_IRUGO, |
2433 | static 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); | 2637 | SENSOR_TEMPLATE(fan_target, "fan%d_target", S_IWUSR | S_IRUGO, |
2435 | static 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); | 2639 | SENSOR_TEMPLATE(fan_tolerance, "fan%d_tolerance", S_IWUSR | S_IRUGO, |
2437 | static 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); | ||
2439 | static SENSOR_DEVICE_ATTR(pwm5_mode, S_IWUSR | S_IRUGO, show_pwm_mode, | ||
2440 | store_pwm_mode, 4); | ||
2441 | |||
2442 | static SENSOR_DEVICE_ATTR(pwm1_enable, S_IWUSR | S_IRUGO, show_pwm_enable, | ||
2443 | store_pwm_enable, 0); | ||
2444 | static SENSOR_DEVICE_ATTR(pwm2_enable, S_IWUSR | S_IRUGO, show_pwm_enable, | ||
2445 | store_pwm_enable, 1); | ||
2446 | static SENSOR_DEVICE_ATTR(pwm3_enable, S_IWUSR | S_IRUGO, show_pwm_enable, | ||
2447 | store_pwm_enable, 2); | ||
2448 | static SENSOR_DEVICE_ATTR(pwm4_enable, S_IWUSR | S_IRUGO, show_pwm_enable, | ||
2449 | store_pwm_enable, 3); | ||
2450 | static SENSOR_DEVICE_ATTR(pwm5_enable, S_IWUSR | S_IRUGO, show_pwm_enable, | ||
2451 | store_pwm_enable, 4); | ||
2452 | |||
2453 | static SENSOR_DEVICE_ATTR(pwm1_temp_sel, S_IWUSR | S_IRUGO, | ||
2454 | show_pwm_temp_sel, store_pwm_temp_sel, 0); | ||
2455 | static SENSOR_DEVICE_ATTR(pwm2_temp_sel, S_IWUSR | S_IRUGO, | ||
2456 | show_pwm_temp_sel, store_pwm_temp_sel, 1); | ||
2457 | static SENSOR_DEVICE_ATTR(pwm3_temp_sel, S_IWUSR | S_IRUGO, | ||
2458 | show_pwm_temp_sel, store_pwm_temp_sel, 2); | ||
2459 | static SENSOR_DEVICE_ATTR(pwm4_temp_sel, S_IWUSR | S_IRUGO, | ||
2460 | show_pwm_temp_sel, store_pwm_temp_sel, 3); | ||
2461 | static SENSOR_DEVICE_ATTR(pwm5_temp_sel, S_IWUSR | S_IRUGO, | ||
2462 | show_pwm_temp_sel, store_pwm_temp_sel, 4); | ||
2463 | |||
2464 | static SENSOR_DEVICE_ATTR(pwm1_target_temp, S_IWUSR | S_IRUGO, show_target_temp, | ||
2465 | store_target_temp, 0); | ||
2466 | static SENSOR_DEVICE_ATTR(pwm2_target_temp, S_IWUSR | S_IRUGO, show_target_temp, | ||
2467 | store_target_temp, 1); | ||
2468 | static SENSOR_DEVICE_ATTR(pwm3_target_temp, S_IWUSR | S_IRUGO, show_target_temp, | ||
2469 | store_target_temp, 2); | ||
2470 | static SENSOR_DEVICE_ATTR(pwm4_target_temp, S_IWUSR | S_IRUGO, show_target_temp, | ||
2471 | store_target_temp, 3); | ||
2472 | static SENSOR_DEVICE_ATTR(pwm5_target_temp, S_IWUSR | S_IRUGO, show_target_temp, | ||
2473 | store_target_temp, 4); | ||
2474 | |||
2475 | static SENSOR_DEVICE_ATTR(fan1_target, S_IWUSR | S_IRUGO, show_target_speed, | ||
2476 | store_target_speed, 0); | ||
2477 | static SENSOR_DEVICE_ATTR(fan2_target, S_IWUSR | S_IRUGO, show_target_speed, | ||
2478 | store_target_speed, 1); | ||
2479 | static SENSOR_DEVICE_ATTR(fan3_target, S_IWUSR | S_IRUGO, show_target_speed, | ||
2480 | store_target_speed, 2); | ||
2481 | static SENSOR_DEVICE_ATTR(fan4_target, S_IWUSR | S_IRUGO, show_target_speed, | ||
2482 | store_target_speed, 3); | ||
2483 | static SENSOR_DEVICE_ATTR(fan5_target, S_IWUSR | S_IRUGO, show_target_speed, | ||
2484 | store_target_speed, 4); | ||
2485 | |||
2486 | static SENSOR_DEVICE_ATTR(fan1_tolerance, S_IWUSR | S_IRUGO, | ||
2487 | show_speed_tolerance, store_speed_tolerance, 0); | ||
2488 | static SENSOR_DEVICE_ATTR(fan2_tolerance, S_IWUSR | S_IRUGO, | ||
2489 | show_speed_tolerance, store_speed_tolerance, 1); | ||
2490 | static SENSOR_DEVICE_ATTR(fan3_tolerance, S_IWUSR | S_IRUGO, | ||
2491 | show_speed_tolerance, store_speed_tolerance, 2); | ||
2492 | static SENSOR_DEVICE_ATTR(fan4_tolerance, S_IWUSR | S_IRUGO, | ||
2493 | show_speed_tolerance, store_speed_tolerance, 3); | ||
2494 | static 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 | ||
2534 | static SENSOR_DEVICE_ATTR(pwm1_weight_temp_sel, S_IWUSR | S_IRUGO, | 2679 | SENSOR_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); | 2681 | SENSOR_TEMPLATE_2(pwm_weight_temp_step, "pwm%d_weight_temp_step", |
2537 | static 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, | 2683 | SENSOR_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); |
2540 | static SENSOR_DEVICE_ATTR(pwm3_weight_temp_sel, S_IWUSR | S_IRUGO, | 2685 | SENSOR_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); | 2687 | SENSOR_TEMPLATE_2(pwm_weight_duty_step, "pwm%d_weight_duty_step", |
2543 | static 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, | 2689 | SENSOR_TEMPLATE_2(pwm_weight_duty_base, "pwm%d_weight_duty_base", |
2545 | 3); | 2690 | S_IWUSR | S_IRUGO, show_pwm, store_pwm, 0, 6); |
2546 | static 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 | |||
2550 | static SENSOR_DEVICE_ATTR_2(pwm1_weight_temp_step, S_IWUSR | S_IRUGO, | ||
2551 | show_weight_temp, store_weight_temp, 0, 0); | ||
2552 | static SENSOR_DEVICE_ATTR_2(pwm2_weight_temp_step, S_IWUSR | S_IRUGO, | ||
2553 | show_weight_temp, store_weight_temp, 1, 0); | ||
2554 | static SENSOR_DEVICE_ATTR_2(pwm3_weight_temp_step, S_IWUSR | S_IRUGO, | ||
2555 | show_weight_temp, store_weight_temp, 2, 0); | ||
2556 | static SENSOR_DEVICE_ATTR_2(pwm4_weight_temp_step, S_IWUSR | S_IRUGO, | ||
2557 | show_weight_temp, store_weight_temp, 3, 0); | ||
2558 | static SENSOR_DEVICE_ATTR_2(pwm5_weight_temp_step, S_IWUSR | S_IRUGO, | ||
2559 | show_weight_temp, store_weight_temp, 4, 0); | ||
2560 | |||
2561 | static SENSOR_DEVICE_ATTR_2(pwm1_weight_temp_step_tol, S_IWUSR | S_IRUGO, | ||
2562 | show_weight_temp, store_weight_temp, 0, 1); | ||
2563 | static SENSOR_DEVICE_ATTR_2(pwm2_weight_temp_step_tol, S_IWUSR | S_IRUGO, | ||
2564 | show_weight_temp, store_weight_temp, 1, 1); | ||
2565 | static SENSOR_DEVICE_ATTR_2(pwm3_weight_temp_step_tol, S_IWUSR | S_IRUGO, | ||
2566 | show_weight_temp, store_weight_temp, 2, 1); | ||
2567 | static SENSOR_DEVICE_ATTR_2(pwm4_weight_temp_step_tol, S_IWUSR | S_IRUGO, | ||
2568 | show_weight_temp, store_weight_temp, 3, 1); | ||
2569 | static SENSOR_DEVICE_ATTR_2(pwm5_weight_temp_step_tol, S_IWUSR | S_IRUGO, | ||
2570 | show_weight_temp, store_weight_temp, 4, 1); | ||
2571 | |||
2572 | static SENSOR_DEVICE_ATTR_2(pwm1_weight_temp_step_base, S_IWUSR | S_IRUGO, | ||
2573 | show_weight_temp, store_weight_temp, 0, 2); | ||
2574 | static SENSOR_DEVICE_ATTR_2(pwm2_weight_temp_step_base, S_IWUSR | S_IRUGO, | ||
2575 | show_weight_temp, store_weight_temp, 1, 2); | ||
2576 | static SENSOR_DEVICE_ATTR_2(pwm3_weight_temp_step_base, S_IWUSR | S_IRUGO, | ||
2577 | show_weight_temp, store_weight_temp, 2, 2); | ||
2578 | static SENSOR_DEVICE_ATTR_2(pwm4_weight_temp_step_base, S_IWUSR | S_IRUGO, | ||
2579 | show_weight_temp, store_weight_temp, 3, 2); | ||
2580 | static SENSOR_DEVICE_ATTR_2(pwm5_weight_temp_step_base, S_IWUSR | S_IRUGO, | ||
2581 | show_weight_temp, store_weight_temp, 4, 2); | ||
2582 | |||
2583 | static SENSOR_DEVICE_ATTR_2(pwm1_weight_duty_step, S_IWUSR | S_IRUGO, | ||
2584 | show_pwm, store_pwm, 0, 5); | ||
2585 | static SENSOR_DEVICE_ATTR_2(pwm2_weight_duty_step, S_IWUSR | S_IRUGO, | ||
2586 | show_pwm, store_pwm, 1, 5); | ||
2587 | static SENSOR_DEVICE_ATTR_2(pwm3_weight_duty_step, S_IWUSR | S_IRUGO, | ||
2588 | show_pwm, store_pwm, 2, 5); | ||
2589 | static SENSOR_DEVICE_ATTR_2(pwm4_weight_duty_step, S_IWUSR | S_IRUGO, | ||
2590 | show_pwm, store_pwm, 3, 5); | ||
2591 | static 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 */ | ||
2595 | static 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 | ||
2608 | static ssize_t | 2692 | static ssize_t |
2609 | show_fan_time(struct device *dev, struct device_attribute *attr, char *buf) | 2693 | show_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 | ||
2652 | static DEVICE_ATTR(name, S_IRUGO, show_name, NULL); | 2736 | static DEVICE_ATTR(name, S_IRUGO, show_name, NULL); |
2653 | 2737 | ||
2654 | static SENSOR_DEVICE_ATTR_2(pwm1_stop_time, S_IWUSR | S_IRUGO, show_fan_time, | ||
2655 | store_fan_time, 0, 0); | ||
2656 | static SENSOR_DEVICE_ATTR_2(pwm2_stop_time, S_IWUSR | S_IRUGO, show_fan_time, | ||
2657 | store_fan_time, 1, 0); | ||
2658 | static SENSOR_DEVICE_ATTR_2(pwm3_stop_time, S_IWUSR | S_IRUGO, show_fan_time, | ||
2659 | store_fan_time, 2, 0); | ||
2660 | static SENSOR_DEVICE_ATTR_2(pwm4_stop_time, S_IWUSR | S_IRUGO, show_fan_time, | ||
2661 | store_fan_time, 3, 0); | ||
2662 | static SENSOR_DEVICE_ATTR_2(pwm5_stop_time, S_IWUSR | S_IRUGO, show_fan_time, | ||
2663 | store_fan_time, 4, 0); | ||
2664 | |||
2665 | static SENSOR_DEVICE_ATTR_2(pwm1_step_up_time, S_IWUSR | S_IRUGO, show_fan_time, | ||
2666 | store_fan_time, 0, 1); | ||
2667 | static SENSOR_DEVICE_ATTR_2(pwm2_step_up_time, S_IWUSR | S_IRUGO, show_fan_time, | ||
2668 | store_fan_time, 1, 1); | ||
2669 | static SENSOR_DEVICE_ATTR_2(pwm3_step_up_time, S_IWUSR | S_IRUGO, show_fan_time, | ||
2670 | store_fan_time, 2, 1); | ||
2671 | static SENSOR_DEVICE_ATTR_2(pwm4_step_up_time, S_IWUSR | S_IRUGO, show_fan_time, | ||
2672 | store_fan_time, 3, 1); | ||
2673 | static SENSOR_DEVICE_ATTR_2(pwm5_step_up_time, S_IWUSR | S_IRUGO, show_fan_time, | ||
2674 | store_fan_time, 4, 1); | ||
2675 | |||
2676 | static SENSOR_DEVICE_ATTR_2(pwm1_step_down_time, S_IWUSR | S_IRUGO, | ||
2677 | show_fan_time, store_fan_time, 0, 2); | ||
2678 | static SENSOR_DEVICE_ATTR_2(pwm2_step_down_time, S_IWUSR | S_IRUGO, | ||
2679 | show_fan_time, store_fan_time, 1, 2); | ||
2680 | static SENSOR_DEVICE_ATTR_2(pwm3_step_down_time, S_IWUSR | S_IRUGO, | ||
2681 | show_fan_time, store_fan_time, 2, 2); | ||
2682 | static SENSOR_DEVICE_ATTR_2(pwm4_step_down_time, S_IWUSR | S_IRUGO, | ||
2683 | show_fan_time, store_fan_time, 3, 2); | ||
2684 | static SENSOR_DEVICE_ATTR_2(pwm5_step_down_time, S_IWUSR | S_IRUGO, | ||
2685 | show_fan_time, store_fan_time, 4, 2); | ||
2686 | |||
2687 | static SENSOR_DEVICE_ATTR_2(pwm1_start, S_IWUSR | S_IRUGO, show_pwm, | ||
2688 | store_pwm, 0, 1); | ||
2689 | static SENSOR_DEVICE_ATTR_2(pwm2_start, S_IWUSR | S_IRUGO, show_pwm, | ||
2690 | store_pwm, 1, 1); | ||
2691 | static SENSOR_DEVICE_ATTR_2(pwm3_start, S_IWUSR | S_IRUGO, show_pwm, | ||
2692 | store_pwm, 2, 1); | ||
2693 | static SENSOR_DEVICE_ATTR_2(pwm4_start, S_IWUSR | S_IRUGO, show_pwm, | ||
2694 | store_pwm, 3, 1); | ||
2695 | static SENSOR_DEVICE_ATTR_2(pwm5_start, S_IWUSR | S_IRUGO, show_pwm, | ||
2696 | store_pwm, 4, 1); | ||
2697 | |||
2698 | static SENSOR_DEVICE_ATTR_2(pwm1_floor, S_IWUSR | S_IRUGO, show_pwm, | ||
2699 | store_pwm, 0, 2); | ||
2700 | static SENSOR_DEVICE_ATTR_2(pwm2_floor, S_IWUSR | S_IRUGO, show_pwm, | ||
2701 | store_pwm, 1, 2); | ||
2702 | static SENSOR_DEVICE_ATTR_2(pwm3_floor, S_IWUSR | S_IRUGO, show_pwm, | ||
2703 | store_pwm, 2, 2); | ||
2704 | static SENSOR_DEVICE_ATTR_2(pwm4_floor, S_IWUSR | S_IRUGO, show_pwm, | ||
2705 | store_pwm, 3, 2); | ||
2706 | static SENSOR_DEVICE_ATTR_2(pwm5_floor, S_IWUSR | S_IRUGO, show_pwm, | ||
2707 | store_pwm, 4, 2); | ||
2708 | |||
2709 | static SENSOR_DEVICE_ATTR_2(pwm1_temp_tolerance, S_IWUSR | S_IRUGO, | ||
2710 | show_temp_tolerance, store_temp_tolerance, 0, 0); | ||
2711 | static SENSOR_DEVICE_ATTR_2(pwm2_temp_tolerance, S_IWUSR | S_IRUGO, | ||
2712 | show_temp_tolerance, store_temp_tolerance, 1, 0); | ||
2713 | static SENSOR_DEVICE_ATTR_2(pwm3_temp_tolerance, S_IWUSR | S_IRUGO, | ||
2714 | show_temp_tolerance, store_temp_tolerance, 2, 0); | ||
2715 | static SENSOR_DEVICE_ATTR_2(pwm4_temp_tolerance, S_IWUSR | S_IRUGO, | ||
2716 | show_temp_tolerance, store_temp_tolerance, 3, 0); | ||
2717 | static SENSOR_DEVICE_ATTR_2(pwm5_temp_tolerance, S_IWUSR | S_IRUGO, | ||
2718 | show_temp_tolerance, store_temp_tolerance, 4, 0); | ||
2719 | |||
2720 | static SENSOR_DEVICE_ATTR_2(pwm1_crit_temp_tolerance, S_IWUSR | S_IRUGO, | ||
2721 | show_temp_tolerance, store_temp_tolerance, 0, 1); | ||
2722 | static SENSOR_DEVICE_ATTR_2(pwm2_crit_temp_tolerance, S_IWUSR | S_IRUGO, | ||
2723 | show_temp_tolerance, store_temp_tolerance, 1, 1); | ||
2724 | static SENSOR_DEVICE_ATTR_2(pwm3_crit_temp_tolerance, S_IWUSR | S_IRUGO, | ||
2725 | show_temp_tolerance, store_temp_tolerance, 2, 1); | ||
2726 | static SENSOR_DEVICE_ATTR_2(pwm4_crit_temp_tolerance, S_IWUSR | S_IRUGO, | ||
2727 | show_temp_tolerance, store_temp_tolerance, 3, 1); | ||
2728 | static 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 */ | ||
2732 | static 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 */ | ||
2746 | static 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 | |||
2754 | static 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 | |||
2867 | static 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 | |||
2875 | static ssize_t | 2738 | static ssize_t |
2876 | show_auto_pwm(struct device *dev, struct device_attribute *attr, char *buf) | 2739 | show_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 | ||
2860 | static 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 | |||
2887 | SENSOR_TEMPLATE_2(pwm_stop_time, "pwm%d_stop_time", S_IWUSR | S_IRUGO, | ||
2888 | show_fan_time, store_fan_time, 0, 0); | ||
2889 | SENSOR_TEMPLATE_2(pwm_step_up_time, "pwm%d_step_up_time", S_IWUSR | S_IRUGO, | ||
2890 | show_fan_time, store_fan_time, 0, 1); | ||
2891 | SENSOR_TEMPLATE_2(pwm_step_down_time, "pwm%d_step_down_time", S_IWUSR | S_IRUGO, | ||
2892 | show_fan_time, store_fan_time, 0, 2); | ||
2893 | SENSOR_TEMPLATE_2(pwm_start, "pwm%d_start", S_IWUSR | S_IRUGO, show_pwm, | ||
2894 | store_pwm, 0, 1); | ||
2895 | SENSOR_TEMPLATE_2(pwm_floor, "pwm%d_floor", S_IWUSR | S_IRUGO, show_pwm, | ||
2896 | store_pwm, 0, 2); | ||
2897 | SENSOR_TEMPLATE_2(pwm_temp_tolerance, "pwm%d_temp_tolerance", S_IWUSR | S_IRUGO, | ||
2898 | show_temp_tolerance, store_temp_tolerance, 0, 0); | ||
2899 | SENSOR_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 | |||
2903 | SENSOR_TEMPLATE_2(pwm_max, "pwm%d_max", S_IWUSR | S_IRUGO, show_pwm, store_pwm, | ||
2904 | 0, 3); | ||
2905 | |||
2906 | SENSOR_TEMPLATE_2(pwm_step, "pwm%d_step", S_IWUSR | S_IRUGO, show_pwm, | ||
2907 | store_pwm, 0, 4); | ||
2908 | |||
2909 | SENSOR_TEMPLATE_2(pwm_auto_point1_pwm, "pwm%d_auto_point1_pwm", | ||
2910 | S_IWUSR | S_IRUGO, show_auto_pwm, store_auto_pwm, 0, 0); | ||
2911 | SENSOR_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 | |||
2914 | SENSOR_TEMPLATE_2(pwm_auto_point2_pwm, "pwm%d_auto_point2_pwm", | ||
2915 | S_IWUSR | S_IRUGO, show_auto_pwm, store_auto_pwm, 0, 1); | ||
2916 | SENSOR_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 | |||
2919 | SENSOR_TEMPLATE_2(pwm_auto_point3_pwm, "pwm%d_auto_point3_pwm", | ||
2920 | S_IWUSR | S_IRUGO, show_auto_pwm, store_auto_pwm, 0, 2); | ||
2921 | SENSOR_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 | |||
2924 | SENSOR_TEMPLATE_2(pwm_auto_point4_pwm, "pwm%d_auto_point4_pwm", | ||
2925 | S_IWUSR | S_IRUGO, show_auto_pwm, store_auto_pwm, 0, 3); | ||
2926 | SENSOR_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 | |||
2929 | SENSOR_TEMPLATE_2(pwm_auto_point5_pwm, "pwm%d_auto_point5_pwm", | ||
2930 | S_IWUSR | S_IRUGO, show_auto_pwm, store_auto_pwm, 0, 4); | ||
2931 | SENSOR_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 | |||
2934 | SENSOR_TEMPLATE_2(pwm_auto_point6_pwm, "pwm%d_auto_point6_pwm", | ||
2935 | S_IWUSR | S_IRUGO, show_auto_pwm, store_auto_pwm, 0, 5); | ||
2936 | SENSOR_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 | |||
2939 | SENSOR_TEMPLATE_2(pwm_auto_point7_pwm, "pwm%d_auto_point7_pwm", | ||
2940 | S_IWUSR | S_IRUGO, show_auto_pwm, store_auto_pwm, 0, 6); | ||
2941 | SENSOR_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 | */ |
2999 | static struct sensor_device_attribute_2 sda_auto_pwm_arrays[] = { | 2949 | static 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), | 2990 | static 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 | ||
3146 | static ssize_t | 2996 | static 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 */ |
3193 | error: | 3042 | error: |
@@ -3195,71 +3044,79 @@ error: | |||
3195 | return count; | 3044 | return count; |
3196 | } | 3045 | } |
3197 | 3046 | ||
3198 | static struct sensor_device_attribute sda_caseopen[] = { | 3047 | static 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), | 3049 | static 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), | 3051 | static SENSOR_DEVICE_ATTR(intrusion0_beep, S_IWUSR | S_IRUGO, show_beep, |
3203 | }; | 3052 | store_beep, INTRUSION_ALARM_BASE); |
3204 | 3053 | static SENSOR_DEVICE_ATTR(intrusion1_beep, S_IWUSR | S_IRUGO, show_beep, | |
3205 | /* | 3054 | store_beep, INTRUSION_ALARM_BASE + 1); |
3206 | * Driver and device management | 3055 | static SENSOR_DEVICE_ATTR(beep_enable, S_IWUSR | S_IRUGO, show_beep, |
3207 | */ | 3056 | store_beep, BEEP_ENABLE_BASE); |
3208 | 3057 | ||
3209 | static void nct6775_device_remove_files(struct device *dev) | 3058 | static 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 | */ | ||
3085 | static 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++) | 3097 | static 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++) { | 3106 | static 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 | ||
3307 | static int | 3165 | static void |
3308 | nct6775_check_fan_inputs(const struct nct6775_sio_data *sio_data, | 3166 | nct6775_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 | ||
3389 | static void add_temp_sensors(struct nct6775_data *data, const u16 *regp, | 3259 | static 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, | |||
3415 | static int nct6775_probe(struct platform_device *pdev) | 3285 | static 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) | |||
3988 | static int nct6775_suspend(struct device *dev) | 3931 | static 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) | |||
4004 | static int nct6775_resume(struct device *dev) | 3946 | static 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) | |||
4056 | static const struct dev_pm_ops nct6775_dev_pm_ops = { | 3997 | static 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 | ||
4076 | static const char * const nct6775_sio_names[] __initconst = { | 4019 | static 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 */ |
4083 | static int __init nct6775_find(int sioaddr, unsigned short *addr, | 4028 | static 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 | */ |
4147 | static struct platform_device *pdev; | 4107 | static struct platform_device *pdev[2]; |
4148 | 4108 | ||
4149 | static int __init sensors_nct6775_init(void) | 4109 | static 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 | ||
4210 | exit_device_put: | 4176 | exit_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 | } | ||
4212 | exit_unregister: | 4181 | exit_unregister: |
4213 | platform_driver_unregister(&nct6775_driver); | 4182 | platform_driver_unregister(&nct6775_driver); |
4214 | exit: | ||
4215 | return err; | 4183 | return err; |
4216 | } | 4184 | } |
4217 | 4185 | ||
4218 | static void __exit sensors_nct6775_exit(void) | 4186 | static 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 | ||
984 | static void pc87427_init_device(struct device *dev) | 984 | static 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 | ||
1076 | static int pc87427_probe(struct platform_device *pdev) | 1076 | static 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 | */ |
275 | static int s3c_hwmon_probe(struct platform_device *dev) | 275 | static 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) | |||
668 | static int __init smsc47m1_probe(struct platform_device *pdev) | 668 | static 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: | |||
940 | static void __exit sm_smsc47m1_exit(void) | 940 | static 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) | |||
673 | static void w83627ehf_write_fan_div_common(struct device *dev, | 673 | static 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) | |||
724 | static void w83627ehf_update_fan_div_common(struct device *dev, | 724 | static 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) | |||
781 | static void w83627ehf_update_pwm_common(struct device *dev, | 781 | static 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, | |||
792 | static struct w83627ehf_data *w83627ehf_update_device(struct device *dev) | 792 | static 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, | |||
2065 | static int w83627ehf_probe(struct platform_device *pdev) | 2065 | static 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) | |||
2618 | static int w83627ehf_suspend(struct device *dev) | 2618 | static 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) | |||
2634 | static int w83627ehf_resume(struct device *dev) | 2634 | static 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) | |||
2694 | static const struct dev_pm_ops w83627ehf_dev_pm_ops = { | 2694 | static 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 = { | |||
1415 | static int w83627hf_probe(struct platform_device *pdev) | 1415 | static 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 | ||
1637 | static int w83627thf_read_gpio5(struct platform_device *pdev) | 1637 | static 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 | ||
1670 | static int w83687thf_read_vid(struct platform_device *pdev) | 1670 | static 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); |