Path: blob/master/sound/soc/intel/boards/sof_board_helpers.h
26493 views
/* SPDX-License-Identifier: GPL-2.0-only */1/*2* Copyright(c) 2023 Intel Corporation.3*/45#ifndef __SOF_INTEL_BOARD_HELPERS_H6#define __SOF_INTEL_BOARD_HELPERS_H78#include <sound/soc.h>9#include <sound/soc-acpi-intel-ssp-common.h>10#include "sof_hdmi_common.h"1112/*13* Common board quirks: from bit 8 to 31, LSB 8 bits reserved for machine14* drivers15*/1617/* SSP port number for headphone codec: 3 bits */18#define SOF_SSP_PORT_CODEC_SHIFT 819#define SOF_SSP_PORT_CODEC_MASK (GENMASK(10, 8))20#define SOF_SSP_PORT_CODEC(quirk) \21(((quirk) << SOF_SSP_PORT_CODEC_SHIFT) & SOF_SSP_PORT_CODEC_MASK)2223/* SSP port number for speaker amplifier: 3 bits */24#define SOF_SSP_PORT_AMP_SHIFT 1125#define SOF_SSP_PORT_AMP_MASK (GENMASK(13, 11))26#define SOF_SSP_PORT_AMP(quirk) \27(((quirk) << SOF_SSP_PORT_AMP_SHIFT) & SOF_SSP_PORT_AMP_MASK)2829/* SSP port number for BT audio offload: 3 bits */30#define SOF_SSP_PORT_BT_OFFLOAD_SHIFT 1431#define SOF_SSP_PORT_BT_OFFLOAD_MASK (GENMASK(16, 14))32#define SOF_SSP_PORT_BT_OFFLOAD(quirk) \33(((quirk) << SOF_SSP_PORT_BT_OFFLOAD_SHIFT) & SOF_SSP_PORT_BT_OFFLOAD_MASK)3435/* SSP port mask for HDMI capture: 6 bits */36#define SOF_SSP_MASK_HDMI_CAPTURE_SHIFT 1737#define SOF_SSP_MASK_HDMI_CAPTURE_MASK (GENMASK(22, 17))38#define SOF_SSP_MASK_HDMI_CAPTURE(quirk) \39(((quirk) << SOF_SSP_MASK_HDMI_CAPTURE_SHIFT) & SOF_SSP_MASK_HDMI_CAPTURE_MASK)4041/* Number of idisp HDMI BE link: 3 bits */42#define SOF_NUM_IDISP_HDMI_SHIFT 2343#define SOF_NUM_IDISP_HDMI_MASK (GENMASK(25, 23))44#define SOF_NUM_IDISP_HDMI(quirk) \45(((quirk) << SOF_NUM_IDISP_HDMI_SHIFT) & SOF_NUM_IDISP_HDMI_MASK)4647/* Board uses BT audio offload */48#define SOF_BT_OFFLOAD_PRESENT BIT(26)4950enum {51SOF_LINK_NONE = 0,52SOF_LINK_CODEC,53SOF_LINK_DMIC01,54SOF_LINK_DMIC16K,55SOF_LINK_IDISP_HDMI,56SOF_LINK_AMP,57SOF_LINK_BT_OFFLOAD,58SOF_LINK_HDMI_IN,59SOF_LINK_HDA,60};6162#define SOF_LINK_ORDER_MASK (0xF)63#define SOF_LINK_ORDER_SHIFT (4)6465#define SOF_LINK_ORDER(k1, k2, k3, k4, k5, k6, k7) \66((((k1) & SOF_LINK_ORDER_MASK) << (SOF_LINK_ORDER_SHIFT * 0)) | \67(((k2) & SOF_LINK_ORDER_MASK) << (SOF_LINK_ORDER_SHIFT * 1)) | \68(((k3) & SOF_LINK_ORDER_MASK) << (SOF_LINK_ORDER_SHIFT * 2)) | \69(((k4) & SOF_LINK_ORDER_MASK) << (SOF_LINK_ORDER_SHIFT * 3)) | \70(((k5) & SOF_LINK_ORDER_MASK) << (SOF_LINK_ORDER_SHIFT * 4)) | \71(((k6) & SOF_LINK_ORDER_MASK) << (SOF_LINK_ORDER_SHIFT * 5)) | \72(((k7) & SOF_LINK_ORDER_MASK) << (SOF_LINK_ORDER_SHIFT * 6)))7374#define SOF_LINK_IDS_MASK (0xF)75#define SOF_LINK_IDS_SHIFT (4)7677#define SOF_LINK_IDS(k1, k2, k3, k4, k5, k6, k7) \78((((k1) & SOF_LINK_IDS_MASK) << (SOF_LINK_IDS_SHIFT * 0)) | \79(((k2) & SOF_LINK_IDS_MASK) << (SOF_LINK_IDS_SHIFT * 1)) | \80(((k3) & SOF_LINK_IDS_MASK) << (SOF_LINK_IDS_SHIFT * 2)) | \81(((k4) & SOF_LINK_IDS_MASK) << (SOF_LINK_IDS_SHIFT * 3)) | \82(((k5) & SOF_LINK_IDS_MASK) << (SOF_LINK_IDS_SHIFT * 4)) | \83(((k6) & SOF_LINK_IDS_MASK) << (SOF_LINK_IDS_SHIFT * 5)) | \84(((k7) & SOF_LINK_IDS_MASK) << (SOF_LINK_IDS_SHIFT * 6)))8586/*87* sof_da7219_private: private data for da7219 machine driver88*89* @mclk_en: true for mclk pin is connected90* @pll_bypass: true for PLL bypass mode91*/92struct sof_da7219_private {93bool mclk_en;94bool pll_bypass;95};9697/*98* sof_rt5682_private: private data for rt5682 machine driver99*100* @mclk: mclk clock data101* @is_legacy_cpu: true for BYT/CHT boards102* @mclk_en: true for mclk pin is connected103*/104struct sof_rt5682_private {105struct clk *mclk;106bool is_legacy_cpu;107bool mclk_en;108};109110/*111* sof_card_private: common data for machine drivers112*113* @headset_jack: headset jack data114* @hdmi: init data for hdmi dai link115* @codec_type: type of headset codec116* @amp_type: type of speaker amplifier117* @dmic_be_num: number of Intel PCH DMIC BE link118* @hdmi_num: number of Intel HDMI BE link119* @ssp_codec: ssp port number of headphone BE link120* @ssp_amp: ssp port number of speaker BE link121* @ssp_bt: ssp port number of BT offload BE link122* @ssp_mask_hdmi_in: ssp port mask of HDMI-IN BE link123* @bt_offload_present: true to create BT offload BE link124* @hda_codec_present: true to create HDA codec BE links125* @codec_link: pointer to headset codec dai link126* @amp_link: pointer to speaker amplifier dai link127* @link_order_overwrite: custom DAI link order128* @link_id_overwrite: custom DAI link ID129* @da7219: private data for da7219 machine driver130* @rt5682: private data for rt5682 machine driver131*/132struct sof_card_private {133struct snd_soc_jack headset_jack;134struct sof_hdmi_private hdmi;135136enum snd_soc_acpi_intel_codec codec_type;137enum snd_soc_acpi_intel_codec amp_type;138139int dmic_be_num;140int hdmi_num;141142int ssp_codec;143int ssp_amp;144int ssp_bt;145unsigned long ssp_mask_hdmi_in;146147bool bt_offload_present;148bool hda_codec_present;149150struct snd_soc_dai_link *codec_link;151struct snd_soc_dai_link *amp_link;152153unsigned long link_order_overwrite;154/*155* A variable stores id for all BE DAI links, use SOF_LINK_IDS macro to156* build the value; use DAI link array index as id if zero.157*/158unsigned long link_id_overwrite;159160union {161struct sof_da7219_private da7219;162struct sof_rt5682_private rt5682;163};164};165166int sof_intel_board_card_late_probe(struct snd_soc_card *card);167int sof_intel_board_set_dai_link(struct device *dev, struct snd_soc_card *card,168struct sof_card_private *ctx);169struct sof_card_private *170sof_intel_board_get_ctx(struct device *dev, unsigned long board_quirk);171172#endif /* __SOF_INTEL_BOARD_HELPERS_H */173174175