GNU Linux-libre 5.10.215-gnu1
[releases.git] / drivers / staging / greybus / audio_codec.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * APBridge ALSA SoC dummy codec driver
4  * Copyright 2016 Google Inc.
5  * Copyright 2016 Linaro Ltd.
6  */
7 #include <linux/kernel.h>
8 #include <linux/module.h>
9 #include <linux/pm_runtime.h>
10 #include <sound/soc.h>
11 #include <sound/pcm_params.h>
12 #include <uapi/linux/input.h>
13
14 #include "audio_codec.h"
15 #include "audio_apbridgea.h"
16 #include "audio_manager.h"
17 #include "audio_helper.h"
18
19 static struct gbaudio_codec_info *gbcodec;
20
21 static struct gbaudio_data_connection *
22 find_data(struct gbaudio_module_info *module, int id)
23 {
24         struct gbaudio_data_connection *data;
25
26         list_for_each_entry(data, &module->data_list, list) {
27                 if (id == data->id)
28                         return data;
29         }
30         return NULL;
31 }
32
33 static struct gbaudio_stream_params *
34 find_dai_stream_params(struct gbaudio_codec_info *codec, int id, int stream)
35 {
36         struct gbaudio_codec_dai *dai;
37
38         list_for_each_entry(dai, &codec->dai_list, list) {
39                 if (dai->id == id)
40                         return &dai->params[stream];
41         }
42         return NULL;
43 }
44
45 static int gbaudio_module_enable_tx(struct gbaudio_codec_info *codec,
46                                     struct gbaudio_module_info *module, int id)
47 {
48         int module_state, ret = 0;
49         u16 data_cport, i2s_port, cportid;
50         u8 sig_bits, channels;
51         u32 format, rate;
52         struct gbaudio_data_connection *data;
53         struct gbaudio_stream_params *params;
54
55         /* find the dai */
56         data = find_data(module, id);
57         if (!data) {
58                 dev_err(module->dev, "%d:DATA connection missing\n", id);
59                 return -ENODEV;
60         }
61         module_state = data->state[SNDRV_PCM_STREAM_PLAYBACK];
62
63         params = find_dai_stream_params(codec, id, SNDRV_PCM_STREAM_PLAYBACK);
64         if (!params) {
65                 dev_err(codec->dev, "Failed to fetch dai_stream pointer\n");
66                 return -EINVAL;
67         }
68
69         /* register cport */
70         if (module_state < GBAUDIO_CODEC_STARTUP) {
71                 i2s_port = 0;   /* fixed for now */
72                 cportid = data->connection->hd_cport_id;
73                 ret = gb_audio_apbridgea_register_cport(data->connection,
74                                                 i2s_port, cportid,
75                                                 AUDIO_APBRIDGEA_DIRECTION_TX);
76                 if (ret) {
77                         dev_err_ratelimited(module->dev,
78                                             "reg_cport failed:%d\n", ret);
79                         return ret;
80                 }
81                 data->state[SNDRV_PCM_STREAM_PLAYBACK] =
82                         GBAUDIO_CODEC_STARTUP;
83                 dev_dbg(module->dev, "Dynamic Register %d DAI\n", cportid);
84         }
85
86         /* hw_params */
87         if (module_state < GBAUDIO_CODEC_HWPARAMS) {
88                 format = params->format;
89                 channels = params->channels;
90                 rate = params->rate;
91                 sig_bits = params->sig_bits;
92                 data_cport = data->connection->intf_cport_id;
93                 ret = gb_audio_gb_set_pcm(module->mgmt_connection, data_cport,
94                                           format, rate, channels, sig_bits);
95                 if (ret) {
96                         dev_err_ratelimited(module->dev, "set_pcm failed:%d\n",
97                                             ret);
98                         return ret;
99                 }
100                 data->state[SNDRV_PCM_STREAM_PLAYBACK] =
101                         GBAUDIO_CODEC_HWPARAMS;
102                 dev_dbg(module->dev, "Dynamic hw_params %d DAI\n", data_cport);
103         }
104
105         /* prepare */
106         if (module_state < GBAUDIO_CODEC_PREPARE) {
107                 data_cport = data->connection->intf_cport_id;
108                 ret = gb_audio_gb_set_tx_data_size(module->mgmt_connection,
109                                                    data_cport, 192);
110                 if (ret) {
111                         dev_err_ratelimited(module->dev,
112                                             "set_tx_data_size failed:%d\n",
113                                             ret);
114                         return ret;
115                 }
116                 ret = gb_audio_gb_activate_tx(module->mgmt_connection,
117                                               data_cport);
118                 if (ret) {
119                         dev_err_ratelimited(module->dev,
120                                             "activate_tx failed:%d\n", ret);
121                         return ret;
122                 }
123                 data->state[SNDRV_PCM_STREAM_PLAYBACK] =
124                         GBAUDIO_CODEC_PREPARE;
125                 dev_dbg(module->dev, "Dynamic prepare %d DAI\n", data_cport);
126         }
127
128         return 0;
129 }
130
131 static int gbaudio_module_disable_tx(struct gbaudio_module_info *module, int id)
132 {
133         int ret;
134         u16 data_cport, cportid, i2s_port;
135         int module_state;
136         struct gbaudio_data_connection *data;
137
138         /* find the dai */
139         data = find_data(module, id);
140         if (!data) {
141                 dev_err(module->dev, "%d:DATA connection missing\n", id);
142                 return -ENODEV;
143         }
144         module_state = data->state[SNDRV_PCM_STREAM_PLAYBACK];
145
146         if (module_state > GBAUDIO_CODEC_HWPARAMS) {
147                 data_cport = data->connection->intf_cport_id;
148                 ret = gb_audio_gb_deactivate_tx(module->mgmt_connection,
149                                                 data_cport);
150                 if (ret) {
151                         dev_err_ratelimited(module->dev,
152                                             "deactivate_tx failed:%d\n", ret);
153                         return ret;
154                 }
155                 dev_dbg(module->dev, "Dynamic deactivate %d DAI\n", data_cport);
156                 data->state[SNDRV_PCM_STREAM_PLAYBACK] =
157                         GBAUDIO_CODEC_HWPARAMS;
158         }
159
160         if (module_state > GBAUDIO_CODEC_SHUTDOWN) {
161                 i2s_port = 0;   /* fixed for now */
162                 cportid = data->connection->hd_cport_id;
163                 ret = gb_audio_apbridgea_unregister_cport(data->connection,
164                                                 i2s_port, cportid,
165                                                 AUDIO_APBRIDGEA_DIRECTION_TX);
166                 if (ret) {
167                         dev_err_ratelimited(module->dev,
168                                             "unregister_cport failed:%d\n",
169                                             ret);
170                         return ret;
171                 }
172                 dev_dbg(module->dev, "Dynamic Unregister %d DAI\n", cportid);
173                 data->state[SNDRV_PCM_STREAM_PLAYBACK] =
174                         GBAUDIO_CODEC_SHUTDOWN;
175         }
176
177         return 0;
178 }
179
180 static int gbaudio_module_enable_rx(struct gbaudio_codec_info *codec,
181                                     struct gbaudio_module_info *module, int id)
182 {
183         int module_state, ret = 0;
184         u16 data_cport, i2s_port, cportid;
185         u8 sig_bits, channels;
186         u32 format, rate;
187         struct gbaudio_data_connection *data;
188         struct gbaudio_stream_params *params;
189
190         /* find the dai */
191         data = find_data(module, id);
192         if (!data) {
193                 dev_err(module->dev, "%d:DATA connection missing\n", id);
194                 return -ENODEV;
195         }
196         module_state = data->state[SNDRV_PCM_STREAM_CAPTURE];
197
198         params = find_dai_stream_params(codec, id, SNDRV_PCM_STREAM_CAPTURE);
199         if (!params) {
200                 dev_err(codec->dev, "Failed to fetch dai_stream pointer\n");
201                 return -EINVAL;
202         }
203
204         /* register cport */
205         if (module_state < GBAUDIO_CODEC_STARTUP) {
206                 i2s_port = 0;   /* fixed for now */
207                 cportid = data->connection->hd_cport_id;
208                 ret = gb_audio_apbridgea_register_cport(data->connection,
209                                                 i2s_port, cportid,
210                                                 AUDIO_APBRIDGEA_DIRECTION_RX);
211                 if (ret) {
212                         dev_err_ratelimited(module->dev,
213                                             "reg_cport failed:%d\n", ret);
214                         return ret;
215                 }
216                 data->state[SNDRV_PCM_STREAM_CAPTURE] =
217                         GBAUDIO_CODEC_STARTUP;
218                 dev_dbg(module->dev, "Dynamic Register %d DAI\n", cportid);
219         }
220
221         /* hw_params */
222         if (module_state < GBAUDIO_CODEC_HWPARAMS) {
223                 format = params->format;
224                 channels = params->channels;
225                 rate = params->rate;
226                 sig_bits = params->sig_bits;
227                 data_cport = data->connection->intf_cport_id;
228                 ret = gb_audio_gb_set_pcm(module->mgmt_connection, data_cport,
229                                           format, rate, channels, sig_bits);
230                 if (ret) {
231                         dev_err_ratelimited(module->dev, "set_pcm failed:%d\n",
232                                             ret);
233                         return ret;
234                 }
235                 data->state[SNDRV_PCM_STREAM_CAPTURE] =
236                         GBAUDIO_CODEC_HWPARAMS;
237                 dev_dbg(module->dev, "Dynamic hw_params %d DAI\n", data_cport);
238         }
239
240         /* prepare */
241         if (module_state < GBAUDIO_CODEC_PREPARE) {
242                 data_cport = data->connection->intf_cport_id;
243                 ret = gb_audio_gb_set_rx_data_size(module->mgmt_connection,
244                                                    data_cport, 192);
245                 if (ret) {
246                         dev_err_ratelimited(module->dev,
247                                             "set_rx_data_size failed:%d\n",
248                                             ret);
249                         return ret;
250                 }
251                 ret = gb_audio_gb_activate_rx(module->mgmt_connection,
252                                               data_cport);
253                 if (ret) {
254                         dev_err_ratelimited(module->dev,
255                                             "activate_rx failed:%d\n", ret);
256                         return ret;
257                 }
258                 data->state[SNDRV_PCM_STREAM_CAPTURE] =
259                         GBAUDIO_CODEC_PREPARE;
260                 dev_dbg(module->dev, "Dynamic prepare %d DAI\n", data_cport);
261         }
262
263         return 0;
264 }
265
266 static int gbaudio_module_disable_rx(struct gbaudio_module_info *module, int id)
267 {
268         int ret;
269         u16 data_cport, cportid, i2s_port;
270         int module_state;
271         struct gbaudio_data_connection *data;
272
273         /* find the dai */
274         data = find_data(module, id);
275         if (!data) {
276                 dev_err(module->dev, "%d:DATA connection missing\n", id);
277                 return -ENODEV;
278         }
279         module_state = data->state[SNDRV_PCM_STREAM_CAPTURE];
280
281         if (module_state > GBAUDIO_CODEC_HWPARAMS) {
282                 data_cport = data->connection->intf_cport_id;
283                 ret = gb_audio_gb_deactivate_rx(module->mgmt_connection,
284                                                 data_cport);
285                 if (ret) {
286                         dev_err_ratelimited(module->dev,
287                                             "deactivate_rx failed:%d\n", ret);
288                         return ret;
289                 }
290                 dev_dbg(module->dev, "Dynamic deactivate %d DAI\n", data_cport);
291                 data->state[SNDRV_PCM_STREAM_CAPTURE] =
292                         GBAUDIO_CODEC_HWPARAMS;
293         }
294
295         if (module_state > GBAUDIO_CODEC_SHUTDOWN) {
296                 i2s_port = 0;   /* fixed for now */
297                 cportid = data->connection->hd_cport_id;
298                 ret = gb_audio_apbridgea_unregister_cport(data->connection,
299                                                 i2s_port, cportid,
300                                                 AUDIO_APBRIDGEA_DIRECTION_RX);
301                 if (ret) {
302                         dev_err_ratelimited(module->dev,
303                                             "unregister_cport failed:%d\n",
304                                             ret);
305                         return ret;
306                 }
307                 dev_dbg(module->dev, "Dynamic Unregister %d DAI\n", cportid);
308                 data->state[SNDRV_PCM_STREAM_CAPTURE] =
309                         GBAUDIO_CODEC_SHUTDOWN;
310         }
311
312         return 0;
313 }
314
315 int gbaudio_module_update(struct gbaudio_codec_info *codec,
316                           struct snd_soc_dapm_widget *w,
317                           struct gbaudio_module_info *module, int enable)
318 {
319         int dai_id, ret;
320         char intf_name[NAME_SIZE], dir[NAME_SIZE];
321
322         dev_dbg(module->dev, "%s:Module update %s sequence\n", w->name,
323                 enable ? "Enable" : "Disable");
324
325         if ((w->id != snd_soc_dapm_aif_in) && (w->id != snd_soc_dapm_aif_out)) {
326                 dev_dbg(codec->dev, "No action required for %s\n", w->name);
327                 return 0;
328         }
329
330         /* parse dai_id from AIF widget's stream_name */
331         ret = sscanf(w->sname, "%s %d %s", intf_name, &dai_id, dir);
332         if (ret < 3) {
333                 dev_err(codec->dev, "Error while parsing dai_id for %s\n",
334                         w->name);
335                 return -EINVAL;
336         }
337
338         mutex_lock(&codec->lock);
339         if (w->id == snd_soc_dapm_aif_in) {
340                 if (enable)
341                         ret = gbaudio_module_enable_tx(codec, module, dai_id);
342                 else
343                         ret = gbaudio_module_disable_tx(module, dai_id);
344         } else if (w->id == snd_soc_dapm_aif_out) {
345                 if (enable)
346                         ret = gbaudio_module_enable_rx(codec, module, dai_id);
347                 else
348                         ret = gbaudio_module_disable_rx(module, dai_id);
349         }
350
351         mutex_unlock(&codec->lock);
352
353         return ret;
354 }
355 EXPORT_SYMBOL(gbaudio_module_update);
356
357 /*
358  * codec DAI ops
359  */
360 static int gbcodec_startup(struct snd_pcm_substream *substream,
361                            struct snd_soc_dai *dai)
362 {
363         struct gbaudio_codec_info *codec = dev_get_drvdata(dai->dev);
364         struct gbaudio_stream_params *params;
365
366         mutex_lock(&codec->lock);
367
368         if (list_empty(&codec->module_list)) {
369                 dev_err(codec->dev, "No codec module available\n");
370                 mutex_unlock(&codec->lock);
371                 return -ENODEV;
372         }
373
374         params = find_dai_stream_params(codec, dai->id, substream->stream);
375         if (!params) {
376                 dev_err(codec->dev, "Failed to fetch dai_stream pointer\n");
377                 mutex_unlock(&codec->lock);
378                 return -EINVAL;
379         }
380         params->state = GBAUDIO_CODEC_STARTUP;
381         mutex_unlock(&codec->lock);
382         /* to prevent suspend in case of active audio */
383         pm_stay_awake(dai->dev);
384
385         return 0;
386 }
387
388 static void gbcodec_shutdown(struct snd_pcm_substream *substream,
389                              struct snd_soc_dai *dai)
390 {
391         struct gbaudio_codec_info *codec = dev_get_drvdata(dai->dev);
392         struct gbaudio_stream_params *params;
393
394         mutex_lock(&codec->lock);
395
396         if (list_empty(&codec->module_list))
397                 dev_info(codec->dev, "No codec module available during shutdown\n");
398
399         params = find_dai_stream_params(codec, dai->id, substream->stream);
400         if (!params) {
401                 dev_err(codec->dev, "Failed to fetch dai_stream pointer\n");
402                 mutex_unlock(&codec->lock);
403                 return;
404         }
405         params->state = GBAUDIO_CODEC_SHUTDOWN;
406         mutex_unlock(&codec->lock);
407         pm_relax(dai->dev);
408 }
409
410 static int gbcodec_hw_params(struct snd_pcm_substream *substream,
411                              struct snd_pcm_hw_params *hwparams,
412                              struct snd_soc_dai *dai)
413 {
414         int ret;
415         u8 sig_bits, channels;
416         u32 format, rate;
417         struct gbaudio_module_info *module;
418         struct gbaudio_data_connection *data;
419         struct gb_bundle *bundle;
420         struct gbaudio_codec_info *codec = dev_get_drvdata(dai->dev);
421         struct gbaudio_stream_params *params;
422
423         mutex_lock(&codec->lock);
424
425         if (list_empty(&codec->module_list)) {
426                 dev_err(codec->dev, "No codec module available\n");
427                 mutex_unlock(&codec->lock);
428                 return -ENODEV;
429         }
430
431         /*
432          * assuming, currently only 48000 Hz, 16BIT_LE, stereo
433          * is supported, validate params before configuring codec
434          */
435         if (params_channels(hwparams) != 2) {
436                 dev_err(dai->dev, "Invalid channel count:%d\n",
437                         params_channels(hwparams));
438                 mutex_unlock(&codec->lock);
439                 return -EINVAL;
440         }
441         channels = params_channels(hwparams);
442
443         if (params_rate(hwparams) != 48000) {
444                 dev_err(dai->dev, "Invalid sampling rate:%d\n",
445                         params_rate(hwparams));
446                 mutex_unlock(&codec->lock);
447                 return -EINVAL;
448         }
449         rate = GB_AUDIO_PCM_RATE_48000;
450
451         if (params_format(hwparams) != SNDRV_PCM_FORMAT_S16_LE) {
452                 dev_err(dai->dev, "Invalid format:%d\n",
453                         params_format(hwparams));
454                 mutex_unlock(&codec->lock);
455                 return -EINVAL;
456         }
457         format = GB_AUDIO_PCM_FMT_S16_LE;
458
459         /* find the data connection */
460         list_for_each_entry(module, &codec->module_list, list) {
461                 data = find_data(module, dai->id);
462                 if (data)
463                         break;
464         }
465
466         if (!data) {
467                 dev_err(dai->dev, "DATA connection missing\n");
468                 mutex_unlock(&codec->lock);
469                 return -EINVAL;
470         }
471
472         params = find_dai_stream_params(codec, dai->id, substream->stream);
473         if (!params) {
474                 dev_err(codec->dev, "Failed to fetch dai_stream pointer\n");
475                 mutex_unlock(&codec->lock);
476                 return -EINVAL;
477         }
478
479         bundle = to_gb_bundle(module->dev);
480         ret = gb_pm_runtime_get_sync(bundle);
481         if (ret) {
482                 mutex_unlock(&codec->lock);
483                 return ret;
484         }
485
486         ret = gb_audio_apbridgea_set_config(data->connection, 0,
487                                             AUDIO_APBRIDGEA_PCM_FMT_16,
488                                             AUDIO_APBRIDGEA_PCM_RATE_48000,
489                                             6144000);
490         if (ret) {
491                 dev_err_ratelimited(dai->dev, "%d: Error during set_config\n",
492                                     ret);
493                 gb_pm_runtime_put_noidle(bundle);
494                 mutex_unlock(&codec->lock);
495                 return ret;
496         }
497
498         gb_pm_runtime_put_noidle(bundle);
499
500         if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
501                 sig_bits = dai->driver->playback.sig_bits;
502         else
503                 sig_bits = dai->driver->capture.sig_bits;
504
505         params->state = GBAUDIO_CODEC_HWPARAMS;
506         params->format = format;
507         params->rate = rate;
508         params->channels = channels;
509         params->sig_bits = sig_bits;
510
511         mutex_unlock(&codec->lock);
512         return 0;
513 }
514
515 static int gbcodec_prepare(struct snd_pcm_substream *substream,
516                            struct snd_soc_dai *dai)
517 {
518         int ret;
519         struct gbaudio_module_info *module;
520         struct gbaudio_data_connection *data;
521         struct gb_bundle *bundle;
522         struct gbaudio_codec_info *codec = dev_get_drvdata(dai->dev);
523         struct gbaudio_stream_params *params;
524
525         mutex_lock(&codec->lock);
526
527         if (list_empty(&codec->module_list)) {
528                 dev_err(codec->dev, "No codec module available\n");
529                 mutex_unlock(&codec->lock);
530                 return -ENODEV;
531         }
532
533         list_for_each_entry(module, &codec->module_list, list) {
534                 /* find the dai */
535                 data = find_data(module, dai->id);
536                 if (data)
537                         break;
538         }
539         if (!data) {
540                 dev_err(dai->dev, "DATA connection missing\n");
541                 mutex_unlock(&codec->lock);
542                 return -ENODEV;
543         }
544
545         params = find_dai_stream_params(codec, dai->id, substream->stream);
546         if (!params) {
547                 dev_err(codec->dev, "Failed to fetch dai_stream pointer\n");
548                 mutex_unlock(&codec->lock);
549                 return -EINVAL;
550         }
551
552         bundle = to_gb_bundle(module->dev);
553         ret = gb_pm_runtime_get_sync(bundle);
554         if (ret) {
555                 mutex_unlock(&codec->lock);
556                 return ret;
557         }
558
559         switch (substream->stream) {
560         case SNDRV_PCM_STREAM_PLAYBACK:
561                 ret = gb_audio_apbridgea_set_tx_data_size(data->connection, 0,
562                                                           192);
563                 break;
564         case SNDRV_PCM_STREAM_CAPTURE:
565                 ret = gb_audio_apbridgea_set_rx_data_size(data->connection, 0,
566                                                           192);
567                 break;
568         }
569         if (ret) {
570                 gb_pm_runtime_put_noidle(bundle);
571                 mutex_unlock(&codec->lock);
572                 dev_err_ratelimited(dai->dev, "set_data_size failed:%d\n",
573                                     ret);
574                 return ret;
575         }
576
577         gb_pm_runtime_put_noidle(bundle);
578
579         params->state = GBAUDIO_CODEC_PREPARE;
580         mutex_unlock(&codec->lock);
581         return 0;
582 }
583
584 static int gbcodec_mute_stream(struct snd_soc_dai *dai, int mute, int stream)
585 {
586         int ret;
587         struct gbaudio_data_connection *data;
588         struct gbaudio_module_info *module;
589         struct gb_bundle *bundle;
590         struct gbaudio_codec_info *codec = dev_get_drvdata(dai->dev);
591         struct gbaudio_stream_params *params;
592
593         dev_dbg(dai->dev, "Mute:%d, Direction:%s\n", mute,
594                 stream ? "CAPTURE" : "PLAYBACK");
595
596         mutex_lock(&codec->lock);
597
598         params = find_dai_stream_params(codec, dai->id, stream);
599         if (!params) {
600                 dev_err(codec->dev, "Failed to fetch dai_stream pointer\n");
601                 mutex_unlock(&codec->lock);
602                 return -EINVAL;
603         }
604
605         if (list_empty(&codec->module_list)) {
606                 dev_err(codec->dev, "No codec module available\n");
607                 if (mute) {
608                         params->state = GBAUDIO_CODEC_STOP;
609                         ret = 0;
610                 } else {
611                         ret = -ENODEV;
612                 }
613                 mutex_unlock(&codec->lock);
614                 return ret;
615         }
616
617         list_for_each_entry(module, &codec->module_list, list) {
618                 /* find the dai */
619                 data = find_data(module, dai->id);
620                 if (data)
621                         break;
622         }
623         if (!data) {
624                 dev_err(dai->dev, "%s DATA connection missing\n",
625                         dai->name);
626                 mutex_unlock(&codec->lock);
627                 return -ENODEV;
628         }
629
630         bundle = to_gb_bundle(module->dev);
631         ret = gb_pm_runtime_get_sync(bundle);
632         if (ret) {
633                 mutex_unlock(&codec->lock);
634                 return ret;
635         }
636
637         if (!mute && !stream) {/* start playback */
638                 ret = gb_audio_apbridgea_prepare_tx(data->connection,
639                                                     0);
640                 if (!ret)
641                         ret = gb_audio_apbridgea_start_tx(data->connection,
642                                                           0, 0);
643                 params->state = GBAUDIO_CODEC_START;
644         } else if (!mute && stream) {/* start capture */
645                 ret = gb_audio_apbridgea_prepare_rx(data->connection,
646                                                     0);
647                 if (!ret)
648                         ret = gb_audio_apbridgea_start_rx(data->connection,
649                                                           0);
650                 params->state = GBAUDIO_CODEC_START;
651         } else if (mute && !stream) {/* stop playback */
652                 ret = gb_audio_apbridgea_stop_tx(data->connection, 0);
653                 if (!ret)
654                         ret = gb_audio_apbridgea_shutdown_tx(data->connection,
655                                                              0);
656                 params->state = GBAUDIO_CODEC_STOP;
657         } else if (mute && stream) {/* stop capture */
658                 ret = gb_audio_apbridgea_stop_rx(data->connection, 0);
659                 if (!ret)
660                         ret = gb_audio_apbridgea_shutdown_rx(data->connection,
661                                                              0);
662                 params->state = GBAUDIO_CODEC_STOP;
663         } else {
664                 ret = -EINVAL;
665         }
666
667         if (ret)
668                 dev_err_ratelimited(dai->dev,
669                                     "%s:Error during %s %s stream:%d\n",
670                                     module->name, mute ? "Mute" : "Unmute",
671                                     stream ? "Capture" : "Playback", ret);
672
673         gb_pm_runtime_put_noidle(bundle);
674         mutex_unlock(&codec->lock);
675         return ret;
676 }
677
678 static const struct snd_soc_dai_ops gbcodec_dai_ops = {
679         .startup = gbcodec_startup,
680         .shutdown = gbcodec_shutdown,
681         .hw_params = gbcodec_hw_params,
682         .prepare = gbcodec_prepare,
683         .mute_stream = gbcodec_mute_stream,
684 };
685
686 static struct snd_soc_dai_driver gbaudio_dai[] = {
687         {
688                 .name = "apb-i2s0",
689                 .id = 0,
690                 .playback = {
691                         .stream_name = "I2S 0 Playback",
692                         .rates = SNDRV_PCM_RATE_48000,
693                         .formats = SNDRV_PCM_FMTBIT_S16_LE,
694                         .rate_max = 48000,
695                         .rate_min = 48000,
696                         .channels_min = 1,
697                         .channels_max = 2,
698                         .sig_bits = 16,
699                 },
700                 .capture = {
701                         .stream_name = "I2S 0 Capture",
702                         .rates = SNDRV_PCM_RATE_48000,
703                         .formats = SNDRV_PCM_FMTBIT_S16_LE,
704                         .rate_max = 48000,
705                         .rate_min = 48000,
706                         .channels_min = 1,
707                         .channels_max = 2,
708                         .sig_bits = 16,
709                 },
710                 .ops = &gbcodec_dai_ops,
711         },
712 };
713
714 static int gbaudio_init_jack(struct gbaudio_module_info *module,
715                              struct snd_soc_card *card)
716 {
717         int ret;
718         struct gbaudio_jack *jack, *n;
719         struct snd_soc_jack_pin *headset, *button;
720
721         if (!module->jack_mask)
722                 return 0;
723
724         snprintf(module->jack_name, NAME_SIZE, "GB %d Headset Jack",
725                  module->dev_id);
726
727         headset = devm_kzalloc(module->dev, sizeof(*headset), GFP_KERNEL);
728         if (!headset)
729                 return -ENOMEM;
730
731         headset->pin = module->jack_name;
732         headset->mask = module->jack_mask;
733         ret = snd_soc_card_jack_new(card, module->jack_name, module->jack_mask,
734                                     &module->headset.jack, headset, 1);
735         if (ret) {
736                 dev_err(module->dev, "Failed to create new jack\n");
737                 return ret;
738         }
739
740         /* Add to module's jack list */
741         list_add(&module->headset.list, &module->jack_list);
742
743         if (!module->button_mask)
744                 return 0;
745
746         snprintf(module->button_name, NAME_SIZE, "GB %d Button Jack",
747                  module->dev_id);
748         button = devm_kzalloc(module->dev, sizeof(*button), GFP_KERNEL);
749         if (!button) {
750                 ret = -ENOMEM;
751                 goto free_jacks;
752         }
753
754         button->pin = module->button_name;
755         button->mask = module->button_mask;
756         ret = snd_soc_card_jack_new(card, module->button_name,
757                                     module->button_mask, &module->button.jack,
758                                     button, 1);
759         if (ret) {
760                 dev_err(module->dev, "Failed to create button jack\n");
761                 goto free_jacks;
762         }
763
764         /* Add to module's jack list */
765         list_add(&module->button.list, &module->jack_list);
766
767         /*
768          * Currently, max 4 buttons are supported with following key mapping
769          * BTN_0 = KEY_MEDIA
770          * BTN_1 = KEY_VOICECOMMAND
771          * BTN_2 = KEY_VOLUMEUP
772          * BTN_3 = KEY_VOLUMEDOWN
773          */
774
775         if (module->button_mask & SND_JACK_BTN_0) {
776                 ret = snd_jack_set_key(module->button.jack.jack, SND_JACK_BTN_0,
777                                        KEY_MEDIA);
778                 if (ret) {
779                         dev_err(module->dev, "Failed to set BTN_0\n");
780                         goto free_jacks;
781                 }
782         }
783
784         if (module->button_mask & SND_JACK_BTN_1) {
785                 ret = snd_jack_set_key(module->button.jack.jack, SND_JACK_BTN_1,
786                                        KEY_VOICECOMMAND);
787                 if (ret) {
788                         dev_err(module->dev, "Failed to set BTN_1\n");
789                         goto free_jacks;
790                 }
791         }
792
793         if (module->button_mask & SND_JACK_BTN_2) {
794                 ret = snd_jack_set_key(module->button.jack.jack, SND_JACK_BTN_2,
795                                        KEY_VOLUMEUP);
796                 if (ret) {
797                         dev_err(module->dev, "Failed to set BTN_2\n");
798                         goto free_jacks;
799                 }
800         }
801
802         if (module->button_mask & SND_JACK_BTN_3) {
803                 ret = snd_jack_set_key(module->button.jack.jack, SND_JACK_BTN_3,
804                                        KEY_VOLUMEDOWN);
805                 if (ret) {
806                         dev_err(module->dev, "Failed to set BTN_0\n");
807                         goto free_jacks;
808                 }
809         }
810
811         /* FIXME
812          * verify if this is really required
813         set_bit(INPUT_PROP_NO_DUMMY_RELEASE,
814                 module->button.jack.jack->input_dev->propbit);
815         */
816
817         return 0;
818
819 free_jacks:
820         list_for_each_entry_safe(jack, n, &module->jack_list, list) {
821                 snd_device_free(card->snd_card, jack->jack.jack);
822                 list_del(&jack->list);
823         }
824
825         return ret;
826 }
827
828 int gbaudio_register_module(struct gbaudio_module_info *module)
829 {
830         int ret;
831         struct snd_soc_component *comp;
832         struct snd_card *card;
833         struct gbaudio_jack *jack = NULL;
834
835         if (!gbcodec) {
836                 dev_err(module->dev, "GB Codec not yet probed\n");
837                 return -EAGAIN;
838         }
839
840         comp = gbcodec->component;
841         card = comp->card->snd_card;
842
843         down_write(&card->controls_rwsem);
844
845         if (module->num_dais) {
846                 dev_err(gbcodec->dev,
847                         "%d:DAIs not supported via gbcodec driver\n",
848                         module->num_dais);
849                 up_write(&card->controls_rwsem);
850                 return -EINVAL;
851         }
852
853         ret = gbaudio_init_jack(module, comp->card);
854         if (ret) {
855                 up_write(&card->controls_rwsem);
856                 return ret;
857         }
858
859         if (module->dapm_widgets)
860                 snd_soc_dapm_new_controls(&comp->dapm, module->dapm_widgets,
861                                           module->num_dapm_widgets);
862         if (module->controls)
863                 snd_soc_add_component_controls(comp, module->controls,
864                                                module->num_controls);
865         if (module->dapm_routes)
866                 snd_soc_dapm_add_routes(&comp->dapm, module->dapm_routes,
867                                         module->num_dapm_routes);
868
869         /* card already instantiated, create widgets here only */
870         if (comp->card->instantiated) {
871                 gbaudio_dapm_link_component_dai_widgets(comp->card,
872                                                         &comp->dapm);
873 #ifdef CONFIG_SND_JACK
874                 /*
875                  * register jack devices for this module
876                  * from codec->jack_list
877                  */
878                 list_for_each_entry(jack, &module->jack_list, list) {
879                         snd_device_register(comp->card->snd_card,
880                                             jack->jack.jack);
881                 }
882 #endif
883         }
884
885         mutex_lock(&gbcodec->lock);
886         list_add(&module->list, &gbcodec->module_list);
887         mutex_unlock(&gbcodec->lock);
888
889         if (comp->card->instantiated)
890                 ret = snd_soc_dapm_new_widgets(comp->card);
891         dev_dbg(comp->dev, "Registered %s module\n", module->name);
892
893         up_write(&card->controls_rwsem);
894         return ret;
895 }
896 EXPORT_SYMBOL(gbaudio_register_module);
897
898 static void gbaudio_codec_clean_data_tx(struct gbaudio_data_connection *data)
899 {
900         u16 i2s_port, cportid;
901         int ret;
902
903         if (list_is_singular(&gbcodec->module_list)) {
904                 ret = gb_audio_apbridgea_stop_tx(data->connection, 0);
905                 if (ret)
906                         return;
907                 ret = gb_audio_apbridgea_shutdown_tx(data->connection,
908                                                      0);
909                 if (ret)
910                         return;
911         }
912         i2s_port = 0;   /* fixed for now */
913         cportid = data->connection->hd_cport_id;
914         ret = gb_audio_apbridgea_unregister_cport(data->connection,
915                                                   i2s_port, cportid,
916                                                   AUDIO_APBRIDGEA_DIRECTION_TX);
917         data->state[0] = GBAUDIO_CODEC_SHUTDOWN;
918 }
919
920 static void gbaudio_codec_clean_data_rx(struct gbaudio_data_connection *data)
921 {
922         u16 i2s_port, cportid;
923         int ret;
924
925         if (list_is_singular(&gbcodec->module_list)) {
926                 ret = gb_audio_apbridgea_stop_rx(data->connection, 0);
927                 if (ret)
928                         return;
929                 ret = gb_audio_apbridgea_shutdown_rx(data->connection,
930                                                      0);
931                 if (ret)
932                         return;
933         }
934         i2s_port = 0;   /* fixed for now */
935         cportid = data->connection->hd_cport_id;
936         ret = gb_audio_apbridgea_unregister_cport(data->connection,
937                                                   i2s_port, cportid,
938                                                   AUDIO_APBRIDGEA_DIRECTION_RX);
939         data->state[1] = GBAUDIO_CODEC_SHUTDOWN;
940 }
941
942 static void gbaudio_codec_cleanup(struct gbaudio_module_info *module)
943 {
944         struct gbaudio_data_connection *data;
945         int pb_state, cap_state;
946
947         dev_dbg(gbcodec->dev, "%s: removed, cleanup APBridge\n", module->name);
948         list_for_each_entry(data, &module->data_list, list) {
949                 pb_state = data->state[0];
950                 cap_state = data->state[1];
951
952                 if (pb_state > GBAUDIO_CODEC_SHUTDOWN)
953                         gbaudio_codec_clean_data_tx(data);
954
955                 if (cap_state > GBAUDIO_CODEC_SHUTDOWN)
956                         gbaudio_codec_clean_data_rx(data);
957         }
958 }
959
960 void gbaudio_unregister_module(struct gbaudio_module_info *module)
961 {
962         struct snd_soc_component *comp = gbcodec->component;
963         struct snd_card *card = comp->card->snd_card;
964         struct gbaudio_jack *jack, *n;
965         int mask;
966
967         dev_dbg(comp->dev, "Unregister %s module\n", module->name);
968
969         down_write(&card->controls_rwsem);
970         mutex_lock(&gbcodec->lock);
971         gbaudio_codec_cleanup(module);
972         list_del(&module->list);
973         dev_dbg(comp->dev, "Process Unregister %s module\n", module->name);
974         mutex_unlock(&gbcodec->lock);
975
976 #ifdef CONFIG_SND_JACK
977         /* free jack devices for this module jack_list */
978         list_for_each_entry_safe(jack, n, &module->jack_list, list) {
979                 if (jack == &module->headset)
980                         mask = GBCODEC_JACK_MASK;
981                 else if (jack == &module->button)
982                         mask = GBCODEC_JACK_BUTTON_MASK;
983                 else
984                         mask = 0;
985                 if (mask) {
986                         dev_dbg(module->dev, "Report %s removal\n",
987                                 jack->jack.jack->id);
988                         snd_soc_jack_report(&jack->jack, 0, mask);
989                         snd_device_free(comp->card->snd_card,
990                                         jack->jack.jack);
991                         list_del(&jack->list);
992                 }
993         }
994 #endif
995
996         if (module->dapm_routes) {
997                 dev_dbg(comp->dev, "Removing %d routes\n",
998                         module->num_dapm_routes);
999                 snd_soc_dapm_del_routes(&comp->dapm, module->dapm_routes,
1000                                         module->num_dapm_routes);
1001         }
1002         if (module->controls) {
1003                 dev_dbg(comp->dev, "Removing %d controls\n",
1004                         module->num_controls);
1005                 /* release control semaphore */
1006                 up_write(&card->controls_rwsem);
1007                 gbaudio_remove_component_controls(comp, module->controls,
1008                                                   module->num_controls);
1009                 down_write(&card->controls_rwsem);
1010         }
1011         if (module->dapm_widgets) {
1012                 dev_dbg(comp->dev, "Removing %d widgets\n",
1013                         module->num_dapm_widgets);
1014                 gbaudio_dapm_free_controls(&comp->dapm, module->dapm_widgets,
1015                                            module->num_dapm_widgets);
1016         }
1017
1018         dev_dbg(comp->dev, "Unregistered %s module\n", module->name);
1019
1020         up_write(&card->controls_rwsem);
1021 }
1022 EXPORT_SYMBOL(gbaudio_unregister_module);
1023
1024 /*
1025  * component driver ops
1026  */
1027 static int gbcodec_probe(struct snd_soc_component *comp)
1028 {
1029         int i;
1030         struct gbaudio_codec_info *info;
1031         struct gbaudio_codec_dai *dai;
1032
1033         info = devm_kzalloc(comp->dev, sizeof(*info), GFP_KERNEL);
1034         if (!info)
1035                 return -ENOMEM;
1036
1037         info->dev = comp->dev;
1038         INIT_LIST_HEAD(&info->module_list);
1039         mutex_init(&info->lock);
1040         INIT_LIST_HEAD(&info->dai_list);
1041
1042         /* init dai_list used to maintain runtime stream info */
1043         for (i = 0; i < ARRAY_SIZE(gbaudio_dai); i++) {
1044                 dai = devm_kzalloc(comp->dev, sizeof(*dai), GFP_KERNEL);
1045                 if (!dai)
1046                         return -ENOMEM;
1047                 dai->id = gbaudio_dai[i].id;
1048                 list_add(&dai->list, &info->dai_list);
1049         }
1050
1051         info->component = comp;
1052         snd_soc_component_set_drvdata(comp, info);
1053         gbcodec = info;
1054
1055         device_init_wakeup(comp->dev, 1);
1056         return 0;
1057 }
1058
1059 static void gbcodec_remove(struct snd_soc_component *comp)
1060 {
1061         /* Empty function for now */
1062         return;
1063 }
1064
1065 static int gbcodec_write(struct snd_soc_component *comp, unsigned int reg,
1066                          unsigned int value)
1067 {
1068         return 0;
1069 }
1070
1071 static unsigned int gbcodec_read(struct snd_soc_component *comp,
1072                                  unsigned int reg)
1073 {
1074         return 0;
1075 }
1076
1077 static const struct snd_soc_component_driver soc_codec_dev_gbaudio = {
1078         .probe  = gbcodec_probe,
1079         .remove = gbcodec_remove,
1080
1081         .read = gbcodec_read,
1082         .write = gbcodec_write,
1083 };
1084
1085 #ifdef CONFIG_PM
1086 static int gbaudio_codec_suspend(struct device *dev)
1087 {
1088         dev_dbg(dev, "%s: suspend\n", __func__);
1089         return 0;
1090 }
1091
1092 static int gbaudio_codec_resume(struct device *dev)
1093 {
1094         dev_dbg(dev, "%s: resume\n", __func__);
1095         return 0;
1096 }
1097
1098 static const struct dev_pm_ops gbaudio_codec_pm_ops = {
1099         .suspend        = gbaudio_codec_suspend,
1100         .resume         = gbaudio_codec_resume,
1101 };
1102 #endif
1103
1104 static int gbaudio_codec_probe(struct platform_device *pdev)
1105 {
1106         return devm_snd_soc_register_component(&pdev->dev,
1107                         &soc_codec_dev_gbaudio,
1108                         gbaudio_dai, ARRAY_SIZE(gbaudio_dai));
1109 }
1110
1111 static int gbaudio_codec_remove(struct platform_device *pdev)
1112 {
1113         return 0;
1114 }
1115
1116 static const struct of_device_id greybus_asoc_machine_of_match[]  = {
1117         { .compatible = "toshiba,apb-dummy-codec", },
1118         {},
1119 };
1120
1121 static struct platform_driver gbaudio_codec_driver = {
1122         .driver = {
1123                 .name = "apb-dummy-codec",
1124 #ifdef CONFIG_PM
1125                 .pm = &gbaudio_codec_pm_ops,
1126 #endif
1127                 .of_match_table = greybus_asoc_machine_of_match,
1128         },
1129         .probe = gbaudio_codec_probe,
1130         .remove = gbaudio_codec_remove,
1131 };
1132 module_platform_driver(gbaudio_codec_driver);
1133
1134 MODULE_DESCRIPTION("APBridge ALSA SoC dummy codec driver");
1135 MODULE_AUTHOR("Vaibhav Agarwal <vaibhav.agarwal@linaro.org>");
1136 MODULE_LICENSE("GPL v2");
1137 MODULE_ALIAS("platform:apb-dummy-codec");