1 // SPDX-License-Identifier: GPL-2.0-only
2 //
3 // HDA audio driver for Cirrus Logic CS35L56 smart amp
4 //
5 // Copyright (C) 2023 Cirrus Logic, Inc. and
6 //                    Cirrus Logic International Semiconductor Ltd.
7 //
8 
9 #include <linux/acpi.h>
10 #include <linux/debugfs.h>
11 #include <linux/gpio/consumer.h>
12 #include <linux/module.h>
13 #include <linux/pm_runtime.h>
14 #include <linux/regmap.h>
15 #include <linux/slab.h>
16 #include <sound/core.h>
17 #include <sound/cs-amp-lib.h>
18 #include <sound/hda_codec.h>
19 #include <sound/tlv.h>
20 #include "cirrus_scodec.h"
21 #include "cs35l56_hda.h"
22 #include "hda_component.h"
23 #include "hda_cs_dsp_ctl.h"
24 #include "hda_generic.h"
25 
26  /*
27   * The cs35l56_hda_dai_config[] reg sequence configures the device as
28   *  ASP1_BCLK_FREQ = 3.072 MHz
29   *  ASP1_RX_WIDTH = 32 cycles per slot, ASP1_TX_WIDTH = 32 cycles per slot, ASP1_FMT = I2S
30   *  ASP1_DOUT_HIZ_CONTROL = Hi-Z during unused timeslots
31   *  ASP1_RX_WL = 24 bits per sample
32   *  ASP1_TX_WL = 24 bits per sample
33   *  ASP1_RXn_EN 1..3 and ASP1_TXn_EN 1..4 disabled
34   *
35   * Override any Windows-specific mixer settings applied by the firmware.
36   */
37 static const struct reg_sequence cs35l56_hda_dai_config[] = {
38 	{ CS35L56_ASP1_CONTROL1,	0x00000021 },
39 	{ CS35L56_ASP1_CONTROL2,	0x20200200 },
40 	{ CS35L56_ASP1_CONTROL3,	0x00000003 },
41 	{ CS35L56_ASP1_FRAME_CONTROL1,	0x03020100 },
42 	{ CS35L56_ASP1_FRAME_CONTROL5,	0x00020100 },
43 	{ CS35L56_ASP1_DATA_CONTROL5,	0x00000018 },
44 	{ CS35L56_ASP1_DATA_CONTROL1,	0x00000018 },
45 	{ CS35L56_ASP1_ENABLES1,	0x00000000 },
46 	{ CS35L56_ASP1TX1_INPUT,	0x00000018 },
47 	{ CS35L56_ASP1TX2_INPUT,	0x00000019 },
48 	{ CS35L56_ASP1TX3_INPUT,	0x00000020 },
49 	{ CS35L56_ASP1TX4_INPUT,	0x00000028 },
50 
51 };
52 
cs35l56_hda_wait_dsp_ready(struct cs35l56_hda * cs35l56)53 static void cs35l56_hda_wait_dsp_ready(struct cs35l56_hda *cs35l56)
54 {
55 	/* Wait for patching to complete */
56 	flush_work(&cs35l56->dsp_work);
57 }
58 
cs35l56_hda_play(struct cs35l56_hda * cs35l56)59 static void cs35l56_hda_play(struct cs35l56_hda *cs35l56)
60 {
61 	unsigned int val;
62 	int ret;
63 
64 	cs35l56_hda_wait_dsp_ready(cs35l56);
65 
66 	pm_runtime_get_sync(cs35l56->base.dev);
67 	ret = cs35l56_mbox_send(&cs35l56->base, CS35L56_MBOX_CMD_AUDIO_PLAY);
68 	if (ret == 0) {
69 		/* Wait for firmware to enter PS0 power state */
70 		ret = regmap_read_poll_timeout(cs35l56->base.regmap,
71 					       CS35L56_TRANSDUCER_ACTUAL_PS,
72 					       val, (val == CS35L56_PS0),
73 					       CS35L56_PS0_POLL_US,
74 					       CS35L56_PS0_TIMEOUT_US);
75 		if (ret)
76 			dev_warn(cs35l56->base.dev, "PS0 wait failed: %d\n", ret);
77 	}
78 	regmap_set_bits(cs35l56->base.regmap, CS35L56_ASP1_ENABLES1,
79 			BIT(CS35L56_ASP_RX1_EN_SHIFT) | BIT(CS35L56_ASP_RX2_EN_SHIFT) |
80 			cs35l56->asp_tx_mask);
81 	cs35l56->playing = true;
82 }
83 
cs35l56_hda_pause(struct cs35l56_hda * cs35l56)84 static void cs35l56_hda_pause(struct cs35l56_hda *cs35l56)
85 {
86 	cs35l56->playing = false;
87 	cs35l56_mbox_send(&cs35l56->base, CS35L56_MBOX_CMD_AUDIO_PAUSE);
88 	regmap_clear_bits(cs35l56->base.regmap, CS35L56_ASP1_ENABLES1,
89 			  BIT(CS35L56_ASP_RX1_EN_SHIFT) | BIT(CS35L56_ASP_RX2_EN_SHIFT) |
90 			  BIT(CS35L56_ASP_TX1_EN_SHIFT) | BIT(CS35L56_ASP_TX2_EN_SHIFT) |
91 			  BIT(CS35L56_ASP_TX3_EN_SHIFT) | BIT(CS35L56_ASP_TX4_EN_SHIFT));
92 
93 	pm_runtime_mark_last_busy(cs35l56->base.dev);
94 	pm_runtime_put_autosuspend(cs35l56->base.dev);
95 }
96 
cs35l56_hda_playback_hook(struct device * dev,int action)97 static void cs35l56_hda_playback_hook(struct device *dev, int action)
98 {
99 	struct cs35l56_hda *cs35l56 = dev_get_drvdata(dev);
100 
101 	dev_dbg(cs35l56->base.dev, "%s()%d: action: %d\n", __func__, __LINE__, action);
102 
103 	switch (action) {
104 	case HDA_GEN_PCM_ACT_PREPARE:
105 		if (cs35l56->playing)
106 			break;
107 
108 		/* If we're suspended: flag that resume should start playback */
109 		if (cs35l56->suspended) {
110 			cs35l56->playing = true;
111 			break;
112 		}
113 
114 		cs35l56_hda_play(cs35l56);
115 		break;
116 	case HDA_GEN_PCM_ACT_CLEANUP:
117 		if (!cs35l56->playing)
118 			break;
119 
120 		cs35l56_hda_pause(cs35l56);
121 		break;
122 	default:
123 		break;
124 	}
125 }
126 
cs35l56_hda_runtime_suspend(struct device * dev)127 static int cs35l56_hda_runtime_suspend(struct device *dev)
128 {
129 	struct cs35l56_hda *cs35l56 = dev_get_drvdata(dev);
130 
131 	if (cs35l56->cs_dsp.booted)
132 		cs_dsp_stop(&cs35l56->cs_dsp);
133 
134 	return cs35l56_runtime_suspend_common(&cs35l56->base);
135 }
136 
cs35l56_hda_runtime_resume(struct device * dev)137 static int cs35l56_hda_runtime_resume(struct device *dev)
138 {
139 	struct cs35l56_hda *cs35l56 = dev_get_drvdata(dev);
140 	int ret;
141 
142 	ret = cs35l56_runtime_resume_common(&cs35l56->base, false);
143 	if (ret < 0)
144 		return ret;
145 
146 	if (cs35l56->cs_dsp.booted) {
147 		ret = cs_dsp_run(&cs35l56->cs_dsp);
148 		if (ret) {
149 			dev_dbg(cs35l56->base.dev, "%s: cs_dsp_run ret %d\n", __func__, ret);
150 			goto err;
151 		}
152 	}
153 
154 	ret = cs35l56_force_sync_asp1_registers_from_cache(&cs35l56->base);
155 	if (ret)
156 		goto err;
157 
158 	return 0;
159 
160 err:
161 	cs35l56_mbox_send(&cs35l56->base, CS35L56_MBOX_CMD_ALLOW_AUTO_HIBERNATE);
162 	regmap_write(cs35l56->base.regmap, CS35L56_DSP_VIRTUAL1_MBOX_1,
163 		     CS35L56_MBOX_CMD_HIBERNATE_NOW);
164 
165 	regcache_cache_only(cs35l56->base.regmap, true);
166 
167 	return ret;
168 }
169 
cs35l56_hda_mixer_info(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_info * uinfo)170 static int cs35l56_hda_mixer_info(struct snd_kcontrol *kcontrol,
171 				  struct snd_ctl_elem_info *uinfo)
172 {
173 	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
174 	uinfo->count = 1;
175 	uinfo->value.enumerated.items = CS35L56_NUM_INPUT_SRC;
176 	if (uinfo->value.enumerated.item >= CS35L56_NUM_INPUT_SRC)
177 		uinfo->value.enumerated.item = CS35L56_NUM_INPUT_SRC - 1;
178 	strscpy(uinfo->value.enumerated.name, cs35l56_tx_input_texts[uinfo->value.enumerated.item],
179 		sizeof(uinfo->value.enumerated.name));
180 
181 	return 0;
182 }
183 
cs35l56_hda_mixer_get(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)184 static int cs35l56_hda_mixer_get(struct snd_kcontrol *kcontrol,
185 				 struct snd_ctl_elem_value *ucontrol)
186 {
187 	struct cs35l56_hda *cs35l56 = (struct cs35l56_hda *)kcontrol->private_data;
188 	unsigned int reg_val;
189 	int i;
190 
191 	cs35l56_hda_wait_dsp_ready(cs35l56);
192 
193 	regmap_read(cs35l56->base.regmap, kcontrol->private_value, &reg_val);
194 	reg_val &= CS35L56_ASP_TXn_SRC_MASK;
195 
196 	for (i = 0; i < CS35L56_NUM_INPUT_SRC; ++i) {
197 		if (cs35l56_tx_input_values[i] == reg_val) {
198 			ucontrol->value.enumerated.item[0] = i;
199 			break;
200 		}
201 	}
202 
203 	return 0;
204 }
205 
cs35l56_hda_mixer_put(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)206 static int cs35l56_hda_mixer_put(struct snd_kcontrol *kcontrol,
207 				 struct snd_ctl_elem_value *ucontrol)
208 {
209 	struct cs35l56_hda *cs35l56 = (struct cs35l56_hda *)kcontrol->private_data;
210 	unsigned int item = ucontrol->value.enumerated.item[0];
211 	bool changed;
212 
213 	if (item >= CS35L56_NUM_INPUT_SRC)
214 		return -EINVAL;
215 
216 	cs35l56_hda_wait_dsp_ready(cs35l56);
217 
218 	regmap_update_bits_check(cs35l56->base.regmap, kcontrol->private_value,
219 				 CS35L56_INPUT_MASK, cs35l56_tx_input_values[item],
220 				 &changed);
221 
222 	return changed;
223 }
224 
cs35l56_hda_posture_info(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_info * uinfo)225 static int cs35l56_hda_posture_info(struct snd_kcontrol *kcontrol,
226 				    struct snd_ctl_elem_info *uinfo)
227 {
228 	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
229 	uinfo->count = 1;
230 	uinfo->value.integer.min = CS35L56_MAIN_POSTURE_MIN;
231 	uinfo->value.integer.max = CS35L56_MAIN_POSTURE_MAX;
232 	return 0;
233 }
234 
cs35l56_hda_posture_get(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)235 static int cs35l56_hda_posture_get(struct snd_kcontrol *kcontrol,
236 				   struct snd_ctl_elem_value *ucontrol)
237 {
238 	struct cs35l56_hda *cs35l56 = (struct cs35l56_hda *)kcontrol->private_data;
239 	unsigned int pos;
240 	int ret;
241 
242 	cs35l56_hda_wait_dsp_ready(cs35l56);
243 
244 	ret = regmap_read(cs35l56->base.regmap, CS35L56_MAIN_POSTURE_NUMBER, &pos);
245 	if (ret)
246 		return ret;
247 
248 	ucontrol->value.integer.value[0] = pos;
249 
250 	return 0;
251 }
252 
cs35l56_hda_posture_put(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)253 static int cs35l56_hda_posture_put(struct snd_kcontrol *kcontrol,
254 				   struct snd_ctl_elem_value *ucontrol)
255 {
256 	struct cs35l56_hda *cs35l56 = (struct cs35l56_hda *)kcontrol->private_data;
257 	unsigned long pos = ucontrol->value.integer.value[0];
258 	bool changed;
259 	int ret;
260 
261 	if ((pos < CS35L56_MAIN_POSTURE_MIN) ||
262 	    (pos > CS35L56_MAIN_POSTURE_MAX))
263 		return -EINVAL;
264 
265 	cs35l56_hda_wait_dsp_ready(cs35l56);
266 
267 	ret = regmap_update_bits_check(cs35l56->base.regmap,
268 				       CS35L56_MAIN_POSTURE_NUMBER,
269 				       CS35L56_MAIN_POSTURE_MASK,
270 				       pos, &changed);
271 	if (ret)
272 		return ret;
273 
274 	return changed;
275 }
276 
277 static const struct {
278 	const char *name;
279 	unsigned int reg;
280 } cs35l56_hda_mixer_controls[] = {
281 	{ "ASP1 TX1 Source", CS35L56_ASP1TX1_INPUT },
282 	{ "ASP1 TX2 Source", CS35L56_ASP1TX2_INPUT },
283 	{ "ASP1 TX3 Source", CS35L56_ASP1TX3_INPUT },
284 	{ "ASP1 TX4 Source", CS35L56_ASP1TX4_INPUT },
285 };
286 
287 static const DECLARE_TLV_DB_SCALE(cs35l56_hda_vol_tlv, -10000, 25, 0);
288 
cs35l56_hda_vol_info(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_info * uinfo)289 static int cs35l56_hda_vol_info(struct snd_kcontrol *kcontrol,
290 				struct snd_ctl_elem_info *uinfo)
291 {
292 	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
293 	uinfo->count = 1;
294 	uinfo->value.integer.step = 1;
295 	uinfo->value.integer.min = 0;
296 	uinfo->value.integer.max = CS35L56_MAIN_RENDER_USER_VOLUME_MAX -
297 				   CS35L56_MAIN_RENDER_USER_VOLUME_MIN;
298 
299 	return 0;
300 }
301 
cs35l56_hda_vol_get(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)302 static int cs35l56_hda_vol_get(struct snd_kcontrol *kcontrol,
303 			       struct snd_ctl_elem_value *ucontrol)
304 {
305 	struct cs35l56_hda *cs35l56 = (struct cs35l56_hda *)kcontrol->private_data;
306 	unsigned int raw_vol;
307 	int vol;
308 	int ret;
309 
310 	cs35l56_hda_wait_dsp_ready(cs35l56);
311 
312 	ret = regmap_read(cs35l56->base.regmap, CS35L56_MAIN_RENDER_USER_VOLUME, &raw_vol);
313 
314 	if (ret)
315 		return ret;
316 
317 	vol = (s16)(raw_vol & 0xFFFF);
318 	vol >>= CS35L56_MAIN_RENDER_USER_VOLUME_SHIFT;
319 
320 	if (vol & BIT(CS35L56_MAIN_RENDER_USER_VOLUME_SIGNBIT))
321 		vol |= ~((int)(BIT(CS35L56_MAIN_RENDER_USER_VOLUME_SIGNBIT) - 1));
322 
323 	ucontrol->value.integer.value[0] = vol - CS35L56_MAIN_RENDER_USER_VOLUME_MIN;
324 
325 	return 0;
326 }
327 
cs35l56_hda_vol_put(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)328 static int cs35l56_hda_vol_put(struct snd_kcontrol *kcontrol,
329 			       struct snd_ctl_elem_value *ucontrol)
330 {
331 	struct cs35l56_hda *cs35l56 = (struct cs35l56_hda *)kcontrol->private_data;
332 	long vol = ucontrol->value.integer.value[0];
333 	unsigned int raw_vol;
334 	bool changed;
335 	int ret;
336 
337 	if ((vol < 0) || (vol > (CS35L56_MAIN_RENDER_USER_VOLUME_MAX -
338 				 CS35L56_MAIN_RENDER_USER_VOLUME_MIN)))
339 		return -EINVAL;
340 
341 	raw_vol = (vol + CS35L56_MAIN_RENDER_USER_VOLUME_MIN) <<
342 		  CS35L56_MAIN_RENDER_USER_VOLUME_SHIFT;
343 
344 	cs35l56_hda_wait_dsp_ready(cs35l56);
345 
346 	ret = regmap_update_bits_check(cs35l56->base.regmap,
347 				       CS35L56_MAIN_RENDER_USER_VOLUME,
348 				       CS35L56_MAIN_RENDER_USER_VOLUME_MASK,
349 				       raw_vol, &changed);
350 	if (ret)
351 		return ret;
352 
353 	return changed;
354 }
355 
cs35l56_hda_create_controls(struct cs35l56_hda * cs35l56)356 static void cs35l56_hda_create_controls(struct cs35l56_hda *cs35l56)
357 {
358 	struct snd_kcontrol_new ctl_template = {
359 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
360 		.access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
361 		.info = cs35l56_hda_posture_info,
362 		.get = cs35l56_hda_posture_get,
363 		.put = cs35l56_hda_posture_put,
364 	};
365 	char name[64];
366 	int i;
367 
368 	snprintf(name, sizeof(name), "%s Posture Number", cs35l56->amp_name);
369 	ctl_template.name = name;
370 	cs35l56->posture_ctl = snd_ctl_new1(&ctl_template, cs35l56);
371 	if (snd_ctl_add(cs35l56->codec->card, cs35l56->posture_ctl))
372 		dev_err(cs35l56->base.dev, "Failed to add KControl: %s\n", ctl_template.name);
373 
374 	/* Mixer controls */
375 	ctl_template.info = cs35l56_hda_mixer_info;
376 	ctl_template.get = cs35l56_hda_mixer_get;
377 	ctl_template.put = cs35l56_hda_mixer_put;
378 
379 	BUILD_BUG_ON(ARRAY_SIZE(cs35l56->mixer_ctl) != ARRAY_SIZE(cs35l56_hda_mixer_controls));
380 
381 	for (i = 0; i < ARRAY_SIZE(cs35l56_hda_mixer_controls); ++i) {
382 		snprintf(name, sizeof(name), "%s %s", cs35l56->amp_name,
383 			 cs35l56_hda_mixer_controls[i].name);
384 		ctl_template.private_value = cs35l56_hda_mixer_controls[i].reg;
385 		cs35l56->mixer_ctl[i] = snd_ctl_new1(&ctl_template, cs35l56);
386 		if (snd_ctl_add(cs35l56->codec->card, cs35l56->mixer_ctl[i])) {
387 			dev_err(cs35l56->base.dev, "Failed to add KControl: %s\n",
388 				ctl_template.name);
389 		}
390 	}
391 
392 	ctl_template.info = cs35l56_hda_vol_info;
393 	ctl_template.get = cs35l56_hda_vol_get;
394 	ctl_template.put = cs35l56_hda_vol_put;
395 	ctl_template.access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_TLV_READ);
396 	ctl_template.tlv.p = cs35l56_hda_vol_tlv;
397 	snprintf(name, sizeof(name), "%s Speaker Playback Volume", cs35l56->amp_name);
398 	ctl_template.name = name;
399 	cs35l56->volume_ctl = snd_ctl_new1(&ctl_template, cs35l56);
400 	if (snd_ctl_add(cs35l56->codec->card, cs35l56->volume_ctl))
401 		dev_err(cs35l56->base.dev, "Failed to add KControl: %s\n", ctl_template.name);
402 }
403 
cs35l56_hda_remove_controls(struct cs35l56_hda * cs35l56)404 static void cs35l56_hda_remove_controls(struct cs35l56_hda *cs35l56)
405 {
406 	int i;
407 
408 	for (i = ARRAY_SIZE(cs35l56->mixer_ctl) - 1; i >= 0; i--)
409 		snd_ctl_remove(cs35l56->codec->card, cs35l56->mixer_ctl[i]);
410 
411 	snd_ctl_remove(cs35l56->codec->card, cs35l56->posture_ctl);
412 	snd_ctl_remove(cs35l56->codec->card, cs35l56->volume_ctl);
413 }
414 
415 static const struct cs_dsp_client_ops cs35l56_hda_client_ops = {
416 	/* cs_dsp requires the client to provide this even if it is empty */
417 };
418 
cs35l56_hda_request_firmware_file(struct cs35l56_hda * cs35l56,const struct firmware ** firmware,char ** filename,const char * base_name,const char * system_name,const char * amp_name,const char * filetype)419 static int cs35l56_hda_request_firmware_file(struct cs35l56_hda *cs35l56,
420 					     const struct firmware **firmware, char **filename,
421 					     const char *base_name, const char *system_name,
422 					     const char *amp_name,
423 					     const char *filetype)
424 {
425 	char *s, c;
426 	int ret = 0;
427 
428 	if (system_name && amp_name)
429 		*filename = kasprintf(GFP_KERNEL, "%s-%s-%s.%s", base_name,
430 				      system_name, amp_name, filetype);
431 	else if (system_name)
432 		*filename = kasprintf(GFP_KERNEL, "%s-%s.%s", base_name,
433 				      system_name, filetype);
434 	else
435 		*filename = kasprintf(GFP_KERNEL, "%s.%s", base_name, filetype);
436 
437 	if (!*filename)
438 		return -ENOMEM;
439 
440 	/*
441 	 * Make sure that filename is lower-case and any non alpha-numeric
442 	 * characters except full stop and forward slash are replaced with
443 	 * hyphens.
444 	 */
445 	s = *filename;
446 	while (*s) {
447 		c = *s;
448 		if (isalnum(c))
449 			*s = tolower(c);
450 		else if (c != '.' && c != '/')
451 			*s = '-';
452 		s++;
453 	}
454 
455 	ret = firmware_request_nowarn(firmware, *filename, cs35l56->base.dev);
456 	if (ret) {
457 		dev_dbg(cs35l56->base.dev, "Failed to request '%s'\n", *filename);
458 		kfree(*filename);
459 		*filename = NULL;
460 		return ret;
461 	}
462 
463 	dev_dbg(cs35l56->base.dev, "Found '%s'\n", *filename);
464 
465 	return 0;
466 }
467 
cs35l56_hda_request_firmware_files(struct cs35l56_hda * cs35l56,unsigned int preloaded_fw_ver,const struct firmware ** wmfw_firmware,char ** wmfw_filename,const struct firmware ** coeff_firmware,char ** coeff_filename)468 static void cs35l56_hda_request_firmware_files(struct cs35l56_hda *cs35l56,
469 					       unsigned int preloaded_fw_ver,
470 					       const struct firmware **wmfw_firmware,
471 					       char **wmfw_filename,
472 					       const struct firmware **coeff_firmware,
473 					       char **coeff_filename)
474 {
475 	const char *system_name = cs35l56->system_name;
476 	const char *amp_name = cs35l56->amp_name;
477 	char base_name[37];
478 	int ret;
479 
480 	if (preloaded_fw_ver) {
481 		snprintf(base_name, sizeof(base_name),
482 			 "cirrus/cs35l%02x-%02x%s-%06x-dsp1-misc",
483 			 cs35l56->base.type,
484 			 cs35l56->base.rev,
485 			 cs35l56->base.secured ? "-s" : "",
486 			 preloaded_fw_ver & 0xffffff);
487 	} else {
488 		snprintf(base_name, sizeof(base_name),
489 			 "cirrus/cs35l%02x-%02x%s-dsp1-misc",
490 			 cs35l56->base.type,
491 			 cs35l56->base.rev,
492 			 cs35l56->base.secured ? "-s" : "");
493 	}
494 
495 	if (system_name && amp_name) {
496 		if (!cs35l56_hda_request_firmware_file(cs35l56, wmfw_firmware, wmfw_filename,
497 						       base_name, system_name, amp_name, "wmfw")) {
498 			cs35l56_hda_request_firmware_file(cs35l56, coeff_firmware, coeff_filename,
499 							  base_name, system_name, amp_name, "bin");
500 			return;
501 		}
502 	}
503 
504 	if (system_name) {
505 		if (!cs35l56_hda_request_firmware_file(cs35l56, wmfw_firmware, wmfw_filename,
506 						       base_name, system_name, NULL, "wmfw")) {
507 			if (amp_name)
508 				cs35l56_hda_request_firmware_file(cs35l56,
509 								  coeff_firmware, coeff_filename,
510 								  base_name, system_name,
511 								  amp_name, "bin");
512 			if (!*coeff_firmware)
513 				cs35l56_hda_request_firmware_file(cs35l56,
514 								  coeff_firmware, coeff_filename,
515 								  base_name, system_name,
516 								  NULL, "bin");
517 			return;
518 		}
519 
520 		/*
521 		 * Check for system-specific bin files without wmfw before
522 		 * falling back to generic firmware
523 		 */
524 		if (amp_name)
525 			cs35l56_hda_request_firmware_file(cs35l56, coeff_firmware, coeff_filename,
526 							  base_name, system_name, amp_name, "bin");
527 		if (!*coeff_firmware)
528 			cs35l56_hda_request_firmware_file(cs35l56, coeff_firmware, coeff_filename,
529 							  base_name, system_name, NULL, "bin");
530 
531 		if (*coeff_firmware)
532 			return;
533 	}
534 
535 	ret = cs35l56_hda_request_firmware_file(cs35l56, wmfw_firmware, wmfw_filename,
536 						base_name, NULL, NULL, "wmfw");
537 	if (!ret) {
538 		cs35l56_hda_request_firmware_file(cs35l56, coeff_firmware, coeff_filename,
539 						  base_name, NULL, NULL, "bin");
540 		return;
541 	}
542 
543 	if (!*coeff_firmware)
544 		cs35l56_hda_request_firmware_file(cs35l56, coeff_firmware, coeff_filename,
545 						  base_name, NULL, NULL, "bin");
546 }
547 
cs35l56_hda_release_firmware_files(const struct firmware * wmfw_firmware,char * wmfw_filename,const struct firmware * coeff_firmware,char * coeff_filename)548 static void cs35l56_hda_release_firmware_files(const struct firmware *wmfw_firmware,
549 					       char *wmfw_filename,
550 					       const struct firmware *coeff_firmware,
551 					       char *coeff_filename)
552 {
553 	if (wmfw_firmware)
554 		release_firmware(wmfw_firmware);
555 	kfree(wmfw_filename);
556 
557 	if (coeff_firmware)
558 		release_firmware(coeff_firmware);
559 	kfree(coeff_filename);
560 }
561 
cs35l56_hda_apply_calibration(struct cs35l56_hda * cs35l56)562 static void cs35l56_hda_apply_calibration(struct cs35l56_hda *cs35l56)
563 {
564 	int ret;
565 
566 	if (!cs35l56->base.cal_data_valid || cs35l56->base.secured)
567 		return;
568 
569 	ret = cs_amp_write_cal_coeffs(&cs35l56->cs_dsp,
570 				      &cs35l56_calibration_controls,
571 				      &cs35l56->base.cal_data);
572 	if (ret < 0)
573 		dev_warn(cs35l56->base.dev, "Failed to write calibration: %d\n", ret);
574 	else
575 		dev_info(cs35l56->base.dev, "Calibration applied\n");
576 }
577 
cs35l56_hda_fw_load(struct cs35l56_hda * cs35l56)578 static void cs35l56_hda_fw_load(struct cs35l56_hda *cs35l56)
579 {
580 	const struct firmware *coeff_firmware = NULL;
581 	const struct firmware *wmfw_firmware = NULL;
582 	char *coeff_filename = NULL;
583 	char *wmfw_filename = NULL;
584 	unsigned int preloaded_fw_ver;
585 	bool firmware_missing;
586 	int ret;
587 
588 	/*
589 	 * Prepare for a new DSP power-up. If the DSP has had firmware
590 	 * downloaded previously then it needs to be powered down so that it
591 	 * can be updated.
592 	 */
593 	if (cs35l56->base.fw_patched)
594 		cs_dsp_power_down(&cs35l56->cs_dsp);
595 
596 	cs35l56->base.fw_patched = false;
597 
598 	ret = pm_runtime_resume_and_get(cs35l56->base.dev);
599 	if (ret < 0) {
600 		dev_err(cs35l56->base.dev, "Failed to resume and get %d\n", ret);
601 		return;
602 	}
603 
604 	/*
605 	 * The firmware can only be upgraded if it is currently running
606 	 * from the built-in ROM. If not, the wmfw/bin must be for the
607 	 * version of firmware that is running on the chip.
608 	 */
609 	ret = cs35l56_read_prot_status(&cs35l56->base, &firmware_missing, &preloaded_fw_ver);
610 	if (ret)
611 		goto err_pm_put;
612 
613 	if (firmware_missing)
614 		preloaded_fw_ver = 0;
615 
616 	cs35l56_hda_request_firmware_files(cs35l56, preloaded_fw_ver,
617 					   &wmfw_firmware, &wmfw_filename,
618 					   &coeff_firmware, &coeff_filename);
619 
620 	/*
621 	 * If the BIOS didn't patch the firmware a bin file is mandatory to
622 	 * enable the ASP·
623 	 */
624 	if (!coeff_firmware && firmware_missing) {
625 		dev_err(cs35l56->base.dev, ".bin file required but not found\n");
626 		goto err_fw_release;
627 	}
628 
629 	mutex_lock(&cs35l56->base.irq_lock);
630 
631 	/*
632 	 * If the firmware hasn't been patched it must be shutdown before
633 	 * doing a full patch and reset afterwards. If it is already
634 	 * running a patched version the firmware files only contain
635 	 * tunings and we can use the lower cost reinit sequence instead.
636 	 */
637 	if (firmware_missing && (wmfw_firmware || coeff_firmware)) {
638 		ret = cs35l56_firmware_shutdown(&cs35l56->base);
639 		if (ret)
640 			goto err;
641 	}
642 
643 	ret = cs_dsp_power_up(&cs35l56->cs_dsp, wmfw_firmware, wmfw_filename,
644 			      coeff_firmware, coeff_filename, "misc");
645 	if (ret) {
646 		dev_dbg(cs35l56->base.dev, "%s: cs_dsp_power_up ret %d\n", __func__, ret);
647 		goto err;
648 	}
649 
650 	if (wmfw_filename)
651 		dev_dbg(cs35l56->base.dev, "Loaded WMFW Firmware: %s\n", wmfw_filename);
652 
653 	if (coeff_filename)
654 		dev_dbg(cs35l56->base.dev, "Loaded Coefficients: %s\n", coeff_filename);
655 
656 	/* If we downloaded firmware, reset the device and wait for it to boot */
657 	if (firmware_missing && (wmfw_firmware || coeff_firmware)) {
658 		cs35l56_system_reset(&cs35l56->base, false);
659 		regcache_mark_dirty(cs35l56->base.regmap);
660 		ret = cs35l56_wait_for_firmware_boot(&cs35l56->base);
661 		if (ret)
662 			goto err_powered_up;
663 
664 		regcache_cache_only(cs35l56->base.regmap, false);
665 	}
666 
667 	/* Disable auto-hibernate so that runtime_pm has control */
668 	ret = cs35l56_mbox_send(&cs35l56->base, CS35L56_MBOX_CMD_PREVENT_AUTO_HIBERNATE);
669 	if (ret)
670 		goto err_powered_up;
671 
672 	regcache_sync(cs35l56->base.regmap);
673 
674 	regmap_clear_bits(cs35l56->base.regmap, CS35L56_PROTECTION_STATUS,
675 			  CS35L56_FIRMWARE_MISSING);
676 	cs35l56->base.fw_patched = true;
677 
678 	ret = cs_dsp_run(&cs35l56->cs_dsp);
679 	if (ret)
680 		dev_dbg(cs35l56->base.dev, "%s: cs_dsp_run ret %d\n", __func__, ret);
681 
682 	cs35l56_hda_apply_calibration(cs35l56);
683 	ret = cs35l56_mbox_send(&cs35l56->base, CS35L56_MBOX_CMD_AUDIO_REINIT);
684 	if (ret)
685 		cs_dsp_stop(&cs35l56->cs_dsp);
686 
687 err_powered_up:
688 	if (!cs35l56->base.fw_patched)
689 		cs_dsp_power_down(&cs35l56->cs_dsp);
690 err:
691 	mutex_unlock(&cs35l56->base.irq_lock);
692 err_fw_release:
693 	cs35l56_hda_release_firmware_files(wmfw_firmware, wmfw_filename,
694 					   coeff_firmware, coeff_filename);
695 err_pm_put:
696 	pm_runtime_put(cs35l56->base.dev);
697 }
698 
cs35l56_hda_dsp_work(struct work_struct * work)699 static void cs35l56_hda_dsp_work(struct work_struct *work)
700 {
701 	struct cs35l56_hda *cs35l56 = container_of(work, struct cs35l56_hda, dsp_work);
702 
703 	cs35l56_hda_fw_load(cs35l56);
704 }
705 
cs35l56_hda_bind(struct device * dev,struct device * master,void * master_data)706 static int cs35l56_hda_bind(struct device *dev, struct device *master, void *master_data)
707 {
708 	struct cs35l56_hda *cs35l56 = dev_get_drvdata(dev);
709 	struct hda_component_parent *parent = master_data;
710 	struct hda_component *comp;
711 
712 	comp = hda_component_from_index(parent, cs35l56->index);
713 	if (!comp)
714 		return -EINVAL;
715 
716 	if (comp->dev)
717 		return -EBUSY;
718 
719 	comp->dev = dev;
720 	cs35l56->codec = parent->codec;
721 	strscpy(comp->name, dev_name(dev), sizeof(comp->name));
722 	comp->playback_hook = cs35l56_hda_playback_hook;
723 
724 	queue_work(system_long_wq, &cs35l56->dsp_work);
725 
726 	cs35l56_hda_create_controls(cs35l56);
727 
728 #if IS_ENABLED(CONFIG_SND_DEBUG)
729 	cs35l56->debugfs_root = debugfs_create_dir(dev_name(cs35l56->base.dev), sound_debugfs_root);
730 	cs_dsp_init_debugfs(&cs35l56->cs_dsp, cs35l56->debugfs_root);
731 #endif
732 
733 	dev_dbg(cs35l56->base.dev, "Bound\n");
734 
735 	return 0;
736 }
737 
cs35l56_hda_unbind(struct device * dev,struct device * master,void * master_data)738 static void cs35l56_hda_unbind(struct device *dev, struct device *master, void *master_data)
739 {
740 	struct cs35l56_hda *cs35l56 = dev_get_drvdata(dev);
741 	struct hda_component_parent *parent = master_data;
742 	struct hda_component *comp;
743 
744 	cancel_work_sync(&cs35l56->dsp_work);
745 
746 	cs35l56_hda_remove_controls(cs35l56);
747 
748 #if IS_ENABLED(CONFIG_SND_DEBUG)
749 	cs_dsp_cleanup_debugfs(&cs35l56->cs_dsp);
750 	debugfs_remove_recursive(cs35l56->debugfs_root);
751 #endif
752 
753 	if (cs35l56->base.fw_patched)
754 		cs_dsp_power_down(&cs35l56->cs_dsp);
755 
756 	comp = hda_component_from_index(parent, cs35l56->index);
757 	if (comp && (comp->dev == dev))
758 		memset(comp, 0, sizeof(*comp));
759 
760 	cs35l56->codec = NULL;
761 
762 	dev_dbg(cs35l56->base.dev, "Unbound\n");
763 }
764 
765 static const struct component_ops cs35l56_hda_comp_ops = {
766 	.bind = cs35l56_hda_bind,
767 	.unbind = cs35l56_hda_unbind,
768 };
769 
cs35l56_hda_system_suspend(struct device * dev)770 static int cs35l56_hda_system_suspend(struct device *dev)
771 {
772 	struct cs35l56_hda *cs35l56 = dev_get_drvdata(dev);
773 
774 	cs35l56_hda_wait_dsp_ready(cs35l56);
775 
776 	if (cs35l56->playing)
777 		cs35l56_hda_pause(cs35l56);
778 
779 	cs35l56->suspended = true;
780 
781 	/*
782 	 * The interrupt line is normally shared, but after we start suspending
783 	 * we can't check if our device is the source of an interrupt, and can't
784 	 * clear it. Prevent this race by temporarily disabling the parent irq
785 	 * until we reach _no_irq.
786 	 */
787 	if (cs35l56->base.irq)
788 		disable_irq(cs35l56->base.irq);
789 
790 	return pm_runtime_force_suspend(dev);
791 }
792 
cs35l56_hda_system_suspend_late(struct device * dev)793 static int cs35l56_hda_system_suspend_late(struct device *dev)
794 {
795 	struct cs35l56_hda *cs35l56 = dev_get_drvdata(dev);
796 
797 	/*
798 	 * RESET is usually shared by all amps so it must not be asserted until
799 	 * all driver instances have done their suspend() stage.
800 	 */
801 	if (cs35l56->base.reset_gpio) {
802 		gpiod_set_value_cansleep(cs35l56->base.reset_gpio, 0);
803 		cs35l56_wait_min_reset_pulse();
804 	}
805 
806 	return 0;
807 }
808 
cs35l56_hda_system_suspend_no_irq(struct device * dev)809 static int cs35l56_hda_system_suspend_no_irq(struct device *dev)
810 {
811 	struct cs35l56_hda *cs35l56 = dev_get_drvdata(dev);
812 
813 	/* Handlers are now disabled so the parent IRQ can safely be re-enabled. */
814 	if (cs35l56->base.irq)
815 		enable_irq(cs35l56->base.irq);
816 
817 	return 0;
818 }
819 
cs35l56_hda_system_resume_no_irq(struct device * dev)820 static int cs35l56_hda_system_resume_no_irq(struct device *dev)
821 {
822 	struct cs35l56_hda *cs35l56 = dev_get_drvdata(dev);
823 
824 	/*
825 	 * WAKE interrupts unmask if the CS35L56 hibernates, which can cause
826 	 * spurious interrupts, and the interrupt line is normally shared.
827 	 * We can't check if our device is the source of an interrupt, and can't
828 	 * clear it, until it has fully resumed. Prevent this race by temporarily
829 	 * disabling the parent irq until we complete resume().
830 	 */
831 	if (cs35l56->base.irq)
832 		disable_irq(cs35l56->base.irq);
833 
834 	return 0;
835 }
836 
cs35l56_hda_system_resume_early(struct device * dev)837 static int cs35l56_hda_system_resume_early(struct device *dev)
838 {
839 	struct cs35l56_hda *cs35l56 = dev_get_drvdata(dev);
840 
841 	/* Ensure a spec-compliant RESET pulse. */
842 	if (cs35l56->base.reset_gpio) {
843 		gpiod_set_value_cansleep(cs35l56->base.reset_gpio, 0);
844 		cs35l56_wait_min_reset_pulse();
845 
846 		/* Release shared RESET before drivers start resume(). */
847 		gpiod_set_value_cansleep(cs35l56->base.reset_gpio, 1);
848 		cs35l56_wait_control_port_ready();
849 	}
850 
851 	return 0;
852 }
853 
cs35l56_hda_system_resume(struct device * dev)854 static int cs35l56_hda_system_resume(struct device *dev)
855 {
856 	struct cs35l56_hda *cs35l56 = dev_get_drvdata(dev);
857 	int ret;
858 
859 	/* Undo pm_runtime_force_suspend() before re-enabling the irq */
860 	ret = pm_runtime_force_resume(dev);
861 	if (cs35l56->base.irq)
862 		enable_irq(cs35l56->base.irq);
863 
864 	if (ret)
865 		return ret;
866 
867 	cs35l56->suspended = false;
868 
869 	if (!cs35l56->codec)
870 		return 0;
871 
872 	ret = cs35l56_is_fw_reload_needed(&cs35l56->base);
873 	dev_dbg(cs35l56->base.dev, "fw_reload_needed: %d\n", ret);
874 	if (ret > 0)
875 		queue_work(system_long_wq, &cs35l56->dsp_work);
876 
877 	if (cs35l56->playing)
878 		cs35l56_hda_play(cs35l56);
879 
880 	return 0;
881 }
882 
cs35l56_hda_read_acpi(struct cs35l56_hda * cs35l56,int hid,int id)883 static int cs35l56_hda_read_acpi(struct cs35l56_hda *cs35l56, int hid, int id)
884 {
885 	u32 values[HDA_MAX_COMPONENTS];
886 	char hid_string[8];
887 	struct acpi_device *adev;
888 	const char *property, *sub;
889 	size_t nval;
890 	int i, ret;
891 
892 	/*
893 	 * ACPI_COMPANION isn't available when this driver was instantiated by
894 	 * the serial-multi-instantiate driver, so lookup the node by HID
895 	 */
896 	if (!ACPI_COMPANION(cs35l56->base.dev)) {
897 		snprintf(hid_string, sizeof(hid_string), "CSC%04X", hid);
898 		adev = acpi_dev_get_first_match_dev(hid_string, NULL, -1);
899 		if (!adev) {
900 			dev_err(cs35l56->base.dev, "Failed to find an ACPI device for %s\n",
901 				dev_name(cs35l56->base.dev));
902 			return -ENODEV;
903 		}
904 		ACPI_COMPANION_SET(cs35l56->base.dev, adev);
905 	}
906 
907 	property = "cirrus,dev-index";
908 	ret = device_property_count_u32(cs35l56->base.dev, property);
909 	if (ret <= 0)
910 		goto err;
911 
912 	if (ret > ARRAY_SIZE(values)) {
913 		ret = -EINVAL;
914 		goto err;
915 	}
916 	nval = ret;
917 
918 	ret = device_property_read_u32_array(cs35l56->base.dev, property, values, nval);
919 	if (ret)
920 		goto err;
921 
922 	cs35l56->index = -1;
923 	for (i = 0; i < nval; i++) {
924 		if (values[i] == id) {
925 			cs35l56->index = i;
926 			break;
927 		}
928 	}
929 	/*
930 	 * It's not an error for the ID to be missing: for I2C there can be
931 	 * an alias address that is not a real device. So reject silently.
932 	 */
933 	if (cs35l56->index == -1) {
934 		dev_dbg(cs35l56->base.dev, "No index found in %s\n", property);
935 		ret = -ENODEV;
936 		goto err;
937 	}
938 
939 	sub = acpi_get_subsystem_id(ACPI_HANDLE(cs35l56->base.dev));
940 
941 	if (IS_ERR(sub)) {
942 		dev_info(cs35l56->base.dev,
943 			 "Read ACPI _SUB failed(%ld): fallback to generic firmware\n",
944 			 PTR_ERR(sub));
945 	} else {
946 		ret = cirrus_scodec_get_speaker_id(cs35l56->base.dev, cs35l56->index, nval, -1);
947 		if (ret == -ENOENT) {
948 			cs35l56->system_name = sub;
949 		} else if (ret >= 0) {
950 			cs35l56->system_name = kasprintf(GFP_KERNEL, "%s-spkid%d", sub, ret);
951 			kfree(sub);
952 			if (!cs35l56->system_name)
953 				return -ENOMEM;
954 		} else {
955 			return ret;
956 		}
957 	}
958 
959 	cs35l56->base.reset_gpio = devm_gpiod_get_index_optional(cs35l56->base.dev,
960 								 "reset",
961 								 cs35l56->index,
962 								 GPIOD_OUT_LOW);
963 	if (IS_ERR(cs35l56->base.reset_gpio)) {
964 		ret = PTR_ERR(cs35l56->base.reset_gpio);
965 
966 		/*
967 		 * If RESET is shared the first amp to probe will grab the reset
968 		 * line and reset all the amps
969 		 */
970 		if (ret != -EBUSY)
971 			return dev_err_probe(cs35l56->base.dev, ret, "Failed to get reset GPIO\n");
972 
973 		dev_info(cs35l56->base.dev, "Reset GPIO busy, assume shared reset\n");
974 		cs35l56->base.reset_gpio = NULL;
975 	}
976 
977 	return 0;
978 
979 err:
980 	if (ret != -ENODEV)
981 		dev_err(cs35l56->base.dev, "Failed property %s: %d\n", property, ret);
982 
983 	return ret;
984 }
985 
cs35l56_hda_common_probe(struct cs35l56_hda * cs35l56,int hid,int id)986 int cs35l56_hda_common_probe(struct cs35l56_hda *cs35l56, int hid, int id)
987 {
988 	int ret;
989 
990 	mutex_init(&cs35l56->base.irq_lock);
991 	dev_set_drvdata(cs35l56->base.dev, cs35l56);
992 
993 	INIT_WORK(&cs35l56->dsp_work, cs35l56_hda_dsp_work);
994 
995 	ret = cs35l56_hda_read_acpi(cs35l56, hid, id);
996 	if (ret)
997 		goto err;
998 
999 	cs35l56->amp_name = devm_kasprintf(cs35l56->base.dev, GFP_KERNEL, "AMP%d",
1000 					   cs35l56->index + 1);
1001 	if (!cs35l56->amp_name) {
1002 		ret = -ENOMEM;
1003 		goto err;
1004 	}
1005 
1006 	cs35l56->base.cal_index = -1;
1007 
1008 	cs35l56_init_cs_dsp(&cs35l56->base, &cs35l56->cs_dsp);
1009 	cs35l56->cs_dsp.client_ops = &cs35l56_hda_client_ops;
1010 
1011 	if (cs35l56->base.reset_gpio) {
1012 		dev_dbg(cs35l56->base.dev, "Hard reset\n");
1013 
1014 		/*
1015 		 * The GPIOD_OUT_LOW to *_gpiod_get_*() will be ignored if the
1016 		 * ACPI defines a different default state. So explicitly set low.
1017 		 */
1018 		gpiod_set_value_cansleep(cs35l56->base.reset_gpio, 0);
1019 		cs35l56_wait_min_reset_pulse();
1020 		gpiod_set_value_cansleep(cs35l56->base.reset_gpio, 1);
1021 	}
1022 
1023 	ret = cs35l56_hw_init(&cs35l56->base);
1024 	if (ret < 0)
1025 		goto err;
1026 
1027 	/* Reset the device and wait for it to boot */
1028 	cs35l56_system_reset(&cs35l56->base, false);
1029 	ret = cs35l56_wait_for_firmware_boot(&cs35l56->base);
1030 	if (ret)
1031 		goto err;
1032 
1033 	regcache_cache_only(cs35l56->base.regmap, false);
1034 
1035 	ret = cs35l56_set_patch(&cs35l56->base);
1036 	if (ret)
1037 		goto err;
1038 
1039 	regcache_mark_dirty(cs35l56->base.regmap);
1040 	regcache_sync(cs35l56->base.regmap);
1041 
1042 	/* Disable auto-hibernate so that runtime_pm has control */
1043 	ret = cs35l56_mbox_send(&cs35l56->base, CS35L56_MBOX_CMD_PREVENT_AUTO_HIBERNATE);
1044 	if (ret)
1045 		goto err;
1046 
1047 	ret = cs35l56_get_calibration(&cs35l56->base);
1048 	if (ret)
1049 		goto err;
1050 
1051 	ret = cs_dsp_halo_init(&cs35l56->cs_dsp);
1052 	if (ret) {
1053 		dev_err_probe(cs35l56->base.dev, ret, "cs_dsp_halo_init failed\n");
1054 		goto err;
1055 	}
1056 
1057 	dev_info(cs35l56->base.dev, "DSP system name: '%s', amp name: '%s'\n",
1058 		 cs35l56->system_name, cs35l56->amp_name);
1059 
1060 	regmap_multi_reg_write(cs35l56->base.regmap, cs35l56_hda_dai_config,
1061 			       ARRAY_SIZE(cs35l56_hda_dai_config));
1062 	ret = cs35l56_force_sync_asp1_registers_from_cache(&cs35l56->base);
1063 	if (ret)
1064 		goto dsp_err;
1065 
1066 	/*
1067 	 * By default only enable one ASP1TXn, where n=amplifier index,
1068 	 * This prevents multiple amps trying to drive the same slot.
1069 	 */
1070 	cs35l56->asp_tx_mask = BIT(cs35l56->index);
1071 
1072 	pm_runtime_set_autosuspend_delay(cs35l56->base.dev, 3000);
1073 	pm_runtime_use_autosuspend(cs35l56->base.dev);
1074 	pm_runtime_set_active(cs35l56->base.dev);
1075 	pm_runtime_mark_last_busy(cs35l56->base.dev);
1076 	pm_runtime_enable(cs35l56->base.dev);
1077 
1078 	cs35l56->base.init_done = true;
1079 
1080 	ret = component_add(cs35l56->base.dev, &cs35l56_hda_comp_ops);
1081 	if (ret) {
1082 		dev_err(cs35l56->base.dev, "Register component failed: %d\n", ret);
1083 		goto pm_err;
1084 	}
1085 
1086 	return 0;
1087 
1088 pm_err:
1089 	pm_runtime_disable(cs35l56->base.dev);
1090 dsp_err:
1091 	cs_dsp_remove(&cs35l56->cs_dsp);
1092 err:
1093 	gpiod_set_value_cansleep(cs35l56->base.reset_gpio, 0);
1094 
1095 	return ret;
1096 }
1097 EXPORT_SYMBOL_NS_GPL(cs35l56_hda_common_probe, SND_HDA_SCODEC_CS35L56);
1098 
cs35l56_hda_remove(struct device * dev)1099 void cs35l56_hda_remove(struct device *dev)
1100 {
1101 	struct cs35l56_hda *cs35l56 = dev_get_drvdata(dev);
1102 
1103 	component_del(cs35l56->base.dev, &cs35l56_hda_comp_ops);
1104 
1105 	pm_runtime_dont_use_autosuspend(cs35l56->base.dev);
1106 	pm_runtime_get_sync(cs35l56->base.dev);
1107 	pm_runtime_disable(cs35l56->base.dev);
1108 
1109 	cs_dsp_remove(&cs35l56->cs_dsp);
1110 
1111 	kfree(cs35l56->system_name);
1112 	pm_runtime_put_noidle(cs35l56->base.dev);
1113 
1114 	gpiod_set_value_cansleep(cs35l56->base.reset_gpio, 0);
1115 }
1116 EXPORT_SYMBOL_NS_GPL(cs35l56_hda_remove, SND_HDA_SCODEC_CS35L56);
1117 
1118 const struct dev_pm_ops cs35l56_hda_pm_ops = {
1119 	RUNTIME_PM_OPS(cs35l56_hda_runtime_suspend, cs35l56_hda_runtime_resume, NULL)
1120 	SYSTEM_SLEEP_PM_OPS(cs35l56_hda_system_suspend, cs35l56_hda_system_resume)
1121 	LATE_SYSTEM_SLEEP_PM_OPS(cs35l56_hda_system_suspend_late,
1122 				 cs35l56_hda_system_resume_early)
1123 	NOIRQ_SYSTEM_SLEEP_PM_OPS(cs35l56_hda_system_suspend_no_irq,
1124 				  cs35l56_hda_system_resume_no_irq)
1125 };
1126 EXPORT_SYMBOL_NS_GPL(cs35l56_hda_pm_ops, SND_HDA_SCODEC_CS35L56);
1127 
1128 MODULE_DESCRIPTION("CS35L56 HDA Driver");
1129 MODULE_IMPORT_NS(FW_CS_DSP);
1130 MODULE_IMPORT_NS(SND_HDA_CIRRUS_SCODEC);
1131 MODULE_IMPORT_NS(SND_HDA_CS_DSP_CONTROLS);
1132 MODULE_IMPORT_NS(SND_SOC_CS35L56_SHARED);
1133 MODULE_IMPORT_NS(SND_SOC_CS_AMP_LIB);
1134 MODULE_AUTHOR("Richard Fitzgerald <rf@opensource.cirrus.com>");
1135 MODULE_AUTHOR("Simon Trimmer <simont@opensource.cirrus.com>");
1136 MODULE_LICENSE("GPL");
1137