// SPDX-License-Identifier: GPL-2.0+
/*
 * Copyright (C) 2018
 * Lukasz Majewski, DENX Software Engineering, lukma@denx.de
 *
 * Based on code developed by:
 *
 * Copyright (C) 2012 TQ-Systems GmbH
 * Daniel Gericke <daniel.gericke@tqs.de>
 */

#include <common.h>
#include <environment.h>
#include <i2c.h>
#include "kp_id_rev.h"

static int eeprom_has_been_read;
static struct id_eeprom eeprom;

void show_eeprom(void)
{
	char safe_string[33];
	int i;
	u8 *p;

	puts("Module EEPROM:\n");
	/* ID */
	for (i = 0; i <= sizeof(eeprom.id) && 0xff != eeprom.id[i]; ++i)
		safe_string[i] = eeprom.id[i];
	safe_string[i] = '\0';

	if (!strncmp(safe_string, "TQM", 3)) {
		printf("  ID: %s\n", safe_string);
		env_set("boardtype", safe_string);
	} else {
		puts("  unknown hardware variant\n");
	}

	/* Serial number */
	for (i = 0; (sizeof(eeprom.serial) >= i) &&
		    (eeprom.serial[i] >= 0x30) &&
		    (eeprom.serial[i] <= 0x39); ++i)
		safe_string[i] = eeprom.serial[i];
	safe_string[i] = '\0';

	if (strlen(safe_string) == 8) {
		printf("  SN: %s\n", safe_string);
		env_set("serial#", safe_string);
	} else {
		puts("  unknown serial number\n");
	}

	/* MAC address  */
	p = eeprom.mac;
	if (!is_valid_ethaddr(p)) {
		printf("  Not valid ETH EEPROM addr!\n");
		return;
	}

	printf("  MAC: %02x:%02x:%02x:%02x:%02x:%02x\n",
	       p[0], p[1], p[2], p[3], p[4], p[5]);

	eth_env_set_enetaddr("ethaddr", p);
}

int read_eeprom(void)
{
	struct udevice *dev;
	int ret;

	if (eeprom_has_been_read)
		return 0;

	ret = i2c_get_chip_for_busnum(CONFIG_SYS_EEPROM_BUS_NUM,
				      CONFIG_SYS_I2C_EEPROM_ADDR,
				      CONFIG_SYS_I2C_EEPROM_ADDR_LEN, &dev);
	if (ret) {
		printf("Cannot find EEPROM !\n");
		return ret;
	}

	ret = dm_i2c_read(dev, 0x0, (uchar *)&eeprom, sizeof(eeprom));

	eeprom_has_been_read = (ret == 0) ? 1 : 0;
	return ret;
}

int read_board_id(void)
{
	unsigned char rev_id = 0x42;
	char rev_str[32], buf[8];
	struct udevice *dev;
	int ret;

	ret = i2c_get_chip_for_busnum(2, 0x22, 1, &dev);
	if (ret) {
		printf("Cannot find pcf8574 IO expander !\n");
		return ret;
	}

	dm_i2c_read(dev, 0x0, &rev_id, sizeof(rev_id));

	sprintf(rev_str, "%02X", rev_id);
	if (rev_id & 0x80) {
		printf("BBoard:4x00 Rev:%s\n", rev_str);
		env_set("boardtype", "ddc");
		env_set("fit_config", "imx53_kb_conf");
	} else {
		printf("BBoard:40x0 Rev:%s\n", rev_str);
		env_set("boardtype", "hsc");
		env_set("fit_config", "imx53_kb_40x0_conf");
	}

	sprintf(buf, "kp-%s", env_get("boardtype"));
	env_set("boardname", buf);
	env_set("boardsoc", "imx53");
	env_set("kb53_rev", rev_str);

	return 0;
}
