diff --git a/src/add-ons/kernel/drivers/audio/hda/driver.h b/src/add-ons/kernel/drivers/audio/hda/driver.h index e197e4c42f..07c9f0a25f 100644 --- a/src/add-ons/kernel/drivers/audio/hda/driver.h +++ b/src/add-ons/kernel/drivers/audio/hda/driver.h @@ -252,6 +252,7 @@ struct hda_audio_group { uint32 widget_count; uint32 association_count; + uint32 gpio; hda_widget* widgets; hda_association associations[MAX_ASSOCIATIONS]; diff --git a/src/add-ons/kernel/drivers/audio/hda/hda_codec.cpp b/src/add-ons/kernel/drivers/audio/hda/hda_codec.cpp index 6531361e37..0ffd31ba7e 100644 --- a/src/add-ons/kernel/drivers/audio/hda/hda_codec.cpp +++ b/src/add-ons/kernel/drivers/audio/hda/hda_codec.cpp @@ -625,6 +625,7 @@ hda_codec_parse_audio_group(hda_audio_group* audioGroup) GPIO_COUNT_GPIWAKE(resp[1]) ? "yes" : "no"); dump_widget_stream_support(audioGroup->widget); + audioGroup->gpio = resp[1]; audioGroup->widget_start = SUB_NODE_COUNT_START(resp[2]); audioGroup->widget_count = SUB_NODE_COUNT_TOTAL(resp[2]); @@ -987,7 +988,7 @@ TRACE("build tree!\n"); // GPIO uint32 gpio = 0; - for (int32 i = 0; i < 8; i++) { + for (int32 i = 0; i < GPIO_COUNT_NUM_GPIO(audioGroup->gpio); i++) { if (audioGroup->codec->quirks & (1 << i)) { gpio |= (1 << i); } @@ -996,7 +997,7 @@ TRACE("build tree!\n"); if (gpio != 0) { corb_t verb[] = { MAKE_VERB(audioGroup->codec->addr, - audioGroup->widget.node_id, VID_SET_GPIODATA, gpio), + audioGroup->widget.node_id, VID_SET_GPIO_DATA, gpio), MAKE_VERB(audioGroup->codec->addr, audioGroup->widget.node_id, VID_SET_GPIO_EN, gpio), MAKE_VERB(audioGroup->codec->addr, diff --git a/src/add-ons/kernel/drivers/audio/hda/hda_codec_defs.h b/src/add-ons/kernel/drivers/audio/hda/hda_codec_defs.h index 89c90685f6..eccfe92428 100644 --- a/src/add-ons/kernel/drivers/audio/hda/hda_codec_defs.h +++ b/src/add-ons/kernel/drivers/audio/hda/hda_codec_defs.h @@ -94,10 +94,10 @@ enum pin_dev_type { #define VID_SET_GPIUNSOL 0x71200 #define VID_GET_GPISTICKY 0xF1300 #define VID_SET_GPISTICKY 0x71300 -#define VID_GET_GPODATA 0xF1400 -#define VID_SET_GPODATA 0x71400 -#define VID_GET_GPIODATA 0xF1500 -#define VID_SET_GPIODATA 0x71500 +#define VID_GET_GPO_DATA 0xF1400 +#define VID_SET_GPO_DATA 0x71400 +#define VID_GET_GPIO_DATA 0xF1500 +#define VID_SET_GPIO_DATA 0x71500 #define VID_GET_GPIO_EN 0xF1600 #define VID_SET_GPIO_EN 0x71600 #define VID_GET_GPIO_DIR 0xF1700 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 cc2ff4d169..ca745d5ff6 100644 --- a/src/add-ons/kernel/drivers/audio/hda/hda_controller.cpp +++ b/src/add-ons/kernel/drivers/audio/hda/hda_controller.cpp @@ -523,7 +523,7 @@ status_t hda_stream_setup_buffers(hda_audio_group* audioGroup, hda_stream* stream, const char* desc) { - uint32 bufferSize, bufferPhysicalAddress, alloc; + uint32 bufferPhysicalAddress; uint32 response[2]; physical_entry pe; bdl_entry_t* bufferDescriptors; @@ -584,7 +584,7 @@ hda_stream_setup_buffers(hda_audio_group* audioGroup, hda_stream* stream, } /* Calculate size of buffer (aligned to 128 bytes) */ - bufferSize = stream->sample_size * stream->num_channels + uint32 bufferSize = stream->sample_size * stream->num_channels * stream->buffer_length; bufferSize = ALIGN(bufferSize, 128); @@ -594,7 +594,7 @@ hda_stream_setup_buffers(hda_audio_group* audioGroup, hda_stream* stream, stream->rate, stream->bps, format, stream->sample_format); /* Calculate total size of all buffers (aligned to size of B_PAGE_SIZE) */ - alloc = bufferSize * stream->num_buffers; + uint32 alloc = bufferSize * stream->num_buffers; alloc = PAGE_ALIGN(alloc); /* Allocate memory for buffers */ @@ -623,7 +623,8 @@ hda_stream_setup_buffers(hda_audio_group* audioGroup, hda_stream* stream, } /* Now allocate BDL for buffer range */ - alloc = (stream->num_buffers + ((offset > 0) ? 1 : 0)) * sizeof(bdl_entry_t); + uint32 bdlCount = stream->num_buffers + (offset > 0 ? 1 : 0); + alloc = bdlCount * sizeof(bdl_entry_t); alloc = PAGE_ALIGN(alloc); stream->buffer_descriptors_area = create_area("hda buffer descriptors", @@ -645,7 +646,7 @@ hda_stream_setup_buffers(hda_audio_group* audioGroup, hda_stream* stream, stream->physical_buffer_descriptors = (uint32)pe.address; dprintf("%s(%s): Allocated %ld bytes for %ld BDLEs\n", __func__, desc, - alloc, stream->num_buffers); + alloc, bdlCount); uint32 fragments = 0; if (offset > 0) { diff --git a/src/add-ons/kernel/drivers/audio/hda/hda_multi_audio.cpp b/src/add-ons/kernel/drivers/audio/hda/hda_multi_audio.cpp index ab10df2327..ddbce0ef2f 100644 --- a/src/add-ons/kernel/drivers/audio/hda/hda_multi_audio.cpp +++ b/src/add-ons/kernel/drivers/audio/hda/hda_multi_audio.cpp @@ -988,7 +988,6 @@ buffer_force_stop(hda_audio_group* audioGroup) hda_stream_stop(audioGroup->codec->controller, audioGroup->record_stream); } - //hda_stream_stop(audioGroup->codec->controller, audioGroup->record_stream); return B_OK; }