Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f5c07a2d authored by Linus Torvalds's avatar Linus Torvalds
Browse files
* '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
parents 7223b915 d618540f
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -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

+18 −0
Original line number Diff line number Diff line
@@ -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") },
+15 −17
Original line number Diff line number Diff line
@@ -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);
+9 −4
Original line number Diff line number Diff line
@@ -303,13 +303,13 @@ static int sht15_update_vals(struct sht15_data *data)
 **/
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 */