/* SPDX-License-Identifier: GPL-2.0-only */

#include <console/console.h>
#include <soc/addressmap.h>
#include <soc/gpio.h>
#include <stdint.h>
#include <arch/mmio.h>
#include <delay.h>
#include <assert.h>
#include <device/mmio.h>
#include <gpio.h>

#define SIFIVE_GPIO_INPUT_VAL  (FU740_GPIO + 0x00)
#define SIFIVE_GPIO_INPUT_EN   (FU740_GPIO + 0x04)
#define SIFIVE_GPIO_OUTPUT_EN  (FU740_GPIO + 0x08)
#define SIFIVE_GPIO_OUTPUT_VAL (FU740_GPIO + 0x0C)
#define SIFIVE_GPIO_PUE        (FU740_GPIO + 0x10)
#define SIFIVE_GPIO_DS         (FU740_GPIO + 0x14)
#define SIFIVE_GPIO_RISE_IE    (FU740_GPIO + 0x18)
#define SIFIVE_GPIO_RISE_IP    (FU740_GPIO + 0x1C)
#define SIFIVE_GPIO_FALL_IE    (FU740_GPIO + 0x20)
#define SIFIVE_GPIO_FALL_IP    (FU740_GPIO + 0x24)
#define SIFIVE_GPIO_HIGH_IE    (FU740_GPIO + 0x28)
#define SIFIVE_GPIO_HIGH_IP    (FU740_GPIO + 0x2C)
#define SIFIVE_GPIO_LOW_IE     (FU740_GPIO + 0x30)
#define SIFIVE_GPIO_LOW_IP     (FU740_GPIO + 0x34)
#define SIFIVE_GPIO_IOF_EN     (FU740_GPIO + 0x38)
#define SIFIVE_GPIO_IOF_SEL    (FU740_GPIO + 0x3C)
#define SIFIVE_GPIO_OUT_XOR    (FU740_GPIO + 0x40)

void gpio_set(gpio_t gpio, int value)
{
	uint32_t output_val = read32((void *)SIFIVE_GPIO_OUTPUT_VAL);

	if (value)
		output_val |= (1 << gpio);
	else
		output_val &= ~(1 << gpio);

	write32((void *)SIFIVE_GPIO_OUTPUT_VAL, output_val);
}

int gpio_get(gpio_t gpio)
{
	uint32_t input_val = read32((void *)SIFIVE_GPIO_INPUT_VAL);
	return !!(input_val & (1 << gpio));
}

void gpio_set_direction(gpio_t gpio, enum gpio_direction gpio_dir)
{
	uint32_t input_en  = read32((void *)SIFIVE_GPIO_INPUT_EN);
	uint32_t output_en = read32((void *)SIFIVE_GPIO_OUTPUT_EN);

	if (gpio_dir == GPIO_OUTPUT) {
		input_en  &= ~(1 << gpio);
		output_en |=  (1 << gpio);
	} else if (gpio_dir == GPIO_INPUT) {
		input_en  |=  (1 << gpio);
		output_en &= ~(1 << gpio);
	}

	write32((void *)SIFIVE_GPIO_INPUT_EN, input_en);
	write32((void *)SIFIVE_GPIO_OUTPUT_EN, output_en);
}
