ASoC: Intel: board_helpers: support sof_card_private initialization
authorBrent Lu <brent.lu@intel.com>
Mon, 25 Mar 2024 22:10:45 +0000 (17:10 -0500)
committerMark Brown <broonie@kernel.org>
Mon, 25 Mar 2024 22:44:55 +0000 (22:44 +0000)
Add a helper function for machine drivers to initialize common part of
sof_card_private structure. Also unify the macros of board quirks for
the initialization.

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-8-pierre-louis.bossart@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/intel/boards/sof_board_helpers.c
sound/soc/intel/boards/sof_board_helpers.h

index feba1a52252797af266aca9edb2f9b26cc25e3b7..a5135be94f32a31567a593595c9781498ed1e28d 100644 (file)
@@ -587,6 +587,49 @@ int sof_intel_board_set_dai_link(struct device *dev, struct snd_soc_card *card,
 }
 EXPORT_SYMBOL_NS(sof_intel_board_set_dai_link, SND_SOC_INTEL_SOF_BOARD_HELPERS);
 
+struct sof_card_private *
+sof_intel_board_get_ctx(struct device *dev, unsigned long board_quirk)
+{
+       struct sof_card_private *ctx;
+
+       dev_dbg(dev, "create ctx, board_quirk 0x%lx\n", board_quirk);
+
+       ctx = devm_kzalloc(dev, sizeof(struct sof_card_private), GFP_KERNEL);
+       if (!ctx)
+               return NULL;
+
+       ctx->codec_type = sof_ssp_detect_codec_type(dev);
+       ctx->amp_type = sof_ssp_detect_amp_type(dev);
+
+       ctx->dmic_be_num = 2;
+       ctx->hdmi_num = (board_quirk & SOF_NUM_IDISP_HDMI_MASK) >>
+                       SOF_NUM_IDISP_HDMI_SHIFT;
+       /* default number of HDMI DAI's */
+       if (!ctx->hdmi_num)
+               ctx->hdmi_num = 3;
+
+       /* port number/mask of peripherals attached to ssp interface */
+       if (ctx->codec_type != CODEC_NONE)
+               ctx->ssp_codec = (board_quirk & SOF_SSP_PORT_CODEC_MASK) >>
+                               SOF_SSP_PORT_CODEC_SHIFT;
+
+       if (ctx->amp_type != CODEC_NONE)
+               ctx->ssp_amp = (board_quirk & SOF_SSP_PORT_AMP_MASK) >>
+                               SOF_SSP_PORT_AMP_SHIFT;
+
+       if (board_quirk & SOF_BT_OFFLOAD_PRESENT) {
+               ctx->bt_offload_present = true;
+               ctx->ssp_bt = (board_quirk & SOF_SSP_PORT_BT_OFFLOAD_MASK) >>
+                               SOF_SSP_PORT_BT_OFFLOAD_SHIFT;
+       }
+
+       ctx->ssp_mask_hdmi_in = (board_quirk & SOF_SSP_MASK_HDMI_CAPTURE_MASK) >>
+                               SOF_SSP_MASK_HDMI_CAPTURE_SHIFT;
+
+       return ctx;
+}
+EXPORT_SYMBOL_NS(sof_intel_board_get_ctx, SND_SOC_INTEL_SOF_BOARD_HELPERS);
+
 struct snd_soc_dai *get_codec_dai_by_name(struct snd_soc_pcm_runtime *rtd,
                                          const char * const dai_name[], int num_dais)
 {
index 38e459e6af9b981bc1817a5f0c512ef77eccc910..0d0a8d97843b03107b17c88929b9be0afe77aa09 100644 (file)
 #include "sof_hdmi_common.h"
 #include "sof_ssp_common.h"
 
+/*
+ * Common board quirks: from bit 8 to 31, LSB 8 bits reserved for machine
+ *                      drivers
+ */
+
+/* SSP port number for headphone codec: 3 bits */
+#define SOF_SSP_PORT_CODEC_SHIFT               8
+#define SOF_SSP_PORT_CODEC_MASK                        (GENMASK(10, 8))
+#define SOF_SSP_PORT_CODEC(quirk)              \
+       (((quirk) << SOF_SSP_PORT_CODEC_SHIFT) & SOF_SSP_PORT_CODEC_MASK)
+
+/* SSP port number for speaker amplifier: 3 bits */
+#define SOF_SSP_PORT_AMP_SHIFT                 11
+#define SOF_SSP_PORT_AMP_MASK                  (GENMASK(13, 11))
+#define SOF_SSP_PORT_AMP(quirk)                        \
+       (((quirk) << SOF_SSP_PORT_AMP_SHIFT) & SOF_SSP_PORT_AMP_MASK)
+
+/* SSP port number for BT audio offload: 3 bits */
+#define SOF_SSP_PORT_BT_OFFLOAD_SHIFT          14
+#define SOF_SSP_PORT_BT_OFFLOAD_MASK           (GENMASK(16, 14))
+#define SOF_SSP_PORT_BT_OFFLOAD(quirk)         \
+       (((quirk) << SOF_SSP_PORT_BT_OFFLOAD_SHIFT) & SOF_SSP_PORT_BT_OFFLOAD_MASK)
+
+/* SSP port mask for HDMI capture: 6 bits */
+#define SOF_SSP_MASK_HDMI_CAPTURE_SHIFT                17
+#define SOF_SSP_MASK_HDMI_CAPTURE_MASK         (GENMASK(22, 17))
+#define SOF_SSP_MASK_HDMI_CAPTURE(quirk)       \
+       (((quirk) << SOF_SSP_MASK_HDMI_CAPTURE_SHIFT) & SOF_SSP_MASK_HDMI_CAPTURE_MASK)
+
+/* Number of idisp HDMI BE link: 3 bits */
+#define SOF_NUM_IDISP_HDMI_SHIFT               23
+#define SOF_NUM_IDISP_HDMI_MASK                        (GENMASK(25, 23))
+#define SOF_NUM_IDISP_HDMI(quirk)              \
+       (((quirk) << SOF_NUM_IDISP_HDMI_SHIFT) & SOF_NUM_IDISP_HDMI_MASK)
+
+/* Board uses BT audio offload */
+#define SOF_BT_OFFLOAD_PRESENT                 BIT(26)
+
 enum {
        SOF_LINK_NONE = 0,
        SOF_LINK_CODEC,
@@ -111,6 +149,8 @@ struct sof_card_private {
 int sof_intel_board_card_late_probe(struct snd_soc_card *card);
 int sof_intel_board_set_dai_link(struct device *dev, struct snd_soc_card *card,
                                 struct sof_card_private *ctx);
+struct sof_card_private *
+sof_intel_board_get_ctx(struct device *dev, unsigned long board_quirk);
 
 struct snd_soc_dai *get_codec_dai_by_name(struct snd_soc_pcm_runtime *rtd,
                                          const char * const dai_name[], int num_dais);