1 /* 2 * mcp3021.c - driver for Microchip MCP3021 and MCP3221 3 * 4 * Copyright (C) 2008-2009, 2012 Freescale Semiconductor, Inc. 5 * Author: Mingkai Hu <Mingkai.hu@freescale.com> 6 * Reworked by Sven Schuchmann <schuchmann@schleissheimer.de> 7 * DT support added by Clemens Gruber <clemens.gruber@pqgruber.com> 8 * 9 * This driver export the value of analog input voltage to sysfs, the 10 * voltage unit is mV. Through the sysfs interface, lm-sensors tool 11 * can also display the input voltage. 12 * 13 * This program is free software; you can redistribute it and/or modify 14 * it under the terms of the GNU General Public License as published by 15 * the Free Software Foundation; either version 2 of the License, or 16 * (at your option) any later version. 17 */ 18 19 #include <linux/kernel.h> 20 #include <linux/module.h> 21 #include <linux/hwmon.h> 22 #include <linux/slab.h> 23 #include <linux/i2c.h> 24 #include <linux/err.h> 25 #include <linux/device.h> 26 #include <linux/of.h> 27 #include <linux/of_device.h> 28 29 /* Vdd / reference voltage in millivolt */ 30 #define MCP3021_VDD_REF_MAX 5500 31 #define MCP3021_VDD_REF_MIN 2700 32 #define MCP3021_VDD_REF_DEFAULT 3300 33 34 /* output format */ 35 #define MCP3021_SAR_SHIFT 2 36 #define MCP3021_SAR_MASK 0x3ff 37 #define MCP3021_OUTPUT_RES 10 /* 10-bit resolution */ 38 39 #define MCP3221_SAR_SHIFT 0 40 #define MCP3221_SAR_MASK 0xfff 41 #define MCP3221_OUTPUT_RES 12 /* 12-bit resolution */ 42 43 enum chips { 44 mcp3021, 45 mcp3221 46 }; 47 48 /* 49 * Client data (each client gets its own) 50 */ 51 struct mcp3021_data { 52 struct device *hwmon_dev; 53 u32 vdd; /* supply and reference voltage in millivolt */ 54 u16 sar_shift; 55 u16 sar_mask; 56 u8 output_res; 57 }; 58 59 static int mcp3021_read16(struct i2c_client *client) 60 { 61 struct mcp3021_data *data = i2c_get_clientdata(client); 62 int ret; 63 u16 reg; 64 __be16 buf; 65 66 ret = i2c_master_recv(client, (char *)&buf, 2); 67 if (ret < 0) 68 return ret; 69 if (ret != 2) 70 return -EIO; 71 72 /* The output code of the MCP3021 is transmitted with MSB first. */ 73 reg = be16_to_cpu(buf); 74 75 /* 76 * The ten-bit output code is composed of the lower 4-bit of the 77 * first byte and the upper 6-bit of the second byte. 78 */ 79 reg = (reg >> data->sar_shift) & data->sar_mask; 80 81 return reg; 82 } 83 84 static inline u16 volts_from_reg(struct mcp3021_data *data, u16 val) 85 { 86 return DIV_ROUND_CLOSEST(data->vdd * val, 1 << data->output_res); 87 } 88 89 static ssize_t show_in_input(struct device *dev, struct device_attribute *attr, 90 char *buf) 91 { 92 struct i2c_client *client = to_i2c_client(dev); 93 struct mcp3021_data *data = i2c_get_clientdata(client); 94 int reg, in_input; 95 96 reg = mcp3021_read16(client); 97 if (reg < 0) 98 return reg; 99 100 in_input = volts_from_reg(data, reg); 101 102 return sprintf(buf, "%d\n", in_input); 103 } 104 105 static DEVICE_ATTR(in0_input, 0444, show_in_input, NULL); 106 107 static int mcp3021_probe(struct i2c_client *client, 108 const struct i2c_device_id *id) 109 { 110 int err; 111 struct mcp3021_data *data = NULL; 112 struct device_node *np = client->dev.of_node; 113 114 if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) 115 return -ENODEV; 116 117 data = devm_kzalloc(&client->dev, sizeof(struct mcp3021_data), 118 GFP_KERNEL); 119 if (!data) 120 return -ENOMEM; 121 122 i2c_set_clientdata(client, data); 123 124 if (np) { 125 if (!of_property_read_u32(np, "reference-voltage-microvolt", 126 &data->vdd)) 127 data->vdd /= 1000; 128 else 129 data->vdd = MCP3021_VDD_REF_DEFAULT; 130 } else { 131 u32 *pdata = dev_get_platdata(&client->dev); 132 133 if (pdata) 134 data->vdd = *pdata; 135 else 136 data->vdd = MCP3021_VDD_REF_DEFAULT; 137 } 138 139 switch (id->driver_data) { 140 case mcp3021: 141 data->sar_shift = MCP3021_SAR_SHIFT; 142 data->sar_mask = MCP3021_SAR_MASK; 143 data->output_res = MCP3021_OUTPUT_RES; 144 break; 145 146 case mcp3221: 147 data->sar_shift = MCP3221_SAR_SHIFT; 148 data->sar_mask = MCP3221_SAR_MASK; 149 data->output_res = MCP3221_OUTPUT_RES; 150 break; 151 } 152 153 if (data->vdd > MCP3021_VDD_REF_MAX || data->vdd < MCP3021_VDD_REF_MIN) 154 return -EINVAL; 155 156 err = sysfs_create_file(&client->dev.kobj, &dev_attr_in0_input.attr); 157 if (err) 158 return err; 159 160 data->hwmon_dev = hwmon_device_register(&client->dev); 161 if (IS_ERR(data->hwmon_dev)) { 162 err = PTR_ERR(data->hwmon_dev); 163 goto exit_remove; 164 } 165 166 return 0; 167 168 exit_remove: 169 sysfs_remove_file(&client->dev.kobj, &dev_attr_in0_input.attr); 170 return err; 171 } 172 173 static int mcp3021_remove(struct i2c_client *client) 174 { 175 struct mcp3021_data *data = i2c_get_clientdata(client); 176 177 hwmon_device_unregister(data->hwmon_dev); 178 sysfs_remove_file(&client->dev.kobj, &dev_attr_in0_input.attr); 179 180 return 0; 181 } 182 183 static const struct i2c_device_id mcp3021_id[] = { 184 { "mcp3021", mcp3021 }, 185 { "mcp3221", mcp3221 }, 186 { } 187 }; 188 MODULE_DEVICE_TABLE(i2c, mcp3021_id); 189 190 #ifdef CONFIG_OF 191 static const struct of_device_id of_mcp3021_match[] = { 192 { .compatible = "microchip,mcp3021", .data = (void *)mcp3021 }, 193 { .compatible = "microchip,mcp3221", .data = (void *)mcp3221 }, 194 { } 195 }; 196 MODULE_DEVICE_TABLE(of, of_mcp3021_match); 197 #endif 198 199 static struct i2c_driver mcp3021_driver = { 200 .driver = { 201 .name = "mcp3021", 202 .of_match_table = of_match_ptr(of_mcp3021_match), 203 }, 204 .probe = mcp3021_probe, 205 .remove = mcp3021_remove, 206 .id_table = mcp3021_id, 207 }; 208 209 module_i2c_driver(mcp3021_driver); 210 211 MODULE_AUTHOR("Mingkai Hu <Mingkai.hu@freescale.com>"); 212 MODULE_DESCRIPTION("Microchip MCP3021/MCP3221 driver"); 213 MODULE_LICENSE("GPL"); 214