soc/intel/common/block/gpio: Add API for gpio_configure_pads_with_override
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. This is done to allow sharing of GPIO tables across baseboard-variants for various boards i.e. Each board can have a base config table which is provided by the baseboard and an optional override config table that can be provided by a variant to configure certain GPIOs differently. It is helpful when the variant GPIO diff list is not very huge compared to the baseboard. BUG=b:111743717 TEST=Verified that the GPIO config for phaser is same with and without this change. Change-Id: I1c5dc72c8368957201ab53d2e8398ff861341a4c Signed-off-by: Furquan Shaikh <furquan@google.com> Reviewed-on: https://review.coreboot.org/27640 Reviewed-by: Aaron Durbin <adurbin@chromium.org> Reviewed-by: Justin TerAvest <teravest@chromium.org> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
parent
e7f4780137
commit
4a12a56cdf
|
@ -288,6 +288,43 @@ void gpio_configure_pads(const struct pad_config *cfg, size_t num_pads)
|
||||||
gpio_configure_pad(cfg + i);
|
gpio_configure_pad(cfg + i);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This functions 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 pad_config *gpio_get_config(const struct pad_config *c,
|
||||||
|
const struct pad_config *override_cfg_table,
|
||||||
|
size_t num)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
if (override_cfg_table == NULL)
|
||||||
|
return c;
|
||||||
|
|
||||||
|
for (i = 0; i < num; i++) {
|
||||||
|
if (c->pad == override_cfg_table[i].pad)
|
||||||
|
return override_cfg_table + i;
|
||||||
|
}
|
||||||
|
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
void gpio_configure_pads_with_override(const struct pad_config *base_cfg,
|
||||||
|
size_t base_num_pads,
|
||||||
|
const struct pad_config *override_cfg,
|
||||||
|
size_t override_num_pads)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
const struct pad_config *c;
|
||||||
|
|
||||||
|
for (i = 0; i < base_num_pads; i++) {
|
||||||
|
c = gpio_get_config(base_cfg + i, override_cfg,
|
||||||
|
override_num_pads);
|
||||||
|
gpio_configure_pad(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void *gpio_dwx_address(const gpio_t pad)
|
void *gpio_dwx_address(const gpio_t pad)
|
||||||
{
|
{
|
||||||
/* Calculate Address of DW0 register for given GPIO
|
/* Calculate Address of DW0 register for given GPIO
|
||||||
|
|
|
@ -132,6 +132,21 @@ int gpi_status_get(const struct gpi_status *sts, gpio_t gpi);
|
||||||
*/
|
*/
|
||||||
void gpio_configure_pads(const struct pad_config *cfg, size_t num_pads);
|
void gpio_configure_pads(const struct pad_config *cfg, size_t num_pads);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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 pad_config *base_cfg,
|
||||||
|
size_t base_num_pads,
|
||||||
|
const struct pad_config *override_cfg,
|
||||||
|
size_t override_num_pads);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Calculate Address of DW0 register for given GPIO
|
* Calculate Address of DW0 register for given GPIO
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue