162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci//
362306a36Sopenharmony_ci// Renesas R-Car
462306a36Sopenharmony_ci//
562306a36Sopenharmony_ci// Copyright (C) 2013 Renesas Solutions Corp.
662306a36Sopenharmony_ci// Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#ifndef RSND_H
962306a36Sopenharmony_ci#define RSND_H
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#include <linux/clk.h>
1262306a36Sopenharmony_ci#include <linux/device.h>
1362306a36Sopenharmony_ci#include <linux/dma-mapping.h>
1462306a36Sopenharmony_ci#include <linux/io.h>
1562306a36Sopenharmony_ci#include <linux/list.h>
1662306a36Sopenharmony_ci#include <linux/module.h>
1762306a36Sopenharmony_ci#include <linux/of_device.h>
1862306a36Sopenharmony_ci#include <linux/of_graph.h>
1962306a36Sopenharmony_ci#include <linux/of_irq.h>
2062306a36Sopenharmony_ci#include <linux/sh_dma.h>
2162306a36Sopenharmony_ci#include <linux/workqueue.h>
2262306a36Sopenharmony_ci#include <sound/soc.h>
2362306a36Sopenharmony_ci#include <sound/pcm_params.h>
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci#define RSND_GEN1_SRU	0
2662306a36Sopenharmony_ci#define RSND_GEN1_ADG	1
2762306a36Sopenharmony_ci#define RSND_GEN1_SSI	2
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci#define RSND_GEN2_SCU	0
3062306a36Sopenharmony_ci#define RSND_GEN2_ADG	1
3162306a36Sopenharmony_ci#define RSND_GEN2_SSIU	2
3262306a36Sopenharmony_ci#define RSND_GEN2_SSI	3
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci#define RSND_GEN4_ADG	0
3562306a36Sopenharmony_ci#define RSND_GEN4_SSIU	1
3662306a36Sopenharmony_ci#define RSND_GEN4_SSI	2
3762306a36Sopenharmony_ci#define RSND_GEN4_SDMC	3
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci#define RSND_BASE_MAX	4
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci/*
4262306a36Sopenharmony_ci *	pseudo register
4362306a36Sopenharmony_ci *
4462306a36Sopenharmony_ci * The register address offsets SRU/SCU/SSIU on Gen1/Gen2 are very different.
4562306a36Sopenharmony_ci * This driver uses pseudo register in order to hide it.
4662306a36Sopenharmony_ci * see gen1/gen2 for detail
4762306a36Sopenharmony_ci */
4862306a36Sopenharmony_cienum rsnd_reg {
4962306a36Sopenharmony_ci	/* SCU (MIX/CTU/DVC) */
5062306a36Sopenharmony_ci	SRC_I_BUSIF_MODE,
5162306a36Sopenharmony_ci	SRC_O_BUSIF_MODE,
5262306a36Sopenharmony_ci	SRC_ROUTE_MODE0,
5362306a36Sopenharmony_ci	SRC_SWRSR,
5462306a36Sopenharmony_ci	SRC_SRCIR,
5562306a36Sopenharmony_ci	SRC_ADINR,
5662306a36Sopenharmony_ci	SRC_IFSCR,
5762306a36Sopenharmony_ci	SRC_IFSVR,
5862306a36Sopenharmony_ci	SRC_SRCCR,
5962306a36Sopenharmony_ci	SRC_CTRL,
6062306a36Sopenharmony_ci	SRC_BSDSR,
6162306a36Sopenharmony_ci	SRC_BSISR,
6262306a36Sopenharmony_ci	SRC_INT_ENABLE0,
6362306a36Sopenharmony_ci	SRC_BUSIF_DALIGN,
6462306a36Sopenharmony_ci	SRCIN_TIMSEL0,
6562306a36Sopenharmony_ci	SRCIN_TIMSEL1,
6662306a36Sopenharmony_ci	SRCIN_TIMSEL2,
6762306a36Sopenharmony_ci	SRCIN_TIMSEL3,
6862306a36Sopenharmony_ci	SRCIN_TIMSEL4,
6962306a36Sopenharmony_ci	SRCOUT_TIMSEL0,
7062306a36Sopenharmony_ci	SRCOUT_TIMSEL1,
7162306a36Sopenharmony_ci	SRCOUT_TIMSEL2,
7262306a36Sopenharmony_ci	SRCOUT_TIMSEL3,
7362306a36Sopenharmony_ci	SRCOUT_TIMSEL4,
7462306a36Sopenharmony_ci	SCU_SYS_STATUS0,
7562306a36Sopenharmony_ci	SCU_SYS_STATUS1,
7662306a36Sopenharmony_ci	SCU_SYS_INT_EN0,
7762306a36Sopenharmony_ci	SCU_SYS_INT_EN1,
7862306a36Sopenharmony_ci	CMD_CTRL,
7962306a36Sopenharmony_ci	CMD_BUSIF_MODE,
8062306a36Sopenharmony_ci	CMD_BUSIF_DALIGN,
8162306a36Sopenharmony_ci	CMD_ROUTE_SLCT,
8262306a36Sopenharmony_ci	CMDOUT_TIMSEL,
8362306a36Sopenharmony_ci	CTU_SWRSR,
8462306a36Sopenharmony_ci	CTU_CTUIR,
8562306a36Sopenharmony_ci	CTU_ADINR,
8662306a36Sopenharmony_ci	CTU_CPMDR,
8762306a36Sopenharmony_ci	CTU_SCMDR,
8862306a36Sopenharmony_ci	CTU_SV00R,
8962306a36Sopenharmony_ci	CTU_SV01R,
9062306a36Sopenharmony_ci	CTU_SV02R,
9162306a36Sopenharmony_ci	CTU_SV03R,
9262306a36Sopenharmony_ci	CTU_SV04R,
9362306a36Sopenharmony_ci	CTU_SV05R,
9462306a36Sopenharmony_ci	CTU_SV06R,
9562306a36Sopenharmony_ci	CTU_SV07R,
9662306a36Sopenharmony_ci	CTU_SV10R,
9762306a36Sopenharmony_ci	CTU_SV11R,
9862306a36Sopenharmony_ci	CTU_SV12R,
9962306a36Sopenharmony_ci	CTU_SV13R,
10062306a36Sopenharmony_ci	CTU_SV14R,
10162306a36Sopenharmony_ci	CTU_SV15R,
10262306a36Sopenharmony_ci	CTU_SV16R,
10362306a36Sopenharmony_ci	CTU_SV17R,
10462306a36Sopenharmony_ci	CTU_SV20R,
10562306a36Sopenharmony_ci	CTU_SV21R,
10662306a36Sopenharmony_ci	CTU_SV22R,
10762306a36Sopenharmony_ci	CTU_SV23R,
10862306a36Sopenharmony_ci	CTU_SV24R,
10962306a36Sopenharmony_ci	CTU_SV25R,
11062306a36Sopenharmony_ci	CTU_SV26R,
11162306a36Sopenharmony_ci	CTU_SV27R,
11262306a36Sopenharmony_ci	CTU_SV30R,
11362306a36Sopenharmony_ci	CTU_SV31R,
11462306a36Sopenharmony_ci	CTU_SV32R,
11562306a36Sopenharmony_ci	CTU_SV33R,
11662306a36Sopenharmony_ci	CTU_SV34R,
11762306a36Sopenharmony_ci	CTU_SV35R,
11862306a36Sopenharmony_ci	CTU_SV36R,
11962306a36Sopenharmony_ci	CTU_SV37R,
12062306a36Sopenharmony_ci	MIX_SWRSR,
12162306a36Sopenharmony_ci	MIX_MIXIR,
12262306a36Sopenharmony_ci	MIX_ADINR,
12362306a36Sopenharmony_ci	MIX_MIXMR,
12462306a36Sopenharmony_ci	MIX_MVPDR,
12562306a36Sopenharmony_ci	MIX_MDBAR,
12662306a36Sopenharmony_ci	MIX_MDBBR,
12762306a36Sopenharmony_ci	MIX_MDBCR,
12862306a36Sopenharmony_ci	MIX_MDBDR,
12962306a36Sopenharmony_ci	MIX_MDBER,
13062306a36Sopenharmony_ci	DVC_SWRSR,
13162306a36Sopenharmony_ci	DVC_DVUIR,
13262306a36Sopenharmony_ci	DVC_ADINR,
13362306a36Sopenharmony_ci	DVC_DVUCR,
13462306a36Sopenharmony_ci	DVC_ZCMCR,
13562306a36Sopenharmony_ci	DVC_VOL0R,
13662306a36Sopenharmony_ci	DVC_VOL1R,
13762306a36Sopenharmony_ci	DVC_VOL2R,
13862306a36Sopenharmony_ci	DVC_VOL3R,
13962306a36Sopenharmony_ci	DVC_VOL4R,
14062306a36Sopenharmony_ci	DVC_VOL5R,
14162306a36Sopenharmony_ci	DVC_VOL6R,
14262306a36Sopenharmony_ci	DVC_VOL7R,
14362306a36Sopenharmony_ci	DVC_DVUER,
14462306a36Sopenharmony_ci	DVC_VRCTR,
14562306a36Sopenharmony_ci	DVC_VRPDR,
14662306a36Sopenharmony_ci	DVC_VRDBR,
14762306a36Sopenharmony_ci
14862306a36Sopenharmony_ci	/* ADG */
14962306a36Sopenharmony_ci	BRRA,
15062306a36Sopenharmony_ci	BRRB,
15162306a36Sopenharmony_ci	BRGCKR,
15262306a36Sopenharmony_ci	DIV_EN,
15362306a36Sopenharmony_ci	AUDIO_CLK_SEL0,
15462306a36Sopenharmony_ci	AUDIO_CLK_SEL1,
15562306a36Sopenharmony_ci	AUDIO_CLK_SEL2,
15662306a36Sopenharmony_ci
15762306a36Sopenharmony_ci	/* SSIU */
15862306a36Sopenharmony_ci	SSI_MODE,
15962306a36Sopenharmony_ci	SSI_MODE0,
16062306a36Sopenharmony_ci	SSI_MODE1,
16162306a36Sopenharmony_ci	SSI_MODE2,
16262306a36Sopenharmony_ci	SSI_CONTROL,
16362306a36Sopenharmony_ci	SSI_CTRL,
16462306a36Sopenharmony_ci	SSI_BUSIF0_MODE,
16562306a36Sopenharmony_ci	SSI_BUSIF1_MODE,
16662306a36Sopenharmony_ci	SSI_BUSIF2_MODE,
16762306a36Sopenharmony_ci	SSI_BUSIF3_MODE,
16862306a36Sopenharmony_ci	SSI_BUSIF4_MODE,
16962306a36Sopenharmony_ci	SSI_BUSIF5_MODE,
17062306a36Sopenharmony_ci	SSI_BUSIF6_MODE,
17162306a36Sopenharmony_ci	SSI_BUSIF7_MODE,
17262306a36Sopenharmony_ci	SSI_BUSIF0_ADINR,
17362306a36Sopenharmony_ci	SSI_BUSIF1_ADINR,
17462306a36Sopenharmony_ci	SSI_BUSIF2_ADINR,
17562306a36Sopenharmony_ci	SSI_BUSIF3_ADINR,
17662306a36Sopenharmony_ci	SSI_BUSIF4_ADINR,
17762306a36Sopenharmony_ci	SSI_BUSIF5_ADINR,
17862306a36Sopenharmony_ci	SSI_BUSIF6_ADINR,
17962306a36Sopenharmony_ci	SSI_BUSIF7_ADINR,
18062306a36Sopenharmony_ci	SSI_BUSIF0_DALIGN,
18162306a36Sopenharmony_ci	SSI_BUSIF1_DALIGN,
18262306a36Sopenharmony_ci	SSI_BUSIF2_DALIGN,
18362306a36Sopenharmony_ci	SSI_BUSIF3_DALIGN,
18462306a36Sopenharmony_ci	SSI_BUSIF4_DALIGN,
18562306a36Sopenharmony_ci	SSI_BUSIF5_DALIGN,
18662306a36Sopenharmony_ci	SSI_BUSIF6_DALIGN,
18762306a36Sopenharmony_ci	SSI_BUSIF7_DALIGN,
18862306a36Sopenharmony_ci	SSI_INT_ENABLE,
18962306a36Sopenharmony_ci	SSI_SYS_STATUS0,
19062306a36Sopenharmony_ci	SSI_SYS_STATUS1,
19162306a36Sopenharmony_ci	SSI_SYS_STATUS2,
19262306a36Sopenharmony_ci	SSI_SYS_STATUS3,
19362306a36Sopenharmony_ci	SSI_SYS_STATUS4,
19462306a36Sopenharmony_ci	SSI_SYS_STATUS5,
19562306a36Sopenharmony_ci	SSI_SYS_STATUS6,
19662306a36Sopenharmony_ci	SSI_SYS_STATUS7,
19762306a36Sopenharmony_ci	SSI_SYS_INT_ENABLE0,
19862306a36Sopenharmony_ci	SSI_SYS_INT_ENABLE1,
19962306a36Sopenharmony_ci	SSI_SYS_INT_ENABLE2,
20062306a36Sopenharmony_ci	SSI_SYS_INT_ENABLE3,
20162306a36Sopenharmony_ci	SSI_SYS_INT_ENABLE4,
20262306a36Sopenharmony_ci	SSI_SYS_INT_ENABLE5,
20362306a36Sopenharmony_ci	SSI_SYS_INT_ENABLE6,
20462306a36Sopenharmony_ci	SSI_SYS_INT_ENABLE7,
20562306a36Sopenharmony_ci	SSI_BUSIF,
20662306a36Sopenharmony_ci	HDMI0_SEL,
20762306a36Sopenharmony_ci	HDMI1_SEL,
20862306a36Sopenharmony_ci	SSI9_BUSIF0_MODE,
20962306a36Sopenharmony_ci	SSI9_BUSIF1_MODE,
21062306a36Sopenharmony_ci	SSI9_BUSIF2_MODE,
21162306a36Sopenharmony_ci	SSI9_BUSIF3_MODE,
21262306a36Sopenharmony_ci	SSI9_BUSIF4_MODE,
21362306a36Sopenharmony_ci	SSI9_BUSIF5_MODE,
21462306a36Sopenharmony_ci	SSI9_BUSIF6_MODE,
21562306a36Sopenharmony_ci	SSI9_BUSIF7_MODE,
21662306a36Sopenharmony_ci	SSI9_BUSIF0_ADINR,
21762306a36Sopenharmony_ci	SSI9_BUSIF1_ADINR,
21862306a36Sopenharmony_ci	SSI9_BUSIF2_ADINR,
21962306a36Sopenharmony_ci	SSI9_BUSIF3_ADINR,
22062306a36Sopenharmony_ci	SSI9_BUSIF4_ADINR,
22162306a36Sopenharmony_ci	SSI9_BUSIF5_ADINR,
22262306a36Sopenharmony_ci	SSI9_BUSIF6_ADINR,
22362306a36Sopenharmony_ci	SSI9_BUSIF7_ADINR,
22462306a36Sopenharmony_ci	SSI9_BUSIF0_DALIGN,
22562306a36Sopenharmony_ci	SSI9_BUSIF1_DALIGN,
22662306a36Sopenharmony_ci	SSI9_BUSIF2_DALIGN,
22762306a36Sopenharmony_ci	SSI9_BUSIF3_DALIGN,
22862306a36Sopenharmony_ci	SSI9_BUSIF4_DALIGN,
22962306a36Sopenharmony_ci	SSI9_BUSIF5_DALIGN,
23062306a36Sopenharmony_ci	SSI9_BUSIF6_DALIGN,
23162306a36Sopenharmony_ci	SSI9_BUSIF7_DALIGN,
23262306a36Sopenharmony_ci
23362306a36Sopenharmony_ci	/* SSI */
23462306a36Sopenharmony_ci	SSICR,
23562306a36Sopenharmony_ci	SSISR,
23662306a36Sopenharmony_ci	SSITDR,
23762306a36Sopenharmony_ci	SSIRDR,
23862306a36Sopenharmony_ci	SSIWSR,
23962306a36Sopenharmony_ci
24062306a36Sopenharmony_ci	REG_MAX,
24162306a36Sopenharmony_ci};
24262306a36Sopenharmony_ci#define SRCIN_TIMSEL(i)		(SRCIN_TIMSEL0 + (i))
24362306a36Sopenharmony_ci#define SRCOUT_TIMSEL(i)	(SRCOUT_TIMSEL0 + (i))
24462306a36Sopenharmony_ci#define CTU_SVxxR(i, j)		(CTU_SV00R + (i * 8) + (j))
24562306a36Sopenharmony_ci#define DVC_VOLxR(i)		(DVC_VOL0R + (i))
24662306a36Sopenharmony_ci#define AUDIO_CLK_SEL(i)	(AUDIO_CLK_SEL0 + (i))
24762306a36Sopenharmony_ci#define SSI_BUSIF_MODE(i)	(SSI_BUSIF0_MODE + (i))
24862306a36Sopenharmony_ci#define SSI_BUSIF_ADINR(i)	(SSI_BUSIF0_ADINR + (i))
24962306a36Sopenharmony_ci#define SSI_BUSIF_DALIGN(i)	(SSI_BUSIF0_DALIGN + (i))
25062306a36Sopenharmony_ci#define SSI9_BUSIF_MODE(i)	(SSI9_BUSIF0_MODE + (i))
25162306a36Sopenharmony_ci#define SSI9_BUSIF_ADINR(i)	(SSI9_BUSIF0_ADINR + (i))
25262306a36Sopenharmony_ci#define SSI9_BUSIF_DALIGN(i)	(SSI9_BUSIF0_DALIGN + (i))
25362306a36Sopenharmony_ci#define SSI_SYS_STATUS(i)	(SSI_SYS_STATUS0 + (i))
25462306a36Sopenharmony_ci#define SSI_SYS_INT_ENABLE(i) (SSI_SYS_INT_ENABLE0 + (i))
25562306a36Sopenharmony_ci
25662306a36Sopenharmony_ci
25762306a36Sopenharmony_cistruct rsnd_priv;
25862306a36Sopenharmony_cistruct rsnd_mod;
25962306a36Sopenharmony_cistruct rsnd_dai;
26062306a36Sopenharmony_cistruct rsnd_dai_stream;
26162306a36Sopenharmony_ci
26262306a36Sopenharmony_ci/*
26362306a36Sopenharmony_ci *	R-Car basic functions
26462306a36Sopenharmony_ci */
26562306a36Sopenharmony_ciu32 rsnd_mod_read(struct rsnd_mod *mod, enum rsnd_reg reg);
26662306a36Sopenharmony_civoid rsnd_mod_write(struct rsnd_mod *mod, enum rsnd_reg reg, u32 data);
26762306a36Sopenharmony_civoid rsnd_mod_bset(struct rsnd_mod *mod, enum rsnd_reg reg, u32 mask, u32 data);
26862306a36Sopenharmony_ciu32 rsnd_get_adinr_bit(struct rsnd_mod *mod, struct rsnd_dai_stream *io);
26962306a36Sopenharmony_ciu32 rsnd_get_dalign(struct rsnd_mod *mod, struct rsnd_dai_stream *io);
27062306a36Sopenharmony_ciu32 rsnd_get_busif_shift(struct rsnd_dai_stream *io, struct rsnd_mod *mod);
27162306a36Sopenharmony_ci
27262306a36Sopenharmony_ci/*
27362306a36Sopenharmony_ci *	R-Car DMA
27462306a36Sopenharmony_ci */
27562306a36Sopenharmony_ciint rsnd_dma_attach(struct rsnd_dai_stream *io,
27662306a36Sopenharmony_ci		    struct rsnd_mod *mod, struct rsnd_mod **dma_mod);
27762306a36Sopenharmony_ciint rsnd_dma_probe(struct rsnd_priv *priv);
27862306a36Sopenharmony_cistruct dma_chan *rsnd_dma_request_channel(struct device_node *of_node, char *name,
27962306a36Sopenharmony_ci					  struct rsnd_mod *mod, char *x);
28062306a36Sopenharmony_ci
28162306a36Sopenharmony_ci/*
28262306a36Sopenharmony_ci *	R-Car sound mod
28362306a36Sopenharmony_ci */
28462306a36Sopenharmony_cienum rsnd_mod_type {
28562306a36Sopenharmony_ci	RSND_MOD_AUDMAPP,
28662306a36Sopenharmony_ci	RSND_MOD_AUDMA,
28762306a36Sopenharmony_ci	RSND_MOD_DVC,
28862306a36Sopenharmony_ci	RSND_MOD_MIX,
28962306a36Sopenharmony_ci	RSND_MOD_CTU,
29062306a36Sopenharmony_ci	RSND_MOD_CMD,
29162306a36Sopenharmony_ci	RSND_MOD_SRC,
29262306a36Sopenharmony_ci	RSND_MOD_SSIM3,		/* SSI multi 3 */
29362306a36Sopenharmony_ci	RSND_MOD_SSIM2,		/* SSI multi 2 */
29462306a36Sopenharmony_ci	RSND_MOD_SSIM1,		/* SSI multi 1 */
29562306a36Sopenharmony_ci	RSND_MOD_SSIP,		/* SSI parent */
29662306a36Sopenharmony_ci	RSND_MOD_SSI,
29762306a36Sopenharmony_ci	RSND_MOD_SSIU,
29862306a36Sopenharmony_ci	RSND_MOD_MAX,
29962306a36Sopenharmony_ci};
30062306a36Sopenharmony_ci
30162306a36Sopenharmony_cistruct rsnd_mod_ops {
30262306a36Sopenharmony_ci	char *name;
30362306a36Sopenharmony_ci	struct dma_chan* (*dma_req)(struct rsnd_dai_stream *io,
30462306a36Sopenharmony_ci				    struct rsnd_mod *mod);
30562306a36Sopenharmony_ci	int (*probe)(struct rsnd_mod *mod,
30662306a36Sopenharmony_ci		     struct rsnd_dai_stream *io,
30762306a36Sopenharmony_ci		     struct rsnd_priv *priv);
30862306a36Sopenharmony_ci	int (*remove)(struct rsnd_mod *mod,
30962306a36Sopenharmony_ci		      struct rsnd_dai_stream *io,
31062306a36Sopenharmony_ci		      struct rsnd_priv *priv);
31162306a36Sopenharmony_ci	int (*init)(struct rsnd_mod *mod,
31262306a36Sopenharmony_ci		    struct rsnd_dai_stream *io,
31362306a36Sopenharmony_ci		    struct rsnd_priv *priv);
31462306a36Sopenharmony_ci	int (*quit)(struct rsnd_mod *mod,
31562306a36Sopenharmony_ci		    struct rsnd_dai_stream *io,
31662306a36Sopenharmony_ci		    struct rsnd_priv *priv);
31762306a36Sopenharmony_ci	int (*start)(struct rsnd_mod *mod,
31862306a36Sopenharmony_ci		     struct rsnd_dai_stream *io,
31962306a36Sopenharmony_ci		     struct rsnd_priv *priv);
32062306a36Sopenharmony_ci	int (*stop)(struct rsnd_mod *mod,
32162306a36Sopenharmony_ci		    struct rsnd_dai_stream *io,
32262306a36Sopenharmony_ci		    struct rsnd_priv *priv);
32362306a36Sopenharmony_ci	int (*irq)(struct rsnd_mod *mod,
32462306a36Sopenharmony_ci		   struct rsnd_dai_stream *io,
32562306a36Sopenharmony_ci		   struct rsnd_priv *priv, int enable);
32662306a36Sopenharmony_ci	int (*pcm_new)(struct rsnd_mod *mod,
32762306a36Sopenharmony_ci		       struct rsnd_dai_stream *io,
32862306a36Sopenharmony_ci		       struct snd_soc_pcm_runtime *rtd);
32962306a36Sopenharmony_ci	int (*hw_params)(struct rsnd_mod *mod,
33062306a36Sopenharmony_ci			 struct rsnd_dai_stream *io,
33162306a36Sopenharmony_ci			 struct snd_pcm_substream *substream,
33262306a36Sopenharmony_ci			 struct snd_pcm_hw_params *hw_params);
33362306a36Sopenharmony_ci	int (*pointer)(struct rsnd_mod *mod,
33462306a36Sopenharmony_ci		       struct rsnd_dai_stream *io,
33562306a36Sopenharmony_ci		       snd_pcm_uframes_t *pointer);
33662306a36Sopenharmony_ci	int (*fallback)(struct rsnd_mod *mod,
33762306a36Sopenharmony_ci			struct rsnd_dai_stream *io,
33862306a36Sopenharmony_ci			struct rsnd_priv *priv);
33962306a36Sopenharmony_ci	int (*prepare)(struct rsnd_mod *mod,
34062306a36Sopenharmony_ci		       struct rsnd_dai_stream *io,
34162306a36Sopenharmony_ci		       struct rsnd_priv *priv);
34262306a36Sopenharmony_ci	int (*cleanup)(struct rsnd_mod *mod,
34362306a36Sopenharmony_ci		       struct rsnd_dai_stream *io,
34462306a36Sopenharmony_ci		       struct rsnd_priv *priv);
34562306a36Sopenharmony_ci	int (*hw_free)(struct rsnd_mod *mod,
34662306a36Sopenharmony_ci		       struct rsnd_dai_stream *io,
34762306a36Sopenharmony_ci		       struct snd_pcm_substream *substream);
34862306a36Sopenharmony_ci	u32 *(*get_status)(struct rsnd_mod *mod,
34962306a36Sopenharmony_ci			   struct rsnd_dai_stream *io,
35062306a36Sopenharmony_ci			   enum rsnd_mod_type type);
35162306a36Sopenharmony_ci	int (*id)(struct rsnd_mod *mod);
35262306a36Sopenharmony_ci	int (*id_sub)(struct rsnd_mod *mod);
35362306a36Sopenharmony_ci	int (*id_cmd)(struct rsnd_mod *mod);
35462306a36Sopenharmony_ci
35562306a36Sopenharmony_ci#ifdef CONFIG_DEBUG_FS
35662306a36Sopenharmony_ci	void (*debug_info)(struct seq_file *m,
35762306a36Sopenharmony_ci			   struct rsnd_dai_stream *io, struct rsnd_mod *mod);
35862306a36Sopenharmony_ci#endif
35962306a36Sopenharmony_ci};
36062306a36Sopenharmony_ci
36162306a36Sopenharmony_cistruct rsnd_dai_stream;
36262306a36Sopenharmony_cistruct rsnd_mod {
36362306a36Sopenharmony_ci	int id;
36462306a36Sopenharmony_ci	enum rsnd_mod_type type;
36562306a36Sopenharmony_ci	struct rsnd_mod_ops *ops;
36662306a36Sopenharmony_ci	struct rsnd_priv *priv;
36762306a36Sopenharmony_ci	struct clk *clk;
36862306a36Sopenharmony_ci	u32 status;
36962306a36Sopenharmony_ci};
37062306a36Sopenharmony_ci/*
37162306a36Sopenharmony_ci * status
37262306a36Sopenharmony_ci *
37362306a36Sopenharmony_ci * 0xH000DCB0
37462306a36Sopenharmony_ci *
37562306a36Sopenharmony_ci * B	0: init		1: quit
37662306a36Sopenharmony_ci * C	0: start	1: stop
37762306a36Sopenharmony_ci * D	0: hw_params	1: hw_free
37862306a36Sopenharmony_ci *
37962306a36Sopenharmony_ci * H is always called (see __rsnd_mod_call)
38062306a36Sopenharmony_ci */
38162306a36Sopenharmony_ci#define __rsnd_mod_shift_init		4
38262306a36Sopenharmony_ci#define __rsnd_mod_shift_quit		4
38362306a36Sopenharmony_ci#define __rsnd_mod_shift_start		8
38462306a36Sopenharmony_ci#define __rsnd_mod_shift_stop		8
38562306a36Sopenharmony_ci#define __rsnd_mod_shift_hw_params	12
38662306a36Sopenharmony_ci#define __rsnd_mod_shift_hw_free	12
38762306a36Sopenharmony_ci#define __rsnd_mod_shift_probe		28 /* always called */
38862306a36Sopenharmony_ci#define __rsnd_mod_shift_remove		28 /* always called */
38962306a36Sopenharmony_ci#define __rsnd_mod_shift_irq		28 /* always called */
39062306a36Sopenharmony_ci#define __rsnd_mod_shift_pcm_new	28 /* always called */
39162306a36Sopenharmony_ci#define __rsnd_mod_shift_fallback	28 /* always called */
39262306a36Sopenharmony_ci#define __rsnd_mod_shift_pointer	28 /* always called */
39362306a36Sopenharmony_ci#define __rsnd_mod_shift_prepare	28 /* always called */
39462306a36Sopenharmony_ci#define __rsnd_mod_shift_cleanup	28 /* always called */
39562306a36Sopenharmony_ci
39662306a36Sopenharmony_ci#define __rsnd_mod_add_probe		0
39762306a36Sopenharmony_ci#define __rsnd_mod_add_remove		0
39862306a36Sopenharmony_ci#define __rsnd_mod_add_prepare		0
39962306a36Sopenharmony_ci#define __rsnd_mod_add_cleanup		0
40062306a36Sopenharmony_ci#define __rsnd_mod_add_init		 1 /* needs protect */
40162306a36Sopenharmony_ci#define __rsnd_mod_add_quit		-1 /* needs protect */
40262306a36Sopenharmony_ci#define __rsnd_mod_add_start		 1 /* needs protect */
40362306a36Sopenharmony_ci#define __rsnd_mod_add_stop		-1 /* needs protect */
40462306a36Sopenharmony_ci#define __rsnd_mod_add_hw_params	 1 /* needs protect */
40562306a36Sopenharmony_ci#define __rsnd_mod_add_hw_free		-1 /* needs protect */
40662306a36Sopenharmony_ci#define __rsnd_mod_add_irq		0
40762306a36Sopenharmony_ci#define __rsnd_mod_add_pcm_new		0
40862306a36Sopenharmony_ci#define __rsnd_mod_add_fallback		0
40962306a36Sopenharmony_ci#define __rsnd_mod_add_pointer		0
41062306a36Sopenharmony_ci
41162306a36Sopenharmony_ci#define __rsnd_mod_call_probe		0
41262306a36Sopenharmony_ci#define __rsnd_mod_call_remove		0
41362306a36Sopenharmony_ci#define __rsnd_mod_call_prepare		0
41462306a36Sopenharmony_ci#define __rsnd_mod_call_cleanup		0
41562306a36Sopenharmony_ci#define __rsnd_mod_call_init		0 /* needs protect */
41662306a36Sopenharmony_ci#define __rsnd_mod_call_quit		1 /* needs protect */
41762306a36Sopenharmony_ci#define __rsnd_mod_call_start		0 /* needs protect */
41862306a36Sopenharmony_ci#define __rsnd_mod_call_stop		1 /* needs protect */
41962306a36Sopenharmony_ci#define __rsnd_mod_call_hw_params	0 /* needs protect */
42062306a36Sopenharmony_ci#define __rsnd_mod_call_hw_free		1 /* needs protect */
42162306a36Sopenharmony_ci#define __rsnd_mod_call_irq		0
42262306a36Sopenharmony_ci#define __rsnd_mod_call_pcm_new		0
42362306a36Sopenharmony_ci#define __rsnd_mod_call_fallback	0
42462306a36Sopenharmony_ci#define __rsnd_mod_call_pointer		0
42562306a36Sopenharmony_ci
42662306a36Sopenharmony_ci#define rsnd_mod_to_priv(mod)	((mod)->priv)
42762306a36Sopenharmony_ci#define rsnd_mod_power_on(mod)	clk_enable((mod)->clk)
42862306a36Sopenharmony_ci#define rsnd_mod_power_off(mod)	clk_disable((mod)->clk)
42962306a36Sopenharmony_ci#define rsnd_mod_get(ip)	(&(ip)->mod)
43062306a36Sopenharmony_ci
43162306a36Sopenharmony_ciint rsnd_mod_init(struct rsnd_priv *priv,
43262306a36Sopenharmony_ci		  struct rsnd_mod *mod,
43362306a36Sopenharmony_ci		  struct rsnd_mod_ops *ops,
43462306a36Sopenharmony_ci		  struct clk *clk,
43562306a36Sopenharmony_ci		  enum rsnd_mod_type type,
43662306a36Sopenharmony_ci		  int id);
43762306a36Sopenharmony_civoid rsnd_mod_quit(struct rsnd_mod *mod);
43862306a36Sopenharmony_cistruct dma_chan *rsnd_mod_dma_req(struct rsnd_dai_stream *io,
43962306a36Sopenharmony_ci				  struct rsnd_mod *mod);
44062306a36Sopenharmony_civoid rsnd_mod_interrupt(struct rsnd_mod *mod,
44162306a36Sopenharmony_ci			void (*callback)(struct rsnd_mod *mod,
44262306a36Sopenharmony_ci					 struct rsnd_dai_stream *io));
44362306a36Sopenharmony_ciu32 *rsnd_mod_get_status(struct rsnd_mod *mod,
44462306a36Sopenharmony_ci			 struct rsnd_dai_stream *io,
44562306a36Sopenharmony_ci			 enum rsnd_mod_type type);
44662306a36Sopenharmony_ciint rsnd_mod_id(struct rsnd_mod *mod);
44762306a36Sopenharmony_ciint rsnd_mod_id_raw(struct rsnd_mod *mod);
44862306a36Sopenharmony_ciint rsnd_mod_id_sub(struct rsnd_mod *mod);
44962306a36Sopenharmony_cichar *rsnd_mod_name(struct rsnd_mod *mod);
45062306a36Sopenharmony_cistruct rsnd_mod *rsnd_mod_next(int *iterator,
45162306a36Sopenharmony_ci			       struct rsnd_dai_stream *io,
45262306a36Sopenharmony_ci			       enum rsnd_mod_type *array,
45362306a36Sopenharmony_ci			       int array_size);
45462306a36Sopenharmony_ci#define for_each_rsnd_mod(iterator, pos, io)				\
45562306a36Sopenharmony_ci	for (iterator = 0;						\
45662306a36Sopenharmony_ci	     (pos = rsnd_mod_next(&iterator, io, NULL, 0)); iterator++)
45762306a36Sopenharmony_ci#define for_each_rsnd_mod_arrays(iterator, pos, io, array, size)	\
45862306a36Sopenharmony_ci	for (iterator = 0;						\
45962306a36Sopenharmony_ci	     (pos = rsnd_mod_next(&iterator, io, array, size)); iterator++)
46062306a36Sopenharmony_ci#define for_each_rsnd_mod_array(iterator, pos, io, array)		\
46162306a36Sopenharmony_ci	for_each_rsnd_mod_arrays(iterator, pos, io, array, ARRAY_SIZE(array))
46262306a36Sopenharmony_ci
46362306a36Sopenharmony_civoid rsnd_parse_connect_common(struct rsnd_dai *rdai, char *name,
46462306a36Sopenharmony_ci		struct rsnd_mod* (*mod_get)(struct rsnd_priv *priv, int id),
46562306a36Sopenharmony_ci		struct device_node *node,
46662306a36Sopenharmony_ci		struct device_node *playback,
46762306a36Sopenharmony_ci		struct device_node *capture);
46862306a36Sopenharmony_ciint rsnd_node_count(struct rsnd_priv *priv, struct device_node *node, char *name);
46962306a36Sopenharmony_ciint rsnd_node_fixed_index(struct device *dev, struct device_node *node, char *name, int idx);
47062306a36Sopenharmony_ci
47162306a36Sopenharmony_ciint rsnd_channel_normalization(int chan);
47262306a36Sopenharmony_ci#define rsnd_runtime_channel_original(io) \
47362306a36Sopenharmony_ci	rsnd_runtime_channel_original_with_params(io, NULL)
47462306a36Sopenharmony_ciint rsnd_runtime_channel_original_with_params(struct rsnd_dai_stream *io,
47562306a36Sopenharmony_ci				struct snd_pcm_hw_params *params);
47662306a36Sopenharmony_ci#define rsnd_runtime_channel_after_ctu(io)			\
47762306a36Sopenharmony_ci	rsnd_runtime_channel_after_ctu_with_params(io, NULL)
47862306a36Sopenharmony_ciint rsnd_runtime_channel_after_ctu_with_params(struct rsnd_dai_stream *io,
47962306a36Sopenharmony_ci				struct snd_pcm_hw_params *params);
48062306a36Sopenharmony_ci#define rsnd_runtime_channel_for_ssi(io) \
48162306a36Sopenharmony_ci	rsnd_runtime_channel_for_ssi_with_params(io, NULL)
48262306a36Sopenharmony_ciint rsnd_runtime_channel_for_ssi_with_params(struct rsnd_dai_stream *io,
48362306a36Sopenharmony_ci				 struct snd_pcm_hw_params *params);
48462306a36Sopenharmony_ciint rsnd_runtime_is_multi_ssi(struct rsnd_dai_stream *io);
48562306a36Sopenharmony_ciint rsnd_runtime_is_tdm(struct rsnd_dai_stream *io);
48662306a36Sopenharmony_ciint rsnd_runtime_is_tdm_split(struct rsnd_dai_stream *io);
48762306a36Sopenharmony_ci
48862306a36Sopenharmony_ci/*
48962306a36Sopenharmony_ci * DT
49062306a36Sopenharmony_ci */
49162306a36Sopenharmony_ci#define rsnd_parse_of_node(priv, node)					\
49262306a36Sopenharmony_ci	of_get_child_by_name(rsnd_priv_to_dev(priv)->of_node, node)
49362306a36Sopenharmony_ci#define RSND_NODE_DAI	"rcar_sound,dai"
49462306a36Sopenharmony_ci#define RSND_NODE_SSI	"rcar_sound,ssi"
49562306a36Sopenharmony_ci#define RSND_NODE_SSIU	"rcar_sound,ssiu"
49662306a36Sopenharmony_ci#define RSND_NODE_SRC	"rcar_sound,src"
49762306a36Sopenharmony_ci#define RSND_NODE_CTU	"rcar_sound,ctu"
49862306a36Sopenharmony_ci#define RSND_NODE_MIX	"rcar_sound,mix"
49962306a36Sopenharmony_ci#define RSND_NODE_DVC	"rcar_sound,dvc"
50062306a36Sopenharmony_ci
50162306a36Sopenharmony_ci/*
50262306a36Sopenharmony_ci *	R-Car sound DAI
50362306a36Sopenharmony_ci */
50462306a36Sopenharmony_ci#define RSND_DAI_NAME_SIZE	16
50562306a36Sopenharmony_cistruct rsnd_dai_stream {
50662306a36Sopenharmony_ci	char name[RSND_DAI_NAME_SIZE];
50762306a36Sopenharmony_ci	struct snd_pcm_substream *substream;
50862306a36Sopenharmony_ci	struct rsnd_mod *mod[RSND_MOD_MAX];
50962306a36Sopenharmony_ci	struct rsnd_mod *dma;
51062306a36Sopenharmony_ci	struct rsnd_dai *rdai;
51162306a36Sopenharmony_ci	struct device *dmac_dev; /* for IPMMU */
51262306a36Sopenharmony_ci	u32 converted_rate;      /* converted sampling rate */
51362306a36Sopenharmony_ci	int converted_chan;      /* converted channels */
51462306a36Sopenharmony_ci	u32 parent_ssi_status;
51562306a36Sopenharmony_ci	u32 flags;
51662306a36Sopenharmony_ci};
51762306a36Sopenharmony_ci
51862306a36Sopenharmony_ci/* flags */
51962306a36Sopenharmony_ci#define RSND_STREAM_HDMI0	(1 << 0) /* for HDMI0 */
52062306a36Sopenharmony_ci#define RSND_STREAM_HDMI1	(1 << 1) /* for HDMI1 */
52162306a36Sopenharmony_ci#define RSND_STREAM_TDM_SPLIT	(1 << 2) /* for TDM split mode */
52262306a36Sopenharmony_ci#define RSND_HW_RULE_ERR	(1 << 3) /* hw_rule error */
52362306a36Sopenharmony_ci
52462306a36Sopenharmony_ci#define rsnd_io_to_mod(io, i)	((i) < RSND_MOD_MAX ? (io)->mod[(i)] : NULL)
52562306a36Sopenharmony_ci#define rsnd_io_to_mod_ssi(io)	rsnd_io_to_mod((io), RSND_MOD_SSI)
52662306a36Sopenharmony_ci#define rsnd_io_to_mod_ssiu(io)	rsnd_io_to_mod((io), RSND_MOD_SSIU)
52762306a36Sopenharmony_ci#define rsnd_io_to_mod_ssip(io)	rsnd_io_to_mod((io), RSND_MOD_SSIP)
52862306a36Sopenharmony_ci#define rsnd_io_to_mod_src(io)	rsnd_io_to_mod((io), RSND_MOD_SRC)
52962306a36Sopenharmony_ci#define rsnd_io_to_mod_ctu(io)	rsnd_io_to_mod((io), RSND_MOD_CTU)
53062306a36Sopenharmony_ci#define rsnd_io_to_mod_mix(io)	rsnd_io_to_mod((io), RSND_MOD_MIX)
53162306a36Sopenharmony_ci#define rsnd_io_to_mod_dvc(io)	rsnd_io_to_mod((io), RSND_MOD_DVC)
53262306a36Sopenharmony_ci#define rsnd_io_to_mod_cmd(io)	rsnd_io_to_mod((io), RSND_MOD_CMD)
53362306a36Sopenharmony_ci#define rsnd_io_to_rdai(io)	((io)->rdai)
53462306a36Sopenharmony_ci#define rsnd_io_to_priv(io)	(rsnd_rdai_to_priv(rsnd_io_to_rdai(io)))
53562306a36Sopenharmony_ci#define rsnd_io_is_play(io)	(&rsnd_io_to_rdai(io)->playback == io)
53662306a36Sopenharmony_ci#define rsnd_io_to_runtime(io) ((io)->substream ? \
53762306a36Sopenharmony_ci				(io)->substream->runtime : NULL)
53862306a36Sopenharmony_ci#define rsnd_io_converted_rate(io)	((io)->converted_rate)
53962306a36Sopenharmony_ci#define rsnd_io_converted_chan(io)	((io)->converted_chan)
54062306a36Sopenharmony_ciint rsnd_io_is_working(struct rsnd_dai_stream *io);
54162306a36Sopenharmony_ci
54262306a36Sopenharmony_cistruct rsnd_dai {
54362306a36Sopenharmony_ci	char name[RSND_DAI_NAME_SIZE];
54462306a36Sopenharmony_ci	struct rsnd_dai_stream playback;
54562306a36Sopenharmony_ci	struct rsnd_dai_stream capture;
54662306a36Sopenharmony_ci	struct rsnd_priv *priv;
54762306a36Sopenharmony_ci	struct snd_pcm_hw_constraint_list constraint;
54862306a36Sopenharmony_ci	struct of_phandle_args dai_args;
54962306a36Sopenharmony_ci
55062306a36Sopenharmony_ci	int max_channels;	/* 2ch - 16ch */
55162306a36Sopenharmony_ci	int ssi_lane;		/* 1lane - 4lane */
55262306a36Sopenharmony_ci	int chan_width;		/* 16/24/32 bit width */
55362306a36Sopenharmony_ci
55462306a36Sopenharmony_ci	unsigned int clk_master:1;
55562306a36Sopenharmony_ci	unsigned int bit_clk_inv:1;
55662306a36Sopenharmony_ci	unsigned int frm_clk_inv:1;
55762306a36Sopenharmony_ci	unsigned int sys_delay:1;
55862306a36Sopenharmony_ci	unsigned int data_alignment:1;
55962306a36Sopenharmony_ci};
56062306a36Sopenharmony_ci
56162306a36Sopenharmony_ci#define rsnd_rdai_nr(priv) ((priv)->rdai_nr)
56262306a36Sopenharmony_ci#define rsnd_rdai_is_clk_master(rdai) ((rdai)->clk_master)
56362306a36Sopenharmony_ci#define rsnd_rdai_to_priv(rdai) ((rdai)->priv)
56462306a36Sopenharmony_ci#define for_each_rsnd_dai(rdai, priv, i)		\
56562306a36Sopenharmony_ci	for (i = 0;					\
56662306a36Sopenharmony_ci	     (i < rsnd_rdai_nr(priv)) &&		\
56762306a36Sopenharmony_ci	     ((rdai) = rsnd_rdai_get(priv, i));		\
56862306a36Sopenharmony_ci	     i++)
56962306a36Sopenharmony_ci
57062306a36Sopenharmony_cistruct rsnd_dai *rsnd_rdai_get(struct rsnd_priv *priv, int id);
57162306a36Sopenharmony_ci
57262306a36Sopenharmony_ci#define rsnd_rdai_channels_set(rdai, max_channels) \
57362306a36Sopenharmony_ci	rsnd_rdai_channels_ctrl(rdai, max_channels)
57462306a36Sopenharmony_ci#define rsnd_rdai_channels_get(rdai) \
57562306a36Sopenharmony_ci	rsnd_rdai_channels_ctrl(rdai, 0)
57662306a36Sopenharmony_ciint rsnd_rdai_channels_ctrl(struct rsnd_dai *rdai,
57762306a36Sopenharmony_ci			    int max_channels);
57862306a36Sopenharmony_ci
57962306a36Sopenharmony_ci#define rsnd_rdai_ssi_lane_set(rdai, ssi_lane) \
58062306a36Sopenharmony_ci	rsnd_rdai_ssi_lane_ctrl(rdai, ssi_lane)
58162306a36Sopenharmony_ci#define rsnd_rdai_ssi_lane_get(rdai) \
58262306a36Sopenharmony_ci	rsnd_rdai_ssi_lane_ctrl(rdai, 0)
58362306a36Sopenharmony_ciint rsnd_rdai_ssi_lane_ctrl(struct rsnd_dai *rdai,
58462306a36Sopenharmony_ci			    int ssi_lane);
58562306a36Sopenharmony_ci
58662306a36Sopenharmony_ci#define rsnd_rdai_width_set(rdai, width) \
58762306a36Sopenharmony_ci	rsnd_rdai_width_ctrl(rdai, width)
58862306a36Sopenharmony_ci#define rsnd_rdai_width_get(rdai) \
58962306a36Sopenharmony_ci	rsnd_rdai_width_ctrl(rdai, 0)
59062306a36Sopenharmony_ciint rsnd_rdai_width_ctrl(struct rsnd_dai *rdai, int width);
59162306a36Sopenharmony_civoid rsnd_dai_period_elapsed(struct rsnd_dai_stream *io);
59262306a36Sopenharmony_ciint rsnd_dai_connect(struct rsnd_mod *mod,
59362306a36Sopenharmony_ci		     struct rsnd_dai_stream *io,
59462306a36Sopenharmony_ci		     enum rsnd_mod_type type);
59562306a36Sopenharmony_ci
59662306a36Sopenharmony_ci/*
59762306a36Sopenharmony_ci *	R-Car Gen1/Gen2
59862306a36Sopenharmony_ci */
59962306a36Sopenharmony_ciint rsnd_gen_probe(struct rsnd_priv *priv);
60062306a36Sopenharmony_civoid __iomem *rsnd_gen_reg_get(struct rsnd_priv *priv,
60162306a36Sopenharmony_ci			       struct rsnd_mod *mod,
60262306a36Sopenharmony_ci			       enum rsnd_reg reg);
60362306a36Sopenharmony_ciphys_addr_t rsnd_gen_get_phy_addr(struct rsnd_priv *priv, int reg_id);
60462306a36Sopenharmony_ci#ifdef CONFIG_DEBUG_FS
60562306a36Sopenharmony_civoid __iomem *rsnd_gen_get_base_addr(struct rsnd_priv *priv, int reg_id);
60662306a36Sopenharmony_ci#endif
60762306a36Sopenharmony_ci
60862306a36Sopenharmony_ci/*
60962306a36Sopenharmony_ci *	R-Car ADG
61062306a36Sopenharmony_ci */
61162306a36Sopenharmony_ciint rsnd_adg_clk_query(struct rsnd_priv *priv, unsigned int rate);
61262306a36Sopenharmony_ciint rsnd_adg_ssi_clk_stop(struct rsnd_mod *ssi_mod);
61362306a36Sopenharmony_ciint rsnd_adg_ssi_clk_try_start(struct rsnd_mod *ssi_mod, unsigned int rate);
61462306a36Sopenharmony_ciint rsnd_adg_probe(struct rsnd_priv *priv);
61562306a36Sopenharmony_civoid rsnd_adg_remove(struct rsnd_priv *priv);
61662306a36Sopenharmony_ciint rsnd_adg_set_src_timesel_gen2(struct rsnd_mod *src_mod,
61762306a36Sopenharmony_ci				  struct rsnd_dai_stream *io,
61862306a36Sopenharmony_ci				  unsigned int in_rate,
61962306a36Sopenharmony_ci				  unsigned int out_rate);
62062306a36Sopenharmony_ciint rsnd_adg_set_cmd_timsel_gen2(struct rsnd_mod *cmd_mod,
62162306a36Sopenharmony_ci				 struct rsnd_dai_stream *io);
62262306a36Sopenharmony_ci#define rsnd_adg_clk_enable(priv)	rsnd_adg_clk_control(priv, 1)
62362306a36Sopenharmony_ci#define rsnd_adg_clk_disable(priv)	rsnd_adg_clk_control(priv, 0)
62462306a36Sopenharmony_civoid rsnd_adg_clk_control(struct rsnd_priv *priv, int enable);
62562306a36Sopenharmony_civoid rsnd_adg_clk_dbg_info(struct rsnd_priv *priv, struct seq_file *m);
62662306a36Sopenharmony_ci
62762306a36Sopenharmony_ci/*
62862306a36Sopenharmony_ci *	R-Car sound priv
62962306a36Sopenharmony_ci */
63062306a36Sopenharmony_cistruct rsnd_priv {
63162306a36Sopenharmony_ci
63262306a36Sopenharmony_ci	struct platform_device *pdev;
63362306a36Sopenharmony_ci	spinlock_t lock;
63462306a36Sopenharmony_ci	unsigned long flags;
63562306a36Sopenharmony_ci#define RSND_GEN_MASK	(0xF << 0)
63662306a36Sopenharmony_ci#define RSND_GEN1	(1 << 0)
63762306a36Sopenharmony_ci#define RSND_GEN2	(2 << 0)
63862306a36Sopenharmony_ci#define RSND_GEN3	(3 << 0)
63962306a36Sopenharmony_ci#define RSND_GEN4	(4 << 0)
64062306a36Sopenharmony_ci#define RSND_SOC_MASK	(0xFF << 4)
64162306a36Sopenharmony_ci#define RSND_SOC_E	(1 << 4) /* E1/E2/E3 */
64262306a36Sopenharmony_ci
64362306a36Sopenharmony_ci	/*
64462306a36Sopenharmony_ci	 * below value will be filled on rsnd_gen_probe()
64562306a36Sopenharmony_ci	 */
64662306a36Sopenharmony_ci	void *gen;
64762306a36Sopenharmony_ci
64862306a36Sopenharmony_ci	/*
64962306a36Sopenharmony_ci	 * below value will be filled on rsnd_adg_probe()
65062306a36Sopenharmony_ci	 */
65162306a36Sopenharmony_ci	void *adg;
65262306a36Sopenharmony_ci
65362306a36Sopenharmony_ci	/*
65462306a36Sopenharmony_ci	 * below value will be filled on rsnd_dma_probe()
65562306a36Sopenharmony_ci	 */
65662306a36Sopenharmony_ci	void *dma;
65762306a36Sopenharmony_ci
65862306a36Sopenharmony_ci	/*
65962306a36Sopenharmony_ci	 * below value will be filled on rsnd_ssi_probe()
66062306a36Sopenharmony_ci	 */
66162306a36Sopenharmony_ci	void *ssi;
66262306a36Sopenharmony_ci	int ssi_nr;
66362306a36Sopenharmony_ci
66462306a36Sopenharmony_ci	/*
66562306a36Sopenharmony_ci	 * below value will be filled on rsnd_ssiu_probe()
66662306a36Sopenharmony_ci	 */
66762306a36Sopenharmony_ci	void *ssiu;
66862306a36Sopenharmony_ci	int ssiu_nr;
66962306a36Sopenharmony_ci
67062306a36Sopenharmony_ci	/*
67162306a36Sopenharmony_ci	 * below value will be filled on rsnd_src_probe()
67262306a36Sopenharmony_ci	 */
67362306a36Sopenharmony_ci	void *src;
67462306a36Sopenharmony_ci	int src_nr;
67562306a36Sopenharmony_ci
67662306a36Sopenharmony_ci	/*
67762306a36Sopenharmony_ci	 * below value will be filled on rsnd_ctu_probe()
67862306a36Sopenharmony_ci	 */
67962306a36Sopenharmony_ci	void *ctu;
68062306a36Sopenharmony_ci	int ctu_nr;
68162306a36Sopenharmony_ci
68262306a36Sopenharmony_ci	/*
68362306a36Sopenharmony_ci	 * below value will be filled on rsnd_mix_probe()
68462306a36Sopenharmony_ci	 */
68562306a36Sopenharmony_ci	void *mix;
68662306a36Sopenharmony_ci	int mix_nr;
68762306a36Sopenharmony_ci
68862306a36Sopenharmony_ci	/*
68962306a36Sopenharmony_ci	 * below value will be filled on rsnd_dvc_probe()
69062306a36Sopenharmony_ci	 */
69162306a36Sopenharmony_ci	void *dvc;
69262306a36Sopenharmony_ci	int dvc_nr;
69362306a36Sopenharmony_ci
69462306a36Sopenharmony_ci	/*
69562306a36Sopenharmony_ci	 * below value will be filled on rsnd_cmd_probe()
69662306a36Sopenharmony_ci	 */
69762306a36Sopenharmony_ci	void *cmd;
69862306a36Sopenharmony_ci	int cmd_nr;
69962306a36Sopenharmony_ci
70062306a36Sopenharmony_ci	/*
70162306a36Sopenharmony_ci	 * below value will be filled on rsnd_dai_probe()
70262306a36Sopenharmony_ci	 */
70362306a36Sopenharmony_ci	struct snd_soc_dai_driver *daidrv;
70462306a36Sopenharmony_ci	struct rsnd_dai *rdai;
70562306a36Sopenharmony_ci	int rdai_nr;
70662306a36Sopenharmony_ci
70762306a36Sopenharmony_ci#define RSND_MAX_COMPONENT 3
70862306a36Sopenharmony_ci	int component_dais[RSND_MAX_COMPONENT];
70962306a36Sopenharmony_ci};
71062306a36Sopenharmony_ci
71162306a36Sopenharmony_ci#define rsnd_priv_to_pdev(priv)	((priv)->pdev)
71262306a36Sopenharmony_ci#define rsnd_priv_to_dev(priv)	(&(rsnd_priv_to_pdev(priv)->dev))
71362306a36Sopenharmony_ci
71462306a36Sopenharmony_ci#define rsnd_is_gen1(priv)	(((priv)->flags & RSND_GEN_MASK) == RSND_GEN1)
71562306a36Sopenharmony_ci#define rsnd_is_gen2(priv)	(((priv)->flags & RSND_GEN_MASK) == RSND_GEN2)
71662306a36Sopenharmony_ci#define rsnd_is_gen3(priv)	(((priv)->flags & RSND_GEN_MASK) == RSND_GEN3)
71762306a36Sopenharmony_ci#define rsnd_is_gen4(priv)	(((priv)->flags & RSND_GEN_MASK) == RSND_GEN4)
71862306a36Sopenharmony_ci#define rsnd_is_e3(priv)	(((priv)->flags & \
71962306a36Sopenharmony_ci					(RSND_GEN_MASK | RSND_SOC_MASK)) == \
72062306a36Sopenharmony_ci					(RSND_GEN3 | RSND_SOC_E))
72162306a36Sopenharmony_ci
72262306a36Sopenharmony_ci#define rsnd_flags_has(p, f) ((p)->flags & (f))
72362306a36Sopenharmony_ci#define rsnd_flags_set(p, f) ((p)->flags |= (f))
72462306a36Sopenharmony_ci#define rsnd_flags_del(p, f) ((p)->flags &= ~(f))
72562306a36Sopenharmony_ci
72662306a36Sopenharmony_ci/*
72762306a36Sopenharmony_ci *	rsnd_kctrl
72862306a36Sopenharmony_ci */
72962306a36Sopenharmony_cistruct rsnd_kctrl_cfg {
73062306a36Sopenharmony_ci	unsigned int max;
73162306a36Sopenharmony_ci	unsigned int size;
73262306a36Sopenharmony_ci	u32 *val;
73362306a36Sopenharmony_ci	const char * const *texts;
73462306a36Sopenharmony_ci	int (*accept)(struct rsnd_dai_stream *io);
73562306a36Sopenharmony_ci	void (*update)(struct rsnd_dai_stream *io, struct rsnd_mod *mod);
73662306a36Sopenharmony_ci	struct rsnd_dai_stream *io;
73762306a36Sopenharmony_ci	struct snd_card *card;
73862306a36Sopenharmony_ci	struct snd_kcontrol *kctrl;
73962306a36Sopenharmony_ci	struct rsnd_mod *mod;
74062306a36Sopenharmony_ci};
74162306a36Sopenharmony_ci
74262306a36Sopenharmony_ci#define RSND_MAX_CHANNELS	8
74362306a36Sopenharmony_cistruct rsnd_kctrl_cfg_m {
74462306a36Sopenharmony_ci	struct rsnd_kctrl_cfg cfg;
74562306a36Sopenharmony_ci	u32 val[RSND_MAX_CHANNELS];
74662306a36Sopenharmony_ci};
74762306a36Sopenharmony_ci
74862306a36Sopenharmony_cistruct rsnd_kctrl_cfg_s {
74962306a36Sopenharmony_ci	struct rsnd_kctrl_cfg cfg;
75062306a36Sopenharmony_ci	u32 val;
75162306a36Sopenharmony_ci};
75262306a36Sopenharmony_ci#define rsnd_kctrl_size(x)	((x).cfg.size)
75362306a36Sopenharmony_ci#define rsnd_kctrl_max(x)	((x).cfg.max)
75462306a36Sopenharmony_ci#define rsnd_kctrl_valm(x, i)	((x).val[i])	/* = (x).cfg.val[i] */
75562306a36Sopenharmony_ci#define rsnd_kctrl_vals(x)	((x).val)	/* = (x).cfg.val[0] */
75662306a36Sopenharmony_ci
75762306a36Sopenharmony_ciint rsnd_kctrl_accept_anytime(struct rsnd_dai_stream *io);
75862306a36Sopenharmony_ciint rsnd_kctrl_accept_runtime(struct rsnd_dai_stream *io);
75962306a36Sopenharmony_cistruct rsnd_kctrl_cfg *rsnd_kctrl_init_m(struct rsnd_kctrl_cfg_m *cfg);
76062306a36Sopenharmony_cistruct rsnd_kctrl_cfg *rsnd_kctrl_init_s(struct rsnd_kctrl_cfg_s *cfg);
76162306a36Sopenharmony_ciint rsnd_kctrl_new(struct rsnd_mod *mod,
76262306a36Sopenharmony_ci		   struct rsnd_dai_stream *io,
76362306a36Sopenharmony_ci		   struct snd_soc_pcm_runtime *rtd,
76462306a36Sopenharmony_ci		   const unsigned char *name,
76562306a36Sopenharmony_ci		   int (*accept)(struct rsnd_dai_stream *io),
76662306a36Sopenharmony_ci		   void (*update)(struct rsnd_dai_stream *io,
76762306a36Sopenharmony_ci				  struct rsnd_mod *mod),
76862306a36Sopenharmony_ci		   struct rsnd_kctrl_cfg *cfg,
76962306a36Sopenharmony_ci		   const char * const *texts,
77062306a36Sopenharmony_ci		   int size,
77162306a36Sopenharmony_ci		   u32 max);
77262306a36Sopenharmony_ci
77362306a36Sopenharmony_ci#define rsnd_kctrl_new_m(mod, io, rtd, name, accept, update, cfg, size, max) \
77462306a36Sopenharmony_ci	rsnd_kctrl_new(mod, io, rtd, name, accept, update, rsnd_kctrl_init_m(cfg), \
77562306a36Sopenharmony_ci		       NULL, size, max)
77662306a36Sopenharmony_ci
77762306a36Sopenharmony_ci#define rsnd_kctrl_new_s(mod, io, rtd, name, accept, update, cfg, max)	\
77862306a36Sopenharmony_ci	rsnd_kctrl_new(mod, io, rtd, name, accept, update, rsnd_kctrl_init_s(cfg), \
77962306a36Sopenharmony_ci		       NULL, 1, max)
78062306a36Sopenharmony_ci
78162306a36Sopenharmony_ci#define rsnd_kctrl_new_e(mod, io, rtd, name, accept, update, cfg, texts, size) \
78262306a36Sopenharmony_ci	rsnd_kctrl_new(mod, io, rtd, name, accept, update, rsnd_kctrl_init_s(cfg), \
78362306a36Sopenharmony_ci		       texts, 1, size)
78462306a36Sopenharmony_ci
78562306a36Sopenharmony_ciextern const char * const volume_ramp_rate[];
78662306a36Sopenharmony_ci#define VOLUME_RAMP_MAX_DVC	(0x17 + 1)
78762306a36Sopenharmony_ci#define VOLUME_RAMP_MAX_MIX	(0x0a + 1)
78862306a36Sopenharmony_ci
78962306a36Sopenharmony_ci/*
79062306a36Sopenharmony_ci *	R-Car SSI
79162306a36Sopenharmony_ci */
79262306a36Sopenharmony_ciint rsnd_ssi_probe(struct rsnd_priv *priv);
79362306a36Sopenharmony_civoid rsnd_ssi_remove(struct rsnd_priv *priv);
79462306a36Sopenharmony_cistruct rsnd_mod *rsnd_ssi_mod_get(struct rsnd_priv *priv, int id);
79562306a36Sopenharmony_ciint rsnd_ssi_use_busif(struct rsnd_dai_stream *io);
79662306a36Sopenharmony_ciu32 rsnd_ssi_multi_secondaries_runtime(struct rsnd_dai_stream *io);
79762306a36Sopenharmony_ciint rsnd_ssi_is_dma_mode(struct rsnd_mod *mod);
79862306a36Sopenharmony_ci
79962306a36Sopenharmony_ci#define rsnd_ssi_is_pin_sharing(io)	\
80062306a36Sopenharmony_ci	__rsnd_ssi_is_pin_sharing(rsnd_io_to_mod_ssi(io))
80162306a36Sopenharmony_ciint __rsnd_ssi_is_pin_sharing(struct rsnd_mod *mod);
80262306a36Sopenharmony_ci
80362306a36Sopenharmony_ci#define rsnd_ssi_of_node(priv) rsnd_parse_of_node(priv, RSND_NODE_SSI)
80462306a36Sopenharmony_civoid rsnd_parse_connect_ssi(struct rsnd_dai *rdai,
80562306a36Sopenharmony_ci			    struct device_node *playback,
80662306a36Sopenharmony_ci			    struct device_node *capture);
80762306a36Sopenharmony_ciunsigned int rsnd_ssi_clk_query(struct rsnd_dai *rdai,
80862306a36Sopenharmony_ci		       int param1, int param2, int *idx);
80962306a36Sopenharmony_ci
81062306a36Sopenharmony_ci/*
81162306a36Sopenharmony_ci *	R-Car SSIU
81262306a36Sopenharmony_ci */
81362306a36Sopenharmony_ciint rsnd_ssiu_attach(struct rsnd_dai_stream *io,
81462306a36Sopenharmony_ci		     struct rsnd_mod *mod);
81562306a36Sopenharmony_ciint rsnd_ssiu_probe(struct rsnd_priv *priv);
81662306a36Sopenharmony_civoid rsnd_ssiu_remove(struct rsnd_priv *priv);
81762306a36Sopenharmony_civoid rsnd_parse_connect_ssiu(struct rsnd_dai *rdai,
81862306a36Sopenharmony_ci			     struct device_node *playback,
81962306a36Sopenharmony_ci			     struct device_node *capture);
82062306a36Sopenharmony_ci#define rsnd_ssiu_of_node(priv) rsnd_parse_of_node(priv, RSND_NODE_SSIU)
82162306a36Sopenharmony_cibool rsnd_ssiu_busif_err_status_clear(struct rsnd_mod *mod);
82262306a36Sopenharmony_ci
82362306a36Sopenharmony_ci/*
82462306a36Sopenharmony_ci *	R-Car SRC
82562306a36Sopenharmony_ci */
82662306a36Sopenharmony_ciint rsnd_src_probe(struct rsnd_priv *priv);
82762306a36Sopenharmony_civoid rsnd_src_remove(struct rsnd_priv *priv);
82862306a36Sopenharmony_cistruct rsnd_mod *rsnd_src_mod_get(struct rsnd_priv *priv, int id);
82962306a36Sopenharmony_ci
83062306a36Sopenharmony_ci#define rsnd_src_get_in_rate(priv, io) rsnd_src_get_rate(priv, io, 1)
83162306a36Sopenharmony_ci#define rsnd_src_get_out_rate(priv, io) rsnd_src_get_rate(priv, io, 0)
83262306a36Sopenharmony_ciunsigned int rsnd_src_get_rate(struct rsnd_priv *priv,
83362306a36Sopenharmony_ci			       struct rsnd_dai_stream *io,
83462306a36Sopenharmony_ci			       int is_in);
83562306a36Sopenharmony_ci
83662306a36Sopenharmony_ci#define rsnd_src_of_node(priv) rsnd_parse_of_node(priv, RSND_NODE_SRC)
83762306a36Sopenharmony_ci#define rsnd_parse_connect_src(rdai, playback, capture)			\
83862306a36Sopenharmony_ci	rsnd_parse_connect_common(rdai, "src", rsnd_src_mod_get,	\
83962306a36Sopenharmony_ci				  rsnd_src_of_node(rsnd_rdai_to_priv(rdai)), \
84062306a36Sopenharmony_ci						   playback, capture)
84162306a36Sopenharmony_ci
84262306a36Sopenharmony_ci/*
84362306a36Sopenharmony_ci *	R-Car CTU
84462306a36Sopenharmony_ci */
84562306a36Sopenharmony_ciint rsnd_ctu_probe(struct rsnd_priv *priv);
84662306a36Sopenharmony_civoid rsnd_ctu_remove(struct rsnd_priv *priv);
84762306a36Sopenharmony_cistruct rsnd_mod *rsnd_ctu_mod_get(struct rsnd_priv *priv, int id);
84862306a36Sopenharmony_ci#define rsnd_ctu_of_node(priv) rsnd_parse_of_node(priv, RSND_NODE_CTU)
84962306a36Sopenharmony_ci#define rsnd_parse_connect_ctu(rdai, playback, capture)			\
85062306a36Sopenharmony_ci	rsnd_parse_connect_common(rdai, "ctu", rsnd_ctu_mod_get,	\
85162306a36Sopenharmony_ci				  rsnd_ctu_of_node(rsnd_rdai_to_priv(rdai)), \
85262306a36Sopenharmony_ci						   playback, capture)
85362306a36Sopenharmony_ci
85462306a36Sopenharmony_ci/*
85562306a36Sopenharmony_ci *	R-Car MIX
85662306a36Sopenharmony_ci */
85762306a36Sopenharmony_ciint rsnd_mix_probe(struct rsnd_priv *priv);
85862306a36Sopenharmony_civoid rsnd_mix_remove(struct rsnd_priv *priv);
85962306a36Sopenharmony_cistruct rsnd_mod *rsnd_mix_mod_get(struct rsnd_priv *priv, int id);
86062306a36Sopenharmony_ci#define rsnd_mix_of_node(priv) rsnd_parse_of_node(priv, RSND_NODE_MIX)
86162306a36Sopenharmony_ci#define rsnd_parse_connect_mix(rdai, playback, capture)			\
86262306a36Sopenharmony_ci	rsnd_parse_connect_common(rdai, "mix", rsnd_mix_mod_get,	\
86362306a36Sopenharmony_ci				  rsnd_mix_of_node(rsnd_rdai_to_priv(rdai)), \
86462306a36Sopenharmony_ci						   playback, capture)
86562306a36Sopenharmony_ci
86662306a36Sopenharmony_ci/*
86762306a36Sopenharmony_ci *	R-Car DVC
86862306a36Sopenharmony_ci */
86962306a36Sopenharmony_ciint rsnd_dvc_probe(struct rsnd_priv *priv);
87062306a36Sopenharmony_civoid rsnd_dvc_remove(struct rsnd_priv *priv);
87162306a36Sopenharmony_cistruct rsnd_mod *rsnd_dvc_mod_get(struct rsnd_priv *priv, int id);
87262306a36Sopenharmony_ci#define rsnd_dvc_of_node(priv) rsnd_parse_of_node(priv, RSND_NODE_DVC)
87362306a36Sopenharmony_ci#define rsnd_parse_connect_dvc(rdai, playback, capture)			\
87462306a36Sopenharmony_ci	rsnd_parse_connect_common(rdai, "dvc", rsnd_dvc_mod_get,	\
87562306a36Sopenharmony_ci				  rsnd_dvc_of_node(rsnd_rdai_to_priv(rdai)), \
87662306a36Sopenharmony_ci						   playback, capture)
87762306a36Sopenharmony_ci
87862306a36Sopenharmony_ci/*
87962306a36Sopenharmony_ci *	R-Car CMD
88062306a36Sopenharmony_ci */
88162306a36Sopenharmony_ciint rsnd_cmd_probe(struct rsnd_priv *priv);
88262306a36Sopenharmony_civoid rsnd_cmd_remove(struct rsnd_priv *priv);
88362306a36Sopenharmony_ciint rsnd_cmd_attach(struct rsnd_dai_stream *io, int id);
88462306a36Sopenharmony_ci
88562306a36Sopenharmony_civoid rsnd_mod_make_sure(struct rsnd_mod *mod, enum rsnd_mod_type type);
88662306a36Sopenharmony_ci#ifdef DEBUG
88762306a36Sopenharmony_ci#define rsnd_mod_confirm_ssi(mssi)	rsnd_mod_make_sure(mssi, RSND_MOD_SSI)
88862306a36Sopenharmony_ci#define rsnd_mod_confirm_src(msrc)	rsnd_mod_make_sure(msrc, RSND_MOD_SRC)
88962306a36Sopenharmony_ci#define rsnd_mod_confirm_dvc(mdvc)	rsnd_mod_make_sure(mdvc, RSND_MOD_DVC)
89062306a36Sopenharmony_ci#else
89162306a36Sopenharmony_ci#define rsnd_mod_confirm_ssi(mssi)
89262306a36Sopenharmony_ci#define rsnd_mod_confirm_src(msrc)
89362306a36Sopenharmony_ci#define rsnd_mod_confirm_dvc(mdvc)
89462306a36Sopenharmony_ci#endif
89562306a36Sopenharmony_ci
89662306a36Sopenharmony_ci/*
89762306a36Sopenharmony_ci * If you don't need interrupt status debug message,
89862306a36Sopenharmony_ci * define RSND_DEBUG_NO_IRQ_STATUS as 1 on top of src.c/ssi.c
89962306a36Sopenharmony_ci *
90062306a36Sopenharmony_ci * #define RSND_DEBUG_NO_IRQ_STATUS 1
90162306a36Sopenharmony_ci */
90262306a36Sopenharmony_ci#define rsnd_print_irq_status(dev, param...) do {	\
90362306a36Sopenharmony_ci	if (!IS_BUILTIN(RSND_DEBUG_NO_IRQ_STATUS))	\
90462306a36Sopenharmony_ci		dev_info(dev, param);			\
90562306a36Sopenharmony_ci} while (0)
90662306a36Sopenharmony_ci
90762306a36Sopenharmony_ci#ifdef CONFIG_DEBUG_FS
90862306a36Sopenharmony_ciint rsnd_debugfs_probe(struct snd_soc_component *component);
90962306a36Sopenharmony_civoid rsnd_debugfs_reg_show(struct seq_file *m, phys_addr_t _addr,
91062306a36Sopenharmony_ci			   void __iomem *base, int offset, int size);
91162306a36Sopenharmony_civoid rsnd_debugfs_mod_reg_show(struct seq_file *m, struct rsnd_mod *mod,
91262306a36Sopenharmony_ci			       int reg_id, int offset, int size);
91362306a36Sopenharmony_ci
91462306a36Sopenharmony_ci#else
91562306a36Sopenharmony_ci#define rsnd_debugfs_probe  NULL
91662306a36Sopenharmony_ci#endif
91762306a36Sopenharmony_ci
91862306a36Sopenharmony_ci#endif /* RSND_H */
919