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

#include <ec/google/chromeec/ec.h>
#include <baseboard/variants.h>
#include <variant/sku.h>
#include <string.h>
#include <drivers/i2c/hid/chip.h>

extern struct chip_operations drivers_i2c_generic_ops;
extern struct chip_operations drivers_i2c_da7219_ops;

void variant_devtree_update(void)
{
	uint32_t sku = google_chromeec_get_sku_id();
	struct device *mmio_dev = NULL, *child = NULL;
	struct device *alc_dev = NULL, *da7219_dev = NULL;

	while (1) {
		mmio_dev = dev_find_path(mmio_dev, DEVICE_PATH_MMIO);
		if (mmio_dev == NULL)
			break;
		if (mmio_dev->path.mmio.addr == 0xfedc2000)
			break;
	}

	if (mmio_dev == NULL)
		return;

	while ((child = dev_bus_each_child(mmio_dev->downstream, child)) != NULL) {
		if (child->path.type != DEVICE_PATH_I2C)
			continue;
		if (child->path.i2c.device != 0x1a)
			continue;
		if (child->chip_ops == &drivers_i2c_generic_ops) {
			struct drivers_i2c_generic_config *config = child->chip_info;
			if (!strcmp(config->hid, "10EC5682"))
				alc_dev = child;
		} else if (child->chip_ops == &drivers_i2c_da7219_ops) {
			da7219_dev = child;
		}
	}

	switch (sku) {
	default:
		/* da7219 only */
		if (da7219_dev)
			da7219_dev->enabled = 1;
		if (alc_dev)
			alc_dev->enabled = 0;
		break;
	case SKU_BARLA_ALC5682_44:
	case SKU_BARLA_ALC5682_45:
	case SKU_BARLA_ALC5682_46:
	case SKU_BARLA_ALC5682_47:
		/* alc5682 only */
		if (da7219_dev)
			da7219_dev->enabled = 0;
		if (alc_dev)
			alc_dev->enabled = 1;
		break;
	}
}
