diff --git a/epicardium/modules/bme680.c b/epicardium/modules/bme680.c
index 8cda3a6e28d52a3dfa92aa33796ae91cb77f25d3..fb03365631a48f16bc59943791bf0c17f3ccd1c1 100644
--- a/epicardium/modules/bme680.c
+++ b/epicardium/modules/bme680.c
@@ -35,6 +35,34 @@ static int convert_error(int8_t error)
 	}
 }
 
+static int8_t
+i2c_write(uint8_t addr, uint8_t reg, uint8_t *p_buf, uint16_t size)
+{
+	int8_t ret;
+	hwlock_acquire(HWLOCK_I2C);
+	ret = card10_bosch_i2c_write(addr, reg, p_buf, size);
+	hwlock_release(HWLOCK_I2C);
+	return ret;
+}
+
+static int8_t i2c_read(uint8_t addr, uint8_t reg, uint8_t *p_buf, uint16_t size)
+{
+	int8_t ret;
+	hwlock_acquire(HWLOCK_I2C);
+	ret = card10_bosch_i2c_read(addr, reg, p_buf, size);
+	hwlock_release(HWLOCK_I2C);
+	return ret;
+}
+
+static void delay(uint32_t msec)
+{
+	if (xTaskGetSchedulerState() == taskSCHEDULER_NOT_STARTED) {
+		card10_bosch_delay(msec);
+	} else {
+		vTaskDelay(pdMS_TO_TICKS(msec));
+	}
+}
+
 int epic_bme680_init()
 {
 	int8_t result = BME680_OK;
@@ -43,13 +71,11 @@ int epic_bme680_init()
 		return 0;
 	}
 
-	hwlock_acquire(HWLOCK_I2C);
-
 	bme.dev_id   = BME680_I2C_ADDR_PRIMARY;
 	bme.intf     = BME680_I2C_INTF;
-	bme.read     = card10_bosch_i2c_read;
-	bme.write    = card10_bosch_i2c_write;
-	bme.delay_ms = card10_bosch_delay;
+	bme.read     = i2c_read;
+	bme.write    = i2c_write;
+	bme.delay_ms = delay;
 
 	/*
 	 * amb_temp can be set to 25 prior to configuring the gas sensor
@@ -61,7 +87,7 @@ int epic_bme680_init()
 	result = bme680_init(&bme);
 	if (result != BME680_OK) {
 		LOG_ERR("bme680", "bme680_init error: %d\n", result);
-		goto err;
+		return -convert_error(result);
 	}
 
 	/*
@@ -92,14 +118,11 @@ int epic_bme680_init()
 		LOG_ERR("bme680",
 			"bme680_set_sensor_settings error: %d\n",
 			result);
-		goto err;
+		return -convert_error(result);
 	}
 
 	initialized = true;
-	result      = BME680_OK;
-err:
-	hwlock_release(HWLOCK_I2C);
-	return -convert_error(result);
+	return 0;
 }
 
 int epic_bme680_deinit()
@@ -108,14 +131,11 @@ int epic_bme680_deinit()
 		return 0;
 	}
 
-	hwlock_acquire(HWLOCK_I2C);
-
 	int8_t result = bme680_soft_reset(&bme);
 	if (result != BME680_OK) {
 		LOG_ERR("bme680", "bme680_soft_reset error: %d\n", result);
 	}
 
-	hwlock_release(HWLOCK_I2C);
 	initialized = false;
 	return 0;
 }
@@ -129,30 +149,26 @@ int epic_bme680_read_sensors(struct bme680_sensor_data *data)
 		return -EINVAL;
 	}
 
-	hwlock_acquire(HWLOCK_I2C);
-
 	uint16_t profile_dur = 0;
 	bme680_get_profile_dur(&profile_dur, &bme);
 
 	result = bme680_set_sensor_mode(&bme); /* Trigger a measurement */
 	if (result != BME680_OK) {
 		LOG_ERR("bme680", "bme680_set_sensor_mode error: %d\n", result);
-		goto err;
+		return -convert_error(result);
 	}
 
 	/*
 	 * Wait for the measurement to complete.  Release the I2C lock in the
 	 * meantime.
 	 */
-	hwlock_release(HWLOCK_I2C);
 	vTaskDelay(pdMS_TO_TICKS(profile_dur));
-	hwlock_acquire(HWLOCK_I2C);
 
 	struct bme680_field_data raw_data;
 	result = bme680_get_sensor_data(&raw_data, &bme);
 	if (result != BME680_OK) {
 		LOG_ERR("bme680", "bme680_get_sensor_data error: %d\n", result);
-		goto err;
+		return -convert_error(result);
 	}
 
 	data->temperature    = (float)raw_data.temperature / 100.0f;
@@ -160,8 +176,5 @@ int epic_bme680_read_sensors(struct bme680_sensor_data *data)
 	data->pressure       = raw_data.pressure / 100.0f;
 	data->gas_resistance = raw_data.gas_resistance;
 
-	result = BME680_OK;
-err:
-	hwlock_release(HWLOCK_I2C);
-	return -convert_error(result);
+	return 0;
 }