From 5325059aa1ac8d4836cbaf1e74f9796a4d24ffd1 Mon Sep 17 00:00:00 2001
From: swym <0xfd000000@gmail.com>
Date: Sun, 25 Aug 2019 12:24:42 +0200
Subject: [PATCH] analog pgio: lock ADC HW

---
 epicardium/modules/gpio.c | 18 ++++++++++++------
 1 file changed, 12 insertions(+), 6 deletions(-)

diff --git a/epicardium/modules/gpio.c b/epicardium/modules/gpio.c
index 6bcb68ec..68271cb9 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;
 	}
-- 
GitLab