simple_card_utils.h 6.6 KB
Newer Older
1 2
/* SPDX-License-Identifier: GPL-2.0
 *
3
 * simple_card_utils.h
4 5 6
 *
 * Copyright (c) 2016 Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
 */
7

8 9
#ifndef __SIMPLE_CARD_UTILS_H
#define __SIMPLE_CARD_UTILS_H
10 11 12

#include <sound/soc.h>

13 14 15 16 17
#define asoc_simple_card_init_hp(card, sjack, prefix) \
	asoc_simple_card_init_jack(card, sjack, 1, prefix)
#define asoc_simple_card_init_mic(card, sjack, prefix) \
	asoc_simple_card_init_jack(card, sjack, 0, prefix)

18 19 20
struct asoc_simple_dai {
	const char *name;
	unsigned int sysclk;
21
	int clk_direction;
22 23 24 25 26 27 28
	int slots;
	int slot_width;
	unsigned int tx_slot_mask;
	unsigned int rx_slot_mask;
	struct clk *clk;
};

29 30 31 32 33
struct asoc_simple_card_data {
	u32 convert_rate;
	u32 convert_channels;
};

34 35 36 37 38 39
struct asoc_simple_jack {
	struct snd_soc_jack jack;
	struct snd_soc_jack_pin pin;
	struct snd_soc_jack_gpio gpio;
};

40 41 42 43 44
int asoc_simple_card_parse_daifmt(struct device *dev,
				  struct device_node *node,
				  struct device_node *codec,
				  char *prefix,
				  unsigned int *retfmt);
45
__printf(3, 4)
46 47 48
int asoc_simple_card_set_dailink_name(struct device *dev,
				      struct snd_soc_dai_link *dai_link,
				      const char *fmt, ...);
49 50
int asoc_simple_card_parse_card_name(struct snd_soc_card *card,
				     char *prefix);
51

52
#define asoc_simple_card_parse_clk_cpu(dev, node, dai_link, simple_dai)		\
53
	asoc_simple_card_parse_clk(dev, node, dai_link->cpu_of_node, simple_dai, \
54
				   dai_link->cpu_dai_name, NULL)
55
#define asoc_simple_card_parse_clk_codec(dev, node, dai_link, simple_dai)	\
56
	asoc_simple_card_parse_clk(dev, node, dai_link->codec_of_node, simple_dai,\
57
				   dai_link->codec_dai_name, dai_link->codecs)
58 59
int asoc_simple_card_parse_clk(struct device *dev,
			       struct device_node *node,
60
			       struct device_node *dai_of_node,
61
			       struct asoc_simple_dai *simple_dai,
62 63
			       const char *dai_name,
			       struct snd_soc_dai_link_component *dlc);
64 65
int asoc_simple_card_clk_enable(struct asoc_simple_dai *dai);
void asoc_simple_card_clk_disable(struct asoc_simple_dai *dai);
66

67 68
#define asoc_simple_card_parse_cpu(node, dai_link,				\
				   list_name, cells_name, is_single_link)	\
69 70
	asoc_simple_card_parse_dai(node, NULL,					\
		&dai_link->cpu_of_node,						\
71 72
		&dai_link->cpu_dai_name, list_name, cells_name, is_single_link)
#define asoc_simple_card_parse_codec(node, dai_link, list_name, cells_name)	\
73 74 75 76
	asoc_simple_card_parse_dai(node, dai_link->codecs,			\
				   &dai_link->codec_of_node,			\
				   &dai_link->codec_dai_name,			\
				   list_name, cells_name, NULL)
77
#define asoc_simple_card_parse_platform(node, dai_link, list_name, cells_name)	\
78
	asoc_simple_card_parse_dai(node, dai_link->platforms,			\
79
		&dai_link->platform_of_node,					\
80 81
		NULL, list_name, cells_name, NULL)
int asoc_simple_card_parse_dai(struct device_node *node,
82
				  struct snd_soc_dai_link_component *dlc,
83 84 85 86 87 88
				  struct device_node **endpoint_np,
				  const char **dai_name,
				  const char *list_name,
				  const char *cells_name,
				  int *is_single_links);

89
#define asoc_simple_card_parse_graph_cpu(ep, dai_link)			\
90 91
	asoc_simple_card_parse_graph_dai(ep, NULL,			\
					 &dai_link->cpu_of_node,	\
92 93
					 &dai_link->cpu_dai_name)
#define asoc_simple_card_parse_graph_codec(ep, dai_link)		\
94 95
	asoc_simple_card_parse_graph_dai(ep, dai_link->codecs,		\
					 &dai_link->codec_of_node,	\
96 97
					 &dai_link->codec_dai_name)
