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/platform_device.h>
26#include <linux/slab.h>
27#include <sound/core.h>
28#include <sound/soc.h>
29#include <sound/initval.h>
30#include <linux/i2c.h>
31#include <linux/delay.h>
32#include <linux/regulator/consumer.h>
33
34#include "cs4270.h"
35
36
37
38
39
40
41
42#define CS4270_FORMATS (SNDRV_PCM_FMTBIT_S8 | \
43 SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S16_BE | \
44 SNDRV_PCM_FMTBIT_S18_3LE | SNDRV_PCM_FMTBIT_S18_3BE | \
45 SNDRV_PCM_FMTBIT_S20_3LE | SNDRV_PCM_FMTBIT_S20_3BE | \
46 SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S24_3BE | \
47 SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S24_BE)
48
49
50#define CS4270_CHIPID 0x01
51#define CS4270_PWRCTL 0x02
52#define CS4270_MODE 0x03
53#define CS4270_FORMAT 0x04
54#define CS4270_TRANS 0x05
55#define CS4270_MUTE 0x06
56#define CS4270_VOLA 0x07
57#define CS4270_VOLB 0x08
58
59#define CS4270_FIRSTREG 0x01
60#define CS4270_LASTREG 0x08
61#define CS4270_NUMREGS (CS4270_LASTREG - CS4270_FIRSTREG + 1)
62#define CS4270_I2C_INCR 0x80
63
64
65#define CS4270_CHIPID_ID 0xF0
66#define CS4270_CHIPID_REV 0x0F
67#define CS4270_PWRCTL_FREEZE 0x80
68#define CS4270_PWRCTL_PDN_ADC 0x20
69#define CS4270_PWRCTL_PDN_DAC 0x02
70#define CS4270_PWRCTL_PDN 0x01
71#define CS4270_PWRCTL_PDN_ALL \
72 (CS4270_PWRCTL_PDN_ADC | CS4270_PWRCTL_PDN_DAC | CS4270_PWRCTL_PDN)
73#define CS4270_MODE_SPEED_MASK 0x30
74#define CS4270_MODE_1X 0x00
75#define CS4270_MODE_2X 0x10
76#define CS4270_MODE_4X 0x20
77#define CS4270_MODE_SLAVE 0x30
78#define CS4270_MODE_DIV_MASK 0x0E
79#define CS4270_MODE_DIV1 0x00
80#define CS4270_MODE_DIV15 0x02
81#define CS4270_MODE_DIV2 0x04
82#define CS4270_MODE_DIV3 0x06
83#define CS4270_MODE_DIV4 0x08
84#define CS4270_MODE_POPGUARD 0x01
85#define CS4270_FORMAT_FREEZE_A 0x80
86#define CS4270_FORMAT_FREEZE_B 0x40
87#define CS4270_FORMAT_LOOPBACK 0x20
88#define CS4270_FORMAT_DAC_MASK 0x18
89#define CS4270_FORMAT_DAC_LJ 0x00
90#define CS4270_FORMAT_DAC_I2S 0x08
91#define CS4270_FORMAT_DAC_RJ16 0x18
92#define CS4270_FORMAT_DAC_RJ24 0x10
93#define CS4270_FORMAT_ADC_MASK 0x01
94#define CS4270_FORMAT_ADC_LJ 0x00
95#define CS4270_FORMAT_ADC_I2S 0x01
96#define CS4270_TRANS_ONE_VOL 0x80
97#define CS4270_TRANS_SOFT 0x40
98#define CS4270_TRANS_ZERO 0x20
99#define CS4270_TRANS_INV_ADC_A 0x08
100#define CS4270_TRANS_INV_ADC_B 0x10
101#define CS4270_TRANS_INV_DAC_A 0x02
102#define CS4270_TRANS_INV_DAC_B 0x04
103#define CS4270_TRANS_DEEMPH 0x01
104#define CS4270_MUTE_AUTO 0x20
105#define CS4270_MUTE_ADC_A 0x08
106#define CS4270_MUTE_ADC_B 0x10
107#define CS4270_MUTE_POLARITY 0x04
108#define CS4270_MUTE_DAC_A 0x01
109#define CS4270_MUTE_DAC_B 0x02
110
111static const char *supply_names[] = {
112 "va", "vd", "vlc"
113};
114
115
116struct cs4270_private {
117 struct snd_soc_codec codec;
118 u8 reg_cache[CS4270_NUMREGS];
119 unsigned int mclk;
120 unsigned int mode;
121 unsigned int slave_mode;
122 unsigned int manual_mute;
123
124
125 struct regulator_bulk_data supplies[ARRAY_SIZE(supply_names)];
126};
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160struct cs4270_mode_ratios {
161 unsigned int ratio;
162 u8 speed_mode;
163 u8 mclk;
164};
165
166static struct cs4270_mode_ratios cs4270_mode_ratios[] = {
167 {64, CS4270_MODE_4X, CS4270_MODE_DIV1},
168#ifndef CONFIG_SND_SOC_CS4270_VD33_ERRATA
169 {96, CS4270_MODE_4X, CS4270_MODE_DIV15},
170#endif
171 {128, CS4270_MODE_2X, CS4270_MODE_DIV1},
172 {192, CS4270_MODE_4X, CS4270_MODE_DIV3},
173 {256, CS4270_MODE_1X, CS4270_MODE_DIV1},
174 {384, CS4270_MODE_2X, CS4270_MODE_DIV3},
175 {512, CS4270_MODE_1X, CS4270_MODE_DIV2},
176 {768, CS4270_MODE_1X, CS4270_MODE_DIV3},
177 {1024, CS4270_MODE_1X, CS4270_MODE_DIV4}
178};
179
180
181#define NUM_MCLK_RATIOS ARRAY_SIZE(cs4270_mode_ratios)
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210static int cs4270_set_dai_sysclk(struct snd_soc_dai *codec_dai,
211 int clk_id, unsigned int freq, int dir)
212{
213 struct snd_soc_codec *codec = codec_dai->codec;
214 struct cs4270_private *cs4270 = snd_soc_codec_get_drvdata(codec);
215 unsigned int rates = 0;
216 unsigned int rate_min = -1;
217 unsigned int rate_max = 0;
218 unsigned int i;
219
220 cs4270->mclk = freq;
221
222 if (cs4270->mclk) {
223 for (i = 0; i < NUM_MCLK_RATIOS; i++) {
224 unsigned int rate = freq / cs4270_mode_ratios[i].ratio;
225 rates |= snd_pcm_rate_to_rate_bit(rate);
226 if (rate < rate_min)
227 rate_min = rate;
228 if (rate > rate_max)
229 rate_max = rate;
230 }
231
232 rates &= ~SNDRV_PCM_RATE_KNOT;
233
234 if (!rates) {
235 dev_err(codec->dev, "could not find a valid sample rate\n");
236 return -EINVAL;
237 }
238 } else {
239
240 rates = SNDRV_PCM_RATE_8000_192000;
241 rate_min = 8000;
242 rate_max = 192000;
243 }
244
245 codec_dai->playback.rates = rates;
246 codec_dai->playback.rate_min = rate_min;
247 codec_dai->playback.rate_max = rate_max;
248
249 codec_dai->capture.rates = rates;
250 codec_dai->capture.rate_min = rate_min;
251 codec_dai->capture.rate_max = rate_max;
252
253 return 0;
254}
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269static int cs4270_set_dai_fmt(struct snd_soc_dai *codec_dai,
270 unsigned int format)
271{
272 struct snd_soc_codec *codec = codec_dai->codec;
273 struct cs4270_private *cs4270 = snd_soc_codec_get_drvdata(codec);
274 int ret = 0;
275
276
277 switch (format & SND_SOC_DAIFMT_FORMAT_MASK) {
278 case SND_SOC_DAIFMT_I2S:
279 case SND_SOC_DAIFMT_LEFT_J:
280 cs4270->mode = format & SND_SOC_DAIFMT_FORMAT_MASK;
281 break;
282 default:
283 dev_err(codec->dev, "invalid dai format\n");
284 ret = -EINVAL;
285 }
286
287
288 switch (format & SND_SOC_DAIFMT_MASTER_MASK) {
289 case SND_SOC_DAIFMT_CBS_CFS:
290 cs4270->slave_mode = 1;
291 break;
292 case SND_SOC_DAIFMT_CBM_CFM:
293 cs4270->slave_mode = 0;
294 break;
295 default:
296
297 ret = -EINVAL;
298 }
299
300 return ret;
301}
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317static int cs4270_fill_cache(struct snd_soc_codec *codec)
318{
319 u8 *cache = codec->reg_cache;
320 struct i2c_client *i2c_client = codec->control_data;
321 s32 length;
322
323 length = i2c_smbus_read_i2c_block_data(i2c_client,
324 CS4270_FIRSTREG | CS4270_I2C_INCR, CS4270_NUMREGS, cache);
325
326 if (length != CS4270_NUMREGS) {
327 dev_err(codec->dev, "i2c read failure, addr=0x%x\n",
328 i2c_client->addr);
329 return -EIO;
330 }
331
332 return 0;
333}
334
335
336
337
338
339
340
341
342
343
344
345
346
347static unsigned int cs4270_read_reg_cache(struct snd_soc_codec *codec,
348 unsigned int reg)
349{
350 u8 *cache = codec->reg_cache;
351
352 if ((reg < CS4270_FIRSTREG) || (reg > CS4270_LASTREG))
353 return -EIO;
354
355 return cache[reg - CS4270_FIRSTREG];
356}
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371static int cs4270_i2c_write(struct snd_soc_codec *codec, unsigned int reg,
372 unsigned int value)
373{
374 u8 *cache = codec->reg_cache;
375
376 if ((reg < CS4270_FIRSTREG) || (reg > CS4270_LASTREG))
377 return -EIO;
378
379
380 if (cache[reg - CS4270_FIRSTREG] != value) {
381 struct i2c_client *client = codec->control_data;
382 if (i2c_smbus_write_byte_data(client, reg, value)) {
383 dev_err(codec->dev, "i2c write failed\n");
384 return -EIO;
385 }
386
387
388 cache[reg - CS4270_FIRSTREG] = value;
389 }
390
391 return 0;
392}
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408static int cs4270_hw_params(struct snd_pcm_substream *substream,
409 struct snd_pcm_hw_params *params,
410 struct snd_soc_dai *dai)
411{
412 struct snd_soc_pcm_runtime *rtd = substream->private_data;
413 struct snd_soc_device *socdev = rtd->socdev;
414 struct snd_soc_codec *codec = socdev->card->codec;
415 struct cs4270_private *cs4270 = snd_soc_codec_get_drvdata(codec);
416 int ret;
417 unsigned int i;
418 unsigned int rate;
419 unsigned int ratio;
420 int reg;
421
422
423
424 rate = params_rate(params);
425 ratio = cs4270->mclk / rate;
426
427 for (i = 0; i < NUM_MCLK_RATIOS; i++) {
428 if (cs4270_mode_ratios[i].ratio == ratio)
429 break;
430 }
431
432 if (i == NUM_MCLK_RATIOS) {
433
434 dev_err(codec->dev, "could not find matching ratio\n");
435 return -EINVAL;
436 }
437
438
439
440 reg = snd_soc_read(codec, CS4270_MODE);
441 reg &= ~(CS4270_MODE_SPEED_MASK | CS4270_MODE_DIV_MASK);
442 reg |= cs4270_mode_ratios[i].mclk;
443
444 if (cs4270->slave_mode)
445 reg |= CS4270_MODE_SLAVE;
446 else
447 reg |= cs4270_mode_ratios[i].speed_mode;
448
449 ret = snd_soc_write(codec, CS4270_MODE, reg);
450 if (ret < 0) {
451 dev_err(codec->dev, "i2c write failed\n");
452 return ret;
453 }
454
455
456
457 reg = snd_soc_read(codec, CS4270_FORMAT);
458 reg &= ~(CS4270_FORMAT_DAC_MASK | CS4270_FORMAT_ADC_MASK);
459
460 switch (cs4270->mode) {
461 case SND_SOC_DAIFMT_I2S:
462 reg |= CS4270_FORMAT_DAC_I2S | CS4270_FORMAT_ADC_I2S;
463 break;
464 case SND_SOC_DAIFMT_LEFT_J:
465 reg |= CS4270_FORMAT_DAC_LJ | CS4270_FORMAT_ADC_LJ;
466 break;
467 default:
468 dev_err(codec->dev, "unknown dai format\n");
469 return -EINVAL;
470 }
471
472 ret = snd_soc_write(codec, CS4270_FORMAT, reg);
473 if (ret < 0) {
474 dev_err(codec->dev, "i2c write failed\n");
475 return ret;
476 }
477
478 return ret;
479}
480
481
482
483
484
485
486
487
488
489
490
491static int cs4270_dai_mute(struct snd_soc_dai *dai, int mute)
492{
493 struct snd_soc_codec *codec = dai->codec;
494 struct cs4270_private *cs4270 = snd_soc_codec_get_drvdata(codec);
495 int reg6;
496
497 reg6 = snd_soc_read(codec, CS4270_MUTE);
498
499 if (mute)
500 reg6 |= CS4270_MUTE_DAC_A | CS4270_MUTE_DAC_B;
501 else {
502 reg6 &= ~(CS4270_MUTE_DAC_A | CS4270_MUTE_DAC_B);
503 reg6 |= cs4270->manual_mute;
504 }
505
506 return snd_soc_write(codec, CS4270_MUTE, reg6);
507}
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523static int cs4270_soc_put_mute(struct snd_kcontrol *kcontrol,
524 struct snd_ctl_elem_value *ucontrol)
525{
526 struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
527 struct cs4270_private *cs4270 = snd_soc_codec_get_drvdata(codec);
528 int left = !ucontrol->value.integer.value[0];
529 int right = !ucontrol->value.integer.value[1];
530
531 cs4270->manual_mute = (left ? CS4270_MUTE_DAC_A : 0) |
532 (right ? CS4270_MUTE_DAC_B : 0);
533
534 return snd_soc_put_volsw(kcontrol, ucontrol);
535}
536
537
538static const struct snd_kcontrol_new cs4270_snd_controls[] = {
539 SOC_DOUBLE_R("Master Playback Volume",
540 CS4270_VOLA, CS4270_VOLB, 0, 0xFF, 1),
541 SOC_SINGLE("Digital Sidetone Switch", CS4270_FORMAT, 5, 1, 0),
542 SOC_SINGLE("Soft Ramp Switch", CS4270_TRANS, 6, 1, 0),
543 SOC_SINGLE("Zero Cross Switch", CS4270_TRANS, 5, 1, 0),
544 SOC_SINGLE("De-emphasis filter", CS4270_TRANS, 0, 1, 0),
545 SOC_SINGLE("Popguard Switch", CS4270_MODE, 0, 1, 1),
546 SOC_SINGLE("Auto-Mute Switch", CS4270_MUTE, 5, 1, 0),
547 SOC_DOUBLE("Master Capture Switch", CS4270_MUTE, 3, 4, 1, 1),
548 SOC_DOUBLE_EXT("Master Playback Switch", CS4270_MUTE, 0, 1, 1, 1,
549 snd_soc_get_volsw, cs4270_soc_put_mute),
550};
551
552
553
554
555
556
557
558
559
560
561
562
563static struct snd_soc_codec *cs4270_codec;
564
565static struct snd_soc_dai_ops cs4270_dai_ops = {
566 .hw_params = cs4270_hw_params,
567 .set_sysclk = cs4270_set_dai_sysclk,
568 .set_fmt = cs4270_set_dai_fmt,
569 .digital_mute = cs4270_dai_mute,
570};
571
572struct snd_soc_dai cs4270_dai = {
573 .name = "cs4270",
574 .playback = {
575 .stream_name = "Playback",
576 .channels_min = 1,
577 .channels_max = 2,
578 .rates = 0,
579 .formats = CS4270_FORMATS,
580 },
581 .capture = {
582 .stream_name = "Capture",
583 .channels_min = 1,
584 .channels_max = 2,
585 .rates = 0,
586 .formats = CS4270_FORMATS,
587 },
588 .ops = &cs4270_dai_ops,
589};
590EXPORT_SYMBOL_GPL(cs4270_dai);
591
592
593
594
595
596
597
598
599static int cs4270_probe(struct platform_device *pdev)
600{
601 struct snd_soc_device *socdev = platform_get_drvdata(pdev);
602 struct snd_soc_codec *codec = cs4270_codec;
603 struct cs4270_private *cs4270 = snd_soc_codec_get_drvdata(codec);
604 int i, ret;
605
606
607 socdev->card->codec = codec;
608
609
610 ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
611 if (ret < 0) {
612 dev_err(codec->dev, "failed to create pcms\n");
613 return ret;
614 }
615
616
617 ret = snd_soc_add_controls(codec, cs4270_snd_controls,
618 ARRAY_SIZE(cs4270_snd_controls));
619 if (ret < 0) {
620 dev_err(codec->dev, "failed to add controls\n");
621 goto error_free_pcms;
622 }
623
624
625 for (i = 0; i < ARRAY_SIZE(supply_names); i++)
626 cs4270->supplies[i].supply = supply_names[i];
627
628 ret = regulator_bulk_get(codec->dev, ARRAY_SIZE(cs4270->supplies),
629 cs4270->supplies);
630 if (ret < 0)
631 goto error_free_pcms;
632
633 ret = regulator_bulk_enable(ARRAY_SIZE(cs4270->supplies),
634 cs4270->supplies);
635 if (ret < 0)
636 goto error_free_regulators;
637
638 return 0;
639
640error_free_regulators:
641 regulator_bulk_free(ARRAY_SIZE(cs4270->supplies),
642 cs4270->supplies);
643
644error_free_pcms:
645 snd_soc_free_pcms(socdev);
646
647 return ret;
648}
649
650
651
652
653
654
655
656static int cs4270_remove(struct platform_device *pdev)
657{
658 struct snd_soc_device *socdev = platform_get_drvdata(pdev);
659 struct snd_soc_codec *codec = cs4270_codec;
660 struct cs4270_private *cs4270 = snd_soc_codec_get_drvdata(codec);
661
662 snd_soc_free_pcms(socdev);
663 regulator_bulk_disable(ARRAY_SIZE(cs4270->supplies), cs4270->supplies);
664 regulator_bulk_free(ARRAY_SIZE(cs4270->supplies), cs4270->supplies);
665
666 return 0;
667};
668
669
670
671
672
673
674
675
676
677static int cs4270_i2c_probe(struct i2c_client *i2c_client,
678 const struct i2c_device_id *id)
679{
680 struct snd_soc_codec *codec;
681 struct cs4270_private *cs4270;
682 unsigned int reg;
683 int ret;
684
685
686
687
688 if (cs4270_codec) {
689 dev_err(&i2c_client->dev, "ignoring CS4270 at addr %X\n",
690 i2c_client->addr);
691 dev_err(&i2c_client->dev, "only one per board allowed\n");
692
693 return -ENODEV;
694 }
695
696
697
698 ret = i2c_smbus_read_byte_data(i2c_client, CS4270_CHIPID);
699 if (ret < 0) {
700 dev_err(&i2c_client->dev, "failed to read i2c at addr %X\n",
701 i2c_client->addr);
702 return ret;
703 }
704
705 if ((ret & 0xF0) != 0xC0) {
706 dev_err(&i2c_client->dev, "device at addr %X is not a CS4270\n",
707 i2c_client->addr);
708 return -ENODEV;
709 }
710
711 dev_info(&i2c_client->dev, "found device at i2c address %X\n",
712 i2c_client->addr);
713 dev_info(&i2c_client->dev, "hardware revision %X\n", ret & 0xF);
714
715
716
717 cs4270 = kzalloc(sizeof(struct cs4270_private), GFP_KERNEL);
718 if (!cs4270) {
719 dev_err(&i2c_client->dev, "could not allocate codec\n");
720 return -ENOMEM;
721 }
722 codec = &cs4270->codec;
723
724 mutex_init(&codec->mutex);
725 INIT_LIST_HEAD(&codec->dapm_widgets);
726 INIT_LIST_HEAD(&codec->dapm_paths);
727
728 codec->dev = &i2c_client->dev;
729 codec->name = "CS4270";
730 codec->owner = THIS_MODULE;
731 codec->dai = &cs4270_dai;
732 codec->num_dai = 1;
733 snd_soc_codec_set_drvdata(codec, cs4270);
734 codec->control_data = i2c_client;
735 codec->read = cs4270_read_reg_cache;
736 codec->write = cs4270_i2c_write;
737 codec->reg_cache = cs4270->reg_cache;
738 codec->reg_cache_size = CS4270_NUMREGS;
739
740
741
742 ret = cs4270_fill_cache(codec);
743 if (ret < 0) {
744 dev_err(&i2c_client->dev, "failed to fill register cache\n");
745 goto error_free_codec;
746 }
747
748
749
750
751
752
753
754 reg = cs4270_read_reg_cache(codec, CS4270_MUTE);
755 reg &= ~CS4270_MUTE_AUTO;
756 ret = cs4270_i2c_write(codec, CS4270_MUTE, reg);
757 if (ret < 0) {
758 dev_err(&i2c_client->dev, "i2c write failed\n");
759 return ret;
760 }
761
762
763
764
765
766
767
768 reg = cs4270_read_reg_cache(codec, CS4270_TRANS);
769 reg &= ~(CS4270_TRANS_SOFT | CS4270_TRANS_ZERO);
770 ret = cs4270_i2c_write(codec, CS4270_TRANS, reg);
771 if (ret < 0) {
772 dev_err(&i2c_client->dev, "i2c write failed\n");
773 return ret;
774 }
775
776
777
778
779
780
781 cs4270_dai.dev = &i2c_client->dev;
782
783
784
785
786
787 cs4270_codec = codec;
788 ret = snd_soc_register_dai(&cs4270_dai);
789 if (ret < 0) {
790 dev_err(&i2c_client->dev, "failed to register DAIe\n");
791 goto error_free_codec;
792 }
793
794 i2c_set_clientdata(i2c_client, cs4270);
795
796 return 0;
797
798error_free_codec:
799 kfree(cs4270);
800 cs4270_codec = NULL;
801 cs4270_dai.dev = NULL;
802
803 return ret;
804}
805
806
807
808
809
810
811
812static int cs4270_i2c_remove(struct i2c_client *i2c_client)
813{
814 struct cs4270_private *cs4270 = i2c_get_clientdata(i2c_client);
815
816 kfree(cs4270);
817 cs4270_codec = NULL;
818 cs4270_dai.dev = NULL;
819
820 return 0;
821}
822
823
824
825
826static struct i2c_device_id cs4270_id[] = {
827 {"cs4270", 0},
828 {}
829};
830MODULE_DEVICE_TABLE(i2c, cs4270_id);
831
832#ifdef CONFIG_PM
833
834
835
836
837
838
839
840
841
842
843static int cs4270_soc_suspend(struct platform_device *pdev, pm_message_t mesg)
844{
845 struct snd_soc_codec *codec = cs4270_codec;
846 struct cs4270_private *cs4270 = snd_soc_codec_get_drvdata(codec);
847 int reg, ret;
848
849 reg = snd_soc_read(codec, CS4270_PWRCTL) | CS4270_PWRCTL_PDN_ALL;
850 if (reg < 0)
851 return reg;
852
853 ret = snd_soc_write(codec, CS4270_PWRCTL, reg);
854 if (ret < 0)
855 return ret;
856
857 regulator_bulk_disable(ARRAY_SIZE(cs4270->supplies),
858 cs4270->supplies);
859
860 return 0;
861}
862
863static int cs4270_soc_resume(struct platform_device *pdev)
864{
865 struct snd_soc_codec *codec = cs4270_codec;
866 struct cs4270_private *cs4270 = snd_soc_codec_get_drvdata(codec);
867 struct i2c_client *i2c_client = codec->control_data;
868 int reg;
869
870 regulator_bulk_enable(ARRAY_SIZE(cs4270->supplies),
871 cs4270->supplies);
872
873
874
875 ndelay(500);
876
877
878 for (reg = CS4270_FIRSTREG; reg <= CS4270_LASTREG; reg++) {
879 u8 val = snd_soc_read(codec, reg);
880
881 if (i2c_smbus_write_byte_data(i2c_client, reg, val)) {
882 dev_err(codec->dev, "i2c write failed\n");
883 return -EIO;
884 }
885 }
886
887
888 reg = snd_soc_read(codec, CS4270_PWRCTL);
889 reg &= ~CS4270_PWRCTL_PDN_ALL;
890
891 return snd_soc_write(codec, CS4270_PWRCTL, reg);
892}
893#else
894#define cs4270_soc_suspend NULL
895#define cs4270_soc_resume NULL
896#endif
897
898
899
900
901
902
903
904static struct i2c_driver cs4270_i2c_driver = {
905 .driver = {
906 .name = "cs4270",
907 .owner = THIS_MODULE,
908 },
909 .id_table = cs4270_id,
910 .probe = cs4270_i2c_probe,
911 .remove = cs4270_i2c_remove,
912};
913
914
915
916
917
918
919
920struct snd_soc_codec_device soc_codec_device_cs4270 = {
921 .probe = cs4270_probe,
922 .remove = cs4270_remove,
923 .suspend = cs4270_soc_suspend,
924 .resume = cs4270_soc_resume,
925};
926EXPORT_SYMBOL_GPL(soc_codec_device_cs4270);
927
928static int __init cs4270_init(void)
929{
930 pr_info("Cirrus Logic CS4270 ALSA SoC Codec Driver\n");
931
932 return i2c_add_driver(&cs4270_i2c_driver);
933}
934module_init(cs4270_init);
935
936static void __exit cs4270_exit(void)
937{
938 i2c_del_driver(&cs4270_i2c_driver);
939}
940module_exit(cs4270_exit);
941
942MODULE_AUTHOR("Timur Tabi <timur@freescale.com>");
943MODULE_DESCRIPTION("Cirrus Logic CS4270 ALSA SoC Codec Driver");
944MODULE_LICENSE("GPL");
945