Linux-libre 5.4.48-gnu
[librecmc/linux-libre.git] / sound / soc / codecs / wl1273.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * ALSA SoC WL1273 codec driver
4  *
5  * Author:      Matti Aaltonen, <matti.j.aaltonen@nokia.com>
6  *
7  * Copyright:   (C) 2010, 2011 Nokia Corporation
8  */
9
10 #include <linux/mfd/wl1273-core.h>
11 #include <linux/slab.h>
12 #include <linux/module.h>
13 #include <sound/pcm.h>
14 #include <sound/pcm_params.h>
15 #include <sound/soc.h>
16 #include <sound/initval.h>
17
18 #include "wl1273.h"
19
20 enum wl1273_mode { WL1273_MODE_BT, WL1273_MODE_FM_RX, WL1273_MODE_FM_TX };
21
22 /* codec private data */
23 struct wl1273_priv {
24         enum wl1273_mode mode;
25         struct wl1273_core *core;
26         unsigned int channels;
27 };
28
29 static int snd_wl1273_fm_set_i2s_mode(struct wl1273_core *core,
30                                       int rate, int width)
31 {
32         struct device *dev = &core->client->dev;
33         int r = 0;
34         u16 mode;
35
36         dev_dbg(dev, "rate: %d\n", rate);
37         dev_dbg(dev, "width: %d\n", width);
38
39         mutex_lock(&core->lock);
40
41         mode = core->i2s_mode & ~WL1273_IS2_WIDTH & ~WL1273_IS2_RATE;
42
43         switch (rate) {
44         case 48000:
45                 mode |= WL1273_IS2_RATE_48K;
46                 break;
47         case 44100:
48                 mode |= WL1273_IS2_RATE_44_1K;
49                 break;
50         case 32000:
51                 mode |= WL1273_IS2_RATE_32K;
52                 break;
53         case 22050:
54                 mode |= WL1273_IS2_RATE_22_05K;
55                 break;
56         case 16000:
57                 mode |= WL1273_IS2_RATE_16K;
58                 break;
59         case 12000:
60                 mode |= WL1273_IS2_RATE_12K;
61                 break;
62         case 11025:
63                 mode |= WL1273_IS2_RATE_11_025;
64                 break;
65         case 8000:
66                 mode |= WL1273_IS2_RATE_8K;
67                 break;
68         default:
69                 dev_err(dev, "Sampling rate: %d not supported\n", rate);
70                 r = -EINVAL;
71                 goto out;
72         }
73
74         switch (width) {
75         case 16:
76                 mode |= WL1273_IS2_WIDTH_32;
77                 break;
78         case 20:
79                 mode |= WL1273_IS2_WIDTH_40;
80                 break;
81         case 24:
82                 mode |= WL1273_IS2_WIDTH_48;
83                 break;
84         case 25:
85                 mode |= WL1273_IS2_WIDTH_50;
86                 break;
87         case 30:
88                 mode |= WL1273_IS2_WIDTH_60;
89                 break;
90         case 32:
91                 mode |= WL1273_IS2_WIDTH_64;
92                 break;
93         case 40:
94                 mode |= WL1273_IS2_WIDTH_80;
95                 break;
96         case 48:
97                 mode |= WL1273_IS2_WIDTH_96;
98                 break;
99         case 64:
100                 mode |= WL1273_IS2_WIDTH_128;
101                 break;
102         default:
103                 dev_err(dev, "Data width: %d not supported\n", width);
104                 r = -EINVAL;
105                 goto out;
106         }
107
108         dev_dbg(dev, "WL1273_I2S_DEF_MODE: 0x%04x\n",  WL1273_I2S_DEF_MODE);
109         dev_dbg(dev, "core->i2s_mode: 0x%04x\n", core->i2s_mode);
110         dev_dbg(dev, "mode: 0x%04x\n", mode);
111
112         if (core->i2s_mode != mode) {
113                 r = core->write(core, WL1273_I2S_MODE_CONFIG_SET, mode);
114                 if (r)
115                         goto out;
116
117                 core->i2s_mode = mode;
118                 r = core->write(core, WL1273_AUDIO_ENABLE,
119                                 WL1273_AUDIO_ENABLE_I2S);
120                 if (r)
121                         goto out;
122         }
123 out:
124         mutex_unlock(&core->lock);
125
126         return r;
127 }
128
129 static int snd_wl1273_fm_set_channel_number(struct wl1273_core *core,
130                                             int channel_number)
131 {
132         struct device *dev = &core->client->dev;
133         int r = 0;
134
135         dev_dbg(dev, "%s\n", __func__);
136
137         mutex_lock(&core->lock);
138
139         if (core->channel_number == channel_number)
140                 goto out;
141
142         if (channel_number == 1 && core->mode == WL1273_MODE_RX)
143                 r = core->write(core, WL1273_MOST_MODE_SET, WL1273_RX_MONO);
144         else if (channel_number == 1 && core->mode == WL1273_MODE_TX)
145                 r = core->write(core, WL1273_MONO_SET, WL1273_TX_MONO);
146         else if (channel_number == 2 && core->mode == WL1273_MODE_RX)
147                 r = core->write(core, WL1273_MOST_MODE_SET, WL1273_RX_STEREO);
148         else if (channel_number == 2 && core->mode == WL1273_MODE_TX)
149                 r = core->write(core, WL1273_MONO_SET, WL1273_TX_STEREO);
150         else
151                 r = -EINVAL;
152 out:
153         mutex_unlock(&core->lock);
154
155         return r;
156 }
157
158 static int snd_wl1273_get_audio_route(struct snd_kcontrol *kcontrol,
159                                       struct snd_ctl_elem_value *ucontrol)
160 {
161         struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
162         struct wl1273_priv *wl1273 = snd_soc_component_get_drvdata(component);
163
164         ucontrol->value.enumerated.item[0] = wl1273->mode;
165
166         return 0;
167 }
168
169 /*
170  * TODO: Implement the audio routing in the driver. Now this control
171  * only indicates the setting that has been done elsewhere (in the user
172  * space).
173  */
174 static const char * const wl1273_audio_route[] = { "Bt", "FmRx", "FmTx" };
175
176 static int snd_wl1273_set_audio_route(struct snd_kcontrol *kcontrol,
177                                       struct snd_ctl_elem_value *ucontrol)
178 {
179         struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
180         struct wl1273_priv *wl1273 = snd_soc_component_get_drvdata(component);
181
182         if (wl1273->mode == ucontrol->value.enumerated.item[0])
183                 return 0;
184
185         /* Do not allow changes while stream is running */
186         if (snd_soc_component_is_active(component))
187                 return -EPERM;
188
189         if (ucontrol->value.enumerated.item[0] >=  ARRAY_SIZE(wl1273_audio_route))
190                 return -EINVAL;
191
192         wl1273->mode = ucontrol->value.enumerated.item[0];
193
194         return 1;
195 }
196
197 static SOC_ENUM_SINGLE_EXT_DECL(wl1273_enum, wl1273_audio_route);
198
199 static int snd_wl1273_fm_audio_get(struct snd_kcontrol *kcontrol,
200                                    struct snd_ctl_elem_value *ucontrol)
201 {
202         struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
203         struct wl1273_priv *wl1273 = snd_soc_component_get_drvdata(component);
204
205         dev_dbg(component->dev, "%s: enter.\n", __func__);
206
207         ucontrol->value.enumerated.item[0] = wl1273->core->audio_mode;
208
209         return 0;
210 }
211
212 static int snd_wl1273_fm_audio_put(struct snd_kcontrol *kcontrol,
213                                    struct snd_ctl_elem_value *ucontrol)
214 {
215         struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
216         struct wl1273_priv *wl1273 = snd_soc_component_get_drvdata(component);
217         int val, r = 0;
218
219         dev_dbg(component->dev, "%s: enter.\n", __func__);
220
221         val = ucontrol->value.enumerated.item[0];
222         if (wl1273->core->audio_mode == val)
223                 return 0;
224
225         r = wl1273->core->set_audio(wl1273->core, val);
226         if (r < 0)
227                 return r;
228
229         return 1;
230 }
231
232 static const char * const wl1273_audio_strings[] = { "Digital", "Analog" };
233
234 static SOC_ENUM_SINGLE_EXT_DECL(wl1273_audio_enum, wl1273_audio_strings);
235
236 static int snd_wl1273_fm_volume_get(struct snd_kcontrol *kcontrol,
237                                     struct snd_ctl_elem_value *ucontrol)
238 {
239         struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
240         struct wl1273_priv *wl1273 = snd_soc_component_get_drvdata(component);
241
242         dev_dbg(component->dev, "%s: enter.\n", __func__);
243
244         ucontrol->value.integer.value[0] = wl1273->core->volume;
245
246         return 0;
247 }
248
249 static int snd_wl1273_fm_volume_put(struct snd_kcontrol *kcontrol,
250                                     struct snd_ctl_elem_value *ucontrol)
251 {
252         struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
253         struct wl1273_priv *wl1273 = snd_soc_component_get_drvdata(component);
254         int r;
255
256         dev_dbg(component->dev, "%s: enter.\n", __func__);
257
258         r = wl1273->core->set_volume(wl1273->core,
259                                      ucontrol->value.integer.value[0]);
260         if (r)
261                 return r;
262
263         return 1;
264 }
265
266 static const struct snd_kcontrol_new wl1273_controls[] = {
267         SOC_ENUM_EXT("Codec Mode", wl1273_enum,
268                      snd_wl1273_get_audio_route, snd_wl1273_set_audio_route),
269         SOC_ENUM_EXT("Audio Switch", wl1273_audio_enum,
270                      snd_wl1273_fm_audio_get,  snd_wl1273_fm_audio_put),
271         SOC_SINGLE_EXT("Volume", 0, 0, WL1273_MAX_VOLUME, 0,
272                        snd_wl1273_fm_volume_get, snd_wl1273_fm_volume_put),
273 };
274
275 static const struct snd_soc_dapm_widget wl1273_dapm_widgets[] = {
276         SND_SOC_DAPM_INPUT("RX"),
277
278         SND_SOC_DAPM_OUTPUT("TX"),
279 };
280
281 static const struct snd_soc_dapm_route wl1273_dapm_routes[] = {
282         { "Capture", NULL, "RX" },
283
284         { "TX", NULL, "Playback" },
285 };
286
287 static int wl1273_startup(struct snd_pcm_substream *substream,
288                           struct snd_soc_dai *dai)
289 {
290         struct snd_soc_component *component = dai->component;
291         struct wl1273_priv *wl1273 = snd_soc_component_get_drvdata(component);
292
293         switch (wl1273->mode) {
294         case WL1273_MODE_BT:
295                 snd_pcm_hw_constraint_single(substream->runtime,
296                                              SNDRV_PCM_HW_PARAM_RATE, 8000);
297                 snd_pcm_hw_constraint_single(substream->runtime,
298                                              SNDRV_PCM_HW_PARAM_CHANNELS, 1);
299                 break;
300         case WL1273_MODE_FM_RX:
301                 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
302                         pr_err("Cannot play in RX mode.\n");
303                         return -EINVAL;
304                 }
305                 break;
306         case WL1273_MODE_FM_TX:
307                 if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) {
308                         pr_err("Cannot capture in TX mode.\n");
309                         return -EINVAL;
310                 }
311                 break;
312         default:
313                 return -EINVAL;
314                 break;
315         }
316
317         return 0;
318 }
319
320 static int wl1273_hw_params(struct snd_pcm_substream *substream,
321                             struct snd_pcm_hw_params *params,
322                             struct snd_soc_dai *dai)
323 {
324         struct wl1273_priv *wl1273 = snd_soc_component_get_drvdata(dai->component);
325         struct wl1273_core *core = wl1273->core;
326         unsigned int rate, width, r;
327
328         if (params_width(params) != 16) {
329                 dev_err(dai->dev, "%d bits/sample not supported\n",
330                         params_width(params));
331                 return -EINVAL;
332         }
333
334         rate = params_rate(params);
335         width =  hw_param_interval(params, SNDRV_PCM_HW_PARAM_SAMPLE_BITS)->min;
336
337         if (wl1273->mode == WL1273_MODE_BT) {
338                 if (rate != 8000) {
339                         pr_err("Rate %d not supported.\n", params_rate(params));
340                         return -EINVAL;
341                 }
342
343                 if (params_channels(params) != 1) {
344                         pr_err("Only mono supported.\n");
345                         return -EINVAL;
346                 }
347
348                 return 0;
349         }
350
351         if (wl1273->mode == WL1273_MODE_FM_TX &&
352             substream->stream == SNDRV_PCM_STREAM_CAPTURE) {
353                 pr_err("Only playback supported with TX.\n");
354                 return -EINVAL;
355         }
356
357         if (wl1273->mode == WL1273_MODE_FM_RX  &&
358             substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
359                 pr_err("Only capture supported with RX.\n");
360                 return -EINVAL;
361         }
362
363         if (wl1273->mode != WL1273_MODE_FM_RX  &&
364             wl1273->mode != WL1273_MODE_FM_TX) {
365                 pr_err("Unexpected mode: %d.\n", wl1273->mode);
366                 return -EINVAL;
367         }
368
369         r = snd_wl1273_fm_set_i2s_mode(core, rate, width);
370         if (r)
371                 return r;
372
373         wl1273->channels = params_channels(params);
374         r = snd_wl1273_fm_set_channel_number(core, wl1273->channels);
375         if (r)
376                 return r;
377
378         return 0;
379 }
380
381 static const struct snd_soc_dai_ops wl1273_dai_ops = {
382         .startup        = wl1273_startup,
383         .hw_params      = wl1273_hw_params,
384 };
385
386 static struct snd_soc_dai_driver wl1273_dai = {
387         .name = "wl1273-fm",
388         .playback = {
389                 .stream_name = "Playback",
390                 .channels_min = 1,
391                 .channels_max = 2,
392                 .rates = SNDRV_PCM_RATE_8000_48000,
393                 .formats = SNDRV_PCM_FMTBIT_S16_LE},
394         .capture = {
395                 .stream_name = "Capture",
396                 .channels_min = 1,
397                 .channels_max = 2,
398                 .rates = SNDRV_PCM_RATE_8000_48000,
399                 .formats = SNDRV_PCM_FMTBIT_S16_LE},
400         .ops = &wl1273_dai_ops,
401 };
402
403 /* Audio interface format for the soc_card driver */
404 int wl1273_get_format(struct snd_soc_component *component, unsigned int *fmt)
405 {
406         struct wl1273_priv *wl1273;
407
408         if (component == NULL || fmt == NULL)
409                 return -EINVAL;
410
411         wl1273 = snd_soc_component_get_drvdata(component);
412
413         switch (wl1273->mode) {
414         case WL1273_MODE_FM_RX:
415         case WL1273_MODE_FM_TX:
416                 *fmt =  SND_SOC_DAIFMT_I2S |
417                         SND_SOC_DAIFMT_NB_NF |
418                         SND_SOC_DAIFMT_CBM_CFM;
419
420                 break;
421         case WL1273_MODE_BT:
422                 *fmt =  SND_SOC_DAIFMT_DSP_A |
423                         SND_SOC_DAIFMT_IB_NF |
424                         SND_SOC_DAIFMT_CBM_CFM;
425
426                 break;
427         default:
428                 return -EINVAL;
429         }
430
431         return 0;
432 }
433 EXPORT_SYMBOL_GPL(wl1273_get_format);
434
435 static int wl1273_probe(struct snd_soc_component *component)
436 {
437         struct wl1273_core **core = component->dev->platform_data;
438         struct wl1273_priv *wl1273;
439
440         dev_dbg(component->dev, "%s.\n", __func__);
441
442         if (!core) {
443                 dev_err(component->dev, "Platform data is missing.\n");
444                 return -EINVAL;
445         }
446
447         wl1273 = kzalloc(sizeof(struct wl1273_priv), GFP_KERNEL);
448         if (!wl1273)
449                 return -ENOMEM;
450
451         wl1273->mode = WL1273_MODE_BT;
452         wl1273->core = *core;
453
454         snd_soc_component_set_drvdata(component, wl1273);
455
456         return 0;
457 }
458
459 static void wl1273_remove(struct snd_soc_component *component)
460 {
461         struct wl1273_priv *wl1273 = snd_soc_component_get_drvdata(component);
462
463         dev_dbg(component->dev, "%s\n", __func__);
464         kfree(wl1273);
465 }
466
467 static const struct snd_soc_component_driver soc_component_dev_wl1273 = {
468         .probe                  = wl1273_probe,
469         .remove                 = wl1273_remove,
470         .controls               = wl1273_controls,
471         .num_controls           = ARRAY_SIZE(wl1273_controls),
472         .dapm_widgets           = wl1273_dapm_widgets,
473         .num_dapm_widgets       = ARRAY_SIZE(wl1273_dapm_widgets),
474         .dapm_routes            = wl1273_dapm_routes,
475         .num_dapm_routes        = ARRAY_SIZE(wl1273_dapm_routes),
476         .idle_bias_on           = 1,
477         .use_pmdown_time        = 1,
478         .endianness             = 1,
479         .non_legacy_dai_naming  = 1,
480 };
481
482 static int wl1273_platform_probe(struct platform_device *pdev)
483 {
484         return devm_snd_soc_register_component(&pdev->dev,
485                                       &soc_component_dev_wl1273,
486                                       &wl1273_dai, 1);
487 }
488
489 static int wl1273_platform_remove(struct platform_device *pdev)
490 {
491         return 0;
492 }
493
494 MODULE_ALIAS("platform:wl1273-codec");
495
496 static struct platform_driver wl1273_platform_driver = {
497         .driver         = {
498                 .name   = "wl1273-codec",
499         },
500         .probe          = wl1273_platform_probe,
501         .remove         = wl1273_platform_remove,
502 };
503
504 module_platform_driver(wl1273_platform_driver);
505
506 MODULE_AUTHOR("Matti Aaltonen <matti.j.aaltonen@nokia.com>");
507 MODULE_DESCRIPTION("ASoC WL1273 codec driver");
508 MODULE_LICENSE("GPL");