diff options
author | Peter Ujfalusi <peter.ujfalusi@nokia.com> | 2010-12-22 03:45:16 -0500 |
---|---|---|
committer | Liam Girdwood <lrg@slimlogic.co.uk> | 2010-12-23 09:38:33 -0500 |
commit | 3591f4cd53a3835e6d59dd509337503c2c61173e (patch) | |
tree | a4ca2519168013257909a28d105cebbdb07241e5 /sound | |
parent | f769bdf2a7ee97c8e762fc133ff00aabe935867b (diff) |
ASoC: tlv320dac33: Remove manual FIFO configuration
The manual FIFO configuration was the first version to enable
the use of the FIFO in the codec.
It had served it's purpose as debugging aid, but the automatic
FIFO configuration is much safer to use.
The removal of the manual controls, and configuration makes
it easier to add new features for the codec later, since
the manual mode neded different ways to calculate, and
protect against misconfiguration.
Signed-off-by: Peter Ujfalusi <peter.ujfalusi@nokia.com>
Acked-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Signed-off-by: Liam Girdwood <lrg@slimlogic.co.uk>
Diffstat (limited to 'sound')
-rw-r--r-- | sound/soc/codecs/tlv320dac33.c | 157 |
1 files changed, 20 insertions, 137 deletions
diff --git a/sound/soc/codecs/tlv320dac33.c b/sound/soc/codecs/tlv320dac33.c index 776ac80cc1a8..c574ae238973 100644 --- a/sound/soc/codecs/tlv320dac33.c +++ b/sound/soc/codecs/tlv320dac33.c | |||
@@ -46,8 +46,6 @@ | |||
46 | * 6144 stereo */ | 46 | * 6144 stereo */ |
47 | #define DAC33_BUFFER_SIZE_SAMPLES 6144 | 47 | #define DAC33_BUFFER_SIZE_SAMPLES 6144 |
48 | 48 | ||
49 | #define NSAMPLE_MAX 5700 | ||
50 | |||
51 | #define MODE7_LTHR 10 | 49 | #define MODE7_LTHR 10 |
52 | #define MODE7_UTHR (DAC33_BUFFER_SIZE_SAMPLES - 10) | 50 | #define MODE7_UTHR (DAC33_BUFFER_SIZE_SAMPLES - 10) |
53 | 51 | ||
@@ -99,16 +97,10 @@ struct tlv320dac33_priv { | |||
99 | unsigned int refclk; | 97 | unsigned int refclk; |
100 | 98 | ||
101 | unsigned int alarm_threshold; /* set to be half of LATENCY_TIME_MS */ | 99 | unsigned int alarm_threshold; /* set to be half of LATENCY_TIME_MS */ |
102 | unsigned int nsample_min; /* nsample should not be lower than | ||
103 | * this */ | ||
104 | unsigned int nsample_max; /* nsample should not be higher than | ||
105 | * this */ | ||
106 | enum dac33_fifo_modes fifo_mode;/* FIFO mode selection */ | 100 | enum dac33_fifo_modes fifo_mode;/* FIFO mode selection */ |
107 | unsigned int nsample; /* burst read amount from host */ | 101 | unsigned int nsample; /* burst read amount from host */ |
108 | int mode1_latency; /* latency caused by the i2c writes in | 102 | int mode1_latency; /* latency caused by the i2c writes in |
109 | * us */ | 103 | * us */ |
110 | int auto_fifo_config; /* Configure the FIFO based on the | ||
111 | * period size */ | ||
112 | u8 burst_bclkdiv; /* BCLK divider value in burst mode */ | 104 | u8 burst_bclkdiv; /* BCLK divider value in burst mode */ |
113 | unsigned int burst_rate; /* Interface speed in Burst modes */ | 105 | unsigned int burst_rate; /* Interface speed in Burst modes */ |
114 | 106 | ||
@@ -436,73 +428,6 @@ static int dac33_playback_event(struct snd_soc_dapm_widget *w, | |||
436 | return 0; | 428 | return 0; |
437 | } | 429 | } |
438 | 430 | ||
439 | static int dac33_get_nsample(struct snd_kcontrol *kcontrol, | ||
440 | struct snd_ctl_elem_value *ucontrol) | ||
441 | { | ||
442 | struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); | ||
443 | struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec); | ||
444 | |||
445 | ucontrol->value.integer.value[0] = dac33->nsample; | ||
446 | |||
447 | return 0; | ||
448 | } | ||
449 | |||
450 | static int dac33_set_nsample(struct snd_kcontrol *kcontrol, | ||
451 | struct snd_ctl_elem_value *ucontrol) | ||
452 | { | ||
453 | struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); | ||
454 | struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec); | ||
455 | int ret = 0; | ||
456 | |||
457 | if (dac33->nsample == ucontrol->value.integer.value[0]) | ||
458 | return 0; | ||
459 | |||
460 | if (ucontrol->value.integer.value[0] < dac33->nsample_min || | ||
461 | ucontrol->value.integer.value[0] > dac33->nsample_max) { | ||
462 | ret = -EINVAL; | ||
463 | } else { | ||
464 | dac33->nsample = ucontrol->value.integer.value[0]; | ||
465 | /* Re calculate the burst time */ | ||
466 | dac33->mode1_us_burst = SAMPLES_TO_US(dac33->burst_rate, | ||
467 | dac33->nsample); | ||
468 | } | ||
469 | |||
470 | return ret; | ||
471 | } | ||
472 | |||
473 | static int dac33_get_uthr(struct snd_kcontrol *kcontrol, | ||
474 | struct snd_ctl_elem_value *ucontrol) | ||
475 | { | ||
476 | struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); | ||
477 | struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec); | ||
478 | |||
479 | ucontrol->value.integer.value[0] = dac33->uthr; | ||
480 | |||
481 | return 0; | ||
482 | } | ||
483 | |||
484 | static int dac33_set_uthr(struct snd_kcontrol *kcontrol, | ||
485 | struct snd_ctl_elem_value *ucontrol) | ||
486 | { | ||
487 | struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); | ||
488 | struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec); | ||
489 | int ret = 0; | ||
490 | |||
491 | if (dac33->substream) | ||
492 | return -EBUSY; | ||
493 | |||
494 | if (dac33->uthr == ucontrol->value.integer.value[0]) | ||
495 | return 0; | ||
496 | |||
497 | if (ucontrol->value.integer.value[0] < (MODE7_LTHR + 10) || | ||
498 | ucontrol->value.integer.value[0] > MODE7_UTHR) | ||
499 | ret = -EINVAL; | ||
500 | else | ||
501 | dac33->uthr = ucontrol->value.integer.value[0]; | ||
502 | |||
503 | return ret; | ||
504 | } | ||
505 | |||
506 | static int dac33_get_fifo_mode(struct snd_kcontrol *kcontrol, | 431 | static int dac33_get_fifo_mode(struct snd_kcontrol *kcontrol, |
507 | struct snd_ctl_elem_value *ucontrol) | 432 | struct snd_ctl_elem_value *ucontrol) |
508 | { | 433 | { |
@@ -587,13 +512,6 @@ static const struct snd_kcontrol_new dac33_mode_snd_controls[] = { | |||
587 | dac33_get_fifo_mode, dac33_set_fifo_mode), | 512 | dac33_get_fifo_mode, dac33_set_fifo_mode), |
588 | }; | 513 | }; |
589 | 514 | ||
590 | static const struct snd_kcontrol_new dac33_fifo_snd_controls[] = { | ||
591 | SOC_SINGLE_EXT("nSample", 0, 0, 5900, 0, | ||
592 | dac33_get_nsample, dac33_set_nsample), | ||
593 | SOC_SINGLE_EXT("UTHR", 0, 0, MODE7_UTHR, 0, | ||
594 | dac33_get_uthr, dac33_set_uthr), | ||
595 | }; | ||
596 | |||
597 | /* Analog bypass */ | 515 | /* Analog bypass */ |
598 | static const struct snd_kcontrol_new dac33_dapm_abypassl_control = | 516 | static const struct snd_kcontrol_new dac33_dapm_abypassl_control = |
599 | SOC_DAPM_SINGLE("Switch", DAC33_LINEL_TO_LLO_VOL, 7, 1, 1); | 517 | SOC_DAPM_SINGLE("Switch", DAC33_LINEL_TO_LLO_VOL, 7, 1, 1); |
@@ -853,10 +771,6 @@ static void dac33_shutdown(struct snd_pcm_substream *substream, | |||
853 | struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec); | 771 | struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec); |
854 | 772 | ||
855 | dac33->substream = NULL; | 773 | dac33->substream = NULL; |
856 | |||
857 | /* Reset the nSample restrictions */ | ||
858 | dac33->nsample_min = 0; | ||
859 | dac33->nsample_max = NSAMPLE_MAX; | ||
860 | } | 774 | } |
861 | 775 | ||
862 | static int dac33_hw_params(struct snd_pcm_substream *substream, | 776 | static int dac33_hw_params(struct snd_pcm_substream *substream, |
@@ -1112,39 +1026,19 @@ static void dac33_calculate_times(struct snd_pcm_substream *substream) | |||
1112 | nsample_limit = DAC33_BUFFER_SIZE_SAMPLES - | 1026 | nsample_limit = DAC33_BUFFER_SIZE_SAMPLES - |
1113 | dac33->alarm_threshold; | 1027 | dac33->alarm_threshold; |
1114 | 1028 | ||
1115 | if (dac33->auto_fifo_config) { | 1029 | if (period_size <= dac33->alarm_threshold) |
1116 | if (period_size <= dac33->alarm_threshold) | ||
1117 | /* | ||
1118 | * Configure nSamaple to number of periods, | ||
1119 | * which covers the latency requironment. | ||
1120 | */ | ||
1121 | dac33->nsample = period_size * | ||
1122 | ((dac33->alarm_threshold / period_size) + | ||
1123 | (dac33->alarm_threshold % period_size ? | ||
1124 | 1 : 0)); | ||
1125 | else if (period_size > nsample_limit) | ||
1126 | dac33->nsample = nsample_limit; | ||
1127 | else | ||
1128 | dac33->nsample = period_size; | ||
1129 | } else { | ||
1130 | /* nSample time shall not be shorter than i2c latency */ | ||
1131 | dac33->nsample_min = dac33->alarm_threshold; | ||
1132 | /* | 1030 | /* |
1133 | * nSample should not be bigger than alsa buffer minus | 1031 | * Configure nSamaple to number of periods, |
1134 | * size of one period to avoid overruns | 1032 | * which covers the latency requironment. |
1135 | */ | 1033 | */ |
1136 | dac33->nsample_max = substream->runtime->buffer_size - | 1034 | dac33->nsample = period_size * |
1137 | period_size; | 1035 | ((dac33->alarm_threshold / period_size) + |
1138 | 1036 | (dac33->alarm_threshold % period_size ? | |
1139 | if (dac33->nsample_max > nsample_limit) | 1037 | 1 : 0)); |
1140 | dac33->nsample_max = nsample_limit; | 1038 | else if (period_size > nsample_limit) |
1141 | 1039 | dac33->nsample = nsample_limit; | |
1142 | /* Correct the nSample if it is outside of the ranges */ | 1040 | else |
1143 | if (dac33->nsample < dac33->nsample_min) | 1041 | dac33->nsample = period_size; |
1144 | dac33->nsample = dac33->nsample_min; | ||
1145 | if (dac33->nsample > dac33->nsample_max) | ||
1146 | dac33->nsample = dac33->nsample_max; | ||
1147 | } | ||
1148 | 1042 | ||
1149 | dac33->mode1_us_burst = SAMPLES_TO_US(dac33->burst_rate, | 1043 | dac33->mode1_us_burst = SAMPLES_TO_US(dac33->burst_rate, |
1150 | dac33->nsample); | 1044 | dac33->nsample); |
@@ -1152,16 +1046,13 @@ static void dac33_calculate_times(struct snd_pcm_substream *substream) | |||
1152 | dac33->t_stamp2 = 0; | 1046 | dac33->t_stamp2 = 0; |
1153 | break; | 1047 | break; |
1154 | case DAC33_FIFO_MODE7: | 1048 | case DAC33_FIFO_MODE7: |
1155 | if (dac33->auto_fifo_config) { | 1049 | dac33->uthr = UTHR_FROM_PERIOD_SIZE(period_size, rate, |
1156 | dac33->uthr = UTHR_FROM_PERIOD_SIZE( | 1050 | dac33->burst_rate) + 9; |
1157 | period_size, | 1051 | if (dac33->uthr > MODE7_UTHR) |
1158 | rate, | 1052 | dac33->uthr = MODE7_UTHR; |
1159 | dac33->burst_rate) + 9; | 1053 | if (dac33->uthr < (MODE7_LTHR + 10)) |
1160 | if (dac33->uthr > MODE7_UTHR) | 1054 | dac33->uthr = (MODE7_LTHR + 10); |
1161 | dac33->uthr = MODE7_UTHR; | 1055 | |
1162 | if (dac33->uthr < (MODE7_LTHR + 10)) | ||
1163 | dac33->uthr = (MODE7_LTHR + 10); | ||
1164 | } | ||
1165 | dac33->mode7_us_to_lthr = | 1056 | dac33->mode7_us_to_lthr = |
1166 | SAMPLES_TO_US(substream->runtime->rate, | 1057 | SAMPLES_TO_US(substream->runtime->rate, |
1167 | dac33->uthr - MODE7_LTHR + 1); | 1058 | dac33->uthr - MODE7_LTHR + 1); |
@@ -1486,14 +1377,10 @@ static int dac33_soc_probe(struct snd_soc_codec *codec) | |||
1486 | snd_soc_add_controls(codec, dac33_snd_controls, | 1377 | snd_soc_add_controls(codec, dac33_snd_controls, |
1487 | ARRAY_SIZE(dac33_snd_controls)); | 1378 | ARRAY_SIZE(dac33_snd_controls)); |
1488 | /* Only add the FIFO controls, if we have valid IRQ number */ | 1379 | /* Only add the FIFO controls, if we have valid IRQ number */ |
1489 | if (dac33->irq >= 0) { | 1380 | if (dac33->irq >= 0) |
1490 | snd_soc_add_controls(codec, dac33_mode_snd_controls, | 1381 | snd_soc_add_controls(codec, dac33_mode_snd_controls, |
1491 | ARRAY_SIZE(dac33_mode_snd_controls)); | 1382 | ARRAY_SIZE(dac33_mode_snd_controls)); |
1492 | /* FIFO usage controls only, if autoio config is not selected */ | 1383 | |
1493 | if (!dac33->auto_fifo_config) | ||
1494 | snd_soc_add_controls(codec, dac33_fifo_snd_controls, | ||
1495 | ARRAY_SIZE(dac33_fifo_snd_controls)); | ||
1496 | } | ||
1497 | dac33_add_widgets(codec); | 1384 | dac33_add_widgets(codec); |
1498 | 1385 | ||
1499 | err_power: | 1386 | err_power: |
@@ -1593,14 +1480,10 @@ static int __devinit dac33_i2c_probe(struct i2c_client *client, | |||
1593 | /* Pre calculate the burst rate */ | 1480 | /* Pre calculate the burst rate */ |
1594 | dac33->burst_rate = BURST_BASEFREQ_HZ / dac33->burst_bclkdiv / 32; | 1481 | dac33->burst_rate = BURST_BASEFREQ_HZ / dac33->burst_bclkdiv / 32; |
1595 | dac33->keep_bclk = pdata->keep_bclk; | 1482 | dac33->keep_bclk = pdata->keep_bclk; |
1596 | dac33->auto_fifo_config = pdata->auto_fifo_config; | ||
1597 | dac33->mode1_latency = pdata->mode1_latency; | 1483 | dac33->mode1_latency = pdata->mode1_latency; |
1598 | if (!dac33->mode1_latency) | 1484 | if (!dac33->mode1_latency) |
1599 | dac33->mode1_latency = 10000; /* 10ms */ | 1485 | dac33->mode1_latency = 10000; /* 10ms */ |
1600 | dac33->irq = client->irq; | 1486 | dac33->irq = client->irq; |
1601 | dac33->nsample = NSAMPLE_MAX; | ||
1602 | dac33->nsample_max = NSAMPLE_MAX; | ||
1603 | dac33->uthr = MODE7_UTHR; | ||
1604 | /* Disable FIFO use by default */ | 1487 | /* Disable FIFO use by default */ |
1605 | dac33->fifo_mode = DAC33_FIFO_BYPASS; | 1488 | dac33->fifo_mode = DAC33_FIFO_BYPASS; |
1606 | 1489 | ||