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 | |