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 @@
#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;
......
......@@ -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;
......
......@@ -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;
......
......@@ -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,
......
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