diff options
Diffstat (limited to 'sound/soc/codecs/uda134x.c')
-rw-r--r-- | sound/soc/codecs/uda134x.c | 64 |
1 files changed, 43 insertions, 21 deletions
diff --git a/sound/soc/codecs/uda134x.c b/sound/soc/codecs/uda134x.c index 28aac53c97bb..f3b4c1d6a82d 100644 --- a/sound/soc/codecs/uda134x.c +++ b/sound/soc/codecs/uda134x.c | |||
@@ -28,19 +28,6 @@ | |||
28 | #include "uda134x.h" | 28 | #include "uda134x.h" |
29 | 29 | ||
30 | 30 | ||
31 | #define POWER_OFF_ON_STANDBY 1 | ||
32 | /* | ||
33 | ALSA SOC usually puts the device in standby mode when it's not used | ||
34 | for sometime. If you define POWER_OFF_ON_STANDBY the driver will | ||
35 | turn off the ADC/DAC when this callback is invoked and turn it back | ||
36 | on when needed. Unfortunately this will result in a very light bump | ||
37 | (it can be audible only with good earphones). If this bothers you | ||
38 | just comment this line, you will have slightly higher power | ||
39 | consumption . Please note that sending the L3 command for ADC is | ||
40 | enough to make the bump, so it doesn't make difference if you | ||
41 | completely take off power from the codec. | ||
42 | */ | ||
43 | |||
44 | #define UDA134X_RATES SNDRV_PCM_RATE_8000_48000 | 31 | #define UDA134X_RATES SNDRV_PCM_RATE_8000_48000 |
45 | #define UDA134X_FORMATS (SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_S16_LE | \ | 32 | #define UDA134X_FORMATS (SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_S16_LE | \ |
46 | SNDRV_PCM_FMTBIT_S18_3LE | SNDRV_PCM_FMTBIT_S20_3LE) | 33 | SNDRV_PCM_FMTBIT_S18_3LE | SNDRV_PCM_FMTBIT_S20_3LE) |
@@ -58,7 +45,7 @@ static const char uda134x_reg[UDA134X_REGS_NUM] = { | |||
58 | /* Extended address registers */ | 45 | /* Extended address registers */ |
59 | 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, | 46 | 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, |
60 | /* Status, data regs */ | 47 | /* Status, data regs */ |
61 | 0x00, 0x83, 0x00, 0x40, 0x80, 0x00, | 48 | 0x00, 0x83, 0x00, 0x40, 0x80, 0xC0, 0x00, |
62 | }; | 49 | }; |
63 | 50 | ||
64 | /* | 51 | /* |
@@ -117,6 +104,7 @@ static int uda134x_write(struct snd_soc_codec *codec, unsigned int reg, | |||
117 | case UDA134X_DATA000: | 104 | case UDA134X_DATA000: |
118 | case UDA134X_DATA001: | 105 | case UDA134X_DATA001: |
119 | case UDA134X_DATA010: | 106 | case UDA134X_DATA010: |
107 | case UDA134X_DATA011: | ||
120 | addr = UDA134X_DATA0_ADDR; | 108 | addr = UDA134X_DATA0_ADDR; |
121 | break; | 109 | break; |
122 | case UDA134X_DATA1: | 110 | case UDA134X_DATA1: |
@@ -353,8 +341,22 @@ static int uda134x_set_bias_level(struct snd_soc_codec *codec, | |||
353 | switch (level) { | 341 | switch (level) { |
354 | case SND_SOC_BIAS_ON: | 342 | case SND_SOC_BIAS_ON: |
355 | /* ADC, DAC on */ | 343 | /* ADC, DAC on */ |
356 | reg = uda134x_read_reg_cache(codec, UDA134X_STATUS1); | 344 | switch (pd->model) { |
357 | uda134x_write(codec, UDA134X_STATUS1, reg | 0x03); | 345 | case UDA134X_UDA1340: |
346 | case UDA134X_UDA1344: | ||
347 | case UDA134X_UDA1345: | ||
348 | reg = uda134x_read_reg_cache(codec, UDA134X_DATA011); | ||
349 | uda134x_write(codec, UDA134X_DATA011, reg | 0x03); | ||
350 | break; | ||
351 | case UDA134X_UDA1341: | ||
352 | reg = uda134x_read_reg_cache(codec, UDA134X_STATUS1); | ||
353 | uda134x_write(codec, UDA134X_STATUS1, reg | 0x03); | ||
354 | break; | ||
355 | default: | ||
356 | printk(KERN_ERR "UDA134X SoC codec: " | ||
357 | "unsupported model %d\n", pd->model); | ||
358 | return -EINVAL; | ||
359 | } | ||
358 | break; | 360 | break; |
359 | case SND_SOC_BIAS_PREPARE: | 361 | case SND_SOC_BIAS_PREPARE: |
360 | /* power on */ | 362 | /* power on */ |
@@ -367,8 +369,22 @@ static int uda134x_set_bias_level(struct snd_soc_codec *codec, | |||
367 | break; | 369 | break; |
368 | case SND_SOC_BIAS_STANDBY: | 370 | case SND_SOC_BIAS_STANDBY: |
369 | /* ADC, DAC power off */ | 371 | /* ADC, DAC power off */ |
370 | reg = uda134x_read_reg_cache(codec, UDA134X_STATUS1); | 372 | switch (pd->model) { |
371 | uda134x_write(codec, UDA134X_STATUS1, reg & ~(0x03)); | 373 | case UDA134X_UDA1340: |
374 | case UDA134X_UDA1344: | ||
375 | case UDA134X_UDA1345: | ||
376 | reg = uda134x_read_reg_cache(codec, UDA134X_DATA011); | ||
377 | uda134x_write(codec, UDA134X_DATA011, reg & ~(0x03)); | ||
378 | break; | ||
379 | case UDA134X_UDA1341: | ||
380 | reg = uda134x_read_reg_cache(codec, UDA134X_STATUS1); | ||
381 | uda134x_write(codec, UDA134X_STATUS1, reg & ~(0x03)); | ||
382 | break; | ||
383 | default: | ||
384 | printk(KERN_ERR "UDA134X SoC codec: " | ||
385 | "unsupported model %d\n", pd->model); | ||
386 | return -EINVAL; | ||
387 | } | ||
372 | break; | 388 | break; |
373 | case SND_SOC_BIAS_OFF: | 389 | case SND_SOC_BIAS_OFF: |
374 | /* power off */ | 390 | /* power off */ |
@@ -531,9 +547,7 @@ static int uda134x_soc_probe(struct platform_device *pdev) | |||
531 | codec->num_dai = 1; | 547 | codec->num_dai = 1; |
532 | codec->read = uda134x_read_reg_cache; | 548 | codec->read = uda134x_read_reg_cache; |
533 | codec->write = uda134x_write; | 549 | codec->write = uda134x_write; |
534 | #ifdef POWER_OFF_ON_STANDBY | 550 | |
535 | codec->set_bias_level = uda134x_set_bias_level; | ||
536 | #endif | ||
537 | INIT_LIST_HEAD(&codec->dapm_widgets); | 551 | INIT_LIST_HEAD(&codec->dapm_widgets); |
538 | INIT_LIST_HEAD(&codec->dapm_paths); | 552 | INIT_LIST_HEAD(&codec->dapm_paths); |
539 | 553 | ||
@@ -544,6 +558,14 @@ static int uda134x_soc_probe(struct platform_device *pdev) | |||
544 | 558 | ||
545 | uda134x_reset(codec); | 559 | uda134x_reset(codec); |
546 | 560 | ||
561 | if (pd->is_powered_on_standby) { | ||
562 | codec->set_bias_level = NULL; | ||
563 | uda134x_set_bias_level(codec, SND_SOC_BIAS_ON); | ||
564 | } else { | ||
565 | codec->set_bias_level = uda134x_set_bias_level; | ||
566 | uda134x_set_bias_level(codec, SND_SOC_BIAS_STANDBY); | ||
567 | } | ||
568 | |||
547 | /* register pcms */ | 569 | /* register pcms */ |
548 | ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); | 570 | ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); |
549 | if (ret < 0) { | 571 | if (ret < 0) { |