[PATCH] v4l: 720: alsa support for saa7134 that should work wonderful

- Alsa support for saa7134 that should work.

Signed-off-by: Ricardo Cerqueira <v4l@cerqueira.org>
Signed-off-by: Nickolay V. Shmyrev <nshmyrev@yandex.ru>
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>
This commit is contained in:
Ricardo Cerqueira 2005-11-08 21:37:11 -08:00 committed by Linus Torvalds
parent 2f8d4f5139
commit bd15eba3a0
5 changed files with 756 additions and 442 deletions

File diff suppressed because it is too large Load Diff

View File

@ -57,6 +57,10 @@ static unsigned int oss = 0;
module_param(oss, int, 0444); module_param(oss, int, 0444);
MODULE_PARM_DESC(oss,"register oss devices (default: no)"); MODULE_PARM_DESC(oss,"register oss devices (default: no)");
static unsigned int alsa = 0;
module_param(alsa, int, 0444);
MODULE_PARM_DESC(alsa,"register alsa devices (default: no)");
static unsigned int latency = UNSET; static unsigned int latency = UNSET;
module_param(latency, int, 0444); module_param(latency, int, 0444);
MODULE_PARM_DESC(latency,"pci latency timer"); MODULE_PARM_DESC(latency,"pci latency timer");
@ -591,13 +595,19 @@ static irqreturn_t saa7134_irq(int irq, void *dev_id, struct pt_regs *regs)
card_has_mpeg(dev)) card_has_mpeg(dev))
saa7134_irq_ts_done(dev,status); saa7134_irq_ts_done(dev,status);
if ((report & SAA7134_IRQ_REPORT_DONE_RA3)) if ((report & SAA7134_IRQ_REPORT_DONE_RA3)) {
saa7134_irq_oss_done(dev,status); if (oss) {
saa7134_irq_oss_done(dev,status);
} else if (alsa) {
saa7134_irq_alsa_done(dev,status);
}
}
if ((report & (SAA7134_IRQ_REPORT_GPIO16 | if ((report & (SAA7134_IRQ_REPORT_GPIO16 |
SAA7134_IRQ_REPORT_GPIO18)) && SAA7134_IRQ_REPORT_GPIO18)) &&
dev->remote) dev->remote)
saa7134_input_irq(dev); saa7134_input_irq(dev);
} }
if (10 == loop) { if (10 == loop) {
@ -1016,6 +1026,10 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev,
goto fail5; goto fail5;
printk(KERN_INFO "%s: registered device mixer%d\n", printk(KERN_INFO "%s: registered device mixer%d\n",
dev->name,dev->oss.minor_mixer >> 4); dev->name,dev->oss.minor_mixer >> 4);
} else if (alsa) {
alsa_card_saa7134_create(dev);
printk(KERN_INFO "%s: registered ALSA devices\n",
dev->name);
} }
break; break;
} }
@ -1043,6 +1057,8 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev,
case PCI_DEVICE_ID_PHILIPS_SAA7135: case PCI_DEVICE_ID_PHILIPS_SAA7135:
if (oss) if (oss)
unregister_sound_dsp(dev->oss.minor_dsp); unregister_sound_dsp(dev->oss.minor_dsp);
else if (alsa)
alsa_card_saa7134_exit();
break; break;
} }
fail4: fail4:
@ -1102,7 +1118,8 @@ static void __devexit saa7134_finidev(struct pci_dev *pci_dev)
if (oss) { if (oss) {
unregister_sound_mixer(dev->oss.minor_mixer); unregister_sound_mixer(dev->oss.minor_mixer);
unregister_sound_dsp(dev->oss.minor_dsp); unregister_sound_dsp(dev->oss.minor_dsp);
} } else if (alsa)
alsa_card_saa7134_exit();
break; break;
} }
saa7134_unregister_video(dev); saa7134_unregister_video(dev);

View File

