1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24#include <linux/module.h>
25#include <linux/slab.h>
26#include <sound/core.h>
27#include <sound/soc.h>
28#include <sound/initval.h>
29#include <linux/i2c.h>
30#include <linux/delay.h>
31#include <linux/regulator/consumer.h>
32#include <linux/gpio/consumer.h>
33#include <linux/of_device.h>
34
35
36
37
38
39
40
41#define CS4270_FORMATS (SNDRV_PCM_FMTBIT_S8 | \
42 SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S16_BE | \
43 SNDRV_PCM_FMTBIT_S18_3LE | SNDRV_PCM_FMTBIT_S18_3BE | \
44 SNDRV_PCM_FMTBIT_S20_3LE | SNDRV_PCM_FMTBIT_S20_3BE | \
45 SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S24_3BE | \
46 SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S24_BE)
47
48
49#define CS4270_CHIPID 0x01
50#define CS4270_PWRCTL 0x02
51#define CS4270_MODE 0x03
52#define CS4270_FORMAT 0x04
53#define CS4270_TRANS 0x05
54#define CS4270_MUTE 0x06
55#define CS4270_VOLA 0x07
56#define CS4270_VOLB 0x08
57
58#define CS4270_FIRSTREG 0x01
59#define CS4270_LASTREG 0x08
60#define CS4270_NUMREGS (CS4270_LASTREG - CS4270_FIRSTREG + 1)
61#define CS4270_I2C_INCR 0x80
62
63
64#define CS4270_CHIPID_ID 0xF0
65#define CS4270_CHIPID_REV 0x0F
66#define CS4270_PWRCTL_FREEZE 0x80
67#define CS4270_PWRCTL_PDN_ADC 0x20
68#define CS4270_PWRCTL_PDN_DAC 0x02
69#define CS4270_PWRCTL_PDN 0x01
70#define CS4270_PWRCTL_PDN_ALL \
71 (CS4270_PWRCTL_PDN_ADC | CS4270_PWRCTL_PDN_DAC | CS4270_PWRCTL_PDN)
72#define CS4270_MODE_SPEED_MASK 0x30
73#define CS4270_MODE_1X 0x00
74#define CS4270_MODE_2X 0x10
75#define CS4270_MODE_4X 0x20
76#define CS4270_MODE_SLAVE 0x30
77#define CS4270_MODE_DIV_MASK 0x0E
78#define CS4270_MODE_DIV1 0x00
79#define CS4270_MODE_DIV15 0x02
80#define CS4270_MODE_DIV2 0x04
81#define CS4270_MODE_DIV3 0x06
82#define CS4270_MODE_DIV4 0x08
83#define CS4270_MODE_POPGUARD 0x01
84#define CS4270_FORMAT_FREEZE_A 0x80
85#define CS4270_FORMAT_FREEZE_B 0x40
86#define CS4270_FORMAT_LOOPBACK 0x20
87#define CS4270_FORMAT_DAC_MASK 0x18
88#define CS4270_FORMAT_DAC_LJ 0x00
89#define CS4270_FORMAT_DAC_I2S 0x08
90#define CS4270_FORMAT_DAC_RJ16 0x18
91#define CS4270_FORMAT_DAC_RJ24 0x10
92#define CS4270_FORMAT_ADC_MASK 0x01
93#define CS4270_FORMAT_ADC_LJ 0x00
94#define CS4270_FORMAT_ADC_I2S 0x01
95#define CS4270_TRANS_ONE_VOL 0x80
96#define CS4270_TRANS_SOFT 0x40
97#define CS4270_TRANS_ZERO 0x20
98#define CS4270_TRANS_INV_ADC_A 0x08
99#define CS4270_TRANS_INV_ADC_B 0x10
100#define CS4270_TRANS_INV_DAC_A 0x02
101#define CS4270_TRANS_INV_DAC_B 0x04
102#define CS4270_TRANS_DEEMPH 0x01
103#define CS4270_MUTE_AUTO 0x20
104#define CS4270_MUTE_ADC_A 0x08
105#define CS4270_MUTE_ADC_B 0x10
106#define CS4270_MUTE_POLARITY 0x04
107#define CS4270_MUTE_DAC_A 0x01
108#define CS4270_MUTE_DAC_B 0x02
109
110
111
112
113
114
115
116static const struct reg_default cs4270_reg_defaults[] = {
117 { 2, 0x00 },
118 { 3, 0x30 },
119 { 4, 0x00 },
120 { 5, 0x60 },
121 { 6, 0x20 },
122 { 7, 0x00 },
123 { 8, 0x00 },
124};
125
126static const char *supply_names[] = {
127 "va", "vd", "vlc"
128};
129
130
131struct cs4270_private {
132 struct regmap *regmap;
133 unsigned int mclk;
134 unsigned int mode;
135 unsigned int slave_mode;
136 unsigned int manual_mute;
137
138
139 struct regulator_bulk_data supplies[ARRAY_SIZE(supply_names)];
140
141
142 struct gpio_desc *reset_gpio;
143};
144
145static const struct snd_soc_dapm_widget cs4270_dapm_widgets[] = {
146SND_SOC_DAPM_INPUT("AINL"),
147SND_SOC_DAPM_INPUT("AINR"),
148
149SND_SOC_DAPM_OUTPUT("AOUTL"),
150SND_SOC_DAPM_OUTPUT("AOUTR"),
151};
152
153static const struct snd_soc_dapm_route cs4270_dapm_routes[] = {
154 { "Capture", NULL, "AINL" },
155 { "Capture", NULL, "AINR" },
156
157 { "AOUTL", NULL, "Playback" },
158 { "AOUTR", NULL, "Playback" },
159};
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193struct cs4270_mode_ratios {
194 unsigned int ratio;
195 u8 speed_mode;
196 u8 mclk;
197};
198
199static struct cs4270_mode_ratios cs4270_mode_ratios[] = {
200 {64, CS4270_MODE_4X, CS4270_MODE_DIV1},
201#ifndef CONFIG_SND_SOC_CS4270_VD33_ERRATA
202 {96, CS4270_MODE_4X, CS4270_MODE_DIV15},
203#endif
204 {128, CS4270_MODE_2X, CS4270_MODE_DIV1},
205 {192, CS4270_MODE_4X, CS4270_MODE_DIV3},
206 {256, CS4270_MODE_1X, CS4270_MODE_DIV1},
207 {384, CS4270_MODE_2X, CS4270_MODE_DIV3},
208 {512, CS4270_MODE_1X, CS4270_MODE_DIV2},
209 {768, CS4270_MODE_1X, CS4270_MODE_DIV3},
210 {1024, CS4270_MODE_1X, CS4270_MODE_DIV4}
211};
212
213
214#define NUM_MCLK_RATIOS ARRAY_SIZE(cs4270_mode_ratios)
215
216static bool cs4270_reg_is_readable(struct device *dev, unsigned int reg)
217{
218 return (reg >= CS4270_FIRSTREG) && (reg <= CS4270_LASTREG);
219}
220
221static bool cs4270_reg_is_volatile(struct device *dev, unsigned int reg)
222{
223
224 if ((reg < CS4270_FIRSTREG) || (reg > CS4270_LASTREG))
225 return true;
226
227 return reg == CS4270_CHIPID;
228}
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257static int cs4270_set_dai_sysclk(struct snd_soc_dai *codec_dai,
258 int clk_id, unsigned int freq, int dir)
259{
260 struct snd_soc_component *component = codec_dai->component;
261 struct cs4270_private *cs4270 = snd_soc_component_get_drvdata(component);
262
263 cs4270->mclk = freq;
264 return 0;
265}
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280static int cs4270_set_dai_fmt(struct snd_soc_dai *codec_dai,
281 unsigned int format)
282{
283 struct snd_soc_component *component = codec_dai->component;
284 struct cs4270_private *cs4270 = snd_soc_component_get_drvdata(component);
285
286
287 switch (format & SND_SOC_DAIFMT_FORMAT_MASK) {
288 case SND_SOC_DAIFMT_I2S:
289 case SND_SOC_DAIFMT_LEFT_J:
290 cs4270->mode = format & SND_SOC_DAIFMT_FORMAT_MASK;
291 break;
292 default:
293 dev_err(component->dev, "invalid dai format\n");
294 return -EINVAL;
295 }
296
297
298 switch (format & SND_SOC_DAIFMT_MASTER_MASK) {
299 case SND_SOC_DAIFMT_CBS_CFS:
300 cs4270->slave_mode = 1;
301 break;
302 case SND_SOC_DAIFMT_CBM_CFM:
303 cs4270->slave_mode = 0;
304 break;
305 default:
306
307 dev_err(component->dev, "Unknown master/slave configuration\n");
308 return -EINVAL;
309 }
310
311 return 0;
312}
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328static int cs4270_hw_params(struct snd_pcm_substream *substream,
329 struct snd_pcm_hw_params *params,
330 struct snd_soc_dai *dai)
331{
332 struct snd_soc_component *component = dai->component;
333 struct cs4270_private *cs4270 = snd_soc_component_get_drvdata(component);
334 int ret;
335 unsigned int i;
336 unsigned int rate;
337 unsigned int ratio;
338 int reg;
339
340
341
342 rate = params_rate(params);
343 ratio = cs4270->mclk / rate;
344
345 for (i = 0; i < NUM_MCLK_RATIOS; i++) {
346 if (cs4270_mode_ratios[i].ratio == ratio)
347 break;
348 }
349
350 if (i == NUM_MCLK_RATIOS) {
351
352 dev_err(component->dev, "could not find matching ratio\n");
353 return -EINVAL;
354 }
355
356
357
358 reg = snd_soc_component_read(component, CS4270_MODE);
359 reg &= ~(CS4270_MODE_SPEED_MASK | CS4270_MODE_DIV_MASK);
360 reg |= cs4270_mode_ratios[i].mclk;
361
362 if (cs4270->slave_mode)
363 reg |= CS4270_MODE_SLAVE;
364 else
365 reg |= cs4270_mode_ratios[i].speed_mode;
366
367 ret = snd_soc_component_write(component, CS4270_MODE, reg);
368 if (ret < 0) {
369 dev_err(component->dev, "i2c write failed\n");
370 return ret;
371 }
372
373
374
375 reg = snd_soc_component_read(component, CS4270_FORMAT);
376 reg &= ~(CS4270_FORMAT_DAC_MASK | CS4270_FORMAT_ADC_MASK);
377
378 switch (cs4270->mode) {
379 case SND_SOC_DAIFMT_I2S:
380 reg |= CS4270_FORMAT_DAC_I2S | CS4270_FORMAT_ADC_I2S;
381 break;
382 case SND_SOC_DAIFMT_LEFT_J:
383 reg |= CS4270_FORMAT_DAC_LJ | CS4270_FORMAT_ADC_LJ;
384 break;
385 default:
386 dev_err(component->dev, "unknown dai format\n");
387 return -EINVAL;
388 }
389
390 ret = snd_soc_component_write(component, CS4270_FORMAT, reg);
391 if (ret < 0) {
392 dev_err(component->dev, "i2c write failed\n");
393 return ret;
394 }
395
396 return ret;
397}
398
399
400
401
402
403
404
405
406
407
408
409
410static int cs4270_dai_mute(struct snd_soc_dai *dai, int mute, int direction)
411{
412 struct snd_soc_component *component = dai->component;
413 struct cs4270_private *cs4270 = snd_soc_component_get_drvdata(component);
414 int reg6;
415
416 reg6 = snd_soc_component_read(component, CS4270_MUTE);
417
418 if (mute)
419 reg6 |= CS4270_MUTE_DAC_A | CS4270_MUTE_DAC_B;
420 else {
421 reg6 &= ~(CS4270_MUTE_DAC_A | CS4270_MUTE_DAC_B);
422 reg6 |= cs4270->manual_mute;
423 }
424
425 return snd_soc_component_write(component, CS4270_MUTE, reg6);
426}
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442static int cs4270_soc_put_mute(struct snd_kcontrol *kcontrol,
443 struct snd_ctl_elem_value *ucontrol)
444{
445 struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
446 struct cs4270_private *cs4270 = snd_soc_component_get_drvdata(component);
447 int left = !ucontrol->value.integer.value[0];
448 int right = !ucontrol->value.integer.value[1];
449
450 cs4270->manual_mute = (left ? CS4270_MUTE_DAC_A : 0) |
451 (right ? CS4270_MUTE_DAC_B : 0);
452
453 return snd_soc_put_volsw(kcontrol, ucontrol);
454}
455
456
457static const struct snd_kcontrol_new cs4270_snd_controls[] = {
458 SOC_DOUBLE_R("Master Playback Volume",
459 CS4270_VOLA, CS4270_VOLB, 0, 0xFF, 1),
460 SOC_SINGLE("Digital Sidetone Switch", CS4270_FORMAT, 5, 1, 0),
461 SOC_SINGLE("Soft Ramp Switch", CS4270_TRANS, 6, 1, 0),
462 SOC_SINGLE("Zero Cross Switch", CS4270_TRANS, 5, 1, 0),
463 SOC_SINGLE("De-emphasis filter", CS4270_TRANS, 0, 1, 0),
464 SOC_SINGLE("Popguard Switch", CS4270_MODE, 0, 1, 1),
465 SOC_SINGLE("Auto-Mute Switch", CS4270_MUTE, 5, 1, 0),
466 SOC_DOUBLE("Master Capture Switch", CS4270_MUTE, 3, 4, 1, 1),
467 SOC_DOUBLE_EXT("Master Playback Switch", CS4270_MUTE, 0, 1, 1, 1,
468 snd_soc_get_volsw, cs4270_soc_put_mute),
469};
470
471static const struct snd_soc_dai_ops cs4270_dai_ops = {
472 .hw_params = cs4270_hw_params,
473 .set_sysclk = cs4270_set_dai_sysclk,
474 .set_fmt = cs4270_set_dai_fmt,
475 .mute_stream = cs4270_dai_mute,
476 .no_capture_mute = 1,
477};
478
479static struct snd_soc_dai_driver cs4270_dai = {
480 .name = "cs4270-hifi",
481 .playback = {
482 .stream_name = "Playback",
483 .channels_min = 2,
484 .channels_max = 2,
485 .rates = SNDRV_PCM_RATE_CONTINUOUS,
486 .rate_min = 4000,
487 .rate_max = 216000,
488 .formats = CS4270_FORMATS,
489 },
490 .capture = {
491 .stream_name = "Capture",
492 .channels_min = 2,
493 .channels_max = 2,
494 .rates = SNDRV_PCM_RATE_CONTINUOUS,
495 .rate_min = 4000,
496 .rate_max = 216000,
497 .formats = CS4270_FORMATS,
498 },
499 .ops = &cs4270_dai_ops,
500};
501
502
503
504
505
506
507
508
509static int cs4270_probe(struct snd_soc_component *component)
510{
511 struct cs4270_private *cs4270 = snd_soc_component_get_drvdata(component);
512 int ret;
513
514
515
516
517
518
519 ret = snd_soc_component_update_bits(component, CS4270_MUTE, CS4270_MUTE_AUTO, 0);
520 if (ret < 0) {
521 dev_err(component->dev, "i2c write failed\n");
522 return ret;
523 }
524
525
526
527
528
529
530 ret = snd_soc_component_update_bits(component, CS4270_TRANS,
531 CS4270_TRANS_SOFT | CS4270_TRANS_ZERO, 0);
532 if (ret < 0) {
533 dev_err(component->dev, "i2c write failed\n");
534 return ret;
535 }
536
537 ret = regulator_bulk_enable(ARRAY_SIZE(cs4270->supplies),
538 cs4270->supplies);
539
540 return ret;
541}
542
543
544
545
546
547
548
549static void cs4270_remove(struct snd_soc_component *component)
550{
551 struct cs4270_private *cs4270 = snd_soc_component_get_drvdata(component);
552
553 regulator_bulk_disable(ARRAY_SIZE(cs4270->supplies), cs4270->supplies);
554};
555
556#ifdef CONFIG_PM
557
558
559
560
561
562
563
564
565
566
567static int cs4270_soc_suspend(struct snd_soc_component *component)
568{
569 struct cs4270_private *cs4270 = snd_soc_component_get_drvdata(component);
570 int reg, ret;
571
572 reg = snd_soc_component_read(component, CS4270_PWRCTL) | CS4270_PWRCTL_PDN_ALL;
573 if (reg < 0)
574 return reg;
575
576 ret = snd_soc_component_write(component, CS4270_PWRCTL, reg);
577 if (ret < 0)
578 return ret;
579
580 regulator_bulk_disable(ARRAY_SIZE(cs4270->supplies),
581 cs4270->supplies);
582
583 return 0;
584}
585
586static int cs4270_soc_resume(struct snd_soc_component *component)
587{
588 struct cs4270_private *cs4270 = snd_soc_component_get_drvdata(component);
589 int reg, ret;
590
591 ret = regulator_bulk_enable(ARRAY_SIZE(cs4270->supplies),
592 cs4270->supplies);
593 if (ret != 0)
594 return ret;
595
596
597
598 ndelay(500);
599
600
601 regcache_sync(cs4270->regmap);
602
603
604 reg = snd_soc_component_read(component, CS4270_PWRCTL);
605 reg &= ~CS4270_PWRCTL_PDN_ALL;
606
607 return snd_soc_component_write(component, CS4270_PWRCTL, reg);
608}
609#else
610#define cs4270_soc_suspend NULL
611#define cs4270_soc_resume NULL
612#endif
613
614
615
616
617static const struct snd_soc_component_driver soc_component_device_cs4270 = {
618 .probe = cs4270_probe,
619 .remove = cs4270_remove,
620 .suspend = cs4270_soc_suspend,
621 .resume = cs4270_soc_resume,
622 .controls = cs4270_snd_controls,
623 .num_controls = ARRAY_SIZE(cs4270_snd_controls),
624 .dapm_widgets = cs4270_dapm_widgets,
625 .num_dapm_widgets = ARRAY_SIZE(cs4270_dapm_widgets),
626 .dapm_routes = cs4270_dapm_routes,
627 .num_dapm_routes = ARRAY_SIZE(cs4270_dapm_routes),
628 .idle_bias_on = 1,
629 .use_pmdown_time = 1,
630 .endianness = 1,
631 .non_legacy_dai_naming = 1,
632};
633
634
635
636
637static const struct of_device_id cs4270_of_match[] = {
638 { .compatible = "cirrus,cs4270", },
639 { }
640};
641MODULE_DEVICE_TABLE(of, cs4270_of_match);
642
643static const struct regmap_config cs4270_regmap = {
644 .reg_bits = 8,
645 .val_bits = 8,
646 .max_register = CS4270_LASTREG,
647 .reg_defaults = cs4270_reg_defaults,
648 .num_reg_defaults = ARRAY_SIZE(cs4270_reg_defaults),
649 .cache_type = REGCACHE_RBTREE,
650 .write_flag_mask = CS4270_I2C_INCR,
651
652 .readable_reg = cs4270_reg_is_readable,
653 .volatile_reg = cs4270_reg_is_volatile,
654};
655
656
657
658
659
660
661
662
663static int cs4270_i2c_remove(struct i2c_client *i2c_client)
664{
665 struct cs4270_private *cs4270 = i2c_get_clientdata(i2c_client);
666
667 gpiod_set_value_cansleep(cs4270->reset_gpio, 0);
668
669 return 0;
670}
671
672
673
674
675
676
677
678
679
680static int cs4270_i2c_probe(struct i2c_client *i2c_client,
681 const struct i2c_device_id *id)
682{
683 struct cs4270_private *cs4270;
684 unsigned int val;
685 int ret, i;
686
687 cs4270 = devm_kzalloc(&i2c_client->dev, sizeof(struct cs4270_private),
688 GFP_KERNEL);
689 if (!cs4270)
690 return -ENOMEM;
691
692
693 for (i = 0; i < ARRAY_SIZE(supply_names); i++)
694 cs4270->supplies[i].supply = supply_names[i];
695
696 ret = devm_regulator_bulk_get(&i2c_client->dev,
697 ARRAY_SIZE(cs4270->supplies),
698 cs4270->supplies);
699 if (ret < 0)
700 return ret;
701
702
703 cs4270->reset_gpio = devm_gpiod_get_optional(&i2c_client->dev, "reset",
704 GPIOD_OUT_LOW);
705 if (IS_ERR(cs4270->reset_gpio)) {
706 dev_dbg(&i2c_client->dev, "Error getting CS4270 reset GPIO\n");
707 return PTR_ERR(cs4270->reset_gpio);
708 }
709
710 if (cs4270->reset_gpio) {
711 dev_dbg(&i2c_client->dev, "Found reset GPIO\n");
712 gpiod_set_value_cansleep(cs4270->reset_gpio, 1);
713 }
714
715
716 ndelay(500);
717
718 cs4270->regmap = devm_regmap_init_i2c(i2c_client, &cs4270_regmap);
719 if (IS_ERR(cs4270->regmap))
720 return PTR_ERR(cs4270->regmap);
721
722
723 ret = regmap_read(cs4270->regmap, CS4270_CHIPID, &val);
724 if (ret < 0) {
725 dev_err(&i2c_client->dev, "failed to read i2c at addr %X\n",
726 i2c_client->addr);
727 return ret;
728 }
729
730 if ((val & 0xF0) != 0xC0) {
731 dev_err(&i2c_client->dev, "device at addr %X is not a CS4270\n",
732 i2c_client->addr);
733 return -ENODEV;
734 }
735
736 dev_info(&i2c_client->dev, "found device at i2c address %X\n",
737 i2c_client->addr);
738 dev_info(&i2c_client->dev, "hardware revision %X\n", val & 0xF);
739
740 i2c_set_clientdata(i2c_client, cs4270);
741
742 ret = devm_snd_soc_register_component(&i2c_client->dev,
743 &soc_component_device_cs4270, &cs4270_dai, 1);
744 return ret;
745}
746
747
748
749
750static const struct i2c_device_id cs4270_id[] = {
751 {"cs4270", 0},
752 {}
753};
754MODULE_DEVICE_TABLE(i2c, cs4270_id);
755
756
757
758
759
760
761
762static struct i2c_driver cs4270_i2c_driver = {
763 .driver = {
764 .name = "cs4270",
765 .of_match_table = cs4270_of_match,
766 },
767 .id_table = cs4270_id,
768 .probe = cs4270_i2c_probe,
769 .remove = cs4270_i2c_remove,
770};
771
772module_i2c_driver(cs4270_i2c_driver);
773
774MODULE_AUTHOR("Timur Tabi <timur@freescale.com>");
775MODULE_DESCRIPTION("Cirrus Logic CS4270 ALSA SoC Codec Driver");
776MODULE_LICENSE("GPL");
777