[alsa-devel] [PATCH v5 4/4] ASoC: SAMSUNG: Add I2S0 internal dma driver

Takashi Iwai tiwai at suse.de
Wed Jul 13 07:54:13 CEST 2011


At Wed, 13 Jul 2011 11:11:44 +0530,
Jassi Brar wrote:
> 
> On Wed, Jul 13, 2011 at 8:38 AM, Seungwhan Youn <claude.youn at gmail.com> wrote:
> > Hi,
> >
> > On Wed, Jul 13, 2011 at 10:25 AM, Sangbeom Kim <sbkim73 at samsung.com> wrote:
> >> I2S in Exynos4 and S5PC110(S5PV210) has a internal dma.
> >> It can be used low power audio mode and 2nd channel transfer.
> >> This patch can support idma.
> >>
> >> Signed-off-by: Sangbeom Kim <sbkim73 at samsung.com>
> >> ---
> >> V2: change idma_new by new pcm_new api
> >>    add handling different idma address
> >>    as jassi comments, Modify the idma driver
> >>
> >> V3: merge idma_reg_int and idma_addr_init
> >>
> >> V4: move idma setting in i2s.c to idma_hw_params in idma.c
> >>    move idma_reg_addr_init calling
> >>    modify idma address handling error
> >>    modify module information
> >>    delete useless dev_dbg
> >>
> >> V5: delete redundant error print and check routine
> >>    modify irq handler as jassi comment
> >>    fix the indent error
> >>
> >>  sound/soc/samsung/Makefile |    2 +
> >>  sound/soc/samsung/idma.c   |  453 ++++++++++++++++++++++++++++++++++++++++++++
> >>  sound/soc/samsung/idma.h   |   26 +++
> >>  3 files changed, 481 insertions(+), 0 deletions(-)
> >>  create mode 100644 sound/soc/samsung/idma.c
> >>  create mode 100644 sound/soc/samsung/idma.h
> >>
> >> diff --git a/sound/soc/samsung/Makefile b/sound/soc/samsung/Makefile
> >> index 00ba557..41becdd 100644
> >> --- a/sound/soc/samsung/Makefile
> >> +++ b/sound/soc/samsung/Makefile
> >> @@ -1,5 +1,6 @@
> >>  # S3c24XX Platform Support
> >>  snd-soc-s3c24xx-objs := dma.o
> >> +snd-soc-idma-objs := idma.o
> >>  snd-soc-s3c24xx-i2s-objs := s3c24xx-i2s.o
> >>  snd-soc-s3c2412-i2s-objs := s3c2412-i2s.o
> >>  snd-soc-ac97-objs := ac97.o
> >> @@ -16,6 +17,7 @@ obj-$(CONFIG_SND_S3C_I2SV2_SOC) += snd-soc-s3c-i2s-v2.o
> >>  obj-$(CONFIG_SND_SAMSUNG_SPDIF) += snd-soc-samsung-spdif.o
> >>  obj-$(CONFIG_SND_SAMSUNG_PCM) += snd-soc-pcm.o
> >>  obj-$(CONFIG_SND_SAMSUNG_I2S) += snd-soc-i2s.o
> >> +obj-$(CONFIG_SND_SAMSUNG_I2S) += snd-soc-idma.o
> >>
> >>  # S3C24XX Machine Support
> >>  snd-soc-jive-wm8750-objs := jive_wm8750.o
> >> diff --git a/sound/soc/samsung/idma.c b/sound/soc/samsung/idma.c
> >> new file mode 100644
> >> index 0000000..ebde074
> >> --- /dev/null
> >> +++ b/sound/soc/samsung/idma.c
> >> @@ -0,0 +1,453 @@
> >> +/*
> >> + * sound/soc/samsung/idma.c
> >> + *
> >> + * Copyright (c) 2011 Samsung Electronics Co., Ltd.
> >> + *             http://www.samsung.com
> >> + *
> >> + * I2S0's Internal DMA driver
> >> + *
> >> + * This program is free software; you can redistribute  it and/or modify it
> >> + * under  the terms of  the GNU General  Public License as published by the
> >> + * Free Software Foundation;  either version 2 of the  License, or (at your
> >> + * option) any later version.
> >> + */
> >> +#include <linux/interrupt.h>
> >> +#include <linux/platform_device.h>
> >> +#include <linux/dma-mapping.h>
> >> +#include <linux/slab.h>
> >> +#include <sound/pcm.h>
> >> +#include <sound/pcm_params.h>
> >> +#include <sound/soc.h>
> >> +
> >> +#include "i2s.h"
> >> +#include "idma.h"
> >> +#include "dma.h"
> >> +#include "i2s-regs.h"
> >> +
> >> +#define ST_RUNNING             (1<<0)
> >> +#define ST_OPENED              (1<<1)
> >> +
> >> +static const struct snd_pcm_hardware idma_hardware = {
> >> +       .info = SNDRV_PCM_INFO_INTERLEAVED |
> >> +                   SNDRV_PCM_INFO_BLOCK_TRANSFER |
> >> +                   SNDRV_PCM_INFO_MMAP |
> >> +                   SNDRV_PCM_INFO_MMAP_VALID |
> >> +                   SNDRV_PCM_INFO_PAUSE |
> >> +                   SNDRV_PCM_INFO_RESUME,
> >> +       .formats = SNDRV_PCM_FMTBIT_S16_LE |
> >> +                   SNDRV_PCM_FMTBIT_U16_LE |
> >> +                   SNDRV_PCM_FMTBIT_S24_LE |
> >> +                   SNDRV_PCM_FMTBIT_U24_LE |
> >> +                   SNDRV_PCM_FMTBIT_U8 |
> >> +                   SNDRV_PCM_FMTBIT_S8,
> >> +       .channels_min = 2,
> >> +       .channels_max = 2,
> >> +       .buffer_bytes_max = MAX_IDMA_BUFFER,
> >> +       .period_bytes_min = 128,
> >> +       .period_bytes_max = MAX_IDMA_PERIOD,
> >
> > In this case, MAX_IDMA_BUFFER is 160k and MAX_IDMA_PERIOD is 128k,
> > buffer is not twice of period. If you set like this, many of general
> > ALSA applications return error on initial buffers.
> I don't think so. Did you see any such problem ?
> In my opnion, ALSA will always use 2 periods of approx. MAX_IDMA_BUFFER/2 bytes

It's not guaranteed unless you set explicitly a hw_constraint, such as
    snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS);

The ALSA API itself allows a buffer size not aligned to a period size.


Takashi


More information about the Alsa-devel mailing list