1d2912cb1SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */ 29e6e96a1SMark Brown /* 39e6e96a1SMark Brown * wm8994.h -- WM8994 Soc Audio driver 49e6e96a1SMark Brown */ 59e6e96a1SMark Brown 69e6e96a1SMark Brown #ifndef _WM8994_H 79e6e96a1SMark Brown #define _WM8994_H 89e6e96a1SMark Brown 9419e2f50SSylwester Nawrocki #include <linux/clk.h> 109e6e96a1SMark Brown #include <sound/soc.h> 11fbbf5920SMark Brown #include <linux/firmware.h> 12c7ebf932SMark Brown #include <linux/completion.h> 13e9b54de4SMark Brown #include <linux/workqueue.h> 14fabfad2fSLars-Peter Clausen #include <linux/mutex.h> 159e6e96a1SMark Brown 16f701a2e5SMark Brown #include "wm_hubs.h" 17f701a2e5SMark Brown 18419e2f50SSylwester Nawrocki enum { 19419e2f50SSylwester Nawrocki WM8994_MCLK1, 20419e2f50SSylwester Nawrocki WM8994_MCLK2, 21419e2f50SSylwester Nawrocki WM8994_NUM_MCLK 22419e2f50SSylwester Nawrocki }; 23419e2f50SSylwester Nawrocki 249e6e96a1SMark Brown /* Sources for AIF1/2 SYSCLK - use with set_dai_sysclk() */ 259e6e96a1SMark Brown #define WM8994_SYSCLK_MCLK1 1 269e6e96a1SMark Brown #define WM8994_SYSCLK_MCLK2 2 279e6e96a1SMark Brown #define WM8994_SYSCLK_FLL1 3 289e6e96a1SMark Brown #define WM8994_SYSCLK_FLL2 4 299e6e96a1SMark Brown 3066b47fdbSMark Brown /* OPCLK is also configured with set_dai_sysclk, specify division*10 as rate. */ 3166b47fdbSMark Brown #define WM8994_SYSCLK_OPCLK 5 3266b47fdbSMark Brown 339e6e96a1SMark Brown #define WM8994_FLL1 1 349e6e96a1SMark Brown #define WM8994_FLL2 2 359e6e96a1SMark Brown 36136ff2a2SMark Brown #define WM8994_FLL_SRC_MCLK1 1 37136ff2a2SMark Brown #define WM8994_FLL_SRC_MCLK2 2 38136ff2a2SMark Brown #define WM8994_FLL_SRC_LRCLK 3 39136ff2a2SMark Brown #define WM8994_FLL_SRC_BCLK 4 40fbfe6983SMark Brown #define WM8994_FLL_SRC_INTERNAL 5 41136ff2a2SMark Brown 4222f8d055SMark Brown enum wm8994_vmid_mode { 4322f8d055SMark Brown WM8994_VMID_NORMAL, 4422f8d055SMark Brown WM8994_VMID_FORCE, 4522f8d055SMark Brown }; 4622f8d055SMark Brown 4763dd5452SMark Brown typedef void (*wm1811_micdet_cb)(void *data); 4898869f68SMark Brown typedef void (*wm1811_mic_id_cb)(void *data, u16 status); 49821edd2fSMark Brown 5000a6941cSKuninori Morimoto int wm8994_mic_detect(struct snd_soc_component *component, struct snd_soc_jack *jack, 5187092e3cSMark Brown int micbias); 5200a6941cSKuninori Morimoto int wm8958_mic_detect(struct snd_soc_component *component, struct snd_soc_jack *jack, 53*b564fdb7SPierre-Louis Bossart wm1811_micdet_cb det_cb, void *det_cb_data, 5498869f68SMark Brown wm1811_mic_id_cb id_cb, void *id_cb_data); 5588766984SMark Brown 5600a6941cSKuninori Morimoto int wm8994_vmid_mode(struct snd_soc_component *component, enum wm8994_vmid_mode mode); 5722f8d055SMark Brown 58f701a2e5SMark Brown int wm8958_aif_ev(struct snd_soc_dapm_widget *w, 59f701a2e5SMark Brown struct snd_kcontrol *kcontrol, int event); 60f701a2e5SMark Brown 6100a6941cSKuninori Morimoto void wm8958_dsp2_init(struct snd_soc_component *component); 62f701a2e5SMark Brown 63f701a2e5SMark Brown struct wm8994_micdet { 64f701a2e5SMark Brown struct snd_soc_jack *jack; 6587092e3cSMark Brown bool detecting; 66f701a2e5SMark Brown }; 67f701a2e5SMark Brown 68f701a2e5SMark Brown /* codec private data */ 69f701a2e5SMark Brown struct wm8994_fll_config { 70f701a2e5SMark Brown int src; 71f701a2e5SMark Brown int in; 72f701a2e5SMark Brown int out; 73f701a2e5SMark Brown }; 74f701a2e5SMark Brown 75f701a2e5SMark Brown #define WM8994_NUM_DRC 3 76f701a2e5SMark Brown #define WM8994_NUM_EQ 3 77f701a2e5SMark Brown 782a8a856dSMark Brown struct wm8994; 792a8a856dSMark Brown 80f701a2e5SMark Brown struct wm8994_priv { 81f701a2e5SMark Brown struct wm_hubs_data hubs; 822a8a856dSMark Brown struct wm8994 *wm8994; 83419e2f50SSylwester Nawrocki struct clk_bulk_data mclk[WM8994_NUM_MCLK]; 84f701a2e5SMark Brown int sysclk[2]; 85f701a2e5SMark Brown int sysclk_rate[2]; 86419e2f50SSylwester Nawrocki int mclk_rate[2]; 87f701a2e5SMark Brown int aifclk[2]; 88d3725761SMark Brown int aifdiv[2]; 8979748cdbSMark Brown int channels[2]; 90f701a2e5SMark Brown struct wm8994_fll_config fll[2], fll_suspend[2]; 91c7ebf932SMark Brown struct completion fll_locked[2]; 92c7ebf932SMark Brown bool fll_locked_irq; 9320dc24a9SMark Brown bool fll_byp; 9499af79dfSMark Brown bool clk_has_run; 95f701a2e5SMark Brown 964b7ed83aSMark Brown int vmid_refcount; 97af6b6fe4SMark Brown int active_refcount; 9822f8d055SMark Brown enum wm8994_vmid_mode vmid_mode; 994b7ed83aSMark Brown 100f701a2e5SMark Brown int dac_rates[2]; 101f701a2e5SMark Brown int lrclk_shared[2]; 102f701a2e5SMark Brown 103f701a2e5SMark Brown int mbc_ena[3]; 10409e10d7fSMark Brown int hpf1_ena[3]; 10509e10d7fSMark Brown int hpf2_ena[3]; 10609e10d7fSMark Brown int vss_ena[3]; 10731215871SMark Brown int enh_eq_ena[3]; 108f701a2e5SMark Brown 109f701a2e5SMark Brown /* Platform dependant DRC configuration */ 110f701a2e5SMark Brown const char **drc_texts; 111f701a2e5SMark Brown int drc_cfg[WM8994_NUM_DRC]; 112f701a2e5SMark Brown struct soc_enum drc_enum; 113f701a2e5SMark Brown 114f701a2e5SMark Brown /* Platform dependant ReTune mobile configuration */ 115f701a2e5SMark Brown int num_retune_mobile_texts; 116f701a2e5SMark Brown const char **retune_mobile_texts; 117f701a2e5SMark Brown int retune_mobile_cfg[WM8994_NUM_EQ]; 118f701a2e5SMark Brown struct soc_enum retune_mobile_enum; 119f701a2e5SMark Brown 120f701a2e5SMark Brown /* Platform dependant MBC configuration */ 121f701a2e5SMark Brown int mbc_cfg; 122f701a2e5SMark Brown const char **mbc_texts; 123f701a2e5SMark Brown struct soc_enum mbc_enum; 124f701a2e5SMark Brown 12509e10d7fSMark Brown /* Platform dependant VSS configuration */ 12609e10d7fSMark Brown int vss_cfg; 12709e10d7fSMark Brown const char **vss_texts; 12809e10d7fSMark Brown struct soc_enum vss_enum; 12909e10d7fSMark Brown 13009e10d7fSMark Brown /* Platform dependant VSS HPF configuration */ 13109e10d7fSMark Brown int vss_hpf_cfg; 13209e10d7fSMark Brown const char **vss_hpf_texts; 13309e10d7fSMark Brown struct soc_enum vss_hpf_enum; 13409e10d7fSMark Brown 13531215871SMark Brown /* Platform dependant enhanced EQ configuration */ 13631215871SMark Brown int enh_eq_cfg; 13731215871SMark Brown const char **enh_eq_texts; 13831215871SMark Brown struct soc_enum enh_eq_enum; 13931215871SMark Brown 140af6b6fe4SMark Brown struct mutex accdet_lock; 141f701a2e5SMark Brown struct wm8994_micdet micdet[2]; 142e9b54de4SMark Brown struct delayed_work mic_work; 14370bd3b29SMark Brown struct delayed_work open_circuit_work; 1442da1c4bfSMark Brown struct delayed_work mic_complete_work; 1452da1c4bfSMark Brown u16 mic_status; 146157a75e6SMark Brown bool mic_detecting; 147b00adf76SMark Brown bool jack_mic; 1484585790dSMark Brown int btn_mask; 149af6b6fe4SMark Brown bool jackdet; 1504752a887SMark Brown int jackdet_mode; 15199af79dfSMark Brown struct delayed_work jackdet_bootstrap; 152f701a2e5SMark Brown 153f701a2e5SMark Brown int micdet_irq; 15463dd5452SMark Brown wm1811_micdet_cb micd_cb; 15563dd5452SMark Brown void *micd_cb_data; 15698869f68SMark Brown wm1811_mic_id_cb mic_id_cb; 15798869f68SMark Brown void *mic_id_cb_data; 158f701a2e5SMark Brown 159f701a2e5SMark Brown unsigned int aif1clk_enable:1; 160f701a2e5SMark Brown unsigned int aif2clk_enable:1; 161f701a2e5SMark Brown 162f701a2e5SMark Brown unsigned int aif1clk_disable:1; 163f701a2e5SMark Brown unsigned int aif2clk_disable:1; 164fbbf5920SMark Brown 165fabfad2fSLars-Peter Clausen struct mutex fw_lock; 166f20d77ceSMark Brown int dsp_active; 167fbbf5920SMark Brown const struct firmware *cur_fw; 168fbbf5920SMark Brown const struct firmware *mbc; 16909e10d7fSMark Brown const struct firmware *mbc_vss; 17031215871SMark Brown const struct firmware *enh_eq; 171f701a2e5SMark Brown }; 172f701a2e5SMark Brown 1739e6e96a1SMark Brown #endif 174