17358a803SSameer Pujar /* SPDX-License-Identifier: GPL-2.0-only */ 27358a803SSameer Pujar /* 37358a803SSameer Pujar * tegra210_mbdrc.h - Definitions for Tegra210 MBDRC driver 47358a803SSameer Pujar * 57358a803SSameer Pujar * Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved. 67358a803SSameer Pujar * 77358a803SSameer Pujar */ 87358a803SSameer Pujar 97358a803SSameer Pujar #ifndef __TEGRA210_MBDRC_H__ 107358a803SSameer Pujar #define __TEGRA210_MBDRC_H__ 117358a803SSameer Pujar 127358a803SSameer Pujar #include <linux/platform_device.h> 137358a803SSameer Pujar #include <sound/soc.h> 147358a803SSameer Pujar 157358a803SSameer Pujar /* Register offsets from TEGRA210_MBDRC*_BASE */ 167358a803SSameer Pujar #define TEGRA210_MBDRC_SOFT_RESET 0x4 177358a803SSameer Pujar #define TEGRA210_MBDRC_CG 0x8 187358a803SSameer Pujar #define TEGRA210_MBDRC_STATUS 0xc 197358a803SSameer Pujar #define TEGRA210_MBDRC_CFG 0x28 207358a803SSameer Pujar #define TEGRA210_MBDRC_CHANNEL_MASK 0x2c 217358a803SSameer Pujar #define TEGRA210_MBDRC_MASTER_VOL 0x30 227358a803SSameer Pujar #define TEGRA210_MBDRC_FAST_FACTOR 0x34 237358a803SSameer Pujar 247358a803SSameer Pujar #define TEGRA210_MBDRC_FILTER_COUNT 3 257358a803SSameer Pujar #define TEGRA210_MBDRC_FILTER_PARAM_STRIDE 0x4 267358a803SSameer Pujar 277358a803SSameer Pujar #define TEGRA210_MBDRC_IIR_CFG 0x38 287358a803SSameer Pujar #define TEGRA210_MBDRC_IN_ATTACK 0x44 297358a803SSameer Pujar #define TEGRA210_MBDRC_IN_RELEASE 0x50 307358a803SSameer Pujar #define TEGRA210_MBDRC_FAST_ATTACK 0x5c 317358a803SSameer Pujar #define TEGRA210_MBDRC_IN_THRESHOLD 0x68 327358a803SSameer Pujar #define TEGRA210_MBDRC_OUT_THRESHOLD 0x74 337358a803SSameer Pujar #define TEGRA210_MBDRC_RATIO_1ST 0x80 347358a803SSameer Pujar #define TEGRA210_MBDRC_RATIO_2ND 0x8c 357358a803SSameer Pujar #define TEGRA210_MBDRC_RATIO_3RD 0x98 367358a803SSameer Pujar #define TEGRA210_MBDRC_RATIO_4TH 0xa4 377358a803SSameer Pujar #define TEGRA210_MBDRC_RATIO_5TH 0xb0 387358a803SSameer Pujar #define TEGRA210_MBDRC_MAKEUP_GAIN 0xbc 397358a803SSameer Pujar #define TEGRA210_MBDRC_INIT_GAIN 0xc8 407358a803SSameer Pujar #define TEGRA210_MBDRC_GAIN_ATTACK 0xd4 417358a803SSameer Pujar #define TEGRA210_MBDRC_GAIN_RELEASE 0xe0 427358a803SSameer Pujar #define TEGRA210_MBDRC_FAST_RELEASE 0xec 437358a803SSameer Pujar #define TEGRA210_MBDRC_CFG_RAM_CTRL 0xf8 447358a803SSameer Pujar #define TEGRA210_MBDRC_CFG_RAM_DATA 0x104 457358a803SSameer Pujar 467358a803SSameer Pujar #define TEGRA210_MBDRC_MAX_REG (TEGRA210_MBDRC_CFG_RAM_DATA + \ 477358a803SSameer Pujar (TEGRA210_MBDRC_FILTER_PARAM_STRIDE * \ 487358a803SSameer Pujar (TEGRA210_MBDRC_FILTER_COUNT - 1))) 497358a803SSameer Pujar 507358a803SSameer Pujar /* Fields for TEGRA210_MBDRC_CFG */ 517358a803SSameer Pujar #define TEGRA210_MBDRC_CFG_RMS_OFFSET_SHIFT 16 527358a803SSameer Pujar #define TEGRA210_MBDRC_CFG_RMS_OFFSET_MASK (0x1ff << TEGRA210_MBDRC_CFG_RMS_OFFSET_SHIFT) 537358a803SSameer Pujar 547358a803SSameer Pujar #define TEGRA210_MBDRC_CFG_PEAK_RMS_SHIFT 14 557358a803SSameer Pujar #define TEGRA210_MBDRC_CFG_PEAK_RMS_MASK (0x1 << TEGRA210_MBDRC_CFG_PEAK_RMS_SHIFT) 567358a803SSameer Pujar #define TEGRA210_MBDRC_CFG_PEAK (1 << TEGRA210_MBDRC_CFG_PEAK_RMS_SHIFT) 577358a803SSameer Pujar 587358a803SSameer Pujar #define TEGRA210_MBDRC_CFG_FILTER_STRUCTURE_SHIFT 13 597358a803SSameer Pujar #define TEGRA210_MBDRC_CFG_FILTER_STRUCTURE_MASK (0x1 << TEGRA210_MBDRC_CFG_FILTER_STRUCTURE_SHIFT) 607358a803SSameer Pujar #define TEGRA210_MBDRC_CFG_FILTER_STRUCTURE_FLEX (1 << TEGRA210_MBDRC_CFG_FILTER_STRUCTURE_SHIFT) 617358a803SSameer Pujar 627358a803SSameer Pujar #define TEGRA210_MBDRC_CFG_SHIFT_CTRL_SHIFT 8 637358a803SSameer Pujar #define TEGRA210_MBDRC_CFG_SHIFT_CTRL_MASK (0x1f << TEGRA210_MBDRC_CFG_SHIFT_CTRL_SHIFT) 647358a803SSameer Pujar 657358a803SSameer Pujar #define TEGRA210_MBDRC_CFG_FRAME_SIZE_SHIFT 4 667358a803SSameer Pujar #define TEGRA210_MBDRC_CFG_FRAME_SIZE_MASK (0xf << TEGRA210_MBDRC_CFG_FRAME_SIZE_SHIFT) 677358a803SSameer Pujar 687358a803SSameer Pujar #define TEGRA210_MBDRC_CFG_MBDRC_MODE_SHIFT 0 697358a803SSameer Pujar #define TEGRA210_MBDRC_CFG_MBDRC_MODE_MASK (0x3 << TEGRA210_MBDRC_CFG_MBDRC_MODE_SHIFT) 707358a803SSameer Pujar #define TEGRA210_MBDRC_CFG_MBDRC_MODE_BYPASS (0 << TEGRA210_MBDRC_CFG_MBDRC_MODE_SHIFT) 717358a803SSameer Pujar 727358a803SSameer Pujar /* Fields for TEGRA210_MBDRC_CHANNEL_MASK */ 737358a803SSameer Pujar #define TEGRA210_MBDRC_CHANNEL_MASK_SHIFT 0 747358a803SSameer Pujar #define TEGRA210_MBDRC_CHANNEL_MASK_MASK (0xff << TEGRA210_MBDRC_CHANNEL_MASK_SHIFT) 757358a803SSameer Pujar 767358a803SSameer Pujar /* Fields for TEGRA210_MBDRC_MASTER_VOL */ 777358a803SSameer Pujar #define TEGRA210_MBDRC_MASTER_VOL_SHIFT 23 787358a803SSameer Pujar #define TEGRA210_MBDRC_MASTER_VOL_MIN -256 797358a803SSameer Pujar #define TEGRA210_MBDRC_MASTER_VOL_MAX 256 807358a803SSameer Pujar 817358a803SSameer Pujar /* Fields for TEGRA210_MBDRC_FAST_FACTOR */ 827358a803SSameer Pujar #define TEGRA210_MBDRC_FAST_FACTOR_RELEASE_SHIFT 16 837358a803SSameer Pujar #define TEGRA210_MBDRC_FAST_FACTOR_RELEASE_MASK (0xffff << TEGRA210_MBDRC_FAST_FACTOR_RELEASE_SHIFT) 847358a803SSameer Pujar 857358a803SSameer Pujar #define TEGRA210_MBDRC_FAST_FACTOR_ATTACK_SHIFT 0 867358a803SSameer Pujar #define TEGRA210_MBDRC_FAST_FACTOR_ATTACK_MASK (0xffff << TEGRA210_MBDRC_FAST_FACTOR_ATTACK_SHIFT) 877358a803SSameer Pujar 887358a803SSameer Pujar /* Fields for TEGRA210_MBDRC_IIR_CFG */ 897358a803SSameer Pujar #define TEGRA210_MBDRC_IIR_CFG_NUM_STAGES_SHIFT 0 907358a803SSameer Pujar #define TEGRA210_MBDRC_IIR_CFG_NUM_STAGES_MASK (0xf << TEGRA210_MBDRC_IIR_CFG_NUM_STAGES_SHIFT) 917358a803SSameer Pujar 927358a803SSameer Pujar /* Fields for TEGRA210_MBDRC_IN_ATTACK */ 937358a803SSameer Pujar #define TEGRA210_MBDRC_IN_ATTACK_TC_SHIFT 0 947358a803SSameer Pujar #define TEGRA210_MBDRC_IN_ATTACK_TC_MASK (0xffffffff << TEGRA210_MBDRC_IN_ATTACK_TC_SHIFT) 957358a803SSameer Pujar 967358a803SSameer Pujar /* Fields for TEGRA210_MBDRC_IN_RELEASE */ 977358a803SSameer Pujar #define TEGRA210_MBDRC_IN_RELEASE_TC_SHIFT 0 987358a803SSameer Pujar #define TEGRA210_MBDRC_IN_RELEASE_TC_MASK (0xffffffff << TEGRA210_MBDRC_IN_RELEASE_TC_SHIFT) 997358a803SSameer Pujar 1007358a803SSameer Pujar /* Fields for TEGRA210_MBDRC_FAST_ATTACK */ 1017358a803SSameer Pujar #define TEGRA210_MBDRC_FAST_ATTACK_TC_SHIFT 0 1027358a803SSameer Pujar #define TEGRA210_MBDRC_FAST_ATTACK_TC_MASK (0xffffffff << TEGRA210_MBDRC_FAST_ATTACK_TC_SHIFT) 1037358a803SSameer Pujar 1047358a803SSameer Pujar /* Fields for TEGRA210_MBDRC_IN_THRESHOLD / TEGRA210_MBDRC_OUT_THRESHOLD */ 1057358a803SSameer Pujar #define TEGRA210_MBDRC_THRESH_4TH_SHIFT 24 1067358a803SSameer Pujar #define TEGRA210_MBDRC_THRESH_4TH_MASK (0xff << TEGRA210_MBDRC_THRESH_4TH_SHIFT) 1077358a803SSameer Pujar 1087358a803SSameer Pujar #define TEGRA210_MBDRC_THRESH_3RD_SHIFT 16 1097358a803SSameer Pujar #define TEGRA210_MBDRC_THRESH_3RD_MASK (0xff << TEGRA210_MBDRC_THRESH_3RD_SHIFT) 1107358a803SSameer Pujar 1117358a803SSameer Pujar #define TEGRA210_MBDRC_THRESH_2ND_SHIFT 8 1127358a803SSameer Pujar #define TEGRA210_MBDRC_THRESH_2ND_MASK (0xff << TEGRA210_MBDRC_THRESH_2ND_SHIFT) 1137358a803SSameer Pujar 1147358a803SSameer Pujar #define TEGRA210_MBDRC_THRESH_1ST_SHIFT 0 1157358a803SSameer Pujar #define TEGRA210_MBDRC_THRESH_1ST_MASK (0xff << TEGRA210_MBDRC_THRESH_1ST_SHIFT) 1167358a803SSameer Pujar 1177358a803SSameer Pujar /* Fields for TEGRA210_MBDRC_RATIO_1ST */ 1187358a803SSameer Pujar #define TEGRA210_MBDRC_RATIO_1ST_SHIFT 0 1197358a803SSameer Pujar #define TEGRA210_MBDRC_RATIO_1ST_MASK (0xffff << TEGRA210_MBDRC_RATIO_1ST_SHIFT) 1207358a803SSameer Pujar 1217358a803SSameer Pujar /* Fields for TEGRA210_MBDRC_RATIO_2ND */ 1227358a803SSameer Pujar #define TEGRA210_MBDRC_RATIO_2ND_SHIFT 0 1237358a803SSameer Pujar #define TEGRA210_MBDRC_RATIO_2ND_MASK (0xffff << TEGRA210_MBDRC_RATIO_2ND_SHIFT) 1247358a803SSameer Pujar 1257358a803SSameer Pujar /* Fields for TEGRA210_MBDRC_RATIO_3RD */ 1267358a803SSameer Pujar #define TEGRA210_MBDRC_RATIO_3RD_SHIFT 0 1277358a803SSameer Pujar #define TEGRA210_MBDRC_RATIO_3RD_MASK (0xffff << TEGRA210_MBDRC_RATIO_3RD_SHIFT) 1287358a803SSameer Pujar 1297358a803SSameer Pujar /* Fields for TEGRA210_MBDRC_RATIO_4TH */ 1307358a803SSameer Pujar #define TEGRA210_MBDRC_RATIO_4TH_SHIFT 0 1317358a803SSameer Pujar #define TEGRA210_MBDRC_RATIO_4TH_MASK (0xffff << TEGRA210_MBDRC_RATIO_4TH_SHIFT) 1327358a803SSameer Pujar 1337358a803SSameer Pujar /* Fields for TEGRA210_MBDRC_RATIO_5TH */ 1347358a803SSameer Pujar #define TEGRA210_MBDRC_RATIO_5TH_SHIFT 0 1357358a803SSameer Pujar #define TEGRA210_MBDRC_RATIO_5TH_MASK (0xffff << TEGRA210_MBDRC_RATIO_5TH_SHIFT) 1367358a803SSameer Pujar 1377358a803SSameer Pujar /* Fields for TEGRA210_MBDRC_MAKEUP_GAIN */ 1387358a803SSameer Pujar #define TEGRA210_MBDRC_MAKEUP_GAIN_SHIFT 0 1397358a803SSameer Pujar #define TEGRA210_MBDRC_MAKEUP_GAIN_MASK (0x3f << TEGRA210_MBDRC_MAKEUP_GAIN_SHIFT) 1407358a803SSameer Pujar 1417358a803SSameer Pujar /* Fields for TEGRA210_MBDRC_INIT_GAIN */ 1427358a803SSameer Pujar #define TEGRA210_MBDRC_INIT_GAIN_SHIFT 0 1437358a803SSameer Pujar #define TEGRA210_MBDRC_INIT_GAIN_MASK (0xffffffff << TEGRA210_MBDRC_INIT_GAIN_SHIFT) 1447358a803SSameer Pujar 1457358a803SSameer Pujar /* Fields for TEGRA210_MBDRC_GAIN_ATTACK */ 1467358a803SSameer Pujar #define TEGRA210_MBDRC_GAIN_ATTACK_SHIFT 0 1477358a803SSameer Pujar #define TEGRA210_MBDRC_GAIN_ATTACK_MASK (0xffffffff << TEGRA210_MBDRC_GAIN_ATTACK_SHIFT) 1487358a803SSameer Pujar 1497358a803SSameer Pujar /* Fields for TEGRA210_MBDRC_GAIN_RELEASE */ 1507358a803SSameer Pujar #define TEGRA210_MBDRC_GAIN_RELEASE_SHIFT 0 1517358a803SSameer Pujar #define TEGRA210_MBDRC_GAIN_RELEASE_MASK (0xffffffff << TEGRA210_MBDRC_GAIN_RELEASE_SHIFT) 1527358a803SSameer Pujar 1537358a803SSameer Pujar /* Fields for TEGRA210_MBDRC_FAST_RELEASE */ 1547358a803SSameer Pujar #define TEGRA210_MBDRC_FAST_RELEASE_SHIFT 0 1557358a803SSameer Pujar #define TEGRA210_MBDRC_FAST_RELEASE_MASK (0xffffffff << TEGRA210_MBDRC_FAST_RELEASE_SHIFT) 1567358a803SSameer Pujar 1577358a803SSameer Pujar #define TEGRA210_MBDRC_RAM_CTRL_RW_READ 0 1587358a803SSameer Pujar #define TEGRA210_MBDRC_RAM_CTRL_RW_WRITE (1 << 14) 1597358a803SSameer Pujar #define TEGRA210_MBDRC_RAM_CTRL_ADDR_INIT_EN (1 << 13) 1607358a803SSameer Pujar #define TEGRA210_MBDRC_RAM_CTRL_SEQ_ACCESS_EN (1 << 12) 1617358a803SSameer Pujar #define TEGRA210_MBDRC_RAM_CTRL_RAM_ADDR_MASK 0x1ff 1627358a803SSameer Pujar 1637358a803SSameer Pujar /* 1647358a803SSameer Pujar * Order and size of each structure element for following structures should not 1657358a803SSameer Pujar * be altered size order of elements and their size are based on PEQ co-eff ram 1667358a803SSameer Pujar * and shift ram layout. 1677358a803SSameer Pujar */ 1687358a803SSameer Pujar #define TEGRA210_MBDRC_THRESHOLD_NUM 4 1697358a803SSameer Pujar #define TEGRA210_MBDRC_RATIO_NUM (TEGRA210_MBDRC_THRESHOLD_NUM + 1) 1707358a803SSameer Pujar #define TEGRA210_MBDRC_MAX_BIQUAD_STAGES 8 1717358a803SSameer Pujar 1727358a803SSameer Pujar /* Order of these enums are same as the order of band specific hw registers */ 1737358a803SSameer Pujar enum { 1747358a803SSameer Pujar MBDRC_LOW_BAND, 1757358a803SSameer Pujar MBDRC_MID_BAND, 1767358a803SSameer Pujar MBDRC_HIGH_BAND, 1777358a803SSameer Pujar MBDRC_NUM_BAND, 1787358a803SSameer Pujar }; 1797358a803SSameer Pujar 1807358a803SSameer Pujar struct tegra210_mbdrc_band_params { 1817358a803SSameer Pujar u32 band; 1827358a803SSameer Pujar u32 iir_stages; 1837358a803SSameer Pujar u32 in_attack_tc; 1847358a803SSameer Pujar u32 in_release_tc; 1857358a803SSameer Pujar u32 fast_attack_tc; 1867358a803SSameer Pujar u32 in_threshold[TEGRA210_MBDRC_THRESHOLD_NUM]; 1877358a803SSameer Pujar u32 out_threshold[TEGRA210_MBDRC_THRESHOLD_NUM]; 1887358a803SSameer Pujar u32 ratio[TEGRA210_MBDRC_RATIO_NUM]; 1897358a803SSameer Pujar u32 makeup_gain; 1907358a803SSameer Pujar u32 gain_init; 1917358a803SSameer Pujar u32 gain_attack_tc; 1927358a803SSameer Pujar u32 gain_release_tc; 1937358a803SSameer Pujar u32 fast_release_tc; 1947358a803SSameer Pujar /* For biquad_params[][5] order of coeff is b0, b1, a0, a1, a2 */ 1957358a803SSameer Pujar u32 biquad_params[TEGRA210_MBDRC_MAX_BIQUAD_STAGES * 5]; 1967358a803SSameer Pujar }; 1977358a803SSameer Pujar 1987358a803SSameer Pujar struct tegra210_mbdrc_config { 1997358a803SSameer Pujar unsigned int mode; 2007358a803SSameer Pujar unsigned int rms_off; 2017358a803SSameer Pujar unsigned int peak_rms_mode; 202*f8dc9cd9SColin Ian King unsigned int filter_structure; 2037358a803SSameer Pujar unsigned int shift_ctrl; 2047358a803SSameer Pujar unsigned int frame_size; 2057358a803SSameer Pujar unsigned int channel_mask; 2067358a803SSameer Pujar unsigned int fa_factor; /* Fast attack factor */ 2077358a803SSameer Pujar unsigned int fr_factor; /* Fast release factor */ 2087358a803SSameer Pujar struct tegra210_mbdrc_band_params band_params[MBDRC_NUM_BAND]; 2097358a803SSameer Pujar }; 2107358a803SSameer Pujar 2117358a803SSameer Pujar int tegra210_mbdrc_regmap_init(struct platform_device *pdev); 2127358a803SSameer Pujar int tegra210_mbdrc_component_init(struct snd_soc_component *cmpnt); 2137358a803SSameer Pujar int tegra210_mbdrc_hw_params(struct snd_soc_component *cmpnt); 2147358a803SSameer Pujar 2157358a803SSameer Pujar #endif 216