]> Git Repo - linux.git/blob - sound/soc/codecs/cs42l43.c
io_uring/poll: move poll execution helpers higher up
[linux.git] / sound / soc / codecs / cs42l43.c
1 // SPDX-License-Identifier: GPL-2.0
2 //
3 // CS42L43 CODEC driver
4 //
5 // Copyright (C) 2022-2023 Cirrus Logic, Inc. and
6 //                         Cirrus Logic International Semiconductor Ltd.
7
8 #include <linux/bitops.h>
9 #include <linux/err.h>
10 #include <linux/errno.h>
11 #include <linux/gcd.h>
12 #include <linux/irq.h>
13 #include <linux/jiffies.h>
14 #include <linux/mfd/cs42l43.h>
15 #include <linux/mfd/cs42l43-regs.h>
16 #include <linux/module.h>
17 #include <linux/pm_runtime.h>
18 #include <linux/string.h>
19 #include <sound/control.h>
20 #include <sound/pcm.h>
21 #include <sound/pcm_params.h>
22 #include <sound/soc-component.h>
23 #include <sound/soc-dapm.h>
24 #include <sound/soc-dai.h>
25 #include <sound/soc.h>
26 #include <sound/tlv.h>
27
28 #include "cs42l43.h"
29
30 #define CS42L43_DECL_MUX(name, reg) \
31 static SOC_VALUE_ENUM_SINGLE_DECL(cs42l43_##name##_enum, reg, \
32                                   0, CS42L43_MIXER_SRC_MASK, \
33                                   cs42l43_mixer_texts, cs42l43_mixer_values); \
34 static const struct snd_kcontrol_new cs42l43_##name##_mux = \
35                 SOC_DAPM_ENUM("Route", cs42l43_##name##_enum)
36
37 #define CS42L43_DECL_MIXER(name, reg) \
38         CS42L43_DECL_MUX(name##_in1, reg); \
39         CS42L43_DECL_MUX(name##_in2, reg + 0x4); \
40         CS42L43_DECL_MUX(name##_in3, reg + 0x8); \
41         CS42L43_DECL_MUX(name##_in4, reg + 0xC)
42
43 #define CS42L43_DAPM_MUX(name_str, name) \
44         SND_SOC_DAPM_MUX(name_str " Input", SND_SOC_NOPM, 0, 0, &cs42l43_##name##_mux)
45
46 #define CS42L43_DAPM_MIXER(name_str, name) \
47         SND_SOC_DAPM_MUX(name_str " Input 1", SND_SOC_NOPM, 0, 0, &cs42l43_##name##_in1_mux), \
48         SND_SOC_DAPM_MUX(name_str " Input 2", SND_SOC_NOPM, 0, 0, &cs42l43_##name##_in2_mux), \
49         SND_SOC_DAPM_MUX(name_str " Input 3", SND_SOC_NOPM, 0, 0, &cs42l43_##name##_in3_mux), \
50         SND_SOC_DAPM_MUX(name_str " Input 4", SND_SOC_NOPM, 0, 0, &cs42l43_##name##_in4_mux), \
51         SND_SOC_DAPM_MIXER(name_str " Mixer", SND_SOC_NOPM, 0, 0, NULL, 0)
52
53 #define CS42L43_BASE_ROUTES(name_str) \
54         { name_str,             "Tone Generator 1",     "Tone 1" }, \
55         { name_str,             "Tone Generator 2",     "Tone 2" }, \
56         { name_str,             "Decimator 1",          "Decimator 1" }, \
57         { name_str,             "Decimator 2",          "Decimator 2" }, \
58         { name_str,             "Decimator 3",          "Decimator 3" }, \
59         { name_str,             "Decimator 4",          "Decimator 4" }, \
60         { name_str,             "ASPRX1",               "ASPRX1" }, \
61         { name_str,             "ASPRX2",               "ASPRX2" }, \
62         { name_str,             "ASPRX3",               "ASPRX3" }, \
63         { name_str,             "ASPRX4",               "ASPRX4" }, \
64         { name_str,             "ASPRX5",               "ASPRX5" }, \
65         { name_str,             "ASPRX6",               "ASPRX6" }, \
66         { name_str,             "DP5RX1",               "DP5RX1" }, \
67         { name_str,             "DP5RX2",               "DP5RX2" }, \
68         { name_str,             "DP6RX1",               "DP6RX1" }, \
69         { name_str,             "DP6RX2",               "DP6RX2" }, \
70         { name_str,             "DP7RX1",               "DP7RX1" }, \
71         { name_str,             "DP7RX2",               "DP7RX2" }, \
72         { name_str,             "ASRC INT1",            "ASRC_INT1" }, \
73         { name_str,             "ASRC INT2",            "ASRC_INT2" }, \
74         { name_str,             "ASRC INT3",            "ASRC_INT3" }, \
75         { name_str,             "ASRC INT4",            "ASRC_INT4" }, \
76         { name_str,             "ASRC DEC1",            "ASRC_DEC1" }, \
77         { name_str,             "ASRC DEC2",            "ASRC_DEC2" }, \
78         { name_str,             "ASRC DEC3",            "ASRC_DEC3" }, \
79         { name_str,             "ASRC DEC4",            "ASRC_DEC4" }, \
80         { name_str,             "ISRC1 INT1",           "ISRC1INT1" }, \
81         { name_str,             "ISRC1 INT2",           "ISRC1INT2" }, \
82         { name_str,             "ISRC1 DEC1",           "ISRC1DEC1" }, \
83         { name_str,             "ISRC1 DEC2",           "ISRC1DEC2" }, \
84         { name_str,             "ISRC2 INT1",           "ISRC2INT1" }, \
85         { name_str,             "ISRC2 INT2",           "ISRC2INT2" }, \
86         { name_str,             "ISRC2 DEC1",           "ISRC2DEC1" }, \
87         { name_str,             "ISRC2 DEC2",           "ISRC2DEC2" }, \
88         { name_str,             "EQ1",                  "EQ" }, \
89         { name_str,             "EQ2",                  "EQ" }
90
91 #define CS42L43_MUX_ROUTES(name_str, widget) \
92         { widget,               NULL,                   name_str " Input" }, \
93         { name_str " Input",    NULL,                   "Mixer Core" }, \
94         CS42L43_BASE_ROUTES(name_str " Input")
95
96 #define CS42L43_MIXER_ROUTES(name_str, widget) \
97         { name_str " Mixer",    NULL,                   name_str " Input 1" }, \
98         { name_str " Mixer",    NULL,                   name_str " Input 2" }, \
99         { name_str " Mixer",    NULL,                   name_str " Input 3" }, \
100         { name_str " Mixer",    NULL,                   name_str " Input 4" }, \
101         { widget,               NULL,                   name_str " Mixer" }, \
102         { name_str " Mixer",    NULL,                   "Mixer Core" }, \
103         CS42L43_BASE_ROUTES(name_str " Input 1"), \
104         CS42L43_BASE_ROUTES(name_str " Input 2"), \
105         CS42L43_BASE_ROUTES(name_str " Input 3"), \
106         CS42L43_BASE_ROUTES(name_str " Input 4")
107
108 #define CS42L43_MIXER_VOLUMES(name_str, base) \
109         SOC_SINGLE_RANGE_TLV(name_str " Input 1 Volume", base, \
110                              CS42L43_MIXER_VOL_SHIFT, 0x20, 0x50, 0, \
111                              cs42l43_mixer_tlv), \
112         SOC_SINGLE_RANGE_TLV(name_str " Input 2 Volume", base + 4, \
113                              CS42L43_MIXER_VOL_SHIFT, 0x20, 0x50, 0, \
114                              cs42l43_mixer_tlv), \
115         SOC_SINGLE_RANGE_TLV(name_str " Input 3 Volume", base + 8, \
116                              CS42L43_MIXER_VOL_SHIFT, 0x20, 0x50, 0, \
117                              cs42l43_mixer_tlv), \
118         SOC_SINGLE_RANGE_TLV(name_str " Input 4 Volume", base + 12, \
119                              CS42L43_MIXER_VOL_SHIFT, 0x20, 0x50, 0, \
120                              cs42l43_mixer_tlv)
121
122 #define CS42L43_IRQ_ERROR(name) \
123 static irqreturn_t cs42l43_##name(int irq, void *data) \
124 { \
125         struct cs42l43_codec *priv = data; \
126         dev_err(priv->dev, "Error " #name " IRQ\n"); \
127         return IRQ_HANDLED; \
128 }
129
130 CS42L43_IRQ_ERROR(pll_lost_lock)
131 CS42L43_IRQ_ERROR(spkr_clock_stop)
132 CS42L43_IRQ_ERROR(spkl_clock_stop)
133 CS42L43_IRQ_ERROR(spkr_brown_out)
134 CS42L43_IRQ_ERROR(spkl_brown_out)
135 CS42L43_IRQ_ERROR(spkr_therm_shutdown)
136 CS42L43_IRQ_ERROR(spkl_therm_shutdown)
137 CS42L43_IRQ_ERROR(spkr_therm_warm)
138 CS42L43_IRQ_ERROR(spkl_therm_warm)
139 CS42L43_IRQ_ERROR(spkr_sc_detect)
140 CS42L43_IRQ_ERROR(spkl_sc_detect)
141
142 static void cs42l43_hp_ilimit_clear_work(struct work_struct *work)
143 {
144         struct cs42l43_codec *priv = container_of(work, struct cs42l43_codec,
145                                                   hp_ilimit_clear_work.work);
146         struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(priv->component);
147
148         snd_soc_dapm_mutex_lock(dapm);
149
150         priv->hp_ilimit_count--;
151
152         if (priv->hp_ilimit_count)
153                 queue_delayed_work(system_wq, &priv->hp_ilimit_clear_work,
154                                    msecs_to_jiffies(CS42L43_HP_ILIMIT_DECAY_MS));
155
156         snd_soc_dapm_mutex_unlock(dapm);
157 }
158
159 static void cs42l43_hp_ilimit_work(struct work_struct *work)
160 {
161         struct cs42l43_codec *priv = container_of(work, struct cs42l43_codec,
162                                                   hp_ilimit_work);
163         struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(priv->component);
164         struct cs42l43 *cs42l43 = priv->core;
165
166         snd_soc_dapm_mutex_lock(dapm);
167
168         if (priv->hp_ilimit_count < CS42L43_HP_ILIMIT_MAX_COUNT) {
169                 if (!priv->hp_ilimit_count)
170                         queue_delayed_work(system_wq, &priv->hp_ilimit_clear_work,
171                                            msecs_to_jiffies(CS42L43_HP_ILIMIT_DECAY_MS));
172
173                 priv->hp_ilimit_count++;
174                 snd_soc_dapm_mutex_unlock(dapm);
175                 return;
176         }
177
178         dev_err(priv->dev, "Disabling headphone for %dmS, due to frequent current limit\n",
179                 CS42L43_HP_ILIMIT_BACKOFF_MS);
180
181         priv->hp_ilimited = true;
182
183         // No need to wait for disable, as just disabling for a period of time
184         regmap_update_bits(cs42l43->regmap, CS42L43_BLOCK_EN8,
185                            CS42L43_HP_EN_MASK, 0);
186
187         snd_soc_dapm_mutex_unlock(dapm);
188
189         msleep(CS42L43_HP_ILIMIT_BACKOFF_MS);
190
191         snd_soc_dapm_mutex_lock(dapm);
192
193         if (priv->hp_ena && !priv->load_detect_running) {
194                 unsigned long time_left;
195
196                 reinit_completion(&priv->hp_startup);
197
198                 regmap_update_bits(cs42l43->regmap, CS42L43_BLOCK_EN8,
199                                    CS42L43_HP_EN_MASK, priv->hp_ena);
200
201                 time_left = wait_for_completion_timeout(&priv->hp_startup,
202                                                         msecs_to_jiffies(CS42L43_HP_TIMEOUT_MS));
203                 if (!time_left)
204                         dev_err(priv->dev, "ilimit HP restore timed out\n");
205         }
206
207         priv->hp_ilimited = false;
208
209         snd_soc_dapm_mutex_unlock(dapm);
210 }
211
212 static irqreturn_t cs42l43_hp_ilimit(int irq, void *data)
213 {
214         struct cs42l43_codec *priv = data;
215
216         dev_dbg(priv->dev, "headphone ilimit IRQ\n");
217
218         queue_work(system_long_wq, &priv->hp_ilimit_work);
219
220         return IRQ_HANDLED;
221 }
222
223 #define CS42L43_IRQ_COMPLETE(name) \
224 static irqreturn_t cs42l43_##name(int irq, void *data) \
225 { \
226         struct cs42l43_codec *priv = data; \
227         dev_dbg(priv->dev, #name " completed\n"); \
228         complete(&priv->name); \
229         return IRQ_HANDLED; \
230 }
231
232 CS42L43_IRQ_COMPLETE(pll_ready)
233 CS42L43_IRQ_COMPLETE(hp_startup)
234 CS42L43_IRQ_COMPLETE(hp_shutdown)
235 CS42L43_IRQ_COMPLETE(type_detect)
236 CS42L43_IRQ_COMPLETE(spkr_shutdown)
237 CS42L43_IRQ_COMPLETE(spkl_shutdown)
238 CS42L43_IRQ_COMPLETE(spkr_startup)
239 CS42L43_IRQ_COMPLETE(spkl_startup)
240 CS42L43_IRQ_COMPLETE(load_detect)
241
242 static irqreturn_t cs42l43_mic_shutter(int irq, void *data)
243 {
244         struct cs42l43_codec *priv = data;
245         static const char * const controls[] = {
246                 "Decimator 1 Switch",
247                 "Decimator 2 Switch",
248                 "Decimator 3 Switch",
249                 "Decimator 4 Switch",
250         };
251         int i, ret;
252
253         dev_dbg(priv->dev, "Microphone shutter changed\n");
254
255         if (!priv->component)
256                 return IRQ_NONE;
257
258         for (i = 0; i < ARRAY_SIZE(controls); i++) {
259                 ret = snd_soc_component_notify_control(priv->component,
260                                                        controls[i]);
261                 if (ret)
262                         return IRQ_NONE;
263         }
264
265         return IRQ_HANDLED;
266 }
267
268 static irqreturn_t cs42l43_spk_shutter(int irq, void *data)
269 {
270         struct cs42l43_codec *priv = data;
271         int ret;
272
273         dev_dbg(priv->dev, "Speaker shutter changed\n");
274
275         if (!priv->component)
276                 return IRQ_NONE;
277
278         ret = snd_soc_component_notify_control(priv->component,
279                                                "Speaker Digital Switch");
280         if (ret)
281                 return IRQ_NONE;
282
283         return IRQ_HANDLED;
284 }
285
286 static const unsigned int cs42l43_sample_rates[] = {
287         8000, 16000, 24000, 32000, 44100, 48000, 96000, 192000,
288 };
289
290 #define CS42L43_CONSUMER_RATE_MASK 0xFF
291 #define CS42L43_PROVIDER_RATE_MASK 0xEF // 44.1k only supported as consumer
292
293 static const struct snd_pcm_hw_constraint_list cs42l43_constraint = {
294         .count          = ARRAY_SIZE(cs42l43_sample_rates),
295         .list           = cs42l43_sample_rates,
296 };
297
298 static int cs42l43_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai)
299 {
300         struct snd_soc_component *component = dai->component;
301         struct cs42l43_codec *priv = snd_soc_component_get_drvdata(component);
302         struct cs42l43 *cs42l43 = priv->core;
303         int provider = !!regmap_test_bits(cs42l43->regmap, CS42L43_ASP_CLK_CONFIG2,
304                                           CS42L43_ASP_MASTER_MODE_MASK);
305
306         if (provider)
307                 priv->constraint.mask = CS42L43_PROVIDER_RATE_MASK;
308         else
309                 priv->constraint.mask = CS42L43_CONSUMER_RATE_MASK;
310
311         return snd_pcm_hw_constraint_list(substream->runtime, 0,
312                                           SNDRV_PCM_HW_PARAM_RATE,
313                                           &priv->constraint);
314 }
315
316 static int cs42l43_convert_sample_rate(unsigned int rate)
317 {
318         switch (rate) {
319         case 8000:
320                 return 0x11;
321         case 16000:
322                 return 0x12;
323         case 24000:
324                 return 0x02;
325         case 32000:
326                 return 0x13;
327         case 44100:
328                 return 0x0B;
329         case 48000:
330                 return 0x03;
331         case 96000:
332                 return 0x04;
333         case 192000:
334                 return 0x05;
335         default:
336                 return -EINVAL;
337         }
338 }
339
340 static int cs42l43_set_sample_rate(struct snd_pcm_substream *substream,
341                                    struct snd_pcm_hw_params *params,
342                                    struct snd_soc_dai *dai)
343 {
344         struct cs42l43_codec *priv = snd_soc_component_get_drvdata(dai->component);
345         struct cs42l43 *cs42l43 = priv->core;
346         int ret;
347
348         ret = cs42l43_convert_sample_rate(params_rate(params));
349         if (ret < 0) {
350                 dev_err(priv->dev, "Failed to convert sample rate: %d\n", ret);
351                 return ret;
352         }
353
354         //FIXME: For now lets just set sample rate 1, this needs expanded in the future
355         regmap_update_bits(cs42l43->regmap, CS42L43_SAMPLE_RATE1,
356                            CS42L43_SAMPLE_RATE_MASK, ret);
357
358         return 0;
359 }
360
361 static int cs42l43_asp_hw_params(struct snd_pcm_substream *substream,
362                                  struct snd_pcm_hw_params *params,
363                                  struct snd_soc_dai *dai)
364 {
365         struct cs42l43_codec *priv = snd_soc_component_get_drvdata(dai->component);
366         struct cs42l43 *cs42l43 = priv->core;
367         int dsp_mode = !!regmap_test_bits(cs42l43->regmap, CS42L43_ASP_CTRL,
368                                           CS42L43_ASP_FSYNC_MODE_MASK);
369         int provider = !!regmap_test_bits(cs42l43->regmap, CS42L43_ASP_CLK_CONFIG2,
370                                           CS42L43_ASP_MASTER_MODE_MASK);
371         int n_chans = params_channels(params);
372         int data_width = params_width(params);
373         int n_slots = n_chans;
374         int slot_width = data_width;
375         int frame, bclk_target, i;
376         unsigned int reg;
377         int *slots;
378
379         if (priv->n_slots) {
380                 n_slots = priv->n_slots;
381                 slot_width = priv->slot_width;
382         }
383
384         if (!dsp_mode && (n_slots & 0x1)) {
385                 dev_dbg(priv->dev, "Forcing balanced channels on ASP\n");
386                 n_slots++;
387         }
388
389         frame = n_slots * slot_width;
390         bclk_target = params_rate(params) * frame;
391
392         if (provider) {
393                 unsigned int gcd_nm = gcd(bclk_target, CS42L43_INTERNAL_SYSCLK);
394                 int n = bclk_target / gcd_nm;
395                 int m = CS42L43_INTERNAL_SYSCLK / gcd_nm;
396
397                 if (n > (CS42L43_ASP_BCLK_N_MASK >> CS42L43_ASP_BCLK_N_SHIFT) ||
398                     m > CS42L43_ASP_BCLK_M_MASK) {
399                         dev_err(priv->dev, "Can't produce %dHz bclk\n", bclk_target);
400                         return -EINVAL;
401                 }
402
403                 dev_dbg(priv->dev, "bclk %d/%d = %dHz, with %dx%d frame\n",
404                         n, m, bclk_target, n_slots, slot_width);
405
406                 regmap_update_bits(cs42l43->regmap, CS42L43_ASP_CLK_CONFIG1,
407                                    CS42L43_ASP_BCLK_N_MASK | CS42L43_ASP_BCLK_M_MASK,
408                                    n << CS42L43_ASP_BCLK_N_SHIFT |
409                                    m << CS42L43_ASP_BCLK_M_SHIFT);
410                 regmap_update_bits(cs42l43->regmap, CS42L43_ASP_FSYNC_CTRL1,
411                                    CS42L43_ASP_FSYNC_M_MASK, frame);
412         }
413
414         regmap_update_bits(cs42l43->regmap, CS42L43_ASP_FSYNC_CTRL4,
415                            CS42L43_ASP_NUM_BCLKS_PER_FSYNC_MASK,
416                            frame << CS42L43_ASP_NUM_BCLKS_PER_FSYNC_SHIFT);
417
418         if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) {
419                 reg = CS42L43_ASP_TX_CH1_CTRL;
420                 slots = priv->tx_slots;
421         } else {
422                 reg = CS42L43_ASP_RX_CH1_CTRL;
423                 slots = priv->rx_slots;
424         }
425
426         for (i = 0; i < n_chans; i++, reg += 4) {
427                 int slot_phase = dsp_mode | (i & CS42L43_ASP_CH_SLOT_PHASE_MASK);
428                 int slot_pos;
429
430                 if (dsp_mode)
431                         slot_pos = slots[i] * slot_width;
432                 else
433                         slot_pos = (slots[i] / 2) * slot_width;
434
435                 dev_dbg(priv->dev, "Configure channel %d at slot %d (%d,%d)\n",
436                         i, slots[i], slot_pos, slot_phase);
437
438                 regmap_update_bits(cs42l43->regmap, reg,
439                                    CS42L43_ASP_CH_WIDTH_MASK |
440                                    CS42L43_ASP_CH_SLOT_MASK |
441                                    CS42L43_ASP_CH_SLOT_PHASE_MASK,
442                                    ((data_width - 1) << CS42L43_ASP_CH_WIDTH_SHIFT) |
443                                    (slot_pos << CS42L43_ASP_CH_SLOT_SHIFT) |
444                                    slot_phase);
445         }
446
447         return cs42l43_set_sample_rate(substream, params, dai);
448 }
449
450 static int cs42l43_asp_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
451 {
452         struct snd_soc_component *component = dai->component;
453         struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
454         struct cs42l43_codec *priv = snd_soc_component_get_drvdata(component);
455         struct cs42l43 *cs42l43 = priv->core;
456         int provider = regmap_test_bits(cs42l43->regmap, CS42L43_ASP_CLK_CONFIG2,
457                                         CS42L43_ASP_MASTER_MODE_MASK);
458         struct snd_soc_dapm_route routes[] = {
459                 { "BCLK", NULL, "FSYNC" },
460         };
461         unsigned int asp_ctrl = 0;
462         unsigned int data_ctrl = 0;
463         unsigned int fsync_ctrl = 0;
464         unsigned int clk_config = 0;
465
466         switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
467         case SND_SOC_DAIFMT_DSP_A:
468                 data_ctrl |= 2 << CS42L43_ASP_FSYNC_FRAME_START_DLY_SHIFT;
469                 fallthrough;
470         case SND_SOC_DAIFMT_DSP_B:
471                 asp_ctrl |= CS42L43_ASP_FSYNC_MODE_MASK;
472                 data_ctrl |= CS42L43_ASP_FSYNC_FRAME_START_PHASE_MASK;
473                 break;
474         case SND_SOC_DAIFMT_I2S:
475                 data_ctrl |= 2 << CS42L43_ASP_FSYNC_FRAME_START_DLY_SHIFT;
476                 break;
477         case SND_SOC_DAIFMT_LEFT_J:
478                 data_ctrl |= CS42L43_ASP_FSYNC_FRAME_START_PHASE_MASK;
479                 break;
480         default:
481                 dev_err(priv->dev, "Unsupported DAI format 0x%x\n",
482                         fmt & SND_SOC_DAIFMT_FORMAT_MASK);
483                 return -EINVAL;
484         }
485
486         switch (fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) {
487         case SND_SOC_DAIFMT_CBC_CFC:
488                 if (provider)
489                         snd_soc_dapm_del_routes(dapm, routes, ARRAY_SIZE(routes));
490                 break;
491         case SND_SOC_DAIFMT_CBP_CFP:
492                 if (!provider)
493                         snd_soc_dapm_add_routes(dapm, routes, ARRAY_SIZE(routes));
494                 clk_config |= CS42L43_ASP_MASTER_MODE_MASK;
495                 break;
496         default:
497                 dev_err(priv->dev, "Unsupported ASP mode 0x%x\n",
498                         fmt & SND_SOC_DAIFMT_MASTER_MASK);
499                 return -EINVAL;
500         }
501
502         switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
503         case SND_SOC_DAIFMT_NB_NF:
504                 clk_config |= CS42L43_ASP_BCLK_INV_MASK; /* Yes BCLK_INV = NB */
505                 break;
506         case SND_SOC_DAIFMT_IB_NF:
507                 break;
508         case SND_SOC_DAIFMT_NB_IF:
509                 clk_config |= CS42L43_ASP_BCLK_INV_MASK;
510                 fsync_ctrl |= CS42L43_ASP_FSYNC_IN_INV_MASK |
511                               CS42L43_ASP_FSYNC_OUT_INV_MASK;
512                 break;
513         case SND_SOC_DAIFMT_IB_IF:
514                 fsync_ctrl |= CS42L43_ASP_FSYNC_IN_INV_MASK |
515                               CS42L43_ASP_FSYNC_OUT_INV_MASK;
516                 break;
517         default:
518                 dev_err(priv->dev, "Unsupported invert mode 0x%x\n",
519                         fmt & SND_SOC_DAIFMT_INV_MASK);
520                 return -EINVAL;
521         }
522
523         regmap_update_bits(cs42l43->regmap, CS42L43_ASP_CTRL,
524                            CS42L43_ASP_FSYNC_MODE_MASK,
525                            asp_ctrl);
526         regmap_update_bits(cs42l43->regmap, CS42L43_ASP_DATA_CTRL,
527                            CS42L43_ASP_FSYNC_FRAME_START_DLY_MASK |
528                            CS42L43_ASP_FSYNC_FRAME_START_PHASE_MASK,
529                            data_ctrl);
530         regmap_update_bits(cs42l43->regmap, CS42L43_ASP_CLK_CONFIG2,
531                            CS42L43_ASP_MASTER_MODE_MASK |
532                            CS42L43_ASP_BCLK_INV_MASK,
533                            clk_config);
534         regmap_update_bits(cs42l43->regmap, CS42L43_ASP_FSYNC_CTRL3,
535                            CS42L43_ASP_FSYNC_IN_INV_MASK |
536                            CS42L43_ASP_FSYNC_OUT_INV_MASK,
537                            fsync_ctrl);
538
539         return 0;
540 }
541
542 static void cs42l43_mask_to_slots(struct cs42l43_codec *priv, unsigned int mask, int *slots)
543 {
544         int i;
545
546         for (i = 0; i < CS42L43_ASP_MAX_CHANNELS; ++i) {
547                 int slot = ffs(mask) - 1;
548
549                 if (slot < 0)
550                         return;
551
552                 slots[i] = slot;
553
554                 mask &= ~(1 << slot);
555         }
556
557         if (mask)
558                 dev_warn(priv->dev, "Too many channels in TDM mask\n");
559 }
560
561 static int cs42l43_asp_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
562                                     unsigned int rx_mask, int slots, int slot_width)
563 {
564         struct snd_soc_component *component = dai->component;
565         struct cs42l43_codec *priv = snd_soc_component_get_drvdata(component);
566
567         priv->n_slots = slots;
568         priv->slot_width = slot_width;
569
570         if (!slots) {
571                 tx_mask = CS42L43_DEFAULT_SLOTS;
572                 rx_mask = CS42L43_DEFAULT_SLOTS;
573         }
574
575         cs42l43_mask_to_slots(priv, tx_mask, priv->tx_slots);
576         cs42l43_mask_to_slots(priv, rx_mask, priv->rx_slots);
577
578         return 0;
579 }
580
581 static const struct snd_soc_dai_ops cs42l43_asp_ops = {
582         .startup        = cs42l43_startup,
583         .hw_params      = cs42l43_asp_hw_params,
584         .set_fmt        = cs42l43_asp_set_fmt,
585         .set_tdm_slot   = cs42l43_asp_set_tdm_slot,
586 };
587
588 static int cs42l43_sdw_hw_params(struct snd_pcm_substream *substream,
589                                  struct snd_pcm_hw_params *params,
590                                  struct snd_soc_dai *dai)
591 {
592         int ret;
593
594         ret = cs42l43_sdw_add_peripheral(substream, params, dai);
595         if (ret)
596                 return ret;
597
598         return cs42l43_set_sample_rate(substream, params, dai);
599 };
600
601 static const struct snd_soc_dai_ops cs42l43_sdw_ops = {
602         .startup        = cs42l43_startup,
603         .set_stream     = cs42l43_sdw_set_stream,
604         .hw_params      = cs42l43_sdw_hw_params,
605         .hw_free        = cs42l43_sdw_remove_peripheral,
606 };
607
608 #define CS42L43_ASP_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE | \
609                              SNDRV_PCM_FMTBIT_S32_LE)
610 #define CS42L43_SDW_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE)
611
612 static struct snd_soc_dai_driver cs42l43_dais[] = {
613         {
614                 .name                   = "cs42l43-asp",
615                 .ops                    = &cs42l43_asp_ops,
616                 .symmetric_rate         = 1,
617                 .capture = {
618                         .stream_name    = "ASP Capture",
619                         .channels_min   = 1,
620                         .channels_max   = CS42L43_ASP_MAX_CHANNELS,
621                         .rates          = SNDRV_PCM_RATE_KNOT,
622                         .formats        = CS42L43_ASP_FORMATS,
623                 },
624                 .playback = {
625                         .stream_name    = "ASP Playback",
626                         .channels_min   = 1,
627                         .channels_max   = CS42L43_ASP_MAX_CHANNELS,
628                         .rates          = SNDRV_PCM_RATE_KNOT,
629                         .formats        = CS42L43_ASP_FORMATS,
630                 },
631         },
632         {
633                 .name                   = "cs42l43-dp1",
634                 .id                     = 1,
635                 .ops                    = &cs42l43_sdw_ops,
636                 .capture = {
637                         .stream_name    = "DP1 Capture",
638                         .channels_min   = 1,
639                         .channels_max   = 4,
640                         .rates          = SNDRV_PCM_RATE_KNOT,
641                         .formats        = CS42L43_SDW_FORMATS,
642                 },
643         },
644         {
645                 .name                   = "cs42l43-dp2",
646                 .id                     = 2,
647                 .ops                    = &cs42l43_sdw_ops,
648                 .capture = {
649                         .stream_name    = "DP2 Capture",
650                         .channels_min   = 1,
651                         .channels_max   = 2,
652                         .rates          = SNDRV_PCM_RATE_KNOT,
653                         .formats        = CS42L43_SDW_FORMATS,
654                 },
655         },
656         {
657                 .name                   = "cs42l43-dp3",
658                 .id                     = 3,
659                 .ops                    = &cs42l43_sdw_ops,
660                 .capture = {
661                         .stream_name    = "DP3 Capture",
662                         .channels_min   = 1,
663                         .channels_max   = 2,
664                         .rates          = SNDRV_PCM_RATE_KNOT,
665                         .formats        = CS42L43_SDW_FORMATS,
666                 },
667         },
668         {
669                 .name                   = "cs42l43-dp4",
670                 .id                     = 4,
671                 .ops                    = &cs42l43_sdw_ops,
672                 .capture = {
673                         .stream_name    = "DP4 Capture",
674                         .channels_min   = 1,
675                         .channels_max   = 2,
676                         .rates          = SNDRV_PCM_RATE_KNOT,
677                         .formats        = CS42L43_SDW_FORMATS,
678                 },
679         },
680         {
681                 .name                   = "cs42l43-dp5",
682                 .id                     = 5,
683                 .ops                    = &cs42l43_sdw_ops,
684                 .playback = {
685                         .stream_name    = "DP5 Playback",
686                         .channels_min   = 1,
687                         .channels_max   = 2,
688                         .rates          = SNDRV_PCM_RATE_KNOT,
689                         .formats        = CS42L43_SDW_FORMATS,
690                 },
691         },
692         {
693                 .name                   = "cs42l43-dp6",
694                 .id                     = 6,
695                 .ops                    = &cs42l43_sdw_ops,
696                 .playback = {
697                         .stream_name    = "DP6 Playback",
698                         .channels_min   = 1,
699                         .channels_max   = 2,
700                         .rates          = SNDRV_PCM_RATE_KNOT,
701                         .formats        = CS42L43_SDW_FORMATS,
702                 },
703         },
704         {
705                 .name                   = "cs42l43-dp7",
706                 .id                     = 7,
707                 .ops                    = &cs42l43_sdw_ops,
708                 .playback = {
709                         .stream_name    = "DP7 Playback",
710                         .channels_min   = 1,
711                         .channels_max   = 2,
712                         .rates          = SNDRV_PCM_RATE_KNOT,
713                         .formats        = CS42L43_SDW_FORMATS,
714                 },
715         },
716 };
717
718 static const DECLARE_TLV_DB_SCALE(cs42l43_mixer_tlv, -3200, 100, 0);
719
720 static const char * const cs42l43_ramp_text[] = {
721         "0ms/6dB", "0.5ms/6dB", "1ms/6dB", "2ms/6dB", "4ms/6dB", "8ms/6dB",
722         "15ms/6dB", "30ms/6dB",
723 };
724
725 static const char * const cs42l43_adc1_input_text[] = { "IN1", "IN2" };
726
727 static SOC_ENUM_SINGLE_DECL(cs42l43_adc1_input, CS42L43_ADC_B_CTRL1,
728                             CS42L43_ADC_AIN_SEL_SHIFT,
729                             cs42l43_adc1_input_text);
730
731 static const struct snd_kcontrol_new cs42l43_adc1_input_ctl =
732         SOC_DAPM_ENUM("ADC1 Input", cs42l43_adc1_input);
733
734 static const char * const cs42l43_dec_mode_text[] = { "ADC", "PDM" };
735
736 static SOC_ENUM_SINGLE_VIRT_DECL(cs42l43_dec1_mode, cs42l43_dec_mode_text);
737 static SOC_ENUM_SINGLE_VIRT_DECL(cs42l43_dec2_mode, cs42l43_dec_mode_text);
738
739 static const struct snd_kcontrol_new cs42l43_dec_mode_ctl[] = {
740         SOC_DAPM_ENUM("Decimator 1 Mode", cs42l43_dec1_mode),
741         SOC_DAPM_ENUM("Decimator 2 Mode", cs42l43_dec2_mode),
742 };
743
744 static const char * const cs42l43_pdm_clk_text[] = {
745         "3.072MHz", "1.536MHz", "768kHz",
746 };
747
748 static SOC_ENUM_SINGLE_DECL(cs42l43_pdm1_clk, CS42L43_PDM_CONTROL,
749                             CS42L43_PDM1_CLK_DIV_SHIFT, cs42l43_pdm_clk_text);
750 static SOC_ENUM_SINGLE_DECL(cs42l43_pdm2_clk, CS42L43_PDM_CONTROL,
751                             CS42L43_PDM2_CLK_DIV_SHIFT, cs42l43_pdm_clk_text);
752
753 static DECLARE_TLV_DB_SCALE(cs42l43_adc_tlv, -600, 600, 0);
754 static DECLARE_TLV_DB_SCALE(cs42l43_dec_tlv, -6400, 50, 0);
755
756 static const char * const cs42l43_wnf_corner_text[] = {
757         "160Hz", "180Hz", "200Hz", "220Hz", "240Hz", "260Hz", "280Hz", "300Hz",
758 };
759
760 static SOC_ENUM_SINGLE_DECL(cs42l43_dec1_wnf_corner, CS42L43_DECIM_HPF_WNF_CTRL1,
761                             CS42L43_DECIM_WNF_CF_SHIFT, cs42l43_wnf_corner_text);
762 static SOC_ENUM_SINGLE_DECL(cs42l43_dec2_wnf_corner, CS42L43_DECIM_HPF_WNF_CTRL2,
763                             CS42L43_DECIM_WNF_CF_SHIFT, cs42l43_wnf_corner_text);
764 static SOC_ENUM_SINGLE_DECL(cs42l43_dec3_wnf_corner, CS42L43_DECIM_HPF_WNF_CTRL3,
765                             CS42L43_DECIM_WNF_CF_SHIFT, cs42l43_wnf_corner_text);
766 static SOC_ENUM_SINGLE_DECL(cs42l43_dec4_wnf_corner, CS42L43_DECIM_HPF_WNF_CTRL4,
767                             CS42L43_DECIM_WNF_CF_SHIFT, cs42l43_wnf_corner_text);
768
769 static const char * const cs42l43_hpf_corner_text[] = {
770         "3Hz", "12Hz", "48Hz", "96Hz",
771 };
772
773 static SOC_ENUM_SINGLE_DECL(cs42l43_dec1_hpf_corner, CS42L43_DECIM_HPF_WNF_CTRL1,
774                             CS42L43_DECIM_HPF_CF_SHIFT, cs42l43_hpf_corner_text);
775 static SOC_ENUM_SINGLE_DECL(cs42l43_dec2_hpf_corner, CS42L43_DECIM_HPF_WNF_CTRL2,
776                             CS42L43_DECIM_HPF_CF_SHIFT, cs42l43_hpf_corner_text);
777 static SOC_ENUM_SINGLE_DECL(cs42l43_dec3_hpf_corner, CS42L43_DECIM_HPF_WNF_CTRL3,
778                             CS42L43_DECIM_HPF_CF_SHIFT, cs42l43_hpf_corner_text);
779 static SOC_ENUM_SINGLE_DECL(cs42l43_dec4_hpf_corner, CS42L43_DECIM_HPF_WNF_CTRL4,
780                             CS42L43_DECIM_HPF_CF_SHIFT, cs42l43_hpf_corner_text);
781
782 static SOC_ENUM_SINGLE_DECL(cs42l43_dec1_ramp_up, CS42L43_DECIM_VOL_CTRL_CH1_CH2,
783                             CS42L43_DECIM1_VI_RAMP_SHIFT, cs42l43_ramp_text);
784 static SOC_ENUM_SINGLE_DECL(cs42l43_dec1_ramp_down, CS42L43_DECIM_VOL_CTRL_CH1_CH2,
785                             CS42L43_DECIM1_VD_RAMP_SHIFT, cs42l43_ramp_text);
786 static SOC_ENUM_SINGLE_DECL(cs42l43_dec2_ramp_up, CS42L43_DECIM_VOL_CTRL_CH1_CH2,
787                             CS42L43_DECIM2_VI_RAMP_SHIFT, cs42l43_ramp_text);
788 static SOC_ENUM_SINGLE_DECL(cs42l43_dec2_ramp_down, CS42L43_DECIM_VOL_CTRL_CH1_CH2,
789                             CS42L43_DECIM2_VD_RAMP_SHIFT, cs42l43_ramp_text);
790 static SOC_ENUM_SINGLE_DECL(cs42l43_dec3_ramp_up, CS42L43_DECIM_VOL_CTRL_CH3_CH4,
791                             CS42L43_DECIM3_VI_RAMP_SHIFT, cs42l43_ramp_text);
792 static SOC_ENUM_SINGLE_DECL(cs42l43_dec3_ramp_down, CS42L43_DECIM_VOL_CTRL_CH3_CH4,
793                             CS42L43_DECIM3_VD_RAMP_SHIFT, cs42l43_ramp_text);
794 static SOC_ENUM_SINGLE_DECL(cs42l43_dec4_ramp_up, CS42L43_DECIM_VOL_CTRL_CH3_CH4,
795                             CS42L43_DECIM4_VI_RAMP_SHIFT, cs42l43_ramp_text);
796 static SOC_ENUM_SINGLE_DECL(cs42l43_dec4_ramp_down, CS42L43_DECIM_VOL_CTRL_CH3_CH4,
797                             CS42L43_DECIM4_VD_RAMP_SHIFT, cs42l43_ramp_text);
798
799 static DECLARE_TLV_DB_SCALE(cs42l43_speaker_tlv, -6400, 50, 0);
800
801 static SOC_ENUM_SINGLE_DECL(cs42l43_speaker_ramp_up, CS42L43_AMP1_2_VOL_RAMP,
802                             CS42L43_AMP1_2_VI_RAMP_SHIFT, cs42l43_ramp_text);
803
804 static SOC_ENUM_SINGLE_DECL(cs42l43_speaker_ramp_down, CS42L43_AMP1_2_VOL_RAMP,
805                             CS42L43_AMP1_2_VD_RAMP_SHIFT, cs42l43_ramp_text);
806
807 static DECLARE_TLV_DB_SCALE(cs42l43_headphone_tlv, -11450, 50, 1);
808
809 static const char * const cs42l43_headphone_ramp_text[] = {
810         "1", "2", "4", "6", "8", "11", "12", "16", "22", "24", "33", "36", "44",
811         "48", "66", "72",
812 };
813
814 static SOC_ENUM_SINGLE_DECL(cs42l43_headphone_ramp, CS42L43_PGAVOL,
815                             CS42L43_HP_PATH_VOL_RAMP_SHIFT,
816                             cs42l43_headphone_ramp_text);
817
818 static const char * const cs42l43_tone_freq_text[] = {
819         "1kHz", "2kHz", "4kHz", "6kHz", "8kHz",
820 };
821
822 static SOC_ENUM_SINGLE_DECL(cs42l43_tone1_freq, CS42L43_TONE_CH1_CTRL,
823                             CS42L43_TONE_FREQ_SHIFT, cs42l43_tone_freq_text);
824
825 static SOC_ENUM_SINGLE_DECL(cs42l43_tone2_freq, CS42L43_TONE_CH2_CTRL,
826                             CS42L43_TONE_FREQ_SHIFT, cs42l43_tone_freq_text);
827
828 static const char * const cs42l43_mixer_texts[] = {
829         "None",
830         "Tone Generator 1", "Tone Generator 2",
831         "Decimator 1", "Decimator 2", "Decimator 3", "Decimator 4",
832         "ASPRX1", "ASPRX2", "ASPRX3", "ASPRX4", "ASPRX5", "ASPRX6",
833         "DP5RX1", "DP5RX2", "DP6RX1", "DP6RX2", "DP7RX1", "DP7RX2",
834         "ASRC INT1", "ASRC INT2", "ASRC INT3", "ASRC INT4",
835         "ASRC DEC1", "ASRC DEC2", "ASRC DEC3", "ASRC DEC4",
836         "ISRC1 INT1", "ISRC1 INT2",
837         "ISRC1 DEC1", "ISRC1 DEC2",
838         "ISRC2 INT1", "ISRC2 INT2",
839         "ISRC2 DEC1", "ISRC2 DEC2",
840         "EQ1", "EQ2",
841 };
842
843 static const unsigned int cs42l43_mixer_values[] = {
844         0x00, // None
845         0x04, 0x05, // Tone Generator 1, 2
846         0x10, 0x11, 0x12, 0x13, // Decimator 1, 2, 3, 4
847         0x20, 0x21, 0x22, 0x23, 0x24, 0x25, // ASPRX1,2,3,4,5,6
848         0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, // DP5, 6, 7RX1, 2
849         0x40, 0x41, 0x42, 0x43, // ASRC INT1, 2, 3, 4
850         0x44, 0x45, 0x46, 0x47, // ASRC DEC1, 2, 3, 4
851         0x50, 0x51, // ISRC1 INT1, 2
852         0x52, 0x53, // ISRC1 DEC1, 2
853         0x54, 0x55, // ISRC2 INT1, 2
854         0x56, 0x57, // ISRC2 DEC1, 2
855         0x58, 0x59, // EQ1, 2
856 };
857
858 CS42L43_DECL_MUX(asptx1, CS42L43_ASPTX1_INPUT);
859 CS42L43_DECL_MUX(asptx2, CS42L43_ASPTX2_INPUT);
860 CS42L43_DECL_MUX(asptx3, CS42L43_ASPTX3_INPUT);
861 CS42L43_DECL_MUX(asptx4, CS42L43_ASPTX4_INPUT);
862 CS42L43_DECL_MUX(asptx5, CS42L43_ASPTX5_INPUT);
863 CS42L43_DECL_MUX(asptx6, CS42L43_ASPTX6_INPUT);
864
865 CS42L43_DECL_MUX(dp1tx1, CS42L43_SWIRE_DP1_CH1_INPUT);
866 CS42L43_DECL_MUX(dp1tx2, CS42L43_SWIRE_DP1_CH2_INPUT);
867 CS42L43_DECL_MUX(dp1tx3, CS42L43_SWIRE_DP1_CH3_INPUT);
868 CS42L43_DECL_MUX(dp1tx4, CS42L43_SWIRE_DP1_CH4_INPUT);
869 CS42L43_DECL_MUX(dp2tx1, CS42L43_SWIRE_DP2_CH1_INPUT);
870 CS42L43_DECL_MUX(dp2tx2, CS42L43_SWIRE_DP2_CH2_INPUT);
871 CS42L43_DECL_MUX(dp3tx1, CS42L43_SWIRE_DP3_CH1_INPUT);
872 CS42L43_DECL_MUX(dp3tx2, CS42L43_SWIRE_DP3_CH2_INPUT);
873 CS42L43_DECL_MUX(dp4tx1, CS42L43_SWIRE_DP4_CH1_INPUT);
874 CS42L43_DECL_MUX(dp4tx2, CS42L43_SWIRE_DP4_CH2_INPUT);
875
876 CS42L43_DECL_MUX(asrcint1, CS42L43_ASRC_INT1_INPUT1);
877 CS42L43_DECL_MUX(asrcint2, CS42L43_ASRC_INT2_INPUT1);
878 CS42L43_DECL_MUX(asrcint3, CS42L43_ASRC_INT3_INPUT1);
879 CS42L43_DECL_MUX(asrcint4, CS42L43_ASRC_INT4_INPUT1);
880 CS42L43_DECL_MUX(asrcdec1, CS42L43_ASRC_DEC1_INPUT1);
881 CS42L43_DECL_MUX(asrcdec2, CS42L43_ASRC_DEC2_INPUT1);
882 CS42L43_DECL_MUX(asrcdec3, CS42L43_ASRC_DEC3_INPUT1);
883 CS42L43_DECL_MUX(asrcdec4, CS42L43_ASRC_DEC4_INPUT1);
884
885 CS42L43_DECL_MUX(isrc1int1, CS42L43_ISRC1INT1_INPUT1);
886 CS42L43_DECL_MUX(isrc1int2, CS42L43_ISRC1INT2_INPUT1);
887 CS42L43_DECL_MUX(isrc1dec1, CS42L43_ISRC1DEC1_INPUT1);
888 CS42L43_DECL_MUX(isrc1dec2, CS42L43_ISRC1DEC2_INPUT1);
889 CS42L43_DECL_MUX(isrc2int1, CS42L43_ISRC2INT1_INPUT1);
890 CS42L43_DECL_MUX(isrc2int2, CS42L43_ISRC2INT2_INPUT1);
891 CS42L43_DECL_MUX(isrc2dec1, CS42L43_ISRC2DEC1_INPUT1);
892 CS42L43_DECL_MUX(isrc2dec2, CS42L43_ISRC2DEC2_INPUT1);
893
894 CS42L43_DECL_MUX(spdif1, CS42L43_SPDIF1_INPUT1);
895 CS42L43_DECL_MUX(spdif2, CS42L43_SPDIF2_INPUT1);
896
897 CS42L43_DECL_MIXER(eq1, CS42L43_EQ1MIX_INPUT1);
898 CS42L43_DECL_MIXER(eq2, CS42L43_EQ2MIX_INPUT1);
899
900 CS42L43_DECL_MIXER(amp1, CS42L43_AMP1MIX_INPUT1);
901 CS42L43_DECL_MIXER(amp2, CS42L43_AMP2MIX_INPUT1);
902
903 CS42L43_DECL_MIXER(amp3, CS42L43_AMP3MIX_INPUT1);
904 CS42L43_DECL_MIXER(amp4, CS42L43_AMP4MIX_INPUT1);
905
906 static int cs42l43_dapm_get_volsw(struct snd_kcontrol *kcontrol,
907                                   struct snd_ctl_elem_value *ucontrol)
908 {
909         struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
910         struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
911         int ret;
912
913         snd_soc_dapm_mutex_lock(dapm);
914         ret = snd_soc_get_volsw(kcontrol, ucontrol);
915         snd_soc_dapm_mutex_unlock(dapm);
916
917         return ret;
918 }
919
920 static int cs42l43_dapm_put_volsw(struct snd_kcontrol *kcontrol,
921                                   struct snd_ctl_elem_value *ucontrol)
922 {
923         struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
924         struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
925         int ret;
926
927         snd_soc_dapm_mutex_lock(dapm);
928         ret = snd_soc_put_volsw(kcontrol, ucontrol);
929         snd_soc_dapm_mutex_unlock(dapm);
930
931         return ret;
932 }
933
934 static int cs42l43_dapm_get_enum(struct snd_kcontrol *kcontrol,
935                                  struct snd_ctl_elem_value *ucontrol)
936 {
937         struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
938         struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
939         int ret;
940
941         snd_soc_dapm_mutex_lock(dapm);
942         ret = snd_soc_get_enum_double(kcontrol, ucontrol);
943         snd_soc_dapm_mutex_unlock(dapm);
944
945         return ret;
946 }
947
948 static int cs42l43_dapm_put_enum(struct snd_kcontrol *kcontrol,
949                                  struct snd_ctl_elem_value *ucontrol)
950 {
951         struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
952         struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
953         int ret;
954
955         snd_soc_dapm_mutex_lock(dapm);
956         ret = snd_soc_put_enum_double(kcontrol, ucontrol);
957         snd_soc_dapm_mutex_unlock(dapm);
958
959         return ret;
960 }
961
962 static int cs42l43_eq_get(struct snd_kcontrol *kcontrol,
963                           struct snd_ctl_elem_value *ucontrol)
964 {
965         struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
966         struct cs42l43_codec *priv = snd_soc_component_get_drvdata(component);
967
968         memcpy(ucontrol->value.integer.value, priv->eq_coeffs, sizeof(priv->eq_coeffs));
969
970         return 0;
971 }
972
973 static int cs42l43_eq_put(struct snd_kcontrol *kcontrol,
974                           struct snd_ctl_elem_value *ucontrol)
975 {
976         struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
977         struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
978         struct cs42l43_codec *priv = snd_soc_component_get_drvdata(component);
979
980         snd_soc_dapm_mutex_lock(dapm);
981
982         memcpy(priv->eq_coeffs, ucontrol->value.integer.value, sizeof(priv->eq_coeffs));
983
984         snd_soc_dapm_mutex_unlock(dapm);
985
986         return 0;
987 }
988
989 static void cs42l43_spk_vu_sync(struct cs42l43_codec *priv)
990 {
991         struct cs42l43 *cs42l43 = priv->core;
992
993         mutex_lock(&priv->spk_vu_lock);
994
995         regmap_update_bits(cs42l43->regmap, CS42L43_INTP_VOLUME_CTRL1,
996                            CS42L43_AMP1_2_VU_MASK, CS42L43_AMP1_2_VU_MASK);
997         regmap_update_bits(cs42l43->regmap, CS42L43_INTP_VOLUME_CTRL1,
998                            CS42L43_AMP1_2_VU_MASK, 0);
999
1000         mutex_unlock(&priv->spk_vu_lock);
1001 }
1002
1003 static int cs42l43_shutter_get(struct cs42l43_codec *priv, unsigned int shift)
1004 {
1005         struct cs42l43 *cs42l43 = priv->core;
1006         unsigned int val;
1007         int ret;
1008
1009         ret = pm_runtime_resume_and_get(priv->dev);
1010         if (ret) {
1011                 dev_err(priv->dev, "Failed to resume for shutters: %d\n", ret);
1012                 return ret;
1013         }
1014
1015         /*
1016          * SHUTTER_CONTROL is a mix of volatile and non-volatile bits, so must
1017          * be cached for the non-volatiles, so drop it from the cache here so
1018          * we force a read.
1019          */
1020         ret = regcache_drop_region(cs42l43->regmap, CS42L43_SHUTTER_CONTROL,
1021                                    CS42L43_SHUTTER_CONTROL);
1022         if (ret) {
1023                 dev_err(priv->dev, "Failed to drop shutter from cache: %d\n", ret);
1024                 goto error;
1025         }
1026
1027         ret = regmap_read(cs42l43->regmap, CS42L43_SHUTTER_CONTROL, &val);
1028         if (ret) {
1029                 dev_err(priv->dev, "Failed to check shutter status: %d\n", ret);
1030                 goto error;
1031         }
1032
1033         ret = !(val & BIT(shift));
1034
1035         dev_dbg(priv->dev, "%s shutter is %s\n",
1036                 BIT(shift) == CS42L43_STATUS_MIC_SHUTTER_MUTE_MASK ? "Mic" : "Speaker",
1037                 ret ? "open" : "closed");
1038
1039 error:
1040         pm_runtime_mark_last_busy(priv->dev);
1041         pm_runtime_put_autosuspend(priv->dev);
1042
1043         return ret;
1044 }
1045
1046 static int cs42l43_decim_get(struct snd_kcontrol *kcontrol,
1047                              struct snd_ctl_elem_value *ucontrol)
1048 {
1049         struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
1050         struct cs42l43_codec *priv = snd_soc_component_get_drvdata(component);
1051         int ret;
1052
1053         ret = cs42l43_shutter_get(priv, CS42L43_STATUS_MIC_SHUTTER_MUTE_SHIFT);
1054         if (ret < 0)
1055                 return ret;
1056         else if (!ret)
1057                 ucontrol->value.integer.value[0] = ret;
1058         else
1059                 ret = cs42l43_dapm_get_volsw(kcontrol, ucontrol);
1060
1061         return ret;
1062 }
1063
1064 static int cs42l43_spk_get(struct snd_kcontrol *kcontrol,
1065                            struct snd_ctl_elem_value *ucontrol)
1066 {
1067         struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
1068         struct cs42l43_codec *priv = snd_soc_component_get_drvdata(component);
1069         int ret;
1070
1071         ret = cs42l43_shutter_get(priv, CS42L43_STATUS_SPK_SHUTTER_MUTE_SHIFT);
1072         if (ret < 0)
1073                 return ret;
1074         else if (!ret)
1075                 ucontrol->value.integer.value[0] = ret;
1076         else
1077                 ret = snd_soc_get_volsw(kcontrol, ucontrol);
1078
1079         return ret;
1080 }
1081
1082 static int cs42l43_spk_put(struct snd_kcontrol *kcontrol,
1083                            struct snd_ctl_elem_value *ucontrol)
1084 {
1085         struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
1086         struct cs42l43_codec *priv = snd_soc_component_get_drvdata(component);
1087         int ret;
1088
1089         ret = snd_soc_put_volsw(kcontrol, ucontrol);
1090         if (ret > 0)
1091                 cs42l43_spk_vu_sync(priv);
1092
1093         return ret;
1094 }
1095
1096 static const struct snd_kcontrol_new cs42l43_controls[] = {
1097         SOC_ENUM_EXT("Jack Override", cs42l43_jack_enum,
1098                      cs42l43_jack_get, cs42l43_jack_put),
1099
1100         SOC_DOUBLE_R_SX_TLV("ADC Volume", CS42L43_ADC_B_CTRL1, CS42L43_ADC_B_CTRL2,
1101                             CS42L43_ADC_PGA_GAIN_SHIFT,
1102                             0xF, 5, cs42l43_adc_tlv),
1103
1104         SOC_DOUBLE("PDM1 Invert Switch", CS42L43_DMIC_PDM_CTRL,
1105                    CS42L43_PDM1L_INV_SHIFT, CS42L43_PDM1R_INV_SHIFT, 1, 0),
1106         SOC_DOUBLE("PDM2 Invert Switch", CS42L43_DMIC_PDM_CTRL,
1107                    CS42L43_PDM2L_INV_SHIFT, CS42L43_PDM2R_INV_SHIFT, 1, 0),
1108         SOC_ENUM("PDM1 Clock", cs42l43_pdm1_clk),
1109         SOC_ENUM("PDM2 Clock", cs42l43_pdm2_clk),
1110
1111         SOC_SINGLE("Decimator 1 WNF Switch", CS42L43_DECIM_HPF_WNF_CTRL1,
1112                    CS42L43_DECIM_WNF_EN_SHIFT, 1, 0),
1113         SOC_SINGLE("Decimator 2 WNF Switch", CS42L43_DECIM_HPF_WNF_CTRL2,
1114                    CS42L43_DECIM_WNF_EN_SHIFT, 1, 0),
1115         SOC_SINGLE("Decimator 3 WNF Switch", CS42L43_DECIM_HPF_WNF_CTRL3,
1116                    CS42L43_DECIM_WNF_EN_SHIFT, 1, 0),
1117         SOC_SINGLE("Decimator 4 WNF Switch", CS42L43_DECIM_HPF_WNF_CTRL4,
1118                    CS42L43_DECIM_WNF_EN_SHIFT, 1, 0),
1119
1120         SOC_ENUM("Decimator 1 WNF Corner Frequency", cs42l43_dec1_wnf_corner),
1121         SOC_ENUM("Decimator 2 WNF Corner Frequency", cs42l43_dec2_wnf_corner),
1122         SOC_ENUM("Decimator 3 WNF Corner Frequency", cs42l43_dec3_wnf_corner),
1123         SOC_ENUM("Decimator 4 WNF Corner Frequency", cs42l43_dec4_wnf_corner),
1124
1125         SOC_SINGLE("Decimator 1 HPF Switch", CS42L43_DECIM_HPF_WNF_CTRL1,
1126                    CS42L43_DECIM_HPF_EN_SHIFT, 1, 0),
1127         SOC_SINGLE("Decimator 2 HPF Switch", CS42L43_DECIM_HPF_WNF_CTRL2,
1128                    CS42L43_DECIM_HPF_EN_SHIFT, 1, 0),
1129         SOC_SINGLE("Decimator 3 HPF Switch", CS42L43_DECIM_HPF_WNF_CTRL3,
1130                    CS42L43_DECIM_HPF_EN_SHIFT, 1, 0),
1131         SOC_SINGLE("Decimator 4 HPF Switch", CS42L43_DECIM_HPF_WNF_CTRL4,
1132                    CS42L43_DECIM_HPF_EN_SHIFT, 1, 0),
1133
1134         SOC_ENUM("Decimator 1 HPF Corner Frequency", cs42l43_dec1_hpf_corner),
1135         SOC_ENUM("Decimator 2 HPF Corner Frequency", cs42l43_dec2_hpf_corner),
1136         SOC_ENUM("Decimator 3 HPF Corner Frequency", cs42l43_dec3_hpf_corner),
1137         SOC_ENUM("Decimator 4 HPF Corner Frequency", cs42l43_dec4_hpf_corner),
1138
1139         SOC_SINGLE_TLV("Decimator 1 Volume", CS42L43_DECIM_VOL_CTRL_CH1_CH2,
1140                        CS42L43_DECIM1_VOL_SHIFT, 0xBF, 0, cs42l43_dec_tlv),
1141         SOC_SINGLE_EXT("Decimator 1 Switch", CS42L43_DECIM_VOL_CTRL_CH1_CH2,
1142                        CS42L43_DECIM1_MUTE_SHIFT, 1, 1,
1143                        cs42l43_decim_get, cs42l43_dapm_put_volsw),
1144         SOC_SINGLE_TLV("Decimator 2 Volume", CS42L43_DECIM_VOL_CTRL_CH1_CH2,
1145                        CS42L43_DECIM2_VOL_SHIFT, 0xBF, 0, cs42l43_dec_tlv),
1146         SOC_SINGLE_EXT("Decimator 2 Switch", CS42L43_DECIM_VOL_CTRL_CH1_CH2,
1147                        CS42L43_DECIM2_MUTE_SHIFT, 1, 1,
1148                        cs42l43_decim_get, cs42l43_dapm_put_volsw),
1149         SOC_SINGLE_TLV("Decimator 3 Volume", CS42L43_DECIM_VOL_CTRL_CH3_CH4,
1150                        CS42L43_DECIM3_VOL_SHIFT, 0xBF, 0, cs42l43_dec_tlv),
1151         SOC_SINGLE_EXT("Decimator 3 Switch", CS42L43_DECIM_VOL_CTRL_CH3_CH4,
1152                        CS42L43_DECIM3_MUTE_SHIFT, 1, 1,
1153                        cs42l43_decim_get, cs42l43_dapm_put_volsw),
1154         SOC_SINGLE_TLV("Decimator 4 Volume", CS42L43_DECIM_VOL_CTRL_CH3_CH4,
1155                        CS42L43_DECIM4_VOL_SHIFT, 0xBF, 0, cs42l43_dec_tlv),
1156         SOC_SINGLE_EXT("Decimator 4 Switch", CS42L43_DECIM_VOL_CTRL_CH3_CH4,
1157                        CS42L43_DECIM4_MUTE_SHIFT, 1, 1,
1158                        cs42l43_decim_get, cs42l43_dapm_put_volsw),
1159
1160         SOC_ENUM_EXT("Decimator 1 Ramp Up", cs42l43_dec1_ramp_up,
1161                      cs42l43_dapm_get_enum, cs42l43_dapm_put_enum),
1162         SOC_ENUM_EXT("Decimator 1 Ramp Down", cs42l43_dec1_ramp_down,
1163                      cs42l43_dapm_get_enum, cs42l43_dapm_put_enum),
1164         SOC_ENUM_EXT("Decimator 2 Ramp Up", cs42l43_dec2_ramp_up,
1165                      cs42l43_dapm_get_enum, cs42l43_dapm_put_enum),
1166         SOC_ENUM_EXT("Decimator 2 Ramp Down", cs42l43_dec2_ramp_down,
1167                      cs42l43_dapm_get_enum, cs42l43_dapm_put_enum),
1168         SOC_ENUM_EXT("Decimator 3 Ramp Up", cs42l43_dec3_ramp_up,
1169                      cs42l43_dapm_get_enum, cs42l43_dapm_put_enum),
1170         SOC_ENUM_EXT("Decimator 3 Ramp Down", cs42l43_dec3_ramp_down,
1171                      cs42l43_dapm_get_enum, cs42l43_dapm_put_enum),
1172         SOC_ENUM_EXT("Decimator 4 Ramp Up", cs42l43_dec4_ramp_up,
1173                      cs42l43_dapm_get_enum, cs42l43_dapm_put_enum),
1174         SOC_ENUM_EXT("Decimator 4 Ramp Down", cs42l43_dec4_ramp_down,
1175                      cs42l43_dapm_get_enum, cs42l43_dapm_put_enum),
1176
1177         SOC_DOUBLE_R_EXT("Speaker Digital Switch",
1178                          CS42L43_INTP_VOLUME_CTRL1, CS42L43_INTP_VOLUME_CTRL2,
1179                          CS42L43_AMP_MUTE_SHIFT, 1, 1,
1180                          cs42l43_spk_get, cs42l43_spk_put),
1181
1182         SOC_DOUBLE_R_EXT_TLV("Speaker Digital Volume",
1183                              CS42L43_INTP_VOLUME_CTRL1, CS42L43_INTP_VOLUME_CTRL2,
1184                              CS42L43_AMP_VOL_SHIFT,
1185                              0xBF, 0, snd_soc_get_volsw, cs42l43_spk_put,
1186                              cs42l43_speaker_tlv),
1187
1188         SOC_ENUM("Speaker Ramp Up", cs42l43_speaker_ramp_up),
1189         SOC_ENUM("Speaker Ramp Down", cs42l43_speaker_ramp_down),
1190
1191         CS42L43_MIXER_VOLUMES("Speaker L", CS42L43_AMP1MIX_INPUT1),
1192         CS42L43_MIXER_VOLUMES("Speaker R", CS42L43_AMP2MIX_INPUT1),
1193
1194         SOC_DOUBLE_SX_TLV("Headphone Digital Volume", CS42L43_HPPATHVOL,
1195                           CS42L43_AMP3_PATH_VOL_SHIFT, CS42L43_AMP4_PATH_VOL_SHIFT,
1196                           0x11B, 229, cs42l43_headphone_tlv),
1197
1198         SOC_DOUBLE("Headphone Invert Switch", CS42L43_DACCNFG1,
1199                    CS42L43_AMP3_INV_SHIFT, CS42L43_AMP4_INV_SHIFT, 1, 0),
1200
1201         SOC_SINGLE("Headphone Zero Cross Switch", CS42L43_PGAVOL,
1202                    CS42L43_HP_PATH_VOL_ZC_SHIFT, 1, 0),
1203         SOC_SINGLE("Headphone Ramp Switch", CS42L43_PGAVOL,
1204                    CS42L43_HP_PATH_VOL_SFT_SHIFT, 1, 0),
1205         SOC_ENUM("Headphone Ramp Rate", cs42l43_headphone_ramp),
1206
1207         CS42L43_MIXER_VOLUMES("Headphone L", CS42L43_AMP3MIX_INPUT1),
1208         CS42L43_MIXER_VOLUMES("Headphone R", CS42L43_AMP4MIX_INPUT1),
1209
1210         SOC_ENUM("Tone 1 Frequency", cs42l43_tone1_freq),
1211         SOC_ENUM("Tone 2 Frequency", cs42l43_tone2_freq),
1212
1213         SOC_DOUBLE_EXT("EQ Switch",
1214                        CS42L43_MUTE_EQ_IN0, CS42L43_MUTE_EQ_CH1_SHIFT,
1215                        CS42L43_MUTE_EQ_CH2_SHIFT, 1, 1,
1216                        cs42l43_dapm_get_volsw, cs42l43_dapm_put_volsw),
1217
1218         SND_SOC_BYTES_E("EQ Coefficients", 0, CS42L43_N_EQ_COEFFS,
1219                         cs42l43_eq_get, cs42l43_eq_put),
1220
1221         CS42L43_MIXER_VOLUMES("EQ1", CS42L43_EQ1MIX_INPUT1),
1222         CS42L43_MIXER_VOLUMES("EQ2", CS42L43_EQ2MIX_INPUT1),
1223 };
1224
1225 static int cs42l43_eq_ev(struct snd_soc_dapm_widget *w,
1226                          struct snd_kcontrol *kcontrol, int event)
1227 {
1228         struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
1229         struct cs42l43_codec *priv = snd_soc_component_get_drvdata(component);
1230         struct cs42l43 *cs42l43 = priv->core;
1231         unsigned int val;
1232         int i, ret;
1233
1234         switch (event) {
1235         case SND_SOC_DAPM_PRE_PMU:
1236                 regmap_update_bits(cs42l43->regmap, CS42L43_MUTE_EQ_IN0,
1237                                    CS42L43_MUTE_EQ_CH1_MASK | CS42L43_MUTE_EQ_CH2_MASK,
1238                                    CS42L43_MUTE_EQ_CH1_MASK | CS42L43_MUTE_EQ_CH2_MASK);
1239
1240                 regmap_update_bits(cs42l43->regmap, CS42L43_COEFF_RD_WR0,
1241                                    CS42L43_WRITE_MODE_MASK, CS42L43_WRITE_MODE_MASK);
1242
1243                 for (i = 0; i < CS42L43_N_EQ_COEFFS; i++)
1244                         regmap_write(cs42l43->regmap, CS42L43_COEFF_DATA_IN0,
1245                                      priv->eq_coeffs[i]);
1246
1247                 regmap_update_bits(cs42l43->regmap, CS42L43_COEFF_RD_WR0,
1248                                    CS42L43_WRITE_MODE_MASK, 0);
1249
1250                 return 0;
1251         case SND_SOC_DAPM_POST_PMU:
1252                 ret = regmap_read_poll_timeout(cs42l43->regmap, CS42L43_INIT_DONE0,
1253                                                val, (val & CS42L43_INITIALIZE_DONE_MASK),
1254                                                2000, 10000);
1255                 if (ret)
1256                         dev_err(priv->dev, "Failed to start EQs: %d\n", ret);
1257
1258                 regmap_update_bits(cs42l43->regmap, CS42L43_MUTE_EQ_IN0,
1259                                    CS42L43_MUTE_EQ_CH1_MASK | CS42L43_MUTE_EQ_CH2_MASK, 0);
1260                 return ret;
1261         default:
1262                 return 0;
1263         }
1264 }
1265
1266 struct cs42l43_pll_config {
1267         unsigned int freq;
1268
1269         unsigned int div;
1270         unsigned int mode;
1271         unsigned int cal;
1272 };
1273
1274 static const struct cs42l43_pll_config cs42l43_pll_configs[] = {
1275         { 2400000, 0x50000000, 0x1, 0xA4 },
1276         { 3000000, 0x40000000, 0x1, 0x83 },
1277         { 3072000, 0x40000000, 0x3, 0x80 },
1278 };
1279
1280 static int cs42l43_set_pll(struct cs42l43_codec *priv, unsigned int src,
1281                            unsigned int freq)
1282 {
1283         struct cs42l43 *cs42l43 = priv->core;
1284
1285         lockdep_assert_held(&cs42l43->pll_lock);
1286
1287         if (priv->refclk_src == src && priv->refclk_freq == freq)
1288                 return 0;
1289
1290         if (regmap_test_bits(cs42l43->regmap, CS42L43_CTRL_REG, CS42L43_PLL_EN_MASK)) {
1291                 dev_err(priv->dev, "PLL active, can't change configuration\n");
1292                 return -EBUSY;
1293         }
1294
1295         switch (src) {
1296         case CS42L43_SYSCLK_MCLK:
1297         case CS42L43_SYSCLK_SDW:
1298                 dev_dbg(priv->dev, "Source PLL from %s at %uHz\n",
1299                         src ? "SoundWire" : "MCLK", freq);
1300
1301                 priv->refclk_src = src;
1302                 priv->refclk_freq = freq;
1303
1304                 return 0;
1305         default:
1306                 dev_err(priv->dev, "Invalid PLL source: 0x%x\n", src);
1307                 return -EINVAL;
1308         }
1309 }
1310
1311 static int cs42l43_enable_pll(struct cs42l43_codec *priv)
1312 {
1313         static const struct reg_sequence enable_seq[] = {
1314                 { CS42L43_OSC_DIV_SEL, 0x0, },
1315                 { CS42L43_MCLK_SRC_SEL, CS42L43_OSC_PLL_MCLK_SEL_MASK, 5, },
1316         };
1317         struct cs42l43 *cs42l43 = priv->core;
1318         const struct cs42l43_pll_config *config = NULL;
1319         unsigned int div = 0;
1320         unsigned int freq = priv->refclk_freq;
1321         unsigned long time_left;
1322
1323         lockdep_assert_held(&cs42l43->pll_lock);
1324
1325         if (priv->refclk_src == CS42L43_SYSCLK_SDW) {
1326                 if (!freq)
1327                         freq = cs42l43->sdw_freq;
1328                 else if (!cs42l43->sdw_freq)
1329                         cs42l43->sdw_freq = freq;
1330         }
1331
1332         dev_dbg(priv->dev, "Enabling PLL at %uHz\n", freq);
1333
1334         while (freq > cs42l43_pll_configs[ARRAY_SIZE(cs42l43_pll_configs) - 1].freq) {
1335                 div++;
1336                 freq /= 2;
1337         }
1338
1339         if (div <= CS42L43_PLL_REFCLK_DIV_MASK) {
1340                 int i;
1341
1342                 for (i = 0; i < ARRAY_SIZE(cs42l43_pll_configs); i++) {
1343                         if (freq == cs42l43_pll_configs[i].freq) {
1344                                 config = &cs42l43_pll_configs[i];
1345                                 break;
1346                         }
1347                 }
1348         }
1349
1350         if (!config) {
1351                 dev_err(priv->dev, "No suitable PLL config: 0x%x, %uHz\n", div, freq);
1352                 return -EINVAL;
1353         }
1354
1355         regmap_update_bits(cs42l43->regmap, CS42L43_PLL_CONTROL,
1356                            CS42L43_PLL_REFCLK_DIV_MASK | CS42L43_PLL_REFCLK_SRC_MASK,
1357                            div << CS42L43_PLL_REFCLK_DIV_SHIFT |
1358                            priv->refclk_src << CS42L43_PLL_REFCLK_SRC_SHIFT);
1359         regmap_write(cs42l43->regmap, CS42L43_FDIV_FRAC, config->div);
1360         regmap_update_bits(cs42l43->regmap, CS42L43_CTRL_REG,
1361                            CS42L43_PLL_MODE_BYPASS_500_MASK |
1362                            CS42L43_PLL_MODE_BYPASS_1029_MASK,
1363                            config->mode << CS42L43_PLL_MODE_BYPASS_1029_SHIFT);
1364         regmap_update_bits(cs42l43->regmap, CS42L43_CAL_RATIO,
1365                            CS42L43_PLL_CAL_RATIO_MASK, config->cal);
1366         regmap_update_bits(cs42l43->regmap, CS42L43_PLL_CONTROL,
1367                            CS42L43_PLL_REFCLK_EN_MASK, CS42L43_PLL_REFCLK_EN_MASK);
1368
1369         reinit_completion(&priv->pll_ready);
1370
1371         regmap_update_bits(cs42l43->regmap, CS42L43_CTRL_REG,
1372                            CS42L43_PLL_EN_MASK, CS42L43_PLL_EN_MASK);
1373
1374         time_left = wait_for_completion_timeout(&priv->pll_ready,
1375                                                 msecs_to_jiffies(CS42L43_PLL_TIMEOUT_MS));
1376         if (!time_left) {
1377                 regmap_update_bits(cs42l43->regmap, CS42L43_CTRL_REG,
1378                                    CS42L43_PLL_EN_MASK, 0);
1379                 regmap_update_bits(cs42l43->regmap, CS42L43_PLL_CONTROL,
1380                                    CS42L43_PLL_REFCLK_EN_MASK, 0);
1381
1382                 dev_err(priv->dev, "Timeout out waiting for PLL\n");
1383                 return -ETIMEDOUT;
1384         }
1385
1386         if (priv->refclk_src == CS42L43_SYSCLK_SDW)
1387                 cs42l43->sdw_pll_active = true;
1388
1389         dev_dbg(priv->dev, "PLL locked in %ums\n", 200 - jiffies_to_msecs(time_left));
1390
1391         /*
1392          * Reads are not allowed over Soundwire without OSC_DIV2_EN or the PLL,
1393          * but you can not change to PLL with OSC_DIV2_EN set. So ensure the whole
1394          * change over happens under the regmap lock to prevent any reads.
1395          */
1396         regmap_multi_reg_write(cs42l43->regmap, enable_seq, ARRAY_SIZE(enable_seq));
1397
1398         return 0;
1399 }
1400
1401 static int cs42l43_disable_pll(struct cs42l43_codec *priv)
1402 {
1403         static const struct reg_sequence disable_seq[] = {
1404                 { CS42L43_MCLK_SRC_SEL, 0x0, 5, },
1405                 { CS42L43_OSC_DIV_SEL, CS42L43_OSC_DIV2_EN_MASK, },
1406         };
1407         struct cs42l43 *cs42l43 = priv->core;
1408
1409         dev_dbg(priv->dev, "Disabling PLL\n");
1410
1411         lockdep_assert_held(&cs42l43->pll_lock);
1412
1413         regmap_multi_reg_write(cs42l43->regmap, disable_seq, ARRAY_SIZE(disable_seq));
1414         regmap_update_bits(cs42l43->regmap, CS42L43_CTRL_REG, CS42L43_PLL_EN_MASK, 0);
1415         regmap_update_bits(cs42l43->regmap, CS42L43_PLL_CONTROL,
1416                            CS42L43_PLL_REFCLK_EN_MASK, 0);
1417
1418         cs42l43->sdw_pll_active = false;
1419
1420         return 0;
1421 }
1422
1423 static int cs42l43_pll_ev(struct snd_soc_dapm_widget *w,
1424                           struct snd_kcontrol *kcontrol, int event)
1425 {
1426         struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
1427         struct cs42l43_codec *priv = snd_soc_component_get_drvdata(component);
1428         struct cs42l43 *cs42l43 = priv->core;
1429         int ret;
1430
1431         mutex_lock(&cs42l43->pll_lock);
1432
1433         switch (event) {
1434         case SND_SOC_DAPM_PRE_PMU:
1435                 if (priv->refclk_src == CS42L43_SYSCLK_MCLK) {
1436                         ret = clk_prepare_enable(priv->mclk);
1437                         if (ret) {
1438                                 dev_err(priv->dev, "Failed to enable MCLK: %d\n", ret);
1439                                 break;
1440                         }
1441                 }
1442
1443                 ret = cs42l43_enable_pll(priv);
1444                 break;
1445         case SND_SOC_DAPM_POST_PMD:
1446                 ret = cs42l43_disable_pll(priv);
1447
1448                 if (priv->refclk_src == CS42L43_SYSCLK_MCLK)
1449                         clk_disable_unprepare(priv->mclk);
1450                 break;
1451         default:
1452                 ret = 0;
1453                 break;
1454         }
1455
1456         mutex_unlock(&cs42l43->pll_lock);
1457
1458         return ret;
1459 }
1460
1461 static int cs42l43_dapm_wait_completion(struct completion *pmu, struct completion *pmd,
1462                                         int event, int timeout_ms)
1463 {
1464         unsigned long time_left;
1465
1466         switch (event) {
1467         case SND_SOC_DAPM_PRE_PMU:
1468                 reinit_completion(pmu);
1469                 return 0;
1470         case SND_SOC_DAPM_PRE_PMD:
1471                 reinit_completion(pmd);
1472                 return 0;
1473         case SND_SOC_DAPM_POST_PMU:
1474                 time_left = wait_for_completion_timeout(pmu, msecs_to_jiffies(timeout_ms));
1475                 break;
1476         case SND_SOC_DAPM_POST_PMD:
1477                 time_left = wait_for_completion_timeout(pmd, msecs_to_jiffies(timeout_ms));
1478                 break;
1479         default:
1480                 return 0;
1481         }
1482
1483         if (!time_left)
1484                 return -ETIMEDOUT;
1485         else
1486                 return 0;
1487 }
1488
1489 static int cs42l43_spkr_ev(struct snd_soc_dapm_widget *w,
1490                            struct snd_kcontrol *kcontrol, int event)
1491 {
1492         struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
1493         struct cs42l43_codec *priv = snd_soc_component_get_drvdata(component);
1494
1495         return cs42l43_dapm_wait_completion(&priv->spkr_startup,
1496                                             &priv->spkr_shutdown, event,
1497                                             CS42L43_SPK_TIMEOUT_MS);
1498 }
1499
1500 static int cs42l43_spkl_ev(struct snd_soc_dapm_widget *w,
1501                            struct snd_kcontrol *kcontrol, int event)
1502 {
1503         struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
1504         struct cs42l43_codec *priv = snd_soc_component_get_drvdata(component);
1505
1506         return cs42l43_dapm_wait_completion(&priv->spkl_startup,
1507                                             &priv->spkl_shutdown, event,
1508                                             CS42L43_SPK_TIMEOUT_MS);
1509 }
1510
1511 static int cs42l43_hp_ev(struct snd_soc_dapm_widget *w,
1512                          struct snd_kcontrol *kcontrol, int event)
1513 {
1514         struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
1515         struct cs42l43_codec *priv = snd_soc_component_get_drvdata(component);
1516         struct cs42l43 *cs42l43 = priv->core;
1517         unsigned int mask = 1 << w->shift;
1518         unsigned int val = 0;
1519         int ret;
1520
1521         switch (event) {
1522         case SND_SOC_DAPM_PRE_PMU:
1523                 val = mask;
1524                 fallthrough;
1525         case SND_SOC_DAPM_PRE_PMD:
1526                 priv->hp_ena &= ~mask;
1527                 priv->hp_ena |= val;
1528
1529                 ret = cs42l43_dapm_wait_completion(&priv->hp_startup,
1530                                                    &priv->hp_shutdown, event,
1531                                                    CS42L43_HP_TIMEOUT_MS);
1532                 if (ret)
1533                         return ret;
1534
1535                 if (!priv->load_detect_running && !priv->hp_ilimited)
1536                         regmap_update_bits(cs42l43->regmap, CS42L43_BLOCK_EN8,
1537                                            mask, val);
1538                 break;
1539         case SND_SOC_DAPM_POST_PMU:
1540         case SND_SOC_DAPM_POST_PMD:
1541                 if (priv->load_detect_running || priv->hp_ilimited)
1542                         break;
1543
1544                 ret = cs42l43_dapm_wait_completion(&priv->hp_startup,
1545                                                    &priv->hp_shutdown, event,
1546                                                    CS42L43_HP_TIMEOUT_MS);
1547                 if (ret)
1548                         return ret;
1549                 break;
1550         default:
1551                 break;
1552         }
1553
1554         return 0;
1555 }
1556
1557 static int cs42l43_mic_ev(struct snd_soc_dapm_widget *w,
1558                           struct snd_kcontrol *kcontrol, int event)
1559 {
1560         struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
1561         struct cs42l43_codec *priv = snd_soc_component_get_drvdata(component);
1562         struct cs42l43 *cs42l43 = priv->core;
1563         unsigned int reg, ramp, mute;
1564         unsigned int *val;
1565         int ret;
1566
1567         switch (w->shift) {
1568         case CS42L43_ADC1_EN_SHIFT:
1569         case CS42L43_PDM1_DIN_L_EN_SHIFT:
1570                 reg = CS42L43_DECIM_VOL_CTRL_CH1_CH2;
1571                 ramp = CS42L43_DECIM1_VD_RAMP_MASK;
1572                 mute = CS42L43_DECIM1_MUTE_MASK;
1573                 val = &priv->decim_cache[0];
1574                 break;
1575         case CS42L43_ADC2_EN_SHIFT:
1576         case CS42L43_PDM1_DIN_R_EN_SHIFT:
1577                 reg = CS42L43_DECIM_VOL_CTRL_CH1_CH2;
1578                 ramp = CS42L43_DECIM2_VD_RAMP_MASK;
1579                 mute = CS42L43_DECIM2_MUTE_MASK;
1580                 val = &priv->decim_cache[1];
1581                 break;
1582         case CS42L43_PDM2_DIN_L_EN_SHIFT:
1583                 reg = CS42L43_DECIM_VOL_CTRL_CH3_CH4;
1584                 ramp  = CS42L43_DECIM3_VD_RAMP_MASK;
1585                 mute = CS42L43_DECIM3_MUTE_MASK;
1586                 val = &priv->decim_cache[2];
1587                 break;
1588         case CS42L43_PDM2_DIN_R_EN_SHIFT:
1589                 reg = CS42L43_DECIM_VOL_CTRL_CH3_CH4;
1590                 ramp = CS42L43_DECIM4_VD_RAMP_MASK;
1591                 mute = CS42L43_DECIM4_MUTE_MASK;
1592                 val = &priv->decim_cache[3];
1593                 break;
1594         default:
1595                 dev_err(priv->dev, "Invalid microphone shift: %d\n", w->shift);
1596                 return -EINVAL;
1597         }
1598
1599         switch (event) {
1600         case SND_SOC_DAPM_PRE_PMU:
1601                 ret = regmap_read(cs42l43->regmap, reg, val);
1602                 if (ret) {
1603                         dev_err(priv->dev,
1604                                 "Failed to cache decimator settings: %d\n",
1605                                 ret);
1606                         return ret;
1607                 }
1608
1609                 regmap_update_bits(cs42l43->regmap, reg, mute | ramp, mute);
1610                 break;
1611         case SND_SOC_DAPM_POST_PMU:
1612                 regmap_update_bits(cs42l43->regmap, reg, mute | ramp, *val);
1613                 break;
1614         default:
1615                 break;
1616         }
1617
1618         return 0;
1619 }
1620
1621 static int cs42l43_adc_ev(struct snd_soc_dapm_widget *w,
1622                           struct snd_kcontrol *kcontrol, int event)
1623 {
1624         struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
1625         struct cs42l43_codec *priv = snd_soc_component_get_drvdata(component);
1626         struct cs42l43 *cs42l43 = priv->core;
1627         unsigned int mask = 1 << w->shift;
1628         unsigned int val = 0;
1629         int ret;
1630
1631         ret = cs42l43_mic_ev(w, kcontrol, event);
1632         if (ret)
1633                 return ret;
1634
1635         switch (event) {
1636         case SND_SOC_DAPM_PRE_PMU:
1637                 val = mask;
1638                 fallthrough;
1639         case SND_SOC_DAPM_PRE_PMD:
1640                 priv->adc_ena &= ~mask;
1641                 priv->adc_ena |= val;
1642
1643                 if (!priv->load_detect_running)
1644                         regmap_update_bits(cs42l43->regmap, CS42L43_BLOCK_EN3,
1645                                            mask, val);
1646                 fallthrough;
1647         default:
1648                 return 0;
1649         }
1650 }
1651
1652 static const struct snd_soc_dapm_widget cs42l43_widgets[] = {
1653         SND_SOC_DAPM_SUPPLY("PLL", SND_SOC_NOPM, 0, 0, cs42l43_pll_ev,
1654                             SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
1655
1656         SND_SOC_DAPM_INPUT("ADC1_IN1_P"),
1657         SND_SOC_DAPM_INPUT("ADC1_IN1_N"),
1658         SND_SOC_DAPM_INPUT("ADC1_IN2_P"),
1659         SND_SOC_DAPM_INPUT("ADC1_IN2_N"),
1660         SND_SOC_DAPM_INPUT("ADC2_IN_P"),
1661         SND_SOC_DAPM_INPUT("ADC2_IN_N"),
1662
1663         SND_SOC_DAPM_INPUT("PDM1_DIN"),
1664         SND_SOC_DAPM_INPUT("PDM2_DIN"),
1665
1666         SND_SOC_DAPM_MUX("ADC1 Input", SND_SOC_NOPM, 0, 0, &cs42l43_adc1_input_ctl),
1667
1668         SND_SOC_DAPM_PGA_E("ADC1", SND_SOC_NOPM, CS42L43_ADC1_EN_SHIFT, 0, NULL, 0,
1669                            cs42l43_adc_ev, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1670                            SND_SOC_DAPM_PRE_PMD),
1671         SND_SOC_DAPM_PGA_E("ADC2", SND_SOC_NOPM, CS42L43_ADC2_EN_SHIFT, 0, NULL, 0,
1672                            cs42l43_adc_ev, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1673                            SND_SOC_DAPM_PRE_PMD),
1674
1675         SND_SOC_DAPM_PGA_E("PDM1L", CS42L43_BLOCK_EN3, CS42L43_PDM1_DIN_L_EN_SHIFT,
1676                            0, NULL, 0, cs42l43_mic_ev,
1677                            SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
1678         SND_SOC_DAPM_PGA_E("PDM1R", CS42L43_BLOCK_EN3, CS42L43_PDM1_DIN_R_EN_SHIFT,
1679                            0, NULL, 0, cs42l43_mic_ev,
1680                            SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
1681         SND_SOC_DAPM_PGA_E("PDM2L", CS42L43_BLOCK_EN3, CS42L43_PDM2_DIN_L_EN_SHIFT,
1682                            0, NULL, 0, cs42l43_mic_ev,
1683                            SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
1684         SND_SOC_DAPM_PGA_E("PDM2R", CS42L43_BLOCK_EN3, CS42L43_PDM2_DIN_R_EN_SHIFT,
1685                            0, NULL, 0, cs42l43_mic_ev,
1686                            SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
1687
1688         SND_SOC_DAPM_MUX("Decimator 1 Mode", SND_SOC_NOPM, 0, 0,
1689                          &cs42l43_dec_mode_ctl[0]),
1690         SND_SOC_DAPM_MUX("Decimator 2 Mode", SND_SOC_NOPM, 0, 0,
1691                          &cs42l43_dec_mode_ctl[1]),
1692
1693         SND_SOC_DAPM_PGA("Decimator 1", SND_SOC_NOPM, 0, 0, NULL, 0),
1694         SND_SOC_DAPM_PGA("Decimator 2", SND_SOC_NOPM, 0, 0, NULL, 0),
1695         SND_SOC_DAPM_PGA("Decimator 3", SND_SOC_NOPM, 0, 0, NULL, 0),
1696         SND_SOC_DAPM_PGA("Decimator 4", SND_SOC_NOPM, 0, 0, NULL, 0),
1697
1698         SND_SOC_DAPM_SUPPLY_S("FSYNC", 0, CS42L43_ASP_CTRL, CS42L43_ASP_FSYNC_EN_SHIFT,
1699                               0, NULL, 0),
1700         SND_SOC_DAPM_SUPPLY_S("BCLK", 1, CS42L43_ASP_CTRL, CS42L43_ASP_BCLK_EN_SHIFT,
1701                               0, NULL, 0),
1702
1703         SND_SOC_DAPM_AIF_OUT("ASPTX1", NULL, 0,
1704                              CS42L43_ASP_TX_EN, CS42L43_ASP_TX_CH1_EN_SHIFT, 0),
1705         SND_SOC_DAPM_AIF_OUT("ASPTX2", NULL, 1,
1706                              CS42L43_ASP_TX_EN, CS42L43_ASP_TX_CH2_EN_SHIFT, 0),
1707         SND_SOC_DAPM_AIF_OUT("ASPTX3", NULL, 2,
1708                              CS42L43_ASP_TX_EN, CS42L43_ASP_TX_CH3_EN_SHIFT, 0),
1709         SND_SOC_DAPM_AIF_OUT("ASPTX4", NULL, 3,
1710                              CS42L43_ASP_TX_EN, CS42L43_ASP_TX_CH4_EN_SHIFT, 0),
1711         SND_SOC_DAPM_AIF_OUT("ASPTX5", NULL, 4,
1712                              CS42L43_ASP_TX_EN, CS42L43_ASP_TX_CH5_EN_SHIFT, 0),
1713         SND_SOC_DAPM_AIF_OUT("ASPTX6", NULL, 5,
1714                              CS42L43_ASP_TX_EN, CS42L43_ASP_TX_CH6_EN_SHIFT, 0),
1715
1716         SND_SOC_DAPM_AIF_IN("ASPRX1", NULL, 0,
1717                             CS42L43_ASP_RX_EN, CS42L43_ASP_RX_CH1_EN_SHIFT, 0),
1718         SND_SOC_DAPM_AIF_IN("ASPRX2", NULL, 1,
1719                             CS42L43_ASP_RX_EN, CS42L43_ASP_RX_CH2_EN_SHIFT, 0),
1720         SND_SOC_DAPM_AIF_IN("ASPRX3", NULL, 2,
1721                             CS42L43_ASP_RX_EN, CS42L43_ASP_RX_CH3_EN_SHIFT, 0),
1722         SND_SOC_DAPM_AIF_IN("ASPRX4", NULL, 3,
1723                             CS42L43_ASP_RX_EN, CS42L43_ASP_RX_CH4_EN_SHIFT, 0),
1724         SND_SOC_DAPM_AIF_IN("ASPRX5", NULL, 4,
1725                             CS42L43_ASP_RX_EN, CS42L43_ASP_RX_CH5_EN_SHIFT, 0),
1726         SND_SOC_DAPM_AIF_IN("ASPRX6", NULL, 5,
1727                             CS42L43_ASP_RX_EN, CS42L43_ASP_RX_CH6_EN_SHIFT, 0),
1728
1729         SND_SOC_DAPM_AIF_OUT("DP1TX1", NULL, 0, SND_SOC_NOPM, 0, 0),
1730         SND_SOC_DAPM_AIF_OUT("DP1TX2", NULL, 1, SND_SOC_NOPM, 0, 0),
1731         SND_SOC_DAPM_AIF_OUT("DP1TX3", NULL, 2, SND_SOC_NOPM, 0, 0),
1732         SND_SOC_DAPM_AIF_OUT("DP1TX4", NULL, 3, SND_SOC_NOPM, 0, 0),
1733
1734         SND_SOC_DAPM_AIF_OUT("DP2TX1", NULL, 0, SND_SOC_NOPM, 0, 0),
1735         SND_SOC_DAPM_AIF_OUT("DP2TX2", NULL, 1, SND_SOC_NOPM, 0, 0),
1736
1737         SND_SOC_DAPM_AIF_OUT("DP3TX1", NULL, 0, SND_SOC_NOPM, 0, 0),
1738         SND_SOC_DAPM_AIF_OUT("DP3TX2", NULL, 1, SND_SOC_NOPM, 0, 0),
1739
1740         SND_SOC_DAPM_AIF_OUT("DP4TX1", NULL, 0, SND_SOC_NOPM, 0, 0),
1741         SND_SOC_DAPM_AIF_OUT("DP4TX2", NULL, 1, SND_SOC_NOPM, 0, 0),
1742
1743         SND_SOC_DAPM_AIF_IN("DP5RX1", NULL, 0, SND_SOC_NOPM, 0, 0),
1744         SND_SOC_DAPM_AIF_IN("DP5RX2", NULL, 1, SND_SOC_NOPM, 0, 0),
1745
1746         SND_SOC_DAPM_AIF_IN("DP6RX1", NULL, 0, SND_SOC_NOPM, 0, 0),
1747         SND_SOC_DAPM_AIF_IN("DP6RX2", NULL, 1, SND_SOC_NOPM, 0, 0),
1748
1749         SND_SOC_DAPM_AIF_IN("DP7RX1", NULL, 0, SND_SOC_NOPM, 0, 0),
1750         SND_SOC_DAPM_AIF_IN("DP7RX2", NULL, 1, SND_SOC_NOPM, 0, 0),
1751
1752         SND_SOC_DAPM_REGULATOR_SUPPLY("vdd-amp", 0, 0),
1753
1754         SND_SOC_DAPM_PGA_E("AMP1", CS42L43_BLOCK_EN10, CS42L43_AMP1_EN_SHIFT, 0, NULL, 0,
1755                            cs42l43_spkl_ev, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1756                            SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1757         SND_SOC_DAPM_PGA_E("AMP2", CS42L43_BLOCK_EN10, CS42L43_AMP2_EN_SHIFT, 0, NULL, 0,
1758                            cs42l43_spkr_ev, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1759                            SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1760
1761         SND_SOC_DAPM_OUTPUT("AMP1_OUT_P"),
1762         SND_SOC_DAPM_OUTPUT("AMP1_OUT_N"),
1763         SND_SOC_DAPM_OUTPUT("AMP2_OUT_P"),
1764         SND_SOC_DAPM_OUTPUT("AMP2_OUT_N"),
1765
1766         SND_SOC_DAPM_PGA("SPDIF", CS42L43_BLOCK_EN11, CS42L43_SPDIF_EN_SHIFT,
1767                          0, NULL, 0),
1768         SND_SOC_DAPM_OUTPUT("SPDIF_TX"),
1769
1770         SND_SOC_DAPM_PGA_E("HP", SND_SOC_NOPM, CS42L43_HP_EN_SHIFT, 0, NULL, 0,
1771                            cs42l43_hp_ev, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1772                            SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1773         SND_SOC_DAPM_OUTPUT("AMP3_OUT"),
1774         SND_SOC_DAPM_OUTPUT("AMP4_OUT"),
1775
1776         SND_SOC_DAPM_SIGGEN("Tone"),
1777         SND_SOC_DAPM_SUPPLY("Tone Generator", CS42L43_BLOCK_EN9, CS42L43_TONE_EN_SHIFT,
1778                             0, NULL, 0),
1779         SND_SOC_DAPM_REG(snd_soc_dapm_pga, "Tone 1", CS42L43_TONE_CH1_CTRL,
1780                          CS42L43_TONE_SEL_SHIFT, CS42L43_TONE_SEL_MASK, 0xA, 0),
1781         SND_SOC_DAPM_REG(snd_soc_dapm_pga, "Tone 2", CS42L43_TONE_CH2_CTRL,
1782                          CS42L43_TONE_SEL_SHIFT, CS42L43_TONE_SEL_MASK, 0xA, 0),
1783
1784         SND_SOC_DAPM_SUPPLY("ISRC1", CS42L43_BLOCK_EN5, CS42L43_ISRC1_BANK_EN_SHIFT,
1785                             0, NULL, 0),
1786         SND_SOC_DAPM_SUPPLY("ISRC2", CS42L43_BLOCK_EN5, CS42L43_ISRC2_BANK_EN_SHIFT,
1787                             0, NULL, 0),
1788
1789         SND_SOC_DAPM_PGA("ISRC1INT2", CS42L43_ISRC1_CTRL,
1790                          CS42L43_ISRC_INT2_EN_SHIFT, 0, NULL, 0),
1791         SND_SOC_DAPM_PGA("ISRC1INT1", CS42L43_ISRC1_CTRL,
1792                          CS42L43_ISRC_INT1_EN_SHIFT, 0, NULL, 0),
1793         SND_SOC_DAPM_PGA("ISRC1DEC2", CS42L43_ISRC1_CTRL,
1794                          CS42L43_ISRC_DEC2_EN_SHIFT, 0, NULL, 0),
1795         SND_SOC_DAPM_PGA("ISRC1DEC1", CS42L43_ISRC1_CTRL,
1796                          CS42L43_ISRC_DEC1_EN_SHIFT, 0, NULL, 0),
1797
1798         SND_SOC_DAPM_PGA("ISRC2INT2", CS42L43_ISRC2_CTRL,
1799                          CS42L43_ISRC_INT2_EN_SHIFT, 0, NULL, 0),
1800         SND_SOC_DAPM_PGA("ISRC2INT1", CS42L43_ISRC2_CTRL,
1801                          CS42L43_ISRC_INT1_EN_SHIFT, 0, NULL, 0),
1802         SND_SOC_DAPM_PGA("ISRC2DEC2", CS42L43_ISRC2_CTRL,
1803                          CS42L43_ISRC_DEC2_EN_SHIFT, 0, NULL, 0),
1804         SND_SOC_DAPM_PGA("ISRC2DEC1", CS42L43_ISRC2_CTRL,
1805                          CS42L43_ISRC_DEC1_EN_SHIFT, 0, NULL, 0),
1806
1807         SND_SOC_DAPM_SUPPLY("ASRC_INT", CS42L43_BLOCK_EN4,
1808                             CS42L43_ASRC_INT_BANK_EN_SHIFT, 0, NULL, 0),
1809         SND_SOC_DAPM_SUPPLY("ASRC_DEC", CS42L43_BLOCK_EN4,
1810                             CS42L43_ASRC_DEC_BANK_EN_SHIFT, 0, NULL, 0),
1811
1812         SND_SOC_DAPM_PGA("ASRC_INT1", CS42L43_ASRC_INT_ENABLES,
1813                          CS42L43_ASRC_INT1_EN_SHIFT, 0, NULL, 0),
1814         SND_SOC_DAPM_PGA("ASRC_INT2", CS42L43_ASRC_INT_ENABLES,
1815                          CS42L43_ASRC_INT2_EN_SHIFT, 0, NULL, 0),
1816         SND_SOC_DAPM_PGA("ASRC_INT3", CS42L43_ASRC_INT_ENABLES,
1817                          CS42L43_ASRC_INT3_EN_SHIFT, 0, NULL, 0),
1818         SND_SOC_DAPM_PGA("ASRC_INT4", CS42L43_ASRC_INT_ENABLES,
1819                          CS42L43_ASRC_INT4_EN_SHIFT, 0, NULL, 0),
1820         SND_SOC_DAPM_PGA("ASRC_DEC1", CS42L43_ASRC_DEC_ENABLES,
1821                          CS42L43_ASRC_DEC1_EN_SHIFT, 0, NULL, 0),
1822         SND_SOC_DAPM_PGA("ASRC_DEC2", CS42L43_ASRC_DEC_ENABLES,
1823                          CS42L43_ASRC_DEC2_EN_SHIFT, 0, NULL, 0),
1824         SND_SOC_DAPM_PGA("ASRC_DEC3", CS42L43_ASRC_DEC_ENABLES,
1825                          CS42L43_ASRC_DEC3_EN_SHIFT, 0, NULL, 0),
1826         SND_SOC_DAPM_PGA("ASRC_DEC4", CS42L43_ASRC_DEC_ENABLES,
1827                          CS42L43_ASRC_DEC4_EN_SHIFT, 0, NULL, 0),
1828
1829         SND_SOC_DAPM_SUPPLY("EQ Clock", CS42L43_BLOCK_EN7, CS42L43_EQ_EN_SHIFT,
1830                             0, NULL, 0),
1831         SND_SOC_DAPM_PGA_E("EQ", CS42L43_START_EQZ0, CS42L43_START_FILTER_SHIFT,
1832                            0, NULL, 0, cs42l43_eq_ev,
1833                            SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
1834
1835         SND_SOC_DAPM_SUPPLY("Mixer Core", CS42L43_BLOCK_EN6, CS42L43_MIXER_EN_SHIFT,
1836                             0, NULL, 0),
1837         CS42L43_DAPM_MUX("ASPTX1", asptx1),
1838         CS42L43_DAPM_MUX("ASPTX2", asptx2),
1839         CS42L43_DAPM_MUX("ASPTX3", asptx3),
1840         CS42L43_DAPM_MUX("ASPTX4", asptx4),
1841         CS42L43_DAPM_MUX("ASPTX5", asptx5),
1842         CS42L43_DAPM_MUX("ASPTX6", asptx6),
1843
1844         CS42L43_DAPM_MUX("DP1TX1", dp1tx1),
1845         CS42L43_DAPM_MUX("DP1TX2", dp1tx2),
1846         CS42L43_DAPM_MUX("DP1TX3", dp1tx3),
1847         CS42L43_DAPM_MUX("DP1TX4", dp1tx4),
1848         CS42L43_DAPM_MUX("DP2TX1", dp2tx1),
1849         CS42L43_DAPM_MUX("DP2TX2", dp2tx2),
1850         CS42L43_DAPM_MUX("DP3TX1", dp3tx1),
1851         CS42L43_DAPM_MUX("DP3TX2", dp3tx2),
1852         CS42L43_DAPM_MUX("DP4TX1", dp4tx1),
1853         CS42L43_DAPM_MUX("DP4TX2", dp4tx2),
1854
1855         CS42L43_DAPM_MUX("ASRC INT1", asrcint1),
1856         CS42L43_DAPM_MUX("ASRC INT2", asrcint2),
1857         CS42L43_DAPM_MUX("ASRC INT3", asrcint3),
1858         CS42L43_DAPM_MUX("ASRC INT4", asrcint4),
1859         CS42L43_DAPM_MUX("ASRC DEC1", asrcdec1),
1860         CS42L43_DAPM_MUX("ASRC DEC2", asrcdec2),
1861         CS42L43_DAPM_MUX("ASRC DEC3", asrcdec3),
1862         CS42L43_DAPM_MUX("ASRC DEC4", asrcdec4),
1863
1864         CS42L43_DAPM_MUX("ISRC1INT1", isrc1int1),
1865         CS42L43_DAPM_MUX("ISRC1INT2", isrc1int2),
1866         CS42L43_DAPM_MUX("ISRC1DEC1", isrc1dec1),
1867         CS42L43_DAPM_MUX("ISRC1DEC2", isrc1dec2),
1868         CS42L43_DAPM_MUX("ISRC2INT1", isrc2int1),
1869         CS42L43_DAPM_MUX("ISRC2INT2", isrc2int2),
1870         CS42L43_DAPM_MUX("ISRC2DEC1", isrc2dec1),
1871         CS42L43_DAPM_MUX("ISRC2DEC2", isrc2dec2),
1872
1873         CS42L43_DAPM_MUX("SPDIF1", spdif1),
1874         CS42L43_DAPM_MUX("SPDIF2", spdif2),
1875
1876         CS42L43_DAPM_MIXER("EQ1", eq1),
1877         CS42L43_DAPM_MIXER("EQ2", eq2),
1878
1879         CS42L43_DAPM_MIXER("Speaker L", amp1),
1880         CS42L43_DAPM_MIXER("Speaker R", amp2),
1881
1882         CS42L43_DAPM_MIXER("Headphone L", amp3),
1883         CS42L43_DAPM_MIXER("Headphone R", amp4),
1884 };
1885
1886 static const struct snd_soc_dapm_route cs42l43_routes[] = {
1887         { "ADC1_IN1_P",         NULL,   "PLL" },
1888         { "ADC1_IN1_N",         NULL,   "PLL" },
1889         { "ADC1_IN2_P",         NULL,   "PLL" },
1890         { "ADC1_IN2_N",         NULL,   "PLL" },
1891         { "ADC2_IN_P",          NULL,   "PLL" },
1892         { "ADC2_IN_N",          NULL,   "PLL" },
1893         { "PDM1_DIN",           NULL,   "PLL" },
1894         { "PDM2_DIN",           NULL,   "PLL" },
1895         { "AMP1_OUT_P",         NULL,   "PLL" },
1896         { "AMP1_OUT_N",         NULL,   "PLL" },
1897         { "AMP2_OUT_P",         NULL,   "PLL" },
1898         { "AMP2_OUT_N",         NULL,   "PLL" },
1899         { "SPDIF_TX",           NULL,   "PLL" },
1900         { "HP",                 NULL,   "PLL" },
1901         { "AMP3_OUT",           NULL,   "PLL" },
1902         { "AMP4_OUT",           NULL,   "PLL" },
1903         { "Tone 1",             NULL,   "PLL" },
1904         { "Tone 2",             NULL,   "PLL" },
1905         { "ASP Playback",       NULL,   "PLL" },
1906         { "ASP Capture",        NULL,   "PLL" },
1907         { "DP1 Capture",        NULL,   "PLL" },
1908         { "DP2 Capture",        NULL,   "PLL" },
1909         { "DP3 Capture",        NULL,   "PLL" },
1910         { "DP4 Capture",        NULL,   "PLL" },
1911         { "DP5 Playback",       NULL,   "PLL" },
1912         { "DP6 Playback",       NULL,   "PLL" },
1913         { "DP7 Playback",       NULL,   "PLL" },
1914
1915         { "ADC1 Input",         "IN1",  "ADC1_IN1_P" },
1916         { "ADC1 Input",         "IN1",  "ADC1_IN1_N" },
1917         { "ADC1 Input",         "IN2",  "ADC1_IN2_P" },
1918         { "ADC1 Input",         "IN2",  "ADC1_IN2_N" },
1919
1920         { "ADC1",               NULL,   "ADC1 Input" },
1921         { "ADC2",               NULL,   "ADC2_IN_P" },
1922         { "ADC2",               NULL,   "ADC2_IN_N" },
1923
1924         { "PDM1L",              NULL,   "PDM1_DIN" },
1925         { "PDM1R",              NULL,   "PDM1_DIN" },
1926         { "PDM2L",              NULL,   "PDM2_DIN" },
1927         { "PDM2R",              NULL,   "PDM2_DIN" },
1928
1929         { "Decimator 1 Mode",   "PDM",  "PDM1L" },
1930         { "Decimator 1 Mode",   "ADC",  "ADC1" },
1931         { "Decimator 2 Mode",   "PDM",  "PDM1R" },
1932         { "Decimator 2 Mode",   "ADC",  "ADC2" },
1933
1934         { "Decimator 1",        NULL,   "Decimator 1 Mode" },
1935         { "Decimator 2",        NULL,   "Decimator 2 Mode" },
1936         { "Decimator 3",        NULL,   "PDM2L" },
1937         { "Decimator 4",        NULL,   "PDM2R" },
1938
1939         { "ASP Capture",        NULL,   "ASPTX1" },
1940         { "ASP Capture",        NULL,   "ASPTX2" },
1941         { "ASP Capture",        NULL,   "ASPTX3" },
1942         { "ASP Capture",        NULL,   "ASPTX4" },
1943         { "ASP Capture",        NULL,   "ASPTX5" },
1944         { "ASP Capture",        NULL,   "ASPTX6" },
1945         { "ASPTX1",             NULL,   "BCLK" },
1946         { "ASPTX2",             NULL,   "BCLK" },
1947         { "ASPTX3",             NULL,   "BCLK" },
1948         { "ASPTX4",             NULL,   "BCLK" },
1949         { "ASPTX5",             NULL,   "BCLK" },
1950         { "ASPTX6",             NULL,   "BCLK" },
1951
1952         { "ASPRX1",             NULL,   "ASP Playback" },
1953         { "ASPRX2",             NULL,   "ASP Playback" },
1954         { "ASPRX3",             NULL,   "ASP Playback" },
1955         { "ASPRX4",             NULL,   "ASP Playback" },
1956         { "ASPRX5",             NULL,   "ASP Playback" },
1957         { "ASPRX6",             NULL,   "ASP Playback" },
1958         { "ASPRX1",             NULL,   "BCLK" },
1959         { "ASPRX2",             NULL,   "BCLK" },
1960         { "ASPRX3",             NULL,   "BCLK" },
1961         { "ASPRX4",             NULL,   "BCLK" },
1962         { "ASPRX5",             NULL,   "BCLK" },
1963         { "ASPRX6",             NULL,   "BCLK" },
1964
1965         { "DP1 Capture",        NULL, "DP1TX1" },
1966         { "DP1 Capture",        NULL, "DP1TX2" },
1967         { "DP1 Capture",        NULL, "DP1TX3" },
1968         { "DP1 Capture",        NULL, "DP1TX4" },
1969
1970         { "DP2 Capture",        NULL, "DP2TX1" },
1971         { "DP2 Capture",        NULL, "DP2TX2" },
1972
1973         { "DP3 Capture",        NULL, "DP3TX1" },
1974         { "DP3 Capture",        NULL, "DP3TX2" },
1975
1976         { "DP4 Capture",        NULL, "DP4TX1" },
1977         { "DP4 Capture",        NULL, "DP4TX2" },
1978
1979         { "DP5RX1",             NULL, "DP5 Playback" },
1980         { "DP5RX2",             NULL, "DP5 Playback" },
1981
1982         { "DP6RX1",             NULL, "DP6 Playback" },
1983         { "DP6RX2",             NULL, "DP6 Playback" },
1984
1985         { "DP7RX1",             NULL, "DP7 Playback" },
1986         { "DP7RX2",             NULL, "DP7 Playback" },
1987
1988         { "AMP1",               NULL,   "vdd-amp" },
1989         { "AMP2",               NULL,   "vdd-amp" },
1990
1991         { "AMP1_OUT_P",         NULL,   "AMP1" },
1992         { "AMP1_OUT_N",         NULL,   "AMP1" },
1993         { "AMP2_OUT_P",         NULL,   "AMP2" },
1994         { "AMP2_OUT_N",         NULL,   "AMP2" },
1995
1996         { "SPDIF_TX",           NULL,   "SPDIF" },
1997
1998         { "AMP3_OUT",           NULL,   "HP" },
1999         { "AMP4_OUT",           NULL,   "HP" },
2000
2001         { "Tone 1",             NULL,   "Tone" },
2002         { "Tone 1",             NULL,   "Tone Generator" },
2003         { "Tone 2",             NULL,   "Tone" },
2004         { "Tone 2",             NULL,   "Tone Generator" },
2005
2006         { "ISRC1INT2",          NULL,   "ISRC1" },
2007         { "ISRC1INT1",          NULL,   "ISRC1" },
2008         { "ISRC1DEC2",          NULL,   "ISRC1" },
2009         { "ISRC1DEC1",          NULL,   "ISRC1" },
2010
2011         { "ISRC2INT2",          NULL,   "ISRC2" },
2012         { "ISRC2INT1",          NULL,   "ISRC2" },
2013         { "ISRC2DEC2",          NULL,   "ISRC2" },
2014         { "ISRC2DEC1",          NULL,   "ISRC2" },
2015
2016         { "ASRC_INT1",          NULL,   "ASRC_INT" },
2017         { "ASRC_INT2",          NULL,   "ASRC_INT" },
2018         { "ASRC_INT3",          NULL,   "ASRC_INT" },
2019         { "ASRC_INT4",          NULL,   "ASRC_INT" },
2020         { "ASRC_DEC1",          NULL,   "ASRC_DEC" },
2021         { "ASRC_DEC2",          NULL,   "ASRC_DEC" },
2022         { "ASRC_DEC3",          NULL,   "ASRC_DEC" },
2023         { "ASRC_DEC4",          NULL,   "ASRC_DEC" },
2024
2025         { "EQ",                 NULL,   "EQ Clock" },
2026
2027         CS42L43_MUX_ROUTES("ASPTX1", "ASPTX1"),
2028         CS42L43_MUX_ROUTES("ASPTX2", "ASPTX2"),
2029         CS42L43_MUX_ROUTES("ASPTX3", "ASPTX3"),
2030         CS42L43_MUX_ROUTES("ASPTX4", "ASPTX4"),
2031         CS42L43_MUX_ROUTES("ASPTX5", "ASPTX5"),
2032         CS42L43_MUX_ROUTES("ASPTX6", "ASPTX6"),
2033
2034         CS42L43_MUX_ROUTES("DP1TX1", "DP1TX1"),
2035         CS42L43_MUX_ROUTES("DP1TX2", "DP1TX2"),
2036         CS42L43_MUX_ROUTES("DP1TX3", "DP1TX3"),
2037         CS42L43_MUX_ROUTES("DP1TX4", "DP1TX4"),
2038         CS42L43_MUX_ROUTES("DP2TX1", "DP2TX1"),
2039         CS42L43_MUX_ROUTES("DP2TX2", "DP2TX2"),
2040         CS42L43_MUX_ROUTES("DP3TX1", "DP3TX1"),
2041         CS42L43_MUX_ROUTES("DP3TX2", "DP3TX2"),
2042         CS42L43_MUX_ROUTES("DP4TX1", "DP4TX1"),
2043         CS42L43_MUX_ROUTES("DP4TX2", "DP4TX2"),
2044
2045         CS42L43_MUX_ROUTES("ASRC INT1", "ASRC_INT1"),
2046         CS42L43_MUX_ROUTES("ASRC INT2", "ASRC_INT2"),
2047         CS42L43_MUX_ROUTES("ASRC INT3", "ASRC_INT3"),
2048         CS42L43_MUX_ROUTES("ASRC INT4", "ASRC_INT4"),
2049         CS42L43_MUX_ROUTES("ASRC DEC1", "ASRC_DEC1"),
2050         CS42L43_MUX_ROUTES("ASRC DEC2", "ASRC_DEC2"),
2051         CS42L43_MUX_ROUTES("ASRC DEC3", "ASRC_DEC3"),
2052         CS42L43_MUX_ROUTES("ASRC DEC4", "ASRC_DEC4"),
2053
2054         CS42L43_MUX_ROUTES("ISRC1INT1", "ISRC1INT1"),
2055         CS42L43_MUX_ROUTES("ISRC1INT2", "ISRC1INT2"),
2056         CS42L43_MUX_ROUTES("ISRC1DEC1", "ISRC1DEC1"),
2057         CS42L43_MUX_ROUTES("ISRC1DEC2", "ISRC1DEC2"),
2058         CS42L43_MUX_ROUTES("ISRC2INT1", "ISRC2INT1"),
2059         CS42L43_MUX_ROUTES("ISRC2INT2", "ISRC2INT2"),
2060         CS42L43_MUX_ROUTES("ISRC2DEC1", "ISRC2DEC1"),
2061         CS42L43_MUX_ROUTES("ISRC2DEC2", "ISRC2DEC2"),
2062
2063         CS42L43_MUX_ROUTES("SPDIF1", "SPDIF"),
2064         CS42L43_MUX_ROUTES("SPDIF2", "SPDIF"),
2065
2066         CS42L43_MIXER_ROUTES("EQ1", "EQ"),
2067         CS42L43_MIXER_ROUTES("EQ2", "EQ"),
2068
2069         CS42L43_MIXER_ROUTES("Speaker L", "AMP1"),
2070         CS42L43_MIXER_ROUTES("Speaker R", "AMP2"),
2071
2072         CS42L43_MIXER_ROUTES("Headphone L", "HP"),
2073         CS42L43_MIXER_ROUTES("Headphone R", "HP"),
2074 };
2075
2076 static int cs42l43_set_sysclk(struct snd_soc_component *component, int clk_id,
2077                               int src, unsigned int freq, int dir)
2078 {
2079         struct cs42l43_codec *priv = snd_soc_component_get_drvdata(component);
2080         struct cs42l43 *cs42l43 = priv->core;
2081         int ret;
2082
2083         mutex_lock(&cs42l43->pll_lock);
2084         ret = cs42l43_set_pll(priv, src, freq);
2085         mutex_unlock(&cs42l43->pll_lock);
2086
2087         return ret;
2088 }
2089
2090 static int cs42l43_component_probe(struct snd_soc_component *component)
2091 {
2092         struct cs42l43_codec *priv = snd_soc_component_get_drvdata(component);
2093         struct cs42l43 *cs42l43 = priv->core;
2094
2095         snd_soc_component_init_regmap(component, cs42l43->regmap);
2096
2097         cs42l43_mask_to_slots(priv, CS42L43_DEFAULT_SLOTS, priv->tx_slots);
2098         cs42l43_mask_to_slots(priv, CS42L43_DEFAULT_SLOTS, priv->rx_slots);
2099
2100         priv->component = component;
2101         priv->constraint = cs42l43_constraint;
2102
2103         return 0;
2104 }
2105
2106 static const struct snd_soc_component_driver cs42l43_component_drv = {
2107         .name                   = "cs42l43-codec",
2108
2109         .probe                  = cs42l43_component_probe,
2110         .set_sysclk             = cs42l43_set_sysclk,
2111         .set_jack               = cs42l43_set_jack,
2112
2113         .endianness             = 1,
2114
2115         .controls               = cs42l43_controls,
2116         .num_controls           = ARRAY_SIZE(cs42l43_controls),
2117         .dapm_widgets           = cs42l43_widgets,
2118         .num_dapm_widgets       = ARRAY_SIZE(cs42l43_widgets),
2119         .dapm_routes            = cs42l43_routes,
2120         .num_dapm_routes        = ARRAY_SIZE(cs42l43_routes),
2121 };
2122
2123 struct cs42l43_irq {
2124         unsigned int irq;
2125         const char *name;
2126         irq_handler_t handler;
2127 };
2128
2129 static const struct cs42l43_irq cs42l43_irqs[] = {
2130         { CS42L43_PLL_LOST_LOCK, "pll lost lock", cs42l43_pll_lost_lock },
2131         { CS42L43_PLL_READY, "pll ready", cs42l43_pll_ready },
2132         { CS42L43_HP_STARTUP_DONE, "hp startup", cs42l43_hp_startup },
2133         { CS42L43_HP_SHUTDOWN_DONE, "hp shutdown", cs42l43_hp_shutdown },
2134         { CS42L43_HSDET_DONE, "type detect", cs42l43_type_detect },
2135         { CS42L43_TIPSENSE_UNPLUG_PDET, "tip sense unplug", cs42l43_tip_sense },
2136         { CS42L43_TIPSENSE_PLUG_PDET, "tip sense plug", cs42l43_tip_sense },
2137         { CS42L43_DC_DETECT1_TRUE, "button press", cs42l43_button_press },
2138         { CS42L43_DC_DETECT1_FALSE, "button release", cs42l43_button_release },
2139         { CS42L43_HSBIAS_CLAMPED, "hsbias detect clamp", cs42l43_bias_detect_clamp },
2140         { CS42L43_AMP2_CLK_STOP_FAULT, "spkr clock stop", cs42l43_spkr_clock_stop },
2141         { CS42L43_AMP1_CLK_STOP_FAULT, "spkl clock stop", cs42l43_spkl_clock_stop },
2142         { CS42L43_AMP2_VDDSPK_FAULT, "spkr brown out", cs42l43_spkr_brown_out },
2143         { CS42L43_AMP1_VDDSPK_FAULT, "spkl brown out", cs42l43_spkl_brown_out },
2144         { CS42L43_AMP2_SHUTDOWN_DONE, "spkr shutdown", cs42l43_spkr_shutdown },
2145         { CS42L43_AMP1_SHUTDOWN_DONE, "spkl shutdown", cs42l43_spkl_shutdown },
2146         { CS42L43_AMP2_STARTUP_DONE, "spkr startup", cs42l43_spkr_startup },
2147         { CS42L43_AMP1_STARTUP_DONE, "spkl startup", cs42l43_spkl_startup },
2148         { CS42L43_AMP2_THERM_SHDN, "spkr thermal shutdown", cs42l43_spkr_therm_shutdown },
2149         { CS42L43_AMP1_THERM_SHDN, "spkl thermal shutdown", cs42l43_spkl_therm_shutdown },
2150         { CS42L43_AMP2_THERM_WARN, "spkr thermal warning", cs42l43_spkr_therm_warm },
2151         { CS42L43_AMP1_THERM_WARN, "spkl thermal warning", cs42l43_spkl_therm_warm },
2152         { CS42L43_AMP2_SCDET, "spkr short circuit", cs42l43_spkr_sc_detect },
2153         { CS42L43_AMP1_SCDET, "spkl short circuit", cs42l43_spkl_sc_detect },
2154         { CS42L43_HP_ILIMIT, "hp ilimit", cs42l43_hp_ilimit },
2155         { CS42L43_HP_LOADDET_DONE, "load detect done", cs42l43_load_detect },
2156 };
2157
2158 static int cs42l43_request_irq(struct cs42l43_codec *priv,
2159                                struct irq_domain *dom, const char * const name,
2160                                unsigned int irq, irq_handler_t handler,
2161                                unsigned long flags)
2162 {
2163         int ret;
2164
2165         ret = irq_create_mapping(dom, irq);
2166         if (ret < 0)
2167                 return dev_err_probe(priv->dev, ret, "Failed to map IRQ %s\n", name);
2168
2169         dev_dbg(priv->dev, "Request IRQ %d for %s\n", ret, name);
2170
2171         ret = devm_request_threaded_irq(priv->dev, ret, NULL, handler,
2172                                         IRQF_ONESHOT | flags, name, priv);
2173         if (ret)
2174                 return dev_err_probe(priv->dev, ret, "Failed to request IRQ %s\n", name);
2175
2176         return 0;
2177 }
2178
2179 static int cs42l43_shutter_irq(struct cs42l43_codec *priv,
2180                                struct irq_domain *dom, unsigned int shutter,
2181                                const char * const open_name,
2182                                const char * const close_name,
2183                                irq_handler_t handler)
2184 {
2185         unsigned int open_irq, close_irq;
2186         int ret;
2187
2188         switch (shutter) {
2189         case 0x1:
2190                 dev_warn(priv->dev, "Manual shutters, notifications not available\n");
2191                 return 0;
2192         case 0x2:
2193                 open_irq = CS42L43_GPIO1_RISE;
2194                 close_irq = CS42L43_GPIO1_FALL;
2195                 break;
2196         case 0x4:
2197                 open_irq = CS42L43_GPIO2_RISE;
2198                 close_irq = CS42L43_GPIO2_FALL;
2199                 break;
2200         case 0x8:
2201                 open_irq = CS42L43_GPIO3_RISE;
2202                 close_irq = CS42L43_GPIO3_FALL;
2203                 break;
2204         default:
2205                 return 0;
2206         }
2207
2208         ret = cs42l43_request_irq(priv, dom, close_name, close_irq, handler, IRQF_SHARED);
2209         if (ret)
2210                 return ret;
2211
2212         return cs42l43_request_irq(priv, dom, open_name, open_irq, handler, IRQF_SHARED);
2213 }
2214
2215 static int cs42l43_codec_probe(struct platform_device *pdev)
2216 {
2217         struct cs42l43 *cs42l43 = dev_get_drvdata(pdev->dev.parent);
2218         struct cs42l43_codec *priv;
2219         struct irq_domain *dom;
2220         unsigned int val;
2221         int i, ret;
2222
2223         dom = irq_find_matching_fwnode(dev_fwnode(cs42l43->dev), DOMAIN_BUS_ANY);
2224         if (!dom)
2225                 return -EPROBE_DEFER;
2226
2227         priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
2228         if (!priv)
2229                 return -ENOMEM;
2230
2231         priv->dev = &pdev->dev;
2232         priv->core = cs42l43;
2233
2234         platform_set_drvdata(pdev, priv);
2235
2236         mutex_init(&priv->jack_lock);
2237         mutex_init(&priv->spk_vu_lock);
2238
2239         init_completion(&priv->hp_startup);
2240         init_completion(&priv->hp_shutdown);
2241         init_completion(&priv->spkr_shutdown);
2242         init_completion(&priv->spkl_shutdown);
2243         init_completion(&priv->spkr_startup);
2244         init_completion(&priv->spkl_startup);
2245         init_completion(&priv->pll_ready);
2246         init_completion(&priv->type_detect);
2247         init_completion(&priv->load_detect);
2248
2249         INIT_DELAYED_WORK(&priv->tip_sense_work, cs42l43_tip_sense_work);
2250         INIT_DELAYED_WORK(&priv->bias_sense_timeout, cs42l43_bias_sense_timeout);
2251         INIT_DELAYED_WORK(&priv->button_press_work, cs42l43_button_press_work);
2252         INIT_DELAYED_WORK(&priv->hp_ilimit_clear_work, cs42l43_hp_ilimit_clear_work);
2253         INIT_WORK(&priv->button_release_work, cs42l43_button_release_work);
2254         INIT_WORK(&priv->hp_ilimit_work, cs42l43_hp_ilimit_work);
2255
2256         pm_runtime_set_autosuspend_delay(priv->dev, 100);
2257         pm_runtime_use_autosuspend(priv->dev);
2258         pm_runtime_set_active(priv->dev);
2259         pm_runtime_get_noresume(priv->dev);
2260         devm_pm_runtime_enable(priv->dev);
2261
2262         for (i = 0; i < ARRAY_SIZE(cs42l43_irqs); i++) {
2263                 ret = cs42l43_request_irq(priv, dom, cs42l43_irqs[i].name,
2264                                           cs42l43_irqs[i].irq,
2265                                           cs42l43_irqs[i].handler, 0);
2266                 if (ret)
2267                         goto err_pm;
2268         }
2269
2270         ret = regmap_read(cs42l43->regmap, CS42L43_SHUTTER_CONTROL, &val);
2271         if (ret) {
2272                 dev_err(priv->dev, "Failed to check shutter source: %d\n", ret);
2273                 goto err_pm;
2274         }
2275
2276         ret = cs42l43_shutter_irq(priv, dom, val & CS42L43_MIC_SHUTTER_CFG_MASK,
2277                                   "mic shutter open", "mic shutter close",
2278                                   cs42l43_mic_shutter);
2279         if (ret)
2280                 goto err_pm;
2281
2282         ret = cs42l43_shutter_irq(priv, dom, (val & CS42L43_SPK_SHUTTER_CFG_MASK) >>
2283                                   CS42L43_SPK_SHUTTER_CFG_SHIFT,
2284                                   "spk shutter open", "spk shutter close",
2285                                   cs42l43_spk_shutter);
2286         if (ret)
2287                 goto err_pm;
2288
2289         // Don't use devm as we need to get against the MFD device
2290         priv->mclk = clk_get_optional(cs42l43->dev, "mclk");
2291         if (IS_ERR(priv->mclk)) {
2292                 ret = PTR_ERR(priv->mclk);
2293                 dev_err_probe(priv->dev, ret, "Failed to get mclk\n");
2294                 goto err_pm;
2295         }
2296
2297         ret = devm_snd_soc_register_component(priv->dev, &cs42l43_component_drv,
2298                                               cs42l43_dais, ARRAY_SIZE(cs42l43_dais));
2299         if (ret) {
2300                 dev_err_probe(priv->dev, ret, "Failed to register component\n");
2301                 goto err_clk;
2302         }
2303
2304         pm_runtime_mark_last_busy(priv->dev);
2305         pm_runtime_put_autosuspend(priv->dev);
2306
2307         return 0;
2308
2309 err_clk:
2310         clk_put(priv->mclk);
2311 err_pm:
2312         pm_runtime_put_sync(priv->dev);
2313
2314         return ret;
2315 }
2316
2317 static void cs42l43_codec_remove(struct platform_device *pdev)
2318 {
2319         struct cs42l43_codec *priv = platform_get_drvdata(pdev);
2320
2321         clk_put(priv->mclk);
2322 }
2323
2324 static int cs42l43_codec_runtime_resume(struct device *dev)
2325 {
2326         struct cs42l43_codec *priv = dev_get_drvdata(dev);
2327
2328         dev_dbg(priv->dev, "Runtime resume\n");
2329
2330         // Toggle the speaker volume update incase the speaker volume was synced
2331         cs42l43_spk_vu_sync(priv);
2332
2333         return 0;
2334 }
2335
2336 static DEFINE_RUNTIME_DEV_PM_OPS(cs42l43_codec_pm_ops, NULL,
2337                                  cs42l43_codec_runtime_resume, NULL);
2338
2339 static const struct platform_device_id cs42l43_codec_id_table[] = {
2340         { "cs42l43-codec", },
2341         {}
2342 };
2343 MODULE_DEVICE_TABLE(platform, cs42l43_codec_id_table);
2344
2345 static struct platform_driver cs42l43_codec_driver = {
2346         .driver = {
2347                 .name   = "cs42l43-codec",
2348                 .pm     = &cs42l43_codec_pm_ops,
2349         },
2350
2351         .probe          = cs42l43_codec_probe,
2352         .remove_new     = cs42l43_codec_remove,
2353         .id_table       = cs42l43_codec_id_table,
2354 };
2355 module_platform_driver(cs42l43_codec_driver);
2356
2357 MODULE_IMPORT_NS(SND_SOC_CS42L43);
2358
2359 MODULE_DESCRIPTION("CS42L43 CODEC Driver");
2360 MODULE_AUTHOR("Charles Keepax <[email protected]>");
2361 MODULE_LICENSE("GPL");
This page took 0.181436 seconds and 4 git commands to generate.