0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <linux/device.h>
0010 #include <linux/kernel.h>
0011 #include <linux/slab.h>
0012 #include <linux/sysfs.h>
0013 #include <linux/spi/spi.h>
0014 #include <linux/module.h>
0015 #include <linux/err.h>
0016 #include <linux/hwmon.h>
0017 #include <linux/hwmon-sysfs.h>
0018 #include <linux/bitops.h>
0019
0020
0021
0022
0023 #define AD7314_TEMP_MASK 0x7FE0
0024 #define AD7314_TEMP_SHIFT 5
0025
0026
0027
0028
0029 #define ADT7301_TEMP_MASK 0x3FFF
0030
0031 enum ad7314_variant {
0032 adt7301,
0033 adt7302,
0034 ad7314,
0035 };
0036
0037 struct ad7314_data {
0038 struct spi_device *spi_dev;
0039 u16 rx ____cacheline_aligned;
0040 };
0041
0042 static int ad7314_spi_read(struct ad7314_data *chip)
0043 {
0044 int ret;
0045
0046 ret = spi_read(chip->spi_dev, (u8 *)&chip->rx, sizeof(chip->rx));
0047 if (ret < 0) {
0048 dev_err(&chip->spi_dev->dev, "SPI read error\n");
0049 return ret;
0050 }
0051
0052 return be16_to_cpu(chip->rx);
0053 }
0054
0055 static ssize_t ad7314_temperature_show(struct device *dev,
0056 struct device_attribute *attr,
0057 char *buf)
0058 {
0059 struct ad7314_data *chip = dev_get_drvdata(dev);
0060 s16 data;
0061 int ret;
0062
0063 ret = ad7314_spi_read(chip);
0064 if (ret < 0)
0065 return ret;
0066 switch (spi_get_device_id(chip->spi_dev)->driver_data) {
0067 case ad7314:
0068 data = (ret & AD7314_TEMP_MASK) >> AD7314_TEMP_SHIFT;
0069 data = sign_extend32(data, 9);
0070
0071 return sprintf(buf, "%d\n", 250 * data);
0072 case adt7301:
0073 case adt7302:
0074
0075
0076
0077
0078
0079 data = ret & ADT7301_TEMP_MASK;
0080 data = sign_extend32(data, 13);
0081
0082 return sprintf(buf, "%d\n",
0083 DIV_ROUND_CLOSEST(data * 3125, 100));
0084 default:
0085 return -EINVAL;
0086 }
0087 }
0088
0089 static SENSOR_DEVICE_ATTR_RO(temp1_input, ad7314_temperature, 0);
0090
0091 static struct attribute *ad7314_attrs[] = {
0092 &sensor_dev_attr_temp1_input.dev_attr.attr,
0093 NULL,
0094 };
0095
0096 ATTRIBUTE_GROUPS(ad7314);
0097
0098 static int ad7314_probe(struct spi_device *spi_dev)
0099 {
0100 struct ad7314_data *chip;
0101 struct device *hwmon_dev;
0102
0103 chip = devm_kzalloc(&spi_dev->dev, sizeof(*chip), GFP_KERNEL);
0104 if (chip == NULL)
0105 return -ENOMEM;
0106
0107 chip->spi_dev = spi_dev;
0108 hwmon_dev = devm_hwmon_device_register_with_groups(&spi_dev->dev,
0109 spi_dev->modalias,
0110 chip, ad7314_groups);
0111 return PTR_ERR_OR_ZERO(hwmon_dev);
0112 }
0113
0114 static const struct spi_device_id ad7314_id[] = {
0115 { "adt7301", adt7301 },
0116 { "adt7302", adt7302 },
0117 { "ad7314", ad7314 },
0118 { }
0119 };
0120 MODULE_DEVICE_TABLE(spi, ad7314_id);
0121
0122 static struct spi_driver ad7314_driver = {
0123 .driver = {
0124 .name = "ad7314",
0125 },
0126 .probe = ad7314_probe,
0127 .id_table = ad7314_id,
0128 };
0129
0130 module_spi_driver(ad7314_driver);
0131
0132 MODULE_AUTHOR("Sonic Zhang <sonic.zhang@analog.com>");
0133 MODULE_DESCRIPTION("Analog Devices AD7314, ADT7301 and ADT7302 digital temperature sensor driver");
0134 MODULE_LICENSE("GPL v2");