From patchwork Tue May 31 08:59:46 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kuninori Morimoto X-Patchwork-Id: 9143835 X-Patchwork-Delegate: geert@linux-m68k.org Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id B8E9160757 for ; Tue, 31 May 2016 08:59:54 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id AD48F1FF81 for ; Tue, 31 May 2016 08:59:54 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id A217327E72; Tue, 31 May 2016 08:59:54 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id CD1C21FF81 for ; Tue, 31 May 2016 08:59:53 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756888AbcEaI7x (ORCPT ); Tue, 31 May 2016 04:59:53 -0400 Received: from relmlor2.renesas.com ([210.160.252.172]:50689 "EHLO relmlie1.idc.renesas.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1756899AbcEaI7v (ORCPT ); Tue, 31 May 2016 04:59:51 -0400 Received: from unknown (HELO relmlir3.idc.renesas.com) ([10.200.68.153]) by relmlie1.idc.renesas.com with ESMTP; 31 May 2016 17:59:49 +0900 Received: from relmlac4.idc.renesas.com (relmlac4.idc.renesas.com [10.200.69.24]) by relmlir3.idc.renesas.com (Postfix) with ESMTP id 838523BC7B; Tue, 31 May 2016 17:59:49 +0900 (JST) Received: by relmlac4.idc.renesas.com (Postfix, from userid 0) id 62305480A5; Tue, 31 May 2016 17:59:49 +0900 (JST) Received: from relmlac4.idc.renesas.com (localhost [127.0.0.1]) by relmlac4.idc.renesas.com (Postfix) with ESMTP id 5B748480A3; Tue, 31 May 2016 17:59:49 +0900 (JST) Received: from relmlii1.idc.renesas.com [10.200.68.65] by relmlac4.idc.renesas.com with ESMTP id TAU04160; Tue, 31 May 2016 17:59:49 +0900 X-IronPort-AV: E=Sophos;i="5.22,559,1449500400"; d="scan'";a="211980178" Received: from mail-pu1apc01lp0021.outbound.protection.outlook.com (HELO APC01-PU1-obe.outbound.protection.outlook.com) ([65.55.88.21]) by relmlii1.idc.renesas.com with ESMTP/TLS/AES256-SHA; 31 May 2016 17:59:48 +0900 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=renesasgroup.onmicrosoft.com; s=selector1-renesas-com; h=From:To:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=wvtCJ57WkNew/bDV0hDFU/YMVgrKe3rqBfsKbJ5dHuQ=; b=NvNf5voBtPl/W7yO/hpLYUrOqysrBRxNzukwn8mDKDpdhc2ANN/W70EtW9u062XmBp7FO9/0AG8NjInl/hp+RFB/5SWXTE4CqBRyG2dFqaLK6YFEepWDWZ7XNf9abjnskOyRfDT8vp/YRxt1sFHhkscpQNxs1vuSfJnfOmrPZTU= Authentication-Results: kernel.org; dkim=none (message not signed) header.d=none; kernel.org; dmarc=none action=none header.from=renesas.com; Received: from morimoto-PC.renesas.com (211.11.155.144) by HK2PR06MB1697.apcprd06.prod.outlook.com (10.167.73.11) with Microsoft SMTP Server (TLS) id 15.1.506.9; Tue, 31 May 2016 08:59:46 +0000 Message-ID: <87bn3msj5o.wl%kuninori.morimoto.gx@renesas.com> From: Kuninori Morimoto Subject: [PATCH 03/39 v2] ASoC: simple-card: add new asoc_simple_jack and use it User-Agent: Wanderlust/2.15.9 Emacs/24.3 Mule/6.0 To: Mark Brown CC: Linux-ALSA , Liam Girdwood , Simon , In-Reply-To: <87fusysjam.wl%kuninori.morimoto.gx@renesas.com> References: <87fusysjam.wl%kuninori.morimoto.gx@renesas.com> MIME-Version: 1.0 (generated by SEMI-EPG 1.14.7 - "Harue") Date: Tue, 31 May 2016 08:59:46 +0000 X-Originating-IP: [211.11.155.144] X-ClientProxiedBy: TY1PR01CA0106.jpnprd01.prod.outlook.com (10.167.154.24) To HK2PR06MB1697.apcprd06.prod.outlook.com (10.167.73.11) X-MS-Office365-Filtering-Correlation-Id: 98ee7aa9-ebb9-4b4d-67ff-08d38931eaab X-Microsoft-Exchange-Diagnostics: 1; HK2PR06MB1697; 2:ffs1HdgC+pWc8nyBESi66cx7wsxlaAiRvrmMqO9gdYahxMCiMIP1/jCP0SQnEpiobN2UAQukKEZryaQ5RdJB3Pq8hpaqg6/B/loIeRsGtmjFB8I1wnLo0ZzmeoCMjW0JIIAm6LtZN+w8UyKvQpunsmBJxRiZ4igHsVhOYj5llFHGZTBC0xchCWL/0EyEBObx; 3:o+QGdDHHMzC8tNya5KsECMMQPH8CXhaIDTe0OMLSmsaW+5h5jqSXzF3WI8oUC3HpKNy75CR3AmBd7s1GvtMr2CPzzZ6oQzGPs4aIpybIUj1EDMnEgD6369+FrM0iNPai X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:HK2PR06MB1697; X-Microsoft-Exchange-Diagnostics: 1; HK2PR06MB1697; 25:At3wu4WmyqwZ5ru346oTylCC7HH4AJZFjPiBIn4aoGnBslUrexFPMcjK08K4hfOfNJPKHPjlW8/tYnvwQH7W1675rT8bmDWG+yUqeq2Ic/NF2ETA1grxdCmagkYGm2bKp6Ak8JONXsJE1SJrV7+xSIIkxvnEO0K2gLg3PXFE82hU1iR7OdY0rkT9zIf5ENvSx3X90RfDmgJqRUqqUAX5Q7AcadV5QsiSw/KJIwPaldMCABCURG5wuZPFfBHCLI12JHhEoEVDOsh8cwgWvSf98TLcxDpr2GP6h5Vc6BgQFSNZhHYLg+lJ6tXxAzcYSDhxfv/LA2ovp0W2LYTMD/8kTv4KImYp31okBd0hYfJtUyYLLl3OyWEtYQD2os3piiBT4nMcCTB6s5ANn91Q1IvpehIah4v+i5SF44603tNYEXT7qFYxuOvgCMaQeZpwGymYnuvsBDLzu0zIgUMowD7NSlbGQKveUjjmgL0NDbt01M6Szd9cBEdPV0/lpqKCBbFXDMKEE+eY1AyUJCJv1I4zu5dHfV36+Otmvi7zNnI1xHLn6pWTteQDyIRIJQ5DAe5P1CQ8jKhb1HPIcwnKbW1kno1iDeCHhPYZKjDtXrVdUbyuyf4wux5t7SKNA91QH6QpiKh9DtzOMfr0MOUi2X4aTp6e849W+gktqSPCjDrl4S4xRiR/8wY647PqMV4uf2GJ X-Microsoft-Exchange-Diagnostics: 1; HK2PR06MB1697; 20:NxGBw8FSr5AgUkHlSdQgQcoZsduJWi4BvoPkpBB+2SqXZ67B3Q1PQB0jQeNBELETt26i5Kgl+A7HR6Uwkvh2KYRcU/QxBJarl0IUcyJAIvt9NvQcMFNb1EixNRb7D02rnSO7qY7bHFtYw0etJIzjf5xDrKY4N6EPCvUvxvqwq5D9Rr5CttwQeW4Gj5x3GEDHQVSJ8pMVHVJnMRlT/h6tOFB4jdLsQUwNKa0iAQyfTCaoeEHaH3zRMcnNnsb9bzEFyjixAIVOTUEx/gjsaNZiu1zIuY7dz/6UB0xox329QYDBbfqSnnVTGWSNTEZXggmGxJpHjAhqugRxBcjIljevSs73eb8sV+wocKUnjSKyLnVHf8A2is3TTKeK0tWUg6aXUI9/zrQ41E9ctFoaKBwf1ZVtu+XWfBIg18s5bC5cM71ac2z3HbVgb+TnpJdsE+Gi6HwglDIeFXu8mmid+28v6tLXdbuoct7/7Nt29+P8J13HTPGxAHR+KCbKskq7uve+; 4:NnGH4NL9tVLgbCMltTP4hJiQNbYPFFXB4oYWAGobrn8K3dqD6HSiaFTkS747G3P5w4ZE2Z65PtOUbYkvZBxQmBXKs+0Wocn722uQZMDUl2nW1CCPNN0RyLMN7t5j7mcCXaHPqMW+CKUzDRiR7iLIUTxPwPhIlouP9sDo1K0iyjNJpHBVMklv1i21K4wT05+WpVsoVve6egcfn0Metm5dnBKM9OJqaW5zG3D8JzgWCaVEcIFA0UG/LusNnegkvYLCDA4ZXKloNFotWffY28Cgi3hOAOtv1xlJD2FceScmR+MTOz8YnI1Jz6PBjaUJBm/brWrF71Ivi8JS4UnLZeoHgygAEQ4pzjh/LpuH7tLv+K0SRRMs6PcXbuy+TVa09In3t9NXPC7gPcLHKUXF1/9E2w== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004)(2401047)(8121501046)(5005006)(10201501046)(3002001)(6055026); SRVR:HK2PR06MB1697; BCL:0; PCL:0; RULEID:; SRVR:HK2PR06MB1697; X-Forefront-PRVS: 095972DF2F X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(4630300001)(6009001)(46406003)(50986999)(92566002)(4001350100001)(8676002)(33646002)(81166006)(77096005)(83506001)(19580405001)(86362001)(5004730100002)(6116002)(586003)(3846002)(19580395003)(76176999)(110136002)(5008740100001)(189998001)(50466002)(36756003)(23726003)(54356999)(66066001)(47776003)(4326007)(2906002)(53416004)(42186005)(2950100001)(229853001)(16060500001); DIR:OUT; SFP:1102; SCL:1; SRVR:HK2PR06MB1697; H:morimoto-PC.renesas.com; FPR:; SPF:None; MLV:sfv; LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; HK2PR06MB1697; 23:RZ4Tqanw7OBz2AtNLkq1oHbPONyY1yqD1g12BBkEc?= =?us-ascii?Q?QzpBH63h4ODBcypkV3qZH5eAt4m7sgM5nKRhfT/0jrAyevqqc2KrZO65IzZB?= =?us-ascii?Q?c1xJeVaDshIFOonBUwwcMUUdTFEQDq3qLctRWgEOR5SGVsQHM7GuADlA7GH+?= =?us-ascii?Q?fONgrz1UCPoB339EQ4r4R/LDrGgvlfkq2oMMmqq6ySWkbsF0f2GKJCiBuvZp?= =?us-ascii?Q?0DIbq/UI6s8IVtKGR8PiZBbwC4Djh4sBLUz70PqpZ6NExQaJPSKexINu+l7M?= =?us-ascii?Q?ciUBcEfo8/DAGcoc+4AbuuDCOxQZY/M+DVHtV7ES9w41qKbG/IS0L0bnA39J?= =?us-ascii?Q?oLiIIwn8B5qRe6R6kA/CEaEgvRXa5q/LlppS53bBbz9fKJ9LXnEAYwmXwPh4?= =?us-ascii?Q?L20pFOsNCNE2ZPbeyWBfSO20FzbNwcDl1nRgude2vgCfQwUgBjO+Rn9a6xN+?= =?us-ascii?Q?ZVNfavSiHRcZt8lhjxVxfz90UO4AON+j1gvv3hebAkEKiL0ej30SZEluhvxB?= =?us-ascii?Q?a1FMyYwupIxNF3HhSPrIm2U3TWkbLTmOlnIrNOGUoIH68RbyV1XnBRkggUsD?= =?us-ascii?Q?8jcMNtR87G7IUc3RQ8bzhROQ2zfKzjaKanZadvh4KrksPD9iw/k2BzDippE5?= =?us-ascii?Q?EsgApCaC2Meaz8ynYo5ITy1JcLJW5hJtW6YUqVwuVgJCCXhhivOz01PQW1Xi?= =?us-ascii?Q?KGShdU0gwSVHc+ig5h9oVGfW0mhNIHz50Riqt0SklnzmD69TGTXNq+4zK9ag?= =?us-ascii?Q?WSkug2dAY6YvpC2+knk2W0bguSsmmTIp5ZwhYOQqlg/v8IUJFGFoziBir4GX?= =?us-ascii?Q?WE7NhMQ5Q3alVXUBXQKIw8bbSVjytfCn7rlEtoRSbSbMeVxqAGZxd5gOf8pz?= =?us-ascii?Q?WLEsz6Yx0Qpn+5guI5jdnP01TV1eGriFuFtBWlGjJ0eJZErgWJrL7W1VnrLo?= =?us-ascii?Q?k715X4ILhC+lzo9YdJ/xjvlSivk26q9YORxxlay2Q=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1; HK2PR06MB1697; 5:oH0a5YmMCf7boM20tndqLzMENWaIUDoYPWvJ84EzsTRv8H5jyOJCjYdj3Hh+sig8cjYzVPIH/qkg3W5AHBfA8stoTTCt0k4hDyBRog0UKX2xcbNX0SkLFFDQwvelaKrRD0eGzCokXyP1OGJ8zyBVIQ==; 24:QI56WmN9mKOx/K6Yn15MToasL0uONvZyGA1MlJFtR8Kga6ncjUCznv5j3l/JuTKotMGRyhONbzPtzQnGQBqi13ox6CiSFvPCgfMUOU/HxXA=; 7:5NiO1MMYM5iAlbKRnE+haDEHTC7rYwTSKpDzYxxmdq9ATDb4roSZ2cv1DGaCO+8zSzBdt0vPawJgslLUT+7Xd6XVGAvPEFmQxrZ1PabhhHcsapoLqPDnJkN2Qpb3dGK97oX6/mpHzi4bLanCRl2FMehQ0QF3qM2FX45wgZt0ImYiqza6hNCjJnS9+dnKvaA9; 20:TGm2jOwYmE2NqfEtwaO2vJR9J8q/yOsC52GXrtToQYcv1BlAXX8vurLPj0/l03PRGu8z1gPjifXCULCSLBGHee8fi8gN8PBMtN6/u7wjjPkL+Gk1i84mBUn5uENuBYw+1S7pCkZ1NILOTySWt8UMmyuBOvKdwZk7SyIDSRrqYx8= SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: renesas.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 31 May 2016 08:59:46.8501 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: HK2PR06MB1697 Sender: linux-renesas-soc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-renesas-soc@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Kuninori Morimoto Current simple-card supports snd_soc_jack/pin/gpio. These code are very similar, but driver has verbosity code. So, this patch adds new snd_soc_jack and cleanups code Signed-off-by: Kuninori Morimoto --- sound/soc/generic/simple-card.c | 153 ++++++++++++++++++++-------------------- 1 file changed, 78 insertions(+), 75 deletions(-) diff --git a/sound/soc/generic/simple-card.c b/sound/soc/generic/simple-card.c index b6e6d9a..8d0311c 100644 --- a/sound/soc/generic/simple-card.c +++ b/sound/soc/generic/simple-card.c @@ -21,6 +21,12 @@ #include #include +struct asoc_simple_jack { + struct snd_soc_jack jack; + struct snd_soc_jack_pin pin; + struct snd_soc_jack_gpio gpio; +}; + struct simple_card_data { struct snd_soc_card snd_card; struct simple_dai_props { @@ -29,10 +35,8 @@ struct simple_card_data { unsigned int mclk_fs; } *dai_props; unsigned int mclk_fs; - int gpio_hp_det; - int gpio_hp_det_invert; - int gpio_mic_det; - int gpio_mic_det_invert; + struct asoc_simple_jack hp_jack; + struct asoc_simple_jack mic_jack; struct snd_soc_dai_link dai_link[]; /* dynamically allocated */ }; @@ -42,6 +46,67 @@ struct simple_card_data { #define PREFIX "simple-audio-card," +#define asoc_simple_card_init_hp(card, sjack, prefix)\ + asoc_simple_card_init_jack(card, sjack, 1, prefix) +#define asoc_simple_card_init_mic(card, sjack, prefix)\ + asoc_simple_card_init_jack(card, sjack, 0, prefix) +static int asoc_simple_card_init_jack(struct snd_soc_card *card, + struct asoc_simple_jack *sjack, + int is_hp, char *prefix) +{ + struct device *dev = card->dev; + enum of_gpio_flags flags; + char prop[128]; + char *pin_name; + char *gpio_name; + int mask; + int det; + + sjack->gpio.gpio = -ENOENT; + + if (is_hp) { + snprintf(prop, sizeof(prop), "%shp-det-gpio", prefix); + pin_name = "Headphones"; + gpio_name = "Headphone detection"; + mask = SND_JACK_HEADPHONE; + } else { + snprintf(prop, sizeof(prop), "%smic-det-gpio", prefix); + pin_name = "Mic Jack"; + gpio_name = "Mic detection"; + mask = SND_JACK_MICROPHONE; + } + + det = of_get_named_gpio_flags(dev->of_node, prop, 0, &flags); + if (det == -EPROBE_DEFER) + return -EPROBE_DEFER; + + if (gpio_is_valid(det)) { + sjack->pin.pin = pin_name; + sjack->pin.mask = mask; + + sjack->gpio.name = gpio_name; + sjack->gpio.report = mask; + sjack->gpio.gpio = det; + sjack->gpio.invert = !!(flags & OF_GPIO_ACTIVE_LOW); + sjack->gpio.debounce_time = 150; + + snd_soc_card_jack_new(card, pin_name, mask, + &sjack->jack, + &sjack->pin, 1); + + snd_soc_jack_add_gpios(&sjack->jack, 1, + &sjack->gpio); + } + + return 0; +} + +static void asoc_simple_card_remove_jack(struct asoc_simple_jack *sjack) +{ + if (gpio_is_valid(sjack->gpio.gpio)) + snd_soc_jack_free_gpios(&sjack->jack, 1, &sjack->gpio); +} + static int asoc_simple_card_startup(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; @@ -112,32 +177,6 @@ static struct snd_soc_ops asoc_simple_card_ops = { .hw_params = asoc_simple_card_hw_params, }; -static struct snd_soc_jack simple_card_hp_jack; -static struct snd_soc_jack_pin simple_card_hp_jack_pins[] = { - { - .pin = "Headphones", - .mask = SND_JACK_HEADPHONE, - }, -}; -static struct snd_soc_jack_gpio simple_card_hp_jack_gpio = { - .name = "Headphone detection", - .report = SND_JACK_HEADPHONE, - .debounce_time = 150, -}; - -static struct snd_soc_jack simple_card_mic_jack; -static struct snd_soc_jack_pin simple_card_mic_jack_pins[] = { - { - .pin = "Mic Jack", - .mask = SND_JACK_MICROPHONE, - }, -}; -static struct snd_soc_jack_gpio simple_card_mic_jack_gpio = { - .name = "Mic detection", - .report = SND_JACK_MICROPHONE, - .debounce_time = 150, -}; - static int __asoc_simple_card_dai_init(struct snd_soc_dai *dai, struct asoc_simple_dai *set) { @@ -186,30 +225,14 @@ static int asoc_simple_card_dai_init(struct snd_soc_pcm_runtime *rtd) if (ret < 0) return ret; - if (gpio_is_valid(priv->gpio_hp_det)) { - snd_soc_card_jack_new(rtd->card, "Headphones", - SND_JACK_HEADPHONE, - &simple_card_hp_jack, - simple_card_hp_jack_pins, - ARRAY_SIZE(simple_card_hp_jack_pins)); - - simple_card_hp_jack_gpio.gpio = priv->gpio_hp_det; - simple_card_hp_jack_gpio.invert = priv->gpio_hp_det_invert; - snd_soc_jack_add_gpios(&simple_card_hp_jack, 1, - &simple_card_hp_jack_gpio); - } + ret = asoc_simple_card_init_hp(rtd->card, &priv->hp_jack, PREFIX); + if (ret < 0) + return ret; + + ret = asoc_simple_card_init_mic(rtd->card, &priv->hp_jack, PREFIX); + if (ret < 0) + return ret; - if (gpio_is_valid(priv->gpio_mic_det)) { - snd_soc_card_jack_new(rtd->card, "Mic Jack", - SND_JACK_MICROPHONE, - &simple_card_mic_jack, - simple_card_mic_jack_pins, - ARRAY_SIZE(simple_card_mic_jack_pins)); - simple_card_mic_jack_gpio.gpio = priv->gpio_mic_det; - simple_card_mic_jack_gpio.invert = priv->gpio_mic_det_invert; - snd_soc_jack_add_gpios(&simple_card_mic_jack, 1, - &simple_card_mic_jack_gpio); - } return 0; } @@ -447,7 +470,6 @@ static int asoc_simple_card_parse_of(struct device_node *node, struct simple_card_data *priv) { struct device *dev = simple_priv_to_dev(priv); - enum of_gpio_flags flags; u32 val; int ret; @@ -503,18 +525,6 @@ static int asoc_simple_card_parse_of(struct device_node *node, return ret; } - priv->gpio_hp_det = of_get_named_gpio_flags(node, - PREFIX "hp-det-gpio", 0, &flags); - priv->gpio_hp_det_invert = !!(flags & OF_GPIO_ACTIVE_LOW); - if (priv->gpio_hp_det == -EPROBE_DEFER) - return -EPROBE_DEFER; - - priv->gpio_mic_det = of_get_named_gpio_flags(node, - PREFIX "mic-det-gpio", 0, &flags); - priv->gpio_mic_det_invert = !!(flags & OF_GPIO_ACTIVE_LOW); - if (priv->gpio_mic_det == -EPROBE_DEFER) - return -EPROBE_DEFER; - if (!priv->snd_card.name) priv->snd_card.name = priv->snd_card.dai_link->name; @@ -564,9 +574,6 @@ static int asoc_simple_card_probe(struct platform_device *pdev) priv->snd_card.dai_link = dai_link; priv->snd_card.num_links = num_links; - priv->gpio_hp_det = -ENOENT; - priv->gpio_mic_det = -ENOENT; - /* Get room for the other properties */ priv->dai_props = devm_kzalloc(dev, sizeof(*priv->dai_props) * num_links, @@ -633,12 +640,8 @@ static int asoc_simple_card_remove(struct platform_device *pdev) struct snd_soc_card *card = platform_get_drvdata(pdev); struct simple_card_data *priv = snd_soc_card_get_drvdata(card); - if (gpio_is_valid(priv->gpio_hp_det)) - snd_soc_jack_free_gpios(&simple_card_hp_jack, 1, - &simple_card_hp_jack_gpio); - if (gpio_is_valid(priv->gpio_mic_det)) - snd_soc_jack_free_gpios(&simple_card_mic_jack, 1, - &simple_card_mic_jack_gpio); + asoc_simple_card_remove_jack(&priv->hp_jack); + asoc_simple_card_remove_jack(&priv->mic_jack); return asoc_simple_card_unref(card); }