@ -44,6 +44,7 @@ MODULE_PARM_DESC(oss_rate,"sample rate (valid are: 32000,48000)");
#define dprintk(fmt, arg...) if (oss_debug) \ #define dprintk(fmt, arg...) if (oss_debug) \
printk(KERN_DEBUG "%s/oss: " fmt, dev->name , ## arg) printk(KERN_DEBUG "%s/oss: " fmt, dev->name , ## arg)
/* ------------------------------------------------------------------ */ /* ------------------------------------------------------------------ */
static int dsp_buffer_conf(struct saa7134_dev *dev, int blksize, int blocks) static int dsp_buffer_conf(struct saa7134_dev *dev, int blksize, int blocks)
@ -173,8 +174,8 @@ static int dsp_rec_start(struct saa7134_dev *dev)
fmt |= (2 << 4); fmt |= (2 << 4);
if (!sign) if (!sign)
fmt |= 0x04; fmt |= 0x04;
saa_writel(0x588 >> 2, dev->oss.blksize -4); saa_writel(SAA7133_NUM_SAMPLES, dev->oss.blksize -4);
saa_writel(0x58c >> 2, 0x543210 | (fmt << 24)); saa_writel(SAA7133_AUDIO_CHANNEL, 0x543210 | (fmt << 24));
break; break;
} }
dprintk("rec_start: afmt=%d ch=%d => fmt=0x%x swap=%c\n", dprintk("rec_start: afmt=%d ch=%d => fmt=0x%x swap=%c\n",

View File

@ -43,6 +43,14 @@
#define SAA7134_FIFO_SIZE (0x2a0 >> 2) #define SAA7134_FIFO_SIZE (0x2a0 >> 2)
#define SAA7134_THRESHOULD (0x2a4 >> 2) #define SAA7134_THRESHOULD (0x2a4 >> 2)
#define SAA7133_NUM_SAMPLES (0x588 >> 2)
#define SAA7133_AUDIO_CHANNEL (0x58c >> 2)
#define SAA7133_AUDIO_FORMAT (0x58f >> 2)
#define SAA7133_DIGITAL_OUTPUT_SEL1 (0x46c >> 2)
#define SAA7133_DIGITAL_OUTPUT_SEL2 (0x470 >> 2)
#define SAA7133_DIGITAL_INPUT_XBAR1 (0x464 >> 2)
#define SAA7133_ANALOG_IO_SELECT (0x594 >> 2)
/* main control */ /* main control */
#define SAA7134_MAIN_CTRL (0x2a8 >> 2) #define SAA7134_MAIN_CTRL (0x2a8 >> 2)
#define SAA7134_MAIN_CTRL_VPLLE (1 << 15) #define SAA7134_MAIN_CTRL_VPLLE (1 << 15)

View File

@ -45,6 +45,10 @@
#endif #endif
#define UNSET (-1U) #define UNSET (-1U)
#include <sound/driver.h>
#include <sound/core.h>
#include <sound/pcm.h>
/* ----------------------------------------------------------- */ /* ----------------------------------------------------------- */
/* enums */ /* enums */
@ -364,6 +368,7 @@ struct saa7134_oss {
unsigned int dma_blk; unsigned int dma_blk;
unsigned int read_offset; unsigned int read_offset;
unsigned int read_count; unsigned int read_count;
snd_pcm_substream_t *substream;
}; };
/* IR input */ /* IR input */
@ -644,6 +649,11 @@ int saa7134_input_init1(struct saa7134_dev *dev);
void saa7134_input_fini(struct saa7134_dev *dev); void saa7134_input_fini(struct saa7134_dev *dev);
void saa7134_input_irq(struct saa7134_dev *dev); void saa7134_input_irq(struct saa7134_dev *dev);
int alsa_card_saa7134_create(struct saa7134_dev *saadev);
void alsa_card_saa7134_exit(void);
void saa7134_irq_alsa_done(struct saa7134_dev *dev, unsigned long status);
/* /*
* Local variables: * Local variables:
* c-basic-offset: 8 * c-basic-offset: 8