rsnd.h 13.7 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 160 161 162 163 164 165 166 167
/*
 *	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)
#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);
void rsnd_bset(struct rsnd_priv *priv, struct rsnd_mod *mod, enum rsnd_reg reg,
		    u32 mask, u32 data);
168
u32 rsnd_get_adinr(struct rsnd_mod *mod);
169

170 171 172 173 174 175
/*
 *	R-Car DMA
 */
struct rsnd_dma {
	struct sh_dmae_slave	slave;
	struct dma_chan		*chan;
176
	enum dma_transfer_direction dir;
177
	dma_addr_t		addr;
178 179 180 181 182 183
};

void rsnd_dma_start(struct rsnd_dma *dma);
void rsnd_dma_stop(struct rsnd_dma *dma);
int rsnd_dma_available(struct rsnd_dma *dma);
int rsnd_dma_init(struct rsnd_priv *priv, struct rsnd_dma *dma,
184
	int is_play, int id);
185 186 187 188
void  rsnd_dma_quit(struct rsnd_priv *priv,
		    struct rsnd_dma *dma);


189 190 191
/*
 *	R-Car sound mod
 */
192
enum rsnd_mod_type {
193
	RSND_MOD_SRC = 0,
194
	RSND_MOD_SSI,
K
Kuninori Morimoto 已提交
195
	RSND_MOD_DVC,
196 197
	RSND_MOD_MAX,
};
198 199 200

struct rsnd_mod_ops {
	char *name;
201
	char* (*dma_name)(struct rsnd_mod *mod);
202
	int (*probe)(struct rsnd_mod *mod,
203
		     struct rsnd_dai *rdai);
204
	int (*remove)(struct rsnd_mod *mod,
205
		      struct rsnd_dai *rdai);
206
	int (*init)(struct rsnd_mod *mod,
207
		    struct rsnd_dai *rdai);
208
	int (*quit)(struct rsnd_mod *mod,
209
		    struct rsnd_dai *rdai);
210
	int (*start)(struct rsnd_mod *mod,
211
		     struct rsnd_dai *rdai);
212
	int (*stop)(struct rsnd_mod *mod,
213
		    struct rsnd_dai *rdai);
K
Kuninori Morimoto 已提交
214 215 216
	int (*pcm_new)(struct rsnd_mod *mod,
		       struct rsnd_dai *rdai,
		       struct snd_soc_pcm_runtime *rtd);
217 218
	int (*fallback)(struct rsnd_mod *mod,
			struct rsnd_dai *rdai);
219 220
};

221
struct rsnd_dai_stream;
222 223
struct rsnd_mod {
	int id;
224
	enum rsnd_mod_type type;
225 226
	struct rsnd_priv *priv;
	struct rsnd_mod_ops *ops;
227
	struct rsnd_dma dma;
228
	struct rsnd_dai_stream *io;
229
	struct clk *clk;
230
	u32 status;
231
};
232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258
/*
 * status
 *
 * bit
 * 0	0: probe	1: remove
 * 1	0: init		1: quit
 * 2	0: start	1: stop
 * 3	0: pcm_new
 * 4	0: fallback
 */
#define __rsnd_mod_shift_probe		0
#define __rsnd_mod_shift_remove		0
#define __rsnd_mod_shift_init		1
#define __rsnd_mod_shift_quit		1
#define __rsnd_mod_shift_start		2
#define __rsnd_mod_shift_stop		2
#define __rsnd_mod_shift_pcm_new	3
#define __rsnd_mod_shift_fallback	4

#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
259 260

#define rsnd_mod_to_priv(mod) ((mod)->priv)
261 262
#define rsnd_mod_to_dma(mod) (&(mod)->dma)
#define rsnd_dma_to_mod(_dma) container_of((_dma), struct rsnd_mod, dma)
263
#define rsnd_mod_to_io(mod) ((mod)->io)
264
#define rsnd_mod_id(mod) ((mod)->id)
265 266
#define rsnd_mod_hw_start(mod)	clk_prepare_enable((mod)->clk)
#define rsnd_mod_hw_stop(mod)	clk_disable_unprepare((mod)->clk)
267 268 269 270

void rsnd_mod_init(struct rsnd_priv *priv,
		   struct rsnd_mod *mod,
		   struct rsnd_mod_ops *ops,
271
		   struct clk *clk,
272
		   enum rsnd_mod_type type,
273 274
		   int id);
char *rsnd_mod_name(struct rsnd_mod *mod);
275
char *rsnd_mod_dma_name(struct rsnd_mod *mod);
276

