summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAaron Durbin <adurbin@chromium.org>2018-07-25 09:12:10 -0600
committerAaron Durbin <adurbin@chromium.org>2018-07-26 15:36:11 +0000
commite7f4780137c350f6e1ae1090ed69675296fd3887 (patch)
treee5a7bb1f98f9e3016e71f8e08844cc52410f7a74
parent2fcc034705d010d44d3424059519f8487889e594 (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.inc1
-rw-r--r--src/mainboard/google/octopus/variants/phaser/variant.c73
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));
+ }
+}