1 /* 2 * Renesas R-Car 3 * 4 * Copyright (C) 2013 Renesas Solutions Corp. 5 * Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> 6 * 7 * This program is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License version 2 as 9 * published by the Free Software Foundation. 10 */ 11 #ifndef RSND_H 12 #define RSND_H 13 14 #include <linux/clk.h> 15 #include <linux/device.h> 16 #include <linux/dma-mapping.h> 17 #include <linux/io.h> 18 #include <linux/list.h> 19 #include <linux/module.h> 20 #include <linux/of_device.h> 21 #include <linux/of_irq.h> 22 #include <linux/sh_dma.h> 23 #include <linux/workqueue.h> 24 #include <sound/soc.h> 25 #include <sound/pcm_params.h> 26 27 #define RSND_GEN1_SRU 0 28 #define RSND_GEN1_ADG 1 29 #define RSND_GEN1_SSI 2 30 31 #define RSND_GEN2_SCU 0 32 #define RSND_GEN2_ADG 1 33 #define RSND_GEN2_SSIU 2 34 #define RSND_GEN2_SSI 3 35 36 #define RSND_BASE_MAX 4 37 38 /* 39 * pseudo register 40 * 41 * The register address offsets SRU/SCU/SSIU on Gen1/Gen2 are very different. 42 * This driver uses pseudo register in order to hide it. 43 * see gen1/gen2 for detail 44 */ 45 enum rsnd_reg { 46 /* SCU (SRC/SSIU/MIX/CTU/DVC) */ 47 RSND_REG_SSI_MODE0, 48 RSND_REG_SSI_MODE1, 49 RSND_REG_SSI_CTRL, /* Gen2 only */ 50 RSND_REG_SSI_BUSIF_MODE, /* Gen2 only */ 51 RSND_REG_SSI_BUSIF_ADINR, /* Gen2 only */ 52 RSND_REG_SSI_BUSIF_DALIGN, /* Gen2 only */ 53 RSND_REG_SSI_INT_ENABLE, /* Gen2 only */ 54 RSND_REG_SRC_I_BUSIF_MODE, 55 RSND_REG_SRC_O_BUSIF_MODE, 56 RSND_REG_SRC_ROUTE_MODE0, 57 RSND_REG_SRC_SWRSR, 58 RSND_REG_SRC_SRCIR, 59 RSND_REG_SRC_ADINR, 60 RSND_REG_SRC_IFSCR, 61 RSND_REG_SRC_IFSVR, 62 RSND_REG_SRC_SRCCR, 63 RSND_REG_SRC_CTRL, /* Gen2 only */ 64 RSND_REG_SRC_BSDSR, /* Gen2 only */ 65 RSND_REG_SRC_BSISR, /* Gen2 only */ 66 RSND_REG_SRC_INT_ENABLE0, /* Gen2 only */ 67 RSND_REG_SRC_BUSIF_DALIGN, /* Gen2 only */ 68 RSND_REG_SRCIN_TIMSEL0, /* Gen2 only */ 69 RSND_REG_SRCIN_TIMSEL1, /* Gen2 only */ 70 RSND_REG_SRCIN_TIMSEL2, /* Gen2 only */ 71 RSND_REG_SRCIN_TIMSEL3, /* Gen2 only */ 72 RSND_REG_SRCIN_TIMSEL4, /* Gen2 only */ 73 RSND_REG_SRCOUT_TIMSEL0, /* Gen2 only */ 74 RSND_REG_SRCOUT_TIMSEL1, /* Gen2 only */ 75 RSND_REG_SRCOUT_TIMSEL2, /* Gen2 only */ 76 RSND_REG_SRCOUT_TIMSEL3, /* Gen2 only */ 77 RSND_REG_SRCOUT_TIMSEL4, /* Gen2 only */ 78 RSND_REG_SCU_SYS_STATUS0, 79 RSND_REG_SCU_SYS_STATUS1, /* Gen2 only */ 80 RSND_REG_SCU_SYS_INT_EN0, 81 RSND_REG_SCU_SYS_INT_EN1, /* Gen2 only */ 82 RSND_REG_CMD_CTRL, /* Gen2 only */ 83 RSND_REG_CMD_ROUTE_SLCT, 84 RSND_REG_CMDOUT_TIMSEL, /* Gen2 only */ 85 RSND_REG_CTU_CTUIR, 86 RSND_REG_CTU_ADINR, 87 RSND_REG_MIX_SWRSR, 88 RSND_REG_MIX_MIXIR, 89 RSND_REG_MIX_ADINR, 90 RSND_REG_MIX_MIXMR, 91 RSND_REG_MIX_MVPDR, 92 RSND_REG_MIX_MDBAR, 93 RSND_REG_MIX_MDBBR, 94 RSND_REG_MIX_MDBCR, 95 RSND_REG_MIX_MDBDR, 96 RSND_REG_MIX_MDBER, 97 RSND_REG_DVC_SWRSR, 98 RSND_REG_DVC_DVUIR, 99 RSND_REG_DVC_ADINR, 100 RSND_REG_DVC_DVUCR, 101 RSND_REG_DVC_ZCMCR, 102 RSND_REG_DVC_VOL0R, 103 RSND_REG_DVC_VOL1R, 104 RSND_REG_DVC_VOL2R, 105 RSND_REG_DVC_VOL3R, 106 RSND_REG_DVC_VOL4R, 107 RSND_REG_DVC_VOL5R, 108 RSND_REG_DVC_VOL6R, 109 RSND_REG_DVC_VOL7R, 110 RSND_REG_DVC_DVUER, 111 RSND_REG_DVC_VRCTR, /* Gen2 only */ 112 RSND_REG_DVC_VRPDR, /* Gen2 only */ 113 RSND_REG_DVC_VRDBR, /* Gen2 only */ 114 115 /* ADG */ 116 RSND_REG_BRRA, 117 RSND_REG_BRRB, 118 RSND_REG_SSICKR, 119 RSND_REG_DIV_EN, /* Gen2 only */ 120 RSND_REG_AUDIO_CLK_SEL0, 121 RSND_REG_AUDIO_CLK_SEL1, 122 RSND_REG_AUDIO_CLK_SEL2, /* Gen2 only */ 123 124 /* SSI */ 125 RSND_REG_SSICR, 126 RSND_REG_SSISR, 127 RSND_REG_SSITDR, 128 RSND_REG_SSIRDR, 129 RSND_REG_SSIWSR, 130 131 RSND_REG_MAX, 132 }; 133 134 struct rsnd_priv; 135 struct rsnd_mod; 136 struct rsnd_dai; 137 struct rsnd_dai_stream; 138 139 /* 140 * R-Car basic functions 141 */ 142 #define rsnd_mod_read(m, r) \ 143 rsnd_read(rsnd_mod_to_priv(m), m, RSND_REG_##r) 144 #define rsnd_mod_write(m, r, d) \ 145 rsnd_write(rsnd_mod_to_priv(m), m, RSND_REG_##r, d) 146 #define rsnd_mod_force_write(m, r, d) \ 147 rsnd_force_write(rsnd_mod_to_priv(m), m, RSND_REG_##r, d) 148 #define rsnd_mod_bset(m, r, s, d) \ 149 rsnd_bset(rsnd_mod_to_priv(m), m, RSND_REG_##r, s, d) 150 151 u32 rsnd_read(struct rsnd_priv *priv, struct rsnd_mod *mod, enum rsnd_reg reg); 152 void rsnd_write(struct rsnd_priv *priv, struct rsnd_mod *mod, 153 enum rsnd_reg reg, u32 data); 154 void rsnd_force_write(struct rsnd_priv *priv, struct rsnd_mod *mod, 155 enum rsnd_reg reg, u32 data); 156 void rsnd_bset(struct rsnd_priv *priv, struct rsnd_mod *mod, enum rsnd_reg reg, 157 u32 mask, u32 data); 158 u32 rsnd_get_adinr_bit(struct rsnd_mod *mod, struct rsnd_dai_stream *io); 159 u32 rsnd_get_adinr_chan(struct rsnd_mod *mod, struct rsnd_dai_stream *io); 160 u32 rsnd_get_dalign(struct rsnd_mod *mod, struct rsnd_dai_stream *io); 161 162 /* 163 * R-Car DMA 164 */ 165 struct rsnd_mod *rsnd_dma_attach(struct rsnd_dai_stream *io, 166 struct rsnd_mod *mod, int id); 167 int rsnd_dma_probe(struct rsnd_priv *priv); 168 struct dma_chan *rsnd_dma_request_channel(struct device_node *of_node, 169 struct rsnd_mod *mod, char *name); 170 171 /* 172 * R-Car sound mod 173 */ 174 enum rsnd_mod_type { 175 RSND_MOD_AUDMAPP, 176 RSND_MOD_AUDMA, 177 RSND_MOD_DVC, 178 RSND_MOD_MIX, 179 RSND_MOD_CTU, 180 RSND_MOD_CMD, 181 RSND_MOD_SRC, 182 RSND_MOD_SSIU, 183 RSND_MOD_SSIP, /* SSI parent */ 184 RSND_MOD_SSI, 185 RSND_MOD_MAX, 186 }; 187 188 struct rsnd_mod_ops { 189 char *name; 190 struct dma_chan* (*dma_req)(struct rsnd_dai_stream *io, 191 struct rsnd_mod *mod); 192 int (*probe)(struct rsnd_mod *mod, 193 struct rsnd_dai_stream *io, 194 struct rsnd_priv *priv); 195 int (*remove)(struct rsnd_mod *mod, 196 struct rsnd_dai_stream *io, 197 struct rsnd_priv *priv); 198 int (*init)(struct rsnd_mod *mod, 199 struct rsnd_dai_stream *io, 200 struct rsnd_priv *priv); 201 int (*quit)(struct rsnd_mod *mod, 202 struct rsnd_dai_stream *io, 203 struct rsnd_priv *priv); 204 int (*start)(struct rsnd_mod *mod, 205 struct rsnd_dai_stream *io, 206 struct rsnd_priv *priv); 207 int (*stop)(struct rsnd_mod *mod, 208 struct rsnd_dai_stream *io, 209 struct rsnd_priv *priv); 210 int (*pcm_new)(struct rsnd_mod *mod, 211 struct rsnd_dai_stream *io, 212 struct snd_soc_pcm_runtime *rtd); 213 int (*hw_params)(struct rsnd_mod *mod, 214 struct rsnd_dai_stream *io, 215 struct snd_pcm_substream *substream, 216 struct snd_pcm_hw_params *hw_params); 217 int (*fallback)(struct rsnd_mod *mod, 218 struct rsnd_dai_stream *io, 219 struct rsnd_priv *priv); 220 }; 221 222 struct rsnd_dai_stream; 223 struct rsnd_mod { 224 int id; 225 enum rsnd_mod_type type; 226 struct rsnd_mod_ops *ops; 227 struct rsnd_priv *priv; 228 struct clk *clk; 229 }; 230 /* 231 * status 232 * 233 * 0xH0000CBA 234 * 235 * A 0: probe 1: remove 236 * B 0: init 1: quit 237 * C 0: start 1: stop 238 * 239 * H is always called (see __rsnd_mod_call) 240 * H 0: pcm_new 241 * H 0: fallback 242 * H 0: hw_params 243 */ 244 #define __rsnd_mod_shift_probe 0 245 #define __rsnd_mod_shift_remove 0 246 #define __rsnd_mod_shift_init 4 247 #define __rsnd_mod_shift_quit 4 248 #define __rsnd_mod_shift_start 8 249 #define __rsnd_mod_shift_stop 8 250 #define __rsnd_mod_shift_pcm_new 28 /* always called */ 251 #define __rsnd_mod_shift_fallback 28 /* always called */ 252 #define __rsnd_mod_shift_hw_params 28 /* always called */ 253 254 #define __rsnd_mod_add_probe 1 255 #define __rsnd_mod_add_remove -1 256 #define __rsnd_mod_add_init 1 257 #define __rsnd_mod_add_quit -1 258 #define __rsnd_mod_add_start 1 259 #define __rsnd_mod_add_stop -1 260 #define __rsnd_mod_add_pcm_new 0 261 #define __rsnd_mod_add_fallback 0 262 #define __rsnd_mod_add_hw_params 0 263 264 #define __rsnd_mod_call_probe 0 265 #define __rsnd_mod_call_remove 1 266 #define __rsnd_mod_call_init 0 267 #define __rsnd_mod_call_quit 1 268 #define __rsnd_mod_call_start 0 269 #define __rsnd_mod_call_stop 1 270 #define __rsnd_mod_call_pcm_new 0 271 #define __rsnd_mod_call_fallback 0 272 #define __rsnd_mod_call_hw_params 0 273 274 #define rsnd_mod_to_priv(mod) ((mod)->priv) 275 #define rsnd_mod_id(mod) ((mod) ? (mod)->id : -1) 276 #define rsnd_mod_power_on(mod) clk_enable((mod)->clk) 277 #define rsnd_mod_power_off(mod) clk_disable((mod)->clk) 278 #define rsnd_mod_get(ip) (&(ip)->mod) 279 280 int rsnd_mod_init(struct rsnd_priv *priv, 281 struct rsnd_mod *mod, 282 struct rsnd_mod_ops *ops, 283 struct clk *clk, 284 enum rsnd_mod_type type, 285 int id); 286 void rsnd_mod_quit(struct rsnd_mod *mod); 287 char *rsnd_mod_name(struct rsnd_mod *mod); 288 struct dma_chan *rsnd_mod_dma_req(struct rsnd_dai_stream *io, 289 struct rsnd_mod *mod); 290 void rsnd_mod_interrupt(struct rsnd_mod *mod, 291 void (*callback)(struct rsnd_mod *mod, 292 struct rsnd_dai_stream *io)); 293 294 int rsnd_get_slot_rdai(struct rsnd_dai *rdai); 295 int rsnd_get_slot_runtime(struct rsnd_dai_stream *io); 296 int rsnd_get_slot_extend(struct rsnd_dai_stream *io); 297 298 /* 299 * R-Car sound DAI 300 */ 301 #define RSND_DAI_NAME_SIZE 16 302 struct rsnd_dai_stream { 303 char name[RSND_DAI_NAME_SIZE]; 304 struct snd_pcm_substream *substream; 305 struct rsnd_mod *mod[RSND_MOD_MAX]; 306 struct rsnd_dai_path_info *info; /* rcar_snd.h */ 307 struct rsnd_dai *rdai; 308 u32 mod_status[RSND_MOD_MAX]; 309 int byte_pos; 310 int period_pos; 311 int byte_per_period; 312 int next_period_byte; 313 }; 314 #define rsnd_io_to_mod(io, i) ((i) < RSND_MOD_MAX ? (io)->mod[(i)] : NULL) 315 #define rsnd_io_to_mod_ssi(io) rsnd_io_to_mod((io), RSND_MOD_SSI) 316 #define rsnd_io_to_mod_ssip(io) rsnd_io_to_mod((io), RSND_MOD_SSIP) 317 #define rsnd_io_to_mod_src(io) rsnd_io_to_mod((io), RSND_MOD_SRC) 318 #define rsnd_io_to_mod_ctu(io) rsnd_io_to_mod((io), RSND_MOD_CTU) 319 #define rsnd_io_to_mod_mix(io) rsnd_io_to_mod((io), RSND_MOD_MIX) 320 #define rsnd_io_to_mod_dvc(io) rsnd_io_to_mod((io), RSND_MOD_DVC) 321 #define rsnd_io_to_rdai(io) ((io)->rdai) 322 #define rsnd_io_to_priv(io) (rsnd_rdai_to_priv(rsnd_io_to_rdai(io))) 323 #define rsnd_io_is_play(io) (&rsnd_io_to_rdai(io)->playback == io) 324 #define rsnd_io_to_runtime(io) ((io)->substream ? \ 325 (io)->substream->runtime : NULL) 326 int rsnd_io_is_working(struct rsnd_dai_stream *io); 327 328 struct rsnd_dai { 329 char name[RSND_DAI_NAME_SIZE]; 330 struct rsnd_dai_stream playback; 331 struct rsnd_dai_stream capture; 332 struct rsnd_priv *priv; 333 334 int slots; 335 336 unsigned int clk_master:1; 337 unsigned int bit_clk_inv:1; 338 unsigned int frm_clk_inv:1; 339 unsigned int sys_delay:1; 340 unsigned int data_alignment:1; 341 }; 342 343 #define rsnd_rdai_nr(priv) ((priv)->rdai_nr) 344 #define rsnd_rdai_is_clk_master(rdai) ((rdai)->clk_master) 345 #define rsnd_rdai_to_priv(rdai) ((rdai)->priv) 346 #define for_each_rsnd_dai(rdai, priv, i) \ 347 for (i = 0; \ 348 (i < rsnd_rdai_nr(priv)) && \ 349 ((rdai) = rsnd_rdai_get(priv, i)); \ 350 i++) 351 352 struct rsnd_dai *rsnd_rdai_get(struct rsnd_priv *priv, int id); 353 354 bool rsnd_dai_pointer_update(struct rsnd_dai_stream *io, int cnt); 355 void rsnd_dai_period_elapsed(struct rsnd_dai_stream *io); 356 int rsnd_dai_pointer_offset(struct rsnd_dai_stream *io, int additional); 357 int rsnd_dai_connect(struct rsnd_mod *mod, 358 struct rsnd_dai_stream *io, 359 enum rsnd_mod_type type); 360 #define rsnd_dai_of_node(priv) \ 361 of_get_child_by_name(rsnd_priv_to_dev(priv)->of_node, "rcar_sound,dai") 362 363 /* 364 * R-Car Gen1/Gen2 365 */ 366 int rsnd_gen_probe(struct rsnd_priv *priv); 367 void __iomem *rsnd_gen_reg_get(struct rsnd_priv *priv, 368 struct rsnd_mod *mod, 369 enum rsnd_reg reg); 370 phys_addr_t rsnd_gen_get_phy_addr(struct rsnd_priv *priv, int reg_id); 371 372 /* 373 * R-Car ADG 374 */ 375 int rsnd_adg_ssi_clk_stop(struct rsnd_mod *mod); 376 int rsnd_adg_ssi_clk_try_start(struct rsnd_mod *mod, unsigned int rate); 377 int rsnd_adg_probe(struct rsnd_priv *priv); 378 void rsnd_adg_remove(struct rsnd_priv *priv); 379 int rsnd_adg_set_convert_clk_gen2(struct rsnd_mod *mod, 380 struct rsnd_dai_stream *io, 381 unsigned int src_rate, 382 unsigned int dst_rate); 383 int rsnd_adg_set_convert_timing_gen2(struct rsnd_mod *mod, 384 struct rsnd_dai_stream *io); 385 int rsnd_adg_set_cmd_timsel_gen2(struct rsnd_mod *mod, 386 struct rsnd_dai_stream *io); 387 388 /* 389 * R-Car sound priv 390 */ 391 struct rsnd_priv { 392 393 struct platform_device *pdev; 394 spinlock_t lock; 395 unsigned long flags; 396 #define RSND_GEN_MASK (0xF << 0) 397 #define RSND_GEN1 (1 << 0) 398 #define RSND_GEN2 (2 << 0) 399 400 /* 401 * below value will be filled on rsnd_gen_probe() 402 */ 403 void *gen; 404 405 /* 406 * below value will be filled on rsnd_adg_probe() 407 */ 408 void *adg; 409 410 /* 411 * below value will be filled on rsnd_dma_probe() 412 */ 413 void *dma; 414 415 /* 416 * below value will be filled on rsnd_ssi_probe() 417 */ 418 void *ssi; 419 int ssi_nr; 420 421 /* 422 * below value will be filled on rsnd_ssiu_probe() 423 */ 424 void *ssiu; 425 int ssiu_nr; 426 427 /* 428 * below value will be filled on rsnd_src_probe() 429 */ 430 void *src; 431 int src_nr; 432 433 /* 434 * below value will be filled on rsnd_ctu_probe() 435 */ 436 void *ctu; 437 int ctu_nr; 438 439 /* 440 * below value will be filled on rsnd_mix_probe() 441 */ 442 void *mix; 443 int mix_nr; 444 445 /* 446 * below value will be filled on rsnd_dvc_probe() 447 */ 448 void *dvc; 449 int dvc_nr; 450 451 /* 452 * below value will be filled on rsnd_cmd_probe() 453 */ 454 void *cmd; 455 int cmd_nr; 456 457 /* 458 * below value will be filled on rsnd_dai_probe() 459 */ 460 struct snd_soc_dai_driver *daidrv; 461 struct rsnd_dai *rdai; 462 int rdai_nr; 463 }; 464 465 #define rsnd_priv_to_pdev(priv) ((priv)->pdev) 466 #define rsnd_priv_to_dev(priv) (&(rsnd_priv_to_pdev(priv)->dev)) 467 468 #define rsnd_is_gen1(priv) (((priv)->flags & RSND_GEN_MASK) == RSND_GEN1) 469 #define rsnd_is_gen2(priv) (((priv)->flags & RSND_GEN_MASK) == RSND_GEN2) 470 471 /* 472 * rsnd_kctrl 473 */ 474 struct rsnd_kctrl_cfg { 475 unsigned int max; 476 unsigned int size; 477 u32 *val; 478 const char * const *texts; 479 void (*update)(struct rsnd_dai_stream *io, struct rsnd_mod *mod); 480 struct rsnd_dai_stream *io; 481 struct snd_card *card; 482 struct snd_kcontrol *kctrl; 483 }; 484 485 #define RSND_DVC_CHANNELS 8 486 struct rsnd_kctrl_cfg_m { 487 struct rsnd_kctrl_cfg cfg; 488 u32 val[RSND_DVC_CHANNELS]; 489 }; 490 491 struct rsnd_kctrl_cfg_s { 492 struct rsnd_kctrl_cfg cfg; 493 u32 val; 494 }; 495 496 void _rsnd_kctrl_remove(struct rsnd_kctrl_cfg *cfg); 497 #define rsnd_kctrl_remove(_cfg) _rsnd_kctrl_remove(&((_cfg).cfg)) 498 499 int rsnd_kctrl_new_m(struct rsnd_mod *mod, 500 struct rsnd_dai_stream *io, 501 struct snd_soc_pcm_runtime *rtd, 502 const unsigned char *name, 503 void (*update)(struct rsnd_dai_stream *io, 504 struct rsnd_mod *mod), 505 struct rsnd_kctrl_cfg_m *_cfg, 506 int ch_size, 507 u32 max); 508 int rsnd_kctrl_new_s(struct rsnd_mod *mod, 509 struct rsnd_dai_stream *io, 510 struct snd_soc_pcm_runtime *rtd, 511 const unsigned char *name, 512 void (*update)(struct rsnd_dai_stream *io, 513 struct rsnd_mod *mod), 514 struct rsnd_kctrl_cfg_s *_cfg, 515 u32 max); 516 int rsnd_kctrl_new_e(struct rsnd_mod *mod, 517 struct rsnd_dai_stream *io, 518 struct snd_soc_pcm_runtime *rtd, 519 const unsigned char *name, 520 struct rsnd_kctrl_cfg_s *_cfg, 521 void (*update)(struct rsnd_dai_stream *io, 522 struct rsnd_mod *mod), 523 const char * const *texts, 524 u32 max); 525 526 /* 527 * R-Car SSI 528 */ 529 int rsnd_ssi_probe(struct rsnd_priv *priv); 530 void rsnd_ssi_remove(struct rsnd_priv *priv); 531 struct rsnd_mod *rsnd_ssi_mod_get(struct rsnd_priv *priv, int id); 532 int rsnd_ssi_is_dma_mode(struct rsnd_mod *mod); 533 int rsnd_ssi_use_busif(struct rsnd_dai_stream *io); 534 535 #define rsnd_ssi_is_pin_sharing(io) \ 536 __rsnd_ssi_is_pin_sharing(rsnd_io_to_mod_ssi(io)) 537 int __rsnd_ssi_is_pin_sharing(struct rsnd_mod *mod); 538 539 #define rsnd_ssi_of_node(priv) \ 540 of_get_child_by_name(rsnd_priv_to_dev(priv)->of_node, "rcar_sound,ssi") 541 542 /* 543 * R-Car SSIU 544 */ 545 int rsnd_ssiu_attach(struct rsnd_dai_stream *io, 546 struct rsnd_mod *mod); 547 int rsnd_ssiu_probe(struct rsnd_priv *priv); 548 void rsnd_ssiu_remove(struct rsnd_priv *priv); 549 550 /* 551 * R-Car SRC 552 */ 553 int rsnd_src_probe(struct rsnd_priv *priv); 554 void rsnd_src_remove(struct rsnd_priv *priv); 555 struct rsnd_mod *rsnd_src_mod_get(struct rsnd_priv *priv, int id); 556 unsigned int rsnd_src_get_ssi_rate(struct rsnd_priv *priv, 557 struct rsnd_dai_stream *io, 558 struct snd_pcm_runtime *runtime); 559 #define rsnd_src_of_node(priv) \ 560 of_get_child_by_name(rsnd_priv_to_dev(priv)->of_node, "rcar_sound,src") 561 562 /* 563 * R-Car CTU 564 */ 565 int rsnd_ctu_probe(struct rsnd_priv *priv); 566 void rsnd_ctu_remove(struct rsnd_priv *priv); 567 struct rsnd_mod *rsnd_ctu_mod_get(struct rsnd_priv *priv, int id); 568 #define rsnd_ctu_of_node(priv) \ 569 of_get_child_by_name(rsnd_priv_to_dev(priv)->of_node, "rcar_sound,ctu") 570 571 /* 572 * R-Car MIX 573 */ 574 int rsnd_mix_probe(struct rsnd_priv *priv); 575 void rsnd_mix_remove(struct rsnd_priv *priv); 576 struct rsnd_mod *rsnd_mix_mod_get(struct rsnd_priv *priv, int id); 577 #define rsnd_mix_of_node(priv) \ 578 of_get_child_by_name(rsnd_priv_to_dev(priv)->of_node, "rcar_sound,mix") 579 580 /* 581 * R-Car DVC 582 */ 583 int rsnd_dvc_probe(struct rsnd_priv *priv); 584 void rsnd_dvc_remove(struct rsnd_priv *priv); 585 struct rsnd_mod *rsnd_dvc_mod_get(struct rsnd_priv *priv, int id); 586 #define rsnd_dvc_of_node(priv) \ 587 of_get_child_by_name(rsnd_priv_to_dev(priv)->of_node, "rcar_sound,dvc") 588 589 /* 590 * R-Car CMD 591 */ 592 int rsnd_cmd_probe(struct rsnd_priv *priv); 593 void rsnd_cmd_remove(struct rsnd_priv *priv); 594 int rsnd_cmd_attach(struct rsnd_dai_stream *io, int id); 595 struct rsnd_mod *rsnd_cmd_mod_get(struct rsnd_priv *priv, int id); 596 597 #ifdef DEBUG 598 void rsnd_mod_make_sure(struct rsnd_mod *mod, enum rsnd_mod_type type); 599 #define rsnd_mod_confirm_ssi(mssi) rsnd_mod_make_sure(mssi, RSND_MOD_SSI) 600 #define rsnd_mod_confirm_src(msrc) rsnd_mod_make_sure(msrc, RSND_MOD_SRC) 601 #define rsnd_mod_confirm_dvc(mdvc) rsnd_mod_make_sure(mdvc, RSND_MOD_DVC) 602 #else 603 #define rsnd_mod_confirm_ssi(mssi) 604 #define rsnd_mod_confirm_src(msrc) 605 #define rsnd_mod_confirm_dvc(mdvc) 606 #endif 607 608 #endif 609