1/*
2 * at91-pcm.h - ALSA PCM interface for the Atmel AT91 SoC
3 *
4 * Author:	Frank Mandarino <fmandarino@endrelia.com>
5 *		Endrelia Technologies Inc.
6 * Created:	Mar 3, 2006
7 *
8 * Based on pxa2xx-pcm.h by:
9 *
10 * Author:	Nicolas Pitre
11 * Created:	Nov 30, 2004
12 * Copyright:	MontaVista Software, Inc.
13 *
14 * This program is free software; you can redistribute it and/or modify
15 * it under the terms of the GNU General Public License version 2 as
16 * published by the Free Software Foundation.
17 */
18
19#ifndef _AT91_PCM_H
20#define _AT91_PCM_H
21
22#include <asm/arch/hardware.h>
23
24struct at91_ssc_periph {
25	void __iomem	*base;
26	u32		pid;
27};
28
29/*
30 * Registers and status bits that are required by the PCM driver.
31 */
32struct at91_pdc_regs {
33	unsigned int	xpr;		/* PDC recv/trans pointer */
34	unsigned int	xcr;		/* PDC recv/trans counter */
35	unsigned int	xnpr;		/* PDC next recv/trans pointer */
36	unsigned int	xncr;		/* PDC next recv/trans counter */
37	unsigned int	ptcr;		/* PDC transfer control */
38};
39
40struct at91_ssc_mask {
41	u32	ssc_enable;		/* SSC recv/trans enable */
42	u32	ssc_disable;		/* SSC recv/trans disable */
43	u32	ssc_endx;		/* SSC ENDTX or ENDRX */
44	u32	ssc_endbuf;		/* SSC TXBUFE or RXBUFF */
45	u32	pdc_enable;		/* PDC recv/trans enable */
46	u32	pdc_disable;		/* PDC recv/trans disable */
47};
48
49/*
50 * This structure, shared between the PCM driver and the interface,
51 * contains all information required by the PCM driver to perform the
52 * PDC DMA operation.  All fields except dma_intr_handler() are initialized
53 * by the interface.  The dms_intr_handler() pointer is set by the PCM
54 * driver and called by the interface SSC interrupt handler if it is
55 * non-NULL.
56 */
57struct at91_pcm_dma_params {
58	char *name;			/* stream identifier */
59	int pdc_xfer_size;		/* PDC counter increment in bytes */
60	void __iomem *ssc_base;		/* SSC base address */
61	struct at91_pdc_regs *pdc; /* PDC receive or transmit registers */
62	struct at91_ssc_mask *mask;/* SSC & PDC status bits */
63	struct snd_pcm_substream *substream;
64	void (*dma_intr_handler)(u32, struct snd_pcm_substream *);
65};
66
67extern struct snd_soc_platform at91_soc_platform;
68
69#define at91_ssc_read(a)	((unsigned long) __raw_readl(a))
70#define at91_ssc_write(a,v)	__raw_writel((v),(a))
71
72#endif /* _AT91_PCM_H */
73