linux/sound/soc/atmel/atmel-pcm.h
<<
>>
Prefs
   1/*
   2 * at91-pcm.h - ALSA PCM interface for the Atmel AT91 SoC.
   3 *
   4 *  Copyright (C) 2005 SAN People
   5 *  Copyright (C) 2008 Atmel
   6 *
   7 * Authors: Sedji Gaouaou <sedji.gaouaou@atmel.com>
   8 *
   9 * Based on at91-pcm. by:
  10 * Frank Mandarino <fmandarino@endrelia.com>
  11 * Copyright 2006 Endrelia Technologies Inc.
  12 *
  13 * Based on pxa2xx-pcm.c by:
  14 *
  15 * Author:      Nicolas Pitre
  16 * Created:     Nov 30, 2004
  17 * Copyright:   (C) 2004 MontaVista Software, Inc.
  18 *
  19 * This program is free software; you can redistribute it and/or modify
  20 * it under the terms of the GNU General Public License as published by
  21 * the Free Software Foundation; either version 2 of the License, or
  22 * (at your option) any later version.
  23 *
  24 * This program is distributed in the hope that it will be useful,
  25 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  26 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  27 * GNU General Public License for more details.
  28 *
  29 * You should have received a copy of the GNU General Public License
  30 * along with this program; if not, write to the Free Software
  31 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  32 */
  33
  34#ifndef _ATMEL_PCM_H
  35#define _ATMEL_PCM_H
  36
  37#include <linux/atmel-ssc.h>
  38
  39#define ATMEL_SSC_DMABUF_SIZE   (64 * 1024)
  40
  41/*
  42 * Registers and status bits that are required by the PCM driver.
  43 */
  44struct atmel_pdc_regs {
  45        unsigned int    xpr;            /* PDC recv/trans pointer */
  46        unsigned int    xcr;            /* PDC recv/trans counter */
  47        unsigned int    xnpr;           /* PDC next recv/trans pointer */
  48        unsigned int    xncr;           /* PDC next recv/trans counter */
  49        unsigned int    ptcr;           /* PDC transfer control */
  50};
  51
  52struct atmel_ssc_mask {
  53        u32     ssc_enable;             /* SSC recv/trans enable */
  54        u32     ssc_disable;            /* SSC recv/trans disable */
  55        u32     ssc_error;              /* SSC error conditions */
  56        u32     ssc_endx;               /* SSC ENDTX or ENDRX */
  57        u32     ssc_endbuf;             /* SSC TXBUFE or RXBUFF */
  58        u32     pdc_enable;             /* PDC recv/trans enable */
  59        u32     pdc_disable;            /* PDC recv/trans disable */
  60};
  61
  62/*
  63 * This structure, shared between the PCM driver and the interface,
  64 * contains all information required by the PCM driver to perform the
  65 * PDC DMA operation.  All fields except dma_intr_handler() are initialized
  66 * by the interface.  The dma_intr_handler() pointer is set by the PCM
  67 * driver and called by the interface SSC interrupt handler if it is
  68 * non-NULL.
  69 */
  70struct atmel_pcm_dma_params {
  71        char *name;                     /* stream identifier */
  72        int pdc_xfer_size;              /* PDC counter increment in bytes */
  73        struct ssc_device *ssc;         /* SSC device for stream */
  74        struct atmel_pdc_regs *pdc;     /* PDC receive or transmit registers */
  75        struct atmel_ssc_mask *mask;    /* SSC & PDC status bits */
  76        struct snd_pcm_substream *substream;
  77        void (*dma_intr_handler)(u32, struct snd_pcm_substream *);
  78};
  79
  80/*
  81 * SSC register access (since ssc_writel() / ssc_readl() require literal name)
  82 */
  83#define ssc_readx(base, reg)            (__raw_readl((base) + (reg)))
  84#define ssc_writex(base, reg, value)    __raw_writel((value), (base) + (reg))
  85
  86#if defined(CONFIG_SND_ATMEL_SOC_PDC) || \
  87        defined(CONFIG_SND_ATMEL_SOC_PDC_MODULE)
  88int atmel_pcm_pdc_platform_register(struct device *dev);
  89void atmel_pcm_pdc_platform_unregister(struct device *dev);
  90#else
  91static inline int atmel_pcm_pdc_platform_register(struct device *dev)
  92{
  93        return 0;
  94}
  95static inline void atmel_pcm_pdc_platform_unregister(struct device *dev)
  96{
  97}
  98#endif
  99
 100#if defined(CONFIG_SND_ATMEL_SOC_DMA) || \
 101        defined(CONFIG_SND_ATMEL_SOC_DMA_MODULE)
 102int atmel_pcm_dma_platform_register(struct device *dev);
 103void atmel_pcm_dma_platform_unregister(struct device *dev);
 104#else
 105static inline int atmel_pcm_dma_platform_register(struct device *dev)
 106{
 107        return 0;
 108}
 109static inline void atmel_pcm_dma_platform_unregister(struct device *dev)
 110{
 111}
 112#endif
 113
 114#endif /* _ATMEL_PCM_H */
 115