diff options
author | Ben Skeggs <bskeggs@redhat.com> | 2013-03-22 10:05:03 +1000 |
---|---|---|
committer | Ben Skeggs <bskeggs@redhat.com> | 2013-04-24 15:19:53 +1000 |
commit | 6d40f702d54e2481345e9c7d7fd94674d84515de (patch) | |
tree | 1dc58873e1c6fe06235f97c0ca917619b8077747 /lib/main.c | |
parent | ee556722c113fa53389d02cc031eb52158efb412 (diff) | |
download | nouveau-6d40f702d54e2481345e9c7d7fd94674d84515de.tar.gz |
mc: handle irq-related setup ourselves
We need to be able to process interrupts before the DRM code is able to
actually enable them, set it up ourselves. Also, it's less convoluted
to *not* use the DRM wrappers it appears...
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Diffstat (limited to 'lib/main.c')
-rw-r--r-- | lib/main.c | 46 |
1 files changed, 39 insertions, 7 deletions
diff --git a/lib/main.c b/lib/main.c index 78d5b9906..9caf60448 100644 --- a/lib/main.c +++ b/lib/main.c @@ -56,19 +56,51 @@ static int os_client_id = 0; *****************************************************************************/ #define INTR_FREQ 10000 +struct os_intr { + struct list_head head; + irq_handler_t handler; + int irq; + void *dev; +}; +static LIST_HEAD(os_intr_list); + +int +os_intr_init(unsigned int irq, irq_handler_t handler, unsigned long flags, + const char *name, void *dev) +{ + struct os_intr *intr = malloc(sizeof(*intr)); + if (!intr) + return -ENOMEM; + intr->handler = handler; + intr->irq = irq; + intr->dev = dev; + list_add(&intr->head, &os_intr_list); + return 0; +} + +void +os_intr_free(unsigned int irq, void *dev) +{ + struct os_intr *intr; + + list_for_each_entry(intr, &os_intr_list, head) { + if (intr->irq == irq && intr->dev == dev) { + list_del(&intr->head); + free(intr); + break; + } + } +} + static void os_intr(int signal) { - struct nouveau_subdev *pmc; - struct os_device *odev; + struct os_intr *intr; - list_for_each_entry(odev, &os_device_list, head) { - pmc = nouveau_subdev(odev, NVDEV_SUBDEV_MC); - if (pmc && pmc->intr) - pmc->intr(pmc); + list_for_each_entry(intr, &os_intr_list, head) { + intr->handler(intr->irq, intr->dev); } - ualarm(INTR_FREQ, 0); } |