277 278 279 280 281 282
/*
 *	R-Car sound DAI
 */
#define RSND_DAI_NAME_SIZE	16
struct rsnd_dai_stream {
	struct snd_pcm_substream *substream;
283
	struct rsnd_mod *mod[RSND_MOD_MAX];
284
	struct rsnd_dai_path_info *info; /* rcar_snd.h */
285
	struct rsnd_dai *rdai;
286 287 288 289 290
	int byte_pos;
	int period_pos;
	int byte_per_period;
	int next_period_byte;
};
291
#define rsnd_io_to_mod_ssi(io)	((io)->mod[RSND_MOD_SSI])
292
#define rsnd_io_to_mod_src(io)	((io)->mod[RSND_MOD_SRC])
K
Kuninori Morimoto 已提交
293
#define rsnd_io_to_mod_dvc(io)	((io)->mod[RSND_MOD_DVC])
294
#define rsnd_io_to_rdai(io)	((io)->rdai)
295
#define rsnd_io_is_play(io)	(&rsnd_io_to_rdai(io)->playback == io)
296 297
#define rsnd_io_to_runtime(io) ((io)->substream ? \
				(io)->substream->runtime : NULL)
298

299

300 301 302 303 304
struct rsnd_dai {
	char name[RSND_DAI_NAME_SIZE];
	struct rsnd_dai_stream playback;
	struct rsnd_dai_stream capture;

305 306 307 308 309
	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;
310 311
};

312
#define rsnd_rdai_nr(priv) ((priv)->rdai_nr)
313
#define rsnd_rdai_is_clk_master(rdai) ((rdai)->clk_master)
314
#define for_each_rsnd_dai(rdai, priv, i)		\
315
	for (i = 0;					\
316
	     (i < rsnd_rdai_nr(priv)) &&		\
317
	     ((rdai) = rsnd_rdai_get(priv, i));		\
318
	     i++)
319

320 321
struct rsnd_dai *rsnd_rdai_get(struct rsnd_priv *priv, int id);

322 323 324
void rsnd_dai_pointer_update(struct rsnd_dai_stream *io, int cnt);
int rsnd_dai_pointer_offset(struct rsnd_dai_stream *io, int additional);

325 326 327 328
/*
 *	R-Car Gen1/Gen2
 */
int rsnd_gen_probe(struct platform_device *pdev,
329
		   const struct rsnd_of_data *of_data,
330 331 332 333
		   struct rsnd_priv *priv);
void __iomem *rsnd_gen_reg_get(struct rsnd_priv *priv,
			       struct rsnd_mod *mod,
			       enum rsnd_reg reg);
334 335 336
dma_addr_t rsnd_gen_dma_addr(struct rsnd_priv *priv,
		       struct rsnd_mod *mod,
		       int is_play,  int is_from);
337

338 339
#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)
340

341 342 343 344 345 346
/*
 *	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,
347
		   const struct rsnd_of_data *of_data,
348
		   struct rsnd_priv *priv);
349 350 351 352
int rsnd_adg_set_convert_clk_gen1(struct rsnd_priv *priv,
				  struct rsnd_mod *mod,
				  unsigned int src_rate,
				  unsigned int dst_rate);
353 354 355 356 357 358 359 360
int rsnd_adg_set_convert_clk_gen2(struct rsnd_mod *mod,
				  struct rsnd_dai *rdai,
				  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 *rdai,
				     struct rsnd_dai_stream *io);
K
Kuninori Morimoto 已提交
361 362 363
int rsnd_adg_set_cmd_timsel_gen2(struct rsnd_dai *rdai,
				 struct rsnd_mod *mod,
				 struct rsnd_dai_stream *io);
364

365 366 367
/*
 *	R-Car sound priv
 */
368 369 370 371
struct rsnd_of_data {
	u32 flags;
};

372 373
struct rsnd_priv {

374
	struct platform_device *pdev;
375 376 377
	struct rcar_snd_info *info;
	spinlock_t lock;

378 379 380 381 382
	/*
	 * below value will be filled on rsnd_gen_probe()
	 */
	void *gen;

383
	/*
384
	 * below value will be filled on rsnd_src_probe()
385
	 */
386 387
	void *src;
	int src_nr;
388

389 390 391 392 393
	/*
	 * below value will be filled on rsnd_adg_probe()
	 */
	void *adg;

394 395 396
	/*
	 * below value will be filled on rsnd_ssi_probe()
	 */
397 398
	void *ssi;
	int ssi_nr;
399

K
Kuninori Morimoto 已提交
400 401 402 403 404 405
	/*
	 * below value will be filled on rsnd_dvc_probe()
	 */
	void *dvc;
	int dvc_nr;

406 407 408 409 410
	/*
	 * below value will be filled on rsnd_dai_probe()
	 */
	struct snd_soc_dai_driver *daidrv;
	struct rsnd_dai *rdai;
411
	int rdai_nr;
412 413
};

