Lines Matching defs:cs35l56

42 static void cs35l56_hda_play(struct cs35l56_hda *cs35l56)
47 pm_runtime_get_sync(cs35l56->base.dev);
48 ret = cs35l56_mbox_send(&cs35l56->base, CS35L56_MBOX_CMD_AUDIO_PLAY);
51 ret = regmap_read_poll_timeout(cs35l56->base.regmap,
57 dev_warn(cs35l56->base.dev, "PS0 wait failed: %d\n", ret);
59 regmap_set_bits(cs35l56->base.regmap, CS35L56_ASP1_ENABLES1,
61 cs35l56->asp_tx_mask);
62 cs35l56->playing = true;
65 static void cs35l56_hda_pause(struct cs35l56_hda *cs35l56)
67 cs35l56->playing = false;
68 cs35l56_mbox_send(&cs35l56->base, CS35L56_MBOX_CMD_AUDIO_PAUSE);
69 regmap_clear_bits(cs35l56->base.regmap, CS35L56_ASP1_ENABLES1,
74 pm_runtime_mark_last_busy(cs35l56->base.dev);
75 pm_runtime_put_autosuspend(cs35l56->base.dev);
80 struct cs35l56_hda *cs35l56 = dev_get_drvdata(dev);
82 dev_dbg(cs35l56->base.dev, "%s()%d: action: %d\n", __func__, __LINE__, action);
86 if (cs35l56->playing)
90 if (cs35l56->suspended) {
91 cs35l56->playing = true;
95 cs35l56_hda_play(cs35l56);
98 if (!cs35l56->playing)
101 cs35l56_hda_pause(cs35l56);
110 struct cs35l56_hda *cs35l56 = dev_get_drvdata(dev);
112 if (cs35l56->cs_dsp.booted)
113 cs_dsp_stop(&cs35l56->cs_dsp);
115 return cs35l56_runtime_suspend_common(&cs35l56->base);
120 struct cs35l56_hda *cs35l56 = dev_get_drvdata(dev);
123 ret = cs35l56_runtime_resume_common(&cs35l56->base, false);
127 if (cs35l56->cs_dsp.booted) {
128 ret = cs_dsp_run(&cs35l56->cs_dsp);
130 dev_dbg(cs35l56->base.dev, "%s: cs_dsp_run ret %d\n", __func__, ret);
138 cs35l56_mbox_send(&cs35l56->base, CS35L56_MBOX_CMD_ALLOW_AUTO_HIBERNATE);
139 regmap_write(cs35l56->base.regmap, CS35L56_DSP_VIRTUAL1_MBOX_1,
142 regcache_cache_only(cs35l56->base.regmap, true);
164 struct cs35l56_hda *cs35l56 = (struct cs35l56_hda *)kcontrol->private_data;
168 regmap_read(cs35l56->base.regmap, kcontrol->private_value, &reg_val);
184 struct cs35l56_hda *cs35l56 = (struct cs35l56_hda *)kcontrol->private_data;
191 regmap_update_bits_check(cs35l56->base.regmap, kcontrol->private_value,
211 struct cs35l56_hda *cs35l56 = (struct cs35l56_hda *)kcontrol->private_data;
215 ret = regmap_read(cs35l56->base.regmap, CS35L56_MAIN_POSTURE_NUMBER, &pos);
227 struct cs35l56_hda *cs35l56 = (struct cs35l56_hda *)kcontrol->private_data;
236 ret = regmap_update_bits_check(cs35l56->base.regmap,
274 struct cs35l56_hda *cs35l56 = (struct cs35l56_hda *)kcontrol->private_data;
279 ret = regmap_read(cs35l56->base.regmap, CS35L56_MAIN_RENDER_USER_VOLUME, &raw_vol);
298 struct cs35l56_hda *cs35l56 = (struct cs35l56_hda *)kcontrol->private_data;
311 ret = regmap_update_bits_check(cs35l56->base.regmap,
321 static void cs35l56_hda_create_controls(struct cs35l56_hda *cs35l56)
333 snprintf(name, sizeof(name), "%s Posture Number", cs35l56->amp_name);
335 cs35l56->posture_ctl = snd_ctl_new1(&ctl_template, cs35l56);
336 if (snd_ctl_add(cs35l56->codec->card, cs35l56->posture_ctl))
337 dev_err(cs35l56->base.dev, "Failed to add KControl: %s\n", ctl_template.name);
344 BUILD_BUG_ON(ARRAY_SIZE(cs35l56->mixer_ctl) != ARRAY_SIZE(cs35l56_hda_mixer_controls));
347 snprintf(name, sizeof(name), "%s %s", cs35l56->amp_name,
350 cs35l56->mixer_ctl[i] = snd_ctl_new1(&ctl_template, cs35l56);
351 if (snd_ctl_add(cs35l56->codec->card, cs35l56->mixer_ctl[i])) {
352 dev_err(cs35l56->base.dev, "Failed to add KControl: %s\n",
362 snprintf(name, sizeof(name), "%s Speaker Playback Volume", cs35l56->amp_name);
364 cs35l56->volume_ctl = snd_ctl_new1(&ctl_template, cs35l56);
365 if (snd_ctl_add(cs35l56->codec->card, cs35l56->volume_ctl))
366 dev_err(cs35l56->base.dev, "Failed to add KControl: %s\n", ctl_template.name);
369 static void cs35l56_hda_remove_controls(struct cs35l56_hda *cs35l56)
373 for (i = ARRAY_SIZE(cs35l56->mixer_ctl) - 1; i >= 0; i--)
374 snd_ctl_remove(cs35l56->codec->card, cs35l56->mixer_ctl[i]);
376 snd_ctl_remove(cs35l56->codec->card, cs35l56->posture_ctl);
377 snd_ctl_remove(cs35l56->codec->card, cs35l56->volume_ctl);
384 static int cs35l56_hda_request_firmware_file(struct cs35l56_hda *cs35l56,
395 cs35l56->base.secured ? "s" : "", cs35l56->base.rev,
399 cs35l56->base.secured ? "s" : "", cs35l56->base.rev,
403 cs35l56->base.secured ? "s" : "", cs35l56->base.rev,
424 ret = firmware_request_nowarn(firmware, *filename, cs35l56->base.dev);
426 dev_dbg(cs35l56->base.dev, "Failed to request '%s'\n", *filename);
432 dev_dbg(cs35l56->base.dev, "Found '%s'\n", *filename);
438 static void cs35l56_hda_request_firmware_files(struct cs35l56_hda *cs35l56,
444 const char *system_name = cs35l56->system_name;
445 const char *amp_name = cs35l56->amp_name;
449 if (!cs35l56_hda_request_firmware_file(cs35l56, wmfw_firmware, wmfw_filename,
451 cs35l56_hda_request_firmware_file(cs35l56, coeff_firmware, coeff_filename,
458 if (!cs35l56_hda_request_firmware_file(cs35l56, wmfw_firmware, wmfw_filename,
461 cs35l56_hda_request_firmware_file(cs35l56,
466 cs35l56_hda_request_firmware_file(cs35l56,
474 ret = cs35l56_hda_request_firmware_file(cs35l56, wmfw_firmware, wmfw_filename,
477 cs35l56_hda_request_firmware_file(cs35l56, coeff_firmware, coeff_filename,
485 cs35l56_hda_request_firmware_file(cs35l56, coeff_firmware, coeff_filename,
488 cs35l56_hda_request_firmware_file(cs35l56, coeff_firmware, coeff_filename,
493 cs35l56_hda_request_firmware_file(cs35l56, coeff_firmware, coeff_filename,
511 static void cs35l56_hda_add_dsp_controls(struct cs35l56_hda *cs35l56)
515 info.device_name = cs35l56->amp_name;
517 info.card = cs35l56->codec->card;
519 hda_cs_dsp_add_controls(&cs35l56->cs_dsp, &info);
522 static int cs35l56_hda_fw_load(struct cs35l56_hda *cs35l56)
532 if (cs35l56->base.fw_patched)
533 cs_dsp_power_down(&cs35l56->cs_dsp);
535 cs35l56->base.fw_patched = false;
537 pm_runtime_get_sync(cs35l56->base.dev);
539 ret = regmap_read(cs35l56->base.regmap, CS35L56_PROTECTION_STATUS, &firmware_missing);
541 dev_err(cs35l56->base.dev, "Failed to read PROTECTION_STATUS: %d\n", ret);
553 if (cs35l56->base.secured || firmware_missing) {
554 cs35l56_hda_request_firmware_files(cs35l56, &wmfw_firmware, &wmfw_filename,
563 dev_err(cs35l56->base.dev, ".bin file required but not found\n");
568 mutex_lock(&cs35l56->base.irq_lock);
576 if (!cs35l56->base.secured && (wmfw_firmware || coeff_firmware)) {
577 ret = cs35l56_firmware_shutdown(&cs35l56->base);
582 ret = cs_dsp_power_up(&cs35l56->cs_dsp, wmfw_firmware, wmfw_filename,
585 dev_dbg(cs35l56->base.dev, "%s: cs_dsp_power_up ret %d\n", __func__, ret);
590 dev_dbg(cs35l56->base.dev, "Loaded WMFW Firmware: %s\n", wmfw_filename);
593 dev_dbg(cs35l56->base.dev, "Loaded Coefficients: %s\n", coeff_filename);
595 if (cs35l56->base.secured) {
596 ret = cs35l56_mbox_send(&cs35l56->base, CS35L56_MBOX_CMD_AUDIO_REINIT);
601 cs35l56_system_reset(&cs35l56->base, false);
602 regcache_mark_dirty(cs35l56->base.regmap);
603 ret = cs35l56_wait_for_firmware_boot(&cs35l56->base);
609 ret = cs35l56_mbox_send(&cs35l56->base, CS35L56_MBOX_CMD_PREVENT_AUTO_HIBERNATE);
613 regcache_sync(cs35l56->base.regmap);
615 regmap_clear_bits(cs35l56->base.regmap, CS35L56_PROTECTION_STATUS,
617 cs35l56->base.fw_patched = true;
619 ret = cs_dsp_run(&cs35l56->cs_dsp);
621 dev_dbg(cs35l56->base.dev, "%s: cs_dsp_run ret %d\n", __func__, ret);
624 if (!cs35l56->base.fw_patched)
625 cs_dsp_power_down(&cs35l56->cs_dsp);
627 mutex_unlock(&cs35l56->base.irq_lock);
632 pm_runtime_put(cs35l56->base.dev);
639 struct cs35l56_hda *cs35l56 = dev_get_drvdata(dev);
643 if (!comps || cs35l56->index < 0 || cs35l56->index >= HDA_MAX_COMPONENTS)
646 comps = &comps[cs35l56->index];
651 cs35l56->codec = comps->codec;
655 ret = cs35l56_hda_fw_load(cs35l56);
659 cs35l56_hda_create_controls(cs35l56);
660 cs35l56_hda_add_dsp_controls(cs35l56);
663 cs35l56->debugfs_root = debugfs_create_dir(dev_name(cs35l56->base.dev), sound_debugfs_root);
664 cs_dsp_init_debugfs(&cs35l56->cs_dsp, cs35l56->debugfs_root);
667 dev_dbg(cs35l56->base.dev, "Bound\n");
674 struct cs35l56_hda *cs35l56 = dev_get_drvdata(dev);
677 cs35l56_hda_remove_controls(cs35l56);
680 cs_dsp_cleanup_debugfs(&cs35l56->cs_dsp);
681 debugfs_remove_recursive(cs35l56->debugfs_root);
684 if (cs35l56->base.fw_patched)
685 cs_dsp_power_down(&cs35l56->cs_dsp);
687 cs_dsp_remove(&cs35l56->cs_dsp);
689 if (comps[cs35l56->index].dev == dev)
690 memset(&comps[cs35l56->index], 0, sizeof(*comps));
692 dev_dbg(cs35l56->base.dev, "Unbound\n");
702 struct cs35l56_hda *cs35l56 = dev_get_drvdata(dev);
704 if (cs35l56->playing)
705 cs35l56_hda_pause(cs35l56);
707 cs35l56->suspended = true;
715 if (cs35l56->base.irq)
716 disable_irq(cs35l56->base.irq);
723 struct cs35l56_hda *cs35l56 = dev_get_drvdata(dev);
729 if (cs35l56->base.reset_gpio) {
730 gpiod_set_value_cansleep(cs35l56->base.reset_gpio, 0);
739 struct cs35l56_hda *cs35l56 = dev_get_drvdata(dev);
742 if (cs35l56->base.irq)
743 enable_irq(cs35l56->base.irq);
750 struct cs35l56_hda *cs35l56 = dev_get_drvdata(dev);
759 if (cs35l56->base.irq)
760 disable_irq(cs35l56->base.irq);
767 struct cs35l56_hda *cs35l56 = dev_get_drvdata(dev);
770 if (cs35l56->base.reset_gpio) {
771 gpiod_set_value_cansleep(cs35l56->base.reset_gpio, 0);
775 gpiod_set_value_cansleep(cs35l56->base.reset_gpio, 1);
784 struct cs35l56_hda *cs35l56 = dev_get_drvdata(dev);
789 if (cs35l56->base.irq)
790 enable_irq(cs35l56->base.irq);
795 cs35l56->suspended = false;
797 ret = cs35l56_is_fw_reload_needed(&cs35l56->base);
798 dev_dbg(cs35l56->base.dev, "fw_reload_needed: %d\n", ret);
800 ret = cs35l56_hda_fw_load(cs35l56);
805 if (cs35l56->playing)
806 cs35l56_hda_play(cs35l56);
811 static int cs35l56_hda_read_acpi(struct cs35l56_hda *cs35l56, int id)
823 if (!ACPI_COMPANION(cs35l56->base.dev)) {
826 dev_err(cs35l56->base.dev, "Failed to find an ACPI device for %s\n",
827 dev_name(cs35l56->base.dev));
830 ACPI_COMPANION_SET(cs35l56->base.dev, adev);
834 ret = device_property_count_u32(cs35l56->base.dev, property);
844 ret = device_property_read_u32_array(cs35l56->base.dev, property, values, nval);
848 cs35l56->index = -1;
851 cs35l56->index = i;
859 if (cs35l56->index == -1) {
860 dev_dbg(cs35l56->base.dev, "No index found in %s\n", property);
865 sub = acpi_get_subsystem_id(ACPI_HANDLE(cs35l56->base.dev));
868 dev_info(cs35l56->base.dev,
872 cs35l56->system_name = sub;
875 cs35l56->base.reset_gpio = devm_gpiod_get_index_optional(cs35l56->base.dev,
877 cs35l56->index,
879 if (IS_ERR(cs35l56->base.reset_gpio)) {
880 ret = PTR_ERR(cs35l56->base.reset_gpio);
887 return dev_err_probe(cs35l56->base.dev, ret, "Failed to get reset GPIO\n");
889 dev_info(cs35l56->base.dev, "Reset GPIO busy, assume shared reset\n");
890 cs35l56->base.reset_gpio = NULL;
897 dev_err(cs35l56->base.dev, "Failed property %s: %d\n", property, ret);
902 int cs35l56_hda_common_probe(struct cs35l56_hda *cs35l56, int id)
906 mutex_init(&cs35l56->base.irq_lock);
907 dev_set_drvdata(cs35l56->base.dev, cs35l56);
909 ret = cs35l56_hda_read_acpi(cs35l56, id);
913 cs35l56->amp_name = devm_kasprintf(cs35l56->base.dev, GFP_KERNEL, "AMP%d",
914 cs35l56->index + 1);
915 if (!cs35l56->amp_name) {
920 cs35l56_init_cs_dsp(&cs35l56->base, &cs35l56->cs_dsp);
921 cs35l56->cs_dsp.client_ops = &cs35l56_hda_client_ops;
923 if (cs35l56->base.reset_gpio) {
924 dev_dbg(cs35l56->base.dev, "Hard reset\n");
930 gpiod_set_value_cansleep(cs35l56->base.reset_gpio, 0);
932 gpiod_set_value_cansleep(cs35l56->base.reset_gpio, 1);
935 ret = cs35l56_hw_init(&cs35l56->base);
940 cs35l56_system_reset(&cs35l56->base, false);
941 ret = cs35l56_wait_for_firmware_boot(&cs35l56->base);
945 ret = cs35l56_set_patch(&cs35l56->base);
949 regcache_mark_dirty(cs35l56->base.regmap);
950 regcache_sync(cs35l56->base.regmap);
953 ret = cs35l56_mbox_send(&cs35l56->base, CS35L56_MBOX_CMD_PREVENT_AUTO_HIBERNATE);
957 ret = cs_dsp_halo_init(&cs35l56->cs_dsp);
959 dev_err_probe(cs35l56->base.dev, ret, "cs_dsp_halo_init failed\n");
963 dev_dbg(cs35l56->base.dev, "DSP system name: '%s', amp name: '%s'\n",
964 cs35l56->system_name, cs35l56->amp_name);
966 regmap_multi_reg_write(cs35l56->base.regmap, cs35l56_hda_dai_config,
973 cs35l56->asp_tx_mask = BIT(cs35l56->index);
975 pm_runtime_set_autosuspend_delay(cs35l56->base.dev, 3000);
976 pm_runtime_use_autosuspend(cs35l56->base.dev);
977 pm_runtime_set_active(cs35l56->base.dev);
978 pm_runtime_mark_last_busy(cs35l56->base.dev);
979 pm_runtime_enable(cs35l56->base.dev);
981 ret = component_add(cs35l56->base.dev, &cs35l56_hda_comp_ops);
983 dev_err(cs35l56->base.dev, "Register component failed: %d\n", ret);
987 cs35l56->base.init_done = true;
992 pm_runtime_disable(cs35l56->base.dev);
994 gpiod_set_value_cansleep(cs35l56->base.reset_gpio, 0);
1002 struct cs35l56_hda *cs35l56 = dev_get_drvdata(dev);
1004 pm_runtime_dont_use_autosuspend(cs35l56->base.dev);
1005 pm_runtime_get_sync(cs35l56->base.dev);
1006 pm_runtime_disable(cs35l56->base.dev);
1008 component_del(cs35l56->base.dev, &cs35l56_hda_comp_ops);
1010 kfree(cs35l56->system_name);
1011 pm_runtime_put_noidle(cs35l56->base.dev);
1013 gpiod_set_value_cansleep(cs35l56->base.reset_gpio, 0);