Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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 to support GMT G762/G763 pwm fan controllers
- add support for DS1631, DS1721, and DS1731 to ds1621 driver
- remove detect function from ds1621 driver as unreliable
- bug fixes in nct6775, iio_hwmon, and adm1021 drivers
- remove redundant platform_set_drvdata in various drivers
- add device tree support to ina2xx driver

* tag 'hwmon-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging:
hwmon: (ds1621) Fix temperature rounding operations
hwmon: (nct6775) Drop unsupported fan alarm attributes for NCT6775
hwmon: (nct6775) Fix temperature alarm attributes
Add support for GMT G762/G763 PWM fan controllers
hwmon: (ina2xx) Add device tree support to pass the shunt resistor
hwmon: (ds1621) Update documentation
hwmon: (ds1621) Add DS1731 chip support to ds1621 driver
hwmon: (iio_hwmon) add alias table
hwmon: (adm1021) Do not create min sysfs attributes for LM84
hwmon: (ds1621) Remove detect function
hwmon: (ds1621) Add ds1631 chip support to ds1621 driver and documentation
hwmon: (ds1621) Add ds1721 update interval sysfs attribute
hwmon: (ds1621) Add ds1721 chip support
hwmon: (w83627ehf) Remove redundant platform_set_drvdata()
hwmon: (ntc_thermistor) Remove redundant platform_set_drvdata()
hwmon: (i5k_amb) Remove redundant platform_set_drvdata()
hwmon: (coretemp) Remove redundant platform_set_drvdata()
hwmon: (abituguru3) Remove redundant platform_set_drvdata()

