Update of /cvsroot/alsa/alsa-driver/pcmcia/pdaudiocf
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv24448/pcmcia/pdaudiocf
Modified Files:
Makefile pdaudiocf_core.c pdaudiocf_irq.c pdaudiocf_pcm.c
Added Files:
pdaudiocf.patch
Removed Files:
pdaudiocf.c pdaudiocf.h
Log Message:
Sound Core PDAudioCF driver moved to alsa-kernel tree
--- NEW FILE: pdaudiocf.patch ---
--- ../../alsa-kernel/pcmcia/pdaudiocf/pdaudiocf.c 2004-02-23 20:06:42.000000000
+0100
+++ pdaudiocf.c 2004-02-23 20:07:37.000000000 +0100
@@ -18,12 +18,17 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
+/*
+ * please copy pdacf.conf to /etc/pcmcia directory
+ */
+
#include <sound/driver.h>
#include <sound/core.h>
#include <linux/slab.h>
#include <pcmcia/version.h>
#include <pcmcia/ciscode.h>
#include <pcmcia/cisreg.h>
+#include "compat_cs.h" /* remove from 2.5 tree */
#include "pdaudiocf.h"
#define SNDRV_GET_ID
#include <sound/initval.h>
@@ -74,6 +79,17 @@
static int pdacf_event(event_t event, int priority, event_callback_args_t *args);
static void snd_pdacf_detach(dev_link_t *link);
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 5, 0)
+/*
+ * print the error message related with cs
+ */
+static void cs_error(client_handle_t handle, int func, int ret)
+{
+ error_info_t err = { func, ret };
+ CardServices(ReportError, handle, &err);
+}
+#endif
+
static void pdacf_release(dev_link_t *link)
{
if (link->state & DEV_CONFIG) {
@@ -175,6 +191,10 @@
link->irq.IRQInfo2 |= 1 << irq_list[i];
link->irq.Handler = pdacf_interrupt;
link->irq.Instance = pdacf;
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 5, 0) /* correct version? */
+ link->release.function = (void (*)(unsigned long))pdacf_release;
+ link->release.data = (u_long)link;
+#endif
link->conf.Attributes = CONF_ENABLE_IRQ;
link->conf.IntType = INT_MEMORY_AND_IO;
link->conf.ConfigIndex = 1;
@@ -261,6 +281,9 @@
{
pdacf_t *chip = snd_magic_cast(pdacf_t, link->priv, return);
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 5, 0) /* correct version? */
+ del_timer(&link->release);
+#endif
snd_printdd(KERN_DEBUG "pdacf_detach called\n");
/* Remove the interface data from the linked list */
{
@@ -356,6 +379,9 @@
snd_printdd(KERN_DEBUG "CARD_REMOVAL..\n");
link->state &= ~DEV_PRESENT;
if (link->state & DEV_CONFIG) {
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 5, 0) /* correct version? */
+ mod_timer(&link->release, jiffies + HZ/20);
+#endif
chip->chip_status |= PDAUDIOCF_STAT_IS_STALE;
}
break;
@@ -424,3 +450,6 @@
module_init(init_pdacf);
module_exit(exit_pdacf);
+
+
+EXPORT_NO_SYMBOLS; /* FIXME: for old kernels */
Index: Makefile
===================================================================
RCS file: /cvsroot/alsa/alsa-driver/pcmcia/pdaudiocf/Makefile,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- Makefile 11 Nov 2003 13:12:26 -0000 1.3
+++ Makefile 23 Feb 2004 19:12:56 -0000 1.4
@@ -5,8 +5,10 @@
include $(SND_TOPDIR)/toplevel.config
include $(SND_TOPDIR)/Makefile.conf
-snd-pdaudiocf-objs := pdaudiocf.o pdaudiocf_core.o pdaudiocf_irq.o pdaudiocf_pcm.o
+clean-files := pdaudiocf.c
-obj-$(CONFIG_SND_PDAUDIOCF) += snd-pdaudiocf.o
+include $(SND_TOPDIR)/alsa-kernel/pcmcia/pdaudiocf/Makefile
include $(SND_TOPDIR)/Rules.make
+
+pdaudiocf.c: pdaudiocf.patch $(SND_TOPDIR)/alsa-kernel/pcmcia/pdaudiocf/pdaudiocf.c
Index: pdaudiocf_core.c
===================================================================
RCS file: /cvsroot/alsa/alsa-driver/pcmcia/pdaudiocf/pdaudiocf_core.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- pdaudiocf_core.c 24 Oct 2003 13:45:05 -0000 1.7
+++ pdaudiocf_core.c 23 Feb 2004 19:12:56 -0000 1.8
@@ -1,322 +1,3 @@
#define __NO_VERSION__
-/* --------- */
-/*
- * Driver for Sound Core PDAudioCF soundcard
- *
- * Copyright (c) 2003 by Jaroslav Kysela <[EMAIL PROTECTED]>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#include <sound/driver.h>
-#include <linux/delay.h>
-#include <sound/core.h>
-#include <sound/info.h>
-#include "pdaudiocf.h"
-#define SNDRV_GET_ID
-#include <sound/initval.h>
-
-/*
- *
- */
-unsigned char pdacf_ak4117_read(void *private_data, unsigned char reg)
-{
- pdacf_t *chip = snd_magic_cast(pdacf_t, private_data, return 0);
- unsigned long timeout;
- unsigned long flags;
- unsigned char res;
-
- spin_lock_irqsave(&chip->ak4117_lock, flags);
- timeout = 1000;
- while (pdacf_reg_read(chip, PDAUDIOCF_REG_SCR) & PDAUDIOCF_AK_SBP) {
- udelay(5);
- if (--timeout == 0) {
- spin_unlock_irqrestore(&chip->ak4117_lock, flags);
- snd_printk(KERN_ERR "AK4117 ready timeout (read)\n");
- return 0;
- }
- }
- pdacf_reg_write(chip, PDAUDIOCF_REG_AK_IFR, (u16)reg << 8);
- timeout = 1000;
- while (pdacf_reg_read(chip, PDAUDIOCF_REG_SCR) & PDAUDIOCF_AK_SBP) {
- udelay(5);
- if (--timeout == 0) {
- spin_unlock_irqrestore(&chip->ak4117_lock, flags);
- snd_printk(KERN_ERR "AK4117 read timeout (read2)\n");
- return 0;
- }
- }
- res = (unsigned char)pdacf_reg_read(chip, PDAUDIOCF_REG_AK_IFR);
- spin_unlock_irqrestore(&chip->ak4117_lock, flags);
- return res;
-}
-
-void pdacf_ak4117_write(void *private_data, unsigned char reg, unsigned char val)
-{
- pdacf_t *chip = snd_magic_cast(pdacf_t, private_data, return);
- unsigned long timeout;
- unsigned long flags;
-
- spin_lock_irqsave(&chip->ak4117_lock, flags);
- timeout = 1000;
- while (inw(chip->port + PDAUDIOCF_REG_SCR) & PDAUDIOCF_AK_SBP) {
- udelay(5);
- if (--timeout == 0) {
- spin_unlock_irqrestore(&chip->ak4117_lock, flags);
- snd_printk(KERN_ERR "AK4117 ready timeout (write)\n");
- return;
- }
- }
- outw((u16)reg << 8 | val | (1<<13), chip->port + PDAUDIOCF_REG_AK_IFR);
- spin_unlock_irqrestore(&chip->ak4117_lock, flags);
-}
-
-#if 0
-void pdacf_dump(pdacf_t *chip)
-{
- printk("PDAUDIOCF DUMP (0x%lx):\n", chip->port);
- printk("WPD : 0x%x\n", inw(chip->port + PDAUDIOCF_REG_WDP));
- printk("RDP : 0x%x\n", inw(chip->port + PDAUDIOCF_REG_RDP));
- printk("TCR : 0x%x\n", inw(chip->port + PDAUDIOCF_REG_TCR));
- printk("SCR : 0x%x\n", inw(chip->port + PDAUDIOCF_REG_SCR));
- printk("ISR : 0x%x\n", inw(chip->port + PDAUDIOCF_REG_ISR));
- printk("IER : 0x%x\n", inw(chip->port + PDAUDIOCF_REG_IER));
- printk("AK_IFR : 0x%x\n", inw(chip->port + PDAUDIOCF_REG_AK_IFR));
-}
-#endif
-
-static int pdacf_reset(pdacf_t *chip, int powerdown)
-{
- u16 val;
-
- val = pdacf_reg_read(chip, PDAUDIOCF_REG_SCR);
- val |= PDAUDIOCF_PDN;
- val &= ~PDAUDIOCF_RECORD; /* for sure */
- pdacf_reg_write(chip, PDAUDIOCF_REG_SCR, val);
- udelay(5);
- val |= PDAUDIOCF_RST;
- pdacf_reg_write(chip, PDAUDIOCF_REG_SCR, val);
- udelay(200);
- val &= ~PDAUDIOCF_RST;
- pdacf_reg_write(chip, PDAUDIOCF_REG_SCR, val);
- udelay(5);
- if (!powerdown) {
- val &= ~PDAUDIOCF_PDN;
- pdacf_reg_write(chip, PDAUDIOCF_REG_SCR, val);
- udelay(200);
- }
- return 0;
-}
-
-void pdacf_reinit(pdacf_t *chip, int resume)
-{
- pdacf_reset(chip, 0);
- if (resume)
- pdacf_reg_write(chip, PDAUDIOCF_REG_SCR, chip->suspend_reg_scr);
- snd_ak4117_reinit(chip->ak4117);
- pdacf_reg_write(chip, PDAUDIOCF_REG_TCR, chip->regmap[PDAUDIOCF_REG_TCR>>1]);
- pdacf_reg_write(chip, PDAUDIOCF_REG_IER, chip->regmap[PDAUDIOCF_REG_IER>>1]);
-}
-
-static void pdacf_proc_read(snd_info_entry_t * entry,
- snd_info_buffer_t * buffer)
-{
- pdacf_t *chip = snd_magic_cast(pdacf_t, entry->private_data, return);
- u16 tmp;
-
- snd_iprintf(buffer, "PDAudioCF\n\n");
- tmp = pdacf_reg_read(chip, PDAUDIOCF_REG_SCR);
- snd_iprintf(buffer, "FPGA revision : 0x%x\n", PDAUDIOCF_FPGAREV(tmp));
-
-}
-
-static void pdacf_proc_init(pdacf_t *chip)
-{
- snd_info_entry_t *entry;
-
- if (! snd_card_proc_new(chip->card, "pdaudiocf", &entry))
- snd_info_set_text_ops(entry, chip, 1024, pdacf_proc_read);
-}
-
-pdacf_t *snd_pdacf_create(snd_card_t *card)
-{
- pdacf_t *chip;
-
- chip = snd_magic_kcalloc(pdacf_t, 0, GFP_KERNEL);
- if (chip == NULL)
- return NULL;
- chip->card = card;
- spin_lock_init(&chip->reg_lock);
- spin_lock_init(&chip->ak4117_lock);
- tasklet_init(&chip->tq, pdacf_tasklet, (unsigned long)chip);
- card->private_data = chip;
-
- pdacf_proc_init(chip);
- return chip;
-}
-
-static void snd_pdacf_ak4117_change(ak4117_t *ak4117, unsigned char c0, unsigned char
c1)
-{
- pdacf_t *chip = ak4117->change_callback_private;
- unsigned long flags;
- u16 val;
-
- if (!(c0 & AK4117_UNLCK))
- return;
- spin_lock_irqsave(&chip->reg_lock, flags);
- val = chip->regmap[PDAUDIOCF_REG_SCR>>1];
- if (ak4117->rcs0 & AK4117_UNLCK)
- val |= PDAUDIOCF_BLUE_LED_OFF;
- else
- val &= ~PDAUDIOCF_BLUE_LED_OFF;
- pdacf_reg_write(chip, PDAUDIOCF_REG_SCR, val);
- spin_unlock_irqrestore(&chip->reg_lock, flags);
-}
-
-int snd_pdacf_ak4117_create(pdacf_t *chip)
-{
- int err;
- u16 val;
- /* design note: if we unmask PLL unlock, parity, valid, audio or auto bit
interrupts */
- /* from AK4117 then INT1 pin from AK4117 will be high all time, because PCMCIA
interrupts are */
- /* egde based and FPGA does logical OR for all interrupt sources, we cannot
use these */
- /* high-rate sources */
- static unsigned char pgm[5] = {
- AK4117_XTL_24_576M | AK4117_EXCT, /*
AK4117_REG_PWRDN */
- AK4117_CM_PLL_XTAL | AK4117_PKCS_128fs | AK4117_XCKS_128fs, /*
AK4117_REQ_CLOCK */
- AK4117_EFH_1024LRCLK | AK4117_DIF_24R | AK4117_IPS, /*
AK4117_REG_IO */
- 0xff, /*
AK4117_REG_INT0_MASK */
- AK4117_MAUTO | AK4117_MAUD | AK4117_MULK | AK4117_MPAR | AK4117_MV, /*
AK4117_REG_INT1_MASK */
- };
-
- err = pdacf_reset(chip, 0);
- if (err < 0)
- return err;
- err = snd_ak4117_create(chip->card, pdacf_ak4117_read, pdacf_ak4117_write,
pgm, chip, &chip->ak4117);
- if (err < 0)
- return err;
-
- val = pdacf_reg_read(chip, PDAUDIOCF_REG_TCR);
-#if 1 /* normal operation */
- val &= ~(PDAUDIOCF_ELIMAKMBIT|PDAUDIOCF_TESTDATASEL);
-#else /* debug */
- val |= PDAUDIOCF_ELIMAKMBIT;
- val &= ~PDAUDIOCF_TESTDATASEL;
-#endif
- pdacf_reg_write(chip, PDAUDIOCF_REG_TCR, val);
-
- /* setup the FPGA to match AK4117 setup */
- val = pdacf_reg_read(chip, PDAUDIOCF_REG_SCR);
- val &= ~(PDAUDIOCF_CLKDIV0 | PDAUDIOCF_CLKDIV1); /* use
24.576Mhz clock */
- val &= ~(PDAUDIOCF_RED_LED_OFF|PDAUDIOCF_BLUE_LED_OFF);
- val |= PDAUDIOCF_DATAFMT0 | PDAUDIOCF_DATAFMT1; /* 24-bit data
*/
- pdacf_reg_write(chip, PDAUDIOCF_REG_SCR, val);
-
- /* setup LEDs and IRQ */
- val = pdacf_reg_read(chip, PDAUDIOCF_REG_IER);
- val &= ~(PDAUDIOCF_IRQLVLEN0 | PDAUDIOCF_IRQLVLEN1);
- val &= ~(PDAUDIOCF_BLUEDUTY0 | PDAUDIOCF_REDDUTY0 | PDAUDIOCF_REDDUTY1);
- val |= PDAUDIOCF_BLUEDUTY1 | PDAUDIOCF_HALFRATE;
- val |= PDAUDIOCF_IRQOVREN | PDAUDIOCF_IRQAKMEN;
- pdacf_reg_write(chip, PDAUDIOCF_REG_IER, val);
-
- chip->ak4117->change_callback_private = chip;
- chip->ak4117->change_callback = snd_pdacf_ak4117_change;
-
- /* update LED status */
- snd_pdacf_ak4117_change(chip->ak4117, AK4117_UNLCK, 0);
-
- return 0;
-}
-
-void snd_pdacf_powerdown(pdacf_t *chip)
-{
- u16 val;
-
- val = pdacf_reg_read(chip, PDAUDIOCF_REG_SCR);
- chip->suspend_reg_scr = val;
- val |= PDAUDIOCF_RED_LED_OFF | PDAUDIOCF_BLUE_LED_OFF;
- pdacf_reg_write(chip, PDAUDIOCF_REG_SCR, val);
- /* disable interrupts, but use direct write to preserve old register value in
chip->regmap */
- val = inw(chip->port + PDAUDIOCF_REG_IER);
- val &=
~(PDAUDIOCF_IRQOVREN|PDAUDIOCF_IRQAKMEN|PDAUDIOCF_IRQLVLEN0|PDAUDIOCF_IRQLVLEN1);
- outw(val, chip->port + PDAUDIOCF_REG_IER);
- pdacf_reset(chip, 1);
-}
-
-#ifdef CONFIG_PM
-
-void snd_pdacf_suspend(pdacf_t *chip)
-{
- snd_card_t *card = chip->card;
- u16 val;
-
- if (card->power_state == SNDRV_CTL_POWER_D3hot)
- return;
- snd_pcm_suspend_all(chip->pcm);
- /* disable interrupts, but use direct write to preserve old register value in
chip->regmap */
- val = inw(chip->port + PDAUDIOCF_REG_IER);
- val &=
~(PDAUDIOCF_IRQOVREN|PDAUDIOCF_IRQAKMEN|PDAUDIOCF_IRQLVLEN0|PDAUDIOCF_IRQLVLEN1);
- outw(val, chip->port + PDAUDIOCF_REG_IER);
- chip->chip_status |= PDAUDIOCF_STAT_IS_SUSPENDED; /* ignore interrupts
from now */
- snd_pdacf_powerdown(chip);
- snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
-}
-
-static inline int check_signal(pdacf_t *chip)
-{
- return (chip->ak4117->rcs0 & AK4117_UNLCK) == 0;
-}
-
-void snd_pdacf_resume(pdacf_t *chip)
-{
- snd_card_t *card = chip->card;
- int timeout = 40;
-
- if (card->power_state == SNDRV_CTL_POWER_D0)
- return;
- pdacf_reinit(chip, 1);
- /* wait for AK4117's PLL */
- while (timeout-- > 0 &&
- (snd_ak4117_external_rate(chip->ak4117) <= 0 || !check_signal(chip)))
- mdelay(1);
- chip->chip_status &= ~PDAUDIOCF_STAT_IS_SUSPENDED;
- snd_power_change_state(card, SNDRV_CTL_POWER_D0);
-}
-
-int snd_pdacf_set_power_state(snd_card_t *card, unsigned int power_state)
-{
- pdacf_t *chip = snd_magic_cast(pdacf_t, card->power_state_private_data, return
-ENXIO);
-
- switch (power_state) {
- case SNDRV_CTL_POWER_D0:
- case SNDRV_CTL_POWER_D1:
- case SNDRV_CTL_POWER_D2:
- snd_pdacf_resume(chip);
- break;
- case SNDRV_CTL_POWER_D3hot:
- case SNDRV_CTL_POWER_D3cold:
- snd_pdacf_suspend(chip);
- break;
- default:
- return -EINVAL;
- }
- return 0;
-}
-
-#endif
-
-/* --------- */
+#include "../../alsa-kernel/pcmcia/pdaudiocf/pdaudiocf_core.c"
EXPORT_NO_SYMBOLS;
Index: pdaudiocf_irq.c
===================================================================
RCS file: /cvsroot/alsa/alsa-driver/pcmcia/pdaudiocf/pdaudiocf_irq.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- pdaudiocf_irq.c 15 Jul 2003 12:27:31 -0000 1.2
+++ pdaudiocf_irq.c 23 Feb 2004 19:12:56 -0000 1.3
@@ -1,330 +1,3 @@
#define __NO_VERSION__
-/* --------- */
-/*
- * Driver for Sound Core PDAudioCF soundcard
- *
- * Copyright (c) 2003 by Jaroslav Kysela <[EMAIL PROTECTED]>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#include <sound/driver.h>
-#include <sound/core.h>
-#include "pdaudiocf.h"
-#define SNDRV_GET_ID
-#include <sound/initval.h>
-
-/*
- *
- */
-void pdacf_interrupt(int irq, void *dev, struct pt_regs *regs)
-{
- pdacf_t *chip = snd_magic_cast(pdacf_t, dev, return);
- unsigned short stat;
-
- if ((chip->chip_status & (PDAUDIOCF_STAT_IS_STALE|
- PDAUDIOCF_STAT_IS_CONFIGURED|
- PDAUDIOCF_STAT_IS_SUSPENDED)) !=
PDAUDIOCF_STAT_IS_CONFIGURED)
- return;
-
- stat = inw(chip->port + PDAUDIOCF_REG_ISR);
- if (stat & (PDAUDIOCF_IRQLVL|PDAUDIOCF_IRQOVR)) {
- if (stat & PDAUDIOCF_IRQOVR) /* should never happen */
- snd_printk(KERN_ERR "PDAUDIOCF SRAM buffer overrun
detected!\n");
- if (chip->pcm_substream)
- tasklet_hi_schedule(&chip->tq);
- if (!(stat & PDAUDIOCF_IRQAKM))
- stat |= PDAUDIOCF_IRQAKM; /* check rate */
- }
- if (regs != NULL)
- snd_ak4117_check_rate_and_errors(chip->ak4117, 0);
-}
-
-static inline void pdacf_transfer_mono16(u16 *dst, u16 xor, unsigned int size,
unsigned long rdp_port)
-{
- while (size-- > 0) {
- *dst++ = inw(rdp_port) ^ xor;
- inw(rdp_port);
- }
-}
-
-static inline void pdacf_transfer_mono32(u32 *dst, u32 xor, unsigned int size,
unsigned long rdp_port)
-{
- register u16 val1, val2;
-
- while (size-- > 0) {
- val1 = inw(rdp_port);
- val2 = inw(rdp_port);
- inw(rdp_port);
- *dst++ = ((((u32)val2 & 0xff) << 24) | ((u32)val1 << 8)) ^ xor;
- }
-}
-
-static inline void pdacf_transfer_stereo16(u16 *dst, u16 xor, unsigned int size,
unsigned long rdp_port)
-{
- while (size-- > 0) {
- *dst++ = inw(rdp_port) ^ xor;
- *dst++ = inw(rdp_port) ^ xor;
- }
-}
-
-static inline void pdacf_transfer_stereo32(u32 *dst, u32 xor, unsigned int size,
unsigned long rdp_port)
-{
- register u16 val1, val2, val3;
-
- while (size-- > 0) {
- val1 = inw(rdp_port);
- val2 = inw(rdp_port);
- val3 = inw(rdp_port);
- *dst++ = ((((u32)val2 & 0xff) << 24) | ((u32)val1 << 8)) ^ xor;
- *dst++ = (((u32)val3 << 16) | (val2 & 0xff00)) ^ xor;
- }
-}
-
-static inline void pdacf_transfer_mono16sw(u16 *dst, u16 xor, unsigned int size,
unsigned long rdp_port)
-{
- while (size-- > 0) {
- *dst++ = swab16(inw(rdp_port) ^ xor);
- inw(rdp_port);
- }
-}
-
-static inline void pdacf_transfer_mono32sw(u32 *dst, u32 xor, unsigned int size,
unsigned long rdp_port)
-{
- register u16 val1, val2;
-
- while (size-- > 0) {
- val1 = inw(rdp_port);
- val2 = inw(rdp_port);
- inw(rdp_port);
- *dst++ = swab32((((val2 & 0xff) << 24) | ((u32)val1 << 8)) ^ xor);
- }
-}
-
-static inline void pdacf_transfer_stereo16sw(u16 *dst, u16 xor, unsigned int size,
unsigned long rdp_port)
-{
- while (size-- > 0) {
- *dst++ = swab16(inw(rdp_port) ^ xor);
- *dst++ = swab16(inw(rdp_port) ^ xor);
- }
-}
-
-static inline void pdacf_transfer_stereo32sw(u32 *dst, u32 xor, unsigned int size,
unsigned long rdp_port)
-{
- register u16 val1, val2, val3;
-
- while (size-- > 0) {
- val1 = inw(rdp_port);
- val2 = inw(rdp_port);
- val3 = inw(rdp_port);
- *dst++ = swab32((((val2 & 0xff) << 24) | ((u32)val1 << 8)) ^ xor);
- *dst++ = swab32((((u32)val3 << 16) | (val2 & 0xff00)) ^ xor);
- }
-}
-
-static inline void pdacf_transfer_mono24le(u8 *dst, u16 xor, unsigned int size,
unsigned long rdp_port)
-{
- register u16 val1, val2;
- register u32 xval1;
-
- while (size-- > 0) {
- val1 = inw(rdp_port);
- val2 = inw(rdp_port);
- inw(rdp_port);
- xval1 = (((val2 & 0xff) << 8) | (val1 << 16)) ^ xor;
- *dst++ = (u8)(xval1 >> 8);
- *dst++ = (u8)(xval1 >> 16);
- *dst++ = (u8)(xval1 >> 24);
- }
-}
-
-static inline void pdacf_transfer_mono24be(u8 *dst, u16 xor, unsigned int size,
unsigned long rdp_port)
-{
- register u16 val1, val2;
- register u32 xval1;
-
- while (size-- > 0) {
- val1 = inw(rdp_port);
- val2 = inw(rdp_port);
- inw(rdp_port);
- xval1 = (((val2 & 0xff) << 8) | (val1 << 16)) ^ xor;
- *dst++ = (u8)(xval1 >> 24);
- *dst++ = (u8)(xval1 >> 16);
- *dst++ = (u8)(xval1 >> 8);
- }
-}
-
-static inline void pdacf_transfer_stereo24le(u8 *dst, u32 xor, unsigned int size,
unsigned long rdp_port)
-{
- register u16 val1, val2, val3;
- register u32 xval1, xval2;
-
- while (size-- > 0) {
- val1 = inw(rdp_port);
- val2 = inw(rdp_port);
- val3 = inw(rdp_port);
- xval1 = ((((u32)val2 & 0xff) << 24) | ((u32)val1 << 8)) ^ xor;
- xval2 = (((u32)val3 << 16) | (val2 & 0xff00)) ^ xor;
- *dst++ = (u8)(xval1 >> 8);
- *dst++ = (u8)(xval1 >> 16);
- *dst++ = (u8)(xval1 >> 24);
- *dst++ = (u8)(xval2 >> 8);
- *dst++ = (u8)(xval2 >> 16);
- *dst++ = (u8)(xval2 >> 24);
- }
-}
-
-static inline void pdacf_transfer_stereo24be(u8 *dst, u32 xor, unsigned int size,
unsigned long rdp_port)
-{
- register u16 val1, val2, val3;
- register u32 xval1, xval2;
-
- while (size-- > 0) {
- val1 = inw(rdp_port);
- val2 = inw(rdp_port);
- val3 = inw(rdp_port);
- xval1 = ((((u32)val2 & 0xff) << 24) | ((u32)val1 << 8)) ^ xor;
- xval2 = (((u32)val3 << 16) | (val2 & 0xff00)) ^ xor;
- *dst++ = (u8)(xval1 >> 24);
- *dst++ = (u8)(xval1 >> 16);
- *dst++ = (u8)(xval1 >> 8);
- *dst++ = (u8)(xval2 >> 24);
- *dst++ = (u8)(xval2 >> 16);
- *dst++ = (u8)(xval2 >> 8);
- }
-}
-
-static void pdacf_transfer(pdacf_t *chip, unsigned int size, unsigned int off)
-{
- unsigned long rdp_port = chip->port + PDAUDIOCF_REG_MD;
- unsigned int xor = chip->pcm_xor;
-
- if (chip->pcm_sample == 3) {
- if (chip->pcm_little) {
- if (chip->pcm_channels == 1) {
- pdacf_transfer_mono24le((char *)chip->pcm_area + (off
* 3), xor, size, rdp_port);
- } else {
- pdacf_transfer_stereo24le((char *)chip->pcm_area +
(off * 6), xor, size, rdp_port);
- }
- } else {
- if (chip->pcm_channels == 1) {
- pdacf_transfer_mono24be((char *)chip->pcm_area + (off
* 3), xor, size, rdp_port);
- } else {
- pdacf_transfer_stereo24be((char *)chip->pcm_area +
(off * 6), xor, size, rdp_port);
- }
- }
- return;
- }
- if (chip->pcm_swab == 0) {
- if (chip->pcm_channels == 1) {
- if (chip->pcm_frame == 2) {
- pdacf_transfer_mono16((u16 *)chip->pcm_area + off,
xor, size, rdp_port);
- } else {
- pdacf_transfer_mono32((u32 *)chip->pcm_area + off,
xor, size, rdp_port);
- }
- } else {
- if (chip->pcm_frame == 2) {
- pdacf_transfer_stereo16((u16 *)chip->pcm_area + (off *
2), xor, size, rdp_port);
- } else {
- pdacf_transfer_stereo32((u32 *)chip->pcm_area + (off *
2), xor, size, rdp_port);
- }
- }
- } else {
- if (chip->pcm_channels == 1) {
- if (chip->pcm_frame == 2) {
- pdacf_transfer_mono16sw((u16 *)chip->pcm_area + off,
xor, size, rdp_port);
- } else {
- pdacf_transfer_mono32sw((u32 *)chip->pcm_area + off,
xor, size, rdp_port);
- }
- } else {
- if (chip->pcm_frame == 2) {
- pdacf_transfer_stereo16sw((u16 *)chip->pcm_area + (off
* 2), xor, size, rdp_port);
- } else {
- pdacf_transfer_stereo32sw((u32 *)chip->pcm_area + (off
* 2), xor, size, rdp_port);
- }
- }
- }
-}
-
-void pdacf_tasklet(unsigned long private_data)
-{
- pdacf_t *chip = snd_magic_cast(pdacf_t, (void *)private_data, return);
- int size, off, cont, rdp, wdp;
-
- if ((chip->chip_status &
(PDAUDIOCF_STAT_IS_STALE|PDAUDIOCF_STAT_IS_CONFIGURED)) !=
PDAUDIOCF_STAT_IS_CONFIGURED)
- return;
-
- if (chip->pcm_substream == NULL || chip->pcm_substream->runtime == NULL ||
!snd_pcm_running(chip->pcm_substream))
- return;
-
- (unsigned int)rdp = inw(chip->port + PDAUDIOCF_REG_RDP);
- (unsigned int)wdp = inw(chip->port + PDAUDIOCF_REG_WDP);
- // printk("TASKLET: rdp = %x, wdp = %x\n", rdp, wdp);
- size = wdp - rdp;
- if (size < 0)
- size += 0x10000;
- if (size == 0)
- size = 0x10000;
- size /= chip->pcm_frame;
- if (size > 64)
- size -= 32;
-
-#if 0
- chip->pcm_hwptr += size;
- chip->pcm_hwptr %= chip->pcm_size;
- chip->pcm_tdone += size;
- if (chip->pcm_frame == 2) {
- unsigned long rdp_port = chip->port + PDAUDIOCF_REG_MD;
- while (size-- > 0) {
- inw(rdp_port);
- inw(rdp_port);
- }
- } else {
- unsigned long rdp_port = chip->port + PDAUDIOCF_REG_MD;
- while (size-- > 0) {
- inw(rdp_port);
- inw(rdp_port);
- inw(rdp_port);
- }
- }
-#else
- off = chip->pcm_hwptr + chip->pcm_tdone;
- off %= chip->pcm_size;
- chip->pcm_tdone += size;
- while (size > 0) {
- cont = chip->pcm_size - off;
- if (cont > size)
- cont = size;
- pdacf_transfer(chip, cont, off);
- off += cont;
- off %= chip->pcm_size;
- size -= cont;
- }
-#endif
- spin_lock(&chip->reg_lock);
- while (chip->pcm_tdone >= chip->pcm_period) {
- chip->pcm_hwptr += chip->pcm_period;
- chip->pcm_hwptr %= chip->pcm_size;
- chip->pcm_tdone -= chip->pcm_period;
- spin_unlock(&chip->reg_lock);
- snd_pcm_period_elapsed(chip->pcm_substream);
- spin_lock(&chip->reg_lock);
- }
- spin_unlock(&chip->reg_lock);
- // printk("TASKLET: end\n");
-}
-
-/* --------- */
+#include "../../alsa-kernel/pcmcia/pdaudiocf/pdaudiocf_irq.c"
EXPORT_NO_SYMBOLS;
Index: pdaudiocf_pcm.c
===================================================================
RCS file: /cvsroot/alsa/alsa-driver/pcmcia/pdaudiocf/pdaudiocf_pcm.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- pdaudiocf_pcm.c 20 Aug 2003 09:57:44 -0000 1.4
+++ pdaudiocf_pcm.c 23 Feb 2004 19:12:56 -0000 1.5
@@ -1,365 +1,3 @@
#define __NO_VERSION__
-
-/*
- * Driver for Sound Core PDAudioCF soundcards
- *
- * PCM part
- *
- * Copyright (c) 2003 by Jaroslav Kysela <[EMAIL PROTECTED]>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#include <sound/driver.h>
-#include <linux/slab.h>
-#include <linux/vmalloc.h>
-#include <linux/delay.h>
-#include <sound/core.h>
-#include <sound/asoundef.h>
-#include "pdaudiocf.h"
-
-#define chip_t pdacf_t
-
-
-/*
- * we use a vmalloc'ed (sg-)buffer
- */
-
-/* get the physical page pointer on the given offset */
-static struct page *snd_pcm_get_vmalloc_page(snd_pcm_substream_t *subs, unsigned long
offset)
-{
- void *pageptr = subs->runtime->dma_area + offset;
- return vmalloc_to_page(pageptr);
-}
-
-/*
- * hw_params callback
- * NOTE: this may be called not only once per pcm open!
- */
-static int snd_pcm_alloc_vmalloc_buffer(snd_pcm_substream_t *subs, size_t size)
-{
- snd_pcm_runtime_t *runtime = subs->runtime;
- if (runtime->dma_area) {
- if (runtime->dma_bytes >= size)
- return 0; /* already enough large */
- vfree_nocheck(runtime->dma_area);
- }
- runtime->dma_area = vmalloc_nocheck(size);
- if (! runtime->dma_area)
- return -ENOMEM;
- runtime->dma_bytes = size;
- return 0;
-}
-
-/*
- * hw_free callback
- * NOTE: this may be called not only once per pcm open!
- */
-static int snd_pcm_free_vmalloc_buffer(snd_pcm_substream_t *subs)
-{
- snd_pcm_runtime_t *runtime = subs->runtime;
- if (runtime->dma_area) {
- vfree_nocheck(runtime->dma_area);
- runtime->dma_area = NULL;
- }
- return 0;
-}
-
-/*
- * clear the SRAM contents
- */
-static int pdacf_pcm_clear_sram(pdacf_t *chip)
-{
- int max_loop = 64 * 1024;
-
- while (inw(chip->port + PDAUDIOCF_REG_RDP) != inw(chip->port +
PDAUDIOCF_REG_WDP)) {
- if (max_loop-- < 0)
- return -EIO;
- inw(chip->port + PDAUDIOCF_REG_MD);
- }
- return 0;
-}
-
-/*
- * pdacf_pcm_trigger - trigger callback for capture
- */
-static int pdacf_pcm_trigger(snd_pcm_substream_t *subs, int cmd)
-{
- pdacf_t *chip = snd_pcm_substream_chip(subs);
- snd_pcm_runtime_t *runtime = subs->runtime;
- int inc, ret = 0, rate;
- unsigned short mask, val, tmp;
-
- if (chip->chip_status & PDAUDIOCF_STAT_IS_STALE)
- return -EBUSY;
-
- switch (cmd) {
- case SNDRV_PCM_TRIGGER_START:
- chip->pcm_hwptr = 0;
- chip->pcm_tdone = 0;
- /* fall thru */
- case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
- case SNDRV_PCM_TRIGGER_RESUME:
- mask = 0;
- val = PDAUDIOCF_RECORD;
- inc = 1;
- rate = snd_ak4117_check_rate_and_errors(chip->ak4117,
AK4117_CHECK_NO_STAT|AK4117_CHECK_NO_RATE);
- break;
- case SNDRV_PCM_TRIGGER_STOP:
- case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
- case SNDRV_PCM_TRIGGER_SUSPEND:
- mask = PDAUDIOCF_RECORD;
- val = 0;
- inc = -1;
- rate = 0;
- break;
- default:
- return -EINVAL;
- }
- spin_lock(&chip->reg_lock);
- chip->pcm_running += inc;
- tmp = pdacf_reg_read(chip, PDAUDIOCF_REG_SCR);
- if (chip->pcm_running) {
- if ((chip->ak4117->rcs0 & AK4117_UNLCK) || runtime->rate != rate) {
- chip->pcm_running -= inc;
- ret = -EIO;
- goto __end;
- }
- }
- tmp &= ~mask;
- tmp |= val;
- pdacf_reg_write(chip, PDAUDIOCF_REG_SCR, tmp);
- __end:
- spin_unlock(&chip->reg_lock);
- snd_ak4117_check_rate_and_errors(chip->ak4117, AK4117_CHECK_NO_RATE);
- return ret;
-}
-
-/*
- * pdacf_pcm_hw_params - hw_params callback for playback and capture
- */
-static int pdacf_pcm_hw_params(snd_pcm_substream_t *subs,
- snd_pcm_hw_params_t *hw_params)
-{
- return snd_pcm_alloc_vmalloc_buffer(subs, params_buffer_bytes(hw_params));
-}
-
-/*
- * pdacf_pcm_hw_free - hw_free callback for playback and capture
- */
-static int pdacf_pcm_hw_free(snd_pcm_substream_t *subs)
-{
- return snd_pcm_free_vmalloc_buffer(subs);
-}
-
-/*
- * pdacf_pcm_prepare - prepare callback for playback and capture
- */
-static int pdacf_pcm_prepare(snd_pcm_substream_t *subs)
-{
- pdacf_t *chip = snd_pcm_substream_chip(subs);
- snd_pcm_runtime_t *runtime = subs->runtime;
- u16 val, nval, aval;
-
- if (chip->chip_status & PDAUDIOCF_STAT_IS_STALE)
- return -EBUSY;
-
- chip->pcm_channels = runtime->channels;
-
- chip->pcm_little = snd_pcm_format_little_endian(runtime->format) > 0;
-#ifdef SNDRV_LITTLE_ENDIAN
- chip->pcm_swab = snd_pcm_format_big_endian(runtime->format) > 0;
-#else
- chip->pcm_swab = chip->pcm_little;
-#endif
-
- if (snd_pcm_format_unsigned(runtime->format))
- chip->pcm_xor = 0x80008000;
-
- if (pdacf_pcm_clear_sram(chip) < 0)
- return -EIO;
-
- val = nval = pdacf_reg_read(chip, PDAUDIOCF_REG_SCR);
- nval &= ~(PDAUDIOCF_DATAFMT0|PDAUDIOCF_DATAFMT1);
- switch (runtime->format) {
- case SNDRV_PCM_FORMAT_S16_LE:
- case SNDRV_PCM_FORMAT_S16_BE:
- break;
- default: /* 24-bit */
- nval |= PDAUDIOCF_DATAFMT0 | PDAUDIOCF_DATAFMT1;
- break;
- }
- aval = 0;
- chip->pcm_sample = 4;
- switch (runtime->format) {
- case SNDRV_PCM_FORMAT_S16_LE:
- case SNDRV_PCM_FORMAT_S16_BE:
- aval = AK4117_DIF_16R;
- chip->pcm_frame = 2;
- chip->pcm_sample = 2;
- break;
- case SNDRV_PCM_FORMAT_S24_3LE:
- case SNDRV_PCM_FORMAT_S24_3BE:
- chip->pcm_sample = 3;
- /* fall trough */
- default: /* 24-bit */
- aval = AK4117_DIF_24R;
- chip->pcm_frame = 3;
- chip->pcm_xor &= 0xffff0000;
- break;
- }
-
- if (val != nval) {
- snd_ak4117_reg_write(chip->ak4117, AK4117_REG_IO,
AK4117_DIF2|AK4117_DIF1|AK4117_DIF0, aval);
- pdacf_reg_write(chip, PDAUDIOCF_REG_SCR, nval);
- }
-
- val = pdacf_reg_read(chip, PDAUDIOCF_REG_IER);
- val &= ~(PDAUDIOCF_IRQLVLEN1);
- val |= PDAUDIOCF_IRQLVLEN0;
- pdacf_reg_write(chip, PDAUDIOCF_REG_IER, val);
-
- chip->pcm_size = runtime->buffer_size;
- chip->pcm_period = runtime->period_size;
- chip->pcm_area = runtime->dma_area;
-
- return 0;
-}
-
-
-/*
- * capture hw information
- */
-
-static snd_pcm_hardware_t pdacf_pcm_capture_hw = {
- .info = (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED |
- SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_RESUME |
- SNDRV_PCM_INFO_MMAP_VALID),
- .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S16_BE |
- SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S24_3BE |
- SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_S32_BE,
- .rates = SNDRV_PCM_RATE_32000 |
- SNDRV_PCM_RATE_44100 |
- SNDRV_PCM_RATE_48000 |
- SNDRV_PCM_RATE_88200 |
- SNDRV_PCM_RATE_96000 |
- SNDRV_PCM_RATE_176400 |
- SNDRV_PCM_RATE_192000,
- .rate_min = 32000,
- .rate_max = 192000,
- .channels_min = 1,
- .channels_max = 2,
- .buffer_bytes_max = (512*1024),
- .period_bytes_min = 8*1024,
- .period_bytes_max = (64*1024),
- .periods_min = 2,
- .periods_max = 128,
- .fifo_size = 0,
-};
-
-
-/*
- * pdacf_pcm_capture_open - open callback for capture
- */
-static int pdacf_pcm_capture_open(snd_pcm_substream_t *subs)
-{
- snd_pcm_runtime_t *runtime = subs->runtime;
- pdacf_t *chip = snd_pcm_substream_chip(subs);
-
- if (chip->chip_status & PDAUDIOCF_STAT_IS_STALE)
- return -EBUSY;
-
- runtime->hw = pdacf_pcm_capture_hw;
- runtime->private_data = chip;
- chip->pcm_substream = subs;
-
- return 0;
-}
-
-/*
- * pdacf_pcm_capture_close - close callback for capture
- */
-static int pdacf_pcm_capture_close(snd_pcm_substream_t *subs)
-{
- pdacf_t *chip = snd_pcm_substream_chip(subs);
-
- if (!chip)
- return -EINVAL;
- pdacf_reinit(chip, 0);
- chip->pcm_substream = NULL;
- return 0;
-}
-
-
-/*
- * pdacf_pcm_capture_pointer - pointer callback for capture
- */
-static snd_pcm_uframes_t pdacf_pcm_capture_pointer(snd_pcm_substream_t *subs)
-{
- pdacf_t *chip = snd_pcm_substream_chip(subs);
- return chip->pcm_hwptr;
-}
-
-/*
- * operators for PCM capture
- */
-static snd_pcm_ops_t pdacf_pcm_capture_ops = {
- .open = pdacf_pcm_capture_open,
- .close = pdacf_pcm_capture_close,
- .ioctl = snd_pcm_lib_ioctl,
- .hw_params = pdacf_pcm_hw_params,
- .hw_free = pdacf_pcm_hw_free,
- .prepare = pdacf_pcm_prepare,
- .trigger = pdacf_pcm_trigger,
- .pointer = pdacf_pcm_capture_pointer,
- .page = snd_pcm_get_vmalloc_page,
-};
-
-
-/*
- * free callback for pcm
- */
-static void snd_pdacf_pcm_free(snd_pcm_t *pcm)
-{
- pdacf_t *chip = snd_magic_cast(pdacf_t, pcm->private_data, return);
- chip->pcm = NULL;
-}
-
-/*
- * snd_pdacf_pcm_new - create and initialize a pcm
- */
-int snd_pdacf_pcm_new(pdacf_t *chip)
-{
- snd_pcm_t *pcm;
- int err;
-
- err = snd_pcm_new(chip->card, "PDAudioCF", 0, 0, 1, &pcm);
- if (err < 0)
- return err;
-
- snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &pdacf_pcm_capture_ops);
-
- pcm->private_data = chip;
- pcm->private_free = snd_pdacf_pcm_free;
- pcm->info_flags = 0;
- strcpy(pcm->name, chip->card->shortname);
- chip->pcm = pcm;
-
- err = snd_ak4117_build(chip->ak4117,
pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream);
- if (err < 0)
- return err;
-
- return 0;
-}
+#include "../../alsa-kernel/pcmcia/pdaudiocf/pdaudiocf_pcm.c"
+EXPORT_NO_SYMBOLS;
--- pdaudiocf.c DELETED ---
--- pdaudiocf.h DELETED ---
-------------------------------------------------------
SF.Net is sponsored by: Speed Start Your Linux Apps Now.
Build and deploy apps & Web services for Linux with
a free DVD software kit from IBM. Click Now!
http://ads.osdn.com/?ad_id=1356&alloc_id=3438&op=click
_______________________________________________
Alsa-cvslog mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-cvslog