aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc/codecs
diff options
context:
space:
mode:
Diffstat (limited to 'sound/soc/codecs')
-rw-r--r--sound/soc/codecs/tlv320dac33.c57
1 files changed, 48 insertions, 9 deletions
diff --git a/sound/soc/codecs/tlv320dac33.c b/sound/soc/codecs/tlv320dac33.c
index 65adc77eada1..2fa946ce23a2 100644
--- a/sound/soc/codecs/tlv320dac33.c
+++ b/sound/soc/codecs/tlv320dac33.c
@@ -120,6 +120,8 @@ struct tlv320dac33_priv {
120 * samples */ 120 * samples */
121 unsigned int mode7_us_to_lthr; /* Time to reach lthr from uthr */ 121 unsigned int mode7_us_to_lthr; /* Time to reach lthr from uthr */
122 122
123 unsigned int uthr;
124
123 enum dac33_state state; 125 enum dac33_state state;
124}; 126};
125 127
@@ -442,6 +444,39 @@ static int dac33_set_nsample(struct snd_kcontrol *kcontrol,
442 return ret; 444 return ret;
443} 445}
444 446
447static int dac33_get_uthr(struct snd_kcontrol *kcontrol,
448 struct snd_ctl_elem_value *ucontrol)
449{
450 struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
451 struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec);
452
453 ucontrol->value.integer.value[0] = dac33->uthr;
454
455 return 0;
456}
457
458static int dac33_set_uthr(struct snd_kcontrol *kcontrol,
459 struct snd_ctl_elem_value *ucontrol)
460{
461 struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
462 struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec);
463 int ret = 0;
464
465 if (dac33->substream)
466 return -EBUSY;
467
468 if (dac33->uthr == ucontrol->value.integer.value[0])
469 return 0;
470
471 if (ucontrol->value.integer.value[0] < (MODE7_LTHR + 10) ||
472 ucontrol->value.integer.value[0] > MODE7_UTHR)
473 ret = -EINVAL;
474 else
475 dac33->uthr = ucontrol->value.integer.value[0];
476
477 return ret;
478}
479
445static int dac33_get_fifo_mode(struct snd_kcontrol *kcontrol, 480static int dac33_get_fifo_mode(struct snd_kcontrol *kcontrol,
446 struct snd_ctl_elem_value *ucontrol) 481 struct snd_ctl_elem_value *ucontrol)
447{ 482{
@@ -506,6 +541,8 @@ static const struct snd_kcontrol_new dac33_snd_controls[] = {
506static const struct snd_kcontrol_new dac33_nsample_snd_controls[] = { 541static const struct snd_kcontrol_new dac33_nsample_snd_controls[] = {
507 SOC_SINGLE_EXT("nSample", 0, 0, 5900, 0, 542 SOC_SINGLE_EXT("nSample", 0, 0, 5900, 0,
508 dac33_get_nsample, dac33_set_nsample), 543 dac33_get_nsample, dac33_set_nsample),
544 SOC_SINGLE_EXT("UTHR", 0, 0, MODE7_UTHR, 0,
545 dac33_get_uthr, dac33_set_uthr),
509 SOC_ENUM_EXT("FIFO Mode", dac33_fifo_mode_enum, 546 SOC_ENUM_EXT("FIFO Mode", dac33_fifo_mode_enum,
510 dac33_get_fifo_mode, dac33_set_fifo_mode), 547 dac33_get_fifo_mode, dac33_set_fifo_mode),
511}; 548};
@@ -985,7 +1022,7 @@ static int dac33_prepare_chip(struct snd_pcm_substream *substream)
985 * Configure the threshold levels, and leave 10 sample space 1022 * Configure the threshold levels, and leave 10 sample space
986 * at the bottom, and also at the top of the FIFO 1023 * at the bottom, and also at the top of the FIFO
987 */ 1024 */
988 dac33_write16(codec, DAC33_UTHR_MSB, DAC33_THRREG(MODE7_UTHR)); 1025 dac33_write16(codec, DAC33_UTHR_MSB, DAC33_THRREG(dac33->uthr));
989 dac33_write16(codec, DAC33_LTHR_MSB, DAC33_THRREG(MODE7_LTHR)); 1026 dac33_write16(codec, DAC33_LTHR_MSB, DAC33_THRREG(MODE7_LTHR));
990 break; 1027 break;
991 default: 1028 default:
@@ -1052,8 +1089,8 @@ static void dac33_calculate_times(struct snd_pcm_substream *substream)
1052 break; 1089 break;
1053 case DAC33_FIFO_MODE7: 1090 case DAC33_FIFO_MODE7:
1054 dac33->mode7_us_to_lthr = 1091 dac33->mode7_us_to_lthr =
1055 SAMPLES_TO_US(substream->runtime->rate, 1092 SAMPLES_TO_US(substream->runtime->rate,
1056 MODE7_UTHR - MODE7_LTHR + 1); 1093 dac33->uthr - MODE7_LTHR + 1);
1057 dac33->t_stamp1 = 0; 1094 dac33->t_stamp1 = 0;
1058 break; 1095 break;
1059 default: 1096 default:
@@ -1104,7 +1141,7 @@ static snd_pcm_sframes_t dac33_dai_delay(
1104 struct snd_soc_codec *codec = socdev->card->codec; 1141 struct snd_soc_codec *codec = socdev->card->codec;
1105 struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec); 1142 struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec);
1106 unsigned long long t0, t1, t_now; 1143 unsigned long long t0, t1, t_now;
1107 unsigned int time_delta; 1144 unsigned int time_delta, uthr;
1108 int samples_out, samples_in, samples; 1145 int samples_out, samples_in, samples;
1109 snd_pcm_sframes_t delay = 0; 1146 snd_pcm_sframes_t delay = 0;
1110 1147
@@ -1182,6 +1219,7 @@ static snd_pcm_sframes_t dac33_dai_delay(
1182 case DAC33_FIFO_MODE7: 1219 case DAC33_FIFO_MODE7:
1183 spin_lock(&dac33->lock); 1220 spin_lock(&dac33->lock);
1184 t0 = dac33->t_stamp1; 1221 t0 = dac33->t_stamp1;
1222 uthr = dac33->uthr;
1185 spin_unlock(&dac33->lock); 1223 spin_unlock(&dac33->lock);
1186 t_now = ktime_to_us(ktime_get()); 1224 t_now = ktime_to_us(ktime_get());
1187 1225
@@ -1194,7 +1232,7 @@ static snd_pcm_sframes_t dac33_dai_delay(
1194 * Either the timestamps are messed or equal. Report 1232 * Either the timestamps are messed or equal. Report
1195 * maximum delay 1233 * maximum delay
1196 */ 1234 */
1197 delay = MODE7_UTHR; 1235 delay = uthr;
1198 goto out; 1236 goto out;
1199 } 1237 }
1200 1238
@@ -1208,8 +1246,8 @@ static snd_pcm_sframes_t dac33_dai_delay(
1208 substream->runtime->rate, 1246 substream->runtime->rate,
1209 time_delta); 1247 time_delta);
1210 1248
1211 if (likely(MODE7_UTHR > samples_out)) 1249 if (likely(uthr > samples_out))
1212 delay = MODE7_UTHR - samples_out; 1250 delay = uthr - samples_out;
1213 else 1251 else
1214 delay = 0; 1252 delay = 0;
1215 } else { 1253 } else {
@@ -1227,8 +1265,8 @@ static snd_pcm_sframes_t dac33_dai_delay(
1227 time_delta); 1265 time_delta);
1228 delay = MODE7_LTHR + samples_in - samples_out; 1266 delay = MODE7_LTHR + samples_in - samples_out;
1229 1267
1230 if (unlikely(delay > MODE7_UTHR)) 1268 if (unlikely(delay > uthr))
1231 delay = MODE7_UTHR; 1269 delay = uthr;
1232 } 1270 }
1233 break; 1271 break;
1234 default: 1272 default:
@@ -1484,6 +1522,7 @@ static int __devinit dac33_i2c_probe(struct i2c_client *client,
1484 dac33->irq = client->irq; 1522 dac33->irq = client->irq;
1485 dac33->nsample = NSAMPLE_MAX; 1523 dac33->nsample = NSAMPLE_MAX;
1486 dac33->nsample_max = NSAMPLE_MAX; 1524 dac33->nsample_max = NSAMPLE_MAX;
1525 dac33->uthr = MODE7_UTHR;
1487 /* Disable FIFO use by default */ 1526 /* Disable FIFO use by default */
1488 dac33->fifo_mode = DAC33_FIFO_BYPASS; 1527 dac33->fifo_mode = DAC33_FIFO_BYPASS;
1489 1528