From patchwork Tue Apr 21 08:05:41 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Jie, Yang" X-Patchwork-Id: 6246061 Return-Path: X-Original-To: patchwork-alsa-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 724B79F1BE for ; Tue, 21 Apr 2015 08:03:48 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 48B5520429 for ; Tue, 21 Apr 2015 08:03:43 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) by mail.kernel.org (Postfix) with ESMTP id E6F67203F7 for ; Tue, 21 Apr 2015 08:03:41 +0000 (UTC) Received: by alsa0.perex.cz (Postfix, from userid 1000) id E307D266186; Tue, 21 Apr 2015 10:03:40 +0200 (CEST) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,NO_DNS_FOR_FROM, UNPARSEABLE_RELAY autolearn=no version=3.3.1 Received: from alsa0.perex.cz (localhost [IPv6:::1]) by alsa0.perex.cz (Postfix) with ESMTP id DB31B26059D; Tue, 21 Apr 2015 10:02:44 +0200 (CEST) X-Original-To: alsa-devel@alsa-project.org Delivered-To: alsa-devel@alsa-project.org Received: by alsa0.perex.cz (Postfix, from userid 1000) id E6CFB265FD1; Tue, 21 Apr 2015 10:02:42 +0200 (CEST) Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by alsa0.perex.cz (Postfix) with ESMTP id 4991F26059D for ; Tue, 21 Apr 2015 10:02:36 +0200 (CEST) Received: from orsmga002.jf.intel.com ([10.7.209.21]) by fmsmga101.fm.intel.com with ESMTP; 21 Apr 2015 01:02:35 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.11,614,1422950400"; d="scan'208";a="716760764" Received: from keyon-u1310.sh.intel.com ([10.239.13.15]) by orsmga002.jf.intel.com with ESMTP; 21 Apr 2015 01:02:34 -0700 From: Jie Yang To: tiwai@suse.de Date: Tue, 21 Apr 2015 16:05:41 +0800 Message-Id: <1429603545-21063-4-git-send-email-yang.jie@intel.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1429603545-21063-1-git-send-email-yang.jie@intel.com> References: <1429603545-21063-1-git-send-email-yang.jie@intel.com> Cc: alsa-devel@alsa-project.org, broonie@kernel.org, liam.r.girdwood@intel.com Subject: [alsa-devel] [PATCH v7 3/7] ALSA: jack: extend snd_jack_new to support phantom jack X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "Alsa-devel mailing list for ALSA developers - http://www.alsa-project.org" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: alsa-devel-bounces@alsa-project.org Sender: alsa-devel-bounces@alsa-project.org X-Virus-Scanned: ClamAV using ClamSMTP 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 --- 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) { 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); + if (jack == NULL) + return -ENOMEM; - jack->input_dev = input_allocate_device(); - if (jack->input_dev == NULL) { - err = -ENOMEM; - goto fail_input; - } + jack->id = kstrdup(id, GFP_KERNEL); + + jack->input_dev = input_allocate_device(); + if (jack->input_dev == NULL) { + err = -ENOMEM; + goto fail_input; + } - jack->input_dev->phys = "ALSA"; + jack->input_dev->phys = "ALSA"; - jack->type = type; + jack->type = type; - for (i = 0; i < SND_JACK_SWITCH_TYPES; i++) - if (type & (1 << i)) - input_set_capability(jack->input_dev, EV_SW, - jack_switch_types[i]); + for (i = 0; i < SND_JACK_SWITCH_TYPES; i++) + if (type & (1 << i)) + input_set_capability(jack->input_dev, EV_SW, + jack_switch_types[i]); - err = snd_device_new(card, SNDRV_DEV_JACK, jack, &ops); - if (err < 0) - goto fail_input; + err = snd_device_new(card, SNDRV_DEV_JACK, jack, &ops); + if (err < 0) + goto fail_input; - jack->card = card; - INIT_LIST_HEAD(&jack->kctl_list); + jack->card = card; + INIT_LIST_HEAD(&jack->kctl_list); - *jjack = jack; + if (jjack_kctl && *jjack_kctl) + snd_jack_kctl_add(jack, *jjack_kctl); + *jjack = jack; + } return 0; diff --git a/sound/pci/hda/hda_jack.c b/sound/pci/hda/hda_jack.c index a046e2f..f45c488 100644 --- a/sound/pci/hda/hda_jack.c +++ b/sound/pci/hda/hda_jack.c @@ -417,7 +417,7 @@ static int __snd_hda_jack_add_kctl(struct hda_codec *codec, hda_nid_t nid, if (!phantom_jack) { jack->type = get_input_jack_type(codec, nid); err = snd_jack_new(codec->bus->card, name, jack->type, - &jack->jack); + &jack->jack, false, NULL); if (err < 0) return err; jack->jack->private_data = jack; diff --git a/sound/pci/oxygen/xonar_wm87x6.c b/sound/pci/oxygen/xonar_wm87x6.c index 6ce6860..a37450b 100644 --- a/sound/pci/oxygen/xonar_wm87x6.c +++ b/sound/pci/oxygen/xonar_wm87x6.c @@ -286,7 +286,7 @@ static void xonar_ds_init(struct oxygen *chip) xonar_enable_output(chip); snd_jack_new(chip->card, "Headphone", - SND_JACK_HEADPHONE, &data->hp_jack); + SND_JACK_HEADPHONE, &data->hp_jack, false, NULL); xonar_ds_handle_hp_jack(chip); snd_component_add(chip->card, "WM8776"); diff --git a/sound/soc/soc-jack.c b/sound/soc/soc-jack.c index 9f60c25..836368b 100644 --- a/sound/soc/soc-jack.c +++ b/sound/soc/soc-jack.c @@ -48,7 +48,7 @@ int snd_soc_card_jack_new(struct snd_soc_card *card, const char *id, int type, INIT_LIST_HEAD(&jack->jack_zones); BLOCKING_INIT_NOTIFIER_HEAD(&jack->notifier); - ret = snd_jack_new(card->snd_card, id, type, &jack->jack); + ret = snd_jack_new(card->snd_card, id, type, &jack->jack, false, NULL); if (ret) return ret;