xref: /openbmc/linux/sound/soc/codecs/wm8994.h (revision 8be98d2f2a0a262f8bf8a0bc1fdf522b3c7aab17)
1  /* SPDX-License-Identifier: GPL-2.0-only */
2  /*
3   * wm8994.h  --  WM8994 Soc Audio driver
4   */
5  
6  #ifndef _WM8994_H
7  #define _WM8994_H
8  
9  #include <linux/clk.h>
10  #include <sound/soc.h>
11  #include <linux/firmware.h>
12  #include <linux/completion.h>
13  #include <linux/workqueue.h>
14  #include <linux/mutex.h>
15  
16  #include "wm_hubs.h"
17  
18  enum {
19  	WM8994_MCLK1,
20  	WM8994_MCLK2,
21  	WM8994_NUM_MCLK
22  };
23  
24  /* Sources for AIF1/2 SYSCLK - use with set_dai_sysclk() */
25  #define WM8994_SYSCLK_MCLK1 1
26  #define WM8994_SYSCLK_MCLK2 2
27  #define WM8994_SYSCLK_FLL1  3
28  #define WM8994_SYSCLK_FLL2  4
29  
30  /* OPCLK is also configured with set_dai_sysclk, specify division*10 as rate. */
31  #define WM8994_SYSCLK_OPCLK 5
32  
33  #define WM8994_FLL1 1
34  #define WM8994_FLL2 2
35  
36  #define WM8994_FLL_SRC_MCLK1    1
37  #define WM8994_FLL_SRC_MCLK2    2
38  #define WM8994_FLL_SRC_LRCLK    3
39  #define WM8994_FLL_SRC_BCLK     4
40  #define WM8994_FLL_SRC_INTERNAL 5
41  
42  enum wm8994_vmid_mode {
43  	WM8994_VMID_NORMAL,
44  	WM8994_VMID_FORCE,
45  };
46  
47  typedef void (*wm1811_micdet_cb)(void *data);
48  typedef void (*wm1811_mic_id_cb)(void *data, u16 status);
49  
50  int wm8994_mic_detect(struct snd_soc_component *component, struct snd_soc_jack *jack,
51  		      int micbias);
52  int wm8958_mic_detect(struct snd_soc_component *component, struct snd_soc_jack *jack,
53  		      wm1811_micdet_cb det_cb, void *det_cb_data,
54  		      wm1811_mic_id_cb id_cb, void *id_cb_data);
55  
56  int wm8994_vmid_mode(struct snd_soc_component *component, enum wm8994_vmid_mode mode);
57  
58  int wm8958_aif_ev(struct snd_soc_dapm_widget *w,
59  		  struct snd_kcontrol *kcontrol, int event);
60  
61  void wm8958_dsp2_init(struct snd_soc_component *component);
62  
63  struct wm8994_micdet {
64  	struct snd_soc_jack *jack;
65  	bool detecting;
66  };
67  
68  /* codec private data */
69  struct wm8994_fll_config {
70  	int src;
71  	int in;
72  	int out;
73  };
74  
75  #define WM8994_NUM_DRC 3
76  #define WM8994_NUM_EQ  3
77  
78  struct wm8994;
79  
80  struct wm8994_priv {
81  	struct wm_hubs_data hubs;
82  	struct wm8994 *wm8994;
83  	struct clk_bulk_data mclk[WM8994_NUM_MCLK];
84  	int sysclk[2];
85  	int sysclk_rate[2];
86  	int mclk_rate[2];
87  	int aifclk[2];
88  	int aifdiv[2];
89  	int channels[2];
90  	struct wm8994_fll_config fll[2], fll_suspend[2];
91  	struct completion fll_locked[2];
92  	bool fll_locked_irq;
93  	bool fll_byp;
94  	bool clk_has_run;
95  
96  	int vmid_refcount;
97  	int active_refcount;
98  	enum wm8994_vmid_mode vmid_mode;
99  
100  	int dac_rates[2];
101  	int lrclk_shared[2];
102  
103  	int mbc_ena[3];
104  	int hpf1_ena[3];
105  	int hpf2_ena[3];
106  	int vss_ena[3];
107  	int enh_eq_ena[3];
108  
109  	/* Platform dependant DRC configuration */
110  	const char **drc_texts;
111  	int drc_cfg[WM8994_NUM_DRC];
112  	struct soc_enum drc_enum;
113  
114  	/* Platform dependant ReTune mobile configuration */
115  	int num_retune_mobile_texts;
116  	const char **retune_mobile_texts;
117  	int retune_mobile_cfg[WM8994_NUM_EQ];
118  	struct soc_enum retune_mobile_enum;
119  
120  	/* Platform dependant MBC configuration */
121  	int mbc_cfg;
122  	const char **mbc_texts;
123  	struct soc_enum mbc_enum;
124  
125  	/* Platform dependant VSS configuration */
126  	int vss_cfg;
127  	const char **vss_texts;
128  	struct soc_enum vss_enum;
129  
130  	/* Platform dependant VSS HPF configuration */
131  	int vss_hpf_cfg;
132  	const char **vss_hpf_texts;
133  	struct soc_enum vss_hpf_enum;
134  
135  	/* Platform dependant enhanced EQ configuration */
136  	int enh_eq_cfg;
137  	const char **enh_eq_texts;
138  	struct soc_enum enh_eq_enum;
139  
140  	struct mutex accdet_lock;
141  	struct wm8994_micdet micdet[2];
142  	struct delayed_work mic_work;
143  	struct delayed_work open_circuit_work;
144  	struct delayed_work mic_complete_work;
145  	u16 mic_status;
146  	bool mic_detecting;
147  	bool jack_mic;
148  	int btn_mask;
149  	bool jackdet;
150  	int jackdet_mode;
151  	struct delayed_work jackdet_bootstrap;
152  
153  	int micdet_irq;
154  	wm1811_micdet_cb micd_cb;
155  	void *micd_cb_data;
156  	wm1811_mic_id_cb mic_id_cb;
157  	void *mic_id_cb_data;
158  
159  	unsigned int aif1clk_enable:1;
160  	unsigned int aif2clk_enable:1;
161  
162  	unsigned int aif1clk_disable:1;
163  	unsigned int aif2clk_disable:1;
164  
165  	struct mutex fw_lock;
166  	int dsp_active;
167  	const struct firmware *cur_fw;
168  	const struct firmware *mbc;
169  	const struct firmware *mbc_vss;
170  	const struct firmware *enh_eq;
171  };
172  
173  #endif
174