aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDevin Heitmueller <devin.heitmueller@gmail.com>2008-11-19 06:22:28 -0500
committerMauro Carvalho Chehab <mchehab@redhat.com>2008-12-29 14:53:35 -0500
commit5c2231c84304563fd5d28e8bbb72e09e882a8e32 (patch)
tree7cb20b4e39b1c9f4c41141a33e485e06651117a6
parent67c96f67060abfe595974a77aeb4ce7815893648 (diff)
V4L/DVB (9648): em28xx: get audio config from em28xx register
Make use of the em28xx chip configuration register to determine whether 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>
-rw-r--r--drivers/media/video/em28xx/em28xx-reg.h10
-rw-r--r--drivers/media/video/em28xx/em28xx-video.c35
-rw-r--r--drivers/media/video/em28xx/em28xx.h8
3 files changed, 52 insertions, 1 deletions
diff --git a/drivers/media/video/em28xx/em28xx-reg.h b/drivers/media/video/em28xx/em28xx-reg.h
index 491d66abe7f7..12c9132b099e 100644
--- a/drivers/media/video/em28xx/em28xx-reg.h
+++ b/drivers/media/video/em28xx/em28xx-reg.h
@@ -17,6 +17,16 @@
17 17
18/* em28xx registers */ 18/* em28xx registers */
19 19
20#define EM28XX_R00_CHIPCFG 0x00
21
22/* em28xx Chip Configuration 0x00 */
23#define EM28XX_CHIPCFG_VENDOR_AUDIO 0x80
24#define EM28XX_CHIPCFG_I2S_VOLUME_CAPABLE 0x40
25#define EM28XX_CHIPCFG_I2S_3_SAMPRATES 0x30
26#define EM28XX_CHIPCFG_I2S_5_SAMPRATES 0x20
27#define EM28XX_CHIPCFG_AC97 0x10
28#define EM28XX_CHIPCFG_AUDIOMASK 0x30
29
20 /* GPIO/GPO registers */ 30 /* GPIO/GPO registers */
21#define EM2880_R04_GPO 0x04 /* em2880-em2883 only */ 31#define EM2880_R04_GPO 0x04 /* em2880-em2883 only */
22#define EM28XX_R08_GPIO 0x08 /* em2820 or upper */ 32#define EM28XX_R08_GPIO 0x08 /* em2820 or upper */
diff --git a/drivers/media/video/em28xx/em28xx-video.c b/drivers/media/video/em28xx/em28xx-video.c
index 154a99c61ee6..1e26061116ea 100644
--- a/drivers/media/video/em28xx/em28xx-video.c
+++ b/drivers/media/video/em28xx/em28xx-video.c
@@ -1933,16 +1933,49 @@ static struct video_device *em28xx_vdev_init(struct em28xx *dev,
1933 1933
1934int em28xx_supports_audio_extension(struct em28xx *dev) 1934int em28xx_supports_audio_extension(struct em28xx *dev)
1935{ 1935{
1936 int rc;
1937
1936 /* The chip dictates whether we support the Empia analog audio 1938 /* The chip dictates whether we support the Empia analog audio
1937 extension */ 1939 extension */
1938 switch (dev->chip_id) { 1940 switch (dev->chip_id) {
1939 case CHIP_ID_EM2874: 1941 case CHIP_ID_EM2874:
1940 /* Either a digital-only device or provides AC97 audio */ 1942 /* Digital only device - no analog support */
1943 dev->audio_mode = EM28XX_NO_AUDIO;
1941 return 0; 1944 return 0;
1945 case CHIP_ID_EM2860:
1942 case CHIP_ID_EM2883: 1946 case CHIP_ID_EM2883:
1943 default: 1947 default:
1948 /* See how this device is configured */
1949 rc = em28xx_read_reg(dev, EM28XX_R00_CHIPCFG);
1950 if (rc & EM28XX_CHIPCFG_VENDOR_AUDIO) {
1951 switch(rc & EM28XX_CHIPCFG_AUDIOMASK) {
1952 case EM28XX_CHIPCFG_AC97:
1953 em28xx_info("AC97 audio (5 sample rates)\n");
1954 dev->audio_mode = EM28XX_AC97;
1955 break;
1956 case EM28XX_CHIPCFG_I2S_3_SAMPRATES:
1957 em28xx_info("I2S Audio (3 sample rates)\n");
1958 dev->audio_mode = EM28XX_I2S_3_SAMPLE_RATES;
1959 break;
1960 case EM28XX_CHIPCFG_I2S_5_SAMPRATES:
1961 em28xx_info("I2S Audio (5 sample rates)\n");
1962 dev->audio_mode = EM28XX_I2S_5_SAMPLE_RATES;
1963 break;
1964 default:
1965 em28xx_info("No audio support detected\n");
1966 dev->audio_mode = EM28XX_NO_AUDIO;
1967 return 0;
1968 }
1969 } else {
1970 em28xx_info("USB Audio class device\n");
1971 return 0;
1972 }
1973 /* The em28xx audio extension needs to be loaded */
1944 return 1; 1974 return 1;
1945 } 1975 }
1976
1977 /* We should never reach this point */
1978 return 0;
1946} 1979}
1947 1980
1948static int register_analog_devices(struct em28xx *dev) 1981static int register_analog_devices(struct em28xx *dev)
diff --git a/drivers/media/video/em28xx/em28xx.h b/drivers/media/video/em28xx/em28xx.h
index 3152d00e548b..f47c8d34ec79 100644
--- a/drivers/media/video/em28xx/em28xx.h
+++ b/drivers/media/video/em28xx/em28xx.h
@@ -256,6 +256,13 @@ enum enum28xx_itype {
256 EM28XX_RADIO, 256 EM28XX_RADIO,
257}; 257};
258 258
259enum em28xx_audio_mode {
260 EM28XX_NO_AUDIO,
261 EM28XX_I2S_3_SAMPLE_RATES,
262 EM28XX_I2S_5_SAMPLE_RATES,
263 EM28XX_AC97,
264};
265
259enum em28xx_amux { 266enum em28xx_amux {
260 EM28XX_AMUX_VIDEO, 267 EM28XX_AMUX_VIDEO,
261 EM28XX_AMUX_LINE_IN, 268 EM28XX_AMUX_LINE_IN,
@@ -403,6 +410,7 @@ struct em28xx {
403 u32 i2s_speed; /* I2S speed for audio digital stream */ 410 u32 i2s_speed; /* I2S speed for audio digital stream */
404 411
405 enum em28xx_decoder decoder; 412 enum em28xx_decoder decoder;
413 enum em28xx_audio_mode audio_mode;
406 414
407 int tuner_type; /* type of the tuner */ 415 int tuner_type; /* type of the tuner */
408 int tuner_addr; /* tuner address */ 416 int tuner_addr; /* tuner address */