diff options
author | Alexandre Ratchov <ratchov@cvs.openbsd.org> | 2019-04-30 20:17:13 +0000 |
---|---|---|
committer | Alexandre Ratchov <ratchov@cvs.openbsd.org> | 2019-04-30 20:17:13 +0000 |
commit | 8f7d5f2507b803eae10be9db0e3fd4ba68458e99 (patch) | |
tree | 3a9807befbbcbae3c5451e9938b08b9d26b2523b /sys | |
parent | e902a7ef15bd02a63407fd02e3f1e8395a47f718 (diff) |
Enable EnvyHT-specific sample rates (above 96kHz) on the host controller.
Tests and help from Andrey Oktyabrskiy <ano at bestmx.net>. Thanks.
Diffstat (limited to 'sys')
-rw-r--r-- | sys/dev/pci/envy.c | 23 | ||||
-rw-r--r-- | sys/dev/pci/envyreg.h | 4 |
2 files changed, 24 insertions, 3 deletions
diff --git a/sys/dev/pci/envy.c b/sys/dev/pci/envy.c index aae043798c6..75e010a79e9 100644 --- a/sys/dev/pci/envy.c +++ b/sys/dev/pci/envy.c @@ -1,4 +1,4 @@ -/* $OpenBSD: envy.c,v 1.73 2018/09/03 05:37:32 miko Exp $ */ +/* $OpenBSD: envy.c,v 1.74 2019/04/30 20:17:12 ratchov Exp $ */ /* * Copyright (c) 2007 Alexandre Ratchov <alex@caoua.org> * @@ -226,7 +226,9 @@ struct { } envy_rates[] = { { 8000, 0x6}, { 9600, 0x3}, {11025, 0xa}, {12000, 2}, {16000, 5}, {22050, 0x9}, {24000, 0x1}, {32000, 0x4}, {44100, 8}, {48000, 0}, - {64000, 0xf}, {88200, 0xb}, {96000, 0x7}, {-1, -1} + {64000, 0xf}, {88200, 0xb}, {96000, 0x7}, + {176400, 0xc}, {192000, 0xe}, + {-1, -1} }; /* @@ -1849,7 +1851,13 @@ envy_set_params(void *self, int setmode, int usemode, DPRINTF("%s: play/rec rates mismatch\n", DEVNAME(sc)); r->sample_rate = p->sample_rate; } + rate = (setmode & AUMODE_PLAY) ? p->sample_rate : r->sample_rate; + + /* only HT model supports rates above 96kHz */ + if (!sc->isht && rate > 96000) + rate = 96000; + for (i = 0; envy_rates[i].rate < rate; i++) { if (envy_rates[i].rate == -1) { i--; @@ -1857,10 +1865,21 @@ envy_set_params(void *self, int setmode, int usemode, break; } } + + if (sc->isht) { + reg = envy_mt_read_1(sc, ENVY_MT_FMT); + if (rate > 96000) + reg |= ENVY_MT_FMT_128X; + else + reg &= ~ENVY_MT_FMT_128X; + envy_mt_write_1(sc, ENVY_MT_FMT, reg); + } + reg = envy_mt_read_1(sc, ENVY_MT_RATE); reg &= ~ENVY_MT_RATEMASK; reg |= envy_rates[i].reg; envy_mt_write_1(sc, ENVY_MT_RATE, reg); + if (setmode & AUMODE_PLAY) { p->sample_rate = envy_rates[i].rate; p->encoding = AUDIO_ENCODING_SLINEAR_LE; diff --git a/sys/dev/pci/envyreg.h b/sys/dev/pci/envyreg.h index be1a40760c2..a3af70e68c0 100644 --- a/sys/dev/pci/envyreg.h +++ b/sys/dev/pci/envyreg.h @@ -1,4 +1,4 @@ -/* $OpenBSD: envyreg.h,v 1.17 2011/04/27 07:01:33 ratchov Exp $ */ +/* $OpenBSD: envyreg.h,v 1.18 2019/04/30 20:17:12 ratchov Exp $ */ /* * Copyright (c) 2007 Alexandre Ratchov <alex@caoua.org> * @@ -114,6 +114,8 @@ #define ENVY_MT_INTR_RMASK 0x80 /* !HT only */ #define ENVY_MT_RATE 1 #define ENVY_MT_RATEMASK 0x0f +#define ENVY_MT_FMT 2 +#define ENVY_MT_FMT_128X 0x08 /* HT only */ #define ENVY_MT_IMASK 3 /* HT only */ #define ENVY_MT_IMASK_PDMA0 0x1 #define ENVY_MT_IMASK_RDMA0 0x2 |