162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci// 362306a36Sopenharmony_ci// MediaTek ALSA SoC Audio Control 462306a36Sopenharmony_ci// 562306a36Sopenharmony_ci// Copyright (c) 2022 MediaTek Inc. 662306a36Sopenharmony_ci// Author: Jiaxin Yu <jiaxin.yu@mediatek.com> 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#include "mt8186-afe-common.h" 962306a36Sopenharmony_ci 1062306a36Sopenharmony_cienum { 1162306a36Sopenharmony_ci MTK_AFE_RATE_8K = 0, 1262306a36Sopenharmony_ci MTK_AFE_RATE_11K, 1362306a36Sopenharmony_ci MTK_AFE_RATE_12K, 1462306a36Sopenharmony_ci MTK_AFE_RATE_384K, 1562306a36Sopenharmony_ci MTK_AFE_RATE_16K, 1662306a36Sopenharmony_ci MTK_AFE_RATE_22K, 1762306a36Sopenharmony_ci MTK_AFE_RATE_24K, 1862306a36Sopenharmony_ci MTK_AFE_RATE_352K, 1962306a36Sopenharmony_ci MTK_AFE_RATE_32K, 2062306a36Sopenharmony_ci MTK_AFE_RATE_44K, 2162306a36Sopenharmony_ci MTK_AFE_RATE_48K, 2262306a36Sopenharmony_ci MTK_AFE_RATE_88K, 2362306a36Sopenharmony_ci MTK_AFE_RATE_96K, 2462306a36Sopenharmony_ci MTK_AFE_RATE_176K, 2562306a36Sopenharmony_ci MTK_AFE_RATE_192K, 2662306a36Sopenharmony_ci MTK_AFE_RATE_260K, 2762306a36Sopenharmony_ci}; 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_cienum { 3062306a36Sopenharmony_ci MTK_AFE_PCM_RATE_8K = 0, 3162306a36Sopenharmony_ci MTK_AFE_PCM_RATE_16K, 3262306a36Sopenharmony_ci MTK_AFE_PCM_RATE_32K, 3362306a36Sopenharmony_ci MTK_AFE_PCM_RATE_48K, 3462306a36Sopenharmony_ci}; 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_cienum { 3762306a36Sopenharmony_ci MTK_AFE_TDM_RATE_8K = 0, 3862306a36Sopenharmony_ci MTK_AFE_TDM_RATE_12K, 3962306a36Sopenharmony_ci MTK_AFE_TDM_RATE_16K, 4062306a36Sopenharmony_ci MTK_AFE_TDM_RATE_24K, 4162306a36Sopenharmony_ci MTK_AFE_TDM_RATE_32K, 4262306a36Sopenharmony_ci MTK_AFE_TDM_RATE_48K, 4362306a36Sopenharmony_ci MTK_AFE_TDM_RATE_64K, 4462306a36Sopenharmony_ci MTK_AFE_TDM_RATE_96K, 4562306a36Sopenharmony_ci MTK_AFE_TDM_RATE_128K, 4662306a36Sopenharmony_ci MTK_AFE_TDM_RATE_192K, 4762306a36Sopenharmony_ci MTK_AFE_TDM_RATE_256K, 4862306a36Sopenharmony_ci MTK_AFE_TDM_RATE_384K, 4962306a36Sopenharmony_ci MTK_AFE_TDM_RATE_11K, 5062306a36Sopenharmony_ci MTK_AFE_TDM_RATE_22K, 5162306a36Sopenharmony_ci MTK_AFE_TDM_RATE_44K, 5262306a36Sopenharmony_ci MTK_AFE_TDM_RATE_88K, 5362306a36Sopenharmony_ci MTK_AFE_TDM_RATE_176K, 5462306a36Sopenharmony_ci MTK_AFE_TDM_RATE_352K, 5562306a36Sopenharmony_ci}; 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_cienum { 5862306a36Sopenharmony_ci MTK_AFE_TDM_RELATCH_RATE_8K = 0, 5962306a36Sopenharmony_ci MTK_AFE_TDM_RELATCH_RATE_11K, 6062306a36Sopenharmony_ci MTK_AFE_TDM_RELATCH_RATE_12K, 6162306a36Sopenharmony_ci MTK_AFE_TDM_RELATCH_RATE_16K, 6262306a36Sopenharmony_ci MTK_AFE_TDM_RELATCH_RATE_22K, 6362306a36Sopenharmony_ci MTK_AFE_TDM_RELATCH_RATE_24K, 6462306a36Sopenharmony_ci MTK_AFE_TDM_RELATCH_RATE_32K, 6562306a36Sopenharmony_ci MTK_AFE_TDM_RELATCH_RATE_44K, 6662306a36Sopenharmony_ci MTK_AFE_TDM_RELATCH_RATE_48K, 6762306a36Sopenharmony_ci MTK_AFE_TDM_RELATCH_RATE_88K, 6862306a36Sopenharmony_ci MTK_AFE_TDM_RELATCH_RATE_96K, 6962306a36Sopenharmony_ci MTK_AFE_TDM_RELATCH_RATE_176K, 7062306a36Sopenharmony_ci MTK_AFE_TDM_RELATCH_RATE_192K, 7162306a36Sopenharmony_ci MTK_AFE_TDM_RELATCH_RATE_352K, 7262306a36Sopenharmony_ci MTK_AFE_TDM_RELATCH_RATE_384K, 7362306a36Sopenharmony_ci}; 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ciunsigned int mt8186_general_rate_transform(struct device *dev, unsigned int rate) 7662306a36Sopenharmony_ci{ 7762306a36Sopenharmony_ci switch (rate) { 7862306a36Sopenharmony_ci case 8000: 7962306a36Sopenharmony_ci return MTK_AFE_RATE_8K; 8062306a36Sopenharmony_ci case 11025: 8162306a36Sopenharmony_ci return MTK_AFE_RATE_11K; 8262306a36Sopenharmony_ci case 12000: 8362306a36Sopenharmony_ci return MTK_AFE_RATE_12K; 8462306a36Sopenharmony_ci case 16000: 8562306a36Sopenharmony_ci return MTK_AFE_RATE_16K; 8662306a36Sopenharmony_ci case 22050: 8762306a36Sopenharmony_ci return MTK_AFE_RATE_22K; 8862306a36Sopenharmony_ci case 24000: 8962306a36Sopenharmony_ci return MTK_AFE_RATE_24K; 9062306a36Sopenharmony_ci case 32000: 9162306a36Sopenharmony_ci return MTK_AFE_RATE_32K; 9262306a36Sopenharmony_ci case 44100: 9362306a36Sopenharmony_ci return MTK_AFE_RATE_44K; 9462306a36Sopenharmony_ci case 48000: 9562306a36Sopenharmony_ci return MTK_AFE_RATE_48K; 9662306a36Sopenharmony_ci case 88200: 9762306a36Sopenharmony_ci return MTK_AFE_RATE_88K; 9862306a36Sopenharmony_ci case 96000: 9962306a36Sopenharmony_ci return MTK_AFE_RATE_96K; 10062306a36Sopenharmony_ci case 176400: 10162306a36Sopenharmony_ci return MTK_AFE_RATE_176K; 10262306a36Sopenharmony_ci case 192000: 10362306a36Sopenharmony_ci return MTK_AFE_RATE_192K; 10462306a36Sopenharmony_ci case 260000: 10562306a36Sopenharmony_ci return MTK_AFE_RATE_260K; 10662306a36Sopenharmony_ci case 352800: 10762306a36Sopenharmony_ci return MTK_AFE_RATE_352K; 10862306a36Sopenharmony_ci case 384000: 10962306a36Sopenharmony_ci return MTK_AFE_RATE_384K; 11062306a36Sopenharmony_ci default: 11162306a36Sopenharmony_ci dev_err(dev, "%s(), rate %u invalid, use %d!!!\n", 11262306a36Sopenharmony_ci __func__, rate, MTK_AFE_RATE_48K); 11362306a36Sopenharmony_ci } 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_ci return MTK_AFE_RATE_48K; 11662306a36Sopenharmony_ci} 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_cistatic unsigned int tdm_rate_transform(struct device *dev, unsigned int rate) 11962306a36Sopenharmony_ci{ 12062306a36Sopenharmony_ci switch (rate) { 12162306a36Sopenharmony_ci case 8000: 12262306a36Sopenharmony_ci return MTK_AFE_TDM_RATE_8K; 12362306a36Sopenharmony_ci case 11025: 12462306a36Sopenharmony_ci return MTK_AFE_TDM_RATE_11K; 12562306a36Sopenharmony_ci case 12000: 12662306a36Sopenharmony_ci return MTK_AFE_TDM_RATE_12K; 12762306a36Sopenharmony_ci case 16000: 12862306a36Sopenharmony_ci return MTK_AFE_TDM_RATE_16K; 12962306a36Sopenharmony_ci case 22050: 13062306a36Sopenharmony_ci return MTK_AFE_TDM_RATE_22K; 13162306a36Sopenharmony_ci case 24000: 13262306a36Sopenharmony_ci return MTK_AFE_TDM_RATE_24K; 13362306a36Sopenharmony_ci case 32000: 13462306a36Sopenharmony_ci return MTK_AFE_TDM_RATE_32K; 13562306a36Sopenharmony_ci case 44100: 13662306a36Sopenharmony_ci return MTK_AFE_TDM_RATE_44K; 13762306a36Sopenharmony_ci case 48000: 13862306a36Sopenharmony_ci return MTK_AFE_TDM_RATE_48K; 13962306a36Sopenharmony_ci case 64000: 14062306a36Sopenharmony_ci return MTK_AFE_TDM_RATE_64K; 14162306a36Sopenharmony_ci case 88200: 14262306a36Sopenharmony_ci return MTK_AFE_TDM_RATE_88K; 14362306a36Sopenharmony_ci case 96000: 14462306a36Sopenharmony_ci return MTK_AFE_TDM_RATE_96K; 14562306a36Sopenharmony_ci case 128000: 14662306a36Sopenharmony_ci return MTK_AFE_TDM_RATE_128K; 14762306a36Sopenharmony_ci case 176400: 14862306a36Sopenharmony_ci return MTK_AFE_TDM_RATE_176K; 14962306a36Sopenharmony_ci case 192000: 15062306a36Sopenharmony_ci return MTK_AFE_TDM_RATE_192K; 15162306a36Sopenharmony_ci case 256000: 15262306a36Sopenharmony_ci return MTK_AFE_TDM_RATE_256K; 15362306a36Sopenharmony_ci case 352800: 15462306a36Sopenharmony_ci return MTK_AFE_TDM_RATE_352K; 15562306a36Sopenharmony_ci case 384000: 15662306a36Sopenharmony_ci return MTK_AFE_TDM_RATE_384K; 15762306a36Sopenharmony_ci default: 15862306a36Sopenharmony_ci dev_err(dev, "%s(), rate %u invalid, use %d!!!\n", 15962306a36Sopenharmony_ci __func__, rate, MTK_AFE_TDM_RATE_48K); 16062306a36Sopenharmony_ci } 16162306a36Sopenharmony_ci 16262306a36Sopenharmony_ci return MTK_AFE_TDM_RATE_48K; 16362306a36Sopenharmony_ci} 16462306a36Sopenharmony_ci 16562306a36Sopenharmony_cistatic unsigned int pcm_rate_transform(struct device *dev, unsigned int rate) 16662306a36Sopenharmony_ci{ 16762306a36Sopenharmony_ci switch (rate) { 16862306a36Sopenharmony_ci case 8000: 16962306a36Sopenharmony_ci return MTK_AFE_PCM_RATE_8K; 17062306a36Sopenharmony_ci case 16000: 17162306a36Sopenharmony_ci return MTK_AFE_PCM_RATE_16K; 17262306a36Sopenharmony_ci case 32000: 17362306a36Sopenharmony_ci return MTK_AFE_PCM_RATE_32K; 17462306a36Sopenharmony_ci case 48000: 17562306a36Sopenharmony_ci return MTK_AFE_PCM_RATE_48K; 17662306a36Sopenharmony_ci default: 17762306a36Sopenharmony_ci dev_err(dev, "%s(), rate %u invalid, use %d!!!\n", 17862306a36Sopenharmony_ci __func__, rate, MTK_AFE_PCM_RATE_48K); 17962306a36Sopenharmony_ci } 18062306a36Sopenharmony_ci 18162306a36Sopenharmony_ci return MTK_AFE_PCM_RATE_48K; 18262306a36Sopenharmony_ci} 18362306a36Sopenharmony_ci 18462306a36Sopenharmony_ciunsigned int mt8186_tdm_relatch_rate_transform(struct device *dev, unsigned int rate) 18562306a36Sopenharmony_ci{ 18662306a36Sopenharmony_ci switch (rate) { 18762306a36Sopenharmony_ci case 8000: 18862306a36Sopenharmony_ci return MTK_AFE_TDM_RELATCH_RATE_8K; 18962306a36Sopenharmony_ci case 11025: 19062306a36Sopenharmony_ci return MTK_AFE_TDM_RELATCH_RATE_11K; 19162306a36Sopenharmony_ci case 12000: 19262306a36Sopenharmony_ci return MTK_AFE_TDM_RELATCH_RATE_12K; 19362306a36Sopenharmony_ci case 16000: 19462306a36Sopenharmony_ci return MTK_AFE_TDM_RELATCH_RATE_16K; 19562306a36Sopenharmony_ci case 22050: 19662306a36Sopenharmony_ci return MTK_AFE_TDM_RELATCH_RATE_22K; 19762306a36Sopenharmony_ci case 24000: 19862306a36Sopenharmony_ci return MTK_AFE_TDM_RELATCH_RATE_24K; 19962306a36Sopenharmony_ci case 32000: 20062306a36Sopenharmony_ci return MTK_AFE_TDM_RELATCH_RATE_32K; 20162306a36Sopenharmony_ci case 44100: 20262306a36Sopenharmony_ci return MTK_AFE_TDM_RELATCH_RATE_44K; 20362306a36Sopenharmony_ci case 48000: 20462306a36Sopenharmony_ci return MTK_AFE_TDM_RELATCH_RATE_48K; 20562306a36Sopenharmony_ci case 88200: 20662306a36Sopenharmony_ci return MTK_AFE_TDM_RELATCH_RATE_88K; 20762306a36Sopenharmony_ci case 96000: 20862306a36Sopenharmony_ci return MTK_AFE_TDM_RELATCH_RATE_96K; 20962306a36Sopenharmony_ci case 176400: 21062306a36Sopenharmony_ci return MTK_AFE_TDM_RELATCH_RATE_176K; 21162306a36Sopenharmony_ci case 192000: 21262306a36Sopenharmony_ci return MTK_AFE_TDM_RELATCH_RATE_192K; 21362306a36Sopenharmony_ci case 352800: 21462306a36Sopenharmony_ci return MTK_AFE_TDM_RELATCH_RATE_352K; 21562306a36Sopenharmony_ci case 384000: 21662306a36Sopenharmony_ci return MTK_AFE_TDM_RELATCH_RATE_384K; 21762306a36Sopenharmony_ci default: 21862306a36Sopenharmony_ci dev_err(dev, "%s(), rate %u invalid, use %d!!!\n", 21962306a36Sopenharmony_ci __func__, rate, MTK_AFE_TDM_RELATCH_RATE_48K); 22062306a36Sopenharmony_ci } 22162306a36Sopenharmony_ci 22262306a36Sopenharmony_ci return MTK_AFE_TDM_RELATCH_RATE_48K; 22362306a36Sopenharmony_ci} 22462306a36Sopenharmony_ci 22562306a36Sopenharmony_ciunsigned int mt8186_rate_transform(struct device *dev, unsigned int rate, int aud_blk) 22662306a36Sopenharmony_ci{ 22762306a36Sopenharmony_ci switch (aud_blk) { 22862306a36Sopenharmony_ci case MT8186_DAI_PCM: 22962306a36Sopenharmony_ci return pcm_rate_transform(dev, rate); 23062306a36Sopenharmony_ci case MT8186_DAI_TDM_IN: 23162306a36Sopenharmony_ci return tdm_rate_transform(dev, rate); 23262306a36Sopenharmony_ci default: 23362306a36Sopenharmony_ci return mt8186_general_rate_transform(dev, rate); 23462306a36Sopenharmony_ci } 23562306a36Sopenharmony_ci} 23662306a36Sopenharmony_ci 23762306a36Sopenharmony_ciint mt8186_dai_set_priv(struct mtk_base_afe *afe, int id, int priv_size, const void *priv_data) 23862306a36Sopenharmony_ci{ 23962306a36Sopenharmony_ci struct mt8186_afe_private *afe_priv = afe->platform_priv; 24062306a36Sopenharmony_ci void *temp_data; 24162306a36Sopenharmony_ci 24262306a36Sopenharmony_ci temp_data = devm_kzalloc(afe->dev, 24362306a36Sopenharmony_ci priv_size, 24462306a36Sopenharmony_ci GFP_KERNEL); 24562306a36Sopenharmony_ci if (!temp_data) 24662306a36Sopenharmony_ci return -ENOMEM; 24762306a36Sopenharmony_ci 24862306a36Sopenharmony_ci if (priv_data) 24962306a36Sopenharmony_ci memcpy(temp_data, priv_data, priv_size); 25062306a36Sopenharmony_ci 25162306a36Sopenharmony_ci afe_priv->dai_priv[id] = temp_data; 25262306a36Sopenharmony_ci 25362306a36Sopenharmony_ci return 0; 25462306a36Sopenharmony_ci} 255