Loading...
1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * cs43130.c -- CS43130 ALSA Soc Audio driver
4 *
5 * Copyright 2017 Cirrus Logic, Inc.
6 *
7 * Authors: Li Xu <li.xu@cirrus.com>
8 */
9#include <linux/module.h>
10#include <linux/moduleparam.h>
11#include <linux/kernel.h>
12#include <linux/init.h>
13#include <linux/delay.h>
14#include <linux/gpio.h>
15#include <linux/gpio/consumer.h>
16#include <linux/platform_device.h>
17#include <linux/pm.h>
18#include <linux/i2c.h>
19#include <linux/of_device.h>
20#include <linux/regmap.h>
21#include <linux/slab.h>
22#include <sound/core.h>
23#include <sound/pcm.h>
24#include <sound/pcm_params.h>
25#include <sound/soc.h>
26#include <sound/soc-dapm.h>
27#include <sound/initval.h>
28#include <sound/tlv.h>
29#include <linux/of_gpio.h>
30#include <linux/regulator/consumer.h>
31#include <linux/pm_runtime.h>
32#include <linux/of_irq.h>
33#include <linux/completion.h>
34#include <linux/mutex.h>
35#include <linux/workqueue.h>
36#include <sound/jack.h>
37
38#include "cs43130.h"
39
40static const struct reg_default cs43130_reg_defaults[] = {
41 {CS43130_SYS_CLK_CTL_1, 0x06},
42 {CS43130_SP_SRATE, 0x01},
43 {CS43130_SP_BITSIZE, 0x05},
44 {CS43130_PAD_INT_CFG, 0x03},
45 {CS43130_PWDN_CTL, 0xFE},
46 {CS43130_CRYSTAL_SET, 0x04},
47 {CS43130_PLL_SET_1, 0x00},
48 {CS43130_PLL_SET_2, 0x00},
49 {CS43130_PLL_SET_3, 0x00},
50 {CS43130_PLL_SET_4, 0x00},
51 {CS43130_PLL_SET_5, 0x40},
52 {CS43130_PLL_SET_6, 0x10},
53 {CS43130_PLL_SET_7, 0x80},
54 {CS43130_PLL_SET_8, 0x03},
55 {CS43130_PLL_SET_9, 0x02},
56 {CS43130_PLL_SET_10, 0x02},
57 {CS43130_CLKOUT_CTL, 0x00},
58 {CS43130_ASP_NUM_1, 0x01},
59 {CS43130_ASP_NUM_2, 0x00},
60 {CS43130_ASP_DEN_1, 0x08},
61 {CS43130_ASP_DEN_2, 0x00},
62 {CS43130_ASP_LRCK_HI_TIME_1, 0x1F},
63 {CS43130_ASP_LRCK_HI_TIME_2, 0x00},
64 {CS43130_ASP_LRCK_PERIOD_1, 0x3F},
65 {CS43130_ASP_LRCK_PERIOD_2, 0x00},
66 {CS43130_ASP_CLOCK_CONF, 0x0C},
67 {CS43130_ASP_FRAME_CONF, 0x0A},
68 {CS43130_XSP_NUM_1, 0x01},
69 {CS43130_XSP_NUM_2, 0x00},
70 {CS43130_XSP_DEN_1, 0x02},
71 {CS43130_XSP_DEN_2, 0x00},
72 {CS43130_XSP_LRCK_HI_TIME_1, 0x1F},
73 {CS43130_XSP_LRCK_HI_TIME_2, 0x00},
74 {CS43130_XSP_LRCK_PERIOD_1, 0x3F},
75 {CS43130_XSP_LRCK_PERIOD_2, 0x00},
76 {CS43130_XSP_CLOCK_CONF, 0x0C},
77 {CS43130_XSP_FRAME_CONF, 0x0A},
78 {CS43130_ASP_CH_1_LOC, 0x00},
79 {CS43130_ASP_CH_2_LOC, 0x00},
80 {CS43130_ASP_CH_1_SZ_EN, 0x06},
81 {CS43130_ASP_CH_2_SZ_EN, 0x0E},
82 {CS43130_XSP_CH_1_LOC, 0x00},
83 {CS43130_XSP_CH_2_LOC, 0x00},
84 {CS43130_XSP_CH_1_SZ_EN, 0x06},
85 {CS43130_XSP_CH_2_SZ_EN, 0x0E},
86 {CS43130_DSD_VOL_B, 0x78},
87 {CS43130_DSD_VOL_A, 0x78},
88 {CS43130_DSD_PATH_CTL_1, 0xA8},
89 {CS43130_DSD_INT_CFG, 0x00},
90 {CS43130_DSD_PATH_CTL_2, 0x02},
91 {CS43130_DSD_PCM_MIX_CTL, 0x00},
92 {CS43130_DSD_PATH_CTL_3, 0x40},
93 {CS43130_HP_OUT_CTL_1, 0x30},
94 {CS43130_PCM_FILT_OPT, 0x02},
95 {CS43130_PCM_VOL_B, 0x78},
96 {CS43130_PCM_VOL_A, 0x78},
97 {CS43130_PCM_PATH_CTL_1, 0xA8},
98 {CS43130_PCM_PATH_CTL_2, 0x00},
99 {CS43130_CLASS_H_CTL, 0x1E},
100 {CS43130_HP_DETECT, 0x04},
101 {CS43130_HP_LOAD_1, 0x00},
102 {CS43130_HP_MEAS_LOAD_1, 0x00},
103 {CS43130_HP_MEAS_LOAD_2, 0x00},
104 {CS43130_INT_MASK_1, 0xFF},
105 {CS43130_INT_MASK_2, 0xFF},
106 {CS43130_INT_MASK_3, 0xFF},
107 {CS43130_INT_MASK_4, 0xFF},
108 {CS43130_INT_MASK_5, 0xFF},
109};
110
111static bool cs43130_volatile_register(struct device *dev, unsigned int reg)
112{
113 switch (reg) {
114 case CS43130_INT_STATUS_1 ... CS43130_INT_STATUS_5:
115 case CS43130_HP_DC_STAT_1 ... CS43130_HP_DC_STAT_2:
116 case CS43130_HP_AC_STAT_1 ... CS43130_HP_AC_STAT_2:
117 return true;
118 default:
119 return false;
120 }
121}
122
123static bool cs43130_readable_register(struct device *dev, unsigned int reg)
124{
125 switch (reg) {
126 case CS43130_DEVID_AB ... CS43130_SYS_CLK_CTL_1:
127 case CS43130_SP_SRATE ... CS43130_PAD_INT_CFG:
128 case CS43130_PWDN_CTL:
129 case CS43130_CRYSTAL_SET:
130 case CS43130_PLL_SET_1 ... CS43130_PLL_SET_5:
131 case CS43130_PLL_SET_6:
132 case CS43130_PLL_SET_7:
133 case CS43130_PLL_SET_8:
134 case CS43130_PLL_SET_9:
135 case CS43130_PLL_SET_10:
136 case CS43130_CLKOUT_CTL:
137 case CS43130_ASP_NUM_1 ... CS43130_ASP_FRAME_CONF:
138 case CS43130_XSP_NUM_1 ... CS43130_XSP_FRAME_CONF:
139 case CS43130_ASP_CH_1_LOC:
140 case CS43130_ASP_CH_2_LOC:
141 case CS43130_ASP_CH_1_SZ_EN:
142 case CS43130_ASP_CH_2_SZ_EN:
143 case CS43130_XSP_CH_1_LOC:
144 case CS43130_XSP_CH_2_LOC:
145 case CS43130_XSP_CH_1_SZ_EN:
146 case CS43130_XSP_CH_2_SZ_EN:
147 case CS43130_DSD_VOL_B ... CS43130_DSD_PATH_CTL_3:
148 case CS43130_HP_OUT_CTL_1:
149 case CS43130_PCM_FILT_OPT ... CS43130_PCM_PATH_CTL_2:
150 case CS43130_CLASS_H_CTL:
151 case CS43130_HP_DETECT:
152 case CS43130_HP_STATUS:
153 case CS43130_HP_LOAD_1:
154 case CS43130_HP_MEAS_LOAD_1:
155 case CS43130_HP_MEAS_LOAD_2:
156 case CS43130_HP_DC_STAT_1:
157 case CS43130_HP_DC_STAT_2:
158 case CS43130_HP_AC_STAT_1:
159 case CS43130_HP_AC_STAT_2:
160 case CS43130_HP_LOAD_STAT:
161 case CS43130_INT_STATUS_1 ... CS43130_INT_STATUS_5:
162 case CS43130_INT_MASK_1 ... CS43130_INT_MASK_5:
163 return true;
164 default:
165 return false;
166 }
167}
168
169static bool cs43130_precious_register(struct device *dev, unsigned int reg)
170{
171 switch (reg) {
172 case CS43130_INT_STATUS_1 ... CS43130_INT_STATUS_5:
173 return true;
174 default:
175 return false;
176 }
177}
178
179struct cs43130_pll_params {
180 unsigned int pll_in;
181 u8 sclk_prediv;
182 u8 pll_div_int;
183 u32 pll_div_frac;
184 u8 pll_mode;
185 u8 pll_divout;
186 unsigned int pll_out;
187 u8 pll_cal_ratio;
188};
189
190static const struct cs43130_pll_params pll_ratio_table[] = {
191 {9600000, 0x02, 0x49, 0x800000, 0x00, 0x08, 22579200, 151},
192 {9600000, 0x02, 0x50, 0x000000, 0x00, 0x08, 24576000, 164},
193
194 {11289600, 0x02, 0X40, 0, 0x01, 0x08, 22579200, 128},
195 {11289600, 0x02, 0x44, 0x06F700, 0x0, 0x08, 24576000, 139},
196
197 {12000000, 0x02, 0x49, 0x800000, 0x00, 0x0A, 22579200, 120},
198 {12000000, 0x02, 0x40, 0x000000, 0x00, 0x08, 24576000, 131},
199
200 {12288000, 0x02, 0x49, 0x800000, 0x01, 0x0A, 22579200, 118},
201 {12288000, 0x02, 0x40, 0x000000, 0x01, 0x08, 24576000, 128},
202
203 {13000000, 0x02, 0x45, 0x797680, 0x01, 0x0A, 22579200, 111},
204 {13000000, 0x02, 0x3C, 0x7EA940, 0x01, 0x08, 24576000, 121},
205
206 {19200000, 0x03, 0x49, 0x800000, 0x00, 0x08, 22579200, 151},
207 {19200000, 0x03, 0x50, 0x000000, 0x00, 0x08, 24576000, 164},
208
209 {22579200, 0, 0, 0, 0, 0, 22579200, 0},
210 {22579200, 0x03, 0x44, 0x06F700, 0x00, 0x08, 24576000, 139},
211
212 {24000000, 0x03, 0x49, 0x800000, 0x00, 0x0A, 22579200, 120},
213 {24000000, 0x03, 0x40, 0x000000, 0x00, 0x08, 24576000, 131},
214
215 {24576000, 0x03, 0x49, 0x800000, 0x01, 0x0A, 22579200, 118},
216 {24576000, 0, 0, 0, 0, 0, 24576000, 0},
217
218 {26000000, 0x03, 0x45, 0x797680, 0x01, 0x0A, 22579200, 111},
219 {26000000, 0x03, 0x3C, 0x7EA940, 0x01, 0x08, 24576000, 121},
220};
221
222static const struct cs43130_pll_params *cs43130_get_pll_table(
223 unsigned int freq_in, unsigned int freq_out)
224{
225 int i;
226
227 for (i = 0; i < ARRAY_SIZE(pll_ratio_table); i++) {
228 if (pll_ratio_table[i].pll_in == freq_in &&
229 pll_ratio_table[i].pll_out == freq_out)
230 return &pll_ratio_table[i];
231 }
232
233 return NULL;
234}
235
236static int cs43130_pll_config(struct snd_soc_component *component)
237{
238 struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component);
239 const struct cs43130_pll_params *pll_entry;
240
241 dev_dbg(component->dev, "cs43130->mclk = %u, cs43130->mclk_int = %u\n",
242 cs43130->mclk, cs43130->mclk_int);
243
244 pll_entry = cs43130_get_pll_table(cs43130->mclk, cs43130->mclk_int);
245 if (!pll_entry)
246 return -EINVAL;
247
248 if (pll_entry->pll_cal_ratio == 0) {
249 regmap_update_bits(cs43130->regmap, CS43130_PLL_SET_1,
250 CS43130_PLL_START_MASK, 0);
251
252 cs43130->pll_bypass = true;
253 return 0;
254 }
255
256 cs43130->pll_bypass = false;
257
258 regmap_update_bits(cs43130->regmap, CS43130_PLL_SET_2,
259 CS43130_PLL_DIV_DATA_MASK,
260 pll_entry->pll_div_frac >>
261 CS43130_PLL_DIV_FRAC_0_DATA_SHIFT);
262 regmap_update_bits(cs43130->regmap, CS43130_PLL_SET_3,
263 CS43130_PLL_DIV_DATA_MASK,
264 pll_entry->pll_div_frac >>
265 CS43130_PLL_DIV_FRAC_1_DATA_SHIFT);
266 regmap_update_bits(cs43130->regmap, CS43130_PLL_SET_4,
267 CS43130_PLL_DIV_DATA_MASK,
268 pll_entry->pll_div_frac >>
269 CS43130_PLL_DIV_FRAC_2_DATA_SHIFT);
270 regmap_write(cs43130->regmap, CS43130_PLL_SET_5,
271 pll_entry->pll_div_int);
272 regmap_write(cs43130->regmap, CS43130_PLL_SET_6, pll_entry->pll_divout);
273 regmap_write(cs43130->regmap, CS43130_PLL_SET_7,
274 pll_entry->pll_cal_ratio);
275 regmap_update_bits(cs43130->regmap, CS43130_PLL_SET_8,
276 CS43130_PLL_MODE_MASK,
277 pll_entry->pll_mode << CS43130_PLL_MODE_SHIFT);
278 regmap_write(cs43130->regmap, CS43130_PLL_SET_9,
279 pll_entry->sclk_prediv);
280 regmap_update_bits(cs43130->regmap, CS43130_PLL_SET_1,
281 CS43130_PLL_START_MASK, 1);
282
283 return 0;
284}
285
286static int cs43130_set_pll(struct snd_soc_component *component, int pll_id, int source,
287 unsigned int freq_in, unsigned int freq_out)
288{
289 int ret = 0;
290 struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component);
291
292 switch (freq_in) {
293 case 9600000:
294 case 11289600:
295 case 12000000:
296 case 12288000:
297 case 13000000:
298 case 19200000:
299 case 22579200:
300 case 24000000:
301 case 24576000:
302 case 26000000:
303 cs43130->mclk = freq_in;
304 break;
305 default:
306 dev_err(component->dev,
307 "unsupported pll input reference clock:%d\n", freq_in);
308 return -EINVAL;
309 }
310
311 switch (freq_out) {
312 case 22579200:
313 cs43130->mclk_int = freq_out;
314 break;
315 case 24576000:
316 cs43130->mclk_int = freq_out;
317 break;
318 default:
319 dev_err(component->dev,
320 "unsupported pll output ref clock: %u\n", freq_out);
321 return -EINVAL;
322 }
323
324 ret = cs43130_pll_config(component);
325 dev_dbg(component->dev, "cs43130->pll_bypass = %d", cs43130->pll_bypass);
326 return ret;
327}
328
329static int cs43130_change_clksrc(struct snd_soc_component *component,
330 enum cs43130_mclk_src_sel src)
331{
332 int ret;
333 struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component);
334 int mclk_int_decoded;
335
336 if (src == cs43130->mclk_int_src) {
337 /* clk source has not changed */
338 return 0;
339 }
340
341 switch (cs43130->mclk_int) {
342 case CS43130_MCLK_22M:
343 mclk_int_decoded = CS43130_MCLK_22P5;
344 break;
345 case CS43130_MCLK_24M:
346 mclk_int_decoded = CS43130_MCLK_24P5;
347 break;
348 default:
349 dev_err(component->dev, "Invalid MCLK INT freq: %u\n", cs43130->mclk_int);
350 return -EINVAL;
351 }
352
353 switch (src) {
354 case CS43130_MCLK_SRC_EXT:
355 cs43130->pll_bypass = true;
356 cs43130->mclk_int_src = CS43130_MCLK_SRC_EXT;
357 if (cs43130->xtal_ibias == CS43130_XTAL_UNUSED) {
358 regmap_update_bits(cs43130->regmap, CS43130_PWDN_CTL,
359 CS43130_PDN_XTAL_MASK,
360 1 << CS43130_PDN_XTAL_SHIFT);
361 } else {
362 reinit_completion(&cs43130->xtal_rdy);
363 regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1,
364 CS43130_XTAL_RDY_INT_MASK, 0);
365 regmap_update_bits(cs43130->regmap, CS43130_PWDN_CTL,
366 CS43130_PDN_XTAL_MASK, 0);
367 ret = wait_for_completion_timeout(&cs43130->xtal_rdy,
368 msecs_to_jiffies(100));
369 regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1,
370 CS43130_XTAL_RDY_INT_MASK,
371 1 << CS43130_XTAL_RDY_INT_SHIFT);
372 if (ret == 0) {
373 dev_err(component->dev, "Timeout waiting for XTAL_READY interrupt\n");
374 return -ETIMEDOUT;
375 }
376 }
377
378 regmap_update_bits(cs43130->regmap, CS43130_SYS_CLK_CTL_1,
379 CS43130_MCLK_SRC_SEL_MASK,
380 src << CS43130_MCLK_SRC_SEL_SHIFT);
381 regmap_update_bits(cs43130->regmap, CS43130_SYS_CLK_CTL_1,
382 CS43130_MCLK_INT_MASK,
383 mclk_int_decoded << CS43130_MCLK_INT_SHIFT);
384 usleep_range(150, 200);
385
386 regmap_update_bits(cs43130->regmap, CS43130_PWDN_CTL,
387 CS43130_PDN_PLL_MASK,
388 1 << CS43130_PDN_PLL_SHIFT);
389 break;
390 case CS43130_MCLK_SRC_PLL:
391 cs43130->pll_bypass = false;
392 cs43130->mclk_int_src = CS43130_MCLK_SRC_PLL;
393 if (cs43130->xtal_ibias == CS43130_XTAL_UNUSED) {
394 regmap_update_bits(cs43130->regmap, CS43130_PWDN_CTL,
395 CS43130_PDN_XTAL_MASK,
396 1 << CS43130_PDN_XTAL_SHIFT);
397 } else {
398 reinit_completion(&cs43130->xtal_rdy);
399 regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1,
400 CS43130_XTAL_RDY_INT_MASK, 0);
401 regmap_update_bits(cs43130->regmap, CS43130_PWDN_CTL,
402 CS43130_PDN_XTAL_MASK, 0);
403 ret = wait_for_completion_timeout(&cs43130->xtal_rdy,
404 msecs_to_jiffies(100));
405 regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1,
406 CS43130_XTAL_RDY_INT_MASK,
407 1 << CS43130_XTAL_RDY_INT_SHIFT);
408 if (ret == 0) {
409 dev_err(component->dev, "Timeout waiting for XTAL_READY interrupt\n");
410 return -ETIMEDOUT;
411 }
412 }
413
414 reinit_completion(&cs43130->pll_rdy);
415 regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1,
416 CS43130_PLL_RDY_INT_MASK, 0);
417 regmap_update_bits(cs43130->regmap, CS43130_PWDN_CTL,
418 CS43130_PDN_PLL_MASK, 0);
419 ret = wait_for_completion_timeout(&cs43130->pll_rdy,
420 msecs_to_jiffies(100));
421 regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1,
422 CS43130_PLL_RDY_INT_MASK,
423 1 << CS43130_PLL_RDY_INT_SHIFT);
424 if (ret == 0) {
425 dev_err(component->dev, "Timeout waiting for PLL_READY interrupt\n");
426 return -ETIMEDOUT;
427 }
428
429 regmap_update_bits(cs43130->regmap, CS43130_SYS_CLK_CTL_1,
430 CS43130_MCLK_SRC_SEL_MASK,
431 src << CS43130_MCLK_SRC_SEL_SHIFT);
432 regmap_update_bits(cs43130->regmap, CS43130_SYS_CLK_CTL_1,
433 CS43130_MCLK_INT_MASK,
434 mclk_int_decoded << CS43130_MCLK_INT_SHIFT);
435 usleep_range(150, 200);
436 break;
437 case CS43130_MCLK_SRC_RCO:
438 cs43130->mclk_int_src = CS43130_MCLK_SRC_RCO;
439
440 regmap_update_bits(cs43130->regmap, CS43130_SYS_CLK_CTL_1,
441 CS43130_MCLK_SRC_SEL_MASK,
442 src << CS43130_MCLK_SRC_SEL_SHIFT);
443 regmap_update_bits(cs43130->regmap, CS43130_SYS_CLK_CTL_1,
444 CS43130_MCLK_INT_MASK,
445 CS43130_MCLK_22P5 << CS43130_MCLK_INT_SHIFT);
446 usleep_range(150, 200);
447
448 regmap_update_bits(cs43130->regmap, CS43130_PWDN_CTL,
449 CS43130_PDN_XTAL_MASK,
450 1 << CS43130_PDN_XTAL_SHIFT);
451 regmap_update_bits(cs43130->regmap, CS43130_PWDN_CTL,
452 CS43130_PDN_PLL_MASK,
453 1 << CS43130_PDN_PLL_SHIFT);
454 break;
455 default:
456 dev_err(component->dev, "Invalid MCLK source value\n");
457 return -EINVAL;
458 }
459
460 return 0;
461}
462
463static const struct cs43130_bitwidth_map cs43130_bitwidth_table[] = {
464 {8, CS43130_SP_BIT_SIZE_8, CS43130_CH_BIT_SIZE_8},
465 {16, CS43130_SP_BIT_SIZE_16, CS43130_CH_BIT_SIZE_16},
466 {24, CS43130_SP_BIT_SIZE_24, CS43130_CH_BIT_SIZE_24},
467 {32, CS43130_SP_BIT_SIZE_32, CS43130_CH_BIT_SIZE_32},
468};
469
470static const struct cs43130_bitwidth_map *cs43130_get_bitwidth_table(
471 unsigned int bitwidth)
472{
473 int i;
474
475 for (i = 0; i < ARRAY_SIZE(cs43130_bitwidth_table); i++) {
476 if (cs43130_bitwidth_table[i].bitwidth == bitwidth)
477 return &cs43130_bitwidth_table[i];
478 }
479
480 return NULL;
481}
482
483static int cs43130_set_bitwidth(int dai_id, unsigned int bitwidth_dai,
484 struct regmap *regmap)
485{
486 const struct cs43130_bitwidth_map *bw_map;
487
488 bw_map = cs43130_get_bitwidth_table(bitwidth_dai);
489 if (!bw_map)
490 return -EINVAL;
491
492 switch (dai_id) {
493 case CS43130_ASP_PCM_DAI:
494 case CS43130_ASP_DOP_DAI:
495 regmap_update_bits(regmap, CS43130_ASP_CH_1_SZ_EN,
496 CS43130_CH_BITSIZE_MASK, bw_map->ch_bit);
497 regmap_update_bits(regmap, CS43130_ASP_CH_2_SZ_EN,
498 CS43130_CH_BITSIZE_MASK, bw_map->ch_bit);
499 regmap_update_bits(regmap, CS43130_SP_BITSIZE,
500 CS43130_ASP_BITSIZE_MASK, bw_map->sp_bit);
501 break;
502 case CS43130_XSP_DOP_DAI:
503 regmap_update_bits(regmap, CS43130_XSP_CH_1_SZ_EN,
504 CS43130_CH_BITSIZE_MASK, bw_map->ch_bit);
505 regmap_update_bits(regmap, CS43130_XSP_CH_2_SZ_EN,
506 CS43130_CH_BITSIZE_MASK, bw_map->ch_bit);
507 regmap_update_bits(regmap, CS43130_SP_BITSIZE,
508 CS43130_XSP_BITSIZE_MASK, bw_map->sp_bit <<
509 CS43130_XSP_BITSIZE_SHIFT);
510 break;
511 default:
512 return -EINVAL;
513 }
514
515 return 0;
516}
517
518static const struct cs43130_rate_map cs43130_rate_table[] = {
519 {32000, CS43130_ASP_SPRATE_32K},
520 {44100, CS43130_ASP_SPRATE_44_1K},
521 {48000, CS43130_ASP_SPRATE_48K},
522 {88200, CS43130_ASP_SPRATE_88_2K},
523 {96000, CS43130_ASP_SPRATE_96K},
524 {176400, CS43130_ASP_SPRATE_176_4K},
525 {192000, CS43130_ASP_SPRATE_192K},
526 {352800, CS43130_ASP_SPRATE_352_8K},
527 {384000, CS43130_ASP_SPRATE_384K},
528};
529
530static const struct cs43130_rate_map *cs43130_get_rate_table(int fs)
531{
532 int i;
533
534 for (i = 0; i < ARRAY_SIZE(cs43130_rate_table); i++) {
535 if (cs43130_rate_table[i].fs == fs)
536 return &cs43130_rate_table[i];
537 }
538
539 return NULL;
540}
541
542static const struct cs43130_clk_gen *cs43130_get_clk_gen(int mclk_int, int fs,
543 const struct cs43130_clk_gen *clk_gen_table, int len_clk_gen_table)
544{
545 int i;
546
547 for (i = 0; i < len_clk_gen_table; i++) {
548 if (clk_gen_table[i].mclk_int == mclk_int &&
549 clk_gen_table[i].fs == fs)
550 return &clk_gen_table[i];
551 }
552
553 return NULL;
554}
555
556static int cs43130_set_sp_fmt(int dai_id, unsigned int bitwidth_sclk,
557 struct snd_pcm_hw_params *params,
558 struct cs43130_private *cs43130)
559{
560 u16 frm_size;
561 u16 hi_size;
562 u8 frm_delay;
563 u8 frm_phase;
564 u8 frm_data;
565 u8 sclk_edge;
566 u8 lrck_edge;
567 u8 clk_data;
568 u8 loc_ch1;
569 u8 loc_ch2;
570 u8 dai_mode_val;
571 const struct cs43130_clk_gen *clk_gen;
572
573 switch (cs43130->dais[dai_id].dai_format) {
574 case SND_SOC_DAIFMT_I2S:
575 hi_size = bitwidth_sclk;
576 frm_delay = 2;
577 frm_phase = 0;
578 break;
579 case SND_SOC_DAIFMT_LEFT_J:
580 hi_size = bitwidth_sclk;
581 frm_delay = 2;
582 frm_phase = 1;
583 break;
584 case SND_SOC_DAIFMT_DSP_A:
585 hi_size = 1;
586 frm_delay = 2;
587 frm_phase = 1;
588 break;
589 case SND_SOC_DAIFMT_DSP_B:
590 hi_size = 1;
591 frm_delay = 0;
592 frm_phase = 1;
593 break;
594 default:
595 return -EINVAL;
596 }
597
598 switch (cs43130->dais[dai_id].dai_mode) {
599 case SND_SOC_DAIFMT_CBS_CFS:
600 dai_mode_val = 0;
601 break;
602 case SND_SOC_DAIFMT_CBM_CFM:
603 dai_mode_val = 1;
604 break;
605 default:
606 return -EINVAL;
607 }
608
609 frm_size = bitwidth_sclk * params_channels(params);
610 sclk_edge = 1;
611 lrck_edge = 0;
612 loc_ch1 = 0;
613 loc_ch2 = bitwidth_sclk * (params_channels(params) - 1);
614
615 frm_data = frm_delay & CS43130_SP_FSD_MASK;
616 frm_data |= (frm_phase << CS43130_SP_STP_SHIFT) & CS43130_SP_STP_MASK;
617
618 clk_data = lrck_edge & CS43130_SP_LCPOL_IN_MASK;
619 clk_data |= (lrck_edge << CS43130_SP_LCPOL_OUT_SHIFT) &
620 CS43130_SP_LCPOL_OUT_MASK;
621 clk_data |= (sclk_edge << CS43130_SP_SCPOL_IN_SHIFT) &
622 CS43130_SP_SCPOL_IN_MASK;
623 clk_data |= (sclk_edge << CS43130_SP_SCPOL_OUT_SHIFT) &
624 CS43130_SP_SCPOL_OUT_MASK;
625 clk_data |= (dai_mode_val << CS43130_SP_MODE_SHIFT) &
626 CS43130_SP_MODE_MASK;
627
628 switch (dai_id) {
629 case CS43130_ASP_PCM_DAI:
630 case CS43130_ASP_DOP_DAI:
631 regmap_update_bits(cs43130->regmap, CS43130_ASP_LRCK_PERIOD_1,
632 CS43130_SP_LCPR_DATA_MASK, (frm_size - 1) >>
633 CS43130_SP_LCPR_LSB_DATA_SHIFT);
634 regmap_update_bits(cs43130->regmap, CS43130_ASP_LRCK_PERIOD_2,
635 CS43130_SP_LCPR_DATA_MASK, (frm_size - 1) >>
636 CS43130_SP_LCPR_MSB_DATA_SHIFT);
637 regmap_update_bits(cs43130->regmap, CS43130_ASP_LRCK_HI_TIME_1,
638 CS43130_SP_LCHI_DATA_MASK, (hi_size - 1) >>
639 CS43130_SP_LCHI_LSB_DATA_SHIFT);
640 regmap_update_bits(cs43130->regmap, CS43130_ASP_LRCK_HI_TIME_2,
641 CS43130_SP_LCHI_DATA_MASK, (hi_size - 1) >>
642 CS43130_SP_LCHI_MSB_DATA_SHIFT);
643 regmap_write(cs43130->regmap, CS43130_ASP_FRAME_CONF, frm_data);
644 regmap_write(cs43130->regmap, CS43130_ASP_CH_1_LOC, loc_ch1);
645 regmap_write(cs43130->regmap, CS43130_ASP_CH_2_LOC, loc_ch2);
646 regmap_update_bits(cs43130->regmap, CS43130_ASP_CH_1_SZ_EN,
647 CS43130_CH_EN_MASK, 1 << CS43130_CH_EN_SHIFT);
648 regmap_update_bits(cs43130->regmap, CS43130_ASP_CH_2_SZ_EN,
649 CS43130_CH_EN_MASK, 1 << CS43130_CH_EN_SHIFT);
650 regmap_write(cs43130->regmap, CS43130_ASP_CLOCK_CONF, clk_data);
651 break;
652 case CS43130_XSP_DOP_DAI:
653 regmap_update_bits(cs43130->regmap, CS43130_XSP_LRCK_PERIOD_1,
654 CS43130_SP_LCPR_DATA_MASK, (frm_size - 1) >>
655 CS43130_SP_LCPR_LSB_DATA_SHIFT);
656 regmap_update_bits(cs43130->regmap, CS43130_XSP_LRCK_PERIOD_2,
657 CS43130_SP_LCPR_DATA_MASK, (frm_size - 1) >>
658 CS43130_SP_LCPR_MSB_DATA_SHIFT);
659 regmap_update_bits(cs43130->regmap, CS43130_XSP_LRCK_HI_TIME_1,
660 CS43130_SP_LCHI_DATA_MASK, (hi_size - 1) >>
661 CS43130_SP_LCHI_LSB_DATA_SHIFT);
662 regmap_update_bits(cs43130->regmap, CS43130_XSP_LRCK_HI_TIME_2,
663 CS43130_SP_LCHI_DATA_MASK, (hi_size - 1) >>
664 CS43130_SP_LCHI_MSB_DATA_SHIFT);
665 regmap_write(cs43130->regmap, CS43130_XSP_FRAME_CONF, frm_data);
666 regmap_write(cs43130->regmap, CS43130_XSP_CH_1_LOC, loc_ch1);
667 regmap_write(cs43130->regmap, CS43130_XSP_CH_2_LOC, loc_ch2);
668 regmap_update_bits(cs43130->regmap, CS43130_XSP_CH_1_SZ_EN,
669 CS43130_CH_EN_MASK, 1 << CS43130_CH_EN_SHIFT);
670 regmap_update_bits(cs43130->regmap, CS43130_XSP_CH_2_SZ_EN,
671 CS43130_CH_EN_MASK, 1 << CS43130_CH_EN_SHIFT);
672 regmap_write(cs43130->regmap, CS43130_XSP_CLOCK_CONF, clk_data);
673 break;
674 default:
675 return -EINVAL;
676 }
677
678 switch (frm_size) {
679 case 16:
680 clk_gen = cs43130_get_clk_gen(cs43130->mclk_int,
681 params_rate(params),
682 cs43130_16_clk_gen,
683 ARRAY_SIZE(cs43130_16_clk_gen));
684 break;
685 case 32:
686 clk_gen = cs43130_get_clk_gen(cs43130->mclk_int,
687 params_rate(params),
688 cs43130_32_clk_gen,
689 ARRAY_SIZE(cs43130_32_clk_gen));
690 break;
691 case 48:
692 clk_gen = cs43130_get_clk_gen(cs43130->mclk_int,
693 params_rate(params),
694 cs43130_48_clk_gen,
695 ARRAY_SIZE(cs43130_48_clk_gen));
696 break;
697 case 64:
698 clk_gen = cs43130_get_clk_gen(cs43130->mclk_int,
699 params_rate(params),
700 cs43130_64_clk_gen,
701 ARRAY_SIZE(cs43130_64_clk_gen));
702 break;
703 default:
704 return -EINVAL;
705 }
706
707 if (!clk_gen)
708 return -EINVAL;
709
710 switch (dai_id) {
711 case CS43130_ASP_PCM_DAI:
712 case CS43130_ASP_DOP_DAI:
713 regmap_write(cs43130->regmap, CS43130_ASP_DEN_1,
714 (clk_gen->den & CS43130_SP_M_LSB_DATA_MASK) >>
715 CS43130_SP_M_LSB_DATA_SHIFT);
716 regmap_write(cs43130->regmap, CS43130_ASP_DEN_2,
717 (clk_gen->den & CS43130_SP_M_MSB_DATA_MASK) >>
718 CS43130_SP_M_MSB_DATA_SHIFT);
719 regmap_write(cs43130->regmap, CS43130_ASP_NUM_1,
720 (clk_gen->num & CS43130_SP_N_LSB_DATA_MASK) >>
721 CS43130_SP_N_LSB_DATA_SHIFT);
722 regmap_write(cs43130->regmap, CS43130_ASP_NUM_2,
723 (clk_gen->num & CS43130_SP_N_MSB_DATA_MASK) >>
724 CS43130_SP_N_MSB_DATA_SHIFT);
725 break;
726 case CS43130_XSP_DOP_DAI:
727 regmap_write(cs43130->regmap, CS43130_XSP_DEN_1,
728 (clk_gen->den & CS43130_SP_M_LSB_DATA_MASK) >>
729 CS43130_SP_M_LSB_DATA_SHIFT);
730 regmap_write(cs43130->regmap, CS43130_XSP_DEN_2,
731 (clk_gen->den & CS43130_SP_M_MSB_DATA_MASK) >>
732 CS43130_SP_M_MSB_DATA_SHIFT);
733 regmap_write(cs43130->regmap, CS43130_XSP_NUM_1,
734 (clk_gen->num & CS43130_SP_N_LSB_DATA_MASK) >>
735 CS43130_SP_N_LSB_DATA_SHIFT);
736 regmap_write(cs43130->regmap, CS43130_XSP_NUM_2,
737 (clk_gen->num & CS43130_SP_N_MSB_DATA_MASK) >>
738 CS43130_SP_N_MSB_DATA_SHIFT);
739 break;
740 default:
741 return -EINVAL;
742 }
743
744 return 0;
745}
746
747static int cs43130_pcm_dsd_mix(bool en, struct regmap *regmap)
748{
749 if (en) {
750 regmap_update_bits(regmap, CS43130_DSD_PCM_MIX_CTL,
751 CS43130_MIX_PCM_PREP_MASK,
752 1 << CS43130_MIX_PCM_PREP_SHIFT);
753 usleep_range(6000, 6050);
754 regmap_update_bits(regmap, CS43130_DSD_PCM_MIX_CTL,
755 CS43130_MIX_PCM_DSD_MASK,
756 1 << CS43130_MIX_PCM_DSD_SHIFT);
757 } else {
758 regmap_update_bits(regmap, CS43130_DSD_PCM_MIX_CTL,
759 CS43130_MIX_PCM_DSD_MASK,
760 0 << CS43130_MIX_PCM_DSD_SHIFT);
761 usleep_range(1600, 1650);
762 regmap_update_bits(regmap, CS43130_DSD_PCM_MIX_CTL,
763 CS43130_MIX_PCM_PREP_MASK,
764 0 << CS43130_MIX_PCM_PREP_SHIFT);
765 }
766
767 return 0;
768}
769
770static int cs43130_dsd_hw_params(struct snd_pcm_substream *substream,
771 struct snd_pcm_hw_params *params,
772 struct snd_soc_dai *dai)
773{
774 struct snd_soc_component *component = dai->component;
775 struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component);
776 unsigned int required_clk;
777 u8 dsd_speed;
778
779 mutex_lock(&cs43130->clk_mutex);
780 if (!cs43130->clk_req) {
781 /* no DAI is currently using clk */
782 if (!(CS43130_MCLK_22M % params_rate(params)))
783 required_clk = CS43130_MCLK_22M;
784 else
785 required_clk = CS43130_MCLK_24M;
786
787 cs43130_set_pll(component, 0, 0, cs43130->mclk, required_clk);
788 if (cs43130->pll_bypass)
789 cs43130_change_clksrc(component, CS43130_MCLK_SRC_EXT);
790 else
791 cs43130_change_clksrc(component, CS43130_MCLK_SRC_PLL);
792 }
793
794 cs43130->clk_req++;
795 if (cs43130->clk_req == 2)
796 cs43130_pcm_dsd_mix(true, cs43130->regmap);
797 mutex_unlock(&cs43130->clk_mutex);
798
799 switch (params_rate(params)) {
800 case 176400:
801 dsd_speed = 0;
802 break;
803 case 352800:
804 dsd_speed = 1;
805 break;
806 default:
807 dev_err(component->dev, "Rate(%u) not supported\n",
808 params_rate(params));
809 return -EINVAL;
810 }
811
812 if (cs43130->dais[dai->id].dai_mode == SND_SOC_DAIFMT_CBM_CFM)
813 regmap_update_bits(cs43130->regmap, CS43130_DSD_INT_CFG,
814 CS43130_DSD_MASTER, CS43130_DSD_MASTER);
815 else
816 regmap_update_bits(cs43130->regmap, CS43130_DSD_INT_CFG,
817 CS43130_DSD_MASTER, 0);
818
819 regmap_update_bits(cs43130->regmap, CS43130_DSD_PATH_CTL_2,
820 CS43130_DSD_SPEED_MASK,
821 dsd_speed << CS43130_DSD_SPEED_SHIFT);
822 regmap_update_bits(cs43130->regmap, CS43130_DSD_PATH_CTL_2,
823 CS43130_DSD_SRC_MASK, CS43130_DSD_SRC_DSD <<
824 CS43130_DSD_SRC_SHIFT);
825
826 return 0;
827}
828
829static int cs43130_hw_params(struct snd_pcm_substream *substream,
830 struct snd_pcm_hw_params *params,
831 struct snd_soc_dai *dai)
832{
833 struct snd_soc_component *component = dai->component;
834 struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component);
835 const struct cs43130_rate_map *rate_map;
836 unsigned int sclk = cs43130->dais[dai->id].sclk;
837 unsigned int bitwidth_sclk;
838 unsigned int bitwidth_dai = (unsigned int)(params_width(params));
839 unsigned int required_clk;
840 u8 dsd_speed;
841
842 mutex_lock(&cs43130->clk_mutex);
843 if (!cs43130->clk_req) {
844 /* no DAI is currently using clk */
845 if (!(CS43130_MCLK_22M % params_rate(params)))
846 required_clk = CS43130_MCLK_22M;
847 else
848 required_clk = CS43130_MCLK_24M;
849
850 cs43130_set_pll(component, 0, 0, cs43130->mclk, required_clk);
851 if (cs43130->pll_bypass)
852 cs43130_change_clksrc(component, CS43130_MCLK_SRC_EXT);
853 else
854 cs43130_change_clksrc(component, CS43130_MCLK_SRC_PLL);
855 }
856
857 cs43130->clk_req++;
858 if (cs43130->clk_req == 2)
859 cs43130_pcm_dsd_mix(true, cs43130->regmap);
860 mutex_unlock(&cs43130->clk_mutex);
861
862 switch (dai->id) {
863 case CS43130_ASP_DOP_DAI:
864 case CS43130_XSP_DOP_DAI:
865 /* DoP bitwidth is always 24-bit */
866 bitwidth_dai = 24;
867 sclk = params_rate(params) * bitwidth_dai *
868 params_channels(params);
869
870 switch (params_rate(params)) {
871 case 176400:
872 dsd_speed = 0;
873 break;
874 case 352800:
875 dsd_speed = 1;
876 break;
877 default:
878 dev_err(component->dev, "Rate(%u) not supported\n",
879 params_rate(params));
880 return -EINVAL;
881 }
882
883 regmap_update_bits(cs43130->regmap, CS43130_DSD_PATH_CTL_2,
884 CS43130_DSD_SPEED_MASK,
885 dsd_speed << CS43130_DSD_SPEED_SHIFT);
886 break;
887 case CS43130_ASP_PCM_DAI:
888 rate_map = cs43130_get_rate_table(params_rate(params));
889 if (!rate_map)
890 return -EINVAL;
891
892 regmap_write(cs43130->regmap, CS43130_SP_SRATE, rate_map->val);
893 break;
894 default:
895 dev_err(component->dev, "Invalid DAI (%d)\n", dai->id);
896 return -EINVAL;
897 }
898
899 switch (dai->id) {
900 case CS43130_ASP_DOP_DAI:
901 regmap_update_bits(cs43130->regmap, CS43130_DSD_PATH_CTL_2,
902 CS43130_DSD_SRC_MASK, CS43130_DSD_SRC_ASP <<
903 CS43130_DSD_SRC_SHIFT);
904 break;
905 case CS43130_XSP_DOP_DAI:
906 regmap_update_bits(cs43130->regmap, CS43130_DSD_PATH_CTL_2,
907 CS43130_DSD_SRC_MASK, CS43130_DSD_SRC_XSP <<
908 CS43130_DSD_SRC_SHIFT);
909 break;
910 }
911
912 if (!sclk && cs43130->dais[dai->id].dai_mode == SND_SOC_DAIFMT_CBM_CFM)
913 /* Calculate SCLK in master mode if unassigned */
914 sclk = params_rate(params) * bitwidth_dai *
915 params_channels(params);
916
917 if (!sclk) {
918 /* at this point, SCLK must be set */
919 dev_err(component->dev, "SCLK freq is not set\n");
920 return -EINVAL;
921 }
922
923 bitwidth_sclk = (sclk / params_rate(params)) / params_channels(params);
924 if (bitwidth_sclk < bitwidth_dai) {
925 dev_err(component->dev, "Format not supported: SCLK freq is too low\n");
926 return -EINVAL;
927 }
928
929 dev_dbg(component->dev,
930 "sclk = %u, fs = %d, bitwidth_dai = %u\n",
931 sclk, params_rate(params), bitwidth_dai);
932
933 dev_dbg(component->dev,
934 "bitwidth_sclk = %u, num_ch = %u\n",
935 bitwidth_sclk, params_channels(params));
936
937 cs43130_set_bitwidth(dai->id, bitwidth_dai, cs43130->regmap);
938 cs43130_set_sp_fmt(dai->id, bitwidth_sclk, params, cs43130);
939
940 return 0;
941}
942
943static int cs43130_hw_free(struct snd_pcm_substream *substream,
944 struct snd_soc_dai *dai)
945{
946 struct snd_soc_component *component = dai->component;
947 struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component);
948
949 mutex_lock(&cs43130->clk_mutex);
950 cs43130->clk_req--;
951 if (!cs43130->clk_req) {
952 /* no DAI is currently using clk */
953 cs43130_change_clksrc(component, CS43130_MCLK_SRC_RCO);
954 cs43130_pcm_dsd_mix(false, cs43130->regmap);
955 }
956 mutex_unlock(&cs43130->clk_mutex);
957
958 return 0;
959}
960
961static const DECLARE_TLV_DB_SCALE(pcm_vol_tlv, -12750, 50, 1);
962
963static const char * const pcm_ch_text[] = {
964 "Left-Right Ch",
965 "Left-Left Ch",
966 "Right-Left Ch",
967 "Right-Right Ch",
968};
969
970static const struct reg_sequence pcm_ch_en_seq[] = {
971 {CS43130_DXD1, 0x99},
972 {0x180005, 0x8C},
973 {0x180007, 0xAB},
974 {0x180015, 0x31},
975 {0x180017, 0xB2},
976 {0x180025, 0x30},
977 {0x180027, 0x84},
978 {0x180035, 0x9C},
979 {0x180037, 0xAE},
980 {0x18000D, 0x24},
981 {0x18000F, 0xA3},
982 {0x18001D, 0x05},
983 {0x18001F, 0xD4},
984 {0x18002D, 0x0B},
985 {0x18002F, 0xC7},
986 {0x18003D, 0x71},
987 {0x18003F, 0xE7},
988 {CS43130_DXD1, 0},
989};
990
991static const struct reg_sequence pcm_ch_dis_seq[] = {
992 {CS43130_DXD1, 0x99},
993 {0x180005, 0x24},
994 {0x180007, 0xA3},
995 {0x180015, 0x05},
996 {0x180017, 0xD4},
997 {0x180025, 0x0B},
998 {0x180027, 0xC7},
999 {0x180035, 0x71},
1000 {0x180037, 0xE7},
1001 {0x18000D, 0x8C},
1002 {0x18000F, 0xAB},
1003 {0x18001D, 0x31},
1004 {0x18001F, 0xB2},
1005 {0x18002D, 0x30},
1006 {0x18002F, 0x84},
1007 {0x18003D, 0x9C},
1008 {0x18003F, 0xAE},
1009 {CS43130_DXD1, 0},
1010};
1011
1012static int cs43130_pcm_ch_get(struct snd_kcontrol *kcontrol,
1013 struct snd_ctl_elem_value *ucontrol)
1014{
1015 return snd_soc_get_enum_double(kcontrol, ucontrol);
1016}
1017
1018static int cs43130_pcm_ch_put(struct snd_kcontrol *kcontrol,
1019 struct snd_ctl_elem_value *ucontrol)
1020{
1021 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
1022 unsigned int *item = ucontrol->value.enumerated.item;
1023 struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
1024 struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component);
1025 unsigned int val;
1026
1027 if (item[0] >= e->items)
1028 return -EINVAL;
1029 val = snd_soc_enum_item_to_val(e, item[0]) << e->shift_l;
1030
1031 switch (cs43130->dev_id) {
1032 case CS43131_CHIP_ID:
1033 case CS43198_CHIP_ID:
1034 if (val >= 2)
1035 regmap_multi_reg_write(cs43130->regmap, pcm_ch_en_seq,
1036 ARRAY_SIZE(pcm_ch_en_seq));
1037 else
1038 regmap_multi_reg_write(cs43130->regmap, pcm_ch_dis_seq,
1039 ARRAY_SIZE(pcm_ch_dis_seq));
1040 break;
1041 }
1042
1043 return snd_soc_put_enum_double(kcontrol, ucontrol);
1044}
1045
1046static SOC_ENUM_SINGLE_DECL(pcm_ch_enum, CS43130_PCM_PATH_CTL_2, 0,
1047 pcm_ch_text);
1048
1049static const char * const pcm_spd_texts[] = {
1050 "Fast",
1051 "Slow",
1052};
1053
1054static SOC_ENUM_SINGLE_DECL(pcm_spd_enum, CS43130_PCM_FILT_OPT, 7,
1055 pcm_spd_texts);
1056
1057static const char * const dsd_texts[] = {
1058 "Off",
1059 "BCKA Mode",
1060 "BCKD Mode",
1061};
1062
1063static const unsigned int dsd_values[] = {
1064 CS43130_DSD_SRC_DSD,
1065 CS43130_DSD_SRC_ASP,
1066 CS43130_DSD_SRC_XSP,
1067};
1068
1069static SOC_VALUE_ENUM_SINGLE_DECL(dsd_enum, CS43130_DSD_INT_CFG, 0, 0x03,
1070 dsd_texts, dsd_values);
1071
1072static const struct snd_kcontrol_new cs43130_snd_controls[] = {
1073 SOC_DOUBLE_R_TLV("Master Playback Volume",
1074 CS43130_PCM_VOL_A, CS43130_PCM_VOL_B, 0, 0xFF, 1,
1075 pcm_vol_tlv),
1076 SOC_DOUBLE_R_TLV("Master DSD Playback Volume",
1077 CS43130_DSD_VOL_A, CS43130_DSD_VOL_B, 0, 0xFF, 1,
1078 pcm_vol_tlv),
1079 SOC_ENUM_EXT("PCM Ch Select", pcm_ch_enum, cs43130_pcm_ch_get,
1080 cs43130_pcm_ch_put),
1081 SOC_ENUM("PCM Filter Speed", pcm_spd_enum),
1082 SOC_SINGLE("PCM Phase Compensation", CS43130_PCM_FILT_OPT, 6, 1, 0),
1083 SOC_SINGLE("PCM Nonoversample Emulate", CS43130_PCM_FILT_OPT, 5, 1, 0),
1084 SOC_SINGLE("PCM High-pass Filter", CS43130_PCM_FILT_OPT, 1, 1, 0),
1085 SOC_SINGLE("PCM De-emphasis Filter", CS43130_PCM_FILT_OPT, 0, 1, 0),
1086 SOC_ENUM("DSD Phase Modulation", dsd_enum),
1087};
1088
1089static const struct reg_sequence pcm_seq[] = {
1090 {CS43130_DXD1, 0x99},
1091 {CS43130_DXD7, 0x01},
1092 {CS43130_DXD8, 0},
1093 {CS43130_DXD9, 0x01},
1094 {CS43130_DXD3, 0x12},
1095 {CS43130_DXD4, 0},
1096 {CS43130_DXD10, 0x28},
1097 {CS43130_DXD11, 0x28},
1098 {CS43130_DXD1, 0},
1099};
1100
1101static const struct reg_sequence dsd_seq[] = {
1102 {CS43130_DXD1, 0x99},
1103 {CS43130_DXD7, 0x01},
1104 {CS43130_DXD8, 0},
1105 {CS43130_DXD9, 0x01},
1106 {CS43130_DXD3, 0x12},
1107 {CS43130_DXD4, 0},
1108 {CS43130_DXD10, 0x1E},
1109 {CS43130_DXD11, 0x20},
1110 {CS43130_DXD1, 0},
1111};
1112
1113static const struct reg_sequence pop_free_seq[] = {
1114 {CS43130_DXD1, 0x99},
1115 {CS43130_DXD12, 0x0A},
1116 {CS43130_DXD1, 0},
1117};
1118
1119static const struct reg_sequence pop_free_seq2[] = {
1120 {CS43130_DXD1, 0x99},
1121 {CS43130_DXD13, 0x20},
1122 {CS43130_DXD1, 0},
1123};
1124
1125static const struct reg_sequence mute_seq[] = {
1126 {CS43130_DXD1, 0x99},
1127 {CS43130_DXD3, 0x12},
1128 {CS43130_DXD5, 0x02},
1129 {CS43130_DXD4, 0x12},
1130 {CS43130_DXD1, 0},
1131};
1132
1133static const struct reg_sequence unmute_seq[] = {
1134 {CS43130_DXD1, 0x99},
1135 {CS43130_DXD3, 0x10},
1136 {CS43130_DXD5, 0},
1137 {CS43130_DXD4, 0x16},
1138 {CS43130_DXD1, 0},
1139};
1140
1141static int cs43130_dsd_event(struct snd_soc_dapm_widget *w,
1142 struct snd_kcontrol *kcontrol, int event)
1143{
1144 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
1145 struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component);
1146
1147 switch (event) {
1148 case SND_SOC_DAPM_PRE_PMU:
1149 switch (cs43130->dev_id) {
1150 case CS43130_CHIP_ID:
1151 case CS4399_CHIP_ID:
1152 regmap_multi_reg_write(cs43130->regmap, dsd_seq,
1153 ARRAY_SIZE(dsd_seq));
1154 break;
1155 }
1156 break;
1157 case SND_SOC_DAPM_POST_PMU:
1158 regmap_update_bits(cs43130->regmap, CS43130_DSD_PATH_CTL_1,
1159 CS43130_MUTE_MASK, 0);
1160 switch (cs43130->dev_id) {
1161 case CS43130_CHIP_ID:
1162 case CS4399_CHIP_ID:
1163 regmap_multi_reg_write(cs43130->regmap, unmute_seq,
1164 ARRAY_SIZE(unmute_seq));
1165 break;
1166 }
1167 break;
1168 case SND_SOC_DAPM_PRE_PMD:
1169 switch (cs43130->dev_id) {
1170 case CS43130_CHIP_ID:
1171 case CS4399_CHIP_ID:
1172 regmap_multi_reg_write(cs43130->regmap, mute_seq,
1173 ARRAY_SIZE(mute_seq));
1174 regmap_update_bits(cs43130->regmap,
1175 CS43130_DSD_PATH_CTL_1,
1176 CS43130_MUTE_MASK, CS43130_MUTE_EN);
1177 /*
1178 * DSD Power Down Sequence
1179 * According to Design, 130ms is preferred.
1180 */
1181 msleep(130);
1182 break;
1183 case CS43131_CHIP_ID:
1184 case CS43198_CHIP_ID:
1185 regmap_update_bits(cs43130->regmap,
1186 CS43130_DSD_PATH_CTL_1,
1187 CS43130_MUTE_MASK, CS43130_MUTE_EN);
1188 break;
1189 }
1190 break;
1191 default:
1192 dev_err(component->dev, "Invalid event = 0x%x\n", event);
1193 return -EINVAL;
1194 }
1195 return 0;
1196}
1197
1198static int cs43130_pcm_event(struct snd_soc_dapm_widget *w,
1199 struct snd_kcontrol *kcontrol, int event)
1200{
1201 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
1202 struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component);
1203
1204 switch (event) {
1205 case SND_SOC_DAPM_PRE_PMU:
1206 switch (cs43130->dev_id) {
1207 case CS43130_CHIP_ID:
1208 case CS4399_CHIP_ID:
1209 regmap_multi_reg_write(cs43130->regmap, pcm_seq,
1210 ARRAY_SIZE(pcm_seq));
1211 break;
1212 }
1213 break;
1214 case SND_SOC_DAPM_POST_PMU:
1215 regmap_update_bits(cs43130->regmap, CS43130_PCM_PATH_CTL_1,
1216 CS43130_MUTE_MASK, 0);
1217 switch (cs43130->dev_id) {
1218 case CS43130_CHIP_ID:
1219 case CS4399_CHIP_ID:
1220 regmap_multi_reg_write(cs43130->regmap, unmute_seq,
1221 ARRAY_SIZE(unmute_seq));
1222 break;
1223 }
1224 break;
1225 case SND_SOC_DAPM_PRE_PMD:
1226 switch (cs43130->dev_id) {
1227 case CS43130_CHIP_ID:
1228 case CS4399_CHIP_ID:
1229 regmap_multi_reg_write(cs43130->regmap, mute_seq,
1230 ARRAY_SIZE(mute_seq));
1231 regmap_update_bits(cs43130->regmap,
1232 CS43130_PCM_PATH_CTL_1,
1233 CS43130_MUTE_MASK, CS43130_MUTE_EN);
1234 /*
1235 * PCM Power Down Sequence
1236 * According to Design, 130ms is preferred.
1237 */
1238 msleep(130);
1239 break;
1240 case CS43131_CHIP_ID:
1241 case CS43198_CHIP_ID:
1242 regmap_update_bits(cs43130->regmap,
1243 CS43130_PCM_PATH_CTL_1,
1244 CS43130_MUTE_MASK, CS43130_MUTE_EN);
1245 break;
1246 }
1247 break;
1248 default:
1249 dev_err(component->dev, "Invalid event = 0x%x\n", event);
1250 return -EINVAL;
1251 }
1252 return 0;
1253}
1254
1255static const struct reg_sequence dac_postpmu_seq[] = {
1256 {CS43130_DXD9, 0x0C},
1257 {CS43130_DXD3, 0x10},
1258 {CS43130_DXD4, 0x20},
1259};
1260
1261static const struct reg_sequence dac_postpmd_seq[] = {
1262 {CS43130_DXD1, 0x99},
1263 {CS43130_DXD6, 0x01},
1264 {CS43130_DXD1, 0},
1265};
1266
1267static int cs43130_dac_event(struct snd_soc_dapm_widget *w,
1268 struct snd_kcontrol *kcontrol, int event)
1269{
1270 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
1271 struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component);
1272
1273 switch (event) {
1274 case SND_SOC_DAPM_PRE_PMU:
1275 switch (cs43130->dev_id) {
1276 case CS43130_CHIP_ID:
1277 case CS4399_CHIP_ID:
1278 regmap_multi_reg_write(cs43130->regmap, pop_free_seq,
1279 ARRAY_SIZE(pop_free_seq));
1280 break;
1281 case CS43131_CHIP_ID:
1282 case CS43198_CHIP_ID:
1283 regmap_multi_reg_write(cs43130->regmap, pop_free_seq2,
1284 ARRAY_SIZE(pop_free_seq2));
1285 break;
1286 }
1287 break;
1288 case SND_SOC_DAPM_POST_PMU:
1289 usleep_range(10000, 10050);
1290
1291 regmap_write(cs43130->regmap, CS43130_DXD1, 0x99);
1292
1293 switch (cs43130->dev_id) {
1294 case CS43130_CHIP_ID:
1295 case CS4399_CHIP_ID:
1296 regmap_multi_reg_write(cs43130->regmap, dac_postpmu_seq,
1297 ARRAY_SIZE(dac_postpmu_seq));
1298 /*
1299 * Per datasheet, Sec. PCM Power-Up Sequence.
1300 * According to Design, CS43130_DXD12 must be 0 to meet
1301 * THDN and Dynamic Range spec.
1302 */
1303 msleep(1000);
1304 regmap_write(cs43130->regmap, CS43130_DXD12, 0);
1305 break;
1306 case CS43131_CHIP_ID:
1307 case CS43198_CHIP_ID:
1308 usleep_range(12000, 12010);
1309 regmap_write(cs43130->regmap, CS43130_DXD13, 0);
1310 break;
1311 }
1312
1313 regmap_write(cs43130->regmap, CS43130_DXD1, 0);
1314 break;
1315 case SND_SOC_DAPM_POST_PMD:
1316 switch (cs43130->dev_id) {
1317 case CS43130_CHIP_ID:
1318 case CS4399_CHIP_ID:
1319 regmap_multi_reg_write(cs43130->regmap, dac_postpmd_seq,
1320 ARRAY_SIZE(dac_postpmd_seq));
1321 break;
1322 }
1323 break;
1324 default:
1325 dev_err(component->dev, "Invalid DAC event = 0x%x\n", event);
1326 return -EINVAL;
1327 }
1328 return 0;
1329}
1330
1331static const struct reg_sequence hpin_prepmd_seq[] = {
1332 {CS43130_DXD1, 0x99},
1333 {CS43130_DXD15, 0x64},
1334 {CS43130_DXD14, 0},
1335 {CS43130_DXD2, 0},
1336 {CS43130_DXD1, 0},
1337};
1338
1339static const struct reg_sequence hpin_postpmu_seq[] = {
1340 {CS43130_DXD1, 0x99},
1341 {CS43130_DXD2, 1},
1342 {CS43130_DXD14, 0xDC},
1343 {CS43130_DXD15, 0xE4},
1344 {CS43130_DXD1, 0},
1345};
1346
1347static int cs43130_hpin_event(struct snd_soc_dapm_widget *w,
1348 struct snd_kcontrol *kcontrol, int event)
1349{
1350 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
1351 struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component);
1352
1353 switch (event) {
1354 case SND_SOC_DAPM_POST_PMD:
1355 regmap_multi_reg_write(cs43130->regmap, hpin_prepmd_seq,
1356 ARRAY_SIZE(hpin_prepmd_seq));
1357 break;
1358 case SND_SOC_DAPM_PRE_PMU:
1359 regmap_multi_reg_write(cs43130->regmap, hpin_postpmu_seq,
1360 ARRAY_SIZE(hpin_postpmu_seq));
1361 break;
1362 default:
1363 dev_err(component->dev, "Invalid HPIN event = 0x%x\n", event);
1364 return -EINVAL;
1365 }
1366 return 0;
1367}
1368
1369static const struct snd_soc_dapm_widget digital_hp_widgets[] = {
1370 SND_SOC_DAPM_OUTPUT("HPOUTA"),
1371 SND_SOC_DAPM_OUTPUT("HPOUTB"),
1372
1373 SND_SOC_DAPM_AIF_IN_E("ASPIN PCM", NULL, 0, CS43130_PWDN_CTL,
1374 CS43130_PDN_ASP_SHIFT, 1, cs43130_pcm_event,
1375 (SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1376 SND_SOC_DAPM_PRE_PMD)),
1377
1378 SND_SOC_DAPM_AIF_IN_E("ASPIN DoP", NULL, 0, CS43130_PWDN_CTL,
1379 CS43130_PDN_ASP_SHIFT, 1, cs43130_dsd_event,
1380 (SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1381 SND_SOC_DAPM_PRE_PMD)),
1382
1383 SND_SOC_DAPM_AIF_IN_E("XSPIN DoP", NULL, 0, CS43130_PWDN_CTL,
1384 CS43130_PDN_XSP_SHIFT, 1, cs43130_dsd_event,
1385 (SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1386 SND_SOC_DAPM_PRE_PMD)),
1387
1388 SND_SOC_DAPM_AIF_IN_E("XSPIN DSD", NULL, 0, CS43130_PWDN_CTL,
1389 CS43130_PDN_DSDIF_SHIFT, 1, cs43130_dsd_event,
1390 (SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1391 SND_SOC_DAPM_PRE_PMD)),
1392
1393 SND_SOC_DAPM_DAC("DSD", NULL, CS43130_DSD_PATH_CTL_2,
1394 CS43130_DSD_EN_SHIFT, 0),
1395
1396 SND_SOC_DAPM_DAC_E("HiFi DAC", NULL, CS43130_PWDN_CTL,
1397 CS43130_PDN_HP_SHIFT, 1, cs43130_dac_event,
1398 (SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1399 SND_SOC_DAPM_POST_PMD)),
1400};
1401
1402static const struct snd_soc_dapm_widget analog_hp_widgets[] = {
1403 SND_SOC_DAPM_DAC_E("Analog Playback", NULL, CS43130_HP_OUT_CTL_1,
1404 CS43130_HP_IN_EN_SHIFT, 0, cs43130_hpin_event,
1405 (SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD)),
1406};
1407
1408static struct snd_soc_dapm_widget all_hp_widgets[
1409 ARRAY_SIZE(digital_hp_widgets) +
1410 ARRAY_SIZE(analog_hp_widgets)];
1411
1412static const struct snd_soc_dapm_route digital_hp_routes[] = {
1413 {"ASPIN PCM", NULL, "ASP PCM Playback"},
1414 {"ASPIN DoP", NULL, "ASP DoP Playback"},
1415 {"XSPIN DoP", NULL, "XSP DoP Playback"},
1416 {"XSPIN DSD", NULL, "XSP DSD Playback"},
1417 {"DSD", NULL, "ASPIN DoP"},
1418 {"DSD", NULL, "XSPIN DoP"},
1419 {"DSD", NULL, "XSPIN DSD"},
1420 {"HiFi DAC", NULL, "ASPIN PCM"},
1421 {"HiFi DAC", NULL, "DSD"},
1422 {"HPOUTA", NULL, "HiFi DAC"},
1423 {"HPOUTB", NULL, "HiFi DAC"},
1424};
1425
1426static const struct snd_soc_dapm_route analog_hp_routes[] = {
1427 {"HPOUTA", NULL, "Analog Playback"},
1428 {"HPOUTB", NULL, "Analog Playback"},
1429};
1430
1431static struct snd_soc_dapm_route all_hp_routes[
1432 ARRAY_SIZE(digital_hp_routes) +
1433 ARRAY_SIZE(analog_hp_routes)];
1434
1435static const unsigned int cs43130_asp_src_rates[] = {
1436 32000, 44100, 48000, 88200, 96000, 176400, 192000, 352800, 384000
1437};
1438
1439static const struct snd_pcm_hw_constraint_list cs43130_asp_constraints = {
1440 .count = ARRAY_SIZE(cs43130_asp_src_rates),
1441 .list = cs43130_asp_src_rates,
1442};
1443
1444static int cs43130_pcm_startup(struct snd_pcm_substream *substream,
1445 struct snd_soc_dai *dai)
1446{
1447 return snd_pcm_hw_constraint_list(substream->runtime, 0,
1448 SNDRV_PCM_HW_PARAM_RATE,
1449 &cs43130_asp_constraints);
1450}
1451
1452static const unsigned int cs43130_dop_src_rates[] = {
1453 176400, 352800,
1454};
1455
1456static const struct snd_pcm_hw_constraint_list cs43130_dop_constraints = {
1457 .count = ARRAY_SIZE(cs43130_dop_src_rates),
1458 .list = cs43130_dop_src_rates,
1459};
1460
1461static int cs43130_dop_startup(struct snd_pcm_substream *substream,
1462 struct snd_soc_dai *dai)
1463{
1464 return snd_pcm_hw_constraint_list(substream->runtime, 0,
1465 SNDRV_PCM_HW_PARAM_RATE,
1466 &cs43130_dop_constraints);
1467}
1468
1469static int cs43130_pcm_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
1470{
1471 struct snd_soc_component *component = codec_dai->component;
1472 struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component);
1473
1474 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
1475 case SND_SOC_DAIFMT_CBS_CFS:
1476 cs43130->dais[codec_dai->id].dai_mode = SND_SOC_DAIFMT_CBS_CFS;
1477 break;
1478 case SND_SOC_DAIFMT_CBM_CFM:
1479 cs43130->dais[codec_dai->id].dai_mode = SND_SOC_DAIFMT_CBM_CFM;
1480 break;
1481 default:
1482 dev_err(component->dev, "unsupported mode\n");
1483 return -EINVAL;
1484 }
1485
1486 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
1487 case SND_SOC_DAIFMT_I2S:
1488 cs43130->dais[codec_dai->id].dai_format = SND_SOC_DAIFMT_I2S;
1489 break;
1490 case SND_SOC_DAIFMT_LEFT_J:
1491 cs43130->dais[codec_dai->id].dai_format = SND_SOC_DAIFMT_LEFT_J;
1492 break;
1493 case SND_SOC_DAIFMT_DSP_A:
1494 cs43130->dais[codec_dai->id].dai_format = SND_SOC_DAIFMT_DSP_A;
1495 break;
1496 case SND_SOC_DAIFMT_DSP_B:
1497 cs43130->dais[codec_dai->id].dai_format = SND_SOC_DAIFMT_DSP_B;
1498 break;
1499 default:
1500 dev_err(component->dev,
1501 "unsupported audio format\n");
1502 return -EINVAL;
1503 }
1504
1505 dev_dbg(component->dev, "dai_id = %d, dai_mode = %u, dai_format = %u\n",
1506 codec_dai->id,
1507 cs43130->dais[codec_dai->id].dai_mode,
1508 cs43130->dais[codec_dai->id].dai_format);
1509
1510 return 0;
1511}
1512
1513static int cs43130_dsd_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
1514{
1515 struct snd_soc_component *component = codec_dai->component;
1516 struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component);
1517
1518 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
1519 case SND_SOC_DAIFMT_CBS_CFS:
1520 cs43130->dais[codec_dai->id].dai_mode = SND_SOC_DAIFMT_CBS_CFS;
1521 break;
1522 case SND_SOC_DAIFMT_CBM_CFM:
1523 cs43130->dais[codec_dai->id].dai_mode = SND_SOC_DAIFMT_CBM_CFM;
1524 break;
1525 default:
1526 dev_err(component->dev, "Unsupported DAI format.\n");
1527 return -EINVAL;
1528 }
1529
1530 dev_dbg(component->dev, "dai_mode = 0x%x\n",
1531 cs43130->dais[codec_dai->id].dai_mode);
1532
1533 return 0;
1534}
1535
1536static int cs43130_set_sysclk(struct snd_soc_dai *codec_dai,
1537 int clk_id, unsigned int freq, int dir)
1538{
1539 struct snd_soc_component *component = codec_dai->component;
1540 struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component);
1541
1542 cs43130->dais[codec_dai->id].sclk = freq;
1543 dev_dbg(component->dev, "dai_id = %d, sclk = %u\n", codec_dai->id,
1544 cs43130->dais[codec_dai->id].sclk);
1545
1546 return 0;
1547}
1548
1549static const struct snd_soc_dai_ops cs43130_pcm_ops = {
1550 .startup = cs43130_pcm_startup,
1551 .hw_params = cs43130_hw_params,
1552 .hw_free = cs43130_hw_free,
1553 .set_sysclk = cs43130_set_sysclk,
1554 .set_fmt = cs43130_pcm_set_fmt,
1555};
1556
1557static const struct snd_soc_dai_ops cs43130_dop_ops = {
1558 .startup = cs43130_dop_startup,
1559 .hw_params = cs43130_hw_params,
1560 .hw_free = cs43130_hw_free,
1561 .set_sysclk = cs43130_set_sysclk,
1562 .set_fmt = cs43130_pcm_set_fmt,
1563};
1564
1565static const struct snd_soc_dai_ops cs43130_dsd_ops = {
1566 .startup = cs43130_dop_startup,
1567 .hw_params = cs43130_dsd_hw_params,
1568 .hw_free = cs43130_hw_free,
1569 .set_fmt = cs43130_dsd_set_fmt,
1570};
1571
1572static struct snd_soc_dai_driver cs43130_dai[] = {
1573 {
1574 .name = "cs43130-asp-pcm",
1575 .id = CS43130_ASP_PCM_DAI,
1576 .playback = {
1577 .stream_name = "ASP PCM Playback",
1578 .channels_min = 1,
1579 .channels_max = 2,
1580 .rates = SNDRV_PCM_RATE_KNOT,
1581 .formats = CS43130_PCM_FORMATS,
1582 },
1583 .ops = &cs43130_pcm_ops,
1584 .symmetric_rates = 1,
1585 },
1586 {
1587 .name = "cs43130-asp-dop",
1588 .id = CS43130_ASP_DOP_DAI,
1589 .playback = {
1590 .stream_name = "ASP DoP Playback",
1591 .channels_min = 1,
1592 .channels_max = 2,
1593 .rates = SNDRV_PCM_RATE_KNOT,
1594 .formats = CS43130_DOP_FORMATS,
1595 },
1596 .ops = &cs43130_dop_ops,
1597 .symmetric_rates = 1,
1598 },
1599 {
1600 .name = "cs43130-xsp-dop",
1601 .id = CS43130_XSP_DOP_DAI,
1602 .playback = {
1603 .stream_name = "XSP DoP Playback",
1604 .channels_min = 1,
1605 .channels_max = 2,
1606 .rates = SNDRV_PCM_RATE_KNOT,
1607 .formats = CS43130_DOP_FORMATS,
1608 },
1609 .ops = &cs43130_dop_ops,
1610 .symmetric_rates = 1,
1611 },
1612 {
1613 .name = "cs43130-xsp-dsd",
1614 .id = CS43130_XSP_DSD_DAI,
1615 .playback = {
1616 .stream_name = "XSP DSD Playback",
1617 .channels_min = 1,
1618 .channels_max = 2,
1619 .rates = SNDRV_PCM_RATE_KNOT,
1620 .formats = CS43130_DOP_FORMATS,
1621 },
1622 .ops = &cs43130_dsd_ops,
1623 },
1624
1625};
1626
1627static int cs43130_component_set_sysclk(struct snd_soc_component *component,
1628 int clk_id, int source, unsigned int freq,
1629 int dir)
1630{
1631 struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component);
1632
1633 dev_dbg(component->dev, "clk_id = %d, source = %d, freq = %d, dir = %d\n",
1634 clk_id, source, freq, dir);
1635
1636 switch (freq) {
1637 case CS43130_MCLK_22M:
1638 case CS43130_MCLK_24M:
1639 cs43130->mclk = freq;
1640 break;
1641 default:
1642 dev_err(component->dev, "Invalid MCLK INT freq: %u\n", freq);
1643 return -EINVAL;
1644 }
1645
1646 if (source == CS43130_MCLK_SRC_EXT) {
1647 cs43130->pll_bypass = true;
1648 } else {
1649 dev_err(component->dev, "Invalid MCLK source\n");
1650 return -EINVAL;
1651 }
1652
1653 return 0;
1654}
1655
1656static inline u16 cs43130_get_ac_reg_val(u16 ac_freq)
1657{
1658 /* AC freq is counted in 5.94Hz step. */
1659 return ac_freq / 6;
1660}
1661
1662static int cs43130_show_dc(struct device *dev, char *buf, u8 ch)
1663{
1664 struct i2c_client *client = to_i2c_client(dev);
1665 struct cs43130_private *cs43130 = i2c_get_clientdata(client);
1666
1667 if (!cs43130->hpload_done)
1668 return scnprintf(buf, PAGE_SIZE, "NO_HPLOAD\n");
1669 else
1670 return scnprintf(buf, PAGE_SIZE, "%u\n",
1671 cs43130->hpload_dc[ch]);
1672}
1673
1674static ssize_t cs43130_show_dc_l(struct device *dev,
1675 struct device_attribute *attr, char *buf)
1676{
1677 return cs43130_show_dc(dev, buf, HP_LEFT);
1678}
1679
1680static ssize_t cs43130_show_dc_r(struct device *dev,
1681 struct device_attribute *attr, char *buf)
1682{
1683 return cs43130_show_dc(dev, buf, HP_RIGHT);
1684}
1685
1686static u16 const cs43130_ac_freq[CS43130_AC_FREQ] = {
1687 24,
1688 43,
1689 93,
1690 200,
1691 431,
1692 928,
1693 2000,
1694 4309,
1695 9283,
1696 20000,
1697};
1698
1699static int cs43130_show_ac(struct device *dev, char *buf, u8 ch)
1700{
1701 int i, j = 0, tmp;
1702 struct i2c_client *client = to_i2c_client(dev);
1703 struct cs43130_private *cs43130 = i2c_get_clientdata(client);
1704
1705 if (cs43130->hpload_done && cs43130->ac_meas) {
1706 for (i = 0; i < ARRAY_SIZE(cs43130_ac_freq); i++) {
1707 tmp = scnprintf(buf + j, PAGE_SIZE - j, "%u\n",
1708 cs43130->hpload_ac[i][ch]);
1709 if (!tmp)
1710 break;
1711
1712 j += tmp;
1713 }
1714
1715 return j;
1716 } else {
1717 return scnprintf(buf, PAGE_SIZE, "NO_HPLOAD\n");
1718 }
1719}
1720
1721static ssize_t cs43130_show_ac_l(struct device *dev,
1722 struct device_attribute *attr, char *buf)
1723{
1724 return cs43130_show_ac(dev, buf, HP_LEFT);
1725}
1726
1727static ssize_t cs43130_show_ac_r(struct device *dev,
1728 struct device_attribute *attr, char *buf)
1729{
1730 return cs43130_show_ac(dev, buf, HP_RIGHT);
1731}
1732
1733static DEVICE_ATTR(hpload_dc_l, 0444, cs43130_show_dc_l, NULL);
1734static DEVICE_ATTR(hpload_dc_r, 0444, cs43130_show_dc_r, NULL);
1735static DEVICE_ATTR(hpload_ac_l, 0444, cs43130_show_ac_l, NULL);
1736static DEVICE_ATTR(hpload_ac_r, 0444, cs43130_show_ac_r, NULL);
1737
1738static struct reg_sequence hp_en_cal_seq[] = {
1739 {CS43130_INT_MASK_4, CS43130_INT_MASK_ALL},
1740 {CS43130_HP_MEAS_LOAD_1, 0},
1741 {CS43130_HP_MEAS_LOAD_2, 0},
1742 {CS43130_INT_MASK_4, 0},
1743 {CS43130_DXD1, 0x99},
1744 {CS43130_DXD16, 0xBB},
1745 {CS43130_DXD12, 0x01},
1746 {CS43130_DXD19, 0xCB},
1747 {CS43130_DXD17, 0x95},
1748 {CS43130_DXD18, 0x0B},
1749 {CS43130_DXD1, 0},
1750 {CS43130_HP_LOAD_1, 0x80},
1751};
1752
1753static struct reg_sequence hp_en_cal_seq2[] = {
1754 {CS43130_INT_MASK_4, CS43130_INT_MASK_ALL},
1755 {CS43130_HP_MEAS_LOAD_1, 0},
1756 {CS43130_HP_MEAS_LOAD_2, 0},
1757 {CS43130_INT_MASK_4, 0},
1758 {CS43130_HP_LOAD_1, 0x80},
1759};
1760
1761static struct reg_sequence hp_dis_cal_seq[] = {
1762 {CS43130_HP_LOAD_1, 0x80},
1763 {CS43130_DXD1, 0x99},
1764 {CS43130_DXD12, 0},
1765 {CS43130_DXD1, 0},
1766 {CS43130_HP_LOAD_1, 0},
1767};
1768
1769static struct reg_sequence hp_dis_cal_seq2[] = {
1770 {CS43130_HP_LOAD_1, 0x80},
1771 {CS43130_HP_LOAD_1, 0},
1772};
1773
1774static struct reg_sequence hp_dc_ch_l_seq[] = {
1775 {CS43130_DXD1, 0x99},
1776 {CS43130_DXD19, 0x0A},
1777 {CS43130_DXD17, 0x93},
1778 {CS43130_DXD18, 0x0A},
1779 {CS43130_DXD1, 0},
1780 {CS43130_HP_LOAD_1, 0x80},
1781 {CS43130_HP_LOAD_1, 0x81},
1782};
1783
1784static struct reg_sequence hp_dc_ch_l_seq2[] = {
1785 {CS43130_HP_LOAD_1, 0x80},
1786 {CS43130_HP_LOAD_1, 0x81},
1787};
1788
1789static struct reg_sequence hp_dc_ch_r_seq[] = {
1790 {CS43130_DXD1, 0x99},
1791 {CS43130_DXD19, 0x8A},
1792 {CS43130_DXD17, 0x15},
1793 {CS43130_DXD18, 0x06},
1794 {CS43130_DXD1, 0},
1795 {CS43130_HP_LOAD_1, 0x90},
1796 {CS43130_HP_LOAD_1, 0x91},
1797};
1798
1799static struct reg_sequence hp_dc_ch_r_seq2[] = {
1800 {CS43130_HP_LOAD_1, 0x90},
1801 {CS43130_HP_LOAD_1, 0x91},
1802};
1803
1804static struct reg_sequence hp_ac_ch_l_seq[] = {
1805 {CS43130_DXD1, 0x99},
1806 {CS43130_DXD19, 0x0A},
1807 {CS43130_DXD17, 0x93},
1808 {CS43130_DXD18, 0x0A},
1809 {CS43130_DXD1, 0},
1810 {CS43130_HP_LOAD_1, 0x80},
1811 {CS43130_HP_LOAD_1, 0x82},
1812};
1813
1814static struct reg_sequence hp_ac_ch_l_seq2[] = {
1815 {CS43130_HP_LOAD_1, 0x80},
1816 {CS43130_HP_LOAD_1, 0x82},
1817};
1818
1819static struct reg_sequence hp_ac_ch_r_seq[] = {
1820 {CS43130_DXD1, 0x99},
1821 {CS43130_DXD19, 0x8A},
1822 {CS43130_DXD17, 0x15},
1823 {CS43130_DXD18, 0x06},
1824 {CS43130_DXD1, 0},
1825 {CS43130_HP_LOAD_1, 0x90},
1826 {CS43130_HP_LOAD_1, 0x92},
1827};
1828
1829static struct reg_sequence hp_ac_ch_r_seq2[] = {
1830 {CS43130_HP_LOAD_1, 0x90},
1831 {CS43130_HP_LOAD_1, 0x92},
1832};
1833
1834static struct reg_sequence hp_cln_seq[] = {
1835 {CS43130_INT_MASK_4, CS43130_INT_MASK_ALL},
1836 {CS43130_HP_MEAS_LOAD_1, 0},
1837 {CS43130_HP_MEAS_LOAD_2, 0},
1838};
1839
1840struct reg_sequences {
1841 struct reg_sequence *seq;
1842 int size;
1843 unsigned int msk;
1844};
1845
1846static struct reg_sequences hpload_seq1[] = {
1847 {
1848 .seq = hp_en_cal_seq,
1849 .size = ARRAY_SIZE(hp_en_cal_seq),
1850 .msk = CS43130_HPLOAD_ON_INT,
1851 },
1852 {
1853 .seq = hp_dc_ch_l_seq,
1854 .size = ARRAY_SIZE(hp_dc_ch_l_seq),
1855 .msk = CS43130_HPLOAD_DC_INT,
1856 },
1857 {
1858 .seq = hp_ac_ch_l_seq,
1859 .size = ARRAY_SIZE(hp_ac_ch_l_seq),
1860 .msk = CS43130_HPLOAD_AC_INT,
1861 },
1862 {
1863 .seq = hp_dis_cal_seq,
1864 .size = ARRAY_SIZE(hp_dis_cal_seq),
1865 .msk = CS43130_HPLOAD_OFF_INT,
1866 },
1867 {
1868 .seq = hp_en_cal_seq,
1869 .size = ARRAY_SIZE(hp_en_cal_seq),
1870 .msk = CS43130_HPLOAD_ON_INT,
1871 },
1872 {
1873 .seq = hp_dc_ch_r_seq,
1874 .size = ARRAY_SIZE(hp_dc_ch_r_seq),
1875 .msk = CS43130_HPLOAD_DC_INT,
1876 },
1877 {
1878 .seq = hp_ac_ch_r_seq,
1879 .size = ARRAY_SIZE(hp_ac_ch_r_seq),
1880 .msk = CS43130_HPLOAD_AC_INT,
1881 },
1882};
1883
1884static struct reg_sequences hpload_seq2[] = {
1885 {
1886 .seq = hp_en_cal_seq2,
1887 .size = ARRAY_SIZE(hp_en_cal_seq2),
1888 .msk = CS43130_HPLOAD_ON_INT,
1889 },
1890 {
1891 .seq = hp_dc_ch_l_seq2,
1892 .size = ARRAY_SIZE(hp_dc_ch_l_seq2),
1893 .msk = CS43130_HPLOAD_DC_INT,
1894 },
1895 {
1896 .seq = hp_ac_ch_l_seq2,
1897 .size = ARRAY_SIZE(hp_ac_ch_l_seq2),
1898 .msk = CS43130_HPLOAD_AC_INT,
1899 },
1900 {
1901 .seq = hp_dis_cal_seq2,
1902 .size = ARRAY_SIZE(hp_dis_cal_seq2),
1903 .msk = CS43130_HPLOAD_OFF_INT,
1904 },
1905 {
1906 .seq = hp_en_cal_seq2,
1907 .size = ARRAY_SIZE(hp_en_cal_seq2),
1908 .msk = CS43130_HPLOAD_ON_INT,
1909 },
1910 {
1911 .seq = hp_dc_ch_r_seq2,
1912 .size = ARRAY_SIZE(hp_dc_ch_r_seq2),
1913 .msk = CS43130_HPLOAD_DC_INT,
1914 },
1915 {
1916 .seq = hp_ac_ch_r_seq2,
1917 .size = ARRAY_SIZE(hp_ac_ch_r_seq2),
1918 .msk = CS43130_HPLOAD_AC_INT,
1919 },
1920};
1921
1922static int cs43130_update_hpload(unsigned int msk, int ac_idx,
1923 struct cs43130_private *cs43130)
1924{
1925 bool left_ch = true;
1926 unsigned int reg;
1927 u32 addr;
1928 u16 impedance;
1929 struct snd_soc_component *component = cs43130->component;
1930
1931 switch (msk) {
1932 case CS43130_HPLOAD_DC_INT:
1933 case CS43130_HPLOAD_AC_INT:
1934 break;
1935 default:
1936 return 0;
1937 }
1938
1939 regmap_read(cs43130->regmap, CS43130_HP_LOAD_1, ®);
1940 if (reg & CS43130_HPLOAD_CHN_SEL)
1941 left_ch = false;
1942
1943 if (msk == CS43130_HPLOAD_DC_INT)
1944 addr = CS43130_HP_DC_STAT_1;
1945 else
1946 addr = CS43130_HP_AC_STAT_1;
1947
1948 regmap_read(cs43130->regmap, addr, ®);
1949 impedance = reg >> 3;
1950 regmap_read(cs43130->regmap, addr + 1, ®);
1951 impedance |= reg << 5;
1952
1953 if (msk == CS43130_HPLOAD_DC_INT) {
1954 if (left_ch)
1955 cs43130->hpload_dc[HP_LEFT] = impedance;
1956 else
1957 cs43130->hpload_dc[HP_RIGHT] = impedance;
1958
1959 dev_dbg(component->dev, "HP DC impedance (Ch %u): %u\n", !left_ch,
1960 impedance);
1961 } else {
1962 if (left_ch)
1963 cs43130->hpload_ac[ac_idx][HP_LEFT] = impedance;
1964 else
1965 cs43130->hpload_ac[ac_idx][HP_RIGHT] = impedance;
1966
1967 dev_dbg(component->dev, "HP AC (%u Hz) impedance (Ch %u): %u\n",
1968 cs43130->ac_freq[ac_idx], !left_ch, impedance);
1969 }
1970
1971 return 0;
1972}
1973
1974static int cs43130_hpload_proc(struct cs43130_private *cs43130,
1975 struct reg_sequence *seq, int seq_size,
1976 unsigned int rslt_msk, int ac_idx)
1977{
1978 int ret;
1979 unsigned int msk;
1980 u16 ac_reg_val;
1981 struct snd_soc_component *component = cs43130->component;
1982
1983 reinit_completion(&cs43130->hpload_evt);
1984
1985 if (rslt_msk == CS43130_HPLOAD_AC_INT) {
1986 ac_reg_val = cs43130_get_ac_reg_val(cs43130->ac_freq[ac_idx]);
1987 regmap_update_bits(cs43130->regmap, CS43130_HP_LOAD_1,
1988 CS43130_HPLOAD_AC_START, 0);
1989 regmap_update_bits(cs43130->regmap, CS43130_HP_MEAS_LOAD_1,
1990 CS43130_HP_MEAS_LOAD_MASK,
1991 ac_reg_val >> CS43130_HP_MEAS_LOAD_1_SHIFT);
1992 regmap_update_bits(cs43130->regmap, CS43130_HP_MEAS_LOAD_2,
1993 CS43130_HP_MEAS_LOAD_MASK,
1994 ac_reg_val >> CS43130_HP_MEAS_LOAD_2_SHIFT);
1995 }
1996
1997 regmap_multi_reg_write(cs43130->regmap, seq,
1998 seq_size);
1999
2000 ret = wait_for_completion_timeout(&cs43130->hpload_evt,
2001 msecs_to_jiffies(1000));
2002 regmap_read(cs43130->regmap, CS43130_INT_MASK_4, &msk);
2003 if (!ret) {
2004 dev_err(component->dev, "Timeout waiting for HPLOAD interrupt\n");
2005 return -1;
2006 }
2007
2008 dev_dbg(component->dev, "HP load stat: %x, INT_MASK_4: %x\n",
2009 cs43130->hpload_stat, msk);
2010 if ((cs43130->hpload_stat & (CS43130_HPLOAD_NO_DC_INT |
2011 CS43130_HPLOAD_UNPLUG_INT |
2012 CS43130_HPLOAD_OOR_INT)) ||
2013 !(cs43130->hpload_stat & rslt_msk)) {
2014 dev_dbg(component->dev, "HP load measure failed\n");
2015 return -1;
2016 }
2017
2018 return 0;
2019}
2020
2021static const struct reg_sequence hv_seq[][2] = {
2022 {
2023 {CS43130_CLASS_H_CTL, 0x1C},
2024 {CS43130_HP_OUT_CTL_1, 0x10},
2025 },
2026 {
2027 {CS43130_CLASS_H_CTL, 0x1E},
2028 {CS43130_HP_OUT_CTL_1, 0x20},
2029 },
2030 {
2031 {CS43130_CLASS_H_CTL, 0x1E},
2032 {CS43130_HP_OUT_CTL_1, 0x30},
2033 },
2034};
2035
2036static int cs43130_set_hv(struct regmap *regmap, u16 hpload_dc,
2037 const u16 *dc_threshold)
2038{
2039 int i;
2040
2041 for (i = 0; i < CS43130_DC_THRESHOLD; i++) {
2042 if (hpload_dc <= dc_threshold[i])
2043 break;
2044 }
2045
2046 regmap_multi_reg_write(regmap, hv_seq[i], ARRAY_SIZE(hv_seq[i]));
2047
2048 return 0;
2049}
2050
2051static void cs43130_imp_meas(struct work_struct *wk)
2052{
2053 unsigned int reg, seq_size;
2054 int i, ret, ac_idx;
2055 struct cs43130_private *cs43130;
2056 struct snd_soc_component *component;
2057 struct reg_sequences *hpload_seq;
2058
2059 cs43130 = container_of(wk, struct cs43130_private, work);
2060 component = cs43130->component;
2061
2062 if (!cs43130->mclk)
2063 return;
2064
2065 cs43130->hpload_done = false;
2066
2067 mutex_lock(&cs43130->clk_mutex);
2068 if (!cs43130->clk_req) {
2069 /* clk not in use */
2070 cs43130_set_pll(component, 0, 0, cs43130->mclk, CS43130_MCLK_22M);
2071 if (cs43130->pll_bypass)
2072 cs43130_change_clksrc(component, CS43130_MCLK_SRC_EXT);
2073 else
2074 cs43130_change_clksrc(component, CS43130_MCLK_SRC_PLL);
2075 }
2076
2077 cs43130->clk_req++;
2078 mutex_unlock(&cs43130->clk_mutex);
2079
2080 regmap_read(cs43130->regmap, CS43130_INT_STATUS_4, ®);
2081
2082 switch (cs43130->dev_id) {
2083 case CS43130_CHIP_ID:
2084 hpload_seq = hpload_seq1;
2085 seq_size = ARRAY_SIZE(hpload_seq1);
2086 break;
2087 case CS43131_CHIP_ID:
2088 hpload_seq = hpload_seq2;
2089 seq_size = ARRAY_SIZE(hpload_seq2);
2090 break;
2091 default:
2092 WARN(1, "Invalid dev_id for meas: %d", cs43130->dev_id);
2093 return;
2094 }
2095
2096 i = 0;
2097 ac_idx = 0;
2098 while (i < seq_size) {
2099 ret = cs43130_hpload_proc(cs43130, hpload_seq[i].seq,
2100 hpload_seq[i].size,
2101 hpload_seq[i].msk, ac_idx);
2102 if (ret < 0)
2103 goto exit;
2104
2105 cs43130_update_hpload(hpload_seq[i].msk, ac_idx, cs43130);
2106
2107 if (cs43130->ac_meas &&
2108 hpload_seq[i].msk == CS43130_HPLOAD_AC_INT &&
2109 ac_idx < CS43130_AC_FREQ - 1) {
2110 ac_idx++;
2111 } else {
2112 ac_idx = 0;
2113 i++;
2114 }
2115 }
2116 cs43130->hpload_done = true;
2117
2118 if (cs43130->hpload_dc[HP_LEFT] >= CS43130_LINEOUT_LOAD)
2119 snd_soc_jack_report(&cs43130->jack, CS43130_JACK_LINEOUT,
2120 CS43130_JACK_MASK);
2121 else
2122 snd_soc_jack_report(&cs43130->jack, CS43130_JACK_HEADPHONE,
2123 CS43130_JACK_MASK);
2124
2125 dev_dbg(component->dev, "Set HP output control. DC threshold\n");
2126 for (i = 0; i < CS43130_DC_THRESHOLD; i++)
2127 dev_dbg(component->dev, "DC threshold[%d]: %u.\n", i,
2128 cs43130->dc_threshold[i]);
2129
2130 cs43130_set_hv(cs43130->regmap, cs43130->hpload_dc[HP_LEFT],
2131 cs43130->dc_threshold);
2132
2133exit:
2134 switch (cs43130->dev_id) {
2135 case CS43130_CHIP_ID:
2136 cs43130_hpload_proc(cs43130, hp_dis_cal_seq,
2137 ARRAY_SIZE(hp_dis_cal_seq),
2138 CS43130_HPLOAD_OFF_INT, ac_idx);
2139 break;
2140 case CS43131_CHIP_ID:
2141 cs43130_hpload_proc(cs43130, hp_dis_cal_seq2,
2142 ARRAY_SIZE(hp_dis_cal_seq2),
2143 CS43130_HPLOAD_OFF_INT, ac_idx);
2144 break;
2145 }
2146
2147 regmap_multi_reg_write(cs43130->regmap, hp_cln_seq,
2148 ARRAY_SIZE(hp_cln_seq));
2149
2150 mutex_lock(&cs43130->clk_mutex);
2151 cs43130->clk_req--;
2152 /* clk not in use */
2153 if (!cs43130->clk_req)
2154 cs43130_change_clksrc(component, CS43130_MCLK_SRC_RCO);
2155 mutex_unlock(&cs43130->clk_mutex);
2156}
2157
2158static irqreturn_t cs43130_irq_thread(int irq, void *data)
2159{
2160 struct cs43130_private *cs43130 = (struct cs43130_private *)data;
2161 struct snd_soc_component *component = cs43130->component;
2162 unsigned int stickies[CS43130_NUM_INT];
2163 unsigned int irq_occurrence = 0;
2164 unsigned int masks[CS43130_NUM_INT];
2165 int i, j;
2166
2167 for (i = 0; i < ARRAY_SIZE(stickies); i++) {
2168 regmap_read(cs43130->regmap, CS43130_INT_STATUS_1 + i,
2169 &stickies[i]);
2170 regmap_read(cs43130->regmap, CS43130_INT_MASK_1 + i,
2171 &masks[i]);
2172 }
2173
2174 for (i = 0; i < ARRAY_SIZE(stickies); i++) {
2175 stickies[i] = stickies[i] & (~masks[i]);
2176 for (j = 0; j < 8; j++)
2177 irq_occurrence += (stickies[i] >> j) & 1;
2178 }
2179 dev_dbg(component->dev, "number of interrupts occurred (%u)\n",
2180 irq_occurrence);
2181
2182 if (!irq_occurrence)
2183 return IRQ_NONE;
2184
2185 if (stickies[0] & CS43130_XTAL_RDY_INT) {
2186 complete(&cs43130->xtal_rdy);
2187 return IRQ_HANDLED;
2188 }
2189
2190 if (stickies[0] & CS43130_PLL_RDY_INT) {
2191 complete(&cs43130->pll_rdy);
2192 return IRQ_HANDLED;
2193 }
2194
2195 if (stickies[3] & CS43130_HPLOAD_NO_DC_INT) {
2196 cs43130->hpload_stat = stickies[3];
2197 dev_err(component->dev,
2198 "DC load has not completed before AC load (%x)\n",
2199 cs43130->hpload_stat);
2200 complete(&cs43130->hpload_evt);
2201 return IRQ_HANDLED;
2202 }
2203
2204 if (stickies[3] & CS43130_HPLOAD_UNPLUG_INT) {
2205 cs43130->hpload_stat = stickies[3];
2206 dev_err(component->dev, "HP unplugged during measurement (%x)\n",
2207 cs43130->hpload_stat);
2208 complete(&cs43130->hpload_evt);
2209 return IRQ_HANDLED;
2210 }
2211
2212 if (stickies[3] & CS43130_HPLOAD_OOR_INT) {
2213 cs43130->hpload_stat = stickies[3];
2214 dev_err(component->dev, "HP load out of range (%x)\n",
2215 cs43130->hpload_stat);
2216 complete(&cs43130->hpload_evt);
2217 return IRQ_HANDLED;
2218 }
2219
2220 if (stickies[3] & CS43130_HPLOAD_AC_INT) {
2221 cs43130->hpload_stat = stickies[3];
2222 dev_dbg(component->dev, "HP AC load measurement done (%x)\n",
2223 cs43130->hpload_stat);
2224 complete(&cs43130->hpload_evt);
2225 return IRQ_HANDLED;
2226 }
2227
2228 if (stickies[3] & CS43130_HPLOAD_DC_INT) {
2229 cs43130->hpload_stat = stickies[3];
2230 dev_dbg(component->dev, "HP DC load measurement done (%x)\n",
2231 cs43130->hpload_stat);
2232 complete(&cs43130->hpload_evt);
2233 return IRQ_HANDLED;
2234 }
2235
2236 if (stickies[3] & CS43130_HPLOAD_ON_INT) {
2237 cs43130->hpload_stat = stickies[3];
2238 dev_dbg(component->dev, "HP load state machine on done (%x)\n",
2239 cs43130->hpload_stat);
2240 complete(&cs43130->hpload_evt);
2241 return IRQ_HANDLED;
2242 }
2243
2244 if (stickies[3] & CS43130_HPLOAD_OFF_INT) {
2245 cs43130->hpload_stat = stickies[3];
2246 dev_dbg(component->dev, "HP load state machine off done (%x)\n",
2247 cs43130->hpload_stat);
2248 complete(&cs43130->hpload_evt);
2249 return IRQ_HANDLED;
2250 }
2251
2252 if (stickies[0] & CS43130_XTAL_ERR_INT) {
2253 dev_err(component->dev, "Crystal err: clock is not running\n");
2254 return IRQ_HANDLED;
2255 }
2256
2257 if (stickies[0] & CS43130_HP_UNPLUG_INT) {
2258 dev_dbg(component->dev, "HP unplugged\n");
2259 cs43130->hpload_done = false;
2260 snd_soc_jack_report(&cs43130->jack, 0, CS43130_JACK_MASK);
2261 return IRQ_HANDLED;
2262 }
2263
2264 if (stickies[0] & CS43130_HP_PLUG_INT) {
2265 if (cs43130->dc_meas && !cs43130->hpload_done &&
2266 !work_busy(&cs43130->work)) {
2267 dev_dbg(component->dev, "HP load queue work\n");
2268 queue_work(cs43130->wq, &cs43130->work);
2269 }
2270
2271 snd_soc_jack_report(&cs43130->jack, SND_JACK_MECHANICAL,
2272 CS43130_JACK_MASK);
2273 return IRQ_HANDLED;
2274 }
2275
2276 return IRQ_NONE;
2277}
2278
2279static int cs43130_probe(struct snd_soc_component *component)
2280{
2281 int ret;
2282 struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component);
2283 struct snd_soc_card *card = component->card;
2284 unsigned int reg;
2285
2286 cs43130->component = component;
2287
2288 if (cs43130->xtal_ibias != CS43130_XTAL_UNUSED) {
2289 regmap_update_bits(cs43130->regmap, CS43130_CRYSTAL_SET,
2290 CS43130_XTAL_IBIAS_MASK,
2291 cs43130->xtal_ibias);
2292 regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1,
2293 CS43130_XTAL_ERR_INT, 0);
2294 }
2295
2296 ret = snd_soc_card_jack_new(card, "Headphone", CS43130_JACK_MASK,
2297 &cs43130->jack, NULL, 0);
2298 if (ret < 0) {
2299 dev_err(component->dev, "Cannot create jack\n");
2300 return ret;
2301 }
2302
2303 cs43130->hpload_done = false;
2304 if (cs43130->dc_meas) {
2305 ret = device_create_file(component->dev, &dev_attr_hpload_dc_l);
2306 if (ret < 0)
2307 return ret;
2308
2309 ret = device_create_file(component->dev, &dev_attr_hpload_dc_r);
2310 if (ret < 0)
2311 return ret;
2312
2313 ret = device_create_file(component->dev, &dev_attr_hpload_ac_l);
2314 if (ret < 0)
2315 return ret;
2316
2317 ret = device_create_file(component->dev, &dev_attr_hpload_ac_r);
2318 if (ret < 0)
2319 return ret;
2320
2321 cs43130->wq = create_singlethread_workqueue("cs43130_hp");
2322 if (!cs43130->wq)
2323 return -ENOMEM;
2324 INIT_WORK(&cs43130->work, cs43130_imp_meas);
2325 }
2326
2327 regmap_read(cs43130->regmap, CS43130_INT_STATUS_1, ®);
2328 regmap_read(cs43130->regmap, CS43130_HP_STATUS, ®);
2329 regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1,
2330 CS43130_HP_PLUG_INT | CS43130_HP_UNPLUG_INT, 0);
2331 regmap_update_bits(cs43130->regmap, CS43130_HP_DETECT,
2332 CS43130_HP_DETECT_CTRL_MASK, 0);
2333 regmap_update_bits(cs43130->regmap, CS43130_HP_DETECT,
2334 CS43130_HP_DETECT_CTRL_MASK,
2335 CS43130_HP_DETECT_CTRL_MASK);
2336
2337 return 0;
2338}
2339
2340static struct snd_soc_component_driver soc_component_dev_cs43130 = {
2341 .probe = cs43130_probe,
2342 .controls = cs43130_snd_controls,
2343 .num_controls = ARRAY_SIZE(cs43130_snd_controls),
2344 .set_sysclk = cs43130_component_set_sysclk,
2345 .set_pll = cs43130_set_pll,
2346 .idle_bias_on = 1,
2347 .use_pmdown_time = 1,
2348 .endianness = 1,
2349 .non_legacy_dai_naming = 1,
2350};
2351
2352static const struct regmap_config cs43130_regmap = {
2353 .reg_bits = 24,
2354 .pad_bits = 8,
2355 .val_bits = 8,
2356
2357 .max_register = CS43130_LASTREG,
2358 .reg_defaults = cs43130_reg_defaults,
2359 .num_reg_defaults = ARRAY_SIZE(cs43130_reg_defaults),
2360 .readable_reg = cs43130_readable_register,
2361 .precious_reg = cs43130_precious_register,
2362 .volatile_reg = cs43130_volatile_register,
2363 .cache_type = REGCACHE_RBTREE,
2364 /* needed for regcache_sync */
2365 .use_single_read = true,
2366 .use_single_write = true,
2367};
2368
2369static u16 const cs43130_dc_threshold[CS43130_DC_THRESHOLD] = {
2370 50,
2371 120,
2372};
2373
2374static int cs43130_handle_device_data(struct i2c_client *i2c_client,
2375 struct cs43130_private *cs43130)
2376{
2377 struct device_node *np = i2c_client->dev.of_node;
2378 unsigned int val;
2379 int i;
2380
2381 if (of_property_read_u32(np, "cirrus,xtal-ibias", &val) < 0) {
2382 /* Crystal is unused. System clock is used for external MCLK */
2383 cs43130->xtal_ibias = CS43130_XTAL_UNUSED;
2384 return 0;
2385 }
2386
2387 switch (val) {
2388 case 1:
2389 cs43130->xtal_ibias = CS43130_XTAL_IBIAS_7_5UA;
2390 break;
2391 case 2:
2392 cs43130->xtal_ibias = CS43130_XTAL_IBIAS_12_5UA;
2393 break;
2394 case 3:
2395 cs43130->xtal_ibias = CS43130_XTAL_IBIAS_15UA;
2396 break;
2397 default:
2398 dev_err(&i2c_client->dev,
2399 "Invalid cirrus,xtal-ibias value: %d\n", val);
2400 return -EINVAL;
2401 }
2402
2403 cs43130->dc_meas = of_property_read_bool(np, "cirrus,dc-measure");
2404 cs43130->ac_meas = of_property_read_bool(np, "cirrus,ac-measure");
2405
2406 if (of_property_read_u16_array(np, "cirrus,ac-freq", cs43130->ac_freq,
2407 CS43130_AC_FREQ) < 0) {
2408 for (i = 0; i < CS43130_AC_FREQ; i++)
2409 cs43130->ac_freq[i] = cs43130_ac_freq[i];
2410 }
2411
2412 if (of_property_read_u16_array(np, "cirrus,dc-threshold",
2413 cs43130->dc_threshold,
2414 CS43130_DC_THRESHOLD) < 0) {
2415 for (i = 0; i < CS43130_DC_THRESHOLD; i++)
2416 cs43130->dc_threshold[i] = cs43130_dc_threshold[i];
2417 }
2418
2419 return 0;
2420}
2421
2422static int cs43130_i2c_probe(struct i2c_client *client,
2423 const struct i2c_device_id *id)
2424{
2425 struct cs43130_private *cs43130;
2426 int ret;
2427 unsigned int devid = 0;
2428 unsigned int reg;
2429 int i;
2430
2431 cs43130 = devm_kzalloc(&client->dev, sizeof(*cs43130), GFP_KERNEL);
2432 if (!cs43130)
2433 return -ENOMEM;
2434
2435 i2c_set_clientdata(client, cs43130);
2436
2437 cs43130->regmap = devm_regmap_init_i2c(client, &cs43130_regmap);
2438 if (IS_ERR(cs43130->regmap)) {
2439 ret = PTR_ERR(cs43130->regmap);
2440 return ret;
2441 }
2442
2443 if (client->dev.of_node) {
2444 ret = cs43130_handle_device_data(client, cs43130);
2445 if (ret != 0)
2446 return ret;
2447 }
2448 for (i = 0; i < ARRAY_SIZE(cs43130->supplies); i++)
2449 cs43130->supplies[i].supply = cs43130_supply_names[i];
2450
2451 ret = devm_regulator_bulk_get(&client->dev,
2452 ARRAY_SIZE(cs43130->supplies),
2453 cs43130->supplies);
2454 if (ret != 0) {
2455 dev_err(&client->dev, "Failed to request supplies: %d\n", ret);
2456 return ret;
2457 }
2458 ret = regulator_bulk_enable(ARRAY_SIZE(cs43130->supplies),
2459 cs43130->supplies);
2460 if (ret != 0) {
2461 dev_err(&client->dev, "Failed to enable supplies: %d\n", ret);
2462 return ret;
2463 }
2464
2465 cs43130->reset_gpio = devm_gpiod_get_optional(&client->dev,
2466 "reset", GPIOD_OUT_LOW);
2467 if (IS_ERR(cs43130->reset_gpio))
2468 return PTR_ERR(cs43130->reset_gpio);
2469
2470 gpiod_set_value_cansleep(cs43130->reset_gpio, 1);
2471
2472 usleep_range(2000, 2050);
2473
2474 ret = regmap_read(cs43130->regmap, CS43130_DEVID_AB, ®);
2475
2476 devid = (reg & 0xFF) << 12;
2477 ret = regmap_read(cs43130->regmap, CS43130_DEVID_CD, ®);
2478 devid |= (reg & 0xFF) << 4;
2479 ret = regmap_read(cs43130->regmap, CS43130_DEVID_E, ®);
2480 devid |= (reg & 0xF0) >> 4;
2481
2482 switch (devid) {
2483 case CS43130_CHIP_ID:
2484 case CS4399_CHIP_ID:
2485 case CS43131_CHIP_ID:
2486 case CS43198_CHIP_ID:
2487 break;
2488 default:
2489 dev_err(&client->dev,
2490 "CS43130 Device ID %X. Expected ID %X, %X, %X or %X\n",
2491 devid, CS43130_CHIP_ID, CS4399_CHIP_ID,
2492 CS43131_CHIP_ID, CS43198_CHIP_ID);
2493 ret = -ENODEV;
2494 goto err;
2495 }
2496
2497 cs43130->dev_id = devid;
2498 ret = regmap_read(cs43130->regmap, CS43130_REV_ID, ®);
2499 if (ret < 0) {
2500 dev_err(&client->dev, "Get Revision ID failed\n");
2501 goto err;
2502 }
2503
2504 dev_info(&client->dev,
2505 "Cirrus Logic CS43130 (%x), Revision: %02X\n", devid,
2506 reg & 0xFF);
2507
2508 mutex_init(&cs43130->clk_mutex);
2509
2510 init_completion(&cs43130->xtal_rdy);
2511 init_completion(&cs43130->pll_rdy);
2512 init_completion(&cs43130->hpload_evt);
2513
2514 ret = devm_request_threaded_irq(&client->dev, client->irq,
2515 NULL, cs43130_irq_thread,
2516 IRQF_ONESHOT | IRQF_TRIGGER_LOW,
2517 "cs43130", cs43130);
2518 if (ret != 0) {
2519 dev_err(&client->dev, "Failed to request IRQ: %d\n", ret);
2520 return ret;
2521 }
2522
2523 cs43130->mclk_int_src = CS43130_MCLK_SRC_RCO;
2524
2525 pm_runtime_set_autosuspend_delay(&client->dev, 100);
2526 pm_runtime_use_autosuspend(&client->dev);
2527 pm_runtime_set_active(&client->dev);
2528 pm_runtime_enable(&client->dev);
2529
2530 switch (cs43130->dev_id) {
2531 case CS43130_CHIP_ID:
2532 case CS43131_CHIP_ID:
2533 memcpy(all_hp_widgets, digital_hp_widgets,
2534 sizeof(digital_hp_widgets));
2535 memcpy(all_hp_widgets + ARRAY_SIZE(digital_hp_widgets),
2536 analog_hp_widgets, sizeof(analog_hp_widgets));
2537 memcpy(all_hp_routes, digital_hp_routes,
2538 sizeof(digital_hp_routes));
2539 memcpy(all_hp_routes + ARRAY_SIZE(digital_hp_routes),
2540 analog_hp_routes, sizeof(analog_hp_routes));
2541
2542 soc_component_dev_cs43130.dapm_widgets =
2543 all_hp_widgets;
2544 soc_component_dev_cs43130.num_dapm_widgets =
2545 ARRAY_SIZE(all_hp_widgets);
2546 soc_component_dev_cs43130.dapm_routes =
2547 all_hp_routes;
2548 soc_component_dev_cs43130.num_dapm_routes =
2549 ARRAY_SIZE(all_hp_routes);
2550 break;
2551 case CS43198_CHIP_ID:
2552 case CS4399_CHIP_ID:
2553 soc_component_dev_cs43130.dapm_widgets =
2554 digital_hp_widgets;
2555 soc_component_dev_cs43130.num_dapm_widgets =
2556 ARRAY_SIZE(digital_hp_widgets);
2557 soc_component_dev_cs43130.dapm_routes =
2558 digital_hp_routes;
2559 soc_component_dev_cs43130.num_dapm_routes =
2560 ARRAY_SIZE(digital_hp_routes);
2561 break;
2562 }
2563
2564 ret = devm_snd_soc_register_component(&client->dev,
2565 &soc_component_dev_cs43130,
2566 cs43130_dai, ARRAY_SIZE(cs43130_dai));
2567 if (ret < 0) {
2568 dev_err(&client->dev,
2569 "snd_soc_register_component failed with ret = %d\n", ret);
2570 goto err;
2571 }
2572
2573 regmap_update_bits(cs43130->regmap, CS43130_PAD_INT_CFG,
2574 CS43130_ASP_3ST_MASK, 0);
2575 regmap_update_bits(cs43130->regmap, CS43130_PAD_INT_CFG,
2576 CS43130_XSP_3ST_MASK, 0);
2577
2578 return 0;
2579err:
2580 return ret;
2581}
2582
2583static int cs43130_i2c_remove(struct i2c_client *client)
2584{
2585 struct cs43130_private *cs43130 = i2c_get_clientdata(client);
2586
2587 if (cs43130->xtal_ibias != CS43130_XTAL_UNUSED)
2588 regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1,
2589 CS43130_XTAL_ERR_INT,
2590 1 << CS43130_XTAL_ERR_INT_SHIFT);
2591
2592 regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1,
2593 CS43130_HP_PLUG_INT | CS43130_HP_UNPLUG_INT,
2594 CS43130_HP_PLUG_INT | CS43130_HP_UNPLUG_INT);
2595
2596 if (cs43130->dc_meas) {
2597 cancel_work_sync(&cs43130->work);
2598 flush_workqueue(cs43130->wq);
2599
2600 device_remove_file(&client->dev, &dev_attr_hpload_dc_l);
2601 device_remove_file(&client->dev, &dev_attr_hpload_dc_r);
2602 device_remove_file(&client->dev, &dev_attr_hpload_ac_l);
2603 device_remove_file(&client->dev, &dev_attr_hpload_ac_r);
2604 }
2605
2606 gpiod_set_value_cansleep(cs43130->reset_gpio, 0);
2607
2608 pm_runtime_disable(&client->dev);
2609 regulator_bulk_disable(CS43130_NUM_SUPPLIES, cs43130->supplies);
2610
2611 return 0;
2612}
2613
2614static int __maybe_unused cs43130_runtime_suspend(struct device *dev)
2615{
2616 struct cs43130_private *cs43130 = dev_get_drvdata(dev);
2617
2618 if (cs43130->xtal_ibias != CS43130_XTAL_UNUSED)
2619 regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1,
2620 CS43130_XTAL_ERR_INT,
2621 1 << CS43130_XTAL_ERR_INT_SHIFT);
2622
2623 regcache_cache_only(cs43130->regmap, true);
2624 regcache_mark_dirty(cs43130->regmap);
2625
2626 gpiod_set_value_cansleep(cs43130->reset_gpio, 0);
2627
2628 regulator_bulk_disable(CS43130_NUM_SUPPLIES, cs43130->supplies);
2629
2630 return 0;
2631}
2632
2633static int __maybe_unused cs43130_runtime_resume(struct device *dev)
2634{
2635 struct cs43130_private *cs43130 = dev_get_drvdata(dev);
2636 int ret;
2637
2638 ret = regulator_bulk_enable(CS43130_NUM_SUPPLIES, cs43130->supplies);
2639 if (ret != 0) {
2640 dev_err(dev, "Failed to enable supplies: %d\n", ret);
2641 return ret;
2642 }
2643
2644 regcache_cache_only(cs43130->regmap, false);
2645
2646 gpiod_set_value_cansleep(cs43130->reset_gpio, 1);
2647
2648 usleep_range(2000, 2050);
2649
2650 ret = regcache_sync(cs43130->regmap);
2651 if (ret != 0) {
2652 dev_err(dev, "Failed to restore register cache\n");
2653 goto err;
2654 }
2655
2656 if (cs43130->xtal_ibias != CS43130_XTAL_UNUSED)
2657 regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1,
2658 CS43130_XTAL_ERR_INT, 0);
2659
2660 return 0;
2661err:
2662 regcache_cache_only(cs43130->regmap, true);
2663 regulator_bulk_disable(CS43130_NUM_SUPPLIES, cs43130->supplies);
2664
2665 return ret;
2666}
2667
2668static const struct dev_pm_ops cs43130_runtime_pm = {
2669 SET_RUNTIME_PM_OPS(cs43130_runtime_suspend, cs43130_runtime_resume,
2670 NULL)
2671};
2672
2673static const struct of_device_id cs43130_of_match[] = {
2674 {.compatible = "cirrus,cs43130",},
2675 {.compatible = "cirrus,cs4399",},
2676 {.compatible = "cirrus,cs43131",},
2677 {.compatible = "cirrus,cs43198",},
2678 {},
2679};
2680
2681MODULE_DEVICE_TABLE(of, cs43130_of_match);
2682
2683static const struct i2c_device_id cs43130_i2c_id[] = {
2684 {"cs43130", 0},
2685 {"cs4399", 0},
2686 {"cs43131", 0},
2687 {"cs43198", 0},
2688 {}
2689};
2690
2691MODULE_DEVICE_TABLE(i2c, cs43130_i2c_id);
2692
2693static struct i2c_driver cs43130_i2c_driver = {
2694 .driver = {
2695 .name = "cs43130",
2696 .of_match_table = cs43130_of_match,
2697 .pm = &cs43130_runtime_pm,
2698 },
2699 .id_table = cs43130_i2c_id,
2700 .probe = cs43130_i2c_probe,
2701 .remove = cs43130_i2c_remove,
2702};
2703
2704module_i2c_driver(cs43130_i2c_driver);
2705
2706MODULE_AUTHOR("Li Xu <li.xu@cirrus.com>");
2707MODULE_DESCRIPTION("Cirrus Logic CS43130 ALSA SoC Codec Driver");
2708MODULE_LICENSE("GPL");
1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * cs43130.c -- CS43130 ALSA Soc Audio driver
4 *
5 * Copyright 2017 Cirrus Logic, Inc.
6 *
7 * Authors: Li Xu <li.xu@cirrus.com>
8 */
9#include <linux/module.h>
10#include <linux/moduleparam.h>
11#include <linux/kernel.h>
12#include <linux/init.h>
13#include <linux/delay.h>
14#include <linux/gpio.h>
15#include <linux/gpio/consumer.h>
16#include <linux/platform_device.h>
17#include <linux/pm.h>
18#include <linux/i2c.h>
19#include <linux/of_device.h>
20#include <linux/regmap.h>
21#include <linux/slab.h>
22#include <sound/core.h>
23#include <sound/pcm.h>
24#include <sound/pcm_params.h>
25#include <sound/soc.h>
26#include <sound/soc-dapm.h>
27#include <sound/initval.h>
28#include <sound/tlv.h>
29#include <linux/of_gpio.h>
30#include <linux/regulator/consumer.h>
31#include <linux/pm_runtime.h>
32#include <linux/of_irq.h>
33#include <linux/completion.h>
34#include <linux/mutex.h>
35#include <linux/workqueue.h>
36#include <sound/jack.h>
37
38#include "cs43130.h"
39#include "cirrus_legacy.h"
40
41static const struct reg_default cs43130_reg_defaults[] = {
42 {CS43130_SYS_CLK_CTL_1, 0x06},
43 {CS43130_SP_SRATE, 0x01},
44 {CS43130_SP_BITSIZE, 0x05},
45 {CS43130_PAD_INT_CFG, 0x03},
46 {CS43130_PWDN_CTL, 0xFE},
47 {CS43130_CRYSTAL_SET, 0x04},
48 {CS43130_PLL_SET_1, 0x00},
49 {CS43130_PLL_SET_2, 0x00},
50 {CS43130_PLL_SET_3, 0x00},
51 {CS43130_PLL_SET_4, 0x00},
52 {CS43130_PLL_SET_5, 0x40},
53 {CS43130_PLL_SET_6, 0x10},
54 {CS43130_PLL_SET_7, 0x80},
55 {CS43130_PLL_SET_8, 0x03},
56 {CS43130_PLL_SET_9, 0x02},
57 {CS43130_PLL_SET_10, 0x02},
58 {CS43130_CLKOUT_CTL, 0x00},
59 {CS43130_ASP_NUM_1, 0x01},
60 {CS43130_ASP_NUM_2, 0x00},
61 {CS43130_ASP_DEN_1, 0x08},
62 {CS43130_ASP_DEN_2, 0x00},
63 {CS43130_ASP_LRCK_HI_TIME_1, 0x1F},
64 {CS43130_ASP_LRCK_HI_TIME_2, 0x00},
65 {CS43130_ASP_LRCK_PERIOD_1, 0x3F},
66 {CS43130_ASP_LRCK_PERIOD_2, 0x00},
67 {CS43130_ASP_CLOCK_CONF, 0x0C},
68 {CS43130_ASP_FRAME_CONF, 0x0A},
69 {CS43130_XSP_NUM_1, 0x01},
70 {CS43130_XSP_NUM_2, 0x00},
71 {CS43130_XSP_DEN_1, 0x02},
72 {CS43130_XSP_DEN_2, 0x00},
73 {CS43130_XSP_LRCK_HI_TIME_1, 0x1F},
74 {CS43130_XSP_LRCK_HI_TIME_2, 0x00},
75 {CS43130_XSP_LRCK_PERIOD_1, 0x3F},
76 {CS43130_XSP_LRCK_PERIOD_2, 0x00},
77 {CS43130_XSP_CLOCK_CONF, 0x0C},
78 {CS43130_XSP_FRAME_CONF, 0x0A},
79 {CS43130_ASP_CH_1_LOC, 0x00},
80 {CS43130_ASP_CH_2_LOC, 0x00},
81 {CS43130_ASP_CH_1_SZ_EN, 0x06},
82 {CS43130_ASP_CH_2_SZ_EN, 0x0E},
83 {CS43130_XSP_CH_1_LOC, 0x00},
84 {CS43130_XSP_CH_2_LOC, 0x00},
85 {CS43130_XSP_CH_1_SZ_EN, 0x06},
86 {CS43130_XSP_CH_2_SZ_EN, 0x0E},
87 {CS43130_DSD_VOL_B, 0x78},
88 {CS43130_DSD_VOL_A, 0x78},
89 {CS43130_DSD_PATH_CTL_1, 0xA8},
90 {CS43130_DSD_INT_CFG, 0x00},
91 {CS43130_DSD_PATH_CTL_2, 0x02},
92 {CS43130_DSD_PCM_MIX_CTL, 0x00},
93 {CS43130_DSD_PATH_CTL_3, 0x40},
94 {CS43130_HP_OUT_CTL_1, 0x30},
95 {CS43130_PCM_FILT_OPT, 0x02},
96 {CS43130_PCM_VOL_B, 0x78},
97 {CS43130_PCM_VOL_A, 0x78},
98 {CS43130_PCM_PATH_CTL_1, 0xA8},
99 {CS43130_PCM_PATH_CTL_2, 0x00},
100 {CS43130_CLASS_H_CTL, 0x1E},
101 {CS43130_HP_DETECT, 0x04},
102 {CS43130_HP_LOAD_1, 0x00},
103 {CS43130_HP_MEAS_LOAD_1, 0x00},
104 {CS43130_HP_MEAS_LOAD_2, 0x00},
105 {CS43130_INT_MASK_1, 0xFF},
106 {CS43130_INT_MASK_2, 0xFF},
107 {CS43130_INT_MASK_3, 0xFF},
108 {CS43130_INT_MASK_4, 0xFF},
109 {CS43130_INT_MASK_5, 0xFF},
110};
111
112static bool cs43130_volatile_register(struct device *dev, unsigned int reg)
113{
114 switch (reg) {
115 case CS43130_INT_STATUS_1 ... CS43130_INT_STATUS_5:
116 case CS43130_HP_DC_STAT_1 ... CS43130_HP_DC_STAT_2:
117 case CS43130_HP_AC_STAT_1 ... CS43130_HP_AC_STAT_2:
118 return true;
119 default:
120 return false;
121 }
122}
123
124static bool cs43130_readable_register(struct device *dev, unsigned int reg)
125{
126 switch (reg) {
127 case CS43130_DEVID_AB ... CS43130_SYS_CLK_CTL_1:
128 case CS43130_SP_SRATE ... CS43130_PAD_INT_CFG:
129 case CS43130_PWDN_CTL:
130 case CS43130_CRYSTAL_SET:
131 case CS43130_PLL_SET_1 ... CS43130_PLL_SET_5:
132 case CS43130_PLL_SET_6:
133 case CS43130_PLL_SET_7:
134 case CS43130_PLL_SET_8:
135 case CS43130_PLL_SET_9:
136 case CS43130_PLL_SET_10:
137 case CS43130_CLKOUT_CTL:
138 case CS43130_ASP_NUM_1 ... CS43130_ASP_FRAME_CONF:
139 case CS43130_XSP_NUM_1 ... CS43130_XSP_FRAME_CONF:
140 case CS43130_ASP_CH_1_LOC:
141 case CS43130_ASP_CH_2_LOC:
142 case CS43130_ASP_CH_1_SZ_EN:
143 case CS43130_ASP_CH_2_SZ_EN:
144 case CS43130_XSP_CH_1_LOC:
145 case CS43130_XSP_CH_2_LOC:
146 case CS43130_XSP_CH_1_SZ_EN:
147 case CS43130_XSP_CH_2_SZ_EN:
148 case CS43130_DSD_VOL_B ... CS43130_DSD_PATH_CTL_3:
149 case CS43130_HP_OUT_CTL_1:
150 case CS43130_PCM_FILT_OPT ... CS43130_PCM_PATH_CTL_2:
151 case CS43130_CLASS_H_CTL:
152 case CS43130_HP_DETECT:
153 case CS43130_HP_STATUS:
154 case CS43130_HP_LOAD_1:
155 case CS43130_HP_MEAS_LOAD_1:
156 case CS43130_HP_MEAS_LOAD_2:
157 case CS43130_HP_DC_STAT_1:
158 case CS43130_HP_DC_STAT_2:
159 case CS43130_HP_AC_STAT_1:
160 case CS43130_HP_AC_STAT_2:
161 case CS43130_HP_LOAD_STAT:
162 case CS43130_INT_STATUS_1 ... CS43130_INT_STATUS_5:
163 case CS43130_INT_MASK_1 ... CS43130_INT_MASK_5:
164 return true;
165 default:
166 return false;
167 }
168}
169
170static bool cs43130_precious_register(struct device *dev, unsigned int reg)
171{
172 switch (reg) {
173 case CS43130_INT_STATUS_1 ... CS43130_INT_STATUS_5:
174 return true;
175 default:
176 return false;
177 }
178}
179
180struct cs43130_pll_params {
181 unsigned int pll_in;
182 u8 sclk_prediv;
183 u8 pll_div_int;
184 u32 pll_div_frac;
185 u8 pll_mode;
186 u8 pll_divout;
187 unsigned int pll_out;
188 u8 pll_cal_ratio;
189};
190
191static const struct cs43130_pll_params pll_ratio_table[] = {
192 {9600000, 0x02, 0x49, 0x800000, 0x00, 0x08, 22579200, 151},
193 {9600000, 0x02, 0x50, 0x000000, 0x00, 0x08, 24576000, 164},
194
195 {11289600, 0x02, 0X40, 0, 0x01, 0x08, 22579200, 128},
196 {11289600, 0x02, 0x44, 0x06F700, 0x0, 0x08, 24576000, 139},
197
198 {12000000, 0x02, 0x49, 0x800000, 0x00, 0x0A, 22579200, 120},
199 {12000000, 0x02, 0x40, 0x000000, 0x00, 0x08, 24576000, 131},
200
201 {12288000, 0x02, 0x49, 0x800000, 0x01, 0x0A, 22579200, 118},
202 {12288000, 0x02, 0x40, 0x000000, 0x01, 0x08, 24576000, 128},
203
204 {13000000, 0x02, 0x45, 0x797680, 0x01, 0x0A, 22579200, 111},
205 {13000000, 0x02, 0x3C, 0x7EA940, 0x01, 0x08, 24576000, 121},
206
207 {19200000, 0x03, 0x49, 0x800000, 0x00, 0x08, 22579200, 151},
208 {19200000, 0x03, 0x50, 0x000000, 0x00, 0x08, 24576000, 164},
209
210 {22579200, 0, 0, 0, 0, 0, 22579200, 0},
211 {22579200, 0x03, 0x44, 0x06F700, 0x00, 0x08, 24576000, 139},
212
213 {24000000, 0x03, 0x49, 0x800000, 0x00, 0x0A, 22579200, 120},
214 {24000000, 0x03, 0x40, 0x000000, 0x00, 0x08, 24576000, 131},
215
216 {24576000, 0x03, 0x49, 0x800000, 0x01, 0x0A, 22579200, 118},
217 {24576000, 0, 0, 0, 0, 0, 24576000, 0},
218
219 {26000000, 0x03, 0x45, 0x797680, 0x01, 0x0A, 22579200, 111},
220 {26000000, 0x03, 0x3C, 0x7EA940, 0x01, 0x08, 24576000, 121},
221};
222
223static const struct cs43130_pll_params *cs43130_get_pll_table(
224 unsigned int freq_in, unsigned int freq_out)
225{
226 int i;
227
228 for (i = 0; i < ARRAY_SIZE(pll_ratio_table); i++) {
229 if (pll_ratio_table[i].pll_in == freq_in &&
230 pll_ratio_table[i].pll_out == freq_out)
231 return &pll_ratio_table[i];
232 }
233
234 return NULL;
235}
236
237static int cs43130_pll_config(struct snd_soc_component *component)
238{
239 struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component);
240 const struct cs43130_pll_params *pll_entry;
241
242 dev_dbg(component->dev, "cs43130->mclk = %u, cs43130->mclk_int = %u\n",
243 cs43130->mclk, cs43130->mclk_int);
244
245 pll_entry = cs43130_get_pll_table(cs43130->mclk, cs43130->mclk_int);
246 if (!pll_entry)
247 return -EINVAL;
248
249 if (pll_entry->pll_cal_ratio == 0) {
250 regmap_update_bits(cs43130->regmap, CS43130_PLL_SET_1,
251 CS43130_PLL_START_MASK, 0);
252
253 cs43130->pll_bypass = true;
254 return 0;
255 }
256
257 cs43130->pll_bypass = false;
258
259 regmap_update_bits(cs43130->regmap, CS43130_PLL_SET_2,
260 CS43130_PLL_DIV_DATA_MASK,
261 pll_entry->pll_div_frac >>
262 CS43130_PLL_DIV_FRAC_0_DATA_SHIFT);
263 regmap_update_bits(cs43130->regmap, CS43130_PLL_SET_3,
264 CS43130_PLL_DIV_DATA_MASK,
265 pll_entry->pll_div_frac >>
266 CS43130_PLL_DIV_FRAC_1_DATA_SHIFT);
267 regmap_update_bits(cs43130->regmap, CS43130_PLL_SET_4,
268 CS43130_PLL_DIV_DATA_MASK,
269 pll_entry->pll_div_frac >>
270 CS43130_PLL_DIV_FRAC_2_DATA_SHIFT);
271 regmap_write(cs43130->regmap, CS43130_PLL_SET_5,
272 pll_entry->pll_div_int);
273 regmap_write(cs43130->regmap, CS43130_PLL_SET_6, pll_entry->pll_divout);
274 regmap_write(cs43130->regmap, CS43130_PLL_SET_7,
275 pll_entry->pll_cal_ratio);
276 regmap_update_bits(cs43130->regmap, CS43130_PLL_SET_8,
277 CS43130_PLL_MODE_MASK,
278 pll_entry->pll_mode << CS43130_PLL_MODE_SHIFT);
279 regmap_write(cs43130->regmap, CS43130_PLL_SET_9,
280 pll_entry->sclk_prediv);
281 regmap_update_bits(cs43130->regmap, CS43130_PLL_SET_1,
282 CS43130_PLL_START_MASK, 1);
283
284 return 0;
285}
286
287static int cs43130_set_pll(struct snd_soc_component *component, int pll_id, int source,
288 unsigned int freq_in, unsigned int freq_out)
289{
290 int ret = 0;
291 struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component);
292
293 switch (freq_in) {
294 case 9600000:
295 case 11289600:
296 case 12000000:
297 case 12288000:
298 case 13000000:
299 case 19200000:
300 case 22579200:
301 case 24000000:
302 case 24576000:
303 case 26000000:
304 cs43130->mclk = freq_in;
305 break;
306 default:
307 dev_err(component->dev,
308 "unsupported pll input reference clock:%d\n", freq_in);
309 return -EINVAL;
310 }
311
312 switch (freq_out) {
313 case 22579200:
314 cs43130->mclk_int = freq_out;
315 break;
316 case 24576000:
317 cs43130->mclk_int = freq_out;
318 break;
319 default:
320 dev_err(component->dev,
321 "unsupported pll output ref clock: %u\n", freq_out);
322 return -EINVAL;
323 }
324
325 ret = cs43130_pll_config(component);
326 dev_dbg(component->dev, "cs43130->pll_bypass = %d", cs43130->pll_bypass);
327 return ret;
328}
329
330static int cs43130_change_clksrc(struct snd_soc_component *component,
331 enum cs43130_mclk_src_sel src)
332{
333 int ret;
334 struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component);
335 int mclk_int_decoded;
336
337 if (src == cs43130->mclk_int_src) {
338 /* clk source has not changed */
339 return 0;
340 }
341
342 switch (cs43130->mclk_int) {
343 case CS43130_MCLK_22M:
344 mclk_int_decoded = CS43130_MCLK_22P5;
345 break;
346 case CS43130_MCLK_24M:
347 mclk_int_decoded = CS43130_MCLK_24P5;
348 break;
349 default:
350 dev_err(component->dev, "Invalid MCLK INT freq: %u\n", cs43130->mclk_int);
351 return -EINVAL;
352 }
353
354 switch (src) {
355 case CS43130_MCLK_SRC_EXT:
356 cs43130->pll_bypass = true;
357 cs43130->mclk_int_src = CS43130_MCLK_SRC_EXT;
358 if (cs43130->xtal_ibias == CS43130_XTAL_UNUSED) {
359 regmap_update_bits(cs43130->regmap, CS43130_PWDN_CTL,
360 CS43130_PDN_XTAL_MASK,
361 1 << CS43130_PDN_XTAL_SHIFT);
362 } else {
363 reinit_completion(&cs43130->xtal_rdy);
364 regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1,
365 CS43130_XTAL_RDY_INT_MASK, 0);
366 regmap_update_bits(cs43130->regmap, CS43130_PWDN_CTL,
367 CS43130_PDN_XTAL_MASK, 0);
368 ret = wait_for_completion_timeout(&cs43130->xtal_rdy,
369 msecs_to_jiffies(100));
370 regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1,
371 CS43130_XTAL_RDY_INT_MASK,
372 1 << CS43130_XTAL_RDY_INT_SHIFT);
373 if (ret == 0) {
374 dev_err(component->dev, "Timeout waiting for XTAL_READY interrupt\n");
375 return -ETIMEDOUT;
376 }
377 }
378
379 regmap_update_bits(cs43130->regmap, CS43130_SYS_CLK_CTL_1,
380 CS43130_MCLK_SRC_SEL_MASK,
381 src << CS43130_MCLK_SRC_SEL_SHIFT);
382 regmap_update_bits(cs43130->regmap, CS43130_SYS_CLK_CTL_1,
383 CS43130_MCLK_INT_MASK,
384 mclk_int_decoded << CS43130_MCLK_INT_SHIFT);
385 usleep_range(150, 200);
386
387 regmap_update_bits(cs43130->regmap, CS43130_PWDN_CTL,
388 CS43130_PDN_PLL_MASK,
389 1 << CS43130_PDN_PLL_SHIFT);
390 break;
391 case CS43130_MCLK_SRC_PLL:
392 cs43130->pll_bypass = false;
393 cs43130->mclk_int_src = CS43130_MCLK_SRC_PLL;
394 if (cs43130->xtal_ibias == CS43130_XTAL_UNUSED) {
395 regmap_update_bits(cs43130->regmap, CS43130_PWDN_CTL,
396 CS43130_PDN_XTAL_MASK,
397 1 << CS43130_PDN_XTAL_SHIFT);
398 } else {
399 reinit_completion(&cs43130->xtal_rdy);
400 regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1,
401 CS43130_XTAL_RDY_INT_MASK, 0);
402 regmap_update_bits(cs43130->regmap, CS43130_PWDN_CTL,
403 CS43130_PDN_XTAL_MASK, 0);
404 ret = wait_for_completion_timeout(&cs43130->xtal_rdy,
405 msecs_to_jiffies(100));
406 regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1,
407 CS43130_XTAL_RDY_INT_MASK,
408 1 << CS43130_XTAL_RDY_INT_SHIFT);
409 if (ret == 0) {
410 dev_err(component->dev, "Timeout waiting for XTAL_READY interrupt\n");
411 return -ETIMEDOUT;
412 }
413 }
414
415 reinit_completion(&cs43130->pll_rdy);
416 regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1,
417 CS43130_PLL_RDY_INT_MASK, 0);
418 regmap_update_bits(cs43130->regmap, CS43130_PWDN_CTL,
419 CS43130_PDN_PLL_MASK, 0);
420 ret = wait_for_completion_timeout(&cs43130->pll_rdy,
421 msecs_to_jiffies(100));
422 regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1,
423 CS43130_PLL_RDY_INT_MASK,
424 1 << CS43130_PLL_RDY_INT_SHIFT);
425 if (ret == 0) {
426 dev_err(component->dev, "Timeout waiting for PLL_READY interrupt\n");
427 return -ETIMEDOUT;
428 }
429
430 regmap_update_bits(cs43130->regmap, CS43130_SYS_CLK_CTL_1,
431 CS43130_MCLK_SRC_SEL_MASK,
432 src << CS43130_MCLK_SRC_SEL_SHIFT);
433 regmap_update_bits(cs43130->regmap, CS43130_SYS_CLK_CTL_1,
434 CS43130_MCLK_INT_MASK,
435 mclk_int_decoded << CS43130_MCLK_INT_SHIFT);
436 usleep_range(150, 200);
437 break;
438 case CS43130_MCLK_SRC_RCO:
439 cs43130->mclk_int_src = CS43130_MCLK_SRC_RCO;
440
441 regmap_update_bits(cs43130->regmap, CS43130_SYS_CLK_CTL_1,
442 CS43130_MCLK_SRC_SEL_MASK,
443 src << CS43130_MCLK_SRC_SEL_SHIFT);
444 regmap_update_bits(cs43130->regmap, CS43130_SYS_CLK_CTL_1,
445 CS43130_MCLK_INT_MASK,
446 CS43130_MCLK_22P5 << CS43130_MCLK_INT_SHIFT);
447 usleep_range(150, 200);
448
449 regmap_update_bits(cs43130->regmap, CS43130_PWDN_CTL,
450 CS43130_PDN_XTAL_MASK,
451 1 << CS43130_PDN_XTAL_SHIFT);
452 regmap_update_bits(cs43130->regmap, CS43130_PWDN_CTL,
453 CS43130_PDN_PLL_MASK,
454 1 << CS43130_PDN_PLL_SHIFT);
455 break;
456 default:
457 dev_err(component->dev, "Invalid MCLK source value\n");
458 return -EINVAL;
459 }
460
461 return 0;
462}
463
464static const struct cs43130_bitwidth_map cs43130_bitwidth_table[] = {
465 {8, CS43130_SP_BIT_SIZE_8, CS43130_CH_BIT_SIZE_8},
466 {16, CS43130_SP_BIT_SIZE_16, CS43130_CH_BIT_SIZE_16},
467 {24, CS43130_SP_BIT_SIZE_24, CS43130_CH_BIT_SIZE_24},
468 {32, CS43130_SP_BIT_SIZE_32, CS43130_CH_BIT_SIZE_32},
469};
470
471static const struct cs43130_bitwidth_map *cs43130_get_bitwidth_table(
472 unsigned int bitwidth)
473{
474 int i;
475
476 for (i = 0; i < ARRAY_SIZE(cs43130_bitwidth_table); i++) {
477 if (cs43130_bitwidth_table[i].bitwidth == bitwidth)
478 return &cs43130_bitwidth_table[i];
479 }
480
481 return NULL;
482}
483
484static int cs43130_set_bitwidth(int dai_id, unsigned int bitwidth_dai,
485 struct regmap *regmap)
486{
487 const struct cs43130_bitwidth_map *bw_map;
488
489 bw_map = cs43130_get_bitwidth_table(bitwidth_dai);
490 if (!bw_map)
491 return -EINVAL;
492
493 switch (dai_id) {
494 case CS43130_ASP_PCM_DAI:
495 case CS43130_ASP_DOP_DAI:
496 regmap_update_bits(regmap, CS43130_ASP_CH_1_SZ_EN,
497 CS43130_CH_BITSIZE_MASK, bw_map->ch_bit);
498 regmap_update_bits(regmap, CS43130_ASP_CH_2_SZ_EN,
499 CS43130_CH_BITSIZE_MASK, bw_map->ch_bit);
500 regmap_update_bits(regmap, CS43130_SP_BITSIZE,
501 CS43130_ASP_BITSIZE_MASK, bw_map->sp_bit);
502 break;
503 case CS43130_XSP_DOP_DAI:
504 regmap_update_bits(regmap, CS43130_XSP_CH_1_SZ_EN,
505 CS43130_CH_BITSIZE_MASK, bw_map->ch_bit);
506 regmap_update_bits(regmap, CS43130_XSP_CH_2_SZ_EN,
507 CS43130_CH_BITSIZE_MASK, bw_map->ch_bit);
508 regmap_update_bits(regmap, CS43130_SP_BITSIZE,
509 CS43130_XSP_BITSIZE_MASK, bw_map->sp_bit <<
510 CS43130_XSP_BITSIZE_SHIFT);
511 break;
512 default:
513 return -EINVAL;
514 }
515
516 return 0;
517}
518
519static const struct cs43130_rate_map cs43130_rate_table[] = {
520 {32000, CS43130_ASP_SPRATE_32K},
521 {44100, CS43130_ASP_SPRATE_44_1K},
522 {48000, CS43130_ASP_SPRATE_48K},
523 {88200, CS43130_ASP_SPRATE_88_2K},
524 {96000, CS43130_ASP_SPRATE_96K},
525 {176400, CS43130_ASP_SPRATE_176_4K},
526 {192000, CS43130_ASP_SPRATE_192K},
527 {352800, CS43130_ASP_SPRATE_352_8K},
528 {384000, CS43130_ASP_SPRATE_384K},
529};
530
531static const struct cs43130_rate_map *cs43130_get_rate_table(int fs)
532{
533 int i;
534
535 for (i = 0; i < ARRAY_SIZE(cs43130_rate_table); i++) {
536 if (cs43130_rate_table[i].fs == fs)
537 return &cs43130_rate_table[i];
538 }
539
540 return NULL;
541}
542
543static const struct cs43130_clk_gen *cs43130_get_clk_gen(int mclk_int, int fs,
544 const struct cs43130_clk_gen *clk_gen_table, int len_clk_gen_table)
545{
546 int i;
547
548 for (i = 0; i < len_clk_gen_table; i++) {
549 if (clk_gen_table[i].mclk_int == mclk_int &&
550 clk_gen_table[i].fs == fs)
551 return &clk_gen_table[i];
552 }
553
554 return NULL;
555}
556
557static int cs43130_set_sp_fmt(int dai_id, unsigned int bitwidth_sclk,
558 struct snd_pcm_hw_params *params,
559 struct cs43130_private *cs43130)
560{
561 u16 frm_size;
562 u16 hi_size;
563 u8 frm_delay;
564 u8 frm_phase;
565 u8 frm_data;
566 u8 sclk_edge;
567 u8 lrck_edge;
568 u8 clk_data;
569 u8 loc_ch1;
570 u8 loc_ch2;
571 u8 dai_mode_val;
572 const struct cs43130_clk_gen *clk_gen;
573
574 switch (cs43130->dais[dai_id].dai_format) {
575 case SND_SOC_DAIFMT_I2S:
576 hi_size = bitwidth_sclk;
577 frm_delay = 2;
578 frm_phase = 0;
579 break;
580 case SND_SOC_DAIFMT_LEFT_J:
581 hi_size = bitwidth_sclk;
582 frm_delay = 2;
583 frm_phase = 1;
584 break;
585 case SND_SOC_DAIFMT_DSP_A:
586 hi_size = 1;
587 frm_delay = 2;
588 frm_phase = 1;
589 break;
590 case SND_SOC_DAIFMT_DSP_B:
591 hi_size = 1;
592 frm_delay = 0;
593 frm_phase = 1;
594 break;
595 default:
596 return -EINVAL;
597 }
598
599 switch (cs43130->dais[dai_id].dai_mode) {
600 case SND_SOC_DAIFMT_CBS_CFS:
601 dai_mode_val = 0;
602 break;
603 case SND_SOC_DAIFMT_CBM_CFM:
604 dai_mode_val = 1;
605 break;
606 default:
607 return -EINVAL;
608 }
609
610 frm_size = bitwidth_sclk * params_channels(params);
611 sclk_edge = 1;
612 lrck_edge = 0;
613 loc_ch1 = 0;
614 loc_ch2 = bitwidth_sclk * (params_channels(params) - 1);
615
616 frm_data = frm_delay & CS43130_SP_FSD_MASK;
617 frm_data |= (frm_phase << CS43130_SP_STP_SHIFT) & CS43130_SP_STP_MASK;
618
619 clk_data = lrck_edge & CS43130_SP_LCPOL_IN_MASK;
620 clk_data |= (lrck_edge << CS43130_SP_LCPOL_OUT_SHIFT) &
621 CS43130_SP_LCPOL_OUT_MASK;
622 clk_data |= (sclk_edge << CS43130_SP_SCPOL_IN_SHIFT) &
623 CS43130_SP_SCPOL_IN_MASK;
624 clk_data |= (sclk_edge << CS43130_SP_SCPOL_OUT_SHIFT) &
625 CS43130_SP_SCPOL_OUT_MASK;
626 clk_data |= (dai_mode_val << CS43130_SP_MODE_SHIFT) &
627 CS43130_SP_MODE_MASK;
628
629 switch (dai_id) {
630 case CS43130_ASP_PCM_DAI:
631 case CS43130_ASP_DOP_DAI:
632 regmap_update_bits(cs43130->regmap, CS43130_ASP_LRCK_PERIOD_1,
633 CS43130_SP_LCPR_DATA_MASK, (frm_size - 1) >>
634 CS43130_SP_LCPR_LSB_DATA_SHIFT);
635 regmap_update_bits(cs43130->regmap, CS43130_ASP_LRCK_PERIOD_2,
636 CS43130_SP_LCPR_DATA_MASK, (frm_size - 1) >>
637 CS43130_SP_LCPR_MSB_DATA_SHIFT);
638 regmap_update_bits(cs43130->regmap, CS43130_ASP_LRCK_HI_TIME_1,
639 CS43130_SP_LCHI_DATA_MASK, (hi_size - 1) >>
640 CS43130_SP_LCHI_LSB_DATA_SHIFT);
641 regmap_update_bits(cs43130->regmap, CS43130_ASP_LRCK_HI_TIME_2,
642 CS43130_SP_LCHI_DATA_MASK, (hi_size - 1) >>
643 CS43130_SP_LCHI_MSB_DATA_SHIFT);
644 regmap_write(cs43130->regmap, CS43130_ASP_FRAME_CONF, frm_data);
645 regmap_write(cs43130->regmap, CS43130_ASP_CH_1_LOC, loc_ch1);
646 regmap_write(cs43130->regmap, CS43130_ASP_CH_2_LOC, loc_ch2);
647 regmap_update_bits(cs43130->regmap, CS43130_ASP_CH_1_SZ_EN,
648 CS43130_CH_EN_MASK, 1 << CS43130_CH_EN_SHIFT);
649 regmap_update_bits(cs43130->regmap, CS43130_ASP_CH_2_SZ_EN,
650 CS43130_CH_EN_MASK, 1 << CS43130_CH_EN_SHIFT);
651 regmap_write(cs43130->regmap, CS43130_ASP_CLOCK_CONF, clk_data);
652 break;
653 case CS43130_XSP_DOP_DAI:
654 regmap_update_bits(cs43130->regmap, CS43130_XSP_LRCK_PERIOD_1,
655 CS43130_SP_LCPR_DATA_MASK, (frm_size - 1) >>
656 CS43130_SP_LCPR_LSB_DATA_SHIFT);
657 regmap_update_bits(cs43130->regmap, CS43130_XSP_LRCK_PERIOD_2,
658 CS43130_SP_LCPR_DATA_MASK, (frm_size - 1) >>
659 CS43130_SP_LCPR_MSB_DATA_SHIFT);
660 regmap_update_bits(cs43130->regmap, CS43130_XSP_LRCK_HI_TIME_1,
661 CS43130_SP_LCHI_DATA_MASK, (hi_size - 1) >>
662 CS43130_SP_LCHI_LSB_DATA_SHIFT);
663 regmap_update_bits(cs43130->regmap, CS43130_XSP_LRCK_HI_TIME_2,
664 CS43130_SP_LCHI_DATA_MASK, (hi_size - 1) >>
665 CS43130_SP_LCHI_MSB_DATA_SHIFT);
666 regmap_write(cs43130->regmap, CS43130_XSP_FRAME_CONF, frm_data);
667 regmap_write(cs43130->regmap, CS43130_XSP_CH_1_LOC, loc_ch1);
668 regmap_write(cs43130->regmap, CS43130_XSP_CH_2_LOC, loc_ch2);
669 regmap_update_bits(cs43130->regmap, CS43130_XSP_CH_1_SZ_EN,
670 CS43130_CH_EN_MASK, 1 << CS43130_CH_EN_SHIFT);
671 regmap_update_bits(cs43130->regmap, CS43130_XSP_CH_2_SZ_EN,
672 CS43130_CH_EN_MASK, 1 << CS43130_CH_EN_SHIFT);
673 regmap_write(cs43130->regmap, CS43130_XSP_CLOCK_CONF, clk_data);
674 break;
675 default:
676 return -EINVAL;
677 }
678
679 switch (frm_size) {
680 case 16:
681 clk_gen = cs43130_get_clk_gen(cs43130->mclk_int,
682 params_rate(params),
683 cs43130_16_clk_gen,
684 ARRAY_SIZE(cs43130_16_clk_gen));
685 break;
686 case 32:
687 clk_gen = cs43130_get_clk_gen(cs43130->mclk_int,
688 params_rate(params),
689 cs43130_32_clk_gen,
690 ARRAY_SIZE(cs43130_32_clk_gen));
691 break;
692 case 48:
693 clk_gen = cs43130_get_clk_gen(cs43130->mclk_int,
694 params_rate(params),
695 cs43130_48_clk_gen,
696 ARRAY_SIZE(cs43130_48_clk_gen));
697 break;
698 case 64:
699 clk_gen = cs43130_get_clk_gen(cs43130->mclk_int,
700 params_rate(params),
701 cs43130_64_clk_gen,
702 ARRAY_SIZE(cs43130_64_clk_gen));
703 break;
704 default:
705 return -EINVAL;
706 }
707
708 if (!clk_gen)
709 return -EINVAL;
710
711 switch (dai_id) {
712 case CS43130_ASP_PCM_DAI:
713 case CS43130_ASP_DOP_DAI:
714 regmap_write(cs43130->regmap, CS43130_ASP_DEN_1,
715 (clk_gen->den & CS43130_SP_M_LSB_DATA_MASK) >>
716 CS43130_SP_M_LSB_DATA_SHIFT);
717 regmap_write(cs43130->regmap, CS43130_ASP_DEN_2,
718 (clk_gen->den & CS43130_SP_M_MSB_DATA_MASK) >>
719 CS43130_SP_M_MSB_DATA_SHIFT);
720 regmap_write(cs43130->regmap, CS43130_ASP_NUM_1,
721 (clk_gen->num & CS43130_SP_N_LSB_DATA_MASK) >>
722 CS43130_SP_N_LSB_DATA_SHIFT);
723 regmap_write(cs43130->regmap, CS43130_ASP_NUM_2,
724 (clk_gen->num & CS43130_SP_N_MSB_DATA_MASK) >>
725 CS43130_SP_N_MSB_DATA_SHIFT);
726 break;
727 case CS43130_XSP_DOP_DAI:
728 regmap_write(cs43130->regmap, CS43130_XSP_DEN_1,
729 (clk_gen->den & CS43130_SP_M_LSB_DATA_MASK) >>
730 CS43130_SP_M_LSB_DATA_SHIFT);
731 regmap_write(cs43130->regmap, CS43130_XSP_DEN_2,
732 (clk_gen->den & CS43130_SP_M_MSB_DATA_MASK) >>
733 CS43130_SP_M_MSB_DATA_SHIFT);
734 regmap_write(cs43130->regmap, CS43130_XSP_NUM_1,
735 (clk_gen->num & CS43130_SP_N_LSB_DATA_MASK) >>
736 CS43130_SP_N_LSB_DATA_SHIFT);
737 regmap_write(cs43130->regmap, CS43130_XSP_NUM_2,
738 (clk_gen->num & CS43130_SP_N_MSB_DATA_MASK) >>
739 CS43130_SP_N_MSB_DATA_SHIFT);
740 break;
741 default:
742 return -EINVAL;
743 }
744
745 return 0;
746}
747
748static int cs43130_pcm_dsd_mix(bool en, struct regmap *regmap)
749{
750 if (en) {
751 regmap_update_bits(regmap, CS43130_DSD_PCM_MIX_CTL,
752 CS43130_MIX_PCM_PREP_MASK,
753 1 << CS43130_MIX_PCM_PREP_SHIFT);
754 usleep_range(6000, 6050);
755 regmap_update_bits(regmap, CS43130_DSD_PCM_MIX_CTL,
756 CS43130_MIX_PCM_DSD_MASK,
757 1 << CS43130_MIX_PCM_DSD_SHIFT);
758 } else {
759 regmap_update_bits(regmap, CS43130_DSD_PCM_MIX_CTL,
760 CS43130_MIX_PCM_DSD_MASK,
761 0 << CS43130_MIX_PCM_DSD_SHIFT);
762 usleep_range(1600, 1650);
763 regmap_update_bits(regmap, CS43130_DSD_PCM_MIX_CTL,
764 CS43130_MIX_PCM_PREP_MASK,
765 0 << CS43130_MIX_PCM_PREP_SHIFT);
766 }
767
768 return 0;
769}
770
771static int cs43130_dsd_hw_params(struct snd_pcm_substream *substream,
772 struct snd_pcm_hw_params *params,
773 struct snd_soc_dai *dai)
774{
775 struct snd_soc_component *component = dai->component;
776 struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component);
777 unsigned int required_clk;
778 u8 dsd_speed;
779
780 mutex_lock(&cs43130->clk_mutex);
781 if (!cs43130->clk_req) {
782 /* no DAI is currently using clk */
783 if (!(CS43130_MCLK_22M % params_rate(params)))
784 required_clk = CS43130_MCLK_22M;
785 else
786 required_clk = CS43130_MCLK_24M;
787
788 cs43130_set_pll(component, 0, 0, cs43130->mclk, required_clk);
789 if (cs43130->pll_bypass)
790 cs43130_change_clksrc(component, CS43130_MCLK_SRC_EXT);
791 else
792 cs43130_change_clksrc(component, CS43130_MCLK_SRC_PLL);
793 }
794
795 cs43130->clk_req++;
796 if (cs43130->clk_req == 2)
797 cs43130_pcm_dsd_mix(true, cs43130->regmap);
798 mutex_unlock(&cs43130->clk_mutex);
799
800 switch (params_rate(params)) {
801 case 176400:
802 dsd_speed = 0;
803 break;
804 case 352800:
805 dsd_speed = 1;
806 break;
807 default:
808 dev_err(component->dev, "Rate(%u) not supported\n",
809 params_rate(params));
810 return -EINVAL;
811 }
812
813 if (cs43130->dais[dai->id].dai_mode == SND_SOC_DAIFMT_CBM_CFM)
814 regmap_update_bits(cs43130->regmap, CS43130_DSD_INT_CFG,
815 CS43130_DSD_MASTER, CS43130_DSD_MASTER);
816 else
817 regmap_update_bits(cs43130->regmap, CS43130_DSD_INT_CFG,
818 CS43130_DSD_MASTER, 0);
819
820 regmap_update_bits(cs43130->regmap, CS43130_DSD_PATH_CTL_2,
821 CS43130_DSD_SPEED_MASK,
822 dsd_speed << CS43130_DSD_SPEED_SHIFT);
823 regmap_update_bits(cs43130->regmap, CS43130_DSD_PATH_CTL_2,
824 CS43130_DSD_SRC_MASK, CS43130_DSD_SRC_DSD <<
825 CS43130_DSD_SRC_SHIFT);
826
827 return 0;
828}
829
830static int cs43130_hw_params(struct snd_pcm_substream *substream,
831 struct snd_pcm_hw_params *params,
832 struct snd_soc_dai *dai)
833{
834 struct snd_soc_component *component = dai->component;
835 struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component);
836 const struct cs43130_rate_map *rate_map;
837 unsigned int sclk = cs43130->dais[dai->id].sclk;
838 unsigned int bitwidth_sclk;
839 unsigned int bitwidth_dai = (unsigned int)(params_width(params));
840 unsigned int required_clk;
841 u8 dsd_speed;
842
843 mutex_lock(&cs43130->clk_mutex);
844 if (!cs43130->clk_req) {
845 /* no DAI is currently using clk */
846 if (!(CS43130_MCLK_22M % params_rate(params)))
847 required_clk = CS43130_MCLK_22M;
848 else
849 required_clk = CS43130_MCLK_24M;
850
851 cs43130_set_pll(component, 0, 0, cs43130->mclk, required_clk);
852 if (cs43130->pll_bypass)
853 cs43130_change_clksrc(component, CS43130_MCLK_SRC_EXT);
854 else
855 cs43130_change_clksrc(component, CS43130_MCLK_SRC_PLL);
856 }
857
858 cs43130->clk_req++;
859 if (cs43130->clk_req == 2)
860 cs43130_pcm_dsd_mix(true, cs43130->regmap);
861 mutex_unlock(&cs43130->clk_mutex);
862
863 switch (dai->id) {
864 case CS43130_ASP_DOP_DAI:
865 case CS43130_XSP_DOP_DAI:
866 /* DoP bitwidth is always 24-bit */
867 bitwidth_dai = 24;
868 sclk = params_rate(params) * bitwidth_dai *
869 params_channels(params);
870
871 switch (params_rate(params)) {
872 case 176400:
873 dsd_speed = 0;
874 break;
875 case 352800:
876 dsd_speed = 1;
877 break;
878 default:
879 dev_err(component->dev, "Rate(%u) not supported\n",
880 params_rate(params));
881 return -EINVAL;
882 }
883
884 regmap_update_bits(cs43130->regmap, CS43130_DSD_PATH_CTL_2,
885 CS43130_DSD_SPEED_MASK,
886 dsd_speed << CS43130_DSD_SPEED_SHIFT);
887 break;
888 case CS43130_ASP_PCM_DAI:
889 rate_map = cs43130_get_rate_table(params_rate(params));
890 if (!rate_map)
891 return -EINVAL;
892
893 regmap_write(cs43130->regmap, CS43130_SP_SRATE, rate_map->val);
894 break;
895 default:
896 dev_err(component->dev, "Invalid DAI (%d)\n", dai->id);
897 return -EINVAL;
898 }
899
900 switch (dai->id) {
901 case CS43130_ASP_DOP_DAI:
902 regmap_update_bits(cs43130->regmap, CS43130_DSD_PATH_CTL_2,
903 CS43130_DSD_SRC_MASK, CS43130_DSD_SRC_ASP <<
904 CS43130_DSD_SRC_SHIFT);
905 break;
906 case CS43130_XSP_DOP_DAI:
907 regmap_update_bits(cs43130->regmap, CS43130_DSD_PATH_CTL_2,
908 CS43130_DSD_SRC_MASK, CS43130_DSD_SRC_XSP <<
909 CS43130_DSD_SRC_SHIFT);
910 break;
911 }
912
913 if (!sclk && cs43130->dais[dai->id].dai_mode == SND_SOC_DAIFMT_CBM_CFM)
914 /* Calculate SCLK in master mode if unassigned */
915 sclk = params_rate(params) * bitwidth_dai *
916 params_channels(params);
917
918 if (!sclk) {
919 /* at this point, SCLK must be set */
920 dev_err(component->dev, "SCLK freq is not set\n");
921 return -EINVAL;
922 }
923
924 bitwidth_sclk = (sclk / params_rate(params)) / params_channels(params);
925 if (bitwidth_sclk < bitwidth_dai) {
926 dev_err(component->dev, "Format not supported: SCLK freq is too low\n");
927 return -EINVAL;
928 }
929
930 dev_dbg(component->dev,
931 "sclk = %u, fs = %d, bitwidth_dai = %u\n",
932 sclk, params_rate(params), bitwidth_dai);
933
934 dev_dbg(component->dev,
935 "bitwidth_sclk = %u, num_ch = %u\n",
936 bitwidth_sclk, params_channels(params));
937
938 cs43130_set_bitwidth(dai->id, bitwidth_dai, cs43130->regmap);
939 cs43130_set_sp_fmt(dai->id, bitwidth_sclk, params, cs43130);
940
941 return 0;
942}
943
944static int cs43130_hw_free(struct snd_pcm_substream *substream,
945 struct snd_soc_dai *dai)
946{
947 struct snd_soc_component *component = dai->component;
948 struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component);
949
950 mutex_lock(&cs43130->clk_mutex);
951 cs43130->clk_req--;
952 if (!cs43130->clk_req) {
953 /* no DAI is currently using clk */
954 cs43130_change_clksrc(component, CS43130_MCLK_SRC_RCO);
955 cs43130_pcm_dsd_mix(false, cs43130->regmap);
956 }
957 mutex_unlock(&cs43130->clk_mutex);
958
959 return 0;
960}
961
962static const DECLARE_TLV_DB_SCALE(pcm_vol_tlv, -12750, 50, 1);
963
964static const char * const pcm_ch_text[] = {
965 "Left-Right Ch",
966 "Left-Left Ch",
967 "Right-Left Ch",
968 "Right-Right Ch",
969};
970
971static const struct reg_sequence pcm_ch_en_seq[] = {
972 {CS43130_DXD1, 0x99},
973 {0x180005, 0x8C},
974 {0x180007, 0xAB},
975 {0x180015, 0x31},
976 {0x180017, 0xB2},
977 {0x180025, 0x30},
978 {0x180027, 0x84},
979 {0x180035, 0x9C},
980 {0x180037, 0xAE},
981 {0x18000D, 0x24},
982 {0x18000F, 0xA3},
983 {0x18001D, 0x05},
984 {0x18001F, 0xD4},
985 {0x18002D, 0x0B},
986 {0x18002F, 0xC7},
987 {0x18003D, 0x71},
988 {0x18003F, 0xE7},
989 {CS43130_DXD1, 0},
990};
991
992static const struct reg_sequence pcm_ch_dis_seq[] = {
993 {CS43130_DXD1, 0x99},
994 {0x180005, 0x24},
995 {0x180007, 0xA3},
996 {0x180015, 0x05},
997 {0x180017, 0xD4},
998 {0x180025, 0x0B},
999 {0x180027, 0xC7},
1000 {0x180035, 0x71},
1001 {0x180037, 0xE7},
1002 {0x18000D, 0x8C},
1003 {0x18000F, 0xAB},
1004 {0x18001D, 0x31},
1005 {0x18001F, 0xB2},
1006 {0x18002D, 0x30},
1007 {0x18002F, 0x84},
1008 {0x18003D, 0x9C},
1009 {0x18003F, 0xAE},
1010 {CS43130_DXD1, 0},
1011};
1012
1013static int cs43130_pcm_ch_get(struct snd_kcontrol *kcontrol,
1014 struct snd_ctl_elem_value *ucontrol)
1015{
1016 return snd_soc_get_enum_double(kcontrol, ucontrol);
1017}
1018
1019static int cs43130_pcm_ch_put(struct snd_kcontrol *kcontrol,
1020 struct snd_ctl_elem_value *ucontrol)
1021{
1022 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
1023 unsigned int *item = ucontrol->value.enumerated.item;
1024 struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
1025 struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component);
1026 unsigned int val;
1027
1028 if (item[0] >= e->items)
1029 return -EINVAL;
1030 val = snd_soc_enum_item_to_val(e, item[0]) << e->shift_l;
1031
1032 switch (cs43130->dev_id) {
1033 case CS43131_CHIP_ID:
1034 case CS43198_CHIP_ID:
1035 if (val >= 2)
1036 regmap_multi_reg_write(cs43130->regmap, pcm_ch_en_seq,
1037 ARRAY_SIZE(pcm_ch_en_seq));
1038 else
1039 regmap_multi_reg_write(cs43130->regmap, pcm_ch_dis_seq,
1040 ARRAY_SIZE(pcm_ch_dis_seq));
1041 break;
1042 }
1043
1044 return snd_soc_put_enum_double(kcontrol, ucontrol);
1045}
1046
1047static SOC_ENUM_SINGLE_DECL(pcm_ch_enum, CS43130_PCM_PATH_CTL_2, 0,
1048 pcm_ch_text);
1049
1050static const char * const pcm_spd_texts[] = {
1051 "Fast",
1052 "Slow",
1053};
1054
1055static SOC_ENUM_SINGLE_DECL(pcm_spd_enum, CS43130_PCM_FILT_OPT, 7,
1056 pcm_spd_texts);
1057
1058static const char * const dsd_texts[] = {
1059 "Off",
1060 "BCKA Mode",
1061 "BCKD Mode",
1062};
1063
1064static const unsigned int dsd_values[] = {
1065 CS43130_DSD_SRC_DSD,
1066 CS43130_DSD_SRC_ASP,
1067 CS43130_DSD_SRC_XSP,
1068};
1069
1070static SOC_VALUE_ENUM_SINGLE_DECL(dsd_enum, CS43130_DSD_INT_CFG, 0, 0x03,
1071 dsd_texts, dsd_values);
1072
1073static const struct snd_kcontrol_new cs43130_snd_controls[] = {
1074 SOC_DOUBLE_R_TLV("Master Playback Volume",
1075 CS43130_PCM_VOL_A, CS43130_PCM_VOL_B, 0, 0xFF, 1,
1076 pcm_vol_tlv),
1077 SOC_DOUBLE_R_TLV("Master DSD Playback Volume",
1078 CS43130_DSD_VOL_A, CS43130_DSD_VOL_B, 0, 0xFF, 1,
1079 pcm_vol_tlv),
1080 SOC_ENUM_EXT("PCM Ch Select", pcm_ch_enum, cs43130_pcm_ch_get,
1081 cs43130_pcm_ch_put),
1082 SOC_ENUM("PCM Filter Speed", pcm_spd_enum),
1083 SOC_SINGLE("PCM Phase Compensation", CS43130_PCM_FILT_OPT, 6, 1, 0),
1084 SOC_SINGLE("PCM Nonoversample Emulate", CS43130_PCM_FILT_OPT, 5, 1, 0),
1085 SOC_SINGLE("PCM High-pass Filter", CS43130_PCM_FILT_OPT, 1, 1, 0),
1086 SOC_SINGLE("PCM De-emphasis Filter", CS43130_PCM_FILT_OPT, 0, 1, 0),
1087 SOC_ENUM("DSD Phase Modulation", dsd_enum),
1088};
1089
1090static const struct reg_sequence pcm_seq[] = {
1091 {CS43130_DXD1, 0x99},
1092 {CS43130_DXD7, 0x01},
1093 {CS43130_DXD8, 0},
1094 {CS43130_DXD9, 0x01},
1095 {CS43130_DXD3, 0x12},
1096 {CS43130_DXD4, 0},
1097 {CS43130_DXD10, 0x28},
1098 {CS43130_DXD11, 0x28},
1099 {CS43130_DXD1, 0},
1100};
1101
1102static const struct reg_sequence dsd_seq[] = {
1103 {CS43130_DXD1, 0x99},
1104 {CS43130_DXD7, 0x01},
1105 {CS43130_DXD8, 0},
1106 {CS43130_DXD9, 0x01},
1107 {CS43130_DXD3, 0x12},
1108 {CS43130_DXD4, 0},
1109 {CS43130_DXD10, 0x1E},
1110 {CS43130_DXD11, 0x20},
1111 {CS43130_DXD1, 0},
1112};
1113
1114static const struct reg_sequence pop_free_seq[] = {
1115 {CS43130_DXD1, 0x99},
1116 {CS43130_DXD12, 0x0A},
1117 {CS43130_DXD1, 0},
1118};
1119
1120static const struct reg_sequence pop_free_seq2[] = {
1121 {CS43130_DXD1, 0x99},
1122 {CS43130_DXD13, 0x20},
1123 {CS43130_DXD1, 0},
1124};
1125
1126static const struct reg_sequence mute_seq[] = {
1127 {CS43130_DXD1, 0x99},
1128 {CS43130_DXD3, 0x12},
1129 {CS43130_DXD5, 0x02},
1130 {CS43130_DXD4, 0x12},
1131 {CS43130_DXD1, 0},
1132};
1133
1134static const struct reg_sequence unmute_seq[] = {
1135 {CS43130_DXD1, 0x99},
1136 {CS43130_DXD3, 0x10},
1137 {CS43130_DXD5, 0},
1138 {CS43130_DXD4, 0x16},
1139 {CS43130_DXD1, 0},
1140};
1141
1142static int cs43130_dsd_event(struct snd_soc_dapm_widget *w,
1143 struct snd_kcontrol *kcontrol, int event)
1144{
1145 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
1146 struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component);
1147
1148 switch (event) {
1149 case SND_SOC_DAPM_PRE_PMU:
1150 switch (cs43130->dev_id) {
1151 case CS43130_CHIP_ID:
1152 case CS4399_CHIP_ID:
1153 regmap_multi_reg_write(cs43130->regmap, dsd_seq,
1154 ARRAY_SIZE(dsd_seq));
1155 break;
1156 }
1157 break;
1158 case SND_SOC_DAPM_POST_PMU:
1159 regmap_update_bits(cs43130->regmap, CS43130_DSD_PATH_CTL_1,
1160 CS43130_MUTE_MASK, 0);
1161 switch (cs43130->dev_id) {
1162 case CS43130_CHIP_ID:
1163 case CS4399_CHIP_ID:
1164 regmap_multi_reg_write(cs43130->regmap, unmute_seq,
1165 ARRAY_SIZE(unmute_seq));
1166 break;
1167 }
1168 break;
1169 case SND_SOC_DAPM_PRE_PMD:
1170 switch (cs43130->dev_id) {
1171 case CS43130_CHIP_ID:
1172 case CS4399_CHIP_ID:
1173 regmap_multi_reg_write(cs43130->regmap, mute_seq,
1174 ARRAY_SIZE(mute_seq));
1175 regmap_update_bits(cs43130->regmap,
1176 CS43130_DSD_PATH_CTL_1,
1177 CS43130_MUTE_MASK, CS43130_MUTE_EN);
1178 /*
1179 * DSD Power Down Sequence
1180 * According to Design, 130ms is preferred.
1181 */
1182 msleep(130);
1183 break;
1184 case CS43131_CHIP_ID:
1185 case CS43198_CHIP_ID:
1186 regmap_update_bits(cs43130->regmap,
1187 CS43130_DSD_PATH_CTL_1,
1188 CS43130_MUTE_MASK, CS43130_MUTE_EN);
1189 break;
1190 }
1191 break;
1192 default:
1193 dev_err(component->dev, "Invalid event = 0x%x\n", event);
1194 return -EINVAL;
1195 }
1196 return 0;
1197}
1198
1199static int cs43130_pcm_event(struct snd_soc_dapm_widget *w,
1200 struct snd_kcontrol *kcontrol, int event)
1201{
1202 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
1203 struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component);
1204
1205 switch (event) {
1206 case SND_SOC_DAPM_PRE_PMU:
1207 switch (cs43130->dev_id) {
1208 case CS43130_CHIP_ID:
1209 case CS4399_CHIP_ID:
1210 regmap_multi_reg_write(cs43130->regmap, pcm_seq,
1211 ARRAY_SIZE(pcm_seq));
1212 break;
1213 }
1214 break;
1215 case SND_SOC_DAPM_POST_PMU:
1216 regmap_update_bits(cs43130->regmap, CS43130_PCM_PATH_CTL_1,
1217 CS43130_MUTE_MASK, 0);
1218 switch (cs43130->dev_id) {
1219 case CS43130_CHIP_ID:
1220 case CS4399_CHIP_ID:
1221 regmap_multi_reg_write(cs43130->regmap, unmute_seq,
1222 ARRAY_SIZE(unmute_seq));
1223 break;
1224 }
1225 break;
1226 case SND_SOC_DAPM_PRE_PMD:
1227 switch (cs43130->dev_id) {
1228 case CS43130_CHIP_ID:
1229 case CS4399_CHIP_ID:
1230 regmap_multi_reg_write(cs43130->regmap, mute_seq,
1231 ARRAY_SIZE(mute_seq));
1232 regmap_update_bits(cs43130->regmap,
1233 CS43130_PCM_PATH_CTL_1,
1234 CS43130_MUTE_MASK, CS43130_MUTE_EN);
1235 /*
1236 * PCM Power Down Sequence
1237 * According to Design, 130ms is preferred.
1238 */
1239 msleep(130);
1240 break;
1241 case CS43131_CHIP_ID:
1242 case CS43198_CHIP_ID:
1243 regmap_update_bits(cs43130->regmap,
1244 CS43130_PCM_PATH_CTL_1,
1245 CS43130_MUTE_MASK, CS43130_MUTE_EN);
1246 break;
1247 }
1248 break;
1249 default:
1250 dev_err(component->dev, "Invalid event = 0x%x\n", event);
1251 return -EINVAL;
1252 }
1253 return 0;
1254}
1255
1256static const struct reg_sequence dac_postpmu_seq[] = {
1257 {CS43130_DXD9, 0x0C},
1258 {CS43130_DXD3, 0x10},
1259 {CS43130_DXD4, 0x20},
1260};
1261
1262static const struct reg_sequence dac_postpmd_seq[] = {
1263 {CS43130_DXD1, 0x99},
1264 {CS43130_DXD6, 0x01},
1265 {CS43130_DXD1, 0},
1266};
1267
1268static int cs43130_dac_event(struct snd_soc_dapm_widget *w,
1269 struct snd_kcontrol *kcontrol, int event)
1270{
1271 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
1272 struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component);
1273
1274 switch (event) {
1275 case SND_SOC_DAPM_PRE_PMU:
1276 switch (cs43130->dev_id) {
1277 case CS43130_CHIP_ID:
1278 case CS4399_CHIP_ID:
1279 regmap_multi_reg_write(cs43130->regmap, pop_free_seq,
1280 ARRAY_SIZE(pop_free_seq));
1281 break;
1282 case CS43131_CHIP_ID:
1283 case CS43198_CHIP_ID:
1284 regmap_multi_reg_write(cs43130->regmap, pop_free_seq2,
1285 ARRAY_SIZE(pop_free_seq2));
1286 break;
1287 }
1288 break;
1289 case SND_SOC_DAPM_POST_PMU:
1290 usleep_range(10000, 10050);
1291
1292 regmap_write(cs43130->regmap, CS43130_DXD1, 0x99);
1293
1294 switch (cs43130->dev_id) {
1295 case CS43130_CHIP_ID:
1296 case CS4399_CHIP_ID:
1297 regmap_multi_reg_write(cs43130->regmap, dac_postpmu_seq,
1298 ARRAY_SIZE(dac_postpmu_seq));
1299 /*
1300 * Per datasheet, Sec. PCM Power-Up Sequence.
1301 * According to Design, CS43130_DXD12 must be 0 to meet
1302 * THDN and Dynamic Range spec.
1303 */
1304 msleep(1000);
1305 regmap_write(cs43130->regmap, CS43130_DXD12, 0);
1306 break;
1307 case CS43131_CHIP_ID:
1308 case CS43198_CHIP_ID:
1309 usleep_range(12000, 12010);
1310 regmap_write(cs43130->regmap, CS43130_DXD13, 0);
1311 break;
1312 }
1313
1314 regmap_write(cs43130->regmap, CS43130_DXD1, 0);
1315 break;
1316 case SND_SOC_DAPM_POST_PMD:
1317 switch (cs43130->dev_id) {
1318 case CS43130_CHIP_ID:
1319 case CS4399_CHIP_ID:
1320 regmap_multi_reg_write(cs43130->regmap, dac_postpmd_seq,
1321 ARRAY_SIZE(dac_postpmd_seq));
1322 break;
1323 }
1324 break;
1325 default:
1326 dev_err(component->dev, "Invalid DAC event = 0x%x\n", event);
1327 return -EINVAL;
1328 }
1329 return 0;
1330}
1331
1332static const struct reg_sequence hpin_prepmd_seq[] = {
1333 {CS43130_DXD1, 0x99},
1334 {CS43130_DXD15, 0x64},
1335 {CS43130_DXD14, 0},
1336 {CS43130_DXD2, 0},
1337 {CS43130_DXD1, 0},
1338};
1339
1340static const struct reg_sequence hpin_postpmu_seq[] = {
1341 {CS43130_DXD1, 0x99},
1342 {CS43130_DXD2, 1},
1343 {CS43130_DXD14, 0xDC},
1344 {CS43130_DXD15, 0xE4},
1345 {CS43130_DXD1, 0},
1346};
1347
1348static int cs43130_hpin_event(struct snd_soc_dapm_widget *w,
1349 struct snd_kcontrol *kcontrol, int event)
1350{
1351 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
1352 struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component);
1353
1354 switch (event) {
1355 case SND_SOC_DAPM_POST_PMD:
1356 regmap_multi_reg_write(cs43130->regmap, hpin_prepmd_seq,
1357 ARRAY_SIZE(hpin_prepmd_seq));
1358 break;
1359 case SND_SOC_DAPM_PRE_PMU:
1360 regmap_multi_reg_write(cs43130->regmap, hpin_postpmu_seq,
1361 ARRAY_SIZE(hpin_postpmu_seq));
1362 break;
1363 default:
1364 dev_err(component->dev, "Invalid HPIN event = 0x%x\n", event);
1365 return -EINVAL;
1366 }
1367 return 0;
1368}
1369
1370static const struct snd_soc_dapm_widget digital_hp_widgets[] = {
1371 SND_SOC_DAPM_OUTPUT("HPOUTA"),
1372 SND_SOC_DAPM_OUTPUT("HPOUTB"),
1373
1374 SND_SOC_DAPM_AIF_IN_E("ASPIN PCM", NULL, 0, CS43130_PWDN_CTL,
1375 CS43130_PDN_ASP_SHIFT, 1, cs43130_pcm_event,
1376 (SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1377 SND_SOC_DAPM_PRE_PMD)),
1378
1379 SND_SOC_DAPM_AIF_IN_E("ASPIN DoP", NULL, 0, CS43130_PWDN_CTL,
1380 CS43130_PDN_ASP_SHIFT, 1, cs43130_dsd_event,
1381 (SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1382 SND_SOC_DAPM_PRE_PMD)),
1383
1384 SND_SOC_DAPM_AIF_IN_E("XSPIN DoP", NULL, 0, CS43130_PWDN_CTL,
1385 CS43130_PDN_XSP_SHIFT, 1, cs43130_dsd_event,
1386 (SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1387 SND_SOC_DAPM_PRE_PMD)),
1388
1389 SND_SOC_DAPM_AIF_IN_E("XSPIN DSD", NULL, 0, CS43130_PWDN_CTL,
1390 CS43130_PDN_DSDIF_SHIFT, 1, cs43130_dsd_event,
1391 (SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1392 SND_SOC_DAPM_PRE_PMD)),
1393
1394 SND_SOC_DAPM_DAC("DSD", NULL, CS43130_DSD_PATH_CTL_2,
1395 CS43130_DSD_EN_SHIFT, 0),
1396
1397 SND_SOC_DAPM_DAC_E("HiFi DAC", NULL, CS43130_PWDN_CTL,
1398 CS43130_PDN_HP_SHIFT, 1, cs43130_dac_event,
1399 (SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1400 SND_SOC_DAPM_POST_PMD)),
1401};
1402
1403static const struct snd_soc_dapm_widget analog_hp_widgets[] = {
1404 SND_SOC_DAPM_DAC_E("Analog Playback", NULL, CS43130_HP_OUT_CTL_1,
1405 CS43130_HP_IN_EN_SHIFT, 0, cs43130_hpin_event,
1406 (SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD)),
1407};
1408
1409static struct snd_soc_dapm_widget all_hp_widgets[
1410 ARRAY_SIZE(digital_hp_widgets) +
1411 ARRAY_SIZE(analog_hp_widgets)];
1412
1413static const struct snd_soc_dapm_route digital_hp_routes[] = {
1414 {"ASPIN PCM", NULL, "ASP PCM Playback"},
1415 {"ASPIN DoP", NULL, "ASP DoP Playback"},
1416 {"XSPIN DoP", NULL, "XSP DoP Playback"},
1417 {"XSPIN DSD", NULL, "XSP DSD Playback"},
1418 {"DSD", NULL, "ASPIN DoP"},
1419 {"DSD", NULL, "XSPIN DoP"},
1420 {"DSD", NULL, "XSPIN DSD"},
1421 {"HiFi DAC", NULL, "ASPIN PCM"},
1422 {"HiFi DAC", NULL, "DSD"},
1423 {"HPOUTA", NULL, "HiFi DAC"},
1424 {"HPOUTB", NULL, "HiFi DAC"},
1425};
1426
1427static const struct snd_soc_dapm_route analog_hp_routes[] = {
1428 {"HPOUTA", NULL, "Analog Playback"},
1429 {"HPOUTB", NULL, "Analog Playback"},
1430};
1431
1432static struct snd_soc_dapm_route all_hp_routes[
1433 ARRAY_SIZE(digital_hp_routes) +
1434 ARRAY_SIZE(analog_hp_routes)];
1435
1436static const unsigned int cs43130_asp_src_rates[] = {
1437 32000, 44100, 48000, 88200, 96000, 176400, 192000, 352800, 384000
1438};
1439
1440static const struct snd_pcm_hw_constraint_list cs43130_asp_constraints = {
1441 .count = ARRAY_SIZE(cs43130_asp_src_rates),
1442 .list = cs43130_asp_src_rates,
1443};
1444
1445static int cs43130_pcm_startup(struct snd_pcm_substream *substream,
1446 struct snd_soc_dai *dai)
1447{
1448 return snd_pcm_hw_constraint_list(substream->runtime, 0,
1449 SNDRV_PCM_HW_PARAM_RATE,
1450 &cs43130_asp_constraints);
1451}
1452
1453static const unsigned int cs43130_dop_src_rates[] = {
1454 176400, 352800,
1455};
1456
1457static const struct snd_pcm_hw_constraint_list cs43130_dop_constraints = {
1458 .count = ARRAY_SIZE(cs43130_dop_src_rates),
1459 .list = cs43130_dop_src_rates,
1460};
1461
1462static int cs43130_dop_startup(struct snd_pcm_substream *substream,
1463 struct snd_soc_dai *dai)
1464{
1465 return snd_pcm_hw_constraint_list(substream->runtime, 0,
1466 SNDRV_PCM_HW_PARAM_RATE,
1467 &cs43130_dop_constraints);
1468}
1469
1470static int cs43130_pcm_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
1471{
1472 struct snd_soc_component *component = codec_dai->component;
1473 struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component);
1474
1475 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
1476 case SND_SOC_DAIFMT_CBS_CFS:
1477 cs43130->dais[codec_dai->id].dai_mode = SND_SOC_DAIFMT_CBS_CFS;
1478 break;
1479 case SND_SOC_DAIFMT_CBM_CFM:
1480 cs43130->dais[codec_dai->id].dai_mode = SND_SOC_DAIFMT_CBM_CFM;
1481 break;
1482 default:
1483 dev_err(component->dev, "unsupported mode\n");
1484 return -EINVAL;
1485 }
1486
1487 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
1488 case SND_SOC_DAIFMT_I2S:
1489 cs43130->dais[codec_dai->id].dai_format = SND_SOC_DAIFMT_I2S;
1490 break;
1491 case SND_SOC_DAIFMT_LEFT_J:
1492 cs43130->dais[codec_dai->id].dai_format = SND_SOC_DAIFMT_LEFT_J;
1493 break;
1494 case SND_SOC_DAIFMT_DSP_A:
1495 cs43130->dais[codec_dai->id].dai_format = SND_SOC_DAIFMT_DSP_A;
1496 break;
1497 case SND_SOC_DAIFMT_DSP_B:
1498 cs43130->dais[codec_dai->id].dai_format = SND_SOC_DAIFMT_DSP_B;
1499 break;
1500 default:
1501 dev_err(component->dev,
1502 "unsupported audio format\n");
1503 return -EINVAL;
1504 }
1505
1506 dev_dbg(component->dev, "dai_id = %d, dai_mode = %u, dai_format = %u\n",
1507 codec_dai->id,
1508 cs43130->dais[codec_dai->id].dai_mode,
1509 cs43130->dais[codec_dai->id].dai_format);
1510
1511 return 0;
1512}
1513
1514static int cs43130_dsd_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
1515{
1516 struct snd_soc_component *component = codec_dai->component;
1517 struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component);
1518
1519 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
1520 case SND_SOC_DAIFMT_CBS_CFS:
1521 cs43130->dais[codec_dai->id].dai_mode = SND_SOC_DAIFMT_CBS_CFS;
1522 break;
1523 case SND_SOC_DAIFMT_CBM_CFM:
1524 cs43130->dais[codec_dai->id].dai_mode = SND_SOC_DAIFMT_CBM_CFM;
1525 break;
1526 default:
1527 dev_err(component->dev, "Unsupported DAI format.\n");
1528 return -EINVAL;
1529 }
1530
1531 dev_dbg(component->dev, "dai_mode = 0x%x\n",
1532 cs43130->dais[codec_dai->id].dai_mode);
1533
1534 return 0;
1535}
1536
1537static int cs43130_set_sysclk(struct snd_soc_dai *codec_dai,
1538 int clk_id, unsigned int freq, int dir)
1539{
1540 struct snd_soc_component *component = codec_dai->component;
1541 struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component);
1542
1543 cs43130->dais[codec_dai->id].sclk = freq;
1544 dev_dbg(component->dev, "dai_id = %d, sclk = %u\n", codec_dai->id,
1545 cs43130->dais[codec_dai->id].sclk);
1546
1547 return 0;
1548}
1549
1550static const struct snd_soc_dai_ops cs43130_pcm_ops = {
1551 .startup = cs43130_pcm_startup,
1552 .hw_params = cs43130_hw_params,
1553 .hw_free = cs43130_hw_free,
1554 .set_sysclk = cs43130_set_sysclk,
1555 .set_fmt = cs43130_pcm_set_fmt,
1556};
1557
1558static const struct snd_soc_dai_ops cs43130_dop_ops = {
1559 .startup = cs43130_dop_startup,
1560 .hw_params = cs43130_hw_params,
1561 .hw_free = cs43130_hw_free,
1562 .set_sysclk = cs43130_set_sysclk,
1563 .set_fmt = cs43130_pcm_set_fmt,
1564};
1565
1566static const struct snd_soc_dai_ops cs43130_dsd_ops = {
1567 .startup = cs43130_dop_startup,
1568 .hw_params = cs43130_dsd_hw_params,
1569 .hw_free = cs43130_hw_free,
1570 .set_fmt = cs43130_dsd_set_fmt,
1571};
1572
1573static struct snd_soc_dai_driver cs43130_dai[] = {
1574 {
1575 .name = "cs43130-asp-pcm",
1576 .id = CS43130_ASP_PCM_DAI,
1577 .playback = {
1578 .stream_name = "ASP PCM Playback",
1579 .channels_min = 1,
1580 .channels_max = 2,
1581 .rates = SNDRV_PCM_RATE_KNOT,
1582 .formats = CS43130_PCM_FORMATS,
1583 },
1584 .ops = &cs43130_pcm_ops,
1585 .symmetric_rate = 1,
1586 },
1587 {
1588 .name = "cs43130-asp-dop",
1589 .id = CS43130_ASP_DOP_DAI,
1590 .playback = {
1591 .stream_name = "ASP DoP Playback",
1592 .channels_min = 1,
1593 .channels_max = 2,
1594 .rates = SNDRV_PCM_RATE_KNOT,
1595 .formats = CS43130_DOP_FORMATS,
1596 },
1597 .ops = &cs43130_dop_ops,
1598 .symmetric_rate = 1,
1599 },
1600 {
1601 .name = "cs43130-xsp-dop",
1602 .id = CS43130_XSP_DOP_DAI,
1603 .playback = {
1604 .stream_name = "XSP DoP Playback",
1605 .channels_min = 1,
1606 .channels_max = 2,
1607 .rates = SNDRV_PCM_RATE_KNOT,
1608 .formats = CS43130_DOP_FORMATS,
1609 },
1610 .ops = &cs43130_dop_ops,
1611 .symmetric_rate = 1,
1612 },
1613 {
1614 .name = "cs43130-xsp-dsd",
1615 .id = CS43130_XSP_DSD_DAI,
1616 .playback = {
1617 .stream_name = "XSP DSD Playback",
1618 .channels_min = 1,
1619 .channels_max = 2,
1620 .rates = SNDRV_PCM_RATE_KNOT,
1621 .formats = CS43130_DOP_FORMATS,
1622 },
1623 .ops = &cs43130_dsd_ops,
1624 },
1625
1626};
1627
1628static int cs43130_component_set_sysclk(struct snd_soc_component *component,
1629 int clk_id, int source, unsigned int freq,
1630 int dir)
1631{
1632 struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component);
1633
1634 dev_dbg(component->dev, "clk_id = %d, source = %d, freq = %d, dir = %d\n",
1635 clk_id, source, freq, dir);
1636
1637 switch (freq) {
1638 case CS43130_MCLK_22M:
1639 case CS43130_MCLK_24M:
1640 cs43130->mclk = freq;
1641 break;
1642 default:
1643 dev_err(component->dev, "Invalid MCLK INT freq: %u\n", freq);
1644 return -EINVAL;
1645 }
1646
1647 if (source == CS43130_MCLK_SRC_EXT) {
1648 cs43130->pll_bypass = true;
1649 } else {
1650 dev_err(component->dev, "Invalid MCLK source\n");
1651 return -EINVAL;
1652 }
1653
1654 return 0;
1655}
1656
1657static inline u16 cs43130_get_ac_reg_val(u16 ac_freq)
1658{
1659 /* AC freq is counted in 5.94Hz step. */
1660 return ac_freq / 6;
1661}
1662
1663static int cs43130_show_dc(struct device *dev, char *buf, u8 ch)
1664{
1665 struct i2c_client *client = to_i2c_client(dev);
1666 struct cs43130_private *cs43130 = i2c_get_clientdata(client);
1667
1668 if (!cs43130->hpload_done)
1669 return scnprintf(buf, PAGE_SIZE, "NO_HPLOAD\n");
1670 else
1671 return scnprintf(buf, PAGE_SIZE, "%u\n",
1672 cs43130->hpload_dc[ch]);
1673}
1674
1675static ssize_t hpload_dc_l_show(struct device *dev,
1676 struct device_attribute *attr, char *buf)
1677{
1678 return cs43130_show_dc(dev, buf, HP_LEFT);
1679}
1680
1681static ssize_t hpload_dc_r_show(struct device *dev,
1682 struct device_attribute *attr, char *buf)
1683{
1684 return cs43130_show_dc(dev, buf, HP_RIGHT);
1685}
1686
1687static u16 const cs43130_ac_freq[CS43130_AC_FREQ] = {
1688 24,
1689 43,
1690 93,
1691 200,
1692 431,
1693 928,
1694 2000,
1695 4309,
1696 9283,
1697 20000,
1698};
1699
1700static int cs43130_show_ac(struct device *dev, char *buf, u8 ch)
1701{
1702 int i, j = 0, tmp;
1703 struct i2c_client *client = to_i2c_client(dev);
1704 struct cs43130_private *cs43130 = i2c_get_clientdata(client);
1705
1706 if (cs43130->hpload_done && cs43130->ac_meas) {
1707 for (i = 0; i < ARRAY_SIZE(cs43130_ac_freq); i++) {
1708 tmp = scnprintf(buf + j, PAGE_SIZE - j, "%u\n",
1709 cs43130->hpload_ac[i][ch]);
1710 if (!tmp)
1711 break;
1712
1713 j += tmp;
1714 }
1715
1716 return j;
1717 } else {
1718 return scnprintf(buf, PAGE_SIZE, "NO_HPLOAD\n");
1719 }
1720}
1721
1722static ssize_t hpload_ac_l_show(struct device *dev,
1723 struct device_attribute *attr, char *buf)
1724{
1725 return cs43130_show_ac(dev, buf, HP_LEFT);
1726}
1727
1728static ssize_t hpload_ac_r_show(struct device *dev,
1729 struct device_attribute *attr, char *buf)
1730{
1731 return cs43130_show_ac(dev, buf, HP_RIGHT);
1732}
1733
1734static DEVICE_ATTR_RO(hpload_dc_l);
1735static DEVICE_ATTR_RO(hpload_dc_r);
1736static DEVICE_ATTR_RO(hpload_ac_l);
1737static DEVICE_ATTR_RO(hpload_ac_r);
1738
1739static struct attribute *hpload_attrs[] = {
1740 &dev_attr_hpload_dc_l.attr,
1741 &dev_attr_hpload_dc_r.attr,
1742 &dev_attr_hpload_ac_l.attr,
1743 &dev_attr_hpload_ac_r.attr,
1744};
1745ATTRIBUTE_GROUPS(hpload);
1746
1747static struct reg_sequence hp_en_cal_seq[] = {
1748 {CS43130_INT_MASK_4, CS43130_INT_MASK_ALL},
1749 {CS43130_HP_MEAS_LOAD_1, 0},
1750 {CS43130_HP_MEAS_LOAD_2, 0},
1751 {CS43130_INT_MASK_4, 0},
1752 {CS43130_DXD1, 0x99},
1753 {CS43130_DXD16, 0xBB},
1754 {CS43130_DXD12, 0x01},
1755 {CS43130_DXD19, 0xCB},
1756 {CS43130_DXD17, 0x95},
1757 {CS43130_DXD18, 0x0B},
1758 {CS43130_DXD1, 0},
1759 {CS43130_HP_LOAD_1, 0x80},
1760};
1761
1762static struct reg_sequence hp_en_cal_seq2[] = {
1763 {CS43130_INT_MASK_4, CS43130_INT_MASK_ALL},
1764 {CS43130_HP_MEAS_LOAD_1, 0},
1765 {CS43130_HP_MEAS_LOAD_2, 0},
1766 {CS43130_INT_MASK_4, 0},
1767 {CS43130_HP_LOAD_1, 0x80},
1768};
1769
1770static struct reg_sequence hp_dis_cal_seq[] = {
1771 {CS43130_HP_LOAD_1, 0x80},
1772 {CS43130_DXD1, 0x99},
1773 {CS43130_DXD12, 0},
1774 {CS43130_DXD1, 0},
1775 {CS43130_HP_LOAD_1, 0},
1776};
1777
1778static struct reg_sequence hp_dis_cal_seq2[] = {
1779 {CS43130_HP_LOAD_1, 0x80},
1780 {CS43130_HP_LOAD_1, 0},
1781};
1782
1783static struct reg_sequence hp_dc_ch_l_seq[] = {
1784 {CS43130_DXD1, 0x99},
1785 {CS43130_DXD19, 0x0A},
1786 {CS43130_DXD17, 0x93},
1787 {CS43130_DXD18, 0x0A},
1788 {CS43130_DXD1, 0},
1789 {CS43130_HP_LOAD_1, 0x80},
1790 {CS43130_HP_LOAD_1, 0x81},
1791};
1792
1793static struct reg_sequence hp_dc_ch_l_seq2[] = {
1794 {CS43130_HP_LOAD_1, 0x80},
1795 {CS43130_HP_LOAD_1, 0x81},
1796};
1797
1798static struct reg_sequence hp_dc_ch_r_seq[] = {
1799 {CS43130_DXD1, 0x99},
1800 {CS43130_DXD19, 0x8A},
1801 {CS43130_DXD17, 0x15},
1802 {CS43130_DXD18, 0x06},
1803 {CS43130_DXD1, 0},
1804 {CS43130_HP_LOAD_1, 0x90},
1805 {CS43130_HP_LOAD_1, 0x91},
1806};
1807
1808static struct reg_sequence hp_dc_ch_r_seq2[] = {
1809 {CS43130_HP_LOAD_1, 0x90},
1810 {CS43130_HP_LOAD_1, 0x91},
1811};
1812
1813static struct reg_sequence hp_ac_ch_l_seq[] = {
1814 {CS43130_DXD1, 0x99},
1815 {CS43130_DXD19, 0x0A},
1816 {CS43130_DXD17, 0x93},
1817 {CS43130_DXD18, 0x0A},
1818 {CS43130_DXD1, 0},
1819 {CS43130_HP_LOAD_1, 0x80},
1820 {CS43130_HP_LOAD_1, 0x82},
1821};
1822
1823static struct reg_sequence hp_ac_ch_l_seq2[] = {
1824 {CS43130_HP_LOAD_1, 0x80},
1825 {CS43130_HP_LOAD_1, 0x82},
1826};
1827
1828static struct reg_sequence hp_ac_ch_r_seq[] = {
1829 {CS43130_DXD1, 0x99},
1830 {CS43130_DXD19, 0x8A},
1831 {CS43130_DXD17, 0x15},
1832 {CS43130_DXD18, 0x06},
1833 {CS43130_DXD1, 0},
1834 {CS43130_HP_LOAD_1, 0x90},
1835 {CS43130_HP_LOAD_1, 0x92},
1836};
1837
1838static struct reg_sequence hp_ac_ch_r_seq2[] = {
1839 {CS43130_HP_LOAD_1, 0x90},
1840 {CS43130_HP_LOAD_1, 0x92},
1841};
1842
1843static struct reg_sequence hp_cln_seq[] = {
1844 {CS43130_INT_MASK_4, CS43130_INT_MASK_ALL},
1845 {CS43130_HP_MEAS_LOAD_1, 0},
1846 {CS43130_HP_MEAS_LOAD_2, 0},
1847};
1848
1849struct reg_sequences {
1850 struct reg_sequence *seq;
1851 int size;
1852 unsigned int msk;
1853};
1854
1855static struct reg_sequences hpload_seq1[] = {
1856 {
1857 .seq = hp_en_cal_seq,
1858 .size = ARRAY_SIZE(hp_en_cal_seq),
1859 .msk = CS43130_HPLOAD_ON_INT,
1860 },
1861 {
1862 .seq = hp_dc_ch_l_seq,
1863 .size = ARRAY_SIZE(hp_dc_ch_l_seq),
1864 .msk = CS43130_HPLOAD_DC_INT,
1865 },
1866 {
1867 .seq = hp_ac_ch_l_seq,
1868 .size = ARRAY_SIZE(hp_ac_ch_l_seq),
1869 .msk = CS43130_HPLOAD_AC_INT,
1870 },
1871 {
1872 .seq = hp_dis_cal_seq,
1873 .size = ARRAY_SIZE(hp_dis_cal_seq),
1874 .msk = CS43130_HPLOAD_OFF_INT,
1875 },
1876 {
1877 .seq = hp_en_cal_seq,
1878 .size = ARRAY_SIZE(hp_en_cal_seq),
1879 .msk = CS43130_HPLOAD_ON_INT,
1880 },
1881 {
1882 .seq = hp_dc_ch_r_seq,
1883 .size = ARRAY_SIZE(hp_dc_ch_r_seq),
1884 .msk = CS43130_HPLOAD_DC_INT,
1885 },
1886 {
1887 .seq = hp_ac_ch_r_seq,
1888 .size = ARRAY_SIZE(hp_ac_ch_r_seq),
1889 .msk = CS43130_HPLOAD_AC_INT,
1890 },
1891};
1892
1893static struct reg_sequences hpload_seq2[] = {
1894 {
1895 .seq = hp_en_cal_seq2,
1896 .size = ARRAY_SIZE(hp_en_cal_seq2),
1897 .msk = CS43130_HPLOAD_ON_INT,
1898 },
1899 {
1900 .seq = hp_dc_ch_l_seq2,
1901 .size = ARRAY_SIZE(hp_dc_ch_l_seq2),
1902 .msk = CS43130_HPLOAD_DC_INT,
1903 },
1904 {
1905 .seq = hp_ac_ch_l_seq2,
1906 .size = ARRAY_SIZE(hp_ac_ch_l_seq2),
1907 .msk = CS43130_HPLOAD_AC_INT,
1908 },
1909 {
1910 .seq = hp_dis_cal_seq2,
1911 .size = ARRAY_SIZE(hp_dis_cal_seq2),
1912 .msk = CS43130_HPLOAD_OFF_INT,
1913 },
1914 {
1915 .seq = hp_en_cal_seq2,
1916 .size = ARRAY_SIZE(hp_en_cal_seq2),
1917 .msk = CS43130_HPLOAD_ON_INT,
1918 },
1919 {
1920 .seq = hp_dc_ch_r_seq2,
1921 .size = ARRAY_SIZE(hp_dc_ch_r_seq2),
1922 .msk = CS43130_HPLOAD_DC_INT,
1923 },
1924 {
1925 .seq = hp_ac_ch_r_seq2,
1926 .size = ARRAY_SIZE(hp_ac_ch_r_seq2),
1927 .msk = CS43130_HPLOAD_AC_INT,
1928 },
1929};
1930
1931static int cs43130_update_hpload(unsigned int msk, int ac_idx,
1932 struct cs43130_private *cs43130)
1933{
1934 bool left_ch = true;
1935 unsigned int reg;
1936 u32 addr;
1937 u16 impedance;
1938 struct snd_soc_component *component = cs43130->component;
1939
1940 switch (msk) {
1941 case CS43130_HPLOAD_DC_INT:
1942 case CS43130_HPLOAD_AC_INT:
1943 break;
1944 default:
1945 return 0;
1946 }
1947
1948 regmap_read(cs43130->regmap, CS43130_HP_LOAD_1, ®);
1949 if (reg & CS43130_HPLOAD_CHN_SEL)
1950 left_ch = false;
1951
1952 if (msk == CS43130_HPLOAD_DC_INT)
1953 addr = CS43130_HP_DC_STAT_1;
1954 else
1955 addr = CS43130_HP_AC_STAT_1;
1956
1957 regmap_read(cs43130->regmap, addr, ®);
1958 impedance = reg >> 3;
1959 regmap_read(cs43130->regmap, addr + 1, ®);
1960 impedance |= reg << 5;
1961
1962 if (msk == CS43130_HPLOAD_DC_INT) {
1963 if (left_ch)
1964 cs43130->hpload_dc[HP_LEFT] = impedance;
1965 else
1966 cs43130->hpload_dc[HP_RIGHT] = impedance;
1967
1968 dev_dbg(component->dev, "HP DC impedance (Ch %u): %u\n", !left_ch,
1969 impedance);
1970 } else {
1971 if (left_ch)
1972 cs43130->hpload_ac[ac_idx][HP_LEFT] = impedance;
1973 else
1974 cs43130->hpload_ac[ac_idx][HP_RIGHT] = impedance;
1975
1976 dev_dbg(component->dev, "HP AC (%u Hz) impedance (Ch %u): %u\n",
1977 cs43130->ac_freq[ac_idx], !left_ch, impedance);
1978 }
1979
1980 return 0;
1981}
1982
1983static int cs43130_hpload_proc(struct cs43130_private *cs43130,
1984 struct reg_sequence *seq, int seq_size,
1985 unsigned int rslt_msk, int ac_idx)
1986{
1987 int ret;
1988 unsigned int msk;
1989 u16 ac_reg_val;
1990 struct snd_soc_component *component = cs43130->component;
1991
1992 reinit_completion(&cs43130->hpload_evt);
1993
1994 if (rslt_msk == CS43130_HPLOAD_AC_INT) {
1995 ac_reg_val = cs43130_get_ac_reg_val(cs43130->ac_freq[ac_idx]);
1996 regmap_update_bits(cs43130->regmap, CS43130_HP_LOAD_1,
1997 CS43130_HPLOAD_AC_START, 0);
1998 regmap_update_bits(cs43130->regmap, CS43130_HP_MEAS_LOAD_1,
1999 CS43130_HP_MEAS_LOAD_MASK,
2000 ac_reg_val >> CS43130_HP_MEAS_LOAD_1_SHIFT);
2001 regmap_update_bits(cs43130->regmap, CS43130_HP_MEAS_LOAD_2,
2002 CS43130_HP_MEAS_LOAD_MASK,
2003 ac_reg_val >> CS43130_HP_MEAS_LOAD_2_SHIFT);
2004 }
2005
2006 regmap_multi_reg_write(cs43130->regmap, seq,
2007 seq_size);
2008
2009 ret = wait_for_completion_timeout(&cs43130->hpload_evt,
2010 msecs_to_jiffies(1000));
2011 regmap_read(cs43130->regmap, CS43130_INT_MASK_4, &msk);
2012 if (!ret) {
2013 dev_err(component->dev, "Timeout waiting for HPLOAD interrupt\n");
2014 return -1;
2015 }
2016
2017 dev_dbg(component->dev, "HP load stat: %x, INT_MASK_4: %x\n",
2018 cs43130->hpload_stat, msk);
2019 if ((cs43130->hpload_stat & (CS43130_HPLOAD_NO_DC_INT |
2020 CS43130_HPLOAD_UNPLUG_INT |
2021 CS43130_HPLOAD_OOR_INT)) ||
2022 !(cs43130->hpload_stat & rslt_msk)) {
2023 dev_dbg(component->dev, "HP load measure failed\n");
2024 return -1;
2025 }
2026
2027 return 0;
2028}
2029
2030static const struct reg_sequence hv_seq[][2] = {
2031 {
2032 {CS43130_CLASS_H_CTL, 0x1C},
2033 {CS43130_HP_OUT_CTL_1, 0x10},
2034 },
2035 {
2036 {CS43130_CLASS_H_CTL, 0x1E},
2037 {CS43130_HP_OUT_CTL_1, 0x20},
2038 },
2039 {
2040 {CS43130_CLASS_H_CTL, 0x1E},
2041 {CS43130_HP_OUT_CTL_1, 0x30},
2042 },
2043};
2044
2045static int cs43130_set_hv(struct regmap *regmap, u16 hpload_dc,
2046 const u16 *dc_threshold)
2047{
2048 int i;
2049
2050 for (i = 0; i < CS43130_DC_THRESHOLD; i++) {
2051 if (hpload_dc <= dc_threshold[i])
2052 break;
2053 }
2054
2055 regmap_multi_reg_write(regmap, hv_seq[i], ARRAY_SIZE(hv_seq[i]));
2056
2057 return 0;
2058}
2059
2060static void cs43130_imp_meas(struct work_struct *wk)
2061{
2062 unsigned int reg, seq_size;
2063 int i, ret, ac_idx;
2064 struct cs43130_private *cs43130;
2065 struct snd_soc_component *component;
2066 struct reg_sequences *hpload_seq;
2067
2068 cs43130 = container_of(wk, struct cs43130_private, work);
2069 component = cs43130->component;
2070
2071 if (!cs43130->mclk)
2072 return;
2073
2074 cs43130->hpload_done = false;
2075
2076 mutex_lock(&cs43130->clk_mutex);
2077 if (!cs43130->clk_req) {
2078 /* clk not in use */
2079 cs43130_set_pll(component, 0, 0, cs43130->mclk, CS43130_MCLK_22M);
2080 if (cs43130->pll_bypass)
2081 cs43130_change_clksrc(component, CS43130_MCLK_SRC_EXT);
2082 else
2083 cs43130_change_clksrc(component, CS43130_MCLK_SRC_PLL);
2084 }
2085
2086 cs43130->clk_req++;
2087 mutex_unlock(&cs43130->clk_mutex);
2088
2089 regmap_read(cs43130->regmap, CS43130_INT_STATUS_4, ®);
2090
2091 switch (cs43130->dev_id) {
2092 case CS43130_CHIP_ID:
2093 hpload_seq = hpload_seq1;
2094 seq_size = ARRAY_SIZE(hpload_seq1);
2095 break;
2096 case CS43131_CHIP_ID:
2097 hpload_seq = hpload_seq2;
2098 seq_size = ARRAY_SIZE(hpload_seq2);
2099 break;
2100 default:
2101 WARN(1, "Invalid dev_id for meas: %d", cs43130->dev_id);
2102 return;
2103 }
2104
2105 i = 0;
2106 ac_idx = 0;
2107 while (i < seq_size) {
2108 ret = cs43130_hpload_proc(cs43130, hpload_seq[i].seq,
2109 hpload_seq[i].size,
2110 hpload_seq[i].msk, ac_idx);
2111 if (ret < 0)
2112 goto exit;
2113
2114 cs43130_update_hpload(hpload_seq[i].msk, ac_idx, cs43130);
2115
2116 if (cs43130->ac_meas &&
2117 hpload_seq[i].msk == CS43130_HPLOAD_AC_INT &&
2118 ac_idx < CS43130_AC_FREQ - 1) {
2119 ac_idx++;
2120 } else {
2121 ac_idx = 0;
2122 i++;
2123 }
2124 }
2125 cs43130->hpload_done = true;
2126
2127 if (cs43130->hpload_dc[HP_LEFT] >= CS43130_LINEOUT_LOAD)
2128 snd_soc_jack_report(&cs43130->jack, CS43130_JACK_LINEOUT,
2129 CS43130_JACK_MASK);
2130 else
2131 snd_soc_jack_report(&cs43130->jack, CS43130_JACK_HEADPHONE,
2132 CS43130_JACK_MASK);
2133
2134 dev_dbg(component->dev, "Set HP output control. DC threshold\n");
2135 for (i = 0; i < CS43130_DC_THRESHOLD; i++)
2136 dev_dbg(component->dev, "DC threshold[%d]: %u.\n", i,
2137 cs43130->dc_threshold[i]);
2138
2139 cs43130_set_hv(cs43130->regmap, cs43130->hpload_dc[HP_LEFT],
2140 cs43130->dc_threshold);
2141
2142exit:
2143 switch (cs43130->dev_id) {
2144 case CS43130_CHIP_ID:
2145 cs43130_hpload_proc(cs43130, hp_dis_cal_seq,
2146 ARRAY_SIZE(hp_dis_cal_seq),
2147 CS43130_HPLOAD_OFF_INT, ac_idx);
2148 break;
2149 case CS43131_CHIP_ID:
2150 cs43130_hpload_proc(cs43130, hp_dis_cal_seq2,
2151 ARRAY_SIZE(hp_dis_cal_seq2),
2152 CS43130_HPLOAD_OFF_INT, ac_idx);
2153 break;
2154 }
2155
2156 regmap_multi_reg_write(cs43130->regmap, hp_cln_seq,
2157 ARRAY_SIZE(hp_cln_seq));
2158
2159 mutex_lock(&cs43130->clk_mutex);
2160 cs43130->clk_req--;
2161 /* clk not in use */
2162 if (!cs43130->clk_req)
2163 cs43130_change_clksrc(component, CS43130_MCLK_SRC_RCO);
2164 mutex_unlock(&cs43130->clk_mutex);
2165}
2166
2167static irqreturn_t cs43130_irq_thread(int irq, void *data)
2168{
2169 struct cs43130_private *cs43130 = (struct cs43130_private *)data;
2170 struct snd_soc_component *component = cs43130->component;
2171 unsigned int stickies[CS43130_NUM_INT];
2172 unsigned int irq_occurrence = 0;
2173 unsigned int masks[CS43130_NUM_INT];
2174 int i, j;
2175
2176 for (i = 0; i < ARRAY_SIZE(stickies); i++) {
2177 regmap_read(cs43130->regmap, CS43130_INT_STATUS_1 + i,
2178 &stickies[i]);
2179 regmap_read(cs43130->regmap, CS43130_INT_MASK_1 + i,
2180 &masks[i]);
2181 }
2182
2183 for (i = 0; i < ARRAY_SIZE(stickies); i++) {
2184 stickies[i] = stickies[i] & (~masks[i]);
2185 for (j = 0; j < 8; j++)
2186 irq_occurrence += (stickies[i] >> j) & 1;
2187 }
2188 dev_dbg(component->dev, "number of interrupts occurred (%u)\n",
2189 irq_occurrence);
2190
2191 if (!irq_occurrence)
2192 return IRQ_NONE;
2193
2194 if (stickies[0] & CS43130_XTAL_RDY_INT) {
2195 complete(&cs43130->xtal_rdy);
2196 return IRQ_HANDLED;
2197 }
2198
2199 if (stickies[0] & CS43130_PLL_RDY_INT) {
2200 complete(&cs43130->pll_rdy);
2201 return IRQ_HANDLED;
2202 }
2203
2204 if (stickies[3] & CS43130_HPLOAD_NO_DC_INT) {
2205 cs43130->hpload_stat = stickies[3];
2206 dev_err(component->dev,
2207 "DC load has not completed before AC load (%x)\n",
2208 cs43130->hpload_stat);
2209 complete(&cs43130->hpload_evt);
2210 return IRQ_HANDLED;
2211 }
2212
2213 if (stickies[3] & CS43130_HPLOAD_UNPLUG_INT) {
2214 cs43130->hpload_stat = stickies[3];
2215 dev_err(component->dev, "HP unplugged during measurement (%x)\n",
2216 cs43130->hpload_stat);
2217 complete(&cs43130->hpload_evt);
2218 return IRQ_HANDLED;
2219 }
2220
2221 if (stickies[3] & CS43130_HPLOAD_OOR_INT) {
2222 cs43130->hpload_stat = stickies[3];
2223 dev_err(component->dev, "HP load out of range (%x)\n",
2224 cs43130->hpload_stat);
2225 complete(&cs43130->hpload_evt);
2226 return IRQ_HANDLED;
2227 }
2228
2229 if (stickies[3] & CS43130_HPLOAD_AC_INT) {
2230 cs43130->hpload_stat = stickies[3];
2231 dev_dbg(component->dev, "HP AC load measurement done (%x)\n",
2232 cs43130->hpload_stat);
2233 complete(&cs43130->hpload_evt);
2234 return IRQ_HANDLED;
2235 }
2236
2237 if (stickies[3] & CS43130_HPLOAD_DC_INT) {
2238 cs43130->hpload_stat = stickies[3];
2239 dev_dbg(component->dev, "HP DC load measurement done (%x)\n",
2240 cs43130->hpload_stat);
2241 complete(&cs43130->hpload_evt);
2242 return IRQ_HANDLED;
2243 }
2244
2245 if (stickies[3] & CS43130_HPLOAD_ON_INT) {
2246 cs43130->hpload_stat = stickies[3];
2247 dev_dbg(component->dev, "HP load state machine on done (%x)\n",
2248 cs43130->hpload_stat);
2249 complete(&cs43130->hpload_evt);
2250 return IRQ_HANDLED;
2251 }
2252
2253 if (stickies[3] & CS43130_HPLOAD_OFF_INT) {
2254 cs43130->hpload_stat = stickies[3];
2255 dev_dbg(component->dev, "HP load state machine off done (%x)\n",
2256 cs43130->hpload_stat);
2257 complete(&cs43130->hpload_evt);
2258 return IRQ_HANDLED;
2259 }
2260
2261 if (stickies[0] & CS43130_XTAL_ERR_INT) {
2262 dev_err(component->dev, "Crystal err: clock is not running\n");
2263 return IRQ_HANDLED;
2264 }
2265
2266 if (stickies[0] & CS43130_HP_UNPLUG_INT) {
2267 dev_dbg(component->dev, "HP unplugged\n");
2268 cs43130->hpload_done = false;
2269 snd_soc_jack_report(&cs43130->jack, 0, CS43130_JACK_MASK);
2270 return IRQ_HANDLED;
2271 }
2272
2273 if (stickies[0] & CS43130_HP_PLUG_INT) {
2274 if (cs43130->dc_meas && !cs43130->hpload_done &&
2275 !work_busy(&cs43130->work)) {
2276 dev_dbg(component->dev, "HP load queue work\n");
2277 queue_work(cs43130->wq, &cs43130->work);
2278 }
2279
2280 snd_soc_jack_report(&cs43130->jack, SND_JACK_MECHANICAL,
2281 CS43130_JACK_MASK);
2282 return IRQ_HANDLED;
2283 }
2284
2285 return IRQ_NONE;
2286}
2287
2288static int cs43130_probe(struct snd_soc_component *component)
2289{
2290 int ret;
2291 struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component);
2292 struct snd_soc_card *card = component->card;
2293 unsigned int reg;
2294
2295 cs43130->component = component;
2296
2297 if (cs43130->xtal_ibias != CS43130_XTAL_UNUSED) {
2298 regmap_update_bits(cs43130->regmap, CS43130_CRYSTAL_SET,
2299 CS43130_XTAL_IBIAS_MASK,
2300 cs43130->xtal_ibias);
2301 regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1,
2302 CS43130_XTAL_ERR_INT, 0);
2303 }
2304
2305 ret = snd_soc_card_jack_new(card, "Headphone", CS43130_JACK_MASK,
2306 &cs43130->jack, NULL, 0);
2307 if (ret < 0) {
2308 dev_err(component->dev, "Cannot create jack\n");
2309 return ret;
2310 }
2311
2312 cs43130->hpload_done = false;
2313 if (cs43130->dc_meas) {
2314 ret = sysfs_create_groups(&component->dev->kobj, hpload_groups);
2315 if (ret)
2316 return ret;
2317
2318 cs43130->wq = create_singlethread_workqueue("cs43130_hp");
2319 if (!cs43130->wq) {
2320 sysfs_remove_groups(&component->dev->kobj, hpload_groups);
2321 return -ENOMEM;
2322 }
2323 INIT_WORK(&cs43130->work, cs43130_imp_meas);
2324 }
2325
2326 regmap_read(cs43130->regmap, CS43130_INT_STATUS_1, ®);
2327 regmap_read(cs43130->regmap, CS43130_HP_STATUS, ®);
2328 regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1,
2329 CS43130_HP_PLUG_INT | CS43130_HP_UNPLUG_INT, 0);
2330 regmap_update_bits(cs43130->regmap, CS43130_HP_DETECT,
2331 CS43130_HP_DETECT_CTRL_MASK, 0);
2332 regmap_update_bits(cs43130->regmap, CS43130_HP_DETECT,
2333 CS43130_HP_DETECT_CTRL_MASK,
2334 CS43130_HP_DETECT_CTRL_MASK);
2335
2336 return 0;
2337}
2338
2339static struct snd_soc_component_driver soc_component_dev_cs43130 = {
2340 .probe = cs43130_probe,
2341 .controls = cs43130_snd_controls,
2342 .num_controls = ARRAY_SIZE(cs43130_snd_controls),
2343 .set_sysclk = cs43130_component_set_sysclk,
2344 .set_pll = cs43130_set_pll,
2345 .idle_bias_on = 1,
2346 .use_pmdown_time = 1,
2347 .endianness = 1,
2348 .non_legacy_dai_naming = 1,
2349};
2350
2351static const struct regmap_config cs43130_regmap = {
2352 .reg_bits = 24,
2353 .pad_bits = 8,
2354 .val_bits = 8,
2355
2356 .max_register = CS43130_LASTREG,
2357 .reg_defaults = cs43130_reg_defaults,
2358 .num_reg_defaults = ARRAY_SIZE(cs43130_reg_defaults),
2359 .readable_reg = cs43130_readable_register,
2360 .precious_reg = cs43130_precious_register,
2361 .volatile_reg = cs43130_volatile_register,
2362 .cache_type = REGCACHE_RBTREE,
2363 /* needed for regcache_sync */
2364 .use_single_read = true,
2365 .use_single_write = true,
2366};
2367
2368static u16 const cs43130_dc_threshold[CS43130_DC_THRESHOLD] = {
2369 50,
2370 120,
2371};
2372
2373static int cs43130_handle_device_data(struct i2c_client *i2c_client,
2374 struct cs43130_private *cs43130)
2375{
2376 struct device_node *np = i2c_client->dev.of_node;
2377 unsigned int val;
2378 int i;
2379
2380 if (of_property_read_u32(np, "cirrus,xtal-ibias", &val) < 0) {
2381 /* Crystal is unused. System clock is used for external MCLK */
2382 cs43130->xtal_ibias = CS43130_XTAL_UNUSED;
2383 return 0;
2384 }
2385
2386 switch (val) {
2387 case 1:
2388 cs43130->xtal_ibias = CS43130_XTAL_IBIAS_7_5UA;
2389 break;
2390 case 2:
2391 cs43130->xtal_ibias = CS43130_XTAL_IBIAS_12_5UA;
2392 break;
2393 case 3:
2394 cs43130->xtal_ibias = CS43130_XTAL_IBIAS_15UA;
2395 break;
2396 default:
2397 dev_err(&i2c_client->dev,
2398 "Invalid cirrus,xtal-ibias value: %d\n", val);
2399 return -EINVAL;
2400 }
2401
2402 cs43130->dc_meas = of_property_read_bool(np, "cirrus,dc-measure");
2403 cs43130->ac_meas = of_property_read_bool(np, "cirrus,ac-measure");
2404
2405 if (of_property_read_u16_array(np, "cirrus,ac-freq", cs43130->ac_freq,
2406 CS43130_AC_FREQ) < 0) {
2407 for (i = 0; i < CS43130_AC_FREQ; i++)
2408 cs43130->ac_freq[i] = cs43130_ac_freq[i];
2409 }
2410
2411 if (of_property_read_u16_array(np, "cirrus,dc-threshold",
2412 cs43130->dc_threshold,
2413 CS43130_DC_THRESHOLD) < 0) {
2414 for (i = 0; i < CS43130_DC_THRESHOLD; i++)
2415 cs43130->dc_threshold[i] = cs43130_dc_threshold[i];
2416 }
2417
2418 return 0;
2419}
2420
2421static int cs43130_i2c_probe(struct i2c_client *client,
2422 const struct i2c_device_id *id)
2423{
2424 struct cs43130_private *cs43130;
2425 int ret;
2426 unsigned int reg;
2427 int i, devid;
2428
2429 cs43130 = devm_kzalloc(&client->dev, sizeof(*cs43130), GFP_KERNEL);
2430 if (!cs43130)
2431 return -ENOMEM;
2432
2433 i2c_set_clientdata(client, cs43130);
2434
2435 cs43130->regmap = devm_regmap_init_i2c(client, &cs43130_regmap);
2436 if (IS_ERR(cs43130->regmap)) {
2437 ret = PTR_ERR(cs43130->regmap);
2438 return ret;
2439 }
2440
2441 if (client->dev.of_node) {
2442 ret = cs43130_handle_device_data(client, cs43130);
2443 if (ret != 0)
2444 return ret;
2445 }
2446 for (i = 0; i < ARRAY_SIZE(cs43130->supplies); i++)
2447 cs43130->supplies[i].supply = cs43130_supply_names[i];
2448
2449 ret = devm_regulator_bulk_get(&client->dev,
2450 ARRAY_SIZE(cs43130->supplies),
2451 cs43130->supplies);
2452 if (ret != 0) {
2453 dev_err(&client->dev, "Failed to request supplies: %d\n", ret);
2454 return ret;
2455 }
2456 ret = regulator_bulk_enable(ARRAY_SIZE(cs43130->supplies),
2457 cs43130->supplies);
2458 if (ret != 0) {
2459 dev_err(&client->dev, "Failed to enable supplies: %d\n", ret);
2460 return ret;
2461 }
2462
2463 cs43130->reset_gpio = devm_gpiod_get_optional(&client->dev,
2464 "reset", GPIOD_OUT_LOW);
2465 if (IS_ERR(cs43130->reset_gpio)) {
2466 ret = PTR_ERR(cs43130->reset_gpio);
2467 goto err_supplies;
2468 }
2469
2470 gpiod_set_value_cansleep(cs43130->reset_gpio, 1);
2471
2472 usleep_range(2000, 2050);
2473
2474 devid = cirrus_read_device_id(cs43130->regmap, CS43130_DEVID_AB);
2475 if (devid < 0) {
2476 ret = devid;
2477 dev_err(&client->dev, "Failed to read device ID: %d\n", ret);
2478 goto err;
2479 }
2480
2481 switch (devid) {
2482 case CS43130_CHIP_ID:
2483 case CS4399_CHIP_ID:
2484 case CS43131_CHIP_ID:
2485 case CS43198_CHIP_ID:
2486 break;
2487 default:
2488 dev_err(&client->dev,
2489 "CS43130 Device ID %X. Expected ID %X, %X, %X or %X\n",
2490 devid, CS43130_CHIP_ID, CS4399_CHIP_ID,
2491 CS43131_CHIP_ID, CS43198_CHIP_ID);
2492 ret = -ENODEV;
2493 goto err;
2494 }
2495
2496 cs43130->dev_id = devid;
2497 ret = regmap_read(cs43130->regmap, CS43130_REV_ID, ®);
2498 if (ret < 0) {
2499 dev_err(&client->dev, "Get Revision ID failed\n");
2500 goto err;
2501 }
2502
2503 dev_info(&client->dev,
2504 "Cirrus Logic CS43130 (%x), Revision: %02X\n", devid,
2505 reg & 0xFF);
2506
2507 mutex_init(&cs43130->clk_mutex);
2508
2509 init_completion(&cs43130->xtal_rdy);
2510 init_completion(&cs43130->pll_rdy);
2511 init_completion(&cs43130->hpload_evt);
2512
2513 ret = devm_request_threaded_irq(&client->dev, client->irq,
2514 NULL, cs43130_irq_thread,
2515 IRQF_ONESHOT | IRQF_TRIGGER_LOW,
2516 "cs43130", cs43130);
2517 if (ret != 0) {
2518 dev_err(&client->dev, "Failed to request IRQ: %d\n", ret);
2519 goto err;
2520 }
2521
2522 cs43130->mclk_int_src = CS43130_MCLK_SRC_RCO;
2523
2524 pm_runtime_set_autosuspend_delay(&client->dev, 100);
2525 pm_runtime_use_autosuspend(&client->dev);
2526 pm_runtime_set_active(&client->dev);
2527 pm_runtime_enable(&client->dev);
2528
2529 switch (cs43130->dev_id) {
2530 case CS43130_CHIP_ID:
2531 case CS43131_CHIP_ID:
2532 memcpy(all_hp_widgets, digital_hp_widgets,
2533 sizeof(digital_hp_widgets));
2534 memcpy(all_hp_widgets + ARRAY_SIZE(digital_hp_widgets),
2535 analog_hp_widgets, sizeof(analog_hp_widgets));
2536 memcpy(all_hp_routes, digital_hp_routes,
2537 sizeof(digital_hp_routes));
2538 memcpy(all_hp_routes + ARRAY_SIZE(digital_hp_routes),
2539 analog_hp_routes, sizeof(analog_hp_routes));
2540
2541 soc_component_dev_cs43130.dapm_widgets =
2542 all_hp_widgets;
2543 soc_component_dev_cs43130.num_dapm_widgets =
2544 ARRAY_SIZE(all_hp_widgets);
2545 soc_component_dev_cs43130.dapm_routes =
2546 all_hp_routes;
2547 soc_component_dev_cs43130.num_dapm_routes =
2548 ARRAY_SIZE(all_hp_routes);
2549 break;
2550 case CS43198_CHIP_ID:
2551 case CS4399_CHIP_ID:
2552 soc_component_dev_cs43130.dapm_widgets =
2553 digital_hp_widgets;
2554 soc_component_dev_cs43130.num_dapm_widgets =
2555 ARRAY_SIZE(digital_hp_widgets);
2556 soc_component_dev_cs43130.dapm_routes =
2557 digital_hp_routes;
2558 soc_component_dev_cs43130.num_dapm_routes =
2559 ARRAY_SIZE(digital_hp_routes);
2560 break;
2561 }
2562
2563 ret = devm_snd_soc_register_component(&client->dev,
2564 &soc_component_dev_cs43130,
2565 cs43130_dai, ARRAY_SIZE(cs43130_dai));
2566 if (ret < 0) {
2567 dev_err(&client->dev,
2568 "snd_soc_register_component failed with ret = %d\n", ret);
2569 goto err;
2570 }
2571
2572 regmap_update_bits(cs43130->regmap, CS43130_PAD_INT_CFG,
2573 CS43130_ASP_3ST_MASK, 0);
2574 regmap_update_bits(cs43130->regmap, CS43130_PAD_INT_CFG,
2575 CS43130_XSP_3ST_MASK, 0);
2576
2577 return 0;
2578
2579err:
2580 gpiod_set_value_cansleep(cs43130->reset_gpio, 0);
2581err_supplies:
2582 regulator_bulk_disable(ARRAY_SIZE(cs43130->supplies),
2583 cs43130->supplies);
2584
2585 return ret;
2586}
2587
2588static int cs43130_i2c_remove(struct i2c_client *client)
2589{
2590 struct cs43130_private *cs43130 = i2c_get_clientdata(client);
2591
2592 if (cs43130->xtal_ibias != CS43130_XTAL_UNUSED)
2593 regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1,
2594 CS43130_XTAL_ERR_INT,
2595 1 << CS43130_XTAL_ERR_INT_SHIFT);
2596
2597 regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1,
2598 CS43130_HP_PLUG_INT | CS43130_HP_UNPLUG_INT,
2599 CS43130_HP_PLUG_INT | CS43130_HP_UNPLUG_INT);
2600
2601 if (cs43130->dc_meas) {
2602 cancel_work_sync(&cs43130->work);
2603 flush_workqueue(cs43130->wq);
2604
2605 device_remove_file(&client->dev, &dev_attr_hpload_dc_l);
2606 device_remove_file(&client->dev, &dev_attr_hpload_dc_r);
2607 device_remove_file(&client->dev, &dev_attr_hpload_ac_l);
2608 device_remove_file(&client->dev, &dev_attr_hpload_ac_r);
2609 }
2610
2611 gpiod_set_value_cansleep(cs43130->reset_gpio, 0);
2612
2613 pm_runtime_disable(&client->dev);
2614 regulator_bulk_disable(CS43130_NUM_SUPPLIES, cs43130->supplies);
2615
2616 return 0;
2617}
2618
2619static int __maybe_unused cs43130_runtime_suspend(struct device *dev)
2620{
2621 struct cs43130_private *cs43130 = dev_get_drvdata(dev);
2622
2623 if (cs43130->xtal_ibias != CS43130_XTAL_UNUSED)
2624 regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1,
2625 CS43130_XTAL_ERR_INT,
2626 1 << CS43130_XTAL_ERR_INT_SHIFT);
2627
2628 regcache_cache_only(cs43130->regmap, true);
2629 regcache_mark_dirty(cs43130->regmap);
2630
2631 gpiod_set_value_cansleep(cs43130->reset_gpio, 0);
2632
2633 regulator_bulk_disable(CS43130_NUM_SUPPLIES, cs43130->supplies);
2634
2635 return 0;
2636}
2637
2638static int __maybe_unused cs43130_runtime_resume(struct device *dev)
2639{
2640 struct cs43130_private *cs43130 = dev_get_drvdata(dev);
2641 int ret;
2642
2643 ret = regulator_bulk_enable(CS43130_NUM_SUPPLIES, cs43130->supplies);
2644 if (ret != 0) {
2645 dev_err(dev, "Failed to enable supplies: %d\n", ret);
2646 return ret;
2647 }
2648
2649 regcache_cache_only(cs43130->regmap, false);
2650
2651 gpiod_set_value_cansleep(cs43130->reset_gpio, 1);
2652
2653 usleep_range(2000, 2050);
2654
2655 ret = regcache_sync(cs43130->regmap);
2656 if (ret != 0) {
2657 dev_err(dev, "Failed to restore register cache\n");
2658 goto err;
2659 }
2660
2661 if (cs43130->xtal_ibias != CS43130_XTAL_UNUSED)
2662 regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1,
2663 CS43130_XTAL_ERR_INT, 0);
2664
2665 return 0;
2666err:
2667 regcache_cache_only(cs43130->regmap, true);
2668 regulator_bulk_disable(CS43130_NUM_SUPPLIES, cs43130->supplies);
2669
2670 return ret;
2671}
2672
2673static const struct dev_pm_ops cs43130_runtime_pm = {
2674 SET_RUNTIME_PM_OPS(cs43130_runtime_suspend, cs43130_runtime_resume,
2675 NULL)
2676};
2677
2678static const struct of_device_id cs43130_of_match[] = {
2679 {.compatible = "cirrus,cs43130",},
2680 {.compatible = "cirrus,cs4399",},
2681 {.compatible = "cirrus,cs43131",},
2682 {.compatible = "cirrus,cs43198",},
2683 {},
2684};
2685
2686MODULE_DEVICE_TABLE(of, cs43130_of_match);
2687
2688static const struct i2c_device_id cs43130_i2c_id[] = {
2689 {"cs43130", 0},
2690 {"cs4399", 0},
2691 {"cs43131", 0},
2692 {"cs43198", 0},
2693 {}
2694};
2695
2696MODULE_DEVICE_TABLE(i2c, cs43130_i2c_id);
2697
2698static struct i2c_driver cs43130_i2c_driver = {
2699 .driver = {
2700 .name = "cs43130",
2701 .of_match_table = cs43130_of_match,
2702 .pm = &cs43130_runtime_pm,
2703 },
2704 .id_table = cs43130_i2c_id,
2705 .probe = cs43130_i2c_probe,
2706 .remove = cs43130_i2c_remove,
2707};
2708
2709module_i2c_driver(cs43130_i2c_driver);
2710
2711MODULE_AUTHOR("Li Xu <li.xu@cirrus.com>");
2712MODULE_DESCRIPTION("Cirrus Logic CS43130 ALSA SoC Codec Driver");
2713MODULE_LICENSE("GPL");