static int lp8788_get_vbatt_adc(struct lp8788_charger *pchg, int *result) { struct iio_channel *channel = pchg->chan[LP8788_VBATT]; if (!channel) return -EINVAL; return iio_read_channel_processed(channel, result); }
static int madc_read(struct iio_channel *channel) { int val, err; err = iio_read_channel_processed(channel, &val); if (err < 0) return err; return val; }
static int read_channel(struct gab *adc_bat, enum power_supply_property psp, int *result) { int ret; int chan_index; chan_index = gab_prop_to_chan(psp); ret = iio_read_channel_processed(adc_bat->channel[chan_index], result); if (ret < 0) pr_err("read channel error\n"); return ret; }
static int gadc_thermal_get_temp(void *data, int *temp) { struct gadc_thermal_info *gti = data; int val; int ret; ret = iio_read_channel_processed(gti->channel, &val); if (ret < 0) { dev_err(gti->dev, "IIO channel read failed %d\n", ret); return ret; } *temp = gadc_thermal_adc_to_temp(gti, val); return 0; }
/* * Assumes that IIO and hwmon operate in the same base units. * This is supposed to be true, but needs verification for * new channel types. */ static ssize_t iio_hwmon_read_val(struct device *dev, struct device_attribute *attr, char *buf) { int result; int ret; struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr); struct iio_hwmon_state *state = dev_get_drvdata(dev); ret = iio_read_channel_processed(&state->channels[sattr->index], &result); if (ret < 0) return ret; return sprintf(buf, "%d\n", result); }
static int lp8788_get_battery_temperature(struct lp8788_charger *pchg, union power_supply_propval *val) { struct iio_channel *channel = pchg->chan[LP8788_BATT_TEMP]; int result; int ret; if (!channel) return -EINVAL; ret = iio_read_channel_processed(channel, &result); if (ret < 0) return -EINVAL; /* unit: 0.1 'C */ val->intval = result * 10; return 0; }
static u32 read_state(struct xgold_jack *jack) { int volt, ret; ret = iio_read_channel_processed(jack->iio_client, &volt); if (ret < 0) { xgold_err("Unable to read channel volt\n"); return XGOLD_ERROR; } xgold_debug("%s: measured voltage %d\n", __func__, volt); if (volt >= xgold_hs_typemap[HEADSET_INDEX].min_mv && volt <= xgold_hs_typemap[HEADSET_INDEX].max_mv) return XGOLD_HEADSET; else if (volt >= xgold_hs_typemap[HEADPHONE_INDEX].min_mv && volt <= xgold_hs_typemap[HEADPHONE_INDEX].max_mv) return XGOLD_HEADPHONE; else if (volt > xgold_hs_typemap[HEADSET_INDEX].max_mv) return XGOLD_HEADSET_REMOVED; else return XGOLD_INVALID; }
static int axp20x_usb_power_get_property(struct power_supply *psy, enum power_supply_property psp, union power_supply_propval *val) { struct axp20x_usb_power *power = power_supply_get_drvdata(psy); unsigned int input, v; int ret; switch (psp) { case POWER_SUPPLY_PROP_VOLTAGE_MIN: ret = regmap_read(power->regmap, AXP20X_VBUS_IPSOUT_MGMT, &v); if (ret) return ret; val->intval = AXP20X_VBUS_VHOLD_uV(v); return 0; case POWER_SUPPLY_PROP_VOLTAGE_NOW: if (IS_ENABLED(CONFIG_AXP20X_ADC)) { ret = iio_read_channel_processed(power->vbus_v, &val->intval); if (ret) return ret; /* * IIO framework gives mV but Power Supply framework * gives uV. */ val->intval *= 1000; return 0; } ret = axp20x_read_variable_width(power->regmap, AXP20X_VBUS_V_ADC_H, 12); if (ret < 0) return ret; val->intval = ret * 1700; /* 1 step = 1.7 mV */ return 0; case POWER_SUPPLY_PROP_CURRENT_MAX: ret = regmap_read(power->regmap, AXP20X_VBUS_IPSOUT_MGMT, &v); if (ret) return ret; switch (v & AXP20X_VBUS_CLIMIT_MASK) { case AXP20X_VBUC_CLIMIT_100mA: if (power->axp20x_id == AXP221_ID) val->intval = -1; /* No 100mA limit */ else val->intval = 100000; break; case AXP20X_VBUC_CLIMIT_500mA: val->intval = 500000; break; case AXP20X_VBUC_CLIMIT_900mA: val->intval = 900000; break; case AXP20X_VBUC_CLIMIT_NONE: val->intval = -1; break; } return 0; case POWER_SUPPLY_PROP_CURRENT_NOW: if (IS_ENABLED(CONFIG_AXP20X_ADC)) { ret = iio_read_channel_processed(power->vbus_i, &val->intval); if (ret) return ret; /* * IIO framework gives mA but Power Supply framework * gives uA. */ val->intval *= 1000; return 0; } ret = axp20x_read_variable_width(power->regmap, AXP20X_VBUS_I_ADC_H, 12); if (ret < 0) return ret; val->intval = ret * 375; /* 1 step = 0.375 mA */ return 0; default: break; } /* All the properties below need the input-status reg value */ ret = regmap_read(power->regmap, AXP20X_PWR_INPUT_STATUS, &input); if (ret) return ret; switch (psp) { case POWER_SUPPLY_PROP_HEALTH: if (!(input & AXP20X_PWR_STATUS_VBUS_PRESENT)) { val->intval = POWER_SUPPLY_HEALTH_UNKNOWN; break; } val->intval = POWER_SUPPLY_HEALTH_GOOD; if (power->axp20x_id == AXP202_ID) { ret = regmap_read(power->regmap, AXP20X_USB_OTG_STATUS, &v); if (ret) return ret; if (!(v & AXP20X_USB_STATUS_VBUS_VALID)) val->intval = POWER_SUPPLY_HEALTH_UNSPEC_FAILURE; } break; case POWER_SUPPLY_PROP_PRESENT: val->intval = !!(input & AXP20X_PWR_STATUS_VBUS_PRESENT); break; case POWER_SUPPLY_PROP_ONLINE: val->intval = !!(input & AXP20X_PWR_STATUS_VBUS_USED); break; default: return -EINVAL; } return 0; }