summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAaron Durbin <adurbin@chromium.org>2013-12-10 14:58:03 -0800
committerchrome-internal-fetch <chrome-internal-fetch@google.com>2013-12-11 19:50:35 +0000
commit31912b61a7c19515f5f5decae8ccad7b8e42f4cf (patch)
treec7710da57badca64fb949e28360ae23c08cf219f
parenta7e2c765191f151bed7e3266d1491cab0c34bae3 (diff)
downloadvboot-31912b61a7c19515f5f5decae8ccad7b8e42f4cf.tar.gz
crossystem: add GpioChipset sturcture for x86
Up until recently the x86 systems had a single contiguous set of gpio numbers exported through /sys/class/gpio as /sys/class/gpiochip<X> values. BayTrail systems have 3 sets of gpio numbers. Therefore, there needs to be a translation/look-up function based on chipset. The existing chipsets have a 1:1 mapping, but this patch lays the ground- work for chipset-specific translation. BUG=chrome-os-partner:24324 BUG=chrome-os-partner:24440 BUG=chrome-os-partner:24408 BRANCH=None TEST=Built. Ran on Rambi. Change-Id: I32bcd975aea421f86a0220ee30332f48fe727656 Signed-off-by: Aaron Durbin <adurbin@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/179512 Reviewed-by: Duncan Laurie <dlaurie@chromium.org>
-rw-r--r--host/arch/x86/lib/crossystem_arch.c35
1 files changed, 29 insertions, 6 deletions
diff --git a/host/arch/x86/lib/crossystem_arch.c b/host/arch/x86/lib/crossystem_arch.c
index bc899a2b..922dc649 100644
--- a/host/arch/x86/lib/crossystem_arch.c
+++ b/host/arch/x86/lib/crossystem_arch.c
@@ -499,7 +499,7 @@ static char* ReadPlatformFamilyString(char* dest, int size) {
* we look for a directory named /sys/class/gpio/gpiochip<O>/. If there's not
* exactly one match for that, we're SOL.
*/
-static int FindGpioChipOffset(int *offset) {
+static int FindGpioChipOffset(int *gpio_num, int *offset) {
DIR *dir;
struct dirent *ent;
int match = 0;
@@ -520,6 +520,30 @@ static int FindGpioChipOffset(int *offset) {
}
+struct GpioChipset {
+ const char *name;
+ int (*ChipOffsetAndGpioNumber)(int *gpio_num, int *chip_offset);
+};
+
+static const struct GpioChipset chipsets_supported[] = {
+ { "NM10", FindGpioChipOffset },
+ { "CougarPoint", FindGpioChipOffset },
+ { "PantherPoint", FindGpioChipOffset },
+ { "LynxPoint", FindGpioChipOffset },
+ { NULL },
+};
+
+static const struct GpioChipset *FindChipset(const char *name) {
+ const struct GpioChipset *chipset = &chipsets_supported[0];
+
+ while (chipset->name != NULL) {
+ if (!strcmp(name, chipset->name))
+ return chipset;
+ chipset++;
+ }
+ return NULL;
+}
+
/* Read a GPIO of the specified signal type (see ACPI GPIO SignalType).
*
* Returns 1 if the signal is asserted, 0 if not asserted, or -1 if error. */
@@ -532,6 +556,7 @@ static int ReadGpio(int signal_type) {
int controller_offset = 0;
char controller_name[128];
int value;
+ const struct GpioChipset *chipset;
/* Scan GPIO.* to find a matching signal type */
for (index = 0; ; index++) {
@@ -555,14 +580,12 @@ static int ReadGpio(int signal_type) {
snprintf(name, sizeof(name), "%s.%d/GPIO.3", ACPI_GPIO_PATH, index);
if (!ReadFileString(controller_name, sizeof(controller_name), name))
return -1;
- if ((0 != strcmp(controller_name, "NM10")) &&
- (0 != strcmp(controller_name, "CougarPoint")) &&
- (0 != strcmp(controller_name, "PantherPoint")) &&
- (0 != strcmp(controller_name, "LynxPoint")))
+ chipset = FindChipset(controller_name);
+ if (chipset == NULL)
return -1;
/* Modify GPIO number by driver's offset */
- if (!FindGpioChipOffset(&controller_offset))
+ if (!chipset->ChipOffsetAndGpioNumber(&controller_num, &controller_offset))
return -1;
controller_offset += controller_num;