aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc
diff options
context:
space:
mode:
Diffstat (limited to 'sound/soc')
-rw-r--r--sound/soc/codecs/tlv320dac33.c90
1 files changed, 64 insertions, 26 deletions
diff --git a/sound/soc/codecs/tlv320dac33.c b/sound/soc/codecs/tlv320dac33.c
index ced6fbbc9d91..8651b01ed223 100644
--- a/sound/soc/codecs/tlv320dac33.c
+++ b/sound/soc/codecs/tlv320dac33.c
@@ -60,6 +60,9 @@
60#define US_TO_SAMPLES(rate, us) \ 60#define US_TO_SAMPLES(rate, us) \
61 (rate / (1000000 / us)) 61 (rate / (1000000 / us))
62 62
63#define UTHR_FROM_PERIOD_SIZE(samples, playrate, burstrate) \
64 ((samples * 5000) / ((burstrate * 5000) / (burstrate - playrate)))
65
63static void dac33_calculate_times(struct snd_pcm_substream *substream); 66static void dac33_calculate_times(struct snd_pcm_substream *substream);
64static int dac33_prepare_chip(struct snd_pcm_substream *substream); 67static int dac33_prepare_chip(struct snd_pcm_substream *substream);
65 68
@@ -107,6 +110,8 @@ struct tlv320dac33_priv {
107 unsigned int nsample; /* burst read amount from host */ 110 unsigned int nsample; /* burst read amount from host */
108 int mode1_latency; /* latency caused by the i2c writes in 111 int mode1_latency; /* latency caused by the i2c writes in
109 * us */ 112 * us */
113 int auto_fifo_config; /* Configure the FIFO based on the
114 * period size */
110 u8 burst_bclkdiv; /* BCLK divider value in burst mode */ 115 u8 burst_bclkdiv; /* BCLK divider value in burst mode */
111 unsigned int burst_rate; /* Interface speed in Burst modes */ 116 unsigned int burst_rate; /* Interface speed in Burst modes */
112 117
@@ -538,13 +543,16 @@ static const struct snd_kcontrol_new dac33_snd_controls[] = {
538 DAC33_LINEL_TO_LLO_VOL, DAC33_LINER_TO_RLO_VOL, 0, 127, 1), 543 DAC33_LINEL_TO_LLO_VOL, DAC33_LINER_TO_RLO_VOL, 0, 127, 1),
539}; 544};
540 545
541static const struct snd_kcontrol_new dac33_nsample_snd_controls[] = { 546static const struct snd_kcontrol_new dac33_mode_snd_controls[] = {
547 SOC_ENUM_EXT("FIFO Mode", dac33_fifo_mode_enum,
548 dac33_get_fifo_mode, dac33_set_fifo_mode),
549};
550
551static const struct snd_kcontrol_new dac33_fifo_snd_controls[] = {
542 SOC_SINGLE_EXT("nSample", 0, 0, 5900, 0, 552 SOC_SINGLE_EXT("nSample", 0, 0, 5900, 0,
543 dac33_get_nsample, dac33_set_nsample), 553 dac33_get_nsample, dac33_set_nsample),
544 SOC_SINGLE_EXT("UTHR", 0, 0, MODE7_UTHR, 0, 554 SOC_SINGLE_EXT("UTHR", 0, 0, MODE7_UTHR, 0,
545 dac33_get_uthr, dac33_set_uthr), 555 dac33_get_uthr, dac33_set_uthr),
546 SOC_ENUM_EXT("FIFO Mode", dac33_fifo_mode_enum,
547 dac33_get_fifo_mode, dac33_set_fifo_mode),
548}; 556};
549 557
550/* Analog bypass */ 558/* Analog bypass */
@@ -1057,24 +1065,38 @@ static void dac33_calculate_times(struct snd_pcm_substream *substream)
1057 /* Number of samples under i2c latency */ 1065 /* Number of samples under i2c latency */
1058 dac33->alarm_threshold = US_TO_SAMPLES(rate, 1066 dac33->alarm_threshold = US_TO_SAMPLES(rate,
1059 dac33->mode1_latency); 1067 dac33->mode1_latency);
1060 /* nSample time shall not be shorter than i2c latency */ 1068 if (dac33->auto_fifo_config) {
1061 dac33->nsample_min = dac33->alarm_threshold; 1069 if (period_size <= dac33->alarm_threshold)
1062 /* 1070 /*
1063 * nSample should not be bigger than alsa buffer minus 1071 * Configure nSamaple to number of periods,
1064 * size of one period to avoid overruns 1072 * which covers the latency requironment.
1065 */ 1073 */
1066 dac33->nsample_max = substream->runtime->buffer_size - 1074 dac33->nsample = period_size *
1067 period_size; 1075 ((dac33->alarm_threshold / period_size) +
1068 nsample_limit = DAC33_BUFFER_SIZE_SAMPLES - 1076 (dac33->alarm_threshold % period_size ?
1069 dac33->alarm_threshold; 1077 1 : 0));
1070 if (dac33->nsample_max > nsample_limit) 1078 else
1071 dac33->nsample_max = nsample_limit; 1079 dac33->nsample = period_size;
1072 1080 } else {
1073 /* Correct the nSample if it is outside of the ranges */ 1081 /* nSample time shall not be shorter than i2c latency */
1074 if (dac33->nsample < dac33->nsample_min) 1082 dac33->nsample_min = dac33->alarm_threshold;
1075 dac33->nsample = dac33->nsample_min; 1083 /*
1076 if (dac33->nsample > dac33->nsample_max) 1084 * nSample should not be bigger than alsa buffer minus
1077 dac33->nsample = dac33->nsample_max; 1085 * size of one period to avoid overruns
1086 */
1087 dac33->nsample_max = substream->runtime->buffer_size -
1088 period_size;
1089 nsample_limit = DAC33_BUFFER_SIZE_SAMPLES -
1090 dac33->alarm_threshold;
1091 if (dac33->nsample_max > nsample_limit)
1092 dac33->nsample_max = nsample_limit;
1093
1094 /* Correct the nSample if it is outside of the ranges */
1095 if (dac33->nsample < dac33->nsample_min)
1096 dac33->nsample = dac33->nsample_min;
1097 if (dac33->nsample > dac33->nsample_max)
1098 dac33->nsample = dac33->nsample_max;
1099 }
1078 1100
1079 dac33->mode1_us_burst = SAMPLES_TO_US(dac33->burst_rate, 1101 dac33->mode1_us_burst = SAMPLES_TO_US(dac33->burst_rate,
1080 dac33->nsample); 1102 dac33->nsample);
@@ -1082,6 +1104,16 @@ static void dac33_calculate_times(struct snd_pcm_substream *substream)
1082 dac33->t_stamp2 = 0; 1104 dac33->t_stamp2 = 0;
1083 break; 1105 break;
1084 case DAC33_FIFO_MODE7: 1106 case DAC33_FIFO_MODE7:
1107 if (dac33->auto_fifo_config) {
1108 dac33->uthr = UTHR_FROM_PERIOD_SIZE(
1109 period_size,
1110 rate,
1111 dac33->burst_rate) + 9;
1112 if (dac33->uthr > MODE7_UTHR)
1113 dac33->uthr = MODE7_UTHR;
1114 if (dac33->uthr < (MODE7_LTHR + 10))
1115 dac33->uthr = (MODE7_LTHR + 10);
1116 }
1085 dac33->mode7_us_to_lthr = 1117 dac33->mode7_us_to_lthr =
1086 SAMPLES_TO_US(substream->runtime->rate, 1118 SAMPLES_TO_US(substream->runtime->rate,
1087 dac33->uthr - MODE7_LTHR + 1); 1119 dac33->uthr - MODE7_LTHR + 1);
@@ -1379,10 +1411,15 @@ static int dac33_soc_probe(struct platform_device *pdev)
1379 1411
1380 snd_soc_add_controls(codec, dac33_snd_controls, 1412 snd_soc_add_controls(codec, dac33_snd_controls,
1381 ARRAY_SIZE(dac33_snd_controls)); 1413 ARRAY_SIZE(dac33_snd_controls));
1382 /* Only add the nSample controls, if we have valid IRQ number */ 1414 /* Only add the FIFO controls, if we have valid IRQ number */
1383 if (dac33->irq >= 0) 1415 if (dac33->irq >= 0) {
1384 snd_soc_add_controls(codec, dac33_nsample_snd_controls, 1416 snd_soc_add_controls(codec, dac33_mode_snd_controls,
1385 ARRAY_SIZE(dac33_nsample_snd_controls)); 1417 ARRAY_SIZE(dac33_mode_snd_controls));
1418 /* FIFO usage controls only, if autoio config is not selected */
1419 if (!dac33->auto_fifo_config)
1420 snd_soc_add_controls(codec, dac33_fifo_snd_controls,
1421 ARRAY_SIZE(dac33_fifo_snd_controls));
1422 }
1386 1423
1387 dac33_add_widgets(codec); 1424 dac33_add_widgets(codec);
1388 1425
@@ -1513,6 +1550,7 @@ static int __devinit dac33_i2c_probe(struct i2c_client *client,
1513 /* Pre calculate the burst rate */ 1550 /* Pre calculate the burst rate */
1514 dac33->burst_rate = BURST_BASEFREQ_HZ / dac33->burst_bclkdiv / 32; 1551 dac33->burst_rate = BURST_BASEFREQ_HZ / dac33->burst_bclkdiv / 32;
1515 dac33->keep_bclk = pdata->keep_bclk; 1552 dac33->keep_bclk = pdata->keep_bclk;
1553 dac33->auto_fifo_config = pdata->auto_fifo_config;
1516 dac33->mode1_latency = pdata->mode1_latency; 1554 dac33->mode1_latency = pdata->mode1_latency;
1517 if (!dac33->mode1_latency) 1555 if (!dac33->mode1_latency)
1518 dac33->mode1_latency = 10000; /* 10ms */ 1556 dac33->mode1_latency = 10000; /* 10ms */