diff options
author | Aaron Durbin <adurbin@chromium.org> | 2018-07-25 09:12:10 -0600 |
---|---|---|
committer | Aaron Durbin <adurbin@chromium.org> | 2018-07-26 15:36:11 +0000 |
commit | e7f4780137c350f6e1ae1090ed69675296fd3887 (patch) | |
tree | e5a7bb1f98f9e3016e71f8e08844cc52410f7a74 | |
parent | 2fcc034705d010d44d3424059519f8487889e594 (diff) |
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 <adurbin@chromium.org>
Reviewed-on: https://review.coreboot.org/27638
Reviewed-by: Justin TerAvest <teravest@chromium.org>
Reviewed-by: Furquan Shaikh <furquan@google.com>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
-rw-r--r-- | src/mainboard/google/octopus/variants/phaser/Makefile.inc | 1 | ||||
-rw-r--r-- | src/mainboard/google/octopus/variants/phaser/variant.c | 73 |
2 files changed, 74 insertions, 0 deletions
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 <arch/acpi_device.h> +#include <baseboard/variants.h> +#include <boardid.h> +#include <device/device.h> +#include <drivers/i2c/generic/chip.h> +#include <drivers/i2c/hid/chip.h> +#include <soc/gpio.h> +#include <soc/pci_devs.h> +#include <string.h> + +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)); + } +} |