Merge tag 'iomap-6.6-fixes-5' of git://git.kernel.org/pub/scm/fs/xfs/xfs-linux
[platform/kernel/linux-starfive.git] / sound / soc / soc-component.c
1 // SPDX-License-Identifier: GPL-2.0
2 //
3 // soc-component.c
4 //
5 // Copyright 2009-2011 Wolfson Microelectronics PLC.
6 // Copyright (C) 2019 Renesas Electronics Corp.
7 //
8 // Mark Brown <broonie@opensource.wolfsonmicro.com>
9 // Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
10 //
11 #include <linux/module.h>
12 #include <linux/pm_runtime.h>
13 #include <sound/soc.h>
14 #include <linux/bitops.h>
15
16 #define soc_component_ret(dai, ret) _soc_component_ret(dai, __func__, ret, -1)
17 #define soc_component_ret_reg_rw(dai, ret, reg) _soc_component_ret(dai, __func__, ret, reg)
18 static inline int _soc_component_ret(struct snd_soc_component *component,
19                                      const char *func, int ret, int reg)
20 {
21         /* Positive/Zero values are not errors */
22         if (ret >= 0)
23                 return ret;
24
25         /* Negative values might be errors */
26         switch (ret) {
27         case -EPROBE_DEFER:
28         case -ENOTSUPP:
29                 break;
30         default:
31                 if (reg == -1)
32                         dev_err(component->dev,
33                                 "ASoC: error at %s on %s: %d\n",
34                                 func, component->name, ret);
35                 else
36                         dev_err(component->dev,
37                                 "ASoC: error at %s on %s for register: [0x%08x] %d\n",
38                                 func, component->name, reg, ret);
39         }
40
41         return ret;
42 }
43
44 static inline int soc_component_field_shift(struct snd_soc_component *component,
45                                             unsigned int mask)
46 {
47         if (!mask) {
48                 dev_err(component->dev, "ASoC: error field mask is zero for %s\n",
49                         component->name);
50                 return 0;
51         }
52
53         return (ffs(mask) - 1);
54 }
55
56 /*
57  * We might want to check substream by using list.
58  * In such case, we can update these macros.
59  */
60 #define soc_component_mark_push(component, substream, tgt)      ((component)->mark_##tgt = substream)
61 #define soc_component_mark_pop(component, substream, tgt)       ((component)->mark_##tgt = NULL)
62 #define soc_component_mark_match(component, substream, tgt)     ((component)->mark_##tgt == substream)
63
64 void snd_soc_component_set_aux(struct snd_soc_component *component,
65                                struct snd_soc_aux_dev *aux)
66 {
67         component->init = (aux) ? aux->init : NULL;
68 }
69
70 int snd_soc_component_init(struct snd_soc_component *component)
71 {
72         int ret = 0;
73
74         if (component->init)
75                 ret = component->init(component);
76
77         return soc_component_ret(component, ret);
78 }
79
80 /**
81  * snd_soc_component_set_sysclk - configure COMPONENT system or master clock.
82  * @component: COMPONENT
83  * @clk_id: DAI specific clock ID
84  * @source: Source for the clock
85  * @freq: new clock frequency in Hz
86  * @dir: new clock direction - input/output.
87  *
88  * Configures the CODEC master (MCLK) or system (SYSCLK) clocking.
89  */
90 int snd_soc_component_set_sysclk(struct snd_soc_component *component,
91                                  int clk_id, int source, unsigned int freq,
92                                  int dir)
93 {
94         int ret = -ENOTSUPP;
95
96         if (component->driver->set_sysclk)
97                 ret = component->driver->set_sysclk(component, clk_id, source,
98                                                      freq, dir);
99
100         return soc_component_ret(component, ret);
101 }
102 EXPORT_SYMBOL_GPL(snd_soc_component_set_sysclk);
103
104 /*
105  * snd_soc_component_set_pll - configure component PLL.
106  * @component: COMPONENT
107  * @pll_id: DAI specific PLL ID
108  * @source: DAI specific source for the PLL
109  * @freq_in: PLL input clock frequency in Hz
110  * @freq_out: requested PLL output clock frequency in Hz
111  *
112  * Configures and enables PLL to generate output clock based on input clock.
113  */
114 int snd_soc_component_set_pll(struct snd_soc_component *component, int pll_id,
115                               int source, unsigned int freq_in,
116                               unsigned int freq_out)
117 {
118         int ret = -EINVAL;
119
120         if (component->driver->set_pll)
121                 ret = component->driver->set_pll(component, pll_id, source,
122                                                   freq_in, freq_out);
123
124         return soc_component_ret(component, ret);
125 }
126 EXPORT_SYMBOL_GPL(snd_soc_component_set_pll);
127
128 void snd_soc_component_seq_notifier(struct snd_soc_component *component,
129                                     enum snd_soc_dapm_type type, int subseq)
130 {
131         if (component->driver->seq_notifier)
132                 component->driver->seq_notifier(component, type, subseq);
133 }
134
135 int snd_soc_component_stream_event(struct snd_soc_component *component,
136                                    int event)
137 {
138         int ret = 0;
139
140         if (component->driver->stream_event)
141                 ret = component->driver->stream_event(component, event);
142
143         return soc_component_ret(component, ret);
144 }
145
146 int snd_soc_component_set_bias_level(struct snd_soc_component *component,
147                                      enum snd_soc_bias_level level)
148 {
149         int ret = 0;
150
151         if (component->driver->set_bias_level)
152                 ret = component->driver->set_bias_level(component, level);
153
154         return soc_component_ret(component, ret);
155 }
156
157 int snd_soc_component_enable_pin(struct snd_soc_component *component,
158                                  const char *pin)
159 {
160         struct snd_soc_dapm_context *dapm =
161                 snd_soc_component_get_dapm(component);
162         return snd_soc_dapm_enable_pin(dapm, pin);
163 }
164 EXPORT_SYMBOL_GPL(snd_soc_component_enable_pin);
165
166 int snd_soc_component_enable_pin_unlocked(struct snd_soc_component *component,
167                                           const char *pin)
168 {
169         struct snd_soc_dapm_context *dapm =
170                 snd_soc_component_get_dapm(component);
171         return snd_soc_dapm_enable_pin_unlocked(dapm, pin);
172 }
173 EXPORT_SYMBOL_GPL(snd_soc_component_enable_pin_unlocked);
174
175 int snd_soc_component_disable_pin(struct snd_soc_component *component,
176                                   const char *pin)
177 {
178         struct snd_soc_dapm_context *dapm =
179                 snd_soc_component_get_dapm(component);
180         return snd_soc_dapm_disable_pin(dapm, pin);
181 }
182 EXPORT_SYMBOL_GPL(snd_soc_component_disable_pin);
183
184 int snd_soc_component_disable_pin_unlocked(struct snd_soc_component *component,
185                                            const char *pin)
186 {
187         struct snd_soc_dapm_context *dapm = 
188                 snd_soc_component_get_dapm(component);
189         return snd_soc_dapm_disable_pin_unlocked(dapm, pin);
190 }
191 EXPORT_SYMBOL_GPL(snd_soc_component_disable_pin_unlocked);
192
193 int snd_soc_component_nc_pin(struct snd_soc_component *component,
194                              const char *pin)
195 {
196         struct snd_soc_dapm_context *dapm =
197                 snd_soc_component_get_dapm(component);
198         return snd_soc_dapm_nc_pin(dapm, pin);
199 }
200 EXPORT_SYMBOL_GPL(snd_soc_component_nc_pin);
201
202 int snd_soc_component_nc_pin_unlocked(struct snd_soc_component *component,
203                                       const char *pin)
204 {
205         struct snd_soc_dapm_context *dapm =
206                 snd_soc_component_get_dapm(component);
207         return snd_soc_dapm_nc_pin_unlocked(dapm, pin);
208 }
209 EXPORT_SYMBOL_GPL(snd_soc_component_nc_pin_unlocked);
210
211 int snd_soc_component_get_pin_status(struct snd_soc_component *component,
212                                      const char *pin)
213 {
214         struct snd_soc_dapm_context *dapm =
215                 snd_soc_component_get_dapm(component);
216         return snd_soc_dapm_get_pin_status(dapm, pin);
217 }
218 EXPORT_SYMBOL_GPL(snd_soc_component_get_pin_status);
219
220 int snd_soc_component_force_enable_pin(struct snd_soc_component *component,
221                                        const char *pin)
222 {
223         struct snd_soc_dapm_context *dapm =
224                 snd_soc_component_get_dapm(component);
225         return snd_soc_dapm_force_enable_pin(dapm, pin);
226 }
227 EXPORT_SYMBOL_GPL(snd_soc_component_force_enable_pin);
228
229 int snd_soc_component_force_enable_pin_unlocked(
230         struct snd_soc_component *component,
231         const char *pin)
232 {
233         struct snd_soc_dapm_context *dapm =
234                 snd_soc_component_get_dapm(component);
235         return snd_soc_dapm_force_enable_pin_unlocked(dapm, pin);
236 }
237 EXPORT_SYMBOL_GPL(snd_soc_component_force_enable_pin_unlocked);
238
239 int snd_soc_component_notify_control(struct snd_soc_component *component,
240                                      const char * const ctl)
241 {
242         char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
243         struct snd_kcontrol *kctl;
244
245         /* When updating, change also snd_soc_dapm_widget_name_cmp() */
246         if (component->name_prefix)
247                 snprintf(name, ARRAY_SIZE(name), "%s %s", component->name_prefix, ctl);
248         else
249                 snprintf(name, ARRAY_SIZE(name), "%s", ctl);
250
251         kctl = snd_soc_card_get_kcontrol(component->card, name);
252         if (!kctl)
253                 return soc_component_ret(component, -EINVAL);
254
255         snd_ctl_notify(component->card->snd_card,
256                        SNDRV_CTL_EVENT_MASK_VALUE, &kctl->id);
257
258         return 0;
259 }
260 EXPORT_SYMBOL_GPL(snd_soc_component_notify_control);
261
262 /**
263  * snd_soc_component_set_jack - configure component jack.
264  * @component: COMPONENTs
265  * @jack: structure to use for the jack
266  * @data: can be used if codec driver need extra data for configuring jack
267  *
268  * Configures and enables jack detection function.
269  */
270 int snd_soc_component_set_jack(struct snd_soc_component *component,
271                                struct snd_soc_jack *jack, void *data)
272 {
273         int ret = -ENOTSUPP;
274
275         if (component->driver->set_jack)
276                 ret = component->driver->set_jack(component, jack, data);
277
278         return soc_component_ret(component, ret);
279 }
280 EXPORT_SYMBOL_GPL(snd_soc_component_set_jack);
281
282 /**
283  * snd_soc_component_get_jack_type
284  * @component: COMPONENTs
285  *
286  * Returns the jack type of the component
287  * This can either be the supported type or one read from
288  * devicetree with the property: jack-type.
289  */
290 int snd_soc_component_get_jack_type(
291         struct snd_soc_component *component)
292 {
293         int ret = -ENOTSUPP;
294
295         if (component->driver->get_jack_type)
296                 ret = component->driver->get_jack_type(component);
297
298         return soc_component_ret(component, ret);
299 }
300 EXPORT_SYMBOL_GPL(snd_soc_component_get_jack_type);
301
302 int snd_soc_component_module_get(struct snd_soc_component *component,
303                                  void *mark, int upon_open)
304 {
305         int ret = 0;
306
307         if (component->driver->module_get_upon_open == !!upon_open &&
308             !try_module_get(component->dev->driver->owner))
309                 ret = -ENODEV;
310
311         /* mark module if succeeded */
312         if (ret == 0)
313                 soc_component_mark_push(component, mark, module);
314
315         return soc_component_ret(component, ret);
316 }
317
318 void snd_soc_component_module_put(struct snd_soc_component *component,
319                                   void *mark, int upon_open, int rollback)
320 {
321         if (rollback && !soc_component_mark_match(component, mark, module))
322                 return;
323
324         if (component->driver->module_get_upon_open == !!upon_open)
325                 module_put(component->dev->driver->owner);
326
327         /* remove the mark from module */
328         soc_component_mark_pop(component, mark, module);
329 }
330
331 int snd_soc_component_open(struct snd_soc_component *component,
332                            struct snd_pcm_substream *substream)
333 {
334         int ret = 0;
335
336         if (component->driver->open)
337                 ret = component->driver->open(component, substream);
338
339         /* mark substream if succeeded */
340         if (ret == 0)
341                 soc_component_mark_push(component, substream, open);
342
343         return soc_component_ret(component, ret);
344 }
345
346 int snd_soc_component_close(struct snd_soc_component *component,
347                             struct snd_pcm_substream *substream,
348                             int rollback)
349 {
350         int ret = 0;
351
352         if (rollback && !soc_component_mark_match(component, substream, open))
353                 return 0;
354
355         if (component->driver->close)
356                 ret = component->driver->close(component, substream);
357
358         /* remove marked substream */
359         soc_component_mark_pop(component, substream, open);
360
361         return soc_component_ret(component, ret);
362 }
363
364 void snd_soc_component_suspend(struct snd_soc_component *component)
365 {
366         if (component->driver->suspend)
367                 component->driver->suspend(component);
368         component->suspended = 1;
369 }
370
371 void snd_soc_component_resume(struct snd_soc_component *component)
372 {
373         if (component->driver->resume)
374                 component->driver->resume(component);
375         component->suspended = 0;
376 }
377
378 int snd_soc_component_is_suspended(struct snd_soc_component *component)
379 {
380         return component->suspended;
381 }
382
383 int snd_soc_component_probe(struct snd_soc_component *component)
384 {
385         int ret = 0;
386
387         if (component->driver->probe)
388                 ret = component->driver->probe(component);
389
390         return soc_component_ret(component, ret);
391 }
392
393 void snd_soc_component_remove(struct snd_soc_component *component)
394 {
395         if (component->driver->remove)
396                 component->driver->remove(component);
397 }
398
399 int snd_soc_component_of_xlate_dai_id(struct snd_soc_component *component,
400                                       struct device_node *ep)
401 {
402         int ret = -ENOTSUPP;
403
404         if (component->driver->of_xlate_dai_id)
405                 ret = component->driver->of_xlate_dai_id(component, ep);
406
407         return soc_component_ret(component, ret);
408 }
409
410 int snd_soc_component_of_xlate_dai_name(struct snd_soc_component *component,
411                                         const struct of_phandle_args *args,
412                                         const char **dai_name)
413 {
414         if (component->driver->of_xlate_dai_name)
415                 return component->driver->of_xlate_dai_name(component,
416                                                             args, dai_name);
417         /*
418          * Don't use soc_component_ret here because we may not want to report
419          * the error just yet. If a device has more than one component, the
420          * first may not match and we don't want spam the log with this.
421          */
422         return -ENOTSUPP;
423 }
424
425 void snd_soc_component_setup_regmap(struct snd_soc_component *component)
426 {
427         int val_bytes = regmap_get_val_bytes(component->regmap);
428
429         /* Errors are legitimate for non-integer byte multiples */
430         if (val_bytes > 0)
431                 component->val_bytes = val_bytes;
432 }
433
434 #ifdef CONFIG_REGMAP
435
436 /**
437  * snd_soc_component_init_regmap() - Initialize regmap instance for the
438  *                                   component
439  * @component: The component for which to initialize the regmap instance
440  * @regmap: The regmap instance that should be used by the component
441  *
442  * This function allows deferred assignment of the regmap instance that is
443  * associated with the component. Only use this if the regmap instance is not
444  * yet ready when the component is registered. The function must also be called
445  * before the first IO attempt of the component.
446  */
447 void snd_soc_component_init_regmap(struct snd_soc_component *component,
448                                    struct regmap *regmap)
449 {
450         component->regmap = regmap;
451         snd_soc_component_setup_regmap(component);
452 }
453 EXPORT_SYMBOL_GPL(snd_soc_component_init_regmap);
454
455 /**
456  * snd_soc_component_exit_regmap() - De-initialize regmap instance for the
457  *                                   component
458  * @component: The component for which to de-initialize the regmap instance
459  *
460  * Calls regmap_exit() on the regmap instance associated to the component and
461  * removes the regmap instance from the component.
462  *
463  * This function should only be used if snd_soc_component_init_regmap() was used
464  * to initialize the regmap instance.
465  */
466 void snd_soc_component_exit_regmap(struct snd_soc_component *component)
467 {
468         regmap_exit(component->regmap);
469         component->regmap = NULL;
470 }
471 EXPORT_SYMBOL_GPL(snd_soc_component_exit_regmap);
472
473 #endif
474
475 int snd_soc_component_compr_open(struct snd_soc_component *component,
476                                  struct snd_compr_stream *cstream)
477 {
478         int ret = 0;
479
480         if (component->driver->compress_ops &&
481             component->driver->compress_ops->open)
482                 ret = component->driver->compress_ops->open(component, cstream);
483
484         /* mark substream if succeeded */
485         if (ret == 0)
486                 soc_component_mark_push(component, cstream, compr_open);
487
488         return soc_component_ret(component, ret);
489 }
490 EXPORT_SYMBOL_GPL(snd_soc_component_compr_open);
491
492 void snd_soc_component_compr_free(struct snd_soc_component *component,
493                                   struct snd_compr_stream *cstream,
494                                   int rollback)
495 {
496         if (rollback && !soc_component_mark_match(component, cstream, compr_open))
497                 return;
498
499         if (component->driver->compress_ops &&
500             component->driver->compress_ops->free)
501                 component->driver->compress_ops->free(component, cstream);
502
503         /* remove marked substream */
504         soc_component_mark_pop(component, cstream, compr_open);
505 }
506 EXPORT_SYMBOL_GPL(snd_soc_component_compr_free);
507
508 int snd_soc_component_compr_trigger(struct snd_compr_stream *cstream, int cmd)
509 {
510         struct snd_soc_pcm_runtime *rtd = cstream->private_data;
511         struct snd_soc_component *component;
512         int i, ret;
513
514         for_each_rtd_components(rtd, i, component) {
515                 if (component->driver->compress_ops &&
516                     component->driver->compress_ops->trigger) {
517                         ret = component->driver->compress_ops->trigger(
518                                 component, cstream, cmd);
519                         if (ret < 0)
520                                 return soc_component_ret(component, ret);
521                 }
522         }
523
524         return 0;
525 }
526 EXPORT_SYMBOL_GPL(snd_soc_component_compr_trigger);
527
528 int snd_soc_component_compr_set_params(struct snd_compr_stream *cstream,
529                                        struct snd_compr_params *params)
530 {
531         struct snd_soc_pcm_runtime *rtd = cstream->private_data;
532         struct snd_soc_component *component;
533         int i, ret;
534
535         for_each_rtd_components(rtd, i, component) {
536                 if (component->driver->compress_ops &&
537                     component->driver->compress_ops->set_params) {
538                         ret = component->driver->compress_ops->set_params(
539                                 component, cstream, params);
540                         if (ret < 0)
541                                 return soc_component_ret(component, ret);
542                 }
543         }
544
545         return 0;
546 }
547 EXPORT_SYMBOL_GPL(snd_soc_component_compr_set_params);
548
549 int snd_soc_component_compr_get_params(struct snd_compr_stream *cstream,
550                                        struct snd_codec *params)
551 {
552         struct snd_soc_pcm_runtime *rtd = cstream->private_data;
553         struct snd_soc_component *component;
554         int i, ret;
555
556         for_each_rtd_components(rtd, i, component) {
557                 if (component->driver->compress_ops &&
558                     component->driver->compress_ops->get_params) {
559                         ret = component->driver->compress_ops->get_params(
560                                 component, cstream, params);
561                         return soc_component_ret(component, ret);
562                 }
563         }
564
565         return 0;
566 }
567 EXPORT_SYMBOL_GPL(snd_soc_component_compr_get_params);
568
569 int snd_soc_component_compr_get_caps(struct snd_compr_stream *cstream,
570                                      struct snd_compr_caps *caps)
571 {
572         struct snd_soc_pcm_runtime *rtd = cstream->private_data;
573         struct snd_soc_component *component;
574         int i, ret = 0;
575
576         snd_soc_dpcm_mutex_lock(rtd);
577
578         for_each_rtd_components(rtd, i, component) {
579                 if (component->driver->compress_ops &&
580                     component->driver->compress_ops->get_caps) {
581                         ret = component->driver->compress_ops->get_caps(
582                                 component, cstream, caps);
583                         break;
584                 }
585         }
586
587         snd_soc_dpcm_mutex_unlock(rtd);
588
589         return soc_component_ret(component, ret);
590 }
591 EXPORT_SYMBOL_GPL(snd_soc_component_compr_get_caps);
592
593 int snd_soc_component_compr_get_codec_caps(struct snd_compr_stream *cstream,
594                                            struct snd_compr_codec_caps *codec)
595 {
596         struct snd_soc_pcm_runtime *rtd = cstream->private_data;
597         struct snd_soc_component *component;
598         int i, ret = 0;
599
600         snd_soc_dpcm_mutex_lock(rtd);
601
602         for_each_rtd_components(rtd, i, component) {
603                 if (component->driver->compress_ops &&
604                     component->driver->compress_ops->get_codec_caps) {
605                         ret = component->driver->compress_ops->get_codec_caps(
606                                 component, cstream, codec);
607                         break;
608                 }
609         }
610
611         snd_soc_dpcm_mutex_unlock(rtd);
612
613         return soc_component_ret(component, ret);
614 }
615 EXPORT_SYMBOL_GPL(snd_soc_component_compr_get_codec_caps);
616
617 int snd_soc_component_compr_ack(struct snd_compr_stream *cstream, size_t bytes)
618 {
619         struct snd_soc_pcm_runtime *rtd = cstream->private_data;
620         struct snd_soc_component *component;
621         int i, ret;
622
623         for_each_rtd_components(rtd, i, component) {
624                 if (component->driver->compress_ops &&
625                     component->driver->compress_ops->ack) {
626                         ret = component->driver->compress_ops->ack(
627                                 component, cstream, bytes);
628                         if (ret < 0)
629                                 return soc_component_ret(component, ret);
630                 }
631         }
632
633         return 0;
634 }
635 EXPORT_SYMBOL_GPL(snd_soc_component_compr_ack);
636
637 int snd_soc_component_compr_pointer(struct snd_compr_stream *cstream,
638                                     struct snd_compr_tstamp *tstamp)
639 {
640         struct snd_soc_pcm_runtime *rtd = cstream->private_data;
641         struct snd_soc_component *component;
642         int i, ret;
643
644         for_each_rtd_components(rtd, i, component) {
645                 if (component->driver->compress_ops &&
646                     component->driver->compress_ops->pointer) {
647                         ret = component->driver->compress_ops->pointer(
648                                 component, cstream, tstamp);
649                         return soc_component_ret(component, ret);
650                 }
651         }
652
653         return 0;
654 }
655 EXPORT_SYMBOL_GPL(snd_soc_component_compr_pointer);
656
657 int snd_soc_component_compr_copy(struct snd_compr_stream *cstream,
658                                  char __user *buf, size_t count)
659 {
660         struct snd_soc_pcm_runtime *rtd = cstream->private_data;
661         struct snd_soc_component *component;
662         int i, ret = 0;
663
664         snd_soc_dpcm_mutex_lock(rtd);
665
666         for_each_rtd_components(rtd, i, component) {
667                 if (component->driver->compress_ops &&
668                     component->driver->compress_ops->copy) {
669                         ret = component->driver->compress_ops->copy(
670                                 component, cstream, buf, count);
671                         break;
672                 }
673         }
674
675         snd_soc_dpcm_mutex_unlock(rtd);
676
677         return soc_component_ret(component, ret);
678 }
679 EXPORT_SYMBOL_GPL(snd_soc_component_compr_copy);
680
681 int snd_soc_component_compr_set_metadata(struct snd_compr_stream *cstream,
682                                          struct snd_compr_metadata *metadata)
683 {
684         struct snd_soc_pcm_runtime *rtd = cstream->private_data;
685         struct snd_soc_component *component;
686         int i, ret;
687
688         for_each_rtd_components(rtd, i, component) {
689                 if (component->driver->compress_ops &&
690                     component->driver->compress_ops->set_metadata) {
691                         ret = component->driver->compress_ops->set_metadata(
692                                 component, cstream, metadata);
693                         if (ret < 0)
694                                 return soc_component_ret(component, ret);
695                 }
696         }
697
698         return 0;
699 }
700 EXPORT_SYMBOL_GPL(snd_soc_component_compr_set_metadata);
701
702 int snd_soc_component_compr_get_metadata(struct snd_compr_stream *cstream,
703                                          struct snd_compr_metadata *metadata)
704 {
705         struct snd_soc_pcm_runtime *rtd = cstream->private_data;
706         struct snd_soc_component *component;
707         int i, ret;
708
709         for_each_rtd_components(rtd, i, component) {
710                 if (component->driver->compress_ops &&
711                     component->driver->compress_ops->get_metadata) {
712                         ret = component->driver->compress_ops->get_metadata(
713                                 component, cstream, metadata);
714                         return soc_component_ret(component, ret);
715                 }
716         }
717
718         return 0;
719 }
720 EXPORT_SYMBOL_GPL(snd_soc_component_compr_get_metadata);
721
722 static unsigned int soc_component_read_no_lock(
723         struct snd_soc_component *component,
724         unsigned int reg)
725 {
726         int ret;
727         unsigned int val = 0;
728
729         if (component->regmap)
730                 ret = regmap_read(component->regmap, reg, &val);
731         else if (component->driver->read) {
732                 ret = 0;
733                 val = component->driver->read(component, reg);
734         }
735         else
736                 ret = -EIO;
737
738         if (ret < 0)
739                 return soc_component_ret_reg_rw(component, ret, reg);
740
741         return val;
742 }
743
744 /**
745  * snd_soc_component_read() - Read register value
746  * @component: Component to read from
747  * @reg: Register to read
748  *
749  * Return: read value
750  */
751 unsigned int snd_soc_component_read(struct snd_soc_component *component,
752                                     unsigned int reg)
753 {
754         unsigned int val;
755
756         mutex_lock(&component->io_mutex);
757         val = soc_component_read_no_lock(component, reg);
758         mutex_unlock(&component->io_mutex);
759
760         return val;
761 }
762 EXPORT_SYMBOL_GPL(snd_soc_component_read);
763
764 static int soc_component_write_no_lock(
765         struct snd_soc_component *component,
766         unsigned int reg, unsigned int val)
767 {
768         int ret = -EIO;
769
770         if (component->regmap)
771                 ret = regmap_write(component->regmap, reg, val);
772         else if (component->driver->write)
773                 ret = component->driver->write(component, reg, val);
774
775         return soc_component_ret_reg_rw(component, ret, reg);
776 }
777
778 /**
779  * snd_soc_component_write() - Write register value
780  * @component: Component to write to
781  * @reg: Register to write
782  * @val: Value to write to the register
783  *
784  * Return: 0 on success, a negative error code otherwise.
785  */
786 int snd_soc_component_write(struct snd_soc_component *component,
787                             unsigned int reg, unsigned int val)
788 {
789         int ret;
790
791         mutex_lock(&component->io_mutex);
792         ret = soc_component_write_no_lock(component, reg, val);
793         mutex_unlock(&component->io_mutex);
794
795         return ret;
796 }
797 EXPORT_SYMBOL_GPL(snd_soc_component_write);
798
799 static int snd_soc_component_update_bits_legacy(
800         struct snd_soc_component *component, unsigned int reg,
801         unsigned int mask, unsigned int val, bool *change)
802 {
803         unsigned int old, new;
804         int ret = 0;
805
806         mutex_lock(&component->io_mutex);
807
808         old = soc_component_read_no_lock(component, reg);
809
810         new = (old & ~mask) | (val & mask);
811         *change = old != new;
812         if (*change)
813                 ret = soc_component_write_no_lock(component, reg, new);
814
815         mutex_unlock(&component->io_mutex);
816
817         return soc_component_ret_reg_rw(component, ret, reg);
818 }
819
820 /**
821  * snd_soc_component_update_bits() - Perform read/modify/write cycle
822  * @component: Component to update
823  * @reg: Register to update
824  * @mask: Mask that specifies which bits to update
825  * @val: New value for the bits specified by mask
826  *
827  * Return: 1 if the operation was successful and the value of the register
828  * changed, 0 if the operation was successful, but the value did not change.
829  * Returns a negative error code otherwise.
830  */
831 int snd_soc_component_update_bits(struct snd_soc_component *component,
832                                   unsigned int reg, unsigned int mask, unsigned int val)
833 {
834         bool change;
835         int ret;
836
837         if (component->regmap)
838                 ret = regmap_update_bits_check(component->regmap, reg, mask,
839                                                val, &change);
840         else
841                 ret = snd_soc_component_update_bits_legacy(component, reg,
842                                                            mask, val, &change);
843
844         if (ret < 0)
845                 return soc_component_ret_reg_rw(component, ret, reg);
846         return change;
847 }
848 EXPORT_SYMBOL_GPL(snd_soc_component_update_bits);
849
850 /**
851  * snd_soc_component_update_bits_async() - Perform asynchronous
852  *  read/modify/write cycle
853  * @component: Component to update
854  * @reg: Register to update
855  * @mask: Mask that specifies which bits to update
856  * @val: New value for the bits specified by mask
857  *
858  * This function is similar to snd_soc_component_update_bits(), but the update
859  * operation is scheduled asynchronously. This means it may not be completed
860  * when the function returns. To make sure that all scheduled updates have been
861  * completed snd_soc_component_async_complete() must be called.
862  *
863  * Return: 1 if the operation was successful and the value of the register
864  * changed, 0 if the operation was successful, but the value did not change.
865  * Returns a negative error code otherwise.
866  */
867 int snd_soc_component_update_bits_async(struct snd_soc_component *component,
868                                         unsigned int reg, unsigned int mask, unsigned int val)
869 {
870         bool change;
871         int ret;
872
873         if (component->regmap)
874                 ret = regmap_update_bits_check_async(component->regmap, reg,
875                                                      mask, val, &change);
876         else
877                 ret = snd_soc_component_update_bits_legacy(component, reg,
878                                                            mask, val, &change);
879
880         if (ret < 0)
881                 return soc_component_ret_reg_rw(component, ret, reg);
882         return change;
883 }
884 EXPORT_SYMBOL_GPL(snd_soc_component_update_bits_async);
885
886 /**
887  * snd_soc_component_read_field() - Read register field value
888  * @component: Component to read from
889  * @reg: Register to read
890  * @mask: mask of the register field
891  *
892  * Return: read value of register field.
893  */
894 unsigned int snd_soc_component_read_field(struct snd_soc_component *component,
895                                           unsigned int reg, unsigned int mask)
896 {
897         unsigned int val;
898
899         val = snd_soc_component_read(component, reg);
900
901         val = (val & mask) >> soc_component_field_shift(component, mask);
902
903         return val;
904 }
905 EXPORT_SYMBOL_GPL(snd_soc_component_read_field);
906
907 /**
908  * snd_soc_component_write_field() - write to register field
909  * @component: Component to write to
910  * @reg: Register to write
911  * @mask: mask of the register field to update
912  * @val: value of the field to write
913  *
914  * Return: 1 for change, otherwise 0.
915  */
916 int snd_soc_component_write_field(struct snd_soc_component *component,
917                                   unsigned int reg, unsigned int mask,
918                                   unsigned int val)
919 {
920
921         val = (val << soc_component_field_shift(component, mask)) & mask;
922
923         return snd_soc_component_update_bits(component, reg, mask, val);
924 }
925 EXPORT_SYMBOL_GPL(snd_soc_component_write_field);
926
927 /**
928  * snd_soc_component_async_complete() - Ensure asynchronous I/O has completed
929  * @component: Component for which to wait
930  *
931  * This function blocks until all asynchronous I/O which has previously been
932  * scheduled using snd_soc_component_update_bits_async() has completed.
933  */
934 void snd_soc_component_async_complete(struct snd_soc_component *component)
935 {
936         if (component->regmap)
937                 regmap_async_complete(component->regmap);
938 }
939 EXPORT_SYMBOL_GPL(snd_soc_component_async_complete);
940
941 /**
942  * snd_soc_component_test_bits - Test register for change
943  * @component: component
944  * @reg: Register to test
945  * @mask: Mask that specifies which bits to test
946  * @value: Value to test against
947  *
948  * Tests a register with a new value and checks if the new value is
949  * different from the old value.
950  *
951  * Return: 1 for change, otherwise 0.
952  */
953 int snd_soc_component_test_bits(struct snd_soc_component *component,
954                                 unsigned int reg, unsigned int mask, unsigned int value)
955 {
956         unsigned int old, new;
957
958         old = snd_soc_component_read(component, reg);
959         new = (old & ~mask) | value;
960         return old != new;
961 }
962 EXPORT_SYMBOL_GPL(snd_soc_component_test_bits);
963
964 int snd_soc_pcm_component_pointer(struct snd_pcm_substream *substream)
965 {
966         struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
967         struct snd_soc_component *component;
968         int i;
969
970         /* FIXME: use 1st pointer */
971         for_each_rtd_components(rtd, i, component)
972                 if (component->driver->pointer)
973                         return component->driver->pointer(component, substream);
974
975         return 0;
976 }
977
978 static bool snd_soc_component_is_codec_on_rtd(struct snd_soc_pcm_runtime *rtd,
979                                               struct snd_soc_component *component)
980 {
981         struct snd_soc_dai *dai;
982         int i;
983
984         for_each_rtd_codec_dais(rtd, i, dai) {
985                 if (dai->component == component)
986                         return true;
987         }
988
989         return false;
990 }
991
992 void snd_soc_pcm_component_delay(struct snd_pcm_substream *substream,
993                                  snd_pcm_sframes_t *cpu_delay,
994                                  snd_pcm_sframes_t *codec_delay)
995 {
996         struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
997         struct snd_soc_component *component;
998         snd_pcm_sframes_t delay;
999         int i;
1000
1001         /*
1002          * We're looking for the delay through the full audio path so it needs to
1003          * be the maximum of the Components doing transmit and the maximum of the
1004          * Components doing receive (ie, all CPUs and all CODECs) rather than
1005          * just the maximum of all Components.
1006          */
1007         for_each_rtd_components(rtd, i, component) {
1008                 if (!component->driver->delay)
1009                         continue;
1010
1011                 delay = component->driver->delay(component, substream);
1012
1013                 if (snd_soc_component_is_codec_on_rtd(rtd, component))
1014                         *codec_delay = max(*codec_delay, delay);
1015                 else
1016                         *cpu_delay = max(*cpu_delay, delay);
1017         }
1018 }
1019
1020 int snd_soc_pcm_component_ioctl(struct snd_pcm_substream *substream,
1021                                 unsigned int cmd, void *arg)
1022 {
1023         struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
1024         struct snd_soc_component *component;
1025         int i;
1026
1027         /* FIXME: use 1st ioctl */
1028         for_each_rtd_components(rtd, i, component)
1029                 if (component->driver->ioctl)
1030                         return soc_component_ret(
1031                                 component,
1032                                 component->driver->ioctl(component,
1033                                                          substream, cmd, arg));
1034
1035         return snd_pcm_lib_ioctl(substream, cmd, arg);
1036 }
1037
1038 int snd_soc_pcm_component_sync_stop(struct snd_pcm_substream *substream)
1039 {
1040         struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
1041         struct snd_soc_component *component;
1042         int i, ret;
1043
1044         for_each_rtd_components(rtd, i, component) {
1045                 if (component->driver->sync_stop) {
1046                         ret = component->driver->sync_stop(component,
1047                                                            substream);
1048                         if (ret < 0)
1049                                 return soc_component_ret(component, ret);
1050                 }
1051         }
1052
1053         return 0;
1054 }
1055
1056 int snd_soc_pcm_component_copy(struct snd_pcm_substream *substream,
1057                                int channel, unsigned long pos,
1058                                struct iov_iter *iter, unsigned long bytes)
1059 {
1060         struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
1061         struct snd_soc_component *component;
1062         int i;
1063
1064         /* FIXME. it returns 1st copy now */
1065         for_each_rtd_components(rtd, i, component)
1066                 if (component->driver->copy)
1067                         return soc_component_ret(component,
1068                                 component->driver->copy(component, substream,
1069                                         channel, pos, iter, bytes));
1070
1071         return -EINVAL;
1072 }
1073
1074 struct page *snd_soc_pcm_component_page(struct snd_pcm_substream *substream,
1075                                         unsigned long offset)
1076 {
1077         struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
1078         struct snd_soc_component *component;
1079         struct page *page;
1080         int i;
1081
1082         /* FIXME. it returns 1st page now */
1083         for_each_rtd_components(rtd, i, component) {
1084                 if (component->driver->page) {
1085                         page = component->driver->page(component,
1086                                                        substream, offset);
1087                         if (page)
1088                                 return page;
1089                 }
1090         }
1091
1092         return NULL;
1093 }
1094
1095 int snd_soc_pcm_component_mmap(struct snd_pcm_substream *substream,
1096                                struct vm_area_struct *vma)
1097 {
1098         struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
1099         struct snd_soc_component *component;
1100         int i;
1101
1102         /* FIXME. it returns 1st mmap now */
1103         for_each_rtd_components(rtd, i, component)
1104                 if (component->driver->mmap)
1105                         return soc_component_ret(
1106                                 component,
1107                                 component->driver->mmap(component,
1108                                                         substream, vma));
1109
1110         return -EINVAL;
1111 }
1112
1113 int snd_soc_pcm_component_new(struct snd_soc_pcm_runtime *rtd)
1114 {
1115         struct snd_soc_component *component;
1116         int ret;
1117         int i;
1118
1119         for_each_rtd_components(rtd, i, component) {
1120                 if (component->driver->pcm_construct) {
1121                         ret = component->driver->pcm_construct(component, rtd);
1122                         if (ret < 0)
1123                                 return soc_component_ret(component, ret);
1124                 }
1125         }
1126
1127         return 0;
1128 }
1129
1130 void snd_soc_pcm_component_free(struct snd_soc_pcm_runtime *rtd)
1131 {
1132         struct snd_soc_component *component;
1133         int i;
1134
1135         if (!rtd->pcm)
1136                 return;
1137
1138         for_each_rtd_components(rtd, i, component)
1139                 if (component->driver->pcm_destruct)
1140                         component->driver->pcm_destruct(component, rtd->pcm);
1141 }
1142
1143 int snd_soc_pcm_component_prepare(struct snd_pcm_substream *substream)
1144 {
1145         struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
1146         struct snd_soc_component *component;
1147         int i, ret;
1148
1149         for_each_rtd_components(rtd, i, component) {
1150                 if (component->driver->prepare) {
1151                         ret = component->driver->prepare(component, substream);
1152                         if (ret < 0)
1153                                 return soc_component_ret(component, ret);
1154                 }
1155         }
1156
1157         return 0;
1158 }
1159
1160 int snd_soc_pcm_component_hw_params(struct snd_pcm_substream *substream,
1161                                     struct snd_pcm_hw_params *params)
1162 {
1163         struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
1164         struct snd_soc_component *component;
1165         int i, ret;
1166
1167         for_each_rtd_components(rtd, i, component) {
1168                 if (component->driver->hw_params) {
1169                         ret = component->driver->hw_params(component,
1170                                                            substream, params);
1171                         if (ret < 0)
1172                                 return soc_component_ret(component, ret);
1173                 }
1174                 /* mark substream if succeeded */
1175                 soc_component_mark_push(component, substream, hw_params);
1176         }
1177
1178         return 0;
1179 }
1180
1181 void snd_soc_pcm_component_hw_free(struct snd_pcm_substream *substream,
1182                                    int rollback)
1183 {
1184         struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
1185         struct snd_soc_component *component;
1186         int i, ret;
1187
1188         for_each_rtd_components(rtd, i, component) {
1189                 if (rollback && !soc_component_mark_match(component, substream, hw_params))
1190                         continue;
1191
1192                 if (component->driver->hw_free) {
1193                         ret = component->driver->hw_free(component, substream);
1194                         if (ret < 0)
1195                                 soc_component_ret(component, ret);
1196                 }
1197
1198                 /* remove marked substream */
1199                 soc_component_mark_pop(component, substream, hw_params);
1200         }
1201 }
1202
1203 static int soc_component_trigger(struct snd_soc_component *component,
1204                                  struct snd_pcm_substream *substream,
1205                                  int cmd)
1206 {
1207         int ret = 0;
1208
1209         if (component->driver->trigger)
1210                 ret = component->driver->trigger(component, substream, cmd);
1211
1212         return soc_component_ret(component, ret);
1213 }
1214
1215 int snd_soc_pcm_component_trigger(struct snd_pcm_substream *substream,
1216                                   int cmd, int rollback)
1217 {
1218         struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
1219         struct snd_soc_component *component;
1220         int i, r, ret = 0;
1221
1222         switch (cmd) {
1223         case SNDRV_PCM_TRIGGER_START:
1224         case SNDRV_PCM_TRIGGER_RESUME:
1225         case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
1226                 for_each_rtd_components(rtd, i, component) {
1227                         ret = soc_component_trigger(component, substream, cmd);
1228                         if (ret < 0)
1229                                 break;
1230                         soc_component_mark_push(component, substream, trigger);
1231                 }
1232                 break;
1233         case SNDRV_PCM_TRIGGER_STOP:
1234         case SNDRV_PCM_TRIGGER_SUSPEND:
1235         case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
1236                 for_each_rtd_components(rtd, i, component) {
1237                         if (rollback && !soc_component_mark_match(component, substream, trigger))
1238                                 continue;
1239
1240                         r = soc_component_trigger(component, substream, cmd);
1241                         if (r < 0)
1242                                 ret = r; /* use last ret */
1243                         soc_component_mark_pop(component, substream, trigger);
1244                 }
1245         }
1246
1247         return ret;
1248 }
1249
1250 int snd_soc_pcm_component_pm_runtime_get(struct snd_soc_pcm_runtime *rtd,
1251                                          void *stream)
1252 {
1253         struct snd_soc_component *component;
1254         int i;
1255
1256         for_each_rtd_components(rtd, i, component) {
1257                 int ret = pm_runtime_get_sync(component->dev);
1258                 if (ret < 0 && ret != -EACCES) {
1259                         pm_runtime_put_noidle(component->dev);
1260                         return soc_component_ret(component, ret);
1261                 }
1262                 /* mark stream if succeeded */
1263                 soc_component_mark_push(component, stream, pm);
1264         }
1265
1266         return 0;
1267 }
1268
1269 void snd_soc_pcm_component_pm_runtime_put(struct snd_soc_pcm_runtime *rtd,
1270                                           void *stream, int rollback)
1271 {
1272         struct snd_soc_component *component;
1273         int i;
1274
1275         for_each_rtd_components(rtd, i, component) {
1276                 if (rollback && !soc_component_mark_match(component, stream, pm))
1277                         continue;
1278
1279                 pm_runtime_mark_last_busy(component->dev);
1280                 pm_runtime_put_autosuspend(component->dev);
1281
1282                 /* remove marked stream */
1283                 soc_component_mark_pop(component, stream, pm);
1284         }
1285 }
1286
1287 int snd_soc_pcm_component_ack(struct snd_pcm_substream *substream)
1288 {
1289         struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
1290         struct snd_soc_component *component;
1291         int i;
1292
1293         /* FIXME: use 1st pointer */
1294         for_each_rtd_components(rtd, i, component)
1295                 if (component->driver->ack)
1296                         return component->driver->ack(component, substream);
1297
1298         return 0;
1299 }