summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/soc/intel/common/block/gpio/gpio.c37
-rw-r--r--src/soc/intel/common/block/include/intelblocks/gpio.h15
2 files changed, 52 insertions, 0 deletions
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
@@ -133,6 +133,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
*/
void *gpio_dwx_address(const gpio_t pad);