Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 /*
0003  * Copyright (C) 2019 NXP
0004  */
0005 
0006 #ifndef _FSL_EASRC_H
0007 #define _FSL_EASRC_H
0008 
0009 #include <sound/asound.h>
0010 #include <linux/dma/imx-dma.h>
0011 
0012 #include "fsl_asrc_common.h"
0013 
0014 /* EASRC Register Map */
0015 
0016 /* ASRC Input Write FIFO */
0017 #define REG_EASRC_WRFIFO(ctx)       (0x000 + 4 * (ctx))
0018 /* ASRC Output Read FIFO */
0019 #define REG_EASRC_RDFIFO(ctx)       (0x010 + 4 * (ctx))
0020 /* ASRC Context Control */
0021 #define REG_EASRC_CC(ctx)       (0x020 + 4 * (ctx))
0022 /* ASRC Context Control Extended 1 */
0023 #define REG_EASRC_CCE1(ctx)     (0x030 + 4 * (ctx))
0024 /* ASRC Context Control Extended 2 */
0025 #define REG_EASRC_CCE2(ctx)     (0x040 + 4 * (ctx))
0026 /* ASRC Control Input Access */
0027 #define REG_EASRC_CIA(ctx)      (0x050 + 4 * (ctx))
0028 /* ASRC Datapath Processor Control Slot0 */
0029 #define REG_EASRC_DPCS0R0(ctx)      (0x060 + 4 * (ctx))
0030 #define REG_EASRC_DPCS0R1(ctx)      (0x070 + 4 * (ctx))
0031 #define REG_EASRC_DPCS0R2(ctx)      (0x080 + 4 * (ctx))
0032 #define REG_EASRC_DPCS0R3(ctx)      (0x090 + 4 * (ctx))
0033 /* ASRC Datapath Processor Control Slot1 */
0034 #define REG_EASRC_DPCS1R0(ctx)      (0x0A0 + 4 * (ctx))
0035 #define REG_EASRC_DPCS1R1(ctx)      (0x0B0 + 4 * (ctx))
0036 #define REG_EASRC_DPCS1R2(ctx)      (0x0C0 + 4 * (ctx))
0037 #define REG_EASRC_DPCS1R3(ctx)      (0x0D0 + 4 * (ctx))
0038 /* ASRC Context Output Control */
0039 #define REG_EASRC_COC(ctx)      (0x0E0 + 4 * (ctx))
0040 /* ASRC Control Output Access */
0041 #define REG_EASRC_COA(ctx)      (0x0F0 + 4 * (ctx))
0042 /* ASRC Sample FIFO Status */
0043 #define REG_EASRC_SFS(ctx)      (0x100 + 4 * (ctx))
0044 /* ASRC Resampling Ratio Low */
0045 #define REG_EASRC_RRL(ctx)      (0x110 + 8 * (ctx))
0046 /* ASRC Resampling Ratio High */
0047 #define REG_EASRC_RRH(ctx)      (0x114 + 8 * (ctx))
0048 /* ASRC Resampling Ratio Update Control */
0049 #define REG_EASRC_RUC(ctx)      (0x130 + 4 * (ctx))
0050 /* ASRC Resampling Ratio Update Rate */
0051 #define REG_EASRC_RUR(ctx)      (0x140 + 4 * (ctx))
0052 /* ASRC Resampling Center Tap Coefficient Low */
0053 #define REG_EASRC_RCTCL         (0x150)
0054 /* ASRC Resampling Center Tap Coefficient High */
0055 #define REG_EASRC_RCTCH         (0x154)
0056 /* ASRC Prefilter Coefficient FIFO */
0057 #define REG_EASRC_PCF(ctx)      (0x160 + 4 * (ctx))
0058 /* ASRC Context Resampling Coefficient Memory */
0059 #define REG_EASRC_CRCM          0x170
0060 /* ASRC Context Resampling Coefficient Control*/
0061 #define REG_EASRC_CRCC          0x174
0062 /* ASRC Interrupt Control */
0063 #define REG_EASRC_IRQC          0x178
0064 /* ASRC Interrupt Status Flags */
0065 #define REG_EASRC_IRQF          0x17C
0066 /* ASRC Channel Status 0 */
0067 #define REG_EASRC_CS0(ctx)      (0x180 + 4 * (ctx))
0068 /* ASRC Channel Status 1 */
0069 #define REG_EASRC_CS1(ctx)      (0x190 + 4 * (ctx))
0070 /* ASRC Channel Status 2 */
0071 #define REG_EASRC_CS2(ctx)      (0x1A0 + 4 * (ctx))
0072 /* ASRC Channel Status 3 */
0073 #define REG_EASRC_CS3(ctx)      (0x1B0 + 4 * (ctx))
0074 /* ASRC Channel Status 4 */
0075 #define REG_EASRC_CS4(ctx)      (0x1C0 + 4 * (ctx))
0076 /* ASRC Channel Status 5 */
0077 #define REG_EASRC_CS5(ctx)      (0x1D0 + 4 * (ctx))
0078 /* ASRC Debug Control Register */
0079 #define REG_EASRC_DBGC          0x1E0
0080 /* ASRC Debug Status Register */
0081 #define REG_EASRC_DBGS          0x1E4
0082 
0083 #define REG_EASRC_FIFO(x, ctx)      (x == IN ? REG_EASRC_WRFIFO(ctx) \
0084                         : REG_EASRC_RDFIFO(ctx))
0085 
0086 /* ASRC Context Control (CC) */
0087 #define EASRC_CC_EN_SHIFT       31
0088 #define EASRC_CC_EN_MASK        BIT(EASRC_CC_EN_SHIFT)
0089 #define EASRC_CC_EN         BIT(EASRC_CC_EN_SHIFT)
0090 #define EASRC_CC_STOP_SHIFT     29
0091 #define EASRC_CC_STOP_MASK      BIT(EASRC_CC_STOP_SHIFT)
0092 #define EASRC_CC_STOP           BIT(EASRC_CC_STOP_SHIFT)
0093 #define EASRC_CC_FWMDE_SHIFT        28
0094 #define EASRC_CC_FWMDE_MASK     BIT(EASRC_CC_FWMDE_SHIFT)
0095 #define EASRC_CC_FWMDE          BIT(EASRC_CC_FWMDE_SHIFT)
0096 #define EASRC_CC_FIFO_WTMK_SHIFT    16
0097 #define EASRC_CC_FIFO_WTMK_WIDTH    7
0098 #define EASRC_CC_FIFO_WTMK_MASK     ((BIT(EASRC_CC_FIFO_WTMK_WIDTH) - 1) \
0099                      << EASRC_CC_FIFO_WTMK_SHIFT)
0100 #define EASRC_CC_FIFO_WTMK(v)       (((v) << EASRC_CC_FIFO_WTMK_SHIFT) \
0101                      & EASRC_CC_FIFO_WTMK_MASK)
0102 #define EASRC_CC_SAMPLE_POS_SHIFT   11
0103 #define EASRC_CC_SAMPLE_POS_WIDTH   5
0104 #define EASRC_CC_SAMPLE_POS_MASK    ((BIT(EASRC_CC_SAMPLE_POS_WIDTH) - 1) \
0105                      << EASRC_CC_SAMPLE_POS_SHIFT)
0106 #define EASRC_CC_SAMPLE_POS(v)      (((v) << EASRC_CC_SAMPLE_POS_SHIFT) \
0107                      & EASRC_CC_SAMPLE_POS_MASK)
0108 #define EASRC_CC_ENDIANNESS_SHIFT   10
0109 #define EASRC_CC_ENDIANNESS_MASK    BIT(EASRC_CC_ENDIANNESS_SHIFT)
0110 #define EASRC_CC_ENDIANNESS     BIT(EASRC_CC_ENDIANNESS_SHIFT)
0111 #define EASRC_CC_BPS_SHIFT      8
0112 #define EASRC_CC_BPS_WIDTH      2
0113 #define EASRC_CC_BPS_MASK       ((BIT(EASRC_CC_BPS_WIDTH) - 1) \
0114                      << EASRC_CC_BPS_SHIFT)
0115 #define EASRC_CC_BPS(v)         (((v) << EASRC_CC_BPS_SHIFT) \
0116                      & EASRC_CC_BPS_MASK)
0117 #define EASRC_CC_FMT_SHIFT      7
0118 #define EASRC_CC_FMT_MASK       BIT(EASRC_CC_FMT_SHIFT)
0119 #define EASRC_CC_FMT            BIT(EASRC_CC_FMT_SHIFT)
0120 #define EASRC_CC_INSIGN_SHIFT       6
0121 #define EASRC_CC_INSIGN_MASK        BIT(EASRC_CC_INSIGN_SHIFT)
0122 #define EASRC_CC_INSIGN         BIT(EASRC_CC_INSIGN_SHIFT)
0123 #define EASRC_CC_CHEN_SHIFT     0
0124 #define EASRC_CC_CHEN_WIDTH     5
0125 #define EASRC_CC_CHEN_MASK      ((BIT(EASRC_CC_CHEN_WIDTH) - 1) \
0126                      << EASRC_CC_CHEN_SHIFT)
0127 #define EASRC_CC_CHEN(v)        (((v) << EASRC_CC_CHEN_SHIFT) \
0128                      & EASRC_CC_CHEN_MASK)
0129 
0130 /* ASRC Context Control Extended 1 (CCE1) */
0131 #define EASRC_CCE1_COEF_WS_SHIFT    25
0132 #define EASRC_CCE1_COEF_WS_MASK     BIT(EASRC_CCE1_COEF_WS_SHIFT)
0133 #define EASRC_CCE1_COEF_WS      BIT(EASRC_CCE1_COEF_WS_SHIFT)
0134 #define EASRC_CCE1_COEF_MEM_RST_SHIFT   24
0135 #define EASRC_CCE1_COEF_MEM_RST_MASK    BIT(EASRC_CCE1_COEF_MEM_RST_SHIFT)
0136 #define EASRC_CCE1_COEF_MEM_RST     BIT(EASRC_CCE1_COEF_MEM_RST_SHIFT)
0137 #define EASRC_CCE1_PF_EXP_SHIFT     16
0138 #define EASRC_CCE1_PF_EXP_WIDTH     8
0139 #define EASRC_CCE1_PF_EXP_MASK      ((BIT(EASRC_CCE1_PF_EXP_WIDTH) - 1) \
0140                      << EASRC_CCE1_PF_EXP_SHIFT)
0141 #define EASRC_CCE1_PF_EXP(v)        (((v) << EASRC_CCE1_PF_EXP_SHIFT) \
0142                      & EASRC_CCE1_PF_EXP_MASK)
0143 #define EASRC_CCE1_PF_ST1_WBFP_SHIFT    9
0144 #define EASRC_CCE1_PF_ST1_WBFP_MASK BIT(EASRC_CCE1_PF_ST1_WBFP_SHIFT)
0145 #define EASRC_CCE1_PF_ST1_WBFP      BIT(EASRC_CCE1_PF_ST1_WBFP_SHIFT)
0146 #define EASRC_CCE1_PF_TSEN_SHIFT    8
0147 #define EASRC_CCE1_PF_TSEN_MASK     BIT(EASRC_CCE1_PF_TSEN_SHIFT)
0148 #define EASRC_CCE1_PF_TSEN      BIT(EASRC_CCE1_PF_TSEN_SHIFT)
0149 #define EASRC_CCE1_RS_BYPASS_SHIFT  7
0150 #define EASRC_CCE1_RS_BYPASS_MASK   BIT(EASRC_CCE1_RS_BYPASS_SHIFT)
0151 #define EASRC_CCE1_RS_BYPASS        BIT(EASRC_CCE1_RS_BYPASS_SHIFT)
0152 #define EASRC_CCE1_PF_BYPASS_SHIFT  6
0153 #define EASRC_CCE1_PF_BYPASS_MASK   BIT(EASRC_CCE1_PF_BYPASS_SHIFT)
0154 #define EASRC_CCE1_PF_BYPASS        BIT(EASRC_CCE1_PF_BYPASS_SHIFT)
0155 #define EASRC_CCE1_RS_STOP_SHIFT    5
0156 #define EASRC_CCE1_RS_STOP_MASK     BIT(EASRC_CCE1_RS_STOP_SHIFT)
0157 #define EASRC_CCE1_RS_STOP      BIT(EASRC_CCE1_RS_STOP_SHIFT)
0158 #define EASRC_CCE1_PF_STOP_SHIFT    4
0159 #define EASRC_CCE1_PF_STOP_MASK     BIT(EASRC_CCE1_PF_STOP_SHIFT)
0160 #define EASRC_CCE1_PF_STOP      BIT(EASRC_CCE1_PF_STOP_SHIFT)
0161 #define EASRC_CCE1_RS_INIT_SHIFT    2
0162 #define EASRC_CCE1_RS_INIT_WIDTH    2
0163 #define EASRC_CCE1_RS_INIT_MASK     ((BIT(EASRC_CCE1_RS_INIT_WIDTH) - 1) \
0164                      << EASRC_CCE1_RS_INIT_SHIFT)
0165 #define EASRC_CCE1_RS_INIT(v)       (((v) << EASRC_CCE1_RS_INIT_SHIFT) \
0166                      & EASRC_CCE1_RS_INIT_MASK)
0167 #define EASRC_CCE1_PF_INIT_SHIFT    0
0168 #define EASRC_CCE1_PF_INIT_WIDTH    2
0169 #define EASRC_CCE1_PF_INIT_MASK     ((BIT(EASRC_CCE1_PF_INIT_WIDTH) - 1) \
0170                      << EASRC_CCE1_PF_INIT_SHIFT)
0171 #define EASRC_CCE1_PF_INIT(v)       (((v) << EASRC_CCE1_PF_INIT_SHIFT) \
0172                      & EASRC_CCE1_PF_INIT_MASK)
0173 
0174 /* ASRC Context Control Extended 2 (CCE2) */
0175 #define EASRC_CCE2_ST2_TAPS_SHIFT   16
0176 #define EASRC_CCE2_ST2_TAPS_WIDTH   9
0177 #define EASRC_CCE2_ST2_TAPS_MASK    ((BIT(EASRC_CCE2_ST2_TAPS_WIDTH) - 1) \
0178                      << EASRC_CCE2_ST2_TAPS_SHIFT)
0179 #define EASRC_CCE2_ST2_TAPS(v)      (((v) << EASRC_CCE2_ST2_TAPS_SHIFT) \
0180                      & EASRC_CCE2_ST2_TAPS_MASK)
0181 #define EASRC_CCE2_ST1_TAPS_SHIFT   0
0182 #define EASRC_CCE2_ST1_TAPS_WIDTH   9
0183 #define EASRC_CCE2_ST1_TAPS_MASK    ((BIT(EASRC_CCE2_ST1_TAPS_WIDTH) - 1) \
0184                      << EASRC_CCE2_ST1_TAPS_SHIFT)
0185 #define EASRC_CCE2_ST1_TAPS(v)      (((v) << EASRC_CCE2_ST1_TAPS_SHIFT) \
0186                      & EASRC_CCE2_ST1_TAPS_MASK)
0187 
0188 /* ASRC Control Input Access (CIA) */
0189 #define EASRC_CIA_ITER_SHIFT        16
0190 #define EASRC_CIA_ITER_WIDTH        6
0191 #define EASRC_CIA_ITER_MASK     ((BIT(EASRC_CIA_ITER_WIDTH) - 1) \
0192                      << EASRC_CIA_ITER_SHIFT)
0193 #define EASRC_CIA_ITER(v)       (((v) << EASRC_CIA_ITER_SHIFT) \
0194                      & EASRC_CIA_ITER_MASK)
0195 #define EASRC_CIA_GRLEN_SHIFT       8
0196 #define EASRC_CIA_GRLEN_WIDTH       6
0197 #define EASRC_CIA_GRLEN_MASK        ((BIT(EASRC_CIA_GRLEN_WIDTH) - 1) \
0198                      << EASRC_CIA_GRLEN_SHIFT)
0199 #define EASRC_CIA_GRLEN(v)      (((v) << EASRC_CIA_GRLEN_SHIFT) \
0200                      & EASRC_CIA_GRLEN_MASK)
0201 #define EASRC_CIA_ACCLEN_SHIFT      0
0202 #define EASRC_CIA_ACCLEN_WIDTH      6
0203 #define EASRC_CIA_ACCLEN_MASK       ((BIT(EASRC_CIA_ACCLEN_WIDTH) - 1) \
0204                      << EASRC_CIA_ACCLEN_SHIFT)
0205 #define EASRC_CIA_ACCLEN(v)     (((v) << EASRC_CIA_ACCLEN_SHIFT) \
0206                      & EASRC_CIA_ACCLEN_MASK)
0207 
0208 /* ASRC Datapath Processor Control Slot0 Register0 (DPCS0R0) */
0209 #define EASRC_DPCS0R0_MAXCH_SHIFT   24
0210 #define EASRC_DPCS0R0_MAXCH_WIDTH   5
0211 #define EASRC_DPCS0R0_MAXCH_MASK    ((BIT(EASRC_DPCS0R0_MAXCH_WIDTH) - 1) \
0212                      << EASRC_DPCS0R0_MAXCH_SHIFT)
0213 #define EASRC_DPCS0R0_MAXCH(v)      (((v) << EASRC_DPCS0R0_MAXCH_SHIFT) \
0214                      & EASRC_DPCS0R0_MAXCH_MASK)
0215 #define EASRC_DPCS0R0_MINCH_SHIFT   16
0216 #define EASRC_DPCS0R0_MINCH_WIDTH   5
0217 #define EASRC_DPCS0R0_MINCH_MASK    ((BIT(EASRC_DPCS0R0_MINCH_WIDTH) - 1) \
0218                      << EASRC_DPCS0R0_MINCH_SHIFT)
0219 #define EASRC_DPCS0R0_MINCH(v)      (((v) << EASRC_DPCS0R0_MINCH_SHIFT) \
0220                      & EASRC_DPCS0R0_MINCH_MASK)
0221 #define EASRC_DPCS0R0_NUMCH_SHIFT   8
0222 #define EASRC_DPCS0R0_NUMCH_WIDTH   5
0223 #define EASRC_DPCS0R0_NUMCH_MASK    ((BIT(EASRC_DPCS0R0_NUMCH_WIDTH) - 1) \
0224                      << EASRC_DPCS0R0_NUMCH_SHIFT)
0225 #define EASRC_DPCS0R0_NUMCH(v)      (((v) << EASRC_DPCS0R0_NUMCH_SHIFT) \
0226                      & EASRC_DPCS0R0_NUMCH_MASK)
0227 #define EASRC_DPCS0R0_CTXNUM_SHIFT  1
0228 #define EASRC_DPCS0R0_CTXNUM_WIDTH  2
0229 #define EASRC_DPCS0R0_CTXNUM_MASK   ((BIT(EASRC_DPCS0R0_CTXNUM_WIDTH) - 1) \
0230                      << EASRC_DPCS0R0_CTXNUM_SHIFT)
0231 #define EASRC_DPCS0R0_CTXNUM(v)     (((v) << EASRC_DPCS0R0_CTXNUM_SHIFT) \
0232                      & EASRC_DPCS0R0_CTXNUM_MASK)
0233 #define EASRC_DPCS0R0_EN_SHIFT      0
0234 #define EASRC_DPCS0R0_EN_MASK       BIT(EASRC_DPCS0R0_EN_SHIFT)
0235 #define EASRC_DPCS0R0_EN        BIT(EASRC_DPCS0R0_EN_SHIFT)
0236 
0237 /* ASRC Datapath Processor Control Slot0 Register1 (DPCS0R1) */
0238 #define EASRC_DPCS0R1_ST1_EXP_SHIFT 0
0239 #define EASRC_DPCS0R1_ST1_EXP_WIDTH 13
0240 #define EASRC_DPCS0R1_ST1_EXP_MASK  ((BIT(EASRC_DPCS0R1_ST1_EXP_WIDTH) - 1) \
0241                      << EASRC_DPCS0R1_ST1_EXP_SHIFT)
0242 #define EASRC_DPCS0R1_ST1_EXP(v)    (((v) << EASRC_DPCS0R1_ST1_EXP_SHIFT) \
0243                      & EASRC_DPCS0R1_ST1_EXP_MASK)
0244 
0245 /* ASRC Datapath Processor Control Slot0 Register2 (DPCS0R2) */
0246 #define EASRC_DPCS0R2_ST1_MA_SHIFT  16
0247 #define EASRC_DPCS0R2_ST1_MA_WIDTH  13
0248 #define EASRC_DPCS0R2_ST1_MA_MASK   ((BIT(EASRC_DPCS0R2_ST1_MA_WIDTH) - 1) \
0249                      << EASRC_DPCS0R2_ST1_MA_SHIFT)
0250 #define EASRC_DPCS0R2_ST1_MA(v)     (((v) << EASRC_DPCS0R2_ST1_MA_SHIFT) \
0251                      & EASRC_DPCS0R2_ST1_MA_MASK)
0252 #define EASRC_DPCS0R2_ST1_SA_SHIFT  0
0253 #define EASRC_DPCS0R2_ST1_SA_WIDTH  13
0254 #define EASRC_DPCS0R2_ST1_SA_MASK   ((BIT(EASRC_DPCS0R2_ST1_SA_WIDTH) - 1) \
0255                      << EASRC_DPCS0R2_ST1_SA_SHIFT)
0256 #define EASRC_DPCS0R2_ST1_SA(v)     (((v) << EASRC_DPCS0R2_ST1_SA_SHIFT) \
0257                      & EASRC_DPCS0R2_ST1_SA_MASK)
0258 
0259 /* ASRC Datapath Processor Control Slot0 Register3 (DPCS0R3) */
0260 #define EASRC_DPCS0R3_ST2_MA_SHIFT  16
0261 #define EASRC_DPCS0R3_ST2_MA_WIDTH  13
0262 #define EASRC_DPCS0R3_ST2_MA_MASK   ((BIT(EASRC_DPCS0R3_ST2_MA_WIDTH) - 1) \
0263                      << EASRC_DPCS0R3_ST2_MA_SHIFT)
0264 #define EASRC_DPCS0R3_ST2_MA(v)     (((v) << EASRC_DPCS0R3_ST2_MA_SHIFT) \
0265                      & EASRC_DPCS0R3_ST2_MA_MASK)
0266 #define EASRC_DPCS0R3_ST2_SA_SHIFT  0
0267 #define EASRC_DPCS0R3_ST2_SA_WIDTH  13
0268 #define EASRC_DPCS0R3_ST2_SA_MASK   ((BIT(EASRC_DPCS0R3_ST2_SA_WIDTH) - 1) \
0269                      << EASRC_DPCS0R3_ST2_SA_SHIFT)
0270 #define EASRC_DPCS0R3_ST2_SA(v)     (((v) << EASRC_DPCS0R3_ST2_SA_SHIFT) \
0271                          & EASRC_DPCS0R3_ST2_SA_MASK)
0272 
0273 /* ASRC Context Output Control (COC) */
0274 #define EASRC_COC_FWMDE_SHIFT       28
0275 #define EASRC_COC_FWMDE_MASK        BIT(EASRC_COC_FWMDE_SHIFT)
0276 #define EASRC_COC_FWMDE         BIT(EASRC_COC_FWMDE_SHIFT)
0277 #define EASRC_COC_FIFO_WTMK_SHIFT   16
0278 #define EASRC_COC_FIFO_WTMK_WIDTH   7
0279 #define EASRC_COC_FIFO_WTMK_MASK    ((BIT(EASRC_COC_FIFO_WTMK_WIDTH) - 1) \
0280                      << EASRC_COC_FIFO_WTMK_SHIFT)
0281 #define EASRC_COC_FIFO_WTMK(v)      (((v) << EASRC_COC_FIFO_WTMK_SHIFT) \
0282                      & EASRC_COC_FIFO_WTMK_MASK)
0283 #define EASRC_COC_SAMPLE_POS_SHIFT  11
0284 #define EASRC_COC_SAMPLE_POS_WIDTH  5
0285 #define EASRC_COC_SAMPLE_POS_MASK   ((BIT(EASRC_COC_SAMPLE_POS_WIDTH) - 1) \
0286                      << EASRC_COC_SAMPLE_POS_SHIFT)
0287 #define EASRC_COC_SAMPLE_POS(v)     (((v) << EASRC_COC_SAMPLE_POS_SHIFT) \
0288                      & EASRC_COC_SAMPLE_POS_MASK)
0289 #define EASRC_COC_ENDIANNESS_SHIFT  10
0290 #define EASRC_COC_ENDIANNESS_MASK   BIT(EASRC_COC_ENDIANNESS_SHIFT)
0291 #define EASRC_COC_ENDIANNESS        BIT(EASRC_COC_ENDIANNESS_SHIFT)
0292 #define EASRC_COC_BPS_SHIFT     8
0293 #define EASRC_COC_BPS_WIDTH     2
0294 #define EASRC_COC_BPS_MASK      ((BIT(EASRC_COC_BPS_WIDTH) - 1) \
0295                      << EASRC_COC_BPS_SHIFT)
0296 #define EASRC_COC_BPS(v)        (((v) << EASRC_COC_BPS_SHIFT) \
0297                      & EASRC_COC_BPS_MASK)
0298 #define EASRC_COC_FMT_SHIFT     7
0299 #define EASRC_COC_FMT_MASK      BIT(EASRC_COC_FMT_SHIFT)
0300 #define EASRC_COC_FMT           BIT(EASRC_COC_FMT_SHIFT)
0301 #define EASRC_COC_OUTSIGN_SHIFT     6
0302 #define EASRC_COC_OUTSIGN_MASK      BIT(EASRC_COC_OUTSIGN_SHIFT)
0303 #define EASRC_COC_OUTSIGN_OUT       BIT(EASRC_COC_OUTSIGN_SHIFT)
0304 #define EASRC_COC_IEC_VDATA_SHIFT   2
0305 #define EASRC_COC_IEC_VDATA_MASK    BIT(EASRC_COC_IEC_VDATA_SHIFT)
0306 #define EASRC_COC_IEC_VDATA     BIT(EASRC_COC_IEC_VDATA_SHIFT)
0307 #define EASRC_COC_IEC_EN_SHIFT      1
0308 #define EASRC_COC_IEC_EN_MASK       BIT(EASRC_COC_IEC_EN_SHIFT)
0309 #define EASRC_COC_IEC_EN        BIT(EASRC_COC_IEC_EN_SHIFT)
0310 #define EASRC_COC_DITHER_EN_SHIFT   0
0311 #define EASRC_COC_DITHER_EN_MASK    BIT(EASRC_COC_DITHER_EN_SHIFT)
0312 #define EASRC_COC_DITHER_EN     BIT(EASRC_COC_DITHER_EN_SHIFT)
0313 
0314 /* ASRC Control Output Access (COA) */
0315 #define EASRC_COA_ITER_SHIFT        16
0316 #define EASRC_COA_ITER_WIDTH        6
0317 #define EASRC_COA_ITER_MASK     ((BIT(EASRC_COA_ITER_WIDTH) - 1) \
0318                      << EASRC_COA_ITER_SHIFT)
0319 #define EASRC_COA_ITER(v)       (((v) << EASRC_COA_ITER_SHIFT) \
0320                      & EASRC_COA_ITER_MASK)
0321 #define EASRC_COA_GRLEN_SHIFT       8
0322 #define EASRC_COA_GRLEN_WIDTH       6
0323 #define EASRC_COA_GRLEN_MASK        ((BIT(EASRC_COA_GRLEN_WIDTH) - 1) \
0324                      << EASRC_COA_GRLEN_SHIFT)
0325 #define EASRC_COA_GRLEN(v)      (((v) << EASRC_COA_GRLEN_SHIFT) \
0326                      & EASRC_COA_GRLEN_MASK)
0327 #define EASRC_COA_ACCLEN_SHIFT      0
0328 #define EASRC_COA_ACCLEN_WIDTH      6
0329 #define EASRC_COA_ACCLEN_MASK       ((BIT(EASRC_COA_ACCLEN_WIDTH) - 1) \
0330                      << EASRC_COA_ACCLEN_SHIFT)
0331 #define EASRC_COA_ACCLEN(v)     (((v) << EASRC_COA_ACCLEN_SHIFT) \
0332                      & EASRC_COA_ACCLEN_MASK)
0333 
0334 /* ASRC Sample FIFO Status (SFS) */
0335 #define EASRC_SFS_IWTMK_SHIFT       23
0336 #define EASRC_SFS_IWTMK_MASK        BIT(EASRC_SFS_IWTMK_SHIFT)
0337 #define EASRC_SFS_IWTMK         BIT(EASRC_SFS_IWTMK_SHIFT)
0338 #define EASRC_SFS_NSGI_SHIFT        16
0339 #define EASRC_SFS_NSGI_WIDTH        7
0340 #define EASRC_SFS_NSGI_MASK     ((BIT(EASRC_SFS_NSGI_WIDTH) - 1) \
0341                      << EASRC_SFS_NSGI_SHIFT)
0342 #define EASRC_SFS_NSGI(v)       (((v) << EASRC_SFS_NSGI_SHIFT) \
0343                      & EASRC_SFS_NSGI_MASK)
0344 #define EASRC_SFS_OWTMK_SHIFT       7
0345 #define EASRC_SFS_OWTMK_MASK        BIT(EASRC_SFS_OWTMK_SHIFT)
0346 #define EASRC_SFS_OWTMK         BIT(EASRC_SFS_OWTMK_SHIFT)
0347 #define EASRC_SFS_NSGO_SHIFT        0
0348 #define EASRC_SFS_NSGO_WIDTH        7
0349 #define EASRC_SFS_NSGO_MASK     ((BIT(EASRC_SFS_NSGO_WIDTH) - 1) \
0350                      << EASRC_SFS_NSGO_SHIFT)
0351 #define EASRC_SFS_NSGO(v)       (((v) << EASRC_SFS_NSGO_SHIFT) \
0352                      & EASRC_SFS_NSGO_MASK)
0353 
0354 /* ASRC Resampling Ratio Low (RRL) */
0355 #define EASRC_RRL_RS_RL_SHIFT       0
0356 #define EASRC_RRL_RS_RL_WIDTH       32
0357 #define EASRC_RRL_RS_RL(v)      ((v) << EASRC_RRL_RS_RL_SHIFT)
0358 
0359 /* ASRC Resampling Ratio High (RRH) */
0360 #define EASRC_RRH_RS_VLD_SHIFT      31
0361 #define EASRC_RRH_RS_VLD_MASK       BIT(EASRC_RRH_RS_VLD_SHIFT)
0362 #define EASRC_RRH_RS_VLD        BIT(EASRC_RRH_RS_VLD_SHIFT)
0363 #define EASRC_RRH_RS_RH_SHIFT       0
0364 #define EASRC_RRH_RS_RH_WIDTH       12
0365 #define EASRC_RRH_RS_RH_MASK        ((BIT(EASRC_RRH_RS_RH_WIDTH) - 1) \
0366                      << EASRC_RRH_RS_RH_SHIFT)
0367 #define EASRC_RRH_RS_RH(v)      (((v) << EASRC_RRH_RS_RH_SHIFT) \
0368                      & EASRC_RRH_RS_RH_MASK)
0369 
0370 /* ASRC Resampling Ratio Update Control (RSUC) */
0371 #define EASRC_RSUC_RS_RM_SHIFT      0
0372 #define EASRC_RSUC_RS_RM_WIDTH      32
0373 #define EASRC_RSUC_RS_RM(v)     ((v) << EASRC_RSUC_RS_RM_SHIFT)
0374 
0375 /* ASRC Resampling Ratio Update Rate (RRUR) */
0376 #define EASRC_RRUR_RRR_SHIFT        0
0377 #define EASRC_RRUR_RRR_WIDTH        31
0378 #define EASRC_RRUR_RRR_MASK     ((BIT(EASRC_RRUR_RRR_WIDTH) - 1) \
0379                      << EASRC_RRUR_RRR_SHIFT)
0380 #define EASRC_RRUR_RRR(v)       (((v) << EASRC_RRUR_RRR_SHIFT) \
0381                      & EASRC_RRUR_RRR_MASK)
0382 
0383 /* ASRC Resampling Center Tap Coefficient Low (RCTCL) */
0384 #define EASRC_RCTCL_RS_CL_SHIFT     0
0385 #define EASRC_RCTCL_RS_CL_WIDTH     32
0386 #define EASRC_RCTCL_RS_CL(v)        ((v) << EASRC_RCTCL_RS_CL_SHIFT)
0387 
0388 /* ASRC Resampling Center Tap Coefficient High (RCTCH) */
0389 #define EASRC_RCTCH_RS_CH_SHIFT     0
0390 #define EASRC_RCTCH_RS_CH_WIDTH     32
0391 #define EASRC_RCTCH_RS_CH(v)        ((v) << EASRC_RCTCH_RS_CH_SHIFT)
0392 
0393 /* ASRC Prefilter Coefficient FIFO (PCF) */
0394 #define EASRC_PCF_CD_SHIFT      0
0395 #define EASRC_PCF_CD_WIDTH      32
0396 #define EASRC_PCF_CD(v)         ((v) << EASRC_PCF_CD_SHIFT)
0397 
0398 /* ASRC Context Resampling Coefficient Memory (CRCM) */
0399 #define EASRC_CRCM_RS_CWD_SHIFT     0
0400 #define EASRC_CRCM_RS_CWD_WIDTH     32
0401 #define EASRC_CRCM_RS_CWD(v)        ((v) << EASRC_CRCM_RS_CWD_SHIFT)
0402 
0403 /* ASRC Context Resampling Coefficient Control (CRCC) */
0404 #define EASRC_CRCC_RS_CA_SHIFT      16
0405 #define EASRC_CRCC_RS_CA_WIDTH      11
0406 #define EASRC_CRCC_RS_CA_MASK       ((BIT(EASRC_CRCC_RS_CA_WIDTH) - 1) \
0407                      << EASRC_CRCC_RS_CA_SHIFT)
0408 #define EASRC_CRCC_RS_CA(v)     (((v) << EASRC_CRCC_RS_CA_SHIFT) \
0409                      & EASRC_CRCC_RS_CA_MASK)
0410 #define EASRC_CRCC_RS_TAPS_SHIFT    1
0411 #define EASRC_CRCC_RS_TAPS_WIDTH    2
0412 #define EASRC_CRCC_RS_TAPS_MASK     ((BIT(EASRC_CRCC_RS_TAPS_WIDTH) - 1) \
0413                      << EASRC_CRCC_RS_TAPS_SHIFT)
0414 #define EASRC_CRCC_RS_TAPS(v)       (((v) << EASRC_CRCC_RS_TAPS_SHIFT) \
0415                      & EASRC_CRCC_RS_TAPS_MASK)
0416 #define EASRC_CRCC_RS_CPR_SHIFT     0
0417 #define EASRC_CRCC_RS_CPR_MASK      BIT(EASRC_CRCC_RS_CPR_SHIFT)
0418 #define EASRC_CRCC_RS_CPR       BIT(EASRC_CRCC_RS_CPR_SHIFT)
0419 
0420 /* ASRC Interrupt_Control (IC) */
0421 #define EASRC_IRQC_RSDM_SHIFT       8
0422 #define EASRC_IRQC_RSDM_WIDTH       4
0423 #define EASRC_IRQC_RSDM_MASK        ((BIT(EASRC_IRQC_RSDM_WIDTH) - 1) \
0424                      << EASRC_IRQC_RSDM_SHIFT)
0425 #define EASRC_IRQC_RSDM(v)      (((v) << EASRC_IRQC_RSDM_SHIFT) \
0426                      & EASRC_IRQC_RSDM_MASK)
0427 #define EASRC_IRQC_OERM_SHIFT       4
0428 #define EASRC_IRQC_OERM_WIDTH       4
0429 #define EASRC_IRQC_OERM_MASK        ((BIT(EASRC_IRQC_OERM_WIDTH) - 1) \
0430                      << EASRC_IRQC_OERM_SHIFT)
0431 #define EASRC_IRQC_OERM(v)      (((v) << EASRC_IRQC_OERM_SHIFT) \
0432                      & EASRC_IEQC_OERM_MASK)
0433 #define EASRC_IRQC_IOM_SHIFT        0
0434 #define EASRC_IRQC_IOM_WIDTH        4
0435 #define EASRC_IRQC_IOM_MASK     ((BIT(EASRC_IRQC_IOM_WIDTH) - 1) \
0436                      << EASRC_IRQC_IOM_SHIFT)
0437 #define EASRC_IRQC_IOM(v)       (((v) << EASRC_IRQC_IOM_SHIFT) \
0438                      & EASRC_IRQC_IOM_MASK)
0439 
0440 /* ASRC Interrupt Status Flags (ISF) */
0441 #define EASRC_IRQF_RSD_SHIFT        8
0442 #define EASRC_IRQF_RSD_WIDTH        4
0443 #define EASRC_IRQF_RSD_MASK     ((BIT(EASRC_IRQF_RSD_WIDTH) - 1) \
0444                      << EASRC_IRQF_RSD_SHIFT)
0445 #define EASRC_IRQF_RSD(v)       (((v) << EASRC_IRQF_RSD_SHIFT) \
0446                      & EASRC_IRQF_RSD_MASK)
0447 #define EASRC_IRQF_OER_SHIFT        4
0448 #define EASRC_IRQF_OER_WIDTH        4
0449 #define EASRC_IRQF_OER_MASK     ((BIT(EASRC_IRQF_OER_WIDTH) - 1) \
0450                      << EASRC_IRQF_OER_SHIFT)
0451 #define EASRC_IRQF_OER(v)       (((v) << EASRC_IRQF_OER_SHIFT) \
0452                      & EASRC_IRQF_OER_MASK)
0453 #define EASRC_IRQF_IFO_SHIFT        0
0454 #define EASRC_IRQF_IFO_WIDTH        4
0455 #define EASRC_IRQF_IFO_MASK     ((BIT(EASRC_IRQF_IFO_WIDTH) - 1) \
0456                      << EASRC_IRQF_IFO_SHIFT)
0457 #define EASRC_IRQF_IFO(v)       (((v) << EASRC_IRQF_IFO_SHIFT) \
0458                      & EASRC_IRQF_IFO_MASK)
0459 
0460 /* ASRC Context Channel STAT */
0461 #define EASRC_CSx_CSx_SHIFT     0
0462 #define EASRC_CSx_CSx_WIDTH     32
0463 #define EASRC_CSx_CSx(v)        ((v) << EASRC_CSx_CSx_SHIFT)
0464 
0465 /* ASRC Debug Control Register */
0466 #define EASRC_DBGC_DMS_SHIFT        0
0467 #define EASRC_DBGC_DMS_WIDTH        6
0468 #define EASRC_DBGC_DMS_MASK     ((BIT(EASRC_DBGC_DMS_WIDTH) - 1) \
0469                      << EASRC_DBGC_DMS_SHIFT)
0470 #define EASRC_DBGC_DMS(v)       (((v) << EASRC_DBGC_DMS_SHIFT) \
0471                      & EASRC_DBGC_DMS_MASK)
0472 
0473 /* ASRC Debug Status Register */
0474 #define EASRC_DBGS_DS_SHIFT     0
0475 #define EASRC_DBGS_DS_WIDTH     32
0476 #define EASRC_DBGS_DS(v)        ((v) << EASRC_DBGS_DS_SHIFT)
0477 
0478 /* General Constants */
0479 #define EASRC_CTX_MAX_NUM       4
0480 #define EASRC_RS_COEFF_MEM      0
0481 #define EASRC_PF_COEFF_MEM      1
0482 
0483 /* Prefilter constants */
0484 #define EASRC_PF_ST1_ONLY       0
0485 #define EASRC_PF_TWO_STAGE_MODE     1
0486 #define EASRC_PF_ST1_COEFF_WR       0
0487 #define EASRC_PF_ST2_COEFF_WR       1
0488 #define EASRC_MAX_PF_TAPS       384
0489 
0490 /* Resampling constants */
0491 #define EASRC_RS_32_TAPS        0
0492 #define EASRC_RS_64_TAPS        1
0493 #define EASRC_RS_128_TAPS       2
0494 
0495 /* Initialization mode */
0496 #define EASRC_INIT_MODE_SW_CONTROL  0
0497 #define EASRC_INIT_MODE_REPLICATE   1
0498 #define EASRC_INIT_MODE_ZERO_FILL   2
0499 
0500 /* FIFO watermarks */
0501 #define FSL_EASRC_INPUTFIFO_WML     0x4
0502 #define FSL_EASRC_OUTPUTFIFO_WML    0x1
0503 
0504 #define EASRC_INPUTFIFO_THRESHOLD_MIN   0
0505 #define EASRC_INPUTFIFO_THRESHOLD_MAX   127
0506 #define EASRC_OUTPUTFIFO_THRESHOLD_MIN  0
0507 #define EASRC_OUTPUTFIFO_THRESHOLD_MAX  63
0508 
0509 #define EASRC_DMA_BUFFER_SIZE       (1024 * 48 * 9)
0510 #define EASRC_MAX_BUFFER_SIZE       (1024 * 48)
0511 
0512 #define FIRMWARE_MAGIC          0xDEAD
0513 #define FIRMWARE_VERSION        1
0514 
0515 #define PREFILTER_MEM_LEN       0x1800
0516 
0517 enum easrc_word_width {
0518     EASRC_WIDTH_16_BIT = 0,
0519     EASRC_WIDTH_20_BIT = 1,
0520     EASRC_WIDTH_24_BIT = 2,
0521     EASRC_WIDTH_32_BIT = 3,
0522 };
0523 
0524 struct __attribute__((__packed__))  asrc_firmware_hdr {
0525     u32 magic;
0526     u32 interp_scen;
0527     u32 prefil_scen;
0528     u32 firmware_version;
0529 };
0530 
0531 struct __attribute__((__packed__)) interp_params {
0532     u32 magic;
0533     u32 num_taps;
0534     u32 num_phases;
0535     u64 center_tap;
0536     u64 coeff[8192];
0537 };
0538 
0539 struct __attribute__((__packed__)) prefil_params {
0540     u32 magic;
0541     u32 insr;
0542     u32 outsr;
0543     u32 st1_taps;
0544     u32 st2_taps;
0545     u32 st1_exp;
0546     u64 coeff[256];
0547 };
0548 
0549 struct dma_block {
0550     void *dma_vaddr;
0551     unsigned int length;
0552     unsigned int max_buf_size;
0553 };
0554 
0555 struct fsl_easrc_data_fmt {
0556     unsigned int width : 2;
0557     unsigned int endianness : 1;
0558     unsigned int unsign : 1;
0559     unsigned int floating_point : 1;
0560     unsigned int iec958: 1;
0561     unsigned int sample_pos: 5;
0562     unsigned int addexp;
0563 };
0564 
0565 struct fsl_easrc_io_params {
0566     struct fsl_easrc_data_fmt fmt;
0567     unsigned int group_len;
0568     unsigned int iterations;
0569     unsigned int access_len;
0570     unsigned int fifo_wtmk;
0571     unsigned int sample_rate;
0572     snd_pcm_format_t sample_format;
0573     unsigned int norm_rate;
0574 };
0575 
0576 struct fsl_easrc_slot {
0577     bool busy;
0578     int ctx_index;
0579     int slot_index;
0580     int num_channel;  /* maximum is 8 */
0581     int min_channel;
0582     int max_channel;
0583     int pf_mem_used;
0584 };
0585 
0586 /**
0587  * fsl_easrc_ctx_priv: EASRC context private data
0588  *
0589  * @in_params: input parameter
0590  * @out_params:  output parameter
0591  * @st1_num_taps: tap number of stage 1
0592  * @st2_num_taps: tap number of stage 2
0593  * @st1_num_exp: exponent number of stage 1
0594  * @pf_init_mode: prefilter init mode
0595  * @rs_init_mode:  resample filter init mode
0596  * @ctx_streams: stream flag of ctx
0597  * @rs_ratio: resampler ratio
0598  * @st1_coeff: pointer of stage 1 coeff
0599  * @st2_coeff: pointer of stage 2 coeff
0600  * @in_filled_sample: input filled sample
0601  * @out_missed_sample: sample missed in output
0602  * @st1_addexp: exponent added for stage1
0603  * @st2_addexp: exponent added for stage2
0604  */
0605 struct fsl_easrc_ctx_priv {
0606     struct fsl_easrc_io_params in_params;
0607     struct fsl_easrc_io_params out_params;
0608     unsigned int st1_num_taps;
0609     unsigned int st2_num_taps;
0610     unsigned int st1_num_exp;
0611     unsigned int pf_init_mode;
0612     unsigned int rs_init_mode;
0613     unsigned int ctx_streams;
0614     u64 rs_ratio;
0615     u64 *st1_coeff;
0616     u64 *st2_coeff;
0617     int in_filled_sample;
0618     int out_missed_sample;
0619     int st1_addexp;
0620     int st2_addexp;
0621 };
0622 
0623 /**
0624  * fsl_easrc_priv: EASRC private data
0625  *
0626  * @slot: slot setting
0627  * @firmware_hdr:  the header of firmware
0628  * @interp: pointer to interpolation filter coeff
0629  * @prefil: pointer to prefilter coeff
0630  * @fw: firmware of coeff table
0631  * @fw_name: firmware name
0632  * @rs_num_taps:  resample filter taps, 32, 64, or 128
0633  * @bps_iec958: bits per sample of iec958
0634  * @rs_coeff: resampler coefficient
0635  * @const_coeff: one tap prefilter coefficient
0636  * @firmware_loaded: firmware is loaded
0637  */
0638 struct fsl_easrc_priv {
0639     struct fsl_easrc_slot slot[EASRC_CTX_MAX_NUM][2];
0640     struct asrc_firmware_hdr *firmware_hdr;
0641     struct interp_params *interp;
0642     struct prefil_params *prefil;
0643     const struct firmware *fw;
0644     const char *fw_name;
0645     unsigned int rs_num_taps;
0646     unsigned int bps_iec958[EASRC_CTX_MAX_NUM];
0647     u64 *rs_coeff;
0648     u64 const_coeff;
0649     int firmware_loaded;
0650 };
0651 #endif /* _FSL_EASRC_H */