Blame view

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