summaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/pci/azalia.h9
-rw-r--r--sys/dev/pci/azalia_codec.c93
2 files changed, 27 insertions, 75 deletions
diff --git a/sys/dev/pci/azalia.h b/sys/dev/pci/azalia.h
index edc6d8f3a8f..8ef16858305 100644
--- a/sys/dev/pci/azalia.h
+++ b/sys/dev/pci/azalia.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: azalia.h,v 1.10 2007/05/02 17:01:22 deanna Exp $ */
+/* $OpenBSD: azalia.h,v 1.11 2007/07/23 02:03:42 deanna Exp $ */
/* $NetBSD: azalia.h,v 1.6 2006/01/16 14:15:26 kent Exp $ */
/*-
@@ -507,10 +507,9 @@ typedef struct {
#define MI_TARGET_CONNLIST 0x101
#define MI_TARGET_PINDIR 0x102 /* for bidirectional pin */
#define MI_TARGET_PINBOOST 0x103 /* for headphone pin */
-#define MI_TARGET_PINCTRL 0x104 /* for enabling/disabling pins */
-#define MI_TARGET_DAC 0x105
-#define MI_TARGET_ADC 0x106
-#define MI_TARGET_VOLUME 0x107
+#define MI_TARGET_DAC 0x104
+#define MI_TARGET_ADC 0x105
+#define MI_TARGET_VOLUME 0x106
} mixer_item_t;
#define VALID_WIDGET_NID(nid, codec) (nid == (codec)->audiofunc || \
diff --git a/sys/dev/pci/azalia_codec.c b/sys/dev/pci/azalia_codec.c
index 67007d0e8e4..c3306d450f9 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.22 2007/07/07 16:33:38 deanna Exp $ */
+/* $OpenBSD: azalia_codec.c,v 1.23 2007/07/23 02:03:42 deanna Exp $ */
/* $NetBSD: azalia_codec.c,v 1.8 2006/05/10 11:17:27 kent Exp $ */
/*-
@@ -77,6 +77,7 @@ int azalia_generic_mixer_delete(codec_t *);
int azalia_generic_mixer_ensure_capacity(codec_t *, size_t);
int azalia_generic_mixer_get(const codec_t *, nid_t, int, mixer_ctrl_t *);
int azalia_generic_mixer_set(codec_t *, nid_t, int, const mixer_ctrl_t *);
+int azalia_generic_mixer_pinctrl(codec_t *, nid_t, uint32_t);
u_char azalia_generic_mixer_from_device_value
(const codec_t *, nid_t, int, uint32_t );
uint32_t azalia_generic_mixer_to_device_value
@@ -1221,28 +1222,6 @@ azalia_generic_mixer_set(codec_t *this, nid_t nid, int target, const mixer_ctrl_
return err;
}
- /*
- * pin control: enable/disable. for bidirectional pins, set
- * direction with MI_TARGET_PINDIR after enabling.
- */
-
- else if (target == MI_TARGET_PINCTRL) {
- if (mc->un.ord >= 2)
- return EINVAL;
- err = this->comresp(this, nid,
- CORB_GET_PIN_WIDGET_CONTROL, 0, &result);
- if (err)
- return err;
- if (mc->un.ord == 0) /* disable */
- result &= ~(CORB_PWC_OUTPUT | CORB_PWC_INPUT);
- else
- result |= CORB_PWC_OUTPUT | CORB_PWC_INPUT;
- err = this->comresp(this, nid,
- CORB_SET_PIN_WIDGET_CONTROL, result, &result);
- if (err)
- return err;
- }
-
/* pin headphone-boost */
else if (target == MI_TARGET_PINBOOST) {
if (mc->un.ord >= 2)
@@ -1305,6 +1284,21 @@ azalia_generic_mixer_set(codec_t *this, nid_t nid, int target, const mixer_ctrl_
return 0;
}
+int
+azalia_generic_mixer_pinctrl(codec_t *this, nid_t nid, uint32_t value)
+{
+ int err;
+ uint32_t result;
+
+ err = this->comresp(this, nid, CORB_GET_PIN_WIDGET_CONTROL, 0, &result);
+ if (err)
+ return err;
+ result &= ~(CORB_PWC_OUTPUT | CORB_PWC_INPUT);
+ result |= value & (CORB_PWC_OUTPUT | CORB_PWC_INPUT);
+ return this->comresp(this, nid,
+ CORB_SET_PIN_WIDGET_CONTROL, result, NULL);
+}
+
u_char
azalia_generic_mixer_from_device_value(const codec_t *this, nid_t nid, int target,
uint32_t dv)
@@ -2362,8 +2356,6 @@ int
azalia_stac9200_mixer_init(codec_t *this)
{
mixer_ctrl_t mc;
- int err;
- uint32_t value;
this->nmixers = sizeof(stac9200_mixer_items) / sizeof(mixer_item_t);
this->mixers = malloc(sizeof(mixer_item_t) * this->nmixers,
@@ -2401,31 +2393,8 @@ azalia_stac9200_mixer_init(codec_t *this)
CORB_SET_UNSOLICITED_RESPONSE,
CORB_UNSOL_ENABLE | STAC9200_EVENT_HP, NULL);
- /* make initial hp vs speaker choice */
+ azalia_stac9200_unsol_event(this, STAC9200_EVENT_HP);
- err = this->comresp(this, STAC9200_NID_HP,
- CORB_GET_PIN_SENSE, 0, &value);
- if (err)
- return err;
- if (value & CORB_PS_PRESENCE) {
- mc.un.ord = 0;
- azalia_generic_mixer_set(this, STAC9200_NID_SPEAKER,
- MI_TARGET_PINCTRL, &mc);
- mc.un.ord = 1;
- azalia_generic_mixer_set(this, STAC9200_NID_HP,
- MI_TARGET_PINCTRL, &mc);
- azalia_generic_mixer_set(this, STAC9200_NID_HP,
- MI_TARGET_PINDIR, &mc);
- } else {
- mc.un.ord = 0;
- azalia_generic_mixer_set(this, STAC9200_NID_HP,
- MI_TARGET_PINCTRL, &mc);
- mc.un.ord = 1;
- azalia_generic_mixer_set(this, STAC9200_NID_SPEAKER,
- MI_TARGET_PINCTRL, &mc);
- azalia_generic_mixer_set(this, STAC9200_NID_SPEAKER,
- MI_TARGET_PINDIR, &mc);
- }
return 0;
}
int
@@ -2433,37 +2402,21 @@ azalia_stac9200_unsol_event(codec_t *this, int tag)
{
int err;
uint32_t value;
- mixer_ctrl_t mc;
switch (tag) {
case STAC9200_EVENT_HP:
err = this->comresp(this, STAC9200_NID_HP,
CORB_GET_PIN_SENSE, 0, &value);
if (err)
- return err;
+ break;
if (value & CORB_PS_PRESENCE) {
DPRINTF(("%s: headphone inserted\n", __func__));
- mc.un.ord = 0; /* disable */
- azalia_generic_mixer_set(this,
- STAC9200_NID_SPEAKER,
- MI_TARGET_PINCTRL, &mc);
- mc.un.ord = 1; /* enable and direction output */
- azalia_generic_mixer_set(this, STAC9200_NID_HP,
- MI_TARGET_PINCTRL, &mc);
- azalia_generic_mixer_set(this, STAC9200_NID_HP,
- MI_TARGET_PINDIR, &mc);
+ azalia_generic_mixer_pinctrl(this,
+ STAC9200_NID_SPEAKER, 0);
} else {
DPRINTF(("%s: headphone pulled\n", __func__));
- mc.un.ord = 0;
- azalia_generic_mixer_set(this, STAC9200_NID_HP,
- MI_TARGET_PINCTRL, &mc);
- mc.un.ord = 1;
- azalia_generic_mixer_set(this,
- STAC9200_NID_SPEAKER,
- MI_TARGET_PINCTRL, &mc);
- azalia_generic_mixer_set(this,
- STAC9200_NID_SPEAKER,
- MI_TARGET_PINDIR, &mc);
+ azalia_generic_mixer_pinctrl(this,
+ STAC9200_NID_SPEAKER, CORB_PWC_OUTPUT);
}
break;
default: