1/* 2 * Driver for Texas Instruments INA219, INA226 power monitor chips 3 * 4 * INA219: 5 * Zero Drift Bi-Directional Current/Power Monitor with I2C Interface 6 * Datasheet: http://www.ti.com/product/ina219 7 * 8 * INA220: 9 * Bi-Directional Current/Power Monitor with I2C Interface 10 * Datasheet: http://www.ti.com/product/ina220 11 * 12 * INA226: 13 * Bi-Directional Current/Power Monitor with I2C Interface 14 * Datasheet: http://www.ti.com/product/ina226 15 * 16 * INA230: 17 * Bi-directional Current/Power Monitor with I2C Interface 18 * Datasheet: http://www.ti.com/product/ina230 19 * 20 * Copyright (C) 2012 Lothar Felten <l-felten@ti.com> 21 * Thanks to Jan Volkering 22 * 23 * This program is free software; you can redistribute it and/or modify 24 * it under the terms of the GNU General Public License as published by 25 * the Free Software Foundation; version 2 of the License. 26 */ 27 28#include <linux/kernel.h> 29#include <linux/module.h> 30#include <linux/init.h> 31#include <linux/err.h> 32#include <linux/slab.h> 33#include <linux/i2c.h> 34#include <linux/hwmon.h> 35#include <linux/hwmon-sysfs.h> 36#include <linux/jiffies.h> 37#include <linux/of.h> 38#include <linux/delay.h> 39#include <linux/util_macros.h> 40 41#include <linux/platform_data/ina2xx.h> 42 43/* common register definitions */ 44#define INA2XX_CONFIG 0x00 45#define INA2XX_SHUNT_VOLTAGE 0x01 /* readonly */ 46#define INA2XX_BUS_VOLTAGE 0x02 /* readonly */ 47#define INA2XX_POWER 0x03 /* readonly */ 48#define INA2XX_CURRENT 0x04 /* readonly */ 49#define INA2XX_CALIBRATION 0x05 50 51/* INA226 register definitions */ 52#define INA226_MASK_ENABLE 0x06 53#define INA226_ALERT_LIMIT 0x07 54#define INA226_DIE_ID 0xFF 55 56/* register count */ 57#define INA219_REGISTERS 6 58#define INA226_REGISTERS 8 59 60#define INA2XX_MAX_REGISTERS 8 61 62/* settings - depend on use case */ 63#define INA219_CONFIG_DEFAULT 0x399F /* PGA=8 */ 64#define INA226_CONFIG_DEFAULT 0x4527 /* averages=16 */ 65 66/* worst case is 68.10 ms (~14.6Hz, ina219) */ 67#define INA2XX_CONVERSION_RATE 15 68#define INA2XX_MAX_DELAY 69 /* worst case delay in ms */ 69 70#define INA2XX_RSHUNT_DEFAULT 10000 71 72/* bit mask for reading the averaging setting in the configuration register */ 73#define INA226_AVG_RD_MASK 0x0E00 74 75#define INA226_READ_AVG(reg) (((reg) & INA226_AVG_RD_MASK) >> 9) 76#define INA226_SHIFT_AVG(val) ((val) << 9) 77 78/* common attrs, ina226 attrs and NULL */ 79#define INA2XX_MAX_ATTRIBUTE_GROUPS 3 80 81/* 82 * Both bus voltage and shunt voltage conversion times for ina226 are set 83 * to 0b0100 on POR, which translates to 2200 microseconds in total. 84 */ 85#define INA226_TOTAL_CONV_TIME_DEFAULT 2200 86 87enum ina2xx_ids { ina219, ina226 }; 88 89struct ina2xx_config { 90 u16 config_default; 91 int calibration_factor; 92 int registers; 93 int shunt_div; 94 int bus_voltage_shift; 95 int bus_voltage_lsb; /* uV */ 96 int power_lsb; /* uW */ 97}; 98 99struct ina2xx_data { 100 struct i2c_client *client; 101 const struct ina2xx_config *config; 102 103 long rshunt; 104 u16 curr_config; 105 106 struct mutex update_lock; 107 bool valid; 108 unsigned long last_updated; 109 int update_interval; /* in jiffies */ 110 111 int kind; 112 const struct attribute_group *groups[INA2XX_MAX_ATTRIBUTE_GROUPS]; 113 u16 regs[INA2XX_MAX_REGISTERS]; 114}; 115 116static const struct ina2xx_config ina2xx_config[] = { 117 [ina219] = { 118 .config_default = INA219_CONFIG_DEFAULT, 119 .calibration_factor = 40960000, 120 .registers = INA219_REGISTERS, 121 .shunt_div = 100, 122 .bus_voltage_shift = 3, 123 .bus_voltage_lsb = 4000, 124 .power_lsb = 20000, 125 }, 126 [ina226] = { 127 .config_default = INA226_CONFIG_DEFAULT, 128 .calibration_factor = 5120000, 129 .registers = INA226_REGISTERS, 130 .shunt_div = 400, 131 .bus_voltage_shift = 0, 132 .bus_voltage_lsb = 1250, 133 .power_lsb = 25000, 134 }, 135}; 136 137/* 138 * Available averaging rates for ina226. The indices correspond with 139 * the bit values expected by the chip (according to the ina226 datasheet, 140 * table 3 AVG bit settings, found at 141 * http://www.ti.com/lit/ds/symlink/ina226.pdf. 142 */ 143static const int ina226_avg_tab[] = { 1, 4, 16, 64, 128, 256, 512, 1024 }; 144 145static int ina226_reg_to_interval(u16 config) 146{ 147 int avg = ina226_avg_tab[INA226_READ_AVG(config)]; 148 149 /* 150 * Multiply the total conversion time by the number of averages. 151 * Return the result in milliseconds. 152 */ 153 return DIV_ROUND_CLOSEST(avg * INA226_TOTAL_CONV_TIME_DEFAULT, 1000); 154} 155 156static u16 ina226_interval_to_reg(int interval, u16 config) 157{ 158 int avg, avg_bits; 159 160 avg = DIV_ROUND_CLOSEST(interval * 1000, 161 INA226_TOTAL_CONV_TIME_DEFAULT); 162 avg_bits = find_closest(avg, ina226_avg_tab, 163 ARRAY_SIZE(ina226_avg_tab)); 164 165 return (config & ~INA226_AVG_RD_MASK) | INA226_SHIFT_AVG(avg_bits); 166} 167 168static void ina226_set_update_interval(struct ina2xx_data *data) 169{ 170 int ms; 171 172 ms = ina226_reg_to_interval(data->curr_config); 173 data->update_interval = msecs_to_jiffies(ms); 174} 175 176static int ina2xx_calibrate(struct ina2xx_data *data) 177{ 178 u16 val = DIV_ROUND_CLOSEST(data->config->calibration_factor, 179 data->rshunt); 180 181 return i2c_smbus_write_word_swapped(data->client, 182 INA2XX_CALIBRATION, val); 183} 184 185/* 186 * Initialize the configuration and calibration registers. 187 */ 188static int ina2xx_init(struct ina2xx_data *data) 189{ 190 struct i2c_client *client = data->client; 191 int ret; 192 193 /* device configuration */ 194 ret = i2c_smbus_write_word_swapped(client, INA2XX_CONFIG, 195 data->curr_config); 196 if (ret < 0) 197 return ret; 198 199 /* 200 * Set current LSB to 1mA, shunt is in uOhms 201 * (equation 13 in datasheet). 202 */ 203 return ina2xx_calibrate(data); 204} 205 206static int ina2xx_do_update(struct device *dev) 207{ 208 struct ina2xx_data *data = dev_get_drvdata(dev); 209 struct i2c_client *client = data->client; 210 int i, rv, retry; 211 212 dev_dbg(&client->dev, "Starting ina2xx update\n"); 213 214 for (retry = 5; retry; retry--) { 215 /* Read all registers */ 216 for (i = 0; i < data->config->registers; i++) { 217 rv = i2c_smbus_read_word_swapped(client, i); 218 if (rv < 0) 219 return rv; 220 data->regs[i] = rv; 221 } 222 223 /* 224 * If the current value in the calibration register is 0, the 225 * power and current registers will also remain at 0. In case 226 * the chip has been reset let's check the calibration 227 * register and reinitialize if needed. 228 */ 229 if (data->regs[INA2XX_CALIBRATION] == 0) { 230 dev_warn(dev, "chip not calibrated, reinitializing\n"); 231 232 rv = ina2xx_init(data); 233 if (rv < 0) 234 return rv; 235 236 /* 237 * Let's make sure the power and current registers 238 * have been updated before trying again. 239 */ 240 msleep(INA2XX_MAX_DELAY); 241 continue; 242 } 243 244 data->last_updated = jiffies; 245 data->valid = 1; 246 247 return 0; 248 } 249 250 /* 251 * If we're here then although all write operations succeeded, the 252 * chip still returns 0 in the calibration register. Nothing more we 253 * can do here. 254 */ 255 dev_err(dev, "unable to reinitialize the chip\n"); 256 return -ENODEV; 257} 258 259static struct ina2xx_data *ina2xx_update_device(struct device *dev) 260{ 261 struct ina2xx_data *data = dev_get_drvdata(dev); 262 struct ina2xx_data *ret = data; 263 unsigned long after; 264 int rv; 265 266 mutex_lock(&data->update_lock); 267 268 after = data->last_updated + data->update_interval; 269 if (time_after(jiffies, after) || !data->valid) { 270 rv = ina2xx_do_update(dev); 271 if (rv < 0) 272 ret = ERR_PTR(rv); 273 } 274 275 mutex_unlock(&data->update_lock); 276 return ret; 277} 278 279static int ina2xx_get_value(struct ina2xx_data *data, u8 reg) 280{ 281 int val; 282 283 switch (reg) { 284 case INA2XX_SHUNT_VOLTAGE: 285 /* signed register */ 286 val = DIV_ROUND_CLOSEST((s16)data->regs[reg], 287 data->config->shunt_div); 288 break; 289 case INA2XX_BUS_VOLTAGE: 290 val = (data->regs[reg] >> data->config->bus_voltage_shift) 291 * data->config->bus_voltage_lsb; 292 val = DIV_ROUND_CLOSEST(val, 1000); 293 break; 294 case INA2XX_POWER: 295 val = data->regs[reg] * data->config->power_lsb; 296 break; 297 case INA2XX_CURRENT: 298 /* signed register, LSB=1mA (selected), in mA */ 299 val = (s16)data->regs[reg]; 300 break; 301 case INA2XX_CALIBRATION: 302 val = DIV_ROUND_CLOSEST(data->config->calibration_factor, 303 data->regs[reg]); 304 break; 305 default: 306 /* programmer goofed */ 307 WARN_ON_ONCE(1); 308 val = 0; 309 break; 310 } 311 312 return val; 313} 314 315static ssize_t ina2xx_show_value(struct device *dev, 316 struct device_attribute *da, char *buf) 317{ 318 struct sensor_device_attribute *attr = to_sensor_dev_attr(da); 319 struct ina2xx_data *data = ina2xx_update_device(dev); 320 321 if (IS_ERR(data)) 322 return PTR_ERR(data); 323 324 return snprintf(buf, PAGE_SIZE, "%d\n", 325 ina2xx_get_value(data, attr->index)); 326} 327 328static ssize_t ina2xx_set_shunt(struct device *dev, 329 struct device_attribute *da, 330 const char *buf, size_t count) 331{ 332 struct ina2xx_data *data = ina2xx_update_device(dev); 333 unsigned long val; 334 int status; 335 336 if (IS_ERR(data)) 337 return PTR_ERR(data); 338 339 status = kstrtoul(buf, 10, &val); 340 if (status < 0) 341 return status; 342 343 if (val == 0 || 344 /* Values greater than the calibration factor make no sense. */ 345 val > data->config->calibration_factor) 346 return -EINVAL; 347 348 mutex_lock(&data->update_lock); 349 data->rshunt = val; 350 status = ina2xx_calibrate(data); 351 mutex_unlock(&data->update_lock); 352 if (status < 0) 353 return status; 354 355 return count; 356} 357 358static ssize_t ina226_set_interval(struct device *dev, 359 struct device_attribute *da, 360 const char *buf, size_t count) 361{ 362 struct ina2xx_data *data = dev_get_drvdata(dev); 363 unsigned long val; 364 int status; 365 366 status = kstrtoul(buf, 10, &val); 367 if (status < 0) 368 return status; 369 370 if (val > INT_MAX || val == 0) 371 return -EINVAL; 372 373 mutex_lock(&data->update_lock); 374 data->curr_config = ina226_interval_to_reg(val, 375 data->regs[INA2XX_CONFIG]); 376 status = i2c_smbus_write_word_swapped(data->client, 377 INA2XX_CONFIG, 378 data->curr_config); 379 380 ina226_set_update_interval(data); 381 /* Make sure the next access re-reads all registers. */ 382 data->valid = 0; 383 mutex_unlock(&data->update_lock); 384 if (status < 0) 385 return status; 386 387 return count; 388} 389 390static ssize_t ina226_show_interval(struct device *dev, 391 struct device_attribute *da, char *buf) 392{ 393 struct ina2xx_data *data = ina2xx_update_device(dev); 394 395 if (IS_ERR(data)) 396 return PTR_ERR(data); 397 398 /* 399 * We don't use data->update_interval here as we want to display 400 * the actual interval used by the chip and jiffies_to_msecs() 401 * doesn't seem to be accurate enough. 402 */ 403 return snprintf(buf, PAGE_SIZE, "%d\n", 404 ina226_reg_to_interval(data->regs[INA2XX_CONFIG])); 405} 406 407/* shunt voltage */ 408static SENSOR_DEVICE_ATTR(in0_input, S_IRUGO, ina2xx_show_value, NULL, 409 INA2XX_SHUNT_VOLTAGE); 410 411/* bus voltage */ 412static SENSOR_DEVICE_ATTR(in1_input, S_IRUGO, ina2xx_show_value, NULL, 413 INA2XX_BUS_VOLTAGE); 414 415/* calculated current */ 416static SENSOR_DEVICE_ATTR(curr1_input, S_IRUGO, ina2xx_show_value, NULL, 417 INA2XX_CURRENT); 418 419/* calculated power */ 420static SENSOR_DEVICE_ATTR(power1_input, S_IRUGO, ina2xx_show_value, NULL, 421 INA2XX_POWER); 422 423/* shunt resistance */ 424static SENSOR_DEVICE_ATTR(shunt_resistor, S_IRUGO | S_IWUSR, 425 ina2xx_show_value, ina2xx_set_shunt, 426 INA2XX_CALIBRATION); 427 428/* update interval (ina226 only) */ 429static SENSOR_DEVICE_ATTR(update_interval, S_IRUGO | S_IWUSR, 430 ina226_show_interval, ina226_set_interval, 0); 431 432/* pointers to created device attributes */ 433static struct attribute *ina2xx_attrs[] = { 434 &sensor_dev_attr_in0_input.dev_attr.attr, 435 &sensor_dev_attr_in1_input.dev_attr.attr, 436 &sensor_dev_attr_curr1_input.dev_attr.attr, 437 &sensor_dev_attr_power1_input.dev_attr.attr, 438 &sensor_dev_attr_shunt_resistor.dev_attr.attr, 439 NULL, 440}; 441 442static const struct attribute_group ina2xx_group = { 443 .attrs = ina2xx_attrs, 444}; 445 446static struct attribute *ina226_attrs[] = { 447 &sensor_dev_attr_update_interval.dev_attr.attr, 448 NULL, 449}; 450 451static const struct attribute_group ina226_group = { 452 .attrs = ina226_attrs, 453}; 454 455static int ina2xx_probe(struct i2c_client *client, 456 const struct i2c_device_id *id) 457{ 458 struct i2c_adapter *adapter = client->adapter; 459 struct ina2xx_platform_data *pdata; 460 struct device *dev = &client->dev; 461 struct ina2xx_data *data; 462 struct device *hwmon_dev; 463 u32 val; 464 int ret, group = 0; 465 466 if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_WORD_DATA)) 467 return -ENODEV; 468 469 data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL); 470 if (!data) 471 return -ENOMEM; 472 473 if (dev_get_platdata(dev)) { 474 pdata = dev_get_platdata(dev); 475 data->rshunt = pdata->shunt_uohms; 476 } else if (!of_property_read_u32(dev->of_node, 477 "shunt-resistor", &val)) { 478 data->rshunt = val; 479 } else { 480 data->rshunt = INA2XX_RSHUNT_DEFAULT; 481 } 482 483 /* set the device type */ 484 data->kind = id->driver_data; 485 data->config = &ina2xx_config[data->kind]; 486 data->curr_config = data->config->config_default; 487 data->client = client; 488 489 /* 490 * Ina226 has a variable update_interval. For ina219 we 491 * use a constant value. 492 */ 493 if (data->kind == ina226) 494 ina226_set_update_interval(data); 495 else 496 data->update_interval = HZ / INA2XX_CONVERSION_RATE; 497 498 if (data->rshunt <= 0 || 499 data->rshunt > data->config->calibration_factor) 500 return -ENODEV; 501 502 ret = ina2xx_init(data); 503 if (ret < 0) { 504 dev_err(dev, "error configuring the device: %d\n", ret); 505 return -ENODEV; 506 } 507 508 mutex_init(&data->update_lock); 509 510 data->groups[group++] = &ina2xx_group; 511 if (data->kind == ina226) 512 data->groups[group++] = &ina226_group; 513 514 hwmon_dev = devm_hwmon_device_register_with_groups(dev, client->name, 515 data, data->groups); 516 if (IS_ERR(hwmon_dev)) 517 return PTR_ERR(hwmon_dev); 518 519 dev_info(dev, "power monitor %s (Rshunt = %li uOhm)\n", 520 id->name, data->rshunt); 521 522 return 0; 523} 524 525static const struct i2c_device_id ina2xx_id[] = { 526 { "ina219", ina219 }, 527 { "ina220", ina219 }, 528 { "ina226", ina226 }, 529 { "ina230", ina226 }, 530 { "ina231", ina226 }, 531 { } 532}; 533MODULE_DEVICE_TABLE(i2c, ina2xx_id); 534 535static struct i2c_driver ina2xx_driver = { 536 .driver = { 537 .name = "ina2xx", 538 }, 539 .probe = ina2xx_probe, 540 .id_table = ina2xx_id, 541}; 542 543module_i2c_driver(ina2xx_driver); 544 545MODULE_AUTHOR("Lothar Felten <l-felten@ti.com>"); 546MODULE_DESCRIPTION("ina2xx driver"); 547MODULE_LICENSE("GPL"); 548