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@xxxxxxxxxxxxxx> 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"); // ---------------------------------------------------------------------