Lines Matching +full:adc +full:- +full:diff +full:- +full:channels

1 // SPDX-License-Identifier: GPL-2.0-only
27 #define STX104_IN_CHAN(chan, diff) { \ argument
35 .differential = diff \
48 * struct stx104_iio - IIO device private data structure
49 * @chan_out_states: channels' output states
58 * struct stx104_gpio - GPIO device private data structure
82 adc_config = inb(priv->base + 11); in stx104_read_raw()
88 if (chan->output) { in stx104_read_raw()
89 *val = priv->chan_out_states[chan->channel]; in stx104_read_raw()
93 /* select ADC channel */ in stx104_read_raw()
94 outb(chan->channel | (chan->channel << 4), priv->base + 2); in stx104_read_raw()
96 /* trigger ADC sample capture and wait for completion */ in stx104_read_raw()
97 outb(0, priv->base); in stx104_read_raw()
98 while (inb(priv->base + 8) & BIT(7)); in stx104_read_raw()
100 *val = inw(priv->base); in stx104_read_raw()
103 /* get ADC bipolar/unipolar configuration */ in stx104_read_raw()
104 adc_config = inb(priv->base + 11); in stx104_read_raw()
107 *val = -32768 * adbu; in stx104_read_raw()
110 /* get ADC bipolar/unipolar and gain configuration */ in stx104_read_raw()
111 adc_config = inb(priv->base + 11); in stx104_read_raw()
116 *val2 = 15 - adbu + gain; in stx104_read_raw()
120 return -EINVAL; in stx104_read_raw()
133 outb(0, priv->base + 11); in stx104_write_raw()
136 outb(1, priv->base + 11); in stx104_write_raw()
139 outb(2, priv->base + 11); in stx104_write_raw()
142 outb(3, priv->base + 11); in stx104_write_raw()
145 return -EINVAL; in stx104_write_raw()
150 if (chan->output) { in stx104_write_raw()
151 /* DAC can only accept up to a 16-bit value */ in stx104_write_raw()
153 return -EINVAL; in stx104_write_raw()
155 priv->chan_out_states[chan->channel] = val; in stx104_write_raw()
156 outw(val, priv->base + 4 + 2 * chan->channel); in stx104_write_raw()
160 return -EINVAL; in stx104_write_raw()
163 return -EINVAL; in stx104_write_raw()
171 /* single-ended input channels configuration */
181 /* differential input channels configuration */
192 /* GPIO 0-3 are input only, while the rest are output only */ in stx104_gpio_get_direction()
203 return -EINVAL; in stx104_gpio_direction_input()
212 return -EINVAL; in stx104_gpio_direction_output()
214 chip->set(chip, offset, value); in stx104_gpio_direction_output()
223 return -EINVAL; in stx104_gpio_get()
225 return !!(inb(stx104gpio->base) & BIT(offset)); in stx104_gpio_get()
233 *bits = inb(stx104gpio->base); in stx104_gpio_get_multiple()
248 spin_lock_irqsave(&stx104gpio->lock, flags); in stx104_gpio_set()
251 stx104gpio->out_state |= mask; in stx104_gpio_set()
253 stx104gpio->out_state &= ~mask; in stx104_gpio_set()
255 outb(stx104gpio->out_state, stx104gpio->base); in stx104_gpio_set()
257 spin_unlock_irqrestore(&stx104gpio->lock, flags); in stx104_gpio_set()
278 spin_lock_irqsave(&stx104gpio->lock, flags); in stx104_gpio_set_multiple()
280 stx104gpio->out_state &= ~*mask; in stx104_gpio_set_multiple()
281 stx104gpio->out_state |= *mask & *bits; in stx104_gpio_set_multiple()
282 outb(stx104gpio->out_state, stx104gpio->base); in stx104_gpio_set_multiple()
284 spin_unlock_irqrestore(&stx104gpio->lock, flags); in stx104_gpio_set_multiple()
296 return -ENOMEM; in stx104_probe()
300 return -ENOMEM; in stx104_probe()
304 dev_err(dev, "Unable to lock port addresses (0x%X-0x%X)\n", in stx104_probe()
306 return -EBUSY; in stx104_probe()
309 indio_dev->info = &stx104_info; in stx104_probe()
310 indio_dev->modes = INDIO_DIRECT_MODE; in stx104_probe()
314 indio_dev->num_channels = ARRAY_SIZE(stx104_channels_diff); in stx104_probe()
315 indio_dev->channels = stx104_channels_diff; in stx104_probe()
317 indio_dev->num_channels = ARRAY_SIZE(stx104_channels_sing); in stx104_probe()
318 indio_dev->channels = stx104_channels_sing; in stx104_probe()
321 indio_dev->name = dev_name(dev); in stx104_probe()
324 priv->base = base[id]; in stx104_probe()
336 stx104gpio->chip.label = dev_name(dev); in stx104_probe()
337 stx104gpio->chip.parent = dev; in stx104_probe()
338 stx104gpio->chip.owner = THIS_MODULE; in stx104_probe()
339 stx104gpio->chip.base = -1; in stx104_probe()
340 stx104gpio->chip.ngpio = STX104_NGPIO; in stx104_probe()
341 stx104gpio->chip.names = stx104_names; in stx104_probe()
342 stx104gpio->chip.get_direction = stx104_gpio_get_direction; in stx104_probe()
343 stx104gpio->chip.direction_input = stx104_gpio_direction_input; in stx104_probe()
344 stx104gpio->chip.direction_output = stx104_gpio_direction_output; in stx104_probe()
345 stx104gpio->chip.get = stx104_gpio_get; in stx104_probe()
346 stx104gpio->chip.get_multiple = stx104_gpio_get_multiple; in stx104_probe()
347 stx104gpio->chip.set = stx104_gpio_set; in stx104_probe()
348 stx104gpio->chip.set_multiple = stx104_gpio_set_multiple; in stx104_probe()
349 stx104gpio->base = base[id] + 3; in stx104_probe()
350 stx104gpio->out_state = 0x0; in stx104_probe()
352 spin_lock_init(&stx104gpio->lock); in stx104_probe()
354 err = devm_gpiochip_add_data(dev, &stx104gpio->chip, stx104gpio); in stx104_probe()