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

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



Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent bc3b0c41
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -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;

+10 −7
Original line number Diff line number Diff line
@@ -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;

+0 −6
Original line number Diff line number Diff line
@@ -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;
+1 −1
Original line number Diff line number Diff line
@@ -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,