summaryrefslogtreecommitdiffstats
path: root/sys/dev
diff options
context:
space:
mode:
authorkettenis <kettenis@openbsd.org>2016-03-30 10:00:08 +0000
committerkettenis <kettenis@openbsd.org>2016-03-30 10:00:08 +0000
commite121b72d2675bae6a24ea4863847e0495e338162 (patch)
tree3d711792c11b3844e4793ff5423d0950b43ef43a /sys/dev
parentExpose the functionality that triggers a check for card insertion or removal. (diff)
downloadwireguard-openbsd-e121b72d2675bae6a24ea4863847e0495e338162.tar.xz
wireguard-openbsd-e121b72d2675bae6a24ea4863847e0495e338162.zip
Hook up the gpio interrupt on devices that use it for card detection.
Makes the SD card slot on machines based on Intel's Bay Trail SoC fully functional. ok jsg@
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/acpi/sdhc_acpi.c20
1 files changed, 19 insertions, 1 deletions
diff --git a/sys/dev/acpi/sdhc_acpi.c b/sys/dev/acpi/sdhc_acpi.c
index 6948be0209a..b9b688d6606 100644
--- a/sys/dev/acpi/sdhc_acpi.c
+++ b/sys/dev/acpi/sdhc_acpi.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sdhc_acpi.c,v 1.4 2016/03/29 18:04:09 kettenis Exp $ */
+/* $OpenBSD: sdhc_acpi.c,v 1.5 2016/03/30 10:00:08 kettenis Exp $ */
/*
* Copyright (c) 2016 Mark Kettenis
*
@@ -46,6 +46,7 @@ struct sdhc_acpi_softc {
struct aml_node *sc_gpio_int_node;
struct aml_node *sc_gpio_io_node;
uint16_t sc_gpio_int_pin;
+ uint16_t sc_gpio_int_flags;
uint16_t sc_gpio_io_pin;
struct sdhc_host *sc_host;
@@ -68,6 +69,7 @@ const char *sdhc_hids[] = {
int sdhc_acpi_parse_resources(union acpi_resource *, void *);
int sdhc_acpi_card_detect(struct sdhc_softc *);
+void sdhc_acpi_card_detect_intr(void *);
int
sdhc_acpi_match(struct device *parent, void *match, void *aux)
@@ -120,6 +122,13 @@ sdhc_acpi_attach(struct device *parent, struct device *self, void *aux)
if (sc->sc_gpio_io_node && sc->sc_gpio_io_node->gpio)
sc->sc.sc_card_detect = sdhc_acpi_card_detect;
+ if (sc->sc_gpio_int_node && sc->sc_gpio_int_node->gpio) {
+ struct acpi_gpio *gpio = sc->sc_gpio_int_node->gpio;
+
+ gpio->intr_establish(gpio->cookie, sc->sc_gpio_int_pin,
+ sc->sc_gpio_int_flags, sdhc_acpi_card_detect_intr, sc);
+ }
+
printf("\n");
sc->sc.sc_host = &sc->sc_host;
@@ -150,6 +159,7 @@ sdhc_acpi_parse_resources(union acpi_resource *crs, void *arg)
if (crs->lr_gpio.type == LR_GPIO_INT) {
sc->sc_gpio_int_node = node;
sc->sc_gpio_int_pin = pin;
+ sc->sc_gpio_int_flags = crs->lr_gpio.tflags;
} else if (crs->lr_gpio.type == LR_GPIO_IO) {
sc->sc_gpio_io_node = node;
sc->sc_gpio_io_pin = pin;
@@ -177,3 +187,11 @@ sdhc_acpi_card_detect(struct sdhc_softc *ssc)
/* Card detect GPIO signal is active-low. */
return !gpio->read_pin(gpio->cookie, pin);
}
+
+void
+sdhc_acpi_card_detect_intr(void *arg)
+{
+ struct sdhc_acpi_softc *sc = arg;
+
+ sdhc_needs_discover(&sc->sc);
+}