diff options
-rw-r--r-- | sys/dev/pci/azalia.h | 11 | ||||
-rw-r--r-- | sys/dev/pci/azalia_codec.c | 34 |
2 files changed, 42 insertions, 3 deletions
diff --git a/sys/dev/pci/azalia.h b/sys/dev/pci/azalia.h index 1bdaeb417fe..b6d466daad7 100644 --- a/sys/dev/pci/azalia.h +++ b/sys/dev/pci/azalia.h @@ -1,4 +1,4 @@ -/* $OpenBSD: azalia.h,v 1.15 2008/06/26 05:42:17 ray Exp $ */ +/* $OpenBSD: azalia.h,v 1.16 2008/10/16 02:13:12 jakemsr Exp $ */ /* $NetBSD: azalia.h,v 1.6 2006/01/16 14:15:26 kent Exp $ */ /*- @@ -553,6 +553,15 @@ typedef struct { (nid >= (codec)->wstart && \ nid < (codec)->wend)) +#define PIN_STATUS(wid, conn) \ + do { \ + if ((wid)->type != COP_AWTYPE_PIN_COMPLEX) \ + (conn) = 0; \ + else \ + (conn) = \ + ((wid)->d.pin.config & CORB_CD_PORT_MASK) >> 30; \ + } while (0) + typedef struct { int nconv; nid_t conv[HDA_MAX_CHANNELS]; /* front, surround, clfe, side, ... */ diff --git a/sys/dev/pci/azalia_codec.c b/sys/dev/pci/azalia_codec.c index 17cce29c486..000c3edbac8 100644 --- a/sys/dev/pci/azalia_codec.c +++ b/sys/dev/pci/azalia_codec.c @@ -1,4 +1,4 @@ -/* $OpenBSD: azalia_codec.c,v 1.49 2008/06/26 05:42:17 ray Exp $ */ +/* $OpenBSD: azalia_codec.c,v 1.50 2008/10/16 02:13:12 jakemsr Exp $ */ /* $NetBSD: azalia_codec.c,v 1.8 2006/05/10 11:17:27 kent Exp $ */ /*- @@ -428,8 +428,17 @@ azalia_generic_mixer_init(codec_t *this) w = &this->w[i]; + /* skip unconnected pins */ + if (w->type == COP_AWTYPE_PIN_COMPLEX) { + uint8_t conn = + (w->d.pin.config & CORB_CD_PORT_MASK) >> 30; + if (conn == 1) /* no physical connection */ + continue; + } + /* selector */ - if (w->type != COP_AWTYPE_AUDIO_MIXER && w->nconnections >= 2) { + if (w->type != COP_AWTYPE_AUDIO_MIXER && + w->type != COP_AWTYPE_POWER && w->nconnections >= 2) { MIXER_REG_PROLOG; snprintf(d->label.name, sizeof(d->label.name), "%s.source", w->name); @@ -442,8 +451,15 @@ azalia_generic_mixer_init(codec_t *this) d->mixer_class = AZ_CLASS_OUTPUT; m->target = MI_TARGET_CONNLIST; for (j = 0, k = 0; j < w->nconnections && k < 32; j++) { + uint8_t conn; + if (!VALID_WIDGET_NID(w->connections[j], this)) continue; + /* skip unconnected pins */ + PIN_STATUS(&this->w[w->connections[j]], + conn); + if (conn == 1) + continue; d->un.e.member[k].ord = j; strlcpy(d->un.e.member[k].label.name, this->w[w->connections[j]].name, @@ -531,10 +547,17 @@ azalia_generic_mixer_init(codec_t *this) AudioNon, MAX_AUDIO_DEV_LEN); this->nmixers++; } else { + uint8_t conn; + for (j = 0; j < w->nconnections; j++) { MIXER_REG_PROLOG; if (!VALID_WIDGET_NID(w->connections[j], this)) continue; + /* skip unconnected pins */ + PIN_STATUS(&this->w[w->connections[j]], + conn); + if (conn == 1) + continue; snprintf(d->label.name, sizeof(d->label.name), "%s.%s.mute", w->name, this->w[w->connections[j]].name); @@ -582,10 +605,17 @@ azalia_generic_mixer_init(codec_t *this) MIXER_DELTA(COP_AMPCAP_NUMSTEPS(w->inamp_cap)); this->nmixers++; } else { + uint8_t conn; + for (j = 0; j < w->nconnections; j++) { MIXER_REG_PROLOG; if (!VALID_WIDGET_NID(w->connections[j], this)) continue; + /* skip unconnected pins */ + PIN_STATUS(&this->w[w->connections[j]], + conn); + if (conn == 1) + continue; snprintf(d->label.name, sizeof(d->label.name), "%s.%s", w->name, this->w[w->connections[j]].name); |