From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
To: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>,
Vinod Koul <vkoul@kernel.org>,
Bard Liao <yung-chuan.liao@linux.intel.com>,
Sanyog Kale <sanyog.r.kale@intel.com>,
Andy Gross <agross@kernel.org>,
Bjorn Andersson <andersson@kernel.org>,
Konrad Dybcio <konrad.dybcio@linaro.org>,
Liam Girdwood <lgirdwood@gmail.com>,
Mark Brown <broonie@kernel.org>, Jaroslav Kysela <perex@perex.cz>,
Takashi Iwai <tiwai@suse.com>,
alsa-devel@alsa-project.org, linux-kernel@vger.kernel.org,
linux-arm-msm@vger.kernel.org
Cc: Patrick Lai <quic_plai@quicinc.com>
Subject: Re: [PATCH 3/6] ASoC: codecs: wcd938x: Check for enumeration before using TX device
Date: Thu, 20 Apr 2023 09:18:15 -0500 [thread overview]
Message-ID: <dfe88b94-215b-a86f-60b4-25d2f9ea0e5f@linux.intel.com> (raw)
In-Reply-To: <20230420101617.142225-4-krzysztof.kozlowski@linaro.org>
On 4/20/23 05:16, Krzysztof Kozlowski wrote:
> Qualcomm WCD938x Soundwire codecs come as two Soundwire devices - TX
> and RX - on two Soundwire buses. In DTS they are represented as three
> device nodes: Soundwire TX, Soundwire RX and the platform codec node
> (binding to this driver).
>
> Probing (and Soundwire enumeration) of all devices can happen in any
> order, but only the Soundwire TX WCD938x device is used for accessing
> actual WCD938x registers. It is possible that component bind() in the
> platform driver will be called too early, before the Soundwire TX device
> is fully enumerated. This might work or might not, but we cannot handle
> it correctly from the codec driver. It's job for Soundwire master to
> bring up devices in correct order.
That last sentence isn't aligned with the way enumeration works in
general for SoundWire.
The Manager starts the clock, usually after a bus reset, and waits for
Peripherals to signal their presence with Device0 Attached.
If multiple Peripherals are attached as Device0, the enumeration will
resolve conflicts at the hardware level, and the Manager *cannot*
control the order of enumeration; the order is defined by the values in
the devID registers, whichever Peripheral has the highest value in the
DevID registers wins the enumeration, and others have to back-off and be
enumerated later.
Probing and enumeration are also different concepts. The SoundWire
design allows for drivers to be probed even in the absence of any active
hardware. This was added on purpose so that the driver could e.g.
program a GPIO or talk to a power-management chip to allow SoundWire
devices to start interacting with the bus.
see also suggestion below...
> Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
>
> ---
>
> Cc: Patrick Lai <quic_plai@quicinc.com>
> ---
> sound/soc/codecs/wcd938x.c | 11 +++++++++++
> 1 file changed, 11 insertions(+)
>
> diff --git a/sound/soc/codecs/wcd938x.c b/sound/soc/codecs/wcd938x.c
> index 212667a7249c..e8e07e120fa1 100644
> --- a/sound/soc/codecs/wcd938x.c
> +++ b/sound/soc/codecs/wcd938x.c
> @@ -77,6 +77,8 @@
> #define WCD938X_MBHC_MOISTURE_RREF R_24_KOHM
> #define WCD_MBHC_HS_V_MAX 1600
>
> +#define WCD938X_ENUM_TIMEOUT_MS 500
> +
> #define WCD938X_EAR_PA_GAIN_TLV(xname, reg, shift, max, invert, tlv_array) \
> { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
> .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ |\
> @@ -4425,6 +4427,15 @@ static int wcd938x_bind(struct device *dev)
> wcd938x->sdw_priv[AIF1_PB]->slave_irq = wcd938x->virq;
> wcd938x->sdw_priv[AIF1_CAP]->slave_irq = wcd938x->virq;
>
> + /*
> + * Before any TX slave regmap usage, be sure the TX slave is actually
> + * enumerated.
> + */
...
the alternative is to move regmap to be cache-only in the probe and
remove the cache-only property when the device is enumerated.
That's a trick that's used for all resume cases in codecs in Intel
platforms, and we need to extend it for the startup cases as well.
> + ret = wait_for_completion_timeout(&wcd938x->tx_sdw_dev->enumeration_complete,
> + msecs_to_jiffies(WCD938X_ENUM_TIMEOUT_MS));
> + if (!ret)
> + dev_warn(dev, "Enumeration timeout in bind, possible failures in accessing registers\n");
> +
> ret = wcd938x_set_micbias_data(wcd938x);
> if (ret < 0) {
> dev_err(dev, "%s: bad micbias pdata\n", __func__);
next prev parent reply other threads:[~2023-04-20 17:14 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-04-20 10:16 [PATCH 0/6] ASoC/soundwire: qcom: correctly probe devices after link init Krzysztof Kozlowski
2023-04-20 10:16 ` [PATCH 1/6] ASoC: wcd938x: switch to using gpiod API Krzysztof Kozlowski
2023-04-20 11:58 ` Mark Brown
2023-04-20 12:30 ` Krzysztof Kozlowski
2023-04-20 12:32 ` Krzysztof Kozlowski
2023-04-20 13:00 ` Mark Brown
2023-04-20 14:16 ` Krzysztof Kozlowski
2023-04-20 16:28 ` Mark Brown
2023-04-20 17:51 ` Krzysztof Kozlowski
2023-04-20 18:19 ` Mark Brown
2023-04-20 10:16 ` [PATCH 2/6] ASoC: codecs: wcd938x: Keep device in reset till bind Krzysztof Kozlowski
2023-04-20 10:16 ` [PATCH 3/6] ASoC: codecs: wcd938x: Check for enumeration before using TX device Krzysztof Kozlowski
2023-04-20 14:18 ` Pierre-Louis Bossart [this message]
2023-04-20 17:19 ` Mark Brown
2023-04-20 17:57 ` Krzysztof Kozlowski
2023-04-20 18:22 ` Mark Brown
2023-04-20 10:16 ` [PATCH 4/6] soundwire: qcom: drop unused struct qcom_swrm_ctrl members Krzysztof Kozlowski
2023-04-20 10:16 ` [PATCH 5/6] soudnwire: master: protect concurrecnt check for bus->md Krzysztof Kozlowski
2023-04-20 16:42 ` Pierre-Louis Bossart
2023-04-20 17:27 ` Krzysztof Kozlowski
2023-04-20 21:13 ` Pierre-Louis Bossart
2023-04-20 10:16 ` [PATCH 6/6] soundwire: qcom: do not probe devices before bus/link init Krzysztof Kozlowski
2023-04-20 21:37 ` Pierre-Louis Bossart
2023-05-01 12:24 ` Krzysztof Kozlowski
2023-05-01 13:43 ` Pierre-Louis Bossart
2023-05-03 8:00 ` Krzysztof Kozlowski
2023-05-03 14:11 ` Pierre-Louis Bossart
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=dfe88b94-215b-a86f-60b4-25d2f9ea0e5f@linux.intel.com \
--to=pierre-louis.bossart@linux.intel.com \
--cc=agross@kernel.org \
--cc=alsa-devel@alsa-project.org \
--cc=andersson@kernel.org \
--cc=broonie@kernel.org \
--cc=konrad.dybcio@linaro.org \
--cc=krzysztof.kozlowski@linaro.org \
--cc=lgirdwood@gmail.com \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=perex@perex.cz \
--cc=quic_plai@quicinc.com \
--cc=sanyog.r.kale@intel.com \
--cc=tiwai@suse.com \
--cc=vkoul@kernel.org \
--cc=yung-chuan.liao@linux.intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox