moved stateStatus read/write out of the interrupt handler

added some error verbose


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26282 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Jérôme Duval
2008-07-06 19:20:03 +00:00
parent 4a684bb832
commit df709516a0
@@ -110,16 +110,9 @@ hda_interrupt_handler(hda_controller* controller)
/* Controller or stream related? */ /* Controller or stream related? */
if (intrStatus & INTR_STATUS_CONTROLLER) { if (intrStatus & INTR_STATUS_CONTROLLER) {
uint32 stateStatus = controller->Read16(HDAC_STATE_STATUS);
uint8 rirbStatus = controller->Read8(HDAC_RIRB_STATUS); uint8 rirbStatus = controller->Read8(HDAC_RIRB_STATUS);
uint8 corbStatus = controller->Read8(HDAC_CORB_STATUS); uint8 corbStatus = controller->Read8(HDAC_CORB_STATUS);
if (stateStatus) {
/* Detected Codec state change */
controller->Write16(HDAC_STATE_STATUS, stateStatus);
controller->codec_status = stateStatus;
}
/* Check for incoming responses */ /* Check for incoming responses */
if (rirbStatus) { if (rirbStatus) {
controller->Write8(HDAC_RIRB_STATUS, rirbStatus); controller->Write8(HDAC_RIRB_STATUS, rirbStatus);
@@ -672,7 +665,7 @@ hda_send_verbs(hda_codec* codec, corb_t* verbs, uint32* responses, uint32 count)
status_t status_t
hda_hw_init(hda_controller* controller) hda_hw_init(hda_controller* controller)
{ {
uint16 capabilities; uint16 capabilities, stateStatus;
status_t status; status_t status;
/* Map MMIO registers */ /* Map MMIO registers */
@@ -708,13 +701,17 @@ hda_hw_init(hda_controller* controller)
/* Get controller into valid state */ /* Get controller into valid state */
status = reset_controller(controller); status = reset_controller(controller);
if (status != B_OK) if (status != B_OK) {
dprintf("hda: reset_controller failed\n");
goto reset_failed; goto reset_failed;
}
/* Setup CORB/RIRB/DMA POS */ /* Setup CORB/RIRB/DMA POS */
status = init_corb_rirb_pos(controller); status = init_corb_rirb_pos(controller);
if (status != B_OK) if (status != B_OK) {
dprintf("hda: init_corb_rirb_pos failed\n");
goto corb_rirb_failed; goto corb_rirb_failed;
}
controller->Write16(HDAC_WAKE_ENABLE, 0x7fff); controller->Write16(HDAC_WAKE_ENABLE, 0x7fff);
@@ -722,14 +719,19 @@ hda_hw_init(hda_controller* controller)
controller->Write32(HDAC_INTR_CONTROL, INTR_CONTROL_GLOBAL_ENABLE controller->Write32(HDAC_INTR_CONTROL, INTR_CONTROL_GLOBAL_ENABLE
| INTR_CONTROL_CONTROLLER_ENABLE); | INTR_CONTROL_CONTROLLER_ENABLE);
if (!controller->codec_status) { snooze(1000);
stateStatus = controller->Read16(HDAC_STATE_STATUS);
if (!stateStatus) {
dprintf("hda: bad codec status\n");
status = ENODEV; status = ENODEV;
goto corb_rirb_failed; goto corb_rirb_failed;
} }
controller->Write16(HDAC_STATE_STATUS, stateStatus);
// Create codecs // Create codecs
for (uint32 index = 0; index < HDA_MAX_CODECS; index++) { for (uint32 index = 0; index < HDA_MAX_CODECS; index++) {
if ((controller->codec_status & (1 << index)) != 0) if ((stateStatus & (1 << index)) != 0)
hda_codec_new(controller, index); hda_codec_new(controller, index);
} }
for (uint32 index = 0; index < HDA_MAX_CODECS; index++) { for (uint32 index = 0; index < HDA_MAX_CODECS; index++) {
@@ -743,6 +745,7 @@ hda_hw_init(hda_controller* controller)
if (controller->active_codec != NULL) if (controller->active_codec != NULL)
return B_OK; return B_OK;
dprintf("hda: no active codec\n");
status = ENODEV; status = ENODEV;
corb_rirb_failed: corb_rirb_failed: