1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * sound/soc/rockchip/rockchip_i2s_tdm.h 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * ALSA SoC Audio Layer - Rockchip I2S_TDM Controller driver 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * Copyright (c) 2018 Rockchip Electronics Co. Ltd. 7*4882a593Smuzhiyun * Author: Sugar Zhang <sugar.zhang@rock-chips.com> 8*4882a593Smuzhiyun * 9*4882a593Smuzhiyun * This program is free software; you can redistribute it and/or modify 10*4882a593Smuzhiyun * it under the terms of the GNU General Public License version 2 as 11*4882a593Smuzhiyun * published by the Free Software Foundation. 12*4882a593Smuzhiyun */ 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun #ifndef _ROCKCHIP_I2S_TDM_H 15*4882a593Smuzhiyun #define _ROCKCHIP_I2S_TDM_H 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun /* 18*4882a593Smuzhiyun * TXCR 19*4882a593Smuzhiyun * transmit operation control register 20*4882a593Smuzhiyun */ 21*4882a593Smuzhiyun #define I2S_TXCR_PATH_SHIFT(x) (23 + (x) * 2) 22*4882a593Smuzhiyun #define I2S_TXCR_PATH_MASK(x) (0x3 << I2S_TXCR_PATH_SHIFT(x)) 23*4882a593Smuzhiyun #define I2S_TXCR_PATH(x, v) ((v) << I2S_TXCR_PATH_SHIFT(x)) 24*4882a593Smuzhiyun #define I2S_TXCR_RCNT_SHIFT 17 25*4882a593Smuzhiyun #define I2S_TXCR_RCNT_MASK (0x3f << I2S_TXCR_RCNT_SHIFT) 26*4882a593Smuzhiyun #define I2S_TXCR_CSR_SHIFT 15 27*4882a593Smuzhiyun #define I2S_TXCR_CSR(x) ((x) << I2S_TXCR_CSR_SHIFT) 28*4882a593Smuzhiyun #define I2S_TXCR_CSR_MASK (3 << I2S_TXCR_CSR_SHIFT) 29*4882a593Smuzhiyun #define I2S_TXCR_HWT BIT(14) 30*4882a593Smuzhiyun #define I2S_TXCR_SJM_SHIFT 12 31*4882a593Smuzhiyun #define I2S_TXCR_SJM_R (0 << I2S_TXCR_SJM_SHIFT) 32*4882a593Smuzhiyun #define I2S_TXCR_SJM_L (1 << I2S_TXCR_SJM_SHIFT) 33*4882a593Smuzhiyun #define I2S_TXCR_FBM_SHIFT 11 34*4882a593Smuzhiyun #define I2S_TXCR_FBM_MSB (0 << I2S_TXCR_FBM_SHIFT) 35*4882a593Smuzhiyun #define I2S_TXCR_FBM_LSB (1 << I2S_TXCR_FBM_SHIFT) 36*4882a593Smuzhiyun #define I2S_TXCR_IBM_SHIFT 9 37*4882a593Smuzhiyun #define I2S_TXCR_IBM_NORMAL (0 << I2S_TXCR_IBM_SHIFT) 38*4882a593Smuzhiyun #define I2S_TXCR_IBM_LSJM (1 << I2S_TXCR_IBM_SHIFT) 39*4882a593Smuzhiyun #define I2S_TXCR_IBM_RSJM (2 << I2S_TXCR_IBM_SHIFT) 40*4882a593Smuzhiyun #define I2S_TXCR_IBM_MASK (3 << I2S_TXCR_IBM_SHIFT) 41*4882a593Smuzhiyun #define I2S_TXCR_PBM_SHIFT 7 42*4882a593Smuzhiyun #define I2S_TXCR_PBM_MODE(x) ((x) << I2S_TXCR_PBM_SHIFT) 43*4882a593Smuzhiyun #define I2S_TXCR_PBM_MASK (3 << I2S_TXCR_PBM_SHIFT) 44*4882a593Smuzhiyun #define I2S_TXCR_TFS_SHIFT 5 45*4882a593Smuzhiyun #define I2S_TXCR_TFS_I2S (0 << I2S_TXCR_TFS_SHIFT) 46*4882a593Smuzhiyun #define I2S_TXCR_TFS_PCM (1 << I2S_TXCR_TFS_SHIFT) 47*4882a593Smuzhiyun #define I2S_TXCR_TFS_TDM_PCM (2 << I2S_TXCR_TFS_SHIFT) 48*4882a593Smuzhiyun #define I2S_TXCR_TFS_TDM_I2S (3 << I2S_TXCR_TFS_SHIFT) 49*4882a593Smuzhiyun #define I2S_TXCR_TFS_MASK (3 << I2S_TXCR_TFS_SHIFT) 50*4882a593Smuzhiyun #define I2S_TXCR_VDW_SHIFT 0 51*4882a593Smuzhiyun #define I2S_TXCR_VDW(x) (((x) - 1) << I2S_TXCR_VDW_SHIFT) 52*4882a593Smuzhiyun #define I2S_TXCR_VDW_MASK (0x1f << I2S_TXCR_VDW_SHIFT) 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun /* 55*4882a593Smuzhiyun * RXCR 56*4882a593Smuzhiyun * receive operation control register 57*4882a593Smuzhiyun */ 58*4882a593Smuzhiyun #define I2S_RXCR_PATH_SHIFT(x) (17 + (x) * 2) 59*4882a593Smuzhiyun #define I2S_RXCR_PATH_MASK(x) (0x3 << I2S_RXCR_PATH_SHIFT(x)) 60*4882a593Smuzhiyun #define I2S_RXCR_PATH(x, v) ((v) << I2S_RXCR_PATH_SHIFT(x)) 61*4882a593Smuzhiyun #define I2S_RXCR_CSR_SHIFT 15 62*4882a593Smuzhiyun #define I2S_RXCR_CSR(x) ((x) << I2S_RXCR_CSR_SHIFT) 63*4882a593Smuzhiyun #define I2S_RXCR_CSR_MASK (3 << I2S_RXCR_CSR_SHIFT) 64*4882a593Smuzhiyun #define I2S_RXCR_HWT BIT(14) 65*4882a593Smuzhiyun #define I2S_RXCR_SJM_SHIFT 12 66*4882a593Smuzhiyun #define I2S_RXCR_SJM_R (0 << I2S_RXCR_SJM_SHIFT) 67*4882a593Smuzhiyun #define I2S_RXCR_SJM_L (1 << I2S_RXCR_SJM_SHIFT) 68*4882a593Smuzhiyun #define I2S_RXCR_FBM_SHIFT 11 69*4882a593Smuzhiyun #define I2S_RXCR_FBM_MSB (0 << I2S_RXCR_FBM_SHIFT) 70*4882a593Smuzhiyun #define I2S_RXCR_FBM_LSB (1 << I2S_RXCR_FBM_SHIFT) 71*4882a593Smuzhiyun #define I2S_RXCR_IBM_SHIFT 9 72*4882a593Smuzhiyun #define I2S_RXCR_IBM_NORMAL (0 << I2S_RXCR_IBM_SHIFT) 73*4882a593Smuzhiyun #define I2S_RXCR_IBM_LSJM (1 << I2S_RXCR_IBM_SHIFT) 74*4882a593Smuzhiyun #define I2S_RXCR_IBM_RSJM (2 << I2S_RXCR_IBM_SHIFT) 75*4882a593Smuzhiyun #define I2S_RXCR_IBM_MASK (3 << I2S_RXCR_IBM_SHIFT) 76*4882a593Smuzhiyun #define I2S_RXCR_PBM_SHIFT 7 77*4882a593Smuzhiyun #define I2S_RXCR_PBM_MODE(x) ((x) << I2S_RXCR_PBM_SHIFT) 78*4882a593Smuzhiyun #define I2S_RXCR_PBM_MASK (3 << I2S_RXCR_PBM_SHIFT) 79*4882a593Smuzhiyun #define I2S_RXCR_TFS_SHIFT 5 80*4882a593Smuzhiyun #define I2S_RXCR_TFS_I2S (0 << I2S_RXCR_TFS_SHIFT) 81*4882a593Smuzhiyun #define I2S_RXCR_TFS_PCM (1 << I2S_RXCR_TFS_SHIFT) 82*4882a593Smuzhiyun #define I2S_RXCR_TFS_TDM_PCM (2 << I2S_RXCR_TFS_SHIFT) 83*4882a593Smuzhiyun #define I2S_RXCR_TFS_TDM_I2S (3 << I2S_RXCR_TFS_SHIFT) 84*4882a593Smuzhiyun #define I2S_RXCR_TFS_MASK (3 << I2S_RXCR_TFS_SHIFT) 85*4882a593Smuzhiyun #define I2S_RXCR_VDW_SHIFT 0 86*4882a593Smuzhiyun #define I2S_RXCR_VDW(x) (((x) - 1) << I2S_RXCR_VDW_SHIFT) 87*4882a593Smuzhiyun #define I2S_RXCR_VDW_MASK (0x1f << I2S_RXCR_VDW_SHIFT) 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun /* 90*4882a593Smuzhiyun * CKR 91*4882a593Smuzhiyun * clock generation register 92*4882a593Smuzhiyun */ 93*4882a593Smuzhiyun #define I2S_CKR_TRCM_SHIFT 28 94*4882a593Smuzhiyun #define I2S_CKR_TRCM(x) ((x) << I2S_CKR_TRCM_SHIFT) 95*4882a593Smuzhiyun #define I2S_CKR_TRCM_TXRX (0 << I2S_CKR_TRCM_SHIFT) 96*4882a593Smuzhiyun #define I2S_CKR_TRCM_TXONLY (1 << I2S_CKR_TRCM_SHIFT) 97*4882a593Smuzhiyun #define I2S_CKR_TRCM_RXONLY (2 << I2S_CKR_TRCM_SHIFT) 98*4882a593Smuzhiyun #define I2S_CKR_TRCM_MASK (3 << I2S_CKR_TRCM_SHIFT) 99*4882a593Smuzhiyun #define I2S_CKR_MSS_SHIFT 27 100*4882a593Smuzhiyun #define I2S_CKR_MSS_MASTER (0 << I2S_CKR_MSS_SHIFT) 101*4882a593Smuzhiyun #define I2S_CKR_MSS_SLAVE (1 << I2S_CKR_MSS_SHIFT) 102*4882a593Smuzhiyun #define I2S_CKR_MSS_MASK (1 << I2S_CKR_MSS_SHIFT) 103*4882a593Smuzhiyun #define I2S_CKR_CKP_SHIFT 26 104*4882a593Smuzhiyun #define I2S_CKR_CKP_NORMAL (0 << I2S_CKR_CKP_SHIFT) 105*4882a593Smuzhiyun #define I2S_CKR_CKP_INVERTED (1 << I2S_CKR_CKP_SHIFT) 106*4882a593Smuzhiyun #define I2S_CKR_CKP_MASK (1 << I2S_CKR_CKP_SHIFT) 107*4882a593Smuzhiyun #define I2S_CKR_RLP_SHIFT 25 108*4882a593Smuzhiyun #define I2S_CKR_RLP_NORMAL (0 << I2S_CKR_RLP_SHIFT) 109*4882a593Smuzhiyun #define I2S_CKR_RLP_INVERTED (1 << I2S_CKR_RLP_SHIFT) 110*4882a593Smuzhiyun #define I2S_CKR_RLP_MASK (1 << I2S_CKR_RLP_SHIFT) 111*4882a593Smuzhiyun #define I2S_CKR_TLP_SHIFT 24 112*4882a593Smuzhiyun #define I2S_CKR_TLP_NORMAL (0 << I2S_CKR_TLP_SHIFT) 113*4882a593Smuzhiyun #define I2S_CKR_TLP_INVERTED (1 << I2S_CKR_TLP_SHIFT) 114*4882a593Smuzhiyun #define I2S_CKR_TLP_MASK (1 << I2S_CKR_TLP_SHIFT) 115*4882a593Smuzhiyun #define I2S_CKR_MDIV_SHIFT 16 116*4882a593Smuzhiyun #define I2S_CKR_MDIV(x) (((x) - 1) << I2S_CKR_MDIV_SHIFT) 117*4882a593Smuzhiyun #define I2S_CKR_MDIV_MASK (0xff << I2S_CKR_MDIV_SHIFT) 118*4882a593Smuzhiyun #define I2S_CKR_RSD_SHIFT 8 119*4882a593Smuzhiyun #define I2S_CKR_RSD(x) (((x) - 1) << I2S_CKR_RSD_SHIFT) 120*4882a593Smuzhiyun #define I2S_CKR_RSD_MASK (0xff << I2S_CKR_RSD_SHIFT) 121*4882a593Smuzhiyun #define I2S_CKR_TSD_SHIFT 0 122*4882a593Smuzhiyun #define I2S_CKR_TSD(x) (((x) - 1) << I2S_CKR_TSD_SHIFT) 123*4882a593Smuzhiyun #define I2S_CKR_TSD_MASK (0xff << I2S_CKR_TSD_SHIFT) 124*4882a593Smuzhiyun 125*4882a593Smuzhiyun /* 126*4882a593Smuzhiyun * FIFOLR 127*4882a593Smuzhiyun * FIFO level register 128*4882a593Smuzhiyun */ 129*4882a593Smuzhiyun #define I2S_FIFOLR_RFL_SHIFT 24 130*4882a593Smuzhiyun #define I2S_FIFOLR_RFL_MASK (0x3f << I2S_FIFOLR_RFL_SHIFT) 131*4882a593Smuzhiyun #define I2S_FIFOLR_TFL3_SHIFT 18 132*4882a593Smuzhiyun #define I2S_FIFOLR_TFL3_MASK (0x3f << I2S_FIFOLR_TFL3_SHIFT) 133*4882a593Smuzhiyun #define I2S_FIFOLR_TFL2_SHIFT 12 134*4882a593Smuzhiyun #define I2S_FIFOLR_TFL2_MASK (0x3f << I2S_FIFOLR_TFL2_SHIFT) 135*4882a593Smuzhiyun #define I2S_FIFOLR_TFL1_SHIFT 6 136*4882a593Smuzhiyun #define I2S_FIFOLR_TFL1_MASK (0x3f << I2S_FIFOLR_TFL1_SHIFT) 137*4882a593Smuzhiyun #define I2S_FIFOLR_TFL0_SHIFT 0 138*4882a593Smuzhiyun #define I2S_FIFOLR_TFL0_MASK (0x3f << I2S_FIFOLR_TFL0_SHIFT) 139*4882a593Smuzhiyun 140*4882a593Smuzhiyun /* 141*4882a593Smuzhiyun * DMACR 142*4882a593Smuzhiyun * DMA control register 143*4882a593Smuzhiyun */ 144*4882a593Smuzhiyun #define I2S_DMACR_RDE_SHIFT 24 145*4882a593Smuzhiyun #define I2S_DMACR_RDE_DISABLE (0 << I2S_DMACR_RDE_SHIFT) 146*4882a593Smuzhiyun #define I2S_DMACR_RDE_ENABLE (1 << I2S_DMACR_RDE_SHIFT) 147*4882a593Smuzhiyun #define I2S_DMACR_RDE_MASK (1 << I2S_DMACR_RDE_SHIFT) 148*4882a593Smuzhiyun #define I2S_DMACR_RDE(x) ((x) << I2S_DMACR_RDE_SHIFT) 149*4882a593Smuzhiyun #define I2S_DMACR_RDL_SHIFT 16 150*4882a593Smuzhiyun #define I2S_DMACR_RDL(x) (((x) - 1) << I2S_DMACR_RDL_SHIFT) 151*4882a593Smuzhiyun #define I2S_DMACR_RDL_MASK (0x1f << I2S_DMACR_RDL_SHIFT) 152*4882a593Smuzhiyun #define I2S_DMACR_TDE_SHIFT 8 153*4882a593Smuzhiyun #define I2S_DMACR_TDE_DISABLE (0 << I2S_DMACR_TDE_SHIFT) 154*4882a593Smuzhiyun #define I2S_DMACR_TDE_ENABLE (1 << I2S_DMACR_TDE_SHIFT) 155*4882a593Smuzhiyun #define I2S_DMACR_TDE_MASK (1 << I2S_DMACR_TDE_SHIFT) 156*4882a593Smuzhiyun #define I2S_DMACR_TDE(x) ((x) << I2S_DMACR_TDE_SHIFT) 157*4882a593Smuzhiyun #define I2S_DMACR_TDL_SHIFT 0 158*4882a593Smuzhiyun #define I2S_DMACR_TDL(x) ((x) << I2S_DMACR_TDL_SHIFT) 159*4882a593Smuzhiyun #define I2S_DMACR_TDL_MASK (0x1f << I2S_DMACR_TDL_SHIFT) 160*4882a593Smuzhiyun 161*4882a593Smuzhiyun /* 162*4882a593Smuzhiyun * INTCR 163*4882a593Smuzhiyun * interrupt control register 164*4882a593Smuzhiyun */ 165*4882a593Smuzhiyun #define I2S_INTCR_RFT_SHIFT 20 166*4882a593Smuzhiyun #define I2S_INTCR_RFT(x) (((x) - 1) << I2S_INTCR_RFT_SHIFT) 167*4882a593Smuzhiyun #define I2S_INTCR_RXOIC BIT(18) 168*4882a593Smuzhiyun #define I2S_INTCR_RXOIE_SHIFT 17 169*4882a593Smuzhiyun #define I2S_INTCR_RXOIE_MASK (1 << I2S_INTCR_RXOIE_SHIFT) 170*4882a593Smuzhiyun #define I2S_INTCR_RXOIE(x) ((x) << I2S_INTCR_RXOIE_SHIFT) 171*4882a593Smuzhiyun #define I2S_INTCR_RXFIE_SHIFT 16 172*4882a593Smuzhiyun #define I2S_INTCR_RXFIE_DISABLE (0 << I2S_INTCR_RXFIE_SHIFT) 173*4882a593Smuzhiyun #define I2S_INTCR_RXFIE_ENABLE (1 << I2S_INTCR_RXFIE_SHIFT) 174*4882a593Smuzhiyun #define I2S_INTCR_TFT_SHIFT 4 175*4882a593Smuzhiyun #define I2S_INTCR_TFT(x) (((x) - 1) << I2S_INTCR_TFT_SHIFT) 176*4882a593Smuzhiyun #define I2S_INTCR_TFT_MASK (0x1f << I2S_INTCR_TFT_SHIFT) 177*4882a593Smuzhiyun #define I2S_INTCR_TXUIC BIT(2) 178*4882a593Smuzhiyun #define I2S_INTCR_TXUIE_SHIFT 1 179*4882a593Smuzhiyun #define I2S_INTCR_TXUIE_MASK (1 << I2S_INTCR_TXUIE_SHIFT) 180*4882a593Smuzhiyun #define I2S_INTCR_TXUIE(x) ((x) << I2S_INTCR_TXUIE_SHIFT) 181*4882a593Smuzhiyun 182*4882a593Smuzhiyun /* 183*4882a593Smuzhiyun * INTSR 184*4882a593Smuzhiyun * interrupt status register 185*4882a593Smuzhiyun */ 186*4882a593Smuzhiyun #define I2S_INTSR_TXEIE_SHIFT 0 187*4882a593Smuzhiyun #define I2S_INTSR_TXEIE_DISABLE (0 << I2S_INTSR_TXEIE_SHIFT) 188*4882a593Smuzhiyun #define I2S_INTSR_TXEIE_ENABLE (1 << I2S_INTSR_TXEIE_SHIFT) 189*4882a593Smuzhiyun #define I2S_INTSR_RXOI_SHIFT 17 190*4882a593Smuzhiyun #define I2S_INTSR_RXOI_INA (0 << I2S_INTSR_RXOI_SHIFT) 191*4882a593Smuzhiyun #define I2S_INTSR_RXOI_ACT (1 << I2S_INTSR_RXOI_SHIFT) 192*4882a593Smuzhiyun #define I2S_INTSR_RXFI_SHIFT 16 193*4882a593Smuzhiyun #define I2S_INTSR_RXFI_INA (0 << I2S_INTSR_RXFI_SHIFT) 194*4882a593Smuzhiyun #define I2S_INTSR_RXFI_ACT (1 << I2S_INTSR_RXFI_SHIFT) 195*4882a593Smuzhiyun #define I2S_INTSR_TXUI_SHIFT 1 196*4882a593Smuzhiyun #define I2S_INTSR_TXUI_INA (0 << I2S_INTSR_TXUI_SHIFT) 197*4882a593Smuzhiyun #define I2S_INTSR_TXUI_ACT (1 << I2S_INTSR_TXUI_SHIFT) 198*4882a593Smuzhiyun #define I2S_INTSR_TXEI_SHIFT 0 199*4882a593Smuzhiyun #define I2S_INTSR_TXEI_INA (0 << I2S_INTSR_TXEI_SHIFT) 200*4882a593Smuzhiyun #define I2S_INTSR_TXEI_ACT (1 << I2S_INTSR_TXEI_SHIFT) 201*4882a593Smuzhiyun 202*4882a593Smuzhiyun /* 203*4882a593Smuzhiyun * XFER 204*4882a593Smuzhiyun * Transfer start register 205*4882a593Smuzhiyun */ 206*4882a593Smuzhiyun /* 207*4882a593Smuzhiyun * lp mode2 swap: 208*4882a593Smuzhiyun * i2s sdi0_l <- i2s sdo0_l 209*4882a593Smuzhiyun * i2s sdi0_r <- codec sdo_r 210*4882a593Smuzhiyun * 211*4882a593Smuzhiyun * lp mode2: 212*4882a593Smuzhiyun * i2s sdi0_l <- codec sdo_l 213*4882a593Smuzhiyun * i2s sdi0_r <- i2s sdo0_r 214*4882a593Smuzhiyun * 215*4882a593Smuzhiyun * lp mode1: 216*4882a593Smuzhiyun * i2s sdi0_l <- codec sdo_l 217*4882a593Smuzhiyun * i2s sdi0_r <- codec sdo_r 218*4882a593Smuzhiyun * i2s sdi1_l <- i2s sdo0_l 219*4882a593Smuzhiyun * i2s sdi1_r <- i2s sdo0_r 220*4882a593Smuzhiyun * 221*4882a593Smuzhiyun */ 222*4882a593Smuzhiyun #define I2S_XFER_LP_MODE_MASK GENMASK(4, 2) 223*4882a593Smuzhiyun #define I2S_XFER_LP_MODE_2_SWAP (BIT(4) | BIT(3)) 224*4882a593Smuzhiyun #define I2S_XFER_LP_MODE_2 BIT(3) 225*4882a593Smuzhiyun #define I2S_XFER_LP_MODE_1 BIT(2) 226*4882a593Smuzhiyun #define I2S_XFER_LP_MODE_DIS 0 227*4882a593Smuzhiyun #define I2S_XFER_RXS_SHIFT 1 228*4882a593Smuzhiyun #define I2S_XFER_RXS_STOP (0 << I2S_XFER_RXS_SHIFT) 229*4882a593Smuzhiyun #define I2S_XFER_RXS_START (1 << I2S_XFER_RXS_SHIFT) 230*4882a593Smuzhiyun #define I2S_XFER_RXS_MASK (1 << I2S_XFER_RXS_SHIFT) 231*4882a593Smuzhiyun #define I2S_XFER_RXS(x) ((x) << I2S_XFER_RXS_SHIFT) 232*4882a593Smuzhiyun #define I2S_XFER_TXS_SHIFT 0 233*4882a593Smuzhiyun #define I2S_XFER_TXS_STOP (0 << I2S_XFER_TXS_SHIFT) 234*4882a593Smuzhiyun #define I2S_XFER_TXS_START (1 << I2S_XFER_TXS_SHIFT) 235*4882a593Smuzhiyun #define I2S_XFER_TXS_MASK (1 << I2S_XFER_TXS_SHIFT) 236*4882a593Smuzhiyun #define I2S_XFER_TXS(x) ((x) << I2S_XFER_TXS_SHIFT) 237*4882a593Smuzhiyun 238*4882a593Smuzhiyun /* 239*4882a593Smuzhiyun * CLR 240*4882a593Smuzhiyun * clear SCLK domain logic register 241*4882a593Smuzhiyun */ 242*4882a593Smuzhiyun #define I2S_CLR_RXC BIT(1) 243*4882a593Smuzhiyun #define I2S_CLR_TXC BIT(0) 244*4882a593Smuzhiyun 245*4882a593Smuzhiyun /* 246*4882a593Smuzhiyun * TXDR 247*4882a593Smuzhiyun * Transimt FIFO data register, write only. 248*4882a593Smuzhiyun */ 249*4882a593Smuzhiyun #define I2S_TXDR_MASK (0xff) 250*4882a593Smuzhiyun 251*4882a593Smuzhiyun /* 252*4882a593Smuzhiyun * RXDR 253*4882a593Smuzhiyun * Receive FIFO data register, write only. 254*4882a593Smuzhiyun */ 255*4882a593Smuzhiyun #define I2S_RXDR_MASK (0xff) 256*4882a593Smuzhiyun 257*4882a593Smuzhiyun /* 258*4882a593Smuzhiyun * TDM_CTRL 259*4882a593Smuzhiyun * TDM ctrl register 260*4882a593Smuzhiyun */ 261*4882a593Smuzhiyun #define TDM_FSYNC_WIDTH_SEL1_MSK GENMASK(20, 18) 262*4882a593Smuzhiyun #define TDM_FSYNC_WIDTH_SEL1(x) (((x) - 1) << 18) 263*4882a593Smuzhiyun #define TDM_FSYNC_WIDTH_SEL0_MSK BIT(17) 264*4882a593Smuzhiyun #define TDM_FSYNC_WIDTH_HALF_FRAME 0 265*4882a593Smuzhiyun #define TDM_FSYNC_WIDTH_ONE_FRAME BIT(17) 266*4882a593Smuzhiyun #define TDM_SHIFT_CTRL_MSK GENMASK(16, 14) 267*4882a593Smuzhiyun #define TDM_SHIFT_CTRL(x) ((x) << 14) 268*4882a593Smuzhiyun #define TDM_SLOT_BIT_WIDTH_MSK GENMASK(13, 9) 269*4882a593Smuzhiyun #define TDM_SLOT_BIT_WIDTH(x) (((x) - 1) << 9) 270*4882a593Smuzhiyun #define TDM_FRAME_WIDTH_MSK GENMASK(8, 0) 271*4882a593Smuzhiyun #define TDM_FRAME_WIDTH(x) (((x) - 1) << 0) 272*4882a593Smuzhiyun 273*4882a593Smuzhiyun /* 274*4882a593Smuzhiyun * CLKDIV 275*4882a593Smuzhiyun * Mclk div register 276*4882a593Smuzhiyun */ 277*4882a593Smuzhiyun #define I2S_CLKDIV_TXM_SHIFT 0 278*4882a593Smuzhiyun #define I2S_CLKDIV_TXM(x) (((x) - 1) << I2S_CLKDIV_TXM_SHIFT) 279*4882a593Smuzhiyun #define I2S_CLKDIV_TXM_MASK (0xff << I2S_CLKDIV_TXM_SHIFT) 280*4882a593Smuzhiyun #define I2S_CLKDIV_RXM_SHIFT 8 281*4882a593Smuzhiyun #define I2S_CLKDIV_RXM(x) (((x) - 1) << I2S_CLKDIV_RXM_SHIFT) 282*4882a593Smuzhiyun #define I2S_CLKDIV_RXM_MASK (0xff << I2S_CLKDIV_RXM_SHIFT) 283*4882a593Smuzhiyun 284*4882a593Smuzhiyun /* Clock divider id */ 285*4882a593Smuzhiyun enum { 286*4882a593Smuzhiyun ROCKCHIP_DIV_MCLK = 0, 287*4882a593Smuzhiyun ROCKCHIP_DIV_BCLK, 288*4882a593Smuzhiyun }; 289*4882a593Smuzhiyun 290*4882a593Smuzhiyun /* channel select */ 291*4882a593Smuzhiyun #define I2S_CSR_SHIFT 15 292*4882a593Smuzhiyun #define I2S_CHN_2 (0 << I2S_CSR_SHIFT) 293*4882a593Smuzhiyun #define I2S_CHN_4 (1 << I2S_CSR_SHIFT) 294*4882a593Smuzhiyun #define I2S_CHN_6 (2 << I2S_CSR_SHIFT) 295*4882a593Smuzhiyun #define I2S_CHN_8 (3 << I2S_CSR_SHIFT) 296*4882a593Smuzhiyun 297*4882a593Smuzhiyun /* io direction cfg register */ 298*4882a593Smuzhiyun #define I2S_IO_DIRECTION_MASK (7) 299*4882a593Smuzhiyun #define I2S_IO_8CH_OUT_2CH_IN (7) 300*4882a593Smuzhiyun #define I2S_IO_6CH_OUT_4CH_IN (3) 301*4882a593Smuzhiyun #define I2S_IO_4CH_OUT_6CH_IN (1) 302*4882a593Smuzhiyun #define I2S_IO_2CH_OUT_8CH_IN (0) 303*4882a593Smuzhiyun 304*4882a593Smuzhiyun /* I2S REGS */ 305*4882a593Smuzhiyun #define I2S_TXCR (0x0000) 306*4882a593Smuzhiyun #define I2S_RXCR (0x0004) 307*4882a593Smuzhiyun #define I2S_CKR (0x0008) 308*4882a593Smuzhiyun #define I2S_TXFIFOLR (0x000c) 309*4882a593Smuzhiyun #define I2S_DMACR (0x0010) 310*4882a593Smuzhiyun #define I2S_INTCR (0x0014) 311*4882a593Smuzhiyun #define I2S_INTSR (0x0018) 312*4882a593Smuzhiyun #define I2S_XFER (0x001c) 313*4882a593Smuzhiyun #define I2S_CLR (0x0020) 314*4882a593Smuzhiyun #define I2S_TXDR (0x0024) 315*4882a593Smuzhiyun #define I2S_RXDR (0x0028) 316*4882a593Smuzhiyun #define I2S_RXFIFOLR (0x002c) 317*4882a593Smuzhiyun #define I2S_TDM_TXCR (0x0030) 318*4882a593Smuzhiyun #define I2S_TDM_RXCR (0x0034) 319*4882a593Smuzhiyun #define I2S_CLKDIV (0x0038) 320*4882a593Smuzhiyun 321*4882a593Smuzhiyun #define HIWORD_UPDATE(v, h, l) (((v) << (l)) | (GENMASK((h), (l)) << 16)) 322*4882a593Smuzhiyun 323*4882a593Smuzhiyun /* PX30 GRF CONFIGS*/ 324*4882a593Smuzhiyun #define PX30_I2S0_CLK_IN_SRC_FROM_TX HIWORD_UPDATE(1, 13, 12) 325*4882a593Smuzhiyun #define PX30_I2S0_CLK_IN_SRC_FROM_RX HIWORD_UPDATE(2, 13, 12) 326*4882a593Smuzhiyun #define PX30_I2S0_MCLK_OUT_SRC_FROM_TX HIWORD_UPDATE(1, 5, 5) 327*4882a593Smuzhiyun #define PX30_I2S0_MCLK_OUT_SRC_FROM_RX HIWORD_UPDATE(0, 5, 5) 328*4882a593Smuzhiyun 329*4882a593Smuzhiyun #define PX30_I2S0_CLK_TXONLY \ 330*4882a593Smuzhiyun (PX30_I2S0_MCLK_OUT_SRC_FROM_TX | PX30_I2S0_CLK_IN_SRC_FROM_TX) 331*4882a593Smuzhiyun 332*4882a593Smuzhiyun #define PX30_I2S0_CLK_RXONLY \ 333*4882a593Smuzhiyun (PX30_I2S0_MCLK_OUT_SRC_FROM_RX | PX30_I2S0_CLK_IN_SRC_FROM_RX) 334*4882a593Smuzhiyun 335*4882a593Smuzhiyun /* RK1808 GRF CONFIGS*/ 336*4882a593Smuzhiyun #define RK1808_I2S0_MCLK_OUT_SRC_FROM_RX HIWORD_UPDATE(1, 2, 2) 337*4882a593Smuzhiyun #define RK1808_I2S0_MCLK_OUT_SRC_FROM_TX HIWORD_UPDATE(0, 2, 2) 338*4882a593Smuzhiyun #define RK1808_I2S0_CLK_IN_SRC_FROM_TX HIWORD_UPDATE(1, 1, 0) 339*4882a593Smuzhiyun #define RK1808_I2S0_CLK_IN_SRC_FROM_RX HIWORD_UPDATE(2, 1, 0) 340*4882a593Smuzhiyun 341*4882a593Smuzhiyun #define RK1808_I2S0_CLK_TXONLY \ 342*4882a593Smuzhiyun (RK1808_I2S0_MCLK_OUT_SRC_FROM_TX | RK1808_I2S0_CLK_IN_SRC_FROM_TX) 343*4882a593Smuzhiyun 344*4882a593Smuzhiyun #define RK1808_I2S0_CLK_RXONLY \ 345*4882a593Smuzhiyun (RK1808_I2S0_MCLK_OUT_SRC_FROM_RX | RK1808_I2S0_CLK_IN_SRC_FROM_RX) 346*4882a593Smuzhiyun 347*4882a593Smuzhiyun /* RK3308 GRF CONFIGS*/ 348*4882a593Smuzhiyun #define RK3308_I2S0_8CH_MCLK_OUT_SRC_FROM_RX HIWORD_UPDATE(1, 10, 10) 349*4882a593Smuzhiyun #define RK3308_I2S0_8CH_MCLK_OUT_SRC_FROM_TX HIWORD_UPDATE(0, 10, 10) 350*4882a593Smuzhiyun #define RK3308_I2S0_8CH_CLK_IN_RX_SRC_FROM_TX HIWORD_UPDATE(1, 9, 9) 351*4882a593Smuzhiyun #define RK3308_I2S0_8CH_CLK_IN_RX_SRC_FROM_RX HIWORD_UPDATE(0, 9, 9) 352*4882a593Smuzhiyun #define RK3308_I2S0_8CH_CLK_IN_TX_SRC_FROM_RX HIWORD_UPDATE(1, 8, 8) 353*4882a593Smuzhiyun #define RK3308_I2S0_8CH_CLK_IN_TX_SRC_FROM_TX HIWORD_UPDATE(0, 8, 8) 354*4882a593Smuzhiyun #define RK3308_I2S1_8CH_MCLK_OUT_SRC_FROM_RX HIWORD_UPDATE(1, 2, 2) 355*4882a593Smuzhiyun #define RK3308_I2S1_8CH_MCLK_OUT_SRC_FROM_TX HIWORD_UPDATE(0, 2, 2) 356*4882a593Smuzhiyun #define RK3308_I2S1_8CH_CLK_IN_RX_SRC_FROM_TX HIWORD_UPDATE(1, 1, 1) 357*4882a593Smuzhiyun #define RK3308_I2S1_8CH_CLK_IN_RX_SRC_FROM_RX HIWORD_UPDATE(0, 1, 1) 358*4882a593Smuzhiyun #define RK3308_I2S1_8CH_CLK_IN_TX_SRC_FROM_RX HIWORD_UPDATE(1, 0, 0) 359*4882a593Smuzhiyun #define RK3308_I2S1_8CH_CLK_IN_TX_SRC_FROM_TX HIWORD_UPDATE(0, 0, 0) 360*4882a593Smuzhiyun 361*4882a593Smuzhiyun #define RK3308_I2S0_CLK_TXONLY \ 362*4882a593Smuzhiyun (RK3308_I2S0_8CH_MCLK_OUT_SRC_FROM_TX | \ 363*4882a593Smuzhiyun RK3308_I2S0_8CH_CLK_IN_RX_SRC_FROM_TX | \ 364*4882a593Smuzhiyun RK3308_I2S0_8CH_CLK_IN_TX_SRC_FROM_TX) 365*4882a593Smuzhiyun 366*4882a593Smuzhiyun #define RK3308_I2S0_CLK_RXONLY \ 367*4882a593Smuzhiyun (RK3308_I2S0_8CH_MCLK_OUT_SRC_FROM_RX | \ 368*4882a593Smuzhiyun RK3308_I2S0_8CH_CLK_IN_RX_SRC_FROM_RX | \ 369*4882a593Smuzhiyun RK3308_I2S0_8CH_CLK_IN_TX_SRC_FROM_RX) 370*4882a593Smuzhiyun 371*4882a593Smuzhiyun #define RK3308_I2S1_CLK_TXONLY \ 372*4882a593Smuzhiyun (RK3308_I2S1_8CH_MCLK_OUT_SRC_FROM_TX | \ 373*4882a593Smuzhiyun RK3308_I2S1_8CH_CLK_IN_RX_SRC_FROM_TX | \ 374*4882a593Smuzhiyun RK3308_I2S1_8CH_CLK_IN_TX_SRC_FROM_TX) 375*4882a593Smuzhiyun 376*4882a593Smuzhiyun #define RK3308_I2S1_CLK_RXONLY \ 377*4882a593Smuzhiyun (RK3308_I2S1_8CH_MCLK_OUT_SRC_FROM_RX | \ 378*4882a593Smuzhiyun RK3308_I2S1_8CH_CLK_IN_RX_SRC_FROM_RX | \ 379*4882a593Smuzhiyun RK3308_I2S1_8CH_CLK_IN_TX_SRC_FROM_RX) 380*4882a593Smuzhiyun 381*4882a593Smuzhiyun /* RK3568 GRF CONFIGS*/ 382*4882a593Smuzhiyun #define RK3568_I2S1_MCLK_OUT_SRC_FROM_TX HIWORD_UPDATE(1, 5, 5) 383*4882a593Smuzhiyun #define RK3568_I2S1_MCLK_OUT_SRC_FROM_RX HIWORD_UPDATE(0, 5, 5) 384*4882a593Smuzhiyun 385*4882a593Smuzhiyun #define RK3568_I2S1_CLK_TXONLY \ 386*4882a593Smuzhiyun RK3568_I2S1_MCLK_OUT_SRC_FROM_TX 387*4882a593Smuzhiyun 388*4882a593Smuzhiyun #define RK3568_I2S1_CLK_RXONLY \ 389*4882a593Smuzhiyun RK3568_I2S1_MCLK_OUT_SRC_FROM_RX 390*4882a593Smuzhiyun 391*4882a593Smuzhiyun #define RK3568_I2S3_MCLK_OUT_SRC_FROM_TX HIWORD_UPDATE(1, 15, 15) 392*4882a593Smuzhiyun #define RK3568_I2S3_MCLK_OUT_SRC_FROM_RX HIWORD_UPDATE(0, 15, 15) 393*4882a593Smuzhiyun #define RK3568_I2S3_SCLK_SRC_FROM_TX HIWORD_UPDATE(1, 7, 7) 394*4882a593Smuzhiyun #define RK3568_I2S3_SCLK_SRC_FROM_RX HIWORD_UPDATE(0, 7, 7) 395*4882a593Smuzhiyun #define RK3568_I2S3_LRCK_SRC_FROM_TX HIWORD_UPDATE(1, 6, 6) 396*4882a593Smuzhiyun #define RK3568_I2S3_LRCK_SRC_FROM_RX HIWORD_UPDATE(0, 6, 6) 397*4882a593Smuzhiyun 398*4882a593Smuzhiyun #define RK3568_I2S3_MCLK_TXONLY \ 399*4882a593Smuzhiyun RK3568_I2S3_MCLK_OUT_SRC_FROM_TX 400*4882a593Smuzhiyun 401*4882a593Smuzhiyun #define RK3568_I2S3_CLK_TXONLY \ 402*4882a593Smuzhiyun (RK3568_I2S3_SCLK_SRC_FROM_TX | \ 403*4882a593Smuzhiyun RK3568_I2S3_LRCK_SRC_FROM_TX) 404*4882a593Smuzhiyun 405*4882a593Smuzhiyun #define RK3568_I2S3_MCLK_RXONLY \ 406*4882a593Smuzhiyun RK3568_I2S3_MCLK_OUT_SRC_FROM_RX 407*4882a593Smuzhiyun 408*4882a593Smuzhiyun #define RK3568_I2S3_CLK_RXONLY \ 409*4882a593Smuzhiyun (RK3568_I2S3_SCLK_SRC_FROM_RX | \ 410*4882a593Smuzhiyun RK3568_I2S3_LRCK_SRC_FROM_RX) 411*4882a593Smuzhiyun 412*4882a593Smuzhiyun /* RV1126 GRF CONFIGS*/ 413*4882a593Smuzhiyun #define RV1126_I2S0_MCLK_OUT_SRC_FROM_TX HIWORD_UPDATE(0, 9, 9) 414*4882a593Smuzhiyun #define RV1126_I2S0_MCLK_OUT_SRC_FROM_RX HIWORD_UPDATE(1, 9, 9) 415*4882a593Smuzhiyun 416*4882a593Smuzhiyun #define RV1126_I2S0_CLK_TXONLY \ 417*4882a593Smuzhiyun RV1126_I2S0_MCLK_OUT_SRC_FROM_TX 418*4882a593Smuzhiyun 419*4882a593Smuzhiyun #define RV1126_I2S0_CLK_RXONLY \ 420*4882a593Smuzhiyun RV1126_I2S0_MCLK_OUT_SRC_FROM_RX 421*4882a593Smuzhiyun 422*4882a593Smuzhiyun #endif /* _ROCKCHIP_I2S_TDM_H */ 423