drm/nouveau/gpio: send separate event types for high/low transitions
authorBen Skeggs <bskeggs@redhat.com>
Tue, 13 May 2014 05:54:17 +0000 (15:54 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Wed, 11 Jun 2014 06:09:15 +0000 (16:09 +1000)
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/core/include/subdev/gpio.h
drivers/gpu/drm/nouveau/core/subdev/gpio/base.c
drivers/gpu/drm/nouveau/core/subdev/gpio/priv.h
drivers/gpu/drm/nouveau/nouveau_connector.c

index 2e2effa..612d82a 100644 (file)
@@ -8,6 +8,12 @@
 #include <subdev/bios.h>
 #include <subdev/bios/gpio.h>
 
+enum nvkm_gpio_event {
+       NVKM_GPIO_HI = 1,
+       NVKM_GPIO_LO = 2,
+       NVKM_GPIO_TOGGLED = (NVKM_GPIO_HI | NVKM_GPIO_LO),
+};
+
 struct nouveau_gpio {
        struct nouveau_subdev base;
 
index e43bc9f..45e0202 100644 (file)
@@ -110,7 +110,7 @@ nouveau_gpio_intr_disable(struct nouveau_event *event, int type, int index)
 {
        struct nouveau_gpio *gpio = nouveau_gpio(event->priv);
        const struct nouveau_gpio_impl *impl = (void *)nv_object(gpio)->oclass;
-       impl->intr_mask(gpio, NVKM_GPIO_TOGGLED, 1 << index, 0);
+       impl->intr_mask(gpio, type, 1 << index, 0);
 }
 
 static void
@@ -118,7 +118,7 @@ nouveau_gpio_intr_enable(struct nouveau_event *event, int type, int index)
 {
        struct nouveau_gpio *gpio = nouveau_gpio(event->priv);
        const struct nouveau_gpio_impl *impl = (void *)nv_object(gpio)->oclass;
-       impl->intr_mask(gpio, NVKM_GPIO_TOGGLED, 1 << index, 1 << index);
+       impl->intr_mask(gpio, type, 1 << index, 1 << index);
 }
 
 static void
@@ -126,13 +126,16 @@ nouveau_gpio_intr(struct nouveau_subdev *subdev)
 {
        struct nouveau_gpio *gpio = nouveau_gpio(subdev);
        const struct nouveau_gpio_impl *impl = (void *)nv_object(gpio)->oclass;
-       u32 hi, lo, i;
+       u32 hi, lo, e, i;
 
        impl->intr_stat(gpio, &hi, &lo);
 
-       for (i = 0; (hi | lo) && i < impl->lines; i++) {
-               if ((hi | lo) & (1 << i))
-                       nouveau_event_trigger(gpio->events, 1, i);
+       for (i = 0; e = 0, (hi | lo) && i < impl->lines; i++) {
+               if (hi & (1 << i))
+                       e |= NVKM_GPIO_HI;
+               if (lo & (1 << i))
+                       e |= NVKM_GPIO_LO;
+               nouveau_event_trigger(gpio->events, e, i);
        }
 }
 
@@ -205,7 +208,7 @@ nouveau_gpio_create_(struct nouveau_object *parent,
        gpio->get  = nouveau_gpio_get;
        gpio->reset = impl->reset;
 
-       ret = nouveau_event_create(1, impl->lines, &gpio->events);
+       ret = nouveau_event_create(2, impl->lines, &gpio->events);
        if (ret)
                return ret;
 
index 5c02398..e1724df 100644 (file)
@@ -27,12 +27,6 @@ void _nouveau_gpio_dtor(struct nouveau_object *);
 int  _nouveau_gpio_init(struct nouveau_object *);
 int  _nouveau_gpio_fini(struct nouveau_object *, bool);
 
-enum nvkm_gpio_event {
-       NVKM_GPIO_HI = 1,
-       NVKM_GPIO_LO = 2,
-       NVKM_GPIO_TOGGLED = (NVKM_GPIO_HI | NVKM_GPIO_LO),
-};
-
 struct nouveau_gpio_impl {
        struct nouveau_oclass base;
        int lines;
index 0f3fdc6..4a162a4 100644 (file)
@@ -1013,7 +1013,7 @@ nouveau_connector_create(struct drm_device *dev, int index)
                        nv_connector->hpd.func = DCB_GPIO_UNUSED;
 
                if (nv_connector->hpd.func != DCB_GPIO_UNUSED) {
-                       nouveau_event_new(gpio->events, 1,
+                       nouveau_event_new(gpio->events, NVKM_GPIO_TOGGLED,
                                          nv_connector->hpd.line,
                                          nouveau_connector_hotplug,
                                          nv_connector,