From e7f4780137c350f6e1ae1090ed69675296fd3887 Mon Sep 17 00:00:00 2001 From: Aaron Durbin Date: Wed, 25 Jul 2018 09:12:10 -0600 Subject: [PATCH] mb/google/octopus: update phaser touchscreen enable gpio The next build for phaser swapped the gpio for the touchscreen enable. In order to support previous builds the devicetree needs to be updated at runtime based on board revision id. BUG=b:111808427,b:111743717 TEST=built Change-Id: I45ef05ea0b991d04d5bf410cd7a175913bf0bf5d Signed-off-by: Aaron Durbin Reviewed-on: https://review.coreboot.org/27638 Reviewed-by: Justin TerAvest Reviewed-by: Furquan Shaikh Tested-by: build bot (Jenkins) --- .../octopus/variants/phaser/Makefile.inc | 1 + .../google/octopus/variants/phaser/variant.c | 73 +++++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 src/mainboard/google/octopus/variants/phaser/Makefile.inc create mode 100644 src/mainboard/google/octopus/variants/phaser/variant.c diff --git a/src/mainboard/google/octopus/variants/phaser/Makefile.inc b/src/mainboard/google/octopus/variants/phaser/Makefile.inc new file mode 100644 index 0000000000..1644083954 --- /dev/null +++ b/src/mainboard/google/octopus/variants/phaser/Makefile.inc @@ -0,0 +1 @@ +ramstage-y += variant.c diff --git a/src/mainboard/google/octopus/variants/phaser/variant.c b/src/mainboard/google/octopus/variants/phaser/variant.c new file mode 100644 index 0000000000..1ead5e230c --- /dev/null +++ b/src/mainboard/google/octopus/variants/phaser/variant.c @@ -0,0 +1,73 @@ +/* + * This file is part of the coreboot project. + * + * Copyright 2018 Google LLC. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +extern struct chip_operations drivers_i2c_generic_ops; +extern struct chip_operations drivers_i2c_hid_ops; + +void variant_update_devtree(struct device *dev) +{ + uint32_t bid; + struct device *touchscreen_i2c_host; + struct device *child; + const struct bus *children_bus; + static const struct acpi_gpio new_enable_gpio = + ACPI_GPIO_OUTPUT_ACTIVE_HIGH(GPIO_146); + + bid = board_id(); + + /* Nothing to update. */ + if (bid == UNDEFINED_STRAPPING_ID || bid < 1) + return; + + touchscreen_i2c_host = dev_find_slot(0, PCH_DEVFN_I2C7); + + if (touchscreen_i2c_host == NULL) + return; + + children_bus = touchscreen_i2c_host->link_list; + child = NULL; + + /* Find all children on bus to update touchscreen enable gpio. */ + while ((child = dev_bus_each_child(children_bus, child)) != NULL) { + struct drivers_i2c_generic_config *cfg; + + /* No configration to change. */ + if (child->chip_info == NULL) + continue; + + if (child->chip_ops == &drivers_i2c_generic_ops) + cfg = child->chip_info; + else if (child->chip_ops == &drivers_i2c_hid_ops) { + struct drivers_i2c_hid_config *hid_cfg; + hid_cfg = child->chip_info; + cfg = &hid_cfg->generic; + } else + continue; + + /* Update the enable gpio. */ + memcpy(&cfg->enable_gpio, &new_enable_gpio, + sizeof(new_enable_gpio)); + } +}