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