diff options
author | Zhao Edgar Liu - Sun Microsystems <Edgar.Liu@Sun.COM> | 2010-03-02 10:37:11 +0800 |
---|---|---|
committer | Zhao Edgar Liu - Sun Microsystems <Edgar.Liu@Sun.COM> | 2010-03-02 10:37:11 +0800 |
commit | ee97b7343f7aa60136a15b8f0258b30fb0d252c0 (patch) | |
tree | 1133dfdfcfedeeb0ec68952ad1f171fea7ce88eb /usr/src | |
parent | bd6a198f3e258da0f1a540cdd696fc84e2bcc807 (diff) | |
download | illumos-gate-ee97b7343f7aa60136a15b8f0258b30fb0d252c0.tar.gz |
6820924 Audio bell does not work using audiohd
Diffstat (limited to 'usr/src')
-rw-r--r-- | usr/src/uts/common/io/audio/drv/audiohd/audiohd.c | 45 | ||||
-rw-r--r-- | usr/src/uts/common/io/audio/drv/audiohd/audiohd.h | 1 |
2 files changed, 44 insertions, 2 deletions
diff --git a/usr/src/uts/common/io/audio/drv/audiohd/audiohd.c b/usr/src/uts/common/io/audio/drv/audiohd/audiohd.c index 40bde09e62..ee8c4a8f19 100644 --- a/usr/src/uts/common/io/audio/drv/audiohd/audiohd.c +++ b/usr/src/uts/common/io/audio/drv/audiohd/audiohd.c @@ -147,7 +147,7 @@ static audiohd_codec_info_t audiohd_codecs[] = { {0x10de0006, "nVidia MCP78 HDMI", 0x0}, {0x10de0007, "nVidia MCP7A HDMI", 0x0}, {0x10ec0260, "Realtek ALC260", (NO_GPIO)}, - {0x10ec0262, "Realtek ALC262", (NO_GPIO)}, + {0x10ec0262, "Realtek ALC262", (NO_GPIO | EN_PIN_BEEP)}, {0x10ec0268, "Realtek ALC268", 0x0}, {0x10ec0272, "Realtek ALC272", 0x0}, {0x10ec0662, "Realtek ALC662", 0x0}, @@ -243,6 +243,10 @@ audiohd_set_chipset_info(audiohd_state_t *statep) name = "ATI HD Audio"; vers = "Radeon HD 4850"; break; + case 0x1002aa30: + name = "ATI HD Audio"; + vers = "HD 48x0"; + break; case 0x1002aa38: name = "ATI HD Audio"; vers = "Radeon HD 4670"; @@ -3159,6 +3163,21 @@ audiohd_create_widgets(hda_codec_t *codec) case WTYPE_VOL_KNOB: break; case WTYPE_PIN: + /* + * Some codec(like ALC262) don't provide beep widget, + * it only has input Pin to connect an external beep + * (maybe in motherboard or elsewhere). So we open + * all PINs here in order to enable external beep + * source. + */ + if ((codec->codec_info->flags & EN_PIN_BEEP) == 0) { + (void) audioha_codec_4bit_verb_get(statep, + caddr, widget->wid_wid, + AUDIOHDC_VERB_SET_AMP_MUTE, + AUDIOHDC_AMP_SET_LR_OUTPUT | + AUDIOHDC_GAIN_MAX); + } + audiohd_get_pin_config(widget); break; case WTYPE_BEEP: @@ -4858,6 +4877,7 @@ audiohd_build_beep_path(hda_codec_t *codec) for (wid = codec->first_wid; wid <= codec->last_wid; wid++) { widget = codec->widget[wid]; + if (widget->type == WTYPE_BEEP) { path = (audiohd_path_t *) kmem_zalloc(sizeof (audiohd_path_t), @@ -4978,6 +4998,27 @@ audiohd_finish_beep_path(hda_codec_t *codec) path = codec->soft_statep->path[i]; if (!path || path->path_type != BEEP || path->codec != codec) continue; + if (path->pin_nums == 0) { + widget = codec->widget[path->beep_wid]; + if (widget->outamp_cap) { + (void) audioha_codec_4bit_verb_get( + statep, caddr, + path->beep_wid, AUDIOHDC_VERB_SET_AMP_MUTE, + AUDIOHDC_AMP_SET_LR_OUTPUT | + AUDIOHDC_GAIN_MAX); + } + if (widget->inamp_cap) { + (void) audioha_codec_4bit_verb_get( + statep, caddr, + path->beep_wid, AUDIOHDC_VERB_SET_AMP_MUTE, + AUDIOHDC_AMP_SET_LR_INPUT | + AUDIOHDC_GAIN_MAX | + (widget->selconn << + AUDIOHDC_AMP_SET_INDEX_OFFSET)); + } + continue; + } + for (j = 0; j < path->pin_nums; j++) { wid = path->pin_wid[j]; widget = codec->widget[wid]; @@ -5003,7 +5044,7 @@ audiohd_finish_beep_path(hda_codec_t *codec) wid, AUDIOHDC_VERB_SET_AMP_MUTE, AUDIOHDC_AMP_SET_LR_OUTPUT | AUDIOHDC_GAIN_MAX); - } + } if (widget->inamp_cap) { (void) audioha_codec_4bit_verb_get( statep, diff --git a/usr/src/uts/common/io/audio/drv/audiohd/audiohd.h b/usr/src/uts/common/io/audio/drv/audiohd/audiohd.h index b61d66ccad..985d3d8034 100644 --- a/usr/src/uts/common/io/audio/drv/audiohd/audiohd.h +++ b/usr/src/uts/common/io/audio/drv/audiohd/audiohd.h @@ -54,6 +54,7 @@ extern "C" { #define NO_GPIO 0x00000001 #define NO_MIXER 0x00000002 #define NO_SPDIF 0x00000004 +#define EN_PIN_BEEP 0x00000008 #define AUDIOHD_INTS 50 #define AUDIOHD_MAX_INTS 1500 |