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>
This commit is contained in:
Aaron Durbin 2018-07-25 09:12:10 -06:00
parent 2fcc034705
commit e7f4780137
2 changed files with 74 additions and 0 deletions

View File

@ -0,0 +1 @@
ramstage-y += variant.c

View File

@ -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));
}
}