max9611.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * iio/adc/max9611.c
  4. *
  5. * Maxim max9611/max9612 high side current sense amplifier with
  6. * 12-bit ADC interface.
  7. *
  8. * Copyright (C) 2017 Jacopo Mondi
  9. */
  10. /*
  11. * This driver supports input common-mode voltage, current-sense
  12. * amplifier with programmable gains and die temperature reading from
  13. * Maxim max9611/max9612.
  14. *
  15. * Op-amp, analog comparator, and watchdog functionalities are not
  16. * supported by this driver.
  17. */
  18. #include <linux/delay.h>
  19. #include <linux/i2c.h>
  20. #include <linux/iio/iio.h>
  21. #include <linux/iio/sysfs.h>
  22. #include <linux/module.h>
  23. #include <linux/mod_devicetable.h>
  24. #include <linux/property.h>
  25. #define DRIVER_NAME "max9611"
  26. /* max9611 register addresses */
  27. #define MAX9611_REG_CSA_DATA 0x00
  28. #define MAX9611_REG_RS_DATA 0x02
  29. #define MAX9611_REG_TEMP_DATA 0x08
  30. #define MAX9611_REG_CTRL1 0x0a
  31. #define MAX9611_REG_CTRL2 0x0b
  32. /* max9611 REG1 mux configuration options */
  33. #define MAX9611_MUX_MASK GENMASK(3, 0)
  34. #define MAX9611_MUX_SENSE_1x 0x00
  35. #define MAX9611_MUX_SENSE_4x 0x01
  36. #define MAX9611_MUX_SENSE_8x 0x02
  37. #define MAX9611_INPUT_VOLT 0x03
  38. #define MAX9611_MUX_TEMP 0x06
  39. /* max9611 voltage (both csa and input) helper macros */
  40. #define MAX9611_VOLTAGE_SHIFT 0x04
  41. #define MAX9611_VOLTAGE_RAW(_r) ((_r) >> MAX9611_VOLTAGE_SHIFT)
  42. /*
  43. * max9611 current sense amplifier voltage output:
  44. * LSB and offset values depends on selected gain (1x, 4x, 8x)
  45. *
  46. * GAIN LSB (nV) OFFSET (LSB steps)
  47. * 1x 107500 1
  48. * 4x 26880 1
  49. * 8x 13440 3
  50. *
  51. * The complete formula to calculate current sense voltage is:
  52. * (((adc_read >> 4) - offset) / ((1 / LSB) * 10^-3)
  53. */
  54. #define MAX9611_CSA_1X_LSB_nV 107500
  55. #define MAX9611_CSA_4X_LSB_nV 26880
  56. #define MAX9611_CSA_8X_LSB_nV 13440
  57. #define MAX9611_CSA_1X_OFFS_RAW 1
  58. #define MAX9611_CSA_4X_OFFS_RAW 1
  59. #define MAX9611_CSA_8X_OFFS_RAW 3
  60. /*
  61. * max9611 common input mode (CIM): LSB is 14mV, with 14mV offset at 25 C
  62. *
  63. * The complete formula to calculate input common voltage is:
  64. * (((adc_read >> 4) * 1000) - offset) / (1 / 14 * 1000)
  65. */
  66. #define MAX9611_CIM_LSB_mV 14
  67. #define MAX9611_CIM_OFFSET_RAW 1
  68. /*
  69. * max9611 temperature reading: LSB is 480 milli degrees Celsius
  70. *
  71. * The complete formula to calculate temperature is:
  72. * ((adc_read >> 7) * 1000) / (1 / 480 * 1000)
  73. */
  74. #define MAX9611_TEMP_MAX_POS 0x7f80
  75. #define MAX9611_TEMP_MAX_NEG 0xff80
  76. #define MAX9611_TEMP_MIN_NEG 0xd980
  77. #define MAX9611_TEMP_MASK GENMASK(15, 7)
  78. #define MAX9611_TEMP_SHIFT 0x07
  79. #define MAX9611_TEMP_RAW(_r) ((_r) >> MAX9611_TEMP_SHIFT)
  80. #define MAX9611_TEMP_SCALE_NUM 1000000
  81. #define MAX9611_TEMP_SCALE_DIV 2083
  82. /*
  83. * Conversion time is 2 ms (typically) at Ta=25 degreeC
  84. * No maximum value is known, so play it safe.
  85. */
  86. #define MAX9611_CONV_TIME_US_RANGE 3000, 3300
  87. struct max9611_dev {
  88. struct device *dev;
  89. struct i2c_client *i2c_client;
  90. struct mutex lock;
  91. unsigned int shunt_resistor_uohm;
  92. };
  93. enum max9611_conf_ids {
  94. CONF_SENSE_1x,
  95. CONF_SENSE_4x,
  96. CONF_SENSE_8x,
  97. CONF_IN_VOLT,
  98. CONF_TEMP,
  99. };
  100. /*
  101. * max9611_mux_conf - associate ADC mux configuration with register address
  102. * where data shall be read from
  103. */
  104. static const unsigned int max9611_mux_conf[][2] = {
  105. [CONF_SENSE_1x] = { MAX9611_MUX_SENSE_1x, MAX9611_REG_CSA_DATA },
  106. [CONF_SENSE_4x] = { MAX9611_MUX_SENSE_4x, MAX9611_REG_CSA_DATA },
  107. [CONF_SENSE_8x] = { MAX9611_MUX_SENSE_8x, MAX9611_REG_CSA_DATA },
  108. [CONF_IN_VOLT] = { MAX9611_INPUT_VOLT, MAX9611_REG_RS_DATA },
  109. [CONF_TEMP] = { MAX9611_MUX_TEMP, MAX9611_REG_TEMP_DATA },
  110. };
  111. enum max9611_csa_gain {
  112. CSA_GAIN_1x = CONF_SENSE_1x,
  113. CSA_GAIN_4x = CONF_SENSE_4x,
  114. CSA_GAIN_8x = CONF_SENSE_8x,
  115. };
  116. enum max9611_csa_gain_params {
  117. CSA_GAIN_LSB_nV,
  118. CSA_GAIN_OFFS_RAW,
  119. };
  120. /*
  121. * max9611_csa_gain_conf - associate gain multiplier with LSB and
  122. * offset values.
  123. *
  124. * Group together parameters associated with configurable gain
  125. * on current sense amplifier path to ADC interface.
  126. * Current sense read routine adjusts gain until it gets a meaningful
  127. * value; use this structure to retrieve the correct LSB and offset values.
  128. */
  129. static const unsigned int max9611_gain_conf[][2] = {
  130. [CSA_GAIN_1x] = { MAX9611_CSA_1X_LSB_nV, MAX9611_CSA_1X_OFFS_RAW, },
  131. [CSA_GAIN_4x] = { MAX9611_CSA_4X_LSB_nV, MAX9611_CSA_4X_OFFS_RAW, },
  132. [CSA_GAIN_8x] = { MAX9611_CSA_8X_LSB_nV, MAX9611_CSA_8X_OFFS_RAW, },
  133. };
  134. enum max9611_chan_addrs {
  135. MAX9611_CHAN_VOLTAGE_INPUT,
  136. MAX9611_CHAN_VOLTAGE_SENSE,
  137. MAX9611_CHAN_TEMPERATURE,
  138. MAX9611_CHAN_CURRENT_LOAD,
  139. MAX9611_CHAN_POWER_LOAD,
  140. };
  141. static const struct iio_chan_spec max9611_channels[] = {
  142. {
  143. .type = IIO_TEMP,
  144. .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
  145. BIT(IIO_CHAN_INFO_SCALE),
  146. .address = MAX9611_CHAN_TEMPERATURE,
  147. },
  148. {
  149. .type = IIO_VOLTAGE,
  150. .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED),
  151. .address = MAX9611_CHAN_VOLTAGE_SENSE,
  152. .indexed = 1,
  153. .channel = 0,
  154. },
  155. {
  156. .type = IIO_VOLTAGE,
  157. .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
  158. BIT(IIO_CHAN_INFO_SCALE) |
  159. BIT(IIO_CHAN_INFO_OFFSET),
  160. .address = MAX9611_CHAN_VOLTAGE_INPUT,
  161. .indexed = 1,
  162. .channel = 1,
  163. },
  164. {
  165. .type = IIO_CURRENT,
  166. .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED),
  167. .address = MAX9611_CHAN_CURRENT_LOAD,
  168. },
  169. {
  170. .type = IIO_POWER,
  171. .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED),
  172. .address = MAX9611_CHAN_POWER_LOAD
  173. },
  174. };
  175. /**
  176. * max9611_read_single() - read a single value from ADC interface
  177. *
  178. * Data registers are 16 bit long, spread between two 8 bit registers
  179. * with consecutive addresses.
  180. * Configure ADC mux first, then read register at address "reg_addr".
  181. * The smbus_read_word routine asks for 16 bits and the ADC is kind enough
  182. * to return values from "reg_addr" and "reg_addr + 1" consecutively.
  183. * Data are transmitted with big-endian ordering: MSB arrives first.
  184. *
  185. * @max9611: max9611 device
  186. * @selector: index for mux and register configuration
  187. * @raw_val: the value returned from ADC
  188. */
  189. static int max9611_read_single(struct max9611_dev *max9611,
  190. enum max9611_conf_ids selector,
  191. u16 *raw_val)
  192. {
  193. int ret;
  194. u8 mux_conf = max9611_mux_conf[selector][0] & MAX9611_MUX_MASK;
  195. u8 reg_addr = max9611_mux_conf[selector][1];
  196. /*
  197. * Keep mutex lock held during read-write to avoid mux register
  198. * (CTRL1) re-configuration.
  199. */
  200. mutex_lock(&max9611->lock);
  201. ret = i2c_smbus_write_byte_data(max9611->i2c_client,
  202. MAX9611_REG_CTRL1, mux_conf);
  203. if (ret) {
  204. dev_err(max9611->dev, "i2c write byte failed: 0x%2x - 0x%2x\n",
  205. MAX9611_REG_CTRL1, mux_conf);
  206. mutex_unlock(&max9611->lock);
  207. return ret;
  208. }
  209. /* need a delay here to make register configuration stabilize. */
  210. usleep_range(MAX9611_CONV_TIME_US_RANGE);
  211. ret = i2c_smbus_read_word_swapped(max9611->i2c_client, reg_addr);
  212. if (ret < 0) {
  213. dev_err(max9611->dev, "i2c read word from 0x%2x failed\n",
  214. reg_addr);
  215. mutex_unlock(&max9611->lock);
  216. return ret;
  217. }
  218. *raw_val = ret;
  219. mutex_unlock(&max9611->lock);
  220. return 0;
  221. }
  222. /**
  223. * max9611_read_csa_voltage() - read current sense amplifier output voltage
  224. *
  225. * Current sense amplifier output voltage is read through a configurable
  226. * 1x, 4x or 8x gain.
  227. * Start with plain 1x gain, and adjust gain control properly until a
  228. * meaningful value is read from ADC output.
  229. *
  230. * @max9611: max9611 device
  231. * @adc_raw: raw value read from ADC output
  232. * @csa_gain: gain configuration option selector
  233. */
  234. static int max9611_read_csa_voltage(struct max9611_dev *max9611,
  235. u16 *adc_raw,
  236. enum max9611_csa_gain *csa_gain)
  237. {
  238. enum max9611_conf_ids gain_selectors[] = {
  239. CONF_SENSE_1x,
  240. CONF_SENSE_4x,
  241. CONF_SENSE_8x
  242. };
  243. unsigned int i;
  244. int ret;
  245. for (i = 0; i < ARRAY_SIZE(gain_selectors); ++i) {
  246. ret = max9611_read_single(max9611, gain_selectors[i], adc_raw);
  247. if (ret)
  248. return ret;
  249. if (*adc_raw > 0) {
  250. *csa_gain = (enum max9611_csa_gain)gain_selectors[i];
  251. return 0;
  252. }
  253. }
  254. return -EIO;
  255. }
  256. static int max9611_read_raw(struct iio_dev *indio_dev,
  257. struct iio_chan_spec const *chan,
  258. int *val, int *val2, long mask)
  259. {
  260. struct max9611_dev *dev = iio_priv(indio_dev);
  261. enum max9611_csa_gain gain_selector;
  262. const unsigned int *csa_gain;
  263. u16 adc_data;
  264. int ret;
  265. switch (mask) {
  266. case IIO_CHAN_INFO_RAW:
  267. switch (chan->address) {
  268. case MAX9611_CHAN_TEMPERATURE:
  269. ret = max9611_read_single(dev, CONF_TEMP,
  270. &adc_data);
  271. if (ret)
  272. return -EINVAL;
  273. *val = MAX9611_TEMP_RAW(adc_data);
  274. return IIO_VAL_INT;
  275. case MAX9611_CHAN_VOLTAGE_INPUT:
  276. ret = max9611_read_single(dev, CONF_IN_VOLT,
  277. &adc_data);
  278. if (ret)
  279. return -EINVAL;
  280. *val = MAX9611_VOLTAGE_RAW(adc_data);
  281. return IIO_VAL_INT;
  282. }
  283. break;
  284. case IIO_CHAN_INFO_OFFSET:
  285. /* MAX9611_CHAN_VOLTAGE_INPUT */
  286. *val = MAX9611_CIM_OFFSET_RAW;
  287. return IIO_VAL_INT;
  288. case IIO_CHAN_INFO_SCALE:
  289. switch (chan->address) {
  290. case MAX9611_CHAN_TEMPERATURE:
  291. *val = MAX9611_TEMP_SCALE_NUM;
  292. *val2 = MAX9611_TEMP_SCALE_DIV;
  293. return IIO_VAL_FRACTIONAL;
  294. case MAX9611_CHAN_VOLTAGE_INPUT:
  295. *val = MAX9611_CIM_LSB_mV;
  296. return IIO_VAL_INT;
  297. }
  298. break;
  299. case IIO_CHAN_INFO_PROCESSED:
  300. switch (chan->address) {
  301. case MAX9611_CHAN_VOLTAGE_SENSE:
  302. /*
  303. * processed (mV): (raw - offset) * LSB (nV) / 10^6
  304. *
  305. * Even if max9611 can output raw csa voltage readings,
  306. * use a produced value as scale depends on gain.
  307. */
  308. ret = max9611_read_csa_voltage(dev, &adc_data,
  309. &gain_selector);
  310. if (ret)
  311. return -EINVAL;
  312. csa_gain = max9611_gain_conf[gain_selector];
  313. adc_data -= csa_gain[CSA_GAIN_OFFS_RAW];
  314. *val = MAX9611_VOLTAGE_RAW(adc_data) *
  315. csa_gain[CSA_GAIN_LSB_nV];
  316. *val2 = 1000000;
  317. return IIO_VAL_FRACTIONAL;
  318. case MAX9611_CHAN_CURRENT_LOAD:
  319. /* processed (mA): Vcsa (nV) / Rshunt (uOhm) */
  320. ret = max9611_read_csa_voltage(dev, &adc_data,
  321. &gain_selector);
  322. if (ret)
  323. return -EINVAL;
  324. csa_gain = max9611_gain_conf[gain_selector];
  325. adc_data -= csa_gain[CSA_GAIN_OFFS_RAW];
  326. *val = MAX9611_VOLTAGE_RAW(adc_data) *
  327. csa_gain[CSA_GAIN_LSB_nV];
  328. *val2 = dev->shunt_resistor_uohm;
  329. return IIO_VAL_FRACTIONAL;
  330. case MAX9611_CHAN_POWER_LOAD:
  331. /*
  332. * processed (mW): Vin (mV) * Vcsa (uV) /
  333. * Rshunt (uOhm)
  334. */
  335. ret = max9611_read_single(dev, CONF_IN_VOLT,
  336. &adc_data);
  337. if (ret)
  338. return -EINVAL;
  339. adc_data -= MAX9611_CIM_OFFSET_RAW;
  340. *val = MAX9611_VOLTAGE_RAW(adc_data) *
  341. MAX9611_CIM_LSB_mV;
  342. ret = max9611_read_csa_voltage(dev, &adc_data,
  343. &gain_selector);
  344. if (ret)
  345. return -EINVAL;
  346. csa_gain = max9611_gain_conf[gain_selector];
  347. /* divide by 10^3 here to avoid 32bit overflow */
  348. adc_data -= csa_gain[CSA_GAIN_OFFS_RAW];
  349. *val *= MAX9611_VOLTAGE_RAW(adc_data) *
  350. csa_gain[CSA_GAIN_LSB_nV] / 1000;
  351. *val2 = dev->shunt_resistor_uohm;
  352. return IIO_VAL_FRACTIONAL;
  353. }
  354. break;
  355. }
  356. return -EINVAL;
  357. }
  358. static ssize_t max9611_shunt_resistor_show(struct device *dev,
  359. struct device_attribute *attr,
  360. char *buf)
  361. {
  362. struct max9611_dev *max9611 = iio_priv(dev_to_iio_dev(dev));
  363. unsigned int i, r;
  364. i = max9611->shunt_resistor_uohm / 1000000;
  365. r = max9611->shunt_resistor_uohm % 1000000;
  366. return sysfs_emit(buf, "%u.%06u\n", i, r);
  367. }
  368. static IIO_DEVICE_ATTR(in_power_shunt_resistor, 0444,
  369. max9611_shunt_resistor_show, NULL, 0);
  370. static IIO_DEVICE_ATTR(in_current_shunt_resistor, 0444,
  371. max9611_shunt_resistor_show, NULL, 0);
  372. static struct attribute *max9611_attributes[] = {
  373. &iio_dev_attr_in_power_shunt_resistor.dev_attr.attr,
  374. &iio_dev_attr_in_current_shunt_resistor.dev_attr.attr,
  375. NULL,
  376. };
  377. static const struct attribute_group max9611_attribute_group = {
  378. .attrs = max9611_attributes,
  379. };
  380. static const struct iio_info indio_info = {
  381. .read_raw = max9611_read_raw,
  382. .attrs = &max9611_attribute_group,
  383. };
  384. static int max9611_init(struct max9611_dev *max9611)
  385. {
  386. struct i2c_client *client = max9611->i2c_client;
  387. u16 regval;
  388. int ret;
  389. if (!i2c_check_functionality(client->adapter,
  390. I2C_FUNC_SMBUS_WRITE_BYTE |
  391. I2C_FUNC_SMBUS_READ_WORD_DATA)) {
  392. dev_err(max9611->dev,
  393. "I2c adapter does not support smbus write_byte or read_word functionalities: aborting probe.\n");
  394. return -EINVAL;
  395. }
  396. /* Make sure die temperature is in range to test communications. */
  397. ret = max9611_read_single(max9611, CONF_TEMP, &regval);
  398. if (ret)
  399. return ret;
  400. regval &= MAX9611_TEMP_MASK;
  401. if ((regval > MAX9611_TEMP_MAX_POS &&
  402. regval < MAX9611_TEMP_MIN_NEG) ||
  403. regval > MAX9611_TEMP_MAX_NEG) {
  404. dev_err(max9611->dev,
  405. "Invalid value received from ADC 0x%4x: aborting\n",
  406. regval);
  407. return -EIO;
  408. }
  409. /* Mux shall be zeroed back before applying other configurations */
  410. ret = i2c_smbus_write_byte_data(max9611->i2c_client,
  411. MAX9611_REG_CTRL1, 0);
  412. if (ret) {
  413. dev_err(max9611->dev, "i2c write byte failed: 0x%2x - 0x%2x\n",
  414. MAX9611_REG_CTRL1, 0);
  415. return ret;
  416. }
  417. ret = i2c_smbus_write_byte_data(max9611->i2c_client,
  418. MAX9611_REG_CTRL2, 0);
  419. if (ret) {
  420. dev_err(max9611->dev, "i2c write byte failed: 0x%2x - 0x%2x\n",
  421. MAX9611_REG_CTRL2, 0);
  422. return ret;
  423. }
  424. usleep_range(MAX9611_CONV_TIME_US_RANGE);
  425. return 0;
  426. }
  427. static const struct of_device_id max9611_of_table[] = {
  428. {.compatible = "maxim,max9611", .data = "max9611"},
  429. {.compatible = "maxim,max9612", .data = "max9612"},
  430. { },
  431. };
  432. MODULE_DEVICE_TABLE(of, max9611_of_table);
  433. static int max9611_probe(struct i2c_client *client,
  434. const struct i2c_device_id *id)
  435. {
  436. const char * const shunt_res_prop = "shunt-resistor-micro-ohms";
  437. struct max9611_dev *max9611;
  438. struct iio_dev *indio_dev;
  439. struct device *dev = &client->dev;
  440. unsigned int of_shunt;
  441. int ret;
  442. indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*max9611));
  443. if (!indio_dev)
  444. return -ENOMEM;
  445. i2c_set_clientdata(client, indio_dev);
  446. max9611 = iio_priv(indio_dev);
  447. max9611->dev = dev;
  448. max9611->i2c_client = client;
  449. mutex_init(&max9611->lock);
  450. ret = device_property_read_u32(dev, shunt_res_prop, &of_shunt);
  451. if (ret) {
  452. dev_err(dev, "Missing %s property for %pfw node\n",
  453. shunt_res_prop, dev_fwnode(dev));
  454. return ret;
  455. }
  456. max9611->shunt_resistor_uohm = of_shunt;
  457. ret = max9611_init(max9611);
  458. if (ret)
  459. return ret;
  460. indio_dev->name = device_get_match_data(dev);
  461. indio_dev->modes = INDIO_DIRECT_MODE;
  462. indio_dev->info = &indio_info;
  463. indio_dev->channels = max9611_channels;
  464. indio_dev->num_channels = ARRAY_SIZE(max9611_channels);
  465. return devm_iio_device_register(dev, indio_dev);
  466. }
  467. static struct i2c_driver max9611_driver = {
  468. .driver = {
  469. .name = DRIVER_NAME,
  470. .of_match_table = max9611_of_table,
  471. },
  472. .probe = max9611_probe,
  473. };
  474. module_i2c_driver(max9611_driver);
  475. MODULE_AUTHOR("Jacopo Mondi <[email protected]>");
  476. MODULE_DESCRIPTION("Maxim max9611/12 current sense amplifier with 12bit ADC");
  477. MODULE_LICENSE("GPL v2");