xref: /openbmc/linux/sound/soc/codecs/cs42l43.h (revision c900529f3d9161bfde5cca0754f83b4d3c3e0220)
1*fc918cbeSCharles Keepax /* SPDX-License-Identifier: GPL-2.0 */
2*fc918cbeSCharles Keepax /*
3*fc918cbeSCharles Keepax  * CS42L43 CODEC driver internal data
4*fc918cbeSCharles Keepax  *
5*fc918cbeSCharles Keepax  * Copyright (C) 2022-2023 Cirrus Logic, Inc. and
6*fc918cbeSCharles Keepax  *                         Cirrus Logic International Semiconductor Ltd.
7*fc918cbeSCharles Keepax  */
8*fc918cbeSCharles Keepax 
9*fc918cbeSCharles Keepax #include <linux/clk.h>
10*fc918cbeSCharles Keepax #include <linux/completion.h>
11*fc918cbeSCharles Keepax #include <linux/device.h>
12*fc918cbeSCharles Keepax #include <linux/mutex.h>
13*fc918cbeSCharles Keepax #include <linux/regmap.h>
14*fc918cbeSCharles Keepax #include <linux/soundwire/sdw.h>
15*fc918cbeSCharles Keepax #include <linux/types.h>
16*fc918cbeSCharles Keepax #include <sound/cs42l43.h>
17*fc918cbeSCharles Keepax #include <sound/pcm.h>
18*fc918cbeSCharles Keepax #include <sound/soc-jack.h>
19*fc918cbeSCharles Keepax 
20*fc918cbeSCharles Keepax #ifndef CS42L43_ASOC_INT_H
21*fc918cbeSCharles Keepax #define CS42L43_ASOC_INT_H
22*fc918cbeSCharles Keepax 
23*fc918cbeSCharles Keepax #define CS42L43_INTERNAL_SYSCLK		24576000
24*fc918cbeSCharles Keepax #define CS42L43_DEFAULT_SLOTS		0x3F
25*fc918cbeSCharles Keepax 
26*fc918cbeSCharles Keepax #define CS42L43_PLL_TIMEOUT_MS		200
27*fc918cbeSCharles Keepax #define CS42L43_SPK_TIMEOUT_MS		100
28*fc918cbeSCharles Keepax #define CS42L43_HP_TIMEOUT_MS		2000
29*fc918cbeSCharles Keepax #define CS42L43_LOAD_TIMEOUT_MS		1000
30*fc918cbeSCharles Keepax 
31*fc918cbeSCharles Keepax #define CS42L43_ASP_MAX_CHANNELS	6
32*fc918cbeSCharles Keepax #define CS42L43_N_EQ_COEFFS		15
33*fc918cbeSCharles Keepax 
34*fc918cbeSCharles Keepax #define CS42L43_N_BUTTONS	6
35*fc918cbeSCharles Keepax 
36*fc918cbeSCharles Keepax struct cs42l43_codec {
37*fc918cbeSCharles Keepax 	struct device *dev;
38*fc918cbeSCharles Keepax 	struct cs42l43 *core;
39*fc918cbeSCharles Keepax 	struct snd_soc_component *component;
40*fc918cbeSCharles Keepax 
41*fc918cbeSCharles Keepax 	struct clk *mclk;
42*fc918cbeSCharles Keepax 
43*fc918cbeSCharles Keepax 	int n_slots;
44*fc918cbeSCharles Keepax 	int slot_width;
45*fc918cbeSCharles Keepax 	int tx_slots[CS42L43_ASP_MAX_CHANNELS];
46*fc918cbeSCharles Keepax 	int rx_slots[CS42L43_ASP_MAX_CHANNELS];
47*fc918cbeSCharles Keepax 	struct snd_pcm_hw_constraint_list constraint;
48*fc918cbeSCharles Keepax 
49*fc918cbeSCharles Keepax 	u32 eq_coeffs[CS42L43_N_EQ_COEFFS];
50*fc918cbeSCharles Keepax 
51*fc918cbeSCharles Keepax 	unsigned int refclk_src;
52*fc918cbeSCharles Keepax 	unsigned int refclk_freq;
53*fc918cbeSCharles Keepax 	struct completion pll_ready;
54*fc918cbeSCharles Keepax 
55*fc918cbeSCharles Keepax 	unsigned int decim_cache[4];
56*fc918cbeSCharles Keepax 	unsigned int adc_ena;
57*fc918cbeSCharles Keepax 	unsigned int hp_ena;
58*fc918cbeSCharles Keepax 
59*fc918cbeSCharles Keepax 	struct completion hp_startup;
60*fc918cbeSCharles Keepax 	struct completion hp_shutdown;
61*fc918cbeSCharles Keepax 	struct completion spkr_shutdown;
62*fc918cbeSCharles Keepax 	struct completion spkl_shutdown;
63*fc918cbeSCharles Keepax 	struct completion spkr_startup;
64*fc918cbeSCharles Keepax 	struct completion spkl_startup;
65*fc918cbeSCharles Keepax 	// Lock to ensure speaker VU updates don't clash
66*fc918cbeSCharles Keepax 	struct mutex spk_vu_lock;
67*fc918cbeSCharles Keepax 
68*fc918cbeSCharles Keepax 	// Lock for all jack detect operations
69*fc918cbeSCharles Keepax 	struct mutex jack_lock;
70*fc918cbeSCharles Keepax 	struct snd_soc_jack *jack_hp;
71*fc918cbeSCharles Keepax 
72*fc918cbeSCharles Keepax 	bool use_ring_sense;
73*fc918cbeSCharles Keepax 	unsigned int tip_debounce_ms;
74*fc918cbeSCharles Keepax 	unsigned int bias_low;
75*fc918cbeSCharles Keepax 	unsigned int bias_sense_ua;
76*fc918cbeSCharles Keepax 	unsigned int bias_ramp_ms;
77*fc918cbeSCharles Keepax 	unsigned int detect_us;
78*fc918cbeSCharles Keepax 	unsigned int buttons[CS42L43_N_BUTTONS];
79*fc918cbeSCharles Keepax 
80*fc918cbeSCharles Keepax 	struct delayed_work tip_sense_work;
81*fc918cbeSCharles Keepax 	struct delayed_work bias_sense_timeout;
82*fc918cbeSCharles Keepax 	struct delayed_work button_press_work;
83*fc918cbeSCharles Keepax 	struct work_struct button_release_work;
84*fc918cbeSCharles Keepax 	struct completion type_detect;
85*fc918cbeSCharles Keepax 	struct completion load_detect;
86*fc918cbeSCharles Keepax 
87*fc918cbeSCharles Keepax 	bool load_detect_running;
88*fc918cbeSCharles Keepax 	bool button_detect_running;
89*fc918cbeSCharles Keepax 	bool jack_present;
90*fc918cbeSCharles Keepax 	int jack_override;
91*fc918cbeSCharles Keepax };
92*fc918cbeSCharles Keepax 
93*fc918cbeSCharles Keepax #if IS_REACHABLE(CONFIG_SND_SOC_CS42L43_SDW)
94*fc918cbeSCharles Keepax 
95*fc918cbeSCharles Keepax int cs42l43_sdw_add_peripheral(struct snd_pcm_substream *substream,
96*fc918cbeSCharles Keepax 			       struct snd_pcm_hw_params *params,
97*fc918cbeSCharles Keepax 			       struct snd_soc_dai *dai);
98*fc918cbeSCharles Keepax int cs42l43_sdw_remove_peripheral(struct snd_pcm_substream *substream,
99*fc918cbeSCharles Keepax 				  struct snd_soc_dai *dai);
100*fc918cbeSCharles Keepax int cs42l43_sdw_set_stream(struct snd_soc_dai *dai, void *sdw_stream, int direction);
101*fc918cbeSCharles Keepax 
102*fc918cbeSCharles Keepax #else
103*fc918cbeSCharles Keepax 
cs42l43_sdw_add_peripheral(struct snd_pcm_substream * substream,struct snd_pcm_hw_params * params,struct snd_soc_dai * dai)104*fc918cbeSCharles Keepax static inline int cs42l43_sdw_add_peripheral(struct snd_pcm_substream *substream,
105*fc918cbeSCharles Keepax 					     struct snd_pcm_hw_params *params,
106*fc918cbeSCharles Keepax 					     struct snd_soc_dai *dai)
107*fc918cbeSCharles Keepax {
108*fc918cbeSCharles Keepax 	return -EINVAL;
109*fc918cbeSCharles Keepax }
110*fc918cbeSCharles Keepax 
111*fc918cbeSCharles Keepax #define cs42l43_sdw_remove_peripheral NULL
112*fc918cbeSCharles Keepax #define cs42l43_sdw_set_stream NULL
113*fc918cbeSCharles Keepax 
114*fc918cbeSCharles Keepax #endif
115*fc918cbeSCharles Keepax 
116*fc918cbeSCharles Keepax int cs42l43_set_jack(struct snd_soc_component *component,
117*fc918cbeSCharles Keepax 		     struct snd_soc_jack *jack, void *d);
118*fc918cbeSCharles Keepax void cs42l43_bias_sense_timeout(struct work_struct *work);
119*fc918cbeSCharles Keepax void cs42l43_tip_sense_work(struct work_struct *work);
120*fc918cbeSCharles Keepax void cs42l43_button_press_work(struct work_struct *work);
121*fc918cbeSCharles Keepax void cs42l43_button_release_work(struct work_struct *work);
122*fc918cbeSCharles Keepax irqreturn_t cs42l43_bias_detect_clamp(int irq, void *data);
123*fc918cbeSCharles Keepax irqreturn_t cs42l43_button_press(int irq, void *data);
124*fc918cbeSCharles Keepax irqreturn_t cs42l43_button_release(int irq, void *data);
125*fc918cbeSCharles Keepax irqreturn_t cs42l43_tip_sense(int irq, void *data);
126*fc918cbeSCharles Keepax int cs42l43_jack_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol);
127*fc918cbeSCharles Keepax int cs42l43_jack_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol);
128*fc918cbeSCharles Keepax 
129*fc918cbeSCharles Keepax extern const struct soc_enum cs42l43_jack_enum;
130*fc918cbeSCharles Keepax 
131*fc918cbeSCharles Keepax #endif /* CS42L43_ASOC_INT_H */
132