Changeset a333b7f in mainline for uspace/drv/audio/hdaudio/hdaudio.c


Ignore:
Timestamp:
2014-08-25T09:28:39Z (10 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
932e2f5
Parents:
1412a184
Message:

Interrupt handling - RIRB interrupts.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/audio/hdaudio/hdaudio.c

    r1412a184 ra333b7f  
    3434
    3535#include <assert.h>
     36#include <bitops.h>
    3637#include <ddi.h>
    3738#include <device/hw_res_parsed.h>
     
    4041#include <str_error.h>
    4142#include <ddf/driver.h>
     43#include <ddf/interrupt.h>
    4244#include <ddf/log.h>
    4345
     
    5355static int hda_fun_online(ddf_fun_t *fun);
    5456static int hda_fun_offline(ddf_fun_t *fun);
     57
     58static void hdaudio_interrupt(ddf_dev_t *, ipc_callid_t, ipc_call_t *);
    5559
    5660static driver_ops_t driver_ops = {
     
    6771};
    6872
     73irq_pio_range_t hdaudio_irq_pio_ranges[] = {
     74        {
     75                .base = 0,
     76                .size = 8192
     77        }
     78};
     79
     80irq_cmd_t hdaudio_irq_commands[] = {
     81        {
     82                .cmd = CMD_PIO_READ_8,
     83                .addr = NULL,
     84                .dstarg = 2
     85        },
     86        {
     87                .cmd = CMD_AND,
     88                .value = BIT_V(uint8_t, rirbsts_intfl),
     89                .srcarg = 2,
     90                .dstarg = 3
     91        },
     92        {
     93                .cmd = CMD_PREDICATE,
     94                .value = 2,
     95                .srcarg = 3
     96        },
     97        {
     98                .cmd = CMD_PIO_WRITE_8,
     99                .addr = NULL,
     100                .value = BIT_V(uint8_t, rirbsts_intfl),
     101        },
     102        {
     103                .cmd = CMD_ACCEPT
     104        }
     105};
     106
     107irq_code_t hdaudio_irq_code = {
     108        .rangecount = sizeof(hdaudio_irq_pio_ranges) / sizeof(irq_pio_range_t),
     109        .ranges = hdaudio_irq_pio_ranges,
     110        .cmdcount = sizeof(hdaudio_irq_commands) / sizeof(irq_cmd_t),
     111        .cmds = hdaudio_irq_commands
     112};
     113
    69114static int hda_dev_add(ddf_dev_t *dev)
    70115{
     
    110155        hda->rwsize = RNGSZ(res.mem_ranges.ranges[0]);
    111156
     157        ddf_msg(LVL_NOTE, "hda reg base: %" PRIx64,
     158             RNGABS(res.mem_ranges.ranges[0]));
     159
    112160        if (hda->rwsize < sizeof(hda_regs_t)) {
    113161                ddf_msg(LVL_ERROR, "Memory range is too small.");
     
    124172
    125173        hda->regs = (hda_regs_t *)regs;
     174
     175        ddf_msg(LVL_NOTE, "IRQs: %d", res.irqs.count);
     176        if (res.irqs.count != 1) {
     177                ddf_msg(LVL_ERROR, "Unexpected IRQ count %d (!= 1)",
     178                    res.irqs.count);
     179                goto error;
     180        }
     181        ddf_msg(LVL_NOTE, "interrupt no: %d", res.irqs.irqs[0]);
     182
     183        hda_regs_t *rphys = (hda_regs_t *)(uintptr_t)hda->rwbase;
     184        hdaudio_irq_pio_ranges[0].base = (uintptr_t)hda->rwbase;
     185        hdaudio_irq_commands[0].addr = (void *)&rphys->rirbsts;
     186        hdaudio_irq_commands[3].addr = (void *)&rphys->rirbsts;
     187        ddf_msg(LVL_NOTE, "range0.base=%x", hdaudio_irq_pio_ranges[0].base);
     188        ddf_msg(LVL_NOTE, "cmd0.addr=%p", hdaudio_irq_commands[0].addr);
     189        ddf_msg(LVL_NOTE, "cmd3.addr=%p", hdaudio_irq_commands[3].addr);
     190
     191        rc = register_interrupt_handler(dev, res.irqs.irqs[0],
     192            hdaudio_interrupt, &hdaudio_irq_code);
     193        if (rc != EOK) {
     194                ddf_msg(LVL_ERROR, "Failed registering interrupt handler. (%d)",
     195                    rc);
     196                goto error;
     197        }
    126198
    127199        if (hda_ctl_init(hda) == NULL) {
     
    157229        }
    158230
     231        ddf_msg(LVL_NOTE, "Failing hda_dev_add() -> %d", rc);
    159232        return rc;
    160233}
     
    208281}
    209282
     283static void hdaudio_interrupt(ddf_dev_t *dev, ipc_callid_t iid,
     284    ipc_call_t *icall)
     285{
     286        hda_t *hda = (hda_t *)ddf_dev_data_get(dev);
     287
     288        ddf_msg(LVL_NOTE, "## interrupt ##");
     289        hda_ctl_interrupt(hda->ctl);
     290}
     291
    210292int main(int argc, char *argv[])
    211293{
Note: See TracChangeset for help on using the changeset viewer.