summaryrefslogtreecommitdiff
path: root/linux/drivers/media/video
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <mchehab@redhat.com>2008-11-19 09:22:28 -0200
committerMauro Carvalho Chehab <mchehab@redhat.com>2008-11-19 09:22:28 -0200
commit89163963726ca703e129cb9c2e38206d1f8a2cb4 (patch)
tree30cee85819e1c0d09a1462f1700d04fd57b1e3e4 /linux/drivers/media/video
parent62b145c464b403e8ca5d1e17af30367298d5c6a0 (diff)
downloadmediapointer-dvb-s2-89163963726ca703e129cb9c2e38206d1f8a2cb4.tar.gz
mediapointer-dvb-s2-89163963726ca703e129cb9c2e38206d1f8a2cb4.tar.bz2
Make use of the em28xx chip configuration register to determine whether
From: Devin Heitmueller <devin.heitmueller@gmail.com> we have AC97 audio, I2S audio, or no audio support at all. Thanks for Ray Lu from Empia for providing the em2860/em2880 datasheet. Signed-off-by: Devin Heitmueller <devin.heitmueller@gmail.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'linux/drivers/media/video')
-rw-r--r--linux/drivers/media/video/em28xx/em28xx-reg.h10
-rw-r--r--linux/drivers/media/video/em28xx/em28xx-video.c35
-rw-r--r--linux/drivers/media/video/em28xx/em28xx.h8
3 files changed, 52 insertions, 1 deletions
diff --git a/linux/drivers/media/video/em28xx/em28xx-reg.h b/linux/drivers/media/video/em28xx/em28xx-reg.h
index 491d66abe..12c9132b0 100644
--- a/linux/drivers/media/video/em28xx/em28xx-reg.h
+++ b/linux/drivers/media/video/em28xx/em28xx-reg.h
@@ -17,6 +17,16 @@
/* em28xx registers */
+#define EM28XX_R00_CHIPCFG 0x00
+
+/* em28xx Chip Configuration 0x00 */
+#define EM28XX_CHIPCFG_VENDOR_AUDIO 0x80
+#define EM28XX_CHIPCFG_I2S_VOLUME_CAPABLE 0x40
+#define EM28XX_CHIPCFG_I2S_3_SAMPRATES 0x30
+#define EM28XX_CHIPCFG_I2S_5_SAMPRATES 0x20
+#define EM28XX_CHIPCFG_AC97 0x10
+#define EM28XX_CHIPCFG_AUDIOMASK 0x30
+
/* GPIO/GPO registers */
#define EM2880_R04_GPO 0x04 /* em2880-em2883 only */
#define EM28XX_R08_GPIO 0x08 /* em2820 or upper */
diff --git a/linux/drivers/media/video/em28xx/em28xx-video.c b/linux/drivers/media/video/em28xx/em28xx-video.c
index 70d0bd086..d406fc224 100644
--- a/linux/drivers/media/video/em28xx/em28xx-video.c
+++ b/linux/drivers/media/video/em28xx/em28xx-video.c
@@ -1990,16 +1990,49 @@ static struct video_device *em28xx_vdev_init(struct em28xx *dev,
int em28xx_supports_audio_extension(struct em28xx *dev)
{
+ int rc;
+
/* The chip dictates whether we support the Empia analog audio
extension */
switch (dev->chip_id) {
case CHIP_ID_EM2874:
- /* Either a digital-only device or provides AC97 audio */
+ /* Digital only device - no analog support */
+ dev->audio_mode = EM28XX_NO_AUDIO;
return 0;
+ case CHIP_ID_EM2860:
case CHIP_ID_EM2883:
default:
+ /* See how this device is configured */
+ rc = em28xx_read_reg(dev, EM28XX_R00_CHIPCFG);
+ if (rc & EM28XX_CHIPCFG_VENDOR_AUDIO) {
+ switch(rc & EM28XX_CHIPCFG_AUDIOMASK) {
+ case EM28XX_CHIPCFG_AC97:
+ em28xx_info("AC97 audio (5 sample rates)\n");
+ dev->audio_mode = EM28XX_AC97;
+ break;
+ case EM28XX_CHIPCFG_I2S_3_SAMPRATES:
+ em28xx_info("I2S Audio (3 sample rates)\n");
+ dev->audio_mode = EM28XX_I2S_3_SAMPLE_RATES;
+ break;
+ case EM28XX_CHIPCFG_I2S_5_SAMPRATES:
+ em28xx_info("I2S Audio (5 sample rates)\n");
+ dev->audio_mode = EM28XX_I2S_5_SAMPLE_RATES;
+ break;
+ default:
+ em28xx_info("No audio support detected\n");
+ dev->audio_mode = EM28XX_NO_AUDIO;
+ return 0;
+ }
+ } else {
+ em28xx_info("USB Audio class device\n");
+ return 0;
+ }
+ /* The em28xx audio extension needs to be loaded */
return 1;
}
+
+ /* We should never reach this point */
+ return 0;
}
/*
diff --git a/linux/drivers/media/video/em28xx/em28xx.h b/linux/drivers/media/video/em28xx/em28xx.h
index 2ef7d0224..d272598c9 100644
--- a/linux/drivers/media/video/em28xx/em28xx.h
+++ b/linux/drivers/media/video/em28xx/em28xx.h
@@ -257,6 +257,13 @@ enum enum28xx_itype {
EM28XX_RADIO,
};
+enum em28xx_audio_mode {
+ EM28XX_NO_AUDIO,
+ EM28XX_I2S_3_SAMPLE_RATES,
+ EM28XX_I2S_5_SAMPLE_RATES,
+ EM28XX_AC97,
+};
+
enum em28xx_amux {
EM28XX_AMUX_VIDEO,
EM28XX_AMUX_LINE_IN,
@@ -412,6 +419,7 @@ struct em28xx {
u32 i2s_speed; /* I2S speed for audio digital stream */
enum em28xx_decoder decoder;
+ enum em28xx_audio_mode audio_mode;
int tuner_type; /* type of the tuner */
int tuner_addr; /* tuner address */