// SPDX-License-Identifier: GPL-2.0
/*
 * Copyright (C) 2019 BayLibre SAS
 */

#include <common.h>
#include <dm.h>
#include <i2c.h>
#include <mmc.h>
#include <asm/gpio.h>
#include "../../../drivers/crypto/nxp/a71ch.h"
#include "../../../drivers/watchdog/mtk_wdt.h"

#define WDT_DRIVER_NAME "mtk_wdt"
#define REBOOT_BOOTLOADER_VALUE (1)
#define REBOOT_BOOTLOADER_MASK  (1)
#define REBOOT_BOOTLOADER_SHIFT (2)

int fastboot_set_reboot_flag(void) {
	struct udevice *dev;
	struct uclass *uc;
	int ret = -ENOSYS;

	ret = uclass_get(UCLASS_WDT, &uc);
	if (ret)
		return -ENOSYS;

	uclass_foreach_dev(dev, uc) {
		if (strncmp(dev->driver->name, WDT_DRIVER_NAME, strlen(WDT_DRIVER_NAME)) == 0) {
			mtk_wdt_set_nonrst2(dev, REBOOT_BOOTLOADER_MASK << REBOOT_BOOTLOADER_SHIFT,
			                    REBOOT_BOOTLOADER_VALUE << REBOOT_BOOTLOADER_SHIFT);
			return 0;
		}
	}

	return -ENOSYS;
}

int misc_init_r(void) {
	int ret;
	struct udevice *dev;
	struct uclass *uc;
	struct mmc *mmc;
	int reg_val;
	int mmc_dev = 0;

	ret = uclass_get(UCLASS_WDT, &uc);
	if (ret)
		return -ENOSYS;

	uclass_foreach_dev(dev, uc) {
		if (strncmp(dev->driver->name, WDT_DRIVER_NAME, strlen(WDT_DRIVER_NAME)) == 0) {
			reg_val = mtk_wdt_get_nonrst2(dev);
			if (reg_val & (REBOOT_BOOTLOADER_VALUE << REBOOT_BOOTLOADER_SHIFT)) {
				env_set("force_fastboot", "1");
				mtk_wdt_set_nonrst2(dev, REBOOT_BOOTLOADER_MASK << REBOOT_BOOTLOADER_SHIFT, 0);
			}
		}
	}

	// Set Green LED on
	gpio_request(19, "led_green");
	gpio_direction_output(19, 1);

	// Set a default serial number.
	// If a crypto chip is detected, override it.
	env_set("serial#", "0123456789ABCDEF");

	mmc = find_mmc_device(mmc_dev);
	if (mmc) {
		if (!mmc_init(mmc) && mmc->capacity >= 7000000000) {
			printf("EVT2 detected\n");
			env_set("evt2_board", "1");

			// Try to detect A71CH on the I2C bus.
			// This usually fails on the first try, so retry a little.
			int retries = 3;
			struct udevice *devp;
			do {
				ret = i2c_get_chip_for_busnum(2, 0x49, 0, &devp);
				retries--;
				udelay(10000);
			} while (retries && ret);

			if (!ret) {
				// Retrieve the UID of the A71CH,
				// and convert it into a string.
				u8* uid = a71ch_uid(devp);
				char uid_str[(A71CH_UID_LEN*2)+1];
				memset(uid_str, 0, sizeof(uid_str));
				for (int i = 0; i < A71CH_UID_LEN; i++) {
					sprintf(uid_str+(i*2), "%02x", uid[i]);
				}
				env_set("serial#", uid_str);
			}
		}
	}

	return 0;
}

int board_init(void)
{
	struct udevice *dev;

	uclass_first_device_err(UCLASS_USB_GADGET_GENERIC, &dev);

#ifdef CONFIG_USB_ETHER
	usb_ether_init();
#endif

	return 0;
}
