xref: /openbmc/linux/sound/soc/codecs/wm8994.h (revision 8be98d2f2a0a262f8bf8a0bc1fdf522b3c7aab17)
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