summaryrefslogtreecommitdiff
path: root/include/gpio.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/gpio.h')
-rw-r--r--include/gpio.h97
1 files changed, 77 insertions, 20 deletions
diff --git a/include/gpio.h b/include/gpio.h
index 9517cf40ee..eee7711ee3 100644
--- a/include/gpio.h
+++ b/include/gpio.h
@@ -10,20 +10,24 @@
#include "common.h"
-/* Flag definitions for gpio_info. */
-#define GPIO_INPUT 0x0000 /* Input */
-#define GPIO_OUTPUT 0x0001 /* Output */
-#define GPIO_OPEN_DRAIN 0x0002 /* Output type is open-drain */
-#define GPIO_PULL_UP 0x0004 /* Enable on-chip pullup */
-#define GPIO_PULL_DOWN 0x0008 /* Enable on-chip pulldown */
-#define GPIO_LOW 0x0010 /* If GPIO_OUTPUT, set level low */
-#define GPIO_HIGH 0x0020 /* If GPIO_OUTPUT, set level high */
-#define GPIO_INT_RISING 0x0040 /* Interrupt on rising edge */
-#define GPIO_INT_FALLING 0x0080 /* Interrupt on falling edge */
-#define GPIO_INT_BOTH 0x0100 /* Interrupt on both edges */
-#define GPIO_INT_LOW 0x0200 /* Interrupt on low level */
-#define GPIO_INT_HIGH 0x0400 /* Interrupt on high level */
-#define GPIO_DEFAULT 0x0800 /* Don't set up on boot */
+/* Flag definitions for gpio_info and gpio_alt_func */
+/* The following are valid for both gpio_info and gpio_alt_func: */
+#define GPIO_OPEN_DRAIN (1 << 0) /* Output type is open-drain */
+#define GPIO_PULL_UP (1 << 1) /* Enable on-chip pullup */
+#define GPIO_PULL_DOWN (1 << 2) /* Enable on-chip pulldown */
+/* The following are valid for gpio_alt_func only */
+#define GPIO_ANALOG (1 << 3) /* Set pin to analog-mode */
+/* The following are valid for gpio_info only */
+#define GPIO_INPUT 0 /* Input */
+#define GPIO_OUTPUT (1 << 4) /* Output */
+#define GPIO_LOW (1 << 5) /* If GPIO_OUTPUT, set level low */
+#define GPIO_HIGH (1 << 6) /* If GPIO_OUTPUT, set level high */
+#define GPIO_INT_RISING (1 << 7) /* Interrupt on rising edge */
+#define GPIO_INT_FALLING (1 << 8) /* Interrupt on falling edge */
+#define GPIO_INT_BOTH (1 << 9) /* Interrupt on both edges */
+#define GPIO_INT_LOW (1 << 10) /* Interrupt on low level */
+#define GPIO_INT_HIGH (1 << 11) /* Interrupt on high level */
+#define GPIO_DEFAULT (1 << 12) /* Don't set up on boot */
/* Common flag combinations */
#define GPIO_OUT_LOW (GPIO_OUTPUT | GPIO_LOW)
@@ -37,11 +41,18 @@
/* GPIO signal definition structure, for use by board.c */
struct gpio_info {
+ /* Signal name */
const char *name;
- int port; /* Port (LM4_GPIO_*) */
- int mask; /* Bitmask on that port (0x01 - 0x80; 0x00 =
- * signal not implemented) */
- uint32_t flags; /* Flags (GPIO_*) */
+
+ /* Port base address */
+ uint32_t port;
+
+ /* Bitmask on that port (1 << N; 0 = signal not implemented) */
+ int mask;
+
+ /* Flags (GPIO_*; see above) */
+ uint32_t flags;
+
/*
* Interrupt handler. If non-NULL, and the signal's interrupt is
* enabled, this will be called in the context of the GPIO interrupt
@@ -60,6 +71,27 @@ extern const struct gpio_info gpio_list[];
#define GPIO_SIGNAL_NOT_IMPLEMENTED(name) {name, GPIO_A, 0, 0, NULL}
#endif
+/* GPIO alternate function structure, for use by board.c */
+struct gpio_alt_func {
+ /* Port base address */
+ uint32_t port;
+
+ /* Bitmask on that port (multiple bits allowed) */
+ uint32_t mask;
+
+ /* Alternate function number */
+ int8_t func;
+
+ /* Module ID (as uint8_t, since enum would be 32-bit) */
+ uint8_t module_id;
+
+ /* Flags (GPIO_*; see above). */
+ uint16_t flags;
+};
+
+extern const struct gpio_alt_func gpio_alt_funcs[];
+extern const int gpio_alt_funcs_count;
+
/**
* Pre-initialize GPIOs.
*
@@ -68,6 +100,14 @@ extern const struct gpio_info gpio_list[];
void gpio_pre_init(void);
/**
+ * Configure GPIO pin functions for a module.
+ *
+ * @param id Module ID to initialize
+ * @param enable Enable alternate functions if 1; high-Z pins if 0.
+ */
+void gpio_config_module(enum module_id id, int enable);
+
+/**
* Get the current value of a signal.
*
* @param signal Signal to get
@@ -123,11 +163,28 @@ void gpio_set_level(enum gpio_signal signal, int value);
int gpio_enable_interrupt(enum gpio_signal signal);
/**
+ * Set flags for GPIO(s) by port and mask.
+ *
+ * Use gpio_set_flags() to set flags for an individual GPIO by id.
+ *
+ * Note that modules should usually declare their GPIO alternate functions in
+ * gpio_alt_funcs[] and call gpio_init_module() instead of calling this
+ * directly.
+ *
+ * @param port GPIO port to set (GPIO_*)
+ * @param mask Bitmask of pins on that port to affect
+ * @param flags Flags (GPIO_*; see above)
+ */
+void gpio_set_flags_by_mask(uint32_t port, uint32_t mask, uint32_t flags);
+
+/**
* Set alternate function for GPIO(s).
*
- * This is intended for use by other modules' configure_gpio() functions.
+ * Note that modules should usually declare their GPIO alternate functions in
+ * gpio_alt_funcs[] and call gpio_init_module() instead of calling this
+ * directly.
*
- * @param port GPIO port to set (LM4_GPIO_*)
+ * @param port GPIO port to set (GPIO_*)
* @param mask Bitmask of pins on that port to affect
* @param func Alternate function; if <0, configures the specified
* GPIOs for normal GPIO operation.