Re: [PATCH v3 0/2] ASoC: tegra210: simplify ADX/AMX byte map get/put logic
From: Piyush Patle
Date: Sat Apr 18 2026 - 09:37:27 EST
On Sat, Apr 11, 2026 at 1:35 AM Piyush Patle <piyushpatle228@xxxxxxxxx> wrote:
>
> The Tegra210 ADX and AMX drivers both keep their "Byte Map N" ALSA
> control state as a byte-packed u32 map[] array along with a separate
> byte_mask[] bitmap. This is because the control range exposed to
> userspace is [0, 256], where 256 is the "disabled" sentinel and
> does not fit in a byte, so the two arrays have to be cross-checked
> on every get()/put().
>
> This series stores each slot as a u16 holding the user-visible
> value directly, turning get_byte_map() into a direct return and
> put_byte_map() into a compare-and-store. The hardware-facing packed
> RAM word and the IN_BYTE_EN / OUT_BYTE_EN enable masks are computed
> on the fly inside each write_map_ram() callback, which is the only
> place that needs to know the hardware layout. The byte_mask[] field
> is kept in the driver struct but allocated dynamically in probe()
> using devm_kcalloc() with soc_data->byte_mask_size, and zeroed +
> recomputed on each write_map_ram() call.
>
> There is no userspace-visible ABI change. Control declarations,
> ranges, initial values and handling of out-of-range writes is
> preserved by treating values outside [0, 255] as disabled (256),
> matching previous behavior. As a side effect each patch also fixes
> a latent bug in put_byte_map() where an enabled-to-enabled value
> change was not persisted.
>
> The packed RAM word construction is also updated to ensure the shift
> operates on a u32 value, avoiding potential undefined behavior due
> to signed integer promotion.
>
> Addresses TODO comments left in tegra210_{adx,amx}_get_byte_map().
>
> Changes since v2:
> - Move byte_mask allocation back to probe() with devm_kcalloc()
> using soc_data->byte_mask_size; revert write_map_ram() to void
> and runtime_resume() to returning 0. Suggested by Jon Hunter.
> - Fix bits_per_mask: use BITS_PER_TYPE(*byte_mask) instead of the
> incorrect BITS_PER_TYPE(*map) * BITS_PER_BYTE. Reported by
> Mark Brown.
> - Drop <linux/slab.h> include (no longer needed without kfree).
>
> Changes since v1:
> - Use dynamic sizing via soc_data->byte_mask_size instead of
> chip-specific constants. Suggested by Sheetal.
> - Replace magic numbers with TEGRA_{ADX,AMX}_SLOTS_PER_WORD
> and use BITS_PER_BYTE / BITS_PER_TYPE(). Suggested by Sheetal.
> - Add <linux/bits.h> include.
>
> Patch 1/2: ASoC: tegra210_adx: simplify byte map get/put logic
> Patch 2/2: ASoC: tegra210_amx: simplify byte map get/put logic
>
> Piyush Patle (2):
> ASoC: tegra210_adx: simplify byte map get/put logic
> ASoC: tegra210_amx: simplify byte map get/put logic
>
> sound/soc/tegra/tegra210_adx.c | 85 ++++++++++++++++++----------------
> sound/soc/tegra/tegra210_adx.h | 5 +-
> sound/soc/tegra/tegra210_amx.c | 82 ++++++++++++++++----------------
> sound/soc/tegra/tegra210_amx.h | 5 +-
> 4 files changed, 96 insertions(+), 81 deletions(-)
>
> --
> 2.43.0
>
Hey
Just a gentle ping on this patch series.
Regards,
Piyush