rsnd.h 16.1 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/*
 * Renesas R-Car
 *
 * Copyright (C) 2013 Renesas Solutions Corp.
 * Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */
#ifndef RSND_H
#define RSND_H

#include <linux/clk.h>
#include <linux/device.h>
16
#include <linux/dma-mapping.h>
17 18 19
#include <linux/io.h>
#include <linux/list.h>
#include <linux/module.h>
20 21
#include <linux/of_device.h>
#include <linux/of_irq.h>
22 23
#include <linux/sh_dma.h>
#include <linux/workqueue.h>
24 25 26 27 28 29 30 31 32 33 34
#include <sound/rcar_snd.h>
#include <sound/soc.h>
#include <sound/pcm_params.h>

/*
 *	pseudo register
 *
 * The register address offsets SRU/SCU/SSIU on Gen1/Gen2 are very different.
 * This driver uses pseudo register in order to hide it.
 * see gen1/gen2 for detail
 */
35
enum rsnd_reg {
36
	/* SRU/SCU/SSIU */
37 38
	RSND_REG_SSI_MODE0,
	RSND_REG_SSI_MODE1,
39
	RSND_REG_SRC_BUSIF_MODE,
40 41 42
	RSND_REG_SRC_ROUTE_MODE0,
	RSND_REG_SRC_SWRSR,
	RSND_REG_SRC_SRCIR,
43
	RSND_REG_SRC_ADINR,
44 45 46
	RSND_REG_SRC_IFSCR,
	RSND_REG_SRC_IFSVR,
	RSND_REG_SRC_SRCCR,
47 48
	RSND_REG_SCU_SYS_STATUS0,
	RSND_REG_SCU_SYS_INT_EN0,
K
Kuninori Morimoto 已提交
49 50 51 52 53 54 55 56 57
	RSND_REG_CMD_ROUTE_SLCT,
	RSND_REG_DVC_SWRSR,
	RSND_REG_DVC_DVUIR,
	RSND_REG_DVC_ADINR,
	RSND_REG_DVC_DVUCR,
	RSND_REG_DVC_ZCMCR,
	RSND_REG_DVC_VOL0R,
	RSND_REG_DVC_VOL1R,
	RSND_REG_DVC_DVUER,
58

59 60 61 62 63 64 65
	/* ADG */
	RSND_REG_BRRA,
	RSND_REG_BRRB,
	RSND_REG_SSICKR,
	RSND_REG_AUDIO_CLK_SEL0,
	RSND_REG_AUDIO_CLK_SEL1,

66 67 68 69 70 71 72
	/* SSI */
	RSND_REG_SSICR,
	RSND_REG_SSISR,
	RSND_REG_SSITDR,
	RSND_REG_SSIRDR,
	RSND_REG_SSIWSR,

73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
	/* SHARE see below */
	RSND_REG_SHARE01,
	RSND_REG_SHARE02,
	RSND_REG_SHARE03,
	RSND_REG_SHARE04,
	RSND_REG_SHARE05,
	RSND_REG_SHARE06,
	RSND_REG_SHARE07,
	RSND_REG_SHARE08,
	RSND_REG_SHARE09,
	RSND_REG_SHARE10,
	RSND_REG_SHARE11,
	RSND_REG_SHARE12,
	RSND_REG_SHARE13,
	RSND_REG_SHARE14,
	RSND_REG_SHARE15,
	RSND_REG_SHARE16,
	RSND_REG_SHARE17,
	RSND_REG_SHARE18,
	RSND_REG_SHARE19,
K
Kuninori Morimoto 已提交
93 94
	RSND_REG_SHARE20,
	RSND_REG_SHARE21,
95
	RSND_REG_SHARE22,
96 97 98
	RSND_REG_SHARE23,
	RSND_REG_SHARE24,
	RSND_REG_SHARE25,
99 100 101
	RSND_REG_SHARE26,
	RSND_REG_SHARE27,
	RSND_REG_SHARE28,
102

103 104 105
	RSND_REG_MAX,
};

106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
/* Gen1 only */
#define RSND_REG_SRC_ROUTE_SEL		RSND_REG_SHARE01
#define RSND_REG_SRC_TMG_SEL0		RSND_REG_SHARE02
#define RSND_REG_SRC_TMG_SEL1		RSND_REG_SHARE03
#define RSND_REG_SRC_TMG_SEL2		RSND_REG_SHARE04
#define RSND_REG_SRC_ROUTE_CTRL		RSND_REG_SHARE05
#define RSND_REG_SRC_MNFSR		RSND_REG_SHARE06
#define RSND_REG_AUDIO_CLK_SEL3		RSND_REG_SHARE07
#define RSND_REG_AUDIO_CLK_SEL4		RSND_REG_SHARE08
#define RSND_REG_AUDIO_CLK_SEL5		RSND_REG_SHARE09

/* Gen2 only */
#define RSND_REG_SRC_CTRL		RSND_REG_SHARE01
#define RSND_REG_SSI_CTRL		RSND_REG_SHARE02
#define RSND_REG_SSI_BUSIF_MODE		RSND_REG_SHARE03
#define RSND_REG_SSI_BUSIF_ADINR	RSND_REG_SHARE04
#define RSND_REG_INT_ENABLE		RSND_REG_SHARE05
#define RSND_REG_SRC_BSDSR		RSND_REG_SHARE06
#define RSND_REG_SRC_BSISR		RSND_REG_SHARE07
#define RSND_REG_DIV_EN			RSND_REG_SHARE08
#define RSND_REG_SRCIN_TIMSEL0		RSND_REG_SHARE09
#define RSND_REG_SRCIN_TIMSEL1		RSND_REG_SHARE10
#define RSND_REG_SRCIN_TIMSEL2		RSND_REG_SHARE11
#define RSND_REG_SRCIN_TIMSEL3		RSND_REG_SHARE12
#define RSND_REG_SRCIN_TIMSEL4		RSND_REG_SHARE13
#define RSND_REG_SRCOUT_TIMSEL0		RSND_REG_SHARE14
#define RSND_REG_SRCOUT_TIMSEL1		RSND_REG_SHARE15
#define RSND_REG_SRCOUT_TIMSEL2		RSND_REG_SHARE16
#define RSND_REG_SRCOUT_TIMSEL3		RSND_REG_SHARE17
#define RSND_REG_SRCOUT_TIMSEL4		RSND_REG_SHARE18
#define RSND_REG_AUDIO_CLK_SEL2		RSND_REG_SHARE19
K
Kuninori Morimoto 已提交
137 138
#define RSND_REG_CMD_CTRL		RSND_REG_SHARE20
#define RSND_REG_CMDOUT_TIMSEL		RSND_REG_SHARE21
139
#define RSND_REG_BUSIF_DALIGN		RSND_REG_SHARE22
140 141 142
#define RSND_REG_DVC_VRCTR		RSND_REG_SHARE23
#define RSND_REG_DVC_VRPDR		RSND_REG_SHARE24
#define RSND_REG_DVC_VRDBR		RSND_REG_SHARE25
143 144 145
#define RSND_REG_SCU_SYS_STATUS1	RSND_REG_SHARE26
#define RSND_REG_SCU_SYS_INT_EN1	RSND_REG_SHARE27
#define RSND_REG_SRC_INT_ENABLE0	RSND_REG_SHARE28
146

147
struct rsnd_of_data;
148
struct rsnd_priv;
149
struct rsnd_mod;
150 151 152
struct rsnd_dai;
struct rsnd_dai_stream;

153 154 155 156 157 158 159
/*
 *	R-Car basic functions
 */
