Browse Source

drm/nouveau/gpio: send separate event types for high/low transitions

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Ben Skeggs 11 years ago
parent
commit
20a8007485

+ 6 - 0
drivers/gpu/drm/nouveau/core/include/subdev/gpio.h

@@ -8,6 +8,12 @@
 #include <subdev/bios.h>
 #include <subdev/bios.h>
 #include <subdev/bios/gpio.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_gpio {
 	struct nouveau_subdev base;
 	struct nouveau_subdev base;
 
 

+ 10 - 7
drivers/gpu/drm/nouveau/core/subdev/gpio/base.c

@@ -110,7 +110,7 @@ nouveau_gpio_intr_disable(struct nouveau_event *event, int type, int index)
 {
 {
 	struct nouveau_gpio *gpio = nouveau_gpio(event->priv);
 	struct nouveau_gpio *gpio = nouveau_gpio(event->priv);
 	const struct nouveau_gpio_impl *impl = (void *)nv_object(gpio)->oclass;
 	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
 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);
 	struct nouveau_gpio *gpio = nouveau_gpio(event->priv);
 	const struct nouveau_gpio_impl *impl = (void *)nv_object(gpio)->oclass;
 	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
 static void
@@ -126,13 +126,16 @@ nouveau_gpio_intr(struct nouveau_subdev *subdev)
 {
 {
 	struct nouveau_gpio *gpio = nouveau_gpio(subdev);
 	struct nouveau_gpio *gpio = nouveau_gpio(subdev);
 	const struct nouveau_gpio_impl *impl = (void *)nv_object(gpio)->oclass;
 	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);
 	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->get  = nouveau_gpio_get;
 	gpio->reset = impl->reset;
 	gpio->reset = impl->reset;
 
 
-	ret = nouveau_event_create(1, impl->lines, &gpio->events);
+	ret = nouveau_event_create(2, impl->lines, &gpio->events);
 	if (ret)
 	if (ret)
 		return ret;
 		return ret;
 
 

+ 0 - 6
drivers/gpu/drm/nouveau/core/subdev/gpio/priv.h

@@ -27,12 +27,6 @@ void _nouveau_gpio_dtor(struct nouveau_object *);
 int  _nouveau_gpio_init(struct nouveau_object *);
 int  _nouveau_gpio_init(struct nouveau_object *);
 int  _nouveau_gpio_fini(struct nouveau_object *, bool);
 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_gpio_impl {
 	struct nouveau_oclass base;
 	struct nouveau_oclass base;
 	int lines;
 	int lines;

+ 1 - 1
drivers/gpu/drm/nouveau/nouveau_connector.c

@@ -1013,7 +1013,7 @@ nouveau_connector_create(struct drm_device *dev, int index)
 			nv_connector->hpd.func = DCB_GPIO_UNUSED;
 			nv_connector->hpd.func = DCB_GPIO_UNUSED;
 
 
 		if (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,
 					  nv_connector->hpd.line,
 					  nouveau_connector_hotplug,
 					  nouveau_connector_hotplug,
 					  nv_connector,
 					  nv_connector,