1125ab5d5SJiaxin Yu /* SPDX-License-Identifier: GPL-2.0 */ 2125ab5d5SJiaxin Yu /* 3125ab5d5SJiaxin Yu * mt8192-afe-clk.h -- Mediatek 8192 afe clock ctrl definition 4125ab5d5SJiaxin Yu * 5125ab5d5SJiaxin Yu * Copyright (c) 2020 MediaTek Inc. 6125ab5d5SJiaxin Yu * Author: Shane Chien <shane.chien@mediatek.com> 7125ab5d5SJiaxin Yu */ 8125ab5d5SJiaxin Yu 9125ab5d5SJiaxin Yu #ifndef _MT8192_AFE_CLOCK_CTRL_H_ 10125ab5d5SJiaxin Yu #define _MT8192_AFE_CLOCK_CTRL_H_ 11125ab5d5SJiaxin Yu 12125ab5d5SJiaxin Yu #define AP_PLL_CON3 0x0014 13125ab5d5SJiaxin Yu #define APLL1_CON0 0x0318 14125ab5d5SJiaxin Yu #define APLL1_CON1 0x031c 15125ab5d5SJiaxin Yu #define APLL1_CON2 0x0320 16125ab5d5SJiaxin Yu #define APLL1_CON4 0x0328 17125ab5d5SJiaxin Yu #define APLL1_TUNER_CON0 0x0040 18125ab5d5SJiaxin Yu 19125ab5d5SJiaxin Yu #define APLL2_CON0 0x032c 20125ab5d5SJiaxin Yu #define APLL2_CON1 0x0330 21125ab5d5SJiaxin Yu #define APLL2_CON2 0x0334 22125ab5d5SJiaxin Yu #define APLL2_CON4 0x033c 23125ab5d5SJiaxin Yu #define APLL2_TUNER_CON0 0x0044 24125ab5d5SJiaxin Yu 25125ab5d5SJiaxin Yu #define CLK_CFG_7 0x0080 26125ab5d5SJiaxin Yu #define CLK_CFG_8 0x0090 27125ab5d5SJiaxin Yu #define CLK_CFG_11 0x00c0 28125ab5d5SJiaxin Yu #define CLK_CFG_12 0x00d0 29125ab5d5SJiaxin Yu #define CLK_CFG_13 0x00e0 30125ab5d5SJiaxin Yu #define CLK_CFG_15 0x0100 31125ab5d5SJiaxin Yu 32125ab5d5SJiaxin Yu #define CLK_AUDDIV_0 0x0320 33125ab5d5SJiaxin Yu #define CLK_AUDDIV_2 0x0328 34125ab5d5SJiaxin Yu #define CLK_AUDDIV_3 0x0334 35125ab5d5SJiaxin Yu #define CLK_AUDDIV_4 0x0338 36125ab5d5SJiaxin Yu #define CKSYS_AUD_TOP_CFG 0x032c 37125ab5d5SJiaxin Yu #define CKSYS_AUD_TOP_MON 0x0330 38125ab5d5SJiaxin Yu 39125ab5d5SJiaxin Yu #define PERI_BUS_DCM_CTRL 0x0074 40125ab5d5SJiaxin Yu #define MODULE_SW_CG_1_STA 0x0094 41125ab5d5SJiaxin Yu #define MODULE_SW_CG_2_STA 0x00ac 42125ab5d5SJiaxin Yu 43125ab5d5SJiaxin Yu /* CLK_AUDDIV_0 */ 44125ab5d5SJiaxin Yu #define APLL12_DIV0_PDN_SFT 0 45125ab5d5SJiaxin Yu #define APLL12_DIV0_PDN_MASK 0x1 46125ab5d5SJiaxin Yu #define APLL12_DIV0_PDN_MASK_SFT (0x1 << 0) 47125ab5d5SJiaxin Yu #define APLL12_DIV1_PDN_SFT 1 48125ab5d5SJiaxin Yu #define APLL12_DIV1_PDN_MASK 0x1 49125ab5d5SJiaxin Yu #define APLL12_DIV1_PDN_MASK_SFT (0x1 << 1) 50125ab5d5SJiaxin Yu #define APLL12_DIV2_PDN_SFT 2 51125ab5d5SJiaxin Yu #define APLL12_DIV2_PDN_MASK 0x1 52125ab5d5SJiaxin Yu #define APLL12_DIV2_PDN_MASK_SFT (0x1 << 2) 53125ab5d5SJiaxin Yu #define APLL12_DIV3_PDN_SFT 3 54125ab5d5SJiaxin Yu #define APLL12_DIV3_PDN_MASK 0x1 55125ab5d5SJiaxin Yu #define APLL12_DIV3_PDN_MASK_SFT (0x1 << 3) 56125ab5d5SJiaxin Yu #define APLL12_DIV4_PDN_SFT 4 57125ab5d5SJiaxin Yu #define APLL12_DIV4_PDN_MASK 0x1 58125ab5d5SJiaxin Yu #define APLL12_DIV4_PDN_MASK_SFT (0x1 << 4) 59125ab5d5SJiaxin Yu #define APLL12_DIVB_PDN_SFT 5 60125ab5d5SJiaxin Yu #define APLL12_DIVB_PDN_MASK 0x1 61125ab5d5SJiaxin Yu #define APLL12_DIVB_PDN_MASK_SFT (0x1 << 5) 62125ab5d5SJiaxin Yu #define APLL12_DIV5_PDN_SFT 6 63125ab5d5SJiaxin Yu #define APLL12_DIV5_PDN_MASK 0x1 64125ab5d5SJiaxin Yu #define APLL12_DIV5_PDN_MASK_SFT (0x1 << 6) 65125ab5d5SJiaxin Yu #define APLL12_DIV6_PDN_SFT 7 66125ab5d5SJiaxin Yu #define APLL12_DIV6_PDN_MASK 0x1 67125ab5d5SJiaxin Yu #define APLL12_DIV6_PDN_MASK_SFT (0x1 << 7) 68125ab5d5SJiaxin Yu #define APLL12_DIV7_PDN_SFT 8 69125ab5d5SJiaxin Yu #define APLL12_DIV7_PDN_MASK 0x1 70125ab5d5SJiaxin Yu #define APLL12_DIV7_PDN_MASK_SFT (0x1 << 8) 71125ab5d5SJiaxin Yu #define APLL12_DIV8_PDN_SFT 9 72125ab5d5SJiaxin Yu #define APLL12_DIV8_PDN_MASK 0x1 73125ab5d5SJiaxin Yu #define APLL12_DIV8_PDN_MASK_SFT (0x1 << 9) 74125ab5d5SJiaxin Yu #define APLL12_DIV9_PDN_SFT 10 75125ab5d5SJiaxin Yu #define APLL12_DIV9_PDN_MASK 0x1 76125ab5d5SJiaxin Yu #define APLL12_DIV9_PDN_MASK_SFT (0x1 << 10) 77125ab5d5SJiaxin Yu #define APLL_I2S0_MCK_SEL_SFT 16 78125ab5d5SJiaxin Yu #define APLL_I2S0_MCK_SEL_MASK 0x1 79125ab5d5SJiaxin Yu #define APLL_I2S0_MCK_SEL_MASK_SFT (0x1 << 16) 80125ab5d5SJiaxin Yu #define APLL_I2S1_MCK_SEL_SFT 17 81125ab5d5SJiaxin Yu #define APLL_I2S1_MCK_SEL_MASK 0x1 82125ab5d5SJiaxin Yu #define APLL_I2S1_MCK_SEL_MASK_SFT (0x1 << 17) 83125ab5d5SJiaxin Yu #define APLL_I2S2_MCK_SEL_SFT 18 84125ab5d5SJiaxin Yu #define APLL_I2S2_MCK_SEL_MASK 0x1 85125ab5d5SJiaxin Yu #define APLL_I2S2_MCK_SEL_MASK_SFT (0x1 << 18) 86125ab5d5SJiaxin Yu #define APLL_I2S3_MCK_SEL_SFT 19 87125ab5d5SJiaxin Yu #define APLL_I2S3_MCK_SEL_MASK 0x1 88125ab5d5SJiaxin Yu #define APLL_I2S3_MCK_SEL_MASK_SFT (0x1 << 19) 89125ab5d5SJiaxin Yu #define APLL_I2S4_MCK_SEL_SFT 20 90125ab5d5SJiaxin Yu #define APLL_I2S4_MCK_SEL_MASK 0x1 91125ab5d5SJiaxin Yu #define APLL_I2S4_MCK_SEL_MASK_SFT (0x1 << 20) 92125ab5d5SJiaxin Yu #define APLL_I2S5_MCK_SEL_SFT 21 93125ab5d5SJiaxin Yu #define APLL_I2S5_MCK_SEL_MASK 0x1 94125ab5d5SJiaxin Yu #define APLL_I2S5_MCK_SEL_MASK_SFT (0x1 << 21) 95125ab5d5SJiaxin Yu #define APLL_I2S6_MCK_SEL_SFT 22 96125ab5d5SJiaxin Yu #define APLL_I2S6_MCK_SEL_MASK 0x1 97125ab5d5SJiaxin Yu #define APLL_I2S6_MCK_SEL_MASK_SFT (0x1 << 22) 98125ab5d5SJiaxin Yu #define APLL_I2S7_MCK_SEL_SFT 23 99125ab5d5SJiaxin Yu #define APLL_I2S7_MCK_SEL_MASK 0x1 100125ab5d5SJiaxin Yu #define APLL_I2S7_MCK_SEL_MASK_SFT (0x1 << 23) 101125ab5d5SJiaxin Yu #define APLL_I2S8_MCK_SEL_SFT 24 102125ab5d5SJiaxin Yu #define APLL_I2S8_MCK_SEL_MASK 0x1 103125ab5d5SJiaxin Yu #define APLL_I2S8_MCK_SEL_MASK_SFT (0x1 << 24) 104125ab5d5SJiaxin Yu #define APLL_I2S9_MCK_SEL_SFT 25 105125ab5d5SJiaxin Yu #define APLL_I2S9_MCK_SEL_MASK 0x1 106125ab5d5SJiaxin Yu #define APLL_I2S9_MCK_SEL_MASK_SFT (0x1 << 25) 107125ab5d5SJiaxin Yu 108125ab5d5SJiaxin Yu /* CLK_AUDDIV_2 */ 109125ab5d5SJiaxin Yu #define APLL12_CK_DIV0_SFT 0 110125ab5d5SJiaxin Yu #define APLL12_CK_DIV0_MASK 0xff 111125ab5d5SJiaxin Yu #define APLL12_CK_DIV0_MASK_SFT (0xff << 0) 112125ab5d5SJiaxin Yu #define APLL12_CK_DIV1_SFT 8 113125ab5d5SJiaxin Yu #define APLL12_CK_DIV1_MASK 0xff 114125ab5d5SJiaxin Yu #define APLL12_CK_DIV1_MASK_SFT (0xff << 8) 115125ab5d5SJiaxin Yu #define APLL12_CK_DIV2_SFT 16 116125ab5d5SJiaxin Yu #define APLL12_CK_DIV2_MASK 0xff 117125ab5d5SJiaxin Yu #define APLL12_CK_DIV2_MASK_SFT (0xff << 16) 118125ab5d5SJiaxin Yu #define APLL12_CK_DIV3_SFT 24 119125ab5d5SJiaxin Yu #define APLL12_CK_DIV3_MASK 0xff 120125ab5d5SJiaxin Yu #define APLL12_CK_DIV3_MASK_SFT (0xff << 24) 121125ab5d5SJiaxin Yu 122125ab5d5SJiaxin Yu /* CLK_AUDDIV_3 */ 123125ab5d5SJiaxin Yu #define APLL12_CK_DIV4_SFT 0 124125ab5d5SJiaxin Yu #define APLL12_CK_DIV4_MASK 0xff 125125ab5d5SJiaxin Yu #define APLL12_CK_DIV4_MASK_SFT (0xff << 0) 126125ab5d5SJiaxin Yu #define APLL12_CK_DIVB_SFT 8 127125ab5d5SJiaxin Yu #define APLL12_CK_DIVB_MASK 0xff 128125ab5d5SJiaxin Yu #define APLL12_CK_DIVB_MASK_SFT (0xff << 8) 129125ab5d5SJiaxin Yu #define APLL12_CK_DIV5_SFT 16 130125ab5d5SJiaxin Yu #define APLL12_CK_DIV5_MASK 0xff 131125ab5d5SJiaxin Yu #define APLL12_CK_DIV5_MASK_SFT (0xff << 16) 132125ab5d5SJiaxin Yu #define APLL12_CK_DIV6_SFT 24 133125ab5d5SJiaxin Yu #define APLL12_CK_DIV6_MASK 0xff 134125ab5d5SJiaxin Yu #define APLL12_CK_DIV6_MASK_SFT (0xff << 24) 135125ab5d5SJiaxin Yu 136125ab5d5SJiaxin Yu /* CLK_AUDDIV_4 */ 137125ab5d5SJiaxin Yu #define APLL12_CK_DIV7_SFT 0 138125ab5d5SJiaxin Yu #define APLL12_CK_DIV7_MASK 0xff 139125ab5d5SJiaxin Yu #define APLL12_CK_DIV7_MASK_SFT (0xff << 0) 140125ab5d5SJiaxin Yu #define APLL12_CK_DIV8_SFT 8 141125ab5d5SJiaxin Yu #define APLL12_CK_DIV8_MASK 0xff 142125ab5d5SJiaxin Yu #define APLL12_CK_DIV8_MASK_SFT (0xff << 0) 143125ab5d5SJiaxin Yu #define APLL12_CK_DIV9_SFT 16 144125ab5d5SJiaxin Yu #define APLL12_CK_DIV9_MASK 0xff 145125ab5d5SJiaxin Yu #define APLL12_CK_DIV9_MASK_SFT (0xff << 0) 146125ab5d5SJiaxin Yu 147125ab5d5SJiaxin Yu /* AUD_TOP_CFG */ 148125ab5d5SJiaxin Yu #define AUD_TOP_CFG_SFT 0 149125ab5d5SJiaxin Yu #define AUD_TOP_CFG_MASK 0xffffffff 150125ab5d5SJiaxin Yu #define AUD_TOP_CFG_MASK_SFT (0xffffffff << 0) 151125ab5d5SJiaxin Yu 152125ab5d5SJiaxin Yu /* AUD_TOP_MON */ 153125ab5d5SJiaxin Yu #define AUD_TOP_MON_SFT 0 154125ab5d5SJiaxin Yu #define AUD_TOP_MON_MASK 0xffffffff 155125ab5d5SJiaxin Yu #define AUD_TOP_MON_MASK_SFT (0xffffffff << 0) 156125ab5d5SJiaxin Yu 157125ab5d5SJiaxin Yu /* CLK_AUDDIV_3 */ 158125ab5d5SJiaxin Yu #define APLL12_CK_DIV5_MSB_SFT 0 159125ab5d5SJiaxin Yu #define APLL12_CK_DIV5_MSB_MASK 0xf 160125ab5d5SJiaxin Yu #define APLL12_CK_DIV5_MSB_MASK_SFT (0xf << 0) 161125ab5d5SJiaxin Yu #define RESERVED0_SFT 4 162125ab5d5SJiaxin Yu #define RESERVED0_MASK 0xfffffff 163125ab5d5SJiaxin Yu #define RESERVED0_MASK_SFT (0xfffffff << 4) 164125ab5d5SJiaxin Yu 165125ab5d5SJiaxin Yu /* APLL */ 166125ab5d5SJiaxin Yu #define APLL1_W_NAME "APLL1" 167125ab5d5SJiaxin Yu #define APLL2_W_NAME "APLL2" 168125ab5d5SJiaxin Yu enum { 169125ab5d5SJiaxin Yu MT8192_APLL1 = 0, 170125ab5d5SJiaxin Yu MT8192_APLL2, 171125ab5d5SJiaxin Yu }; 172125ab5d5SJiaxin Yu 173125ab5d5SJiaxin Yu enum { 174125ab5d5SJiaxin Yu CLK_AFE = 0, 175125ab5d5SJiaxin Yu CLK_TML, 176125ab5d5SJiaxin Yu CLK_APLL22M, 177125ab5d5SJiaxin Yu CLK_APLL24M, 178125ab5d5SJiaxin Yu CLK_APLL1_TUNER, 179125ab5d5SJiaxin Yu CLK_APLL2_TUNER, 180125ab5d5SJiaxin Yu CLK_NLE, 181125ab5d5SJiaxin Yu CLK_INFRA_SYS_AUDIO, 182125ab5d5SJiaxin Yu CLK_INFRA_AUDIO_26M, 183125ab5d5SJiaxin Yu CLK_MUX_AUDIO, 184125ab5d5SJiaxin Yu CLK_MUX_AUDIOINTBUS, 185125ab5d5SJiaxin Yu CLK_TOP_MAINPLL_D4_D4, 186125ab5d5SJiaxin Yu /* apll related mux */ 187125ab5d5SJiaxin Yu CLK_TOP_MUX_AUD_1, 188125ab5d5SJiaxin Yu CLK_TOP_APLL1_CK, 189125ab5d5SJiaxin Yu CLK_TOP_MUX_AUD_2, 190125ab5d5SJiaxin Yu CLK_TOP_APLL2_CK, 191125ab5d5SJiaxin Yu CLK_TOP_MUX_AUD_ENG1, 192125ab5d5SJiaxin Yu CLK_TOP_APLL1_D4, 193125ab5d5SJiaxin Yu CLK_TOP_MUX_AUD_ENG2, 194125ab5d5SJiaxin Yu CLK_TOP_APLL2_D4, 195125ab5d5SJiaxin Yu CLK_TOP_MUX_AUDIO_H, 196125ab5d5SJiaxin Yu CLK_TOP_I2S0_M_SEL, 197125ab5d5SJiaxin Yu CLK_TOP_I2S1_M_SEL, 198125ab5d5SJiaxin Yu CLK_TOP_I2S2_M_SEL, 199125ab5d5SJiaxin Yu CLK_TOP_I2S3_M_SEL, 200125ab5d5SJiaxin Yu CLK_TOP_I2S4_M_SEL, 201125ab5d5SJiaxin Yu CLK_TOP_I2S5_M_SEL, 202125ab5d5SJiaxin Yu CLK_TOP_I2S6_M_SEL, 203125ab5d5SJiaxin Yu CLK_TOP_I2S7_M_SEL, 204125ab5d5SJiaxin Yu CLK_TOP_I2S8_M_SEL, 205125ab5d5SJiaxin Yu CLK_TOP_I2S9_M_SEL, 206125ab5d5SJiaxin Yu CLK_TOP_APLL12_DIV0, 207125ab5d5SJiaxin Yu CLK_TOP_APLL12_DIV1, 208125ab5d5SJiaxin Yu CLK_TOP_APLL12_DIV2, 209125ab5d5SJiaxin Yu CLK_TOP_APLL12_DIV3, 210125ab5d5SJiaxin Yu CLK_TOP_APLL12_DIV4, 211125ab5d5SJiaxin Yu CLK_TOP_APLL12_DIVB, 212125ab5d5SJiaxin Yu CLK_TOP_APLL12_DIV5, 213125ab5d5SJiaxin Yu CLK_TOP_APLL12_DIV6, 214125ab5d5SJiaxin Yu CLK_TOP_APLL12_DIV7, 215125ab5d5SJiaxin Yu CLK_TOP_APLL12_DIV8, 216125ab5d5SJiaxin Yu CLK_TOP_APLL12_DIV9, 217125ab5d5SJiaxin Yu CLK_CLK26M, 218125ab5d5SJiaxin Yu CLK_NUM 219125ab5d5SJiaxin Yu }; 220125ab5d5SJiaxin Yu 221125ab5d5SJiaxin Yu struct mtk_base_afe; 222125ab5d5SJiaxin Yu 223125ab5d5SJiaxin Yu int mt8192_init_clock(struct mtk_base_afe *afe); 224125ab5d5SJiaxin Yu int mt8192_afe_enable_clock(struct mtk_base_afe *afe); 225125ab5d5SJiaxin Yu void mt8192_afe_disable_clock(struct mtk_base_afe *afe); 226125ab5d5SJiaxin Yu 227125ab5d5SJiaxin Yu int mt8192_apll1_enable(struct mtk_base_afe *afe); 228125ab5d5SJiaxin Yu void mt8192_apll1_disable(struct mtk_base_afe *afe); 229125ab5d5SJiaxin Yu 230125ab5d5SJiaxin Yu int mt8192_apll2_enable(struct mtk_base_afe *afe); 231125ab5d5SJiaxin Yu void mt8192_apll2_disable(struct mtk_base_afe *afe); 232125ab5d5SJiaxin Yu 233125ab5d5SJiaxin Yu int mt8192_get_apll_rate(struct mtk_base_afe *afe, int apll); 234125ab5d5SJiaxin Yu int mt8192_get_apll_by_rate(struct mtk_base_afe *afe, int rate); 235125ab5d5SJiaxin Yu int mt8192_get_apll_by_name(struct mtk_base_afe *afe, const char *name); 236125ab5d5SJiaxin Yu 237125ab5d5SJiaxin Yu /* these will be replaced by using CCF */ 238125ab5d5SJiaxin Yu int mt8192_mck_enable(struct mtk_base_afe *afe, int mck_id, int rate); 239125ab5d5SJiaxin Yu void mt8192_mck_disable(struct mtk_base_afe *afe, int mck_id); 240125ab5d5SJiaxin Yu 241125ab5d5SJiaxin Yu int mt8192_set_audio_int_bus_parent(struct mtk_base_afe *afe, 242125ab5d5SJiaxin Yu int clk_id); 243125ab5d5SJiaxin Yu 244125ab5d5SJiaxin Yu #endif 245