/*
 * Copyright (c) 2021 Teslabs Engineering S.L.
 * SPDX-License-Identifier: Apache-2.0
 */

#include <drivers/pinctrl.h>
#include <ztest.h>

/* pin configuration for test device */
#define TEST_DEVICE DT_NODELABEL(test_device)
PINCTRL_DT_DEV_CONFIG_DECLARE(TEST_DEVICE);
static const struct pinctrl_dev_config *pcfg = PINCTRL_DT_DEV_CONFIG_GET(TEST_DEVICE);

static void test_dt_extract(void)
{
	const struct pinctrl_state *scfg;
	pinctrl_soc_pin_t pin;

	zassert_equal(pcfg->state_cnt, 1U, NULL);

	scfg = &pcfg->states[0];

	zassert_equal(scfg->id, PINCTRL_STATE_DEFAULT, NULL);
	zassert_equal(scfg->pin_cnt, 12U, NULL);

	pin = scfg->pins[0];
	zassert_equal(GD32_PORT_GET(pin), 0, NULL);
	zassert_equal(GD32_PIN_GET(pin), 0, NULL);
	zassert_equal(GD32_AF_GET(pin), GD32_AF0, NULL);
	zassert_equal(GD32_PUPD_GET(pin), GD32_PUPD_NONE, NULL);
	zassert_equal(GD32_OTYPE_GET(pin), GD32_OTYPE_PP, NULL);
	zassert_equal(GD32_OSPEED_GET(pin), GD32_OSPEED_2MHZ, NULL);

	pin = scfg->pins[1];
	zassert_equal(GD32_PORT_GET(pin), 1, NULL);
	zassert_equal(GD32_PIN_GET(pin), 1, NULL);
	zassert_equal(GD32_AF_GET(pin), GD32_AF1, NULL);
	zassert_equal(GD32_PUPD_GET(pin), GD32_PUPD_NONE, NULL);
	zassert_equal(GD32_OTYPE_GET(pin), GD32_OTYPE_PP, NULL);
	zassert_equal(GD32_OSPEED_GET(pin), GD32_OSPEED_2MHZ, NULL);

	pin = scfg->pins[2];
	zassert_equal(GD32_PORT_GET(pin), 2, NULL);
	zassert_equal(GD32_PIN_GET(pin), 2, NULL);
	zassert_equal(GD32_AF_GET(pin), GD32_AF2, NULL);
	zassert_equal(GD32_PUPD_GET(pin), GD32_PUPD_NONE, NULL);
	zassert_equal(GD32_OTYPE_GET(pin), GD32_OTYPE_PP, NULL);
	zassert_equal(GD32_OSPEED_GET(pin), GD32_OSPEED_2MHZ, NULL);

	pin = scfg->pins[3];
	zassert_equal(GD32_PORT_GET(pin), 0, NULL);
	zassert_equal(GD32_PIN_GET(pin), 3, NULL);
	zassert_equal(GD32_AF_GET(pin), GD32_AF3, NULL);
	zassert_equal(GD32_PUPD_GET(pin), GD32_PUPD_NONE, NULL);
	zassert_equal(GD32_OTYPE_GET(pin), GD32_OTYPE_OD, NULL);
	zassert_equal(GD32_OSPEED_GET(pin), GD32_OSPEED_2MHZ, NULL);

	pin = scfg->pins[4];
	zassert_equal(GD32_PORT_GET(pin), 1, NULL);
	zassert_equal(GD32_PIN_GET(pin), 4, NULL);
	zassert_equal(GD32_AF_GET(pin), GD32_AF4, NULL);
	zassert_equal(GD32_PUPD_GET(pin), GD32_PUPD_NONE, NULL);
	zassert_equal(GD32_OTYPE_GET(pin), GD32_OTYPE_PP, NULL);
	zassert_equal(GD32_OSPEED_GET(pin), GD32_OSPEED_2MHZ, NULL);

	pin = scfg->pins[5];
	zassert_equal(GD32_PORT_GET(pin), 2, NULL);
	zassert_equal(GD32_PIN_GET(pin), 5, NULL);
	zassert_equal(GD32_AF_GET(pin), GD32_AF5, NULL);
	zassert_equal(GD32_PUPD_GET(pin), GD32_PUPD_PULLUP, NULL);
	zassert_equal(GD32_OTYPE_GET(pin), GD32_OTYPE_PP, NULL);
	zassert_equal(GD32_OSPEED_GET(pin), GD32_OSPEED_2MHZ, NULL);

	pin = scfg->pins[6];
	zassert_equal(GD32_PORT_GET(pin), 0, NULL);
	zassert_equal(GD32_PIN_GET(pin), 6, NULL);
	zassert_equal(GD32_AF_GET(pin), GD32_AF6, NULL);
	zassert_equal(GD32_PUPD_GET(pin), GD32_PUPD_PULLDOWN, NULL);
	zassert_equal(GD32_OTYPE_GET(pin), GD32_OTYPE_PP, NULL);
	zassert_equal(GD32_OSPEED_GET(pin), GD32_OSPEED_2MHZ, NULL);

	pin = scfg->pins[7];
	zassert_equal(GD32_PORT_GET(pin), 1, NULL);
	zassert_equal(GD32_PIN_GET(pin), 7, NULL);
	zassert_equal(GD32_AF_GET(pin), GD32_AF7, NULL);
	zassert_equal(GD32_PUPD_GET(pin), GD32_PUPD_NONE, NULL);
	zassert_equal(GD32_OTYPE_GET(pin), GD32_OTYPE_PP, NULL);
	zassert_equal(GD32_OSPEED_GET(pin), GD32_OSPEED_2MHZ, NULL);

	pin = scfg->pins[8];
	zassert_equal(GD32_PORT_GET(pin), 2, NULL);
	zassert_equal(GD32_PIN_GET(pin), 8, NULL);
	zassert_equal(GD32_AF_GET(pin), GD32_AF8, NULL);
	zassert_equal(GD32_PUPD_GET(pin), GD32_PUPD_NONE, NULL);
	zassert_equal(GD32_OTYPE_GET(pin), GD32_OTYPE_PP, NULL);
	zassert_equal(GD32_OSPEED_GET(pin), GD32_OSPEED_25MHZ, NULL);

	pin = scfg->pins[9];
	zassert_equal(GD32_PORT_GET(pin), 0, NULL);
	zassert_equal(GD32_PIN_GET(pin), 9, NULL);
	zassert_equal(GD32_AF_GET(pin), GD32_AF9, NULL);
	zassert_equal(GD32_PUPD_GET(pin), GD32_PUPD_NONE, NULL);
	zassert_equal(GD32_OTYPE_GET(pin), GD32_OTYPE_PP, NULL);
	zassert_equal(GD32_OSPEED_GET(pin), GD32_OSPEED_50MHZ, NULL);

	pin = scfg->pins[10];
	zassert_equal(GD32_PORT_GET(pin), 1, NULL);
	zassert_equal(GD32_PIN_GET(pin), 10, NULL);
	zassert_equal(GD32_AF_GET(pin), GD32_AF10, NULL);
	zassert_equal(GD32_PUPD_GET(pin), GD32_PUPD_NONE, NULL);
	zassert_equal(GD32_OTYPE_GET(pin), GD32_OTYPE_PP, NULL);
	zassert_equal(GD32_OSPEED_GET(pin), GD32_OSPEED_200MHZ, NULL);

	pin = scfg->pins[11];
	zassert_equal(GD32_PORT_GET(pin), 2, NULL);
	zassert_equal(GD32_PIN_GET(pin), 11, NULL);
	zassert_equal(GD32_AF_GET(pin), GD32_ANALOG, NULL);
	zassert_equal(GD32_PUPD_GET(pin), GD32_PUPD_NONE, NULL);
	zassert_equal(GD32_OTYPE_GET(pin), GD32_OTYPE_PP, NULL);
	zassert_equal(GD32_OSPEED_GET(pin), GD32_OSPEED_2MHZ, NULL);
}

void test_main(void)
{
	ztest_test_suite(pinctrl_gd32,
			 ztest_unit_test(test_dt_extract));
	ztest_run_test_suite(pinctrl_gd32);
}
