xref: /linux/sound/pci/hda/tas2781_hda_i2c.c (revision c532de5a67a70f8533d495f8f2aaa9a0491c3ad0)
1 // SPDX-License-Identifier: GPL-2.0
2 //
3 // TAS2781 HDA I2C driver
4 //
5 // Copyright 2023 - 2024 Texas Instruments, Inc.
6 //
7 // Author: Shenghao Ding <shenghao-ding@ti.com>
8 // Current maintainer: Baojun Xu <baojun.xu@ti.com>
9 
10 #include <linux/unaligned.h>
11 #include <linux/acpi.h>
12 #include <linux/crc8.h>
13 #include <linux/crc32.h>
14 #include <linux/efi.h>
15 #include <linux/firmware.h>
16 #include <linux/i2c.h>
17 #include <linux/mod_devicetable.h>
18 #include <linux/module.h>
19 #include <linux/pm_runtime.h>
20 #include <linux/regmap.h>
21 #include <sound/hda_codec.h>
22 #include <sound/soc.h>
23 #include <sound/tas2781.h>
24 #include <sound/tlv.h>
25 #include <sound/tas2781-tlv.h>
26 
27 #include "hda_local.h"
28 #include "hda_auto_parser.h"
29 #include "hda_component.h"
30 #include "hda_jack.h"
31 #include "hda_generic.h"
32 
33 #define TASDEVICE_SPEAKER_CALIBRATION_SIZE	20
34 
35 /* No standard control callbacks for SNDRV_CTL_ELEM_IFACE_CARD
36  * Define two controls, one is Volume control callbacks, the other is
37  * flag setting control callbacks.
38  */
39 
40 /* Volume control callbacks for tas2781 */
41 #define ACARD_SINGLE_RANGE_EXT_TLV(xname, xreg, xshift, xmin, xmax, xinvert, \
42 	xhandler_get, xhandler_put, tlv_array) \
43 {	.iface = SNDRV_CTL_ELEM_IFACE_CARD, .name = (xname),\
44 	.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ |\
45 		 SNDRV_CTL_ELEM_ACCESS_READWRITE,\
46 	.tlv.p = (tlv_array), \
47 	.info = snd_soc_info_volsw_range, \
48 	.get = xhandler_get, .put = xhandler_put, \
49 	.private_value = (unsigned long)&(struct soc_mixer_control) \
50 		{.reg = xreg, .rreg = xreg, .shift = xshift, \
51 		 .rshift = xshift, .min = xmin, .max = xmax, \
52 		 .invert = xinvert} }
53 
54 /* Flag control callbacks for tas2781 */
55 #define ACARD_SINGLE_BOOL_EXT(xname, xdata, xhandler_get, xhandler_put) \
56 {	.iface = SNDRV_CTL_ELEM_IFACE_CARD, .name = xname, \
57 	.info = snd_ctl_boolean_mono_info, \
58 	.get = xhandler_get, .put = xhandler_put, \
59 	.private_value = xdata }
60 
61 enum calib_data {
62 	R0_VAL = 0,
63 	INV_R0,
64 	R0LOW,
65 	POWER,
66 	TLIM,
67 	CALIB_MAX
68 };
69 
70 #define TAS2563_MAX_CHANNELS	4
71 
72 #define TAS2563_CAL_POWER	TASDEVICE_REG(0, 0x0d, 0x3c)
73 #define TAS2563_CAL_R0		TASDEVICE_REG(0, 0x0f, 0x34)
74 #define TAS2563_CAL_INVR0	TASDEVICE_REG(0, 0x0f, 0x40)
75 #define TAS2563_CAL_R0_LOW	TASDEVICE_REG(0, 0x0f, 0x48)
76 #define TAS2563_CAL_TLIM	TASDEVICE_REG(0, 0x10, 0x14)
77 #define TAS2563_CAL_N		5
78 #define TAS2563_CAL_DATA_SIZE	4
79 #define TAS2563_CAL_CH_SIZE	20
80 #define TAS2563_CAL_ARRAY_SIZE	80
81 
82 static unsigned int cal_regs[TAS2563_CAL_N] = {
83 	TAS2563_CAL_POWER, TAS2563_CAL_R0, TAS2563_CAL_INVR0,
84 	TAS2563_CAL_R0_LOW, TAS2563_CAL_TLIM,
85 };
86 
87 
88 struct tas2781_hda {
89 	struct device *dev;
90 	struct tasdevice_priv *priv;
91 	struct snd_kcontrol *dsp_prog_ctl;
92 	struct snd_kcontrol *dsp_conf_ctl;
93 	struct snd_kcontrol *prof_ctl;
94 	struct snd_kcontrol *snd_ctls[2];
95 };
96 
97 static int tas2781_get_i2c_res(struct acpi_resource *ares, void *data)
98 {
99 	struct tasdevice_priv *tas_priv = data;
100 	struct acpi_resource_i2c_serialbus *sb;
101 
102 	if (i2c_acpi_get_i2c_resource(ares, &sb)) {
103 		if (tas_priv->ndev < TASDEVICE_MAX_CHANNELS &&
104 			sb->slave_address != tas_priv->global_addr) {
105 			tas_priv->tasdevice[tas_priv->ndev].dev_addr =
106 				(unsigned int)sb->slave_address;
107 			tas_priv->ndev++;
108 		}
109 	}
110 	return 1;
111 }
112 
113 static int tas2781_read_acpi(struct tasdevice_priv *p, const char *hid)
114 {
115 	struct acpi_device *adev;
116 	LIST_HEAD(resources);
117 	int ret;
118 
119 	adev = acpi_dev_get_first_match_dev(hid, NULL, -1);
120 	if (!adev) {
121 		dev_err(p->dev,
122 			"Failed to find an ACPI device for %s\n", hid);
123 		return -ENODEV;
124 	}
125 
126 	ret = acpi_dev_get_resources(adev, &resources, tas2781_get_i2c_res, p);
127 	if (ret < 0)
128 		goto err;
129 
130 	acpi_dev_free_resource_list(&resources);
131 	strscpy(p->dev_name, hid, sizeof(p->dev_name));
132 	acpi_dev_put(adev);
133 
134 	return 0;
135 
136 err:
137 	dev_err(p->dev, "read acpi error, ret: %d\n", ret);
138 	acpi_dev_put(adev);
139 
140 	return ret;
141 }
142 
143 static void tas2781_hda_playback_hook(struct device *dev, int action)
144 {
145 	struct tas2781_hda *tas_hda = dev_get_drvdata(dev);
146 
147 	dev_dbg(tas_hda->dev, "%s: action = %d\n", __func__, action);
148 	switch (action) {
149 	case HDA_GEN_PCM_ACT_OPEN:
150 		pm_runtime_get_sync(dev);
151 		mutex_lock(&tas_hda->priv->codec_lock);
152 		tasdevice_tuning_switch(tas_hda->priv, 0);
153 		tas_hda->priv->playback_started = true;
154 		mutex_unlock(&tas_hda->priv->codec_lock);
155 		break;
156 	case HDA_GEN_PCM_ACT_CLOSE:
157 		mutex_lock(&tas_hda->priv->codec_lock);
158 		tasdevice_tuning_switch(tas_hda->priv, 1);
159 		tas_hda->priv->playback_started = false;
160 		mutex_unlock(&tas_hda->priv->codec_lock);
161 
162 		pm_runtime_mark_last_busy(dev);
163 		pm_runtime_put_autosuspend(dev);
164 		break;
165 	default:
166 		break;
167 	}
168 }
169 
170 static int tasdevice_info_profile(struct snd_kcontrol *kcontrol,
171 			struct snd_ctl_elem_info *uinfo)
172 {
173 	struct tasdevice_priv *tas_priv = snd_kcontrol_chip(kcontrol);
174 
175 	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
176 	uinfo->count = 1;
177 	uinfo->value.integer.min = 0;
178 	uinfo->value.integer.max = tas_priv->rcabin.ncfgs - 1;
179 
180 	return 0;
181 }
182 
183 static int tasdevice_get_profile_id(struct snd_kcontrol *kcontrol,
184 			struct snd_ctl_elem_value *ucontrol)
185 {
186 	struct tasdevice_priv *tas_priv = snd_kcontrol_chip(kcontrol);
187 
188 	mutex_lock(&tas_priv->codec_lock);
189 
190 	ucontrol->value.integer.value[0] = tas_priv->rcabin.profile_cfg_id;
191 
192 	dev_dbg(tas_priv->dev, "%s: kcontrol %s: %d\n",
193 		__func__, kcontrol->id.name, tas_priv->rcabin.profile_cfg_id);
194 
195 	mutex_unlock(&tas_priv->codec_lock);
196 
197 	return 0;
198 }
199 
200 static int tasdevice_set_profile_id(struct snd_kcontrol *kcontrol,
201 		struct snd_ctl_elem_value *ucontrol)
202 {
203 	struct tasdevice_priv *tas_priv = snd_kcontrol_chip(kcontrol);
204 	int nr_profile = ucontrol->value.integer.value[0];
205 	int max = tas_priv->rcabin.ncfgs - 1;
206 	int val, ret = 0;
207 
208 	val = clamp(nr_profile, 0, max);
209 
210 	mutex_lock(&tas_priv->codec_lock);
211 
212 	dev_dbg(tas_priv->dev, "%s: kcontrol %s: %d -> %d\n",
213 		__func__, kcontrol->id.name,
214 		tas_priv->rcabin.profile_cfg_id, val);
215 
216 	if (tas_priv->rcabin.profile_cfg_id != val) {
217 		tas_priv->rcabin.profile_cfg_id = val;
218 		ret = 1;
219 	}
220 
221 	mutex_unlock(&tas_priv->codec_lock);
222 
223 	return ret;
224 }
225 
226 static int tasdevice_info_programs(struct snd_kcontrol *kcontrol,
227 			struct snd_ctl_elem_info *uinfo)
228 {
229 	struct tasdevice_priv *tas_priv = snd_kcontrol_chip(kcontrol);
230 	struct tasdevice_fw *tas_fw = tas_priv->fmw;
231 
232 	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
233 	uinfo->count = 1;
234 	uinfo->value.integer.min = 0;
235 	uinfo->value.integer.max = tas_fw->nr_programs - 1;
236 
237 	return 0;
238 }
239 
240 static int tasdevice_info_config(struct snd_kcontrol *kcontrol,
241 	struct snd_ctl_elem_info *uinfo)
242 {
243 	struct tasdevice_priv *tas_priv = snd_kcontrol_chip(kcontrol);
244 	struct tasdevice_fw *tas_fw = tas_priv->fmw;
245 
246 	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
247 	uinfo->count = 1;
248 	uinfo->value.integer.min = 0;
249 	uinfo->value.integer.max = tas_fw->nr_configurations - 1;
250 
251 	return 0;
252 }
253 
254 static int tasdevice_program_get(struct snd_kcontrol *kcontrol,
255 	struct snd_ctl_elem_value *ucontrol)
256 {
257 	struct tasdevice_priv *tas_priv = snd_kcontrol_chip(kcontrol);
258 
259 	mutex_lock(&tas_priv->codec_lock);
260 
261 	ucontrol->value.integer.value[0] = tas_priv->cur_prog;
262 
263 	dev_dbg(tas_priv->dev, "%s: kcontrol %s: %d\n",
264 		__func__, kcontrol->id.name, tas_priv->cur_prog);
265 
266 	mutex_unlock(&tas_priv->codec_lock);
267 
268 	return 0;
269 }
270 
271 static int tasdevice_program_put(struct snd_kcontrol *kcontrol,
272 	struct snd_ctl_elem_value *ucontrol)
273 {
274 	struct tasdevice_priv *tas_priv = snd_kcontrol_chip(kcontrol);
275 	struct tasdevice_fw *tas_fw = tas_priv->fmw;
276 	int nr_program = ucontrol->value.integer.value[0];
277 	int max = tas_fw->nr_programs - 1;
278 	int val, ret = 0;
279 
280 	val = clamp(nr_program, 0, max);
281 
282 	mutex_lock(&tas_priv->codec_lock);
283 
284 	dev_dbg(tas_priv->dev, "%s: kcontrol %s: %d -> %d\n",
285 		__func__, kcontrol->id.name, tas_priv->cur_prog, val);
286 
287 	if (tas_priv->cur_prog != val) {
288 		tas_priv->cur_prog = val;
289 		ret = 1;
290 	}
291 
292 	mutex_unlock(&tas_priv->codec_lock);
293 
294 	return ret;
295 }
296 
297 static int tasdevice_config_get(struct snd_kcontrol *kcontrol,
298 	struct snd_ctl_elem_value *ucontrol)
299 {
300 	struct tasdevice_priv *tas_priv = snd_kcontrol_chip(kcontrol);
301 
302 	mutex_lock(&tas_priv->codec_lock);
303 
304 	ucontrol->value.integer.value[0] = tas_priv->cur_conf;
305 
306 	dev_dbg(tas_priv->dev, "%s: kcontrol %s: %d\n",
307 		__func__, kcontrol->id.name, tas_priv->cur_conf);
308 
309 	mutex_unlock(&tas_priv->codec_lock);
310 
311 	return 0;
312 }
313 
314 static int tasdevice_config_put(struct snd_kcontrol *kcontrol,
315 	struct snd_ctl_elem_value *ucontrol)
316 {
317 	struct tasdevice_priv *tas_priv = snd_kcontrol_chip(kcontrol);
318 	struct tasdevice_fw *tas_fw = tas_priv->fmw;
319 	int nr_config = ucontrol->value.integer.value[0];
320 	int max = tas_fw->nr_configurations - 1;
321 	int val, ret = 0;
322 
323 	val = clamp(nr_config, 0, max);
324 
325 	mutex_lock(&tas_priv->codec_lock);
326 
327 	dev_dbg(tas_priv->dev, "%s: kcontrol %s: %d -> %d\n",
328 		__func__, kcontrol->id.name, tas_priv->cur_conf, val);
329 
330 	if (tas_priv->cur_conf != val) {
331 		tas_priv->cur_conf = val;
332 		ret = 1;
333 	}
334 
335 	mutex_unlock(&tas_priv->codec_lock);
336 
337 	return ret;
338 }
339 
340 static int tas2781_amp_getvol(struct snd_kcontrol *kcontrol,
341 	struct snd_ctl_elem_value *ucontrol)
342 {
343 	struct tasdevice_priv *tas_priv = snd_kcontrol_chip(kcontrol);
344 	struct soc_mixer_control *mc =
345 		(struct soc_mixer_control *)kcontrol->private_value;
346 	int ret;
347 
348 	mutex_lock(&tas_priv->codec_lock);
349 
350 	ret = tasdevice_amp_getvol(tas_priv, ucontrol, mc);
351 
352 	dev_dbg(tas_priv->dev, "%s: kcontrol %s: %ld\n",
353 		__func__, kcontrol->id.name, ucontrol->value.integer.value[0]);
354 
355 	mutex_unlock(&tas_priv->codec_lock);
356 
357 	return ret;
358 }
359 
360 static int tas2781_amp_putvol(struct snd_kcontrol *kcontrol,
361 	struct snd_ctl_elem_value *ucontrol)
362 {
363 	struct tasdevice_priv *tas_priv = snd_kcontrol_chip(kcontrol);
364 	struct soc_mixer_control *mc =
365 		(struct soc_mixer_control *)kcontrol->private_value;
366 	int ret;
367 
368 	mutex_lock(&tas_priv->codec_lock);
369 
370 	dev_dbg(tas_priv->dev, "%s: kcontrol %s: -> %ld\n",
371 		__func__, kcontrol->id.name, ucontrol->value.integer.value[0]);
372 
373 	/* The check of the given value is in tasdevice_amp_putvol. */
374 	ret = tasdevice_amp_putvol(tas_priv, ucontrol, mc);
375 
376 	mutex_unlock(&tas_priv->codec_lock);
377 
378 	return ret;
379 }
380 
381 static int tas2781_force_fwload_get(struct snd_kcontrol *kcontrol,
382 	struct snd_ctl_elem_value *ucontrol)
383 {
384 	struct tasdevice_priv *tas_priv = snd_kcontrol_chip(kcontrol);
385 
386 	mutex_lock(&tas_priv->codec_lock);
387 
388 	ucontrol->value.integer.value[0] = (int)tas_priv->force_fwload_status;
389 	dev_dbg(tas_priv->dev, "%s: kcontrol %s: %d\n",
390 		__func__, kcontrol->id.name, tas_priv->force_fwload_status);
391 
392 	mutex_unlock(&tas_priv->codec_lock);
393 
394 	return 0;
395 }
396 
397 static int tas2781_force_fwload_put(struct snd_kcontrol *kcontrol,
398 	struct snd_ctl_elem_value *ucontrol)
399 {
400 	struct tasdevice_priv *tas_priv = snd_kcontrol_chip(kcontrol);
401 	bool change, val = (bool)ucontrol->value.integer.value[0];
402 
403 	mutex_lock(&tas_priv->codec_lock);
404 
405 	dev_dbg(tas_priv->dev, "%s: kcontrol %s: %d -> %d\n",
406 		__func__, kcontrol->id.name,
407 		tas_priv->force_fwload_status, val);
408 
409 	if (tas_priv->force_fwload_status == val)
410 		change = false;
411 	else {
412 		change = true;
413 		tas_priv->force_fwload_status = val;
414 	}
415 
416 	mutex_unlock(&tas_priv->codec_lock);
417 
418 	return change;
419 }
420 
421 static const struct snd_kcontrol_new tas2781_snd_controls[] = {
422 	ACARD_SINGLE_RANGE_EXT_TLV("Speaker Analog Gain", TAS2781_AMP_LEVEL,
423 		1, 0, 20, 0, tas2781_amp_getvol,
424 		tas2781_amp_putvol, amp_vol_tlv),
425 	ACARD_SINGLE_BOOL_EXT("Speaker Force Firmware Load", 0,
426 		tas2781_force_fwload_get, tas2781_force_fwload_put),
427 };
428 
429 static const struct snd_kcontrol_new tas2781_prof_ctrl = {
430 	.name = "Speaker Profile Id",
431 	.iface = SNDRV_CTL_ELEM_IFACE_CARD,
432 	.info = tasdevice_info_profile,
433 	.get = tasdevice_get_profile_id,
434 	.put = tasdevice_set_profile_id,
435 };
436 
437 static const struct snd_kcontrol_new tas2781_dsp_prog_ctrl = {
438 	.name = "Speaker Program Id",
439 	.iface = SNDRV_CTL_ELEM_IFACE_CARD,
440 	.info = tasdevice_info_programs,
441 	.get = tasdevice_program_get,
442 	.put = tasdevice_program_put,
443 };
444 
445 static const struct snd_kcontrol_new tas2781_dsp_conf_ctrl = {
446 	.name = "Speaker Config Id",
447 	.iface = SNDRV_CTL_ELEM_IFACE_CARD,
448 	.info = tasdevice_info_config,
449 	.get = tasdevice_config_get,
450 	.put = tasdevice_config_put,
451 };
452 
453 static void tas2563_apply_calib(struct tasdevice_priv *tas_priv)
454 {
455 	int offset = 0;
456 	__be32 data;
457 	int ret;
458 
459 	for (int i = 0; i < tas_priv->ndev; i++) {
460 		for (int j = 0; j < TAS2563_CAL_N; ++j) {
461 			data = cpu_to_be32(
462 				*(uint32_t *)&tas_priv->cali_data.data[offset]);
463 			ret = tasdevice_dev_bulk_write(tas_priv, i, cal_regs[j],
464 				(unsigned char *)&data, TAS2563_CAL_DATA_SIZE);
465 			if (ret)
466 				dev_err(tas_priv->dev,
467 					"Error writing calib regs\n");
468 			offset += TAS2563_CAL_DATA_SIZE;
469 		}
470 	}
471 }
472 
473 static int tas2563_save_calibration(struct tasdevice_priv *tas_priv)
474 {
475 	static efi_guid_t efi_guid = EFI_GUID(0x1f52d2a1, 0xbb3a, 0x457d, 0xbc,
476 		0x09, 0x43, 0xa3, 0xf4, 0x31, 0x0a, 0x92);
477 
478 	static efi_char16_t *efi_vars[TAS2563_MAX_CHANNELS][TAS2563_CAL_N] = {
479 		{ L"Power_1", L"R0_1", L"InvR0_1", L"R0_Low_1", L"TLim_1" },
480 		{ L"Power_2", L"R0_2", L"InvR0_2", L"R0_Low_2", L"TLim_2" },
481 		{ L"Power_3", L"R0_3", L"InvR0_3", L"R0_Low_3", L"TLim_3" },
482 		{ L"Power_4", L"R0_4", L"InvR0_4", L"R0_Low_4", L"TLim_4" },
483 	};
484 
485 	unsigned long max_size = TAS2563_CAL_DATA_SIZE;
486 	unsigned int offset = 0;
487 	efi_status_t status;
488 	unsigned int attr;
489 
490 	tas_priv->cali_data.data = devm_kzalloc(tas_priv->dev,
491 			TAS2563_CAL_ARRAY_SIZE, GFP_KERNEL);
492 	if (!tas_priv->cali_data.data)
493 		return -ENOMEM;
494 
495 	for (int i = 0; i < tas_priv->ndev; ++i) {
496 		for (int j = 0; j < TAS2563_CAL_N; ++j) {
497 			status = efi.get_variable(efi_vars[i][j],
498 				&efi_guid, &attr, &max_size,
499 				&tas_priv->cali_data.data[offset]);
500 			if (status != EFI_SUCCESS ||
501 				max_size != TAS2563_CAL_DATA_SIZE) {
502 				dev_warn(tas_priv->dev,
503 				"Calibration data read failed %ld\n", status);
504 				return -EINVAL;
505 			}
506 			offset += TAS2563_CAL_DATA_SIZE;
507 		}
508 	}
509 
510 	tas_priv->cali_data.total_sz = offset;
511 	tasdevice_apply_calibration(tas_priv);
512 
513 	return 0;
514 }
515 
516 static void tas2781_apply_calib(struct tasdevice_priv *tas_priv)
517 {
518 	static const unsigned char page_array[CALIB_MAX] = {
519 		0x17, 0x18, 0x18, 0x13, 0x18,
520 	};
521 	static const unsigned char rgno_array[CALIB_MAX] = {
522 		0x74, 0x0c, 0x14, 0x70, 0x7c,
523 	};
524 	int offset = 0;
525 	int i, j, rc;
526 	__be32 data;
527 
528 	for (i = 0; i < tas_priv->ndev; i++) {
529 		for (j = 0; j < CALIB_MAX; j++) {
530 			data = cpu_to_be32(
531 				*(uint32_t *)&tas_priv->cali_data.data[offset]);
532 			rc = tasdevice_dev_bulk_write(tas_priv, i,
533 				TASDEVICE_REG(0, page_array[j], rgno_array[j]),
534 				(unsigned char *)&data, 4);
535 			if (rc < 0)
536 				dev_err(tas_priv->dev,
537 					"chn %d calib %d bulk_wr err = %d\n",
538 					i, j, rc);
539 			offset += 4;
540 		}
541 	}
542 }
543 
544 /* Update the calibration data, including speaker impedance, f0, etc, into algo.
545  * Calibrate data is done by manufacturer in the factory. These data are used
546  * by Algo for calculating the speaker temperature, speaker membrane excursion
547  * and f0 in real time during playback.
548  */
549 static int tas2781_save_calibration(struct tasdevice_priv *tas_priv)
550 {
551 	efi_guid_t efi_guid = EFI_GUID(0x02f9af02, 0x7734, 0x4233, 0xb4, 0x3d,
552 		0x93, 0xfe, 0x5a, 0xa3, 0x5d, 0xb3);
553 	static efi_char16_t efi_name[] = L"CALI_DATA";
554 	struct tm *tm = &tas_priv->tm;
555 	unsigned int attr, crc;
556 	unsigned int *tmp_val;
557 	efi_status_t status;
558 
559 	/* Lenovo devices */
560 	if (tas_priv->catlog_id == LENOVO)
561 		efi_guid = EFI_GUID(0x1f52d2a1, 0xbb3a, 0x457d, 0xbc, 0x09,
562 			0x43, 0xa3, 0xf4, 0x31, 0x0a, 0x92);
563 
564 	tas_priv->cali_data.total_sz = 0;
565 	/* Get real size of UEFI variable */
566 	status = efi.get_variable(efi_name, &efi_guid, &attr,
567 		&tas_priv->cali_data.total_sz, tas_priv->cali_data.data);
568 	if (status == EFI_BUFFER_TOO_SMALL) {
569 		/* Allocate data buffer of data_size bytes */
570 		tas_priv->cali_data.data = devm_kzalloc(tas_priv->dev,
571 			tas_priv->cali_data.total_sz, GFP_KERNEL);
572 		if (!tas_priv->cali_data.data)
573 			return -ENOMEM;
574 		/* Get variable contents into buffer */
575 		status = efi.get_variable(efi_name, &efi_guid, &attr,
576 			&tas_priv->cali_data.total_sz,
577 			tas_priv->cali_data.data);
578 	}
579 	if (status != EFI_SUCCESS)
580 		return -EINVAL;
581 
582 	tmp_val = (unsigned int *)tas_priv->cali_data.data;
583 
584 	crc = crc32(~0, tas_priv->cali_data.data, 84) ^ ~0;
585 	dev_dbg(tas_priv->dev, "cali crc 0x%08x PK tmp_val 0x%08x\n",
586 		crc, tmp_val[21]);
587 
588 	if (crc == tmp_val[21]) {
589 		time64_to_tm(tmp_val[20], 0, tm);
590 		dev_dbg(tas_priv->dev, "%4ld-%2d-%2d, %2d:%2d:%2d\n",
591 			tm->tm_year, tm->tm_mon, tm->tm_mday,
592 			tm->tm_hour, tm->tm_min, tm->tm_sec);
593 		tasdevice_apply_calibration(tas_priv);
594 	} else
595 		tas_priv->cali_data.total_sz = 0;
596 
597 	return 0;
598 }
599 
600 static void tas2781_hda_remove_controls(struct tas2781_hda *tas_hda)
601 {
602 	struct hda_codec *codec = tas_hda->priv->codec;
603 
604 	snd_ctl_remove(codec->card, tas_hda->dsp_prog_ctl);
605 	snd_ctl_remove(codec->card, tas_hda->dsp_conf_ctl);
606 
607 	for (int i = ARRAY_SIZE(tas_hda->snd_ctls) - 1; i >= 0; i--)
608 		snd_ctl_remove(codec->card, tas_hda->snd_ctls[i]);
609 
610 	snd_ctl_remove(codec->card, tas_hda->prof_ctl);
611 }
612 
613 static void tasdev_fw_ready(const struct firmware *fmw, void *context)
614 {
615 	struct tasdevice_priv *tas_priv = context;
616 	struct tas2781_hda *tas_hda = dev_get_drvdata(tas_priv->dev);
617 	struct hda_codec *codec = tas_priv->codec;
618 	int i, ret;
619 
620 	pm_runtime_get_sync(tas_priv->dev);
621 	mutex_lock(&tas_priv->codec_lock);
622 
623 	ret = tasdevice_rca_parser(tas_priv, fmw);
624 	if (ret)
625 		goto out;
626 
627 	tas_hda->prof_ctl = snd_ctl_new1(&tas2781_prof_ctrl, tas_priv);
628 	ret = snd_ctl_add(codec->card, tas_hda->prof_ctl);
629 	if (ret) {
630 		dev_err(tas_priv->dev,
631 			"Failed to add KControl %s = %d\n",
632 			tas2781_prof_ctrl.name, ret);
633 		goto out;
634 	}
635 
636 	for (i = 0; i < ARRAY_SIZE(tas2781_snd_controls); i++) {
637 		tas_hda->snd_ctls[i] = snd_ctl_new1(&tas2781_snd_controls[i],
638 			tas_priv);
639 		ret = snd_ctl_add(codec->card, tas_hda->snd_ctls[i]);
640 		if (ret) {
641 			dev_err(tas_priv->dev,
642 				"Failed to add KControl %s = %d\n",
643 				tas2781_snd_controls[i].name, ret);
644 			goto out;
645 		}
646 	}
647 
648 	tasdevice_dsp_remove(tas_priv);
649 
650 	tas_priv->fw_state = TASDEVICE_DSP_FW_PENDING;
651 	scnprintf(tas_priv->coef_binaryname, 64, "TAS2XXX%04X.bin",
652 		codec->core.subsystem_id & 0xffff);
653 	ret = tasdevice_dsp_parser(tas_priv);
654 	if (ret) {
655 		dev_err(tas_priv->dev, "dspfw load %s error\n",
656 			tas_priv->coef_binaryname);
657 		tas_priv->fw_state = TASDEVICE_DSP_FW_FAIL;
658 		goto out;
659 	}
660 
661 	tas_hda->dsp_prog_ctl = snd_ctl_new1(&tas2781_dsp_prog_ctrl,
662 		tas_priv);
663 	ret = snd_ctl_add(codec->card, tas_hda->dsp_prog_ctl);
664 	if (ret) {
665 		dev_err(tas_priv->dev,
666 			"Failed to add KControl %s = %d\n",
667 			tas2781_dsp_prog_ctrl.name, ret);
668 		goto out;
669 	}
670 
671 	tas_hda->dsp_conf_ctl = snd_ctl_new1(&tas2781_dsp_conf_ctrl,
672 		tas_priv);
673 	ret = snd_ctl_add(codec->card, tas_hda->dsp_conf_ctl);
674 	if (ret) {
675 		dev_err(tas_priv->dev,
676 			"Failed to add KControl %s = %d\n",
677 			tas2781_dsp_conf_ctrl.name, ret);
678 		goto out;
679 	}
680 
681 	tas_priv->fw_state = TASDEVICE_DSP_FW_ALL_OK;
682 	tasdevice_prmg_load(tas_priv, 0);
683 	if (tas_priv->fmw->nr_programs > 0)
684 		tas_priv->cur_prog = 0;
685 	if (tas_priv->fmw->nr_configurations > 0)
686 		tas_priv->cur_conf = 0;
687 
688 	/* If calibrated data occurs error, dsp will still works with default
689 	 * calibrated data inside algo.
690 	 */
691 	tasdevice_save_calibration(tas_priv);
692 
693 	tasdevice_tuning_switch(tas_hda->priv, 0);
694 	tas_hda->priv->playback_started = true;
695 
696 out:
697 	mutex_unlock(&tas_hda->priv->codec_lock);
698 	if (fmw)
699 		release_firmware(fmw);
700 	pm_runtime_mark_last_busy(tas_hda->dev);
701 	pm_runtime_put_autosuspend(tas_hda->dev);
702 }
703 
704 static int tas2781_hda_bind(struct device *dev, struct device *master,
705 	void *master_data)
706 {
707 	struct tas2781_hda *tas_hda = dev_get_drvdata(dev);
708 	struct hda_component_parent *parent = master_data;
709 	struct hda_component *comp;
710 	struct hda_codec *codec;
711 	unsigned int subid;
712 	int ret;
713 
714 	comp = hda_component_from_index(parent, tas_hda->priv->index);
715 	if (!comp)
716 		return -EINVAL;
717 
718 	if (comp->dev)
719 		return -EBUSY;
720 
721 	codec = parent->codec;
722 	subid = codec->core.subsystem_id >> 16;
723 
724 	switch (subid) {
725 	case 0x17aa:
726 		tas_hda->priv->catlog_id = LENOVO;
727 		break;
728 	default:
729 		tas_hda->priv->catlog_id = OTHERS;
730 		break;
731 	}
732 
733 	pm_runtime_get_sync(dev);
734 
735 	comp->dev = dev;
736 
737 	strscpy(comp->name, dev_name(dev), sizeof(comp->name));
738 
739 	ret = tascodec_init(tas_hda->priv, codec, THIS_MODULE, tasdev_fw_ready);
740 	if (!ret)
741 		comp->playback_hook = tas2781_hda_playback_hook;
742 
743 	pm_runtime_mark_last_busy(dev);
744 	pm_runtime_put_autosuspend(dev);
745 
746 	return ret;
747 }
748 
749 static void tas2781_hda_unbind(struct device *dev,
750 	struct device *master, void *master_data)
751 {
752 	struct tas2781_hda *tas_hda = dev_get_drvdata(dev);
753 	struct hda_component_parent *parent = master_data;
754 	struct hda_component *comp;
755 
756 	comp = hda_component_from_index(parent, tas_hda->priv->index);
757 	if (comp && (comp->dev == dev)) {
758 		comp->dev = NULL;
759 		memset(comp->name, 0, sizeof(comp->name));
760 		comp->playback_hook = NULL;
761 	}
762 
763 	tas2781_hda_remove_controls(tas_hda);
764 
765 	tasdevice_config_info_remove(tas_hda->priv);
766 	tasdevice_dsp_remove(tas_hda->priv);
767 
768 	tas_hda->priv->fw_state = TASDEVICE_DSP_FW_PENDING;
769 }
770 
771 static const struct component_ops tas2781_hda_comp_ops = {
772 	.bind = tas2781_hda_bind,
773 	.unbind = tas2781_hda_unbind,
774 };
775 
776 static void tas2781_hda_remove(struct device *dev)
777 {
778 	struct tas2781_hda *tas_hda = dev_get_drvdata(dev);
779 
780 	component_del(tas_hda->dev, &tas2781_hda_comp_ops);
781 
782 	pm_runtime_get_sync(tas_hda->dev);
783 	pm_runtime_disable(tas_hda->dev);
784 
785 	pm_runtime_put_noidle(tas_hda->dev);
786 
787 	tasdevice_remove(tas_hda->priv);
788 }
789 
790 static int tas2781_hda_i2c_probe(struct i2c_client *clt)
791 {
792 	struct tas2781_hda *tas_hda;
793 	const char *device_name;
794 	int ret;
795 
796 
797 	tas_hda = devm_kzalloc(&clt->dev, sizeof(*tas_hda), GFP_KERNEL);
798 	if (!tas_hda)
799 		return -ENOMEM;
800 
801 	dev_set_drvdata(&clt->dev, tas_hda);
802 	tas_hda->dev = &clt->dev;
803 
804 	tas_hda->priv = tasdevice_kzalloc(clt);
805 	if (!tas_hda->priv)
806 		return -ENOMEM;
807 
808 	if (strstr(dev_name(&clt->dev), "TIAS2781")) {
809 		device_name = "TIAS2781";
810 		tas_hda->priv->save_calibration = tas2781_save_calibration;
811 		tas_hda->priv->apply_calibration = tas2781_apply_calib;
812 		tas_hda->priv->global_addr = TAS2781_GLOBAL_ADDR;
813 	} else if (strstr(dev_name(&clt->dev), "INT8866")) {
814 		device_name = "INT8866";
815 		tas_hda->priv->save_calibration = tas2563_save_calibration;
816 		tas_hda->priv->apply_calibration = tas2563_apply_calib;
817 		tas_hda->priv->global_addr = TAS2563_GLOBAL_ADDR;
818 	} else
819 		return -ENODEV;
820 
821 	tas_hda->priv->irq = clt->irq;
822 	ret = tas2781_read_acpi(tas_hda->priv, device_name);
823 	if (ret)
824 		return dev_err_probe(tas_hda->dev, ret,
825 			"Platform not supported\n");
826 
827 	ret = tasdevice_init(tas_hda->priv);
828 	if (ret)
829 		goto err;
830 
831 	pm_runtime_set_autosuspend_delay(tas_hda->dev, 3000);
832 	pm_runtime_use_autosuspend(tas_hda->dev);
833 	pm_runtime_mark_last_busy(tas_hda->dev);
834 	pm_runtime_set_active(tas_hda->dev);
835 	pm_runtime_enable(tas_hda->dev);
836 
837 	tasdevice_reset(tas_hda->priv);
838 
839 	ret = component_add(tas_hda->dev, &tas2781_hda_comp_ops);
840 	if (ret) {
841 		dev_err(tas_hda->dev, "Register component failed: %d\n", ret);
842 		pm_runtime_disable(tas_hda->dev);
843 	}
844 
845 err:
846 	if (ret)
847 		tas2781_hda_remove(&clt->dev);
848 	return ret;
849 }
850 
851 static void tas2781_hda_i2c_remove(struct i2c_client *clt)
852 {
853 	tas2781_hda_remove(&clt->dev);
854 }
855 
856 static int tas2781_runtime_suspend(struct device *dev)
857 {
858 	struct tas2781_hda *tas_hda = dev_get_drvdata(dev);
859 
860 	dev_dbg(tas_hda->dev, "Runtime Suspend\n");
861 
862 	mutex_lock(&tas_hda->priv->codec_lock);
863 
864 	/* The driver powers up the amplifiers at module load time.
865 	 * Stop the playback if it's unused.
866 	 */
867 	if (tas_hda->priv->playback_started) {
868 		tasdevice_tuning_switch(tas_hda->priv, 1);
869 		tas_hda->priv->playback_started = false;
870 	}
871 
872 	mutex_unlock(&tas_hda->priv->codec_lock);
873 
874 	return 0;
875 }
876 
877 static int tas2781_runtime_resume(struct device *dev)
878 {
879 	struct tas2781_hda *tas_hda = dev_get_drvdata(dev);
880 
881 	dev_dbg(tas_hda->dev, "Runtime Resume\n");
882 
883 	mutex_lock(&tas_hda->priv->codec_lock);
884 
885 	tasdevice_prmg_load(tas_hda->priv, tas_hda->priv->cur_prog);
886 
887 	/* If calibrated data occurs error, dsp will still works with default
888 	 * calibrated data inside algo.
889 	 */
890 	tasdevice_apply_calibration(tas_hda->priv);
891 
892 	mutex_unlock(&tas_hda->priv->codec_lock);
893 
894 	return 0;
895 }
896 
897 static int tas2781_system_suspend(struct device *dev)
898 {
899 	struct tas2781_hda *tas_hda = dev_get_drvdata(dev);
900 
901 	dev_dbg(tas_hda->priv->dev, "System Suspend\n");
902 
903 	mutex_lock(&tas_hda->priv->codec_lock);
904 
905 	/* Shutdown chip before system suspend */
906 	if (tas_hda->priv->playback_started)
907 		tasdevice_tuning_switch(tas_hda->priv, 1);
908 
909 	mutex_unlock(&tas_hda->priv->codec_lock);
910 
911 	/*
912 	 * Reset GPIO may be shared, so cannot reset here.
913 	 * However beyond this point, amps may be powered down.
914 	 */
915 	return 0;
916 }
917 
918 static int tas2781_system_resume(struct device *dev)
919 {
920 	struct tas2781_hda *tas_hda = dev_get_drvdata(dev);
921 	int i;
922 
923 	dev_dbg(tas_hda->priv->dev, "System Resume\n");
924 
925 	mutex_lock(&tas_hda->priv->codec_lock);
926 
927 	for (i = 0; i < tas_hda->priv->ndev; i++) {
928 		tas_hda->priv->tasdevice[i].cur_book = -1;
929 		tas_hda->priv->tasdevice[i].cur_prog = -1;
930 		tas_hda->priv->tasdevice[i].cur_conf = -1;
931 	}
932 	tasdevice_reset(tas_hda->priv);
933 	tasdevice_prmg_load(tas_hda->priv, tas_hda->priv->cur_prog);
934 
935 	/* If calibrated data occurs error, dsp will still work with default
936 	 * calibrated data inside algo.
937 	 */
938 	tasdevice_apply_calibration(tas_hda->priv);
939 
940 	if (tas_hda->priv->playback_started)
941 		tasdevice_tuning_switch(tas_hda->priv, 0);
942 
943 	mutex_unlock(&tas_hda->priv->codec_lock);
944 
945 	return 0;
946 }
947 
948 static const struct dev_pm_ops tas2781_hda_pm_ops = {
949 	RUNTIME_PM_OPS(tas2781_runtime_suspend, tas2781_runtime_resume, NULL)
950 	SYSTEM_SLEEP_PM_OPS(tas2781_system_suspend, tas2781_system_resume)
951 };
952 
953 static const struct i2c_device_id tas2781_hda_i2c_id[] = {
954 	{ "tas2781-hda" },
955 	{}
956 };
957 
958 static const struct acpi_device_id tas2781_acpi_hda_match[] = {
959 	{"TIAS2781", 0 },
960 	{"INT8866", 0 },
961 	{}
962 };
963 MODULE_DEVICE_TABLE(acpi, tas2781_acpi_hda_match);
964 
965 static struct i2c_driver tas2781_hda_i2c_driver = {
966 	.driver = {
967 		.name		= "tas2781-hda",
968 		.acpi_match_table = tas2781_acpi_hda_match,
969 		.pm		= &tas2781_hda_pm_ops,
970 	},
971 	.id_table	= tas2781_hda_i2c_id,
972 	.probe		= tas2781_hda_i2c_probe,
973 	.remove		= tas2781_hda_i2c_remove,
974 };
975 module_i2c_driver(tas2781_hda_i2c_driver);
976 
977 MODULE_DESCRIPTION("TAS2781 HDA Driver");
978 MODULE_AUTHOR("Shenghao Ding, TI, <shenghao-ding@ti.com>");
979 MODULE_LICENSE("GPL");
980 MODULE_IMPORT_NS(SND_SOC_TAS2781_FMWLIB);
981