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 38 struct lm70 { 39 struct spi_device *spi; 40 struct mutex lock; 41 unsigned int chip; 42 }; 43 44 /* sysfs hook function */ 45 static ssize_t temp1_input_show(struct device *dev, 46 struct device_attribute *attr, char *buf) 47 { 48 struct lm70 *p_lm70 = dev_get_drvdata(dev); 49 struct spi_device *spi = p_lm70->spi; 50 int status, val = 0; 51 u8 rxbuf[2]; 52 s16 raw = 0; 53 54 if (mutex_lock_interruptible(&p_lm70->lock)) 55 return -ERESTARTSYS; 56 57 /* 58 * spi_read() requires a DMA-safe buffer; so we use 59 * spi_write_then_read(), transmitting 0 bytes. 60 */ 61 status = spi_write_then_read(spi, NULL, 0, &rxbuf[0], 2); 62 if (status < 0) { 63 dev_warn(dev, "spi_write_then_read failed with status %d\n", 64 status); 65 goto out; 66 } 67 raw = (rxbuf[0] << 8) + rxbuf[1]; 68 dev_dbg(dev, "rxbuf[0] : 0x%02x rxbuf[1] : 0x%02x raw=0x%04x\n", 69 rxbuf[0], rxbuf[1], raw); 70 71 /* 72 * LM70: 73 * The "raw" temperature read into rxbuf[] is a 16-bit signed 2's 74 * complement value. Only the MSB 11 bits (1 sign + 10 temperature 75 * bits) are meaningful; the LSB 5 bits are to be discarded. 76 * See the datasheet. 77 * 78 * Further, each bit represents 0.25 degrees Celsius; so, multiply 79 * by 0.25. Also multiply by 1000 to represent in millidegrees 80 * Celsius. 81 * So it's equivalent to multiplying by 0.25 * 1000 = 250. 82 * 83 * LM74 and TMP121/TMP122/TMP123/TMP124: 84 * 13 bits of 2's complement data, discard LSB 3 bits, 85 * resolution 0.0625 degrees celsius. 86 * 87 * LM71: 88 * 14 bits of 2's complement data, discard LSB 2 bits, 89 * resolution 0.0312 degrees celsius. 90 */ 91 switch (p_lm70->chip) { 92 case LM70_CHIP_LM70: 93 val = ((int)raw / 32) * 250; 94 break; 95 96 case LM70_CHIP_TMP121: 97 case LM70_CHIP_TMP122: 98 case LM70_CHIP_LM74: 99 val = ((int)raw / 8) * 625 / 10; 100 break; 101 102 case LM70_CHIP_LM71: 103 val = ((int)raw / 4) * 3125 / 100; 104 break; 105 } 106 107 status = sprintf(buf, "%d\n", val); /* millidegrees Celsius */ 108 out: 109 mutex_unlock(&p_lm70->lock); 110 return status; 111 } 112 113 static DEVICE_ATTR_RO(temp1_input); 114 115 static struct attribute *lm70_attrs[] = { 116 &dev_attr_temp1_input.attr, 117 NULL 118 }; 119 120 ATTRIBUTE_GROUPS(lm70); 121 122 /*----------------------------------------------------------------------*/ 123 124 #ifdef CONFIG_OF 125 static const struct of_device_id lm70_of_ids[] = { 126 { 127 .compatible = "ti,lm70", 128 .data = (void *) LM70_CHIP_LM70, 129 }, 130 { 131 .compatible = "ti,tmp121", 132 .data = (void *) LM70_CHIP_TMP121, 133 }, 134 { 135 .compatible = "ti,tmp122", 136 .data = (void *) LM70_CHIP_TMP122, 137 }, 138 { 139 .compatible = "ti,lm71", 140 .data = (void *) LM70_CHIP_LM71, 141 }, 142 { 143 .compatible = "ti,lm74", 144 .data = (void *) LM70_CHIP_LM74, 145 }, 146 {}, 147 }; 148 MODULE_DEVICE_TABLE(of, lm70_of_ids); 149 #endif 150 151 static int lm70_probe(struct spi_device *spi) 152 { 153 struct device *hwmon_dev; 154 struct lm70 *p_lm70; 155 int chip; 156 157 if (dev_fwnode(&spi->dev)) 158 chip = (int)(uintptr_t)device_get_match_data(&spi->dev); 159 else 160 chip = spi_get_device_id(spi)->driver_data; 161 162 163 /* signaling is SPI_MODE_0 */ 164 if ((spi->mode & SPI_MODE_X_MASK) != SPI_MODE_0) 165 return -EINVAL; 166 167 /* NOTE: we assume 8-bit words, and convert to 16 bits manually */ 168 169 p_lm70 = devm_kzalloc(&spi->dev, sizeof(*p_lm70), GFP_KERNEL); 170 if (!p_lm70) 171 return -ENOMEM; 172 173 mutex_init(&p_lm70->lock); 174 p_lm70->chip = chip; 175 p_lm70->spi = spi; 176 177 hwmon_dev = devm_hwmon_device_register_with_groups(&spi->dev, 178 spi->modalias, 179 p_lm70, lm70_groups); 180 return PTR_ERR_OR_ZERO(hwmon_dev); 181 } 182 183 static const struct spi_device_id lm70_ids[] = { 184 { "lm70", LM70_CHIP_LM70 }, 185 { "tmp121", LM70_CHIP_TMP121 }, 186 { "tmp122", LM70_CHIP_TMP122 }, 187 { "lm71", LM70_CHIP_LM71 }, 188 { "lm74", LM70_CHIP_LM74 }, 189 { }, 190 }; 191 MODULE_DEVICE_TABLE(spi, lm70_ids); 192 193 static struct spi_driver lm70_driver = { 194 .driver = { 195 .name = "lm70", 196 .of_match_table = of_match_ptr(lm70_of_ids), 197 }, 198 .id_table = lm70_ids, 199 .probe = lm70_probe, 200 }; 201 202 module_spi_driver(lm70_driver); 203 204 MODULE_AUTHOR("Kaiwan N Billimoria"); 205 MODULE_DESCRIPTION("NS LM70 and compatibles Linux driver"); 206 MODULE_LICENSE("GPL"); 207