Changeset a333b7f in mainline for uspace/drv/audio/hdaudio/hdaudio.c
- Timestamp:
- 2014-08-25T09:28:39Z (11 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 932e2f5
- Parents:
- 1412a184
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/audio/hdaudio/hdaudio.c
r1412a184 ra333b7f 34 34 35 35 #include <assert.h> 36 #include <bitops.h> 36 37 #include <ddi.h> 37 38 #include <device/hw_res_parsed.h> … … 40 41 #include <str_error.h> 41 42 #include <ddf/driver.h> 43 #include <ddf/interrupt.h> 42 44 #include <ddf/log.h> 43 45 … … 53 55 static int hda_fun_online(ddf_fun_t *fun); 54 56 static int hda_fun_offline(ddf_fun_t *fun); 57 58 static void hdaudio_interrupt(ddf_dev_t *, ipc_callid_t, ipc_call_t *); 55 59 56 60 static driver_ops_t driver_ops = { … … 67 71 }; 68 72 73 irq_pio_range_t hdaudio_irq_pio_ranges[] = { 74 { 75 .base = 0, 76 .size = 8192 77 } 78 }; 79 80 irq_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 107 irq_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 69 114 static int hda_dev_add(ddf_dev_t *dev) 70 115 { … … 110 155 hda->rwsize = RNGSZ(res.mem_ranges.ranges[0]); 111 156 157 ddf_msg(LVL_NOTE, "hda reg base: %" PRIx64, 158 RNGABS(res.mem_ranges.ranges[0])); 159 112 160 if (hda->rwsize < sizeof(hda_regs_t)) { 113 161 ddf_msg(LVL_ERROR, "Memory range is too small."); … … 124 172 125 173 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 } 126 198 127 199 if (hda_ctl_init(hda) == NULL) { … … 157 229 } 158 230 231 ddf_msg(LVL_NOTE, "Failing hda_dev_add() -> %d", rc); 159 232 return rc; 160 233 } … … 208 281 } 209 282 283 static 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 210 292 int main(int argc, char *argv[]) 211 293 {
Note:
See TracChangeset
for help on using the changeset viewer.