Commit 20a80074 authored by Ben Skeggs's avatar Ben Skeggs

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

Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent bc3b0c41
...@@ -8,6 +8,12 @@ ...@@ -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;
......
...@@ -110,7 +110,7 @@ nouveau_gpio_intr_disable(struct nouveau_event *event, int type, int index) ...@@ -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) ...@@ -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) ...@@ -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++) { for (i = 0; e = 0, (hi | lo) && i < impl->lines; i++) {
if ((hi | lo) & (1 << i)) if (hi & (1 << i))
nouveau_event_trigger(gpio->events, 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, ...@@ -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;
......
...@@ -27,12 +27,6 @@ void _nouveau_gpio_dtor(struct nouveau_object *); ...@@ -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;
......
...@@ -1013,7 +1013,7 @@ nouveau_connector_create(struct drm_device *dev, int index) ...@@ -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,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment