Skip to content

Commit bccc4e6

Browse files
albertofloydfabiobaltieri
authored andcommitted
drivers: adc: xec: Handle incomplete ADC channel conversions
Report an error when the ADC # channels conversion is not complete. Signed-off-by: Jose Alberto Meza <[email protected]>
1 parent 1b0d975 commit bccc4e6

File tree

1 file changed

+17
-5
lines changed

1 file changed

+17
-5
lines changed

drivers/adc/adc_mchp_xec.c

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ static int adc_xec_read_async(const struct device *dev,
221221
}
222222
#endif /* CONFIG_ADC_ASYNC */
223223

224-
static void xec_adc_get_sample(const struct device *dev)
224+
static int xec_adc_get_sample(const struct device *dev)
225225
{
226226
struct adc_xec_regs *adc_regs = ADC_XEC_REG_BASE;
227227
struct adc_xec_data *data = dev->data;
@@ -240,7 +240,6 @@ static void xec_adc_get_sample(const struct device *dev)
240240
bit = find_lsb_set(channels);
241241
while (bit != 0) {
242242
idx = bit - 1;
243-
244243
*data->buffer = (uint16_t)adc_regs->channel_read_reg[idx];
245244
data->buffer++;
246245

@@ -250,13 +249,23 @@ static void xec_adc_get_sample(const struct device *dev)
250249

251250
/* Clear the status register */
252251
adc_regs->status_reg = ch_status;
252+
253+
/* Return error when requested ADC conversion was incomplete
254+
* for some channels.
255+
*/
256+
if (ch_status != adc_regs->single_reg) {
257+
return -EIO;
258+
}
259+
260+
return 0;
253261
}
254262

255263
static void adc_xec_isr(const struct device *dev)
256264
{
257265
struct adc_xec_regs *adc_regs = ADC_XEC_REG_BASE;
258266
struct adc_xec_data *data = dev->data;
259267
uint32_t reg;
268+
int ret;
260269

261270
/* Clear START_SINGLE bit and clear SINGLE_DONE_STATUS */
262271
reg = adc_regs->control_reg;
@@ -267,9 +276,12 @@ static void adc_xec_isr(const struct device *dev)
267276
/* Also clear GIRQ source status bit */
268277
MCHP_GIRQ_SRC(MCHP_ADC_GIRQ) = MCHP_ADC_SNG_DONE_GIRQ_VAL;
269278

270-
xec_adc_get_sample(dev);
271-
272-
adc_context_on_sampling_done(&data->ctx, dev);
279+
ret = xec_adc_get_sample(dev);
280+
if (ret) {
281+
adc_context_complete(&data->ctx, ret);
282+
} else {
283+
adc_context_on_sampling_done(&data->ctx, dev);
284+
}
273285

274286
LOG_DBG("ADC ISR triggered.");
275287
}

0 commit comments

Comments
 (0)