Re: [PATCH] ASoC: tas2783-sdw: power the Function up before preparing the port
From: Mukunda,Vijendar
Date: Thu Aug 13 2026 - 12:03:24 EST
On 13/08/26 18:52, Mark Brown wrote:
> On Thu, Aug 13, 2026 at 12:28:10AM +0300, Andrey Golovko wrote:
>
>> A Data Port cannot complete channel preparation while the SDCA Function
>> is powered down: the peripheral raises the channel's bit in
>> DPn_PrepareStatus and never clears it.
> ...
>
>> Power the Function up in the PRE_PREP callback, immediately before the
>> PrepareCtrl write it already performs, so that preparation has what it
>> needs on every path that prepares a port.
>> case SDW_OPS_PORT_PRE_PREP:
>> + /*
>> + * The Function has to be powered before the port can complete
>> + * channel preparation. hw_params() does that when a stream is
>> + * set up, but a stream that is only re-prepared - as userspace
>> + * does after the peripheral lost power in S0i3 - does not go
>> + * through hw_params() again, and the peripheral is back at its
>> + * PS3 reset default. Power it up here, where it is needed.
>> + */
>> + scoped_guard(mutex, &tas_dev->pde_lock)
>> + ret = regmap_write(tas_dev->regmap,
>> + SDW_SDCA_CTL(1, TAS2783_SDCA_ENT_PDE23,
>> + TAS2783_SDCA_CTL_REQ_POW_STATE, 0),
>> + TAS2783_SDCA_POW_STATE_ON);
>> + if (ret) {
>> + dev_err(dev, "power up failed for port %d, err=%d\n",
>> + prep_ch->num, ret);
>> + return ret;
>> + }
> Does this DTRT if userspace restartss the stream by directly calling
> SNDRV_PCM_IOCTL_RESUME (AMD adverise SNDR_PCM_INFO_RESUME...)?
> Similarly we can suspend while prepared. Either something needs to
> force us to prepare again or this needs to be moved somewhere that's
> always called.
I agree with Mark's observation. For drivers advertising SNDRV_PCM_INFO_RESUME,
userspace may resume a stream via SNDRV_PCM_IOCTL_RESUME without going through
a new prepare cycle. Similarly, a stream may be suspended while already
prepared and later resumed without re-running PRE_PREP.
If those paths do not guarantee port preparation is executed again, we either
need to force a re-prepare after power loss or move the power-up sequence to a
callback that is always hit before data transfer resumes.
>
>> +
>> ret = sdw_write_no_pm(slave, addr, prep_ch->ch_mask);
>> if (ret)
>> dev_err(dev, "prep failed for port %d, err=%d\n",
>>
>> base-commit: 6f6fb37f9f9a8ae88faa1b5b1978e57381488502
>> --
>> 2.53.0
>>