linux/sound/soc/mediatek/mt6797/mt6797-afe-pcm.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2//
   3// Mediatek ALSA SoC AFE platform driver for 6797
   4//
   5// Copyright (c) 2018 MediaTek Inc.
   6// Author: KaiChieh Chuang <kaichieh.chuang@mediatek.com>
   7
   8#include <linux/delay.h>
   9#include <linux/module.h>
  10#include <linux/mfd/syscon.h>
  11#include <linux/of.h>
  12#include <linux/of_address.h>
  13#include <linux/pm_runtime.h>
  14
  15#include "mt6797-afe-common.h"
  16#include "mt6797-afe-clk.h"
  17#include "mt6797-interconnection.h"
  18#include "mt6797-reg.h"
  19#include "../common/mtk-afe-platform-driver.h"
  20#include "../common/mtk-afe-fe-dai.h"
  21
  22enum {
  23        MTK_AFE_RATE_8K = 0,
  24        MTK_AFE_RATE_11K = 1,
  25        MTK_AFE_RATE_12K = 2,
  26        MTK_AFE_RATE_384K = 3,
  27        MTK_AFE_RATE_16K = 4,
  28        MTK_AFE_RATE_22K = 5,
  29        MTK_AFE_RATE_24K = 6,
  30        MTK_AFE_RATE_130K = 7,
  31        MTK_AFE_RATE_32K = 8,
  32        MTK_AFE_RATE_44K = 9,
  33        MTK_AFE_RATE_48K = 10,
  34        MTK_AFE_RATE_88K = 11,
  35        MTK_AFE_RATE_96K = 12,
  36        MTK_AFE_RATE_174K = 13,
  37        MTK_AFE_RATE_192K = 14,
  38        MTK_AFE_RATE_260K = 15,
  39};
  40
  41enum {
  42        MTK_AFE_DAI_MEMIF_RATE_8K = 0,
  43        MTK_AFE_DAI_MEMIF_RATE_16K = 1,
  44        MTK_AFE_DAI_MEMIF_RATE_32K = 2,
  45};
  46
  47enum {
  48        MTK_AFE_PCM_RATE_8K = 0,
  49        MTK_AFE_PCM_RATE_16K = 1,
  50        MTK_AFE_PCM_RATE_32K = 2,
  51        MTK_AFE_PCM_RATE_48K = 3,
  52};
  53
  54unsigned int mt6797_general_rate_transform(struct device *dev,
  55                                           unsigned int rate)
  56{
  57        switch (rate) {
  58        case 8000:
  59                return MTK_AFE_RATE_8K;
  60        case 11025:
  61                return MTK_AFE_RATE_11K;
  62        case 12000:
  63                return MTK_AFE_RATE_12K;
  64        case 16000:
  65                return MTK_AFE_RATE_16K;
  66        case 22050:
  67                return MTK_AFE_RATE_22K;
  68        case 24000:
  69                return MTK_AFE_RATE_24K;
  70        case 32000:
  71                return MTK_AFE_RATE_32K;
  72        case 44100:
  73                return MTK_AFE_RATE_44K;
  74        case 48000:
  75                return MTK_AFE_RATE_48K;
  76        case 88200:
  77                return MTK_AFE_RATE_88K;
  78        case 96000:
  79                return MTK_AFE_RATE_96K;
  80        case 130000:
  81                return MTK_AFE_RATE_130K;
  82        case 176400:
  83                return MTK_AFE_RATE_174K;
  84        case 192000:
  85                return MTK_AFE_RATE_192K;
  86        case 260000:
  87                return MTK_AFE_RATE_260K;
  88        default:
  89                dev_warn(dev, "%s(), rate %u invalid, use %d!!!\n",
  90                         __func__, rate, MTK_AFE_RATE_48K);
  91                return MTK_AFE_RATE_48K;
  92        }
  93}
  94
  95static unsigned int dai_memif_rate_transform(struct device *dev,
  96                                             unsigned int rate)
  97{
  98        switch (rate) {
  99        case 8000:
 100                return MTK_AFE_DAI_MEMIF_RATE_8K;
 101        case 16000:
 102                return MTK_AFE_DAI_MEMIF_RATE_16K;
 103        case 32000:
 104                return MTK_AFE_DAI_MEMIF_RATE_32K;
 105        default:
 106                dev_warn(dev, "%s(), rate %u invalid, use %d!!!\n",
 107                         __func__, rate, MTK_AFE_DAI_MEMIF_RATE_16K);
 108                return MTK_AFE_DAI_MEMIF_RATE_16K;
 109        }
 110}
 111
 112unsigned int mt6797_rate_transform(struct device *dev,
 113                                   unsigned int rate, int aud_blk)
 114{
 115        switch (aud_blk) {
 116        case MT6797_MEMIF_DAI:
 117        case MT6797_MEMIF_MOD_DAI:
 118                return dai_memif_rate_transform(dev, rate);
 119        default:
 120                return mt6797_general_rate_transform(dev, rate);
 121        }
 122}
 123
 124static const struct snd_pcm_hardware mt6797_afe_hardware = {
 125        .info = SNDRV_PCM_INFO_MMAP |
 126                SNDRV_PCM_INFO_INTERLEAVED |
 127                SNDRV_PCM_INFO_MMAP_VALID,
 128        .formats = SNDRV_PCM_FMTBIT_S16_LE |
 129                   SNDRV_PCM_FMTBIT_S24_LE |
 130                   SNDRV_PCM_FMTBIT_S32_LE,
 131        .period_bytes_min = 256,
 132        .period_bytes_max = 4 * 48 * 1024,
 133        .periods_min = 2,
 134        .periods_max = 256,
 135        .buffer_bytes_max = 8 * 48 * 1024,
 136        .fifo_size = 0,
 137};
 138
 139static int mt6797_memif_fs(struct snd_pcm_substream *substream,
 140                           unsigned int rate)
 141{
 142        struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
 143        struct snd_soc_component *component =
 144                snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);
 145        struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);
 146        int id = asoc_rtd_to_cpu(rtd, 0)->id;
 147
 148        return mt6797_rate_transform(afe->dev, rate, id);
 149}
 150
 151static int mt6797_irq_fs(struct snd_pcm_substream *substream, unsigned int rate)
 152{
 153        struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
 154        struct snd_soc_component *component =
 155                snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);
 156        struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);
 157
 158        return mt6797_general_rate_transform(afe->dev, rate);
 159}
 160
 161#define MTK_PCM_RATES (SNDRV_PCM_RATE_8000_48000 |\
 162                       SNDRV_PCM_RATE_88200 |\
 163                       SNDRV_PCM_RATE_96000 |\
 164                       SNDRV_PCM_RATE_176400 |\
 165                       SNDRV_PCM_RATE_192000)
 166
 167#define MTK_PCM_DAI_RATES (SNDRV_PCM_RATE_8000 |\
 168                           SNDRV_PCM_RATE_16000 |\
 169                           SNDRV_PCM_RATE_32000)
 170
 171#define MTK_PCM_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
 172                         SNDRV_PCM_FMTBIT_S24_LE |\
 173                         SNDRV_PCM_FMTBIT_S32_LE)
 174
 175static struct snd_soc_dai_driver mt6797_memif_dai_driver[] = {
 176        /* FE DAIs: memory intefaces to CPU */
 177        {
 178                .name = "DL1",
 179                .id = MT6797_MEMIF_DL1,
 180                .playback = {
 181                        .stream_name = "DL1",
 182                        .channels_min = 1,
 183                        .channels_max = 2,
 184                        .rates = MTK_PCM_RATES,
 185                        .formats = MTK_PCM_FORMATS,
 186                },
 187                .ops = &mtk_afe_fe_ops,
 188        },
 189        {
 190                .name = "DL2",
 191                .id = MT6797_MEMIF_DL2,
 192                .playback = {
 193                        .stream_name = "DL2",
 194                        .channels_min = 1,
 195                        .channels_max = 2,
 196                        .rates = MTK_PCM_RATES,
 197                        .formats = MTK_PCM_FORMATS,
 198                },
 199                .ops = &mtk_afe_fe_ops,
 200        },
 201        {
 202                .name = "DL3",
 203                .id = MT6797_MEMIF_DL3,
 204                .playback = {
 205                        .stream_name = "DL3",
 206                        .channels_min = 1,
 207                        .channels_max = 2,
 208                        .rates = MTK_PCM_RATES,
 209                        .formats = MTK_PCM_FORMATS,
 210                },
 211                .ops = &mtk_afe_fe_ops,
 212        },
 213        {
 214                .name = "UL1",
 215                .id = MT6797_MEMIF_VUL12,
 216                .capture = {
 217                        .stream_name = "UL1",
 218                        .channels_min = 1,
 219                        .channels_max = 2,
 220                        .rates = MTK_PCM_RATES,
 221                        .formats = MTK_PCM_FORMATS,
 222                },
 223                .ops = &mtk_afe_fe_ops,
 224        },
 225        {
 226                .name = "UL2",
 227                .id = MT6797_MEMIF_AWB,
 228                .capture = {
 229                        .stream_name = "UL2",
 230                        .channels_min = 1,
 231                        .channels_max = 2,
 232                        .rates = MTK_PCM_RATES,
 233                        .formats = MTK_PCM_FORMATS,
 234                },
 235                .ops = &mtk_afe_fe_ops,
 236        },
 237        {
 238                .name = "UL3",
 239                .id = MT6797_MEMIF_VUL,
 240                .capture = {
 241                        .stream_name = "UL3",
 242                        .channels_min = 1,
 243                        .channels_max = 2,
 244                        .rates = MTK_PCM_RATES,
 245                        .formats = MTK_PCM_FORMATS,
 246                },
 247                .ops = &mtk_afe_fe_ops,
 248        },
 249        {
 250                .name = "UL_MONO_1",
 251                .id = MT6797_MEMIF_MOD_DAI,
 252                .capture = {
 253                        .stream_name = "UL_MONO_1",
 254                        .channels_min = 1,
 255                        .channels_max = 1,
 256                        .rates = MTK_PCM_DAI_RATES,
 257                        .formats = MTK_PCM_FORMATS,
 258                },
 259                .ops = &mtk_afe_fe_ops,
 260        },
 261        {
 262                .name = "UL_MONO_2",
 263                .id = MT6797_MEMIF_DAI,
 264                .capture = {
 265                        .stream_name = "UL_MONO_2",
 266                        .channels_min = 1,
 267                        .channels_max = 1,
 268                        .rates = MTK_PCM_DAI_RATES,
 269                        .formats = MTK_PCM_FORMATS,
 270                },
 271                .ops = &mtk_afe_fe_ops,
 272        },
 273};
 274
 275/* dma widget & routes*/
 276static const struct snd_kcontrol_new memif_ul1_ch1_mix[] = {
 277        SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN21,
 278                                    I_ADDA_UL_CH1, 1, 0),
 279};
 280
 281static const struct snd_kcontrol_new memif_ul1_ch2_mix[] = {
 282        SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN22,
 283                                    I_ADDA_UL_CH2, 1, 0),
 284};
 285
 286static const struct snd_kcontrol_new memif_ul2_ch1_mix[] = {
 287        SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN5,
 288                                    I_ADDA_UL_CH1, 1, 0),
 289        SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1", AFE_CONN5,
 290                                    I_DL1_CH1, 1, 0),
 291        SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN5,
 292                                    I_DL2_CH1, 1, 0),
 293        SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1", AFE_CONN5,
 294                                    I_DL3_CH1, 1, 0),
 295};
 296
 297static const struct snd_kcontrol_new memif_ul2_ch2_mix[] = {
 298        SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN6,
 299                                    I_ADDA_UL_CH2, 1, 0),
 300        SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2", AFE_CONN6,
 301                                    I_DL1_CH2, 1, 0),
 302        SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2", AFE_CONN6,
 303                                    I_DL2_CH2, 1, 0),
 304        SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2", AFE_CONN6,
 305                                    I_DL3_CH2, 1, 0),
 306};
 307
 308static const struct snd_kcontrol_new memif_ul3_ch1_mix[] = {
 309        SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN9,
 310                                    I_ADDA_UL_CH1, 1, 0),
 311};
 312
 313static const struct snd_kcontrol_new memif_ul3_ch2_mix[] = {
 314        SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN10,
 315                                    I_ADDA_UL_CH2, 1, 0),
 316};
 317
 318static const struct snd_kcontrol_new memif_ul_mono_1_mix[] = {
 319        SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN12,
 320                                    I_ADDA_UL_CH1, 1, 0),
 321        SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN12,
 322                                    I_ADDA_UL_CH2, 1, 0),
 323};
 324
 325static const struct snd_kcontrol_new memif_ul_mono_2_mix[] = {
 326        SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN11,
 327                                    I_ADDA_UL_CH1, 1, 0),
 328        SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN11,
 329                                    I_ADDA_UL_CH2, 1, 0),
 330};
 331
 332static const struct snd_soc_dapm_widget mt6797_memif_widgets[] = {
 333        /* memif */
 334        SND_SOC_DAPM_MIXER("UL1_CH1", SND_SOC_NOPM, 0, 0,
 335                           memif_ul1_ch1_mix, ARRAY_SIZE(memif_ul1_ch1_mix)),
 336        SND_SOC_DAPM_MIXER("UL1_CH2", SND_SOC_NOPM, 0, 0,
 337                           memif_ul1_ch2_mix, ARRAY_SIZE(memif_ul1_ch2_mix)),
 338
 339        SND_SOC_DAPM_MIXER("UL2_CH1", SND_SOC_NOPM, 0, 0,
 340                           memif_ul2_ch1_mix, ARRAY_SIZE(memif_ul2_ch1_mix)),
 341        SND_SOC_DAPM_MIXER("UL2_CH2", SND_SOC_NOPM, 0, 0,
 342                           memif_ul2_ch2_mix, ARRAY_SIZE(memif_ul2_ch2_mix)),
 343
 344        SND_SOC_DAPM_MIXER("UL3_CH1", SND_SOC_NOPM, 0, 0,
 345                           memif_ul3_ch1_mix, ARRAY_SIZE(memif_ul3_ch1_mix)),
 346        SND_SOC_DAPM_MIXER("UL3_CH2", SND_SOC_NOPM, 0, 0,
 347                           memif_ul3_ch2_mix, ARRAY_SIZE(memif_ul3_ch2_mix)),
 348
 349        SND_SOC_DAPM_MIXER("UL_MONO_1_CH1", SND_SOC_NOPM, 0, 0,
 350                           memif_ul_mono_1_mix,
 351                           ARRAY_SIZE(memif_ul_mono_1_mix)),
 352
 353        SND_SOC_DAPM_MIXER("UL_MONO_2_CH1", SND_SOC_NOPM, 0, 0,
 354                           memif_ul_mono_2_mix,
 355                           ARRAY_SIZE(memif_ul_mono_2_mix)),
 356};
 357
 358static const struct snd_soc_dapm_route mt6797_memif_routes[] = {
 359        /* capture */
 360        {"UL1", NULL, "UL1_CH1"},
 361        {"UL1", NULL, "UL1_CH2"},
 362        {"UL1_CH1", "ADDA_UL_CH1", "ADDA Capture"},
 363        {"UL1_CH2", "ADDA_UL_CH2", "ADDA Capture"},
 364
 365        {"UL2", NULL, "UL2_CH1"},
 366        {"UL2", NULL, "UL2_CH2"},
 367        {"UL2_CH1", "ADDA_UL_CH1", "ADDA Capture"},
 368        {"UL2_CH2", "ADDA_UL_CH2", "ADDA Capture"},
 369
 370        {"UL3", NULL, "UL3_CH1"},
 371        {"UL3", NULL, "UL3_CH2"},
 372        {"UL3_CH1", "ADDA_UL_CH1", "ADDA Capture"},
 373        {"UL3_CH2", "ADDA_UL_CH2", "ADDA Capture"},
 374
 375        {"UL_MONO_1", NULL, "UL_MONO_1_CH1"},
 376        {"UL_MONO_1_CH1", "ADDA_UL_CH1", "ADDA Capture"},
 377        {"UL_MONO_1_CH1", "ADDA_UL_CH2", "ADDA Capture"},
 378
 379        {"UL_MONO_2", NULL, "UL_MONO_2_CH1"},
 380        {"UL_MONO_2_CH1", "ADDA_UL_CH1", "ADDA Capture"},
 381        {"UL_MONO_2_CH1", "ADDA_UL_CH2", "ADDA Capture"},
 382};
 383
 384static const struct snd_soc_component_driver mt6797_afe_pcm_dai_component = {
 385        .name = "mt6797-afe-pcm-dai",
 386};
 387
 388static const struct mtk_base_memif_data memif_data[MT6797_MEMIF_NUM] = {
 389        [MT6797_MEMIF_DL1] = {
 390                .name = "DL1",
 391                .id = MT6797_MEMIF_DL1,
 392                .reg_ofs_base = AFE_DL1_BASE,
 393                .reg_ofs_cur = AFE_DL1_CUR,
 394                .fs_reg = AFE_DAC_CON1,
 395                .fs_shift = DL1_MODE_SFT,
 396                .fs_maskbit = DL1_MODE_MASK,
 397                .mono_reg = AFE_DAC_CON1,
 398                .mono_shift = DL1_DATA_SFT,
 399                .enable_reg = AFE_DAC_CON0,
 400                .enable_shift = DL1_ON_SFT,
 401                .hd_reg = AFE_MEMIF_HD_MODE,
 402                .hd_shift = DL1_HD_SFT,
 403                .agent_disable_reg = -1,
 404                .msb_reg = -1,
 405        },
 406        [MT6797_MEMIF_DL2] = {
 407                .name = "DL2",
 408                .id = MT6797_MEMIF_DL2,
 409                .reg_ofs_base = AFE_DL2_BASE,
 410                .reg_ofs_cur = AFE_DL2_CUR,
 411                .fs_reg = AFE_DAC_CON1,
 412                .fs_shift = DL2_MODE_SFT,
 413                .fs_maskbit = DL2_MODE_MASK,
 414                .mono_reg = AFE_DAC_CON1,
 415                .mono_shift = DL2_DATA_SFT,
 416                .enable_reg = AFE_DAC_CON0,
 417                .enable_shift = DL2_ON_SFT,
 418                .hd_reg = AFE_MEMIF_HD_MODE,
 419                .hd_shift = DL2_HD_SFT,
 420                .agent_disable_reg = -1,
 421                .msb_reg = -1,
 422        },
 423        [MT6797_MEMIF_DL3] = {
 424                .name = "DL3",
 425                .id = MT6797_MEMIF_DL3,
 426                .reg_ofs_base = AFE_DL3_BASE,
 427                .reg_ofs_cur = AFE_DL3_CUR,
 428                .fs_reg = AFE_DAC_CON0,
 429                .fs_shift = DL3_MODE_SFT,
 430                .fs_maskbit = DL3_MODE_MASK,
 431                .mono_reg = AFE_DAC_CON1,
 432                .mono_shift = DL3_DATA_SFT,
 433                .enable_reg = AFE_DAC_CON0,
 434                .enable_shift = DL3_ON_SFT,
 435                .hd_reg = AFE_MEMIF_HD_MODE,
 436                .hd_shift = DL3_HD_SFT,
 437                .agent_disable_reg = -1,
 438                .msb_reg = -1,
 439        },
 440        [MT6797_MEMIF_VUL] = {
 441                .name = "VUL",
 442                .id = MT6797_MEMIF_VUL,
 443                .reg_ofs_base = AFE_VUL_BASE,
 444                .reg_ofs_cur = AFE_VUL_CUR,
 445                .fs_reg = AFE_DAC_CON1,
 446                .fs_shift = VUL_MODE_SFT,
 447                .fs_maskbit = VUL_MODE_MASK,
 448                .mono_reg = AFE_DAC_CON1,
 449                .mono_shift = VUL_DATA_SFT,
 450                .enable_reg = AFE_DAC_CON0,
 451                .enable_shift = VUL_ON_SFT,
 452                .hd_reg = AFE_MEMIF_HD_MODE,
 453                .hd_shift = VUL_HD_SFT,
 454                .agent_disable_reg = -1,
 455                .msb_reg = -1,
 456        },
 457        [MT6797_MEMIF_AWB] = {
 458                .name = "AWB",
 459                .id = MT6797_MEMIF_AWB,
 460                .reg_ofs_base = AFE_AWB_BASE,
 461                .reg_ofs_cur = AFE_AWB_CUR,
 462                .fs_reg = AFE_DAC_CON1,
 463                .fs_shift = AWB_MODE_SFT,
 464                .fs_maskbit = AWB_MODE_MASK,
 465                .mono_reg = AFE_DAC_CON1,
 466                .mono_shift = AWB_DATA_SFT,
 467                .enable_reg = AFE_DAC_CON0,
 468                .enable_shift = AWB_ON_SFT,
 469                .hd_reg = AFE_MEMIF_HD_MODE,
 470                .hd_shift = AWB_HD_SFT,
 471                .agent_disable_reg = -1,
 472                .msb_reg = -1,
 473        },
 474        [MT6797_MEMIF_VUL12] = {
 475                .name = "VUL12",
 476                .id = MT6797_MEMIF_VUL12,
 477                .reg_ofs_base = AFE_VUL_D2_BASE,
 478                .reg_ofs_cur = AFE_VUL_D2_CUR,
 479                .fs_reg = AFE_DAC_CON0,
 480                .fs_shift = VUL_DATA2_MODE_SFT,
 481                .fs_maskbit = VUL_DATA2_MODE_MASK,
 482                .mono_reg = AFE_DAC_CON0,
 483                .mono_shift = VUL_DATA2_DATA_SFT,
 484                .enable_reg = AFE_DAC_CON0,
 485                .enable_shift = VUL_DATA2_ON_SFT,
 486                .hd_reg = AFE_MEMIF_HD_MODE,
 487                .hd_shift = VUL_DATA2_HD_SFT,
 488                .agent_disable_reg = -1,
 489                .msb_reg = -1,
 490        },
 491        [MT6797_MEMIF_DAI] = {
 492                .name = "DAI",
 493                .id = MT6797_MEMIF_DAI,
 494                .reg_ofs_base = AFE_DAI_BASE,
 495                .reg_ofs_cur = AFE_DAI_CUR,
 496                .fs_reg = AFE_DAC_CON0,
 497                .fs_shift = DAI_MODE_SFT,
 498                .fs_maskbit = DAI_MODE_MASK,
 499                .mono_reg = -1,
 500                .mono_shift = 0,
 501                .enable_reg = AFE_DAC_CON0,
 502                .enable_shift = DAI_ON_SFT,
 503                .hd_reg = AFE_MEMIF_HD_MODE,
 504                .hd_shift = DAI_HD_SFT,
 505                .agent_disable_reg = -1,
 506                .msb_reg = -1,
 507        },
 508        [MT6797_MEMIF_MOD_DAI] = {
 509                .name = "MOD_DAI",
 510                .id = MT6797_MEMIF_MOD_DAI,
 511                .reg_ofs_base = AFE_MOD_DAI_BASE,
 512                .reg_ofs_cur = AFE_MOD_DAI_CUR,
 513                .fs_reg = AFE_DAC_CON1,
 514                .fs_shift = MOD_DAI_MODE_SFT,
 515                .fs_maskbit = MOD_DAI_MODE_MASK,
 516                .mono_reg = -1,
 517                .mono_shift = 0,
 518                .enable_reg = AFE_DAC_CON0,
 519                .enable_shift = MOD_DAI_ON_SFT,
 520                .hd_reg = AFE_MEMIF_HD_MODE,
 521                .hd_shift = MOD_DAI_HD_SFT,
 522                .agent_disable_reg = -1,
 523                .msb_reg = -1,
 524        },
 525};
 526
 527static const struct mtk_base_irq_data irq_data[MT6797_IRQ_NUM] = {
 528        [MT6797_IRQ_1] = {
 529                .id = MT6797_IRQ_1,
 530                .irq_cnt_reg = AFE_IRQ_MCU_CNT1,
 531                .irq_cnt_shift = AFE_IRQ_MCU_CNT1_SFT,
 532                .irq_cnt_maskbit = AFE_IRQ_MCU_CNT1_MASK,
 533                .irq_fs_reg = AFE_IRQ_MCU_CON,
 534                .irq_fs_shift = IRQ1_MCU_MODE_SFT,
 535                .irq_fs_maskbit = IRQ1_MCU_MODE_MASK,
 536                .irq_en_reg = AFE_IRQ_MCU_CON,
 537                .irq_en_shift = IRQ1_MCU_ON_SFT,
 538                .irq_clr_reg = AFE_IRQ_MCU_CLR,
 539                .irq_clr_shift = IRQ1_MCU_CLR_SFT,
 540        },
 541        [MT6797_IRQ_2] = {
 542                .id = MT6797_IRQ_2,
 543                .irq_cnt_reg = AFE_IRQ_MCU_CNT2,
 544                .irq_cnt_shift = AFE_IRQ_MCU_CNT2_SFT,
 545                .irq_cnt_maskbit = AFE_IRQ_MCU_CNT2_MASK,
 546                .irq_fs_reg = AFE_IRQ_MCU_CON,
 547                .irq_fs_shift = IRQ2_MCU_MODE_SFT,
 548                .irq_fs_maskbit = IRQ2_MCU_MODE_MASK,
 549                .irq_en_reg = AFE_IRQ_MCU_CON,
 550                .irq_en_shift = IRQ2_MCU_ON_SFT,
 551                .irq_clr_reg = AFE_IRQ_MCU_CLR,
 552                .irq_clr_shift = IRQ2_MCU_CLR_SFT,
 553        },
 554        [MT6797_IRQ_3] = {
 555                .id = MT6797_IRQ_3,
 556                .irq_cnt_reg = AFE_IRQ_MCU_CNT3,
 557                .irq_cnt_shift = AFE_IRQ_MCU_CNT3_SFT,
 558                .irq_cnt_maskbit = AFE_IRQ_MCU_CNT3_MASK,
 559                .irq_fs_reg = AFE_IRQ_MCU_CON,
 560                .irq_fs_shift = IRQ3_MCU_MODE_SFT,
 561                .irq_fs_maskbit = IRQ3_MCU_MODE_MASK,
 562                .irq_en_reg = AFE_IRQ_MCU_CON,
 563                .irq_en_shift = IRQ3_MCU_ON_SFT,
 564                .irq_clr_reg = AFE_IRQ_MCU_CLR,
 565                .irq_clr_shift = IRQ3_MCU_CLR_SFT,
 566        },
 567        [MT6797_IRQ_4] = {
 568                .id = MT6797_IRQ_4,
 569                .irq_cnt_reg = AFE_IRQ_MCU_CNT4,
 570                .irq_cnt_shift = AFE_IRQ_MCU_CNT4_SFT,
 571                .irq_cnt_maskbit = AFE_IRQ_MCU_CNT4_MASK,
 572                .irq_fs_reg = AFE_IRQ_MCU_CON,
 573                .irq_fs_shift = IRQ4_MCU_MODE_SFT,
 574                .irq_fs_maskbit = IRQ4_MCU_MODE_MASK,
 575                .irq_en_reg = AFE_IRQ_MCU_CON,
 576                .irq_en_shift = IRQ4_MCU_ON_SFT,
 577                .irq_clr_reg = AFE_IRQ_MCU_CLR,
 578                .irq_clr_shift = IRQ4_MCU_CLR_SFT,
 579        },
 580        [MT6797_IRQ_7] = {
 581                .id = MT6797_IRQ_7,
 582                .irq_cnt_reg = AFE_IRQ_MCU_CNT7,
 583                .irq_cnt_shift = AFE_IRQ_MCU_CNT7_SFT,
 584                .irq_cnt_maskbit = AFE_IRQ_MCU_CNT7_MASK,
 585                .irq_fs_reg = AFE_IRQ_MCU_CON,
 586                .irq_fs_shift = IRQ7_MCU_MODE_SFT,
 587                .irq_fs_maskbit = IRQ7_MCU_MODE_MASK,
 588                .irq_en_reg = AFE_IRQ_MCU_CON,
 589                .irq_en_shift = IRQ7_MCU_ON_SFT,
 590                .irq_clr_reg = AFE_IRQ_MCU_CLR,
 591                .irq_clr_shift = IRQ7_MCU_CLR_SFT,
 592        },
 593};
 594
 595static const struct regmap_config mt6797_afe_regmap_config = {
 596        .reg_bits = 32,
 597        .reg_stride = 4,
 598        .val_bits = 32,
 599        .max_register = AFE_MAX_REGISTER,
 600};
 601
 602static irqreturn_t mt6797_afe_irq_handler(int irq_id, void *dev)
 603{
 604        struct mtk_base_afe *afe = dev;
 605        struct mtk_base_afe_irq *irq;
 606        unsigned int status;
 607        unsigned int mcu_en;
 608        int ret;
 609        int i;
 610        irqreturn_t irq_ret = IRQ_HANDLED;
 611
 612        /* get irq that is sent to MCU */
 613        regmap_read(afe->regmap, AFE_IRQ_MCU_EN, &mcu_en);
 614
 615        ret = regmap_read(afe->regmap, AFE_IRQ_MCU_STATUS, &status);
 616        if (ret || (status & mcu_en) == 0) {
 617                dev_err(afe->dev, "%s(), irq status err, ret %d, status 0x%x, mcu_en 0x%x\n",
 618                        __func__, ret, status, mcu_en);
 619
 620                /* only clear IRQ which is sent to MCU */
 621                status = mcu_en & AFE_IRQ_STATUS_BITS;
 622
 623                irq_ret = IRQ_NONE;
 624                goto err_irq;
 625        }
 626
 627        for (i = 0; i < MT6797_MEMIF_NUM; i++) {
 628                struct mtk_base_afe_memif *memif = &afe->memif[i];
 629
 630                if (!memif->substream)
 631                        continue;
 632
 633                irq = &afe->irqs[memif->irq_usage];
 634
 635                if (status & (1 << irq->irq_data->irq_en_shift))
 636                        snd_pcm_period_elapsed(memif->substream);
 637        }
 638
 639err_irq:
 640        /* clear irq */
 641        regmap_write(afe->regmap,
 642                     AFE_IRQ_MCU_CLR,
 643                     status & AFE_IRQ_STATUS_BITS);
 644
 645        return irq_ret;
 646}
 647
 648static int mt6797_afe_runtime_suspend(struct device *dev)
 649{
 650        struct mtk_base_afe *afe = dev_get_drvdata(dev);
 651        unsigned int afe_on_retm;
 652        int retry = 0;
 653
 654        /* disable AFE */
 655        regmap_update_bits(afe->regmap, AFE_DAC_CON0, AFE_ON_MASK_SFT, 0x0);
 656        do {
 657                regmap_read(afe->regmap, AFE_DAC_CON0, &afe_on_retm);
 658                if ((afe_on_retm & AFE_ON_RETM_MASK_SFT) == 0)
 659                        break;
 660
 661                udelay(10);
 662        } while (++retry < 100000);
 663
 664        if (retry)
 665                dev_warn(afe->dev, "%s(), retry %d\n", __func__, retry);
 666
 667        /* make sure all irq status are cleared */
 668        regmap_update_bits(afe->regmap, AFE_IRQ_MCU_CLR, 0xffff, 0xffff);
 669
 670        return mt6797_afe_disable_clock(afe);
 671}
 672
 673static int mt6797_afe_runtime_resume(struct device *dev)
 674{
 675        struct mtk_base_afe *afe = dev_get_drvdata(dev);
 676        int ret;
 677
 678        ret = mt6797_afe_enable_clock(afe);
 679        if (ret)
 680                return ret;
 681
 682        /* irq signal to mcu only */
 683        regmap_write(afe->regmap, AFE_IRQ_MCU_EN, AFE_IRQ_MCU_EN_MASK_SFT);
 684
 685        /* force all memif use normal mode */
 686        regmap_update_bits(afe->regmap, AFE_MEMIF_HDALIGN,
 687                           0x7ff << 16, 0x7ff << 16);
 688        /* force cpu use normal mode when access sram data */
 689        regmap_update_bits(afe->regmap, AFE_MEMIF_MSB,
 690                           CPU_COMPACT_MODE_MASK_SFT, 0);
 691        /* force cpu use 8_24 format when writing 32bit data */
 692        regmap_update_bits(afe->regmap, AFE_MEMIF_MSB,
 693                           CPU_HD_ALIGN_MASK_SFT, 0);
 694
 695        /* set all output port to 24bit */
 696        regmap_update_bits(afe->regmap, AFE_CONN_24BIT,
 697                           0x3fffffff, 0x3fffffff);
 698
 699        /* enable AFE */
 700        regmap_update_bits(afe->regmap, AFE_DAC_CON0,
 701                           AFE_ON_MASK_SFT,
 702                           0x1 << AFE_ON_SFT);
 703
 704        return 0;
 705}
 706
 707static int mt6797_afe_component_probe(struct snd_soc_component *component)
 708{
 709        return mtk_afe_add_sub_dai_control(component);
 710}
 711
 712static const struct snd_soc_component_driver mt6797_afe_component = {
 713        .name           = AFE_PCM_NAME,
 714        .probe          = mt6797_afe_component_probe,
 715        .pointer        = mtk_afe_pcm_pointer,
 716        .pcm_construct  = mtk_afe_pcm_new,
 717};
 718
 719static int mt6797_dai_memif_register(struct mtk_base_afe *afe)
 720{
 721        struct mtk_base_afe_dai *dai;
 722
 723        dai = devm_kzalloc(afe->dev, sizeof(*dai), GFP_KERNEL);
 724        if (!dai)
 725                return -ENOMEM;
 726
 727        list_add(&dai->list, &afe->sub_dais);
 728
 729        dai->dai_drivers = mt6797_memif_dai_driver;
 730        dai->num_dai_drivers = ARRAY_SIZE(mt6797_memif_dai_driver);
 731
 732        dai->dapm_widgets = mt6797_memif_widgets;
 733        dai->num_dapm_widgets = ARRAY_SIZE(mt6797_memif_widgets);
 734        dai->dapm_routes = mt6797_memif_routes;
 735        dai->num_dapm_routes = ARRAY_SIZE(mt6797_memif_routes);
 736        return 0;
 737}
 738
 739typedef int (*dai_register_cb)(struct mtk_base_afe *);
 740static const dai_register_cb dai_register_cbs[] = {
 741        mt6797_dai_adda_register,
 742        mt6797_dai_pcm_register,
 743        mt6797_dai_hostless_register,
 744        mt6797_dai_memif_register,
 745};
 746
 747static int mt6797_afe_pcm_dev_probe(struct platform_device *pdev)
 748{
 749        struct mtk_base_afe *afe;
 750        struct mt6797_afe_private *afe_priv;
 751        struct device *dev;
 752        int i, irq_id, ret;
 753
 754        afe = devm_kzalloc(&pdev->dev, sizeof(*afe), GFP_KERNEL);
 755        if (!afe)
 756                return -ENOMEM;
 757
 758        afe->platform_priv = devm_kzalloc(&pdev->dev, sizeof(*afe_priv),
 759                                          GFP_KERNEL);
 760        if (!afe->platform_priv)
 761                return -ENOMEM;
 762
 763        afe_priv = afe->platform_priv;
 764        afe->dev = &pdev->dev;
 765        dev = afe->dev;
 766
 767        /* initial audio related clock */
 768        ret = mt6797_init_clock(afe);
 769        if (ret) {
 770                dev_err(dev, "init clock error\n");
 771                return ret;
 772        }
 773
 774        /* regmap init */
 775        afe->base_addr = devm_platform_ioremap_resource(pdev, 0);
 776        if (IS_ERR(afe->base_addr))
 777                return PTR_ERR(afe->base_addr);
 778
 779        afe->regmap = devm_regmap_init_mmio(&pdev->dev, afe->base_addr,
 780                                            &mt6797_afe_regmap_config);
 781        if (IS_ERR(afe->regmap))
 782                return PTR_ERR(afe->regmap);
 783
 784        /* init memif */
 785        afe->memif_size = MT6797_MEMIF_NUM;
 786        afe->memif = devm_kcalloc(dev, afe->memif_size, sizeof(*afe->memif),
 787                                  GFP_KERNEL);
 788        if (!afe->memif)
 789                return -ENOMEM;
 790
 791        for (i = 0; i < afe->memif_size; i++) {
 792                afe->memif[i].data = &memif_data[i];
 793                afe->memif[i].irq_usage = -1;
 794        }
 795
 796        mutex_init(&afe->irq_alloc_lock);
 797
 798        /* irq initialize */
 799        afe->irqs_size = MT6797_IRQ_NUM;
 800        afe->irqs = devm_kcalloc(dev, afe->irqs_size, sizeof(*afe->irqs),
 801                                 GFP_KERNEL);
 802        if (!afe->irqs)
 803                return -ENOMEM;
 804
 805        for (i = 0; i < afe->irqs_size; i++)
 806                afe->irqs[i].irq_data = &irq_data[i];
 807
 808        /* request irq */
 809        irq_id = platform_get_irq(pdev, 0);
 810        if (irq_id < 0)
 811                return irq_id;
 812
 813        ret = devm_request_irq(dev, irq_id, mt6797_afe_irq_handler,
 814                               IRQF_TRIGGER_NONE, "asys-isr", (void *)afe);
 815        if (ret) {
 816                dev_err(dev, "could not request_irq for asys-isr\n");
 817                return ret;
 818        }
 819
 820        /* init sub_dais */
 821        INIT_LIST_HEAD(&afe->sub_dais);
 822
 823        for (i = 0; i < ARRAY_SIZE(dai_register_cbs); i++) {
 824                ret = dai_register_cbs[i](afe);
 825                if (ret) {
 826                        dev_warn(afe->dev, "dai register i %d fail, ret %d\n",
 827                                 i, ret);
 828                        return ret;
 829                }
 830        }
 831
 832        /* init dai_driver and component_driver */
 833        ret = mtk_afe_combine_sub_dai(afe);
 834        if (ret) {
 835                dev_warn(afe->dev, "mtk_afe_combine_sub_dai fail, ret %d\n",
 836                         ret);
 837                return ret;
 838        }
 839
 840        afe->mtk_afe_hardware = &mt6797_afe_hardware;
 841        afe->memif_fs = mt6797_memif_fs;
 842        afe->irq_fs = mt6797_irq_fs;
 843
 844        afe->runtime_resume = mt6797_afe_runtime_resume;
 845        afe->runtime_suspend = mt6797_afe_runtime_suspend;
 846
 847        platform_set_drvdata(pdev, afe);
 848
 849        pm_runtime_enable(dev);
 850        if (!pm_runtime_enabled(dev))
 851                goto err_pm_disable;
 852        pm_runtime_get_sync(&pdev->dev);
 853
 854        /* register component */
 855        ret = devm_snd_soc_register_component(dev, &mt6797_afe_component,
 856                                              NULL, 0);
 857        if (ret) {
 858                dev_warn(dev, "err_platform\n");
 859                goto err_pm_disable;
 860        }
 861
 862        ret = devm_snd_soc_register_component(afe->dev,
 863                                     &mt6797_afe_pcm_dai_component,
 864                                     afe->dai_drivers,
 865                                     afe->num_dai_drivers);
 866        if (ret) {
 867                dev_warn(dev, "err_dai_component\n");
 868                goto err_pm_disable;
 869        }
 870
 871        return 0;
 872
 873err_pm_disable:
 874        pm_runtime_disable(dev);
 875
 876        return ret;
 877}
 878
 879static int mt6797_afe_pcm_dev_remove(struct platform_device *pdev)
 880{
 881        pm_runtime_disable(&pdev->dev);
 882        if (!pm_runtime_status_suspended(&pdev->dev))
 883                mt6797_afe_runtime_suspend(&pdev->dev);
 884        pm_runtime_put_sync(&pdev->dev);
 885
 886        return 0;
 887}
 888
 889static const struct of_device_id mt6797_afe_pcm_dt_match[] = {
 890        { .compatible = "mediatek,mt6797-audio", },
 891        {},
 892};
 893MODULE_DEVICE_TABLE(of, mt6797_afe_pcm_dt_match);
 894
 895static const struct dev_pm_ops mt6797_afe_pm_ops = {
 896        SET_RUNTIME_PM_OPS(mt6797_afe_runtime_suspend,
 897                           mt6797_afe_runtime_resume, NULL)
 898};
 899
 900static struct platform_driver mt6797_afe_pcm_driver = {
 901        .driver = {
 902                   .name = "mt6797-audio",
 903                   .of_match_table = mt6797_afe_pcm_dt_match,
 904#ifdef CONFIG_PM
 905                   .pm = &mt6797_afe_pm_ops,
 906#endif
 907        },
 908        .probe = mt6797_afe_pcm_dev_probe,
 909        .remove = mt6797_afe_pcm_dev_remove,
 910};
 911
 912module_platform_driver(mt6797_afe_pcm_driver);
 913
 914MODULE_DESCRIPTION("Mediatek ALSA SoC AFE platform driver for 6797");
 915MODULE_AUTHOR("KaiChieh Chuang <kaichieh.chuang@mediatek.com>");
 916MODULE_LICENSE("GPL v2");
 917