| /* SPDX-License-Identifier: GPL-2.0 */ |
| /* |
| * ALSA I2S interface for the Loongson platform |
| * |
| * Copyright (C) 2023 Loongson Technology Corporation Limited |
| * Author: Yingkun Meng <mengyingkun@loongson.cn> |
| */ |
| |
| #ifndef _LOONGSON_I2S_H |
| #define _LOONGSON_I2S_H |
| |
| #include <linux/regmap.h> |
| #include <sound/dmaengine_pcm.h> |
| |
| /* I2S Common Registers */ |
| #define LS_I2S_VER 0x00 /* I2S Version */ |
| #define LS_I2S_CFG 0x04 /* I2S Config */ |
| #define LS_I2S_CTRL 0x08 /* I2S Control */ |
| #define LS_I2S_RX_DATA 0x0C /* I2S DMA RX Address */ |
| #define LS_I2S_TX_DATA 0x10 /* I2S DMA TX Address */ |
| |
| /* 2K2000 I2S Specify Registers */ |
| #define LS_I2S_CFG1 0x14 /* I2S Config1 */ |
| |
| /* 7A2000 I2S Specify Registers */ |
| #define LS_I2S_TX_ORDER 0x100 /* TX DMA Order */ |
| #define LS_I2S_RX_ORDER 0x110 /* RX DMA Order */ |
| |
| /* Loongson I2S Control Register */ |
| #define I2S_CTRL_MCLK_READY BIT(16) /* MCLK ready */ |
| #define I2S_CTRL_MASTER BIT(15) /* Master mode */ |
| #define I2S_CTRL_MSB BIT(14) /* MSB bit order */ |
| #define I2S_CTRL_RX_EN BIT(13) /* RX enable */ |
| #define I2S_CTRL_TX_EN BIT(12) /* TX enable */ |
| #define I2S_CTRL_RX_DMA_EN BIT(11) /* DMA RX enable */ |
| #define I2S_CTRL_CLK_READY BIT(8) /* BCLK ready */ |
| #define I2S_CTRL_TX_DMA_EN BIT(7) /* DMA TX enable */ |
| #define I2S_CTRL_RESET BIT(4) /* Controller soft reset */ |
| #define I2S_CTRL_MCLK_EN BIT(3) /* Enable MCLK */ |
| #define I2S_CTRL_RX_INT_EN BIT(1) /* RX interrupt enable */ |
| #define I2S_CTRL_TX_INT_EN BIT(0) /* TX interrupt enable */ |
| |
| #define LS_I2S_DRVNAME "loongson-i2s" |
| |
| struct loongson_dma_data { |
| dma_addr_t dev_addr; /* device physical address for DMA */ |
| void __iomem *order_addr; /* DMA order register */ |
| int irq; /* DMA irq */ |
| }; |
| |
| struct loongson_i2s { |
| struct device *dev; |
| union { |
| struct snd_dmaengine_dai_dma_data playback_dma_data; |
| struct loongson_dma_data tx_dma_data; |
| }; |
| union { |
| struct snd_dmaengine_dai_dma_data capture_dma_data; |
| struct loongson_dma_data rx_dma_data; |
| }; |
| struct regmap *regmap; |
| void __iomem *reg_base; |
| u32 rev_id; |
| u32 clk_rate; |
| u32 sysclk; |
| }; |
| |
| extern const struct dev_pm_ops loongson_i2s_pm; |
| extern struct snd_soc_dai_driver loongson_i2s_dai; |
| |
| #endif |