/* SPDX-License-Identifier: GPL-2.0-only */ #include #include #include #include #include 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; } }