]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ASoC: amd: acp: Refactor dmic-codec platform device creation
authorVenkata Prasad Potturu <venkataprasad.potturu@amd.com>
Mon, 10 Mar 2025 18:31:50 +0000 (00:01 +0530)
committerMark Brown <broonie@kernel.org>
Tue, 11 Mar 2025 17:18:25 +0000 (17:18 +0000)
Refactor dmic-codec platform driver creation using helper function.

Signed-off-by: Venkata Prasad Potturu <venkataprasad.potturu@amd.com>
Link: https://patch.msgid.link/20250310183201.11979-4-venkataprasad.potturu@amd.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/amd/acp/acp-pci.c
sound/soc/amd/acp/amd.h

index b5eabd0280bce431ac4028d2c8dd2a2fc9747c64..549e95415ab22130e830878f025bbdc90709085e 100644 (file)
@@ -26,7 +26,6 @@
 #define ACP3x_REG_START        0x1240000
 #define ACP3x_REG_END  0x125C000
 
-static struct platform_device *dmic_dev;
 static struct platform_device *pdev;
 
 static const struct resource acp_res[] = {
@@ -44,6 +43,26 @@ static const struct resource acp_res[] = {
        },
 };
 
+static int create_acp_platform_devs(struct pci_dev *pci, struct acp_chip_info *chip)
+{
+       int ret;
+
+       if (chip->is_pdm_dev && chip->is_pdm_config) {
+               chip->dmic_codec_dev = platform_device_register_data(&pci->dev,
+                                                                    "dmic-codec",
+                                                                    PLATFORM_DEVID_NONE,
+                                                                    NULL, 0);
+               if (IS_ERR(chip->dmic_codec_dev)) {
+                       dev_err(&pci->dev, "failed to create DMIC device\n");
+                       ret = PTR_ERR(chip->dmic_codec_dev);
+                       goto err;
+               }
+       }
+       return 0;
+err:
+       return ret;
+}
+
 static int acp_pci_probe(struct pci_dev *pci, const struct pci_device_id *pci_id)
 {
        struct platform_device_info pdevinfo;
@@ -102,33 +121,33 @@ static int acp_pci_probe(struct pci_dev *pci, const struct pci_device_id *pci_id
                goto release_regions;
        }
        chip->flag = flag;
-       dmic_dev = platform_device_register_data(dev, "dmic-codec", PLATFORM_DEVID_NONE, NULL, 0);
-       if (IS_ERR(dmic_dev)) {
-               dev_err(dev, "failed to create DMIC device\n");
-               ret = PTR_ERR(dmic_dev);
-               goto release_regions;
-       }
 
        addr = pci_resource_start(pci, 0);
        chip->base = devm_ioremap(&pci->dev, addr, pci_resource_len(pci, 0));
        if (!chip->base) {
                ret = -ENOMEM;
-               goto unregister_dmic_dev;
+               goto release_regions;
        }
 
        chip->acp_hw_ops_init(chip);
        ret = acp_hw_init(chip);
        if (ret)
-               goto unregister_dmic_dev;
+               goto release_regions;
 
        check_acp_config(pci, chip);
        if (!chip->is_pdm_dev && !chip->is_i2s_config)
                goto skip_pdev_creation;
 
+       ret = create_acp_platform_devs(pci, chip);
+       if (ret < 0) {
+               dev_err(&pci->dev, "ACP platform devices creation failed\n");
+               goto de_init;
+       }
+
        res = devm_kcalloc(&pci->dev, num_res, sizeof(struct resource), GFP_KERNEL);
        if (!res) {
                ret = -ENOMEM;
-               goto unregister_dmic_dev;
+               goto de_init;
        }
 
        for (i = 0; i < num_res; i++, res_acp++) {
@@ -156,7 +175,7 @@ static int acp_pci_probe(struct pci_dev *pci, const struct pci_device_id *pci_id
        if (IS_ERR(pdev)) {
                dev_err(&pci->dev, "cannot register %s device\n", pdevinfo.name);
                ret = PTR_ERR(pdev);
-               goto unregister_dmic_dev;
+               goto de_init;
        }
 
 skip_pdev_creation:
@@ -168,8 +187,8 @@ skip_pdev_creation:
        pm_runtime_allow(&pci->dev);
        return ret;
 
-unregister_dmic_dev:
-       platform_device_unregister(dmic_dev);
+de_init:
+       acp_hw_deinit(chip);
 release_regions:
        pci_release_regions(pci);
 disable_pci:
@@ -223,8 +242,8 @@ static void acp_pci_remove(struct pci_dev *pci)
        chip = pci_get_drvdata(pci);
        pm_runtime_forbid(&pci->dev);
        pm_runtime_get_noresume(&pci->dev);
-       if (dmic_dev)
-               platform_device_unregister(dmic_dev);
+       if (chip->dmic_codec_dev)
+               platform_device_unregister(chip->dmic_codec_dev);
        if (pdev)
                platform_device_unregister(pdev);
        ret = acp_hw_deinit(chip);
index 3c06567e112cd789132db353636d870086786c29..9511995da5915090bc13451267e3dd10ea6a6c87 100644 (file)
@@ -145,6 +145,7 @@ struct acp_chip_info {
        struct snd_acp_hw_ops *acp_hw_ops;
        int (*acp_hw_ops_init)(struct acp_chip_info *chip);
        struct platform_device *chip_pdev;
+       struct platform_device *dmic_codec_dev;
        unsigned int flag;      /* Distinguish b/w Legacy or Only PDM */
        bool is_pdm_dev;        /* flag set to true when ACP PDM controller exists */
        bool is_pdm_config;     /* flag set to true when PDM configuration is selected from BIOS */