414 415
#define rsnd_priv_to_pdev(priv)	((priv)->pdev)
#define rsnd_priv_to_dev(priv)	(&(rsnd_priv_to_pdev(priv)->dev))
416
#define rsnd_priv_to_info(priv)	((priv)->info)
417 418 419
#define rsnd_lock(priv, flags) spin_lock_irqsave(&priv->lock, flags)
#define rsnd_unlock(priv, flags) spin_unlock_irqrestore(&priv->lock, flags)

420 421 422 423 424 425 426 427 428 429 430 431 432
#define rsnd_info_is_playback(priv, type)				\
({									\
	struct rcar_snd_info *info = rsnd_priv_to_info(priv);		\
	int i, is_play = 0;						\
	for (i = 0; i < info->dai_info_nr; i++) {			\
		if (info->dai_info[i].playback.type == (type)->info) {	\
			is_play = 1;					\
			break;						\
		}							\
	}								\
	is_play;							\
})

433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477
/*
 *	rsnd_kctrl
 */
struct rsnd_kctrl_cfg {
	unsigned int max;
	unsigned int size;
	u32 *val;
	const char * const *texts;
	void (*update)(struct rsnd_mod *mod);
};

#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;
};

int rsnd_kctrl_new_m(struct rsnd_mod *mod,
		     struct rsnd_dai *rdai,
		     struct snd_soc_pcm_runtime *rtd,
		     const unsigned char *name,
		     void (*update)(struct rsnd_mod *mod),
		     struct rsnd_kctrl_cfg_m *_cfg,
		     u32 max);
int rsnd_kctrl_new_s(struct rsnd_mod *mod,
		     struct rsnd_dai *rdai,
		     struct snd_soc_pcm_runtime *rtd,
		     const unsigned char *name,
		     void (*update)(struct rsnd_mod *mod),
		     struct rsnd_kctrl_cfg_s *_cfg,
		     u32 max);
int rsnd_kctrl_new_e(struct rsnd_mod *mod,
		     struct rsnd_dai *rdai,
		     struct snd_soc_pcm_runtime *rtd,
		     const unsigned char *name,
		     struct rsnd_kctrl_cfg_s *_cfg,
		     void (*update)(struct rsnd_mod *mod),
		     const char * const *texts,
		     u32 max);

478
/*
479
 *	R-Car SRC
480
 */
481
int rsnd_src_probe(struct platform_device *pdev,
482
		   const struct rsnd_of_data *of_data,
483
		   struct rsnd_priv *priv);
484 485
struct rsnd_mod *rsnd_src_mod_get(struct rsnd_priv *priv, int id);
unsigned int rsnd_src_get_ssi_rate(struct rsnd_priv *priv,
486
				   struct rsnd_dai_stream *io,
487
				   struct snd_pcm_runtime *runtime);
488 489 490 491
int rsnd_src_ssiu_start(struct rsnd_mod *ssi_mod,
			struct rsnd_dai *rdai,
			int use_busif);
int rsnd_src_ssiu_stop(struct rsnd_mod *ssi_mod,
492
		       struct rsnd_dai *rdai);
493
int rsnd_src_ssi_irq_enable(struct rsnd_mod *ssi_mod,
494
			    struct rsnd_dai *rdai);
495 496
int rsnd_src_ssi_irq_disable(struct rsnd_mod *ssi_mod,
			     struct rsnd_dai *rdai);
497

498
#define rsnd_src_nr(priv) ((priv)->src_nr)
499

500 501 502 503
/*
 *	R-Car SSI
 */
int rsnd_ssi_probe(struct platform_device *pdev,
504
		   const struct rsnd_of_data *of_data,
505 506
		   struct rsnd_priv *priv);
struct rsnd_mod *rsnd_ssi_mod_get(struct rsnd_priv *priv, int id);
507
int rsnd_ssi_is_pin_sharing(struct rsnd_mod *mod);
508
int rsnd_ssi_is_dma_mode(struct rsnd_mod *mod);
509

K
Kuninori Morimoto 已提交
510 511 512 513 514 515 516 517 518 519 520 521 522
/*
 *	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)


523
#endif