Lines Matching +full:current +full:- +full:sense +full:- +full:shunt

1 // SPDX-License-Identifier: GPL-2.0
5 * Maxim max9611/max9612 high side current sense amplifier with
6 * 12-bit ADC interface.
12 * This driver supports input common-mode voltage, current-sense
16 * Op-amp, analog comparator, and watchdog functionalities are not
48 * max9611 current sense amplifier voltage output:
56 * The complete formula to calculate current sense voltage is:
57 * (((adc_read >> 4) - offset) / ((1 / LSB) * 10^-3)
71 * (((adc_read >> 4) * 1000) - offset) / (1 / 14 * 1000)
113 * max9611_mux_conf - associate ADC mux configuration with register address
136 * max9611_csa_gain_conf - associate gain multiplier with LSB and
140 * on current sense amplifier path to ADC interface.
141 * Current sense read routine adjusts gain until it gets a meaningful
194 * max9611_read_single() - read a single value from ADC interface
201 * Data are transmitted with big-endian ordering: MSB arrives first.
217 * Keep mutex lock held during read-write to avoid mux register in max9611_read_single()
218 * (CTRL1) re-configuration. in max9611_read_single()
220 mutex_lock(&max9611->lock); in max9611_read_single()
221 ret = i2c_smbus_write_byte_data(max9611->i2c_client, in max9611_read_single()
224 dev_err(max9611->dev, "i2c write byte failed: 0x%2x - 0x%2x\n", in max9611_read_single()
226 mutex_unlock(&max9611->lock); in max9611_read_single()
234 ret = i2c_smbus_read_word_swapped(max9611->i2c_client, reg_addr); in max9611_read_single()
236 dev_err(max9611->dev, "i2c read word from 0x%2x failed\n", in max9611_read_single()
238 mutex_unlock(&max9611->lock); in max9611_read_single()
243 mutex_unlock(&max9611->lock); in max9611_read_single()
249 * max9611_read_csa_voltage() - read current sense amplifier output voltage
251 * Current sense amplifier output voltage is read through a configurable
283 return -EIO; in max9611_read_csa_voltage()
299 switch (chan->address) { in max9611_read_raw()
304 return -EINVAL; in max9611_read_raw()
313 return -EINVAL; in max9611_read_raw()
329 switch (chan->address) { in max9611_read_raw()
346 switch (chan->address) { in max9611_read_raw()
349 * processed (mV): (raw - offset) * LSB (nV) / 10^6 in max9611_read_raw()
357 return -EINVAL; in max9611_read_raw()
361 adc_data -= csa_gain[CSA_GAIN_OFFS_RAW]; in max9611_read_raw()
373 return -EINVAL; in max9611_read_raw()
377 adc_data -= csa_gain[CSA_GAIN_OFFS_RAW]; in max9611_read_raw()
380 *val2 = dev->shunt_resistor_uohm; in max9611_read_raw()
392 return -EINVAL; in max9611_read_raw()
394 adc_data -= MAX9611_CIM_OFFSET_RAW; in max9611_read_raw()
401 return -EINVAL; in max9611_read_raw()
406 adc_data -= csa_gain[CSA_GAIN_OFFS_RAW]; in max9611_read_raw()
409 *val2 = dev->shunt_resistor_uohm; in max9611_read_raw()
417 return -EINVAL; in max9611_read_raw()
427 i = max9611->shunt_resistor_uohm / 1000000; in max9611_shunt_resistor_show()
428 r = max9611->shunt_resistor_uohm % 1000000; in max9611_shunt_resistor_show()
455 struct i2c_client *client = max9611->i2c_client; in max9611_init()
459 if (!i2c_check_functionality(client->adapter, in max9611_init()
462 dev_err(max9611->dev, in max9611_init()
464 return -EINVAL; in max9611_init()
477 dev_err(max9611->dev, in max9611_init()
480 return -EIO; in max9611_init()
484 ret = i2c_smbus_write_byte_data(max9611->i2c_client, in max9611_init()
487 dev_err(max9611->dev, "i2c write byte failed: 0x%2x - 0x%2x\n", in max9611_init()
492 ret = i2c_smbus_write_byte_data(max9611->i2c_client, in max9611_init()
495 dev_err(max9611->dev, "i2c write byte failed: 0x%2x - 0x%2x\n", in max9611_init()
513 const char * const shunt_res_prop = "shunt-resistor-micro-ohms"; in max9611_probe()
516 struct device *dev = &client->dev; in max9611_probe()
520 indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*max9611)); in max9611_probe()
522 return -ENOMEM; in max9611_probe()
527 max9611->dev = dev; in max9611_probe()
528 max9611->i2c_client = client; in max9611_probe()
529 mutex_init(&max9611->lock); in max9611_probe()
537 max9611->shunt_resistor_uohm = of_shunt; in max9611_probe()
543 indio_dev->name = device_get_match_data(dev); in max9611_probe()
544 indio_dev->modes = INDIO_DIRECT_MODE; in max9611_probe()
545 indio_dev->info = &indio_info; in max9611_probe()
546 indio_dev->channels = max9611_channels; in max9611_probe()
547 indio_dev->num_channels = ARRAY_SIZE(max9611_channels); in max9611_probe()
562 MODULE_DESCRIPTION("Maxim max9611/12 current sense amplifier with 12bit ADC");