+1743 -111
+47
Documentation/devicetree/bindings/hwmon/g762.txt
··· 1 + GMT G762/G763 PWM Fan controller 2 + 3 + Required node properties: 4 + 5 + - "compatible": must be either "gmt,g762" or "gmt,g763" 6 + - "reg": I2C bus address of the device 7 + - "clocks": a fixed clock providing input clock frequency 8 + on CLK pin of the chip. 9 + 10 + Optional properties: 11 + 12 + - "fan_startv": fan startup voltage. Accepted values are 0, 1, 2 and 3. 13 + The higher the more. 14 + 15 + - "pwm_polarity": pwm polarity. Accepted values are 0 (positive duty) 16 + and 1 (negative duty). 17 + 18 + - "fan_gear_mode": fan gear mode. Supported values are 0, 1 and 2. 19 + 20 + If an optional property is not set in .dts file, then current value is kept 21 + unmodified (e.g. u-boot installed value). 22 + 23 + Additional information on operational parameters for the device is available 24 + in Documentation/hwmon/g762. A detailed datasheet for the device is available 25 + at http://natisbad.org/NAS/refs/GMT_EDS-762_763-080710-0.2.pdf. 26 + 27 + Example g762 node: 28 + 29 + clocks { 30 + #address-cells = <1>; 31 + #size-cells = <0>; 32 + 33 + g762_clk: fixedclk { 34 + compatible = "fixed-clock"; 35 + #clock-cells = <0>; 36 + clock-frequency = <8192>; 37 + } 38 + } 39 + 40 + g762: g762@3e { 41 + compatible = "gmt,g762"; 42 + reg = <0x3e>; 43 + clocks = <&g762_clk> 44 + fan_gear_mode = <0>; /* chip default */ 45 + fan_startv = <1>; /* chip default */ 46 + pwm_polarity = <0>; /* chip default */ 47 + };
+22
Documentation/devicetree/bindings/i2c/ina2xx.txt
··· 1 + ina2xx properties 2 + 3 + Required properties: 4 + - compatible: Must be one of the following: 5 + - "ti,ina219" for ina219 6 + - "ti,ina220" for ina220 7 + - "ti,ina226" for ina226 8 + - "ti,ina230" for ina230 9 + - reg: I2C address 10 + 11 + Optional properties: 12 + 13 + - shunt-resistor 14 + Shunt resistor value in micro-Ohm 15 + 16 + Example: 17 + 18 + ina220@44 { 19 + compatible = "ti,ina220"; 20 + reg = <0x44>; 21 + shunt-resistor = <1000>; 22 + };
+134 -10
Documentation/hwmon/ds1621
··· 2 2 ==================== 3 3 4 4 Supported chips: 5 - * Dallas Semiconductor DS1621 5 + * Dallas Semiconductor / Maxim Integrated DS1621 6 6 Prefix: 'ds1621' 7 - Addresses scanned: I2C 0x48 - 0x4f 8 - Datasheet: Publicly available at the Dallas Semiconductor website 9 - http://www.dalsemi.com/ 7 + Addresses scanned: none 8 + Datasheet: Publicly available from www.maximintegrated.com 9 + 10 10 * Dallas Semiconductor DS1625 11 - Prefix: 'ds1621' 12 - Addresses scanned: I2C 0x48 - 0x4f 13 - Datasheet: Publicly available at the Dallas Semiconductor website 14 - http://www.dalsemi.com/ 11 + Prefix: 'ds1625' 12 + Addresses scanned: none 13 + Datasheet: Publicly available from www.datasheetarchive.com 14 + 15 + * Maxim Integrated DS1631 16 + Prefix: 'ds1631' 17 + Addresses scanned: none 18 + Datasheet: Publicly available from www.maximintegrated.com 19 + 20 + * Maxim Integrated DS1721 21 + Prefix: 'ds1721' 22 + Addresses scanned: none 23 + Datasheet: Publicly available from www.maximintegrated.com 24 + 25 + * Maxim Integrated DS1731 26 + Prefix: 'ds1731' 27 + Addresses scanned: none 28 + Datasheet: Publicly available from www.maximintegrated.com 15 29 16 30 Authors: 17 31 Christian W. Zuckschwerdt <zany@triq.net> ··· 73 59 reset. Be aware: When testing, it showed that the status of Tout can change 74 60 with neither of the alarms set. 75 61 76 - Temperature conversion of the DS1621 takes up to 1000ms; internal access to 77 - non-volatile registers may last for 10ms or below. 62 + Since there is no version or vendor identification register, there is 63 + no unique identification for these devices. Therefore, explicit device 64 + instantiation is required for correct device identification and functionality 65 + (one device per address in this address range: 0x48..0x4f). 66 + 67 + The DS1625 is pin compatible and functionally equivalent with the DS1621, 68 + but the DS1621 is meant to replace it. The DS1631, DS1721, and DS1731 are 69 + also pin compatible with the DS1621 and provide multi-resolution support. 70 + 71 + Additionally, the DS1721 data sheet says the temperature flags (THF and TLF) 72 + are used internally, however, these flags do get set and cleared as the actual 73 + temperature crosses the min or max settings (which by default are set to 75 74 + and 80 degrees respectively). 75 + 76 + Temperature Conversion: 77 + ----------------------- 78 + DS1621 - 750ms (older devices may take up to 1000ms) 79 + DS1625 - 500ms 80 + DS1631 - 93ms..750ms for 9..12 bits resolution, respectively. 81 + DS1721 - 93ms..750ms for 9..12 bits resolution, respectively. 82 + DS1731 - 93ms..750ms for 9..12 bits resolution, respectively. 83 + 84 + Note: 85 + On the DS1621, internal access to non-volatile registers may last for 10ms 86 + or less (unverified on the other devices). 87 + 88 + Temperature Accuracy: 89 + --------------------- 90 + DS1621: +/- 0.5 degree Celsius (from 0 to +70 degrees) 91 + DS1625: +/- 0.5 degree Celsius (from 0 to +70 degrees) 92 + DS1631: +/- 0.5 degree Celsius (from 0 to +70 degrees) 93 + DS1721: +/- 1.0 degree Celsius (from -10 to +85 degrees) 94 + DS1731: +/- 1.0 degree Celsius (from -10 to +85 degrees) 95 + 96 + Note: 97 + Please refer to the device datasheets for accuracy at other temperatures. 98 + 99 + Temperature Resolution: 100 + ----------------------- 101 + As mentioned above, the DS1631, DS1721, and DS1731 provide multi-resolution 102 + support, which is achieved via the R0 and R1 config register bits, where: 103 + 104 + R0..R1 105 + ------ 106 + 0 0 => 9 bits, 0.5 degrees Celcius 107 + 1 0 => 10 bits, 0.25 degrees Celcius 108 + 0 1 => 11 bits, 0.125 degrees Celcius 109 + 1 1 => 12 bits, 0.0625 degrees Celcius 110 + 111 + Note: 112 + At initial device power-on, the default resolution is set to 12-bits. 113 + 114 + The resolution mode for the DS1631, DS1721, or DS1731 can be changed from 115 + userspace, via the device 'update_interval' sysfs attribute. This attribute 116 + will normalize the range of input values to the device maximum resolution 117 + values defined in the datasheet as follows: 118 + 119 + Resolution Conversion Time Input Range 120 + (C/LSB) (msec) (msec) 121 + ------------------------------------------------ 122 + 0.5 93.75 0....94 123 + 0.25 187.5 95...187 124 + 0.125 375 188..375 125 + 0.0625 750 376..infinity 126 + ------------------------------------------------ 127 + 128 + The following examples show how the 'update_interval' attribute can be 129 + used to change the conversion time: 130 + 131 + $ cat update_interval 132 + 750 133 + $ cat temp1_input 134 + 22062 135 + $ 136 + $ echo 300 > update_interval 137 + $ cat update_interval 138 + 375 139 + $ cat temp1_input 140 + 22125 141 + $ 142 + $ echo 150 > update_interval 143 + $ cat update_interval 144 + 188 145 + $ cat temp1_input 146 + 22250 147 + $ 148 + $ echo 1 > update_interval 149 + $ cat update_interval 150 + 94 151 + $ cat temp1_input 152 + 22000 153 + $ 154 + $ echo 1000 > update_interval 155 + $ cat update_interval 156 + 750 157 + $ cat temp1_input 158 + 22062 159 + $ 160 + 161 + As shown, the ds1621 driver automatically adjusts the 'update_interval' 162 + user input, via a step function. Reading back the 'update_interval' value 163 + after a write operation provides the conversion time used by the device. 164 + 165 + Mathematically, the resolution can be derived from the conversion time 166 + via the following function: 167 + 168 + g(x) = 0.5 * [minimum_conversion_time/x] 169 + 170 + where: 171 + -> 'x' = the output from 'update_interval' 172 + -> 'g(x)' = the resolution in degrees C per LSB. 173 + -> 93.75ms = minimum conversion time
+65
Documentation/hwmon/g762
··· 1 + Kernel driver g762 2 + ================== 3 + 4 + The GMT G762 Fan Speed PWM Controller is connected directly to a fan 5 + and performs closed-loop or open-loop control of the fan speed. Two 6 + modes - PWM or DC - are supported by the device. 7 + 8 + For additional information, a detailed datasheet is available at 9 + http://natisbad.org/NAS/ref/GMT_EDS-762_763-080710-0.2.pdf. sysfs 10 + bindings are described in Documentation/hwmon/sysfs-interface. 11 + 12 + The following entries are available to the user in a subdirectory of 13 + /sys/bus/i2c/drivers/g762/ to control the operation of the device. 14 + This can be done manually using the following entries but is usually 15 + done via a userland daemon like fancontrol. 16 + 17 + Note that those entries do not provide ways to setup the specific 18 + hardware characteristics of the system (reference clock, pulses per 19 + fan revolution, ...); Those can be modified via devicetree bindings 20 + documented in Documentation/devicetree/bindings/hwmon/g762.txt or 21 + using a specific platform_data structure in board initialization 22 + file (see include/linux/platform_data/g762.h). 23 + 24 + fan1_target: set desired fan speed. This only makes sense in closed-loop 25 + fan speed control (i.e. when pwm1_enable is set to 2). 26 + 27 + fan1_input: provide current fan rotation value in RPM as reported by 28 + the fan to the device. 29 + 30 + fan1_div: fan clock divisor. Supported value are 1, 2, 4 and 8. 31 + 32 + fan1_pulses: number of pulses per fan revolution. Supported values 33 + are 2 and 4. 34 + 35 + fan1_fault: reports fan failure, i.e. no transition on fan gear pin for 36 + about 0.7s (if the fan is not voluntarily set off). 37 + 38 + fan1_alarm: in closed-loop control mode, if fan RPM value is 25% out 39 + of the programmed value for over 6 seconds 'fan1_alarm' is 40 + set to 1. 41 + 42 + pwm1_enable: set current fan speed control mode i.e. 1 for manual fan 43 + speed control (open-loop) via pwm1 described below, 2 for 44 + automatic fan speed control (closed-loop) via fan1_target 45 + above. 46 + 47 + pwm1_mode: set or get fan driving mode: 1 for PWM mode, 0 for DC mode. 48 + 49 + pwm1: get or set PWM fan control value in open-loop mode. This is an 50 + integer value between 0 and 255. 0 stops the fan, 255 makes 51 + it run at full speed. 52 + 53 + Both in PWM mode ('pwm1_mode' set to 1) and DC mode ('pwm1_mode' set to 0), 54 + when current fan speed control mode is open-loop ('pwm1_enable' set to 1), 55 + the fan speed is programmed by setting a value between 0 and 255 via 'pwm1' 56 + entry (0 stops the fan, 255 makes it run at full speed). In closed-loop mode 57 + ('pwm1_enable' set to 2), the expected rotation speed in RPM can be passed to 58 + the chip via 'fan1_target'. In closed-loop mode, the target speed is compared 59 + with current speed (available via 'fan1_input') by the device and a feedback 60 + is performed to match that target value. The fan speed value is computed 61 + based on the parameters associated with the physical characteristics of the 62 + system: a reference clock source frequency, a number of pulses per fan 63 + revolution, etc. 64 + 65 + Note that the driver will update its values at most once per second.
+3 -1
Documentation/hwmon/ina2xx
··· 44 44 The INA230 is a high or low side current shunt and power monitor with an I2C 45 45 interface. The INA230 monitors both a shunt voltage drop and bus supply voltage. 46 46 47 - The shunt value in micro-ohms can be set via platform data. 47 + The shunt value in micro-ohms can be set via platform data or device tree. 48 + Please refer to the Documentation/devicetree/bindings/i2c/ina2xx.txt for bindings 49 + if the device tree is used.
+18 -3
drivers/hwmon/Kconfig
··· 348 348 will be called ds620. 349 349 350 350 config SENSORS_DS1621 351 - tristate "Dallas Semiconductor DS1621 and DS1625" 351 + tristate "Dallas Semiconductor DS1621 and compatibles" 352 352 depends on I2C 353 353 help 354 - If you say yes here you get support for Dallas Semiconductor 355 - DS1621 and DS1625 sensor chips. 354 + If you say yes here you get support for Dallas Semiconductor/Maxim 355 + Integrated DS1621 sensor chips and compatible models including: 356 + 357 + - Dallas Semiconductor DS1625 358 + - Maxim Integrated DS1631 359 + - Maxim Integrated DS1721 360 + - Maxim Integrated DS1731 356 361 357 362 This driver can also be built as a module. If so, the module 358 363 will be called ds1621. ··· 460 455 461 456 This driver can also be built as a module. If so, the module 462 457 will be called g760a. 458 + 459 + config SENSORS_G762 460 + tristate "GMT G762 and G763" 461 + depends on I2C 462 + help 463 + If you say yes here you get support for Global Mixed-mode 464 + Technology Inc G762 and G763 fan speed PWM controller chips. 465 + 466 + This driver can also be built as a module. If so, the module 467 + will be called g762. 463 468 464 469 config SENSORS_GL518SM 465 470 tristate "Genesys Logic GL518SM"
+1
drivers/hwmon/Makefile
··· 60 60 obj-$(CONFIG_SENSORS_FAM15H_POWER) += fam15h_power.o 61 61 obj-$(CONFIG_SENSORS_FSCHMD) += fschmd.o 62 62 obj-$(CONFIG_SENSORS_G760A) += g760a.o 63 + obj-$(CONFIG_SENSORS_G762) += g762.o 63 64 obj-$(CONFIG_SENSORS_GL518SM) += gl518sm.o 64 65 obj-$(CONFIG_SENSORS_GL520SM) += gl520sm.o 65 66 obj-$(CONFIG_SENSORS_GPIO_FAN) += gpio-fan.o
-1
drivers/hwmon/abituguru3.c
··· 1079 1079 int i; 1080 1080 struct abituguru3_data *data = platform_get_drvdata(pdev); 1081 1081 1082 - platform_set_drvdata(pdev, NULL); 1083 1082 hwmon_device_unregister(data->hwmon_dev); 1084 1083 for (i = 0; data->sysfs_attr[i].dev_attr.attr.name; i++) 1085 1084 device_remove_file(&pdev->dev, &data->sysfs_attr[i].dev_attr);
+25 -7
drivers/hwmon/adm1021.c
··· 284 284 285 285 static struct attribute *adm1021_attributes[] = { 286 286 &sensor_dev_attr_temp1_max.dev_attr.attr, 287 - &sensor_dev_attr_temp1_min.dev_attr.attr, 288 287 &sensor_dev_attr_temp1_input.dev_attr.attr, 289 288 &sensor_dev_attr_temp2_max.dev_attr.attr, 290 - &sensor_dev_attr_temp2_min.dev_attr.attr, 291 289 &sensor_dev_attr_temp2_input.dev_attr.attr, 292 290 &sensor_dev_attr_temp1_max_alarm.dev_attr.attr, 293 - &sensor_dev_attr_temp1_min_alarm.dev_attr.attr, 294 291 &sensor_dev_attr_temp2_max_alarm.dev_attr.attr, 295 - &sensor_dev_attr_temp2_min_alarm.dev_attr.attr, 296 292 &sensor_dev_attr_temp2_fault.dev_attr.attr, 297 293 &dev_attr_alarms.attr, 298 294 &dev_attr_low_power.attr, ··· 297 301 298 302 static const struct attribute_group adm1021_group = { 299 303 .attrs = adm1021_attributes, 304 + }; 305 + 306 + static struct attribute *adm1021_min_attributes[] = { 307 + &sensor_dev_attr_temp1_min.dev_attr.attr, 308 + &sensor_dev_attr_temp2_min.dev_attr.attr, 309 + &sensor_dev_attr_temp1_min_alarm.dev_attr.attr, 310 + &sensor_dev_attr_temp2_min_alarm.dev_attr.attr, 311 + NULL 312 + }; 313 + 314 + static const struct attribute_group adm1021_min_group = { 315 + .attrs = adm1021_min_attributes, 300 316 }; 301 317 302 318 /* Return 0 if detection is successful, -ENODEV otherwise */ ··· 433 425 if (err) 434 426 return err; 435 427 428 + if (data->type != lm84) { 429 + err = sysfs_create_group(&client->dev.kobj, &adm1021_min_group); 430 + if (err) 431 + goto error; 432 + } 433 + 436 434 data->hwmon_dev = hwmon_device_register(&client->dev); 437 435 if (IS_ERR(data->hwmon_dev)) { 438 436 err = PTR_ERR(data->hwmon_dev); ··· 448 434 return 0; 449 435 450 436 error: 437 + sysfs_remove_group(&client->dev.kobj, &adm1021_min_group); 451 438 sysfs_remove_group(&client->dev.kobj, &adm1021_group); 452 439 return err; 453 440 } ··· 467 452 struct adm1021_data *data = i2c_get_clientdata(client); 468 453 469 454 hwmon_device_unregister(data->hwmon_dev); 455 + sysfs_remove_group(&client->dev.kobj, &adm1021_min_group); 470 456 sysfs_remove_group(&client->dev.kobj, &adm1021_group); 471 457 472 458 return 0; ··· 493 477 data->temp_max[i] = 1000 * 494 478 (s8) i2c_smbus_read_byte_data( 495 479 client, ADM1021_REG_TOS_R(i)); 496 - data->temp_min[i] = 1000 * 497 - (s8) i2c_smbus_read_byte_data( 498 - client, ADM1021_REG_THYST_R(i)); 480 + if (data->type != lm84) { 481 + data->temp_min[i] = 1000 * 482 + (s8) i2c_smbus_read_byte_data(client, 483 + ADM1021_REG_THYST_R(i)); 484 + } 499 485 } 500 486 data->alarms = i2c_smbus_read_byte_data(client, 501 487 ADM1021_REG_STATUS) & 0x7c;
-2
drivers/hwmon/coretemp.c
··· 578 578 579 579 exit_name: 580 580 device_remove_file(&pdev->dev, &pdata->name_attr); 581 - platform_set_drvdata(pdev, NULL); 582 581 exit_free: 583 582 kfree(pdata); 584 583 return err; ··· 594 595 595 596 device_remove_file(&pdev->dev, &pdata->name_attr); 596 597 hwmon_device_unregister(pdata->hwmon_dev); 597 - platform_set_drvdata(pdev, NULL); 598 598 kfree(pdata); 599 599 return 0; 600 600 }
+172 -54
drivers/hwmon/ds1621.c
··· 6 6 * Ported to Linux 2.6 by Aurelien Jarno <aurelien@aurel32.net> with 7 7 * the help of Jean Delvare <khali@linux-fr.org> 8 8 * 9 + * The DS1621 device is a digital temperature/thermometer with 9-bit 10 + * resolution, a thermal alarm output (Tout), and user-defined minimum 11 + * and maximum temperature thresholds (TH and TL). 12 + * 13 + * The DS1625, DS1631, DS1721, and DS1731 are pin compatible with the DS1621 14 + * and similar in operation, with slight variations as noted in the device 15 + * datasheets (please refer to www.maximintegrated.com for specific 16 + * device information). 17 + * 18 + * Since the DS1621 was the first chipset supported by this driver, 19 + * most comments will refer to this chipset, but are actually general 20 + * and concern all supported chipsets, unless mentioned otherwise. 21 + * 9 22 * This program is free software; you can redistribute it and/or modify 10 23 * it under the terms of the GNU General Public License as published by 11 24 * the Free Software Foundation; either version 2 of the License, or ··· 44 31 #include <linux/err.h> 45 32 #include <linux/mutex.h> 46 33 #include <linux/sysfs.h> 47 - #include "lm75.h" 34 + #include <linux/kernel.h> 48 35 49 - /* Addresses to scan */ 50 - static const unsigned short normal_i2c[] = { 0x48, 0x49, 0x4a, 0x4b, 0x4c, 51 - 0x4d, 0x4e, 0x4f, I2C_CLIENT_END }; 36 + /* Supported devices */ 37 + enum chips { ds1621, ds1625, ds1631, ds1721, ds1731 }; 52 38 53 39 /* Insmod parameters */ 54 40 static int polarity = -1; 55 41 module_param(polarity, int, 0); 56 42 MODULE_PARM_DESC(polarity, "Output's polarity: 0 = active high, 1 = active low"); 57 43 58 - /* Many DS1621 constants specified below */ 59 - /* Config register used for detection */ 60 - /* 7 6 5 4 3 2 1 0 */ 61 - /* |Done|THF |TLF |NVB | X | X |POL |1SHOT| */ 44 + /* 45 + * The Configuration/Status register 46 + * 47 + * - DS1621: 48 + * 7 6 5 4 3 2 1 0 49 + * |Done|THF |TLF |NVB | X | X |POL |1SHOT| 50 + * 51 + * - DS1625: 52 + * 7 6 5 4 3 2 1 0 53 + * |Done|THF |TLF |NVB | 1 | 0 |POL |1SHOT| 54 + * 55 + * - DS1631, DS1731: 56 + * 7 6 5 4 3 2 1 0 57 + * |Done|THF |TLF |NVB | R1 | R0 |POL |1SHOT| 58 + * 59 + * - DS1721: 60 + * 7 6 5 4 3 2 1 0 61 + * |Done| X | X | U | R1 | R0 |POL |1SHOT| 62 + * 63 + * Where: 64 + * - 'X' is Reserved 65 + * - 'U' is Undefined 66 + */ 62 67 #define DS1621_REG_CONFIG_NVB 0x10 68 + #define DS1621_REG_CONFIG_RESOL 0x0C 63 69 #define DS1621_REG_CONFIG_POLARITY 0x02 64 70 #define DS1621_REG_CONFIG_1SHOT 0x01 65 71 #define DS1621_REG_CONFIG_DONE 0x80 66 72 67 - /* The DS1621 registers */ 73 + #define DS1621_REG_CONFIG_RESOL_SHIFT 2 74 + 75 + /* ds1721 conversion rates: {C/LSB, time(ms), resolution bit setting} */ 76 + static const unsigned short ds1721_convrates[] = { 77 + 94, /* 9-bits (0.5, 93.75, RES[0..1] = 0 */ 78 + 188, /* 10-bits (0.25, 187.5, RES[0..1] = 1 */ 79 + 375, /* 11-bits (0.125, 375, RES[0..1] = 2 */ 80 + 750, /* 12-bits (0.0625, 750, RES[0..1] = 3 */ 81 + }; 82 + 83 + #define DS1621_CONVERSION_MAX 750 84 + #define DS1625_CONVERSION_MAX 500 85 + 86 + #define DS1621_TEMP_MAX 125000 87 + #define DS1621_TEMP_MIN (-55000) 88 + 89 + /* The DS1621 temperature registers */ 68 90 static const u8 DS1621_REG_TEMP[3] = { 69 91 0xAA, /* input, word, RO */ 70 92 0xA2, /* min, word, RW */ ··· 107 59 }; 108 60 #define DS1621_REG_CONF 0xAC /* byte, RW */ 109 61 #define DS1621_COM_START 0xEE /* no data */ 62 + #define DS1721_COM_START 0x51 /* no data */ 110 63 #define DS1621_COM_STOP 0x22 /* no data */ 111 64 112 65 /* The DS1621 configuration register */ ··· 124 75 struct mutex update_lock; 125 76 char valid; /* !=0 if following fields are valid */ 126 77 unsigned long last_updated; /* In jiffies */ 78 + enum chips kind; /* device type */ 127 79 128 80 u16 temp[3]; /* Register values, word */ 129 81 u8 conf; /* Register encoding, combined */ 82 + u8 zbits; /* Resolution encoded as number of 83 + * zero bits */ 84 + u16 update_interval; /* Conversion rate in milliseconds */ 130 85 }; 86 + 87 + static inline int DS1621_TEMP_FROM_REG(u16 reg) 88 + { 89 + return DIV_ROUND_CLOSEST(((s16)reg / 16) * 625, 10); 90 + } 91 + 92 + /* 93 + * TEMP: 0.001C/bit (-55C to +125C) 94 + * REG: 95 + * - 1621, 1625: 0.5C/bit, 7 zero-bits 96 + * - 1631, 1721, 1731: 0.0625C/bit, 4 zero-bits 97 + */ 98 + static inline u16 DS1621_TEMP_TO_REG(long temp, u8 zbits) 99 + { 100 + temp = clamp_val(temp, DS1621_TEMP_MIN, DS1621_TEMP_MAX); 101 + temp = DIV_ROUND_CLOSEST(temp * (1 << (8 - zbits)), 1000) << zbits; 102 + return temp; 103 + } 131 104 132 105 static void ds1621_init_client(struct i2c_client *client) 133 106 { 134 - u8 conf, new_conf; 107 + u8 conf, new_conf, sreg, resol; 108 + struct ds1621_data *data = i2c_get_clientdata(client); 135 109 136 110 new_conf = conf = i2c_smbus_read_byte_data(client, DS1621_REG_CONF); 137 111 /* switch to continuous conversion mode */ ··· 169 97 if (conf != new_conf) 170 98 i2c_smbus_write_byte_data(client, DS1621_REG_CONF, new_conf); 171 99 100 + switch (data->kind) { 101 + case ds1625: 102 + data->update_interval = DS1625_CONVERSION_MAX; 103 + data->zbits = 7; 104 + sreg = DS1621_COM_START; 105 + break; 106 + case ds1631: 107 + case ds1721: 108 + case ds1731: 109 + resol = (new_conf & DS1621_REG_CONFIG_RESOL) >> 110 + DS1621_REG_CONFIG_RESOL_SHIFT; 111 + data->update_interval = ds1721_convrates[resol]; 112 + data->zbits = 7 - resol; 113 + sreg = DS1721_COM_START; 114 + break; 115 + default: 116 + data->update_interval = DS1621_CONVERSION_MAX; 117 + data->zbits = 7; 118 + sreg = DS1621_COM_START; 119 + break; 120 + } 121 + 172 122 /* start conversion */ 173 - i2c_smbus_write_byte(client, DS1621_COM_START); 123 + i2c_smbus_write_byte(client, sreg); 174 124 } 175 125 176 126 static struct ds1621_data *ds1621_update_client(struct device *dev) ··· 203 109 204 110 mutex_lock(&data->update_lock); 205 111 206 - if (time_after(jiffies, data->last_updated + HZ + HZ / 2) 207 - || !data->valid) { 112 + if (time_after(jiffies, data->last_updated + data->update_interval) || 113 + !data->valid) { 208 114 int i; 209 115 210 116 dev_dbg(&client->dev, "Starting ds1621 update\n"); ··· 240 146 struct sensor_device_attribute *attr = to_sensor_dev_attr(da); 241 147 struct ds1621_data *data = ds1621_update_client(dev); 242 148 return sprintf(buf, "%d\n", 243 - LM75_TEMP_FROM_REG(data->temp[attr->index])); 149 + DS1621_TEMP_FROM_REG(data->temp[attr->index])); 244 150 } 245 151 246 152 static ssize_t set_temp(struct device *dev, struct device_attribute *da, ··· 257 163 return err; 258 164 259 165 mutex_lock(&data->update_lock); 260 - data->temp[attr->index] = LM75_TEMP_TO_REG(val); 166 + data->temp[attr->index] = DS1621_TEMP_TO_REG(val, data->zbits); 261 167 i2c_smbus_write_word_swapped(client, DS1621_REG_TEMP[attr->index], 262 168 data->temp[attr->index]); 263 169 mutex_unlock(&data->update_lock); ··· 279 185 return sprintf(buf, "%d\n", !!(data->conf & attr->index)); 280 186 } 281 187 188 + static ssize_t show_convrate(struct device *dev, struct device_attribute *da, 189 + char *buf) 190 + { 191 + struct i2c_client *client = to_i2c_client(dev); 192 + struct ds1621_data *data = i2c_get_clientdata(client); 193 + return scnprintf(buf, PAGE_SIZE, "%hu\n", data->update_interval); 194 + } 195 + 196 + static ssize_t set_convrate(struct device *dev, struct device_attribute *da, 197 + const char *buf, size_t count) 198 + { 199 + struct i2c_client *client = to_i2c_client(dev); 200 + struct ds1621_data *data = i2c_get_clientdata(client); 201 + unsigned long convrate; 202 + s32 err; 203 + int resol = 0; 204 + 205 + err = kstrtoul(buf, 10, &convrate); 206 + if (err) 207 + return err; 208 + 209 + /* Convert rate into resolution bits */ 210 + while (resol < (ARRAY_SIZE(ds1721_convrates) - 1) && 211 + convrate > ds1721_convrates[resol]) 212 + resol++; 213 + 214 + mutex_lock(&data->update_lock); 215 + data->conf = i2c_smbus_read_byte_data(client, DS1621_REG_CONF); 216 + data->conf &= ~DS1621_REG_CONFIG_RESOL; 217 + data->conf |= (resol << DS1621_REG_CONFIG_RESOL_SHIFT); 218 + i2c_smbus_write_byte_data(client, DS1621_REG_CONF, data->conf); 219 + data->update_interval = ds1721_convrates[resol]; 220 + mutex_unlock(&data->update_lock); 221 + 222 + return count; 223 + } 224 + 282 225 static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL); 226 + static DEVICE_ATTR(update_interval, S_IWUSR | S_IRUGO, show_convrate, 227 + set_convrate); 228 + 283 229 static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL, 0); 284 230 static SENSOR_DEVICE_ATTR(temp1_min, S_IWUSR | S_IRUGO, show_temp, set_temp, 1); 285 231 static SENSOR_DEVICE_ATTR(temp1_max, S_IWUSR | S_IRUGO, show_temp, set_temp, 2); ··· 335 201 &sensor_dev_attr_temp1_min_alarm.dev_attr.attr, 336 202 &sensor_dev_attr_temp1_max_alarm.dev_attr.attr, 337 203 &dev_attr_alarms.attr, 204 + &dev_attr_update_interval.attr, 338 205 NULL 339 206 }; 340 207 208 + static umode_t ds1621_attribute_visible(struct kobject *kobj, 209 + struct attribute *attr, int index) 210 + { 211 + struct device *dev = container_of(kobj, struct device, kobj); 212 + struct i2c_client *client = to_i2c_client(dev); 213 + struct ds1621_data *data = i2c_get_clientdata(client); 214 + 215 + if (attr == &dev_attr_update_interval.attr) 216 + if (data->kind == ds1621 || data->kind == ds1625) 217 + /* shhh, we're hiding update_interval */ 218 + return 0; 219 + return attr->mode; 220 + } 221 + 341 222 static const struct attribute_group ds1621_group = { 342 223 .attrs = ds1621_attributes, 224 + .is_visible = ds1621_attribute_visible 343 225 }; 344 - 345 - 346 - /* Return 0 if detection is successful, -ENODEV otherwise */ 347 - static int ds1621_detect(struct i2c_client *client, 348 - struct i2c_board_info *info) 349 - { 350 - struct i2c_adapter *adapter = client->adapter; 351 - int conf, temp; 352 - int i; 353 - 354 - if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA 355 - | I2C_FUNC_SMBUS_WORD_DATA 356 - | I2C_FUNC_SMBUS_WRITE_BYTE)) 357 - return -ENODEV; 358 - 359 - /* 360 - * Now, we do the remaining detection. It is lousy. 361 - * 362 - * The NVB bit should be low if no EEPROM write has been requested 363 - * during the latest 10ms, which is highly improbable in our case. 364 - */ 365 - conf = i2c_smbus_read_byte_data(client, DS1621_REG_CONF); 366 - if (conf < 0 || conf & DS1621_REG_CONFIG_NVB) 367 - return -ENODEV; 368 - /* The 7 lowest bits of a temperature should always be 0. */ 369 - for (i = 0; i < ARRAY_SIZE(DS1621_REG_TEMP); i++) { 370 - temp = i2c_smbus_read_word_data(client, DS1621_REG_TEMP[i]); 371 - if (temp < 0 || (temp & 0x7f00)) 372 - return -ENODEV; 373 - } 374 - 375 - strlcpy(info->type, "ds1621", I2C_NAME_SIZE); 376 - 377 - return 0; 378 - } 379 226 380 227 static int ds1621_probe(struct i2c_client *client, 381 228 const struct i2c_device_id *id) ··· 371 256 372 257 i2c_set_clientdata(client, data); 373 258 mutex_init(&data->update_lock); 259 + 260 + data->kind = id->driver_data; 374 261 375 262 /* Initialize the DS1621 chip */ 376 263 ds1621_init_client(client); ··· 406 289 } 407 290 408 291 static const struct i2c_device_id ds1621_id[] = { 409 - { "ds1621", 0 }, 410 - { "ds1625", 0 }, 292 + { "ds1621", ds1621 }, 293 + { "ds1625", ds1625 }, 294 + { "ds1631", ds1631 }, 295 + { "ds1721", ds1721 }, 296 + { "ds1731", ds1731 }, 411 297 { } 412 298 }; 413 299 MODULE_DEVICE_TABLE(i2c, ds1621_id); ··· 424 304 .probe = ds1621_probe, 425 305 .remove = ds1621_remove, 426 306 .id_table = ds1621_id, 427 - .detect = ds1621_detect, 428 - .address_list = normal_i2c, 429 307 }; 430 308 431 309 module_i2c_driver(ds1621_driver);
+1149
drivers/hwmon/g762.c
··· 1 + /* 2 + * g762 - Driver for the Global Mixed-mode Technology Inc. fan speed 3 + * PWM controller chips from G762 family, i.e. G762 and G763 4 + * 5 + * Copyright (C) 2013, Arnaud EBALARD <arno@natisbad.org> 6 + * 7 + * This work is based on a basic version for 2.6.31 kernel developed 8 + * by Olivier Mouchet for LaCie. Updates and correction have been 9 + * performed to run on recent kernels. Additional features, like the 10 + * ability to configure various characteristics via .dts file or 11 + * board init file have been added. Detailed datasheet on which this 12 + * development is based is available here: 13 + * 14 + * http://natisbad.org/NAS/refs/GMT_EDS-762_763-080710-0.2.pdf 15 + * 16 + * Headers from previous developments have been kept below: 17 + * 18 + * Copyright (c) 2009 LaCie 19 + * 20 + * Author: Olivier Mouchet <olivier.mouchet@gmail.com> 21 + * 22 + * based on g760a code written by Herbert Valerio Riedel <hvr@gnu.org> 23 + * Copyright (C) 2007 Herbert Valerio Riedel <hvr@gnu.org> 24 + * 25 + * g762: minimal datasheet available at: 26 + * http://www.gmt.com.tw/product/datasheet/EDS-762_3.pdf 27 + * 28 + * This program is free software; you can redistribute it and/or modify 29 + * it under the terms of the GNU General Public License as published by 30 + * the Free Software Foundation; either version 2 of the License, or 31 + * (at your option) any later version. 32 + * 33 + * This program is distributed in the hope that it will be useful, 34 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 35 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 36 + * GNU General Public License for more details. 37 + * 38 + * You should have received a copy of the GNU General Public License 39 + * along with this program; if not, write to the Free Software 40 + * Foundation. 41 + */ 42 + 43 + #include <linux/device.h> 44 + #include <linux/module.h> 45 + #include <linux/init.h> 46 + #include <linux/jiffies.h> 47 + #include <linux/i2c.h> 48 + #include <linux/hwmon.h> 49 + #include <linux/hwmon-sysfs.h> 50 + #include <linux/err.h> 51 + #include <linux/mutex.h> 52 + #include <linux/kernel.h> 53 + #include <linux/clk.h> 54 + #include <linux/of.h> 55 + #include <linux/of_device.h> 56 + #include <linux/platform_data/g762.h> 57 + 58 + #define DRVNAME "g762" 59 + 60 + static const struct i2c_device_id g762_id[] = { 61 + { "g762", 0 }, 62 + { "g763", 0 }, 63 + { } 64 + }; 65 + MODULE_DEVICE_TABLE(i2c, g762_id); 66 + 67 + enum g762_regs { 68 + G762_REG_SET_CNT = 0x00, 69 + G762_REG_ACT_CNT = 0x01, 70 + G762_REG_FAN_STA = 0x02, 71 + G762_REG_SET_OUT = 0x03, 72 + G762_REG_FAN_CMD1 = 0x04, 73 + G762_REG_FAN_CMD2 = 0x05, 74 + }; 75 + 76 + /* Config register bits */ 77 + #define G762_REG_FAN_CMD1_DET_FAN_FAIL 0x80 /* enable fan_fail signal */ 78 + #define G762_REG_FAN_CMD1_DET_FAN_OOC 0x40 /* enable fan_out_of_control */ 79 + #define G762_REG_FAN_CMD1_OUT_MODE 0x20 /* out mode: PWM or DC */ 80 + #define G762_REG_FAN_CMD1_FAN_MODE 0x10 /* fan mode: closed/open-loop */ 81 + #define G762_REG_FAN_CMD1_CLK_DIV_ID1 0x08 /* clock divisor value */ 82 + #define G762_REG_FAN_CMD1_CLK_DIV_ID0 0x04 83 + #define G762_REG_FAN_CMD1_PWM_POLARITY 0x02 /* PWM polarity */ 84 + #define G762_REG_FAN_CMD1_PULSE_PER_REV 0x01 /* pulse per fan revolution */ 85 + 86 + #define G762_REG_FAN_CMD2_GEAR_MODE_1 0x08 /* fan gear mode */ 87 + #define G762_REG_FAN_CMD2_GEAR_MODE_0 0x04 88 + #define G762_REG_FAN_CMD2_FAN_STARTV_1 0x02 /* fan startup voltage */ 89 + #define G762_REG_FAN_CMD2_FAN_STARTV_0 0x01 90 + 91 + #define G762_REG_FAN_STA_FAIL 0x02 /* fan fail */ 92 + #define G762_REG_FAN_STA_OOC 0x01 /* fan out of control */ 93 + 94 + /* Config register values */ 95 + #define G762_OUT_MODE_PWM 1 96 + #define G762_OUT_MODE_DC 0 97 + 98 + #define G762_FAN_MODE_CLOSED_LOOP 2 99 + #define G762_FAN_MODE_OPEN_LOOP 1 100 + 101 + #define G762_PWM_POLARITY_NEGATIVE 1 102 + #define G762_PWM_POLARITY_POSITIVE 0 103 + 104 + /* Register data is read (and cached) at most once per second. */ 105 + #define G762_UPDATE_INTERVAL HZ 106 + 107 + /* 108 + * Extract pulse count per fan revolution value (2 or 4) from given 109 + * FAN_CMD1 register value. 110 + */ 111 + #define G762_PULSE_FROM_REG(reg) \ 112 + ((((reg) & G762_REG_FAN_CMD1_PULSE_PER_REV) + 1) << 1) 113 + 114 + /* 115 + * Extract fan clock divisor (1, 2, 4 or 8) from given FAN_CMD1 116 + * register value. 117 + */ 118 + #define G762_CLKDIV_FROM_REG(reg) \ 119 + (1 << (((reg) & (G762_REG_FAN_CMD1_CLK_DIV_ID0 | \ 120 + G762_REG_FAN_CMD1_CLK_DIV_ID1)) >> 2)) 121 + 122 + /* 123 + * Extract fan gear mode multiplier value (0, 2 or 4) from given 124 + * FAN_CMD2 register value. 125 + */ 126 + #define G762_GEARMULT_FROM_REG(reg) \ 127 + (1 << (((reg) & (G762_REG_FAN_CMD2_GEAR_MODE_0 | \ 128 + G762_REG_FAN_CMD2_GEAR_MODE_1)) >> 2)) 129 + 130 + struct g762_data { 131 + struct i2c_client *client; 132 + struct device *hwmon_dev; 133 + struct clk *clk; 134 + 135 + /* update mutex */ 136 + struct mutex update_lock; 137 + 138 + /* board specific parameters. */ 139 + u32 clk_freq; 140 + 141 + /* g762 register cache */ 142 + bool valid; 143 + unsigned long last_updated; /* in jiffies */ 144 + 145 + u8 set_cnt; /* controls fan rotation speed in closed-loop mode */ 146 + u8 act_cnt; /* provides access to current fan RPM value */ 147 + u8 fan_sta; /* bit 0: set when actual fan speed is more than 148 + * 25% outside requested fan speed 149 + * bit 1: set when no transition occurs on fan 150 + * pin for 0.7s 151 + */ 152 + u8 set_out; /* controls fan rotation speed in open-loop mode */ 153 + u8 fan_cmd1; /* 0: FG_PLS_ID0 FG pulses count per revolution 154 + * 0: 2 counts per revolution 155 + * 1: 4 counts per revolution 156 + * 1: PWM_POLARITY 1: negative_duty 157 + * 0: positive_duty 158 + * 2,3: [FG_CLOCK_ID0, FG_CLK_ID1] 159 + * 00: Divide fan clock by 1 160 + * 01: Divide fan clock by 2 161 + * 10: Divide fan clock by 4 162 + * 11: Divide fan clock by 8 163 + * 4: FAN_MODE 1:closed-loop, 0:open-loop 164 + * 5: OUT_MODE 1:PWM, 0:DC 165 + * 6: DET_FAN_OOC enable "fan ooc" status 166 + * 7: DET_FAN_FAIL enable "fan fail" status 167 + */ 168 + u8 fan_cmd2; /* 0,1: FAN_STARTV 0,1,2,3 -> 0,32,64,96 dac_code 169 + * 2,3: FG_GEAR_MODE 170 + * 00: multiplier = 1 171 + * 01: multiplier = 2 172 + * 10: multiplier = 4 173 + * 4: Mask ALERT# (g763 only) 174 + */ 175 + }; 176 + 177 + /* 178 + * Convert count value from fan controller register (FAN_SET_CNT) into fan 179 + * speed RPM value. Note that the datasheet documents a basic formula; 180 + * influence of additional parameters (fan clock divisor, fan gear mode) 181 + * have been infered from examples in the datasheet and tests. 182 + */ 183 + static inline unsigned int rpm_from_cnt(u8 cnt, u32 clk_freq, u16 p, 184 + u8 clk_div, u8 gear_mult) 185 + { 186 + if (cnt == 0xff) /* setting cnt to 255 stops the fan */ 187 + return 0; 188 + 189 + return (clk_freq * 30 * gear_mult) / ((cnt ? cnt : 1) * p * clk_div); 190 + } 191 + 192 + /* 193 + * Convert fan RPM value from sysfs into count value for fan controller 194 + * register (FAN_SET_CNT). 195 + */ 196 + static inline unsigned char cnt_from_rpm(u32 rpm, u32 clk_freq, u16 p, 197 + u8 clk_div, u8 gear_mult) 198 + { 199 + if (!rpm) /* to stop the fan, set cnt to 255 */ 200 + return 0xff; 201 + 202 + return clamp_val(((clk_freq * 30 * gear_mult) / (rpm * p * clk_div)), 203 + 0, 255); 204 + } 205 + 206 + /* helper to grab and cache data, at most one time per second */ 207 + static struct g762_data *g762_update_client(struct device *dev) 208 + { 209 + struct i2c_client *client = to_i2c_client(dev); 210 + struct g762_data *data = i2c_get_clientdata(client); 211 + int ret = 0; 212 + 213 + mutex_lock(&data->update_lock); 214 + if (time_before(jiffies, data->last_updated + G762_UPDATE_INTERVAL) && 215 + likely(data->valid)) 216 + goto out; 217 + 218 + ret = i2c_smbus_read_byte_data(client, G762_REG_SET_CNT); 219 + if (ret < 0) 220 + goto out; 221 + data->set_cnt = ret; 222 + 223 + ret = i2c_smbus_read_byte_data(client, G762_REG_ACT_CNT); 224 + if (ret < 0) 225 + goto out; 226 + data->act_cnt = ret; 227 + 228 + ret = i2c_smbus_read_byte_data(client, G762_REG_FAN_STA); 229 + if (ret < 0) 230 + goto out; 231 + data->fan_sta = ret; 232 + 233 + ret = i2c_smbus_read_byte_data(client, G762_REG_SET_OUT); 234 + if (ret < 0) 235 + goto out; 236 + data->set_out = ret; 237 + 238 + ret = i2c_smbus_read_byte_data(client, G762_REG_FAN_CMD1); 239 + if (ret < 0) 240 + goto out; 241 + data->fan_cmd1 = ret; 242 + 243 + ret = i2c_smbus_read_byte_data(client, G762_REG_FAN_CMD2); 244 + if (ret < 0) 245 + goto out; 246 + data->fan_cmd2 = ret; 247 + 248 + data->last_updated = jiffies; 249 + data->valid = true; 250 + out: 251 + mutex_unlock(&data->update_lock); 252 + 253 + if (ret < 0) /* upon error, encode it in return value */ 254 + data = ERR_PTR(ret); 255 + 256 + return data; 257 + } 258 + 259 + /* helpers for writing hardware parameters */ 260 + 261 + /* 262 + * Set input clock frequency received on CLK pin of the chip. Accepted values 263 + * are between 0 and 0xffffff. If zero is given, then default frequency 264 + * (32,768Hz) is used. Note that clock frequency is a characteristic of the 265 + * system but an internal parameter, i.e. value is not passed to the device. 266 + */ 267 + static int do_set_clk_freq(struct device *dev, unsigned long val) 268 + { 269 + struct i2c_client *client = to_i2c_client(dev); 270 + struct g762_data *data = i2c_get_clientdata(client); 271 + 272 + if (val > 0xffffff) 273 + return -EINVAL; 274 + if (!val) 275 + val = 32768; 276 + 277 + data->clk_freq = val; 278 + 279 + return 0; 280 + } 281 + 282 + /* Set pwm mode. Accepts either 0 (PWM mode) or 1 (DC mode) */ 283 + static int do_set_pwm_mode(struct device *dev, unsigned long val) 284 + { 285 + struct i2c_client *client = to_i2c_client(dev); 286 + struct g762_data *data = g762_update_client(dev); 287 + int ret; 288 + 289 + if (IS_ERR(data)) 290 + return PTR_ERR(data); 291 + 292 + mutex_lock(&data->update_lock); 293 + switch (val) { 294 + case G762_OUT_MODE_PWM: 295 + data->fan_cmd1 |= G762_REG_FAN_CMD1_OUT_MODE; 296 + break; 297 + case G762_OUT_MODE_DC: 298 + data->fan_cmd1 &= ~G762_REG_FAN_CMD1_OUT_MODE; 299 + break; 300 + default: 301 + ret = -EINVAL; 302 + goto out; 303 + } 304 + ret = i2c_smbus_write_byte_data(client, G762_REG_FAN_CMD1, 305 + data->fan_cmd1); 306 + data->valid = false; 307 + out: 308 + mutex_unlock(&data->update_lock); 309 + 310 + return ret; 311 + } 312 + 313 + /* Set fan clock divisor. Accepts either 1, 2, 4 or 8. */ 314 + static int do_set_fan_div(struct device *dev, unsigned long val) 315 + { 316 + struct i2c_client *client = to_i2c_client(dev); 317 + struct g762_data *data = g762_update_client(dev); 318 + int ret; 319 + 320 + if (IS_ERR(data)) 321 + return PTR_ERR(data); 322 + 323 + mutex_lock(&data->update_lock); 324 + switch (val) { 325 + case 1: 326 + data->fan_cmd1 &= ~G762_REG_FAN_CMD1_CLK_DIV_ID0; 327 + data->fan_cmd1 &= ~G762_REG_FAN_CMD1_CLK_DIV_ID1; 328 + break; 329 + case 2: 330 + data->fan_cmd1 |= G762_REG_FAN_CMD1_CLK_DIV_ID0; 331 + data->fan_cmd1 &= ~G762_REG_FAN_CMD1_CLK_DIV_ID1; 332 + break; 333 + case 4: 334 + data->fan_cmd1 &= ~G762_REG_FAN_CMD1_CLK_DIV_ID0; 335 + data->fan_cmd1 |= G762_REG_FAN_CMD1_CLK_DIV_ID1; 336 + break; 337 + case 8: 338 + data->fan_cmd1 |= G762_REG_FAN_CMD1_CLK_DIV_ID0; 339 + data->fan_cmd1 |= G762_REG_FAN_CMD1_CLK_DIV_ID1; 340 + break; 341 + default: 342 + ret = -EINVAL; 343 + goto out; 344 + } 345 + ret = i2c_smbus_write_byte_data(client, G762_REG_FAN_CMD1, 346 + data->fan_cmd1); 347 + data->valid = false; 348 + out: 349 + mutex_unlock(&data->update_lock); 350 + 351 + return ret; 352 + } 353 + 354 + /* Set fan gear mode. Accepts either 0, 1 or 2. */ 355 + static int do_set_fan_gear_mode(struct device *dev, unsigned long val) 356 + { 357 + struct i2c_client *client = to_i2c_client(dev); 358 + struct g762_data *data = g762_update_client(dev); 359 + int ret; 360 + 361 + if (IS_ERR(data)) 362 + return PTR_ERR(data); 363 + 364 + mutex_lock(&data->update_lock); 365 + switch (val) { 366 + case 0: 367 + data->fan_cmd2 &= ~G762_REG_FAN_CMD2_GEAR_MODE_0; 368 + data->fan_cmd2 &= ~G762_REG_FAN_CMD2_GEAR_MODE_1; 369 + break; 370 + case 1: 371 + data->fan_cmd2 |= G762_REG_FAN_CMD2_GEAR_MODE_0; 372 + data->fan_cmd2 &= ~G762_REG_FAN_CMD2_GEAR_MODE_1; 373 + break; 374 + case 2: 375 + data->fan_cmd2 &= ~G762_REG_FAN_CMD2_GEAR_MODE_0; 376 + data->fan_cmd2 |= G762_REG_FAN_CMD2_GEAR_MODE_1; 377 + break; 378 + default: 379 + ret = -EINVAL; 380 + goto out; 381 + } 382 + ret = i2c_smbus_write_byte_data(client, G762_REG_FAN_CMD2, 383 + data->fan_cmd2); 384 + data->valid = false; 385 + out: 386 + mutex_unlock(&data->update_lock); 387 + 388 + return ret; 389 + } 390 + 391 + /* Set number of fan pulses per revolution. Accepts either 2 or 4. */ 392 + static int do_set_fan_pulses(struct device *dev, unsigned long val) 393 + { 394 + struct i2c_client *client = to_i2c_client(dev); 395 + struct g762_data *data = g762_update_client(dev); 396 + int ret; 397 + 398 + if (IS_ERR(data)) 399 + return PTR_ERR(data); 400 + 401 + mutex_lock(&data->update_lock); 402 + switch (val) { 403 + case 2: 404 + data->fan_cmd1 &= ~G762_REG_FAN_CMD1_PULSE_PER_REV; 405 + break; 406 + case 4: 407 + data->fan_cmd1 |= G762_REG_FAN_CMD1_PULSE_PER_REV; 408 + break; 409 + default: 410 + ret = -EINVAL; 411 + goto out; 412 + } 413 + ret = i2c_smbus_write_byte_data(client, G762_REG_FAN_CMD1, 414 + data->fan_cmd1); 415 + data->valid = false; 416 + out: 417 + mutex_unlock(&data->update_lock); 418 + 419 + return ret; 420 + } 421 + 422 + /* Set fan mode. Accepts either 1 (open-loop) or 2 (closed-loop). */ 423 + static int do_set_pwm_enable(struct device *dev, unsigned long val) 424 + { 425 + struct i2c_client *client = to_i2c_client(dev); 426 + struct g762_data *data = g762_update_client(dev); 427 + int ret; 428 + 429 + if (IS_ERR(data)) 430 + return PTR_ERR(data); 431 + 432 + mutex_lock(&data->update_lock); 433 + switch (val) { 434 + case G762_FAN_MODE_CLOSED_LOOP: 435 + data->fan_cmd1 |= G762_REG_FAN_CMD1_FAN_MODE; 436 + break; 437 + case G762_FAN_MODE_OPEN_LOOP: 438 + data->fan_cmd1 &= ~G762_REG_FAN_CMD1_FAN_MODE; 439 + /* 440 + * BUG FIX: if SET_CNT register value is 255 then, for some 441 + * unknown reason, fan will not rotate as expected, no matter 442 + * the value of SET_OUT (to be specific, this seems to happen 443 + * only in PWM mode). To workaround this bug, we give SET_CNT 444 + * value of 254 if it is 255 when switching to open-loop. 445 + */ 446 + if (data->set_cnt == 0xff) 447 + i2c_smbus_write_byte_data(client, G762_REG_SET_CNT, 448 + 254); 449 + break; 450 + default: 451 + ret = -EINVAL; 452 + goto out; 453 + } 454 + 455 + ret = i2c_smbus_write_byte_data(client, G762_REG_FAN_CMD1, 456 + data->fan_cmd1); 457 + data->valid = false; 458 + out: 459 + mutex_unlock(&data->update_lock); 460 + 461 + return ret; 462 + } 463 + 464 + /* Set PWM polarity. Accepts either 0 (positive duty) or 1 (negative duty) */ 465 + static int do_set_pwm_polarity(struct device *dev, unsigned long val) 466 + { 467 + struct i2c_client *client = to_i2c_client(dev); 468 + struct g762_data *data = g762_update_client(dev); 469 + int ret; 470 + 471 + if (IS_ERR(data)) 472 + return PTR_ERR(data); 473 + 474 + mutex_lock(&data->update_lock); 475 + switch (val) { 476 + case G762_PWM_POLARITY_POSITIVE: 477 + data->fan_cmd1 &= ~G762_REG_FAN_CMD1_PWM_POLARITY; 478 + break; 479 + case G762_PWM_POLARITY_NEGATIVE: 480 + data->fan_cmd1 |= G762_REG_FAN_CMD1_PWM_POLARITY; 481 + break; 482 + default: 483 + ret = -EINVAL; 484 + goto out; 485 + } 486 + ret = i2c_smbus_write_byte_data(client, G762_REG_FAN_CMD1, 487 + data->fan_cmd1); 488 + data->valid = false; 489 + out: 490 + mutex_unlock(&data->update_lock); 491 + 492 + return ret; 493 + } 494 + 495 + /* 496 + * Set pwm value. Accepts values between 0 (stops the fan) and 497 + * 255 (full speed). This only makes sense in open-loop mode. 498 + */ 499 + static int do_set_pwm(struct device *dev, unsigned long val) 500 + { 501 + struct i2c_client *client = to_i2c_client(dev); 502 + struct g762_data *data = i2c_get_clientdata(client); 503 + int ret; 504 + 505 + if (val > 255) 506 + return -EINVAL; 507 + 508 + mutex_lock(&data->update_lock); 509 + ret = i2c_smbus_write_byte_data(client, G762_REG_SET_OUT, val); 510 + data->valid = false; 511 + mutex_unlock(&data->update_lock); 512 + 513 + return ret; 514 + } 515 + 516 + /* 517 + * Set fan RPM value. Can be called both in closed and open-loop mode 518 + * but effect will only be seen after closed-loop mode is configured. 519 + */ 520 + static int do_set_fan_target(struct device *dev, unsigned long val) 521 + { 522 + struct i2c_client *client = to_i2c_client(dev); 523 + struct g762_data *data = g762_update_client(dev); 524 + int ret; 525 + 526 + if (IS_ERR(data)) 527 + return PTR_ERR(data); 528 + 529 + mutex_lock(&data->update_lock); 530 + data->set_cnt = cnt_from_rpm(val, data->clk_freq, 531 + G762_PULSE_FROM_REG(data->fan_cmd1), 532 + G762_CLKDIV_FROM_REG(data->fan_cmd1), 533 + G762_GEARMULT_FROM_REG(data->fan_cmd2)); 534 + ret = i2c_smbus_write_byte_data(client, G762_REG_SET_CNT, 535 + data->set_cnt); 536 + data->valid = false; 537 + mutex_unlock(&data->update_lock); 538 + 539 + return ret; 540 + } 541 + 542 + /* Set fan startup voltage. Accepted values are either 0, 1, 2 or 3. */ 543 + static int do_set_fan_startv(struct device *dev, unsigned long val) 544 + { 545 + struct i2c_client *client = to_i2c_client(dev); 546 + struct g762_data *data = g762_update_client(dev); 547 + int ret; 548 + 549 + if (IS_ERR(data)) 550 + return PTR_ERR(data); 551 + 552 + mutex_lock(&data->update_lock); 553 + switch (val) { 554 + case 0: 555 + data->fan_cmd2 &= ~G762_REG_FAN_CMD2_FAN_STARTV_0; 556 + data->fan_cmd2 &= ~G762_REG_FAN_CMD2_FAN_STARTV_1; 557 + break; 558 + case 1: 559 + data->fan_cmd2 |= G762_REG_FAN_CMD2_FAN_STARTV_0; 560 + data->fan_cmd2 &= ~G762_REG_FAN_CMD2_FAN_STARTV_1; 561 + break; 562 + case 2: 563 + data->fan_cmd2 &= ~G762_REG_FAN_CMD2_FAN_STARTV_0; 564 + data->fan_cmd2 |= G762_REG_FAN_CMD2_FAN_STARTV_1; 565 + break; 566 + case 3: 567 + data->fan_cmd2 |= G762_REG_FAN_CMD2_FAN_STARTV_0; 568 + data->fan_cmd2 |= G762_REG_FAN_CMD2_FAN_STARTV_1; 569 + break; 570 + default: 571 + ret = -EINVAL; 572 + goto out; 573 + } 574 + ret = i2c_smbus_write_byte_data(client, G762_REG_FAN_CMD2, 575 + data->fan_cmd2); 576 + data->valid = false; 577 + out: 578 + mutex_unlock(&data->update_lock); 579 + 580 + return ret; 581 + } 582 + 583 + /* 584 + * Helper to import hardware characteristics from .dts file and push 585 + * those to the chip. 586 + */ 587 + 588 + #ifdef CONFIG_OF 589 + static struct of_device_id g762_dt_match[] = { 590 + { .compatible = "gmt,g762" }, 591 + { .compatible = "gmt,g763" }, 592 + { }, 593 + }; 594 + 595 + /* 596 + * Grab clock (a required property), enable it, get (fixed) clock frequency 597 + * and store it. Note: upon success, clock has been prepared and enabled; it 598 + * must later be unprepared and disabled (e.g. during module unloading) by a 599 + * call to g762_of_clock_disable(). Note that a reference to clock is kept 600 + * in our private data structure to be used in this function. 601 + */ 602 + static int g762_of_clock_enable(struct i2c_client *client) 603 + { 604 + struct g762_data *data; 605 + unsigned long clk_freq; 606 + struct clk *clk; 607 + int ret; 608 + 609 + if (!client->dev.of_node) 610 + return 0; 611 + 612 + clk = of_clk_get(client->dev.of_node, 0); 613 + if (IS_ERR(clk)) { 614 + dev_err(&client->dev, "failed to get clock\n"); 615 + return PTR_ERR(clk); 616 + } 617 + 618 + ret = clk_prepare_enable(clk); 619 + if (ret) { 620 + dev_err(&client->dev, "failed to enable clock\n"); 621 + goto clk_put; 622 + } 623 + 624 + clk_freq = clk_get_rate(clk); 625 + ret = do_set_clk_freq(&client->dev, clk_freq); 626 + if (ret) { 627 + dev_err(&client->dev, "invalid clock freq %lu\n", clk_freq); 628 + goto clk_unprep; 629 + } 630 + 631 + data = i2c_get_clientdata(client); 632 + data->clk = clk; 633 + 634 + return 0; 635 + 636 + clk_unprep: 637 + clk_disable_unprepare(clk); 638 + 639 + clk_put: 640 + clk_put(clk); 641 + 642 + return ret; 643 + } 644 + 645 + static void g762_of_clock_disable(struct i2c_client *client) 646 + { 647 + struct g762_data *data = i2c_get_clientdata(client); 648 + 649 + if (!data->clk) 650 + return; 651 + 652 + clk_disable_unprepare(data->clk); 653 + clk_put(data->clk); 654 + } 655 + 656 + static int g762_of_prop_import_one(struct i2c_client *client, 657 + const char *pname, 658 + int (*psetter)(struct device *dev, 659 + unsigned long val)) 660 + { 661 + const __be32 *prop; 662 + int len, ret; 663 + u32 pval; 664 + 665 + prop = of_get_property(client->dev.of_node, pname, &len); 666 + if (!prop || len != sizeof(u32)) 667 + return 0; 668 + 669 + pval = be32_to_cpu(prop[0]); 670 + dev_dbg(&client->dev, "found %s (%d)\n", pname, pval); 671 + ret = (*psetter)(&client->dev, pval); 672 + if (ret) 673 + dev_err(&client->dev, "unable to set %s (%d)\n", pname, pval); 674 + 675 + return ret; 676 + } 677 + 678 + static int g762_of_prop_import(struct i2c_client *client) 679 + { 680 + int ret; 681 + 682 + if (!client->dev.of_node) 683 + return 0; 684 + 685 + ret = g762_of_prop_import_one(client, "fan_gear_mode", 686 + do_set_fan_gear_mode); 687 + if (ret) 688 + return ret; 689 + 690 + ret = g762_of_prop_import_one(client, "pwm_polarity", 691 + do_set_pwm_polarity); 692 + if (ret) 693 + return ret; 694 + 695 + return g762_of_prop_import_one(client, "fan_startv", 696 + do_set_fan_startv); 697 + } 698 + 699 + #else 700 + static int g762_of_prop_import(struct i2c_client *client) 701 + { 702 + return 0; 703 + } 704 + 705 + static int g762_of_clock_enable(struct i2c_client *client) 706 + { 707 + return 0; 708 + } 709 + 710 + static void g762_of_clock_disable(struct i2c_client *client) { } 711 + #endif 712 + 713 + /* 714 + * Helper to import hardware characteristics from .dts file and push 715 + * those to the chip. 716 + */ 717 + 718 + static int g762_pdata_prop_import(struct i2c_client *client) 719 + { 720 + struct g762_platform_data *pdata = client->dev.platform_data; 721 + int ret; 722 + 723 + if (!pdata) 724 + return 0; 725 + 726 + ret = do_set_fan_gear_mode(&client->dev, pdata->fan_gear_mode); 727 + if (ret) 728 + return ret; 729 + 730 + ret = do_set_pwm_polarity(&client->dev, pdata->pwm_polarity); 731 + if (ret) 732 + return ret; 733 + 734 + ret = do_set_fan_startv(&client->dev, pdata->fan_startv); 735 + if (ret) 736 + return ret; 737 + 738 + return do_set_clk_freq(&client->dev, pdata->clk_freq); 739 + } 740 + 741 + /* 742 + * sysfs attributes 743 + */ 744 + 745 + /* 746 + * Read function for fan1_input sysfs file. Return current fan RPM value, or 747 + * 0 if fan is out of control. 748 + */ 749 + static ssize_t get_fan_rpm(struct device *dev, struct device_attribute *da, 750 + char *buf) 751 + { 752 + struct g762_data *data = g762_update_client(dev); 753 + unsigned int rpm = 0; 754 + 755 + if (IS_ERR(data)) 756 + return PTR_ERR(data); 757 + 758 + mutex_lock(&data->update_lock); 759 + /* reverse logic: fan out of control reporting is enabled low */ 760 + if (data->fan_sta & G762_REG_FAN_STA_OOC) { 761 + rpm = rpm_from_cnt(data->act_cnt, data->clk_freq, 762 + G762_PULSE_FROM_REG(data->fan_cmd1), 763 + G762_CLKDIV_FROM_REG(data->fan_cmd1), 764 + G762_GEARMULT_FROM_REG(data->fan_cmd2)); 765 + } 766 + mutex_unlock(&data->update_lock); 767 + 768 + return sprintf(buf, "%u\n", rpm); 769 + } 770 + 771 + /* 772 + * Read and write functions for pwm1_mode sysfs file. Get and set fan speed 773 + * control mode i.e. PWM (1) or DC (0). 774 + */ 775 + static ssize_t get_pwm_mode(struct device *dev, struct device_attribute *da, 776 + char *buf) 777 + { 778 + struct g762_data *data = g762_update_client(dev); 779 + 780 + if (IS_ERR(data)) 781 + return PTR_ERR(data); 782 + 783 + return sprintf(buf, "%d\n", 784 + !!(data->fan_cmd1 & G762_REG_FAN_CMD1_OUT_MODE)); 785 + } 786 + 787 + static ssize_t set_pwm_mode(struct device *dev, struct device_attribute *da, 788 + const char *buf, size_t count) 789 + { 790 + unsigned long val; 791 + int ret; 792 + 793 + if (kstrtoul(buf, 10, &val)) 794 + return -EINVAL; 795 + 796 + ret = do_set_pwm_mode(dev, val); 797 + if (ret < 0) 798 + return ret; 799 + 800 + return count; 801 + } 802 + 803 + /* 804 + * Read and write functions for fan1_div sysfs file. Get and set fan 805 + * controller prescaler value 806 + */ 807 + static ssize_t get_fan_div(struct device *dev, 808 + struct device_attribute *da, char *buf) 809 + { 810 + struct g762_data *data = g762_update_client(dev); 811 + 812 + if (IS_ERR(data)) 813 + return PTR_ERR(data); 814 + 815 + return sprintf(buf, "%d\n", G762_CLKDIV_FROM_REG(data->fan_cmd1)); 816 + } 817 + 818 + static ssize_t set_fan_div(struct device *dev, 819 + struct device_attribute *da, 820 + const char *buf, size_t count) 821 + { 822 + unsigned long val; 823 + int ret; 824 + 825 + if (kstrtoul(buf, 10, &val)) 826 + return -EINVAL; 827 + 828 + ret = do_set_fan_div(dev, val); 829 + if (ret < 0) 830 + return ret; 831 + 832 + return count; 833 + } 834 + 835 + /* 836 + * Read and write functions for fan1_pulses sysfs file. Get and set number 837 + * of tachometer pulses per fan revolution. 838 + */ 839 + static ssize_t get_fan_pulses(struct device *dev, 840 + struct device_attribute *da, char *buf) 841 + { 842 + struct g762_data *data = g762_update_client(dev); 843 + 844 + if (IS_ERR(data)) 845 + return PTR_ERR(data); 846 + 847 + return sprintf(buf, "%d\n", G762_PULSE_FROM_REG(data->fan_cmd1)); 848 + } 849 + 850 + static ssize_t set_fan_pulses(struct device *dev, 851 + struct device_attribute *da, 852 + const char *buf, size_t count) 853 + { 854 + unsigned long val; 855 + int ret; 856 + 857 + if (kstrtoul(buf, 10, &val)) 858 + return -EINVAL; 859 + 860 + ret = do_set_fan_pulses(dev, val); 861 + if (ret < 0) 862 + return ret; 863 + 864 + return count; 865 + } 866 + 867 + /* 868 + * Read and write functions for pwm1_enable. Get and set fan speed control mode 869 + * (i.e. closed or open-loop). 870 + * 871 + * Following documentation about hwmon's sysfs interface, a pwm1_enable node 872 + * should accept followings: 873 + * 874 + * 0 : no fan speed control (i.e. fan at full speed) 875 + * 1 : manual fan speed control enabled (use pwm[1-*]) (open-loop) 876 + * 2+: automatic fan speed control enabled (use fan[1-*]_target) (closed-loop) 877 + * 878 + * but we do not accept 0 as this mode is not natively supported by the chip 879 + * and it is not emulated by g762 driver. -EINVAL is returned in this case. 880 + */ 881 + static ssize_t get_pwm_enable(struct device *dev, 882 + struct device_attribute *da, char *buf) 883 + { 884 + struct g762_data *data = g762_update_client(dev); 885 + 886 + if (IS_ERR(data)) 887 + return PTR_ERR(data); 888 + 889 + return sprintf(buf, "%d\n", 890 + (!!(data->fan_cmd1 & G762_REG_FAN_CMD1_FAN_MODE)) + 1); 891 + } 892 + 893 + static ssize_t set_pwm_enable(struct device *dev, 894 + struct device_attribute *da, 895 + const char *buf, size_t count) 896 + { 897 + unsigned long val; 898 + int ret; 899 + 900 + if (kstrtoul(buf, 10, &val)) 901 + return -EINVAL; 902 + 903 + ret = do_set_pwm_enable(dev, val); 904 + if (ret < 0) 905 + return ret; 906 + 907 + return count; 908 + } 909 + 910 + /* 911 + * Read and write functions for pwm1 sysfs file. Get and set pwm value 912 + * (which affects fan speed) in open-loop mode. 0 stops the fan and 255 913 + * makes it run at full speed. 914 + */ 915 + static ssize_t get_pwm(struct device *dev, struct device_attribute *da, 916 + char *buf) 917 + { 918 + struct g762_data *data = g762_update_client(dev); 919 + 920 + if (IS_ERR(data)) 921 + return PTR_ERR(data); 922 + 923 + return sprintf(buf, "%d\n", data->set_out); 924 + } 925 + 926 + static ssize_t set_pwm(struct device *dev, struct device_attribute *da, 927 + const char *buf, size_t count) 928 + { 929 + unsigned long val; 930 + int ret; 931 + 932 + if (kstrtoul(buf, 10, &val)) 933 + return -EINVAL; 934 + 935 + ret = do_set_pwm(dev, val); 936 + if (ret < 0) 937 + return ret; 938 + 939 + return count; 940 + } 941 + 942 + /* 943 + * Read and write function for fan1_target sysfs file. Get/set the fan speed in 944 + * closed-loop mode. Speed is given as a RPM value; then the chip will regulate 945 + * the fan speed using pulses from fan tachometer. 946 + * 947 + * Refer to rpm_from_cnt() implementation above to get info about count number 948 + * calculation. 949 + * 950 + * Also note that due to rounding errors it is possible that you don't read 951 + * back exactly the value you have set. 952 + */ 953 + static ssize_t get_fan_target(struct device *dev, struct device_attribute *da, 954 + char *buf) 955 + { 956 + struct g762_data *data = g762_update_client(dev); 957 + unsigned int rpm; 958 + 959 + if (IS_ERR(data)) 960 + return PTR_ERR(data); 961 + 962 + mutex_lock(&data->update_lock); 963 + rpm = rpm_from_cnt(data->set_cnt, data->clk_freq, 964 + G762_PULSE_FROM_REG(data->fan_cmd1), 965 + G762_CLKDIV_FROM_REG(data->fan_cmd1), 966 + G762_GEARMULT_FROM_REG(data->fan_cmd2)); 967 + mutex_unlock(&data->update_lock); 968 + 969 + return sprintf(buf, "%u\n", rpm); 970 + } 971 + 972 + static ssize_t set_fan_target(struct device *dev, struct device_attribute *da, 973 + const char *buf, size_t count) 974 + { 975 + unsigned long val; 976 + int ret; 977 + 978 + if (kstrtoul(buf, 10, &val)) 979 + return -EINVAL; 980 + 981 + ret = do_set_fan_target(dev, val); 982 + if (ret < 0) 983 + return ret; 984 + 985 + return count; 986 + } 987 + 988 + /* read function for fan1_fault sysfs file. */ 989 + static ssize_t get_fan_failure(struct device *dev, struct device_attribute *da, 990 + char *buf) 991 + { 992 + struct g762_data *data = g762_update_client(dev); 993 + 994 + if (IS_ERR(data)) 995 + return PTR_ERR(data); 996 + 997 + return sprintf(buf, "%u\n", !!(data->fan_sta & G762_REG_FAN_STA_FAIL)); 998 + } 999 + 1000 + /* 1001 + * read function for fan1_alarm sysfs file. Note that OOC condition is 1002 + * enabled low 1003 + */ 1004 + static ssize_t get_fan_ooc(struct device *dev, struct device_attribute *da, 1005 + char *buf) 1006 + { 1007 + struct g762_data *data = g762_update_client(dev); 1008 + 1009 + if (IS_ERR(data)) 1010 + return PTR_ERR(data); 1011 + 1012 + return sprintf(buf, "%u\n", !(data->fan_sta & G762_REG_FAN_STA_OOC)); 1013 + } 1014 + 1015 + static DEVICE_ATTR(pwm1, S_IWUSR | S_IRUGO, get_pwm, set_pwm); 1016 + static DEVICE_ATTR(pwm1_mode, S_IWUSR | S_IRUGO, get_pwm_mode, set_pwm_mode); 1017 + static DEVICE_ATTR(pwm1_enable, S_IWUSR | S_IRUGO, 1018 + get_pwm_enable, set_pwm_enable); 1019 + static DEVICE_ATTR(fan1_input, S_IRUGO, get_fan_rpm, NULL); 1020 + static DEVICE_ATTR(fan1_alarm, S_IRUGO, get_fan_ooc, NULL); 1021 + static DEVICE_ATTR(fan1_fault, S_IRUGO, get_fan_failure, NULL); 1022 + static DEVICE_ATTR(fan1_target, S_IWUSR | S_IRUGO, 1023 + get_fan_target, set_fan_target); 1024 + static DEVICE_ATTR(fan1_div, S_IWUSR | S_IRUGO, get_fan_div, set_fan_div); 1025 + static DEVICE_ATTR(fan1_pulses, S_IWUSR | S_IRUGO, 1026 + get_fan_pulses, set_fan_pulses); 1027 + 1028 + /* Driver data */ 1029 + static struct attribute *g762_attributes[] = { 1030 + &dev_attr_fan1_input.attr, 1031 + &dev_attr_fan1_alarm.attr, 1032 + &dev_attr_fan1_fault.attr, 1033 + &dev_attr_fan1_target.attr, 1034 + &dev_attr_fan1_div.attr, 1035 + &dev_attr_fan1_pulses.attr, 1036 + &dev_attr_pwm1.attr, 1037 + &dev_attr_pwm1_mode.attr, 1038 + &dev_attr_pwm1_enable.attr, 1039 + NULL 1040 + }; 1041 + 1042 + static const struct attribute_group g762_group = { 1043 + .attrs = g762_attributes, 1044 + }; 1045 + 1046 + /* 1047 + * Enable both fan failure detection and fan out of control protection. The 1048 + * function does not protect change/access to data structure; it must thus 1049 + * only be called during initialization. 1050 + */ 1051 + static inline int g762_fan_init(struct device *dev) 1052 + { 1053 + struct i2c_client *client = to_i2c_client(dev); 1054 + struct g762_data *data = g762_update_client(dev); 1055 + 1056 + if (IS_ERR(data)) 1057 + return PTR_ERR(data); 1058 + 1059 + data->fan_cmd1 |= G762_REG_FAN_CMD1_DET_FAN_FAIL; 1060 + data->fan_cmd1 |= G762_REG_FAN_CMD1_DET_FAN_OOC; 1061 + data->valid = false; 1062 + 1063 + return i2c_smbus_write_byte_data(client, G762_REG_FAN_CMD1, 1064 + data->fan_cmd1); 1065 + } 1066 + 1067 + static int g762_probe(struct i2c_client *client, const struct i2c_device_id *id) 1068 + { 1069 + struct g762_data *data; 1070 + int ret; 1071 + 1072 + if (!i2c_check_functionality(client->adapter, 1073 + I2C_FUNC_SMBUS_BYTE_DATA)) 1074 + return -ENODEV; 1075 + 1076 + data = devm_kzalloc(&client->dev, sizeof(struct g762_data), GFP_KERNEL); 1077 + if (!data) 1078 + return -ENOMEM; 1079 + 1080 + i2c_set_clientdata(client, data); 1081 + data->client = client; 1082 + mutex_init(&data->update_lock); 1083 + 1084 + /* Enable fan failure detection and fan out of control protection */ 1085 + ret = g762_fan_init(&client->dev); 1086 + if (ret) 1087 + return ret; 1088 + 1089 + /* Get configuration via DT ... */ 1090 + ret = g762_of_clock_enable(client); 1091 + if (ret) 1092 + return ret; 1093 + ret = g762_of_prop_import(client); 1094 + if (ret) 1095 + goto clock_dis; 1096 + /* ... or platform_data */ 1097 + ret = g762_pdata_prop_import(client); 1098 + if (ret) 1099 + goto clock_dis; 1100 + 1101 + /* Register sysfs hooks */ 1102 + ret = sysfs_create_group(&client->dev.kobj, &g762_group); 1103 + if (ret) 1104 + goto clock_dis; 1105 + 1106 + data->hwmon_dev = hwmon_device_register(&client->dev); 1107 + if (IS_ERR(data->hwmon_dev)) { 1108 + ret = PTR_ERR(data->hwmon_dev); 1109 + goto sysfs_rem; 1110 + } 1111 + 1112 + return 0; 1113 + 1114 + sysfs_rem: 1115 + sysfs_remove_group(&client->dev.kobj, &g762_group); 1116 + 1117 + clock_dis: 1118 + g762_of_clock_disable(client); 1119 + 1120 + return ret; 1121 + } 1122 + 1123 + static int g762_remove(struct i2c_client *client) 1124 + { 1125 + struct g762_data *data = i2c_get_clientdata(client); 1126 + 1127 + hwmon_device_unregister(data->hwmon_dev); 1128 + sysfs_remove_group(&client->dev.kobj, &g762_group); 1129 + g762_of_clock_disable(client); 1130 + 1131 + return 0; 1132 + } 1133 + 1134 + static struct i2c_driver g762_driver = { 1135 + .driver = { 1136 + .name = DRVNAME, 1137 + .owner = THIS_MODULE, 1138 + .of_match_table = of_match_ptr(g762_dt_match), 1139 + }, 1140 + .probe = g762_probe, 1141 + .remove = g762_remove, 1142 + .id_table = g762_id, 1143 + }; 1144 + 1145 + module_i2c_driver(g762_driver); 1146 + 1147 + MODULE_AUTHOR("Arnaud EBALARD <arno@natisbad.org>"); 1148 + MODULE_DESCRIPTION("GMT G762/G763 driver"); 1149 + MODULE_LICENSE("GPL");
-2
drivers/hwmon/i5k_amb.c
··· 556 556 557 557 err_init_failed: 558 558 iounmap(data->amb_mmio); 559 - platform_set_drvdata(pdev, NULL); 560 559 err_map_failed: 561 560 release_mem_region(data->amb_base, data->amb_len); 562 561 err: ··· 575 576 kfree(data->attrs); 576 577 iounmap(data->amb_mmio); 577 578 release_mem_region(data->amb_base, data->amb_len); 578 - platform_set_drvdata(pdev, NULL); 579 579 kfree(data); 580 580 return 0; 581 581 }
+1
drivers/hwmon/iio_hwmon.c
··· 180 180 { .compatible = "iio-hwmon", }, 181 181 { } 182 182 }; 183 + MODULE_DEVICE_TABLE(of, iio_hwmon_of_match); 183 184 184 185 static struct platform_driver __refdata iio_hwmon_driver = { 185 186 .driver = {
+5
drivers/hwmon/ina2xx.c
··· 34 34 #include <linux/hwmon.h> 35 35 #include <linux/hwmon-sysfs.h> 36 36 #include <linux/jiffies.h> 37 + #include <linux/of.h> 37 38 38 39 #include <linux/platform_data/ina2xx.h> 39 40 ··· 222 221 struct ina2xx_data *data; 223 222 struct ina2xx_platform_data *pdata; 224 223 int ret; 224 + u32 val; 225 225 long shunt = 10000; /* default shunt value 10mOhms */ 226 226 227 227 if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_WORD_DATA)) ··· 236 234 pdata = 237 235 (struct ina2xx_platform_data *)client->dev.platform_data; 238 236 shunt = pdata->shunt_uohms; 237 + } else if (!of_property_read_u32(client->dev.of_node, 238 + "shunt-resistor", &val)) { 239 + shunt = val; 239 240 } 240 241 241 242 if (shunt <= 0)
+64 -28
drivers/hwmon/nct6775.c
··· 199 199 0, 1, 2, 3, 8, 21, 20, 16, /* in0.. in7 */ 200 200 17, -1, -1, -1, -1, -1, -1, /* in8..in14 */ 201 201 -1, /* unused */ 202 - 6, 7, 11, 10, 23, /* fan1..fan5 */ 202 + 6, 7, 11, -1, -1, /* fan1..fan5 */ 203 203 -1, -1, -1, /* unused */ 204 204 4, 5, 13, -1, -1, -1, /* temp1..temp6 */ 205 205 12, -1 }; /* intrusion0, intrusion1 */ ··· 625 625 u8 has_fan_min; /* some fans don't have min register */ 626 626 bool has_fan_div; 627 627 628 + u8 num_temp_alarms; /* 2 or 3 */ 628 629 u8 temp_fixed_num; /* 3 or 6 */ 629 630 u8 temp_type[NUM_TEMP_FIXED]; 630 631 s8 temp_offset[NUM_TEMP_FIXED]; ··· 1192 1191 int nr = data->ALARM_BITS[sattr->index]; 1193 1192 return sprintf(buf, "%u\n", 1194 1193 (unsigned int)((data->alarms >> nr) & 0x01)); 1194 + } 1195 + 1196 + static int find_temp_source(struct nct6775_data *data, int index, int count) 1197 + { 1198 + int source = data->temp_src[index]; 1199 + int nr; 1200 + 1201 + for (nr = 0; nr < count; nr++) { 1202 + int src; 1203 + 1204 + src = nct6775_read_value(data, 1205 + data->REG_TEMP_SOURCE[nr]) & 0x1f; 1206 + if (src == source) 1207 + return nr; 1208 + } 1209 + return -1; 1210 + } 1211 + 1212 + static ssize_t 1213 + show_temp_alarm(struct device *dev, struct device_attribute *attr, char *buf) 1214 + { 1215 + struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr); 1216 + struct nct6775_data *data = nct6775_update_device(dev); 1217 + unsigned int alarm = 0; 1218 + int nr; 1219 + 1220 + /* 1221 + * For temperatures, there is no fixed mapping from registers to alarm 1222 + * bits. Alarm bits are determined by the temperature source mapping. 1223 + */ 1224 + nr = find_temp_source(data, sattr->index, data->num_temp_alarms); 1225 + if (nr >= 0) { 1226 + int bit = data->ALARM_BITS[nr + TEMP_ALARM_BASE]; 1227 + alarm = (data->alarms >> bit) & 0x01; 1228 + } 1229 + return sprintf(buf, "%u\n", alarm); 1195 1230 } 1196 1231 1197 1232 static SENSOR_DEVICE_ATTR_2(in0_input, S_IRUGO, show_in_reg, NULL, 0, 0); ··· 1911 1874 }; 1912 1875 1913 1876 static struct sensor_device_attribute sda_temp_alarm[] = { 1914 - SENSOR_ATTR(temp1_alarm, S_IRUGO, show_alarm, NULL, 1915 - TEMP_ALARM_BASE), 1916 - SENSOR_ATTR(temp2_alarm, S_IRUGO, show_alarm, NULL, 1917 - TEMP_ALARM_BASE + 1), 1918 - SENSOR_ATTR(temp3_alarm, S_IRUGO, show_alarm, NULL, 1919 - TEMP_ALARM_BASE + 2), 1920 - SENSOR_ATTR(temp4_alarm, S_IRUGO, show_alarm, NULL, 1921 - TEMP_ALARM_BASE + 3), 1922 - SENSOR_ATTR(temp5_alarm, S_IRUGO, show_alarm, NULL, 1923 - TEMP_ALARM_BASE + 4), 1924 - SENSOR_ATTR(temp6_alarm, S_IRUGO, show_alarm, NULL, 1925 - TEMP_ALARM_BASE + 5), 1877 + SENSOR_ATTR(temp1_alarm, S_IRUGO, show_temp_alarm, NULL, 0), 1878 + SENSOR_ATTR(temp2_alarm, S_IRUGO, show_temp_alarm, NULL, 1), 1879 + SENSOR_ATTR(temp3_alarm, S_IRUGO, show_temp_alarm, NULL, 2), 1880 + SENSOR_ATTR(temp4_alarm, S_IRUGO, show_temp_alarm, NULL, 3), 1881 + SENSOR_ATTR(temp5_alarm, S_IRUGO, show_temp_alarm, NULL, 4), 1882 + SENSOR_ATTR(temp6_alarm, S_IRUGO, show_temp_alarm, NULL, 5), 1883 + SENSOR_ATTR(temp7_alarm, S_IRUGO, show_temp_alarm, NULL, 6), 1884 + SENSOR_ATTR(temp8_alarm, S_IRUGO, show_temp_alarm, NULL, 7), 1885 + SENSOR_ATTR(temp9_alarm, S_IRUGO, show_temp_alarm, NULL, 8), 1886 + SENSOR_ATTR(temp10_alarm, S_IRUGO, show_temp_alarm, NULL, 9), 1926 1887 }; 1927 - 1928 - #define NUM_TEMP_ALARM ARRAY_SIZE(sda_temp_alarm) 1929 1888 1930 1889 static ssize_t 1931 1890 show_pwm_mode(struct device *dev, struct device_attribute *attr, char *buf) ··· 3248 3215 device_remove_file(dev, &sda_temp_max[i].dev_attr); 3249 3216 device_remove_file(dev, &sda_temp_max_hyst[i].dev_attr); 3250 3217 device_remove_file(dev, &sda_temp_crit[i].dev_attr); 3218 + device_remove_file(dev, &sda_temp_alarm[i].dev_attr); 3251 3219 if (!(data->have_temp_fixed & (1 << i))) 3252 3220 continue; 3253 3221 device_remove_file(dev, &sda_temp_type[i].dev_attr); 3254 3222 device_remove_file(dev, &sda_temp_offset[i].dev_attr); 3255 - if (i >= NUM_TEMP_ALARM) 3256 - continue; 3257 - device_remove_file(dev, &sda_temp_alarm[i].dev_attr); 3258 3223 } 3259 3224 3260 3225 device_remove_file(dev, &sda_caseopen[0].dev_attr); ··· 3450 3419 data->auto_pwm_num = 6; 3451 3420 data->has_fan_div = true; 3452 3421 data->temp_fixed_num = 3; 3422 + data->num_temp_alarms = 3; 3453 3423 3454 3424 data->ALARM_BITS = NCT6775_ALARM_BITS; 3455 3425 ··· 3515 3483 data->auto_pwm_num = 4; 3516 3484 data->has_fan_div = false; 3517 3485 data->temp_fixed_num = 3; 3486 + data->num_temp_alarms = 3; 3518 3487 3519 3488 data->ALARM_BITS = NCT6776_ALARM_BITS; 3520 3489 ··· 3580 3547 data->auto_pwm_num = 4; 3581 3548 data->has_fan_div = false; 3582 3549 data->temp_fixed_num = 6; 3550 + data->num_temp_alarms = 2; 3583 3551 3584 3552 data->ALARM_BITS = NCT6779_ALARM_BITS; 3585 3553 ··· 3877 3843 &sda_fan_input[i].dev_attr); 3878 3844 if (err) 3879 3845 goto exit_remove; 3880 - err = device_create_file(dev, 3881 - &sda_fan_alarm[i].dev_attr); 3882 - if (err) 3883 - goto exit_remove; 3846 + if (data->ALARM_BITS[FAN_ALARM_BASE + i] >= 0) { 3847 + err = device_create_file(dev, 3848 + &sda_fan_alarm[i].dev_attr); 3849 + if (err) 3850 + goto exit_remove; 3851 + } 3884 3852 if (data->kind != nct6776 && 3885 3853 data->kind != nct6779) { 3886 3854 err = device_create_file(dev, ··· 3933 3897 if (err) 3934 3898 goto exit_remove; 3935 3899 } 3900 + if (find_temp_source(data, i, data->num_temp_alarms) >= 0) { 3901 + err = device_create_file(dev, 3902 + &sda_temp_alarm[i].dev_attr); 3903 + if (err) 3904 + goto exit_remove; 3905 + } 3936 3906 if (!(data->have_temp_fixed & (1 << i))) 3937 3907 continue; 3938 3908 err = device_create_file(dev, &sda_temp_type[i].dev_attr); 3939 3909 if (err) 3940 3910 goto exit_remove; 3941 3911 err = device_create_file(dev, &sda_temp_offset[i].dev_attr); 3942 - if (err) 3943 - goto exit_remove; 3944 - if (i >= NUM_TEMP_ALARM || 3945 - data->ALARM_BITS[TEMP_ALARM_BASE + i] < 0) 3946 - continue; 3947 - err = device_create_file(dev, &sda_temp_alarm[i].dev_attr); 3948 3912 if (err) 3949 3913 goto exit_remove; 3950 3914 }
-1
drivers/hwmon/ntc_thermistor.c
··· 514 514 hwmon_device_unregister(data->hwmon_dev); 515 515 sysfs_remove_group(&data->dev->kobj, &ntc_attr_group); 516 516 ntc_iio_channel_release(pdata); 517 - platform_set_drvdata(pdev, NULL); 518 517 519 518 return 0; 520 519 }
-2
drivers/hwmon/w83627ehf.c
··· 2598 2598 exit_remove: 2599 2599 w83627ehf_device_remove_files(dev); 2600 2600 exit_release: 2601 - platform_set_drvdata(pdev, NULL); 2602 2601 release_region(res->start, IOREGION_LENGTH); 2603 2602 exit: 2604 2603 return err; ··· 2610 2611 hwmon_device_unregister(data->hwmon_dev); 2611 2612 w83627ehf_device_remove_files(&pdev->dev); 2612 2613 release_region(data->addr, IOREGION_LENGTH); 2613 - platform_set_drvdata(pdev, NULL); 2614 2614 2615 2615 return 0; 2616 2616 }
+37
include/linux/platform_data/g762.h
··· 1 + /* 2 + * Platform data structure for g762 fan controller driver 3 + * 4 + * Copyright (C) 2013, Arnaud EBALARD <arno@natisbad.org> 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 + * You should have received a copy of the GNU General Public License 17 + * along with this program; if not, write to the Free Software 18 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 19 + */ 20 + #ifndef __LINUX_PLATFORM_DATA_G762_H__ 21 + #define __LINUX_PLATFORM_DATA_G762_H__ 22 + 23 + /* 24 + * Following structure can be used to set g762 driver platform specific data 25 + * during board init. Note that passing a sparse structure is possible but 26 + * will result in non-specified attributes to be set to default value, hence 27 + * overloading those installed during boot (e.g. by u-boot). 28 + */ 29 + 30 + struct g762_platform_data { 31 + u32 fan_startv; 32 + u32 fan_gear_mode; 33 + u32 pwm_polarity; 34 + u32 clk_freq; 35 + }; 36 + 37 + #endif /* __LINUX_PLATFORM_DATA_G762_H__ */