146 lines · c
1/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */2/*3 * This file is provided under a dual BSD/GPLv2 license. When using or4 * redistributing this file, you may do so under either license.5 *6 * Copyright(c) 2021 Advanced Micro Devices, Inc. All rights reserved.7 *8 * Author: Ajit Kumar Pandey <AjitKumar.Pandey@amd.com>9 */10#ifndef __ACP_MACH_H11#define __ACP_MACH_H12 13#include <sound/core.h>14#include <sound/jack.h>15#include <sound/pcm_params.h>16#include <sound/soc-dapm.h>17#include <linux/input.h>18#include <linux/module.h>19#include <sound/soc.h>20 21#define TDM_CHANNELS 822 23#define ACP_OPS(priv, cb) ((priv)->ops.cb)24 25#define acp_get_drvdata(card) ((struct acp_card_drvdata *)(card)->drvdata)26 27enum be_id {28 HEADSET_BE_ID = 0,29 AMP_BE_ID,30 DMIC_BE_ID,31 BT_BE_ID,32};33 34enum cpu_endpoints {35 NONE = 0,36 I2S_HS,37 I2S_SP,38 I2S_BT,39 DMIC,40};41 42enum codec_endpoints {43 DUMMY = 0,44 RT5682,45 RT1019,46 MAX98360A,47 RT5682S,48 NAU8825,49 NAU8821,50 MAX98388,51 ES83XX,52};53 54enum platform_end_point {55 RENOIR = 0,56 REMBRANDT,57 ACP63,58 ACP70,59 ACP71,60};61 62struct acp_mach_ops {63 int (*probe)(struct snd_soc_card *card);64 int (*configure_link)(struct snd_soc_card *card, struct snd_soc_dai_link *dai_link);65 int (*configure_widgets)(struct snd_soc_card *card);66 int (*suspend_pre)(struct snd_soc_card *card);67 int (*resume_post)(struct snd_soc_card *card);68};69 70struct acp_card_drvdata {71 unsigned int hs_cpu_id;72 unsigned int amp_cpu_id;73 unsigned int bt_cpu_id;74 unsigned int dmic_cpu_id;75 unsigned int hs_codec_id;76 unsigned int amp_codec_id;77 unsigned int bt_codec_id;78 unsigned int dmic_codec_id;79 unsigned int dai_fmt;80 unsigned int platform;81 struct clk *wclk;82 struct clk *bclk;83 struct acp_mach_ops ops;84 struct snd_soc_acpi_mach *acpi_mach;85 void *mach_priv;86 bool soc_mclk;87 bool tdm_mode;88};89 90int acp_sofdsp_dai_links_create(struct snd_soc_card *card);91int acp_legacy_dai_links_create(struct snd_soc_card *card);92extern const struct dmi_system_id acp_quirk_table[];93 94static inline int acp_ops_probe(struct snd_soc_card *card)95{96 int ret = 1;97 struct acp_card_drvdata *priv = acp_get_drvdata(card);98 99 if (ACP_OPS(priv, probe))100 ret = ACP_OPS(priv, probe)(card);101 return ret;102}103 104static inline int acp_ops_configure_link(struct snd_soc_card *card,105 struct snd_soc_dai_link *dai_link)106{107 int ret = 1;108 struct acp_card_drvdata *priv = acp_get_drvdata(card);109 110 if (ACP_OPS(priv, configure_link))111 ret = ACP_OPS(priv, configure_link)(card, dai_link);112 return ret;113}114 115static inline int acp_ops_configure_widgets(struct snd_soc_card *card)116{117 int ret = 1;118 struct acp_card_drvdata *priv = acp_get_drvdata(card);119 120 if (ACP_OPS(priv, configure_widgets))121 ret = ACP_OPS(priv, configure_widgets)(card);122 return ret;123}124 125static inline int acp_ops_suspend_pre(struct snd_soc_card *card)126{127 int ret = 1;128 struct acp_card_drvdata *priv = acp_get_drvdata(card);129 130 if (ACP_OPS(priv, suspend_pre))131 ret = ACP_OPS(priv, suspend_pre)(card);132 return ret;133}134 135static inline int acp_ops_resume_post(struct snd_soc_card *card)136{137 int ret = 1;138 struct acp_card_drvdata *priv = acp_get_drvdata(card);139 140 if (ACP_OPS(priv, resume_post))141 ret = ACP_OPS(priv, resume_post)(card);142 return ret;143}144 145#endif146