diff --git a/drivers/adc/CMakeLists.txt b/drivers/adc/CMakeLists.txt index d771bdbe265..5353de86f01 100644 --- a/drivers/adc/CMakeLists.txt +++ b/drivers/adc/CMakeLists.txt @@ -2,7 +2,6 @@ zephyr_library() zephyr_library_sources_ifdef(CONFIG_ADC_DW adc_dw.c) zephyr_library_sources_ifdef(CONFIG_ADC_MCUX_ADC16 adc_mcux_adc16.c) -zephyr_library_sources_ifdef(CONFIG_ADC_QMSI adc_qmsi.c) zephyr_library_sources_ifdef(CONFIG_ADC_SAM_AFEC adc_sam_afec.c) zephyr_library_sources_ifdef(CONFIG_ADC_TI_ADC108S102 adc_ti_adc108s102.c) zephyr_library_sources_ifdef(CONFIG_ADC_NRFX_ADC adc_nrfx_adc.c) diff --git a/drivers/adc/Kconfig b/drivers/adc/Kconfig index cb6cf605198..241bc05b0d9 100644 --- a/drivers/adc/Kconfig +++ b/drivers/adc/Kconfig @@ -90,8 +90,6 @@ source "drivers/adc/Kconfig.mcux" source "drivers/adc/Kconfig.nrfx" -source "drivers/adc/Kconfig.qmsi" - source "drivers/adc/Kconfig.sam_afec" source "drivers/adc/Kconfig.ti_adc108s102" diff --git a/drivers/adc/Kconfig.qmsi b/drivers/adc/Kconfig.qmsi deleted file mode 100644 index c9debde6346..00000000000 --- a/drivers/adc/Kconfig.qmsi +++ /dev/null @@ -1,69 +0,0 @@ -# Kconfig - ADC configuration options - -# -# Copyright (c) 2015 Intel Corporation -# -# SPDX-License-Identifier: Apache-2.0 -# - -menuconfig ADC_QMSI - bool "QMSI ADC Driver" - depends on QMSI - select ADC_0 - help - Enable the driver implementation of the QMSI ADC IP. - -if ADC_QMSI - -choice - prompt "Capturing Mode" - default ADC_QMSI_INTERRUPT - help - ADC sample capture mode - interrupt mode/polling mode - -config ADC_QMSI_POLL - bool "Polling samples" - -config ADC_QMSI_INTERRUPT - bool "Interrupt notification" - -endchoice - -config ADC_QMSI_CALIBRATION - bool "Enable Calibration" - default y - help - Enables ADC to run with a calibrated output at the - expense of execution speed when exiting low power states. - If disabled, the ADC will require the application/system-integrator - to provide a calibration method. - -config ADC_QMSI_CLOCK_RATIO - int "Clock Ratio" - default 100 - help - ADC Clock Ratio - -config ADC_QMSI_SERIAL_DELAY - int "Serial Delay" - default 1 - help - Number of ADC clock ticks that the first bit of - the serial output is delayed after the conversion - has started. - -config ADC_QMSI_SAMPLE_WIDTH - int "Sample Width" - default 3 - help - Defines ADC device data sample width (resolution): - - - 0 = 6 bits resolution - - - 1 = 8 bits resolution - - - 2 = 10 bits resolution - - - 3 = 12 bits resolution - -endif # ADC_QMSI diff --git a/drivers/adc/adc_qmsi.c b/drivers/adc/adc_qmsi.c deleted file mode 100644 index 07dffbb8cb5..00000000000 --- a/drivers/adc/adc_qmsi.c +++ /dev/null @@ -1,266 +0,0 @@ -/* adc_qmsi.c - QMSI ADC driver */ - -/* - * Copyright (c) 2016 Intel Corporation - * - * SPDX-License-Identifier: Apache-2.0 - */ -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "qm_isr.h" -#include "qm_adc.h" -#include "clk.h" - -enum { - ADC_STATE_IDLE, - ADC_STATE_BUSY, - ADC_STATE_ERROR -}; - -struct adc_info { - atomic_t state; - struct k_sem device_sync_sem; - struct k_sem sem; -}; - -static void adc_config_irq(void); -static qm_adc_config_t cfg; - -#if (CONFIG_ADC_QMSI_INTERRUPT) -static struct adc_info *adc_context; - -static void complete_callback(void *data, int error, qm_adc_status_t status, - qm_adc_cb_source_t source) -{ - if (adc_context) { - if (error) { - adc_context->state = ADC_STATE_ERROR; - } - k_sem_give(&adc_context->device_sync_sem); - } -} - -#endif - -static void adc_lock(struct adc_info *data) -{ - k_sem_take(&data->sem, K_FOREVER); - data->state = ADC_STATE_BUSY; - -} -static void adc_unlock(struct adc_info *data) -{ - k_sem_give(&data->sem); - data->state = ADC_STATE_IDLE; - -} -#if (CONFIG_ADC_QMSI_CALIBRATION) -static void adc_qmsi_enable(struct device *dev) -{ - struct adc_info *info = dev->driver_data; - - adc_lock(info); - qm_adc_set_mode(QM_ADC_0, QM_ADC_MODE_NORM_CAL); - qm_adc_calibrate(QM_ADC_0); - adc_unlock(info); -} - -#else -static void adc_qmsi_enable(struct device *dev) -{ - struct adc_info *info = dev->driver_data; - - adc_lock(info); - qm_adc_set_mode(QM_ADC_0, QM_ADC_MODE_NORM_NO_CAL); - adc_unlock(info); -} -#endif /* CONFIG_ADC_QMSI_CALIBRATION */ - -static void adc_qmsi_disable(struct device *dev) -{ - struct adc_info *info = dev->driver_data; - - adc_lock(info); - /* Go to deep sleep */ - qm_adc_set_mode(QM_ADC_0, QM_ADC_MODE_DEEP_PWR_DOWN); - adc_unlock(info); -} - -#if (CONFIG_ADC_QMSI_POLL) -static int adc_qmsi_read(struct device *dev, struct adc_seq_table *seq_tbl) -{ - int i, ret = 0; - qm_adc_xfer_t xfer; - qm_adc_status_t status; - - struct adc_info *info = dev->driver_data; - - - for (i = 0; i < seq_tbl->num_entries; i++) { - - xfer.ch = (qm_adc_channel_t *)&seq_tbl->entries[i].channel_id; - /* Just one channel at the time using the Zephyr sequence table - */ - xfer.ch_len = 1; - xfer.samples = (qm_adc_sample_t *)seq_tbl->entries[i].buffer; - - /* buffer length (bytes) the number of samples, the QMSI Driver - * does not allow more than QM_ADC_FIFO_LEN samples at the time - * in polling mode, if that happens, the qm_adc_convert api will - * return with an error - */ - xfer.samples_len = - (seq_tbl->entries[i].buffer_length)/sizeof(qm_adc_sample_t); - - xfer.callback = NULL; - xfer.callback_data = NULL; - - cfg.window = seq_tbl->entries[i].sampling_delay; - - adc_lock(info); - - if (qm_adc_set_config(QM_ADC_0, &cfg) != 0) { - ret = -EINVAL; - adc_unlock(info); - break; - } - - /* Run the conversion, here the function will poll for the - * samples. The function will constantly read the status - * register to check if the number of samples required has been - * captured - */ - if (qm_adc_convert(QM_ADC_0, &xfer, &status) != 0) { - ret = -EIO; - adc_unlock(info); - break; - } - - /* Successful Analog to Digital conversion */ - adc_unlock(info); - } - - return ret; -} -#else -static int adc_qmsi_read(struct device *dev, struct adc_seq_table *seq_tbl) -{ - int i, ret = 0; - qm_adc_xfer_t xfer; - - struct adc_info *info = dev->driver_data; - - for (i = 0; i < seq_tbl->num_entries; i++) { - - xfer.ch = (qm_adc_channel_t *)&seq_tbl->entries[i].channel_id; - /* Just one channel at the time using the Zephyr sequence table */ - xfer.ch_len = 1; - xfer.samples = - (qm_adc_sample_t *)seq_tbl->entries[i].buffer; - - xfer.samples_len = - (seq_tbl->entries[i].buffer_length)/sizeof(qm_adc_sample_t); - - xfer.callback = complete_callback; - xfer.callback_data = NULL; - - cfg.window = seq_tbl->entries[i].sampling_delay; - - adc_lock(info); - - if (qm_adc_set_config(QM_ADC_0, &cfg) != 0) { - ret = -EINVAL; - adc_unlock(info); - break; - } - - /* ADC info used by the callbacks */ - adc_context = info; - - /* This is the interrupt driven API, will generate and interrupt and - * call the complete_callback function once the samples have been - * obtained - */ - if (qm_adc_irq_convert(QM_ADC_0, &xfer) != 0) { - adc_context = NULL; - ret = -EIO; - adc_unlock(info); - break; - } - - /* Wait for the interrupt to finish */ - k_sem_take(&info->device_sync_sem, K_FOREVER); - - if (info->state == ADC_STATE_ERROR) { - ret = -EIO; - adc_unlock(info); - break; - } - adc_context = NULL; - - /* Successful Analog to Digital conversion */ - adc_unlock(info); - } - - return ret; -} -#endif /* CONFIG_ADC_QMSI_POLL */ - -static const struct adc_driver_api api_funcs = { - .enable = adc_qmsi_enable, - .disable = adc_qmsi_disable, - .read = adc_qmsi_read, -}; - -static int adc_qmsi_init(struct device *dev) -{ - struct adc_info *info = dev->driver_data; - - /* Enable the ADC and set the clock divisor */ - clk_periph_enable(CLK_PERIPH_CLK | CLK_PERIPH_ADC | - CLK_PERIPH_ADC_REGISTER); - /* ADC clock divider*/ - clk_adc_set_div(CONFIG_ADC_QMSI_CLOCK_RATIO); - - /* Set up config */ - /* Clock cycles between the start of each sample */ - cfg.window = CONFIG_ADC_QMSI_SERIAL_DELAY; - cfg.resolution = CONFIG_ADC_QMSI_SAMPLE_WIDTH; - - qm_adc_set_config(QM_ADC_0, &cfg); - - k_sem_init(&info->device_sync_sem, 0, UINT_MAX); - - k_sem_init(&info->sem, 1, UINT_MAX); - info->state = ADC_STATE_IDLE; - - adc_config_irq(); - - return 0; -} - -static struct adc_info adc_info_dev; - -DEVICE_AND_API_INIT(adc_qmsi, CONFIG_ADC_0_NAME, &adc_qmsi_init, - &adc_info_dev, NULL, - POST_KERNEL, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, - (void *)&api_funcs); - -static void adc_config_irq(void) -{ - IRQ_CONNECT(QM_IRQ_ADC_0_CAL_INT, CONFIG_ADC_0_IRQ_PRI, - qm_adc_0_cal_isr, NULL, (IOAPIC_LEVEL | IOAPIC_HIGH)); - - irq_enable(QM_IRQ_ADC_0_CAL_INT); - - QM_INTERRUPT_ROUTER->adc_0_cal_int_mask &= ~BIT(0); -}