| /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */ |
| /* |
| * This file is provided under a dual BSD/GPLv2 license. When using or |
| * redistributing this file, you may do so under either license. |
| * |
| * Copyright(c) 2021 Advanced Micro Devices, Inc. All rights reserved. |
| * |
| * Author: Ajit Kumar Pandey <AjitKumar.Pandey@amd.com> |
| */ |
| #ifndef __ACP_MACH_H |
| #define __ACP_MACH_H |
| |
| #include <sound/core.h> |
| #include <sound/jack.h> |
| #include <sound/pcm_params.h> |
| #include <sound/soc-dapm.h> |
| #include <linux/input.h> |
| #include <linux/module.h> |
| #include <sound/soc.h> |
| |
| #define TDM_CHANNELS 8 |
| |
| #define ACP_OPS(priv, cb) ((priv)->ops.cb) |
| |
| #define acp_get_drvdata(card) ((struct acp_card_drvdata *)(card)->drvdata) |
| |
| enum be_id { |
| HEADSET_BE_ID = 0, |
| AMP_BE_ID, |
| DMIC_BE_ID, |
| BT_BE_ID, |
| }; |
| |
| enum cpu_endpoints { |
| NONE = 0, |
| I2S_HS, |
| I2S_SP, |
| I2S_BT, |
| DMIC, |
| }; |
| |
| enum codec_endpoints { |
| DUMMY = 0, |
| RT5682, |
| RT1019, |
| MAX98360A, |
| RT5682S, |
| NAU8825, |
| NAU8821, |
| MAX98388, |
| ES83XX, |
| }; |
| |
| enum platform_end_point { |
| RENOIR = 0, |
| REMBRANDT, |
| ACP63, |
| ACP70, |
| }; |
| |
| struct acp_mach_ops { |
| int (*probe)(struct snd_soc_card *card); |
| int (*configure_link)(struct snd_soc_card *card, struct snd_soc_dai_link *dai_link); |
| int (*configure_widgets)(struct snd_soc_card *card); |
| int (*suspend_pre)(struct snd_soc_card *card); |
| int (*resume_post)(struct snd_soc_card *card); |
| }; |
| |
| struct acp_card_drvdata { |
| unsigned int hs_cpu_id; |
| unsigned int amp_cpu_id; |
| unsigned int bt_cpu_id; |
| unsigned int dmic_cpu_id; |
| unsigned int hs_codec_id; |
| unsigned int amp_codec_id; |
| unsigned int bt_codec_id; |
| unsigned int dmic_codec_id; |
| unsigned int dai_fmt; |
| unsigned int platform; |
| struct clk *wclk; |
| struct clk *bclk; |
| struct acp_mach_ops ops; |
| struct snd_soc_acpi_mach *acpi_mach; |
| void *mach_priv; |
| bool soc_mclk; |
| bool tdm_mode; |
| }; |
| |
| int acp_sofdsp_dai_links_create(struct snd_soc_card *card); |
| int acp_legacy_dai_links_create(struct snd_soc_card *card); |
| extern const struct dmi_system_id acp_quirk_table[]; |
| |
| static inline int acp_ops_probe(struct snd_soc_card *card) |
| { |
| int ret = 1; |
| struct acp_card_drvdata *priv = acp_get_drvdata(card); |
| |
| if (ACP_OPS(priv, probe)) |
| ret = ACP_OPS(priv, probe)(card); |
| return ret; |
| } |
| |
| static inline int acp_ops_configure_link(struct snd_soc_card *card, |
| struct snd_soc_dai_link *dai_link) |
| { |
| int ret = 1; |
| struct acp_card_drvdata *priv = acp_get_drvdata(card); |
| |
| if (ACP_OPS(priv, configure_link)) |
| ret = ACP_OPS(priv, configure_link)(card, dai_link); |
| return ret; |
| } |
| |
| static inline int acp_ops_configure_widgets(struct snd_soc_card *card) |
| { |
| int ret = 1; |
| struct acp_card_drvdata *priv = acp_get_drvdata(card); |
| |
| if (ACP_OPS(priv, configure_widgets)) |
| ret = ACP_OPS(priv, configure_widgets)(card); |
| return ret; |
| } |
| |
| static inline int acp_ops_suspend_pre(struct snd_soc_card *card) |
| { |
| int ret = 1; |
| struct acp_card_drvdata *priv = acp_get_drvdata(card); |
| |
| if (ACP_OPS(priv, suspend_pre)) |
| ret = ACP_OPS(priv, suspend_pre)(card); |
| return ret; |
| } |
| |
| static inline int acp_ops_resume_post(struct snd_soc_card *card) |
| { |
| int ret = 1; |
| struct acp_card_drvdata *priv = acp_get_drvdata(card); |
| |
| if (ACP_OPS(priv, resume_post)) |
| ret = ACP_OPS(priv, resume_post)(card); |
| return ret; |
| } |
| |
| #endif |