diff --git a/src/add-ons/kernel/drivers/audio/hda/driver.h b/src/add-ons/kernel/drivers/audio/hda/driver.h index 5486528cf5..45bfffb3d0 100644 --- a/src/add-ons/kernel/drivers/audio/hda/driver.h +++ b/src/add-ons/kernel/drivers/audio/hda/driver.h @@ -149,8 +149,8 @@ struct hda_stream { /* Physical addresses for buffer */ sem_id buffer_ready_sem; bigtime_t real_time; - uint32 frames_count; - uint32 buffer_cycle; + uint64 frames_count; + int32 buffer_cycle; uint32 rate, bps; /* Samplerate & bits per sample */ @@ -168,7 +168,7 @@ struct hda_stream { return controller->Read16(HDAC_STREAM_BASE + offset + reg); } - uint8 Read32(uint32 reg) + uint32 Read32(uint32 reg) { return controller->Read32(HDAC_STREAM_BASE + offset + reg); } @@ -178,12 +178,12 @@ struct hda_stream { *(controller->regs + HDAC_STREAM_BASE + offset + reg) = value; } - void Write16(uint32 reg, uint8 value) + void Write16(uint32 reg, uint16 value) { *(vuint16*)(controller->regs + HDAC_STREAM_BASE + offset + reg) = value; } - void Write32(uint32 reg, uint8 value) + void Write32(uint32 reg, uint32 value) { *(vuint32*)(controller->regs + HDAC_STREAM_BASE + offset + reg) = value; } diff --git a/src/add-ons/kernel/drivers/audio/hda/hda_controller.cpp b/src/add-ons/kernel/drivers/audio/hda/hda_controller.cpp index c782f4f663..412b7a42c5 100644 --- a/src/add-ons/kernel/drivers/audio/hda/hda_controller.cpp +++ b/src/add-ons/kernel/drivers/audio/hda/hda_controller.cpp @@ -26,6 +26,8 @@ (((controller)->num_input_streams + (controller)->num_output_streams \ + (index)) * HDAC_STREAM_SIZE) +#define PAGE_ALIGN(size) (((size) + B_PAGE_SIZE - 1) & ~(B_PAGE_SIZE - 1)) + static const struct { uint32 multi_rate; uint32 hw_rate; @@ -197,15 +199,15 @@ reset_controller(hda_controller* controller) } for (uint32 i = 0; i < controller->num_output_streams; i++) { controller->Write8(HDAC_STREAM_CONTROL0 + HDAC_STREAM_BASE - + HDAC_INPUT_STREAM_OFFSET(controller, i), 0); + + HDAC_OUTPUT_STREAM_OFFSET(controller, i), 0); controller->Write8(HDAC_STREAM_STATUS + HDAC_STREAM_BASE - + HDAC_INPUT_STREAM_OFFSET(controller, i), 0); + + HDAC_OUTPUT_STREAM_OFFSET(controller, i), 0); } for (uint32 i = 0; i < controller->num_bidir_streams; i++) { controller->Write8(HDAC_STREAM_CONTROL0 + HDAC_STREAM_BASE - + HDAC_INPUT_STREAM_OFFSET(controller, i), 0); + + HDAC_BIDIR_STREAM_OFFSET(controller, i), 0); controller->Write8(HDAC_STREAM_STATUS + HDAC_STREAM_BASE - + HDAC_INPUT_STREAM_OFFSET(controller, i), 0); + + HDAC_BIDIR_STREAM_OFFSET(controller, i), 0); } // stop DMA @@ -305,7 +307,7 @@ init_corb_rirb_pos(hda_controller* controller) posSize = 8 * (controller->num_input_streams + controller->num_output_streams + controller->num_bidir_streams); - memSize = (posOffset + posSize + B_PAGE_SIZE - 1) & ~(B_PAGE_SIZE - 1); + memSize = PAGE_ALIGN(posOffset + posSize); /* Allocate memory area */ controller->corb_rirb_pos_area = create_area("hda corb/rirb/pos", @@ -504,7 +506,7 @@ dprintf("HDA: sample size %ld, num channels %ld, buffer length %ld ************* /* Calculate total size of all buffers (aligned to size of B_PAGE_SIZE) */ alloc = bufferSize * stream->num_buffers; - alloc = (alloc + B_PAGE_SIZE - 1) & (~(B_PAGE_SIZE -1)); + alloc = PAGE_ALIGN(alloc); /* Allocate memory for buffers */ stream->buffer_area = create_area("hda buffers", (void**)&buffer, @@ -533,7 +535,7 @@ dprintf("HDA: sample size %ld, num channels %ld, buffer length %ld ************* /* Now allocate BDL for buffer range */ alloc = stream->num_buffers * sizeof(bdl_entry_t); - alloc = (alloc + B_PAGE_SIZE - 1) & ~(B_PAGE_SIZE - 1); + alloc = PAGE_ALIGN(alloc); stream->buffer_descriptors_area = create_area("hda buffer descriptors", (void**)&bufferDescriptors, B_ANY_KERNEL_ADDRESS, alloc,