hwmon: (lm70) Add ti,tmp125 support

The TMP125 is a 2 degree Celsius accurate Digital
Temperature Sensor with a SPI interface.

The temperature register is a 16-bit, read-only register.
The MSB (Bit 15) is a leading zero and never set. Bits 14
to 5 are the 1+9 temperature data bits in a two's
complement format. Bits 4 to 0 are useless copies of
Bit 5 value and therefore ignored.

This was tested on a Aerohive HiveAP-350.

Bonus: lm70 supports TMP122/TMP124 as well.
I added them to the Kconfig module description.

Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
Link: https://lore.kernel.org/r/43b19cbd4e7f51e9509e561b02b5d8d0e7079fac.1645175187.git.chunkeey@gmail.com
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
This commit is contained in:
Christian Lamparter 2022-02-18 10:06:43 +01:00 committed by Guenter Roeck
parent 64b631fb0c
commit cd929672a9
3 changed files with 25 additions and 2 deletions

View File

@ -15,6 +15,10 @@ Supported chips:
Information: https://www.ti.com/product/tmp122 Information: https://www.ti.com/product/tmp122
* Texas Instruments TMP125
Information: https://www.ti.com/product/tmp125
* National Semiconductor LM71 * National Semiconductor LM71
Datasheet: https://www.ti.com/product/LM71 Datasheet: https://www.ti.com/product/LM71
@ -53,6 +57,9 @@ The LM74 and TMP121/TMP122/TMP123/TMP124 are very similar; main difference is
The TMP122/TMP124 also feature configurable temperature thresholds. The TMP122/TMP124 also feature configurable temperature thresholds.
The TMP125 is less accurate and provides 10-bit temperature data
with 0.25 degrees Celsius resolution.
The LM71 is also very similar; main difference is 14-bit temperature The LM71 is also very similar; main difference is 14-bit temperature
data (0.03125 degrees celsius resolution). data (0.03125 degrees celsius resolution).

View File

@ -1224,8 +1224,8 @@ config SENSORS_LM70
depends on SPI_MASTER depends on SPI_MASTER
help help
If you say yes here you get support for the National Semiconductor If you say yes here you get support for the National Semiconductor
LM70, LM71, LM74 and Texas Instruments TMP121/TMP123 digital tempera- LM70, LM71, LM74 and Texas Instruments TMP121/TMP123, TMP122/TMP124,
ture sensor chips. TMP125 digital temperature sensor chips.
This driver can also be built as a module. If so, the module This driver can also be built as a module. If so, the module
will be called lm70. will be called lm70.

View File

@ -34,6 +34,7 @@
#define LM70_CHIP_LM71 2 /* NS LM71 */ #define LM70_CHIP_LM71 2 /* NS LM71 */
#define LM70_CHIP_LM74 3 /* NS LM74 */ #define LM70_CHIP_LM74 3 /* NS LM74 */
#define LM70_CHIP_TMP122 4 /* TI TMP122/TMP124 */ #define LM70_CHIP_TMP122 4 /* TI TMP122/TMP124 */
#define LM70_CHIP_TMP125 5 /* TI TMP125 */
struct lm70 { struct lm70 {
struct spi_device *spi; struct spi_device *spi;
@ -87,6 +88,12 @@ static ssize_t temp1_input_show(struct device *dev,
* LM71: * LM71:
* 14 bits of 2's complement data, discard LSB 2 bits, * 14 bits of 2's complement data, discard LSB 2 bits,
* resolution 0.0312 degrees celsius. * resolution 0.0312 degrees celsius.
*
* TMP125:
* MSB/D15 is a leading zero. D14 is the sign-bit. This is
* followed by 9 temperature bits (D13..D5) in 2's complement
* data format with a resolution of 0.25 degrees celsius per unit.
* LSB 5 bits (D4..D0) share the same value as D5 and get discarded.
*/ */
switch (p_lm70->chip) { switch (p_lm70->chip) {
case LM70_CHIP_LM70: case LM70_CHIP_LM70:
@ -102,6 +109,10 @@ static ssize_t temp1_input_show(struct device *dev,
case LM70_CHIP_LM71: case LM70_CHIP_LM71:
val = ((int)raw / 4) * 3125 / 100; val = ((int)raw / 4) * 3125 / 100;
break; break;
case LM70_CHIP_TMP125:
val = (sign_extend32(raw, 14) / 32) * 250;
break;
} }
status = sprintf(buf, "%d\n", val); /* millidegrees Celsius */ status = sprintf(buf, "%d\n", val); /* millidegrees Celsius */
@ -135,6 +146,10 @@ static const struct of_device_id lm70_of_ids[] = {
.compatible = "ti,tmp122", .compatible = "ti,tmp122",
.data = (void *) LM70_CHIP_TMP122, .data = (void *) LM70_CHIP_TMP122,
}, },
{
.compatible = "ti,tmp125",
.data = (void *) LM70_CHIP_TMP125,
},
{ {
.compatible = "ti,lm71", .compatible = "ti,lm71",
.data = (void *) LM70_CHIP_LM71, .data = (void *) LM70_CHIP_LM71,
@ -184,6 +199,7 @@ static const struct spi_device_id lm70_ids[] = {
{ "lm70", LM70_CHIP_LM70 }, { "lm70", LM70_CHIP_LM70 },
{ "tmp121", LM70_CHIP_TMP121 }, { "tmp121", LM70_CHIP_TMP121 },
{ "tmp122", LM70_CHIP_TMP122 }, { "tmp122", LM70_CHIP_TMP122 },
{ "tmp125", LM70_CHIP_TMP125 },
{ "lm71", LM70_CHIP_LM71 }, { "lm71", LM70_CHIP_LM71 },
{ "lm74", LM70_CHIP_LM74 }, { "lm74", LM70_CHIP_LM74 },
{ }, { },