mirror of
https://github.com/rd-stuffs/msm-4.14.git
synced 2025-02-20 11:45:48 +08:00
drm/nouveau/gpio: send separate event types for high/low transitions
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
This commit is contained in:
parent
bc3b0c41b1
commit
20a8007485
@ -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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user