From 57799dcdd1d80e8f1c8f5cd602796c34522bbb15 Mon Sep 17 00:00:00 2001 From: Andrey Petrov Date: Tue, 9 Feb 2016 17:02:57 -0800 Subject: soc/apollolake: Add minimal GPIO driver This adds the minimal functionality needed to configure SoC pads. Change-Id: I2e2268eee2b8c822b42a48a95604b0fab86c9833 Signed-off-by: Andrey Petrov Reviewed-on: https://review.coreboot.org/13676 Reviewed-by: Aaron Durbin Reviewed-by: Paul Menzel Tested-by: build bot (Jenkins) --- src/soc/intel/apollolake/gpio.c | 60 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 src/soc/intel/apollolake/gpio.c (limited to 'src/soc/intel/apollolake/gpio.c') diff --git a/src/soc/intel/apollolake/gpio.c b/src/soc/intel/apollolake/gpio.c new file mode 100644 index 0000000000..33500da558 --- /dev/null +++ b/src/soc/intel/apollolake/gpio.c @@ -0,0 +1,60 @@ +/* + * This file is part of the coreboot project. + * + * Copyright (C) 2015 Intel Corp. + * (Written by Alexandru Gagniuc for Intel Corp.) + * + * 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; either version 2 of the License, or + * (at your option) any later version. + */ + +#include +#include + +/* This list must be in order, from highest pad numbers, to lowest pad numbers*/ +static const struct pad_community { + uint16_t first_pad; + uint8_t port; +} gpio_communities[] = { + { + .port = GPIO_SOUTHWEST, + .first_pad = SW_OFFSET, + }, { + .port = GPIO_WEST, + .first_pad = W_OFFSET, + }, { + .port = GPIO_NORTHWEST, + .first_pad = NW_OFFSET, + }, { + .port = GPIO_NORTH, + .first_pad = 0, + } +}; + +static const struct pad_community *gpio_get_community(uint16_t pad) +{ + const struct pad_community *map = gpio_communities; + + while (map->first_pad > pad) + map++; + + return map; +} + +void gpio_configure_pad(const struct pad_config *cfg) +{ + const struct pad_community *comm = gpio_get_community(cfg->pad); + uint16_t config_offset = PAD_CFG_OFFSET(cfg->pad - comm->first_pad); + iosf_write(comm->port, config_offset, cfg->config0); + iosf_write(comm->port, config_offset + sizeof(uint32_t), cfg->config1); +} + +void gpio_configure_pads(const struct pad_config *cfg, size_t num_pads) +{ + uint32_t i; + + for (i = 0; i < num_pads; i++) + gpio_configure_pad(cfg + i); +} -- cgit v1.2.3