diff options
author | Ricardo Cerqueira <v4l@cerqueira.org> | 2005-11-13 19:08:00 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-11-13 21:14:19 -0500 |
commit | 4aabf6331f89c18a46e7f083ca0b27f15ca85422 (patch) | |
tree | 2a512246717df6fb37f6dd6c3444972b43aea51b /drivers/media/video | |
parent | 714a095abfa22dfe2accf641118a65796e966a98 (diff) |
[PATCH] v4l: (951) Make saa7134-oss as a stand-alone module
- saa7134-oss is now a standalone module as well
- remaining DMA sound code has been removed from core the module
- Lots of small cleanups and variable renames to get more consistency
between the OSS and ALSA drivers
- Fixed saa7134-alsa spinlock bug
- Added missing #include in saa7134-oss
Signed-off-by: Ricardo Cerqueira <v4l@cerqueira.org>
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>
Diffstat (limited to 'drivers/media/video')
-rw-r--r-- | drivers/media/video/saa7134/Makefile | 7 | ||||
-rw-r--r-- | drivers/media/video/saa7134/saa7134-alsa.c | 130 | ||||
-rw-r--r-- | drivers/media/video/saa7134/saa7134-core.c | 118 | ||||
-rw-r--r-- | drivers/media/video/saa7134/saa7134-oss.c | 161 | ||||
-rw-r--r-- | drivers/media/video/saa7134/saa7134.h | 1 |
5 files changed, 250 insertions, 167 deletions
diff --git a/drivers/media/video/saa7134/Makefile b/drivers/media/video/saa7134/Makefile index e0b28f0533af..4226b61cc613 100644 --- a/drivers/media/video/saa7134/Makefile +++ b/drivers/media/video/saa7134/Makefile | |||
@@ -1,10 +1,11 @@ | |||
1 | 1 | ||
2 | saa7134-objs := saa7134-cards.o saa7134-core.o saa7134-i2c.o \ | 2 | saa7134-objs := saa7134-cards.o saa7134-core.o saa7134-i2c.o \ |
3 | saa7134-oss.o saa7134-ts.o saa7134-tvaudio.o \ | 3 | saa7134-ts.o saa7134-tvaudio.o saa7134-vbi.o \ |
4 | saa7134-vbi.o saa7134-video.o saa7134-input.o | 4 | saa7134-video.o saa7134-input.o |
5 | 5 | ||
6 | obj-$(CONFIG_VIDEO_SAA7134) += saa7134.o saa7134-empress.o \ | 6 | obj-$(CONFIG_VIDEO_SAA7134) += saa7134.o saa7134-empress.o \ |
7 | saa6752hs.o saa7134-alsa.o | 7 | saa6752hs.o saa7134-alsa.o \ |
8 | saa7134-oss.o | ||
8 | obj-$(CONFIG_VIDEO_SAA7134_DVB) += saa7134-dvb.o | 9 | obj-$(CONFIG_VIDEO_SAA7134_DVB) += saa7134-dvb.o |
9 | 10 | ||
10 | EXTRA_CFLAGS += -I$(src)/.. | 11 | EXTRA_CFLAGS += -I$(src)/.. |
diff --git a/drivers/media/video/saa7134/saa7134-alsa.c b/drivers/media/video/saa7134/saa7134-alsa.c index 0025191f616a..289ca3ac99b2 100644 --- a/drivers/media/video/saa7134/saa7134-alsa.c +++ b/drivers/media/video/saa7134/saa7134-alsa.c | |||
@@ -71,7 +71,7 @@ typedef struct snd_card_saa7134 { | |||
71 | int mixer_volume[MIXER_ADDR_LAST+1][2]; | 71 | int mixer_volume[MIXER_ADDR_LAST+1][2]; |
72 | int capture_source[MIXER_ADDR_LAST+1][2]; | 72 | int capture_source[MIXER_ADDR_LAST+1][2]; |
73 | struct pci_dev *pci; | 73 | struct pci_dev *pci; |
74 | struct saa7134_dev *saadev; | 74 | struct saa7134_dev *dev; |
75 | 75 | ||
76 | unsigned long iobase; | 76 | unsigned long iobase; |
77 | int irq; | 77 | int irq; |
@@ -86,12 +86,10 @@ typedef struct snd_card_saa7134 { | |||
86 | */ | 86 | */ |
87 | 87 | ||
88 | typedef struct snd_card_saa7134_pcm { | 88 | typedef struct snd_card_saa7134_pcm { |
89 | struct saa7134_dev *saadev; | 89 | struct saa7134_dev *dev; |
90 | 90 | ||
91 | spinlock_t lock; | 91 | spinlock_t lock; |
92 | unsigned int pcm_size; /* buffer size */ | 92 | |
93 | unsigned int pcm_count; /* bytes per period */ | ||
94 | unsigned int pcm_bps; /* bytes per second */ | ||
95 | snd_pcm_substream_t *substream; | 93 | snd_pcm_substream_t *substream; |
96 | } snd_card_saa7134_pcm_t; | 94 | } snd_card_saa7134_pcm_t; |
97 | 95 | ||
@@ -193,6 +191,7 @@ void saa7134_irq_alsa_done(struct saa7134_dev *dev, unsigned long status) | |||
193 | snd_pcm_period_elapsed(dev->dmasound.substream); | 191 | snd_pcm_period_elapsed(dev->dmasound.substream); |
194 | spin_lock(&dev->slock); | 192 | spin_lock(&dev->slock); |
195 | } | 193 | } |
194 | |||
196 | done: | 195 | done: |
197 | spin_unlock(&dev->slock); | 196 | spin_unlock(&dev->slock); |
198 | 197 | ||
@@ -208,8 +207,9 @@ void saa7134_irq_alsa_done(struct saa7134_dev *dev, unsigned long status) | |||
208 | 207 | ||
209 | static irqreturn_t saa7134_alsa_irq(int irq, void *dev_id, struct pt_regs *regs) | 208 | static irqreturn_t saa7134_alsa_irq(int irq, void *dev_id, struct pt_regs *regs) |
210 | { | 209 | { |
211 | snd_card_saa7134_t *saa7134 = dev_id; | 210 | struct saa7134_dmasound *dmasound = dev_id; |
212 | struct saa7134_dev *dev = saa7134->saadev; | 211 | struct saa7134_dev *dev = dmasound->priv_data; |
212 | |||
213 | unsigned long report, status; | 213 | unsigned long report, status; |
214 | int loop, handled = 0; | 214 | int loop, handled = 0; |
215 | 215 | ||
@@ -248,8 +248,8 @@ static int snd_card_saa7134_capture_trigger(snd_pcm_substream_t * substream, | |||
248 | int cmd) | 248 | int cmd) |
249 | { | 249 | { |
250 | snd_pcm_runtime_t *runtime = substream->runtime; | 250 | snd_pcm_runtime_t *runtime = substream->runtime; |
251 | snd_card_saa7134_pcm_t *saapcm = runtime->private_data; | 251 | snd_card_saa7134_pcm_t *pcm = runtime->private_data; |
252 | struct saa7134_dev *dev=saapcm->saadev; | 252 | struct saa7134_dev *dev=pcm->dev; |
253 | int err = 0; | 253 | int err = 0; |
254 | 254 | ||
255 | spin_lock_irq(&dev->slock); | 255 | spin_lock_irq(&dev->slock); |
@@ -315,8 +315,8 @@ static int dsp_buffer_init(struct saa7134_dev *dev) | |||
315 | { | 315 | { |
316 | int err; | 316 | int err; |
317 | 317 | ||
318 | if (!dev->dmasound.bufsize) | 318 | BUG_ON(!dev->dmasound.bufsize); |
319 | BUG(); | 319 | |
320 | videobuf_dma_init(&dev->dmasound.dma); | 320 | videobuf_dma_init(&dev->dmasound.dma); |
321 | err = videobuf_dma_init_kernel(&dev->dmasound.dma, PCI_DMA_FROMDEVICE, | 321 | err = videobuf_dma_init_kernel(&dev->dmasound.dma, PCI_DMA_FROMDEVICE, |
322 | (dev->dmasound.bufsize + PAGE_SIZE) >> PAGE_SHIFT); | 322 | (dev->dmasound.bufsize + PAGE_SIZE) >> PAGE_SHIFT); |
@@ -344,28 +344,18 @@ static int snd_card_saa7134_capture_prepare(snd_pcm_substream_t * substream) | |||
344 | u32 fmt, control; | 344 | u32 fmt, control; |
345 | snd_card_saa7134_t *saa7134 = snd_pcm_substream_chip(substream); | 345 | snd_card_saa7134_t *saa7134 = snd_pcm_substream_chip(substream); |
346 | struct saa7134_dev *dev; | 346 | struct saa7134_dev *dev; |
347 | snd_card_saa7134_pcm_t *saapcm = runtime->private_data; | 347 | snd_card_saa7134_pcm_t *pcm = runtime->private_data; |
348 | unsigned int bps; | ||
349 | unsigned long size; | 348 | unsigned long size; |
350 | unsigned count; | 349 | unsigned count; |
351 | 350 | ||
352 | size = snd_pcm_lib_buffer_bytes(substream); | 351 | size = snd_pcm_lib_buffer_bytes(substream); |
353 | count = snd_pcm_lib_period_bytes(substream); | 352 | count = snd_pcm_lib_period_bytes(substream); |
354 | 353 | ||
355 | saapcm->saadev->dmasound.substream = substream; | 354 | pcm->dev->dmasound.substream = substream; |
356 | bps = runtime->rate * runtime->channels; | ||
357 | bps *= snd_pcm_format_width(runtime->format); | ||
358 | bps /= 8; | ||
359 | if (bps <= 0) | ||
360 | return -EINVAL; | ||
361 | saapcm->pcm_bps = bps; | ||
362 | saapcm->pcm_size = snd_pcm_lib_buffer_bytes(substream); | ||
363 | saapcm->pcm_count = snd_pcm_lib_period_bytes(substream); | ||
364 | |||
365 | 355 | ||
366 | dev=saa7134->saadev; | 356 | dev=saa7134->dev; |
367 | 357 | ||
368 | dsp_buffer_conf(dev,saapcm->pcm_count,(saapcm->pcm_size/saapcm->pcm_count)); | 358 | dsp_buffer_conf(dev,count,(size/count)); |
369 | 359 | ||
370 | err = dsp_buffer_init(dev); | 360 | err = dsp_buffer_init(dev); |
371 | if (0 != err) | 361 | if (0 != err) |
@@ -445,7 +435,6 @@ static int snd_card_saa7134_capture_prepare(snd_pcm_substream_t * substream) | |||
445 | fmt |= 0x04; | 435 | fmt |= 0x04; |
446 | saa_writel(SAA7133_NUM_SAMPLES, dev->dmasound.blksize -1); | 436 | saa_writel(SAA7133_NUM_SAMPLES, dev->dmasound.blksize -1); |
447 | saa_writel(SAA7133_AUDIO_CHANNEL, 0x543210 | (fmt << 24)); | 437 | saa_writel(SAA7133_AUDIO_CHANNEL, 0x543210 | (fmt << 24)); |
448 | //saa_writel(SAA7133_AUDIO_CHANNEL, 0x543210); | ||
449 | break; | 438 | break; |
450 | } | 439 | } |
451 | 440 | ||
@@ -496,10 +485,8 @@ static int snd_card_saa7134_capture_prepare(snd_pcm_substream_t * substream) | |||
496 | static snd_pcm_uframes_t snd_card_saa7134_capture_pointer(snd_pcm_substream_t * substream) | 485 | static snd_pcm_uframes_t snd_card_saa7134_capture_pointer(snd_pcm_substream_t * substream) |
497 | { | 486 | { |
498 | snd_pcm_runtime_t *runtime = substream->runtime; | 487 | snd_pcm_runtime_t *runtime = substream->runtime; |
499 | snd_card_saa7134_pcm_t *saapcm = runtime->private_data; | 488 | snd_card_saa7134_pcm_t *pcm = runtime->private_data; |
500 | struct saa7134_dev *dev=saapcm->saadev; | 489 | struct saa7134_dev *dev=pcm->dev; |
501 | |||
502 | |||
503 | 490 | ||
504 | if (dev->dmasound.read_count) { | 491 | if (dev->dmasound.read_count) { |
505 | dev->dmasound.read_count -= snd_pcm_lib_period_bytes(substream); | 492 | dev->dmasound.read_count -= snd_pcm_lib_period_bytes(substream); |
@@ -540,9 +527,9 @@ static snd_pcm_hardware_t snd_card_saa7134_capture = | |||
540 | 527 | ||
541 | static void snd_card_saa7134_runtime_free(snd_pcm_runtime_t *runtime) | 528 | static void snd_card_saa7134_runtime_free(snd_pcm_runtime_t *runtime) |
542 | { | 529 | { |
543 | snd_card_saa7134_pcm_t *saapcm = runtime->private_data; | 530 | snd_card_saa7134_pcm_t *pcm = runtime->private_data; |
544 | 531 | ||
545 | kfree(saapcm); | 532 | kfree(pcm); |
546 | } | 533 | } |
547 | 534 | ||
548 | 535 | ||
@@ -571,7 +558,7 @@ static int snd_card_saa7134_hw_params(snd_pcm_substream_t * substream, | |||
571 | * | 558 | * |
572 | * Called after closing the device, but before snd_card_saa7134_capture_close | 559 | * Called after closing the device, but before snd_card_saa7134_capture_close |
573 | * Usually used in ALSA to free the DMA, but since we don't use the | 560 | * Usually used in ALSA to free the DMA, but since we don't use the |
574 | * ALSA DMA I'm almost sure this isn't necessary. | 561 | * ALSA DMA it does nothing |
575 | * | 562 | * |
576 | */ | 563 | */ |
577 | 564 | ||
@@ -614,7 +601,7 @@ static int dsp_buffer_free(struct saa7134_dev *dev) | |||
614 | static int snd_card_saa7134_capture_close(snd_pcm_substream_t * substream) | 601 | static int snd_card_saa7134_capture_close(snd_pcm_substream_t * substream) |
615 | { | 602 | { |
616 | snd_card_saa7134_t *chip = snd_pcm_substream_chip(substream); | 603 | snd_card_saa7134_t *chip = snd_pcm_substream_chip(substream); |
617 | struct saa7134_dev *dev = chip->saadev; | 604 | struct saa7134_dev *dev = chip->dev; |
618 | 605 | ||
619 | /* unlock buffer */ | 606 | /* unlock buffer */ |
620 | saa7134_pgtable_free(dev->pci,&dev->dmasound.pt); | 607 | saa7134_pgtable_free(dev->pci,&dev->dmasound.pt); |
@@ -637,29 +624,28 @@ static int snd_card_saa7134_capture_close(snd_pcm_substream_t * substream) | |||
637 | static int snd_card_saa7134_capture_open(snd_pcm_substream_t * substream) | 624 | static int snd_card_saa7134_capture_open(snd_pcm_substream_t * substream) |
638 | { | 625 | { |
639 | snd_pcm_runtime_t *runtime = substream->runtime; | 626 | snd_pcm_runtime_t *runtime = substream->runtime; |
640 | snd_card_saa7134_pcm_t *saapcm; | 627 | snd_card_saa7134_pcm_t *pcm; |
641 | snd_card_saa7134_t *saa7134 = snd_pcm_substream_chip(substream); | 628 | snd_card_saa7134_t *saa7134 = snd_pcm_substream_chip(substream); |
642 | struct saa7134_dev *dev = saa7134->saadev; | 629 | struct saa7134_dev *dev = saa7134->dev; |
643 | int err; | 630 | int err; |
644 | 631 | ||
645 | down(&dev->dmasound.lock); | 632 | down(&dev->dmasound.lock); |
646 | 633 | ||
647 | dev->dmasound.afmt = SNDRV_PCM_FORMAT_U8; | ||
648 | dev->dmasound.channels = 2; | ||
649 | dev->dmasound.read_count = 0; | 634 | dev->dmasound.read_count = 0; |
650 | dev->dmasound.read_offset = 0; | 635 | dev->dmasound.read_offset = 0; |
651 | 636 | ||
652 | up(&dev->dmasound.lock); | 637 | up(&dev->dmasound.lock); |
653 | 638 | ||
654 | saapcm = kzalloc(sizeof(*saapcm), GFP_KERNEL); | 639 | pcm = kzalloc(sizeof(*pcm), GFP_KERNEL); |
655 | if (saapcm == NULL) | 640 | if (pcm == NULL) |
656 | return -ENOMEM; | 641 | return -ENOMEM; |
657 | saapcm->saadev=saa7134->saadev; | ||
658 | 642 | ||
659 | spin_lock_init(&saapcm->lock); | 643 | pcm->dev=saa7134->dev; |
644 | |||
645 | spin_lock_init(&pcm->lock); | ||
660 | 646 | ||
661 | saapcm->substream = substream; | 647 | pcm->substream = substream; |
662 | runtime->private_data = saapcm; | 648 | runtime->private_data = pcm; |
663 | runtime->private_free = snd_card_saa7134_runtime_free; | 649 | runtime->private_free = snd_card_saa7134_runtime_free; |
664 | runtime->hw = snd_card_saa7134_capture; | 650 | runtime->hw = snd_card_saa7134_capture; |
665 | 651 | ||
@@ -782,6 +768,7 @@ static int snd_saa7134_capsrc_get(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_ | |||
782 | ucontrol->value.integer.value[0] = chip->capture_source[addr][0]; | 768 | ucontrol->value.integer.value[0] = chip->capture_source[addr][0]; |
783 | ucontrol->value.integer.value[1] = chip->capture_source[addr][1]; | 769 | ucontrol->value.integer.value[1] = chip->capture_source[addr][1]; |
784 | spin_unlock_irqrestore(&chip->mixer_lock, flags); | 770 | spin_unlock_irqrestore(&chip->mixer_lock, flags); |
771 | |||
785 | return 0; | 772 | return 0; |
786 | } | 773 | } |
787 | 774 | ||
@@ -794,7 +781,7 @@ static int snd_saa7134_capsrc_put(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_ | |||
794 | int analog_io, rate; | 781 | int analog_io, rate; |
795 | struct saa7134_dev *dev; | 782 | struct saa7134_dev *dev; |
796 | 783 | ||
797 | dev = chip->saadev; | 784 | dev = chip->dev; |
798 | 785 | ||
799 | left = ucontrol->value.integer.value[0] & 1; | 786 | left = ucontrol->value.integer.value[0] & 1; |
800 | right = ucontrol->value.integer.value[1] & 1; | 787 | right = ucontrol->value.integer.value[1] & 1; |
@@ -904,11 +891,16 @@ static int snd_saa7134_dev_free(snd_device_t *device) | |||
904 | { | 891 | { |
905 | snd_card_saa7134_t *chip = device->device_data; | 892 | snd_card_saa7134_t *chip = device->device_data; |
906 | 893 | ||
894 | if (chip->dev->dmasound.priv_data == NULL) | ||
895 | return 0; | ||
896 | |||
907 | if (chip->irq >= 0) { | 897 | if (chip->irq >= 0) { |
908 | synchronize_irq(chip->irq); | 898 | synchronize_irq(chip->irq); |
909 | free_irq(chip->irq, (void *) chip); | 899 | free_irq(chip->irq, &chip->dev->dmasound); |
910 | } | 900 | } |
911 | 901 | ||
902 | chip->dev->dmasound.priv_data = NULL; | ||
903 | |||
912 | return 0; | 904 | return 0; |
913 | } | 905 | } |
914 | 906 | ||
@@ -920,7 +912,7 @@ static int snd_saa7134_dev_free(snd_device_t *device) | |||
920 | * | 912 | * |
921 | */ | 913 | */ |
922 | 914 | ||
923 | int alsa_card_saa7134_create(struct saa7134_dev *saadev, int dev) | 915 | int alsa_card_saa7134_create(struct saa7134_dev *dev, int devnum) |
924 | { | 916 | { |
925 | 917 | ||
926 | snd_card_t *card; | 918 | snd_card_t *card; |
@@ -931,12 +923,12 @@ int alsa_card_saa7134_create(struct saa7134_dev *saadev, int dev) | |||
931 | }; | 923 | }; |
932 | 924 | ||
933 | 925 | ||
934 | if (dev >= SNDRV_CARDS) | 926 | if (devnum >= SNDRV_CARDS) |
935 | return -ENODEV; | 927 | return -ENODEV; |
936 | if (!enable[dev]) | 928 | if (!enable[devnum]) |
937 | return -ENODEV; | 929 | return -ENODEV; |
938 | 930 | ||
939 | card = snd_card_new(index[dev], id[dev], THIS_MODULE, sizeof(snd_card_saa7134_t)); | 931 | card = snd_card_new(index[devnum], id[devnum], THIS_MODULE, sizeof(snd_card_saa7134_t)); |
940 | 932 | ||
941 | if (card == NULL) | 933 | if (card == NULL) |
942 | return -ENOMEM; | 934 | return -ENOMEM; |
@@ -951,23 +943,27 @@ int alsa_card_saa7134_create(struct saa7134_dev *saadev, int dev) | |||
951 | spin_lock_init(&chip->lock); | 943 | spin_lock_init(&chip->lock); |
952 | spin_lock_init(&chip->mixer_lock); | 944 | spin_lock_init(&chip->mixer_lock); |
953 | 945 | ||
954 | chip->saadev = saadev; | 946 | chip->dev = dev; |
955 | 947 | ||
956 | chip->card = card; | 948 | chip->card = card; |
957 | 949 | ||
958 | chip->pci = saadev->pci; | 950 | chip->pci = dev->pci; |
959 | chip->irq = saadev->pci->irq; | 951 | chip->irq = dev->pci->irq; |
960 | chip->iobase = pci_resource_start(saadev->pci, 0); | 952 | chip->iobase = pci_resource_start(dev->pci, 0); |
953 | |||
961 | 954 | ||
962 | err = request_irq(saadev->pci->irq, saa7134_alsa_irq, | 955 | err = request_irq(dev->pci->irq, saa7134_alsa_irq, |
963 | SA_SHIRQ | SA_INTERRUPT, saadev->name, (void *)chip); | 956 | SA_SHIRQ | SA_INTERRUPT, dev->name, |
957 | (void*) &dev->dmasound); | ||
964 | 958 | ||
965 | if (err < 0) { | 959 | if (err < 0) { |
966 | printk(KERN_ERR "%s: can't get IRQ %d for ALSA\n", | 960 | printk(KERN_ERR "%s: can't get IRQ %d for ALSA\n", |
967 | saadev->name, saadev->pci->irq); | 961 | dev->name, dev->pci->irq); |
968 | goto __nodev; | 962 | goto __nodev; |
969 | } | 963 | } |
970 | 964 | ||
965 | init_MUTEX(&dev->dmasound.lock); | ||
966 | |||
971 | if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops)) < 0) { | 967 | if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops)) < 0) { |
972 | goto __nodev; | 968 | goto __nodev; |
973 | } | 969 | } |
@@ -984,10 +980,10 @@ int alsa_card_saa7134_create(struct saa7134_dev *saadev, int dev) | |||
984 | 980 | ||
985 | strcpy(card->shortname, "SAA7134"); | 981 | strcpy(card->shortname, "SAA7134"); |
986 | sprintf(card->longname, "%s at 0x%lx irq %d", | 982 | sprintf(card->longname, "%s at 0x%lx irq %d", |
987 | chip->saadev->name, chip->iobase, chip->irq); | 983 | chip->dev->name, chip->iobase, chip->irq); |
988 | 984 | ||
989 | if ((err = snd_card_register(card)) == 0) { | 985 | if ((err = snd_card_register(card)) == 0) { |
990 | snd_saa7134_cards[dev] = card; | 986 | snd_saa7134_cards[devnum] = card; |
991 | return 0; | 987 | return 0; |
992 | } | 988 | } |
993 | 989 | ||
@@ -1006,7 +1002,7 @@ __nodev: | |||
1006 | 1002 | ||
1007 | static int saa7134_alsa_init(void) | 1003 | static int saa7134_alsa_init(void) |
1008 | { | 1004 | { |
1009 | struct saa7134_dev *saadev = NULL; | 1005 | struct saa7134_dev *dev = NULL; |
1010 | struct list_head *list; | 1006 | struct list_head *list; |
1011 | 1007 | ||
1012 | position = 0; | 1008 | position = 0; |
@@ -1014,12 +1010,18 @@ static int saa7134_alsa_init(void) | |||
1014 | printk(KERN_INFO "saa7134 ALSA driver for DMA sound loaded\n"); | 1010 | printk(KERN_INFO "saa7134 ALSA driver for DMA sound loaded\n"); |
1015 | 1011 | ||
1016 | list_for_each(list,&saa7134_devlist) { | 1012 | list_for_each(list,&saa7134_devlist) { |
1017 | saadev = list_entry(list, struct saa7134_dev, devlist); | 1013 | dev = list_entry(list, struct saa7134_dev, devlist); |
1018 | alsa_card_saa7134_create(saadev,position); | 1014 | if (dev->dmasound.priv_data == NULL) { |
1019 | position++; | 1015 | dev->dmasound.priv_data = dev; |
1016 | alsa_card_saa7134_create(dev,position); | ||
1017 | position++; | ||
1018 | } else { | ||
1019 | printk(KERN_ERR "saa7134 ALSA: DMA sound is being handled by OSS. ignoring %s\n",dev->name); | ||
1020 | return -EBUSY; | ||
1021 | } | ||
1020 | } | 1022 | } |
1021 | 1023 | ||
1022 | if (saadev == NULL) | 1024 | if (dev == NULL) |
1023 | printk(KERN_INFO "saa7134 ALSA: no saa7134 cards found\n"); | 1025 | printk(KERN_INFO "saa7134 ALSA: no saa7134 cards found\n"); |
1024 | 1026 | ||
1025 | return 0; | 1027 | return 0; |
diff --git a/drivers/media/video/saa7134/saa7134-core.c b/drivers/media/video/saa7134/saa7134-core.c index 14347854f98c..4275d2ddb864 100644 --- a/drivers/media/video/saa7134/saa7134-core.c +++ b/drivers/media/video/saa7134/saa7134-core.c | |||
@@ -53,13 +53,13 @@ static unsigned int gpio_tracking = 0; | |||
53 | module_param(gpio_tracking, int, 0644); | 53 | module_param(gpio_tracking, int, 0644); |
54 | MODULE_PARM_DESC(gpio_tracking,"enable debug messages [gpio]"); | 54 | MODULE_PARM_DESC(gpio_tracking,"enable debug messages [gpio]"); |
55 | 55 | ||
56 | static unsigned int oss = 0; | ||
57 | module_param(oss, int, 0444); | ||
58 | MODULE_PARM_DESC(oss,"register oss devices (default: no)"); | ||
59 | |||
60 | static unsigned int alsa = 0; | 56 | static unsigned int alsa = 0; |
61 | module_param(alsa, int, 0444); | 57 | module_param(alsa, int, 0644); |
62 | MODULE_PARM_DESC(alsa,"register alsa devices (default: no)"); | 58 | MODULE_PARM_DESC(alsa,"enable ALSA DMA sound [dmasound]"); |
59 | |||
60 | static unsigned int oss = 0; | ||
61 | module_param(oss, int, 0644); | ||
62 | MODULE_PARM_DESC(oss,"enable OSS DMA sound [dmasound]"); | ||
63 | 63 | ||
64 | static unsigned int latency = UNSET; | 64 | static unsigned int latency = UNSET; |
65 | module_param(latency, int, 0444); | 65 | module_param(latency, int, 0444); |
@@ -68,24 +68,18 @@ MODULE_PARM_DESC(latency,"pci latency timer"); | |||
68 | static unsigned int video_nr[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET }; | 68 | static unsigned int video_nr[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET }; |
69 | static unsigned int vbi_nr[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET }; | 69 | static unsigned int vbi_nr[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET }; |
70 | static unsigned int radio_nr[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET }; | 70 | static unsigned int radio_nr[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET }; |
71 | static unsigned int dsp_nr[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET }; | ||
72 | static unsigned int mixer_nr[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET }; | ||
73 | static unsigned int tuner[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET }; | 71 | static unsigned int tuner[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET }; |
74 | static unsigned int card[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET }; | 72 | static unsigned int card[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET }; |
75 | 73 | ||
76 | module_param_array(video_nr, int, NULL, 0444); | 74 | module_param_array(video_nr, int, NULL, 0444); |
77 | module_param_array(vbi_nr, int, NULL, 0444); | 75 | module_param_array(vbi_nr, int, NULL, 0444); |
78 | module_param_array(radio_nr, int, NULL, 0444); | 76 | module_param_array(radio_nr, int, NULL, 0444); |
79 | module_param_array(dsp_nr, int, NULL, 0444); | ||
80 | module_param_array(mixer_nr, int, NULL, 0444); | ||
81 | module_param_array(tuner, int, NULL, 0444); | 77 | module_param_array(tuner, int, NULL, 0444); |
82 | module_param_array(card, int, NULL, 0444); | 78 | module_param_array(card, int, NULL, 0444); |
83 | 79 | ||
84 | MODULE_PARM_DESC(video_nr, "video device number"); | 80 | MODULE_PARM_DESC(video_nr, "video device number"); |
85 | MODULE_PARM_DESC(vbi_nr, "vbi device number"); | 81 | MODULE_PARM_DESC(vbi_nr, "vbi device number"); |
86 | MODULE_PARM_DESC(radio_nr, "radio device number"); | 82 | MODULE_PARM_DESC(radio_nr, "radio device number"); |
87 | MODULE_PARM_DESC(dsp_nr, "oss dsp device number"); | ||
88 | MODULE_PARM_DESC(mixer_nr, "oss mixer device number"); | ||
89 | MODULE_PARM_DESC(tuner, "tuner type"); | 83 | MODULE_PARM_DESC(tuner, "tuner type"); |
90 | MODULE_PARM_DESC(card, "card type"); | 84 | MODULE_PARM_DESC(card, "card type"); |
91 | 85 | ||
@@ -195,6 +189,7 @@ void saa7134_track_gpio(struct saa7134_dev *dev, char *msg) | |||
195 | static int need_empress; | 189 | static int need_empress; |
196 | static int need_dvb; | 190 | static int need_dvb; |
197 | static int need_alsa; | 191 | static int need_alsa; |
192 | static int need_oss; | ||
198 | 193 | ||
199 | static int pending_call(struct notifier_block *self, unsigned long state, | 194 | static int pending_call(struct notifier_block *self, unsigned long state, |
200 | void *module) | 195 | void *module) |
@@ -208,6 +203,8 @@ static int pending_call(struct notifier_block *self, unsigned long state, | |||
208 | request_module("saa7134-dvb"); | 203 | request_module("saa7134-dvb"); |
209 | if (need_alsa) | 204 | if (need_alsa) |
210 | request_module("saa7134-alsa"); | 205 | request_module("saa7134-alsa"); |
206 | if (need_oss) | ||
207 | request_module("saa7134-oss"); | ||
211 | return NOTIFY_DONE; | 208 | return NOTIFY_DONE; |
212 | } | 209 | } |
213 | 210 | ||
@@ -218,10 +215,11 @@ static struct notifier_block pending_notifier = { | |||
218 | 215 | ||
219 | static void request_module_depend(char *name, int *flag) | 216 | static void request_module_depend(char *name, int *flag) |
220 | { | 217 | { |
218 | int err; | ||
221 | switch (THIS_MODULE->state) { | 219 | switch (THIS_MODULE->state) { |
222 | case MODULE_STATE_COMING: | 220 | case MODULE_STATE_COMING: |
223 | if (!pending_registered) { | 221 | if (!pending_registered) { |
224 | register_module_notifier(&pending_notifier); | 222 | err = register_module_notifier(&pending_notifier); |
225 | pending_registered = 1; | 223 | pending_registered = 1; |
226 | } | 224 | } |
227 | *flag = 1; | 225 | *flag = 1; |
@@ -578,12 +576,14 @@ static irqreturn_t saa7134_irq(int irq, void *dev_id, struct pt_regs *regs) | |||
578 | goto out; | 576 | goto out; |
579 | } | 577 | } |
580 | 578 | ||
581 | /* If alsa support is active and we get a sound report, exit | 579 | /* If dmasound support is active and we get a sound report, exit |
582 | and let the saa7134-alsa module deal with it */ | 580 | and let the saa7134-alsa/oss module deal with it */ |
583 | 581 | ||
584 | if ((report & SAA7134_IRQ_REPORT_DONE_RA3) && alsa) { | 582 | if ((report & SAA7134_IRQ_REPORT_DONE_RA3) && |
583 | (dev->dmasound.priv_data != NULL) ) | ||
584 | { | ||
585 | if (irq_debug > 1) | 585 | if (irq_debug > 1) |
586 | printk(KERN_DEBUG "%s/irq: ignoring interrupt for ALSA\n", | 586 | printk(KERN_DEBUG "%s/irq: ignoring interrupt for DMA sound\n", |
587 | dev->name); | 587 | dev->name); |
588 | goto out; | 588 | goto out; |
589 | } | 589 | } |
@@ -609,12 +609,6 @@ static irqreturn_t saa7134_irq(int irq, void *dev_id, struct pt_regs *regs) | |||
609 | card_has_mpeg(dev)) | 609 | card_has_mpeg(dev)) |
610 | saa7134_irq_ts_done(dev,status); | 610 | saa7134_irq_ts_done(dev,status); |
611 | 611 | ||
612 | if ((report & SAA7134_IRQ_REPORT_DONE_RA3)) { | ||
613 | if (oss) { | ||
614 | saa7134_irq_oss_done(dev,status); | ||
615 | } | ||
616 | } | ||
617 | |||
618 | if ((report & (SAA7134_IRQ_REPORT_GPIO16 | | 612 | if ((report & (SAA7134_IRQ_REPORT_GPIO16 | |
619 | SAA7134_IRQ_REPORT_GPIO18)) && | 613 | SAA7134_IRQ_REPORT_GPIO18)) && |
620 | dev->remote) | 614 | dev->remote) |
@@ -689,14 +683,6 @@ static int saa7134_hwinit1(struct saa7134_dev *dev) | |||
689 | * audio will not work. | 683 | * audio will not work. |
690 | */ | 684 | */ |
691 | 685 | ||
692 | switch (dev->pci->device) { | ||
693 | case PCI_DEVICE_ID_PHILIPS_SAA7134: | ||
694 | case PCI_DEVICE_ID_PHILIPS_SAA7133: | ||
695 | case PCI_DEVICE_ID_PHILIPS_SAA7135: | ||
696 | saa7134_oss_init1(dev); | ||
697 | break; | ||
698 | } | ||
699 | |||
700 | /* enable peripheral devices */ | 686 | /* enable peripheral devices */ |
701 | saa_writeb(SAA7134_SPECIAL_MODE, 0x01); | 687 | saa_writeb(SAA7134_SPECIAL_MODE, 0x01); |
702 | 688 | ||
@@ -740,13 +726,6 @@ static int saa7134_hwfini(struct saa7134_dev *dev) | |||
740 | { | 726 | { |
741 | dprintk("hwfini\n"); | 727 | dprintk("hwfini\n"); |
742 | 728 | ||
743 | switch (dev->pci->device) { | ||
744 | case PCI_DEVICE_ID_PHILIPS_SAA7134: | ||
745 | case PCI_DEVICE_ID_PHILIPS_SAA7133: | ||
746 | case PCI_DEVICE_ID_PHILIPS_SAA7135: | ||
747 | saa7134_oss_fini(dev); | ||
748 | break; | ||
749 | } | ||
750 | if (card_has_mpeg(dev)) | 729 | if (card_has_mpeg(dev)) |
751 | saa7134_ts_fini(dev); | 730 | saa7134_ts_fini(dev); |
752 | saa7134_input_fini(dev); | 731 | saa7134_input_fini(dev); |
@@ -984,11 +963,12 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev, | |||
984 | if (card_is_dvb(dev)) | 963 | if (card_is_dvb(dev)) |
985 | request_module_depend("saa7134-dvb",&need_dvb); | 964 | request_module_depend("saa7134-dvb",&need_dvb); |
986 | 965 | ||
987 | if (!oss && alsa) { | 966 | |
988 | dprintk("Requesting ALSA module\n"); | 967 | if (alsa) |
989 | request_module_depend("saa7134-alsa",&need_alsa); | 968 | request_module_depend("saa7134-alsa",&need_alsa); |
990 | } | ||
991 | 969 | ||
970 | if (oss) | ||
971 | request_module_depend("saa7134-oss",&need_oss); | ||
992 | 972 | ||
993 | v4l2_prio_init(&dev->prio); | 973 | v4l2_prio_init(&dev->prio); |
994 | 974 | ||
@@ -1022,32 +1002,6 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev, | |||
1022 | dev->name,dev->radio_dev->minor & 0x1f); | 1002 | dev->name,dev->radio_dev->minor & 0x1f); |
1023 | } | 1003 | } |
1024 | 1004 | ||
1025 | /* register oss devices */ | ||
1026 | switch (dev->pci->device) { | ||
1027 | case PCI_DEVICE_ID_PHILIPS_SAA7134: | ||
1028 | case PCI_DEVICE_ID_PHILIPS_SAA7133: | ||
1029 | case PCI_DEVICE_ID_PHILIPS_SAA7135: | ||
1030 | if (oss) { | ||
1031 | err = dev->dmasound.minor_dsp = | ||
1032 | register_sound_dsp(&saa7134_dsp_fops, | ||
1033 | dsp_nr[dev->nr]); | ||
1034 | if (err < 0) { | ||
1035 | goto fail4; | ||
1036 | } | ||
1037 | printk(KERN_INFO "%s: registered device dsp%d\n", | ||
1038 | dev->name,dev->dmasound.minor_dsp >> 4); | ||
1039 | |||
1040 | err = dev->dmasound.minor_mixer = | ||
1041 | register_sound_mixer(&saa7134_mixer_fops, | ||
1042 | mixer_nr[dev->nr]); | ||
1043 | if (err < 0) | ||
1044 | goto fail5; | ||
1045 | printk(KERN_INFO "%s: registered device mixer%d\n", | ||
1046 | dev->name,dev->dmasound.minor_mixer >> 4); | ||
1047 | } | ||
1048 | break; | ||
1049 | } | ||
1050 | |||
1051 | /* everything worked */ | 1005 | /* everything worked */ |
1052 | pci_set_drvdata(pci_dev,dev); | 1006 | pci_set_drvdata(pci_dev,dev); |
1053 | saa7134_devcount++; | 1007 | saa7134_devcount++; |
@@ -1065,15 +1019,6 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev, | |||
1065 | 1019 | ||
1066 | return 0; | 1020 | return 0; |
1067 | 1021 | ||
1068 | fail5: | ||
1069 | switch (dev->pci->device) { | ||
1070 | case PCI_DEVICE_ID_PHILIPS_SAA7134: | ||
1071 | case PCI_DEVICE_ID_PHILIPS_SAA7133: | ||
1072 | case PCI_DEVICE_ID_PHILIPS_SAA7135: | ||
1073 | if (oss) | ||
1074 | unregister_sound_dsp(dev->dmasound.minor_dsp); | ||
1075 | break; | ||
1076 | } | ||
1077 | fail4: | 1022 | fail4: |
1078 | saa7134_unregister_video(dev); | 1023 | saa7134_unregister_video(dev); |
1079 | saa7134_i2c_unregister(dev); | 1024 | saa7134_i2c_unregister(dev); |
@@ -1124,19 +1069,16 @@ static void __devexit saa7134_finidev(struct pci_dev *pci_dev) | |||
1124 | saa7134_devcount--; | 1069 | saa7134_devcount--; |
1125 | 1070 | ||
1126 | saa7134_i2c_unregister(dev); | 1071 | saa7134_i2c_unregister(dev); |
1127 | switch (dev->pci->device) { | ||
1128 | case PCI_DEVICE_ID_PHILIPS_SAA7134: | ||
1129 | case PCI_DEVICE_ID_PHILIPS_SAA7133: | ||
1130 | case PCI_DEVICE_ID_PHILIPS_SAA7135: | ||
1131 | if (oss) { | ||
1132 | unregister_sound_mixer(dev->dmasound.minor_mixer); | ||
1133 | unregister_sound_dsp(dev->dmasound.minor_dsp); | ||
1134 | } | ||
1135 | break; | ||
1136 | } | ||
1137 | saa7134_unregister_video(dev); | 1072 | saa7134_unregister_video(dev); |
1138 | 1073 | ||
1139 | /* release ressources */ | 1074 | /* the DMA sound modules should be unloaded before reaching |
1075 | this, but just in case they are still present... */ | ||
1076 | if (dev->dmasound.priv_data != NULL) { | ||
1077 | free_irq(pci_dev->irq, &dev->dmasound); | ||
1078 | dev->dmasound.priv_data = NULL; | ||
1079 | } | ||
1080 | |||
1081 | /* release resources */ | ||
1140 | free_irq(pci_dev->irq, dev); | 1082 | free_irq(pci_dev->irq, dev); |
1141 | iounmap(dev->lmmio); | 1083 | iounmap(dev->lmmio); |
1142 | release_mem_region(pci_resource_start(pci_dev,0), | 1084 | release_mem_region(pci_resource_start(pci_dev,0), |
@@ -1224,7 +1166,7 @@ EXPORT_SYMBOL(saa7134_i2c_call_clients); | |||
1224 | EXPORT_SYMBOL(saa7134_devlist); | 1166 | EXPORT_SYMBOL(saa7134_devlist); |
1225 | EXPORT_SYMBOL(saa7134_boards); | 1167 | EXPORT_SYMBOL(saa7134_boards); |
1226 | 1168 | ||
1227 | /* ----------------- For ALSA -------------------------------- */ | 1169 | /* ----------------- for the DMA sound modules --------------- */ |
1228 | 1170 | ||
1229 | EXPORT_SYMBOL(saa7134_pgtable_free); | 1171 | EXPORT_SYMBOL(saa7134_pgtable_free); |
1230 | EXPORT_SYMBOL(saa7134_pgtable_build); | 1172 | EXPORT_SYMBOL(saa7134_pgtable_build); |
diff --git a/drivers/media/video/saa7134/saa7134-oss.c b/drivers/media/video/saa7134/saa7134-oss.c index fd53dfcc1644..fd9ed11ab1e2 100644 --- a/drivers/media/video/saa7134/saa7134-oss.c +++ b/drivers/media/video/saa7134/saa7134-oss.c | |||
@@ -4,6 +4,8 @@ | |||
4 | * oss dsp interface | 4 | * oss dsp interface |
5 | * | 5 | * |
6 | * (c) 2001,02 Gerd Knorr <kraxel@bytesex.org> [SuSE Labs] | 6 | * (c) 2001,02 Gerd Knorr <kraxel@bytesex.org> [SuSE Labs] |
7 | * 2005 conversion to standalone module: | ||
8 | * Ricardo Cerqueira <v4l@cerqueira.org> | ||
7 | * | 9 | * |
8 | * This program is free software; you can redistribute it and/or modify | 10 | * This program is free software; you can redistribute it and/or modify |
9 | * it under the terms of the GNU General Public License as published by | 11 | * it under the terms of the GNU General Public License as published by |
@@ -25,7 +27,9 @@ | |||
25 | #include <linux/module.h> | 27 | #include <linux/module.h> |
26 | #include <linux/moduleparam.h> | 28 | #include <linux/moduleparam.h> |
27 | #include <linux/kernel.h> | 29 | #include <linux/kernel.h> |
30 | #include <linux/interrupt.h> | ||
28 | #include <linux/slab.h> | 31 | #include <linux/slab.h> |
32 | #include <linux/sound.h> | ||
29 | #include <linux/soundcard.h> | 33 | #include <linux/soundcard.h> |
30 | 34 | ||
31 | #include "saa7134-reg.h" | 35 | #include "saa7134-reg.h" |
@@ -33,15 +37,23 @@ | |||
33 | 37 | ||
34 | /* ------------------------------------------------------------------ */ | 38 | /* ------------------------------------------------------------------ */ |
35 | 39 | ||
36 | static unsigned int oss_debug = 0; | 40 | static unsigned int debug = 0; |
37 | module_param(oss_debug, int, 0644); | 41 | module_param(debug, int, 0644); |
38 | MODULE_PARM_DESC(oss_debug,"enable debug messages [oss]"); | 42 | MODULE_PARM_DESC(debug,"enable debug messages [oss]"); |
39 | 43 | ||
40 | static unsigned int oss_rate = 0; | 44 | static unsigned int rate = 0; |
41 | module_param(oss_rate, int, 0444); | 45 | module_param(rate, int, 0444); |
42 | MODULE_PARM_DESC(oss_rate,"sample rate (valid are: 32000,48000)"); | 46 | MODULE_PARM_DESC(rate,"sample rate (valid are: 32000,48000)"); |
43 | 47 | ||
44 | #define dprintk(fmt, arg...) if (oss_debug) \ | 48 | static unsigned int dsp_nr[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET }; |
49 | MODULE_PARM_DESC(dsp_nr, "device numbers for SAA7134 capture interface(s)."); | ||
50 | module_param_array(dsp_nr, int, NULL, 0444); | ||
51 | |||
52 | static unsigned int mixer_nr[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET }; | ||
53 | MODULE_PARM_DESC(mixer_nr, "mixer numbers for SAA7134 capture interface(s)."); | ||
54 | module_param_array(mixer_nr, int, NULL, 0444); | ||
55 | |||
56 | #define dprintk(fmt, arg...) if (debug) \ | ||
45 | printk(KERN_DEBUG "%s/oss: " fmt, dev->name , ## arg) | 57 | printk(KERN_DEBUG "%s/oss: " fmt, dev->name , ## arg) |
46 | 58 | ||
47 | 59 | ||
@@ -369,7 +381,7 @@ static int dsp_ioctl(struct inode *inode, struct file *file, | |||
369 | int __user *p = argp; | 381 | int __user *p = argp; |
370 | int val = 0; | 382 | int val = 0; |
371 | 383 | ||
372 | if (oss_debug > 1) | 384 | if (debug > 1) |
373 | saa7134_print_ioctl(dev->name,cmd); | 385 | saa7134_print_ioctl(dev->name,cmd); |
374 | switch (cmd) { | 386 | switch (cmd) { |
375 | case OSS_GETVERSION: | 387 | case OSS_GETVERSION: |
@@ -665,7 +677,7 @@ static int mixer_ioctl(struct inode *inode, struct file *file, | |||
665 | void __user *argp = (void __user *) arg; | 677 | void __user *argp = (void __user *) arg; |
666 | int __user *p = argp; | 678 | int __user *p = argp; |
667 | 679 | ||
668 | if (oss_debug > 1) | 680 | if (debug > 1) |
669 | saa7134_print_ioctl(dev->name,cmd); | 681 | saa7134_print_ioctl(dev->name,cmd); |
670 | switch (cmd) { | 682 | switch (cmd) { |
671 | case OSS_GETVERSION: | 683 | case OSS_GETVERSION: |
@@ -768,8 +780,41 @@ struct file_operations saa7134_mixer_fops = { | |||
768 | 780 | ||
769 | /* ------------------------------------------------------------------ */ | 781 | /* ------------------------------------------------------------------ */ |
770 | 782 | ||
783 | static irqreturn_t saa7134_oss_irq(int irq, void *dev_id, struct pt_regs *regs) | ||
784 | { | ||
785 | struct saa7134_dmasound *dmasound = dev_id; | ||
786 | struct saa7134_dev *dev = dmasound->priv_data; | ||
787 | unsigned long report, status; | ||
788 | int loop, handled = 0; | ||
789 | |||
790 | for (loop = 0; loop < 10; loop++) { | ||
791 | report = saa_readl(SAA7134_IRQ_REPORT); | ||
792 | status = saa_readl(SAA7134_IRQ_STATUS); | ||
793 | |||
794 | if (report & SAA7134_IRQ_REPORT_DONE_RA3) { | ||
795 | handled = 1; | ||
796 | saa_writel(SAA7134_IRQ_REPORT,report); | ||
797 | saa7134_irq_oss_done(dev, status); | ||
798 | } else { | ||
799 | goto out; | ||
800 | } | ||
801 | } | ||
802 | |||
803 | if (loop == 10) { | ||
804 | dprintk("error! looping IRQ!"); | ||
805 | } | ||
806 | out: | ||
807 | return IRQ_RETVAL(handled); | ||
808 | } | ||
809 | |||
771 | int saa7134_oss_init1(struct saa7134_dev *dev) | 810 | int saa7134_oss_init1(struct saa7134_dev *dev) |
772 | { | 811 | { |
812 | |||
813 | if ((request_irq(dev->pci->irq, saa7134_oss_irq, | ||
814 | SA_SHIRQ | SA_INTERRUPT, dev->name, | ||
815 | (void*) &dev->dmasound)) < 0) | ||
816 | return -1; | ||
817 | |||
773 | /* general */ | 818 | /* general */ |
774 | init_MUTEX(&dev->dmasound.lock); | 819 | init_MUTEX(&dev->dmasound.lock); |
775 | init_waitqueue_head(&dev->dmasound.wq); | 820 | init_waitqueue_head(&dev->dmasound.wq); |
@@ -785,8 +830,8 @@ int saa7134_oss_init1(struct saa7134_dev *dev) | |||
785 | 830 | ||
786 | /* dsp */ | 831 | /* dsp */ |
787 | dev->dmasound.rate = 32000; | 832 | dev->dmasound.rate = 32000; |
788 | if (oss_rate) | 833 | if (rate) |
789 | dev->dmasound.rate = oss_rate; | 834 | dev->dmasound.rate = rate; |
790 | dev->dmasound.rate = (dev->dmasound.rate > 40000) ? 48000 : 32000; | 835 | dev->dmasound.rate = (dev->dmasound.rate > 40000) ? 48000 : 32000; |
791 | 836 | ||
792 | /* mixer */ | 837 | /* mixer */ |
@@ -840,7 +885,7 @@ void saa7134_irq_oss_done(struct saa7134_dev *dev, unsigned long status) | |||
840 | /* next block addr */ | 885 | /* next block addr */ |
841 | next_blk = (dev->dmasound.dma_blk + 2) % dev->dmasound.blocks; | 886 | next_blk = (dev->dmasound.dma_blk + 2) % dev->dmasound.blocks; |
842 | saa_writel(reg,next_blk * dev->dmasound.blksize); | 887 | saa_writel(reg,next_blk * dev->dmasound.blksize); |
843 | if (oss_debug > 2) | 888 | if (debug > 2) |
844 | dprintk("irq: ok, %s, next_blk=%d, addr=%x\n", | 889 | dprintk("irq: ok, %s, next_blk=%d, addr=%x\n", |
845 | (status & 0x10000000) ? "even" : "odd ", next_blk, | 890 | (status & 0x10000000) ? "even" : "odd ", next_blk, |
846 | next_blk * dev->dmasound.blksize); | 891 | next_blk * dev->dmasound.blksize); |
@@ -854,6 +899,98 @@ void saa7134_irq_oss_done(struct saa7134_dev *dev, unsigned long status) | |||
854 | spin_unlock(&dev->slock); | 899 | spin_unlock(&dev->slock); |
855 | } | 900 | } |
856 | 901 | ||
902 | int saa7134_dsp_create(struct saa7134_dev *dev) | ||
903 | { | ||
904 | int err; | ||
905 | |||
906 | err = dev->dmasound.minor_dsp = | ||
907 | register_sound_dsp(&saa7134_dsp_fops, | ||
908 | dsp_nr[dev->nr]); | ||
909 | if (err < 0) { | ||
910 | goto fail; | ||
911 | } | ||
912 | printk(KERN_INFO "%s: registered device dsp%d\n", | ||
913 | dev->name,dev->dmasound.minor_dsp >> 4); | ||
914 | |||
915 | err = dev->dmasound.minor_mixer = | ||
916 | register_sound_mixer(&saa7134_mixer_fops, | ||
917 | mixer_nr[dev->nr]); | ||
918 | if (err < 0) | ||
919 | goto fail; | ||
920 | printk(KERN_INFO "%s: registered device mixer%d\n", | ||
921 | dev->name,dev->dmasound.minor_mixer >> 4); | ||
922 | |||
923 | return 0; | ||
924 | |||
925 | fail: | ||
926 | unregister_sound_dsp(dev->dmasound.minor_dsp); | ||
927 | return 0; | ||
928 | |||
929 | |||
930 | } | ||
931 | |||
932 | static int saa7134_oss_init(void) | ||
933 | { | ||
934 | struct saa7134_dev *dev = NULL; | ||
935 | struct list_head *list; | ||
936 | |||
937 | printk(KERN_INFO "saa7134 OSS driver for DMA sound loaded\n"); | ||
938 | |||
939 | list_for_each(list,&saa7134_devlist) { | ||
940 | dev = list_entry(list, struct saa7134_dev, devlist); | ||
941 | if (dev->dmasound.priv_data == NULL) { | ||
942 | dev->dmasound.priv_data = dev; | ||
943 | saa7134_oss_init1(dev); | ||
944 | saa7134_dsp_create(dev); | ||
945 | } else { | ||
946 | printk(KERN_ERR "saa7134 OSS: DMA sound is being handled by ALSA, ignoring %s\n",dev->name); | ||
947 | return -EBUSY; | ||
948 | } | ||
949 | } | ||
950 | |||
951 | if (dev == NULL) | ||
952 | printk(KERN_INFO "saa7134 OSS: no saa7134 cards found\n"); | ||
953 | |||
954 | return 0; | ||
955 | |||
956 | } | ||
957 | |||
958 | void saa7134_oss_exit(void) | ||
959 | { | ||
960 | struct saa7134_dev *dev = NULL; | ||
961 | struct list_head *list; | ||
962 | |||
963 | list_for_each(list,&saa7134_devlist) { | ||
964 | dev = list_entry(list, struct saa7134_dev, devlist); | ||
965 | |||
966 | /* Device isn't registered by OSS, probably ALSA's */ | ||
967 | if (!dev->dmasound.minor_dsp) | ||
968 | continue; | ||
969 | |||
970 | unregister_sound_mixer(dev->dmasound.minor_mixer); | ||
971 | unregister_sound_dsp(dev->dmasound.minor_dsp); | ||
972 | |||
973 | saa7134_oss_fini(dev); | ||
974 | |||
975 | if (dev->pci->irq > 0) { | ||
976 | synchronize_irq(dev->pci->irq); | ||
977 | free_irq(dev->pci->irq,&dev->dmasound); | ||
978 | } | ||
979 | |||
980 | dev->dmasound.priv_data = NULL; | ||
981 | |||
982 | } | ||
983 | |||
984 | printk(KERN_INFO "saa7134 OSS driver for DMA sound unloaded\n"); | ||
985 | |||
986 | return; | ||
987 | } | ||
988 | |||
989 | module_init(saa7134_oss_init); | ||
990 | module_exit(saa7134_oss_exit); | ||
991 | MODULE_LICENSE("GPL"); | ||
992 | MODULE_AUTHOR("Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]"); | ||
993 | |||
857 | /* ----------------------------------------------------------- */ | 994 | /* ----------------------------------------------------------- */ |
858 | /* | 995 | /* |
859 | * Local variables: | 996 | * Local variables: |
diff --git a/drivers/media/video/saa7134/saa7134.h b/drivers/media/video/saa7134/saa7134.h index fb9727471661..85ba30978e84 100644 --- a/drivers/media/video/saa7134/saa7134.h +++ b/drivers/media/video/saa7134/saa7134.h | |||
@@ -383,6 +383,7 @@ struct saa7134_dmasound { | |||
383 | unsigned int dma_blk; | 383 | unsigned int dma_blk; |
384 | unsigned int read_offset; | 384 | unsigned int read_offset; |
385 | unsigned int read_count; | 385 | unsigned int read_count; |
386 | void * priv_data; | ||
386 | snd_pcm_substream_t *substream; | 387 | snd_pcm_substream_t *substream; |
387 | }; | 388 | }; |
388 | 389 | ||