#define rsnd_mod_read(m, r) \
	rsnd_read(rsnd_mod_to_priv(m), m, RSND_REG_##r)
#define rsnd_mod_write(m, r, d) \
	rsnd_write(rsnd_mod_to_priv(m), m, RSND_REG_##r, d)
160 161
#define rsnd_mod_force_write(m, r, d) \
	rsnd_force_write(rsnd_mod_to_priv(m), m, RSND_REG_##r, d)
162 163 164 165 166 167
#define rsnd_mod_bset(m, r, s, d) \
	rsnd_bset(rsnd_mod_to_priv(m), m, RSND_REG_##r, s, d)

u32 rsnd_read(struct rsnd_priv *priv, struct rsnd_mod *mod, enum rsnd_reg reg);
void rsnd_write(struct rsnd_priv *priv, struct rsnd_mod *mod,
		enum rsnd_reg reg, u32 data);
168 169
void rsnd_force_write(struct rsnd_priv *priv, struct rsnd_mod *mod,
		enum rsnd_reg reg, u32 data);
170 171
void rsnd_bset(struct rsnd_priv *priv, struct rsnd_mod *mod, enum rsnd_reg reg,
		    u32 mask, u32 data);
172
u32 rsnd_get_adinr(struct rsnd_mod *mod, struct rsnd_dai_stream *io);
173

174 175 176
/*
 *	R-Car DMA
 */
177 178
struct rsnd_dma;
struct rsnd_dma_ops {
179 180 181
	void (*start)(struct rsnd_dai_stream *io, struct rsnd_dma *dma);
	void (*stop)(struct rsnd_dai_stream *io, struct rsnd_dma *dma);
	int (*init)(struct rsnd_dai_stream *io, struct rsnd_dma *dma, int id,
182
		    struct rsnd_mod *mod_from, struct rsnd_mod *mod_to);
183
	void (*quit)(struct rsnd_dai_stream *io, struct rsnd_dma *dma);
184 185
};

186
struct rsnd_dmaen {
187
	struct dma_chan		*chan;
188 189 190
};

struct rsnd_dmapp {
191 192
	int			dmapp_id;
	u32			chcr;
193 194 195 196
};

struct rsnd_dma {
	struct rsnd_dma_ops	*ops;
197 198
	dma_addr_t		src_addr;
	dma_addr_t		dst_addr;
199 200 201 202
	union {
		struct rsnd_dmaen en;
		struct rsnd_dmapp pp;
	} dma;
203
};
204 205
#define rsnd_dma_to_dmaen(dma)	(&(dma)->dma.en)
#define rsnd_dma_to_dmapp(dma)	(&(dma)->dma.pp)
206

207 208 209 210
void rsnd_dma_start(struct rsnd_dai_stream *io, struct rsnd_dma *dma);
void rsnd_dma_stop(struct rsnd_dai_stream *io, struct rsnd_dma *dma);
int rsnd_dma_init(struct rsnd_dai_stream *io, struct rsnd_dma *dma, int id);
void rsnd_dma_quit(struct rsnd_dai_stream *io, struct rsnd_dma *dma);
211 212 213
int rsnd_dma_probe(struct platform_device *pdev,
		   const struct rsnd_of_data *of_data,
		   struct rsnd_priv *priv);
214 215
struct dma_chan *rsnd_dma_request_channel(struct device_node *of_node,
					  struct rsnd_mod *mod, char *name);
216

217 218
#define rsnd_dma_to_mod(_dma) container_of((_dma), struct rsnd_mod, dma)

219 220 221
/*
 *	R-Car sound mod
 */
222
enum rsnd_mod_type {
223 224
	RSND_MOD_DVC = 0,
	RSND_MOD_SRC,
225 226 227
	RSND_MOD_SSI,
	RSND_MOD_MAX,
};
228 229 230

struct rsnd_mod_ops {
	char *name;
231 232
	struct dma_chan* (*dma_req)(struct rsnd_dai_stream *io,
				    struct rsnd_mod *mod);
233
	int (*probe)(struct rsnd_mod *mod,
234
		     struct rsnd_dai_stream *io,
235
		     struct rsnd_priv *priv);
236
	int (*remove)(struct rsnd_mod *mod,
237
		      struct rsnd_dai_stream *io,
238
		      struct rsnd_priv *priv);
239
	int (*init)(struct rsnd_mod *mod,
240
		    struct rsnd_dai_stream *io,
241
		    struct rsnd_priv *priv);
242
	int (*quit)(struct rsnd_mod *mod,
243
		    struct rsnd_dai_stream *io,
244
		    struct rsnd_priv *priv);
245
	int (*start)(struct rsnd_mod *mod,
246
		     struct rsnd_dai_stream *io,
247
		     struct rsnd_priv *priv);
248
	int (*stop)(struct rsnd_mod *mod,
249
		    struct rsnd_dai_stream *io,
250
		    struct rsnd_priv *priv);
K
Kuninori Morimoto 已提交
251
	int (*pcm_new)(struct rsnd_mod *mod,
252
		       struct rsnd_dai_stream *io,
K
Kuninori Morimoto 已提交
253
		       struct snd_soc_pcm_runtime *rtd);
254
	int (*hw_params)(struct rsnd_mod *mod,
255
			 struct rsnd_dai_stream *io,
256 257
			 struct snd_pcm_substream *substream,
			 struct snd_pcm_hw_params *hw_params);
258
	int (*fallback)(struct rsnd_mod *mod,
259
			struct rsnd_dai_stream *io,
260
			struct rsnd_priv *priv);
261 262
};

263
struct rsnd_dai_stream;
264 265
struct rsnd_mod {
	int id;
266
	enum rsnd_mod_type type;
267
	struct rsnd_mod_ops *ops;
268
	struct rsnd_dma dma;
269
	struct rsnd_priv *priv;
270
	struct clk *clk;
271
	u32 status;
272
};
273 274 275
/*
 * status
 *
276
 * 0xH0000CBA
277
 *
278 279 280 281 282 283 284 285
 * A	0: probe	1: remove
 * B	0: init		1: quit
 * C	0: start	1: stop
 *
 * H is always called (see __rsnd_mod_call)
 * H	0: pcm_new
 * H	0: fallback
 * H	0: hw_params
286 287 288
 */
#define __rsnd_mod_shift_probe		0
#define __rsnd_mod_shift_remove		0
289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305
#define __rsnd_mod_shift_init		4
#define __rsnd_mod_shift_quit		4
#define __rsnd_mod_shift_start		8
#define __rsnd_mod_shift_stop		8
#define __rsnd_mod_shift_pcm_new	28 /* always called */
#define __rsnd_mod_shift_fallback	28 /* always called */
#define __rsnd_mod_shift_hw_params	28 /* always called */

#define __rsnd_mod_add_probe		 1
#define __rsnd_mod_add_remove		-1
#define __rsnd_mod_add_init		 1
#define __rsnd_mod_add_quit		-1
#define __rsnd_mod_add_start		 1
#define __rsnd_mod_add_stop		-1
#define __rsnd_mod_add_pcm_new		0
#define __rsnd_mod_add_fallback		0
#define __rsnd_mod_add_hw_params	0
306 307 308 309 310 311 312 313 314

#define __rsnd_mod_call_probe		0
#define __rsnd_mod_call_remove		1
#define __rsnd_mod_call_init		0
#define __rsnd_mod_call_quit		1
#define __rsnd_mod_call_start		0
#define __rsnd_mod_call_stop		1
#define __rsnd_mod_call_pcm_new		0
#define __rsnd_mod_call_fallback	0
315
#define __rsnd_mod_call_hw_params	0
316

317
#define rsnd_mod_to_priv(mod) ((mod)->priv)
318
#define rsnd_mod_to_dma(mod) (&(mod)->dma)
319
#define rsnd_mod_id(mod) ((mod)->id)
320 321
#define rsnd_mod_hw_start(mod)	clk_enable((mod)->clk)
#define rsnd_mod_hw_stop(mod)	clk_disable((mod)->clk)
322

323 324
int rsnd_mod_init(struct rsnd_priv *priv,
		  struct rsnd_mod *mod,
325
		   struct rsnd_mod_ops *ops,
326
		   struct clk *clk,
327
		   enum rsnd_mod_type type,
328
		   int id);
329
void rsnd_mod_quit(struct rsnd_mod *mod);
330
char *rsnd_mod_name(struct rsnd_mod *mod);
331 332
struct dma_chan *rsnd_mod_dma_req(struct rsnd_dai_stream *io,
				  struct rsnd_mod *mod);
333 334 335
void rsnd_mod_interrupt(struct rsnd_mod *mod,
			void (*callback)(struct rsnd_mod *mod,
					 struct rsnd_dai_stream *io));
336

337 338 339 340 341
/*
 *	R-Car sound DAI
 */
#define RSND_DAI_NAME_SIZE	16
struct rsnd_dai_stream {
342
	char name[RSND_DAI_NAME_SIZE];
343
	struct snd_pcm_substream *substream;
344
	struct rsnd_mod *mod[RSND_MOD_MAX];
345
	struct rsnd_dai_path_info *info; /* rcar_snd.h */
346
	struct rsnd_dai *rdai;
347 348 349 350 351
	int byte_pos;
	int period_pos;
	int byte_per_period;
	int next_period_byte;
};
352
#define rsnd_io_to_mod_ssi(io)	((io)->mod[RSND_MOD_SSI])
353
#define rsnd_io_to_mod_src(io)	((io)->mod[RSND_MOD_SRC])
K
Kuninori Morimoto 已提交
354
#define rsnd_io_to_mod_dvc(io)	((io)->mod[RSND_MOD_DVC])
355
#define rsnd_io_to_rdai(io)	((io)->rdai)
356
#define rsnd_io_to_priv(io)	(rsnd_rdai_to_priv(rsnd_io_to_rdai(io)))
357
#define rsnd_io_is_play(io)	(&rsnd_io_to_rdai(io)->playback == io)
358 359
#define rsnd_io_to_runtime(io) ((io)->substream ? \
				(io)->substream->runtime : NULL)
360
int rsnd_io_is_working(struct rsnd_dai_stream *io);
361

362 363 364 365
struct rsnd_dai {
	char name[RSND_DAI_NAME_SIZE];
	struct rsnd_dai_stream playback;
	struct rsnd_dai_stream capture;
366
	struct rsnd_priv *priv;
367

368 369 370 371 372
	unsigned int clk_master:1;
	unsigned int bit_clk_inv:1;
	unsigned int frm_clk_inv:1;
	unsigned int sys_delay:1;
	unsigned int data_alignment:1;
373 374
};

375
#define rsnd_rdai_nr(priv) ((priv)->rdai_nr)
376
#define rsnd_rdai_is_clk_master(rdai) ((rdai)->clk_master)
377
#define rsnd_rdai_to_priv(rdai) ((rdai)->priv)
378
#define for_each_rsnd_dai(rdai, priv, i)		\
379
	for (i = 0;					\
380
	     (i < rsnd_rdai_nr(priv)) &&		\
381
	     ((rdai) = rsnd_rdai_get(priv, i));		\
382
	     i++)
383

384 385
struct rsnd_dai *rsnd_rdai_get(struct rsnd_priv *priv, int id);

386 387
bool rsnd_dai_pointer_update(struct rsnd_dai_stream *io, int cnt);
void rsnd_dai_period_elapsed(struct rsnd_dai_stream *io);
388 389
int rsnd_dai_pointer_offset(struct rsnd_dai_stream *io, int additional);

390 391 392 393
/*
 *	R-Car Gen1/Gen2
 */
int rsnd_gen_probe(struct platform_device *pdev,
394
		   const struct rsnd_of_data *of_data,
395 396 397 398
		   struct rsnd_priv *priv);
void __iomem *rsnd_gen_reg_get(struct rsnd_priv *priv,
			       struct rsnd_mod *mod,
			       enum rsnd_reg reg);
399
phys_addr_t rsnd_gen_get_phy_addr(struct rsnd_priv *priv, int reg_id);
400

401 402
#define rsnd_is_gen1(s)		(((s)->info->flags & RSND_GEN_MASK) == RSND_GEN1)
#define rsnd_is_gen2(s)		(((s)->info->flags & RSND_GEN_MASK) == RSND_GEN2)
403

404 405 406 407 408 409
/*
 *	R-Car ADG
 */
int rsnd_adg_ssi_clk_stop(struct rsnd_mod *mod);
int rsnd_adg_ssi_clk_try_start(struct rsnd_mod *mod, unsigned int rate);
int rsnd_adg_probe(struct platform_device *pdev,
410
		   const struct rsnd_of_data *of_data,
411
		   struct rsnd_priv *priv);
412 413 414 415
int rsnd_adg_set_convert_clk_gen1(struct rsnd_priv *priv,
				  struct rsnd_mod *mod,
				  unsigned int src_rate,
				  unsigned int dst_rate);
416 417 418 419 420 421
int rsnd_adg_set_convert_clk_gen2(struct rsnd_mod *mod,
				  struct rsnd_dai_stream *io,
				  unsigned int src_rate,
				  unsigned int dst_rate);
int rsnd_adg_set_convert_timing_gen2(struct rsnd_mod *mod,
				     struct rsnd_dai_stream *io);
422
int rsnd_adg_set_cmd_timsel_gen2(struct rsnd_mod *mod,
K
Kuninori Morimoto 已提交
423
				 struct rsnd_dai_stream *io);
424

425 426 427
/*
 *	R-Car sound priv
 */
428 429 430 431
struct rsnd_of_data {
	u32 flags;
};

432 433
struct rsnd_priv {

434
	struct platform_device *pdev;
435 436 437
	struct rcar_snd_info *info;
	spinlock_t lock;

438 439 440 441 442
	/*
	 * below value will be filled on rsnd_gen_probe()
	 */
	void *gen;

443
	/*
444
	 * below value will be filled on rsnd_src_probe()
445
	 */
446 447
	void *src;
	int src_nr;
448

449 450 451 452 453
	/*
	 * below value will be filled on rsnd_adg_probe()
	 */
	void *adg;

454 455 456 457 458
	/*
	 * below value will be filled on rsnd_dma_probe()
	 */
	void *dma;

459 460 461
	/*
	 * below value will be filled on rsnd_ssi_probe()
	 */
462 463
	void *ssi;
	int ssi_nr;
464

K
Kuninori Morimoto 已提交
465 466 467 468 469 470
	/*
	 * below value will be filled on rsnd_dvc_probe()
	 */
	void *dvc;
	int dvc_nr;

471 472 473 474 475
	/*
	 * below value will be filled on rsnd_dai_probe()
	 */
	struct snd_soc_dai_driver *daidrv;
	struct rsnd_dai *rdai;
476
	int rdai_nr;
477 478
};

479 480
#define rsnd_priv_to_pdev(priv)	((priv)->pdev)
#define rsnd_priv_to_dev(priv)	(&(rsnd_priv_to_pdev(priv)->dev))
481
#define rsnd_priv_to_info(priv)	((priv)->info)
482

483 484 485 486 487 488 489 490
/*
 *	rsnd_kctrl
 */
struct rsnd_kctrl_cfg {
	unsigned int max;
	unsigned int size;
	u32 *val;
	const char * const *texts;
491 492
	void (*update)(struct rsnd_dai_stream *io, struct rsnd_mod *mod);
	struct rsnd_dai_stream *io;
493 494
	struct snd_card *card;
	struct snd_kcontrol *kctrl;
495 496 497 498 499 500 501 502 503 504 505 506 507
};

#define RSND_DVC_CHANNELS	2
struct rsnd_kctrl_cfg_m {
	struct rsnd_kctrl_cfg cfg;
	u32 val[RSND_DVC_CHANNELS];
};

struct rsnd_kctrl_cfg_s {
	struct rsnd_kctrl_cfg cfg;
	u32 val;
};

508 509 510
void _rsnd_kctrl_remove(struct rsnd_kctrl_cfg *cfg);
#define rsnd_kctrl_remove(_cfg)	_rsnd_kctrl_remove(&((_cfg).cfg))

511
int rsnd_kctrl_new_m(struct rsnd_mod *mod,
512
		     struct rsnd_dai_stream *io,
513 514
		     struct snd_soc_pcm_runtime *rtd,
		     const unsigned char *name,
515 516
		     void (*update)(struct rsnd_dai_stream *io,
				    struct rsnd_mod *mod),
517 518 519
		     struct rsnd_kctrl_cfg_m *_cfg,
		     u32 max);
int rsnd_kctrl_new_s(struct rsnd_mod *mod,
520
		     struct rsnd_dai_stream *io,
521 522
		     struct snd_soc_pcm_runtime *rtd,
		     const unsigned char *name,
523 524
		     void (*update)(struct rsnd_dai_stream *io,
				    struct rsnd_mod *mod),
525 526 527
		     struct rsnd_kctrl_cfg_s *_cfg,
		     u32 max);
int rsnd_kctrl_new_e(struct rsnd_mod *mod,
528
		     struct rsnd_dai_stream *io,
529 530 531
		     struct snd_soc_pcm_runtime *rtd,
		     const unsigned char *name,
		     struct rsnd_kctrl_cfg_s *_cfg,
532 533
		     void (*update)(struct rsnd_dai_stream *io,
				    struct rsnd_mod *mod),
534 535 536
		     const char * const *texts,
		     u32 max);

537
/*
538
 *	R-Car SRC
539
 */
540
int rsnd_src_probe(struct platform_device *pdev,
541
		   const struct rsnd_of_data *of_data,
542
		   struct rsnd_priv *priv);
543 544
void rsnd_src_remove(struct platform_device *pdev,
		     struct rsnd_priv *priv);
545 546
struct rsnd_mod *rsnd_src_mod_get(struct rsnd_priv *priv, int id);
unsigned int rsnd_src_get_ssi_rate(struct rsnd_priv *priv,
547
				   struct rsnd_dai_stream *io,
548
				   struct snd_pcm_runtime *runtime);
549
int rsnd_src_ssiu_start(struct rsnd_mod *ssi_mod,
550
			struct rsnd_dai_stream *io,
551
			int use_busif);
552 553
int rsnd_src_ssiu_stop(struct rsnd_mod *ssi_mod,
		       struct rsnd_dai_stream *io);
554 555
int rsnd_src_ssi_irq_enable(struct rsnd_mod *ssi_mod);
int rsnd_src_ssi_irq_disable(struct rsnd_mod *ssi_mod);
556

557
#define rsnd_src_nr(priv) ((priv)->src_nr)
558

559 560 561 562
/*
 *	R-Car SSI
 */
int rsnd_ssi_probe(struct platform_device *pdev,
563
		   const struct rsnd_of_data *of_data,
564
		   struct rsnd_priv *priv);
565 566
void rsnd_ssi_remove(struct platform_device *pdev,
		     struct rsnd_priv *priv);
567
struct rsnd_mod *rsnd_ssi_mod_get(struct rsnd_priv *priv, int id);
568
int rsnd_ssi_is_pin_sharing(struct rsnd_mod *mod);
569
int rsnd_ssi_is_dma_mode(struct rsnd_mod *mod);
570
int rsnd_ssi_use_busif(struct rsnd_dai_stream *io, struct rsnd_mod *mod);
571

K
Kuninori Morimoto 已提交
572 573 574 575 576 577 578 579 580 581 582 583 584
/*
 *	R-Car DVC
 */
int rsnd_dvc_probe(struct platform_device *pdev,
		   const struct rsnd_of_data *of_data,
		   struct rsnd_priv *priv);
void rsnd_dvc_remove(struct platform_device *pdev,
		     struct rsnd_priv *priv);
struct rsnd_mod *rsnd_dvc_mod_get(struct rsnd_priv *priv, int id);

#define rsnd_dvc_nr(priv) ((priv)->dvc_nr)


585
#endif