diff --git a/src/soc/intel/common/block/gpio/gpio.c b/src/soc/intel/common/block/gpio/gpio.c index 50a3a0266c..931fb7f545 100644 --- a/src/soc/intel/common/block/gpio/gpio.c +++ b/src/soc/intel/common/block/gpio/gpio.c @@ -288,6 +288,43 @@ void gpio_configure_pads(const struct pad_config *cfg, size_t num_pads) 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) { /* Calculate Address of DW0 register for given GPIO diff --git a/src/soc/intel/common/block/include/intelblocks/gpio.h b/src/soc/intel/common/block/include/intelblocks/gpio.h index 625ebef881..4e26db3619 100644 --- a/src/soc/intel/common/block/include/intelblocks/gpio.h +++ b/src/soc/intel/common/block/include/intelblocks/gpio.h @@ -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); +/* + * 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 */