1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * Socionext UniPhier AIO ALSA driver.
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Copyright (c) 2016-2018 Socionext Inc.
6*4882a593Smuzhiyun */
7*4882a593Smuzhiyun
8*4882a593Smuzhiyun #ifndef SND_UNIPHIER_AIO_H__
9*4882a593Smuzhiyun #define SND_UNIPHIER_AIO_H__
10*4882a593Smuzhiyun
11*4882a593Smuzhiyun #include <linux/spinlock.h>
12*4882a593Smuzhiyun #include <linux/types.h>
13*4882a593Smuzhiyun #include <sound/pcm.h>
14*4882a593Smuzhiyun #include <sound/soc.h>
15*4882a593Smuzhiyun #include <sound/soc-dai.h>
16*4882a593Smuzhiyun
17*4882a593Smuzhiyun struct platform_device;
18*4882a593Smuzhiyun
19*4882a593Smuzhiyun enum ID_PORT_TYPE {
20*4882a593Smuzhiyun PORT_TYPE_UNKNOWN,
21*4882a593Smuzhiyun PORT_TYPE_I2S,
22*4882a593Smuzhiyun PORT_TYPE_SPDIF,
23*4882a593Smuzhiyun PORT_TYPE_EVE,
24*4882a593Smuzhiyun PORT_TYPE_CONV,
25*4882a593Smuzhiyun };
26*4882a593Smuzhiyun
27*4882a593Smuzhiyun enum ID_PORT_DIR {
28*4882a593Smuzhiyun PORT_DIR_OUTPUT,
29*4882a593Smuzhiyun PORT_DIR_INPUT,
30*4882a593Smuzhiyun };
31*4882a593Smuzhiyun
32*4882a593Smuzhiyun enum IEC61937_PC {
33*4882a593Smuzhiyun IEC61937_PC_AC3 = 0x0001,
34*4882a593Smuzhiyun IEC61937_PC_PAUSE = 0x0003,
35*4882a593Smuzhiyun IEC61937_PC_MPA = 0x0004,
36*4882a593Smuzhiyun IEC61937_PC_MP3 = 0x0005,
37*4882a593Smuzhiyun IEC61937_PC_DTS1 = 0x000b,
38*4882a593Smuzhiyun IEC61937_PC_DTS2 = 0x000c,
39*4882a593Smuzhiyun IEC61937_PC_DTS3 = 0x000d,
40*4882a593Smuzhiyun IEC61937_PC_AAC = 0x0007,
41*4882a593Smuzhiyun };
42*4882a593Smuzhiyun
43*4882a593Smuzhiyun /* IEC61937 Repetition period of data-burst in IEC60958 frames */
44*4882a593Smuzhiyun #define IEC61937_FRM_STR_AC3 1536
45*4882a593Smuzhiyun #define IEC61937_FRM_STR_MPA 1152
46*4882a593Smuzhiyun #define IEC61937_FRM_STR_MP3 1152
47*4882a593Smuzhiyun #define IEC61937_FRM_STR_DTS1 512
48*4882a593Smuzhiyun #define IEC61937_FRM_STR_DTS2 1024
49*4882a593Smuzhiyun #define IEC61937_FRM_STR_DTS3 2048
50*4882a593Smuzhiyun #define IEC61937_FRM_STR_AAC 1024
51*4882a593Smuzhiyun
52*4882a593Smuzhiyun /* IEC61937 Repetition period of Pause data-burst in IEC60958 frames */
53*4882a593Smuzhiyun #define IEC61937_FRM_PAU_AC3 3
54*4882a593Smuzhiyun #define IEC61937_FRM_PAU_MPA 32
55*4882a593Smuzhiyun #define IEC61937_FRM_PAU_MP3 32
56*4882a593Smuzhiyun #define IEC61937_FRM_PAU_DTS1 3
57*4882a593Smuzhiyun #define IEC61937_FRM_PAU_DTS2 3
58*4882a593Smuzhiyun #define IEC61937_FRM_PAU_DTS3 3
59*4882a593Smuzhiyun #define IEC61937_FRM_PAU_AAC 32
60*4882a593Smuzhiyun
61*4882a593Smuzhiyun /* IEC61937 Pa and Pb */
62*4882a593Smuzhiyun #define IEC61937_HEADER_SIGN 0x1f4e72f8
63*4882a593Smuzhiyun
64*4882a593Smuzhiyun #define AUD_HW_PCMIN1 0
65*4882a593Smuzhiyun #define AUD_HW_PCMIN2 1
66*4882a593Smuzhiyun #define AUD_HW_PCMIN3 2
67*4882a593Smuzhiyun #define AUD_HW_IECIN1 3
68*4882a593Smuzhiyun #define AUD_HW_DIECIN1 4
69*4882a593Smuzhiyun
70*4882a593Smuzhiyun #define AUD_NAME_PCMIN1 "aio-pcmin1"
71*4882a593Smuzhiyun #define AUD_NAME_PCMIN2 "aio-pcmin2"
72*4882a593Smuzhiyun #define AUD_NAME_PCMIN3 "aio-pcmin3"
73*4882a593Smuzhiyun #define AUD_NAME_IECIN1 "aio-iecin1"
74*4882a593Smuzhiyun #define AUD_NAME_DIECIN1 "aio-diecin1"
75*4882a593Smuzhiyun
76*4882a593Smuzhiyun #define AUD_HW_HPCMOUT1 0
77*4882a593Smuzhiyun #define AUD_HW_PCMOUT1 1
78*4882a593Smuzhiyun #define AUD_HW_PCMOUT2 2
79*4882a593Smuzhiyun #define AUD_HW_PCMOUT3 3
80*4882a593Smuzhiyun #define AUD_HW_EPCMOUT1 4
81*4882a593Smuzhiyun #define AUD_HW_EPCMOUT2 5
82*4882a593Smuzhiyun #define AUD_HW_EPCMOUT3 6
83*4882a593Smuzhiyun #define AUD_HW_EPCMOUT6 9
84*4882a593Smuzhiyun #define AUD_HW_HIECOUT1 10
85*4882a593Smuzhiyun #define AUD_HW_IECOUT1 11
86*4882a593Smuzhiyun #define AUD_HW_CMASTER 31
87*4882a593Smuzhiyun
88*4882a593Smuzhiyun #define AUD_NAME_HPCMOUT1 "aio-hpcmout1"
89*4882a593Smuzhiyun #define AUD_NAME_PCMOUT1 "aio-pcmout1"
90*4882a593Smuzhiyun #define AUD_NAME_PCMOUT2 "aio-pcmout2"
91*4882a593Smuzhiyun #define AUD_NAME_PCMOUT3 "aio-pcmout3"
92*4882a593Smuzhiyun #define AUD_NAME_EPCMOUT1 "aio-epcmout1"
93*4882a593Smuzhiyun #define AUD_NAME_EPCMOUT2 "aio-epcmout2"
94*4882a593Smuzhiyun #define AUD_NAME_EPCMOUT3 "aio-epcmout3"
95*4882a593Smuzhiyun #define AUD_NAME_EPCMOUT6 "aio-epcmout6"
96*4882a593Smuzhiyun #define AUD_NAME_HIECOUT1 "aio-hiecout1"
97*4882a593Smuzhiyun #define AUD_NAME_IECOUT1 "aio-iecout1"
98*4882a593Smuzhiyun #define AUD_NAME_CMASTER "aio-cmaster"
99*4882a593Smuzhiyun #define AUD_NAME_HIECCOMPOUT1 "aio-hieccompout1"
100*4882a593Smuzhiyun #define AUD_NAME_IECCOMPOUT1 "aio-ieccompout1"
101*4882a593Smuzhiyun
102*4882a593Smuzhiyun #define AUD_GNAME_HDMI "aio-hdmi"
103*4882a593Smuzhiyun #define AUD_GNAME_LINE "aio-line"
104*4882a593Smuzhiyun #define AUD_GNAME_AUX "aio-aux"
105*4882a593Smuzhiyun #define AUD_GNAME_IEC "aio-iec"
106*4882a593Smuzhiyun
107*4882a593Smuzhiyun #define AUD_CLK_IO 0
108*4882a593Smuzhiyun #define AUD_CLK_A1 1
109*4882a593Smuzhiyun #define AUD_CLK_F1 2
110*4882a593Smuzhiyun #define AUD_CLK_A2 3
111*4882a593Smuzhiyun #define AUD_CLK_F2 4
112*4882a593Smuzhiyun #define AUD_CLK_A 5
113*4882a593Smuzhiyun #define AUD_CLK_F 6
114*4882a593Smuzhiyun #define AUD_CLK_APLL 7
115*4882a593Smuzhiyun #define AUD_CLK_RX0 8
116*4882a593Smuzhiyun #define AUD_CLK_USB0 9
117*4882a593Smuzhiyun #define AUD_CLK_HSC0 10
118*4882a593Smuzhiyun
119*4882a593Smuzhiyun #define AUD_PLL_A1 0
120*4882a593Smuzhiyun #define AUD_PLL_F1 1
121*4882a593Smuzhiyun #define AUD_PLL_A2 2
122*4882a593Smuzhiyun #define AUD_PLL_F2 3
123*4882a593Smuzhiyun #define AUD_PLL_APLL 4
124*4882a593Smuzhiyun #define AUD_PLL_RX0 5
125*4882a593Smuzhiyun #define AUD_PLL_USB0 6
126*4882a593Smuzhiyun #define AUD_PLL_HSC0 7
127*4882a593Smuzhiyun
128*4882a593Smuzhiyun #define AUD_PLLDIV_1_2 0
129*4882a593Smuzhiyun #define AUD_PLLDIV_1_3 1
130*4882a593Smuzhiyun #define AUD_PLLDIV_1_1 2
131*4882a593Smuzhiyun #define AUD_PLLDIV_2_3 3
132*4882a593Smuzhiyun
133*4882a593Smuzhiyun #define AUD_VOL_INIT 0x4000 /* +0dB */
134*4882a593Smuzhiyun #define AUD_VOL_MAX 0xffff /* +6dB */
135*4882a593Smuzhiyun #define AUD_VOL_FADE_TIME 20 /* 20ms */
136*4882a593Smuzhiyun
137*4882a593Smuzhiyun #define AUD_RING_SIZE (128 * 1024)
138*4882a593Smuzhiyun
139*4882a593Smuzhiyun #define AUD_MIN_FRAGMENT 4
140*4882a593Smuzhiyun #define AUD_MAX_FRAGMENT 8
141*4882a593Smuzhiyun #define AUD_MIN_FRAGMENT_SIZE (4 * 1024)
142*4882a593Smuzhiyun #define AUD_MAX_FRAGMENT_SIZE (16 * 1024)
143*4882a593Smuzhiyun
144*4882a593Smuzhiyun /* max 5 slots, 10 channels, 2 channel in 1 slot */
145*4882a593Smuzhiyun #define AUD_MAX_SLOTSEL 5
146*4882a593Smuzhiyun
147*4882a593Smuzhiyun /*
148*4882a593Smuzhiyun * This is a selector for virtual register map of AIO.
149*4882a593Smuzhiyun *
150*4882a593Smuzhiyun * map: Specify the index of virtual register map.
151*4882a593Smuzhiyun * hw : Specify the ID of real register map, selector uses this value.
152*4882a593Smuzhiyun * A meaning of this value depends specification of SoC.
153*4882a593Smuzhiyun */
154*4882a593Smuzhiyun struct uniphier_aio_selector {
155*4882a593Smuzhiyun int map;
156*4882a593Smuzhiyun int hw;
157*4882a593Smuzhiyun };
158*4882a593Smuzhiyun
159*4882a593Smuzhiyun /**
160*4882a593Smuzhiyun * 'SoftWare MAPping' setting of UniPhier AIO registers.
161*4882a593Smuzhiyun *
162*4882a593Smuzhiyun * We have to setup 'virtual' register maps to access 'real' registers of AIO.
163*4882a593Smuzhiyun * This feature is legacy and meaningless but AIO needs this to work.
164*4882a593Smuzhiyun *
165*4882a593Smuzhiyun * Each hardware blocks have own virtual register maps as following:
166*4882a593Smuzhiyun *
167*4882a593Smuzhiyun * Address Virtual Real
168*4882a593Smuzhiyun * ------- --------- ---------------
169*4882a593Smuzhiyun * 0x12000 DMAC map0 --> [selector] --> DMAC hardware 3
170*4882a593Smuzhiyun * 0x12080 DMAC map1 --> [selector] --> DMAC hardware 1
171*4882a593Smuzhiyun * ...
172*4882a593Smuzhiyun * 0x42000 Port map0 --> [selector] --> Port hardware 1
173*4882a593Smuzhiyun * 0x42400 Port map1 --> [selector] --> Port hardware 2
174*4882a593Smuzhiyun * ...
175*4882a593Smuzhiyun *
176*4882a593Smuzhiyun * ch : Input or output channel of DMAC
177*4882a593Smuzhiyun * rb : Ring buffer
178*4882a593Smuzhiyun * iport: PCM input port
179*4882a593Smuzhiyun * iif : Input interface
180*4882a593Smuzhiyun * oport: PCM output port
181*4882a593Smuzhiyun * oif : Output interface
182*4882a593Smuzhiyun * och : Output channel of DMAC for sampling rate converter
183*4882a593Smuzhiyun *
184*4882a593Smuzhiyun * These are examples for sound data paths:
185*4882a593Smuzhiyun *
186*4882a593Smuzhiyun * For caputure device:
187*4882a593Smuzhiyun * (outer of AIO) -> iport -> iif -> ch -> rb -> (CPU)
188*4882a593Smuzhiyun * For playback device:
189*4882a593Smuzhiyun * (CPU) -> rb -> ch -> oif -> oport -> (outer of AIO)
190*4882a593Smuzhiyun * For sampling rate converter device:
191*4882a593Smuzhiyun * (CPU) -> rb -> ch -> oif -> (HW SRC) -> iif -> och -> orb -> (CPU)
192*4882a593Smuzhiyun */
193*4882a593Smuzhiyun struct uniphier_aio_swmap {
194*4882a593Smuzhiyun int type;
195*4882a593Smuzhiyun int dir;
196*4882a593Smuzhiyun
197*4882a593Smuzhiyun struct uniphier_aio_selector ch;
198*4882a593Smuzhiyun struct uniphier_aio_selector rb;
199*4882a593Smuzhiyun struct uniphier_aio_selector iport;
200*4882a593Smuzhiyun struct uniphier_aio_selector iif;
201*4882a593Smuzhiyun struct uniphier_aio_selector oport;
202*4882a593Smuzhiyun struct uniphier_aio_selector oif;
203*4882a593Smuzhiyun struct uniphier_aio_selector och;
204*4882a593Smuzhiyun };
205*4882a593Smuzhiyun
206*4882a593Smuzhiyun struct uniphier_aio_spec {
207*4882a593Smuzhiyun const char *name;
208*4882a593Smuzhiyun const char *gname;
209*4882a593Smuzhiyun struct uniphier_aio_swmap swm;
210*4882a593Smuzhiyun };
211*4882a593Smuzhiyun
212*4882a593Smuzhiyun struct uniphier_aio_pll {
213*4882a593Smuzhiyun bool enable;
214*4882a593Smuzhiyun unsigned int freq;
215*4882a593Smuzhiyun };
216*4882a593Smuzhiyun
217*4882a593Smuzhiyun struct uniphier_aio_chip_spec {
218*4882a593Smuzhiyun const struct uniphier_aio_spec *specs;
219*4882a593Smuzhiyun int num_specs;
220*4882a593Smuzhiyun const struct uniphier_aio_pll *plls;
221*4882a593Smuzhiyun int num_plls;
222*4882a593Smuzhiyun struct snd_soc_dai_driver *dais;
223*4882a593Smuzhiyun int num_dais;
224*4882a593Smuzhiyun
225*4882a593Smuzhiyun /* DMA access mode, this is workaround for DMA hungup */
226*4882a593Smuzhiyun int addr_ext;
227*4882a593Smuzhiyun };
228*4882a593Smuzhiyun
229*4882a593Smuzhiyun struct uniphier_aio_sub {
230*4882a593Smuzhiyun struct uniphier_aio *aio;
231*4882a593Smuzhiyun
232*4882a593Smuzhiyun /* Guard sub->rd_offs and wr_offs from IRQ handler. */
233*4882a593Smuzhiyun spinlock_t lock;
234*4882a593Smuzhiyun
235*4882a593Smuzhiyun const struct uniphier_aio_swmap *swm;
236*4882a593Smuzhiyun const struct uniphier_aio_spec *spec;
237*4882a593Smuzhiyun
238*4882a593Smuzhiyun /* For PCM audio */
239*4882a593Smuzhiyun struct snd_pcm_substream *substream;
240*4882a593Smuzhiyun struct snd_pcm_hw_params params;
241*4882a593Smuzhiyun int vol;
242*4882a593Smuzhiyun
243*4882a593Smuzhiyun /* For compress audio */
244*4882a593Smuzhiyun struct snd_compr_stream *cstream;
245*4882a593Smuzhiyun struct snd_compr_params cparams;
246*4882a593Smuzhiyun unsigned char *compr_area;
247*4882a593Smuzhiyun dma_addr_t compr_addr;
248*4882a593Smuzhiyun size_t compr_bytes;
249*4882a593Smuzhiyun int pass_through;
250*4882a593Smuzhiyun enum IEC61937_PC iec_pc;
251*4882a593Smuzhiyun bool iec_header;
252*4882a593Smuzhiyun
253*4882a593Smuzhiyun /* Both PCM and compress audio */
254*4882a593Smuzhiyun bool use_mmap;
255*4882a593Smuzhiyun int setting;
256*4882a593Smuzhiyun int running;
257*4882a593Smuzhiyun u64 rd_offs;
258*4882a593Smuzhiyun u64 wr_offs;
259*4882a593Smuzhiyun u32 threshold;
260*4882a593Smuzhiyun u64 rd_org;
261*4882a593Smuzhiyun u64 wr_org;
262*4882a593Smuzhiyun u64 rd_total;
263*4882a593Smuzhiyun u64 wr_total;
264*4882a593Smuzhiyun };
265*4882a593Smuzhiyun
266*4882a593Smuzhiyun struct uniphier_aio {
267*4882a593Smuzhiyun struct uniphier_aio_chip *chip;
268*4882a593Smuzhiyun
269*4882a593Smuzhiyun struct uniphier_aio_sub sub[2];
270*4882a593Smuzhiyun
271*4882a593Smuzhiyun unsigned int fmt;
272*4882a593Smuzhiyun /* Set one of AUD_CLK_X */
273*4882a593Smuzhiyun int clk_in;
274*4882a593Smuzhiyun int clk_out;
275*4882a593Smuzhiyun /* Set one of AUD_PLL_X */
276*4882a593Smuzhiyun int pll_in;
277*4882a593Smuzhiyun int pll_out;
278*4882a593Smuzhiyun /* Set one of AUD_PLLDIV_X */
279*4882a593Smuzhiyun int plldiv;
280*4882a593Smuzhiyun };
281*4882a593Smuzhiyun
282*4882a593Smuzhiyun struct uniphier_aio_chip {
283*4882a593Smuzhiyun struct platform_device *pdev;
284*4882a593Smuzhiyun const struct uniphier_aio_chip_spec *chip_spec;
285*4882a593Smuzhiyun
286*4882a593Smuzhiyun struct uniphier_aio *aios;
287*4882a593Smuzhiyun int num_aios;
288*4882a593Smuzhiyun int num_wup_aios;
289*4882a593Smuzhiyun struct uniphier_aio_pll *plls;
290*4882a593Smuzhiyun int num_plls;
291*4882a593Smuzhiyun
292*4882a593Smuzhiyun struct clk *clk;
293*4882a593Smuzhiyun struct reset_control *rst;
294*4882a593Smuzhiyun struct regmap *regmap;
295*4882a593Smuzhiyun struct regmap *regmap_sg;
296*4882a593Smuzhiyun int active;
297*4882a593Smuzhiyun };
298*4882a593Smuzhiyun
uniphier_priv(struct snd_soc_dai * dai)299*4882a593Smuzhiyun static inline struct uniphier_aio *uniphier_priv(struct snd_soc_dai *dai)
300*4882a593Smuzhiyun {
301*4882a593Smuzhiyun struct uniphier_aio_chip *chip = snd_soc_dai_get_drvdata(dai);
302*4882a593Smuzhiyun
303*4882a593Smuzhiyun return &chip->aios[dai->id];
304*4882a593Smuzhiyun }
305*4882a593Smuzhiyun
306*4882a593Smuzhiyun int uniphier_aiodma_soc_register_platform(struct platform_device *pdev);
307*4882a593Smuzhiyun extern const struct snd_compress_ops uniphier_aio_compress_ops;
308*4882a593Smuzhiyun
309*4882a593Smuzhiyun int uniphier_aio_dai_probe(struct snd_soc_dai *dai);
310*4882a593Smuzhiyun int uniphier_aio_dai_remove(struct snd_soc_dai *dai);
311*4882a593Smuzhiyun int uniphier_aio_probe(struct platform_device *pdev);
312*4882a593Smuzhiyun int uniphier_aio_remove(struct platform_device *pdev);
313*4882a593Smuzhiyun extern const struct snd_soc_dai_ops uniphier_aio_i2s_ops;
314*4882a593Smuzhiyun extern const struct snd_soc_dai_ops uniphier_aio_spdif_ops;
315*4882a593Smuzhiyun
316*4882a593Smuzhiyun u64 aio_rb_cnt(struct uniphier_aio_sub *sub);
317*4882a593Smuzhiyun u64 aio_rbt_cnt_to_end(struct uniphier_aio_sub *sub);
318*4882a593Smuzhiyun u64 aio_rb_space(struct uniphier_aio_sub *sub);
319*4882a593Smuzhiyun u64 aio_rb_space_to_end(struct uniphier_aio_sub *sub);
320*4882a593Smuzhiyun
321*4882a593Smuzhiyun void aio_iecout_set_enable(struct uniphier_aio_chip *chip, bool enable);
322*4882a593Smuzhiyun int aio_chip_set_pll(struct uniphier_aio_chip *chip, int pll_id,
323*4882a593Smuzhiyun unsigned int freq);
324*4882a593Smuzhiyun void aio_chip_init(struct uniphier_aio_chip *chip);
325*4882a593Smuzhiyun int aio_init(struct uniphier_aio_sub *sub);
326*4882a593Smuzhiyun void aio_port_reset(struct uniphier_aio_sub *sub);
327*4882a593Smuzhiyun int aio_port_set_param(struct uniphier_aio_sub *sub, int pass_through,
328*4882a593Smuzhiyun const struct snd_pcm_hw_params *params);
329*4882a593Smuzhiyun void aio_port_set_enable(struct uniphier_aio_sub *sub, int enable);
330*4882a593Smuzhiyun int aio_port_get_volume(struct uniphier_aio_sub *sub);
331*4882a593Smuzhiyun void aio_port_set_volume(struct uniphier_aio_sub *sub, int vol);
332*4882a593Smuzhiyun int aio_if_set_param(struct uniphier_aio_sub *sub, int pass_through);
333*4882a593Smuzhiyun int aio_oport_set_stream_type(struct uniphier_aio_sub *sub,
334*4882a593Smuzhiyun enum IEC61937_PC pc);
335*4882a593Smuzhiyun void aio_src_reset(struct uniphier_aio_sub *sub);
336*4882a593Smuzhiyun int aio_src_set_param(struct uniphier_aio_sub *sub,
337*4882a593Smuzhiyun const struct snd_pcm_hw_params *params);
338*4882a593Smuzhiyun int aio_srcif_set_param(struct uniphier_aio_sub *sub);
339*4882a593Smuzhiyun int aio_srcch_set_param(struct uniphier_aio_sub *sub);
340*4882a593Smuzhiyun void aio_srcch_set_enable(struct uniphier_aio_sub *sub, int enable);
341*4882a593Smuzhiyun
342*4882a593Smuzhiyun int aiodma_ch_set_param(struct uniphier_aio_sub *sub);
343*4882a593Smuzhiyun void aiodma_ch_set_enable(struct uniphier_aio_sub *sub, int enable);
344*4882a593Smuzhiyun int aiodma_rb_set_threshold(struct uniphier_aio_sub *sub, u64 size, u32 th);
345*4882a593Smuzhiyun int aiodma_rb_set_buffer(struct uniphier_aio_sub *sub, u64 start, u64 end,
346*4882a593Smuzhiyun int period);
347*4882a593Smuzhiyun void aiodma_rb_sync(struct uniphier_aio_sub *sub, u64 start, u64 size,
348*4882a593Smuzhiyun int period);
349*4882a593Smuzhiyun bool aiodma_rb_is_irq(struct uniphier_aio_sub *sub);
350*4882a593Smuzhiyun void aiodma_rb_clear_irq(struct uniphier_aio_sub *sub);
351*4882a593Smuzhiyun
352*4882a593Smuzhiyun #endif /* SND_UNIPHIER_AIO_H__ */
353