Commit 864b1c57 authored by Jeremy Bettis's avatar Jeremy Bettis Committed by Carles Cufi
Browse files

drivers: Wrap register accesses in ECREG



Similar to other ITE drivers, wrap register accesses in ECREG. This will
allow mocking out the registers in tests.

Bug #66401

Signed-off-by: default avatarJeremy Bettis <jbettis@google.com>
parent d0012587
Loading
Loading
Loading
Loading
+35 −34
Original line number Diff line number Diff line
@@ -7,6 +7,7 @@

#define DT_DRV_COMPAT ite_it8xxx2_gpio_v2

#include <chip_chipregs.h>
#include <errno.h>
#include <soc.h>
#include <soc_dt.h>
@@ -86,14 +87,14 @@ static int gpio_ite_configure(const struct device *dev,

	k_spinlock_key_t key = k_spin_lock(&data->lock);
	if (flags == GPIO_DISCONNECTED) {
		*reg_gpcr = GPCR_PORT_PIN_MODE_TRISTATE;
		ECREG(reg_gpcr) = GPCR_PORT_PIN_MODE_TRISTATE;
		/*
		 * Since not all GPIOs can be to configured as tri-state,
		 * prompt error if pin doesn't support the flag.
		 */
		if (*reg_gpcr != GPCR_PORT_PIN_MODE_TRISTATE) {
		if (ECREG(reg_gpcr) != GPCR_PORT_PIN_MODE_TRISTATE) {
			/* Go back to default setting (input) */
			*reg_gpcr = GPCR_PORT_PIN_MODE_INPUT;
			ECREG(reg_gpcr) = GPCR_PORT_PIN_MODE_INPUT;
			LOG_ERR("Cannot config the node-gpio@%x, pin=%d as tri-state",
				(uint32_t)reg_gpdr, pin);
			rc = -ENOTSUP;
@@ -112,9 +113,9 @@ static int gpio_ite_configure(const struct device *dev,
	 * when changing the line to an output.
	 */
	if (flags & GPIO_OPEN_DRAIN) {
		*reg_gpotr |= mask;
		ECREG(reg_gpotr) |= mask;
	} else {
		*reg_gpotr &= ~mask;
		ECREG(reg_gpotr) &= ~mask;
	}

	/* 1.8V or 3.3V */
@@ -124,10 +125,10 @@ static int gpio_ite_configure(const struct device *dev,
		if (volt == IT8XXX2_GPIO_VOLTAGE_1P8) {
			__ASSERT(!(flags & GPIO_PULL_UP),
			"Don't enable internal pullup if 1.8V voltage is used");
			*reg_p18scr |= mask;
			ECREG(reg_p18scr) |= mask;
			data->volt_default_set &= ~mask;
		} else if (volt == IT8XXX2_GPIO_VOLTAGE_3P3) {
			*reg_p18scr &= ~mask;
			ECREG(reg_p18scr) &= ~mask;
			/*
			 * A variable is needed to store the difference between
			 * 3.3V and default so that the flag can be distinguished
@@ -135,7 +136,7 @@ static int gpio_ite_configure(const struct device *dev,
			 */
			data->volt_default_set &= ~mask;
		} else if (volt == IT8XXX2_GPIO_VOLTAGE_DEFAULT) {
			*reg_p18scr &= ~mask;
			ECREG(reg_p18scr) &= ~mask;
			data->volt_default_set |= mask;
		} else {
			rc = -EINVAL;
@@ -146,31 +147,31 @@ static int gpio_ite_configure(const struct device *dev,
	/* If output, set level before changing type to an output. */
	if (flags & GPIO_OUTPUT) {
		if (flags & GPIO_OUTPUT_INIT_HIGH) {
			*reg_gpdr |= mask;
			ECREG(reg_gpdr) |= mask;
		} else if (flags & GPIO_OUTPUT_INIT_LOW) {
			*reg_gpdr &= ~mask;
			ECREG(reg_gpdr) &= ~mask;
		}
	}

	/* Set input or output. */
	if (flags & GPIO_OUTPUT) {
		*reg_gpcr = (*reg_gpcr | GPCR_PORT_PIN_MODE_OUTPUT) &
		ECREG(reg_gpcr) = (ECREG(reg_gpcr) | GPCR_PORT_PIN_MODE_OUTPUT) &
				~GPCR_PORT_PIN_MODE_INPUT;
	} else {
		*reg_gpcr = (*reg_gpcr | GPCR_PORT_PIN_MODE_INPUT) &
		ECREG(reg_gpcr) = (ECREG(reg_gpcr) | GPCR_PORT_PIN_MODE_INPUT) &
				~GPCR_PORT_PIN_MODE_OUTPUT;
	}

	/* Handle pullup / pulldown */
	if (flags & GPIO_PULL_UP) {
		*reg_gpcr = (*reg_gpcr | GPCR_PORT_PIN_MODE_PULLUP) &
		ECREG(reg_gpcr) = (ECREG(reg_gpcr) | GPCR_PORT_PIN_MODE_PULLUP) &
				~GPCR_PORT_PIN_MODE_PULLDOWN;
	} else if (flags & GPIO_PULL_DOWN) {
		*reg_gpcr = (*reg_gpcr | GPCR_PORT_PIN_MODE_PULLDOWN) &
		ECREG(reg_gpcr) = (ECREG(reg_gpcr) | GPCR_PORT_PIN_MODE_PULLDOWN) &
				~GPCR_PORT_PIN_MODE_PULLUP;
	} else {
		/* No pull up/down */
		*reg_gpcr &= ~(GPCR_PORT_PIN_MODE_PULLUP |
		ECREG(reg_gpcr) &= ~(GPCR_PORT_PIN_MODE_PULLUP |
				GPCR_PORT_PIN_MODE_PULLDOWN);
	}

@@ -195,7 +196,7 @@ static int gpio_ite_get_config(const struct device *dev,

	k_spinlock_key_t key = k_spin_lock(&data->lock);
	/* push-pull or open-drain */
	if (*reg_gpotr & mask) {
	if (ECREG(reg_gpotr) & mask) {
		flags |= GPIO_OPEN_DRAIN;
	}

@@ -204,7 +205,7 @@ static int gpio_ite_get_config(const struct device *dev,
		if (data->volt_default_set & mask) {
			flags |= IT8XXX2_GPIO_VOLTAGE_DEFAULT;
		} else {
			if (*reg_p18scr & mask) {
			if (ECREG(reg_p18scr) & mask) {
				flags |= IT8XXX2_GPIO_VOLTAGE_1P8;
			} else {
				flags |= IT8XXX2_GPIO_VOLTAGE_3P3;
@@ -213,26 +214,26 @@ static int gpio_ite_get_config(const struct device *dev,
	}

	/* set input or output. */
	if (*reg_gpcr & GPCR_PORT_PIN_MODE_OUTPUT) {
	if (ECREG(reg_gpcr) & GPCR_PORT_PIN_MODE_OUTPUT) {
		flags |= GPIO_OUTPUT;

		/* set level */
		if (*reg_gpdr & mask) {
		if (ECREG(reg_gpdr) & mask) {
			flags |= GPIO_OUTPUT_HIGH;
		} else {
			flags |= GPIO_OUTPUT_LOW;
		}
	}

	if (*reg_gpcr & GPCR_PORT_PIN_MODE_INPUT) {
	if (ECREG(reg_gpcr) & GPCR_PORT_PIN_MODE_INPUT) {
		flags |= GPIO_INPUT;

		/* pullup / pulldown */
		if (*reg_gpcr & GPCR_PORT_PIN_MODE_PULLUP) {
		if (ECREG(reg_gpcr) & GPCR_PORT_PIN_MODE_PULLUP) {
			flags |= GPIO_PULL_UP;
		}

		if (*reg_gpcr & GPCR_PORT_PIN_MODE_PULLDOWN) {
		if (ECREG(reg_gpcr) & GPCR_PORT_PIN_MODE_PULLDOWN) {
			flags |= GPIO_PULL_DOWN;
		}
	}
@@ -251,7 +252,7 @@ static int gpio_ite_port_get_raw(const struct device *dev,
	volatile uint8_t *reg_gpdmr = (uint8_t *)gpio_config->reg_gpdmr;

	/* Get raw bits of GPIO mirror register */
	*value = *reg_gpdmr;
	*value = ECREG(reg_gpdmr);

	return 0;
}
@@ -265,9 +266,9 @@ static int gpio_ite_port_set_masked_raw(const struct device *dev,
	uint8_t masked_value = value & mask;
	struct gpio_ite_data *data = dev->data;
	k_spinlock_key_t key = k_spin_lock(&data->lock);
	uint8_t out = *reg_gpdr;
	uint8_t out = ECREG(reg_gpdr);

	*reg_gpdr = ((out & ~mask) | masked_value);
	ECREG(reg_gpdr) = ((out & ~mask) | masked_value);
	k_spin_unlock(&data->lock, key);

	return 0;
@@ -282,7 +283,7 @@ static int gpio_ite_port_set_bits_raw(const struct device *dev,

	k_spinlock_key_t key = k_spin_lock(&data->lock);
	/* Set raw bits of GPIO data register */
	*reg_gpdr |= pins;
	ECREG(reg_gpdr) |= pins;
	k_spin_unlock(&data->lock, key);

	return 0;
@@ -297,7 +298,7 @@ static int gpio_ite_port_clear_bits_raw(const struct device *dev,

	k_spinlock_key_t key = k_spin_lock(&data->lock);
	/* Clear raw bits of GPIO data register */
	*reg_gpdr &= ~pins;
	ECREG(reg_gpdr) &= ~pins;
	k_spin_unlock(&data->lock, key);

	return 0;
@@ -312,7 +313,7 @@ static int gpio_ite_port_toggle_bits(const struct device *dev,

	k_spinlock_key_t key = k_spin_lock(&data->lock);
	/* Toggle raw bits of GPIO data register */
	*reg_gpdr ^= pins;
	ECREG(reg_gpdr) ^= pins;
	k_spin_unlock(&data->lock, key);

	return 0;
@@ -349,7 +350,7 @@ static void gpio_ite_isr(const void *arg)

			/* Should be safe even without spinlock. */
			/* Clear the WUC status register. */
			*reg_wuesr = wuc_mask;
			ECREG(reg_wuesr) = wuc_mask;
			/* The callbacks are user code, and therefore should
			 * not hold the lock.
			 */
@@ -404,21 +405,21 @@ static int gpio_ite_pin_interrupt_configure(const struct device *dev,

		/* Set both edges interrupt. */
		if ((trig & GPIO_INT_TRIG_BOTH) == GPIO_INT_TRIG_BOTH) {
			*reg_wubemr |= wuc_mask;
			ECREG(reg_wubemr) |= wuc_mask;
		} else {
			*reg_wubemr &= ~wuc_mask;
			ECREG(reg_wubemr) &= ~wuc_mask;
		}

		if (trig & GPIO_INT_TRIG_LOW) {
			*reg_wuemr |= wuc_mask;
			ECREG(reg_wuemr) |= wuc_mask;
		} else {
			*reg_wuemr &= ~wuc_mask;
			ECREG(reg_wuemr) &= ~wuc_mask;
		}
		/*
		 * Always write 1 to clear the WUC status register after
		 * modifying edge mode selection register (WUBEMR and WUEMR).
		 */
		*reg_wuesr = wuc_mask;
		ECREG(reg_wuesr) = wuc_mask;
		k_spin_unlock(&data->lock, key);
	}