ASoC: qcom: Fix typo error in HDMI regmap config callbacks
authorSrinivasa Rao Mandadapu <srivasam@codeaurora.org>
Tue, 2 Feb 2021 06:27:27 +0000 (11:57 +0530)
committerMark Brown <broonie@kernel.org>
Tue, 2 Feb 2021 17:28:10 +0000 (17:28 +0000)
Had a typo in lpass platform driver that resulted in crash
during suspend/resume with an HDMI dongle connected.

The regmap read/write/volatile regesters validation callbacks in lpass-cpu
were using MI2S rdma_channels count instead of hdmi_rdma_channels.

This typo error causing to read registers from the regmap beyond the length
of the mapping created by ioremap().

This fix avoids the need for reducing number hdmi_rdma_channels,
which is done in
commit 7dfe20ee92f6 ("ASoC: qcom: Fix number of HDMI RDMA channels on sc7180").
So reverting the same.

Fixes: 7cb37b7bd0d3c ("ASoC: qcom: Add support for lpass hdmi driver")
Signed-off-by: Srinivasa Rao Mandadapu <srivasam@codeaurora.org>
Link: https://lore.kernel.org/r/20210202062727.22469-1-srivasam@codeaurora.org
Reviewed-by: Stephen Boyd <swboyd@chromium.org>
Tested-by: Stephen Boyd <swboyd@chromium.org>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/qcom/lpass-cpu.c
sound/soc/qcom/lpass-sc7180.c

index 73ca24c0a08b77e89be8b8bf3772565b23e94cd0..8e5415c9234f1e8bea2e30b35582bea7270b6d09 100644 (file)
@@ -594,7 +594,7 @@ static bool lpass_hdmi_regmap_writeable(struct device *dev, unsigned int reg)
                        return true;
        }
 
-       for (i = 0; i < v->rdma_channels; ++i) {
+       for (i = 0; i < v->hdmi_rdma_channels; ++i) {
                if (reg == LPAIF_HDMI_RDMACTL_REG(v, i))
                        return true;
                if (reg == LPAIF_HDMI_RDMABASE_REG(v, i))
@@ -640,7 +640,7 @@ static bool lpass_hdmi_regmap_readable(struct device *dev, unsigned int reg)
        if (reg == LPASS_HDMITX_APP_IRQSTAT_REG(v))
                return true;
 
-       for (i = 0; i < v->rdma_channels; ++i) {
+       for (i = 0; i < v->hdmi_rdma_channels; ++i) {
                if (reg == LPAIF_HDMI_RDMACTL_REG(v, i))
                        return true;
                if (reg == LPAIF_HDMI_RDMABASE_REG(v, i))
@@ -667,7 +667,7 @@ static bool lpass_hdmi_regmap_volatile(struct device *dev, unsigned int reg)
        if (reg == LPASS_HDMI_TX_LEGACY_ADDR(v))
                return true;
 
-       for (i = 0; i < v->rdma_channels; ++i) {
+       for (i = 0; i < v->hdmi_rdma_channels; ++i) {
                if (reg == LPAIF_HDMI_RDMACURR_REG(v, i))
                        return true;
        }
@@ -817,7 +817,7 @@ int asoc_qcom_lpass_cpu_platform_probe(struct platform_device *pdev)
                }
 
                lpass_hdmi_regmap_config.max_register = LPAIF_HDMI_RDMAPER_REG(variant,
-                                       variant->hdmi_rdma_channels);
+                                       variant->hdmi_rdma_channels - 1);
                drvdata->hdmiif_map = devm_regmap_init_mmio(dev, drvdata->hdmiif,
                                        &lpass_hdmi_regmap_config);
                if (IS_ERR(drvdata->hdmiif_map)) {
index 735c9dac28f2683abdb11b5e51f0d61483253682..8c168d3c589e9ccfddaf2cc84f4fc3455b01d1a8 100644 (file)
@@ -171,7 +171,7 @@ static struct lpass_variant sc7180_data = {
        .rdma_channels          = 5,
        .hdmi_rdma_reg_base             = 0x64000,
        .hdmi_rdma_reg_stride   = 0x1000,
-       .hdmi_rdma_channels             = 3,
+       .hdmi_rdma_channels             = 4,
        .dmactl_audif_start     = 1,
        .wrdma_reg_base         = 0x18000,
        .wrdma_reg_stride       = 0x1000,