/* SPDX-License-Identifier: GPL-2.0-only */ #include #include #include #include #include #include #define RT58_I2C_ADDRESS 0x1a extern struct chip_operations drivers_i2c_generic_ops; extern struct chip_operations drivers_i2c_da7219_ops; void variant_devtree_update(void) { struct device *mmio_dev = NULL, *child = NULL; struct device *alc_dev = NULL, *da7219_dev = NULL; do { mmio_dev = dev_find_path(mmio_dev, DEVICE_PATH_MMIO); if (!mmio_dev) { printk(BIOS_INFO, "Checking audio codec\n"); return; } } while (mmio_dev->path.mmio.addr != APU_I2C0_BASE); while ((child = dev_bus_each_child(mmio_dev->downstream, child)) != NULL) { if (child->path.type != DEVICE_PATH_I2C) continue; if (child->path.i2c.device != RT58_I2C_ADDRESS) 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 (google_chromeec_get_sku_id()) { case SKU_TREEYA_ALC5682_AE: case SKU_TREEYA_ALC5682_AF: /* alc5682 only */ if (da7219_dev) da7219_dev->enabled = 0; if (alc_dev) alc_dev->enabled = 1; break; default: /* da7219 only */ if (da7219_dev) da7219_dev->enabled = 1; if (alc_dev) alc_dev->enabled = 0; break; } }