At Tue, 21 Apr 2015 16:05:41 +0800, Jie Yang wrote:
For phantom jack, we won't create real jack device, but jack kctl may be needed.
Here, we extend snd_jack_new() to support phantom jack creating: pass in a bool param for [non-]phantom flag, and a non-Null param (struct snd_jack_kctl **) to indicate that we need create kctl at this jack creating stage.
We can also add kctl to a jack after the jack is created.
This make the integrating the existing HDA jack kctl and soc jack kctl possible.
Signed-off-by: Jie Yang yang.jie@intel.com
include/sound/jack.h | 4 +-- sound/core/jack.c | 56 +++++++++++++++++++++++++---------------- sound/pci/hda/hda_jack.c | 2 +- sound/pci/oxygen/xonar_wm87x6.c | 2 +- sound/soc/soc-jack.c | 2 +- 5 files changed, 39 insertions(+), 27 deletions(-)
diff --git a/include/sound/jack.h b/include/sound/jack.h index 9781e75..34b6849 100644 --- a/include/sound/jack.h +++ b/include/sound/jack.h @@ -93,7 +93,7 @@ struct snd_jack_kctl { #ifdef CONFIG_SND_JACK
int snd_jack_new(struct snd_card *card, const char *id, int type,
struct snd_jack **jack);
struct snd_jack **jack, bool phantom_jack, struct snd_jack_kctl **jjack_kctl);
int snd_jack_add_new_kctl(struct snd_jack *jack, const char * name, int mask); void snd_jack_set_parent(struct snd_jack *jack, struct device *parent); int snd_jack_set_key(struct snd_jack *jack, enum snd_jack_types type, @@ -103,7 +103,7 @@ void snd_jack_report(struct snd_jack *jack, int status);
#else static inline int snd_jack_new(struct snd_card *card, const char *id, int type,
struct snd_jack **jack)
struct snd_jack **jack, bool phantom_jack, struct snd_jack_kctl **jjack_kctl)
{ return 0; } diff --git a/sound/core/jack.c b/sound/core/jack.c index b13d0b1..edd55c8 100644 --- a/sound/core/jack.c +++ b/sound/core/jack.c @@ -198,6 +198,10 @@ EXPORT_SYMBOL(snd_jack_add_new_kctl);
- @type: a bitmask of enum snd_jack_type values that can be detected by
this jack
- @jjack: Used to provide the allocated jack object to the caller.
- @phantom_jack: for phantom jack, only create needed kctl, won't create
real jackdevice
- @jjack_kctl: create kctl if non-NULL pointer passed in, and provide it to
the caller. also add it to the non-phantom jack kctl list
- Creates a new jack object.
@@ -205,7 +209,7 @@ EXPORT_SYMBOL(snd_jack_add_new_kctl);
- On success @jjack will be initialised.
*/ int snd_jack_new(struct snd_card *card, const char *id, int type,
struct snd_jack **jjack)
struct snd_jack **jjack, bool phantom_jack, struct snd_jack_kctl **jjack_kctl)
The caller doesn't need to get struct snd_jack_kctl. Instead, it's better to get struct snd_kcontrol. In that way, you can move the definition of struct snd_jack_kctl locally into jack.c. It's merely an internal object only for jack after all.
{ struct snd_jack *jack; int err; @@ -216,35 +220,43 @@ int snd_jack_new(struct snd_card *card, const char *id, int type, .dev_disconnect = snd_jack_dev_disconnect, };
- jack = kzalloc(sizeof(struct snd_jack), GFP_KERNEL);
- if (jack == NULL)
return -ENOMEM;
- if (jjack_kctl)
*jjack_kctl = snd_jack_kctl_new(card, id, type);
- jack->id = kstrdup(id, GFP_KERNEL);
- /* don't creat real jack device for phantom jack */
- if (!phantom_jack) {
jack = kzalloc(sizeof(struct snd_jack), GFP_KERNEL);
We need to create a jack object even for a phantom jack. It's the place managing the list of kctls. Otherwise we can't track these kctls.
Just skip creating jack->input_dev for phantom jacks.
Takashi