diff options
author | Mauro Carvalho Chehab <mchehab@brturbo.com.br> | 2005-12-01 03:51:34 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-12-01 18:48:57 -0500 |
commit | 6f502b8a7858ecfa7d2a0762f7663b8b3d0808fc (patch) | |
tree | b6f6ef7e9918324136eabb506c37f7b91bd647b2 | |
parent | c87c948ebd75525df4d67dd5b40e6ea81859cc17 (diff) |
[PATCH] V4L: Enables audio DMA setting on cx88 chips, even when dma not in use
- Enabled audio DMA transfer code even when DMA not in use to solve a
problem on some broken cx88 chips.
Signed-off-by: Mauro Carvalho Chehab <mchehab@brturbo.com.br>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r-- | drivers/media/video/cx88/cx88-core.c | 32 | ||||
-rw-r--r-- | drivers/media/video/cx88/cx88-tvaudio.c | 3 | ||||
-rw-r--r-- | drivers/media/video/cx88/cx88.h | 4 |
3 files changed, 39 insertions, 0 deletions
diff --git a/drivers/media/video/cx88/cx88-core.c b/drivers/media/video/cx88/cx88-core.c index b18e7a33081a..bb6eb54e19ce 100644 --- a/drivers/media/video/cx88/cx88-core.c +++ b/drivers/media/video/cx88/cx88-core.c | |||
@@ -837,6 +837,29 @@ static int set_pll(struct cx88_core *core, int prescale, u32 ofreq) | |||
837 | return -1; | 837 | return -1; |
838 | } | 838 | } |
839 | 839 | ||
840 | int cx88_start_audio_dma(struct cx88_core *core) | ||
841 | { | ||
842 | /* setup fifo + format */ | ||
843 | cx88_sram_channel_setup(core, &cx88_sram_channels[SRAM_CH25], 128, 0); | ||
844 | cx88_sram_channel_setup(core, &cx88_sram_channels[SRAM_CH26], 128, 0); | ||
845 | |||
846 | cx_write(MO_AUDD_LNGTH, 128); /* fifo bpl size */ | ||
847 | cx_write(MO_AUDR_LNGTH, 128); /* fifo bpl size */ | ||
848 | |||
849 | /* start dma */ | ||
850 | cx_write(MO_AUD_DMACNTRL, 0x0003); /* Up and Down fifo enable */ | ||
851 | |||
852 | return 0; | ||
853 | } | ||
854 | |||
855 | int cx88_stop_audio_dma(struct cx88_core *core) | ||
856 | { | ||
857 | /* stop dma */ | ||
858 | cx_write(MO_AUD_DMACNTRL, 0x0000); | ||
859 | |||
860 | return 0; | ||
861 | } | ||
862 | |||
840 | static int set_tvaudio(struct cx88_core *core) | 863 | static int set_tvaudio(struct cx88_core *core) |
841 | { | 864 | { |
842 | struct cx88_tvnorm *norm = core->tvnorm; | 865 | struct cx88_tvnorm *norm = core->tvnorm; |
@@ -877,9 +900,16 @@ static int set_tvaudio(struct cx88_core *core) | |||
877 | cx88_set_tvaudio(core); | 900 | cx88_set_tvaudio(core); |
878 | /* cx88_set_stereo(dev,V4L2_TUNER_MODE_STEREO); */ | 901 | /* cx88_set_stereo(dev,V4L2_TUNER_MODE_STEREO); */ |
879 | 902 | ||
903 | /* | ||
904 | This should be needed only on cx88-alsa. It seems that some cx88 chips have | ||
905 | bugs and does require DMA enabled for it to work. | ||
906 | */ | ||
907 | cx88_start_audio_dma(core); | ||
880 | return 0; | 908 | return 0; |
881 | } | 909 | } |
882 | 910 | ||
911 | |||
912 | |||
883 | int cx88_set_tvnorm(struct cx88_core *core, struct cx88_tvnorm *norm) | 913 | int cx88_set_tvnorm(struct cx88_core *core, struct cx88_tvnorm *norm) |
884 | { | 914 | { |
885 | u32 fsc8; | 915 | u32 fsc8; |
@@ -1201,6 +1231,8 @@ EXPORT_SYMBOL(cx88_set_scale); | |||
1201 | EXPORT_SYMBOL(cx88_vdev_init); | 1231 | EXPORT_SYMBOL(cx88_vdev_init); |
1202 | EXPORT_SYMBOL(cx88_core_get); | 1232 | EXPORT_SYMBOL(cx88_core_get); |
1203 | EXPORT_SYMBOL(cx88_core_put); | 1233 | EXPORT_SYMBOL(cx88_core_put); |
1234 | EXPORT_SYMBOL(cx88_start_audio_dma); | ||
1235 | EXPORT_SYMBOL(cx88_stop_audio_dma); | ||
1204 | 1236 | ||
1205 | /* | 1237 | /* |
1206 | * Local variables: | 1238 | * Local variables: |
diff --git a/drivers/media/video/cx88/cx88-tvaudio.c b/drivers/media/video/cx88/cx88-tvaudio.c index a9059c53a418..a1b120c8a9b5 100644 --- a/drivers/media/video/cx88/cx88-tvaudio.c +++ b/drivers/media/video/cx88/cx88-tvaudio.c | |||
@@ -132,7 +132,10 @@ static void set_audio_finish(struct cx88_core *core, u32 ctl) | |||
132 | { | 132 | { |
133 | u32 volume; | 133 | u32 volume; |
134 | 134 | ||
135 | /* restart dma; This avoids buzz in NICAM and is good in others */ | ||
136 | cx88_stop_audio_dma(core); | ||
135 | cx_write(AUD_RATE_THRES_DMD, 0x000000C0); | 137 | cx_write(AUD_RATE_THRES_DMD, 0x000000C0); |
138 | cx88_start_audio_dma(core); | ||
136 | 139 | ||
137 | if (cx88_boards[core->board].blackbird) { | 140 | if (cx88_boards[core->board].blackbird) { |
138 | /* sets sound input from external adc */ | 141 | /* sets sound input from external adc */ |
diff --git a/drivers/media/video/cx88/cx88.h b/drivers/media/video/cx88/cx88.h index b19d3a9e2298..27fb080fd7aa 100644 --- a/drivers/media/video/cx88/cx88.h +++ b/drivers/media/video/cx88/cx88.h | |||
@@ -491,6 +491,10 @@ extern struct cx88_core* cx88_core_get(struct pci_dev *pci); | |||
491 | extern void cx88_core_put(struct cx88_core *core, | 491 | extern void cx88_core_put(struct cx88_core *core, |
492 | struct pci_dev *pci); | 492 | struct pci_dev *pci); |
493 | 493 | ||
494 | extern int cx88_start_audio_dma(struct cx88_core *core); | ||
495 | extern int cx88_stop_audio_dma(struct cx88_core *core); | ||
496 | |||
497 | |||
494 | /* ----------------------------------------------------------- */ | 498 | /* ----------------------------------------------------------- */ |
495 | /* cx88-vbi.c */ | 499 | /* cx88-vbi.c */ |
496 | 500 | ||