Merge branch 'hwmon-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jdelvare/staging
* 'hwmon-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jdelvare/staging: hwmon: (applesmc) Switch maintainers hwmon: (applesmc) Add iMac9,1 and MacBookPro2,2 support hwmon: (it87) Invalidate cache on temperature sensor change hwmon: (it87) Properly handle wrong sensor type requests hwmon: (it87) Don't arbitrarily enable temperature channels hwmon: (sht15) Properly handle the case CONFIG_REGULATOR=n hwmon: (sht15) Fix sht15_calc_temp interpolation function
This commit is contained in:
Коммит
f5c07a2d8a
|
@ -485,8 +485,8 @@ S: Maintained
|
|||
F: drivers/input/mouse/bcm5974.c
|
||||
|
||||
APPLE SMC DRIVER
|
||||
M: Nicolas Boichat <nicolas@boichat.ch>
|
||||
L: mactel-linux-devel@lists.sourceforge.net
|
||||
M: Henrik Rydberg <rydberg@euromail.se>
|
||||
L: lm-sensors@lm-sensors.org
|
||||
S: Maintained
|
||||
F: drivers/hwmon/applesmc.c
|
||||
|
||||
|
|
|
@ -142,6 +142,12 @@ static const char *temperature_sensors_sets[][41] = {
|
|||
"TM1S", "TM2P", "TM2S", "TM3S", "TM8P", "TM8S", "TM9P", "TM9S",
|
||||
"TN0C", "TN0D", "TN0H", "TS0C", "Tp0C", "Tp1C", "Tv0S", "Tv1S",
|
||||
NULL },
|
||||
/* Set 17: iMac 9,1 */
|
||||
{ "TA0P", "TC0D", "TC0H", "TC0P", "TG0D", "TG0H", "TH0P", "TL0P",
|
||||
"TN0D", "TN0H", "TN0P", "TO0P", "Tm0P", "Tp0P", NULL },
|
||||
/* Set 18: MacBook Pro 2,2 */
|
||||
{ "TB0T", "TC0D", "TC0P", "TG0H", "TG0P", "TG0T", "TM0P", "TTF0",
|
||||
"Th0H", "Th1H", "Tm0P", "Ts0P", NULL },
|
||||
};
|
||||
|
||||
/* List of keys used to read/write fan speeds */
|
||||
|
@ -1350,6 +1356,10 @@ static __initdata struct dmi_match_data applesmc_dmi_data[] = {
|
|||
{ .accelerometer = 1, .light = 1, .temperature_set = 15 },
|
||||
/* MacPro3,1: temperature set 16 */
|
||||
{ .accelerometer = 0, .light = 0, .temperature_set = 16 },
|
||||
/* iMac 9,1: light sensor only, temperature set 17 */
|
||||
{ .accelerometer = 0, .light = 0, .temperature_set = 17 },
|
||||
/* MacBook Pro 2,2: accelerometer, backlight and temperature set 18 */
|
||||
{ .accelerometer = 1, .light = 1, .temperature_set = 18 },
|
||||
};
|
||||
|
||||
/* Note that DMI_MATCH(...,"MacBook") will match "MacBookPro1,1".
|
||||
|
@ -1375,6 +1385,10 @@ static __initdata struct dmi_system_id applesmc_whitelist[] = {
|
|||
DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro3") },
|
||||
&applesmc_dmi_data[9]},
|
||||
{ applesmc_dmi_match, "Apple MacBook Pro 2,2", {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "Apple Computer, Inc."),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro2,2") },
|
||||
&applesmc_dmi_data[18]},
|
||||
{ applesmc_dmi_match, "Apple MacBook Pro", {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR,"Apple"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME,"MacBookPro") },
|
||||
|
@ -1415,6 +1429,10 @@ static __initdata struct dmi_system_id applesmc_whitelist[] = {
|
|||
DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "MacPro") },
|
||||
&applesmc_dmi_data[4]},
|
||||
{ applesmc_dmi_match, "Apple iMac 9,1", {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "Apple Inc."),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "iMac9,1") },
|
||||
&applesmc_dmi_data[17]},
|
||||
{ applesmc_dmi_match, "Apple iMac 8", {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "iMac8") },
|
||||
|
|
|
@ -539,14 +539,14 @@ static ssize_t set_sensor(struct device *dev, struct device_attribute *attr,
|
|||
|
||||
struct it87_data *data = dev_get_drvdata(dev);
|
||||
long val;
|
||||
u8 reg;
|
||||
|
||||
if (strict_strtol(buf, 10, &val) < 0)
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&data->update_lock);
|
||||
|
||||
data->sensor &= ~(1 << nr);
|
||||
data->sensor &= ~(8 << nr);
|
||||
reg = it87_read_value(data, IT87_REG_TEMP_ENABLE);
|
||||
reg &= ~(1 << nr);
|
||||
reg &= ~(8 << nr);
|
||||
if (val == 2) { /* backwards compatibility */
|
||||
dev_warn(dev, "Sensor type 2 is deprecated, please use 4 "
|
||||
"instead\n");
|
||||
|
@ -554,14 +554,16 @@ static ssize_t set_sensor(struct device *dev, struct device_attribute *attr,
|
|||
}
|
||||
/* 3 = thermal diode; 4 = thermistor; 0 = disabled */
|
||||
if (val == 3)
|
||||
data->sensor |= 1 << nr;
|
||||
reg |= 1 << nr;
|
||||
else if (val == 4)
|
||||
data->sensor |= 8 << nr;
|
||||
else if (val != 0) {
|
||||
mutex_unlock(&data->update_lock);
|
||||
reg |= 8 << nr;
|
||||
else if (val != 0)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
mutex_lock(&data->update_lock);
|
||||
data->sensor = reg;
|
||||
it87_write_value(data, IT87_REG_TEMP_ENABLE, data->sensor);
|
||||
data->valid = 0; /* Force cache refresh */
|
||||
mutex_unlock(&data->update_lock);
|
||||
return count;
|
||||
}
|
||||
|
@ -1841,14 +1843,10 @@ static void __devinit it87_init_device(struct platform_device *pdev)
|
|||
it87_write_value(data, IT87_REG_TEMP_HIGH(i), 127);
|
||||
}
|
||||
|
||||
/* Check if temperature channels are reset manually or by some reason */
|
||||
tmp = it87_read_value(data, IT87_REG_TEMP_ENABLE);
|
||||
if ((tmp & 0x3f) == 0) {
|
||||
/* Temp1,Temp3=thermistor; Temp2=thermal diode */
|
||||
tmp = (tmp & 0xc0) | 0x2a;
|
||||
it87_write_value(data, IT87_REG_TEMP_ENABLE, tmp);
|
||||
}
|
||||
data->sensor = tmp;
|
||||
/* Temperature channels are not forcibly enabled, as they can be
|
||||
* set to two different sensor types and we can't guess which one
|
||||
* is correct for a given system. These channels can be enabled at
|
||||
* run-time through the temp{1-3}_type sysfs accessors if needed. */
|
||||
|
||||
/* Check if voltage monitors are reset manually or by some reason */
|
||||
tmp = it87_read_value(data, IT87_REG_VIN_ENABLE);
|
||||
|
|
|
@ -303,13 +303,13 @@ error_ret:
|
|||
**/
|
||||
static inline int sht15_calc_temp(struct sht15_data *data)
|
||||
{
|
||||
int d1 = 0;
|
||||
int d1 = temppoints[0].d1;
|
||||
int i;
|
||||
|
||||
for (i = 1; i < ARRAY_SIZE(temppoints); i++)
|
||||
for (i = ARRAY_SIZE(temppoints) - 1; i > 0; i--)
|
||||
/* Find pointer to interpolate */
|
||||
if (data->supply_uV > temppoints[i - 1].vdd) {
|
||||
d1 = (data->supply_uV/1000 - temppoints[i - 1].vdd)
|
||||
d1 = (data->supply_uV - temppoints[i - 1].vdd)
|
||||
* (temppoints[i].d1 - temppoints[i - 1].d1)
|
||||
/ (temppoints[i].vdd - temppoints[i - 1].vdd)
|
||||
+ temppoints[i - 1].d1;
|
||||
|
@ -542,7 +542,12 @@ static int __devinit sht15_probe(struct platform_device *pdev)
|
|||
/* If a regulator is available, query what the supply voltage actually is!*/
|
||||
data->reg = regulator_get(data->dev, "vcc");
|
||||
if (!IS_ERR(data->reg)) {
|
||||
data->supply_uV = regulator_get_voltage(data->reg);
|
||||
int voltage;
|
||||
|
||||
voltage = regulator_get_voltage(data->reg);
|
||||
if (voltage)
|
||||
data->supply_uV = voltage;
|
||||
|
||||
regulator_enable(data->reg);
|
||||
/* setup a notifier block to update this if another device
|
||||
* causes the voltage to change */
|
||||
|
|
Загрузка…
Ссылка в новой задаче