Lines Matching +full:input +full:- +full:analog +full:- +full:gain

1 // SPDX-License-Identifier: GPL-2.0-only
90 * struct stx104_iio - IIO device private data structure
92 * @aio_data_map: Regmap for analog I/O data
93 * @aio_ctl_map: Regmap for analog I/O control
211 err = regmap_read(priv->aio_ctl_map, STX104_ADC_CONFIGURATION, &adc_config); in stx104_read_raw()
218 if (chan->output) { in stx104_read_raw()
219 err = regmap_read(priv->aio_data_map, STX104_DAC_OFFSET(chan->channel), in stx104_read_raw()
227 mutex_lock(&priv->lock); in stx104_read_raw()
230 err = regmap_write(priv->aio_ctl_map, STX104_ADC_CHANNEL, in stx104_read_raw()
231 STX104_SINGLE_CHANNEL(chan->channel)); in stx104_read_raw()
233 mutex_unlock(&priv->lock); in stx104_read_raw()
238 * Trigger ADC sample capture by writing to the 8-bit Software Strobe Register and in stx104_read_raw()
240 * in steps of 25 nanoseconds. The actual Analog Input Frame Timer time interval is in stx104_read_raw()
245 err = regmap_write(priv->aio_ctl_map, STX104_SOFTWARE_STROBE, 0); in stx104_read_raw()
247 mutex_unlock(&priv->lock); in stx104_read_raw()
250 err = regmap_read_poll_timeout(priv->aio_ctl_map, STX104_ADC_STATUS, adc_status, in stx104_read_raw()
253 mutex_unlock(&priv->lock); in stx104_read_raw()
257 err = regmap_read(priv->aio_data_map, STX104_ADC_DATA, &value); in stx104_read_raw()
259 mutex_unlock(&priv->lock); in stx104_read_raw()
264 mutex_unlock(&priv->lock); in stx104_read_raw()
268 err = regmap_read(priv->aio_ctl_map, STX104_ADC_CONFIGURATION, &adc_config); in stx104_read_raw()
272 *val = (u8_get_bits(adc_config, STX104_ADBU) == STX104_BIPOLAR) ? -32768 : 0; in stx104_read_raw()
275 /* get ADC bipolar/unipolar and gain configuration */ in stx104_read_raw()
276 err = regmap_read(priv->aio_ctl_map, STX104_ADC_CONFIGURATION, &adc_config); in stx104_read_raw()
286 return -EINVAL; in stx104_read_raw()
293 u8 gain; in stx104_write_raw() local
297 /* Only four gain states (x1, x2, x4, x8) */ in stx104_write_raw()
300 gain = STX104_GAIN_X1; in stx104_write_raw()
303 gain = STX104_GAIN_X2; in stx104_write_raw()
306 gain = STX104_GAIN_X4; in stx104_write_raw()
309 gain = STX104_GAIN_X8; in stx104_write_raw()
312 return -EINVAL; in stx104_write_raw()
315 return regmap_write(priv->aio_ctl_map, STX104_ADC_CONFIGURATION, gain); in stx104_write_raw()
317 if (!chan->output) in stx104_write_raw()
318 return -EINVAL; in stx104_write_raw()
321 return -EINVAL; in stx104_write_raw()
323 return regmap_write(priv->aio_data_map, STX104_DAC_OFFSET(chan->channel), val); in stx104_write_raw()
326 return -EINVAL; in stx104_write_raw()
334 /* single-ended input channels configuration */
344 /* differential input channels configuration */
356 /* Output lines are located at same register bit offsets as input lines */ in stx104_reg_mask_xlate()
358 offset -= 4; in stx104_reg_mask_xlate()
391 err = regmap_write(priv->aio_ctl_map, STX104_ADC_CONTROL, STX104_SOFTWARE_TRIGGER); in stx104_init_hw()
395 /* initialize gain setting to x1 */ in stx104_init_hw()
396 err = regmap_write(priv->aio_ctl_map, STX104_ADC_CONFIGURATION, STX104_GAIN_X1); in stx104_init_hw()
401 err = regmap_write(priv->aio_data_map, STX104_DAC_BASE, 0); in stx104_init_hw()
404 err = regmap_write(priv->aio_data_map, STX104_DAC_BASE + STX104_AIO_DATA_STRIDE, 0); in stx104_init_hw()
408 return bank_select_i8254(priv->aio_ctl_map); in stx104_init_hw()
426 return -ENOMEM; in stx104_probe()
430 dev_err(dev, "Unable to lock port addresses (0x%X-0x%X)\n", in stx104_probe()
432 return -EBUSY; in stx104_probe()
437 return -ENOMEM; in stx104_probe()
460 priv->aio_ctl_map = aio_ctl_map; in stx104_probe()
461 priv->aio_data_map = aio_data_map; in stx104_probe()
463 indio_dev->info = &stx104_info; in stx104_probe()
464 indio_dev->modes = INDIO_DIRECT_MODE; in stx104_probe()
471 indio_dev->num_channels = ARRAY_SIZE(stx104_channels_diff); in stx104_probe()
472 indio_dev->channels = stx104_channels_diff; in stx104_probe()
474 indio_dev->num_channels = ARRAY_SIZE(stx104_channels_sing); in stx104_probe()
475 indio_dev->channels = stx104_channels_sing; in stx104_probe()
478 indio_dev->name = dev_name(dev); in stx104_probe()
480 mutex_init(&priv->lock); in stx104_probe()