* 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
This commit is contained in:
Jérôme Duval
2010-06-12 14:02:50 +00:00
parent 9b9c5a1b8b
commit 9a0a4979d5
3 changed files with 34 additions and 1 deletions
@@ -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);
@@ -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;
}
@@ -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)