11e0edd4dSKuninori Morimoto // SPDX-License-Identifier: GPL-2.0 21e0edd4dSKuninori Morimoto // 31e0edd4dSKuninori Morimoto // Renesas R-Car 41e0edd4dSKuninori Morimoto // 51e0edd4dSKuninori Morimoto // Copyright (C) 2013 Renesas Solutions Corp. 61e0edd4dSKuninori Morimoto // Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> 71e0edd4dSKuninori Morimoto 81536a968SKuninori Morimoto #ifndef RSND_H 91536a968SKuninori Morimoto #define RSND_H 101536a968SKuninori Morimoto 111536a968SKuninori Morimoto #include <linux/clk.h> 121536a968SKuninori Morimoto #include <linux/device.h> 130a4d94c0SKuninori Morimoto #include <linux/dma-mapping.h> 141536a968SKuninori Morimoto #include <linux/io.h> 151536a968SKuninori Morimoto #include <linux/list.h> 161536a968SKuninori Morimoto #include <linux/module.h> 1790e8e50fSKuninori Morimoto #include <linux/of_device.h> 1811d0f8edSKuninori Morimoto #include <linux/of_graph.h> 1990e8e50fSKuninori Morimoto #include <linux/of_irq.h> 200a4d94c0SKuninori Morimoto #include <linux/sh_dma.h> 210a4d94c0SKuninori Morimoto #include <linux/workqueue.h> 221536a968SKuninori Morimoto #include <sound/soc.h> 231536a968SKuninori Morimoto #include <sound/pcm_params.h> 241536a968SKuninori Morimoto 252ea2cc86SKuninori Morimoto #define RSND_GEN1_SRU 0 262ea2cc86SKuninori Morimoto #define RSND_GEN1_ADG 1 272ea2cc86SKuninori Morimoto #define RSND_GEN1_SSI 2 282ea2cc86SKuninori Morimoto 292ea2cc86SKuninori Morimoto #define RSND_GEN2_SCU 0 302ea2cc86SKuninori Morimoto #define RSND_GEN2_ADG 1 312ea2cc86SKuninori Morimoto #define RSND_GEN2_SSIU 2 322ea2cc86SKuninori Morimoto #define RSND_GEN2_SSI 3 332ea2cc86SKuninori Morimoto 34c2bc6527SKuninori Morimoto #define RSND_GEN4_ADG 0 35c2bc6527SKuninori Morimoto #define RSND_GEN4_SSIU 1 36c2bc6527SKuninori Morimoto #define RSND_GEN4_SSI 2 37c2bc6527SKuninori Morimoto #define RSND_GEN4_SDMC 3 38c2bc6527SKuninori Morimoto 392ea2cc86SKuninori Morimoto #define RSND_BASE_MAX 4 40dcc448e6SGeert Uytterhoeven 411536a968SKuninori Morimoto /* 421536a968SKuninori Morimoto * pseudo register 431536a968SKuninori Morimoto * 441536a968SKuninori Morimoto * The register address offsets SRU/SCU/SSIU on Gen1/Gen2 are very different. 451536a968SKuninori Morimoto * This driver uses pseudo register in order to hide it. 461536a968SKuninori Morimoto * see gen1/gen2 for detail 471536a968SKuninori Morimoto */ 483337744aSKuninori Morimoto enum rsnd_reg { 49bb7927c7SKuninori Morimoto /* SCU (MIX/CTU/DVC) */ 50b7169ddeSKuninori Morimoto SRC_I_BUSIF_MODE, 51b7169ddeSKuninori Morimoto SRC_O_BUSIF_MODE, 52b7169ddeSKuninori Morimoto SRC_ROUTE_MODE0, 53b7169ddeSKuninori Morimoto SRC_SWRSR, 54b7169ddeSKuninori Morimoto SRC_SRCIR, 55b7169ddeSKuninori Morimoto SRC_ADINR, 56b7169ddeSKuninori Morimoto SRC_IFSCR, 57b7169ddeSKuninori Morimoto SRC_IFSVR, 58b7169ddeSKuninori Morimoto SRC_SRCCR, 59b7169ddeSKuninori Morimoto SRC_CTRL, 60b7169ddeSKuninori Morimoto SRC_BSDSR, 61b7169ddeSKuninori Morimoto SRC_BSISR, 62b7169ddeSKuninori Morimoto SRC_INT_ENABLE0, 63b7169ddeSKuninori Morimoto SRC_BUSIF_DALIGN, 64b7169ddeSKuninori Morimoto SRCIN_TIMSEL0, 65b7169ddeSKuninori Morimoto SRCIN_TIMSEL1, 66b7169ddeSKuninori Morimoto SRCIN_TIMSEL2, 67b7169ddeSKuninori Morimoto SRCIN_TIMSEL3, 68b7169ddeSKuninori Morimoto SRCIN_TIMSEL4, 69b7169ddeSKuninori Morimoto SRCOUT_TIMSEL0, 70b7169ddeSKuninori Morimoto SRCOUT_TIMSEL1, 71b7169ddeSKuninori Morimoto SRCOUT_TIMSEL2, 72b7169ddeSKuninori Morimoto SRCOUT_TIMSEL3, 73b7169ddeSKuninori Morimoto SRCOUT_TIMSEL4, 74b7169ddeSKuninori Morimoto SCU_SYS_STATUS0, 75b7169ddeSKuninori Morimoto SCU_SYS_STATUS1, 76b7169ddeSKuninori Morimoto SCU_SYS_INT_EN0, 77b7169ddeSKuninori Morimoto SCU_SYS_INT_EN1, 78b7169ddeSKuninori Morimoto CMD_CTRL, 79b7169ddeSKuninori Morimoto CMD_BUSIF_MODE, 80b7169ddeSKuninori Morimoto CMD_BUSIF_DALIGN, 81b7169ddeSKuninori Morimoto CMD_ROUTE_SLCT, 82b7169ddeSKuninori Morimoto CMDOUT_TIMSEL, 83b7169ddeSKuninori Morimoto CTU_SWRSR, 84b7169ddeSKuninori Morimoto CTU_CTUIR, 85b7169ddeSKuninori Morimoto CTU_ADINR, 86b7169ddeSKuninori Morimoto CTU_CPMDR, 87b7169ddeSKuninori Morimoto CTU_SCMDR, 88b7169ddeSKuninori Morimoto CTU_SV00R, 89b7169ddeSKuninori Morimoto CTU_SV01R, 90b7169ddeSKuninori Morimoto CTU_SV02R, 91b7169ddeSKuninori Morimoto CTU_SV03R, 92b7169ddeSKuninori Morimoto CTU_SV04R, 93b7169ddeSKuninori Morimoto CTU_SV05R, 94b7169ddeSKuninori Morimoto CTU_SV06R, 95b7169ddeSKuninori Morimoto CTU_SV07R, 96b7169ddeSKuninori Morimoto CTU_SV10R, 97b7169ddeSKuninori Morimoto CTU_SV11R, 98b7169ddeSKuninori Morimoto CTU_SV12R, 99b7169ddeSKuninori Morimoto CTU_SV13R, 100b7169ddeSKuninori Morimoto CTU_SV14R, 101b7169ddeSKuninori Morimoto CTU_SV15R, 102b7169ddeSKuninori Morimoto CTU_SV16R, 103b7169ddeSKuninori Morimoto CTU_SV17R, 104b7169ddeSKuninori Morimoto CTU_SV20R, 105b7169ddeSKuninori Morimoto CTU_SV21R, 106b7169ddeSKuninori Morimoto CTU_SV22R, 107b7169ddeSKuninori Morimoto CTU_SV23R, 108b7169ddeSKuninori Morimoto CTU_SV24R, 109b7169ddeSKuninori Morimoto CTU_SV25R, 110b7169ddeSKuninori Morimoto CTU_SV26R, 111b7169ddeSKuninori Morimoto CTU_SV27R, 112b7169ddeSKuninori Morimoto CTU_SV30R, 113b7169ddeSKuninori Morimoto CTU_SV31R, 114b7169ddeSKuninori Morimoto CTU_SV32R, 115b7169ddeSKuninori Morimoto CTU_SV33R, 116b7169ddeSKuninori Morimoto CTU_SV34R, 117b7169ddeSKuninori Morimoto CTU_SV35R, 118b7169ddeSKuninori Morimoto CTU_SV36R, 119b7169ddeSKuninori Morimoto CTU_SV37R, 120b7169ddeSKuninori Morimoto MIX_SWRSR, 121b7169ddeSKuninori Morimoto MIX_MIXIR, 122b7169ddeSKuninori Morimoto MIX_ADINR, 123b7169ddeSKuninori Morimoto MIX_MIXMR, 124b7169ddeSKuninori Morimoto MIX_MVPDR, 125b7169ddeSKuninori Morimoto MIX_MDBAR, 126b7169ddeSKuninori Morimoto MIX_MDBBR, 127b7169ddeSKuninori Morimoto MIX_MDBCR, 128b7169ddeSKuninori Morimoto MIX_MDBDR, 129b7169ddeSKuninori Morimoto MIX_MDBER, 130b7169ddeSKuninori Morimoto DVC_SWRSR, 131b7169ddeSKuninori Morimoto DVC_DVUIR, 132b7169ddeSKuninori Morimoto DVC_ADINR, 133b7169ddeSKuninori Morimoto DVC_DVUCR, 134b7169ddeSKuninori Morimoto DVC_ZCMCR, 135b7169ddeSKuninori Morimoto DVC_VOL0R, 136b7169ddeSKuninori Morimoto DVC_VOL1R, 137b7169ddeSKuninori Morimoto DVC_VOL2R, 138b7169ddeSKuninori Morimoto DVC_VOL3R, 139b7169ddeSKuninori Morimoto DVC_VOL4R, 140b7169ddeSKuninori Morimoto DVC_VOL5R, 141b7169ddeSKuninori Morimoto DVC_VOL6R, 142b7169ddeSKuninori Morimoto DVC_VOL7R, 143b7169ddeSKuninori Morimoto DVC_DVUER, 144b7169ddeSKuninori Morimoto DVC_VRCTR, 145b7169ddeSKuninori Morimoto DVC_VRPDR, 146b7169ddeSKuninori Morimoto DVC_VRDBR, 14707539c1dSKuninori Morimoto 148dfc9403bSKuninori Morimoto /* ADG */ 149b7169ddeSKuninori Morimoto BRRA, 150b7169ddeSKuninori Morimoto BRRB, 151b7169ddeSKuninori Morimoto BRGCKR, 152b7169ddeSKuninori Morimoto DIV_EN, 153b7169ddeSKuninori Morimoto AUDIO_CLK_SEL0, 154b7169ddeSKuninori Morimoto AUDIO_CLK_SEL1, 155b7169ddeSKuninori Morimoto AUDIO_CLK_SEL2, 156dfc9403bSKuninori Morimoto 157bb7927c7SKuninori Morimoto /* SSIU */ 158b7169ddeSKuninori Morimoto SSI_MODE, 159b7169ddeSKuninori Morimoto SSI_MODE0, 160b7169ddeSKuninori Morimoto SSI_MODE1, 161b7169ddeSKuninori Morimoto SSI_MODE2, 162b7169ddeSKuninori Morimoto SSI_CONTROL, 163b7169ddeSKuninori Morimoto SSI_CTRL, 164b7169ddeSKuninori Morimoto SSI_BUSIF0_MODE, 165b7169ddeSKuninori Morimoto SSI_BUSIF1_MODE, 166b7169ddeSKuninori Morimoto SSI_BUSIF2_MODE, 167b7169ddeSKuninori Morimoto SSI_BUSIF3_MODE, 168b7169ddeSKuninori Morimoto SSI_BUSIF4_MODE, 169b7169ddeSKuninori Morimoto SSI_BUSIF5_MODE, 170b7169ddeSKuninori Morimoto SSI_BUSIF6_MODE, 171b7169ddeSKuninori Morimoto SSI_BUSIF7_MODE, 172b7169ddeSKuninori Morimoto SSI_BUSIF0_ADINR, 173b7169ddeSKuninori Morimoto SSI_BUSIF1_ADINR, 174b7169ddeSKuninori Morimoto SSI_BUSIF2_ADINR, 175b7169ddeSKuninori Morimoto SSI_BUSIF3_ADINR, 176b7169ddeSKuninori Morimoto SSI_BUSIF4_ADINR, 177b7169ddeSKuninori Morimoto SSI_BUSIF5_ADINR, 178b7169ddeSKuninori Morimoto SSI_BUSIF6_ADINR, 179b7169ddeSKuninori Morimoto SSI_BUSIF7_ADINR, 180b7169ddeSKuninori Morimoto SSI_BUSIF0_DALIGN, 181b7169ddeSKuninori Morimoto SSI_BUSIF1_DALIGN, 182b7169ddeSKuninori Morimoto SSI_BUSIF2_DALIGN, 183b7169ddeSKuninori Morimoto SSI_BUSIF3_DALIGN, 184b7169ddeSKuninori Morimoto SSI_BUSIF4_DALIGN, 185b7169ddeSKuninori Morimoto SSI_BUSIF5_DALIGN, 186b7169ddeSKuninori Morimoto SSI_BUSIF6_DALIGN, 187b7169ddeSKuninori Morimoto SSI_BUSIF7_DALIGN, 188b7169ddeSKuninori Morimoto SSI_INT_ENABLE, 189b7169ddeSKuninori Morimoto SSI_SYS_STATUS0, 190b7169ddeSKuninori Morimoto SSI_SYS_STATUS1, 191b7169ddeSKuninori Morimoto SSI_SYS_STATUS2, 192b7169ddeSKuninori Morimoto SSI_SYS_STATUS3, 193b7169ddeSKuninori Morimoto SSI_SYS_STATUS4, 194b7169ddeSKuninori Morimoto SSI_SYS_STATUS5, 195b7169ddeSKuninori Morimoto SSI_SYS_STATUS6, 196b7169ddeSKuninori Morimoto SSI_SYS_STATUS7, 19766c705d0SYongbo Zhang SSI_SYS_INT_ENABLE0, 19866c705d0SYongbo Zhang SSI_SYS_INT_ENABLE1, 19966c705d0SYongbo Zhang SSI_SYS_INT_ENABLE2, 20066c705d0SYongbo Zhang SSI_SYS_INT_ENABLE3, 20166c705d0SYongbo Zhang SSI_SYS_INT_ENABLE4, 20266c705d0SYongbo Zhang SSI_SYS_INT_ENABLE5, 20366c705d0SYongbo Zhang SSI_SYS_INT_ENABLE6, 20466c705d0SYongbo Zhang SSI_SYS_INT_ENABLE7, 205c2bc6527SKuninori Morimoto SSI_BUSIF, 206b7169ddeSKuninori Morimoto HDMI0_SEL, 207b7169ddeSKuninori Morimoto HDMI1_SEL, 2088af6c521SJiada Wang SSI9_BUSIF0_MODE, 2098af6c521SJiada Wang SSI9_BUSIF1_MODE, 2108af6c521SJiada Wang SSI9_BUSIF2_MODE, 2118af6c521SJiada Wang SSI9_BUSIF3_MODE, 2128af6c521SJiada Wang SSI9_BUSIF4_MODE, 2138af6c521SJiada Wang SSI9_BUSIF5_MODE, 2148af6c521SJiada Wang SSI9_BUSIF6_MODE, 2158af6c521SJiada Wang SSI9_BUSIF7_MODE, 2168af6c521SJiada Wang SSI9_BUSIF0_ADINR, 2178af6c521SJiada Wang SSI9_BUSIF1_ADINR, 2188af6c521SJiada Wang SSI9_BUSIF2_ADINR, 2198af6c521SJiada Wang SSI9_BUSIF3_ADINR, 2208af6c521SJiada Wang SSI9_BUSIF4_ADINR, 2218af6c521SJiada Wang SSI9_BUSIF5_ADINR, 2228af6c521SJiada Wang SSI9_BUSIF6_ADINR, 2238af6c521SJiada Wang SSI9_BUSIF7_ADINR, 2248af6c521SJiada Wang SSI9_BUSIF0_DALIGN, 2258af6c521SJiada Wang SSI9_BUSIF1_DALIGN, 2268af6c521SJiada Wang SSI9_BUSIF2_DALIGN, 2278af6c521SJiada Wang SSI9_BUSIF3_DALIGN, 2288af6c521SJiada Wang SSI9_BUSIF4_DALIGN, 2298af6c521SJiada Wang SSI9_BUSIF5_DALIGN, 2308af6c521SJiada Wang SSI9_BUSIF6_DALIGN, 2318af6c521SJiada Wang SSI9_BUSIF7_DALIGN, 232bb7927c7SKuninori Morimoto 233ae5c3223SKuninori Morimoto /* SSI */ 234b7169ddeSKuninori Morimoto SSICR, 235b7169ddeSKuninori Morimoto SSISR, 236b7169ddeSKuninori Morimoto SSITDR, 237b7169ddeSKuninori Morimoto SSIRDR, 238b7169ddeSKuninori Morimoto SSIWSR, 239ae5c3223SKuninori Morimoto 240b7169ddeSKuninori Morimoto REG_MAX, 2413337744aSKuninori Morimoto }; 242b7169ddeSKuninori Morimoto #define SRCIN_TIMSEL(i) (SRCIN_TIMSEL0 + (i)) 243b7169ddeSKuninori Morimoto #define SRCOUT_TIMSEL(i) (SRCOUT_TIMSEL0 + (i)) 244b7169ddeSKuninori Morimoto #define CTU_SVxxR(i, j) (CTU_SV00R + (i * 8) + (j)) 245b7169ddeSKuninori Morimoto #define DVC_VOLxR(i) (DVC_VOL0R + (i)) 246b7169ddeSKuninori Morimoto #define AUDIO_CLK_SEL(i) (AUDIO_CLK_SEL0 + (i)) 247b7169ddeSKuninori Morimoto #define SSI_BUSIF_MODE(i) (SSI_BUSIF0_MODE + (i)) 248b7169ddeSKuninori Morimoto #define SSI_BUSIF_ADINR(i) (SSI_BUSIF0_ADINR + (i)) 249b7169ddeSKuninori Morimoto #define SSI_BUSIF_DALIGN(i) (SSI_BUSIF0_DALIGN + (i)) 2508af6c521SJiada Wang #define SSI9_BUSIF_MODE(i) (SSI9_BUSIF0_MODE + (i)) 2518af6c521SJiada Wang #define SSI9_BUSIF_ADINR(i) (SSI9_BUSIF0_ADINR + (i)) 2528af6c521SJiada Wang #define SSI9_BUSIF_DALIGN(i) (SSI9_BUSIF0_DALIGN + (i)) 253b7169ddeSKuninori Morimoto #define SSI_SYS_STATUS(i) (SSI_SYS_STATUS0 + (i)) 25466c705d0SYongbo Zhang #define SSI_SYS_INT_ENABLE(i) (SSI_SYS_INT_ENABLE0 + (i)) 255b7169ddeSKuninori Morimoto 2563337744aSKuninori Morimoto 2571536a968SKuninori Morimoto struct rsnd_priv; 258cdaa3cdfSKuninori Morimoto struct rsnd_mod; 2591536a968SKuninori Morimoto struct rsnd_dai; 2601536a968SKuninori Morimoto struct rsnd_dai_stream; 2611536a968SKuninori Morimoto 2621536a968SKuninori Morimoto /* 2633337744aSKuninori Morimoto * R-Car basic functions 2643337744aSKuninori Morimoto */ 265b7169ddeSKuninori Morimoto u32 rsnd_mod_read(struct rsnd_mod *mod, enum rsnd_reg reg); 266b7169ddeSKuninori Morimoto void rsnd_mod_write(struct rsnd_mod *mod, enum rsnd_reg reg, u32 data); 267b7169ddeSKuninori Morimoto void rsnd_mod_bset(struct rsnd_mod *mod, enum rsnd_reg reg, u32 mask, u32 data); 2683023b384SKuninori Morimoto u32 rsnd_get_adinr_bit(struct rsnd_mod *mod, struct rsnd_dai_stream *io); 2694689032bSKuninori Morimoto u32 rsnd_get_dalign(struct rsnd_mod *mod, struct rsnd_dai_stream *io); 27090431eb4SKuninori Morimoto u32 rsnd_get_busif_shift(struct rsnd_dai_stream *io, struct rsnd_mod *mod); 2713337744aSKuninori Morimoto 2723337744aSKuninori Morimoto /* 2730a4d94c0SKuninori Morimoto * R-Car DMA 2740a4d94c0SKuninori Morimoto */ 275355cb84fSKuninori Morimoto int rsnd_dma_attach(struct rsnd_dai_stream *io, 276b99305d2SKuninori Morimoto struct rsnd_mod *mod, struct rsnd_mod **dma_mod); 2772ea6b074SKuninori Morimoto int rsnd_dma_probe(struct rsnd_priv *priv); 278039f2cccSKuninori Morimoto struct dma_chan *rsnd_dma_request_channel(struct device_node *of_node, char *name, 279039f2cccSKuninori Morimoto struct rsnd_mod *mod, char *x); 2800a4d94c0SKuninori Morimoto 2810a4d94c0SKuninori Morimoto /* 282cdaa3cdfSKuninori Morimoto * R-Car sound mod 283cdaa3cdfSKuninori Morimoto */ 284a126021dSKuninori Morimoto enum rsnd_mod_type { 285940e9479SKuninori Morimoto RSND_MOD_AUDMAPP, 286940e9479SKuninori Morimoto RSND_MOD_AUDMA, 287940e9479SKuninori Morimoto RSND_MOD_DVC, 28870fb1052SKuninori Morimoto RSND_MOD_MIX, 2899269e3c3SKuninori Morimoto RSND_MOD_CTU, 2901b2ca0adSKuninori Morimoto RSND_MOD_CMD, 2918048b91fSKuninori Morimoto RSND_MOD_SRC, 292b4c83b17SKuninori Morimoto RSND_MOD_SSIM3, /* SSI multi 3 */ 293b4c83b17SKuninori Morimoto RSND_MOD_SSIM2, /* SSI multi 2 */ 294b4c83b17SKuninori Morimoto RSND_MOD_SSIM1, /* SSI multi 1 */ 295e7d850ddSKuninori Morimoto RSND_MOD_SSIP, /* SSI parent */ 296a126021dSKuninori Morimoto RSND_MOD_SSI, 297cdf310ceSKuninori Morimoto RSND_MOD_SSIU, 298a126021dSKuninori Morimoto RSND_MOD_MAX, 299a126021dSKuninori Morimoto }; 300cdaa3cdfSKuninori Morimoto 301cdaa3cdfSKuninori Morimoto struct rsnd_mod_ops { 302cdaa3cdfSKuninori Morimoto char *name; 3039b99e9a7SKuninori Morimoto struct dma_chan* (*dma_req)(struct rsnd_dai_stream *io, 3049b99e9a7SKuninori Morimoto struct rsnd_mod *mod); 3057681f6acSKuninori Morimoto int (*probe)(struct rsnd_mod *mod, 3062c0fac19SKuninori Morimoto struct rsnd_dai_stream *io, 307690602fcSKuninori Morimoto struct rsnd_priv *priv); 3087681f6acSKuninori Morimoto int (*remove)(struct rsnd_mod *mod, 3092c0fac19SKuninori Morimoto struct rsnd_dai_stream *io, 310690602fcSKuninori Morimoto struct rsnd_priv *priv); 311cdaa3cdfSKuninori Morimoto int (*init)(struct rsnd_mod *mod, 3122c0fac19SKuninori Morimoto struct rsnd_dai_stream *io, 313690602fcSKuninori Morimoto struct rsnd_priv *priv); 314cdaa3cdfSKuninori Morimoto int (*quit)(struct rsnd_mod *mod, 3152c0fac19SKuninori Morimoto struct rsnd_dai_stream *io, 316690602fcSKuninori Morimoto struct rsnd_priv *priv); 317cdaa3cdfSKuninori Morimoto int (*start)(struct rsnd_mod *mod, 3182c0fac19SKuninori Morimoto struct rsnd_dai_stream *io, 319690602fcSKuninori Morimoto struct rsnd_priv *priv); 320cdaa3cdfSKuninori Morimoto int (*stop)(struct rsnd_mod *mod, 3212c0fac19SKuninori Morimoto struct rsnd_dai_stream *io, 322690602fcSKuninori Morimoto struct rsnd_priv *priv); 323b5b442abSKuninori Morimoto int (*irq)(struct rsnd_mod *mod, 324b5b442abSKuninori Morimoto struct rsnd_dai_stream *io, 325b5b442abSKuninori Morimoto struct rsnd_priv *priv, int enable); 326bff58ea4SKuninori Morimoto int (*pcm_new)(struct rsnd_mod *mod, 3272c0fac19SKuninori Morimoto struct rsnd_dai_stream *io, 328bff58ea4SKuninori Morimoto struct snd_soc_pcm_runtime *rtd); 3293b7843ffSKuninori Morimoto int (*hw_params)(struct rsnd_mod *mod, 3302c0fac19SKuninori Morimoto struct rsnd_dai_stream *io, 3313b7843ffSKuninori Morimoto struct snd_pcm_substream *substream, 3323b7843ffSKuninori Morimoto struct snd_pcm_hw_params *hw_params); 33307b7acb5SKuninori Morimoto int (*pointer)(struct rsnd_mod *mod, 33407b7acb5SKuninori Morimoto struct rsnd_dai_stream *io, 33507b7acb5SKuninori Morimoto snd_pcm_uframes_t *pointer); 33697463e19SKuninori Morimoto int (*fallback)(struct rsnd_mod *mod, 3372c0fac19SKuninori Morimoto struct rsnd_dai_stream *io, 338690602fcSKuninori Morimoto struct rsnd_priv *priv); 3394d230d12SJiada Wang int (*prepare)(struct rsnd_mod *mod, 3404d230d12SJiada Wang struct rsnd_dai_stream *io, 3414d230d12SJiada Wang struct rsnd_priv *priv); 3426ab6a247SKuninori Morimoto int (*cleanup)(struct rsnd_mod *mod, 3436ab6a247SKuninori Morimoto struct rsnd_dai_stream *io, 3446ab6a247SKuninori Morimoto struct rsnd_priv *priv); 345859fd6cbSTimo Wischer int (*hw_free)(struct rsnd_mod *mod, 346859fd6cbSTimo Wischer struct rsnd_dai_stream *io, 347859fd6cbSTimo Wischer struct snd_pcm_substream *substream); 3487e7fe06dSKuninori Morimoto u32 *(*get_status)(struct rsnd_mod *mod, 3497e7fe06dSKuninori Morimoto struct rsnd_dai_stream *io, 3507e7fe06dSKuninori Morimoto enum rsnd_mod_type type); 351c16015f3SKuninori Morimoto int (*id)(struct rsnd_mod *mod); 352c16015f3SKuninori Morimoto int (*id_sub)(struct rsnd_mod *mod); 353665c1adeSKuninori Morimoto int (*id_cmd)(struct rsnd_mod *mod); 3541f9c82b5SKuninori Morimoto 3551f9c82b5SKuninori Morimoto #ifdef CONFIG_DEBUG_FS 3561f9c82b5SKuninori Morimoto void (*debug_info)(struct seq_file *m, 3571f9c82b5SKuninori Morimoto struct rsnd_dai_stream *io, struct rsnd_mod *mod); 3581f9c82b5SKuninori Morimoto #endif 359cdaa3cdfSKuninori Morimoto }; 360cdaa3cdfSKuninori Morimoto 3614686a0adSKuninori Morimoto struct rsnd_dai_stream; 362cdaa3cdfSKuninori Morimoto struct rsnd_mod { 363cdaa3cdfSKuninori Morimoto int id; 364a126021dSKuninori Morimoto enum rsnd_mod_type type; 365cdaa3cdfSKuninori Morimoto struct rsnd_mod_ops *ops; 3662099bc8eSKuninori Morimoto struct rsnd_priv *priv; 36785642952SKuninori Morimoto struct clk *clk; 3685ba17b42SKuninori Morimoto u32 status; 369cdaa3cdfSKuninori Morimoto }; 370417f9642SKuninori Morimoto /* 371417f9642SKuninori Morimoto * status 372417f9642SKuninori Morimoto * 3733f4593fbSKuninori Morimoto * 0xH000DCB0 3743b7843ffSKuninori Morimoto * 3755451ea44SKuninori Morimoto * B 0: init 1: quit 3765451ea44SKuninori Morimoto * C 0: start 1: stop 377859fd6cbSTimo Wischer * D 0: hw_params 1: hw_free 3785451ea44SKuninori Morimoto * 3795451ea44SKuninori Morimoto * H is always called (see __rsnd_mod_call) 380417f9642SKuninori Morimoto */ 3815451ea44SKuninori Morimoto #define __rsnd_mod_shift_init 4 3825451ea44SKuninori Morimoto #define __rsnd_mod_shift_quit 4 3835451ea44SKuninori Morimoto #define __rsnd_mod_shift_start 8 3845451ea44SKuninori Morimoto #define __rsnd_mod_shift_stop 8 385859fd6cbSTimo Wischer #define __rsnd_mod_shift_hw_params 12 386859fd6cbSTimo Wischer #define __rsnd_mod_shift_hw_free 12 3870af5c01aSKuninori Morimoto #define __rsnd_mod_shift_probe 28 /* always called */ 3880af5c01aSKuninori Morimoto #define __rsnd_mod_shift_remove 28 /* always called */ 389b5b442abSKuninori Morimoto #define __rsnd_mod_shift_irq 28 /* always called */ 3905451ea44SKuninori Morimoto #define __rsnd_mod_shift_pcm_new 28 /* always called */ 3915451ea44SKuninori Morimoto #define __rsnd_mod_shift_fallback 28 /* always called */ 39207b7acb5SKuninori Morimoto #define __rsnd_mod_shift_pointer 28 /* always called */ 393624d1a7cSDmytro Prokopchuk #define __rsnd_mod_shift_prepare 28 /* always called */ 394624d1a7cSDmytro Prokopchuk #define __rsnd_mod_shift_cleanup 28 /* always called */ 3955451ea44SKuninori Morimoto 3960af5c01aSKuninori Morimoto #define __rsnd_mod_add_probe 0 3970af5c01aSKuninori Morimoto #define __rsnd_mod_add_remove 0 398624d1a7cSDmytro Prokopchuk #define __rsnd_mod_add_prepare 0 399624d1a7cSDmytro Prokopchuk #define __rsnd_mod_add_cleanup 0 400b43b8ae8SKuninori Morimoto #define __rsnd_mod_add_init 1 /* needs protect */ 401b43b8ae8SKuninori Morimoto #define __rsnd_mod_add_quit -1 /* needs protect */ 402b43b8ae8SKuninori Morimoto #define __rsnd_mod_add_start 1 /* needs protect */ 403b43b8ae8SKuninori Morimoto #define __rsnd_mod_add_stop -1 /* needs protect */ 404b43b8ae8SKuninori Morimoto #define __rsnd_mod_add_hw_params 1 /* needs protect */ 405b43b8ae8SKuninori Morimoto #define __rsnd_mod_add_hw_free -1 /* needs protect */ 406b5b442abSKuninori Morimoto #define __rsnd_mod_add_irq 0 4075451ea44SKuninori Morimoto #define __rsnd_mod_add_pcm_new 0 4085451ea44SKuninori Morimoto #define __rsnd_mod_add_fallback 0 40907b7acb5SKuninori Morimoto #define __rsnd_mod_add_pointer 0 410417f9642SKuninori Morimoto 411417f9642SKuninori Morimoto #define __rsnd_mod_call_probe 0 4120af5c01aSKuninori Morimoto #define __rsnd_mod_call_remove 0 4136ab6a247SKuninori Morimoto #define __rsnd_mod_call_prepare 0 414624d1a7cSDmytro Prokopchuk #define __rsnd_mod_call_cleanup 0 4153f4593fbSKuninori Morimoto #define __rsnd_mod_call_init 0 /* needs protect */ 4163f4593fbSKuninori Morimoto #define __rsnd_mod_call_quit 1 /* needs protect */ 4173f4593fbSKuninori Morimoto #define __rsnd_mod_call_start 0 /* needs protect */ 4183f4593fbSKuninori Morimoto #define __rsnd_mod_call_stop 1 /* needs protect */ 4193f4593fbSKuninori Morimoto #define __rsnd_mod_call_hw_params 0 /* needs protect */ 4203f4593fbSKuninori Morimoto #define __rsnd_mod_call_hw_free 1 /* needs protect */ 421b5b442abSKuninori Morimoto #define __rsnd_mod_call_irq 0 422417f9642SKuninori Morimoto #define __rsnd_mod_call_pcm_new 0 423417f9642SKuninori Morimoto #define __rsnd_mod_call_fallback 0 42407b7acb5SKuninori Morimoto #define __rsnd_mod_call_pointer 0 425cdaa3cdfSKuninori Morimoto 4262099bc8eSKuninori Morimoto #define rsnd_mod_to_priv(mod) ((mod)->priv) 427c9929345SKuninori Morimoto #define rsnd_mod_power_on(mod) clk_enable((mod)->clk) 428c9929345SKuninori Morimoto #define rsnd_mod_power_off(mod) clk_disable((mod)->clk) 429b76e218aSKuninori Morimoto #define rsnd_mod_get(ip) (&(ip)->mod) 430cdaa3cdfSKuninori Morimoto 4312099bc8eSKuninori Morimoto int rsnd_mod_init(struct rsnd_priv *priv, 4322099bc8eSKuninori Morimoto struct rsnd_mod *mod, 433cdaa3cdfSKuninori Morimoto struct rsnd_mod_ops *ops, 43485642952SKuninori Morimoto struct clk *clk, 435a126021dSKuninori Morimoto enum rsnd_mod_type type, 436cdaa3cdfSKuninori Morimoto int id); 4372f78dd7fSKuninori Morimoto void rsnd_mod_quit(struct rsnd_mod *mod); 4389b99e9a7SKuninori Morimoto struct dma_chan *rsnd_mod_dma_req(struct rsnd_dai_stream *io, 4399b99e9a7SKuninori Morimoto struct rsnd_mod *mod); 440f501b7a4SKuninori Morimoto void rsnd_mod_interrupt(struct rsnd_mod *mod, 441f501b7a4SKuninori Morimoto void (*callback)(struct rsnd_mod *mod, 442f501b7a4SKuninori Morimoto struct rsnd_dai_stream *io)); 4437e7fe06dSKuninori Morimoto u32 *rsnd_mod_get_status(struct rsnd_mod *mod, 4447e7fe06dSKuninori Morimoto struct rsnd_dai_stream *io, 4455ba17b42SKuninori Morimoto enum rsnd_mod_type type); 446c16015f3SKuninori Morimoto int rsnd_mod_id(struct rsnd_mod *mod); 447c16015f3SKuninori Morimoto int rsnd_mod_id_raw(struct rsnd_mod *mod); 448c16015f3SKuninori Morimoto int rsnd_mod_id_sub(struct rsnd_mod *mod); 449c0ea089dSKuninori Morimoto char *rsnd_mod_name(struct rsnd_mod *mod); 450b3ca3fbeSKuninori Morimoto struct rsnd_mod *rsnd_mod_next(int *iterator, 451b3ca3fbeSKuninori Morimoto struct rsnd_dai_stream *io, 452b3ca3fbeSKuninori Morimoto enum rsnd_mod_type *array, 453b3ca3fbeSKuninori Morimoto int array_size); 454b3ca3fbeSKuninori Morimoto #define for_each_rsnd_mod(iterator, pos, io) \ 455b3ca3fbeSKuninori Morimoto for (iterator = 0; \ 456826e83deSKuninori Morimoto (pos = rsnd_mod_next(&iterator, io, NULL, 0)); iterator++) 457b3ca3fbeSKuninori Morimoto #define for_each_rsnd_mod_arrays(iterator, pos, io, array, size) \ 458b3ca3fbeSKuninori Morimoto for (iterator = 0; \ 459826e83deSKuninori Morimoto (pos = rsnd_mod_next(&iterator, io, array, size)); iterator++) 460b3ca3fbeSKuninori Morimoto #define for_each_rsnd_mod_array(iterator, pos, io, array) \ 461b3ca3fbeSKuninori Morimoto for_each_rsnd_mod_arrays(iterator, pos, io, array, ARRAY_SIZE(array)) 4625ba17b42SKuninori Morimoto 463ec02b5a1SKuninori Morimoto void rsnd_parse_connect_common(struct rsnd_dai *rdai, char *name, 46489b66174SKuninori Morimoto struct rsnd_mod* (*mod_get)(struct rsnd_priv *priv, int id), 46589b66174SKuninori Morimoto struct device_node *node, 46689b66174SKuninori Morimoto struct device_node *playback, 46789b66174SKuninori Morimoto struct device_node *capture); 468c413983eSKuninori Morimoto int rsnd_node_count(struct rsnd_priv *priv, struct device_node *node, char *name); 469d09a7db4SKuninori Morimoto int rsnd_node_fixed_index(struct device *dev, struct device_node *node, char *name, int idx); 470cdaa3cdfSKuninori Morimoto 47166287defSKuninori Morimoto int rsnd_channel_normalization(int chan); 472b2fb31bbSKuninori Morimoto #define rsnd_runtime_channel_original(io) \ 473b2fb31bbSKuninori Morimoto rsnd_runtime_channel_original_with_params(io, NULL) 474b2fb31bbSKuninori Morimoto int rsnd_runtime_channel_original_with_params(struct rsnd_dai_stream *io, 475b2fb31bbSKuninori Morimoto struct snd_pcm_hw_params *params); 476b2fb31bbSKuninori Morimoto #define rsnd_runtime_channel_after_ctu(io) \ 477b2fb31bbSKuninori Morimoto rsnd_runtime_channel_after_ctu_with_params(io, NULL) 478b2fb31bbSKuninori Morimoto int rsnd_runtime_channel_after_ctu_with_params(struct rsnd_dai_stream *io, 479b2fb31bbSKuninori Morimoto struct snd_pcm_hw_params *params); 480b2fb31bbSKuninori Morimoto #define rsnd_runtime_channel_for_ssi(io) \ 481b2fb31bbSKuninori Morimoto rsnd_runtime_channel_for_ssi_with_params(io, NULL) 482b2fb31bbSKuninori Morimoto int rsnd_runtime_channel_for_ssi_with_params(struct rsnd_dai_stream *io, 483b2fb31bbSKuninori Morimoto struct snd_pcm_hw_params *params); 484a6072802SKuninori Morimoto int rsnd_runtime_is_multi_ssi(struct rsnd_dai_stream *io); 485a6072802SKuninori Morimoto int rsnd_runtime_is_tdm(struct rsnd_dai_stream *io); 486f69f4522SKuninori Morimoto int rsnd_runtime_is_tdm_split(struct rsnd_dai_stream *io); 487eed76bb8SKuninori Morimoto 488cdaa3cdfSKuninori Morimoto /* 489be78cea1SKuninori Morimoto * DT 490be78cea1SKuninori Morimoto */ 491be78cea1SKuninori Morimoto #define rsnd_parse_of_node(priv, node) \ 492be78cea1SKuninori Morimoto of_get_child_by_name(rsnd_priv_to_dev(priv)->of_node, node) 493be78cea1SKuninori Morimoto #define RSND_NODE_DAI "rcar_sound,dai" 494be78cea1SKuninori Morimoto #define RSND_NODE_SSI "rcar_sound,ssi" 4954e7788fbSKuninori Morimoto #define RSND_NODE_SSIU "rcar_sound,ssiu" 496be78cea1SKuninori Morimoto #define RSND_NODE_SRC "rcar_sound,src" 497be78cea1SKuninori Morimoto #define RSND_NODE_CTU "rcar_sound,ctu" 498be78cea1SKuninori Morimoto #define RSND_NODE_MIX "rcar_sound,mix" 499be78cea1SKuninori Morimoto #define RSND_NODE_DVC "rcar_sound,dvc" 500be78cea1SKuninori Morimoto 501be78cea1SKuninori Morimoto /* 5021536a968SKuninori Morimoto * R-Car sound DAI 5031536a968SKuninori Morimoto */ 5041536a968SKuninori Morimoto #define RSND_DAI_NAME_SIZE 16 5051536a968SKuninori Morimoto struct rsnd_dai_stream { 506f8c3c309SKuninori Morimoto char name[RSND_DAI_NAME_SIZE]; 5071536a968SKuninori Morimoto struct snd_pcm_substream *substream; 508a126021dSKuninori Morimoto struct rsnd_mod *mod[RSND_MOD_MAX]; 5090e289012SJiada Wang struct rsnd_mod *dma; 51054cb5562SKuninori Morimoto struct rsnd_dai *rdai; 5115423d772SKuninori Morimoto struct device *dmac_dev; /* for IPMMU */ 512c2aaaa57SKuninori Morimoto u32 converted_rate; /* converted sampling rate */ 513c2aaaa57SKuninori Morimoto int converted_chan; /* converted channels */ 5145ba17b42SKuninori Morimoto u32 parent_ssi_status; 515beed78aeSKuninori Morimoto u32 flags; 5161536a968SKuninori Morimoto }; 517beed78aeSKuninori Morimoto 518beed78aeSKuninori Morimoto /* flags */ 519beed78aeSKuninori Morimoto #define RSND_STREAM_HDMI0 (1 << 0) /* for HDMI0 */ 520beed78aeSKuninori Morimoto #define RSND_STREAM_HDMI1 (1 << 1) /* for HDMI1 */ 521f69f4522SKuninori Morimoto #define RSND_STREAM_TDM_SPLIT (1 << 2) /* for TDM split mode */ 5226d612f67SKuninori Morimoto #define RSND_HW_RULE_ERR (1 << 3) /* hw_rule error */ 523beed78aeSKuninori Morimoto 5245cbbadd3SKuninori Morimoto #define rsnd_io_to_mod(io, i) ((i) < RSND_MOD_MAX ? (io)->mod[(i)] : NULL) 5255cbbadd3SKuninori Morimoto #define rsnd_io_to_mod_ssi(io) rsnd_io_to_mod((io), RSND_MOD_SSI) 5263ce2959dSKuninori Morimoto #define rsnd_io_to_mod_ssiu(io) rsnd_io_to_mod((io), RSND_MOD_SSIU) 527e7d850ddSKuninori Morimoto #define rsnd_io_to_mod_ssip(io) rsnd_io_to_mod((io), RSND_MOD_SSIP) 5285cbbadd3SKuninori Morimoto #define rsnd_io_to_mod_src(io) rsnd_io_to_mod((io), RSND_MOD_SRC) 5299269e3c3SKuninori Morimoto #define rsnd_io_to_mod_ctu(io) rsnd_io_to_mod((io), RSND_MOD_CTU) 53070fb1052SKuninori Morimoto #define rsnd_io_to_mod_mix(io) rsnd_io_to_mod((io), RSND_MOD_MIX) 5315cbbadd3SKuninori Morimoto #define rsnd_io_to_mod_dvc(io) rsnd_io_to_mod((io), RSND_MOD_DVC) 532a504b1eeSKuninori Morimoto #define rsnd_io_to_mod_cmd(io) rsnd_io_to_mod((io), RSND_MOD_CMD) 53354cb5562SKuninori Morimoto #define rsnd_io_to_rdai(io) ((io)->rdai) 5341b13d118SKuninori Morimoto #define rsnd_io_to_priv(io) (rsnd_rdai_to_priv(rsnd_io_to_rdai(io))) 535985a4f6eSKuninori Morimoto #define rsnd_io_is_play(io) (&rsnd_io_to_rdai(io)->playback == io) 5369d0e202fSKuninori Morimoto #define rsnd_io_to_runtime(io) ((io)->substream ? \ 5379d0e202fSKuninori Morimoto (io)->substream->runtime : NULL) 538c2aaaa57SKuninori Morimoto #define rsnd_io_converted_rate(io) ((io)->converted_rate) 539c2aaaa57SKuninori Morimoto #define rsnd_io_converted_chan(io) ((io)->converted_chan) 540d5bbe7deSKuninori Morimoto int rsnd_io_is_working(struct rsnd_dai_stream *io); 541985a4f6eSKuninori Morimoto 5421536a968SKuninori Morimoto struct rsnd_dai { 5431536a968SKuninori Morimoto char name[RSND_DAI_NAME_SIZE]; 5441536a968SKuninori Morimoto struct rsnd_dai_stream playback; 5451536a968SKuninori Morimoto struct rsnd_dai_stream capture; 5461b13d118SKuninori Morimoto struct rsnd_priv *priv; 5478cc03722SKuninori Morimoto struct snd_pcm_hw_constraint_list constraint; 548*547b02f7SKuninori Morimoto struct of_phandle_args dai_args; 5491536a968SKuninori Morimoto 5501ff9593dSKuninori Morimoto int max_channels; /* 2ch - 16ch */ 5511ff9593dSKuninori Morimoto int ssi_lane; /* 1lane - 4lane */ 552fb2815f4SDragos Tarcatu int chan_width; /* 16/24/32 bit width */ 5538ec85e7fSKuninori Morimoto 554a3737731SDan Carpenter unsigned int clk_master:1; 555a3737731SDan Carpenter unsigned int bit_clk_inv:1; 556a3737731SDan Carpenter unsigned int frm_clk_inv:1; 557a3737731SDan Carpenter unsigned int sys_delay:1; 558a3737731SDan Carpenter unsigned int data_alignment:1; 5591536a968SKuninori Morimoto }; 5601536a968SKuninori Morimoto 561ecba9e72SKuninori Morimoto #define rsnd_rdai_nr(priv) ((priv)->rdai_nr) 5623ed6448cSKuninori Morimoto #define rsnd_rdai_is_clk_master(rdai) ((rdai)->clk_master) 5631b13d118SKuninori Morimoto #define rsnd_rdai_to_priv(rdai) ((rdai)->priv) 5641536a968SKuninori Morimoto #define for_each_rsnd_dai(rdai, priv, i) \ 56500463c11SKuninori Morimoto for (i = 0; \ 566ecba9e72SKuninori Morimoto (i < rsnd_rdai_nr(priv)) && \ 567710d0889SKuninori Morimoto ((rdai) = rsnd_rdai_get(priv, i)); \ 56800463c11SKuninori Morimoto i++) 5691536a968SKuninori Morimoto 570710d0889SKuninori Morimoto struct rsnd_dai *rsnd_rdai_get(struct rsnd_priv *priv, int id); 571710d0889SKuninori Morimoto 5721ff9593dSKuninori Morimoto #define rsnd_rdai_channels_set(rdai, max_channels) \ 5731ff9593dSKuninori Morimoto rsnd_rdai_channels_ctrl(rdai, max_channels) 5741ff9593dSKuninori Morimoto #define rsnd_rdai_channels_get(rdai) \ 5751ff9593dSKuninori Morimoto rsnd_rdai_channels_ctrl(rdai, 0) 5761ff9593dSKuninori Morimoto int rsnd_rdai_channels_ctrl(struct rsnd_dai *rdai, 5771ff9593dSKuninori Morimoto int max_channels); 5781ff9593dSKuninori Morimoto 5791ff9593dSKuninori Morimoto #define rsnd_rdai_ssi_lane_set(rdai, ssi_lane) \ 5801ff9593dSKuninori Morimoto rsnd_rdai_ssi_lane_ctrl(rdai, ssi_lane) 5811ff9593dSKuninori Morimoto #define rsnd_rdai_ssi_lane_get(rdai) \ 5821ff9593dSKuninori Morimoto rsnd_rdai_ssi_lane_ctrl(rdai, 0) 5831ff9593dSKuninori Morimoto int rsnd_rdai_ssi_lane_ctrl(struct rsnd_dai *rdai, 5841ff9593dSKuninori Morimoto int ssi_lane); 5851ff9593dSKuninori Morimoto 586fb2815f4SDragos Tarcatu #define rsnd_rdai_width_set(rdai, width) \ 587fb2815f4SDragos Tarcatu rsnd_rdai_width_ctrl(rdai, width) 588fb2815f4SDragos Tarcatu #define rsnd_rdai_width_get(rdai) \ 589fb2815f4SDragos Tarcatu rsnd_rdai_width_ctrl(rdai, 0) 590fb2815f4SDragos Tarcatu int rsnd_rdai_width_ctrl(struct rsnd_dai *rdai, int width); 59175defee0SKuninori Morimoto void rsnd_dai_period_elapsed(struct rsnd_dai_stream *io); 59227924f32SKuninori Morimoto int rsnd_dai_connect(struct rsnd_mod *mod, 59327924f32SKuninori Morimoto struct rsnd_dai_stream *io, 59427924f32SKuninori Morimoto enum rsnd_mod_type type); 5951536a968SKuninori Morimoto 5961536a968SKuninori Morimoto /* 5973337744aSKuninori Morimoto * R-Car Gen1/Gen2 5983337744aSKuninori Morimoto */ 5992ea6b074SKuninori Morimoto int rsnd_gen_probe(struct rsnd_priv *priv); 6003337744aSKuninori Morimoto void __iomem *rsnd_gen_reg_get(struct rsnd_priv *priv, 6013337744aSKuninori Morimoto struct rsnd_mod *mod, 6023337744aSKuninori Morimoto enum rsnd_reg reg); 603c5212b45SKuninori Morimoto phys_addr_t rsnd_gen_get_phy_addr(struct rsnd_priv *priv, int reg_id); 6041f9c82b5SKuninori Morimoto #ifdef CONFIG_DEBUG_FS 6051f9c82b5SKuninori Morimoto void __iomem *rsnd_gen_get_base_addr(struct rsnd_priv *priv, int reg_id); 6061f9c82b5SKuninori Morimoto #endif 607ad32d0c7SKuninori Morimoto 6083337744aSKuninori Morimoto /* 609dfc9403bSKuninori Morimoto * R-Car ADG 610dfc9403bSKuninori Morimoto */ 6111dfdc650SKuninori Morimoto int rsnd_adg_clk_query(struct rsnd_priv *priv, unsigned int rate); 612d29a6060SPierre-Louis Bossart int rsnd_adg_ssi_clk_stop(struct rsnd_mod *ssi_mod); 613d29a6060SPierre-Louis Bossart int rsnd_adg_ssi_clk_try_start(struct rsnd_mod *ssi_mod, unsigned int rate); 6142ea6b074SKuninori Morimoto int rsnd_adg_probe(struct rsnd_priv *priv); 6152ea6b074SKuninori Morimoto void rsnd_adg_remove(struct rsnd_priv *priv); 6160102eed5SKuninori Morimoto int rsnd_adg_set_src_timesel_gen2(struct rsnd_mod *src_mod, 617629509c5SKuninori Morimoto struct rsnd_dai_stream *io, 6180102eed5SKuninori Morimoto unsigned int in_rate, 6190102eed5SKuninori Morimoto unsigned int out_rate); 620d29a6060SPierre-Louis Bossart int rsnd_adg_set_cmd_timsel_gen2(struct rsnd_mod *cmd_mod, 621bff58ea4SKuninori Morimoto struct rsnd_dai_stream *io); 622c2d31718SKuninori Morimoto #define rsnd_adg_clk_enable(priv) rsnd_adg_clk_control(priv, 1) 623c2d31718SKuninori Morimoto #define rsnd_adg_clk_disable(priv) rsnd_adg_clk_control(priv, 0) 624c2d31718SKuninori Morimoto void rsnd_adg_clk_control(struct rsnd_priv *priv, int enable); 6251f9c82b5SKuninori Morimoto void rsnd_adg_clk_dbg_info(struct rsnd_priv *priv, struct seq_file *m); 626dfc9403bSKuninori Morimoto 627dfc9403bSKuninori Morimoto /* 6281536a968SKuninori Morimoto * R-Car sound priv 6291536a968SKuninori Morimoto */ 6301536a968SKuninori Morimoto struct rsnd_priv { 6311536a968SKuninori Morimoto 6329f464f8eSKuninori Morimoto struct platform_device *pdev; 6331536a968SKuninori Morimoto spinlock_t lock; 634c51eb1c6SKuninori Morimoto unsigned long flags; 6352ea2cc86SKuninori Morimoto #define RSND_GEN_MASK (0xF << 0) 6362ea2cc86SKuninori Morimoto #define RSND_GEN1 (1 << 0) 6372ea2cc86SKuninori Morimoto #define RSND_GEN2 (2 << 0) 638d188e140SKuninori Morimoto #define RSND_GEN3 (3 << 0) 639c2bc6527SKuninori Morimoto #define RSND_GEN4 (4 << 0) 640ba164a49SJiada Wang #define RSND_SOC_MASK (0xFF << 4) 641ba164a49SJiada Wang #define RSND_SOC_E (1 << 4) /* E1/E2/E3 */ 6421536a968SKuninori Morimoto 6431536a968SKuninori Morimoto /* 6443337744aSKuninori Morimoto * below value will be filled on rsnd_gen_probe() 6453337744aSKuninori Morimoto */ 6463337744aSKuninori Morimoto void *gen; 6473337744aSKuninori Morimoto 6483337744aSKuninori Morimoto /* 649dfc9403bSKuninori Morimoto * below value will be filled on rsnd_adg_probe() 650dfc9403bSKuninori Morimoto */ 651dfc9403bSKuninori Morimoto void *adg; 652dfc9403bSKuninori Morimoto 653dfc9403bSKuninori Morimoto /* 654288f392eSKuninori Morimoto * below value will be filled on rsnd_dma_probe() 655288f392eSKuninori Morimoto */ 656288f392eSKuninori Morimoto void *dma; 657288f392eSKuninori Morimoto 658288f392eSKuninori Morimoto /* 659ae5c3223SKuninori Morimoto * below value will be filled on rsnd_ssi_probe() 660ae5c3223SKuninori Morimoto */ 661dd27d808SKuninori Morimoto void *ssi; 662dd27d808SKuninori Morimoto int ssi_nr; 663ae5c3223SKuninori Morimoto 664ae5c3223SKuninori Morimoto /* 665c7f69ab5SKuninori Morimoto * below value will be filled on rsnd_ssiu_probe() 666c7f69ab5SKuninori Morimoto */ 667c7f69ab5SKuninori Morimoto void *ssiu; 668c7f69ab5SKuninori Morimoto int ssiu_nr; 669c7f69ab5SKuninori Morimoto 670c7f69ab5SKuninori Morimoto /* 67178edead4SKuninori Morimoto * below value will be filled on rsnd_src_probe() 67278edead4SKuninori Morimoto */ 67378edead4SKuninori Morimoto void *src; 67478edead4SKuninori Morimoto int src_nr; 67578edead4SKuninori Morimoto 67678edead4SKuninori Morimoto /* 6779269e3c3SKuninori Morimoto * below value will be filled on rsnd_ctu_probe() 6789269e3c3SKuninori Morimoto */ 6799269e3c3SKuninori Morimoto void *ctu; 6809269e3c3SKuninori Morimoto int ctu_nr; 6819269e3c3SKuninori Morimoto 6829269e3c3SKuninori Morimoto /* 68370fb1052SKuninori Morimoto * below value will be filled on rsnd_mix_probe() 68470fb1052SKuninori Morimoto */ 68570fb1052SKuninori Morimoto void *mix; 68670fb1052SKuninori Morimoto int mix_nr; 68770fb1052SKuninori Morimoto 68870fb1052SKuninori Morimoto /* 689bff58ea4SKuninori Morimoto * below value will be filled on rsnd_dvc_probe() 690bff58ea4SKuninori Morimoto */ 691bff58ea4SKuninori Morimoto void *dvc; 692bff58ea4SKuninori Morimoto int dvc_nr; 693bff58ea4SKuninori Morimoto 694bff58ea4SKuninori Morimoto /* 6951b2ca0adSKuninori Morimoto * below value will be filled on rsnd_cmd_probe() 6961b2ca0adSKuninori Morimoto */ 6971b2ca0adSKuninori Morimoto void *cmd; 6981b2ca0adSKuninori Morimoto int cmd_nr; 6991b2ca0adSKuninori Morimoto 7001b2ca0adSKuninori Morimoto /* 7011536a968SKuninori Morimoto * below value will be filled on rsnd_dai_probe() 7021536a968SKuninori Morimoto */ 7031536a968SKuninori Morimoto struct snd_soc_dai_driver *daidrv; 7041536a968SKuninori Morimoto struct rsnd_dai *rdai; 705ecba9e72SKuninori Morimoto int rdai_nr; 706*547b02f7SKuninori Morimoto 707*547b02f7SKuninori Morimoto #define RSND_MAX_COMPONENT 3 708*547b02f7SKuninori Morimoto int component_dais[RSND_MAX_COMPONENT]; 7091536a968SKuninori Morimoto }; 7101536a968SKuninori Morimoto 7119f464f8eSKuninori Morimoto #define rsnd_priv_to_pdev(priv) ((priv)->pdev) 7129f464f8eSKuninori Morimoto #define rsnd_priv_to_dev(priv) (&(rsnd_priv_to_pdev(priv)->dev)) 7131536a968SKuninori Morimoto 714348d592cSKuninori Morimoto #define rsnd_is_gen1(priv) (((priv)->flags & RSND_GEN_MASK) == RSND_GEN1) 715348d592cSKuninori Morimoto #define rsnd_is_gen2(priv) (((priv)->flags & RSND_GEN_MASK) == RSND_GEN2) 716d188e140SKuninori Morimoto #define rsnd_is_gen3(priv) (((priv)->flags & RSND_GEN_MASK) == RSND_GEN3) 717c2bc6527SKuninori Morimoto #define rsnd_is_gen4(priv) (((priv)->flags & RSND_GEN_MASK) == RSND_GEN4) 718ba164a49SJiada Wang #define rsnd_is_e3(priv) (((priv)->flags & \ 719ba164a49SJiada Wang (RSND_GEN_MASK | RSND_SOC_MASK)) == \ 720ba164a49SJiada Wang (RSND_GEN3 | RSND_SOC_E)) 721348d592cSKuninori Morimoto 72242991989SKuninori Morimoto #define rsnd_flags_has(p, f) ((p)->flags & (f)) 72342991989SKuninori Morimoto #define rsnd_flags_set(p, f) ((p)->flags |= (f)) 72442991989SKuninori Morimoto #define rsnd_flags_del(p, f) ((p)->flags &= ~(f)) 72542991989SKuninori Morimoto 72607539c1dSKuninori Morimoto /* 727170a2497SKuninori Morimoto * rsnd_kctrl 728170a2497SKuninori Morimoto */ 729170a2497SKuninori Morimoto struct rsnd_kctrl_cfg { 730170a2497SKuninori Morimoto unsigned int max; 731170a2497SKuninori Morimoto unsigned int size; 732170a2497SKuninori Morimoto u32 *val; 733170a2497SKuninori Morimoto const char * const *texts; 734f0b04d8bSKuninori Morimoto int (*accept)(struct rsnd_dai_stream *io); 735b65a7cccSKuninori Morimoto void (*update)(struct rsnd_dai_stream *io, struct rsnd_mod *mod); 736b65a7cccSKuninori Morimoto struct rsnd_dai_stream *io; 737d1f83d6eSKuninori Morimoto struct snd_card *card; 738d1f83d6eSKuninori Morimoto struct snd_kcontrol *kctrl; 73916d44989SKuninori Morimoto struct rsnd_mod *mod; 740170a2497SKuninori Morimoto }; 741170a2497SKuninori Morimoto 742d2240f0dSKuninori Morimoto #define RSND_MAX_CHANNELS 8 743170a2497SKuninori Morimoto struct rsnd_kctrl_cfg_m { 744170a2497SKuninori Morimoto struct rsnd_kctrl_cfg cfg; 745d2240f0dSKuninori Morimoto u32 val[RSND_MAX_CHANNELS]; 746170a2497SKuninori Morimoto }; 747170a2497SKuninori Morimoto 748170a2497SKuninori Morimoto struct rsnd_kctrl_cfg_s { 749170a2497SKuninori Morimoto struct rsnd_kctrl_cfg cfg; 750170a2497SKuninori Morimoto u32 val; 751170a2497SKuninori Morimoto }; 7523a9fa27bSKuninori Morimoto #define rsnd_kctrl_size(x) ((x).cfg.size) 7533a9fa27bSKuninori Morimoto #define rsnd_kctrl_max(x) ((x).cfg.max) 7543a9fa27bSKuninori Morimoto #define rsnd_kctrl_valm(x, i) ((x).val[i]) /* = (x).cfg.val[i] */ 7553a9fa27bSKuninori Morimoto #define rsnd_kctrl_vals(x) ((x).val) /* = (x).cfg.val[0] */ 756170a2497SKuninori Morimoto 757f0b04d8bSKuninori Morimoto int rsnd_kctrl_accept_anytime(struct rsnd_dai_stream *io); 758f0b04d8bSKuninori Morimoto int rsnd_kctrl_accept_runtime(struct rsnd_dai_stream *io); 75932973dcfSKuninori Morimoto struct rsnd_kctrl_cfg *rsnd_kctrl_init_m(struct rsnd_kctrl_cfg_m *cfg); 76032973dcfSKuninori Morimoto struct rsnd_kctrl_cfg *rsnd_kctrl_init_s(struct rsnd_kctrl_cfg_s *cfg); 76132973dcfSKuninori Morimoto int rsnd_kctrl_new(struct rsnd_mod *mod, 762b65a7cccSKuninori Morimoto struct rsnd_dai_stream *io, 763170a2497SKuninori Morimoto struct snd_soc_pcm_runtime *rtd, 764170a2497SKuninori Morimoto const unsigned char *name, 765f0b04d8bSKuninori Morimoto int (*accept)(struct rsnd_dai_stream *io), 766b65a7cccSKuninori Morimoto void (*update)(struct rsnd_dai_stream *io, 767b65a7cccSKuninori Morimoto struct rsnd_mod *mod), 76832973dcfSKuninori Morimoto struct rsnd_kctrl_cfg *cfg, 769170a2497SKuninori Morimoto const char * const *texts, 77032973dcfSKuninori Morimoto int size, 771170a2497SKuninori Morimoto u32 max); 772170a2497SKuninori Morimoto 773f0b04d8bSKuninori Morimoto #define rsnd_kctrl_new_m(mod, io, rtd, name, accept, update, cfg, size, max) \ 774f0b04d8bSKuninori Morimoto rsnd_kctrl_new(mod, io, rtd, name, accept, update, rsnd_kctrl_init_m(cfg), \ 77532973dcfSKuninori Morimoto NULL, size, max) 77632973dcfSKuninori Morimoto 777f0b04d8bSKuninori Morimoto #define rsnd_kctrl_new_s(mod, io, rtd, name, accept, update, cfg, max) \ 778f0b04d8bSKuninori Morimoto rsnd_kctrl_new(mod, io, rtd, name, accept, update, rsnd_kctrl_init_s(cfg), \ 77932973dcfSKuninori Morimoto NULL, 1, max) 78032973dcfSKuninori Morimoto 781f3c26ac6SKuninori Morimoto #define rsnd_kctrl_new_e(mod, io, rtd, name, accept, update, cfg, texts, size) \ 782f0b04d8bSKuninori Morimoto rsnd_kctrl_new(mod, io, rtd, name, accept, update, rsnd_kctrl_init_s(cfg), \ 783f3c26ac6SKuninori Morimoto texts, 1, size) 784f3c26ac6SKuninori Morimoto 785f3c26ac6SKuninori Morimoto extern const char * const volume_ramp_rate[]; 786f3c26ac6SKuninori Morimoto #define VOLUME_RAMP_MAX_DVC (0x17 + 1) 7873e3c9ee1SKuninori Morimoto #define VOLUME_RAMP_MAX_MIX (0x0a + 1) 78832973dcfSKuninori Morimoto 789170a2497SKuninori Morimoto /* 79078edead4SKuninori Morimoto * R-Car SSI 79178edead4SKuninori Morimoto */ 7922ea6b074SKuninori Morimoto int rsnd_ssi_probe(struct rsnd_priv *priv); 7932ea6b074SKuninori Morimoto void rsnd_ssi_remove(struct rsnd_priv *priv); 79478edead4SKuninori Morimoto struct rsnd_mod *rsnd_ssi_mod_get(struct rsnd_priv *priv, int id); 795b415b4d3SKuninori Morimoto int rsnd_ssi_use_busif(struct rsnd_dai_stream *io); 79625b384b8SKuninori Morimoto u32 rsnd_ssi_multi_secondaries_runtime(struct rsnd_dai_stream *io); 797ab62e8a8SKuninori Morimoto int rsnd_ssi_is_dma_mode(struct rsnd_mod *mod); 798b415b4d3SKuninori Morimoto 799b415b4d3SKuninori Morimoto #define rsnd_ssi_is_pin_sharing(io) \ 800b415b4d3SKuninori Morimoto __rsnd_ssi_is_pin_sharing(rsnd_io_to_mod_ssi(io)) 801b415b4d3SKuninori Morimoto int __rsnd_ssi_is_pin_sharing(struct rsnd_mod *mod); 80278edead4SKuninori Morimoto 803be78cea1SKuninori Morimoto #define rsnd_ssi_of_node(priv) rsnd_parse_of_node(priv, RSND_NODE_SSI) 804b4c83b17SKuninori Morimoto void rsnd_parse_connect_ssi(struct rsnd_dai *rdai, 805b4c83b17SKuninori Morimoto struct device_node *playback, 806b4c83b17SKuninori Morimoto struct device_node *capture); 807fb2815f4SDragos Tarcatu unsigned int rsnd_ssi_clk_query(struct rsnd_dai *rdai, 808ef4cf5d6SKuninori Morimoto int param1, int param2, int *idx); 80994e2710cSKuninori Morimoto 81078edead4SKuninori Morimoto /* 811c7f69ab5SKuninori Morimoto * R-Car SSIU 812c7f69ab5SKuninori Morimoto */ 813c7f69ab5SKuninori Morimoto int rsnd_ssiu_attach(struct rsnd_dai_stream *io, 814c7f69ab5SKuninori Morimoto struct rsnd_mod *mod); 8152ea6b074SKuninori Morimoto int rsnd_ssiu_probe(struct rsnd_priv *priv); 8162ea6b074SKuninori Morimoto void rsnd_ssiu_remove(struct rsnd_priv *priv); 8174e7788fbSKuninori Morimoto void rsnd_parse_connect_ssiu(struct rsnd_dai *rdai, 8184e7788fbSKuninori Morimoto struct device_node *playback, 8194e7788fbSKuninori Morimoto struct device_node *capture); 8204e7788fbSKuninori Morimoto #define rsnd_ssiu_of_node(priv) rsnd_parse_of_node(priv, RSND_NODE_SSIU) 82183b220cfSKuninori Morimoto bool rsnd_ssiu_busif_err_status_clear(struct rsnd_mod *mod); 822c7f69ab5SKuninori Morimoto 823c7f69ab5SKuninori Morimoto /* 824ba9c949fSKuninori Morimoto * R-Car SRC 82507539c1dSKuninori Morimoto */ 8262ea6b074SKuninori Morimoto int rsnd_src_probe(struct rsnd_priv *priv); 8272ea6b074SKuninori Morimoto void rsnd_src_remove(struct rsnd_priv *priv); 828ba9c949fSKuninori Morimoto struct rsnd_mod *rsnd_src_mod_get(struct rsnd_priv *priv, int id); 829cbf1494fSKuninori Morimoto 830cbf1494fSKuninori Morimoto #define rsnd_src_get_in_rate(priv, io) rsnd_src_get_rate(priv, io, 1) 831cbf1494fSKuninori Morimoto #define rsnd_src_get_out_rate(priv, io) rsnd_src_get_rate(priv, io, 0) 832cbf1494fSKuninori Morimoto unsigned int rsnd_src_get_rate(struct rsnd_priv *priv, 833374e5426SKuninori Morimoto struct rsnd_dai_stream *io, 834cbf1494fSKuninori Morimoto int is_in); 835cbf1494fSKuninori Morimoto 836be78cea1SKuninori Morimoto #define rsnd_src_of_node(priv) rsnd_parse_of_node(priv, RSND_NODE_SRC) 83789b66174SKuninori Morimoto #define rsnd_parse_connect_src(rdai, playback, capture) \ 838ec02b5a1SKuninori Morimoto rsnd_parse_connect_common(rdai, "src", rsnd_src_mod_get, \ 83989b66174SKuninori Morimoto rsnd_src_of_node(rsnd_rdai_to_priv(rdai)), \ 84089b66174SKuninori Morimoto playback, capture) 841ef749400SKuninori Morimoto 842ae5c3223SKuninori Morimoto /* 8439269e3c3SKuninori Morimoto * R-Car CTU 8449269e3c3SKuninori Morimoto */ 8452ea6b074SKuninori Morimoto int rsnd_ctu_probe(struct rsnd_priv *priv); 8462ea6b074SKuninori Morimoto void rsnd_ctu_remove(struct rsnd_priv *priv); 8479269e3c3SKuninori Morimoto struct rsnd_mod *rsnd_ctu_mod_get(struct rsnd_priv *priv, int id); 848be78cea1SKuninori Morimoto #define rsnd_ctu_of_node(priv) rsnd_parse_of_node(priv, RSND_NODE_CTU) 84989b66174SKuninori Morimoto #define rsnd_parse_connect_ctu(rdai, playback, capture) \ 850ec02b5a1SKuninori Morimoto rsnd_parse_connect_common(rdai, "ctu", rsnd_ctu_mod_get, \ 85189b66174SKuninori Morimoto rsnd_ctu_of_node(rsnd_rdai_to_priv(rdai)), \ 85289b66174SKuninori Morimoto playback, capture) 8539269e3c3SKuninori Morimoto 8549269e3c3SKuninori Morimoto /* 85570fb1052SKuninori Morimoto * R-Car MIX 85670fb1052SKuninori Morimoto */ 8572ea6b074SKuninori Morimoto int rsnd_mix_probe(struct rsnd_priv *priv); 8582ea6b074SKuninori Morimoto void rsnd_mix_remove(struct rsnd_priv *priv); 85970fb1052SKuninori Morimoto struct rsnd_mod *rsnd_mix_mod_get(struct rsnd_priv *priv, int id); 860be78cea1SKuninori Morimoto #define rsnd_mix_of_node(priv) rsnd_parse_of_node(priv, RSND_NODE_MIX) 86189b66174SKuninori Morimoto #define rsnd_parse_connect_mix(rdai, playback, capture) \ 862ec02b5a1SKuninori Morimoto rsnd_parse_connect_common(rdai, "mix", rsnd_mix_mod_get, \ 86389b66174SKuninori Morimoto rsnd_mix_of_node(rsnd_rdai_to_priv(rdai)), \ 86489b66174SKuninori Morimoto playback, capture) 86570fb1052SKuninori Morimoto 86670fb1052SKuninori Morimoto /* 867bff58ea4SKuninori Morimoto * R-Car DVC 868bff58ea4SKuninori Morimoto */ 8692ea6b074SKuninori Morimoto int rsnd_dvc_probe(struct rsnd_priv *priv); 8702ea6b074SKuninori Morimoto void rsnd_dvc_remove(struct rsnd_priv *priv); 871bff58ea4SKuninori Morimoto struct rsnd_mod *rsnd_dvc_mod_get(struct rsnd_priv *priv, int id); 872be78cea1SKuninori Morimoto #define rsnd_dvc_of_node(priv) rsnd_parse_of_node(priv, RSND_NODE_DVC) 87389b66174SKuninori Morimoto #define rsnd_parse_connect_dvc(rdai, playback, capture) \ 874ec02b5a1SKuninori Morimoto rsnd_parse_connect_common(rdai, "dvc", rsnd_dvc_mod_get, \ 87589b66174SKuninori Morimoto rsnd_dvc_of_node(rsnd_rdai_to_priv(rdai)), \ 87689b66174SKuninori Morimoto playback, capture) 877bff58ea4SKuninori Morimoto 8781b2ca0adSKuninori Morimoto /* 8791b2ca0adSKuninori Morimoto * R-Car CMD 8801b2ca0adSKuninori Morimoto */ 8812ea6b074SKuninori Morimoto int rsnd_cmd_probe(struct rsnd_priv *priv); 8822ea6b074SKuninori Morimoto void rsnd_cmd_remove(struct rsnd_priv *priv); 8831b2ca0adSKuninori Morimoto int rsnd_cmd_attach(struct rsnd_dai_stream *io, int id); 8841b2ca0adSKuninori Morimoto 885f1df1229SKuninori Morimoto void rsnd_mod_make_sure(struct rsnd_mod *mod, enum rsnd_mod_type type); 8869ca5e57dSKuninori Morimoto #ifdef DEBUG 887f1df1229SKuninori Morimoto #define rsnd_mod_confirm_ssi(mssi) rsnd_mod_make_sure(mssi, RSND_MOD_SSI) 888f1df1229SKuninori Morimoto #define rsnd_mod_confirm_src(msrc) rsnd_mod_make_sure(msrc, RSND_MOD_SRC) 889f1df1229SKuninori Morimoto #define rsnd_mod_confirm_dvc(mdvc) rsnd_mod_make_sure(mdvc, RSND_MOD_DVC) 890f1df1229SKuninori Morimoto #else 891f1df1229SKuninori Morimoto #define rsnd_mod_confirm_ssi(mssi) 892f1df1229SKuninori Morimoto #define rsnd_mod_confirm_src(msrc) 893f1df1229SKuninori Morimoto #define rsnd_mod_confirm_dvc(mdvc) 894f1df1229SKuninori Morimoto #endif 895f1df1229SKuninori Morimoto 8962b627869SKuninori Morimoto /* 8972b627869SKuninori Morimoto * If you don't need interrupt status debug message, 8982b627869SKuninori Morimoto * define RSND_DEBUG_NO_IRQ_STATUS as 1 on top of src.c/ssi.c 8992b627869SKuninori Morimoto * 9002b627869SKuninori Morimoto * #define RSND_DEBUG_NO_IRQ_STATUS 1 9012b627869SKuninori Morimoto */ 9021788a152SKuninori Morimoto #define rsnd_print_irq_status(dev, param...) do { \ 9032b627869SKuninori Morimoto if (!IS_BUILTIN(RSND_DEBUG_NO_IRQ_STATUS)) \ 9041788a152SKuninori Morimoto dev_info(dev, param); \ 9051788a152SKuninori Morimoto } while (0) 9062b627869SKuninori Morimoto 9071f9c82b5SKuninori Morimoto #ifdef CONFIG_DEBUG_FS 9081f9c82b5SKuninori Morimoto int rsnd_debugfs_probe(struct snd_soc_component *component); 9091f9c82b5SKuninori Morimoto void rsnd_debugfs_reg_show(struct seq_file *m, phys_addr_t _addr, 9101f9c82b5SKuninori Morimoto void __iomem *base, int offset, int size); 9111f9c82b5SKuninori Morimoto void rsnd_debugfs_mod_reg_show(struct seq_file *m, struct rsnd_mod *mod, 9121f9c82b5SKuninori Morimoto int reg_id, int offset, int size); 9131f9c82b5SKuninori Morimoto 9141f9c82b5SKuninori Morimoto #else 9151f9c82b5SKuninori Morimoto #define rsnd_debugfs_probe NULL 9161f9c82b5SKuninori Morimoto #endif 91749123b51SKuninori Morimoto 91849123b51SKuninori Morimoto #endif /* RSND_H */ 919