Linux Audio

Check our new training course

Loading...
Note: File does not exist in v4.17.
  1// SPDX-License-Identifier: GPL-2.0
  2/*
  3 * rt715.c -- rt715 ALSA SoC audio driver
  4 *
  5 * Copyright(c) 2019 Realtek Semiconductor Corp.
  6 *
  7 * ALC715 ASoC Codec Driver based Intel Dummy SdW codec driver
  8 *
  9 */
 10
 11#include <linux/module.h>
 12#include <linux/moduleparam.h>
 13#include <linux/kernel.h>
 14#include <linux/init.h>
 15#include <linux/delay.h>
 16#include <linux/i2c.h>
 17#include <linux/pm_runtime.h>
 18#include <linux/pm.h>
 19#include <linux/soundwire/sdw.h>
 20#include <linux/gpio.h>
 21#include <linux/regmap.h>
 22#include <linux/slab.h>
 23#include <linux/platform_device.h>
 24#include <linux/regulator/consumer.h>
 25#include <linux/gpio/consumer.h>
 26#include <linux/of.h>
 27#include <linux/of_gpio.h>
 28#include <linux/of_device.h>
 29#include <sound/core.h>
 30#include <sound/pcm.h>
 31#include <sound/pcm_params.h>
 32#include <sound/soc.h>
 33#include <sound/soc-dapm.h>
 34#include <sound/initval.h>
 35#include <sound/tlv.h>
 36#include <sound/hda_verbs.h>
 37
 38#include "rt715.h"
 39
 40static int rt715_index_write(struct regmap *regmap, unsigned int reg,
 41		unsigned int value)
 42{
 43	int ret;
 44	unsigned int addr = ((RT715_PRIV_INDEX_W_H) << 8) | reg;
 45
 46	ret = regmap_write(regmap, addr, value);
 47	if (ret < 0) {
 48		pr_err("Failed to set private value: %08x <= %04x %d\n", ret,
 49			addr, value);
 50	}
 51
 52	return ret;
 53}
 54
 55static void rt715_get_gain(struct rt715_priv *rt715, unsigned int addr_h,
 56				unsigned int addr_l, unsigned int val_h,
 57				unsigned int *r_val, unsigned int *l_val)
 58{
 59	int ret;
 60	/* R Channel */
 61	*r_val = (val_h << 8);
 62	ret = regmap_read(rt715->regmap, addr_l, r_val);
 63	if (ret < 0)
 64		pr_err("Failed to get R channel gain.\n");
 65
 66	/* L Channel */
 67	val_h |= 0x20;
 68	*l_val = (val_h << 8);
 69	ret = regmap_read(rt715->regmap, addr_h, l_val);
 70	if (ret < 0)
 71		pr_err("Failed to get L channel gain.\n");
 72}
 73
 74/* For Verb-Set Amplifier Gain (Verb ID = 3h) */
 75static int rt715_set_amp_gain_put(struct snd_kcontrol *kcontrol,
 76					struct snd_ctl_elem_value *ucontrol)
 77{
 78	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
 79	struct snd_soc_dapm_context *dapm =
 80		snd_soc_component_get_dapm(component);
 81	struct soc_mixer_control *mc =
 82		(struct soc_mixer_control *)kcontrol->private_value;
 83	struct rt715_priv *rt715 = snd_soc_component_get_drvdata(component);
 84	unsigned int addr_h, addr_l, val_h, val_ll, val_lr;
 85	unsigned int read_ll, read_rl;
 86	int i;
 87
 88	/* Can't use update bit function, so read the original value first */
 89	addr_h = mc->reg;
 90	addr_l = mc->rreg;
 91	if (mc->shift == RT715_DIR_OUT_SFT) /* output */
 92		val_h = 0x80;
 93	else /* input */
 94		val_h = 0x0;
 95
 96	rt715_get_gain(rt715, addr_h, addr_l, val_h, &read_rl, &read_ll);
 97
 98	/* L Channel */
 99	if (mc->invert) {
100		/* for mute */
101		val_ll = (mc->max - ucontrol->value.integer.value[0]) << 7;
102		/* keep gain */
103		read_ll = read_ll & 0x7f;
104		val_ll |= read_ll;
105	} else {
106		/* for gain */
107		val_ll = ((ucontrol->value.integer.value[0]) & 0x7f);
108		if (val_ll > mc->max)
109			val_ll = mc->max;
110		/* keep mute status */
111		read_ll = read_ll & 0x80;
112		val_ll |= read_ll;
113	}
114
115	/* R Channel */
116	if (mc->invert) {
117		regmap_write(rt715->regmap,
118			     RT715_SET_AUDIO_POWER_STATE, AC_PWRST_D0);
119		/* for mute */
120		val_lr = (mc->max - ucontrol->value.integer.value[1]) << 7;
121		/* keep gain */
122		read_rl = read_rl & 0x7f;
123		val_lr |= read_rl;
124	} else {
125		/* for gain */
126		val_lr = ((ucontrol->value.integer.value[1]) & 0x7f);
127		if (val_lr > mc->max)
128			val_lr = mc->max;
129		/* keep mute status */
130		read_rl = read_rl & 0x80;
131		val_lr |= read_rl;
132	}
133
134	for (i = 0; i < 3; i++) { /* retry 3 times at most */
135
136		if (val_ll == val_lr) {
137			/* Set both L/R channels at the same time */
138			val_h = (1 << mc->shift) | (3 << 4);
139			regmap_write(rt715->regmap, addr_h,
140				(val_h << 8 | val_ll));
141			regmap_write(rt715->regmap, addr_l,
142				(val_h << 8 | val_ll));
143		} else {
144			/* Lch*/
145			val_h = (1 << mc->shift) | (1 << 5);
146			regmap_write(rt715->regmap, addr_h,
147				(val_h << 8 | val_ll));
148			/* Rch */
149			val_h = (1 << mc->shift) | (1 << 4);
150			regmap_write(rt715->regmap, addr_l,
151				(val_h << 8 | val_lr));
152		}
153		/* check result */
154		if (mc->shift == RT715_DIR_OUT_SFT) /* output */
155			val_h = 0x80;
156		else /* input */
157			val_h = 0x0;
158
159		rt715_get_gain(rt715, addr_h, addr_l, val_h,
160			       &read_rl, &read_ll);
161		if (read_rl == val_lr && read_ll == val_ll)
162			break;
163	}
164	/* D0:power on state, D3: power saving mode */
165	if (dapm->bias_level <= SND_SOC_BIAS_STANDBY)
166		regmap_write(rt715->regmap,
167				RT715_SET_AUDIO_POWER_STATE, AC_PWRST_D3);
168	return 0;
169}
170
171static int rt715_set_amp_gain_get(struct snd_kcontrol *kcontrol,
172				  struct snd_ctl_elem_value *ucontrol)
173{
174	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
175	struct rt715_priv *rt715 = snd_soc_component_get_drvdata(component);
176	struct soc_mixer_control *mc =
177		(struct soc_mixer_control *)kcontrol->private_value;
178	unsigned int addr_h, addr_l, val_h;
179	unsigned int read_ll, read_rl;
180
181	addr_h = mc->reg;
182	addr_l = mc->rreg;
183	if (mc->shift == RT715_DIR_OUT_SFT) /* output */
184		val_h = 0x80;
185	else /* input */
186		val_h = 0x0;
187
188	rt715_get_gain(rt715, addr_h, addr_l, val_h, &read_rl, &read_ll);
189
190	if (mc->invert) {
191		/* for mute status */
192		read_ll = !((read_ll & 0x80) >> RT715_MUTE_SFT);
193		read_rl = !((read_rl & 0x80) >> RT715_MUTE_SFT);
194	} else {
195		/* for gain */
196		read_ll = read_ll & 0x7f;
197		read_rl = read_rl & 0x7f;
198	}
199	ucontrol->value.integer.value[0] = read_ll;
200	ucontrol->value.integer.value[1] = read_rl;
201
202	return 0;
203}
204
205static const DECLARE_TLV_DB_SCALE(in_vol_tlv, -1725, 75, 0);
206static const DECLARE_TLV_DB_SCALE(mic_vol_tlv, 0, 1000, 0);
207
208#define SOC_DOUBLE_R_EXT(xname, reg_left, reg_right, xshift, xmax, xinvert,\
209	 xhandler_get, xhandler_put) \
210{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \
211	.info = snd_soc_info_volsw, \
212	.get = xhandler_get, .put = xhandler_put, \
213	.private_value = SOC_DOUBLE_R_VALUE(reg_left, reg_right, xshift, \
214					    xmax, xinvert) }
215
216static const struct snd_kcontrol_new rt715_snd_controls[] = {
217	/* Capture switch */
218	SOC_DOUBLE_R_EXT("ADC 07 Capture Switch", RT715_SET_GAIN_MIC_ADC_H,
219			RT715_SET_GAIN_MIC_ADC_L, RT715_DIR_IN_SFT, 1, 1,
220			rt715_set_amp_gain_get, rt715_set_amp_gain_put),
221	SOC_DOUBLE_R_EXT("ADC 08 Capture Switch", RT715_SET_GAIN_LINE_ADC_H,
222			RT715_SET_GAIN_LINE_ADC_L, RT715_DIR_IN_SFT, 1, 1,
223			rt715_set_amp_gain_get, rt715_set_amp_gain_put),
224	SOC_DOUBLE_R_EXT("ADC 09 Capture Switch", RT715_SET_GAIN_MIX_ADC_H,
225			RT715_SET_GAIN_MIX_ADC_L, RT715_DIR_IN_SFT, 1, 1,
226			rt715_set_amp_gain_get, rt715_set_amp_gain_put),
227	SOC_DOUBLE_R_EXT("ADC 27 Capture Switch", RT715_SET_GAIN_MIX_ADC2_H,
228			RT715_SET_GAIN_MIX_ADC2_L, RT715_DIR_IN_SFT, 1, 1,
229			rt715_set_amp_gain_get, rt715_set_amp_gain_put),
230	/* Volume Control */
231	SOC_DOUBLE_R_EXT_TLV("ADC 07 Capture Volume", RT715_SET_GAIN_MIC_ADC_H,
232			RT715_SET_GAIN_MIC_ADC_L, RT715_DIR_IN_SFT, 0x3f, 0,
233			rt715_set_amp_gain_get, rt715_set_amp_gain_put,
234			in_vol_tlv),
235	SOC_DOUBLE_R_EXT_TLV("ADC 08 Capture Volume", RT715_SET_GAIN_LINE_ADC_H,
236			RT715_SET_GAIN_LINE_ADC_L, RT715_DIR_IN_SFT, 0x3f, 0,
237			rt715_set_amp_gain_get, rt715_set_amp_gain_put,
238			in_vol_tlv),
239	SOC_DOUBLE_R_EXT_TLV("ADC 09 Capture Volume", RT715_SET_GAIN_MIX_ADC_H,
240			RT715_SET_GAIN_MIX_ADC_L, RT715_DIR_IN_SFT, 0x3f, 0,
241			rt715_set_amp_gain_get, rt715_set_amp_gain_put,
242			in_vol_tlv),
243	SOC_DOUBLE_R_EXT_TLV("ADC 27 Capture Volume", RT715_SET_GAIN_MIX_ADC2_H,
244			RT715_SET_GAIN_MIX_ADC2_L, RT715_DIR_IN_SFT, 0x3f, 0,
245			rt715_set_amp_gain_get, rt715_set_amp_gain_put,
246			in_vol_tlv),
247	/* MIC Boost Control */
248	SOC_DOUBLE_R_EXT_TLV("DMIC1 Boost", RT715_SET_GAIN_DMIC1_H,
249			RT715_SET_GAIN_DMIC1_L, RT715_DIR_IN_SFT, 3, 0,
250			rt715_set_amp_gain_get, rt715_set_amp_gain_put,
251			mic_vol_tlv),
252	SOC_DOUBLE_R_EXT_TLV("DMIC2 Boost", RT715_SET_GAIN_DMIC2_H,
253			RT715_SET_GAIN_DMIC2_L, RT715_DIR_IN_SFT, 3, 0,
254			rt715_set_amp_gain_get, rt715_set_amp_gain_put,
255			mic_vol_tlv),
256	SOC_DOUBLE_R_EXT_TLV("DMIC3 Boost", RT715_SET_GAIN_DMIC3_H,
257			RT715_SET_GAIN_DMIC3_L, RT715_DIR_IN_SFT, 3, 0,
258			rt715_set_amp_gain_get, rt715_set_amp_gain_put,
259			mic_vol_tlv),
260	SOC_DOUBLE_R_EXT_TLV("DMIC4 Boost", RT715_SET_GAIN_DMIC4_H,
261			RT715_SET_GAIN_DMIC4_L, RT715_DIR_IN_SFT, 3, 0,
262			rt715_set_amp_gain_get, rt715_set_amp_gain_put,
263			mic_vol_tlv),
264	SOC_DOUBLE_R_EXT_TLV("MIC1 Boost", RT715_SET_GAIN_MIC1_H,
265			RT715_SET_GAIN_MIC1_L, RT715_DIR_IN_SFT, 3, 0,
266			rt715_set_amp_gain_get, rt715_set_amp_gain_put,
267			mic_vol_tlv),
268	SOC_DOUBLE_R_EXT_TLV("MIC2 Boost", RT715_SET_GAIN_MIC2_H,
269			RT715_SET_GAIN_MIC2_L, RT715_DIR_IN_SFT, 3, 0,
270			rt715_set_amp_gain_get, rt715_set_amp_gain_put,
271			mic_vol_tlv),
272	SOC_DOUBLE_R_EXT_TLV("LINE1 Boost", RT715_SET_GAIN_LINE1_H,
273			RT715_SET_GAIN_LINE1_L, RT715_DIR_IN_SFT, 3, 0,
274			rt715_set_amp_gain_get, rt715_set_amp_gain_put,
275			mic_vol_tlv),
276	SOC_DOUBLE_R_EXT_TLV("LINE2 Boost", RT715_SET_GAIN_LINE2_H,
277			RT715_SET_GAIN_LINE2_L, RT715_DIR_IN_SFT, 3, 0,
278			rt715_set_amp_gain_get, rt715_set_amp_gain_put,
279			mic_vol_tlv),
280};
281
282static int rt715_mux_get(struct snd_kcontrol *kcontrol,
283			struct snd_ctl_elem_value *ucontrol)
284{
285	struct snd_soc_component *component =
286		snd_soc_dapm_kcontrol_component(kcontrol);
287	struct rt715_priv *rt715 = snd_soc_component_get_drvdata(component);
288	struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
289	unsigned int reg, val;
290	int ret;
291
292	/* nid = e->reg, vid = 0xf01 */
293	reg = RT715_VERB_SET_CONNECT_SEL | e->reg;
294	ret = regmap_read(rt715->regmap, reg, &val);
295	if (ret < 0) {
296		dev_err(component->dev, "%s: sdw read failed: %d\n",
297			__func__, ret);
298		return ret;
299	}
300
301	/*
302	 * The first two indices of ADC Mux 24/25 are routed to the same
303	 * hardware source. ie, ADC Mux 24 0/1 will both connect to MIC2.
304	 * To have a unique set of inputs, we skip the index1 of the muxes.
305	 */
306	if ((e->reg == RT715_MUX_IN3 || e->reg == RT715_MUX_IN4) && (val > 0))
307		val -= 1;
308	ucontrol->value.enumerated.item[0] = val;
309
310	return 0;
311}
312
313static int rt715_mux_put(struct snd_kcontrol *kcontrol,
314			struct snd_ctl_elem_value *ucontrol)
315{
316	struct snd_soc_component *component =
317		snd_soc_dapm_kcontrol_component(kcontrol);
318	struct snd_soc_dapm_context *dapm =
319				snd_soc_dapm_kcontrol_dapm(kcontrol);
320	struct rt715_priv *rt715 = snd_soc_component_get_drvdata(component);
321	struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
322	unsigned int *item = ucontrol->value.enumerated.item;
323	unsigned int val, val2 = 0, change, reg;
324	int ret;
325
326	if (item[0] >= e->items)
327		return -EINVAL;
328
329	/* Verb ID = 0x701h, nid = e->reg */
330	val = snd_soc_enum_item_to_val(e, item[0]) << e->shift_l;
331
332	reg = RT715_VERB_SET_CONNECT_SEL | e->reg;
333	ret = regmap_read(rt715->regmap, reg, &val2);
334	if (ret < 0) {
335		dev_err(component->dev, "%s: sdw read failed: %d\n",
336			__func__, ret);
337		return ret;
338	}
339
340	if (val == val2)
341		change = 0;
342	else
343		change = 1;
344
345	if (change) {
346		reg = RT715_VERB_SET_CONNECT_SEL | e->reg;
347		regmap_write(rt715->regmap, reg, val);
348	}
349
350	snd_soc_dapm_mux_update_power(dapm, kcontrol,
351						item[0], e, NULL);
352
353	return change;
354}
355
356static const char * const adc_22_23_mux_text[] = {
357	"MIC1",
358	"MIC2",
359	"LINE1",
360	"LINE2",
361	"DMIC1",
362	"DMIC2",
363	"DMIC3",
364	"DMIC4",
365};
366
367/*
368 * Due to mux design for nid 24 (MUX_IN3)/25 (MUX_IN4), connection index 0 and
369 * 1 will be connected to the same dmic source, therefore we skip index 1 to
370 * avoid misunderstanding on usage of dapm routing.
371 */
372static const unsigned int rt715_adc_24_25_values[] = {
373	0,
374	2,
375	3,
376	4,
377	5,
378};
379
380static const char * const adc_24_mux_text[] = {
381	"MIC2",
382	"DMIC1",
383	"DMIC2",
384	"DMIC3",
385	"DMIC4",
386};
387
388static const char * const adc_25_mux_text[] = {
389	"MIC1",
390	"DMIC1",
391	"DMIC2",
392	"DMIC3",
393	"DMIC4",
394};
395
396static SOC_ENUM_SINGLE_DECL(
397	rt715_adc22_enum, RT715_MUX_IN1, 0, adc_22_23_mux_text);
398
399static SOC_ENUM_SINGLE_DECL(
400	rt715_adc23_enum, RT715_MUX_IN2, 0, adc_22_23_mux_text);
401
402static SOC_VALUE_ENUM_SINGLE_DECL(rt715_adc24_enum,
403	RT715_MUX_IN3, 0, 0xf,
404	adc_24_mux_text, rt715_adc_24_25_values);
405
406static SOC_VALUE_ENUM_SINGLE_DECL(rt715_adc25_enum,
407	RT715_MUX_IN4, 0, 0xf,
408	adc_25_mux_text, rt715_adc_24_25_values);
409
410static const struct snd_kcontrol_new rt715_adc22_mux =
411	SOC_DAPM_ENUM_EXT("ADC 22 Mux", rt715_adc22_enum,
412			rt715_mux_get, rt715_mux_put);
413
414static const struct snd_kcontrol_new rt715_adc23_mux =
415	SOC_DAPM_ENUM_EXT("ADC 23 Mux", rt715_adc23_enum,
416			rt715_mux_get, rt715_mux_put);
417
418static const struct snd_kcontrol_new rt715_adc24_mux =
419	SOC_DAPM_ENUM_EXT("ADC 24 Mux", rt715_adc24_enum,
420			rt715_mux_get, rt715_mux_put);
421
422static const struct snd_kcontrol_new rt715_adc25_mux =
423	SOC_DAPM_ENUM_EXT("ADC 25 Mux", rt715_adc25_enum,
424			rt715_mux_get, rt715_mux_put);
425
426static const struct snd_soc_dapm_widget rt715_dapm_widgets[] = {
427	SND_SOC_DAPM_INPUT("DMIC1"),
428	SND_SOC_DAPM_INPUT("DMIC2"),
429	SND_SOC_DAPM_INPUT("DMIC3"),
430	SND_SOC_DAPM_INPUT("DMIC4"),
431	SND_SOC_DAPM_INPUT("MIC1"),
432	SND_SOC_DAPM_INPUT("MIC2"),
433	SND_SOC_DAPM_INPUT("LINE1"),
434	SND_SOC_DAPM_INPUT("LINE2"),
435	SND_SOC_DAPM_ADC("ADC 07", NULL, RT715_SET_STREAMID_MIC_ADC, 4, 0),
436	SND_SOC_DAPM_ADC("ADC 08", NULL, RT715_SET_STREAMID_LINE_ADC, 4, 0),
437	SND_SOC_DAPM_ADC("ADC 09", NULL, RT715_SET_STREAMID_MIX_ADC, 4, 0),
438	SND_SOC_DAPM_ADC("ADC 27", NULL, RT715_SET_STREAMID_MIX_ADC2, 4, 0),
439	SND_SOC_DAPM_MUX("ADC 22 Mux", SND_SOC_NOPM, 0, 0,
440		&rt715_adc22_mux),
441	SND_SOC_DAPM_MUX("ADC 23 Mux", SND_SOC_NOPM, 0, 0,
442		&rt715_adc23_mux),
443	SND_SOC_DAPM_MUX("ADC 24 Mux", SND_SOC_NOPM, 0, 0,
444		&rt715_adc24_mux),
445	SND_SOC_DAPM_MUX("ADC 25 Mux", SND_SOC_NOPM, 0, 0,
446		&rt715_adc25_mux),
447	SND_SOC_DAPM_AIF_OUT("DP4TX", "DP4 Capture", 0, SND_SOC_NOPM, 0, 0),
448	SND_SOC_DAPM_AIF_OUT("DP6TX", "DP6 Capture", 0, SND_SOC_NOPM, 0, 0),
449};
450
451static const struct snd_soc_dapm_route rt715_audio_map[] = {
452	{"DP6TX", NULL, "ADC 09"},
453	{"DP6TX", NULL, "ADC 08"},
454	{"DP4TX", NULL, "ADC 07"},
455	{"DP4TX", NULL, "ADC 27"},
456	{"ADC 09", NULL, "ADC 22 Mux"},
457	{"ADC 08", NULL, "ADC 23 Mux"},
458	{"ADC 07", NULL, "ADC 24 Mux"},
459	{"ADC 27", NULL, "ADC 25 Mux"},
460	{"ADC 22 Mux", "MIC1", "MIC1"},
461	{"ADC 22 Mux", "MIC2", "MIC2"},
462	{"ADC 22 Mux", "LINE1", "LINE1"},
463	{"ADC 22 Mux", "LINE2", "LINE2"},
464	{"ADC 22 Mux", "DMIC1", "DMIC1"},
465	{"ADC 22 Mux", "DMIC2", "DMIC2"},
466	{"ADC 22 Mux", "DMIC3", "DMIC3"},
467	{"ADC 22 Mux", "DMIC4", "DMIC4"},
468	{"ADC 23 Mux", "MIC1", "MIC1"},
469	{"ADC 23 Mux", "MIC2", "MIC2"},
470	{"ADC 23 Mux", "LINE1", "LINE1"},
471	{"ADC 23 Mux", "LINE2", "LINE2"},
472	{"ADC 23 Mux", "DMIC1", "DMIC1"},
473	{"ADC 23 Mux", "DMIC2", "DMIC2"},
474	{"ADC 23 Mux", "DMIC3", "DMIC3"},
475	{"ADC 23 Mux", "DMIC4", "DMIC4"},
476	{"ADC 24 Mux", "MIC2", "MIC2"},
477	{"ADC 24 Mux", "DMIC1", "DMIC1"},
478	{"ADC 24 Mux", "DMIC2", "DMIC2"},
479	{"ADC 24 Mux", "DMIC3", "DMIC3"},
480	{"ADC 24 Mux", "DMIC4", "DMIC4"},
481	{"ADC 25 Mux", "MIC1", "MIC1"},
482	{"ADC 25 Mux", "DMIC1", "DMIC1"},
483	{"ADC 25 Mux", "DMIC2", "DMIC2"},
484	{"ADC 25 Mux", "DMIC3", "DMIC3"},
485	{"ADC 25 Mux", "DMIC4", "DMIC4"},
486};
487
488static int rt715_set_bias_level(struct snd_soc_component *component,
489				enum snd_soc_bias_level level)
490{
491	struct snd_soc_dapm_context *dapm =
492		snd_soc_component_get_dapm(component);
493	struct rt715_priv *rt715 = snd_soc_component_get_drvdata(component);
494
495	switch (level) {
496	case SND_SOC_BIAS_PREPARE:
497		if (dapm->bias_level == SND_SOC_BIAS_STANDBY) {
498			regmap_write(rt715->regmap,
499						RT715_SET_AUDIO_POWER_STATE,
500						AC_PWRST_D0);
501		}
502		break;
503
504	case SND_SOC_BIAS_STANDBY:
505		regmap_write(rt715->regmap,
506					RT715_SET_AUDIO_POWER_STATE,
507					AC_PWRST_D3);
508		break;
509
510	default:
511		break;
512	}
513	dapm->bias_level = level;
514	return 0;
515}
516
517static const struct snd_soc_component_driver soc_codec_dev_rt715 = {
518	.set_bias_level = rt715_set_bias_level,
519	.controls = rt715_snd_controls,
520	.num_controls = ARRAY_SIZE(rt715_snd_controls),
521	.dapm_widgets = rt715_dapm_widgets,
522	.num_dapm_widgets = ARRAY_SIZE(rt715_dapm_widgets),
523	.dapm_routes = rt715_audio_map,
524	.num_dapm_routes = ARRAY_SIZE(rt715_audio_map),
525};
526
527static int rt715_set_sdw_stream(struct snd_soc_dai *dai, void *sdw_stream,
528				int direction)
529{
530
531	struct sdw_stream_data *stream;
532
533	if (!sdw_stream)
534		return 0;
535
536	stream = kzalloc(sizeof(*stream), GFP_KERNEL);
537	if (!stream)
538		return -ENOMEM;
539
540	stream->sdw_stream = (struct sdw_stream_runtime *)sdw_stream;
541
542	/* Use tx_mask or rx_mask to configure stream tag and set dma_data */
543	if (direction == SNDRV_PCM_STREAM_PLAYBACK)
544		dai->playback_dma_data = stream;
545	else
546		dai->capture_dma_data = stream;
547
548	return 0;
549}
550
551static void rt715_shutdown(struct snd_pcm_substream *substream,
552				struct snd_soc_dai *dai)
553
554{
555	struct sdw_stream_data *stream;
556
557	stream = snd_soc_dai_get_dma_data(dai, substream);
558	snd_soc_dai_set_dma_data(dai, substream, NULL);
559	kfree(stream);
560}
561
562static int rt715_pcm_hw_params(struct snd_pcm_substream *substream,
563				struct snd_pcm_hw_params *params,
564				struct snd_soc_dai *dai)
565{
566	struct snd_soc_component *component = dai->component;
567	struct rt715_priv *rt715 = snd_soc_component_get_drvdata(component);
568	struct sdw_stream_config stream_config;
569	struct sdw_port_config port_config;
570	enum sdw_data_direction direction;
571	struct sdw_stream_data *stream;
572	int retval, port, num_channels;
573	unsigned int val = 0;
574
575	stream = snd_soc_dai_get_dma_data(dai, substream);
576
577	if (!stream)
578		return -EINVAL;
579
580	if (!rt715->slave)
581		return -EINVAL;
582
583	switch (dai->id) {
584	case RT715_AIF1:
585		direction = SDW_DATA_DIR_TX;
586		port = 6;
587		rt715_index_write(rt715->regmap, RT715_SDW_INPUT_SEL, 0xa500);
588		break;
589	case RT715_AIF2:
590		direction = SDW_DATA_DIR_TX;
591		port = 4;
592		rt715_index_write(rt715->regmap, RT715_SDW_INPUT_SEL, 0xa000);
593		break;
594	default:
595		dev_err(component->dev, "Invalid DAI id %d\n", dai->id);
596		return -EINVAL;
597	}
598
599	stream_config.frame_rate =  params_rate(params);
600	stream_config.ch_count = params_channels(params);
601	stream_config.bps = snd_pcm_format_width(params_format(params));
602	stream_config.direction = direction;
603
604	num_channels = params_channels(params);
605	port_config.ch_mask = (1 << (num_channels)) - 1;
606	port_config.num = port;
607
608	retval = sdw_stream_add_slave(rt715->slave, &stream_config,
609					&port_config, 1, stream->sdw_stream);
610	if (retval) {
611		dev_err(dai->dev, "Unable to configure port\n");
612		return retval;
613	}
614
615	switch (params_rate(params)) {
616	/* bit 14 0:48K 1:44.1K */
617	/* bit 15 Stream Type 0:PCM 1:Non-PCM, should always be PCM */
618	case 44100:
619		val |= 0x40 << 8;
620		break;
621	case 48000:
622		val |= 0x0 << 8;
623		break;
624	default:
625		dev_err(component->dev, "Unsupported sample rate %d\n",
626			params_rate(params));
627		return -EINVAL;
628	}
629
630	if (params_channels(params) <= 16) {
631		/* bit 3:0 Number of Channel */
632		val |= (params_channels(params) - 1);
633	} else {
634		dev_err(component->dev, "Unsupported channels %d\n",
635			params_channels(params));
636		return -EINVAL;
637	}
638
639	switch (params_width(params)) {
640	/* bit 6:4 Bits per Sample */
641	case 8:
642		break;
643	case 16:
644		val |= (0x1 << 4);
645		break;
646	case 20:
647		val |= (0x2 << 4);
648		break;
649	case 24:
650		val |= (0x3 << 4);
651		break;
652	case 32:
653		val |= (0x4 << 4);
654		break;
655	default:
656		return -EINVAL;
657	}
658
659	regmap_write(rt715->regmap, RT715_MIC_ADC_FORMAT_H, val);
660	regmap_write(rt715->regmap, RT715_MIC_LINE_FORMAT_H, val);
661	regmap_write(rt715->regmap, RT715_MIX_ADC_FORMAT_H, val);
662	regmap_write(rt715->regmap, RT715_MIX_ADC2_FORMAT_H, val);
663
664	return retval;
665}
666
667static int rt715_pcm_hw_free(struct snd_pcm_substream *substream,
668				struct snd_soc_dai *dai)
669{
670	struct snd_soc_component *component = dai->component;
671	struct rt715_priv *rt715 = snd_soc_component_get_drvdata(component);
672	struct sdw_stream_data *stream =
673		snd_soc_dai_get_dma_data(dai, substream);
674
675	if (!rt715->slave)
676		return -EINVAL;
677
678	sdw_stream_remove_slave(rt715->slave, stream->sdw_stream);
679	return 0;
680}
681
682#define RT715_STEREO_RATES (SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000)
683#define RT715_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \
684			SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S8)
685
686static struct snd_soc_dai_ops rt715_ops = {
687	.hw_params	= rt715_pcm_hw_params,
688	.hw_free	= rt715_pcm_hw_free,
689	.set_sdw_stream	= rt715_set_sdw_stream,
690	.shutdown	= rt715_shutdown,
691};
692
693static struct snd_soc_dai_driver rt715_dai[] = {
694	{
695		.name = "rt715-aif1",
696		.id = RT715_AIF1,
697		.capture = {
698			.stream_name = "DP6 Capture",
699			.channels_min = 1,
700			.channels_max = 2,
701			.rates = RT715_STEREO_RATES,
702			.formats = RT715_FORMATS,
703		},
704		.ops = &rt715_ops,
705	},
706	{
707		.name = "rt715-aif2",
708		.id = RT715_AIF2,
709		.capture = {
710			.stream_name = "DP4 Capture",
711			.channels_min = 1,
712			.channels_max = 2,
713			.rates = RT715_STEREO_RATES,
714			.formats = RT715_FORMATS,
715		},
716		.ops = &rt715_ops,
717	},
718};
719
720/* Bus clock frequency */
721#define RT715_CLK_FREQ_9600000HZ 9600000
722#define RT715_CLK_FREQ_12000000HZ 12000000
723#define RT715_CLK_FREQ_6000000HZ 6000000
724#define RT715_CLK_FREQ_4800000HZ 4800000
725#define RT715_CLK_FREQ_2400000HZ 2400000
726#define RT715_CLK_FREQ_12288000HZ 12288000
727
728int rt715_clock_config(struct device *dev)
729{
730	struct rt715_priv *rt715 = dev_get_drvdata(dev);
731	unsigned int clk_freq, value;
732
733	clk_freq = (rt715->params.curr_dr_freq >> 1);
734
735	switch (clk_freq) {
736	case RT715_CLK_FREQ_12000000HZ:
737		value = 0x0;
738		break;
739	case RT715_CLK_FREQ_6000000HZ:
740		value = 0x1;
741		break;
742	case RT715_CLK_FREQ_9600000HZ:
743		value = 0x2;
744		break;
745	case RT715_CLK_FREQ_4800000HZ:
746		value = 0x3;
747		break;
748	case RT715_CLK_FREQ_2400000HZ:
749		value = 0x4;
750		break;
751	case RT715_CLK_FREQ_12288000HZ:
752		value = 0x5;
753		break;
754	default:
755		return -EINVAL;
756	}
757
758	regmap_write(rt715->regmap, 0xe0, value);
759	regmap_write(rt715->regmap, 0xf0, value);
760
761	return 0;
762}
763
764int rt715_init(struct device *dev, struct regmap *sdw_regmap,
765	struct regmap *regmap, struct sdw_slave *slave)
766{
767	struct rt715_priv *rt715;
768	int ret;
769
770	rt715 = devm_kzalloc(dev, sizeof(*rt715), GFP_KERNEL);
771	if (!rt715)
772		return -ENOMEM;
773
774	dev_set_drvdata(dev, rt715);
775	rt715->slave = slave;
776	rt715->regmap = regmap;
777	rt715->sdw_regmap = sdw_regmap;
778
779	/*
780	 * Mark hw_init to false
781	 * HW init will be performed when device reports present
782	 */
783	rt715->hw_init = false;
784	rt715->first_hw_init = false;
785
786	ret = devm_snd_soc_register_component(dev,
787						&soc_codec_dev_rt715,
788						rt715_dai,
789						ARRAY_SIZE(rt715_dai));
790
791	return ret;
792}
793
794int rt715_io_init(struct device *dev, struct sdw_slave *slave)
795{
796	struct rt715_priv *rt715 = dev_get_drvdata(dev);
797
798	if (rt715->hw_init)
799		return 0;
800
801	/*
802	 * PM runtime is only enabled when a Slave reports as Attached
803	 */
804	if (!rt715->first_hw_init) {
805		/* set autosuspend parameters */
806		pm_runtime_set_autosuspend_delay(&slave->dev, 3000);
807		pm_runtime_use_autosuspend(&slave->dev);
808
809		/* update count of parent 'active' children */
810		pm_runtime_set_active(&slave->dev);
811
812		/* make sure the device does not suspend immediately */
813		pm_runtime_mark_last_busy(&slave->dev);
814
815		pm_runtime_enable(&slave->dev);
816	}
817
818	pm_runtime_get_noresume(&slave->dev);
819
820	/* Mute nid=08h/09h */
821	regmap_write(rt715->regmap, RT715_SET_GAIN_LINE_ADC_H, 0xb080);
822	regmap_write(rt715->regmap, RT715_SET_GAIN_MIX_ADC_H, 0xb080);
823	/* Mute nid=07h/27h */
824	regmap_write(rt715->regmap, RT715_SET_GAIN_MIC_ADC_H, 0xb080);
825	regmap_write(rt715->regmap, RT715_SET_GAIN_MIX_ADC2_H, 0xb080);
826
827	/* Set Pin Widget */
828	regmap_write(rt715->regmap, RT715_SET_PIN_DMIC1, 0x20);
829	regmap_write(rt715->regmap, RT715_SET_PIN_DMIC2, 0x20);
830	regmap_write(rt715->regmap, RT715_SET_PIN_DMIC3, 0x20);
831	regmap_write(rt715->regmap, RT715_SET_PIN_DMIC4, 0x20);
832	/* Set Converter Stream */
833	regmap_write(rt715->regmap, RT715_SET_STREAMID_LINE_ADC, 0x10);
834	regmap_write(rt715->regmap, RT715_SET_STREAMID_MIX_ADC, 0x10);
835	regmap_write(rt715->regmap, RT715_SET_STREAMID_MIC_ADC, 0x10);
836	regmap_write(rt715->regmap, RT715_SET_STREAMID_MIX_ADC2, 0x10);
837	/* Set Configuration Default */
838	regmap_write(rt715->regmap, RT715_SET_DMIC1_CONFIG_DEFAULT1, 0xd0);
839	regmap_write(rt715->regmap, RT715_SET_DMIC1_CONFIG_DEFAULT2, 0x11);
840	regmap_write(rt715->regmap, RT715_SET_DMIC1_CONFIG_DEFAULT3, 0xa1);
841	regmap_write(rt715->regmap, RT715_SET_DMIC1_CONFIG_DEFAULT4, 0x81);
842	regmap_write(rt715->regmap, RT715_SET_DMIC2_CONFIG_DEFAULT1, 0xd1);
843	regmap_write(rt715->regmap, RT715_SET_DMIC2_CONFIG_DEFAULT2, 0x11);
844	regmap_write(rt715->regmap, RT715_SET_DMIC2_CONFIG_DEFAULT3, 0xa1);
845	regmap_write(rt715->regmap, RT715_SET_DMIC2_CONFIG_DEFAULT4, 0x81);
846	regmap_write(rt715->regmap, RT715_SET_DMIC3_CONFIG_DEFAULT1, 0xd0);
847	regmap_write(rt715->regmap, RT715_SET_DMIC3_CONFIG_DEFAULT2, 0x11);
848	regmap_write(rt715->regmap, RT715_SET_DMIC3_CONFIG_DEFAULT3, 0xa1);
849	regmap_write(rt715->regmap, RT715_SET_DMIC3_CONFIG_DEFAULT4, 0x81);
850	regmap_write(rt715->regmap, RT715_SET_DMIC4_CONFIG_DEFAULT1, 0xd1);
851	regmap_write(rt715->regmap, RT715_SET_DMIC4_CONFIG_DEFAULT2, 0x11);
852	regmap_write(rt715->regmap, RT715_SET_DMIC4_CONFIG_DEFAULT3, 0xa1);
853	regmap_write(rt715->regmap, RT715_SET_DMIC4_CONFIG_DEFAULT4, 0x81);
854
855	/* Finish Initial Settings, set power to D3 */
856	regmap_write(rt715->regmap, RT715_SET_AUDIO_POWER_STATE, AC_PWRST_D3);
857
858	if (rt715->first_hw_init)
859		regcache_mark_dirty(rt715->regmap);
860	else
861		rt715->first_hw_init = true;
862
863	/* Mark Slave initialization complete */
864	rt715->hw_init = true;
865
866	pm_runtime_mark_last_busy(&slave->dev);
867	pm_runtime_put_autosuspend(&slave->dev);
868
869	return 0;
870}
871
872MODULE_DESCRIPTION("ASoC rt715 driver");
873MODULE_DESCRIPTION("ASoC rt715 driver SDW");
874MODULE_AUTHOR("Jack Yu <jack.yu@realtek.com>");
875MODULE_LICENSE("GPL v2");