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