soc/amd/common/block/gpio: add API for gpio override table

This function adds support for gpio_configure_pads_with_override
which:
1. Takes as input two GPIO tables -- base config table and override
config table
2. Configures each pad in base config by first checking if there is a
config available for the pad in override config table. If yes, then
uses the one from override config table. Else, uses the base config to
configure the pad.

BUG=b:153456574
TEST=Build and boot dalboz
BRANCH=none

Signed-off-by: peichao.wang <peichao.wang@bitland.corp-partner.google.com>
Change-Id: I07bfe82827d1f7aea9fcc96574d6deab9e91d503
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/coreboot/+/2153423
Reviewed-by: Furquan Shaikh <furquan@chromium.org>
Commit-Queue: Furquan Shaikh <furquan@chromium.org>
Tested-by: Furquan Shaikh <furquan@chromium.org>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/41576
Reviewed-by: Furquan Shaikh <furquan@google.com>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
Peichao Wang 2020-04-18 08:25:53 +08:00 committed by Felix Held
parent 30ce0f383f
commit 712311f56e
2 changed files with 48 additions and 0 deletions

View File

@ -294,3 +294,36 @@ int gpio_interrupt_status(gpio_t gpio)
return 0; return 0;
} }
/*
* This function checks to see if there is an override config present for the
* provided pad_config. If no override config is present, then the input config
* is returned. Else, it returns the override config.
*/
static const struct soc_amd_gpio *gpio_get_config(const struct soc_amd_gpio *c,
const struct soc_amd_gpio *override_cfg_table,
size_t num)
{
size_t i;
if (override_cfg_table == NULL)
return c;
for (i = 0; i < num; i++) {
if (c->gpio == override_cfg_table[i].gpio)
return override_cfg_table + i;
}
return c;
}
void gpio_configure_pads_with_override(const struct soc_amd_gpio *base_cfg,
size_t base_num_pads,
const struct soc_amd_gpio *override_cfg,
size_t override_num_pads)
{
size_t i;
const struct soc_amd_gpio *c;
for (i = 0; i < base_num_pads; i++) {
c = gpio_get_config(base_cfg + i, override_cfg,
override_num_pads);
program_gpios(c, 1);
}
}

View File

@ -276,6 +276,21 @@ enum {
typedef uint32_t gpio_t; typedef uint32_t gpio_t;
/*
* gpio_configure_pads_with_override accepts as input two GPIO tables:
* 1. Base config
* 2. Override config
*
* This function configures raw pads in base config and applies override in
* override config if any. Thus, for every GPIO_x in base config, this function
* looks up the GPIO in override config and if it is present there, then applies
* the configuration from override config.
*/
void gpio_configure_pads_with_override(const struct soc_amd_gpio *base_cfg,
size_t base_num_pads,
const struct soc_amd_gpio *override_cfg,
size_t override_num_pads);
/* Get the address of the control register of a particular pin */ /* Get the address of the control register of a particular pin */
uintptr_t gpio_get_address(gpio_t gpio_num); uintptr_t gpio_get_address(gpio_t gpio_num);