Lines Matching +full:shunt +full:- +full:resistor +full:- +full:micro +full:- +full:ohms

1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * isl28022.c - driver for Renesas ISL28022 power monitor chip monitoring
5 * Copyright (c) 2023 Carsten Spieß <mail@carsten-spiess.de>
42 /* shunt ADC settings */
62 /* shunt voltage range */
66 #define ISL28022_PG_40 0x0 /* +/-40 mV */
67 #define ISL28022_PG_80 0x1 /* +/-80 mV */
68 #define ISL28022_PG_160 0x2 /* +/-160 mV */
69 #define ISL28022_PG_320 0x3 /* +/-3200 mV */
84 u32 shunt; member
100 err = regmap_read(data->regmap, in isl28022_read_in()
108 return -EOPNOTSUPP; in isl28022_read_in()
114 err = regmap_read(data->regmap, in isl28022_read_in()
118 switch (data->gain) { in isl28022_read_in()
121 *val = (long)((((u16)regval) & 0x7FFF) - in isl28022_read_in()
126 *val = (long)((((u16)regval) & 0x3FFF) - in isl28022_read_in()
131 *val = (long)((((u16)regval) & 0x1FFF) - in isl28022_read_in()
136 *val = (long)((((u16)regval) & 0x0FFF) - in isl28022_read_in()
142 return -EOPNOTSUPP; in isl28022_read_in()
146 return -EOPNOTSUPP; in isl28022_read_in()
160 err = regmap_read(data->regmap, in isl28022_read_current()
164 *val = ((long)regval * 1250L * (long)data->gain) / in isl28022_read_current()
165 (long)data->shunt; in isl28022_read_current()
168 return -EOPNOTSUPP; in isl28022_read_current()
182 err = regmap_read(data->regmap, in isl28022_read_power()
186 *val = ((51200000L * ((long)data->gain)) / in isl28022_read_power()
187 (long)data->shunt) * (long)regval; in isl28022_read_power()
190 return -EOPNOTSUPP; in isl28022_read_power()
207 return -EOPNOTSUPP; in isl28022_read()
249 HWMON_I_INPUT), /* channel 1: shunt voltage (mV) */
311 struct isl28022_data *data = seqf->private; in shunt_voltage_show()
315 err = regmap_read(data->regmap, in shunt_voltage_show()
320 /* print shunt voltage in micro volt */ in shunt_voltage_show()
330 * following values for shunt range and resistor are allowed:
331 * 40 mV -> gain 1, shunt min. 800 micro ohms
332 * 80 mV -> gain 2, shunt min. 1600 micro ohms
333 * 160 mV -> gain 4, shunt min. 3200 micro ohms
334 * 320 mV -> gain 8, shunt min. 6400 micro ohms
341 err = device_property_read_u32(dev, "shunt-resistor-micro-ohms", &val); in isl28022_read_properties()
342 if (err == -EINVAL) in isl28022_read_properties()
346 data->shunt = val; in isl28022_read_properties()
348 err = device_property_read_u32(dev, "renesas,shunt-range-microvolt", &val); in isl28022_read_properties()
349 if (err == -EINVAL) in isl28022_read_properties()
356 data->gain = 1; in isl28022_read_properties()
357 if (data->shunt < 800) in isl28022_read_properties()
361 data->gain = 2; in isl28022_read_properties()
362 if (data->shunt < 1600) in isl28022_read_properties()
366 data->gain = 4; in isl28022_read_properties()
367 if (data->shunt < 3200) in isl28022_read_properties()
371 data->gain = 8; in isl28022_read_properties()
372 if (data->shunt < 6400) in isl28022_read_properties()
376 return dev_err_probe(dev, -EINVAL, in isl28022_read_properties()
377 "renesas,shunt-range-microvolt invalid value %d\n", in isl28022_read_properties()
381 err = device_property_read_u32(dev, "renesas,average-samples", &val); in isl28022_read_properties()
382 if (err == -EINVAL) in isl28022_read_properties()
387 return dev_err_probe(dev, -EINVAL, in isl28022_read_properties()
388 "renesas,average-samples invalid value %d\n", in isl28022_read_properties()
391 data->average = val; in isl28022_read_properties()
396 return dev_err_probe(dev, -EINVAL, in isl28022_read_properties()
397 "renesas,shunt-resistor-microvolt invalid value %d\n", in isl28022_read_properties()
398 data->shunt); in isl28022_read_properties()
404 * The driver supports only shunt and bus continuous ADC mode at 15bit resolution
406 * Shunt voltage gain 1,2,4 or 8 is allowed.
417 (__ffs(data->gain) << ISL28022_PG_SHIFT) | in isl28022_config()
418 ((ISL28022_ADC_15_1 + __ffs(data->average)) << ISL28022_SADC_SHIFT) | in isl28022_config()
419 ((ISL28022_ADC_15_1 + __ffs(data->average)) << ISL28022_BADC_SHIFT); in isl28022_config()
421 calib = data->shunt ? 0x8000 / data->gain : 0; in isl28022_config()
423 err = regmap_write(data->regmap, ISL28022_REG_CONFIG, config); in isl28022_config()
427 return regmap_write(data->regmap, ISL28022_REG_CALIB, calib); in isl28022_config()
432 struct device *dev = &client->dev; in isl28022_probe()
437 if (!i2c_check_functionality(client->adapter, in isl28022_probe()
440 return -ENODEV; in isl28022_probe()
444 return -ENOMEM; in isl28022_probe()
450 data->regmap = devm_regmap_init_i2c(client, &isl28022_regmap_config); in isl28022_probe()
451 if (IS_ERR(data->regmap)) in isl28022_probe()
452 return PTR_ERR(data->regmap); in isl28022_probe()
458 debugfs_create_file("shunt_voltage", 0444, client->debugfs, data, &shunt_voltage_fops); in isl28022_probe()
460 hwmon_dev = devm_hwmon_device_register_with_info(dev, client->name, in isl28022_probe()
490 MODULE_AUTHOR("Carsten Spieß <mail@carsten-spiess.de>");