0001
0002
0003
0004
0005
0006
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");