Lines Matching +full:input +full:- +full:analog +full:- +full:gain
1 // SPDX-License-Identifier: GPL-2.0-only
87 * struct stx104_iio - IIO device private data structure
89 * @aio_data_map: Regmap for analog I/O data
90 * @aio_ctl_map: Regmap for analog I/O control
182 err = regmap_read(priv->aio_ctl_map, STX104_ADC_CONFIGURATION, &adc_config); in stx104_read_raw()
189 if (chan->output) { in stx104_read_raw()
190 err = regmap_read(priv->aio_data_map, STX104_DAC_OFFSET(chan->channel), in stx104_read_raw()
198 mutex_lock(&priv->lock); in stx104_read_raw()
201 err = regmap_write(priv->aio_ctl_map, STX104_ADC_CHANNEL, in stx104_read_raw()
202 STX104_SINGLE_CHANNEL(chan->channel)); in stx104_read_raw()
204 mutex_unlock(&priv->lock); in stx104_read_raw()
209 * Trigger ADC sample capture by writing to the 8-bit Software Strobe Register and in stx104_read_raw()
211 * in steps of 25 nanoseconds. The actual Analog Input Frame Timer time interval is in stx104_read_raw()
216 err = regmap_write(priv->aio_ctl_map, STX104_SOFTWARE_STROBE, 0); in stx104_read_raw()
218 mutex_unlock(&priv->lock); in stx104_read_raw()
221 err = regmap_read_poll_timeout(priv->aio_ctl_map, STX104_ADC_STATUS, adc_status, in stx104_read_raw()
224 mutex_unlock(&priv->lock); in stx104_read_raw()
228 err = regmap_read(priv->aio_data_map, STX104_ADC_DATA, &value); in stx104_read_raw()
230 mutex_unlock(&priv->lock); in stx104_read_raw()
235 mutex_unlock(&priv->lock); in stx104_read_raw()
239 err = regmap_read(priv->aio_ctl_map, STX104_ADC_CONFIGURATION, &adc_config); in stx104_read_raw()
243 *val = (u8_get_bits(adc_config, STX104_ADBU) == STX104_BIPOLAR) ? -32768 : 0; in stx104_read_raw()
246 /* get ADC bipolar/unipolar and gain configuration */ in stx104_read_raw()
247 err = regmap_read(priv->aio_ctl_map, STX104_ADC_CONFIGURATION, &adc_config); in stx104_read_raw()
257 return -EINVAL; in stx104_read_raw()
264 u8 gain; in stx104_write_raw() local
268 /* Only four gain states (x1, x2, x4, x8) */ in stx104_write_raw()
271 gain = STX104_GAIN_X1; in stx104_write_raw()
274 gain = STX104_GAIN_X2; in stx104_write_raw()
277 gain = STX104_GAIN_X4; in stx104_write_raw()
280 gain = STX104_GAIN_X8; in stx104_write_raw()
283 return -EINVAL; in stx104_write_raw()
286 return regmap_write(priv->aio_ctl_map, STX104_ADC_CONFIGURATION, gain); in stx104_write_raw()
288 if (!chan->output) in stx104_write_raw()
289 return -EINVAL; in stx104_write_raw()
292 return -EINVAL; in stx104_write_raw()
294 return regmap_write(priv->aio_data_map, STX104_DAC_OFFSET(chan->channel), val); in stx104_write_raw()
297 return -EINVAL; in stx104_write_raw()
305 /* single-ended input channels configuration */
315 /* differential input channels configuration */
327 /* Output lines are located at same register bit offsets as input lines */ in stx104_reg_mask_xlate()
329 offset -= 4; in stx104_reg_mask_xlate()
347 err = regmap_write(priv->aio_ctl_map, STX104_ADC_CONTROL, STX104_SOFTWARE_TRIGGER); in stx104_init_hw()
351 /* initialize gain setting to x1 */ in stx104_init_hw()
352 err = regmap_write(priv->aio_ctl_map, STX104_ADC_CONFIGURATION, STX104_GAIN_X1); in stx104_init_hw()
357 err = regmap_write(priv->aio_data_map, STX104_DAC_BASE, 0); in stx104_init_hw()
360 err = regmap_write(priv->aio_data_map, STX104_DAC_BASE + STX104_AIO_DATA_STRIDE, 0); in stx104_init_hw()
381 return -ENOMEM; in stx104_probe()
385 dev_err(dev, "Unable to lock port addresses (0x%X-0x%X)\n", in stx104_probe()
387 return -EBUSY; in stx104_probe()
392 return -ENOMEM; in stx104_probe()
410 priv->aio_ctl_map = aio_ctl_map; in stx104_probe()
411 priv->aio_data_map = aio_data_map; in stx104_probe()
413 indio_dev->info = &stx104_info; in stx104_probe()
414 indio_dev->modes = INDIO_DIRECT_MODE; in stx104_probe()
421 indio_dev->num_channels = ARRAY_SIZE(stx104_channels_diff); in stx104_probe()
422 indio_dev->channels = stx104_channels_diff; in stx104_probe()
424 indio_dev->num_channels = ARRAY_SIZE(stx104_channels_sing); in stx104_probe()
425 indio_dev->channels = stx104_channels_sing; in stx104_probe()
428 indio_dev->name = dev_name(dev); in stx104_probe()
430 mutex_init(&priv->lock); in stx104_probe()