diff options
author | Liam Girdwood <lrg@slimlogic.co.uk> | 2010-11-05 09:53:46 -0400 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2010-11-06 11:28:29 -0400 |
commit | ce6120cca2589ede530200c7cfe11ac9f144333c (patch) | |
tree | 6ea7c26ce64dd4753e7cf9a3b048e74614b169dc /include | |
parent | 22e2fda5660cdf62513acabdb5c82a5af415f838 (diff) |
ASoC: Decouple DAPM from CODECs
Decoupling Dynamic Audio Power Management (DAPM) from codec devices is
required when developing ASoC further. Such as for other ASoC components to
have DAPM widgets or when extending DAPM to handle cross-device paths.
This patch decouples DAPM related variables from struct snd_soc_codec and
moves them to new struct snd_soc_dapm_context that is used to encapsulate
DAPM context of a device. ASoC core and API of DAPM functions are modified
to use DAPM context instead of codec.
This patch does not change current functionality and a large part of changes
come because of structure and internal API changes.
Core implementation is from Liam Girdwood <lrg@slimlogic.co.uk> with some
minor core changes, codecs and machine driver conversions from
Jarkko Nikula <jhnikula@gmail.com>.
Signed-off-by: Liam Girdwood <lrg@slimlogic.co.uk>
Signed-off-by: Jarkko Nikula <jhnikula@gmail.com>
Cc: Nicolas Ferre <nicolas.ferre@atmel.com>
Cc: Manuel Lauss <manuel.lauss@googlemail.com>
Cc: Mike Frysinger <vapier.adi@gmail.com>
Cc: Cliff Cai <cliff.cai@analog.com>
Cc: Kevin Hilman <khilman@deeprootsystems.com>
Cc: Ryan Mallon <ryan@bluewatersys.com>
Cc: Timur Tabi <timur@freescale.com>
Cc: Sascha Hauer <s.hauer@pengutronix.de>
Cc: Lars-Peter Clausen <lars@metafoo.de>
Cc: Arnaud Patard (Rtp) <arnaud.patard@rtp-net.org>
Cc: Wan ZongShun <mcuos.com@gmail.com>
Cc: Eric Miao <eric.y.miao@gmail.com>
Cc: Jassi Brar <jassi.brar@samsung.com>
Cc: Daniel Gloeckner <dg@emlix.com>
Cc: Kuninori Morimoto <morimoto.kuninori@renesas.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'include')
-rw-r--r-- | include/sound/soc-dapm.h | 49 | ||||
-rw-r--r-- | include/sound/soc.h | 9 |
2 files changed, 38 insertions, 20 deletions
diff --git a/include/sound/soc-dapm.h b/include/sound/soc-dapm.h index 8fd3b41b763f..5881876e8f5b 100644 --- a/include/sound/soc-dapm.h +++ b/include/sound/soc-dapm.h | |||
@@ -297,6 +297,7 @@ enum snd_soc_dapm_type; | |||
297 | struct snd_soc_dapm_path; | 297 | struct snd_soc_dapm_path; |
298 | struct snd_soc_dapm_pin; | 298 | struct snd_soc_dapm_pin; |
299 | struct snd_soc_dapm_route; | 299 | struct snd_soc_dapm_route; |
300 | struct snd_soc_dapm_context; | ||
300 | 301 | ||
301 | int dapm_reg_event(struct snd_soc_dapm_widget *w, | 302 | int dapm_reg_event(struct snd_soc_dapm_widget *w, |
302 | struct snd_kcontrol *kcontrol, int event); | 303 | struct snd_kcontrol *kcontrol, int event); |
@@ -324,16 +325,16 @@ int snd_soc_dapm_get_pin_switch(struct snd_kcontrol *kcontrol, | |||
324 | struct snd_ctl_elem_value *uncontrol); | 325 | struct snd_ctl_elem_value *uncontrol); |
325 | int snd_soc_dapm_put_pin_switch(struct snd_kcontrol *kcontrol, | 326 | int snd_soc_dapm_put_pin_switch(struct snd_kcontrol *kcontrol, |
326 | struct snd_ctl_elem_value *uncontrol); | 327 | struct snd_ctl_elem_value *uncontrol); |
327 | int snd_soc_dapm_new_control(struct snd_soc_codec *codec, | 328 | int snd_soc_dapm_new_control(struct snd_soc_dapm_context *dapm, |
328 | const struct snd_soc_dapm_widget *widget); | 329 | const struct snd_soc_dapm_widget *widget); |
329 | int snd_soc_dapm_new_controls(struct snd_soc_codec *codec, | 330 | int snd_soc_dapm_new_controls(struct snd_soc_dapm_context *dapm, |
330 | const struct snd_soc_dapm_widget *widget, | 331 | const struct snd_soc_dapm_widget *widget, |
331 | int num); | 332 | int num); |
332 | 333 | ||
333 | /* dapm path setup */ | 334 | /* dapm path setup */ |
334 | int snd_soc_dapm_new_widgets(struct snd_soc_codec *codec); | 335 | int snd_soc_dapm_new_widgets(struct snd_soc_dapm_context *dapm); |
335 | void snd_soc_dapm_free(struct snd_soc_codec *codec); | 336 | void snd_soc_dapm_free(struct snd_soc_dapm_context *dapm); |
336 | int snd_soc_dapm_add_routes(struct snd_soc_codec *codec, | 337 | int snd_soc_dapm_add_routes(struct snd_soc_dapm_context *dapm, |
337 | const struct snd_soc_dapm_route *route, int num); | 338 | const struct snd_soc_dapm_route *route, int num); |
338 | 339 | ||
339 | /* dapm events */ | 340 | /* dapm events */ |
@@ -343,17 +344,21 @@ void snd_soc_dapm_shutdown(struct snd_soc_card *card); | |||
343 | 344 | ||
344 | /* dapm sys fs - used by the core */ | 345 | /* dapm sys fs - used by the core */ |
345 | int snd_soc_dapm_sys_add(struct device *dev); | 346 | int snd_soc_dapm_sys_add(struct device *dev); |
346 | void snd_soc_dapm_debugfs_init(struct snd_soc_codec *codec); | 347 | void snd_soc_dapm_debugfs_init(struct snd_soc_dapm_context *dapm); |
347 | 348 | ||
348 | /* dapm audio pin control and status */ | 349 | /* dapm audio pin control and status */ |
349 | int snd_soc_dapm_enable_pin(struct snd_soc_codec *codec, const char *pin); | 350 | int snd_soc_dapm_enable_pin(struct snd_soc_dapm_context *dapm, |
350 | int snd_soc_dapm_disable_pin(struct snd_soc_codec *codec, const char *pin); | 351 | const char *pin); |
351 | int snd_soc_dapm_nc_pin(struct snd_soc_codec *codec, const char *pin); | 352 | int snd_soc_dapm_disable_pin(struct snd_soc_dapm_context *dapm, |
352 | int snd_soc_dapm_get_pin_status(struct snd_soc_codec *codec, const char *pin); | 353 | const char *pin); |
353 | int snd_soc_dapm_sync(struct snd_soc_codec *codec); | 354 | int snd_soc_dapm_nc_pin(struct snd_soc_dapm_context *dapm, const char *pin); |
354 | int snd_soc_dapm_force_enable_pin(struct snd_soc_codec *codec, | 355 | int snd_soc_dapm_get_pin_status(struct snd_soc_dapm_context *dapm, |
356 | const char *pin); | ||
357 | int snd_soc_dapm_sync(struct snd_soc_dapm_context *dapm); | ||
358 | int snd_soc_dapm_force_enable_pin(struct snd_soc_dapm_context *dapm, | ||
355 | const char *pin); | 359 | const char *pin); |
356 | int snd_soc_dapm_ignore_suspend(struct snd_soc_codec *codec, const char *pin); | 360 | int snd_soc_dapm_ignore_suspend(struct snd_soc_dapm_context *dapm, |
361 | const char *pin); | ||
357 | 362 | ||
358 | /* dapm widget types */ | 363 | /* dapm widget types */ |
359 | enum snd_soc_dapm_type { | 364 | enum snd_soc_dapm_type { |
@@ -425,6 +430,7 @@ struct snd_soc_dapm_widget { | |||
425 | char *sname; /* stream name */ | 430 | char *sname; /* stream name */ |
426 | struct snd_soc_codec *codec; | 431 | struct snd_soc_codec *codec; |
427 | struct list_head list; | 432 | struct list_head list; |
433 | struct snd_soc_dapm_context *dapm; | ||
428 | 434 | ||
429 | /* dapm control */ | 435 | /* dapm control */ |
430 | short reg; /* negative reg = no direct dapm */ | 436 | short reg; /* negative reg = no direct dapm */ |
@@ -461,4 +467,21 @@ struct snd_soc_dapm_widget { | |||
461 | struct list_head power_list; | 467 | struct list_head power_list; |
462 | }; | 468 | }; |
463 | 469 | ||
470 | /* DAPM context */ | ||
471 | struct snd_soc_dapm_context { | ||
472 | u32 pop_time; | ||
473 | struct list_head widgets; | ||
474 | struct list_head paths; | ||
475 | enum snd_soc_bias_level bias_level; | ||
476 | enum snd_soc_bias_level suspend_bias_level; | ||
477 | struct delayed_work delayed_work; | ||
478 | unsigned int idle_bias_off:1; /* Use BIAS_OFF instead of STANDBY */ | ||
479 | |||
480 | struct device *dev; /* from parent - for debug */ | ||
481 | struct snd_soc_codec *codec; /* parent codec */ | ||
482 | #ifdef CONFIG_DEBUG_FS | ||
483 | struct dentry *debugfs_dapm; | ||
484 | #endif | ||
485 | }; | ||
486 | |||
464 | #endif | 487 | #endif |
diff --git a/include/sound/soc.h b/include/sound/soc.h index aaf34d7cd95e..b048e08e2cc7 100644 --- a/include/sound/soc.h +++ b/include/sound/soc.h | |||
@@ -238,6 +238,7 @@ struct soc_enum; | |||
238 | struct snd_soc_ac97_ops; | 238 | struct snd_soc_ac97_ops; |
239 | struct snd_soc_jack; | 239 | struct snd_soc_jack; |
240 | struct snd_soc_jack_pin; | 240 | struct snd_soc_jack_pin; |
241 | #include <sound/soc-dapm.h> | ||
241 | 242 | ||
242 | #ifdef CONFIG_GPIOLIB | 243 | #ifdef CONFIG_GPIOLIB |
243 | struct snd_soc_jack_gpio; | 244 | struct snd_soc_jack_gpio; |
@@ -436,7 +437,6 @@ struct snd_soc_codec { | |||
436 | /* runtime */ | 437 | /* runtime */ |
437 | struct snd_ac97 *ac97; /* for ad-hoc ac97 devices */ | 438 | struct snd_ac97 *ac97; /* for ad-hoc ac97 devices */ |
438 | unsigned int active; | 439 | unsigned int active; |
439 | unsigned int idle_bias_off:1; /* Use BIAS_OFF instead of STANDBY */ | ||
440 | unsigned int cache_only:1; /* Suppress writes to hardware */ | 440 | unsigned int cache_only:1; /* Suppress writes to hardware */ |
441 | unsigned int cache_sync:1; /* Cache needs to be synced to hardware */ | 441 | unsigned int cache_sync:1; /* Cache needs to be synced to hardware */ |
442 | unsigned int suspended:1; /* Codec is in suspend PM state */ | 442 | unsigned int suspended:1; /* Codec is in suspend PM state */ |
@@ -452,12 +452,7 @@ struct snd_soc_codec { | |||
452 | void *reg_cache; | 452 | void *reg_cache; |
453 | 453 | ||
454 | /* dapm */ | 454 | /* dapm */ |
455 | u32 pop_time; | 455 | struct snd_soc_dapm_context dapm; |
456 | struct list_head dapm_widgets; | ||
457 | struct list_head dapm_paths; | ||
458 | enum snd_soc_bias_level bias_level; | ||
459 | enum snd_soc_bias_level suspend_bias_level; | ||
460 | struct delayed_work delayed_work; | ||
461 | 456 | ||
462 | #ifdef CONFIG_DEBUG_FS | 457 | #ifdef CONFIG_DEBUG_FS |
463 | struct dentry *debugfs_codec_root; | 458 | struct dentry *debugfs_codec_root; |