GNU Linux-libre 5.19-rc6-gnu
[releases.git] / sound / soc / mediatek / mt8192 / mt8192-afe-control.c
1 // SPDX-License-Identifier: GPL-2.0
2 //
3 // MediaTek ALSA SoC Audio Control
4 //
5 // Copyright (c) 2020 MediaTek Inc.
6 // Author: Shane Chien <shane.chien@mediatek.com>
7 //
8
9 #include <linux/pm_runtime.h>
10
11 #include "mt8192-afe-common.h"
12
13 enum {
14         MTK_AFE_RATE_8K = 0,
15         MTK_AFE_RATE_11K = 1,
16         MTK_AFE_RATE_12K = 2,
17         MTK_AFE_RATE_384K = 3,
18         MTK_AFE_RATE_16K = 4,
19         MTK_AFE_RATE_22K = 5,
20         MTK_AFE_RATE_24K = 6,
21         MTK_AFE_RATE_352K = 7,
22         MTK_AFE_RATE_32K = 8,
23         MTK_AFE_RATE_44K = 9,
24         MTK_AFE_RATE_48K = 10,
25         MTK_AFE_RATE_88K = 11,
26         MTK_AFE_RATE_96K = 12,
27         MTK_AFE_RATE_176K = 13,
28         MTK_AFE_RATE_192K = 14,
29         MTK_AFE_RATE_260K = 15,
30 };
31
32 enum {
33         MTK_AFE_DAI_MEMIF_RATE_8K = 0,
34         MTK_AFE_DAI_MEMIF_RATE_16K = 1,
35         MTK_AFE_DAI_MEMIF_RATE_32K = 2,
36         MTK_AFE_DAI_MEMIF_RATE_48K = 3,
37 };
38
39 enum {
40         MTK_AFE_PCM_RATE_8K = 0,
41         MTK_AFE_PCM_RATE_16K = 1,
42         MTK_AFE_PCM_RATE_32K = 2,
43         MTK_AFE_PCM_RATE_48K = 3,
44 };
45
46 unsigned int mt8192_general_rate_transform(struct device *dev,
47                                            unsigned int rate)
48 {
49         switch (rate) {
50         case 8000:
51                 return MTK_AFE_RATE_8K;
52         case 11025:
53                 return MTK_AFE_RATE_11K;
54         case 12000:
55                 return MTK_AFE_RATE_12K;
56         case 16000:
57                 return MTK_AFE_RATE_16K;
58         case 22050:
59                 return MTK_AFE_RATE_22K;
60         case 24000:
61                 return MTK_AFE_RATE_24K;
62         case 32000:
63                 return MTK_AFE_RATE_32K;
64         case 44100:
65                 return MTK_AFE_RATE_44K;
66         case 48000:
67                 return MTK_AFE_RATE_48K;
68         case 88200:
69                 return MTK_AFE_RATE_88K;
70         case 96000:
71                 return MTK_AFE_RATE_96K;
72         case 176400:
73                 return MTK_AFE_RATE_176K;
74         case 192000:
75                 return MTK_AFE_RATE_192K;
76         case 260000:
77                 return MTK_AFE_RATE_260K;
78         case 352800:
79                 return MTK_AFE_RATE_352K;
80         case 384000:
81                 return MTK_AFE_RATE_384K;
82         default:
83                 dev_warn(dev, "%s(), rate %u invalid, use %d!!!\n",
84                          __func__,
85                          rate, MTK_AFE_RATE_48K);
86                 return MTK_AFE_RATE_48K;
87         }
88 }
89
90 static unsigned int dai_memif_rate_transform(struct device *dev,
91                                              unsigned int rate)
92 {
93         switch (rate) {
94         case 8000:
95                 return MTK_AFE_DAI_MEMIF_RATE_8K;
96         case 16000:
97                 return MTK_AFE_DAI_MEMIF_RATE_16K;
98         case 32000:
99                 return MTK_AFE_DAI_MEMIF_RATE_32K;
100         case 48000:
101                 return MTK_AFE_DAI_MEMIF_RATE_48K;
102         default:
103                 dev_warn(dev, "%s(), rate %u invalid, use %d!!!\n",
104                          __func__,
105                          rate, MTK_AFE_DAI_MEMIF_RATE_16K);
106                 return MTK_AFE_DAI_MEMIF_RATE_16K;
107         }
108 }
109
110 static unsigned int pcm_rate_transform(struct device *dev,
111                                        unsigned int rate)
112 {
113         switch (rate) {
114         case 8000:
115                 return MTK_AFE_PCM_RATE_8K;
116         case 16000:
117                 return MTK_AFE_PCM_RATE_16K;
118         case 32000:
119                 return MTK_AFE_PCM_RATE_32K;
120         case 48000:
121                 return MTK_AFE_PCM_RATE_48K;
122         default:
123                 dev_warn(dev, "%s(), rate %u invalid, use %d!!!\n",
124                          __func__,
125                          rate, MTK_AFE_PCM_RATE_32K);
126                 return MTK_AFE_PCM_RATE_32K;
127         }
128 }
129
130 unsigned int mt8192_rate_transform(struct device *dev,
131                                    unsigned int rate, int aud_blk)
132 {
133         switch (aud_blk) {
134         case MT8192_MEMIF_DAI:
135         case MT8192_MEMIF_MOD_DAI:
136                 return dai_memif_rate_transform(dev, rate);
137         case MT8192_DAI_PCM_1:
138         case MT8192_DAI_PCM_2:
139                 return pcm_rate_transform(dev, rate);
140         default:
141                 return mt8192_general_rate_transform(dev, rate);
142         }
143 }
144
145 int mt8192_dai_set_priv(struct mtk_base_afe *afe, int id,
146                         int priv_size, const void *priv_data)
147 {
148         struct mt8192_afe_private *afe_priv = afe->platform_priv;
149         void *temp_data;
150
151         temp_data = devm_kzalloc(afe->dev,
152                                  priv_size,
153                                  GFP_KERNEL);
154         if (!temp_data)
155                 return -ENOMEM;
156
157         if (priv_data)
158                 memcpy(temp_data, priv_data, priv_size);
159
160         afe_priv->dai_priv[id] = temp_data;
161
162         return 0;
163 }