aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc/codecs/tpa6130a2.c
diff options
context:
space:
mode:
authorPeter Ujfalusi <peter.ujfalusi@nokia.com>2010-12-02 02:29:56 -0500
committerLiam Girdwood <lrg@slimlogic.co.uk>2010-12-02 06:50:07 -0500
commit39646871a47fd8808c08de0ce7d7ca8393af2805 (patch)
treef10ce958f0e78126a0ebf2b1071c4dd6e50aa40a /sound/soc/codecs/tpa6130a2.c
parent1bb5ec6a6a0e094c84cc4fa2ba4a6d7cf8e9e8c6 (diff)
ASoC: tpa6130a2: Replace DAPM code with direct interface
The use of DAPM widgets, and extra routing can cause ordering problems in the system. Machine drivers should use the exported direct interface with SND_SOC_DAPM_HP's event callback to manage the state of the amplifier. 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/soc/codecs/tpa6130a2.c')
-rw-r--r--sound/soc/codecs/tpa6130a2.c69
1 files changed, 11 insertions, 58 deletions
diff --git a/sound/soc/codecs/tpa6130a2.c b/sound/soc/codecs/tpa6130a2.c
index c97badfac540..0a99f313e218 100644
--- a/sound/soc/codecs/tpa6130a2.c
+++ b/sound/soc/codecs/tpa6130a2.c
@@ -317,65 +317,24 @@ static void tpa6130a2_channel_enable(u8 channel, int enable)
317 } 317 }
318} 318}
319 319
320static int tpa6130a2_pga_event(struct snd_soc_dapm_widget *w, 320int tpa6130a2_stereo_enable(struct snd_soc_codec *codec, int enable)
321 struct snd_kcontrol *kcontrol, int event)
322{
323 switch (event) {
324 case SND_SOC_DAPM_POST_PMU:
325 tpa6130a2_channel_enable(w->shift, 1);
326 break;
327 case SND_SOC_DAPM_POST_PMD:
328 tpa6130a2_channel_enable(w->shift, 0);
329 break;
330 }
331 return 0;
332}
333
334static int tpa6130a2_supply_event(struct snd_soc_dapm_widget *w,
335 struct snd_kcontrol *kcontrol, int event)
336{ 321{
337 int ret = 0; 322 int ret = 0;
338 323 if (enable) {
339 switch (event) {
340 case SND_SOC_DAPM_POST_PMU:
341 ret = tpa6130a2_power(1); 324 ret = tpa6130a2_power(1);
342 break; 325 if (ret < 0)
343 case SND_SOC_DAPM_POST_PMD: 326 return ret;
327 tpa6130a2_channel_enable(TPA6130A2_HP_EN_R | TPA6130A2_HP_EN_L,
328 1);
329 } else {
330 tpa6130a2_channel_enable(TPA6130A2_HP_EN_R | TPA6130A2_HP_EN_L,
331 0);
344 ret = tpa6130a2_power(0); 332 ret = tpa6130a2_power(0);
345 break;
346 } 333 }
334
347 return ret; 335 return ret;
348} 336}
349 337EXPORT_SYMBOL_GPL(tpa6130a2_stereo_enable);
350static const struct snd_soc_dapm_widget tpa6130a2_dapm_widgets[] = {
351 SND_SOC_DAPM_PGA_E("TPA6130A2 Left", SND_SOC_NOPM,
352 TPA6130A2_HP_EN_L, 0, NULL, 0, tpa6130a2_pga_event,
353 SND_SOC_DAPM_POST_PMU|SND_SOC_DAPM_POST_PMD),
354 SND_SOC_DAPM_PGA_E("TPA6130A2 Right", SND_SOC_NOPM,
355 TPA6130A2_HP_EN_R, 0, NULL, 0, tpa6130a2_pga_event,
356 SND_SOC_DAPM_POST_PMU|SND_SOC_DAPM_POST_PMD),
357 SND_SOC_DAPM_PGA_E("TPA6130A2 Stereo", SND_SOC_NOPM,
358 TPA6130A2_HP_EN_L | TPA6130A2_HP_EN_R, 0, NULL, 0,
359 tpa6130a2_pga_event,
360 SND_SOC_DAPM_POST_PMU|SND_SOC_DAPM_POST_PMD),
361 SND_SOC_DAPM_SUPPLY("TPA6130A2 Enable", SND_SOC_NOPM,
362 0, 0, tpa6130a2_supply_event,
363 SND_SOC_DAPM_POST_PMU|SND_SOC_DAPM_POST_PMD),
364 /* Outputs */
365 SND_SOC_DAPM_OUTPUT("TPA6130A2 Headphone Left"),
366 SND_SOC_DAPM_OUTPUT("TPA6130A2 Headphone Right"),
367 SND_SOC_DAPM_OUTPUT("TPA6130A2 Headphone Stereo"),
368};
369
370static const struct snd_soc_dapm_route audio_map[] = {
371 {"TPA6130A2 Headphone Left", NULL, "TPA6130A2 Left"},
372 {"TPA6130A2 Headphone Right", NULL, "TPA6130A2 Right"},
373 {"TPA6130A2 Headphone Stereo", NULL, "TPA6130A2 Stereo"},
374
375 {"TPA6130A2 Headphone Left", NULL, "TPA6130A2 Enable"},
376 {"TPA6130A2 Headphone Right", NULL, "TPA6130A2 Enable"},
377 {"TPA6130A2 Headphone Stereo", NULL, "TPA6130A2 Enable"},
378};
379 338
380int tpa6130a2_add_controls(struct snd_soc_codec *codec) 339int tpa6130a2_add_controls(struct snd_soc_codec *codec)
381{ 340{
@@ -387,18 +346,12 @@ int tpa6130a2_add_controls(struct snd_soc_codec *codec)
387 346
388 data = i2c_get_clientdata(tpa6130a2_client); 347 data = i2c_get_clientdata(tpa6130a2_client);
389 348
390 snd_soc_dapm_new_controls(dapm, tpa6130a2_dapm_widgets,
391 ARRAY_SIZE(tpa6130a2_dapm_widgets));
392
393 snd_soc_dapm_add_routes(dapm, audio_map, ARRAY_SIZE(audio_map));
394
395 if (data->id == TPA6140A2) 349 if (data->id == TPA6140A2)
396 return snd_soc_add_controls(codec, tpa6140a2_controls, 350 return snd_soc_add_controls(codec, tpa6140a2_controls,
397 ARRAY_SIZE(tpa6140a2_controls)); 351 ARRAY_SIZE(tpa6140a2_controls));
398 else 352 else
399 return snd_soc_add_controls(codec, tpa6130a2_controls, 353 return snd_soc_add_controls(codec, tpa6130a2_controls,
400 ARRAY_SIZE(tpa6130a2_controls)); 354 ARRAY_SIZE(tpa6130a2_controls));
401
402} 355}
403EXPORT_SYMBOL_GPL(tpa6130a2_add_controls); 356EXPORT_SYMBOL_GPL(tpa6130a2_add_controls);
404 357