ASoC: fsl_xcvr: get channel status data in two cases

Merge series from Shengjiu Wang <shengjiu.wang@nxp.com>:

There is two different cases for getting channel status data:
1. With PHY exists, there is firmware running on M core, the firmware
should fill the channel status to RAM space, driver need to read them
from RAM.
2. Without PHY, the channel status need to be obtained from registers.
This commit is contained in:
Mark Brown 2025-07-24 23:17:01 +01:00
commit 7379907e24
No known key found for this signature in database
GPG Key ID: 24D68B725D5487D0

View 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,
@ -1423,6 +1423,26 @@ static irqreturn_t irq0_isr(int irq, void *devid)
/* clear CS control register */
memset_io(reg_ctrl, 0, sizeof(val));
}
} else {
regmap_read(xcvr->regmap, FSL_XCVR_RX_CS_DATA_0,
(u32 *)&xcvr->rx_iec958.status[0]);
regmap_read(xcvr->regmap, FSL_XCVR_RX_CS_DATA_1,
(u32 *)&xcvr->rx_iec958.status[4]);
regmap_read(xcvr->regmap, FSL_XCVR_RX_CS_DATA_2,
(u32 *)&xcvr->rx_iec958.status[8]);
regmap_read(xcvr->regmap, FSL_XCVR_RX_CS_DATA_3,
(u32 *)&xcvr->rx_iec958.status[12]);
regmap_read(xcvr->regmap, FSL_XCVR_RX_CS_DATA_4,
(u32 *)&xcvr->rx_iec958.status[16]);
regmap_read(xcvr->regmap, FSL_XCVR_RX_CS_DATA_5,
(u32 *)&xcvr->rx_iec958.status[20]);
for (i = 0; i < 6; i++) {
val = *(u32 *)(xcvr->rx_iec958.status + i * 4);
*(u32 *)(xcvr->rx_iec958.status + i * 4) =
bitrev32(val);
}
regmap_set_bits(xcvr->regmap, FSL_XCVR_RX_DPTH_CTRL,
FSL_XCVR_RX_DPTH_CTRL_CSA);
}
}
if (isr & FSL_XCVR_IRQ_NEW_UD) {
@ -1497,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,
@ -1786,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");