Received: by 2002:a25:7ec1:0:0:0:0:0 with SMTP id z184csp2985902ybc; Mon, 18 Nov 2019 07:47:08 -0800 (PST) X-Google-Smtp-Source: APXvYqyRv392v7CUSZmfHt17uHJA+cMMIuI+ZkYTNlKTXQvTbGDbeAknvrVU/Z9Rifu4kBULP8sb X-Received: by 2002:a17:906:3484:: with SMTP id g4mr5008611ejb.293.1574092028683; Mon, 18 Nov 2019 07:47:08 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1574092028; cv=none; d=google.com; s=arc-20160816; b=ShJv8NghyWl3v1IbvLESn1BNBz1WL2PUXkeJ6CFJdrSg4+s7BTznJ9DRav0vA9M5ez LFZ3I9VzRPIigSlDkYgajbUBOUlt7fkKCzAcG85GSEKvYzBst4NkPPgtyHJZr5fvGYRR 32NxBMTonbGdG9wZhRn5Aa9nNxM/aPaGvRwJfSrSffn+RO//XA+L4n/HXrMi0tocXzkA i8VC5m9YEwm5OTs453OC8QuCcIhedd1UuarHVp/4UAWANSituf8+r3CpZxrljo+NWfYe hF661EDjhDBIZ94Q/3/GpW6k2Ah3rFBAsaQo690dCX+LRdRIMhP2xE0jLlYG8/bXny+N kKsw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding :content-language:in-reply-to:mime-version:user-agent:date :message-id:from:references:cc:to:subject; bh=fJa5wnqDQ+NwbDy/zMUYQjXUtt8xStOHB34gnaqVniM=; b=VzKbiBPITVCpzUyU44rM9Dgp/SBbx1KNE/OwYcoVCSV0zTn3ynj0H0M3xoFDiUDQv5 BOLfEMQTmsQrkvfnMkpAS3iFVf6Yn937UwWHtg85AEttCyXuylOoelyXwtyobBbgBw4Q btclT583i02SLa1mzr4YNSOGS6FEgokiMeinf9kiuxe2768HFAY5E4O75ns0By9acWWf oBrHhdmNEs+tAluAJiwHJYJPyBy0tEHSL80baBCZYU5GEYfZOpaRxA3O8BjSZuBenTPz 4i/3IUZbodWX1HiFtqEutmeB1QHgNXfxC5HyYEfGY5ULLp1IDWu9BfC6XWBc7fyZiIFz zWrQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id o19si11563640ejc.315.2019.11.18.07.46.44; Mon, 18 Nov 2019 07:47:08 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727409AbfKRPpZ (ORCPT + 99 others); Mon, 18 Nov 2019 10:45:25 -0500 Received: from mga09.intel.com ([134.134.136.24]:37583 "EHLO mga09.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726216AbfKRPpY (ORCPT ); Mon, 18 Nov 2019 10:45:24 -0500 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga001.jf.intel.com ([10.7.209.18]) by orsmga102.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 18 Nov 2019 07:45:23 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.68,320,1569308400"; d="scan'208";a="289292868" Received: from nmdeliwa-mobl1.amr.corp.intel.com (HELO [10.251.155.92]) ([10.251.155.92]) by orsmga001.jf.intel.com with ESMTP; 18 Nov 2019 07:45:22 -0800 Subject: Re: [alsa-devel] [PATCH v7 1/6] ASoC: amd:Create multiple I2S platform device endpoint To: Ravulapati Vishnu vardhan rao Cc: "moderated list:SOUND - SOC LAYER / DYNAMIC AUDIO POWER MANAGEM..." , open list , Takashi Iwai , Liam Girdwood , Akshu.Agrawal@amd.com, Mark Brown , djkurtz@google.com, Alexander.Deucher@amd.com, Dan Carpenter References: <1574085861-22818-1-git-send-email-Vishnuvardhanrao.Ravulapati@amd.com> <1574085861-22818-2-git-send-email-Vishnuvardhanrao.Ravulapati@amd.com> From: Pierre-Louis Bossart Message-ID: <6c389fa0-a0a0-a79e-f63e-10e3616962be@linux.intel.com> Date: Mon, 18 Nov 2019 09:40:59 -0600 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.1.2 MIME-Version: 1.0 In-Reply-To: <1574085861-22818-2-git-send-email-Vishnuvardhanrao.Ravulapati@amd.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org > static int snd_acp3x_probe(struct pci_dev *pci, > const struct pci_device_id *pci_id) > { > - int ret; > - u32 addr, val; > struct acp3x_dev_data *adata; > - struct platform_device_info pdevinfo; > + struct platform_device_info pdevinfo[ACP3x_DEVS]; > unsigned int irqflags; > + int ret, val, i; > + u32 addr; > > if (pci_enable_device(pci)) { if you are using devm_ across the board then you could also use pcim_enable_device() here? > dev_err(&pci->dev, "pci_enable_device failed\n"); > @@ -40,10 +40,10 @@ static int snd_acp3x_probe(struct pci_dev *pci, > } > > adata = devm_kzalloc(&pci->dev, sizeof(struct acp3x_dev_data), > - GFP_KERNEL); > + GFP_KERNEL); > if (!adata) { > ret = -ENOMEM; > - goto release_regions; > + goto adata_free; > } > > /* check for msi interrupt support */ > @@ -56,7 +56,8 @@ static int snd_acp3x_probe(struct pci_dev *pci, > irqflags = 0; > > addr = pci_resource_start(pci, 0); > - adata->acp3x_base = ioremap(addr, pci_resource_len(pci, 0)); > + adata->acp3x_base = devm_ioremap(&pci->dev, addr, > + pci_resource_len(pci, 0)); > if (!adata->acp3x_base) { > ret = -ENOMEM; > goto release_regions; > @@ -68,11 +69,11 @@ static int snd_acp3x_probe(struct pci_dev *pci, > switch (val) { > case I2S_MODE: > adata->res = devm_kzalloc(&pci->dev, > - sizeof(struct resource) * 2, > + sizeof(struct resource) * 4, > GFP_KERNEL); > if (!adata->res) { > ret = -ENOMEM; > - goto unmap_mmio; > + goto release_regions; > } > > adata->res[0].name = "acp3x_i2s_iomem"; > @@ -80,28 +81,52 @@ static int snd_acp3x_probe(struct pci_dev *pci, > adata->res[0].start = addr; > adata->res[0].end = addr + (ACP3x_REG_END - ACP3x_REG_START); > > - adata->res[1].name = "acp3x_i2s_irq"; > - adata->res[1].flags = IORESOURCE_IRQ; > - adata->res[1].start = pci->irq; > - adata->res[1].end = pci->irq; > + adata->res[1].name = "acp3x_i2s_sp"; > + adata->res[1].flags = IORESOURCE_MEM; > + adata->res[1].start = addr + ACP3x_I2STDM_REG_START; > + adata->res[1].end = addr + ACP3x_I2STDM_REG_END; > + > + adata->res[2].name = "acp3x_i2s_bt"; > + adata->res[2].flags = IORESOURCE_MEM; > + adata->res[2].start = addr + ACP3x_BT_TDM_REG_START; > + adata->res[2].end = addr + ACP3x_BT_TDM_REG_END; > + > + adata->res[3].name = "acp3x_i2s_irq"; > + adata->res[3].flags = IORESOURCE_IRQ; > + adata->res[3].start = pci->irq; > + adata->res[3].end = adata->res[3].start; > > adata->acp3x_audio_mode = ACP3x_I2S_MODE; > > memset(&pdevinfo, 0, sizeof(pdevinfo)); > - pdevinfo.name = "acp3x_rv_i2s"; > - pdevinfo.id = 0; > - pdevinfo.parent = &pci->dev; > - pdevinfo.num_res = 2; > - pdevinfo.res = adata->res; > - pdevinfo.data = &irqflags; > - pdevinfo.size_data = sizeof(irqflags); > - > - adata->pdev = platform_device_register_full(&pdevinfo); > - if (IS_ERR(adata->pdev)) { > - dev_err(&pci->dev, "cannot register %s device\n", > - pdevinfo.name); > - ret = PTR_ERR(adata->pdev); > - goto unmap_mmio; > + pdevinfo[0].name = "acp3x_rv_i2s_dma"; > + pdevinfo[0].id = 0; > + pdevinfo[0].parent = &pci->dev; > + pdevinfo[0].num_res = 4; > + pdevinfo[0].res = &adata->res[0]; > + pdevinfo[0].data = &irqflags; > + pdevinfo[0].size_data = sizeof(irqflags); > + > + pdevinfo[1].name = "acp3x_i2s_playcap"; > + pdevinfo[1].id = 0; > + pdevinfo[1].parent = &pci->dev; > + pdevinfo[1].num_res = 1; > + pdevinfo[1].res = &adata->res[1]; > + > + pdevinfo[2].name = "acp3x_i2s_playcap"; > + pdevinfo[2].id = 1; > + pdevinfo[2].parent = &pci->dev; > + pdevinfo[2].num_res = 1; > + pdevinfo[2].res = &adata->res[2]; > + for (i = 0; i < ACP3x_DEVS ; i++) { > + adata->pdev[i] = > + platform_device_register_full(&pdevinfo[i]); > + if (IS_ERR(adata->pdev[i])) { > + dev_err(&pci->dev, "cannot register %s device\n", > + pdevinfo[i].name); > + ret = PTR_ERR(adata->pdev[i]); > + goto unmap_mmio; > + } > } > break; > default: > @@ -112,10 +137,22 @@ static int snd_acp3x_probe(struct pci_dev *pci, > return 0; > > unmap_mmio: > + if (val == I2S_MODE) > + for (i = 0 ; i < ACP3x_DEVS ; i++) > + platform_device_unregister(adata->pdev[i]); > + devm_kfree(&pci->dev, adata->res); > + devm_kfree(&pci->dev, adata); > pci_disable_msi(pci); > - iounmap(adata->acp3x_base); > + pci_release_regions(pci); > + pci_disable_device(pci); > release_regions: > + devm_kfree(&pci->dev, adata); > + pci_disable_msi(pci); > pci_release_regions(pci); > + pci_disable_device(pci); > +adata_free: > + pci_release_regions(pci); > + pci_disable_device(pci); > disable_pci: > pci_disable_device(pci); this error flow is probably wrong, you should not repeat the same sequences when going from one label to the other. it should be something like (not verified, example only) devm_kfree(&pci->dev, adata->res); release_regions: devm_kfree(&pci->dev, adata); pci_disable_msi(pci); adata_free: pci_release_regions(pci); disable_pci: pci_disable_device(pci); Stopping the review here.