aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/gpio/gpio_if.m
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/gpio/gpio_if.m')
-rw-r--r--sys/dev/gpio/gpio_if.m39
1 files changed, 39 insertions, 0 deletions
diff --git a/sys/dev/gpio/gpio_if.m b/sys/dev/gpio/gpio_if.m
index 78383d3d46d8..4d6dfd17a5d7 100644
--- a/sys/dev/gpio/gpio_if.m
+++ b/sys/dev/gpio/gpio_if.m
@@ -31,6 +31,32 @@
INTERFACE gpio;
+CODE {
+ static gpio_map_gpios_t gpio_default_map_gpios;
+
+ int
+ gpio_default_map_gpios(device_t bus, phandle_t dev,
+ phandle_t gparent, int gcells, pcell_t *gpios, uint32_t *pin,
+ uint32_t *flags)
+ {
+ /* Propagate up the bus hierarchy until someone handles it. */
+ if (device_get_parent(bus) != NULL)
+ return (GPIO_MAP_GPIOS(device_get_parent(bus), dev,
+ gparent, gcells, gpios, pin, flags));
+
+ /* If that fails, then assume the FreeBSD defaults. */
+ *pin = gpios[0];
+ if (gcells == 2 || gcells == 3)
+ *flags = gpios[gcells - 1];
+
+ return (0);
+ }
+};
+
+HEADER {
+ #include <dev/ofw/openfirm.h>
+};
+
#
# Get total number of pins
#
@@ -100,3 +126,16 @@ METHOD int pin_setflags {
uint32_t pin_num;
uint32_t flags;
};
+
+#
+# Allow the GPIO controller to map the gpio-specifier on its own.
+#
+METHOD int map_gpios {
+ device_t bus;
+ phandle_t dev;
+ phandle_t gparent;
+ int gcells;
+ pcell_t *gpios;
+ uint32_t *pin;
+ uint32_t *flags;
+} DEFAULT gpio_default_map_gpios;