Skip to content

Commit 8efcd48

Browse files
brentlubroonie
authored andcommitted
ASoC: Intel: sof_rt5682: use common module for sof_card_private initialization
Use intel_board module to initialize sof_card_private structure Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com> Signed-off-by: Brent Lu <brent.lu@intel.com> Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> Link: https://msgid.link/r/20240325221059.206042-11-pierre-louis.bossart@linux.intel.com Signed-off-by: Mark Brown <broonie@kernel.org>
1 parent bfa8c00 commit 8efcd48

File tree

1 file changed

+89
-131
lines changed

1 file changed

+89
-131
lines changed

sound/soc/intel/boards/sof_rt5682.c

Lines changed: 89 additions & 131 deletions
Original file line numberDiff line numberDiff line change
@@ -27,37 +27,14 @@
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 */
5936
static unsigned long sof_rt5682_quirk = SOF_RT5682_MCLK_EN |
60-
SOF_RT5682_SSP_CODEC(0);
37+
SOF_SSP_PORT_CODEC(0);
6138

6239
static 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");
881840
MODULE_IMPORT_NS(SND_SOC_INTEL_SOF_BOARD_HELPERS);
882841
MODULE_IMPORT_NS(SND_SOC_INTEL_SOF_MAXIM_COMMON);
883842
MODULE_IMPORT_NS(SND_SOC_INTEL_SOF_REALTEK_COMMON);
884-
MODULE_IMPORT_NS(SND_SOC_INTEL_SOF_SSP_COMMON);

0 commit comments

Comments
 (0)