From 9a0a4979d5dad3a3689e2f8420abec40fdbd2a91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Sat, 12 Jun 2010 14:02:50 +0000 Subject: [PATCH] * add some helper functions to read/write verbs. * try at support realtek alc888. alsa uses this init sequence. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37113 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/add-ons/kernel/drivers/audio/hda/driver.h | 2 ++ .../kernel/drivers/audio/hda/hda_codec.cpp | 17 ++++++++++++++++- .../kernel/drivers/audio/hda/hda_controller.cpp | 16 ++++++++++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/add-ons/kernel/drivers/audio/hda/driver.h b/src/add-ons/kernel/drivers/audio/hda/driver.h index 56f6da4531..441cb9d17e 100644 --- a/src/add-ons/kernel/drivers/audio/hda/driver.h +++ b/src/add-ons/kernel/drivers/audio/hda/driver.h @@ -354,6 +354,8 @@ void hda_hw_stop(hda_controller* controller); void hda_hw_uninit(hda_controller* controller); status_t hda_send_verbs(hda_codec* codec, corb_t* verbs, uint32* responses, uint32 count); +status_t hda_verb_write(hda_codec* codec, uint32 nid, uint32 vid, uint8 payload); +status_t hda_verb_read(hda_codec* codec, uint32 nid, uint32 vid, uint32 *response); /* hda_controller.c: Stream support */ hda_stream* hda_stream_new(hda_audio_group* audioGroup, int type); 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 dc7fc045d5..09d40a6985 100644 --- a/src/add-ons/kernel/drivers/audio/hda/hda_codec.cpp +++ b/src/add-ons/kernel/drivers/audio/hda/hda_codec.cpp @@ -653,6 +653,8 @@ hda_codec_parse_audio_group(hda_audio_group* audioGroup) corb_t verbs[3]; uint32 resp[3]; + hda_codec* codec = audioGroup->codec; + uint32 codec_id = (codec->vendor_id << 16) | codec->product_id; hda_widget_get_stream_support(audioGroup, &audioGroup->widget); hda_widget_get_pm_support(audioGroup, &audioGroup->widget); hda_widget_get_amplifier_capabilities(audioGroup, &audioGroup->widget); @@ -707,7 +709,7 @@ hda_codec_parse_audio_group(hda_audio_group* audioGroup) >> AUDIO_CAP_TYPE_SHIFT); /* Check specific node ids declared as inputs as beepers */ - switch ((audioGroup->codec->vendor_id << 16) | audioGroup->codec->product_id) { + switch (codec_id) { case 0x11d41882: case 0x11d41883: case 0x11d41884: @@ -812,6 +814,19 @@ hda_codec_parse_audio_group(hda_audio_group* audioGroup) hda_widget_get_associations(audioGroup); + // init the codecs + switch (codec_id) { + case 0x10ec0888: { + hda_verb_write(codec, 0x20, VID_SET_COEFFICIENT_INDEX, 0x0); + uint32 tmp; + hda_verb_read(codec, 0x20, VID_GET_PROCESSING_COEFFICIENT, &tmp); + hda_verb_write(codec, 0x20, VID_SET_COEFFICIENT_INDEX, 0x7); + hda_verb_write(codec, 0x20, VID_SET_PROCESSING_COEFFICIENT, + (tmp & 0xf0) == 0x20 ? 0x830 : 0x3030); + break; + } + } + return B_OK; } 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 7878007eeb..8aece99823 100644 --- a/src/add-ons/kernel/drivers/audio/hda/hda_controller.cpp +++ b/src/add-ons/kernel/drivers/audio/hda/hda_controller.cpp @@ -774,6 +774,22 @@ hda_send_verbs(hda_codec* codec, corb_t* verbs, uint32* responses, uint32 count) } +status_t +hda_verb_write(hda_codec* codec, uint32 nid, uint32 vid, uint8 payload) +{ + corb_t verb = MAKE_VERB(codec->addr, nid, vid, payload); + return hda_send_verbs(codec, &verb, NULL, 1); +} + + +status_t +hda_verb_read(hda_codec* codec, uint32 nid, uint32 vid, uint32 *response) +{ + corb_t verb = MAKE_VERB(codec->addr, nid, vid, 0); + return hda_send_verbs(codec, &verb, response, 1); +} + + /*! Setup hardware for use; detect codecs; etc */ status_t hda_hw_init(hda_controller* controller)