0001
0002
0003
0004
0005
0006
0007
0008 #include "mt8186-afe-common.h"
0009 #include <linux/pm_runtime.h>
0010
0011 enum {
0012 MTK_AFE_RATE_8K = 0,
0013 MTK_AFE_RATE_11K,
0014 MTK_AFE_RATE_12K,
0015 MTK_AFE_RATE_384K,
0016 MTK_AFE_RATE_16K,
0017 MTK_AFE_RATE_22K,
0018 MTK_AFE_RATE_24K,
0019 MTK_AFE_RATE_352K,
0020 MTK_AFE_RATE_32K,
0021 MTK_AFE_RATE_44K,
0022 MTK_AFE_RATE_48K,
0023 MTK_AFE_RATE_88K,
0024 MTK_AFE_RATE_96K,
0025 MTK_AFE_RATE_176K,
0026 MTK_AFE_RATE_192K,
0027 MTK_AFE_RATE_260K,
0028 };
0029
0030 enum {
0031 MTK_AFE_PCM_RATE_8K = 0,
0032 MTK_AFE_PCM_RATE_16K,
0033 MTK_AFE_PCM_RATE_32K,
0034 MTK_AFE_PCM_RATE_48K,
0035 };
0036
0037 enum {
0038 MTK_AFE_TDM_RATE_8K = 0,
0039 MTK_AFE_TDM_RATE_12K,
0040 MTK_AFE_TDM_RATE_16K,
0041 MTK_AFE_TDM_RATE_24K,
0042 MTK_AFE_TDM_RATE_32K,
0043 MTK_AFE_TDM_RATE_48K,
0044 MTK_AFE_TDM_RATE_64K,
0045 MTK_AFE_TDM_RATE_96K,
0046 MTK_AFE_TDM_RATE_128K,
0047 MTK_AFE_TDM_RATE_192K,
0048 MTK_AFE_TDM_RATE_256K,
0049 MTK_AFE_TDM_RATE_384K,
0050 MTK_AFE_TDM_RATE_11K,
0051 MTK_AFE_TDM_RATE_22K,
0052 MTK_AFE_TDM_RATE_44K,
0053 MTK_AFE_TDM_RATE_88K,
0054 MTK_AFE_TDM_RATE_176K,
0055 MTK_AFE_TDM_RATE_352K,
0056 };
0057
0058 enum {
0059 MTK_AFE_TDM_RELATCH_RATE_8K = 0,
0060 MTK_AFE_TDM_RELATCH_RATE_11K,
0061 MTK_AFE_TDM_RELATCH_RATE_12K,
0062 MTK_AFE_TDM_RELATCH_RATE_16K,
0063 MTK_AFE_TDM_RELATCH_RATE_22K,
0064 MTK_AFE_TDM_RELATCH_RATE_24K,
0065 MTK_AFE_TDM_RELATCH_RATE_32K,
0066 MTK_AFE_TDM_RELATCH_RATE_44K,
0067 MTK_AFE_TDM_RELATCH_RATE_48K,
0068 MTK_AFE_TDM_RELATCH_RATE_88K,
0069 MTK_AFE_TDM_RELATCH_RATE_96K,
0070 MTK_AFE_TDM_RELATCH_RATE_176K,
0071 MTK_AFE_TDM_RELATCH_RATE_192K,
0072 MTK_AFE_TDM_RELATCH_RATE_352K,
0073 MTK_AFE_TDM_RELATCH_RATE_384K,
0074 };
0075
0076 unsigned int mt8186_general_rate_transform(struct device *dev, unsigned int rate)
0077 {
0078 switch (rate) {
0079 case 8000:
0080 return MTK_AFE_RATE_8K;
0081 case 11025:
0082 return MTK_AFE_RATE_11K;
0083 case 12000:
0084 return MTK_AFE_RATE_12K;
0085 case 16000:
0086 return MTK_AFE_RATE_16K;
0087 case 22050:
0088 return MTK_AFE_RATE_22K;
0089 case 24000:
0090 return MTK_AFE_RATE_24K;
0091 case 32000:
0092 return MTK_AFE_RATE_32K;
0093 case 44100:
0094 return MTK_AFE_RATE_44K;
0095 case 48000:
0096 return MTK_AFE_RATE_48K;
0097 case 88200:
0098 return MTK_AFE_RATE_88K;
0099 case 96000:
0100 return MTK_AFE_RATE_96K;
0101 case 176400:
0102 return MTK_AFE_RATE_176K;
0103 case 192000:
0104 return MTK_AFE_RATE_192K;
0105 case 260000:
0106 return MTK_AFE_RATE_260K;
0107 case 352800:
0108 return MTK_AFE_RATE_352K;
0109 case 384000:
0110 return MTK_AFE_RATE_384K;
0111 default:
0112 dev_err(dev, "%s(), rate %u invalid, use %d!!!\n",
0113 __func__, rate, MTK_AFE_RATE_48K);
0114 }
0115
0116 return MTK_AFE_RATE_48K;
0117 }
0118
0119 static unsigned int tdm_rate_transform(struct device *dev, unsigned int rate)
0120 {
0121 switch (rate) {
0122 case 8000:
0123 return MTK_AFE_TDM_RATE_8K;
0124 case 11025:
0125 return MTK_AFE_TDM_RATE_11K;
0126 case 12000:
0127 return MTK_AFE_TDM_RATE_12K;
0128 case 16000:
0129 return MTK_AFE_TDM_RATE_16K;
0130 case 22050:
0131 return MTK_AFE_TDM_RATE_22K;
0132 case 24000:
0133 return MTK_AFE_TDM_RATE_24K;
0134 case 32000:
0135 return MTK_AFE_TDM_RATE_32K;
0136 case 44100:
0137 return MTK_AFE_TDM_RATE_44K;
0138 case 48000:
0139 return MTK_AFE_TDM_RATE_48K;
0140 case 64000:
0141 return MTK_AFE_TDM_RATE_64K;
0142 case 88200:
0143 return MTK_AFE_TDM_RATE_88K;
0144 case 96000:
0145 return MTK_AFE_TDM_RATE_96K;
0146 case 128000:
0147 return MTK_AFE_TDM_RATE_128K;
0148 case 176400:
0149 return MTK_AFE_TDM_RATE_176K;
0150 case 192000:
0151 return MTK_AFE_TDM_RATE_192K;
0152 case 256000:
0153 return MTK_AFE_TDM_RATE_256K;
0154 case 352800:
0155 return MTK_AFE_TDM_RATE_352K;
0156 case 384000:
0157 return MTK_AFE_TDM_RATE_384K;
0158 default:
0159 dev_err(dev, "%s(), rate %u invalid, use %d!!!\n",
0160 __func__, rate, MTK_AFE_TDM_RATE_48K);
0161 }
0162
0163 return MTK_AFE_TDM_RATE_48K;
0164 }
0165
0166 static unsigned int pcm_rate_transform(struct device *dev, unsigned int rate)
0167 {
0168 switch (rate) {
0169 case 8000:
0170 return MTK_AFE_PCM_RATE_8K;
0171 case 16000:
0172 return MTK_AFE_PCM_RATE_16K;
0173 case 32000:
0174 return MTK_AFE_PCM_RATE_32K;
0175 case 48000:
0176 return MTK_AFE_PCM_RATE_48K;
0177 default:
0178 dev_err(dev, "%s(), rate %u invalid, use %d!!!\n",
0179 __func__, rate, MTK_AFE_PCM_RATE_48K);
0180 }
0181
0182 return MTK_AFE_PCM_RATE_48K;
0183 }
0184
0185 unsigned int mt8186_tdm_relatch_rate_transform(struct device *dev, unsigned int rate)
0186 {
0187 switch (rate) {
0188 case 8000:
0189 return MTK_AFE_TDM_RELATCH_RATE_8K;
0190 case 11025:
0191 return MTK_AFE_TDM_RELATCH_RATE_11K;
0192 case 12000:
0193 return MTK_AFE_TDM_RELATCH_RATE_12K;
0194 case 16000:
0195 return MTK_AFE_TDM_RELATCH_RATE_16K;
0196 case 22050:
0197 return MTK_AFE_TDM_RELATCH_RATE_22K;
0198 case 24000:
0199 return MTK_AFE_TDM_RELATCH_RATE_24K;
0200 case 32000:
0201 return MTK_AFE_TDM_RELATCH_RATE_32K;
0202 case 44100:
0203 return MTK_AFE_TDM_RELATCH_RATE_44K;
0204 case 48000:
0205 return MTK_AFE_TDM_RELATCH_RATE_48K;
0206 case 88200:
0207 return MTK_AFE_TDM_RELATCH_RATE_88K;
0208 case 96000:
0209 return MTK_AFE_TDM_RELATCH_RATE_96K;
0210 case 176400:
0211 return MTK_AFE_TDM_RELATCH_RATE_176K;
0212 case 192000:
0213 return MTK_AFE_TDM_RELATCH_RATE_192K;
0214 case 352800:
0215 return MTK_AFE_TDM_RELATCH_RATE_352K;
0216 case 384000:
0217 return MTK_AFE_TDM_RELATCH_RATE_384K;
0218 default:
0219 dev_err(dev, "%s(), rate %u invalid, use %d!!!\n",
0220 __func__, rate, MTK_AFE_TDM_RELATCH_RATE_48K);
0221 }
0222
0223 return MTK_AFE_TDM_RELATCH_RATE_48K;
0224 }
0225
0226 unsigned int mt8186_rate_transform(struct device *dev, unsigned int rate, int aud_blk)
0227 {
0228 switch (aud_blk) {
0229 case MT8186_DAI_PCM:
0230 return pcm_rate_transform(dev, rate);
0231 case MT8186_DAI_TDM_IN:
0232 return tdm_rate_transform(dev, rate);
0233 default:
0234 return mt8186_general_rate_transform(dev, rate);
0235 }
0236 }
0237
0238 int mt8186_dai_set_priv(struct mtk_base_afe *afe, int id, int priv_size, const void *priv_data)
0239 {
0240 struct mt8186_afe_private *afe_priv = afe->platform_priv;
0241 void *temp_data;
0242
0243 temp_data = devm_kzalloc(afe->dev,
0244 priv_size,
0245 GFP_KERNEL);
0246 if (!temp_data)
0247 return -ENOMEM;
0248
0249 if (priv_data)
0250 memcpy(temp_data, priv_data, priv_size);
0251
0252 afe_priv->dai_priv[id] = temp_data;
0253
0254 return 0;
0255 }