diff --git a/drivers/adc/CMakeLists.txt b/drivers/adc/CMakeLists.txt
index f547561..c29b997 100644
--- a/drivers/adc/CMakeLists.txt
+++ b/drivers/adc/CMakeLists.txt
@@ -45,7 +45,6 @@
 zephyr_library_sources_ifdef(CONFIG_ADC_ESP32		adc_esp32.c)
 zephyr_library_sources_ifdef(CONFIG_ADC_ESP32_DMA	adc_esp32_dma.c)
 zephyr_library_sources_ifdef(CONFIG_ADC_GECKO_ADC   	adc_gecko.c)
-zephyr_library_sources_ifdef(CONFIG_ADC_GECKO_IADC   	iadc_gecko.c)
 zephyr_library_sources_ifdef(CONFIG_ADC_SILABS_IADC   	adc_silabs_iadc.c)
 zephyr_library_sources_ifdef(CONFIG_ADC_SILABS_SIWX91X 	adc_silabs_siwx91x.c)
 zephyr_library_sources_ifdef(CONFIG_ADC_INFINEON_CAT1	adc_ifx_cat1.c)
diff --git a/drivers/adc/Kconfig.gecko b/drivers/adc/Kconfig.gecko
index 693803b..5ee6b4c 100644
--- a/drivers/adc/Kconfig.gecko
+++ b/drivers/adc/Kconfig.gecko
@@ -3,15 +3,6 @@
 # Copyright (c) 2023 Antmicro <www.antmicro.com>
 # SPDX-License-Identifier: Apache-2.0
 
-config ADC_GECKO_IADC
-	bool "Gecko Incremental ADC driver"
-	default y
-	depends on DT_HAS_SILABS_GECKO_IADC_ENABLED
-	select SOC_GECKO_IADC
-	select ADC_CONFIGURABLE_INPUTS
-	help
-	  Enable the driver implementation for the Silabs GeckoEXX32 Incremental ADC
-
 config ADC_GECKO_ADC
 	bool "Gecko ADC driver"
 	default y
