Lines Matching +full:comp +full:- +full:disable
1 // SPDX-License-Identifier: GPL-2.0-only
17 #include <sound/cs-amp-lib.h>
29 * ASP1_DOUT_HIZ_CONTROL = Hi-Z during unused timeslots
34 * Override any Windows-specific mixer settings applied by the firmware.
55 flush_work(&cs35l56->dsp_work);
65 pm_runtime_get_sync(cs35l56->base.dev);
66 ret = cs35l56_mbox_send(&cs35l56->base, CS35L56_MBOX_CMD_AUDIO_PLAY);
69 ret = regmap_read_poll_timeout(cs35l56->base.regmap,
70 cs35l56->base.fw_reg->transducer_actual_ps,
75 dev_warn(cs35l56->base.dev, "PS0 wait failed: %d\n", ret);
77 regmap_set_bits(cs35l56->base.regmap, CS35L56_ASP1_ENABLES1,
79 cs35l56->asp_tx_mask);
80 cs35l56->playing = true;
85 cs35l56->playing = false;
86 cs35l56_mbox_send(&cs35l56->base, CS35L56_MBOX_CMD_AUDIO_PAUSE);
87 regmap_clear_bits(cs35l56->base.regmap, CS35L56_ASP1_ENABLES1,
92 pm_runtime_put_autosuspend(cs35l56->base.dev);
99 dev_dbg(cs35l56->base.dev, "%s()%d: action: %d\n", __func__, __LINE__, action);
103 if (cs35l56->playing)
107 if (cs35l56->suspended) {
108 cs35l56->playing = true;
115 if (!cs35l56->playing)
129 if (cs35l56->cs_dsp.booted)
130 cs_dsp_stop(&cs35l56->cs_dsp);
132 return cs35l56_runtime_suspend_common(&cs35l56->base);
140 ret = cs35l56_runtime_resume_common(&cs35l56->base, false);
144 if (cs35l56->cs_dsp.booted) {
145 ret = cs_dsp_run(&cs35l56->cs_dsp);
147 dev_dbg(cs35l56->base.dev, "%s: cs_dsp_run ret %d\n", __func__, ret);
155 cs35l56_mbox_send(&cs35l56->base, CS35L56_MBOX_CMD_ALLOW_AUTO_HIBERNATE);
156 regmap_write(cs35l56->base.regmap, CS35L56_DSP_VIRTUAL1_MBOX_1,
159 regcache_cache_only(cs35l56->base.regmap, true);
167 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
168 uinfo->count = 1;
169 uinfo->value.enumerated.items = CS35L56_NUM_INPUT_SRC;
170 if (uinfo->value.enumerated.item >= CS35L56_NUM_INPUT_SRC)
171 uinfo->value.enumerated.item = CS35L56_NUM_INPUT_SRC - 1;
172 strscpy(uinfo->value.enumerated.name, cs35l56_tx_input_texts[uinfo->value.enumerated.item],
173 sizeof(uinfo->value.enumerated.name));
187 regmap_read(cs35l56->base.regmap, kcontrol->private_value, ®_val);
192 ucontrol->value.enumerated.item[0] = i;
204 unsigned int item = ucontrol->value.enumerated.item[0];
208 return -EINVAL;
212 regmap_update_bits_check(cs35l56->base.regmap, kcontrol->private_value,
222 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
223 uinfo->count = 1;
224 uinfo->value.integer.min = CS35L56_MAIN_POSTURE_MIN;
225 uinfo->value.integer.max = CS35L56_MAIN_POSTURE_MAX;
238 ret = regmap_read(cs35l56->base.regmap,
239 cs35l56->base.fw_reg->posture_number, &pos);
243 ucontrol->value.integer.value[0] = pos;
252 unsigned long pos = ucontrol->value.integer.value[0];
258 return -EINVAL;
262 ret = regmap_update_bits_check(cs35l56->base.regmap, cs35l56->base.fw_reg->posture_number,
280 static const DECLARE_TLV_DB_SCALE(cs35l56_hda_vol_tlv, -10000, 25, 0);
285 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
286 uinfo->count = 1;
287 uinfo->value.integer.step = 1;
288 uinfo->value.integer.min = 0;
289 uinfo->value.integer.max = CS35L56_MAIN_RENDER_USER_VOLUME_MAX -
305 ret = regmap_read(cs35l56->base.regmap, cs35l56->base.fw_reg->user_volume, &raw_vol);
314 vol |= ~((int)(BIT(CS35L56_MAIN_RENDER_USER_VOLUME_SIGNBIT) - 1));
316 ucontrol->value.integer.value[0] = vol - CS35L56_MAIN_RENDER_USER_VOLUME_MIN;
325 long vol = ucontrol->value.integer.value[0];
330 if ((vol < 0) || (vol > (CS35L56_MAIN_RENDER_USER_VOLUME_MAX -
332 return -EINVAL;
339 ret = regmap_update_bits_check(cs35l56->base.regmap, cs35l56->base.fw_reg->user_volume,
359 snprintf(name, sizeof(name), "%s Posture Number", cs35l56->amp_name);
361 cs35l56->posture_ctl = snd_ctl_new1(&ctl_template, cs35l56);
362 if (snd_ctl_add(cs35l56->codec->card, cs35l56->posture_ctl))
363 dev_err(cs35l56->base.dev, "Failed to add KControl: %s\n", ctl_template.name);
370 BUILD_BUG_ON(ARRAY_SIZE(cs35l56->mixer_ctl) != ARRAY_SIZE(cs35l56_hda_mixer_controls));
373 snprintf(name, sizeof(name), "%s %s", cs35l56->amp_name,
376 cs35l56->mixer_ctl[i] = snd_ctl_new1(&ctl_template, cs35l56);
377 if (snd_ctl_add(cs35l56->codec->card, cs35l56->mixer_ctl[i])) {
378 dev_err(cs35l56->base.dev, "Failed to add KControl: %s\n",
388 snprintf(name, sizeof(name), "%s Speaker Playback Volume", cs35l56->amp_name);
390 cs35l56->volume_ctl = snd_ctl_new1(&ctl_template, cs35l56);
391 if (snd_ctl_add(cs35l56->codec->card, cs35l56->volume_ctl))
392 dev_err(cs35l56->base.dev, "Failed to add KControl: %s\n", ctl_template.name);
399 for (i = ARRAY_SIZE(cs35l56->mixer_ctl) - 1; i >= 0; i--)
400 snd_ctl_remove(cs35l56->codec->card, cs35l56->mixer_ctl[i]);
402 snd_ctl_remove(cs35l56->codec->card, cs35l56->posture_ctl);
403 snd_ctl_remove(cs35l56->codec->card, cs35l56->volume_ctl);
420 *filename = kasprintf(GFP_KERNEL, "%s-%s-%s.%s", base_name,
423 *filename = kasprintf(GFP_KERNEL, "%s-%s.%s", base_name,
429 return -ENOMEM;
432 * Make sure that filename is lower-case and any non alpha-numeric
442 *s = '-';
446 ret = firmware_request_nowarn(firmware, *filename, cs35l56->base.dev);
448 dev_dbg(cs35l56->base.dev, "Failed to request '%s'\n", *filename);
454 dev_dbg(cs35l56->base.dev, "Found '%s'\n", *filename);
466 const char *system_name = cs35l56->system_name;
467 const char *amp_name = cs35l56->amp_name;
473 "cirrus/cs35l%02x-%02x%s-%06x-dsp1-misc",
474 cs35l56->base.type,
475 cs35l56->base.rev,
476 cs35l56->base.secured ? "-s" : "",
480 "cirrus/cs35l%02x-%02x%s-dsp1-misc",
481 cs35l56->base.type,
482 cs35l56->base.rev,
483 cs35l56->base.secured ? "-s" : "");
512 * Check for system-specific bin files without wmfw before
555 if (!cs35l56->base.cal_data_valid || cs35l56->base.secured)
558 ret = cs_amp_write_cal_coeffs(&cs35l56->cs_dsp,
560 &cs35l56->base.cal_data);
562 dev_warn(cs35l56->base.dev, "Failed to write calibration: %d\n", ret);
564 dev_info(cs35l56->base.dev, "Calibration applied\n");
578 * Prepare for a new DSP power-up. If the DSP has had firmware
582 if (cs35l56->base.fw_patched)
583 cs_dsp_power_down(&cs35l56->cs_dsp);
585 cs35l56->base.fw_patched = false;
587 ret = pm_runtime_resume_and_get(cs35l56->base.dev);
589 dev_err(cs35l56->base.dev, "Failed to resume and get %d\n", ret);
595 * from the built-in ROM. If not, the wmfw/bin must be for the
598 ret = cs35l56_read_prot_status(&cs35l56->base, &firmware_missing, &preloaded_fw_ver);
614 dev_err(cs35l56->base.dev, ".bin file required but not found\n");
618 mutex_lock(&cs35l56->base.irq_lock);
627 ret = cs35l56_firmware_shutdown(&cs35l56->base);
632 ret = cs_dsp_power_up(&cs35l56->cs_dsp, wmfw_firmware, wmfw_filename,
635 dev_dbg(cs35l56->base.dev, "%s: cs_dsp_power_up ret %d\n", __func__, ret);
640 dev_dbg(cs35l56->base.dev, "Loaded WMFW Firmware: %s\n", wmfw_filename);
643 dev_dbg(cs35l56->base.dev, "Loaded Coefficients: %s\n", coeff_filename);
647 cs35l56_system_reset(&cs35l56->base, false);
648 regcache_mark_dirty(cs35l56->base.regmap);
649 ret = cs35l56_wait_for_firmware_boot(&cs35l56->base);
653 regcache_cache_only(cs35l56->base.regmap, false);
656 /* Disable auto-hibernate so that runtime_pm has control */
657 ret = cs35l56_mbox_send(&cs35l56->base, CS35L56_MBOX_CMD_PREVENT_AUTO_HIBERNATE);
661 regcache_sync(cs35l56->base.regmap);
663 regmap_clear_bits(cs35l56->base.regmap,
664 cs35l56->base.fw_reg->prot_sts,
666 cs35l56->base.fw_patched = true;
668 ret = cs_dsp_run(&cs35l56->cs_dsp);
670 dev_dbg(cs35l56->base.dev, "%s: cs_dsp_run ret %d\n", __func__, ret);
673 ret = cs35l56_mbox_send(&cs35l56->base, CS35L56_MBOX_CMD_AUDIO_REINIT);
675 cs_dsp_stop(&cs35l56->cs_dsp);
677 cs35l56_log_tuning(&cs35l56->base, &cs35l56->cs_dsp);
680 if (!cs35l56->base.fw_patched)
681 cs_dsp_power_down(&cs35l56->cs_dsp);
683 mutex_unlock(&cs35l56->base.irq_lock);
688 pm_runtime_put(cs35l56->base.dev);
702 struct hda_component *comp;
704 comp = hda_component_from_index(parent, cs35l56->index);
705 if (!comp)
706 return -EINVAL;
708 if (comp->dev)
709 return -EBUSY;
711 comp->dev = dev;
712 cs35l56->codec = parent->codec;
713 strscpy(comp->name, dev_name(dev), sizeof(comp->name));
714 comp->playback_hook = cs35l56_hda_playback_hook;
716 queue_work(system_long_wq, &cs35l56->dsp_work);
721 cs35l56->debugfs_root = debugfs_create_dir(dev_name(cs35l56->base.dev), sound_debugfs_root);
722 cs_dsp_init_debugfs(&cs35l56->cs_dsp, cs35l56->debugfs_root);
725 dev_dbg(cs35l56->base.dev, "Bound\n");
734 struct hda_component *comp;
736 cancel_work_sync(&cs35l56->dsp_work);
741 cs_dsp_cleanup_debugfs(&cs35l56->cs_dsp);
742 debugfs_remove_recursive(cs35l56->debugfs_root);
745 if (cs35l56->base.fw_patched)
746 cs_dsp_power_down(&cs35l56->cs_dsp);
748 comp = hda_component_from_index(parent, cs35l56->index);
749 if (comp && (comp->dev == dev))
750 memset(comp, 0, sizeof(*comp));
752 cs35l56->codec = NULL;
754 dev_dbg(cs35l56->base.dev, "Unbound\n");
768 if (cs35l56->playing)
771 cs35l56->suspended = true;
779 if (cs35l56->base.irq)
780 disable_irq(cs35l56->base.irq);
793 if (cs35l56->base.reset_gpio) {
794 gpiod_set_value_cansleep(cs35l56->base.reset_gpio, 0);
805 /* Handlers are now disabled so the parent IRQ can safely be re-enabled. */
806 if (cs35l56->base.irq)
807 enable_irq(cs35l56->base.irq);
823 if (cs35l56->base.irq)
824 disable_irq(cs35l56->base.irq);
833 /* Ensure a spec-compliant RESET pulse. */
834 if (cs35l56->base.reset_gpio) {
835 gpiod_set_value_cansleep(cs35l56->base.reset_gpio, 0);
839 gpiod_set_value_cansleep(cs35l56->base.reset_gpio, 1);
851 /* Undo pm_runtime_force_suspend() before re-enabling the irq */
853 if (cs35l56->base.irq)
854 enable_irq(cs35l56->base.irq);
859 cs35l56->suspended = false;
861 if (!cs35l56->codec)
864 ret = cs35l56_is_fw_reload_needed(&cs35l56->base);
865 dev_dbg(cs35l56->base.dev, "fw_reload_needed: %d\n", ret);
867 queue_work(system_long_wq, &cs35l56->dsp_work);
869 if (cs35l56->playing)
877 /* The cirrus,dev-index property has the wrong values */
880 cs35l56->index = 1;
883 cs35l56->index = 0;
886 /* There is a pseudo-address for broadcast to both amps - ignore it */
887 dev_dbg(cs35l56->base.dev, "Ignoring I2C address %#x\n", *bus_addr);
912 dev_dbg(cs35l56->base.dev, "Applying fixup for %s\n",
932 * the serial-multi-instantiate driver, so lookup the node by HID
934 if (!ACPI_COMPANION(cs35l56->base.dev)) {
936 adev = acpi_dev_get_first_match_dev(hid_string, NULL, -1);
938 dev_err(cs35l56->base.dev, "Failed to find an ACPI device for %s\n",
939 dev_name(cs35l56->base.dev));
940 return -ENODEV;
942 ACPI_COMPANION_SET(cs35l56->base.dev, adev);
946 cs35l56->index = -1;
948 sub = acpi_get_subsystem_id(ACPI_HANDLE(cs35l56->base.dev));
953 if (cs35l56->index == -1) {
954 property = "cirrus,dev-index";
955 ret = device_property_count_u32(cs35l56->base.dev, property);
960 ret = -EINVAL;
965 ret = device_property_read_u32_array(cs35l56->base.dev, property, values, nval);
971 cs35l56->index = i;
980 if (cs35l56->index == -1) {
981 dev_dbg(cs35l56->base.dev, "No index found in %s\n", property);
982 ret = -ENODEV;
988 dev_info(cs35l56->base.dev,
992 ret = cirrus_scodec_get_speaker_id(cs35l56->base.dev, cs35l56->index, nval, -1);
993 if (ret == -ENOENT) {
994 cs35l56->system_name = sub;
996 cs35l56->system_name = kasprintf(GFP_KERNEL, "%s-spkid%d", sub, ret);
998 if (!cs35l56->system_name)
999 return -ENOMEM;
1005 cs35l56->base.reset_gpio = devm_gpiod_get_index_optional(cs35l56->base.dev,
1007 cs35l56->index,
1009 if (IS_ERR(cs35l56->base.reset_gpio)) {
1010 ret = PTR_ERR(cs35l56->base.reset_gpio);
1016 if (ret != -EBUSY)
1017 return dev_err_probe(cs35l56->base.dev, ret, "Failed to get reset GPIO\n");
1019 dev_info(cs35l56->base.dev, "Reset GPIO busy, assume shared reset\n");
1020 cs35l56->base.reset_gpio = NULL;
1026 if (ret != -ENODEV)
1027 dev_err(cs35l56->base.dev, "Failed property %s: %d\n", property, ret);
1036 mutex_init(&cs35l56->base.irq_lock);
1037 dev_set_drvdata(cs35l56->base.dev, cs35l56);
1039 INIT_WORK(&cs35l56->dsp_work, cs35l56_hda_dsp_work);
1045 cs35l56->amp_name = devm_kasprintf(cs35l56->base.dev, GFP_KERNEL, "AMP%d",
1046 cs35l56->index + 1);
1047 if (!cs35l56->amp_name) {
1048 ret = -ENOMEM;
1052 cs35l56->base.type = hid & 0xff;
1053 cs35l56->base.cal_index = -1;
1055 cs35l56_init_cs_dsp(&cs35l56->base, &cs35l56->cs_dsp);
1056 cs35l56->cs_dsp.client_ops = &cs35l56_hda_client_ops;
1058 if (cs35l56->base.reset_gpio) {
1059 dev_dbg(cs35l56->base.dev, "Hard reset\n");
1065 gpiod_set_value_cansleep(cs35l56->base.reset_gpio, 0);
1067 gpiod_set_value_cansleep(cs35l56->base.reset_gpio, 1);
1070 ret = cs35l56_hw_init(&cs35l56->base);
1075 cs35l56_system_reset(&cs35l56->base, false);
1076 ret = cs35l56_wait_for_firmware_boot(&cs35l56->base);
1080 regcache_cache_only(cs35l56->base.regmap, false);
1082 ret = cs35l56_set_patch(&cs35l56->base);
1086 regcache_mark_dirty(cs35l56->base.regmap);
1087 regcache_sync(cs35l56->base.regmap);
1089 /* Disable auto-hibernate so that runtime_pm has control */
1090 ret = cs35l56_mbox_send(&cs35l56->base, CS35L56_MBOX_CMD_PREVENT_AUTO_HIBERNATE);
1094 ret = cs35l56_get_calibration(&cs35l56->base);
1098 ret = cs_dsp_halo_init(&cs35l56->cs_dsp);
1100 dev_err_probe(cs35l56->base.dev, ret, "cs_dsp_halo_init failed\n");
1104 dev_info(cs35l56->base.dev, "DSP system name: '%s', amp name: '%s'\n",
1105 cs35l56->system_name, cs35l56->amp_name);
1107 regmap_multi_reg_write(cs35l56->base.regmap, cs35l56_hda_dai_config,
1114 cs35l56->asp_tx_mask = BIT(cs35l56->index);
1116 pm_runtime_set_autosuspend_delay(cs35l56->base.dev, 3000);
1117 pm_runtime_use_autosuspend(cs35l56->base.dev);
1118 pm_runtime_set_active(cs35l56->base.dev);
1119 pm_runtime_mark_last_busy(cs35l56->base.dev);
1120 pm_runtime_enable(cs35l56->base.dev);
1122 cs35l56->base.init_done = true;
1124 ret = component_add(cs35l56->base.dev, &cs35l56_hda_comp_ops);
1126 dev_err(cs35l56->base.dev, "Register component failed: %d\n", ret);
1133 pm_runtime_disable(cs35l56->base.dev);
1134 cs_dsp_remove(&cs35l56->cs_dsp);
1136 gpiod_set_value_cansleep(cs35l56->base.reset_gpio, 0);
1146 component_del(cs35l56->base.dev, &cs35l56_hda_comp_ops);
1148 pm_runtime_dont_use_autosuspend(cs35l56->base.dev);
1149 pm_runtime_get_sync(cs35l56->base.dev);
1150 pm_runtime_disable(cs35l56->base.dev);
1152 cs_dsp_remove(&cs35l56->cs_dsp);
1154 kfree(cs35l56->system_name);
1155 pm_runtime_put_noidle(cs35l56->base.dev);
1157 gpiod_set_value_cansleep(cs35l56->base.reset_gpio, 0);
1179 MODULE_FIRMWARE("cirrus/cs35l54-*.wmfw");
1180 MODULE_FIRMWARE("cirrus/cs35l54-*.bin");
1181 MODULE_FIRMWARE("cirrus/cs35l56-*.wmfw");
1182 MODULE_FIRMWARE("cirrus/cs35l56-*.bin");