GNU Linux-libre 4.14.290-gnu1
[releases.git] / drivers / staging / greybus / audio_codec.c
1 /*
2  * APBridge ALSA SoC dummy codec driver
3  * Copyright 2016 Google Inc.
4  * Copyright 2016 Linaro Ltd.
5  *
6  * Released under the GPLv2 only.
7  */
8 #include <linux/kernel.h>
9 #include <linux/module.h>
10 #include <linux/pm_runtime.h>
11 #include <sound/soc.h>
12 #include <sound/pcm_params.h>
13 #include <uapi/linux/input.h>
14
15 #include "audio_codec.h"
16 #include "audio_apbridgea.h"
17 #include "audio_manager.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         uint32_t 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         uint32_t 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         uint32_t 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
594         dev_dbg(dai->dev, "Mute:%d, Direction:%s\n", mute,
595                 stream ? "CAPTURE":"PLAYBACK");
596
597         mutex_lock(&codec->lock);
598
599         params = find_dai_stream_params(codec, dai->id, stream);
600         if (!params) {
601                 dev_err(codec->dev, "Failed to fetch dai_stream pointer\n");
602                 mutex_unlock(&codec->lock);
603                 return -EINVAL;
604         }
605
606         if (list_empty(&codec->module_list)) {
607                 dev_err(codec->dev, "No codec module available\n");
608                 if (mute) {
609                         params->state = GBAUDIO_CODEC_STOP;
610                         ret = 0;
611                 } else {
612                         ret = -ENODEV;
613                 }
614                 mutex_unlock(&codec->lock);
615                 return ret;
616         }
617
618         list_for_each_entry(module, &codec->module_list, list) {
619                 /* find the dai */
620                 data = find_data(module, dai->id);
621                 if (data)
622                         break;
623         }
624         if (!data) {
625                 dev_err(dai->dev, "%s DATA connection missing\n",
626                         dai->name);
627                 mutex_unlock(&codec->lock);
628                 return -ENODEV;
629         }
630
631         bundle = to_gb_bundle(module->dev);
632         ret = gb_pm_runtime_get_sync(bundle);
633         if (ret) {
634                 mutex_unlock(&codec->lock);
635                 return ret;
636         }
637
638         if (!mute && !stream) {/* start playback */
639                 ret = gb_audio_apbridgea_prepare_tx(data->connection,
640                                                     0);
641                 if (!ret)
642                         ret = gb_audio_apbridgea_start_tx(data->connection,
643                                                           0, 0);
644                 params->state = GBAUDIO_CODEC_START;
645         } else if (!mute && stream) {/* start capture */
646                 ret = gb_audio_apbridgea_prepare_rx(data->connection,
647                                                     0);
648                 if (!ret)
649                         ret = gb_audio_apbridgea_start_rx(data->connection,
650                                                           0);
651                 params->state = GBAUDIO_CODEC_START;
652         } else if (mute && !stream) {/* stop playback */
653                 ret = gb_audio_apbridgea_stop_tx(data->connection, 0);
654                 if (!ret)
655                         ret = gb_audio_apbridgea_shutdown_tx(data->connection,
656                                                              0);
657                 params->state = GBAUDIO_CODEC_STOP;
658         } else if (mute && stream) {/* stop capture */
659                 ret = gb_audio_apbridgea_stop_rx(data->connection, 0);
660                 if (!ret)
661                         ret = gb_audio_apbridgea_shutdown_rx(data->connection,
662                                                              0);
663                 params->state = GBAUDIO_CODEC_STOP;
664         } else {
665                 ret = -EINVAL;
666         }
667
668         if (ret)
669                 dev_err_ratelimited(dai->dev,
670                                     "%s:Error during %s %s stream:%d\n",
671                                     module->name, mute ? "Mute" : "Unmute",
672                                     stream ? "Capture" : "Playback", ret);
673
674         gb_pm_runtime_put_noidle(bundle);
675         mutex_unlock(&codec->lock);
676         return ret;
677 }
678
679 static const struct snd_soc_dai_ops gbcodec_dai_ops = {
680         .startup = gbcodec_startup,
681         .shutdown = gbcodec_shutdown,
682         .hw_params = gbcodec_hw_params,
683         .prepare = gbcodec_prepare,
684         .mute_stream = gbcodec_mute_stream,
685 };
686
687 static struct snd_soc_dai_driver gbaudio_dai[] = {
688         {
689                 .name = "apb-i2s0",
690                 .id = 0,
691                 .playback = {
692                         .stream_name = "I2S 0 Playback",
693                         .rates = SNDRV_PCM_RATE_48000,
694                         .formats = SNDRV_PCM_FORMAT_S16_LE,
695                         .rate_max = 48000,
696                         .rate_min = 48000,
697                         .channels_min = 1,
698                         .channels_max = 2,
699                         .sig_bits = 16,
700                 },
701                 .capture = {
702                         .stream_name = "I2S 0 Capture",
703                         .rates = SNDRV_PCM_RATE_48000,
704                         .formats = SNDRV_PCM_FORMAT_S16_LE,
705                         .rate_max = 48000,
706                         .rate_min = 48000,
707                         .channels_min = 1,
708                         .channels_max = 2,
709                         .sig_bits = 16,
710                 },
711                 .ops = &gbcodec_dai_ops,
712         },
713 };
714
715 static int gbaudio_init_jack(struct gbaudio_module_info *module,
716                              struct snd_soc_codec *codec)
717 {
718         int ret;
719
720         if (!module->jack_mask)
721                 return 0;
722
723         snprintf(module->jack_name, NAME_SIZE, "GB %d Headset Jack",
724                  module->dev_id);
725         ret = snd_soc_jack_new(codec, module->jack_name, module->jack_mask,
726                                &module->headset_jack);
727         if (ret) {
728                 dev_err(module->dev, "Failed to create new jack\n");
729                 return ret;
730         }
731
732         if (!module->button_mask)
733                 return 0;
734
735         snprintf(module->button_name, NAME_SIZE, "GB %d Button Jack",
736                  module->dev_id);
737         ret = snd_soc_jack_new(codec, module->button_name, module->button_mask,
738                                &module->button_jack);
739         if (ret) {
740                 dev_err(module->dev, "Failed to create button jack\n");
741                 return ret;
742         }
743
744         /*
745          * Currently, max 4 buttons are supported with following key mapping
746          * BTN_0 = KEY_MEDIA
747          * BTN_1 = KEY_VOICECOMMAND
748          * BTN_2 = KEY_VOLUMEUP
749          * BTN_3 = KEY_VOLUMEDOWN
750          */
751
752         if (module->button_mask & SND_JACK_BTN_0) {
753                 ret = snd_jack_set_key(module->button_jack.jack, SND_JACK_BTN_0,
754                                        KEY_MEDIA);
755                 if (ret) {
756                         dev_err(module->dev, "Failed to set BTN_0\n");
757                         return ret;
758                 }
759         }
760
761         if (module->button_mask & SND_JACK_BTN_1) {
762                 ret = snd_jack_set_key(module->button_jack.jack, SND_JACK_BTN_1,
763                                        KEY_VOICECOMMAND);
764                 if (ret) {
765                         dev_err(module->dev, "Failed to set BTN_1\n");
766                         return ret;
767                 }
768         }
769
770         if (module->button_mask & SND_JACK_BTN_2) {
771                 ret = snd_jack_set_key(module->button_jack.jack, SND_JACK_BTN_2,
772                                        KEY_VOLUMEUP);
773                 if (ret) {
774                         dev_err(module->dev, "Failed to set BTN_2\n");
775                         return ret;
776                 }
777         }
778
779         if (module->button_mask & SND_JACK_BTN_3) {
780                 ret = snd_jack_set_key(module->button_jack.jack, SND_JACK_BTN_3,
781                                        KEY_VOLUMEDOWN);
782                 if (ret) {
783                         dev_err(module->dev, "Failed to set BTN_0\n");
784                         return ret;
785                 }
786         }
787
788         /* FIXME
789          * verify if this is really required
790         set_bit(INPUT_PROP_NO_DUMMY_RELEASE,
791                 module->button_jack.jack->input_dev->propbit);
792         */
793
794         return 0;
795 }
796
797 int gbaudio_register_module(struct gbaudio_module_info *module)
798 {
799         int ret;
800         struct snd_soc_codec *codec;
801         struct snd_card *card;
802         struct snd_soc_jack *jack = NULL;
803
804         if (!gbcodec) {
805                 dev_err(module->dev, "GB Codec not yet probed\n");
806                 return -EAGAIN;
807         }
808
809         codec = gbcodec->codec;
810         card = codec->card->snd_card;
811
812         down_write(&card->controls_rwsem);
813
814         if (module->num_dais) {
815                 dev_err(gbcodec->dev,
816                         "%d:DAIs not supported via gbcodec driver\n",
817                         module->num_dais);
818                 up_write(&card->controls_rwsem);
819                 return -EINVAL;
820         }
821
822         ret = gbaudio_init_jack(module, codec);
823         if (ret) {
824                 up_write(&card->controls_rwsem);
825                 return ret;
826         }
827
828         if (module->dapm_widgets)
829                 snd_soc_dapm_new_controls(&codec->dapm, module->dapm_widgets,
830                                           module->num_dapm_widgets);
831         if (module->controls)
832                 snd_soc_add_codec_controls(codec, module->controls,
833                                      module->num_controls);
834         if (module->dapm_routes)
835                 snd_soc_dapm_add_routes(&codec->dapm, module->dapm_routes,
836                                         module->num_dapm_routes);
837
838         /* card already instantiated, create widgets here only */
839         if (codec->card->instantiated) {
840                 snd_soc_dapm_link_component_dai_widgets(codec->card,
841                                                         &codec->dapm);
842 #ifdef CONFIG_SND_JACK
843                 /*
844                  * register jack devices for this module
845                  * from codec->jack_list
846                  */
847                 list_for_each_entry(jack, &codec->jack_list, list) {
848                         if ((jack == &module->headset_jack)
849                             || (jack == &module->button_jack))
850                                 snd_device_register(codec->card->snd_card,
851                                                     jack->jack);
852                 }
853 #endif
854         }
855
856         mutex_lock(&gbcodec->lock);
857         list_add(&module->list, &gbcodec->module_list);
858         mutex_unlock(&gbcodec->lock);
859
860         if (codec->card->instantiated)
861                 ret = snd_soc_dapm_new_widgets(&codec->dapm);
862         dev_dbg(codec->dev, "Registered %s module\n", module->name);
863
864         up_write(&card->controls_rwsem);
865         return ret;
866 }
867 EXPORT_SYMBOL(gbaudio_register_module);
868
869 static void gbaudio_codec_clean_data_tx(struct gbaudio_data_connection *data)
870 {
871         u16 i2s_port, cportid;
872         int ret;
873
874         if (list_is_singular(&gbcodec->module_list)) {
875                 ret = gb_audio_apbridgea_stop_tx(data->connection, 0);
876                 if (ret)
877                         return;
878                 ret = gb_audio_apbridgea_shutdown_tx(data->connection,
879                                                      0);
880                 if (ret)
881                         return;
882         }
883         i2s_port = 0;   /* fixed for now */
884         cportid = data->connection->hd_cport_id;
885         ret = gb_audio_apbridgea_unregister_cport(data->connection,
886                                                   i2s_port, cportid,
887                                                   AUDIO_APBRIDGEA_DIRECTION_TX);
888         data->state[0] = GBAUDIO_CODEC_SHUTDOWN;
889 }
890
891 static void gbaudio_codec_clean_data_rx(struct gbaudio_data_connection *data)
892 {
893         u16 i2s_port, cportid;
894         int ret;
895
896         if (list_is_singular(&gbcodec->module_list)) {
897                 ret = gb_audio_apbridgea_stop_rx(data->connection, 0);
898                 if (ret)
899                         return;
900                 ret = gb_audio_apbridgea_shutdown_rx(data->connection,
901                                                      0);
902                 if (ret)
903                         return;
904         }
905         i2s_port = 0;   /* fixed for now */
906         cportid = data->connection->hd_cport_id;
907         ret = gb_audio_apbridgea_unregister_cport(data->connection,
908                                                   i2s_port, cportid,
909                                                   AUDIO_APBRIDGEA_DIRECTION_RX);
910         data->state[1] = GBAUDIO_CODEC_SHUTDOWN;
911 }
912
913
914 static void gbaudio_codec_cleanup(struct gbaudio_module_info *module)
915 {
916         struct gbaudio_data_connection *data;
917         int pb_state, cap_state;
918
919         dev_dbg(gbcodec->dev, "%s: removed, cleanup APBridge\n", module->name);
920         list_for_each_entry(data, &module->data_list, list) {
921                 pb_state = data->state[0];
922                 cap_state = data->state[1];
923
924                 if (pb_state > GBAUDIO_CODEC_SHUTDOWN)
925                         gbaudio_codec_clean_data_tx(data);
926
927                 if (cap_state > GBAUDIO_CODEC_SHUTDOWN)
928                         gbaudio_codec_clean_data_rx(data);
929
930         }
931 }
932
933 void gbaudio_unregister_module(struct gbaudio_module_info *module)
934 {
935         struct snd_soc_codec *codec = gbcodec->codec;
936         struct snd_card *card = codec->card->snd_card;
937         struct snd_soc_jack *jack, *next_j;
938         int mask;
939
940         dev_dbg(codec->dev, "Unregister %s module\n", module->name);
941
942         down_write(&card->controls_rwsem);
943         mutex_lock(&gbcodec->lock);
944         gbaudio_codec_cleanup(module);
945         list_del(&module->list);
946         dev_dbg(codec->dev, "Process Unregister %s module\n", module->name);
947         mutex_unlock(&gbcodec->lock);
948
949 #ifdef CONFIG_SND_JACK
950         /* free jack devices for this module from codec->jack_list */
951         list_for_each_entry_safe(jack, next_j, &codec->jack_list, list) {
952                 if (jack == &module->headset_jack)
953                         mask = GBCODEC_JACK_MASK;
954                 else if (jack == &module->button_jack)
955                         mask = GBCODEC_JACK_BUTTON_MASK;
956                 else
957                         mask = 0;
958                 if (mask) {
959                         dev_dbg(module->dev, "Report %s removal\n",
960                                 jack->jack->id);
961                         snd_soc_jack_report(jack, 0, mask);
962                         snd_device_free(codec->card->snd_card, jack->jack);
963                         list_del(&jack->list);
964                 }
965         }
966 #endif
967
968         if (module->dapm_routes) {
969                 dev_dbg(codec->dev, "Removing %d routes\n",
970                         module->num_dapm_routes);
971                 snd_soc_dapm_del_routes(&codec->dapm, module->dapm_routes,
972                                         module->num_dapm_routes);
973         }
974         if (module->controls) {
975                 dev_dbg(codec->dev, "Removing %d controls\n",
976                         module->num_controls);
977                 snd_soc_remove_codec_controls(codec, module->controls,
978                                           module->num_controls);
979         }
980         if (module->dapm_widgets) {
981                 dev_dbg(codec->dev, "Removing %d widgets\n",
982                         module->num_dapm_widgets);
983                 snd_soc_dapm_free_controls(&codec->dapm, module->dapm_widgets,
984                                            module->num_dapm_widgets);
985         }
986
987         dev_dbg(codec->dev, "Unregistered %s module\n", module->name);
988
989         up_write(&card->controls_rwsem);
990 }
991 EXPORT_SYMBOL(gbaudio_unregister_module);
992
993 /*
994  * codec driver ops
995  */
996 static int gbcodec_probe(struct snd_soc_codec *codec)
997 {
998         int i;
999         struct gbaudio_codec_info *info;
1000         struct gbaudio_codec_dai *dai;
1001
1002         info = devm_kzalloc(codec->dev, sizeof(*info), GFP_KERNEL);
1003         if (!info)
1004                 return -ENOMEM;
1005
1006         info->dev = codec->dev;
1007         INIT_LIST_HEAD(&info->module_list);
1008         mutex_init(&info->lock);
1009         INIT_LIST_HEAD(&info->dai_list);
1010
1011         /* init dai_list used to maintain runtime stream info */
1012         for (i = 0; i < ARRAY_SIZE(gbaudio_dai); i++) {
1013                 dai = devm_kzalloc(codec->dev, sizeof(*dai), GFP_KERNEL);
1014                 if (!dai)
1015                         return -ENOMEM;
1016                 dai->id = gbaudio_dai[i].id;
1017                 list_add(&dai->list, &info->dai_list);
1018         }
1019
1020         info->codec = codec;
1021         snd_soc_codec_set_drvdata(codec, info);
1022         gbcodec = info;
1023
1024         device_init_wakeup(codec->dev, 1);
1025         return 0;
1026 }
1027
1028 static int gbcodec_remove(struct snd_soc_codec *codec)
1029 {
1030         /* Empty function for now */
1031         return 0;
1032 }
1033
1034 static int gbcodec_write(struct snd_soc_codec *codec, unsigned int reg,
1035                          unsigned int value)
1036 {
1037         return 0;
1038 }
1039
1040 static unsigned int gbcodec_read(struct snd_soc_codec *codec,
1041                                  unsigned int reg)
1042 {
1043         return 0;
1044 }
1045
1046 static struct snd_soc_codec_driver soc_codec_dev_gbaudio = {
1047         .probe  = gbcodec_probe,
1048         .remove = gbcodec_remove,
1049
1050         .read = gbcodec_read,
1051         .write = gbcodec_write,
1052
1053         .idle_bias_off = true,
1054         .ignore_pmdown_time = 1,
1055 };
1056
1057 #ifdef CONFIG_PM
1058 static int gbaudio_codec_suspend(struct device *dev)
1059 {
1060         dev_dbg(dev, "%s: suspend\n", __func__);
1061         return 0;
1062 }
1063
1064 static int gbaudio_codec_resume(struct device *dev)
1065 {
1066         dev_dbg(dev, "%s: resume\n", __func__);
1067         return 0;
1068 }
1069
1070 static const struct dev_pm_ops gbaudio_codec_pm_ops = {
1071         .suspend        = gbaudio_codec_suspend,
1072         .resume         = gbaudio_codec_resume,
1073 };
1074 #endif
1075
1076 static int gbaudio_codec_probe(struct platform_device *pdev)
1077 {
1078         return snd_soc_register_codec(&pdev->dev, &soc_codec_dev_gbaudio,
1079                         gbaudio_dai, ARRAY_SIZE(gbaudio_dai));
1080 }
1081
1082 static int gbaudio_codec_remove(struct platform_device *pdev)
1083 {
1084         snd_soc_unregister_codec(&pdev->dev);
1085         return 0;
1086 }
1087
1088 static const struct of_device_id greybus_asoc_machine_of_match[]  = {
1089         { .compatible = "toshiba,apb-dummy-codec", },
1090         {},
1091 };
1092
1093 static struct platform_driver gbaudio_codec_driver = {
1094         .driver = {
1095                 .name = "apb-dummy-codec",
1096                 .owner = THIS_MODULE,
1097 #ifdef CONFIG_PM
1098                 .pm = &gbaudio_codec_pm_ops,
1099 #endif
1100                 .of_match_table = greybus_asoc_machine_of_match,
1101         },
1102         .probe = gbaudio_codec_probe,
1103         .remove = gbaudio_codec_remove,
1104 };
1105 module_platform_driver(gbaudio_codec_driver);
1106
1107 MODULE_DESCRIPTION("APBridge ALSA SoC dummy codec driver");
1108 MODULE_AUTHOR("Vaibhav Agarwal <vaibhav.agarwal@linaro.org>");
1109 MODULE_LICENSE("GPL v2");
1110 MODULE_ALIAS("platform:apb-dummy-codec");