forked from Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
163 lines
3.4 KiB
163 lines
3.4 KiB
// SPDX-License-Identifier: GPL-2.0 |
|
// |
|
// MediaTek ALSA SoC Audio Control |
|
// |
|
// Copyright (c) 2020 MediaTek Inc. |
|
// Author: Shane Chien <[email protected]> |
|
// |
|
|
|
#include <linux/pm_runtime.h> |
|
|
|
#include "mt8192-afe-common.h" |
|
|
|
enum { |
|
MTK_AFE_RATE_8K = 0, |
|
MTK_AFE_RATE_11K = 1, |
|
MTK_AFE_RATE_12K = 2, |
|
MTK_AFE_RATE_384K = 3, |
|
MTK_AFE_RATE_16K = 4, |
|
MTK_AFE_RATE_22K = 5, |
|
MTK_AFE_RATE_24K = 6, |
|
MTK_AFE_RATE_352K = 7, |
|
MTK_AFE_RATE_32K = 8, |
|
MTK_AFE_RATE_44K = 9, |
|
MTK_AFE_RATE_48K = 10, |
|
MTK_AFE_RATE_88K = 11, |
|
MTK_AFE_RATE_96K = 12, |
|
MTK_AFE_RATE_176K = 13, |
|
MTK_AFE_RATE_192K = 14, |
|
MTK_AFE_RATE_260K = 15, |
|
}; |
|
|
|
enum { |
|
MTK_AFE_DAI_MEMIF_RATE_8K = 0, |
|
MTK_AFE_DAI_MEMIF_RATE_16K = 1, |
|
MTK_AFE_DAI_MEMIF_RATE_32K = 2, |
|
MTK_AFE_DAI_MEMIF_RATE_48K = 3, |
|
}; |
|
|
|
enum { |
|
MTK_AFE_PCM_RATE_8K = 0, |
|
MTK_AFE_PCM_RATE_16K = 1, |
|
MTK_AFE_PCM_RATE_32K = 2, |
|
MTK_AFE_PCM_RATE_48K = 3, |
|
}; |
|
|
|
unsigned int mt8192_general_rate_transform(struct device *dev, |
|
unsigned int rate) |
|
{ |
|
switch (rate) { |
|
case 8000: |
|
return MTK_AFE_RATE_8K; |
|
case 11025: |
|
return MTK_AFE_RATE_11K; |
|
case 12000: |
|
return MTK_AFE_RATE_12K; |
|
case 16000: |
|
return MTK_AFE_RATE_16K; |
|
case 22050: |
|
return MTK_AFE_RATE_22K; |
|
case 24000: |
|
return MTK_AFE_RATE_24K; |
|
case 32000: |
|
return MTK_AFE_RATE_32K; |
|
case 44100: |
|
return MTK_AFE_RATE_44K; |
|
case 48000: |
|
return MTK_AFE_RATE_48K; |
|
case 88200: |
|
return MTK_AFE_RATE_88K; |
|
case 96000: |
|
return MTK_AFE_RATE_96K; |
|
case 176400: |
|
return MTK_AFE_RATE_176K; |
|
case 192000: |
|
return MTK_AFE_RATE_192K; |
|
case 260000: |
|
return MTK_AFE_RATE_260K; |
|
case 352800: |
|
return MTK_AFE_RATE_352K; |
|
case 384000: |
|
return MTK_AFE_RATE_384K; |
|
default: |
|
dev_warn(dev, "%s(), rate %u invalid, use %d!!!\n", |
|
__func__, |
|
rate, MTK_AFE_RATE_48K); |
|
return MTK_AFE_RATE_48K; |
|
} |
|
} |
|
|
|
static unsigned int dai_memif_rate_transform(struct device *dev, |
|
unsigned int rate) |
|
{ |
|
switch (rate) { |
|
case 8000: |
|
return MTK_AFE_DAI_MEMIF_RATE_8K; |
|
case 16000: |
|
return MTK_AFE_DAI_MEMIF_RATE_16K; |
|
case 32000: |
|
return MTK_AFE_DAI_MEMIF_RATE_32K; |
|
case 48000: |
|
return MTK_AFE_DAI_MEMIF_RATE_48K; |
|
default: |
|
dev_warn(dev, "%s(), rate %u invalid, use %d!!!\n", |
|
__func__, |
|
rate, MTK_AFE_DAI_MEMIF_RATE_16K); |
|
return MTK_AFE_DAI_MEMIF_RATE_16K; |
|
} |
|
} |
|
|
|
static unsigned int pcm_rate_transform(struct device *dev, |
|
unsigned int rate) |
|
{ |
|
switch (rate) { |
|
case 8000: |
|
return MTK_AFE_PCM_RATE_8K; |
|
case 16000: |
|
return MTK_AFE_PCM_RATE_16K; |
|
case 32000: |
|
return MTK_AFE_PCM_RATE_32K; |
|
case 48000: |
|
return MTK_AFE_PCM_RATE_48K; |
|
default: |
|
dev_warn(dev, "%s(), rate %u invalid, use %d!!!\n", |
|
__func__, |
|
rate, MTK_AFE_PCM_RATE_32K); |
|
return MTK_AFE_PCM_RATE_32K; |
|
} |
|
} |
|
|
|
unsigned int mt8192_rate_transform(struct device *dev, |
|
unsigned int rate, int aud_blk) |
|
{ |
|
switch (aud_blk) { |
|
case MT8192_MEMIF_DAI: |
|
case MT8192_MEMIF_MOD_DAI: |
|
return dai_memif_rate_transform(dev, rate); |
|
case MT8192_DAI_PCM_1: |
|
case MT8192_DAI_PCM_2: |
|
return pcm_rate_transform(dev, rate); |
|
default: |
|
return mt8192_general_rate_transform(dev, rate); |
|
} |
|
} |
|
|
|
int mt8192_dai_set_priv(struct mtk_base_afe *afe, int id, |
|
int priv_size, const void *priv_data) |
|
{ |
|
struct mt8192_afe_private *afe_priv = afe->platform_priv; |
|
void *temp_data; |
|
|
|
temp_data = devm_kzalloc(afe->dev, |
|
priv_size, |
|
GFP_KERNEL); |
|
if (!temp_data) |
|
return -ENOMEM; |
|
|
|
if (priv_data) |
|
memcpy(temp_data, priv_data, priv_size); |
|
|
|
afe_priv->dai_priv[id] = temp_data; |
|
|
|
return 0; |
|
}
|
|
|