Lines Matching +full:single +full:- +full:channel
5 * SPDX-License-Identifier: GPL-2.0+
11 #include <sandbox-adc.h>
14 * struct sandbox_adc_priv - sandbox ADC device's operation status and data
16 * @conversion_status - conversion status: ACTIVE (started) / INACTIVE (stopped)
17 * @conversion_mode - conversion mode: single or multi-channel
18 * @active_channel - active channel number, valid for single channel mode
19 * data[] - channels data
28 int sandbox_adc_start_channel(struct udevice *dev, int channel) in sandbox_adc_start_channel() argument
32 /* Set single-channel mode */ in sandbox_adc_start_channel()
33 priv->conversion_mode = SANDBOX_ADC_MODE_SINGLE_CHANNEL; in sandbox_adc_start_channel()
34 /* Select channel */ in sandbox_adc_start_channel()
35 priv->active_channel_mask = 1 << channel; in sandbox_adc_start_channel()
37 priv->conversion_status = SANDBOX_ADC_ACTIVE; in sandbox_adc_start_channel()
46 /* Set single-channel mode */ in sandbox_adc_start_channels()
47 priv->conversion_mode = SANDBOX_ADC_MODE_MULTI_CHANNEL; in sandbox_adc_start_channels()
48 /* Select channel */ in sandbox_adc_start_channels()
49 priv->active_channel_mask = channel_mask; in sandbox_adc_start_channels()
51 priv->conversion_status = SANDBOX_ADC_ACTIVE; in sandbox_adc_start_channels()
56 int sandbox_adc_channel_data(struct udevice *dev, int channel, in sandbox_adc_channel_data() argument
61 /* For single-channel conversion mode, check if channel was selected */ in sandbox_adc_channel_data()
62 if ((priv->conversion_mode == SANDBOX_ADC_MODE_SINGLE_CHANNEL) && in sandbox_adc_channel_data()
63 !(priv->active_channel_mask & (1 << channel))) { in sandbox_adc_channel_data()
64 pr_err("Request for an inactive channel!"); in sandbox_adc_channel_data()
65 return -EINVAL; in sandbox_adc_channel_data()
69 if (priv->conversion_status == SANDBOX_ADC_INACTIVE) in sandbox_adc_channel_data()
70 return -EIO; in sandbox_adc_channel_data()
72 *data = priv->data[channel]; in sandbox_adc_channel_data()
83 /* Return error for single-channel conversion mode */ in sandbox_adc_channels_data()
84 if (priv->conversion_mode == SANDBOX_ADC_MODE_SINGLE_CHANNEL) { in sandbox_adc_channels_data()
85 pr_err("ADC in single-channel mode!"); in sandbox_adc_channels_data()
86 return -EPERM; in sandbox_adc_channels_data()
88 /* Check channel selection */ in sandbox_adc_channels_data()
89 if (!(priv->active_channel_mask & channel_mask)) { in sandbox_adc_channels_data()
90 pr_err("Request for an inactive channel!"); in sandbox_adc_channels_data()
91 return -EINVAL; in sandbox_adc_channels_data()
94 if (priv->conversion_status == SANDBOX_ADC_INACTIVE) in sandbox_adc_channels_data()
95 return -EIO; in sandbox_adc_channels_data()
101 channels->data = priv->data[i]; in sandbox_adc_channels_data()
102 channels->id = i; in sandbox_adc_channels_data()
114 priv->conversion_status = SANDBOX_ADC_INACTIVE; in sandbox_adc_stop()
124 priv->conversion_status = SANDBOX_ADC_INACTIVE; in sandbox_adc_probe()
125 /* Set single-channel mode */ in sandbox_adc_probe()
126 priv->conversion_mode = SANDBOX_ADC_MODE_SINGLE_CHANNEL; in sandbox_adc_probe()
128 priv->active_channel_mask = 0; in sandbox_adc_probe()
131 priv->data[0] = SANDBOX_ADC_CHANNEL0_DATA; in sandbox_adc_probe()
132 priv->data[1] = SANDBOX_ADC_CHANNEL1_DATA; in sandbox_adc_probe()
133 priv->data[2] = SANDBOX_ADC_CHANNEL2_DATA; in sandbox_adc_probe()
134 priv->data[3] = SANDBOX_ADC_CHANNEL3_DATA; in sandbox_adc_probe()
143 uc_pdata->data_mask = SANDBOX_ADC_DATA_MASK; in sandbox_adc_ofdata_to_platdata()
144 uc_pdata->data_format = ADC_DATA_FORMAT_BIN; in sandbox_adc_ofdata_to_platdata()
145 uc_pdata->data_timeout_us = 0; in sandbox_adc_ofdata_to_platdata()
147 /* Mask available channel bits: [0:3] */ in sandbox_adc_ofdata_to_platdata()
148 uc_pdata->channel_mask = (1 << SANDBOX_ADC_CHANNELS) - 1; in sandbox_adc_ofdata_to_platdata()
167 .name = "sandbox-adc",