aw96103
static int aw96103_get_diff_raw(struct aw96103 *aw96103, unsigned int chan,
ret = regmap_read(aw96103->regmap,
struct aw96103 *aw96103 = iio_priv(indio_dev);
ret = aw96103_get_diff_raw(aw96103, chan->channel, val);
static int aw96103_read_thresh(struct aw96103 *aw96103,
ret = regmap_read(aw96103->regmap,
static int aw96103_read_out_debounce(struct aw96103 *aw96103,
ret = regmap_read(aw96103->regmap,
static int aw96103_read_in_debounce(struct aw96103 *aw96103,
ret = regmap_read(aw96103->regmap,
static int aw96103_read_hysteresis(struct aw96103 *aw96103,
ret = regmap_read(aw96103->regmap,
struct aw96103 *aw96103 = iio_priv(indio_dev);
return aw96103_read_thresh(aw96103, chan, val);
return aw96103_read_out_debounce(aw96103, chan, val);
return aw96103_read_in_debounce(aw96103, chan, val);
return aw96103_read_hysteresis(aw96103, chan, val);
struct aw96103 *aw96103 = iio_priv(indio_dev);
return regmap_write(aw96103->regmap,
return regmap_update_bits(aw96103->regmap,
return regmap_update_bits(aw96103->regmap,
return regmap_update_bits(aw96103->regmap,
struct aw96103 *aw96103 = iio_priv(indio_dev);
return aw96103->channels_arr[chan->channel].used;
struct aw96103 *aw96103 = iio_priv(indio_dev);
aw96103->channels_arr[chan->channel].used = !!state;
return regmap_update_bits(aw96103->regmap, AW96103_REG_SCANCTRL0,
static int aw96103_channel_scan_start(struct aw96103 *aw96103)
ret = regmap_write(aw96103->regmap, AW96103_REG_CMD,
return regmap_write(aw96103->regmap, AW96103_REG_IRQEN,
aw96103->hostirqen);
static int aw96103_reg_version_comp(struct aw96103 *aw96103,
ret = regmap_read(aw96103->regmap, AW96103_REG_FWVER2, &fw_ver);
for (i = 0; i < aw96103->max_channels; i++) {
ret = regmap_read(aw96103->regmap,
ret = regmap_update_bits(aw96103->regmap,
static int aw96103_bin_valid_loaded(struct aw96103 *aw96103,
aw96103->hostirqen = reg_data;
aw96103->chan_en = FIELD_GET(AW96103_CHAN_EN_MASK,
ret = regmap_write(aw96103->regmap, reg_addr, reg_data);
ret = aw96103_reg_version_comp(aw96103, aw_bin_data_s);
return aw96103_channel_scan_start(aw96103);
static int aw96103_para_loaded(struct aw96103 *aw96103)
ret = regmap_write(aw96103->regmap,
aw96103->hostirqen = aw96103_reg_default[i + 1];
aw96103->chan_en = FIELD_GET(AW96103_CHAN_EN_MASK,
return aw96103_channel_scan_start(aw96103);
struct aw96103 *aw96103)
return aw96103_bin_valid_loaded(aw96103, aw_bin);
struct aw96103 *aw96103 = data;
dev_err(aw96103->dev, "No firmware.\n");
ret = aw96103_cfg_all_loaded(fw, aw96103);
ret = aw96103_para_loaded(aw96103);
dev_err(aw96103->dev, "load param error.\n");
for (i = 0; i < aw96103->max_channels; i++) {
if ((aw96103->chan_en >> i) & 0x01)
aw96103->channels_arr[i].used = true;
aw96103->channels_arr[i].used = false;
static int aw96103_sw_reset(struct aw96103 *aw96103)
ret = regmap_write(aw96103->regmap, AW96103_REG_RESET, 0);
struct aw96103 *aw96103 = iio_priv(indio_dev);
ret = regmap_read(aw96103->regmap, AW96103_REG_IRQSRC, &irq_status);
ret = regmap_read(aw96103->regmap, AW96103_REG_STAT0, &curr_status_val);
for (i = 0; i < aw96103->max_channels; i++) {
if (!aw96103->channels_arr[i].used)
if (aw96103->channels_arr[i].old_irq_status == curr_status)
aw96103->channels_arr[i].old_irq_status = curr_status;
struct aw96103 *aw96103 = iio_priv(indio_dev);
ret = regmap_write(aw96103->regmap, AW96103_REG_IRQEN, 0);
ret = regmap_read(aw96103->regmap, AW96103_REG_IRQSRC, &irq_status);
ret = devm_request_threaded_irq(aw96103->dev, i2c->irq, NULL,
return regmap_write(aw96103->regmap, AW96103_REG_IRQEN,
aw96103->hostirqen);
static int aw96103_wait_chip_init(struct aw96103 *aw96103)
ret = regmap_read(aw96103->regmap, AW96103_REG_IRQSRC,
static int aw96103_read_chipid(struct aw96103 *aw96103)
ret = regmap_read(aw96103->regmap, AW96103_REG_CHIPID,
dev_info(aw96103->dev,
struct aw96103 *aw96103;
indio_dev = devm_iio_device_alloc(&i2c->dev, sizeof(*aw96103));
aw96103 = iio_priv(indio_dev);
aw96103->dev = &i2c->dev;
aw96103->max_channels = chip_info->num_channels;
aw96103->regmap = devm_regmap_init_i2c(i2c, &aw96103_regmap_confg);
if (IS_ERR(aw96103->regmap))
return PTR_ERR(aw96103->regmap);
ret = devm_regulator_get_enable(aw96103->dev, "vcc");
ret = aw96103_read_chipid(aw96103);
ret = aw96103_sw_reset(aw96103);
ret = aw96103_wait_chip_init(aw96103);
aw96103->dev, GFP_KERNEL, aw96103,
return devm_iio_device_register(aw96103->dev, indio_dev);