root/sound/soc/sh/rcar/rsnd.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   1 // SPDX-License-Identifier: GPL-2.0
   2 //
   3 // Renesas R-Car
   4 //
   5 // Copyright (C) 2013 Renesas Solutions Corp.
   6 // Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
   7 
   8 #ifndef RSND_H
   9 #define RSND_H
  10 
  11 #include <linux/clk.h>
  12 #include <linux/device.h>
  13 #include <linux/dma-mapping.h>
  14 #include <linux/io.h>
  15 #include <linux/list.h>
  16 #include <linux/module.h>
  17 #include <linux/of_device.h>
  18 #include <linux/of_graph.h>
  19 #include <linux/of_irq.h>
  20 #include <linux/sh_dma.h>
  21 #include <linux/workqueue.h>
  22 #include <sound/soc.h>
  23 #include <sound/pcm_params.h>
  24 
  25 #define RSND_GEN1_SRU   0
  26 #define RSND_GEN1_ADG   1
  27 #define RSND_GEN1_SSI   2
  28 
  29 #define RSND_GEN2_SCU   0
  30 #define RSND_GEN2_ADG   1
  31 #define RSND_GEN2_SSIU  2
  32 #define RSND_GEN2_SSI   3
  33 
  34 #define RSND_BASE_MAX   4
  35 
  36 /*
  37  *      pseudo register
  38  *
  39  * The register address offsets SRU/SCU/SSIU on Gen1/Gen2 are very different.
  40  * This driver uses pseudo register in order to hide it.
  41  * see gen1/gen2 for detail
  42  */
  43 enum rsnd_reg {
  44         /* SCU (MIX/CTU/DVC) */
  45         SRC_I_BUSIF_MODE,
  46         SRC_O_BUSIF_MODE,
  47         SRC_ROUTE_MODE0,
  48         SRC_SWRSR,
  49         SRC_SRCIR,
  50         SRC_ADINR,
  51         SRC_IFSCR,
  52         SRC_IFSVR,
  53         SRC_SRCCR,
  54         SRC_CTRL,
  55         SRC_BSDSR,
  56         SRC_BSISR,
  57         SRC_INT_ENABLE0,
  58         SRC_BUSIF_DALIGN,
  59         SRCIN_TIMSEL0,
  60         SRCIN_TIMSEL1,
  61         SRCIN_TIMSEL2,
  62         SRCIN_TIMSEL3,
  63         SRCIN_TIMSEL4,
  64         SRCOUT_TIMSEL0,
  65         SRCOUT_TIMSEL1,
  66         SRCOUT_TIMSEL2,
  67         SRCOUT_TIMSEL3,
  68         SRCOUT_TIMSEL4,
  69         SCU_SYS_STATUS0,
  70         SCU_SYS_STATUS1,
  71         SCU_SYS_INT_EN0,
  72         SCU_SYS_INT_EN1,
  73         CMD_CTRL,
  74         CMD_BUSIF_MODE,
  75         CMD_BUSIF_DALIGN,
  76         CMD_ROUTE_SLCT,
  77         CMDOUT_TIMSEL,
  78         CTU_SWRSR,
  79         CTU_CTUIR,
  80         CTU_ADINR,
  81         CTU_CPMDR,
  82         CTU_SCMDR,
  83         CTU_SV00R,
  84         CTU_SV01R,
  85         CTU_SV02R,
  86         CTU_SV03R,
  87         CTU_SV04R,
  88         CTU_SV05R,
  89         CTU_SV06R,
  90         CTU_SV07R,
  91         CTU_SV10R,
  92         CTU_SV11R,
  93         CTU_SV12R,
  94         CTU_SV13R,
  95         CTU_SV14R,
  96         CTU_SV15R,
  97         CTU_SV16R,
  98         CTU_SV17R,
  99         CTU_SV20R,
 100         CTU_SV21R,
 101         CTU_SV22R,
 102         CTU_SV23R,
 103         CTU_SV24R,
 104         CTU_SV25R,
 105         CTU_SV26R,
 106         CTU_SV27R,
 107         CTU_SV30R,
 108         CTU_SV31R,
 109         CTU_SV32R,
 110         CTU_SV33R,
 111         CTU_SV34R,
 112         CTU_SV35R,
 113         CTU_SV36R,
 114         CTU_SV37R,
 115         MIX_SWRSR,
 116         MIX_MIXIR,
 117         MIX_ADINR,
 118         MIX_MIXMR,
 119         MIX_MVPDR,
 120         MIX_MDBAR,
 121         MIX_MDBBR,
 122         MIX_MDBCR,
 123         MIX_MDBDR,
 124         MIX_MDBER,
 125         DVC_SWRSR,
 126         DVC_DVUIR,
 127         DVC_ADINR,
 128         DVC_DVUCR,
 129         DVC_ZCMCR,
 130         DVC_VOL0R,
 131         DVC_VOL1R,
 132         DVC_VOL2R,
 133         DVC_VOL3R,
 134         DVC_VOL4R,
 135         DVC_VOL5R,
 136         DVC_VOL6R,
 137         DVC_VOL7R,
 138         DVC_DVUER,
 139         DVC_VRCTR,
 140         DVC_VRPDR,
 141         DVC_VRDBR,
 142 
 143         /* ADG */
 144         BRRA,
 145         BRRB,
 146         BRGCKR,
 147         DIV_EN,
 148         AUDIO_CLK_SEL0,
 149         AUDIO_CLK_SEL1,
 150         AUDIO_CLK_SEL2,
 151 
 152         /* SSIU */
 153         SSI_MODE,
 154         SSI_MODE0,
 155         SSI_MODE1,
 156         SSI_MODE2,
 157         SSI_CONTROL,
 158         SSI_CTRL,
 159         SSI_BUSIF0_MODE,
 160         SSI_BUSIF1_MODE,
 161         SSI_BUSIF2_MODE,
 162         SSI_BUSIF3_MODE,
 163         SSI_BUSIF4_MODE,
 164         SSI_BUSIF5_MODE,
 165         SSI_BUSIF6_MODE,
 166         SSI_BUSIF7_MODE,
 167         SSI_BUSIF0_ADINR,
 168         SSI_BUSIF1_ADINR,
 169         SSI_BUSIF2_ADINR,
 170         SSI_BUSIF3_ADINR,
 171         SSI_BUSIF4_ADINR,
 172         SSI_BUSIF5_ADINR,
 173         SSI_BUSIF6_ADINR,
 174         SSI_BUSIF7_ADINR,
 175         SSI_BUSIF0_DALIGN,
 176         SSI_BUSIF1_DALIGN,
 177         SSI_BUSIF2_DALIGN,
 178         SSI_BUSIF3_DALIGN,
 179         SSI_BUSIF4_DALIGN,
 180         SSI_BUSIF5_DALIGN,
 181         SSI_BUSIF6_DALIGN,
 182         SSI_BUSIF7_DALIGN,
 183         SSI_INT_ENABLE,
 184         SSI_SYS_STATUS0,
 185         SSI_SYS_STATUS1,
 186         SSI_SYS_STATUS2,
 187         SSI_SYS_STATUS3,
 188         SSI_SYS_STATUS4,
 189         SSI_SYS_STATUS5,
 190         SSI_SYS_STATUS6,
 191         SSI_SYS_STATUS7,
 192         HDMI0_SEL,
 193         HDMI1_SEL,
 194         SSI9_BUSIF0_MODE,
 195         SSI9_BUSIF1_MODE,
 196         SSI9_BUSIF2_MODE,
 197         SSI9_BUSIF3_MODE,
 198         SSI9_BUSIF4_MODE,
 199         SSI9_BUSIF5_MODE,
 200         SSI9_BUSIF6_MODE,
 201         SSI9_BUSIF7_MODE,
 202         SSI9_BUSIF0_ADINR,
 203         SSI9_BUSIF1_ADINR,
 204         SSI9_BUSIF2_ADINR,
 205         SSI9_BUSIF3_ADINR,
 206         SSI9_BUSIF4_ADINR,
 207         SSI9_BUSIF5_ADINR,
 208         SSI9_BUSIF6_ADINR,
 209         SSI9_BUSIF7_ADINR,
 210         SSI9_BUSIF0_DALIGN,
 211         SSI9_BUSIF1_DALIGN,
 212         SSI9_BUSIF2_DALIGN,
 213         SSI9_BUSIF3_DALIGN,
 214         SSI9_BUSIF4_DALIGN,
 215         SSI9_BUSIF5_DALIGN,
 216         SSI9_BUSIF6_DALIGN,
 217         SSI9_BUSIF7_DALIGN,
 218 
 219         /* SSI */
 220         SSICR,
 221         SSISR,
 222         SSITDR,
 223         SSIRDR,
 224         SSIWSR,
 225 
 226         REG_MAX,
 227 };
 228 #define SRCIN_TIMSEL(i)         (SRCIN_TIMSEL0 + (i))
 229 #define SRCOUT_TIMSEL(i)        (SRCOUT_TIMSEL0 + (i))
 230 #define CTU_SVxxR(i, j)         (CTU_SV00R + (i * 8) + (j))
 231 #define DVC_VOLxR(i)            (DVC_VOL0R + (i))
 232 #define AUDIO_CLK_SEL(i)        (AUDIO_CLK_SEL0 + (i))
 233 #define SSI_BUSIF_MODE(i)       (SSI_BUSIF0_MODE + (i))
 234 #define SSI_BUSIF_ADINR(i)      (SSI_BUSIF0_ADINR + (i))
 235 #define SSI_BUSIF_DALIGN(i)     (SSI_BUSIF0_DALIGN + (i))
 236 #define SSI9_BUSIF_MODE(i)      (SSI9_BUSIF0_MODE + (i))
 237 #define SSI9_BUSIF_ADINR(i)     (SSI9_BUSIF0_ADINR + (i))
 238 #define SSI9_BUSIF_DALIGN(i)    (SSI9_BUSIF0_DALIGN + (i))
 239 #define SSI_SYS_STATUS(i)       (SSI_SYS_STATUS0 + (i))
 240 
 241 
 242 struct rsnd_priv;
 243 struct rsnd_mod;
 244 struct rsnd_dai;
 245 struct rsnd_dai_stream;
 246 
 247 /*
 248  *      R-Car basic functions
 249  */
 250 u32 rsnd_mod_read(struct rsnd_mod *mod, enum rsnd_reg reg);
 251 void rsnd_mod_write(struct rsnd_mod *mod, enum rsnd_reg reg, u32 data);
 252 void rsnd_mod_bset(struct rsnd_mod *mod, enum rsnd_reg reg, u32 mask, u32 data);
 253 u32 rsnd_get_adinr_bit(struct rsnd_mod *mod, struct rsnd_dai_stream *io);
 254 u32 rsnd_get_dalign(struct rsnd_mod *mod, struct rsnd_dai_stream *io);
 255 u32 rsnd_get_busif_shift(struct rsnd_dai_stream *io, struct rsnd_mod *mod);
 256 
 257 /*
 258  *      R-Car DMA
 259  */
 260 int rsnd_dma_attach(struct rsnd_dai_stream *io,
 261                     struct rsnd_mod *mod, struct rsnd_mod **dma_mod);
 262 int rsnd_dma_probe(struct rsnd_priv *priv);
 263 struct dma_chan *rsnd_dma_request_channel(struct device_node *of_node,
 264                                           struct rsnd_mod *mod, char *name);
 265 
 266 /*
 267  *      R-Car sound mod
 268  */
 269 enum rsnd_mod_type {
 270         RSND_MOD_AUDMAPP,
 271         RSND_MOD_AUDMA,
 272         RSND_MOD_DVC,
 273         RSND_MOD_MIX,
 274         RSND_MOD_CTU,
 275         RSND_MOD_CMD,
 276         RSND_MOD_SRC,
 277         RSND_MOD_SSIM3,         /* SSI multi 3 */
 278         RSND_MOD_SSIM2,         /* SSI multi 2 */
 279         RSND_MOD_SSIM1,         /* SSI multi 1 */
 280         RSND_MOD_SSIP,          /* SSI parent */
 281         RSND_MOD_SSI,
 282         RSND_MOD_SSIU,
 283         RSND_MOD_MAX,
 284 };
 285 
 286 struct rsnd_mod_ops {
 287         char *name;
 288         struct dma_chan* (*dma_req)(struct rsnd_dai_stream *io,
 289                                     struct rsnd_mod *mod);
 290         int (*probe)(struct rsnd_mod *mod,
 291                      struct rsnd_dai_stream *io,
 292                      struct rsnd_priv *priv);
 293         int (*remove)(struct rsnd_mod *mod,
 294                       struct rsnd_dai_stream *io,
 295                       struct rsnd_priv *priv);
 296         int (*init)(struct rsnd_mod *mod,
 297                     struct rsnd_dai_stream *io,
 298                     struct rsnd_priv *priv);
 299         int (*quit)(struct rsnd_mod *mod,
 300                     struct rsnd_dai_stream *io,
 301                     struct rsnd_priv *priv);
 302         int (*start)(struct rsnd_mod *mod,
 303                      struct rsnd_dai_stream *io,
 304                      struct rsnd_priv *priv);
 305         int (*stop)(struct rsnd_mod *mod,
 306                     struct rsnd_dai_stream *io,
 307                     struct rsnd_priv *priv);
 308         int (*irq)(struct rsnd_mod *mod,
 309                    struct rsnd_dai_stream *io,
 310                    struct rsnd_priv *priv, int enable);
 311         int (*pcm_new)(struct rsnd_mod *mod,
 312                        struct rsnd_dai_stream *io,
 313                        struct snd_soc_pcm_runtime *rtd);
 314         int (*hw_params)(struct rsnd_mod *mod,
 315                          struct rsnd_dai_stream *io,
 316                          struct snd_pcm_substream *substream,
 317                          struct snd_pcm_hw_params *hw_params);
 318         int (*pointer)(struct rsnd_mod *mod,
 319                        struct rsnd_dai_stream *io,
 320                        snd_pcm_uframes_t *pointer);
 321         int (*fallback)(struct rsnd_mod *mod,
 322                         struct rsnd_dai_stream *io,
 323                         struct rsnd_priv *priv);
 324         int (*prepare)(struct rsnd_mod *mod,
 325                        struct rsnd_dai_stream *io,
 326                        struct rsnd_priv *priv);
 327         int (*cleanup)(struct rsnd_mod *mod,
 328                        struct rsnd_dai_stream *io,
 329                        struct rsnd_priv *priv);
 330         int (*hw_free)(struct rsnd_mod *mod,
 331                        struct rsnd_dai_stream *io,
 332                        struct snd_pcm_substream *substream);
 333         u32 *(*get_status)(struct rsnd_mod *mod,
 334                            struct rsnd_dai_stream *io,
 335                            enum rsnd_mod_type type);
 336         int (*id)(struct rsnd_mod *mod);
 337         int (*id_sub)(struct rsnd_mod *mod);
 338         int (*id_cmd)(struct rsnd_mod *mod);
 339 };
 340 
 341 struct rsnd_dai_stream;
 342 struct rsnd_mod {
 343         int id;
 344         enum rsnd_mod_type type;
 345         struct rsnd_mod_ops *ops;
 346         struct rsnd_priv *priv;
 347         struct clk *clk;
 348         u32 status;
 349 };
 350 /*
 351  * status
 352  *
 353  * 0xH0000CB0
 354  *
 355  * B    0: init         1: quit
 356  * C    0: start        1: stop
 357  * D    0: hw_params    1: hw_free
 358  *
 359  * H is always called (see __rsnd_mod_call)
 360  * H    0: probe        1: remove
 361  * H    0: pcm_new
 362  * H    0: fallback
 363  * H    0: pointer
 364  * H    0: prepare
 365  * H    0: cleanup
 366  */
 367 #define __rsnd_mod_shift_init           4
 368 #define __rsnd_mod_shift_quit           4
 369 #define __rsnd_mod_shift_start          8
 370 #define __rsnd_mod_shift_stop           8
 371 #define __rsnd_mod_shift_hw_params      12
 372 #define __rsnd_mod_shift_hw_free        12
 373 #define __rsnd_mod_shift_probe          28 /* always called */
 374 #define __rsnd_mod_shift_remove         28 /* always called */
 375 #define __rsnd_mod_shift_irq            28 /* always called */
 376 #define __rsnd_mod_shift_pcm_new        28 /* always called */
 377 #define __rsnd_mod_shift_fallback       28 /* always called */
 378 #define __rsnd_mod_shift_pointer        28 /* always called */
 379 #define __rsnd_mod_shift_prepare        28 /* always called */
 380 #define __rsnd_mod_shift_cleanup        28 /* always called */
 381 
 382 #define __rsnd_mod_add_probe            0
 383 #define __rsnd_mod_add_remove           0
 384 #define __rsnd_mod_add_prepare          0
 385 #define __rsnd_mod_add_cleanup          0
 386 #define __rsnd_mod_add_init              1
 387 #define __rsnd_mod_add_quit             -1
 388 #define __rsnd_mod_add_start             1
 389 #define __rsnd_mod_add_stop             -1
 390 #define __rsnd_mod_add_hw_params        1
 391 #define __rsnd_mod_add_hw_free          -1
 392 #define __rsnd_mod_add_irq              0
 393 #define __rsnd_mod_add_pcm_new          0
 394 #define __rsnd_mod_add_fallback         0
 395 #define __rsnd_mod_add_pointer          0
 396 
 397 #define __rsnd_mod_call_probe           0
 398 #define __rsnd_mod_call_remove          0
 399 #define __rsnd_mod_call_prepare         0
 400 #define __rsnd_mod_call_cleanup         0
 401 #define __rsnd_mod_call_init            0
 402 #define __rsnd_mod_call_quit            1
 403 #define __rsnd_mod_call_start           0
 404 #define __rsnd_mod_call_stop            1
 405 #define __rsnd_mod_call_irq             0
 406 #define __rsnd_mod_call_pcm_new         0
 407 #define __rsnd_mod_call_fallback        0
 408 #define __rsnd_mod_call_hw_params       0
 409 #define __rsnd_mod_call_pointer         0
 410 #define __rsnd_mod_call_hw_free         1
 411 
 412 #define rsnd_mod_to_priv(mod)   ((mod)->priv)
 413 #define rsnd_mod_power_on(mod)  clk_enable((mod)->clk)
 414 #define rsnd_mod_power_off(mod) clk_disable((mod)->clk)
 415 #define rsnd_mod_get(ip)        (&(ip)->mod)
 416 
 417 int rsnd_mod_init(struct rsnd_priv *priv,
 418                   struct rsnd_mod *mod,
 419                   struct rsnd_mod_ops *ops,
 420                   struct clk *clk,
 421                   enum rsnd_mod_type type,
 422                   int id);
 423 void rsnd_mod_quit(struct rsnd_mod *mod);
 424 struct dma_chan *rsnd_mod_dma_req(struct rsnd_dai_stream *io,
 425                                   struct rsnd_mod *mod);
 426 void rsnd_mod_interrupt(struct rsnd_mod *mod,
 427                         void (*callback)(struct rsnd_mod *mod,
 428                                          struct rsnd_dai_stream *io));
 429 u32 *rsnd_mod_get_status(struct rsnd_mod *mod,
 430                          struct rsnd_dai_stream *io,
 431                          enum rsnd_mod_type type);
 432 int rsnd_mod_id(struct rsnd_mod *mod);
 433 int rsnd_mod_id_raw(struct rsnd_mod *mod);
 434 int rsnd_mod_id_sub(struct rsnd_mod *mod);
 435 char *rsnd_mod_name(struct rsnd_mod *mod);
 436 struct rsnd_mod *rsnd_mod_next(int *iterator,
 437                                struct rsnd_dai_stream *io,
 438                                enum rsnd_mod_type *array,
 439                                int array_size);
 440 #define for_each_rsnd_mod(iterator, pos, io)                            \
 441         for (iterator = 0;                                              \
 442              (pos = rsnd_mod_next(&iterator, io, NULL, 0)); iterator++)
 443 #define for_each_rsnd_mod_arrays(iterator, pos, io, array, size)        \
 444         for (iterator = 0;                                              \
 445              (pos = rsnd_mod_next(&iterator, io, array, size)); iterator++)
 446 #define for_each_rsnd_mod_array(iterator, pos, io, array)               \
 447         for_each_rsnd_mod_arrays(iterator, pos, io, array, ARRAY_SIZE(array))
 448 
 449 void rsnd_parse_connect_common(struct rsnd_dai *rdai,
 450                 struct rsnd_mod* (*mod_get)(struct rsnd_priv *priv, int id),
 451                 struct device_node *node,
 452                 struct device_node *playback,
 453                 struct device_node *capture);
 454 
 455 int rsnd_channel_normalization(int chan);
 456 #define rsnd_runtime_channel_original(io) \
 457         rsnd_runtime_channel_original_with_params(io, NULL)
 458 int rsnd_runtime_channel_original_with_params(struct rsnd_dai_stream *io,
 459                                 struct snd_pcm_hw_params *params);
 460 #define rsnd_runtime_channel_after_ctu(io)                      \
 461         rsnd_runtime_channel_after_ctu_with_params(io, NULL)
 462 int rsnd_runtime_channel_after_ctu_with_params(struct rsnd_dai_stream *io,
 463                                 struct snd_pcm_hw_params *params);
 464 #define rsnd_runtime_channel_for_ssi(io) \
 465         rsnd_runtime_channel_for_ssi_with_params(io, NULL)
 466 int rsnd_runtime_channel_for_ssi_with_params(struct rsnd_dai_stream *io,
 467                                  struct snd_pcm_hw_params *params);
 468 int rsnd_runtime_is_multi_ssi(struct rsnd_dai_stream *io);
 469 int rsnd_runtime_is_tdm(struct rsnd_dai_stream *io);
 470 int rsnd_runtime_is_tdm_split(struct rsnd_dai_stream *io);
 471 
 472 /*
 473  * DT
 474  */
 475 #define rsnd_parse_of_node(priv, node)                                  \
 476         of_get_child_by_name(rsnd_priv_to_dev(priv)->of_node, node)
 477 #define RSND_NODE_DAI   "rcar_sound,dai"
 478 #define RSND_NODE_SSI   "rcar_sound,ssi"
 479 #define RSND_NODE_SSIU  "rcar_sound,ssiu"
 480 #define RSND_NODE_SRC   "rcar_sound,src"
 481 #define RSND_NODE_CTU   "rcar_sound,ctu"
 482 #define RSND_NODE_MIX   "rcar_sound,mix"
 483 #define RSND_NODE_DVC   "rcar_sound,dvc"
 484 
 485 /*
 486  *      R-Car sound DAI
 487  */
 488 #define RSND_DAI_NAME_SIZE      16
 489 struct rsnd_dai_stream {
 490         char name[RSND_DAI_NAME_SIZE];
 491         struct snd_pcm_substream *substream;
 492         struct rsnd_mod *mod[RSND_MOD_MAX];
 493         struct rsnd_mod *dma;
 494         struct rsnd_dai *rdai;
 495         struct device *dmac_dev; /* for IPMMU */
 496         u32 converted_rate;      /* converted sampling rate */
 497         int converted_chan;      /* converted channels */
 498         u32 parent_ssi_status;
 499         u32 flags;
 500 };
 501 
 502 /* flags */
 503 #define RSND_STREAM_HDMI0       (1 << 0) /* for HDMI0 */
 504 #define RSND_STREAM_HDMI1       (1 << 1) /* for HDMI1 */
 505 #define RSND_STREAM_TDM_SPLIT   (1 << 2) /* for TDM split mode */
 506 
 507 #define rsnd_io_to_mod(io, i)   ((i) < RSND_MOD_MAX ? (io)->mod[(i)] : NULL)
 508 #define rsnd_io_to_mod_ssi(io)  rsnd_io_to_mod((io), RSND_MOD_SSI)
 509 #define rsnd_io_to_mod_ssiu(io) rsnd_io_to_mod((io), RSND_MOD_SSIU)
 510 #define rsnd_io_to_mod_ssip(io) rsnd_io_to_mod((io), RSND_MOD_SSIP)
 511 #define rsnd_io_to_mod_src(io)  rsnd_io_to_mod((io), RSND_MOD_SRC)
 512 #define rsnd_io_to_mod_ctu(io)  rsnd_io_to_mod((io), RSND_MOD_CTU)
 513 #define rsnd_io_to_mod_mix(io)  rsnd_io_to_mod((io), RSND_MOD_MIX)
 514 #define rsnd_io_to_mod_dvc(io)  rsnd_io_to_mod((io), RSND_MOD_DVC)
 515 #define rsnd_io_to_mod_cmd(io)  rsnd_io_to_mod((io), RSND_MOD_CMD)
 516 #define rsnd_io_to_rdai(io)     ((io)->rdai)
 517 #define rsnd_io_to_priv(io)     (rsnd_rdai_to_priv(rsnd_io_to_rdai(io)))
 518 #define rsnd_io_is_play(io)     (&rsnd_io_to_rdai(io)->playback == io)
 519 #define rsnd_io_to_runtime(io) ((io)->substream ? \
 520                                 (io)->substream->runtime : NULL)
 521 #define rsnd_io_converted_rate(io)      ((io)->converted_rate)
 522 #define rsnd_io_converted_chan(io)      ((io)->converted_chan)
 523 int rsnd_io_is_working(struct rsnd_dai_stream *io);
 524 
 525 struct rsnd_dai {
 526         char name[RSND_DAI_NAME_SIZE];
 527         struct rsnd_dai_stream playback;
 528         struct rsnd_dai_stream capture;
 529         struct rsnd_priv *priv;
 530         struct snd_pcm_hw_constraint_list constraint;
 531 
 532         int max_channels;       /* 2ch - 16ch */
 533         int ssi_lane;           /* 1lane - 4lane */
 534         int chan_width;         /* 16/24/32 bit width */
 535 
 536         unsigned int clk_master:1;
 537         unsigned int bit_clk_inv:1;
 538         unsigned int frm_clk_inv:1;
 539         unsigned int sys_delay:1;
 540         unsigned int data_alignment:1;
 541 };
 542 
 543 #define rsnd_rdai_nr(priv) ((priv)->rdai_nr)
 544 #define rsnd_rdai_is_clk_master(rdai) ((rdai)->clk_master)
 545 #define rsnd_rdai_to_priv(rdai) ((rdai)->priv)
 546 #define for_each_rsnd_dai(rdai, priv, i)                \
 547         for (i = 0;                                     \
 548              (i < rsnd_rdai_nr(priv)) &&                \
 549              ((rdai) = rsnd_rdai_get(priv, i));         \
 550              i++)
 551 
 552 struct rsnd_dai *rsnd_rdai_get(struct rsnd_priv *priv, int id);
 553 
 554 #define rsnd_rdai_channels_set(rdai, max_channels) \
 555         rsnd_rdai_channels_ctrl(rdai, max_channels)
 556 #define rsnd_rdai_channels_get(rdai) \
 557         rsnd_rdai_channels_ctrl(rdai, 0)
 558 int rsnd_rdai_channels_ctrl(struct rsnd_dai *rdai,
 559                             int max_channels);
 560 
 561 #define rsnd_rdai_ssi_lane_set(rdai, ssi_lane) \
 562         rsnd_rdai_ssi_lane_ctrl(rdai, ssi_lane)
 563 #define rsnd_rdai_ssi_lane_get(rdai) \
 564         rsnd_rdai_ssi_lane_ctrl(rdai, 0)
 565 int rsnd_rdai_ssi_lane_ctrl(struct rsnd_dai *rdai,
 566                             int ssi_lane);
 567 
 568 #define rsnd_rdai_width_set(rdai, width) \
 569         rsnd_rdai_width_ctrl(rdai, width)
 570 #define rsnd_rdai_width_get(rdai) \
 571         rsnd_rdai_width_ctrl(rdai, 0)
 572 int rsnd_rdai_width_ctrl(struct rsnd_dai *rdai, int width);
 573 void rsnd_dai_period_elapsed(struct rsnd_dai_stream *io);
 574 int rsnd_dai_connect(struct rsnd_mod *mod,
 575                      struct rsnd_dai_stream *io,
 576                      enum rsnd_mod_type type);
 577 
 578 /*
 579  *      R-Car Gen1/Gen2
 580  */
 581 int rsnd_gen_probe(struct rsnd_priv *priv);
 582 void __iomem *rsnd_gen_reg_get(struct rsnd_priv *priv,
 583                                struct rsnd_mod *mod,
 584                                enum rsnd_reg reg);
 585 phys_addr_t rsnd_gen_get_phy_addr(struct rsnd_priv *priv, int reg_id);
 586 
 587 /*
 588  *      R-Car ADG
 589  */
 590 int rsnd_adg_clk_query(struct rsnd_priv *priv, unsigned int rate);
 591 int rsnd_adg_ssi_clk_stop(struct rsnd_mod *mod);
 592 int rsnd_adg_ssi_clk_try_start(struct rsnd_mod *mod, unsigned int rate);
 593 int rsnd_adg_probe(struct rsnd_priv *priv);
 594 void rsnd_adg_remove(struct rsnd_priv *priv);
 595 int rsnd_adg_set_src_timesel_gen2(struct rsnd_mod *src_mod,
 596                                   struct rsnd_dai_stream *io,
 597                                   unsigned int in_rate,
 598                                   unsigned int out_rate);
 599 int rsnd_adg_set_cmd_timsel_gen2(struct rsnd_mod *mod,
 600                                  struct rsnd_dai_stream *io);
 601 #define rsnd_adg_clk_enable(priv)       rsnd_adg_clk_control(priv, 1)
 602 #define rsnd_adg_clk_disable(priv)      rsnd_adg_clk_control(priv, 0)
 603 void rsnd_adg_clk_control(struct rsnd_priv *priv, int enable);
 604 
 605 /*
 606  *      R-Car sound priv
 607  */
 608 struct rsnd_priv {
 609 
 610         struct platform_device *pdev;
 611         spinlock_t lock;
 612         unsigned long flags;
 613 #define RSND_GEN_MASK   (0xF << 0)
 614 #define RSND_GEN1       (1 << 0)
 615 #define RSND_GEN2       (2 << 0)
 616 #define RSND_GEN3       (3 << 0)
 617 #define RSND_SOC_MASK   (0xFF << 4)
 618 #define RSND_SOC_E      (1 << 4) /* E1/E2/E3 */
 619 
 620         /*
 621          * below value will be filled on rsnd_gen_probe()
 622          */
 623         void *gen;
 624 
 625         /*
 626          * below value will be filled on rsnd_adg_probe()
 627          */
 628         void *adg;
 629 
 630         /*
 631          * below value will be filled on rsnd_dma_probe()
 632          */
 633         void *dma;
 634 
 635         /*
 636          * below value will be filled on rsnd_ssi_probe()
 637          */
 638         void *ssi;
 639         int ssi_nr;
 640 
 641         /*
 642          * below value will be filled on rsnd_ssiu_probe()
 643          */
 644         void *ssiu;
 645         int ssiu_nr;
 646 
 647         /*
 648          * below value will be filled on rsnd_src_probe()
 649          */
 650         void *src;
 651         int src_nr;
 652 
 653         /*
 654          * below value will be filled on rsnd_ctu_probe()
 655          */
 656         void *ctu;
 657         int ctu_nr;
 658 
 659         /*
 660          * below value will be filled on rsnd_mix_probe()
 661          */
 662         void *mix;
 663         int mix_nr;
 664 
 665         /*
 666          * below value will be filled on rsnd_dvc_probe()
 667          */
 668         void *dvc;
 669         int dvc_nr;
 670 
 671         /*
 672          * below value will be filled on rsnd_cmd_probe()
 673          */
 674         void *cmd;
 675         int cmd_nr;
 676 
 677         /*
 678          * below value will be filled on rsnd_dai_probe()
 679          */
 680         struct snd_soc_dai_driver *daidrv;
 681         struct rsnd_dai *rdai;
 682         int rdai_nr;
 683 };
 684 
 685 #define rsnd_priv_to_pdev(priv) ((priv)->pdev)
 686 #define rsnd_priv_to_dev(priv)  (&(rsnd_priv_to_pdev(priv)->dev))
 687 
 688 #define rsnd_is_gen1(priv)      (((priv)->flags & RSND_GEN_MASK) == RSND_GEN1)
 689 #define rsnd_is_gen2(priv)      (((priv)->flags & RSND_GEN_MASK) == RSND_GEN2)
 690 #define rsnd_is_gen3(priv)      (((priv)->flags & RSND_GEN_MASK) == RSND_GEN3)
 691 #define rsnd_is_e3(priv)        (((priv)->flags & \
 692                                         (RSND_GEN_MASK | RSND_SOC_MASK)) == \
 693                                         (RSND_GEN3 | RSND_SOC_E))
 694 
 695 #define rsnd_flags_has(p, f) ((p)->flags & (f))
 696 #define rsnd_flags_set(p, f) ((p)->flags |= (f))
 697 #define rsnd_flags_del(p, f) ((p)->flags &= ~(f))
 698 
 699 /*
 700  *      rsnd_kctrl
 701  */
 702 struct rsnd_kctrl_cfg {
 703         unsigned int max;
 704         unsigned int size;
 705         u32 *val;
 706         const char * const *texts;
 707         int (*accept)(struct rsnd_dai_stream *io);
 708         void (*update)(struct rsnd_dai_stream *io, struct rsnd_mod *mod);
 709         struct rsnd_dai_stream *io;
 710         struct snd_card *card;
 711         struct snd_kcontrol *kctrl;
 712         struct rsnd_mod *mod;
 713 };
 714 
 715 #define RSND_MAX_CHANNELS       8
 716 struct rsnd_kctrl_cfg_m {
 717         struct rsnd_kctrl_cfg cfg;
 718         u32 val[RSND_MAX_CHANNELS];
 719 };
 720 
 721 struct rsnd_kctrl_cfg_s {
 722         struct rsnd_kctrl_cfg cfg;
 723         u32 val;
 724 };
 725 #define rsnd_kctrl_size(x)      ((x).cfg.size)
 726 #define rsnd_kctrl_max(x)       ((x).cfg.max)
 727 #define rsnd_kctrl_valm(x, i)   ((x).val[i])    /* = (x).cfg.val[i] */
 728 #define rsnd_kctrl_vals(x)      ((x).val)       /* = (x).cfg.val[0] */
 729 
 730 int rsnd_kctrl_accept_anytime(struct rsnd_dai_stream *io);
 731 int rsnd_kctrl_accept_runtime(struct rsnd_dai_stream *io);
 732 struct rsnd_kctrl_cfg *rsnd_kctrl_init_m(struct rsnd_kctrl_cfg_m *cfg);
 733 struct rsnd_kctrl_cfg *rsnd_kctrl_init_s(struct rsnd_kctrl_cfg_s *cfg);
 734 int rsnd_kctrl_new(struct rsnd_mod *mod,
 735                    struct rsnd_dai_stream *io,
 736                    struct snd_soc_pcm_runtime *rtd,
 737                    const unsigned char *name,
 738                    int (*accept)(struct rsnd_dai_stream *io),
 739                    void (*update)(struct rsnd_dai_stream *io,
 740                                   struct rsnd_mod *mod),
 741                    struct rsnd_kctrl_cfg *cfg,
 742                    const char * const *texts,
 743                    int size,
 744                    u32 max);
 745 
 746 #define rsnd_kctrl_new_m(mod, io, rtd, name, accept, update, cfg, size, max) \
 747         rsnd_kctrl_new(mod, io, rtd, name, accept, update, rsnd_kctrl_init_m(cfg), \
 748                        NULL, size, max)
 749 
 750 #define rsnd_kctrl_new_s(mod, io, rtd, name, accept, update, cfg, max)  \
 751         rsnd_kctrl_new(mod, io, rtd, name, accept, update, rsnd_kctrl_init_s(cfg), \
 752                        NULL, 1, max)
 753 
 754 #define rsnd_kctrl_new_e(mod, io, rtd, name, accept, update, cfg, texts, size) \
 755         rsnd_kctrl_new(mod, io, rtd, name, accept, update, rsnd_kctrl_init_s(cfg), \
 756                        texts, 1, size)
 757 
 758 extern const char * const volume_ramp_rate[];
 759 #define VOLUME_RAMP_MAX_DVC     (0x17 + 1)
 760 #define VOLUME_RAMP_MAX_MIX     (0x0a + 1)
 761 
 762 /*
 763  *      R-Car SSI
 764  */
 765 int rsnd_ssi_probe(struct rsnd_priv *priv);
 766 void rsnd_ssi_remove(struct rsnd_priv *priv);
 767 struct rsnd_mod *rsnd_ssi_mod_get(struct rsnd_priv *priv, int id);
 768 int rsnd_ssi_use_busif(struct rsnd_dai_stream *io);
 769 u32 rsnd_ssi_multi_slaves_runtime(struct rsnd_dai_stream *io);
 770 
 771 #define rsnd_ssi_is_pin_sharing(io)     \
 772         __rsnd_ssi_is_pin_sharing(rsnd_io_to_mod_ssi(io))
 773 int __rsnd_ssi_is_pin_sharing(struct rsnd_mod *mod);
 774 
 775 #define rsnd_ssi_of_node(priv) rsnd_parse_of_node(priv, RSND_NODE_SSI)
 776 void rsnd_parse_connect_ssi(struct rsnd_dai *rdai,
 777                             struct device_node *playback,
 778                             struct device_node *capture);
 779 unsigned int rsnd_ssi_clk_query(struct rsnd_dai *rdai,
 780                        int param1, int param2, int *idx);
 781 
 782 /*
 783  *      R-Car SSIU
 784  */
 785 int rsnd_ssiu_attach(struct rsnd_dai_stream *io,
 786                      struct rsnd_mod *mod);
 787 int rsnd_ssiu_probe(struct rsnd_priv *priv);
 788 void rsnd_ssiu_remove(struct rsnd_priv *priv);
 789 void rsnd_parse_connect_ssiu(struct rsnd_dai *rdai,
 790                              struct device_node *playback,
 791                              struct device_node *capture);
 792 #define rsnd_ssiu_of_node(priv) rsnd_parse_of_node(priv, RSND_NODE_SSIU)
 793 
 794 /*
 795  *      R-Car SRC
 796  */
 797 int rsnd_src_probe(struct rsnd_priv *priv);
 798 void rsnd_src_remove(struct rsnd_priv *priv);
 799 struct rsnd_mod *rsnd_src_mod_get(struct rsnd_priv *priv, int id);
 800 
 801 #define rsnd_src_get_in_rate(priv, io) rsnd_src_get_rate(priv, io, 1)
 802 #define rsnd_src_get_out_rate(priv, io) rsnd_src_get_rate(priv, io, 0)
 803 unsigned int rsnd_src_get_rate(struct rsnd_priv *priv,
 804                                struct rsnd_dai_stream *io,
 805                                int is_in);
 806 
 807 #define rsnd_src_of_node(priv) rsnd_parse_of_node(priv, RSND_NODE_SRC)
 808 #define rsnd_parse_connect_src(rdai, playback, capture)                 \
 809         rsnd_parse_connect_common(rdai, rsnd_src_mod_get,               \
 810                                   rsnd_src_of_node(rsnd_rdai_to_priv(rdai)), \
 811                                                    playback, capture)
 812 
 813 /*
 814  *      R-Car CTU
 815  */
 816 int rsnd_ctu_probe(struct rsnd_priv *priv);
 817 void rsnd_ctu_remove(struct rsnd_priv *priv);
 818 struct rsnd_mod *rsnd_ctu_mod_get(struct rsnd_priv *priv, int id);
 819 #define rsnd_ctu_of_node(priv) rsnd_parse_of_node(priv, RSND_NODE_CTU)
 820 #define rsnd_parse_connect_ctu(rdai, playback, capture)                 \
 821         rsnd_parse_connect_common(rdai, rsnd_ctu_mod_get,               \
 822                                   rsnd_ctu_of_node(rsnd_rdai_to_priv(rdai)), \
 823                                                    playback, capture)
 824 
 825 /*
 826  *      R-Car MIX
 827  */
 828 int rsnd_mix_probe(struct rsnd_priv *priv);
 829 void rsnd_mix_remove(struct rsnd_priv *priv);
 830 struct rsnd_mod *rsnd_mix_mod_get(struct rsnd_priv *priv, int id);
 831 #define rsnd_mix_of_node(priv) rsnd_parse_of_node(priv, RSND_NODE_MIX)
 832 #define rsnd_parse_connect_mix(rdai, playback, capture)                 \
 833         rsnd_parse_connect_common(rdai, rsnd_mix_mod_get,               \
 834                                   rsnd_mix_of_node(rsnd_rdai_to_priv(rdai)), \
 835                                                    playback, capture)
 836 
 837 /*
 838  *      R-Car DVC
 839  */
 840 int rsnd_dvc_probe(struct rsnd_priv *priv);
 841 void rsnd_dvc_remove(struct rsnd_priv *priv);
 842 struct rsnd_mod *rsnd_dvc_mod_get(struct rsnd_priv *priv, int id);
 843 #define rsnd_dvc_of_node(priv) rsnd_parse_of_node(priv, RSND_NODE_DVC)
 844 #define rsnd_parse_connect_dvc(rdai, playback, capture)                 \
 845         rsnd_parse_connect_common(rdai, rsnd_dvc_mod_get,               \
 846                                   rsnd_dvc_of_node(rsnd_rdai_to_priv(rdai)), \
 847                                                    playback, capture)
 848 
 849 /*
 850  *      R-Car CMD
 851  */
 852 int rsnd_cmd_probe(struct rsnd_priv *priv);
 853 void rsnd_cmd_remove(struct rsnd_priv *priv);
 854 int rsnd_cmd_attach(struct rsnd_dai_stream *io, int id);
 855 
 856 void rsnd_mod_make_sure(struct rsnd_mod *mod, enum rsnd_mod_type type);
 857 #ifdef DEBUG
 858 #define rsnd_mod_confirm_ssi(mssi)      rsnd_mod_make_sure(mssi, RSND_MOD_SSI)
 859 #define rsnd_mod_confirm_src(msrc)      rsnd_mod_make_sure(msrc, RSND_MOD_SRC)
 860 #define rsnd_mod_confirm_dvc(mdvc)      rsnd_mod_make_sure(mdvc, RSND_MOD_DVC)
 861 #else
 862 #define rsnd_mod_confirm_ssi(mssi)
 863 #define rsnd_mod_confirm_src(msrc)
 864 #define rsnd_mod_confirm_dvc(mdvc)
 865 #endif
 866 
 867 /*
 868  * If you don't need interrupt status debug message,
 869  * define RSND_DEBUG_NO_IRQ_STATUS as 1 on top of src.c/ssi.c
 870  *
 871  * #define RSND_DEBUG_NO_IRQ_STATUS 1
 872  */
 873 #define rsnd_dbg_irq_status(dev, param...)              \
 874         if (!IS_BUILTIN(RSND_DEBUG_NO_IRQ_STATUS))      \
 875                 dev_dbg(dev, param)
 876 
 877 /*
 878  * If you don't need rsnd_dai_call debug message,
 879  * define RSND_DEBUG_NO_DAI_CALL as 1 on top of core.c
 880  *
 881  * #define RSND_DEBUG_NO_DAI_CALL 1
 882  */
 883 #define rsnd_dbg_dai_call(dev, param...)                \
 884         if (!IS_BUILTIN(RSND_DEBUG_NO_DAI_CALL))        \
 885                 dev_dbg(dev, param)
 886 
 887 #endif

/* [<][>][^][v][top][bottom][index][help] */