Lines Matching defs:cs35l56_base

34 int cs35l56_set_patch(struct cs35l56_base *cs35l56_base)
36 return regmap_register_patch(cs35l56_base->regmap, cs35l56_patch,
227 int cs35l56_init_asp1_regs_for_driver_control(struct cs35l56_base *cs35l56_base)
229 if (!cs35l56_base->fw_owns_asp1)
232 cs35l56_base->fw_owns_asp1 = false;
234 return regmap_multi_reg_write(cs35l56_base->regmap, cs35l56_asp1_defaults,
244 int cs35l56_force_sync_asp1_registers_from_cache(struct cs35l56_base *cs35l56_base)
249 if (cs35l56_base->fw_owns_asp1)
256 ret = regmap_read(cs35l56_base->regmap, asp1_regs[i].reg, &asp1_regs[i].def);
262 ret = regmap_multi_reg_write_bypassed(cs35l56_base->regmap, asp1_regs,
270 dev_err(cs35l56_base->dev, "Failed to sync ASP1 registers: %d\n", ret);
276 int cs35l56_mbox_send(struct cs35l56_base *cs35l56_base, unsigned int command)
281 regmap_write(cs35l56_base->regmap, CS35L56_DSP_VIRTUAL1_MBOX_1, command);
282 ret = regmap_read_poll_timeout(cs35l56_base->regmap, CS35L56_DSP_VIRTUAL1_MBOX_1,
286 dev_warn(cs35l56_base->dev, "MBOX command %#x failed: %d\n", command, ret);
294 int cs35l56_firmware_shutdown(struct cs35l56_base *cs35l56_base)
300 ret = cs35l56_mbox_send(cs35l56_base, CS35L56_MBOX_CMD_SHUTDOWN);
304 if (cs35l56_base->rev < CS35L56_REVID_B0)
309 ret = regmap_read_poll_timeout(cs35l56_base->regmap, reg,
314 dev_err(cs35l56_base->dev, "Failed to poll PM_CUR_STATE to 1 is %d (ret %d)\n",
320 int cs35l56_wait_for_firmware_boot(struct cs35l56_base *cs35l56_base)
326 if (cs35l56_base->rev < CS35L56_REVID_B0)
340 cs35l56_base->regmap, reg, &val);
343 dev_err(cs35l56_base->dev, "Firmware boot timed out(%d): HALO_STATE=%#x\n",
371 void cs35l56_system_reset(struct cs35l56_base *cs35l56_base, bool is_soundwire)
377 regcache_cache_only(cs35l56_base->regmap, true);
378 regmap_multi_reg_write_bypassed(cs35l56_base->regmap,
392 int cs35l56_irq_request(struct cs35l56_base *cs35l56_base, int irq)
399 ret = devm_request_threaded_irq(cs35l56_base->dev, irq, NULL, cs35l56_irq,
401 "cs35l56", cs35l56_base);
403 cs35l56_base->irq = irq;
405 dev_err(cs35l56_base->dev, "Failed to get IRQ: %d\n", ret);
413 struct cs35l56_base *cs35l56_base = data;
421 if (!cs35l56_base->init_done)
424 mutex_lock(&cs35l56_base->irq_lock);
426 rv = pm_runtime_resume_and_get(cs35l56_base->dev);
428 dev_err(cs35l56_base->dev, "irq: failed to get pm_runtime: %d\n", rv);
432 regmap_read(cs35l56_base->regmap, CS35L56_IRQ1_STATUS, &val);
434 dev_dbg(cs35l56_base->dev, "Spurious IRQ: no pending interrupt\n");
439 regmap_read(cs35l56_base->regmap, CS35L56_IRQ1_EINT_1, &status1);
440 regmap_read(cs35l56_base->regmap, CS35L56_IRQ1_MASK_1, &mask1);
442 regmap_write(cs35l56_base->regmap, CS35L56_IRQ1_EINT_1, status1);
444 regmap_read(cs35l56_base->regmap, CS35L56_IRQ1_EINT_8, &status8);
445 regmap_read(cs35l56_base->regmap, CS35L56_IRQ1_MASK_8, &mask8);
447 regmap_write(cs35l56_base->regmap, CS35L56_IRQ1_EINT_8, status8);
449 regmap_read(cs35l56_base->regmap, CS35L56_IRQ1_EINT_20, &status20);
450 regmap_read(cs35l56_base->regmap, CS35L56_IRQ1_MASK_20, &mask20);
453 regmap_write(cs35l56_base->regmap, CS35L56_IRQ1_MASK_20, 0xffffffff);
455 dev_dbg(cs35l56_base->dev, "%s: %#x %#x\n", __func__, status1, status8);
462 dev_crit(cs35l56_base->dev, "Amp short error\n");
465 dev_crit(cs35l56_base->dev, "Overtemp error\n");
470 pm_runtime_put(cs35l56_base->dev);
472 mutex_unlock(&cs35l56_base->irq_lock);
478 int cs35l56_is_fw_reload_needed(struct cs35l56_base *cs35l56_base)
488 if (cs35l56_base->secured)
491 ret = pm_runtime_resume_and_get(cs35l56_base->dev);
493 dev_err(cs35l56_base->dev, "Failed to runtime_get: %d\n", ret);
497 ret = regmap_read(cs35l56_base->regmap, CS35L56_PROTECTION_STATUS, &val);
499 dev_err(cs35l56_base->dev, "Failed to read PROTECTION_STATUS: %d\n", ret);
503 pm_runtime_put_autosuspend(cs35l56_base->dev);
518 static void cs35l56_issue_wake_event(struct cs35l56_base *cs35l56_base)
531 regmap_multi_reg_write_bypassed(cs35l56_base->regmap,
537 regmap_multi_reg_write_bypassed(cs35l56_base->regmap,
544 int cs35l56_runtime_suspend_common(struct cs35l56_base *cs35l56_base)
549 if (!cs35l56_base->init_done)
553 ret = regmap_read_poll_timeout(cs35l56_base->regmap,
559 dev_warn(cs35l56_base->dev, "PS3 wait failed: %d\n", ret);
562 regmap_write(cs35l56_base->regmap, CS35L56_IRQ1_EINT_4, CS35L56_OTP_BOOT_DONE_MASK);
564 if (!cs35l56_base->can_hibernate) {
565 regcache_cache_only(cs35l56_base->regmap, true);
566 dev_dbg(cs35l56_base->dev, "Suspended: no hibernate");
575 regcache_cache_only(cs35l56_base->regmap, true);
577 regmap_multi_reg_write_bypassed(cs35l56_base->regmap,
581 dev_dbg(cs35l56_base->dev, "Suspended: hibernate");
587 int cs35l56_runtime_resume_common(struct cs35l56_base *cs35l56_base, bool is_soundwire)
592 if (!cs35l56_base->init_done)
595 if (!cs35l56_base->can_hibernate)
600 cs35l56_issue_wake_event(cs35l56_base);
603 ret = cs35l56_wait_for_firmware_boot(cs35l56_base);
605 dev_err(cs35l56_base->dev, "Hibernate wake failed: %d\n", ret);
609 regcache_cache_only(cs35l56_base->regmap, false);
611 ret = cs35l56_mbox_send(cs35l56_base, CS35L56_MBOX_CMD_PREVENT_AUTO_HIBERNATE);
616 regmap_read(cs35l56_base->regmap, CS35L56_IRQ1_EINT_4, &val);
618 dev_dbg(cs35l56_base->dev, "Registers reset in suspend\n");
619 regcache_mark_dirty(cs35l56_base->regmap);
622 regcache_sync(cs35l56_base->regmap);
624 dev_dbg(cs35l56_base->dev, "Resumed");
629 regcache_cache_only(cs35l56_base->regmap, true);
631 regmap_multi_reg_write_bypassed(cs35l56_base->regmap,
647 void cs35l56_init_cs_dsp(struct cs35l56_base *cs35l56_base, struct cs_dsp *cs_dsp)
652 cs_dsp->dev = cs35l56_base->dev;
653 cs_dsp->regmap = cs35l56_base->regmap;
673 static int cs35l56_read_silicon_uid(struct cs35l56_base *cs35l56_base, u64 *uid)
679 ret = regmap_raw_read(cs35l56_base->regmap, CS35L56_OTP_MEM_53, &pte, sizeof(pte));
681 dev_err(cs35l56_base->dev, "Failed to read OTP: %d\n", ret);
690 dev_dbg(cs35l56_base->dev, "UniqueID = %#llx\n", unique_id);
708 int cs35l56_get_calibration(struct cs35l56_base *cs35l56_base)
714 if (cs35l56_base->secured)
717 ret = cs35l56_read_silicon_uid(cs35l56_base, &silicon_uid);
721 ret = cs_amp_get_efi_calibration_data(cs35l56_base->dev, silicon_uid,
722 cs35l56_base->cal_index,
723 &cs35l56_base->cal_data);
732 cs35l56_base->cal_data_valid = true;
738 int cs35l56_read_prot_status(struct cs35l56_base *cs35l56_base,
744 ret = regmap_read(cs35l56_base->regmap, CS35L56_PROTECTION_STATUS, &prot_status);
746 dev_err(cs35l56_base->dev, "Get PROTECTION_STATUS failed: %d\n", ret);
752 ret = regmap_read(cs35l56_base->regmap, CS35L56_DSP1_FW_VER, fw_version);
754 dev_err(cs35l56_base->dev, "Get FW VER failed: %d\n", ret);
762 int cs35l56_hw_init(struct cs35l56_base *cs35l56_base)
773 if (!cs35l56_base->reset_gpio)
774 cs35l56_issue_wake_event(cs35l56_base);
783 ret = regmap_read_bypassed(cs35l56_base->regmap, CS35L56_REVID, &revid);
785 dev_err(cs35l56_base->dev, "Get Revision ID failed\n");
788 cs35l56_base->rev = revid & (CS35L56_AREVID_MASK | CS35L56_MTLREVID_MASK);
790 ret = cs35l56_wait_for_firmware_boot(cs35l56_base);
794 ret = regmap_read_bypassed(cs35l56_base->regmap, CS35L56_DEVID, &devid);
796 dev_err(cs35l56_base->dev, "Get Device ID failed\n");
807 dev_err(cs35l56_base->dev, "Unknown device %x\n", devid);
811 cs35l56_base->type = devid & 0xFF;
814 regcache_cache_only(cs35l56_base->regmap, false);
816 ret = regmap_read(cs35l56_base->regmap, CS35L56_DSP_RESTRICT_STS1, &secured);
818 dev_err(cs35l56_base->dev, "Get Secure status failed\n");
824 cs35l56_base->secured = true;
826 ret = regmap_read(cs35l56_base->regmap, CS35L56_OTPID, &otpid);
828 dev_err(cs35l56_base->dev, "Get OTP ID failed\n");
832 ret = cs35l56_read_prot_status(cs35l56_base, &fw_missing, &fw_ver);
836 dev_info(cs35l56_base->dev, "Cirrus Logic CS35L%02X%s Rev %02X OTP%d fw:%d.%d.%d (patched=%u)\n",
837 cs35l56_base->type, cs35l56_base->secured ? "s" : "", cs35l56_base->rev, otpid,
841 regmap_write(cs35l56_base->regmap, CS35L56_IRQ1_MASK_20, 0xffffffff);
842 regmap_update_bits(cs35l56_base->regmap, CS35L56_IRQ1_MASK_1,
845 regmap_update_bits(cs35l56_base->regmap, CS35L56_IRQ1_MASK_8,
853 int cs35l56_get_speaker_id(struct cs35l56_base *cs35l56_base)
860 descs = gpiod_get_array_optional(cs35l56_base->dev, "spk-id", GPIOD_IN);
865 return dev_err_probe(cs35l56_base->dev, ret, "Failed to get spk-id-gpios\n");
872 dev_err_probe(cs35l56_base->dev, ret, "Failed to read spk-id[%d]\n", i);
879 dev_dbg(cs35l56_base->dev, "Speaker ID = %d\n", speaker_id);