lm70.c (5489B)
1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * lm70.c 4 * 5 * The LM70 is a temperature sensor chip from National Semiconductor (NS). 6 * Copyright (C) 2006 Kaiwan N Billimoria <kaiwan@designergraphix.com> 7 * 8 * The LM70 communicates with a host processor via an SPI/Microwire Bus 9 * interface. The complete datasheet is available at National's website 10 * here: 11 * http://www.national.com/pf/LM/LM70.html 12 */ 13 14#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 15 16#include <linux/init.h> 17#include <linux/module.h> 18#include <linux/kernel.h> 19#include <linux/device.h> 20#include <linux/err.h> 21#include <linux/sysfs.h> 22#include <linux/hwmon.h> 23#include <linux/mutex.h> 24#include <linux/mod_devicetable.h> 25#include <linux/of.h> 26#include <linux/property.h> 27#include <linux/spi/spi.h> 28#include <linux/slab.h> 29 30#define DRVNAME "lm70" 31 32#define LM70_CHIP_LM70 0 /* original NS LM70 */ 33#define LM70_CHIP_TMP121 1 /* TI TMP121/TMP123 */ 34#define LM70_CHIP_LM71 2 /* NS LM71 */ 35#define LM70_CHIP_LM74 3 /* NS LM74 */ 36#define LM70_CHIP_TMP122 4 /* TI TMP122/TMP124 */ 37#define LM70_CHIP_TMP125 5 /* TI TMP125 */ 38 39struct lm70 { 40 struct spi_device *spi; 41 struct mutex lock; 42 unsigned int chip; 43}; 44 45/* sysfs hook function */ 46static ssize_t temp1_input_show(struct device *dev, 47 struct device_attribute *attr, char *buf) 48{ 49 struct lm70 *p_lm70 = dev_get_drvdata(dev); 50 struct spi_device *spi = p_lm70->spi; 51 int status, val = 0; 52 u8 rxbuf[2]; 53 s16 raw = 0; 54 55 if (mutex_lock_interruptible(&p_lm70->lock)) 56 return -ERESTARTSYS; 57 58 /* 59 * spi_read() requires a DMA-safe buffer; so we use 60 * spi_write_then_read(), transmitting 0 bytes. 61 */ 62 status = spi_write_then_read(spi, NULL, 0, &rxbuf[0], 2); 63 if (status < 0) { 64 dev_warn(dev, "spi_write_then_read failed with status %d\n", 65 status); 66 goto out; 67 } 68 raw = (rxbuf[0] << 8) + rxbuf[1]; 69 dev_dbg(dev, "rxbuf[0] : 0x%02x rxbuf[1] : 0x%02x raw=0x%04x\n", 70 rxbuf[0], rxbuf[1], raw); 71 72 /* 73 * LM70: 74 * The "raw" temperature read into rxbuf[] is a 16-bit signed 2's 75 * complement value. Only the MSB 11 bits (1 sign + 10 temperature 76 * bits) are meaningful; the LSB 5 bits are to be discarded. 77 * See the datasheet. 78 * 79 * Further, each bit represents 0.25 degrees Celsius; so, multiply 80 * by 0.25. Also multiply by 1000 to represent in millidegrees 81 * Celsius. 82 * So it's equivalent to multiplying by 0.25 * 1000 = 250. 83 * 84 * LM74 and TMP121/TMP122/TMP123/TMP124: 85 * 13 bits of 2's complement data, discard LSB 3 bits, 86 * resolution 0.0625 degrees celsius. 87 * 88 * LM71: 89 * 14 bits of 2's complement data, discard LSB 2 bits, 90 * resolution 0.0312 degrees celsius. 91 * 92 * TMP125: 93 * MSB/D15 is a leading zero. D14 is the sign-bit. This is 94 * followed by 9 temperature bits (D13..D5) in 2's complement 95 * data format with a resolution of 0.25 degrees celsius per unit. 96 * LSB 5 bits (D4..D0) share the same value as D5 and get discarded. 97 */ 98 switch (p_lm70->chip) { 99 case LM70_CHIP_LM70: 100 val = ((int)raw / 32) * 250; 101 break; 102 103 case LM70_CHIP_TMP121: 104 case LM70_CHIP_TMP122: 105 case LM70_CHIP_LM74: 106 val = ((int)raw / 8) * 625 / 10; 107 break; 108 109 case LM70_CHIP_LM71: 110 val = ((int)raw / 4) * 3125 / 100; 111 break; 112 113 case LM70_CHIP_TMP125: 114 val = (sign_extend32(raw, 14) / 32) * 250; 115 break; 116 } 117 118 status = sprintf(buf, "%d\n", val); /* millidegrees Celsius */ 119out: 120 mutex_unlock(&p_lm70->lock); 121 return status; 122} 123 124static DEVICE_ATTR_RO(temp1_input); 125 126static struct attribute *lm70_attrs[] = { 127 &dev_attr_temp1_input.attr, 128 NULL 129}; 130 131ATTRIBUTE_GROUPS(lm70); 132 133/*----------------------------------------------------------------------*/ 134 135#ifdef CONFIG_OF 136static const struct of_device_id lm70_of_ids[] = { 137 { 138 .compatible = "ti,lm70", 139 .data = (void *) LM70_CHIP_LM70, 140 }, 141 { 142 .compatible = "ti,tmp121", 143 .data = (void *) LM70_CHIP_TMP121, 144 }, 145 { 146 .compatible = "ti,tmp122", 147 .data = (void *) LM70_CHIP_TMP122, 148 }, 149 { 150 .compatible = "ti,tmp125", 151 .data = (void *) LM70_CHIP_TMP125, 152 }, 153 { 154 .compatible = "ti,lm71", 155 .data = (void *) LM70_CHIP_LM71, 156 }, 157 { 158 .compatible = "ti,lm74", 159 .data = (void *) LM70_CHIP_LM74, 160 }, 161 {}, 162}; 163MODULE_DEVICE_TABLE(of, lm70_of_ids); 164#endif 165 166static int lm70_probe(struct spi_device *spi) 167{ 168 struct device *hwmon_dev; 169 struct lm70 *p_lm70; 170 int chip; 171 172 if (dev_fwnode(&spi->dev)) 173 chip = (int)(uintptr_t)device_get_match_data(&spi->dev); 174 else 175 chip = spi_get_device_id(spi)->driver_data; 176 177 178 /* signaling is SPI_MODE_0 */ 179 if ((spi->mode & SPI_MODE_X_MASK) != SPI_MODE_0) 180 return -EINVAL; 181 182 /* NOTE: we assume 8-bit words, and convert to 16 bits manually */ 183 184 p_lm70 = devm_kzalloc(&spi->dev, sizeof(*p_lm70), GFP_KERNEL); 185 if (!p_lm70) 186 return -ENOMEM; 187 188 mutex_init(&p_lm70->lock); 189 p_lm70->chip = chip; 190 p_lm70->spi = spi; 191 192 hwmon_dev = devm_hwmon_device_register_with_groups(&spi->dev, 193 spi->modalias, 194 p_lm70, lm70_groups); 195 return PTR_ERR_OR_ZERO(hwmon_dev); 196} 197 198static const struct spi_device_id lm70_ids[] = { 199 { "lm70", LM70_CHIP_LM70 }, 200 { "tmp121", LM70_CHIP_TMP121 }, 201 { "tmp122", LM70_CHIP_TMP122 }, 202 { "tmp125", LM70_CHIP_TMP125 }, 203 { "lm71", LM70_CHIP_LM71 }, 204 { "lm74", LM70_CHIP_LM74 }, 205 { }, 206}; 207MODULE_DEVICE_TABLE(spi, lm70_ids); 208 209static struct spi_driver lm70_driver = { 210 .driver = { 211 .name = "lm70", 212 .of_match_table = of_match_ptr(lm70_of_ids), 213 }, 214 .id_table = lm70_ids, 215 .probe = lm70_probe, 216}; 217 218module_spi_driver(lm70_driver); 219 220MODULE_AUTHOR("Kaiwan N Billimoria"); 221MODULE_DESCRIPTION("NS LM70 and compatibles Linux driver"); 222MODULE_LICENSE("GPL");