Path: blob/master/sound/soc/intel/common/soc-acpi-intel-ptl-match.c
29268 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_endpoint cs42l43_endpoints[] = {230{ /* Jack Playback Endpoint */231.num = 0,232.aggregated = 0,233.group_position = 0,234.group_id = 0,235},236{ /* DMIC Capture Endpoint */237.num = 1,238.aggregated = 0,239.group_position = 0,240.group_id = 0,241},242{ /* Jack Capture Endpoint */243.num = 2,244.aggregated = 0,245.group_position = 0,246.group_id = 0,247},248{ /* Speaker Playback Endpoint */249.num = 3,250.aggregated = 0,251.group_position = 0,252.group_id = 0,253},254};255256static const struct snd_soc_acpi_adr_device cs42l43_2_adr[] = {257{258.adr = 0x00023001fa424301ull,259.num_endpoints = ARRAY_SIZE(cs42l43_amp_spkagg_endpoints),260.endpoints = cs42l43_amp_spkagg_endpoints,261.name_prefix = "cs42l43"262}263};264265static const struct snd_soc_acpi_adr_device cs35l56_1_3amp_adr[] = {266{267.adr = 0x00013001fa355601ull,268.num_endpoints = 1,269.endpoints = &spk_1_endpoint,270.name_prefix = "AMP1"271},272{273.adr = 0x00013101fa355601ull,274.num_endpoints = 1,275.endpoints = &spk_2_endpoint,276.name_prefix = "AMP2"277},278{279.adr = 0x00013201fa355601ull,280.num_endpoints = 1,281.endpoints = &spk_3_endpoint,282.name_prefix = "AMP3"283}284};285286static const struct snd_soc_acpi_adr_device cs35l56_3_3amp_adr[] = {287{288.adr = 0x00033301fa355601ull,289.num_endpoints = 1,290.endpoints = &spk_4_endpoint,291.name_prefix = "AMP4"292},293{294.adr = 0x00033401fa355601ull,295.num_endpoints = 1,296.endpoints = &spk_5_endpoint,297.name_prefix = "AMP5"298},299{300.adr = 0x00033501fa355601ull,301.num_endpoints = 1,302.endpoints = &spk_6_endpoint,303.name_prefix = "AMP6"304}305};306307static const struct snd_soc_acpi_adr_device cs42l43_3_adr[] = {308{309.adr = 0x00033001FA424301ull,310.num_endpoints = ARRAY_SIZE(cs42l43_endpoints),311.endpoints = cs42l43_endpoints,312.name_prefix = "cs42l43"313}314};315316static const struct snd_soc_acpi_adr_device rt711_sdca_0_adr[] = {317{318.adr = 0x000030025D071101ull,319.num_endpoints = 1,320.endpoints = &single_endpoint,321.name_prefix = "rt711"322}323};324325static const struct snd_soc_acpi_adr_device rt712_vb_2_group1_adr[] = {326{327.adr = 0x000230025D071201ull,328.num_endpoints = ARRAY_SIZE(jack_amp_g1_dmic_endpoints),329.endpoints = jack_amp_g1_dmic_endpoints,330.name_prefix = "rt712"331}332};333334static const struct snd_soc_acpi_adr_device rt712_vb_3_group1_adr[] = {335{336.adr = 0x000330025D071201ull,337.num_endpoints = ARRAY_SIZE(jack_amp_g1_dmic_endpoints),338.endpoints = jack_amp_g1_dmic_endpoints,339.name_prefix = "rt712"340}341};342343static const struct snd_soc_acpi_adr_device rt713_vb_2_adr[] = {344{345.adr = 0x000230025d071301ull,346.num_endpoints = ARRAY_SIZE(jack_dmic_endpoints),347.endpoints = jack_dmic_endpoints,348.name_prefix = "rt713"349}350};351352static const struct snd_soc_acpi_adr_device rt713_vb_3_adr[] = {353{354.adr = 0x000330025D071301ull,355.num_endpoints = ARRAY_SIZE(jack_dmic_endpoints),356.endpoints = jack_dmic_endpoints,357.name_prefix = "rt713"358}359};360361static const struct snd_soc_acpi_adr_device rt1320_3_group1_adr[] = {362{363.adr = 0x000330025D132001ull,364.num_endpoints = 1,365.endpoints = &spk_r_endpoint,366.name_prefix = "rt1320-1"367}368};369370static const struct snd_soc_acpi_adr_device rt721_0_single_adr[] = {371{372.adr = 0x000030025d072101ull,373.num_endpoints = ARRAY_SIZE(rt_mf_endpoints),374.endpoints = rt_mf_endpoints,375.name_prefix = "rt721"376}377};378379static const struct snd_soc_acpi_adr_device rt721_3_single_adr[] = {380{381.adr = 0x000330025d072101ull,382.num_endpoints = ARRAY_SIZE(rt_mf_endpoints),383.endpoints = rt_mf_endpoints,384.name_prefix = "rt721"385}386};387388static const struct snd_soc_acpi_link_adr ptl_rt721_l3[] = {389{390.mask = BIT(3),391.num_adr = ARRAY_SIZE(rt721_3_single_adr),392.adr_d = rt721_3_single_adr,393},394{},395};396397static const struct snd_soc_acpi_adr_device rt722_0_single_adr[] = {398{399.adr = 0x000030025d072201ull,400.num_endpoints = ARRAY_SIZE(rt_mf_endpoints),401.endpoints = rt_mf_endpoints,402.name_prefix = "rt722"403}404};405406static const struct snd_soc_acpi_adr_device rt722_1_single_adr[] = {407{408.adr = 0x000130025d072201ull,409.num_endpoints = ARRAY_SIZE(rt_mf_endpoints),410.endpoints = rt_mf_endpoints,411.name_prefix = "rt722"412}413};414415static const struct snd_soc_acpi_adr_device rt722_3_single_adr[] = {416{417.adr = 0x000330025d072201ull,418.num_endpoints = ARRAY_SIZE(rt_mf_endpoints),419.endpoints = rt_mf_endpoints,420.name_prefix = "rt722"421}422};423424static const struct snd_soc_acpi_adr_device rt1320_1_group1_adr[] = {425{426.adr = 0x000130025D132001ull,427.num_endpoints = 1,428.endpoints = &spk_r_endpoint,429.name_prefix = "rt1320-1"430}431};432433static const struct snd_soc_acpi_adr_device rt1320_1_group2_adr[] = {434{435.adr = 0x000130025D132001ull,436.num_endpoints = 1,437.endpoints = &spk_l_endpoint,438.name_prefix = "rt1320-1"439}440};441442static const struct snd_soc_acpi_adr_device rt1320_2_group1_adr[] = {443{444.adr = 0x000230025D132001ull,445.num_endpoints = 1,446.endpoints = &spk_r_endpoint,447.name_prefix = "rt1320-1"448}449};450451static const struct snd_soc_acpi_adr_device rt1320_2_group2_adr[] = {452{453.adr = 0x000230025D132001ull,454.num_endpoints = 1,455.endpoints = &spk_r_endpoint,456.name_prefix = "rt1320-1"457}458};459460static const struct snd_soc_acpi_adr_device rt1320_3_group2_adr[] = {461{462.adr = 0x000330025D132001ull,463.num_endpoints = 1,464.endpoints = &spk_r_endpoint,465.name_prefix = "rt1320-2"466}467};468469static const struct snd_soc_acpi_link_adr ptl_cs42l43_l2_cs35l56x6_l13[] = {470{471.mask = BIT(2),472.num_adr = ARRAY_SIZE(cs42l43_2_adr),473.adr_d = cs42l43_2_adr,474},475{476.mask = BIT(1),477.num_adr = ARRAY_SIZE(cs35l56_1_3amp_adr),478.adr_d = cs35l56_1_3amp_adr,479},480{481.mask = BIT(3),482.num_adr = ARRAY_SIZE(cs35l56_3_3amp_adr),483.adr_d = cs35l56_3_3amp_adr,484},485{}486};487488static const struct snd_soc_acpi_link_adr ptl_cs42l43_l3[] = {489{490.mask = BIT(3),491.num_adr = ARRAY_SIZE(cs42l43_3_adr),492.adr_d = cs42l43_3_adr,493},494{}495};496497static const struct snd_soc_acpi_link_adr ptl_rt721_l0[] = {498{499.mask = BIT(0),500.num_adr = ARRAY_SIZE(rt721_0_single_adr),501.adr_d = rt721_0_single_adr,502},503{}504};505506static const struct snd_soc_acpi_link_adr ptl_rt722_only[] = {507{508.mask = BIT(0),509.num_adr = ARRAY_SIZE(rt722_0_single_adr),510.adr_d = rt722_0_single_adr,511},512{}513};514515static const struct snd_soc_acpi_link_adr ptl_rt722_l1[] = {516{517.mask = BIT(1),518.num_adr = ARRAY_SIZE(rt722_1_single_adr),519.adr_d = rt722_1_single_adr,520},521{}522};523524static const struct snd_soc_acpi_link_adr ptl_rt722_l3[] = {525{526.mask = BIT(3),527.num_adr = ARRAY_SIZE(rt722_3_single_adr),528.adr_d = rt722_3_single_adr,529},530{}531};532533static const struct snd_soc_acpi_link_adr ptl_rvp[] = {534{535.mask = BIT(0),536.num_adr = ARRAY_SIZE(rt711_sdca_0_adr),537.adr_d = rt711_sdca_0_adr,538},539{}540};541542static const struct snd_soc_acpi_link_adr ptl_sdw_rt713_vb_l2_rt1320_l13[] = {543{544.mask = BIT(2),545.num_adr = ARRAY_SIZE(rt713_vb_2_adr),546.adr_d = rt713_vb_2_adr,547},548{549.mask = BIT(1),550.num_adr = ARRAY_SIZE(rt1320_1_group2_adr),551.adr_d = rt1320_1_group2_adr,552},553{554.mask = BIT(3),555.num_adr = ARRAY_SIZE(rt1320_3_group2_adr),556.adr_d = rt1320_3_group2_adr,557},558{}559};560561static const struct snd_soc_acpi_link_adr ptl_sdw_rt713_vb_l3_rt1320_l12[] = {562{563.mask = BIT(3),564.num_adr = ARRAY_SIZE(rt713_vb_3_adr),565.adr_d = rt713_vb_3_adr,566},567{568.mask = BIT(1),569.num_adr = ARRAY_SIZE(rt1320_1_group2_adr),570.adr_d = rt1320_1_group2_adr,571},572{573.mask = BIT(2),574.num_adr = ARRAY_SIZE(rt1320_2_group2_adr),575.adr_d = rt1320_2_group2_adr,576},577{}578};579580static const struct snd_soc_acpi_link_adr ptl_sdw_rt712_vb_l2_rt1320_l1[] = {581{582.mask = BIT(2),583.num_adr = ARRAY_SIZE(rt712_vb_2_group1_adr),584.adr_d = rt712_vb_2_group1_adr,585},586{587.mask = BIT(1),588.num_adr = ARRAY_SIZE(rt1320_1_group1_adr),589.adr_d = rt1320_1_group1_adr,590},591{}592};593594static const struct snd_soc_acpi_link_adr ptl_sdw_rt712_vb_l3_rt1320_l2[] = {595{596.mask = BIT(3),597.num_adr = ARRAY_SIZE(rt712_vb_3_group1_adr),598.adr_d = rt712_vb_3_group1_adr,599},600{601.mask = BIT(2),602.num_adr = ARRAY_SIZE(rt1320_2_group1_adr),603.adr_d = rt1320_2_group1_adr,604},605{}606};607608static const struct snd_soc_acpi_link_adr ptl_sdw_rt712_vb_l3_rt1320_l3[] = {609{610.mask = BIT(3),611.num_adr = ARRAY_SIZE(rt712_vb_3_group1_adr),612.adr_d = rt712_vb_3_group1_adr,613},614{615.mask = BIT(3),616.num_adr = ARRAY_SIZE(rt1320_3_group1_adr),617.adr_d = rt1320_3_group1_adr,618},619{}620};621622/* this table is used when there is no I2S codec present */623struct snd_soc_acpi_mach snd_soc_acpi_intel_ptl_sdw_machines[] = {624/* Order Priority: mockup > most links > most bit link-mask > alphabetical */625{626.link_mask = GENMASK(3, 0),627.links = sdw_mockup_headset_2amps_mic,628.drv_name = "sof_sdw",629.sof_tplg_filename = "sof-ptl-rt711-rt1308-rt715.tplg",630},631{632.link_mask = BIT(0) | BIT(1) | BIT(3),633.links = sdw_mockup_headset_1amp_mic,634.drv_name = "sof_sdw",635.sof_tplg_filename = "sof-ptl-rt711-rt1308-mono-rt715.tplg",636},637{638.link_mask = GENMASK(2, 0),639.links = sdw_mockup_mic_headset_1amp,640.drv_name = "sof_sdw",641.sof_tplg_filename = "sof-ptl-rt715-rt711-rt1308-mono.tplg",642},643{644.link_mask = BIT(0),645.links = sdw_mockup_multi_func,646.drv_name = "sof_sdw",647.sof_tplg_filename = "sof-ptl-rt722.tplg", /* Reuse the existing tplg file */648},649{650.link_mask = BIT(1) | BIT(2) | BIT(3),651.links = ptl_sdw_rt713_vb_l2_rt1320_l13,652.drv_name = "sof_sdw",653.machine_check = snd_soc_acpi_intel_sdca_is_device_rt712_vb,654.sof_tplg_filename = "sof-ptl-rt713-l2-rt1320-l13.tplg",655.get_function_tplg_files = sof_sdw_get_tplg_files,656},657{658.link_mask = BIT(1) | BIT(2) | BIT(3),659.links = ptl_sdw_rt713_vb_l3_rt1320_l12,660.drv_name = "sof_sdw",661.machine_check = snd_soc_acpi_intel_sdca_is_device_rt712_vb,662.sof_tplg_filename = "sof-ptl-rt713-l3-rt1320-l12.tplg",663.get_function_tplg_files = sof_sdw_get_tplg_files,664},665{666.link_mask = BIT(1) | BIT(2) | BIT(3),667.links = ptl_cs42l43_l2_cs35l56x6_l13,668.drv_name = "sof_sdw",669.sof_tplg_filename = "sof-ptl-cs42l43-l2-cs35l56x6-l13.tplg",670},671{672.link_mask = BIT(1) | BIT(2),673.links = ptl_sdw_rt712_vb_l2_rt1320_l1,674.drv_name = "sof_sdw",675.machine_check = snd_soc_acpi_intel_sdca_is_device_rt712_vb,676.sof_tplg_filename = "sof-ptl-rt712-l2-rt1320-l1.tplg",677.get_function_tplg_files = sof_sdw_get_tplg_files,678},679{680.link_mask = BIT(2) | BIT(3),681.links = ptl_sdw_rt712_vb_l3_rt1320_l2,682.drv_name = "sof_sdw",683.machine_check = snd_soc_acpi_intel_sdca_is_device_rt712_vb,684.sof_tplg_filename = "sof-ptl-rt712-l3-rt1320-l2.tplg",685.get_function_tplg_files = sof_sdw_get_tplg_files,686},687{688.link_mask = BIT(0),689.links = ptl_rvp,690.drv_name = "sof_sdw",691.sof_tplg_filename = "sof-ptl-rt711.tplg",692},693{694.link_mask = BIT(0),695.links = ptl_rt721_l0,696.drv_name = "sof_sdw",697.sof_tplg_filename = "sof-ptl-rt721.tplg",698.get_function_tplg_files = sof_sdw_get_tplg_files,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_cs42l43_l3,717.drv_name = "sof_sdw",718.sof_tplg_filename = "sof-ptl-cs42l43-l3.tplg",719.get_function_tplg_files = sof_sdw_get_tplg_files,720},721{722.link_mask = BIT(3),723.links = ptl_sdw_rt712_vb_l3_rt1320_l3,724.drv_name = "sof_sdw",725.machine_check = snd_soc_acpi_intel_sdca_is_device_rt712_vb,726.sof_tplg_filename = "sof-ptl-rt712-l3-rt1320-l3.tplg",727.get_function_tplg_files = sof_sdw_get_tplg_files,728},729{730.link_mask = BIT(3),731.links = ptl_rt721_l3,732.drv_name = "sof_sdw",733.sof_tplg_filename = "sof-ptl-rt721.tplg",734.get_function_tplg_files = sof_sdw_get_tplg_files,735},736{737.link_mask = BIT(3),738.links = ptl_rt722_l3,739.drv_name = "sof_sdw",740.sof_tplg_filename = "sof-ptl-rt722.tplg",741.get_function_tplg_files = sof_sdw_get_tplg_files,742},743{},744};745EXPORT_SYMBOL_GPL(snd_soc_acpi_intel_ptl_sdw_machines);746747748