1/* SPDX-License-Identifier: GPL-2.0
2 *
3 * soc-card.h
4 *
5 * Copyright (C) 2019 Renesas Electronics Corp.
6 * Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
7 */
8#ifndef __SOC_CARD_H
9#define __SOC_CARD_H
10
11enum snd_soc_card_subclass {
12	SND_SOC_CARD_CLASS_INIT		= 0,
13	SND_SOC_CARD_CLASS_RUNTIME	= 1,
14};
15
16struct snd_kcontrol *snd_soc_card_get_kcontrol(struct snd_soc_card *soc_card,
17					       const char *name);
18int snd_soc_card_jack_new(struct snd_soc_card *card, const char *id, int type,
19			  struct snd_soc_jack *jack,
20			  struct snd_soc_jack_pin *pins, unsigned int num_pins);
21
22int snd_soc_card_suspend_pre(struct snd_soc_card *card);
23int snd_soc_card_suspend_post(struct snd_soc_card *card);
24int snd_soc_card_resume_pre(struct snd_soc_card *card);
25int snd_soc_card_resume_post(struct snd_soc_card *card);
26
27int snd_soc_card_probe(struct snd_soc_card *card);
28int snd_soc_card_late_probe(struct snd_soc_card *card);
29int snd_soc_card_remove(struct snd_soc_card *card);
30
31int snd_soc_card_set_bias_level(struct snd_soc_card *card,
32				struct snd_soc_dapm_context *dapm,
33				enum snd_soc_bias_level level);
34int snd_soc_card_set_bias_level_post(struct snd_soc_card *card,
35				     struct snd_soc_dapm_context *dapm,
36				     enum snd_soc_bias_level level);
37
38int snd_soc_card_add_dai_link(struct snd_soc_card *card,
39			      struct snd_soc_dai_link *dai_link);
40void snd_soc_card_remove_dai_link(struct snd_soc_card *card,
41				  struct snd_soc_dai_link *dai_link);
42
43#ifdef CONFIG_PCI
44static inline void snd_soc_card_set_pci_ssid(struct snd_soc_card *card,
45					     unsigned short vendor,
46					     unsigned short device)
47{
48	card->pci_subsystem_vendor = vendor;
49	card->pci_subsystem_device = device;
50	card->pci_subsystem_set = true;
51}
52
53static inline int snd_soc_card_get_pci_ssid(struct snd_soc_card *card,
54					    unsigned short *vendor,
55					    unsigned short *device)
56{
57	if (!card->pci_subsystem_set)
58		return -ENOENT;
59
60	*vendor = card->pci_subsystem_vendor;
61	*device = card->pci_subsystem_device;
62
63	return 0;
64}
65#else /* !CONFIG_PCI */
66static inline void snd_soc_card_set_pci_ssid(struct snd_soc_card *card,
67					     unsigned short vendor,
68					     unsigned short device)
69{
70}
71
72static inline int snd_soc_card_get_pci_ssid(struct snd_soc_card *card,
73					    unsigned short *vendor,
74					    unsigned short *device)
75{
76	return -ENOENT;
77}
78#endif /* CONFIG_PCI */
79
80/* device driver data */
81static inline void snd_soc_card_set_drvdata(struct snd_soc_card *card,
82					    void *data)
83{
84	card->drvdata = data;
85}
86
87static inline void *snd_soc_card_get_drvdata(struct snd_soc_card *card)
88{
89	return card->drvdata;
90}
91
92static inline
93struct snd_soc_dai *snd_soc_card_get_codec_dai(struct snd_soc_card *card,
94					       const char *dai_name)
95{
96	struct snd_soc_pcm_runtime *rtd;
97
98	for_each_card_rtds(card, rtd) {
99		if (!strcmp(asoc_rtd_to_codec(rtd, 0)->name, dai_name))
100			return asoc_rtd_to_codec(rtd, 0);
101	}
102
103	return NULL;
104}
105
106#endif /* __SOC_CARD_H */
107