diff --git a/epicardium/modules/gpio.c b/epicardium/modules/gpio.c
index 6bcb68ec721269ff8d479896d1e71730946a4b6b..68271cb93352e372d45bd679fcafedf55850b4c8 100644
--- a/epicardium/modules/gpio.c
+++ b/epicardium/modules/gpio.c
@@ -5,6 +5,7 @@
 #include "adc.h"
 #include "mxc_errors.h"
 #include "modules/log.h"
+#include "modules/modules.h"
 
 /*
  * Despite what the schematic (currently, 2019-08-18) says these are the correct
@@ -133,13 +134,18 @@ int epic_gpio_read_pin(uint8_t pin)
 	} else if (cfg->func == GPIO_FUNC_IN) {
 		return GPIO_InGet(cfg) != 0;
 	} else if (cfg->func == GPIO_FUNC_ALT1) {
-		ADC_StartConvert(s_adc_channels[pin], 0, 0);
-		uint16_t value;
-		int rc = ADC_GetData(&value);
-		if (rc < 0) {
-			return -EIO;
+		int rc = hwlock_acquire(HWLOCK_ADC, pdMS_TO_TICKS(10));
+		if (!rc) {
+			ADC_StartConvert(s_adc_channels[pin], 0, 0);
+			uint16_t value;
+			int rc = ADC_GetData(&value);
+			hwlock_release(HWLOCK_ADC);
+			if (rc < 0) {
+				return -EIO;
+			}
+			return (int)value;
 		}
-		return (int)value;
+		return rc;
 	} else {
 		return -EINVAL;
 	}