162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 262306a36Sopenharmony_ci// linux/sound/soc/bcm/bcm63xx-i2s.h 362306a36Sopenharmony_ci// Copyright (c) 2020 Broadcom Corporation 462306a36Sopenharmony_ci// Author: Kevin-Ke Li <kevin-ke.li@broadcom.com> 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#ifndef __BCM63XX_I2S_H 762306a36Sopenharmony_ci#define __BCM63XX_I2S_H 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#define I2S_DESC_FIFO_DEPTH 8 1062306a36Sopenharmony_ci#define I2S_MISC_CFG (0x003C) 1162306a36Sopenharmony_ci#define I2S_PAD_LVL_LOOP_DIS_MASK (1 << 2) 1262306a36Sopenharmony_ci#define I2S_PAD_LVL_LOOP_DIS_ENABLE I2S_PAD_LVL_LOOP_DIS_MASK 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci#define I2S_TX_ENABLE_MASK (1 << 31) 1562306a36Sopenharmony_ci#define I2S_TX_ENABLE I2S_TX_ENABLE_MASK 1662306a36Sopenharmony_ci#define I2S_TX_OUT_R (1 << 19) 1762306a36Sopenharmony_ci#define I2S_TX_DATA_ALIGNMENT (1 << 2) 1862306a36Sopenharmony_ci#define I2S_TX_DATA_ENABLE (1 << 1) 1962306a36Sopenharmony_ci#define I2S_TX_CLOCK_ENABLE (1 << 0) 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci#define I2S_TX_DESC_OFF_LEVEL_SHIFT 12 2262306a36Sopenharmony_ci#define I2S_TX_DESC_OFF_LEVEL_MASK (0x0F << I2S_TX_DESC_OFF_LEVEL_SHIFT) 2362306a36Sopenharmony_ci#define I2S_TX_DESC_IFF_LEVEL_SHIFT 8 2462306a36Sopenharmony_ci#define I2S_TX_DESC_IFF_LEVEL_MASK (0x0F << I2S_TX_DESC_IFF_LEVEL_SHIFT) 2562306a36Sopenharmony_ci#define I2S_TX_DESC_OFF_INTR_EN_MSK (1 << 1) 2662306a36Sopenharmony_ci#define I2S_TX_DESC_OFF_INTR_EN I2S_TX_DESC_OFF_INTR_EN_MSK 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci#define I2S_TX_CFG (0x0000) 2962306a36Sopenharmony_ci#define I2S_TX_IRQ_CTL (0x0004) 3062306a36Sopenharmony_ci#define I2S_TX_IRQ_EN (0x0008) 3162306a36Sopenharmony_ci#define I2S_TX_IRQ_IFF_THLD (0x000c) 3262306a36Sopenharmony_ci#define I2S_TX_IRQ_OFF_THLD (0x0010) 3362306a36Sopenharmony_ci#define I2S_TX_DESC_IFF_ADDR (0x0014) 3462306a36Sopenharmony_ci#define I2S_TX_DESC_IFF_LEN (0x0018) 3562306a36Sopenharmony_ci#define I2S_TX_DESC_OFF_ADDR (0x001C) 3662306a36Sopenharmony_ci#define I2S_TX_DESC_OFF_LEN (0x0020) 3762306a36Sopenharmony_ci#define I2S_TX_CFG_2 (0x0024) 3862306a36Sopenharmony_ci#define I2S_TX_SLAVE_MODE_SHIFT 13 3962306a36Sopenharmony_ci#define I2S_TX_SLAVE_MODE_MASK (1 << I2S_TX_SLAVE_MODE_SHIFT) 4062306a36Sopenharmony_ci#define I2S_TX_SLAVE_MODE I2S_TX_SLAVE_MODE_MASK 4162306a36Sopenharmony_ci#define I2S_TX_MASTER_MODE 0 4262306a36Sopenharmony_ci#define I2S_TX_INTR_MASK 0x0F 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci#define I2S_RX_ENABLE_MASK (1 << 31) 4562306a36Sopenharmony_ci#define I2S_RX_ENABLE I2S_RX_ENABLE_MASK 4662306a36Sopenharmony_ci#define I2S_RX_IN_R (1 << 19) 4762306a36Sopenharmony_ci#define I2S_RX_DATA_ALIGNMENT (1 << 2) 4862306a36Sopenharmony_ci#define I2S_RX_CLOCK_ENABLE (1 << 0) 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci#define I2S_RX_DESC_OFF_LEVEL_SHIFT 12 5162306a36Sopenharmony_ci#define I2S_RX_DESC_OFF_LEVEL_MASK (0x0F << I2S_RX_DESC_OFF_LEVEL_SHIFT) 5262306a36Sopenharmony_ci#define I2S_RX_DESC_IFF_LEVEL_SHIFT 8 5362306a36Sopenharmony_ci#define I2S_RX_DESC_IFF_LEVEL_MASK (0x0F << I2S_RX_DESC_IFF_LEVEL_SHIFT) 5462306a36Sopenharmony_ci#define I2S_RX_DESC_OFF_INTR_EN_MSK (1 << 1) 5562306a36Sopenharmony_ci#define I2S_RX_DESC_OFF_INTR_EN I2S_RX_DESC_OFF_INTR_EN_MSK 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci#define I2S_RX_CFG (0x0040) /* 20c0 */ 5862306a36Sopenharmony_ci#define I2S_RX_IRQ_CTL (0x0044) 5962306a36Sopenharmony_ci#define I2S_RX_IRQ_EN (0x0048) 6062306a36Sopenharmony_ci#define I2S_RX_IRQ_IFF_THLD (0x004C) 6162306a36Sopenharmony_ci#define I2S_RX_IRQ_OFF_THLD (0x0050) 6262306a36Sopenharmony_ci#define I2S_RX_DESC_IFF_ADDR (0x0054) 6362306a36Sopenharmony_ci#define I2S_RX_DESC_IFF_LEN (0x0058) 6462306a36Sopenharmony_ci#define I2S_RX_DESC_OFF_ADDR (0x005C) 6562306a36Sopenharmony_ci#define I2S_RX_DESC_OFF_LEN (0x0060) 6662306a36Sopenharmony_ci#define I2S_RX_CFG_2 (0x0064) 6762306a36Sopenharmony_ci#define I2S_RX_SLAVE_MODE_SHIFT 13 6862306a36Sopenharmony_ci#define I2S_RX_SLAVE_MODE_MASK (1 << I2S_RX_SLAVE_MODE_SHIFT) 6962306a36Sopenharmony_ci#define I2S_RX_SLAVE_MODE I2S_RX_SLAVE_MODE_MASK 7062306a36Sopenharmony_ci#define I2S_RX_MASTER_MODE 0 7162306a36Sopenharmony_ci#define I2S_RX_INTR_MASK 0x0F 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci#define I2S_REG_MAX 0x007C 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_cistruct bcm_i2s_priv { 7662306a36Sopenharmony_ci struct device *dev; 7762306a36Sopenharmony_ci struct regmap *regmap_i2s; 7862306a36Sopenharmony_ci struct clk *i2s_clk; 7962306a36Sopenharmony_ci struct snd_pcm_substream *play_substream; 8062306a36Sopenharmony_ci struct snd_pcm_substream *capture_substream; 8162306a36Sopenharmony_ci struct i2s_dma_desc *play_dma_desc; 8262306a36Sopenharmony_ci struct i2s_dma_desc *capture_dma_desc; 8362306a36Sopenharmony_ci}; 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ciextern int bcm63xx_soc_platform_probe(struct platform_device *pdev, 8662306a36Sopenharmony_ci struct bcm_i2s_priv *i2s_priv); 8762306a36Sopenharmony_ciextern int bcm63xx_soc_platform_remove(struct platform_device *pdev); 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_ci#endif 90