// SPDX-License-Identifier: GPL-2.0+
/*
 * Copyright (c) 2020 Toradex
 */

#include <dm.h>
#include <i2c_eeprom.h>
#include <linux/errno.h>

DECLARE_GLOBAL_DATA_PTR;

static int get_tdx_eeprom(u32 eeprom_id, struct udevice **devp)
{
	int ret = 0;
	int node;
	ofnode eeprom;
	char eeprom_str[16];
	const char *path;

	if (!gd->fdt_blob) {
		printf("%s: don't have a valid gd->fdt_blob!\n", __func__);
		return -EFAULT;
	}

	node = fdt_path_offset(gd->fdt_blob, "/aliases");
	if (node < 0)
		return -ENODEV;

	sprintf(eeprom_str, "eeprom%d", eeprom_id);

	path = fdt_getprop(gd->fdt_blob, node, eeprom_str, NULL);
	if (!path) {
		printf("%s: no alias for %s\n", __func__, eeprom_str);
		return -ENODEV;
	}

	eeprom = ofnode_path(path);
	if (!ofnode_valid(eeprom)) {
		printf("%s: invalid hardware path to EEPROM\n", __func__);
		return -ENODEV;
	}

	ret = uclass_get_device_by_ofnode(UCLASS_I2C_EEPROM, eeprom, devp);
	if (ret) {
		printf("%s: cannot find EEPROM by node\n", __func__);
		return ret;
	}

	return ret;
}

int read_tdx_eeprom_data(u32 eeprom_id, int offset, u8 *buf,
			 int size)
{
	struct udevice *dev;
	int ret;

	ret = get_tdx_eeprom(eeprom_id, &dev);
	if (ret)
		return ret;

	ret = i2c_eeprom_read(dev, 0x0, buf, size);
	if (ret) {
		printf("%s: error reading data from EEPROM id: %d!, ret = %d\n",
		       __func__, eeprom_id, ret);
		return ret;
	}

	return ret;
}

int write_tdx_eeprom_data(u32 eeprom_id, int offset, u8 *buf,
			  int size)
{
	struct udevice *dev;
	int ret;

	ret = get_tdx_eeprom(eeprom_id, &dev);
	if (ret)
		return ret;

	ret = i2c_eeprom_write(dev, 0x0, buf, size);
	if (ret) {
		printf("%s: error writing data to EEPROM id: %d, ret = %d\n",
		       __func__, eeprom_id, ret);
		return ret;
	}

	return ret;
}
