2727#include "sof_board_helpers.h"
2828#include "sof_maxim_common.h"
2929#include "sof_realtek_common.h"
30- #include "sof_ssp_common.h"
31-
32- #define SOF_RT5682_SSP_CODEC (quirk ) ((quirk) & GENMASK(2, 0))
33- #define SOF_RT5682_SSP_CODEC_MASK (GENMASK(2, 0))
34- #define SOF_RT5682_MCLK_EN BIT(3)
35- #define SOF_RT5682_SSP_AMP_SHIFT 6
36- #define SOF_RT5682_SSP_AMP_MASK (GENMASK(8, 6))
37- #define SOF_RT5682_SSP_AMP (quirk ) \
38- (((quirk) << SOF_RT5682_SSP_AMP_SHIFT) & SOF_RT5682_SSP_AMP_MASK)
39- #define SOF_RT5682_MCLK_BYTCHT_EN BIT(9)
40- #define SOF_RT5682_NUM_HDMIDEV_SHIFT 10
41- #define SOF_RT5682_NUM_HDMIDEV_MASK (GENMASK(12, 10))
42- #define SOF_RT5682_NUM_HDMIDEV (quirk ) \
43- ((quirk << SOF_RT5682_NUM_HDMIDEV_SHIFT) & SOF_RT5682_NUM_HDMIDEV_MASK)
44-
45- /* BT audio offload: reserve 3 bits for future */
46- #define SOF_BT_OFFLOAD_SSP_SHIFT 19
47- #define SOF_BT_OFFLOAD_SSP_MASK (GENMASK(21, 19))
48- #define SOF_BT_OFFLOAD_SSP (quirk ) \
49- (((quirk) << SOF_BT_OFFLOAD_SSP_SHIFT) & SOF_BT_OFFLOAD_SSP_MASK)
50- #define SOF_SSP_BT_OFFLOAD_PRESENT BIT(22)
51-
52- /* HDMI capture*/
53- #define SOF_NO_OF_HDMI_CAPTURE_SSP_SHIFT 27
54- #define SOF_SSP_HDMI_CAPTURE_PRESENT_MASK (GENMASK(30, 27))
55- #define SOF_HDMI_CAPTURE_SSP_MASK (quirk ) \
56- (((quirk) << SOF_NO_OF_HDMI_CAPTURE_SSP_SHIFT) & SOF_SSP_HDMI_CAPTURE_PRESENT_MASK)
30+
31+ /* Driver-specific board quirks: from bit 0 to 7 */
32+ #define SOF_RT5682_MCLK_EN BIT(0)
33+ #define SOF_RT5682_MCLK_BYTCHT_EN BIT(1)
5734
5835/* Default: MCLK on, MCLK 19.2M, SSP0 */
5936static unsigned long sof_rt5682_quirk = SOF_RT5682_MCLK_EN |
60- SOF_RT5682_SSP_CODEC (0 );
37+ SOF_SSP_PORT_CODEC (0 );
6138
6239static int sof_rt5682_quirk_cb (const struct dmi_system_id * id )
6340{
@@ -72,15 +49,15 @@ static const struct dmi_system_id sof_rt5682_quirk_table[] = {
7249 DMI_MATCH (DMI_SYS_VENDOR , "Circuitco" ),
7350 DMI_MATCH (DMI_PRODUCT_NAME , "Minnowboard Max" ),
7451 },
75- .driver_data = (void * )(SOF_RT5682_SSP_CODEC (2 )),
52+ .driver_data = (void * )(SOF_SSP_PORT_CODEC (2 )),
7653 },
7754 {
7855 .callback = sof_rt5682_quirk_cb ,
7956 .matches = {
8057 DMI_MATCH (DMI_SYS_VENDOR , "AAEON" ),
8158 DMI_MATCH (DMI_PRODUCT_NAME , "UP-CHT01" ),
8259 },
83- .driver_data = (void * )(SOF_RT5682_SSP_CODEC (2 )),
60+ .driver_data = (void * )(SOF_SSP_PORT_CODEC (2 )),
8461 },
8562 {
8663 .callback = sof_rt5682_quirk_cb ,
@@ -89,16 +66,16 @@ static const struct dmi_system_id sof_rt5682_quirk_table[] = {
8966 DMI_MATCH (DMI_PRODUCT_NAME , "WhiskeyLake Client" ),
9067 },
9168 .driver_data = (void * )(SOF_RT5682_MCLK_EN |
92- SOF_RT5682_SSP_CODEC (1 )),
69+ SOF_SSP_PORT_CODEC (1 )),
9370 },
9471 {
9572 .callback = sof_rt5682_quirk_cb ,
9673 .matches = {
9774 DMI_MATCH (DMI_PRODUCT_FAMILY , "Google_Hatch" ),
9875 },
9976 .driver_data = (void * )(SOF_RT5682_MCLK_EN |
100- SOF_RT5682_SSP_CODEC (0 ) |
101- SOF_RT5682_SSP_AMP (1 )),
77+ SOF_SSP_PORT_CODEC (0 ) |
78+ SOF_SSP_PORT_AMP (1 )),
10279 },
10380 {
10481 .callback = sof_rt5682_quirk_cb ,
@@ -107,7 +84,7 @@ static const struct dmi_system_id sof_rt5682_quirk_table[] = {
10784 DMI_MATCH (DMI_PRODUCT_NAME , "Ice Lake Client" ),
10885 },
10986 .driver_data = (void * )(SOF_RT5682_MCLK_EN |
110- SOF_RT5682_SSP_CODEC (0 )),
87+ SOF_SSP_PORT_CODEC (0 )),
11188 },
11289 {
11390 .callback = sof_rt5682_quirk_cb ,
@@ -116,9 +93,9 @@ static const struct dmi_system_id sof_rt5682_quirk_table[] = {
11693 DMI_MATCH (DMI_OEM_STRING , "AUDIO-MAX98373_ALC5682I_I2S_UP4" ),
11794 },
11895 .driver_data = (void * )(SOF_RT5682_MCLK_EN |
119- SOF_RT5682_SSP_CODEC (0 ) |
120- SOF_RT5682_SSP_AMP (2 ) |
121- SOF_RT5682_NUM_HDMIDEV (4 )),
96+ SOF_SSP_PORT_CODEC (0 ) |
97+ SOF_SSP_PORT_AMP (2 ) |
98+ SOF_NUM_IDISP_HDMI (4 )),
12299 },
123100 {
124101 .callback = sof_rt5682_quirk_cb ,
@@ -128,9 +105,9 @@ static const struct dmi_system_id sof_rt5682_quirk_table[] = {
128105 DMI_MATCH (DMI_OEM_STRING , "AUDIO-ADL_MAX98373_ALC5682I_I2S" ),
129106 },
130107 .driver_data = (void * )(SOF_RT5682_MCLK_EN |
131- SOF_RT5682_SSP_CODEC (0 ) |
132- SOF_RT5682_SSP_AMP (2 ) |
133- SOF_RT5682_NUM_HDMIDEV (4 )),
108+ SOF_SSP_PORT_CODEC (0 ) |
109+ SOF_SSP_PORT_AMP (2 ) |
110+ SOF_NUM_IDISP_HDMI (4 )),
134111 },
135112 {
136113 .callback = sof_rt5682_quirk_cb ,
@@ -139,9 +116,9 @@ static const struct dmi_system_id sof_rt5682_quirk_table[] = {
139116 DMI_MATCH (DMI_OEM_STRING , "AUDIO-MAX98390_ALC5682I_I2S" ),
140117 },
141118 .driver_data = (void * )(SOF_RT5682_MCLK_EN |
142- SOF_RT5682_SSP_CODEC (0 ) |
143- SOF_RT5682_SSP_AMP (2 ) |
144- SOF_RT5682_NUM_HDMIDEV (4 )),
119+ SOF_SSP_PORT_CODEC (0 ) |
120+ SOF_SSP_PORT_AMP (2 ) |
121+ SOF_NUM_IDISP_HDMI (4 )),
145122 },
146123 {
147124 .callback = sof_rt5682_quirk_cb ,
@@ -150,21 +127,21 @@ static const struct dmi_system_id sof_rt5682_quirk_table[] = {
150127 DMI_MATCH (DMI_OEM_STRING , "AUDIO-MAX98360_ALC5682I_I2S_AMP_SSP2" ),
151128 },
152129 .driver_data = (void * )(SOF_RT5682_MCLK_EN |
153- SOF_RT5682_SSP_CODEC (0 ) |
154- SOF_RT5682_SSP_AMP (2 ) |
155- SOF_RT5682_NUM_HDMIDEV (4 )),
130+ SOF_SSP_PORT_CODEC (0 ) |
131+ SOF_SSP_PORT_AMP (2 ) |
132+ SOF_NUM_IDISP_HDMI (4 )),
156133 },
157134 {
158135 .callback = sof_rt5682_quirk_cb ,
159136 .matches = {
160137 DMI_MATCH (DMI_PRODUCT_FAMILY , "Google_Rex" ),
161138 },
162139 .driver_data = (void * )(SOF_RT5682_MCLK_EN |
163- SOF_RT5682_SSP_CODEC (2 ) |
164- SOF_RT5682_SSP_AMP (0 ) |
165- SOF_RT5682_NUM_HDMIDEV (3 ) |
166- SOF_BT_OFFLOAD_SSP (1 ) |
167- SOF_SSP_BT_OFFLOAD_PRESENT
140+ SOF_SSP_PORT_CODEC (2 ) |
141+ SOF_SSP_PORT_AMP (0 ) |
142+ SOF_NUM_IDISP_HDMI (3 ) |
143+ SOF_SSP_PORT_BT_OFFLOAD (1 ) |
144+ SOF_BT_OFFLOAD_PRESENT
168145 ),
169146 },
170147 {}
@@ -630,19 +607,29 @@ static int sof_audio_probe(struct platform_device *pdev)
630607{
631608 struct snd_soc_acpi_mach * mach = pdev -> dev .platform_data ;
632609 struct sof_card_private * ctx ;
610+ bool is_legacy_cpu ;
633611 int ret ;
634612
635- ctx = devm_kzalloc (& pdev -> dev , sizeof (* ctx ), GFP_KERNEL );
636- if (!ctx )
637- return - ENOMEM ;
638-
639613 if (pdev -> id_entry && pdev -> id_entry -> driver_data )
640614 sof_rt5682_quirk = (unsigned long )pdev -> id_entry -> driver_data ;
641615
642616 dmi_check_system (sof_rt5682_quirk_table );
643617
644- ctx -> codec_type = sof_ssp_detect_codec_type (& pdev -> dev );
645- ctx -> amp_type = sof_ssp_detect_amp_type (& pdev -> dev );
618+ if (soc_intel_is_byt () || soc_intel_is_cht ()) {
619+ is_legacy_cpu = true;
620+
621+ /* default quirk for legacy cpu */
622+ sof_rt5682_quirk = SOF_RT5682_MCLK_EN |
623+ SOF_RT5682_MCLK_BYTCHT_EN |
624+ SOF_SSP_PORT_CODEC (2 );
625+ }
626+
627+ dev_dbg (& pdev -> dev , "sof_rt5682_quirk = %lx\n" , sof_rt5682_quirk );
628+
629+ /* initialize ctx with board quirk */
630+ ctx = sof_intel_board_get_ctx (& pdev -> dev , sof_rt5682_quirk );
631+ if (!ctx )
632+ return - ENOMEM ;
646633
647634 if (ctx -> codec_type == CODEC_RT5650 ) {
648635 sof_audio_card_rt5682 .name = devm_kstrdup (& pdev -> dev , "rt5650" ,
@@ -653,23 +640,12 @@ static int sof_audio_probe(struct platform_device *pdev)
653640 ctx -> amp_type = CODEC_RT5650 ;
654641 }
655642
656- if (soc_intel_is_byt () || soc_intel_is_cht () ) {
643+ if (is_legacy_cpu ) {
657644 ctx -> rt5682 .is_legacy_cpu = true;
658645 ctx -> dmic_be_num = 0 ;
659646 /* HDMI is not supported by SOF on Baytrail/CherryTrail */
660647 ctx -> hdmi_num = 0 ;
661- /* default quirk for legacy cpu */
662- sof_rt5682_quirk = SOF_RT5682_MCLK_EN |
663- SOF_RT5682_MCLK_BYTCHT_EN |
664- SOF_RT5682_SSP_CODEC (2 );
665648 } else {
666- ctx -> dmic_be_num = 2 ;
667- ctx -> hdmi_num = (sof_rt5682_quirk & SOF_RT5682_NUM_HDMIDEV_MASK ) >>
668- SOF_RT5682_NUM_HDMIDEV_SHIFT ;
669- /* default number of HDMI DAI's */
670- if (!ctx -> hdmi_num )
671- ctx -> hdmi_num = 3 ;
672-
673649 if (mach -> mach_params .codec_mask & IDISP_CODEC_MASK )
674650 ctx -> hdmi .idisp_codec = true;
675651 }
@@ -694,23 +670,6 @@ static int sof_audio_probe(struct platform_device *pdev)
694670 }
695671 }
696672
697- dev_dbg (& pdev -> dev , "sof_rt5682_quirk = %lx\n" , sof_rt5682_quirk );
698-
699- /* port number/mask of peripherals attached to ssp interface */
700- ctx -> ssp_mask_hdmi_in = (sof_rt5682_quirk & SOF_SSP_HDMI_CAPTURE_PRESENT_MASK ) >>
701- SOF_NO_OF_HDMI_CAPTURE_SSP_SHIFT ;
702-
703- ctx -> ssp_bt = (sof_rt5682_quirk & SOF_BT_OFFLOAD_SSP_MASK ) >>
704- SOF_BT_OFFLOAD_SSP_SHIFT ;
705-
706- ctx -> ssp_amp = (sof_rt5682_quirk & SOF_RT5682_SSP_AMP_MASK ) >>
707- SOF_RT5682_SSP_AMP_SHIFT ;
708-
709- ctx -> ssp_codec = sof_rt5682_quirk & SOF_RT5682_SSP_CODEC_MASK ;
710-
711- if (sof_rt5682_quirk & SOF_SSP_BT_OFFLOAD_PRESENT )
712- ctx -> bt_offload_present = true;
713-
714673 /* update dai_link */
715674 ret = sof_card_dai_links_create (& pdev -> dev , & sof_audio_card_rt5682 , ctx );
716675 if (ret )
@@ -766,96 +725,96 @@ static const struct platform_device_id board_ids[] = {
766725 {
767726 .name = "cml_rt1015_rt5682" ,
768727 .driver_data = (kernel_ulong_t )(SOF_RT5682_MCLK_EN |
769- SOF_RT5682_SSP_CODEC (0 ) |
770- SOF_RT5682_SSP_AMP (1 )),
728+ SOF_SSP_PORT_CODEC (0 ) |
729+ SOF_SSP_PORT_AMP (1 )),
771730 },
772731 {
773732 .name = "jsl_rt5682_def" ,
774733 .driver_data = (kernel_ulong_t )(SOF_RT5682_MCLK_EN |
775- SOF_RT5682_SSP_CODEC (0 ) |
776- SOF_RT5682_SSP_AMP (1 )),
734+ SOF_SSP_PORT_CODEC (0 ) |
735+ SOF_SSP_PORT_AMP (1 )),
777736 },
778737 {
779738 .name = "tgl_rt5682_def" ,
780739 .driver_data = (kernel_ulong_t )(SOF_RT5682_MCLK_EN |
781- SOF_RT5682_SSP_CODEC (0 ) |
782- SOF_RT5682_SSP_AMP (1 ) |
783- SOF_RT5682_NUM_HDMIDEV (4 ) |
784- SOF_BT_OFFLOAD_SSP (2 ) |
785- SOF_SSP_BT_OFFLOAD_PRESENT ),
740+ SOF_SSP_PORT_CODEC (0 ) |
741+ SOF_SSP_PORT_AMP (1 ) |
742+ SOF_NUM_IDISP_HDMI (4 ) |
743+ SOF_SSP_PORT_BT_OFFLOAD (2 ) |
744+ SOF_BT_OFFLOAD_PRESENT ),
786745 },
787746 {
788747 .name = "adl_rt5682_def" ,
789748 .driver_data = (kernel_ulong_t )(SOF_RT5682_MCLK_EN |
790- SOF_RT5682_SSP_CODEC (0 ) |
791- SOF_RT5682_SSP_AMP (1 ) |
792- SOF_RT5682_NUM_HDMIDEV (4 ) |
793- SOF_BT_OFFLOAD_SSP (2 ) |
794- SOF_SSP_BT_OFFLOAD_PRESENT ),
749+ SOF_SSP_PORT_CODEC (0 ) |
750+ SOF_SSP_PORT_AMP (1 ) |
751+ SOF_NUM_IDISP_HDMI (4 ) |
752+ SOF_SSP_PORT_BT_OFFLOAD (2 ) |
753+ SOF_BT_OFFLOAD_PRESENT ),
795754 },
796755 {
797756 .name = "adl_mx98357_rt5682" ,
798757 .driver_data = (kernel_ulong_t )(SOF_RT5682_MCLK_EN |
799- SOF_RT5682_SSP_CODEC (0 ) |
800- SOF_RT5682_SSP_AMP (2 ) |
801- SOF_RT5682_NUM_HDMIDEV (4 )),
758+ SOF_SSP_PORT_CODEC (0 ) |
759+ SOF_SSP_PORT_AMP (2 ) |
760+ SOF_NUM_IDISP_HDMI (4 )),
802761 },
803762 {
804763 .name = "adl_rt5682_c1_h02" ,
805764 .driver_data = (kernel_ulong_t )(SOF_RT5682_MCLK_EN |
806- SOF_RT5682_SSP_CODEC (1 ) |
807- SOF_RT5682_NUM_HDMIDEV (3 ) |
765+ SOF_SSP_PORT_CODEC (1 ) |
766+ SOF_NUM_IDISP_HDMI (3 ) |
808767 /* SSP 0 and SSP 2 are used for HDMI IN */
809- SOF_HDMI_CAPTURE_SSP_MASK (0x5 )),
768+ SOF_SSP_MASK_HDMI_CAPTURE (0x5 )),
810769 },
811770 {
812771 .name = "rpl_mx98357_rt5682" ,
813772 .driver_data = (kernel_ulong_t )(SOF_RT5682_MCLK_EN |
814- SOF_RT5682_SSP_CODEC (0 ) |
815- SOF_RT5682_SSP_AMP (2 ) |
816- SOF_RT5682_NUM_HDMIDEV (4 )),
773+ SOF_SSP_PORT_CODEC (0 ) |
774+ SOF_SSP_PORT_AMP (2 ) |
775+ SOF_NUM_IDISP_HDMI (4 )),
817776 },
818777 {
819778 .name = "rpl_rt5682_def" ,
820779 .driver_data = (kernel_ulong_t )(SOF_RT5682_MCLK_EN |
821- SOF_RT5682_SSP_CODEC (0 ) |
822- SOF_RT5682_SSP_AMP (1 ) |
823- SOF_RT5682_NUM_HDMIDEV (4 ) |
824- SOF_BT_OFFLOAD_SSP (2 ) |
825- SOF_SSP_BT_OFFLOAD_PRESENT ),
780+ SOF_SSP_PORT_CODEC (0 ) |
781+ SOF_SSP_PORT_AMP (1 ) |
782+ SOF_NUM_IDISP_HDMI (4 ) |
783+ SOF_SSP_PORT_BT_OFFLOAD (2 ) |
784+ SOF_BT_OFFLOAD_PRESENT ),
826785 },
827786 {
828787 .name = "rpl_rt5682_c1_h02" ,
829788 .driver_data = (kernel_ulong_t )(SOF_RT5682_MCLK_EN |
830- SOF_RT5682_SSP_CODEC (1 ) |
831- SOF_RT5682_NUM_HDMIDEV (3 ) |
789+ SOF_SSP_PORT_CODEC (1 ) |
790+ SOF_NUM_IDISP_HDMI (3 ) |
832791 /* SSP 0 and SSP 2 are used for HDMI IN */
833- SOF_HDMI_CAPTURE_SSP_MASK (0x5 )),
792+ SOF_SSP_MASK_HDMI_CAPTURE (0x5 )),
834793 },
835794 {
836795 .name = "mtl_mx98357_rt5682" ,
837796 .driver_data = (kernel_ulong_t )(SOF_RT5682_MCLK_EN |
838- SOF_RT5682_SSP_CODEC (0 ) |
839- SOF_RT5682_SSP_AMP (1 ) |
840- SOF_RT5682_NUM_HDMIDEV (3 ) |
841- SOF_BT_OFFLOAD_SSP (2 ) |
842- SOF_SSP_BT_OFFLOAD_PRESENT ),
797+ SOF_SSP_PORT_CODEC (0 ) |
798+ SOF_SSP_PORT_AMP (1 ) |
799+ SOF_NUM_IDISP_HDMI (3 ) |
800+ SOF_SSP_PORT_BT_OFFLOAD (2 ) |
801+ SOF_BT_OFFLOAD_PRESENT ),
843802 },
844803 {
845804 .name = "mtl_mx98360_rt5682" ,
846805 .driver_data = (kernel_ulong_t )(SOF_RT5682_MCLK_EN |
847- SOF_RT5682_SSP_CODEC (0 ) |
848- SOF_RT5682_SSP_AMP (1 ) |
849- SOF_RT5682_NUM_HDMIDEV (3 )),
806+ SOF_SSP_PORT_CODEC (0 ) |
807+ SOF_SSP_PORT_AMP (1 ) |
808+ SOF_NUM_IDISP_HDMI (3 )),
850809 },
851810 {
852811 .name = "mtl_rt5682_def" ,
853812 .driver_data = (kernel_ulong_t )(SOF_RT5682_MCLK_EN |
854- SOF_RT5682_SSP_CODEC (2 ) |
855- SOF_RT5682_SSP_AMP (0 ) |
856- SOF_RT5682_NUM_HDMIDEV (3 ) |
857- SOF_BT_OFFLOAD_SSP (1 ) |
858- SOF_SSP_BT_OFFLOAD_PRESENT ),
813+ SOF_SSP_PORT_CODEC (2 ) |
814+ SOF_SSP_PORT_AMP (0 ) |
815+ SOF_NUM_IDISP_HDMI (3 ) |
816+ SOF_SSP_PORT_BT_OFFLOAD (1 ) |
817+ SOF_BT_OFFLOAD_PRESENT ),
859818 },
860819 { }
861820};
@@ -881,4 +840,3 @@ MODULE_LICENSE("GPL v2");
881840MODULE_IMPORT_NS (SND_SOC_INTEL_SOF_BOARD_HELPERS );
882841MODULE_IMPORT_NS (SND_SOC_INTEL_SOF_MAXIM_COMMON );
883842MODULE_IMPORT_NS (SND_SOC_INTEL_SOF_REALTEK_COMMON );
884- MODULE_IMPORT_NS (SND_SOC_INTEL_SOF_SSP_COMMON );
0 commit comments