linux/sound/soc/mediatek/mt8183/mt8183-afe-clk.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2//
   3// mt8183-afe-clk.c  --  Mediatek 8183 afe clock ctrl
   4//
   5// Copyright (c) 2018 MediaTek Inc.
   6// Author: KaiChieh Chuang <kaichieh.chuang@mediatek.com>
   7
   8#include <linux/clk.h>
   9
  10#include "mt8183-afe-common.h"
  11#include "mt8183-afe-clk.h"
  12#include "mt8183-reg.h"
  13
  14enum {
  15        CLK_AFE = 0,
  16        CLK_TML,
  17        CLK_APLL22M,
  18        CLK_APLL24M,
  19        CLK_APLL1_TUNER,
  20        CLK_APLL2_TUNER,
  21        CLK_I2S1_BCLK_SW,
  22        CLK_I2S2_BCLK_SW,
  23        CLK_I2S3_BCLK_SW,
  24        CLK_I2S4_BCLK_SW,
  25        CLK_INFRA_SYS_AUDIO,
  26        CLK_MUX_AUDIO,
  27        CLK_MUX_AUDIOINTBUS,
  28        CLK_TOP_SYSPLL_D2_D4,
  29        /* apll related mux */
  30        CLK_TOP_MUX_AUD_1,
  31        CLK_TOP_APLL1_CK,
  32        CLK_TOP_MUX_AUD_2,
  33        CLK_TOP_APLL2_CK,
  34        CLK_TOP_MUX_AUD_ENG1,
  35        CLK_TOP_APLL1_D8,
  36        CLK_TOP_MUX_AUD_ENG2,
  37        CLK_TOP_APLL2_D8,
  38        CLK_TOP_I2S0_M_SEL,
  39        CLK_TOP_I2S1_M_SEL,
  40        CLK_TOP_I2S2_M_SEL,
  41        CLK_TOP_I2S3_M_SEL,
  42        CLK_TOP_I2S4_M_SEL,
  43        CLK_TOP_I2S5_M_SEL,
  44        CLK_TOP_APLL12_DIV0,
  45        CLK_TOP_APLL12_DIV1,
  46        CLK_TOP_APLL12_DIV2,
  47        CLK_TOP_APLL12_DIV3,
  48        CLK_TOP_APLL12_DIV4,
  49        CLK_TOP_APLL12_DIVB,
  50        CLK_CLK26M,
  51        CLK_NUM
  52};
  53
  54static const char *aud_clks[CLK_NUM] = {
  55        [CLK_AFE] = "aud_afe_clk",
  56        [CLK_TML] = "aud_tml_clk",
  57        [CLK_APLL22M] = "aud_apll22m_clk",
  58        [CLK_APLL24M] = "aud_apll24m_clk",
  59        [CLK_APLL1_TUNER] = "aud_apll1_tuner_clk",
  60        [CLK_APLL2_TUNER] = "aud_apll2_tuner_clk",
  61        [CLK_I2S1_BCLK_SW] = "aud_i2s1_bclk_sw",
  62        [CLK_I2S2_BCLK_SW] = "aud_i2s2_bclk_sw",
  63        [CLK_I2S3_BCLK_SW] = "aud_i2s3_bclk_sw",
  64        [CLK_I2S4_BCLK_SW] = "aud_i2s4_bclk_sw",
  65        [CLK_INFRA_SYS_AUDIO] = "aud_infra_clk",
  66        [CLK_MUX_AUDIO] = "top_mux_audio",
  67        [CLK_MUX_AUDIOINTBUS] = "top_mux_aud_intbus",
  68        [CLK_TOP_SYSPLL_D2_D4] = "top_syspll_d2_d4",
  69        [CLK_TOP_MUX_AUD_1] = "top_mux_aud_1",
  70        [CLK_TOP_APLL1_CK] = "top_apll1_ck",
  71        [CLK_TOP_MUX_AUD_2] = "top_mux_aud_2",
  72        [CLK_TOP_APLL2_CK] = "top_apll2_ck",
  73        [CLK_TOP_MUX_AUD_ENG1] = "top_mux_aud_eng1",
  74        [CLK_TOP_APLL1_D8] = "top_apll1_d8",
  75        [CLK_TOP_MUX_AUD_ENG2] = "top_mux_aud_eng2",
  76        [CLK_TOP_APLL2_D8] = "top_apll2_d8",
  77        [CLK_TOP_I2S0_M_SEL] = "top_i2s0_m_sel",
  78        [CLK_TOP_I2S1_M_SEL] = "top_i2s1_m_sel",
  79        [CLK_TOP_I2S2_M_SEL] = "top_i2s2_m_sel",
  80        [CLK_TOP_I2S3_M_SEL] = "top_i2s3_m_sel",
  81        [CLK_TOP_I2S4_M_SEL] = "top_i2s4_m_sel",
  82        [CLK_TOP_I2S5_M_SEL] = "top_i2s5_m_sel",
  83        [CLK_TOP_APLL12_DIV0] = "top_apll12_div0",
  84        [CLK_TOP_APLL12_DIV1] = "top_apll12_div1",
  85        [CLK_TOP_APLL12_DIV2] = "top_apll12_div2",
  86        [CLK_TOP_APLL12_DIV3] = "top_apll12_div3",
  87        [CLK_TOP_APLL12_DIV4] = "top_apll12_div4",
  88        [CLK_TOP_APLL12_DIVB] = "top_apll12_divb",
  89        [CLK_CLK26M] = "top_clk26m_clk",
  90};
  91
  92int mt8183_init_clock(struct mtk_base_afe *afe)
  93{
  94        struct mt8183_afe_private *afe_priv = afe->platform_priv;
  95        int i;
  96
  97        afe_priv->clk = devm_kcalloc(afe->dev, CLK_NUM, sizeof(*afe_priv->clk),
  98                                     GFP_KERNEL);
  99        if (!afe_priv->clk)
 100                return -ENOMEM;
 101
 102        for (i = 0; i < CLK_NUM; i++) {
 103                afe_priv->clk[i] = devm_clk_get(afe->dev, aud_clks[i]);
 104                if (IS_ERR(afe_priv->clk[i])) {
 105                        dev_err(afe->dev, "%s(), devm_clk_get %s fail, ret %ld\n",
 106                                __func__, aud_clks[i],
 107                                PTR_ERR(afe_priv->clk[i]));
 108                        return PTR_ERR(afe_priv->clk[i]);
 109                }
 110        }
 111
 112        return 0;
 113}
 114
 115int mt8183_afe_enable_clock(struct mtk_base_afe *afe)
 116{
 117        struct mt8183_afe_private *afe_priv = afe->platform_priv;
 118        int ret;
 119
 120        ret = clk_prepare_enable(afe_priv->clk[CLK_INFRA_SYS_AUDIO]);
 121        if (ret) {
 122                dev_err(afe->dev, "%s(), clk_prepare_enable %s fail %d\n",
 123                        __func__, aud_clks[CLK_INFRA_SYS_AUDIO], ret);
 124                goto CLK_INFRA_SYS_AUDIO_ERR;
 125        }
 126
 127        ret = clk_prepare_enable(afe_priv->clk[CLK_MUX_AUDIO]);
 128        if (ret) {
 129                dev_err(afe->dev, "%s(), clk_prepare_enable %s fail %d\n",
 130                        __func__, aud_clks[CLK_MUX_AUDIO], ret);
 131                goto CLK_MUX_AUDIO_ERR;
 132        }
 133
 134        ret = clk_set_parent(afe_priv->clk[CLK_MUX_AUDIO],
 135                             afe_priv->clk[CLK_CLK26M]);
 136        if (ret) {
 137                dev_err(afe->dev, "%s(), clk_set_parent %s-%s fail %d\n",
 138                        __func__, aud_clks[CLK_MUX_AUDIO],
 139                        aud_clks[CLK_CLK26M], ret);
 140                goto CLK_MUX_AUDIO_ERR;
 141        }
 142
 143        ret = clk_prepare_enable(afe_priv->clk[CLK_MUX_AUDIOINTBUS]);
 144        if (ret) {
 145                dev_err(afe->dev, "%s(), clk_prepare_enable %s fail %d\n",
 146                        __func__, aud_clks[CLK_MUX_AUDIOINTBUS], ret);
 147                goto CLK_MUX_AUDIO_INTBUS_ERR;
 148        }
 149
 150        ret = clk_set_parent(afe_priv->clk[CLK_MUX_AUDIOINTBUS],
 151                             afe_priv->clk[CLK_TOP_SYSPLL_D2_D4]);
 152        if (ret) {
 153                dev_err(afe->dev, "%s(), clk_set_parent %s-%s fail %d\n",
 154                        __func__, aud_clks[CLK_MUX_AUDIOINTBUS],
 155                        aud_clks[CLK_TOP_SYSPLL_D2_D4], ret);
 156                goto CLK_MUX_AUDIO_INTBUS_ERR;
 157        }
 158
 159        ret = clk_prepare_enable(afe_priv->clk[CLK_AFE]);
 160        if (ret) {
 161                dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",
 162                        __func__, aud_clks[CLK_AFE], ret);
 163                goto CLK_AFE_ERR;
 164        }
 165
 166        ret = clk_prepare_enable(afe_priv->clk[CLK_I2S1_BCLK_SW]);
 167        if (ret) {
 168                dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",
 169                        __func__, aud_clks[CLK_I2S1_BCLK_SW], ret);
 170                goto CLK_I2S1_BCLK_SW_ERR;
 171        }
 172
 173        ret = clk_prepare_enable(afe_priv->clk[CLK_I2S2_BCLK_SW]);
 174        if (ret) {
 175                dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",
 176                        __func__, aud_clks[CLK_I2S2_BCLK_SW], ret);
 177                goto CLK_I2S2_BCLK_SW_ERR;
 178        }
 179
 180        ret = clk_prepare_enable(afe_priv->clk[CLK_I2S3_BCLK_SW]);
 181        if (ret) {
 182                dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",
 183                        __func__, aud_clks[CLK_I2S3_BCLK_SW], ret);
 184                goto CLK_I2S3_BCLK_SW_ERR;
 185        }
 186
 187        ret = clk_prepare_enable(afe_priv->clk[CLK_I2S4_BCLK_SW]);
 188        if (ret) {
 189                dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",
 190                        __func__, aud_clks[CLK_I2S4_BCLK_SW], ret);
 191                goto CLK_I2S4_BCLK_SW_ERR;
 192        }
 193
 194        return 0;
 195
 196CLK_I2S4_BCLK_SW_ERR:
 197        clk_disable_unprepare(afe_priv->clk[CLK_I2S3_BCLK_SW]);
 198CLK_I2S3_BCLK_SW_ERR:
 199        clk_disable_unprepare(afe_priv->clk[CLK_I2S2_BCLK_SW]);
 200CLK_I2S2_BCLK_SW_ERR:
 201        clk_disable_unprepare(afe_priv->clk[CLK_I2S1_BCLK_SW]);
 202CLK_I2S1_BCLK_SW_ERR:
 203        clk_disable_unprepare(afe_priv->clk[CLK_AFE]);
 204CLK_AFE_ERR:
 205        clk_disable_unprepare(afe_priv->clk[CLK_MUX_AUDIOINTBUS]);
 206CLK_MUX_AUDIO_INTBUS_ERR:
 207        clk_disable_unprepare(afe_priv->clk[CLK_MUX_AUDIO]);
 208CLK_MUX_AUDIO_ERR:
 209        clk_disable_unprepare(afe_priv->clk[CLK_INFRA_SYS_AUDIO]);
 210CLK_INFRA_SYS_AUDIO_ERR:
 211        return ret;
 212}
 213
 214int mt8183_afe_disable_clock(struct mtk_base_afe *afe)
 215{
 216        struct mt8183_afe_private *afe_priv = afe->platform_priv;
 217
 218        clk_disable_unprepare(afe_priv->clk[CLK_I2S4_BCLK_SW]);
 219        clk_disable_unprepare(afe_priv->clk[CLK_I2S3_BCLK_SW]);
 220        clk_disable_unprepare(afe_priv->clk[CLK_I2S2_BCLK_SW]);
 221        clk_disable_unprepare(afe_priv->clk[CLK_I2S1_BCLK_SW]);
 222        clk_disable_unprepare(afe_priv->clk[CLK_AFE]);
 223        clk_disable_unprepare(afe_priv->clk[CLK_MUX_AUDIOINTBUS]);
 224        clk_disable_unprepare(afe_priv->clk[CLK_MUX_AUDIO]);
 225        clk_disable_unprepare(afe_priv->clk[CLK_INFRA_SYS_AUDIO]);
 226
 227        return 0;
 228}
 229
 230/* apll */
 231static int apll1_mux_setting(struct mtk_base_afe *afe, bool enable)
 232{
 233        struct mt8183_afe_private *afe_priv = afe->platform_priv;
 234        int ret;
 235
 236        if (enable) {
 237                ret = clk_prepare_enable(afe_priv->clk[CLK_TOP_MUX_AUD_1]);
 238                if (ret) {
 239                        dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",
 240                                __func__, aud_clks[CLK_TOP_MUX_AUD_1], ret);
 241                        goto ERR_ENABLE_CLK_TOP_MUX_AUD_1;
 242                }
 243                ret = clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUD_1],
 244                                     afe_priv->clk[CLK_TOP_APLL1_CK]);
 245                if (ret) {
 246                        dev_err(afe->dev, "%s clk_set_parent %s-%s fail %d\n",
 247                                __func__, aud_clks[CLK_TOP_MUX_AUD_1],
 248                                aud_clks[CLK_TOP_APLL1_CK], ret);
 249                        goto ERR_SELECT_CLK_TOP_MUX_AUD_1;
 250                }
 251
 252                /* 180.6336 / 8 = 22.5792MHz */
 253                ret = clk_prepare_enable(afe_priv->clk[CLK_TOP_MUX_AUD_ENG1]);
 254                if (ret) {
 255                        dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",
 256                                __func__, aud_clks[CLK_TOP_MUX_AUD_ENG1], ret);
 257                        goto ERR_ENABLE_CLK_TOP_MUX_AUD_ENG1;
 258                }
 259                ret = clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUD_ENG1],
 260                                     afe_priv->clk[CLK_TOP_APLL1_D8]);
 261                if (ret) {
 262                        dev_err(afe->dev, "%s clk_set_parent %s-%s fail %d\n",
 263                                __func__, aud_clks[CLK_TOP_MUX_AUD_ENG1],
 264                                aud_clks[CLK_TOP_APLL1_D8], ret);
 265                        goto ERR_SELECT_CLK_TOP_MUX_AUD_ENG1;
 266                }
 267        } else {
 268                ret = clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUD_ENG1],
 269                                     afe_priv->clk[CLK_CLK26M]);
 270                if (ret) {
 271                        dev_err(afe->dev, "%s clk_set_parent %s-%s fail %d\n",
 272                                __func__, aud_clks[CLK_TOP_MUX_AUD_ENG1],
 273                                aud_clks[CLK_CLK26M], ret);
 274                        goto EXIT;
 275                }
 276                clk_disable_unprepare(afe_priv->clk[CLK_TOP_MUX_AUD_ENG1]);
 277
 278                ret = clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUD_1],
 279                                     afe_priv->clk[CLK_CLK26M]);
 280                if (ret) {
 281                        dev_err(afe->dev, "%s clk_set_parent %s-%s fail %d\n",
 282                                __func__, aud_clks[CLK_TOP_MUX_AUD_1],
 283                                aud_clks[CLK_CLK26M], ret);
 284                        goto EXIT;
 285                }
 286                clk_disable_unprepare(afe_priv->clk[CLK_TOP_MUX_AUD_1]);
 287        }
 288
 289        return 0;
 290
 291ERR_SELECT_CLK_TOP_MUX_AUD_ENG1:
 292        clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUD_ENG1],
 293                       afe_priv->clk[CLK_CLK26M]);
 294        clk_disable_unprepare(afe_priv->clk[CLK_TOP_MUX_AUD_ENG1]);
 295ERR_ENABLE_CLK_TOP_MUX_AUD_ENG1:
 296ERR_SELECT_CLK_TOP_MUX_AUD_1:
 297        clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUD_1],
 298                       afe_priv->clk[CLK_CLK26M]);
 299        clk_disable_unprepare(afe_priv->clk[CLK_TOP_MUX_AUD_1]);
 300ERR_ENABLE_CLK_TOP_MUX_AUD_1:
 301EXIT:
 302        return ret;
 303}
 304
 305static int apll2_mux_setting(struct mtk_base_afe *afe, bool enable)
 306{
 307        struct mt8183_afe_private *afe_priv = afe->platform_priv;
 308        int ret;
 309
 310        if (enable) {
 311                ret = clk_prepare_enable(afe_priv->clk[CLK_TOP_MUX_AUD_2]);
 312                if (ret) {
 313                        dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",
 314                                __func__, aud_clks[CLK_TOP_MUX_AUD_2], ret);
 315                        goto ERR_ENABLE_CLK_TOP_MUX_AUD_2;
 316                }
 317                ret = clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUD_2],
 318                                     afe_priv->clk[CLK_TOP_APLL2_CK]);
 319                if (ret) {
 320                        dev_err(afe->dev, "%s clk_set_parent %s-%s fail %d\n",
 321                                __func__, aud_clks[CLK_TOP_MUX_AUD_2],
 322                                aud_clks[CLK_TOP_APLL2_CK], ret);
 323                        goto ERR_SELECT_CLK_TOP_MUX_AUD_2;
 324                }
 325
 326                /* 196.608 / 8 = 24.576MHz */
 327                ret = clk_prepare_enable(afe_priv->clk[CLK_TOP_MUX_AUD_ENG2]);
 328                if (ret) {
 329                        dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",
 330                                __func__, aud_clks[CLK_TOP_MUX_AUD_ENG2], ret);
 331                        goto ERR_ENABLE_CLK_TOP_MUX_AUD_ENG2;
 332                }
 333                ret = clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUD_ENG2],
 334                                     afe_priv->clk[CLK_TOP_APLL2_D8]);
 335                if (ret) {
 336                        dev_err(afe->dev, "%s clk_set_parent %s-%s fail %d\n",
 337                                __func__, aud_clks[CLK_TOP_MUX_AUD_ENG2],
 338                                aud_clks[CLK_TOP_APLL2_D8], ret);
 339                        goto ERR_SELECT_CLK_TOP_MUX_AUD_ENG2;
 340                }
 341        } else {
 342                ret = clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUD_ENG2],
 343                                     afe_priv->clk[CLK_CLK26M]);
 344                if (ret) {
 345                        dev_err(afe->dev, "%s clk_set_parent %s-%s fail %d\n",
 346                                __func__, aud_clks[CLK_TOP_MUX_AUD_ENG2],
 347                                aud_clks[CLK_CLK26M], ret);
 348                        goto EXIT;
 349                }
 350                clk_disable_unprepare(afe_priv->clk[CLK_TOP_MUX_AUD_ENG2]);
 351
 352                ret = clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUD_2],
 353                                     afe_priv->clk[CLK_CLK26M]);
 354                if (ret) {
 355                        dev_err(afe->dev, "%s clk_set_parent %s-%s fail %d\n",
 356                                __func__, aud_clks[CLK_TOP_MUX_AUD_2],
 357                                aud_clks[CLK_CLK26M], ret);
 358                        goto EXIT;
 359                }
 360                clk_disable_unprepare(afe_priv->clk[CLK_TOP_MUX_AUD_2]);
 361        }
 362
 363        return 0;
 364
 365ERR_SELECT_CLK_TOP_MUX_AUD_ENG2:
 366        clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUD_ENG2],
 367                       afe_priv->clk[CLK_CLK26M]);
 368        clk_disable_unprepare(afe_priv->clk[CLK_TOP_MUX_AUD_ENG2]);
 369ERR_ENABLE_CLK_TOP_MUX_AUD_ENG2:
 370ERR_SELECT_CLK_TOP_MUX_AUD_2:
 371        clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUD_2],
 372                       afe_priv->clk[CLK_CLK26M]);
 373        clk_disable_unprepare(afe_priv->clk[CLK_TOP_MUX_AUD_2]);
 374ERR_ENABLE_CLK_TOP_MUX_AUD_2:
 375EXIT:
 376        return ret;
 377}
 378
 379int mt8183_apll1_enable(struct mtk_base_afe *afe)
 380{
 381        struct mt8183_afe_private *afe_priv = afe->platform_priv;
 382        int ret;
 383
 384        /* setting for APLL */
 385        apll1_mux_setting(afe, true);
 386
 387        ret = clk_prepare_enable(afe_priv->clk[CLK_APLL22M]);
 388        if (ret) {
 389                dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",
 390                        __func__, aud_clks[CLK_APLL22M], ret);
 391                goto ERR_CLK_APLL22M;
 392        }
 393
 394        ret = clk_prepare_enable(afe_priv->clk[CLK_APLL1_TUNER]);
 395        if (ret) {
 396                dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",
 397                        __func__, aud_clks[CLK_APLL1_TUNER], ret);
 398                goto ERR_CLK_APLL1_TUNER;
 399        }
 400
 401        regmap_update_bits(afe->regmap, AFE_APLL1_TUNER_CFG,
 402                           0x0000FFF7, 0x00000832);
 403        regmap_update_bits(afe->regmap, AFE_APLL1_TUNER_CFG, 0x1, 0x1);
 404
 405        regmap_update_bits(afe->regmap, AFE_HD_ENGEN_ENABLE,
 406                           AFE_22M_ON_MASK_SFT,
 407                           0x1 << AFE_22M_ON_SFT);
 408
 409        return 0;
 410
 411ERR_CLK_APLL1_TUNER:
 412        clk_disable_unprepare(afe_priv->clk[CLK_APLL22M]);
 413ERR_CLK_APLL22M:
 414        return ret;
 415}
 416
 417void mt8183_apll1_disable(struct mtk_base_afe *afe)
 418{
 419        struct mt8183_afe_private *afe_priv = afe->platform_priv;
 420
 421        regmap_update_bits(afe->regmap, AFE_HD_ENGEN_ENABLE,
 422                           AFE_22M_ON_MASK_SFT,
 423                           0x0 << AFE_22M_ON_SFT);
 424
 425        regmap_update_bits(afe->regmap, AFE_APLL1_TUNER_CFG, 0x1, 0x0);
 426
 427        clk_disable_unprepare(afe_priv->clk[CLK_APLL1_TUNER]);
 428        clk_disable_unprepare(afe_priv->clk[CLK_APLL22M]);
 429
 430        apll1_mux_setting(afe, false);
 431}
 432
 433int mt8183_apll2_enable(struct mtk_base_afe *afe)
 434{
 435        struct mt8183_afe_private *afe_priv = afe->platform_priv;
 436        int ret;
 437
 438        /* setting for APLL */
 439        apll2_mux_setting(afe, true);
 440
 441        ret = clk_prepare_enable(afe_priv->clk[CLK_APLL24M]);
 442        if (ret) {
 443                dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",
 444                        __func__, aud_clks[CLK_APLL24M], ret);
 445                goto ERR_CLK_APLL24M;
 446        }
 447
 448        ret = clk_prepare_enable(afe_priv->clk[CLK_APLL2_TUNER]);
 449        if (ret) {
 450                dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",
 451                        __func__, aud_clks[CLK_APLL2_TUNER], ret);
 452                goto ERR_CLK_APLL2_TUNER;
 453        }
 454
 455        regmap_update_bits(afe->regmap, AFE_APLL2_TUNER_CFG,
 456                           0x0000FFF7, 0x00000634);
 457        regmap_update_bits(afe->regmap, AFE_APLL2_TUNER_CFG, 0x1, 0x1);
 458
 459        regmap_update_bits(afe->regmap, AFE_HD_ENGEN_ENABLE,
 460                           AFE_24M_ON_MASK_SFT,
 461                           0x1 << AFE_24M_ON_SFT);
 462
 463        return 0;
 464
 465ERR_CLK_APLL2_TUNER:
 466        clk_disable_unprepare(afe_priv->clk[CLK_APLL24M]);
 467ERR_CLK_APLL24M:
 468        return ret;
 469}
 470
 471void mt8183_apll2_disable(struct mtk_base_afe *afe)
 472{
 473        struct mt8183_afe_private *afe_priv = afe->platform_priv;
 474
 475        regmap_update_bits(afe->regmap, AFE_HD_ENGEN_ENABLE,
 476                           AFE_24M_ON_MASK_SFT,
 477                           0x0 << AFE_24M_ON_SFT);
 478
 479        regmap_update_bits(afe->regmap, AFE_APLL2_TUNER_CFG, 0x1, 0x0);
 480
 481        clk_disable_unprepare(afe_priv->clk[CLK_APLL2_TUNER]);
 482        clk_disable_unprepare(afe_priv->clk[CLK_APLL24M]);
 483
 484        apll2_mux_setting(afe, false);
 485}
 486
 487int mt8183_get_apll_rate(struct mtk_base_afe *afe, int apll)
 488{
 489        return (apll == MT8183_APLL1) ? 180633600 : 196608000;
 490}
 491
 492int mt8183_get_apll_by_rate(struct mtk_base_afe *afe, int rate)
 493{
 494        return ((rate % 8000) == 0) ? MT8183_APLL2 : MT8183_APLL1;
 495}
 496
 497int mt8183_get_apll_by_name(struct mtk_base_afe *afe, const char *name)
 498{
 499        if (strcmp(name, APLL1_W_NAME) == 0)
 500                return MT8183_APLL1;
 501        else
 502                return MT8183_APLL2;
 503}
 504
 505/* mck */
 506struct mt8183_mck_div {
 507        int m_sel_id;
 508        int div_clk_id;
 509};
 510
 511static const struct mt8183_mck_div mck_div[MT8183_MCK_NUM] = {
 512        [MT8183_I2S0_MCK] = {
 513                .m_sel_id = CLK_TOP_I2S0_M_SEL,
 514                .div_clk_id = CLK_TOP_APLL12_DIV0,
 515        },
 516        [MT8183_I2S1_MCK] = {
 517                .m_sel_id = CLK_TOP_I2S1_M_SEL,
 518                .div_clk_id = CLK_TOP_APLL12_DIV1,
 519        },
 520        [MT8183_I2S2_MCK] = {
 521                .m_sel_id = CLK_TOP_I2S2_M_SEL,
 522                .div_clk_id = CLK_TOP_APLL12_DIV2,
 523        },
 524        [MT8183_I2S3_MCK] = {
 525                .m_sel_id = CLK_TOP_I2S3_M_SEL,
 526                .div_clk_id = CLK_TOP_APLL12_DIV3,
 527        },
 528        [MT8183_I2S4_MCK] = {
 529                .m_sel_id = CLK_TOP_I2S4_M_SEL,
 530                .div_clk_id = CLK_TOP_APLL12_DIV4,
 531        },
 532        [MT8183_I2S4_BCK] = {
 533                .m_sel_id = -1,
 534                .div_clk_id = CLK_TOP_APLL12_DIVB,
 535        },
 536        [MT8183_I2S5_MCK] = {
 537                .m_sel_id = -1,
 538                .div_clk_id = -1,
 539        },
 540};
 541
 542int mt8183_mck_enable(struct mtk_base_afe *afe, int mck_id, int rate)
 543{
 544        struct mt8183_afe_private *afe_priv = afe->platform_priv;
 545        int apll = mt8183_get_apll_by_rate(afe, rate);
 546        int apll_clk_id = apll == MT8183_APLL1 ?
 547                          CLK_TOP_MUX_AUD_1 : CLK_TOP_MUX_AUD_2;
 548        int m_sel_id = mck_div[mck_id].m_sel_id;
 549        int div_clk_id = mck_div[mck_id].div_clk_id;
 550        int ret;
 551
 552        /* i2s5 mck not support */
 553        if (mck_id == MT8183_I2S5_MCK)
 554                return 0;
 555
 556        /* select apll */
 557        if (m_sel_id >= 0) {
 558                ret = clk_prepare_enable(afe_priv->clk[m_sel_id]);
 559                if (ret) {
 560                        dev_err(afe->dev, "%s(), clk_prepare_enable %s fail %d\n",
 561                                __func__, aud_clks[m_sel_id], ret);
 562                        goto ERR_ENABLE_MCLK;
 563                }
 564                ret = clk_set_parent(afe_priv->clk[m_sel_id],
 565                                     afe_priv->clk[apll_clk_id]);
 566                if (ret) {
 567                        dev_err(afe->dev, "%s(), clk_set_parent %s-%s fail %d\n",
 568                                __func__, aud_clks[m_sel_id],
 569                                aud_clks[apll_clk_id], ret);
 570                        goto ERR_SELECT_MCLK;
 571                }
 572        }
 573
 574        /* enable div, set rate */
 575        ret = clk_prepare_enable(afe_priv->clk[div_clk_id]);
 576        if (ret) {
 577                dev_err(afe->dev, "%s(), clk_prepare_enable %s fail %d\n",
 578                        __func__, aud_clks[div_clk_id], ret);
 579                goto ERR_ENABLE_MCLK_DIV;
 580        }
 581        ret = clk_set_rate(afe_priv->clk[div_clk_id], rate);
 582        if (ret) {
 583                dev_err(afe->dev, "%s(), clk_set_rate %s, rate %d, fail %d\n",
 584                        __func__, aud_clks[div_clk_id],
 585                        rate, ret);
 586                goto ERR_SET_MCLK_RATE;
 587                return ret;
 588        }
 589
 590        return 0;
 591
 592ERR_SET_MCLK_RATE:
 593        clk_disable_unprepare(afe_priv->clk[div_clk_id]);
 594ERR_ENABLE_MCLK_DIV:
 595ERR_SELECT_MCLK:
 596        if (m_sel_id >= 0)
 597                clk_disable_unprepare(afe_priv->clk[m_sel_id]);
 598ERR_ENABLE_MCLK:
 599        return ret;
 600}
 601
 602void mt8183_mck_disable(struct mtk_base_afe *afe, int mck_id)
 603{
 604        struct mt8183_afe_private *afe_priv = afe->platform_priv;
 605        int m_sel_id = mck_div[mck_id].m_sel_id;
 606        int div_clk_id = mck_div[mck_id].div_clk_id;
 607
 608        /* i2s5 mck not support */
 609        if (mck_id == MT8183_I2S5_MCK)
 610                return;
 611
 612        clk_disable_unprepare(afe_priv->clk[div_clk_id]);
 613        if (m_sel_id >= 0)
 614                clk_disable_unprepare(afe_priv->clk[m_sel_id]);
 615}
 616