Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 /*
0003  * ADT7410/ADT7420 digital temperature sensor driver
0004  *
0005  * Copyright 2012-2013 Analog Devices Inc.
0006  *   Author: Lars-Peter Clausen <lars@metafoo.de>
0007  */
0008 
0009 #include <linux/module.h>
0010 #include <linux/init.h>
0011 #include <linux/i2c.h>
0012 #include <linux/regmap.h>
0013 
0014 #include "adt7x10.h"
0015 
0016 static bool adt7410_regmap_is_volatile(struct device *dev, unsigned int reg)
0017 {
0018     switch (reg) {
0019     case ADT7X10_TEMPERATURE:
0020     case ADT7X10_STATUS:
0021         return true;
0022     default:
0023         return false;
0024     }
0025 }
0026 
0027 static int adt7410_reg_read(void *context, unsigned int reg, unsigned int *val)
0028 {
0029     struct i2c_client *client = context;
0030     int regval;
0031 
0032     switch (reg) {
0033     case ADT7X10_TEMPERATURE:
0034     case ADT7X10_T_ALARM_HIGH:
0035     case ADT7X10_T_ALARM_LOW:
0036     case ADT7X10_T_CRIT:
0037         regval = i2c_smbus_read_word_swapped(client, reg);
0038         break;
0039     default:
0040         regval = i2c_smbus_read_byte_data(client, reg);
0041         break;
0042     }
0043     if (regval < 0)
0044         return regval;
0045     *val = regval;
0046     return 0;
0047 }
0048 
0049 static int adt7410_reg_write(void *context, unsigned int reg, unsigned int val)
0050 {
0051     struct i2c_client *client = context;
0052     int ret;
0053 
0054     switch (reg) {
0055     case ADT7X10_TEMPERATURE:
0056     case ADT7X10_T_ALARM_HIGH:
0057     case ADT7X10_T_ALARM_LOW:
0058     case ADT7X10_T_CRIT:
0059         ret = i2c_smbus_write_word_swapped(client, reg, val);
0060         break;
0061     default:
0062         ret = i2c_smbus_write_byte_data(client, reg, val);
0063         break;
0064     }
0065     return ret;
0066 }
0067 
0068 static const struct regmap_config adt7410_regmap_config = {
0069     .reg_bits = 8,
0070     .val_bits = 16,
0071     .max_register = ADT7X10_ID,
0072     .cache_type = REGCACHE_RBTREE,
0073     .volatile_reg = adt7410_regmap_is_volatile,
0074     .reg_read = adt7410_reg_read,
0075     .reg_write = adt7410_reg_write,
0076 };
0077 
0078 static int adt7410_i2c_probe(struct i2c_client *client)
0079 {
0080     struct regmap *regmap;
0081 
0082     regmap = devm_regmap_init(&client->dev, NULL, client,
0083                   &adt7410_regmap_config);
0084     if (IS_ERR(regmap))
0085         return PTR_ERR(regmap);
0086 
0087     return adt7x10_probe(&client->dev, client->name, client->irq, regmap);
0088 }
0089 
0090 static const struct i2c_device_id adt7410_ids[] = {
0091     { "adt7410", 0 },
0092     { "adt7420", 0 },
0093     {}
0094 };
0095 MODULE_DEVICE_TABLE(i2c, adt7410_ids);
0096 
0097 static struct i2c_driver adt7410_driver = {
0098     .class      = I2C_CLASS_HWMON,
0099     .driver = {
0100         .name   = "adt7410",
0101         .pm = ADT7X10_DEV_PM_OPS,
0102     },
0103     .probe_new  = adt7410_i2c_probe,
0104     .id_table   = adt7410_ids,
0105     .address_list   = I2C_ADDRS(0x48, 0x49, 0x4a, 0x4b),
0106 };
0107 module_i2c_driver(adt7410_driver);
0108 
0109 MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>");
0110 MODULE_DESCRIPTION("ADT7410/AD7420 driver");
0111 MODULE_LICENSE("GPL");