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