Path: blob/master/sound/soc/intel/common/soc-acpi-intel-ptl-match.c
53490 views
// SPDX-License-Identifier: GPL-2.0-only1/*2* soc-acpi-intel-ptl-match.c - tables and support for PTL ACPI enumeration.3*4* Copyright (c) 2024, Intel Corporation.5*6* Order of entries in snd_soc_acpi_intel_ptl_sdw_machines[] matters.7* Check subset of link mask when matching the machine driver, rule is8* superset match should be ordered before subset matches.9*/1011#include <sound/soc-acpi.h>12#include <sound/soc-acpi-intel-match.h>13#include "sof-function-topology-lib.h"14#include "soc-acpi-intel-sdca-quirks.h"15#include "soc-acpi-intel-sdw-mockup-match.h"16#include <sound/soc-acpi-intel-ssp-common.h>1718static const struct snd_soc_acpi_codecs ptl_rt5682_rt5682s_hp = {19.num_codecs = 2,20.codecs = {RT5682_ACPI_HID, RT5682S_ACPI_HID},21};2223static const struct snd_soc_acpi_codecs ptl_essx_83x6 = {24.num_codecs = 3,25.codecs = { "ESSX8316", "ESSX8326", "ESSX8336"},26};2728static const struct snd_soc_acpi_codecs ptl_lt6911_hdmi = {29.num_codecs = 1,30.codecs = {"INTC10B0"}31};3233struct snd_soc_acpi_mach snd_soc_acpi_intel_ptl_machines[] = {34{35.comp_ids = &ptl_rt5682_rt5682s_hp,36.drv_name = "ptl_rt5682_c1_h02",37.machine_quirk = snd_soc_acpi_codec_list,38.quirk_data = &ptl_lt6911_hdmi,39.sof_tplg_filename = "sof-ptl-rt5682-ssp1-hdmi-ssp02.tplg",40},41{42.comp_ids = &ptl_rt5682_rt5682s_hp,43.drv_name = "ptl_rt5682_def",44.sof_tplg_filename = "sof-ptl", /* the tplg suffix is added at run time */45.tplg_quirk_mask = SND_SOC_ACPI_TPLG_INTEL_AMP_NAME |46SND_SOC_ACPI_TPLG_INTEL_CODEC_NAME,47},48{49.comp_ids = &ptl_essx_83x6,50.drv_name = "ptl_es83x6_c1_h02",51.machine_quirk = snd_soc_acpi_codec_list,52.quirk_data = &ptl_lt6911_hdmi,53.sof_tplg_filename = "sof-ptl-es83x6-ssp1-hdmi-ssp02.tplg",54},55{56.comp_ids = &ptl_essx_83x6,57.drv_name = "sof-essx8336",58.sof_tplg_filename = "sof-ptl-es8336", /* the tplg suffix is added at run time */59.tplg_quirk_mask = SND_SOC_ACPI_TPLG_INTEL_SSP_NUMBER |60SND_SOC_ACPI_TPLG_INTEL_SSP_MSB |61SND_SOC_ACPI_TPLG_INTEL_DMIC_NUMBER,62},63/* place amp-only boards in the end of table */64{65.id = "INTC10B0",66.drv_name = "ptl_lt6911_hdmi_ssp",67.sof_tplg_filename = "sof-ptl-hdmi-ssp02.tplg",68},69{},70};71EXPORT_SYMBOL_GPL(snd_soc_acpi_intel_ptl_machines);7273static const struct snd_soc_acpi_endpoint single_endpoint = {74.num = 0,75.aggregated = 0,76.group_position = 0,77.group_id = 0,78};7980static const struct snd_soc_acpi_endpoint spk_l_endpoint = {81.num = 0,82.aggregated = 1,83.group_position = 0,84.group_id = 1,85};8687static const struct snd_soc_acpi_endpoint spk_r_endpoint = {88.num = 0,89.aggregated = 1,90.group_position = 1,91.group_id = 1,92};9394static const struct snd_soc_acpi_endpoint spk_1_endpoint = {95.num = 0,96.aggregated = 1,97.group_position = 1,98.group_id = 1,99};100101static const struct snd_soc_acpi_endpoint spk_2_endpoint = {102.num = 0,103.aggregated = 1,104.group_position = 2,105.group_id = 1,106};107108static const struct snd_soc_acpi_endpoint spk_3_endpoint = {109.num = 0,110.aggregated = 1,111.group_position = 3,112.group_id = 1,113};114115static const struct snd_soc_acpi_endpoint spk_4_endpoint = {116.num = 0,117.aggregated = 1,118.group_position = 4,119.group_id = 1,120};121122static const struct snd_soc_acpi_endpoint spk_5_endpoint = {123.num = 0,124.aggregated = 1,125.group_position = 5,126.group_id = 1,127};128129static const struct snd_soc_acpi_endpoint spk_6_endpoint = {130.num = 0,131.aggregated = 1,132.group_position = 6,133.group_id = 1,134};135136/*137* Multi-function codecs with three endpoints created for138* headset, amp and dmic functions.139*/140static const struct snd_soc_acpi_endpoint rt_mf_endpoints[] = {141{142.num = 0,143.aggregated = 0,144.group_position = 0,145.group_id = 0,146},147{148.num = 1,149.aggregated = 0,150.group_position = 0,151.group_id = 0,152},153{154.num = 2,155.aggregated = 0,156.group_position = 0,157.group_id = 0,158},159};160161static const struct snd_soc_acpi_endpoint jack_dmic_endpoints[] = {162/* Jack Endpoint */163{164.num = 0,165.aggregated = 0,166.group_position = 0,167.group_id = 0,168},169/* DMIC Endpoint */170{171.num = 1,172.aggregated = 0,173.group_position = 0,174.group_id = 0,175},176};177178static const struct snd_soc_acpi_endpoint jack_amp_g1_dmic_endpoints[] = {179/* Jack Endpoint */180{181.num = 0,182.aggregated = 0,183.group_position = 0,184.group_id = 0,185},186/* Amp Endpoint, work as spk_l_endpoint */187{188.num = 1,189.aggregated = 1,190.group_position = 0,191.group_id = 1,192},193/* DMIC Endpoint */194{195.num = 2,196.aggregated = 0,197.group_position = 0,198.group_id = 0,199},200};201202static const struct snd_soc_acpi_endpoint cs42l43_amp_spkagg_endpoints[] = {203{ /* Jack Playback Endpoint */204.num = 0,205.aggregated = 0,206.group_position = 0,207.group_id = 0,208},209{ /* DMIC Capture Endpoint */210.num = 1,211.aggregated = 0,212.group_position = 0,213.group_id = 0,214},215{ /* Jack Capture Endpoint */216.num = 2,217.aggregated = 0,218.group_position = 0,219.group_id = 0,220},221{ /* Speaker Playback Endpoint */222.num = 3,223.aggregated = 1,224.group_position = 0,225.group_id = 1,226},227};228229static const struct snd_soc_acpi_adr_device cs42l43_2_adr[] = {230{231.adr = 0x00023001fa424301ull,232.num_endpoints = ARRAY_SIZE(cs42l43_amp_spkagg_endpoints),233.endpoints = cs42l43_amp_spkagg_endpoints,234.name_prefix = "cs42l43"235}236};237238static const struct snd_soc_acpi_adr_device cs42l43_3_agg_adr[] = {239{240.adr = 0x00033001FA424301ull,241.num_endpoints = ARRAY_SIZE(cs42l43_amp_spkagg_endpoints),242.endpoints = cs42l43_amp_spkagg_endpoints,243.name_prefix = "cs42l43"244}245};246247static const struct snd_soc_acpi_adr_device cs35l56_2_lr_adr[] = {248{249.adr = 0x00023001fa355601ull,250.num_endpoints = 1,251.endpoints = &spk_l_endpoint,252.name_prefix = "AMP1"253},254{255.adr = 0x00023101fa355601ull,256.num_endpoints = 1,257.endpoints = &spk_r_endpoint,258.name_prefix = "AMP2"259}260};261262static const struct snd_soc_acpi_adr_device cs35l56_1_3amp_adr[] = {263{264.adr = 0x00013001fa355601ull,265.num_endpoints = 1,266.endpoints = &spk_1_endpoint,267.name_prefix = "AMP1"268},269{270.adr = 0x00013101fa355601ull,271.num_endpoints = 1,272.endpoints = &spk_2_endpoint,273.name_prefix = "AMP2"274},275{276.adr = 0x00013201fa355601ull,277.num_endpoints = 1,278.endpoints = &spk_3_endpoint,279.name_prefix = "AMP3"280}281};282283static const struct snd_soc_acpi_adr_device cs35l56_3_3amp_adr[] = {284{285.adr = 0x00033301fa355601ull,286.num_endpoints = 1,287.endpoints = &spk_4_endpoint,288.name_prefix = "AMP4"289},290{291.adr = 0x00033401fa355601ull,292.num_endpoints = 1,293.endpoints = &spk_5_endpoint,294.name_prefix = "AMP5"295},296{297.adr = 0x00033501fa355601ull,298.num_endpoints = 1,299.endpoints = &spk_6_endpoint,300.name_prefix = "AMP6"301}302};303304static const struct snd_soc_acpi_adr_device rt711_sdca_0_adr[] = {305{306.adr = 0x000030025D071101ull,307.num_endpoints = 1,308.endpoints = &single_endpoint,309.name_prefix = "rt711"310}311};312313static const struct snd_soc_acpi_adr_device rt712_vb_2_group1_adr[] = {314{315.adr = 0x000230025D071201ull,316.num_endpoints = ARRAY_SIZE(jack_amp_g1_dmic_endpoints),317.endpoints = jack_amp_g1_dmic_endpoints,318.name_prefix = "rt712"319}320};321322static const struct snd_soc_acpi_adr_device rt712_vb_3_group1_adr[] = {323{324.adr = 0x000330025D071201ull,325.num_endpoints = ARRAY_SIZE(jack_amp_g1_dmic_endpoints),326.endpoints = jack_amp_g1_dmic_endpoints,327.name_prefix = "rt712"328}329};330331static const struct snd_soc_acpi_adr_device rt713_vb_2_adr[] = {332{333.adr = 0x000230025d071301ull,334.num_endpoints = ARRAY_SIZE(jack_dmic_endpoints),335.endpoints = jack_dmic_endpoints,336.name_prefix = "rt713"337}338};339340static const struct snd_soc_acpi_adr_device rt713_vb_3_adr[] = {341{342.adr = 0x000330025D071301ull,343.num_endpoints = ARRAY_SIZE(jack_dmic_endpoints),344.endpoints = jack_dmic_endpoints,345.name_prefix = "rt713"346}347};348349static const struct snd_soc_acpi_adr_device rt1320_3_group1_adr[] = {350{351.adr = 0x000330025D132001ull,352.num_endpoints = 1,353.endpoints = &spk_r_endpoint,354.name_prefix = "rt1320-1"355}356};357358static const struct snd_soc_acpi_adr_device rt722_0_agg_adr[] = {359{360.adr = 0x000030025d072201ull,361.num_endpoints = ARRAY_SIZE(jack_amp_g1_dmic_endpoints),362.endpoints = jack_amp_g1_dmic_endpoints,363.name_prefix = "rt722"364}365};366367static const struct snd_soc_acpi_adr_device rt722_0_single_adr[] = {368{369.adr = 0x000030025d072201ull,370.num_endpoints = ARRAY_SIZE(rt_mf_endpoints),371.endpoints = rt_mf_endpoints,372.name_prefix = "rt722"373}374};375376static const struct snd_soc_acpi_adr_device rt722_1_single_adr[] = {377{378.adr = 0x000130025d072201ull,379.num_endpoints = ARRAY_SIZE(rt_mf_endpoints),380.endpoints = rt_mf_endpoints,381.name_prefix = "rt722"382}383};384385static const struct snd_soc_acpi_adr_device rt722_3_single_adr[] = {386{387.adr = 0x000330025d072201ull,388.num_endpoints = ARRAY_SIZE(rt_mf_endpoints),389.endpoints = rt_mf_endpoints,390.name_prefix = "rt722"391}392};393394static const struct snd_soc_acpi_adr_device rt1320_1_group1_adr[] = {395{396.adr = 0x000130025D132001ull,397.num_endpoints = 1,398.endpoints = &spk_r_endpoint,399.name_prefix = "rt1320-1"400}401};402403static const struct snd_soc_acpi_adr_device rt1320_1_group2_adr[] = {404{405.adr = 0x000130025D132001ull,406.num_endpoints = 1,407.endpoints = &spk_l_endpoint,408.name_prefix = "rt1320-1"409}410};411412static const struct snd_soc_acpi_adr_device rt1320_2_group1_adr[] = {413{414.adr = 0x000230025D132001ull,415.num_endpoints = 1,416.endpoints = &spk_r_endpoint,417.name_prefix = "rt1320-1"418}419};420421static const struct snd_soc_acpi_adr_device rt1320_2_group2_adr[] = {422{423.adr = 0x000230025D132001ull,424.num_endpoints = 1,425.endpoints = &spk_r_endpoint,426.name_prefix = "rt1320-2"427}428};429430static const struct snd_soc_acpi_adr_device rt1320_2_group2_l_adr[] = {431{432.adr = 0x000230025D132001ull,433.num_endpoints = 1,434.endpoints = &spk_l_endpoint,435.name_prefix = "rt1320-1"436}437};438439static const struct snd_soc_acpi_adr_device rt1320_3_group2_adr[] = {440{441.adr = 0x000330025D132001ull,442.num_endpoints = 1,443.endpoints = &spk_r_endpoint,444.name_prefix = "rt1320-2"445}446};447448static const struct snd_soc_acpi_link_adr ptl_cs42l43_agg_l3_cs35l56_l2[] = {449{450.mask = BIT(3),451.num_adr = ARRAY_SIZE(cs42l43_3_agg_adr),452.adr_d = cs42l43_3_agg_adr,453},454{455.mask = BIT(2),456.num_adr = ARRAY_SIZE(cs35l56_2_lr_adr),457.adr_d = cs35l56_2_lr_adr,458},459{}460};461462static const struct snd_soc_acpi_link_adr ptl_cs42l43_l2_cs35l56x6_l13[] = {463{464.mask = BIT(2),465.num_adr = ARRAY_SIZE(cs42l43_2_adr),466.adr_d = cs42l43_2_adr,467},468{469.mask = BIT(1),470.num_adr = ARRAY_SIZE(cs35l56_1_3amp_adr),471.adr_d = cs35l56_1_3amp_adr,472},473{474.mask = BIT(3),475.num_adr = ARRAY_SIZE(cs35l56_3_3amp_adr),476.adr_d = cs35l56_3_3amp_adr,477},478{}479};480481static const struct snd_soc_acpi_link_adr ptl_rt722_only[] = {482{483.mask = BIT(0),484.num_adr = ARRAY_SIZE(rt722_0_single_adr),485.adr_d = rt722_0_single_adr,486},487{}488};489490static const struct snd_soc_acpi_link_adr ptl_rt722_l1[] = {491{492.mask = BIT(1),493.num_adr = ARRAY_SIZE(rt722_1_single_adr),494.adr_d = rt722_1_single_adr,495},496{}497};498499static const struct snd_soc_acpi_link_adr ptl_rt722_l3[] = {500{501.mask = BIT(3),502.num_adr = ARRAY_SIZE(rt722_3_single_adr),503.adr_d = rt722_3_single_adr,504},505{}506};507508static const struct snd_soc_acpi_link_adr ptl_rt722_l0_rt1320_l23[] = {509{510.mask = BIT(0),511.num_adr = ARRAY_SIZE(rt722_0_agg_adr),512.adr_d = rt722_0_agg_adr,513},514{515.mask = BIT(2),516.num_adr = ARRAY_SIZE(rt1320_2_group2_l_adr),517.adr_d = rt1320_2_group2_l_adr,518},519{520.mask = BIT(3),521.num_adr = ARRAY_SIZE(rt1320_3_group2_adr),522.adr_d = rt1320_3_group2_adr,523},524{}525};526527static const struct snd_soc_acpi_link_adr ptl_rvp[] = {528{529.mask = BIT(0),530.num_adr = ARRAY_SIZE(rt711_sdca_0_adr),531.adr_d = rt711_sdca_0_adr,532},533{}534};535536static const struct snd_soc_acpi_link_adr ptl_sdw_rt713_vb_l2_rt1320_l13[] = {537{538.mask = BIT(2),539.num_adr = ARRAY_SIZE(rt713_vb_2_adr),540.adr_d = rt713_vb_2_adr,541},542{543.mask = BIT(1),544.num_adr = ARRAY_SIZE(rt1320_1_group2_adr),545.adr_d = rt1320_1_group2_adr,546},547{548.mask = BIT(3),549.num_adr = ARRAY_SIZE(rt1320_3_group2_adr),550.adr_d = rt1320_3_group2_adr,551},552{}553};554555static const struct snd_soc_acpi_link_adr ptl_sdw_rt713_vb_l3_rt1320_l12[] = {556{557.mask = BIT(3),558.num_adr = ARRAY_SIZE(rt713_vb_3_adr),559.adr_d = rt713_vb_3_adr,560},561{562.mask = BIT(1),563.num_adr = ARRAY_SIZE(rt1320_1_group2_adr),564.adr_d = rt1320_1_group2_adr,565},566{567.mask = BIT(2),568.num_adr = ARRAY_SIZE(rt1320_2_group2_adr),569.adr_d = rt1320_2_group2_adr,570},571{}572};573574static const struct snd_soc_acpi_link_adr ptl_sdw_rt712_vb_l2_rt1320_l1[] = {575{576.mask = BIT(2),577.num_adr = ARRAY_SIZE(rt712_vb_2_group1_adr),578.adr_d = rt712_vb_2_group1_adr,579},580{581.mask = BIT(1),582.num_adr = ARRAY_SIZE(rt1320_1_group1_adr),583.adr_d = rt1320_1_group1_adr,584},585{}586};587588static const struct snd_soc_acpi_link_adr ptl_sdw_rt712_vb_l3_rt1320_l2[] = {589{590.mask = BIT(3),591.num_adr = ARRAY_SIZE(rt712_vb_3_group1_adr),592.adr_d = rt712_vb_3_group1_adr,593},594{595.mask = BIT(2),596.num_adr = ARRAY_SIZE(rt1320_2_group1_adr),597.adr_d = rt1320_2_group1_adr,598},599{}600};601602static const struct snd_soc_acpi_link_adr ptl_sdw_rt712_vb_l3_rt1320_l3[] = {603{604.mask = BIT(3),605.num_adr = ARRAY_SIZE(rt712_vb_3_group1_adr),606.adr_d = rt712_vb_3_group1_adr,607},608{609.mask = BIT(3),610.num_adr = ARRAY_SIZE(rt1320_3_group1_adr),611.adr_d = rt1320_3_group1_adr,612},613{}614};615616/* this table is used when there is no I2S codec present */617struct snd_soc_acpi_mach snd_soc_acpi_intel_ptl_sdw_machines[] = {618/* Order Priority: mockup > most links > most bit link-mask > alphabetical */619{620.link_mask = GENMASK(3, 0),621.links = sdw_mockup_headset_2amps_mic,622.drv_name = "sof_sdw",623.sof_tplg_filename = "sof-ptl-rt711-rt1308-rt715.tplg",624},625{626.link_mask = BIT(0) | BIT(1) | BIT(3),627.links = sdw_mockup_headset_1amp_mic,628.drv_name = "sof_sdw",629.sof_tplg_filename = "sof-ptl-rt711-rt1308-mono-rt715.tplg",630},631{632.link_mask = GENMASK(2, 0),633.links = sdw_mockup_mic_headset_1amp,634.drv_name = "sof_sdw",635.sof_tplg_filename = "sof-ptl-rt715-rt711-rt1308-mono.tplg",636},637{638.link_mask = BIT(0),639.links = sdw_mockup_multi_func,640.drv_name = "sof_sdw",641.sof_tplg_filename = "sof-ptl-rt722.tplg", /* Reuse the existing tplg file */642},643{644.link_mask = BIT(1) | BIT(2) | BIT(3),645.links = ptl_sdw_rt713_vb_l2_rt1320_l13,646.drv_name = "sof_sdw",647.machine_check = snd_soc_acpi_intel_sdca_is_device_rt712_vb,648.sof_tplg_filename = "sof-ptl-rt713-l2-rt1320-l13.tplg",649.get_function_tplg_files = sof_sdw_get_tplg_files,650},651{652.link_mask = BIT(1) | BIT(2) | BIT(3),653.links = ptl_sdw_rt713_vb_l3_rt1320_l12,654.drv_name = "sof_sdw",655.machine_check = snd_soc_acpi_intel_sdca_is_device_rt712_vb,656.sof_tplg_filename = "sof-ptl-rt713-l3-rt1320-l12.tplg",657.get_function_tplg_files = sof_sdw_get_tplg_files,658},659{660.link_mask = BIT(1) | BIT(2) | BIT(3),661.links = ptl_cs42l43_l2_cs35l56x6_l13,662.drv_name = "sof_sdw",663.sof_tplg_filename = "sof-ptl-cs42l43-l2-cs35l56x6-l13.tplg",664},665{666.link_mask = BIT(0) | BIT(2) | BIT(3),667.links = ptl_rt722_l0_rt1320_l23,668.drv_name = "sof_sdw",669.sof_tplg_filename = "sof-ptl-rt722-l0-rt1320-l23.tplg",670.get_function_tplg_files = sof_sdw_get_tplg_files,671},672{673.link_mask = BIT(1) | BIT(2),674.links = ptl_sdw_rt712_vb_l2_rt1320_l1,675.drv_name = "sof_sdw",676.machine_check = snd_soc_acpi_intel_sdca_is_device_rt712_vb,677.sof_tplg_filename = "sof-ptl-rt712-l2-rt1320-l1.tplg",678.get_function_tplg_files = sof_sdw_get_tplg_files,679},680{681.link_mask = BIT(2) | BIT(3),682.links = ptl_sdw_rt712_vb_l3_rt1320_l2,683.drv_name = "sof_sdw",684.machine_check = snd_soc_acpi_intel_sdca_is_device_rt712_vb,685.sof_tplg_filename = "sof-ptl-rt712-l3-rt1320-l2.tplg",686.get_function_tplg_files = sof_sdw_get_tplg_files,687},688{689.link_mask = BIT(2) | BIT(3),690.links = ptl_cs42l43_agg_l3_cs35l56_l2,691.drv_name = "sof_sdw",692.sof_tplg_filename = "sof-ptl-cs42l43-agg-l3-cs35l56-l2.tplg",693},694{695.link_mask = BIT(0),696.links = ptl_rvp,697.drv_name = "sof_sdw",698.sof_tplg_filename = "sof-ptl-rt711.tplg",699},700{701.link_mask = BIT(0),702.links = ptl_rt722_only,703.drv_name = "sof_sdw",704.sof_tplg_filename = "sof-ptl-rt722.tplg",705.get_function_tplg_files = sof_sdw_get_tplg_files,706},707{708.link_mask = BIT(1),709.links = ptl_rt722_l1,710.drv_name = "sof_sdw",711.sof_tplg_filename = "sof-ptl-rt722.tplg",712.get_function_tplg_files = sof_sdw_get_tplg_files,713},714{715.link_mask = BIT(3),716.links = ptl_sdw_rt712_vb_l3_rt1320_l3,717.drv_name = "sof_sdw",718.machine_check = snd_soc_acpi_intel_sdca_is_device_rt712_vb,719.sof_tplg_filename = "sof-ptl-rt712-l3-rt1320-l3.tplg",720.get_function_tplg_files = sof_sdw_get_tplg_files,721},722{723.link_mask = BIT(3),724.links = ptl_rt722_l3,725.drv_name = "sof_sdw",726.sof_tplg_filename = "sof-ptl-rt722.tplg",727.get_function_tplg_files = sof_sdw_get_tplg_files,728},729{},730};731EXPORT_SYMBOL_GPL(snd_soc_acpi_intel_ptl_sdw_machines);732733734