lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20100521154659.GA2346@linux-mips.org>
Date:	Fri, 21 May 2010 16:46:59 +0100
From:	Ralf Baechle <ralf@...ux-mips.org>
To:	"Maciej W. Rozycki" <macro@...ux-mips.org>
Cc:	John Kacur <jkacur@...hat.com>, linux-kernel@...r.kernel.org,
	Frederic Weisbecker <fweisbec@...il.com>,
	Arnd Bergmann <arndbergmann@...glemail.com>,
	Thomas Gleixner <tglx@...utronix.de>,
	Ingo Molnar <mingo@...e.hu>, linux-mips@...ux-mips.org,
	Paul Mundt <lethal@...ux-sh.org>, linux-sh@...r.kernel.org,
	Geert Uytterhoeven <geert@...ux-m68k.org>,
	Roman Zippel <zippel@...ux-m68k.org>,
	linux-m68k@...r.kernel.org
Subject: Re: bkl: Pushdowns for sound/oss ?

On Fri, May 21, 2010 at 04:34:54PM +0100, Maciej W. Rozycki wrote:

> > > particular in:
> > > sound/oss/swarm_cs4297a.c
> > 
> > This one is specific to the Swarm, a MIPS-based platform indeed; I'll cc
> > Maciej Rozycki who most likely is the only person on the planet knowing the
> > technical details.  I don't even recall touching that file so my (C)
> > header in there is a surprise :)
> 
>  You probably added a missing header inclusion or suchlike. ;)

That may well be true - I haven't touched much sound code since my time
at Waldorf Electronics but that was a slightly different calibre than
sound in Linux.

>  That's a Crystal Sound CS4297A AC'97 codec wired to a synchronous serial 
> interface of the SWARM board.  It used to work with 2.4 after some tweaks 
> I did back then (it broke in the little-endian mode or something like 
> that), but I can't say anything about 2.6.  I think the driver should be 
> dropped and the serial port in the sound mode (there's a demux to switch 
> the interface's external connection between the codec and a DE-9 
> connector; the serial port supports asynchronous mode as well) properly 
> abstracted as a "sound card".
> 
>  There's a separate CS4297A driver already in our tree, so it should be 
> used in place of the codec bits from this driver (which I believe were 
> simply copied over at some point).  The rest is glue logic to set up 
> serial line parameters correctly for the codec and switch the demux to the 
> codec (no proper resource management is done for that though; the 
> selection used to be made at the kernel build time).  This glue logic is 
> all that's needed to be carried over to the new "sound card" driver.
> 
>  I have plans to do so in some indefinite future, probably when I retire 
> and my grandchildren have grown up; anyone please feel free to take it 
> first. ;)

I've patched up what there to build without warnings but that doesn't
make any less ugly or wrong.  I'm trying to motivate a few folks to
offload the work from you; until that has happened it might be nice if this
driver would stick around as some form of documentation.

As for the grandchildren - is there something I haven't heared of yet?  :)

  Ralf

Signed-off-by: Ralf Baechle <ralf@...ux-mips.org>

diff --git a/sound/oss/swarm_cs4297a.c b/sound/oss/swarm_cs4297a.c
index 3136c88..17ae26b 100644
--- a/sound/oss/swarm_cs4297a.c
+++ b/sound/oss/swarm_cs4297a.c
@@ -78,6 +78,7 @@
 #include <linux/mutex.h>
 #include <linux/kernel.h>
 
+#include <asm/addrspace.h>
 #include <asm/byteorder.h>
 #include <asm/dma.h>
 #include <asm/io.h>
@@ -160,10 +161,10 @@ module_param(cs_debugmask, int, 0);
 #define CS_TYPE_ADC 0
 #define CS_TYPE_DAC 1
 
-#define SER_BASE    (A_SER_BASE_1 + KSEG1)
-#define SS_CSR(t)   (SER_BASE+t)
-#define SS_TXTBL(t) (SER_BASE+R_SER_TX_TABLE_BASE+(t*8))
-#define SS_RXTBL(t) (SER_BASE+R_SER_RX_TABLE_BASE+(t*8))
+#define SER_BASE    CKSEG1ADDR(A_SER_BASE_1)
+#define SS_CSR(t)   ((void *) SER_BASE + (t))
+#define SS_TXTBL(t) ((void *) (SER_BASE + R_SER_TX_TABLE_BASE + (t * 8)))
+#define SS_RXTBL(t) ((void *) (SER_BASE + R_SER_RX_TABLE_BASE + (t * 8)))
 
 #define FRAME_BYTES            32
 #define FRAME_SAMPLE_BYTES      4
@@ -1179,7 +1180,7 @@ static int mixer_ioctl(struct cs4297a_state *s, unsigned int cmd,
 #if CSDEBUG
 	cs_printioctl(cmd);
 #endif
-#if CSDEBUG_INTERFACE
+#ifdef CSDEBUG_INTERFACE
 
 	if ((cmd == SOUND_MIXER_CS_GETDBGMASK) ||
 	    (cmd == SOUND_MIXER_CS_SETDBGMASK) ||
@@ -1859,7 +1860,7 @@ static ssize_t cs4297a_write(struct file *file, const char *buffer,
                                  "cs4297a: copy in %d to swptr %x\n", cnt, swptr));
 
 		swptr = (swptr + (cnt/FRAME_SAMPLE_BYTES)) % d->ringsz;
-                __raw_writeq(cnt/FRAME_SAMPLE_BYTES, SS_CSR(R_SER_DMA_DSCR_COUNT_TX));
+                __raw_writeq(cnt/FRAME_SAMPLE_BYTES, (void *) SS_CSR(R_SER_DMA_DSCR_COUNT_TX));
 		spin_lock_irqsave(&s->lock, flags);
 		d->swptr = swptr;
 		d->count += cnt;
@@ -2502,7 +2503,7 @@ static const struct file_operations cs4297a_audio_fops = {
 	.release	= cs4297a_release,
 };
 
-static void cs4297a_interrupt(int irq, void *dev_id)
+static irqreturn_t cs4297a_interrupt(int irq, void *dev_id)
 {
 	struct cs4297a_state *s = (struct cs4297a_state *) dev_id;
         u32 status;
@@ -2517,14 +2518,14 @@ static void cs4297a_interrupt(int irq, void *dev_id)
         if (!(status & (M_SYNCSER_RX_EOP_COUNT | M_SYNCSER_RX_OVERRUN | M_SYNCSER_RX_SYNC_ERR))) {
                 status = __raw_readq(SS_CSR(R_SER_STATUS));
                 printk(KERN_ERR "cs4297a: unexpected interrupt (status %08x)\n", status);
-                return;
+                return IRQ_HANDLED;
         }
 #endif
 
         if (status & M_SYNCSER_RX_SYNC_ERR) {
                 status = __raw_readq(SS_CSR(R_SER_STATUS));
                 printk(KERN_ERR "cs4297a: rx sync error (status %08x)\n", status);
-                return;
+                return IRQ_HANDLED;
         }
 
         if (status & M_SYNCSER_RX_OVERRUN) {
@@ -2534,9 +2535,9 @@ static void cs4297a_interrupt(int irq, void *dev_id)
 
                 /* Fix things up: get the receive descriptor pool
                    clean and give them back to the hardware */
-                while (__raw_readq(SS_CSR(R_SER_DMA_DSCR_COUNT_RX)))
+                while (__raw_readq((void *)SS_CSR(R_SER_DMA_DSCR_COUNT_RX)))
                         ;
-                newptr = (unsigned) (((__raw_readq(SS_CSR(R_SER_DMA_CUR_DSCR_ADDR_RX)) & M_DMA_CURDSCR_ADDR) -
+                newptr = (unsigned) (((__raw_readq((void *)SS_CSR(R_SER_DMA_CUR_DSCR_ADDR_RX)) & M_DMA_CURDSCR_ADDR) -
                                      s->dma_adc.descrtab_phys) / sizeof(serdma_descr_t));
                 for (i=0; i<DMA_DESCR; i++) {
                         s->dma_adc.descrtab[i].descr_a &= ~M_DMA_SERRX_SOP;
@@ -2544,7 +2545,7 @@ static void cs4297a_interrupt(int irq, void *dev_id)
                 s->dma_adc.swptr = s->dma_adc.hwptr = newptr;
                 s->dma_adc.count = 0;
                 s->dma_adc.sb_swptr = s->dma_adc.sb_hwptr = s->dma_adc.sample_buf;
-                __raw_writeq(DMA_DESCR, SS_CSR(R_SER_DMA_DSCR_COUNT_RX));
+                __raw_writeq(DMA_DESCR, (void *)SS_CSR(R_SER_DMA_DSCR_COUNT_RX));
         }
 
 	spin_lock(&s->lock);
@@ -2553,6 +2554,8 @@ static void cs4297a_interrupt(int irq, void *dev_id)
 
 	CS_DBGOUT(CS_INTERRUPT, 6, printk(KERN_INFO
 		  "cs4297a: cs4297a_interrupt()-\n"));
+
+	return IRQ_HANDLED;
 }
 
 #if 0
@@ -2588,14 +2591,15 @@ static int __init cs4297a_init(void)
 		"cs4297a: cs4297a_init_module()+ \n"));
 
 #ifndef CONFIG_BCM_CS4297A_CSWARM
-        mdio_val = __raw_readq(KSEG1 + A_MAC_REGISTER(2, R_MAC_MDIO)) &
+        mdio_val = __raw_readq((void *)CKSEG1ADDR(A_MAC_REGISTER(2, R_MAC_MDIO))) &
                 (M_MAC_MDIO_DIR|M_MAC_MDIO_OUT);
 
         /* Check syscfg for synchronous serial on port 1 */
-        cfg = __raw_readq(KSEG1 + A_SCD_SYSTEM_CFG);
+        cfg = __raw_readq((void *)CKSEG1ADDR(A_SCD_SYSTEM_CFG));
         if (!(cfg & M_SYS_SER1_ENABLE)) {
-                __raw_writeq(cfg | M_SYS_SER1_ENABLE, KSEG1+A_SCD_SYSTEM_CFG);
-                cfg = __raw_readq(KSEG1 + A_SCD_SYSTEM_CFG);
+                __raw_writeq(cfg | M_SYS_SER1_ENABLE,
+			     (void *)CKSEG1ADDR(A_SCD_SYSTEM_CFG));
+                cfg = __raw_readq((void *)CKSEG1ADDR(A_SCD_SYSTEM_CFG));
                 if (!(cfg & M_SYS_SER1_ENABLE)) {
                   printk(KERN_INFO "cs4297a: serial port 1 not configured for synchronous operation\n");
                   return -1;
@@ -2605,12 +2609,14 @@ static int __init cs4297a_init(void)
                 
                 /* Force the codec (on SWARM) to reset by clearing
                    GENO, preserving MDIO (no effect on CSWARM) */
-                __raw_writeq(mdio_val, KSEG1+A_MAC_REGISTER(2, R_MAC_MDIO));
+                __raw_writeq(mdio_val,
+			     (void *)CKSEG1ADDR(A_MAC_REGISTER(2, R_MAC_MDIO)));
                 udelay(10);
         }
 
         /* Now set GENO */
-        __raw_writeq(mdio_val | M_MAC_GENC, KSEG1+A_MAC_REGISTER(2, R_MAC_MDIO));
+        __raw_writeq(mdio_val | M_MAC_GENC,
+		     (void *)CKSEG1ADDR(A_MAC_REGISTER(2, R_MAC_MDIO)));
         /* Give the codec some time to finish resetting (start the bit clock) */
         udelay(100);
 #endif
@@ -2665,8 +2671,6 @@ static int __init cs4297a_init(void)
         } while (!rval && (pwr != 0xf));
 
         if (!rval) {
-		char *sb1250_duart_present;
-
                 fs = get_fs();
                 set_fs(KERNEL_DS);
 #if 0
@@ -2688,9 +2692,20 @@ static int __init cs4297a_init(void)
 
                 cs4297a_read_ac97(s, AC97_VENDOR_ID1, &id);
 
+#if 0
+		/*
+		 * Since the rewrite of the SB1250 UART driver for the
+		 * drivers/serial subsystem there is no more
+		 * sb1250_duart_present symbol in the kernel so this resource
+		 * sharing mechanism which arguably has always been fishy
+		 * does no longer work.
+		 */
+		char *sb1250_duart_present_p;
+
 		sb1250_duart_present = symbol_get(sb1250_duart_present);
 		if (sb1250_duart_present)
 			sb1250_duart_present[1] = 0;
+#endif
 
                 printk(KERN_INFO "cs4297a: initialized (vendor id = %x)\n", id);
 
@@ -2732,6 +2747,7 @@ static void __exit cs4297a_cleanup(void)
 
 MODULE_AUTHOR("Kip Walker, Broadcom Corp.");
 MODULE_DESCRIPTION("Cirrus Logic CS4297a Driver for Broadcom SWARM board");
+MODULE_LICENSE("GPL");
 
 // --------------------------------------------------------------------- 
 
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