Message ID | 20231021211534.114991-1-hdegoede@redhat.com |
---|---|
State | Accepted |
Commit | 2cb54788393134d8174ee594002baae3ce52c61e |
Headers | show |
Series | [1/6] ASoC: Intel: soc-acpi-cht: Add Lenovo Yoga Tab 3 Pro YT3-X90 quirk | expand |
On 10/21/23 16:15, Hans de Goede wrote: > The Lenovo Yoga Tab 3 Pro YT3-X90 x86 tablet, which ships with Android with > a custom kernel as factory OS, does not list the used WM5102 codec inside > its DSDT. > > Workaround this with a new snd_soc_acpi_intel_baytrail_machines[] entry > which matches on the SST id instead of the codec id like nocodec does, > combined with using a machine_quirk callback which returns NULL on > other machines to skip the new entry on other machines. The work-around sounds fine, but out of curiosity what causes the codec driver to probe if there's no ACPI HID? Really wondering how we avoid the -517 error code with the deferred probe never completing because the codec driver never probed and registered the needed components?
Hi, On 10/23/23 20:45, Pierre-Louis Bossart wrote: > > > On 10/21/23 16:15, Hans de Goede wrote: >> The Lenovo Yoga Tab 3 Pro YT3-X90 x86 tablet, which ships with Android with >> a custom kernel as factory OS, does not list the used WM5102 codec inside >> its DSDT. >> >> Workaround this with a new snd_soc_acpi_intel_baytrail_machines[] entry >> which matches on the SST id instead of the codec id like nocodec does, >> combined with using a machine_quirk callback which returns NULL on >> other machines to skip the new entry on other machines. > > The work-around sounds fine, but out of curiosity what causes the codec > driver to probe if there's no ACPI HID? > > Really wondering how we avoid the -517 error code with the deferred > probe never completing because the codec driver never probed and > registered the needed components? These x86 android tablets ship with pretty broken DSDTs with A whole bunch of (usually i2c) devices missing like e.g. the touchscreen and the accelerometer. For the factory Android install this is not an issue because it uses drivers which instantiate the i2c-clients itself using hardcoded i2c-bus, i2c-address and irqs. To make this work under Linux I've written a special helper "driver" which loads only on these broken DSDT devices based on DMI modalias and then identifies the exact model (also by DMI) and instantiates the correct devices from this "driver" (really more of an old fashioned board file). This code also adds all the necessary properties, etc. to make standard drivers work, so all model specific knowledge missing from the DSDT is encoded in this special x86-android-tablets driver. I've also submitted a patch for that driver to instantiate the codec SPI device using spi_device_id matching instead of acpi_device_id matching: https://lore.kernel.org/platform-driver-x86/20231014205314.59333-5-hdegoede@redhat.com/ So this is the other side of the puzzle, I hope this helps explain how I actually got this working. Regards, Hans
On Sat, Oct 21, 2023 at 11:15:30PM +0200, Hans de Goede wrote: > Add the standard intel board file quirk mechanism also used in many > other intel board drivers and add a BYT_WM5102_SSP2 quirk setting > for designs using SSP2 instead of SSP0. This doesn't apply against current code, please check and resend: diff --cc sound/soc/intel/boards/bytcr_wm5102.c index fd7d5fdfd3fd,51682137c4a8..000000000000 --- a/sound/soc/intel/boards/bytcr_wm5102.c +++ b/sound/soc/intel/boards/bytcr_wm5102.c @@@ -201,8 -227,9 +227,14 @@@ static int byt_wm5102_init(struct snd_s { struct snd_soc_card *card = runtime->card; struct byt_wm5102_private *priv = snd_soc_card_get_drvdata(card); ++<<<<<<< HEAD + struct snd_soc_component *component = snd_soc_rtd_to_codec(runtime, 0)->component; + int ret, jack_type; ++======= + struct snd_soc_component *component = asoc_rtd_to_codec(runtime, 0)->component; + const struct snd_soc_dapm_route *custom_map = NULL; + int ret, jack_type, num_routes = 0; ++>>>>>>> ASoC: Intel: bytcr_wm5102: Add BYT_WM5102_SSP2 quirk card->dapm.idle_bias_off = true; @@@ -278,7 -323,7 +328,11 @@@ static int byt_wm5102_codec_fixup(struc return ret; } ++<<<<<<< HEAD + ret = snd_soc_dai_set_tdm_slot(snd_soc_rtd_to_cpu(rtd, 0), 0x3, 0x3, 2, 16); ++======= + ret = snd_soc_dai_set_tdm_slot(asoc_rtd_to_cpu(rtd, 0), 0x3, 0x3, 2, bits); ++>>>>>>> ASoC: Intel: bytcr_wm5102: Add BYT_WM5102_SSP2 quirk if (ret) { dev_err(rtd->dev, "Error setting I2S config: %d\n", ret); return ret;
On Sat, 21 Oct 2023 23:15:28 +0200, Hans de Goede wrote: > The Lenovo Yoga Tab 3 Pro YT3-X90 x86 tablet, which ships with Android with > a custom kernel as factory OS, does not list the used WM5102 codec inside > its DSDT. > > Workaround this with a new snd_soc_acpi_intel_baytrail_machines[] entry > which matches on the SST id instead of the codec id like nocodec does, > combined with using a machine_quirk callback which returns NULL on > other machines to skip the new entry on other machines. > > [...] Applied to https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git for-next Thanks! [1/6] ASoC: Intel: soc-acpi-cht: Add Lenovo Yoga Tab 3 Pro YT3-X90 quirk commit: 2cb54788393134d8174ee594002baae3ce52c61e [2/6] ASoC: Intel: bytcr_wm5102: Add support for Lenovo Yoga Tab 3 Pro YT3-X90 commit: 109cb2160128211ca7b17bad79cb0441f1440bc9 [3/6] ASoC: Intel: bytcr_wm5102: Add BYT_WM5102_SSP2 quirk (no commit info) [4/6] ASoC: Intel: bytcr_wm5102: Add BYT_WM5102_MCLK_19_2MHZ quirk (no commit info) [5/6] ASoC: Intel: bytcr_wm5102: Add BYT_WM5102_OUT_MAP quirk (no commit info) [6/6] ASoC: Intel: bytcr_wm5102: Add BYT_WM5102_IN_MAP quirk (no commit info) All being well this means that it will be integrated into the linux-next tree (usually sometime in the next 24 hours) and sent to Linus during the next merge window (or sooner if it is a bug fix), however if problems are discovered then the patch may be dropped or reverted. You may get further e-mails resulting from automated or manual testing and review of the tree, please engage with people reporting problems and send followup patches addressing any issues that are reported if needed. If any updates are required or you are submitting further changes they should be sent as incremental updates against current git, existing patches will not be replaced. Please add any relevant lists and maintainers to the CCs when replying to this mail. Thanks, Mark
diff --git a/sound/soc/intel/common/soc-acpi-intel-cht-match.c b/sound/soc/intel/common/soc-acpi-intel-cht-match.c index cdcbf04b8832..5e2ec60e2954 100644 --- a/sound/soc/intel/common/soc-acpi-intel-cht-match.c +++ b/sound/soc/intel/common/soc-acpi-intel-cht-match.c @@ -75,6 +75,39 @@ static struct snd_soc_acpi_mach *cht_ess8316_quirk(void *arg) return arg; } +/* + * The Lenovo Yoga Tab 3 Pro YT3-X90, with Android factory OS has a buggy DSDT + * with the coded not being listed at all. + */ +static const struct dmi_system_id lenovo_yoga_tab3_x90[] = { + { + /* Lenovo Yoga Tab 3 Pro YT3-X90, codec missing from DSDT */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Intel Corporation"), + DMI_MATCH(DMI_PRODUCT_NAME, "CHERRYVIEW D1 PLATFORM"), + DMI_MATCH(DMI_PRODUCT_VERSION, "Blade3-10A-001"), + }, + }, + { } +}; + +static struct snd_soc_acpi_mach cht_lenovo_yoga_tab3_x90_mach = { + .id = "10WM5102", + .drv_name = "bytcr_wm5102", + .fw_filename = "intel/fw_sst_22a8.bin", + .board = "bytcr_wm5102", + .sof_tplg_filename = "sof-cht-wm5102.tplg", +}; + +static struct snd_soc_acpi_mach *lenovo_yt3_x90_quirk(void *arg) +{ + if (dmi_check_system(lenovo_yoga_tab3_x90)) + return &cht_lenovo_yoga_tab3_x90_mach; + + /* Skip wildcard match snd_soc_acpi_intel_cherrytrail_machines[] entry */ + return NULL; +} + static const struct snd_soc_acpi_codecs rt5640_comp_ids = { .num_codecs = 2, .codecs = { "10EC5640", "10EC3276" }, @@ -175,6 +208,16 @@ struct snd_soc_acpi_mach snd_soc_acpi_intel_cherrytrail_machines[] = { .drv_name = "sof_pcm512x", .sof_tplg_filename = "sof-cht-src-50khz-pcm512x.tplg", }, + /* + * Special case for the Lenovo Yoga Tab 3 Pro YT3-X90 where the DSDT + * misses the codec. Match on the SST id instead, lenovo_yt3_x90_quirk() + * will return a YT3 specific mach or NULL when called on other hw, + * skipping this entry. + */ + { + .id = "808622A8", + .machine_quirk = lenovo_yt3_x90_quirk, + }, #if IS_ENABLED(CONFIG_SND_SOC_INTEL_BYT_CHT_NOCODEC_MACH) /*
The Lenovo Yoga Tab 3 Pro YT3-X90 x86 tablet, which ships with Android with a custom kernel as factory OS, does not list the used WM5102 codec inside its DSDT. Workaround this with a new snd_soc_acpi_intel_baytrail_machines[] entry which matches on the SST id instead of the codec id like nocodec does, combined with using a machine_quirk callback which returns NULL on other machines to skip the new entry on other machines. Signed-off-by: Hans de Goede <hdegoede@redhat.com> --- .../intel/common/soc-acpi-intel-cht-match.c | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+)