* [PATCH V1 0/3] Split the DMA core out from mpc5200_psc_i2s.c
@ 2009-04-26 19:53 Jon Smirl
2009-04-26 19:53 ` [PATCH V1 1/3] Basic split of mpc5200 DMA code out from mpc5200_psc_i2s Jon Smirl
` (2 more replies)
0 siblings, 3 replies; 10+ messages in thread
From: Jon Smirl @ 2009-04-26 19:53 UTC (permalink / raw)
To: grant.likely, linuxppc-dev
Patch series to separate out the mpc5200 core DMA routines from
mpc5200_psc_i2s.c into a standalone mpc5200_dma.c. No intention
to change how anything works, this is just a code reorg needed for
later patches to build on.
---
Jon Smirl (3):
Rename exports in mpc5200_dma.c
Rename the PSC functions to DMA
Basic split of mpc5200 DMA code out from mpc5200_psc_i2s
sound/soc/fsl/Kconfig | 4
sound/soc/fsl/Makefile | 2
sound/soc/fsl/mpc5200_dma.c | 463 ++++++++++++++++++++++++++++
sound/soc/fsl/mpc5200_dma.h | 81 +++++
sound/soc/fsl/mpc5200_psc_i2s.c | 644 +++++----------------------------------
5 files changed, 632 insertions(+), 562 deletions(-)
create mode 100644 sound/soc/fsl/mpc5200_dma.c
create mode 100644 sound/soc/fsl/mpc5200_dma.h
--
Jon Smirl
jonsmirl@gmail.com
^ permalink raw reply [flat|nested] 10+ messages in thread* [PATCH V1 1/3] Basic split of mpc5200 DMA code out from mpc5200_psc_i2s 2009-04-26 19:53 [PATCH V1 0/3] Split the DMA core out from mpc5200_psc_i2s.c Jon Smirl @ 2009-04-26 19:53 ` Jon Smirl 2009-04-27 4:04 ` Grant Likely 2009-04-26 19:53 ` [PATCH V1 2/3] Rename the PSC functions to DMA Jon Smirl 2009-04-26 19:53 ` [PATCH V1 3/3] Rename exports in mpc5200_dma.c Jon Smirl 2 siblings, 1 reply; 10+ messages in thread From: Jon Smirl @ 2009-04-26 19:53 UTC (permalink / raw) To: grant.likely, linuxppc-dev Basic split of mpc5200 DMA code out from i2s into a standalone file. Signed-off-by: Jon Smirl <jonsmirl@gmail.com> --- sound/soc/fsl/Kconfig | 4 sound/soc/fsl/Makefile | 2 sound/soc/fsl/mpc5200_dma.c | 457 +++++++++++++++++++++++++++++++++++++ sound/soc/fsl/mpc5200_dma.h | 81 +++++++ sound/soc/fsl/mpc5200_psc_i2s.c | 484 --------------------------------------- 5 files changed, 546 insertions(+), 482 deletions(-) create mode 100644 sound/soc/fsl/mpc5200_dma.c create mode 100644 sound/soc/fsl/mpc5200_dma.h diff --git a/sound/soc/fsl/Kconfig b/sound/soc/fsl/Kconfig index 9fc9082..dc79bdf 100644 --- a/sound/soc/fsl/Kconfig +++ b/sound/soc/fsl/Kconfig @@ -1,5 +1,8 @@ config SND_SOC_OF_SIMPLE tristate + +config SND_MPC52xx_DMA + tristate # ASoC platform support for the Freescale MPC8610 SOC. This compiles drivers # for the SSI and the Elo DMA controller. You will still need to select @@ -23,6 +26,7 @@ config SND_SOC_MPC5200_I2S tristate "Freescale MPC5200 PSC in I2S mode driver" depends on PPC_MPC52xx && PPC_BESTCOMM select SND_SOC_OF_SIMPLE + select SND_MPC52xx_DMA select PPC_BESTCOMM_GEN_BD help Say Y here to support the MPC5200 PSCs in I2S mode. diff --git a/sound/soc/fsl/Makefile b/sound/soc/fsl/Makefile index f85134c..7731ef2 100644 --- a/sound/soc/fsl/Makefile +++ b/sound/soc/fsl/Makefile @@ -10,5 +10,7 @@ snd-soc-fsl-ssi-objs := fsl_ssi.o snd-soc-fsl-dma-objs := fsl_dma.o obj-$(CONFIG_SND_SOC_MPC8610) += snd-soc-fsl-ssi.o snd-soc-fsl-dma.o +# MPC5200 Platform Support +obj-$(CONFIG_SND_MPC52xx_DMA) += mpc5200_dma.o obj-$(CONFIG_SND_SOC_MPC5200_I2S) += mpc5200_psc_i2s.o diff --git a/sound/soc/fsl/mpc5200_dma.c b/sound/soc/fsl/mpc5200_dma.c new file mode 100644 index 0000000..cccaff4 --- /dev/null +++ b/sound/soc/fsl/mpc5200_dma.c @@ -0,0 +1,457 @@ +/* + * Freescale MPC5200 PSC DMA + * ALSA SoC Platform driver + * + * Copyright (C) 2008 Secret Lab Technologies Ltd. + */ + +#include <linux/init.h> +#include <linux/module.h> +#include <linux/interrupt.h> +#include <linux/device.h> +#include <linux/delay.h> +#include <linux/of_device.h> +#include <linux/of_platform.h> +#include <linux/dma-mapping.h> + +#include <sound/core.h> +#include <sound/pcm.h> +#include <sound/pcm_params.h> +#include <sound/initval.h> +#include <sound/soc.h> +#include <sound/soc-of-simple.h> + +#include <sysdev/bestcomm/bestcomm.h> +#include <sysdev/bestcomm/gen_bd.h> +#include <asm/mpc52xx_psc.h> + +#include "mpc5200_dma.h" + +MODULE_AUTHOR("Grant Likely <grant.likely@secretlab.ca>"); +MODULE_DESCRIPTION("Freescale MPC5200 PSC in DMA mode ASoC Driver"); +MODULE_LICENSE("GPL"); + +/* + * Interrupt handlers + */ +static irqreturn_t psc_i2s_status_irq(int irq, void *_psc_i2s) +{ + struct psc_i2s *psc_i2s = _psc_i2s; + struct mpc52xx_psc __iomem *regs = psc_i2s->psc_regs; + u16 isr; + + isr = in_be16(®s->mpc52xx_psc_isr); + + /* Playback underrun error */ + if (psc_i2s->playback.active && (isr & MPC52xx_PSC_IMR_TXEMP)) + psc_i2s->stats.underrun_count++; + + /* Capture overrun error */ + if (psc_i2s->capture.active && (isr & MPC52xx_PSC_IMR_ORERR)) + psc_i2s->stats.overrun_count++; + + out_8(®s->command, 4 << 4); /* reset the error status */ + + return IRQ_HANDLED; +} + +/** + * psc_i2s_bcom_enqueue_next_buffer - Enqueue another audio buffer + * @s: pointer to stream private data structure + * + * Enqueues another audio period buffer into the bestcomm queue. + * + * Note: The routine must only be called when there is space available in + * the queue. Otherwise the enqueue will fail and the audio ring buffer + * will get out of sync + */ +static void psc_i2s_bcom_enqueue_next_buffer(struct psc_i2s_stream *s) +{ + struct bcom_bd *bd; + + /* Prepare and enqueue the next buffer descriptor */ + bd = bcom_prepare_next_buffer(s->bcom_task); + bd->status = s->period_bytes; + bd->data[0] = s->period_next_pt; + bcom_submit_next_buffer(s->bcom_task, NULL); + + /* Update for next period */ + s->period_next_pt += s->period_bytes; + if (s->period_next_pt >= s->period_end) + s->period_next_pt = s->period_start; +} + +/* Bestcomm DMA irq handler */ +static irqreturn_t psc_i2s_bcom_irq(int irq, void *_psc_i2s_stream) +{ + struct psc_i2s_stream *s = _psc_i2s_stream; + + /* For each finished period, dequeue the completed period buffer + * and enqueue a new one in it's place. */ + while (bcom_buffer_done(s->bcom_task)) { + bcom_retrieve_buffer(s->bcom_task, NULL, NULL); + s->period_current_pt += s->period_bytes; + if (s->period_current_pt >= s->period_end) + s->period_current_pt = s->period_start; + psc_i2s_bcom_enqueue_next_buffer(s); + bcom_enable(s->bcom_task); + } + + /* If the stream is active, then also inform the PCM middle layer + * of the period finished event. */ + if (s->active) + snd_pcm_period_elapsed(s->stream); + + return IRQ_HANDLED; +} + +/** + * psc_i2s_startup: create a new substream + * + * This is the first function called when a stream is opened. + * + * If this is the first stream open, then grab the IRQ and program most of + * the PSC registers. + */ +int psc_i2s_startup(struct snd_pcm_substream *substream, + struct snd_soc_dai *dai) +{ + struct snd_soc_pcm_runtime *rtd = substream->private_data; + struct psc_i2s *psc_i2s = rtd->dai->cpu_dai->private_data; + int rc; + + dev_dbg(psc_i2s->dev, "psc_i2s_startup(substream=%p)\n", substream); + + if (!psc_i2s->playback.active && + !psc_i2s->capture.active) { + /* Setup the IRQs */ + rc = request_irq(psc_i2s->irq, &psc_i2s_status_irq, IRQF_SHARED, + "psc-i2s-status", psc_i2s); + rc |= request_irq(psc_i2s->capture.irq, + &psc_i2s_bcom_irq, IRQF_SHARED, + "psc-i2s-capture", &psc_i2s->capture); + rc |= request_irq(psc_i2s->playback.irq, + &psc_i2s_bcom_irq, IRQF_SHARED, + "psc-i2s-playback", &psc_i2s->playback); + if (rc) { + free_irq(psc_i2s->irq, psc_i2s); + free_irq(psc_i2s->capture.irq, + &psc_i2s->capture); + free_irq(psc_i2s->playback.irq, + &psc_i2s->playback); + return -ENODEV; + } + } + + return 0; +} + +int psc_i2s_hw_free(struct snd_pcm_substream *substream, + struct snd_soc_dai *dai) +{ + snd_pcm_set_runtime_buffer(substream, NULL); + return 0; +} + +/** + * psc_i2s_trigger: start and stop the DMA transfer. + * + * This function is called by ALSA to start, stop, pause, and resume the DMA + * transfer of data. + */ +int psc_i2s_trigger(struct snd_pcm_substream *substream, int cmd, + struct snd_soc_dai *dai) +{ + struct snd_soc_pcm_runtime *rtd = substream->private_data; + struct psc_i2s *psc_i2s = rtd->dai->cpu_dai->private_data; + struct snd_pcm_runtime *runtime = substream->runtime; + struct psc_i2s_stream *s; + struct mpc52xx_psc __iomem *regs = psc_i2s->psc_regs; + u16 imr; + u8 psc_cmd; + unsigned long flags; + + if (substream->pstr->stream == SNDRV_PCM_STREAM_CAPTURE) + s = &psc_i2s->capture; + else + s = &psc_i2s->playback; + + dev_dbg(psc_i2s->dev, "psc_i2s_trigger(substream=%p, cmd=%i)" + " stream_id=%i\n", + substream, cmd, substream->pstr->stream); + + switch (cmd) { + case SNDRV_PCM_TRIGGER_START: + s->period_bytes = frames_to_bytes(runtime, + runtime->period_size); + s->period_start = virt_to_phys(runtime->dma_area); + s->period_end = s->period_start + + (s->period_bytes * runtime->periods); + s->period_next_pt = s->period_start; + s->period_current_pt = s->period_start; + s->active = 1; + + /* First; reset everything */ + if (substream->pstr->stream == SNDRV_PCM_STREAM_CAPTURE) { + out_8(®s->command, MPC52xx_PSC_RST_RX); + out_8(®s->command, MPC52xx_PSC_RST_ERR_STAT); + } else { + out_8(®s->command, MPC52xx_PSC_RST_TX); + out_8(®s->command, MPC52xx_PSC_RST_ERR_STAT); + } + + /* Next, fill up the bestcomm bd queue and enable DMA. + * This will begin filling the PSC's fifo. */ + if (substream->pstr->stream == SNDRV_PCM_STREAM_CAPTURE) + bcom_gen_bd_rx_reset(s->bcom_task); + else + bcom_gen_bd_tx_reset(s->bcom_task); + while (!bcom_queue_full(s->bcom_task)) + psc_i2s_bcom_enqueue_next_buffer(s); + bcom_enable(s->bcom_task); + + /* Due to errata in the i2s mode; need to line up enabling + * the transmitter with a transition on the frame sync + * line */ + + spin_lock_irqsave(&psc_i2s->lock, flags); + /* first make sure it is low */ + while ((in_8(®s->ipcr_acr.ipcr) & 0x80) != 0) + ; + /* then wait for the transition to high */ + while ((in_8(®s->ipcr_acr.ipcr) & 0x80) == 0) + ; + /* Finally, enable the PSC. + * Receiver must always be enabled; even when we only want + * transmit. (see 15.3.2.3 of MPC5200B User's Guide) */ + psc_cmd = MPC52xx_PSC_RX_ENABLE; + if (substream->pstr->stream == SNDRV_PCM_STREAM_PLAYBACK) + psc_cmd |= MPC52xx_PSC_TX_ENABLE; + out_8(®s->command, psc_cmd); + spin_unlock_irqrestore(&psc_i2s->lock, flags); + + break; + + case SNDRV_PCM_TRIGGER_STOP: + /* Turn off the PSC */ + s->active = 0; + if (substream->pstr->stream == SNDRV_PCM_STREAM_CAPTURE) { + if (!psc_i2s->playback.active) { + out_8(®s->command, 2 << 4); /* reset rx */ + out_8(®s->command, 3 << 4); /* reset tx */ + out_8(®s->command, 4 << 4); /* reset err */ + } + } else { + out_8(®s->command, 3 << 4); /* reset tx */ + out_8(®s->command, 4 << 4); /* reset err */ + if (!psc_i2s->capture.active) + out_8(®s->command, 2 << 4); /* reset rx */ + } + + bcom_disable(s->bcom_task); + while (!bcom_queue_empty(s->bcom_task)) + bcom_retrieve_buffer(s->bcom_task, NULL, NULL); + + break; + + default: + dev_dbg(psc_i2s->dev, "invalid command\n"); + return -EINVAL; + } + + /* Update interrupt enable settings */ + imr = 0; + if (psc_i2s->playback.active) + imr |= MPC52xx_PSC_IMR_TXEMP; + if (psc_i2s->capture.active) + imr |= MPC52xx_PSC_IMR_ORERR; + out_be16(®s->isr_imr.imr, imr); + + return 0; +} + +/** + * psc_i2s_shutdown: shutdown the data transfer on a stream + * + * Shutdown the PSC if there are no other substreams open. + */ +void psc_i2s_shutdown(struct snd_pcm_substream *substream, + struct snd_soc_dai *dai) +{ + struct snd_soc_pcm_runtime *rtd = substream->private_data; + struct psc_i2s *psc_i2s = rtd->dai->cpu_dai->private_data; + + dev_dbg(psc_i2s->dev, "psc_i2s_shutdown(substream=%p)\n", substream); + + /* + * If this is the last active substream, disable the PSC and release + * the IRQ. + */ + if (!psc_i2s->playback.active && + !psc_i2s->capture.active) { + + /* Disable all interrupts and reset the PSC */ + out_be16(&psc_i2s->psc_regs->isr_imr.imr, 0); + out_8(&psc_i2s->psc_regs->command, 3 << 4); /* reset tx */ + out_8(&psc_i2s->psc_regs->command, 2 << 4); /* reset rx */ + out_8(&psc_i2s->psc_regs->command, 1 << 4); /* reset mode */ + out_8(&psc_i2s->psc_regs->command, 4 << 4); /* reset error */ + + /* Release irqs */ + free_irq(psc_i2s->irq, psc_i2s); + free_irq(psc_i2s->capture.irq, &psc_i2s->capture); + free_irq(psc_i2s->playback.irq, &psc_i2s->playback); + } +} + +/* --------------------------------------------------------------------- + * The PSC DMA 'ASoC platform' driver + * + * Can be referenced by an 'ASoC machine' driver + * This driver only deals with the audio bus; it doesn't have any + * interaction with the attached codec + */ + +static const struct snd_pcm_hardware psc_i2s_pcm_hardware = { + .info = SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_MMAP_VALID | + SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_BLOCK_TRANSFER, + .formats = SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_S16_BE | + SNDRV_PCM_FMTBIT_S24_BE | SNDRV_PCM_FMTBIT_S32_BE, + .rate_min = 8000, + .rate_max = 48000, + .channels_min = 2, + .channels_max = 2, + .period_bytes_max = 1024 * 1024, + .period_bytes_min = 32, + .periods_min = 2, + .periods_max = 256, + .buffer_bytes_max = 2 * 1024 * 1024, + .fifo_size = 0, +}; + +static int psc_i2s_pcm_open(struct snd_pcm_substream *substream) +{ + struct snd_soc_pcm_runtime *rtd = substream->private_data; + struct psc_i2s *psc_i2s = rtd->dai->cpu_dai->private_data; + struct psc_i2s_stream *s; + + dev_dbg(psc_i2s->dev, "psc_i2s_pcm_open(substream=%p)\n", substream); + + if (substream->pstr->stream == SNDRV_PCM_STREAM_CAPTURE) + s = &psc_i2s->capture; + else + s = &psc_i2s->playback; + + snd_soc_set_runtime_hwparams(substream, &psc_i2s_pcm_hardware); + + s->stream = substream; + return 0; +} + +static int psc_i2s_pcm_close(struct snd_pcm_substream *substream) +{ + struct snd_soc_pcm_runtime *rtd = substream->private_data; + struct psc_i2s *psc_i2s = rtd->dai->cpu_dai->private_data; + struct psc_i2s_stream *s; + + dev_dbg(psc_i2s->dev, "psc_i2s_pcm_close(substream=%p)\n", substream); + + if (substream->pstr->stream == SNDRV_PCM_STREAM_CAPTURE) + s = &psc_i2s->capture; + else + s = &psc_i2s->playback; + + s->stream = NULL; + return 0; +} + +static snd_pcm_uframes_t +psc_i2s_pcm_pointer(struct snd_pcm_substream *substream) +{ + struct snd_soc_pcm_runtime *rtd = substream->private_data; + struct psc_i2s *psc_i2s = rtd->dai->cpu_dai->private_data; + struct psc_i2s_stream *s; + dma_addr_t count; + + if (substream->pstr->stream == SNDRV_PCM_STREAM_CAPTURE) + s = &psc_i2s->capture; + else + s = &psc_i2s->playback; + + count = s->period_current_pt - s->period_start; + + return bytes_to_frames(substream->runtime, count); +} + +static struct snd_pcm_ops psc_i2s_pcm_ops = { + .open = psc_i2s_pcm_open, + .close = psc_i2s_pcm_close, + .ioctl = snd_pcm_lib_ioctl, + .pointer = psc_i2s_pcm_pointer, +}; + +static u64 psc_i2s_pcm_dmamask = 0xffffffff; +static int psc_i2s_pcm_new(struct snd_card *card, struct snd_soc_dai *dai, + struct snd_pcm *pcm) +{ + struct snd_soc_pcm_runtime *rtd = pcm->private_data; + size_t size = psc_i2s_pcm_hardware.buffer_bytes_max; + int rc = 0; + + dev_dbg(rtd->socdev->dev, "psc_i2s_pcm_new(card=%p, dai=%p, pcm=%p)\n", + card, dai, pcm); + + if (!card->dev->dma_mask) + card->dev->dma_mask = &psc_i2s_pcm_dmamask; + if (!card->dev->coherent_dma_mask) + card->dev->coherent_dma_mask = 0xffffffff; + + if (pcm->streams[0].substream) { + rc = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, pcm->dev, size, + &pcm->streams[0].substream->dma_buffer); + if (rc) + goto playback_alloc_err; + } + + if (pcm->streams[1].substream) { + rc = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, pcm->dev, size, + &pcm->streams[1].substream->dma_buffer); + if (rc) + goto capture_alloc_err; + } + + return 0; + + capture_alloc_err: + if (pcm->streams[0].substream) + snd_dma_free_pages(&pcm->streams[0].substream->dma_buffer); + playback_alloc_err: + dev_err(card->dev, "Cannot allocate buffer(s)\n"); + return -ENOMEM; +} + +static void psc_i2s_pcm_free(struct snd_pcm *pcm) +{ + struct snd_soc_pcm_runtime *rtd = pcm->private_data; + struct snd_pcm_substream *substream; + int stream; + + dev_dbg(rtd->socdev->dev, "psc_i2s_pcm_free(pcm=%p)\n", pcm); + + for (stream = 0; stream < 2; stream++) { + substream = pcm->streams[stream].substream; + if (substream) { + snd_dma_free_pages(&substream->dma_buffer); + substream->dma_buffer.area = NULL; + substream->dma_buffer.addr = 0; + } + } +} + +struct snd_soc_platform psc_i2s_pcm_soc_platform = { + .name = "mpc5200-psc-audio", + .pcm_ops = &psc_i2s_pcm_ops, + .pcm_new = &psc_i2s_pcm_new, + .pcm_free = &psc_i2s_pcm_free, +}; + diff --git a/sound/soc/fsl/mpc5200_dma.h b/sound/soc/fsl/mpc5200_dma.h new file mode 100644 index 0000000..9a19e8a --- /dev/null +++ b/sound/soc/fsl/mpc5200_dma.h @@ -0,0 +1,81 @@ +/* + * Freescale MPC5200 Audio DMA driver + */ + +#ifndef __SOUND_SOC_FSL_MPC5200_DMA_H__ +#define __SOUND_SOC_FSL_MPC5200_DMA_H__ + +/** + * psc_i2s_stream - Data specific to a single stream (playback or capture) + * @active: flag indicating if the stream is active + * @psc_i2s: pointer back to parent psc_i2s data structure + * @bcom_task: bestcomm task structure + * @irq: irq number for bestcomm task + * @period_start: physical address of start of DMA region + * @period_end: physical address of end of DMA region + * @period_next_pt: physical address of next DMA buffer to enqueue + * @period_bytes: size of DMA period in bytes + */ +struct psc_i2s_stream { + int active; + struct psc_i2s *psc_i2s; + struct bcom_task *bcom_task; + int irq; + struct snd_pcm_substream *stream; + dma_addr_t period_start; + dma_addr_t period_end; + dma_addr_t period_next_pt; + dma_addr_t period_current_pt; + int period_bytes; +}; + +/** + * psc_i2s - Private driver data + * @name: short name for this device ("PSC0", "PSC1", etc) + * @psc_regs: pointer to the PSC's registers + * @fifo_regs: pointer to the PSC's FIFO registers + * @irq: IRQ of this PSC + * @dev: struct device pointer + * @dai: the CPU DAI for this device + * @sicr: Base value used in serial interface control register; mode is ORed + * with this value. + * @playback: Playback stream context data + * @capture: Capture stream context data + */ +struct psc_i2s { + char name[32]; + struct mpc52xx_psc __iomem *psc_regs; + struct mpc52xx_psc_fifo __iomem *fifo_regs; + unsigned int irq; + struct device *dev; + struct snd_soc_dai dai; + spinlock_t lock; + u32 sicr; + + /* per-stream data */ + struct psc_i2s_stream playback; + struct psc_i2s_stream capture; + + /* Statistics */ + struct { + int overrun_count; + int underrun_count; + } stats; +}; + + +int psc_i2s_startup(struct snd_pcm_substream *substream, + struct snd_soc_dai *dai); + +int psc_i2s_hw_free(struct snd_pcm_substream *substream, + struct snd_soc_dai *dai); + +void psc_i2s_shutdown(struct snd_pcm_substream *substream, + struct snd_soc_dai *dai); + +int psc_i2s_trigger(struct snd_pcm_substream *substream, int cmd, + struct snd_soc_dai *dai); + +extern struct snd_soc_platform psc_i2s_pcm_soc_platform; + +#endif /* __SOUND_SOC_FSL_MPC5200_DMA_H__ */ diff --git a/sound/soc/fsl/mpc5200_psc_i2s.c b/sound/soc/fsl/mpc5200_psc_i2s.c index 3aa729d..8974b53 100644 --- a/sound/soc/fsl/mpc5200_psc_i2s.c +++ b/sound/soc/fsl/mpc5200_psc_i2s.c @@ -25,6 +25,8 @@ #include <sysdev/bestcomm/gen_bd.h> #include <asm/mpc52xx_psc.h> +#include "mpc5200_dma.h" + MODULE_AUTHOR("Grant Likely <grant.likely@secretlab.ca>"); MODULE_DESCRIPTION("Freescale MPC5200 PSC in I2S mode ASoC Driver"); MODULE_LICENSE("GPL"); @@ -47,179 +49,6 @@ MODULE_LICENSE("GPL"); SNDRV_PCM_FMTBIT_S24_BE | SNDRV_PCM_FMTBIT_S24_BE | \ SNDRV_PCM_FMTBIT_S32_BE) -/** - * psc_i2s_stream - Data specific to a single stream (playback or capture) - * @active: flag indicating if the stream is active - * @psc_i2s: pointer back to parent psc_i2s data structure - * @bcom_task: bestcomm task structure - * @irq: irq number for bestcomm task - * @period_start: physical address of start of DMA region - * @period_end: physical address of end of DMA region - * @period_next_pt: physical address of next DMA buffer to enqueue - * @period_bytes: size of DMA period in bytes - */ -struct psc_i2s_stream { - int active; - struct psc_i2s *psc_i2s; - struct bcom_task *bcom_task; - int irq; - struct snd_pcm_substream *stream; - dma_addr_t period_start; - dma_addr_t period_end; - dma_addr_t period_next_pt; - dma_addr_t period_current_pt; - int period_bytes; -}; - -/** - * psc_i2s - Private driver data - * @name: short name for this device ("PSC0", "PSC1", etc) - * @psc_regs: pointer to the PSC's registers - * @fifo_regs: pointer to the PSC's FIFO registers - * @irq: IRQ of this PSC - * @dev: struct device pointer - * @dai: the CPU DAI for this device - * @sicr: Base value used in serial interface control register; mode is ORed - * with this value. - * @playback: Playback stream context data - * @capture: Capture stream context data - */ -struct psc_i2s { - char name[32]; - struct mpc52xx_psc __iomem *psc_regs; - struct mpc52xx_psc_fifo __iomem *fifo_regs; - unsigned int irq; - struct device *dev; - struct snd_soc_dai dai; - spinlock_t lock; - u32 sicr; - - /* per-stream data */ - struct psc_i2s_stream playback; - struct psc_i2s_stream capture; - - /* Statistics */ - struct { - int overrun_count; - int underrun_count; - } stats; -}; - -/* - * Interrupt handlers - */ -static irqreturn_t psc_i2s_status_irq(int irq, void *_psc_i2s) -{ - struct psc_i2s *psc_i2s = _psc_i2s; - struct mpc52xx_psc __iomem *regs = psc_i2s->psc_regs; - u16 isr; - - isr = in_be16(®s->mpc52xx_psc_isr); - - /* Playback underrun error */ - if (psc_i2s->playback.active && (isr & MPC52xx_PSC_IMR_TXEMP)) - psc_i2s->stats.underrun_count++; - - /* Capture overrun error */ - if (psc_i2s->capture.active && (isr & MPC52xx_PSC_IMR_ORERR)) - psc_i2s->stats.overrun_count++; - - out_8(®s->command, 4 << 4); /* reset the error status */ - - return IRQ_HANDLED; -} - -/** - * psc_i2s_bcom_enqueue_next_buffer - Enqueue another audio buffer - * @s: pointer to stream private data structure - * - * Enqueues another audio period buffer into the bestcomm queue. - * - * Note: The routine must only be called when there is space available in - * the queue. Otherwise the enqueue will fail and the audio ring buffer - * will get out of sync - */ -static void psc_i2s_bcom_enqueue_next_buffer(struct psc_i2s_stream *s) -{ - struct bcom_bd *bd; - - /* Prepare and enqueue the next buffer descriptor */ - bd = bcom_prepare_next_buffer(s->bcom_task); - bd->status = s->period_bytes; - bd->data[0] = s->period_next_pt; - bcom_submit_next_buffer(s->bcom_task, NULL); - - /* Update for next period */ - s->period_next_pt += s->period_bytes; - if (s->period_next_pt >= s->period_end) - s->period_next_pt = s->period_start; -} - -/* Bestcomm DMA irq handler */ -static irqreturn_t psc_i2s_bcom_irq(int irq, void *_psc_i2s_stream) -{ - struct psc_i2s_stream *s = _psc_i2s_stream; - - /* For each finished period, dequeue the completed period buffer - * and enqueue a new one in it's place. */ - while (bcom_buffer_done(s->bcom_task)) { - bcom_retrieve_buffer(s->bcom_task, NULL, NULL); - s->period_current_pt += s->period_bytes; - if (s->period_current_pt >= s->period_end) - s->period_current_pt = s->period_start; - psc_i2s_bcom_enqueue_next_buffer(s); - bcom_enable(s->bcom_task); - } - - /* If the stream is active, then also inform the PCM middle layer - * of the period finished event. */ - if (s->active) - snd_pcm_period_elapsed(s->stream); - - return IRQ_HANDLED; -} - -/** - * psc_i2s_startup: create a new substream - * - * This is the first function called when a stream is opened. - * - * If this is the first stream open, then grab the IRQ and program most of - * the PSC registers. - */ -static int psc_i2s_startup(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct psc_i2s *psc_i2s = rtd->dai->cpu_dai->private_data; - int rc; - - dev_dbg(psc_i2s->dev, "psc_i2s_startup(substream=%p)\n", substream); - - if (!psc_i2s->playback.active && - !psc_i2s->capture.active) { - /* Setup the IRQs */ - rc = request_irq(psc_i2s->irq, &psc_i2s_status_irq, IRQF_SHARED, - "psc-i2s-status", psc_i2s); - rc |= request_irq(psc_i2s->capture.irq, - &psc_i2s_bcom_irq, IRQF_SHARED, - "psc-i2s-capture", &psc_i2s->capture); - rc |= request_irq(psc_i2s->playback.irq, - &psc_i2s_bcom_irq, IRQF_SHARED, - "psc-i2s-playback", &psc_i2s->playback); - if (rc) { - free_irq(psc_i2s->irq, psc_i2s); - free_irq(psc_i2s->capture.irq, - &psc_i2s->capture); - free_irq(psc_i2s->playback.irq, - &psc_i2s->playback); - return -ENODEV; - } - } - - return 0; -} - static int psc_i2s_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) @@ -258,164 +87,6 @@ static int psc_i2s_hw_params(struct snd_pcm_substream *substream, return 0; } -static int psc_i2s_hw_free(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - snd_pcm_set_runtime_buffer(substream, NULL); - return 0; -} - -/** - * psc_i2s_trigger: start and stop the DMA transfer. - * - * This function is called by ALSA to start, stop, pause, and resume the DMA - * transfer of data. - */ -static int psc_i2s_trigger(struct snd_pcm_substream *substream, int cmd, - struct snd_soc_dai *dai) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct psc_i2s *psc_i2s = rtd->dai->cpu_dai->private_data; - struct snd_pcm_runtime *runtime = substream->runtime; - struct psc_i2s_stream *s; - struct mpc52xx_psc __iomem *regs = psc_i2s->psc_regs; - u16 imr; - u8 psc_cmd; - unsigned long flags; - - if (substream->pstr->stream == SNDRV_PCM_STREAM_CAPTURE) - s = &psc_i2s->capture; - else - s = &psc_i2s->playback; - - dev_dbg(psc_i2s->dev, "psc_i2s_trigger(substream=%p, cmd=%i)" - " stream_id=%i\n", - substream, cmd, substream->pstr->stream); - - switch (cmd) { - case SNDRV_PCM_TRIGGER_START: - s->period_bytes = frames_to_bytes(runtime, - runtime->period_size); - s->period_start = virt_to_phys(runtime->dma_area); - s->period_end = s->period_start + - (s->period_bytes * runtime->periods); - s->period_next_pt = s->period_start; - s->period_current_pt = s->period_start; - s->active = 1; - - /* First; reset everything */ - if (substream->pstr->stream == SNDRV_PCM_STREAM_CAPTURE) { - out_8(®s->command, MPC52xx_PSC_RST_RX); - out_8(®s->command, MPC52xx_PSC_RST_ERR_STAT); - } else { - out_8(®s->command, MPC52xx_PSC_RST_TX); - out_8(®s->command, MPC52xx_PSC_RST_ERR_STAT); - } - - /* Next, fill up the bestcomm bd queue and enable DMA. - * This will begin filling the PSC's fifo. */ - if (substream->pstr->stream == SNDRV_PCM_STREAM_CAPTURE) - bcom_gen_bd_rx_reset(s->bcom_task); - else - bcom_gen_bd_tx_reset(s->bcom_task); - while (!bcom_queue_full(s->bcom_task)) - psc_i2s_bcom_enqueue_next_buffer(s); - bcom_enable(s->bcom_task); - - /* Due to errata in the i2s mode; need to line up enabling - * the transmitter with a transition on the frame sync - * line */ - - spin_lock_irqsave(&psc_i2s->lock, flags); - /* first make sure it is low */ - while ((in_8(®s->ipcr_acr.ipcr) & 0x80) != 0) - ; - /* then wait for the transition to high */ - while ((in_8(®s->ipcr_acr.ipcr) & 0x80) == 0) - ; - /* Finally, enable the PSC. - * Receiver must always be enabled; even when we only want - * transmit. (see 15.3.2.3 of MPC5200B User's Guide) */ - psc_cmd = MPC52xx_PSC_RX_ENABLE; - if (substream->pstr->stream == SNDRV_PCM_STREAM_PLAYBACK) - psc_cmd |= MPC52xx_PSC_TX_ENABLE; - out_8(®s->command, psc_cmd); - spin_unlock_irqrestore(&psc_i2s->lock, flags); - - break; - - case SNDRV_PCM_TRIGGER_STOP: - /* Turn off the PSC */ - s->active = 0; - if (substream->pstr->stream == SNDRV_PCM_STREAM_CAPTURE) { - if (!psc_i2s->playback.active) { - out_8(®s->command, 2 << 4); /* reset rx */ - out_8(®s->command, 3 << 4); /* reset tx */ - out_8(®s->command, 4 << 4); /* reset err */ - } - } else { - out_8(®s->command, 3 << 4); /* reset tx */ - out_8(®s->command, 4 << 4); /* reset err */ - if (!psc_i2s->capture.active) - out_8(®s->command, 2 << 4); /* reset rx */ - } - - bcom_disable(s->bcom_task); - while (!bcom_queue_empty(s->bcom_task)) - bcom_retrieve_buffer(s->bcom_task, NULL, NULL); - - break; - - default: - dev_dbg(psc_i2s->dev, "invalid command\n"); - return -EINVAL; - } - - /* Update interrupt enable settings */ - imr = 0; - if (psc_i2s->playback.active) - imr |= MPC52xx_PSC_IMR_TXEMP; - if (psc_i2s->capture.active) - imr |= MPC52xx_PSC_IMR_ORERR; - out_be16(®s->isr_imr.imr, imr); - - return 0; -} - -/** - * psc_i2s_shutdown: shutdown the data transfer on a stream - * - * Shutdown the PSC if there are no other substreams open. - */ -static void psc_i2s_shutdown(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct psc_i2s *psc_i2s = rtd->dai->cpu_dai->private_data; - - dev_dbg(psc_i2s->dev, "psc_i2s_shutdown(substream=%p)\n", substream); - - /* - * If this is the last active substream, disable the PSC and release - * the IRQ. - */ - if (!psc_i2s->playback.active && - !psc_i2s->capture.active) { - - /* Disable all interrupts and reset the PSC */ - out_be16(&psc_i2s->psc_regs->isr_imr.imr, 0); - out_8(&psc_i2s->psc_regs->command, 3 << 4); /* reset tx */ - out_8(&psc_i2s->psc_regs->command, 2 << 4); /* reset rx */ - out_8(&psc_i2s->psc_regs->command, 1 << 4); /* reset mode */ - out_8(&psc_i2s->psc_regs->command, 4 << 4); /* reset error */ - - /* Release irqs */ - free_irq(psc_i2s->irq, psc_i2s); - free_irq(psc_i2s->capture.irq, &psc_i2s->capture); - free_irq(psc_i2s->playback.irq, &psc_i2s->playback); - } -} - /** * psc_i2s_set_sysclk: set the clock frequency and direction * @@ -495,157 +166,6 @@ static struct snd_soc_dai psc_i2s_dai_template = { }; /* --------------------------------------------------------------------- - * The PSC I2S 'ASoC platform' driver - * - * Can be referenced by an 'ASoC machine' driver - * This driver only deals with the audio bus; it doesn't have any - * interaction with the attached codec - */ - -static const struct snd_pcm_hardware psc_i2s_pcm_hardware = { - .info = SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_MMAP_VALID | - SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_BLOCK_TRANSFER, - .formats = SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_S16_BE | - SNDRV_PCM_FMTBIT_S24_BE | SNDRV_PCM_FMTBIT_S32_BE, - .rate_min = 8000, - .rate_max = 48000, - .channels_min = 2, - .channels_max = 2, - .period_bytes_max = 1024 * 1024, - .period_bytes_min = 32, - .periods_min = 2, - .periods_max = 256, - .buffer_bytes_max = 2 * 1024 * 1024, - .fifo_size = 0, -}; - -static int psc_i2s_pcm_open(struct snd_pcm_substream *substream) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct psc_i2s *psc_i2s = rtd->dai->cpu_dai->private_data; - struct psc_i2s_stream *s; - - dev_dbg(psc_i2s->dev, "psc_i2s_pcm_open(substream=%p)\n", substream); - - if (substream->pstr->stream == SNDRV_PCM_STREAM_CAPTURE) - s = &psc_i2s->capture; - else - s = &psc_i2s->playback; - - snd_soc_set_runtime_hwparams(substream, &psc_i2s_pcm_hardware); - - s->stream = substream; - return 0; -} - -static int psc_i2s_pcm_close(struct snd_pcm_substream *substream) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct psc_i2s *psc_i2s = rtd->dai->cpu_dai->private_data; - struct psc_i2s_stream *s; - - dev_dbg(psc_i2s->dev, "psc_i2s_pcm_close(substream=%p)\n", substream); - - if (substream->pstr->stream == SNDRV_PCM_STREAM_CAPTURE) - s = &psc_i2s->capture; - else - s = &psc_i2s->playback; - - s->stream = NULL; - return 0; -} - -static snd_pcm_uframes_t -psc_i2s_pcm_pointer(struct snd_pcm_substream *substream) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct psc_i2s *psc_i2s = rtd->dai->cpu_dai->private_data; - struct psc_i2s_stream *s; - dma_addr_t count; - - if (substream->pstr->stream == SNDRV_PCM_STREAM_CAPTURE) - s = &psc_i2s->capture; - else - s = &psc_i2s->playback; - - count = s->period_current_pt - s->period_start; - - return bytes_to_frames(substream->runtime, count); -} - -static struct snd_pcm_ops psc_i2s_pcm_ops = { - .open = psc_i2s_pcm_open, - .close = psc_i2s_pcm_close, - .ioctl = snd_pcm_lib_ioctl, - .pointer = psc_i2s_pcm_pointer, -}; - -static u64 psc_i2s_pcm_dmamask = 0xffffffff; -static int psc_i2s_pcm_new(struct snd_card *card, struct snd_soc_dai *dai, - struct snd_pcm *pcm) -{ - struct snd_soc_pcm_runtime *rtd = pcm->private_data; - size_t size = psc_i2s_pcm_hardware.buffer_bytes_max; - int rc = 0; - - dev_dbg(rtd->socdev->dev, "psc_i2s_pcm_new(card=%p, dai=%p, pcm=%p)\n", - card, dai, pcm); - - if (!card->dev->dma_mask) - card->dev->dma_mask = &psc_i2s_pcm_dmamask; - if (!card->dev->coherent_dma_mask) - card->dev->coherent_dma_mask = 0xffffffff; - - if (pcm->streams[0].substream) { - rc = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, pcm->dev, size, - &pcm->streams[0].substream->dma_buffer); - if (rc) - goto playback_alloc_err; - } - - if (pcm->streams[1].substream) { - rc = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, pcm->dev, size, - &pcm->streams[1].substream->dma_buffer); - if (rc) - goto capture_alloc_err; - } - - return 0; - - capture_alloc_err: - if (pcm->streams[0].substream) - snd_dma_free_pages(&pcm->streams[0].substream->dma_buffer); - playback_alloc_err: - dev_err(card->dev, "Cannot allocate buffer(s)\n"); - return -ENOMEM; -} - -static void psc_i2s_pcm_free(struct snd_pcm *pcm) -{ - struct snd_soc_pcm_runtime *rtd = pcm->private_data; - struct snd_pcm_substream *substream; - int stream; - - dev_dbg(rtd->socdev->dev, "psc_i2s_pcm_free(pcm=%p)\n", pcm); - - for (stream = 0; stream < 2; stream++) { - substream = pcm->streams[stream].substream; - if (substream) { - snd_dma_free_pages(&substream->dma_buffer); - substream->dma_buffer.area = NULL; - substream->dma_buffer.addr = 0; - } - } -} - -struct snd_soc_platform psc_i2s_pcm_soc_platform = { - .name = "mpc5200-psc-audio", - .pcm_ops = &psc_i2s_pcm_ops, - .pcm_new = &psc_i2s_pcm_new, - .pcm_free = &psc_i2s_pcm_free, -}; - -/* --------------------------------------------------------------------- * Sysfs attributes for debugging */ ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH V1 1/3] Basic split of mpc5200 DMA code out from mpc5200_psc_i2s 2009-04-26 19:53 ` [PATCH V1 1/3] Basic split of mpc5200 DMA code out from mpc5200_psc_i2s Jon Smirl @ 2009-04-27 4:04 ` Grant Likely 0 siblings, 0 replies; 10+ messages in thread From: Grant Likely @ 2009-04-27 4:04 UTC (permalink / raw) To: Jon Smirl; +Cc: linuxppc-dev On Sun, Apr 26, 2009 at 1:53 PM, Jon Smirl <jonsmirl@gmail.com> wrote: > Basic split of mpc5200 DMA code out from i2s into a standalone file. > > Signed-off-by: Jon Smirl <jonsmirl@gmail.com> Acked-by: Grant Likely <grant.likely@secretlab.ca> But you should really also send this to the ALSA list. I cannot merge this patch. g. > --- > =A0sound/soc/fsl/Kconfig =A0 =A0 =A0 =A0 =A0 | =A0 =A04 > =A0sound/soc/fsl/Makefile =A0 =A0 =A0 =A0 =A0| =A0 =A02 > =A0sound/soc/fsl/mpc5200_dma.c =A0 =A0 | =A0457 +++++++++++++++++++++++++= ++++++++++++ > =A0sound/soc/fsl/mpc5200_dma.h =A0 =A0 | =A0 81 +++++++ > =A0sound/soc/fsl/mpc5200_psc_i2s.c | =A0484 -----------------------------= ---------- > =A05 files changed, 546 insertions(+), 482 deletions(-) > =A0create mode 100644 sound/soc/fsl/mpc5200_dma.c > =A0create mode 100644 sound/soc/fsl/mpc5200_dma.h > > diff --git a/sound/soc/fsl/Kconfig b/sound/soc/fsl/Kconfig > index 9fc9082..dc79bdf 100644 > --- a/sound/soc/fsl/Kconfig > +++ b/sound/soc/fsl/Kconfig > @@ -1,5 +1,8 @@ > =A0config SND_SOC_OF_SIMPLE > =A0 =A0 =A0 =A0tristate > + > +config SND_MPC52xx_DMA > + =A0 =A0 =A0 tristate > > =A0# ASoC platform support for the Freescale MPC8610 SOC. =A0This compile= s drivers > =A0# for the SSI and the Elo DMA controller. =A0You will still need to se= lect > @@ -23,6 +26,7 @@ config SND_SOC_MPC5200_I2S > =A0 =A0 =A0 =A0tristate "Freescale MPC5200 PSC in I2S mode driver" > =A0 =A0 =A0 =A0depends on PPC_MPC52xx && PPC_BESTCOMM > =A0 =A0 =A0 =A0select SND_SOC_OF_SIMPLE > + =A0 =A0 =A0 select SND_MPC52xx_DMA > =A0 =A0 =A0 =A0select PPC_BESTCOMM_GEN_BD > =A0 =A0 =A0 =A0help > =A0 =A0 =A0 =A0 =A0Say Y here to support the MPC5200 PSCs in I2S mode. > diff --git a/sound/soc/fsl/Makefile b/sound/soc/fsl/Makefile > index f85134c..7731ef2 100644 > --- a/sound/soc/fsl/Makefile > +++ b/sound/soc/fsl/Makefile > @@ -10,5 +10,7 @@ snd-soc-fsl-ssi-objs :=3D fsl_ssi.o > =A0snd-soc-fsl-dma-objs :=3D fsl_dma.o > =A0obj-$(CONFIG_SND_SOC_MPC8610) +=3D snd-soc-fsl-ssi.o snd-soc-fsl-dma.o > > +# MPC5200 Platform Support > +obj-$(CONFIG_SND_MPC52xx_DMA) +=3D mpc5200_dma.o > =A0obj-$(CONFIG_SND_SOC_MPC5200_I2S) +=3D mpc5200_psc_i2s.o > > diff --git a/sound/soc/fsl/mpc5200_dma.c b/sound/soc/fsl/mpc5200_dma.c > new file mode 100644 > index 0000000..cccaff4 > --- /dev/null > +++ b/sound/soc/fsl/mpc5200_dma.c > @@ -0,0 +1,457 @@ > +/* > + * Freescale MPC5200 PSC DMA > + * ALSA SoC Platform driver > + * > + * Copyright (C) 2008 Secret Lab Technologies Ltd. > + */ > + > +#include <linux/init.h> > +#include <linux/module.h> > +#include <linux/interrupt.h> > +#include <linux/device.h> > +#include <linux/delay.h> > +#include <linux/of_device.h> > +#include <linux/of_platform.h> > +#include <linux/dma-mapping.h> > + > +#include <sound/core.h> > +#include <sound/pcm.h> > +#include <sound/pcm_params.h> > +#include <sound/initval.h> > +#include <sound/soc.h> > +#include <sound/soc-of-simple.h> > + > +#include <sysdev/bestcomm/bestcomm.h> > +#include <sysdev/bestcomm/gen_bd.h> > +#include <asm/mpc52xx_psc.h> > + > +#include "mpc5200_dma.h" > + > +MODULE_AUTHOR("Grant Likely <grant.likely@secretlab.ca>"); > +MODULE_DESCRIPTION("Freescale MPC5200 PSC in DMA mode ASoC Driver"); > +MODULE_LICENSE("GPL"); > + > +/* > + * Interrupt handlers > + */ > +static irqreturn_t psc_i2s_status_irq(int irq, void *_psc_i2s) > +{ > + =A0 =A0 =A0 struct psc_i2s *psc_i2s =3D _psc_i2s; > + =A0 =A0 =A0 struct mpc52xx_psc __iomem *regs =3D psc_i2s->psc_regs; > + =A0 =A0 =A0 u16 isr; > + > + =A0 =A0 =A0 isr =3D in_be16(®s->mpc52xx_psc_isr); > + > + =A0 =A0 =A0 /* Playback underrun error */ > + =A0 =A0 =A0 if (psc_i2s->playback.active && (isr & MPC52xx_PSC_IMR_TXEM= P)) > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 psc_i2s->stats.underrun_count++; > + > + =A0 =A0 =A0 /* Capture overrun error */ > + =A0 =A0 =A0 if (psc_i2s->capture.active && (isr & MPC52xx_PSC_IMR_ORERR= )) > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 psc_i2s->stats.overrun_count++; > + > + =A0 =A0 =A0 out_8(®s->command, 4 << 4); =A0/* reset the error status= */ > + > + =A0 =A0 =A0 return IRQ_HANDLED; > +} > + > +/** > + * psc_i2s_bcom_enqueue_next_buffer - Enqueue another audio buffer > + * @s: pointer to stream private data structure > + * > + * Enqueues another audio period buffer into the bestcomm queue. > + * > + * Note: The routine must only be called when there is space available i= n > + * the queue. =A0Otherwise the enqueue will fail and the audio ring buff= er > + * will get out of sync > + */ > +static void psc_i2s_bcom_enqueue_next_buffer(struct psc_i2s_stream *s) > +{ > + =A0 =A0 =A0 struct bcom_bd *bd; > + > + =A0 =A0 =A0 /* Prepare and enqueue the next buffer descriptor */ > + =A0 =A0 =A0 bd =3D bcom_prepare_next_buffer(s->bcom_task); > + =A0 =A0 =A0 bd->status =3D s->period_bytes; > + =A0 =A0 =A0 bd->data[0] =3D s->period_next_pt; > + =A0 =A0 =A0 bcom_submit_next_buffer(s->bcom_task, NULL); > + > + =A0 =A0 =A0 /* Update for next period */ > + =A0 =A0 =A0 s->period_next_pt +=3D s->period_bytes; > + =A0 =A0 =A0 if (s->period_next_pt >=3D s->period_end) > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 s->period_next_pt =3D s->period_start; > +} > + > +/* Bestcomm DMA irq handler */ > +static irqreturn_t psc_i2s_bcom_irq(int irq, void *_psc_i2s_stream) > +{ > + =A0 =A0 =A0 struct psc_i2s_stream *s =3D _psc_i2s_stream; > + > + =A0 =A0 =A0 /* For each finished period, dequeue the completed period b= uffer > + =A0 =A0 =A0 =A0* and enqueue a new one in it's place. */ > + =A0 =A0 =A0 while (bcom_buffer_done(s->bcom_task)) { > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 bcom_retrieve_buffer(s->bcom_task, NULL, NU= LL); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 s->period_current_pt +=3D s->period_bytes; > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (s->period_current_pt >=3D s->period_end= ) > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 s->period_current_pt =3D s-= >period_start; > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 psc_i2s_bcom_enqueue_next_buffer(s); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 bcom_enable(s->bcom_task); > + =A0 =A0 =A0 } > + > + =A0 =A0 =A0 /* If the stream is active, then also inform the PCM middle= layer > + =A0 =A0 =A0 =A0* of the period finished event. */ > + =A0 =A0 =A0 if (s->active) > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 snd_pcm_period_elapsed(s->stream); > + > + =A0 =A0 =A0 return IRQ_HANDLED; > +} > + > +/** > + * psc_i2s_startup: create a new substream > + * > + * This is the first function called when a stream is opened. > + * > + * If this is the first stream open, then grab the IRQ and program most = of > + * the PSC registers. > + */ > +int psc_i2s_startup(struct snd_pcm_substream *substream, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0struct snd_soc_dai *= dai) > +{ > + =A0 =A0 =A0 struct snd_soc_pcm_runtime *rtd =3D substream->private_data= ; > + =A0 =A0 =A0 struct psc_i2s *psc_i2s =3D rtd->dai->cpu_dai->private_data= ; > + =A0 =A0 =A0 int rc; > + > + =A0 =A0 =A0 dev_dbg(psc_i2s->dev, "psc_i2s_startup(substream=3D%p)\n", = substream); > + > + =A0 =A0 =A0 if (!psc_i2s->playback.active && > + =A0 =A0 =A0 =A0 =A0 !psc_i2s->capture.active) { > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* Setup the IRQs */ > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 rc =3D request_irq(psc_i2s->irq, &psc_i2s_s= tatus_irq, IRQF_SHARED, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0"psc-i2s= -status", psc_i2s); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 rc |=3D request_irq(psc_i2s->capture.irq, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 &psc_i2= s_bcom_irq, IRQF_SHARED, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "psc-i2= s-capture", &psc_i2s->capture); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 rc |=3D request_irq(psc_i2s->playback.irq, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 &psc_i2= s_bcom_irq, IRQF_SHARED, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "psc-i2= s-playback", &psc_i2s->playback); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (rc) { > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 free_irq(psc_i2s->irq, psc_= i2s); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 free_irq(psc_i2s->capture.i= rq, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0&psc_i2s= ->capture); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 free_irq(psc_i2s->playback.= irq, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0&psc_i2s= ->playback); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 return -ENODEV; > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 } > + =A0 =A0 =A0 } > + > + =A0 =A0 =A0 return 0; > +} > + > +int psc_i2s_hw_free(struct snd_pcm_substream *substream, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0struct snd_soc_dai *= dai) > +{ > + =A0 =A0 =A0 snd_pcm_set_runtime_buffer(substream, NULL); > + =A0 =A0 =A0 return 0; > +} > + > +/** > + * psc_i2s_trigger: start and stop the DMA transfer. > + * > + * This function is called by ALSA to start, stop, pause, and resume the= DMA > + * transfer of data. > + */ > +int psc_i2s_trigger(struct snd_pcm_substream *substream, int cmd, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0struct snd_soc_dai *= dai) > +{ > + =A0 =A0 =A0 struct snd_soc_pcm_runtime *rtd =3D substream->private_data= ; > + =A0 =A0 =A0 struct psc_i2s *psc_i2s =3D rtd->dai->cpu_dai->private_data= ; > + =A0 =A0 =A0 struct snd_pcm_runtime *runtime =3D substream->runtime; > + =A0 =A0 =A0 struct psc_i2s_stream *s; > + =A0 =A0 =A0 struct mpc52xx_psc __iomem *regs =3D psc_i2s->psc_regs; > + =A0 =A0 =A0 u16 imr; > + =A0 =A0 =A0 u8 psc_cmd; > + =A0 =A0 =A0 unsigned long flags; > + > + =A0 =A0 =A0 if (substream->pstr->stream =3D=3D SNDRV_PCM_STREAM_CAPTURE= ) > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 s =3D &psc_i2s->capture; > + =A0 =A0 =A0 else > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 s =3D &psc_i2s->playback; > + > + =A0 =A0 =A0 dev_dbg(psc_i2s->dev, "psc_i2s_trigger(substream=3D%p, cmd= =3D%i)" > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 " stream_id=3D%i\n", > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 substream, cmd, substream->pstr->stream); > + > + =A0 =A0 =A0 switch (cmd) { > + =A0 =A0 =A0 case SNDRV_PCM_TRIGGER_START: > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 s->period_bytes =3D frames_to_bytes(runtime= , > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 =A0 =A0 =A0 =A0 =A0 runtime->period_size); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 s->period_start =3D virt_to_phys(runtime->d= ma_area); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 s->period_end =3D s->period_start + > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 (s->period_= bytes * runtime->periods); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 s->period_next_pt =3D s->period_start; > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 s->period_current_pt =3D s->period_start; > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 s->active =3D 1; > + > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* First; reset everything */ > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (substream->pstr->stream =3D=3D SNDRV_PC= M_STREAM_CAPTURE) { > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 out_8(®s->command, MPC52= xx_PSC_RST_RX); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 out_8(®s->command, MPC52= xx_PSC_RST_ERR_STAT); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 } else { > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 out_8(®s->command, MPC52= xx_PSC_RST_TX); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 out_8(®s->command, MPC52= xx_PSC_RST_ERR_STAT); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 } > + > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* Next, fill up the bestcomm bd queue and = enable DMA. > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* This will begin filling the PSC's fifo= . */ > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (substream->pstr->stream =3D=3D SNDRV_PC= M_STREAM_CAPTURE) > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 bcom_gen_bd_rx_reset(s->bco= m_task); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 else > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 bcom_gen_bd_tx_reset(s->bco= m_task); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 while (!bcom_queue_full(s->bcom_task)) > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 psc_i2s_bcom_enqueue_next_b= uffer(s); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 bcom_enable(s->bcom_task); > + > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* Due to errata in the i2s mode; need to l= ine up enabling > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* the transmitter with a transition on t= he frame sync > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* line */ > + > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 spin_lock_irqsave(&psc_i2s->lock, flags); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* first make sure it is low */ > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 while ((in_8(®s->ipcr_acr.ipcr) & 0x80) = !=3D 0) > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ; > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* then wait for the transition to high */ > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 while ((in_8(®s->ipcr_acr.ipcr) & 0x80) = =3D=3D 0) > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ; > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* Finally, enable the PSC. > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* Receiver must always be enabled; even = when we only want > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* transmit. =A0(see 15.3.2.3 of MPC5200B= User's Guide) */ > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 psc_cmd =3D MPC52xx_PSC_RX_ENABLE; > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (substream->pstr->stream =3D=3D SNDRV_PC= M_STREAM_PLAYBACK) > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 psc_cmd |=3D MPC52xx_PSC_TX= _ENABLE; > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 out_8(®s->command, psc_cmd); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 spin_unlock_irqrestore(&psc_i2s->lock, flag= s); > + > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 break; > + > + =A0 =A0 =A0 case SNDRV_PCM_TRIGGER_STOP: > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* Turn off the PSC */ > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 s->active =3D 0; > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (substream->pstr->stream =3D=3D SNDRV_PC= M_STREAM_CAPTURE) { > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (!psc_i2s->playback.acti= ve) { > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 out_8(®s= ->command, 2 << 4); =A0/* reset rx */ > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 out_8(®s= ->command, 3 << 4); =A0/* reset tx */ > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 out_8(®s= ->command, 4 << 4); =A0/* reset err */ > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 } else { > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 out_8(®s->command, 3 << = 4); =A0/* reset tx */ > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 out_8(®s->command, 4 << = 4); =A0/* reset err */ > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (!psc_i2s->capture.activ= e) > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 out_8(®s= ->command, 2 << 4); =A0/* reset rx */ > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 } > + > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 bcom_disable(s->bcom_task); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 while (!bcom_queue_empty(s->bcom_task)) > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 bcom_retrieve_buffer(s->bco= m_task, NULL, NULL); > + > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 break; > + > + =A0 =A0 =A0 default: > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 dev_dbg(psc_i2s->dev, "invalid command\n"); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 return -EINVAL; > + =A0 =A0 =A0 } > + > + =A0 =A0 =A0 /* Update interrupt enable settings */ > + =A0 =A0 =A0 imr =3D 0; > + =A0 =A0 =A0 if (psc_i2s->playback.active) > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 imr |=3D MPC52xx_PSC_IMR_TXEMP; > + =A0 =A0 =A0 if (psc_i2s->capture.active) > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 imr |=3D MPC52xx_PSC_IMR_ORERR; > + =A0 =A0 =A0 out_be16(®s->isr_imr.imr, imr); > + > + =A0 =A0 =A0 return 0; > +} > + > +/** > + * psc_i2s_shutdown: shutdown the data transfer on a stream > + * > + * Shutdown the PSC if there are no other substreams open. > + */ > +void psc_i2s_shutdown(struct snd_pcm_substream *substream, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0struct snd_soc_d= ai *dai) > +{ > + =A0 =A0 =A0 struct snd_soc_pcm_runtime *rtd =3D substream->private_data= ; > + =A0 =A0 =A0 struct psc_i2s *psc_i2s =3D rtd->dai->cpu_dai->private_data= ; > + > + =A0 =A0 =A0 dev_dbg(psc_i2s->dev, "psc_i2s_shutdown(substream=3D%p)\n",= substream); > + > + =A0 =A0 =A0 /* > + =A0 =A0 =A0 =A0* If this is the last active substream, disable the PSC = and release > + =A0 =A0 =A0 =A0* the IRQ. > + =A0 =A0 =A0 =A0*/ > + =A0 =A0 =A0 if (!psc_i2s->playback.active && > + =A0 =A0 =A0 =A0 =A0 !psc_i2s->capture.active) { > + > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* Disable all interrupts and reset the PSC= */ > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 out_be16(&psc_i2s->psc_regs->isr_imr.imr, 0= ); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 out_8(&psc_i2s->psc_regs->command, 3 << 4);= /* reset tx */ > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 out_8(&psc_i2s->psc_regs->command, 2 << 4);= /* reset rx */ > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 out_8(&psc_i2s->psc_regs->command, 1 << 4);= /* reset mode */ > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 out_8(&psc_i2s->psc_regs->command, 4 << 4);= /* reset error */ > + > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* Release irqs */ > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 free_irq(psc_i2s->irq, psc_i2s); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 free_irq(psc_i2s->capture.irq, &psc_i2s->ca= pture); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 free_irq(psc_i2s->playback.irq, &psc_i2s->p= layback); > + =A0 =A0 =A0 } > +} > + > +/* --------------------------------------------------------------------- > + * The PSC DMA 'ASoC platform' driver > + * > + * Can be referenced by an 'ASoC machine' driver > + * This driver only deals with the audio bus; it doesn't have any > + * interaction with the attached codec > + */ > + > +static const struct snd_pcm_hardware psc_i2s_pcm_hardware =3D { > + =A0 =A0 =A0 .info =3D SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_MMAP_VALID | > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO= _BLOCK_TRANSFER, > + =A0 =A0 =A0 .formats =3D SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_S16_BE = | > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0SNDRV_PCM_FMTBIT_S24_BE | SNDRV_PCM_= FMTBIT_S32_BE, > + =A0 =A0 =A0 .rate_min =3D 8000, > + =A0 =A0 =A0 .rate_max =3D 48000, > + =A0 =A0 =A0 .channels_min =3D 2, > + =A0 =A0 =A0 .channels_max =3D 2, > + =A0 =A0 =A0 .period_bytes_max =A0 =A0 =A0 =3D 1024 * 1024, > + =A0 =A0 =A0 .period_bytes_min =A0 =A0 =A0 =3D 32, > + =A0 =A0 =A0 .periods_min =A0 =A0 =A0 =A0 =A0 =A0=3D 2, > + =A0 =A0 =A0 .periods_max =A0 =A0 =A0 =A0 =A0 =A0=3D 256, > + =A0 =A0 =A0 .buffer_bytes_max =A0 =A0 =A0 =3D 2 * 1024 * 1024, > + =A0 =A0 =A0 .fifo_size =A0 =A0 =A0 =A0 =A0 =A0 =A0=3D 0, > +}; > + > +static int psc_i2s_pcm_open(struct snd_pcm_substream *substream) > +{ > + =A0 =A0 =A0 struct snd_soc_pcm_runtime *rtd =3D substream->private_data= ; > + =A0 =A0 =A0 struct psc_i2s *psc_i2s =3D rtd->dai->cpu_dai->private_data= ; > + =A0 =A0 =A0 struct psc_i2s_stream *s; > + > + =A0 =A0 =A0 dev_dbg(psc_i2s->dev, "psc_i2s_pcm_open(substream=3D%p)\n",= substream); > + > + =A0 =A0 =A0 if (substream->pstr->stream =3D=3D SNDRV_PCM_STREAM_CAPTURE= ) > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 s =3D &psc_i2s->capture; > + =A0 =A0 =A0 else > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 s =3D &psc_i2s->playback; > + > + =A0 =A0 =A0 snd_soc_set_runtime_hwparams(substream, &psc_i2s_pcm_hardwa= re); > + > + =A0 =A0 =A0 s->stream =3D substream; > + =A0 =A0 =A0 return 0; > +} > + > +static int psc_i2s_pcm_close(struct snd_pcm_substream *substream) > +{ > + =A0 =A0 =A0 struct snd_soc_pcm_runtime *rtd =3D substream->private_data= ; > + =A0 =A0 =A0 struct psc_i2s *psc_i2s =3D rtd->dai->cpu_dai->private_data= ; > + =A0 =A0 =A0 struct psc_i2s_stream *s; > + > + =A0 =A0 =A0 dev_dbg(psc_i2s->dev, "psc_i2s_pcm_close(substream=3D%p)\n"= , substream); > + > + =A0 =A0 =A0 if (substream->pstr->stream =3D=3D SNDRV_PCM_STREAM_CAPTURE= ) > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 s =3D &psc_i2s->capture; > + =A0 =A0 =A0 else > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 s =3D &psc_i2s->playback; > + > + =A0 =A0 =A0 s->stream =3D NULL; > + =A0 =A0 =A0 return 0; > +} > + > +static snd_pcm_uframes_t > +psc_i2s_pcm_pointer(struct snd_pcm_substream *substream) > +{ > + =A0 =A0 =A0 struct snd_soc_pcm_runtime *rtd =3D substream->private_data= ; > + =A0 =A0 =A0 struct psc_i2s *psc_i2s =3D rtd->dai->cpu_dai->private_data= ; > + =A0 =A0 =A0 struct psc_i2s_stream *s; > + =A0 =A0 =A0 dma_addr_t count; > + > + =A0 =A0 =A0 if (substream->pstr->stream =3D=3D SNDRV_PCM_STREAM_CAPTURE= ) > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 s =3D &psc_i2s->capture; > + =A0 =A0 =A0 else > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 s =3D &psc_i2s->playback; > + > + =A0 =A0 =A0 count =3D s->period_current_pt - s->period_start; > + > + =A0 =A0 =A0 return bytes_to_frames(substream->runtime, count); > +} > + > +static struct snd_pcm_ops psc_i2s_pcm_ops =3D { > + =A0 =A0 =A0 .open =A0 =A0 =A0 =A0 =A0 =3D psc_i2s_pcm_open, > + =A0 =A0 =A0 .close =A0 =A0 =A0 =A0 =A0=3D psc_i2s_pcm_close, > + =A0 =A0 =A0 .ioctl =A0 =A0 =A0 =A0 =A0=3D snd_pcm_lib_ioctl, > + =A0 =A0 =A0 .pointer =A0 =A0 =A0 =A0=3D psc_i2s_pcm_pointer, > +}; > + > +static u64 psc_i2s_pcm_dmamask =3D 0xffffffff; > +static int psc_i2s_pcm_new(struct snd_card *card, struct snd_soc_dai *da= i, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0struct snd_pcm *pcm) > +{ > + =A0 =A0 =A0 struct snd_soc_pcm_runtime *rtd =3D pcm->private_data; > + =A0 =A0 =A0 size_t size =3D psc_i2s_pcm_hardware.buffer_bytes_max; > + =A0 =A0 =A0 int rc =3D 0; > + > + =A0 =A0 =A0 dev_dbg(rtd->socdev->dev, "psc_i2s_pcm_new(card=3D%p, dai= =3D%p, pcm=3D%p)\n", > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 card, dai, pcm); > + > + =A0 =A0 =A0 if (!card->dev->dma_mask) > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 card->dev->dma_mask =3D &psc_i2s_pcm_dmamas= k; > + =A0 =A0 =A0 if (!card->dev->coherent_dma_mask) > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 card->dev->coherent_dma_mask =3D 0xffffffff= ; > + > + =A0 =A0 =A0 if (pcm->streams[0].substream) { > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 rc =3D snd_dma_alloc_pages(SNDRV_DMA_TYPE_D= EV, pcm->dev, size, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 &pcm->streams[0].substream->dma_buffer); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (rc) > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 goto playback_alloc_err; > + =A0 =A0 =A0 } > + > + =A0 =A0 =A0 if (pcm->streams[1].substream) { > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 rc =3D snd_dma_alloc_pages(SNDRV_DMA_TYPE_D= EV, pcm->dev, size, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 &pcm->streams[1].substream->dma_buffer); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (rc) > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 goto capture_alloc_err; > + =A0 =A0 =A0 } > + > + =A0 =A0 =A0 return 0; > + > + capture_alloc_err: > + =A0 =A0 =A0 if (pcm->streams[0].substream) > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 snd_dma_free_pages(&pcm->streams[0].substre= am->dma_buffer); > + playback_alloc_err: > + =A0 =A0 =A0 dev_err(card->dev, "Cannot allocate buffer(s)\n"); > + =A0 =A0 =A0 return -ENOMEM; > +} > + > +static void psc_i2s_pcm_free(struct snd_pcm *pcm) > +{ > + =A0 =A0 =A0 struct snd_soc_pcm_runtime *rtd =3D pcm->private_data; > + =A0 =A0 =A0 struct snd_pcm_substream *substream; > + =A0 =A0 =A0 int stream; > + > + =A0 =A0 =A0 dev_dbg(rtd->socdev->dev, "psc_i2s_pcm_free(pcm=3D%p)\n", p= cm); > + > + =A0 =A0 =A0 for (stream =3D 0; stream < 2; stream++) { > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 substream =3D pcm->streams[stream].substrea= m; > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (substream) { > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 snd_dma_free_pages(&substre= am->dma_buffer); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 substream->dma_buffer.area = =3D NULL; > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 substream->dma_buffer.addr = =3D 0; > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 } > + =A0 =A0 =A0 } > +} > + > +struct snd_soc_platform psc_i2s_pcm_soc_platform =3D { > + =A0 =A0 =A0 .name =A0 =A0 =A0 =A0 =A0 =3D "mpc5200-psc-audio", > + =A0 =A0 =A0 .pcm_ops =A0 =A0 =A0 =A0=3D &psc_i2s_pcm_ops, > + =A0 =A0 =A0 .pcm_new =A0 =A0 =A0 =A0=3D &psc_i2s_pcm_new, > + =A0 =A0 =A0 .pcm_free =A0 =A0 =A0 =3D &psc_i2s_pcm_free, > +}; > + > diff --git a/sound/soc/fsl/mpc5200_dma.h b/sound/soc/fsl/mpc5200_dma.h > new file mode 100644 > index 0000000..9a19e8a > --- /dev/null > +++ b/sound/soc/fsl/mpc5200_dma.h > @@ -0,0 +1,81 @@ > +/* > + * Freescale MPC5200 Audio DMA driver > + */ > + > +#ifndef __SOUND_SOC_FSL_MPC5200_DMA_H__ > +#define __SOUND_SOC_FSL_MPC5200_DMA_H__ > + > +/** > + * psc_i2s_stream - Data specific to a single stream (playback or captur= e) > + * @active: =A0 =A0 =A0 =A0 =A0 =A0flag indicating if the stream is acti= ve > + * @psc_i2s: =A0 =A0 =A0 =A0 =A0 pointer back to parent psc_i2s data str= ucture > + * @bcom_task: =A0 =A0 =A0 =A0 bestcomm task structure > + * @irq: =A0 =A0 =A0 =A0 =A0 =A0 =A0 irq number for bestcomm task > + * @period_start: =A0 =A0 =A0physical address of start of DMA region > + * @period_end: =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0physical address of end o= f DMA region > + * @period_next_pt: =A0 =A0physical address of next DMA buffer to enqueu= e > + * @period_bytes: =A0 =A0 =A0size of DMA period in bytes > + */ > +struct psc_i2s_stream { > + =A0 =A0 =A0 int active; > + =A0 =A0 =A0 struct psc_i2s *psc_i2s; > + =A0 =A0 =A0 struct bcom_task *bcom_task; > + =A0 =A0 =A0 int irq; > + =A0 =A0 =A0 struct snd_pcm_substream *stream; > + =A0 =A0 =A0 dma_addr_t period_start; > + =A0 =A0 =A0 dma_addr_t period_end; > + =A0 =A0 =A0 dma_addr_t period_next_pt; > + =A0 =A0 =A0 dma_addr_t period_current_pt; > + =A0 =A0 =A0 int period_bytes; > +}; > + > +/** > + * psc_i2s - Private driver data > + * @name: short name for this device ("PSC0", "PSC1", etc) > + * @psc_regs: pointer to the PSC's registers > + * @fifo_regs: pointer to the PSC's FIFO registers > + * @irq: IRQ of this PSC > + * @dev: struct device pointer > + * @dai: the CPU DAI for this device > + * @sicr: Base value used in serial interface control register; mode is = ORed > + * =A0 =A0 =A0 =A0with this value. > + * @playback: Playback stream context data > + * @capture: Capture stream context data > + */ > +struct psc_i2s { > + =A0 =A0 =A0 char name[32]; > + =A0 =A0 =A0 struct mpc52xx_psc __iomem *psc_regs; > + =A0 =A0 =A0 struct mpc52xx_psc_fifo __iomem *fifo_regs; > + =A0 =A0 =A0 unsigned int irq; > + =A0 =A0 =A0 struct device *dev; > + =A0 =A0 =A0 struct snd_soc_dai dai; > + =A0 =A0 =A0 spinlock_t lock; > + =A0 =A0 =A0 u32 sicr; > + > + =A0 =A0 =A0 /* per-stream data */ > + =A0 =A0 =A0 struct psc_i2s_stream playback; > + =A0 =A0 =A0 struct psc_i2s_stream capture; > + > + =A0 =A0 =A0 /* Statistics */ > + =A0 =A0 =A0 struct { > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 int overrun_count; > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 int underrun_count; > + =A0 =A0 =A0 } stats; > +}; > + > + > +int psc_i2s_startup(struct snd_pcm_substream *substream, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0struct snd_soc_dai *= dai); > + > +int psc_i2s_hw_free(struct snd_pcm_substream *substream, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0struct snd_soc_dai *= dai); > + > +void psc_i2s_shutdown(struct snd_pcm_substream *substream, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0struct snd_soc_d= ai *dai); > + > +int psc_i2s_trigger(struct snd_pcm_substream *substream, int cmd, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0struct snd_soc_dai *= dai); > + > +extern struct snd_soc_platform psc_i2s_pcm_soc_platform; > + > +#endif /* __SOUND_SOC_FSL_MPC5200_DMA_H__ */ > diff --git a/sound/soc/fsl/mpc5200_psc_i2s.c b/sound/soc/fsl/mpc5200_psc_= i2s.c > index 3aa729d..8974b53 100644 > --- a/sound/soc/fsl/mpc5200_psc_i2s.c > +++ b/sound/soc/fsl/mpc5200_psc_i2s.c > @@ -25,6 +25,8 @@ > =A0#include <sysdev/bestcomm/gen_bd.h> > =A0#include <asm/mpc52xx_psc.h> > > +#include "mpc5200_dma.h" > + > =A0MODULE_AUTHOR("Grant Likely <grant.likely@secretlab.ca>"); > =A0MODULE_DESCRIPTION("Freescale MPC5200 PSC in I2S mode ASoC Driver"); > =A0MODULE_LICENSE("GPL"); > @@ -47,179 +49,6 @@ MODULE_LICENSE("GPL"); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 SNDRV_PCM_FMTBIT_S24_BE |= SNDRV_PCM_FMTBIT_S24_BE | \ > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 SNDRV_PCM_FMTBIT_S32_BE) > > -/** > - * psc_i2s_stream - Data specific to a single stream (playback or captur= e) > - * @active: =A0 =A0 =A0 =A0 =A0 =A0flag indicating if the stream is acti= ve > - * @psc_i2s: =A0 =A0 =A0 =A0 =A0 pointer back to parent psc_i2s data str= ucture > - * @bcom_task: =A0 =A0 =A0 =A0 bestcomm task structure > - * @irq: =A0 =A0 =A0 =A0 =A0 =A0 =A0 irq number for bestcomm task > - * @period_start: =A0 =A0 =A0physical address of start of DMA region > - * @period_end: =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0physical address of end o= f DMA region > - * @period_next_pt: =A0 =A0physical address of next DMA buffer to enqueu= e > - * @period_bytes: =A0 =A0 =A0size of DMA period in bytes > - */ > -struct psc_i2s_stream { > - =A0 =A0 =A0 int active; > - =A0 =A0 =A0 struct psc_i2s *psc_i2s; > - =A0 =A0 =A0 struct bcom_task *bcom_task; > - =A0 =A0 =A0 int irq; > - =A0 =A0 =A0 struct snd_pcm_substream *stream; > - =A0 =A0 =A0 dma_addr_t period_start; > - =A0 =A0 =A0 dma_addr_t period_end; > - =A0 =A0 =A0 dma_addr_t period_next_pt; > - =A0 =A0 =A0 dma_addr_t period_current_pt; > - =A0 =A0 =A0 int period_bytes; > -}; > - > -/** > - * psc_i2s - Private driver data > - * @name: short name for this device ("PSC0", "PSC1", etc) > - * @psc_regs: pointer to the PSC's registers > - * @fifo_regs: pointer to the PSC's FIFO registers > - * @irq: IRQ of this PSC > - * @dev: struct device pointer > - * @dai: the CPU DAI for this device > - * @sicr: Base value used in serial interface control register; mode is = ORed > - * =A0 =A0 =A0 =A0with this value. > - * @playback: Playback stream context data > - * @capture: Capture stream context data > - */ > -struct psc_i2s { > - =A0 =A0 =A0 char name[32]; > - =A0 =A0 =A0 struct mpc52xx_psc __iomem *psc_regs; > - =A0 =A0 =A0 struct mpc52xx_psc_fifo __iomem *fifo_regs; > - =A0 =A0 =A0 unsigned int irq; > - =A0 =A0 =A0 struct device *dev; > - =A0 =A0 =A0 struct snd_soc_dai dai; > - =A0 =A0 =A0 spinlock_t lock; > - =A0 =A0 =A0 u32 sicr; > - > - =A0 =A0 =A0 /* per-stream data */ > - =A0 =A0 =A0 struct psc_i2s_stream playback; > - =A0 =A0 =A0 struct psc_i2s_stream capture; > - > - =A0 =A0 =A0 /* Statistics */ > - =A0 =A0 =A0 struct { > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 int overrun_count; > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 int underrun_count; > - =A0 =A0 =A0 } stats; > -}; > - > -/* > - * Interrupt handlers > - */ > -static irqreturn_t psc_i2s_status_irq(int irq, void *_psc_i2s) > -{ > - =A0 =A0 =A0 struct psc_i2s *psc_i2s =3D _psc_i2s; > - =A0 =A0 =A0 struct mpc52xx_psc __iomem *regs =3D psc_i2s->psc_regs; > - =A0 =A0 =A0 u16 isr; > - > - =A0 =A0 =A0 isr =3D in_be16(®s->mpc52xx_psc_isr); > - > - =A0 =A0 =A0 /* Playback underrun error */ > - =A0 =A0 =A0 if (psc_i2s->playback.active && (isr & MPC52xx_PSC_IMR_TXEM= P)) > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 psc_i2s->stats.underrun_count++; > - > - =A0 =A0 =A0 /* Capture overrun error */ > - =A0 =A0 =A0 if (psc_i2s->capture.active && (isr & MPC52xx_PSC_IMR_ORERR= )) > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 psc_i2s->stats.overrun_count++; > - > - =A0 =A0 =A0 out_8(®s->command, 4 << 4); =A0/* reset the error status= */ > - > - =A0 =A0 =A0 return IRQ_HANDLED; > -} > - > -/** > - * psc_i2s_bcom_enqueue_next_buffer - Enqueue another audio buffer > - * @s: pointer to stream private data structure > - * > - * Enqueues another audio period buffer into the bestcomm queue. > - * > - * Note: The routine must only be called when there is space available i= n > - * the queue. =A0Otherwise the enqueue will fail and the audio ring buff= er > - * will get out of sync > - */ > -static void psc_i2s_bcom_enqueue_next_buffer(struct psc_i2s_stream *s) > -{ > - =A0 =A0 =A0 struct bcom_bd *bd; > - > - =A0 =A0 =A0 /* Prepare and enqueue the next buffer descriptor */ > - =A0 =A0 =A0 bd =3D bcom_prepare_next_buffer(s->bcom_task); > - =A0 =A0 =A0 bd->status =3D s->period_bytes; > - =A0 =A0 =A0 bd->data[0] =3D s->period_next_pt; > - =A0 =A0 =A0 bcom_submit_next_buffer(s->bcom_task, NULL); > - > - =A0 =A0 =A0 /* Update for next period */ > - =A0 =A0 =A0 s->period_next_pt +=3D s->period_bytes; > - =A0 =A0 =A0 if (s->period_next_pt >=3D s->period_end) > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 s->period_next_pt =3D s->period_start; > -} > - > -/* Bestcomm DMA irq handler */ > -static irqreturn_t psc_i2s_bcom_irq(int irq, void *_psc_i2s_stream) > -{ > - =A0 =A0 =A0 struct psc_i2s_stream *s =3D _psc_i2s_stream; > - > - =A0 =A0 =A0 /* For each finished period, dequeue the completed period b= uffer > - =A0 =A0 =A0 =A0* and enqueue a new one in it's place. */ > - =A0 =A0 =A0 while (bcom_buffer_done(s->bcom_task)) { > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 bcom_retrieve_buffer(s->bcom_task, NULL, NU= LL); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 s->period_current_pt +=3D s->period_bytes; > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (s->period_current_pt >=3D s->period_end= ) > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 s->period_current_pt =3D s-= >period_start; > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 psc_i2s_bcom_enqueue_next_buffer(s); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 bcom_enable(s->bcom_task); > - =A0 =A0 =A0 } > - > - =A0 =A0 =A0 /* If the stream is active, then also inform the PCM middle= layer > - =A0 =A0 =A0 =A0* of the period finished event. */ > - =A0 =A0 =A0 if (s->active) > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 snd_pcm_period_elapsed(s->stream); > - > - =A0 =A0 =A0 return IRQ_HANDLED; > -} > - > -/** > - * psc_i2s_startup: create a new substream > - * > - * This is the first function called when a stream is opened. > - * > - * If this is the first stream open, then grab the IRQ and program most = of > - * the PSC registers. > - */ > -static int psc_i2s_startup(struct snd_pcm_substream *substream, > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0struct snd_soc_dai *= dai) > -{ > - =A0 =A0 =A0 struct snd_soc_pcm_runtime *rtd =3D substream->private_data= ; > - =A0 =A0 =A0 struct psc_i2s *psc_i2s =3D rtd->dai->cpu_dai->private_data= ; > - =A0 =A0 =A0 int rc; > - > - =A0 =A0 =A0 dev_dbg(psc_i2s->dev, "psc_i2s_startup(substream=3D%p)\n", = substream); > - > - =A0 =A0 =A0 if (!psc_i2s->playback.active && > - =A0 =A0 =A0 =A0 =A0 !psc_i2s->capture.active) { > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* Setup the IRQs */ > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 rc =3D request_irq(psc_i2s->irq, &psc_i2s_s= tatus_irq, IRQF_SHARED, > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0"psc-i2s= -status", psc_i2s); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 rc |=3D request_irq(psc_i2s->capture.irq, > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 &psc_i2= s_bcom_irq, IRQF_SHARED, > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "psc-i2= s-capture", &psc_i2s->capture); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 rc |=3D request_irq(psc_i2s->playback.irq, > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 &psc_i2= s_bcom_irq, IRQF_SHARED, > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "psc-i2= s-playback", &psc_i2s->playback); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (rc) { > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 free_irq(psc_i2s->irq, psc_= i2s); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 free_irq(psc_i2s->capture.i= rq, > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0&psc_i2s= ->capture); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 free_irq(psc_i2s->playback.= irq, > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0&psc_i2s= ->playback); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 return -ENODEV; > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 } > - =A0 =A0 =A0 } > - > - =A0 =A0 =A0 return 0; > -} > - > =A0static int psc_i2s_hw_params(struct snd_pcm_substream *substream, > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct sn= d_pcm_hw_params *params, > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct sn= d_soc_dai *dai) > @@ -258,164 +87,6 @@ static int psc_i2s_hw_params(struct snd_pcm_substrea= m *substream, > =A0 =A0 =A0 =A0return 0; > =A0} > > -static int psc_i2s_hw_free(struct snd_pcm_substream *substream, > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0struct snd_soc_dai *= dai) > -{ > - =A0 =A0 =A0 snd_pcm_set_runtime_buffer(substream, NULL); > - =A0 =A0 =A0 return 0; > -} > - > -/** > - * psc_i2s_trigger: start and stop the DMA transfer. > - * > - * This function is called by ALSA to start, stop, pause, and resume the= DMA > - * transfer of data. > - */ > -static int psc_i2s_trigger(struct snd_pcm_substream *substream, int cmd, > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0struct snd_soc_dai *= dai) > -{ > - =A0 =A0 =A0 struct snd_soc_pcm_runtime *rtd =3D substream->private_data= ; > - =A0 =A0 =A0 struct psc_i2s *psc_i2s =3D rtd->dai->cpu_dai->private_data= ; > - =A0 =A0 =A0 struct snd_pcm_runtime *runtime =3D substream->runtime; > - =A0 =A0 =A0 struct psc_i2s_stream *s; > - =A0 =A0 =A0 struct mpc52xx_psc __iomem *regs =3D psc_i2s->psc_regs; > - =A0 =A0 =A0 u16 imr; > - =A0 =A0 =A0 u8 psc_cmd; > - =A0 =A0 =A0 unsigned long flags; > - > - =A0 =A0 =A0 if (substream->pstr->stream =3D=3D SNDRV_PCM_STREAM_CAPTURE= ) > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 s =3D &psc_i2s->capture; > - =A0 =A0 =A0 else > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 s =3D &psc_i2s->playback; > - > - =A0 =A0 =A0 dev_dbg(psc_i2s->dev, "psc_i2s_trigger(substream=3D%p, cmd= =3D%i)" > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 " stream_id=3D%i\n", > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 substream, cmd, substream->pstr->stream); > - > - =A0 =A0 =A0 switch (cmd) { > - =A0 =A0 =A0 case SNDRV_PCM_TRIGGER_START: > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 s->period_bytes =3D frames_to_bytes(runtime= , > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 =A0 =A0 =A0 =A0 =A0 runtime->period_size); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 s->period_start =3D virt_to_phys(runtime->d= ma_area); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 s->period_end =3D s->period_start + > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 (s->period_= bytes * runtime->periods); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 s->period_next_pt =3D s->period_start; > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 s->period_current_pt =3D s->period_start; > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 s->active =3D 1; > - > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* First; reset everything */ > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (substream->pstr->stream =3D=3D SNDRV_PC= M_STREAM_CAPTURE) { > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 out_8(®s->command, MPC52= xx_PSC_RST_RX); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 out_8(®s->command, MPC52= xx_PSC_RST_ERR_STAT); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 } else { > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 out_8(®s->command, MPC52= xx_PSC_RST_TX); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 out_8(®s->command, MPC52= xx_PSC_RST_ERR_STAT); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 } > - > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* Next, fill up the bestcomm bd queue and = enable DMA. > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* This will begin filling the PSC's fifo= . */ > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (substream->pstr->stream =3D=3D SNDRV_PC= M_STREAM_CAPTURE) > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 bcom_gen_bd_rx_reset(s->bco= m_task); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 else > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 bcom_gen_bd_tx_reset(s->bco= m_task); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 while (!bcom_queue_full(s->bcom_task)) > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 psc_i2s_bcom_enqueue_next_b= uffer(s); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 bcom_enable(s->bcom_task); > - > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* Due to errata in the i2s mode; need to l= ine up enabling > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* the transmitter with a transition on t= he frame sync > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* line */ > - > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 spin_lock_irqsave(&psc_i2s->lock, flags); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* first make sure it is low */ > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 while ((in_8(®s->ipcr_acr.ipcr) & 0x80) = !=3D 0) > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ; > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* then wait for the transition to high */ > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 while ((in_8(®s->ipcr_acr.ipcr) & 0x80) = =3D=3D 0) > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ; > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* Finally, enable the PSC. > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* Receiver must always be enabled; even = when we only want > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* transmit. =A0(see 15.3.2.3 of MPC5200B= User's Guide) */ > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 psc_cmd =3D MPC52xx_PSC_RX_ENABLE; > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (substream->pstr->stream =3D=3D SNDRV_PC= M_STREAM_PLAYBACK) > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 psc_cmd |=3D MPC52xx_PSC_TX= _ENABLE; > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 out_8(®s->command, psc_cmd); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 spin_unlock_irqrestore(&psc_i2s->lock, flag= s); > - > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 break; > - > - =A0 =A0 =A0 case SNDRV_PCM_TRIGGER_STOP: > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* Turn off the PSC */ > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 s->active =3D 0; > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (substream->pstr->stream =3D=3D SNDRV_PC= M_STREAM_CAPTURE) { > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (!psc_i2s->playback.acti= ve) { > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 out_8(®s= ->command, 2 << 4); =A0/* reset rx */ > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 out_8(®s= ->command, 3 << 4); =A0/* reset tx */ > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 out_8(®s= ->command, 4 << 4); =A0/* reset err */ > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 } else { > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 out_8(®s->command, 3 << = 4); =A0/* reset tx */ > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 out_8(®s->command, 4 << = 4); =A0/* reset err */ > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (!psc_i2s->capture.activ= e) > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 out_8(®s= ->command, 2 << 4); =A0/* reset rx */ > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 } > - > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 bcom_disable(s->bcom_task); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 while (!bcom_queue_empty(s->bcom_task)) > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 bcom_retrieve_buffer(s->bco= m_task, NULL, NULL); > - > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 break; > - > - =A0 =A0 =A0 default: > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 dev_dbg(psc_i2s->dev, "invalid command\n"); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 return -EINVAL; > - =A0 =A0 =A0 } > - > - =A0 =A0 =A0 /* Update interrupt enable settings */ > - =A0 =A0 =A0 imr =3D 0; > - =A0 =A0 =A0 if (psc_i2s->playback.active) > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 imr |=3D MPC52xx_PSC_IMR_TXEMP; > - =A0 =A0 =A0 if (psc_i2s->capture.active) > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 imr |=3D MPC52xx_PSC_IMR_ORERR; > - =A0 =A0 =A0 out_be16(®s->isr_imr.imr, imr); > - > - =A0 =A0 =A0 return 0; > -} > - > -/** > - * psc_i2s_shutdown: shutdown the data transfer on a stream > - * > - * Shutdown the PSC if there are no other substreams open. > - */ > -static void psc_i2s_shutdown(struct snd_pcm_substream *substream, > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0struct snd_soc_d= ai *dai) > -{ > - =A0 =A0 =A0 struct snd_soc_pcm_runtime *rtd =3D substream->private_data= ; > - =A0 =A0 =A0 struct psc_i2s *psc_i2s =3D rtd->dai->cpu_dai->private_data= ; > - > - =A0 =A0 =A0 dev_dbg(psc_i2s->dev, "psc_i2s_shutdown(substream=3D%p)\n",= substream); > - > - =A0 =A0 =A0 /* > - =A0 =A0 =A0 =A0* If this is the last active substream, disable the PSC = and release > - =A0 =A0 =A0 =A0* the IRQ. > - =A0 =A0 =A0 =A0*/ > - =A0 =A0 =A0 if (!psc_i2s->playback.active && > - =A0 =A0 =A0 =A0 =A0 !psc_i2s->capture.active) { > - > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* Disable all interrupts and reset the PSC= */ > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 out_be16(&psc_i2s->psc_regs->isr_imr.imr, 0= ); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 out_8(&psc_i2s->psc_regs->command, 3 << 4);= /* reset tx */ > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 out_8(&psc_i2s->psc_regs->command, 2 << 4);= /* reset rx */ > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 out_8(&psc_i2s->psc_regs->command, 1 << 4);= /* reset mode */ > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 out_8(&psc_i2s->psc_regs->command, 4 << 4);= /* reset error */ > - > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* Release irqs */ > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 free_irq(psc_i2s->irq, psc_i2s); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 free_irq(psc_i2s->capture.irq, &psc_i2s->ca= pture); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 free_irq(psc_i2s->playback.irq, &psc_i2s->p= layback); > - =A0 =A0 =A0 } > -} > - > =A0/** > =A0* psc_i2s_set_sysclk: set the clock frequency and direction > =A0* > @@ -495,157 +166,6 @@ static struct snd_soc_dai psc_i2s_dai_template =3D = { > =A0}; > > =A0/* -------------------------------------------------------------------= -- > - * The PSC I2S 'ASoC platform' driver > - * > - * Can be referenced by an 'ASoC machine' driver > - * This driver only deals with the audio bus; it doesn't have any > - * interaction with the attached codec > - */ > - > -static const struct snd_pcm_hardware psc_i2s_pcm_hardware =3D { > - =A0 =A0 =A0 .info =3D SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_MMAP_VALID | > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO= _BLOCK_TRANSFER, > - =A0 =A0 =A0 .formats =3D SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_S16_BE = | > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0SNDRV_PCM_FMTBIT_S24_BE | SNDRV_PCM_= FMTBIT_S32_BE, > - =A0 =A0 =A0 .rate_min =3D 8000, > - =A0 =A0 =A0 .rate_max =3D 48000, > - =A0 =A0 =A0 .channels_min =3D 2, > - =A0 =A0 =A0 .channels_max =3D 2, > - =A0 =A0 =A0 .period_bytes_max =A0 =A0 =A0 =3D 1024 * 1024, > - =A0 =A0 =A0 .period_bytes_min =A0 =A0 =A0 =3D 32, > - =A0 =A0 =A0 .periods_min =A0 =A0 =A0 =A0 =A0 =A0=3D 2, > - =A0 =A0 =A0 .periods_max =A0 =A0 =A0 =A0 =A0 =A0=3D 256, > - =A0 =A0 =A0 .buffer_bytes_max =A0 =A0 =A0 =3D 2 * 1024 * 1024, > - =A0 =A0 =A0 .fifo_size =A0 =A0 =A0 =A0 =A0 =A0 =A0=3D 0, > -}; > - > -static int psc_i2s_pcm_open(struct snd_pcm_substream *substream) > -{ > - =A0 =A0 =A0 struct snd_soc_pcm_runtime *rtd =3D substream->private_data= ; > - =A0 =A0 =A0 struct psc_i2s *psc_i2s =3D rtd->dai->cpu_dai->private_data= ; > - =A0 =A0 =A0 struct psc_i2s_stream *s; > - > - =A0 =A0 =A0 dev_dbg(psc_i2s->dev, "psc_i2s_pcm_open(substream=3D%p)\n",= substream); > - > - =A0 =A0 =A0 if (substream->pstr->stream =3D=3D SNDRV_PCM_STREAM_CAPTURE= ) > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 s =3D &psc_i2s->capture; > - =A0 =A0 =A0 else > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 s =3D &psc_i2s->playback; > - > - =A0 =A0 =A0 snd_soc_set_runtime_hwparams(substream, &psc_i2s_pcm_hardwa= re); > - > - =A0 =A0 =A0 s->stream =3D substream; > - =A0 =A0 =A0 return 0; > -} > - > -static int psc_i2s_pcm_close(struct snd_pcm_substream *substream) > -{ > - =A0 =A0 =A0 struct snd_soc_pcm_runtime *rtd =3D substream->private_data= ; > - =A0 =A0 =A0 struct psc_i2s *psc_i2s =3D rtd->dai->cpu_dai->private_data= ; > - =A0 =A0 =A0 struct psc_i2s_stream *s; > - > - =A0 =A0 =A0 dev_dbg(psc_i2s->dev, "psc_i2s_pcm_close(substream=3D%p)\n"= , substream); > - > - =A0 =A0 =A0 if (substream->pstr->stream =3D=3D SNDRV_PCM_STREAM_CAPTURE= ) > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 s =3D &psc_i2s->capture; > - =A0 =A0 =A0 else > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 s =3D &psc_i2s->playback; > - > - =A0 =A0 =A0 s->stream =3D NULL; > - =A0 =A0 =A0 return 0; > -} > - > -static snd_pcm_uframes_t > -psc_i2s_pcm_pointer(struct snd_pcm_substream *substream) > -{ > - =A0 =A0 =A0 struct snd_soc_pcm_runtime *rtd =3D substream->private_data= ; > - =A0 =A0 =A0 struct psc_i2s *psc_i2s =3D rtd->dai->cpu_dai->private_data= ; > - =A0 =A0 =A0 struct psc_i2s_stream *s; > - =A0 =A0 =A0 dma_addr_t count; > - > - =A0 =A0 =A0 if (substream->pstr->stream =3D=3D SNDRV_PCM_STREAM_CAPTURE= ) > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 s =3D &psc_i2s->capture; > - =A0 =A0 =A0 else > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 s =3D &psc_i2s->playback; > - > - =A0 =A0 =A0 count =3D s->period_current_pt - s->period_start; > - > - =A0 =A0 =A0 return bytes_to_frames(substream->runtime, count); > -} > - > -static struct snd_pcm_ops psc_i2s_pcm_ops =3D { > - =A0 =A0 =A0 .open =A0 =A0 =A0 =A0 =A0 =3D psc_i2s_pcm_open, > - =A0 =A0 =A0 .close =A0 =A0 =A0 =A0 =A0=3D psc_i2s_pcm_close, > - =A0 =A0 =A0 .ioctl =A0 =A0 =A0 =A0 =A0=3D snd_pcm_lib_ioctl, > - =A0 =A0 =A0 .pointer =A0 =A0 =A0 =A0=3D psc_i2s_pcm_pointer, > -}; > - > -static u64 psc_i2s_pcm_dmamask =3D 0xffffffff; > -static int psc_i2s_pcm_new(struct snd_card *card, struct snd_soc_dai *da= i, > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0struct snd_pcm *pcm) > -{ > - =A0 =A0 =A0 struct snd_soc_pcm_runtime *rtd =3D pcm->private_data; > - =A0 =A0 =A0 size_t size =3D psc_i2s_pcm_hardware.buffer_bytes_max; > - =A0 =A0 =A0 int rc =3D 0; > - > - =A0 =A0 =A0 dev_dbg(rtd->socdev->dev, "psc_i2s_pcm_new(card=3D%p, dai= =3D%p, pcm=3D%p)\n", > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 card, dai, pcm); > - > - =A0 =A0 =A0 if (!card->dev->dma_mask) > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 card->dev->dma_mask =3D &psc_i2s_pcm_dmamas= k; > - =A0 =A0 =A0 if (!card->dev->coherent_dma_mask) > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 card->dev->coherent_dma_mask =3D 0xffffffff= ; > - > - =A0 =A0 =A0 if (pcm->streams[0].substream) { > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 rc =3D snd_dma_alloc_pages(SNDRV_DMA_TYPE_D= EV, pcm->dev, size, > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 &pcm->streams[0].substream->dma_buffer); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (rc) > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 goto playback_alloc_err; > - =A0 =A0 =A0 } > - > - =A0 =A0 =A0 if (pcm->streams[1].substream) { > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 rc =3D snd_dma_alloc_pages(SNDRV_DMA_TYPE_D= EV, pcm->dev, size, > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 &pcm->streams[1].substream->dma_buffer); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (rc) > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 goto capture_alloc_err; > - =A0 =A0 =A0 } > - > - =A0 =A0 =A0 return 0; > - > - capture_alloc_err: > - =A0 =A0 =A0 if (pcm->streams[0].substream) > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 snd_dma_free_pages(&pcm->streams[0].substre= am->dma_buffer); > - playback_alloc_err: > - =A0 =A0 =A0 dev_err(card->dev, "Cannot allocate buffer(s)\n"); > - =A0 =A0 =A0 return -ENOMEM; > -} > - > -static void psc_i2s_pcm_free(struct snd_pcm *pcm) > -{ > - =A0 =A0 =A0 struct snd_soc_pcm_runtime *rtd =3D pcm->private_data; > - =A0 =A0 =A0 struct snd_pcm_substream *substream; > - =A0 =A0 =A0 int stream; > - > - =A0 =A0 =A0 dev_dbg(rtd->socdev->dev, "psc_i2s_pcm_free(pcm=3D%p)\n", p= cm); > - > - =A0 =A0 =A0 for (stream =3D 0; stream < 2; stream++) { > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 substream =3D pcm->streams[stream].substrea= m; > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (substream) { > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 snd_dma_free_pages(&substre= am->dma_buffer); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 substream->dma_buffer.area = =3D NULL; > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 substream->dma_buffer.addr = =3D 0; > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 } > - =A0 =A0 =A0 } > -} > - > -struct snd_soc_platform psc_i2s_pcm_soc_platform =3D { > - =A0 =A0 =A0 .name =A0 =A0 =A0 =A0 =A0 =3D "mpc5200-psc-audio", > - =A0 =A0 =A0 .pcm_ops =A0 =A0 =A0 =A0=3D &psc_i2s_pcm_ops, > - =A0 =A0 =A0 .pcm_new =A0 =A0 =A0 =A0=3D &psc_i2s_pcm_new, > - =A0 =A0 =A0 .pcm_free =A0 =A0 =A0 =3D &psc_i2s_pcm_free, > -}; > - > -/* --------------------------------------------------------------------- > =A0* Sysfs attributes for debugging > =A0*/ > > > --=20 Grant Likely, B.Sc., P.Eng. Secret Lab Technologies Ltd. ^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH V1 2/3] Rename the PSC functions to DMA 2009-04-26 19:53 [PATCH V1 0/3] Split the DMA core out from mpc5200_psc_i2s.c Jon Smirl 2009-04-26 19:53 ` [PATCH V1 1/3] Basic split of mpc5200 DMA code out from mpc5200_psc_i2s Jon Smirl @ 2009-04-26 19:53 ` Jon Smirl 2009-04-27 4:04 ` Grant Likely 2009-04-26 19:53 ` [PATCH V1 3/3] Rename exports in mpc5200_dma.c Jon Smirl 2 siblings, 1 reply; 10+ messages in thread From: Jon Smirl @ 2009-04-26 19:53 UTC (permalink / raw) To: grant.likely, linuxppc-dev Rename the functions in the mpc5200 DMA file from i2s to dma to reflect the file they are in. Signed-off-by: Jon Smirl <jonsmirl@gmail.com> --- sound/soc/fsl/mpc5200_dma.c | 194 ++++++++++++++++++++------------------- sound/soc/fsl/mpc5200_dma.h | 26 +++-- sound/soc/fsl/mpc5200_psc_i2s.c | 160 ++++++++++++++++---------------- 3 files changed, 190 insertions(+), 190 deletions(-) diff --git a/sound/soc/fsl/mpc5200_dma.c b/sound/soc/fsl/mpc5200_dma.c index cccaff4..c82ef75 100644 --- a/sound/soc/fsl/mpc5200_dma.c +++ b/sound/soc/fsl/mpc5200_dma.c @@ -34,21 +34,21 @@ MODULE_LICENSE("GPL"); /* * Interrupt handlers */ -static irqreturn_t psc_i2s_status_irq(int irq, void *_psc_i2s) +static irqreturn_t psc_dma_status_irq(int irq, void *_psc_dma) { - struct psc_i2s *psc_i2s = _psc_i2s; - struct mpc52xx_psc __iomem *regs = psc_i2s->psc_regs; + struct psc_dma *psc_dma = _psc_dma; + struct mpc52xx_psc __iomem *regs = psc_dma->psc_regs; u16 isr; isr = in_be16(®s->mpc52xx_psc_isr); /* Playback underrun error */ - if (psc_i2s->playback.active && (isr & MPC52xx_PSC_IMR_TXEMP)) - psc_i2s->stats.underrun_count++; + if (psc_dma->playback.active && (isr & MPC52xx_PSC_IMR_TXEMP)) + psc_dma->stats.underrun_count++; /* Capture overrun error */ - if (psc_i2s->capture.active && (isr & MPC52xx_PSC_IMR_ORERR)) - psc_i2s->stats.overrun_count++; + if (psc_dma->capture.active && (isr & MPC52xx_PSC_IMR_ORERR)) + psc_dma->stats.overrun_count++; out_8(®s->command, 4 << 4); /* reset the error status */ @@ -56,7 +56,7 @@ static irqreturn_t psc_i2s_status_irq(int irq, void *_psc_i2s) } /** - * psc_i2s_bcom_enqueue_next_buffer - Enqueue another audio buffer + * psc_dma_bcom_enqueue_next_buffer - Enqueue another audio buffer * @s: pointer to stream private data structure * * Enqueues another audio period buffer into the bestcomm queue. @@ -65,7 +65,7 @@ static irqreturn_t psc_i2s_status_irq(int irq, void *_psc_i2s) * the queue. Otherwise the enqueue will fail and the audio ring buffer * will get out of sync */ -static void psc_i2s_bcom_enqueue_next_buffer(struct psc_i2s_stream *s) +static void psc_dma_bcom_enqueue_next_buffer(struct psc_dma_stream *s) { struct bcom_bd *bd; @@ -82,9 +82,9 @@ static void psc_i2s_bcom_enqueue_next_buffer(struct psc_i2s_stream *s) } /* Bestcomm DMA irq handler */ -static irqreturn_t psc_i2s_bcom_irq(int irq, void *_psc_i2s_stream) +static irqreturn_t psc_dma_bcom_irq(int irq, void *_psc_dma_stream) { - struct psc_i2s_stream *s = _psc_i2s_stream; + struct psc_dma_stream *s = _psc_dma_stream; /* For each finished period, dequeue the completed period buffer * and enqueue a new one in it's place. */ @@ -93,7 +93,7 @@ static irqreturn_t psc_i2s_bcom_irq(int irq, void *_psc_i2s_stream) s->period_current_pt += s->period_bytes; if (s->period_current_pt >= s->period_end) s->period_current_pt = s->period_start; - psc_i2s_bcom_enqueue_next_buffer(s); + psc_dma_bcom_enqueue_next_buffer(s); bcom_enable(s->bcom_task); } @@ -106,39 +106,39 @@ static irqreturn_t psc_i2s_bcom_irq(int irq, void *_psc_i2s_stream) } /** - * psc_i2s_startup: create a new substream + * psc_dma_startup: create a new substream * * This is the first function called when a stream is opened. * * If this is the first stream open, then grab the IRQ and program most of * the PSC registers. */ -int psc_i2s_startup(struct snd_pcm_substream *substream, +int psc_dma_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct psc_i2s *psc_i2s = rtd->dai->cpu_dai->private_data; + struct psc_dma *psc_dma = rtd->dai->cpu_dai->private_data; int rc; - dev_dbg(psc_i2s->dev, "psc_i2s_startup(substream=%p)\n", substream); + dev_dbg(psc_dma->dev, "psc_dma_startup(substream=%p)\n", substream); - if (!psc_i2s->playback.active && - !psc_i2s->capture.active) { + if (!psc_dma->playback.active && + !psc_dma->capture.active) { /* Setup the IRQs */ - rc = request_irq(psc_i2s->irq, &psc_i2s_status_irq, IRQF_SHARED, - "psc-i2s-status", psc_i2s); - rc |= request_irq(psc_i2s->capture.irq, - &psc_i2s_bcom_irq, IRQF_SHARED, - "psc-i2s-capture", &psc_i2s->capture); - rc |= request_irq(psc_i2s->playback.irq, - &psc_i2s_bcom_irq, IRQF_SHARED, - "psc-i2s-playback", &psc_i2s->playback); + rc = request_irq(psc_dma->irq, &psc_dma_status_irq, IRQF_SHARED, + "psc-dma-status", psc_dma); + rc |= request_irq(psc_dma->capture.irq, + &psc_dma_bcom_irq, IRQF_SHARED, + "psc-dma-capture", &psc_dma->capture); + rc |= request_irq(psc_dma->playback.irq, + &psc_dma_bcom_irq, IRQF_SHARED, + "psc-dma-playback", &psc_dma->playback); if (rc) { - free_irq(psc_i2s->irq, psc_i2s); - free_irq(psc_i2s->capture.irq, - &psc_i2s->capture); - free_irq(psc_i2s->playback.irq, - &psc_i2s->playback); + free_irq(psc_dma->irq, psc_dma); + free_irq(psc_dma->capture.irq, + &psc_dma->capture); + free_irq(psc_dma->playback.irq, + &psc_dma->playback); return -ENODEV; } } @@ -146,7 +146,7 @@ int psc_i2s_startup(struct snd_pcm_substream *substream, return 0; } -int psc_i2s_hw_free(struct snd_pcm_substream *substream, +int psc_dma_hw_free(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { snd_pcm_set_runtime_buffer(substream, NULL); @@ -154,29 +154,29 @@ int psc_i2s_hw_free(struct snd_pcm_substream *substream, } /** - * psc_i2s_trigger: start and stop the DMA transfer. + * psc_dma_trigger: start and stop the DMA transfer. * * This function is called by ALSA to start, stop, pause, and resume the DMA * transfer of data. */ -int psc_i2s_trigger(struct snd_pcm_substream *substream, int cmd, +int psc_dma_trigger(struct snd_pcm_substream *substream, int cmd, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct psc_i2s *psc_i2s = rtd->dai->cpu_dai->private_data; + struct psc_dma *psc_dma = rtd->dai->cpu_dai->private_data; struct snd_pcm_runtime *runtime = substream->runtime; - struct psc_i2s_stream *s; - struct mpc52xx_psc __iomem *regs = psc_i2s->psc_regs; + struct psc_dma_stream *s; + struct mpc52xx_psc __iomem *regs = psc_dma->psc_regs; u16 imr; u8 psc_cmd; unsigned long flags; if (substream->pstr->stream == SNDRV_PCM_STREAM_CAPTURE) - s = &psc_i2s->capture; + s = &psc_dma->capture; else - s = &psc_i2s->playback; + s = &psc_dma->playback; - dev_dbg(psc_i2s->dev, "psc_i2s_trigger(substream=%p, cmd=%i)" + dev_dbg(psc_dma->dev, "psc_dma_trigger(substream=%p, cmd=%i)" " stream_id=%i\n", substream, cmd, substream->pstr->stream); @@ -207,14 +207,14 @@ int psc_i2s_trigger(struct snd_pcm_substream *substream, int cmd, else bcom_gen_bd_tx_reset(s->bcom_task); while (!bcom_queue_full(s->bcom_task)) - psc_i2s_bcom_enqueue_next_buffer(s); + psc_dma_bcom_enqueue_next_buffer(s); bcom_enable(s->bcom_task); - /* Due to errata in the i2s mode; need to line up enabling + /* Due to errata in the dma mode; need to line up enabling * the transmitter with a transition on the frame sync * line */ - spin_lock_irqsave(&psc_i2s->lock, flags); + spin_lock_irqsave(&psc_dma->lock, flags); /* first make sure it is low */ while ((in_8(®s->ipcr_acr.ipcr) & 0x80) != 0) ; @@ -228,7 +228,7 @@ int psc_i2s_trigger(struct snd_pcm_substream *substream, int cmd, if (substream->pstr->stream == SNDRV_PCM_STREAM_PLAYBACK) psc_cmd |= MPC52xx_PSC_TX_ENABLE; out_8(®s->command, psc_cmd); - spin_unlock_irqrestore(&psc_i2s->lock, flags); + spin_unlock_irqrestore(&psc_dma->lock, flags); break; @@ -236,7 +236,7 @@ int psc_i2s_trigger(struct snd_pcm_substream *substream, int cmd, /* Turn off the PSC */ s->active = 0; if (substream->pstr->stream == SNDRV_PCM_STREAM_CAPTURE) { - if (!psc_i2s->playback.active) { + if (!psc_dma->playback.active) { out_8(®s->command, 2 << 4); /* reset rx */ out_8(®s->command, 3 << 4); /* reset tx */ out_8(®s->command, 4 << 4); /* reset err */ @@ -244,7 +244,7 @@ int psc_i2s_trigger(struct snd_pcm_substream *substream, int cmd, } else { out_8(®s->command, 3 << 4); /* reset tx */ out_8(®s->command, 4 << 4); /* reset err */ - if (!psc_i2s->capture.active) + if (!psc_dma->capture.active) out_8(®s->command, 2 << 4); /* reset rx */ } @@ -255,15 +255,15 @@ int psc_i2s_trigger(struct snd_pcm_substream *substream, int cmd, break; default: - dev_dbg(psc_i2s->dev, "invalid command\n"); + dev_dbg(psc_dma->dev, "invalid command\n"); return -EINVAL; } /* Update interrupt enable settings */ imr = 0; - if (psc_i2s->playback.active) + if (psc_dma->playback.active) imr |= MPC52xx_PSC_IMR_TXEMP; - if (psc_i2s->capture.active) + if (psc_dma->capture.active) imr |= MPC52xx_PSC_IMR_ORERR; out_be16(®s->isr_imr.imr, imr); @@ -271,36 +271,36 @@ int psc_i2s_trigger(struct snd_pcm_substream *substream, int cmd, } /** - * psc_i2s_shutdown: shutdown the data transfer on a stream + * psc_dma_shutdown: shutdown the data transfer on a stream * * Shutdown the PSC if there are no other substreams open. */ -void psc_i2s_shutdown(struct snd_pcm_substream *substream, +void psc_dma_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct psc_i2s *psc_i2s = rtd->dai->cpu_dai->private_data; + struct psc_dma *psc_dma = rtd->dai->cpu_dai->private_data; - dev_dbg(psc_i2s->dev, "psc_i2s_shutdown(substream=%p)\n", substream); + dev_dbg(psc_dma->dev, "psc_dma_shutdown(substream=%p)\n", substream); /* * If this is the last active substream, disable the PSC and release * the IRQ. */ - if (!psc_i2s->playback.active && - !psc_i2s->capture.active) { + if (!psc_dma->playback.active && + !psc_dma->capture.active) { /* Disable all interrupts and reset the PSC */ - out_be16(&psc_i2s->psc_regs->isr_imr.imr, 0); - out_8(&psc_i2s->psc_regs->command, 3 << 4); /* reset tx */ - out_8(&psc_i2s->psc_regs->command, 2 << 4); /* reset rx */ - out_8(&psc_i2s->psc_regs->command, 1 << 4); /* reset mode */ - out_8(&psc_i2s->psc_regs->command, 4 << 4); /* reset error */ + out_be16(&psc_dma->psc_regs->isr_imr.imr, 0); + out_8(&psc_dma->psc_regs->command, 3 << 4); /* reset tx */ + out_8(&psc_dma->psc_regs->command, 2 << 4); /* reset rx */ + out_8(&psc_dma->psc_regs->command, 1 << 4); /* reset mode */ + out_8(&psc_dma->psc_regs->command, 4 << 4); /* reset error */ /* Release irqs */ - free_irq(psc_i2s->irq, psc_i2s); - free_irq(psc_i2s->capture.irq, &psc_i2s->capture); - free_irq(psc_i2s->playback.irq, &psc_i2s->playback); + free_irq(psc_dma->irq, psc_dma); + free_irq(psc_dma->capture.irq, &psc_dma->capture); + free_irq(psc_dma->playback.irq, &psc_dma->playback); } } @@ -312,7 +312,7 @@ void psc_i2s_shutdown(struct snd_pcm_substream *substream, * interaction with the attached codec */ -static const struct snd_pcm_hardware psc_i2s_pcm_hardware = { +static const struct snd_pcm_hardware psc_dma_pcm_hardware = { .info = SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_MMAP_VALID | SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_BLOCK_TRANSFER, .formats = SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_S16_BE | @@ -329,80 +329,80 @@ static const struct snd_pcm_hardware psc_i2s_pcm_hardware = { .fifo_size = 0, }; -static int psc_i2s_pcm_open(struct snd_pcm_substream *substream) +static int psc_dma_pcm_open(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct psc_i2s *psc_i2s = rtd->dai->cpu_dai->private_data; - struct psc_i2s_stream *s; + struct psc_dma *psc_dma = rtd->dai->cpu_dai->private_data; + struct psc_dma_stream *s; - dev_dbg(psc_i2s->dev, "psc_i2s_pcm_open(substream=%p)\n", substream); + dev_dbg(psc_dma->dev, "psc_dma_pcm_open(substream=%p)\n", substream); if (substream->pstr->stream == SNDRV_PCM_STREAM_CAPTURE) - s = &psc_i2s->capture; + s = &psc_dma->capture; else - s = &psc_i2s->playback; + s = &psc_dma->playback; - snd_soc_set_runtime_hwparams(substream, &psc_i2s_pcm_hardware); + snd_soc_set_runtime_hwparams(substream, &psc_dma_pcm_hardware); s->stream = substream; return 0; } -static int psc_i2s_pcm_close(struct snd_pcm_substream *substream) +static int psc_dma_pcm_close(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct psc_i2s *psc_i2s = rtd->dai->cpu_dai->private_data; - struct psc_i2s_stream *s; + struct psc_dma *psc_dma = rtd->dai->cpu_dai->private_data; + struct psc_dma_stream *s; - dev_dbg(psc_i2s->dev, "psc_i2s_pcm_close(substream=%p)\n", substream); + dev_dbg(psc_dma->dev, "psc_dma_pcm_close(substream=%p)\n", substream); if (substream->pstr->stream == SNDRV_PCM_STREAM_CAPTURE) - s = &psc_i2s->capture; + s = &psc_dma->capture; else - s = &psc_i2s->playback; + s = &psc_dma->playback; s->stream = NULL; return 0; } static snd_pcm_uframes_t -psc_i2s_pcm_pointer(struct snd_pcm_substream *substream) +psc_dma_pcm_pointer(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct psc_i2s *psc_i2s = rtd->dai->cpu_dai->private_data; - struct psc_i2s_stream *s; + struct psc_dma *psc_dma = rtd->dai->cpu_dai->private_data; + struct psc_dma_stream *s; dma_addr_t count; if (substream->pstr->stream == SNDRV_PCM_STREAM_CAPTURE) - s = &psc_i2s->capture; + s = &psc_dma->capture; else - s = &psc_i2s->playback; + s = &psc_dma->playback; count = s->period_current_pt - s->period_start; return bytes_to_frames(substream->runtime, count); } -static struct snd_pcm_ops psc_i2s_pcm_ops = { - .open = psc_i2s_pcm_open, - .close = psc_i2s_pcm_close, +static struct snd_pcm_ops psc_dma_pcm_ops = { + .open = psc_dma_pcm_open, + .close = psc_dma_pcm_close, .ioctl = snd_pcm_lib_ioctl, - .pointer = psc_i2s_pcm_pointer, + .pointer = psc_dma_pcm_pointer, }; -static u64 psc_i2s_pcm_dmamask = 0xffffffff; -static int psc_i2s_pcm_new(struct snd_card *card, struct snd_soc_dai *dai, +static u64 psc_dma_pcm_dmamask = 0xffffffff; +static int psc_dma_pcm_new(struct snd_card *card, struct snd_soc_dai *dai, struct snd_pcm *pcm) { struct snd_soc_pcm_runtime *rtd = pcm->private_data; - size_t size = psc_i2s_pcm_hardware.buffer_bytes_max; + size_t size = psc_dma_pcm_hardware.buffer_bytes_max; int rc = 0; - dev_dbg(rtd->socdev->dev, "psc_i2s_pcm_new(card=%p, dai=%p, pcm=%p)\n", + dev_dbg(rtd->socdev->dev, "psc_dma_pcm_new(card=%p, dai=%p, pcm=%p)\n", card, dai, pcm); if (!card->dev->dma_mask) - card->dev->dma_mask = &psc_i2s_pcm_dmamask; + card->dev->dma_mask = &psc_dma_pcm_dmamask; if (!card->dev->coherent_dma_mask) card->dev->coherent_dma_mask = 0xffffffff; @@ -430,13 +430,13 @@ static int psc_i2s_pcm_new(struct snd_card *card, struct snd_soc_dai *dai, return -ENOMEM; } -static void psc_i2s_pcm_free(struct snd_pcm *pcm) +static void psc_dma_pcm_free(struct snd_pcm *pcm) { struct snd_soc_pcm_runtime *rtd = pcm->private_data; struct snd_pcm_substream *substream; int stream; - dev_dbg(rtd->socdev->dev, "psc_i2s_pcm_free(pcm=%p)\n", pcm); + dev_dbg(rtd->socdev->dev, "psc_dma_pcm_free(pcm=%p)\n", pcm); for (stream = 0; stream < 2; stream++) { substream = pcm->streams[stream].substream; @@ -448,10 +448,10 @@ static void psc_i2s_pcm_free(struct snd_pcm *pcm) } } -struct snd_soc_platform psc_i2s_pcm_soc_platform = { +struct snd_soc_platform psc_dma_pcm_soc_platform = { .name = "mpc5200-psc-audio", - .pcm_ops = &psc_i2s_pcm_ops, - .pcm_new = &psc_i2s_pcm_new, - .pcm_free = &psc_i2s_pcm_free, + .pcm_ops = &psc_dma_pcm_ops, + .pcm_new = &psc_dma_pcm_new, + .pcm_free = &psc_dma_pcm_free, }; diff --git a/sound/soc/fsl/mpc5200_dma.h b/sound/soc/fsl/mpc5200_dma.h index 9a19e8a..a33232c 100644 --- a/sound/soc/fsl/mpc5200_dma.h +++ b/sound/soc/fsl/mpc5200_dma.h @@ -6,9 +6,9 @@ #define __SOUND_SOC_FSL_MPC5200_DMA_H__ /** - * psc_i2s_stream - Data specific to a single stream (playback or capture) + * psc_dma_stream - Data specific to a single stream (playback or capture) * @active: flag indicating if the stream is active - * @psc_i2s: pointer back to parent psc_i2s data structure + * @psc_dma: pointer back to parent psc_dma data structure * @bcom_task: bestcomm task structure * @irq: irq number for bestcomm task * @period_start: physical address of start of DMA region @@ -16,9 +16,9 @@ * @period_next_pt: physical address of next DMA buffer to enqueue * @period_bytes: size of DMA period in bytes */ -struct psc_i2s_stream { +struct psc_dma_stream { int active; - struct psc_i2s *psc_i2s; + struct psc_dma *psc_dma; struct bcom_task *bcom_task; int irq; struct snd_pcm_substream *stream; @@ -30,7 +30,7 @@ struct psc_i2s_stream { }; /** - * psc_i2s - Private driver data + * psc_dma - Private driver data * @name: short name for this device ("PSC0", "PSC1", etc) * @psc_regs: pointer to the PSC's registers * @fifo_regs: pointer to the PSC's FIFO registers @@ -42,7 +42,7 @@ struct psc_i2s_stream { * @playback: Playback stream context data * @capture: Capture stream context data */ -struct psc_i2s { +struct psc_dma { char name[32]; struct mpc52xx_psc __iomem *psc_regs; struct mpc52xx_psc_fifo __iomem *fifo_regs; @@ -53,8 +53,8 @@ struct psc_i2s { u32 sicr; /* per-stream data */ - struct psc_i2s_stream playback; - struct psc_i2s_stream capture; + struct psc_dma_stream playback; + struct psc_dma_stream capture; /* Statistics */ struct { @@ -64,18 +64,18 @@ struct psc_i2s { }; -int psc_i2s_startup(struct snd_pcm_substream *substream, +int psc_dma_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai); -int psc_i2s_hw_free(struct snd_pcm_substream *substream, +int psc_dma_hw_free(struct snd_pcm_substream *substream, struct snd_soc_dai *dai); -void psc_i2s_shutdown(struct snd_pcm_substream *substream, +void psc_dma_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai); -int psc_i2s_trigger(struct snd_pcm_substream *substream, int cmd, +int psc_dma_trigger(struct snd_pcm_substream *substream, int cmd, struct snd_soc_dai *dai); -extern struct snd_soc_platform psc_i2s_pcm_soc_platform; +extern struct snd_soc_platform psc_dma_pcm_soc_platform; #endif /* __SOUND_SOC_FSL_MPC5200_DMA_H__ */ diff --git a/sound/soc/fsl/mpc5200_psc_i2s.c b/sound/soc/fsl/mpc5200_psc_i2s.c index 8974b53..12a7917 100644 --- a/sound/soc/fsl/mpc5200_psc_i2s.c +++ b/sound/soc/fsl/mpc5200_psc_i2s.c @@ -54,10 +54,10 @@ static int psc_i2s_hw_params(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct psc_i2s *psc_i2s = rtd->dai->cpu_dai->private_data; + struct psc_dma *psc_dma = rtd->dai->cpu_dai->private_data; u32 mode; - dev_dbg(psc_i2s->dev, "%s(substream=%p) p_size=%i p_bytes=%i" + dev_dbg(psc_dma->dev, "%s(substream=%p) p_size=%i p_bytes=%i" " periods=%i buffer_size=%i buffer_bytes=%i\n", __func__, substream, params_period_size(params), params_period_bytes(params), params_periods(params), @@ -77,10 +77,10 @@ static int psc_i2s_hw_params(struct snd_pcm_substream *substream, mode = MPC52xx_PSC_SICR_SIM_CODEC_32; break; default: - dev_dbg(psc_i2s->dev, "invalid format\n"); + dev_dbg(psc_dma->dev, "invalid format\n"); return -EINVAL; } - out_be32(&psc_i2s->psc_regs->sicr, psc_i2s->sicr | mode); + out_be32(&psc_dma->psc_regs->sicr, psc_dma->sicr | mode); snd_pcm_set_runtime_buffer(substream, &substream->dma_buffer); @@ -104,8 +104,8 @@ static int psc_i2s_hw_params(struct snd_pcm_substream *substream, static int psc_i2s_set_sysclk(struct snd_soc_dai *cpu_dai, int clk_id, unsigned int freq, int dir) { - struct psc_i2s *psc_i2s = cpu_dai->private_data; - dev_dbg(psc_i2s->dev, "psc_i2s_set_sysclk(cpu_dai=%p, dir=%i)\n", + struct psc_dma *psc_dma = cpu_dai->private_data; + dev_dbg(psc_dma->dev, "psc_i2s_set_sysclk(cpu_dai=%p, dir=%i)\n", cpu_dai, dir); return (dir == SND_SOC_CLOCK_IN) ? 0 : -EINVAL; } @@ -123,8 +123,8 @@ static int psc_i2s_set_sysclk(struct snd_soc_dai *cpu_dai, */ static int psc_i2s_set_fmt(struct snd_soc_dai *cpu_dai, unsigned int format) { - struct psc_i2s *psc_i2s = cpu_dai->private_data; - dev_dbg(psc_i2s->dev, "psc_i2s_set_fmt(cpu_dai=%p, format=%i)\n", + struct psc_dma *psc_dma = cpu_dai->private_data; + dev_dbg(psc_dma->dev, "psc_i2s_set_fmt(cpu_dai=%p, format=%i)\n", cpu_dai, format); return (format == SND_SOC_DAIFMT_I2S) ? 0 : -EINVAL; } @@ -140,11 +140,11 @@ static int psc_i2s_set_fmt(struct snd_soc_dai *cpu_dai, unsigned int format) * psc_i2s_dai_template: template CPU Digital Audio Interface */ static struct snd_soc_dai_ops psc_i2s_dai_ops = { - .startup = psc_i2s_startup, + .startup = psc_dma_startup, .hw_params = psc_i2s_hw_params, - .hw_free = psc_i2s_hw_free, - .shutdown = psc_i2s_shutdown, - .trigger = psc_i2s_trigger, + .hw_free = psc_dma_hw_free, + .shutdown = psc_dma_shutdown, + .trigger = psc_dma_trigger, .set_sysclk = psc_i2s_set_sysclk, .set_fmt = psc_i2s_set_fmt, }; @@ -172,24 +172,24 @@ static struct snd_soc_dai psc_i2s_dai_template = { static ssize_t psc_i2s_status_show(struct device *dev, struct device_attribute *attr, char *buf) { - struct psc_i2s *psc_i2s = dev_get_drvdata(dev); + struct psc_dma *psc_dma = dev_get_drvdata(dev); return sprintf(buf, "status=%.4x sicr=%.8x rfnum=%i rfstat=0x%.4x " "tfnum=%i tfstat=0x%.4x\n", - in_be16(&psc_i2s->psc_regs->sr_csr.status), - in_be32(&psc_i2s->psc_regs->sicr), - in_be16(&psc_i2s->fifo_regs->rfnum) & 0x1ff, - in_be16(&psc_i2s->fifo_regs->rfstat), - in_be16(&psc_i2s->fifo_regs->tfnum) & 0x1ff, - in_be16(&psc_i2s->fifo_regs->tfstat)); + in_be16(&psc_dma->psc_regs->sr_csr.status), + in_be32(&psc_dma->psc_regs->sicr), + in_be16(&psc_dma->fifo_regs->rfnum) & 0x1ff, + in_be16(&psc_dma->fifo_regs->rfstat), + in_be16(&psc_dma->fifo_regs->tfnum) & 0x1ff, + in_be16(&psc_dma->fifo_regs->tfstat)); } -static int *psc_i2s_get_stat_attr(struct psc_i2s *psc_i2s, const char *name) +static int *psc_i2s_get_stat_attr(struct psc_dma *psc_dma, const char *name) { if (strcmp(name, "playback_underrun") == 0) - return &psc_i2s->stats.underrun_count; + return &psc_dma->stats.underrun_count; if (strcmp(name, "capture_overrun") == 0) - return &psc_i2s->stats.overrun_count; + return &psc_dma->stats.overrun_count; return NULL; } @@ -197,10 +197,10 @@ static int *psc_i2s_get_stat_attr(struct psc_i2s *psc_i2s, const char *name) static ssize_t psc_i2s_stat_show(struct device *dev, struct device_attribute *attr, char *buf) { - struct psc_i2s *psc_i2s = dev_get_drvdata(dev); + struct psc_dma *psc_dma = dev_get_drvdata(dev); int *attrib; - attrib = psc_i2s_get_stat_attr(psc_i2s, attr->attr.name); + attrib = psc_i2s_get_stat_attr(psc_dma, attr->attr.name); if (!attrib) return 0; @@ -212,10 +212,10 @@ static ssize_t psc_i2s_stat_store(struct device *dev, const char *buf, size_t count) { - struct psc_i2s *psc_i2s = dev_get_drvdata(dev); + struct psc_dma *psc_dma = dev_get_drvdata(dev); int *attrib; - attrib = psc_i2s_get_stat_attr(psc_i2s, attr->attr.name); + attrib = psc_i2s_get_stat_attr(psc_dma, attr->attr.name); if (!attrib) return 0; @@ -238,7 +238,7 @@ static int __devinit psc_i2s_of_probe(struct of_device *op, const struct of_device_id *match) { phys_addr_t fifo; - struct psc_i2s *psc_i2s; + struct psc_dma *psc_dma; struct resource res; int size, psc_id, irq, rc; const __be32 *prop; @@ -265,56 +265,56 @@ static int __devinit psc_i2s_of_probe(struct of_device *op, } /* Allocate and initialize the driver private data */ - psc_i2s = kzalloc(sizeof *psc_i2s, GFP_KERNEL); - if (!psc_i2s) { + psc_dma = kzalloc(sizeof *psc_dma, GFP_KERNEL); + if (!psc_dma) { iounmap(regs); return -ENOMEM; } - spin_lock_init(&psc_i2s->lock); - psc_i2s->irq = irq; - psc_i2s->psc_regs = regs; - psc_i2s->fifo_regs = regs + sizeof *psc_i2s->psc_regs; - psc_i2s->dev = &op->dev; - psc_i2s->playback.psc_i2s = psc_i2s; - psc_i2s->capture.psc_i2s = psc_i2s; - snprintf(psc_i2s->name, sizeof psc_i2s->name, "PSC%u", psc_id+1); + spin_lock_init(&psc_dma->lock); + psc_dma->irq = irq; + psc_dma->psc_regs = regs; + psc_dma->fifo_regs = regs + sizeof *psc_dma->psc_regs; + psc_dma->dev = &op->dev; + psc_dma->playback.psc_dma = psc_dma; + psc_dma->capture.psc_dma = psc_dma; + snprintf(psc_dma->name, sizeof psc_dma->name, "PSC%u", psc_id+1); /* Fill out the CPU DAI structure */ - memcpy(&psc_i2s->dai, &psc_i2s_dai_template, sizeof psc_i2s->dai); - psc_i2s->dai.private_data = psc_i2s; - psc_i2s->dai.name = psc_i2s->name; - psc_i2s->dai.id = psc_id; + memcpy(&psc_dma->dai, &psc_i2s_dai_template, sizeof psc_dma->dai); + psc_dma->dai.private_data = psc_dma; + psc_dma->dai.name = psc_dma->name; + psc_dma->dai.id = psc_id; /* Find the address of the fifo data registers and setup the * DMA tasks */ fifo = res.start + offsetof(struct mpc52xx_psc, buffer.buffer_32); - psc_i2s->capture.bcom_task = + psc_dma->capture.bcom_task = bcom_psc_gen_bd_rx_init(psc_id, 10, fifo, 512); - psc_i2s->playback.bcom_task = + psc_dma->playback.bcom_task = bcom_psc_gen_bd_tx_init(psc_id, 10, fifo); - if (!psc_i2s->capture.bcom_task || - !psc_i2s->playback.bcom_task) { + if (!psc_dma->capture.bcom_task || + !psc_dma->playback.bcom_task) { dev_err(&op->dev, "Could not allocate bestcomm tasks\n"); iounmap(regs); - kfree(psc_i2s); + kfree(psc_dma); return -ENODEV; } /* Disable all interrupts and reset the PSC */ - out_be16(&psc_i2s->psc_regs->isr_imr.imr, 0); - out_8(&psc_i2s->psc_regs->command, 3 << 4); /* reset transmitter */ - out_8(&psc_i2s->psc_regs->command, 2 << 4); /* reset receiver */ - out_8(&psc_i2s->psc_regs->command, 1 << 4); /* reset mode */ - out_8(&psc_i2s->psc_regs->command, 4 << 4); /* reset error */ + out_be16(&psc_dma->psc_regs->isr_imr.imr, 0); + out_8(&psc_dma->psc_regs->command, 3 << 4); /* reset transmitter */ + out_8(&psc_dma->psc_regs->command, 2 << 4); /* reset receiver */ + out_8(&psc_dma->psc_regs->command, 1 << 4); /* reset mode */ + out_8(&psc_dma->psc_regs->command, 4 << 4); /* reset error */ /* Configure the serial interface mode; defaulting to CODEC8 mode */ - psc_i2s->sicr = MPC52xx_PSC_SICR_DTS1 | MPC52xx_PSC_SICR_I2S | + psc_dma->sicr = MPC52xx_PSC_SICR_DTS1 | MPC52xx_PSC_SICR_I2S | MPC52xx_PSC_SICR_CLKPOL; if (of_get_property(op->node, "fsl,cellslave", NULL)) - psc_i2s->sicr |= MPC52xx_PSC_SICR_CELLSLAVE | + psc_dma->sicr |= MPC52xx_PSC_SICR_CELLSLAVE | MPC52xx_PSC_SICR_GENCLK; - out_be32(&psc_i2s->psc_regs->sicr, - psc_i2s->sicr | MPC52xx_PSC_SICR_SIM_CODEC_8); + out_be32(&psc_dma->psc_regs->sicr, + psc_dma->sicr | MPC52xx_PSC_SICR_SIM_CODEC_8); /* Check for the codec handle. If it is not present then we * are done */ @@ -325,54 +325,54 @@ static int __devinit psc_i2s_of_probe(struct of_device *op, * First write: RxRdy (FIFO Alarm) generates rx FIFO irq * Second write: register Normal mode for non loopback */ - out_8(&psc_i2s->psc_regs->mode, 0); - out_8(&psc_i2s->psc_regs->mode, 0); + out_8(&psc_dma->psc_regs->mode, 0); + out_8(&psc_dma->psc_regs->mode, 0); /* Set the TX and RX fifo alarm thresholds */ - out_be16(&psc_i2s->fifo_regs->rfalarm, 0x100); - out_8(&psc_i2s->fifo_regs->rfcntl, 0x4); - out_be16(&psc_i2s->fifo_regs->tfalarm, 0x100); - out_8(&psc_i2s->fifo_regs->tfcntl, 0x7); + out_be16(&psc_dma->fifo_regs->rfalarm, 0x100); + out_8(&psc_dma->fifo_regs->rfcntl, 0x4); + out_be16(&psc_dma->fifo_regs->tfalarm, 0x100); + out_8(&psc_dma->fifo_regs->tfcntl, 0x7); /* Lookup the IRQ numbers */ - psc_i2s->playback.irq = - bcom_get_task_irq(psc_i2s->playback.bcom_task); - psc_i2s->capture.irq = - bcom_get_task_irq(psc_i2s->capture.bcom_task); + psc_dma->playback.irq = + bcom_get_task_irq(psc_dma->playback.bcom_task); + psc_dma->capture.irq = + bcom_get_task_irq(psc_dma->capture.bcom_task); /* Save what we've done so it can be found again later */ - dev_set_drvdata(&op->dev, psc_i2s); + dev_set_drvdata(&op->dev, psc_dma); /* Register the SYSFS files */ - rc = device_create_file(psc_i2s->dev, &dev_attr_status); - rc |= device_create_file(psc_i2s->dev, &dev_attr_capture_overrun); - rc |= device_create_file(psc_i2s->dev, &dev_attr_playback_underrun); + rc = device_create_file(psc_dma->dev, &dev_attr_status); + rc |= device_create_file(psc_dma->dev, &dev_attr_capture_overrun); + rc |= device_create_file(psc_dma->dev, &dev_attr_playback_underrun); if (rc) - dev_info(psc_i2s->dev, "error creating sysfs files\n"); + dev_info(psc_dma->dev, "error creating sysfs files\n"); - snd_soc_register_platform(&psc_i2s_pcm_soc_platform); + snd_soc_register_platform(&psc_dma_pcm_soc_platform); /* Tell the ASoC OF helpers about it */ - of_snd_soc_register_platform(&psc_i2s_pcm_soc_platform, op->node, - &psc_i2s->dai); + of_snd_soc_register_platform(&psc_dma_pcm_soc_platform, op->node, + &psc_dma->dai); return 0; } static int __devexit psc_i2s_of_remove(struct of_device *op) { - struct psc_i2s *psc_i2s = dev_get_drvdata(&op->dev); + struct psc_dma *psc_dma = dev_get_drvdata(&op->dev); dev_dbg(&op->dev, "psc_i2s_remove()\n"); - snd_soc_unregister_platform(&psc_i2s_pcm_soc_platform); + snd_soc_unregister_platform(&psc_dma_pcm_soc_platform); - bcom_gen_bd_rx_release(psc_i2s->capture.bcom_task); - bcom_gen_bd_tx_release(psc_i2s->playback.bcom_task); + bcom_gen_bd_rx_release(psc_dma->capture.bcom_task); + bcom_gen_bd_tx_release(psc_dma->playback.bcom_task); - iounmap(psc_i2s->psc_regs); - iounmap(psc_i2s->fifo_regs); - kfree(psc_i2s); + iounmap(psc_dma->psc_regs); + iounmap(psc_dma->fifo_regs); + kfree(psc_dma); dev_set_drvdata(&op->dev, NULL); return 0; ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH V1 2/3] Rename the PSC functions to DMA 2009-04-26 19:53 ` [PATCH V1 2/3] Rename the PSC functions to DMA Jon Smirl @ 2009-04-27 4:04 ` Grant Likely 2009-04-27 4:33 ` Grant Likely 0 siblings, 1 reply; 10+ messages in thread From: Grant Likely @ 2009-04-27 4:04 UTC (permalink / raw) To: Jon Smirl; +Cc: linuxppc-dev On Sun, Apr 26, 2009 at 1:53 PM, Jon Smirl <jonsmirl@gmail.com> wrote: > Rename the functions in the mpc5200 DMA file from i2s to dma to reflect t= he file they are in. > > Signed-off-by: Jon Smirl <jonsmirl@gmail.com> Acked-by: Grant Likely <grant.likely@secretlab.ca> > --- > =A0sound/soc/fsl/mpc5200_dma.c =A0 =A0 | =A0194 ++++++++++++++++++++-----= -------------- > =A0sound/soc/fsl/mpc5200_dma.h =A0 =A0 | =A0 26 +++-- > =A0sound/soc/fsl/mpc5200_psc_i2s.c | =A0160 ++++++++++++++++-------------= --- > =A03 files changed, 190 insertions(+), 190 deletions(-) > > diff --git a/sound/soc/fsl/mpc5200_dma.c b/sound/soc/fsl/mpc5200_dma.c > index cccaff4..c82ef75 100644 > --- a/sound/soc/fsl/mpc5200_dma.c > +++ b/sound/soc/fsl/mpc5200_dma.c > @@ -34,21 +34,21 @@ MODULE_LICENSE("GPL"); > =A0/* > =A0* Interrupt handlers > =A0*/ > -static irqreturn_t psc_i2s_status_irq(int irq, void *_psc_i2s) > +static irqreturn_t psc_dma_status_irq(int irq, void *_psc_dma) > =A0{ > - =A0 =A0 =A0 struct psc_i2s *psc_i2s =3D _psc_i2s; > - =A0 =A0 =A0 struct mpc52xx_psc __iomem *regs =3D psc_i2s->psc_regs; > + =A0 =A0 =A0 struct psc_dma *psc_dma =3D _psc_dma; > + =A0 =A0 =A0 struct mpc52xx_psc __iomem *regs =3D psc_dma->psc_regs; > =A0 =A0 =A0 =A0u16 isr; > > =A0 =A0 =A0 =A0isr =3D in_be16(®s->mpc52xx_psc_isr); > > =A0 =A0 =A0 =A0/* Playback underrun error */ > - =A0 =A0 =A0 if (psc_i2s->playback.active && (isr & MPC52xx_PSC_IMR_TXEM= P)) > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 psc_i2s->stats.underrun_count++; > + =A0 =A0 =A0 if (psc_dma->playback.active && (isr & MPC52xx_PSC_IMR_TXEM= P)) > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 psc_dma->stats.underrun_count++; > > =A0 =A0 =A0 =A0/* Capture overrun error */ > - =A0 =A0 =A0 if (psc_i2s->capture.active && (isr & MPC52xx_PSC_IMR_ORERR= )) > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 psc_i2s->stats.overrun_count++; > + =A0 =A0 =A0 if (psc_dma->capture.active && (isr & MPC52xx_PSC_IMR_ORERR= )) > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 psc_dma->stats.overrun_count++; > > =A0 =A0 =A0 =A0out_8(®s->command, 4 << 4); =A0/* reset the error statu= s */ > > @@ -56,7 +56,7 @@ static irqreturn_t psc_i2s_status_irq(int irq, void *_p= sc_i2s) > =A0} > > =A0/** > - * psc_i2s_bcom_enqueue_next_buffer - Enqueue another audio buffer > + * psc_dma_bcom_enqueue_next_buffer - Enqueue another audio buffer > =A0* @s: pointer to stream private data structure > =A0* > =A0* Enqueues another audio period buffer into the bestcomm queue. > @@ -65,7 +65,7 @@ static irqreturn_t psc_i2s_status_irq(int irq, void *_p= sc_i2s) > =A0* the queue. =A0Otherwise the enqueue will fail and the audio ring buf= fer > =A0* will get out of sync > =A0*/ > -static void psc_i2s_bcom_enqueue_next_buffer(struct psc_i2s_stream *s) > +static void psc_dma_bcom_enqueue_next_buffer(struct psc_dma_stream *s) > =A0{ > =A0 =A0 =A0 =A0struct bcom_bd *bd; > > @@ -82,9 +82,9 @@ static void psc_i2s_bcom_enqueue_next_buffer(struct psc= _i2s_stream *s) > =A0} > > =A0/* Bestcomm DMA irq handler */ > -static irqreturn_t psc_i2s_bcom_irq(int irq, void *_psc_i2s_stream) > +static irqreturn_t psc_dma_bcom_irq(int irq, void *_psc_dma_stream) > =A0{ > - =A0 =A0 =A0 struct psc_i2s_stream *s =3D _psc_i2s_stream; > + =A0 =A0 =A0 struct psc_dma_stream *s =3D _psc_dma_stream; > > =A0 =A0 =A0 =A0/* For each finished period, dequeue the completed period = buffer > =A0 =A0 =A0 =A0 * and enqueue a new one in it's place. */ > @@ -93,7 +93,7 @@ static irqreturn_t psc_i2s_bcom_irq(int irq, void *_psc= _i2s_stream) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0s->period_current_pt +=3D s->period_bytes; > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0if (s->period_current_pt >=3D s->period_en= d) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0s->period_current_pt =3D s= ->period_start; > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 psc_i2s_bcom_enqueue_next_buffer(s); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 psc_dma_bcom_enqueue_next_buffer(s); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0bcom_enable(s->bcom_task); > =A0 =A0 =A0 =A0} > > @@ -106,39 +106,39 @@ static irqreturn_t psc_i2s_bcom_irq(int irq, void *= _psc_i2s_stream) > =A0} > > =A0/** > - * psc_i2s_startup: create a new substream > + * psc_dma_startup: create a new substream > =A0* > =A0* This is the first function called when a stream is opened. > =A0* > =A0* If this is the first stream open, then grab the IRQ and program most= of > =A0* the PSC registers. > =A0*/ > -int psc_i2s_startup(struct snd_pcm_substream *substream, > +int psc_dma_startup(struct snd_pcm_substream *substream, > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct snd_soc_dai *d= ai) > =A0{ > =A0 =A0 =A0 =A0struct snd_soc_pcm_runtime *rtd =3D substream->private_dat= a; > - =A0 =A0 =A0 struct psc_i2s *psc_i2s =3D rtd->dai->cpu_dai->private_data= ; > + =A0 =A0 =A0 struct psc_dma *psc_dma =3D rtd->dai->cpu_dai->private_data= ; > =A0 =A0 =A0 =A0int rc; > > - =A0 =A0 =A0 dev_dbg(psc_i2s->dev, "psc_i2s_startup(substream=3D%p)\n", = substream); > + =A0 =A0 =A0 dev_dbg(psc_dma->dev, "psc_dma_startup(substream=3D%p)\n", = substream); > > - =A0 =A0 =A0 if (!psc_i2s->playback.active && > - =A0 =A0 =A0 =A0 =A0 !psc_i2s->capture.active) { > + =A0 =A0 =A0 if (!psc_dma->playback.active && > + =A0 =A0 =A0 =A0 =A0 !psc_dma->capture.active) { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0/* Setup the IRQs */ > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 rc =3D request_irq(psc_i2s->irq, &psc_i2s_s= tatus_irq, IRQF_SHARED, > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0"psc-i2s= -status", psc_i2s); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 rc |=3D request_irq(psc_i2s->capture.irq, > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 &psc_i2= s_bcom_irq, IRQF_SHARED, > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "psc-i2= s-capture", &psc_i2s->capture); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 rc |=3D request_irq(psc_i2s->playback.irq, > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 &psc_i2= s_bcom_irq, IRQF_SHARED, > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "psc-i2= s-playback", &psc_i2s->playback); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 rc =3D request_irq(psc_dma->irq, &psc_dma_s= tatus_irq, IRQF_SHARED, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0"psc-dma= -status", psc_dma); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 rc |=3D request_irq(psc_dma->capture.irq, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 &psc_dm= a_bcom_irq, IRQF_SHARED, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "psc-dm= a-capture", &psc_dma->capture); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 rc |=3D request_irq(psc_dma->playback.irq, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 &psc_dm= a_bcom_irq, IRQF_SHARED, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "psc-dm= a-playback", &psc_dma->playback); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0if (rc) { > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 free_irq(psc_i2s->irq, psc_= i2s); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 free_irq(psc_i2s->capture.i= rq, > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0&psc_i2s= ->capture); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 free_irq(psc_i2s->playback.= irq, > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0&psc_i2s= ->playback); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 free_irq(psc_dma->irq, psc_= dma); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 free_irq(psc_dma->capture.i= rq, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0&psc_dma= ->capture); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 free_irq(psc_dma->playback.= irq, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0&psc_dma= ->playback); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0return -ENODEV; > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0} > =A0 =A0 =A0 =A0} > @@ -146,7 +146,7 @@ int psc_i2s_startup(struct snd_pcm_substream *substre= am, > =A0 =A0 =A0 =A0return 0; > =A0} > > -int psc_i2s_hw_free(struct snd_pcm_substream *substream, > +int psc_dma_hw_free(struct snd_pcm_substream *substream, > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct snd_soc_dai *d= ai) > =A0{ > =A0 =A0 =A0 =A0snd_pcm_set_runtime_buffer(substream, NULL); > @@ -154,29 +154,29 @@ int psc_i2s_hw_free(struct snd_pcm_substream *subst= ream, > =A0} > > =A0/** > - * psc_i2s_trigger: start and stop the DMA transfer. > + * psc_dma_trigger: start and stop the DMA transfer. > =A0* > =A0* This function is called by ALSA to start, stop, pause, and resume th= e DMA > =A0* transfer of data. > =A0*/ > -int psc_i2s_trigger(struct snd_pcm_substream *substream, int cmd, > +int psc_dma_trigger(struct snd_pcm_substream *substream, int cmd, > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct snd_soc_dai *d= ai) > =A0{ > =A0 =A0 =A0 =A0struct snd_soc_pcm_runtime *rtd =3D substream->private_dat= a; > - =A0 =A0 =A0 struct psc_i2s *psc_i2s =3D rtd->dai->cpu_dai->private_data= ; > + =A0 =A0 =A0 struct psc_dma *psc_dma =3D rtd->dai->cpu_dai->private_data= ; > =A0 =A0 =A0 =A0struct snd_pcm_runtime *runtime =3D substream->runtime; > - =A0 =A0 =A0 struct psc_i2s_stream *s; > - =A0 =A0 =A0 struct mpc52xx_psc __iomem *regs =3D psc_i2s->psc_regs; > + =A0 =A0 =A0 struct psc_dma_stream *s; > + =A0 =A0 =A0 struct mpc52xx_psc __iomem *regs =3D psc_dma->psc_regs; > =A0 =A0 =A0 =A0u16 imr; > =A0 =A0 =A0 =A0u8 psc_cmd; > =A0 =A0 =A0 =A0unsigned long flags; > > =A0 =A0 =A0 =A0if (substream->pstr->stream =3D=3D SNDRV_PCM_STREAM_CAPTUR= E) > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 s =3D &psc_i2s->capture; > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 s =3D &psc_dma->capture; > =A0 =A0 =A0 =A0else > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 s =3D &psc_i2s->playback; > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 s =3D &psc_dma->playback; > > - =A0 =A0 =A0 dev_dbg(psc_i2s->dev, "psc_i2s_trigger(substream=3D%p, cmd= =3D%i)" > + =A0 =A0 =A0 dev_dbg(psc_dma->dev, "psc_dma_trigger(substream=3D%p, cmd= =3D%i)" > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0" stream_id=3D%i\n", > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0substream, cmd, substream->pstr->stream); > > @@ -207,14 +207,14 @@ int psc_i2s_trigger(struct snd_pcm_substream *subst= ream, int cmd, > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0else > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0bcom_gen_bd_tx_reset(s->bc= om_task); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0while (!bcom_queue_full(s->bcom_task)) > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 psc_i2s_bcom_enqueue_next_b= uffer(s); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 psc_dma_bcom_enqueue_next_b= uffer(s); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0bcom_enable(s->bcom_task); > > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* Due to errata in the i2s mode; need to l= ine up enabling > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* Due to errata in the dma mode; need to l= ine up enabling > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 * the transmitter with a transition on th= e frame sync > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 * line */ > > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 spin_lock_irqsave(&psc_i2s->lock, flags); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 spin_lock_irqsave(&psc_dma->lock, flags); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0/* first make sure it is low */ > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0while ((in_8(®s->ipcr_acr.ipcr) & 0x80)= !=3D 0) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0; > @@ -228,7 +228,7 @@ int psc_i2s_trigger(struct snd_pcm_substream *substre= am, int cmd, > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0if (substream->pstr->stream =3D=3D SNDRV_P= CM_STREAM_PLAYBACK) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0psc_cmd |=3D MPC52xx_PSC_T= X_ENABLE; > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0out_8(®s->command, psc_cmd); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 spin_unlock_irqrestore(&psc_i2s->lock, flag= s); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 spin_unlock_irqrestore(&psc_dma->lock, flag= s); > > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0break; > > @@ -236,7 +236,7 @@ int psc_i2s_trigger(struct snd_pcm_substream *substre= am, int cmd, > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0/* Turn off the PSC */ > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0s->active =3D 0; > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0if (substream->pstr->stream =3D=3D SNDRV_P= CM_STREAM_CAPTURE) { > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (!psc_i2s->playback.acti= ve) { > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (!psc_dma->playback.acti= ve) { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0out_8(®= s->command, 2 << 4); =A0/* reset rx */ > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0out_8(®= s->command, 3 << 4); =A0/* reset tx */ > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0out_8(®= s->command, 4 << 4); =A0/* reset err */ > @@ -244,7 +244,7 @@ int psc_i2s_trigger(struct snd_pcm_substream *substre= am, int cmd, > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0} else { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0out_8(®s->command, 3 <<= 4); =A0/* reset tx */ > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0out_8(®s->command, 4 <<= 4); =A0/* reset err */ > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (!psc_i2s->capture.activ= e) > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (!psc_dma->capture.activ= e) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0out_8(®= s->command, 2 << 4); =A0/* reset rx */ > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0} > > @@ -255,15 +255,15 @@ int psc_i2s_trigger(struct snd_pcm_substream *subst= ream, int cmd, > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0break; > > =A0 =A0 =A0 =A0default: > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 dev_dbg(psc_i2s->dev, "invalid command\n"); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 dev_dbg(psc_dma->dev, "invalid command\n"); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0return -EINVAL; > =A0 =A0 =A0 =A0} > > =A0 =A0 =A0 =A0/* Update interrupt enable settings */ > =A0 =A0 =A0 =A0imr =3D 0; > - =A0 =A0 =A0 if (psc_i2s->playback.active) > + =A0 =A0 =A0 if (psc_dma->playback.active) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0imr |=3D MPC52xx_PSC_IMR_TXEMP; > - =A0 =A0 =A0 if (psc_i2s->capture.active) > + =A0 =A0 =A0 if (psc_dma->capture.active) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0imr |=3D MPC52xx_PSC_IMR_ORERR; > =A0 =A0 =A0 =A0out_be16(®s->isr_imr.imr, imr); > > @@ -271,36 +271,36 @@ int psc_i2s_trigger(struct snd_pcm_substream *subst= ream, int cmd, > =A0} > > =A0/** > - * psc_i2s_shutdown: shutdown the data transfer on a stream > + * psc_dma_shutdown: shutdown the data transfer on a stream > =A0* > =A0* Shutdown the PSC if there are no other substreams open. > =A0*/ > -void psc_i2s_shutdown(struct snd_pcm_substream *substream, > +void psc_dma_shutdown(struct snd_pcm_substream *substream, > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct snd_soc_da= i *dai) > =A0{ > =A0 =A0 =A0 =A0struct snd_soc_pcm_runtime *rtd =3D substream->private_dat= a; > - =A0 =A0 =A0 struct psc_i2s *psc_i2s =3D rtd->dai->cpu_dai->private_data= ; > + =A0 =A0 =A0 struct psc_dma *psc_dma =3D rtd->dai->cpu_dai->private_data= ; > > - =A0 =A0 =A0 dev_dbg(psc_i2s->dev, "psc_i2s_shutdown(substream=3D%p)\n",= substream); > + =A0 =A0 =A0 dev_dbg(psc_dma->dev, "psc_dma_shutdown(substream=3D%p)\n",= substream); > > =A0 =A0 =A0 =A0/* > =A0 =A0 =A0 =A0 * If this is the last active substream, disable the PSC a= nd release > =A0 =A0 =A0 =A0 * the IRQ. > =A0 =A0 =A0 =A0 */ > - =A0 =A0 =A0 if (!psc_i2s->playback.active && > - =A0 =A0 =A0 =A0 =A0 !psc_i2s->capture.active) { > + =A0 =A0 =A0 if (!psc_dma->playback.active && > + =A0 =A0 =A0 =A0 =A0 !psc_dma->capture.active) { > > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0/* Disable all interrupts and reset the PS= C */ > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 out_be16(&psc_i2s->psc_regs->isr_imr.imr, 0= ); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 out_8(&psc_i2s->psc_regs->command, 3 << 4);= /* reset tx */ > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 out_8(&psc_i2s->psc_regs->command, 2 << 4);= /* reset rx */ > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 out_8(&psc_i2s->psc_regs->command, 1 << 4);= /* reset mode */ > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 out_8(&psc_i2s->psc_regs->command, 4 << 4);= /* reset error */ > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 out_be16(&psc_dma->psc_regs->isr_imr.imr, 0= ); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 out_8(&psc_dma->psc_regs->command, 3 << 4);= /* reset tx */ > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 out_8(&psc_dma->psc_regs->command, 2 << 4);= /* reset rx */ > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 out_8(&psc_dma->psc_regs->command, 1 << 4);= /* reset mode */ > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 out_8(&psc_dma->psc_regs->command, 4 << 4);= /* reset error */ > > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0/* Release irqs */ > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 free_irq(psc_i2s->irq, psc_i2s); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 free_irq(psc_i2s->capture.irq, &psc_i2s->ca= pture); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 free_irq(psc_i2s->playback.irq, &psc_i2s->p= layback); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 free_irq(psc_dma->irq, psc_dma); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 free_irq(psc_dma->capture.irq, &psc_dma->ca= pture); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 free_irq(psc_dma->playback.irq, &psc_dma->p= layback); > =A0 =A0 =A0 =A0} > =A0} > > @@ -312,7 +312,7 @@ void psc_i2s_shutdown(struct snd_pcm_substream *subst= ream, > =A0* interaction with the attached codec > =A0*/ > > -static const struct snd_pcm_hardware psc_i2s_pcm_hardware =3D { > +static const struct snd_pcm_hardware psc_dma_pcm_hardware =3D { > =A0 =A0 =A0 =A0.info =3D SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_MMAP_VALID = | > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INF= O_BLOCK_TRANSFER, > =A0 =A0 =A0 =A0.formats =3D SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_S16_BE= | > @@ -329,80 +329,80 @@ static const struct snd_pcm_hardware psc_i2s_pcm_ha= rdware =3D { > =A0 =A0 =A0 =A0.fifo_size =A0 =A0 =A0 =A0 =A0 =A0 =A0=3D 0, > =A0}; > > -static int psc_i2s_pcm_open(struct snd_pcm_substream *substream) > +static int psc_dma_pcm_open(struct snd_pcm_substream *substream) > =A0{ > =A0 =A0 =A0 =A0struct snd_soc_pcm_runtime *rtd =3D substream->private_dat= a; > - =A0 =A0 =A0 struct psc_i2s *psc_i2s =3D rtd->dai->cpu_dai->private_data= ; > - =A0 =A0 =A0 struct psc_i2s_stream *s; > + =A0 =A0 =A0 struct psc_dma *psc_dma =3D rtd->dai->cpu_dai->private_data= ; > + =A0 =A0 =A0 struct psc_dma_stream *s; > > - =A0 =A0 =A0 dev_dbg(psc_i2s->dev, "psc_i2s_pcm_open(substream=3D%p)\n",= substream); > + =A0 =A0 =A0 dev_dbg(psc_dma->dev, "psc_dma_pcm_open(substream=3D%p)\n",= substream); > > =A0 =A0 =A0 =A0if (substream->pstr->stream =3D=3D SNDRV_PCM_STREAM_CAPTUR= E) > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 s =3D &psc_i2s->capture; > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 s =3D &psc_dma->capture; > =A0 =A0 =A0 =A0else > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 s =3D &psc_i2s->playback; > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 s =3D &psc_dma->playback; > > - =A0 =A0 =A0 snd_soc_set_runtime_hwparams(substream, &psc_i2s_pcm_hardwa= re); > + =A0 =A0 =A0 snd_soc_set_runtime_hwparams(substream, &psc_dma_pcm_hardwa= re); > > =A0 =A0 =A0 =A0s->stream =3D substream; > =A0 =A0 =A0 =A0return 0; > =A0} > > -static int psc_i2s_pcm_close(struct snd_pcm_substream *substream) > +static int psc_dma_pcm_close(struct snd_pcm_substream *substream) > =A0{ > =A0 =A0 =A0 =A0struct snd_soc_pcm_runtime *rtd =3D substream->private_dat= a; > - =A0 =A0 =A0 struct psc_i2s *psc_i2s =3D rtd->dai->cpu_dai->private_data= ; > - =A0 =A0 =A0 struct psc_i2s_stream *s; > + =A0 =A0 =A0 struct psc_dma *psc_dma =3D rtd->dai->cpu_dai->private_data= ; > + =A0 =A0 =A0 struct psc_dma_stream *s; > > - =A0 =A0 =A0 dev_dbg(psc_i2s->dev, "psc_i2s_pcm_close(substream=3D%p)\n"= , substream); > + =A0 =A0 =A0 dev_dbg(psc_dma->dev, "psc_dma_pcm_close(substream=3D%p)\n"= , substream); > > =A0 =A0 =A0 =A0if (substream->pstr->stream =3D=3D SNDRV_PCM_STREAM_CAPTUR= E) > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 s =3D &psc_i2s->capture; > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 s =3D &psc_dma->capture; > =A0 =A0 =A0 =A0else > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 s =3D &psc_i2s->playback; > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 s =3D &psc_dma->playback; > > =A0 =A0 =A0 =A0s->stream =3D NULL; > =A0 =A0 =A0 =A0return 0; > =A0} > > =A0static snd_pcm_uframes_t > -psc_i2s_pcm_pointer(struct snd_pcm_substream *substream) > +psc_dma_pcm_pointer(struct snd_pcm_substream *substream) > =A0{ > =A0 =A0 =A0 =A0struct snd_soc_pcm_runtime *rtd =3D substream->private_dat= a; > - =A0 =A0 =A0 struct psc_i2s *psc_i2s =3D rtd->dai->cpu_dai->private_data= ; > - =A0 =A0 =A0 struct psc_i2s_stream *s; > + =A0 =A0 =A0 struct psc_dma *psc_dma =3D rtd->dai->cpu_dai->private_data= ; > + =A0 =A0 =A0 struct psc_dma_stream *s; > =A0 =A0 =A0 =A0dma_addr_t count; > > =A0 =A0 =A0 =A0if (substream->pstr->stream =3D=3D SNDRV_PCM_STREAM_CAPTUR= E) > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 s =3D &psc_i2s->capture; > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 s =3D &psc_dma->capture; > =A0 =A0 =A0 =A0else > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 s =3D &psc_i2s->playback; > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 s =3D &psc_dma->playback; > > =A0 =A0 =A0 =A0count =3D s->period_current_pt - s->period_start; > > =A0 =A0 =A0 =A0return bytes_to_frames(substream->runtime, count); > =A0} > > -static struct snd_pcm_ops psc_i2s_pcm_ops =3D { > - =A0 =A0 =A0 .open =A0 =A0 =A0 =A0 =A0 =3D psc_i2s_pcm_open, > - =A0 =A0 =A0 .close =A0 =A0 =A0 =A0 =A0=3D psc_i2s_pcm_close, > +static struct snd_pcm_ops psc_dma_pcm_ops =3D { > + =A0 =A0 =A0 .open =A0 =A0 =A0 =A0 =A0 =3D psc_dma_pcm_open, > + =A0 =A0 =A0 .close =A0 =A0 =A0 =A0 =A0=3D psc_dma_pcm_close, > =A0 =A0 =A0 =A0.ioctl =A0 =A0 =A0 =A0 =A0=3D snd_pcm_lib_ioctl, > - =A0 =A0 =A0 .pointer =A0 =A0 =A0 =A0=3D psc_i2s_pcm_pointer, > + =A0 =A0 =A0 .pointer =A0 =A0 =A0 =A0=3D psc_dma_pcm_pointer, > =A0}; > > -static u64 psc_i2s_pcm_dmamask =3D 0xffffffff; > -static int psc_i2s_pcm_new(struct snd_card *card, struct snd_soc_dai *da= i, > +static u64 psc_dma_pcm_dmamask =3D 0xffffffff; > +static int psc_dma_pcm_new(struct snd_card *card, struct snd_soc_dai *da= i, > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct snd_pcm *pcm) > =A0{ > =A0 =A0 =A0 =A0struct snd_soc_pcm_runtime *rtd =3D pcm->private_data; > - =A0 =A0 =A0 size_t size =3D psc_i2s_pcm_hardware.buffer_bytes_max; > + =A0 =A0 =A0 size_t size =3D psc_dma_pcm_hardware.buffer_bytes_max; > =A0 =A0 =A0 =A0int rc =3D 0; > > - =A0 =A0 =A0 dev_dbg(rtd->socdev->dev, "psc_i2s_pcm_new(card=3D%p, dai= =3D%p, pcm=3D%p)\n", > + =A0 =A0 =A0 dev_dbg(rtd->socdev->dev, "psc_dma_pcm_new(card=3D%p, dai= =3D%p, pcm=3D%p)\n", > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0card, dai, pcm); > > =A0 =A0 =A0 =A0if (!card->dev->dma_mask) > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 card->dev->dma_mask =3D &psc_i2s_pcm_dmamas= k; > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 card->dev->dma_mask =3D &psc_dma_pcm_dmamas= k; > =A0 =A0 =A0 =A0if (!card->dev->coherent_dma_mask) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0card->dev->coherent_dma_mask =3D 0xfffffff= f; > > @@ -430,13 +430,13 @@ static int psc_i2s_pcm_new(struct snd_card *card, s= truct snd_soc_dai *dai, > =A0 =A0 =A0 =A0return -ENOMEM; > =A0} > > -static void psc_i2s_pcm_free(struct snd_pcm *pcm) > +static void psc_dma_pcm_free(struct snd_pcm *pcm) > =A0{ > =A0 =A0 =A0 =A0struct snd_soc_pcm_runtime *rtd =3D pcm->private_data; > =A0 =A0 =A0 =A0struct snd_pcm_substream *substream; > =A0 =A0 =A0 =A0int stream; > > - =A0 =A0 =A0 dev_dbg(rtd->socdev->dev, "psc_i2s_pcm_free(pcm=3D%p)\n", p= cm); > + =A0 =A0 =A0 dev_dbg(rtd->socdev->dev, "psc_dma_pcm_free(pcm=3D%p)\n", p= cm); > > =A0 =A0 =A0 =A0for (stream =3D 0; stream < 2; stream++) { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0substream =3D pcm->streams[stream].substre= am; > @@ -448,10 +448,10 @@ static void psc_i2s_pcm_free(struct snd_pcm *pcm) > =A0 =A0 =A0 =A0} > =A0} > > -struct snd_soc_platform psc_i2s_pcm_soc_platform =3D { > +struct snd_soc_platform psc_dma_pcm_soc_platform =3D { > =A0 =A0 =A0 =A0.name =A0 =A0 =A0 =A0 =A0 =3D "mpc5200-psc-audio", > - =A0 =A0 =A0 .pcm_ops =A0 =A0 =A0 =A0=3D &psc_i2s_pcm_ops, > - =A0 =A0 =A0 .pcm_new =A0 =A0 =A0 =A0=3D &psc_i2s_pcm_new, > - =A0 =A0 =A0 .pcm_free =A0 =A0 =A0 =3D &psc_i2s_pcm_free, > + =A0 =A0 =A0 .pcm_ops =A0 =A0 =A0 =A0=3D &psc_dma_pcm_ops, > + =A0 =A0 =A0 .pcm_new =A0 =A0 =A0 =A0=3D &psc_dma_pcm_new, > + =A0 =A0 =A0 .pcm_free =A0 =A0 =A0 =3D &psc_dma_pcm_free, > =A0}; > > diff --git a/sound/soc/fsl/mpc5200_dma.h b/sound/soc/fsl/mpc5200_dma.h > index 9a19e8a..a33232c 100644 > --- a/sound/soc/fsl/mpc5200_dma.h > +++ b/sound/soc/fsl/mpc5200_dma.h > @@ -6,9 +6,9 @@ > =A0#define __SOUND_SOC_FSL_MPC5200_DMA_H__ > > =A0/** > - * psc_i2s_stream - Data specific to a single stream (playback or captur= e) > + * psc_dma_stream - Data specific to a single stream (playback or captur= e) > =A0* @active: =A0 =A0 =A0 =A0 =A0 =A0flag indicating if the stream is act= ive > - * @psc_i2s: =A0 =A0 =A0 =A0 =A0 pointer back to parent psc_i2s data str= ucture > + * @psc_dma: =A0 =A0 =A0 =A0 =A0 pointer back to parent psc_dma data str= ucture > =A0* @bcom_task: =A0 =A0 =A0 =A0 bestcomm task structure > =A0* @irq: =A0 =A0 =A0 =A0 =A0 =A0 =A0 irq number for bestcomm task > =A0* @period_start: =A0 =A0 =A0physical address of start of DMA region > @@ -16,9 +16,9 @@ > =A0* @period_next_pt: =A0 =A0physical address of next DMA buffer to enque= ue > =A0* @period_bytes: =A0 =A0 =A0size of DMA period in bytes > =A0*/ > -struct psc_i2s_stream { > +struct psc_dma_stream { > =A0 =A0 =A0 =A0int active; > - =A0 =A0 =A0 struct psc_i2s *psc_i2s; > + =A0 =A0 =A0 struct psc_dma *psc_dma; > =A0 =A0 =A0 =A0struct bcom_task *bcom_task; > =A0 =A0 =A0 =A0int irq; > =A0 =A0 =A0 =A0struct snd_pcm_substream *stream; > @@ -30,7 +30,7 @@ struct psc_i2s_stream { > =A0}; > > =A0/** > - * psc_i2s - Private driver data > + * psc_dma - Private driver data > =A0* @name: short name for this device ("PSC0", "PSC1", etc) > =A0* @psc_regs: pointer to the PSC's registers > =A0* @fifo_regs: pointer to the PSC's FIFO registers > @@ -42,7 +42,7 @@ struct psc_i2s_stream { > =A0* @playback: Playback stream context data > =A0* @capture: Capture stream context data > =A0*/ > -struct psc_i2s { > +struct psc_dma { > =A0 =A0 =A0 =A0char name[32]; > =A0 =A0 =A0 =A0struct mpc52xx_psc __iomem *psc_regs; > =A0 =A0 =A0 =A0struct mpc52xx_psc_fifo __iomem *fifo_regs; > @@ -53,8 +53,8 @@ struct psc_i2s { > =A0 =A0 =A0 =A0u32 sicr; > > =A0 =A0 =A0 =A0/* per-stream data */ > - =A0 =A0 =A0 struct psc_i2s_stream playback; > - =A0 =A0 =A0 struct psc_i2s_stream capture; > + =A0 =A0 =A0 struct psc_dma_stream playback; > + =A0 =A0 =A0 struct psc_dma_stream capture; > > =A0 =A0 =A0 =A0/* Statistics */ > =A0 =A0 =A0 =A0struct { > @@ -64,18 +64,18 @@ struct psc_i2s { > =A0}; > > > -int psc_i2s_startup(struct snd_pcm_substream *substream, > +int psc_dma_startup(struct snd_pcm_substream *substream, > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct snd_soc_dai *d= ai); > > -int psc_i2s_hw_free(struct snd_pcm_substream *substream, > +int psc_dma_hw_free(struct snd_pcm_substream *substream, > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct snd_soc_dai *d= ai); > > -void psc_i2s_shutdown(struct snd_pcm_substream *substream, > +void psc_dma_shutdown(struct snd_pcm_substream *substream, > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct snd_soc_da= i *dai); > > -int psc_i2s_trigger(struct snd_pcm_substream *substream, int cmd, > +int psc_dma_trigger(struct snd_pcm_substream *substream, int cmd, > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct snd_soc_dai *d= ai); > > -extern struct snd_soc_platform psc_i2s_pcm_soc_platform; > +extern struct snd_soc_platform psc_dma_pcm_soc_platform; > > =A0#endif /* __SOUND_SOC_FSL_MPC5200_DMA_H__ */ > diff --git a/sound/soc/fsl/mpc5200_psc_i2s.c b/sound/soc/fsl/mpc5200_psc_= i2s.c > index 8974b53..12a7917 100644 > --- a/sound/soc/fsl/mpc5200_psc_i2s.c > +++ b/sound/soc/fsl/mpc5200_psc_i2s.c > @@ -54,10 +54,10 @@ static int psc_i2s_hw_params(struct snd_pcm_substream= *substream, > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct sn= d_soc_dai *dai) > =A0{ > =A0 =A0 =A0 =A0struct snd_soc_pcm_runtime *rtd =3D substream->private_dat= a; > - =A0 =A0 =A0 struct psc_i2s *psc_i2s =3D rtd->dai->cpu_dai->private_data= ; > + =A0 =A0 =A0 struct psc_dma *psc_dma =3D rtd->dai->cpu_dai->private_data= ; > =A0 =A0 =A0 =A0u32 mode; > > - =A0 =A0 =A0 dev_dbg(psc_i2s->dev, "%s(substream=3D%p) p_size=3D%i p_byt= es=3D%i" > + =A0 =A0 =A0 dev_dbg(psc_dma->dev, "%s(substream=3D%p) p_size=3D%i p_byt= es=3D%i" > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0" periods=3D%i buffer_size=3D%i =A0buffer_= bytes=3D%i\n", > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0__func__, substream, params_period_size(pa= rams), > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0params_period_bytes(params), params_period= s(params), > @@ -77,10 +77,10 @@ static int psc_i2s_hw_params(struct snd_pcm_substream= *substream, > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0mode =3D MPC52xx_PSC_SICR_SIM_CODEC_32; > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0break; > =A0 =A0 =A0 =A0default: > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 dev_dbg(psc_i2s->dev, "invalid format\n"); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 dev_dbg(psc_dma->dev, "invalid format\n"); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0return -EINVAL; > =A0 =A0 =A0 =A0} > - =A0 =A0 =A0 out_be32(&psc_i2s->psc_regs->sicr, psc_i2s->sicr | mode); > + =A0 =A0 =A0 out_be32(&psc_dma->psc_regs->sicr, psc_dma->sicr | mode); > > =A0 =A0 =A0 =A0snd_pcm_set_runtime_buffer(substream, &substream->dma_buff= er); > > @@ -104,8 +104,8 @@ static int psc_i2s_hw_params(struct snd_pcm_substream= *substream, > =A0static int psc_i2s_set_sysclk(struct snd_soc_dai *cpu_dai, > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0int clk_id, un= signed int freq, int dir) > =A0{ > - =A0 =A0 =A0 struct psc_i2s *psc_i2s =3D cpu_dai->private_data; > - =A0 =A0 =A0 dev_dbg(psc_i2s->dev, "psc_i2s_set_sysclk(cpu_dai=3D%p, dir= =3D%i)\n", > + =A0 =A0 =A0 struct psc_dma *psc_dma =3D cpu_dai->private_data; > + =A0 =A0 =A0 dev_dbg(psc_dma->dev, "psc_i2s_set_sysclk(cpu_dai=3D%p, dir= =3D%i)\n", > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0cpu_dai, d= ir); > =A0 =A0 =A0 =A0return (dir =3D=3D SND_SOC_CLOCK_IN) ? 0 : -EINVAL; > =A0} > @@ -123,8 +123,8 @@ static int psc_i2s_set_sysclk(struct snd_soc_dai *cpu= _dai, > =A0*/ > =A0static int psc_i2s_set_fmt(struct snd_soc_dai *cpu_dai, unsigned int f= ormat) > =A0{ > - =A0 =A0 =A0 struct psc_i2s *psc_i2s =3D cpu_dai->private_data; > - =A0 =A0 =A0 dev_dbg(psc_i2s->dev, "psc_i2s_set_fmt(cpu_dai=3D%p, format= =3D%i)\n", > + =A0 =A0 =A0 struct psc_dma *psc_dma =3D cpu_dai->private_data; > + =A0 =A0 =A0 dev_dbg(psc_dma->dev, "psc_i2s_set_fmt(cpu_dai=3D%p, format= =3D%i)\n", > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0cpu_dai, f= ormat); > =A0 =A0 =A0 =A0return (format =3D=3D SND_SOC_DAIFMT_I2S) ? 0 : -EINVAL; > =A0} > @@ -140,11 +140,11 @@ static int psc_i2s_set_fmt(struct snd_soc_dai *cpu_= dai, unsigned int format) > =A0* psc_i2s_dai_template: template CPU Digital Audio Interface > =A0*/ > =A0static struct snd_soc_dai_ops psc_i2s_dai_ops =3D { > - =A0 =A0 =A0 .startup =A0 =A0 =A0 =A0=3D psc_i2s_startup, > + =A0 =A0 =A0 .startup =A0 =A0 =A0 =A0=3D psc_dma_startup, > =A0 =A0 =A0 =A0.hw_params =A0 =A0 =A0=3D psc_i2s_hw_params, > - =A0 =A0 =A0 .hw_free =A0 =A0 =A0 =A0=3D psc_i2s_hw_free, > - =A0 =A0 =A0 .shutdown =A0 =A0 =A0 =3D psc_i2s_shutdown, > - =A0 =A0 =A0 .trigger =A0 =A0 =A0 =A0=3D psc_i2s_trigger, > + =A0 =A0 =A0 .hw_free =A0 =A0 =A0 =A0=3D psc_dma_hw_free, > + =A0 =A0 =A0 .shutdown =A0 =A0 =A0 =3D psc_dma_shutdown, > + =A0 =A0 =A0 .trigger =A0 =A0 =A0 =A0=3D psc_dma_trigger, > =A0 =A0 =A0 =A0.set_sysclk =A0 =A0 =3D psc_i2s_set_sysclk, > =A0 =A0 =A0 =A0.set_fmt =A0 =A0 =A0 =A0=3D psc_i2s_set_fmt, > =A0}; > @@ -172,24 +172,24 @@ static struct snd_soc_dai psc_i2s_dai_template =3D = { > =A0static ssize_t psc_i2s_status_show(struct device *dev, > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct device_attribu= te *attr, char *buf) > =A0{ > - =A0 =A0 =A0 struct psc_i2s *psc_i2s =3D dev_get_drvdata(dev); > + =A0 =A0 =A0 struct psc_dma *psc_dma =3D dev_get_drvdata(dev); > > =A0 =A0 =A0 =A0return sprintf(buf, "status=3D%.4x sicr=3D%.8x rfnum=3D%i = rfstat=3D0x%.4x " > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0"tfnum=3D%i tfstat=3D0x%.4= x\n", > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 in_be16(&psc_i2s->psc_regs-= >sr_csr.status), > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 in_be32(&psc_i2s->psc_regs-= >sicr), > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 in_be16(&psc_i2s->fifo_regs= ->rfnum) & 0x1ff, > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 in_be16(&psc_i2s->fifo_regs= ->rfstat), > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 in_be16(&psc_i2s->fifo_regs= ->tfnum) & 0x1ff, > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 in_be16(&psc_i2s->fifo_regs= ->tfstat)); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 in_be16(&psc_dma->psc_regs-= >sr_csr.status), > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 in_be32(&psc_dma->psc_regs-= >sicr), > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 in_be16(&psc_dma->fifo_regs= ->rfnum) & 0x1ff, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 in_be16(&psc_dma->fifo_regs= ->rfstat), > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 in_be16(&psc_dma->fifo_regs= ->tfnum) & 0x1ff, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 in_be16(&psc_dma->fifo_regs= ->tfstat)); > =A0} > > -static int *psc_i2s_get_stat_attr(struct psc_i2s *psc_i2s, const char *n= ame) > +static int *psc_i2s_get_stat_attr(struct psc_dma *psc_dma, const char *n= ame) > =A0{ > =A0 =A0 =A0 =A0if (strcmp(name, "playback_underrun") =3D=3D 0) > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 return &psc_i2s->stats.underrun_count; > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 return &psc_dma->stats.underrun_count; > =A0 =A0 =A0 =A0if (strcmp(name, "capture_overrun") =3D=3D 0) > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 return &psc_i2s->stats.overrun_count; > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 return &psc_dma->stats.overrun_count; > > =A0 =A0 =A0 =A0return NULL; > =A0} > @@ -197,10 +197,10 @@ static int *psc_i2s_get_stat_attr(struct psc_i2s *p= sc_i2s, const char *name) > =A0static ssize_t psc_i2s_stat_show(struct device *dev, > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct de= vice_attribute *attr, char *buf) > =A0{ > - =A0 =A0 =A0 struct psc_i2s *psc_i2s =3D dev_get_drvdata(dev); > + =A0 =A0 =A0 struct psc_dma *psc_dma =3D dev_get_drvdata(dev); > =A0 =A0 =A0 =A0int *attrib; > > - =A0 =A0 =A0 attrib =3D psc_i2s_get_stat_attr(psc_i2s, attr->attr.name); > + =A0 =A0 =A0 attrib =3D psc_i2s_get_stat_attr(psc_dma, attr->attr.name); > =A0 =A0 =A0 =A0if (!attrib) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0return 0; > > @@ -212,10 +212,10 @@ static ssize_t psc_i2s_stat_store(struct device *de= v, > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0const = char *buf, > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0size_t= count) > =A0{ > - =A0 =A0 =A0 struct psc_i2s *psc_i2s =3D dev_get_drvdata(dev); > + =A0 =A0 =A0 struct psc_dma *psc_dma =3D dev_get_drvdata(dev); > =A0 =A0 =A0 =A0int *attrib; > > - =A0 =A0 =A0 attrib =3D psc_i2s_get_stat_attr(psc_i2s, attr->attr.name); > + =A0 =A0 =A0 attrib =3D psc_i2s_get_stat_attr(psc_dma, attr->attr.name); > =A0 =A0 =A0 =A0if (!attrib) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0return 0; > > @@ -238,7 +238,7 @@ static int __devinit psc_i2s_of_probe(struct of_devic= e *op, > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0const struct of_device_id *match) > =A0{ > =A0 =A0 =A0 =A0phys_addr_t fifo; > - =A0 =A0 =A0 struct psc_i2s *psc_i2s; > + =A0 =A0 =A0 struct psc_dma *psc_dma; > =A0 =A0 =A0 =A0struct resource res; > =A0 =A0 =A0 =A0int size, psc_id, irq, rc; > =A0 =A0 =A0 =A0const __be32 *prop; > @@ -265,56 +265,56 @@ static int __devinit psc_i2s_of_probe(struct of_dev= ice *op, > =A0 =A0 =A0 =A0} > > =A0 =A0 =A0 =A0/* Allocate and initialize the driver private data */ > - =A0 =A0 =A0 psc_i2s =3D kzalloc(sizeof *psc_i2s, GFP_KERNEL); > - =A0 =A0 =A0 if (!psc_i2s) { > + =A0 =A0 =A0 psc_dma =3D kzalloc(sizeof *psc_dma, GFP_KERNEL); > + =A0 =A0 =A0 if (!psc_dma) { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0iounmap(regs); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0return -ENOMEM; > =A0 =A0 =A0 =A0} > - =A0 =A0 =A0 spin_lock_init(&psc_i2s->lock); > - =A0 =A0 =A0 psc_i2s->irq =3D irq; > - =A0 =A0 =A0 psc_i2s->psc_regs =3D regs; > - =A0 =A0 =A0 psc_i2s->fifo_regs =3D regs + sizeof *psc_i2s->psc_regs; > - =A0 =A0 =A0 psc_i2s->dev =3D &op->dev; > - =A0 =A0 =A0 psc_i2s->playback.psc_i2s =3D psc_i2s; > - =A0 =A0 =A0 psc_i2s->capture.psc_i2s =3D psc_i2s; > - =A0 =A0 =A0 snprintf(psc_i2s->name, sizeof psc_i2s->name, "PSC%u", psc_= id+1); > + =A0 =A0 =A0 spin_lock_init(&psc_dma->lock); > + =A0 =A0 =A0 psc_dma->irq =3D irq; > + =A0 =A0 =A0 psc_dma->psc_regs =3D regs; > + =A0 =A0 =A0 psc_dma->fifo_regs =3D regs + sizeof *psc_dma->psc_regs; > + =A0 =A0 =A0 psc_dma->dev =3D &op->dev; > + =A0 =A0 =A0 psc_dma->playback.psc_dma =3D psc_dma; > + =A0 =A0 =A0 psc_dma->capture.psc_dma =3D psc_dma; > + =A0 =A0 =A0 snprintf(psc_dma->name, sizeof psc_dma->name, "PSC%u", psc_= id+1); > > =A0 =A0 =A0 =A0/* Fill out the CPU DAI structure */ > - =A0 =A0 =A0 memcpy(&psc_i2s->dai, &psc_i2s_dai_template, sizeof psc_i2s= ->dai); > - =A0 =A0 =A0 psc_i2s->dai.private_data =3D psc_i2s; > - =A0 =A0 =A0 psc_i2s->dai.name =3D psc_i2s->name; > - =A0 =A0 =A0 psc_i2s->dai.id =3D psc_id; > + =A0 =A0 =A0 memcpy(&psc_dma->dai, &psc_i2s_dai_template, sizeof psc_dma= ->dai); > + =A0 =A0 =A0 psc_dma->dai.private_data =3D psc_dma; > + =A0 =A0 =A0 psc_dma->dai.name =3D psc_dma->name; > + =A0 =A0 =A0 psc_dma->dai.id =3D psc_id; > > =A0 =A0 =A0 =A0/* Find the address of the fifo data registers and setup t= he > =A0 =A0 =A0 =A0 * DMA tasks */ > =A0 =A0 =A0 =A0fifo =3D res.start + offsetof(struct mpc52xx_psc, buffer.b= uffer_32); > - =A0 =A0 =A0 psc_i2s->capture.bcom_task =3D > + =A0 =A0 =A0 psc_dma->capture.bcom_task =3D > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0bcom_psc_gen_bd_rx_init(psc_id, 10, fifo, = 512); > - =A0 =A0 =A0 psc_i2s->playback.bcom_task =3D > + =A0 =A0 =A0 psc_dma->playback.bcom_task =3D > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0bcom_psc_gen_bd_tx_init(psc_id, 10, fifo); > - =A0 =A0 =A0 if (!psc_i2s->capture.bcom_task || > - =A0 =A0 =A0 =A0 =A0 !psc_i2s->playback.bcom_task) { > + =A0 =A0 =A0 if (!psc_dma->capture.bcom_task || > + =A0 =A0 =A0 =A0 =A0 !psc_dma->playback.bcom_task) { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0dev_err(&op->dev, "Could not allocate best= comm tasks\n"); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0iounmap(regs); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 kfree(psc_i2s); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 kfree(psc_dma); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0return -ENODEV; > =A0 =A0 =A0 =A0} > > =A0 =A0 =A0 =A0/* Disable all interrupts and reset the PSC */ > - =A0 =A0 =A0 out_be16(&psc_i2s->psc_regs->isr_imr.imr, 0); > - =A0 =A0 =A0 out_8(&psc_i2s->psc_regs->command, 3 << 4); /* reset transm= itter */ > - =A0 =A0 =A0 out_8(&psc_i2s->psc_regs->command, 2 << 4); /* reset receiv= er */ > - =A0 =A0 =A0 out_8(&psc_i2s->psc_regs->command, 1 << 4); /* reset mode *= / > - =A0 =A0 =A0 out_8(&psc_i2s->psc_regs->command, 4 << 4); /* reset error = */ > + =A0 =A0 =A0 out_be16(&psc_dma->psc_regs->isr_imr.imr, 0); > + =A0 =A0 =A0 out_8(&psc_dma->psc_regs->command, 3 << 4); /* reset transm= itter */ > + =A0 =A0 =A0 out_8(&psc_dma->psc_regs->command, 2 << 4); /* reset receiv= er */ > + =A0 =A0 =A0 out_8(&psc_dma->psc_regs->command, 1 << 4); /* reset mode *= / > + =A0 =A0 =A0 out_8(&psc_dma->psc_regs->command, 4 << 4); /* reset error = */ > > =A0 =A0 =A0 =A0/* Configure the serial interface mode; defaulting to CODE= C8 mode */ > - =A0 =A0 =A0 psc_i2s->sicr =3D MPC52xx_PSC_SICR_DTS1 | MPC52xx_PSC_SICR_= I2S | > + =A0 =A0 =A0 psc_dma->sicr =3D MPC52xx_PSC_SICR_DTS1 | MPC52xx_PSC_SICR_= I2S | > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0MPC52xx_PSC_SICR_CLKPOL; > =A0 =A0 =A0 =A0if (of_get_property(op->node, "fsl,cellslave", NULL)) > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 psc_i2s->sicr |=3D MPC52xx_PSC_SICR_CELLSLA= VE | > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 psc_dma->sicr |=3D MPC52xx_PSC_SICR_CELLSLA= VE | > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 MPC52xx_P= SC_SICR_GENCLK; > - =A0 =A0 =A0 out_be32(&psc_i2s->psc_regs->sicr, > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0psc_i2s->sicr | MPC52xx_PSC_SICR_SIM_COD= EC_8); > + =A0 =A0 =A0 out_be32(&psc_dma->psc_regs->sicr, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0psc_dma->sicr | MPC52xx_PSC_SICR_SIM_COD= EC_8); > > =A0 =A0 =A0 =A0/* Check for the codec handle. =A0If it is not present the= n we > =A0 =A0 =A0 =A0 * are done */ > @@ -325,54 +325,54 @@ static int __devinit psc_i2s_of_probe(struct of_dev= ice *op, > =A0 =A0 =A0 =A0 * First write: RxRdy (FIFO Alarm) generates rx FIFO irq > =A0 =A0 =A0 =A0 * Second write: register Normal mode for non loopback > =A0 =A0 =A0 =A0 */ > - =A0 =A0 =A0 out_8(&psc_i2s->psc_regs->mode, 0); > - =A0 =A0 =A0 out_8(&psc_i2s->psc_regs->mode, 0); > + =A0 =A0 =A0 out_8(&psc_dma->psc_regs->mode, 0); > + =A0 =A0 =A0 out_8(&psc_dma->psc_regs->mode, 0); > > =A0 =A0 =A0 =A0/* Set the TX and RX fifo alarm thresholds */ > - =A0 =A0 =A0 out_be16(&psc_i2s->fifo_regs->rfalarm, 0x100); > - =A0 =A0 =A0 out_8(&psc_i2s->fifo_regs->rfcntl, 0x4); > - =A0 =A0 =A0 out_be16(&psc_i2s->fifo_regs->tfalarm, 0x100); > - =A0 =A0 =A0 out_8(&psc_i2s->fifo_regs->tfcntl, 0x7); > + =A0 =A0 =A0 out_be16(&psc_dma->fifo_regs->rfalarm, 0x100); > + =A0 =A0 =A0 out_8(&psc_dma->fifo_regs->rfcntl, 0x4); > + =A0 =A0 =A0 out_be16(&psc_dma->fifo_regs->tfalarm, 0x100); > + =A0 =A0 =A0 out_8(&psc_dma->fifo_regs->tfcntl, 0x7); > > =A0 =A0 =A0 =A0/* Lookup the IRQ numbers */ > - =A0 =A0 =A0 psc_i2s->playback.irq =3D > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 bcom_get_task_irq(psc_i2s->playback.bcom_ta= sk); > - =A0 =A0 =A0 psc_i2s->capture.irq =3D > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 bcom_get_task_irq(psc_i2s->capture.bcom_tas= k); > + =A0 =A0 =A0 psc_dma->playback.irq =3D > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 bcom_get_task_irq(psc_dma->playback.bcom_ta= sk); > + =A0 =A0 =A0 psc_dma->capture.irq =3D > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 bcom_get_task_irq(psc_dma->capture.bcom_tas= k); > > =A0 =A0 =A0 =A0/* Save what we've done so it can be found again later */ > - =A0 =A0 =A0 dev_set_drvdata(&op->dev, psc_i2s); > + =A0 =A0 =A0 dev_set_drvdata(&op->dev, psc_dma); > > =A0 =A0 =A0 =A0/* Register the SYSFS files */ > - =A0 =A0 =A0 rc =3D device_create_file(psc_i2s->dev, &dev_attr_status); > - =A0 =A0 =A0 rc |=3D device_create_file(psc_i2s->dev, &dev_attr_capture_= overrun); > - =A0 =A0 =A0 rc |=3D device_create_file(psc_i2s->dev, &dev_attr_playback= _underrun); > + =A0 =A0 =A0 rc =3D device_create_file(psc_dma->dev, &dev_attr_status); > + =A0 =A0 =A0 rc |=3D device_create_file(psc_dma->dev, &dev_attr_capture_= overrun); > + =A0 =A0 =A0 rc |=3D device_create_file(psc_dma->dev, &dev_attr_playback= _underrun); > =A0 =A0 =A0 =A0if (rc) > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 dev_info(psc_i2s->dev, "error creating sysf= s files\n"); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 dev_info(psc_dma->dev, "error creating sysf= s files\n"); > > - =A0 =A0 =A0 snd_soc_register_platform(&psc_i2s_pcm_soc_platform); > + =A0 =A0 =A0 snd_soc_register_platform(&psc_dma_pcm_soc_platform); > > =A0 =A0 =A0 =A0/* Tell the ASoC OF helpers about it */ > - =A0 =A0 =A0 of_snd_soc_register_platform(&psc_i2s_pcm_soc_platform, op-= >node, > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= &psc_i2s->dai); > + =A0 =A0 =A0 of_snd_soc_register_platform(&psc_dma_pcm_soc_platform, op-= >node, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= &psc_dma->dai); > > =A0 =A0 =A0 =A0return 0; > =A0} > > =A0static int __devexit psc_i2s_of_remove(struct of_device *op) > =A0{ > - =A0 =A0 =A0 struct psc_i2s *psc_i2s =3D dev_get_drvdata(&op->dev); > + =A0 =A0 =A0 struct psc_dma *psc_dma =3D dev_get_drvdata(&op->dev); > > =A0 =A0 =A0 =A0dev_dbg(&op->dev, "psc_i2s_remove()\n"); > > - =A0 =A0 =A0 snd_soc_unregister_platform(&psc_i2s_pcm_soc_platform); > + =A0 =A0 =A0 snd_soc_unregister_platform(&psc_dma_pcm_soc_platform); > > - =A0 =A0 =A0 bcom_gen_bd_rx_release(psc_i2s->capture.bcom_task); > - =A0 =A0 =A0 bcom_gen_bd_tx_release(psc_i2s->playback.bcom_task); > + =A0 =A0 =A0 bcom_gen_bd_rx_release(psc_dma->capture.bcom_task); > + =A0 =A0 =A0 bcom_gen_bd_tx_release(psc_dma->playback.bcom_task); > > - =A0 =A0 =A0 iounmap(psc_i2s->psc_regs); > - =A0 =A0 =A0 iounmap(psc_i2s->fifo_regs); > - =A0 =A0 =A0 kfree(psc_i2s); > + =A0 =A0 =A0 iounmap(psc_dma->psc_regs); > + =A0 =A0 =A0 iounmap(psc_dma->fifo_regs); > + =A0 =A0 =A0 kfree(psc_dma); > =A0 =A0 =A0 =A0dev_set_drvdata(&op->dev, NULL); > > =A0 =A0 =A0 =A0return 0; > > --=20 Grant Likely, B.Sc., P.Eng. Secret Lab Technologies Ltd. ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH V1 2/3] Rename the PSC functions to DMA 2009-04-27 4:04 ` Grant Likely @ 2009-04-27 4:33 ` Grant Likely 0 siblings, 0 replies; 10+ messages in thread From: Grant Likely @ 2009-04-27 4:33 UTC (permalink / raw) To: Jon Smirl; +Cc: linuxppc-dev On Sun, Apr 26, 2009 at 10:04 PM, Grant Likely <grant.likely@secretlab.ca> wrote: > On Sun, Apr 26, 2009 at 1:53 PM, Jon Smirl <jonsmirl@gmail.com> wrote: >> Rename the functions in the mpc5200 DMA file from i2s to dma to reflect = the file they are in. >> >> Signed-off-by: Jon Smirl <jonsmirl@gmail.com> > > Acked-by: Grant Likely <grant.likely@secretlab.ca> Okay, I've taken a second look now (as per my comment on 3/3), and yes, I'm still okay with the name changes because the header file scope is restricted. If this header was in include/linux/, then I'd say the prefix should be more specific. g. > > >> --- >> =A0sound/soc/fsl/mpc5200_dma.c =A0 =A0 | =A0194 ++++++++++++++++++++----= --------------- >> =A0sound/soc/fsl/mpc5200_dma.h =A0 =A0 | =A0 26 +++-- >> =A0sound/soc/fsl/mpc5200_psc_i2s.c | =A0160 ++++++++++++++++------------= ---- >> =A03 files changed, 190 insertions(+), 190 deletions(-) >> >> diff --git a/sound/soc/fsl/mpc5200_dma.c b/sound/soc/fsl/mpc5200_dma.c >> index cccaff4..c82ef75 100644 >> --- a/sound/soc/fsl/mpc5200_dma.c >> +++ b/sound/soc/fsl/mpc5200_dma.c >> @@ -34,21 +34,21 @@ MODULE_LICENSE("GPL"); >> =A0/* >> =A0* Interrupt handlers >> =A0*/ >> -static irqreturn_t psc_i2s_status_irq(int irq, void *_psc_i2s) >> +static irqreturn_t psc_dma_status_irq(int irq, void *_psc_dma) >> =A0{ >> - =A0 =A0 =A0 struct psc_i2s *psc_i2s =3D _psc_i2s; >> - =A0 =A0 =A0 struct mpc52xx_psc __iomem *regs =3D psc_i2s->psc_regs; >> + =A0 =A0 =A0 struct psc_dma *psc_dma =3D _psc_dma; >> + =A0 =A0 =A0 struct mpc52xx_psc __iomem *regs =3D psc_dma->psc_regs; >> =A0 =A0 =A0 =A0u16 isr; >> >> =A0 =A0 =A0 =A0isr =3D in_be16(®s->mpc52xx_psc_isr); >> >> =A0 =A0 =A0 =A0/* Playback underrun error */ >> - =A0 =A0 =A0 if (psc_i2s->playback.active && (isr & MPC52xx_PSC_IMR_TXE= MP)) >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 psc_i2s->stats.underrun_count++; >> + =A0 =A0 =A0 if (psc_dma->playback.active && (isr & MPC52xx_PSC_IMR_TXE= MP)) >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 psc_dma->stats.underrun_count++; >> >> =A0 =A0 =A0 =A0/* Capture overrun error */ >> - =A0 =A0 =A0 if (psc_i2s->capture.active && (isr & MPC52xx_PSC_IMR_ORER= R)) >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 psc_i2s->stats.overrun_count++; >> + =A0 =A0 =A0 if (psc_dma->capture.active && (isr & MPC52xx_PSC_IMR_ORER= R)) >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 psc_dma->stats.overrun_count++; >> >> =A0 =A0 =A0 =A0out_8(®s->command, 4 << 4); =A0/* reset the error stat= us */ >> >> @@ -56,7 +56,7 @@ static irqreturn_t psc_i2s_status_irq(int irq, void *_= psc_i2s) >> =A0} >> >> =A0/** >> - * psc_i2s_bcom_enqueue_next_buffer - Enqueue another audio buffer >> + * psc_dma_bcom_enqueue_next_buffer - Enqueue another audio buffer >> =A0* @s: pointer to stream private data structure >> =A0* >> =A0* Enqueues another audio period buffer into the bestcomm queue. >> @@ -65,7 +65,7 @@ static irqreturn_t psc_i2s_status_irq(int irq, void *_= psc_i2s) >> =A0* the queue. =A0Otherwise the enqueue will fail and the audio ring bu= ffer >> =A0* will get out of sync >> =A0*/ >> -static void psc_i2s_bcom_enqueue_next_buffer(struct psc_i2s_stream *s) >> +static void psc_dma_bcom_enqueue_next_buffer(struct psc_dma_stream *s) >> =A0{ >> =A0 =A0 =A0 =A0struct bcom_bd *bd; >> >> @@ -82,9 +82,9 @@ static void psc_i2s_bcom_enqueue_next_buffer(struct ps= c_i2s_stream *s) >> =A0} >> >> =A0/* Bestcomm DMA irq handler */ >> -static irqreturn_t psc_i2s_bcom_irq(int irq, void *_psc_i2s_stream) >> +static irqreturn_t psc_dma_bcom_irq(int irq, void *_psc_dma_stream) >> =A0{ >> - =A0 =A0 =A0 struct psc_i2s_stream *s =3D _psc_i2s_stream; >> + =A0 =A0 =A0 struct psc_dma_stream *s =3D _psc_dma_stream; >> >> =A0 =A0 =A0 =A0/* For each finished period, dequeue the completed period= buffer >> =A0 =A0 =A0 =A0 * and enqueue a new one in it's place. */ >> @@ -93,7 +93,7 @@ static irqreturn_t psc_i2s_bcom_irq(int irq, void *_ps= c_i2s_stream) >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0s->period_current_pt +=3D s->period_bytes= ; >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0if (s->period_current_pt >=3D s->period_e= nd) >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0s->period_current_pt =3D = s->period_start; >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 psc_i2s_bcom_enqueue_next_buffer(s); >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 psc_dma_bcom_enqueue_next_buffer(s); >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0bcom_enable(s->bcom_task); >> =A0 =A0 =A0 =A0} >> >> @@ -106,39 +106,39 @@ static irqreturn_t psc_i2s_bcom_irq(int irq, void = *_psc_i2s_stream) >> =A0} >> >> =A0/** >> - * psc_i2s_startup: create a new substream >> + * psc_dma_startup: create a new substream >> =A0* >> =A0* This is the first function called when a stream is opened. >> =A0* >> =A0* If this is the first stream open, then grab the IRQ and program mos= t of >> =A0* the PSC registers. >> =A0*/ >> -int psc_i2s_startup(struct snd_pcm_substream *substream, >> +int psc_dma_startup(struct snd_pcm_substream *substream, >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct snd_soc_dai *= dai) >> =A0{ >> =A0 =A0 =A0 =A0struct snd_soc_pcm_runtime *rtd =3D substream->private_da= ta; >> - =A0 =A0 =A0 struct psc_i2s *psc_i2s =3D rtd->dai->cpu_dai->private_dat= a; >> + =A0 =A0 =A0 struct psc_dma *psc_dma =3D rtd->dai->cpu_dai->private_dat= a; >> =A0 =A0 =A0 =A0int rc; >> >> - =A0 =A0 =A0 dev_dbg(psc_i2s->dev, "psc_i2s_startup(substream=3D%p)\n",= substream); >> + =A0 =A0 =A0 dev_dbg(psc_dma->dev, "psc_dma_startup(substream=3D%p)\n",= substream); >> >> - =A0 =A0 =A0 if (!psc_i2s->playback.active && >> - =A0 =A0 =A0 =A0 =A0 !psc_i2s->capture.active) { >> + =A0 =A0 =A0 if (!psc_dma->playback.active && >> + =A0 =A0 =A0 =A0 =A0 !psc_dma->capture.active) { >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0/* Setup the IRQs */ >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 rc =3D request_irq(psc_i2s->irq, &psc_i2s_= status_irq, IRQF_SHARED, >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0"psc-i2= s-status", psc_i2s); >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 rc |=3D request_irq(psc_i2s->capture.irq, >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 &psc_i= 2s_bcom_irq, IRQF_SHARED, >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "psc-i= 2s-capture", &psc_i2s->capture); >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 rc |=3D request_irq(psc_i2s->playback.irq, >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 &psc_i= 2s_bcom_irq, IRQF_SHARED, >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "psc-i= 2s-playback", &psc_i2s->playback); >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 rc =3D request_irq(psc_dma->irq, &psc_dma_= status_irq, IRQF_SHARED, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0"psc-dm= a-status", psc_dma); >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 rc |=3D request_irq(psc_dma->capture.irq, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 &psc_d= ma_bcom_irq, IRQF_SHARED, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "psc-d= ma-capture", &psc_dma->capture); >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 rc |=3D request_irq(psc_dma->playback.irq, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 &psc_d= ma_bcom_irq, IRQF_SHARED, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "psc-d= ma-playback", &psc_dma->playback); >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0if (rc) { >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 free_irq(psc_i2s->irq, psc= _i2s); >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 free_irq(psc_i2s->capture.= irq, >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0&psc_i2= s->capture); >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 free_irq(psc_i2s->playback= .irq, >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0&psc_i2= s->playback); >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 free_irq(psc_dma->irq, psc= _dma); >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 free_irq(psc_dma->capture.= irq, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0&psc_dm= a->capture); >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 free_irq(psc_dma->playback= .irq, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0&psc_dm= a->playback); >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0return -ENODEV; >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0} >> =A0 =A0 =A0 =A0} >> @@ -146,7 +146,7 @@ int psc_i2s_startup(struct snd_pcm_substream *substr= eam, >> =A0 =A0 =A0 =A0return 0; >> =A0} >> >> -int psc_i2s_hw_free(struct snd_pcm_substream *substream, >> +int psc_dma_hw_free(struct snd_pcm_substream *substream, >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct snd_soc_dai *= dai) >> =A0{ >> =A0 =A0 =A0 =A0snd_pcm_set_runtime_buffer(substream, NULL); >> @@ -154,29 +154,29 @@ int psc_i2s_hw_free(struct snd_pcm_substream *subs= tream, >> =A0} >> >> =A0/** >> - * psc_i2s_trigger: start and stop the DMA transfer. >> + * psc_dma_trigger: start and stop the DMA transfer. >> =A0* >> =A0* This function is called by ALSA to start, stop, pause, and resume t= he DMA >> =A0* transfer of data. >> =A0*/ >> -int psc_i2s_trigger(struct snd_pcm_substream *substream, int cmd, >> +int psc_dma_trigger(struct snd_pcm_substream *substream, int cmd, >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct snd_soc_dai *= dai) >> =A0{ >> =A0 =A0 =A0 =A0struct snd_soc_pcm_runtime *rtd =3D substream->private_da= ta; >> - =A0 =A0 =A0 struct psc_i2s *psc_i2s =3D rtd->dai->cpu_dai->private_dat= a; >> + =A0 =A0 =A0 struct psc_dma *psc_dma =3D rtd->dai->cpu_dai->private_dat= a; >> =A0 =A0 =A0 =A0struct snd_pcm_runtime *runtime =3D substream->runtime; >> - =A0 =A0 =A0 struct psc_i2s_stream *s; >> - =A0 =A0 =A0 struct mpc52xx_psc __iomem *regs =3D psc_i2s->psc_regs; >> + =A0 =A0 =A0 struct psc_dma_stream *s; >> + =A0 =A0 =A0 struct mpc52xx_psc __iomem *regs =3D psc_dma->psc_regs; >> =A0 =A0 =A0 =A0u16 imr; >> =A0 =A0 =A0 =A0u8 psc_cmd; >> =A0 =A0 =A0 =A0unsigned long flags; >> >> =A0 =A0 =A0 =A0if (substream->pstr->stream =3D=3D SNDRV_PCM_STREAM_CAPTU= RE) >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 s =3D &psc_i2s->capture; >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 s =3D &psc_dma->capture; >> =A0 =A0 =A0 =A0else >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 s =3D &psc_i2s->playback; >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 s =3D &psc_dma->playback; >> >> - =A0 =A0 =A0 dev_dbg(psc_i2s->dev, "psc_i2s_trigger(substream=3D%p, cmd= =3D%i)" >> + =A0 =A0 =A0 dev_dbg(psc_dma->dev, "psc_dma_trigger(substream=3D%p, cmd= =3D%i)" >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0" stream_id=3D%i\n", >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0substream, cmd, substream->pstr->stream); >> >> @@ -207,14 +207,14 @@ int psc_i2s_trigger(struct snd_pcm_substream *subs= tream, int cmd, >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0else >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0bcom_gen_bd_tx_reset(s->b= com_task); >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0while (!bcom_queue_full(s->bcom_task)) >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 psc_i2s_bcom_enqueue_next_= buffer(s); >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 psc_dma_bcom_enqueue_next_= buffer(s); >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0bcom_enable(s->bcom_task); >> >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* Due to errata in the i2s mode; need to = line up enabling >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* Due to errata in the dma mode; need to = line up enabling >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 * the transmitter with a transition on t= he frame sync >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 * line */ >> >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 spin_lock_irqsave(&psc_i2s->lock, flags); >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 spin_lock_irqsave(&psc_dma->lock, flags); >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0/* first make sure it is low */ >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0while ((in_8(®s->ipcr_acr.ipcr) & 0x80= ) !=3D 0) >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0; >> @@ -228,7 +228,7 @@ int psc_i2s_trigger(struct snd_pcm_substream *substr= eam, int cmd, >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0if (substream->pstr->stream =3D=3D SNDRV_= PCM_STREAM_PLAYBACK) >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0psc_cmd |=3D MPC52xx_PSC_= TX_ENABLE; >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0out_8(®s->command, psc_cmd); >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 spin_unlock_irqrestore(&psc_i2s->lock, fla= gs); >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 spin_unlock_irqrestore(&psc_dma->lock, fla= gs); >> >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0break; >> >> @@ -236,7 +236,7 @@ int psc_i2s_trigger(struct snd_pcm_substream *substr= eam, int cmd, >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0/* Turn off the PSC */ >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0s->active =3D 0; >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0if (substream->pstr->stream =3D=3D SNDRV_= PCM_STREAM_CAPTURE) { >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (!psc_i2s->playback.act= ive) { >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (!psc_dma->playback.act= ive) { >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0out_8(&re= gs->command, 2 << 4); =A0/* reset rx */ >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0out_8(&re= gs->command, 3 << 4); =A0/* reset tx */ >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0out_8(&re= gs->command, 4 << 4); =A0/* reset err */ >> @@ -244,7 +244,7 @@ int psc_i2s_trigger(struct snd_pcm_substream *substr= eam, int cmd, >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0} else { >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0out_8(®s->command, 3 <= < 4); =A0/* reset tx */ >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0out_8(®s->command, 4 <= < 4); =A0/* reset err */ >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (!psc_i2s->capture.acti= ve) >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (!psc_dma->capture.acti= ve) >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0out_8(&re= gs->command, 2 << 4); =A0/* reset rx */ >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0} >> >> @@ -255,15 +255,15 @@ int psc_i2s_trigger(struct snd_pcm_substream *subs= tream, int cmd, >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0break; >> >> =A0 =A0 =A0 =A0default: >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 dev_dbg(psc_i2s->dev, "invalid command\n")= ; >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 dev_dbg(psc_dma->dev, "invalid command\n")= ; >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0return -EINVAL; >> =A0 =A0 =A0 =A0} >> >> =A0 =A0 =A0 =A0/* Update interrupt enable settings */ >> =A0 =A0 =A0 =A0imr =3D 0; >> - =A0 =A0 =A0 if (psc_i2s->playback.active) >> + =A0 =A0 =A0 if (psc_dma->playback.active) >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0imr |=3D MPC52xx_PSC_IMR_TXEMP; >> - =A0 =A0 =A0 if (psc_i2s->capture.active) >> + =A0 =A0 =A0 if (psc_dma->capture.active) >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0imr |=3D MPC52xx_PSC_IMR_ORERR; >> =A0 =A0 =A0 =A0out_be16(®s->isr_imr.imr, imr); >> >> @@ -271,36 +271,36 @@ int psc_i2s_trigger(struct snd_pcm_substream *subs= tream, int cmd, >> =A0} >> >> =A0/** >> - * psc_i2s_shutdown: shutdown the data transfer on a stream >> + * psc_dma_shutdown: shutdown the data transfer on a stream >> =A0* >> =A0* Shutdown the PSC if there are no other substreams open. >> =A0*/ >> -void psc_i2s_shutdown(struct snd_pcm_substream *substream, >> +void psc_dma_shutdown(struct snd_pcm_substream *substream, >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct snd_soc_d= ai *dai) >> =A0{ >> =A0 =A0 =A0 =A0struct snd_soc_pcm_runtime *rtd =3D substream->private_da= ta; >> - =A0 =A0 =A0 struct psc_i2s *psc_i2s =3D rtd->dai->cpu_dai->private_dat= a; >> + =A0 =A0 =A0 struct psc_dma *psc_dma =3D rtd->dai->cpu_dai->private_dat= a; >> >> - =A0 =A0 =A0 dev_dbg(psc_i2s->dev, "psc_i2s_shutdown(substream=3D%p)\n"= , substream); >> + =A0 =A0 =A0 dev_dbg(psc_dma->dev, "psc_dma_shutdown(substream=3D%p)\n"= , substream); >> >> =A0 =A0 =A0 =A0/* >> =A0 =A0 =A0 =A0 * If this is the last active substream, disable the PSC = and release >> =A0 =A0 =A0 =A0 * the IRQ. >> =A0 =A0 =A0 =A0 */ >> - =A0 =A0 =A0 if (!psc_i2s->playback.active && >> - =A0 =A0 =A0 =A0 =A0 !psc_i2s->capture.active) { >> + =A0 =A0 =A0 if (!psc_dma->playback.active && >> + =A0 =A0 =A0 =A0 =A0 !psc_dma->capture.active) { >> >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0/* Disable all interrupts and reset the P= SC */ >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 out_be16(&psc_i2s->psc_regs->isr_imr.imr, = 0); >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 out_8(&psc_i2s->psc_regs->command, 3 << 4)= ; /* reset tx */ >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 out_8(&psc_i2s->psc_regs->command, 2 << 4)= ; /* reset rx */ >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 out_8(&psc_i2s->psc_regs->command, 1 << 4)= ; /* reset mode */ >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 out_8(&psc_i2s->psc_regs->command, 4 << 4)= ; /* reset error */ >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 out_be16(&psc_dma->psc_regs->isr_imr.imr, = 0); >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 out_8(&psc_dma->psc_regs->command, 3 << 4)= ; /* reset tx */ >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 out_8(&psc_dma->psc_regs->command, 2 << 4)= ; /* reset rx */ >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 out_8(&psc_dma->psc_regs->command, 1 << 4)= ; /* reset mode */ >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 out_8(&psc_dma->psc_regs->command, 4 << 4)= ; /* reset error */ >> >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0/* Release irqs */ >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 free_irq(psc_i2s->irq, psc_i2s); >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 free_irq(psc_i2s->capture.irq, &psc_i2s->c= apture); >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 free_irq(psc_i2s->playback.irq, &psc_i2s->= playback); >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 free_irq(psc_dma->irq, psc_dma); >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 free_irq(psc_dma->capture.irq, &psc_dma->c= apture); >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 free_irq(psc_dma->playback.irq, &psc_dma->= playback); >> =A0 =A0 =A0 =A0} >> =A0} >> >> @@ -312,7 +312,7 @@ void psc_i2s_shutdown(struct snd_pcm_substream *subs= tream, >> =A0* interaction with the attached codec >> =A0*/ >> >> -static const struct snd_pcm_hardware psc_i2s_pcm_hardware =3D { >> +static const struct snd_pcm_hardware psc_dma_pcm_hardware =3D { >> =A0 =A0 =A0 =A0.info =3D SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_MMAP_VALID= | >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_IN= FO_BLOCK_TRANSFER, >> =A0 =A0 =A0 =A0.formats =3D SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_S16_B= E | >> @@ -329,80 +329,80 @@ static const struct snd_pcm_hardware psc_i2s_pcm_h= ardware =3D { >> =A0 =A0 =A0 =A0.fifo_size =A0 =A0 =A0 =A0 =A0 =A0 =A0=3D 0, >> =A0}; >> >> -static int psc_i2s_pcm_open(struct snd_pcm_substream *substream) >> +static int psc_dma_pcm_open(struct snd_pcm_substream *substream) >> =A0{ >> =A0 =A0 =A0 =A0struct snd_soc_pcm_runtime *rtd =3D substream->private_da= ta; >> - =A0 =A0 =A0 struct psc_i2s *psc_i2s =3D rtd->dai->cpu_dai->private_dat= a; >> - =A0 =A0 =A0 struct psc_i2s_stream *s; >> + =A0 =A0 =A0 struct psc_dma *psc_dma =3D rtd->dai->cpu_dai->private_dat= a; >> + =A0 =A0 =A0 struct psc_dma_stream *s; >> >> - =A0 =A0 =A0 dev_dbg(psc_i2s->dev, "psc_i2s_pcm_open(substream=3D%p)\n"= , substream); >> + =A0 =A0 =A0 dev_dbg(psc_dma->dev, "psc_dma_pcm_open(substream=3D%p)\n"= , substream); >> >> =A0 =A0 =A0 =A0if (substream->pstr->stream =3D=3D SNDRV_PCM_STREAM_CAPTU= RE) >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 s =3D &psc_i2s->capture; >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 s =3D &psc_dma->capture; >> =A0 =A0 =A0 =A0else >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 s =3D &psc_i2s->playback; >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 s =3D &psc_dma->playback; >> >> - =A0 =A0 =A0 snd_soc_set_runtime_hwparams(substream, &psc_i2s_pcm_hardw= are); >> + =A0 =A0 =A0 snd_soc_set_runtime_hwparams(substream, &psc_dma_pcm_hardw= are); >> >> =A0 =A0 =A0 =A0s->stream =3D substream; >> =A0 =A0 =A0 =A0return 0; >> =A0} >> >> -static int psc_i2s_pcm_close(struct snd_pcm_substream *substream) >> +static int psc_dma_pcm_close(struct snd_pcm_substream *substream) >> =A0{ >> =A0 =A0 =A0 =A0struct snd_soc_pcm_runtime *rtd =3D substream->private_da= ta; >> - =A0 =A0 =A0 struct psc_i2s *psc_i2s =3D rtd->dai->cpu_dai->private_dat= a; >> - =A0 =A0 =A0 struct psc_i2s_stream *s; >> + =A0 =A0 =A0 struct psc_dma *psc_dma =3D rtd->dai->cpu_dai->private_dat= a; >> + =A0 =A0 =A0 struct psc_dma_stream *s; >> >> - =A0 =A0 =A0 dev_dbg(psc_i2s->dev, "psc_i2s_pcm_close(substream=3D%p)\n= ", substream); >> + =A0 =A0 =A0 dev_dbg(psc_dma->dev, "psc_dma_pcm_close(substream=3D%p)\n= ", substream); >> >> =A0 =A0 =A0 =A0if (substream->pstr->stream =3D=3D SNDRV_PCM_STREAM_CAPTU= RE) >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 s =3D &psc_i2s->capture; >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 s =3D &psc_dma->capture; >> =A0 =A0 =A0 =A0else >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 s =3D &psc_i2s->playback; >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 s =3D &psc_dma->playback; >> >> =A0 =A0 =A0 =A0s->stream =3D NULL; >> =A0 =A0 =A0 =A0return 0; >> =A0} >> >> =A0static snd_pcm_uframes_t >> -psc_i2s_pcm_pointer(struct snd_pcm_substream *substream) >> +psc_dma_pcm_pointer(struct snd_pcm_substream *substream) >> =A0{ >> =A0 =A0 =A0 =A0struct snd_soc_pcm_runtime *rtd =3D substream->private_da= ta; >> - =A0 =A0 =A0 struct psc_i2s *psc_i2s =3D rtd->dai->cpu_dai->private_dat= a; >> - =A0 =A0 =A0 struct psc_i2s_stream *s; >> + =A0 =A0 =A0 struct psc_dma *psc_dma =3D rtd->dai->cpu_dai->private_dat= a; >> + =A0 =A0 =A0 struct psc_dma_stream *s; >> =A0 =A0 =A0 =A0dma_addr_t count; >> >> =A0 =A0 =A0 =A0if (substream->pstr->stream =3D=3D SNDRV_PCM_STREAM_CAPTU= RE) >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 s =3D &psc_i2s->capture; >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 s =3D &psc_dma->capture; >> =A0 =A0 =A0 =A0else >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 s =3D &psc_i2s->playback; >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 s =3D &psc_dma->playback; >> >> =A0 =A0 =A0 =A0count =3D s->period_current_pt - s->period_start; >> >> =A0 =A0 =A0 =A0return bytes_to_frames(substream->runtime, count); >> =A0} >> >> -static struct snd_pcm_ops psc_i2s_pcm_ops =3D { >> - =A0 =A0 =A0 .open =A0 =A0 =A0 =A0 =A0 =3D psc_i2s_pcm_open, >> - =A0 =A0 =A0 .close =A0 =A0 =A0 =A0 =A0=3D psc_i2s_pcm_close, >> +static struct snd_pcm_ops psc_dma_pcm_ops =3D { >> + =A0 =A0 =A0 .open =A0 =A0 =A0 =A0 =A0 =3D psc_dma_pcm_open, >> + =A0 =A0 =A0 .close =A0 =A0 =A0 =A0 =A0=3D psc_dma_pcm_close, >> =A0 =A0 =A0 =A0.ioctl =A0 =A0 =A0 =A0 =A0=3D snd_pcm_lib_ioctl, >> - =A0 =A0 =A0 .pointer =A0 =A0 =A0 =A0=3D psc_i2s_pcm_pointer, >> + =A0 =A0 =A0 .pointer =A0 =A0 =A0 =A0=3D psc_dma_pcm_pointer, >> =A0}; >> >> -static u64 psc_i2s_pcm_dmamask =3D 0xffffffff; >> -static int psc_i2s_pcm_new(struct snd_card *card, struct snd_soc_dai *d= ai, >> +static u64 psc_dma_pcm_dmamask =3D 0xffffffff; >> +static int psc_dma_pcm_new(struct snd_card *card, struct snd_soc_dai *d= ai, >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct snd_pcm *pcm) >> =A0{ >> =A0 =A0 =A0 =A0struct snd_soc_pcm_runtime *rtd =3D pcm->private_data; >> - =A0 =A0 =A0 size_t size =3D psc_i2s_pcm_hardware.buffer_bytes_max; >> + =A0 =A0 =A0 size_t size =3D psc_dma_pcm_hardware.buffer_bytes_max; >> =A0 =A0 =A0 =A0int rc =3D 0; >> >> - =A0 =A0 =A0 dev_dbg(rtd->socdev->dev, "psc_i2s_pcm_new(card=3D%p, dai= =3D%p, pcm=3D%p)\n", >> + =A0 =A0 =A0 dev_dbg(rtd->socdev->dev, "psc_dma_pcm_new(card=3D%p, dai= =3D%p, pcm=3D%p)\n", >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0card, dai, pcm); >> >> =A0 =A0 =A0 =A0if (!card->dev->dma_mask) >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 card->dev->dma_mask =3D &psc_i2s_pcm_dmama= sk; >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 card->dev->dma_mask =3D &psc_dma_pcm_dmama= sk; >> =A0 =A0 =A0 =A0if (!card->dev->coherent_dma_mask) >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0card->dev->coherent_dma_mask =3D 0xffffff= ff; >> >> @@ -430,13 +430,13 @@ static int psc_i2s_pcm_new(struct snd_card *card, = struct snd_soc_dai *dai, >> =A0 =A0 =A0 =A0return -ENOMEM; >> =A0} >> >> -static void psc_i2s_pcm_free(struct snd_pcm *pcm) >> +static void psc_dma_pcm_free(struct snd_pcm *pcm) >> =A0{ >> =A0 =A0 =A0 =A0struct snd_soc_pcm_runtime *rtd =3D pcm->private_data; >> =A0 =A0 =A0 =A0struct snd_pcm_substream *substream; >> =A0 =A0 =A0 =A0int stream; >> >> - =A0 =A0 =A0 dev_dbg(rtd->socdev->dev, "psc_i2s_pcm_free(pcm=3D%p)\n", = pcm); >> + =A0 =A0 =A0 dev_dbg(rtd->socdev->dev, "psc_dma_pcm_free(pcm=3D%p)\n", = pcm); >> >> =A0 =A0 =A0 =A0for (stream =3D 0; stream < 2; stream++) { >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0substream =3D pcm->streams[stream].substr= eam; >> @@ -448,10 +448,10 @@ static void psc_i2s_pcm_free(struct snd_pcm *pcm) >> =A0 =A0 =A0 =A0} >> =A0} >> >> -struct snd_soc_platform psc_i2s_pcm_soc_platform =3D { >> +struct snd_soc_platform psc_dma_pcm_soc_platform =3D { >> =A0 =A0 =A0 =A0.name =A0 =A0 =A0 =A0 =A0 =3D "mpc5200-psc-audio", >> - =A0 =A0 =A0 .pcm_ops =A0 =A0 =A0 =A0=3D &psc_i2s_pcm_ops, >> - =A0 =A0 =A0 .pcm_new =A0 =A0 =A0 =A0=3D &psc_i2s_pcm_new, >> - =A0 =A0 =A0 .pcm_free =A0 =A0 =A0 =3D &psc_i2s_pcm_free, >> + =A0 =A0 =A0 .pcm_ops =A0 =A0 =A0 =A0=3D &psc_dma_pcm_ops, >> + =A0 =A0 =A0 .pcm_new =A0 =A0 =A0 =A0=3D &psc_dma_pcm_new, >> + =A0 =A0 =A0 .pcm_free =A0 =A0 =A0 =3D &psc_dma_pcm_free, >> =A0}; >> >> diff --git a/sound/soc/fsl/mpc5200_dma.h b/sound/soc/fsl/mpc5200_dma.h >> index 9a19e8a..a33232c 100644 >> --- a/sound/soc/fsl/mpc5200_dma.h >> +++ b/sound/soc/fsl/mpc5200_dma.h >> @@ -6,9 +6,9 @@ >> =A0#define __SOUND_SOC_FSL_MPC5200_DMA_H__ >> >> =A0/** >> - * psc_i2s_stream - Data specific to a single stream (playback or captu= re) >> + * psc_dma_stream - Data specific to a single stream (playback or captu= re) >> =A0* @active: =A0 =A0 =A0 =A0 =A0 =A0flag indicating if the stream is ac= tive >> - * @psc_i2s: =A0 =A0 =A0 =A0 =A0 pointer back to parent psc_i2s data st= ructure >> + * @psc_dma: =A0 =A0 =A0 =A0 =A0 pointer back to parent psc_dma data st= ructure >> =A0* @bcom_task: =A0 =A0 =A0 =A0 bestcomm task structure >> =A0* @irq: =A0 =A0 =A0 =A0 =A0 =A0 =A0 irq number for bestcomm task >> =A0* @period_start: =A0 =A0 =A0physical address of start of DMA region >> @@ -16,9 +16,9 @@ >> =A0* @period_next_pt: =A0 =A0physical address of next DMA buffer to enqu= eue >> =A0* @period_bytes: =A0 =A0 =A0size of DMA period in bytes >> =A0*/ >> -struct psc_i2s_stream { >> +struct psc_dma_stream { >> =A0 =A0 =A0 =A0int active; >> - =A0 =A0 =A0 struct psc_i2s *psc_i2s; >> + =A0 =A0 =A0 struct psc_dma *psc_dma; >> =A0 =A0 =A0 =A0struct bcom_task *bcom_task; >> =A0 =A0 =A0 =A0int irq; >> =A0 =A0 =A0 =A0struct snd_pcm_substream *stream; >> @@ -30,7 +30,7 @@ struct psc_i2s_stream { >> =A0}; >> >> =A0/** >> - * psc_i2s - Private driver data >> + * psc_dma - Private driver data >> =A0* @name: short name for this device ("PSC0", "PSC1", etc) >> =A0* @psc_regs: pointer to the PSC's registers >> =A0* @fifo_regs: pointer to the PSC's FIFO registers >> @@ -42,7 +42,7 @@ struct psc_i2s_stream { >> =A0* @playback: Playback stream context data >> =A0* @capture: Capture stream context data >> =A0*/ >> -struct psc_i2s { >> +struct psc_dma { >> =A0 =A0 =A0 =A0char name[32]; >> =A0 =A0 =A0 =A0struct mpc52xx_psc __iomem *psc_regs; >> =A0 =A0 =A0 =A0struct mpc52xx_psc_fifo __iomem *fifo_regs; >> @@ -53,8 +53,8 @@ struct psc_i2s { >> =A0 =A0 =A0 =A0u32 sicr; >> >> =A0 =A0 =A0 =A0/* per-stream data */ >> - =A0 =A0 =A0 struct psc_i2s_stream playback; >> - =A0 =A0 =A0 struct psc_i2s_stream capture; >> + =A0 =A0 =A0 struct psc_dma_stream playback; >> + =A0 =A0 =A0 struct psc_dma_stream capture; >> >> =A0 =A0 =A0 =A0/* Statistics */ >> =A0 =A0 =A0 =A0struct { >> @@ -64,18 +64,18 @@ struct psc_i2s { >> =A0}; >> >> >> -int psc_i2s_startup(struct snd_pcm_substream *substream, >> +int psc_dma_startup(struct snd_pcm_substream *substream, >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct snd_soc_dai *= dai); >> >> -int psc_i2s_hw_free(struct snd_pcm_substream *substream, >> +int psc_dma_hw_free(struct snd_pcm_substream *substream, >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct snd_soc_dai *= dai); >> >> -void psc_i2s_shutdown(struct snd_pcm_substream *substream, >> +void psc_dma_shutdown(struct snd_pcm_substream *substream, >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct snd_soc_d= ai *dai); >> >> -int psc_i2s_trigger(struct snd_pcm_substream *substream, int cmd, >> +int psc_dma_trigger(struct snd_pcm_substream *substream, int cmd, >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct snd_soc_dai *= dai); >> >> -extern struct snd_soc_platform psc_i2s_pcm_soc_platform; >> +extern struct snd_soc_platform psc_dma_pcm_soc_platform; >> >> =A0#endif /* __SOUND_SOC_FSL_MPC5200_DMA_H__ */ >> diff --git a/sound/soc/fsl/mpc5200_psc_i2s.c b/sound/soc/fsl/mpc5200_psc= _i2s.c >> index 8974b53..12a7917 100644 >> --- a/sound/soc/fsl/mpc5200_psc_i2s.c >> +++ b/sound/soc/fsl/mpc5200_psc_i2s.c >> @@ -54,10 +54,10 @@ static int psc_i2s_hw_params(struct snd_pcm_substrea= m *substream, >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct s= nd_soc_dai *dai) >> =A0{ >> =A0 =A0 =A0 =A0struct snd_soc_pcm_runtime *rtd =3D substream->private_da= ta; >> - =A0 =A0 =A0 struct psc_i2s *psc_i2s =3D rtd->dai->cpu_dai->private_dat= a; >> + =A0 =A0 =A0 struct psc_dma *psc_dma =3D rtd->dai->cpu_dai->private_dat= a; >> =A0 =A0 =A0 =A0u32 mode; >> >> - =A0 =A0 =A0 dev_dbg(psc_i2s->dev, "%s(substream=3D%p) p_size=3D%i p_by= tes=3D%i" >> + =A0 =A0 =A0 dev_dbg(psc_dma->dev, "%s(substream=3D%p) p_size=3D%i p_by= tes=3D%i" >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0" periods=3D%i buffer_size=3D%i =A0buffer= _bytes=3D%i\n", >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0__func__, substream, params_period_size(p= arams), >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0params_period_bytes(params), params_perio= ds(params), >> @@ -77,10 +77,10 @@ static int psc_i2s_hw_params(struct snd_pcm_substrea= m *substream, >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0mode =3D MPC52xx_PSC_SICR_SIM_CODEC_32; >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0break; >> =A0 =A0 =A0 =A0default: >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 dev_dbg(psc_i2s->dev, "invalid format\n"); >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 dev_dbg(psc_dma->dev, "invalid format\n"); >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0return -EINVAL; >> =A0 =A0 =A0 =A0} >> - =A0 =A0 =A0 out_be32(&psc_i2s->psc_regs->sicr, psc_i2s->sicr | mode); >> + =A0 =A0 =A0 out_be32(&psc_dma->psc_regs->sicr, psc_dma->sicr | mode); >> >> =A0 =A0 =A0 =A0snd_pcm_set_runtime_buffer(substream, &substream->dma_buf= fer); >> >> @@ -104,8 +104,8 @@ static int psc_i2s_hw_params(struct snd_pcm_substrea= m *substream, >> =A0static int psc_i2s_set_sysclk(struct snd_soc_dai *cpu_dai, >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0int clk_id, u= nsigned int freq, int dir) >> =A0{ >> - =A0 =A0 =A0 struct psc_i2s *psc_i2s =3D cpu_dai->private_data; >> - =A0 =A0 =A0 dev_dbg(psc_i2s->dev, "psc_i2s_set_sysclk(cpu_dai=3D%p, di= r=3D%i)\n", >> + =A0 =A0 =A0 struct psc_dma *psc_dma =3D cpu_dai->private_data; >> + =A0 =A0 =A0 dev_dbg(psc_dma->dev, "psc_i2s_set_sysclk(cpu_dai=3D%p, di= r=3D%i)\n", >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0cpu_dai, = dir); >> =A0 =A0 =A0 =A0return (dir =3D=3D SND_SOC_CLOCK_IN) ? 0 : -EINVAL; >> =A0} >> @@ -123,8 +123,8 @@ static int psc_i2s_set_sysclk(struct snd_soc_dai *cp= u_dai, >> =A0*/ >> =A0static int psc_i2s_set_fmt(struct snd_soc_dai *cpu_dai, unsigned int = format) >> =A0{ >> - =A0 =A0 =A0 struct psc_i2s *psc_i2s =3D cpu_dai->private_data; >> - =A0 =A0 =A0 dev_dbg(psc_i2s->dev, "psc_i2s_set_fmt(cpu_dai=3D%p, forma= t=3D%i)\n", >> + =A0 =A0 =A0 struct psc_dma *psc_dma =3D cpu_dai->private_data; >> + =A0 =A0 =A0 dev_dbg(psc_dma->dev, "psc_i2s_set_fmt(cpu_dai=3D%p, forma= t=3D%i)\n", >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0cpu_dai, = format); >> =A0 =A0 =A0 =A0return (format =3D=3D SND_SOC_DAIFMT_I2S) ? 0 : -EINVAL; >> =A0} >> @@ -140,11 +140,11 @@ static int psc_i2s_set_fmt(struct snd_soc_dai *cpu= _dai, unsigned int format) >> =A0* psc_i2s_dai_template: template CPU Digital Audio Interface >> =A0*/ >> =A0static struct snd_soc_dai_ops psc_i2s_dai_ops =3D { >> - =A0 =A0 =A0 .startup =A0 =A0 =A0 =A0=3D psc_i2s_startup, >> + =A0 =A0 =A0 .startup =A0 =A0 =A0 =A0=3D psc_dma_startup, >> =A0 =A0 =A0 =A0.hw_params =A0 =A0 =A0=3D psc_i2s_hw_params, >> - =A0 =A0 =A0 .hw_free =A0 =A0 =A0 =A0=3D psc_i2s_hw_free, >> - =A0 =A0 =A0 .shutdown =A0 =A0 =A0 =3D psc_i2s_shutdown, >> - =A0 =A0 =A0 .trigger =A0 =A0 =A0 =A0=3D psc_i2s_trigger, >> + =A0 =A0 =A0 .hw_free =A0 =A0 =A0 =A0=3D psc_dma_hw_free, >> + =A0 =A0 =A0 .shutdown =A0 =A0 =A0 =3D psc_dma_shutdown, >> + =A0 =A0 =A0 .trigger =A0 =A0 =A0 =A0=3D psc_dma_trigger, >> =A0 =A0 =A0 =A0.set_sysclk =A0 =A0 =3D psc_i2s_set_sysclk, >> =A0 =A0 =A0 =A0.set_fmt =A0 =A0 =A0 =A0=3D psc_i2s_set_fmt, >> =A0}; >> @@ -172,24 +172,24 @@ static struct snd_soc_dai psc_i2s_dai_template =3D= { >> =A0static ssize_t psc_i2s_status_show(struct device *dev, >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct device_attrib= ute *attr, char *buf) >> =A0{ >> - =A0 =A0 =A0 struct psc_i2s *psc_i2s =3D dev_get_drvdata(dev); >> + =A0 =A0 =A0 struct psc_dma *psc_dma =3D dev_get_drvdata(dev); >> >> =A0 =A0 =A0 =A0return sprintf(buf, "status=3D%.4x sicr=3D%.8x rfnum=3D%i= rfstat=3D0x%.4x " >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0"tfnum=3D%i tfstat=3D0x%.= 4x\n", >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 in_be16(&psc_i2s->psc_regs= ->sr_csr.status), >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 in_be32(&psc_i2s->psc_regs= ->sicr), >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 in_be16(&psc_i2s->fifo_reg= s->rfnum) & 0x1ff, >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 in_be16(&psc_i2s->fifo_reg= s->rfstat), >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 in_be16(&psc_i2s->fifo_reg= s->tfnum) & 0x1ff, >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 in_be16(&psc_i2s->fifo_reg= s->tfstat)); >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 in_be16(&psc_dma->psc_regs= ->sr_csr.status), >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 in_be32(&psc_dma->psc_regs= ->sicr), >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 in_be16(&psc_dma->fifo_reg= s->rfnum) & 0x1ff, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 in_be16(&psc_dma->fifo_reg= s->rfstat), >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 in_be16(&psc_dma->fifo_reg= s->tfnum) & 0x1ff, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 in_be16(&psc_dma->fifo_reg= s->tfstat)); >> =A0} >> >> -static int *psc_i2s_get_stat_attr(struct psc_i2s *psc_i2s, const char *= name) >> +static int *psc_i2s_get_stat_attr(struct psc_dma *psc_dma, const char *= name) >> =A0{ >> =A0 =A0 =A0 =A0if (strcmp(name, "playback_underrun") =3D=3D 0) >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 return &psc_i2s->stats.underrun_count; >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 return &psc_dma->stats.underrun_count; >> =A0 =A0 =A0 =A0if (strcmp(name, "capture_overrun") =3D=3D 0) >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 return &psc_i2s->stats.overrun_count; >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 return &psc_dma->stats.overrun_count; >> >> =A0 =A0 =A0 =A0return NULL; >> =A0} >> @@ -197,10 +197,10 @@ static int *psc_i2s_get_stat_attr(struct psc_i2s *= psc_i2s, const char *name) >> =A0static ssize_t psc_i2s_stat_show(struct device *dev, >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct d= evice_attribute *attr, char *buf) >> =A0{ >> - =A0 =A0 =A0 struct psc_i2s *psc_i2s =3D dev_get_drvdata(dev); >> + =A0 =A0 =A0 struct psc_dma *psc_dma =3D dev_get_drvdata(dev); >> =A0 =A0 =A0 =A0int *attrib; >> >> - =A0 =A0 =A0 attrib =3D psc_i2s_get_stat_attr(psc_i2s, attr->attr.name)= ; >> + =A0 =A0 =A0 attrib =3D psc_i2s_get_stat_attr(psc_dma, attr->attr.name)= ; >> =A0 =A0 =A0 =A0if (!attrib) >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0return 0; >> >> @@ -212,10 +212,10 @@ static ssize_t psc_i2s_stat_store(struct device *d= ev, >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0const= char *buf, >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0size_= t count) >> =A0{ >> - =A0 =A0 =A0 struct psc_i2s *psc_i2s =3D dev_get_drvdata(dev); >> + =A0 =A0 =A0 struct psc_dma *psc_dma =3D dev_get_drvdata(dev); >> =A0 =A0 =A0 =A0int *attrib; >> >> - =A0 =A0 =A0 attrib =3D psc_i2s_get_stat_attr(psc_i2s, attr->attr.name)= ; >> + =A0 =A0 =A0 attrib =3D psc_i2s_get_stat_attr(psc_dma, attr->attr.name)= ; >> =A0 =A0 =A0 =A0if (!attrib) >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0return 0; >> >> @@ -238,7 +238,7 @@ static int __devinit psc_i2s_of_probe(struct of_devi= ce *op, >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0const struct of_device_id *match) >> =A0{ >> =A0 =A0 =A0 =A0phys_addr_t fifo; >> - =A0 =A0 =A0 struct psc_i2s *psc_i2s; >> + =A0 =A0 =A0 struct psc_dma *psc_dma; >> =A0 =A0 =A0 =A0struct resource res; >> =A0 =A0 =A0 =A0int size, psc_id, irq, rc; >> =A0 =A0 =A0 =A0const __be32 *prop; >> @@ -265,56 +265,56 @@ static int __devinit psc_i2s_of_probe(struct of_de= vice *op, >> =A0 =A0 =A0 =A0} >> >> =A0 =A0 =A0 =A0/* Allocate and initialize the driver private data */ >> - =A0 =A0 =A0 psc_i2s =3D kzalloc(sizeof *psc_i2s, GFP_KERNEL); >> - =A0 =A0 =A0 if (!psc_i2s) { >> + =A0 =A0 =A0 psc_dma =3D kzalloc(sizeof *psc_dma, GFP_KERNEL); >> + =A0 =A0 =A0 if (!psc_dma) { >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0iounmap(regs); >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0return -ENOMEM; >> =A0 =A0 =A0 =A0} >> - =A0 =A0 =A0 spin_lock_init(&psc_i2s->lock); >> - =A0 =A0 =A0 psc_i2s->irq =3D irq; >> - =A0 =A0 =A0 psc_i2s->psc_regs =3D regs; >> - =A0 =A0 =A0 psc_i2s->fifo_regs =3D regs + sizeof *psc_i2s->psc_regs; >> - =A0 =A0 =A0 psc_i2s->dev =3D &op->dev; >> - =A0 =A0 =A0 psc_i2s->playback.psc_i2s =3D psc_i2s; >> - =A0 =A0 =A0 psc_i2s->capture.psc_i2s =3D psc_i2s; >> - =A0 =A0 =A0 snprintf(psc_i2s->name, sizeof psc_i2s->name, "PSC%u", psc= _id+1); >> + =A0 =A0 =A0 spin_lock_init(&psc_dma->lock); >> + =A0 =A0 =A0 psc_dma->irq =3D irq; >> + =A0 =A0 =A0 psc_dma->psc_regs =3D regs; >> + =A0 =A0 =A0 psc_dma->fifo_regs =3D regs + sizeof *psc_dma->psc_regs; >> + =A0 =A0 =A0 psc_dma->dev =3D &op->dev; >> + =A0 =A0 =A0 psc_dma->playback.psc_dma =3D psc_dma; >> + =A0 =A0 =A0 psc_dma->capture.psc_dma =3D psc_dma; >> + =A0 =A0 =A0 snprintf(psc_dma->name, sizeof psc_dma->name, "PSC%u", psc= _id+1); >> >> =A0 =A0 =A0 =A0/* Fill out the CPU DAI structure */ >> - =A0 =A0 =A0 memcpy(&psc_i2s->dai, &psc_i2s_dai_template, sizeof psc_i2= s->dai); >> - =A0 =A0 =A0 psc_i2s->dai.private_data =3D psc_i2s; >> - =A0 =A0 =A0 psc_i2s->dai.name =3D psc_i2s->name; >> - =A0 =A0 =A0 psc_i2s->dai.id =3D psc_id; >> + =A0 =A0 =A0 memcpy(&psc_dma->dai, &psc_i2s_dai_template, sizeof psc_dm= a->dai); >> + =A0 =A0 =A0 psc_dma->dai.private_data =3D psc_dma; >> + =A0 =A0 =A0 psc_dma->dai.name =3D psc_dma->name; >> + =A0 =A0 =A0 psc_dma->dai.id =3D psc_id; >> >> =A0 =A0 =A0 =A0/* Find the address of the fifo data registers and setup = the >> =A0 =A0 =A0 =A0 * DMA tasks */ >> =A0 =A0 =A0 =A0fifo =3D res.start + offsetof(struct mpc52xx_psc, buffer.= buffer_32); >> - =A0 =A0 =A0 psc_i2s->capture.bcom_task =3D >> + =A0 =A0 =A0 psc_dma->capture.bcom_task =3D >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0bcom_psc_gen_bd_rx_init(psc_id, 10, fifo,= 512); >> - =A0 =A0 =A0 psc_i2s->playback.bcom_task =3D >> + =A0 =A0 =A0 psc_dma->playback.bcom_task =3D >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0bcom_psc_gen_bd_tx_init(psc_id, 10, fifo)= ; >> - =A0 =A0 =A0 if (!psc_i2s->capture.bcom_task || >> - =A0 =A0 =A0 =A0 =A0 !psc_i2s->playback.bcom_task) { >> + =A0 =A0 =A0 if (!psc_dma->capture.bcom_task || >> + =A0 =A0 =A0 =A0 =A0 !psc_dma->playback.bcom_task) { >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0dev_err(&op->dev, "Could not allocate bes= tcomm tasks\n"); >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0iounmap(regs); >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 kfree(psc_i2s); >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 kfree(psc_dma); >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0return -ENODEV; >> =A0 =A0 =A0 =A0} >> >> =A0 =A0 =A0 =A0/* Disable all interrupts and reset the PSC */ >> - =A0 =A0 =A0 out_be16(&psc_i2s->psc_regs->isr_imr.imr, 0); >> - =A0 =A0 =A0 out_8(&psc_i2s->psc_regs->command, 3 << 4); /* reset trans= mitter */ >> - =A0 =A0 =A0 out_8(&psc_i2s->psc_regs->command, 2 << 4); /* reset recei= ver */ >> - =A0 =A0 =A0 out_8(&psc_i2s->psc_regs->command, 1 << 4); /* reset mode = */ >> - =A0 =A0 =A0 out_8(&psc_i2s->psc_regs->command, 4 << 4); /* reset error= */ >> + =A0 =A0 =A0 out_be16(&psc_dma->psc_regs->isr_imr.imr, 0); >> + =A0 =A0 =A0 out_8(&psc_dma->psc_regs->command, 3 << 4); /* reset trans= mitter */ >> + =A0 =A0 =A0 out_8(&psc_dma->psc_regs->command, 2 << 4); /* reset recei= ver */ >> + =A0 =A0 =A0 out_8(&psc_dma->psc_regs->command, 1 << 4); /* reset mode = */ >> + =A0 =A0 =A0 out_8(&psc_dma->psc_regs->command, 4 << 4); /* reset error= */ >> >> =A0 =A0 =A0 =A0/* Configure the serial interface mode; defaulting to COD= EC8 mode */ >> - =A0 =A0 =A0 psc_i2s->sicr =3D MPC52xx_PSC_SICR_DTS1 | MPC52xx_PSC_SICR= _I2S | >> + =A0 =A0 =A0 psc_dma->sicr =3D MPC52xx_PSC_SICR_DTS1 | MPC52xx_PSC_SICR= _I2S | >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0MPC52xx_PSC_SICR_CLKPOL; >> =A0 =A0 =A0 =A0if (of_get_property(op->node, "fsl,cellslave", NULL)) >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 psc_i2s->sicr |=3D MPC52xx_PSC_SICR_CELLSL= AVE | >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 psc_dma->sicr |=3D MPC52xx_PSC_SICR_CELLSL= AVE | >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 MPC52xx_= PSC_SICR_GENCLK; >> - =A0 =A0 =A0 out_be32(&psc_i2s->psc_regs->sicr, >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0psc_i2s->sicr | MPC52xx_PSC_SICR_SIM_CO= DEC_8); >> + =A0 =A0 =A0 out_be32(&psc_dma->psc_regs->sicr, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0psc_dma->sicr | MPC52xx_PSC_SICR_SIM_CO= DEC_8); >> >> =A0 =A0 =A0 =A0/* Check for the codec handle. =A0If it is not present th= en we >> =A0 =A0 =A0 =A0 * are done */ >> @@ -325,54 +325,54 @@ static int __devinit psc_i2s_of_probe(struct of_de= vice *op, >> =A0 =A0 =A0 =A0 * First write: RxRdy (FIFO Alarm) generates rx FIFO irq >> =A0 =A0 =A0 =A0 * Second write: register Normal mode for non loopback >> =A0 =A0 =A0 =A0 */ >> - =A0 =A0 =A0 out_8(&psc_i2s->psc_regs->mode, 0); >> - =A0 =A0 =A0 out_8(&psc_i2s->psc_regs->mode, 0); >> + =A0 =A0 =A0 out_8(&psc_dma->psc_regs->mode, 0); >> + =A0 =A0 =A0 out_8(&psc_dma->psc_regs->mode, 0); >> >> =A0 =A0 =A0 =A0/* Set the TX and RX fifo alarm thresholds */ >> - =A0 =A0 =A0 out_be16(&psc_i2s->fifo_regs->rfalarm, 0x100); >> - =A0 =A0 =A0 out_8(&psc_i2s->fifo_regs->rfcntl, 0x4); >> - =A0 =A0 =A0 out_be16(&psc_i2s->fifo_regs->tfalarm, 0x100); >> - =A0 =A0 =A0 out_8(&psc_i2s->fifo_regs->tfcntl, 0x7); >> + =A0 =A0 =A0 out_be16(&psc_dma->fifo_regs->rfalarm, 0x100); >> + =A0 =A0 =A0 out_8(&psc_dma->fifo_regs->rfcntl, 0x4); >> + =A0 =A0 =A0 out_be16(&psc_dma->fifo_regs->tfalarm, 0x100); >> + =A0 =A0 =A0 out_8(&psc_dma->fifo_regs->tfcntl, 0x7); >> >> =A0 =A0 =A0 =A0/* Lookup the IRQ numbers */ >> - =A0 =A0 =A0 psc_i2s->playback.irq =3D >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 bcom_get_task_irq(psc_i2s->playback.bcom_t= ask); >> - =A0 =A0 =A0 psc_i2s->capture.irq =3D >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 bcom_get_task_irq(psc_i2s->capture.bcom_ta= sk); >> + =A0 =A0 =A0 psc_dma->playback.irq =3D >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 bcom_get_task_irq(psc_dma->playback.bcom_t= ask); >> + =A0 =A0 =A0 psc_dma->capture.irq =3D >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 bcom_get_task_irq(psc_dma->capture.bcom_ta= sk); >> >> =A0 =A0 =A0 =A0/* Save what we've done so it can be found again later */ >> - =A0 =A0 =A0 dev_set_drvdata(&op->dev, psc_i2s); >> + =A0 =A0 =A0 dev_set_drvdata(&op->dev, psc_dma); >> >> =A0 =A0 =A0 =A0/* Register the SYSFS files */ >> - =A0 =A0 =A0 rc =3D device_create_file(psc_i2s->dev, &dev_attr_status); >> - =A0 =A0 =A0 rc |=3D device_create_file(psc_i2s->dev, &dev_attr_capture= _overrun); >> - =A0 =A0 =A0 rc |=3D device_create_file(psc_i2s->dev, &dev_attr_playbac= k_underrun); >> + =A0 =A0 =A0 rc =3D device_create_file(psc_dma->dev, &dev_attr_status); >> + =A0 =A0 =A0 rc |=3D device_create_file(psc_dma->dev, &dev_attr_capture= _overrun); >> + =A0 =A0 =A0 rc |=3D device_create_file(psc_dma->dev, &dev_attr_playbac= k_underrun); >> =A0 =A0 =A0 =A0if (rc) >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 dev_info(psc_i2s->dev, "error creating sys= fs files\n"); >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 dev_info(psc_dma->dev, "error creating sys= fs files\n"); >> >> - =A0 =A0 =A0 snd_soc_register_platform(&psc_i2s_pcm_soc_platform); >> + =A0 =A0 =A0 snd_soc_register_platform(&psc_dma_pcm_soc_platform); >> >> =A0 =A0 =A0 =A0/* Tell the ASoC OF helpers about it */ >> - =A0 =A0 =A0 of_snd_soc_register_platform(&psc_i2s_pcm_soc_platform, op= ->node, >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0&psc_i2s->dai); >> + =A0 =A0 =A0 of_snd_soc_register_platform(&psc_dma_pcm_soc_platform, op= ->node, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0&psc_dma->dai); >> >> =A0 =A0 =A0 =A0return 0; >> =A0} >> >> =A0static int __devexit psc_i2s_of_remove(struct of_device *op) >> =A0{ >> - =A0 =A0 =A0 struct psc_i2s *psc_i2s =3D dev_get_drvdata(&op->dev); >> + =A0 =A0 =A0 struct psc_dma *psc_dma =3D dev_get_drvdata(&op->dev); >> >> =A0 =A0 =A0 =A0dev_dbg(&op->dev, "psc_i2s_remove()\n"); >> >> - =A0 =A0 =A0 snd_soc_unregister_platform(&psc_i2s_pcm_soc_platform); >> + =A0 =A0 =A0 snd_soc_unregister_platform(&psc_dma_pcm_soc_platform); >> >> - =A0 =A0 =A0 bcom_gen_bd_rx_release(psc_i2s->capture.bcom_task); >> - =A0 =A0 =A0 bcom_gen_bd_tx_release(psc_i2s->playback.bcom_task); >> + =A0 =A0 =A0 bcom_gen_bd_rx_release(psc_dma->capture.bcom_task); >> + =A0 =A0 =A0 bcom_gen_bd_tx_release(psc_dma->playback.bcom_task); >> >> - =A0 =A0 =A0 iounmap(psc_i2s->psc_regs); >> - =A0 =A0 =A0 iounmap(psc_i2s->fifo_regs); >> - =A0 =A0 =A0 kfree(psc_i2s); >> + =A0 =A0 =A0 iounmap(psc_dma->psc_regs); >> + =A0 =A0 =A0 iounmap(psc_dma->fifo_regs); >> + =A0 =A0 =A0 kfree(psc_dma); >> =A0 =A0 =A0 =A0dev_set_drvdata(&op->dev, NULL); >> >> =A0 =A0 =A0 =A0return 0; >> >> > > > > -- > Grant Likely, B.Sc., P.Eng. > Secret Lab Technologies Ltd. > --=20 Grant Likely, B.Sc., P.Eng. Secret Lab Technologies Ltd. ^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH V1 3/3] Rename exports in mpc5200_dma.c 2009-04-26 19:53 [PATCH V1 0/3] Split the DMA core out from mpc5200_psc_i2s.c Jon Smirl 2009-04-26 19:53 ` [PATCH V1 1/3] Basic split of mpc5200 DMA code out from mpc5200_psc_i2s Jon Smirl 2009-04-26 19:53 ` [PATCH V1 2/3] Rename the PSC functions to DMA Jon Smirl @ 2009-04-26 19:53 ` Jon Smirl 2009-04-27 4:08 ` Grant Likely 2 siblings, 1 reply; 10+ messages in thread From: Jon Smirl @ 2009-04-26 19:53 UTC (permalink / raw) To: grant.likely, linuxppc-dev Rename the public DMA exports into the global name space so that the DMA code can be built as a module. Signed-off-by: Jon Smirl <jonsmirl@gmail.com> --- sound/soc/fsl/mpc5200_dma.c | 18 ++++++++++++------ sound/soc/fsl/mpc5200_dma.h | 10 +++++----- sound/soc/fsl/mpc5200_psc_i2s.c | 14 +++++++------- 3 files changed, 24 insertions(+), 18 deletions(-) diff --git a/sound/soc/fsl/mpc5200_dma.c b/sound/soc/fsl/mpc5200_dma.c index c82ef75..df73755 100644 --- a/sound/soc/fsl/mpc5200_dma.c +++ b/sound/soc/fsl/mpc5200_dma.c @@ -113,7 +113,7 @@ static irqreturn_t psc_dma_bcom_irq(int irq, void *_psc_dma_stream) * If this is the first stream open, then grab the IRQ and program most of * the PSC registers. */ -int psc_dma_startup(struct snd_pcm_substream *substream, +int mpc5200_dma_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; @@ -145,13 +145,16 @@ int psc_dma_startup(struct snd_pcm_substream *substream, return 0; } +EXPORT_SYMBOL_GPL(mpc5200_dma_startup); -int psc_dma_hw_free(struct snd_pcm_substream *substream, +int mpc5200_dma_hw_free(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { snd_pcm_set_runtime_buffer(substream, NULL); return 0; } +EXPORT_SYMBOL_GPL(mpc5200_dma_hw_free); + /** * psc_dma_trigger: start and stop the DMA transfer. @@ -159,7 +162,7 @@ int psc_dma_hw_free(struct snd_pcm_substream *substream, * This function is called by ALSA to start, stop, pause, and resume the DMA * transfer of data. */ -int psc_dma_trigger(struct snd_pcm_substream *substream, int cmd, +int mpc5200_dma_trigger(struct snd_pcm_substream *substream, int cmd, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; @@ -269,13 +272,15 @@ int psc_dma_trigger(struct snd_pcm_substream *substream, int cmd, return 0; } +EXPORT_SYMBOL_GPL(mpc5200_dma_trigger); + /** * psc_dma_shutdown: shutdown the data transfer on a stream * * Shutdown the PSC if there are no other substreams open. */ -void psc_dma_shutdown(struct snd_pcm_substream *substream, +void mpc5200_dma_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; @@ -303,6 +308,7 @@ void psc_dma_shutdown(struct snd_pcm_substream *substream, free_irq(psc_dma->playback.irq, &psc_dma->playback); } } +EXPORT_SYMBOL_GPL(mpc5200_dma_shutdown); /* --------------------------------------------------------------------- * The PSC DMA 'ASoC platform' driver @@ -448,10 +454,10 @@ static void psc_dma_pcm_free(struct snd_pcm *pcm) } } -struct snd_soc_platform psc_dma_pcm_soc_platform = { +struct snd_soc_platform mpc5200_dma_platform = { .name = "mpc5200-psc-audio", .pcm_ops = &psc_dma_pcm_ops, .pcm_new = &psc_dma_pcm_new, .pcm_free = &psc_dma_pcm_free, }; - +EXPORT_SYMBOL_GPL(mpc5200_dma_platform); diff --git a/sound/soc/fsl/mpc5200_dma.h b/sound/soc/fsl/mpc5200_dma.h index a33232c..e52b90e 100644 --- a/sound/soc/fsl/mpc5200_dma.h +++ b/sound/soc/fsl/mpc5200_dma.h @@ -64,18 +64,18 @@ struct psc_dma { }; -int psc_dma_startup(struct snd_pcm_substream *substream, +int mpc5200_dma_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai); -int psc_dma_hw_free(struct snd_pcm_substream *substream, +int mpc5200_dma_hw_free(struct snd_pcm_substream *substream, struct snd_soc_dai *dai); -void psc_dma_shutdown(struct snd_pcm_substream *substream, +void mpc5200_dma_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai); -int psc_dma_trigger(struct snd_pcm_substream *substream, int cmd, +int mpc5200_dma_trigger(struct snd_pcm_substream *substream, int cmd, struct snd_soc_dai *dai); -extern struct snd_soc_platform psc_dma_pcm_soc_platform; +extern struct snd_soc_platform mpc5200_dma_platform; #endif /* __SOUND_SOC_FSL_MPC5200_DMA_H__ */ diff --git a/sound/soc/fsl/mpc5200_psc_i2s.c b/sound/soc/fsl/mpc5200_psc_i2s.c index 12a7917..a4a439c 100644 --- a/sound/soc/fsl/mpc5200_psc_i2s.c +++ b/sound/soc/fsl/mpc5200_psc_i2s.c @@ -140,11 +140,11 @@ static int psc_i2s_set_fmt(struct snd_soc_dai *cpu_dai, unsigned int format) * psc_i2s_dai_template: template CPU Digital Audio Interface */ static struct snd_soc_dai_ops psc_i2s_dai_ops = { - .startup = psc_dma_startup, + .startup = mpc5200_dma_startup, .hw_params = psc_i2s_hw_params, - .hw_free = psc_dma_hw_free, - .shutdown = psc_dma_shutdown, - .trigger = psc_dma_trigger, + .hw_free = mpc5200_dma_hw_free, + .shutdown = mpc5200_dma_shutdown, + .trigger = mpc5200_dma_trigger, .set_sysclk = psc_i2s_set_sysclk, .set_fmt = psc_i2s_set_fmt, }; @@ -350,10 +350,10 @@ static int __devinit psc_i2s_of_probe(struct of_device *op, if (rc) dev_info(psc_dma->dev, "error creating sysfs files\n"); - snd_soc_register_platform(&psc_dma_pcm_soc_platform); + snd_soc_register_platform(&mpc5200_dma_platform); /* Tell the ASoC OF helpers about it */ - of_snd_soc_register_platform(&psc_dma_pcm_soc_platform, op->node, + of_snd_soc_register_platform(&mpc5200_dma_platform, op->node, &psc_dma->dai); return 0; @@ -365,7 +365,7 @@ static int __devexit psc_i2s_of_remove(struct of_device *op) dev_dbg(&op->dev, "psc_i2s_remove()\n"); - snd_soc_unregister_platform(&psc_dma_pcm_soc_platform); + snd_soc_unregister_platform(&mpc5200_dma_platform); bcom_gen_bd_rx_release(psc_dma->capture.bcom_task); bcom_gen_bd_tx_release(psc_dma->playback.bcom_task); ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH V1 3/3] Rename exports in mpc5200_dma.c 2009-04-26 19:53 ` [PATCH V1 3/3] Rename exports in mpc5200_dma.c Jon Smirl @ 2009-04-27 4:08 ` Grant Likely 2009-04-27 4:27 ` Jon Smirl 0 siblings, 1 reply; 10+ messages in thread From: Grant Likely @ 2009-04-27 4:08 UTC (permalink / raw) To: Jon Smirl; +Cc: linuxppc-dev On Sun, Apr 26, 2009 at 1:53 PM, Jon Smirl <jonsmirl@gmail.com> wrote: > Rename the public DMA exports into the global name space so that the DMA = code can be built as a module. > > Signed-off-by: Jon Smirl <jonsmirl@gmail.com> Nack. mpc5200_dma is too generic for the global namespace... (in fact, I should also relook at the previous patch; I might need to nack my ack). Some variant of 'mpc5200_psc_snd_dma' would be more appropriate. Even mpc5200_psc_dma is too generic because other non-sound PSC modes can use DMA also. g. > --- > =A0sound/soc/fsl/mpc5200_dma.c =A0 =A0 | =A0 18 ++++++++++++------ > =A0sound/soc/fsl/mpc5200_dma.h =A0 =A0 | =A0 10 +++++----- > =A0sound/soc/fsl/mpc5200_psc_i2s.c | =A0 14 +++++++------- > =A03 files changed, 24 insertions(+), 18 deletions(-) > > diff --git a/sound/soc/fsl/mpc5200_dma.c b/sound/soc/fsl/mpc5200_dma.c > index c82ef75..df73755 100644 > --- a/sound/soc/fsl/mpc5200_dma.c > +++ b/sound/soc/fsl/mpc5200_dma.c > @@ -113,7 +113,7 @@ static irqreturn_t psc_dma_bcom_irq(int irq, void *_p= sc_dma_stream) > =A0* If this is the first stream open, then grab the IRQ and program most= of > =A0* the PSC registers. > =A0*/ > -int psc_dma_startup(struct snd_pcm_substream *substream, > +int mpc5200_dma_startup(struct snd_pcm_substream *substream, > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct snd_soc_dai *d= ai) > =A0{ > =A0 =A0 =A0 =A0struct snd_soc_pcm_runtime *rtd =3D substream->private_dat= a; > @@ -145,13 +145,16 @@ int psc_dma_startup(struct snd_pcm_substream *subst= ream, > > =A0 =A0 =A0 =A0return 0; > =A0} > +EXPORT_SYMBOL_GPL(mpc5200_dma_startup); > > -int psc_dma_hw_free(struct snd_pcm_substream *substream, > +int mpc5200_dma_hw_free(struct snd_pcm_substream *substream, > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct snd_soc_dai *d= ai) > =A0{ > =A0 =A0 =A0 =A0snd_pcm_set_runtime_buffer(substream, NULL); > =A0 =A0 =A0 =A0return 0; > =A0} > +EXPORT_SYMBOL_GPL(mpc5200_dma_hw_free); > + > > =A0/** > =A0* psc_dma_trigger: start and stop the DMA transfer. > @@ -159,7 +162,7 @@ int psc_dma_hw_free(struct snd_pcm_substream *substre= am, > =A0* This function is called by ALSA to start, stop, pause, and resume th= e DMA > =A0* transfer of data. > =A0*/ > -int psc_dma_trigger(struct snd_pcm_substream *substream, int cmd, > +int mpc5200_dma_trigger(struct snd_pcm_substream *substream, int cmd, > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct snd_soc_dai *d= ai) > =A0{ > =A0 =A0 =A0 =A0struct snd_soc_pcm_runtime *rtd =3D substream->private_dat= a; > @@ -269,13 +272,15 @@ int psc_dma_trigger(struct snd_pcm_substream *subst= ream, int cmd, > > =A0 =A0 =A0 =A0return 0; > =A0} > +EXPORT_SYMBOL_GPL(mpc5200_dma_trigger); > + > > =A0/** > =A0* psc_dma_shutdown: shutdown the data transfer on a stream > =A0* > =A0* Shutdown the PSC if there are no other substreams open. > =A0*/ > -void psc_dma_shutdown(struct snd_pcm_substream *substream, > +void mpc5200_dma_shutdown(struct snd_pcm_substream *substream, > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct snd_soc_da= i *dai) > =A0{ > =A0 =A0 =A0 =A0struct snd_soc_pcm_runtime *rtd =3D substream->private_dat= a; > @@ -303,6 +308,7 @@ void psc_dma_shutdown(struct snd_pcm_substream *subst= ream, > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0free_irq(psc_dma->playback.irq, &psc_dma->= playback); > =A0 =A0 =A0 =A0} > =A0} > +EXPORT_SYMBOL_GPL(mpc5200_dma_shutdown); > > =A0/* -------------------------------------------------------------------= -- > =A0* The PSC DMA 'ASoC platform' driver > @@ -448,10 +454,10 @@ static void psc_dma_pcm_free(struct snd_pcm *pcm) > =A0 =A0 =A0 =A0} > =A0} > > -struct snd_soc_platform psc_dma_pcm_soc_platform =3D { > +struct snd_soc_platform mpc5200_dma_platform =3D { > =A0 =A0 =A0 =A0.name =A0 =A0 =A0 =A0 =A0 =3D "mpc5200-psc-audio", > =A0 =A0 =A0 =A0.pcm_ops =A0 =A0 =A0 =A0=3D &psc_dma_pcm_ops, > =A0 =A0 =A0 =A0.pcm_new =A0 =A0 =A0 =A0=3D &psc_dma_pcm_new, > =A0 =A0 =A0 =A0.pcm_free =A0 =A0 =A0 =3D &psc_dma_pcm_free, > =A0}; > - > +EXPORT_SYMBOL_GPL(mpc5200_dma_platform); > diff --git a/sound/soc/fsl/mpc5200_dma.h b/sound/soc/fsl/mpc5200_dma.h > index a33232c..e52b90e 100644 > --- a/sound/soc/fsl/mpc5200_dma.h > +++ b/sound/soc/fsl/mpc5200_dma.h > @@ -64,18 +64,18 @@ struct psc_dma { > =A0}; > > > -int psc_dma_startup(struct snd_pcm_substream *substream, > +int mpc5200_dma_startup(struct snd_pcm_substream *substream, > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct snd_soc_dai *d= ai); > > -int psc_dma_hw_free(struct snd_pcm_substream *substream, > +int mpc5200_dma_hw_free(struct snd_pcm_substream *substream, > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct snd_soc_dai *d= ai); > > -void psc_dma_shutdown(struct snd_pcm_substream *substream, > +void mpc5200_dma_shutdown(struct snd_pcm_substream *substream, > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct snd_soc_da= i *dai); > > -int psc_dma_trigger(struct snd_pcm_substream *substream, int cmd, > +int mpc5200_dma_trigger(struct snd_pcm_substream *substream, int cmd, > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct snd_soc_dai *d= ai); > > -extern struct snd_soc_platform psc_dma_pcm_soc_platform; > +extern struct snd_soc_platform mpc5200_dma_platform; > > =A0#endif /* __SOUND_SOC_FSL_MPC5200_DMA_H__ */ > diff --git a/sound/soc/fsl/mpc5200_psc_i2s.c b/sound/soc/fsl/mpc5200_psc_= i2s.c > index 12a7917..a4a439c 100644 > --- a/sound/soc/fsl/mpc5200_psc_i2s.c > +++ b/sound/soc/fsl/mpc5200_psc_i2s.c > @@ -140,11 +140,11 @@ static int psc_i2s_set_fmt(struct snd_soc_dai *cpu_= dai, unsigned int format) > =A0* psc_i2s_dai_template: template CPU Digital Audio Interface > =A0*/ > =A0static struct snd_soc_dai_ops psc_i2s_dai_ops =3D { > - =A0 =A0 =A0 .startup =A0 =A0 =A0 =A0=3D psc_dma_startup, > + =A0 =A0 =A0 .startup =A0 =A0 =A0 =A0=3D mpc5200_dma_startup, > =A0 =A0 =A0 =A0.hw_params =A0 =A0 =A0=3D psc_i2s_hw_params, > - =A0 =A0 =A0 .hw_free =A0 =A0 =A0 =A0=3D psc_dma_hw_free, > - =A0 =A0 =A0 .shutdown =A0 =A0 =A0 =3D psc_dma_shutdown, > - =A0 =A0 =A0 .trigger =A0 =A0 =A0 =A0=3D psc_dma_trigger, > + =A0 =A0 =A0 .hw_free =A0 =A0 =A0 =A0=3D mpc5200_dma_hw_free, > + =A0 =A0 =A0 .shutdown =A0 =A0 =A0 =3D mpc5200_dma_shutdown, > + =A0 =A0 =A0 .trigger =A0 =A0 =A0 =A0=3D mpc5200_dma_trigger, > =A0 =A0 =A0 =A0.set_sysclk =A0 =A0 =3D psc_i2s_set_sysclk, > =A0 =A0 =A0 =A0.set_fmt =A0 =A0 =A0 =A0=3D psc_i2s_set_fmt, > =A0}; > @@ -350,10 +350,10 @@ static int __devinit psc_i2s_of_probe(struct of_dev= ice *op, > =A0 =A0 =A0 =A0if (rc) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0dev_info(psc_dma->dev, "error creating sys= fs files\n"); > > - =A0 =A0 =A0 snd_soc_register_platform(&psc_dma_pcm_soc_platform); > + =A0 =A0 =A0 snd_soc_register_platform(&mpc5200_dma_platform); > > =A0 =A0 =A0 =A0/* Tell the ASoC OF helpers about it */ > - =A0 =A0 =A0 of_snd_soc_register_platform(&psc_dma_pcm_soc_platform, op-= >node, > + =A0 =A0 =A0 of_snd_soc_register_platform(&mpc5200_dma_platform, op->nod= e, > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 &= psc_dma->dai); > > =A0 =A0 =A0 =A0return 0; > @@ -365,7 +365,7 @@ static int __devexit psc_i2s_of_remove(struct of_devi= ce *op) > > =A0 =A0 =A0 =A0dev_dbg(&op->dev, "psc_i2s_remove()\n"); > > - =A0 =A0 =A0 snd_soc_unregister_platform(&psc_dma_pcm_soc_platform); > + =A0 =A0 =A0 snd_soc_unregister_platform(&mpc5200_dma_platform); > > =A0 =A0 =A0 =A0bcom_gen_bd_rx_release(psc_dma->capture.bcom_task); > =A0 =A0 =A0 =A0bcom_gen_bd_tx_release(psc_dma->playback.bcom_task); > > --=20 Grant Likely, B.Sc., P.Eng. Secret Lab Technologies Ltd. ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH V1 3/3] Rename exports in mpc5200_dma.c 2009-04-27 4:08 ` Grant Likely @ 2009-04-27 4:27 ` Jon Smirl 2009-04-27 13:48 ` Grant Likely 0 siblings, 1 reply; 10+ messages in thread From: Jon Smirl @ 2009-04-27 4:27 UTC (permalink / raw) To: Grant Likely; +Cc: linuxppc-dev On Mon, Apr 27, 2009 at 12:08 AM, Grant Likely <grant.likely@secretlab.ca> wrote: > On Sun, Apr 26, 2009 at 1:53 PM, Jon Smirl <jonsmirl@gmail.com> wrote: >> Rename the public DMA exports into the global name space so that the DMA= code can be built as a module. >> >> Signed-off-by: Jon Smirl <jonsmirl@gmail.com> > > Nack. =A0mpc5200_dma is too generic for the global namespace... (in > fact, I should also relook at the previous patch; I might need to nack > my ack). =A0Some variant of 'mpc5200_psc_snd_dma' would be more > appropriate. =A0Even mpc5200_psc_dma is too generic because other > non-sound PSC modes can use DMA also. I'll change it to mpc5200_audio_dma and resend this to the series to the alsa list. Does your stuff still work with these patches? I want to get these mechanical changes in so we can focus on the real changes in my later patches. > > g. > >> --- >> =A0sound/soc/fsl/mpc5200_dma.c =A0 =A0 | =A0 18 ++++++++++++------ >> =A0sound/soc/fsl/mpc5200_dma.h =A0 =A0 | =A0 10 +++++----- >> =A0sound/soc/fsl/mpc5200_psc_i2s.c | =A0 14 +++++++------- >> =A03 files changed, 24 insertions(+), 18 deletions(-) >> >> diff --git a/sound/soc/fsl/mpc5200_dma.c b/sound/soc/fsl/mpc5200_dma.c >> index c82ef75..df73755 100644 >> --- a/sound/soc/fsl/mpc5200_dma.c >> +++ b/sound/soc/fsl/mpc5200_dma.c >> @@ -113,7 +113,7 @@ static irqreturn_t psc_dma_bcom_irq(int irq, void *_= psc_dma_stream) >> =A0* If this is the first stream open, then grab the IRQ and program mos= t of >> =A0* the PSC registers. >> =A0*/ >> -int psc_dma_startup(struct snd_pcm_substream *substream, >> +int mpc5200_dma_startup(struct snd_pcm_substream *substream, >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct snd_soc_dai *= dai) >> =A0{ >> =A0 =A0 =A0 =A0struct snd_soc_pcm_runtime *rtd =3D substream->private_da= ta; >> @@ -145,13 +145,16 @@ int psc_dma_startup(struct snd_pcm_substream *subs= tream, >> >> =A0 =A0 =A0 =A0return 0; >> =A0} >> +EXPORT_SYMBOL_GPL(mpc5200_dma_startup); >> >> -int psc_dma_hw_free(struct snd_pcm_substream *substream, >> +int mpc5200_dma_hw_free(struct snd_pcm_substream *substream, >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct snd_soc_dai *= dai) >> =A0{ >> =A0 =A0 =A0 =A0snd_pcm_set_runtime_buffer(substream, NULL); >> =A0 =A0 =A0 =A0return 0; >> =A0} >> +EXPORT_SYMBOL_GPL(mpc5200_dma_hw_free); >> + >> >> =A0/** >> =A0* psc_dma_trigger: start and stop the DMA transfer. >> @@ -159,7 +162,7 @@ int psc_dma_hw_free(struct snd_pcm_substream *substr= eam, >> =A0* This function is called by ALSA to start, stop, pause, and resume t= he DMA >> =A0* transfer of data. >> =A0*/ >> -int psc_dma_trigger(struct snd_pcm_substream *substream, int cmd, >> +int mpc5200_dma_trigger(struct snd_pcm_substream *substream, int cmd, >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct snd_soc_dai *= dai) >> =A0{ >> =A0 =A0 =A0 =A0struct snd_soc_pcm_runtime *rtd =3D substream->private_da= ta; >> @@ -269,13 +272,15 @@ int psc_dma_trigger(struct snd_pcm_substream *subs= tream, int cmd, >> >> =A0 =A0 =A0 =A0return 0; >> =A0} >> +EXPORT_SYMBOL_GPL(mpc5200_dma_trigger); >> + >> >> =A0/** >> =A0* psc_dma_shutdown: shutdown the data transfer on a stream >> =A0* >> =A0* Shutdown the PSC if there are no other substreams open. >> =A0*/ >> -void psc_dma_shutdown(struct snd_pcm_substream *substream, >> +void mpc5200_dma_shutdown(struct snd_pcm_substream *substream, >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct snd_soc_d= ai *dai) >> =A0{ >> =A0 =A0 =A0 =A0struct snd_soc_pcm_runtime *rtd =3D substream->private_da= ta; >> @@ -303,6 +308,7 @@ void psc_dma_shutdown(struct snd_pcm_substream *subs= tream, >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0free_irq(psc_dma->playback.irq, &psc_dma-= >playback); >> =A0 =A0 =A0 =A0} >> =A0} >> +EXPORT_SYMBOL_GPL(mpc5200_dma_shutdown); >> >> =A0/* ------------------------------------------------------------------= --- >> =A0* The PSC DMA 'ASoC platform' driver >> @@ -448,10 +454,10 @@ static void psc_dma_pcm_free(struct snd_pcm *pcm) >> =A0 =A0 =A0 =A0} >> =A0} >> >> -struct snd_soc_platform psc_dma_pcm_soc_platform =3D { >> +struct snd_soc_platform mpc5200_dma_platform =3D { >> =A0 =A0 =A0 =A0.name =A0 =A0 =A0 =A0 =A0 =3D "mpc5200-psc-audio", >> =A0 =A0 =A0 =A0.pcm_ops =A0 =A0 =A0 =A0=3D &psc_dma_pcm_ops, >> =A0 =A0 =A0 =A0.pcm_new =A0 =A0 =A0 =A0=3D &psc_dma_pcm_new, >> =A0 =A0 =A0 =A0.pcm_free =A0 =A0 =A0 =3D &psc_dma_pcm_free, >> =A0}; >> - >> +EXPORT_SYMBOL_GPL(mpc5200_dma_platform); >> diff --git a/sound/soc/fsl/mpc5200_dma.h b/sound/soc/fsl/mpc5200_dma.h >> index a33232c..e52b90e 100644 >> --- a/sound/soc/fsl/mpc5200_dma.h >> +++ b/sound/soc/fsl/mpc5200_dma.h >> @@ -64,18 +64,18 @@ struct psc_dma { >> =A0}; >> >> >> -int psc_dma_startup(struct snd_pcm_substream *substream, >> +int mpc5200_dma_startup(struct snd_pcm_substream *substream, >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct snd_soc_dai *= dai); >> >> -int psc_dma_hw_free(struct snd_pcm_substream *substream, >> +int mpc5200_dma_hw_free(struct snd_pcm_substream *substream, >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct snd_soc_dai *= dai); >> >> -void psc_dma_shutdown(struct snd_pcm_substream *substream, >> +void mpc5200_dma_shutdown(struct snd_pcm_substream *substream, >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct snd_soc_d= ai *dai); >> >> -int psc_dma_trigger(struct snd_pcm_substream *substream, int cmd, >> +int mpc5200_dma_trigger(struct snd_pcm_substream *substream, int cmd, >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct snd_soc_dai *= dai); >> >> -extern struct snd_soc_platform psc_dma_pcm_soc_platform; >> +extern struct snd_soc_platform mpc5200_dma_platform; >> >> =A0#endif /* __SOUND_SOC_FSL_MPC5200_DMA_H__ */ >> diff --git a/sound/soc/fsl/mpc5200_psc_i2s.c b/sound/soc/fsl/mpc5200_psc= _i2s.c >> index 12a7917..a4a439c 100644 >> --- a/sound/soc/fsl/mpc5200_psc_i2s.c >> +++ b/sound/soc/fsl/mpc5200_psc_i2s.c >> @@ -140,11 +140,11 @@ static int psc_i2s_set_fmt(struct snd_soc_dai *cpu= _dai, unsigned int format) >> =A0* psc_i2s_dai_template: template CPU Digital Audio Interface >> =A0*/ >> =A0static struct snd_soc_dai_ops psc_i2s_dai_ops =3D { >> - =A0 =A0 =A0 .startup =A0 =A0 =A0 =A0=3D psc_dma_startup, >> + =A0 =A0 =A0 .startup =A0 =A0 =A0 =A0=3D mpc5200_dma_startup, >> =A0 =A0 =A0 =A0.hw_params =A0 =A0 =A0=3D psc_i2s_hw_params, >> - =A0 =A0 =A0 .hw_free =A0 =A0 =A0 =A0=3D psc_dma_hw_free, >> - =A0 =A0 =A0 .shutdown =A0 =A0 =A0 =3D psc_dma_shutdown, >> - =A0 =A0 =A0 .trigger =A0 =A0 =A0 =A0=3D psc_dma_trigger, >> + =A0 =A0 =A0 .hw_free =A0 =A0 =A0 =A0=3D mpc5200_dma_hw_free, >> + =A0 =A0 =A0 .shutdown =A0 =A0 =A0 =3D mpc5200_dma_shutdown, >> + =A0 =A0 =A0 .trigger =A0 =A0 =A0 =A0=3D mpc5200_dma_trigger, >> =A0 =A0 =A0 =A0.set_sysclk =A0 =A0 =3D psc_i2s_set_sysclk, >> =A0 =A0 =A0 =A0.set_fmt =A0 =A0 =A0 =A0=3D psc_i2s_set_fmt, >> =A0}; >> @@ -350,10 +350,10 @@ static int __devinit psc_i2s_of_probe(struct of_de= vice *op, >> =A0 =A0 =A0 =A0if (rc) >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0dev_info(psc_dma->dev, "error creating sy= sfs files\n"); >> >> - =A0 =A0 =A0 snd_soc_register_platform(&psc_dma_pcm_soc_platform); >> + =A0 =A0 =A0 snd_soc_register_platform(&mpc5200_dma_platform); >> >> =A0 =A0 =A0 =A0/* Tell the ASoC OF helpers about it */ >> - =A0 =A0 =A0 of_snd_soc_register_platform(&psc_dma_pcm_soc_platform, op= ->node, >> + =A0 =A0 =A0 of_snd_soc_register_platform(&mpc5200_dma_platform, op->no= de, >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = &psc_dma->dai); >> >> =A0 =A0 =A0 =A0return 0; >> @@ -365,7 +365,7 @@ static int __devexit psc_i2s_of_remove(struct of_dev= ice *op) >> >> =A0 =A0 =A0 =A0dev_dbg(&op->dev, "psc_i2s_remove()\n"); >> >> - =A0 =A0 =A0 snd_soc_unregister_platform(&psc_dma_pcm_soc_platform); >> + =A0 =A0 =A0 snd_soc_unregister_platform(&mpc5200_dma_platform); >> >> =A0 =A0 =A0 =A0bcom_gen_bd_rx_release(psc_dma->capture.bcom_task); >> =A0 =A0 =A0 =A0bcom_gen_bd_tx_release(psc_dma->playback.bcom_task); >> >> > > > > -- > Grant Likely, B.Sc., P.Eng. > Secret Lab Technologies Ltd. > --=20 Jon Smirl jonsmirl@gmail.com ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH V1 3/3] Rename exports in mpc5200_dma.c 2009-04-27 4:27 ` Jon Smirl @ 2009-04-27 13:48 ` Grant Likely 0 siblings, 0 replies; 10+ messages in thread From: Grant Likely @ 2009-04-27 13:48 UTC (permalink / raw) To: Jon Smirl; +Cc: linuxppc-dev On Sun, Apr 26, 2009 at 10:27 PM, Jon Smirl <jonsmirl@gmail.com> wrote: > On Mon, Apr 27, 2009 at 12:08 AM, Grant Likely > <grant.likely@secretlab.ca> wrote: >> On Sun, Apr 26, 2009 at 1:53 PM, Jon Smirl <jonsmirl@gmail.com> wrote: >>> Rename the public DMA exports into the global name space so that the DM= A code can be built as a module. >>> >>> Signed-off-by: Jon Smirl <jonsmirl@gmail.com> >> >> Nack. =A0mpc5200_dma is too generic for the global namespace... (in >> fact, I should also relook at the previous patch; I might need to nack >> my ack). =A0Some variant of 'mpc5200_psc_snd_dma' would be more >> appropriate. =A0Even mpc5200_psc_dma is too generic because other >> non-sound PSC modes can use DMA also. > > I'll change it to mpc5200_audio_dma and resend this to the series to > the alsa list. > > Does your stuff still work with these patches? I want to get these > mechanical changes in so we can focus on the real changes in my later > patches. The project changed and I haven't fired up my target in quite a long time. = :-( g. > >> >> g. >> >>> --- >>> =A0sound/soc/fsl/mpc5200_dma.c =A0 =A0 | =A0 18 ++++++++++++------ >>> =A0sound/soc/fsl/mpc5200_dma.h =A0 =A0 | =A0 10 +++++----- >>> =A0sound/soc/fsl/mpc5200_psc_i2s.c | =A0 14 +++++++------- >>> =A03 files changed, 24 insertions(+), 18 deletions(-) >>> >>> diff --git a/sound/soc/fsl/mpc5200_dma.c b/sound/soc/fsl/mpc5200_dma.c >>> index c82ef75..df73755 100644 >>> --- a/sound/soc/fsl/mpc5200_dma.c >>> +++ b/sound/soc/fsl/mpc5200_dma.c >>> @@ -113,7 +113,7 @@ static irqreturn_t psc_dma_bcom_irq(int irq, void *= _psc_dma_stream) >>> =A0* If this is the first stream open, then grab the IRQ and program mo= st of >>> =A0* the PSC registers. >>> =A0*/ >>> -int psc_dma_startup(struct snd_pcm_substream *substream, >>> +int mpc5200_dma_startup(struct snd_pcm_substream *substream, >>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct snd_soc_dai = *dai) >>> =A0{ >>> =A0 =A0 =A0 =A0struct snd_soc_pcm_runtime *rtd =3D substream->private_d= ata; >>> @@ -145,13 +145,16 @@ int psc_dma_startup(struct snd_pcm_substream *sub= stream, >>> >>> =A0 =A0 =A0 =A0return 0; >>> =A0} >>> +EXPORT_SYMBOL_GPL(mpc5200_dma_startup); >>> >>> -int psc_dma_hw_free(struct snd_pcm_substream *substream, >>> +int mpc5200_dma_hw_free(struct snd_pcm_substream *substream, >>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct snd_soc_dai = *dai) >>> =A0{ >>> =A0 =A0 =A0 =A0snd_pcm_set_runtime_buffer(substream, NULL); >>> =A0 =A0 =A0 =A0return 0; >>> =A0} >>> +EXPORT_SYMBOL_GPL(mpc5200_dma_hw_free); >>> + >>> >>> =A0/** >>> =A0* psc_dma_trigger: start and stop the DMA transfer. >>> @@ -159,7 +162,7 @@ int psc_dma_hw_free(struct snd_pcm_substream *subst= ream, >>> =A0* This function is called by ALSA to start, stop, pause, and resume = the DMA >>> =A0* transfer of data. >>> =A0*/ >>> -int psc_dma_trigger(struct snd_pcm_substream *substream, int cmd, >>> +int mpc5200_dma_trigger(struct snd_pcm_substream *substream, int cmd, >>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct snd_soc_dai = *dai) >>> =A0{ >>> =A0 =A0 =A0 =A0struct snd_soc_pcm_runtime *rtd =3D substream->private_d= ata; >>> @@ -269,13 +272,15 @@ int psc_dma_trigger(struct snd_pcm_substream *sub= stream, int cmd, >>> >>> =A0 =A0 =A0 =A0return 0; >>> =A0} >>> +EXPORT_SYMBOL_GPL(mpc5200_dma_trigger); >>> + >>> >>> =A0/** >>> =A0* psc_dma_shutdown: shutdown the data transfer on a stream >>> =A0* >>> =A0* Shutdown the PSC if there are no other substreams open. >>> =A0*/ >>> -void psc_dma_shutdown(struct snd_pcm_substream *substream, >>> +void mpc5200_dma_shutdown(struct snd_pcm_substream *substream, >>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct snd_soc_= dai *dai) >>> =A0{ >>> =A0 =A0 =A0 =A0struct snd_soc_pcm_runtime *rtd =3D substream->private_d= ata; >>> @@ -303,6 +308,7 @@ void psc_dma_shutdown(struct snd_pcm_substream *sub= stream, >>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0free_irq(psc_dma->playback.irq, &psc_dma= ->playback); >>> =A0 =A0 =A0 =A0} >>> =A0} >>> +EXPORT_SYMBOL_GPL(mpc5200_dma_shutdown); >>> >>> =A0/* -----------------------------------------------------------------= ---- >>> =A0* The PSC DMA 'ASoC platform' driver >>> @@ -448,10 +454,10 @@ static void psc_dma_pcm_free(struct snd_pcm *pcm) >>> =A0 =A0 =A0 =A0} >>> =A0} >>> >>> -struct snd_soc_platform psc_dma_pcm_soc_platform =3D { >>> +struct snd_soc_platform mpc5200_dma_platform =3D { >>> =A0 =A0 =A0 =A0.name =A0 =A0 =A0 =A0 =A0 =3D "mpc5200-psc-audio", >>> =A0 =A0 =A0 =A0.pcm_ops =A0 =A0 =A0 =A0=3D &psc_dma_pcm_ops, >>> =A0 =A0 =A0 =A0.pcm_new =A0 =A0 =A0 =A0=3D &psc_dma_pcm_new, >>> =A0 =A0 =A0 =A0.pcm_free =A0 =A0 =A0 =3D &psc_dma_pcm_free, >>> =A0}; >>> - >>> +EXPORT_SYMBOL_GPL(mpc5200_dma_platform); >>> diff --git a/sound/soc/fsl/mpc5200_dma.h b/sound/soc/fsl/mpc5200_dma.h >>> index a33232c..e52b90e 100644 >>> --- a/sound/soc/fsl/mpc5200_dma.h >>> +++ b/sound/soc/fsl/mpc5200_dma.h >>> @@ -64,18 +64,18 @@ struct psc_dma { >>> =A0}; >>> >>> >>> -int psc_dma_startup(struct snd_pcm_substream *substream, >>> +int mpc5200_dma_startup(struct snd_pcm_substream *substream, >>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct snd_soc_dai = *dai); >>> >>> -int psc_dma_hw_free(struct snd_pcm_substream *substream, >>> +int mpc5200_dma_hw_free(struct snd_pcm_substream *substream, >>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct snd_soc_dai = *dai); >>> >>> -void psc_dma_shutdown(struct snd_pcm_substream *substream, >>> +void mpc5200_dma_shutdown(struct snd_pcm_substream *substream, >>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct snd_soc_= dai *dai); >>> >>> -int psc_dma_trigger(struct snd_pcm_substream *substream, int cmd, >>> +int mpc5200_dma_trigger(struct snd_pcm_substream *substream, int cmd, >>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct snd_soc_dai = *dai); >>> >>> -extern struct snd_soc_platform psc_dma_pcm_soc_platform; >>> +extern struct snd_soc_platform mpc5200_dma_platform; >>> >>> =A0#endif /* __SOUND_SOC_FSL_MPC5200_DMA_H__ */ >>> diff --git a/sound/soc/fsl/mpc5200_psc_i2s.c b/sound/soc/fsl/mpc5200_ps= c_i2s.c >>> index 12a7917..a4a439c 100644 >>> --- a/sound/soc/fsl/mpc5200_psc_i2s.c >>> +++ b/sound/soc/fsl/mpc5200_psc_i2s.c >>> @@ -140,11 +140,11 @@ static int psc_i2s_set_fmt(struct snd_soc_dai *cp= u_dai, unsigned int format) >>> =A0* psc_i2s_dai_template: template CPU Digital Audio Interface >>> =A0*/ >>> =A0static struct snd_soc_dai_ops psc_i2s_dai_ops =3D { >>> - =A0 =A0 =A0 .startup =A0 =A0 =A0 =A0=3D psc_dma_startup, >>> + =A0 =A0 =A0 .startup =A0 =A0 =A0 =A0=3D mpc5200_dma_startup, >>> =A0 =A0 =A0 =A0.hw_params =A0 =A0 =A0=3D psc_i2s_hw_params, >>> - =A0 =A0 =A0 .hw_free =A0 =A0 =A0 =A0=3D psc_dma_hw_free, >>> - =A0 =A0 =A0 .shutdown =A0 =A0 =A0 =3D psc_dma_shutdown, >>> - =A0 =A0 =A0 .trigger =A0 =A0 =A0 =A0=3D psc_dma_trigger, >>> + =A0 =A0 =A0 .hw_free =A0 =A0 =A0 =A0=3D mpc5200_dma_hw_free, >>> + =A0 =A0 =A0 .shutdown =A0 =A0 =A0 =3D mpc5200_dma_shutdown, >>> + =A0 =A0 =A0 .trigger =A0 =A0 =A0 =A0=3D mpc5200_dma_trigger, >>> =A0 =A0 =A0 =A0.set_sysclk =A0 =A0 =3D psc_i2s_set_sysclk, >>> =A0 =A0 =A0 =A0.set_fmt =A0 =A0 =A0 =A0=3D psc_i2s_set_fmt, >>> =A0}; >>> @@ -350,10 +350,10 @@ static int __devinit psc_i2s_of_probe(struct of_d= evice *op, >>> =A0 =A0 =A0 =A0if (rc) >>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0dev_info(psc_dma->dev, "error creating s= ysfs files\n"); >>> >>> - =A0 =A0 =A0 snd_soc_register_platform(&psc_dma_pcm_soc_platform); >>> + =A0 =A0 =A0 snd_soc_register_platform(&mpc5200_dma_platform); >>> >>> =A0 =A0 =A0 =A0/* Tell the ASoC OF helpers about it */ >>> - =A0 =A0 =A0 of_snd_soc_register_platform(&psc_dma_pcm_soc_platform, o= p->node, >>> + =A0 =A0 =A0 of_snd_soc_register_platform(&mpc5200_dma_platform, op->n= ode, >>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= &psc_dma->dai); >>> >>> =A0 =A0 =A0 =A0return 0; >>> @@ -365,7 +365,7 @@ static int __devexit psc_i2s_of_remove(struct of_de= vice *op) >>> >>> =A0 =A0 =A0 =A0dev_dbg(&op->dev, "psc_i2s_remove()\n"); >>> >>> - =A0 =A0 =A0 snd_soc_unregister_platform(&psc_dma_pcm_soc_platform); >>> + =A0 =A0 =A0 snd_soc_unregister_platform(&mpc5200_dma_platform); >>> >>> =A0 =A0 =A0 =A0bcom_gen_bd_rx_release(psc_dma->capture.bcom_task); >>> =A0 =A0 =A0 =A0bcom_gen_bd_tx_release(psc_dma->playback.bcom_task); >>> >>> >> >> >> >> -- >> Grant Likely, B.Sc., P.Eng. >> Secret Lab Technologies Ltd. >> > > > > -- > Jon Smirl > jonsmirl@gmail.com > --=20 Grant Likely, B.Sc., P.Eng. Secret Lab Technologies Ltd. ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2009-04-27 13:48 UTC | newest] Thread overview: 10+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2009-04-26 19:53 [PATCH V1 0/3] Split the DMA core out from mpc5200_psc_i2s.c Jon Smirl 2009-04-26 19:53 ` [PATCH V1 1/3] Basic split of mpc5200 DMA code out from mpc5200_psc_i2s Jon Smirl 2009-04-27 4:04 ` Grant Likely 2009-04-26 19:53 ` [PATCH V1 2/3] Rename the PSC functions to DMA Jon Smirl 2009-04-27 4:04 ` Grant Likely 2009-04-27 4:33 ` Grant Likely 2009-04-26 19:53 ` [PATCH V1 3/3] Rename exports in mpc5200_dma.c Jon Smirl 2009-04-27 4:08 ` Grant Likely 2009-04-27 4:27 ` Jon Smirl 2009-04-27 13:48 ` Grant Likely
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).