Commit cd929672 authored by Christian Lamparter's avatar Christian Lamparter Committed by Guenter Roeck

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: default avatarChristian Lamparter <chunkeey@gmail.com>
Link: https://lore.kernel.org/r/43b19cbd4e7f51e9509e561b02b5d8d0e7079fac.1645175187.git.chunkeey@gmail.comSigned-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
parent 64b631fb
...@@ -15,6 +15,10 @@ Supported chips: ...@@ -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 ...@@ -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).
......
...@@ -1224,8 +1224,8 @@ config SENSORS_LM70 ...@@ -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.
......
...@@ -34,6 +34,7 @@ ...@@ -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, ...@@ -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, ...@@ -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[] = { ...@@ -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[] = { ...@@ -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 },
{ }, { },
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment