xref: /openbmc/linux/sound/soc/codecs/cs42l43-jack.c (revision 4d75f5c664195b970e1cd2fd25b65b5eff257a0a)
1 // SPDX-License-Identifier: GPL-2.0
2 //
3 // CS42L43 CODEC driver jack handling
4 //
5 // Copyright (C) 2022-2023 Cirrus Logic, Inc. and
6 //                         Cirrus Logic International Semiconductor Ltd.
7 
8 #include <linux/build_bug.h>
9 #include <linux/delay.h>
10 #include <linux/errno.h>
11 #include <linux/irq.h>
12 #include <linux/jiffies.h>
13 #include <linux/mfd/cs42l43.h>
14 #include <linux/mfd/cs42l43-regs.h>
15 #include <linux/pm_runtime.h>
16 #include <linux/property.h>
17 #include <sound/control.h>
18 #include <sound/jack.h>
19 #include <sound/pcm.h>
20 #include <sound/pcm_params.h>
21 #include <sound/soc-component.h>
22 #include <sound/soc.h>
23 
24 #include "cs42l43.h"
25 
26 static const unsigned int cs42l43_accdet_us[] = {
27 	20, 100, 1000, 10000, 50000, 75000, 100000, 200000
28 };
29 
30 static const unsigned int cs42l43_accdet_db_ms[] = {
31 	0, 125, 250, 500, 750, 1000, 1250, 1500
32 };
33 
34 static const unsigned int cs42l43_accdet_ramp_ms[] = { 10, 40, 90, 170 };
35 
36 static const unsigned int cs42l43_accdet_bias_sense[] = {
37 	14, 24, 43, 52, 61, 71, 90, 99, 0,
38 };
39 
cs42l43_find_index(struct cs42l43_codec * priv,const char * const prop,unsigned int defval,unsigned int * val,const unsigned int * values,const int nvalues)40 static int cs42l43_find_index(struct cs42l43_codec *priv, const char * const prop,
41 			      unsigned int defval, unsigned int *val,
42 			      const unsigned int *values, const int nvalues)
43 {
44 	struct cs42l43 *cs42l43 = priv->core;
45 	int i, ret;
46 
47 	ret = device_property_read_u32(cs42l43->dev, prop, &defval);
48 	if (ret != -EINVAL && ret < 0) {
49 		dev_err(priv->dev, "Property %s malformed: %d\n", prop, ret);
50 		return ret;
51 	}
52 
53 	if (val)
54 		*val = defval;
55 
56 	for (i = 0; i < nvalues; i++)
57 		if (defval == values[i])
58 			return i;
59 
60 	dev_err(priv->dev, "Invalid value for property %s: %d\n", prop, defval);
61 	return -EINVAL;
62 }
63 
cs42l43_set_jack(struct snd_soc_component * component,struct snd_soc_jack * jack,void * d)64 int cs42l43_set_jack(struct snd_soc_component *component,
65 		     struct snd_soc_jack *jack, void *d)
66 {
67 	struct cs42l43_codec *priv = snd_soc_component_get_drvdata(component);
68 	struct cs42l43 *cs42l43 = priv->core;
69 	/* This tip sense invert is always set, HW wants an inverted signal */
70 	unsigned int tip_deb = CS42L43_TIPSENSE_INV_MASK;
71 	unsigned int hs2 = 0x2 << CS42L43_HSDET_MODE_SHIFT;
72 	unsigned int autocontrol = 0, pdncntl = 0;
73 	int ret;
74 
75 	dev_dbg(priv->dev, "Configure accessory detect\n");
76 
77 	ret = pm_runtime_resume_and_get(priv->dev);
78 	if (ret) {
79 		dev_err(priv->dev, "Failed to resume for jack config: %d\n", ret);
80 		return ret;
81 	}
82 
83 	mutex_lock(&priv->jack_lock);
84 
85 	priv->jack_hp = jack;
86 
87 	if (!jack)
88 		goto done;
89 
90 	ret = device_property_count_u32(cs42l43->dev, "cirrus,buttons-ohms");
91 	if (ret != -EINVAL) {
92 		if (ret < 0) {
93 			dev_err(priv->dev, "Property cirrus,buttons-ohms malformed: %d\n",
94 				ret);
95 			goto error;
96 		}
97 
98 		if (ret > CS42L43_N_BUTTONS) {
99 			ret = -EINVAL;
100 			dev_err(priv->dev, "Property cirrus,buttons-ohms too many entries\n");
101 			goto error;
102 		}
103 
104 		device_property_read_u32_array(cs42l43->dev, "cirrus,buttons-ohms",
105 					       priv->buttons, ret);
106 	} else {
107 		priv->buttons[0] = 70;
108 		priv->buttons[1] = 185;
109 		priv->buttons[2] = 355;
110 		priv->buttons[3] = 735;
111 	}
112 
113 	ret = cs42l43_find_index(priv, "cirrus,detect-us", 10000, &priv->detect_us,
114 				 cs42l43_accdet_us, ARRAY_SIZE(cs42l43_accdet_us));
115 	if (ret < 0)
116 		goto error;
117 
118 	hs2 |= ret << CS42L43_AUTO_HSDET_TIME_SHIFT;
119 
120 	priv->bias_low = device_property_read_bool(cs42l43->dev, "cirrus,bias-low");
121 
122 	ret = cs42l43_find_index(priv, "cirrus,bias-ramp-ms", 170,
123 				 &priv->bias_ramp_ms, cs42l43_accdet_ramp_ms,
124 				 ARRAY_SIZE(cs42l43_accdet_ramp_ms));
125 	if (ret < 0)
126 		goto error;
127 
128 	hs2 |= ret << CS42L43_HSBIAS_RAMP_SHIFT;
129 
130 	ret = cs42l43_find_index(priv, "cirrus,bias-sense-microamp", 0,
131 				 &priv->bias_sense_ua, cs42l43_accdet_bias_sense,
132 				 ARRAY_SIZE(cs42l43_accdet_bias_sense));
133 	if (ret < 0)
134 		goto error;
135 
136 	if (priv->bias_sense_ua)
137 		autocontrol |= ret << CS42L43_HSBIAS_SENSE_TRIP_SHIFT;
138 
139 	if (!device_property_read_bool(cs42l43->dev, "cirrus,button-automute"))
140 		autocontrol |= CS42L43_S0_AUTO_ADCMUTE_DISABLE_MASK;
141 
142 	ret = device_property_read_u32(cs42l43->dev, "cirrus,tip-debounce-ms",
143 				       &priv->tip_debounce_ms);
144 	if (ret < 0 && ret != -EINVAL) {
145 		dev_err(priv->dev, "Property cirrus,tip-debounce-ms malformed: %d\n", ret);
146 		goto error;
147 	}
148 
149 	/* This tip sense invert is set normally, as TIPSENSE_INV already inverted */
150 	if (device_property_read_bool(cs42l43->dev, "cirrus,tip-invert"))
151 		autocontrol |= 0x1 << CS42L43_JACKDET_INV_SHIFT;
152 
153 	if (device_property_read_bool(cs42l43->dev, "cirrus,tip-disable-pullup"))
154 		autocontrol |= 0x1 << CS42L43_JACKDET_MODE_SHIFT;
155 	else
156 		autocontrol |= 0x3 << CS42L43_JACKDET_MODE_SHIFT;
157 
158 	ret = cs42l43_find_index(priv, "cirrus,tip-fall-db-ms", 500,
159 				 NULL, cs42l43_accdet_db_ms,
160 				 ARRAY_SIZE(cs42l43_accdet_db_ms));
161 	if (ret < 0)
162 		goto error;
163 
164 	tip_deb |= ret << CS42L43_TIPSENSE_FALLING_DB_TIME_SHIFT;
165 
166 	ret = cs42l43_find_index(priv, "cirrus,tip-rise-db-ms", 500,
167 				 NULL, cs42l43_accdet_db_ms,
168 				 ARRAY_SIZE(cs42l43_accdet_db_ms));
169 	if (ret < 0)
170 		goto error;
171 
172 	tip_deb |= ret << CS42L43_TIPSENSE_RISING_DB_TIME_SHIFT;
173 
174 	if (device_property_read_bool(cs42l43->dev, "cirrus,use-ring-sense")) {
175 		unsigned int ring_deb = 0;
176 
177 		priv->use_ring_sense = true;
178 
179 		/* HW wants an inverted signal, so invert the invert */
180 		if (!device_property_read_bool(cs42l43->dev, "cirrus,ring-invert"))
181 			ring_deb |= CS42L43_RINGSENSE_INV_MASK;
182 
183 		if (!device_property_read_bool(cs42l43->dev,
184 					       "cirrus,ring-disable-pullup"))
185 			ring_deb |= CS42L43_RINGSENSE_PULLUP_PDNB_MASK;
186 
187 		ret = cs42l43_find_index(priv, "cirrus,ring-fall-db-ms", 500,
188 					 NULL, cs42l43_accdet_db_ms,
189 					 ARRAY_SIZE(cs42l43_accdet_db_ms));
190 		if (ret < 0)
191 			goto error;
192 
193 		ring_deb |= ret << CS42L43_RINGSENSE_FALLING_DB_TIME_SHIFT;
194 
195 		ret = cs42l43_find_index(priv, "cirrus,ring-rise-db-ms", 500,
196 					 NULL, cs42l43_accdet_db_ms,
197 					 ARRAY_SIZE(cs42l43_accdet_db_ms));
198 		if (ret < 0)
199 			goto error;
200 
201 		ring_deb |= ret << CS42L43_RINGSENSE_RISING_DB_TIME_SHIFT;
202 		pdncntl |= CS42L43_RING_SENSE_EN_MASK;
203 
204 		regmap_update_bits(cs42l43->regmap, CS42L43_RINGSENSE_DEB_CTRL,
205 				   CS42L43_RINGSENSE_INV_MASK |
206 				   CS42L43_RINGSENSE_PULLUP_PDNB_MASK |
207 				   CS42L43_RINGSENSE_FALLING_DB_TIME_MASK |
208 				   CS42L43_RINGSENSE_RISING_DB_TIME_MASK,
209 				   ring_deb);
210 	}
211 
212 	regmap_update_bits(cs42l43->regmap, CS42L43_TIPSENSE_DEB_CTRL,
213 			   CS42L43_TIPSENSE_INV_MASK |
214 			   CS42L43_TIPSENSE_FALLING_DB_TIME_MASK |
215 			   CS42L43_TIPSENSE_RISING_DB_TIME_MASK, tip_deb);
216 	regmap_update_bits(cs42l43->regmap, CS42L43_HS2,
217 			   CS42L43_HSBIAS_RAMP_MASK | CS42L43_HSDET_MODE_MASK |
218 			   CS42L43_AUTO_HSDET_TIME_MASK, hs2);
219 
220 done:
221 	ret = 0;
222 
223 	regmap_update_bits(cs42l43->regmap, CS42L43_HS_BIAS_SENSE_AND_CLAMP_AUTOCONTROL,
224 			   CS42L43_JACKDET_MODE_MASK | CS42L43_S0_AUTO_ADCMUTE_DISABLE_MASK |
225 			   CS42L43_HSBIAS_SENSE_TRIP_MASK, autocontrol);
226 	regmap_update_bits(cs42l43->regmap, CS42L43_PDNCNTL,
227 			   CS42L43_RING_SENSE_EN_MASK, pdncntl);
228 
229 	dev_dbg(priv->dev, "Successfully configured accessory detect\n");
230 
231 error:
232 	mutex_unlock(&priv->jack_lock);
233 
234 	pm_runtime_mark_last_busy(priv->dev);
235 	pm_runtime_put_autosuspend(priv->dev);
236 
237 	return ret;
238 }
239 
cs42l43_start_hs_bias(struct cs42l43_codec * priv,bool force_high)240 static void cs42l43_start_hs_bias(struct cs42l43_codec *priv, bool force_high)
241 {
242 	struct cs42l43 *cs42l43 = priv->core;
243 	unsigned int val = 0x3 << CS42L43_HSBIAS_MODE_SHIFT;
244 
245 	dev_dbg(priv->dev, "Start headset bias\n");
246 
247 	regmap_update_bits(cs42l43->regmap, CS42L43_HS2,
248 			   CS42L43_HS_CLAMP_DISABLE_MASK, CS42L43_HS_CLAMP_DISABLE_MASK);
249 
250 	if (!force_high && priv->bias_low)
251 		val = 0x2 << CS42L43_HSBIAS_MODE_SHIFT;
252 
253 	regmap_update_bits(cs42l43->regmap, CS42L43_MIC_DETECT_CONTROL_1,
254 			   CS42L43_HSBIAS_MODE_MASK, val);
255 
256 	msleep(priv->bias_ramp_ms);
257 }
258 
cs42l43_stop_hs_bias(struct cs42l43_codec * priv)259 static void cs42l43_stop_hs_bias(struct cs42l43_codec *priv)
260 {
261 	struct cs42l43 *cs42l43 = priv->core;
262 
263 	dev_dbg(priv->dev, "Stop headset bias\n");
264 
265 	regmap_update_bits(cs42l43->regmap, CS42L43_MIC_DETECT_CONTROL_1,
266 			   CS42L43_HSBIAS_MODE_MASK, 0x1 << CS42L43_HSBIAS_MODE_SHIFT);
267 
268 	regmap_update_bits(cs42l43->regmap, CS42L43_HS2,
269 			   CS42L43_HS_CLAMP_DISABLE_MASK, 0);
270 }
271 
cs42l43_bias_detect_clamp(int irq,void * data)272 irqreturn_t cs42l43_bias_detect_clamp(int irq, void *data)
273 {
274 	struct cs42l43_codec *priv = data;
275 
276 	queue_delayed_work(system_wq, &priv->bias_sense_timeout,
277 			   msecs_to_jiffies(250));
278 
279 	return IRQ_HANDLED;
280 }
281 
282 #define CS42L43_JACK_PRESENT 0x3
283 #define CS42L43_JACK_ABSENT 0x0
284 
285 #define CS42L43_JACK_OPTICAL (SND_JACK_MECHANICAL | SND_JACK_AVOUT)
286 #define CS42L43_JACK_HEADPHONE (SND_JACK_MECHANICAL | SND_JACK_HEADPHONE)
287 #define CS42L43_JACK_HEADSET (SND_JACK_MECHANICAL | SND_JACK_HEADSET)
288 #define CS42L43_JACK_LINEOUT (SND_JACK_MECHANICAL | SND_JACK_LINEOUT)
289 #define CS42L43_JACK_LINEIN (SND_JACK_MECHANICAL | SND_JACK_LINEIN)
290 #define CS42L43_JACK_EXTENSION (SND_JACK_MECHANICAL)
291 #define CS42L43_JACK_BUTTONS (SND_JACK_BTN_0 | SND_JACK_BTN_1 | SND_JACK_BTN_2 | \
292 			      SND_JACK_BTN_3 | SND_JACK_BTN_4 | SND_JACK_BTN_5)
293 
cs42l43_jack_present(struct cs42l43_codec * priv)294 static inline bool cs42l43_jack_present(struct cs42l43_codec *priv)
295 {
296 	struct cs42l43 *cs42l43 = priv->core;
297 	unsigned int sts = 0;
298 
299 	regmap_read(cs42l43->regmap, CS42L43_TIP_RING_SENSE_INTERRUPT_STATUS, &sts);
300 
301 	sts = (sts >> CS42L43_TIPSENSE_PLUG_DB_STS_SHIFT) & CS42L43_JACK_PRESENT;
302 
303 	return sts == CS42L43_JACK_PRESENT;
304 }
305 
cs42l43_start_button_detect(struct cs42l43_codec * priv)306 static void cs42l43_start_button_detect(struct cs42l43_codec *priv)
307 {
308 	struct cs42l43 *cs42l43 = priv->core;
309 	unsigned int val = 0x3 << CS42L43_BUTTON_DETECT_MODE_SHIFT;
310 
311 	dev_dbg(priv->dev, "Start button detect\n");
312 
313 	priv->button_detect_running = true;
314 
315 	if (priv->bias_low)
316 		val = 0x1 << CS42L43_BUTTON_DETECT_MODE_SHIFT;
317 
318 	regmap_update_bits(cs42l43->regmap, CS42L43_MIC_DETECT_CONTROL_1,
319 			   CS42L43_BUTTON_DETECT_MODE_MASK |
320 			   CS42L43_MIC_LVL_DET_DISABLE_MASK, val);
321 
322 	if (priv->bias_sense_ua) {
323 		regmap_update_bits(cs42l43->regmap,
324 				   CS42L43_HS_BIAS_SENSE_AND_CLAMP_AUTOCONTROL,
325 				   CS42L43_HSBIAS_SENSE_EN_MASK |
326 				   CS42L43_AUTO_HSBIAS_CLAMP_EN_MASK,
327 				   CS42L43_HSBIAS_SENSE_EN_MASK |
328 				   CS42L43_AUTO_HSBIAS_CLAMP_EN_MASK);
329 	}
330 }
331 
cs42l43_stop_button_detect(struct cs42l43_codec * priv)332 static void cs42l43_stop_button_detect(struct cs42l43_codec *priv)
333 {
334 	struct cs42l43 *cs42l43 = priv->core;
335 
336 	dev_dbg(priv->dev, "Stop button detect\n");
337 
338 	if (priv->bias_sense_ua) {
339 		regmap_update_bits(cs42l43->regmap,
340 				   CS42L43_HS_BIAS_SENSE_AND_CLAMP_AUTOCONTROL,
341 				   CS42L43_HSBIAS_SENSE_EN_MASK |
342 				   CS42L43_AUTO_HSBIAS_CLAMP_EN_MASK, 0);
343 	}
344 
345 	regmap_update_bits(cs42l43->regmap, CS42L43_MIC_DETECT_CONTROL_1,
346 			   CS42L43_BUTTON_DETECT_MODE_MASK |
347 			   CS42L43_MIC_LVL_DET_DISABLE_MASK,
348 			   CS42L43_MIC_LVL_DET_DISABLE_MASK);
349 
350 	priv->button_detect_running = false;
351 }
352 
353 #define CS42L43_BUTTON_COMB_MAX 512
354 #define CS42L43_BUTTON_ROUT 2210
355 
cs42l43_button_press_work(struct work_struct * work)356 void cs42l43_button_press_work(struct work_struct *work)
357 {
358 	struct cs42l43_codec *priv = container_of(work, struct cs42l43_codec,
359 						  button_press_work.work);
360 	struct cs42l43 *cs42l43 = priv->core;
361 	unsigned int buttons = 0;
362 	unsigned int val = 0;
363 	int i, ret;
364 
365 	ret = pm_runtime_resume_and_get(priv->dev);
366 	if (ret) {
367 		dev_err(priv->dev, "Failed to resume for button press: %d\n", ret);
368 		return;
369 	}
370 
371 	mutex_lock(&priv->jack_lock);
372 
373 	if (!priv->button_detect_running) {
374 		dev_dbg(priv->dev, "Spurious button press IRQ\n");
375 		goto error;
376 	}
377 
378 	regmap_read(cs42l43->regmap, CS42L43_DETECT_STATUS_1, &val);
379 
380 	/* Bail if jack removed, the button is irrelevant and likely invalid */
381 	if (!cs42l43_jack_present(priv)) {
382 		dev_dbg(priv->dev, "Button ignored due to removal\n");
383 		goto error;
384 	}
385 
386 	if (val & CS42L43_HSBIAS_CLAMP_STS_MASK) {
387 		dev_dbg(priv->dev, "Button ignored due to bias sense\n");
388 		goto error;
389 	}
390 
391 	val = (val & CS42L43_HSDET_DC_STS_MASK) >> CS42L43_HSDET_DC_STS_SHIFT;
392 	val = ((CS42L43_BUTTON_COMB_MAX << 20) / (val + 1)) - (1 << 20);
393 	if (val)
394 		val = (CS42L43_BUTTON_ROUT << 20) / val;
395 	else
396 		val = UINT_MAX;
397 
398 	for (i = 0; i < CS42L43_N_BUTTONS; i++) {
399 		if (val < priv->buttons[i]) {
400 			buttons = SND_JACK_BTN_0 >> i;
401 			dev_dbg(priv->dev, "Detected button %d at %d Ohms\n", i, val);
402 			break;
403 		}
404 	}
405 
406 	if (!buttons)
407 		dev_dbg(priv->dev, "Unrecognised button: %d Ohms\n", val);
408 
409 	snd_soc_jack_report(priv->jack_hp, buttons, CS42L43_JACK_BUTTONS);
410 
411 error:
412 	mutex_unlock(&priv->jack_lock);
413 
414 	pm_runtime_mark_last_busy(priv->dev);
415 	pm_runtime_put_autosuspend(priv->dev);
416 }
417 
cs42l43_button_press(int irq,void * data)418 irqreturn_t cs42l43_button_press(int irq, void *data)
419 {
420 	struct cs42l43_codec *priv = data;
421 
422 	// Wait for 2 full cycles of comb filter to ensure good reading
423 	queue_delayed_work(system_wq, &priv->button_press_work,
424 			   msecs_to_jiffies(10));
425 
426 	return IRQ_HANDLED;
427 }
428 
cs42l43_button_release_work(struct work_struct * work)429 void cs42l43_button_release_work(struct work_struct *work)
430 {
431 	struct cs42l43_codec *priv = container_of(work, struct cs42l43_codec,
432 						  button_release_work);
433 	int ret;
434 
435 	ret = pm_runtime_resume_and_get(priv->dev);
436 	if (ret) {
437 		dev_err(priv->dev, "Failed to resume for button release: %d\n", ret);
438 		return;
439 	}
440 
441 	mutex_lock(&priv->jack_lock);
442 
443 	if (priv->button_detect_running) {
444 		dev_dbg(priv->dev, "Button release IRQ\n");
445 
446 		snd_soc_jack_report(priv->jack_hp, 0, CS42L43_JACK_BUTTONS);
447 	} else {
448 		dev_dbg(priv->dev, "Spurious button release IRQ\n");
449 	}
450 
451 	mutex_unlock(&priv->jack_lock);
452 
453 	pm_runtime_mark_last_busy(priv->dev);
454 	pm_runtime_put_autosuspend(priv->dev);
455 }
456 
cs42l43_button_release(int irq,void * data)457 irqreturn_t cs42l43_button_release(int irq, void *data)
458 {
459 	struct cs42l43_codec *priv = data;
460 
461 	queue_work(system_wq, &priv->button_release_work);
462 
463 	return IRQ_HANDLED;
464 }
465 
cs42l43_bias_sense_timeout(struct work_struct * work)466 void cs42l43_bias_sense_timeout(struct work_struct *work)
467 {
468 	struct cs42l43_codec *priv = container_of(work, struct cs42l43_codec,
469 						  bias_sense_timeout.work);
470 	struct cs42l43 *cs42l43 = priv->core;
471 	int ret;
472 
473 	ret = pm_runtime_resume_and_get(priv->dev);
474 	if (ret) {
475 		dev_err(priv->dev, "Failed to resume for bias sense: %d\n", ret);
476 		return;
477 	}
478 
479 	mutex_lock(&priv->jack_lock);
480 
481 	if (cs42l43_jack_present(priv) && priv->button_detect_running) {
482 		dev_dbg(priv->dev, "Bias sense timeout out, restore bias\n");
483 
484 		regmap_update_bits(cs42l43->regmap,
485 				   CS42L43_HS_BIAS_SENSE_AND_CLAMP_AUTOCONTROL,
486 				   CS42L43_AUTO_HSBIAS_CLAMP_EN_MASK, 0);
487 		regmap_update_bits(cs42l43->regmap,
488 				   CS42L43_HS_BIAS_SENSE_AND_CLAMP_AUTOCONTROL,
489 				   CS42L43_AUTO_HSBIAS_CLAMP_EN_MASK,
490 				   CS42L43_AUTO_HSBIAS_CLAMP_EN_MASK);
491 	}
492 
493 	mutex_unlock(&priv->jack_lock);
494 
495 	pm_runtime_mark_last_busy(priv->dev);
496 	pm_runtime_put_autosuspend(priv->dev);
497 }
498 
cs42l43_start_load_detect(struct cs42l43_codec * priv)499 static void cs42l43_start_load_detect(struct cs42l43_codec *priv)
500 {
501 	struct cs42l43 *cs42l43 = priv->core;
502 
503 	dev_dbg(priv->dev, "Start load detect\n");
504 
505 	snd_soc_dapm_mutex_lock(snd_soc_component_get_dapm(priv->component));
506 
507 	priv->load_detect_running = true;
508 
509 	if (priv->hp_ena) {
510 		unsigned long time_left;
511 
512 		reinit_completion(&priv->hp_shutdown);
513 
514 		regmap_update_bits(cs42l43->regmap, CS42L43_BLOCK_EN8,
515 				   CS42L43_HP_EN_MASK, 0);
516 
517 		time_left = wait_for_completion_timeout(&priv->hp_shutdown,
518 							msecs_to_jiffies(CS42L43_HP_TIMEOUT_MS));
519 		if (!time_left)
520 			dev_err(priv->dev, "Load detect HP power down timed out\n");
521 	}
522 
523 	regmap_update_bits(cs42l43->regmap, CS42L43_BLOCK_EN3,
524 			   CS42L43_ADC1_EN_MASK | CS42L43_ADC2_EN_MASK, 0);
525 	regmap_update_bits(cs42l43->regmap, CS42L43_DACCNFG2, CS42L43_HP_HPF_EN_MASK, 0);
526 	regmap_update_bits(cs42l43->regmap, CS42L43_MIC_DETECT_CONTROL_1,
527 			   CS42L43_HSBIAS_MODE_MASK, 0);
528 	regmap_update_bits(cs42l43->regmap, CS42L43_CTRL,
529 			   CS42L43_ADPTPWR_MODE_MASK, 0x4 << CS42L43_ADPTPWR_MODE_SHIFT);
530 	regmap_update_bits(cs42l43->regmap, CS42L43_PGAVOL,
531 			   CS42L43_HP_DIG_VOL_RAMP_MASK | CS42L43_HP_ANA_VOL_RAMP_MASK, 0x6);
532 	regmap_update_bits(cs42l43->regmap, CS42L43_DACCNFG1,
533 			   CS42L43_HP_MSTR_VOL_CTRL_EN_MASK, 0);
534 
535 	regmap_update_bits(cs42l43->regmap, CS42L43_HS2,
536 			   CS42L43_HS_CLAMP_DISABLE_MASK, CS42L43_HS_CLAMP_DISABLE_MASK);
537 
538 	regmap_update_bits(cs42l43->regmap, CS42L43_LOADDETENA,
539 			   CS42L43_HPLOAD_DET_EN_MASK,
540 			   CS42L43_HPLOAD_DET_EN_MASK);
541 
542 	snd_soc_dapm_mutex_unlock(snd_soc_component_get_dapm(priv->component));
543 }
544 
cs42l43_stop_load_detect(struct cs42l43_codec * priv)545 static void cs42l43_stop_load_detect(struct cs42l43_codec *priv)
546 {
547 	struct cs42l43 *cs42l43 = priv->core;
548 
549 	dev_dbg(priv->dev, "Stop load detect\n");
550 
551 	snd_soc_dapm_mutex_lock(snd_soc_component_get_dapm(priv->component));
552 
553 	regmap_update_bits(cs42l43->regmap, CS42L43_LOADDETENA,
554 			   CS42L43_HPLOAD_DET_EN_MASK, 0);
555 	regmap_update_bits(cs42l43->regmap, CS42L43_HS2,
556 			   CS42L43_HS_CLAMP_DISABLE_MASK, 0);
557 	regmap_update_bits(cs42l43->regmap, CS42L43_DACCNFG1,
558 			   CS42L43_HP_MSTR_VOL_CTRL_EN_MASK,
559 			   CS42L43_HP_MSTR_VOL_CTRL_EN_MASK);
560 	regmap_update_bits(cs42l43->regmap, CS42L43_PGAVOL,
561 			   CS42L43_HP_DIG_VOL_RAMP_MASK | CS42L43_HP_ANA_VOL_RAMP_MASK,
562 			   0x4 << CS42L43_HP_DIG_VOL_RAMP_SHIFT);
563 	regmap_update_bits(cs42l43->regmap, CS42L43_CTRL,
564 			   CS42L43_ADPTPWR_MODE_MASK, 0x7 << CS42L43_ADPTPWR_MODE_SHIFT);
565 	regmap_update_bits(cs42l43->regmap, CS42L43_MIC_DETECT_CONTROL_1,
566 			   CS42L43_HSBIAS_MODE_MASK, 0x1 << CS42L43_HSBIAS_MODE_SHIFT);
567 	regmap_update_bits(cs42l43->regmap, CS42L43_DACCNFG2,
568 			   CS42L43_HP_HPF_EN_MASK, CS42L43_HP_HPF_EN_MASK);
569 
570 	regmap_update_bits(cs42l43->regmap, CS42L43_BLOCK_EN3,
571 			   CS42L43_ADC1_EN_MASK | CS42L43_ADC2_EN_MASK,
572 			   priv->adc_ena);
573 
574 	if (priv->hp_ena) {
575 		unsigned long time_left;
576 
577 		reinit_completion(&priv->hp_startup);
578 
579 		regmap_update_bits(cs42l43->regmap, CS42L43_BLOCK_EN8,
580 				   CS42L43_HP_EN_MASK, priv->hp_ena);
581 
582 		time_left = wait_for_completion_timeout(&priv->hp_startup,
583 							msecs_to_jiffies(CS42L43_HP_TIMEOUT_MS));
584 		if (!time_left)
585 			dev_err(priv->dev, "Load detect HP restore timed out\n");
586 	}
587 
588 	priv->load_detect_running = false;
589 
590 	snd_soc_dapm_mutex_unlock(snd_soc_component_get_dapm(priv->component));
591 }
592 
cs42l43_run_load_detect(struct cs42l43_codec * priv,bool mic)593 static int cs42l43_run_load_detect(struct cs42l43_codec *priv, bool mic)
594 {
595 	struct cs42l43 *cs42l43 = priv->core;
596 	unsigned int val = 0;
597 	unsigned long time_left;
598 
599 	reinit_completion(&priv->load_detect);
600 
601 	cs42l43_start_load_detect(priv);
602 	time_left = wait_for_completion_timeout(&priv->load_detect,
603 						msecs_to_jiffies(CS42L43_LOAD_TIMEOUT_MS));
604 	cs42l43_stop_load_detect(priv);
605 
606 	if (!time_left)
607 		return -ETIMEDOUT;
608 
609 	regmap_read(cs42l43->regmap, CS42L43_LOADDETRESULTS, &val);
610 
611 	dev_dbg(priv->dev, "Headphone load detect: 0x%x\n", val);
612 
613 	/* Bail if jack removed, the load is irrelevant and likely invalid */
614 	if (!cs42l43_jack_present(priv))
615 		return -ENODEV;
616 
617 	if (mic) {
618 		cs42l43_start_hs_bias(priv, false);
619 		cs42l43_start_button_detect(priv);
620 
621 		return CS42L43_JACK_HEADSET;
622 	}
623 
624 	switch (val & CS42L43_AMP3_RES_DET_MASK) {
625 	case 0x0: // low impedance
626 	case 0x1: // high impedance
627 		return CS42L43_JACK_HEADPHONE;
628 	case 0x2: // lineout
629 	case 0x3: // Open circuit
630 		return CS42L43_JACK_LINEOUT;
631 	default:
632 		return -EINVAL;
633 	}
634 }
635 
cs42l43_run_type_detect(struct cs42l43_codec * priv)636 static int cs42l43_run_type_detect(struct cs42l43_codec *priv)
637 {
638 	struct cs42l43 *cs42l43 = priv->core;
639 	int timeout_ms = ((2 * priv->detect_us) / 1000) + 200;
640 	unsigned int type = 0xff;
641 	unsigned long time_left;
642 
643 	reinit_completion(&priv->type_detect);
644 
645 	regmap_update_bits(cs42l43->regmap, CS42L43_STEREO_MIC_CLAMP_CTRL,
646 			   CS42L43_SMIC_HPAMP_CLAMP_DIS_FRC_VAL_MASK,
647 			   CS42L43_SMIC_HPAMP_CLAMP_DIS_FRC_VAL_MASK);
648 
649 	cs42l43_start_hs_bias(priv, true);
650 	regmap_update_bits(cs42l43->regmap, CS42L43_HS2,
651 			   CS42L43_HSDET_MODE_MASK, 0x3 << CS42L43_HSDET_MODE_SHIFT);
652 
653 	time_left = wait_for_completion_timeout(&priv->type_detect,
654 						msecs_to_jiffies(timeout_ms));
655 
656 	regmap_update_bits(cs42l43->regmap, CS42L43_HS2,
657 			   CS42L43_HSDET_MODE_MASK, 0x2 << CS42L43_HSDET_MODE_SHIFT);
658 	cs42l43_stop_hs_bias(priv);
659 
660 	regmap_update_bits(cs42l43->regmap, CS42L43_STEREO_MIC_CLAMP_CTRL,
661 			   CS42L43_SMIC_HPAMP_CLAMP_DIS_FRC_VAL_MASK, 0);
662 
663 	if (!time_left)
664 		return -ETIMEDOUT;
665 
666 	regmap_read(cs42l43->regmap, CS42L43_HS_STAT, &type);
667 
668 	dev_dbg(priv->dev, "Type detect: 0x%x\n", type);
669 
670 	/* Bail if jack removed, the type is irrelevant and likely invalid */
671 	if (!cs42l43_jack_present(priv))
672 		return -ENODEV;
673 
674 	switch (type & CS42L43_HSDET_TYPE_STS_MASK) {
675 	case 0x0: // CTIA
676 	case 0x1: // OMTP
677 		return cs42l43_run_load_detect(priv, true);
678 	case 0x2: // 3-pole
679 		return cs42l43_run_load_detect(priv, false);
680 	case 0x3: // Open-circuit
681 		return CS42L43_JACK_EXTENSION;
682 	default:
683 		return -EINVAL;
684 	}
685 }
686 
cs42l43_clear_jack(struct cs42l43_codec * priv)687 static void cs42l43_clear_jack(struct cs42l43_codec *priv)
688 {
689 	struct cs42l43 *cs42l43 = priv->core;
690 
691 	cs42l43_stop_button_detect(priv);
692 	cs42l43_stop_hs_bias(priv);
693 
694 	regmap_update_bits(cs42l43->regmap, CS42L43_ADC_B_CTRL1,
695 			   CS42L43_PGA_WIDESWING_MODE_EN_MASK, 0);
696 	regmap_update_bits(cs42l43->regmap, CS42L43_ADC_B_CTRL2,
697 			   CS42L43_PGA_WIDESWING_MODE_EN_MASK, 0);
698 	regmap_update_bits(cs42l43->regmap, CS42L43_STEREO_MIC_CTRL,
699 			   CS42L43_JACK_STEREO_CONFIG_MASK, 0);
700 	regmap_update_bits(cs42l43->regmap, CS42L43_STEREO_MIC_CLAMP_CTRL,
701 			   CS42L43_SMIC_HPAMP_CLAMP_DIS_FRC_MASK,
702 			   CS42L43_SMIC_HPAMP_CLAMP_DIS_FRC_MASK);
703 	regmap_update_bits(cs42l43->regmap, CS42L43_HS2,
704 			   CS42L43_HSDET_MODE_MASK | CS42L43_HSDET_MANUAL_MODE_MASK,
705 			   0x2 << CS42L43_HSDET_MODE_SHIFT);
706 
707 	snd_soc_jack_report(priv->jack_hp, 0, 0xFFFF);
708 }
709 
cs42l43_tip_sense_work(struct work_struct * work)710 void cs42l43_tip_sense_work(struct work_struct *work)
711 {
712 	struct cs42l43_codec *priv = container_of(work, struct cs42l43_codec,
713 						  tip_sense_work.work);
714 	struct cs42l43 *cs42l43 = priv->core;
715 	unsigned int sts = 0;
716 	unsigned int tip, ring;
717 	int ret, report;
718 
719 	ret = pm_runtime_resume_and_get(priv->dev);
720 	if (ret) {
721 		dev_err(priv->dev, "Failed to resume for tip work: %d\n", ret);
722 		return;
723 	}
724 
725 	mutex_lock(&priv->jack_lock);
726 
727 	regmap_read(cs42l43->regmap, CS42L43_TIP_RING_SENSE_INTERRUPT_STATUS, &sts);
728 
729 	dev_dbg(priv->dev, "Tip sense: 0x%x\n", sts);
730 
731 	tip = (sts >> CS42L43_TIPSENSE_PLUG_DB_STS_SHIFT) & CS42L43_JACK_PRESENT;
732 	ring = (sts >> CS42L43_RINGSENSE_PLUG_DB_STS_SHIFT) & CS42L43_JACK_PRESENT;
733 
734 	if (tip == CS42L43_JACK_PRESENT) {
735 		if (cs42l43->sdw && !priv->jack_present) {
736 			priv->jack_present = true;
737 			pm_runtime_get(priv->dev);
738 		}
739 
740 		if (priv->use_ring_sense && ring == CS42L43_JACK_ABSENT) {
741 			report = CS42L43_JACK_OPTICAL;
742 		} else {
743 			report = cs42l43_run_type_detect(priv);
744 			if (report < 0) {
745 				dev_err(priv->dev, "Jack detect failed: %d\n", report);
746 				goto error;
747 			}
748 		}
749 
750 		snd_soc_jack_report(priv->jack_hp, report, report);
751 	} else {
752 		priv->jack_override = 0;
753 
754 		cs42l43_clear_jack(priv);
755 
756 		if (cs42l43->sdw && priv->jack_present) {
757 			pm_runtime_put(priv->dev);
758 			priv->jack_present = false;
759 		}
760 	}
761 
762 error:
763 	mutex_unlock(&priv->jack_lock);
764 
765 	pm_runtime_mark_last_busy(priv->dev);
766 	pm_runtime_put_autosuspend(priv->dev);
767 }
768 
cs42l43_tip_sense(int irq,void * data)769 irqreturn_t cs42l43_tip_sense(int irq, void *data)
770 {
771 	struct cs42l43_codec *priv = data;
772 
773 	cancel_delayed_work(&priv->bias_sense_timeout);
774 	cancel_delayed_work(&priv->tip_sense_work);
775 	cancel_delayed_work(&priv->button_press_work);
776 	cancel_work(&priv->button_release_work);
777 
778 	queue_delayed_work(system_long_wq, &priv->tip_sense_work,
779 			   msecs_to_jiffies(priv->tip_debounce_ms));
780 
781 	return IRQ_HANDLED;
782 }
783 
784 enum cs42l43_raw_jack {
785 	CS42L43_JACK_RAW_CTIA = 0,
786 	CS42L43_JACK_RAW_OMTP,
787 	CS42L43_JACK_RAW_HEADPHONE,
788 	CS42L43_JACK_RAW_LINE_OUT,
789 	CS42L43_JACK_RAW_LINE_IN,
790 	CS42L43_JACK_RAW_MICROPHONE,
791 	CS42L43_JACK_RAW_OPTICAL,
792 };
793 
794 #define CS42L43_JACK_3_POLE_SWITCHES ((0x2 << CS42L43_HSDET_MANUAL_MODE_SHIFT) | \
795 				      CS42L43_AMP3_4_GNDREF_HS3_SEL_MASK | \
796 				      CS42L43_AMP3_4_GNDREF_HS4_SEL_MASK | \
797 				      CS42L43_HSBIAS_GNDREF_HS3_SEL_MASK | \
798 				      CS42L43_HSBIAS_GNDREF_HS4_SEL_MASK | \
799 				      CS42L43_HSGND_HS3_SEL_MASK | \
800 				      CS42L43_HSGND_HS4_SEL_MASK)
801 
802 static const struct cs42l43_jack_override_mode {
803 	unsigned int hsdet_mode;
804 	unsigned int mic_ctrl;
805 	unsigned int clamp_ctrl;
806 	int report;
807 } cs42l43_jack_override_modes[] = {
808 	[CS42L43_JACK_RAW_CTIA] = {
809 		.hsdet_mode = CS42L43_AMP3_4_GNDREF_HS3_SEL_MASK |
810 			      CS42L43_HSBIAS_GNDREF_HS3_SEL_MASK |
811 			      CS42L43_HSBIAS_OUT_HS4_SEL_MASK |
812 			      CS42L43_HSGND_HS3_SEL_MASK,
813 		.clamp_ctrl = CS42L43_SMIC_HPAMP_CLAMP_DIS_FRC_MASK,
814 		.report = CS42L43_JACK_HEADSET,
815 	},
816 	[CS42L43_JACK_RAW_OMTP] = {
817 		.hsdet_mode = (0x1 << CS42L43_HSDET_MANUAL_MODE_SHIFT) |
818 			       CS42L43_AMP3_4_GNDREF_HS4_SEL_MASK |
819 			       CS42L43_HSBIAS_GNDREF_HS4_SEL_MASK |
820 			       CS42L43_HSBIAS_OUT_HS3_SEL_MASK |
821 			       CS42L43_HSGND_HS4_SEL_MASK,
822 		.clamp_ctrl = CS42L43_SMIC_HPAMP_CLAMP_DIS_FRC_MASK,
823 		.report = CS42L43_JACK_HEADSET,
824 	},
825 	[CS42L43_JACK_RAW_HEADPHONE] = {
826 		.hsdet_mode = CS42L43_JACK_3_POLE_SWITCHES,
827 		.clamp_ctrl = CS42L43_SMIC_HPAMP_CLAMP_DIS_FRC_MASK,
828 		.report = CS42L43_JACK_HEADPHONE,
829 	},
830 	[CS42L43_JACK_RAW_LINE_OUT] = {
831 		.hsdet_mode = CS42L43_JACK_3_POLE_SWITCHES,
832 		.clamp_ctrl = CS42L43_SMIC_HPAMP_CLAMP_DIS_FRC_MASK,
833 		.report = CS42L43_JACK_LINEOUT,
834 	},
835 	[CS42L43_JACK_RAW_LINE_IN] = {
836 		.hsdet_mode = CS42L43_JACK_3_POLE_SWITCHES,
837 		.mic_ctrl = 0x2 << CS42L43_JACK_STEREO_CONFIG_SHIFT,
838 		.report = CS42L43_JACK_LINEIN,
839 	},
840 	[CS42L43_JACK_RAW_MICROPHONE] = {
841 		.hsdet_mode = CS42L43_JACK_3_POLE_SWITCHES,
842 		.mic_ctrl = (0x3 << CS42L43_JACK_STEREO_CONFIG_SHIFT) |
843 			    CS42L43_HS1_BIAS_EN_MASK | CS42L43_HS2_BIAS_EN_MASK,
844 		.report = CS42L43_JACK_LINEIN,
845 	},
846 	[CS42L43_JACK_RAW_OPTICAL] = {
847 		.hsdet_mode = CS42L43_JACK_3_POLE_SWITCHES,
848 		.clamp_ctrl = CS42L43_SMIC_HPAMP_CLAMP_DIS_FRC_MASK,
849 		.report = CS42L43_JACK_OPTICAL,
850 	},
851 };
852 
853 static const char * const cs42l43_jack_text[] = {
854 	"None", "CTIA", "OMTP", "Headphone", "Line-Out",
855 	"Line-In", "Microphone", "Optical",
856 };
857 
858 SOC_ENUM_SINGLE_VIRT_DECL(cs42l43_jack_enum, cs42l43_jack_text);
859 
cs42l43_jack_get(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)860 int cs42l43_jack_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
861 {
862 	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
863 	struct cs42l43_codec *priv = snd_soc_component_get_drvdata(component);
864 
865 	mutex_lock(&priv->jack_lock);
866 	ucontrol->value.integer.value[0] = priv->jack_override;
867 	mutex_unlock(&priv->jack_lock);
868 
869 	return 0;
870 }
871 
cs42l43_jack_put(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)872 int cs42l43_jack_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
873 {
874 	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
875 	struct cs42l43_codec *priv = snd_soc_component_get_drvdata(component);
876 	struct cs42l43 *cs42l43 = priv->core;
877 	struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
878 	unsigned int override = ucontrol->value.integer.value[0];
879 
880 	BUILD_BUG_ON(ARRAY_SIZE(cs42l43_jack_override_modes) !=
881 		     ARRAY_SIZE(cs42l43_jack_text) - 1);
882 
883 	if (override >= e->items)
884 		return -EINVAL;
885 
886 	mutex_lock(&priv->jack_lock);
887 
888 	if (!cs42l43_jack_present(priv)) {
889 		mutex_unlock(&priv->jack_lock);
890 		return -EBUSY;
891 	}
892 
893 	if (override == priv->jack_override) {
894 		mutex_unlock(&priv->jack_lock);
895 		return 0;
896 	}
897 
898 	priv->jack_override = override;
899 
900 	cs42l43_clear_jack(priv);
901 
902 	if (!override) {
903 		queue_delayed_work(system_long_wq, &priv->tip_sense_work, 0);
904 	} else {
905 		override--;
906 
907 		regmap_update_bits(cs42l43->regmap, CS42L43_HS2,
908 				   CS42L43_HSDET_MODE_MASK |
909 				   CS42L43_HSDET_MANUAL_MODE_MASK |
910 				   CS42L43_AMP3_4_GNDREF_HS3_SEL_MASK |
911 				   CS42L43_AMP3_4_GNDREF_HS4_SEL_MASK |
912 				   CS42L43_HSBIAS_GNDREF_HS3_SEL_MASK |
913 				   CS42L43_HSBIAS_GNDREF_HS4_SEL_MASK |
914 				   CS42L43_HSBIAS_OUT_HS3_SEL_MASK |
915 				   CS42L43_HSBIAS_OUT_HS4_SEL_MASK |
916 				   CS42L43_HSGND_HS3_SEL_MASK |
917 				   CS42L43_HSGND_HS4_SEL_MASK,
918 				   cs42l43_jack_override_modes[override].hsdet_mode);
919 		regmap_update_bits(cs42l43->regmap, CS42L43_STEREO_MIC_CTRL,
920 				   CS42L43_HS2_BIAS_EN_MASK | CS42L43_HS1_BIAS_EN_MASK |
921 				   CS42L43_JACK_STEREO_CONFIG_MASK,
922 				   cs42l43_jack_override_modes[override].mic_ctrl);
923 		regmap_update_bits(cs42l43->regmap, CS42L43_STEREO_MIC_CLAMP_CTRL,
924 				   CS42L43_SMIC_HPAMP_CLAMP_DIS_FRC_MASK,
925 				   cs42l43_jack_override_modes[override].clamp_ctrl);
926 
927 		switch (override) {
928 		case CS42L43_JACK_RAW_CTIA:
929 		case CS42L43_JACK_RAW_OMTP:
930 			cs42l43_start_hs_bias(priv, false);
931 			cs42l43_start_button_detect(priv);
932 			break;
933 		case CS42L43_JACK_RAW_LINE_IN:
934 			regmap_update_bits(cs42l43->regmap, CS42L43_ADC_B_CTRL1,
935 					   CS42L43_PGA_WIDESWING_MODE_EN_MASK,
936 					   CS42L43_PGA_WIDESWING_MODE_EN_MASK);
937 			regmap_update_bits(cs42l43->regmap, CS42L43_ADC_B_CTRL2,
938 					   CS42L43_PGA_WIDESWING_MODE_EN_MASK,
939 					   CS42L43_PGA_WIDESWING_MODE_EN_MASK);
940 			break;
941 		case CS42L43_JACK_RAW_MICROPHONE:
942 			cs42l43_start_hs_bias(priv, false);
943 			break;
944 		default:
945 			break;
946 		}
947 
948 		snd_soc_jack_report(priv->jack_hp,
949 				    cs42l43_jack_override_modes[override].report,
950 				    cs42l43_jack_override_modes[override].report);
951 	}
952 
953 	mutex_unlock(&priv->jack_lock);
954 
955 	return 1;
956 }
957