From patchwork Thu Jul 15 07:58:23 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379211 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id B2C22C07E96 for ; Thu, 15 Jul 2021 08:02:35 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 0BFFB610C7 for ; Thu, 15 Jul 2021 08:02:35 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 0BFFB610C7 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id 93F5E167F; Thu, 15 Jul 2021 10:01:43 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 93F5E167F DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626336153; bh=2BGYWrXBGZJ2umOkUHgE/h0NhuwHvsi2h/cJRb6EGOY=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=E9ektJSp92ZMOSwASAx2K7mHo6yg6t0YKCNH3QX/kbxwhnyaf2uCggvSN3g53q/z0 Z4ykfDC29pRodobuChynbnSYe9puNGf7IEQ6NjujlOPe/h5pGzKCjuuliJzNGMFxUL tsnbloBY96UCJf2iX6SHX4JOd+LvKSRgjU8pSIKc= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id D18EFF80533; Thu, 15 Jul 2021 10:00:13 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id 4DA91F80519; Thu, 15 Jul 2021 10:00:08 +0200 (CEST) Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 0B6CDF8013C for ; Thu, 15 Jul 2021 09:59:50 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 0B6CDF8013C Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="fMADzOWS"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="AOuTxo+9" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out1.suse.de (Postfix) with ESMTP id A11782284C for ; Thu, 15 Jul 2021 07:59:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626335990; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=5joqZEry4ixJz2fagLW3ZFdGm3Atk1p7KkBSww/qRU4=; b=fMADzOWSQ0vQQx/NDbtByGNX+ecegqdMDLDEi5prSpBusk7Na5n/2CB2j9XBbwjv955UwN QDhCGkU1hUmt6poqwH1Uhz2beAcBCJvjbsnVd5+aQAjOOZYwqq4X/8M/70z2lPmSNnN8ot 2F9CeB2K2p6YWU4xTDyjuqdapXFJ7lg= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626335990; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=5joqZEry4ixJz2fagLW3ZFdGm3Atk1p7KkBSww/qRU4=; b=AOuTxo+9dfuqiDTQlf5S1h7QsKH1AoB7ifL7Z4/8HthceCsItjD/qUumiXTxBjVOHdiApP nY1bMwPriRUp3pBQ== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id 8FC1DA3B9A; Thu, 15 Jul 2021 07:59:50 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 01/79] ALSA: core: Add device-managed page allocator helper Date: Thu, 15 Jul 2021 09:58:23 +0200 Message-Id: <20210715075941.23332-2-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This is a preparation for allowing devres usages more widely in various sound drivers. As a first step, this patch adds a new allocator function, snd_devm_alloc_pages(), to manage the allocated pages via devres, so that the pages will be automagically released as device unbinding. Unlike the old snd_dma_alloc_pages(), the new function returns directly the snd_dma_buffer pointer. The caller needs NULL-check for the allocation error appropriately. Also, since a real device pointer is mandatory for devres, SNDRV_DMA_TYPE_CONTINUOUS or SNDRV_DMA_TYPE_VMALLOC type can't be used for this function. Signed-off-by: Takashi Iwai --- include/sound/memalloc.h | 4 ++++ sound/core/memalloc.c | 46 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/include/sound/memalloc.h b/include/sound/memalloc.h index 44d87775b352..d22c9387b2ba 100644 --- a/include/sound/memalloc.h +++ b/include/sound/memalloc.h @@ -79,5 +79,9 @@ struct page *snd_sgbuf_get_page(struct snd_dma_buffer *dmab, size_t offset); unsigned int snd_sgbuf_get_chunk_size(struct snd_dma_buffer *dmab, unsigned int ofs, unsigned int size); +/* device-managed memory allocator */ +struct snd_dma_buffer *snd_devm_alloc_pages(struct device *dev, int type, + size_t size); + #endif /* __SOUND_MEMALLOC_H */ diff --git a/sound/core/memalloc.c b/sound/core/memalloc.c index 83b79edfa52d..3a78fdad1ab4 100644 --- a/sound/core/memalloc.c +++ b/sound/core/memalloc.c @@ -127,6 +127,52 @@ void snd_dma_free_pages(struct snd_dma_buffer *dmab) } EXPORT_SYMBOL(snd_dma_free_pages); +/* called by devres */ +static void __snd_release_pages(struct device *dev, void *res) +{ + snd_dma_free_pages(res); +} + +/** + * snd_devm_alloc_pages - allocate the buffer and manage with devres + * @dev: the device pointer + * @type: the DMA buffer type + * @size: the buffer size to allocate + * + * Allocate buffer pages depending on the given type and manage using devres. + * The pages will be released automatically at the device removal. + * + * Unlike snd_dma_alloc_pages(), this function requires the real device pointer, + * hence it can't work with SNDRV_DMA_TYPE_CONTINUOUS or + * SNDRV_DMA_TYPE_VMALLOC type. + * + * The function returns the snd_dma_buffer object at success, or NULL if failed. + */ +struct snd_dma_buffer * +snd_devm_alloc_pages(struct device *dev, int type, size_t size) +{ + struct snd_dma_buffer *dmab; + int err; + + if (WARN_ON(type == SNDRV_DMA_TYPE_CONTINUOUS || + type == SNDRV_DMA_TYPE_VMALLOC)) + return NULL; + + dmab = devres_alloc(__snd_release_pages, sizeof(*dmab), GFP_KERNEL); + if (!dmab) + return NULL; + + err = snd_dma_alloc_pages(type, dev, size, dmab); + if (err < 0) { + devres_free(dmab); + return NULL; + } + + devres_add(dev, dmab); + return dmab; +} +EXPORT_SYMBOL_GPL(snd_devm_alloc_pages); + /** * snd_dma_buffer_mmap - perform mmap of the given DMA buffer * @dmab: buffer allocation information From patchwork Thu Jul 15 07:58:24 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379217 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 74771C07E96 for ; Thu, 15 Jul 2021 08:03:17 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 9B64F610C7 for ; Thu, 15 Jul 2021 08:03:16 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 9B64F610C7 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id 354D016A5; Thu, 15 Jul 2021 10:02:25 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 354D016A5 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626336195; bh=5tTHYYQ5v3MBBQitDlfw8tM+z5RB/PxEsu0/G4osaW8=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=idlnR1WNDHEXF/tBU/0cKHbfvEpO+nYM7c6Rqqv/tABsaJJtzTsZkPq79a/WKI7Ex OS7bH5RVKYIRidZ2M9scrnI3I1wU/ed1rRWL7IOpMSRCRBMYW13vaNn7ltCqv5vfUr AUvz3G2V672nVlASThpeBH9zRq9L2SXk47npWGUc= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id 8032FF80542; Thu, 15 Jul 2021 10:00:15 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id 1325EF80240; Thu, 15 Jul 2021 10:00:10 +0200 (CEST) Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 0550AF8020C for ; Thu, 15 Jul 2021 09:59:51 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 0550AF8020C Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="yUg90BZa"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="DG2F/NfK" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out1.suse.de (Postfix) with ESMTP id 545FB2284E for ; Thu, 15 Jul 2021 07:59:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626335991; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=vklpQFKwIuhfxYLlJB9POJCv52g3xNBgveJ+77rJc90=; b=yUg90BZaTeus9YqP1rD58Vsj3Az1HukeYES0+tbxIUb3ZRcwJoSl5Y2D9TQgZ0XoPXJ3ju vkwRFTKAs4iiqLn2UOesBY9wvfVh//keWtAF3HYb+vFwt8D606GhpTob5+joj62sLTOcWS mheSVu0aKluYiIl9aRj7d8kKvaab+1c= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626335991; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=vklpQFKwIuhfxYLlJB9POJCv52g3xNBgveJ+77rJc90=; b=DG2F/NfKIw2gsrY8MwtqfqN1TcW7CShz++iINOHpn9dWcw1XtUAr44ZBC4IHAo8v6Ptni3 HvuKdbQLJKtKuCCA== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id 413E8A3B8F; Thu, 15 Jul 2021 07:59:51 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 02/79] ALSA: core: Add managed card creation Date: Thu, 15 Jul 2021 09:58:24 +0200 Message-Id: <20210715075941.23332-3-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" As a second step for preliminary to widen the devres usages among sound drivers, this patch adds a new ALSA core API function, snd_devm_card_new(), to create a snd_card object via devres. When a card object is created by this new function, snd_card_free() is called automatically and the card object resource gets released at the device unbinding time. However, the story isn't that simple. A caveat is that we have to call snd_card_free() at the very first of the whole resource release procedure, in order to assure that the all exposed devices on user-space are deleted and sync with processes accessing those devices before releasing resources. For achieving it, snd_card_register() adds a new devres action to trigger snd_card_free() automatically when the given card object is a "managed" one. Since usually snd_card_register() is the last step of the initialization, this should work in most cases. With all these tricks, some drivers can get rid of the whole driver remove callback code. About a bit of implementation details: the patch adds two new flags to snd_card object: managed and releasing. The former indicates that the object was created via snd_devm_card_new(), and the latter is used for avoiding the double-free of snd_card_free() calls. Both flags are fairly internal and likely uninteresting to normal users. Signed-off-by: Takashi Iwai --- include/sound/core.h | 5 +++ sound/core/init.c | 99 ++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 96 insertions(+), 8 deletions(-) diff --git a/include/sound/core.h b/include/sound/core.h index c4ade121727d..7885f903cd5a 100644 --- a/include/sound/core.h +++ b/include/sound/core.h @@ -117,6 +117,8 @@ struct snd_card { struct device card_dev; /* cardX object for sysfs */ const struct attribute_group *dev_groups[4]; /* assigned sysfs attr */ bool registered; /* card_dev is registered? */ + bool managed; /* managed via devres */ + bool releasing; /* during card free process */ int sync_irq; /* assigned irq, used for PCM sync */ wait_queue_head_t remove_sleep; @@ -274,6 +276,9 @@ extern int (*snd_mixer_oss_notify_callback)(struct snd_card *card, int cmd); int snd_card_new(struct device *parent, int idx, const char *xid, struct module *module, int extra_size, struct snd_card **card_ret); +int snd_devm_card_new(struct device *parent, int idx, const char *xid, + struct module *module, size_t extra_size, + struct snd_card **card_ret); int snd_card_disconnect(struct snd_card *card); void snd_card_disconnect_sync(struct snd_card *card); diff --git a/sound/core/init.c b/sound/core/init.c index 1490568efdb0..e985185ebc91 100644 --- a/sound/core/init.c +++ b/sound/core/init.c @@ -134,6 +134,9 @@ void snd_device_initialize(struct device *dev, struct snd_card *card) } EXPORT_SYMBOL_GPL(snd_device_initialize); +static int snd_card_init(struct snd_card *card, struct device *parent, + int idx, const char *xid, struct module *module, + size_t extra_size); static int snd_card_do_free(struct snd_card *card); static const struct attribute_group card_dev_attr_group; @@ -163,9 +166,6 @@ int snd_card_new(struct device *parent, int idx, const char *xid, { struct snd_card *card; int err; -#ifdef CONFIG_SND_DEBUG - char name[8]; -#endif if (snd_BUG_ON(!card_ret)) return -EINVAL; @@ -176,6 +176,74 @@ int snd_card_new(struct device *parent, int idx, const char *xid, card = kzalloc(sizeof(*card) + extra_size, GFP_KERNEL); if (!card) return -ENOMEM; + + err = snd_card_init(card, parent, idx, xid, module, extra_size); + if (err < 0) { + kfree(card); + return err; + } + + *card_ret = card; + return 0; +} +EXPORT_SYMBOL(snd_card_new); + +static void __snd_card_release(struct device *dev, void *data) +{ + snd_card_free(data); +} + +/** + * snd_devm_card_new - managed snd_card object creation + * @parent: the parent device object + * @idx: card index (address) [0 ... (SNDRV_CARDS-1)] + * @xid: card identification (ASCII string) + * @module: top level module for locking + * @extra_size: allocate this extra size after the main soundcard structure + * @card_ret: the pointer to store the created card instance + * + * This function works like snd_card_new() but manages the allocated resource + * via devres, i.e. you don't need to free explicitly. + * + * When a snd_card object is created with this function and registered via + * snd_card_register(), the very first devres action to call snd_card_free() + * is added automatically. In that way, the resource disconnection is assured + * at first, then released in the expected order. + */ +int snd_devm_card_new(struct device *parent, int idx, const char *xid, + struct module *module, size_t extra_size, + struct snd_card **card_ret) +{ + struct snd_card *card; + int err; + + *card_ret = NULL; + card = devres_alloc(__snd_card_release, sizeof(*card) + extra_size, + GFP_KERNEL); + if (!card) + return -ENOMEM; + card->managed = true; + err = snd_card_init(card, parent, idx, xid, module, extra_size); + if (err < 0) { + devres_free(card); + return err; + } + + devres_add(parent, card); + *card_ret = card; + return 0; +} +EXPORT_SYMBOL_GPL(snd_devm_card_new); + +static int snd_card_init(struct snd_card *card, struct device *parent, + int idx, const char *xid, struct module *module, + size_t extra_size) +{ + int err; +#ifdef CONFIG_SND_DEBUG + char name[8]; +#endif + if (extra_size > 0) card->private_data = (char *)card + sizeof(struct snd_card); if (xid) @@ -197,7 +265,6 @@ int snd_card_new(struct device *parent, int idx, const char *xid, mutex_unlock(&snd_card_mutex); dev_err(parent, "cannot find the slot for index %d (range 0-%i), error: %d\n", idx, snd_ecards_limit - 1, err); - kfree(card); return err; } set_bit(idx, snd_cards_lock); /* lock it */ @@ -256,8 +323,6 @@ int snd_card_new(struct device *parent, int idx, const char *xid, sprintf(name, "card%d", idx); card->debugfs_root = debugfs_create_dir(name, sound_debugfs_root); #endif - - *card_ret = card; return 0; __error_ctl: @@ -266,7 +331,6 @@ int snd_card_new(struct device *parent, int idx, const char *xid, put_device(&card->card_dev); return err; } -EXPORT_SYMBOL(snd_card_new); /** * snd_card_ref - Get the card object from the index @@ -481,6 +545,7 @@ EXPORT_SYMBOL_GPL(snd_card_disconnect_sync); static int snd_card_do_free(struct snd_card *card) { + card->releasing = true; #if IS_ENABLED(CONFIG_SND_MIXER_OSS) if (snd_mixer_oss_notify_callback) snd_mixer_oss_notify_callback(card, SND_MIXER_OSS_NOTIFY_FREE); @@ -498,7 +563,8 @@ static int snd_card_do_free(struct snd_card *card) #endif if (card->release_completion) complete(card->release_completion); - kfree(card); + if (!card->managed) + kfree(card); return 0; } @@ -745,6 +811,14 @@ int snd_card_add_dev_attr(struct snd_card *card, } EXPORT_SYMBOL_GPL(snd_card_add_dev_attr); +static void trigger_card_free(void *data) +{ + struct snd_card *card = data; + + if (!card->releasing) + snd_card_free(data); +} + /** * snd_card_register - register the soundcard * @card: soundcard structure @@ -768,6 +842,15 @@ int snd_card_register(struct snd_card *card) if (err < 0) return err; card->registered = true; + } else { + if (card->managed) + devm_remove_action(card->dev, trigger_card_free, card); + } + + if (card->managed) { + err = devm_add_action(card->dev, trigger_card_free, card); + if (err < 0) + return err; } err = snd_device_register_all(card); From patchwork Thu Jul 15 07:58:25 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379209 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id B9462C1B08C for ; Thu, 15 Jul 2021 08:01:53 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 132006100C for ; Thu, 15 Jul 2021 08:01:53 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 132006100C Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id 86ABC167E; Thu, 15 Jul 2021 10:01:01 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 86ABC167E DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626336111; bh=pPJ3QSnirnoKQ8jb7PixSL1owvBhNMgxbBRIhdPw/jE=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=GQX1Q3FG2RmKHlTePWk/seaEy79dcJzVNgQ1PB/fKhm47UAD9noozfh3Lc/8X4Px/ U4bGY4Mpa1jbnAIyKJ1n9RT34EZH07W8aV2MH3ejdY+Zb9tFLtsg0tqLfHhfZsIAJe 56JDI2YyRqYeRnFQQaEAN3PZTDjbs/W1wV10h/pY= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id 9BD94F80430; Thu, 15 Jul 2021 10:00:09 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id 08F74F80515; Thu, 15 Jul 2021 10:00:08 +0200 (CEST) Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 2A70EF80430 for ; Thu, 15 Jul 2021 09:59:52 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 2A70EF80430 Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="WAO5Y2E+"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="+Myqk21k" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out2.suse.de (Postfix) with ESMTP id EE8521FDEA for ; Thu, 15 Jul 2021 07:59:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626335991; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=JK4bm4W8Ju9sf7P7p+C4ZrlV4vlyx6xPwwho/sgk99s=; b=WAO5Y2E+sFaYRh1Pzy5CnGRHQ0pxNFNHdjDpBP5Gu88kwxe5qZgzI3hAJjX/chYed+1rCf UDPO+hSwRO23Na6df57/6HCBb3SX66MmcMtbG2s5tfmDatG4z1Y14h726T3kk9004t6af/ OYk9OUqr/K2pKyP/WVYXg0TKTco2PbQ= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626335991; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=JK4bm4W8Ju9sf7P7p+C4ZrlV4vlyx6xPwwho/sgk99s=; b=+Myqk21knWFjOAKn7h1w+L1AwX0CLkPnAK1cLBRv0FUeqUQYbQhY9Wbs4khM65Td7TDe96 ad2NSfXRAlbhOWAA== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id DD717A3B8D; Thu, 15 Jul 2021 07:59:51 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 03/79] ALSA: core: Add device-managed request_dma() Date: Thu, 15 Jul 2021 09:58:25 +0200 Message-Id: <20210715075941.23332-4-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch adds a devres-supported helper for requesting an ISA DMA channel that will be automatically freed at the device unbinding. It'll be used by quite a few ISA sound drivers. Signed-off-by: Takashi Iwai --- include/sound/core.h | 1 + sound/core/isadma.c | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/include/sound/core.h b/include/sound/core.h index 7885f903cd5a..b7e9b58d3c78 100644 --- a/include/sound/core.h +++ b/include/sound/core.h @@ -329,6 +329,7 @@ int snd_device_get_state(struct snd_card *card, void *device_data); void snd_dma_program(unsigned long dma, unsigned long addr, unsigned int size, unsigned short mode); void snd_dma_disable(unsigned long dma); unsigned int snd_dma_pointer(unsigned long dma, unsigned int size); +int snd_devm_request_dma(struct device *dev, int dma, const char *name); #endif /* misc.c */ diff --git a/sound/core/isadma.c b/sound/core/isadma.c index c3d789ef6975..1f45ede023b4 100644 --- a/sound/core/isadma.c +++ b/sound/core/isadma.c @@ -97,3 +97,41 @@ unsigned int snd_dma_pointer(unsigned long dma, unsigned int size) return size - result; } EXPORT_SYMBOL(snd_dma_pointer); + +struct snd_dma_data { + int dma; +}; + +static void __snd_release_dma(struct device *dev, void *data) +{ + struct snd_dma_data *p = data; + + snd_dma_disable(p->dma); + free_dma(p->dma); +} + +/** + * snd_devm_request_dma - the managed version of request_dma() + * @dev: the device pointer + * @dma: the dma number + * @name: the name string of the requester + * + * Returns zero on success, or a negative error code. + * The requested DMA will be automatically released at unbinding via devres. + */ +int snd_devm_request_dma(struct device *dev, int dma, const char *name) +{ + struct snd_dma_data *p; + + if (request_dma(dma, name)) + return -EBUSY; + p = devres_alloc(__snd_release_dma, sizeof(*p), GFP_KERNEL); + if (!p) { + free_dma(dma); + return -ENOMEM; + } + p->dma = dma; + devres_add(dev, p); + return 0; +} +EXPORT_SYMBOL_GPL(snd_devm_request_dma); From patchwork Thu Jul 15 07:58:26 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379223 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7E88CC07E96 for ; Thu, 15 Jul 2021 08:04:28 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 04E4E61073 for ; Thu, 15 Jul 2021 08:04:27 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 04E4E61073 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id 8D90E167A; Thu, 15 Jul 2021 10:03:36 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 8D90E167A DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626336266; bh=rXd3rGaZ0EkgeHDojGaFPpZiTaj1DBoxC6XqwIBWSCo=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=s9IIyFcqRG+p8XvNdi4MBo2sXxwXKgFoXndActPhAUI4yG7Sh46RIhPUs86CgKJfS L5gfnQ94Rkd0hFptat3UHyn9oD8n0ZWgawz14BIEzWvO/kqRWFg5JYuJKPXOZBiZbr XON37yo8K8Xp8hpEu17tTgRrTalC+1EwwG4+x7wk= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id 32A0CF80578; Thu, 15 Jul 2021 10:00:21 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id 7DF04F80544; Thu, 15 Jul 2021 10:00:15 +0200 (CEST) Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id CA574F804DA for ; Thu, 15 Jul 2021 09:59:52 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz CA574F804DA Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="HckqRdQ6"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="VzJte51Y" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out2.suse.de (Postfix) with ESMTP id 981531FDEB for ; Thu, 15 Jul 2021 07:59:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626335992; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=p+80vNdV6jE9Ou8O5FXAHfr7DOF9xGqto4WGILLz14c=; b=HckqRdQ6SGh9JzUdfNrkvTAQIQpQ8AtVZ8hhlYczC8/S1FTrWpscB1Cd4ENS1ATSTyvhnu 0pgkie22c1dI8Ve0p5VMexSKbTQQZxqkbQlEsdZ+ULSCS5jG8rFQUh0yB1sEL7kSiF+R8P jMnsFW1L+9OZ0UyCp555sF75wGcO530= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626335992; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=p+80vNdV6jE9Ou8O5FXAHfr7DOF9xGqto4WGILLz14c=; b=VzJte51YWp6KnPn/utzTLyfXukQZ3h+HcGFW01eGjE3snTFnX5WqVpPSl3q51Idn+q6/S/ +R571eUdXWWaqiDA== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id 85BF4A3B8F; Thu, 15 Jul 2021 07:59:52 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 04/79] ALSA: doc: Add device-managed resource section Date: Thu, 15 Jul 2021 09:58:26 +0200 Message-Id: <20210715075941.23332-5-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" Give brief explanations about the device-managed resources and the newly introduced snd_devm_card_new() helper. Signed-off-by: Takashi Iwai --- .../kernel-api/writing-an-alsa-driver.rst | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/Documentation/sound/kernel-api/writing-an-alsa-driver.rst b/Documentation/sound/kernel-api/writing-an-alsa-driver.rst index 01d59b8aea92..255b7d3bebd6 100644 --- a/Documentation/sound/kernel-api/writing-an-alsa-driver.rst +++ b/Documentation/sound/kernel-api/writing-an-alsa-driver.rst @@ -4172,6 +4172,39 @@ module license as GPL, etc., otherwise the system is shown as “tainted”. MODULE_LICENSE("GPL"); +Device-Managed Resources +======================== + +In the examples above, all resources are allocated and released +manually. But human beings are lazy in nature, especially developers +are lazier. So there are some ways to automate the release part; it's +the (device-)managed resources aka devres or devm family. For +example, an object allocated via :c:func:`devm_kmalloc()` will be +freed automatically at unbinding the device. + +ALSA core provides also the device-managed helper, namely, +:c:func:`snd_devm_card_new()` for creating a card object. +Call this functions instead of the normal :c:func:`snd_card_new()`, +and you can forget the explicit :c:func:`snd_card_free()` call, as +it's called automagically at error and removal paths. + +One caveat is that the call of :c:func:`snd_card_free()` would be put +at the beginning of the call chain only after you call +:c:func:`snd_card_register()`. + +Also, the ``private_free`` callback is always called at the card free, +so be careful to put the hardware clean-up procedure in +``private_free`` callback. It might be called even before you +actually set up at an earlier error path. For avoiding such an +invalid initialization, you can set ``private_free`` callback after +:c:func:`snd_card_register()` call succeeds. + +Another thing to be remarked is that you should use device-managed +helpers for each component as much as possible once when you manage +the card in that way. Mixing up with the normal and the managed +resources may screw up the release order. + + How To Put Your Driver Into ALSA Tree ===================================== From patchwork Thu Jul 15 07:58:27 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379225 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2CBF9C07E96 for ; Thu, 15 Jul 2021 08:04:48 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id A3E4A610C7 for ; Thu, 15 Jul 2021 08:04:47 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org A3E4A610C7 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id 37CDD1685; Thu, 15 Jul 2021 10:03:56 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 37CDD1685 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626336286; bh=EmXsO8A6hKMGipEIU2L5NclT23mD126IniGJcoPq4wg=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=gAi7DM8qLKcPW2rGij9vHP7GvFQjtBv/gfRGM80RYiGDVNdcnr98Wg0L3jZJY5Ybp V+ZF8dvTRKzD0MOPMhF+Qq9XKCK8bZpQWTLVW2J+cFQneAgwk0AvyW11XmK/q6P0VQ IaV6g+eGchI8KSyqwKGGK1PQ1UGip0MsBnm3zkYk= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id 1D733F80588; Thu, 15 Jul 2021 10:00:22 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id 5466CF8054A; Thu, 15 Jul 2021 10:00:16 +0200 (CEST) Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 3CE8BF80229 for ; Thu, 15 Jul 2021 09:59:53 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 3CE8BF80229 Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="ikvEuh/7"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="+rS27I6n" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out2.suse.de (Postfix) with ESMTP id 3EE2D1FDEC for ; Thu, 15 Jul 2021 07:59:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626335993; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=IYGwEgxSe3lfwTayzEuKCrhyKkUnngXAooaOVfsxXoc=; b=ikvEuh/7Ku4nBILW0lsnZUEPymUP3WgJ8ssf6TEPLXLhSr8bcRRyISsgRGJjWL1JfhBc6d YTDrY0Kj5NktcLJme6qEnR1/oJ5xVW4JmeCONg5xUk6yj6B79MhXPgD3mcwWWbf0tNDcPe Jy63igS3WISbwzpcyytQCT7lwb9wJ/8= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626335993; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=IYGwEgxSe3lfwTayzEuKCrhyKkUnngXAooaOVfsxXoc=; b=+rS27I6nSKnDb6JBDiydN5DoM/ZiuaWbA/9ydv4m2q/WaQK+fG85I2SREUQyiSm6+9h24+ 5yF5Oc7hgoa6V9Bg== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id 29E35A3B8F; Thu, 15 Jul 2021 07:59:53 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 05/79] ALSA: intel8x0: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:58:27 +0200 Message-Id: <20210715075941.23332-6-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch refactors the intel8x0 and intel8x0m driver codes using devres and gets rid of the driver remove callback. The conversion is fairly straightforward: each API call is replaced with the device-managed API function, e.g. pci_enable_device() -> pcim_enable_device(), and so on. The buffer descriptor list is allocated with a new API, snd_devm_alloc_pages(). A slight code structure change is that the intel8x0 object is allocated as a card's private_data instead of the own lowlevel snd_device object. This simplifies the resource management. And, the take-down procedure is triggered via card->private_free, and it's registered at the end of the whole initialization, i.e. after the all resources get properly managed. The only not-devres-managed resource is the irq handler. Since we need to release at suspend and re-acquire at resume (otherwise something weird happens on some machines), this is still managed manually. But the rest are all freed automatically. The end result is a good amount of code reduction. Signed-off-by: Takashi Iwai --- sound/pci/intel8x0.c | 140 +++++++++++++----------------------------- sound/pci/intel8x0m.c | 139 ++++++++++++----------------------------- 2 files changed, 81 insertions(+), 198 deletions(-) diff --git a/sound/pci/intel8x0.c b/sound/pci/intel8x0.c index 6a436a2ce26a..67cb65a53edd 100644 --- a/sound/pci/intel8x0.c +++ b/sound/pci/intel8x0.c @@ -378,7 +378,7 @@ struct intel8x0 { spinlock_t reg_lock; u32 bdbars_count; - struct snd_dma_buffer bdbars; + struct snd_dma_buffer *bdbars; u32 int_sta_reg; /* interrupt status register */ u32 int_sta_mask; /* interrupt status mask */ }; @@ -2528,8 +2528,9 @@ static int snd_intel8x0_chip_init(struct intel8x0 *chip, int probing) return 0; } -static int snd_intel8x0_free(struct intel8x0 *chip) +static void snd_intel8x0_free(struct snd_card *card) { + struct intel8x0 *chip = card->private_data; unsigned int i; if (chip->irq < 0) @@ -2552,16 +2553,6 @@ static int snd_intel8x0_free(struct intel8x0 *chip) __hw_end: if (chip->irq >= 0) free_irq(chip->irq, chip); - if (chip->bdbars.area) - snd_dma_free_pages(&chip->bdbars); - if (chip->addr) - pci_iounmap(chip->pci, chip->addr); - if (chip->bmaddr) - pci_iounmap(chip->pci, chip->bmaddr); - pci_release_regions(chip->pci); - pci_disable_device(chip->pci); - kfree(chip); - return 0; } #ifdef CONFIG_PM_SLEEP @@ -2831,12 +2822,6 @@ static void snd_intel8x0_proc_init(struct intel8x0 *chip) snd_intel8x0_proc_read); } -static int snd_intel8x0_dev_free(struct snd_device *device) -{ - struct intel8x0 *chip = device->device_data; - return snd_intel8x0_free(chip); -} - struct ich_reg_info { unsigned int int_sta_mask; unsigned int offset; @@ -2880,19 +2865,15 @@ static int snd_intel8x0_inside_vm(struct pci_dev *pci) return result; } -static int snd_intel8x0_create(struct snd_card *card, - struct pci_dev *pci, - unsigned long device_type, - struct intel8x0 **r_intel8x0) +static int snd_intel8x0_init(struct snd_card *card, + struct pci_dev *pci, + unsigned long device_type) { - struct intel8x0 *chip; + struct intel8x0 *chip = card->private_data; int err; unsigned int i; unsigned int int_sta_masks; struct ichdev *ichdev; - static const struct snd_device_ops ops = { - .dev_free = snd_intel8x0_dev_free, - }; static const unsigned int bdbars[] = { 3, /* DEVICE_INTEL */ @@ -2925,17 +2906,10 @@ static int snd_intel8x0_create(struct snd_card *card, }; const struct ich_reg_info *tbl; - *r_intel8x0 = NULL; - - err = pci_enable_device(pci); + err = pcim_enable_device(pci); if (err < 0) return err; - chip = kzalloc(sizeof(*chip), GFP_KERNEL); - if (chip == NULL) { - pci_disable_device(pci); - return -ENOMEM; - } spin_lock_init(&chip->reg_lock); chip->device_type = device_type; chip->card = card; @@ -2961,38 +2935,23 @@ static int snd_intel8x0_create(struct snd_card *card, chip->fix_nocache = 1; /* enable workaround */ err = pci_request_regions(pci, card->shortname); - if (err < 0) { - kfree(chip); - pci_disable_device(pci); + if (err < 0) return err; - } if (device_type == DEVICE_ALI) { /* ALI5455 has no ac97 region */ - chip->bmaddr = pci_iomap(pci, 0, 0); - goto port_inited; - } - - if (pci_resource_flags(pci, 2) & IORESOURCE_MEM) /* ICH4 and Nforce */ - chip->addr = pci_iomap(pci, 2, 0); - else - chip->addr = pci_iomap(pci, 0, 0); - if (!chip->addr) { - dev_err(card->dev, "AC'97 space ioremap problem\n"); - snd_intel8x0_free(chip); - return -EIO; + chip->bmaddr = pcim_iomap(pci, 0, 0); + } else { + if (pci_resource_flags(pci, 2) & IORESOURCE_MEM) /* ICH4 and Nforce */ + chip->addr = pcim_iomap(pci, 2, 0); + else + chip->addr = pcim_iomap(pci, 0, 0); + if (pci_resource_flags(pci, 3) & IORESOURCE_MEM) /* ICH4 */ + chip->bmaddr = pcim_iomap(pci, 3, 0); + else + chip->bmaddr = pcim_iomap(pci, 1, 0); } - if (pci_resource_flags(pci, 3) & IORESOURCE_MEM) /* ICH4 */ - chip->bmaddr = pci_iomap(pci, 3, 0); - else - chip->bmaddr = pci_iomap(pci, 1, 0); - port_inited: - if (!chip->bmaddr) { - dev_err(card->dev, "Controller space ioremap problem\n"); - snd_intel8x0_free(chip); - return -EIO; - } chip->bdbars_count = bdbars[device_type]; /* initialize offsets */ @@ -3028,21 +2987,20 @@ static int snd_intel8x0_create(struct snd_card *card, /* allocate buffer descriptor lists */ /* the start of each lists must be aligned to 8 bytes */ - if (snd_dma_alloc_pages(intel8x0_dma_type(chip), &pci->dev, - chip->bdbars_count * sizeof(u32) * ICH_MAX_FRAGS * 2, - &chip->bdbars) < 0) { - snd_intel8x0_free(chip); - dev_err(card->dev, "cannot allocate buffer descriptors\n"); + chip->bdbars = snd_devm_alloc_pages(&pci->dev, intel8x0_dma_type(chip), + chip->bdbars_count * sizeof(u32) * + ICH_MAX_FRAGS * 2); + if (!chip->bdbars) return -ENOMEM; - } + /* tables must be aligned to 8 bytes here, but the kernel pages are much bigger, so we don't care (on i386) */ int_sta_masks = 0; for (i = 0; i < chip->bdbars_count; i++) { ichdev = &chip->ichd[i]; - ichdev->bdbar = ((__le32 *)chip->bdbars.area) + + ichdev->bdbar = ((__le32 *)chip->bdbars->area) + (i * ICH_MAX_FRAGS * 2); - ichdev->bdbar_addr = chip->bdbars.addr + + ichdev->bdbar_addr = chip->bdbars->addr + (i * sizeof(u32) * ICH_MAX_FRAGS * 2); int_sta_masks |= ichdev->int_sta_mask; } @@ -3076,28 +3034,24 @@ static int snd_intel8x0_create(struct snd_card *card, chip->codec_isr_bits |= chip->codec_bit[i]; err = snd_intel8x0_chip_init(chip, 1); - if (err < 0) { - snd_intel8x0_free(chip); + if (err < 0) return err; - } /* request irq after initializaing int_sta_mask, etc */ + /* NOTE: we don't use devm version here since it's released / + * re-acquired in PM callbacks. + * It's released explicitly in snd_intel8x0_free(), too. + */ if (request_irq(pci->irq, snd_intel8x0_interrupt, IRQF_SHARED, KBUILD_MODNAME, chip)) { dev_err(card->dev, "unable to grab IRQ %d\n", pci->irq); - snd_intel8x0_free(chip); return -EBUSY; } chip->irq = pci->irq; card->sync_irq = chip->irq; - err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops); - if (err < 0) { - snd_intel8x0_free(chip); - return err; - } + card->private_free = snd_intel8x0_free; - *r_intel8x0 = chip; return 0; } @@ -3163,9 +3117,11 @@ static int snd_intel8x0_probe(struct pci_dev *pci, int err; struct shortname_table *name; - err = snd_card_new(&pci->dev, index, id, THIS_MODULE, 0, &card); + err = snd_devm_card_new(&pci->dev, index, id, THIS_MODULE, + sizeof(*chip), &card); if (err < 0) return err; + chip = card->private_data; if (spdif_aclink < 0) spdif_aclink = check_default_spdif_aclink(pci); @@ -3199,23 +3155,16 @@ static int snd_intel8x0_probe(struct pci_dev *pci, buggy_irq = 0; } - err = snd_intel8x0_create(card, pci, pci_id->driver_data, &chip); - if (err < 0) { - snd_card_free(card); + err = snd_intel8x0_init(card, pci, pci_id->driver_data); + if (err < 0) return err; - } - card->private_data = chip; err = snd_intel8x0_mixer(chip, ac97_clock, ac97_quirk); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } err = snd_intel8x0_pcm(chip); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } snd_intel8x0_proc_init(chip); @@ -3233,24 +3182,17 @@ static int snd_intel8x0_probe(struct pci_dev *pci, } err = snd_card_register(card); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } + pci_set_drvdata(pci, card); return 0; } -static void snd_intel8x0_remove(struct pci_dev *pci) -{ - snd_card_free(pci_get_drvdata(pci)); -} - static struct pci_driver intel8x0_driver = { .name = KBUILD_MODNAME, .id_table = snd_intel8x0_ids, .probe = snd_intel8x0_probe, - .remove = snd_intel8x0_remove, .driver = { .pm = INTEL8X0_PM_OPS, }, diff --git a/sound/pci/intel8x0m.c b/sound/pci/intel8x0m.c index b96fce6cbd83..7de3cb2f17b5 100644 --- a/sound/pci/intel8x0m.c +++ b/sound/pci/intel8x0m.c @@ -182,7 +182,7 @@ struct intel8x0m { spinlock_t reg_lock; - struct snd_dma_buffer bdbars; + struct snd_dma_buffer *bdbars; u32 bdbars_count; u32 int_sta_reg; /* interrupt status register */ u32 int_sta_mask; /* interrupt status mask */ @@ -947,8 +947,9 @@ static int snd_intel8x0m_chip_init(struct intel8x0m *chip, int probing) return 0; } -static int snd_intel8x0m_free(struct intel8x0m *chip) +static void snd_intel8x0m_free(struct snd_card *card) { + struct intel8x0m *chip = card->private_data; unsigned int i; if (chip->irq < 0) @@ -962,16 +963,6 @@ static int snd_intel8x0m_free(struct intel8x0m *chip) __hw_end: if (chip->irq >= 0) free_irq(chip->irq, chip); - if (chip->bdbars.area) - snd_dma_free_pages(&chip->bdbars); - if (chip->addr) - pci_iounmap(chip->pci, chip->addr); - if (chip->bmaddr) - pci_iounmap(chip->pci, chip->bmaddr); - pci_release_regions(chip->pci); - pci_disable_device(chip->pci); - kfree(chip); - return 0; } #ifdef CONFIG_PM_SLEEP @@ -1047,47 +1038,30 @@ static void snd_intel8x0m_proc_init(struct intel8x0m *chip) snd_intel8x0m_proc_read); } -static int snd_intel8x0m_dev_free(struct snd_device *device) -{ - struct intel8x0m *chip = device->device_data; - return snd_intel8x0m_free(chip); -} - struct ich_reg_info { unsigned int int_sta_mask; unsigned int offset; }; -static int snd_intel8x0m_create(struct snd_card *card, - struct pci_dev *pci, - unsigned long device_type, - struct intel8x0m **r_intel8x0m) +static int snd_intel8x0m_init(struct snd_card *card, + struct pci_dev *pci, + unsigned long device_type) { - struct intel8x0m *chip; + struct intel8x0m *chip = card->private_data; int err; unsigned int i; unsigned int int_sta_masks; struct ichdev *ichdev; - static const struct snd_device_ops ops = { - .dev_free = snd_intel8x0m_dev_free, - }; static const struct ich_reg_info intel_regs[2] = { { ICH_MIINT, 0 }, { ICH_MOINT, 0x10 }, }; const struct ich_reg_info *tbl; - *r_intel8x0m = NULL; - - err = pci_enable_device(pci); + err = pcim_enable_device(pci); if (err < 0) return err; - chip = kzalloc(sizeof(*chip), GFP_KERNEL); - if (chip == NULL) { - pci_disable_device(pci); - return -ENOMEM; - } spin_lock_init(&chip->reg_lock); chip->device_type = device_type; chip->card = card; @@ -1095,37 +1069,21 @@ static int snd_intel8x0m_create(struct snd_card *card, chip->irq = -1; err = pci_request_regions(pci, card->shortname); - if (err < 0) { - kfree(chip); - pci_disable_device(pci); + if (err < 0) return err; - } if (device_type == DEVICE_ALI) { /* ALI5455 has no ac97 region */ - chip->bmaddr = pci_iomap(pci, 0, 0); - goto port_inited; - } - - if (pci_resource_flags(pci, 2) & IORESOURCE_MEM) /* ICH4 and Nforce */ - chip->addr = pci_iomap(pci, 2, 0); - else - chip->addr = pci_iomap(pci, 0, 0); - if (!chip->addr) { - dev_err(card->dev, "AC'97 space ioremap problem\n"); - snd_intel8x0m_free(chip); - return -EIO; - } - if (pci_resource_flags(pci, 3) & IORESOURCE_MEM) /* ICH4 */ - chip->bmaddr = pci_iomap(pci, 3, 0); - else - chip->bmaddr = pci_iomap(pci, 1, 0); - -port_inited: - if (!chip->bmaddr) { - dev_err(card->dev, "Controller space ioremap problem\n"); - snd_intel8x0m_free(chip); - return -EIO; + chip->bmaddr = pcim_iomap(pci, 0, 0); + } else { + if (pci_resource_flags(pci, 2) & IORESOURCE_MEM) /* ICH4 and Nforce */ + chip->addr = pcim_iomap(pci, 2, 0); + else + chip->addr = pcim_iomap(pci, 0, 0); + if (pci_resource_flags(pci, 3) & IORESOURCE_MEM) /* ICH4 */ + chip->bmaddr = pcim_iomap(pci, 3, 0); + else + chip->bmaddr = pcim_iomap(pci, 1, 0); } /* initialize offsets */ @@ -1153,19 +1111,19 @@ static int snd_intel8x0m_create(struct snd_card *card, /* allocate buffer descriptor lists */ /* the start of each lists must be aligned to 8 bytes */ - if (snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, &pci->dev, - chip->bdbars_count * sizeof(u32) * ICH_MAX_FRAGS * 2, - &chip->bdbars) < 0) { - snd_intel8x0m_free(chip); + chip->bdbars = snd_devm_alloc_pages(&pci->dev, SNDRV_DMA_TYPE_DEV, + chip->bdbars_count * sizeof(u32) * + ICH_MAX_FRAGS * 2); + if (!chip->bdbars) return -ENOMEM; - } + /* tables must be aligned to 8 bytes here, but the kernel pages are much bigger, so we don't care (on i386) */ int_sta_masks = 0; for (i = 0; i < chip->bdbars_count; i++) { ichdev = &chip->ichd[i]; - ichdev->bdbar = ((__le32 *)chip->bdbars.area) + (i * ICH_MAX_FRAGS * 2); - ichdev->bdbar_addr = chip->bdbars.addr + (i * sizeof(u32) * ICH_MAX_FRAGS * 2); + ichdev->bdbar = ((__le32 *)chip->bdbars->area) + (i * ICH_MAX_FRAGS * 2); + ichdev->bdbar_addr = chip->bdbars->addr + (i * sizeof(u32) * ICH_MAX_FRAGS * 2); int_sta_masks |= ichdev->int_sta_mask; } chip->int_sta_reg = ICH_REG_GLOB_STA; @@ -1174,27 +1132,23 @@ static int snd_intel8x0m_create(struct snd_card *card, pci_set_master(pci); err = snd_intel8x0m_chip_init(chip, 1); - if (err < 0) { - snd_intel8x0m_free(chip); + if (err < 0) return err; - } + /* NOTE: we don't use devm version here since it's released / + * re-acquired in PM callbacks. + * It's released explicitly in snd_intel8x0m_free(), too. + */ if (request_irq(pci->irq, snd_intel8x0m_interrupt, IRQF_SHARED, KBUILD_MODNAME, chip)) { dev_err(card->dev, "unable to grab IRQ %d\n", pci->irq); - snd_intel8x0m_free(chip); return -EBUSY; } chip->irq = pci->irq; card->sync_irq = chip->irq; - err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops); - if (err < 0) { - snd_intel8x0m_free(chip); - return err; - } + card->private_free = snd_intel8x0m_free; - *r_intel8x0m = chip; return 0; } @@ -1232,9 +1186,11 @@ static int snd_intel8x0m_probe(struct pci_dev *pci, int err; struct shortname_table *name; - err = snd_card_new(&pci->dev, index, id, THIS_MODULE, 0, &card); + err = snd_devm_card_new(&pci->dev, index, id, THIS_MODULE, + sizeof(*chip), &card); if (err < 0) return err; + chip = card->private_data; strcpy(card->driver, "ICH-MODEM"); strcpy(card->shortname, "Intel ICH"); @@ -1246,23 +1202,16 @@ static int snd_intel8x0m_probe(struct pci_dev *pci, } strcat(card->shortname," Modem"); - err = snd_intel8x0m_create(card, pci, pci_id->driver_data, &chip); - if (err < 0) { - snd_card_free(card); + err = snd_intel8x0m_init(card, pci, pci_id->driver_data); + if (err < 0) return err; - } - card->private_data = chip; err = snd_intel8x0m_mixer(chip, ac97_clock); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } err = snd_intel8x0m_pcm(chip); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } snd_intel8x0m_proc_init(chip); @@ -1270,24 +1219,16 @@ static int snd_intel8x0m_probe(struct pci_dev *pci, card->shortname, chip->irq); err = snd_card_register(card); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } pci_set_drvdata(pci, card); return 0; } -static void snd_intel8x0m_remove(struct pci_dev *pci) -{ - snd_card_free(pci_get_drvdata(pci)); -} - static struct pci_driver intel8x0m_driver = { .name = KBUILD_MODNAME, .id_table = snd_intel8x0m_ids, .probe = snd_intel8x0m_probe, - .remove = snd_intel8x0m_remove, .driver = { .pm = INTEL8X0M_PM_OPS, }, From patchwork Thu Jul 15 07:58:28 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379219 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id E157DC07E96 for ; Thu, 15 Jul 2021 08:03:32 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 60769610C7 for ; Thu, 15 Jul 2021 08:03:32 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 60769610C7 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id F0BB7167E; Thu, 15 Jul 2021 10:02:40 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz F0BB7167E DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626336211; bh=CEUUEMRpKh2q+wEKO3UkqbaUVHguEKirBq7NjDfVM0E=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=SyABAuSuu0qoLZ3fwGv4YV+8x2WowGRuwDjd8Tlw8HNEetf6oeenxCTnR90Lv9d8T ivX5+Q7hT7jLirxEI6Klfyism3HYoOlB+OQwWMX54wg9QIqAxi1INi+IYp7QbU9lgo OEvpDLc7Vs1/uLkiFrwYJAviiyzi4H8rnuvbtNdY= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id 84B93F80548; Thu, 15 Jul 2021 10:00:17 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id A9D0FF80520; Thu, 15 Jul 2021 10:00:10 +0200 (CEST) Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 388A4F80431 for ; Thu, 15 Jul 2021 09:59:53 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 388A4F80431 Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="0tbZ2Ef+"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="VemStAJe" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out2.suse.de (Postfix) with ESMTP id C8B901FD3E for ; Thu, 15 Jul 2021 07:59:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626335993; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=EJDCaxedyEx7rQY8uxQVc9bkBE7FagFDqODBfkzm5cU=; b=0tbZ2Ef+JXelipQQavSwDwLnAD3BSxaJfR+Q8VwIjUgVkSRgaZR2LtK5zAW4ClvDok4pbc SOHHzs/I7x6hP/IqKJ+KZE0YUryu4oxPE6ykN2nJyiFHzYOMEGsOEKYVG0r9uxQI+OB9v0 r/2Lss6j2mMO7Lqy7299rLrhNCe3hw8= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626335993; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=EJDCaxedyEx7rQY8uxQVc9bkBE7FagFDqODBfkzm5cU=; b=VemStAJeDHH/PKP/CmPsnVyxn9IuOKzbYNw+O5BNjqWS37OHZRfyOweVMwcniSxNAkFsy/ PL6V5wr5MzPUQSAw== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id C0188A3B8F; Thu, 15 Jul 2021 07:59:53 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 06/79] ALSA: atiixp: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:58:28 +0200 Message-Id: <20210715075941.23332-7-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" Like the previous patch, this patch converts the resource allocations with device-managed API calls, so that we can reduce resource-free calls. The atiixp drivers are simpler than intel8x0, and even the irq can be allocated with devres. The end result is a good amount of code reduction. Signed-off-by: Takashi Iwai --- sound/pci/atiixp.c | 92 +++++++++------------------------------- sound/pci/atiixp_modem.c | 92 +++++++++------------------------------- 2 files changed, 40 insertions(+), 144 deletions(-) diff --git a/sound/pci/atiixp.c b/sound/pci/atiixp.c index 5f8aa35c4bea..b8e035d5930d 100644 --- a/sound/pci/atiixp.c +++ b/sound/pci/atiixp.c @@ -1530,87 +1530,44 @@ static void snd_atiixp_proc_init(struct atiixp *chip) * destructor */ -static int snd_atiixp_free(struct atiixp *chip) +static void snd_atiixp_free(struct snd_card *card) { - if (chip->irq < 0) - goto __hw_end; - snd_atiixp_chip_stop(chip); - - __hw_end: - if (chip->irq >= 0) - free_irq(chip->irq, chip); - iounmap(chip->remap_addr); - pci_release_regions(chip->pci); - pci_disable_device(chip->pci); - kfree(chip); - return 0; -} - -static int snd_atiixp_dev_free(struct snd_device *device) -{ - struct atiixp *chip = device->device_data; - return snd_atiixp_free(chip); + snd_atiixp_chip_stop(card->private_data); } /* * constructor for chip instance */ -static int snd_atiixp_create(struct snd_card *card, - struct pci_dev *pci, - struct atiixp **r_chip) +static int snd_atiixp_init(struct snd_card *card, struct pci_dev *pci) { - static const struct snd_device_ops ops = { - .dev_free = snd_atiixp_dev_free, - }; - struct atiixp *chip; + struct atiixp *chip = card->private_data; int err; - err = pci_enable_device(pci); + err = pcim_enable_device(pci); if (err < 0) return err; - chip = kzalloc(sizeof(*chip), GFP_KERNEL); - if (chip == NULL) { - pci_disable_device(pci); - return -ENOMEM; - } - spin_lock_init(&chip->reg_lock); mutex_init(&chip->open_mutex); chip->card = card; chip->pci = pci; chip->irq = -1; - err = pci_request_regions(pci, "ATI IXP AC97"); - if (err < 0) { - pci_disable_device(pci); - kfree(chip); + err = pcim_iomap_regions(pci, 1 << 0, "ATI IXP AC97"); + if (err < 0) return err; - } chip->addr = pci_resource_start(pci, 0); - chip->remap_addr = pci_ioremap_bar(pci, 0); - if (chip->remap_addr == NULL) { - dev_err(card->dev, "AC'97 space ioremap problem\n"); - snd_atiixp_free(chip); - return -EIO; - } + chip->remap_addr = pcim_iomap_table(pci)[0]; - if (request_irq(pci->irq, snd_atiixp_interrupt, IRQF_SHARED, - KBUILD_MODNAME, chip)) { + if (devm_request_irq(&pci->dev, pci->irq, snd_atiixp_interrupt, + IRQF_SHARED, KBUILD_MODNAME, chip)) { dev_err(card->dev, "unable to grab IRQ %d\n", pci->irq); - snd_atiixp_free(chip); return -EBUSY; } chip->irq = pci->irq; card->sync_irq = chip->irq; + card->private_free = snd_atiixp_free; pci_set_master(pci); - err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops); - if (err < 0) { - snd_atiixp_free(chip); - return err; - } - - *r_chip = chip; return 0; } @@ -1622,30 +1579,31 @@ static int snd_atiixp_probe(struct pci_dev *pci, struct atiixp *chip; int err; - err = snd_card_new(&pci->dev, index, id, THIS_MODULE, 0, &card); + err = snd_devm_card_new(&pci->dev, index, id, THIS_MODULE, + sizeof(*chip), &card); if (err < 0) return err; + chip = card->private_data; strcpy(card->driver, spdif_aclink ? "ATIIXP" : "ATIIXP-SPDMA"); strcpy(card->shortname, "ATI IXP"); - err = snd_atiixp_create(card, pci, &chip); + err = snd_atiixp_init(card, pci); if (err < 0) - goto __error; - card->private_data = chip; + return err; err = snd_atiixp_aclink_reset(chip); if (err < 0) - goto __error; + return err; chip->spdif_over_aclink = spdif_aclink; err = snd_atiixp_mixer_new(chip, ac97_clock, ac97_quirk); if (err < 0) - goto __error; + return err; err = snd_atiixp_pcm_new(chip); if (err < 0) - goto __error; + return err; snd_atiixp_proc_init(chip); @@ -1659,26 +1617,16 @@ static int snd_atiixp_probe(struct pci_dev *pci, err = snd_card_register(card); if (err < 0) - goto __error; + return err; pci_set_drvdata(pci, card); return 0; - - __error: - snd_card_free(card); - return err; -} - -static void snd_atiixp_remove(struct pci_dev *pci) -{ - snd_card_free(pci_get_drvdata(pci)); } static struct pci_driver atiixp_driver = { .name = KBUILD_MODNAME, .id_table = snd_atiixp_ids, .probe = snd_atiixp_probe, - .remove = snd_atiixp_remove, .driver = { .pm = SND_ATIIXP_PM_OPS, }, diff --git a/sound/pci/atiixp_modem.c b/sound/pci/atiixp_modem.c index 9739c3a82777..178dce8ef1e9 100644 --- a/sound/pci/atiixp_modem.c +++ b/sound/pci/atiixp_modem.c @@ -1159,87 +1159,44 @@ static void snd_atiixp_proc_init(struct atiixp_modem *chip) * destructor */ -static int snd_atiixp_free(struct atiixp_modem *chip) +static void snd_atiixp_free(struct snd_card *card) { - if (chip->irq < 0) - goto __hw_end; - snd_atiixp_chip_stop(chip); - - __hw_end: - if (chip->irq >= 0) - free_irq(chip->irq, chip); - iounmap(chip->remap_addr); - pci_release_regions(chip->pci); - pci_disable_device(chip->pci); - kfree(chip); - return 0; -} - -static int snd_atiixp_dev_free(struct snd_device *device) -{ - struct atiixp_modem *chip = device->device_data; - return snd_atiixp_free(chip); + snd_atiixp_chip_stop(card->private_data); } /* * constructor for chip instance */ -static int snd_atiixp_create(struct snd_card *card, - struct pci_dev *pci, - struct atiixp_modem **r_chip) +static int snd_atiixp_init(struct snd_card *card, struct pci_dev *pci) { - static const struct snd_device_ops ops = { - .dev_free = snd_atiixp_dev_free, - }; - struct atiixp_modem *chip; + struct atiixp_modem *chip = card->private_data; int err; - err = pci_enable_device(pci); + err = pcim_enable_device(pci); if (err < 0) return err; - chip = kzalloc(sizeof(*chip), GFP_KERNEL); - if (chip == NULL) { - pci_disable_device(pci); - return -ENOMEM; - } - spin_lock_init(&chip->reg_lock); mutex_init(&chip->open_mutex); chip->card = card; chip->pci = pci; chip->irq = -1; - err = pci_request_regions(pci, "ATI IXP MC97"); - if (err < 0) { - kfree(chip); - pci_disable_device(pci); + err = pcim_iomap_regions(pci, 1 << 0, "ATI IXP MC97"); + if (err < 0) return err; - } chip->addr = pci_resource_start(pci, 0); - chip->remap_addr = pci_ioremap_bar(pci, 0); - if (chip->remap_addr == NULL) { - dev_err(card->dev, "AC'97 space ioremap problem\n"); - snd_atiixp_free(chip); - return -EIO; - } + chip->remap_addr = pcim_iomap_table(pci)[0]; - if (request_irq(pci->irq, snd_atiixp_interrupt, IRQF_SHARED, - KBUILD_MODNAME, chip)) { + if (devm_request_irq(&pci->dev, pci->irq, snd_atiixp_interrupt, + IRQF_SHARED, KBUILD_MODNAME, chip)) { dev_err(card->dev, "unable to grab IRQ %d\n", pci->irq); - snd_atiixp_free(chip); return -EBUSY; } chip->irq = pci->irq; card->sync_irq = chip->irq; + card->private_free = snd_atiixp_free; pci_set_master(pci); - err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops); - if (err < 0) { - snd_atiixp_free(chip); - return err; - } - - *r_chip = chip; return 0; } @@ -1251,28 +1208,29 @@ static int snd_atiixp_probe(struct pci_dev *pci, struct atiixp_modem *chip; int err; - err = snd_card_new(&pci->dev, index, id, THIS_MODULE, 0, &card); + err = snd_devm_card_new(&pci->dev, index, id, THIS_MODULE, + sizeof(*chip), &card); if (err < 0) return err; + chip = card->private_data; strcpy(card->driver, "ATIIXP-MODEM"); strcpy(card->shortname, "ATI IXP Modem"); - err = snd_atiixp_create(card, pci, &chip); + err = snd_atiixp_init(card, pci); if (err < 0) - goto __error; - card->private_data = chip; + return err; err = snd_atiixp_aclink_reset(chip); if (err < 0) - goto __error; + return err; err = snd_atiixp_mixer_new(chip, ac97_clock); if (err < 0) - goto __error; + return err; err = snd_atiixp_pcm_new(chip); if (err < 0) - goto __error; + return err; snd_atiixp_proc_init(chip); @@ -1283,26 +1241,16 @@ static int snd_atiixp_probe(struct pci_dev *pci, err = snd_card_register(card); if (err < 0) - goto __error; + return err; pci_set_drvdata(pci, card); return 0; - - __error: - snd_card_free(card); - return err; -} - -static void snd_atiixp_remove(struct pci_dev *pci) -{ - snd_card_free(pci_get_drvdata(pci)); } static struct pci_driver atiixp_modem_driver = { .name = KBUILD_MODNAME, .id_table = snd_atiixp_ids, .probe = snd_atiixp_probe, - .remove = snd_atiixp_remove, .driver = { .pm = SND_ATIIXP_PM_OPS, }, From patchwork Thu Jul 15 07:58:29 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379205 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id CAA3CC07E96 for ; Thu, 15 Jul 2021 08:00:58 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id C643561362 for ; Thu, 15 Jul 2021 08:00:57 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org C643561362 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id DD8B31672; Thu, 15 Jul 2021 10:00:05 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz DD8B31672 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626336056; bh=dygp7l9dRjraYxuO8M6a3srDZkTC+yzU5SZoKKwqOQM=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=u8Tny080petJvvWRnruAh+OKIATE6I7j9hiGah6uFTbKIthZ3rFL3ZoEbCC64gB+m hhHTjhRWj+q/HksvQmHMnTu1I0tdYf8OA8vbM1xDqrNBcemmRf2ltnxncj+wgcTLHP iRpf3C/blqB2Aw7CO/0b6Z+wD64ZGYZP4zvI3pio= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id D4FACF804FB; Thu, 15 Jul 2021 10:00:04 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id D463FF804ED; Thu, 15 Jul 2021 10:00:02 +0200 (CEST) Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 05537F80217 for ; Thu, 15 Jul 2021 09:59:54 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 05537F80217 Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="nxsvuweT"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="RpVRxyQo" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out1.suse.de (Postfix) with ESMTP id 744492284F for ; Thu, 15 Jul 2021 07:59:54 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626335994; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=kujywtrM7C2dS+YRTuwBHd2FutC2YUFWonnKVXTOTg4=; b=nxsvuweTcqVs7d724RumjfVJWEj5/3BA/gU5kM9cCI1bXW6XV+rDbrTDNtORKSm5BQ3IPB UVygc22iLz2dKxIYUvMJ4eq8UBbxQEYXQYv8bsDFf2pjgRjIhcpyDuPVFV4CHGIOwodXEz M6PCQFRfi3oeVoJo3scAVcXC0h5OLzA= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626335994; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=kujywtrM7C2dS+YRTuwBHd2FutC2YUFWonnKVXTOTg4=; b=RpVRxyQoLnepPiHPfsqGs+Xd6spiV3/+/N/J3b9VVyw6YsgTRntFiUHra8EKsPVVy2ALrW kjhxPBV++sjiKeCw== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id 62A14A3B8D; Thu, 15 Jul 2021 07:59:54 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 07/79] ALSA: hda: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:58:29 +0200 Message-Id: <20210715075941.23332-8-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch is an attempt to slightly simplify the resource management in HD-audio code, by using some device-managed APIs. Only a few resources like PCI enablement and PCI resources managed via devres, but most of the rest code dealing with HD-audio core stuff couldn't be changed so much, hence the changes in this patch are pretty small in the end. A special caveat is needed for the card object: we can't move the card object release into devres, because the driver is involved with the component stuff and its unregistiration doesn't work well from devres release at all. Signed-off-by: Takashi Iwai --- sound/pci/hda/hda_controller.h | 1 - sound/pci/hda/hda_intel.c | 26 +++++--------------------- 2 files changed, 5 insertions(+), 22 deletions(-) diff --git a/sound/pci/hda/hda_controller.h b/sound/pci/hda/hda_controller.h index 68f9668788ea..e4b290de81de 100644 --- a/sound/pci/hda/hda_controller.h +++ b/sound/pci/hda/hda_controller.h @@ -141,7 +141,6 @@ struct azx { unsigned int snoop:1; unsigned int uc_buffer:1; /* non-cached pages for stream buffers */ unsigned int align_buffer_size:1; - unsigned int region_requested:1; unsigned int disabled:1; /* disabled by vga_switcheroo */ unsigned int pm_prepared:1; diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index 0322b289505e..4d64f2ce30dc 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c @@ -1367,18 +1367,11 @@ static void azx_free(struct azx *chip) if (bus->irq >= 0) free_irq(bus->irq, (void*)chip); - if (chip->msi) - pci_disable_msi(chip->pci); - iounmap(bus->remap_addr); azx_free_stream_pages(chip); azx_free_streams(chip); snd_hdac_bus_exit(bus); - if (chip->region_requested) - pci_release_regions(chip->pci); - - pci_disable_device(chip->pci); #ifdef CONFIG_SND_HDA_PATCH_LOADER release_firmware(chip->fw); #endif @@ -1767,15 +1760,13 @@ static int azx_create(struct snd_card *card, struct pci_dev *pci, *rchip = NULL; - err = pci_enable_device(pci); + err = pcim_enable_device(pci); if (err < 0) return err; hda = devm_kzalloc(&pci->dev, sizeof(*hda), GFP_KERNEL); - if (!hda) { - pci_disable_device(pci); + if (!hda) return -ENOMEM; - } chip = &hda->chip; mutex_init(&chip->open_mutex); @@ -1811,10 +1802,8 @@ static int azx_create(struct snd_card *card, struct pci_dev *pci, chip->bdl_pos_adj = bdl_pos_adj[dev]; err = azx_bus_init(chip, model[dev]); - if (err < 0) { - pci_disable_device(pci); + if (err < 0) return err; - } /* use the non-cached pages in non-snoop mode */ if (!azx_snoop(chip)) @@ -1860,17 +1849,12 @@ static int azx_first_init(struct azx *chip) } #endif - err = pci_request_regions(pci, "ICH HD audio"); + err = pcim_iomap_regions(pci, 1 << 0, "ICH HD audio"); if (err < 0) return err; - chip->region_requested = 1; bus->addr = pci_resource_start(pci, 0); - bus->remap_addr = pci_ioremap_bar(pci, 0); - if (bus->remap_addr == NULL) { - dev_err(card->dev, "ioremap error\n"); - return -ENXIO; - } + bus->remap_addr = pcim_iomap_table(pci)[0]; if (chip->driver_type == AZX_DRIVER_SKL) snd_hdac_bus_parse_capabilities(bus); From patchwork Thu Jul 15 07:58:30 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379213 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.0 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, UNWANTED_LANGUAGE_BODY,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id A1592C07E96 for ; Thu, 15 Jul 2021 08:02:46 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 275CE610D1 for ; Thu, 15 Jul 2021 08:02:46 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 275CE610D1 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id A677A16C3; Thu, 15 Jul 2021 10:01:54 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz A677A16C3 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626336164; bh=u0r0MMcEXuzys7gB+r1poMB/JHK06NbQ41Atw2AjXvI=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=pouGU9wLxYBFgpsAAQWDFdB3DDUF3Xv9TllRLY0GWTqRby2dnfoFzT9OzSEd9gpAa dOlOUmbfZf34BkfkfAmXJXpT7jRVX9YvfFgShxZat0+/TYZl1xcDSsL5tl9EXUWCaG oEgwBEQtx2V6TqC4fyjjsw9/bCJ3+G+dbqAYCGqQ= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id B3AAAF8053A; Thu, 15 Jul 2021 10:00:14 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id C8FA6F8051D; Thu, 15 Jul 2021 10:00:09 +0200 (CEST) Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id A5B2FF80240 for ; Thu, 15 Jul 2021 09:59:56 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz A5B2FF80240 Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="o72VEIM0"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="6V6no7oH" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out2.suse.de (Postfix) with ESMTP id 05C811FDF1 for ; Thu, 15 Jul 2021 07:59:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626335995; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=m8pc2c6upT4f/IawpfVgQ9TB9w3B6L3EC07I8Ldp8lY=; b=o72VEIM0yT8mcc7Od/N6QahGy4KzckKv39HhCxTINCCrTilM5Oyn4qbZQCs3sdWFgwuJOR UYleXUN5RkE0E/OMx6WRSGCdqbWVb6FwqP1vI+fTmv8XY8tvsE2/2AEGd+awY63FrtSarn q2AsebjXGbi+JjYwcQgdvNoTFtO1mRA= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626335995; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=m8pc2c6upT4f/IawpfVgQ9TB9w3B6L3EC07I8Ldp8lY=; b=6V6no7oHOEOKuBpR64U1/fE6L/iuPI3f7VU+G1DC86TCfiNujHkk9DiqG8IKMjDRQsh/3X QOHvFl9XlKCP5DAA== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id E825AA3B8D; Thu, 15 Jul 2021 07:59:54 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 08/79] ALSA: ad1889: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:58:30 +0200 Message-Id: <20210715075941.23332-9-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in PCI ad1889 driver with devres as a clean up. Each manual resource management is converted with the corresponding devres helper, and the card object release is managed now via card->private_free instead of a lowlevel snd_device. Also, the unnecessary ac97 free callbacks are removed, too. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- sound/pci/ad1889.c | 144 ++++++++------------------------------------- 1 file changed, 25 insertions(+), 119 deletions(-) diff --git a/sound/pci/ad1889.c b/sound/pci/ad1889.c index 5c78951dd596..bba4dae8dcc7 100644 --- a/sound/pci/ad1889.c +++ b/sound/pci/ad1889.c @@ -740,20 +740,6 @@ snd_ad1889_ac97_xinit(struct snd_ad1889 *chip) } -static void -snd_ad1889_ac97_bus_free(struct snd_ac97_bus *bus) -{ - struct snd_ad1889 *chip = bus->private_data; - chip->ac97_bus = NULL; -} - -static void -snd_ad1889_ac97_free(struct snd_ac97 *ac97) -{ - struct snd_ad1889 *chip = ac97->private_data; - chip->ac97 = NULL; -} - static int snd_ad1889_ac97_init(struct snd_ad1889 *chip, const char *quirk_override) { @@ -771,11 +757,8 @@ snd_ad1889_ac97_init(struct snd_ad1889 *chip, const char *quirk_override) if (err < 0) return err; - chip->ac97_bus->private_free = snd_ad1889_ac97_bus_free; - memset(&ac97, 0, sizeof(ac97)); ac97.private_data = chip; - ac97.private_free = snd_ad1889_ac97_free; ac97.pci = chip->pci; err = snd_ac97_mixer(chip->ac97_bus, &ac97, &chip->ac97); @@ -787,11 +770,10 @@ snd_ad1889_ac97_init(struct snd_ad1889 *chip, const char *quirk_override) return 0; } -static int -snd_ad1889_free(struct snd_ad1889 *chip) +static void +snd_ad1889_free(struct snd_card *card) { - if (chip->irq < 0) - goto skip_hw; + struct snd_ad1889 *chip = card->private_data; spin_lock_irq(&chip->lock); @@ -805,125 +787,60 @@ snd_ad1889_free(struct snd_ad1889 *chip) ad1889_readl(chip, AD_DMA_DISR); /* flush, dammit! */ spin_unlock_irq(&chip->lock); - - if (chip->irq >= 0) - free_irq(chip->irq, chip); - -skip_hw: - iounmap(chip->iobase); - pci_release_regions(chip->pci); - pci_disable_device(chip->pci); - kfree(chip); - return 0; -} - -static int -snd_ad1889_dev_free(struct snd_device *device) -{ - struct snd_ad1889 *chip = device->device_data; - return snd_ad1889_free(chip); -} - -static int -snd_ad1889_init(struct snd_ad1889 *chip) -{ - ad1889_writew(chip, AD_DS_CCS, AD_DS_CCS_CLKEN); /* turn on clock */ - ad1889_readw(chip, AD_DS_CCS); /* flush posted write */ - - usleep_range(10000, 11000); - - /* enable Master and Target abort interrupts */ - ad1889_writel(chip, AD_DMA_DISR, AD_DMA_DISR_PMAE | AD_DMA_DISR_PTAE); - - return 0; } static int -snd_ad1889_create(struct snd_card *card, - struct pci_dev *pci, - struct snd_ad1889 **rchip) +snd_ad1889_create(struct snd_card *card, struct pci_dev *pci) { + struct snd_ad1889 *chip = card->private_data; int err; - struct snd_ad1889 *chip; - static const struct snd_device_ops ops = { - .dev_free = snd_ad1889_dev_free, - }; - - *rchip = NULL; - - err = pci_enable_device(pci); + err = pcim_enable_device(pci); if (err < 0) return err; /* check PCI availability (32bit DMA) */ if (dma_set_mask_and_coherent(&pci->dev, DMA_BIT_MASK(32))) { dev_err(card->dev, "error setting 32-bit DMA mask.\n"); - pci_disable_device(pci); return -ENXIO; } - /* allocate chip specific data with zero-filled memory */ - chip = kzalloc(sizeof(*chip), GFP_KERNEL); - if (!chip) { - pci_disable_device(pci); - return -ENOMEM; - } - chip->card = card; - card->private_data = chip; chip->pci = pci; chip->irq = -1; /* (1) PCI resource allocation */ - err = pci_request_regions(pci, card->driver); + err = pcim_iomap_regions(pci, 1 << 0, card->driver); if (err < 0) - goto free_and_ret; + return err; chip->bar = pci_resource_start(pci, 0); - chip->iobase = pci_ioremap_bar(pci, 0); - if (chip->iobase == NULL) { - dev_err(card->dev, "unable to reserve region.\n"); - err = -EBUSY; - goto free_and_ret; - } + chip->iobase = pcim_iomap_table(pci)[0]; pci_set_master(pci); spin_lock_init(&chip->lock); /* only now can we call ad1889_free */ - if (request_irq(pci->irq, snd_ad1889_interrupt, - IRQF_SHARED, KBUILD_MODNAME, chip)) { + if (devm_request_irq(&pci->dev, pci->irq, snd_ad1889_interrupt, + IRQF_SHARED, KBUILD_MODNAME, chip)) { dev_err(card->dev, "cannot obtain IRQ %d\n", pci->irq); - snd_ad1889_free(chip); return -EBUSY; } chip->irq = pci->irq; card->sync_irq = chip->irq; + card->private_free = snd_ad1889_free; /* (2) initialization of the chip hardware */ - err = snd_ad1889_init(chip); - if (err < 0) { - snd_ad1889_free(chip); - return err; - } + ad1889_writew(chip, AD_DS_CCS, AD_DS_CCS_CLKEN); /* turn on clock */ + ad1889_readw(chip, AD_DS_CCS); /* flush posted write */ - err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops); - if (err < 0) { - snd_ad1889_free(chip); - return err; - } + usleep_range(10000, 11000); - *rchip = chip; + /* enable Master and Target abort interrupts */ + ad1889_writel(chip, AD_DMA_DISR, AD_DMA_DISR_PMAE | AD_DMA_DISR_PTAE); return 0; - -free_and_ret: - kfree(chip); - pci_disable_device(pci); - - return err; } static int @@ -944,19 +861,19 @@ snd_ad1889_probe(struct pci_dev *pci, } /* (2) */ - err = snd_card_new(&pci->dev, index[devno], id[devno], THIS_MODULE, - 0, &card); - /* XXX REVISIT: we can probably allocate chip in this call */ + err = snd_devm_card_new(&pci->dev, index[devno], id[devno], THIS_MODULE, + sizeof(*chip), &card); if (err < 0) return err; + chip = card->private_data; strcpy(card->driver, "AD1889"); strcpy(card->shortname, "Analog Devices AD1889"); /* (3) */ - err = snd_ad1889_create(card, pci, &chip); + err = snd_ad1889_create(card, pci); if (err < 0) - goto free_and_ret; + return err; /* (4) */ sprintf(card->longname, "%s at 0x%lx irq %i", @@ -966,11 +883,11 @@ snd_ad1889_probe(struct pci_dev *pci, /* register AC97 mixer */ err = snd_ad1889_ac97_init(chip, ac97_quirk[devno]); if (err < 0) - goto free_and_ret; + return err; err = snd_ad1889_pcm_init(chip, 0); if (err < 0) - goto free_and_ret; + return err; /* register proc interface */ snd_ad1889_proc_init(chip); @@ -978,23 +895,13 @@ snd_ad1889_probe(struct pci_dev *pci, /* (6) */ err = snd_card_register(card); if (err < 0) - goto free_and_ret; + return err; /* (7) */ pci_set_drvdata(pci, card); devno++; return 0; - -free_and_ret: - snd_card_free(card); - return err; -} - -static void -snd_ad1889_remove(struct pci_dev *pci) -{ - snd_card_free(pci_get_drvdata(pci)); } static const struct pci_device_id snd_ad1889_ids[] = { @@ -1007,7 +914,6 @@ static struct pci_driver ad1889_pci_driver = { .name = KBUILD_MODNAME, .id_table = snd_ad1889_ids, .probe = snd_ad1889_probe, - .remove = snd_ad1889_remove, }; module_pci_driver(ad1889_pci_driver); From patchwork Thu Jul 15 07:58:31 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379221 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9E672C07E96 for ; Thu, 15 Jul 2021 08:03:57 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 264A6610C7 for ; Thu, 15 Jul 2021 08:03:57 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 264A6610C7 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id A9B1416BE; Thu, 15 Jul 2021 10:03:05 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz A9B1416BE DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626336235; bh=Sgyr/28/hWi3iqXKf4RMHJdDGR7248SaE8ju4gupa08=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=CCXRf8Bxisdfy3XJ7uY5sKrpKKMH8PkHpLWEPnqosCtfHlrcazSdrirY5JbqUeWnl ihLtO/W6kJ14d8INhMjYei0V4RZQvRyaIfZvX4i/S0mw00vr70pCl2xwlT49U8pOLA CglWv3759qBv3mlQbTtrKsydQtp5Vlc3bV4lXN2U= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id 5FE29F80559; Thu, 15 Jul 2021 10:00:18 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id 4A434F80527; Thu, 15 Jul 2021 10:00:11 +0200 (CEST) Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 393C8F804A9 for ; Thu, 15 Jul 2021 09:59:56 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 393C8F804A9 Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="Kz3xAUIR"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="lXF94iUM" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out2.suse.de (Postfix) with ESMTP id 9517D1FDF2 for ; Thu, 15 Jul 2021 07:59:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626335995; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=i31mm3UNYG7ksKe/S6D/uXkcvMfW/Lx8iyy2EJ3/ez8=; b=Kz3xAUIRruBIs8U1ZoJmmRz3l6BNtDh0ZahtDeBjRW/L9y4h8+Mf8XSwrNNGVNIr4Kfy0k CJa1khNKdl3cjVfuY7RkJUPKvTxW8R1HUCoFyyKSvj9WPgMhTzGEFr1thQ7PChDk6W3gRI nrn4WS6Dp+3Wgboe78TDILsWSjV65cM= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626335995; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=i31mm3UNYG7ksKe/S6D/uXkcvMfW/Lx8iyy2EJ3/ez8=; b=lXF94iUMm3zjueRJcsLadDT/9fG7cbekMxCgV/1Ffeon2i/hRLrhmqMxsVlDlJ1L+9/73u +i4+1cjVpuFHOHCw== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id 81A11A3B99; Thu, 15 Jul 2021 07:59:55 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 09/79] ALSA: als300: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:58:31 +0200 Message-Id: <20210715075941.23332-10-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in PCI als300 driver with devres as a clean up. Each manual resource management is converted with the corresponding devres helper, and the card object release is managed now via card->private_free instead of a lowlevel snd_device. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai Reported-by: Nathan Chancellor Signed-off-by: Takashi Iwai --- sound/pci/als300.c | 79 ++++++++++------------------------------------ 1 file changed, 17 insertions(+), 62 deletions(-) diff --git a/sound/pci/als300.c b/sound/pci/als300.c index 668008fc21f7..9c94072572a5 100644 --- a/sound/pci/als300.c +++ b/sound/pci/als300.c @@ -163,21 +163,11 @@ static void snd_als300_set_irq_flag(struct snd_als300 *chip, int cmd) snd_als300_gcr_write(chip->port, MISC_CONTROL, tmp); } -static int snd_als300_free(struct snd_als300 *chip) +static void snd_als300_free(struct snd_card *card) { - snd_als300_set_irq_flag(chip, IRQ_DISABLE); - if (chip->irq >= 0) - free_irq(chip->irq, chip); - pci_release_regions(chip->pci); - pci_disable_device(chip->pci); - kfree(chip); - return 0; -} + struct snd_als300 *chip = card->private_data; -static int snd_als300_dev_free(struct snd_device *device) -{ - struct snd_als300 *chip = device->device_data; - return snd_als300_free(chip); + snd_als300_set_irq_flag(chip, IRQ_DISABLE); } static irqreturn_t snd_als300_interrupt(int irq, void *dev_id) @@ -248,11 +238,6 @@ static irqreturn_t snd_als300plus_interrupt(int irq, void *dev_id) return IRQ_HANDLED; } -static void snd_als300_remove(struct pci_dev *pci) -{ - snd_card_free(pci_get_drvdata(pci)); -} - static unsigned short snd_als300_ac97_read(struct snd_ac97 *ac97, unsigned short reg) { @@ -610,35 +595,22 @@ static void snd_als300_init(struct snd_als300 *chip) } static int snd_als300_create(struct snd_card *card, - struct pci_dev *pci, int chip_type, - struct snd_als300 **rchip) + struct pci_dev *pci, int chip_type) { - struct snd_als300 *chip; + struct snd_als300 *chip = card->private_data; void *irq_handler; int err; - static const struct snd_device_ops ops = { - .dev_free = snd_als300_dev_free, - }; - *rchip = NULL; - - err = pci_enable_device(pci); + err = pcim_enable_device(pci); if (err < 0) return err; if (dma_set_mask_and_coherent(&pci->dev, DMA_BIT_MASK(28))) { dev_err(card->dev, "error setting 28bit DMA mask\n"); - pci_disable_device(pci); return -ENXIO; } pci_set_master(pci); - chip = kzalloc(sizeof(*chip), GFP_KERNEL); - if (chip == NULL) { - pci_disable_device(pci); - return -ENOMEM; - } - chip->card = card; chip->pci = pci; chip->irq = -1; @@ -646,11 +618,9 @@ static int snd_als300_create(struct snd_card *card, spin_lock_init(&chip->reg_lock); err = pci_request_regions(pci, "ALS300"); - if (err < 0) { - kfree(chip); - pci_disable_device(pci); + if (err < 0) return err; - } + chip->port = pci_resource_start(pci, 0); if (chip->chip_type == DEVICE_ALS300_PLUS) @@ -658,38 +628,29 @@ static int snd_als300_create(struct snd_card *card, else irq_handler = snd_als300_interrupt; - if (request_irq(pci->irq, irq_handler, IRQF_SHARED, - KBUILD_MODNAME, chip)) { + if (devm_request_irq(&pci->dev, pci->irq, irq_handler, IRQF_SHARED, + KBUILD_MODNAME, chip)) { dev_err(card->dev, "unable to grab IRQ %d\n", pci->irq); - snd_als300_free(chip); return -EBUSY; } chip->irq = pci->irq; card->sync_irq = chip->irq; + card->private_free = snd_als300_free; snd_als300_init(chip); err = snd_als300_ac97(chip); if (err < 0) { dev_err(card->dev, "Could not create ac97\n"); - snd_als300_free(chip); return err; } err = snd_als300_new_pcm(chip); if (err < 0) { dev_err(card->dev, "Could not create PCM\n"); - snd_als300_free(chip); - return err; - } - - err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops); - if (err < 0) { - snd_als300_free(chip); return err; } - *rchip = chip; return 0; } @@ -737,20 +698,16 @@ static int snd_als300_probe(struct pci_dev *pci, return -ENOENT; } - err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, - 0, &card); - + err = snd_devm_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, + sizeof(*chip), &card); if (err < 0) return err; chip_type = pci_id->driver_data; - err = snd_als300_create(card, pci, chip_type, &chip); - if (err < 0) { - snd_card_free(card); + err = snd_als300_create(card, pci, chip_type); + if (err < 0) return err; - } - card->private_data = chip; strcpy(card->driver, "ALS300"); if (chip->chip_type == DEVICE_ALS300_PLUS) @@ -764,10 +721,9 @@ static int snd_als300_probe(struct pci_dev *pci, card->shortname, chip->port, chip->irq); err = snd_card_register(card); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } + pci_set_drvdata(pci, card); dev++; return 0; @@ -777,7 +733,6 @@ static struct pci_driver als300_driver = { .name = KBUILD_MODNAME, .id_table = snd_als300_ids, .probe = snd_als300_probe, - .remove = snd_als300_remove, .driver = { .pm = SND_ALS300_PM_OPS, }, From patchwork Thu Jul 15 07:58:32 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379229 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 87205C07E96 for ; Thu, 15 Jul 2021 08:05:27 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 01DFA610E5 for ; Thu, 15 Jul 2021 08:05:26 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 01DFA610E5 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id 777E4169E; Thu, 15 Jul 2021 10:04:35 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 777E4169E DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626336325; bh=iL+5QYWcqFJ/rqVbv6HLHKqK9CLp3bE/Iik22OwQ83w=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=Ca/LPaNIfW5iZjvXpV7dzEygbCWivnd5PZcBOJZ6OWjmT3HIbmZ70DNbJjl+ewjn+ pGhEk0bbb6gZd/bcw43rYdm6jXlK8Hn9+37tq+a9/Q6pDWXHX6+uJaRKUgDBwDa8A0 F7f9gRUnTy8UjT2RHPkxsT7IZluRdjHepR0i/rl8= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id 7B15FF805AE; Thu, 15 Jul 2021 10:00:24 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id 295B1F80552; Thu, 15 Jul 2021 10:00:17 +0200 (CEST) Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 044D5F804E0 for ; Thu, 15 Jul 2021 09:59:57 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 044D5F804E0 Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="npuBCsse"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="BK8nBEHS" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out2.suse.de (Postfix) with ESMTP id 1D2501FDF3 for ; Thu, 15 Jul 2021 07:59:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626335996; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=nl60tUDaTiqUjJ7wQbcQb591DUGCv849os2WeQHxgc8=; b=npuBCsse0ffYIK2sizBbuqyrGlNEjaFU2H43lJ4MyUiYRpKFTnUaulkL1b0FT2M9hJqR38 SBUWV34Bz+kIoufc0n88tK4U9yKlRp1dXVyTAU1rkLF3ySveI7P4d2u8dpS/WRa/yHlO3q Ux+3IlSEmen39d/1Fp1ElD8UckR62XI= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626335996; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=nl60tUDaTiqUjJ7wQbcQb591DUGCv849os2WeQHxgc8=; b=BK8nBEHSjoaZE8DQzBi8BpkkwLNN5AKhb5E/E1kefV37UwDglzuBxZwU96nLeJWzba5dB0 nHsd4x5YMQxpyoDw== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id 165F4A3B99; Thu, 15 Jul 2021 07:59:56 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 10/79] ALSA: als4000: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:58:32 +0200 Message-Id: <20210715075941.23332-11-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in PCI als4000 driver with devres as a clean up. Each manual resource management is converted with the corresponding devres helper, and the card object release is managed now via card->private_free instead of a lowlevel snd_device. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- sound/pci/als4000.c | 59 +++++++++++++-------------------------------- 1 file changed, 17 insertions(+), 42 deletions(-) diff --git a/sound/pci/als4000.c b/sound/pci/als4000.c index 509f317ee682..535eccd124be 100644 --- a/sound/pci/als4000.c +++ b/sound/pci/als4000.c @@ -746,13 +746,15 @@ static int snd_als4000_create_gameport(struct snd_card_als4000 *acard, int dev) if (joystick_port[dev] == 1) { /* auto-detect */ for (io_port = 0x200; io_port <= 0x218; io_port += 8) { - r = request_region(io_port, 8, "ALS4000 gameport"); + r = devm_request_region(&acard->pci->dev, io_port, 8, + "ALS4000 gameport"); if (r) break; } } else { io_port = joystick_port[dev]; - r = request_region(io_port, 8, "ALS4000 gameport"); + r = devm_request_region(&acard->pci->dev, io_port, 8, + "ALS4000 gameport"); } if (!r) { @@ -763,7 +765,6 @@ static int snd_als4000_create_gameport(struct snd_card_als4000 *acard, int dev) acard->gameport = gp = gameport_allocate_port(); if (!gp) { dev_err(&acard->pci->dev, "cannot allocate memory for gameport\n"); - release_and_free_resource(r); return -ENOMEM; } @@ -771,7 +772,6 @@ static int snd_als4000_create_gameport(struct snd_card_als4000 *acard, int dev) gameport_set_phys(gp, "pci%s/gameport0", pci_name(acard->pci)); gameport_set_dev_parent(gp, &acard->pci->dev); gp->io = io_port; - gameport_set_port_data(gp, r); /* Enable legacy joystick port */ snd_als4000_set_addr(acard->iobase, 0, 0, 0, 1); @@ -784,15 +784,11 @@ static int snd_als4000_create_gameport(struct snd_card_als4000 *acard, int dev) static void snd_als4000_free_gameport(struct snd_card_als4000 *acard) { if (acard->gameport) { - struct resource *r = gameport_get_port_data(acard->gameport); - gameport_unregister_port(acard->gameport); acard->gameport = NULL; /* disable joystick */ snd_als4000_set_addr(acard->iobase, 0, 0, 0, 0); - - release_and_free_resource(r); } } #else @@ -808,8 +804,6 @@ static void snd_card_als4000_free( struct snd_card *card ) snd_als4k_gcr_write_addr(acard->iobase, ALS4K_GCR8C_MISC_CTRL, 0); /* free resources */ snd_als4000_free_gameport(acard); - pci_release_regions(acard->pci); - pci_disable_device(acard->pci); } static int snd_card_als4000_probe(struct pci_dev *pci, @@ -832,36 +826,30 @@ static int snd_card_als4000_probe(struct pci_dev *pci, } /* enable PCI device */ - err = pci_enable_device(pci); + err = pcim_enable_device(pci); if (err < 0) return err; /* check, if we can restrict PCI DMA transfers to 24 bits */ if (dma_set_mask_and_coherent(&pci->dev, DMA_BIT_MASK(24))) { dev_err(&pci->dev, "architecture does not support 24bit PCI busmaster DMA\n"); - pci_disable_device(pci); return -ENXIO; } err = pci_request_regions(pci, "ALS4000"); - if (err < 0) { - pci_disable_device(pci); + if (err < 0) return err; - } iobase = pci_resource_start(pci, 0); pci_read_config_word(pci, PCI_COMMAND, &word); pci_write_config_word(pci, PCI_COMMAND, word | PCI_COMMAND_IO); pci_set_master(pci); - err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, - sizeof(*acard) /* private_data: acard */, - &card); - if (err < 0) { - pci_release_regions(pci); - pci_disable_device(pci); + err = snd_devm_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, + sizeof(*acard) /* private_data: acard */, + &card); + if (err < 0) return err; - } acard = card->private_data; acard->pci = pci; @@ -881,7 +869,7 @@ static int snd_card_als4000_probe(struct pci_dev *pci, SB_HW_ALS4000, &chip); if (err < 0) - goto out_err; + return err; acard->chip = chip; chip->pci = pci; @@ -902,7 +890,7 @@ static int snd_card_als4000_probe(struct pci_dev *pci, if (err < 0) { dev_err(&pci->dev, "no MPU-401 device at 0x%lx?\n", iobase + ALS4K_IOB_30_MIDI_DATA); - goto out_err; + return err; } /* FIXME: ALS4000 has interesting MPU401 configuration features * at ALS4K_CR1A_MPU401_UART_MODE_CONTROL @@ -912,11 +900,11 @@ static int snd_card_als4000_probe(struct pci_dev *pci, err = snd_als4000_pcm(chip, 0); if (err < 0) - goto out_err; + return err; err = snd_sbmixer_new(chip); if (err < 0) - goto out_err; + return err; if (snd_opl3_create(card, iobase + ALS4K_IOB_10_ADLIB_ADDR0, @@ -928,30 +916,18 @@ static int snd_card_als4000_probe(struct pci_dev *pci, } else { err = snd_opl3_hwdep_new(opl3, 0, 1, NULL); if (err < 0) - goto out_err; + return err; } snd_als4000_create_gameport(acard, dev); err = snd_card_register(card); if (err < 0) - goto out_err; + return err; pci_set_drvdata(pci, card); dev++; - err = 0; - goto out; - -out_err: - snd_card_free(card); - -out: - return err; -} - -static void snd_card_als4000_remove(struct pci_dev *pci) -{ - snd_card_free(pci_get_drvdata(pci)); + return 0; } #ifdef CONFIG_PM_SLEEP @@ -996,7 +972,6 @@ static struct pci_driver als4000_driver = { .name = KBUILD_MODNAME, .id_table = snd_als4000_ids, .probe = snd_card_als4000_probe, - .remove = snd_card_als4000_remove, .driver = { .pm = SND_ALS4000_PM_OPS, }, From patchwork Thu Jul 15 07:58:33 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379227 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 75536C07E96 for ; Thu, 15 Jul 2021 08:05:08 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id E70A5610C7 for ; Thu, 15 Jul 2021 08:05:07 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org E70A5610C7 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id 7F8A2167E; Thu, 15 Jul 2021 10:04:16 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 7F8A2167E DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626336306; bh=0CHq83icnk0lyM3pxrlCAd8K+/mSoHI/DB7w6Nb0DpE=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=fp4ReC4kVKeG3wAciO1zks5b00Jj6qB5ZIDqorwfKHALONLK3F2swl8ZNOTa3vxQM 2QpLKb695H9TEpAL/ZhB6XtJM7idbZR08Cfv3VtyNKbOqDT6dKoqRkrW0YlA8l4VLC 9AS6NRCux6JlllZ3wXVGdIFdGSqiStSZWnT3aC90= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id 136C1F805A8; Thu, 15 Jul 2021 10:00:23 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id BB25FF80551; Thu, 15 Jul 2021 10:00:16 +0200 (CEST) Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id F0D3CF804D2 for ; Thu, 15 Jul 2021 09:59:57 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz F0D3CF804D2 Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="tDUlW/0w"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="cULpvaZZ" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out2.suse.de (Postfix) with ESMTP id BD8B01FDE5 for ; Thu, 15 Jul 2021 07:59:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626335996; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=ur5TcnpNUht5hJjxu5Icx9JkyUj2FHX6R1MyuDkEkcc=; b=tDUlW/0wF1M2pdx49B3JtGDH8WpK8DdWVzS0GvFPm/2Bt0ouE4jLEIgb6Sc7rK5klq12Dt IL5SSMIcbvP7PazuBajPbOCLKt2CHWivAtDjMMc3Wg3Lsq7/EVbbawtQtNsD9jJiF5x7Da lBuD3inKfKKo21C0lin48yiu2dcjQ6I= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626335996; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=ur5TcnpNUht5hJjxu5Icx9JkyUj2FHX6R1MyuDkEkcc=; b=cULpvaZZtDasgDCBS83zrYjnng0XY0RtcxKlfdYj1MCthDmhAZcB2E74VWeBDyS+jvk8mR kTMDAEYyQ2/prKDw== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id AACFBA3B99; Thu, 15 Jul 2021 07:59:56 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 11/79] ALSA: azt3328: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:58:33 +0200 Message-Id: <20210715075941.23332-12-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in PCI azt3328 driver with devres as a clean up. Each manual resource management is converted with the corresponding devres helper, and the card object release is managed now via card->private_free instead of a lowlevel snd_device. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- sound/pci/azt3328.c | 124 +++++++++++--------------------------------- 1 file changed, 30 insertions(+), 94 deletions(-) diff --git a/sound/pci/azt3328.c b/sound/pci/azt3328.c index 4ee7ab409807..089050470ff2 100644 --- a/sound/pci/azt3328.c +++ b/sound/pci/azt3328.c @@ -2244,32 +2244,15 @@ snd_azf3328_timer(struct snd_azf3328 *chip, int device) /******************************************************************/ -static int -snd_azf3328_free(struct snd_azf3328 *chip) +static void +snd_azf3328_free(struct snd_card *card) { - if (chip->irq < 0) - goto __end_hw; + struct snd_azf3328 *chip = card->private_data; snd_azf3328_mixer_reset(chip); snd_azf3328_timer_stop(chip->timer); snd_azf3328_gameport_free(chip); - -__end_hw: - if (chip->irq >= 0) - free_irq(chip->irq, chip); - pci_release_regions(chip->pci); - pci_disable_device(chip->pci); - - kfree(chip); - return 0; -} - -static int -snd_azf3328_dev_free(struct snd_device *device) -{ - struct snd_azf3328 *chip = device->device_data; - return snd_azf3328_free(chip); } #if 0 @@ -2350,29 +2333,18 @@ snd_azf3328_debug_show_ports(const struct snd_azf3328 *chip) static int snd_azf3328_create(struct snd_card *card, struct pci_dev *pci, - unsigned long device_type, - struct snd_azf3328 **rchip) + unsigned long device_type) { - struct snd_azf3328 *chip; + struct snd_azf3328 *chip = card->private_data; int err; - static const struct snd_device_ops ops = { - .dev_free = snd_azf3328_dev_free, - }; u8 dma_init; enum snd_azf3328_codec_type codec_type; struct snd_azf3328_codec_data *codec_setup; - *rchip = NULL; - - err = pci_enable_device(pci); + err = pcim_enable_device(pci); if (err < 0) return err; - chip = kzalloc(sizeof(*chip), GFP_KERNEL); - if (chip == NULL) { - err = -ENOMEM; - goto out_err; - } spin_lock_init(&chip->reg_lock); chip->card = card; chip->pci = pci; @@ -2383,13 +2355,12 @@ snd_azf3328_create(struct snd_card *card, dev_err(card->dev, "architecture does not support 24bit PCI busmaster DMA\n" ); - err = -ENXIO; - goto out_err; + return -ENXIO; } err = pci_request_regions(pci, "Aztech AZF3328"); if (err < 0) - goto out_err; + return err; chip->ctrl_io = pci_resource_start(pci, 0); chip->game_io = pci_resource_start(pci, 1); @@ -2415,26 +2386,22 @@ snd_azf3328_create(struct snd_card *card, codec_setup->type = AZF_CODEC_I2S_OUT; codec_setup->name = "I2S_OUT"; - if (request_irq(pci->irq, snd_azf3328_interrupt, - IRQF_SHARED, KBUILD_MODNAME, chip)) { + if (devm_request_irq(&pci->dev, pci->irq, snd_azf3328_interrupt, + IRQF_SHARED, KBUILD_MODNAME, chip)) { dev_err(card->dev, "unable to grab IRQ %d\n", pci->irq); - err = -EBUSY; - goto out_err; + return -EBUSY; } chip->irq = pci->irq; card->sync_irq = chip->irq; + card->private_free = snd_azf3328_free; pci_set_master(pci); snd_azf3328_debug_show_ports(chip); - err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops); - if (err < 0) - goto out_err; - /* create mixer interface & switches */ err = snd_azf3328_mixer_new(chip); if (err < 0) - goto out_err; + return err; /* standard codec init stuff */ /* default DMA init value */ @@ -2456,18 +2423,7 @@ snd_azf3328_create(struct snd_card *card, spin_unlock_irq(codec->lock); } - *rchip = chip; - - err = 0; - goto out; - -out_err: - if (chip) - snd_azf3328_free(chip); - pci_disable_device(pci); - -out: - return err; + return 0; } static int @@ -2479,29 +2435,25 @@ snd_azf3328_probe(struct pci_dev *pci, const struct pci_device_id *pci_id) struct snd_opl3 *opl3; int err; - if (dev >= SNDRV_CARDS) { - err = -ENODEV; - goto out; - } + if (dev >= SNDRV_CARDS) + return -ENODEV; if (!enable[dev]) { dev++; - err = -ENOENT; - goto out; + return -ENOENT; } - err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, - 0, &card); + err = snd_devm_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, + sizeof(*chip), &card); if (err < 0) - goto out; + return err; + chip = card->private_data; strcpy(card->driver, "AZF3328"); strcpy(card->shortname, "Aztech AZF3328 (PCI168)"); - err = snd_azf3328_create(card, pci, pci_id->driver_data, &chip); + err = snd_azf3328_create(card, pci, pci_id->driver_data); if (err < 0) - goto out_err; - - card->private_data = chip; + return err; /* chose to use MPU401_HW_AZT2320 ID instead of MPU401_HW_MPU401, since our hardware ought to be similar, thus use same ID. */ @@ -2515,16 +2467,16 @@ snd_azf3328_probe(struct pci_dev *pci, const struct pci_device_id *pci_id) dev_err(card->dev, "no MPU-401 device at 0x%lx?\n", chip->mpu_io ); - goto out_err; + return err; } err = snd_azf3328_timer(chip, 0); if (err < 0) - goto out_err; + return err; err = snd_azf3328_pcm(chip); if (err < 0) - goto out_err; + return err; if (snd_opl3_create(card, chip->opl3_io, chip->opl3_io+2, OPL3_HW_AUTO, 1, &opl3) < 0) { @@ -2535,10 +2487,10 @@ snd_azf3328_probe(struct pci_dev *pci, const struct pci_device_id *pci_id) /* need to use IDs 1, 2 since ID 0 is snd_azf3328_timer above */ err = snd_opl3_timer_new(opl3, 1, 2); if (err < 0) - goto out_err; + return err; err = snd_opl3_hwdep_new(opl3, 0, 1, NULL); if (err < 0) - goto out_err; + return err; opl3->private_data = chip; } @@ -2547,7 +2499,7 @@ snd_azf3328_probe(struct pci_dev *pci, const struct pci_device_id *pci_id) err = snd_card_register(card); if (err < 0) - goto out_err; + return err; #ifdef MODULE dev_info(card->dev, @@ -2565,22 +2517,7 @@ snd_azf3328_probe(struct pci_dev *pci, const struct pci_device_id *pci_id) pci_set_drvdata(pci, card); dev++; - - err = 0; - goto out; - -out_err: - dev_err(card->dev, "something failed, exiting\n"); - snd_card_free(card); - -out: - return err; -} - -static void -snd_azf3328_remove(struct pci_dev *pci) -{ - snd_card_free(pci_get_drvdata(pci)); + return 0; } #ifdef CONFIG_PM_SLEEP @@ -2709,7 +2646,6 @@ static struct pci_driver azf3328_driver = { .name = KBUILD_MODNAME, .id_table = snd_azf3328_ids, .probe = snd_azf3328_probe, - .remove = snd_azf3328_remove, .driver = { .pm = SND_AZF3328_PM_OPS, }, From patchwork Thu Jul 15 07:58:34 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379233 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id E3D9EC07E96 for ; Thu, 15 Jul 2021 08:06:22 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id F0757610D1 for ; Thu, 15 Jul 2021 08:06:21 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org F0757610D1 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id 76D74169B; Thu, 15 Jul 2021 10:05:30 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 76D74169B DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626336380; bh=9oT/8Yn6eM/MS37V2qs4XXcYDIVtK0JgNZI3RjsnY9M=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=IUu9/d/D8GjxqLu9UO0lAriqkBKzwm6LzN1CnQBQBfYDbevl5PixSOlp/Yg1tQBUo fy0M47EfC3aD29ED0DZPeAdzyLz1DrZdfb9ssoGmKsF3ns2GUHHf6GyWYEwpn7Z98l Q58xOeiWVM+J9oqTEVHM3hZok5G/P7sw4YdnZZ6o= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id 7C05DF805C8; Thu, 15 Jul 2021 10:00:29 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id C01E5F8057A; Thu, 15 Jul 2021 10:00:20 +0200 (CEST) Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 6E986F804E1 for ; Thu, 15 Jul 2021 09:59:58 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 6E986F804E1 Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="c6l52mFW"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="FCkCWryL" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out2.suse.de (Postfix) with ESMTP id 637821FDF4 for ; Thu, 15 Jul 2021 07:59:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626335997; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=lVoQFZcZDEz/aIY4axXyCs2PwKbA/oK8tE2aB3o6Z9s=; b=c6l52mFWDEiLLqh0Wd4q2NC1KYpb61amoMi+trPQ8mZ6X1nXuPRSE6yB4NJzbXmfpSODSH RbWXmAXwF0NJfYzU/2r2ceoRqbHFx2wKXwv9AodOhz5HOMrOSYU2h3nqFQBD0dP986UOcU j6kSzoua8laJLzCkKSPOm2QXzJb+C60= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626335997; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=lVoQFZcZDEz/aIY4axXyCs2PwKbA/oK8tE2aB3o6Z9s=; b=FCkCWryL1W4EvDCumwixQY21ETEBSRtK9V2X5tDzYYoc93ZDUSqN4hFq+wJQrx/X3yYkH3 Oq1OC5kCvwT/zrCw== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id 51526A3B99; Thu, 15 Jul 2021 07:59:57 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 12/79] ALSA: bt87x: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:58:34 +0200 Message-Id: <20210715075941.23332-13-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in PCI bt87x driver with devres as a clean up. Each manual resource management is converted with the corresponding devres helper, and the card object release is managed now via card->private_free instead of a lowlevel snd_device. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- sound/pci/bt87x.c | 98 ++++++++++++----------------------------------- 1 file changed, 25 insertions(+), 73 deletions(-) diff --git a/sound/pci/bt87x.c b/sound/pci/bt87x.c index 39bcfb81e81c..d23f93163841 100644 --- a/sound/pci/bt87x.c +++ b/sound/pci/bt87x.c @@ -656,23 +656,11 @@ static const struct snd_kcontrol_new snd_bt87x_capture_source = { .put = snd_bt87x_capture_source_put, }; -static int snd_bt87x_free(struct snd_bt87x *chip) -{ - if (chip->mmio) - snd_bt87x_stop(chip); - if (chip->irq >= 0) - free_irq(chip->irq, chip); - iounmap(chip->mmio); - pci_release_regions(chip->pci); - pci_disable_device(chip->pci); - kfree(chip); - return 0; -} - -static int snd_bt87x_dev_free(struct snd_device *device) +static void snd_bt87x_free(struct snd_card *card) { - struct snd_bt87x *chip = device->device_data; - return snd_bt87x_free(chip); + struct snd_bt87x *chip = card->private_data; + + snd_bt87x_stop(chip); } static int snd_bt87x_pcm(struct snd_bt87x *chip, int device, char *name) @@ -694,43 +682,24 @@ static int snd_bt87x_pcm(struct snd_bt87x *chip, int device, char *name) } static int snd_bt87x_create(struct snd_card *card, - struct pci_dev *pci, - struct snd_bt87x **rchip) + struct pci_dev *pci) { - struct snd_bt87x *chip; + struct snd_bt87x *chip = card->private_data; int err; - static const struct snd_device_ops ops = { - .dev_free = snd_bt87x_dev_free - }; - - *rchip = NULL; - err = pci_enable_device(pci); + err = pcim_enable_device(pci); if (err < 0) return err; - chip = kzalloc(sizeof(*chip), GFP_KERNEL); - if (!chip) { - pci_disable_device(pci); - return -ENOMEM; - } chip->card = card; chip->pci = pci; chip->irq = -1; spin_lock_init(&chip->reg_lock); - err = pci_request_regions(pci, "Bt87x audio"); - if (err < 0) { - kfree(chip); - pci_disable_device(pci); + err = pcim_iomap_regions(pci, 1 << 0, "Bt87x audio"); + if (err < 0) return err; - } - chip->mmio = pci_ioremap_bar(pci, 0); - if (!chip->mmio) { - dev_err(card->dev, "cannot remap io memory\n"); - err = -ENOMEM; - goto fail; - } + chip->mmio = pcim_iomap_table(pci)[0]; chip->reg_control = CTL_A_PWRDN | CTL_DA_ES2 | CTL_PKTP_16 | (15 << CTL_DA_SDR_SHIFT); @@ -739,26 +708,18 @@ static int snd_bt87x_create(struct snd_card *card, snd_bt87x_writel(chip, REG_INT_MASK, 0); snd_bt87x_writel(chip, REG_INT_STAT, MY_INTERRUPTS); - err = request_irq(pci->irq, snd_bt87x_interrupt, IRQF_SHARED, - KBUILD_MODNAME, chip); + err = devm_request_irq(&pci->dev, pci->irq, snd_bt87x_interrupt, + IRQF_SHARED, KBUILD_MODNAME, chip); if (err < 0) { dev_err(card->dev, "cannot grab irq %d\n", pci->irq); - goto fail; + return err; } chip->irq = pci->irq; card->sync_irq = chip->irq; + card->private_free = snd_bt87x_free; pci_set_master(pci); - err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops); - if (err < 0) - goto fail; - - *rchip = chip; return 0; - -fail: - snd_bt87x_free(chip); - return err; } #define BT_DEVICE(chip, subvend, subdev, id) \ @@ -868,14 +829,15 @@ static int snd_bt87x_probe(struct pci_dev *pci, return -ENOENT; } - err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, - 0, &card); + err = snd_devm_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, + sizeof(*chip), &card); if (err < 0) return err; + chip = card->private_data; - err = snd_bt87x_create(card, pci, &chip); + err = snd_bt87x_create(card, pci); if (err < 0) - goto _error; + return err; memcpy(&chip->board, &snd_bt87x_boards[boardid], sizeof(chip->board)); @@ -887,24 +849,24 @@ static int snd_bt87x_probe(struct pci_dev *pci, err = snd_bt87x_pcm(chip, DEVICE_DIGITAL, "Bt87x Digital"); if (err < 0) - goto _error; + return err; } if (!chip->board.no_analog) { err = snd_bt87x_pcm(chip, DEVICE_ANALOG, "Bt87x Analog"); if (err < 0) - goto _error; + return err; err = snd_ctl_add(card, snd_ctl_new1( &snd_bt87x_capture_volume, chip)); if (err < 0) - goto _error; + return err; err = snd_ctl_add(card, snd_ctl_new1( &snd_bt87x_capture_boost, chip)); if (err < 0) - goto _error; + return err; err = snd_ctl_add(card, snd_ctl_new1( &snd_bt87x_capture_source, chip)); if (err < 0) - goto _error; + return err; } dev_info(card->dev, "bt87x%d: Using board %d, %sanalog, %sdigital " "(rate %d Hz)\n", dev, boardid, @@ -920,20 +882,11 @@ static int snd_bt87x_probe(struct pci_dev *pci, err = snd_card_register(card); if (err < 0) - goto _error; + return err; pci_set_drvdata(pci, card); ++dev; return 0; - -_error: - snd_card_free(card); - return err; -} - -static void snd_bt87x_remove(struct pci_dev *pci) -{ - snd_card_free(pci_get_drvdata(pci)); } /* default entries for all Bt87x cards - it's not exported */ @@ -948,7 +901,6 @@ static struct pci_driver driver = { .name = KBUILD_MODNAME, .id_table = snd_bt87x_ids, .probe = snd_bt87x_probe, - .remove = snd_bt87x_remove, }; static int __init alsa_card_bt87x_init(void) From patchwork Thu Jul 15 07:58:35 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379231 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.0 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, UNWANTED_LANGUAGE_BODY,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4CE04C07E96 for ; Thu, 15 Jul 2021 08:05:48 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id C6B5A610D1 for ; Thu, 15 Jul 2021 08:05:47 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org C6B5A610D1 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id 61859169D; Thu, 15 Jul 2021 10:04:56 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 61859169D DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626336346; bh=Ck6Cplh12e2/4Ry/cKFmHmlFG2GiCCBWWU5Sy2TA2zo=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=uJNaIosqUkA+JbsIYZfQM3VzHP+duVZ6/xCfb6LT+3E80OuK1Z5znihZhNqPh9b25 tmx5cpnLwtE4TRWf/Q9mrpcDAC34/BWCkPGQRMnogHYGIPS4uoBWyPrlHONcm30+dR tesbQf03z3X9dEzvaYDJXlGii3YeUvqY/fmdwZXQ= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id 43DC4F805B4; Thu, 15 Jul 2021 10:00:26 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id 0DFECF80566; Thu, 15 Jul 2021 10:00:19 +0200 (CEST) Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 0F189F804DF for ; Thu, 15 Jul 2021 09:59:58 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 0F189F804DF Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="nrLAQcVn"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="Mk65+ouy" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out1.suse.de (Postfix) with ESMTP id DF3FD2284C for ; Thu, 15 Jul 2021 07:59:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626335997; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=H25n8pVOAJLV1vEegg0jwwU//7sMaIgSc2yDYPgDsXk=; b=nrLAQcVniORkOvUT+K0seKZTNo8EN0db8Lnua8yeGCy7p2eYvK01IT1QSC4FyD4cOj9mk9 b9NX/a8panAFSKVPFHhLcU96HBDZIPBQfagJS7sqQ4g1hIxwrNQ7Av1yKSUCnfHJpZh3+O NZYwBV/oGemiO6EiRy2nUZOLvv45VZ0= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626335997; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=H25n8pVOAJLV1vEegg0jwwU//7sMaIgSc2yDYPgDsXk=; b=Mk65+ouyvksaSlpg4t+dg8pGVFENFr53ZOJzN1HJKGcTZ6/x52SGW6B95ctIrgW+v4Coi0 9rJf+csLH4lzB9Ag== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id D7C48A3B99; Thu, 15 Jul 2021 07:59:57 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 13/79] ALSA: cmipci: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:58:35 +0200 Message-Id: <20210715075941.23332-14-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in PCI cmipci driver with devres as a clean up. Each manual resource management is converted with the corresponding devres helper, and the card object release is managed now via card->private_free instead of a lowlevel snd_device. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- sound/pci/cmipci.c | 104 ++++++++++++--------------------------------- 1 file changed, 28 insertions(+), 76 deletions(-) diff --git a/sound/pci/cmipci.c b/sound/pci/cmipci.c index f44f118aacad..ea20236f35db 100644 --- a/sound/pci/cmipci.c +++ b/sound/pci/cmipci.c @@ -2852,13 +2852,15 @@ static int snd_cmipci_create_gameport(struct cmipci *cm, int dev) if (joystick_port[dev] == 1) { /* auto-detect */ for (i = 0; ports[i]; i++) { io_port = ports[i]; - r = request_region(io_port, 1, "CMIPCI gameport"); + r = devm_request_region(&cm->pci->dev, io_port, 1, + "CMIPCI gameport"); if (r) break; } } else { io_port = joystick_port[dev]; - r = request_region(io_port, 1, "CMIPCI gameport"); + r = devm_request_region(&cm->pci->dev, io_port, 1, + "CMIPCI gameport"); } if (!r) { @@ -2869,14 +2871,12 @@ static int snd_cmipci_create_gameport(struct cmipci *cm, int dev) cm->gameport = gp = gameport_allocate_port(); if (!gp) { dev_err(cm->card->dev, "cannot allocate memory for gameport\n"); - release_and_free_resource(r); return -ENOMEM; } gameport_set_name(gp, "C-Media Gameport"); gameport_set_phys(gp, "pci%s/gameport0", pci_name(cm->pci)); gameport_set_dev_parent(gp, &cm->pci->dev); gp->io = io_port; - gameport_set_port_data(gp, r); snd_cmipci_set_bit(cm, CM_REG_FUNCTRL1, CM_JYSTK_EN); @@ -2888,13 +2888,10 @@ static int snd_cmipci_create_gameport(struct cmipci *cm, int dev) static void snd_cmipci_free_gameport(struct cmipci *cm) { if (cm->gameport) { - struct resource *r = gameport_get_port_data(cm->gameport); - gameport_unregister_port(cm->gameport); cm->gameport = NULL; snd_cmipci_clear_bit(cm, CM_REG_FUNCTRL1, CM_JYSTK_EN); - release_and_free_resource(r); } } #else @@ -2902,34 +2899,22 @@ static inline int snd_cmipci_create_gameport(struct cmipci *cm, int dev) { retur static inline void snd_cmipci_free_gameport(struct cmipci *cm) { } #endif -static int snd_cmipci_free(struct cmipci *cm) +static void snd_cmipci_free(struct snd_card *card) { - if (cm->irq >= 0) { - snd_cmipci_clear_bit(cm, CM_REG_MISC_CTRL, CM_FM_EN); - snd_cmipci_clear_bit(cm, CM_REG_LEGACY_CTRL, CM_ENSPDOUT); - snd_cmipci_write(cm, CM_REG_INT_HLDCLR, 0); /* disable ints */ - snd_cmipci_ch_reset(cm, CM_CH_PLAY); - snd_cmipci_ch_reset(cm, CM_CH_CAPT); - snd_cmipci_write(cm, CM_REG_FUNCTRL0, 0); /* disable channels */ - snd_cmipci_write(cm, CM_REG_FUNCTRL1, 0); + struct cmipci *cm = card->private_data; - /* reset mixer */ - snd_cmipci_mixer_write(cm, 0, 0); + snd_cmipci_clear_bit(cm, CM_REG_MISC_CTRL, CM_FM_EN); + snd_cmipci_clear_bit(cm, CM_REG_LEGACY_CTRL, CM_ENSPDOUT); + snd_cmipci_write(cm, CM_REG_INT_HLDCLR, 0); /* disable ints */ + snd_cmipci_ch_reset(cm, CM_CH_PLAY); + snd_cmipci_ch_reset(cm, CM_CH_CAPT); + snd_cmipci_write(cm, CM_REG_FUNCTRL0, 0); /* disable channels */ + snd_cmipci_write(cm, CM_REG_FUNCTRL1, 0); - free_irq(cm->irq, cm); - } + /* reset mixer */ + snd_cmipci_mixer_write(cm, 0, 0); snd_cmipci_free_gameport(cm); - pci_release_regions(cm->pci); - pci_disable_device(cm->pci); - kfree(cm); - return 0; -} - -static int snd_cmipci_dev_free(struct snd_device *device) -{ - struct cmipci *cm = device->device_data; - return snd_cmipci_free(cm); } static int snd_cmipci_create_fm(struct cmipci *cm, long fm_port) @@ -2988,13 +2973,10 @@ static int snd_cmipci_create_fm(struct cmipci *cm, long fm_port) } static int snd_cmipci_create(struct snd_card *card, struct pci_dev *pci, - int dev, struct cmipci **rcmipci) + int dev) { - struct cmipci *cm; + struct cmipci *cm = card->private_data; int err; - static const struct snd_device_ops ops = { - .dev_free = snd_cmipci_dev_free, - }; unsigned int val; long iomidi = 0; int integrated_midi = 0; @@ -3005,18 +2987,10 @@ static int snd_cmipci_create(struct snd_card *card, struct pci_dev *pci, { }, }; - *rcmipci = NULL; - - err = pci_enable_device(pci); + err = pcim_enable_device(pci); if (err < 0) return err; - cm = kzalloc(sizeof(*cm), GFP_KERNEL); - if (cm == NULL) { - pci_disable_device(pci); - return -ENOMEM; - } - spin_lock_init(&cm->reg_lock); mutex_init(&cm->open_mutex); cm->device = pci->device; @@ -3028,21 +3002,18 @@ static int snd_cmipci_create(struct snd_card *card, struct pci_dev *pci, cm->channel[0].is_dac = cm->channel[1].is_dac = 1; /* dual DAC mode */ err = pci_request_regions(pci, card->driver); - if (err < 0) { - kfree(cm); - pci_disable_device(pci); + if (err < 0) return err; - } cm->iobase = pci_resource_start(pci, 0); - if (request_irq(pci->irq, snd_cmipci_interrupt, - IRQF_SHARED, KBUILD_MODNAME, cm)) { + if (devm_request_irq(&pci->dev, pci->irq, snd_cmipci_interrupt, + IRQF_SHARED, KBUILD_MODNAME, cm)) { dev_err(card->dev, "unable to grab IRQ %d\n", pci->irq); - snd_cmipci_free(cm); return -EBUSY; } cm->irq = pci->irq; card->sync_irq = cm->irq; + card->private_free = snd_cmipci_free; pci_set_master(cm->pci); @@ -3142,12 +3113,6 @@ static int snd_cmipci_create(struct snd_card *card, struct pci_dev *pci, sprintf(card->longname, "%s%s at %#lx, irq %i", card->shortname, modelstr, cm->iobase, cm->irq); - err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, cm, &ops); - if (err < 0) { - snd_cmipci_free(cm); - return err; - } - if (cm->chip_version >= 39) { val = snd_cmipci_read_b(cm, CM_REG_MPU_PCI + 1); if (val != 0x00 && val != 0xff) { @@ -3240,7 +3205,6 @@ static int snd_cmipci_create(struct snd_card *card, struct pci_dev *pci, if (snd_cmipci_create_gameport(cm, dev) < 0) snd_cmipci_clear_bit(cm, CM_REG_FUNCTRL1, CM_JYSTK_EN); - *rcmipci = cm; return 0; } @@ -3264,10 +3228,11 @@ static int snd_cmipci_probe(struct pci_dev *pci, return -ENOENT; } - err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, - 0, &card); + err = snd_devm_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, + sizeof(*cm), &card); if (err < 0) return err; + cm = card->private_data; switch (pci->device) { case PCI_DEVICE_ID_CMEDIA_CM8738: @@ -3283,31 +3248,19 @@ static int snd_cmipci_probe(struct pci_dev *pci, break; } - err = snd_cmipci_create(card, pci, dev, &cm); + err = snd_cmipci_create(card, pci, dev); if (err < 0) - goto free_card; - - card->private_data = cm; + return err; err = snd_card_register(card); if (err < 0) - goto free_card; + return err; pci_set_drvdata(pci, card); dev++; return 0; - -free_card: - snd_card_free(card); - return err; } -static void snd_cmipci_remove(struct pci_dev *pci) -{ - snd_card_free(pci_get_drvdata(pci)); -} - - #ifdef CONFIG_PM_SLEEP /* * power management @@ -3382,7 +3335,6 @@ static struct pci_driver cmipci_driver = { .name = KBUILD_MODNAME, .id_table = snd_cmipci_ids, .probe = snd_cmipci_probe, - .remove = snd_cmipci_remove, .driver = { .pm = SND_CMIPCI_PM_OPS, }, From patchwork Thu Jul 15 07:58:36 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379239 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id D3B3FC07E96 for ; Thu, 15 Jul 2021 08:07:32 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 3C90D61370 for ; Thu, 15 Jul 2021 08:07:32 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 3C90D61370 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id B817B16C2; Thu, 15 Jul 2021 10:06:40 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz B817B16C2 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626336450; bh=lGOOa1LeFFqXu5p3eOQzB3Lhx77Ow0bafGxSaLuoAF8=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=CBelq+pwJHWVP7wQpgMaSQGJljddkW/ARpFnQSb3zjIKubFcQpp0X3mTO0Xr7apF+ e/6DW0BsqRoA+b3iDQsdiIxJh1AbbKb8ThCFzVNC4PwRiK3KivbQZDgSV9o1jB3IdJ lekTDfBA+mwgVIB7et9/plyJt56uRlbOkMQ/30pU= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id 3680CF805E3; Thu, 15 Jul 2021 10:00:34 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id DCBA9F805B5; Thu, 15 Jul 2021 10:00:25 +0200 (CEST) Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id A365EF804E2 for ; Thu, 15 Jul 2021 09:59:58 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz A365EF804E2 Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="TCsG7TEI"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="uTU3vnvg" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out1.suse.de (Postfix) with ESMTP id 7C3B42284E for ; Thu, 15 Jul 2021 07:59:58 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626335998; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=kKX4RzaGLOOByHQccy0gSPoAmPX6pLVoY4RclGH9Ado=; b=TCsG7TEIB3qyqqTFDqnFZMXbIBOHjNMPR+BbPmMEbx33G7zNpWoLLvDXvUAYWG8JDBteRK HyARw+nQkyF+9XddwDO4rchvK9cSDIVzkEdW7+2244cIOfRnsT5dLGnTWfQJMNGBGSusZ3 Rexqnk5079qa/FoliFLMLpAGl8E6/oc= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626335998; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=kKX4RzaGLOOByHQccy0gSPoAmPX6pLVoY4RclGH9Ado=; b=uTU3vnvgNsIC5+qTHVVH/n72JHY6qobFIwpqzkJ1dOu0UZhXB7m7nnRaBp+6+SyPP/kG+z T37ed7OhAD+VZbBQ== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id 6A431A3B99; Thu, 15 Jul 2021 07:59:58 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 14/79] ALSA: cs4281: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:58:36 +0200 Message-Id: <20210715075941.23332-15-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in PCI cs4281 driver with devres as a clean up. Each manual resource management is converted with the corresponding devres helper, and the card object release is managed now via card->private_free instead of a lowlevel snd_device. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai Reported-by: Nathan Chancellor Signed-off-by: Takashi Iwai --- sound/pci/cs4281.c | 112 ++++++++++----------------------------------- 1 file changed, 24 insertions(+), 88 deletions(-) diff --git a/sound/pci/cs4281.c b/sound/pci/cs4281.c index e122a168c148..f338caf98354 100644 --- a/sound/pci/cs4281.c +++ b/sound/pci/cs4281.c @@ -1268,8 +1268,10 @@ static inline int snd_cs4281_create_gameport(struct cs4281 *chip) { return -ENOS static inline void snd_cs4281_free_gameport(struct cs4281 *chip) { } #endif /* IS_REACHABLE(CONFIG_GAMEPORT) */ -static int snd_cs4281_free(struct cs4281 *chip) +static void snd_cs4281_free(struct snd_card *card) { + struct cs4281 *chip = card->private_data; + snd_cs4281_free_gameport(chip); /* Mask interrupts */ @@ -1278,49 +1280,20 @@ static int snd_cs4281_free(struct cs4281 *chip) snd_cs4281_pokeBA0(chip, BA0_CLKCR1, 0); /* Sound System Power Management - Turn Everything OFF */ snd_cs4281_pokeBA0(chip, BA0_SSPM, 0); - /* PCI interface - D3 state */ - pci_set_power_state(chip->pci, PCI_D3hot); - - if (chip->irq >= 0) - free_irq(chip->irq, chip); - iounmap(chip->ba0); - iounmap(chip->ba1); - pci_release_regions(chip->pci); - pci_disable_device(chip->pci); - - kfree(chip); - return 0; -} - -static int snd_cs4281_dev_free(struct snd_device *device) -{ - struct cs4281 *chip = device->device_data; - return snd_cs4281_free(chip); } static int snd_cs4281_chip_init(struct cs4281 *chip); /* defined below */ static int snd_cs4281_create(struct snd_card *card, struct pci_dev *pci, - struct cs4281 **rchip, int dual_codec) { struct cs4281 *chip; - unsigned int tmp; int err; - static const struct snd_device_ops ops = { - .dev_free = snd_cs4281_dev_free, - }; - *rchip = NULL; - err = pci_enable_device(pci); + err = pcim_enable_device(pci); if (err < 0) return err; - chip = kzalloc(sizeof(*chip), GFP_KERNEL); - if (chip == NULL) { - pci_disable_device(pci); - return -ENOMEM; - } spin_lock_init(&chip->reg_lock); chip->card = card; chip->pci = pci; @@ -1332,46 +1305,29 @@ static int snd_cs4281_create(struct snd_card *card, } chip->dual_codec = dual_codec; - err = pci_request_regions(pci, "CS4281"); - if (err < 0) { - kfree(chip); - pci_disable_device(pci); + err = pcim_iomap_regions(pci, 0x03, "CS4281"); /* 2 BARs */ + if (err < 0) return err; - } chip->ba0_addr = pci_resource_start(pci, 0); chip->ba1_addr = pci_resource_start(pci, 1); - chip->ba0 = pci_ioremap_bar(pci, 0); - chip->ba1 = pci_ioremap_bar(pci, 1); - if (!chip->ba0 || !chip->ba1) { - snd_cs4281_free(chip); - return -ENOMEM; - } + chip->ba0 = pcim_iomap_table(pci)[0]; + chip->ba1 = pcim_iomap_table(pci)[1]; - if (request_irq(pci->irq, snd_cs4281_interrupt, IRQF_SHARED, - KBUILD_MODNAME, chip)) { + if (devm_request_irq(&pci->dev, pci->irq, snd_cs4281_interrupt, + IRQF_SHARED, KBUILD_MODNAME, chip)) { dev_err(card->dev, "unable to grab IRQ %d\n", pci->irq); - snd_cs4281_free(chip); return -ENOMEM; } chip->irq = pci->irq; card->sync_irq = chip->irq; + card->private_free = snd_cs4281_free; - tmp = snd_cs4281_chip_init(chip); - if (tmp) { - snd_cs4281_free(chip); - return tmp; - } - - err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops); - if (err < 0) { - snd_cs4281_free(chip); + err = snd_cs4281_chip_init(chip); + if (err) return err; - } snd_cs4281_proc_init(chip); - - *rchip = chip; return 0; } @@ -1887,46 +1843,34 @@ static int snd_cs4281_probe(struct pci_dev *pci, return -ENOENT; } - err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, - 0, &card); + err = snd_devm_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, + sizeof(*chip), &card); if (err < 0) return err; + chip = card->private_data; - err = snd_cs4281_create(card, pci, &chip, dual_codec[dev]); - if (err < 0) { - snd_card_free(card); + err = snd_cs4281_create(card, pci, dual_codec[dev]); + if (err < 0) return err; - } - card->private_data = chip; err = snd_cs4281_mixer(chip); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } err = snd_cs4281_pcm(chip, 0); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } err = snd_cs4281_midi(chip, 0); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } err = snd_opl3_new(card, OPL3_HW_OPL3_CS4281, &opl3); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } opl3->private_data = chip; opl3->command = snd_cs4281_opl3_command; snd_opl3_init(opl3); err = snd_opl3_hwdep_new(opl3, 0, 1, NULL); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } snd_cs4281_create_gameport(chip); strcpy(card->driver, "CS4281"); strcpy(card->shortname, "Cirrus Logic CS4281"); @@ -1936,21 +1880,14 @@ static int snd_cs4281_probe(struct pci_dev *pci, chip->irq); err = snd_card_register(card); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } pci_set_drvdata(pci, card); dev++; return 0; } -static void snd_cs4281_remove(struct pci_dev *pci) -{ - snd_card_free(pci_get_drvdata(pci)); -} - /* * Power Management */ @@ -2054,7 +1991,6 @@ static struct pci_driver cs4281_driver = { .name = KBUILD_MODNAME, .id_table = snd_cs4281_ids, .probe = snd_cs4281_probe, - .remove = snd_cs4281_remove, .driver = { .pm = CS4281_PM_OPS, }, From patchwork Thu Jul 15 07:58:37 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379237 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id D3400C07E96 for ; Thu, 15 Jul 2021 08:07:02 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 4991161370 for ; Thu, 15 Jul 2021 08:07:02 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 4991161370 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id 98A9D169E; Thu, 15 Jul 2021 10:06:10 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 98A9D169E DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626336420; bh=DQC3G2XMkc7AsK5SEuBeyGUXU47UoamlJACL509eMwU=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=q4wMHzsAJN6eeLqySUoTmPDVlggL4sVzfuVnMDqFjgm4qwXyM5jPHmRymeDhqLCSX mJMJ04HCOK6VlulR8T34/uaBXtyGPRg4h3b04nn3UkuWd1jh1fgRaZh7c4zRyhTL7n u7Pi0wSBjJXTJWwWENx4owRdx7U+e94XFcxyHzYM= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id 30299F804F1; Thu, 15 Jul 2021 10:00:32 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id DAE54F805AF; Thu, 15 Jul 2021 10:00:24 +0200 (CEST) Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 2927FF804E3 for ; Thu, 15 Jul 2021 09:59:59 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 2927FF804E3 Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="rj9HA1FZ"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="Ls8lCcyw" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out1.suse.de (Postfix) with ESMTP id 015322284F for ; Thu, 15 Jul 2021 07:59:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626335999; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=wNUmxcAtS4wVem+SPg7e0Sgp5Y/q4b/M/oRCZ/XAJ+c=; b=rj9HA1FZcOq4ABPYecQCqTSLAKbdP756iA0KJ0w4ZKUKDwyBPKJI+LaVdbzlHJVqzE9CU4 2R94PLc0EwQswqS9+KHgjdR0JvYO6zYOlAF00luJ3aVKEgIaDofE5ZS53qYh16OyA2IS8Y af/DKyAHOcHlr6SPVs/ULUGmJqfhADY= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626335999; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=wNUmxcAtS4wVem+SPg7e0Sgp5Y/q4b/M/oRCZ/XAJ+c=; b=Ls8lCcywxoGdzkJkEj+PMdP2r0JZAMuqdnc6/AN1rXG66Sr6tHpayPFLzYMzQLqbHMOSPa LjfFL1uWZ3qS7dAA== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id ED48AA3B99; Thu, 15 Jul 2021 07:59:58 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 15/79] ALSA: cs5530: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:58:37 +0200 Message-Id: <20210715075941.23332-16-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in PCI cs5530 driver with devres as a clean up. Each manual resource management is converted with the corresponding devres helper, and the card object release is managed now via card->private_free instead of a lowlevel snd_device. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- sound/pci/cs5530.c | 86 +++++++--------------------------------------- 1 file changed, 13 insertions(+), 73 deletions(-) diff --git a/sound/pci/cs5530.c b/sound/pci/cs5530.c index 20b4faea50a6..93ff029e6583 100644 --- a/sound/pci/cs5530.c +++ b/sound/pci/cs5530.c @@ -65,25 +65,6 @@ static const struct pci_device_id snd_cs5530_ids[] = { MODULE_DEVICE_TABLE(pci, snd_cs5530_ids); -static int snd_cs5530_free(struct snd_cs5530 *chip) -{ - pci_release_regions(chip->pci); - pci_disable_device(chip->pci); - kfree(chip); - return 0; -} - -static int snd_cs5530_dev_free(struct snd_device *device) -{ - struct snd_cs5530 *chip = device->device_data; - return snd_cs5530_free(chip); -} - -static void snd_cs5530_remove(struct pci_dev *pci) -{ - snd_card_free(pci_get_drvdata(pci)); -} - static u8 snd_cs5530_mixer_read(unsigned long io, u8 reg) { outb(reg, io + 4); @@ -94,50 +75,28 @@ static u8 snd_cs5530_mixer_read(unsigned long io, u8 reg) } static int snd_cs5530_create(struct snd_card *card, - struct pci_dev *pci, - struct snd_cs5530 **rchip) + struct pci_dev *pci) { - struct snd_cs5530 *chip; + struct snd_cs5530 *chip = card->private_data; unsigned long sb_base; u8 irq, dma8, dma16 = 0; u16 map; void __iomem *mem; int err; - static const struct snd_device_ops ops = { - .dev_free = snd_cs5530_dev_free, - }; - *rchip = NULL; - - err = pci_enable_device(pci); + err = pcim_enable_device(pci); if (err < 0) return err; - chip = kzalloc(sizeof(*chip), GFP_KERNEL); - if (chip == NULL) { - pci_disable_device(pci); - return -ENOMEM; - } - chip->card = card; chip->pci = pci; - err = pci_request_regions(pci, "CS5530"); - if (err < 0) { - kfree(chip); - pci_disable_device(pci); + err = pcim_iomap_regions(pci, 1 << 0, "CS5530"); + if (err < 0) return err; - } chip->pci_base = pci_resource_start(pci, 0); - - mem = pci_ioremap_bar(pci, 0); - if (mem == NULL) { - snd_cs5530_free(chip); - return -EBUSY; - } - + mem = pcim_iomap_table(pci)[0]; map = readw(mem + 0x18); - iounmap(mem); /* Map bits 0:1 * 0x20 + 0x200 = sb base @@ -154,7 +113,6 @@ static int snd_cs5530_create(struct snd_card *card, dev_info(card->dev, "XpressAudio at 0x%lx\n", sb_base); else { dev_err(card->dev, "Could not find XpressAudio!\n"); - snd_cs5530_free(chip); return -ENODEV; } @@ -174,7 +132,6 @@ static int snd_cs5530_create(struct snd_card *card, dma16 = 7; else { dev_err(card->dev, "No 16bit DMA enabled\n"); - snd_cs5530_free(chip); return -ENODEV; } @@ -186,7 +143,6 @@ static int snd_cs5530_create(struct snd_card *card, dma8 = 3; else { dev_err(card->dev, "No 8bit DMA enabled\n"); - snd_cs5530_free(chip); return -ENODEV; } @@ -200,7 +156,6 @@ static int snd_cs5530_create(struct snd_card *card, irq = 10; else { dev_err(card->dev, "SoundBlaster IRQ not set\n"); - snd_cs5530_free(chip); return -ENODEV; } @@ -210,31 +165,21 @@ static int snd_cs5530_create(struct snd_card *card, dma16, SB_HW_CS5530, &chip->sb); if (err < 0) { dev_err(card->dev, "Could not create SoundBlaster\n"); - snd_cs5530_free(chip); return err; } err = snd_sb16dsp_pcm(chip->sb, 0); if (err < 0) { dev_err(card->dev, "Could not create PCM\n"); - snd_cs5530_free(chip); return err; } err = snd_sbmixer_new(chip->sb); if (err < 0) { dev_err(card->dev, "Could not create Mixer\n"); - snd_cs5530_free(chip); - return err; - } - - err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops); - if (err < 0) { - snd_cs5530_free(chip); return err; } - *rchip = chip; return 0; } @@ -243,7 +188,7 @@ static int snd_cs5530_probe(struct pci_dev *pci, { static int dev; struct snd_card *card; - struct snd_cs5530 *chip = NULL; + struct snd_cs5530 *chip; int err; if (dev >= SNDRV_CARDS) @@ -253,27 +198,23 @@ static int snd_cs5530_probe(struct pci_dev *pci, return -ENOENT; } - err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, - 0, &card); - + err = snd_devm_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, + sizeof(*chip), &card); if (err < 0) return err; + chip = card->private_data; - err = snd_cs5530_create(card, pci, &chip); - if (err < 0) { - snd_card_free(card); + err = snd_cs5530_create(card, pci); + if (err < 0) return err; - } strcpy(card->driver, "CS5530"); strcpy(card->shortname, "CS5530 Audio"); sprintf(card->longname, "%s at 0x%lx", card->shortname, chip->pci_base); err = snd_card_register(card); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } pci_set_drvdata(pci, card); dev++; return 0; @@ -283,7 +224,6 @@ static struct pci_driver cs5530_driver = { .name = KBUILD_MODNAME, .id_table = snd_cs5530_ids, .probe = snd_cs5530_probe, - .remove = snd_cs5530_remove, }; module_pci_driver(cs5530_driver); From patchwork Thu Jul 15 07:58:38 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379241 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 47103C1B08C for ; Thu, 15 Jul 2021 08:07:54 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 9B38B61362 for ; Thu, 15 Jul 2021 08:07:53 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 9B38B61362 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id 40C4F16B4; Thu, 15 Jul 2021 10:07:02 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 40C4F16B4 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626336472; bh=nO8aafrM+iykm3A93A9CbIs8145Y1VYuhPzaGfFW2ro=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=ZVX8RtfTwIWQmm0O+r8X4fOoCy6kJ8Y76fXg/5/VXu2hp2MnU6XcEEAVmolIAGH6G 5UM3FL4w5GNFG8YmCVHV4rjyfk0SY6AP5qtO/8JAcmC+00t4Raal6A5CXWtfCywzqM W6SnCRmP/BhaLj3On8QgA/Zu3gVFs+U+eleUVhco= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id 145CDF805E7; Thu, 15 Jul 2021 10:00:35 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id 3EADCF805B6; Thu, 15 Jul 2021 10:00:26 +0200 (CEST) Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id A484DF804E4 for ; Thu, 15 Jul 2021 09:59:59 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz A484DF804E4 Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="iMOnTzdO"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="J+OJARKr" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out1.suse.de (Postfix) with ESMTP id 71E022284C for ; Thu, 15 Jul 2021 07:59:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626335999; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=N+zPGj0sNXqSW0ODusYjbeLSfUg6q2ixQyrrHHuNW5s=; b=iMOnTzdOIx1g9wtgoR2Xht9j0428qJUnJAwd1iqS1uzrpmGRKr+g2CX5kJurK+ma0Pl/2p iZMBB34EeLrhiWUfg/izaspVr2bvhjdUHRC3GEGYpXI5J3yZuZKaCgRc19M+4BnRn8JMf0 Qft2fUbha/ZSBUxwu3MNDxnbU2yl8FA= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626335999; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=N+zPGj0sNXqSW0ODusYjbeLSfUg6q2ixQyrrHHuNW5s=; b=J+OJARKrBSxEuGfOANxJjyuxt+yV3A7KBfxLwTfx4T7DPbiZfpAi6QiI/9VdYEA+sngwAu xjAMpRCAmPSq/PCg== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id 6A49CA3B99; Thu, 15 Jul 2021 07:59:59 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 16/79] ALSA: ens137x: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:58:38 +0200 Message-Id: <20210715075941.23332-17-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in PCI esn137x drivers with devres as a clean up. Each manual resource management is converted with the corresponding devres helper, the devres helper is used for the DMA buffer page allocations, and the card object release is managed now via card->private_free instead of a lowlevel snd_device. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- sound/pci/ens1370.c | 115 +++++++++++--------------------------------- 1 file changed, 27 insertions(+), 88 deletions(-) diff --git a/sound/pci/ens1370.c b/sound/pci/ens1370.c index 728b69dad21b..2651f0c64c06 100644 --- a/sound/pci/ens1370.c +++ b/sound/pci/ens1370.c @@ -414,7 +414,7 @@ struct ensoniq { unsigned int spdif_stream; #ifdef CHIP1370 - struct snd_dma_buffer dma_bug; + struct snd_dma_buffer *dma_bug; #endif #ifdef SUPPORT_JOYSTICK @@ -1872,11 +1872,11 @@ static void snd_ensoniq_proc_init(struct ensoniq *ensoniq) */ -static int snd_ensoniq_free(struct ensoniq *ensoniq) +static void snd_ensoniq_free(struct snd_card *card) { + struct ensoniq *ensoniq = card->private_data; + snd_ensoniq_free_gameport(ensoniq); - if (ensoniq->irq < 0) - goto __hw_end; #ifdef CHIP1370 outl(ES_1370_SERR_DISABLE, ES_REG(ensoniq, CONTROL)); /* switch everything off */ outl(0, ES_REG(ensoniq, SERIAL)); /* clear serial interface */ @@ -1884,24 +1884,6 @@ static int snd_ensoniq_free(struct ensoniq *ensoniq) outl(0, ES_REG(ensoniq, CONTROL)); /* switch everything off */ outl(0, ES_REG(ensoniq, SERIAL)); /* clear serial interface */ #endif - pci_set_power_state(ensoniq->pci, PCI_D3hot); - __hw_end: -#ifdef CHIP1370 - if (ensoniq->dma_bug.area) - snd_dma_free_pages(&ensoniq->dma_bug); -#endif - if (ensoniq->irq >= 0) - free_irq(ensoniq->irq, ensoniq); - pci_release_regions(ensoniq->pci); - pci_disable_device(ensoniq->pci); - kfree(ensoniq); - return 0; -} - -static int snd_ensoniq_dev_free(struct snd_device *device) -{ - struct ensoniq *ensoniq = device->device_data; - return snd_ensoniq_free(ensoniq); } #ifdef CHIP1371 @@ -1935,7 +1917,7 @@ static void snd_ensoniq_chip_init(struct ensoniq *ensoniq) outl(ensoniq->ctrl, ES_REG(ensoniq, CONTROL)); outl(ensoniq->sctrl, ES_REG(ensoniq, SERIAL)); outl(ES_MEM_PAGEO(ES_PAGE_ADC), ES_REG(ensoniq, MEM_PAGE)); - outl(ensoniq->dma_bug.addr, ES_REG(ensoniq, PHANTOM_FRAME)); + outl(ensoniq->dma_bug->addr, ES_REG(ensoniq, PHANTOM_FRAME)); outl(0, ES_REG(ensoniq, PHANTOM_COUNT)); #else outl(ensoniq->ctrl, ES_REG(ensoniq, CONTROL)); @@ -2032,51 +2014,35 @@ static SIMPLE_DEV_PM_OPS(snd_ensoniq_pm, snd_ensoniq_suspend, snd_ensoniq_resume #endif /* CONFIG_PM_SLEEP */ static int snd_ensoniq_create(struct snd_card *card, - struct pci_dev *pci, - struct ensoniq **rensoniq) + struct pci_dev *pci) { - struct ensoniq *ensoniq; + struct ensoniq *ensoniq = card->private_data; int err; - static const struct snd_device_ops ops = { - .dev_free = snd_ensoniq_dev_free, - }; - *rensoniq = NULL; - err = pci_enable_device(pci); + err = pcim_enable_device(pci); if (err < 0) return err; - ensoniq = kzalloc(sizeof(*ensoniq), GFP_KERNEL); - if (ensoniq == NULL) { - pci_disable_device(pci); - return -ENOMEM; - } spin_lock_init(&ensoniq->reg_lock); mutex_init(&ensoniq->src_mutex); ensoniq->card = card; ensoniq->pci = pci; ensoniq->irq = -1; err = pci_request_regions(pci, "Ensoniq AudioPCI"); - if (err < 0) { - kfree(ensoniq); - pci_disable_device(pci); + if (err < 0) return err; - } ensoniq->port = pci_resource_start(pci, 0); - if (request_irq(pci->irq, snd_audiopci_interrupt, IRQF_SHARED, - KBUILD_MODNAME, ensoniq)) { + if (devm_request_irq(&pci->dev, pci->irq, snd_audiopci_interrupt, + IRQF_SHARED, KBUILD_MODNAME, ensoniq)) { dev_err(card->dev, "unable to grab IRQ %d\n", pci->irq); - snd_ensoniq_free(ensoniq); return -EBUSY; } ensoniq->irq = pci->irq; card->sync_irq = ensoniq->irq; #ifdef CHIP1370 - if (snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, &pci->dev, - 16, &ensoniq->dma_bug) < 0) { - dev_err(card->dev, "unable to allocate space for phantom area - dma_bug\n"); - snd_ensoniq_free(ensoniq); - return -EBUSY; - } + ensoniq->dma_bug = + snd_devm_alloc_pages(&pci->dev, SNDRV_DMA_TYPE_DEV, 16); + if (!ensoniq->dma_bug) + return -ENOMEM; #endif pci_set_master(pci); ensoniq->rev = pci->revision; @@ -2099,17 +2065,10 @@ static int snd_ensoniq_create(struct snd_card *card, ensoniq->cssr |= ES_1371_ST_AC97_RST; #endif + card->private_free = snd_ensoniq_free; snd_ensoniq_chip_init(ensoniq); - err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, ensoniq, &ops); - if (err < 0) { - snd_ensoniq_free(ensoniq); - return err; - } - snd_ensoniq_proc_init(ensoniq); - - *rensoniq = ensoniq; return 0; } @@ -2360,47 +2319,35 @@ static int snd_audiopci_probe(struct pci_dev *pci, return -ENOENT; } - err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, - 0, &card); + err = snd_devm_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, + sizeof(*ensoniq), &card); if (err < 0) return err; + ensoniq = card->private_data; - err = snd_ensoniq_create(card, pci, &ensoniq); - if (err < 0) { - snd_card_free(card); + err = snd_ensoniq_create(card, pci); + if (err < 0) return err; - } - card->private_data = ensoniq; #ifdef CHIP1370 err = snd_ensoniq_1370_mixer(ensoniq); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } #endif #ifdef CHIP1371 err = snd_ensoniq_1371_mixer(ensoniq, spdif[dev], lineio[dev]); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } #endif err = snd_ensoniq_pcm(ensoniq, 0); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } err = snd_ensoniq_pcm2(ensoniq, 1); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } err = snd_ensoniq_midi(ensoniq, 0); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } snd_ensoniq_create_gameport(ensoniq, dev); @@ -2414,26 +2361,18 @@ static int snd_audiopci_probe(struct pci_dev *pci, ensoniq->irq); err = snd_card_register(card); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } pci_set_drvdata(pci, card); dev++; return 0; } -static void snd_audiopci_remove(struct pci_dev *pci) -{ - snd_card_free(pci_get_drvdata(pci)); -} - static struct pci_driver ens137x_driver = { .name = KBUILD_MODNAME, .id_table = snd_audiopci_ids, .probe = snd_audiopci_probe, - .remove = snd_audiopci_remove, .driver = { .pm = SND_ENSONIQ_PM_OPS, }, From patchwork Thu Jul 15 07:58:39 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379235 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9C79FC07E96 for ; Thu, 15 Jul 2021 08:06:41 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id BBDAC610E5 for ; Thu, 15 Jul 2021 08:06:40 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org BBDAC610E5 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id 4AAD01684; Thu, 15 Jul 2021 10:05:49 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 4AAD01684 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626336399; bh=aaffqherV7sHeEFWzX3gpB5DYIo95fZe2Htu2XGac8Q=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=E7z0GR5ipvW+44AkPuRdr2q2rLNn5eWGVdsh+uSCM2AcasAlwND34WUHg1N4T2joc YxHI/jeEgkR1beXLOaDqo0l/VvzpX7+Yv7hHZfgs25V+ZZVR4rOlrj3Ljtd1RH+IJ4 GtTFSXkVpOtYNQT9WhuVjn4t2VyOdphe58I7cwUI= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id 4A750F805CB; Thu, 15 Jul 2021 10:00:31 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id BB520F805B1; Thu, 15 Jul 2021 10:00:24 +0200 (CEST) Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 2050BF804E5 for ; Thu, 15 Jul 2021 10:00:00 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 2050BF804E5 Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="PIttmDGm"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="6mOs2Nlw" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out2.suse.de (Postfix) with ESMTP id F3DFD1FD3E for ; Thu, 15 Jul 2021 07:59:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336000; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=SfYa+T0T1CIGZh+UnessXxkDwVCKEl2xb+ela0F3Fq4=; b=PIttmDGmnPyQ4NUmoJ4Rvkb815MQuLoM6I/HyxA7NVlLMrU3HB4w/sK7S0bLQ1PH5sSpaf KWh4jH0o0TMntShwG/bbc6YtemnAjjydDHuNu3837WZSTdk377cDVXM7hqgyfKY4MN7dlr ctBR+Aax/KNF85HqDHhGgho2Kt3sJP8= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336000; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=SfYa+T0T1CIGZh+UnessXxkDwVCKEl2xb+ela0F3Fq4=; b=6mOs2NlwViVMIePxrOzMID+4PhIAUr18QJE+Tuf3gVDXw8+N+7mmyYCifonQdOXIXg5Oz+ /FeT3YrXzaqSkwBg== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id E2018A3B99; Thu, 15 Jul 2021 07:59:59 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 17/79] ALSA: es1938: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:58:39 +0200 Message-Id: <20210715075941.23332-18-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in PCI es1938 driver with devres as a clean up. Each manual resource management is converted with the corresponding devres helper, and the card object release is managed now via card->private_free instead of a lowlevel snd_device. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- sound/pci/es1938.c | 97 ++++++++++++---------------------------------- 1 file changed, 24 insertions(+), 73 deletions(-) diff --git a/sound/pci/es1938.c b/sound/pci/es1938.c index 33b1eb347a27..00b976f42a3d 100644 --- a/sound/pci/es1938.c +++ b/sound/pci/es1938.c @@ -1521,8 +1521,10 @@ static inline int snd_es1938_create_gameport(struct es1938 *chip) { return -ENOS static inline void snd_es1938_free_gameport(struct es1938 *chip) { } #endif /* SUPPORT_JOYSTICK */ -static int snd_es1938_free(struct es1938 *chip) +static void snd_es1938_free(struct snd_card *card) { + struct es1938 *chip = card->private_data; + /* disable irqs */ outb(0x00, SLIO_REG(chip, IRQCONTROL)); if (chip->rmidi) @@ -1532,71 +1534,47 @@ static int snd_es1938_free(struct es1938 *chip) if (chip->irq >= 0) free_irq(chip->irq, chip); - pci_release_regions(chip->pci); - pci_disable_device(chip->pci); - kfree(chip); - return 0; -} - -static int snd_es1938_dev_free(struct snd_device *device) -{ - struct es1938 *chip = device->device_data; - return snd_es1938_free(chip); } static int snd_es1938_create(struct snd_card *card, - struct pci_dev *pci, - struct es1938 **rchip) + struct pci_dev *pci) { - struct es1938 *chip; + struct es1938 *chip = card->private_data; int err; - static const struct snd_device_ops ops = { - .dev_free = snd_es1938_dev_free, - }; - - *rchip = NULL; /* enable PCI device */ - err = pci_enable_device(pci); + err = pcim_enable_device(pci); if (err < 0) return err; /* check, if we can restrict PCI DMA transfers to 24 bits */ if (dma_set_mask_and_coherent(&pci->dev, DMA_BIT_MASK(24))) { dev_err(card->dev, "architecture does not support 24bit PCI busmaster DMA\n"); - pci_disable_device(pci); return -ENXIO; } - chip = kzalloc(sizeof(*chip), GFP_KERNEL); - if (chip == NULL) { - pci_disable_device(pci); - return -ENOMEM; - } spin_lock_init(&chip->reg_lock); spin_lock_init(&chip->mixer_lock); chip->card = card; chip->pci = pci; chip->irq = -1; err = pci_request_regions(pci, "ESS Solo-1"); - if (err < 0) { - kfree(chip); - pci_disable_device(pci); + if (err < 0) return err; - } chip->io_port = pci_resource_start(pci, 0); chip->sb_port = pci_resource_start(pci, 1); chip->vc_port = pci_resource_start(pci, 2); chip->mpu_port = pci_resource_start(pci, 3); chip->game_port = pci_resource_start(pci, 4); + /* still use non-managed irq handler as it's re-acquired at PM resume */ if (request_irq(pci->irq, snd_es1938_interrupt, IRQF_SHARED, KBUILD_MODNAME, chip)) { dev_err(card->dev, "unable to grab IRQ %d\n", pci->irq); - snd_es1938_free(chip); return -EBUSY; } chip->irq = pci->irq; card->sync_irq = chip->irq; + card->private_free = snd_es1938_free; dev_dbg(card->dev, "create: io: 0x%lx, sb: 0x%lx, vc: 0x%lx, mpu: 0x%lx, game: 0x%lx\n", chip->io_port, chip->sb_port, chip->vc_port, chip->mpu_port, chip->game_port); @@ -1604,14 +1582,6 @@ static int snd_es1938_create(struct snd_card *card, chip->ddma_port = chip->vc_port + 0x00; /* fix from Thomas Sailer */ snd_es1938_chip_init(chip); - - err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops); - if (err < 0) { - snd_es1938_free(chip); - return err; - } - - *rchip = chip; return 0; } @@ -1762,23 +1732,20 @@ static int snd_es1938_probe(struct pci_dev *pci, return -ENOENT; } - err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, - 0, &card); + err = snd_devm_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, + sizeof(*chip), &card); if (err < 0) return err; - for (idx = 0; idx < 5; idx++) { + chip = card->private_data; + + for (idx = 0; idx < 5; idx++) if (pci_resource_start(pci, idx) == 0 || - !(pci_resource_flags(pci, idx) & IORESOURCE_IO)) { - snd_card_free(card); - return -ENODEV; - } - } - err = snd_es1938_create(card, pci, &chip); - if (err < 0) { - snd_card_free(card); + !(pci_resource_flags(pci, idx) & IORESOURCE_IO)) + return -ENODEV; + + err = snd_es1938_create(card, pci); + if (err < 0) return err; - } - card->private_data = chip; strcpy(card->driver, "ES1938"); strcpy(card->shortname, "ESS ES1938 (Solo-1)"); @@ -1788,15 +1755,11 @@ static int snd_es1938_probe(struct pci_dev *pci, chip->irq); err = snd_es1938_new_pcm(chip, 0); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } err = snd_es1938_mixer(chip); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } if (snd_opl3_create(card, SLSB_REG(chip, FMLOWADDR), SLSB_REG(chip, FMHIGHADDR), @@ -1805,15 +1768,11 @@ static int snd_es1938_probe(struct pci_dev *pci, SLSB_REG(chip, FMLOWADDR)); } else { err = snd_opl3_timer_new(opl3, 0, 1); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } err = snd_opl3_hwdep_new(opl3, 0, 1, NULL); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } } if (snd_mpu401_uart_new(card, 0, MPU401_HW_MPU401, chip->mpu_port, @@ -1829,26 +1788,18 @@ static int snd_es1938_probe(struct pci_dev *pci, snd_es1938_create_gameport(chip); err = snd_card_register(card); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } pci_set_drvdata(pci, card); dev++; return 0; } -static void snd_es1938_remove(struct pci_dev *pci) -{ - snd_card_free(pci_get_drvdata(pci)); -} - static struct pci_driver es1938_driver = { .name = KBUILD_MODNAME, .id_table = snd_es1938_ids, .probe = snd_es1938_probe, - .remove = snd_es1938_remove, .driver = { .pm = ES1938_PM_OPS, }, From patchwork Thu Jul 15 07:58:40 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379243 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3D26EC07E96 for ; Thu, 15 Jul 2021 08:08:13 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id B6CC5610D1 for ; Thu, 15 Jul 2021 08:08:12 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org B6CC5610D1 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id 587DF16D0; Thu, 15 Jul 2021 10:07:21 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 587DF16D0 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626336491; bh=ij7a0EWxgpUwklHOuXNxR3GuD+/Nugm04Uful23auT4=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=HB5V0kmTqZFJFODLCL2vINsoHbp6bG06UH9WImux8KavgIVZiLWwi3DbKE9PHyuA+ gufj7T+kMatC142iro1EvuSfgcYWMh37fMcbL9itZj03aBnYxTr/GzcJUnQQfPdkg4 Bn+NqA/yJWphlng7DH93V9rrKGpzyMaQieYr/y9g= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id 05882F805EB; Thu, 15 Jul 2021 10:00:36 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id 39395F805BA; Thu, 15 Jul 2021 10:00:27 +0200 (CEST) Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 97D1AF804E6 for ; Thu, 15 Jul 2021 10:00:00 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 97D1AF804E6 Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="eGBdHgXt"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="M7Fl3CNj" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out1.suse.de (Postfix) with ESMTP id 661F22284E for ; Thu, 15 Jul 2021 08:00:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336000; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=hvr5Yaq8pXyBba5sokGGZLBccFIEBRKfkQHQotK6Pj8=; b=eGBdHgXtrigqsO2Iugt0bLOH8+cDAx75sD7dNl0FRCDewgiHovSiLubrPpsOAecR3L9jlW gFiaJ1yAypKJi2JzmL7bFWjDCOVpsEk1G1Do8lTDsELc33xIfiDKuIiYJUaTqvo3C6afqh vaQLu3ybIi6YZ2LIIw7MvknOx0EnmI8= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336000; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=hvr5Yaq8pXyBba5sokGGZLBccFIEBRKfkQHQotK6Pj8=; b=M7Fl3CNj0St4GpQXeO2tkgPD/l6I3QMNgDfDsQNAYPRKAcXlbHTrAxAIetDAtf0scStaEs 5Ryb5cVoNc9u0cCQ== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id 5318FA3B99; Thu, 15 Jul 2021 08:00:00 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 18/79] ALSA: es1968: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:58:40 +0200 Message-Id: <20210715075941.23332-19-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in PCI es1968 driver with devres as a clean up. Each manual resource management is converted with the corresponding devres helper, and the card object release is managed now via card->private_free instead of a lowlevel snd_device. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- sound/pci/es1968.c | 112 ++++++++++----------------------------------- 1 file changed, 24 insertions(+), 88 deletions(-) diff --git a/sound/pci/es1968.c b/sound/pci/es1968.c index c038c1035c39..6a8a02a9ecf4 100644 --- a/sound/pci/es1968.c +++ b/sound/pci/es1968.c @@ -2442,7 +2442,8 @@ static int snd_es1968_create_gameport(struct es1968 *chip, int dev) if (!joystick[dev]) return -ENODEV; - r = request_region(JOYSTICK_ADDR, 8, "ES1968 gameport"); + r = devm_request_region(&chip->pci->dev, JOYSTICK_ADDR, 8, + "ES1968 gameport"); if (!r) return -EBUSY; @@ -2450,7 +2451,6 @@ static int snd_es1968_create_gameport(struct es1968 *chip, int dev) if (!gp) { dev_err(chip->card->dev, "cannot allocate memory for gameport\n"); - release_and_free_resource(r); return -ENOMEM; } @@ -2461,7 +2461,6 @@ static int snd_es1968_create_gameport(struct es1968 *chip, int dev) gameport_set_phys(gp, "pci%s/gameport0", pci_name(chip->pci)); gameport_set_dev_parent(gp, &chip->pci->dev); gp->io = JOYSTICK_ADDR; - gameport_set_port_data(gp, r); gameport_register_port(gp); @@ -2471,12 +2470,8 @@ static int snd_es1968_create_gameport(struct es1968 *chip, int dev) static void snd_es1968_free_gameport(struct es1968 *chip) { if (chip->gameport) { - struct resource *r = gameport_get_port_data(chip->gameport); - gameport_unregister_port(chip->gameport); chip->gameport = NULL; - - release_and_free_resource(r); } } #else @@ -2490,7 +2485,7 @@ static int snd_es1968_input_register(struct es1968 *chip) struct input_dev *input_dev; int err; - input_dev = input_allocate_device(); + input_dev = devm_input_allocate_device(&chip->pci->dev); if (!input_dev) return -ENOMEM; @@ -2510,10 +2505,8 @@ static int snd_es1968_input_register(struct es1968 *chip) __set_bit(KEY_VOLUMEUP, input_dev->keybit); err = input_register_device(input_dev); - if (err) { - input_free_device(input_dev); + if (err) return err; - } chip->input_dev = input_dev; return 0; @@ -2597,13 +2590,11 @@ static const struct snd_tea575x_ops snd_es1968_tea_ops = { }; #endif -static int snd_es1968_free(struct es1968 *chip) +static void snd_es1968_free(struct snd_card *card) { + struct es1968 *chip = card->private_data; + cancel_work_sync(&chip->hwvol_work); -#ifdef CONFIG_SND_ES1968_INPUT - if (chip->input_dev) - input_unregister_device(chip->input_dev); -#endif if (chip->io_port) { outw(1, chip->io_port + 0x04); /* clear WP interrupts */ @@ -2615,19 +2606,7 @@ static int snd_es1968_free(struct es1968 *chip) v4l2_device_unregister(&chip->v4l2_dev); #endif - if (chip->irq >= 0) - free_irq(chip->irq, chip); snd_es1968_free_gameport(chip); - pci_release_regions(chip->pci); - pci_disable_device(chip->pci); - kfree(chip); - return 0; -} - -static int snd_es1968_dev_free(struct snd_device *device) -{ - struct es1968 *chip = device->device_data; - return snd_es1968_free(chip); } struct ess_device_list { @@ -2657,35 +2636,22 @@ static int snd_es1968_create(struct snd_card *card, int capt_streams, int chip_type, int do_pm, - int radio_nr, - struct es1968 **chip_ret) + int radio_nr) { - static const struct snd_device_ops ops = { - .dev_free = snd_es1968_dev_free, - }; - struct es1968 *chip; + struct es1968 *chip = card->private_data; int i, err; - *chip_ret = NULL; - /* enable PCI device */ - err = pci_enable_device(pci); + err = pcim_enable_device(pci); if (err < 0) return err; /* check, if we can restrict PCI DMA transfers to 28 bits */ if (dma_set_mask_and_coherent(&pci->dev, DMA_BIT_MASK(28))) { dev_err(card->dev, "architecture does not support 28bit PCI busmaster DMA\n"); - pci_disable_device(pci); return -ENXIO; } - chip = kzalloc(sizeof(*chip), GFP_KERNEL); - if (! chip) { - pci_disable_device(pci); - return -ENOMEM; - } - /* Set Vars */ chip->type = chip_type; spin_lock_init(&chip->reg_lock); @@ -2702,20 +2668,17 @@ static int snd_es1968_create(struct snd_card *card, chip->capture_streams = capt_streams; err = pci_request_regions(pci, "ESS Maestro"); - if (err < 0) { - kfree(chip); - pci_disable_device(pci); + if (err < 0) return err; - } chip->io_port = pci_resource_start(pci, 0); - if (request_irq(pci->irq, snd_es1968_interrupt, IRQF_SHARED, - KBUILD_MODNAME, chip)) { + if (devm_request_irq(&pci->dev, pci->irq, snd_es1968_interrupt, + IRQF_SHARED, KBUILD_MODNAME, chip)) { dev_err(card->dev, "unable to grab IRQ %d\n", pci->irq); - snd_es1968_free(chip); return -EBUSY; } chip->irq = pci->irq; card->sync_irq = chip->irq; + card->private_free = snd_es1968_free; /* Clear Maestro_map */ for (i = 0; i < 32; i++) @@ -2749,21 +2712,13 @@ static int snd_es1968_create(struct snd_card *card, snd_es1968_chip_init(chip); - err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops); - if (err < 0) { - snd_es1968_free(chip); - return err; - } - #ifdef CONFIG_SND_ES1968_RADIO /* don't play with GPIOs on laptops */ if (chip->pci->subsystem_vendor != 0x125d) - goto no_radio; + return 0; err = v4l2_device_register(&pci->dev, &chip->v4l2_dev); - if (err < 0) { - snd_es1968_free(chip); + if (err < 0) return err; - } chip->tea.v4l2_dev = &chip->v4l2_dev; chip->tea.private_data = chip; chip->tea.radio_nr = radio_nr; @@ -2779,11 +2734,7 @@ static int snd_es1968_create(struct snd_card *card, break; } } -no_radio: #endif - - *chip_ret = chip; - return 0; } @@ -2806,10 +2757,11 @@ static int snd_es1968_probe(struct pci_dev *pci, return -ENOENT; } - err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, - 0, &card); + err = snd_devm_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, + sizeof(*chip), &card); if (err < 0) return err; + chip = card->private_data; if (total_bufsize[dev] < 128) total_bufsize[dev] = 128; @@ -2821,13 +2773,9 @@ static int snd_es1968_probe(struct pci_dev *pci, pcm_substreams_c[dev], pci_id->driver_data, use_pm[dev], - radio_nr[dev], - &chip); - if (err < 0) { - snd_card_free(card); + radio_nr[dev]); + if (err < 0) return err; - } - card->private_data = chip; switch (chip->type) { case TYPE_MAESTRO2E: @@ -2845,16 +2793,12 @@ static int snd_es1968_probe(struct pci_dev *pci, } err = snd_es1968_pcm(chip, 0); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } err = snd_es1968_mixer(chip); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } if (enable_mpu[dev] == 2) { /* check the deny list */ @@ -2897,25 +2841,17 @@ static int snd_es1968_probe(struct pci_dev *pci, card->shortname, chip->io_port, chip->irq); err = snd_card_register(card); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } pci_set_drvdata(pci, card); dev++; return 0; } -static void snd_es1968_remove(struct pci_dev *pci) -{ - snd_card_free(pci_get_drvdata(pci)); -} - static struct pci_driver es1968_driver = { .name = KBUILD_MODNAME, .id_table = snd_es1968_ids, .probe = snd_es1968_probe, - .remove = snd_es1968_remove, .driver = { .pm = ES1968_PM_OPS, }, From patchwork Thu Jul 15 07:58:41 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379245 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 262A3C07E96 for ; Thu, 15 Jul 2021 08:08:47 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 943B461362 for ; Thu, 15 Jul 2021 08:08:46 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 943B461362 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id 3B85416B6; Thu, 15 Jul 2021 10:07:55 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 3B85416B6 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626336525; bh=pBtt/uTISb8NPCkEom15usZ6QN8XM+za30pYh42Crn8=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=M/48jFxULKVTTVhQlHnbf1RVNZf6zgdA/S4hGT/w37OG6k3bMkY9Y1ZUmtchOnw3m 8k/NBbiRNdRc9oprL7Id5fKriX4JA9eT2xQmtHfP60+X6aDEENz5O4jHCbTHGm3TmP Qmw+idL5kw979ezsjQdVvxnZYcuvttlx18SBiF20= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id C7A2DF805F5; Thu, 15 Jul 2021 10:00:37 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id 0BC39F804EB; Thu, 15 Jul 2021 10:00:30 +0200 (CEST) Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 07396F804EB for ; Thu, 15 Jul 2021 10:00:00 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 07396F804EB Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="wj0caXi+"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="EuY6aKSv" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out2.suse.de (Postfix) with ESMTP id D2D1F1FDE5 for ; Thu, 15 Jul 2021 08:00:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336000; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=H+FcHIP2zdusgbPrYoClAr9cEuLFcqZ/s7i7OKllpgQ=; b=wj0caXi+pLReM87KOMDWWit+h7bomiIqAgOi0ZdEJajTAvZmsvNGXI2INZaaeCMhmoaunD PdPQdQOM4bnt3NHmWKKDXha4o51q39HTb9RRWKc1bA5aF3N2OkbP6xfiHIDxSmhwiIb2U6 hjBbO76XH193b5rH480QUAkZPG/sjm8= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336000; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=H+FcHIP2zdusgbPrYoClAr9cEuLFcqZ/s7i7OKllpgQ=; b=EuY6aKSvbgJ4Tu3PTXMMC/NWFyYQPjuVigFr2K4Q/lfJVenbCBCpXZABL8R0Nxot+b9c9X 52FBYBIHZu2h2WBQ== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id C0405A3B8D; Thu, 15 Jul 2021 08:00:00 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 19/79] ALSA: fm801: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:58:41 +0200 Message-Id: <20210715075941.23332-20-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in PCI fm801 driver with devres as a clean up. Each manual resource management is converted with the corresponding devres helper, and the card object release is managed now via card->private_free instead of a lowlevel snd_device. Also the superfluous ac97 private_free callbacks were dropped, too. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- sound/pci/fm801.c | 103 ++++++++-------------------------------------- 1 file changed, 17 insertions(+), 86 deletions(-) diff --git a/sound/pci/fm801.c b/sound/pci/fm801.c index ed9dae87145b..9c22ff19e56d 100644 --- a/sound/pci/fm801.c +++ b/sound/pci/fm801.c @@ -1028,22 +1028,6 @@ FM801_SINGLE(SNDRV_CTL_NAME_IEC958("Raw Data ",CAPTURE,SWITCH), FM801_I2S_MODE, FM801_SINGLE(SNDRV_CTL_NAME_IEC958("",PLAYBACK,SWITCH), FM801_GEN_CTRL, 2, 1, 0), }; -static void snd_fm801_mixer_free_ac97_bus(struct snd_ac97_bus *bus) -{ - struct fm801 *chip = bus->private_data; - chip->ac97_bus = NULL; -} - -static void snd_fm801_mixer_free_ac97(struct snd_ac97 *ac97) -{ - struct fm801 *chip = ac97->private_data; - if (ac97->num == 0) { - chip->ac97 = NULL; - } else { - chip->ac97_sec = NULL; - } -} - static int snd_fm801_mixer(struct fm801 *chip) { struct snd_ac97_template ac97; @@ -1057,11 +1041,9 @@ static int snd_fm801_mixer(struct fm801 *chip) err = snd_ac97_bus(chip->card, 0, &ops, chip, &chip->ac97_bus); if (err < 0) return err; - chip->ac97_bus->private_free = snd_fm801_mixer_free_ac97_bus; memset(&ac97, 0, sizeof(ac97)); ac97.private_data = chip; - ac97.private_free = snd_fm801_mixer_free_ac97; err = snd_ac97_mixer(chip->ac97_bus, &ac97, &chip->ac97); if (err < 0) return err; @@ -1177,55 +1159,35 @@ static void snd_fm801_chip_init(struct fm801 *chip) FM801_IRQ_PLAYBACK | FM801_IRQ_CAPTURE | FM801_IRQ_MPU); } -static int snd_fm801_free(struct fm801 *chip) +static void snd_fm801_free(struct snd_card *card) { + struct fm801 *chip = card->private_data; unsigned short cmdw; - if (chip->irq < 0) - goto __end_hw; - /* interrupt setup - mask everything */ cmdw = fm801_readw(chip, IRQ_MASK); cmdw |= 0x00c3; fm801_writew(chip, IRQ_MASK, cmdw); - devm_free_irq(chip->dev, chip->irq, chip); - - __end_hw: #ifdef CONFIG_SND_FM801_TEA575X_BOOL if (!(chip->tea575x_tuner & TUNER_DISABLED)) { snd_tea575x_exit(&chip->tea); v4l2_device_unregister(&chip->v4l2_dev); } #endif - return 0; -} - -static int snd_fm801_dev_free(struct snd_device *device) -{ - struct fm801 *chip = device->device_data; - return snd_fm801_free(chip); } static int snd_fm801_create(struct snd_card *card, struct pci_dev *pci, int tea575x_tuner, - int radio_nr, - struct fm801 **rchip) + int radio_nr) { - struct fm801 *chip; + struct fm801 *chip = card->private_data; int err; - static const struct snd_device_ops ops = { - .dev_free = snd_fm801_dev_free, - }; - *rchip = NULL; err = pcim_enable_device(pci); if (err < 0) return err; - chip = devm_kzalloc(&pci->dev, sizeof(*chip), GFP_KERNEL); - if (chip == NULL) - return -ENOMEM; spin_lock_init(&chip->reg_lock); chip->card = card; chip->dev = &pci->dev; @@ -1253,7 +1215,6 @@ static int snd_fm801_create(struct snd_card *card, if (devm_request_irq(&pci->dev, pci->irq, snd_fm801_interrupt, IRQF_SHARED, KBUILD_MODNAME, chip)) { dev_err(card->dev, "unable to grab IRQ %d\n", pci->irq); - snd_fm801_free(chip); return -EBUSY; } chip->irq = pci->irq; @@ -1261,20 +1222,13 @@ static int snd_fm801_create(struct snd_card *card, pci_set_master(pci); } + card->private_free = snd_fm801_free; snd_fm801_chip_init(chip); - err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops); - if (err < 0) { - snd_fm801_free(chip); - return err; - } - #ifdef CONFIG_SND_FM801_TEA575X_BOOL err = v4l2_device_register(&pci->dev, &chip->v4l2_dev); - if (err < 0) { - snd_fm801_free(chip); + if (err < 0) return err; - } chip->tea.v4l2_dev = &chip->v4l2_dev; chip->tea.radio_nr = radio_nr; chip->tea.private_data = chip; @@ -1284,7 +1238,6 @@ static int snd_fm801_create(struct snd_card *card, (chip->tea575x_tuner & TUNER_TYPE_MASK) < 4) { if (snd_tea575x_init(&chip->tea, THIS_MODULE)) { dev_err(card->dev, "TEA575x radio not found\n"); - snd_fm801_free(chip); return -ENODEV; } } else if ((chip->tea575x_tuner & TUNER_TYPE_MASK) == 0) { @@ -1312,8 +1265,6 @@ static int snd_fm801_create(struct snd_card *card, sizeof(chip->tea.card)); } #endif - - *rchip = chip; return 0; } @@ -1333,16 +1284,14 @@ static int snd_card_fm801_probe(struct pci_dev *pci, return -ENOENT; } - err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, - 0, &card); + err = snd_devm_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, + sizeof(*chip), &card); if (err < 0) return err; - err = snd_fm801_create(card, pci, tea575x_tuner[dev], radio_nr[dev], &chip); - if (err < 0) { - snd_card_free(card); + chip = card->private_data; + err = snd_fm801_create(card, pci, tea575x_tuner[dev], radio_nr[dev]); + if (err < 0) return err; - } - card->private_data = chip; strcpy(card->driver, "FM801"); strcpy(card->shortname, "ForteMedia FM801-"); @@ -1354,53 +1303,36 @@ static int snd_card_fm801_probe(struct pci_dev *pci, goto __fm801_tuner_only; err = snd_fm801_pcm(chip, 0); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } err = snd_fm801_mixer(chip); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } err = snd_mpu401_uart_new(card, 0, MPU401_HW_FM801, chip->port + FM801_MPU401_DATA, MPU401_INFO_INTEGRATED | MPU401_INFO_IRQ_HOOK, -1, &chip->rmidi); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } err = snd_opl3_create(card, chip->port + FM801_OPL3_BANK0, chip->port + FM801_OPL3_BANK1, OPL3_HW_OPL3_FM801, 1, &opl3); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } err = snd_opl3_hwdep_new(opl3, 0, 1, NULL); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } __fm801_tuner_only: err = snd_card_register(card); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } pci_set_drvdata(pci, card); dev++; return 0; } -static void snd_card_fm801_remove(struct pci_dev *pci) -{ - snd_card_free(pci_get_drvdata(pci)); -} - #ifdef CONFIG_PM_SLEEP static const unsigned char saved_regs[] = { FM801_PCM_VOL, FM801_I2S_VOL, FM801_FM_VOL, FM801_REC_SRC, @@ -1468,7 +1400,6 @@ static struct pci_driver fm801_driver = { .name = KBUILD_MODNAME, .id_table = snd_fm801_ids, .probe = snd_card_fm801_probe, - .remove = snd_card_fm801_remove, .driver = { .pm = SND_FM801_PM_OPS, }, From patchwork Thu Jul 15 07:58:42 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379249 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.0 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, UNWANTED_LANGUAGE_BODY,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id C2420C07E96 for ; Thu, 15 Jul 2021 08:09:25 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 48F19610D1 for ; Thu, 15 Jul 2021 08:09:25 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 48F19610D1 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id C10DE1693; Thu, 15 Jul 2021 10:08:33 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz C10DE1693 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626336563; bh=C2DUk2ahSyWUnhSSP5O9DlVQ7Nj1+6BKI+gxHE0FpYw=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=lV2rMk7ZXiLUIN1Y8pM/RBgVw9nHn5uTQ/agiNdTSgrf37S1jIOVgT6bYIxHZfSLA l3KLMFNnVk6oNks0LN3unS1b9v+KhTwRrY/5TMVfraVFBbeyKOCd6cfKCTS938dMJ1 +m5hSKKpnFgYnjqSYHN+onzdvcpeVbusEnbeeWeQ= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id 566CEF805F8; Thu, 15 Jul 2021 10:00:40 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id 1753AF804EB; Thu, 15 Jul 2021 10:00:32 +0200 (CEST) Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 65EBBF804F1 for ; Thu, 15 Jul 2021 10:00:01 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 65EBBF804F1 Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="IB5jZDwS"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="jaWQNava" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out1.suse.de (Postfix) with ESMTP id 41F632284C for ; Thu, 15 Jul 2021 08:00:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336001; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=fusZtg22Gbb/Jg9/if1Lw2R8bfZp7jjBjx0z+VU3ZIM=; b=IB5jZDwSlnKBkC/gYDddeGUTdjrK2gRT3cZvoKmDwtmi33vVhkSHn1TqrMcg/VwFNP4LLR KlFmSkoTxhQGEtSTbuAjPnKgWxCk3E/cVKK80ajzspEl4Jb03pbfVli+1fG6fc9sLXcKO6 Ffn9JAP3fPWn1L7Wwuxq5tor2DGrHUs= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336001; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=fusZtg22Gbb/Jg9/if1Lw2R8bfZp7jjBjx0z+VU3ZIM=; b=jaWQNavaqlhBQna4LBkuYd57waKwAU8O3xnVW1tWXTXPWCUmgawA2ALt7B42j/QUEnKy91 zJ8zlbMAe0PMbKDA== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id 2F7EAA3B8D; Thu, 15 Jul 2021 08:00:01 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 20/79] ALSA: maestro3: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:58:42 +0200 Message-Id: <20210715075941.23332-21-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in PCI maestro3 driver with devres as a clean up. Each manual resource management is converted with the corresponding devres helper, and the card object release is managed now via card->private_free instead of a lowlevel snd_device. Superfluous ac97 private_free callbacks were dropped, too. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- sound/pci/maestro3.c | 106 ++++++++++--------------------------------- 1 file changed, 23 insertions(+), 83 deletions(-) diff --git a/sound/pci/maestro3.c b/sound/pci/maestro3.c index 77a484bc8c0d..056838ead21d 100644 --- a/sound/pci/maestro3.c +++ b/sound/pci/maestro3.c @@ -2339,16 +2339,13 @@ snd_m3_enable_ints(struct snd_m3 *chip) /* */ -static int snd_m3_free(struct snd_m3 *chip) +static void snd_m3_free(struct snd_card *card) { + struct snd_m3 *chip = card->private_data; struct m3_dma *s; int i; cancel_work_sync(&chip->hwvol_work); -#ifdef CONFIG_SND_MAESTRO3_INPUT - if (chip->input_dev) - input_unregister_device(chip->input_dev); -#endif if (chip->substreams) { spin_lock_irq(&chip->reg_lock); @@ -2359,7 +2356,6 @@ static int snd_m3_free(struct snd_m3 *chip) snd_m3_pcm_stop(chip, s, s->substream); } spin_unlock_irq(&chip->reg_lock); - kfree(chip->substreams); } if (chip->iobase) { outw(0, chip->iobase + HOST_INT_CTRL); /* disable ints */ @@ -2368,19 +2364,8 @@ static int snd_m3_free(struct snd_m3 *chip) #ifdef CONFIG_PM_SLEEP vfree(chip->suspend_mem); #endif - - if (chip->irq >= 0) - free_irq(chip->irq, chip); - - if (chip->iobase) - pci_release_regions(chip->pci); - release_firmware(chip->assp_kernel_image); release_firmware(chip->assp_minisrc_image); - - pci_disable_device(chip->pci); - kfree(chip); - return 0; } @@ -2473,7 +2458,7 @@ static int snd_m3_input_register(struct snd_m3 *chip) struct input_dev *input_dev; int err; - input_dev = input_allocate_device(); + input_dev = devm_input_allocate_device(&chip->pci->dev); if (!input_dev) return -ENOMEM; @@ -2493,10 +2478,8 @@ static int snd_m3_input_register(struct snd_m3 *chip) __set_bit(KEY_VOLUMEUP, input_dev->keybit); err = input_register_device(input_dev); - if (err) { - input_free_device(input_dev); + if (err) return err; - } chip->input_dev = input_dev; return 0; @@ -2506,44 +2489,25 @@ static int snd_m3_input_register(struct snd_m3 *chip) /* */ -static int snd_m3_dev_free(struct snd_device *device) -{ - struct snd_m3 *chip = device->device_data; - return snd_m3_free(chip); -} - static int snd_m3_create(struct snd_card *card, struct pci_dev *pci, int enable_amp, - int amp_gpio, - struct snd_m3 **chip_ret) + int amp_gpio) { - struct snd_m3 *chip; + struct snd_m3 *chip = card->private_data; int i, err; const struct snd_pci_quirk *quirk; - static const struct snd_device_ops ops = { - .dev_free = snd_m3_dev_free, - }; - *chip_ret = NULL; - - if (pci_enable_device(pci)) + if (pcim_enable_device(pci)) return -EIO; /* check, if we can restrict PCI DMA transfers to 28 bits */ if (dma_set_mask_and_coherent(&pci->dev, DMA_BIT_MASK(28))) { dev_err(card->dev, "architecture does not support 28bit PCI busmaster DMA\n"); - pci_disable_device(pci); return -ENXIO; } - chip = kzalloc(sizeof(*chip), GFP_KERNEL); - if (chip == NULL) { - pci_disable_device(pci); - return -ENOMEM; - } - spin_lock_init(&chip->reg_lock); switch (pci->device) { @@ -2559,6 +2523,7 @@ snd_m3_create(struct snd_card *card, struct pci_dev *pci, chip->pci = pci; chip->irq = -1; INIT_WORK(&chip->hwvol_work, snd_m3_update_hw_volume); + card->private_free = snd_m3_free; chip->external_amp = enable_amp; if (amp_gpio >= 0 && amp_gpio <= 0x0f) @@ -2588,27 +2553,24 @@ snd_m3_create(struct snd_card *card, struct pci_dev *pci, chip->is_omnibook = 1; chip->num_substreams = NR_DSPS; - chip->substreams = kcalloc(chip->num_substreams, sizeof(struct m3_dma), - GFP_KERNEL); - if (chip->substreams == NULL) { - kfree(chip); - pci_disable_device(pci); + chip->substreams = devm_kcalloc(&pci->dev, chip->num_substreams, + sizeof(struct m3_dma), GFP_KERNEL); + if (!chip->substreams) return -ENOMEM; - } err = request_firmware(&chip->assp_kernel_image, "ess/maestro3_assp_kernel.fw", &pci->dev); if (err < 0) - goto free_chip; + return err; err = request_firmware(&chip->assp_minisrc_image, "ess/maestro3_assp_minisrc.fw", &pci->dev); if (err < 0) - goto free_chip; + return err; err = pci_request_regions(pci, card->driver); if (err < 0) - goto free_chip; + return err; chip->iobase = pci_resource_start(pci, 0); @@ -2624,11 +2586,10 @@ snd_m3_create(struct snd_card *card, struct pci_dev *pci, snd_m3_hv_init(chip); - if (request_irq(pci->irq, snd_m3_interrupt, IRQF_SHARED, - KBUILD_MODNAME, chip)) { + if (devm_request_irq(&pci->dev, pci->irq, snd_m3_interrupt, IRQF_SHARED, + KBUILD_MODNAME, chip)) { dev_err(card->dev, "unable to grab IRQ %d\n", pci->irq); - err = -ENOMEM; - goto free_chip; + return -ENOMEM; } chip->irq = pci->irq; card->sync_irq = chip->irq; @@ -2642,10 +2603,6 @@ snd_m3_create(struct snd_card *card, struct pci_dev *pci, dev_warn(card->dev, "can't allocate apm buffer\n"); #endif - err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops); - if (err < 0) - goto free_chip; - err = snd_m3_mixer(chip); if (err < 0) return err; @@ -2674,13 +2631,7 @@ snd_m3_create(struct snd_card *card, struct pci_dev *pci, snd_m3_enable_ints(chip); snd_m3_assp_continue(chip); - *chip_ret = chip; - return 0; - -free_chip: - snd_m3_free(chip); - return err; } /* @@ -2704,10 +2655,11 @@ snd_m3_probe(struct pci_dev *pci, const struct pci_device_id *pci_id) return -ENOENT; } - err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, - 0, &card); + err = snd_devm_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, + sizeof(*chip), &card); if (err < 0) return err; + chip = card->private_data; switch (pci->device) { case PCI_DEVICE_ID_ESS_ALLEGRO: @@ -2723,11 +2675,9 @@ snd_m3_probe(struct pci_dev *pci, const struct pci_device_id *pci_id) break; } - err = snd_m3_create(card, pci, external_amp[dev], amp_gpio[dev], &chip); + err = snd_m3_create(card, pci, external_amp[dev], amp_gpio[dev]); if (err < 0) - goto free_card; - - card->private_data = chip; + return err; sprintf(card->shortname, "ESS %s PCI", card->driver); sprintf(card->longname, "%s at 0x%lx, irq %d", @@ -2735,7 +2685,7 @@ snd_m3_probe(struct pci_dev *pci, const struct pci_device_id *pci_id) err = snd_card_register(card); if (err < 0) - goto free_card; + return err; #if 0 /* TODO: not supported yet */ /* TODO enable MIDI IRQ and I/O */ @@ -2750,22 +2700,12 @@ snd_m3_probe(struct pci_dev *pci, const struct pci_device_id *pci_id) pci_set_drvdata(pci, card); dev++; return 0; - -free_card: - snd_card_free(card); - return err; -} - -static void snd_m3_remove(struct pci_dev *pci) -{ - snd_card_free(pci_get_drvdata(pci)); } static struct pci_driver m3_driver = { .name = KBUILD_MODNAME, .id_table = snd_m3_ids, .probe = snd_m3_probe, - .remove = snd_m3_remove, .driver = { .pm = M3_PM_OPS, }, From patchwork Thu Jul 15 07:58:43 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379247 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 03B37C07E96 for ; Thu, 15 Jul 2021 08:09:05 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 855876136E for ; Thu, 15 Jul 2021 08:09:04 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 855876136E Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id 26F4116E1; Thu, 15 Jul 2021 10:08:13 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 26F4116E1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626336543; bh=tbIThGY2VsWnck0Zq9qRfZnheBoMGQGe3YYNJ1zqUQA=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=RAMEGDGhEtlk28qbbfSV4kyengwiW+IFK1CQcKN0aREefmC99YtAA79Vab6UMFT+4 pvNvmCvFR3+9cx5Lw9i0OHdFgw4wL3J8upz/DzEizJKnWqb7adQQmgLWSWn8Wu0p0f MbZBSg7e31PGb5UyJqh/lkM+vOgWSXsCp77FFJPg= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id DB4A5F805F7; Thu, 15 Jul 2021 10:00:38 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id BBD84F805D5; Thu, 15 Jul 2021 10:00:30 +0200 (CEST) Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id D5F9CF804F2 for ; Thu, 15 Jul 2021 10:00:01 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz D5F9CF804F2 Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="arlJ+Ic2"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="GRNbJmkO" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out2.suse.de (Postfix) with ESMTP id A5E4E1FD3E for ; Thu, 15 Jul 2021 08:00:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336001; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=2UJlcNtLCmRyyiZVZtAne3g+hTdewxTFXlBLrEUT66E=; b=arlJ+Ic273C9rGgKMGnSAdMYlZP3oQ78T010mZk/pXHvWqG5zmchGpRH19zypcckKSuhO5 aIOiC1RJKqFhMzeR9TrP+kg0yBoIkmtRq9y2+JFWs4XojNnpSQyBAxaH/kkjW541mrD4P8 KaGS2lQijxH68tQtI8Yd/Lx83Bd9RMQ= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336001; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=2UJlcNtLCmRyyiZVZtAne3g+hTdewxTFXlBLrEUT66E=; b=GRNbJmkOGEKr5h1EA0ErVkqUDgmG76k49kd3UbLtcssVojLciF32DcxvylCJaWCRRAyN/1 1nRFkuPJ+llnkABA== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id 93430A3B8D; Thu, 15 Jul 2021 08:00:01 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 21/79] ALSA: rme32: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:58:43 +0200 Message-Id: <20210715075941.23332-22-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in PCI rme32 driver with devres as a clean up. Each manual resource management is converted with the corresponding devres helper. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- sound/pci/rme32.c | 49 +++++++++++------------------------------------ 1 file changed, 11 insertions(+), 38 deletions(-) diff --git a/sound/pci/rme32.c b/sound/pci/rme32.c index b5b357853c94..5b6bd9f0b2f7 100644 --- a/sound/pci/rme32.c +++ b/sound/pci/rme32.c @@ -1278,27 +1278,10 @@ static const struct snd_pcm_ops snd_rme32_capture_adat_fd_ops = { .ack = snd_rme32_capture_fd_ack, }; -static void snd_rme32_free(void *private_data) +static void snd_rme32_free(struct rme32 *rme32) { - struct rme32 *rme32 = (struct rme32 *) private_data; - - if (rme32 == NULL) { - return; - } - if (rme32->irq >= 0) { + if (rme32->irq >= 0) snd_rme32_pcm_stop(rme32, 0); - free_irq(rme32->irq, (void *) rme32); - rme32->irq = -1; - } - if (rme32->iobase) { - iounmap(rme32->iobase); - rme32->iobase = NULL; - } - if (rme32->port) { - pci_release_regions(rme32->pci); - rme32->port = 0; - } - pci_disable_device(rme32->pci); } static void snd_rme32_free_spdif_pcm(struct snd_pcm *pcm) @@ -1322,7 +1305,7 @@ static int snd_rme32_create(struct rme32 *rme32) rme32->irq = -1; spin_lock_init(&rme32->lock); - err = pci_enable_device(pci); + err = pcim_enable_device(pci); if (err < 0) return err; @@ -1331,16 +1314,16 @@ static int snd_rme32_create(struct rme32 *rme32) return err; rme32->port = pci_resource_start(rme32->pci, 0); - rme32->iobase = ioremap(rme32->port, RME32_IO_SIZE); + rme32->iobase = devm_ioremap(&pci->dev, rme32->port, RME32_IO_SIZE); if (!rme32->iobase) { dev_err(rme32->card->dev, "unable to remap memory region 0x%lx-0x%lx\n", - rme32->port, rme32->port + RME32_IO_SIZE - 1); + rme32->port, rme32->port + RME32_IO_SIZE - 1); return -ENOMEM; } - if (request_irq(pci->irq, snd_rme32_interrupt, IRQF_SHARED, - KBUILD_MODNAME, rme32)) { + if (devm_request_irq(&pci->dev, pci->irq, snd_rme32_interrupt, + IRQF_SHARED, KBUILD_MODNAME, rme32)) { dev_err(rme32->card->dev, "unable to grab IRQ %d\n", pci->irq); return -EBUSY; } @@ -1907,8 +1890,8 @@ snd_rme32_probe(struct pci_dev *pci, const struct pci_device_id *pci_id) return -ENOENT; } - err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, - sizeof(struct rme32), &card); + err = snd_devm_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, + sizeof(*rme32), &card); if (err < 0) return err; card->private_free = snd_rme32_card_free; @@ -1918,10 +1901,8 @@ snd_rme32_probe(struct pci_dev *pci, const struct pci_device_id *pci_id) if (fullduplex[dev]) rme32->fullduplex_mode = 1; err = snd_rme32_create(rme32); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } strcpy(card->driver, "Digi32"); switch (rme32->pci->device) { @@ -1939,25 +1920,17 @@ snd_rme32_probe(struct pci_dev *pci, const struct pci_device_id *pci_id) card->shortname, rme32->rev, rme32->port, rme32->irq); err = snd_card_register(card); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } pci_set_drvdata(pci, card); dev++; return 0; } -static void snd_rme32_remove(struct pci_dev *pci) -{ - snd_card_free(pci_get_drvdata(pci)); -} - static struct pci_driver rme32_driver = { .name = KBUILD_MODNAME, .id_table = snd_rme32_ids, .probe = snd_rme32_probe, - .remove = snd_rme32_remove, }; module_pci_driver(rme32_driver); From patchwork Thu Jul 15 07:58:44 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379251 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id AA179C07E96 for ; Thu, 15 Jul 2021 08:09:42 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 36C5360041 for ; Thu, 15 Jul 2021 08:09:42 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 36C5360041 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id AFA9116DD; Thu, 15 Jul 2021 10:08:50 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz AFA9116DD DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626336580; bh=+zZ82PvAwfuGDL+lk+bxHefvcy6qWb9WRLvqm6rUJtQ=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=rWzO6Aw2zf65lM3dX3DPOJ2/fibZCTlQYbymeibWCl9MqGJQ+HUsE0chpx6LDDvs4 /IiuniALhPhuFN5w/DDJBT9B0Xauyor9wbyuCzE29wCv6cukXuBj00AMRJIUxug8U9 j7pc1jd7FSu22JhBkTZT0ZgYrVPMSISEsN+dAKt4= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id 5ADEDF804FA; Thu, 15 Jul 2021 10:00:41 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id D33B2F805DA; Thu, 15 Jul 2021 10:00:32 +0200 (CEST) Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 735ECF80095 for ; Thu, 15 Jul 2021 10:00:02 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 735ECF80095 Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="dWnJsfg3"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="mCX0Dnsm" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out1.suse.de (Postfix) with ESMTP id 11BA922859 for ; Thu, 15 Jul 2021 08:00:02 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336002; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=UPwkniyc4i2ebrNRn1DxMXVIXeRB3qPV1y4v5jAw8Dk=; b=dWnJsfg3JmRzJzSLIi2jEY8O/812fCccOlTYQrcWRRY9dUiYM493mYM1H1t8mg2U3bXIxq lpbXUI6piWq7nHP/N7G+tNtAXLRC4t1JFL9J0kdzo7p5YACYpWVtXOgNHM3Vmyey/8ZkXh 66RdXKcuOR0sfhWY/3BooldtZh7bQ4o= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336002; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=UPwkniyc4i2ebrNRn1DxMXVIXeRB3qPV1y4v5jAw8Dk=; b=mCX0Dnsm1bONOJzwy0QkJJj+NHn5x8/+j4FzrYJj1L+li63Px3pjkJS3xJiTru0Lm7Nbbm dQjBH8zd+PTBLmDw== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id F3B88A3B9B; Thu, 15 Jul 2021 08:00:01 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 22/79] ALSA: rme96: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:58:44 +0200 Message-Id: <20210715075941.23332-23-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in PCI rme96 driver with devres as a clean up. Each manual resource management is converted with the corresponding devres helper. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- sound/pci/rme96.c | 57 ++++++++++++----------------------------------- 1 file changed, 14 insertions(+), 43 deletions(-) diff --git a/sound/pci/rme96.c b/sound/pci/rme96.c index fc7ac077559c..8fc811504920 100644 --- a/sound/pci/rme96.c +++ b/sound/pci/rme96.c @@ -1562,33 +1562,17 @@ static const struct snd_pcm_ops snd_rme96_capture_adat_ops = { }; static void -snd_rme96_free(void *private_data) +snd_rme96_free(struct rme96 *rme96) { - struct rme96 *rme96 = (struct rme96 *)private_data; - - if (!rme96) - return; - if (rme96->irq >= 0) { snd_rme96_trigger(rme96, RME96_STOP_BOTH); rme96->areg &= ~RME96_AR_DAC_EN; writel(rme96->areg, rme96->iobase + RME96_IO_ADDITIONAL_REG); - free_irq(rme96->irq, (void *)rme96); - rme96->irq = -1; - } - if (rme96->iobase) { - iounmap(rme96->iobase); - rme96->iobase = NULL; - } - if (rme96->port) { - pci_release_regions(rme96->pci); - rme96->port = 0; } #ifdef CONFIG_PM_SLEEP vfree(rme96->playback_suspend_buffer); vfree(rme96->capture_suspend_buffer); #endif - pci_disable_device(rme96->pci); } static void @@ -1614,7 +1598,7 @@ snd_rme96_create(struct rme96 *rme96) rme96->irq = -1; spin_lock_init(&rme96->lock); - err = pci_enable_device(pci); + err = pcim_enable_device(pci); if (err < 0) return err; @@ -1623,16 +1607,16 @@ snd_rme96_create(struct rme96 *rme96) return err; rme96->port = pci_resource_start(rme96->pci, 0); - rme96->iobase = ioremap(rme96->port, RME96_IO_SIZE); + rme96->iobase = devm_ioremap(&pci->dev, rme96->port, RME96_IO_SIZE); if (!rme96->iobase) { dev_err(rme96->card->dev, "unable to remap memory region 0x%lx-0x%lx\n", rme96->port, rme96->port + RME96_IO_SIZE - 1); - return -ENOMEM; + return -EBUSY; } - if (request_irq(pci->irq, snd_rme96_interrupt, IRQF_SHARED, - KBUILD_MODNAME, rme96)) { + if (devm_request_irq(&pci->dev, pci->irq, snd_rme96_interrupt, + IRQF_SHARED, KBUILD_MODNAME, rme96)) { dev_err(rme96->card->dev, "unable to grab IRQ %d\n", pci->irq); return -EBUSY; } @@ -2462,8 +2446,8 @@ snd_rme96_probe(struct pci_dev *pci, dev++; return -ENOENT; } - err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, - sizeof(struct rme96), &card); + err = snd_devm_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, + sizeof(*rme96), &card); if (err < 0) return err; card->private_free = snd_rme96_card_free; @@ -2472,19 +2456,15 @@ snd_rme96_probe(struct pci_dev *pci, rme96->pci = pci; err = snd_rme96_create(rme96); if (err) - goto free_card; + return err; #ifdef CONFIG_PM_SLEEP rme96->playback_suspend_buffer = vmalloc(RME96_BUFFER_SIZE); - if (!rme96->playback_suspend_buffer) { - err = -ENOMEM; - goto free_card; - } + if (!rme96->playback_suspend_buffer) + return -ENOMEM; rme96->capture_suspend_buffer = vmalloc(RME96_BUFFER_SIZE); - if (!rme96->capture_suspend_buffer) { - err = -ENOMEM; - goto free_card; - } + if (!rme96->capture_suspend_buffer) + return -ENOMEM; #endif strcpy(card->driver, "Digi96"); @@ -2511,26 +2491,17 @@ snd_rme96_probe(struct pci_dev *pci, rme96->port, rme96->irq); err = snd_card_register(card); if (err) - goto free_card; + return err; pci_set_drvdata(pci, card); dev++; return 0; -free_card: - snd_card_free(card); - return err; -} - -static void snd_rme96_remove(struct pci_dev *pci) -{ - snd_card_free(pci_get_drvdata(pci)); } static struct pci_driver rme96_driver = { .name = KBUILD_MODNAME, .id_table = snd_rme96_ids, .probe = snd_rme96_probe, - .remove = snd_rme96_remove, .driver = { .pm = RME96_PM_OPS, }, From patchwork Thu Jul 15 07:58:45 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379253 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 509B6C07E96 for ; Thu, 15 Jul 2021 08:10:04 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id D22F561106 for ; Thu, 15 Jul 2021 08:10:03 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org D22F561106 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id 5700B16F7; Thu, 15 Jul 2021 10:09:12 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 5700B16F7 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626336602; bh=uxuF127RxNh1vLpBnb0mPeIWS80fxyC5mYoJSDXE1Qg=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=duj09pOeyUqJu8YbWxpJLwxc+RV0Q5tZJfDxBEa9X4u2DzPeWaZvEaQMM602cnmzD ZxiTfZefpffrcY1WUanGXh+0jBVLF6iAzBNuIwRoWX8OCgB5JQ3bnlC8KTeDsZI82y pP6ecF6H/HtGzO9IXu9SD0W3XDlJjN22YEjCxJmU= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id 8793DF80600; Thu, 15 Jul 2021 10:00:42 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id 5D84EF805DF; Thu, 15 Jul 2021 10:00:33 +0200 (CEST) Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id CF4D9F80217 for ; Thu, 15 Jul 2021 10:00:02 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz CF4D9F80217 Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="xMqgXAPS"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="4viBLlQc" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out2.suse.de (Postfix) with ESMTP id 7A77F1FDE5 for ; Thu, 15 Jul 2021 08:00:02 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336002; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=/uyZApUrkBxBgvslIS+XWOOksLZCPmv837Tq/su6y7k=; b=xMqgXAPSBqBdfkawjqxvwjt947yNc95ACC+sipGy5Z78Aksvn7EQyYMMwKKli+5/k60IjE VEKH1SuU5urUPky7ErDCvjDchGyh0FLGrY9omkphmx993YwTw3sdvPlr3DVmbeR2uYCl0X 9a2ICLcs+YwWwA7BQbquJluMwT9DnDM= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336002; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=/uyZApUrkBxBgvslIS+XWOOksLZCPmv837Tq/su6y7k=; b=4viBLlQccnmcVzC/y8NORIQrxSwpw93KhmStNYTND4w8bBu+3vi6OBwpIE+hSXIfJp43mW 4tnb/gIdT7oa/YAw== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id 68AA3A3B99; Thu, 15 Jul 2021 08:00:02 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 23/79] ALSA: sis7019: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:58:45 +0200 Message-Id: <20210715075941.23332-24-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in PCI sis7019 driver with devres as a clean up. Each manual resource management is converted with the corresponding devres helper, and the card object release is managed now via card->private_free instead of a lowlevel snd_device. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- sound/pci/sis7019.c | 87 +++++++++++---------------------------------- 1 file changed, 20 insertions(+), 67 deletions(-) diff --git a/sound/pci/sis7019.c b/sound/pci/sis7019.c index 00ab51c889da..0b722b0e0604 100644 --- a/sound/pci/sis7019.c +++ b/sound/pci/sis7019.c @@ -1007,16 +1007,10 @@ static int sis_mixer_create(struct sis7019 *sis) return rc; } -static void sis_free_suspend(struct sis7019 *sis) +static void sis_chip_free(struct snd_card *card) { - int i; - - for (i = 0; i < SIS_SUSPEND_PAGES; i++) - kfree(sis->suspend_state[i]); -} + struct sis7019 *sis = card->private_data; -static int sis_chip_free(struct sis7019 *sis) -{ /* Reset the chip, and disable all interrputs. */ outl(SIS_GCR_SOFTWARE_RESET, sis->ioport + SIS_GCR); @@ -1028,18 +1022,6 @@ static int sis_chip_free(struct sis7019 *sis) */ if (sis->irq >= 0) free_irq(sis->irq, sis); - - iounmap(sis->ioaddr); - pci_release_regions(sis->pci); - pci_disable_device(sis->pci); - sis_free_suspend(sis); - return 0; -} - -static int sis_dev_free(struct snd_device *dev) -{ - struct sis7019 *sis = dev->device_data; - return sis_chip_free(sis); } static int sis_chip_init(struct sis7019 *sis) @@ -1265,7 +1247,8 @@ static int sis_alloc_suspend(struct sis7019 *sis) * buffer. */ for (i = 0; i < SIS_SUSPEND_PAGES; i++) { - sis->suspend_state[i] = kmalloc(4096, GFP_KERNEL); + sis->suspend_state[i] = devm_kmalloc(&sis->pci->dev, 4096, + GFP_KERNEL); if (!sis->suspend_state[i]) return -ENOMEM; } @@ -1279,23 +1262,19 @@ static int sis_chip_create(struct snd_card *card, { struct sis7019 *sis = card->private_data; struct voice *voice; - static const struct snd_device_ops ops = { - .dev_free = sis_dev_free, - }; int rc; int i; - rc = pci_enable_device(pci); + rc = pcim_enable_device(pci); if (rc) - goto error_out; + return rc; rc = dma_set_mask(&pci->dev, DMA_BIT_MASK(30)); if (rc < 0) { dev_err(&pci->dev, "architecture does not support 30-bit PCI busmaster DMA"); - goto error_out_enabled; + return -ENXIO; } - memset(sis, 0, sizeof(*sis)); mutex_init(&sis->ac97_mutex); spin_lock_init(&sis->voice_lock); sis->card = card; @@ -1306,31 +1285,31 @@ static int sis_chip_create(struct snd_card *card, rc = pci_request_regions(pci, "SiS7019"); if (rc) { dev_err(&pci->dev, "unable request regions\n"); - goto error_out_enabled; + return rc; } - rc = -EIO; - sis->ioaddr = ioremap(pci_resource_start(pci, 1), 0x4000); + sis->ioaddr = devm_ioremap(&pci->dev, pci_resource_start(pci, 1), 0x4000); if (!sis->ioaddr) { dev_err(&pci->dev, "unable to remap MMIO, aborting\n"); - goto error_out_cleanup; + return -EIO; } rc = sis_alloc_suspend(sis); if (rc < 0) { dev_err(&pci->dev, "unable to allocate state storage\n"); - goto error_out_cleanup; + return rc; } rc = sis_chip_init(sis); if (rc) - goto error_out_cleanup; + return rc; + card->private_free = sis_chip_free; rc = request_irq(pci->irq, sis_interrupt, IRQF_SHARED, KBUILD_MODNAME, sis); if (rc) { dev_err(&pci->dev, "unable to allocate irq %d\n", sis->irq); - goto error_out_cleanup; + return rc; } sis->irq = pci->irq; @@ -1349,20 +1328,7 @@ static int sis_chip_create(struct snd_card *card, voice->num = SIS_CAPTURE_CHAN_AC97_PCM_IN; voice->ctrl_base = SIS_CAPTURE_DMA_ADDR(sis->ioaddr, voice->num); - rc = snd_device_new(card, SNDRV_DEV_LOWLEVEL, sis, &ops); - if (rc) - goto error_out_cleanup; - return 0; - -error_out_cleanup: - sis_chip_free(sis); - -error_out_enabled: - pci_disable_device(pci); - -error_out: - return rc; } static int snd_sis7019_probe(struct pci_dev *pci, @@ -1372,9 +1338,8 @@ static int snd_sis7019_probe(struct pci_dev *pci, struct sis7019 *sis; int rc; - rc = -ENOENT; if (!enable) - goto error_out; + return -ENOENT; /* The user can specify which codecs should be present so that we * can wait for them to show up if they are slow to recover from @@ -1390,23 +1355,23 @@ static int snd_sis7019_probe(struct pci_dev *pci, rc = snd_card_new(&pci->dev, index, id, THIS_MODULE, sizeof(*sis), &card); if (rc < 0) - goto error_out; + return rc; strcpy(card->driver, "SiS7019"); strcpy(card->shortname, "SiS7019"); rc = sis_chip_create(card, pci); if (rc) - goto card_error_out; + return rc; sis = card->private_data; rc = sis_mixer_create(sis); if (rc) - goto card_error_out; + return rc; rc = sis_pcm_create(sis); if (rc) - goto card_error_out; + return rc; snprintf(card->longname, sizeof(card->longname), "%s Audio Accelerator with %s at 0x%lx, irq %d", @@ -1415,28 +1380,16 @@ static int snd_sis7019_probe(struct pci_dev *pci, rc = snd_card_register(card); if (rc) - goto card_error_out; + return rc; pci_set_drvdata(pci, card); return 0; - -card_error_out: - snd_card_free(card); - -error_out: - return rc; -} - -static void snd_sis7019_remove(struct pci_dev *pci) -{ - snd_card_free(pci_get_drvdata(pci)); } static struct pci_driver sis7019_driver = { .name = KBUILD_MODNAME, .id_table = snd_sis7019_ids, .probe = snd_sis7019_probe, - .remove = snd_sis7019_remove, .driver = { .pm = SIS_PM_OPS, }, From patchwork Thu Jul 15 07:58:46 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379255 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5A390C07E96 for ; Thu, 15 Jul 2021 08:10:37 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id A942360200 for ; Thu, 15 Jul 2021 08:10:36 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org A942360200 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id 44A7916FE; Thu, 15 Jul 2021 10:09:45 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 44A7916FE DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626336635; bh=bNSQemfVC1DiX6Uq9y18hFJZpLstF4eX4rh3LBHuYdw=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=gOtchxUbzO0z9xs019Qs265PhVzMYu9Ao6i9prUiCxWVH2gD46rPj/Jq4DQ9wLTqP zhcM6uFhYW4xSbEbihIRZIdFlfgcnEH1BBSPyZ2crdTQr5puawqqWdVv00aZtiJNM/ I8CcLV59YaZPPhrlmlPxB+7Ervrop6c6hhzh8sAE= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id 51292F80609; Thu, 15 Jul 2021 10:00:44 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id 427C7F805F7; Thu, 15 Jul 2021 10:00:38 +0200 (CEST) Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 1D614F804E7 for ; Thu, 15 Jul 2021 10:00:03 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 1D614F804E7 Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="p/ytz8v7"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="vPYNFLBq" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out2.suse.de (Postfix) with ESMTP id D34211FDEA for ; Thu, 15 Jul 2021 08:00:02 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336002; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=7FdamqqrTOHT6NYW+ddkP/Za1baGYW44k+vEw1Su2q4=; b=p/ytz8v7qzUgqsxXtWAY2a0+csY5ORbZfn9FqNUPrk/tFjlK8ryP+V91QdagzlBYR10+DT 5bGhdU75Ezt225etuRRcpGBAOCaCLU3U4GLmrUj3HJSC0Hy/koi9oJz7CRvnNTkf66X6jC 5IIQwYEd8Eep4T9Gk9IbhCibl43jt6w= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336002; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=7FdamqqrTOHT6NYW+ddkP/Za1baGYW44k+vEw1Su2q4=; b=vPYNFLBqAoHqhjC/mWDMy7krU7CHzjsOsjWRgiNC9fsKfdBg7aVZZPiawP4JtM5NWXeHRA GX0sNmwoGKz8JxBQ== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id CC645A3B99; Thu, 15 Jul 2021 08:00:02 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 24/79] ALSA: sonicvibes: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:58:46 +0200 Message-Id: <20210715075941.23332-25-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in PCI sonicvibes driver with devres as a clean up. Each manual resource management is converted with the corresponding devres helper, and the card object release is managed now via card->private_free instead of a lowlevel snd_device. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- sound/pci/sonicvibes.c | 117 ++++++++++------------------------------- 1 file changed, 27 insertions(+), 90 deletions(-) diff --git a/sound/pci/sonicvibes.c b/sound/pci/sonicvibes.c index 03a48da897e3..c8c49881008f 100644 --- a/sound/pci/sonicvibes.c +++ b/sound/pci/sonicvibes.c @@ -1193,69 +1193,43 @@ static inline int snd_sonicvibes_create_gameport(struct sonicvibes *sonic) { ret static inline void snd_sonicvibes_free_gameport(struct sonicvibes *sonic) { } #endif -static int snd_sonicvibes_free(struct sonicvibes *sonic) +static void snd_sonicvibes_free(struct snd_card *card) { + struct sonicvibes *sonic = card->private_data; + snd_sonicvibes_free_gameport(sonic); pci_write_config_dword(sonic->pci, 0x40, sonic->dmaa_port); pci_write_config_dword(sonic->pci, 0x48, sonic->dmac_port); - if (sonic->irq >= 0) - free_irq(sonic->irq, sonic); - release_and_free_resource(sonic->res_dmaa); - release_and_free_resource(sonic->res_dmac); - pci_release_regions(sonic->pci); - pci_disable_device(sonic->pci); - kfree(sonic); - return 0; -} - -static int snd_sonicvibes_dev_free(struct snd_device *device) -{ - struct sonicvibes *sonic = device->device_data; - return snd_sonicvibes_free(sonic); } static int snd_sonicvibes_create(struct snd_card *card, struct pci_dev *pci, int reverb, - int mge, - struct sonicvibes **rsonic) + int mge) { - struct sonicvibes *sonic; + struct sonicvibes *sonic = card->private_data; unsigned int dmaa, dmac; int err; - static const struct snd_device_ops ops = { - .dev_free = snd_sonicvibes_dev_free, - }; - *rsonic = NULL; /* enable PCI device */ - err = pci_enable_device(pci); + err = pcim_enable_device(pci); if (err < 0) return err; /* check, if we can restrict PCI DMA transfers to 24 bits */ if (dma_set_mask_and_coherent(&pci->dev, DMA_BIT_MASK(24))) { dev_err(card->dev, "architecture does not support 24bit PCI busmaster DMA\n"); - pci_disable_device(pci); return -ENXIO; } - sonic = kzalloc(sizeof(*sonic), GFP_KERNEL); - if (sonic == NULL) { - pci_disable_device(pci); - return -ENOMEM; - } spin_lock_init(&sonic->reg_lock); sonic->card = card; sonic->pci = pci; sonic->irq = -1; err = pci_request_regions(pci, "S3 SonicVibes"); - if (err < 0) { - kfree(sonic); - pci_disable_device(pci); + if (err < 0) return err; - } sonic->sb_port = pci_resource_start(pci, 0); sonic->enh_port = pci_resource_start(pci, 1); @@ -1263,14 +1237,14 @@ static int snd_sonicvibes_create(struct snd_card *card, sonic->midi_port = pci_resource_start(pci, 3); sonic->game_port = pci_resource_start(pci, 4); - if (request_irq(pci->irq, snd_sonicvibes_interrupt, IRQF_SHARED, - KBUILD_MODNAME, sonic)) { + if (devm_request_irq(&pci->dev, pci->irq, snd_sonicvibes_interrupt, + IRQF_SHARED, KBUILD_MODNAME, sonic)) { dev_err(card->dev, "unable to grab IRQ %d\n", pci->irq); - snd_sonicvibes_free(sonic); return -EBUSY; } sonic->irq = pci->irq; card->sync_irq = sonic->irq; + card->private_free = snd_sonicvibes_free; pci_read_config_dword(pci, 0x40, &dmaa); pci_read_config_dword(pci, 0x48, &dmac); @@ -1294,17 +1268,17 @@ static int snd_sonicvibes_create(struct snd_card *card, pci_write_config_dword(pci, 0x40, dmaa); pci_write_config_dword(pci, 0x48, dmac); - sonic->res_dmaa = request_region(dmaa, 0x10, "S3 SonicVibes DDMA-A"); + sonic->res_dmaa = devm_request_region(&pci->dev, dmaa, 0x10, + "S3 SonicVibes DDMA-A"); if (!sonic->res_dmaa) { - snd_sonicvibes_free(sonic); dev_err(card->dev, "unable to grab DDMA-A port at 0x%x-0x%x\n", dmaa, dmaa + 0x10 - 1); return -EBUSY; } - sonic->res_dmac = request_region(dmac, 0x10, "S3 SonicVibes DDMA-C"); + sonic->res_dmac = devm_request_region(&pci->dev, dmac, 0x10, + "S3 SonicVibes DDMA-C"); if (!sonic->res_dmac) { - snd_sonicvibes_free(sonic); dev_err(card->dev, "unable to grab DDMA-C port at 0x%x-0x%x\n", dmac, dmac + 0x10 - 1); @@ -1365,15 +1339,7 @@ static int snd_sonicvibes_create(struct snd_card *card, #endif sonic->revision = snd_sonicvibes_in(sonic, SV_IREG_REVISION); - err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, sonic, &ops); - if (err < 0) { - snd_sonicvibes_free(sonic); - return err; - } - snd_sonicvibes_proc_init(sonic); - - *rsonic = sonic; return 0; } @@ -1429,7 +1395,7 @@ static int snd_sonic_probe(struct pci_dev *pci, struct sonicvibes *sonic; struct snd_rawmidi *midi_uart; struct snd_opl3 *opl3; - int idx, err; + int err; if (dev >= SNDRV_CARDS) return -ENODEV; @@ -1438,25 +1404,16 @@ static int snd_sonic_probe(struct pci_dev *pci, return -ENOENT; } - err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, - 0, &card); + err = snd_devm_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, + sizeof(*sonic), &card); if (err < 0) return err; - for (idx = 0; idx < 5; idx++) { - if (pci_resource_start(pci, idx) == 0 || - !(pci_resource_flags(pci, idx) & IORESOURCE_IO)) { - snd_card_free(card); - return -ENODEV; - } - } + sonic = card->private_data; err = snd_sonicvibes_create(card, pci, reverb[dev] ? 1 : 0, - mge[dev] ? 1 : 0, - &sonic); - if (err < 0) { - snd_card_free(card); + mge[dev] ? 1 : 0); + if (err < 0) return err; - } strcpy(card->driver, "SonicVibes"); strcpy(card->shortname, "S3 SonicVibes"); @@ -1467,65 +1424,45 @@ static int snd_sonic_probe(struct pci_dev *pci, sonic->irq); err = snd_sonicvibes_pcm(sonic, 0); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } err = snd_sonicvibes_mixer(sonic); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } err = snd_mpu401_uart_new(card, 0, MPU401_HW_SONICVIBES, sonic->midi_port, MPU401_INFO_INTEGRATED | MPU401_INFO_IRQ_HOOK, -1, &midi_uart); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } snd_sonicvibes_midi(sonic, midi_uart); err = snd_opl3_create(card, sonic->synth_port, sonic->synth_port + 2, OPL3_HW_OPL3_SV, 1, &opl3); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } err = snd_opl3_hwdep_new(opl3, 0, 1, NULL); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } err = snd_sonicvibes_create_gameport(sonic); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } err = snd_card_register(card); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } pci_set_drvdata(pci, card); dev++; return 0; } -static void snd_sonic_remove(struct pci_dev *pci) -{ - snd_card_free(pci_get_drvdata(pci)); -} - static struct pci_driver sonicvibes_driver = { .name = KBUILD_MODNAME, .id_table = snd_sonic_ids, .probe = snd_sonic_probe, - .remove = snd_sonic_remove, }; module_pci_driver(sonicvibes_driver); From patchwork Thu Jul 15 07:58:47 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379257 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id AF4F6C1B08C for ; Thu, 15 Jul 2021 08:10:56 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 3F59261362 for ; Thu, 15 Jul 2021 08:10:56 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 3F59261362 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id CB5691679; Thu, 15 Jul 2021 10:10:04 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz CB5691679 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626336654; bh=5et1G4U5VQiq8uSxirjA6SQ6lM16xKv9XtV4oKGy3xA=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=VeZ4dxkp3hC71hfZ1rPJWS2905O9D7SEkRhG6fGGkSkq66aO8K7F6U+63ztpODo7B sb9wawrBmn6H5OrOS5tvALdYfFxwqZ3UUcYCb33uloQM4ow40vbtgbEGRH/GwlVJZ/ O1HWRq40jejj6kwNCkg/vhpzXwJ+vJBs1kyl2SoM= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id 82F97F8060D; Thu, 15 Jul 2021 10:00:45 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id 424AAF805FB; Thu, 15 Jul 2021 10:00:39 +0200 (CEST) Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 77CC8F804EC for ; Thu, 15 Jul 2021 10:00:03 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 77CC8F804EC Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="pDtdP6+W"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="xbiTHkll" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out2.suse.de (Postfix) with ESMTP id 49C501FD3E for ; Thu, 15 Jul 2021 08:00:03 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336003; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Orxy31kK7r+yOKVdimS37pbLcKbFIyH3/lUshfAR9w8=; b=pDtdP6+W4f9aKecOU1U3Os2t5mEoG9SqgH9pL5+K+yP8cTlXV8mtM7j2nN6Amd7ke/jPXU PmUquKyBibJW6MQy4Bmr9Lcs8U0evdgpVq0twtTuXaspEB/3I7reDIYwivZQz5DbJl7Phz 4XqqRV51Jz61N9puSnu/dvyBalQ1Y4U= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336003; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Orxy31kK7r+yOKVdimS37pbLcKbFIyH3/lUshfAR9w8=; b=xbiTHklltf5W1fkfWKX+jRV939a/L7aMoPakGyZyV/mZGOpDvylihRAj+nTyXzgtuIhadq 528Yw/g3zlxicyCQ== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id 35698A3B8D; Thu, 15 Jul 2021 08:00:03 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 25/79] ALSA: via82xx: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:58:47 +0200 Message-Id: <20210715075941.23332-26-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in PCI via82xx drivers with devres as a clean up. Each manual resource management is converted with the corresponding devres helper, and the card object release is managed now via card->private_free instead of a lowlevel snd_device. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- sound/pci/via82xx.c | 116 ++++++++++---------------------------- sound/pci/via82xx_modem.c | 88 +++++++---------------------- 2 files changed, 49 insertions(+), 155 deletions(-) diff --git a/sound/pci/via82xx.c b/sound/pci/via82xx.c index 943813a06abc..65514f7e42d7 100644 --- a/sound/pci/via82xx.c +++ b/sound/pci/via82xx.c @@ -1911,13 +1911,12 @@ static int snd_via82xx_mixer_new(struct via82xx *chip, const char *quirk_overrid static int snd_via686_create_gameport(struct via82xx *chip, unsigned char *legacy) { struct gameport *gp; - struct resource *r; if (!joystick) return -ENODEV; - r = request_region(JOYSTICK_ADDR, 8, "VIA686 gameport"); - if (!r) { + if (!devm_request_region(chip->card->dev, JOYSTICK_ADDR, 8, + "VIA686 gameport")) { dev_warn(chip->card->dev, "cannot reserve joystick port %#x\n", JOYSTICK_ADDR); return -EBUSY; @@ -1927,7 +1926,6 @@ static int snd_via686_create_gameport(struct via82xx *chip, unsigned char *legac if (!gp) { dev_err(chip->card->dev, "cannot allocate memory for gameport\n"); - release_and_free_resource(r); return -ENOMEM; } @@ -1935,7 +1933,6 @@ static int snd_via686_create_gameport(struct via82xx *chip, unsigned char *legac gameport_set_phys(gp, "pci%s/gameport0", pci_name(chip->pci)); gameport_set_dev_parent(gp, &chip->pci->dev); gp->io = JOYSTICK_ADDR; - gameport_set_port_data(gp, r); /* Enable legacy joystick port */ *legacy |= VIA_FUNC_ENABLE_GAME; @@ -1949,11 +1946,8 @@ static int snd_via686_create_gameport(struct via82xx *chip, unsigned char *legac static void snd_via686_free_gameport(struct via82xx *chip) { if (chip->gameport) { - struct resource *r = gameport_get_port_data(chip->gameport); - gameport_unregister_port(chip->gameport); chip->gameport = NULL; - release_and_free_resource(r); } } #else @@ -2063,7 +2057,8 @@ static int snd_via686_init_misc(struct via82xx *chip) } } if (mpu_port >= 0x200) - chip->mpu_res = request_region(mpu_port, 2, "VIA82xx MPU401"); + chip->mpu_res = devm_request_region(&chip->pci->dev, mpu_port, + 2, "VIA82xx MPU401"); if (chip->mpu_res) { if (rev_h) legacy |= VIA_FUNC_MIDI_PNP; /* enable PCI I/O 2 */ @@ -2302,61 +2297,35 @@ static SIMPLE_DEV_PM_OPS(snd_via82xx_pm, snd_via82xx_suspend, snd_via82xx_resume #define SND_VIA82XX_PM_OPS NULL #endif /* CONFIG_PM_SLEEP */ -static int snd_via82xx_free(struct via82xx *chip) +static void snd_via82xx_free(struct snd_card *card) { + struct via82xx *chip = card->private_data; unsigned int i; - if (chip->irq < 0) - goto __end_hw; /* disable interrupts */ for (i = 0; i < chip->num_devs; i++) snd_via82xx_channel_reset(chip, &chip->devs[i]); - if (chip->irq >= 0) - free_irq(chip->irq, chip); - __end_hw: - release_and_free_resource(chip->mpu_res); - pci_release_regions(chip->pci); - if (chip->chip_type == TYPE_VIA686) { snd_via686_free_gameport(chip); pci_write_config_byte(chip->pci, VIA_FUNC_ENABLE, chip->old_legacy); pci_write_config_byte(chip->pci, VIA_PNP_CONTROL, chip->old_legacy_cfg); } - pci_disable_device(chip->pci); - kfree(chip); - return 0; -} - -static int snd_via82xx_dev_free(struct snd_device *device) -{ - struct via82xx *chip = device->device_data; - return snd_via82xx_free(chip); } static int snd_via82xx_create(struct snd_card *card, struct pci_dev *pci, int chip_type, int revision, - unsigned int ac97_clock, - struct via82xx **r_via) + unsigned int ac97_clock) { - struct via82xx *chip; + struct via82xx *chip = card->private_data; int err; - static const struct snd_device_ops ops = { - .dev_free = snd_via82xx_dev_free, - }; - err = pci_enable_device(pci); + err = pcim_enable_device(pci); if (err < 0) return err; - chip = kzalloc(sizeof(*chip), GFP_KERNEL); - if (!chip) { - pci_disable_device(pci); - return -ENOMEM; - } - chip->chip_type = chip_type; chip->revision = revision; @@ -2373,44 +2342,31 @@ static int snd_via82xx_create(struct snd_card *card, chip->old_legacy & ~(VIA_FUNC_ENABLE_SB|VIA_FUNC_ENABLE_FM)); err = pci_request_regions(pci, card->driver); - if (err < 0) { - kfree(chip); - pci_disable_device(pci); + if (err < 0) return err; - } chip->port = pci_resource_start(pci, 0); - if (request_irq(pci->irq, - chip_type == TYPE_VIA8233 ? - snd_via8233_interrupt : snd_via686_interrupt, - IRQF_SHARED, - KBUILD_MODNAME, chip)) { + if (devm_request_irq(&pci->dev, pci->irq, + chip_type == TYPE_VIA8233 ? + snd_via8233_interrupt : snd_via686_interrupt, + IRQF_SHARED, + KBUILD_MODNAME, chip)) { dev_err(card->dev, "unable to grab IRQ %d\n", pci->irq); - snd_via82xx_free(chip); return -EBUSY; } chip->irq = pci->irq; card->sync_irq = chip->irq; + card->private_free = snd_via82xx_free; if (ac97_clock >= 8000 && ac97_clock <= 48000) chip->ac97_clock = ac97_clock; err = snd_via82xx_chip_init(chip); - if (err < 0) { - snd_via82xx_free(chip); - return err; - } - - err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops); - if (err < 0) { - snd_via82xx_free(chip); + if (err < 0) return err; - } /* The 8233 ac97 controller does not implement the master bit * in the pci command register. IMHO this is a violation of the PCI spec. * We call pci_set_master here because it does not hurt. */ pci_set_master(pci); - - *r_via = chip; return 0; } @@ -2511,9 +2467,11 @@ static int snd_via82xx_probe(struct pci_dev *pci, unsigned int i; int err; - err = snd_card_new(&pci->dev, index, id, THIS_MODULE, 0, &card); + err = snd_devm_card_new(&pci->dev, index, id, THIS_MODULE, + sizeof(*chip), &card); if (err < 0) return err; + chip = card->private_data; card_type = pci_id->driver_data; switch (card_type) { @@ -2552,36 +2510,34 @@ static int snd_via82xx_probe(struct pci_dev *pci, break; default: dev_err(card->dev, "invalid card type %d\n", card_type); - err = -EINVAL; - goto __error; + return -EINVAL; } err = snd_via82xx_create(card, pci, chip_type, pci->revision, - ac97_clock, &chip); + ac97_clock); if (err < 0) - goto __error; - card->private_data = chip; + return err; err = snd_via82xx_mixer_new(chip, ac97_quirk); if (err < 0) - goto __error; + return err; if (chip_type == TYPE_VIA686) { err = snd_via686_pcm_new(chip); if (err < 0) - goto __error; + return err; err = snd_via686_init_misc(chip); if (err < 0) - goto __error; + return err; } else { if (chip_type == TYPE_VIA8233A) { err = snd_via8233a_pcm_new(chip); if (err < 0) - goto __error; + return err; // chip->dxs_fixed = 1; /* FIXME: use 48k for DXS #3? */ } else { err = snd_via8233_pcm_new(chip); if (err < 0) - goto __error; + return err; if (dxs_support == VIA_DXS_48K) chip->dxs_fixed = 1; else if (dxs_support == VIA_DXS_NO_VRA) @@ -2593,7 +2549,7 @@ static int snd_via82xx_probe(struct pci_dev *pci, } err = snd_via8233_init_misc(chip); if (err < 0) - goto __error; + return err; } /* disable interrupts */ @@ -2607,28 +2563,16 @@ static int snd_via82xx_probe(struct pci_dev *pci, snd_via82xx_proc_init(chip); err = snd_card_register(card); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } pci_set_drvdata(pci, card); return 0; - - __error: - snd_card_free(card); - return err; -} - -static void snd_via82xx_remove(struct pci_dev *pci) -{ - snd_card_free(pci_get_drvdata(pci)); } static struct pci_driver via82xx_driver = { .name = KBUILD_MODNAME, .id_table = snd_via82xx_ids, .probe = snd_via82xx_probe, - .remove = snd_via82xx_remove, .driver = { .pm = SND_VIA82XX_PM_OPS, }, diff --git a/sound/pci/via82xx_modem.c b/sound/pci/via82xx_modem.c index 07278a3dc8c1..234f7fbed236 100644 --- a/sound/pci/via82xx_modem.c +++ b/sound/pci/via82xx_modem.c @@ -1048,95 +1048,57 @@ static SIMPLE_DEV_PM_OPS(snd_via82xx_pm, snd_via82xx_suspend, snd_via82xx_resume #define SND_VIA82XX_PM_OPS NULL #endif /* CONFIG_PM_SLEEP */ -static int snd_via82xx_free(struct via82xx_modem *chip) +static void snd_via82xx_free(struct snd_card *card) { + struct via82xx_modem *chip = card->private_data; unsigned int i; - if (chip->irq < 0) - goto __end_hw; /* disable interrupts */ for (i = 0; i < chip->num_devs; i++) snd_via82xx_channel_reset(chip, &chip->devs[i]); - - __end_hw: - if (chip->irq >= 0) - free_irq(chip->irq, chip); - pci_release_regions(chip->pci); - pci_disable_device(chip->pci); - kfree(chip); - return 0; -} - -static int snd_via82xx_dev_free(struct snd_device *device) -{ - struct via82xx_modem *chip = device->device_data; - return snd_via82xx_free(chip); } static int snd_via82xx_create(struct snd_card *card, struct pci_dev *pci, int chip_type, int revision, - unsigned int ac97_clock, - struct via82xx_modem **r_via) + unsigned int ac97_clock) { - struct via82xx_modem *chip; + struct via82xx_modem *chip = card->private_data; int err; - static const struct snd_device_ops ops = { - .dev_free = snd_via82xx_dev_free, - }; - err = pci_enable_device(pci); + err = pcim_enable_device(pci); if (err < 0) return err; - chip = kzalloc(sizeof(*chip), GFP_KERNEL); - if (!chip) { - pci_disable_device(pci); - return -ENOMEM; - } - spin_lock_init(&chip->reg_lock); chip->card = card; chip->pci = pci; chip->irq = -1; err = pci_request_regions(pci, card->driver); - if (err < 0) { - kfree(chip); - pci_disable_device(pci); + if (err < 0) return err; - } chip->port = pci_resource_start(pci, 0); - if (request_irq(pci->irq, snd_via82xx_interrupt, IRQF_SHARED, - KBUILD_MODNAME, chip)) { + if (devm_request_irq(&pci->dev, pci->irq, snd_via82xx_interrupt, + IRQF_SHARED, KBUILD_MODNAME, chip)) { dev_err(card->dev, "unable to grab IRQ %d\n", pci->irq); - snd_via82xx_free(chip); return -EBUSY; } chip->irq = pci->irq; card->sync_irq = chip->irq; + card->private_free = snd_via82xx_free; if (ac97_clock >= 8000 && ac97_clock <= 48000) chip->ac97_clock = ac97_clock; err = snd_via82xx_chip_init(chip); - if (err < 0) { - snd_via82xx_free(chip); - return err; - } - - err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops); - if (err < 0) { - snd_via82xx_free(chip); + if (err < 0) return err; - } /* The 8233 ac97 controller does not implement the master bit * in the pci command register. IMHO this is a violation of the PCI spec. * We call pci_set_master here because it does not hurt. */ pci_set_master(pci); - - *r_via = chip; return 0; } @@ -1150,9 +1112,11 @@ static int snd_via82xx_probe(struct pci_dev *pci, unsigned int i; int err; - err = snd_card_new(&pci->dev, index, id, THIS_MODULE, 0, &card); + err = snd_devm_card_new(&pci->dev, index, id, THIS_MODULE, + sizeof(*chip), &card); if (err < 0) return err; + chip = card->private_data; card_type = pci_id->driver_data; switch (card_type) { @@ -1162,22 +1126,20 @@ static int snd_via82xx_probe(struct pci_dev *pci, break; default: dev_err(card->dev, "invalid card type %d\n", card_type); - err = -EINVAL; - goto __error; + return -EINVAL; } err = snd_via82xx_create(card, pci, chip_type, pci->revision, - ac97_clock, &chip); + ac97_clock); if (err < 0) - goto __error; - card->private_data = chip; + return err; err = snd_via82xx_mixer_new(chip); if (err < 0) - goto __error; + return err; err = snd_via686_pcm_new(chip); if (err < 0) - goto __error; + return err; /* disable interrupts */ for (i = 0; i < chip->num_devs; i++) @@ -1189,28 +1151,16 @@ static int snd_via82xx_probe(struct pci_dev *pci, snd_via82xx_proc_init(chip); err = snd_card_register(card); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } pci_set_drvdata(pci, card); return 0; - - __error: - snd_card_free(card); - return err; -} - -static void snd_via82xx_remove(struct pci_dev *pci) -{ - snd_card_free(pci_get_drvdata(pci)); } static struct pci_driver via82xx_modem_driver = { .name = KBUILD_MODNAME, .id_table = snd_via82xx_modem_ids, .probe = snd_via82xx_probe, - .remove = snd_via82xx_remove, .driver = { .pm = SND_VIA82XX_PM_OPS, }, From patchwork Thu Jul 15 07:58:48 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379259 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 60430C07E96 for ; Thu, 15 Jul 2021 08:11:18 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id E0D30610D1 for ; Thu, 15 Jul 2021 08:11:17 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org E0D30610D1 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id 7024616EA; Thu, 15 Jul 2021 10:10:26 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 7024616EA DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626336676; bh=NcrN6L4WZTUj1jg6eN92u1KO9xlQjaJzRLodgbjRVqY=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=bVfdDUmX1TLfnd/DsBFnbEJekAQvlGWAbKUeCULUE5h3RJhPkHz0BfsZ+PxSttaBL RuE7e1pl4JJ8+3H0a4MkE/0gg+kBNTElCLdEC7Nt2sJs4LsLGyNcZkEGMF1ROZLRpW J+DkVK76ONNY6D5ukAbqPDZn/Cgi7sXWmKjwDdcg= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id F311FF80613; Thu, 15 Jul 2021 10:00:46 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id A9BABF804F3; Thu, 15 Jul 2021 10:00:39 +0200 (CEST) Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id CBAA6F804F3 for ; Thu, 15 Jul 2021 10:00:03 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz CBAA6F804F3 Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="HkwGEo0D"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="lNe71KBU" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out1.suse.de (Postfix) with ESMTP id A39AD2284F for ; Thu, 15 Jul 2021 08:00:03 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336003; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=8nus57fjny4yCUjw8vUksNK+8q7u3TAt5nxvdIRA/wE=; b=HkwGEo0DNkjfWoI5yqxRFdcG8u2FapvfCwkLVIo7a0DtNyPHavDFRYGYOUCe7hA921y7AD Q1qeTPWBMJjYZC2wvuxTyGUWls/0KHY/8V1DW+TUAVIH9k/+LumvmpNt5WkYwKLZdWWJiD uGCfMfgbIhNN2HmFO5RonG3tAVajTak= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336003; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=8nus57fjny4yCUjw8vUksNK+8q7u3TAt5nxvdIRA/wE=; b=lNe71KBUMDUG0UNloT5rvbF1BLk/BluonD8iFPmrxt2R1GmfF+fi2HyTXMM8St4pqTMi8S 2K4fOy7S6WJcy8CQ== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id 914C4A3B8D; Thu, 15 Jul 2021 08:00:03 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 26/79] ALSA: ali5451: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:58:48 +0200 Message-Id: <20210715075941.23332-27-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in PCI ali5451 driver with devres as a clean up. Each manual resource management is converted with the corresponding devres helper, and the card object release is managed now via card->private_free instead of a lowlevel snd_device. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- sound/pci/ali5451/ali5451.c | 88 +++++++++---------------------------- 1 file changed, 20 insertions(+), 68 deletions(-) diff --git a/sound/pci/ali5451/ali5451.c b/sound/pci/ali5451/ali5451.c index 0d66b92466d5..ccbf9e2c72d6 100644 --- a/sound/pci/ali5451/ali5451.c +++ b/sound/pci/ali5451/ali5451.c @@ -1914,22 +1914,14 @@ static SIMPLE_DEV_PM_OPS(ali_pm, ali_suspend, ali_resume); #define ALI_PM_OPS NULL #endif /* CONFIG_PM_SLEEP */ -static int snd_ali_free(struct snd_ali * codec) +static void snd_ali_free(struct snd_card *card) { + struct snd_ali *codec = card->private_data; + if (codec->hw_initialized) snd_ali_disable_address_interrupt(codec); - if (codec->irq >= 0) - free_irq(codec->irq, codec); - if (codec->port) - pci_release_regions(codec->pci); - pci_disable_device(codec->pci); -#ifdef CONFIG_PM_SLEEP - kfree(codec->image); -#endif pci_dev_put(codec->pci_m1533); pci_dev_put(codec->pci_m7101); - kfree(codec); - return 0; } static int snd_ali_chip_init(struct snd_ali *codec) @@ -2017,8 +2009,9 @@ static int snd_ali_resources(struct snd_ali *codec) return err; codec->port = pci_resource_start(codec->pci, 0); - if (request_irq(codec->pci->irq, snd_ali_card_interrupt, - IRQF_SHARED, KBUILD_MODNAME, codec)) { + if (devm_request_irq(&codec->pci->dev, codec->pci->irq, + snd_ali_card_interrupt, + IRQF_SHARED, KBUILD_MODNAME, codec)) { dev_err(codec->card->dev, "Unable to request irq.\n"); return -EBUSY; } @@ -2027,48 +2020,29 @@ static int snd_ali_resources(struct snd_ali *codec) dev_dbg(codec->card->dev, "resources allocated.\n"); return 0; } -static int snd_ali_dev_free(struct snd_device *device) -{ - struct snd_ali *codec = device->device_data; - snd_ali_free(codec); - return 0; -} static int snd_ali_create(struct snd_card *card, struct pci_dev *pci, int pcm_streams, - int spdif_support, - struct snd_ali **r_ali) + int spdif_support) { struct snd_ali *codec; int i, err; unsigned short cmdw; - static const struct snd_device_ops ops = { - .dev_free = snd_ali_dev_free, - }; - - *r_ali = NULL; dev_dbg(card->dev, "creating ...\n"); /* enable PCI device */ - err = pci_enable_device(pci); + err = pcim_enable_device(pci); if (err < 0) return err; /* check, if we can restrict PCI DMA transfers to 31 bits */ if (dma_set_mask_and_coherent(&pci->dev, DMA_BIT_MASK(31))) { dev_err(card->dev, "architecture does not support 31bit PCI busmaster DMA\n"); - pci_disable_device(pci); return -ENXIO; } - codec = kzalloc(sizeof(*codec), GFP_KERNEL); - if (!codec) { - pci_disable_device(pci); - return -ENOMEM; - } - spin_lock_init(&codec->reg_lock); spin_lock_init(&codec->voice_alloc); @@ -2089,12 +2063,10 @@ static int snd_ali_create(struct snd_card *card, cmdw |= PCI_COMMAND_IO; pci_write_config_word(pci, PCI_COMMAND, cmdw); } - pci_set_master(pci); - if (snd_ali_resources(codec)) { - snd_ali_free(codec); + if (snd_ali_resources(codec)) return -EBUSY; - } + card->private_free = snd_ali_free; codec->synth.chmap = 0; codec->synth.chcnt = 0; @@ -2121,24 +2093,15 @@ static int snd_ali_create(struct snd_card *card, codec->pci_m1533 = pci_get_device(0x10b9, 0x1533, NULL); if (!codec->pci_m1533) { dev_err(card->dev, "cannot find ALi 1533 chip.\n"); - snd_ali_free(codec); return -ENODEV; } /* M7101: power management */ codec->pci_m7101 = pci_get_device(0x10b9, 0x7101, NULL); if (!codec->pci_m7101 && codec->revision == ALI_5451_V02) { dev_err(card->dev, "cannot find ALi 7101 chip.\n"); - snd_ali_free(codec); return -ENODEV; } - dev_dbg(card->dev, "snd_device_new is called.\n"); - err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, codec, &ops); - if (err < 0) { - snd_ali_free(codec); - return err; - } - /* initialise synth voices*/ for (i = 0; i < ALI_CHANNELS; i++) codec->synth.voices[i].number = i; @@ -2150,16 +2113,14 @@ static int snd_ali_create(struct snd_card *card, } #ifdef CONFIG_PM_SLEEP - codec->image = kmalloc(sizeof(*codec->image), GFP_KERNEL); + codec->image = devm_kmalloc(&pci->dev, sizeof(*codec->image), + GFP_KERNEL); if (!codec->image) dev_warn(card->dev, "can't allocate apm buffer\n"); #endif snd_ali_enable_address_interrupt(codec); codec->hw_initialized = 1; - - *r_ali = codec; - dev_dbg(card->dev, "created.\n"); return 0; } @@ -2172,24 +2133,25 @@ static int snd_ali_probe(struct pci_dev *pci, dev_dbg(&pci->dev, "probe ...\n"); - err = snd_card_new(&pci->dev, index, id, THIS_MODULE, 0, &card); + err = snd_devm_card_new(&pci->dev, index, id, THIS_MODULE, + sizeof(*codec), &card); if (err < 0) return err; + codec = card->private_data; - err = snd_ali_create(card, pci, pcm_channels, spdif, &codec); + err = snd_ali_create(card, pci, pcm_channels, spdif); if (err < 0) - goto error; - card->private_data = codec; + return err; dev_dbg(&pci->dev, "mixer building ...\n"); err = snd_ali_mixer(codec); if (err < 0) - goto error; + return err; dev_dbg(&pci->dev, "pcm building ...\n"); err = snd_ali_build_pcms(codec); if (err < 0) - goto error; + return err; snd_ali_proc_init(codec); @@ -2202,26 +2164,16 @@ static int snd_ali_probe(struct pci_dev *pci, dev_dbg(&pci->dev, "register card.\n"); err = snd_card_register(card); if (err < 0) - goto error; + return err; pci_set_drvdata(pci, card); return 0; - - error: - snd_card_free(card); - return err; -} - -static void snd_ali_remove(struct pci_dev *pci) -{ - snd_card_free(pci_get_drvdata(pci)); } static struct pci_driver ali5451_driver = { .name = KBUILD_MODNAME, .id_table = snd_ali_ids, .probe = snd_ali_probe, - .remove = snd_ali_remove, .driver = { .pm = ALI_PM_OPS, }, From patchwork Thu Jul 15 07:58:49 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379263 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 18FCFC07E96 for ; Thu, 15 Jul 2021 08:12:09 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 9AF2A610D1 for ; Thu, 15 Jul 2021 08:12:08 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 9AF2A610D1 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id 2D1BC1715; Thu, 15 Jul 2021 10:11:17 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 2D1BC1715 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626336727; bh=kkFw+cG+OvXBXoonKwLOysgYvtzZDiCs0oiGkjoNbXQ=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=I58hSVL8cSZi0MZQsbbX/OxN2S0jOLpZHMWzWN54VPQManvO1hTjMrVZussllsJxy /AlxVweImvAA4De15JV0EzoiD6PftbPKUBmA+kCxyFltD799rGZ8amIFHyk48GZSg+ zzccAy2pBIqC99GPfJ5Y9LEpZfqk9K+/+dUNHkKE= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id 500A6F80507; Thu, 15 Jul 2021 10:00:49 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id D13F2F805FC; Thu, 15 Jul 2021 10:00:40 +0200 (CEST) Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 34E46F804FA for ; Thu, 15 Jul 2021 10:00:04 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 34E46F804FA Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="iR94wLR7"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="CSRnuVSf" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out1.suse.de (Postfix) with ESMTP id 0E7EE22852 for ; Thu, 15 Jul 2021 08:00:04 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336004; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=3mr/zNFJMS6D20lvwn61DOLlz7DX+1O7pzWKGYewfM8=; b=iR94wLR7y9hwV933SYZfonu54XE1skNTUKWydbzuksEqalRElygwJRD3CnWYfoyLy53Rcz 08EDTw/5tmleqLkKas+fxiRUB1kwq1gRb4YZdvEthRuBdZKVl1CgkgjiKJYJeuWT924i9y 6zmJj3YzsutcKP574u59KzvwNVVoRLs= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336004; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=3mr/zNFJMS6D20lvwn61DOLlz7DX+1O7pzWKGYewfM8=; b=CSRnuVSfjonociupxAAfqsKU8fvFluSovmokBxReU0aog43DMBRsQeUitgWJyJklBYEHx8 f8/H9kG8LiDGglCg== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id F0D93A3B8D; Thu, 15 Jul 2021 08:00:03 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 27/79] ALSA: au88x0: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:58:49 +0200 Message-Id: <20210715075941.23332-28-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in PCI au88x0 driver with devres as a clean up. Each manual resource management is converted with the corresponding devres helper, and the card object release is managed now via card->private_free instead of a lowlevel snd_device. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- sound/pci/au88x0/au88x0.c | 134 +++++++++----------------------------- 1 file changed, 29 insertions(+), 105 deletions(-) diff --git a/sound/pci/au88x0/au88x0.c b/sound/pci/au88x0/au88x0.c index 1f7fee470266..342ef2a6655e 100644 --- a/sound/pci/au88x0/au88x0.c +++ b/sound/pci/au88x0/au88x0.c @@ -123,56 +123,35 @@ static void snd_vortex_workaround(struct pci_dev *vortex, int fix) // component-destructor // (see "Management of Cards and Components") -static int snd_vortex_dev_free(struct snd_device *device) +static void snd_vortex_free(struct snd_card *card) { - vortex_t *vortex = device->device_data; + vortex_t *vortex = card->private_data; vortex_gameport_unregister(vortex); vortex_core_shutdown(vortex); - // Take down PCI interface. - free_irq(vortex->irq, vortex); - iounmap(vortex->mmio); - pci_release_regions(vortex->pci_dev); - pci_disable_device(vortex->pci_dev); - kfree(vortex); - - return 0; } // chip-specific constructor // (see "Management of Cards and Components") static int -snd_vortex_create(struct snd_card *card, struct pci_dev *pci, vortex_t ** rchip) +snd_vortex_create(struct snd_card *card, struct pci_dev *pci) { - vortex_t *chip; + vortex_t *chip = card->private_data; int err; - static const struct snd_device_ops ops = { - .dev_free = snd_vortex_dev_free, - }; - - *rchip = NULL; // check PCI availability (DMA). - err = pci_enable_device(pci); + err = pcim_enable_device(pci); if (err < 0) return err; if (dma_set_mask_and_coherent(&pci->dev, DMA_BIT_MASK(32))) { dev_err(card->dev, "error to set DMA mask\n"); - pci_disable_device(pci); return -ENXIO; } - chip = kzalloc(sizeof(*chip), GFP_KERNEL); - if (chip == NULL) { - pci_disable_device(pci); - return -ENOMEM; - } - chip->card = card; // initialize the stuff chip->pci_dev = pci; - chip->io = pci_resource_start(pci, 0); chip->vendor = pci->vendor; chip->device = pci->device; chip->card = card; @@ -181,16 +160,12 @@ snd_vortex_create(struct snd_card *card, struct pci_dev *pci, vortex_t ** rchip) // (1) PCI resource allocation // Get MMIO area // - err = pci_request_regions(pci, CARD_NAME_SHORT); + err = pcim_iomap_regions(pci, 1 << 0, CARD_NAME_SHORT); if (err) - goto regions_out; + return err; - chip->mmio = pci_ioremap_bar(pci, 0); - if (!chip->mmio) { - dev_err(card->dev, "MMIO area remap failed.\n"); - err = -ENOMEM; - goto ioremap_out; - } + chip->io = pci_resource_start(pci, 0); + chip->mmio = pcim_iomap_table(pci)[0]; /* Init audio core. * This must be done before we do request_irq otherwise we can get spurious @@ -198,44 +173,22 @@ snd_vortex_create(struct snd_card *card, struct pci_dev *pci, vortex_t ** rchip) err = vortex_core_init(chip); if (err) { dev_err(card->dev, "hw core init failed\n"); - goto core_out; + return err; } - err = request_irq(pci->irq, vortex_interrupt, - IRQF_SHARED, KBUILD_MODNAME, chip); + err = devm_request_irq(&pci->dev, pci->irq, vortex_interrupt, + IRQF_SHARED, KBUILD_MODNAME, chip); if (err) { dev_err(card->dev, "cannot grab irq\n"); - goto irq_out; + return err; } chip->irq = pci->irq; card->sync_irq = chip->irq; + card->private_free = snd_vortex_free; pci_set_master(pci); // End of PCI setup. - - // Register alsa root device. - err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops); - if (err < 0) - goto alloc_out; - - *rchip = chip; - return 0; - - alloc_out: - free_irq(chip->irq, chip); - irq_out: - vortex_core_shutdown(chip); - core_out: - iounmap(chip->mmio); - ioremap_out: - pci_release_regions(chip->pci_dev); - regions_out: - pci_disable_device(chip->pci_dev); - //FIXME: this not the right place to unregister the gameport - vortex_gameport_unregister(chip); - kfree(chip); - return err; } // constructor -- see "Constructor" sub-section @@ -255,17 +208,16 @@ snd_vortex_probe(struct pci_dev *pci, const struct pci_device_id *pci_id) return -ENOENT; } // (2) - err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, - 0, &card); + err = snd_devm_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, + sizeof(*chip), &card); if (err < 0) return err; + chip = card->private_data; // (3) - err = snd_vortex_create(card, pci, &chip); - if (err < 0) { - snd_card_free(card); + err = snd_vortex_create(card, pci); + if (err < 0) return err; - } snd_vortex_workaround(pci, pcifix[dev]); // Card details needed in snd_vortex_midi @@ -276,50 +228,37 @@ snd_vortex_probe(struct pci_dev *pci, const struct pci_device_id *pci_id) // (4) Alloc components. err = snd_vortex_mixer(chip); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } // ADB pcm. err = snd_vortex_new_pcm(chip, VORTEX_PCM_ADB, NR_PCM); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } #ifndef CHIP_AU8820 // ADB SPDIF err = snd_vortex_new_pcm(chip, VORTEX_PCM_SPDIF, 1); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } // A3D err = snd_vortex_new_pcm(chip, VORTEX_PCM_A3D, NR_A3D); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } #endif /* // ADB I2S if ((err = snd_vortex_new_pcm(chip, VORTEX_PCM_I2S, 1)) < 0) { - snd_card_free(card); return err; } */ #ifndef CHIP_AU8810 // WT pcm. err = snd_vortex_new_pcm(chip, VORTEX_PCM_WT, NR_WT); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } #endif err = snd_vortex_midi(chip); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } vortex_gameport_register(chip); @@ -342,15 +281,11 @@ snd_vortex_probe(struct pci_dev *pci, const struct pci_device_id *pci_id) // (5) err = pci_read_config_word(pci, PCI_DEVICE_ID, &chip->device); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } err = pci_read_config_word(pci, PCI_VENDOR_ID, &chip->vendor); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } chip->rev = pci->revision; #ifdef CHIP_AU8830 if ((chip->rev) != 0xfe && (chip->rev) != 0xfa) { @@ -359,18 +294,14 @@ snd_vortex_probe(struct pci_dev *pci, const struct pci_device_id *pci_id) chip->rev); dev_alert(card->dev, "Please email the results of 'lspci -vv' to openvortex-dev@nongnu.org.\n"); - snd_card_free(card); - err = -ENODEV; - return err; + return -ENODEV; } #endif // (6) err = snd_card_register(card); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } // (7) pci_set_drvdata(pci, card); dev++; @@ -379,18 +310,11 @@ snd_vortex_probe(struct pci_dev *pci, const struct pci_device_id *pci_id) return 0; } -// destructor -- see "Destructor" sub-section -static void snd_vortex_remove(struct pci_dev *pci) -{ - snd_card_free(pci_get_drvdata(pci)); -} - // pci_driver definition static struct pci_driver vortex_driver = { .name = KBUILD_MODNAME, .id_table = snd_vortex_ids, .probe = snd_vortex_probe, - .remove = snd_vortex_remove, }; module_pci_driver(vortex_driver); From patchwork Thu Jul 15 07:58:50 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379261 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id CD584C07E96 for ; Thu, 15 Jul 2021 08:11:49 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 4F14461362 for ; Thu, 15 Jul 2021 08:11:49 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 4F14461362 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id CAB141711; Thu, 15 Jul 2021 10:10:57 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz CAB141711 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626336707; bh=fu11GM+ZB0D95X8OuNVx5SB/HWFmYfshIvHjM3NERmE=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=kddncPrsdZy7WB25i29DFPfRLdzaUm4zYSz8bPaEzNi0vlO9otiWIREz9IFomgfgg V4nZ2B45i5C0h/FASqIYcGkE2LUMhqFkH4r+UC0zmx2vedSioR4pZ/ccC5XS1o5e0b gqhQz3CGsp22w9Ldz0JOOFVj7hujaGtDLAEyo2+g= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id 3DDF5F8061C; Thu, 15 Jul 2021 10:00:48 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id B56E3F805F8; Thu, 15 Jul 2021 10:00:39 +0200 (CEST) Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 99A38F804FC for ; Thu, 15 Jul 2021 10:00:04 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 99A38F804FC Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="G2PU+ySN"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="+7y2ruHF" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out1.suse.de (Postfix) with ESMTP id 6DA6022854 for ; Thu, 15 Jul 2021 08:00:04 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336004; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=yHOkfojWelSINRHgCcja7PJLZL2yqm6jelxRU/Mdrd0=; b=G2PU+ySNoar+Ykonx2Rztf9nPlgGxXeQlmQAjJy+oSKSsevO9DpLsCbWLLCRRIURb0ZCLl qchaJ8eAyp/UZqussb84C8J/Hzt/MKq4IkigKu8lVkqbWjrxFUh9yOQljZmL1B8m/JdYRS TdZxh5diOrvfdLxKmSwduySofRZ8IMM= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336004; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=yHOkfojWelSINRHgCcja7PJLZL2yqm6jelxRU/Mdrd0=; b=+7y2ruHFF0cT21+gUxdU7TQfLi0zGdUOLDsceMjv88savUE3ZAgbUyaru9MpSpvejFGWwT W960ICYXTPcs3QDQ== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id 5CC4EA3B8D; Thu, 15 Jul 2021 08:00:04 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 28/79] ALSA: aw2: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:58:50 +0200 Message-Id: <20210715075941.23332-29-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in PCI aw2 driver with devres as a clean up. Each manual resource management is converted with the corresponding devres helper, and the card object release is managed now via card->private_free instead of a lowlevel snd_device. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- sound/pci/aw2/aw2-alsa.c | 102 +++++++-------------------------------- 1 file changed, 18 insertions(+), 84 deletions(-) diff --git a/sound/pci/aw2/aw2-alsa.c b/sound/pci/aw2/aw2-alsa.c index 43396849a01c..d56f126d6fdd 100644 --- a/sound/pci/aw2/aw2-alsa.c +++ b/sound/pci/aw2/aw2-alsa.c @@ -99,12 +99,9 @@ struct aw2 { /********************************* * FUNCTION DECLARATIONS ********************************/ -static int snd_aw2_dev_free(struct snd_device *device); -static int snd_aw2_create(struct snd_card *card, - struct pci_dev *pci, struct aw2 **rchip); +static int snd_aw2_create(struct snd_card *card, struct pci_dev *pci); static int snd_aw2_probe(struct pci_dev *pci, const struct pci_device_id *pci_id); -static void snd_aw2_remove(struct pci_dev *pci); static int snd_aw2_pcm_playback_open(struct snd_pcm_substream *substream); static int snd_aw2_pcm_playback_close(struct snd_pcm_substream *substream); static int snd_aw2_pcm_capture_open(struct snd_pcm_substream *substream); @@ -157,7 +154,6 @@ static struct pci_driver aw2_driver = { .name = KBUILD_MODNAME, .id_table = snd_aw2_ids, .probe = snd_aw2_probe, - .remove = snd_aw2_remove, }; module_pci_driver(aw2_driver); @@ -196,41 +192,23 @@ static const struct snd_kcontrol_new aw2_control = { ********************************/ /* component-destructor */ -static int snd_aw2_dev_free(struct snd_device *device) +static void snd_aw2_free(struct snd_card *card) { - struct aw2 *chip = device->device_data; + struct aw2 *chip = card->private_data; /* Free hardware */ snd_aw2_saa7146_free(&chip->saa7146); - - /* release the irq */ - if (chip->irq >= 0) - free_irq(chip->irq, (void *)chip); - /* release the i/o ports & memory */ - iounmap(chip->iobase_virt); - pci_release_regions(chip->pci); - /* disable the PCI entry */ - pci_disable_device(chip->pci); - /* release the data */ - kfree(chip); - - return 0; } /* chip-specific constructor */ static int snd_aw2_create(struct snd_card *card, - struct pci_dev *pci, struct aw2 **rchip) + struct pci_dev *pci) { - struct aw2 *chip; + struct aw2 *chip = card->private_data; int err; - static const struct snd_device_ops ops = { - .dev_free = snd_aw2_dev_free, - }; - - *rchip = NULL; /* initialize the PCI entry */ - err = pci_enable_device(pci); + err = pcim_enable_device(pci); if (err < 0) return err; pci_set_master(pci); @@ -238,14 +216,8 @@ static int snd_aw2_create(struct snd_card *card, /* check PCI availability (32bit DMA) */ if (dma_set_mask_and_coherent(&pci->dev, DMA_BIT_MASK(32))) { dev_err(card->dev, "Impossible to set 32bit mask DMA\n"); - pci_disable_device(pci); return -ENXIO; } - chip = kzalloc(sizeof(*chip), GFP_KERNEL); - if (chip == NULL) { - pci_disable_device(pci); - return -ENOMEM; - } /* initialize the stuff */ chip->card = card; @@ -253,52 +225,23 @@ static int snd_aw2_create(struct snd_card *card, chip->irq = -1; /* (1) PCI resource allocation */ - err = pci_request_regions(pci, "Audiowerk2"); - if (err < 0) { - pci_disable_device(pci); - kfree(chip); + err = pcim_iomap_regions(pci, 1 << 0, "Audiowerk2"); + if (err < 0) return err; - } chip->iobase_phys = pci_resource_start(pci, 0); - chip->iobase_virt = - ioremap(chip->iobase_phys, - pci_resource_len(pci, 0)); - - if (chip->iobase_virt == NULL) { - dev_err(card->dev, "unable to remap memory region"); - pci_release_regions(pci); - pci_disable_device(pci); - kfree(chip); - return -ENOMEM; - } + chip->iobase_virt = pcim_iomap_table(pci)[0]; /* (2) initialization of the chip hardware */ snd_aw2_saa7146_setup(&chip->saa7146, chip->iobase_virt); - if (request_irq(pci->irq, snd_aw2_saa7146_interrupt, - IRQF_SHARED, KBUILD_MODNAME, chip)) { + if (devm_request_irq(&pci->dev, pci->irq, snd_aw2_saa7146_interrupt, + IRQF_SHARED, KBUILD_MODNAME, chip)) { dev_err(card->dev, "Cannot grab irq %d\n", pci->irq); - - iounmap(chip->iobase_virt); - pci_release_regions(chip->pci); - pci_disable_device(chip->pci); - kfree(chip); return -EBUSY; } chip->irq = pci->irq; card->sync_irq = chip->irq; - - err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops); - if (err < 0) { - free_irq(chip->irq, (void *)chip); - iounmap(chip->iobase_virt); - pci_release_regions(chip->pci); - pci_disable_device(chip->pci); - kfree(chip); - return err; - } - - *rchip = chip; + card->private_free = snd_aw2_free; dev_info(card->dev, "Audiowerk 2 sound card (saa7146 chipset) detected and managed\n"); @@ -323,17 +266,16 @@ static int snd_aw2_probe(struct pci_dev *pci, } /* (2) Create card instance */ - err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, - 0, &card); + err = snd_devm_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, + sizeof(*chip), &card); if (err < 0) return err; + chip = card->private_data; /* (3) Create main component */ - err = snd_aw2_create(card, pci, &chip); - if (err < 0) { - snd_card_free(card); + err = snd_aw2_create(card, pci); + if (err < 0) return err; - } /* initialize mutex */ mutex_init(&chip->mtx); @@ -351,10 +293,8 @@ static int snd_aw2_probe(struct pci_dev *pci, /* (6) Register card instance */ err = snd_card_register(card); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } /* (7) Set PCI driver data */ pci_set_drvdata(pci, card); @@ -363,12 +303,6 @@ static int snd_aw2_probe(struct pci_dev *pci, return 0; } -/* destructor */ -static void snd_aw2_remove(struct pci_dev *pci) -{ - snd_card_free(pci_get_drvdata(pci)); -} - /* open callback */ static int snd_aw2_pcm_playback_open(struct snd_pcm_substream *substream) { From patchwork Thu Jul 15 07:58:51 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379265 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1887CC07E96 for ; Thu, 15 Jul 2021 08:12:30 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 99CE561106 for ; Thu, 15 Jul 2021 08:12:29 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 99CE561106 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id 35C8E171C; Thu, 15 Jul 2021 10:11:38 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 35C8E171C DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626336748; bh=MM8nAbkRXnqXeWcb/DQsJlSaUL9thQCCxkxM8LTIGkY=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=itgs/3J9i5sgnGmZA6XNGsl/NzlCAnmKn3bMLIr2FJGbWJWKpESJ/kNQdxSmJHPGu BTX8YC2jTtb1bbKZOHd2VCnYx72It9/cdXiIEFKccLshfFlTjMasUaf5VL8voDTMJf GOcdwkMCbkUCWZx+tqNxbaVdYfGwE2CxICyrASLw= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id 3046CF80620; Thu, 15 Jul 2021 10:00:51 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id E3342F8061C; Thu, 15 Jul 2021 10:00:47 +0200 (CEST) Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 15702F804FF for ; Thu, 15 Jul 2021 10:00:04 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 15702F804FF Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="mZ00ZDNH"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="Ftvbz7uB" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out2.suse.de (Postfix) with ESMTP id CD8D41FDF4 for ; Thu, 15 Jul 2021 08:00:04 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336004; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=0+VjR1w11Q3F9wCC/be1IS6Bth9NT0VM8G6Mbvn1q2U=; b=mZ00ZDNHWGk0inNsfeByZ04sytLWHwjnLd2gep3eMPjM7EE7Sa4a5+Af2TJXNsdTDE9y/G p+AkBMjO9/KdxrMsuSFx6kOViMOhqtd9ojtEQ+RGIItCabIwJvzdW4fKfdN7Lpp8bM1j/Z eJSqmE1sB1e2dahO1WX4/yrCTCOy8P8= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336004; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=0+VjR1w11Q3F9wCC/be1IS6Bth9NT0VM8G6Mbvn1q2U=; b=Ftvbz7uB5rgGFDyd4efuzIHdyXgsD3Guw16Eg4e2k7A01DG6xL+3Cfg5MCyYmjIP0Y1l8p f1a/YEj9XNC3ScCA== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id BC2D8A3BA7; Thu, 15 Jul 2021 08:00:04 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 29/79] ALSA: ca0106: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:58:51 +0200 Message-Id: <20210715075941.23332-30-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in PCI ca0106 driver with devres as a clean up. Each manual resource management is converted with the corresponding devres helper, and the card object release is managed now via card->private_free instead of a lowlevel snd_device. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- sound/pci/ca0106/ca0106.h | 3 +- sound/pci/ca0106/ca0106_main.c | 114 +++++++++------------------------ 2 files changed, 30 insertions(+), 87 deletions(-) diff --git a/sound/pci/ca0106/ca0106.h b/sound/pci/ca0106/ca0106.h index 62a22ca3b9de..f246e6094289 100644 --- a/sound/pci/ca0106/ca0106.h +++ b/sound/pci/ca0106/ca0106.h @@ -667,7 +667,6 @@ struct snd_ca0106 { struct pci_dev *pci; unsigned long port; - struct resource *res_port; int irq; unsigned int serial; /* serial number */ @@ -688,7 +687,7 @@ struct snd_ca0106 { u8 i2c_capture_volume[4][2]; int capture_mic_line_in; - struct snd_dma_buffer buffer; + struct snd_dma_buffer *buffer; struct snd_ca_midi midi; struct snd_ca_midi midi2; diff --git a/sound/pci/ca0106/ca0106_main.c b/sound/pci/ca0106/ca0106_main.c index 99778711006a..36fb150b72fb 100644 --- a/sound/pci/ca0106/ca0106_main.c +++ b/sound/pci/ca0106/ca0106_main.c @@ -718,7 +718,7 @@ static int snd_ca0106_pcm_prepare_playback(struct snd_pcm_substream *substream) struct snd_pcm_runtime *runtime = substream->runtime; struct snd_ca0106_pcm *epcm = runtime->private_data; int channel = epcm->channel_id; - u32 *table_base = (u32 *)(emu->buffer.area+(8*16*channel)); + u32 *table_base = (u32 *)(emu->buffer->area+(8*16*channel)); u32 period_size_bytes = frames_to_bytes(runtime, runtime->period_size); u32 hcfg_mask = HCFG_PLAYBACK_S32_LE; u32 hcfg_set = 0x00000000; @@ -746,7 +746,7 @@ static int snd_ca0106_pcm_prepare_playback(struct snd_pcm_substream *substream) runtime->dma_addr, runtime->dma_area, table_base); dev_dbg(emu->card->dev, "dma_addr=%x, dma_area=%p, dma_bytes(size)=%x\n", - emu->buffer.addr, emu->buffer.area, emu->buffer.bytes); + emu->buffer->addr, emu->buffer->area, emu->buffer->bytes); #endif /* debug */ /* Rate can be set per channel. */ /* reg40 control host to fifo */ @@ -796,13 +796,13 @@ static int snd_ca0106_pcm_prepare_playback(struct snd_pcm_substream *substream) reg71 = (reg71 & ~reg71_mask) | reg71_set; snd_ca0106_ptr_write(emu, 0x71, 0, reg71); - /* FIXME: Check emu->buffer.size before actually writing to it. */ + /* FIXME: Check emu->buffer->size before actually writing to it. */ for(i=0; i < runtime->periods; i++) { table_base[i*2] = runtime->dma_addr + (i * period_size_bytes); table_base[i*2+1] = period_size_bytes << 16; } - snd_ca0106_ptr_write(emu, PLAYBACK_LIST_ADDR, channel, emu->buffer.addr+(8*16*channel)); + snd_ca0106_ptr_write(emu, PLAYBACK_LIST_ADDR, channel, emu->buffer->addr+(8*16*channel)); snd_ca0106_ptr_write(emu, PLAYBACK_LIST_SIZE, channel, (runtime->periods - 1) << 19); snd_ca0106_ptr_write(emu, PLAYBACK_LIST_PTR, channel, 0); snd_ca0106_ptr_write(emu, PLAYBACK_DMA_ADDR, channel, runtime->dma_addr); @@ -853,7 +853,7 @@ static int snd_ca0106_pcm_prepare_capture(struct snd_pcm_substream *substream) runtime->dma_addr, runtime->dma_area, table_base); dev_dbg(emu->card->dev, "dma_addr=%x, dma_area=%p, dma_bytes(size)=%x\n", - emu->buffer.addr, emu->buffer.area, emu->buffer.bytes); + emu->buffer->addr, emu->buffer->area, emu->buffer->bytes); #endif /* debug */ /* reg71 controls ADC rate. */ switch (runtime->rate) { @@ -1183,32 +1183,11 @@ static int snd_ca0106_ac97(struct snd_ca0106 *chip) static void ca0106_stop_chip(struct snd_ca0106 *chip); -static int snd_ca0106_free(struct snd_ca0106 *chip) +static void snd_ca0106_free(struct snd_card *card) { - if (chip->res_port != NULL) { - /* avoid access to already used hardware */ - ca0106_stop_chip(chip); - } - if (chip->irq >= 0) - free_irq(chip->irq, chip); - // release the data -#if 1 - if (chip->buffer.area) - snd_dma_free_pages(&chip->buffer); -#endif - - // release the i/o port - release_and_free_resource(chip->res_port); - - pci_disable_device(chip->pci); - kfree(chip); - return 0; -} + struct snd_ca0106 *chip = card->private_data; -static int snd_ca0106_dev_free(struct snd_device *device) -{ - struct snd_ca0106 *chip = device->device_data; - return snd_ca0106_free(chip); + ca0106_stop_chip(chip); } static irqreturn_t snd_ca0106_interrupt(int irq, void *dev_id) @@ -1594,50 +1573,33 @@ static void ca0106_stop_chip(struct snd_ca0106 *chip) } static int snd_ca0106_create(int dev, struct snd_card *card, - struct pci_dev *pci, - struct snd_ca0106 **rchip) + struct pci_dev *pci) { - struct snd_ca0106 *chip; + struct snd_ca0106 *chip = card->private_data; const struct snd_ca0106_details *c; int err; - static const struct snd_device_ops ops = { - .dev_free = snd_ca0106_dev_free, - }; - - *rchip = NULL; - err = pci_enable_device(pci); + err = pcim_enable_device(pci); if (err < 0) return err; if (dma_set_mask_and_coherent(&pci->dev, DMA_BIT_MASK(32))) { dev_err(card->dev, "error to set 32bit mask DMA\n"); - pci_disable_device(pci); return -ENXIO; } - chip = kzalloc(sizeof(*chip), GFP_KERNEL); - if (chip == NULL) { - pci_disable_device(pci); - return -ENOMEM; - } - chip->card = card; chip->pci = pci; chip->irq = -1; spin_lock_init(&chip->emu_lock); + err = pci_request_regions(pci, "snd_ca0106"); + if (err < 0) + return err; chip->port = pci_resource_start(pci, 0); - chip->res_port = request_region(chip->port, 0x20, "snd_ca0106"); - if (!chip->res_port) { - snd_ca0106_free(chip); - dev_err(card->dev, "cannot allocate the port\n"); - return -EBUSY; - } - if (request_irq(pci->irq, snd_ca0106_interrupt, - IRQF_SHARED, KBUILD_MODNAME, chip)) { - snd_ca0106_free(chip); + if (devm_request_irq(&pci->dev, pci->irq, snd_ca0106_interrupt, + IRQF_SHARED, KBUILD_MODNAME, chip)) { dev_err(card->dev, "cannot grab irq\n"); return -EBUSY; } @@ -1645,11 +1607,9 @@ static int snd_ca0106_create(int dev, struct snd_card *card, card->sync_irq = chip->irq; /* This stores the periods table. */ - if (snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, &pci->dev, - 1024, &chip->buffer) < 0) { - snd_ca0106_free(chip); + chip->buffer = snd_devm_alloc_pages(&pci->dev, SNDRV_DMA_TYPE_DEV, 1024); + if (!chip->buffer) return -ENOMEM; - } pci_set_master(pci); /* read serial */ @@ -1678,13 +1638,6 @@ static int snd_ca0106_create(int dev, struct snd_card *card, c->name, chip->port, chip->irq); ca0106_init_chip(chip, 0); - - err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops); - if (err < 0) { - snd_ca0106_free(chip); - return err; - } - *rchip = chip; return 0; } @@ -1787,36 +1740,37 @@ static int snd_ca0106_probe(struct pci_dev *pci, return -ENOENT; } - err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, - 0, &card); + err = snd_devm_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, + sizeof(*chip), &card); if (err < 0) return err; + chip = card->private_data; - err = snd_ca0106_create(dev, card, pci, &chip); + err = snd_ca0106_create(dev, card, pci); if (err < 0) - goto error; - card->private_data = chip; + return err; + card->private_free = snd_ca0106_free; for (i = 0; i < 4; i++) { err = snd_ca0106_pcm(chip, i); if (err < 0) - goto error; + return err; } if (chip->details->ac97 == 1) { /* The SB0410 and SB0413 do not have an AC97 chip. */ err = snd_ca0106_ac97(chip); if (err < 0) - goto error; + return err; } err = snd_ca0106_mixer(chip); if (err < 0) - goto error; + return err; dev_dbg(card->dev, "probe for MIDI channel A ..."); err = snd_ca0106_midi(chip, CA0106_MIDI_CHAN_A); if (err < 0) - goto error; + return err; dev_dbg(card->dev, " done.\n"); #ifdef CONFIG_SND_PROC_FS @@ -1825,20 +1779,11 @@ static int snd_ca0106_probe(struct pci_dev *pci, err = snd_card_register(card); if (err < 0) - goto error; + return err; pci_set_drvdata(pci, card); dev++; return 0; - - error: - snd_card_free(card); - return err; -} - -static void snd_ca0106_remove(struct pci_dev *pci) -{ - snd_card_free(pci_get_drvdata(pci)); } #ifdef CONFIG_PM_SLEEP @@ -1894,7 +1839,6 @@ static struct pci_driver ca0106_driver = { .name = KBUILD_MODNAME, .id_table = snd_ca0106_ids, .probe = snd_ca0106_probe, - .remove = snd_ca0106_remove, .driver = { .pm = SND_CA0106_PM_OPS, }, From patchwork Thu Jul 15 07:58:52 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379271 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0023DC47E48 for ; Thu, 15 Jul 2021 08:13:21 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 28DF561106 for ; Thu, 15 Jul 2021 08:13:20 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 28DF561106 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id B8DD61709; Thu, 15 Jul 2021 10:12:28 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz B8DD61709 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626336798; bh=fbGJa1nJRxqTlcBj7VYTpJpd4CMAfpo5f2kdYcMVlcI=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=Yj/CWk0ZqYTTvk7/QLTvVn32QQElbHzRO/34oEvnUuDuEvFf4V5UHBX/5OFucYaaO ENjP8ggKoqfnbktktiP6VGy+DWVSKlKost1YG+aUZ7nJMwZ185T83/vM8aSiR8GyvW 6pJV5EQod4elt3IcWGj3o/KSwoCnZWCpzZdV1rAk= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id 6E911F80635; Thu, 15 Jul 2021 10:00:54 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id 44724F804ED; Thu, 15 Jul 2021 10:00:49 +0200 (CEST) Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 6C016F80507 for ; Thu, 15 Jul 2021 10:00:05 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 6C016F80507 Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="fWX+BpNb"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="/pECGmw+" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out2.suse.de (Postfix) with ESMTP id 3DD7E1FDF6 for ; Thu, 15 Jul 2021 08:00:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336005; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=A0Mf+MeGSfmPObssMh30IZcO6IMlHVIbQXiRLLtwQ1k=; b=fWX+BpNbPsG0f0oKb7C83nypq01f6MEdQg38yzAufmAhNzQUkCiNiA4g1r3VoggWyVygdm RUOYaxKfYGmQqhcsQohUopPwgMG+ekXE4PDDHuNgTXcrWu0B5keT2bFLoLVeb0GRJzsRZ4 jHCdpXwNLJ9d9k85qsWFJswju/4ly9g= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336005; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=A0Mf+MeGSfmPObssMh30IZcO6IMlHVIbQXiRLLtwQ1k=; b=/pECGmw+dhslSav2Aw56ERPEFj/OroK6XwmpinIl8B9uA+YMsjULln1bdZI0Dmvub91PUK XuDf3ymrzpfSE7CQ== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id 358D4A3B8F; Thu, 15 Jul 2021 08:00:05 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 30/79] ALSA: cs46xx: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:58:52 +0200 Message-Id: <20210715075941.23332-31-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in PCI cs46xx driver with devres as a clean up. Each manual resource management is converted with the corresponding devres helper, and the card object release is managed now via card->private_free instead of a lowlevel snd_device. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- sound/pci/cs46xx/cs46xx.c | 51 ++++------------ sound/pci/cs46xx/cs46xx.h | 4 +- sound/pci/cs46xx/cs46xx_lib.c | 111 ++++++++-------------------------- 3 files changed, 38 insertions(+), 128 deletions(-) diff --git a/sound/pci/cs46xx/cs46xx.c b/sound/pci/cs46xx/cs46xx.c index 358ca84cbdea..bd60308769ff 100644 --- a/sound/pci/cs46xx/cs46xx.c +++ b/sound/pci/cs46xx/cs46xx.c @@ -66,61 +66,44 @@ static int snd_card_cs46xx_probe(struct pci_dev *pci, return -ENOENT; } - err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, - 0, &card); + err = snd_devm_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, + sizeof(*chip), &card); if (err < 0) return err; + chip = card->private_data; err = snd_cs46xx_create(card, pci, - external_amp[dev], thinkpad[dev], - &chip); - if (err < 0) { - snd_card_free(card); + external_amp[dev], thinkpad[dev]); + if (err < 0) return err; - } card->private_data = chip; chip->accept_valid = mmap_valid[dev]; err = snd_cs46xx_pcm(chip, 0); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } #ifdef CONFIG_SND_CS46XX_NEW_DSP err = snd_cs46xx_pcm_rear(chip, 1); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } err = snd_cs46xx_pcm_iec958(chip, 2); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } #endif err = snd_cs46xx_mixer(chip, 2); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } #ifdef CONFIG_SND_CS46XX_NEW_DSP if (chip->nr_ac97_codecs ==2) { err = snd_cs46xx_pcm_center_lfe(chip, 3); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } } #endif err = snd_cs46xx_midi(chip, 0); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } err = snd_cs46xx_start_dsp(chip); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } - snd_cs46xx_gameport(chip); @@ -133,26 +116,18 @@ static int snd_card_cs46xx_probe(struct pci_dev *pci, chip->irq); err = snd_card_register(card); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } pci_set_drvdata(pci, card); dev++; return 0; } -static void snd_card_cs46xx_remove(struct pci_dev *pci) -{ - snd_card_free(pci_get_drvdata(pci)); -} - static struct pci_driver cs46xx_driver = { .name = KBUILD_MODNAME, .id_table = snd_cs46xx_ids, .probe = snd_card_cs46xx_probe, - .remove = snd_card_cs46xx_remove, #ifdef CONFIG_PM_SLEEP .driver = { .pm = &snd_cs46xx_pm, diff --git a/sound/pci/cs46xx/cs46xx.h b/sound/pci/cs46xx/cs46xx.h index b275df883d06..c4f0a0b94270 100644 --- a/sound/pci/cs46xx/cs46xx.h +++ b/sound/pci/cs46xx/cs46xx.h @@ -1635,7 +1635,6 @@ struct snd_cs46xx_region { unsigned long base; void __iomem *remap_addr; unsigned long size; - struct resource *resource; }; struct snd_cs46xx { @@ -1718,8 +1717,7 @@ struct snd_cs46xx { int snd_cs46xx_create(struct snd_card *card, struct pci_dev *pci, - int external_amp, int thinkpad, - struct snd_cs46xx **rcodec); + int external_amp, int thinkpad); extern const struct dev_pm_ops snd_cs46xx_pm; int snd_cs46xx_pcm(struct snd_cs46xx *chip, int device); diff --git a/sound/pci/cs46xx/cs46xx_lib.c b/sound/pci/cs46xx/cs46xx_lib.c index 1e1eb17f8e07..8877afb66704 100644 --- a/sound/pci/cs46xx/cs46xx_lib.c +++ b/sound/pci/cs46xx/cs46xx_lib.c @@ -1865,13 +1865,6 @@ int snd_cs46xx_pcm_iec958(struct snd_cs46xx *chip, int device) /* * Mixer routines */ -static void snd_cs46xx_mixer_free_ac97_bus(struct snd_ac97_bus *bus) -{ - struct snd_cs46xx *chip = bus->private_data; - - chip->ac97_bus = NULL; -} - static void snd_cs46xx_mixer_free_ac97(struct snd_ac97 *ac97) { struct snd_cs46xx *chip = ac97->private_data; @@ -2487,7 +2480,6 @@ int snd_cs46xx_mixer(struct snd_cs46xx *chip, int spdif_device) err = snd_ac97_bus(card, 0, &ops, chip, &chip->ac97_bus); if (err < 0) return err; - chip->ac97_bus->private_free = snd_cs46xx_mixer_free_ac97_bus; if (cs46xx_detect_codec(chip, CS46XX_PRIMARY_CODEC_INDEX) < 0) return -ENXIO; @@ -2913,12 +2905,12 @@ static void snd_cs46xx_hw_stop(struct snd_cs46xx *chip) } -static int snd_cs46xx_free(struct snd_cs46xx *chip) +static void snd_cs46xx_free(struct snd_card *card) { + struct snd_cs46xx *chip = card->private_data; +#ifdef CONFIG_SND_CS46XX_NEW_DSP int idx; - - if (snd_BUG_ON(!chip)) - return -EINVAL; +#endif if (chip->active_ctrl) chip->active_ctrl(chip, 1); @@ -2930,22 +2922,11 @@ static int snd_cs46xx_free(struct snd_cs46xx *chip) snd_cs46xx_proc_done(chip); - if (chip->region.idx[0].resource) - snd_cs46xx_hw_stop(chip); - - if (chip->irq >= 0) - free_irq(chip->irq, chip); + snd_cs46xx_hw_stop(chip); if (chip->active_ctrl) chip->active_ctrl(chip, -chip->amplifier); - for (idx = 0; idx < 5; idx++) { - struct snd_cs46xx_region *region = &chip->region.idx[idx]; - - iounmap(region->remap_addr); - release_and_free_resource(region->resource); - } - #ifdef CONFIG_SND_CS46XX_NEW_DSP if (chip->dsp_spos_instance) { cs46xx_dsp_spos_destroy(chip); @@ -2956,20 +2937,6 @@ static int snd_cs46xx_free(struct snd_cs46xx *chip) #else vfree(chip->ba1); #endif - -#ifdef CONFIG_PM_SLEEP - kfree(chip->saved_regs); -#endif - - pci_disable_device(chip->pci); - kfree(chip); - return 0; -} - -static int snd_cs46xx_dev_free(struct snd_device *device) -{ - struct snd_cs46xx *chip = device->device_data; - return snd_cs46xx_free(chip); } /* @@ -3868,30 +3835,19 @@ SIMPLE_DEV_PM_OPS(snd_cs46xx_pm, snd_cs46xx_suspend, snd_cs46xx_resume); int snd_cs46xx_create(struct snd_card *card, struct pci_dev *pci, - int external_amp, int thinkpad, - struct snd_cs46xx **rchip) + int external_amp, int thinkpad) { - struct snd_cs46xx *chip; + struct snd_cs46xx *chip = card->private_data; int err, idx; struct snd_cs46xx_region *region; struct cs_card_type *cp; u16 ss_card, ss_vendor; - static const struct snd_device_ops ops = { - .dev_free = snd_cs46xx_dev_free, - }; - *rchip = NULL; - /* enable PCI device */ - err = pci_enable_device(pci); + err = pcim_enable_device(pci); if (err < 0) return err; - chip = kzalloc(sizeof(*chip), GFP_KERNEL); - if (chip == NULL) { - pci_disable_device(pci); - return -ENOMEM; - } spin_lock_init(&chip->reg_lock); #ifdef CONFIG_SND_CS46XX_NEW_DSP mutex_init(&chip->spos_mutex); @@ -3899,6 +3855,10 @@ int snd_cs46xx_create(struct snd_card *card, chip->card = card; chip->pci = pci; chip->irq = -1; + + err = pci_request_regions(pci, "CS46xx"); + if (err < 0) + return err; chip->ba0_addr = pci_resource_start(pci, 0); chip->ba1_addr = pci_resource_start(pci, 1); if (chip->ba0_addr == 0 || chip->ba0_addr == (unsigned long)~0 || @@ -3906,7 +3866,6 @@ int snd_cs46xx_create(struct snd_card *card, dev_err(chip->card->dev, "wrong address(es) - ba0 = 0x%lx, ba1 = 0x%lx\n", chip->ba0_addr, chip->ba1_addr); - snd_cs46xx_free(chip); return -ENOMEM; } @@ -3978,67 +3937,45 @@ int snd_cs46xx_create(struct snd_card *card, for (idx = 0; idx < 5; idx++) { region = &chip->region.idx[idx]; - region->resource = request_mem_region(region->base, region->size, - region->name); - if (!region->resource) { - dev_err(chip->card->dev, - "unable to request memory region 0x%lx-0x%lx\n", - region->base, region->base + region->size - 1); - snd_cs46xx_free(chip); - return -EBUSY; - } - region->remap_addr = ioremap(region->base, region->size); + region->remap_addr = devm_ioremap(&pci->dev, region->base, + region->size); if (region->remap_addr == NULL) { dev_err(chip->card->dev, "%s ioremap problem\n", region->name); - snd_cs46xx_free(chip); return -ENOMEM; } } - if (request_irq(pci->irq, snd_cs46xx_interrupt, IRQF_SHARED, - KBUILD_MODNAME, chip)) { + if (devm_request_irq(&pci->dev, pci->irq, snd_cs46xx_interrupt, + IRQF_SHARED, KBUILD_MODNAME, chip)) { dev_err(chip->card->dev, "unable to grab IRQ %d\n", pci->irq); - snd_cs46xx_free(chip); return -EBUSY; } chip->irq = pci->irq; card->sync_irq = chip->irq; + card->private_free = snd_cs46xx_free; #ifdef CONFIG_SND_CS46XX_NEW_DSP chip->dsp_spos_instance = cs46xx_dsp_spos_create(chip); - if (chip->dsp_spos_instance == NULL) { - snd_cs46xx_free(chip); + if (!chip->dsp_spos_instance) return -ENOMEM; - } #endif err = snd_cs46xx_chip_init(chip); - if (err < 0) { - snd_cs46xx_free(chip); - return err; - } - - err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops); - if (err < 0) { - snd_cs46xx_free(chip); + if (err < 0) return err; - } snd_cs46xx_proc_init(card, chip); #ifdef CONFIG_PM_SLEEP - chip->saved_regs = kmalloc_array(ARRAY_SIZE(saved_regs), - sizeof(*chip->saved_regs), - GFP_KERNEL); - if (!chip->saved_regs) { - snd_cs46xx_free(chip); + chip->saved_regs = devm_kmalloc_array(&pci->dev, + ARRAY_SIZE(saved_regs), + sizeof(*chip->saved_regs), + GFP_KERNEL); + if (!chip->saved_regs) return -ENOMEM; - } #endif chip->active_ctrl(chip, -1); /* disable CLKRUN */ - - *rchip = chip; return 0; } From patchwork Thu Jul 15 07:58:53 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379273 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1F86BC07E96 for ; Thu, 15 Jul 2021 08:13:41 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 768F3610D1 for ; Thu, 15 Jul 2021 08:13:40 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 768F3610D1 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id 04449172F; Thu, 15 Jul 2021 10:12:49 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 04449172F DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626336819; bh=M61xlYjISGekzwcgH9tpsxHic38nO0IrBeBX+A4jb64=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=sh3INBN6KyldwlCNQW5e6HfKvA7xYlXtQCV3vzdtm0PANF+JknayREVJkXT48rGb0 FRVKhets/yb/bPKOxmMk8V3oEyr46y93DLyIR+RAfnifcIGJmkEjiUALf5oW0npQSQ 9E663TZWZi7icYqq+DmdhMQGCtIrIzs2niLkGtdI= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id 58394F80517; Thu, 15 Jul 2021 10:00:56 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id A0946F80621; Thu, 15 Jul 2021 10:00:49 +0200 (CEST) Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id CD781F80510 for ; Thu, 15 Jul 2021 10:00:05 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz CD781F80510 Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="2Xtzp6x1"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="rwFJqCbi" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out2.suse.de (Postfix) with ESMTP id A9FCB1FDE5 for ; Thu, 15 Jul 2021 08:00:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336005; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=x0M9C7JIFCdVwEfvT+i1ktVRpUU4Ny5l0DvVLus9qE8=; b=2Xtzp6x1oa4js8kloxTbKY1kz1NICMeNXr3/H3w88Tskd/5AUxv9YiiCUcnBKDwWwkfvGY uHt0OwWCXoKdNS0S0qNburkwHqDPeKJG2FWZCbuHb9I2Nq4W3DvMEAnTOC82+HbS5wVSGc CuNIwEtHLQhaZ8Ru30v4N1elNcIxeg8= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336005; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=x0M9C7JIFCdVwEfvT+i1ktVRpUU4Ny5l0DvVLus9qE8=; b=rwFJqCbiYBFq8BheVEuQxP20E2c6gB56xcjBS3Oh/W4NJCngtgm7y2RW8zYFN82RHmv3jY PMc835rEsKJhDyBA== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id 9942BA3B8D; Thu, 15 Jul 2021 08:00:05 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 31/79] ALSA: cs5535audio: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:58:53 +0200 Message-Id: <20210715075941.23332-32-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in PCI cs5535audio driver with devres as a clean up. Each manual resource management is converted with the corresponding devres helper, and the card object release is managed now via card->private_free instead of a lowlevel snd_device. A slight uncertain change is the call of olpc_quirks_cleanup() at removal: formerly this was called unconditionally at remove, but this should be a conditionally call, hence the machine_is_olpc() check is added here as well. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- sound/pci/cs5535audio/cs5535audio.c | 94 +++++------------------- sound/pci/cs5535audio/cs5535audio_olpc.c | 7 +- 2 files changed, 23 insertions(+), 78 deletions(-) diff --git a/sound/pci/cs5535audio/cs5535audio.c b/sound/pci/cs5535audio/cs5535audio.c index e048b45d9e7e..499fa0148f9a 100644 --- a/sound/pci/cs5535audio/cs5535audio.c +++ b/sound/pci/cs5535audio/cs5535audio.c @@ -237,51 +237,24 @@ static irqreturn_t snd_cs5535audio_interrupt(int irq, void *dev_id) return IRQ_HANDLED; } -static int snd_cs5535audio_free(struct cs5535audio *cs5535au) +static void snd_cs5535audio_free(struct snd_card *card) { - pci_set_power_state(cs5535au->pci, PCI_D3hot); - - if (cs5535au->irq >= 0) - free_irq(cs5535au->irq, cs5535au); - - pci_release_regions(cs5535au->pci); - pci_disable_device(cs5535au->pci); - kfree(cs5535au); - return 0; -} - -static int snd_cs5535audio_dev_free(struct snd_device *device) -{ - struct cs5535audio *cs5535au = device->device_data; - return snd_cs5535audio_free(cs5535au); + olpc_quirks_cleanup(); } static int snd_cs5535audio_create(struct snd_card *card, - struct pci_dev *pci, - struct cs5535audio **rcs5535au) + struct pci_dev *pci) { - struct cs5535audio *cs5535au; - + struct cs5535audio *cs5535au = card->private_data; int err; - static const struct snd_device_ops ops = { - .dev_free = snd_cs5535audio_dev_free, - }; - *rcs5535au = NULL; - err = pci_enable_device(pci); + err = pcim_enable_device(pci); if (err < 0) return err; if (dma_set_mask_and_coherent(&pci->dev, DMA_BIT_MASK(32))) { dev_warn(card->dev, "unable to get 32bit dma\n"); - err = -ENXIO; - goto pcifail; - } - - cs5535au = kzalloc(sizeof(*cs5535au), GFP_KERNEL); - if (cs5535au == NULL) { - err = -ENOMEM; - goto pcifail; + return -ENXIO; } spin_lock_init(&cs5535au->reg_lock); @@ -290,38 +263,22 @@ static int snd_cs5535audio_create(struct snd_card *card, cs5535au->irq = -1; err = pci_request_regions(pci, "CS5535 Audio"); - if (err < 0) { - kfree(cs5535au); - goto pcifail; - } + if (err < 0) + return err; cs5535au->port = pci_resource_start(pci, 0); - if (request_irq(pci->irq, snd_cs5535audio_interrupt, - IRQF_SHARED, KBUILD_MODNAME, cs5535au)) { + if (devm_request_irq(&pci->dev, pci->irq, snd_cs5535audio_interrupt, + IRQF_SHARED, KBUILD_MODNAME, cs5535au)) { dev_err(card->dev, "unable to grab IRQ %d\n", pci->irq); - err = -EBUSY; - goto sndfail; + return -EBUSY; } cs5535au->irq = pci->irq; card->sync_irq = cs5535au->irq; pci_set_master(pci); - err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, cs5535au, &ops); - if (err < 0) - goto sndfail; - - *rcs5535au = cs5535au; return 0; - -sndfail: /* leave the device alive, just kill the snd */ - snd_cs5535audio_free(cs5535au); - return err; - -pcifail: - pci_disable_device(pci); - return err; } static int snd_cs5535audio_probe(struct pci_dev *pci, @@ -339,24 +296,24 @@ static int snd_cs5535audio_probe(struct pci_dev *pci, return -ENOENT; } - err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, - 0, &card); + err = snd_devm_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, + sizeof(*cs5535au), &card); if (err < 0) return err; + cs5535au = card->private_data; + card->private_free = snd_cs5535audio_free; - err = snd_cs5535audio_create(card, pci, &cs5535au); + err = snd_cs5535audio_create(card, pci); if (err < 0) - goto probefail_out; - - card->private_data = cs5535au; + return err; err = snd_cs5535audio_mixer(cs5535au); if (err < 0) - goto probefail_out; + return err; err = snd_cs5535audio_pcm(cs5535au); if (err < 0) - goto probefail_out; + return err; strcpy(card->driver, DRIVER_NAME); @@ -367,28 +324,17 @@ static int snd_cs5535audio_probe(struct pci_dev *pci, err = snd_card_register(card); if (err < 0) - goto probefail_out; + return err; pci_set_drvdata(pci, card); dev++; return 0; - -probefail_out: - snd_card_free(card); - return err; -} - -static void snd_cs5535audio_remove(struct pci_dev *pci) -{ - olpc_quirks_cleanup(); - snd_card_free(pci_get_drvdata(pci)); } static struct pci_driver cs5535audio_driver = { .name = KBUILD_MODNAME, .id_table = snd_cs5535audio_ids, .probe = snd_cs5535audio_probe, - .remove = snd_cs5535audio_remove, #ifdef CONFIG_PM_SLEEP .driver = { .pm = &snd_cs5535audio_pm, diff --git a/sound/pci/cs5535audio/cs5535audio_olpc.c b/sound/pci/cs5535audio/cs5535audio_olpc.c index 110d3209441b..122170a410d9 100644 --- a/sound/pci/cs5535audio/cs5535audio_olpc.c +++ b/sound/pci/cs5535audio/cs5535audio_olpc.c @@ -171,10 +171,8 @@ int olpc_quirks(struct snd_card *card, struct snd_ac97 *ac97) for (i = 0; i < ARRAY_SIZE(olpc_cs5535audio_ctls); i++) { err = snd_ctl_add(card, snd_ctl_new1(&olpc_cs5535audio_ctls[i], ac97->private_data)); - if (err < 0) { - gpio_free(OLPC_GPIO_MIC_AC); + if (err < 0) return err; - } } /* turn off the mic by default */ @@ -184,5 +182,6 @@ int olpc_quirks(struct snd_card *card, struct snd_ac97 *ac97) void olpc_quirks_cleanup(void) { - gpio_free(OLPC_GPIO_MIC_AC); + if (machine_is_olpc()) + gpio_free(OLPC_GPIO_MIC_AC); } From patchwork Thu Jul 15 07:58:54 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379275 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1C41EC07E96 for ; Thu, 15 Jul 2021 08:13:58 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 98B1661362 for ; Thu, 15 Jul 2021 08:13:57 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 98B1661362 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id 3229F1731; Thu, 15 Jul 2021 10:13:06 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 3229F1731 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626336836; bh=05AkCagDvbKFCCICvLxDy4stNAkudTaYaLQ2wBjO04M=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=bqwCibGiCB3/K4ur7Vem1U/I4iHRBRChMjqu4sQ9ZaQV1/3XYPm9djdhD4SHfGPC8 VA3OL9SJ/kRO9aR6nIjeCxV36wQd5MRxNysWJqEr7pCMw9sxFhdXXA9pOp1AMsbs0k 8+8veGR5n0zKjy+8PDga447VNfOGZv6GRuoJhz2Y= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id 77EB9F80638; Thu, 15 Jul 2021 10:00:58 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id DA57CF80620; Thu, 15 Jul 2021 10:00:49 +0200 (CEST) Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 3D555F80516 for ; Thu, 15 Jul 2021 10:00:06 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 3D555F80516 Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="Mx8N0Eue"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="5X783Ivj" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out2.suse.de (Postfix) with ESMTP id 16F8A1FD3E for ; Thu, 15 Jul 2021 08:00:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336006; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=G2DCX/QEsG5SGmvCcP2ajlbmbwI490Kx3Vx7ceUZBTA=; b=Mx8N0EueF6+uFlgpdd7FaENlsYDYwzrWdQAPXB2KE2utW7TmzANKXq3Lkv5snkxNBT2DBc OKNkgAMe1JbH+8ar9zNp5PA+wBZDReUowN42Rs+Id/eh+hYi5Rje1N8XOrLrX/IGmVrwxU kJ07ja7AxbdSecDRPUcmFxhS6hUYTwA= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336006; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=G2DCX/QEsG5SGmvCcP2ajlbmbwI490Kx3Vx7ceUZBTA=; b=5X783Ivj8ODKwnqeG560iwibcFE0R6iKunfP2fjlob41rgRJtvxJy7zuC9WvyMahjKugqE luVzk+ii2fwX7GDg== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id 04BDAA3B9A; Thu, 15 Jul 2021 08:00:06 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 32/79] ALSA: echoaudio: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:58:54 +0200 Message-Id: <20210715075941.23332-33-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in PCI echoaudio drivers with devres as a clean up. Each manual resource management is converted with the corresponding devres helper, the page allocations are done with the devres helper, and the card object release is managed now via card->private_free instead of a lowlevel snd_device. The irq handler is still managed manually because it's re-acquired at PM suspend/resume. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- sound/pci/echoaudio/echoaudio.c | 168 +++++++++----------------------- sound/pci/echoaudio/echoaudio.h | 2 +- 2 files changed, 48 insertions(+), 122 deletions(-) diff --git a/sound/pci/echoaudio/echoaudio.c b/sound/pci/echoaudio/echoaudio.c index a62e5581ad14..25b012ef5c3e 100644 --- a/sound/pci/echoaudio/echoaudio.c +++ b/sound/pci/echoaudio/echoaudio.c @@ -1882,105 +1882,63 @@ static irqreturn_t snd_echo_interrupt(int irq, void *dev_id) Module construction / destruction ******************************************************************************/ -static int snd_echo_free(struct echoaudio *chip) +static void snd_echo_free(struct snd_card *card) { + struct echoaudio *chip = card->private_data; + if (chip->comm_page) rest_in_peace(chip); if (chip->irq >= 0) free_irq(chip->irq, chip); - if (chip->comm_page) - snd_dma_free_pages(&chip->commpage_dma_buf); - - iounmap(chip->dsp_registers); - release_and_free_resource(chip->iores); - pci_disable_device(chip->pci); - /* release chip data */ free_firmware_cache(chip); - kfree(chip); - return 0; -} - - - -static int snd_echo_dev_free(struct snd_device *device) -{ - struct echoaudio *chip = device->device_data; - - return snd_echo_free(chip); } - - /* <--snd_echo_probe() */ static int snd_echo_create(struct snd_card *card, - struct pci_dev *pci, - struct echoaudio **rchip) + struct pci_dev *pci) { - struct echoaudio *chip; + struct echoaudio *chip = card->private_data; int err; size_t sz; - static const struct snd_device_ops ops = { - .dev_free = snd_echo_dev_free, - }; - - *rchip = NULL; pci_write_config_byte(pci, PCI_LATENCY_TIMER, 0xC0); - err = pci_enable_device(pci); + err = pcim_enable_device(pci); if (err < 0) return err; pci_set_master(pci); /* Allocate chip if needed */ - if (!*rchip) { - chip = kzalloc(sizeof(*chip), GFP_KERNEL); - if (!chip) { - pci_disable_device(pci); - return -ENOMEM; - } - dev_dbg(card->dev, "chip=%p\n", chip); - spin_lock_init(&chip->lock); - chip->card = card; - chip->pci = pci; - chip->irq = -1; - chip->opencount = 0; - mutex_init(&chip->mode_mutex); - chip->can_set_rate = 1; - } else { - /* If this was called from the resume function, chip is - * already allocated and it contains current card settings. - */ - chip = *rchip; - } + spin_lock_init(&chip->lock); + chip->card = card; + chip->pci = pci; + chip->irq = -1; + chip->opencount = 0; + mutex_init(&chip->mode_mutex); + chip->can_set_rate = 1; /* PCI resource allocation */ + err = pci_request_regions(pci, ECHOCARD_NAME); + if (err < 0) + return err; + chip->dsp_registers_phys = pci_resource_start(pci, 0); sz = pci_resource_len(pci, 0); if (sz > PAGE_SIZE) sz = PAGE_SIZE; /* We map only the required part */ - chip->iores = request_mem_region(chip->dsp_registers_phys, sz, - ECHOCARD_NAME); - if (!chip->iores) { - dev_err(chip->card->dev, "cannot get memory region\n"); - snd_echo_free(chip); - return -EBUSY; - } - chip->dsp_registers = ioremap(chip->dsp_registers_phys, sz); + chip->dsp_registers = devm_ioremap(&pci->dev, chip->dsp_registers_phys, sz); if (!chip->dsp_registers) { dev_err(chip->card->dev, "ioremap failed\n"); - snd_echo_free(chip); return -ENOMEM; } if (request_irq(pci->irq, snd_echo_interrupt, IRQF_SHARED, KBUILD_MODNAME, chip)) { dev_err(chip->card->dev, "cannot grab irq\n"); - snd_echo_free(chip); return -EBUSY; } chip->irq = pci->irq; @@ -1988,39 +1946,29 @@ static int snd_echo_create(struct snd_card *card, dev_dbg(card->dev, "pci=%p irq=%d subdev=%04x Init hardware...\n", chip->pci, chip->irq, chip->pci->subsystem_device); + card->private_free = snd_echo_free; + /* Create the DSP comm page - this is the area of memory used for most of the communication with the DSP, which accesses it via bus mastering */ - if (snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, &chip->pci->dev, - sizeof(struct comm_page), - &chip->commpage_dma_buf) < 0) { - dev_err(chip->card->dev, "cannot allocate the comm page\n"); - snd_echo_free(chip); + chip->commpage_dma_buf = + snd_devm_alloc_pages(&pci->dev, SNDRV_DMA_TYPE_DEV, + sizeof(struct comm_page)); + if (!chip->commpage_dma_buf) return -ENOMEM; - } - chip->comm_page_phys = chip->commpage_dma_buf.addr; - chip->comm_page = (struct comm_page *)chip->commpage_dma_buf.area; + chip->comm_page_phys = chip->commpage_dma_buf->addr; + chip->comm_page = (struct comm_page *)chip->commpage_dma_buf->area; err = init_hw(chip, chip->pci->device, chip->pci->subsystem_device); if (err >= 0) err = set_mixer_defaults(chip); if (err < 0) { dev_err(card->dev, "init_hw err=%d\n", err); - snd_echo_free(chip); return err; } - err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops); - if (err < 0) { - snd_echo_free(chip); - return err; - } - *rchip = chip; - /* Init done ! */ return 0; } - - /* constructor */ static int snd_echo_probe(struct pci_dev *pci, const struct pci_device_id *pci_id) @@ -2040,17 +1988,15 @@ static int snd_echo_probe(struct pci_dev *pci, } i = 0; - err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, - 0, &card); + err = snd_devm_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, + sizeof(*chip), &card); if (err < 0) return err; + chip = card->private_data; - chip = NULL; /* Tells snd_echo_create to allocate chip */ - err = snd_echo_create(card, pci, &chip); - if (err < 0) { - snd_card_free(card); + err = snd_echo_create(card, pci); + if (err < 0) return err; - } strcpy(card->driver, "Echo_" ECHOCARD_NAME); strcpy(card->shortname, chip->card_name); @@ -2066,7 +2012,6 @@ static int snd_echo_probe(struct pci_dev *pci, err = snd_echo_new_pcm(chip); if (err < 0) { dev_err(chip->card->dev, "new pcm error %d\n", err); - snd_card_free(card); return err; } @@ -2075,7 +2020,6 @@ static int snd_echo_probe(struct pci_dev *pci, err = snd_echo_midi_create(card, chip); if (err < 0) { dev_err(chip->card->dev, "new midi error %d\n", err); - snd_card_free(card); return err; } } @@ -2085,64 +2029,64 @@ static int snd_echo_probe(struct pci_dev *pci, snd_echo_vmixer.count = num_pipes_out(chip) * num_busses_out(chip); err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_vmixer, chip)); if (err < 0) - goto ctl_error; + return err; #ifdef ECHOCARD_HAS_LINE_OUT_GAIN err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_line_output_gain, chip)); if (err < 0) - goto ctl_error; + return err; #endif #else /* ECHOCARD_HAS_VMIXER */ err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_pcm_output_gain, chip)); if (err < 0) - goto ctl_error; + return err; #endif /* ECHOCARD_HAS_VMIXER */ #ifdef ECHOCARD_HAS_INPUT_GAIN err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_line_input_gain, chip)); if (err < 0) - goto ctl_error; + return err; #endif #ifdef ECHOCARD_HAS_INPUT_NOMINAL_LEVEL if (!chip->hasnt_input_nominal_level) { err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_intput_nominal_level, chip)); if (err < 0) - goto ctl_error; + return err; } #endif #ifdef ECHOCARD_HAS_OUTPUT_NOMINAL_LEVEL err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_output_nominal_level, chip)); if (err < 0) - goto ctl_error; + return err; #endif err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_vumeters_switch, chip)); if (err < 0) - goto ctl_error; + return err; err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_vumeters, chip)); if (err < 0) - goto ctl_error; + return err; #ifdef ECHOCARD_HAS_MONITOR snd_echo_monitor_mixer.count = num_busses_in(chip) * num_busses_out(chip); err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_monitor_mixer, chip)); if (err < 0) - goto ctl_error; + return err; #endif #ifdef ECHOCARD_HAS_DIGITAL_IN_AUTOMUTE err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_automute_switch, chip)); if (err < 0) - goto ctl_error; + return err; #endif err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_channels_info, chip)); if (err < 0) - goto ctl_error; + return err; #ifdef ECHOCARD_HAS_DIGITAL_MODE_SWITCH /* Creates a list of available digital modes */ @@ -2153,7 +2097,7 @@ static int snd_echo_probe(struct pci_dev *pci, err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_digital_mode_switch, chip)); if (err < 0) - goto ctl_error; + return err; #endif /* ECHOCARD_HAS_DIGITAL_MODE_SWITCH */ #ifdef ECHOCARD_HAS_EXTERNAL_CLOCK @@ -2167,37 +2111,32 @@ static int snd_echo_probe(struct pci_dev *pci, chip->clock_src_ctl = snd_ctl_new1(&snd_echo_clock_source_switch, chip); err = snd_ctl_add(chip->card, chip->clock_src_ctl); if (err < 0) - goto ctl_error; + return err; } #endif /* ECHOCARD_HAS_EXTERNAL_CLOCK */ #ifdef ECHOCARD_HAS_DIGITAL_IO err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_spdif_mode_switch, chip)); if (err < 0) - goto ctl_error; + return err; #endif #ifdef ECHOCARD_HAS_PHANTOM_POWER if (chip->has_phantom_power) { err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_echo_phantom_power_switch, chip)); if (err < 0) - goto ctl_error; + return err; } #endif err = snd_card_register(card); if (err < 0) - goto ctl_error; + return err; dev_info(card->dev, "Card registered: %s\n", card->longname); pci_set_drvdata(pci, chip); dev++; return 0; - -ctl_error: - dev_err(card->dev, "new control error %d\n", err); - snd_card_free(card); - return err; } @@ -2299,18 +2238,6 @@ static SIMPLE_DEV_PM_OPS(snd_echo_pm, snd_echo_suspend, snd_echo_resume); #define SND_ECHO_PM_OPS NULL #endif /* CONFIG_PM_SLEEP */ - -static void snd_echo_remove(struct pci_dev *pci) -{ - struct echoaudio *chip; - - chip = pci_get_drvdata(pci); - if (chip) - snd_card_free(chip->card); -} - - - /****************************************************************************** Everything starts and ends here ******************************************************************************/ @@ -2320,7 +2247,6 @@ static struct pci_driver echo_driver = { .name = KBUILD_MODNAME, .id_table = snd_echo_ids, .probe = snd_echo_probe, - .remove = snd_echo_remove, .driver = { .pm = SND_ECHO_PM_OPS, }, diff --git a/sound/pci/echoaudio/echoaudio.h b/sound/pci/echoaudio/echoaudio.h index 0afe13f7b6e5..d51de3e4edfa 100644 --- a/sound/pci/echoaudio/echoaudio.h +++ b/sound/pci/echoaudio/echoaudio.h @@ -348,7 +348,7 @@ struct echoaudio { struct pci_dev *pci; unsigned long dsp_registers_phys; struct resource *iores; - struct snd_dma_buffer commpage_dma_buf; + struct snd_dma_buffer *commpage_dma_buf; int irq; #ifdef ECHOCARD_HAS_MIDI struct snd_rawmidi *rmidi; From patchwork Thu Jul 15 07:58:55 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379269 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3C53CC07E96 for ; Thu, 15 Jul 2021 08:13:02 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id B56FC61106 for ; Thu, 15 Jul 2021 08:13:01 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org B56FC61106 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id 4A5B216FD; Thu, 15 Jul 2021 10:12:10 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 4A5B216FD DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626336780; bh=F5y1crdpP6cv74GNcBicqAssaP3F1QQ+7EsaEaML/K4=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=iR16e/mXK6Iiu/8dk+aZmmBqAuOG0l9/YbL0GVk4dSOg97fbXzaOCaoQk4gr+QgMs ZVXFKjDZqBecFzPIkNdCR/O0EPmlBcizKZlS7Ftpn20Capj13w/I52Px9Zt38Fom1y aJqd5k+Jt1kgQBnWkmkH0xirPI420G8pIA7BbH9A= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id 7CD46F80518; Thu, 15 Jul 2021 10:00:53 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id 9D7C9F8061F; Thu, 15 Jul 2021 10:00:48 +0200 (CEST) Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id A156CF804ED for ; Thu, 15 Jul 2021 10:00:06 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz A156CF804ED Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="hV6AQJ+D"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="5DmrS+4S" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out2.suse.de (Postfix) with ESMTP id 6CD2E1FDEA for ; Thu, 15 Jul 2021 08:00:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336006; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Tzlv32loXGZtJmQcuqUnxjn9bVEdumHl6RLnpXoIf9I=; b=hV6AQJ+DYwJov3BTgsTherCnWpmDxap4jKoGQlVcoy1Jt1kzYYO0cOf0DCzb0jeE5w3EKW btfKQHTIE1EuZDA1kN0BAK+zcZYRg0stlRkCiYn5T7E38C0QuxZ4gI8AUCEPSWRU0HrvRr /L4CnJWZf1cNTcisitFgaEfup2Gw1bA= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336006; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Tzlv32loXGZtJmQcuqUnxjn9bVEdumHl6RLnpXoIf9I=; b=5DmrS+4SY2h6UMlUOdJaZg6uAPv0LHtpWBZv02lxZxw5zkL0x4ER/pKDYE1IgOLLQ219d+ aQsrPYt7YnUMUUCA== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id 5A671A3B9B; Thu, 15 Jul 2021 08:00:06 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 33/79] ALSA: emu10k1: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:58:55 +0200 Message-Id: <20210715075941.23332-34-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in PCI emu10k1 driver with devres as a clean up. Each manual resource management is converted with the corresponding devres helper, the page allocations are done with the devres helper, and the card object release is managed now via card->private_free instead of a lowlevel snd_device. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- include/sound/emu10k1.h | 6 +- sound/pci/emu10k1/emu10k1.c | 53 +++++++--------- sound/pci/emu10k1/emu10k1_main.c | 102 ++++++++----------------------- sound/pci/emu10k1/p16v.c | 22 ++----- 4 files changed, 52 insertions(+), 131 deletions(-) diff --git a/include/sound/emu10k1.h b/include/sound/emu10k1.h index 468e38c54dd3..39787fecc8d9 100644 --- a/include/sound/emu10k1.h +++ b/include/sound/emu10k1.h @@ -1701,7 +1701,7 @@ struct snd_emu10k1 { struct snd_dma_buffer silent_page; /* silent page */ struct snd_dma_buffer ptb_pages; /* page table pages */ struct snd_dma_device p16v_dma_dev; - struct snd_dma_buffer p16v_buffer; + struct snd_dma_buffer *p16v_buffer; struct snd_util_memhdr *memhdr; /* page allocation list */ @@ -1796,14 +1796,12 @@ int snd_emu10k1_create(struct snd_card *card, unsigned short extout_mask, long max_cache_bytes, int enable_ir, - uint subsystem, - struct snd_emu10k1 ** remu); + uint subsystem); int snd_emu10k1_pcm(struct snd_emu10k1 *emu, int device); int snd_emu10k1_pcm_mic(struct snd_emu10k1 *emu, int device); int snd_emu10k1_pcm_efx(struct snd_emu10k1 *emu, int device); int snd_p16v_pcm(struct snd_emu10k1 *emu, int device); -int snd_p16v_free(struct snd_emu10k1 * emu); int snd_p16v_mixer(struct snd_emu10k1 * emu); int snd_emu10k1_pcm_multi(struct snd_emu10k1 *emu, int device); int snd_emu10k1_fx8010_pcm(struct snd_emu10k1 *emu, int device); diff --git a/sound/pci/emu10k1/emu10k1.c b/sound/pci/emu10k1/emu10k1.c index 887bfb3c1e17..672af4b9597b 100644 --- a/sound/pci/emu10k1/emu10k1.c +++ b/sound/pci/emu10k1/emu10k1.c @@ -99,67 +99,67 @@ static int snd_card_emu10k1_probe(struct pci_dev *pci, return -ENOENT; } - err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, - 0, &card); + err = snd_devm_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, + sizeof(*emu), &card); if (err < 0) return err; + emu = card->private_data; + if (max_buffer_size[dev] < 32) max_buffer_size[dev] = 32; else if (max_buffer_size[dev] > 1024) max_buffer_size[dev] = 1024; err = snd_emu10k1_create(card, pci, extin[dev], extout[dev], (long)max_buffer_size[dev] * 1024 * 1024, - enable_ir[dev], subsystem[dev], - &emu); + enable_ir[dev], subsystem[dev]); if (err < 0) - goto error; - card->private_data = emu; + return err; emu->delay_pcm_irq = delay_pcm_irq[dev] & 0x1f; err = snd_emu10k1_pcm(emu, 0); if (err < 0) - goto error; + return err; err = snd_emu10k1_pcm_mic(emu, 1); if (err < 0) - goto error; + return err; err = snd_emu10k1_pcm_efx(emu, 2); if (err < 0) - goto error; + return err; /* This stores the periods table. */ if (emu->card_capabilities->ca0151_chip) { /* P16V */ - err = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, &pci->dev, - 1024, &emu->p16v_buffer); - if (err < 0) - goto error; + emu->p16v_buffer = + snd_devm_alloc_pages(&pci->dev, SNDRV_DMA_TYPE_DEV, 1024); + if (!emu->p16v_buffer) + return -ENOMEM; } err = snd_emu10k1_mixer(emu, 0, 3); if (err < 0) - goto error; + return err; err = snd_emu10k1_timer(emu, 0); if (err < 0) - goto error; + return err; err = snd_emu10k1_pcm_multi(emu, 3); if (err < 0) - goto error; + return err; if (emu->card_capabilities->ca0151_chip) { /* P16V */ err = snd_p16v_pcm(emu, 4); if (err < 0) - goto error; + return err; } if (emu->audigy) { err = snd_emu10k1_audigy_midi(emu); if (err < 0) - goto error; + return err; } else { err = snd_emu10k1_midi(emu); if (err < 0) - goto error; + return err; } err = snd_emu10k1_fx8010_new(emu, 0); if (err < 0) - goto error; + return err; #ifdef ENABLE_SYNTH if (snd_seq_device_new(card, 1, SNDRV_SEQ_DEV_ID_EMU10K1_SYNTH, sizeof(struct snd_emu10k1_synth_arg), &wave) < 0 || @@ -187,7 +187,7 @@ static int snd_card_emu10k1_probe(struct pci_dev *pci, err = snd_card_register(card); if (err < 0) - goto error; + return err; if (emu->card_capabilities->emu_model) schedule_delayed_work(&emu->emu1010.firmware_work, 0); @@ -195,18 +195,8 @@ static int snd_card_emu10k1_probe(struct pci_dev *pci, pci_set_drvdata(pci, card); dev++; return 0; - - error: - snd_card_free(card); - return err; } -static void snd_card_emu10k1_remove(struct pci_dev *pci) -{ - snd_card_free(pci_get_drvdata(pci)); -} - - #ifdef CONFIG_PM_SLEEP static int snd_emu10k1_suspend(struct device *dev) { @@ -263,7 +253,6 @@ static struct pci_driver emu10k1_driver = { .name = KBUILD_MODNAME, .id_table = snd_emu10k1_ids, .probe = snd_card_emu10k1_probe, - .remove = snd_card_emu10k1_remove, .driver = { .pm = SND_EMU10K1_PM_OPS, }, diff --git a/sound/pci/emu10k1/emu10k1_main.c b/sound/pci/emu10k1/emu10k1_main.c index 24a2fd706d69..86cc1ca025e4 100644 --- a/sound/pci/emu10k1/emu10k1_main.c +++ b/sound/pci/emu10k1/emu10k1_main.c @@ -1242,8 +1242,10 @@ static int alloc_pm_buffer(struct snd_emu10k1 *emu); static void free_pm_buffer(struct snd_emu10k1 *emu); #endif -static int snd_emu10k1_free(struct snd_emu10k1 *emu) +static void snd_emu10k1_free(struct snd_card *card) { + struct snd_emu10k1 *emu = card->private_data; + if (emu->port) { /* avoid access to already used hardware */ snd_emu10k1_fx8010_tram_setup(emu, 0); snd_emu10k1_done(emu); @@ -1256,8 +1258,6 @@ static int snd_emu10k1_free(struct snd_emu10k1 *emu) cancel_delayed_work_sync(&emu->emu1010.firmware_work); release_firmware(emu->firmware); release_firmware(emu->dock_fw); - if (emu->irq >= 0) - free_irq(emu->irq, emu); snd_util_memhdr_free(emu->memhdr); if (emu->silent_page.area) snd_dma_free_pages(&emu->silent_page); @@ -1268,19 +1268,6 @@ static int snd_emu10k1_free(struct snd_emu10k1 *emu) #ifdef CONFIG_PM_SLEEP free_pm_buffer(emu); #endif - if (emu->port) - pci_release_regions(emu->pci); - if (emu->card_capabilities->ca0151_chip) /* P16V */ - snd_p16v_free(emu); - pci_disable_device(emu->pci); - kfree(emu); - return 0; -} - -static int snd_emu10k1_dev_free(struct snd_device *device) -{ - struct snd_emu10k1 *emu = device->device_data; - return snd_emu10k1_free(emu); } static const struct snd_emu_chip_details emu_chip_details[] = { @@ -1782,32 +1769,22 @@ int snd_emu10k1_create(struct snd_card *card, unsigned short extout_mask, long max_cache_bytes, int enable_ir, - uint subsystem, - struct snd_emu10k1 **remu) + uint subsystem) { - struct snd_emu10k1 *emu; + struct snd_emu10k1 *emu = card->private_data; int idx, err; int is_audigy; size_t page_table_size; __le32 *pgtbl; unsigned int silent_page; const struct snd_emu_chip_details *c; - static const struct snd_device_ops ops = { - .dev_free = snd_emu10k1_dev_free, - }; - - *remu = NULL; /* enable PCI device */ - err = pci_enable_device(pci); + err = pcim_enable_device(pci); if (err < 0) return err; - emu = kzalloc(sizeof(*emu), GFP_KERNEL); - if (emu == NULL) { - pci_disable_device(pci); - return -ENOMEM; - } + card->private_free = snd_emu10k1_free; emu->card = card; spin_lock_init(&emu->reg_lock); spin_lock_init(&emu->emu_lock); @@ -1850,8 +1827,6 @@ int snd_emu10k1_create(struct snd_card *card, } if (c->vendor == 0) { dev_err(card->dev, "emu10k1: Card not recognised\n"); - kfree(emu); - pci_disable_device(pci); return -ENOENT; } emu->card_capabilities = c; @@ -1883,8 +1858,6 @@ int snd_emu10k1_create(struct snd_card *card, dev_err(card->dev, "architecture does not support PCI busmaster DMA with mask 0x%lx\n", emu->dma_mask); - kfree(emu); - pci_disable_device(pci); return -ENXIO; } if (is_audigy) @@ -1893,11 +1866,8 @@ int snd_emu10k1_create(struct snd_card *card, emu->gpr_base = FXGPREGBASE; err = pci_request_regions(pci, "EMU10K1"); - if (err < 0) { - kfree(emu); - pci_disable_device(pci); + if (err < 0) return err; - } emu->port = pci_resource_start(pci, 0); emu->max_cache_pages = max_cache_bytes >> PAGE_SHIFT; @@ -1905,10 +1875,8 @@ int snd_emu10k1_create(struct snd_card *card, page_table_size = sizeof(u32) * (emu->address_mode ? MAXPAGES1 : MAXPAGES0); if (snd_emu10k1_alloc_pages_maybe_wider(emu, page_table_size, - &emu->ptb_pages) < 0) { - err = -ENOMEM; - goto error; - } + &emu->ptb_pages) < 0) + return -ENOMEM; dev_dbg(card->dev, "page table address range is %.8lx:%.8lx\n", (unsigned long)emu->ptb_pages.addr, (unsigned long)(emu->ptb_pages.addr + emu->ptb_pages.bytes)); @@ -1917,26 +1885,20 @@ int snd_emu10k1_create(struct snd_card *card, emu->max_cache_pages)); emu->page_addr_table = vmalloc(array_size(sizeof(unsigned long), emu->max_cache_pages)); - if (emu->page_ptr_table == NULL || emu->page_addr_table == NULL) { - err = -ENOMEM; - goto error; - } + if (!emu->page_ptr_table || !emu->page_addr_table) + return -ENOMEM; if (snd_emu10k1_alloc_pages_maybe_wider(emu, EMUPAGESIZE, - &emu->silent_page) < 0) { - err = -ENOMEM; - goto error; - } + &emu->silent_page) < 0) + return -ENOMEM; dev_dbg(card->dev, "silent page range is %.8lx:%.8lx\n", (unsigned long)emu->silent_page.addr, (unsigned long)(emu->silent_page.addr + emu->silent_page.bytes)); emu->memhdr = snd_util_memhdr_new(emu->max_cache_pages * PAGE_SIZE); - if (emu->memhdr == NULL) { - err = -ENOMEM; - goto error; - } + if (!emu->memhdr) + return -ENOMEM; emu->memhdr->block_extra_size = sizeof(struct snd_emu10k1_memblk) - sizeof(struct snd_util_memblk); @@ -1954,18 +1916,16 @@ int snd_emu10k1_create(struct snd_card *card, if (emu->card_capabilities->ca_cardbus_chip) { err = snd_emu10k1_cardbus_init(emu); if (err < 0) - goto error; + return err; } if (emu->card_capabilities->ecard) { err = snd_emu10k1_ecard_init(emu); if (err < 0) - goto error; + return err; } else if (emu->card_capabilities->emu_model) { err = snd_emu10k1_emu1010_init(emu); - if (err < 0) { - snd_emu10k1_free(emu); + if (err < 0) return err; - } } else { /* 5.1: Enable the additional AC97 Slots. If the emu10k1 version does not support this, it shouldn't do any harm */ @@ -1979,11 +1939,9 @@ int snd_emu10k1_create(struct snd_card *card, emu->fx8010.etram_pages.bytes = 0; /* irq handler must be registered after I/O ports are activated */ - if (request_irq(pci->irq, snd_emu10k1_interrupt, IRQF_SHARED, - KBUILD_MODNAME, emu)) { - err = -EBUSY; - goto error; - } + if (devm_request_irq(&pci->dev, pci->irq, snd_emu10k1_interrupt, + IRQF_SHARED, KBUILD_MODNAME, emu)) + return -EBUSY; emu->irq = pci->irq; card->sync_irq = emu->irq; @@ -2022,33 +1980,23 @@ int snd_emu10k1_create(struct snd_card *card, err = snd_emu10k1_init(emu, enable_ir, 0); if (err < 0) - goto error; + return err; #ifdef CONFIG_PM_SLEEP err = alloc_pm_buffer(emu); if (err < 0) - goto error; + return err; #endif /* Initialize the effect engine */ err = snd_emu10k1_init_efx(emu); if (err < 0) - goto error; + return err; snd_emu10k1_audio_enable(emu); - err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, emu, &ops); - if (err < 0) - goto error; - #ifdef CONFIG_SND_PROC_FS snd_emu10k1_proc_init(emu); #endif - - *remu = emu; return 0; - - error: - snd_emu10k1_free(emu); - return err; } #ifdef CONFIG_PM_SLEEP diff --git a/sound/pci/emu10k1/p16v.c b/sound/pci/emu10k1/p16v.c index ff2a3974c824..18a1b0740e6b 100644 --- a/sound/pci/emu10k1/p16v.c +++ b/sound/pci/emu10k1/p16v.c @@ -290,7 +290,7 @@ static int snd_p16v_pcm_prepare_playback(struct snd_pcm_substream *substream) struct snd_emu10k1 *emu = snd_pcm_substream_chip(substream); struct snd_pcm_runtime *runtime = substream->runtime; int channel = substream->pcm->device - emu->p16v_device_offset; - u32 *table_base = (u32 *)(emu->p16v_buffer.area+(8*16*channel)); + u32 *table_base = (u32 *)(emu->p16v_buffer->area+(8*16*channel)); u32 period_size_bytes = frames_to_bytes(runtime, runtime->period_size); int i; u32 tmp; @@ -308,8 +308,8 @@ static int snd_p16v_pcm_prepare_playback(struct snd_pcm_substream *substream) runtime->dma_addr, runtime->dma_area, table_base); dev_dbg(emu->card->dev, "dma_addr=%x, dma_area=%p, dma_bytes(size)=%x\n", - emu->p16v_buffer.addr, emu->p16v_buffer.area, - emu->p16v_buffer.bytes); + emu->p16v_buffer->addr, emu->p16v_buffer->area, + emu->p16v_buffer->bytes); #endif /* debug */ tmp = snd_emu10k1_ptr_read(emu, A_SPDIF_SAMPLERATE, channel); switch (runtime->rate) { @@ -333,7 +333,7 @@ static int snd_p16v_pcm_prepare_playback(struct snd_pcm_substream *substream) table_base[(i*2)+1]=period_size_bytes<<16; } - snd_emu10k1_ptr20_write(emu, PLAYBACK_LIST_ADDR, channel, emu->p16v_buffer.addr+(8*16*channel)); + snd_emu10k1_ptr20_write(emu, PLAYBACK_LIST_ADDR, channel, emu->p16v_buffer->addr+(8*16*channel)); snd_emu10k1_ptr20_write(emu, PLAYBACK_LIST_SIZE, channel, (runtime->periods - 1) << 19); snd_emu10k1_ptr20_write(emu, PLAYBACK_LIST_PTR, channel, 0); snd_emu10k1_ptr20_write(emu, PLAYBACK_DMA_ADDR, channel, runtime->dma_addr); @@ -567,20 +567,6 @@ static const struct snd_pcm_ops snd_p16v_capture_ops = { .pointer = snd_p16v_pcm_pointer_capture, }; - -int snd_p16v_free(struct snd_emu10k1 *chip) -{ - // release the data - if (chip->p16v_buffer.area) { - snd_dma_free_pages(&chip->p16v_buffer); - /* - dev_dbg(chip->card->dev, "period lables free: %p\n", - &chip->p16v_buffer); - */ - } - return 0; -} - int snd_p16v_pcm(struct snd_emu10k1 *emu, int device) { struct snd_pcm *pcm; From patchwork Thu Jul 15 07:58:56 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379277 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 12731C07E96 for ; Thu, 15 Jul 2021 08:14:34 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 8B083610E5 for ; Thu, 15 Jul 2021 08:14:33 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 8B083610E5 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id 227DC16BF; Thu, 15 Jul 2021 10:13:42 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 227DC16BF DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626336872; bh=koSf+qZIofxM1FbFMkCN5TR+RDLzM7vpaFnwA3onZhI=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=sixpUfskggq5af9HTiGqMlmLc5z7qA+QpMkhkxAmD6QCmYjjzplxGBQ4QLpwLITO+ xJsyoKV8lvQfClYhifwpjyX4pgOqagB+Y2ywxc83ugiq9b7lYBRxLpjf/WzeSzbgBN /MYG2wsbARHL5XKfWnK6WSvRADestQUPo/2ekjW4= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id 6373FF80649; Thu, 15 Jul 2021 10:01:00 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id 0E64DF80631; Thu, 15 Jul 2021 10:00:52 +0200 (CEST) Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 04F14F80518 for ; Thu, 15 Jul 2021 10:00:07 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 04F14F80518 Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="kRJVkp1L"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="qRWBVK3F" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out2.suse.de (Postfix) with ESMTP id D25371FDEB for ; Thu, 15 Jul 2021 08:00:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336006; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=GkA9CWpMRHhH3XexDHueFTfUV/dzJPEvgrksSDbn66M=; b=kRJVkp1L4KeTW4Z1LziwNmCyIp5ItbFnG9R1LcheRvwMYIZuEoLtp0anZGR0vL1B5lQoBd PTHb4mne6xgn5vKHOUccb5QjOw2sMOBv/CwUIlNGh0wyx5cL0LEzwyjvxVwSifBnitxrNT JniKyRtsGsD/ByNoF1EmLOkIzRMsQdo= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336006; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=GkA9CWpMRHhH3XexDHueFTfUV/dzJPEvgrksSDbn66M=; b=qRWBVK3FrTkhgL6dGIp2GkuEQQrNRy2pqZiizrgIcy1ghT4E9F2UqXymjlepUCNxG6tle8 pXW3pfgZWnfF9cBw== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id BFBCDA3B9E; Thu, 15 Jul 2021 08:00:06 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 34/79] ALSA: emu10k1x: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:58:56 +0200 Message-Id: <20210715075941.23332-35-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in PCI emu10k1x driver with devres as a clean up. Each manual resource management is converted with the corresponding devres helper, the page allocations are done with the devres helper, and the card object release is managed now via card->private_free instead of a lowlevel snd_device. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- sound/pci/emu10k1/emu10k1x.c | 128 ++++++++--------------------------- 1 file changed, 30 insertions(+), 98 deletions(-) diff --git a/sound/pci/emu10k1/emu10k1x.c b/sound/pci/emu10k1/emu10k1x.c index 89b0f3884067..c49c44dc1082 100644 --- a/sound/pci/emu10k1/emu10k1x.c +++ b/sound/pci/emu10k1/emu10k1x.c @@ -216,7 +216,6 @@ struct emu10k1x { struct pci_dev *pci; unsigned long port; - struct resource *res_port; int irq; unsigned char revision; /* chip revision */ @@ -233,7 +232,7 @@ struct emu10k1x { struct emu10k1x_voice capture_voice; u32 spdif_bits[3]; // SPDIF out setup - struct snd_dma_buffer dma_buffer; + struct snd_dma_buffer *dma_buffer; struct emu10k1x_midi midi; }; @@ -442,7 +441,7 @@ static int snd_emu10k1x_pcm_prepare(struct snd_pcm_substream *substream) struct snd_pcm_runtime *runtime = substream->runtime; struct emu10k1x_pcm *epcm = runtime->private_data; int voice = epcm->voice->number; - u32 *table_base = (u32 *)(emu->dma_buffer.area+1024*voice); + u32 *table_base = (u32 *)(emu->dma_buffer->area+1024*voice); u32 period_size_bytes = frames_to_bytes(runtime, runtime->period_size); int i; @@ -451,7 +450,7 @@ static int snd_emu10k1x_pcm_prepare(struct snd_pcm_substream *substream) *table_base++=period_size_bytes<<16; } - snd_emu10k1x_ptr_write(emu, PLAYBACK_LIST_ADDR, voice, emu->dma_buffer.addr+1024*voice); + snd_emu10k1x_ptr_write(emu, PLAYBACK_LIST_ADDR, voice, emu->dma_buffer->addr+1024*voice); snd_emu10k1x_ptr_write(emu, PLAYBACK_LIST_SIZE, voice, (runtime->periods - 1) << 19); snd_emu10k1x_ptr_write(emu, PLAYBACK_LIST_PTR, voice, 0); snd_emu10k1x_ptr_write(emu, PLAYBACK_POINTER, voice, 0); @@ -737,37 +736,15 @@ static int snd_emu10k1x_ac97(struct emu10k1x *chip) return snd_ac97_mixer(pbus, &ac97, &chip->ac97); } -static int snd_emu10k1x_free(struct emu10k1x *chip) +static void snd_emu10k1x_free(struct snd_card *card) { + struct emu10k1x *chip = card->private_data; + snd_emu10k1x_ptr_write(chip, TRIGGER_CHANNEL, 0, 0); // disable interrupts outl(0, chip->port + INTE); // disable audio outl(HCFG_LOCKSOUNDCACHE, chip->port + HCFG); - - /* release the irq */ - if (chip->irq >= 0) - free_irq(chip->irq, chip); - - // release the i/o port - release_and_free_resource(chip->res_port); - - // release the DMA - if (chip->dma_buffer.area) { - snd_dma_free_pages(&chip->dma_buffer); - } - - pci_disable_device(chip->pci); - - // release the data - kfree(chip); - return 0; -} - -static int snd_emu10k1x_dev_free(struct snd_device *device) -{ - struct emu10k1x *chip = device->device_data; - return snd_emu10k1x_free(chip); } static irqreturn_t snd_emu10k1x_interrupt(int irq, void *dev_id) @@ -885,34 +862,21 @@ static int snd_emu10k1x_pcm(struct emu10k1x *emu, int device) } static int snd_emu10k1x_create(struct snd_card *card, - struct pci_dev *pci, - struct emu10k1x **rchip) + struct pci_dev *pci) { - struct emu10k1x *chip; + struct emu10k1x *chip = card->private_data; int err; int ch; - static const struct snd_device_ops ops = { - .dev_free = snd_emu10k1x_dev_free, - }; - - *rchip = NULL; - err = pci_enable_device(pci); + err = pcim_enable_device(pci); if (err < 0) return err; if (dma_set_mask_and_coherent(&pci->dev, DMA_BIT_MASK(28)) < 0) { dev_err(card->dev, "error to set 28bit mask DMA\n"); - pci_disable_device(pci); return -ENXIO; } - chip = kzalloc(sizeof(*chip), GFP_KERNEL); - if (chip == NULL) { - pci_disable_device(pci); - return -ENOMEM; - } - chip->card = card; chip->pci = pci; chip->irq = -1; @@ -920,29 +884,24 @@ static int snd_emu10k1x_create(struct snd_card *card, spin_lock_init(&chip->emu_lock); spin_lock_init(&chip->voice_lock); + err = pci_request_regions(pci, "EMU10K1X"); + if (err < 0) + return err; chip->port = pci_resource_start(pci, 0); - chip->res_port = request_region(chip->port, 8, "EMU10K1X"); - if (!chip->res_port) { - dev_err(card->dev, "cannot allocate the port 0x%lx\n", - chip->port); - snd_emu10k1x_free(chip); - return -EBUSY; - } - if (request_irq(pci->irq, snd_emu10k1x_interrupt, - IRQF_SHARED, KBUILD_MODNAME, chip)) { + if (devm_request_irq(&pci->dev, pci->irq, snd_emu10k1x_interrupt, + IRQF_SHARED, KBUILD_MODNAME, chip)) { dev_err(card->dev, "cannot grab irq %d\n", pci->irq); - snd_emu10k1x_free(chip); return -EBUSY; } chip->irq = pci->irq; card->sync_irq = chip->irq; + card->private_free = snd_emu10k1x_free; - if (snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, &pci->dev, - 4 * 1024, &chip->dma_buffer) < 0) { - snd_emu10k1x_free(chip); + chip->dma_buffer = snd_devm_alloc_pages(&pci->dev, SNDRV_DMA_TYPE_DEV, + 4 * 1024); + if (!chip->dma_buffer) return -ENOMEM; - } pci_set_master(pci); /* read revision & serial */ @@ -998,12 +957,6 @@ static int snd_emu10k1x_create(struct snd_card *card, outl(HCFG_LOCKSOUNDCACHE|HCFG_AUDIOENABLE, chip->port+HCFG); - err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops); - if (err < 0) { - snd_emu10k1x_free(chip); - return err; - } - *rchip = chip; return 0; } @@ -1553,50 +1506,37 @@ static int snd_emu10k1x_probe(struct pci_dev *pci, return -ENOENT; } - err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, - 0, &card); + err = snd_devm_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, + sizeof(*chip), &card); if (err < 0) return err; + chip = card->private_data; - err = snd_emu10k1x_create(card, pci, &chip); - if (err < 0) { - snd_card_free(card); + err = snd_emu10k1x_create(card, pci); + if (err < 0) return err; - } err = snd_emu10k1x_pcm(chip, 0); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } err = snd_emu10k1x_pcm(chip, 1); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } err = snd_emu10k1x_pcm(chip, 2); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } err = snd_emu10k1x_ac97(chip); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } err = snd_emu10k1x_mixer(chip); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } err = snd_emu10k1x_midi(chip); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } snd_emu10k1x_proc_init(chip); @@ -1606,21 +1546,14 @@ static int snd_emu10k1x_probe(struct pci_dev *pci, card->shortname, chip->port, chip->irq); err = snd_card_register(card); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } pci_set_drvdata(pci, card); dev++; return 0; } -static void snd_emu10k1x_remove(struct pci_dev *pci) -{ - snd_card_free(pci_get_drvdata(pci)); -} - // PCI IDs static const struct pci_device_id snd_emu10k1x_ids[] = { { PCI_VDEVICE(CREATIVE, 0x0006), 0 }, /* Dell OEM version (EMU10K1) */ @@ -1633,7 +1566,6 @@ static struct pci_driver emu10k1x_driver = { .name = KBUILD_MODNAME, .id_table = snd_emu10k1x_ids, .probe = snd_emu10k1x_probe, - .remove = snd_emu10k1x_remove, }; module_pci_driver(emu10k1x_driver); From patchwork Thu Jul 15 07:58:57 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379281 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id A075DC07E96 for ; Thu, 15 Jul 2021 08:15:13 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 18F016117A for ; Thu, 15 Jul 2021 08:15:13 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 18F016117A Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id B2AA816E9; Thu, 15 Jul 2021 10:14:21 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz B2AA816E9 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626336911; bh=Gx8Ju0LI1Yf83GMoEeBoCRWdCveBfW1BghwUSSMIQlE=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=mCldbSpnacPzblit7I4ZJujbqm6pPbvvaCwGZS7z642yUMWNQ6YUs2AQ92b1bCb5j hck/2JzK/PhoESNXlCCrADSAPCqYHIWcHSYnMCl1v5x1rR6XEt+7DQodyYpSFtrD5T Ki9odBAWnm5yhFeh3yf5Ps+vIew3+2Xh+PlIhtzo= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id B51CDF8065E; Thu, 15 Jul 2021 10:01:03 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id 96FC3F8051A; Thu, 15 Jul 2021 10:00:55 +0200 (CEST) Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 6DC51F8013C for ; Thu, 15 Jul 2021 10:00:07 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 6DC51F8013C Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="xRbFhAOB"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="Q34THogv" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out1.suse.de (Postfix) with ESMTP id 4356E2284F for ; Thu, 15 Jul 2021 08:00:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336007; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=NBcKzorYb9+0sCrQplrVQnJeq0EmRZlXhtZN/SLyW74=; b=xRbFhAOB+Ki4afsCnJpKMcyz6oVX+dYrQDx9B+SUGV1sPCaB1V4gMnMtcezkeK5PxEX+FF UqTvBDVaTbXS1BB8yq2+0gu0T7gUwdUDIVQXKvtzVPBogEhLG4EXsTCouIvbPmnxuefO1V GcRdfjVG3K75/zyNgTB/5+bCepJlOig= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336007; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=NBcKzorYb9+0sCrQplrVQnJeq0EmRZlXhtZN/SLyW74=; b=Q34THogvhgtPTQTNHCdaZfr1clqHKblYRScxssCr4AwoMs6DpXeYCt4sQYxQdhlukCTZDu PAFx3CZMlO560aDQ== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id 30236A3BA7; Thu, 15 Jul 2021 08:00:07 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 35/79] ALSA: ice1712: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:58:57 +0200 Message-Id: <20210715075941.23332-36-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in PCI ice1712 driver with devres as a clean up. Each manual resource management is converted with the corresponding devres helper, and the card object release is managed now via card->private_free instead of a lowlevel snd_device. Along with it, the chip_exit callback chain is moved into the card's private_free instead of the PCI remove callback, too. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- sound/pci/ice1712/ice1712.c | 133 ++++++++---------------------------- 1 file changed, 30 insertions(+), 103 deletions(-) diff --git a/sound/pci/ice1712/ice1712.c b/sound/pci/ice1712/ice1712.c index d54cd5143e9f..a5241a287851 100644 --- a/sound/pci/ice1712/ice1712.c +++ b/sound/pci/ice1712/ice1712.c @@ -2432,31 +2432,18 @@ static int snd_ice1712_build_controls(struct snd_ice1712 *ice) snd_ctl_new1(&snd_ice1712_mixer_pro_peak, ice)); } -static int snd_ice1712_free(struct snd_ice1712 *ice) +static void snd_ice1712_free(struct snd_card *card) { - if (!ice->port) - goto __hw_end; + struct snd_ice1712 *ice = card->private_data; + + if (ice->card_info && ice->card_info->chip_exit) + ice->card_info->chip_exit(ice); + /* mask all interrupts */ outb(ICE1712_MULTI_CAPTURE | ICE1712_MULTI_PLAYBACK, ICEMT(ice, IRQ)); outb(0xff, ICEREG(ice, IRQMASK)); - /* --- */ -__hw_end: - if (ice->irq >= 0) - free_irq(ice->irq, ice); - if (ice->port) - pci_release_regions(ice->pci); snd_ice1712_akm4xxx_free(ice); - pci_disable_device(ice->pci); - kfree(ice->spec); - kfree(ice); - return 0; -} - -static int snd_ice1712_dev_free(struct snd_device *device) -{ - struct snd_ice1712 *ice = device->device_data; - return snd_ice1712_free(ice); } static int snd_ice1712_create(struct snd_card *card, @@ -2464,34 +2451,22 @@ static int snd_ice1712_create(struct snd_card *card, const char *modelname, int omni, int cs8427_timeout, - int dxr_enable, - struct snd_ice1712 **r_ice1712) + int dxr_enable) { - struct snd_ice1712 *ice; + struct snd_ice1712 *ice = card->private_data; int err; - static const struct snd_device_ops ops = { - .dev_free = snd_ice1712_dev_free, - }; - - *r_ice1712 = NULL; /* enable PCI device */ - err = pci_enable_device(pci); + err = pcim_enable_device(pci); if (err < 0) return err; /* check, if we can restrict PCI DMA transfers to 28 bits */ if (dma_set_mask_and_coherent(&pci->dev, DMA_BIT_MASK(28))) { dev_err(card->dev, "architecture does not support 28bit PCI busmaster DMA\n"); - pci_disable_device(pci); return -ENXIO; } - ice = kzalloc(sizeof(*ice), GFP_KERNEL); - if (ice == NULL) { - pci_disable_device(pci); - return -ENOMEM; - } ice->omni = omni ? 1 : 0; if (cs8427_timeout < 1) cs8427_timeout = 1; @@ -2523,45 +2498,29 @@ static int snd_ice1712_create(struct snd_card *card, pci_write_config_word(ice->pci, 0x42, 0x0006); snd_ice1712_proc_init(ice); - card->private_data = ice; - err = pci_request_regions(pci, "ICE1712"); - if (err < 0) { - kfree(ice); - pci_disable_device(pci); + if (err < 0) return err; - } ice->port = pci_resource_start(pci, 0); ice->ddma_port = pci_resource_start(pci, 1); ice->dmapath_port = pci_resource_start(pci, 2); ice->profi_port = pci_resource_start(pci, 3); - if (request_irq(pci->irq, snd_ice1712_interrupt, IRQF_SHARED, - KBUILD_MODNAME, ice)) { + if (devm_request_irq(&pci->dev, pci->irq, snd_ice1712_interrupt, + IRQF_SHARED, KBUILD_MODNAME, ice)) { dev_err(card->dev, "unable to grab IRQ %d\n", pci->irq); - snd_ice1712_free(ice); return -EIO; } ice->irq = pci->irq; card->sync_irq = ice->irq; + card->private_free = snd_ice1712_free; - if (snd_ice1712_read_eeprom(ice, modelname) < 0) { - snd_ice1712_free(ice); + if (snd_ice1712_read_eeprom(ice, modelname) < 0) return -EIO; - } - if (snd_ice1712_chip_init(ice) < 0) { - snd_ice1712_free(ice); + if (snd_ice1712_chip_init(ice) < 0) return -EIO; - } - - err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, ice, &ops); - if (err < 0) { - snd_ice1712_free(ice); - return err; - } - *r_ice1712 = ice; return 0; } @@ -2591,34 +2550,31 @@ static int snd_ice1712_probe(struct pci_dev *pci, } err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, - 0, &card); + sizeof(*ice), &card); if (err < 0) return err; + ice = card->private_data; strcpy(card->driver, "ICE1712"); strcpy(card->shortname, "ICEnsemble ICE1712"); err = snd_ice1712_create(card, pci, model[dev], omni[dev], - cs8427_timeout[dev], dxr_enable[dev], &ice); - if (err < 0) { - snd_card_free(card); + cs8427_timeout[dev], dxr_enable[dev]); + if (err < 0) return err; - } for (tbl = card_tables; *tbl; tbl++) { for (c = *tbl; c->subvendor; c++) { if (c->subvendor == ice->eeprom.subvendor) { - ice->card_info = c; strcpy(card->shortname, c->name); if (c->driver) /* specific driver? */ strcpy(card->driver, c->driver); if (c->chip_init) { err = c->chip_init(ice); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } } + ice->card_info = c; goto __found; } } @@ -2627,45 +2583,33 @@ static int snd_ice1712_probe(struct pci_dev *pci, __found: err = snd_ice1712_pcm_profi(ice, pcm_dev++); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } if (ice_has_con_ac97(ice)) { err = snd_ice1712_pcm(ice, pcm_dev++); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } } err = snd_ice1712_ac97_mixer(ice); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } err = snd_ice1712_build_controls(ice); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } if (c->build_controls) { err = c->build_controls(ice); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } } if (ice_has_con_ac97(ice)) { err = snd_ice1712_pcm_ds(ice, pcm_dev++); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } } if (!c->no_mpu401) { @@ -2674,10 +2618,8 @@ static int snd_ice1712_probe(struct pci_dev *pci, c->mpu401_1_info_flags | MPU401_INFO_INTEGRATED | MPU401_INFO_IRQ_HOOK, -1, &ice->rmidi[0]); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } if (c->mpu401_1_name) /* Preferred name available in card_info */ snprintf(ice->rmidi[0]->name, @@ -2692,10 +2634,8 @@ static int snd_ice1712_probe(struct pci_dev *pci, MPU401_INFO_INTEGRATED | MPU401_INFO_IRQ_HOOK, -1, &ice->rmidi[1]); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } if (c->mpu401_2_name) /* Preferred name available in card_info */ snprintf(ice->rmidi[1]->name, @@ -2711,25 +2651,13 @@ static int snd_ice1712_probe(struct pci_dev *pci, card->shortname, ice->port, ice->irq); err = snd_card_register(card); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } pci_set_drvdata(pci, card); dev++; return 0; } -static void snd_ice1712_remove(struct pci_dev *pci) -{ - struct snd_card *card = pci_get_drvdata(pci); - struct snd_ice1712 *ice = card->private_data; - - if (ice->card_info && ice->card_info->chip_exit) - ice->card_info->chip_exit(ice); - snd_card_free(card); -} - #ifdef CONFIG_PM_SLEEP static int snd_ice1712_suspend(struct device *dev) { @@ -2810,7 +2738,6 @@ static struct pci_driver ice1712_driver = { .name = KBUILD_MODNAME, .id_table = snd_ice1712_ids, .probe = snd_ice1712_probe, - .remove = snd_ice1712_remove, .driver = { .pm = SND_VT1712_PM_OPS, }, From patchwork Thu Jul 15 07:58:58 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379285 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id BA692C07E96 for ; Thu, 15 Jul 2021 08:16:06 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 34C5F6117A for ; Thu, 15 Jul 2021 08:16:06 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 34C5F6117A Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id B644D1748; Thu, 15 Jul 2021 10:15:14 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz B644D1748 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626336964; bh=yinoVpqHxEtfVFvUbQnGSWyjU6qLhovuCSgOHV/63ro=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=DR/Fkgiwh+dPNOAAoM2ddtF0rtORFe4lz//alkaBy6hjzz+lIBiZ6GmPGyal4qFSa VLgbHmd61JeyrMoLLWm8D+yNLUDiCM+7uX4huFLMDin3gYvvd0VGjdeyepDTwk5y/k bQfbkoY9WlxCkb+fTgaS6txtU/xsFSwHDuv0b86w= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id 7F278F80678; Thu, 15 Jul 2021 10:01:07 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id DA2F5F80638; Thu, 15 Jul 2021 10:00:56 +0200 (CEST) Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id CA857F80515 for ; Thu, 15 Jul 2021 10:00:07 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz CA857F80515 Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="NLuGBO21"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="TKJUZMNn" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out1.suse.de (Postfix) with ESMTP id 9F81922852 for ; Thu, 15 Jul 2021 08:00:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336007; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=yqc3z8b/mRbzn+Osqv1WrJQcGHc6KAh7H2dy+A+vKvY=; b=NLuGBO21lN8ag7YPzTatUIMXluM/YmERzFF3MopkpXZDyveworw5bob3NVDSsF7U8150B+ Nu1pAmzGatP8oMKJhXuyWQHJ/eIMRtWlZI676eBj3Lo6mr7gelX2G7+fPp61/xr+EQ8eBL BU9tBzmmFMzwU20hTbDvGMklZoJkzF4= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336007; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=yqc3z8b/mRbzn+Osqv1WrJQcGHc6KAh7H2dy+A+vKvY=; b=TKJUZMNn/IzIfD6fLJWmgmyyZGsEr4HPgqb6613VQbQguE/Whnz0BV1XMcfhFmlZoENEcj Kzl9jKYzQPIHimDA== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id 8D7C1A3BAB; Thu, 15 Jul 2021 08:00:07 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 36/79] ALSA: ice1724: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:58:58 +0200 Message-Id: <20210715075941.23332-37-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in PCI ice1724 driver with devres as a clean up. Each manual resource management is converted with the corresponding devres helper, and the card object release is managed now via card->private_free instead of a lowlevel snd_device. Along with it, the chip_exit callback chain is moved into the card's private_free instead of the PCI remove callback, too. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- sound/pci/ice1712/ice1724.c | 127 ++++++++---------------------------- 1 file changed, 27 insertions(+), 100 deletions(-) diff --git a/sound/pci/ice1712/ice1724.c b/sound/pci/ice1712/ice1724.c index 8052d7cb8925..1cd84f9338f3 100644 --- a/sound/pci/ice1712/ice1724.c +++ b/sound/pci/ice1712/ice1724.c @@ -2447,54 +2447,29 @@ static int snd_vt1724_build_controls(struct snd_ice1712 *ice) snd_ctl_new1(&snd_vt1724_mixer_pro_peak, ice)); } -static int snd_vt1724_free(struct snd_ice1712 *ice) +static void snd_vt1724_free(struct snd_card *card) { - if (!ice->port) - goto __hw_end; + struct snd_ice1712 *ice = card->private_data; + /* mask all interrupts */ outb(0xff, ICEMT1724(ice, DMA_INT_MASK)); outb(0xff, ICEREG1724(ice, IRQMASK)); - /* --- */ -__hw_end: - if (ice->irq >= 0) - free_irq(ice->irq, ice); - pci_release_regions(ice->pci); - snd_ice1712_akm4xxx_free(ice); - pci_disable_device(ice->pci); - kfree(ice->spec); - kfree(ice); - return 0; -} -static int snd_vt1724_dev_free(struct snd_device *device) -{ - struct snd_ice1712 *ice = device->device_data; - return snd_vt1724_free(ice); + snd_ice1712_akm4xxx_free(ice); } static int snd_vt1724_create(struct snd_card *card, struct pci_dev *pci, - const char *modelname, - struct snd_ice1712 **r_ice1712) + const char *modelname) { struct snd_ice1712 *ice; int err; - static const struct snd_device_ops ops = { - .dev_free = snd_vt1724_dev_free, - }; - - *r_ice1712 = NULL; /* enable PCI device */ - err = pci_enable_device(pci); + err = pcim_enable_device(pci); if (err < 0) return err; - ice = kzalloc(sizeof(*ice), GFP_KERNEL); - if (ice == NULL) { - pci_disable_device(pci); - return -ENOMEM; - } ice->vt1724 = 1; spin_lock_init(&ice->reg_lock); mutex_init(&ice->gpio_mutex); @@ -2512,44 +2487,28 @@ static int snd_vt1724_create(struct snd_card *card, pci_set_master(pci); snd_vt1724_proc_init(ice); - card->private_data = ice; - err = pci_request_regions(pci, "ICE1724"); - if (err < 0) { - kfree(ice); - pci_disable_device(pci); + if (err < 0) return err; - } ice->port = pci_resource_start(pci, 0); ice->profi_port = pci_resource_start(pci, 1); - if (request_irq(pci->irq, snd_vt1724_interrupt, - IRQF_SHARED, KBUILD_MODNAME, ice)) { + if (devm_request_irq(&pci->dev, pci->irq, snd_vt1724_interrupt, + IRQF_SHARED, KBUILD_MODNAME, ice)) { dev_err(card->dev, "unable to grab IRQ %d\n", pci->irq); - snd_vt1724_free(ice); return -EIO; } ice->irq = pci->irq; card->sync_irq = ice->irq; + card->private_free = snd_vt1724_free; snd_vt1724_chip_reset(ice); - if (snd_vt1724_read_eeprom(ice, modelname) < 0) { - snd_vt1724_free(ice); + if (snd_vt1724_read_eeprom(ice, modelname) < 0) return -EIO; - } - if (snd_vt1724_chip_init(ice) < 0) { - snd_vt1724_free(ice); + if (snd_vt1724_chip_init(ice) < 0) return -EIO; - } - err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, ice, &ops); - if (err < 0) { - snd_vt1724_free(ice); - return err; - } - - *r_ice1712 = ice; return 0; } @@ -2576,19 +2535,18 @@ static int snd_vt1724_probe(struct pci_dev *pci, return -ENOENT; } - err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, - 0, &card); + err = snd_devm_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, + sizeof(*ice), &card); if (err < 0) return err; + ice = card->private_data; strcpy(card->driver, "ICE1724"); strcpy(card->shortname, "ICEnsemble ICE1724"); - err = snd_vt1724_create(card, pci, model[dev], &ice); - if (err < 0) { - snd_card_free(card); + err = snd_vt1724_create(card, pci, model[dev]); + if (err < 0) return err; - } /* field init before calling chip_init */ ice->ext_clock_count = 0; @@ -2600,10 +2558,8 @@ static int snd_vt1724_probe(struct pci_dev *pci, strcpy(card->driver, c->driver); if (c->chip_init) { err = c->chip_init(ice); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } } } @@ -2637,49 +2593,35 @@ static int snd_vt1724_probe(struct pci_dev *pci, set_std_hw_rates(ice); err = snd_vt1724_pcm_profi(ice, pcm_dev++); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } err = snd_vt1724_pcm_spdif(ice, pcm_dev++); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } err = snd_vt1724_pcm_indep(ice, pcm_dev++); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } err = snd_vt1724_ac97_mixer(ice); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } err = snd_vt1724_build_controls(ice); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } if (ice->pcm && ice->has_spdif) { /* has SPDIF I/O */ err = snd_vt1724_spdif_build_controls(ice); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } } if (c && c->build_controls) { err = c->build_controls(ice); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } } if (!c || !c->no_mpu401) { @@ -2687,10 +2629,8 @@ static int snd_vt1724_probe(struct pci_dev *pci, struct snd_rawmidi *rmidi; err = snd_rawmidi_new(card, "MIDI", 0, 1, 1, &rmidi); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } ice->rmidi[0] = rmidi; rmidi->private_data = ice; strcpy(rmidi->name, "ICE1724 MIDI"); @@ -2715,25 +2655,13 @@ static int snd_vt1724_probe(struct pci_dev *pci, card->shortname, ice->port, ice->irq); err = snd_card_register(card); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } pci_set_drvdata(pci, card); dev++; return 0; } -static void snd_vt1724_remove(struct pci_dev *pci) -{ - struct snd_card *card = pci_get_drvdata(pci); - struct snd_ice1712 *ice = card->private_data; - - if (ice->card_info && ice->card_info->chip_exit) - ice->card_info->chip_exit(ice); - snd_card_free(card); -} - #ifdef CONFIG_PM_SLEEP static int snd_vt1724_suspend(struct device *dev) { @@ -2811,7 +2739,6 @@ static struct pci_driver vt1724_driver = { .name = KBUILD_MODNAME, .id_table = snd_vt1724_ids, .probe = snd_vt1724_probe, - .remove = snd_vt1724_remove, .driver = { .pm = SND_VT1724_PM_OPS, }, From patchwork Thu Jul 15 07:58:59 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379283 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id E50CDC47E48 for ; Thu, 15 Jul 2021 08:15:29 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 62EEF610E5 for ; Thu, 15 Jul 2021 08:15:29 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 62EEF610E5 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id F21FB1738; Thu, 15 Jul 2021 10:14:37 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz F21FB1738 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626336928; bh=NcxQpu8wBNQJ2essY+Ipq0ApuQvhPxzrAmJfslflcyE=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=CXKgINtASBZnNwW2jHkCmT8g0O+Wq8Xbmd8yxQ9YCVMkC+DkVbStP+/U4LdNItA6f 7Zo6Ph9igNcfxDQLgZtiLtXuIZ6LU8mD+5ewxL5mrn7wKYs1ErxdatVNpIUL4bmCiP 9NFxwEeS5gHJnzfbaF91UtenxpT5F8MN8AoVOoCQ= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id C0708F8020C; Thu, 15 Jul 2021 10:01:04 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id 02A50F80637; Thu, 15 Jul 2021 10:00:55 +0200 (CEST) Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 37592F80517 for ; Thu, 15 Jul 2021 10:00:08 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 37592F80517 Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="ZiCMYKGw"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="9QQOJS9h" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out1.suse.de (Postfix) with ESMTP id 04E4422854 for ; Thu, 15 Jul 2021 08:00:08 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336008; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=5gPueraixoIVM02jU0IW2XB+HujyRxzkBWSTfK1cBgE=; b=ZiCMYKGwe7VykGtA07lIRw4k8sHYDlRxyzx0KTl4XmuScat/cowuqDomPGxq3gG6smnK9c L+6oEyG3IgGwUCQRPkpBXx8exDW2m9/9k7/Edrao20tqc2Ak+YL1+pWzEtZfAfxTFd1K0t azzveMJtPm+bcfz6Ff/DcU2WQFGCQrs= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336008; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=5gPueraixoIVM02jU0IW2XB+HujyRxzkBWSTfK1cBgE=; b=9QQOJS9hhNEJ90c8Fc6l93MABa5NMxb2CPIuC9KSvs9Hhxmo2odcUxn7qJUxkn64x4mQLp UuHnrWkBQvfX/aDw== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id E9336A3BB0; Thu, 15 Jul 2021 08:00:07 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 37/79] ALSA: ali5451: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:58:59 +0200 Message-Id: <20210715075941.23332-38-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in PCI ali5451 driver with devres as a clean up. Each manual resource management is converted with the corresponding devres helper, and the card object release is managed now via card->private_free instead of a lowlevel snd_device. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- sound/pci/ali5451/ali5451.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sound/pci/ali5451/ali5451.c b/sound/pci/ali5451/ali5451.c index ccbf9e2c72d6..92eb59db106d 100644 --- a/sound/pci/ali5451/ali5451.c +++ b/sound/pci/ali5451/ali5451.c @@ -2026,7 +2026,7 @@ static int snd_ali_create(struct snd_card *card, int pcm_streams, int spdif_support) { - struct snd_ali *codec; + struct snd_ali *codec = card->private_data; int i, err; unsigned short cmdw; From patchwork Thu Jul 15 07:59:00 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379279 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id DAB3CC07E96 for ; Thu, 15 Jul 2021 08:14:50 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 6322B61167 for ; Thu, 15 Jul 2021 08:14:50 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 6322B61167 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id E933A173C; Thu, 15 Jul 2021 10:13:58 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz E933A173C DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626336889; bh=j+3MgOZmZKVKtzbbjz1Mzbk9o2G4JAd+6kiHZ3MmcdQ=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=lp5gCDuU4hNjcAnkXXubrFEg3IgZNKLLWzXLk0+mWV2iYPfCLDDaQMJ/WY1jeLgV1 dwb5vhgXkk/W4SHcMyl7xVxxsBHsNQBtr3x4cyTDHeKkEFAq9ENpgaDqhvaWfw8pIa m/q3aW1eECJUhI6s4PQYtuGT9+Ltv4/CYeLAob3c= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id BB6B6F80519; Thu, 15 Jul 2021 10:01:01 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id 0B60CF80638; Thu, 15 Jul 2021 10:00:54 +0200 (CEST) Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 8C0F4F8051A for ; Thu, 15 Jul 2021 10:00:08 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 8C0F4F8051A Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="MFYCCa73"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="NXcUJrcI" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out1.suse.de (Postfix) with ESMTP id 5CFDC22855 for ; Thu, 15 Jul 2021 08:00:08 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336008; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=ua8gmzrmMRlKfY8bWvwnA52EO+DkpfM31m/tYg78vkQ=; b=MFYCCa73OMLNrqdD6KUl9wxKRWxSaKSrCCTrSSsbkJaZw+GMvmh1VHkz3FhLD56SucaVCP QdmN+BlHv25bjTDVbEyjMc4WJ6QM695BsN9aWGb/N3J01pi3iByLiej3Zck1sy8xqUPzNA 7ukTnIzKKU6NFTcHMZywdnD52MUPbmo= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336008; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=ua8gmzrmMRlKfY8bWvwnA52EO+DkpfM31m/tYg78vkQ=; b=NXcUJrcI6wPbMYskkboBZLH3ieJVbXgnGHv0eiCYp4ysW/FR98iJvxmj9GMDxHTrik+Xao qZ/aQiHkxa0/GwCg== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id 4D428A3BB6; Thu, 15 Jul 2021 08:00:08 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 38/79] ALSA: ice1724: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:59:00 +0200 Message-Id: <20210715075941.23332-39-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in PCI ice1724 driver with devres as a clean up. Each manual resource management is converted with the corresponding devres helper, and the card object release is managed now via card->private_free instead of a lowlevel snd_device. Along with it, the chip_exit callback chain is moved into the card's private_free instead of the PCI remove callback, too. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- sound/pci/ice1712/ice1724.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sound/pci/ice1712/ice1724.c b/sound/pci/ice1712/ice1724.c index 1cd84f9338f3..f6275868877a 100644 --- a/sound/pci/ice1712/ice1724.c +++ b/sound/pci/ice1712/ice1724.c @@ -2462,7 +2462,7 @@ static int snd_vt1724_create(struct snd_card *card, struct pci_dev *pci, const char *modelname) { - struct snd_ice1712 *ice; + struct snd_ice1712 *ice = card->private_data; int err; /* enable PCI device */ From patchwork Thu Jul 15 07:59:01 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379287 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id A8685C07E96 for ; Thu, 15 Jul 2021 08:16:22 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 19B406117A for ; Thu, 15 Jul 2021 08:16:22 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 19B406117A Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id A1ACC173C; Thu, 15 Jul 2021 10:15:30 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz A1ACC173C DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626336980; bh=oeR6i+uFUwsCmUJ0zHdNC/j7IGFXm8A5+Zi1PePtcz4=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=myR5gU5PwOkU9inJSXGUCYvgmeZeoYVTQEC0/bKfqqexHdkiwKlY5A57J+xIDgBj7 3x80WFg2W9IhIs4Qb0oQu7kZJomayO+Pupk6nJPd36G9Nu6zaXwSIq6388lIh4OOG3 676NAEHF3B91YFfyPjHTNW3tVmqqin4QwtWh0tB0= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id 79244F8067A; Thu, 15 Jul 2021 10:01:08 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id DEFAFF8065E; Thu, 15 Jul 2021 10:01:02 +0200 (CEST) Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id E4F3FF8051C for ; Thu, 15 Jul 2021 10:00:08 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz E4F3FF8051C Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="LMc5WAJd"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="CDJk5Bq4" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out1.suse.de (Postfix) with ESMTP id B20452284F for ; Thu, 15 Jul 2021 08:00:08 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336008; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=tVSYCtA/9mDhb6inb5s+c97+UjZmWRkAMNL7BQan+JI=; b=LMc5WAJdA5g9GS0AxqQdh4MN9/Lm5zQ8Xh/UVHWomTX+11Z7KTMoEpwVbMMSBcQB+b8fD4 PEMmsqIhH6MNolGsdAW5ED8EXA4C/LGHj3wUW2/cKx6JZt69eSIxCqO3tBFEAZWlcfZpZ1 Twbl3qCAZgAaV5AKcDVPly8T+RHcZtM= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336008; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=tVSYCtA/9mDhb6inb5s+c97+UjZmWRkAMNL7BQan+JI=; b=CDJk5Bq4bSnKYVq0oElJn08TJFNFhlk4kPjpJPrBHzrueET858JJijYq06Ci2YmjUDzrfB 1y0bFszmPPfL71AA== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id AB024A3BB6; Thu, 15 Jul 2021 08:00:08 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 39/79] ALSA: korg1212: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:59:01 +0200 Message-Id: <20210715075941.23332-40-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in PCI korg1212 driver with devres as a clean up. Each manual resource management is converted with the corresponding devres helper, the page allocations are done with the devres helper, and the card object release is managed now via card->private_free instead of a lowlevel snd_device. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai Reported-by: Nathan Chancellor Signed-off-by: Takashi Iwai --- sound/pci/korg1212/korg1212.c | 211 +++++++++------------------------- 1 file changed, 55 insertions(+), 156 deletions(-) diff --git a/sound/pci/korg1212/korg1212.c b/sound/pci/korg1212/korg1212.c index 030e01b062e4..7872abbd4587 100644 --- a/sound/pci/korg1212/korg1212.c +++ b/sound/pci/korg1212/korg1212.c @@ -320,10 +320,10 @@ struct snd_korg1212 { unsigned long inIRQ; void __iomem *iobase; - struct snd_dma_buffer dma_dsp; - struct snd_dma_buffer dma_play; - struct snd_dma_buffer dma_rec; - struct snd_dma_buffer dma_shared; + struct snd_dma_buffer *dma_dsp; + struct snd_dma_buffer *dma_play; + struct snd_dma_buffer *dma_rec; + struct snd_dma_buffer *dma_shared; u32 DataBufsSize; @@ -1200,8 +1200,8 @@ static int snd_korg1212_downloadDSPCode(struct snd_korg1212 *korg1212) snd_korg1212_setCardState(korg1212, K1212_STATE_DSP_IN_PROCESS); rc = snd_korg1212_Send1212Command(korg1212, K1212_DB_StartDSPDownload, - UpperWordSwap(korg1212->dma_dsp.addr), - 0, 0, 0); + UpperWordSwap(korg1212->dma_dsp->addr), + 0, 0, 0); if (rc) K1212_DEBUG_PRINTK("K1212_DEBUG: Start DSP Download RC = %d [%s]\n", rc, stateName[korg1212->cardState]); @@ -1382,7 +1382,7 @@ static int snd_korg1212_playback_open(struct snd_pcm_substream *substream) snd_korg1212_OpenCard(korg1212); runtime->hw = snd_korg1212_playback_info; - snd_pcm_set_runtime_buffer(substream, &korg1212->dma_play); + snd_pcm_set_runtime_buffer(substream, korg1212->dma_play); spin_lock_irqsave(&korg1212->lock, flags); @@ -1413,7 +1413,7 @@ static int snd_korg1212_capture_open(struct snd_pcm_substream *substream) snd_korg1212_OpenCard(korg1212); runtime->hw = snd_korg1212_capture_info; - snd_pcm_set_runtime_buffer(substream, &korg1212->dma_rec); + snd_pcm_set_runtime_buffer(substream, korg1212->dma_rec); spin_lock_irqsave(&korg1212->lock, flags); @@ -2080,71 +2080,16 @@ static void snd_korg1212_proc_init(struct snd_korg1212 *korg1212) snd_korg1212_proc_read); } -static int -snd_korg1212_free(struct snd_korg1212 *korg1212) +static void +snd_korg1212_free(struct snd_card *card) { - snd_korg1212_TurnOffIdleMonitor(korg1212); - - if (korg1212->irq >= 0) { - snd_korg1212_DisableCardInterrupts(korg1212); - free_irq(korg1212->irq, korg1212); - korg1212->irq = -1; - } - - if (korg1212->iobase != NULL) { - iounmap(korg1212->iobase); - korg1212->iobase = NULL; - } - - pci_release_regions(korg1212->pci); - - // ---------------------------------------------------- - // free up memory resources used for the DSP download. - // ---------------------------------------------------- - if (korg1212->dma_dsp.area) { - snd_dma_free_pages(&korg1212->dma_dsp); - korg1212->dma_dsp.area = NULL; - } - -#ifndef K1212_LARGEALLOC - - // ------------------------------------------------------ - // free up memory resources used for the Play/Rec Buffers - // ------------------------------------------------------ - if (korg1212->dma_play.area) { - snd_dma_free_pages(&korg1212->dma_play); - korg1212->dma_play.area = NULL; - } + struct snd_korg1212 *korg1212 = card->private_data; - if (korg1212->dma_rec.area) { - snd_dma_free_pages(&korg1212->dma_rec); - korg1212->dma_rec.area = NULL; - } - -#endif - - // ---------------------------------------------------- - // free up memory resources used for the Shared Buffers - // ---------------------------------------------------- - if (korg1212->dma_shared.area) { - snd_dma_free_pages(&korg1212->dma_shared); - korg1212->dma_shared.area = NULL; - } - - pci_disable_device(korg1212->pci); - kfree(korg1212); - return 0; -} - -static int snd_korg1212_dev_free(struct snd_device *device) -{ - struct snd_korg1212 *korg1212 = device->device_data; - K1212_DEBUG_PRINTK("K1212_DEBUG: Freeing device\n"); - return snd_korg1212_free(korg1212); + snd_korg1212_TurnOffIdleMonitor(korg1212); + snd_korg1212_DisableCardInterrupts(korg1212); } -static int snd_korg1212_create(struct snd_card *card, struct pci_dev *pci, - struct snd_korg1212 **rchip) +static int snd_korg1212_create(struct snd_card *card, struct pci_dev *pci) { int err, rc; @@ -2152,24 +2097,13 @@ static int snd_korg1212_create(struct snd_card *card, struct pci_dev *pci, unsigned iomem_size; __maybe_unused unsigned ioport_size; __maybe_unused unsigned iomem2_size; - struct snd_korg1212 * korg1212; + struct snd_korg1212 *korg1212 = card->private_data; const struct firmware *dsp_code; - static const struct snd_device_ops ops = { - .dev_free = snd_korg1212_dev_free, - }; - - * rchip = NULL; - err = pci_enable_device(pci); + err = pcim_enable_device(pci); if (err < 0) return err; - korg1212 = kzalloc(sizeof(*korg1212), GFP_KERNEL); - if (korg1212 == NULL) { - pci_disable_device(pci); - return -ENOMEM; - } - korg1212->card = card; korg1212->pci = pci; @@ -2198,12 +2132,9 @@ static int snd_korg1212_create(struct snd_card *card, struct pci_dev *pci, for (i=0; ivolumePhase[i] = 0; - err = pci_request_regions(pci, "korg1212"); - if (err < 0) { - kfree(korg1212); - pci_disable_device(pci); + err = pcim_iomap_regions_request_all(pci, 1 << 0, "korg1212"); + if (err < 0) return err; - } korg1212->iomem = pci_resource_start(korg1212->pci, 0); korg1212->ioport = pci_resource_start(korg1212->pci, 1); @@ -2223,26 +2154,20 @@ static int snd_korg1212_create(struct snd_card *card, struct pci_dev *pci, korg1212->iomem2, iomem2_size, stateName[korg1212->cardState]); - korg1212->iobase = ioremap(korg1212->iomem, iomem_size); - if (!korg1212->iobase) { - snd_printk(KERN_ERR "korg1212: unable to remap memory region 0x%lx-0x%lx\n", korg1212->iomem, - korg1212->iomem + iomem_size - 1); - snd_korg1212_free(korg1212); - return -EBUSY; - } + korg1212->iobase = pcim_iomap_table(pci)[0]; - err = request_irq(pci->irq, snd_korg1212_interrupt, + err = devm_request_irq(&pci->dev, pci->irq, snd_korg1212_interrupt, IRQF_SHARED, KBUILD_MODNAME, korg1212); if (err) { snd_printk(KERN_ERR "korg1212: unable to grab IRQ %d\n", pci->irq); - snd_korg1212_free(korg1212); return -EBUSY; } korg1212->irq = pci->irq; card->sync_irq = korg1212->irq; + card->private_free = snd_korg1212_free; pci_set_master(korg1212->pci); @@ -2281,41 +2206,36 @@ static int snd_korg1212_create(struct snd_card *card, struct pci_dev *pci, korg1212->idRegPtr, stateName[korg1212->cardState]); - if (snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, &pci->dev, - sizeof(struct KorgSharedBuffer), &korg1212->dma_shared) < 0) { - snd_printk(KERN_ERR "korg1212: can not allocate shared buffer memory (%zd bytes)\n", sizeof(struct KorgSharedBuffer)); - snd_korg1212_free(korg1212); - return -ENOMEM; - } - korg1212->sharedBufferPtr = (struct KorgSharedBuffer *)korg1212->dma_shared.area; - korg1212->sharedBufferPhy = korg1212->dma_shared.addr; + korg1212->dma_shared = snd_devm_alloc_pages(&pci->dev, + SNDRV_DMA_TYPE_DEV, + sizeof(struct KorgSharedBuffer)); + if (!korg1212->dma_shared) + return -ENOMEM; + korg1212->sharedBufferPtr = (struct KorgSharedBuffer *)korg1212->dma_shared->area; + korg1212->sharedBufferPhy = korg1212->dma_shared->addr; K1212_DEBUG_PRINTK("K1212_DEBUG: Shared Buffer Area = 0x%p (0x%08lx), %d bytes\n", korg1212->sharedBufferPtr, korg1212->sharedBufferPhy, sizeof(struct KorgSharedBuffer)); #ifndef K1212_LARGEALLOC - korg1212->DataBufsSize = sizeof(struct KorgAudioBuffer) * kNumBuffers; + korg1212->dma_play = snd_devm_alloc_pages(&pci->dev, SNDRV_DMA_TYPE_DEV, + korg1212->DataBufsSize); + if (!korg1212->dma_play) + return -ENOMEM; - if (snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, &pci->dev, - korg1212->DataBufsSize, &korg1212->dma_play) < 0) { - snd_printk(KERN_ERR "korg1212: can not allocate play data buffer memory (%d bytes)\n", korg1212->DataBufsSize); - snd_korg1212_free(korg1212); - return -ENOMEM; - } - korg1212->playDataBufsPtr = (struct KorgAudioBuffer *)korg1212->dma_play.area; - korg1212->PlayDataPhy = korg1212->dma_play.addr; + korg1212->playDataBufsPtr = (struct KorgAudioBuffer *)korg1212->dma_play->area; + korg1212->PlayDataPhy = korg1212->dma_play->addr; K1212_DEBUG_PRINTK("K1212_DEBUG: Play Data Area = 0x%p (0x%08x), %d bytes\n", korg1212->playDataBufsPtr, korg1212->PlayDataPhy, korg1212->DataBufsSize); - if (snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, &pci->dev, - korg1212->DataBufsSize, &korg1212->dma_rec) < 0) { - snd_printk(KERN_ERR "korg1212: can not allocate record data buffer memory (%d bytes)\n", korg1212->DataBufsSize); - snd_korg1212_free(korg1212); - return -ENOMEM; - } - korg1212->recordDataBufsPtr = (struct KorgAudioBuffer *)korg1212->dma_rec.area; - korg1212->RecDataPhy = korg1212->dma_rec.addr; + korg1212->dma_rec = snd_devm_alloc_pages(&pci->dev, SNDRV_DMA_TYPE_DEV, + korg1212->DataBufsSize); + if (!korg1212->dma_rec) + return -ENOMEM; + + korg1212->recordDataBufsPtr = (struct KorgAudioBuffer *)korg1212->dma_rec->area; + korg1212->RecDataPhy = korg1212->dma_rec->addr; K1212_DEBUG_PRINTK("K1212_DEBUG: Record Data Area = 0x%p (0x%08x), %d bytes\n", korg1212->recordDataBufsPtr, korg1212->RecDataPhy, korg1212->DataBufsSize); @@ -2336,26 +2256,22 @@ static int snd_korg1212_create(struct snd_card *card, struct pci_dev *pci, korg1212->AdatTimeCodePhy = korg1212->sharedBufferPhy + offsetof(struct KorgSharedBuffer, AdatTimeCode); + korg1212->dma_dsp = snd_devm_alloc_pages(&pci->dev, SNDRV_DMA_TYPE_DEV, + dsp_code->size); + if (!korg1212->dma_dsp) + return -ENOMEM; + err = request_firmware(&dsp_code, "korg/k1212.dsp", &pci->dev); if (err < 0) { snd_printk(KERN_ERR "firmware not available\n"); - snd_korg1212_free(korg1212); return err; } - if (snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, &pci->dev, - dsp_code->size, &korg1212->dma_dsp) < 0) { - snd_printk(KERN_ERR "korg1212: cannot allocate dsp code memory (%zd bytes)\n", dsp_code->size); - snd_korg1212_free(korg1212); - release_firmware(dsp_code); - return -ENOMEM; - } - K1212_DEBUG_PRINTK("K1212_DEBUG: DSP Code area = 0x%p (0x%08x) %d bytes [%s]\n", - korg1212->dma_dsp.area, korg1212->dma_dsp.addr, dsp_code->size, + korg1212->dma_dsp->area, korg1212->dma_dsp->addr, dsp_code->size, stateName[korg1212->cardState]); - memcpy(korg1212->dma_dsp.area, dsp_code->data, dsp_code->size); + memcpy(korg1212->dma_dsp->area, dsp_code->data, dsp_code->size); release_firmware(dsp_code); @@ -2364,12 +2280,6 @@ static int snd_korg1212_create(struct snd_card *card, struct pci_dev *pci, if (rc) K1212_DEBUG_PRINTK("K1212_DEBUG: Reboot Card - RC = %d [%s]\n", rc, stateName[korg1212->cardState]); - err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, korg1212, &ops); - if (err < 0) { - snd_korg1212_free(korg1212); - return err; - } - snd_korg1212_EnableCardInterrupts(korg1212); mdelay(CARD_BOOT_DELAY_IN_MS); @@ -2411,10 +2321,8 @@ static int snd_korg1212_create(struct snd_card *card, struct pci_dev *pci, } snd_korg1212_proc_init(korg1212); - - * rchip = korg1212; - return 0; + return 0; } /* @@ -2437,16 +2345,15 @@ snd_korg1212_probe(struct pci_dev *pci, dev++; return -ENOENT; } - err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, - 0, &card); + err = snd_devm_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, + sizeof(*korg1212), &card); if (err < 0) return err; + korg1212 = card->private_data; - err = snd_korg1212_create(card, pci, &korg1212); - if (err < 0) { - snd_card_free(card); + err = snd_korg1212_create(card, pci); + if (err < 0) return err; - } strcpy(card->driver, "korg1212"); strcpy(card->shortname, "korg1212"); @@ -2456,25 +2363,17 @@ snd_korg1212_probe(struct pci_dev *pci, K1212_DEBUG_PRINTK("K1212_DEBUG: %s\n", card->longname); err = snd_card_register(card); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } pci_set_drvdata(pci, card); dev++; return 0; } -static void snd_korg1212_remove(struct pci_dev *pci) -{ - snd_card_free(pci_get_drvdata(pci)); -} - static struct pci_driver korg1212_driver = { .name = KBUILD_MODNAME, .id_table = snd_korg1212_ids, .probe = snd_korg1212_probe, - .remove = snd_korg1212_remove, }; module_pci_driver(korg1212_driver); From patchwork Thu Jul 15 07:59:02 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379293 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id AAF4DC07E96 for ; Thu, 15 Jul 2021 08:17:36 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 2E5C1611AC for ; Thu, 15 Jul 2021 08:17:36 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 2E5C1611AC Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id BC3821721; Thu, 15 Jul 2021 10:16:44 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz BC3821721 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626337054; bh=YolAqSXetGAUVxgLobS1MDHXC3XY4a4cUyX0dAPjSsE=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=rjDzLR07jyBPX7rZkXz6OxTRTmDnChbJMndK+k0kC+4ncZACS/Wz93FAlq4wgnJ7k SYG3ObI+yAH8rvyCaENSir4bC+ouPeB5elIkUgCifOCjFAgqWHCDtYUGVoM7lqKSoM bgYyIJw1XjJ3VsKy+e5nRe3Jj1isEjBZ9TR+WJjk= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id C3DF1F806E8; Thu, 15 Jul 2021 10:01:12 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id 84BA0F8067A; Thu, 15 Jul 2021 10:01:06 +0200 (CEST) Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 4284EF8051D for ; Thu, 15 Jul 2021 10:00:09 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 4284EF8051D Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="JbuXsnRu"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="idmNrUG7" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out2.suse.de (Postfix) with ESMTP id 1FA441FD3E for ; Thu, 15 Jul 2021 08:00:09 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336009; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=kFYQmvZBz/Rv+iOemGkk9WuHcg2BLKGc66cW/sYHUBY=; b=JbuXsnRuOAe+RogNpunJr/2/aRMx8C2j++4ReRkSYIW5K3JasPF1Ka8zQItvwRD2BRsx5t oQ8byLq6VVXQUew44BKQHuJs10FzyYD2IZ9vpYgNs69dDHzaMHhLIIOyfmenB+lqjCTRv1 u0ZSZbiLPav1RBfxUe3wtZINFrMBKtM= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336009; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=kFYQmvZBz/Rv+iOemGkk9WuHcg2BLKGc66cW/sYHUBY=; b=idmNrUG7TrjqI8HfGzQHU4sF/ggA5B8/xjPE+LcoTz7NFI/V8drWAY5sNuM18DIJLfch7D 0h7MWko0yUlJ9pBw== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id 0C728A3BB9; Thu, 15 Jul 2021 08:00:09 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 40/79] ALSA: lola: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:59:02 +0200 Message-Id: <20210715075941.23332-41-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in PCI lola driver with devres as a clean up. Each manual resource management is converted with the corresponding devres helper, the page allocations are done with the devres helper, and the card object release is managed now via card->private_free instead of a lowlevel snd_device. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- sound/pci/lola/lola.c | 127 +++++++++++--------------------------- sound/pci/lola/lola.h | 5 +- sound/pci/lola/lola_pcm.c | 20 +++--- 3 files changed, 44 insertions(+), 108 deletions(-) diff --git a/sound/pci/lola/lola.c b/sound/pci/lola/lola.c index 03b4be44bb26..5269a1d396a5 100644 --- a/sound/pci/lola/lola.c +++ b/sound/pci/lola/lola.c @@ -344,20 +344,18 @@ static void lola_irq_disable(struct lola *chip) static int setup_corb_rirb(struct lola *chip) { - int err; unsigned char tmp; unsigned long end_time; - err = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, - &chip->pci->dev, - PAGE_SIZE, &chip->rb); - if (err < 0) - return err; + chip->rb = snd_devm_alloc_pages(&chip->pci->dev, SNDRV_DMA_TYPE_DEV, + PAGE_SIZE); + if (!chip->rb) + return -ENOMEM; - chip->corb.addr = chip->rb.addr; - chip->corb.buf = (__le32 *)chip->rb.area; - chip->rirb.addr = chip->rb.addr + 2048; - chip->rirb.buf = (__le32 *)(chip->rb.area + 2048); + chip->corb.addr = chip->rb->addr; + chip->corb.buf = (__le32 *)chip->rb->area; + chip->rirb.addr = chip->rb->addr + 2048; + chip->rirb.buf = (__le32 *)(chip->rb->area + 2048); /* disable ringbuffer DMAs */ lola_writeb(chip, BAR0, RIRBCTL, 0); @@ -529,56 +527,31 @@ static void lola_stop_hw(struct lola *chip) lola_irq_disable(chip); } -static void lola_free(struct lola *chip) +static void lola_free(struct snd_card *card) { + struct lola *chip = card->private_data; + if (chip->initialized) lola_stop_hw(chip); - lola_free_pcm(chip); lola_free_mixer(chip); - if (chip->irq >= 0) - free_irq(chip->irq, (void *)chip); - iounmap(chip->bar[0].remap_addr); - iounmap(chip->bar[1].remap_addr); - if (chip->rb.area) - snd_dma_free_pages(&chip->rb); - pci_release_regions(chip->pci); - pci_disable_device(chip->pci); - kfree(chip); } -static int lola_dev_free(struct snd_device *device) +static int lola_create(struct snd_card *card, struct pci_dev *pci, int dev) { - lola_free(device->device_data); - return 0; -} - -static int lola_create(struct snd_card *card, struct pci_dev *pci, - int dev, struct lola **rchip) -{ - struct lola *chip; + struct lola *chip = card->private_data; int err; unsigned int dever; - static const struct snd_device_ops ops = { - .dev_free = lola_dev_free, - }; - *rchip = NULL; - - err = pci_enable_device(pci); + err = pcim_enable_device(pci); if (err < 0) return err; - chip = kzalloc(sizeof(*chip), GFP_KERNEL); - if (!chip) { - pci_disable_device(pci); - return -ENOMEM; - } - spin_lock_init(&chip->reg_lock); mutex_init(&chip->open_mutex); chip->card = card; chip->pci = pci; chip->irq = -1; + card->private_free = lola_free; chip->granularity = granularity[dev]; switch (chip->granularity) { @@ -607,34 +580,25 @@ static int lola_create(struct snd_card *card, struct pci_dev *pci, chip->sample_rate_min = 16000; } - err = pci_request_regions(pci, DRVNAME); - if (err < 0) { - kfree(chip); - pci_disable_device(pci); + err = pcim_iomap_regions(pci, (1 << 0) | (1 << 2), DRVNAME); + if (err < 0) return err; - } chip->bar[0].addr = pci_resource_start(pci, 0); - chip->bar[0].remap_addr = pci_ioremap_bar(pci, 0); + chip->bar[0].remap_addr = pcim_iomap_table(pci)[0]; chip->bar[1].addr = pci_resource_start(pci, 2); - chip->bar[1].remap_addr = pci_ioremap_bar(pci, 2); - if (!chip->bar[0].remap_addr || !chip->bar[1].remap_addr) { - dev_err(chip->card->dev, "ioremap error\n"); - err = -ENXIO; - goto errout; - } + chip->bar[1].remap_addr = pcim_iomap_table(pci)[2]; pci_set_master(pci); err = reset_controller(chip); if (err < 0) - goto errout; + return err; - if (request_irq(pci->irq, lola_interrupt, IRQF_SHARED, - KBUILD_MODNAME, chip)) { + if (devm_request_irq(&pci->dev, pci->irq, lola_interrupt, IRQF_SHARED, + KBUILD_MODNAME, chip)) { dev_err(chip->card->dev, "unable to grab IRQ %d\n", pci->irq); - err = -EBUSY; - goto errout; + return -EBUSY; } chip->irq = pci->irq; card->sync_irq = chip->irq; @@ -653,19 +617,12 @@ static int lola_create(struct snd_card *card, struct pci_dev *pci, (!chip->pcm[CAPT].num_streams && !chip->pcm[PLAY].num_streams)) { dev_err(chip->card->dev, "invalid DEVER = %x\n", dever); - err = -EINVAL; - goto errout; + return -EINVAL; } err = setup_corb_rirb(chip); if (err < 0) - goto errout; - - err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops); - if (err < 0) { - dev_err(chip->card->dev, "Error creating device [card]!\n"); - goto errout; - } + return err; strcpy(card->driver, "Lola"); strscpy(card->shortname, "Digigram Lola", sizeof(card->shortname)); @@ -677,12 +634,7 @@ static int lola_create(struct snd_card *card, struct pci_dev *pci, lola_irq_enable(chip); chip->initialized = 1; - *rchip = chip; return 0; - - errout: - lola_free(chip); - return err; } static int lola_probe(struct pci_dev *pci, @@ -700,47 +652,39 @@ static int lola_probe(struct pci_dev *pci, return -ENOENT; } - err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, - 0, &card); + err = snd_devm_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, + sizeof(*chip), &card); if (err < 0) { dev_err(&pci->dev, "Error creating card!\n"); return err; } + chip = card->private_data; - err = lola_create(card, pci, dev, &chip); + err = lola_create(card, pci, dev); if (err < 0) - goto out_free; - card->private_data = chip; + return err; err = lola_parse_tree(chip); if (err < 0) - goto out_free; + return err; err = lola_create_pcm(chip); if (err < 0) - goto out_free; + return err; err = lola_create_mixer(chip); if (err < 0) - goto out_free; + return err; lola_proc_debug_new(chip); err = snd_card_register(card); if (err < 0) - goto out_free; + return err; pci_set_drvdata(pci, card); dev++; - return err; -out_free: - snd_card_free(card); - return err; -} - -static void lola_remove(struct pci_dev *pci) -{ - snd_card_free(pci_get_drvdata(pci)); + return 0; } /* PCI IDs */ @@ -755,7 +699,6 @@ static struct pci_driver lola_driver = { .name = KBUILD_MODNAME, .id_table = lola_ids, .probe = lola_probe, - .remove = lola_remove, }; module_pci_driver(lola_driver); diff --git a/sound/pci/lola/lola.h b/sound/pci/lola/lola.h index 8a598aa40bf3..0ff772cf66e6 100644 --- a/sound/pci/lola/lola.h +++ b/sound/pci/lola/lola.h @@ -303,7 +303,7 @@ struct lola_stream { struct lola_pcm { unsigned int num_streams; - struct snd_dma_buffer bdl; /* BDL buffer */ + struct snd_dma_buffer *bdl; /* BDL buffer */ struct lola_stream streams[MAX_STREAM_COUNT]; }; @@ -328,7 +328,7 @@ struct lola { unsigned int last_cmd_nid, last_verb, last_data, last_extdata; /* CORB/RIRB buffers */ - struct snd_dma_buffer rb; + struct snd_dma_buffer *rb; /* unsolicited events */ unsigned int last_unsol_res; @@ -480,7 +480,6 @@ int lola_codec_flush(struct lola *chip); /* PCM */ int lola_create_pcm(struct lola *chip); -void lola_free_pcm(struct lola *chip); int lola_init_pcm(struct lola *chip, int dir, int *nidp); void lola_pcm_update(struct lola *chip, struct lola_pcm *pcm, unsigned int bits); diff --git a/sound/pci/lola/lola_pcm.c b/sound/pci/lola/lola_pcm.c index 684faaf40f31..738ec987000a 100644 --- a/sound/pci/lola/lola_pcm.c +++ b/sound/pci/lola/lola_pcm.c @@ -348,7 +348,7 @@ static int lola_setup_periods(struct lola *chip, struct lola_pcm *pcm, periods = str->bufsize / period_bytes; /* program the initial BDL entries */ - bdl = (__le32 *)(pcm->bdl.area + LOLA_BDL_ENTRY_SIZE * str->index); + bdl = (__le32 *)(pcm->bdl->area + LOLA_BDL_ENTRY_SIZE * str->index); ofs = 0; str->frags = 0; for (i = 0; i < periods; i++) { @@ -433,7 +433,7 @@ static int lola_setup_controller(struct lola *chip, struct lola_pcm *pcm, return -EINVAL; /* set up BDL */ - bdl = pcm->bdl.addr + LOLA_BDL_ENTRY_SIZE * str->index; + bdl = pcm->bdl->addr + LOLA_BDL_ENTRY_SIZE * str->index; lola_dsd_write(chip, str->dsd, BDPL, (u32)bdl); lola_dsd_write(chip, str->dsd, BDPU, upper_32_bits(bdl)); /* program the stream LVI (last valid index) of the BDL */ @@ -588,11 +588,11 @@ int lola_create_pcm(struct lola *chip) int i, err; for (i = 0; i < 2; i++) { - err = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, - &chip->pci->dev, - PAGE_SIZE, &chip->pcm[i].bdl); - if (err < 0) - return err; + chip->pcm[i].bdl = + snd_devm_alloc_pages(&chip->pci->dev, SNDRV_DMA_TYPE_DEV, + PAGE_SIZE); + if (!chip->pcm[i].bdl) + return -ENOMEM; } err = snd_pcm_new(chip->card, "Digigram Lola", 0, @@ -614,12 +614,6 @@ int lola_create_pcm(struct lola *chip) return 0; } -void lola_free_pcm(struct lola *chip) -{ - snd_dma_free_pages(&chip->pcm[0].bdl); - snd_dma_free_pages(&chip->pcm[1].bdl); -} - /* */ From patchwork Thu Jul 15 07:59:03 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379289 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id B3AABC07E96 for ; Thu, 15 Jul 2021 08:16:57 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 1BAA761183 for ; Thu, 15 Jul 2021 08:16:57 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 1BAA761183 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id B16A71745; Thu, 15 Jul 2021 10:16:05 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz B16A71745 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626337015; bh=ojY2ns22gNmIbiSZuqC8tDbBP8YD7wZupaSJwoKaVLA=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=mLHQcxqJA/kQA/9s7VMgNfqnzk6DjTyP/TJQ7yZvZgCwmr0rW/5s+wtizfxjYfjua M1U5rtzT6zPURjkPBOsM2k9du85cKbIJv6Vz2D5EI4W0SYoLT+L/E7OBvjT5j5fW0S DBsOsC1TCms8MBYMJoadIwPuAm9UMz2iIJdQPHbA= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id AF681F80686; Thu, 15 Jul 2021 10:01:10 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id B9C25F80675; Thu, 15 Jul 2021 10:01:04 +0200 (CEST) Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id A069BF8020C for ; Thu, 15 Jul 2021 10:00:09 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz A069BF8020C Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="udHmXt+0"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="07zJWnpl" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out1.suse.de (Postfix) with ESMTP id 7B4B122852 for ; Thu, 15 Jul 2021 08:00:09 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336009; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=McwQc7u8XYrA7q8zKHKjObja8nqqF3KSiuHdWYAKW6A=; b=udHmXt+0lOXzuAvMTE5kUgh6trCaCQrsap+tmCggswdQZDB87uNbr8t1nIUukBifavRwtc 1vpxQRRvuM/wnsJUn+c48RUOdqjE366dxaugKRAOOrHxO4U7Kn5TUGHS92DnqeELgcu82a A4x79Dxa9rU85Vf5Le9Q4XdIiNJ5Ir8= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336009; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=McwQc7u8XYrA7q8zKHKjObja8nqqF3KSiuHdWYAKW6A=; b=07zJWnplT+pjgM8E4qB08Ft1zvjD5ZnBamr5IW1HyXOH9vU8uk8Du73C1Ht+QhFeXad0Bm +Ltv8HHAK+PFjFCw== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id 6A0D8A3BBA; Thu, 15 Jul 2021 08:00:09 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 41/79] ALSA: lx6464es: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:59:03 +0200 Message-Id: <20210715075941.23332-42-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in PCI lx6464es driver with devres as a clean up. Each manual resource management is converted with the corresponding devres helper, and the card object release is managed now via card->private_free instead of a lowlevel snd_device. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- sound/pci/lx6464es/lx6464es.c | 112 ++++++++-------------------------- 1 file changed, 24 insertions(+), 88 deletions(-) diff --git a/sound/pci/lx6464es/lx6464es.c b/sound/pci/lx6464es/lx6464es.c index 1be97c38bc71..168a1084f730 100644 --- a/sound/pci/lx6464es/lx6464es.c +++ b/sound/pci/lx6464es/lx6464es.c @@ -524,29 +524,11 @@ static int lx_pcm_trigger(struct snd_pcm_substream *substream, int cmd) return lx_pcm_trigger_dispatch(chip, stream, cmd); } -static int snd_lx6464es_free(struct lx6464es *chip) +static void snd_lx6464es_free(struct snd_card *card) { - dev_dbg(chip->card->dev, "->snd_lx6464es_free\n"); + struct lx6464es *chip = card->private_data; lx_irq_disable(chip); - - if (chip->irq >= 0) - free_irq(chip->irq, chip); - - iounmap(chip->port_dsp_bar); - ioport_unmap(chip->port_plx_remapped); - - pci_release_regions(chip->pci); - pci_disable_device(chip->pci); - - kfree(chip); - - return 0; -} - -static int snd_lx6464es_dev_free(struct snd_device *device) -{ - return snd_lx6464es_free(device->device_data); } /* reset the dsp during initialization */ @@ -930,22 +912,15 @@ static int lx_proc_create(struct snd_card *card, struct lx6464es *chip) static int snd_lx6464es_create(struct snd_card *card, - struct pci_dev *pci, - struct lx6464es **rchip) + struct pci_dev *pci) { - struct lx6464es *chip; + struct lx6464es *chip = card->private_data; int err; - static const struct snd_device_ops ops = { - .dev_free = snd_lx6464es_dev_free, - }; - dev_dbg(card->dev, "->snd_lx6464es_create\n"); - *rchip = NULL; - /* enable PCI device */ - err = pci_enable_device(pci); + err = pcim_enable_device(pci); if (err < 0) return err; @@ -956,16 +931,9 @@ static int snd_lx6464es_create(struct snd_card *card, if (err < 0) { dev_err(card->dev, "architecture does not support 32bit PCI busmaster DMA\n"); - pci_disable_device(pci); return -ENXIO; } - chip = kzalloc(sizeof(*chip), GFP_KERNEL); - if (chip == NULL) { - err = -ENOMEM; - goto alloc_failed; - } - chip->card = card; chip->pci = pci; chip->irq = -1; @@ -978,33 +946,30 @@ static int snd_lx6464es_create(struct snd_card *card, /* request resources */ err = pci_request_regions(pci, card_name); if (err < 0) - goto request_regions_failed; + return err; /* plx port */ chip->port_plx = pci_resource_start(pci, 1); - chip->port_plx_remapped = ioport_map(chip->port_plx, - pci_resource_len(pci, 1)); + chip->port_plx_remapped = devm_ioport_map(&pci->dev, chip->port_plx, + pci_resource_len(pci, 1)); + if (!chip->port_plx_remapped) + return -ENOMEM; /* dsp port */ - chip->port_dsp_bar = pci_ioremap_bar(pci, 2); - if (!chip->port_dsp_bar) { - dev_err(card->dev, "cannot remap PCI memory region\n"); - err = -ENOMEM; - goto remap_pci_failed; - } + chip->port_dsp_bar = pcim_iomap(pci, 2, 0); + if (!chip->port_dsp_bar) + return -ENOMEM; - err = request_threaded_irq(pci->irq, lx_interrupt, lx_threaded_irq, - IRQF_SHARED, KBUILD_MODNAME, chip); + err = devm_request_threaded_irq(&pci->dev, pci->irq, lx_interrupt, + lx_threaded_irq, IRQF_SHARED, + KBUILD_MODNAME, chip); if (err) { dev_err(card->dev, "unable to grab IRQ %d\n", pci->irq); - goto request_irq_failed; + return err; } chip->irq = pci->irq; card->sync_irq = chip->irq; - - err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops); - if (err < 0) - goto device_new_failed; + card->private_free = snd_lx6464es_free; err = lx_init_dsp(chip); if (err < 0) { @@ -1025,25 +990,7 @@ static int snd_lx6464es_create(struct snd_card *card, if (err < 0) return err; - *rchip = chip; return 0; - -device_new_failed: - free_irq(pci->irq, chip); - -request_irq_failed: - iounmap(chip->port_dsp_bar); - -remap_pci_failed: - pci_release_regions(pci); - -request_regions_failed: - kfree(chip); - -alloc_failed: - pci_disable_device(pci); - - return err; } static int snd_lx6464es_probe(struct pci_dev *pci, @@ -1063,15 +1010,16 @@ static int snd_lx6464es_probe(struct pci_dev *pci, return -ENOENT; } - err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, - 0, &card); + err = snd_devm_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, + sizeof(*chip), &card); if (err < 0) return err; + chip = card->private_data; - err = snd_lx6464es_create(card, pci, &chip); + err = snd_lx6464es_create(card, pci); if (err < 0) { dev_err(card->dev, "error during snd_lx6464es_create\n"); - goto out_free; + return err; } strcpy(card->driver, "LX6464ES"); @@ -1088,30 +1036,18 @@ static int snd_lx6464es_probe(struct pci_dev *pci, err = snd_card_register(card); if (err < 0) - goto out_free; + return err; dev_dbg(chip->card->dev, "initialization successful\n"); pci_set_drvdata(pci, card); dev++; return 0; - -out_free: - snd_card_free(card); - return err; - } -static void snd_lx6464es_remove(struct pci_dev *pci) -{ - snd_card_free(pci_get_drvdata(pci)); -} - - static struct pci_driver lx6464es_driver = { .name = KBUILD_MODNAME, .id_table = snd_lx6464es_ids, .probe = snd_lx6464es_probe, - .remove = snd_lx6464es_remove, }; module_pci_driver(lx6464es_driver); From patchwork Thu Jul 15 07:59:04 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379291 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 62C36C07E96 for ; Thu, 15 Jul 2021 08:17:13 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 879366117A for ; Thu, 15 Jul 2021 08:17:12 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 879366117A Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id 2DFBC1731; Thu, 15 Jul 2021 10:16:21 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 2DFBC1731 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626337031; bh=x2y5nsZB57txz1whjjVzk5rAKRhvdk+GAi44U3tWxBU=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=BTnPAaUoGyyl8oe0i35Qp6B5Dwijmuyo/iPY2sok+yd7YasFrJsuhpzX/+4qITvrN ZgSXZXGeummaAfUm3APUIpSQL6XZCnFmZJ563A0QPGLr/SrGGCO1RLckp41hwsA8UV RgZy+4phyuklcjyEzIspxutL9AtMtBXyu6fOwLr8= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id AA5D1F806E7; Thu, 15 Jul 2021 10:01:11 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id F3350F80678; Thu, 15 Jul 2021 10:01:05 +0200 (CEST) Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 3942DF80524 for ; Thu, 15 Jul 2021 10:00:10 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 3942DF80524 Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="rrnPV1W8"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="1ge7t/qn" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out2.suse.de (Postfix) with ESMTP id 093A31FDE5 for ; Thu, 15 Jul 2021 08:00:10 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336010; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=ZylPcUdm825DBGsYo9uClnk9V1jD3btPbVGNcPlaL1w=; b=rrnPV1W8zZxn81GQ8kc3BHMM+ZzXmeEkFsJJfmxh0OIAdrs4TPy5OZDh8mKooiUJdE5FLd 3VxMza9410PkuIi8QxyJNbP2VUR0F3v4aQsknNr4ffYRoq7ZRmrADm/WpYl3V8JvU5Oj96 PT0gaMEw9l0VG4QSHbxlVipC5smQa9c= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336010; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=ZylPcUdm825DBGsYo9uClnk9V1jD3btPbVGNcPlaL1w=; b=1ge7t/qndyWXpbPM7GTJHPvohvdtrLJB4jbP5cDbBV8BpW2rYo51AtlbsO9RdkpfTtgsRv lbEzxCU7Brv8hGCQ== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id EB731A3BBC; Thu, 15 Jul 2021 08:00:09 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 42/79] ALSA: nm256: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:59:04 +0200 Message-Id: <20210715075941.23332-43-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in PCI nm256 driver with devres as a clean up. Each manual resource management is converted with the corresponding devres helper, and the card object release is managed now via card->private_free instead of a lowlevel snd_device. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- sound/pci/nm256/nm256.c | 130 ++++++++++------------------------------ 1 file changed, 30 insertions(+), 100 deletions(-) diff --git a/sound/pci/nm256/nm256.c b/sound/pci/nm256/nm256.c index 12d02d7d3b51..a54b9b26a0c2 100644 --- a/sound/pci/nm256/nm256.c +++ b/sound/pci/nm256/nm256.c @@ -193,11 +193,9 @@ struct nm256 { struct snd_card *card; void __iomem *cport; /* control port */ - struct resource *res_cport; /* its resource */ unsigned long cport_addr; /* physical address */ void __iomem *buffer; /* buffer */ - struct resource *res_buffer; /* its resource */ unsigned long buffer_addr; /* buffer phyiscal address */ u32 buffer_start; /* start offset from pci resource 0 */ @@ -1313,8 +1311,9 @@ snd_nm256_mixer(struct nm256 *chip) .read = snd_nm256_ac97_read, }; - chip->ac97_regs = kcalloc(ARRAY_SIZE(nm256_ac97_init_val), - sizeof(short), GFP_KERNEL); + chip->ac97_regs = devm_kcalloc(chip->card->dev, + ARRAY_SIZE(nm256_ac97_init_val), + sizeof(short), GFP_KERNEL); if (! chip->ac97_regs) return -ENOMEM; @@ -1437,56 +1436,27 @@ static SIMPLE_DEV_PM_OPS(nm256_pm, nm256_suspend, nm256_resume); #define NM256_PM_OPS NULL #endif /* CONFIG_PM_SLEEP */ -static int snd_nm256_free(struct nm256 *chip) +static void snd_nm256_free(struct snd_card *card) { + struct nm256 *chip = card->private_data; + if (chip->streams[SNDRV_PCM_STREAM_PLAYBACK].running) snd_nm256_playback_stop(chip); if (chip->streams[SNDRV_PCM_STREAM_CAPTURE].running) snd_nm256_capture_stop(chip); - - if (chip->irq >= 0) - free_irq(chip->irq, chip); - - iounmap(chip->cport); - iounmap(chip->buffer); - release_and_free_resource(chip->res_cport); - release_and_free_resource(chip->res_buffer); - - pci_disable_device(chip->pci); - kfree(chip->ac97_regs); - kfree(chip); - return 0; -} - -static int snd_nm256_dev_free(struct snd_device *device) -{ - struct nm256 *chip = device->device_data; - return snd_nm256_free(chip); } static int -snd_nm256_create(struct snd_card *card, struct pci_dev *pci, - struct nm256 **chip_ret) +snd_nm256_create(struct snd_card *card, struct pci_dev *pci) { - struct nm256 *chip; + struct nm256 *chip = card->private_data; int err, pval; - static const struct snd_device_ops ops = { - .dev_free = snd_nm256_dev_free, - }; u32 addr; - *chip_ret = NULL; - - err = pci_enable_device(pci); + err = pcim_enable_device(pci); if (err < 0) return err; - chip = kzalloc(sizeof(*chip), GFP_KERNEL); - if (chip == NULL) { - pci_disable_device(pci); - return -ENOMEM; - } - chip->card = card; chip->pci = pci; chip->use_cache = use_cache; @@ -1508,22 +1478,16 @@ snd_nm256_create(struct snd_card *card, struct pci_dev *pci, chip->buffer_addr = pci_resource_start(pci, 0); chip->cport_addr = pci_resource_start(pci, 1); + if (pci_request_regions(pci, card->driver)) + return err; + /* Init the memory port info. */ /* remap control port (#2) */ - chip->res_cport = request_mem_region(chip->cport_addr, NM_PORT2_SIZE, - card->driver); - if (chip->res_cport == NULL) { - dev_err(card->dev, "memory region 0x%lx (size 0x%x) busy\n", - chip->cport_addr, NM_PORT2_SIZE); - err = -EBUSY; - goto __error; - } - chip->cport = ioremap(chip->cport_addr, NM_PORT2_SIZE); - if (chip->cport == NULL) { + chip->cport = devm_ioremap(&pci->dev, chip->cport_addr, NM_PORT2_SIZE); + if (!chip->cport) { dev_err(card->dev, "unable to map control port %lx\n", chip->cport_addr); - err = -ENOMEM; - goto __error; + return -ENOMEM; } if (!strcmp(card->driver, "NM256AV")) { @@ -1539,8 +1503,7 @@ snd_nm256_create(struct snd_card *card, struct pci_dev *pci, " force_ac97=1\n"); dev_err(card->dev, "or try sb16, opl3sa2, or cs423x drivers instead.\n"); - err = -ENXIO; - goto __error; + return -ENXIO; } } chip->buffer_end = 2560 * 1024; @@ -1572,7 +1535,7 @@ snd_nm256_create(struct snd_card *card, struct pci_dev *pci, /* get buffer end pointer from signature */ err = snd_nm256_peek_for_sig(chip); if (err < 0) - goto __error; + return err; } chip->buffer_start = chip->buffer_end - chip->buffer_size; @@ -1581,21 +1544,12 @@ snd_nm256_create(struct snd_card *card, struct pci_dev *pci, dev_info(card->dev, "Mapping port 1 from 0x%x - 0x%x\n", chip->buffer_start, chip->buffer_end); - chip->res_buffer = request_mem_region(chip->buffer_addr, - chip->buffer_size, - card->driver); - if (chip->res_buffer == NULL) { - dev_err(card->dev, "buffer 0x%lx (size 0x%x) busy\n", - chip->buffer_addr, chip->buffer_size); - err = -EBUSY; - goto __error; - } - chip->buffer = ioremap(chip->buffer_addr, chip->buffer_size); - if (chip->buffer == NULL) { - err = -ENOMEM; + chip->buffer = devm_ioremap(&pci->dev, chip->buffer_addr, + chip->buffer_size); + if (!chip->buffer) { dev_err(card->dev, "unable to map ring buffer at %lx\n", chip->buffer_addr); - goto __error; + return -ENOMEM; } /* set offsets */ @@ -1618,19 +1572,10 @@ snd_nm256_create(struct snd_card *card, struct pci_dev *pci, chip->coeffs_current = 0; snd_nm256_init_chip(chip); + card->private_free = snd_nm256_free; // pci_set_master(pci); /* needed? */ - - err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops); - if (err < 0) - goto __error; - - *chip_ret = chip; return 0; - -__error: - snd_nm256_free(chip); - return err; } @@ -1673,9 +1618,11 @@ static int snd_nm256_probe(struct pci_dev *pci, } } - err = snd_card_new(&pci->dev, index, id, THIS_MODULE, 0, &card); + err = snd_devm_card_new(&pci->dev, index, id, THIS_MODULE, + sizeof(*chip), &card); if (err < 0) return err; + chip = card->private_data; switch (pci->device) { case PCI_DEVICE_ID_NEOMAGIC_NM256AV_AUDIO: @@ -1689,7 +1636,6 @@ static int snd_nm256_probe(struct pci_dev *pci, break; default: dev_err(&pci->dev, "invalid device id 0x%x\n", pci->device); - snd_card_free(card); return -EINVAL; } @@ -1704,12 +1650,9 @@ static int snd_nm256_probe(struct pci_dev *pci, capture_bufsize = 4; if (capture_bufsize > 128) capture_bufsize = 128; - err = snd_nm256_create(card, pci, &chip); - if (err < 0) { - snd_card_free(card); + err = snd_nm256_create(card, pci); + if (err < 0) return err; - } - card->private_data = chip; if (reset_workaround) { dev_dbg(&pci->dev, "reset_workaround activated\n"); @@ -1722,15 +1665,11 @@ static int snd_nm256_probe(struct pci_dev *pci, } err = snd_nm256_pcm(chip, 0); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } err = snd_nm256_mixer(chip); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } sprintf(card->shortname, "NeoMagic %s", card->driver); sprintf(card->longname, "%s at 0x%lx & 0x%lx, irq %d", @@ -1738,26 +1677,17 @@ static int snd_nm256_probe(struct pci_dev *pci, chip->buffer_addr, chip->cport_addr, chip->irq); err = snd_card_register(card); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } pci_set_drvdata(pci, card); return 0; } -static void snd_nm256_remove(struct pci_dev *pci) -{ - snd_card_free(pci_get_drvdata(pci)); -} - - static struct pci_driver nm256_driver = { .name = KBUILD_MODNAME, .id_table = snd_nm256_ids, .probe = snd_nm256_probe, - .remove = snd_nm256_remove, .driver = { .pm = NM256_PM_OPS, }, From patchwork Thu Jul 15 07:59:05 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379297 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id AB711C07E96 for ; Thu, 15 Jul 2021 08:18:13 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 28250611AC for ; Thu, 15 Jul 2021 08:18:13 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 28250611AC Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id B85681663; Thu, 15 Jul 2021 10:17:21 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz B85681663 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626337091; bh=d/C0rxyXkKVuR0Uscy2kZMRm2mBQNj8N5xvsZfdYMbI=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=SWY18AiHUPmL/fUjKWHT9lXF9xQCwPN3zrhEZwWe1RprUJxlz/EkN9ZvHPIX3+f7B MH5VCT8duzujQKkNmaLn3hkWGAcnp+uGma9ZzPVbTdYMVZFlC9qfTMc0Gdg15PcB30 ypfYYMREWrCIItdX0wQzrMNF6eLohgD7EhaUhe54= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id 4F309F806ED; Thu, 15 Jul 2021 10:01:16 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id 05189F8067A; Thu, 15 Jul 2021 10:01:06 +0200 (CEST) Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id D4C81F80527 for ; Thu, 15 Jul 2021 10:00:10 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz D4C81F80527 Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="Vo1Ukmcs"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="gIdpdcFP" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out2.suse.de (Postfix) with ESMTP id A85E81FD3E for ; Thu, 15 Jul 2021 08:00:10 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336010; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=NzI14anQ4CDPJLD01RdxJOrySULsuaN6XiAhanN5VYg=; b=Vo1Ukmcsua1Yy/3Mip8l4ecefHEbh6nsvRSG3w9CBZujRUObIz7LygteF7fWKMLtIwb8Ar +F+/VkK4CGo+VmwWTAmfeTozDg0ABd9WUy94yYIE+I+U1PwhgXNncQ2VpxH6/U5HegmTOb EsxxRQ7TPMhx1RVucC+tKSnHZAHfxh4= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336010; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=NzI14anQ4CDPJLD01RdxJOrySULsuaN6XiAhanN5VYg=; b=gIdpdcFPs4bFzdwbu/n1lZMA9+ub5rt2fxARCvnn6SwMtZcvVcNV+j61Z6QSS9qqjSCuNp NDzvBOIu8tqsbWBQ== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id 964DDA3BC0; Thu, 15 Jul 2021 08:00:10 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 43/79] ALSA: oxygen: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:59:05 +0200 Message-Id: <20210715075941.23332-44-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in PCI oxygen drivers with devres as a clean up. Each manual resource management is converted with the corresponding devres helper, and the page allocations are done with the devres helper. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- sound/pci/oxygen/oxygen.c | 1 - sound/pci/oxygen/oxygen.h | 1 - sound/pci/oxygen/oxygen_lib.c | 66 ++++++++++++----------------------- sound/pci/oxygen/se6x.c | 1 - sound/pci/oxygen/virtuoso.c | 1 - 5 files changed, 22 insertions(+), 48 deletions(-) diff --git a/sound/pci/oxygen/oxygen.c b/sound/pci/oxygen/oxygen.c index e335c4b5b381..c346f42befc2 100644 --- a/sound/pci/oxygen/oxygen.c +++ b/sound/pci/oxygen/oxygen.c @@ -854,7 +854,6 @@ static struct pci_driver oxygen_driver = { .name = KBUILD_MODNAME, .id_table = oxygen_ids, .probe = generic_oxygen_probe, - .remove = oxygen_pci_remove, #ifdef CONFIG_PM_SLEEP .driver = { .pm = &oxygen_pci_pm, diff --git a/sound/pci/oxygen/oxygen.h b/sound/pci/oxygen/oxygen.h index 06bf7e5744d0..0cae640708f3 100644 --- a/sound/pci/oxygen/oxygen.h +++ b/sound/pci/oxygen/oxygen.h @@ -161,7 +161,6 @@ int oxygen_pci_probe(struct pci_dev *pci, int index, char *id, const struct pci_device_id *id ) ); -void oxygen_pci_remove(struct pci_dev *pci); #ifdef CONFIG_PM_SLEEP extern const struct dev_pm_ops oxygen_pci_pm; #endif diff --git a/sound/pci/oxygen/oxygen_lib.c b/sound/pci/oxygen/oxygen_lib.c index afc6dd329c09..4fb3f2484fdb 100644 --- a/sound/pci/oxygen/oxygen_lib.c +++ b/sound/pci/oxygen/oxygen_lib.c @@ -570,15 +570,10 @@ static void oxygen_card_free(struct snd_card *card) struct oxygen *chip = card->private_data; oxygen_shutdown(chip); - if (chip->irq >= 0) - free_irq(chip->irq, chip); flush_work(&chip->spdif_input_bits_work); flush_work(&chip->gpio_work); chip->model.cleanup(chip); - kfree(chip->model_data); mutex_destroy(&chip->mutex); - pci_release_regions(chip->pci); - pci_disable_device(chip->pci); } int oxygen_pci_probe(struct pci_dev *pci, int index, char *id, @@ -594,8 +589,8 @@ int oxygen_pci_probe(struct pci_dev *pci, int index, char *id, const struct pci_device_id *pci_id; int err; - err = snd_card_new(&pci->dev, index, id, owner, - sizeof(*chip), &card); + err = snd_devm_card_new(&pci->dev, index, id, owner, + sizeof(*chip), &card); if (err < 0) return err; @@ -610,41 +605,38 @@ int oxygen_pci_probe(struct pci_dev *pci, int index, char *id, INIT_WORK(&chip->gpio_work, oxygen_gpio_changed); init_waitqueue_head(&chip->ac97_waitqueue); - err = pci_enable_device(pci); + err = pcim_enable_device(pci); if (err < 0) - goto err_card; + return err; err = pci_request_regions(pci, DRIVER); if (err < 0) { dev_err(card->dev, "cannot reserve PCI resources\n"); - goto err_pci_enable; + return err; } if (!(pci_resource_flags(pci, 0) & IORESOURCE_IO) || pci_resource_len(pci, 0) < OXYGEN_IO_SIZE) { dev_err(card->dev, "invalid PCI I/O range\n"); - err = -ENXIO; - goto err_pci_regions; + return -ENXIO; } chip->addr = pci_resource_start(pci, 0); pci_id = oxygen_search_pci_id(chip, ids); - if (!pci_id) { - err = -ENODEV; - goto err_pci_regions; - } + if (!pci_id) + return -ENODEV; + oxygen_restore_eeprom(chip, pci_id); err = get_model(chip, pci_id); if (err < 0) - goto err_pci_regions; + return err; if (chip->model.model_data_size) { - chip->model_data = kzalloc(chip->model.model_data_size, - GFP_KERNEL); - if (!chip->model_data) { - err = -ENOMEM; - goto err_pci_regions; - } + chip->model_data = devm_kzalloc(&pci->dev, + chip->model.model_data_size, + GFP_KERNEL); + if (!chip->model_data) + return -ENOMEM; } pci_set_master(pci); @@ -654,11 +646,11 @@ int oxygen_pci_probe(struct pci_dev *pci, int index, char *id, oxygen_init(chip); chip->model.init(chip); - err = request_irq(pci->irq, oxygen_interrupt, IRQF_SHARED, - KBUILD_MODNAME, chip); + err = devm_request_irq(&pci->dev, pci->irq, oxygen_interrupt, + IRQF_SHARED, KBUILD_MODNAME, chip); if (err < 0) { dev_err(card->dev, "cannot grab interrupt %d\n", pci->irq); - goto err_card; + return err; } chip->irq = pci->irq; card->sync_irq = chip->irq; @@ -672,11 +664,11 @@ int oxygen_pci_probe(struct pci_dev *pci, int index, char *id, err = oxygen_pcm_init(chip); if (err < 0) - goto err_card; + return err; err = oxygen_mixer_init(chip); if (err < 0) - goto err_card; + return err; if (chip->model.device_config & (MIDI_OUTPUT | MIDI_INPUT)) { unsigned int info_flags = @@ -689,7 +681,7 @@ int oxygen_pci_probe(struct pci_dev *pci, int index, char *id, chip->addr + OXYGEN_MPU401, info_flags, -1, &chip->midi); if (err < 0) - goto err_card; + return err; } oxygen_proc_init(chip); @@ -704,27 +696,13 @@ int oxygen_pci_probe(struct pci_dev *pci, int index, char *id, err = snd_card_register(card); if (err < 0) - goto err_card; + return err; pci_set_drvdata(pci, card); return 0; - -err_pci_regions: - pci_release_regions(pci); -err_pci_enable: - pci_disable_device(pci); -err_card: - snd_card_free(card); - return err; } EXPORT_SYMBOL(oxygen_pci_probe); -void oxygen_pci_remove(struct pci_dev *pci) -{ - snd_card_free(pci_get_drvdata(pci)); -} -EXPORT_SYMBOL(oxygen_pci_remove); - #ifdef CONFIG_PM_SLEEP static int oxygen_pci_suspend(struct device *dev) { diff --git a/sound/pci/oxygen/se6x.c b/sound/pci/oxygen/se6x.c index 434f885f6f91..17650a5b1bfa 100644 --- a/sound/pci/oxygen/se6x.c +++ b/sound/pci/oxygen/se6x.c @@ -137,7 +137,6 @@ static struct pci_driver se6x_driver = { .name = KBUILD_MODNAME, .id_table = se6x_ids, .probe = se6x_probe, - .remove = oxygen_pci_remove, #ifdef CONFIG_PM_SLEEP .driver = { .pm = &oxygen_pci_pm, diff --git a/sound/pci/oxygen/virtuoso.c b/sound/pci/oxygen/virtuoso.c index baa3244d4dab..2e405133371f 100644 --- a/sound/pci/oxygen/virtuoso.c +++ b/sound/pci/oxygen/virtuoso.c @@ -82,7 +82,6 @@ static struct pci_driver xonar_driver = { .name = KBUILD_MODNAME, .id_table = xonar_ids, .probe = xonar_probe, - .remove = oxygen_pci_remove, #ifdef CONFIG_PM_SLEEP .driver = { .pm = &oxygen_pci_pm, From patchwork Thu Jul 15 07:59:06 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379295 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 66991C07E96 for ; Thu, 15 Jul 2021 08:17:52 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 928C56117A for ; Thu, 15 Jul 2021 08:17:51 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 928C56117A Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id 24B77175E; Thu, 15 Jul 2021 10:17:00 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 24B77175E DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626337070; bh=X+EKB321wIZcLoRBhY7M+HvVxeEwP0kRS8hdb3YSHNE=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=riZQLbrlxh206otqgNxi3YSHKukYVn2Yha+A2tIgyNsmph65p8gNabcvqmr2WPMEm o6HvG2mSrMcG9krgnaucOZ1vcFlIuyziPW0/SVOWC8OKZZ5R9j+9YNvfcQ/rIm5Twl u/qr7xPrOkL0FzRRWd2T85VYztRwflx38QSpovS4= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id 918F2F8052D; Thu, 15 Jul 2021 10:01:14 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id 11869F8051D; Thu, 15 Jul 2021 10:01:07 +0200 (CEST) Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 3FD7AF80526 for ; Thu, 15 Jul 2021 10:00:11 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 3FD7AF80526 Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="FeCHlOc3"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="2NnXeTaA" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out2.suse.de (Postfix) with ESMTP id 188F71FDEA for ; Thu, 15 Jul 2021 08:00:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336011; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=kgWBHQVODUeHp2jMa9p6i+45SIGnHJjefe5XxogOvKY=; b=FeCHlOc3o4E2PenEMeHuoHeyH4KlBsDUWW+iLBi9pWqcanMYz/wAnD9HaNK5R+AU8+wN0S w+cHbdOoV/CLzteVA5YJQ+F0KqEWX/6EevuM8pToTQnByZeBpHDyiw/byBzgmQJ4xY2gSa F48FLBkINJo7csT5znPcnc2RW/qcjdw= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336011; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=kgWBHQVODUeHp2jMa9p6i+45SIGnHJjefe5XxogOvKY=; b=2NnXeTaAsbEw8mKbZZYqJBEoaciXWZpHd38yYkzJNde+Pz4qoV+Or//9WZNHJvYVECSZ1H NCPOBqCs6rEs2mBg== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id 1145EA3BC0; Thu, 15 Jul 2021 08:00:11 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 44/79] ALSA: riptide: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:59:06 +0200 Message-Id: <20210715075941.23332-45-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in PCI riptide driver with devres as a clean up. Each manual resource management is converted with the corresponding devres helper, and the card object release is managed now via card->private_free instead of a lowlevel snd_device. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- sound/pci/riptide/riptide.c | 89 +++++++++---------------------------- 1 file changed, 22 insertions(+), 67 deletions(-) diff --git a/sound/pci/riptide/riptide.c b/sound/pci/riptide/riptide.c index 709a1a2cde20..5a987c683c41 100644 --- a/sound/pci/riptide/riptide.c +++ b/sound/pci/riptide/riptide.c @@ -1798,13 +1798,11 @@ static int snd_riptide_initialize(struct snd_riptide *chip) return err; } -static int snd_riptide_free(struct snd_riptide *chip) +static void snd_riptide_free(struct snd_card *card) { + struct snd_riptide *chip = card->private_data; struct cmdif *cif; - if (!chip) - return 0; - cif = chip->cif; if (cif) { SET_GRESET(cif->hwport); @@ -1812,39 +1810,19 @@ static int snd_riptide_free(struct snd_riptide *chip) UNSET_GRESET(cif->hwport); kfree(chip->cif); } - if (chip->irq >= 0) - free_irq(chip->irq, chip); release_firmware(chip->fw_entry); - release_and_free_resource(chip->res_port); - kfree(chip); - return 0; -} - -static int snd_riptide_dev_free(struct snd_device *device) -{ - struct snd_riptide *chip = device->device_data; - - return snd_riptide_free(chip); } static int -snd_riptide_create(struct snd_card *card, struct pci_dev *pci, - struct snd_riptide **rchip) +snd_riptide_create(struct snd_card *card, struct pci_dev *pci) { - struct snd_riptide *chip; + struct snd_riptide *chip = card->private_data; struct riptideport *hwport; int err; - static const struct snd_device_ops ops = { - .dev_free = snd_riptide_dev_free, - }; - *rchip = NULL; - err = pci_enable_device(pci); + err = pcim_enable_device(pci); if (err < 0) return err; - chip = kzalloc(sizeof(struct snd_riptide), GFP_KERNEL); - if (!chip) - return -ENOMEM; spin_lock_init(&chip->lock); chip->card = card; @@ -1855,24 +1833,20 @@ snd_riptide_create(struct snd_card *card, struct pci_dev *pci, chip->received_irqs = 0; chip->handled_irqs = 0; chip->cif = NULL; + card->private_free = snd_riptide_free; - chip->res_port = request_region(chip->port, 64, "RIPTIDE"); - if (!chip->res_port) { - snd_printk(KERN_ERR - "Riptide: unable to grab region 0x%lx-0x%lx\n", - chip->port, chip->port + 64 - 1); - snd_riptide_free(chip); - return -EBUSY; - } + err = pci_request_regions(pci, "RIPTIDE"); + if (err < 0) + return err; hwport = (struct riptideport *)chip->port; UNSET_AIE(hwport); - if (request_threaded_irq(pci->irq, snd_riptide_interrupt, - riptide_handleirq, IRQF_SHARED, - KBUILD_MODNAME, chip)) { + if (devm_request_threaded_irq(&pci->dev, pci->irq, + snd_riptide_interrupt, + riptide_handleirq, IRQF_SHARED, + KBUILD_MODNAME, chip)) { snd_printk(KERN_ERR "Riptide: unable to grab IRQ %d\n", pci->irq); - snd_riptide_free(chip); return -EBUSY; } chip->irq = pci->irq; @@ -1880,18 +1854,9 @@ snd_riptide_create(struct snd_card *card, struct pci_dev *pci, chip->device_id = pci->device; pci_set_master(pci); err = snd_riptide_initialize(chip); - if (err < 0) { - snd_riptide_free(chip); - return err; - } - - err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops); - if (err < 0) { - snd_riptide_free(chip); + if (err < 0) return err; - } - *rchip = chip; return 0; } @@ -2073,20 +2038,20 @@ snd_card_riptide_probe(struct pci_dev *pci, const struct pci_device_id *pci_id) return -ENOENT; } - err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, - 0, &card); + err = snd_devm_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, + sizeof(*chip), &card); if (err < 0) return err; - err = snd_riptide_create(card, pci, &chip); + chip = card->private_data; + err = snd_riptide_create(card, pci); if (err < 0) - goto error; - card->private_data = chip; + return err; err = snd_riptide_pcm(chip, 0); if (err < 0) - goto error; + return err; err = snd_riptide_mixer(chip); if (err < 0) - goto error; + return err; val = LEGACY_ENABLE_ALL; if (opl3_port[dev]) @@ -2153,26 +2118,16 @@ snd_card_riptide_probe(struct pci_dev *pci, const struct pci_device_id *pci_id) snd_riptide_proc_init(chip); err = snd_card_register(card); if (err < 0) - goto error; + return err; pci_set_drvdata(pci, card); dev++; return 0; - - error: - snd_card_free(card); - return err; -} - -static void snd_card_riptide_remove(struct pci_dev *pci) -{ - snd_card_free(pci_get_drvdata(pci)); } static struct pci_driver driver = { .name = KBUILD_MODNAME, .id_table = snd_riptide_ids, .probe = snd_card_riptide_probe, - .remove = snd_card_riptide_remove, .driver = { .pm = RIPTIDE_PM_OPS, }, From patchwork Thu Jul 15 07:59:07 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379303 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 42B50C07E96 for ; Thu, 15 Jul 2021 08:19:28 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id AF5E060FEB for ; Thu, 15 Jul 2021 08:19:27 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org AF5E060FEB Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id 4B4F11700; Thu, 15 Jul 2021 10:18:36 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 4B4F11700 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626337166; bh=rHsxd+v0mhkecxXBQ+rDzQSZSqPBYuEhskwV0L+lXHc=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=pbp6g2WTL0ZT3/1JYgQe8pd5RSf6z50fYHfUg6wcRtAZzo4mKkenM4ATAB0TsLrsc 5BYeIogfl3LqWPHfh7JuoOA65Ywq2G6wqSgW9rm2mCJ1Kie+ZVGVrdz5lExqVSrDoy zgjUt9NmeZE0vaby7qAY2pDu/4rG8WIiHTIMORZ4= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id BFBFCF80549; Thu, 15 Jul 2021 10:01:21 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id 5DFC6F80536; Thu, 15 Jul 2021 10:01:13 +0200 (CEST) Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id D298BF80528 for ; Thu, 15 Jul 2021 10:00:11 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz D298BF80528 Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="tHkD/YS4"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="fEM/I5YV" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out2.suse.de (Postfix) with ESMTP id AA0ED1FDE5 for ; Thu, 15 Jul 2021 08:00:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336011; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=VISn0WVaelPlAIIWemmJVN6fWOaz1Q9xpZNf/RGCWp4=; b=tHkD/YS4Gq4HDTsjP1v2oXGoN0TifBDL6O2SEcINMD1QlmJRoV5dCWVjW55Q0lJSyXCyLt 0LmpDNcwtwkOBVtD5uJqVLlrIJdy8andCgmjKiorN5rLF2atPTpR+V5O4dwB1N9UJ7Lii+ xY2T2PnwLcn+83+6Oi1rrNEtTzIvNYg= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336011; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=VISn0WVaelPlAIIWemmJVN6fWOaz1Q9xpZNf/RGCWp4=; b=fEM/I5YVgbQ3EB+o1EomcPDJPAQ1WSRg+2VcbK5DHpshoxncq0JuknPD/M41CCRq09A7S6 pMRDca0q6MaKbnCQ== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id 968FEA3B99; Thu, 15 Jul 2021 08:00:11 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 45/79] ALSA: hdsp: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:59:07 +0200 Message-Id: <20210715075941.23332-46-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in PCI hdsp driver with devres as a clean up. Each manual resource management is converted with the corresponding devres helper, the page allocations are done with the devres helper, and the card object release is managed now via card->private_free instead of a lowlevel snd_device. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- sound/pci/rme9652/hdsp.c | 89 +++++++++++----------------------------- 1 file changed, 25 insertions(+), 64 deletions(-) diff --git a/sound/pci/rme9652/hdsp.c b/sound/pci/rme9652/hdsp.c index 8457a4bbc3df..982278f8724d 100644 --- a/sound/pci/rme9652/hdsp.c +++ b/sound/pci/rme9652/hdsp.c @@ -468,8 +468,8 @@ struct hdsp { unsigned char ss_out_channels; u32 io_loopback; /* output loopback channel states*/ - struct snd_dma_buffer capture_dma_buf; - struct snd_dma_buffer playback_dma_buf; + struct snd_dma_buffer *capture_dma_buf; + struct snd_dma_buffer *playback_dma_buf; unsigned char *capture_buffer; /* suitably aligned address */ unsigned char *playback_buffer; /* suitably aligned address */ @@ -565,18 +565,12 @@ static const char channel_map_H9632_qs[HDSP_MAX_CHANNELS] = { -1, -1 }; -static int snd_hammerfall_get_buffer(struct pci_dev *pci, struct snd_dma_buffer *dmab, size_t size) +static struct snd_dma_buffer * +snd_hammerfall_get_buffer(struct pci_dev *pci, size_t size) { - return snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, &pci->dev, size, dmab); + return snd_devm_alloc_pages(&pci->dev, SNDRV_DMA_TYPE_DEV, size); } -static void snd_hammerfall_free_buffer(struct snd_dma_buffer *dmab, struct pci_dev *pci) -{ - if (dmab->area) - snd_dma_free_pages(dmab); -} - - static const struct pci_device_id snd_hdsp_ids[] = { { .vendor = PCI_VENDOR_ID_XILINX, @@ -3768,20 +3762,15 @@ static void snd_hdsp_proc_init(struct hdsp *hdsp) snd_card_ro_proc_new(hdsp->card, "hdsp", hdsp, snd_hdsp_proc_read); } -static void snd_hdsp_free_buffers(struct hdsp *hdsp) -{ - snd_hammerfall_free_buffer(&hdsp->capture_dma_buf, hdsp->pci); - snd_hammerfall_free_buffer(&hdsp->playback_dma_buf, hdsp->pci); -} - static int snd_hdsp_initialize_memory(struct hdsp *hdsp) { unsigned long pb_bus, cb_bus; - if (snd_hammerfall_get_buffer(hdsp->pci, &hdsp->capture_dma_buf, HDSP_DMA_AREA_BYTES) < 0 || - snd_hammerfall_get_buffer(hdsp->pci, &hdsp->playback_dma_buf, HDSP_DMA_AREA_BYTES) < 0) { - if (hdsp->capture_dma_buf.area) - snd_dma_free_pages(&hdsp->capture_dma_buf); + hdsp->capture_dma_buf = + snd_hammerfall_get_buffer(hdsp->pci, HDSP_DMA_AREA_BYTES); + hdsp->playback_dma_buf = + snd_hammerfall_get_buffer(hdsp->pci, HDSP_DMA_AREA_BYTES); + if (!hdsp->capture_dma_buf || !hdsp->playback_dma_buf) { dev_err(hdsp->card->dev, "%s: no buffers available\n", hdsp->card_name); return -ENOMEM; @@ -3789,16 +3778,16 @@ static int snd_hdsp_initialize_memory(struct hdsp *hdsp) /* Align to bus-space 64K boundary */ - cb_bus = ALIGN(hdsp->capture_dma_buf.addr, 0x10000ul); - pb_bus = ALIGN(hdsp->playback_dma_buf.addr, 0x10000ul); + cb_bus = ALIGN(hdsp->capture_dma_buf->addr, 0x10000ul); + pb_bus = ALIGN(hdsp->playback_dma_buf->addr, 0x10000ul); /* Tell the card where it is */ hdsp_write(hdsp, HDSP_inputBufferAddress, cb_bus); hdsp_write(hdsp, HDSP_outputBufferAddress, pb_bus); - hdsp->capture_buffer = hdsp->capture_dma_buf.area + (cb_bus - hdsp->capture_dma_buf.addr); - hdsp->playback_buffer = hdsp->playback_dma_buf.area + (pb_bus - hdsp->playback_dma_buf.addr); + hdsp->capture_buffer = hdsp->capture_dma_buf->area + (cb_bus - hdsp->capture_dma_buf->addr); + hdsp->playback_buffer = hdsp->playback_dma_buf->area + (pb_bus - hdsp->playback_dma_buf->addr); return 0; } @@ -5313,7 +5302,7 @@ static int snd_hdsp_create(struct snd_card *card, is_9632 = 1; } - err = pci_enable_device(pci); + err = pcim_enable_device(pci); if (err < 0) return err; @@ -5323,15 +5312,15 @@ static int snd_hdsp_create(struct snd_card *card, if (err < 0) return err; hdsp->port = pci_resource_start(pci, 0); - hdsp->iobase = ioremap(hdsp->port, HDSP_IO_EXTENT); + hdsp->iobase = devm_ioremap(&pci->dev, hdsp->port, HDSP_IO_EXTENT); if (!hdsp->iobase) { dev_err(hdsp->card->dev, "unable to remap region 0x%lx-0x%lx\n", hdsp->port, hdsp->port + HDSP_IO_EXTENT - 1); return -EBUSY; } - if (request_irq(pci->irq, snd_hdsp_interrupt, IRQF_SHARED, - KBUILD_MODNAME, hdsp)) { + if (devm_request_irq(&pci->dev, pci->irq, snd_hdsp_interrupt, + IRQF_SHARED, KBUILD_MODNAME, hdsp)) { dev_err(hdsp->card->dev, "unable to use IRQ %d\n", pci->irq); return -EBUSY; } @@ -5411,8 +5400,10 @@ static int snd_hdsp_create(struct snd_card *card, return 0; } -static int snd_hdsp_free(struct hdsp *hdsp) +static void snd_hdsp_card_free(struct snd_card *card) { + struct hdsp *hdsp = card->private_data; + if (hdsp->port) { /* stop the audio, and cancel all interrupts */ cancel_work_sync(&hdsp->midi_work); @@ -5420,29 +5411,8 @@ static int snd_hdsp_free(struct hdsp *hdsp) hdsp_write (hdsp, HDSP_controlRegister, hdsp->control_register); } - if (hdsp->irq >= 0) - free_irq(hdsp->irq, (void *)hdsp); - - snd_hdsp_free_buffers(hdsp); - release_firmware(hdsp->firmware); vfree(hdsp->fw_uploaded); - iounmap(hdsp->iobase); - - if (hdsp->port) - pci_release_regions(hdsp->pci); - - if (pci_is_enabled(hdsp->pci)) - pci_disable_device(hdsp->pci); - return 0; -} - -static void snd_hdsp_card_free(struct snd_card *card) -{ - struct hdsp *hdsp = card->private_data; - - if (hdsp) - snd_hdsp_free(hdsp); } static int snd_hdsp_probe(struct pci_dev *pci, @@ -5460,8 +5430,8 @@ static int snd_hdsp_probe(struct pci_dev *pci, return -ENOENT; } - err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, - sizeof(struct hdsp), &card); + err = snd_devm_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, + sizeof(struct hdsp), &card); if (err < 0) return err; @@ -5471,32 +5441,23 @@ static int snd_hdsp_probe(struct pci_dev *pci, hdsp->pci = pci; err = snd_hdsp_create(card, hdsp); if (err) - goto free_card; + return err; strcpy(card->shortname, "Hammerfall DSP"); sprintf(card->longname, "%s at 0x%lx, irq %d", hdsp->card_name, hdsp->port, hdsp->irq); err = snd_card_register(card); - if (err) { -free_card: - snd_card_free(card); + if (err) return err; - } pci_set_drvdata(pci, card); dev++; return 0; } -static void snd_hdsp_remove(struct pci_dev *pci) -{ - snd_card_free(pci_get_drvdata(pci)); -} - static struct pci_driver hdsp_driver = { .name = KBUILD_MODNAME, .id_table = snd_hdsp_ids, .probe = snd_hdsp_probe, - .remove = snd_hdsp_remove, }; module_pci_driver(hdsp_driver); From patchwork Thu Jul 15 07:59:08 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379299 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 14014C07E96 for ; Thu, 15 Jul 2021 08:18:47 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 8C8AE6117A for ; Thu, 15 Jul 2021 08:18:46 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 8C8AE6117A Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id 2865916E8; Thu, 15 Jul 2021 10:17:55 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 2865916E8 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626337125; bh=XSFCpWcarI/UhCKK6/mXpzQb2gxAtZeW+imCNhjyJEI=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=gkmUq8S7ZH4QCYNCB2LiV2XYkOt6cYAPRd703o4bSP5upy/gNXjcWH/A6r3FMFJDM rdUEUHT68Xu/uLBK/+NQuHnnC1x9wYgbFNT/IdqwJlmx4Jbm2zSwooPTotdMHVzuIb HYo4z7QUgi6XwClAwsI+AwCPxDQwMgxafwVQXW+Y= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id 4B230F806FC; Thu, 15 Jul 2021 10:01:18 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id A91D0F806ED; Thu, 15 Jul 2021 10:01:12 +0200 (CEST) Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 46608F80529 for ; Thu, 15 Jul 2021 10:00:12 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 46608F80529 Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="haLQtpGD"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="lna+izMB" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out2.suse.de (Postfix) with ESMTP id 244F01FD3E for ; Thu, 15 Jul 2021 08:00:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336012; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=FAMtIW8bRBSWt+2TSKRdiNb5VV+3csQJNzMKaqR7Heg=; b=haLQtpGDwDV95wfYeLl37VFcFErSycUulMOS0IaqLs9QGNjplhxGQPKSKrfi4Juu0a6M+2 jOY+sqdFQOo2kl7gdaKFGUwWuESWcnY0fT7+upSIbON8kwBAMGl6ttVA5ST/9A6vcnxf+h u8LCNHezcrOsiA12CyQrmlVcjcIY/iE= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336012; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=FAMtIW8bRBSWt+2TSKRdiNb5VV+3csQJNzMKaqR7Heg=; b=lna+izMBho9ac8fHNt/HpCEy/TF+nrchff0/jRRuh4iHiS44Jh8a96GyzFnMh1DFJk0pLw BpxFT86M7agZZMCQ== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id 1226EA3B99; Thu, 15 Jul 2021 08:00:12 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 46/79] ALSA: hdspm: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:59:08 +0200 Message-Id: <20210715075941.23332-47-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in PCI hdspm driver with devres as a clean up. Each manual resource management is converted with the corresponding devres helper, and the card object release is managed now via card->private_free instead of a lowlevel snd_device. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- sound/pci/rme9652/hdspm.c | 64 ++++++++------------------------------- 1 file changed, 12 insertions(+), 52 deletions(-) diff --git a/sound/pci/rme9652/hdspm.c b/sound/pci/rme9652/hdspm.c index 97a0bff96b28..ff06ee82607c 100644 --- a/sound/pci/rme9652/hdspm.c +++ b/sound/pci/rme9652/hdspm.c @@ -6575,34 +6575,25 @@ static int snd_hdspm_create(struct snd_card *card, } } - err = pci_enable_device(pci); + err = pcim_enable_device(pci); if (err < 0) return err; pci_set_master(hdspm->pci); - err = pci_request_regions(pci, "hdspm"); + err = pcim_iomap_regions(pci, 1 << 0, "hdspm"); if (err < 0) return err; hdspm->port = pci_resource_start(pci, 0); io_extent = pci_resource_len(pci, 0); - - dev_dbg(card->dev, "grabbed memory region 0x%lx-0x%lx\n", - hdspm->port, hdspm->port + io_extent - 1); - - hdspm->iobase = ioremap(hdspm->port, io_extent); - if (!hdspm->iobase) { - dev_err(card->dev, "unable to remap region 0x%lx-0x%lx\n", - hdspm->port, hdspm->port + io_extent - 1); - return -EBUSY; - } + hdspm->iobase = pcim_iomap_table(pci)[0]; dev_dbg(card->dev, "remapped region (0x%lx) 0x%lx-0x%lx\n", (unsigned long)hdspm->iobase, hdspm->port, hdspm->port + io_extent - 1); - if (request_irq(pci->irq, snd_hdspm_interrupt, - IRQF_SHARED, KBUILD_MODNAME, hdspm)) { + if (devm_request_irq(&pci->dev, pci->irq, snd_hdspm_interrupt, + IRQF_SHARED, KBUILD_MODNAME, hdspm)) { dev_err(card->dev, "unable to use IRQ %d\n", pci->irq); return -EBUSY; } @@ -6614,7 +6605,7 @@ static int snd_hdspm_create(struct snd_card *card, dev_dbg(card->dev, "kmalloc Mixer memory of %zd Bytes\n", sizeof(*hdspm->mixer)); - hdspm->mixer = kzalloc(sizeof(*hdspm->mixer), GFP_KERNEL); + hdspm->mixer = devm_kzalloc(&pci->dev, sizeof(*hdspm->mixer), GFP_KERNEL); if (!hdspm->mixer) return -ENOMEM; @@ -6859,8 +6850,9 @@ static int snd_hdspm_create(struct snd_card *card, } -static int snd_hdspm_free(struct hdspm * hdspm) +static void snd_hdspm_card_free(struct snd_card *card) { + struct hdspm *hdspm = card->private_data; if (hdspm->port) { cancel_work_sync(&hdspm->midi_work); @@ -6873,28 +6865,6 @@ static int snd_hdspm_free(struct hdspm * hdspm) hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register); } - - if (hdspm->irq >= 0) - free_irq(hdspm->irq, (void *) hdspm); - - kfree(hdspm->mixer); - iounmap(hdspm->iobase); - - if (hdspm->port) - pci_release_regions(hdspm->pci); - - if (pci_is_enabled(hdspm->pci)) - pci_disable_device(hdspm->pci); - return 0; -} - - -static void snd_hdspm_card_free(struct snd_card *card) -{ - struct hdspm *hdspm = card->private_data; - - if (hdspm) - snd_hdspm_free(hdspm); } @@ -6913,8 +6883,8 @@ static int snd_hdspm_probe(struct pci_dev *pci, return -ENOENT; } - err = snd_card_new(&pci->dev, index[dev], id[dev], - THIS_MODULE, sizeof(*hdspm), &card); + err = snd_devm_card_new(&pci->dev, index[dev], id[dev], + THIS_MODULE, sizeof(*hdspm), &card); if (err < 0) return err; @@ -6925,7 +6895,7 @@ static int snd_hdspm_probe(struct pci_dev *pci, err = snd_hdspm_create(card, hdspm); if (err < 0) - goto free_card; + return err; if (hdspm->io_type != MADIface) { snprintf(card->shortname, sizeof(card->shortname), "%s_%x", @@ -6944,28 +6914,18 @@ static int snd_hdspm_probe(struct pci_dev *pci, err = snd_card_register(card); if (err < 0) - goto free_card; + return err; pci_set_drvdata(pci, card); dev++; return 0; - -free_card: - snd_card_free(card); - return err; -} - -static void snd_hdspm_remove(struct pci_dev *pci) -{ - snd_card_free(pci_get_drvdata(pci)); } static struct pci_driver hdspm_driver = { .name = KBUILD_MODNAME, .id_table = snd_hdspm_ids, .probe = snd_hdspm_probe, - .remove = snd_hdspm_remove, }; module_pci_driver(hdspm_driver); From patchwork Thu Jul 15 07:59:09 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379307 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id A1A24C07E96 for ; Thu, 15 Jul 2021 08:20:08 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 2461A611AC for ; Thu, 15 Jul 2021 08:20:08 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 2461A611AC Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id ABDD4171D; Thu, 15 Jul 2021 10:19:16 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz ABDD4171D DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626337206; bh=iNq3QaOXfXe8grDWrHSjRyWtauNqVs0q+n2LgMVLFg8=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=Av/pZmdPcT418Jty049HZ/j8vI+hZxrnQGYZTudjaBSlpOcDAxicwvFpDSeVM/G18 UY3ibxjI2C7AhjBkpsqU12hk8zLzN7w4kPBP1CZfB1mS1TFhFraRHnajSRYMRO0kd/ 0jp4UG+a+f56nAbBNKlyYCGUhL7wahA0mQrmY7Js= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id 2A034F80715; Thu, 15 Jul 2021 10:01:24 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id 74FFCF806EF; Thu, 15 Jul 2021 10:01:14 +0200 (CEST) Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id ACE7CF8052D for ; Thu, 15 Jul 2021 10:00:12 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz ACE7CF8052D Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="njF366zn"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="wWg2dqfu" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out2.suse.de (Postfix) with ESMTP id 89FA21FDEA for ; Thu, 15 Jul 2021 08:00:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336012; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=5FynoyZ6DnBFWpRSnQMvg3Zq5acyq38aZwxwrcjUPWU=; b=njF366znTe5l1Oh7DLZvb8kdQbZQfkBPFOl4y+IFxcMkoBWim/WzrMyHIi8AO23GjloE6u yNuqok43mI1rPK9/TEvkGmN9RiK2TR4Svl2uScLbp1XllOF+2wD4wKo7fNQUJSovQpgvr4 OKQIY1J/WO0x0x8ZmAZxH7r7BxB3nBs= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336012; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=5FynoyZ6DnBFWpRSnQMvg3Zq5acyq38aZwxwrcjUPWU=; b=wWg2dqfuQWkweLdrtYOgsUQXwdq+EvTvKw+4SrIO3N84N0o9rBg/DWL1Ghah7GqG3jYMYI yo6iHtv0LvI2qhAw== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id 77C7BA3B99; Thu, 15 Jul 2021 08:00:12 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 47/79] ALSA: rme9652: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:59:09 +0200 Message-Id: <20210715075941.23332-48-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in PCI rme9652 driver with devres as a clean up. Each manual resource management is converted with the corresponding devres helper, the page allocations are done with the devres helper, and the card object release is managed now via card->private_free instead of a lowlevel snd_device. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- sound/pci/rme9652/rme9652.c | 85 +++++++++++-------------------------- 1 file changed, 24 insertions(+), 61 deletions(-) diff --git a/sound/pci/rme9652/rme9652.c b/sound/pci/rme9652/rme9652.c index f1aad38760d6..45448a97070c 100644 --- a/sound/pci/rme9652/rme9652.c +++ b/sound/pci/rme9652/rme9652.c @@ -208,8 +208,8 @@ struct snd_rme9652 { unsigned char ds_channels; unsigned char ss_channels; /* different for hammerfall/hammerfall-light */ - struct snd_dma_buffer playback_dma_buf; - struct snd_dma_buffer capture_dma_buf; + struct snd_dma_buffer *playback_dma_buf; + struct snd_dma_buffer *capture_dma_buf; unsigned char *capture_buffer; /* suitably aligned address */ unsigned char *playback_buffer; /* suitably aligned address */ @@ -275,18 +275,12 @@ static const char channel_map_9636_ds[26] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }; -static int snd_hammerfall_get_buffer(struct pci_dev *pci, struct snd_dma_buffer *dmab, size_t size) +static struct snd_dma_buffer * +snd_hammerfall_get_buffer(struct pci_dev *pci, size_t size) { - return snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, &pci->dev, size, dmab); + return snd_devm_alloc_pages(&pci->dev, SNDRV_DMA_TYPE_DEV, size); } -static void snd_hammerfall_free_buffer(struct snd_dma_buffer *dmab, struct pci_dev *pci) -{ - if (dmab->area) - snd_dma_free_pages(dmab); -} - - static const struct pci_device_id snd_rme9652_ids[] = { { .vendor = 0x10ee, @@ -1715,37 +1709,23 @@ static void snd_rme9652_proc_init(struct snd_rme9652 *rme9652) snd_rme9652_proc_read); } -static void snd_rme9652_free_buffers(struct snd_rme9652 *rme9652) +static void snd_rme9652_card_free(struct snd_card *card) { - snd_hammerfall_free_buffer(&rme9652->capture_dma_buf, rme9652->pci); - snd_hammerfall_free_buffer(&rme9652->playback_dma_buf, rme9652->pci); -} + struct snd_rme9652 *rme9652 = (struct snd_rme9652 *) card->private_data; -static int snd_rme9652_free(struct snd_rme9652 *rme9652) -{ if (rme9652->irq >= 0) rme9652_stop(rme9652); - snd_rme9652_free_buffers(rme9652); - - if (rme9652->irq >= 0) - free_irq(rme9652->irq, (void *)rme9652); - iounmap(rme9652->iobase); - if (rme9652->port) - pci_release_regions(rme9652->pci); - - if (pci_is_enabled(rme9652->pci)) - pci_disable_device(rme9652->pci); - return 0; } static int snd_rme9652_initialize_memory(struct snd_rme9652 *rme9652) { unsigned long pb_bus, cb_bus; - if (snd_hammerfall_get_buffer(rme9652->pci, &rme9652->capture_dma_buf, RME9652_DMA_AREA_BYTES) < 0 || - snd_hammerfall_get_buffer(rme9652->pci, &rme9652->playback_dma_buf, RME9652_DMA_AREA_BYTES) < 0) { - if (rme9652->capture_dma_buf.area) - snd_dma_free_pages(&rme9652->capture_dma_buf); + rme9652->capture_dma_buf = + snd_hammerfall_get_buffer(rme9652->pci, RME9652_DMA_AREA_BYTES); + rme9652->playback_dma_buf = + snd_hammerfall_get_buffer(rme9652->pci, RME9652_DMA_AREA_BYTES); + if (!rme9652->capture_dma_buf || !rme9652->playback_dma_buf) { dev_err(rme9652->card->dev, "%s: no buffers available\n", rme9652->card_name); return -ENOMEM; @@ -1753,16 +1733,16 @@ static int snd_rme9652_initialize_memory(struct snd_rme9652 *rme9652) /* Align to bus-space 64K boundary */ - cb_bus = ALIGN(rme9652->capture_dma_buf.addr, 0x10000ul); - pb_bus = ALIGN(rme9652->playback_dma_buf.addr, 0x10000ul); + cb_bus = ALIGN(rme9652->capture_dma_buf->addr, 0x10000ul); + pb_bus = ALIGN(rme9652->playback_dma_buf->addr, 0x10000ul); /* Tell the card where it is */ rme9652_write(rme9652, RME9652_rec_buffer, cb_bus); rme9652_write(rme9652, RME9652_play_buffer, pb_bus); - rme9652->capture_buffer = rme9652->capture_dma_buf.area + (cb_bus - rme9652->capture_dma_buf.addr); - rme9652->playback_buffer = rme9652->playback_dma_buf.area + (pb_bus - rme9652->playback_dma_buf.addr); + rme9652->capture_buffer = rme9652->capture_dma_buf->area + (cb_bus - rme9652->capture_dma_buf->addr); + rme9652->playback_buffer = rme9652->playback_dma_buf->area + (pb_bus - rme9652->playback_dma_buf->addr); return 0; } @@ -2452,7 +2432,7 @@ static int snd_rme9652_create(struct snd_card *card, return -ENODEV; } - err = pci_enable_device(pci); + err = pcim_enable_device(pci); if (err < 0) return err; @@ -2462,15 +2442,15 @@ static int snd_rme9652_create(struct snd_card *card, if (err < 0) return err; rme9652->port = pci_resource_start(pci, 0); - rme9652->iobase = ioremap(rme9652->port, RME9652_IO_EXTENT); + rme9652->iobase = devm_ioremap(&pci->dev, rme9652->port, RME9652_IO_EXTENT); if (rme9652->iobase == NULL) { dev_err(card->dev, "unable to remap region 0x%lx-0x%lx\n", rme9652->port, rme9652->port + RME9652_IO_EXTENT - 1); return -EBUSY; } - if (request_irq(pci->irq, snd_rme9652_interrupt, IRQF_SHARED, - KBUILD_MODNAME, rme9652)) { + if (devm_request_irq(&pci->dev, pci->irq, snd_rme9652_interrupt, + IRQF_SHARED, KBUILD_MODNAME, rme9652)) { dev_err(card->dev, "unable to request IRQ %d\n", pci->irq); return -EBUSY; } @@ -2562,14 +2542,6 @@ static int snd_rme9652_create(struct snd_card *card, return 0; } -static void snd_rme9652_card_free(struct snd_card *card) -{ - struct snd_rme9652 *rme9652 = (struct snd_rme9652 *) card->private_data; - - if (rme9652) - snd_rme9652_free(rme9652); -} - static int snd_rme9652_probe(struct pci_dev *pci, const struct pci_device_id *pci_id) { @@ -2585,8 +2557,8 @@ static int snd_rme9652_probe(struct pci_dev *pci, return -ENOENT; } - err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, - sizeof(struct snd_rme9652), &card); + err = snd_devm_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, + sizeof(struct snd_rme9652), &card); if (err < 0) return err; @@ -2597,33 +2569,24 @@ static int snd_rme9652_probe(struct pci_dev *pci, rme9652->pci = pci; err = snd_rme9652_create(card, rme9652, precise_ptr[dev]); if (err) - goto free_card; + return err; strcpy(card->shortname, rme9652->card_name); sprintf(card->longname, "%s at 0x%lx, irq %d", card->shortname, rme9652->port, rme9652->irq); err = snd_card_register(card); - if (err) { -free_card: - snd_card_free(card); + if (err) return err; - } pci_set_drvdata(pci, card); dev++; return 0; } -static void snd_rme9652_remove(struct pci_dev *pci) -{ - snd_card_free(pci_get_drvdata(pci)); -} - static struct pci_driver rme9652_driver = { .name = KBUILD_MODNAME, .id_table = snd_rme9652_ids, .probe = snd_rme9652_probe, - .remove = snd_rme9652_remove, }; module_pci_driver(rme9652_driver); From patchwork Thu Jul 15 07:59:10 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379301 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id A1980C07E96 for ; Thu, 15 Jul 2021 08:19:06 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 252B361183 for ; Thu, 15 Jul 2021 08:19:06 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 252B361183 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id B4B6716DD; Thu, 15 Jul 2021 10:18:14 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz B4B6716DD DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626337144; bh=m6ILTGs7GK2tsm14WjfjsUSsqSUzELYYb8MomHLz2UY=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=eprms6ptjFHAckiCWoXoLwZ7i+mL8bRHuCzxmF3/5dUybX7A7OXNxs9IWXs/Qyxy8 0rFrAVWkU/H3NdUhb6Jt504YZPt3Km4UQA6aU0BHUVQEV4/ic4sTQZvRJ1Hift4IKe CK4KZy2act/UfU5TJY5jyJovQc0OpRjNpeQKGX0g= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id 2F5BCF804FE; Thu, 15 Jul 2021 10:01:20 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id 06D59F806ED; Thu, 15 Jul 2021 10:01:13 +0200 (CEST) Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 37812F80536 for ; Thu, 15 Jul 2021 10:00:13 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 37812F80536 Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="E263Wa9K"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="7ho2o5V0" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out1.suse.de (Postfix) with ESMTP id ECCB82284F for ; Thu, 15 Jul 2021 08:00:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336012; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=5eZyHW0wparX5iqE8KWGZU+8cEcEGbfEFwNVc/IO0SY=; b=E263Wa9KFiq+xubo096qQJFASRn1vcDwAw8fvCXRHslqH0ntQy29mGFtUNhOqnTjNTCwR9 u4GH6gNVhEyZKwNRn2blaxb9u7Xrv9j/4Pk1h1DtBxZ8JYtb/cKkOIHUul6+EsCC0XtmRA PH/HO8WG7RIu/G4GDvta9vSCeCP8JeM= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336012; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=5eZyHW0wparX5iqE8KWGZU+8cEcEGbfEFwNVc/IO0SY=; b=7ho2o5V0Oxs9Mt+zYGiDao73mzdskxj+0QF8THyDbS0cTWeLcVxFtbxBpCM6vZdUDTFYUM tAyH3O3dbJXkYGBg== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id D9D39A3B99; Thu, 15 Jul 2021 08:00:12 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 48/79] ALSA: trident: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:59:10 +0200 Message-Id: <20210715075941.23332-49-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in PCI trident driver with devres as a clean up. Each manual resource management is converted with the corresponding devres helper, the page allocations are done with the devres helper, and the card object release is managed now via card->private_free instead of a lowlevel snd_device. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- sound/pci/trident/trident.c | 39 ++++--------- sound/pci/trident/trident.h | 7 +-- sound/pci/trident/trident_main.c | 90 +++++++++--------------------- sound/pci/trident/trident_memory.c | 8 +-- 4 files changed, 44 insertions(+), 100 deletions(-) diff --git a/sound/pci/trident/trident.c b/sound/pci/trident/trident.c index 60e4dca28c2b..9922ab40798c 100644 --- a/sound/pci/trident/trident.c +++ b/sound/pci/trident/trident.c @@ -62,21 +62,18 @@ static int snd_trident_probe(struct pci_dev *pci, return -ENOENT; } - err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, - 0, &card); + err = snd_devm_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, + sizeof(*trident), &card); if (err < 0) return err; + trident = card->private_data; err = snd_trident_create(card, pci, pcm_channels[dev], ((pci->vendor << 16) | pci->device) == TRIDENT_DEVICE_ID_SI7018 ? 1 : 2, - wavetable_size[dev], - &trident); - if (err < 0) { - snd_card_free(card); + wavetable_size[dev]); + if (err < 0) return err; - } - card->private_data = trident; switch (trident->device) { case TRIDENT_DEVICE_ID_DX: @@ -102,26 +99,20 @@ static int snd_trident_probe(struct pci_dev *pci, card->shortname, trident->port, trident->irq); err = snd_trident_pcm(trident, pcm_dev++); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } switch (trident->device) { case TRIDENT_DEVICE_ID_DX: case TRIDENT_DEVICE_ID_NX: err = snd_trident_foldback_pcm(trident, pcm_dev++); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } break; } if (trident->device == TRIDENT_DEVICE_ID_NX || trident->device == TRIDENT_DEVICE_ID_SI7018) { err = snd_trident_spdif_pcm(trident, pcm_dev++); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } } if (trident->device != TRIDENT_DEVICE_ID_SI7018) { err = snd_mpu401_uart_new(card, 0, MPU401_HW_TRID4DWAVE, @@ -129,34 +120,24 @@ static int snd_trident_probe(struct pci_dev *pci, MPU401_INFO_INTEGRATED | MPU401_INFO_IRQ_HOOK, -1, &trident->rmidi); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } } snd_trident_create_gameport(trident); err = snd_card_register(card); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } pci_set_drvdata(pci, card); dev++; return 0; } -static void snd_trident_remove(struct pci_dev *pci) -{ - snd_card_free(pci_get_drvdata(pci)); -} - static struct pci_driver trident_driver = { .name = KBUILD_MODNAME, .id_table = snd_trident_ids, .probe = snd_trident_probe, - .remove = snd_trident_remove, #ifdef CONFIG_PM_SLEEP .driver = { .pm = &snd_trident_pm, diff --git a/sound/pci/trident/trident.h b/sound/pci/trident/trident.h index c579a44bb9ae..9768a7fc2349 100644 --- a/sound/pci/trident/trident.h +++ b/sound/pci/trident/trident.h @@ -251,9 +251,9 @@ struct snd_trident_memblk_arg { struct snd_trident_tlb { __le32 *entries; /* 16k-aligned TLB table */ dma_addr_t entries_dmaaddr; /* 16k-aligned PCI address to TLB table */ - struct snd_dma_buffer buffer; + struct snd_dma_buffer *buffer; struct snd_util_memhdr * memhdr; /* page allocation list */ - struct snd_dma_buffer silent_page; + struct snd_dma_buffer *silent_page; }; struct snd_trident_voice { @@ -400,8 +400,7 @@ int snd_trident_create(struct snd_card *card, struct pci_dev *pci, int pcm_streams, int pcm_spdif_device, - int max_wavetable_size, - struct snd_trident ** rtrident); + int max_wavetable_size); int snd_trident_create_gameport(struct snd_trident *trident); int snd_trident_pcm(struct snd_trident *trident, int device); diff --git a/sound/pci/trident/trident_main.c b/sound/pci/trident/trident_main.c index cfbca3bd60ed..e98eea1e6d81 100644 --- a/sound/pci/trident/trident_main.c +++ b/sound/pci/trident/trident_main.c @@ -42,7 +42,7 @@ static int snd_trident_sis_reset(struct snd_trident *trident); static void snd_trident_clear_voices(struct snd_trident * trident, unsigned short v_min, unsigned short v_max); -static int snd_trident_free(struct snd_trident *trident); +static void snd_trident_free(struct snd_card *card); /* * common I/O routines @@ -3299,12 +3299,6 @@ static void snd_trident_proc_init(struct snd_trident *trident) snd_card_ro_proc_new(trident->card, s, trident, snd_trident_proc_read); } -static int snd_trident_dev_free(struct snd_device *device) -{ - struct snd_trident *trident = device->device_data; - return snd_trident_free(trident); -} - /*--------------------------------------------------------------------------- snd_trident_tlb_alloc @@ -3324,23 +3318,27 @@ static int snd_trident_tlb_alloc(struct snd_trident *trident) /* TLB array must be aligned to 16kB !!! so we allocate 32kB region and correct offset when necessary */ - if (snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, &trident->pci->dev, - 2 * SNDRV_TRIDENT_MAX_PAGES * 4, &trident->tlb.buffer) < 0) { + trident->tlb.buffer = + snd_devm_alloc_pages(&trident->pci->dev, SNDRV_DMA_TYPE_DEV, + 2 * SNDRV_TRIDENT_MAX_PAGES * 4); + if (!trident->tlb.buffer) { dev_err(trident->card->dev, "unable to allocate TLB buffer\n"); return -ENOMEM; } - trident->tlb.entries = (__le32 *)ALIGN((unsigned long)trident->tlb.buffer.area, SNDRV_TRIDENT_MAX_PAGES * 4); - trident->tlb.entries_dmaaddr = ALIGN(trident->tlb.buffer.addr, SNDRV_TRIDENT_MAX_PAGES * 4); + trident->tlb.entries = (__le32 *)ALIGN((unsigned long)trident->tlb.buffer->area, SNDRV_TRIDENT_MAX_PAGES * 4); + trident->tlb.entries_dmaaddr = ALIGN(trident->tlb.buffer->addr, SNDRV_TRIDENT_MAX_PAGES * 4); /* allocate and setup silent page and initialise TLB entries */ - if (snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, &trident->pci->dev, - SNDRV_TRIDENT_PAGE_SIZE, &trident->tlb.silent_page) < 0) { + trident->tlb.silent_page = + snd_devm_alloc_pages(&trident->pci->dev, SNDRV_DMA_TYPE_DEV, + SNDRV_TRIDENT_PAGE_SIZE); + if (!trident->tlb.silent_page) { dev_err(trident->card->dev, "unable to allocate silent page\n"); return -ENOMEM; } - memset(trident->tlb.silent_page.area, 0, SNDRV_TRIDENT_PAGE_SIZE); + memset(trident->tlb.silent_page->area, 0, SNDRV_TRIDENT_PAGE_SIZE); for (i = 0; i < SNDRV_TRIDENT_MAX_PAGES; i++) - trident->tlb.entries[i] = cpu_to_le32(trident->tlb.silent_page.addr & ~(SNDRV_TRIDENT_PAGE_SIZE-1)); + trident->tlb.entries[i] = cpu_to_le32(trident->tlb.silent_page->addr & ~(SNDRV_TRIDENT_PAGE_SIZE-1)); /* use emu memory block manager code to manage tlb page allocation */ trident->tlb.memhdr = snd_util_memhdr_new(SNDRV_TRIDENT_PAGE_SIZE * SNDRV_TRIDENT_MAX_PAGES); @@ -3497,36 +3495,24 @@ int snd_trident_create(struct snd_card *card, struct pci_dev *pci, int pcm_streams, int pcm_spdif_device, - int max_wavetable_size, - struct snd_trident ** rtrident) + int max_wavetable_size) { - struct snd_trident *trident; + struct snd_trident *trident = card->private_data; int i, err; struct snd_trident_voice *voice; struct snd_trident_pcm_mixer *tmix; - static const struct snd_device_ops ops = { - .dev_free = snd_trident_dev_free, - }; - - *rtrident = NULL; /* enable PCI device */ - err = pci_enable_device(pci); + err = pcim_enable_device(pci); if (err < 0) return err; /* check, if we can restrict PCI DMA transfers to 30 bits */ if (dma_set_mask_and_coherent(&pci->dev, DMA_BIT_MASK(30))) { dev_err(card->dev, "architecture does not support 30bit PCI busmaster DMA\n"); - pci_disable_device(pci); return -ENXIO; } - trident = kzalloc(sizeof(*trident), GFP_KERNEL); - if (trident == NULL) { - pci_disable_device(pci); - return -ENOMEM; - } trident->device = (pci->vendor << 16) | pci->device; trident->card = card; trident->pci = pci; @@ -3542,22 +3528,19 @@ int snd_trident_create(struct snd_card *card, max_wavetable_size = 0; trident->synth.max_size = max_wavetable_size * 1024; trident->irq = -1; + card->private_free = snd_trident_free; trident->midi_port = TRID_REG(trident, T4D_MPU401_BASE); pci_set_master(pci); err = pci_request_regions(pci, "Trident Audio"); - if (err < 0) { - kfree(trident); - pci_disable_device(pci); + if (err < 0) return err; - } trident->port = pci_resource_start(pci, 0); - if (request_irq(pci->irq, snd_trident_interrupt, IRQF_SHARED, - KBUILD_MODNAME, trident)) { + if (devm_request_irq(&pci->dev, pci->irq, snd_trident_interrupt, + IRQF_SHARED, KBUILD_MODNAME, trident)) { dev_err(card->dev, "unable to grab IRQ %d\n", pci->irq); - snd_trident_free(trident); return -EBUSY; } trident->irq = pci->irq; @@ -3565,13 +3548,10 @@ int snd_trident_create(struct snd_card *card, /* allocate 16k-aligned TLB for NX cards */ trident->tlb.entries = NULL; - trident->tlb.buffer.area = NULL; if (trident->device == TRIDENT_DEVICE_ID_NX) { err = snd_trident_tlb_alloc(trident); - if (err < 0) { - snd_trident_free(trident); + if (err < 0) return err; - } } trident->spdif_bits = trident->spdif_pcm_bits = SNDRV_PCM_DEFAULT_CON_SPDIF; @@ -3591,16 +3571,8 @@ int snd_trident_create(struct snd_card *card, snd_BUG(); break; } - if (err < 0) { - snd_trident_free(trident); - return err; - } - - err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, trident, &ops); - if (err < 0) { - snd_trident_free(trident); + if (err < 0) return err; - } err = snd_trident_mixer(trident, pcm_spdif_device); if (err < 0) @@ -3624,7 +3596,6 @@ int snd_trident_create(struct snd_card *card, snd_trident_enable_eso(trident); snd_trident_proc_init(trident); - *rtrident = trident; return 0; } @@ -3634,14 +3605,16 @@ int snd_trident_create(struct snd_card *card, Description: This routine will free the device specific class for the 4DWave card. - Parameters: trident - device specific private data for 4DWave card + Parameters: card - card to release Returns: None. ---------------------------------------------------------------------------*/ -static int snd_trident_free(struct snd_trident *trident) +static void snd_trident_free(struct snd_card *card) { + struct snd_trident *trident = card->private_data; + snd_trident_free_gameport(trident); snd_trident_disable_eso(trident); // Disable S/PDIF out @@ -3650,19 +3623,10 @@ static int snd_trident_free(struct snd_trident *trident) else if (trident->device == TRIDENT_DEVICE_ID_SI7018) { outl(0, TRID_REG(trident, SI_SERIAL_INTF_CTRL)); } - if (trident->irq >= 0) - free_irq(trident->irq, trident); - if (trident->tlb.buffer.area) { + if (trident->tlb.buffer) { outl(0, TRID_REG(trident, NX_TLBC)); snd_util_memhdr_free(trident->tlb.memhdr); - if (trident->tlb.silent_page.area) - snd_dma_free_pages(&trident->tlb.silent_page); - snd_dma_free_pages(&trident->tlb.buffer); } - pci_release_regions(trident->pci); - pci_disable_device(trident->pci); - kfree(trident); - return 0; } /*--------------------------------------------------------------------------- diff --git a/sound/pci/trident/trident_memory.c b/sound/pci/trident/trident_memory.c index 4ad3855101c9..05de2b9f4ed7 100644 --- a/sound/pci/trident/trident_memory.c +++ b/sound/pci/trident/trident_memory.c @@ -31,7 +31,7 @@ /* fill TLB entrie(s) corresponding to page with ptr */ #define set_tlb_bus(trident,page,addr) __set_tlb_bus(trident,page,addr) /* fill TLB entrie(s) corresponding to page with silence pointer */ -#define set_silent_tlb(trident,page) __set_tlb_bus(trident, page, trident->tlb.silent_page.addr) +#define set_silent_tlb(trident,page) __set_tlb_bus(trident, page, trident->tlb.silent_page->addr) /* get aligned page from offset address */ #define get_aligned_page(offset) ((offset) >> 12) /* get offset address from aligned page */ @@ -58,8 +58,8 @@ static inline void set_tlb_bus(struct snd_trident *trident, int page, static inline void set_silent_tlb(struct snd_trident *trident, int page) { page <<= 1; - __set_tlb_bus(trident, page, trident->tlb.silent_page.addr); - __set_tlb_bus(trident, page+1, trident->tlb.silent_page.addr); + __set_tlb_bus(trident, page, trident->tlb.silent_page->addr); + __set_tlb_bus(trident, page+1, trident->tlb.silent_page->addr); } #else @@ -92,7 +92,7 @@ static inline void set_silent_tlb(struct snd_trident *trident, int page) int i; page *= UNIT_PAGES; for (i = 0; i < UNIT_PAGES; i++, page++) - __set_tlb_bus(trident, page, trident->tlb.silent_page.addr); + __set_tlb_bus(trident, page, trident->tlb.silent_page->addr); } #endif /* PAGE_SIZE */ From patchwork Thu Jul 15 07:59:11 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379305 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2AA1EC07E96 for ; Thu, 15 Jul 2021 08:19:45 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 2FEB761183 for ; Thu, 15 Jul 2021 08:19:44 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 2FEB761183 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id BD3191663; Thu, 15 Jul 2021 10:18:52 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz BD3191663 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626337182; bh=ZNOjcVUmN7mpJBg0fwsyXG3qaNDYfAmD1igigzAYbBU=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=qavrnIh/mKdly7ykAOA9TI1Mm4ldrLEWe5HvJFpj1hEH96oMCkcGKeojvT5paoW+G dHVYWJpg5F13lH0o34rQtosYZ4aMs7HiaJyoe4lQzDc6GFwhxIEqvGajnKZ1qDMOn1 KsXLfn12qpFkdgW6RwliZjrO9fdXPFFbnzo+6XSE= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id 298C9F80714; Thu, 15 Jul 2021 10:01:23 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id D4A29F806ED; Thu, 15 Jul 2021 10:01:13 +0200 (CEST) Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 7A96FF80538 for ; Thu, 15 Jul 2021 10:00:13 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 7A96FF80538 Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="pHdCPoJt"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="S/6mzRDO" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out1.suse.de (Postfix) with ESMTP id 565B922833 for ; Thu, 15 Jul 2021 08:00:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336013; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=PKlGyoq1rpQzmRBIL2v666jZgzLLVK+izAKnR8LW/ZM=; b=pHdCPoJthKyfYOg8NAvc8JWhIrzBtrkVtIFP05pI6k9y5I3rLf6Mp+CCnhIiV1uYEBN9ES Zl0Q8/9ifiELo5s5ye6tDbr7w8BRbC50ihwuG8bznCmRj5fx8uM4SuG6sHTkyfdppW5uv5 bbPoCAj2HsmTWtc+TZ18JjVpBYas+NU= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336013; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=PKlGyoq1rpQzmRBIL2v666jZgzLLVK+izAKnR8LW/ZM=; b=S/6mzRDOHJuzY3HlHjxoXAfoPurbTkwY7tfKeXzqksw701Ub8Dd+DAq+CPh/VvRKrht0w3 MLQQnsd2y9kAZ5Dg== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id 456E4A3B9C; Thu, 15 Jul 2021 08:00:13 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 49/79] ALSA: vx: Manage vx_core object with devres Date: Thu, 15 Jul 2021 09:59:11 +0200 Message-Id: <20210715075941.23332-50-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" The firmware data are also released automatically. Signed-off-by: Takashi Iwai --- sound/drivers/vx/vx_core.c | 12 ++++++++++-- sound/pci/vx222/vx222.c | 1 - sound/pcmcia/vx/vxpocket.c | 22 ---------------------- 3 files changed, 10 insertions(+), 25 deletions(-) diff --git a/sound/drivers/vx/vx_core.c b/sound/drivers/vx/vx_core.c index a10449af5a76..18901e5bcfcf 100644 --- a/sound/drivers/vx/vx_core.c +++ b/sound/drivers/vx/vx_core.c @@ -774,6 +774,11 @@ int snd_vx_resume(struct vx_core *chip) EXPORT_SYMBOL(snd_vx_resume); #endif +static void snd_vx_release(struct device *dev, void *data) +{ + snd_vx_free_firmware(data); +} + /** * snd_vx_create - constructor for struct vx_core * @card: card instance @@ -784,6 +789,8 @@ EXPORT_SYMBOL(snd_vx_resume); * this function allocates the instance and prepare for the hardware * initialization. * + * The object is managed via devres, and will be automatically released. + * * return the instance pointer if successful, NULL in error. */ struct vx_core *snd_vx_create(struct snd_card *card, @@ -796,8 +803,9 @@ struct vx_core *snd_vx_create(struct snd_card *card, if (snd_BUG_ON(!card || !hw || !ops)) return NULL; - chip = kzalloc(sizeof(*chip) + extra_size, GFP_KERNEL); - if (! chip) + chip = devres_alloc(snd_vx_release, sizeof(*chip) + extra_size, + GFP_KERNEL); + if (!chip) return NULL; mutex_init(&chip->lock); chip->irq = -1; diff --git a/sound/pci/vx222/vx222.c b/sound/pci/vx222/vx222.c index 04c7204cb7bc..46a80ef1d481 100644 --- a/sound/pci/vx222/vx222.c +++ b/sound/pci/vx222/vx222.c @@ -109,7 +109,6 @@ static int snd_vx222_free(struct vx_core *chip) if (vx->port[0]) pci_release_regions(vx->pci); pci_disable_device(vx->pci); - kfree(chip); return 0; } diff --git a/sound/pcmcia/vx/vxpocket.c b/sound/pcmcia/vx/vxpocket.c index 0dfb6a943b60..7a0f0e73ceb2 100644 --- a/sound/pcmcia/vx/vxpocket.c +++ b/sound/pcmcia/vx/vxpocket.c @@ -50,19 +50,6 @@ static void vxpocket_release(struct pcmcia_device *link) pcmcia_disable_device(link); } -/* - * destructor, called from snd_card_free_when_closed() - */ -static int snd_vxpocket_dev_free(struct snd_device *device) -{ - struct vx_core *chip = device->device_data; - - snd_vx_free_firmware(chip); - kfree(chip); - return 0; -} - - /* * Hardware information */ @@ -122,21 +109,12 @@ static int snd_vxpocket_new(struct snd_card *card, int ibl, { struct vx_core *chip; struct snd_vxpocket *vxp; - static const struct snd_device_ops ops = { - .dev_free = snd_vxpocket_dev_free, - }; - int err; chip = snd_vx_create(card, &vxpocket_hw, &snd_vxpocket_ops, sizeof(struct snd_vxpocket) - sizeof(struct vx_core)); if (!chip) return -ENOMEM; - err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops); - if (err < 0) { - kfree(chip); - return err; - } chip->ibl.size = ibl; vxp = to_vxpocket(chip); From patchwork Thu Jul 15 07:59:12 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379311 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id AB70CC07E96 for ; Thu, 15 Jul 2021 08:21:00 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id D2A5361183 for ; Thu, 15 Jul 2021 08:20:59 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org D2A5361183 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id 6FBD416DD; Thu, 15 Jul 2021 10:20:08 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 6FBD416DD DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626337258; bh=bJeooBzmrn4yWHblukwag+ihLGjQto098NhO1OjFHz4=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=aDQzBsYYBgQ+4fUsC/8nmX5QV7Ti+oYJPmB1XRbUOi0ohD0DtnPjRmeaLSg3GEtpz cwrorhwFSO1Ys0wSLDQKx79KFOA5pgcxVRF8Xl193lVCkD9w6FPDDK8zXPimlB79zn ZJhzucLgtCz47tG33TsG0TX87ZhZMaYmbVJ6JRV4= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id F2237F8072A; Thu, 15 Jul 2021 10:01:27 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id CB898F80713; Thu, 15 Jul 2021 10:01:20 +0200 (CEST) Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id E28A8F80534 for ; Thu, 15 Jul 2021 10:00:13 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz E28A8F80534 Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="yZKf8WSO"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="e5r5y2MX" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out2.suse.de (Postfix) with ESMTP id BFE1F1FD3E for ; Thu, 15 Jul 2021 08:00:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336013; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=g79u6p2iEPWn+mTcvW/LzQPp6XkIOpnWgGbmffefZSk=; b=yZKf8WSOYHShHLgwiJWc3dMVSBsogGXNK8ulSgKZTOe5Q0fj5mkqT6eh294kRDGdRpx5Jr HTH7x6yblizY5Ft0kEs1liB/LDpS9HfpnImGKPrehvze/wgGcnGk5fpQ1SfXRosVr9NEZH npIx7fVoJFbcpSsm+P6mxPfIbuzjRLo= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336013; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=g79u6p2iEPWn+mTcvW/LzQPp6XkIOpnWgGbmffefZSk=; b=e5r5y2MXEGy8RM/14w0lQNb71zv4/vkP9N2eULQpjMVF53tgh2jdX6flHNT/c2rq/XTorL W4LuMrDfByetawAg== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id AEF84A3B9C; Thu, 15 Jul 2021 08:00:13 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 50/79] ALSA: vx222: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:59:12 +0200 Message-Id: <20210715075941.23332-51-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in PCI vx222 driver with devres as a clean up. Each manual resource management is converted with the corresponding devres helper, and the card object release is managed now via card->private_free instead of a lowlevel snd_device. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- sound/pci/vx222/vx222.c | 68 +++++++---------------------------------- 1 file changed, 11 insertions(+), 57 deletions(-) diff --git a/sound/pci/vx222/vx222.c b/sound/pci/vx222/vx222.c index 46a80ef1d481..f48cc20b9e8a 100644 --- a/sound/pci/vx222/vx222.c +++ b/sound/pci/vx222/vx222.c @@ -100,25 +100,6 @@ static const struct snd_vx_hardware vx222_mic_hw = { /* */ -static int snd_vx222_free(struct vx_core *chip) -{ - struct snd_vx222 *vx = to_vx222(chip); - - if (chip->irq >= 0) - free_irq(chip->irq, (void*)chip); - if (vx->port[0]) - pci_release_regions(vx->pci); - pci_disable_device(vx->pci); - return 0; -} - -static int snd_vx222_dev_free(struct snd_device *device) -{ - struct vx_core *chip = device->device_data; - return snd_vx222_free(chip); -} - - static int snd_vx222_create(struct snd_card *card, struct pci_dev *pci, const struct snd_vx_hardware *hw, struct snd_vx222 **rchip) @@ -126,13 +107,10 @@ static int snd_vx222_create(struct snd_card *card, struct pci_dev *pci, struct vx_core *chip; struct snd_vx222 *vx; int i, err; - static const struct snd_device_ops ops = { - .dev_free = snd_vx222_dev_free, - }; const struct snd_vx_ops *vx_ops; /* enable PCI device */ - err = pci_enable_device(pci); + err = pcim_enable_device(pci); if (err < 0) return err; pci_set_master(pci); @@ -140,38 +118,26 @@ static int snd_vx222_create(struct snd_card *card, struct pci_dev *pci, vx_ops = hw->type == VX_TYPE_BOARD ? &vx222_old_ops : &vx222_ops; chip = snd_vx_create(card, hw, vx_ops, sizeof(struct snd_vx222) - sizeof(struct vx_core)); - if (! chip) { - pci_disable_device(pci); + if (!chip) return -ENOMEM; - } vx = to_vx222(chip); vx->pci = pci; err = pci_request_regions(pci, CARD_NAME); - if (err < 0) { - snd_vx222_free(chip); + if (err < 0) return err; - } for (i = 0; i < 2; i++) vx->port[i] = pci_resource_start(pci, i + 1); - if (request_threaded_irq(pci->irq, snd_vx_irq_handler, - snd_vx_threaded_irq_handler, IRQF_SHARED, - KBUILD_MODNAME, chip)) { + if (devm_request_threaded_irq(&pci->dev, pci->irq, snd_vx_irq_handler, + snd_vx_threaded_irq_handler, IRQF_SHARED, + KBUILD_MODNAME, chip)) { dev_err(card->dev, "unable to grab IRQ %d\n", pci->irq); - snd_vx222_free(chip); return -EBUSY; } chip->irq = pci->irq; card->sync_irq = chip->irq; - err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops); - if (err < 0) { - snd_vx222_free(chip); - return err; - } - - *rchip = vx; return 0; } @@ -192,8 +158,8 @@ static int snd_vx222_probe(struct pci_dev *pci, return -ENOENT; } - err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, - 0, &card); + err = snd_devm_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, + 0, &card); if (err < 0) return err; @@ -210,10 +176,8 @@ static int snd_vx222_probe(struct pci_dev *pci, break; } err = snd_vx222_create(card, pci, hw, &vx); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } card->private_data = vx; vx->core.ibl.size = ibl[dev]; @@ -227,27 +191,18 @@ static int snd_vx222_probe(struct pci_dev *pci, #endif err = snd_vx_setup_firmware(&vx->core); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } err = snd_card_register(card); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } pci_set_drvdata(pci, card); dev++; return 0; } -static void snd_vx222_remove(struct pci_dev *pci) -{ - snd_card_free(pci_get_drvdata(pci)); -} - #ifdef CONFIG_PM_SLEEP static int snd_vx222_suspend(struct device *dev) { @@ -275,7 +230,6 @@ static struct pci_driver vx222_driver = { .name = KBUILD_MODNAME, .id_table = snd_vx222_ids, .probe = snd_vx222_probe, - .remove = snd_vx222_remove, .driver = { .pm = SND_VX222_PM_OPS, }, From patchwork Thu Jul 15 07:59:13 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379315 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7FF0CC07E96 for ; Thu, 15 Jul 2021 08:21:39 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 0188E611C0 for ; Thu, 15 Jul 2021 08:21:38 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 0188E611C0 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id 901C716B6; Thu, 15 Jul 2021 10:20:47 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 901C716B6 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626337297; bh=leC9hgDjkXiJVunPaREytezWH6Bv1WE2rEOjnOhH7Tw=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=JszBm/sT1L8OS3nnT/UXmf/zC69meHysKWDzdppaC/xV8eHBAekmfRh8HAkNlNK/H 3wBJwYJ6nPLqFAxFCchNgOp+0wX8T84sTq0pZjC/Z+qaltbouNvnQ0hD9R7RdWfnGN QXQhhd5fx4B8IPYyVto+2rq8vNnX7fmOwXlYjPOg= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id 2D853F80737; Thu, 15 Jul 2021 10:01:30 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id 06C10F80714; Thu, 15 Jul 2021 10:01:21 +0200 (CEST) Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 5D8FAF8053E for ; Thu, 15 Jul 2021 10:00:14 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 5D8FAF8053E Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="QlWRRoA9"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="S7Hp3tg6" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out2.suse.de (Postfix) with ESMTP id 315361FDE5 for ; Thu, 15 Jul 2021 08:00:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336014; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=6rZ6pOlZew0R2Yyj8RoZrrzWfRNG6rdH5eF8fLndoIo=; b=QlWRRoA9rd5+SQQwVV+BkMngrhgTlKVNOUbXOZ5pQd0HpW6T+snPyPViFOwPRR2fP+O6Au L4JICReCBcxUQf5G7jic4kru252gp3O611n/HtAzivkpNauNfM5KnX+EDUKyXcRQZLMotP HicYGlSNPdaukwZovMIAqwjnQxbzLKs= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336014; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=6rZ6pOlZew0R2Yyj8RoZrrzWfRNG6rdH5eF8fLndoIo=; b=S7Hp3tg6DUXWt7EyOSp8VjDMSwtW4zpaUp5TEQN4LYlR/n4JEdt4MgCNJOhAu2/f+vhHuZ TKm1lLR3mUqQ1fBA== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id 2819FA3B8F; Thu, 15 Jul 2021 08:00:14 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 51/79] ALSA: ymfpci: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:59:13 +0200 Message-Id: <20210715075941.23332-52-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in PCI ymfpci driver with devres as a clean up. Each manual resource management is converted with the corresponding devres helper, the page allocations are done with the devres helper, and the card object release is managed now via card->private_free instead of a lowlevel snd_device. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- sound/pci/ymfpci/ymfpci.c | 66 ++++++--------- sound/pci/ymfpci/ymfpci.h | 8 +- sound/pci/ymfpci/ymfpci_main.c | 149 +++++++++++---------------------- 3 files changed, 74 insertions(+), 149 deletions(-) diff --git a/sound/pci/ymfpci/ymfpci.c b/sound/pci/ymfpci/ymfpci.c index 7e32d57147ff..1e198e4d57b8 100644 --- a/sound/pci/ymfpci/ymfpci.c +++ b/sound/pci/ymfpci/ymfpci.c @@ -105,7 +105,8 @@ static int snd_ymfpci_create_gameport(struct snd_ymfpci *chip, int dev, } if (!r) { - r = request_region(io_port, 1, "YMFPCI gameport"); + r = devm_request_region(&chip->pci->dev, io_port, 1, + "YMFPCI gameport"); if (!r) { dev_err(chip->card->dev, "joystick port %#x is in use.\n", io_port); @@ -117,7 +118,6 @@ static int snd_ymfpci_create_gameport(struct snd_ymfpci *chip, int dev, if (!gp) { dev_err(chip->card->dev, "cannot allocate memory for gameport\n"); - release_and_free_resource(r); return -ENOMEM; } @@ -126,7 +126,6 @@ static int snd_ymfpci_create_gameport(struct snd_ymfpci *chip, int dev, gameport_set_phys(gp, "pci%s/gameport0", pci_name(chip->pci)); gameport_set_dev_parent(gp, &chip->pci->dev); gp->io = io_port; - gameport_set_port_data(gp, r); if (chip->pci->device >= 0x0010) /* YMF 744/754 */ pci_write_config_word(chip->pci, PCIR_DSXG_JOYBASE, io_port); @@ -142,12 +141,8 @@ static int snd_ymfpci_create_gameport(struct snd_ymfpci *chip, int dev, void snd_ymfpci_free_gameport(struct snd_ymfpci *chip) { if (chip->gameport) { - struct resource *r = gameport_get_port_data(chip->gameport); - gameport_unregister_port(chip->gameport); chip->gameport = NULL; - - release_and_free_resource(r); } } #else @@ -176,9 +171,10 @@ static int snd_card_ymfpci_probe(struct pci_dev *pci, } err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, - 0, &card); + sizeof(*chip), &card); if (err < 0) return err; + chip = card->private_data; switch (pci_id->device) { case 0x0004: str = "YMF724"; model = "DS-1"; break; @@ -199,7 +195,8 @@ static int snd_card_ymfpci_probe(struct pci_dev *pci, fm_port[dev] = pci_resource_start(pci, 1); } if (fm_port[dev] > 0) - fm_res = request_region(fm_port[dev], 4, "YMFPCI OPL3"); + fm_res = devm_request_region(&pci->dev, fm_port[dev], + 4, "YMFPCI OPL3"); if (fm_res) { legacy_ctrl |= YMFPCI_LEGACY_FMEN; pci_write_config_word(pci, PCIR_DSXG_FMBASE, fm_port[dev]); @@ -209,7 +206,8 @@ static int snd_card_ymfpci_probe(struct pci_dev *pci, mpu_port[dev] = pci_resource_start(pci, 1) + 0x20; } if (mpu_port[dev] > 0) - mpu_res = request_region(mpu_port[dev], 2, "YMFPCI MPU401"); + mpu_res = devm_request_region(&pci->dev, mpu_port[dev], + 2, "YMFPCI MPU401"); if (mpu_res) { legacy_ctrl |= YMFPCI_LEGACY_MEN; pci_write_config_word(pci, PCIR_DSXG_MPU401BASE, mpu_port[dev]); @@ -223,7 +221,8 @@ static int snd_card_ymfpci_probe(struct pci_dev *pci, default: fm_port[dev] = 0; break; } if (fm_port[dev] > 0) - fm_res = request_region(fm_port[dev], 4, "YMFPCI OPL3"); + fm_res = devm_request_region(&pci->dev, fm_port[dev], + 4, "YMFPCI OPL3"); if (fm_res) { legacy_ctrl |= YMFPCI_LEGACY_FMEN; } else { @@ -238,7 +237,8 @@ static int snd_card_ymfpci_probe(struct pci_dev *pci, default: mpu_port[dev] = 0; break; } if (mpu_port[dev] > 0) - mpu_res = request_region(mpu_port[dev], 2, "YMFPCI MPU401"); + mpu_res = devm_request_region(&pci->dev, mpu_port[dev], + 2, "YMFPCI MPU401"); if (mpu_res) { legacy_ctrl |= YMFPCI_LEGACY_MEN; } else { @@ -253,15 +253,9 @@ static int snd_card_ymfpci_probe(struct pci_dev *pci, pci_read_config_word(pci, PCIR_DSXG_LEGACY, &old_legacy_ctrl); pci_write_config_word(pci, PCIR_DSXG_LEGACY, legacy_ctrl); pci_write_config_word(pci, PCIR_DSXG_ELEGACY, legacy_ctrl2); - err = snd_ymfpci_create(card, pci, old_legacy_ctrl, &chip); - if (err < 0) { - release_and_free_resource(mpu_res); - release_and_free_resource(fm_res); - goto free_card; - } - chip->fm_res = fm_res; - chip->mpu_res = mpu_res; - card->private_data = chip; + err = snd_ymfpci_create(card, pci, old_legacy_ctrl); + if (err < 0) + return err; strcpy(card->driver, str); sprintf(card->shortname, "Yamaha %s (%s)", model, str); @@ -271,30 +265,30 @@ static int snd_card_ymfpci_probe(struct pci_dev *pci, chip->irq); err = snd_ymfpci_pcm(chip, 0); if (err < 0) - goto free_card; + return err; err = snd_ymfpci_pcm_spdif(chip, 1); if (err < 0) - goto free_card; + return err; err = snd_ymfpci_mixer(chip, rear_switch[dev]); if (err < 0) - goto free_card; + return err; if (chip->ac97->ext_id & AC97_EI_SDAC) { err = snd_ymfpci_pcm_4ch(chip, 2); if (err < 0) - goto free_card; + return err; err = snd_ymfpci_pcm2(chip, 3); if (err < 0) - goto free_card; + return err; } err = snd_ymfpci_timer(chip, 0); if (err < 0) - goto free_card; + return err; - if (chip->mpu_res) { + if (mpu_res) { err = snd_mpu401_uart_new(card, 0, MPU401_HW_YMFPCI, mpu_port[dev], MPU401_INFO_INTEGRATED | @@ -308,7 +302,7 @@ static int snd_card_ymfpci_probe(struct pci_dev *pci, pci_write_config_word(pci, PCIR_DSXG_LEGACY, legacy_ctrl); } } - if (chip->fm_res) { + if (fm_res) { err = snd_opl3_create(card, fm_port[dev], fm_port[dev] + 2, @@ -323,7 +317,7 @@ static int snd_card_ymfpci_probe(struct pci_dev *pci, err = snd_opl3_hwdep_new(opl3, 0, 1, NULL); if (err < 0) { dev_err(card->dev, "cannot create opl3 hwdep\n"); - goto free_card; + return err; } } } @@ -332,27 +326,17 @@ static int snd_card_ymfpci_probe(struct pci_dev *pci, err = snd_card_register(card); if (err < 0) - goto free_card; + return err; pci_set_drvdata(pci, card); dev++; return 0; - -free_card: - snd_card_free(card); - return err; -} - -static void snd_card_ymfpci_remove(struct pci_dev *pci) -{ - snd_card_free(pci_get_drvdata(pci)); } static struct pci_driver ymfpci_driver = { .name = KBUILD_MODNAME, .id_table = snd_ymfpci_ids, .probe = snd_card_ymfpci_probe, - .remove = snd_card_ymfpci_remove, #ifdef CONFIG_PM_SLEEP .driver = { .pm = &snd_ymfpci_pm, diff --git a/sound/pci/ymfpci/ymfpci.h b/sound/pci/ymfpci/ymfpci.h index c73d8a5f4d0b..66968776478a 100644 --- a/sound/pci/ymfpci/ymfpci.h +++ b/sound/pci/ymfpci/ymfpci.h @@ -275,16 +275,13 @@ struct snd_ymfpci { unsigned char rev; /* PCI revision */ unsigned long reg_area_phys; void __iomem *reg_area_virt; - struct resource *res_reg_area; - struct resource *fm_res; - struct resource *mpu_res; unsigned short old_legacy_ctrl; #ifdef SUPPORT_JOYSTICK struct gameport *gameport; #endif - struct snd_dma_buffer work_ptr; + struct snd_dma_buffer *work_ptr; unsigned int bank_size_playback; unsigned int bank_size_capture; @@ -358,8 +355,7 @@ struct snd_ymfpci { int snd_ymfpci_create(struct snd_card *card, struct pci_dev *pci, - unsigned short old_legacy_ctrl, - struct snd_ymfpci ** rcodec); + unsigned short old_legacy_ctrl); void snd_ymfpci_free_gameport(struct snd_ymfpci *chip); extern const struct dev_pm_ops snd_ymfpci_pm; diff --git a/sound/pci/ymfpci/ymfpci_main.c b/sound/pci/ymfpci/ymfpci_main.c index 8fd060769882..c80114c0ad7b 100644 --- a/sound/pci/ymfpci/ymfpci_main.c +++ b/sound/pci/ymfpci/ymfpci_main.c @@ -2116,11 +2116,12 @@ static int snd_ymfpci_memalloc(struct snd_ymfpci *chip) chip->work_size; /* work_ptr must be aligned to 256 bytes, but it's already covered with the kernel page allocation mechanism */ - if (snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, &chip->pci->dev, - size, &chip->work_ptr) < 0) + chip->work_ptr = snd_devm_alloc_pages(&chip->pci->dev, + SNDRV_DMA_TYPE_DEV, size); + if (!chip->work_ptr) return -ENOMEM; - ptr = chip->work_ptr.area; - ptr_addr = chip->work_ptr.addr; + ptr = chip->work_ptr->area; + ptr_addr = chip->work_ptr->addr; memset(ptr, 0, size); /* for sure */ chip->bank_base_playback = ptr; @@ -2165,7 +2166,7 @@ static int snd_ymfpci_memalloc(struct snd_ymfpci *chip) chip->work_base_addr = ptr_addr; snd_BUG_ON(ptr + chip->work_size != - chip->work_ptr.area + chip->work_ptr.bytes); + chip->work_ptr->area + chip->work_ptr->bytes); snd_ymfpci_writel(chip, YDSXGR_PLAYCTRLBASE, chip->bank_base_playback_addr); snd_ymfpci_writel(chip, YDSXGR_RECCTRLBASE, chip->bank_base_capture_addr); @@ -2196,65 +2197,32 @@ static int snd_ymfpci_memalloc(struct snd_ymfpci *chip) return 0; } -static int snd_ymfpci_free(struct snd_ymfpci *chip) +static void snd_ymfpci_free(struct snd_card *card) { + struct snd_ymfpci *chip = card->private_data; u16 ctrl; - if (snd_BUG_ON(!chip)) - return -EINVAL; - - if (chip->res_reg_area) { /* don't touch busy hardware */ - snd_ymfpci_writel(chip, YDSXGR_NATIVEDACOUTVOL, 0); - snd_ymfpci_writel(chip, YDSXGR_BUF441OUTVOL, 0); - snd_ymfpci_writel(chip, YDSXGR_LEGACYOUTVOL, 0); - snd_ymfpci_writel(chip, YDSXGR_STATUS, ~0); - snd_ymfpci_disable_dsp(chip); - snd_ymfpci_writel(chip, YDSXGR_PLAYCTRLBASE, 0); - snd_ymfpci_writel(chip, YDSXGR_RECCTRLBASE, 0); - snd_ymfpci_writel(chip, YDSXGR_EFFCTRLBASE, 0); - snd_ymfpci_writel(chip, YDSXGR_WORKBASE, 0); - snd_ymfpci_writel(chip, YDSXGR_WORKSIZE, 0); - ctrl = snd_ymfpci_readw(chip, YDSXGR_GLOBALCTRL); - snd_ymfpci_writew(chip, YDSXGR_GLOBALCTRL, ctrl & ~0x0007); - } + snd_ymfpci_writel(chip, YDSXGR_NATIVEDACOUTVOL, 0); + snd_ymfpci_writel(chip, YDSXGR_BUF441OUTVOL, 0); + snd_ymfpci_writel(chip, YDSXGR_LEGACYOUTVOL, 0); + snd_ymfpci_writel(chip, YDSXGR_STATUS, ~0); + snd_ymfpci_disable_dsp(chip); + snd_ymfpci_writel(chip, YDSXGR_PLAYCTRLBASE, 0); + snd_ymfpci_writel(chip, YDSXGR_RECCTRLBASE, 0); + snd_ymfpci_writel(chip, YDSXGR_EFFCTRLBASE, 0); + snd_ymfpci_writel(chip, YDSXGR_WORKBASE, 0); + snd_ymfpci_writel(chip, YDSXGR_WORKSIZE, 0); + ctrl = snd_ymfpci_readw(chip, YDSXGR_GLOBALCTRL); + snd_ymfpci_writew(chip, YDSXGR_GLOBALCTRL, ctrl & ~0x0007); snd_ymfpci_ac3_done(chip); - /* Set PCI device to D3 state */ -#if 0 - /* FIXME: temporarily disabled, otherwise we cannot fire up - * the chip again unless reboot. ACPI bug? - */ - pci_set_power_state(chip->pci, PCI_D3hot); -#endif - -#ifdef CONFIG_PM_SLEEP - kfree(chip->saved_regs); -#endif - if (chip->irq >= 0) - free_irq(chip->irq, chip); - release_and_free_resource(chip->mpu_res); - release_and_free_resource(chip->fm_res); snd_ymfpci_free_gameport(chip); - iounmap(chip->reg_area_virt); - if (chip->work_ptr.area) - snd_dma_free_pages(&chip->work_ptr); - release_and_free_resource(chip->res_reg_area); - pci_write_config_word(chip->pci, 0x40, chip->old_legacy_ctrl); - pci_disable_device(chip->pci); release_firmware(chip->dsp_microcode); release_firmware(chip->controller_microcode); - kfree(chip); - return 0; -} - -static int snd_ymfpci_dev_free(struct snd_device *device) -{ - struct snd_ymfpci *chip = device->device_data; - return snd_ymfpci_free(chip); } #ifdef CONFIG_PM_SLEEP @@ -2346,27 +2314,16 @@ SIMPLE_DEV_PM_OPS(snd_ymfpci_pm, snd_ymfpci_suspend, snd_ymfpci_resume); int snd_ymfpci_create(struct snd_card *card, struct pci_dev *pci, - unsigned short old_legacy_ctrl, - struct snd_ymfpci **rchip) + unsigned short old_legacy_ctrl) { - struct snd_ymfpci *chip; + struct snd_ymfpci *chip = card->private_data; int err; - static const struct snd_device_ops ops = { - .dev_free = snd_ymfpci_dev_free, - }; - *rchip = NULL; - /* enable PCI device */ - err = pci_enable_device(pci); + err = pcim_enable_device(pci); if (err < 0) return err; - chip = kzalloc(sizeof(*chip), GFP_KERNEL); - if (chip == NULL) { - pci_disable_device(pci); - return -ENOMEM; - } chip->old_legacy_ctrl = old_legacy_ctrl; spin_lock_init(&chip->reg_lock); spin_lock_init(&chip->voice_lock); @@ -2377,71 +2334,59 @@ int snd_ymfpci_create(struct snd_card *card, chip->irq = -1; chip->device_id = pci->device; chip->rev = pci->revision; - chip->reg_area_phys = pci_resource_start(pci, 0); - chip->reg_area_virt = ioremap(chip->reg_area_phys, 0x8000); - pci_set_master(pci); - chip->src441_used = -1; - chip->res_reg_area = request_mem_region(chip->reg_area_phys, 0x8000, "YMFPCI"); - if (!chip->res_reg_area) { + err = pci_request_regions(pci, "YMFPCI"); + if (err < 0) + return err; + + chip->reg_area_phys = pci_resource_start(pci, 0); + chip->reg_area_virt = devm_ioremap(&pci->dev, chip->reg_area_phys, 0x8000); + if (!chip->reg_area_virt) { dev_err(chip->card->dev, "unable to grab memory region 0x%lx-0x%lx\n", chip->reg_area_phys, chip->reg_area_phys + 0x8000 - 1); - err = -EBUSY; - goto free_chip; + return -EBUSY; } - if (request_irq(pci->irq, snd_ymfpci_interrupt, IRQF_SHARED, + pci_set_master(pci); + chip->src441_used = -1; + + if (devm_request_irq(&pci->dev, pci->irq, snd_ymfpci_interrupt, IRQF_SHARED, KBUILD_MODNAME, chip)) { dev_err(chip->card->dev, "unable to grab IRQ %d\n", pci->irq); - err = -EBUSY; - goto free_chip; + return -EBUSY; } chip->irq = pci->irq; card->sync_irq = chip->irq; + card->private_free = snd_ymfpci_free; snd_ymfpci_aclink_reset(pci); - if (snd_ymfpci_codec_ready(chip, 0) < 0) { - err = -EIO; - goto free_chip; - } + if (snd_ymfpci_codec_ready(chip, 0) < 0) + return -EIO; err = snd_ymfpci_request_firmware(chip); if (err < 0) { dev_err(chip->card->dev, "firmware request failed: %d\n", err); - goto free_chip; + return err; } snd_ymfpci_download_image(chip); udelay(100); /* seems we need a delay after downloading image.. */ - if (snd_ymfpci_memalloc(chip) < 0) { - err = -EIO; - goto free_chip; - } + if (snd_ymfpci_memalloc(chip) < 0) + return -EIO; err = snd_ymfpci_ac3_init(chip); if (err < 0) - goto free_chip; + return err; #ifdef CONFIG_PM_SLEEP - chip->saved_regs = kmalloc_array(YDSXGR_NUM_SAVED_REGS, sizeof(u32), - GFP_KERNEL); - if (chip->saved_regs == NULL) { - err = -ENOMEM; - goto free_chip; - } + chip->saved_regs = devm_kmalloc_array(&pci->dev, YDSXGR_NUM_SAVED_REGS, + sizeof(u32), GFP_KERNEL); + if (!chip->saved_regs) + return -ENOMEM; #endif - err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops); - if (err < 0) - goto free_chip; - snd_ymfpci_proc_init(card, chip); - *rchip = chip; return 0; - -free_chip: - snd_ymfpci_free(chip); - return err; } From patchwork Thu Jul 15 07:59:14 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379309 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9525FC07E96 for ; Thu, 15 Jul 2021 08:20:40 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 1689C611C0 for ; Thu, 15 Jul 2021 08:20:40 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 1689C611C0 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id 95E8916D5; Thu, 15 Jul 2021 10:19:48 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 95E8916D5 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626337238; bh=AzVuUe4lqtpXsNEYNo85IEqda3qaYjrpZ0Oby7g4U0o=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=jIJffo4WCaBfgplV7Gz6X3zBcZKNppjGz6tgXqcxSOjIAZbEbBxpcpKilx0YWT5wY 7SIWXybmY0FuC+L09xMobGFV0C0HT5s8YIWs0GW7bcfREBch6QMOo/GNJnuIJmn0Pp XRitjc4Ofiq+rG6S2l9HPxb1BcrZnoQq9DJ8QqXU= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id 4C4ADF80720; Thu, 15 Jul 2021 10:01:26 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id 4CC24F80543; Thu, 15 Jul 2021 10:01:20 +0200 (CEST) Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id DD0A1F80543 for ; Thu, 15 Jul 2021 10:00:14 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz DD0A1F80543 Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="1QMP/0S3"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="HWJoUnJI" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out1.suse.de (Postfix) with ESMTP id AD95C22833 for ; Thu, 15 Jul 2021 08:00:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336014; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=wwGvhln0wWLqQJUKVb8H3PMwDD51SVnuqZLAgCZuAkw=; b=1QMP/0S3E938P15xsKn5Ktn5AjzfiIdPEzKG6OOjkOvHZDgevdJ2KZrwjSRHN1xwH0lTzN 9vD17Y3Gar3xzryWcoTF8dSUPuz8+rNOlDg2vzOp+u4lAUR/PbtVTGZBgGvnNX6wqiYnDZ tmEU5vcTZWasnH65tXp4tEQgATylRyo= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336014; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=wwGvhln0wWLqQJUKVb8H3PMwDD51SVnuqZLAgCZuAkw=; b=HWJoUnJIOfsJDWP3gxHkr0pBkCnu3LK8UGW6ul53O86L/mKLEC4MxdVlpAzEM8ot1Hjlj4 ACUyxB2ZrgA8vqCQ== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id 99CF7A3B8F; Thu, 15 Jul 2021 08:00:14 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 52/79] ALSA: ad1816a: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:59:14 +0200 Message-Id: <20210715075941.23332-53-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in ISA ad1816a driver with devres as a clean up. Each manual resource management is converted with the corresponding devres helper, and the card object release is managed now via card->private_free instead of a lowlevel snd_device. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- sound/isa/ad1816a/ad1816a.c | 41 +++++++-------------------- sound/isa/ad1816a/ad1816a_lib.c | 49 ++++----------------------------- 2 files changed, 16 insertions(+), 74 deletions(-) diff --git a/sound/isa/ad1816a/ad1816a.c b/sound/isa/ad1816a/ad1816a.c index fa5bed0d5a6f..9ac873773129 100644 --- a/sound/isa/ad1816a/ad1816a.c +++ b/sound/isa/ad1816a/ad1816a.c @@ -124,28 +124,24 @@ static int snd_card_ad1816a_probe(int dev, struct pnp_card_link *pcard, struct snd_ad1816a *chip; struct snd_opl3 *opl3; - error = snd_card_new(&pcard->card->dev, - index[dev], id[dev], THIS_MODULE, - sizeof(struct snd_ad1816a), &card); + error = snd_devm_card_new(&pcard->card->dev, + index[dev], id[dev], THIS_MODULE, + sizeof(struct snd_ad1816a), &card); if (error < 0) return error; chip = card->private_data; error = snd_card_ad1816a_pnp(dev, pcard, pid); - if (error) { - snd_card_free(card); + if (error) return error; - } error = snd_ad1816a_create(card, port[dev], irq[dev], dma1[dev], dma2[dev], chip); - if (error) { - snd_card_free(card); + if (error) return error; - } if (clockfreq[dev] >= 5000 && clockfreq[dev] <= 100000) chip->clock_freq = clockfreq[dev]; @@ -155,22 +151,16 @@ static int snd_card_ad1816a_probe(int dev, struct pnp_card_link *pcard, card->shortname, chip->port, irq[dev], dma1[dev], dma2[dev]); error = snd_ad1816a_pcm(chip, 0); - if (error < 0) { - snd_card_free(card); + if (error < 0) return error; - } error = snd_ad1816a_mixer(chip); - if (error < 0) { - snd_card_free(card); + if (error < 0) return error; - } error = snd_ad1816a_timer(chip, 0); - if (error < 0) { - snd_card_free(card); + if (error < 0) return error; - } if (mpu_port[dev] > 0) { if (snd_mpu401_uart_new(card, 0, MPU401_HW_MPU401, @@ -186,18 +176,14 @@ static int snd_card_ad1816a_probe(int dev, struct pnp_card_link *pcard, printk(KERN_ERR PFX "no OPL device at 0x%lx-0x%lx.\n", fm_port[dev], fm_port[dev] + 2); } else { error = snd_opl3_hwdep_new(opl3, 0, 1, NULL); - if (error < 0) { - snd_card_free(card); + if (error < 0) return error; - } } } error = snd_card_register(card); - if (error < 0) { - snd_card_free(card); + if (error < 0) return error; - } pnp_set_card_drvdata(pcard, card); return 0; } @@ -223,12 +209,6 @@ static int snd_ad1816a_pnp_detect(struct pnp_card_link *card, return -ENODEV; } -static void snd_ad1816a_pnp_remove(struct pnp_card_link *pcard) -{ - snd_card_free(pnp_get_card_drvdata(pcard)); - pnp_set_card_drvdata(pcard, NULL); -} - #ifdef CONFIG_PM static int snd_ad1816a_pnp_suspend(struct pnp_card_link *pcard, pm_message_t state) @@ -255,7 +235,6 @@ static struct pnp_card_driver ad1816a_pnpc_driver = { .name = "ad1816a", .id_table = snd_ad1816a_pnpids, .probe = snd_ad1816a_pnp_detect, - .remove = snd_ad1816a_pnp_remove, #ifdef CONFIG_PM .suspend = snd_ad1816a_pnp_suspend, .resume = snd_ad1816a_pnp_resume, diff --git a/sound/isa/ad1816a/ad1816a_lib.c b/sound/isa/ad1816a/ad1816a_lib.c index 6d4999b30461..132a095dca2c 100644 --- a/sound/isa/ad1816a/ad1816a_lib.c +++ b/sound/isa/ad1816a/ad1816a_lib.c @@ -541,28 +541,6 @@ static int snd_ad1816a_probe(struct snd_ad1816a *chip) return 0; } -static int snd_ad1816a_free(struct snd_ad1816a *chip) -{ - release_and_free_resource(chip->res_port); - if (chip->irq >= 0) - free_irq(chip->irq, (void *) chip); - if (chip->dma1 >= 0) { - snd_dma_disable(chip->dma1); - free_dma(chip->dma1); - } - if (chip->dma2 >= 0) { - snd_dma_disable(chip->dma2); - free_dma(chip->dma2); - } - return 0; -} - -static int snd_ad1816a_dev_free(struct snd_device *device) -{ - struct snd_ad1816a *chip = device->device_data; - return snd_ad1816a_free(chip); -} - static const char *snd_ad1816a_chip_id(struct snd_ad1816a *chip) { switch (chip->hardware) { @@ -580,37 +558,31 @@ int snd_ad1816a_create(struct snd_card *card, unsigned long port, int irq, int dma1, int dma2, struct snd_ad1816a *chip) { - static const struct snd_device_ops ops = { - .dev_free = snd_ad1816a_dev_free, - }; int error; chip->irq = -1; chip->dma1 = -1; chip->dma2 = -1; - chip->res_port = request_region(port, 16, "AD1816A"); + chip->res_port = devm_request_region(card->dev, port, 16, "AD1816A"); if (!chip->res_port) { snd_printk(KERN_ERR "ad1816a: can't grab port 0x%lx\n", port); - snd_ad1816a_free(chip); return -EBUSY; } - if (request_irq(irq, snd_ad1816a_interrupt, 0, "AD1816A", (void *) chip)) { + if (devm_request_irq(card->dev, irq, snd_ad1816a_interrupt, 0, + "AD1816A", (void *) chip)) { snd_printk(KERN_ERR "ad1816a: can't grab IRQ %d\n", irq); - snd_ad1816a_free(chip); return -EBUSY; } chip->irq = irq; card->sync_irq = chip->irq; - if (request_dma(dma1, "AD1816A - 1")) { + if (snd_devm_request_dma(card->dev, dma1, "AD1816A - 1")) { snd_printk(KERN_ERR "ad1816a: can't grab DMA1 %d\n", dma1); - snd_ad1816a_free(chip); return -EBUSY; } chip->dma1 = dma1; - if (request_dma(dma2, "AD1816A - 2")) { + if (snd_devm_request_dma(card->dev, dma2, "AD1816A - 2")) { snd_printk(KERN_ERR "ad1816a: can't grab DMA2 %d\n", dma2); - snd_ad1816a_free(chip); return -EBUSY; } chip->dma2 = dma2; @@ -620,20 +592,11 @@ int snd_ad1816a_create(struct snd_card *card, spin_lock_init(&chip->lock); error = snd_ad1816a_probe(chip); - if (error) { - snd_ad1816a_free(chip); + if (error) return error; - } snd_ad1816a_init(chip); - /* Register device */ - error = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops); - if (error < 0) { - snd_ad1816a_free(chip); - return error; - } - return 0; } From patchwork Thu Jul 15 07:59:15 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379313 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1E5F7C07E96 for ; Thu, 15 Jul 2021 08:21:20 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 8FF2B61183 for ; Thu, 15 Jul 2021 08:21:19 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 8FF2B61183 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id 25C911661; Thu, 15 Jul 2021 10:20:28 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 25C911661 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626337278; bh=sa4ah6JtEcK+tWnFZfcpLmZ9ze+pRkrhKELgkgKDmJM=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=Va5rT9yomwlJWGkoUbfnN24JunnXyzRqdZi08EPCvY91f5xtgPwFoHs80uetaRVMG VnxrSuVf8RAdWk8/avFii1V29/qPCJuivsCTHanbpGqjuYUaDgCMEFo9sqMRe8hTdT Q/rhahu4zM+68Z+OUfyWjYi/TVt3ukCEvcngeeu4= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id CFBC7F80733; Thu, 15 Jul 2021 10:01:28 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id 37BA2F80710; Thu, 15 Jul 2021 10:01:21 +0200 (CEST) Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 4CF7DF80549 for ; Thu, 15 Jul 2021 10:00:15 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 4CF7DF80549 Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="MUEdLDxT"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="LrIZkuFp" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out2.suse.de (Postfix) with ESMTP id 257651FD3E for ; Thu, 15 Jul 2021 08:00:15 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336015; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=JrKMj97jEZ1Ruv60pMc3FAQRmlcNJ1z2f901Umap9Xw=; b=MUEdLDxTA42FshxtlTuOz97DPhodssajEWOe3ayrqvTPJEPWsiKDyT3xJ7psKebFFzveJD 5lbLgRafAFT0uqV51rZcw85tY6p1KawYgXnZsldwTJdsJ4CC+qRIRq3hGvnMO8T6eeqVD8 4SZUo7UJqk/mR7QKLLtaWGQWRhFHWp4= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336015; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=JrKMj97jEZ1Ruv60pMc3FAQRmlcNJ1z2f901Umap9Xw=; b=LrIZkuFphVapKKBIxQSC4rZFPNhICagU6RfX2jkCtaLDmvPHGlm3DdYgFKIPLr70aMN8w4 hLNn+hN/yVdVBfCA== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id 1479DA3B8F; Thu, 15 Jul 2021 08:00:15 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 53/79] ALSA: wss: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:59:15 +0200 Message-Id: <20210715075941.23332-54-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in ISA wss driver with devres as a clean up. Each manual resource management is converted with the corresponding devres helper. Since the whole destructor code could be removed by the conversion, the lowlevel snd_device was dropped as well. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- sound/isa/cs423x/cs4236_lib.c | 2 -- sound/isa/wss/wss_lib.c | 67 ++++++----------------------------- 2 files changed, 11 insertions(+), 58 deletions(-) diff --git a/sound/isa/cs423x/cs4236_lib.c b/sound/isa/cs423x/cs4236_lib.c index 63957aea456b..35f25911adcf 100644 --- a/sound/isa/cs423x/cs4236_lib.c +++ b/sound/isa/cs423x/cs4236_lib.c @@ -298,7 +298,6 @@ int snd_cs4236_create(struct snd_card *card, if (cport < 0x100 || cport == SNDRV_AUTO_PORT) { snd_printk(KERN_ERR "please, specify control port " "for CS4236+ chips\n"); - snd_device_free(card, chip); return -ENODEV; } ver1 = snd_cs4236_ctrl_in(chip, 1); @@ -308,7 +307,6 @@ int snd_cs4236_create(struct snd_card *card, if (ver1 != ver2) { snd_printk(KERN_ERR "CS4236+ chip detected, but " "control port 0x%lx is not valid\n", cport); - snd_device_free(card, chip); return -ENODEV; } snd_cs4236_ctrl_out(chip, 0, 0x00); diff --git a/sound/isa/wss/wss_lib.c b/sound/isa/wss/wss_lib.c index 743e0f05e335..026061b55ee9 100644 --- a/sound/isa/wss/wss_lib.c +++ b/sound/isa/wss/wss_lib.c @@ -1655,36 +1655,6 @@ static void snd_wss_resume(struct snd_wss *chip) } #endif /* CONFIG_PM */ -static int snd_wss_free(struct snd_wss *chip) -{ - release_and_free_resource(chip->res_port); - release_and_free_resource(chip->res_cport); - if (chip->irq >= 0) { - disable_irq(chip->irq); - if (!(chip->hwshare & WSS_HWSHARE_IRQ)) - free_irq(chip->irq, (void *) chip); - } - if (!(chip->hwshare & WSS_HWSHARE_DMA1) && chip->dma1 >= 0) { - snd_dma_disable(chip->dma1); - free_dma(chip->dma1); - } - if (!(chip->hwshare & WSS_HWSHARE_DMA2) && - chip->dma2 >= 0 && chip->dma2 != chip->dma1) { - snd_dma_disable(chip->dma2); - free_dma(chip->dma2); - } - if (chip->timer) - snd_device_free(chip->card, chip->timer); - kfree(chip); - return 0; -} - -static int snd_wss_dev_free(struct snd_device *device) -{ - struct snd_wss *chip = device->device_data; - return snd_wss_free(chip); -} - const char *snd_wss_chip_id(struct snd_wss *chip) { switch (chip->hardware) { @@ -1738,7 +1708,7 @@ static int snd_wss_new(struct snd_card *card, struct snd_wss *chip; *rchip = NULL; - chip = kzalloc(sizeof(*chip), GFP_KERNEL); + chip = devm_kzalloc(card->dev, sizeof(*chip), GFP_KERNEL); if (chip == NULL) return -ENOMEM; chip->hardware = hardware; @@ -1774,9 +1744,6 @@ int snd_wss_create(struct snd_card *card, unsigned short hwshare, struct snd_wss **rchip) { - static const struct snd_device_ops ops = { - .dev_free = snd_wss_dev_free, - }; struct snd_wss *chip; int err; @@ -1788,42 +1755,39 @@ int snd_wss_create(struct snd_card *card, chip->dma1 = -1; chip->dma2 = -1; - chip->res_port = request_region(port, 4, "WSS"); + chip->res_port = devm_request_region(card->dev, port, 4, "WSS"); if (!chip->res_port) { snd_printk(KERN_ERR "wss: can't grab port 0x%lx\n", port); - snd_wss_free(chip); return -EBUSY; } chip->port = port; if ((long)cport >= 0) { - chip->res_cport = request_region(cport, 8, "CS4232 Control"); + chip->res_cport = devm_request_region(card->dev, cport, 8, + "CS4232 Control"); if (!chip->res_cport) { snd_printk(KERN_ERR "wss: can't grab control port 0x%lx\n", cport); - snd_wss_free(chip); return -ENODEV; } } chip->cport = cport; if (!(hwshare & WSS_HWSHARE_IRQ)) - if (request_irq(irq, snd_wss_interrupt, 0, - "WSS", (void *) chip)) { + if (devm_request_irq(card->dev, irq, snd_wss_interrupt, 0, + "WSS", (void *) chip)) { snd_printk(KERN_ERR "wss: can't grab IRQ %d\n", irq); - snd_wss_free(chip); return -EBUSY; } chip->irq = irq; card->sync_irq = chip->irq; - if (!(hwshare & WSS_HWSHARE_DMA1) && request_dma(dma1, "WSS - 1")) { + if (!(hwshare & WSS_HWSHARE_DMA1) && + snd_devm_request_dma(card->dev, dma1, "WSS - 1")) { snd_printk(KERN_ERR "wss: can't grab DMA1 %d\n", dma1); - snd_wss_free(chip); return -EBUSY; } chip->dma1 = dma1; - if (!(hwshare & WSS_HWSHARE_DMA2) && dma1 != dma2 && - dma2 >= 0 && request_dma(dma2, "WSS - 2")) { + if (!(hwshare & WSS_HWSHARE_DMA2) && dma1 != dma2 && dma2 >= 0 && + snd_devm_request_dma(card->dev, dma2, "WSS - 2")) { snd_printk(KERN_ERR "wss: can't grab DMA2 %d\n", dma2); - snd_wss_free(chip); return -EBUSY; } if (dma1 == dma2 || dma2 < 0) { @@ -1839,10 +1803,8 @@ int snd_wss_create(struct snd_card *card, } /* global setup */ - if (snd_wss_probe(chip) < 0) { - snd_wss_free(chip); + if (snd_wss_probe(chip) < 0) return -ENODEV; - } snd_wss_init(chip); #if 0 @@ -1853,13 +1815,6 @@ int snd_wss_create(struct snd_card *card, } #endif - /* Register device */ - err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops); - if (err < 0) { - snd_wss_free(chip); - return err; - } - #ifdef CONFIG_PM /* Power Management */ chip->suspend = snd_wss_suspend; From patchwork Thu Jul 15 07:59:16 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379317 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id BB86CC07E96 for ; Thu, 15 Jul 2021 08:21:59 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 4419E61183 for ; Thu, 15 Jul 2021 08:21:59 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 4419E61183 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id E3554175E; Thu, 15 Jul 2021 10:21:07 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz E3554175E DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626337318; bh=CqLU72kmYR+w71JU+Ui2kX395SvgaMILLnJIQbnwbeA=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=b3PU9oLtldl8c08yNIrIjFUtt7LGPvNbbtGHXX64UQ+NRfqIzm1nRHEm0HO1CBkil hXB/vQjE4cCI3zUJDjmbABv+5LkOXdLl+6mF/NwbskRkHH7qhWiWA/VBcPFJKESbIj VFlOwuefFwKfx48HkMCV1fkH9Xcjnp7vJwRqE2qQ= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id 3C09DF80746; Thu, 15 Jul 2021 10:01:31 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id 3A47BF80714; Thu, 15 Jul 2021 10:01:22 +0200 (CEST) Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id D4BECF80229 for ; Thu, 15 Jul 2021 10:00:15 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz D4BECF80229 Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="xmHBa2bj"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="DVwXPSfv" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out1.suse.de (Postfix) with ESMTP id 8F3C02284F for ; Thu, 15 Jul 2021 08:00:15 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336015; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=4z/+fbKGGqodB9tLJokLnzebyu7FxpXZ5TqZcwFQ2lo=; b=xmHBa2bjmqMXTQszggHqNb5q/pw01NX06Rt3CwuyGpv7chHK/5H338/zPxacRg9Q//xoJ4 m3V9opqLTAPpKhjug/pPLmvfL2cFhoI0Gaxhl3oW04iRsue74IidJ7+BRH5uzhCqhLO8hs k7QNZ8sRpzU1lGjN2VkL3jbVViYHqpo= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336015; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=4z/+fbKGGqodB9tLJokLnzebyu7FxpXZ5TqZcwFQ2lo=; b=DVwXPSfvtk9FLVt3NWx33JRlliHOf9PxS5vppv79nvc3u2SoA0Q1z5FBYJVUuInly9AXwj ji3nMHWVYlA5vFBA== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id 7AE37A3B8F; Thu, 15 Jul 2021 08:00:15 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 54/79] ALSA: sb: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:59:16 +0200 Message-Id: <20210715075941.23332-55-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in ISA sb drivers with devres as a clean up. Each manual resource management is converted with the corresponding devres helper, and the card object release is managed now via card->private_free instead of a lowlevel snd_device. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- include/sound/emu8000.h | 3 -- sound/isa/sb/emu8000.c | 48 ++++-------------------------- sound/isa/sb/jazz16.c | 39 ++++++++---------------- sound/isa/sb/sb16.c | 42 +++++--------------------- sound/isa/sb/sb8.c | 48 ++++++++---------------------- sound/isa/sb/sb_common.c | 64 +++++++++------------------------------- 6 files changed, 52 insertions(+), 192 deletions(-) diff --git a/include/sound/emu8000.h b/include/sound/emu8000.h index ad0365d6de5e..072791bbcf5c 100644 --- a/include/sound/emu8000.h +++ b/include/sound/emu8000.h @@ -56,9 +56,6 @@ struct snd_emu8000 { unsigned long port1; /* Port usually base+0 */ unsigned long port2; /* Port usually at base+0x400 */ unsigned long port3; /* Port usually at base+0x800 */ - struct resource *res_port1; - struct resource *res_port2; - struct resource *res_port3; unsigned short last_reg;/* Last register command */ spinlock_t reg_lock; diff --git a/sound/isa/sb/emu8000.c b/sound/isa/sb/emu8000.c index 5e4187940265..e02029677743 100644 --- a/sound/isa/sb/emu8000.c +++ b/sound/isa/sb/emu8000.c @@ -1048,27 +1048,6 @@ snd_emu8000_create_mixer(struct snd_card *card, struct snd_emu8000 *emu) return err; } - -/* - * free resources - */ -static int snd_emu8000_free(struct snd_emu8000 *hw) -{ - release_and_free_resource(hw->res_port1); - release_and_free_resource(hw->res_port2); - release_and_free_resource(hw->res_port3); - kfree(hw); - return 0; -} - -/* - */ -static int snd_emu8000_dev_free(struct snd_device *device) -{ - struct snd_emu8000 *hw = device->device_data; - return snd_emu8000_free(hw); -} - /* * initialize and register emu8000 synth device. */ @@ -1079,9 +1058,6 @@ snd_emu8000_new(struct snd_card *card, int index, long port, int seq_ports, struct snd_seq_device *awe; struct snd_emu8000 *hw; int err; - static const struct snd_device_ops ops = { - .dev_free = snd_emu8000_dev_free, - }; if (awe_ret) *awe_ret = NULL; @@ -1089,7 +1065,7 @@ snd_emu8000_new(struct snd_card *card, int index, long port, int seq_ports, if (seq_ports <= 0) return 0; - hw = kzalloc(sizeof(*hw), GFP_KERNEL); + hw = devm_kzalloc(card->dev, sizeof(*hw), GFP_KERNEL); if (hw == NULL) return -ENOMEM; spin_lock_init(&hw->reg_lock); @@ -1097,12 +1073,10 @@ snd_emu8000_new(struct snd_card *card, int index, long port, int seq_ports, hw->port1 = port; hw->port2 = port + 0x400; hw->port3 = port + 0x800; - hw->res_port1 = request_region(hw->port1, 4, "Emu8000-1"); - hw->res_port2 = request_region(hw->port2, 4, "Emu8000-2"); - hw->res_port3 = request_region(hw->port3, 4, "Emu8000-3"); - if (!hw->res_port1 || !hw->res_port2 || !hw->res_port3) { + if (!devm_request_region(card->dev, hw->port1, 4, "Emu8000-1") || + !devm_request_region(card->dev, hw->port2, 4, "Emu8000-2") || + !devm_request_region(card->dev, hw->port3, 4, "Emu8000-3")) { snd_printk(KERN_ERR "sbawe: can't grab ports 0x%lx, 0x%lx, 0x%lx\n", hw->port1, hw->port2, hw->port3); - snd_emu8000_free(hw); return -EBUSY; } hw->mem_size = 0; @@ -1115,23 +1089,13 @@ snd_emu8000_new(struct snd_card *card, int index, long port, int seq_ports, hw->fm_chorus_depth = 0; hw->fm_reverb_depth = 0; - if (snd_emu8000_detect(hw) < 0) { - snd_emu8000_free(hw); + if (snd_emu8000_detect(hw) < 0) return -ENODEV; - } snd_emu8000_init_hw(hw); err = snd_emu8000_create_mixer(card, hw); - if (err < 0) { - snd_emu8000_free(hw); + if (err < 0) return err; - } - - err = snd_device_new(card, SNDRV_DEV_CODEC, hw, &ops); - if (err < 0) { - snd_emu8000_free(hw); - return err; - } #if IS_ENABLED(CONFIG_SND_SEQUENCER) if (snd_seq_device_new(card, index, SNDRV_SEQ_DEV_ID_EMU8000, sizeof(struct snd_emu8000*), &awe) >= 0) { diff --git a/sound/isa/sb/jazz16.c b/sound/isa/sb/jazz16.c index 7ba5dd1ec810..64936c917170 100644 --- a/sound/isa/sb/jazz16.c +++ b/sound/isa/sb/jazz16.c @@ -226,8 +226,8 @@ static int snd_jazz16_probe(struct device *devptr, unsigned int dev) static const int possible_dmas16[] = {5, 7, -1}; int err, xirq, xdma8, xdma16, xmpu_port, xmpu_irq; - err = snd_card_new(devptr, index[dev], id[dev], THIS_MODULE, - sizeof(struct snd_card_jazz16), &card); + err = snd_devm_card_new(devptr, index[dev], id[dev], THIS_MODULE, + sizeof(struct snd_card_jazz16), &card); if (err < 0) return err; @@ -238,8 +238,7 @@ static int snd_jazz16_probe(struct device *devptr, unsigned int dev) xirq = snd_legacy_find_free_irq(possible_irqs); if (xirq < 0) { snd_printk(KERN_ERR "unable to find a free IRQ\n"); - err = -EBUSY; - goto err_free; + return -EBUSY; } } xdma8 = dma8[dev]; @@ -247,8 +246,7 @@ static int snd_jazz16_probe(struct device *devptr, unsigned int dev) xdma8 = snd_legacy_find_free_dma(possible_dmas8); if (xdma8 < 0) { snd_printk(KERN_ERR "unable to find a free DMA8\n"); - err = -EBUSY; - goto err_free; + return -EBUSY; } } xdma16 = dma16[dev]; @@ -256,8 +254,7 @@ static int snd_jazz16_probe(struct device *devptr, unsigned int dev) xdma16 = snd_legacy_find_free_dma(possible_dmas16); if (xdma16 < 0) { snd_printk(KERN_ERR "unable to find a free DMA16\n"); - err = -EBUSY; - goto err_free; + return -EBUSY; } } @@ -267,7 +264,7 @@ static int snd_jazz16_probe(struct device *devptr, unsigned int dev) err = jazz16_detect_board(port[dev], xmpu_port); if (err < 0) { printk(KERN_ERR "Media Vision Jazz16 board not detected\n"); - goto err_free; + return err; } err = snd_sbdsp_create(card, port[dev], irq[dev], jazz16_interrupt, @@ -275,7 +272,7 @@ static int snd_jazz16_probe(struct device *devptr, unsigned int dev) SB_HW_JAZZ16, &chip); if (err < 0) - goto err_free; + return err; xmpu_irq = mpu_irq[dev]; if (xmpu_irq == SNDRV_AUTO_IRQ || mpu_port[dev] == SNDRV_AUTO_PORT) @@ -283,7 +280,7 @@ static int snd_jazz16_probe(struct device *devptr, unsigned int dev) err = jazz16_configure_board(chip, xmpu_irq); if (err < 0) { printk(KERN_ERR "Media Vision Jazz16 configuration failed\n"); - goto err_free; + return err; } jazz16->chip = chip; @@ -296,10 +293,10 @@ static int snd_jazz16_probe(struct device *devptr, unsigned int dev) err = snd_sb8dsp_pcm(chip, 0); if (err < 0) - goto err_free; + return err; err = snd_sbmixer_new(chip); if (err < 0) - goto err_free; + return err; err = snd_opl3_create(card, chip->port, chip->port + 2, OPL3_HW_AUTO, 1, &opl3); @@ -309,7 +306,7 @@ static int snd_jazz16_probe(struct device *devptr, unsigned int dev) else { err = snd_opl3_hwdep_new(opl3, 0, 1, NULL); if (err < 0) - goto err_free; + return err; } if (mpu_port[dev] > 0 && mpu_port[dev] != SNDRV_AUTO_PORT) { if (mpu_irq[dev] == SNDRV_AUTO_IRQ) @@ -326,21 +323,10 @@ static int snd_jazz16_probe(struct device *devptr, unsigned int dev) err = snd_card_register(card); if (err < 0) - goto err_free; + return err; dev_set_drvdata(devptr, card); return 0; - -err_free: - snd_card_free(card); - return err; -} - -static void snd_jazz16_remove(struct device *devptr, unsigned int dev) -{ - struct snd_card *card = dev_get_drvdata(devptr); - - snd_card_free(card); } #ifdef CONFIG_PM @@ -372,7 +358,6 @@ static int snd_jazz16_resume(struct device *pdev, unsigned int n) static struct isa_driver snd_jazz16_driver = { .match = snd_jazz16_match, .probe = snd_jazz16_probe, - .remove = snd_jazz16_remove, #ifdef CONFIG_PM .suspend = snd_jazz16_suspend, .resume = snd_jazz16_resume, diff --git a/sound/isa/sb/sb16.c b/sound/isa/sb/sb16.c index d0f797c02841..e89b095aa282 100644 --- a/sound/isa/sb/sb16.c +++ b/sound/isa/sb/sb16.c @@ -285,15 +285,6 @@ static int snd_card_sb16_pnp(int dev, struct snd_card_sb16 *acard, #endif /* CONFIG_PNP */ -static void snd_sb16_free(struct snd_card *card) -{ - struct snd_card_sb16 *acard = card->private_data; - - if (acard == NULL) - return; - release_and_free_resource(acard->fm_res); -} - #ifdef CONFIG_PNP #define is_isapnp_selected(dev) isapnp[dev] #else @@ -306,11 +297,10 @@ static int snd_sb16_card_new(struct device *devptr, int dev, struct snd_card *card; int err; - err = snd_card_new(devptr, index[dev], id[dev], THIS_MODULE, - sizeof(struct snd_card_sb16), &card); + err = snd_devm_card_new(devptr, index[dev], id[dev], THIS_MODULE, + sizeof(struct snd_card_sb16), &card); if (err < 0) return err; - card->private_free = snd_sb16_free; *cardp = card; return 0; } @@ -482,17 +472,16 @@ static int snd_sb16_isa_probe1(int dev, struct device *pdev) /* non-PnP FM port address is hardwired with base port address */ fm_port[dev] = port[dev]; /* block the 0x388 port to avoid PnP conflicts */ - acard->fm_res = request_region(0x388, 4, "SoundBlaster FM"); + acard->fm_res = devm_request_region(card->dev, 0x388, 4, + "SoundBlaster FM"); #ifdef SNDRV_SBAWE_EMU8000 /* non-PnP AWE port address is hardwired with base port address */ awe_port[dev] = port[dev] + 0x400; #endif err = snd_sb16_probe(card, dev); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } dev_set_drvdata(pdev, card); return 0; } @@ -547,11 +536,6 @@ static int snd_sb16_isa_probe(struct device *pdev, unsigned int dev) } } -static void snd_sb16_isa_remove(struct device *pdev, unsigned int dev) -{ - snd_card_free(dev_get_drvdata(pdev)); -} - #ifdef CONFIG_PM static int snd_sb16_isa_suspend(struct device *dev, unsigned int n, pm_message_t state) @@ -574,7 +558,6 @@ static int snd_sb16_isa_resume(struct device *dev, unsigned int n) static struct isa_driver snd_sb16_isa_driver = { .match = snd_sb16_isa_match, .probe = snd_sb16_isa_probe, - .remove = snd_sb16_isa_remove, #ifdef CONFIG_PM .suspend = snd_sb16_isa_suspend, .resume = snd_sb16_isa_resume, @@ -600,15 +583,11 @@ static int snd_sb16_pnp_detect(struct pnp_card_link *pcard, if (res < 0) return res; res = snd_card_sb16_pnp(dev, card->private_data, pcard, pid); - if (res < 0) { - snd_card_free(card); + if (res < 0) return res; - } res = snd_sb16_probe(card, dev); - if (res < 0) { - snd_card_free(card); + if (res < 0) return res; - } pnp_set_card_drvdata(pcard, card); dev++; return 0; @@ -617,12 +596,6 @@ static int snd_sb16_pnp_detect(struct pnp_card_link *pcard, return -ENODEV; } -static void snd_sb16_pnp_remove(struct pnp_card_link *pcard) -{ - snd_card_free(pnp_get_card_drvdata(pcard)); - pnp_set_card_drvdata(pcard, NULL); -} - #ifdef CONFIG_PM static int snd_sb16_pnp_suspend(struct pnp_card_link *pcard, pm_message_t state) { @@ -643,7 +616,6 @@ static struct pnp_card_driver sb16_pnpc_driver = { #endif .id_table = snd_sb16_pnpids, .probe = snd_sb16_pnp_detect, - .remove = snd_sb16_pnp_remove, #ifdef CONFIG_PM .suspend = snd_sb16_pnp_suspend, .resume = snd_sb16_pnp_resume, diff --git a/sound/isa/sb/sb8.c b/sound/isa/sb/sb8.c index b08e6e7690c9..e5ef1777161f 100644 --- a/sound/isa/sb/sb8.c +++ b/sound/isa/sb/sb8.c @@ -54,15 +54,6 @@ static irqreturn_t snd_sb8_interrupt(int irq, void *dev_id) } } -static void snd_sb8_free(struct snd_card *card) -{ - struct snd_sb8 *acard = card->private_data; - - if (acard == NULL) - return; - release_and_free_resource(acard->fm_res); -} - static int snd_sb8_match(struct device *pdev, unsigned int dev) { if (!enable[dev]) @@ -86,26 +77,26 @@ static int snd_sb8_probe(struct device *pdev, unsigned int dev) struct snd_opl3 *opl3; int err; - err = snd_card_new(pdev, index[dev], id[dev], THIS_MODULE, - sizeof(struct snd_sb8), &card); + err = snd_devm_card_new(pdev, index[dev], id[dev], THIS_MODULE, + sizeof(struct snd_sb8), &card); if (err < 0) return err; acard = card->private_data; - card->private_free = snd_sb8_free; /* * Block the 0x388 port to avoid PnP conflicts. * No need to check this value after request_region, * as we never do anything with it. */ - acard->fm_res = request_region(0x388, 4, "SoundBlaster FM"); + acard->fm_res = devm_request_region(card->dev, 0x388, 4, + "SoundBlaster FM"); if (port[dev] != SNDRV_AUTO_PORT) { err = snd_sbdsp_create(card, port[dev], irq[dev], snd_sb8_interrupt, dma8[dev], -1, SB_HW_AUTO, &chip); if (err < 0) - goto _err; + return err; } else { /* auto-probe legacy ports */ static const unsigned long possible_ports[] = { @@ -125,10 +116,8 @@ static int snd_sb8_probe(struct device *pdev, unsigned int dev) break; } } - if (i >= ARRAY_SIZE(possible_ports)) { - err = -EINVAL; - goto _err; - } + if (i >= ARRAY_SIZE(possible_ports)) + return -EINVAL; } acard->chip = chip; @@ -139,17 +128,16 @@ static int snd_sb8_probe(struct device *pdev, unsigned int dev) else snd_printk(KERN_WARNING "SB 16 chip detected at 0x%lx, try snd-sb16 module\n", port[dev]); - err = -ENODEV; - goto _err; + return -ENODEV; } err = snd_sb8dsp_pcm(chip, 0); if (err < 0) - goto _err; + return err; err = snd_sbmixer_new(chip); if (err < 0) - goto _err; + return err; if (chip->hardware == SB_HW_10 || chip->hardware == SB_HW_20) { err = snd_opl3_create(card, chip->port + 8, 0, @@ -167,12 +155,12 @@ static int snd_sb8_probe(struct device *pdev, unsigned int dev) if (err >= 0) { err = snd_opl3_hwdep_new(opl3, 0, 1, NULL); if (err < 0) - goto _err; + return err; } err = snd_sb8dsp_midi(chip, 0); if (err < 0) - goto _err; + return err; strcpy(card->driver, chip->hardware == SB_HW_PRO ? "SB Pro" : "SB8"); strcpy(card->shortname, chip->name); @@ -183,19 +171,10 @@ static int snd_sb8_probe(struct device *pdev, unsigned int dev) err = snd_card_register(card); if (err < 0) - goto _err; + return err; dev_set_drvdata(pdev, card); return 0; - - _err: - snd_card_free(card); - return err; -} - -static void snd_sb8_remove(struct device *pdev, unsigned int dev) -{ - snd_card_free(dev_get_drvdata(pdev)); } #ifdef CONFIG_PM @@ -229,7 +208,6 @@ static int snd_sb8_resume(struct device *dev, unsigned int n) static struct isa_driver snd_sb8_driver = { .match = snd_sb8_match, .probe = snd_sb8_probe, - .remove = snd_sb8_remove, #ifdef CONFIG_PM .suspend = snd_sb8_suspend, .resume = snd_sb8_resume, diff --git a/sound/isa/sb/sb_common.c b/sound/isa/sb/sb_common.c index 57121218ed24..c0e319d14210 100644 --- a/sound/isa/sb/sb_common.c +++ b/sound/isa/sb/sb_common.c @@ -168,31 +168,6 @@ static int snd_sbdsp_probe(struct snd_sb * chip) return 0; } -static int snd_sbdsp_free(struct snd_sb *chip) -{ - release_and_free_resource(chip->res_port); - if (chip->irq >= 0) - free_irq(chip->irq, (void *) chip); -#ifdef CONFIG_ISA - if (chip->dma8 >= 0) { - disable_dma(chip->dma8); - free_dma(chip->dma8); - } - if (chip->dma16 >= 0 && chip->dma16 != chip->dma8) { - disable_dma(chip->dma16); - free_dma(chip->dma16); - } -#endif - kfree(chip); - return 0; -} - -static int snd_sbdsp_dev_free(struct snd_device *device) -{ - struct snd_sb *chip = device->device_data; - return snd_sbdsp_free(chip); -} - int snd_sbdsp_create(struct snd_card *card, unsigned long port, int irq, @@ -204,15 +179,12 @@ int snd_sbdsp_create(struct snd_card *card, { struct snd_sb *chip; int err; - static const struct snd_device_ops ops = { - .dev_free = snd_sbdsp_dev_free, - }; if (snd_BUG_ON(!r_chip)) return -EINVAL; *r_chip = NULL; - chip = kzalloc(sizeof(*chip), GFP_KERNEL); - if (chip == NULL) + chip = devm_kzalloc(card->dev, sizeof(*chip), GFP_KERNEL); + if (!chip) return -ENOMEM; spin_lock_init(&chip->reg_lock); spin_lock_init(&chip->open_lock); @@ -223,13 +195,12 @@ int snd_sbdsp_create(struct snd_card *card, chip->dma16 = -1; chip->port = port; - if (request_irq(irq, irq_handler, - (hardware == SB_HW_ALS4000 || - hardware == SB_HW_CS5530) ? - IRQF_SHARED : 0, - "SoundBlaster", (void *) chip)) { + if (devm_request_irq(card->dev, irq, irq_handler, + (hardware == SB_HW_ALS4000 || + hardware == SB_HW_CS5530) ? + IRQF_SHARED : 0, + "SoundBlaster", (void *) chip)) { snd_printk(KERN_ERR "sb: can't grab irq %d\n", irq); - snd_sbdsp_free(chip); return -EBUSY; } chip->irq = irq; @@ -238,17 +209,17 @@ int snd_sbdsp_create(struct snd_card *card, if (hardware == SB_HW_ALS4000) goto __skip_allocation; - chip->res_port = request_region(port, 16, "SoundBlaster"); + chip->res_port = devm_request_region(card->dev, port, 16, + "SoundBlaster"); if (!chip->res_port) { snd_printk(KERN_ERR "sb: can't grab port 0x%lx\n", port); - snd_sbdsp_free(chip); return -EBUSY; } #ifdef CONFIG_ISA - if (dma8 >= 0 && request_dma(dma8, "SoundBlaster - 8bit")) { + if (dma8 >= 0 && snd_devm_request_dma(card->dev, dma8, + "SoundBlaster - 8bit")) { snd_printk(KERN_ERR "sb: can't grab DMA8 %d\n", dma8); - snd_sbdsp_free(chip); return -EBUSY; } chip->dma8 = dma8; @@ -256,9 +227,9 @@ int snd_sbdsp_create(struct snd_card *card, if (hardware != SB_HW_ALS100 && (dma16 < 5 || dma16 > 7)) { /* no duplex */ dma16 = -1; - } else if (request_dma(dma16, "SoundBlaster - 16bit")) { + } else if (snd_devm_request_dma(card->dev, dma16, + "SoundBlaster - 16bit")) { snd_printk(KERN_ERR "sb: can't grab DMA16 %d\n", dma16); - snd_sbdsp_free(chip); return -EBUSY; } } @@ -269,15 +240,8 @@ int snd_sbdsp_create(struct snd_card *card, chip->card = card; chip->hardware = hardware; err = snd_sbdsp_probe(chip); - if (err < 0) { - snd_sbdsp_free(chip); + if (err < 0) return err; - } - err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops); - if (err < 0) { - snd_sbdsp_free(chip); - return err; - } *r_chip = chip; return 0; } From patchwork Thu Jul 15 07:59:17 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379337 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9A28AC07E96 for ; Thu, 15 Jul 2021 08:23:54 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id B4D3F6120A for ; Thu, 15 Jul 2021 08:23:53 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org B4D3F6120A Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id 1F6A51731; Thu, 15 Jul 2021 10:23:02 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 1F6A51731 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626337432; bh=6h9irJrIDEGyKS5Xu0pfBS6kV4Q5NR7VYeiYXW+mKC0=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=smCmnkJRB16AHg40otHECTV/kVEFeNM0NS4udPYChKE3+eq48Azry43BB947/xd0U lWASWd33ZpXuCaUr5rrey2YTWdu6bTChSwikH+XvNDVio+wOxF7jaaKorY9zlsrVMp s53Rs5jxgBUbp9ZTWlzKRuvEpkfkQeHFObwlRJGM= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id 2354FF80772; Thu, 15 Jul 2021 10:01:39 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id 7EA69F8072A; Thu, 15 Jul 2021 10:01:26 +0200 (CEST) Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 266CBF8054A for ; Thu, 15 Jul 2021 10:00:16 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 266CBF8054A Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="AHEdiU3b"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="Bv6YCRF3" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out2.suse.de (Postfix) with ESMTP id 01D521FDE5 for ; Thu, 15 Jul 2021 08:00:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336016; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=drthx1EGwL1/x7T6ZSLfCNWdvW5bSDZl7lLhK8kpG24=; b=AHEdiU3bbfQOYmOzakWctsipbYH8luL+2uBdXMfZI+MDApKM1pK2UQbPI7aGzQnJMKRdI+ lysCRubtuI31nQGuwC9PlUmyjfuyRK6dh5Nn2ex4ahsZlAduAWjqXzrHKHA5tY7sd5Ldas ekJg0S5p4dtVkEoYYvBHOg5ZtC9FKqU= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336016; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=drthx1EGwL1/x7T6ZSLfCNWdvW5bSDZl7lLhK8kpG24=; b=Bv6YCRF345ZZwrMjhJwM9CyFyC1ylodnAhovX2eniu1SUlr38YPOeVKhV52Ln4fFD9Fre/ /f3ywf35O34FMoBg== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id E544AA3B8F; Thu, 15 Jul 2021 08:00:15 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 55/79] ALSA: ad1848: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:59:17 +0200 Message-Id: <20210715075941.23332-56-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in ISA ad1848 driver with devres as a clean up. Each manual resource management is converted with the corresponding devres helper. The remove callback became superfluous and dropped. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- sound/isa/ad1848/ad1848.c | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/sound/isa/ad1848/ad1848.c b/sound/isa/ad1848/ad1848.c index edafb49797e7..c471ac2aa450 100644 --- a/sound/isa/ad1848/ad1848.c +++ b/sound/isa/ad1848/ad1848.c @@ -72,7 +72,7 @@ static int snd_ad1848_probe(struct device *dev, unsigned int n) struct snd_wss *chip; int error; - error = snd_card_new(dev, index[n], id[n], THIS_MODULE, 0, &card); + error = snd_devm_card_new(dev, index[n], id[n], THIS_MODULE, 0, &card); if (error < 0) return error; @@ -80,17 +80,17 @@ static int snd_ad1848_probe(struct device *dev, unsigned int n) thinkpad[n] ? WSS_HW_THINKPAD : WSS_HW_DETECT, 0, &chip); if (error < 0) - goto out; + return error; card->private_data = chip; error = snd_wss_pcm(chip, 0); if (error < 0) - goto out; + return error; error = snd_wss_mixer(chip); if (error < 0) - goto out; + return error; strscpy(card->driver, "AD1848", sizeof(card->driver)); strscpy(card->shortname, chip->pcm->name, sizeof(card->shortname)); @@ -106,18 +106,10 @@ static int snd_ad1848_probe(struct device *dev, unsigned int n) error = snd_card_register(card); if (error < 0) - goto out; + return error; dev_set_drvdata(dev, card); return 0; - -out: snd_card_free(card); - return error; -} - -static void snd_ad1848_remove(struct device *dev, unsigned int n) -{ - snd_card_free(dev_get_drvdata(dev)); } #ifdef CONFIG_PM @@ -145,7 +137,6 @@ static int snd_ad1848_resume(struct device *dev, unsigned int n) static struct isa_driver snd_ad1848_driver = { .match = snd_ad1848_match, .probe = snd_ad1848_probe, - .remove = snd_ad1848_remove, #ifdef CONFIG_PM .suspend = snd_ad1848_suspend, .resume = snd_ad1848_resume, From patchwork Thu Jul 15 07:59:18 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379319 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id EB2D6C07E96 for ; Thu, 15 Jul 2021 08:22:42 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 6386D61183 for ; Thu, 15 Jul 2021 08:22:42 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 6386D61183 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id CDE681756; Thu, 15 Jul 2021 10:21:50 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz CDE681756 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626337360; bh=RWLJMaRirfQbsUsqZ0jOaL1vpWvFHyJCdBoMJS8JcYY=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=YdPJdGwwB1x6yjo6HGbrSPDMtr0oWiC7YsgqExPJP4nbf83dJzYowH4I0iI7QW+2W NEwPJjf7ywHBwmBA70MftZ2xwic5kYRd+DP2huIitWzCK8Uhc+MHK8yKc9ZGVBI+V+ fZUzAmShyc6F25W981Wr8dN0wU0Qj7G+1Sg+7bCg= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id EC036F80760; Thu, 15 Jul 2021 10:01:34 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id 2530AF80722; Thu, 15 Jul 2021 10:01:25 +0200 (CEST) Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 9A07CF804D2 for ; Thu, 15 Jul 2021 10:00:16 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 9A07CF804D2 Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="AYjRs8uq"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="yJYtkO+t" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out1.suse.de (Postfix) with ESMTP id 6208B22833 for ; Thu, 15 Jul 2021 08:00:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336016; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=AvQU4Cnz68Qc1H+ELmRFr+SaYTSyr1oxM4UtKPI65yk=; b=AYjRs8uqLfdhopCdo72lRe+yrOwZ3Q+3T2zZ+uye9Sn3Q9rv2E7WjDs9le3Q24Vl3a02pb ybnftGsAgutmhUcobzB4XBh1IRTZug+534Pwqc/VtrzOuRogC50d4HaMaSK7NUfEOc8p/q RU8UrRvABHAnuBlt2SGI8BZfGFQcSrk= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336016; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=AvQU4Cnz68Qc1H+ELmRFr+SaYTSyr1oxM4UtKPI65yk=; b=yJYtkO+tyjXwEK9atp7Y6xkgdUDHjz3wwi2VIFpUGXJuqCOVxfV88jRSQvNMWLcYsMit76 l0U96NyXDW6xwaCA== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id 50F14A3B8F; Thu, 15 Jul 2021 08:00:16 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 56/79] ALSA: adlib: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:59:18 +0200 Message-Id: <20210715075941.23332-57-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in ISA adlib driver with devres as a clean up. Each manual resource management is converted with the corresponding devres helper. The remove callback became superfluous and dropped. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- sound/isa/adlib.c | 28 ++++++---------------------- 1 file changed, 6 insertions(+), 22 deletions(-) diff --git a/sound/isa/adlib.c b/sound/isa/adlib.c index e6cd7c4da38e..f079ba4ef1a0 100644 --- a/sound/isa/adlib.c +++ b/sound/isa/adlib.c @@ -43,30 +43,23 @@ static int snd_adlib_match(struct device *dev, unsigned int n) return 1; } -static void snd_adlib_free(struct snd_card *card) -{ - release_and_free_resource(card->private_data); -} - static int snd_adlib_probe(struct device *dev, unsigned int n) { struct snd_card *card; struct snd_opl3 *opl3; int error; - error = snd_card_new(dev, index[n], id[n], THIS_MODULE, 0, &card); + error = snd_devm_card_new(dev, index[n], id[n], THIS_MODULE, 0, &card); if (error < 0) { dev_err(dev, "could not create card\n"); return error; } - card->private_data = request_region(port[n], 4, CRD_NAME); + card->private_data = devm_request_region(dev, port[n], 4, CRD_NAME); if (!card->private_data) { dev_err(dev, "could not grab ports\n"); - error = -EBUSY; - goto out; + return -EBUSY; } - card->private_free = snd_adlib_free; strcpy(card->driver, DEV_NAME); strcpy(card->shortname, CRD_NAME); @@ -75,37 +68,28 @@ static int snd_adlib_probe(struct device *dev, unsigned int n) error = snd_opl3_create(card, port[n], port[n] + 2, OPL3_HW_AUTO, 1, &opl3); if (error < 0) { dev_err(dev, "could not create OPL\n"); - goto out; + return error; } error = snd_opl3_hwdep_new(opl3, 0, 0, NULL); if (error < 0) { dev_err(dev, "could not create FM\n"); - goto out; + return error; } error = snd_card_register(card); if (error < 0) { dev_err(dev, "could not register card\n"); - goto out; + return error; } dev_set_drvdata(dev, card); return 0; - -out: snd_card_free(card); - return error; -} - -static void snd_adlib_remove(struct device *dev, unsigned int n) -{ - snd_card_free(dev_get_drvdata(dev)); } static struct isa_driver snd_adlib_driver = { .match = snd_adlib_match, .probe = snd_adlib_probe, - .remove = snd_adlib_remove, .driver = { .name = DEV_NAME From patchwork Thu Jul 15 07:59:19 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379335 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id A68F3C1B08C for ; Thu, 15 Jul 2021 08:23:22 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 33DC76120A for ; Thu, 15 Jul 2021 08:23:22 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 33DC76120A Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id C487B170A; Thu, 15 Jul 2021 10:22:30 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz C487B170A DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626337400; bh=vS2kG263snHYynEC+gjMlsptsj+n6Ckvppmm8r66knI=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=b2omrxvDEIFRjEGU6O8/ntoYOpDocnMa4EkwpadwuN9EwEXHZt5nuPEXWCZ/E3piF jQAYvzue/MPMOzJOxalY7ci5lpClQSIyCXuTwASB5aPZVhg+wXxL155UwYhG+5bQ3L 6cpPwJqMzpnnOgAfISokw9rIZpoAOJJgc3ammLZM= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id 4CB78F80766; Thu, 15 Jul 2021 10:01:37 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id 81060F80726; Thu, 15 Jul 2021 10:01:25 +0200 (CEST) Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id F2C0EF80553 for ; Thu, 15 Jul 2021 10:00:16 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz F2C0EF80553 Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="FJLfVL8M"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="VI34KC1q" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out1.suse.de (Postfix) with ESMTP id C108A22854 for ; Thu, 15 Jul 2021 08:00:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336016; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=4o4JwLbDRxjkXT0ACxAkJ3kh+7NKemqHzCxqG+DWwS0=; b=FJLfVL8M02O3Vyd61oyeYYgJ9yNfsm1877u0pHMSOwqlVuXjm4v6zbYfq937F4ye7awvb4 TIswQK5PQVO+MrLEYDkZMe3BelHvlRSrLKFm9q18LaL0skSmAbqIwxg0Wwg3dwjFzl5Q+S qivnbgLLotQVN44I4aYFTwu9iiYq/Ng= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336016; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=4o4JwLbDRxjkXT0ACxAkJ3kh+7NKemqHzCxqG+DWwS0=; b=VI34KC1q52lqNW4Hj/c5K3uIL+kcXT5VQglKFBjCE7j5IWYIOZEUH2MXV4iK3hwct/y0ns 0mxNAjSGQrV8pXCw== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id BA8FDA3B8F; Thu, 15 Jul 2021 08:00:16 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 57/79] ALSA: als100: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:59:19 +0200 Message-Id: <20210715075941.23332-58-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in ISA als100 driver with devres as a clean up. Each manual resource management is converted with the corresponding devres helper. The remove callback became superfluous and dropped. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- sound/isa/als100.c | 41 ++++++++++------------------------------- 1 file changed, 10 insertions(+), 31 deletions(-) diff --git a/sound/isa/als100.c b/sound/isa/als100.c index d4597fdfe091..d582eff64082 100644 --- a/sound/isa/als100.c +++ b/sound/isa/als100.c @@ -170,18 +170,16 @@ static int snd_card_als100_probe(int dev, struct snd_card_als100 *acard; struct snd_opl3 *opl3; - error = snd_card_new(&pcard->card->dev, - index[dev], id[dev], THIS_MODULE, - sizeof(struct snd_card_als100), &card); + error = snd_devm_card_new(&pcard->card->dev, + index[dev], id[dev], THIS_MODULE, + sizeof(struct snd_card_als100), &card); if (error < 0) return error; acard = card->private_data; error = snd_card_als100_pnp(dev, acard, pcard, pid); - if (error) { - snd_card_free(card); + if (error) return error; - } if (pid->driver_data == SB_HW_DT019X) dma16[dev] = -1; @@ -191,10 +189,8 @@ static int snd_card_als100_probe(int dev, dma8[dev], dma16[dev], pid->driver_data, &chip); - if (error < 0) { - snd_card_free(card); + if (error < 0) return error; - } acard->chip = chip; if (pid->driver_data == SB_HW_DT019X) { @@ -213,16 +209,12 @@ static int snd_card_als100_probe(int dev, } error = snd_sb16dsp_pcm(chip, 0); - if (error < 0) { - snd_card_free(card); + if (error < 0) return error; - } error = snd_sbmixer_new(chip); - if (error < 0) { - snd_card_free(card); + if (error < 0) return error; - } if (mpu_port[dev] > 0 && mpu_port[dev] != SNDRV_AUTO_PORT) { int mpu_type = MPU401_HW_ALS100; @@ -249,23 +241,17 @@ static int snd_card_als100_probe(int dev, fm_port[dev], fm_port[dev] + 2); } else { error = snd_opl3_timer_new(opl3, 0, 1); - if (error < 0) { - snd_card_free(card); + if (error < 0) return error; - } error = snd_opl3_hwdep_new(opl3, 0, 1, NULL); - if (error < 0) { - snd_card_free(card); + if (error < 0) return error; - } } } error = snd_card_register(card); - if (error < 0) { - snd_card_free(card); + if (error < 0) return error; - } pnp_set_card_drvdata(pcard, card); return 0; } @@ -291,12 +277,6 @@ static int snd_als100_pnp_detect(struct pnp_card_link *card, return -ENODEV; } -static void snd_als100_pnp_remove(struct pnp_card_link *pcard) -{ - snd_card_free(pnp_get_card_drvdata(pcard)); - pnp_set_card_drvdata(pcard, NULL); -} - #ifdef CONFIG_PM static int snd_als100_pnp_suspend(struct pnp_card_link *pcard, pm_message_t state) { @@ -327,7 +307,6 @@ static struct pnp_card_driver als100_pnpc_driver = { .name = "als100", .id_table = snd_als100_pnpids, .probe = snd_als100_pnp_detect, - .remove = snd_als100_pnp_remove, #ifdef CONFIG_PM .suspend = snd_als100_pnp_suspend, .resume = snd_als100_pnp_resume, From patchwork Thu Jul 15 07:59:20 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379321 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0C79EC07E96 for ; Thu, 15 Jul 2021 08:23:01 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 830C6611C0 for ; Thu, 15 Jul 2021 08:23:00 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 830C6611C0 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id 2220816CB; Thu, 15 Jul 2021 10:22:09 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 2220816CB DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626337379; bh=/egJmUr59IyDImqF+56T/sOM3qBax4Wvgj4zGplAkKY=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=QugjtFPvrcN+YO+uz+QI23UVNhRocS0gCGrE20HxdZzOzOZI0YN3GzPvw549HSTGX MFjKS2utqJuJCyw74hFWdeH9E1+dHKD/MNdfexN5eNB93o/9NUq1JeoC8wn+ltjRWl ceBZGH4v6SWjX8/3D78z60W0sM/rgSqJoQGFwxg4= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id 9BBA9F80765; Thu, 15 Jul 2021 10:01:36 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id 34BA3F80720; Thu, 15 Jul 2021 10:01:25 +0200 (CEST) Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 6F952F8055A for ; Thu, 15 Jul 2021 10:00:17 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 6F952F8055A Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="ocL/1Q4W"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="5x/9JQrn" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out2.suse.de (Postfix) with ESMTP id 43B531FD3E for ; Thu, 15 Jul 2021 08:00:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336017; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=8N5g+KTOoao1mhuTQ2kTRzNtUtzImdgSu3SqZkxl8eg=; b=ocL/1Q4WlAJzIbV1Wp0wgKC/9QKnAO6tojFCPOr8ENQX71wO3m3zEqbff9ToelSkNdLJsu chDtdsFLephxwyHAZIKb9KT3xwPCYT8LIS8fPQYEA4gA7RCssDThRNZeua0Vu9OIoTYz0w rn7++Y23fZ51ELELLCbkFFk0wFeNnZ0= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336017; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=8N5g+KTOoao1mhuTQ2kTRzNtUtzImdgSu3SqZkxl8eg=; b=5x/9JQrnFwiqFf93i/tQofZ0qzyXcDkjNrhXZ4m1rhmu+5OcJgghJdhHaR8LR060l673oB DcuI9PJfOrjJpwDQ== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id 3BB07A3B8F; Thu, 15 Jul 2021 08:00:17 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 58/79] ALSA: azt2320: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:59:20 +0200 Message-Id: <20210715075941.23332-59-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in ISA azt2320 driver with devres as a clean up. Each manual resource management is converted with the corresponding devres helper. The remove callback became superfluous and dropped. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- sound/isa/azt2320.c | 49 +++++++++++---------------------------------- 1 file changed, 12 insertions(+), 37 deletions(-) diff --git a/sound/isa/azt2320.c b/sound/isa/azt2320.c index dd5c059b3744..761cd198df2b 100644 --- a/sound/isa/azt2320.c +++ b/sound/isa/azt2320.c @@ -169,33 +169,27 @@ static int snd_card_azt2320_probe(int dev, struct snd_wss *chip; struct snd_opl3 *opl3; - error = snd_card_new(&pcard->card->dev, - index[dev], id[dev], THIS_MODULE, - sizeof(struct snd_card_azt2320), &card); + error = snd_devm_card_new(&pcard->card->dev, + index[dev], id[dev], THIS_MODULE, + sizeof(struct snd_card_azt2320), &card); if (error < 0) return error; acard = card->private_data; error = snd_card_azt2320_pnp(dev, acard, pcard, pid); - if (error) { - snd_card_free(card); + if (error) return error; - } error = snd_card_azt2320_enable_wss(port[dev]); - if (error) { - snd_card_free(card); + if (error) return error; - } error = snd_wss_create(card, wss_port[dev], -1, irq[dev], dma1[dev], dma2[dev], WSS_HW_DETECT, 0, &chip); - if (error < 0) { - snd_card_free(card); + if (error < 0) return error; - } strcpy(card->driver, "AZT2320"); strcpy(card->shortname, "Aztech AZT2320"); @@ -203,20 +197,14 @@ static int snd_card_azt2320_probe(int dev, card->shortname, chip->port, irq[dev], dma1[dev], dma2[dev]); error = snd_wss_pcm(chip, 0); - if (error < 0) { - snd_card_free(card); + if (error < 0) return error; - } error = snd_wss_mixer(chip); - if (error < 0) { - snd_card_free(card); + if (error < 0) return error; - } error = snd_wss_timer(chip, 0); - if (error < 0) { - snd_card_free(card); + if (error < 0) return error; - } if (mpu_port[dev] > 0 && mpu_port[dev] != SNDRV_AUTO_PORT) { if (snd_mpu401_uart_new(card, 0, MPU401_HW_AZT2320, @@ -233,23 +221,17 @@ static int snd_card_azt2320_probe(int dev, fm_port[dev], fm_port[dev] + 2); } else { error = snd_opl3_timer_new(opl3, 1, 2); - if (error < 0) { - snd_card_free(card); + if (error < 0) return error; - } error = snd_opl3_hwdep_new(opl3, 0, 1, NULL); - if (error < 0) { - snd_card_free(card); + if (error < 0) return error; - } } } error = snd_card_register(card); - if (error < 0) { - snd_card_free(card); + if (error < 0) return error; - } pnp_set_card_drvdata(pcard, card); return 0; } @@ -275,12 +257,6 @@ static int snd_azt2320_pnp_detect(struct pnp_card_link *card, return -ENODEV; } -static void snd_azt2320_pnp_remove(struct pnp_card_link *pcard) -{ - snd_card_free(pnp_get_card_drvdata(pcard)); - pnp_set_card_drvdata(pcard, NULL); -} - #ifdef CONFIG_PM static int snd_azt2320_pnp_suspend(struct pnp_card_link *pcard, pm_message_t state) { @@ -310,7 +286,6 @@ static struct pnp_card_driver azt2320_pnpc_driver = { .name = "azt2320", .id_table = snd_azt2320_pnpids, .probe = snd_azt2320_pnp_detect, - .remove = snd_azt2320_pnp_remove, #ifdef CONFIG_PM .suspend = snd_azt2320_pnp_suspend, .resume = snd_azt2320_pnp_resume, From patchwork Thu Jul 15 07:59:21 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379339 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4CA9BC07E96 for ; Thu, 15 Jul 2021 08:24:13 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id BA1AC611C0 for ; Thu, 15 Jul 2021 08:24:12 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org BA1AC611C0 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id 55DE1172C; Thu, 15 Jul 2021 10:23:21 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 55DE1172C DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626337451; bh=Z5jilQdlCU+ecvpcWvo7FZHN7ukKaSxot+1nMDo4rws=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=gxYLnvfmi1DOgqVzyoOL8dSnxrZ2pMzIcavieB3Ul5jV6ub45tBeGZVEvtu95bVPr SyTR4taJpE6z6ZRnaJT+ZhCz58gj9P6Dj3Btos20+FluJwhyySHPxuXrIiUcEfmHlT MoyTC5j/97Bv01iV1y7V9UjdYYxr1h4nKP4J8Ue4= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id F2A73F80787; Thu, 15 Jul 2021 10:01:39 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id E0411F80727; Thu, 15 Jul 2021 10:01:26 +0200 (CEST) Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 054B4F8055C for ; Thu, 15 Jul 2021 10:00:18 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 054B4F8055C Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="x89aarh3"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="ma8/nXlc" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out2.suse.de (Postfix) with ESMTP id D43F01FDE5 for ; Thu, 15 Jul 2021 08:00:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336017; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=yW7HisTCVctoOzQXfvpnF5WdDsgPe7fCJ3Y4gwvxgII=; b=x89aarh3S13dhizwlgZ88Bd5zAlaqvadoXBtCZl4ulzSupA1AS+LTxyELHkFfHXPgl/IBr qlWAy0VIuEhDerhmWXVmKtv6NTCSFeFphseCHYrEYBnrUyjuZLXnzU74TOjOuHUHodPdsP 1T2JOKmTESwcVYsy9By+vrRe5NtRR7Q= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336017; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=yW7HisTCVctoOzQXfvpnF5WdDsgPe7fCJ3Y4gwvxgII=; b=ma8/nXlcmucm02i9dMll/Xsw0LdmCsvnVT6Z838dGdf86OPjJIwPzkSug2FqWvkCOdmksq CXFPUNXFJNX4+wBg== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id C9F6AA3B8F; Thu, 15 Jul 2021 08:00:17 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 59/79] ALSA: cmi8328: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:59:21 +0200 Message-Id: <20210715075941.23332-60-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in ISA cmi8328 driver with devres as a clean up. Each manual resource management is converted with the corresponding devres helper. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- sound/isa/cmi8328.c | 31 ++++++++++--------------------- 1 file changed, 10 insertions(+), 21 deletions(-) diff --git a/sound/isa/cmi8328.c b/sound/isa/cmi8328.c index 3b9fbb02864b..8902cfb830f7 100644 --- a/sound/isa/cmi8328.c +++ b/sound/isa/cmi8328.c @@ -294,8 +294,8 @@ static int snd_cmi8328_probe(struct device *pdev, unsigned int ndev) } outb(val, port); - err = snd_card_new(pdev, index[ndev], id[ndev], THIS_MODULE, - sizeof(struct snd_cmi8328), &card); + err = snd_devm_card_new(pdev, index[ndev], id[ndev], THIS_MODULE, + sizeof(struct snd_cmi8328), &card); if (err < 0) return err; cmi = card->private_data; @@ -306,18 +306,18 @@ static int snd_cmi8328_probe(struct device *pdev, unsigned int ndev) err = snd_wss_create(card, port + 4, -1, irq[ndev], dma1[ndev], dma2[ndev], WSS_HW_DETECT, 0, &cmi->wss); if (err < 0) - goto error; + return err; err = snd_wss_pcm(cmi->wss, 0); if (err < 0) - goto error; + return err; err = snd_wss_mixer(cmi->wss); if (err < 0) - goto error; + return err; err = snd_cmi8328_mixer(cmi->wss); if (err < 0) - goto error; + return err; if (snd_wss_timer(cmi->wss, 0) < 0) snd_printk(KERN_WARNING "error initializing WSS timer\n"); @@ -371,24 +371,21 @@ static int snd_cmi8328_probe(struct device *pdev, unsigned int ndev) dev_set_drvdata(pdev, card); err = snd_card_register(card); if (err < 0) - goto error; + return err; #ifdef SUPPORT_JOYSTICK if (!gameport[ndev]) return 0; /* gameport is hardwired to 0x200 */ - res = request_region(0x200, 8, "CMI8328 gameport"); + res = devm_request_region(pdev, 0x200, 8, "CMI8328 gameport"); if (!res) snd_printk(KERN_WARNING "unable to allocate gameport I/O port\n"); else { struct gameport *gp = cmi->gameport = gameport_allocate_port(); - if (!cmi->gameport) - release_and_free_resource(res); - else { + if (cmi->gameport) { gameport_set_name(gp, "CMI8328 Gameport"); gameport_set_phys(gp, "%s/gameport0", dev_name(pdev)); gameport_set_dev_parent(gp, pdev); gp->io = 0x200; - gameport_set_port_data(gp, res); /* Enable gameport */ snd_cmi8328_cfg_write(port, CFG1, CFG1_SB_DISABLE | CFG1_GAMEPORT); @@ -397,10 +394,6 @@ static int snd_cmi8328_probe(struct device *pdev, unsigned int ndev) } #endif return 0; -error: - snd_card_free(card); - - return err; } static void snd_cmi8328_remove(struct device *pdev, unsigned int dev) @@ -409,17 +402,13 @@ static void snd_cmi8328_remove(struct device *pdev, unsigned int dev) struct snd_cmi8328 *cmi = card->private_data; #ifdef SUPPORT_JOYSTICK - if (cmi->gameport) { - struct resource *res = gameport_get_port_data(cmi->gameport); + if (cmi->gameport) gameport_unregister_port(cmi->gameport); - release_and_free_resource(res); - } #endif /* disable everything */ snd_cmi8328_cfg_write(cmi->port, CFG1, CFG1_SB_DISABLE); snd_cmi8328_cfg_write(cmi->port, CFG2, 0); snd_cmi8328_cfg_write(cmi->port, CFG3, 0); - snd_card_free(card); } #ifdef CONFIG_PM From patchwork Thu Jul 15 07:59:22 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379341 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id E52B0C07E96 for ; Thu, 15 Jul 2021 08:24:33 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 6B57C611C0 for ; Thu, 15 Jul 2021 08:24:33 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 6B57C611C0 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id E82C716CB; Thu, 15 Jul 2021 10:23:41 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz E82C716CB DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626337472; bh=zRpXtnL6OQE2O9yvL3oR1On/zIVyFWrX3maEbhuHhbM=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=ePhRqXmtxxHyFYVBQYVewlQY7Qui3WqqqM41LtHk2puOZU9SAdO/D5LZBCQuIN4pi G+VaAvrB7IM3pdG99XQnYbZoMh03u6uIVZjjC0HrsDLeB9+WfVRtyWRnPWpMJObFKF dftFZzcyp+wOfq99wVHswjRzR23fdxUbCqRAuzgk= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id B00E7F80793; Thu, 15 Jul 2021 10:01:40 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id EE5EAF80751; Thu, 15 Jul 2021 10:01:31 +0200 (CEST) Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 9C28DF8056F for ; Thu, 15 Jul 2021 10:00:18 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 9C28DF8056F Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="dO6elzCJ"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="fImqLQ8S" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out2.suse.de (Postfix) with ESMTP id 79FE81FDEA for ; Thu, 15 Jul 2021 08:00:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336018; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=uoygPP8H52ZENTI7HiYROdAhiB2nZYpwxd60DNX2ceI=; b=dO6elzCJuXWTP3K/zUoSOOPuhEWHxzkZAci9jnLbUOQA8kmFBVWuygKQFiKGGvWkY179XX TvM7P1Sgzrs7kiY111YFQd9sTJe3PCHQRtxZ1nsaI7mmUmkmptqbO9nnQFdUYi+4dhqYgB ISJ4usWKbmL6dXI0TpUBHncD2P6R3/Q= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336018; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=uoygPP8H52ZENTI7HiYROdAhiB2nZYpwxd60DNX2ceI=; b=fImqLQ8S8RGA1DGW+7+xQTWnuTdCDYqxDTLq6+UKgXhb/R2JBIVpzrAniSFYJ4GEYAI6xf 7eee5b5ss94FEHCw== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id 4EEB2A3B8F; Thu, 15 Jul 2021 08:00:18 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 60/79] ALSA: cmi8330: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:59:22 +0200 Message-Id: <20210715075941.23332-61-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in ISA cmi8330 driver with devres as a clean up. Each manual resource management is converted with the corresponding devres helper. The remove callback became superfluous and dropped. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- sound/isa/cmi8330.c | 27 ++++----------------------- 1 file changed, 4 insertions(+), 23 deletions(-) diff --git a/sound/isa/cmi8330.c b/sound/isa/cmi8330.c index ef6d0a20efd8..f209b16c5229 100644 --- a/sound/isa/cmi8330.c +++ b/sound/isa/cmi8330.c @@ -507,8 +507,8 @@ static int snd_cmi8330_card_new(struct device *pdev, int dev, struct snd_cmi8330 *acard; int err; - err = snd_card_new(pdev, index[dev], id[dev], THIS_MODULE, - sizeof(struct snd_cmi8330), &card); + err = snd_devm_card_new(pdev, index[dev], id[dev], THIS_MODULE, + sizeof(struct snd_cmi8330), &card); if (err < 0) { snd_printk(KERN_ERR PFX "could not get a new card\n"); return err; @@ -629,20 +629,12 @@ static int snd_cmi8330_isa_probe(struct device *pdev, if (err < 0) return err; err = snd_cmi8330_probe(card, dev); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } dev_set_drvdata(pdev, card); return 0; } -static void snd_cmi8330_isa_remove(struct device *devptr, - unsigned int dev) -{ - snd_card_free(dev_get_drvdata(devptr)); -} - #ifdef CONFIG_PM static int snd_cmi8330_isa_suspend(struct device *dev, unsigned int n, pm_message_t state) @@ -661,7 +653,6 @@ static int snd_cmi8330_isa_resume(struct device *dev, unsigned int n) static struct isa_driver snd_cmi8330_driver = { .match = snd_cmi8330_isa_match, .probe = snd_cmi8330_isa_probe, - .remove = snd_cmi8330_isa_remove, #ifdef CONFIG_PM .suspend = snd_cmi8330_isa_suspend, .resume = snd_cmi8330_isa_resume, @@ -693,25 +684,16 @@ static int snd_cmi8330_pnp_detect(struct pnp_card_link *pcard, res = snd_cmi8330_pnp(dev, card->private_data, pcard, pid); if (res < 0) { snd_printk(KERN_ERR PFX "PnP detection failed\n"); - snd_card_free(card); return res; } res = snd_cmi8330_probe(card, dev); - if (res < 0) { - snd_card_free(card); + if (res < 0) return res; - } pnp_set_card_drvdata(pcard, card); dev++; return 0; } -static void snd_cmi8330_pnp_remove(struct pnp_card_link *pcard) -{ - snd_card_free(pnp_get_card_drvdata(pcard)); - pnp_set_card_drvdata(pcard, NULL); -} - #ifdef CONFIG_PM static int snd_cmi8330_pnp_suspend(struct pnp_card_link *pcard, pm_message_t state) { @@ -729,7 +711,6 @@ static struct pnp_card_driver cmi8330_pnpc_driver = { .name = "cmi8330", .id_table = snd_cmi8330_pnpids, .probe = snd_cmi8330_pnp_detect, - .remove = snd_cmi8330_pnp_remove, #ifdef CONFIG_PM .suspend = snd_cmi8330_pnp_suspend, .resume = snd_cmi8330_pnp_resume, From patchwork Thu Jul 15 07:59:23 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379345 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id EE6AAC07E96 for ; Thu, 15 Jul 2021 08:25:13 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 73132611C0 for ; Thu, 15 Jul 2021 08:25:13 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 73132611C0 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id 13C2E171B; Thu, 15 Jul 2021 10:24:22 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 13C2E171B DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626337512; bh=f8Exp9nQ4/RjdzLrHagW/ojVbJAx7q9RxNf+Gs97iRo=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=OGW9S+n/hTkunsmCNCJ2Hy3eR6izqDzWkBkNOcDHmE04oUQSCIRW5Kb3wqZj5/WqV nv8TeFQWWPUh/gmOb5XSfGuBCC+KHWePfGenOObcD/aLa8VKO4YNQOVv1uVMRLh3r6 61GHBToHb/Et0kP1/fhipDgb9Z2pjcIdsH/rIjfg= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id 6B1E2F805AB; Thu, 15 Jul 2021 10:01:43 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id 79C9FF80752; Thu, 15 Jul 2021 10:01:33 +0200 (CEST) Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id E4678F80571 for ; Thu, 15 Jul 2021 10:00:18 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz E4678F80571 Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="l6dx8Lbc"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="0sRH6ry/" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out2.suse.de (Postfix) with ESMTP id BD3031FD3E for ; Thu, 15 Jul 2021 08:00:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336018; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=G2bGx86bFHXrSseO5QPIpD1LTrmxR/AYBno1JEt8gXo=; b=l6dx8Lbc1dSanfXeSqIY5CmxOQ+DnVdda2sLrYVd1SZ01b9HpdEOqSk4TJuM85ZO0S2hk1 0aMl64rC8VWIiIbftOGCqotaZX85VKdokvX6uw1WXMWRBwqA6ZUBSg5oHkDqAtB2j/apni l4jD+8HUr2jKRNW1kGWK8Iyx96LydZM= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336018; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=G2bGx86bFHXrSseO5QPIpD1LTrmxR/AYBno1JEt8gXo=; b=0sRH6ry/TBfi0wu8t4hZoLo3JtSMaOv4mzUccwReJ65QP4vf2QxrCSUF4zdYxZo8Qp2uWL JL3dqqmcAlkhJPDA== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id B64EBA3B8F; Thu, 15 Jul 2021 08:00:18 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 61/79] ALSA: cs423x: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:59:23 +0200 Message-Id: <20210715075941.23332-62-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in ISA cs423x drivers with devres as a clean up. Each manual resource management is converted with the corresponding devres helper. The remove callback became superfluous and dropped. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- sound/isa/cs423x/cs4231.c | 21 +++++----------- sound/isa/cs423x/cs4236.c | 52 ++++++--------------------------------- 2 files changed, 13 insertions(+), 60 deletions(-) diff --git a/sound/isa/cs423x/cs4231.c b/sound/isa/cs423x/cs4231.c index ec054b929214..1e8923385366 100644 --- a/sound/isa/cs423x/cs4231.c +++ b/sound/isa/cs423x/cs4231.c @@ -79,20 +79,20 @@ static int snd_cs4231_probe(struct device *dev, unsigned int n) struct snd_wss *chip; int error; - error = snd_card_new(dev, index[n], id[n], THIS_MODULE, 0, &card); + error = snd_devm_card_new(dev, index[n], id[n], THIS_MODULE, 0, &card); if (error < 0) return error; error = snd_wss_create(card, port[n], -1, irq[n], dma1[n], dma2[n], WSS_HW_DETECT, 0, &chip); if (error < 0) - goto out; + return error; card->private_data = chip; error = snd_wss_pcm(chip, 0); if (error < 0) - goto out; + return error; strscpy(card->driver, "CS4231", sizeof(card->driver)); strscpy(card->shortname, chip->pcm->name, sizeof(card->shortname)); @@ -108,11 +108,11 @@ static int snd_cs4231_probe(struct device *dev, unsigned int n) error = snd_wss_mixer(chip); if (error < 0) - goto out; + return error; error = snd_wss_timer(chip, 0); if (error < 0) - goto out; + return error; if (mpu_port[n] > 0 && mpu_port[n] != SNDRV_AUTO_PORT) { if (mpu_irq[n] == SNDRV_AUTO_IRQ) @@ -125,18 +125,10 @@ static int snd_cs4231_probe(struct device *dev, unsigned int n) error = snd_card_register(card); if (error < 0) - goto out; + return error; dev_set_drvdata(dev, card); return 0; - -out: snd_card_free(card); - return error; -} - -static void snd_cs4231_remove(struct device *dev, unsigned int n) -{ - snd_card_free(dev_get_drvdata(dev)); } #ifdef CONFIG_PM @@ -164,7 +156,6 @@ static int snd_cs4231_resume(struct device *dev, unsigned int n) static struct isa_driver snd_cs4231_driver = { .match = snd_cs4231_match, .probe = snd_cs4231_probe, - .remove = snd_cs4231_remove, #ifdef CONFIG_PM .suspend = snd_cs4231_suspend, .resume = snd_cs4231_resume, diff --git a/sound/isa/cs423x/cs4236.c b/sound/isa/cs423x/cs4236.c index 0b7fd17f8ecc..b6bdebd9ef27 100644 --- a/sound/isa/cs423x/cs4236.c +++ b/sound/isa/cs423x/cs4236.c @@ -76,7 +76,6 @@ static int pnp_registered; struct snd_card_cs4236 { struct snd_wss *chip; - struct resource *res_sb_port; #ifdef CONFIG_PNP struct pnp_dev *wss; struct pnp_dev *ctrl; @@ -309,24 +308,16 @@ static int snd_card_cs423x_pnpc(int dev, struct snd_card_cs4236 *acard, #define is_isapnp_selected(dev) 0 #endif -static void snd_card_cs4236_free(struct snd_card *card) -{ - struct snd_card_cs4236 *acard = card->private_data; - - release_and_free_resource(acard->res_sb_port); -} - static int snd_cs423x_card_new(struct device *pdev, int dev, struct snd_card **cardp) { struct snd_card *card; int err; - err = snd_card_new(pdev, index[dev], id[dev], THIS_MODULE, - sizeof(struct snd_card_cs4236), &card); + err = snd_devm_card_new(pdev, index[dev], id[dev], THIS_MODULE, + sizeof(struct snd_card_cs4236), &card); if (err < 0) return err; - card->private_free = snd_card_cs4236_free; *cardp = card; return 0; } @@ -340,8 +331,8 @@ static int snd_cs423x_probe(struct snd_card *card, int dev) acard = card->private_data; if (sb_port[dev] > 0 && sb_port[dev] != SNDRV_AUTO_PORT) { - acard->res_sb_port = request_region(sb_port[dev], 16, IDENT " SB"); - if (!acard->res_sb_port) { + if (!devm_request_region(card->dev, sb_port[dev], 16, + IDENT " SB")) { printk(KERN_ERR IDENT ": unable to register SB port at 0x%lx\n", sb_port[dev]); return -EBUSY; } @@ -448,21 +439,12 @@ static int snd_cs423x_isa_probe(struct device *pdev, if (err < 0) return err; err = snd_cs423x_probe(card, dev); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } - dev_set_drvdata(pdev, card); return 0; } -static void snd_cs423x_isa_remove(struct device *pdev, - unsigned int dev) -{ - snd_card_free(dev_get_drvdata(pdev)); -} - #ifdef CONFIG_PM static int snd_cs423x_suspend(struct snd_card *card) { @@ -495,7 +477,6 @@ static int snd_cs423x_isa_resume(struct device *dev, unsigned int n) static struct isa_driver cs423x_isa_driver = { .match = snd_cs423x_isa_match, .probe = snd_cs423x_isa_probe, - .remove = snd_cs423x_isa_remove, #ifdef CONFIG_PM .suspend = snd_cs423x_isa_suspend, .resume = snd_cs423x_isa_resume, @@ -539,24 +520,16 @@ static int snd_cs423x_pnpbios_detect(struct pnp_dev *pdev, err = snd_card_cs423x_pnp(dev, card->private_data, pdev, cdev); if (err < 0) { printk(KERN_ERR "PnP BIOS detection failed for " IDENT "\n"); - snd_card_free(card); return err; } err = snd_cs423x_probe(card, dev); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } pnp_set_drvdata(pdev, card); dev++; return 0; } -static void snd_cs423x_pnp_remove(struct pnp_dev *pdev) -{ - snd_card_free(pnp_get_drvdata(pdev)); -} - #ifdef CONFIG_PM static int snd_cs423x_pnp_suspend(struct pnp_dev *pdev, pm_message_t state) { @@ -573,7 +546,6 @@ static struct pnp_driver cs423x_pnp_driver = { .name = "cs423x-pnpbios", .id_table = snd_cs423x_pnpbiosids, .probe = snd_cs423x_pnpbios_detect, - .remove = snd_cs423x_pnp_remove, #ifdef CONFIG_PM .suspend = snd_cs423x_pnp_suspend, .resume = snd_cs423x_pnp_resume, @@ -601,25 +573,16 @@ static int snd_cs423x_pnpc_detect(struct pnp_card_link *pcard, if (res < 0) { printk(KERN_ERR "isapnp detection failed and probing for " IDENT " is not supported\n"); - snd_card_free(card); return res; } res = snd_cs423x_probe(card, dev); - if (res < 0) { - snd_card_free(card); + if (res < 0) return res; - } pnp_set_card_drvdata(pcard, card); dev++; return 0; } -static void snd_cs423x_pnpc_remove(struct pnp_card_link *pcard) -{ - snd_card_free(pnp_get_card_drvdata(pcard)); - pnp_set_card_drvdata(pcard, NULL); -} - #ifdef CONFIG_PM static int snd_cs423x_pnpc_suspend(struct pnp_card_link *pcard, pm_message_t state) { @@ -637,7 +600,6 @@ static struct pnp_card_driver cs423x_pnpc_driver = { .name = CS423X_ISAPNP_DRIVER, .id_table = snd_cs423x_pnpids, .probe = snd_cs423x_pnpc_detect, - .remove = snd_cs423x_pnpc_remove, #ifdef CONFIG_PM .suspend = snd_cs423x_pnpc_suspend, .resume = snd_cs423x_pnpc_resume, From patchwork Thu Jul 15 07:59:24 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379343 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8970CC07E96 for ; Thu, 15 Jul 2021 08:24:51 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 13697611C0 for ; Thu, 15 Jul 2021 08:24:51 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 13697611C0 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id 8A2FA1766; Thu, 15 Jul 2021 10:23:59 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 8A2FA1766 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626337489; bh=UmeZ7ag78PZFFqspkHwDljiQneoAOL6eqCouDx75+cs=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=BM6dLXgS2mV0Cuk9r8HaNUpowg1w85KQIXM08khGkXjSGCsxM470U+eFo72Uk9HSc oKL/O0DFxQOFmvH05wy1Hwh5hfebcXW/Fkaja0XX9z/1vFfnch2DdFGD4pHipNi8bf EbPaq9fc3PJeujdCIiqMU277y7JDg1tuXmdRDOdk= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id C9BDEF8077B; Thu, 15 Jul 2021 10:01:41 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id 4070AF80753; Thu, 15 Jul 2021 10:01:33 +0200 (CEST) Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 57892F80570 for ; Thu, 15 Jul 2021 10:00:19 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 57892F80570 Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="X/0n4i6F"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="M9Yj96Qa" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out2.suse.de (Postfix) with ESMTP id 2F4071FDE5 for ; Thu, 15 Jul 2021 08:00:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336019; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=kQ5FP0OW+9sR/Far1VtCm814RFNGYZuDqdhZpEyhWAs=; b=X/0n4i6FBRf3x6+HBAaceXF7eMkHPf1+OTlhRD8C6mhDRknSE2mbOUm9yf3qVwra8QUqHX Bg//4AL/blA5u0qWXzpulI4OvjQsi9bsfr4tgFIKlAcciLqIdWLzuq6wH+uaEUZLuJbCZh CQ73QwuZ5ZKDOgTkEQ62aHU7OUqK9hQ= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336019; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=kQ5FP0OW+9sR/Far1VtCm814RFNGYZuDqdhZpEyhWAs=; b=M9Yj96Qaad/jalkSyOUPTpGai0Wu5Zoz+9QE0p2q0NRvbbqfoMaYwMBTX+4oo7TOnYZHzh QoJ3XEiNGJ5benBg== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id 1DD94A3B8F; Thu, 15 Jul 2021 08:00:19 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 62/79] ALSA: es1688: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:59:24 +0200 Message-Id: <20210715075941.23332-63-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in ISA es1688 driver with devres as a clean up. Each manual resource management is converted with the corresponding devres helper. The remove callback became superfluous and dropped. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- include/sound/es1688.h | 1 - sound/isa/es1688/es1688.c | 33 +++++++++------------------------ sound/isa/es1688/es1688_lib.c | 29 +++++++++-------------------- 3 files changed, 18 insertions(+), 45 deletions(-) diff --git a/include/sound/es1688.h b/include/sound/es1688.h index 099569c31fbb..da577bbf9cc7 100644 --- a/include/sound/es1688.h +++ b/include/sound/es1688.h @@ -18,7 +18,6 @@ struct snd_es1688 { unsigned long port; /* port of ESS chip */ - struct resource *res_port; unsigned long mpu_port; /* MPU-401 port of ESS chip */ int irq; /* IRQ number of ESS chip */ int mpu_irq; /* MPU IRQ */ diff --git a/sound/isa/es1688/es1688.c b/sound/isa/es1688/es1688.c index 750d4995634f..f935b56eeec7 100644 --- a/sound/isa/es1688/es1688.c +++ b/sound/isa/es1688/es1688.c @@ -166,36 +166,27 @@ static int snd_es1688_isa_probe(struct device *dev, unsigned int n) struct snd_card *card; int error; - error = snd_card_new(dev, index[n], id[n], THIS_MODULE, - sizeof(struct snd_es1688), &card); + error = snd_devm_card_new(dev, index[n], id[n], THIS_MODULE, + sizeof(struct snd_es1688), &card); if (error < 0) return error; error = snd_es1688_legacy_create(card, dev, n); if (error < 0) - goto out; + return error; error = snd_es1688_probe(card, n); if (error < 0) - goto out; + return error; dev_set_drvdata(dev, card); return 0; -out: - snd_card_free(card); - return error; -} - -static void snd_es1688_isa_remove(struct device *dev, unsigned int n) -{ - snd_card_free(dev_get_drvdata(dev)); } static struct isa_driver snd_es1688_driver = { .match = snd_es1688_match, .probe = snd_es1688_isa_probe, - .remove = snd_es1688_isa_remove, #if 0 /* FIXME */ .suspend = snd_es1688_suspend, .resume = snd_es1688_resume, @@ -249,22 +240,18 @@ static int snd_es968_pnp_detect(struct pnp_card_link *pcard, if (dev == SNDRV_CARDS) return -ENODEV; - error = snd_card_new(&pcard->card->dev, - index[dev], id[dev], THIS_MODULE, - sizeof(struct snd_es1688), &card); + error = snd_devm_card_new(&pcard->card->dev, + index[dev], id[dev], THIS_MODULE, + sizeof(struct snd_es1688), &card); if (error < 0) return error; error = snd_card_es968_pnp(card, dev, pcard, pid); - if (error < 0) { - snd_card_free(card); + if (error < 0) return error; - } error = snd_es1688_probe(card, dev); - if (error < 0) { - snd_card_free(card); + if (error < 0) return error; - } pnp_set_card_drvdata(pcard, card); snd_es968_pnp_is_probed = 1; return 0; @@ -272,8 +259,6 @@ static int snd_es968_pnp_detect(struct pnp_card_link *pcard, static void snd_es968_pnp_remove(struct pnp_card_link *pcard) { - snd_card_free(pnp_get_card_drvdata(pcard)); - pnp_set_card_drvdata(pcard, NULL); snd_es968_pnp_is_probed = 0; } diff --git a/sound/isa/es1688/es1688_lib.c b/sound/isa/es1688/es1688_lib.c index 8554cb2263c1..9cd66b236cef 100644 --- a/sound/isa/es1688/es1688_lib.c +++ b/sound/isa/es1688/es1688_lib.c @@ -580,13 +580,6 @@ static int snd_es1688_free(struct snd_es1688 *chip) { if (chip->hardware != ES1688_HW_UNDEF) snd_es1688_init(chip, 0); - release_and_free_resource(chip->res_port); - if (chip->irq >= 0) - free_irq(chip->irq, (void *) chip); - if (chip->dma8 >= 0) { - disable_dma(chip->dma8); - free_dma(chip->dma8); - } return 0; } @@ -624,26 +617,25 @@ int snd_es1688_create(struct snd_card *card, chip->dma8 = -1; chip->hardware = ES1688_HW_UNDEF; - chip->res_port = request_region(port + 4, 12, "ES1688"); - if (chip->res_port == NULL) { + if (!devm_request_region(card->dev, port + 4, 12, "ES1688")) { snd_printk(KERN_ERR "es1688: can't grab port 0x%lx\n", port + 4); - err = -EBUSY; - goto exit; + return -EBUSY; } - err = request_irq(irq, snd_es1688_interrupt, 0, "ES1688", (void *) chip); + err = devm_request_irq(card->dev, irq, snd_es1688_interrupt, 0, + "ES1688", (void *) chip); if (err < 0) { snd_printk(KERN_ERR "es1688: can't grab IRQ %d\n", irq); - goto exit; + return err; } chip->irq = irq; card->sync_irq = chip->irq; - err = request_dma(dma8, "ES1688"); + err = snd_devm_request_dma(card->dev, dma8, "ES1688"); if (err < 0) { snd_printk(KERN_ERR "es1688: can't grab DMA8 %d\n", dma8); - goto exit; + return err; } chip->dma8 = dma8; @@ -659,17 +651,14 @@ int snd_es1688_create(struct snd_card *card, err = snd_es1688_probe(chip); if (err < 0) - goto exit; + return err; err = snd_es1688_init(chip, 1); if (err < 0) - goto exit; + return err; /* Register device */ err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops); -exit: - if (err) - snd_es1688_free(chip); return err; } From patchwork Thu Jul 15 07:59:25 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379389 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 58F3CC07E96 for ; Thu, 15 Jul 2021 08:29:44 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id DAAEC611C0 for ; Thu, 15 Jul 2021 08:29:43 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org DAAEC611C0 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id 75CAD177C; Thu, 15 Jul 2021 10:28:52 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 75CAD177C DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626337782; bh=8wBY3kR9ayksoY26T6cY/tEuYhEBgN45pciMsEj4K1g=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=ltiETU2/QoLGXpV2Sfl7VoIJQi48zR7gCajfA4u53KSBvHc91bY0hfw2tz74JwbKa EbdpnJgoZNMLCifL8N9XP5RWh87k5VNSTlVmmN91LJnTWLy3fPEhObhjs40kzWG62v ZuB7Fcpnn0++gMvrTswofGvG1xnckj6twFDm0bTk= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id CA8C5F8085D; Thu, 15 Jul 2021 10:01:59 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id EC291F8080C; Thu, 15 Jul 2021 10:01:51 +0200 (CEST) Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id ADB7BF805AF for ; Thu, 15 Jul 2021 10:00:19 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz ADB7BF805AF Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="0iRQdb25"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="yGEP/tpE" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out1.suse.de (Postfix) with ESMTP id 85EA822833 for ; Thu, 15 Jul 2021 08:00:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336019; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=uHFhxAgjrhLYApqQjhNVcHFXdRgRQ7KpN2whoRT+Qe0=; b=0iRQdb257FNnW0m3hnvFGoZCsj5wROqNU93aaz7gbafN4e0LF9Vnznq3ug7K4IQNOXnxID 2pLQoGaI9f+IpGt2LyLA1V2xxXCVkhE6NsN84dEgP81sLsiuHuqlOtuBppONUZgAm1l/rE V2C0SnNA/djun+VGKhyfhA0vHEot2/g= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336019; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=uHFhxAgjrhLYApqQjhNVcHFXdRgRQ7KpN2whoRT+Qe0=; b=yGEP/tpEb2XZzpCBZZUhvFboqc1PdGWhx6levioAMuydZ5D/KyqrJ3ZYJl930pJE3oeE7e mazEMv/SNb8eJcBQ== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id 73B90A3B8F; Thu, 15 Jul 2021 08:00:19 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 63/79] ALSA: es18xx: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:59:25 +0200 Message-Id: <20210715075941.23332-64-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in ISA es18xx driver with devres as a clean up. Each manual resource management is converted with the corresponding devres helper. The remove callback became superfluous and dropped. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- sound/isa/es18xx.c | 112 ++++++++------------------------------------- 1 file changed, 20 insertions(+), 92 deletions(-) diff --git a/sound/isa/es18xx.c b/sound/isa/es18xx.c index 68b9c59e1127..3fcd168480b6 100644 --- a/sound/isa/es18xx.c +++ b/sound/isa/es18xx.c @@ -87,9 +87,6 @@ struct snd_es18xx { unsigned long port; /* port of ESS chip */ unsigned long ctrl_port; /* Control port of ESS chip */ - struct resource *res_port; - struct resource *res_mpu_port; - struct resource *res_ctrl_port; int irq; /* IRQ number of ESS chip */ int dma1; /* DMA1 */ int dma2; /* DMA2 */ @@ -1531,7 +1528,7 @@ static int snd_es18xx_initialize(struct snd_es18xx *chip, return 0; } -static int snd_es18xx_identify(struct snd_es18xx *chip) +static int snd_es18xx_identify(struct snd_card *card, struct snd_es18xx *chip) { int hi,lo; @@ -1573,8 +1570,8 @@ static int snd_es18xx_identify(struct snd_es18xx *chip) udelay(10); chip->ctrl_port += inb(chip->port + 0x05); - chip->res_ctrl_port = request_region(chip->ctrl_port, 8, "ES18xx - CTRL"); - if (!chip->res_ctrl_port) { + if (!devm_request_region(card->dev, chip->ctrl_port, 8, + "ES18xx - CTRL")) { snd_printk(KERN_ERR PFX "unable go grab port 0x%lx\n", chip->ctrl_port); return -EBUSY; } @@ -1601,11 +1598,12 @@ static int snd_es18xx_identify(struct snd_es18xx *chip) return 0; } -static int snd_es18xx_probe(struct snd_es18xx *chip, +static int snd_es18xx_probe(struct snd_card *card, + struct snd_es18xx *chip, unsigned long mpu_port, unsigned long fm_port) { - if (snd_es18xx_identify(chip) < 0) { + if (snd_es18xx_identify(card, chip) < 0) { snd_printk(KERN_ERR PFX "[0x%lx] ESS chip not found\n", chip->port); return -ENODEV; } @@ -1722,31 +1720,6 @@ static int snd_es18xx_resume(struct snd_card *card) } #endif /* CONFIG_PM */ -static int snd_es18xx_free(struct snd_card *card) -{ - struct snd_es18xx *chip = card->private_data; - - release_and_free_resource(chip->res_port); - release_and_free_resource(chip->res_ctrl_port); - release_and_free_resource(chip->res_mpu_port); - if (chip->irq >= 0) - free_irq(chip->irq, (void *) card); - if (chip->dma1 >= 0) { - disable_dma(chip->dma1); - free_dma(chip->dma1); - } - if (chip->dma2 >= 0 && chip->dma1 != chip->dma2) { - disable_dma(chip->dma2); - free_dma(chip->dma2); - } - return 0; -} - -static int snd_es18xx_dev_free(struct snd_device *device) -{ - return snd_es18xx_free(device->card); -} - static int snd_es18xx_new_device(struct snd_card *card, unsigned long port, unsigned long mpu_port, @@ -1754,10 +1727,6 @@ static int snd_es18xx_new_device(struct snd_card *card, int irq, int dma1, int dma2) { struct snd_es18xx *chip = card->private_data; - static const struct snd_device_ops ops = { - .dev_free = snd_es18xx_dev_free, - }; - int err; spin_lock_init(&chip->reg_lock); spin_lock_init(&chip->mixer_lock); @@ -1768,45 +1737,34 @@ static int snd_es18xx_new_device(struct snd_card *card, chip->audio2_vol = 0x00; chip->active = 0; - chip->res_port = request_region(port, 16, "ES18xx"); - if (chip->res_port == NULL) { - snd_es18xx_free(card); + if (!devm_request_region(card->dev, port, 16, "ES18xx")) { snd_printk(KERN_ERR PFX "unable to grap ports 0x%lx-0x%lx\n", port, port + 16 - 1); return -EBUSY; } - if (request_irq(irq, snd_es18xx_interrupt, 0, "ES18xx", - (void *) card)) { - snd_es18xx_free(card); + if (devm_request_irq(card->dev, irq, snd_es18xx_interrupt, 0, "ES18xx", + (void *) card)) { snd_printk(KERN_ERR PFX "unable to grap IRQ %d\n", irq); return -EBUSY; } chip->irq = irq; card->sync_irq = chip->irq; - if (request_dma(dma1, "ES18xx DMA 1")) { - snd_es18xx_free(card); + if (snd_devm_request_dma(card->dev, dma1, "ES18xx DMA 1")) { snd_printk(KERN_ERR PFX "unable to grap DMA1 %d\n", dma1); return -EBUSY; } chip->dma1 = dma1; - if (dma2 != dma1 && request_dma(dma2, "ES18xx DMA 2")) { - snd_es18xx_free(card); + if (dma2 != dma1 && + snd_devm_request_dma(card->dev, dma2, "ES18xx DMA 2")) { snd_printk(KERN_ERR PFX "unable to grap DMA2 %d\n", dma2); return -EBUSY; } chip->dma2 = dma2; - if (snd_es18xx_probe(chip, mpu_port, fm_port) < 0) { - snd_es18xx_free(card); + if (snd_es18xx_probe(card, chip, mpu_port, fm_port) < 0) return -ENODEV; - } - err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops); - if (err < 0) { - snd_es18xx_free(card); - return err; - } return 0; } @@ -2088,8 +2046,8 @@ static int snd_audiodrive_pnpc(int dev, struct snd_es18xx *chip, static int snd_es18xx_card_new(struct device *pdev, int dev, struct snd_card **cardp) { - return snd_card_new(pdev, index[dev], id[dev], THIS_MODULE, - sizeof(struct snd_es18xx), cardp); + return snd_devm_card_new(pdev, index[dev], id[dev], THIS_MODULE, + sizeof(struct snd_es18xx), cardp); } static int snd_audiodrive_probe(struct snd_card *card, int dev) @@ -2164,10 +2122,8 @@ static int snd_es18xx_isa_probe1(int dev, struct device *devptr) if (err < 0) return err; err = snd_audiodrive_probe(card, dev); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } dev_set_drvdata(devptr, card); return 0; } @@ -2215,12 +2171,6 @@ static int snd_es18xx_isa_probe(struct device *pdev, unsigned int dev) } } -static void snd_es18xx_isa_remove(struct device *devptr, - unsigned int dev) -{ - snd_card_free(dev_get_drvdata(devptr)); -} - #ifdef CONFIG_PM static int snd_es18xx_isa_suspend(struct device *dev, unsigned int n, pm_message_t state) @@ -2239,7 +2189,6 @@ static int snd_es18xx_isa_resume(struct device *dev, unsigned int n) static struct isa_driver snd_es18xx_isa_driver = { .match = snd_es18xx_isa_match, .probe = snd_es18xx_isa_probe, - .remove = snd_es18xx_isa_remove, #ifdef CONFIG_PM .suspend = snd_es18xx_isa_suspend, .resume = snd_es18xx_isa_resume, @@ -2271,25 +2220,16 @@ static int snd_audiodrive_pnp_detect(struct pnp_dev *pdev, if (err < 0) return err; err = snd_audiodrive_pnp(dev, card->private_data, pdev); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } err = snd_audiodrive_probe(card, dev); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } pnp_set_drvdata(pdev, card); dev++; return 0; } -static void snd_audiodrive_pnp_remove(struct pnp_dev *pdev) -{ - snd_card_free(pnp_get_drvdata(pdev)); -} - #ifdef CONFIG_PM static int snd_audiodrive_pnp_suspend(struct pnp_dev *pdev, pm_message_t state) { @@ -2305,7 +2245,6 @@ static struct pnp_driver es18xx_pnp_driver = { .name = "es18xx-pnpbios", .id_table = snd_audiodrive_pnpbiosids, .probe = snd_audiodrive_pnp_detect, - .remove = snd_audiodrive_pnp_remove, #ifdef CONFIG_PM .suspend = snd_audiodrive_pnp_suspend, .resume = snd_audiodrive_pnp_resume, @@ -2331,27 +2270,17 @@ static int snd_audiodrive_pnpc_detect(struct pnp_card_link *pcard, return res; res = snd_audiodrive_pnpc(dev, card->private_data, pcard, pid); - if (res < 0) { - snd_card_free(card); + if (res < 0) return res; - } res = snd_audiodrive_probe(card, dev); - if (res < 0) { - snd_card_free(card); + if (res < 0) return res; - } pnp_set_card_drvdata(pcard, card); dev++; return 0; } -static void snd_audiodrive_pnpc_remove(struct pnp_card_link *pcard) -{ - snd_card_free(pnp_get_card_drvdata(pcard)); - pnp_set_card_drvdata(pcard, NULL); -} - #ifdef CONFIG_PM static int snd_audiodrive_pnpc_suspend(struct pnp_card_link *pcard, pm_message_t state) { @@ -2370,7 +2299,6 @@ static struct pnp_card_driver es18xx_pnpc_driver = { .name = "es18xx", .id_table = snd_audiodrive_pnpids, .probe = snd_audiodrive_pnpc_detect, - .remove = snd_audiodrive_pnpc_remove, #ifdef CONFIG_PM .suspend = snd_audiodrive_pnpc_suspend, .resume = snd_audiodrive_pnpc_resume, From patchwork Thu Jul 15 07:59:26 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379347 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 113B3C07E96 for ; Thu, 15 Jul 2021 08:25:36 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 8D6266120A for ; Thu, 15 Jul 2021 08:25:35 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 8D6266120A Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id 17872176B; Thu, 15 Jul 2021 10:24:44 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 17872176B DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626337534; bh=N8bGt2d3GmBzaRdIFOFNRfQhAupN8fTw0uXA3r95Wn0=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=Zucw4hjujpmByTpgOl7JqUS0ASqQuEPsAr1HV2JAFh2OpQ8LzkuYtA97pIWwG41u2 l4HDJyMkt4DTZxdGOnWSagSzI3+rdnJ9sQrZgA5Kg/NRTDk5R+l7ZMKFHiD4+341t8 xP9sGM8lKHwDew506aE1OFrL+vwtKXA2MGXu/I8Q= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id 21584F807A2; Thu, 15 Jul 2021 10:01:44 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id 9755DF80579; Thu, 15 Jul 2021 10:01:35 +0200 (CEST) Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 13628F80579 for ; Thu, 15 Jul 2021 10:00:20 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 13628F80579 Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="uRpBKLnb"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="7CdWeLc7" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out2.suse.de (Postfix) with ESMTP id DC6481FDEA for ; Thu, 15 Jul 2021 08:00:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336019; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=AiZ0EA9mT23ir39teMSDmM++T966FtiEpWucGxOKKb0=; b=uRpBKLnbY0BAQbym1KD2B0RiS1wK9JqbXbkBErvqf+Dc+64EMI4shlYMPPU8bfy7WR7YeD SYsJ/9Sd26IGMHle+8kScR/uTeWPIAFqtezIT+lkahkhoNUJb8IFKx/fBMj4WWcGfqeFZf LMfAzBMzWWFacn43i2pMRAx9wdUqJdE= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336019; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=AiZ0EA9mT23ir39teMSDmM++T966FtiEpWucGxOKKb0=; b=7CdWeLc7A8gaHjNiWjBX4AAtt6WtM5+97DITnrOxUSJmTt8KujmOiaGHm8hUMugC0Qv+Fn yVPXcAhzfPuKSuDw== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id D5BF1A3B8F; Thu, 15 Jul 2021 08:00:19 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 64/79] ALSA: galaxy: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:59:26 +0200 Message-Id: <20210715075941.23332-65-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in ISA galaxy drivers with devres as a clean up. Each manual resource management is converted with the corresponding devres helper. The remove callback became superfluous and dropped. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- sound/isa/galaxy/galaxy.c | 82 ++++++++++++++++----------------------- 1 file changed, 33 insertions(+), 49 deletions(-) diff --git a/sound/isa/galaxy/galaxy.c b/sound/isa/galaxy/galaxy.c index d33d69f29924..ea001c80149d 100644 --- a/sound/isa/galaxy/galaxy.c +++ b/sound/isa/galaxy/galaxy.c @@ -472,20 +472,10 @@ static void snd_galaxy_free(struct snd_card *card) { struct snd_galaxy *galaxy = card->private_data; - if (galaxy->wss_port) { + if (galaxy->wss_port) wss_set_config(galaxy->wss_port, 0); - ioport_unmap(galaxy->wss_port); - release_and_free_resource(galaxy->res_wss_port); - } - if (galaxy->config_port) { + if (galaxy->config_port) galaxy_set_config(galaxy, galaxy->config); - ioport_unmap(galaxy->config_port); - release_and_free_resource(galaxy->res_config_port); - } - if (galaxy->port) { - ioport_unmap(galaxy->port); - release_and_free_resource(galaxy->res_port); - } } static int snd_galaxy_probe(struct device *dev, unsigned int n) @@ -496,56 +486,60 @@ static int snd_galaxy_probe(struct device *dev, unsigned int n) u8 type; int err; - err = snd_card_new(dev, index[n], id[n], THIS_MODULE, - sizeof(*galaxy), &card); + err = snd_devm_card_new(dev, index[n], id[n], THIS_MODULE, + sizeof(*galaxy), &card); if (err < 0) return err; card->private_free = snd_galaxy_free; galaxy = card->private_data; - galaxy->res_port = request_region(port[n], 16, DRV_NAME); + galaxy->res_port = devm_request_region(dev, port[n], 16, DRV_NAME); if (!galaxy->res_port) { dev_err(dev, "could not grab ports %#lx-%#lx\n", port[n], port[n] + 15); - err = -EBUSY; - goto error; + return -EBUSY; } - galaxy->port = ioport_map(port[n], 16); + galaxy->port = devm_ioport_map(dev, port[n], 16); + if (!galaxy->port) + return -ENOMEM; err = galaxy_init(galaxy, &type); if (err < 0) { dev_err(dev, "did not find a Sound Galaxy at %#lx\n", port[n]); - goto error; + return err; } dev_info(dev, "Sound Galaxy (type %d) found at %#lx\n", type, port[n]); - galaxy->res_config_port = request_region(port[n] + GALAXY_PORT_CONFIG, - 16, DRV_NAME); + galaxy->res_config_port = + devm_request_region(dev, port[n] + GALAXY_PORT_CONFIG, 16, + DRV_NAME); if (!galaxy->res_config_port) { dev_err(dev, "could not grab ports %#lx-%#lx\n", port[n] + GALAXY_PORT_CONFIG, port[n] + GALAXY_PORT_CONFIG + 15); - err = -EBUSY; - goto error; + return -EBUSY; } - galaxy->config_port = ioport_map(port[n] + GALAXY_PORT_CONFIG, 16); - + galaxy->config_port = + devm_ioport_map(dev, port[n] + GALAXY_PORT_CONFIG, 16); + if (!galaxy->config_port) + return -ENOMEM; galaxy_config(galaxy, config[n]); - galaxy->res_wss_port = request_region(wss_port[n], 4, DRV_NAME); + galaxy->res_wss_port = devm_request_region(dev, wss_port[n], 4, DRV_NAME); if (!galaxy->res_wss_port) { dev_err(dev, "could not grab ports %#lx-%#lx\n", wss_port[n], wss_port[n] + 3); - err = -EBUSY; - goto error; + return -EBUSY; } - galaxy->wss_port = ioport_map(wss_port[n], 4); + galaxy->wss_port = devm_ioport_map(dev, wss_port[n], 4); + if (!galaxy->wss_port) + return -ENOMEM; err = galaxy_wss_config(galaxy, wss_config[n]); if (err < 0) { dev_err(dev, "could not configure WSS\n"); - goto error; + return err; } strcpy(card->driver, DRV_NAME); @@ -557,25 +551,25 @@ static int snd_galaxy_probe(struct device *dev, unsigned int n) err = snd_wss_create(card, wss_port[n] + 4, -1, irq[n], dma1[n], dma2[n], WSS_HW_DETECT, 0, &chip); if (err < 0) - goto error; + return err; err = snd_wss_pcm(chip, 0); if (err < 0) - goto error; + return err; err = snd_wss_mixer(chip); if (err < 0) - goto error; + return err; err = snd_wss_timer(chip, 0); if (err < 0) - goto error; + return err; if (mpu_port[n] >= 0) { err = snd_mpu401_uart_new(card, 0, MPU401_HW_MPU401, mpu_port[n], 0, mpu_irq[n], NULL); if (err < 0) - goto error; + return err; } if (fm_port[n] >= 0) { @@ -585,38 +579,28 @@ static int snd_galaxy_probe(struct device *dev, unsigned int n) OPL3_HW_AUTO, 0, &opl3); if (err < 0) { dev_err(dev, "no OPL device at %#lx\n", fm_port[n]); - goto error; + return err; } err = snd_opl3_timer_new(opl3, 1, 2); if (err < 0) - goto error; + return err; err = snd_opl3_hwdep_new(opl3, 0, 1, NULL); if (err < 0) - goto error; + return err; } err = snd_card_register(card); if (err < 0) - goto error; + return err; dev_set_drvdata(dev, card); return 0; - -error: - snd_card_free(card); - return err; -} - -static void snd_galaxy_remove(struct device *dev, unsigned int n) -{ - snd_card_free(dev_get_drvdata(dev)); } static struct isa_driver snd_galaxy_driver = { .match = snd_galaxy_match, .probe = snd_galaxy_probe, - .remove = snd_galaxy_remove, .driver = { .name = DEV_NAME From patchwork Thu Jul 15 07:59:27 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379351 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id E0CBDC07E96 for ; Thu, 15 Jul 2021 08:26:17 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 61D87611C0 for ; Thu, 15 Jul 2021 08:26:17 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 61D87611C0 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id ED1621771; Thu, 15 Jul 2021 10:25:25 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz ED1621771 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626337576; bh=Lx30rYwIObscHN8jf5Fjf43epa2gCSnbL4l6v5Y2Jd8=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=iKNdZa0Cf9svGpM73jq1gpvVFBSRw4ynip0MMYr1SvANdh/yt/B9gTdVSZN7MNiVo Px1DbAAKxpNSdTZ/dsNd0rCz/FgT3oC4ngP2OlZG7Xm16fsKglt58T8Sx07xBjoYhp V1A49vi883c/ChbY6M0uJ/WFVxVvrPPoWKHCF050= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id D9D10F807D2; Thu, 15 Jul 2021 10:01:45 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id 4043BF8076F; Thu, 15 Jul 2021 10:01:38 +0200 (CEST) Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 7E6A8F8057C for ; Thu, 15 Jul 2021 10:00:20 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 7E6A8F8057C Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="n8dXMz2K"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="r2rvv/g4" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out2.suse.de (Postfix) with ESMTP id 581891FD3E for ; Thu, 15 Jul 2021 08:00:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336020; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=z04MrU5rFTVug6o6faGGGCcZdn5UkaMXkEgXi4wxA2Q=; b=n8dXMz2KfkLzx2T1+voktRj3evJG7TdhE11hljphU1Bt7Sv3XiqjA+Ed1edRkKLWuACWt2 S/c5LZ6jLVr9CSkQSnPV9JgLS9fa9PBYk0mmMJ3o0Xbju5xWdT7sGCN8Japelocl0KgZ9x 0ycSC4aSLCETppGI6D+DO4ZInm+Eahs= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336020; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=z04MrU5rFTVug6o6faGGGCcZdn5UkaMXkEgXi4wxA2Q=; b=r2rvv/g4jZOCGLegGlEienzLr16AZIR1qhOPrRU7D6/RHjnKhl5y2OC5YSEZ/iyR0UtYZy y6+QQhpMoljFGnCA== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id 438DDA3B8F; Thu, 15 Jul 2021 08:00:20 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 65/79] ALSA: gus: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:59:27 +0200 Message-Id: <20210715075941.23332-66-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in ISA gus drivers with devres as a clean up. Each manual resource management is converted with the corresponding devres helper. The remove callback became superfluous and dropped. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- sound/isa/gus/gus_main.c | 44 ++++++++------------------ sound/isa/gus/gusclassic.c | 28 ++++++---------- sound/isa/gus/gusextreme.c | 39 +++++++++-------------- sound/isa/gus/gusmax.c | 65 ++++++++++++-------------------------- sound/isa/gus/interwave.c | 53 +++++++------------------------ 5 files changed, 68 insertions(+), 161 deletions(-) diff --git a/sound/isa/gus/gus_main.c b/sound/isa/gus/gus_main.c index 3b46490271fe..ae1e2542ee4a 100644 --- a/sound/isa/gus/gus_main.c +++ b/sound/isa/gus/gus_main.c @@ -87,24 +87,10 @@ static void snd_gus_init_control(struct snd_gus_card *gus) static int snd_gus_free(struct snd_gus_card *gus) { - if (gus->gf1.res_port2 == NULL) - goto __hw_end; - snd_gf1_stop(gus); - snd_gus_init_dma_irq(gus, 0); - __hw_end: - release_and_free_resource(gus->gf1.res_port1); - release_and_free_resource(gus->gf1.res_port2); - if (gus->gf1.irq >= 0) - free_irq(gus->gf1.irq, (void *) gus); - if (gus->gf1.dma1 >= 0) { - disable_dma(gus->gf1.dma1); - free_dma(gus->gf1.dma1); + if (gus->gf1.res_port2) { + snd_gf1_stop(gus); + snd_gus_init_dma_irq(gus, 0); } - if (!gus->equal_dma && gus->gf1.dma2 >= 0) { - disable_dma(gus->gf1.dma2); - free_dma(gus->gf1.dma2); - } - kfree(gus); return 0; } @@ -130,7 +116,7 @@ int snd_gus_create(struct snd_card *card, }; *rgus = NULL; - gus = kzalloc(sizeof(*gus), GFP_KERNEL); + gus = devm_kzalloc(card->dev, sizeof(*gus), GFP_KERNEL); if (gus == NULL) return -ENOMEM; spin_lock_init(&gus->reg_lock); @@ -156,35 +142,33 @@ int snd_gus_create(struct snd_card *card, gus->gf1.reg_timerctrl = GUSP(gus, TIMERCNTRL); gus->gf1.reg_timerdata = GUSP(gus, TIMERDATA); /* allocate resources */ - gus->gf1.res_port1 = request_region(port, 16, "GUS GF1 (Adlib/SB)"); + gus->gf1.res_port1 = devm_request_region(card->dev, port, 16, + "GUS GF1 (Adlib/SB)"); if (!gus->gf1.res_port1) { snd_printk(KERN_ERR "gus: can't grab SB port 0x%lx\n", port); - snd_gus_free(gus); return -EBUSY; } - gus->gf1.res_port2 = request_region(port + 0x100, 12, "GUS GF1 (Synth)"); + gus->gf1.res_port2 = devm_request_region(card->dev, port + 0x100, 12, + "GUS GF1 (Synth)"); if (!gus->gf1.res_port2) { snd_printk(KERN_ERR "gus: can't grab synth port 0x%lx\n", port + 0x100); - snd_gus_free(gus); return -EBUSY; } - if (irq >= 0 && request_irq(irq, snd_gus_interrupt, 0, "GUS GF1", (void *) gus)) { + if (irq >= 0 && devm_request_irq(card->dev, irq, snd_gus_interrupt, 0, + "GUS GF1", (void *) gus)) { snd_printk(KERN_ERR "gus: can't grab irq %d\n", irq); - snd_gus_free(gus); return -EBUSY; } gus->gf1.irq = irq; card->sync_irq = irq; - if (request_dma(dma1, "GUS - 1")) { + if (snd_devm_request_dma(card->dev, dma1, "GUS - 1")) { snd_printk(KERN_ERR "gus: can't grab DMA1 %d\n", dma1); - snd_gus_free(gus); return -EBUSY; } gus->gf1.dma1 = dma1; if (dma2 >= 0 && dma1 != dma2) { - if (request_dma(dma2, "GUS - 2")) { + if (snd_devm_request_dma(card->dev, dma2, "GUS - 2")) { snd_printk(KERN_ERR "gus: can't grab DMA2 %d\n", dma2); - snd_gus_free(gus); return -EBUSY; } gus->gf1.dma2 = dma2; @@ -209,10 +193,8 @@ int snd_gus_create(struct snd_card *card, gus->gf1.volume_ramp = 25; gus->gf1.smooth_pan = 1; err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, gus, &ops); - if (err < 0) { - snd_gus_free(gus); + if (err < 0) return err; - } *rgus = gus; return 0; } diff --git a/sound/isa/gus/gusclassic.c b/sound/isa/gus/gusclassic.c index bca1caa4968c..09cc53ceea2a 100644 --- a/sound/isa/gus/gusclassic.c +++ b/sound/isa/gus/gusclassic.c @@ -135,7 +135,7 @@ static int snd_gusclassic_probe(struct device *dev, unsigned int n) struct snd_gus_card *gus; int error; - error = snd_card_new(dev, index[n], id[n], THIS_MODULE, 0, &card); + error = snd_devm_card_new(dev, index[n], id[n], THIS_MODULE, 0, &card); if (error < 0) return error; @@ -144,37 +144,37 @@ static int snd_gusclassic_probe(struct device *dev, unsigned int n) error = snd_gusclassic_create(card, dev, n, &gus); if (error < 0) - goto out; + return error; error = snd_gusclassic_detect(gus); if (error < 0) - goto out; + return error; gus->joystick_dac = joystick_dac[n]; error = snd_gus_initialize(gus); if (error < 0) - goto out; + return error; error = -ENODEV; if (gus->max_flag || gus->ess_flag) { dev_err(dev, "GUS Classic or ACE soundcard was " "not detected at 0x%lx\n", gus->gf1.port); - goto out; + return error; } error = snd_gf1_new_mixer(gus); if (error < 0) - goto out; + return error; error = snd_gf1_pcm_new(gus, 0, 0); if (error < 0) - goto out; + return error; if (!gus->ace_flag) { error = snd_gf1_rawmidi_new(gus, 0); if (error < 0) - goto out; + return error; } sprintf(card->longname + strlen(card->longname), @@ -187,27 +187,17 @@ static int snd_gusclassic_probe(struct device *dev, unsigned int n) error = snd_card_register(card); if (error < 0) - goto out; + return error; dev_set_drvdata(dev, card); return 0; - -out: snd_card_free(card); - return error; -} - -static void snd_gusclassic_remove(struct device *dev, unsigned int n) -{ - snd_card_free(dev_get_drvdata(dev)); } static struct isa_driver snd_gusclassic_driver = { .match = snd_gusclassic_match, .probe = snd_gusclassic_probe, - .remove = snd_gusclassic_remove, #if 0 /* FIXME */ .suspend = snd_gusclassic_suspend, - .remove = snd_gusclassic_remove, #endif .driver = { .name = DEV_NAME diff --git a/sound/isa/gus/gusextreme.c b/sound/isa/gus/gusextreme.c index a409a4a29afc..63d9f2d75df0 100644 --- a/sound/isa/gus/gusextreme.c +++ b/sound/isa/gus/gusextreme.c @@ -228,8 +228,8 @@ static int snd_gusextreme_probe(struct device *dev, unsigned int n) struct snd_opl3 *opl3; int error; - error = snd_card_new(dev, index[n], id[n], THIS_MODULE, - sizeof(struct snd_es1688), &card); + error = snd_devm_card_new(dev, index[n], id[n], THIS_MODULE, + sizeof(struct snd_es1688), &card); if (error < 0) return error; @@ -243,56 +243,56 @@ static int snd_gusextreme_probe(struct device *dev, unsigned int n) error = snd_gusextreme_es1688_create(card, es1688, dev, n); if (error < 0) - goto out; + return error; if (gf1_port[n] < 0) gf1_port[n] = es1688->port + 0x20; error = snd_gusextreme_gus_card_create(card, dev, n, &gus); if (error < 0) - goto out; + return error; error = snd_gusextreme_detect(gus, es1688); if (error < 0) - goto out; + return error; gus->joystick_dac = joystick_dac[n]; error = snd_gus_initialize(gus); if (error < 0) - goto out; + return error; error = -ENODEV; if (!gus->ess_flag) { dev_err(dev, "GUS Extreme soundcard was not " "detected at 0x%lx\n", gus->gf1.port); - goto out; + return error; } gus->codec_flag = 1; error = snd_es1688_pcm(card, es1688, 0); if (error < 0) - goto out; + return error; error = snd_es1688_mixer(card, es1688); if (error < 0) - goto out; + return error; snd_component_add(card, "ES1688"); if (pcm_channels[n] > 0) { error = snd_gf1_pcm_new(gus, 1, 1); if (error < 0) - goto out; + return error; } error = snd_gf1_new_mixer(gus); if (error < 0) - goto out; + return error; error = snd_gusextreme_mixer(card); if (error < 0) - goto out; + return error; if (snd_opl3_create(card, es1688->port, es1688->port + 2, OPL3_HW_OPL3, 0, &opl3) < 0) @@ -300,14 +300,14 @@ static int snd_gusextreme_probe(struct device *dev, unsigned int n) else { error = snd_opl3_hwdep_new(opl3, 0, 2, NULL); if (error < 0) - goto out; + return error; } if (es1688->mpu_port >= 0x300) { error = snd_mpu401_uart_new(card, 0, MPU401_HW_ES1688, es1688->mpu_port, 0, mpu_irq[n], NULL); if (error < 0) - goto out; + return error; } sprintf(card->longname, "Gravis UltraSound Extreme at 0x%lx, " @@ -316,24 +316,15 @@ static int snd_gusextreme_probe(struct device *dev, unsigned int n) error = snd_card_register(card); if (error < 0) - goto out; + return error; dev_set_drvdata(dev, card); return 0; - -out: snd_card_free(card); - return error; -} - -static void snd_gusextreme_remove(struct device *dev, unsigned int n) -{ - snd_card_free(dev_get_drvdata(dev)); } static struct isa_driver snd_gusextreme_driver = { .match = snd_gusextreme_match, .probe = snd_gusextreme_probe, - .remove = snd_gusextreme_remove, #if 0 /* FIXME */ .suspend = snd_gusextreme_suspend, .resume = snd_gusextreme_resume, diff --git a/sound/isa/gus/gusmax.c b/sound/isa/gus/gusmax.c index ad118d462142..6834c0560064 100644 --- a/sound/isa/gus/gusmax.c +++ b/sound/isa/gus/gusmax.c @@ -179,16 +179,6 @@ static int snd_gusmax_mixer(struct snd_wss *chip) return 0; } -static void snd_gusmax_free(struct snd_card *card) -{ - struct snd_gusmax *maxcard = card->private_data; - - if (maxcard == NULL) - return; - if (maxcard->irq >= 0) - free_irq(maxcard->irq, (void *)maxcard); -} - static int snd_gusmax_match(struct device *pdev, unsigned int dev) { return enable[dev]; @@ -204,11 +194,10 @@ static int snd_gusmax_probe(struct device *pdev, unsigned int dev) struct snd_wss *wss; struct snd_gusmax *maxcard; - err = snd_card_new(pdev, index[dev], id[dev], THIS_MODULE, - sizeof(struct snd_gusmax), &card); + err = snd_devm_card_new(pdev, index[dev], id[dev], THIS_MODULE, + sizeof(struct snd_gusmax), &card); if (err < 0) return err; - card->private_free = snd_gusmax_free; maxcard = card->private_data; maxcard->card = card; maxcard->irq = -1; @@ -218,8 +207,7 @@ static int snd_gusmax_probe(struct device *pdev, unsigned int dev) xirq = snd_legacy_find_free_irq(possible_irqs); if (xirq < 0) { snd_printk(KERN_ERR PFX "unable to find a free IRQ\n"); - err = -EBUSY; - goto _err; + return -EBUSY; } } xdma1 = dma1[dev]; @@ -227,8 +215,7 @@ static int snd_gusmax_probe(struct device *pdev, unsigned int dev) xdma1 = snd_legacy_find_free_dma(possible_dmas); if (xdma1 < 0) { snd_printk(KERN_ERR PFX "unable to find a free DMA1\n"); - err = -EBUSY; - goto _err; + return -EBUSY; } } xdma2 = dma2[dev]; @@ -236,8 +223,7 @@ static int snd_gusmax_probe(struct device *pdev, unsigned int dev) xdma2 = snd_legacy_find_free_dma(possible_dmas); if (xdma2 < 0) { snd_printk(KERN_ERR PFX "unable to find a free DMA2\n"); - err = -EBUSY; - goto _err; + return -EBUSY; } } @@ -267,29 +253,28 @@ static int snd_gusmax_probe(struct device *pdev, unsigned int dev) } } if (err < 0) - goto _err; + return err; err = snd_gusmax_detect(gus); if (err < 0) - goto _err; + return err; maxcard->gus_status_reg = gus->gf1.reg_irqstat; maxcard->pcm_status_reg = gus->gf1.port + 0x10c + 2; snd_gusmax_init(dev, card, gus); err = snd_gus_initialize(gus); if (err < 0) - goto _err; + return err; if (!gus->max_flag) { snd_printk(KERN_ERR PFX "GUS MAX soundcard was not detected at 0x%lx\n", gus->gf1.port); - err = -ENODEV; - goto _err; + return -ENODEV; } - if (request_irq(xirq, snd_gusmax_interrupt, 0, "GUS MAX", (void *)maxcard)) { + if (devm_request_irq(card->dev, xirq, snd_gusmax_interrupt, 0, + "GUS MAX", (void *)maxcard)) { snd_printk(KERN_ERR PFX "unable to grab IRQ %d\n", xirq); - err = -EBUSY; - goto _err; + return -EBUSY; } maxcard->irq = xirq; card->sync_irq = maxcard->irq; @@ -303,32 +288,32 @@ static int snd_gusmax_probe(struct device *pdev, unsigned int dev) WSS_HWSHARE_DMA2, &wss); if (err < 0) - goto _err; + return err; err = snd_wss_pcm(wss, 0); if (err < 0) - goto _err; + return err; err = snd_wss_mixer(wss); if (err < 0) - goto _err; + return err; err = snd_wss_timer(wss, 2); if (err < 0) - goto _err; + return err; if (pcm_channels[dev] > 0) { err = snd_gf1_pcm_new(gus, 1, 1); if (err < 0) - goto _err; + return err; } err = snd_gusmax_mixer(wss); if (err < 0) - goto _err; + return err; err = snd_gf1_rawmidi_new(gus, 0); if (err < 0) - goto _err; + return err; sprintf(card->longname + strlen(card->longname), " at 0x%lx, irq %i, dma %i", gus->gf1.port, xirq, xdma1); if (xdma2 >= 0) @@ -336,22 +321,13 @@ static int snd_gusmax_probe(struct device *pdev, unsigned int dev) err = snd_card_register(card); if (err < 0) - goto _err; + return err; maxcard->gus = gus; maxcard->wss = wss; dev_set_drvdata(pdev, card); return 0; - - _err: - snd_card_free(card); - return err; -} - -static void snd_gusmax_remove(struct device *devptr, unsigned int dev) -{ - snd_card_free(dev_get_drvdata(devptr)); } #define DEV_NAME "gusmax" @@ -359,7 +335,6 @@ static void snd_gusmax_remove(struct device *devptr, unsigned int dev) static struct isa_driver snd_gusmax_driver = { .match = snd_gusmax_match, .probe = snd_gusmax_probe, - .remove = snd_gusmax_remove, /* FIXME: suspend/resume */ .driver = { .name = DEV_NAME diff --git a/sound/isa/gus/interwave.c b/sound/isa/gus/interwave.c index 755de47d0bb6..20f490e9d563 100644 --- a/sound/isa/gus/interwave.c +++ b/sound/isa/gus/interwave.c @@ -204,13 +204,15 @@ static int snd_interwave_detect_stb(struct snd_interwave *iwcard, port = 0x360; } while (port <= 0x380) { - iwcard->i2c_res = request_region(port, 1, "InterWave (I2C bus)"); + iwcard->i2c_res = devm_request_region(card->dev, port, 1, + "InterWave (I2C bus)"); if (iwcard->i2c_res) break; port += 0x10; } } else { - iwcard->i2c_res = request_region(port, 1, "InterWave (I2C bus)"); + iwcard->i2c_res = devm_request_region(card->dev, port, 1, + "InterWave (I2C bus)"); } if (iwcard->i2c_res == NULL) { snd_printk(KERN_ERR "interwave: can't grab i2c bus port\n"); @@ -598,19 +600,6 @@ static int snd_interwave_pnp(int dev, struct snd_interwave *iwcard, } #endif /* CONFIG_PNP */ -static void snd_interwave_free(struct snd_card *card) -{ - struct snd_interwave *iwcard = card->private_data; - - if (iwcard == NULL) - return; -#ifdef SNDRV_STB - release_and_free_resource(iwcard->i2c_res); -#endif - if (iwcard->irq >= 0) - free_irq(iwcard->irq, (void *)iwcard); -} - static int snd_interwave_card_new(struct device *pdev, int dev, struct snd_card **cardp) { @@ -618,14 +607,13 @@ static int snd_interwave_card_new(struct device *pdev, int dev, struct snd_interwave *iwcard; int err; - err = snd_card_new(pdev, index[dev], id[dev], THIS_MODULE, - sizeof(struct snd_interwave), &card); + err = snd_devm_card_new(pdev, index[dev], id[dev], THIS_MODULE, + sizeof(struct snd_interwave), &card); if (err < 0) return err; iwcard = card->private_data; iwcard->card = card; iwcard->irq = -1; - card->private_free = snd_interwave_free; *cardp = card; return 0; } @@ -671,8 +659,8 @@ static int snd_interwave_probe(struct snd_card *card, int dev) if (err < 0) return err; - if (request_irq(xirq, snd_interwave_interrupt, 0, - "InterWave", iwcard)) { + if (devm_request_irq(card->dev, xirq, snd_interwave_interrupt, 0, + "InterWave", iwcard)) { snd_printk(KERN_ERR PFX "unable to grab IRQ %d\n", xirq); return -EBUSY; } @@ -779,10 +767,8 @@ static int snd_interwave_isa_probe1(int dev, struct device *devptr) return err; err = snd_interwave_probe(card, dev); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } dev_set_drvdata(devptr, card); return 0; } @@ -843,15 +829,9 @@ static int snd_interwave_isa_probe(struct device *pdev, } } -static void snd_interwave_isa_remove(struct device *devptr, unsigned int dev) -{ - snd_card_free(dev_get_drvdata(devptr)); -} - static struct isa_driver snd_interwave_driver = { .match = snd_interwave_isa_match, .probe = snd_interwave_isa_probe, - .remove = snd_interwave_isa_remove, /* FIXME: suspend,resume */ .driver = { .name = INTERWAVE_DRIVER @@ -878,32 +858,21 @@ static int snd_interwave_pnp_detect(struct pnp_card_link *pcard, return res; res = snd_interwave_pnp(dev, card->private_data, pcard, pid); - if (res < 0) { - snd_card_free(card); + if (res < 0) return res; - } res = snd_interwave_probe(card, dev); - if (res < 0) { - snd_card_free(card); + if (res < 0) return res; - } pnp_set_card_drvdata(pcard, card); dev++; return 0; } -static void snd_interwave_pnp_remove(struct pnp_card_link *pcard) -{ - snd_card_free(pnp_get_card_drvdata(pcard)); - pnp_set_card_drvdata(pcard, NULL); -} - static struct pnp_card_driver interwave_pnpc_driver = { .flags = PNP_DRIVER_RES_DISABLE, .name = INTERWAVE_PNP_DRIVER, .id_table = snd_interwave_pnpids, .probe = snd_interwave_pnp_detect, - .remove = snd_interwave_pnp_remove, /* FIXME: suspend,resume */ }; From patchwork Thu Jul 15 07:59:28 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379349 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.0 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, UNWANTED_LANGUAGE_BODY,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9CE94C07E96 for ; Thu, 15 Jul 2021 08:25:56 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 249C4611C0 for ; Thu, 15 Jul 2021 08:25:56 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 249C4611C0 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id BEE6D176E; Thu, 15 Jul 2021 10:25:04 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz BEE6D176E DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626337554; bh=kbHwg5p4mLJ9Pp8tKgwQxK/5QJkBglXMEUR9R8/Ea18=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=bxpzErZ6Ko+syASGC8oja0dJXOc42ph/OJQYR7O/r5Btr+ifXseDUERvUhGa0bADE OoMzy+3ubuA6v1Nw5QSn3Iqxlqa8C+fGZxylaw1f9iO+J1LL3oOClhmJck1cMH8IyK pUspvyw0N4WOg1Qn9mKtoSEKMR7NpTPsYztjMqbo= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id 0B657F807CA; Thu, 15 Jul 2021 10:01:45 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id 7A807F80769; Thu, 15 Jul 2021 10:01:37 +0200 (CEST) Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 2AE7BF8057B for ; Thu, 15 Jul 2021 10:00:21 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 2AE7BF8057B Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="wb7uD/3s"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="YcFKAjBI" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out2.suse.de (Postfix) with ESMTP id D6AC71FDE5 for ; Thu, 15 Jul 2021 08:00:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336020; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=2LxBIoNBSEcRqYu6DUDCLvkd6JkSstXgf3gRqyu2/Tc=; b=wb7uD/3sueB3mnUMWv8BDkDBHtOFH0hwOqI6cshSLUkj9riWchZKvLxL1Fag5rUL3yxTrb hEOJPWPtz+iC9/rJ2CsOYsK5/PQDZkd/LCM/EUqTkIaZAHacrIciavDaUWaIa3kBd9dtAU TOP3QAu8HQIqsgOcrlga1ndhXzIX/a0= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336020; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=2LxBIoNBSEcRqYu6DUDCLvkd6JkSstXgf3gRqyu2/Tc=; b=YcFKAjBIhARDkL4sVyExjHAPFHm+Pzi+G1ayl5BLfo0zOv2JEYyl34v9bN6IyX/Rok5ZRs MaKCA1GN951i+qDQ== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id CE3E8A3B8F; Thu, 15 Jul 2021 08:00:20 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 66/79] ALSA: msnd: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:59:28 +0200 Message-Id: <20210715075941.23332-67-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in ISA msnd drivers with devres as a clean up. Each manual resource management is converted with the corresponding devres helper. The remove callback became superfluous and dropped. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- sound/isa/msnd/msnd_pinnacle.c | 119 ++++++++------------------------- 1 file changed, 28 insertions(+), 91 deletions(-) diff --git a/sound/isa/msnd/msnd_pinnacle.c b/sound/isa/msnd/msnd_pinnacle.c index 69647b41300d..4433a92f08e7 100644 --- a/sound/isa/msnd/msnd_pinnacle.c +++ b/sound/isa/msnd/msnd_pinnacle.c @@ -472,11 +472,6 @@ static int snd_msnd_dsp_full_reset(struct snd_card *card) return rv; } -static int snd_msnd_dev_free(struct snd_device *device) -{ - snd_printdd("snd_msnd_chip_free()\n"); - return 0; -} static int snd_msnd_send_dsp_cmd_chk(struct snd_msnd *chip, u8 cmd) { @@ -528,58 +523,47 @@ static int snd_msnd_attach(struct snd_card *card) { struct snd_msnd *chip = card->private_data; int err; - static const struct snd_device_ops ops = { - .dev_free = snd_msnd_dev_free, - }; - err = request_irq(chip->irq, snd_msnd_interrupt, 0, card->shortname, - chip); + err = devm_request_irq(card->dev, chip->irq, snd_msnd_interrupt, 0, + card->shortname, chip); if (err < 0) { printk(KERN_ERR LOGNAME ": Couldn't grab IRQ %d\n", chip->irq); return err; } card->sync_irq = chip->irq; - if (request_region(chip->io, DSP_NUMIO, card->shortname) == NULL) { - free_irq(chip->irq, chip); + if (!devm_request_region(card->dev, chip->io, DSP_NUMIO, + card->shortname)) return -EBUSY; - } - if (!request_mem_region(chip->base, BUFFSIZE, card->shortname)) { + if (!devm_request_mem_region(card->dev, chip->base, BUFFSIZE, + card->shortname)) { printk(KERN_ERR LOGNAME ": unable to grab memory region 0x%lx-0x%lx\n", chip->base, chip->base + BUFFSIZE - 1); - release_region(chip->io, DSP_NUMIO); - free_irq(chip->irq, chip); return -EBUSY; } - chip->mappedbase = ioremap(chip->base, 0x8000); + chip->mappedbase = devm_ioremap(card->dev, chip->base, 0x8000); if (!chip->mappedbase) { printk(KERN_ERR LOGNAME ": unable to map memory region 0x%lx-0x%lx\n", chip->base, chip->base + BUFFSIZE - 1); - err = -EIO; - goto err_release_region; + return -EIO; } err = snd_msnd_dsp_full_reset(card); if (err < 0) - goto err_release_region; - - /* Register device */ - err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops); - if (err < 0) - goto err_release_region; + return err; err = snd_msnd_pcm(card, 0); if (err < 0) { printk(KERN_ERR LOGNAME ": error creating new PCM device\n"); - goto err_release_region; + return err; } err = snd_msndmix_new(card); if (err < 0) { printk(KERN_ERR LOGNAME ": error creating new Mixer device\n"); - goto err_release_region; + return err; } @@ -595,7 +579,7 @@ static int snd_msnd_attach(struct snd_card *card) if (err < 0) { printk(KERN_ERR LOGNAME ": error creating new Midi device\n"); - goto err_release_region; + return err; } mpu = chip->rmidi->private_data; @@ -610,30 +594,12 @@ static int snd_msnd_attach(struct snd_card *card) err = snd_card_register(card); if (err < 0) - goto err_release_region; + return err; return 0; - -err_release_region: - iounmap(chip->mappedbase); - release_mem_region(chip->base, BUFFSIZE); - release_region(chip->io, DSP_NUMIO); - free_irq(chip->irq, chip); - return err; } -static void snd_msnd_unload(struct snd_card *card) -{ - struct snd_msnd *chip = card->private_data; - - iounmap(chip->mappedbase); - release_mem_region(chip->base, BUFFSIZE); - release_region(chip->io, DSP_NUMIO); - free_irq(chip->irq, chip); - snd_card_free(card); -} - #ifndef MSND_CLASSIC /* Pinnacle/Fiji Logical Device Configuration */ @@ -892,8 +858,8 @@ static int snd_msnd_isa_probe(struct device *pdev, unsigned int idx) return -ENODEV; } - err = snd_card_new(pdev, index[idx], id[idx], THIS_MODULE, - sizeof(struct snd_msnd), &card); + err = snd_devm_card_new(pdev, index[idx], id[idx], THIS_MODULE, + sizeof(struct snd_msnd), &card); if (err < 0) return err; @@ -934,17 +900,15 @@ static int snd_msnd_isa_probe(struct device *pdev, unsigned int idx) printk(KERN_INFO LOGNAME ": Non-PnP mode: configuring at port 0x%lx\n", cfg[idx]); - if (!request_region(cfg[idx], 2, "Pinnacle/Fiji Config")) { + if (!devm_request_region(card->dev, cfg[idx], 2, + "Pinnacle/Fiji Config")) { printk(KERN_ERR LOGNAME ": Config port 0x%lx conflict\n", cfg[idx]); - snd_card_free(card); return -EIO; } if (reset[idx]) - if (snd_msnd_pinnacle_cfg_reset(cfg[idx])) { - err = -EIO; - goto cfg_error; - } + if (snd_msnd_pinnacle_cfg_reset(cfg[idx])) + return -EIO; /* DSP */ err = snd_msnd_write_cfg_logical(cfg[idx], 0, @@ -952,7 +916,7 @@ static int snd_msnd_isa_probe(struct device *pdev, unsigned int idx) irq[idx], mem[idx]); if (err) - goto cfg_error; + return err; /* The following are Pinnacle specific */ @@ -967,7 +931,7 @@ static int snd_msnd_isa_probe(struct device *pdev, unsigned int idx) mpu_irq[idx], 0); if (err) - goto cfg_error; + return err; } /* IDE */ @@ -982,7 +946,7 @@ static int snd_msnd_isa_probe(struct device *pdev, unsigned int idx) ide_irq[idx], 0); if (err) - goto cfg_error; + return err; } /* Joystick */ @@ -995,9 +959,8 @@ static int snd_msnd_isa_probe(struct device *pdev, unsigned int idx) 0, 0); if (err) - goto cfg_error; + return err; } - release_region(cfg[idx], 2); #endif /* MSND_CLASSIC */ @@ -1027,37 +990,22 @@ static int snd_msnd_isa_probe(struct device *pdev, unsigned int idx) err = snd_msnd_probe(card); if (err < 0) { printk(KERN_ERR LOGNAME ": Probe failed\n"); - snd_card_free(card); return err; } err = snd_msnd_attach(card); if (err < 0) { printk(KERN_ERR LOGNAME ": Attach failed\n"); - snd_card_free(card); return err; } dev_set_drvdata(pdev, card); return 0; - -#ifndef MSND_CLASSIC -cfg_error: - release_region(cfg[idx], 2); - snd_card_free(card); - return err; -#endif -} - -static void snd_msnd_isa_remove(struct device *pdev, unsigned int dev) -{ - snd_msnd_unload(dev_get_drvdata(pdev)); } static struct isa_driver snd_msnd_driver = { .match = snd_msnd_isa_match, .probe = snd_msnd_isa_probe, - .remove = snd_msnd_isa_remove, /* FIXME: suspend, resume */ .driver = { .name = DEV_NAME @@ -1107,9 +1055,9 @@ static int snd_msnd_pnp_detect(struct pnp_card_link *pcard, * Create a new ALSA sound card entry, in anticipation * of detecting our hardware ... */ - ret = snd_card_new(&pcard->card->dev, - index[idx], id[idx], THIS_MODULE, - sizeof(struct snd_msnd), &card); + ret = snd_devm_card_new(&pcard->card->dev, + index[idx], id[idx], THIS_MODULE, + sizeof(struct snd_msnd), &card); if (ret < 0) return ret; @@ -1151,28 +1099,18 @@ static int snd_msnd_pnp_detect(struct pnp_card_link *pcard, ret = snd_msnd_probe(card); if (ret < 0) { printk(KERN_ERR LOGNAME ": Probe failed\n"); - goto _release_card; + return ret; } ret = snd_msnd_attach(card); if (ret < 0) { printk(KERN_ERR LOGNAME ": Attach failed\n"); - goto _release_card; + return ret; } pnp_set_card_drvdata(pcard, card); ++idx; return 0; - -_release_card: - snd_card_free(card); - return ret; -} - -static void snd_msnd_pnp_remove(struct pnp_card_link *pcard) -{ - snd_msnd_unload(pnp_get_card_drvdata(pcard)); - pnp_set_card_drvdata(pcard, NULL); } static int isa_registered; @@ -1191,7 +1129,6 @@ static struct pnp_card_driver msnd_pnpc_driver = { .name = "msnd_pinnacle", .id_table = msnd_pnpids, .probe = snd_msnd_pnp_detect, - .remove = snd_msnd_pnp_remove, }; #endif /* CONFIG_PNP */ From patchwork Thu Jul 15 07:59:29 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379355 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id C6537C47E48 for ; Thu, 15 Jul 2021 08:26:56 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 4D972611C0 for ; Thu, 15 Jul 2021 08:26:56 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 4D972611C0 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id DCE30177B; Thu, 15 Jul 2021 10:26:04 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz DCE30177B DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626337614; bh=rdVR331Gt5tyNKez5oXWAQj2/FSIAc2P6hkx79ZIIpI=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=OxDqePdpXuJUlziXLYJCnp4T1SP8wXcIy2B95cxurjDEml8UVl2ONfQ49J7F68D9o Y6Dkzg+ou3RbIfA3oiy9frqE2ZgYEJ0wB4j2KFDEC2d9mJaTsmaLSbwWMHRKhGbqzz Ajz8n6gcyYtP57+S8LNPHSvP5Aou2lseo6rYk/gk= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id 4A8DFF80804; Thu, 15 Jul 2021 10:01:48 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id E3263F80799; Thu, 15 Jul 2021 10:01:41 +0200 (CEST) Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id AC23FF805A0 for ; Thu, 15 Jul 2021 10:00:21 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz AC23FF805A0 Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="F9QTc9Wh"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="YSeLGG0W" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out2.suse.de (Postfix) with ESMTP id 78C641FDEA for ; Thu, 15 Jul 2021 08:00:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336021; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=6rSPihpY2BxOD0PHMZuKER3z0oYfYQkjMpKV6Jc8K7c=; b=F9QTc9WhB2zhM2La05aBbf4Gonz5F1XcunLHKyRkICZPEFiFP8qjb7qsglhAavDdUr2jht dJoobTJMMYk0flNZBX7B33643JK6LKYNGPgzbha5LTPmLnOQxFgMlL9OEjARWp5SPS9MUn 7hfA27Em7QUzorhJ01h5GFJW6ZubtpU= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336021; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=6rSPihpY2BxOD0PHMZuKER3z0oYfYQkjMpKV6Jc8K7c=; b=YSeLGG0WDtCJVbr4L005DaQ4f5OOZGXXgncwyupXe6dOhuyhTw829BE7p2JTxJpfRIj2j0 7mW1azF+7ZpA9aAw== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id 64DA4A3B8F; Thu, 15 Jul 2021 08:00:21 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 67/79] ALSA: opti9xx: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:59:29 +0200 Message-Id: <20210715075941.23332-68-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in ISA als100 driver with devres as a clean up. Each manual resource management is converted with the corresponding devres helper. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- sound/isa/opti9xx/miro.c | 76 ++++++++-------------------- sound/isa/opti9xx/opti92x-ad1848.c | 80 +++++++++--------------------- 2 files changed, 44 insertions(+), 112 deletions(-) diff --git a/sound/isa/opti9xx/miro.c b/sound/isa/opti9xx/miro.c index e1fb7567fdcc..59242baed576 100644 --- a/sound/isa/opti9xx/miro.c +++ b/sound/isa/opti9xx/miro.c @@ -1159,12 +1159,13 @@ static int snd_miro_configure(struct snd_miro *chip) return 0; } -static int snd_miro_opti_check(struct snd_miro *chip) +static int snd_miro_opti_check(struct snd_card *card, struct snd_miro *chip) { unsigned char value; - chip->res_mc_base = request_region(chip->mc_base, chip->mc_base_size, - "OPTi9xx MC"); + chip->res_mc_base = + devm_request_region(card->dev, chip->mc_base, + chip->mc_base_size, "OPTi9xx MC"); if (chip->res_mc_base == NULL) return -ENOMEM; @@ -1173,7 +1174,7 @@ static int snd_miro_opti_check(struct snd_miro *chip) if (value == snd_miro_read(chip, OPTi9XX_MC_REG(1))) return 0; - release_and_free_resource(chip->res_mc_base); + devm_release_resource(card->dev, chip->res_mc_base); chip->res_mc_base = NULL; return -ENODEV; @@ -1190,7 +1191,7 @@ static int snd_card_miro_detect(struct snd_card *card, if (err < 0) return err; - err = snd_miro_opti_check(chip); + err = snd_miro_opti_check(card, chip); if (err == 0) return 1; } @@ -1214,7 +1215,8 @@ static int snd_card_miro_aci_detect(struct snd_card *card, regval=inb(miro->mc_base + 4); aci->aci_port = (regval & 0x10) ? 0x344 : 0x354; - miro->res_aci_port = request_region(aci->aci_port, 3, "miro aci"); + miro->res_aci_port = + devm_request_region(card->dev, aci->aci_port, 3, "miro aci"); if (miro->res_aci_port == NULL) { snd_printk(KERN_ERR "aci i/o area 0x%lx-0x%lx already used.\n", aci->aci_port, aci->aci_port+2); @@ -1253,16 +1255,6 @@ static int snd_card_miro_aci_detect(struct snd_card *card, return 0; } -static void snd_card_miro_free(struct snd_card *card) -{ - struct snd_miro *miro = card->private_data; - - release_and_free_resource(miro->res_aci_port); - if (miro->aci) - miro->aci->aci_port = 0; - release_and_free_resource(miro->res_mc_base); -} - static int snd_miro_probe(struct snd_card *card) { int error; @@ -1271,9 +1263,10 @@ static int snd_miro_probe(struct snd_card *card) struct snd_rawmidi *rmidi; if (!miro->res_mc_base) { - miro->res_mc_base = request_region(miro->mc_base, - miro->mc_base_size, - "miro (OPTi9xx MC)"); + miro->res_mc_base = devm_request_region(card->dev, + miro->mc_base, + miro->mc_base_size, + "miro (OPTi9xx MC)"); if (miro->res_mc_base == NULL) { snd_printk(KERN_ERR "request for OPTI9xx MC failed\n"); return -ENOMEM; @@ -1408,17 +1401,15 @@ static int snd_miro_isa_probe(struct device *devptr, unsigned int n) struct snd_miro *miro; struct snd_card *card; - error = snd_card_new(devptr, index, id, THIS_MODULE, - sizeof(struct snd_miro), &card); + error = snd_devm_card_new(devptr, index, id, THIS_MODULE, + sizeof(struct snd_miro), &card); if (error < 0) return error; - card->private_free = snd_card_miro_free; miro = card->private_data; error = snd_card_miro_detect(card, miro); if (error < 0) { - snd_card_free(card); snd_printk(KERN_ERR "unable to detect OPTi9xx chip\n"); return -ENODEV; } @@ -1426,7 +1417,6 @@ static int snd_miro_isa_probe(struct device *devptr, unsigned int n) if (port == SNDRV_AUTO_PORT) { port = snd_legacy_find_free_ioport(possible_ports, 4); if (port < 0) { - snd_card_free(card); snd_printk(KERN_ERR "unable to find a free WSS port\n"); return -EBUSY; } @@ -1435,7 +1425,6 @@ static int snd_miro_isa_probe(struct device *devptr, unsigned int n) if (mpu_port == SNDRV_AUTO_PORT) { mpu_port = snd_legacy_find_free_ioport(possible_mpu_ports, 2); if (mpu_port < 0) { - snd_card_free(card); snd_printk(KERN_ERR "unable to find a free MPU401 port\n"); return -EBUSY; @@ -1445,7 +1434,6 @@ static int snd_miro_isa_probe(struct device *devptr, unsigned int n) if (irq == SNDRV_AUTO_IRQ) { irq = snd_legacy_find_free_irq(possible_irqs); if (irq < 0) { - snd_card_free(card); snd_printk(KERN_ERR "unable to find a free IRQ\n"); return -EBUSY; } @@ -1453,7 +1441,6 @@ static int snd_miro_isa_probe(struct device *devptr, unsigned int n) if (mpu_irq == SNDRV_AUTO_IRQ) { mpu_irq = snd_legacy_find_free_irq(possible_mpu_irqs); if (mpu_irq < 0) { - snd_card_free(card); snd_printk(KERN_ERR "unable to find a free MPU401 IRQ\n"); return -EBUSY; @@ -1462,7 +1449,6 @@ static int snd_miro_isa_probe(struct device *devptr, unsigned int n) if (dma1 == SNDRV_AUTO_DMA) { dma1 = snd_legacy_find_free_dma(possible_dma1s); if (dma1 < 0) { - snd_card_free(card); snd_printk(KERN_ERR "unable to find a free DMA1\n"); return -EBUSY; } @@ -1470,34 +1456,24 @@ static int snd_miro_isa_probe(struct device *devptr, unsigned int n) if (dma2 == SNDRV_AUTO_DMA) { dma2 = snd_legacy_find_free_dma(possible_dma2s[dma1 % 4]); if (dma2 < 0) { - snd_card_free(card); snd_printk(KERN_ERR "unable to find a free DMA2\n"); return -EBUSY; } } error = snd_miro_probe(card); - if (error < 0) { - snd_card_free(card); + if (error < 0) return error; - } dev_set_drvdata(devptr, card); return 0; } -static void snd_miro_isa_remove(struct device *devptr, - unsigned int dev) -{ - snd_card_free(dev_get_drvdata(devptr)); -} - #define DEV_NAME "miro" static struct isa_driver snd_miro_driver = { .match = snd_miro_isa_match, .probe = snd_miro_isa_probe, - .remove = snd_miro_isa_remove, /* FIXME: suspend/resume */ .driver = { .name = DEV_NAME @@ -1578,39 +1554,31 @@ static int snd_miro_pnp_probe(struct pnp_card_link *pcard, return -EBUSY; if (!isapnp) return -ENODEV; - err = snd_card_new(&pcard->card->dev, index, id, THIS_MODULE, - sizeof(struct snd_miro), &card); + err = snd_devm_card_new(&pcard->card->dev, index, id, THIS_MODULE, + sizeof(struct snd_miro), &card); if (err < 0) return err; - card->private_free = snd_card_miro_free; miro = card->private_data; err = snd_card_miro_pnp(miro, pcard, pid); - if (err) { - snd_card_free(card); + if (err) return err; - } /* only miroSOUND PCM20 and PCM12 == OPTi924 */ err = snd_miro_init(miro, OPTi9XX_HW_82C924); - if (err) { - snd_card_free(card); + if (err) return err; - } - err = snd_miro_opti_check(miro); + err = snd_miro_opti_check(card, miro); if (err) { snd_printk(KERN_ERR "OPTI chip not found\n"); - snd_card_free(card); return err; } err = snd_miro_probe(card); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } pnp_set_card_drvdata(pcard, card); snd_miro_pnp_is_probed = 1; return 0; @@ -1618,8 +1586,6 @@ static int snd_miro_pnp_probe(struct pnp_card_link *pcard, static void snd_miro_pnp_remove(struct pnp_card_link *pcard) { - snd_card_free(pnp_get_card_drvdata(pcard)); - pnp_set_card_drvdata(pcard, NULL); snd_miro_pnp_is_probed = 0; } diff --git a/sound/isa/opti9xx/opti92x-ad1848.c b/sound/isa/opti9xx/opti92x-ad1848.c index 4bd1dc6707fc..8988de8cca96 100644 --- a/sound/isa/opti9xx/opti92x-ad1848.c +++ b/sound/isa/opti9xx/opti92x-ad1848.c @@ -654,16 +654,18 @@ static irqreturn_t snd_opti93x_interrupt(int irq, void *dev_id) #endif /* OPTi93X */ -static int snd_opti9xx_read_check(struct snd_opti9xx *chip) +static int snd_opti9xx_read_check(struct snd_card *card, + struct snd_opti9xx *chip) { unsigned char value; #ifdef OPTi93X unsigned long flags; #endif - chip->res_mc_base = request_region(chip->mc_base, chip->mc_base_size, - "OPTi9xx MC"); - if (chip->res_mc_base == NULL) + chip->res_mc_base = + devm_request_region(card->dev, chip->mc_base, + chip->mc_base_size, "OPTi9xx MC"); + if (!chip->res_mc_base) return -EBUSY; #ifndef OPTi93X value = snd_opti9xx_read(chip, OPTi9XX_MC_REG(1)); @@ -671,9 +673,10 @@ static int snd_opti9xx_read_check(struct snd_opti9xx *chip) if (value == snd_opti9xx_read(chip, OPTi9XX_MC_REG(1))) return 0; #else /* OPTi93X */ - chip->res_mc_indir = request_region(chip->mc_indir_index, 2, - "OPTi93x MC"); - if (chip->res_mc_indir == NULL) + chip->res_mc_indir = + devm_request_region(card->dev, chip->mc_indir_index, 2, + "OPTi93x MC"); + if (!chip->res_mc_indir) return -EBUSY; spin_lock_irqsave(&chip->lock, flags); @@ -686,10 +689,10 @@ static int snd_opti9xx_read_check(struct snd_opti9xx *chip) if (snd_opti9xx_read(chip, OPTi9XX_MC_REG(7)) == 0xff - value) return 0; - release_and_free_resource(chip->res_mc_indir); + devm_release_resource(card->dev, chip->res_mc_indir); chip->res_mc_indir = NULL; #endif /* OPTi93X */ - release_and_free_resource(chip->res_mc_base); + devm_release_resource(card->dev, chip->res_mc_base); chip->res_mc_base = NULL; return -ENODEV; @@ -709,7 +712,7 @@ static int snd_card_opti9xx_detect(struct snd_card *card, if (err < 0) return err; - err = snd_opti9xx_read_check(chip); + err = snd_opti9xx_read_check(card, chip); if (err == 0) return 1; #ifdef OPTi93X @@ -789,22 +792,6 @@ static int snd_card_opti9xx_pnp(struct snd_opti9xx *chip, } #endif /* CONFIG_PNP */ -static void snd_card_opti9xx_free(struct snd_card *card) -{ - struct snd_opti9xx *chip = card->private_data; - - if (chip) { -#ifdef OPTi93X - if (chip->irq > 0) { - disable_irq(chip->irq); - free_irq(chip->irq, chip); - } - release_and_free_resource(chip->res_mc_indir); -#endif - release_and_free_resource(chip->res_mc_base); - } -} - static int snd_opti9xx_probe(struct snd_card *card) { static const long possible_ports[] = {0x530, 0xe80, 0xf40, 0x604, -1}; @@ -860,8 +847,8 @@ static int snd_opti9xx_probe(struct snd_card *card) return error; #endif #ifdef OPTi93X - error = request_irq(irq, snd_opti93x_interrupt, - 0, DEV_NAME" - WSS", chip); + error = devm_request_irq(card->dev, irq, snd_opti93x_interrupt, + 0, DEV_NAME" - WSS", chip); if (error < 0) { snd_printk(KERN_ERR "opti9xx: can't grab IRQ %d\n", irq); return error; @@ -931,11 +918,10 @@ static int snd_opti9xx_card_new(struct device *pdev, struct snd_card **cardp) struct snd_card *card; int err; - err = snd_card_new(pdev, index, id, THIS_MODULE, - sizeof(struct snd_opti9xx), &card); + err = snd_devm_card_new(pdev, index, id, THIS_MODULE, + sizeof(struct snd_opti9xx), &card); if (err < 0) return err; - card->private_free = snd_card_opti9xx_free; *cardp = card; return 0; } @@ -1012,25 +998,15 @@ static int snd_opti9xx_isa_probe(struct device *devptr, return error; error = snd_card_opti9xx_detect(card, card->private_data); - if (error < 0) { - snd_card_free(card); + if (error < 0) return error; - } error = snd_opti9xx_probe(card); - if (error < 0) { - snd_card_free(card); + if (error < 0) return error; - } dev_set_drvdata(devptr, card); return 0; } -static void snd_opti9xx_isa_remove(struct device *devptr, - unsigned int dev) -{ - snd_card_free(dev_get_drvdata(devptr)); -} - #ifdef CONFIG_PM static int snd_opti9xx_suspend(struct snd_card *card) { @@ -1075,7 +1051,6 @@ static int snd_opti9xx_isa_resume(struct device *dev, unsigned int n) static struct isa_driver snd_opti9xx_driver = { .match = snd_opti9xx_isa_match, .probe = snd_opti9xx_isa_probe, - .remove = snd_opti9xx_isa_remove, #ifdef CONFIG_PM .suspend = snd_opti9xx_isa_suspend, .resume = snd_opti9xx_isa_resume, @@ -1114,26 +1089,19 @@ static int snd_opti9xx_pnp_probe(struct pnp_card_link *pcard, hw = OPTi9XX_HW_82C931; break; default: - snd_card_free(card); return -ENODEV; } error = snd_opti9xx_init(chip, hw); - if (error) { - snd_card_free(card); + if (error) return error; - } - error = snd_opti9xx_read_check(chip); - if (error) { + error = snd_opti9xx_read_check(card, chip); + if (error) snd_printk(KERN_ERR "OPTI chip not found\n"); - snd_card_free(card); return error; - } error = snd_opti9xx_probe(card); - if (error < 0) { - snd_card_free(card); + if (error < 0) return error; - } pnp_set_card_drvdata(pcard, card); snd_opti9xx_pnp_is_probed = 1; return 0; @@ -1141,8 +1109,6 @@ static int snd_opti9xx_pnp_probe(struct pnp_card_link *pcard, static void snd_opti9xx_pnp_remove(struct pnp_card_link *pcard) { - snd_card_free(pnp_get_card_drvdata(pcard)); - pnp_set_card_drvdata(pcard, NULL); snd_opti9xx_pnp_is_probed = 0; } From patchwork Thu Jul 15 07:59:30 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379353 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.0 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, UNWANTED_LANGUAGE_BODY,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id EA713C47E4B for ; Thu, 15 Jul 2021 08:26:37 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 7482C611C0 for ; Thu, 15 Jul 2021 08:26:37 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 7482C611C0 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id 027F91777; Thu, 15 Jul 2021 10:25:46 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 027F91777 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626337596; bh=yby3j6Ah7taIr3YMbNzndkc3FnTOj3TR9/1mi5N1/R0=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=rzGqyo3O6OrmD8BO+7AaUGcAydttgVxlILnQd9sKe1l3iK6ywL3GrsElORRCGVV/H S0dzJpcOy7JiUsUhyKiJS1K4+FvpxlgsZXujPk89XDewt8FOXu7c0SY0MJ0A6rRDbX c7cBcQ8G5ePnU2hPv3DCBqHUFCNbHdQ2NP+uAoeE= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id 8FA10F807DC; Thu, 15 Jul 2021 10:01:47 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id 48AB0F80799; Thu, 15 Jul 2021 10:01:41 +0200 (CEST) Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 1C38CF805A1 for ; Thu, 15 Jul 2021 10:00:22 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 1C38CF805A1 Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="B71lKg2f"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="46QQ2jkJ" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out2.suse.de (Postfix) with ESMTP id E151A1FD3E for ; Thu, 15 Jul 2021 08:00:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336021; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=e22ET7W+EaRYVMpYd47mjS9IHpm75AmsLtIqmXKU1cA=; b=B71lKg2fGsOj5VuXDnBBMYHzu7zVacxzXTGH59f9gQPAQoqt+QxW4gVSRIp8Qi1NiLn2ov 2AG+QL/A648JH7UmAZ9XX12CXamnwr+yvsD7Qgr14EdM/N90HEA4UoYILlNeJuewiQ5Lqg lidVUoWJ+JIpVVIVipMsLU55rgmeOrA= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336021; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=e22ET7W+EaRYVMpYd47mjS9IHpm75AmsLtIqmXKU1cA=; b=46QQ2jkJUJ4AkC+AeDRjfrXVIU6c17sT3Oqti+09DjJxj2qIgrTR6+j1U8IDw87KsmcPbw +LsBjvKyS68uJJBw== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id D96CEA3B9B; Thu, 15 Jul 2021 08:00:21 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 68/79] ALSA: opl3sa2: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:59:30 +0200 Message-Id: <20210715075941.23332-69-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in ISA opl3sa2 driver with devres as a clean up. Each manual resource management is converted with the corresponding devres helper. The remove callback became superfluous and dropped. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- sound/isa/opl3sa2.c | 60 +++++++++------------------------------------ 1 file changed, 11 insertions(+), 49 deletions(-) diff --git a/sound/isa/opl3sa2.c b/sound/isa/opl3sa2.c index 6f42f869928c..bad1490a66a0 100644 --- a/sound/isa/opl3sa2.c +++ b/sound/isa/opl3sa2.c @@ -208,7 +208,8 @@ static int snd_opl3sa2_detect(struct snd_card *card) char str[2]; port = chip->port; - chip->res_port = request_region(port, 2, "OPL3-SA control"); + chip->res_port = devm_request_region(card->dev, port, 2, + "OPL3-SA control"); if (!chip->res_port) { snd_printk(KERN_ERR PFX "can't grab port 0x%lx\n", port); return -EBUSY; @@ -609,14 +610,6 @@ static int snd_opl3sa2_pnp(int dev, struct snd_opl3sa2 *chip, } #endif /* CONFIG_PNP */ -static void snd_opl3sa2_free(struct snd_card *card) -{ - struct snd_opl3sa2 *chip = card->private_data; - if (chip->irq >= 0) - free_irq(chip->irq, card); - release_and_free_resource(chip->res_port); -} - static int snd_opl3sa2_card_new(struct device *pdev, int dev, struct snd_card **cardp) { @@ -624,8 +617,8 @@ static int snd_opl3sa2_card_new(struct device *pdev, int dev, struct snd_opl3sa2 *chip; int err; - err = snd_card_new(pdev, index[dev], id[dev], THIS_MODULE, - sizeof(struct snd_opl3sa2), &card); + err = snd_devm_card_new(pdev, index[dev], id[dev], THIS_MODULE, + sizeof(struct snd_opl3sa2), &card); if (err < 0) return err; strcpy(card->driver, "OPL3SA2"); @@ -633,7 +626,6 @@ static int snd_opl3sa2_card_new(struct device *pdev, int dev, chip = card->private_data; spin_lock_init(&chip->reg_lock); chip->irq = -1; - card->private_free = snd_opl3sa2_free; *cardp = card; return 0; } @@ -658,8 +650,8 @@ static int snd_opl3sa2_probe(struct snd_card *card, int dev) err = snd_opl3sa2_detect(card); if (err < 0) return err; - err = request_irq(xirq, snd_opl3sa2_interrupt, 0, - "OPL3-SA2", card); + err = devm_request_irq(card->dev, xirq, snd_opl3sa2_interrupt, 0, + "OPL3-SA2", card); if (err) { snd_printk(KERN_ERR PFX "can't grab IRQ %d\n", xirq); return -ENODEV; @@ -737,25 +729,16 @@ static int snd_opl3sa2_pnp_detect(struct pnp_dev *pdev, if (err < 0) return err; err = snd_opl3sa2_pnp(dev, card->private_data, pdev); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } err = snd_opl3sa2_probe(card, dev); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } pnp_set_drvdata(pdev, card); dev++; return 0; } -static void snd_opl3sa2_pnp_remove(struct pnp_dev *pdev) -{ - snd_card_free(pnp_get_drvdata(pdev)); -} - #ifdef CONFIG_PM static int snd_opl3sa2_pnp_suspend(struct pnp_dev *pdev, pm_message_t state) { @@ -771,7 +754,6 @@ static struct pnp_driver opl3sa2_pnp_driver = { .name = "snd-opl3sa2-pnpbios", .id_table = snd_opl3sa2_pnpbiosids, .probe = snd_opl3sa2_pnp_detect, - .remove = snd_opl3sa2_pnp_remove, #ifdef CONFIG_PM .suspend = snd_opl3sa2_pnp_suspend, .resume = snd_opl3sa2_pnp_resume, @@ -803,26 +785,16 @@ static int snd_opl3sa2_pnp_cdetect(struct pnp_card_link *pcard, if (err < 0) return err; err = snd_opl3sa2_pnp(dev, card->private_data, pdev); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } err = snd_opl3sa2_probe(card, dev); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } pnp_set_card_drvdata(pcard, card); dev++; return 0; } -static void snd_opl3sa2_pnp_cremove(struct pnp_card_link *pcard) -{ - snd_card_free(pnp_get_card_drvdata(pcard)); - pnp_set_card_drvdata(pcard, NULL); -} - #ifdef CONFIG_PM static int snd_opl3sa2_pnp_csuspend(struct pnp_card_link *pcard, pm_message_t state) { @@ -839,7 +811,6 @@ static struct pnp_card_driver opl3sa2_pnpc_driver = { .name = "snd-opl3sa2-cpnp", .id_table = snd_opl3sa2_pnpids, .probe = snd_opl3sa2_pnp_cdetect, - .remove = snd_opl3sa2_pnp_cremove, #ifdef CONFIG_PM .suspend = snd_opl3sa2_pnp_csuspend, .resume = snd_opl3sa2_pnp_cresume, @@ -885,20 +856,12 @@ static int snd_opl3sa2_isa_probe(struct device *pdev, if (err < 0) return err; err = snd_opl3sa2_probe(card, dev); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } dev_set_drvdata(pdev, card); return 0; } -static void snd_opl3sa2_isa_remove(struct device *devptr, - unsigned int dev) -{ - snd_card_free(dev_get_drvdata(devptr)); -} - #ifdef CONFIG_PM static int snd_opl3sa2_isa_suspend(struct device *dev, unsigned int n, pm_message_t state) @@ -917,7 +880,6 @@ static int snd_opl3sa2_isa_resume(struct device *dev, unsigned int n) static struct isa_driver snd_opl3sa2_isa_driver = { .match = snd_opl3sa2_isa_match, .probe = snd_opl3sa2_isa_probe, - .remove = snd_opl3sa2_isa_remove, #ifdef CONFIG_PM .suspend = snd_opl3sa2_isa_suspend, .resume = snd_opl3sa2_isa_resume, From patchwork Thu Jul 15 07:59:31 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379357 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 08936C07E96 for ; Thu, 15 Jul 2021 08:27:22 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 8B5AA611C0 for ; Thu, 15 Jul 2021 08:27:21 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 8B5AA611C0 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id 333D01781; Thu, 15 Jul 2021 10:26:30 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 333D01781 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626337640; bh=i+tPLyRyXQqhEEW97p4tOJFZ7s2B2+3s3jZGcabMA3k=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=u58ertPMVTLvStCLFV8FkqzDaBo2cfJlJogJ4x64s4RSrtEUJMjNsuQvJ7r5LScMf SABdj4pg+GD/OxBQO0GIlrHT+1Sfu2ViSvXuX3GWwAlYwLnMaRSvVKDkt13Uu/ajWo L+Jp9zJFE7zgVTn5IPiZn/60ee18uq81sZ3gt6tc= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id 4B8DFF80806; Thu, 15 Jul 2021 10:01:49 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id BBB88F8079B; Thu, 15 Jul 2021 10:01:42 +0200 (CEST) Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 89F48F805AB for ; Thu, 15 Jul 2021 10:00:22 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 89F48F805AB Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="HlcZhAsY"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="rkOwLW3b" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out1.suse.de (Postfix) with ESMTP id 626162284F for ; Thu, 15 Jul 2021 08:00:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336022; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=r6vFinjlhLc0ENWa69KTssHtx3Sut+fM1cEirG3hAvI=; b=HlcZhAsYNBlChiZHYwP+M4eXupQDVF2kynWV1/K9DrRWHIKAOdWZFmWIh7VuC9l1M7XEa+ U8vGryGMt8VC1gnk/DS2GSyCaGTYcGgXYPP/YNsjHLQ6v7NKq1yJfPTvKSAy7p4NRsh3t9 eLc5jOjZZgk40KqJn1+s5eIVmYYBz/g= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336022; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=r6vFinjlhLc0ENWa69KTssHtx3Sut+fM1cEirG3hAvI=; b=rkOwLW3b47vYoznK2jRUMmt3CxRsEzM6/q4mfRpBnyoa57vfB9XOze7zEGkaOzMfJaenF2 Onw7NHqWj0OXx7BA== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id 5A9D5A3B9B; Thu, 15 Jul 2021 08:00:22 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 69/79] ALSA: sc6000: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:59:31 +0200 Message-Id: <20210715075941.23332-70-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in ISA als100 driver with devres as a clean up. Each manual resource management is converted with the corresponding devres helper. The cleanup code was moved from the remove callback to card->private_free, and then the remove callback became superfluous and dropped. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- sound/isa/sc6000.c | 73 +++++++++++++++++----------------------------- 1 file changed, 26 insertions(+), 47 deletions(-) diff --git a/sound/isa/sc6000.c b/sound/isa/sc6000.c index 3462663050bb..6236c4fa766a 100644 --- a/sound/isa/sc6000.c +++ b/sound/isa/sc6000.c @@ -529,6 +529,14 @@ static int snd_sc6000_match(struct device *devptr, unsigned int dev) return 1; } +static void snd_sc6000_free(struct snd_card *card) +{ + char __iomem **vport = card->private_data; + + if (*vport) + sc6000_setup_board(*vport, 0); +} + static int snd_sc6000_probe(struct device *devptr, unsigned int dev) { static const int possible_irqs[] = { 5, 7, 9, 10, 11, -1 }; @@ -543,8 +551,8 @@ static int snd_sc6000_probe(struct device *devptr, unsigned int dev) char __iomem *vmss_port; - err = snd_card_new(devptr, index[dev], id[dev], THIS_MODULE, - sizeof(vport), &card); + err = snd_devm_card_new(devptr, index[dev], id[dev], THIS_MODULE, + sizeof(vport), &card); if (err < 0) return err; @@ -553,8 +561,7 @@ static int snd_sc6000_probe(struct device *devptr, unsigned int dev) xirq = snd_legacy_find_free_irq(possible_irqs); if (xirq < 0) { snd_printk(KERN_ERR PFX "unable to find a free IRQ\n"); - err = -EBUSY; - goto err_exit; + return -EBUSY; } } @@ -562,38 +569,33 @@ static int snd_sc6000_probe(struct device *devptr, unsigned int dev) xdma = snd_legacy_find_free_dma(possible_dmas); if (xdma < 0) { snd_printk(KERN_ERR PFX "unable to find a free DMA\n"); - err = -EBUSY; - goto err_exit; + return -EBUSY; } } - if (!request_region(port[dev], 0x10, DRV_NAME)) { + if (!devm_request_region(devptr, port[dev], 0x10, DRV_NAME)) { snd_printk(KERN_ERR PFX "I/O port region is already in use.\n"); - err = -EBUSY; - goto err_exit; + return -EBUSY; } *vport = devm_ioport_map(devptr, port[dev], 0x10); if (*vport == NULL) { snd_printk(KERN_ERR PFX "I/O port cannot be iomapped.\n"); - err = -EBUSY; - goto err_unmap1; + return -EBUSY; } /* to make it marked as used */ - if (!request_region(mss_port[dev], 4, DRV_NAME)) { + if (!devm_request_region(devptr, mss_port[dev], 4, DRV_NAME)) { snd_printk(KERN_ERR PFX "SC-6000 port I/O port region is already in use.\n"); - err = -EBUSY; - goto err_unmap1; + return -EBUSY; } vmss_port = devm_ioport_map(devptr, mss_port[dev], 4); if (!vmss_port) { snd_printk(KERN_ERR PFX "MSS port I/O cannot be iomapped.\n"); - err = -EBUSY; - goto err_unmap2; + return -EBUSY; } snd_printd("Initializing BASE[0x%lx] IRQ[%d] DMA[%d] MIRQ[%d]\n", @@ -602,28 +604,29 @@ static int snd_sc6000_probe(struct device *devptr, unsigned int dev) err = sc6000_init_board(*vport, vmss_port, dev); if (err < 0) - goto err_unmap2; + return err; + card->private_free = snd_sc6000_free; err = snd_wss_create(card, mss_port[dev] + 4, -1, xirq, xdma, -1, WSS_HW_DETECT, 0, &chip); if (err < 0) - goto err_unmap2; + return err; err = snd_wss_pcm(chip, 0); if (err < 0) { snd_printk(KERN_ERR PFX "error creating new WSS PCM device\n"); - goto err_unmap2; + return err; } err = snd_wss_mixer(chip); if (err < 0) { snd_printk(KERN_ERR PFX "error creating new WSS mixer\n"); - goto err_unmap2; + return err; } err = snd_sc6000_mixer(chip); if (err < 0) { snd_printk(KERN_ERR PFX "the mixer rewrite failed\n"); - goto err_unmap2; + return err; } if (snd_opl3_create(card, 0x388, 0x388 + 2, @@ -633,7 +636,7 @@ static int snd_sc6000_probe(struct device *devptr, unsigned int dev) } else { err = snd_opl3_hwdep_new(opl3, 0, 1, NULL); if (err < 0) - goto err_unmap2; + return err; } if (mpu_port[dev] != SNDRV_AUTO_PORT) { @@ -654,39 +657,15 @@ static int snd_sc6000_probe(struct device *devptr, unsigned int dev) err = snd_card_register(card); if (err < 0) - goto err_unmap2; + return err; dev_set_drvdata(devptr, card); return 0; - -err_unmap2: - sc6000_setup_board(*vport, 0); - release_region(mss_port[dev], 4); -err_unmap1: - release_region(port[dev], 0x10); -err_exit: - snd_card_free(card); - return err; -} - -static void snd_sc6000_remove(struct device *devptr, unsigned int dev) -{ - struct snd_card *card = dev_get_drvdata(devptr); - char __iomem **vport = card->private_data; - - if (sc6000_setup_board(*vport, 0) < 0) - snd_printk(KERN_WARNING "sc6000_setup_board failed on exit!\n"); - - release_region(port[dev], 0x10); - release_region(mss_port[dev], 4); - - snd_card_free(card); } static struct isa_driver snd_sc6000_driver = { .match = snd_sc6000_match, .probe = snd_sc6000_probe, - .remove = snd_sc6000_remove, /* FIXME: suspend/resume */ .driver = { .name = DRV_NAME, From patchwork Thu Jul 15 07:59:32 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379383 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 43315C07E96 for ; Thu, 15 Jul 2021 08:28:23 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 720C2611C0 for ; Thu, 15 Jul 2021 08:28:22 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 720C2611C0 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id 0E7DE1723; Thu, 15 Jul 2021 10:27:31 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 0E7DE1723 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626337701; bh=TXuTrEN08yehKr7Ciy62unZ11BMc5BaFrn3/wwNyw6A=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=VtHhGeNyW0vCf0fBpdB2/jgg7qThjzii7vHf1Rs1Z/qt88AdNfqbkDTEM3k33v71y iwNpdW/MNJX7q9cC50uqkoFvUn7G5UQfemFBiuOtW8RHZXyNfA/Nz6BJLMfJQdRR5H 6wZyjTW0eUFHjvReASyawD1uGDGBIs5HzwoywuHk= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id B82C6F80844; Thu, 15 Jul 2021 10:01:55 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id E38DAF807DE; Thu, 15 Jul 2021 10:01:45 +0200 (CEST) Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 18F30F805AA for ; Thu, 15 Jul 2021 10:00:23 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 18F30F805AA Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="ZOLDZ+8I"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="9+sZg/ie" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out1.suse.de (Postfix) with ESMTP id D8D0522854 for ; Thu, 15 Jul 2021 08:00:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336022; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=iRUeyFmo/r1kEv9m/+nXyBfMbslPAZh0fUINSstUFp4=; b=ZOLDZ+8Ig0ookJEcAEWx5PgmZoBr6Ts0lrsYaPCNDD3O5xRhOvtYwTescgTXUd7o+7hsHS JybqJmopOVrnPW6Y8nmk/ApW8EVRf/xWtVoRQHUMV71BXi3gp9j855g/8d+SYMucAm/O7/ gSqbDBfRzS6SR4WXrga+jTAA/YGd7eY= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336022; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=iRUeyFmo/r1kEv9m/+nXyBfMbslPAZh0fUINSstUFp4=; b=9+sZg/iet2yjfb+qzJ43/ZTFdw6d/MRS7uh6V5LNmW3s+hVVWZgifYjrBzGYFceug8Obn+ 7S9ma44c5CcqCvAA== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id C647FA3B9D; Thu, 15 Jul 2021 08:00:22 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 70/79] ALSA: sscape: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:59:32 +0200 Message-Id: <20210715075941.23332-71-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in ISA sscape driver with devres as a clean up. Each manual resource management is converted with the corresponding devres helper. The remove callback became superfluous and dropped. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- sound/isa/sscape.c | 92 ++++++++++------------------------------------ 1 file changed, 20 insertions(+), 72 deletions(-) diff --git a/sound/isa/sscape.c b/sound/isa/sscape.c index e70ef9aee545..0bc0025f7c19 100644 --- a/sound/isa/sscape.c +++ b/sound/isa/sscape.c @@ -327,17 +327,6 @@ static void activate_ad1845_unsafe(unsigned io_base) sscape_write_unsafe(io_base, GA_CDCFG_REG, 0x80); } -/* - * Do the necessary ALSA-level cleanup to deallocate our driver ... - */ -static void soundscape_free(struct snd_card *c) -{ - struct soundscape *sscape = get_card_soundscape(c); - release_and_free_resource(sscape->io_res); - release_and_free_resource(sscape->wss_res); - free_dma(sscape->chip->dma1); -} - /* * Tell the SoundScape to begin a DMA transfer using the given channel. * All locking issues are left to the caller. @@ -941,7 +930,7 @@ static int create_sscape(int dev, struct snd_card *card) * Grab IO ports that we will need to probe so that we * can detect and control this hardware ... */ - io_res = request_region(port[dev], 8, "SoundScape"); + io_res = devm_request_region(card->dev, port[dev], 8, "SoundScape"); if (!io_res) { snd_printk(KERN_ERR "sscape: can't grab port 0x%lx\n", port[dev]); @@ -949,22 +938,22 @@ static int create_sscape(int dev, struct snd_card *card) } wss_res = NULL; if (sscape->type == SSCAPE_VIVO) { - wss_res = request_region(wss_port[dev], 4, "SoundScape"); + wss_res = devm_request_region(card->dev, wss_port[dev], 4, + "SoundScape"); if (!wss_res) { snd_printk(KERN_ERR "sscape: can't grab port 0x%lx\n", wss_port[dev]); - err = -EBUSY; - goto _release_region; + return -EBUSY; } } /* * Grab one DMA channel ... */ - err = request_dma(dma[dev], "SoundScape"); + err = snd_devm_request_dma(card->dev, dma[dev], "SoundScape"); if (err < 0) { snd_printk(KERN_ERR "sscape: can't grab DMA %d\n", dma[dev]); - goto _release_region; + return err; } spin_lock_init(&sscape->lock); @@ -975,8 +964,7 @@ static int create_sscape(int dev, struct snd_card *card) if (!detect_sscape(sscape, wss_port[dev])) { printk(KERN_ERR "sscape: hardware not detected at 0x%x\n", sscape->io_base); - err = -ENODEV; - goto _release_dma; + return -ENODEV; } switch (sscape->type) { @@ -1006,15 +994,13 @@ static int create_sscape(int dev, struct snd_card *card) irq_cfg = get_irq_config(sscape->type, irq[dev]); if (irq_cfg == INVALID_IRQ) { snd_printk(KERN_ERR "sscape: Invalid IRQ %d\n", irq[dev]); - err = -ENXIO; - goto _release_dma; + return -ENXIO; } mpu_irq_cfg = get_irq_config(sscape->type, mpu_irq[dev]); if (mpu_irq_cfg == INVALID_IRQ) { snd_printk(KERN_ERR "sscape: Invalid IRQ %d\n", mpu_irq[dev]); - err = -ENXIO; - goto _release_dma; + return -ENXIO; } /* @@ -1060,7 +1046,7 @@ static int create_sscape(int dev, struct snd_card *card) snd_printk(KERN_ERR "sscape: No AD1845 device at 0x%lx, IRQ %d\n", wss_port[dev], irq[dev]); - goto _release_dma; + return err; } strcpy(card->driver, "SoundScape"); strcpy(card->shortname, name); @@ -1082,7 +1068,7 @@ static int create_sscape(int dev, struct snd_card *card) snd_printk(KERN_ERR "sscape: Failed to create " "MPU-401 device at 0x%lx\n", port[dev]); - goto _release_dma; + return err; } /* @@ -1109,24 +1095,7 @@ static int create_sscape(int dev, struct snd_card *card) } } - /* - * Now that we have successfully created this sound card, - * it is safe to store the pointer. - * NOTE: we only register the sound card's "destructor" - * function now that our "constructor" has completed. - */ - card->private_free = soundscape_free; - return 0; - -_release_dma: - free_dma(dma[dev]); - -_release_region: - release_and_free_resource(wss_res); - release_and_free_resource(io_res); - - return err; } @@ -1156,8 +1125,8 @@ static int snd_sscape_probe(struct device *pdev, unsigned int dev) struct soundscape *sscape; int ret; - ret = snd_card_new(pdev, index[dev], id[dev], THIS_MODULE, - sizeof(struct soundscape), &card); + ret = snd_devm_card_new(pdev, index[dev], id[dev], THIS_MODULE, + sizeof(struct soundscape), &card); if (ret < 0) return ret; @@ -1168,24 +1137,15 @@ static int snd_sscape_probe(struct device *pdev, unsigned int dev) ret = create_sscape(dev, card); if (ret < 0) - goto _release_card; + return ret; ret = snd_card_register(card); if (ret < 0) { snd_printk(KERN_ERR "sscape: Failed to register sound card\n"); - goto _release_card; + return ret; } dev_set_drvdata(pdev, card); return 0; - -_release_card: - snd_card_free(card); - return ret; -} - -static void snd_sscape_remove(struct device *devptr, unsigned int dev) -{ - snd_card_free(dev_get_drvdata(devptr)); } #define DEV_NAME "sscape" @@ -1193,7 +1153,6 @@ static void snd_sscape_remove(struct device *devptr, unsigned int dev) static struct isa_driver snd_sscape_driver = { .match = snd_sscape_match, .probe = snd_sscape_probe, - .remove = snd_sscape_remove, /* FIXME: suspend/resume */ .driver = { .name = DEV_NAME @@ -1244,9 +1203,9 @@ static int sscape_pnp_detect(struct pnp_card_link *pcard, * Create a new ALSA sound card entry, in anticipation * of detecting our hardware ... */ - ret = snd_card_new(&pcard->card->dev, - index[idx], id[idx], THIS_MODULE, - sizeof(struct soundscape), &card); + ret = snd_devm_card_new(&pcard->card->dev, + index[idx], id[idx], THIS_MODULE, + sizeof(struct soundscape), &card); if (ret < 0) return ret; @@ -1277,27 +1236,17 @@ static int sscape_pnp_detect(struct pnp_card_link *pcard, ret = create_sscape(idx, card); if (ret < 0) - goto _release_card; + return ret; ret = snd_card_register(card); if (ret < 0) { snd_printk(KERN_ERR "sscape: Failed to register sound card\n"); - goto _release_card; + return ret; } pnp_set_card_drvdata(pcard, card); ++idx; return 0; - -_release_card: - snd_card_free(card); - return ret; -} - -static void sscape_pnp_remove(struct pnp_card_link *pcard) -{ - snd_card_free(pnp_get_card_drvdata(pcard)); - pnp_set_card_drvdata(pcard, NULL); } static struct pnp_card_driver sscape_pnpc_driver = { @@ -1305,7 +1254,6 @@ static struct pnp_card_driver sscape_pnpc_driver = { .name = "sscape", .id_table = sscape_pnpids, .probe = sscape_pnp_detect, - .remove = sscape_pnp_remove, }; #endif /* CONFIG_PNP */ From patchwork Thu Jul 15 07:59:33 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379381 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 27EC6C07E96 for ; Thu, 15 Jul 2021 08:28:12 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 98A96611C0 for ; Thu, 15 Jul 2021 08:28:11 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 98A96611C0 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id 3E16D16F1; Thu, 15 Jul 2021 10:27:20 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 3E16D16F1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626337690; bh=NsTOi7A7XrHjdiN0lE/+CUawVXb9U9dCVSEoPo/7Lxw=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=ZVCO5rky87Xzp7r9AM0eFm3GTm7QvGHsrxuznq4tea0i8/IGsIQd/WemR9Ke70Eeo kw9K7K55tQddvZzLUve5Ekj0nQBZl72jO76sLaIqXJrH9tJKhnz89NarDvl2cEYGPW ugsTuM0ObagWr/d4mio216+PnpnYYf2diKP9Fp3M= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id 16298F804E4; Thu, 15 Jul 2021 10:01:54 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id A6F38F807DC; Thu, 15 Jul 2021 10:01:45 +0200 (CEST) Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 7E02AF805B0 for ; Thu, 15 Jul 2021 10:00:23 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 7E02AF805B0 Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="xefNSzcc"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="WA5BMWGD" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out1.suse.de (Postfix) with ESMTP id 5809622855 for ; Thu, 15 Jul 2021 08:00:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336023; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=SLbHE8gL3568LNDNyp83CCjAj1qzs/+1vwUVbQlIa84=; b=xefNSzccXejLvPuF6MhN4AO8p4+nuzzGs6CBhSywOAZH38EpHy/2GVOPJD1a/gWrQFTwan QADp1CZvdPfy2FllIqNQYBcT0aos1Lz1FyGfWMWYojysd/5/wMO5Sf8I8yXE+KEXfMIxpU br2BgmaxgwMxW3F0dfZdr/tPtlV2Fd4= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336023; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=SLbHE8gL3568LNDNyp83CCjAj1qzs/+1vwUVbQlIa84=; b=WA5BMWGDWWVBceb+szFP03LbI8oNfYWmrCS3u+zf19RCaqziw2U+NkUU7+8n++5u6ygw2F yNOlZqLvJANXXuCQ== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id 45421A3B8F; Thu, 15 Jul 2021 08:00:23 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 71/79] ALSA: wavefront: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:59:33 +0200 Message-Id: <20210715075941.23332-72-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in ISA wavefront driver with devres as a clean up. Each manual resource management is converted with the corresponding devres helper. The remove callback became superfluous and dropped. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- sound/isa/wavefront/wavefront.c | 46 +++++++-------------------------- 1 file changed, 9 insertions(+), 37 deletions(-) diff --git a/sound/isa/wavefront/wavefront.c b/sound/isa/wavefront/wavefront.c index dfdeaf7b6bf4..e6e46a0266b0 100644 --- a/sound/isa/wavefront/wavefront.c +++ b/sound/isa/wavefront/wavefront.c @@ -308,18 +308,6 @@ static struct snd_rawmidi *snd_wavefront_new_midi(struct snd_card *card, return rmidi; } -static void -snd_wavefront_free(struct snd_card *card) -{ - snd_wavefront_card_t *acard = (snd_wavefront_card_t *)card->private_data; - - if (acard) { - release_and_free_resource(acard->wavefront.res_base); - if (acard->wavefront.irq > 0) - free_irq(acard->wavefront.irq, (void *)acard); - } -} - static int snd_wavefront_card_new(struct device *pdev, int dev, struct snd_card **cardp) { @@ -327,8 +315,8 @@ static int snd_wavefront_card_new(struct device *pdev, int dev, snd_wavefront_card_t *acard; int err; - err = snd_card_new(pdev, index[dev], id[dev], THIS_MODULE, - sizeof(snd_wavefront_card_t), &card); + err = snd_devm_card_new(pdev, index[dev], id[dev], THIS_MODULE, + sizeof(snd_wavefront_card_t), &card); if (err < 0) return err; @@ -339,7 +327,6 @@ static int snd_wavefront_card_new(struct device *pdev, int dev, spin_lock_init(&acard->wavefront.midi.open); spin_lock_init(&acard->wavefront.midi.virtual); acard->wavefront.card = card; - card->private_free = snd_wavefront_free; *cardp = card; return 0; @@ -394,15 +381,17 @@ snd_wavefront_probe (struct snd_card *card, int dev) /* ------- ICS2115 Wavetable synth ------- */ - acard->wavefront.res_base = request_region(ics2115_port[dev], 16, - "ICS2115"); + acard->wavefront.res_base = + devm_request_region(card->dev, ics2115_port[dev], 16, + "ICS2115"); if (acard->wavefront.res_base == NULL) { snd_printk(KERN_ERR "unable to grab ICS2115 i/o region 0x%lx-0x%lx\n", ics2115_port[dev], ics2115_port[dev] + 16 - 1); return -EBUSY; } - if (request_irq(ics2115_irq[dev], snd_wavefront_ics2115_interrupt, - 0, "ICS2115", acard)) { + if (devm_request_irq(card->dev, ics2115_irq[dev], + snd_wavefront_ics2115_interrupt, + 0, "ICS2115", acard)) { snd_printk(KERN_ERR "unable to use ICS2115 IRQ %d\n", ics2115_irq[dev]); return -EBUSY; } @@ -556,27 +545,18 @@ static int snd_wavefront_isa_probe(struct device *pdev, if (err < 0) return err; err = snd_wavefront_probe(card, dev); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } dev_set_drvdata(pdev, card); return 0; } -static void snd_wavefront_isa_remove(struct device *devptr, - unsigned int dev) -{ - snd_card_free(dev_get_drvdata(devptr)); -} - #define DEV_NAME "wavefront" static struct isa_driver snd_wavefront_driver = { .match = snd_wavefront_isa_match, .probe = snd_wavefront_isa_probe, - .remove = snd_wavefront_isa_remove, /* FIXME: suspend, resume */ .driver = { .name = DEV_NAME @@ -606,7 +586,6 @@ static int snd_wavefront_pnp_detect(struct pnp_card_link *pcard, if (snd_wavefront_pnp (dev, card->private_data, pcard, pid) < 0) { if (cs4232_pcm_port[dev] == SNDRV_AUTO_PORT) { snd_printk (KERN_ERR "isapnp detection failed\n"); - snd_card_free (card); return -ENODEV; } } @@ -620,18 +599,11 @@ static int snd_wavefront_pnp_detect(struct pnp_card_link *pcard, return 0; } -static void snd_wavefront_pnp_remove(struct pnp_card_link *pcard) -{ - snd_card_free(pnp_get_card_drvdata(pcard)); - pnp_set_card_drvdata(pcard, NULL); -} - static struct pnp_card_driver wavefront_pnpc_driver = { .flags = PNP_DRIVER_RES_DISABLE, .name = "wavefront", .id_table = snd_wavefront_pnpids, .probe = snd_wavefront_pnp_detect, - .remove = snd_wavefront_pnp_remove, /* FIXME: suspend,resume */ }; From patchwork Thu Jul 15 07:59:34 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379387 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id A72E7C07E96 for ; Thu, 15 Jul 2021 08:29:08 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 28100611C0 for ; Thu, 15 Jul 2021 08:29:08 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 28100611C0 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id B7BB6176C; Thu, 15 Jul 2021 10:28:16 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz B7BB6176C DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626337746; bh=1LgK4r7Nt4cZqkoHSz3NM/gpMmd8SDCt8Uebltn1EFI=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=M8clb0PqqNf/DRke5Y8zee5IEwQxCrh0iVKVozqO8fq3kQSg1+zNeCZCeFaUL8z4g hiBsTN/Yws5I7Q15neNTy7F9HvCGK9DVAUhcgOaq6yRm9gFagLpoDghzA7GuA/wmbR g7N+OYIU84eNYDI+IKlT/BKxwg3nTfPCslYYbJ2w= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id B0005F8051C; Thu, 15 Jul 2021 10:01:57 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id A076BF807DC; Thu, 15 Jul 2021 10:01:46 +0200 (CEST) Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id EA91CF804E3 for ; Thu, 15 Jul 2021 10:00:23 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz EA91CF804E3 Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="ivnog7FC"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="1qHayyij" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out1.suse.de (Postfix) with ESMTP id C59F52284F for ; Thu, 15 Jul 2021 08:00:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336023; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=6fmFbwAl0scRniMBGRmt/LYV5Q59V+Yu7zP10IIZFwE=; b=ivnog7FChMq8/6wE1tFilL35CW1/ar/fVHicR8vqRx66Gi3B5p9IMMFlb+9KatY8QgJOLB SelQQn5K+EJGlVblixRtdmYFt5iOtD5Vx1MRxQs4X2A8jS3PNOHdfm8+whgq3mp01IKPa8 vAJUDB8mg+5+9BPvVwf/IvyzsZMJdY4= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336023; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=6fmFbwAl0scRniMBGRmt/LYV5Q59V+Yu7zP10IIZFwE=; b=1qHayyijiqRg4zjRKeUULvrWYGnAhoLcfOhnFjKgZqoezNQbcitxysT771vtKL6Cf3PYps 4bYQNamsRA9jM8CA== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id B49E0A3B9D; Thu, 15 Jul 2021 08:00:23 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 72/79] ALSA: x86: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:59:34 +0200 Message-Id: <20210715075941.23332-73-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in x86 HDMI LPE audio driver with devres as a clean up. Each manual resource management is converted with the corresponding devres helper now. Signed-off-by: Takashi Iwai --- sound/x86/intel_hdmi_audio.c | 57 ++++++++++-------------------------- 1 file changed, 16 insertions(+), 41 deletions(-) diff --git a/sound/x86/intel_hdmi_audio.c b/sound/x86/intel_hdmi_audio.c index 6d87c099d997..d60e532edf5f 100644 --- a/sound/x86/intel_hdmi_audio.c +++ b/sound/x86/intel_hdmi_audio.c @@ -1657,11 +1657,6 @@ static void hdmi_lpe_audio_free(struct snd_card *card) cancel_work_sync(&ctx->hdmi_audio_wq); } - - if (card_ctx->mmio_start) - iounmap(card_ctx->mmio_start); - if (card_ctx->irq >= 0) - free_irq(card_ctx->irq, card_ctx); } /* @@ -1699,8 +1694,8 @@ static int hdmi_lpe_audio_probe(struct platform_device *pdev) } /* create a card instance with ALSA framework */ - ret = snd_card_new(&pdev->dev, hdmi_card_index, hdmi_card_id, - THIS_MODULE, sizeof(*card_ctx), &card); + ret = snd_devm_card_new(&pdev->dev, hdmi_card_index, hdmi_card_id, + THIS_MODULE, sizeof(*card_ctx), &card); if (ret) return ret; @@ -1736,20 +1731,20 @@ static int hdmi_lpe_audio_probe(struct platform_device *pdev) __func__, (unsigned int)res_mmio->start, (unsigned int)res_mmio->end); - card_ctx->mmio_start = ioremap(res_mmio->start, - (size_t)(resource_size(res_mmio))); + card_ctx->mmio_start = + devm_ioremap(&pdev->dev, res_mmio->start, + (size_t)(resource_size(res_mmio))); if (!card_ctx->mmio_start) { dev_err(&pdev->dev, "Could not get ioremap\n"); - ret = -EACCES; - goto err; + return -EACCES; } /* setup interrupt handler */ - ret = request_irq(irq, display_pipe_interrupt_handler, 0, - pdev->name, card_ctx); + ret = devm_request_irq(&pdev->dev, irq, display_pipe_interrupt_handler, + 0, pdev->name, card_ctx); if (ret < 0) { dev_err(&pdev->dev, "request_irq failed\n"); - goto err; + return ret; } card_ctx->irq = irq; @@ -1769,7 +1764,7 @@ static int hdmi_lpe_audio_probe(struct platform_device *pdev) ret = snd_pcm_new(card, INTEL_HAD, port, MAX_PB_STREAMS, MAX_CAP_STREAMS, &pcm); if (ret) - goto err; + return ret; /* setup private data which can be retrieved when required */ pcm->private_data = ctx; @@ -1790,31 +1785,29 @@ static int hdmi_lpe_audio_probe(struct platform_device *pdev) struct snd_kcontrol *kctl; kctl = snd_ctl_new1(&had_controls[i], ctx); - if (!kctl) { - ret = -ENOMEM; - goto err; - } + if (!kctl) + return -ENOMEM; kctl->id.device = pcm->device; ret = snd_ctl_add(card, kctl); if (ret < 0) - goto err; + return ret; } /* Register channel map controls */ ret = had_register_chmap_ctls(ctx, pcm); if (ret < 0) - goto err; + return ret; ret = had_create_jack(ctx, pcm); if (ret < 0) - goto err; + return ret; } ret = snd_card_register(card); if (ret) - goto err; + return ret; spin_lock_irq(&pdata->lpe_audio_slock); pdata->notify_audio_lpe = notify_audio_lpe; @@ -1831,23 +1824,6 @@ static int hdmi_lpe_audio_probe(struct platform_device *pdev) } return 0; - -err: - snd_card_free(card); - return ret; -} - -/* - * hdmi_lpe_audio_remove - stop bridge with i915 - * - * This function is called when the platform device is destroyed. - */ -static int hdmi_lpe_audio_remove(struct platform_device *pdev) -{ - struct snd_intelhad_card *card_ctx = platform_get_drvdata(pdev); - - snd_card_free(card_ctx->card); - return 0; } static const struct dev_pm_ops hdmi_lpe_audio_pm = { @@ -1860,7 +1836,6 @@ static struct platform_driver hdmi_lpe_audio_driver = { .pm = &hdmi_lpe_audio_pm, }, .probe = hdmi_lpe_audio_probe, - .remove = hdmi_lpe_audio_remove, }; module_platform_driver(hdmi_lpe_audio_driver); From patchwork Thu Jul 15 07:59:35 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379385 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4EE15C07E96 for ; Thu, 15 Jul 2021 08:28:52 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id CFB57611C0 for ; Thu, 15 Jul 2021 08:28:51 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org CFB57611C0 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id 63AA61758; Thu, 15 Jul 2021 10:28:00 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 63AA61758 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626337730; bh=BcouPs2oiOXfISqCuhU9v3hJt1yTHbZsJ/KJv8DjMYQ=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=kwnh0PUB7zdm920NeXmIdd5qC0nFfe6+3qU8Eu8M49wQRuSaKDiKDcCsTuvjmiu6T Dk4b7xiRQi4uyrGxviVkdOSQRIx53Tci5Wp7zRzZ72gyS58LaKGGd/XxMGvqROpfTt HlQmU/+jqr67TKCF6GxTRED6EiKY2txHtv7wsSd4= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id B93E0F80852; Thu, 15 Jul 2021 10:01:56 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id 6B075F807DE; Thu, 15 Jul 2021 10:01:46 +0200 (CEST) Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 6276BF804E5 for ; Thu, 15 Jul 2021 10:00:24 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 6276BF804E5 Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="pvUtnCip"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="ALOOgWRi" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out1.suse.de (Postfix) with ESMTP id 3B45622856 for ; Thu, 15 Jul 2021 08:00:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336024; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=WBwQBJBGsn4PeR2I3zEBE2ni2A8jQnZMXEn2wo06JxI=; b=pvUtnCipJzm+FkYNV4hfK8pgwFJZEY7AuwpW3XDB8/icM9f9aCeFXPHnAO2shDFHdcx2Au 0MJ6BJVnylVWhazH8dw+XpZakQBYk7VVA+hskPgC1B6X6MErZdGB2P0UP5ajyUCvtepV73 sHwtrC4sPsW/6quvSMyxXrpp4cnou2g= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336024; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=WBwQBJBGsn4PeR2I3zEBE2ni2A8jQnZMXEn2wo06JxI=; b=ALOOgWRiR1LfwyzZKuhn8IvlPftp9tWH1TZehIYrhEYO7x4IJcH+otCKzLIXz7Xb1GYbtr TBU6vN3btUSzR+BQ== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id 29E58A3B8F; Thu, 15 Jul 2021 08:00:24 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 73/79] ALSA: virmidi: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:59:35 +0200 Message-Id: <20210715075941.23332-74-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the card object management with devres as a clean up. The remove callback gets reduced by that. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- sound/drivers/virmidi.c | 21 ++++++--------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/sound/drivers/virmidi.c b/sound/drivers/virmidi.c index 4206d93ab47e..7f7eed6faaae 100644 --- a/sound/drivers/virmidi.c +++ b/sound/drivers/virmidi.c @@ -75,8 +75,8 @@ static int snd_virmidi_probe(struct platform_device *devptr) int idx, err; int dev = devptr->id; - err = snd_card_new(&devptr->dev, index[dev], id[dev], THIS_MODULE, - sizeof(struct snd_card_virmidi), &card); + err = snd_devm_card_new(&devptr->dev, index[dev], id[dev], THIS_MODULE, + sizeof(struct snd_card_virmidi), &card); if (err < 0) return err; vmidi = card->private_data; @@ -94,7 +94,7 @@ static int snd_virmidi_probe(struct platform_device *devptr) err = snd_virmidi_new(card, idx, &rmidi); if (err < 0) - goto __nodev; + return err; rdev = rmidi->private_data; vmidi->midi[idx] = rmidi; strcpy(rmidi->name, "Virtual Raw MIDI"); @@ -106,18 +106,10 @@ static int snd_virmidi_probe(struct platform_device *devptr) sprintf(card->longname, "Virtual MIDI Card %i", dev + 1); err = snd_card_register(card); - if (!err) { - platform_set_drvdata(devptr, card); - return 0; - } -__nodev: - snd_card_free(card); - return err; -} + if (err) + return err; -static int snd_virmidi_remove(struct platform_device *devptr) -{ - snd_card_free(platform_get_drvdata(devptr)); + platform_set_drvdata(devptr, card); return 0; } @@ -125,7 +117,6 @@ static int snd_virmidi_remove(struct platform_device *devptr) static struct platform_driver snd_virmidi_driver = { .probe = snd_virmidi_probe, - .remove = snd_virmidi_remove, .driver = { .name = SND_VIRMIDI_DRIVER, }, From patchwork Thu Jul 15 07:59:36 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379393 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 64517C07E96 for ; Thu, 15 Jul 2021 08:30:25 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id DCDFF6127C for ; Thu, 15 Jul 2021 08:30:23 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org DCDFF6127C Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id 64A821787; Thu, 15 Jul 2021 10:29:32 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 64A821787 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626337822; bh=h/HJYUIQ3H10Nk8LVYQibcebt4L9OhjMroqVoklppgE=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=CS9mUzSfsl9Ruo30BTlBbKK0JiM8CYTBbgQ2+CJ45eaNkr2i2/Kn/qBzW9ZuGyOJC 6bMjPgFtY2Ta0wi5b6B4Wrd9yNwzn1TwiI9ib8q5xJTp5ScHlmqPmY1QOkjdOq/hBa qk+SYl0Vky55qNkQ0Ca8Fer8FPy9aYlbZiMyx+Ek= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id 0E593F80879; Thu, 15 Jul 2021 10:02:01 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id 55294F80844; Thu, 15 Jul 2021 10:01:53 +0200 (CEST) Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id BC24AF804E4 for ; Thu, 15 Jul 2021 10:00:25 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz BC24AF804E4 Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="fAWozdqs"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="gv0TAVUD" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out1.suse.de (Postfix) with ESMTP id 61CD021D3D for ; Thu, 15 Jul 2021 08:00:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336025; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=W+X/2bTEhxb1+unE4n5+9Yg7YPVtnmR7yNJ0qjGYang=; b=fAWozdqsh+g1l0WiVvEhEDcMVg1kGwoG9AiQLXb+CGVoXGc84S74z+BSWH7xQ6nOJXgRr+ QPqPDCLja9UoiYx9Au3xQb673OBWSchEi1M6ZYJF49Zicj713OONgZl4+ofjKzIykprv6A vJmirJyXV8gTsoO9HZEYRrAXFVOWm5E= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336025; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=W+X/2bTEhxb1+unE4n5+9Yg7YPVtnmR7yNJ0qjGYang=; b=gv0TAVUDRVlk6x+MhNq3LqbIuiuHhGISJnOuovTNy23rdeNfMD5rEylnA5imVPH0cnd+Uw aqVERvKWk8OjVzDw== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id 4F4DFA3B8F; Thu, 15 Jul 2021 08:00:25 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 74/79] ALSA: mtpav: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:59:36 +0200 Message-Id: <20210715075941.23332-75-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in mtpav driver with devres as a clean up. Each manual resource management is converted with the corresponding devres helper now. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- sound/drivers/mtpav.c | 30 +++++++++--------------------- 1 file changed, 9 insertions(+), 21 deletions(-) diff --git a/sound/drivers/mtpav.c b/sound/drivers/mtpav.c index 0e95b08d34d6..11235baaf6fa 100644 --- a/sound/drivers/mtpav.c +++ b/sound/drivers/mtpav.c @@ -566,13 +566,15 @@ static irqreturn_t snd_mtpav_irqh(int irq, void *dev_id) */ static int snd_mtpav_get_ISA(struct mtpav *mcard) { - mcard->res_port = request_region(port, 3, "MotuMTPAV MIDI"); + mcard->res_port = devm_request_region(mcard->card->dev, port, 3, + "MotuMTPAV MIDI"); if (!mcard->res_port) { snd_printk(KERN_ERR "MTVAP port 0x%lx is busy\n", port); return -EBUSY; } mcard->port = port; - if (request_irq(irq, snd_mtpav_irqh, 0, "MOTU MTPAV", mcard)) { + if (devm_request_irq(mcard->card->dev, irq, snd_mtpav_irqh, 0, + "MOTU MTPAV", mcard)) { snd_printk(KERN_ERR "MTVAP IRQ %d busy\n", irq); return -EBUSY; } @@ -667,9 +669,6 @@ static void snd_mtpav_free(struct snd_card *card) if (crd->istimer > 0) snd_mtpav_remove_output_timer(crd); spin_unlock_irqrestore(&crd->spinlock, flags); - if (crd->irq >= 0) - free_irq(crd->irq, (void *)crd); - release_and_free_resource(crd->res_port); } /* @@ -680,8 +679,8 @@ static int snd_mtpav_probe(struct platform_device *dev) int err; struct mtpav *mtp_card; - err = snd_card_new(&dev->dev, index, id, THIS_MODULE, - sizeof(*mtp_card), &card); + err = snd_devm_card_new(&dev->dev, index, id, THIS_MODULE, + sizeof(*mtp_card), &card); if (err < 0) return err; @@ -698,13 +697,13 @@ static int snd_mtpav_probe(struct platform_device *dev) err = snd_mtpav_get_RAWMIDI(mtp_card); if (err < 0) - goto __error; + return err; mtp_card->inmidiport = mtp_card->num_ports + MTPAV_PIDX_BROADCAST; err = snd_mtpav_get_ISA(mtp_card); if (err < 0) - goto __error; + return err; strcpy(card->driver, "MTPAV"); strcpy(card->shortname, "MTPAV on parallel port"); @@ -715,28 +714,17 @@ static int snd_mtpav_probe(struct platform_device *dev) err = snd_card_register(mtp_card->card); if (err < 0) - goto __error; + return err; platform_set_drvdata(dev, card); printk(KERN_INFO "Motu MidiTimePiece on parallel port irq: %d ioport: 0x%lx\n", irq, port); return 0; - - __error: - snd_card_free(card); - return err; -} - -static int snd_mtpav_remove(struct platform_device *devptr) -{ - snd_card_free(platform_get_drvdata(devptr)); - return 0; } #define SND_MTPAV_DRIVER "snd_mtpav" static struct platform_driver snd_mtpav_driver = { .probe = snd_mtpav_probe, - .remove = snd_mtpav_remove, .driver = { .name = SND_MTPAV_DRIVER, }, From patchwork Thu Jul 15 07:59:37 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379391 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 747C2C07E96 for ; Thu, 15 Jul 2021 08:30:00 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id EE1FF6127C for ; Thu, 15 Jul 2021 08:29:59 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org EE1FF6127C Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id 6D94A16E1; Thu, 15 Jul 2021 10:29:08 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 6D94A16E1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626337798; bh=ikXnwzJZ5my4pJOsNUJLH1f9DfRUdtT8Vdutbg8Rja0=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=beA8/7nhB+WAQNYlJo3RV0kSxD8PAJI5EfOSihKrfvLLFrhOVFwOmPyVX7AN6jDQZ ERcorbjVGWGPuCZ4rlku0FwS1Y1sj+YlkQS0m2t7Ppq/8ptbwrsglk9fGF+i2IV1x+ w/XwXijhMik8UAPbga0XhDaJxlp88xyMZsTYa5Vw= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id 7AC5DF80862; Thu, 15 Jul 2021 10:02:00 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id C3D9FF804E2; Thu, 15 Jul 2021 10:01:52 +0200 (CEST) Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 12B0BF804E2 for ; Thu, 15 Jul 2021 10:00:26 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 12B0BF804E2 Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="E7zSmzve"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="q7WF2HBX" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out2.suse.de (Postfix) with ESMTP id CF6121FDEA for ; Thu, 15 Jul 2021 08:00:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336025; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=gCd9c1zgyBBKJAW/4WqODYcciQ3eutX3GjhAua4snGU=; b=E7zSmzvesx/PYgyzVaPbb/4UmK2QVC2kl9xLoNVZGnG4spnrMSodUCEVadZrg9QRZlLNn1 yniSkSn7U4MKCq2fCCae5GGUXxF0JlRXUZLC7k41MtXzWTjhGXlbOTUj8mjl+F4cG+EEwp 1S/9ecwPT18QjN3gVPVwf5CeoXgC2sU= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336025; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=gCd9c1zgyBBKJAW/4WqODYcciQ3eutX3GjhAua4snGU=; b=q7WF2HBXsCCmi3eBHVktBed/YGfb6S+tYtE3KHyfqoKC3znnkEdRqteDs1NaB6x7OW0pnj S7wPk22BvDvb88AQ== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id C0016A3BA4; Thu, 15 Jul 2021 08:00:25 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 75/79] ALSA: serial-u16550: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:59:37 +0200 Message-Id: <20210715075941.23332-76-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the resource management in serial u16550 driver with devres as a clean up. Each manual resource management is converted with the corresponding devres helper, and the card object release is managed now via card->private_free instead of a lowlevel snd_device. This should give no user-visible functional changes. Signed-off-by: Takashi Iwai --- sound/drivers/serial-u16550.c | 57 ++++++----------------------------- 1 file changed, 9 insertions(+), 48 deletions(-) diff --git a/sound/drivers/serial-u16550.c b/sound/drivers/serial-u16550.c index da9983cba01c..3cbc7a4adcb4 100644 --- a/sound/drivers/serial-u16550.c +++ b/sound/drivers/serial-u16550.c @@ -115,7 +115,6 @@ struct snd_uart16550 { int irq; unsigned long base; - struct resource *res_base; unsigned int speed; unsigned int speed_base; @@ -323,8 +322,7 @@ static int snd_uart16550_detect(struct snd_uart16550 *uart) return -ENODEV; /* Not configured */ } - uart->res_base = request_region(io_base, 8, "Serial MIDI"); - if (uart->res_base == NULL) { + if (!devm_request_region(uart->card->dev, io_base, 8, "Serial MIDI")) { snd_printk(KERN_ERR "u16550: can't grab port 0x%lx\n", io_base); return -EBUSY; } @@ -752,21 +750,6 @@ static const struct snd_rawmidi_ops snd_uart16550_input = .trigger = snd_uart16550_input_trigger, }; -static int snd_uart16550_free(struct snd_uart16550 *uart) -{ - if (uart->irq >= 0) - free_irq(uart->irq, uart); - release_and_free_resource(uart->res_base); - kfree(uart); - return 0; -}; - -static int snd_uart16550_dev_free(struct snd_device *device) -{ - struct snd_uart16550 *uart = device->device_data; - return snd_uart16550_free(uart); -} - static int snd_uart16550_create(struct snd_card *card, unsigned long iobase, int irq, @@ -776,14 +759,11 @@ static int snd_uart16550_create(struct snd_card *card, int droponfull, struct snd_uart16550 **ruart) { - static const struct snd_device_ops ops = { - .dev_free = snd_uart16550_dev_free, - }; struct snd_uart16550 *uart; int err; - uart = kzalloc(sizeof(*uart), GFP_KERNEL); + uart = devm_kzalloc(card->dev, sizeof(*uart), GFP_KERNEL); if (!uart) return -ENOMEM; uart->adaptor = adaptor; @@ -796,13 +776,12 @@ static int snd_uart16550_create(struct snd_card *card, err = snd_uart16550_detect(uart); if (err <= 0) { printk(KERN_ERR "no UART detected at 0x%lx\n", iobase); - snd_uart16550_free(uart); return -ENODEV; } if (irq >= 0 && irq != SNDRV_AUTO_IRQ) { - if (request_irq(irq, snd_uart16550_interrupt, - 0, "Serial MIDI", uart)) { + if (devm_request_irq(card->dev, irq, snd_uart16550_interrupt, + 0, "Serial MIDI", uart)) { snd_printk(KERN_WARNING "irq %d busy. Using Polling.\n", irq); } else { @@ -819,13 +798,6 @@ static int snd_uart16550_create(struct snd_card *card, timer_setup(&uart->buffer_timer, snd_uart16550_buffer_timer, 0); uart->timer_running = 0; - /* Register device */ - err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, uart, &ops); - if (err < 0) { - snd_uart16550_free(uart); - return err; - } - switch (uart->adaptor) { case SNDRV_SERIAL_MS124W_SA: case SNDRV_SERIAL_MS124W_MB: @@ -927,8 +899,8 @@ static int snd_serial_probe(struct platform_device *devptr) return -ENODEV; } - err = snd_card_new(&devptr->dev, index[dev], id[dev], THIS_MODULE, - 0, &card); + err = snd_devm_card_new(&devptr->dev, index[dev], id[dev], THIS_MODULE, + 0, &card); if (err < 0) return err; @@ -939,11 +911,11 @@ static int snd_serial_probe(struct platform_device *devptr) base[dev], adaptor[dev], droponfull[dev], &uart); if (err < 0) - goto _err; + return err; err = snd_uart16550_rmidi(uart, 0, outs[dev], ins[dev], &uart->rmidi); if (err < 0) - goto _err; + return err; sprintf(card->longname, "%s [%s] at %#lx, irq %d", card->shortname, @@ -953,27 +925,16 @@ static int snd_serial_probe(struct platform_device *devptr) err = snd_card_register(card); if (err < 0) - goto _err; + return err; platform_set_drvdata(devptr, card); return 0; - - _err: - snd_card_free(card); - return err; -} - -static int snd_serial_remove(struct platform_device *devptr) -{ - snd_card_free(platform_get_drvdata(devptr)); - return 0; } #define SND_SERIAL_DRIVER "snd_serial_u16550" static struct platform_driver snd_serial_driver = { .probe = snd_serial_probe, - .remove = snd_serial_remove, .driver = { .name = SND_SERIAL_DRIVER, }, From patchwork Thu Jul 15 07:59:38 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379399 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 90871C07E96 for ; Thu, 15 Jul 2021 08:31:26 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 170A96120A for ; Thu, 15 Jul 2021 08:31:26 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 170A96120A Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id A66621799; Thu, 15 Jul 2021 10:30:34 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz A66621799 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626337884; bh=gNYrnzJBD7oS1I0cMqnEXaic/oz0sKeijbKW5AxDeNs=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=CfsxmJv3zscJnnX7ODj3wal/RXRZUeD7rCoLlDCZviUknK6xhHEpuIR+YV8r4mgil jH0MdKTDzzxTEj9Tq6JSLCcw2mC9cII4pob8NkmBEQ951awu6r1civW8uZEmlb9K6E wNRpj+P7IJLV9slggi1O60ugEOztJ3uhM6IvxszQ= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id EA641F808C3; Thu, 15 Jul 2021 10:02:02 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id 2E35BF80844; Thu, 15 Jul 2021 10:01:54 +0200 (CEST) Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 9E1B7F805B6 for ; Thu, 15 Jul 2021 10:00:26 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 9E1B7F805B6 Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="jG0yaZpv"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="X3D/7SaG" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out1.suse.de (Postfix) with ESMTP id 682DC22285 for ; Thu, 15 Jul 2021 08:00:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336026; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=1dr4v6qn4IruHDbmov8fH0fheRl/U9KVdzrtudFX2VU=; b=jG0yaZpv6lUdiJ2g528Vvnda7USgtPQxrglT24Dl5E9o1KHC1omn8V/T4ylQKN6T7BNUX4 Az+bicn812ndip9YxlVAlDNPGYDjIIa/FM83NQL2UnrFOOHg8ebr0C8QbjR76V5mpspxqa lCHpsKsgVaUWgs76MdPjh3cjy/CKu5I= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336026; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=1dr4v6qn4IruHDbmov8fH0fheRl/U9KVdzrtudFX2VU=; b=X3D/7SaGLDyHqTBi3qOof0cllqT1F93z3Vmf26Hl9ZS1gV0Cwll6q7pGRbp1x9v4z0gDUk tf1M0bdT816C3hCA== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id 54A63A3BBA; Thu, 15 Jul 2021 08:00:26 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 76/79] ALSA: mpu401: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:59:38 +0200 Message-Id: <20210715075941.23332-77-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This patch converts the card object management with devres as a clean up. The remove callback gets reduced by that. This should give no user-visible functional changes. Note that this converts only the mpu401 card driver. The mpu401_uart component is still managed with snd_device. It's for the case where the mpu401_uart component may be removed dynamically without the actual device unbind. Signed-off-by: Takashi Iwai --- sound/drivers/mpu401/mpu401.c | 34 +++++----------------------------- 1 file changed, 5 insertions(+), 29 deletions(-) diff --git a/sound/drivers/mpu401/mpu401.c b/sound/drivers/mpu401/mpu401.c index d0b55dbb411a..3398aee33baa 100644 --- a/sound/drivers/mpu401/mpu401.c +++ b/sound/drivers/mpu401/mpu401.c @@ -59,8 +59,8 @@ static int snd_mpu401_create(struct device *devptr, int dev, snd_printk(KERN_ERR "the uart_enter option is obsolete; remove it\n"); *rcard = NULL; - err = snd_card_new(devptr, index[dev], id[dev], THIS_MODULE, - 0, &card); + err = snd_devm_card_new(devptr, index[dev], id[dev], THIS_MODULE, + 0, &card); if (err < 0) return err; strcpy(card->driver, "MPU-401 UART"); @@ -76,15 +76,11 @@ static int snd_mpu401_create(struct device *devptr, int dev, irq[dev], NULL); if (err < 0) { printk(KERN_ERR "MPU401 not detected at 0x%lx\n", port[dev]); - goto _err; + return err; } *rcard = card; return 0; - - _err: - snd_card_free(card); - return err; } static int snd_mpu401_probe(struct platform_device *devptr) @@ -105,25 +101,16 @@ static int snd_mpu401_probe(struct platform_device *devptr) if (err < 0) return err; err = snd_card_register(card); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } platform_set_drvdata(devptr, card); return 0; } -static int snd_mpu401_remove(struct platform_device *devptr) -{ - snd_card_free(platform_get_drvdata(devptr)); - return 0; -} - #define SND_MPU401_DRIVER "snd_mpu401" static struct platform_driver snd_mpu401_driver = { .probe = snd_mpu401_probe, - .remove = snd_mpu401_remove, .driver = { .name = SND_MPU401_DRIVER, }, @@ -184,10 +171,8 @@ static int snd_mpu401_pnp_probe(struct pnp_dev *pnp_dev, if (err < 0) return err; err = snd_card_register(card); - if (err < 0) { - snd_card_free(card); + if (err < 0) return err; - } pnp_set_drvdata(pnp_dev, card); snd_mpu401_devices++; ++dev; @@ -196,19 +181,10 @@ static int snd_mpu401_pnp_probe(struct pnp_dev *pnp_dev, return -ENODEV; } -static void snd_mpu401_pnp_remove(struct pnp_dev *dev) -{ - struct snd_card *card = (struct snd_card *) pnp_get_drvdata(dev); - - snd_card_disconnect(card); - snd_card_free_when_closed(card); -} - static struct pnp_driver snd_mpu401_pnp_driver = { .name = "mpu401", .id_table = snd_mpu401_pnpids, .probe = snd_mpu401_pnp_probe, - .remove = snd_mpu401_pnp_remove, }; #else static struct pnp_driver snd_mpu401_pnp_driver; From patchwork Thu Jul 15 07:59:39 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379397 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 055ABC07E96 for ; Thu, 15 Jul 2021 08:31:08 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 5D18A6120A for ; Thu, 15 Jul 2021 08:31:07 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 5D18A6120A Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id EABAF1790; Thu, 15 Jul 2021 10:30:15 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz EABAF1790 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626337866; bh=2SmcCjFcjQPx/wvX1ZIYejRsTsdh6xlVOmCKJS2/2RQ=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=k+tlPIvkpqlob4m6zLjoC6J6bHHvTg7hcXdXLn3bvowW31c9PPgTh9u1cCFtXA9iQ mOBdOk8UZNzrxEyoHftjbkpOyDX6NXAwX1kn4z9DMhiUAYwjeVjVY/TtwuvzurASOW LtpD+QiPpOT6haVlFGfcz6bJ/zUZ1FbeIv3vKaNE= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id 6C9F3F808BB; Thu, 15 Jul 2021 10:02:02 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id 24CE6F80845; Thu, 15 Jul 2021 10:01:54 +0200 (CEST) Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 194BFF805C3 for ; Thu, 15 Jul 2021 10:00:27 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 194BFF805C3 Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="bodB12GR"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="xz3NEwIs" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out2.suse.de (Postfix) with ESMTP id DDE171FD3E for ; Thu, 15 Jul 2021 08:00:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336026; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=/pz+RApgN44AKKQQ1URRIssEFrG77OnAyrrJtH5E+/Q=; b=bodB12GRqtB5UyMdKTyQsIcUUkY0iqRA3OSzLMCU4WqMya1tUh+9LoBgd1s3s2a7pJTNKr dfoGh+YWVXl/8Tdo8onajQXk9wF3GwVIxS6sBvxutTkG3u+Nqd5wXz3/vrXwsLELMwwDbx ang0gkgcsfBII9wSXlhiNrjsHzN4Pj4= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336026; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=/pz+RApgN44AKKQQ1URRIssEFrG77OnAyrrJtH5E+/Q=; b=xz3NEwIsAcD6Gmm9PR3gFg/aw8Vb82lHFSQe4tCbP4A+1q303GATulkaq6WOwit35R8dde 5CsSeTNwEY7lzkCQ== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id CD9E3A3B8F; Thu, 15 Jul 2021 08:00:26 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 77/79] ALSA: aloop: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:59:39 +0200 Message-Id: <20210715075941.23332-78-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" Use the new snd_devm_card_new() for the card object allocation, and clean up the superfluous remove callback. Signed-off-by: Takashi Iwai --- sound/drivers/aloop.c | 26 ++++++++------------------ 1 file changed, 8 insertions(+), 18 deletions(-) diff --git a/sound/drivers/aloop.c b/sound/drivers/aloop.c index 80b814b9922a..9b4a7cdb103a 100644 --- a/sound/drivers/aloop.c +++ b/sound/drivers/aloop.c @@ -1712,8 +1712,8 @@ static int loopback_probe(struct platform_device *devptr) int dev = devptr->id; int err; - err = snd_card_new(&devptr->dev, index[dev], id[dev], THIS_MODULE, - sizeof(struct loopback), &card); + err = snd_devm_card_new(&devptr->dev, index[dev], id[dev], THIS_MODULE, + sizeof(struct loopback), &card); if (err < 0) return err; loopback = card->private_data; @@ -1730,13 +1730,13 @@ static int loopback_probe(struct platform_device *devptr) err = loopback_pcm_new(loopback, 0, pcm_substreams[dev]); if (err < 0) - goto __nodev; + return err; err = loopback_pcm_new(loopback, 1, pcm_substreams[dev]); if (err < 0) - goto __nodev; + return err; err = loopback_mixer_new(loopback, pcm_notify[dev] ? 1 : 0); if (err < 0) - goto __nodev; + return err; loopback_cable_proc_new(loopback, 0); loopback_cable_proc_new(loopback, 1); loopback_timer_source_proc_new(loopback); @@ -1744,18 +1744,9 @@ static int loopback_probe(struct platform_device *devptr) strcpy(card->shortname, "Loopback"); sprintf(card->longname, "Loopback %i", dev + 1); err = snd_card_register(card); - if (!err) { - platform_set_drvdata(devptr, card); - return 0; - } - __nodev: - snd_card_free(card); - return err; -} - -static int loopback_remove(struct platform_device *devptr) -{ - snd_card_free(platform_get_drvdata(devptr)); + if (err < 0) + return err; + platform_set_drvdata(devptr, card); return 0; } @@ -1786,7 +1777,6 @@ static SIMPLE_DEV_PM_OPS(loopback_pm, loopback_suspend, loopback_resume); static struct platform_driver loopback_driver = { .probe = loopback_probe, - .remove = loopback_remove, .driver = { .name = SND_LOOPBACK_DRIVER, .pm = LOOPBACK_PM_OPS, From patchwork Thu Jul 15 07:59:40 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379395 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3CA51C47E48 for ; Thu, 15 Jul 2021 08:30:41 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 6358361374 for ; Thu, 15 Jul 2021 08:30:40 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 6358361374 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id D18CA178D; Thu, 15 Jul 2021 10:29:48 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz D18CA178D DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626337838; bh=BrnnahUI/+BrdJk1v74pDJ5S3309FQKChtYS0sh9WMY=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=nwVLS/0uryMxvNo9fjk/cXqeoWqD9OXAcKAwh5gujWK9VNRjtfqcXYRgse8ObcL0T 35iknNh+1oDLJRcmpN6A47UHOKdPIALsX6L5A/1O18nJocSZIpYkYr73fgJewRzeHx W6n4aAva4BxP6IIZM42JAEEgwn8uP0YYDwUDHFwA= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id 9DD44F8087D; Thu, 15 Jul 2021 10:02:01 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id AD2FAF80834; Thu, 15 Jul 2021 10:01:53 +0200 (CEST) Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id AC2CCF805C1 for ; Thu, 15 Jul 2021 10:00:27 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz AC2CCF805C1 Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="BWuBZbSq"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="8DFFwlzN" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out2.suse.de (Postfix) with ESMTP id 823BA1FDEA for ; Thu, 15 Jul 2021 08:00:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336027; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=T9/wjL8XOFPcYFn7iEzZ+N6ui4168KzCi9G2P7u0p70=; b=BWuBZbSqQJtj8ejT3muO6JDS/Ypch761+HRtdC6b77tQCGWqQizoEuuJyAL0ZBzp0d0UI5 MD31gVgpzkV4FXCJPFCmw/bqB9SHOZHAVqCHiPrVLI6vYRQQMLviqpKoZkjM8RV9wUn3Bf FLrLfgGu8wKDt0pC2D9YxL5CVh9HSnE= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336027; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=T9/wjL8XOFPcYFn7iEzZ+N6ui4168KzCi9G2P7u0p70=; b=8DFFwlzNUtyItbwCrw1sXmKiCG52qy8k/dTNvr0n/I/4MLh4iyKPF4pbZ/MyGeaxJX/RAz KkwRXwCXQkeRLcBg== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id 72384A3B8F; Thu, 15 Jul 2021 08:00:27 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 78/79] ALSA: dummy: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:59:40 +0200 Message-Id: <20210715075941.23332-79-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" Use the new snd_devm_card_new() for the card object allocation, and clean up the superfluous remove callback. Signed-off-by: Takashi Iwai --- sound/drivers/dummy.c | 24 +++++++----------------- 1 file changed, 7 insertions(+), 17 deletions(-) diff --git a/sound/drivers/dummy.c b/sound/drivers/dummy.c index 01a3eab50d7b..2a7fc49c1a7c 100644 --- a/sound/drivers/dummy.c +++ b/sound/drivers/dummy.c @@ -1025,8 +1025,8 @@ static int snd_dummy_probe(struct platform_device *devptr) int idx, err; int dev = devptr->id; - err = snd_card_new(&devptr->dev, index[dev], id[dev], THIS_MODULE, - sizeof(struct snd_dummy), &card); + err = snd_devm_card_new(&devptr->dev, index[dev], id[dev], THIS_MODULE, + sizeof(struct snd_dummy), &card); if (err < 0) return err; dummy = card->private_data; @@ -1047,7 +1047,7 @@ static int snd_dummy_probe(struct platform_device *devptr) pcm_substreams[dev] = MAX_PCM_SUBSTREAMS; err = snd_card_dummy_pcm(dummy, idx, pcm_substreams[dev]); if (err < 0) - goto __nodev; + return err; } dummy->pcm_hw = dummy_pcm_hardware; @@ -1078,7 +1078,7 @@ static int snd_dummy_probe(struct platform_device *devptr) err = snd_card_dummy_new_mixer(dummy); if (err < 0) - goto __nodev; + return err; strcpy(card->driver, "Dummy"); strcpy(card->shortname, "Dummy"); sprintf(card->longname, "Dummy %i", dev + 1); @@ -1086,18 +1086,9 @@ static int snd_dummy_probe(struct platform_device *devptr) dummy_proc_init(dummy); err = snd_card_register(card); - if (err == 0) { - platform_set_drvdata(devptr, card); - return 0; - } - __nodev: - snd_card_free(card); - return err; -} - -static int snd_dummy_remove(struct platform_device *devptr) -{ - snd_card_free(platform_get_drvdata(devptr)); + if (err < 0) + return err; + platform_set_drvdata(devptr, card); return 0; } @@ -1128,7 +1119,6 @@ static SIMPLE_DEV_PM_OPS(snd_dummy_pm, snd_dummy_suspend, snd_dummy_resume); static struct platform_driver snd_dummy_driver = { .probe = snd_dummy_probe, - .remove = snd_dummy_remove, .driver = { .name = SND_DUMMY_DRIVER, .pm = SND_DUMMY_PM_OPS, From patchwork Thu Jul 15 07:59:41 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takashi Iwai X-Patchwork-Id: 12379401 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1646DC07E96 for ; Thu, 15 Jul 2021 08:31:58 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 94FAC6120A for ; Thu, 15 Jul 2021 08:31:57 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 94FAC6120A Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id 1FA351735; Thu, 15 Jul 2021 10:31:06 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 1FA351735 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1626337916; bh=iBsXn4w2dJ4CyMPTkybYJPdDpIu8nu6+vmNTQ/CbzGw=; h=From:To:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=sDd/KuzUc9Yaey91+/HQE2hIH/FEuqXcMbQQ/rULoH977Rc8jP/K7uVlnKsVgxH+D q9WM1pUdpiWNsjqbf7is1c9rXOwbNu4p6HIMlaLGOVPaTGRhYz8ggniEE3bxea7AnV 2//fH9n8+puny+UaqD4mMv1nuA/OXGtL5boGPZcE= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id 05083F808F4; Thu, 15 Jul 2021 10:02:04 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id EBC96F80858; Thu, 15 Jul 2021 10:01:57 +0200 (CEST) Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 3FA99F805C5 for ; Thu, 15 Jul 2021 10:00:28 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 3FA99F805C5 Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="YDATGMTw"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="xkAYDWvN" Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out2.suse.de (Postfix) with ESMTP id 15E051FDEB for ; Thu, 15 Jul 2021 08:00:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1626336028; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=hsL3EB2EcG8KWez8PWBtNZ+HiyZkGGHXHw4xv/wdK5Q=; b=YDATGMTwHrzXFA7ljru4OKcv8aPnzcOxTGsQWdZ3o5tVOz+7c7ZPD0shUEpgsPf2Ik8ANs hMcaClGUtZhfEY2cmjhkcC9YlfF+eqRZYMbv4XWjYO4gz/SjxRjP6sXqAUwVpW53Py+wy6 kbYMRccJRj4HBpG0lzs4Wf0qGr4liZs= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1626336028; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=hsL3EB2EcG8KWez8PWBtNZ+HiyZkGGHXHw4xv/wdK5Q=; b=xkAYDWvN76kt3eoyeQRB1ZMiig28N4NLrtONVqhEgitj5Ag5MgX7eBXQ91QGoTfBzOjQvO qJiT5g5hkr2Ft+Cg== Received: from alsa1.nue.suse.com (alsa1.suse.de [10.160.4.42]) by relay2.suse.de (Postfix) with ESMTP id 04ACAA3B8F; Thu, 15 Jul 2021 08:00:28 +0000 (UTC) From: Takashi Iwai To: alsa-devel@alsa-project.org Subject: [PATCH v2 79/79] ALSA: pcsp: Allocate resources with device-managed APIs Date: Thu, 15 Jul 2021 09:59:41 +0200 Message-Id: <20210715075941.23332-80-tiwai@suse.de> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210715075941.23332-1-tiwai@suse.de> References: <20210715075941.23332-1-tiwai@suse.de> MIME-Version: 1.0 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" Use the new snd_devm_card_new() for the card object allocation and the devres version for the input device, and clean up the superfluous remove callback. Signed-off-by: Takashi Iwai --- sound/drivers/pcsp/pcsp.c | 49 +++++++++++---------------------- sound/drivers/pcsp/pcsp_input.c | 14 ++-------- sound/drivers/pcsp/pcsp_input.h | 1 - 3 files changed, 18 insertions(+), 46 deletions(-) diff --git a/sound/drivers/pcsp/pcsp.c b/sound/drivers/pcsp/pcsp.c index 7689fa2f9531..c7be1c395bcb 100644 --- a/sound/drivers/pcsp/pcsp.c +++ b/sound/drivers/pcsp/pcsp.c @@ -42,9 +42,8 @@ struct snd_pcsp pcsp_chip; static int snd_pcsp_create(struct snd_card *card) { - static const struct snd_device_ops ops = { }; unsigned int resolution = hrtimer_resolution; - int err, div, min_div, order; + int div, min_div, order; if (!nopcm) { if (resolution > PCSP_MAX_PERIOD_NS) { @@ -83,15 +82,18 @@ static int snd_pcsp_create(struct snd_card *card) pcsp_chip.port = 0x61; pcsp_chip.irq = -1; pcsp_chip.dma = -1; - - /* Register device */ - err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, &pcsp_chip, &ops); - if (err < 0) - return err; + card->private_data = &pcsp_chip; return 0; } +static void pcsp_stop_beep(struct snd_pcsp *chip); + +static void alsa_card_pcsp_free(struct snd_card *card) +{ + pcsp_stop_beep(card->private_data); +} + static int snd_card_pcsp_probe(int devnum, struct device *dev) { struct snd_card *card; @@ -103,22 +105,22 @@ static int snd_card_pcsp_probe(int devnum, struct device *dev) hrtimer_init(&pcsp_chip.timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); pcsp_chip.timer.function = pcsp_do_timer; - err = snd_card_new(dev, index, id, THIS_MODULE, 0, &card); + err = snd_devm_card_new(dev, index, id, THIS_MODULE, 0, &card); if (err < 0) return err; err = snd_pcsp_create(card); if (err < 0) - goto free_card; + return err; if (!nopcm) { err = snd_pcsp_new_pcm(&pcsp_chip); if (err < 0) - goto free_card; + return err; } err = snd_pcsp_new_mixer(&pcsp_chip, nopcm); if (err < 0) - goto free_card; + return err; strcpy(card->driver, "PC-Speaker"); strcpy(card->shortname, "pcsp"); @@ -127,13 +129,10 @@ static int snd_card_pcsp_probe(int devnum, struct device *dev) err = snd_card_register(card); if (err < 0) - goto free_card; + return err; + card->private_free = alsa_card_pcsp_free; return 0; - -free_card: - snd_card_free(card); - return err; } static int alsa_card_pcsp_init(struct device *dev) @@ -155,11 +154,6 @@ static int alsa_card_pcsp_init(struct device *dev) return 0; } -static void alsa_card_pcsp_exit(struct snd_pcsp *chip) -{ - snd_card_free(chip->card); -} - static int pcsp_probe(struct platform_device *dev) { int err; @@ -169,23 +163,13 @@ static int pcsp_probe(struct platform_device *dev) return err; err = alsa_card_pcsp_init(&dev->dev); - if (err < 0) { - pcspkr_input_remove(pcsp_chip.input_dev); + if (err < 0) return err; - } platform_set_drvdata(dev, &pcsp_chip); return 0; } -static int pcsp_remove(struct platform_device *dev) -{ - struct snd_pcsp *chip = platform_get_drvdata(dev); - pcspkr_input_remove(chip->input_dev); - alsa_card_pcsp_exit(chip); - return 0; -} - static void pcsp_stop_beep(struct snd_pcsp *chip) { pcsp_sync_stop(chip); @@ -218,7 +202,6 @@ static struct platform_driver pcsp_platform_driver = { .pm = PCSP_PM_OPS, }, .probe = pcsp_probe, - .remove = pcsp_remove, .shutdown = pcsp_shutdown, }; diff --git a/sound/drivers/pcsp/pcsp_input.c b/sound/drivers/pcsp/pcsp_input.c index e79603fe743d..5a799f7f00a2 100644 --- a/sound/drivers/pcsp/pcsp_input.c +++ b/sound/drivers/pcsp/pcsp_input.c @@ -78,7 +78,7 @@ int pcspkr_input_init(struct input_dev **rdev, struct device *dev) { int err; - struct input_dev *input_dev = input_allocate_device(); + struct input_dev *input_dev = devm_input_allocate_device(dev); if (!input_dev) return -ENOMEM; @@ -95,19 +95,9 @@ int pcspkr_input_init(struct input_dev **rdev, struct device *dev) input_dev->event = pcspkr_input_event; err = input_register_device(input_dev); - if (err) { - input_free_device(input_dev); + if (err) return err; - } *rdev = input_dev; return 0; } - -int pcspkr_input_remove(struct input_dev *dev) -{ - pcspkr_stop_sound(); - input_unregister_device(dev); /* this also does kfree() */ - - return 0; -} diff --git a/sound/drivers/pcsp/pcsp_input.h b/sound/drivers/pcsp/pcsp_input.h index e80079b38a56..42bfc9eab6eb 100644 --- a/sound/drivers/pcsp/pcsp_input.h +++ b/sound/drivers/pcsp/pcsp_input.h @@ -9,7 +9,6 @@ #define __PCSP_INPUT_H__ int pcspkr_input_init(struct input_dev **rdev, struct device *dev); -int pcspkr_input_remove(struct input_dev *dev); void pcspkr_stop_sound(void); #endif