int asoc_simple_card_parse_graph_dai(struct device_node *ep,
98
				     struct snd_soc_dai_link_component *dlc,
99 100 101
				     struct device_node **endpoint_np,
				     const char **dai_name);

102 103 104 105 106 107
#define asoc_simple_card_of_parse_tdm(np, dai)			\
	snd_soc_of_parse_tdm_slot(np,	&(dai)->tx_slot_mask,	\
					&(dai)->rx_slot_mask,	\
					&(dai)->slots,		\
					&(dai)->slot_width);

108 109
int asoc_simple_card_init_dai(struct snd_soc_dai *dai,
			      struct asoc_simple_dai *simple_dai);
110

111
void asoc_simple_card_canonicalize_platform(struct snd_soc_dai_link *dai_link);
112 113
void asoc_simple_card_canonicalize_cpu(struct snd_soc_dai_link *dai_link,
				      int is_single_links);
114

115 116
int asoc_simple_card_clean_reference(struct snd_soc_card *card);

117 118
void asoc_simple_card_convert_fixup(struct asoc_simple_card_data *data,
				      struct snd_pcm_hw_params *params);
119 120
void asoc_simple_card_parse_convert(struct device *dev,
				    struct device_node *np, char *prefix,
121 122
				    struct asoc_simple_card_data *data);

123
int asoc_simple_card_of_parse_routing(struct snd_soc_card *card,
124
				      char *prefix);
125 126
int asoc_simple_card_of_parse_widgets(struct snd_soc_card *card,
				      char *prefix);
127

128 129 130 131
int asoc_simple_card_init_jack(struct snd_soc_card *card,
			       struct asoc_simple_jack *sjack,
			       int is_hp, char *prefix);

132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203

#ifdef DEBUG
inline void asoc_simple_debug_dai(struct asoc_simple_priv *priv,
				  char *name,
				  struct asoc_simple_dai *dai)
{
	struct device *dev = simple_priv_to_dev(priv);

	if (dai->name)
		dev_dbg(dev, "%s dai name = %s\n",
			name, dai->name);
	if (dai->sysclk)
		dev_dbg(dev, "%s sysclk = %d\n",
			name, dai->sysclk);

	dev_dbg(dev, "%s direction = %s\n",
		name, dai->clk_direction ? "OUT" : "IN");

	if (dai->slots)
		dev_dbg(dev, "%s slots = %d\n", name, dai->slots);
	if (dai->slot_width)
		dev_dbg(dev, "%s slot width = %d\n", name, dai->slot_width);
	if (dai->tx_slot_mask)
		dev_dbg(dev, "%s tx slot mask = %d\n", name, dai->tx_slot_mask);
	if (dai->rx_slot_mask)
		dev_dbg(dev, "%s rx slot mask = %d\n", name, dai->rx_slot_mask);
	if (dai->clk)
		dev_dbg(dev, "%s clk %luHz\n", name, clk_get_rate(dai->clk));
}

inline void asoc_simple_debug_info(struct asoc_simple_priv *priv)
{
	struct snd_soc_card *card = simple_priv_to_card(priv);
	struct device *dev = simple_priv_to_dev(priv);

	int i;

	if (card->name)
		dev_dbg(dev, "Card Name: %s\n", card->name);

	for (i = 0; i < card->num_links; i++) {
		struct simple_dai_props *props = simple_priv_to_props(priv, i);
		struct snd_soc_dai_link *link = simple_priv_to_link(priv, i);

		dev_dbg(dev, "DAI%d\n", i);

		asoc_simple_debug_dai(priv, "cpu", props->cpu_dai);
		asoc_simple_debug_dai(priv, "codec", props->codec_dai);

		if (link->name)
			dev_dbg(dev, "dai name = %s\n", link->name);

		dev_dbg(dev, "dai format = %04x\n", link->dai_fmt);

		if (props->adata.convert_rate)
			dev_dbg(dev, "convert_rate = %d\n",
				props->adata.convert_rate);
		if (props->adata.convert_channels)
			dev_dbg(dev, "convert_channels = %d\n",
				props->adata.convert_channels);
		if (props->codec_conf && props->codec_conf->name_prefix)
			dev_dbg(dev, "name prefix = %s\n",
				props->codec_conf->name_prefix);
		if (props->mclk_fs)
			dev_dbg(dev, "mclk-fs = %d\n",
				props->mclk_fs);
	}
}
#else
#define  asoc_simple_debug_info(priv)
#endif /* DEBUG */

204
#endif /* __SIMPLE_CARD_UTILS_H */