dmasound split

Geert Uytterhoeven geert at linux-m68k.org
Wed Mar 8 08:49:34 EST 2000


On Tue, 7 Mar 2000, Geert Uytterhoeven wrote:
> This is my first test release for splitting the DMA sound driver in different
> parts:

And here's a first patch:

  - Fix the locking problem by adding open()/release() functions to the machine
    specific modules
  - Fix the incorrect size of the requested memory region for the Amiga driver
  - Rename HAS_READ_SOUND to HAS_RECORD

--- dmasound.h	Tue Mar  7 20:54:03 2000
+++ dmasound.h	Tue Mar  7 22:13:33 2000
@@ -74,14 +74,14 @@
 #undef HAS_8BIT_TABLES
 #undef HAS_14BIT_TABLES
 #undef HAS_16BIT_TABLES
-#undef HAS_READ_SOUND
+#undef HAS_RECORD

 #if defined(CONFIG_AMIGA) || defined(CONFIG_ATARI)
 #define HAS_8BIT_TABLES
 #endif
 #if defined(CONFIG_PPC)
 #define HAS_16BIT_TABLES
-#define HAS_READ_SOUND
+#define HAS_RECORD
 #endif


@@ -95,6 +95,8 @@
 typedef struct {
     const char *name;
     const char *name2;
+    void (*open)(void);
+    void (*release)(void);
     void *(*dma_alloc)(unsigned int, int);
     void (*dma_free)(void *, unsigned int);
     int (*irqinit)(void);
@@ -148,7 +150,7 @@
     SETTINGS soft;	/* software settings */
     SETTINGS dsp;	/* /dev/dsp default settings */
     TRANS *trans_write;	/* supported translations */
-#ifdef HAS_READ_SOUND
+#ifdef HAS_RECORD
     TRANS *trans_read;	/* supported translations */
 #endif
     int volume_left;	/* volume (range is machine dependent) */
--- dmasound_atari.c	Tue Mar  7 20:54:09 2000
+++ dmasound_atari.c	Tue Mar  7 22:14:31 2000
@@ -119,6 +119,8 @@
 /*** Low level stuff *********************************************************/


+static void AtaOpen(void);
+static void AtaRelease(void);
 static void *AtaAlloc(unsigned int size, int flags);
 static void AtaFree(void *, unsigned int size);
 static int AtaIrqInit(void);
@@ -815,6 +817,16 @@
  * Atari (TT/Falcon)
  */

+static void AtaOpen(void)
+{
+	MOD_INC_USE_COUNT;
+}
+
+static void AtaRelease(void)
+{
+	MOD_DEC_USE_COUNT;
+}
+
 static void *AtaAlloc(unsigned int size, int flags)
 {
 	return atari_stram_alloc( size, NULL, "dmasound" );
@@ -1480,6 +1492,8 @@
 static MACHINE machTT = {
 	name:		"Atari",
 	name2:		"TT",
+	open:		AtaOpen,
+	release:	AtaRelease,
 	dma_alloc:	AtaAlloc,
 	dma_free:	AtaFree,
 	irqinit:	AtaIrqInit,
--- dmasound_awacs.c	Tue Mar  7 20:54:09 2000
+++ dmasound_awacs.c	Tue Mar  7 22:14:37 2000
@@ -220,6 +220,8 @@
 /*** Low level stuff *********************************************************/


+static void PMacOpen(void);
+static void PMacRelease(void);
 static void *PMacAlloc(unsigned int size, int flags);
 static void PMacFree(void *ptr, unsigned int size);
 static int PMacIrqInit(void);
@@ -805,6 +807,16 @@
  * PCI PowerMac, with AWACS and DBDMA.
  */

+static void PMacOpen(void)
+{
+	MOD_INC_USE_COUNT;
+}
+
+static void PMacRelease(void)
+{
+	MOD_DEC_USE_COUNT;
+}
+
 static void *PMacAlloc(unsigned int size, int flags)
 {
 	return kmalloc(size, flags);
@@ -1899,6 +1911,8 @@
 static MACHINE machPMac = {
 	name:		awacs_name,
 	name2:		"AWACS",
+	open:		PMacOpen,
+	release:	PMacRelease,
 	dma_alloc:	PMacAlloc,
 	dma_free:	PMacFree,
 	irqinit:	PMacIrqInit,
--- dmasound_core.c	Tue Mar  7 20:54:09 2000
+++ dmasound_core.c	Tue Mar  7 22:23:50 2000
@@ -138,7 +138,7 @@

 int dmasound_catchRadius = 0;
 static int numWriteBufs = 4, writeBufSize = 32;
-#ifdef HAS_READ_SOUND
+#ifdef HAS_RECORD
 static int numReadBufs = 4, readBufSize = 32;
 #endif

@@ -415,7 +415,7 @@
  */

 struct sound_queue dmasound_write_sq;
-#ifdef HAS_READ_SOUND
+#ifdef HAS_RECORD
 struct sound_queue dmasound_read_sq;
 #endif

@@ -531,6 +531,7 @@
 static int mixer_open(struct inode *inode, struct file *file)
 {
 	MOD_INC_USE_COUNT;
+	dmasound.mach.open();
 	mixer.busy = 1;
 	return 0;
 }
@@ -538,6 +539,7 @@
 static int mixer_release(struct inode *inode, struct file *file)
 {
 	mixer.busy = 0;
+	dmasound.mach.release();
 	MOD_DEC_USE_COUNT;
 	return 0;
 }
@@ -742,7 +744,7 @@
 }


-#ifdef HAS_READ_SOUND
+#ifdef HAS_RECORD

 /* Here is how the values are used for reading.
  * The value 'active' simply indicates the DMA is running.  This is
@@ -807,7 +809,7 @@
 	}
 	return uRead;
 }
-#endif /* HAS_READ_SOUND */
+#endif /* HAS_RECORD */


 static inline void sq_init_waitqueue(struct sound_queue *sq)
@@ -864,18 +866,18 @@
 #define write_sq_open(file)	\
 	sq_open2(&write_sq, file, FMODE_WRITE, numWriteBufs, writeBufSize, 0)

-#ifdef HAS_READ_SOUND
+#ifdef HAS_RECORD
 #define read_sq_init_waitqueue()	sq_init_waitqueue(&read_sq)
 #define read_sq_wake_up(file)		sq_wake_up(&read_sq, file, FMODE_READ)
 #define read_sq_release_buffers()	sq_release_buffers(&read_sq, 1)
 #define read_sq_open(file)	\
 	sq_open2(&read_sq, file, FMODE_READ, numReadBufs, readBufSize, 1)
-#else /* !HAS_READ_SOUND */
+#else /* !HAS_RECORD */
 #define read_sq_init_waitqueue()	do {} while (0)
 #define read_sq_wake_up(file)		do {} while (0)
 #define read_sq_release_buffers()	do {} while (0)
 #define read_sq_open(file)		(0)
-#endif /* !HAS_READ_SOUND */
+#endif /* !HAS_RECORD */


 static int sq_open(struct inode *inode, struct file *file)
@@ -883,7 +885,9 @@
 	int rc;

 	MOD_INC_USE_COUNT;
+	dmasound.mach.open();
 	if ((rc = write_sq_open(file)) || (rc = read_sq_open(file))) {
+		dmasound.mach.release();
 		MOD_DEC_USE_COUNT;
 		return rc;
 	}
@@ -955,6 +959,7 @@

 	read_sq_release_buffers();
 	write_sq_release_buffers();
+	dmasound.mach.release();
 	MOD_DEC_USE_COUNT;

 	/* There is probably a DOS atack here. They change the mode flag. */
@@ -1075,7 +1080,7 @@
 	ioctl:		sq_ioctl,
 	open:		sq_open,
 	release:	sq_release,
-#ifdef HAS_READ_SOUND
+#ifdef HAS_RECORD
 	read:		sq_read,
 #endif
 };
@@ -1125,6 +1130,7 @@
 		return -EBUSY;

 	MOD_INC_USE_COUNT;
+	dmasound.mach.open();
 	state.ptr = 0;
 	state.busy = 1;

@@ -1181,6 +1187,7 @@
 static int state_release(struct inode *inode, struct file *file)
 {
 	state.busy = 0;
+	dmasound.mach.release();
 	MOD_DEC_USE_COUNT;
 	return 0;
 }
@@ -1276,7 +1283,6 @@
 	printk(KERN_INFO "DMA sound driver installed, using %d buffers of %dk.\n",
 	       numWriteBufs, writeBufSize);

-	MOD_INC_USE_COUNT;
 	return 0;
 }

@@ -1302,7 +1308,6 @@
 	if (sq_unit >= 0)
 		unregister_sound_dsp(sq_unit);

-	MOD_DEC_USE_COUNT;
 	dmasound_active = 0;
 }

@@ -1354,7 +1359,7 @@
 EXPORT_SYMBOL(dmasound_init);
 EXPORT_SYMBOL(dmasound_deinit);
 EXPORT_SYMBOL(dmasound_write_sq);
-#ifdef HAS_READ_SOUND
+#ifdef HAS_RECORD
 EXPORT_SYMBOL(dmasound_read_sq);
 #endif
 EXPORT_SYMBOL(dmasound_catchRadius);
--- dmasound_paula.c	Tue Mar  7 20:54:09 2000
+++ dmasound_paula.c	Tue Mar  7 22:45:09 2000
@@ -72,6 +72,8 @@
 /*** Low level stuff *********************************************************/


+static void AmiOpen(void);
+static void AmiRelease(void);
 static void *AmiAlloc(unsigned int size, int flags);
 static void AmiFree(void *obj, unsigned int size);
 static int AmiIrqInit(void);
@@ -281,6 +283,16 @@
 /*** Low level stuff *********************************************************/


+static void AmiOpen(void)
+{
+	MOD_INC_USE_COUNT;
+}
+
+static void AmiRelease(void)
+{
+	MOD_DEC_USE_COUNT;
+}
+
 static inline void StopDMA(void)
 {
 	custom.aud[0].audvol = custom.aud[1].audvol = 0;
@@ -639,6 +651,8 @@
 static MACHINE machAmiga = {
 	name:		"Amiga",
 	name2:		"AMIGA",
+	open:		AmiOpen,
+	release:	AmiRelease,
 	dma_alloc:	AmiAlloc,
 	dma_free:	AmiFree,
 	irqinit:	AmiIrqInit,
@@ -665,7 +679,7 @@
 int __init paula_dmasound_init(void)
 {
 	if (MACH_IS_AMIGA && AMIGAHW_PRESENT(AMI_AUDIO)) {
-	    if (!request_mem_region(CUSTOM_PHYSADDR+0xa0, 0x20,
+	    if (!request_mem_region(CUSTOM_PHYSADDR+0xa0, 0x40,
 				    "dmasound [Paula]"))
 		return -EBUSY;
 	    dmasound.mach = machAmiga;
@@ -685,7 +699,7 @@
 void cleanup_module(void)
 {
 	dmasound_deinit();
-	release_mem_region(CUSTOM_PHYSADDR+0xa0, 0x20);
+	release_mem_region(CUSTOM_PHYSADDR+0xa0, 0x40);
 }

 #endif /* MODULE */
Gr{oetje,eeting}s,

						Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert at linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
							    -- Linus Torvalds


** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/





More information about the Linuxppc-dev mailing list