]>
Commit | Line | Data |
---|---|---|
1a59d1b8 | 1 | /* SPDX-License-Identifier: GPL-2.0-or-later */ |
6c742509 SG |
2 | /* |
3 | * at91-pcm.h - ALSA PCM interface for the Atmel AT91 SoC. | |
4 | * | |
5 | * Copyright (C) 2005 SAN People | |
6 | * Copyright (C) 2008 Atmel | |
7 | * | |
8 | * Authors: Sedji Gaouaou <sedji.gaouaou@atmel.com> | |
9 | * | |
10 | * Based on at91-pcm. by: | |
11 | * Frank Mandarino <fmandarino@endrelia.com> | |
12 | * Copyright 2006 Endrelia Technologies Inc. | |
13 | * | |
14 | * Based on pxa2xx-pcm.c by: | |
15 | * | |
16 | * Author: Nicolas Pitre | |
17 | * Created: Nov 30, 2004 | |
18 | * Copyright: (C) 2004 MontaVista Software, Inc. | |
6c742509 SG |
19 | */ |
20 | ||
21 | #ifndef _ATMEL_PCM_H | |
22 | #define _ATMEL_PCM_H | |
23 | ||
24 | #include <linux/atmel-ssc.h> | |
25 | ||
92dfa619 BS |
26 | #define ATMEL_SSC_DMABUF_SIZE (64 * 1024) |
27 | ||
6c742509 SG |
28 | /* |
29 | * Registers and status bits that are required by the PCM driver. | |
30 | */ | |
31 | struct atmel_pdc_regs { | |
32 | unsigned int xpr; /* PDC recv/trans pointer */ | |
33 | unsigned int xcr; /* PDC recv/trans counter */ | |
34 | unsigned int xnpr; /* PDC next recv/trans pointer */ | |
35 | unsigned int xncr; /* PDC next recv/trans counter */ | |
36 | unsigned int ptcr; /* PDC transfer control */ | |
37 | }; | |
38 | ||
39 | struct atmel_ssc_mask { | |
40 | u32 ssc_enable; /* SSC recv/trans enable */ | |
41 | u32 ssc_disable; /* SSC recv/trans disable */ | |
3951e4aa | 42 | u32 ssc_error; /* SSC error conditions */ |
6c742509 SG |
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 | |
97b4fc3c | 53 | * by the interface. The dma_intr_handler() pointer is set by the PCM |
6c742509 SG |
54 | * driver and called by the interface SSC interrupt handler if it is |
55 | * non-NULL. | |
56 | */ | |
57 | struct atmel_pcm_dma_params { | |
58 | char *name; /* stream identifier */ | |
59 | int pdc_xfer_size; /* PDC counter increment in bytes */ | |
60 | struct ssc_device *ssc; /* SSC device for stream */ | |
61 | struct atmel_pdc_regs *pdc; /* PDC receive or transmit registers */ | |
62 | struct atmel_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 | ||
6c742509 SG |
67 | /* |
68 | * SSC register access (since ssc_writel() / ssc_readl() require literal name) | |
69 | */ | |
70 | #define ssc_readx(base, reg) (__raw_readl((base) + (reg))) | |
71 | #define ssc_writex(base, reg, value) __raw_writel((value), (base) + (reg)) | |
72 | ||
cd187753 | 73 | #if IS_ENABLED(CONFIG_SND_ATMEL_SOC_PDC) |
92dfa619 BS |
74 | int atmel_pcm_pdc_platform_register(struct device *dev); |
75 | void atmel_pcm_pdc_platform_unregister(struct device *dev); | |
76 | #else | |
77 | static inline int atmel_pcm_pdc_platform_register(struct device *dev) | |
78 | { | |
79 | return 0; | |
80 | } | |
81 | static inline void atmel_pcm_pdc_platform_unregister(struct device *dev) | |
82 | { | |
83 | } | |
84 | #endif | |
be681a82 | 85 | |
cd187753 | 86 | #if IS_ENABLED(CONFIG_SND_ATMEL_SOC_DMA) |
3951e4aa BS |
87 | int atmel_pcm_dma_platform_register(struct device *dev); |
88 | void atmel_pcm_dma_platform_unregister(struct device *dev); | |
89 | #else | |
90 | static inline int atmel_pcm_dma_platform_register(struct device *dev) | |
91 | { | |
92 | return 0; | |
93 | } | |
94 | static inline void atmel_pcm_dma_platform_unregister(struct device *dev) | |
95 | { | |
96 | } | |
97 | #endif | |
98 | ||
6c742509 | 99 | #endif /* _ATMEL_PCM_H */ |