summaryrefslogtreecommitdiff
path: root/linux/drivers/media/video/cx88/cx88-tvaudio.c
diff options
context:
space:
mode:
Diffstat (limited to 'linux/drivers/media/video/cx88/cx88-tvaudio.c')
-rw-r--r--linux/drivers/media/video/cx88/cx88-tvaudio.c38
1 files changed, 28 insertions, 10 deletions
diff --git a/linux/drivers/media/video/cx88/cx88-tvaudio.c b/linux/drivers/media/video/cx88/cx88-tvaudio.c
index 4931667f3..a53db7a39 100644
--- a/linux/drivers/media/video/cx88/cx88-tvaudio.c
+++ b/linux/drivers/media/video/cx88/cx88-tvaudio.c
@@ -1,5 +1,5 @@
/*
- $Id: cx88-tvaudio.c,v 1.30 2005/02/10 12:40:39 kraxel Exp $
+ $Id: cx88-tvaudio.c,v 1.31 2005/02/14 16:30:26 kraxel Exp $
cx88x-audio.c - Conexant CX23880/23881 audio downstream driver driver
@@ -57,7 +57,7 @@
#include "cx88.h"
-static unsigned int audio_debug = 1;
+static unsigned int audio_debug = 0;
module_param(audio_debug,int,0644);
MODULE_PARM_DESC(audio_debug,"enable debug messages [audio]");
@@ -785,6 +785,19 @@ void cx88_set_tvaudio(struct cx88_core *core)
return;
}
+void cx88_newstation(struct cx88_core *core)
+{
+ core->audiomode_manual = UNSET;
+
+ switch (core->tvaudio) {
+ case WW_SYSTEM_L_AM:
+ /* try nicam ... */
+ core->audiomode_current = V4L2_TUNER_MODE_STEREO;
+ set_audio_standard_NICAM_L(core, 1);
+ break;
+ }
+}
+
void cx88_get_stereo(struct cx88_core *core, struct v4l2_tuner *t)
{
static char *m[] = {"stereo", "dual mono", "mono", "sap"};
@@ -832,12 +845,16 @@ void cx88_get_stereo(struct cx88_core *core, struct v4l2_tuner *t)
}
break;
case WW_NICAM_BGDKL:
- if (0 == mode)
+ if (0 == mode) {
t->audmode = V4L2_TUNER_MODE_STEREO;
+ t->rxsubchans |= V4L2_TUNER_SUB_STEREO;
+ }
break;
case WW_SYSTEM_L_AM:
- if (0x0 == mode)
+ if (0x0 == mode && (cx_read(AUD_INIT) & 0x04)) {
t->audmode = V4L2_TUNER_MODE_STEREO;
+ t->rxsubchans |= V4L2_TUNER_SUB_STEREO;
+ }
break ;
default:
/* nothing */
@@ -852,11 +869,12 @@ void cx88_set_stereo(struct cx88_core *core, u32 mode, int manual)
u32 mask = UNSET;
if (manual) {
- core->audiomode = mode;
+ core->audiomode_manual = mode;
} else {
- if (UNSET != core->audiomode)
+ if (UNSET != core->audiomode_manual)
return;
}
+ core->audiomode_current = mode;
switch (core->tvaudio) {
case WW_BTSC:
@@ -959,7 +977,7 @@ int cx88_audio_thread(void *data)
{
struct cx88_core *core = data;
struct v4l2_tuner t;
- u32 mode = 0, lastmode = 0;
+ u32 mode = 0;
dprintk("cx88: tvaudio thread started\n");
for (;;) {
@@ -971,7 +989,7 @@ int cx88_audio_thread(void *data)
memset(&t,0,sizeof(t));
cx88_get_stereo(core,&t);
- if (UNSET == core->audiomode)
+ if (UNSET != core->audiomode_manual)
/* manually set, don't do anything. */
continue;
@@ -980,11 +998,10 @@ int cx88_audio_thread(void *data)
mode = V4L2_TUNER_MODE_STEREO;
else
mode = V4L2_TUNER_MODE_MONO;
- if (mode == lastmode)
+ if (mode == core->audiomode_current)
continue;
/* automatically switch to best available mode */
- lastmode = mode;
cx88_set_stereo(core, mode, 0);
}
@@ -995,6 +1012,7 @@ int cx88_audio_thread(void *data)
/* ----------------------------------------------------------- */
EXPORT_SYMBOL(cx88_set_tvaudio);
+EXPORT_SYMBOL(cx88_newstation);
EXPORT_SYMBOL(cx88_set_stereo);
EXPORT_SYMBOL(cx88_get_stereo);
EXPORT_SYMBOL(cx88_audio_thread);