diff --git a/drivers/adc/iadc_gecko.c b/drivers/adc/iadc_gecko.c
deleted file mode 100644
index fb0cfc2..0000000
--- a/drivers/adc/iadc_gecko.c
+++ /dev/null
@@ -1,453 +0,0 @@
-/*
- * Copyright (c) 2023 Antmicro <www.antmicro.com>
- *
- * SPDX-License-Identifier: Apache-2.0
- */
-
-#define DT_DRV_COMPAT silabs_gecko_iadc
-
-#include <zephyr/drivers/adc.h>
-#include <zephyr/drivers/clock_control.h>
-#include <zephyr/drivers/clock_control/clock_control_silabs.h>
-#include <zephyr/drivers/pinctrl.h>
-#include <zephyr/pm/device.h>
-
-#include <em_iadc.h>
-
-#define ADC_CONTEXT_USES_KERNEL_TIMER
-#include "adc_context.h"
-
-#include <zephyr/logging/log.h>
-LOG_MODULE_REGISTER(iadc_gecko, CONFIG_ADC_LOG_LEVEL);
-
-/* Number of channels available. */
-#define GECKO_CHANNEL_COUNT	16
-#define GECKO_INTERNAL_REFERENCE_mV	1210
-#define GECKO_DATA_RES12BIT(DATA)	((DATA) & 0x0FFF)
-
-struct adc_gecko_channel_config {
-	IADC_CfgAnalogGain_t gain;
-	IADC_CfgReference_t reference;
-	IADC_PosInput_t input_positive;
-	IADC_NegInput_t input_negative;
-	bool initialized;
-};
-
-struct adc_gecko_data {
-	const struct device *dev;
-	struct adc_context ctx;
-	uint16_t *buffer;
-	uint16_t *repeat_buffer;
-	uint32_t channels;
-	uint8_t channel_id;
-	struct adc_gecko_channel_config channel_config[GECKO_CHANNEL_COUNT];
-};
-
-struct adc_gecko_config {
-	IADC_Config_t config;
-	IADC_TypeDef *base;
-	const struct pinctrl_dev_config *pcfg;
-	const struct device *clock_dev;
-	const struct silabs_clock_control_cmu_config clock_cfg;
-	void (*irq_cfg_func)(void);
-};
-
-static void adc_gecko_set_config(const struct device *dev)
-{
-	struct adc_gecko_data *data = dev->data;
-	struct adc_gecko_channel_config *channel_config = NULL;
-	const struct adc_gecko_config *config = dev->config;
-
-	IADC_TypeDef *iadc = (IADC_TypeDef *)config->base;
-	IADC_InitSingle_t sInit = IADC_INITSINGLE_DEFAULT;
-	IADC_SingleInput_t initSingleInput = IADC_SINGLEINPUT_DEFAULT;
-	IADC_Init_t init = IADC_INIT_DEFAULT;
-	IADC_AllConfigs_t initAllConfigs = IADC_ALLCONFIGS_DEFAULT;
-
-	channel_config = &data->channel_config[data->channel_id];
-
-	initSingleInput.posInput = channel_config->input_positive;
-	initSingleInput.negInput = channel_config->input_negative;
-
-	initAllConfigs.configs[0].analogGain = channel_config->gain;
-
-	initAllConfigs.configs[0].reference = channel_config->reference;
-
-	IADC_init(iadc, &init, &initAllConfigs);
-
-	IADC_initSingle(iadc, &sInit, &initSingleInput);
-}
-
-static int adc_gecko_check_buffer_size(const struct adc_sequence *sequence,
-					uint8_t active_channels)
-{
-	size_t needed_buffer_size;
-
-	needed_buffer_size = active_channels * sizeof(uint16_t);
-
-	if (sequence->options) {
-		needed_buffer_size *= (1 + sequence->options->extra_samplings);
-	}
-
-	if (sequence->buffer_size < needed_buffer_size) {
-		LOG_DBG("Provided buffer is too small (%u/%u)",
-			sequence->buffer_size, needed_buffer_size);
-		return -ENOMEM;
-	}
-
-	return 0;
-}
-
-static int adc_gecko_check_resolution(const struct adc_sequence *sequence)
-{
-	int value = sequence->resolution;
-
-	/* Base resolution is on 12, it can be changed only up by oversampling */
-	if (value != 12) {
-		return -EINVAL;
-	}
-
-	return value;
-}
-
-static int start_read(const struct device *dev, const struct adc_sequence *sequence)
-{
-
-	struct adc_gecko_data *data = dev->data;
-	uint32_t channels;
-	uint8_t channel_count;
-	uint8_t index;
-	int res;
-
-	/* Check if at least 1 channel is requested */
-	if (sequence->channels == 0) {
-		LOG_DBG("No channel requested");
-		return -EINVAL;
-	}
-
-	if (sequence->oversampling) {
-		LOG_ERR("Oversampling is not supported");
-		return -EINVAL;
-	}
-
-	/* Check resolution setting */
-	res = adc_gecko_check_resolution(sequence);
-	if (res < 0) {
-		return -EINVAL;
-	}
-
-	/* Verify all requested channels are initialized and store resolution */
-	channels = sequence->channels;
-	channel_count = 0;
-	while (channels) {
-		/* Iterate through all channels and check if they are initialized */
-		index = find_lsb_set(channels) - 1;
-		if (index >= GECKO_CHANNEL_COUNT) {
-			LOG_DBG("Requested channel index not available: %d", index);
-			return -EINVAL;
-		}
-
-		if (!data->channel_config[index].initialized) {
-			LOG_DBG("Channel not initialized");
-			return -EINVAL;
-		}
-		channel_count++;
-		channels &= ~BIT(index);
-	}
-
-	/* Check buffer size */
-	res = adc_gecko_check_buffer_size(sequence, channel_count);
-	if (res < 0) {
-		return res;
-	}
-
-	data->buffer = sequence->buffer;
-
-	adc_context_start_read(&data->ctx, sequence);
-
-	res = adc_context_wait_for_completion(&data->ctx);
-
-	return res;
-}
-
-static void adc_gecko_start_channel(const struct device *dev)
-{
-	const struct adc_gecko_config *config = dev->config;
-	struct adc_gecko_data *data = dev->data;
-
-	IADC_TypeDef *iadc = (IADC_TypeDef *)config->base;
-
-	data->channel_id = find_lsb_set(data->channels) - 1;
-
-	LOG_DBG("Starting channel %d", data->channel_id);
-
-	adc_gecko_set_config(data->dev);
-
-	/* Enable single conversion interrupt */
-	IADC_enableInt(iadc, IADC_IEN_SINGLEDONE);
-
-	/* Start single conversion */
-	IADC_command(iadc, iadcCmdStartSingle);
-}
-
-static void adc_context_start_sampling(struct adc_context *ctx)
-{
-	struct adc_gecko_data *data =
-		CONTAINER_OF(ctx, struct adc_gecko_data, ctx);
-
-	data->channels = ctx->sequence.channels;
-	data->repeat_buffer = data->buffer;
-
-	adc_gecko_start_channel(data->dev);
-}
-
-static void adc_context_update_buffer_pointer(struct adc_context *ctx,
-						bool repeat_sampling)
-{
-	struct adc_gecko_data *data =
-		CONTAINER_OF(ctx, struct adc_gecko_data, ctx);
-
-	if (repeat_sampling) {
-		data->buffer = data->repeat_buffer;
-	}
-}
-
-static void adc_gecko_isr(void *arg)
-{
-	const struct device *dev = (const struct device *)arg;
-	const struct adc_gecko_config *config = dev->config;
-	struct adc_gecko_data *data = dev->data;
-	IADC_TypeDef *iadc = config->base;
-	IADC_Result_t sample;
-	uint32_t flags, err;
-
-	/*
-	 * IRQ is enabled only for SINGLEDONE. However, other
-	 * interrupt flags - the ones singaling an error - may be
-	 * set simultaneously with SINGLEDONE. We read & clear them
-	 * to determine if conversion is successful or not.
-	 */
-	flags = IADC_getInt(iadc);
-
-	__ASSERT(flags & IADC_IF_SINGLEDONE,
-		 "unexpected IADC IRQ (flags=0x%08x)!", flags);
-
-	err = flags & (IADC_IF_PORTALLOCERR |
-			IADC_IF_POLARITYERR |
-			IADC_IF_EM23ABORTERROR);
-	if (!err) {
-		sample = IADC_readSingleResult(iadc);
-
-		*data->buffer++ = GECKO_DATA_RES12BIT((uint16_t)sample.data);
-		data->channels &= ~BIT(data->channel_id);
-
-		if (data->channels) {
-			adc_gecko_start_channel(dev);
-		} else {
-			adc_context_on_sampling_done(&data->ctx, dev);
-		}
-	} else {
-		LOG_ERR("IADC conversion error, flags=%08x", err);
-		adc_context_complete(&data->ctx, -EIO);
-	}
-
-	IADC_clearInt(iadc, IADC_IF_SINGLEDONE | err);
-}
-
-static int adc_gecko_read(const struct device *dev,
-			  const struct adc_sequence *sequence)
-{
-	struct adc_gecko_data *data = dev->data;
-	int error;
-
-	adc_context_lock(&data->ctx, false, NULL);
-	error = start_read(dev, sequence);
-	adc_context_release(&data->ctx, error);
-
-	return error;
-}
-
-#ifdef CONFIG_ADC_ASYNC
-static int adc_gecko_read_async(const struct device *dev,
-				const struct adc_sequence *sequence,
-				struct k_poll_signal *async)
-{
-	struct adc_gecko_data *data = dev->data;
-	int error;
-
-	adc_context_lock(&data->ctx, true, async);
-	error = start_read(dev, sequence);
-	adc_context_release(&data->ctx, error);
-
-	return error;
-}
-#endif
-
-static int adc_gecko_channel_setup(const struct device *dev,
-				const struct adc_channel_cfg *channel_cfg)
-{
-	struct adc_gecko_data *data = dev->data;
-	struct adc_gecko_channel_config *channel_config = NULL;
-
-	if (channel_cfg->channel_id < GECKO_CHANNEL_COUNT) {
-		channel_config = &data->channel_config[channel_cfg->channel_id];
-	} else {
-		LOG_DBG("Requested channel index not available: %d", channel_cfg->channel_id);
-		return -EINVAL;
-	}
-
-	channel_config->initialized = false;
-
-	channel_config->input_positive = channel_cfg->input_positive;
-
-	if (channel_cfg->differential) {
-		channel_config->input_negative = channel_cfg->input_negative;
-	} else {
-		channel_config->input_negative = iadcNegInputGnd;
-	}
-
-	/* Setup input */
-
-	switch (channel_cfg->gain) {
-#if defined(_IADC_CFG_ANALOGGAIN_ANAGAIN0P25)
-	case ADC_GAIN_1_4:
-		channel_config->gain = iadcCfgAnalogGain0P25x;
-		break;
-#endif
-	case ADC_GAIN_1_2:
-		channel_config->gain = iadcCfgAnalogGain0P5x;
-		break;
-	case ADC_GAIN_1:
-		channel_config->gain = iadcCfgAnalogGain1x;
-		break;
-	case ADC_GAIN_2:
-		channel_config->gain = iadcCfgAnalogGain2x;
-		break;
-	case ADC_GAIN_3:
-		channel_config->gain = iadcCfgAnalogGain3x;
-		break;
-	case ADC_GAIN_4:
-		channel_config->gain = iadcCfgAnalogGain4x;
-		break;
-	default:
-		LOG_ERR("unsupported channel gain '%d'", channel_cfg->gain);
-		return -EINVAL;
-	}
-
-	/* Setup reference */
-	switch (channel_cfg->reference) {
-	case ADC_REF_VDD_1:
-		channel_config->reference = iadcCfgReferenceVddx;
-		break;
-	case ADC_REF_INTERNAL:
-		channel_config->reference = iadcCfgReferenceInt1V2;
-		break;
-#if defined(_IADC_CFG_REFSEL_VREF2P5)
-	case ADC_REF_EXTERNAL1:
-		channel_config->reference = iadcCfgReferenceExt2V5;
-		break;
-#endif
-	case ADC_REF_EXTERNAL0:
-		channel_config->reference = iadcCfgReferenceExt1V25;
-		break;
-	default:
-		LOG_ERR("unsupported channel reference type '%d'",
-			channel_cfg->reference);
-		return -EINVAL;
-	}
-
-	channel_config->initialized = true;
-	LOG_DBG("Channel setup succeeded!");
-
-	return 0;
-}
-
-static int adc_gecko_pm_action(const struct device *dev, enum pm_device_action action)
-{
-	int err;
-	const struct adc_gecko_config *config = dev->config;
-
-	if (action == PM_DEVICE_ACTION_RESUME) {
-		err = clock_control_on(config->clock_dev,
-				       (clock_control_subsys_t)&config->clock_cfg);
-		if (err < 0 && err != -EALREADY) {
-			return err;
-		}
-
-		err = pinctrl_apply_state(config->pcfg, PINCTRL_STATE_DEFAULT);
-		if (err < 0 && err != -ENOENT) {
-			return err;
-		}
-	} else if (IS_ENABLED(CONFIG_PM_DEVICE) && (action == PM_DEVICE_ACTION_SUSPEND)) {
-		err = clock_control_off(config->clock_dev,
-					(clock_control_subsys_t)&config->clock_cfg);
-		if (err < 0) {
-			return err;
-		}
-
-		err = pinctrl_apply_state(config->pcfg, PINCTRL_STATE_SLEEP);
-		if (err < 0 && err != -ENOENT) {
-			return err;
-		}
-	} else {
-		return -ENOTSUP;
-	}
-
-	return 0;
-}
-
-static int adc_gecko_init(const struct device *dev)
-{
-	const struct adc_gecko_config *config = dev->config;
-	struct adc_gecko_data *data = dev->data;
-
-	data->dev = dev;
-
-	config->irq_cfg_func();
-
-	adc_context_unlock_unconditionally(&data->ctx);
-
-	return pm_device_driver_init(dev, adc_gecko_pm_action);
-}
-
-static DEVICE_API(adc, api_gecko_adc_driver_api) = {
-	.channel_setup = adc_gecko_channel_setup,
-	.read = adc_gecko_read,
-#ifdef CONFIG_ADC_ASYNC
-	.read_async = adc_gecko_read_async,
-#endif
-	.ref_internal = GECKO_INTERNAL_REFERENCE_mV,
-};
-
-#define GECKO_IADC_INIT(n)						\
-	PINCTRL_DT_INST_DEFINE(n);					\
-	PM_DEVICE_DT_INST_DEFINE(n, adc_gecko_pm_action);		\
-									\
-	static void adc_gecko_config_func_##n(void);			\
-									\
-	const static struct adc_gecko_config adc_gecko_config_##n = {	\
-		.base = (IADC_TypeDef *)DT_INST_REG_ADDR(n),\
-		.pcfg = PINCTRL_DT_INST_DEV_CONFIG_GET(n),		\
-		.clock_dev = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR(n)),	\
-		.clock_cfg = SILABS_DT_INST_CLOCK_CFG(n),		\
-		.irq_cfg_func = adc_gecko_config_func_##n,		\
-	};								\
-	static struct adc_gecko_data adc_gecko_data_##n = {		\
-		ADC_CONTEXT_INIT_TIMER(adc_gecko_data_##n, ctx),	\
-		ADC_CONTEXT_INIT_LOCK(adc_gecko_data_##n, ctx),	\
-		ADC_CONTEXT_INIT_SYNC(adc_gecko_data_##n, ctx),	\
-	};								\
-	static void adc_gecko_config_func_##n(void)			\
-	{								\
-		IRQ_CONNECT(DT_INST_IRQN(n),	\
-			    DT_INST_IRQ(n, priority), \
-			    adc_gecko_isr, DEVICE_DT_INST_GET(n), 0);	\
-		irq_enable(DT_INST_IRQN(n));	\
-	}; \
-	DEVICE_DT_INST_DEFINE(n,					 \
-			      adc_gecko_init, PM_DEVICE_DT_INST_GET(n),  \
-			      &adc_gecko_data_##n, &adc_gecko_config_##n,\
-			      POST_KERNEL, CONFIG_ADC_INIT_PRIORITY,	 \
-			      &api_gecko_adc_driver_api);
-
-DT_INST_FOREACH_STATUS_OKAY(GECKO_IADC_INIT)
diff --git a/dts/bindings/adc/silabs,gecko-iadc.yaml b/dts/bindings/adc/silabs,gecko-iadc.yaml
deleted file mode 100644
index f4a320e..0000000
--- a/dts/bindings/adc/silabs,gecko-iadc.yaml
+++ /dev/null
@@ -1,24 +0,0 @@
-# Copyright (c) 2023 Antmicro <www.antmicro.com>
-# SPDX-License-Identifier: Apache-2.0
-
-title: Silicon Labs Series 2 IADC (Incremental Analog to Digital Converter)
-
-description: |
-  Incremental ADC peripheral for Silicon Labs Series 2 SoCs.
-
-compatible: "silabs,gecko-iadc"
-
-include: [adc-controller.yaml, pinctrl-device.yaml]
-
-properties:
-  reg:
-    required: true
-
-  interrupts:
-    required: true
-
-  "#io-channel-cells":
-    const: 1
-
-io-channel-cells:
-  - input
