static int ltr501_read_event_config(struct iio_dev *indio_dev, const struct iio_chan_spec *chan, enum iio_event_type type, enum iio_event_direction dir) { struct ltr501_data *data = iio_priv(indio_dev); int ret, status; switch (chan->type) { case IIO_INTENSITY: ret = regmap_field_read(data->reg_als_intr, &status); if (ret < 0) return ret; return status; case IIO_PROXIMITY: ret = regmap_field_read(data->reg_ps_intr, &status); if (ret < 0) return ret; return status; default: return -EINVAL; } return -EINVAL; }
static unsigned da9063_ldo_get_mode(struct regulator_dev *rdev) { struct da9063_regulator *regl = rdev_get_drvdata(rdev); struct regmap_field *field; int ret, val; /* Detect current regulator state */ ret = regmap_field_read(regl->suspend, &val); if (ret < 0) return 0; /* Read regulator mode from proper register, depending on state */ if (val) field = regl->suspend_sleep; else field = regl->sleep; ret = regmap_field_read(field, &val); if (ret < 0) return 0; if (val) return REGULATOR_MODE_STANDBY; else return REGULATOR_MODE_NORMAL; }
/* Callback to get temperature from HW*/ static int st_thermal_get_temp(struct thermal_zone_device *th, unsigned long *temperature) { struct st_thermal_sensor *sensor = th->devdata; struct device *dev = sensor->dev; unsigned int temp; unsigned int overflow; int ret; ret = regmap_field_read(sensor->overflow, &overflow); if (ret) return ret; if (overflow) return -EIO; ret = regmap_field_read(sensor->temp_data, &temp); if (ret) return ret; temp += sensor->cdata->temp_adjust_val; temp = mcelsius(temp); dev_dbg(dev, "temperature: %d\n", temp); *temperature = temp; return 0; }
static int st_thermal_calibration(struct st_thermal_sensor *sensor) { int ret; unsigned int val; struct device *dev = sensor->dev; /* Check if sensor calibration data is already written */ ret = regmap_field_read(sensor->dcorrect, &val); if (ret) { dev_err(dev, "failed to read calibration data\n"); return ret; } if (!val) { /* * Sensor calibration value not set by bootloader, * default calibration data to be used */ ret = regmap_field_write(sensor->dcorrect, sensor->cdata->calibration_val); if (ret) dev_err(dev, "failed to set calibration data\n"); } return ret; }
static unsigned da9063_buck_get_mode(struct regulator_dev *rdev) { struct da9063_regulator *regl = rdev_get_drvdata(rdev); struct regmap_field *field; unsigned int val, mode = 0; int ret; ret = regmap_field_read(regl->mode, &val); if (ret < 0) return ret; switch (val) { default: case BUCK_MODE_MANUAL: mode = REGULATOR_MODE_FAST | REGULATOR_MODE_STANDBY; /* Sleep flag bit decides the mode */ break; case BUCK_MODE_SLEEP: return REGULATOR_MODE_STANDBY; case BUCK_MODE_SYNC: return REGULATOR_MODE_FAST; case BUCK_MODE_AUTO: return REGULATOR_MODE_NORMAL; } /* Detect current regulator state */ ret = regmap_field_read(regl->suspend, &val); if (ret < 0) return 0; /* Read regulator mode from proper register, depending on state */ if (val) field = regl->suspend_sleep; else field = regl->sleep; ret = regmap_field_read(field, &val); if (ret < 0) return 0; if (val) mode &= REGULATOR_MODE_STANDBY; else mode &= REGULATOR_MODE_NORMAL | REGULATOR_MODE_FAST; return mode; }
static int syscfg_reset_status(struct reset_controller_dev *rcdev, unsigned long idx) { struct syscfg_reset_controller *rst = to_syscfg_reset_controller(rcdev); const struct syscfg_reset_channel *ch; u32 ret_val = 0; int err; if (idx >= rcdev->nr_resets) return -EINVAL; ch = &rst->channels[idx]; if (ch->ack) err = regmap_field_read(ch->ack, &ret_val); else err = regmap_field_read(ch->reset, &ret_val); if (err) return err; return rst->active_low ? !ret_val : !!ret_val; }
static int ina3221_read_curr(struct device *dev, u32 attr, int channel, long *val) { struct ina3221_data *ina = dev_get_drvdata(dev); struct ina3221_input *input = &ina->inputs[channel]; int resistance_uo = input->shunt_resistor; u8 reg = ina3221_curr_reg[attr][channel]; int regval, voltage_nv, ret; switch (attr) { case hwmon_curr_input: if (!ina3221_is_enabled(ina, channel)) return -ENODATA; /* Write CONFIG register to trigger a single-shot measurement */ if (ina->single_shot) regmap_write(ina->regmap, INA3221_CONFIG, ina->reg_config); ret = ina3221_wait_for_data(ina); if (ret) return ret; /* fall through */ case hwmon_curr_crit: case hwmon_curr_max: ret = ina3221_read_value(ina, reg, ®val); if (ret) return ret; /* Scale of shunt voltage: LSB is 40uV (40000nV) */ voltage_nv = regval * 40000; /* Return current in mA */ *val = DIV_ROUND_CLOSEST(voltage_nv, resistance_uo); return 0; case hwmon_curr_crit_alarm: case hwmon_curr_max_alarm: /* No actual register read if channel is disabled */ if (!ina3221_is_enabled(ina, channel)) { /* Return 0 for alert flags */ *val = 0; return 0; } ret = regmap_field_read(ina->fields[reg], ®val); if (ret) return ret; *val = regval; return 0; default: return -EOPNOTSUPP; } }
static int ltr501_read_intr_prst(struct ltr501_data *data, enum iio_chan_type type, int *val2) { int ret, samp_period, prst; switch (type) { case IIO_INTENSITY: ret = regmap_field_read(data->reg_als_prst, &prst); if (ret < 0) return ret; ret = ltr501_als_read_samp_period(data, &samp_period); if (ret < 0) return ret; *val2 = samp_period * prst; return IIO_VAL_INT_PLUS_MICRO; case IIO_PROXIMITY: ret = regmap_field_read(data->reg_ps_prst, &prst); if (ret < 0) return ret; ret = ltr501_ps_read_samp_period(data, &samp_period); if (ret < 0) return ret; *val2 = samp_period * prst; return IIO_VAL_INT_PLUS_MICRO; default: return -EINVAL; } return -EINVAL; }
static int ltr501_ps_read_samp_period(struct ltr501_data *data, int *val) { int ret, i; ret = regmap_field_read(data->reg_ps_rate, &i); if (ret < 0) return ret; if (i < 0 || i >= ARRAY_SIZE(ltr501_ps_samp_table)) return -EINVAL; *val = ltr501_ps_samp_table[i].time_val; return IIO_VAL_INT; }
static int da9063_get_current_limit(struct regulator_dev *rdev) { struct da9063_regulator *regl = rdev_get_drvdata(rdev); const struct da9063_regulator_info *rinfo = regl->info; unsigned int sel; int ret; ret = regmap_field_read(regl->ilimit, &sel); if (ret < 0) return ret; if (sel >= rinfo->n_current_limits) sel = rinfo->n_current_limits - 1; return rinfo->current_limits[sel]; }
/* read int time in micro seconds */ static int ltr501_read_it_time(struct ltr501_data *data, int *val, int *val2) { int ret, index; ret = regmap_field_read(data->reg_it, &index); if (ret < 0) return ret; /* Make sure integ time index is valid */ if (index < 0 || index >= ARRAY_SIZE(int_time_mapping)) return -EINVAL; *val2 = int_time_mapping[index]; *val = 0; return IIO_VAL_INT_PLUS_MICRO; }
static int ltr501_ps_read_samp_freq(struct ltr501_data *data, int *val, int *val2) { int ret, i; ret = regmap_field_read(data->reg_ps_rate, &i); if (ret < 0) return ret; if (i < 0 || i >= ARRAY_SIZE(ltr501_ps_samp_table)) return -EINVAL; *val = ltr501_ps_samp_table[i].freq_val / 1000000; *val2 = ltr501_ps_samp_table[i].freq_val % 1000000; return IIO_VAL_INT_PLUS_MICRO; }
static int syscfg_reset_program_hw(struct reset_controller_dev *rcdev, unsigned long idx, int assert) { struct syscfg_reset_controller *rst = to_syscfg_reset_controller(rcdev); const struct syscfg_reset_channel *ch; u32 ctrl_val = rst->active_low ? !assert : !!assert; int err; if (idx >= rcdev->nr_resets) return -EINVAL; ch = &rst->channels[idx]; err = regmap_field_write(ch->reset, ctrl_val); if (err) return err; if (ch->ack) { unsigned long timeout = jiffies + msecs_to_jiffies(1000); u32 ack_val; while (true) { err = regmap_field_read(ch->ack, &ack_val); if (err) return err; if (ack_val == ctrl_val) break; if (time_after(jiffies, timeout)) return -ETIME; cpu_relax(); } } return 0; }