]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ASoC: fsl_xcvr: get channel status data with firmware exists
authorShengjiu Wang <shengjiu.wang@nxp.com>
Thu, 10 Jul 2025 03:04:05 +0000 (11:04 +0800)
committerMark Brown <broonie@kernel.org>
Thu, 24 Jul 2025 12:44:22 +0000 (13:44 +0100)
For the XCVR module on i.MX95, even though it only supports SPDIF, the
channel status needs to be obtained from RAM space, which is processed
by firmware. Firmware is necessary to trigger the FSL_XCVR_IRQ_NEW_CS
interrupt.

This change also applies for the SPDIF & ARC function on i.MX8MP which
has the firmware.

Fixes: e6a9750a346b ("ASoC: fsl_xcvr: Add suspend and resume support")
Signed-off-by: Shengjiu Wang <shengjiu.wang@nxp.com>
Link: https://patch.msgid.link/20250710030405.3370671-3-shengjiu.wang@nxp.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/fsl/fsl_xcvr.c

index 4054331445157e918fa13845521a0032978b1f95..5d804860f7d8c8b5094d3475bc28f5d1b6472771 100644 (file)
@@ -1395,7 +1395,7 @@ static irqreturn_t irq0_isr(int irq, void *devid)
        if (isr & FSL_XCVR_IRQ_NEW_CS) {
                dev_dbg(dev, "Received new CS block\n");
                isr_clr |= FSL_XCVR_IRQ_NEW_CS;
-               if (!xcvr->soc_data->spdif_only) {
+               if (xcvr->soc_data->fw_name) {
                        /* Data RAM is 4KiB, last two pages: 8 and 9. Select page 8. */
                        regmap_update_bits(xcvr->regmap, FSL_XCVR_EXT_CTRL,
                                           FSL_XCVR_EXT_CTRL_PAGE_MASK,
@@ -1517,6 +1517,7 @@ static const struct fsl_xcvr_soc_data fsl_xcvr_imx93_data = {
 };
 
 static const struct fsl_xcvr_soc_data fsl_xcvr_imx95_data = {
+       .fw_name = "imx/xcvr/xcvr-imx95.bin",
        .spdif_only = true,
        .use_phy = true,
        .use_edma = true,
@@ -1806,7 +1807,7 @@ static int fsl_xcvr_runtime_resume(struct device *dev)
                }
        }
 
-       if (xcvr->mode == FSL_XCVR_MODE_EARC) {
+       if (xcvr->soc_data->fw_name) {
                ret = fsl_xcvr_load_firmware(xcvr);
                if (ret) {
                        dev_err(dev, "failed to load firmware.\n");