/* SPDX-License-Identifier: GPL-2.0 */ /* * Copyright (C) 2019 NXP */ #ifndef _FSL_EASRC_H #define _FSL_EASRC_H #include #include #include #include /* EASRC Register Map */ /* ASRC Input Write FIFO */ #define REG_EASRC_WRFIFO(ctx) (0x000 + 4 * (ctx)) /* ASRC Output Read FIFO */ #define REG_EASRC_RDFIFO(ctx) (0x010 + 4 * (ctx)) /* ASRC Context Control */ #define REG_EASRC_CC(ctx) (0x020 + 4 * (ctx)) /* ASRC Context Control Extended 1 */ #define REG_EASRC_CCE1(ctx) (0x030 + 4 * (ctx)) /* ASRC Context Control Extended 2 */ #define REG_EASRC_CCE2(ctx) (0x040 + 4 * (ctx)) /* ASRC Control Input Access */ #define REG_EASRC_CIA(ctx) (0x050 + 4 * (ctx)) /* ASRC Datapath Processor Control Slot0 */ #define REG_EASRC_DPCS0R0(ctx) (0x060 + 4 * (ctx)) #define REG_EASRC_DPCS0R1(ctx) (0x070 + 4 * (ctx)) #define REG_EASRC_DPCS0R2(ctx) (0x080 + 4 * (ctx)) #define REG_EASRC_DPCS0R3(ctx) (0x090 + 4 * (ctx)) /* ASRC Datapath Processor Control Slot1 */ #define REG_EASRC_DPCS1R0(ctx) (0x0A0 + 4 * (ctx)) #define REG_EASRC_DPCS1R1(ctx) (0x0B0 + 4 * (ctx)) #define REG_EASRC_DPCS1R2(ctx) (0x0C0 + 4 * (ctx)) #define REG_EASRC_DPCS1R3(ctx) (0x0D0 + 4 * (ctx)) /* ASRC Context Output Control */ #define REG_EASRC_COC(ctx) (0x0E0 + 4 * (ctx)) /* ASRC Control Output Access */ #define REG_EASRC_COA(ctx) (0x0F0 + 4 * (ctx)) /* ASRC Sample FIFO Status */ #define REG_EASRC_SFS(ctx) (0x100 + 4 * (ctx)) /* ASRC Resampling Ratio Low */ #define REG_EASRC_RRL(ctx) (0x110 + 8 * (ctx)) /* ASRC Resampling Ratio High */ #define REG_EASRC_RRH(ctx) (0x114 + 8 * (ctx)) /* ASRC Resampling Ratio Update Control */ #define REG_EASRC_RUC(ctx) (0x130 + 4 * (ctx)) /* ASRC Resampling Ratio Update Rate */ #define REG_EASRC_RUR(ctx) (0x140 + 4 * (ctx)) /* ASRC Resampling Center Tap Coefficient Low */ #define REG_EASRC_RCTCL (0x150) /* ASRC Resampling Center Tap Coefficient High */ #define REG_EASRC_RCTCH (0x154) /* ASRC Prefilter Coefficient FIFO */ #define REG_EASRC_PCF(ctx) (0x160 + 4 * (ctx)) /* ASRC Context Resampling Coefficient Memory */ #define REG_EASRC_CRCM 0x170 /* ASRC Context Resampling Coefficient Control*/ #define REG_EASRC_CRCC 0x174 /* ASRC Interrupt Control */ #define REG_EASRC_IRQC 0x178 /* ASRC Interrupt Status Flags */ #define REG_EASRC_IRQF 0x17C /* ASRC Channel Status 0 */ #define REG_EASRC_CS0(ctx) (0x180 + 4 * (ctx)) /* ASRC Channel Status 1 */ #define REG_EASRC_CS1(ctx) (0x190 + 4 * (ctx)) /* ASRC Channel Status 2 */ #define REG_EASRC_CS2(ctx) (0x1A0 + 4 * (ctx)) /* ASRC Channel Status 3 */ #define REG_EASRC_CS3(ctx) (0x1B0 + 4 * (ctx)) /* ASRC Channel Status 4 */ #define REG_EASRC_CS4(ctx) (0x1C0 + 4 * (ctx)) /* ASRC Channel Status 5 */ #define REG_EASRC_CS5(ctx) (0x1D0 + 4 * (ctx)) /* ASRC Debug Control Register */ #define REG_EASRC_DBGC 0x1E0 /* ASRC Debug Status Register */ #define REG_EASRC_DBGS 0x1E4 #define REG_EASRC_FIFO(x, ctx) (x == IN ? REG_EASRC_WRFIFO(ctx) \ : REG_EASRC_RDFIFO(ctx)) /* ASRC Context Control (CC) */ #define EASRC_CC_EN_SHIFT 31 #define EASRC_CC_EN_MASK BIT(EASRC_CC_EN_SHIFT) #define EASRC_CC_EN BIT(EASRC_CC_EN_SHIFT) #define EASRC_CC_STOP_SHIFT 29 #define EASRC_CC_STOP_MASK BIT(EASRC_CC_STOP_SHIFT) #define EASRC_CC_STOP BIT(EASRC_CC_STOP_SHIFT) #define EASRC_CC_FWMDE_SHIFT 28 #define EASRC_CC_FWMDE_MASK BIT(EASRC_CC_FWMDE_SHIFT) #define EASRC_CC_FWMDE BIT(EASRC_CC_FWMDE_SHIFT) #define EASRC_CC_FIFO_WTMK_SHIFT 16 #define EASRC_CC_FIFO_WTMK_WIDTH 7 #define EASRC_CC_FIFO_WTMK_MASK ((BIT(EASRC_CC_FIFO_WTMK_WIDTH) - 1) \ << EASRC_CC_FIFO_WTMK_SHIFT) #define EASRC_CC_FIFO_WTMK(v) (((v) << EASRC_CC_FIFO_WTMK_SHIFT) \ & EASRC_CC_FIFO_WTMK_MASK) #define EASRC_CC_SAMPLE_POS_SHIFT 11 #define EASRC_CC_SAMPLE_POS_WIDTH 5 #define EASRC_CC_SAMPLE_POS_MASK ((BIT(EASRC_CC_SAMPLE_POS_WIDTH) - 1) \ << EASRC_CC_SAMPLE_POS_SHIFT) #define EASRC_CC_SAMPLE_POS(v) (((v) << EASRC_CC_SAMPLE_POS_SHIFT) \ & EASRC_CC_SAMPLE_POS_MASK) #define EASRC_CC_ENDIANNESS_SHIFT 10 #define EASRC_CC_ENDIANNESS_MASK BIT(EASRC_CC_ENDIANNESS_SHIFT) #define EASRC_CC_ENDIANNESS BIT(EASRC_CC_ENDIANNESS_SHIFT) #define EASRC_CC_BPS_SHIFT 8 #define EASRC_CC_BPS_WIDTH 2 #define EASRC_CC_BPS_MASK ((BIT(EASRC_CC_BPS_WIDTH) - 1) \ << EASRC_CC_BPS_SHIFT) #define EASRC_CC_BPS(v) (((v) << EASRC_CC_BPS_SHIFT) \ & EASRC_CC_BPS_MASK) #define EASRC_CC_FMT_SHIFT 7 #define EASRC_CC_FMT_MASK BIT(EASRC_CC_FMT_SHIFT) #define EASRC_CC_FMT BIT(EASRC_CC_FMT_SHIFT) #define EASRC_CC_INSIGN_SHIFT 6 #define EASRC_CC_INSIGN_MASK BIT(EASRC_CC_INSIGN_SHIFT) #define EASRC_CC_INSIGN BIT(EASRC_CC_INSIGN_SHIFT) #define EASRC_CC_CHEN_SHIFT 0 #define EASRC_CC_CHEN_WIDTH 5 #define EASRC_CC_CHEN_MASK ((BIT(EASRC_CC_CHEN_WIDTH) - 1) \ << EASRC_CC_CHEN_SHIFT) #define EASRC_CC_CHEN(v) (((v) << EASRC_CC_CHEN_SHIFT) \ & EASRC_CC_CHEN_MASK) /* ASRC Context Control Extended 1 (CCE1) */ #define EASRC_CCE1_COEF_WS_SHIFT 25 #define EASRC_CCE1_COEF_WS_MASK BIT(EASRC_CCE1_COEF_WS_SHIFT) #define EASRC_CCE1_COEF_WS BIT(EASRC_CCE1_COEF_WS_SHIFT) #define EASRC_CCE1_COEF_MEM_RST_SHIFT 24 #define EASRC_CCE1_COEF_MEM_RST_MASK BIT(EASRC_CCE1_COEF_MEM_RST_SHIFT) #define EASRC_CCE1_COEF_MEM_RST BIT(EASRC_CCE1_COEF_MEM_RST_SHIFT) #define EASRC_CCE1_PF_EXP_SHIFT 16 #define EASRC_CCE1_PF_EXP_WIDTH 8 #define EASRC_CCE1_PF_EXP_MASK ((BIT(EASRC_CCE1_PF_EXP_WIDTH) - 1) \ << EASRC_CCE1_PF_EXP_SHIFT) #define EASRC_CCE1_PF_EXP(v) (((v) << EASRC_CCE1_PF_EXP_SHIFT) \ & EASRC_CCE1_PF_EXP_MASK) #define EASRC_CCE1_PF_ST1_WBFP_SHIFT 9 #define EASRC_CCE1_PF_ST1_WBFP_MASK BIT(EASRC_CCE1_PF_ST1_WBFP_SHIFT) #define EASRC_CCE1_PF_ST1_WBFP BIT(EASRC_CCE1_PF_ST1_WBFP_SHIFT) #define EASRC_CCE1_PF_TSEN_SHIFT 8 #define EASRC_CCE1_PF_TSEN_MASK BIT(EASRC_CCE1_PF_TSEN_SHIFT) #define EASRC_CCE1_PF_TSEN BIT(EASRC_CCE1_PF_TSEN_SHIFT) #define EASRC_CCE1_RS_BYPASS_SHIFT 7 #define EASRC_CCE1_RS_BYPASS_MASK BIT(EASRC_CCE1_RS_BYPASS_SHIFT) #define EASRC_CCE1_RS_BYPASS BIT(EASRC_CCE1_RS_BYPASS_SHIFT) #define EASRC_CCE1_PF_BYPASS_SHIFT 6 #define EASRC_CCE1_PF_BYPASS_MASK BIT(EASRC_CCE1_PF_BYPASS_SHIFT) #define EASRC_CCE1_PF_BYPASS BIT(EASRC_CCE1_PF_BYPASS_SHIFT) #define EASRC_CCE1_RS_STOP_SHIFT 5 #define EASRC_CCE1_RS_STOP_MASK BIT(EASRC_CCE1_RS_STOP_SHIFT) #define EASRC_CCE1_RS_STOP BIT(EASRC_CCE1_RS_STOP_SHIFT) #define EASRC_CCE1_PF_STOP_SHIFT 4 #define EASRC_CCE1_PF_STOP_MASK BIT(EASRC_CCE1_PF_STOP_SHIFT) #define EASRC_CCE1_PF_STOP BIT(EASRC_CCE1_PF_STOP_SHIFT) #define EASRC_CCE1_RS_INIT_SHIFT 2 #define EASRC_CCE1_RS_INIT_WIDTH 2 #define EASRC_CCE1_RS_INIT_MASK ((BIT(EASRC_CCE1_RS_INIT_WIDTH) - 1) \ << EASRC_CCE1_RS_INIT_SHIFT) #define EASRC_CCE1_RS_INIT(v) (((v) << EASRC_CCE1_RS_INIT_SHIFT) \ & EASRC_CCE1_RS_INIT_MASK) #define EASRC_CCE1_PF_INIT_SHIFT 0 #define EASRC_CCE1_PF_INIT_WIDTH 2 #define EASRC_CCE1_PF_INIT_MASK ((BIT(EASRC_CCE1_PF_INIT_WIDTH) - 1) \ << EASRC_CCE1_PF_INIT_SHIFT) #define EASRC_CCE1_PF_INIT(v) (((v) << EASRC_CCE1_PF_INIT_SHIFT) \ & EASRC_CCE1_PF_INIT_MASK) /* ASRC Context Control Extended 2 (CCE2) */ #define EASRC_CCE2_ST2_TAPS_SHIFT 16 #define EASRC_CCE2_ST2_TAPS_WIDTH 9 #define EASRC_CCE2_ST2_TAPS_MASK ((BIT(EASRC_CCE2_ST2_TAPS_WIDTH) - 1) \ << EASRC_CCE2_ST2_TAPS_SHIFT) #define EASRC_CCE2_ST2_TAPS(v) (((v) << EASRC_CCE2_ST2_TAPS_SHIFT) \ & EASRC_CCE2_ST2_TAPS_MASK) #define EASRC_CCE2_ST1_TAPS_SHIFT 0 #define EASRC_CCE2_ST1_TAPS_WIDTH 9 #define EASRC_CCE2_ST1_TAPS_MASK ((BIT(EASRC_CCE2_ST1_TAPS_WIDTH) - 1) \ << EASRC_CCE2_ST1_TAPS_SHIFT) #define EASRC_CCE2_ST1_TAPS(v) (((v) << EASRC_CCE2_ST1_TAPS_SHIFT) \ & EASRC_CCE2_ST1_TAPS_MASK) /* ASRC Control Input Access (CIA) */ #define EASRC_CIA_ITER_SHIFT 16 #define EASRC_CIA_ITER_WIDTH 6 #define EASRC_CIA_ITER_MASK ((BIT(EASRC_CIA_ITER_WIDTH) - 1) \ << EASRC_CIA_ITER_SHIFT) #define EASRC_CIA_ITER(v) (((v) << EASRC_CIA_ITER_SHIFT) \ & EASRC_CIA_ITER_MASK) #define EASRC_CIA_GRLEN_SHIFT 8 #define EASRC_CIA_GRLEN_WIDTH 6 #define EASRC_CIA_GRLEN_MASK ((BIT(EASRC_CIA_GRLEN_WIDTH) - 1) \ << EASRC_CIA_GRLEN_SHIFT) #define EASRC_CIA_GRLEN(v) (((v) << EASRC_CIA_GRLEN_SHIFT) \ & EASRC_CIA_GRLEN_MASK) #define EASRC_CIA_ACCLEN_SHIFT 0 #define EASRC_CIA_ACCLEN_WIDTH 6 #define EASRC_CIA_ACCLEN_MASK ((BIT(EASRC_CIA_ACCLEN_WIDTH) - 1) \ << EASRC_CIA_ACCLEN_SHIFT) #define EASRC_CIA_ACCLEN(v) (((v) << EASRC_CIA_ACCLEN_SHIFT) \ & EASRC_CIA_ACCLEN_MASK) /* ASRC Datapath Processor Control Slot0 Register0 (DPCS0R0) */ #define EASRC_DPCS0R0_MAXCH_SHIFT 24 #define EASRC_DPCS0R0_MAXCH_WIDTH 5 #define EASRC_DPCS0R0_MAXCH_MASK ((BIT(EASRC_DPCS0R0_MAXCH_WIDTH) - 1) \ << EASRC_DPCS0R0_MAXCH_SHIFT) #define EASRC_DPCS0R0_MAXCH(v) (((v) << EASRC_DPCS0R0_MAXCH_SHIFT) \ & EASRC_DPCS0R0_MAXCH_MASK) #define EASRC_DPCS0R0_MINCH_SHIFT 16 #define EASRC_DPCS0R0_MINCH_WIDTH 5 #define EASRC_DPCS0R0_MINCH_MASK ((BIT(EASRC_DPCS0R0_MINCH_WIDTH) - 1) \ << EASRC_DPCS0R0_MINCH_SHIFT) #define EASRC_DPCS0R0_MINCH(v) (((v) << EASRC_DPCS0R0_MINCH_SHIFT) \ & EASRC_DPCS0R0_MINCH_MASK) #define EASRC_DPCS0R0_NUMCH_SHIFT 8 #define EASRC_DPCS0R0_NUMCH_WIDTH 5 #define EASRC_DPCS0R0_NUMCH_MASK ((BIT(EASRC_DPCS0R0_NUMCH_WIDTH) - 1) \ << EASRC_DPCS0R0_NUMCH_SHIFT) #define EASRC_DPCS0R0_NUMCH(v) (((v) << EASRC_DPCS0R0_NUMCH_SHIFT) \ & EASRC_DPCS0R0_NUMCH_MASK) #define EASRC_DPCS0R0_CTXNUM_SHIFT 1 #define EASRC_DPCS0R0_CTXNUM_WIDTH 2 #define EASRC_DPCS0R0_CTXNUM_MASK ((BIT(EASRC_DPCS0R0_CTXNUM_WIDTH) - 1) \ << EASRC_DPCS0R0_CTXNUM_SHIFT) #define EASRC_DPCS0R0_CTXNUM(v) (((v) << EASRC_DPCS0R0_CTXNUM_SHIFT) \ & EASRC_DPCS0R0_CTXNUM_MASK) #define EASRC_DPCS0R0_EN_SHIFT 0 #define EASRC_DPCS0R0_EN_MASK BIT(EASRC_DPCS0R0_EN_SHIFT) #define EASRC_DPCS0R0_EN BIT(EASRC_DPCS0R0_EN_SHIFT) /* ASRC Datapath Processor Control Slot0 Register1 (DPCS0R1) */ #define EASRC_DPCS0R1_ST1_EXP_SHIFT 0 #define EASRC_DPCS0R1_ST1_EXP_WIDTH 13 #define EASRC_DPCS0R1_ST1_EXP_MASK ((BIT(EASRC_DPCS0R1_ST1_EXP_WIDTH) - 1) \ << EASRC_DPCS0R1_ST1_EXP_SHIFT) #define EASRC_DPCS0R1_ST1_EXP(v) (((v) << EASRC_DPCS0R1_ST1_EXP_SHIFT) \ & EASRC_DPCS0R1_ST1_EXP_MASK) /* ASRC Datapath Processor Control Slot0 Register2 (DPCS0R2) */ #define EASRC_DPCS0R2_ST1_MA_SHIFT 16 #define EASRC_DPCS0R2_ST1_MA_WIDTH 13 #define EASRC_DPCS0R2_ST1_MA_MASK ((BIT(EASRC_DPCS0R2_ST1_MA_WIDTH) - 1) \ << EASRC_DPCS0R2_ST1_MA_SHIFT) #define EASRC_DPCS0R2_ST1_MA(v) (((v) << EASRC_DPCS0R2_ST1_MA_SHIFT) \ & EASRC_DPCS0R2_ST1_MA_MASK) #define EASRC_DPCS0R2_ST1_SA_SHIFT 0 #define EASRC_DPCS0R2_ST1_SA_WIDTH 13 #define EASRC_DPCS0R2_ST1_SA_MASK ((BIT(EASRC_DPCS0R2_ST1_SA_WIDTH) - 1) \ << EASRC_DPCS0R2_ST1_SA_SHIFT) #define EASRC_DPCS0R2_ST1_SA(v) (((v) << EASRC_DPCS0R2_ST1_SA_SHIFT) \ & EASRC_DPCS0R2_ST1_SA_MASK) /* ASRC Datapath Processor Control Slot0 Register3 (DPCS0R3) */ #define EASRC_DPCS0R3_ST2_MA_SHIFT 16 #define EASRC_DPCS0R3_ST2_MA_WIDTH 13 #define EASRC_DPCS0R3_ST2_MA_MASK ((BIT(EASRC_DPCS0R3_ST2_MA_WIDTH) - 1) \ << EASRC_DPCS0R3_ST2_MA_SHIFT) #define EASRC_DPCS0R3_ST2_MA(v) (((v) << EASRC_DPCS0R3_ST2_MA_SHIFT) \ & EASRC_DPCS0R3_ST2_MA_MASK) #define EASRC_DPCS0R3_ST2_SA_SHIFT 0 #define EASRC_DPCS0R3_ST2_SA_WIDTH 13 #define EASRC_DPCS0R3_ST2_SA_MASK ((BIT(EASRC_DPCS0R3_ST2_SA_WIDTH) - 1) \ << EASRC_DPCS0R3_ST2_SA_SHIFT) #define EASRC_DPCS0R3_ST2_SA(v) (((v) << EASRC_DPCS0R3_ST2_SA_SHIFT) \ & EASRC_DPCS0R3_ST2_SA_MASK) /* ASRC Context Output Control (COC) */ #define EASRC_COC_FWMDE_SHIFT 28 #define EASRC_COC_FWMDE_MASK BIT(EASRC_COC_FWMDE_SHIFT) #define EASRC_COC_FWMDE BIT(EASRC_COC_FWMDE_SHIFT) #define EASRC_COC_FIFO_WTMK_SHIFT 16 #define EASRC_COC_FIFO_WTMK_WIDTH 7 #define EASRC_COC_FIFO_WTMK_MASK ((BIT(EASRC_COC_FIFO_WTMK_WIDTH) - 1) \ << EASRC_COC_FIFO_WTMK_SHIFT) #define EASRC_COC_FIFO_WTMK(v) (((v) << EASRC_COC_FIFO_WTMK_SHIFT) \ & EASRC_COC_FIFO_WTMK_MASK) #define EASRC_COC_SAMPLE_POS_SHIFT 11 #define EASRC_COC_SAMPLE_POS_WIDTH 5 #define EASRC_COC_SAMPLE_POS_MASK ((BIT(EASRC_COC_SAMPLE_POS_WIDTH) - 1) \ << EASRC_COC_SAMPLE_POS_SHIFT) #define EASRC_COC_SAMPLE_POS(v) (((v) << EASRC_COC_SAMPLE_POS_SHIFT) \ & EASRC_COC_SAMPLE_POS_MASK) #define EASRC_COC_ENDIANNESS_SHIFT 10 #define EASRC_COC_ENDIANNESS_MASK BIT(EASRC_COC_ENDIANNESS_SHIFT) #define EASRC_COC_ENDIANNESS BIT(EASRC_COC_ENDIANNESS_SHIFT) #define EASRC_COC_BPS_SHIFT 8 #define EASRC_COC_BPS_WIDTH 2 #define EASRC_COC_BPS_MASK ((BIT(EASRC_COC_BPS_WIDTH) - 1) \ << EASRC_COC_BPS_SHIFT) #define EASRC_COC_BPS(v) (((v) << EASRC_COC_BPS_SHIFT) \ & EASRC_COC_BPS_MASK) #define EASRC_COC_FMT_SHIFT 7 #define EASRC_COC_FMT_MASK BIT(EASRC_COC_FMT_SHIFT) #define EASRC_COC_FMT BIT(EASRC_COC_FMT_SHIFT) #define EASRC_COC_OUTSIGN_SHIFT 6 #define EASRC_COC_OUTSIGN_MASK BIT(EASRC_COC_OUTSIGN_SHIFT) #define EASRC_COC_OUTSIGN_OUT BIT(EASRC_COC_OUTSIGN_SHIFT) #define EASRC_COC_IEC_VDATA_SHIFT 2 #define EASRC_COC_IEC_VDATA_MASK BIT(EASRC_COC_IEC_VDATA_SHIFT) #define EASRC_COC_IEC_VDATA BIT(EASRC_COC_IEC_VDATA_SHIFT) #define EASRC_COC_IEC_EN_SHIFT 1 #define EASRC_COC_IEC_EN_MASK BIT(EASRC_COC_IEC_EN_SHIFT) #define EASRC_COC_IEC_EN BIT(EASRC_COC_IEC_EN_SHIFT) #define EASRC_COC_DITHER_EN_SHIFT 0 #define EASRC_COC_DITHER_EN_MASK BIT(EASRC_COC_DITHER_EN_SHIFT) #define EASRC_COC_DITHER_EN BIT(EASRC_COC_DITHER_EN_SHIFT) /* ASRC Control Output Access (COA) */ #define EASRC_COA_ITER_SHIFT 16 #define EASRC_COA_ITER_WIDTH 6 #define EASRC_COA_ITER_MASK ((BIT(EASRC_COA_ITER_WIDTH) - 1) \ << EASRC_COA_ITER_SHIFT) #define EASRC_COA_ITER(v) (((v) << EASRC_COA_ITER_SHIFT) \ & EASRC_COA_ITER_MASK) #define EASRC_COA_GRLEN_SHIFT 8 #define EASRC_COA_GRLEN_WIDTH 6 #define EASRC_COA_GRLEN_MASK ((BIT(EASRC_COA_GRLEN_WIDTH) - 1) \ << EASRC_COA_GRLEN_SHIFT) #define EASRC_COA_GRLEN(v) (((v) << EASRC_COA_GRLEN_SHIFT) \ & EASRC_COA_GRLEN_MASK) #define EASRC_COA_ACCLEN_SHIFT 0 #define EASRC_COA_ACCLEN_WIDTH 6 #define EASRC_COA_ACCLEN_MASK ((BIT(EASRC_COA_ACCLEN_WIDTH) - 1) \ << EASRC_COA_ACCLEN_SHIFT) #define EASRC_COA_ACCLEN(v) (((v) << EASRC_COA_ACCLEN_SHIFT) \ & EASRC_COA_ACCLEN_MASK) /* ASRC Sample FIFO Status (SFS) */ #define EASRC_SFS_IWTMK_SHIFT 23 #define EASRC_SFS_IWTMK_MASK BIT(EASRC_SFS_IWTMK_SHIFT) #define EASRC_SFS_IWTMK BIT(EASRC_SFS_IWTMK_SHIFT) #define EASRC_SFS_NSGI_SHIFT 16 #define EASRC_SFS_NSGI_WIDTH 7 #define EASRC_SFS_NSGI_MASK ((BIT(EASRC_SFS_NSGI_WIDTH) - 1) \ << EASRC_SFS_NSGI_SHIFT) #define EASRC_SFS_NSGI(v) (((v) << EASRC_SFS_NSGI_SHIFT) \ & EASRC_SFS_NSGI_MASK) #define EASRC_SFS_OWTMK_SHIFT 7 #define EASRC_SFS_OWTMK_MASK BIT(EASRC_SFS_OWTMK_SHIFT) #define EASRC_SFS_OWTMK BIT(EASRC_SFS_OWTMK_SHIFT) #define EASRC_SFS_NSGO_SHIFT 0 #define EASRC_SFS_NSGO_WIDTH 7 #define EASRC_SFS_NSGO_MASK ((BIT(EASRC_SFS_NSGO_WIDTH) - 1) \ << EASRC_SFS_NSGO_SHIFT) #define EASRC_SFS_NSGO(v) (((v) << EASRC_SFS_NSGO_SHIFT) \ & EASRC_SFS_NSGO_MASK) /* ASRC Resampling Ratio Low (RRL) */ #define EASRC_RRL_RS_RL_SHIFT 0 #define EASRC_RRL_RS_RL_WIDTH 32 #define EASRC_RRL_RS_RL_MASK ((BIT(EASRC_RRL_RS_RL_WIDTH) - 1) \ << EASRC_RRL_RS_RL_SHIFT) #define EASRC_RRL_RS_RL(v) (((v) << EASRC_RRL_RS_RL_SHIFT) \ & EASRC_RRL_RS_RL_MASK) /* ASRC Resampling Ratio High (RRH) */ #define EASRC_RRH_RS_VLD_SHIFT 31 #define EASRC_RRH_RS_VLD_MASK BIT(EASRC_RRH_RS_VLD_SHIFT) #define EASRC_RRH_RS_VLD BIT(EASRC_RRH_RS_VLD_SHIFT) #define EASRC_RRH_RS_RH_SHIFT 0 #define EASRC_RRH_RS_RH_WIDTH 12 #define EASRC_RRH_RS_RH_MASK ((BIT(EASRC_RRH_RS_RH_WIDTH) - 1) \ << EASRC_RRH_RS_RH_SHIFT) #define EASRC_RRH_RS_RH(v) (((v) << EASRC_RRH_RS_RH_SHIFT) \ & EASRC_RRH_RS_RH_MASK) /* ASRC Resampling Ratio Update Control (RSUC) */ #define EASRC_RSUC_RS_RM_SHIFT 0 #define EASRC_RSUC_RS_RM_WIDTH 32 #define EASRC_RSUC_RS_RM_MASK ((BIT(EASRC_RSUC_RS_RM_WIDTH) - 1) \ << EASRC_RSUC_RS_RM_SHIFT) #define EASRC_RSUC_RS_RM(v) (((v) << EASRC_RSUC_RS_RM_SHIFT) \ & EASRC_RSUC_RS_RM_MASK) /* ASRC Resampling Ratio Update Rate (RRUR) */ #define EASRC_RRUR_RRR_SHIFT 0 #define EASRC_RRUR_RRR_WIDTH 31 #define EASRC_RRUR_RRR_MASK ((BIT(EASRC_RRUR_RRR_WIDTH) - 1) \ << EASRC_RRUR_RRR_SHIFT) #define EASRC_RRUR_RRR(v) (((v) << EASRC_RRUR_RRR_SHIFT) \ & EASRC_RRUR_RRR_MASK) /* ASRC Resampling Center Tap Coefficient Low (RCTCL) */ #define EASRC_RCTCL_RS_CL_SHIFT 0 #define EASRC_RCTCL_RS_CL_WIDTH 32 #define EASRC_RCTCL_RS_CL_MASK ((BIT(EASRC_RCTCL_RS_CL_WIDTH) - 1) \ << EASRC_RCTCL_RS_CL_SHIFT) #define EASRC_RCTCL_RS_CL(v) (((v) << EASRC_RCTCL_RS_CL_SHIFT) \ & EASRC_RCTCL_RS_CL_MASK) /* ASRC Resampling Center Tap Coefficient High (RCTCH) */ #define EASRC_RCTCH_RS_CH_SHIFT 0 #define EASRC_RCTCH_RS_CH_WIDTH 32 #define EASRC_RCTCH_RS_CH_MASK ((BIT(EASRC_RCTCH_RS_CH_WIDTH) - 1) \ << EASRC_RCTCH_RS_CH_SHIFT) #define EASRC_RCTCH_RS_CH(v) (((v) << EASRC_RCTCH_RS_CH_SHIFT) \ & EASRC_RCTCH_RS_CH_MASK) /* ASRC Prefilter Coefficient FIFO (PCF) */ #define EASRC_PCF_CD_SHIFT 0 #define EASRC_PCF_CD_WIDTH 32 #define EASRC_PCF_CD_MASK ((BIT(EASRC_PCF_CD_WIDTH) - 1) \ << EASRC_PCF_CD_SHIFT) #define EASRC_PCF_CD(v) (((v) << EASRC_PCF_CD_SHIFT) \ & EASRC_PCF_CD_MASK) /* ASRC Context Resampling Coefficient Memory (CRCM) */ #define EASRC_CRCM_RS_CWD_SHIFT 0 #define EASRC_CRCM_RS_CWD_WIDTH 32 #define EASRC_CRCM_RS_CWD_MASK ((BIT(EASRC_CRCM_RS_CWD_WIDTH) - 1) \ << EASRC_CRCM_RS_CWD_SHIFT) #define EASRC_CRCM_RS_CWD(v) (((v) << EASRC_CRCM_RS_CWD_SHIFT) \ & EASRC_CRCM_RS_CWD_MASK) /* ASRC Context Resampling Coefficient Control (CRCC) */ #define EASRC_CRCC_RS_CA_SHIFT 16 #define EASRC_CRCC_RS_CA_WIDTH 11 #define EASRC_CRCC_RS_CA_MASK ((BIT(EASRC_CRCC_RS_CA_WIDTH) - 1) \ << EASRC_CRCC_RS_CA_SHIFT) #define EASRC_CRCC_RS_CA(v) (((v) << EASRC_CRCC_RS_CA_SHIFT) \ & EASRC_CRCC_RS_CA_MASK) #define EASRC_CRCC_RS_TAPS_SHIFT 1 #define EASRC_CRCC_RS_TAPS_WIDTH 2 #define EASRC_CRCC_RS_TAPS_MASK ((BIT(EASRC_CRCC_RS_TAPS_WIDTH) - 1) \ << EASRC_CRCC_RS_TAPS_SHIFT) #define EASRC_CRCC_RS_TAPS(v) (((v) << EASRC_CRCC_RS_TAPS_SHIFT) \ & EASRC_CRCC_RS_TAPS_MASK) #define EASRC_CRCC_RS_CPR_SHIFT 0 #define EASRC_CRCC_RS_CPR_MASK BIT(EASRC_CRCC_RS_CPR_SHIFT) #define EASRC_CRCC_RS_CPR BIT(EASRC_CRCC_RS_CPR_SHIFT) /* ASRC Interrupt_Control (IC) */ #define EASRC_IRQC_RSDM_SHIFT 8 #define EASRC_IRQC_RSDM_WIDTH 4 #define EASRC_IRQC_RSDM_MASK ((BIT(EASRC_IRQC_RSDM_WIDTH) - 1) \ << EASRC_IRQC_RSDM_SHIFT) #define EASRC_IRQC_RSDM(v) (((v) << EASRC_IRQC_RSDM_SHIFT) \ & EASRC_IRQC_RSDM_MASK) #define EASRC_IRQC_OERM_SHIFT 4 #define EASRC_IRQC_OERM_WIDTH 4 #define EASRC_IRQC_OERM_MASK ((BIT(EASRC_IRQC_OERM_WIDTH) - 1) \ << EASRC_IRQC_OERM_SHIFT) #define EASRC_IRQC_OERM(v) (((v) << EASRC_IRQC_OERM_SHIFT) \ & EASRC_IEQC_OERM_MASK) #define EASRC_IRQC_IOM_SHIFT 0 #define EASRC_IRQC_IOM_WIDTH 4 #define EASRC_IRQC_IOM_MASK ((BIT(EASRC_IRQC_IOM_WIDTH) - 1) \ << EASRC_IRQC_IOM_SHIFT) #define EASRC_IRQC_IOM(v) (((v) << EASRC_IRQC_IOM_SHIFT) \ & EASRC_IRQC_IOM_MASK) /* ASRC Interrupt Status Flags (ISF) */ #define EASRC_IRQF_RSD_SHIFT 8 #define EASRC_IRQF_RSD_WIDTH 4 #define EASRC_IRQF_RSD_MASK ((BIT(EASRC_IRQF_RSD_WIDTH) - 1) \ << EASRC_IRQF_RSD_SHIFT) #define EASRC_IRQF_RSD(v) (((v) << EASRC_IRQF_RSD_SHIFT) \ & EASRC_IRQF_RSD_MASK) #define EASRC_IRQF_OER_SHIFT 4 #define EASRC_IRQF_OER_WIDTH 4 #define EASRC_IRQF_OER_MASK ((BIT(EASRC_IRQF_OER_WIDTH) - 1) \ << EASRC_IRQF_OER_SHIFT) #define EASRC_IRQF_OER(v) (((v) << EASRC_IRQF_OER_SHIFT) \ & EASRC_IRQF_OER_MASK) #define EASRC_IRQF_IFO_SHIFT 0 #define EASRC_IRQF_IFO_WIDTH 4 #define EASRC_IRQF_IFO_MASK ((BIT(EASRC_IRQF_IFO_WIDTH) - 1) \ << EASRC_IRQF_IFO_SHIFT) #define EASRC_IRQF_IFO(v) (((v) << EASRC_IRQF_IFO_SHIFT) \ & EASRC_IRQF_IFO_MASK) /* ASRC Context Channel STAT */ #define EASRC_CSx_CSx_SHIFT 0 #define EASRC_CSx_CSx_WIDTH 32 #define EASRC_CSx_CSx_MASK ((BIT(EASRC_CSx_CSx_WIDTH) - 1) \ << EASRC_CSx_CSx_SHIFT) #define EASRC_CSx_CSx(v) (((v) << EASRC_CSx_CSx_SHIFT) \ & EASRC_CSx_CSx_MASK) /* ASRC Debug Control Register */ #define EASRC_DBGC_DMS_SHIFT 0 #define EASRC_DBGC_DMS_WIDTH 6 #define EASRC_DBGC_DMS_MASK ((BIT(EASRC_DBGC_DMS_WIDTH) - 1) \ << EASRC_DBGC_DMS_SHIFT) #define EASRC_DBGC_DMS(v) (((v) << EASRC_DBGC_DMS_SHIFT) \ & EASRC_DBGC_DMS_MASK) /* ASRC Debug Status Register */ #define EASRC_DBGS_DS_SHIFT 0 #define EASRC_DBGS_DS_WIDTH 32 #define EASRC_DBGS_DS_MASK ((BIT(EASRC_DBGS_DS_WIDTH) - 1) \ << EASRC_DBGS_DS_SHIFT) #define EASRC_DBGS_DS(v) (((v) << EASRC_DBGS_DS_SHIFT) \ & EASRC_DBGS_DS_MASK) /* General Constants */ #define EASRC_CTX_MAX_NUM 4 #define EASRC_32b_MASK (BIT(32) - 1) #define EASRC_64b_MASK (BIT(64) - 1) #define EASRC_RS_COEFF_MEM 0 #define EASRC_PF_COEFF_MEM 1 /* Prefilter constants */ #define EASRC_PF_ST1_ONLY 0 #define EASRC_PF_TWO_STAGE_MODE 1 #define EASRC_PF_ST1_COEFF_WR 0 #define EASRC_PF_ST2_COEFF_WR 1 #define EASRC_MAX_PF_TAPS 384 /* Resampling constants */ #define EASRC_RS_32_TAPS 0 #define EASRC_RS_64_TAPS 1 #define EASRC_RS_128_TAPS 2 /* Initialization mode */ #define EASRC_INIT_MODE_SW_CONTROL 0 #define EASRC_INIT_MODE_REPLICATE 1 #define EASRC_INIT_MODE_ZERO_FILL 2 /* directions */ #define IN 0 #define OUT 1 /* FIFO watermarks */ #define FSL_EASRC_INPUTFIFO_WML 0x4 #define FSL_EASRC_OUTPUTFIFO_WML 0x1 #define EASRC_INPUTFIFO_THRESHOLD_MIN 0 #define EASRC_INPUTFIFO_THRESHOLD_MAX 127 #define EASRC_OUTPUTFIFO_THRESHOLD_MIN 0 #define EASRC_OUTPUTFIFO_THRESHOLD_MAX 63 #define EASRC_DMA_BUFFER_SIZE (1024 * 48 * 9) #define EASRC_MAX_BUFFER_SIZE (1024 * 48) #define FIRMWARE_MAGIC 0xDEAD #define FIRMWARE_VERSION 1 enum easrc_word_width { EASRC_WIDTH_16_BIT = 0, EASRC_WIDTH_20_BIT = 1, EASRC_WIDTH_24_BIT = 2, EASRC_WIDTH_32_BIT = 3, }; struct __attribute__((__packed__)) asrc_firmware_hdr { u32 magic; u32 interp_scen; u32 prefil_scen; u32 firmware_version; }; struct __attribute__((__packed__)) interp_params { u32 magic; u32 num_taps; u32 num_phases; u64 center_tap; u64 coeff[8192]; }; struct __attribute__((__packed__)) prefil_params { u32 magic; u32 insr; u32 outsr; u32 st1_taps; u32 st2_taps; u32 st1_exp; u64 coeff[256]; }; struct dma_block { void *dma_vaddr; unsigned int length; unsigned int max_buf_size; }; struct fsl_easrc_data_fmt { unsigned int width : 2; unsigned int endianness : 1; unsigned int unsign : 1; unsigned int floating_point : 1; unsigned int iec958: 1; unsigned int sample_pos: 5; unsigned int addexp; }; struct fsl_easrc_io_params { struct fsl_easrc_data_fmt fmt; unsigned int group_len; unsigned int iterations; unsigned int access_len; unsigned int fifo_wtmk; unsigned int sample_rate; unsigned int sample_format; unsigned int norm_rate; }; struct fsl_easrc_slot { bool busy; int ctx_index; int num_channel; /*maximum is 8*/ int min_channel; int max_channel; int pf_mem_used; }; struct fsl_easrc_context { enum asrc_pair_index index; struct fsl_easrc *easrc; struct dma_chan *dma_chan[2]; struct dma_async_tx_descriptor *desc[2]; struct fsl_easrc_io_params in_params; struct fsl_easrc_io_params out_params; struct imx_dma_data dma_data; unsigned int channels; unsigned int st1_num_taps; unsigned int st2_num_taps; unsigned int st1_num_exp; unsigned int pf_init_mode; unsigned int rs_init_mode; unsigned int ctx_streams; unsigned int pos; u64 rs_ratio; u64 *st1_coeff; u64 *st2_coeff; int in_filled_sample; int out_missed_sample; int st1_addexp; int st2_addexp; void *private_data; }; /** * fsl_easrc: EASRC private data * * name : name of EASRC device * @pdev: platform device pointer * @regmap: regmap handler * @dma_params_rx: DMA parameters for receive channel * @dma_params_tx: DMA parameters for transmit channel * @ctx: context pointer * @slot: slot setting * @mem_clk: clock source to access register * @firmware_hdr: the header of firmware * @interp: pointer to interpolation filter coeff * @prefil: pointer to prefilter coeff * @fw: firmware of coeff table * @fw_name: firmware name * @paddr: physical address to the base address of registers * @rs_num_taps: resample filter taps, 32, 64, or 128 * @bps_i2c958: bits per sample of iec958 * @chn_avail: available channels, maximum 32 * @lock: spin lock for resource protection * @easrc_rate: default sample rate for ASoC Back-Ends * @easrc_format: default sample format for ASoC Back-Ends */ struct fsl_easrc { char name[32]; struct platform_device *pdev; struct regmap *regmap; struct miscdevice easrc_miscdev; struct snd_dmaengine_dai_dma_data dma_params_rx; struct snd_dmaengine_dai_dma_data dma_params_tx; struct fsl_easrc_context *ctx[EASRC_CTX_MAX_NUM]; struct fsl_easrc_slot slot[EASRC_CTX_MAX_NUM][2]; struct clk *mem_clk; struct asrc_firmware_hdr *firmware_hdr; struct interp_params *interp; struct prefil_params *prefil; const struct firmware *fw; const char *fw_name; unsigned long paddr; unsigned int rs_num_taps; unsigned int bps_iec958[EASRC_CTX_MAX_NUM]; unsigned int chn_avail; u64 *rs_coeff; u64 const_coeff; int firmware_loaded; spinlock_t lock; /* spin lock for resource protection */ int easrc_rate; int easrc_format; }; struct dma_chan *fsl_easrc_get_dma_channel( struct fsl_easrc_context *ctx, bool dir); int fsl_easrc_request_context( struct fsl_easrc_context *ctx, unsigned int channels); int fsl_easrc_release_context(struct fsl_easrc_context *ctx); #define DRV_NAME "fsl-easrc-dma" #endif /* _FSL_EASRC_H */