1*d84881e0SYingkun Meng /* SPDX-License-Identifier: GPL-2.0 */
2*d84881e0SYingkun Meng /*
3*d84881e0SYingkun Meng  * ALSA I2S interface for the Loongson platform
4*d84881e0SYingkun Meng  *
5*d84881e0SYingkun Meng  * Copyright (C) 2023 Loongson Technology Corporation Limited
6*d84881e0SYingkun Meng  * Author: Yingkun Meng <mengyingkun@loongson.cn>
7*d84881e0SYingkun Meng  */
8*d84881e0SYingkun Meng 
9*d84881e0SYingkun Meng #ifndef _LOONGSON_I2S_H
10*d84881e0SYingkun Meng #define _LOONGSON_I2S_H
11*d84881e0SYingkun Meng 
12*d84881e0SYingkun Meng #include <linux/regmap.h>
13*d84881e0SYingkun Meng #include <sound/dmaengine_pcm.h>
14*d84881e0SYingkun Meng 
15*d84881e0SYingkun Meng /* I2S Common Registers */
16*d84881e0SYingkun Meng #define LS_I2S_VER	0x00 /* I2S Version */
17*d84881e0SYingkun Meng #define LS_I2S_CFG	0x04 /* I2S Config */
18*d84881e0SYingkun Meng #define LS_I2S_CTRL	0x08 /* I2S Control */
19*d84881e0SYingkun Meng #define LS_I2S_RX_DATA	0x0C /* I2S DMA RX Address */
20*d84881e0SYingkun Meng #define LS_I2S_TX_DATA	0x10 /* I2S DMA TX Address */
21*d84881e0SYingkun Meng 
22*d84881e0SYingkun Meng /* 2K2000 I2S Specify Registers */
23*d84881e0SYingkun Meng #define LS_I2S_CFG1	0x14 /* I2S Config1 */
24*d84881e0SYingkun Meng 
25*d84881e0SYingkun Meng /* 7A2000 I2S Specify Registers */
26*d84881e0SYingkun Meng #define LS_I2S_TX_ORDER	0x100 /* TX DMA Order */
27*d84881e0SYingkun Meng #define LS_I2S_RX_ORDER 0x110 /* RX DMA Order */
28*d84881e0SYingkun Meng 
29*d84881e0SYingkun Meng /* Loongson I2S Control Register */
30*d84881e0SYingkun Meng #define I2S_CTRL_MCLK_READY	(1 << 16) /* MCLK ready */
31*d84881e0SYingkun Meng #define I2S_CTRL_MASTER		(1 << 15) /* Master mode */
32*d84881e0SYingkun Meng #define I2S_CTRL_MSB		(1 << 14) /* MSB bit order */
33*d84881e0SYingkun Meng #define I2S_CTRL_RX_EN		(1 << 13) /* RX enable */
34*d84881e0SYingkun Meng #define I2S_CTRL_TX_EN		(1 << 12) /* TX enable */
35*d84881e0SYingkun Meng #define I2S_CTRL_RX_DMA_EN	(1 << 11) /* DMA RX enable */
36*d84881e0SYingkun Meng #define I2S_CTRL_CLK_READY	(1 << 8)  /* BCLK ready */
37*d84881e0SYingkun Meng #define I2S_CTRL_TX_DMA_EN	(1 << 7)  /* DMA TX enable */
38*d84881e0SYingkun Meng #define I2S_CTRL_RESET		(1 << 4)  /* Controller soft reset */
39*d84881e0SYingkun Meng #define I2S_CTRL_MCLK_EN	(1 << 3)  /* Enable MCLK */
40*d84881e0SYingkun Meng #define I2S_CTRL_RX_INT_EN	(1 << 1)  /* RX interrupt enable */
41*d84881e0SYingkun Meng #define I2S_CTRL_TX_INT_EN	(1 << 0)  /* TX interrupt enable */
42*d84881e0SYingkun Meng 
43*d84881e0SYingkun Meng #define LS_I2S_DRVNAME		"loongson-i2s"
44*d84881e0SYingkun Meng 
45*d84881e0SYingkun Meng struct loongson_dma_data {
46*d84881e0SYingkun Meng 	dma_addr_t dev_addr;		/* device physical address for DMA */
47*d84881e0SYingkun Meng 	void __iomem *order_addr;	/* DMA order register */
48*d84881e0SYingkun Meng 	u32 irq;			/* DMA irq */
49*d84881e0SYingkun Meng };
50*d84881e0SYingkun Meng 
51*d84881e0SYingkun Meng struct loongson_i2s {
52*d84881e0SYingkun Meng 	struct device *dev;
53*d84881e0SYingkun Meng 	union {
54*d84881e0SYingkun Meng 		struct snd_dmaengine_dai_dma_data playback_dma_data;
55*d84881e0SYingkun Meng 		struct loongson_dma_data tx_dma_data;
56*d84881e0SYingkun Meng 	};
57*d84881e0SYingkun Meng 	union {
58*d84881e0SYingkun Meng 		struct snd_dmaengine_dai_dma_data capture_dma_data;
59*d84881e0SYingkun Meng 		struct loongson_dma_data rx_dma_data;
60*d84881e0SYingkun Meng 	};
61*d84881e0SYingkun Meng 	struct regmap *regmap;
62*d84881e0SYingkun Meng 	void __iomem *reg_base;
63*d84881e0SYingkun Meng 	u32 rev_id;
64*d84881e0SYingkun Meng 	u32 clk_rate;
65*d84881e0SYingkun Meng 	u32 sysclk;
66*d84881e0SYingkun Meng };
67*d84881e0SYingkun Meng 
68*d84881e0SYingkun Meng extern const struct dev_pm_ops loongson_i2s_pm;
69*d84881e0SYingkun Meng extern struct snd_soc_dai_driver loongson_i2s_dai;
70*d84881e0SYingkun Meng 
71*d84881e0SYingkun Meng #endif
72