Lines Matching refs:cs35l56_base

57 int cs35l56_set_patch(struct cs35l56_base *cs35l56_base)  in cs35l56_set_patch()  argument
61 ret = regmap_register_patch(cs35l56_base->regmap, cs35l56_patch, in cs35l56_set_patch()
67 switch (cs35l56_base->type) { in cs35l56_set_patch()
71 ret = regmap_register_patch(cs35l56_base->regmap, cs35l56_patch_fw, in cs35l56_set_patch()
75 ret = regmap_register_patch(cs35l56_base->regmap, cs35l63_patch_fw, in cs35l56_set_patch()
312 int cs35l56_mbox_send(struct cs35l56_base *cs35l56_base, unsigned int command) in cs35l56_mbox_send() argument
317 regmap_write(cs35l56_base->regmap, CS35L56_DSP_VIRTUAL1_MBOX_1, command); in cs35l56_mbox_send()
318 ret = regmap_read_poll_timeout(cs35l56_base->regmap, CS35L56_DSP_VIRTUAL1_MBOX_1, in cs35l56_mbox_send()
322 dev_warn(cs35l56_base->dev, "MBOX command %#x failed: %d\n", command, ret); in cs35l56_mbox_send()
330 int cs35l56_firmware_shutdown(struct cs35l56_base *cs35l56_base) in cs35l56_firmware_shutdown() argument
335 ret = cs35l56_mbox_send(cs35l56_base, CS35L56_MBOX_CMD_SHUTDOWN); in cs35l56_firmware_shutdown()
339 ret = regmap_read_poll_timeout(cs35l56_base->regmap, in cs35l56_firmware_shutdown()
340 cs35l56_base->fw_reg->pm_cur_stat, in cs35l56_firmware_shutdown()
345 dev_err(cs35l56_base->dev, "Failed to poll PM_CUR_STATE to 1 is %d (ret %d)\n", in cs35l56_firmware_shutdown()
351 int cs35l56_wait_for_firmware_boot(struct cs35l56_base *cs35l56_base) in cs35l56_wait_for_firmware_boot() argument
365 cs35l56_base->regmap, in cs35l56_wait_for_firmware_boot()
366 cs35l56_base->fw_reg->halo_state, in cs35l56_wait_for_firmware_boot()
370 dev_err(cs35l56_base->dev, "Firmware boot timed out(%d): HALO_STATE=%#x\n", in cs35l56_wait_for_firmware_boot()
402 static void cs35l56_spi_issue_bus_locked_reset(struct cs35l56_base *cs35l56_base, in cs35l56_spi_issue_bus_locked_reset() argument
405 struct cs35l56_spi_payload *buf = cs35l56_base->spi_payload_buf; in cs35l56_spi_issue_bus_locked_reset()
419 dev_warn(cs35l56_base->dev, "spi_sync failed: %d\n", ret); in cs35l56_spi_issue_bus_locked_reset()
426 static void cs35l56_spi_system_reset(struct cs35l56_base *cs35l56_base) in cs35l56_spi_system_reset() argument
428 struct spi_device *spi = to_spi_device(cs35l56_base->dev); in cs35l56_spi_system_reset()
438 dev_warn(cs35l56_base->dev, "spi_bus_lock failed: %d\n", ret); in cs35l56_spi_system_reset()
442 cs35l56_spi_issue_bus_locked_reset(cs35l56_base, spi); in cs35l56_spi_system_reset()
457 cs35l56_base->regmap, in cs35l56_spi_system_reset()
461 dev_err(cs35l56_base->dev, "SPI reboot timed out(%d): MBOX2=%#x\n", in cs35l56_spi_system_reset()
476 void cs35l56_system_reset(struct cs35l56_base *cs35l56_base, bool is_soundwire) in cs35l56_system_reset() argument
482 regcache_cache_only(cs35l56_base->regmap, true); in cs35l56_system_reset()
484 if (cs35l56_is_spi(cs35l56_base)) { in cs35l56_system_reset()
485 cs35l56_spi_system_reset(cs35l56_base); in cs35l56_system_reset()
489 switch (cs35l56_base->type) { in cs35l56_system_reset()
493 regmap_multi_reg_write_bypassed(cs35l56_base->regmap, in cs35l56_system_reset()
498 regmap_multi_reg_write_bypassed(cs35l56_base->regmap, in cs35l56_system_reset()
516 int cs35l56_irq_request(struct cs35l56_base *cs35l56_base, int irq) in cs35l56_irq_request() argument
523 ret = devm_request_threaded_irq(cs35l56_base->dev, irq, NULL, cs35l56_irq, in cs35l56_irq_request()
525 "cs35l56", cs35l56_base); in cs35l56_irq_request()
527 cs35l56_base->irq = irq; in cs35l56_irq_request()
529 dev_err(cs35l56_base->dev, "Failed to get IRQ: %d\n", ret); in cs35l56_irq_request()
537 struct cs35l56_base *cs35l56_base = data; in cs35l56_irq() local
545 if (!cs35l56_base->init_done) in cs35l56_irq()
548 mutex_lock(&cs35l56_base->irq_lock); in cs35l56_irq()
550 rv = pm_runtime_resume_and_get(cs35l56_base->dev); in cs35l56_irq()
552 dev_err(cs35l56_base->dev, "irq: failed to get pm_runtime: %d\n", rv); in cs35l56_irq()
556 regmap_read(cs35l56_base->regmap, CS35L56_IRQ1_STATUS, &val); in cs35l56_irq()
558 dev_dbg(cs35l56_base->dev, "Spurious IRQ: no pending interrupt\n"); in cs35l56_irq()
563 regmap_read(cs35l56_base->regmap, CS35L56_IRQ1_EINT_1, &status1); in cs35l56_irq()
564 regmap_read(cs35l56_base->regmap, CS35L56_IRQ1_MASK_1, &mask1); in cs35l56_irq()
566 regmap_write(cs35l56_base->regmap, CS35L56_IRQ1_EINT_1, status1); in cs35l56_irq()
568 regmap_read(cs35l56_base->regmap, CS35L56_IRQ1_EINT_8, &status8); in cs35l56_irq()
569 regmap_read(cs35l56_base->regmap, CS35L56_IRQ1_MASK_8, &mask8); in cs35l56_irq()
571 regmap_write(cs35l56_base->regmap, CS35L56_IRQ1_EINT_8, status8); in cs35l56_irq()
573 regmap_read(cs35l56_base->regmap, CS35L56_IRQ1_EINT_20, &status20); in cs35l56_irq()
574 regmap_read(cs35l56_base->regmap, CS35L56_IRQ1_MASK_20, &mask20); in cs35l56_irq()
577 regmap_write(cs35l56_base->regmap, CS35L56_IRQ1_MASK_20, 0xffffffff); in cs35l56_irq()
579 dev_dbg(cs35l56_base->dev, "%s: %#x %#x\n", __func__, status1, status8); in cs35l56_irq()
586 dev_crit(cs35l56_base->dev, "Amp short error\n"); in cs35l56_irq()
589 dev_crit(cs35l56_base->dev, "Overtemp error\n"); in cs35l56_irq()
594 pm_runtime_put(cs35l56_base->dev); in cs35l56_irq()
596 mutex_unlock(&cs35l56_base->irq_lock); in cs35l56_irq()
602 int cs35l56_is_fw_reload_needed(struct cs35l56_base *cs35l56_base) in cs35l56_is_fw_reload_needed() argument
612 if (cs35l56_base->secured) in cs35l56_is_fw_reload_needed()
615 ret = pm_runtime_resume_and_get(cs35l56_base->dev); in cs35l56_is_fw_reload_needed()
617 dev_err(cs35l56_base->dev, "Failed to runtime_get: %d\n", ret); in cs35l56_is_fw_reload_needed()
621 ret = regmap_read(cs35l56_base->regmap, in cs35l56_is_fw_reload_needed()
622 cs35l56_base->fw_reg->prot_sts, in cs35l56_is_fw_reload_needed()
625 dev_err(cs35l56_base->dev, "Failed to read PROTECTION_STATUS: %d\n", ret); in cs35l56_is_fw_reload_needed()
629 pm_runtime_put_autosuspend(cs35l56_base->dev); in cs35l56_is_fw_reload_needed()
640 static void cs35l56_issue_wake_event(struct cs35l56_base *cs35l56_base) in cs35l56_issue_wake_event() argument
652 regmap_read_bypassed(cs35l56_base->regmap, CS35L56_IRQ1_STATUS, &val); in cs35l56_issue_wake_event()
656 regmap_read_bypassed(cs35l56_base->regmap, CS35L56_IRQ1_STATUS, &val); in cs35l56_issue_wake_event()
661 int cs35l56_runtime_suspend_common(struct cs35l56_base *cs35l56_base) in cs35l56_runtime_suspend_common() argument
666 if (!cs35l56_base->init_done) in cs35l56_runtime_suspend_common()
670 ret = regmap_read_poll_timeout(cs35l56_base->regmap, in cs35l56_runtime_suspend_common()
671 cs35l56_base->fw_reg->transducer_actual_ps, in cs35l56_runtime_suspend_common()
676 dev_warn(cs35l56_base->dev, "PS3 wait failed: %d\n", ret); in cs35l56_runtime_suspend_common()
679 regmap_write(cs35l56_base->regmap, CS35L56_IRQ1_EINT_4, CS35L56_OTP_BOOT_DONE_MASK); in cs35l56_runtime_suspend_common()
681 if (!cs35l56_base->can_hibernate) { in cs35l56_runtime_suspend_common()
682 regcache_cache_only(cs35l56_base->regmap, true); in cs35l56_runtime_suspend_common()
683 dev_dbg(cs35l56_base->dev, "Suspended: no hibernate"); in cs35l56_runtime_suspend_common()
692 regcache_cache_only(cs35l56_base->regmap, true); in cs35l56_runtime_suspend_common()
694 regmap_multi_reg_write_bypassed(cs35l56_base->regmap, in cs35l56_runtime_suspend_common()
698 dev_dbg(cs35l56_base->dev, "Suspended: hibernate"); in cs35l56_runtime_suspend_common()
704 int cs35l56_runtime_resume_common(struct cs35l56_base *cs35l56_base, bool is_soundwire) in cs35l56_runtime_resume_common() argument
709 if (!cs35l56_base->init_done) in cs35l56_runtime_resume_common()
712 if (!cs35l56_base->can_hibernate) in cs35l56_runtime_resume_common()
717 cs35l56_issue_wake_event(cs35l56_base); in cs35l56_runtime_resume_common()
720 ret = cs35l56_wait_for_firmware_boot(cs35l56_base); in cs35l56_runtime_resume_common()
722 dev_err(cs35l56_base->dev, "Hibernate wake failed: %d\n", ret); in cs35l56_runtime_resume_common()
726 regcache_cache_only(cs35l56_base->regmap, false); in cs35l56_runtime_resume_common()
728 ret = cs35l56_mbox_send(cs35l56_base, CS35L56_MBOX_CMD_PREVENT_AUTO_HIBERNATE); in cs35l56_runtime_resume_common()
733 regmap_read(cs35l56_base->regmap, CS35L56_IRQ1_EINT_4, &val); in cs35l56_runtime_resume_common()
735 dev_dbg(cs35l56_base->dev, "Registers reset in suspend\n"); in cs35l56_runtime_resume_common()
736 regcache_mark_dirty(cs35l56_base->regmap); in cs35l56_runtime_resume_common()
739 regcache_sync(cs35l56_base->regmap); in cs35l56_runtime_resume_common()
741 dev_dbg(cs35l56_base->dev, "Resumed"); in cs35l56_runtime_resume_common()
746 regcache_cache_only(cs35l56_base->regmap, true); in cs35l56_runtime_resume_common()
748 regmap_multi_reg_write_bypassed(cs35l56_base->regmap, in cs35l56_runtime_resume_common()
764 void cs35l56_init_cs_dsp(struct cs35l56_base *cs35l56_base, struct cs_dsp *cs_dsp) in cs35l56_init_cs_dsp() argument
769 cs_dsp->dev = cs35l56_base->dev; in cs35l56_init_cs_dsp()
770 cs_dsp->regmap = cs35l56_base->regmap; in cs35l56_init_cs_dsp()
790 static int cs35l56_read_silicon_uid(struct cs35l56_base *cs35l56_base, u64 *uid) in cs35l56_read_silicon_uid() argument
796 ret = regmap_raw_read(cs35l56_base->regmap, CS35L56_OTP_MEM_53, &pte, sizeof(pte)); in cs35l56_read_silicon_uid()
798 dev_err(cs35l56_base->dev, "Failed to read OTP: %d\n", ret); in cs35l56_read_silicon_uid()
812 static int cs35l63_read_silicon_uid(struct cs35l56_base *cs35l56_base, u64 *uid) in cs35l63_read_silicon_uid() argument
817 ret = regmap_bulk_read(cs35l56_base->regmap, CS35L56_DIE_STS1, tmp, ARRAY_SIZE(tmp)); in cs35l63_read_silicon_uid()
819 dev_err(cs35l56_base->dev, "Cannot obtain CS35L56_DIE_STS: %d\n", ret); in cs35l63_read_silicon_uid()
841 int cs35l56_get_calibration(struct cs35l56_base *cs35l56_base) in cs35l56_get_calibration() argument
847 if (cs35l56_base->secured) in cs35l56_get_calibration()
850 switch (cs35l56_base->type) { in cs35l56_get_calibration()
854 ret = cs35l56_read_silicon_uid(cs35l56_base, &silicon_uid); in cs35l56_get_calibration()
857 ret = cs35l63_read_silicon_uid(cs35l56_base, &silicon_uid); in cs35l56_get_calibration()
867 dev_dbg(cs35l56_base->dev, "UniqueID = %#llx\n", silicon_uid); in cs35l56_get_calibration()
869 ret = cs_amp_get_efi_calibration_data(cs35l56_base->dev, silicon_uid, in cs35l56_get_calibration()
870 cs35l56_base->cal_index, in cs35l56_get_calibration()
871 &cs35l56_base->cal_data); in cs35l56_get_calibration()
880 cs35l56_base->cal_data_valid = true; in cs35l56_get_calibration()
886 int cs35l56_read_prot_status(struct cs35l56_base *cs35l56_base, in cs35l56_read_prot_status() argument
892 ret = regmap_read(cs35l56_base->regmap, in cs35l56_read_prot_status()
893 cs35l56_base->fw_reg->prot_sts, &prot_status); in cs35l56_read_prot_status()
895 dev_err(cs35l56_base->dev, "Get PROTECTION_STATUS failed: %d\n", ret); in cs35l56_read_prot_status()
901 ret = regmap_read(cs35l56_base->regmap, in cs35l56_read_prot_status()
902 cs35l56_base->fw_reg->fw_ver, fw_version); in cs35l56_read_prot_status()
904 dev_err(cs35l56_base->dev, "Get FW VER failed: %d\n", ret); in cs35l56_read_prot_status()
912 void cs35l56_log_tuning(struct cs35l56_base *cs35l56_base, struct cs_dsp *cs_dsp) in cs35l56_log_tuning() argument
932 dev_warn(cs35l56_base->dev, "Can't read tuning IDs"); in cs35l56_log_tuning()
934 dev_info(cs35l56_base->dev, "Tuning PID: %#x, SID: %#x, TID: %#x\n", in cs35l56_log_tuning()
939 int cs35l56_hw_init(struct cs35l56_base *cs35l56_base) in cs35l56_hw_init() argument
950 if (!cs35l56_base->reset_gpio) in cs35l56_hw_init()
951 cs35l56_issue_wake_event(cs35l56_base); in cs35l56_hw_init()
955 ret = regmap_read_bypassed(cs35l56_base->regmap, CS35L56_REVID, &revid); in cs35l56_hw_init()
957 dev_err(cs35l56_base->dev, "Get Revision ID failed\n"); in cs35l56_hw_init()
960 cs35l56_base->rev = revid & (CS35L56_AREVID_MASK | CS35L56_MTLREVID_MASK); in cs35l56_hw_init()
962 ret = cs35l56_wait_for_firmware_boot(cs35l56_base); in cs35l56_hw_init()
966 ret = regmap_read_bypassed(cs35l56_base->regmap, CS35L56_DEVID, &devid); in cs35l56_hw_init()
968 dev_err(cs35l56_base->dev, "Get Device ID failed\n"); in cs35l56_hw_init()
982 dev_err(cs35l56_base->dev, "Unknown device %x\n", devid); in cs35l56_hw_init()
986 cs35l56_base->type = devid & 0xFF; in cs35l56_hw_init()
989 regcache_cache_only(cs35l56_base->regmap, false); in cs35l56_hw_init()
991 ret = regmap_read(cs35l56_base->regmap, CS35L56_DSP_RESTRICT_STS1, &secured); in cs35l56_hw_init()
993 dev_err(cs35l56_base->dev, "Get Secure status failed\n"); in cs35l56_hw_init()
999 cs35l56_base->secured = true; in cs35l56_hw_init()
1001 ret = regmap_read(cs35l56_base->regmap, CS35L56_OTPID, &otpid); in cs35l56_hw_init()
1003 dev_err(cs35l56_base->dev, "Get OTP ID failed\n"); in cs35l56_hw_init()
1007 ret = cs35l56_read_prot_status(cs35l56_base, &fw_missing, &fw_ver); in cs35l56_hw_init()
1011 dev_info(cs35l56_base->dev, "Cirrus Logic CS35L%02X%s Rev %02X OTP%d fw:%d.%d.%d (patched=%u)\n", in cs35l56_hw_init()
1012 cs35l56_base->type, cs35l56_base->secured ? "s" : "", cs35l56_base->rev, otpid, in cs35l56_hw_init()
1016 regmap_write(cs35l56_base->regmap, CS35L56_IRQ1_MASK_20, 0xffffffff); in cs35l56_hw_init()
1017 regmap_update_bits(cs35l56_base->regmap, CS35L56_IRQ1_MASK_1, in cs35l56_hw_init()
1020 regmap_update_bits(cs35l56_base->regmap, CS35L56_IRQ1_MASK_8, in cs35l56_hw_init()
1028 int cs35l56_get_speaker_id(struct cs35l56_base *cs35l56_base) in cs35l56_get_speaker_id() argument
1035 ret = device_property_read_u32(cs35l56_base->dev, "cirrus,speaker-id", &speaker_id); in cs35l56_get_speaker_id()
1037 dev_dbg(cs35l56_base->dev, "Speaker ID = %d\n", speaker_id); in cs35l56_get_speaker_id()
1042 descs = gpiod_get_array_optional(cs35l56_base->dev, "spk-id", GPIOD_IN); in cs35l56_get_speaker_id()
1047 return dev_err_probe(cs35l56_base->dev, ret, "Failed to get spk-id-gpios\n"); in cs35l56_get_speaker_id()
1054 dev_err_probe(cs35l56_base->dev, ret, "Failed to read spk-id[%d]\n", i); in cs35l56_get_speaker_id()
1061 dev_dbg(cs35l56_base->dev, "Speaker ID = %d\n", speaker_id); in cs35l56_get_speaker_id()