162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci// 362306a36Sopenharmony_ci// MediaTek ALSA SoC Audio Control 462306a36Sopenharmony_ci// 562306a36Sopenharmony_ci// Copyright (c) 2020 MediaTek Inc. 662306a36Sopenharmony_ci// Author: Shane Chien <shane.chien@mediatek.com> 762306a36Sopenharmony_ci// 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include "mt8192-afe-common.h" 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_cienum { 1262306a36Sopenharmony_ci MTK_AFE_RATE_8K = 0, 1362306a36Sopenharmony_ci MTK_AFE_RATE_11K = 1, 1462306a36Sopenharmony_ci MTK_AFE_RATE_12K = 2, 1562306a36Sopenharmony_ci MTK_AFE_RATE_384K = 3, 1662306a36Sopenharmony_ci MTK_AFE_RATE_16K = 4, 1762306a36Sopenharmony_ci MTK_AFE_RATE_22K = 5, 1862306a36Sopenharmony_ci MTK_AFE_RATE_24K = 6, 1962306a36Sopenharmony_ci MTK_AFE_RATE_352K = 7, 2062306a36Sopenharmony_ci MTK_AFE_RATE_32K = 8, 2162306a36Sopenharmony_ci MTK_AFE_RATE_44K = 9, 2262306a36Sopenharmony_ci MTK_AFE_RATE_48K = 10, 2362306a36Sopenharmony_ci MTK_AFE_RATE_88K = 11, 2462306a36Sopenharmony_ci MTK_AFE_RATE_96K = 12, 2562306a36Sopenharmony_ci MTK_AFE_RATE_176K = 13, 2662306a36Sopenharmony_ci MTK_AFE_RATE_192K = 14, 2762306a36Sopenharmony_ci MTK_AFE_RATE_260K = 15, 2862306a36Sopenharmony_ci}; 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_cienum { 3162306a36Sopenharmony_ci MTK_AFE_DAI_MEMIF_RATE_8K = 0, 3262306a36Sopenharmony_ci MTK_AFE_DAI_MEMIF_RATE_16K = 1, 3362306a36Sopenharmony_ci MTK_AFE_DAI_MEMIF_RATE_32K = 2, 3462306a36Sopenharmony_ci MTK_AFE_DAI_MEMIF_RATE_48K = 3, 3562306a36Sopenharmony_ci}; 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_cienum { 3862306a36Sopenharmony_ci MTK_AFE_PCM_RATE_8K = 0, 3962306a36Sopenharmony_ci MTK_AFE_PCM_RATE_16K = 1, 4062306a36Sopenharmony_ci MTK_AFE_PCM_RATE_32K = 2, 4162306a36Sopenharmony_ci MTK_AFE_PCM_RATE_48K = 3, 4262306a36Sopenharmony_ci}; 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ciunsigned int mt8192_general_rate_transform(struct device *dev, 4562306a36Sopenharmony_ci unsigned int rate) 4662306a36Sopenharmony_ci{ 4762306a36Sopenharmony_ci switch (rate) { 4862306a36Sopenharmony_ci case 8000: 4962306a36Sopenharmony_ci return MTK_AFE_RATE_8K; 5062306a36Sopenharmony_ci case 11025: 5162306a36Sopenharmony_ci return MTK_AFE_RATE_11K; 5262306a36Sopenharmony_ci case 12000: 5362306a36Sopenharmony_ci return MTK_AFE_RATE_12K; 5462306a36Sopenharmony_ci case 16000: 5562306a36Sopenharmony_ci return MTK_AFE_RATE_16K; 5662306a36Sopenharmony_ci case 22050: 5762306a36Sopenharmony_ci return MTK_AFE_RATE_22K; 5862306a36Sopenharmony_ci case 24000: 5962306a36Sopenharmony_ci return MTK_AFE_RATE_24K; 6062306a36Sopenharmony_ci case 32000: 6162306a36Sopenharmony_ci return MTK_AFE_RATE_32K; 6262306a36Sopenharmony_ci case 44100: 6362306a36Sopenharmony_ci return MTK_AFE_RATE_44K; 6462306a36Sopenharmony_ci case 48000: 6562306a36Sopenharmony_ci return MTK_AFE_RATE_48K; 6662306a36Sopenharmony_ci case 88200: 6762306a36Sopenharmony_ci return MTK_AFE_RATE_88K; 6862306a36Sopenharmony_ci case 96000: 6962306a36Sopenharmony_ci return MTK_AFE_RATE_96K; 7062306a36Sopenharmony_ci case 176400: 7162306a36Sopenharmony_ci return MTK_AFE_RATE_176K; 7262306a36Sopenharmony_ci case 192000: 7362306a36Sopenharmony_ci return MTK_AFE_RATE_192K; 7462306a36Sopenharmony_ci case 260000: 7562306a36Sopenharmony_ci return MTK_AFE_RATE_260K; 7662306a36Sopenharmony_ci case 352800: 7762306a36Sopenharmony_ci return MTK_AFE_RATE_352K; 7862306a36Sopenharmony_ci case 384000: 7962306a36Sopenharmony_ci return MTK_AFE_RATE_384K; 8062306a36Sopenharmony_ci default: 8162306a36Sopenharmony_ci dev_warn(dev, "%s(), rate %u invalid, use %d!!!\n", 8262306a36Sopenharmony_ci __func__, 8362306a36Sopenharmony_ci rate, MTK_AFE_RATE_48K); 8462306a36Sopenharmony_ci return MTK_AFE_RATE_48K; 8562306a36Sopenharmony_ci } 8662306a36Sopenharmony_ci} 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_cistatic unsigned int dai_memif_rate_transform(struct device *dev, 8962306a36Sopenharmony_ci unsigned int rate) 9062306a36Sopenharmony_ci{ 9162306a36Sopenharmony_ci switch (rate) { 9262306a36Sopenharmony_ci case 8000: 9362306a36Sopenharmony_ci return MTK_AFE_DAI_MEMIF_RATE_8K; 9462306a36Sopenharmony_ci case 16000: 9562306a36Sopenharmony_ci return MTK_AFE_DAI_MEMIF_RATE_16K; 9662306a36Sopenharmony_ci case 32000: 9762306a36Sopenharmony_ci return MTK_AFE_DAI_MEMIF_RATE_32K; 9862306a36Sopenharmony_ci case 48000: 9962306a36Sopenharmony_ci return MTK_AFE_DAI_MEMIF_RATE_48K; 10062306a36Sopenharmony_ci default: 10162306a36Sopenharmony_ci dev_warn(dev, "%s(), rate %u invalid, use %d!!!\n", 10262306a36Sopenharmony_ci __func__, 10362306a36Sopenharmony_ci rate, MTK_AFE_DAI_MEMIF_RATE_16K); 10462306a36Sopenharmony_ci return MTK_AFE_DAI_MEMIF_RATE_16K; 10562306a36Sopenharmony_ci } 10662306a36Sopenharmony_ci} 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_cistatic unsigned int pcm_rate_transform(struct device *dev, 10962306a36Sopenharmony_ci unsigned int rate) 11062306a36Sopenharmony_ci{ 11162306a36Sopenharmony_ci switch (rate) { 11262306a36Sopenharmony_ci case 8000: 11362306a36Sopenharmony_ci return MTK_AFE_PCM_RATE_8K; 11462306a36Sopenharmony_ci case 16000: 11562306a36Sopenharmony_ci return MTK_AFE_PCM_RATE_16K; 11662306a36Sopenharmony_ci case 32000: 11762306a36Sopenharmony_ci return MTK_AFE_PCM_RATE_32K; 11862306a36Sopenharmony_ci case 48000: 11962306a36Sopenharmony_ci return MTK_AFE_PCM_RATE_48K; 12062306a36Sopenharmony_ci default: 12162306a36Sopenharmony_ci dev_warn(dev, "%s(), rate %u invalid, use %d!!!\n", 12262306a36Sopenharmony_ci __func__, 12362306a36Sopenharmony_ci rate, MTK_AFE_PCM_RATE_32K); 12462306a36Sopenharmony_ci return MTK_AFE_PCM_RATE_32K; 12562306a36Sopenharmony_ci } 12662306a36Sopenharmony_ci} 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_ciunsigned int mt8192_rate_transform(struct device *dev, 12962306a36Sopenharmony_ci unsigned int rate, int aud_blk) 13062306a36Sopenharmony_ci{ 13162306a36Sopenharmony_ci switch (aud_blk) { 13262306a36Sopenharmony_ci case MT8192_MEMIF_DAI: 13362306a36Sopenharmony_ci case MT8192_MEMIF_MOD_DAI: 13462306a36Sopenharmony_ci return dai_memif_rate_transform(dev, rate); 13562306a36Sopenharmony_ci case MT8192_DAI_PCM_1: 13662306a36Sopenharmony_ci case MT8192_DAI_PCM_2: 13762306a36Sopenharmony_ci return pcm_rate_transform(dev, rate); 13862306a36Sopenharmony_ci default: 13962306a36Sopenharmony_ci return mt8192_general_rate_transform(dev, rate); 14062306a36Sopenharmony_ci } 14162306a36Sopenharmony_ci} 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_ciint mt8192_dai_set_priv(struct mtk_base_afe *afe, int id, 14462306a36Sopenharmony_ci int priv_size, const void *priv_data) 14562306a36Sopenharmony_ci{ 14662306a36Sopenharmony_ci struct mt8192_afe_private *afe_priv = afe->platform_priv; 14762306a36Sopenharmony_ci void *temp_data; 14862306a36Sopenharmony_ci 14962306a36Sopenharmony_ci temp_data = devm_kzalloc(afe->dev, 15062306a36Sopenharmony_ci priv_size, 15162306a36Sopenharmony_ci GFP_KERNEL); 15262306a36Sopenharmony_ci if (!temp_data) 15362306a36Sopenharmony_ci return -ENOMEM; 15462306a36Sopenharmony_ci 15562306a36Sopenharmony_ci if (priv_data) 15662306a36Sopenharmony_ci memcpy(temp_data, priv_data, priv_size); 15762306a36Sopenharmony_ci 15862306a36Sopenharmony_ci afe_priv->dai_priv[id] = temp_data; 15962306a36Sopenharmony_ci 16062306a36Sopenharmony_ci return 0; 16162306a36Sopenharmony_ci} 162