Lines Matching +full:tempmon +full:- +full:data

1 // SPDX-License-Identifier: GPL-2.0-only
15 #include <sound/cs-amp-lib.h>
21 * Firmware can change these to non-defaults to satisfy SDCA.
42 /* These are not reset by a soft-reset, so patch to defaults. */
50 return regmap_register_patch(cs35l56_base->regmap, cs35l56_patch, in cs35l56_set_patch()
56 /* no defaults for OTP_MEM - first read populates cache */
234 regmap_write(cs35l56_base->regmap, CS35L56_DSP_VIRTUAL1_MBOX_1, command); in cs35l56_mbox_send()
235 ret = regmap_read_poll_timeout(cs35l56_base->regmap, CS35L56_DSP_VIRTUAL1_MBOX_1, in cs35l56_mbox_send()
239 dev_warn(cs35l56_base->dev, "MBOX command %#x failed: %d\n", command, ret); in cs35l56_mbox_send()
256 ret = regmap_read_poll_timeout(cs35l56_base->regmap, CS35L56_DSP1_PM_CUR_STATE, in cs35l56_firmware_shutdown()
261 dev_err(cs35l56_base->dev, "Failed to poll PM_CUR_STATE to 1 is %d (ret %d)\n", in cs35l56_firmware_shutdown()
273 * The regmap must remain in cache-only until the chip has in cs35l56_wait_for_firmware_boot()
281 cs35l56_base->regmap, CS35L56_DSP1_HALO_STATE, &val); in cs35l56_wait_for_firmware_boot()
284 dev_err(cs35l56_base->dev, "Firmware boot timed out(%d): HALO_STATE=%#x\n", in cs35l56_wait_for_firmware_boot()
286 return -EIO; in cs35l56_wait_for_firmware_boot()
319 struct cs35l56_spi_payload *buf = cs35l56_base->spi_payload_buf; in cs35l56_spi_issue_bus_locked_reset()
328 buf->addr = cpu_to_be32(cs35l56_spi_system_reset_stages[i].addr); in cs35l56_spi_issue_bus_locked_reset()
329 buf->value = cpu_to_be32(cs35l56_spi_system_reset_stages[i].value); in cs35l56_spi_issue_bus_locked_reset()
333 dev_warn(cs35l56_base->dev, "spi_sync failed: %d\n", ret); in cs35l56_spi_issue_bus_locked_reset()
342 struct spi_device *spi = to_spi_device(cs35l56_base->dev); in cs35l56_spi_system_reset()
348 * soft-resetting. in cs35l56_spi_system_reset()
350 ret = spi_bus_lock(spi->controller); in cs35l56_spi_system_reset()
352 dev_warn(cs35l56_base->dev, "spi_bus_lock failed: %d\n", ret); in cs35l56_spi_system_reset()
357 spi_bus_unlock(spi->controller); in cs35l56_spi_system_reset()
363 * The regmap must remain in cache-only until the chip has in cs35l56_spi_system_reset()
371 cs35l56_base->regmap, in cs35l56_spi_system_reset()
375 dev_err(cs35l56_base->dev, "SPI reboot timed out(%d): MBOX2=%#x\n", in cs35l56_spi_system_reset()
388 * Must enter cache-only first so there can't be any more register in cs35l56_system_reset()
391 regcache_cache_only(cs35l56_base->regmap, true); in cs35l56_system_reset()
398 regmap_multi_reg_write_bypassed(cs35l56_base->regmap, in cs35l56_system_reset()
402 /* On SoundWire the registers won't be accessible until it re-enumerates. */ in cs35l56_system_reset()
408 /* Leave in cache-only. This will be revoked when the chip has rebooted. */ in cs35l56_system_reset()
419 ret = devm_request_threaded_irq(cs35l56_base->dev, irq, NULL, cs35l56_irq, in cs35l56_irq_request()
423 cs35l56_base->irq = irq; in cs35l56_irq_request()
425 dev_err(cs35l56_base->dev, "Failed to get IRQ: %d\n", ret); in cs35l56_irq_request()
431 irqreturn_t cs35l56_irq(int irq, void *data) in cs35l56_irq() argument
433 struct cs35l56_base *cs35l56_base = data; in cs35l56_irq()
441 if (!cs35l56_base->init_done) in cs35l56_irq()
444 mutex_lock(&cs35l56_base->irq_lock); in cs35l56_irq()
446 rv = pm_runtime_resume_and_get(cs35l56_base->dev); in cs35l56_irq()
448 dev_err(cs35l56_base->dev, "irq: failed to get pm_runtime: %d\n", rv); in cs35l56_irq()
452 regmap_read(cs35l56_base->regmap, CS35L56_IRQ1_STATUS, &val); in cs35l56_irq()
454 dev_dbg(cs35l56_base->dev, "Spurious IRQ: no pending interrupt\n"); in cs35l56_irq()
459 regmap_read(cs35l56_base->regmap, CS35L56_IRQ1_EINT_1, &status1); in cs35l56_irq()
460 regmap_read(cs35l56_base->regmap, CS35L56_IRQ1_MASK_1, &mask1); in cs35l56_irq()
462 regmap_write(cs35l56_base->regmap, CS35L56_IRQ1_EINT_1, status1); in cs35l56_irq()
464 regmap_read(cs35l56_base->regmap, CS35L56_IRQ1_EINT_8, &status8); in cs35l56_irq()
465 regmap_read(cs35l56_base->regmap, CS35L56_IRQ1_MASK_8, &mask8); in cs35l56_irq()
467 regmap_write(cs35l56_base->regmap, CS35L56_IRQ1_EINT_8, status8); in cs35l56_irq()
469 regmap_read(cs35l56_base->regmap, CS35L56_IRQ1_EINT_20, &status20); in cs35l56_irq()
470 regmap_read(cs35l56_base->regmap, CS35L56_IRQ1_MASK_20, &mask20); in cs35l56_irq()
473 regmap_write(cs35l56_base->regmap, CS35L56_IRQ1_MASK_20, 0xffffffff); in cs35l56_irq()
475 dev_dbg(cs35l56_base->dev, "%s: %#x %#x\n", __func__, status1, status8); in cs35l56_irq()
482 dev_crit(cs35l56_base->dev, "Amp short error\n"); in cs35l56_irq()
485 dev_crit(cs35l56_base->dev, "Overtemp error\n"); in cs35l56_irq()
490 pm_runtime_put(cs35l56_base->dev); in cs35l56_irq()
492 mutex_unlock(&cs35l56_base->irq_lock); in cs35l56_irq()
506 * Assume that tuning must be re-loaded. in cs35l56_is_fw_reload_needed()
508 if (cs35l56_base->secured) in cs35l56_is_fw_reload_needed()
511 ret = pm_runtime_resume_and_get(cs35l56_base->dev); in cs35l56_is_fw_reload_needed()
513 dev_err(cs35l56_base->dev, "Failed to runtime_get: %d\n", ret); in cs35l56_is_fw_reload_needed()
517 ret = regmap_read(cs35l56_base->regmap, CS35L56_PROTECTION_STATUS, &val); in cs35l56_is_fw_reload_needed()
519 dev_err(cs35l56_base->dev, "Failed to read PROTECTION_STATUS: %d\n", ret); in cs35l56_is_fw_reload_needed()
523 pm_runtime_put_autosuspend(cs35l56_base->dev); in cs35l56_is_fw_reload_needed()
539 * Dummy transactions to trigger I2C/SPI auto-wake. Issue two in cs35l56_issue_wake_event()
544 * disabling regmap cache-only. in cs35l56_issue_wake_event()
546 regmap_read_bypassed(cs35l56_base->regmap, CS35L56_IRQ1_STATUS, &val); in cs35l56_issue_wake_event()
550 regmap_read_bypassed(cs35l56_base->regmap, CS35L56_IRQ1_STATUS, &val); in cs35l56_issue_wake_event()
560 if (!cs35l56_base->init_done) in cs35l56_runtime_suspend_common()
563 /* Firmware must have entered a power-save state */ in cs35l56_runtime_suspend_common()
564 ret = regmap_read_poll_timeout(cs35l56_base->regmap, in cs35l56_runtime_suspend_common()
570 dev_warn(cs35l56_base->dev, "PS3 wait failed: %d\n", ret); in cs35l56_runtime_suspend_common()
573 regmap_write(cs35l56_base->regmap, CS35L56_IRQ1_EINT_4, CS35L56_OTP_BOOT_DONE_MASK); in cs35l56_runtime_suspend_common()
575 if (!cs35l56_base->can_hibernate) { in cs35l56_runtime_suspend_common()
576 regcache_cache_only(cs35l56_base->regmap, true); in cs35l56_runtime_suspend_common()
577 dev_dbg(cs35l56_base->dev, "Suspended: no hibernate"); in cs35l56_runtime_suspend_common()
583 * Must enter cache-only first so there can't be any more register in cs35l56_runtime_suspend_common()
586 regcache_cache_only(cs35l56_base->regmap, true); in cs35l56_runtime_suspend_common()
588 regmap_multi_reg_write_bypassed(cs35l56_base->regmap, in cs35l56_runtime_suspend_common()
592 dev_dbg(cs35l56_base->dev, "Suspended: hibernate"); in cs35l56_runtime_suspend_common()
603 if (!cs35l56_base->init_done) in cs35l56_runtime_resume_common()
606 if (!cs35l56_base->can_hibernate) in cs35l56_runtime_resume_common()
609 /* Must be done before releasing cache-only */ in cs35l56_runtime_resume_common()
616 dev_err(cs35l56_base->dev, "Hibernate wake failed: %d\n", ret); in cs35l56_runtime_resume_common()
620 regcache_cache_only(cs35l56_base->regmap, false); in cs35l56_runtime_resume_common()
627 regmap_read(cs35l56_base->regmap, CS35L56_IRQ1_EINT_4, &val); in cs35l56_runtime_resume_common()
629 dev_dbg(cs35l56_base->dev, "Registers reset in suspend\n"); in cs35l56_runtime_resume_common()
630 regcache_mark_dirty(cs35l56_base->regmap); in cs35l56_runtime_resume_common()
633 regcache_sync(cs35l56_base->regmap); in cs35l56_runtime_resume_common()
635 dev_dbg(cs35l56_base->dev, "Resumed"); in cs35l56_runtime_resume_common()
640 regcache_cache_only(cs35l56_base->regmap, true); in cs35l56_runtime_resume_common()
642 regmap_multi_reg_write_bypassed(cs35l56_base->regmap, in cs35l56_runtime_resume_common()
660 cs_dsp->num = 1; in cs35l56_init_cs_dsp()
661 cs_dsp->type = WMFW_HALO; in cs35l56_init_cs_dsp()
662 cs_dsp->rev = 0; in cs35l56_init_cs_dsp()
663 cs_dsp->dev = cs35l56_base->dev; in cs35l56_init_cs_dsp()
664 cs_dsp->regmap = cs35l56_base->regmap; in cs35l56_init_cs_dsp()
665 cs_dsp->base = CS35L56_DSP1_CORE_BASE; in cs35l56_init_cs_dsp()
666 cs_dsp->base_sysinfo = CS35L56_DSP1_SYS_INFO_ID; in cs35l56_init_cs_dsp()
667 cs_dsp->mem = cs35l56_dsp1_regions; in cs35l56_init_cs_dsp()
668 cs_dsp->num_mems = ARRAY_SIZE(cs35l56_dsp1_regions); in cs35l56_init_cs_dsp()
669 cs_dsp->no_core_startstop = true; in cs35l56_init_cs_dsp()
690 ret = regmap_raw_read(cs35l56_base->regmap, CS35L56_OTP_MEM_53, &pte, sizeof(pte)); in cs35l56_read_silicon_uid()
692 dev_err(cs35l56_base->dev, "Failed to read OTP: %d\n", ret); in cs35l56_read_silicon_uid()
701 dev_dbg(cs35l56_base->dev, "UniqueID = %#llx\n", unique_id); in cs35l56_read_silicon_uid()
725 if (cs35l56_base->secured) in cs35l56_get_calibration()
732 ret = cs_amp_get_efi_calibration_data(cs35l56_base->dev, silicon_uid, in cs35l56_get_calibration()
733 cs35l56_base->cal_index, in cs35l56_get_calibration()
734 &cs35l56_base->cal_data); in cs35l56_get_calibration()
737 if ((ret == -ENOENT) || (ret == -EOVERFLOW)) in cs35l56_get_calibration()
743 cs35l56_base->cal_data_valid = true; in cs35l56_get_calibration()
755 ret = regmap_read(cs35l56_base->regmap, CS35L56_PROTECTION_STATUS, &prot_status); in cs35l56_read_prot_status()
757 dev_err(cs35l56_base->dev, "Get PROTECTION_STATUS failed: %d\n", ret); in cs35l56_read_prot_status()
763 ret = regmap_read(cs35l56_base->regmap, CS35L56_DSP1_FW_VER, fw_version); in cs35l56_read_prot_status()
765 dev_err(cs35l56_base->dev, "Get FW VER failed: %d\n", ret); in cs35l56_read_prot_status()
784 if (!cs35l56_base->reset_gpio) in cs35l56_hw_init()
789 ret = regmap_read_bypassed(cs35l56_base->regmap, CS35L56_REVID, &revid); in cs35l56_hw_init()
791 dev_err(cs35l56_base->dev, "Get Revision ID failed\n"); in cs35l56_hw_init()
794 cs35l56_base->rev = revid & (CS35L56_AREVID_MASK | CS35L56_MTLREVID_MASK); in cs35l56_hw_init()
800 ret = regmap_read_bypassed(cs35l56_base->regmap, CS35L56_DEVID, &devid); in cs35l56_hw_init()
802 dev_err(cs35l56_base->dev, "Get Device ID failed\n"); in cs35l56_hw_init()
813 dev_err(cs35l56_base->dev, "Unknown device %x\n", devid); in cs35l56_hw_init()
817 cs35l56_base->type = devid & 0xFF; in cs35l56_hw_init()
819 /* Silicon is now identified and booted so exit cache-only */ in cs35l56_hw_init()
820 regcache_cache_only(cs35l56_base->regmap, false); in cs35l56_hw_init()
822 ret = regmap_read(cs35l56_base->regmap, CS35L56_DSP_RESTRICT_STS1, &secured); in cs35l56_hw_init()
824 dev_err(cs35l56_base->dev, "Get Secure status failed\n"); in cs35l56_hw_init()
830 cs35l56_base->secured = true; in cs35l56_hw_init()
832 ret = regmap_read(cs35l56_base->regmap, CS35L56_OTPID, &otpid); in cs35l56_hw_init()
834 dev_err(cs35l56_base->dev, "Get OTP ID failed\n"); in cs35l56_hw_init()
842 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()
843 cs35l56_base->type, cs35l56_base->secured ? "s" : "", cs35l56_base->rev, otpid, in cs35l56_hw_init()
847 regmap_write(cs35l56_base->regmap, CS35L56_IRQ1_MASK_20, 0xffffffff); in cs35l56_hw_init()
848 regmap_update_bits(cs35l56_base->regmap, CS35L56_IRQ1_MASK_1, in cs35l56_hw_init()
851 regmap_update_bits(cs35l56_base->regmap, CS35L56_IRQ1_MASK_8, in cs35l56_hw_init()
866 ret = device_property_read_u32(cs35l56_base->dev, "cirrus,speaker-id", &speaker_id); in cs35l56_get_speaker_id()
868 dev_dbg(cs35l56_base->dev, "Speaker ID = %d\n", speaker_id); in cs35l56_get_speaker_id()
873 descs = gpiod_get_array_optional(cs35l56_base->dev, "spk-id", GPIOD_IN); in cs35l56_get_speaker_id()
875 return -ENOENT; in cs35l56_get_speaker_id()
878 return dev_err_probe(cs35l56_base->dev, ret, "Failed to get spk-id-gpios\n"); in cs35l56_get_speaker_id()
882 for (i = 0; i < descs->ndescs; i++) { in cs35l56_get_speaker_id()
883 ret = gpiod_get_value_cansleep(descs->desc[i]); in cs35l56_get_speaker_id()
885 dev_err_probe(cs35l56_base->dev, ret, "Failed to read spk-id[%d]\n", i); in cs35l56_get_speaker_id()
892 dev_dbg(cs35l56_base->dev, "Speaker ID = %d\n", speaker_id); in cs35l56_get_speaker_id()
938 return -EINVAL; in cs35l56_get_bclk_freq_id()
946 return -EINVAL; in cs35l56_get_bclk_freq_id()
950 static const char * const cs35l56_supplies[/* auto-sized */] = {
956 void cs35l56_fill_supply_names(struct regulator_bulk_data *data) in cs35l56_fill_supply_names() argument
962 data[i].supply = cs35l56_supplies[i]; in cs35l56_fill_supply_names()
969 "DSP1TX5", "DSP1TX6", "DSP1TX7", "DSP1TX8", "TEMPMON",