Path: blob/master/sound/soc/intel/common/soc-acpi-intel-ptl-match.c
26493 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{},64};65EXPORT_SYMBOL_GPL(snd_soc_acpi_intel_ptl_machines);6667static const struct snd_soc_acpi_endpoint single_endpoint = {68.num = 0,69.aggregated = 0,70.group_position = 0,71.group_id = 0,72};7374static const struct snd_soc_acpi_endpoint spk_l_endpoint = {75.num = 0,76.aggregated = 1,77.group_position = 0,78.group_id = 1,79};8081static const struct snd_soc_acpi_endpoint spk_r_endpoint = {82.num = 0,83.aggregated = 1,84.group_position = 1,85.group_id = 1,86};8788static const struct snd_soc_acpi_endpoint spk_1_endpoint = {89.num = 0,90.aggregated = 1,91.group_position = 1,92.group_id = 1,93};9495static const struct snd_soc_acpi_endpoint spk_2_endpoint = {96.num = 0,97.aggregated = 1,98.group_position = 2,99.group_id = 1,100};101102static const struct snd_soc_acpi_endpoint spk_3_endpoint = {103.num = 0,104.aggregated = 1,105.group_position = 3,106.group_id = 1,107};108109static const struct snd_soc_acpi_endpoint spk_4_endpoint = {110.num = 0,111.aggregated = 1,112.group_position = 4,113.group_id = 1,114};115116static const struct snd_soc_acpi_endpoint spk_5_endpoint = {117.num = 0,118.aggregated = 1,119.group_position = 5,120.group_id = 1,121};122123static const struct snd_soc_acpi_endpoint spk_6_endpoint = {124.num = 0,125.aggregated = 1,126.group_position = 6,127.group_id = 1,128};129130/*131* Multi-function codecs with three endpoints created for132* headset, amp and dmic functions.133*/134static const struct snd_soc_acpi_endpoint rt_mf_endpoints[] = {135{136.num = 0,137.aggregated = 0,138.group_position = 0,139.group_id = 0,140},141{142.num = 1,143.aggregated = 0,144.group_position = 0,145.group_id = 0,146},147{148.num = 2,149.aggregated = 0,150.group_position = 0,151.group_id = 0,152},153};154155static const struct snd_soc_acpi_endpoint jack_dmic_endpoints[] = {156/* Jack Endpoint */157{158.num = 0,159.aggregated = 0,160.group_position = 0,161.group_id = 0,162},163/* DMIC Endpoint */164{165.num = 1,166.aggregated = 0,167.group_position = 0,168.group_id = 0,169},170};171172static const struct snd_soc_acpi_endpoint jack_amp_g1_dmic_endpoints[] = {173/* Jack Endpoint */174{175.num = 0,176.aggregated = 0,177.group_position = 0,178.group_id = 0,179},180/* Amp Endpoint, work as spk_l_endpoint */181{182.num = 1,183.aggregated = 1,184.group_position = 0,185.group_id = 1,186},187/* DMIC Endpoint */188{189.num = 2,190.aggregated = 0,191.group_position = 0,192.group_id = 0,193},194};195196static const struct snd_soc_acpi_endpoint cs42l43_amp_spkagg_endpoints[] = {197{ /* Jack Playback Endpoint */198.num = 0,199.aggregated = 0,200.group_position = 0,201.group_id = 0,202},203{ /* DMIC Capture Endpoint */204.num = 1,205.aggregated = 0,206.group_position = 0,207.group_id = 0,208},209{ /* Jack Capture Endpoint */210.num = 2,211.aggregated = 0,212.group_position = 0,213.group_id = 0,214},215{ /* Speaker Playback Endpoint */216.num = 3,217.aggregated = 1,218.group_position = 0,219.group_id = 1,220},221};222223static const struct snd_soc_acpi_endpoint cs42l43_endpoints[] = {224{ /* Jack Playback Endpoint */225.num = 0,226.aggregated = 0,227.group_position = 0,228.group_id = 0,229},230{ /* DMIC Capture Endpoint */231.num = 1,232.aggregated = 0,233.group_position = 0,234.group_id = 0,235},236{ /* Jack Capture Endpoint */237.num = 2,238.aggregated = 0,239.group_position = 0,240.group_id = 0,241},242{ /* Speaker Playback Endpoint */243.num = 3,244.aggregated = 0,245.group_position = 0,246.group_id = 0,247},248};249250static const struct snd_soc_acpi_adr_device cs42l43_2_adr[] = {251{252.adr = 0x00023001fa424301ull,253.num_endpoints = ARRAY_SIZE(cs42l43_amp_spkagg_endpoints),254.endpoints = cs42l43_amp_spkagg_endpoints,255.name_prefix = "cs42l43"256}257};258259static const struct snd_soc_acpi_adr_device cs35l56_1_3amp_adr[] = {260{261.adr = 0x00013001fa355601ull,262.num_endpoints = 1,263.endpoints = &spk_1_endpoint,264.name_prefix = "AMP1"265},266{267.adr = 0x00013101fa355601ull,268.num_endpoints = 1,269.endpoints = &spk_2_endpoint,270.name_prefix = "AMP2"271},272{273.adr = 0x00013201fa355601ull,274.num_endpoints = 1,275.endpoints = &spk_3_endpoint,276.name_prefix = "AMP3"277}278};279280static const struct snd_soc_acpi_adr_device cs35l56_3_3amp_adr[] = {281{282.adr = 0x00033301fa355601ull,283.num_endpoints = 1,284.endpoints = &spk_4_endpoint,285.name_prefix = "AMP4"286},287{288.adr = 0x00033401fa355601ull,289.num_endpoints = 1,290.endpoints = &spk_5_endpoint,291.name_prefix = "AMP5"292},293{294.adr = 0x00033501fa355601ull,295.num_endpoints = 1,296.endpoints = &spk_6_endpoint,297.name_prefix = "AMP6"298}299};300301static const struct snd_soc_acpi_adr_device cs42l43_3_adr[] = {302{303.adr = 0x00033001FA424301ull,304.num_endpoints = ARRAY_SIZE(cs42l43_endpoints),305.endpoints = cs42l43_endpoints,306.name_prefix = "cs42l43"307}308};309310static const struct snd_soc_acpi_adr_device rt711_sdca_0_adr[] = {311{312.adr = 0x000030025D071101ull,313.num_endpoints = 1,314.endpoints = &single_endpoint,315.name_prefix = "rt711"316}317};318319static const struct snd_soc_acpi_adr_device rt712_vb_2_group1_adr[] = {320{321.adr = 0x000230025D071201ull,322.num_endpoints = ARRAY_SIZE(jack_amp_g1_dmic_endpoints),323.endpoints = jack_amp_g1_dmic_endpoints,324.name_prefix = "rt712"325}326};327328static const struct snd_soc_acpi_adr_device rt712_vb_3_group1_adr[] = {329{330.adr = 0x000330025D071201ull,331.num_endpoints = ARRAY_SIZE(jack_amp_g1_dmic_endpoints),332.endpoints = jack_amp_g1_dmic_endpoints,333.name_prefix = "rt712"334}335};336337static const struct snd_soc_acpi_adr_device rt713_vb_2_adr[] = {338{339.adr = 0x000230025d071301ull,340.num_endpoints = ARRAY_SIZE(jack_dmic_endpoints),341.endpoints = jack_dmic_endpoints,342.name_prefix = "rt713"343}344};345346static const struct snd_soc_acpi_adr_device rt713_vb_3_adr[] = {347{348.adr = 0x000330025D071301ull,349.num_endpoints = ARRAY_SIZE(jack_dmic_endpoints),350.endpoints = jack_dmic_endpoints,351.name_prefix = "rt713"352}353};354355static const struct snd_soc_acpi_adr_device rt1320_3_group1_adr[] = {356{357.adr = 0x000330025D132001ull,358.num_endpoints = 1,359.endpoints = &spk_r_endpoint,360.name_prefix = "rt1320-1"361}362};363364static const struct snd_soc_acpi_adr_device rt721_0_single_adr[] = {365{366.adr = 0x000030025d072101ull,367.num_endpoints = ARRAY_SIZE(rt_mf_endpoints),368.endpoints = rt_mf_endpoints,369.name_prefix = "rt721"370}371};372373static const struct snd_soc_acpi_adr_device rt721_3_single_adr[] = {374{375.adr = 0x000330025d072101ull,376.num_endpoints = ARRAY_SIZE(rt_mf_endpoints),377.endpoints = rt_mf_endpoints,378.name_prefix = "rt721"379}380};381382static const struct snd_soc_acpi_link_adr ptl_rt721_l3[] = {383{384.mask = BIT(3),385.num_adr = ARRAY_SIZE(rt721_3_single_adr),386.adr_d = rt721_3_single_adr,387},388{},389};390391static const struct snd_soc_acpi_adr_device rt722_0_single_adr[] = {392{393.adr = 0x000030025d072201ull,394.num_endpoints = ARRAY_SIZE(rt_mf_endpoints),395.endpoints = rt_mf_endpoints,396.name_prefix = "rt722"397}398};399400static const struct snd_soc_acpi_adr_device rt722_1_single_adr[] = {401{402.adr = 0x000130025d072201ull,403.num_endpoints = ARRAY_SIZE(rt_mf_endpoints),404.endpoints = rt_mf_endpoints,405.name_prefix = "rt722"406}407};408409static const struct snd_soc_acpi_adr_device rt722_3_single_adr[] = {410{411.adr = 0x000330025d072201ull,412.num_endpoints = ARRAY_SIZE(rt_mf_endpoints),413.endpoints = rt_mf_endpoints,414.name_prefix = "rt722"415}416};417418static const struct snd_soc_acpi_adr_device rt1320_1_group1_adr[] = {419{420.adr = 0x000130025D132001ull,421.num_endpoints = 1,422.endpoints = &spk_r_endpoint,423.name_prefix = "rt1320-1"424}425};426427static const struct snd_soc_acpi_adr_device rt1320_1_group2_adr[] = {428{429.adr = 0x000130025D132001ull,430.num_endpoints = 1,431.endpoints = &spk_l_endpoint,432.name_prefix = "rt1320-1"433}434};435436static const struct snd_soc_acpi_adr_device rt1320_2_group1_adr[] = {437{438.adr = 0x000230025D132001ull,439.num_endpoints = 1,440.endpoints = &spk_r_endpoint,441.name_prefix = "rt1320-1"442}443};444445static const struct snd_soc_acpi_adr_device rt1320_2_group2_adr[] = {446{447.adr = 0x000230025D132001ull,448.num_endpoints = 1,449.endpoints = &spk_r_endpoint,450.name_prefix = "rt1320-1"451}452};453454static const struct snd_soc_acpi_adr_device rt1320_3_group2_adr[] = {455{456.adr = 0x000330025D132001ull,457.num_endpoints = 1,458.endpoints = &spk_r_endpoint,459.name_prefix = "rt1320-2"460}461};462463static const struct snd_soc_acpi_link_adr ptl_cs42l43_l2_cs35l56x6_l13[] = {464{465.mask = BIT(2),466.num_adr = ARRAY_SIZE(cs42l43_2_adr),467.adr_d = cs42l43_2_adr,468},469{470.mask = BIT(1),471.num_adr = ARRAY_SIZE(cs35l56_1_3amp_adr),472.adr_d = cs35l56_1_3amp_adr,473},474{475.mask = BIT(3),476.num_adr = ARRAY_SIZE(cs35l56_3_3amp_adr),477.adr_d = cs35l56_3_3amp_adr,478},479{}480};481482static const struct snd_soc_acpi_link_adr ptl_cs42l43_l3[] = {483{484.mask = BIT(3),485.num_adr = ARRAY_SIZE(cs42l43_3_adr),486.adr_d = cs42l43_3_adr,487},488{}489};490491static const struct snd_soc_acpi_link_adr ptl_rt721_l0[] = {492{493.mask = BIT(0),494.num_adr = ARRAY_SIZE(rt721_0_single_adr),495.adr_d = rt721_0_single_adr,496},497{}498};499500static const struct snd_soc_acpi_link_adr ptl_rt722_only[] = {501{502.mask = BIT(0),503.num_adr = ARRAY_SIZE(rt722_0_single_adr),504.adr_d = rt722_0_single_adr,505},506{}507};508509static const struct snd_soc_acpi_link_adr ptl_rt722_l1[] = {510{511.mask = BIT(1),512.num_adr = ARRAY_SIZE(rt722_1_single_adr),513.adr_d = rt722_1_single_adr,514},515{}516};517518static const struct snd_soc_acpi_link_adr ptl_rt722_l3[] = {519{520.mask = BIT(3),521.num_adr = ARRAY_SIZE(rt722_3_single_adr),522.adr_d = rt722_3_single_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(1) | BIT(2),667.links = ptl_sdw_rt712_vb_l2_rt1320_l1,668.drv_name = "sof_sdw",669.machine_check = snd_soc_acpi_intel_sdca_is_device_rt712_vb,670.sof_tplg_filename = "sof-ptl-rt712-l2-rt1320-l1.tplg",671.get_function_tplg_files = sof_sdw_get_tplg_files,672},673{674.link_mask = BIT(2) | BIT(3),675.links = ptl_sdw_rt712_vb_l3_rt1320_l2,676.drv_name = "sof_sdw",677.machine_check = snd_soc_acpi_intel_sdca_is_device_rt712_vb,678.sof_tplg_filename = "sof-ptl-rt712-l3-rt1320-l2.tplg",679.get_function_tplg_files = sof_sdw_get_tplg_files,680},681{682.link_mask = BIT(0),683.links = ptl_rvp,684.drv_name = "sof_sdw",685.sof_tplg_filename = "sof-ptl-rt711.tplg",686},687{688.link_mask = BIT(0),689.links = ptl_rt721_l0,690.drv_name = "sof_sdw",691.sof_tplg_filename = "sof-ptl-rt721.tplg",692.get_function_tplg_files = sof_sdw_get_tplg_files,693},694{695.link_mask = BIT(0),696.links = ptl_rt722_only,697.drv_name = "sof_sdw",698.sof_tplg_filename = "sof-ptl-rt722.tplg",699.get_function_tplg_files = sof_sdw_get_tplg_files,700},701{702.link_mask = BIT(1),703.links = ptl_rt722_l1,704.drv_name = "sof_sdw",705.sof_tplg_filename = "sof-ptl-rt722.tplg",706.get_function_tplg_files = sof_sdw_get_tplg_files,707},708{709.link_mask = BIT(3),710.links = ptl_cs42l43_l3,711.drv_name = "sof_sdw",712.sof_tplg_filename = "sof-ptl-cs42l43-l3.tplg",713.get_function_tplg_files = sof_sdw_get_tplg_files,714},715{716.link_mask = BIT(3),717.links = ptl_sdw_rt712_vb_l3_rt1320_l3,718.drv_name = "sof_sdw",719.machine_check = snd_soc_acpi_intel_sdca_is_device_rt712_vb,720.sof_tplg_filename = "sof-ptl-rt712-l3-rt1320-l3.tplg",721.get_function_tplg_files = sof_sdw_get_tplg_files,722},723{724.link_mask = BIT(3),725.links = ptl_rt721_l3,726.drv_name = "sof_sdw",727.sof_tplg_filename = "sof-ptl-rt721.tplg",728.get_function_tplg_files = sof_sdw_get_tplg_files,729},730{731.link_mask = BIT(3),732.links = ptl_rt722_l3,733.drv_name = "sof_sdw",734.sof_tplg_filename = "sof-ptl-rt722.tplg",735.get_function_tplg_files = sof_sdw_get_tplg_files,736},737{},738};739EXPORT_SYMBOL_GPL(snd_soc_acpi_intel_ptl_sdw_machines);740741742