162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright 2012-2013 Freescale Semiconductor, Inc.
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#ifndef __FSL_SAI_H
762306a36Sopenharmony_ci#define __FSL_SAI_H
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include <linux/dma/imx-dma.h>
1062306a36Sopenharmony_ci#include <sound/dmaengine_pcm.h>
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#define FSL_SAI_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
1362306a36Sopenharmony_ci			 SNDRV_PCM_FMTBIT_S20_3LE |\
1462306a36Sopenharmony_ci			 SNDRV_PCM_FMTBIT_S24_LE |\
1562306a36Sopenharmony_ci			 SNDRV_PCM_FMTBIT_S32_LE |\
1662306a36Sopenharmony_ci			 SNDRV_PCM_FMTBIT_DSD_U8 |\
1762306a36Sopenharmony_ci			 SNDRV_PCM_FMTBIT_DSD_U16_LE |\
1862306a36Sopenharmony_ci			 SNDRV_PCM_FMTBIT_DSD_U32_LE)
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci/* SAI Register Map Register */
2162306a36Sopenharmony_ci#define FSL_SAI_VERID	0x00 /* SAI Version ID Register */
2262306a36Sopenharmony_ci#define FSL_SAI_PARAM	0x04 /* SAI Parameter Register */
2362306a36Sopenharmony_ci#define FSL_SAI_TCSR(ofs)	(0x00 + ofs) /* SAI Transmit Control */
2462306a36Sopenharmony_ci#define FSL_SAI_TCR1(ofs)	(0x04 + ofs) /* SAI Transmit Configuration 1 */
2562306a36Sopenharmony_ci#define FSL_SAI_TCR2(ofs)	(0x08 + ofs) /* SAI Transmit Configuration 2 */
2662306a36Sopenharmony_ci#define FSL_SAI_TCR3(ofs)	(0x0c + ofs) /* SAI Transmit Configuration 3 */
2762306a36Sopenharmony_ci#define FSL_SAI_TCR4(ofs)	(0x10 + ofs) /* SAI Transmit Configuration 4 */
2862306a36Sopenharmony_ci#define FSL_SAI_TCR5(ofs)	(0x14 + ofs) /* SAI Transmit Configuration 5 */
2962306a36Sopenharmony_ci#define FSL_SAI_TDR0	0x20 /* SAI Transmit Data 0 */
3062306a36Sopenharmony_ci#define FSL_SAI_TDR1	0x24 /* SAI Transmit Data 1 */
3162306a36Sopenharmony_ci#define FSL_SAI_TDR2	0x28 /* SAI Transmit Data 2 */
3262306a36Sopenharmony_ci#define FSL_SAI_TDR3	0x2C /* SAI Transmit Data 3 */
3362306a36Sopenharmony_ci#define FSL_SAI_TDR4	0x30 /* SAI Transmit Data 4 */
3462306a36Sopenharmony_ci#define FSL_SAI_TDR5	0x34 /* SAI Transmit Data 5 */
3562306a36Sopenharmony_ci#define FSL_SAI_TDR6	0x38 /* SAI Transmit Data 6 */
3662306a36Sopenharmony_ci#define FSL_SAI_TDR7	0x3C /* SAI Transmit Data 7 */
3762306a36Sopenharmony_ci#define FSL_SAI_TFR0	0x40 /* SAI Transmit FIFO 0 */
3862306a36Sopenharmony_ci#define FSL_SAI_TFR1	0x44 /* SAI Transmit FIFO 1 */
3962306a36Sopenharmony_ci#define FSL_SAI_TFR2	0x48 /* SAI Transmit FIFO 2 */
4062306a36Sopenharmony_ci#define FSL_SAI_TFR3	0x4C /* SAI Transmit FIFO 3 */
4162306a36Sopenharmony_ci#define FSL_SAI_TFR4	0x50 /* SAI Transmit FIFO 4 */
4262306a36Sopenharmony_ci#define FSL_SAI_TFR5	0x54 /* SAI Transmit FIFO 5 */
4362306a36Sopenharmony_ci#define FSL_SAI_TFR6	0x58 /* SAI Transmit FIFO 6 */
4462306a36Sopenharmony_ci#define FSL_SAI_TFR7	0x5C /* SAI Transmit FIFO 7 */
4562306a36Sopenharmony_ci#define FSL_SAI_TMR	0x60 /* SAI Transmit Mask */
4662306a36Sopenharmony_ci#define FSL_SAI_TTCTL	0x70 /* SAI Transmit Timestamp Control Register */
4762306a36Sopenharmony_ci#define FSL_SAI_TTCTN	0x74 /* SAI Transmit Timestamp Counter Register */
4862306a36Sopenharmony_ci#define FSL_SAI_TBCTN	0x78 /* SAI Transmit Bit Counter Register */
4962306a36Sopenharmony_ci#define FSL_SAI_TTCAP	0x7C /* SAI Transmit Timestamp Capture */
5062306a36Sopenharmony_ci#define FSL_SAI_RCSR(ofs)	(0x80 + ofs) /* SAI Receive Control */
5162306a36Sopenharmony_ci#define FSL_SAI_RCR1(ofs)	(0x84 + ofs)/* SAI Receive Configuration 1 */
5262306a36Sopenharmony_ci#define FSL_SAI_RCR2(ofs)	(0x88 + ofs) /* SAI Receive Configuration 2 */
5362306a36Sopenharmony_ci#define FSL_SAI_RCR3(ofs)	(0x8c + ofs) /* SAI Receive Configuration 3 */
5462306a36Sopenharmony_ci#define FSL_SAI_RCR4(ofs)	(0x90 + ofs) /* SAI Receive Configuration 4 */
5562306a36Sopenharmony_ci#define FSL_SAI_RCR5(ofs)	(0x94 + ofs) /* SAI Receive Configuration 5 */
5662306a36Sopenharmony_ci#define FSL_SAI_RDR0	0xa0 /* SAI Receive Data 0 */
5762306a36Sopenharmony_ci#define FSL_SAI_RDR1	0xa4 /* SAI Receive Data 1 */
5862306a36Sopenharmony_ci#define FSL_SAI_RDR2	0xa8 /* SAI Receive Data 2 */
5962306a36Sopenharmony_ci#define FSL_SAI_RDR3	0xac /* SAI Receive Data 3 */
6062306a36Sopenharmony_ci#define FSL_SAI_RDR4	0xb0 /* SAI Receive Data 4 */
6162306a36Sopenharmony_ci#define FSL_SAI_RDR5	0xb4 /* SAI Receive Data 5 */
6262306a36Sopenharmony_ci#define FSL_SAI_RDR6	0xb8 /* SAI Receive Data 6 */
6362306a36Sopenharmony_ci#define FSL_SAI_RDR7	0xbc /* SAI Receive Data 7 */
6462306a36Sopenharmony_ci#define FSL_SAI_RFR0	0xc0 /* SAI Receive FIFO 0 */
6562306a36Sopenharmony_ci#define FSL_SAI_RFR1	0xc4 /* SAI Receive FIFO 1 */
6662306a36Sopenharmony_ci#define FSL_SAI_RFR2	0xc8 /* SAI Receive FIFO 2 */
6762306a36Sopenharmony_ci#define FSL_SAI_RFR3	0xcc /* SAI Receive FIFO 3 */
6862306a36Sopenharmony_ci#define FSL_SAI_RFR4	0xd0 /* SAI Receive FIFO 4 */
6962306a36Sopenharmony_ci#define FSL_SAI_RFR5	0xd4 /* SAI Receive FIFO 5 */
7062306a36Sopenharmony_ci#define FSL_SAI_RFR6	0xd8 /* SAI Receive FIFO 6 */
7162306a36Sopenharmony_ci#define FSL_SAI_RFR7	0xdc /* SAI Receive FIFO 7 */
7262306a36Sopenharmony_ci#define FSL_SAI_RMR	0xe0 /* SAI Receive Mask */
7362306a36Sopenharmony_ci#define FSL_SAI_RTCTL	0xf0 /* SAI Receive Timestamp Control Register */
7462306a36Sopenharmony_ci#define FSL_SAI_RTCTN	0xf4 /* SAI Receive Timestamp Counter Register */
7562306a36Sopenharmony_ci#define FSL_SAI_RBCTN	0xf8 /* SAI Receive Bit Counter Register */
7662306a36Sopenharmony_ci#define FSL_SAI_RTCAP	0xfc /* SAI Receive Timestamp Capture */
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_ci#define FSL_SAI_MCTL	0x100 /* SAI MCLK Control Register */
7962306a36Sopenharmony_ci#define FSL_SAI_MDIV	0x104 /* SAI MCLK Divide Register */
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_ci#define FSL_SAI_xCSR(tx, ofs)	(tx ? FSL_SAI_TCSR(ofs) : FSL_SAI_RCSR(ofs))
8262306a36Sopenharmony_ci#define FSL_SAI_xCR1(tx, ofs)	(tx ? FSL_SAI_TCR1(ofs) : FSL_SAI_RCR1(ofs))
8362306a36Sopenharmony_ci#define FSL_SAI_xCR2(tx, ofs)	(tx ? FSL_SAI_TCR2(ofs) : FSL_SAI_RCR2(ofs))
8462306a36Sopenharmony_ci#define FSL_SAI_xCR3(tx, ofs)	(tx ? FSL_SAI_TCR3(ofs) : FSL_SAI_RCR3(ofs))
8562306a36Sopenharmony_ci#define FSL_SAI_xCR4(tx, ofs)	(tx ? FSL_SAI_TCR4(ofs) : FSL_SAI_RCR4(ofs))
8662306a36Sopenharmony_ci#define FSL_SAI_xCR5(tx, ofs)	(tx ? FSL_SAI_TCR5(ofs) : FSL_SAI_RCR5(ofs))
8762306a36Sopenharmony_ci#define FSL_SAI_xDR0(tx)	(tx ? FSL_SAI_TDR0 : FSL_SAI_RDR0)
8862306a36Sopenharmony_ci#define FSL_SAI_xFR0(tx)	(tx ? FSL_SAI_TFR0 : FSL_SAI_RFR0)
8962306a36Sopenharmony_ci#define FSL_SAI_xMR(tx)		(tx ? FSL_SAI_TMR : FSL_SAI_RMR)
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_ci/* SAI Transmit/Receive Control Register */
9262306a36Sopenharmony_ci#define FSL_SAI_CSR_TERE	BIT(31)
9362306a36Sopenharmony_ci#define FSL_SAI_CSR_SE		BIT(30)
9462306a36Sopenharmony_ci#define FSL_SAI_CSR_BCE		BIT(28)
9562306a36Sopenharmony_ci#define FSL_SAI_CSR_FR		BIT(25)
9662306a36Sopenharmony_ci#define FSL_SAI_CSR_SR		BIT(24)
9762306a36Sopenharmony_ci#define FSL_SAI_CSR_xF_SHIFT	16
9862306a36Sopenharmony_ci#define FSL_SAI_CSR_xF_W_SHIFT	18
9962306a36Sopenharmony_ci#define FSL_SAI_CSR_xF_MASK	(0x1f << FSL_SAI_CSR_xF_SHIFT)
10062306a36Sopenharmony_ci#define FSL_SAI_CSR_xF_W_MASK	(0x7 << FSL_SAI_CSR_xF_W_SHIFT)
10162306a36Sopenharmony_ci#define FSL_SAI_CSR_WSF		BIT(20)
10262306a36Sopenharmony_ci#define FSL_SAI_CSR_SEF		BIT(19)
10362306a36Sopenharmony_ci#define FSL_SAI_CSR_FEF		BIT(18)
10462306a36Sopenharmony_ci#define FSL_SAI_CSR_FWF		BIT(17)
10562306a36Sopenharmony_ci#define FSL_SAI_CSR_FRF		BIT(16)
10662306a36Sopenharmony_ci#define FSL_SAI_CSR_xIE_SHIFT	8
10762306a36Sopenharmony_ci#define FSL_SAI_CSR_xIE_MASK	(0x1f << FSL_SAI_CSR_xIE_SHIFT)
10862306a36Sopenharmony_ci#define FSL_SAI_CSR_WSIE	BIT(12)
10962306a36Sopenharmony_ci#define FSL_SAI_CSR_SEIE	BIT(11)
11062306a36Sopenharmony_ci#define FSL_SAI_CSR_FEIE	BIT(10)
11162306a36Sopenharmony_ci#define FSL_SAI_CSR_FWIE	BIT(9)
11262306a36Sopenharmony_ci#define FSL_SAI_CSR_FRIE	BIT(8)
11362306a36Sopenharmony_ci#define FSL_SAI_CSR_FRDE	BIT(0)
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_ci/* SAI Transmit and Receive Configuration 1 Register */
11662306a36Sopenharmony_ci#define FSL_SAI_CR1_RFW_MASK(x)	((x) - 1)
11762306a36Sopenharmony_ci
11862306a36Sopenharmony_ci/* SAI Transmit and Receive Configuration 2 Register */
11962306a36Sopenharmony_ci#define FSL_SAI_CR2_SYNC	BIT(30)
12062306a36Sopenharmony_ci#define FSL_SAI_CR2_BCI		BIT(28)
12162306a36Sopenharmony_ci#define FSL_SAI_CR2_MSEL_MASK	(0x3 << 26)
12262306a36Sopenharmony_ci#define FSL_SAI_CR2_MSEL_BUS	0
12362306a36Sopenharmony_ci#define FSL_SAI_CR2_MSEL_MCLK1	BIT(26)
12462306a36Sopenharmony_ci#define FSL_SAI_CR2_MSEL_MCLK2	BIT(27)
12562306a36Sopenharmony_ci#define FSL_SAI_CR2_MSEL_MCLK3	(BIT(26) | BIT(27))
12662306a36Sopenharmony_ci#define FSL_SAI_CR2_MSEL(ID)	((ID) << 26)
12762306a36Sopenharmony_ci#define FSL_SAI_CR2_BCP		BIT(25)
12862306a36Sopenharmony_ci#define FSL_SAI_CR2_BCD_MSTR	BIT(24)
12962306a36Sopenharmony_ci#define FSL_SAI_CR2_BYP		BIT(23) /* BCLK bypass */
13062306a36Sopenharmony_ci#define FSL_SAI_CR2_DIV_MASK	0xff
13162306a36Sopenharmony_ci
13262306a36Sopenharmony_ci/* SAI Transmit and Receive Configuration 3 Register */
13362306a36Sopenharmony_ci#define FSL_SAI_CR3_TRCE(x)     ((x) << 16)
13462306a36Sopenharmony_ci#define FSL_SAI_CR3_TRCE_MASK	GENMASK(23, 16)
13562306a36Sopenharmony_ci#define FSL_SAI_CR3_WDFL(x)	(x)
13662306a36Sopenharmony_ci#define FSL_SAI_CR3_WDFL_MASK	0x1f
13762306a36Sopenharmony_ci
13862306a36Sopenharmony_ci/* SAI Transmit and Receive Configuration 4 Register */
13962306a36Sopenharmony_ci
14062306a36Sopenharmony_ci#define FSL_SAI_CR4_FCONT	BIT(28)
14162306a36Sopenharmony_ci#define FSL_SAI_CR4_FCOMB_SHIFT BIT(26)
14262306a36Sopenharmony_ci#define FSL_SAI_CR4_FCOMB_SOFT  BIT(27)
14362306a36Sopenharmony_ci#define FSL_SAI_CR4_FCOMB_MASK  (0x3 << 26)
14462306a36Sopenharmony_ci#define FSL_SAI_CR4_FPACK_8     (0x2 << 24)
14562306a36Sopenharmony_ci#define FSL_SAI_CR4_FPACK_16    (0x3 << 24)
14662306a36Sopenharmony_ci#define FSL_SAI_CR4_FRSZ(x)	(((x) - 1) << 16)
14762306a36Sopenharmony_ci#define FSL_SAI_CR4_FRSZ_MASK	(0x1f << 16)
14862306a36Sopenharmony_ci#define FSL_SAI_CR4_SYWD(x)	(((x) - 1) << 8)
14962306a36Sopenharmony_ci#define FSL_SAI_CR4_SYWD_MASK	(0x1f << 8)
15062306a36Sopenharmony_ci#define FSL_SAI_CR4_CHMOD       BIT(5)
15162306a36Sopenharmony_ci#define FSL_SAI_CR4_CHMOD_MASK  BIT(5)
15262306a36Sopenharmony_ci#define FSL_SAI_CR4_MF		BIT(4)
15362306a36Sopenharmony_ci#define FSL_SAI_CR4_FSE		BIT(3)
15462306a36Sopenharmony_ci#define FSL_SAI_CR4_FSP		BIT(1)
15562306a36Sopenharmony_ci#define FSL_SAI_CR4_FSD_MSTR	BIT(0)
15662306a36Sopenharmony_ci
15762306a36Sopenharmony_ci/* SAI Transmit and Receive Configuration 5 Register */
15862306a36Sopenharmony_ci#define FSL_SAI_CR5_WNW(x)	(((x) - 1) << 24)
15962306a36Sopenharmony_ci#define FSL_SAI_CR5_WNW_MASK	(0x1f << 24)
16062306a36Sopenharmony_ci#define FSL_SAI_CR5_W0W(x)	(((x) - 1) << 16)
16162306a36Sopenharmony_ci#define FSL_SAI_CR5_W0W_MASK	(0x1f << 16)
16262306a36Sopenharmony_ci#define FSL_SAI_CR5_FBT(x)	((x) << 8)
16362306a36Sopenharmony_ci#define FSL_SAI_CR5_FBT_MASK	(0x1f << 8)
16462306a36Sopenharmony_ci
16562306a36Sopenharmony_ci/* SAI MCLK Control Register */
16662306a36Sopenharmony_ci#define FSL_SAI_MCTL_MCLK_EN	BIT(30)	/* MCLK Enable */
16762306a36Sopenharmony_ci#define FSL_SAI_MCTL_MSEL_MASK	(0x3 << 24)
16862306a36Sopenharmony_ci#define FSL_SAI_MCTL_MSEL(ID)   ((ID) << 24)
16962306a36Sopenharmony_ci#define FSL_SAI_MCTL_MSEL_BUS	0
17062306a36Sopenharmony_ci#define FSL_SAI_MCTL_MSEL_MCLK1	BIT(24)
17162306a36Sopenharmony_ci#define FSL_SAI_MCTL_MSEL_MCLK2	BIT(25)
17262306a36Sopenharmony_ci#define FSL_SAI_MCTL_MSEL_MCLK3	(BIT(24) | BIT(25))
17362306a36Sopenharmony_ci#define FSL_SAI_MCTL_DIV_EN	BIT(23)
17462306a36Sopenharmony_ci#define FSL_SAI_MCTL_DIV_MASK	0xFF
17562306a36Sopenharmony_ci
17662306a36Sopenharmony_ci/* SAI VERID Register */
17762306a36Sopenharmony_ci#define FSL_SAI_VERID_MAJOR_SHIFT   24
17862306a36Sopenharmony_ci#define FSL_SAI_VERID_MAJOR_MASK    GENMASK(31, 24)
17962306a36Sopenharmony_ci#define FSL_SAI_VERID_MINOR_SHIFT   16
18062306a36Sopenharmony_ci#define FSL_SAI_VERID_MINOR_MASK    GENMASK(23, 16)
18162306a36Sopenharmony_ci#define FSL_SAI_VERID_FEATURE_SHIFT 0
18262306a36Sopenharmony_ci#define FSL_SAI_VERID_FEATURE_MASK  GENMASK(15, 0)
18362306a36Sopenharmony_ci#define FSL_SAI_VERID_EFIFO_EN	    BIT(0)
18462306a36Sopenharmony_ci#define FSL_SAI_VERID_TSTMP_EN	    BIT(1)
18562306a36Sopenharmony_ci
18662306a36Sopenharmony_ci/* SAI PARAM Register */
18762306a36Sopenharmony_ci#define FSL_SAI_PARAM_SPF_SHIFT	    16
18862306a36Sopenharmony_ci#define FSL_SAI_PARAM_SPF_MASK	    GENMASK(19, 16)
18962306a36Sopenharmony_ci#define FSL_SAI_PARAM_WPF_SHIFT	    8
19062306a36Sopenharmony_ci#define FSL_SAI_PARAM_WPF_MASK	    GENMASK(11, 8)
19162306a36Sopenharmony_ci#define FSL_SAI_PARAM_DLN_MASK	    GENMASK(3, 0)
19262306a36Sopenharmony_ci
19362306a36Sopenharmony_ci/* SAI MCLK Divide Register */
19462306a36Sopenharmony_ci#define FSL_SAI_MDIV_MASK	    0xFFFFF
19562306a36Sopenharmony_ci
19662306a36Sopenharmony_ci/* SAI timestamp and bitcounter */
19762306a36Sopenharmony_ci#define FSL_SAI_xTCTL_TSEN         BIT(0)
19862306a36Sopenharmony_ci#define FSL_SAI_xTCTL_TSINC        BIT(1)
19962306a36Sopenharmony_ci#define FSL_SAI_xTCTL_RTSC         BIT(8)
20062306a36Sopenharmony_ci#define FSL_SAI_xTCTL_RBC          BIT(9)
20162306a36Sopenharmony_ci
20262306a36Sopenharmony_ci/* SAI type */
20362306a36Sopenharmony_ci#define FSL_SAI_DMA		BIT(0)
20462306a36Sopenharmony_ci#define FSL_SAI_USE_AC97	BIT(1)
20562306a36Sopenharmony_ci#define FSL_SAI_NET		BIT(2)
20662306a36Sopenharmony_ci#define FSL_SAI_TRA_SYN		BIT(3)
20762306a36Sopenharmony_ci#define FSL_SAI_REC_SYN		BIT(4)
20862306a36Sopenharmony_ci#define FSL_SAI_USE_I2S_SLAVE	BIT(5)
20962306a36Sopenharmony_ci
21062306a36Sopenharmony_ci/* SAI clock sources */
21162306a36Sopenharmony_ci#define FSL_SAI_CLK_BUS		0
21262306a36Sopenharmony_ci#define FSL_SAI_CLK_MAST1	1
21362306a36Sopenharmony_ci#define FSL_SAI_CLK_MAST2	2
21462306a36Sopenharmony_ci#define FSL_SAI_CLK_MAST3	3
21562306a36Sopenharmony_ci
21662306a36Sopenharmony_ci#define FSL_SAI_MCLK_MAX	4
21762306a36Sopenharmony_ci
21862306a36Sopenharmony_ci/* SAI data transfer numbers per DMA request */
21962306a36Sopenharmony_ci#define FSL_SAI_MAXBURST_TX 6
22062306a36Sopenharmony_ci#define FSL_SAI_MAXBURST_RX 6
22162306a36Sopenharmony_ci
22262306a36Sopenharmony_ci#define PMQOS_CPU_LATENCY   BIT(0)
22362306a36Sopenharmony_ci
22462306a36Sopenharmony_ci/* Max number of dataline */
22562306a36Sopenharmony_ci#define FSL_SAI_DL_NUM		(8)
22662306a36Sopenharmony_ci/* default dataline type is zero */
22762306a36Sopenharmony_ci#define FSL_SAI_DL_DEFAULT	(0)
22862306a36Sopenharmony_ci#define FSL_SAI_DL_I2S		BIT(0)
22962306a36Sopenharmony_ci#define FSL_SAI_DL_PDM		BIT(1)
23062306a36Sopenharmony_ci
23162306a36Sopenharmony_cistruct fsl_sai_soc_data {
23262306a36Sopenharmony_ci	bool use_imx_pcm;
23362306a36Sopenharmony_ci	bool use_edma;
23462306a36Sopenharmony_ci	bool mclk0_is_mclk1;
23562306a36Sopenharmony_ci	bool mclk_with_tere;
23662306a36Sopenharmony_ci	unsigned int fifo_depth;
23762306a36Sopenharmony_ci	unsigned int pins;
23862306a36Sopenharmony_ci	unsigned int reg_offset;
23962306a36Sopenharmony_ci	unsigned int flags;
24062306a36Sopenharmony_ci	unsigned int max_register;
24162306a36Sopenharmony_ci	unsigned int max_burst[2];
24262306a36Sopenharmony_ci};
24362306a36Sopenharmony_ci
24462306a36Sopenharmony_ci/**
24562306a36Sopenharmony_ci * struct fsl_sai_verid - version id data
24662306a36Sopenharmony_ci * @version: version number
24762306a36Sopenharmony_ci * @feature: feature specification number
24862306a36Sopenharmony_ci *           0000000000000000b - Standard feature set
24962306a36Sopenharmony_ci *           0000000000000000b - Standard feature set
25062306a36Sopenharmony_ci */
25162306a36Sopenharmony_cistruct fsl_sai_verid {
25262306a36Sopenharmony_ci	u32 version;
25362306a36Sopenharmony_ci	u32 feature;
25462306a36Sopenharmony_ci};
25562306a36Sopenharmony_ci
25662306a36Sopenharmony_ci/**
25762306a36Sopenharmony_ci * struct fsl_sai_param - parameter data
25862306a36Sopenharmony_ci * @slot_num: The maximum number of slots per frame
25962306a36Sopenharmony_ci * @fifo_depth: The number of words in each FIFO (depth)
26062306a36Sopenharmony_ci * @dataline: The number of datalines implemented
26162306a36Sopenharmony_ci */
26262306a36Sopenharmony_cistruct fsl_sai_param {
26362306a36Sopenharmony_ci	u32 slot_num;
26462306a36Sopenharmony_ci	u32 fifo_depth;
26562306a36Sopenharmony_ci	u32 dataline;
26662306a36Sopenharmony_ci};
26762306a36Sopenharmony_ci
26862306a36Sopenharmony_cistruct fsl_sai_dl_cfg {
26962306a36Sopenharmony_ci	unsigned int type;
27062306a36Sopenharmony_ci	unsigned int pins[2];
27162306a36Sopenharmony_ci	unsigned int mask[2];
27262306a36Sopenharmony_ci	unsigned int start_off[2];
27362306a36Sopenharmony_ci	unsigned int next_off[2];
27462306a36Sopenharmony_ci};
27562306a36Sopenharmony_ci
27662306a36Sopenharmony_cistruct fsl_sai {
27762306a36Sopenharmony_ci	struct platform_device *pdev;
27862306a36Sopenharmony_ci	struct regmap *regmap;
27962306a36Sopenharmony_ci	struct clk *bus_clk;
28062306a36Sopenharmony_ci	struct clk *mclk_clk[FSL_SAI_MCLK_MAX];
28162306a36Sopenharmony_ci	struct clk *pll8k_clk;
28262306a36Sopenharmony_ci	struct clk *pll11k_clk;
28362306a36Sopenharmony_ci	struct resource *res;
28462306a36Sopenharmony_ci
28562306a36Sopenharmony_ci	bool is_consumer_mode;
28662306a36Sopenharmony_ci	bool is_lsb_first;
28762306a36Sopenharmony_ci	bool is_dsp_mode;
28862306a36Sopenharmony_ci	bool is_pdm_mode;
28962306a36Sopenharmony_ci	bool is_multi_fifo_dma;
29062306a36Sopenharmony_ci	bool synchronous[2];
29162306a36Sopenharmony_ci	struct fsl_sai_dl_cfg *dl_cfg;
29262306a36Sopenharmony_ci	unsigned int dl_cfg_cnt;
29362306a36Sopenharmony_ci	bool mclk_direction_output;
29462306a36Sopenharmony_ci
29562306a36Sopenharmony_ci	unsigned int mclk_id[2];
29662306a36Sopenharmony_ci	unsigned int mclk_streams;
29762306a36Sopenharmony_ci	unsigned int slots;
29862306a36Sopenharmony_ci	unsigned int slot_width;
29962306a36Sopenharmony_ci	unsigned int bclk_ratio;
30062306a36Sopenharmony_ci
30162306a36Sopenharmony_ci	const struct fsl_sai_soc_data *soc_data;
30262306a36Sopenharmony_ci	struct snd_soc_dai_driver cpu_dai_drv;
30362306a36Sopenharmony_ci	struct snd_dmaengine_dai_dma_data dma_params_rx;
30462306a36Sopenharmony_ci	struct snd_dmaengine_dai_dma_data dma_params_tx;
30562306a36Sopenharmony_ci	struct fsl_sai_verid verid;
30662306a36Sopenharmony_ci	struct fsl_sai_param param;
30762306a36Sopenharmony_ci	struct pm_qos_request pm_qos_req;
30862306a36Sopenharmony_ci	struct pinctrl *pinctrl;
30962306a36Sopenharmony_ci	struct pinctrl_state *pins_state;
31062306a36Sopenharmony_ci	struct sdma_peripheral_config audio_config[2];
31162306a36Sopenharmony_ci};
31262306a36Sopenharmony_ci
31362306a36Sopenharmony_ci#define TX 1
31462306a36Sopenharmony_ci#define RX 0
31562306a36Sopenharmony_ci
31662306a36Sopenharmony_ci#endif /* __FSL_SAI_H */
317