ASoC: SOF: Intel: hda-mlink: fix off-by-one error
authorPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Mon, 7 Aug 2023 21:09:40 +0000 (16:09 -0500)
committerMark Brown <broonie@kernel.org>
Mon, 7 Aug 2023 22:09:30 +0000 (23:09 +0100)
The HCHAN parameter should be the highest channel number, not the
channel count.

While we're at it, handle LCHAN with the dual __ffs helper.

Fixes: ccc2f0c1b6b6 ("ASoC: SOF: Intel: hda-mlink: add helper to program SoundWire PCMSyCM registers")
Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com>
Reviewed-by: Rander Wang <rander.wang@intel.com>
Link: https://lore.kernel.org/r/20230807210959.506849-2-pierre-louis.bossart@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sof/intel/hda-mlink.c

index b7cbf66badf5b12e039b62f28ce34937124ef3d5..acad3ea2f4710e8d9abb3f013b60b726d4e134fc 100644 (file)
@@ -781,6 +781,8 @@ int hdac_bus_eml_sdw_map_stream_ch(struct hdac_bus *bus, int sublink, int y,
 {
        struct hdac_ext2_link *h2link;
        u16 __iomem *pcmsycm;
+       int hchan;
+       int lchan;
        u16 val;
 
        h2link = find_ext2_link(bus, true, AZX_REG_ML_LEPTR_ID_SDW);
@@ -791,9 +793,17 @@ int hdac_bus_eml_sdw_map_stream_ch(struct hdac_bus *bus, int sublink, int y,
                h2link->instance_offset * sublink +
                AZX_REG_SDW_SHIM_PCMSyCM(y);
 
+       if (channel_mask) {
+               hchan = __fls(channel_mask);
+               lchan = __ffs(channel_mask);
+       } else {
+               hchan = 0;
+               lchan = 0;
+       }
+
        mutex_lock(&h2link->eml_lock);
 
-       hdaml_shim_map_stream_ch(pcmsycm, 0, hweight32(channel_mask),
+       hdaml_shim_map_stream_ch(pcmsycm, lchan, hchan,
                                 stream_id, dir);
 
        mutex_unlock(&h2link->eml_lock);