Re: [PATCH 1/2] soundwire: qcom: set the bus mclk_freq property

From: Srinivas Kandagatla

Date: Tue Jul 28 2026 - 07:44:20 EST


On 7/27/26 5:27 PM, Jorijn van der Graaf wrote:
> sdw_slave_get_scale_index() needs bus->prop.mclk_freq to compute the
> SCP bus-clock base and scale register values, and fails with "no bus
> MCLK" when it is unset. The qcom controller never set it, so slave
> initialization cannot program the clock registers on this bus: it
> would fail outright for an SDCA-class slave, and a slave driver
> declaring clock_reg_supported hits the same error. The pending WCD9378
> codec driver hand-rolls these writes as a workaround, following its
> downstream counterpart.
>
> Report the controller clock, letting the core derive the same values
> the hand-rolled writes program: 19.2 MHz base and the scale matching
> the bus clock (half the double rate).
>
> Assisted-by: Claude:claude-fable-5
> Signed-off-by: Jorijn van der Graaf <jorijnvdgraaf@xxxxxxxxxxxxx>
> ---
Tested-by: Srinivas Kandagatla <srinivas.kandagatla@xxxxxxxxxxxxxxxx>
Reviewed-by: Srinivas Kandagatla <srinivas.kandagatla@xxxxxxxxxxxxxxxx>

--srini

> This is the soundwire side of the plan from the WCD9378 v1 review
> discussion [1]; the codec's v2 will set prop.clock_reg_supported and
> delete its hand-rolled base/scale writes, relying on this property.
> Patch 2 is the helper extension requested in that thread.
>
> Validated on the Fairphone 6 (SM7635, WCD9378): with the hand-rolled
> writes deleted, the core reports "Configured bus base 1, scale 2,
> mclk 19200000, curr_freq 9600000" for both slaves at enumeration, the
> codec's SDCA sequencer powers up on those values, and capture works,
> across reboots.
>
> No behavior change for existing devices: without a class_id or
> clock_reg_supported, sdw_slave_set_frequency() returns before reading
> mclk_freq.
>
> [1] https://lore.kernel.org/all/20260707151329.67858-1-jorijnvdgraaf@xxxxxxxxxxxxx/
>
> drivers/soundwire/qcom.c | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/drivers/soundwire/qcom.c b/drivers/soundwire/qcom.c
> index 3562802f4204..55678a30cd4a 100644
> --- a/drivers/soundwire/qcom.c
> +++ b/drivers/soundwire/qcom.c
> @@ -1633,6 +1633,7 @@ static int qcom_swrm_probe(struct platform_device *pdev)
>
> prop = &ctrl->bus.prop;
> prop->max_clk_freq = DEFAULT_CLK_FREQ;
> + prop->mclk_freq = DEFAULT_CLK_FREQ;
> prop->num_clk_gears = 0;
> prop->num_clk_freq = MAX_FREQ_NUM;
> prop->clk_freq = &qcom_swrm_freq_tbl[0];
>
> base-commit: 6409292ab5f7d1a60a6f8948bd6dcd8633c36dfe