e56d060a5cb9aab6c3c4ade6598b05a0aa77339d
[linux-2.6-microblaze.git] / sound / soc / amd / vangogh / pci-acp5x.c
1 // SPDX-License-Identifier: GPL-2.0+
2 //
3 // AMD Vangogh ACP PCI Driver
4 //
5 // Copyright (C) 2021 Advanced Micro Devices, Inc. All rights reserved.
6
7 #include <linux/pci.h>
8 #include <linux/module.h>
9 #include <linux/io.h>
10
11 #include "acp5x.h"
12
13 struct acp5x_dev_data {
14         void __iomem *acp5x_base;
15 };
16
17 static int snd_acp5x_probe(struct pci_dev *pci,
18                            const struct pci_device_id *pci_id)
19 {
20         struct acp5x_dev_data *adata;
21         int ret;
22         u32 addr;
23
24         if (pci->revision != 0x50)
25                 return -ENODEV;
26
27         if (pci_enable_device(pci)) {
28                 dev_err(&pci->dev, "pci_enable_device failed\n");
29                 return -ENODEV;
30         }
31
32         ret = pci_request_regions(pci, "AMD ACP5x audio");
33         if (ret < 0) {
34                 dev_err(&pci->dev, "pci_request_regions failed\n");
35                 goto disable_pci;
36         }
37
38         adata = devm_kzalloc(&pci->dev, sizeof(struct acp5x_dev_data),
39                              GFP_KERNEL);
40         if (!adata) {
41                 ret = -ENOMEM;
42                 goto release_regions;
43         }
44         addr = pci_resource_start(pci, 0);
45         adata->acp5x_base = devm_ioremap(&pci->dev, addr,
46                                          pci_resource_len(pci, 0));
47         if (!adata->acp5x_base) {
48                 ret = -ENOMEM;
49                 goto release_regions;
50         }
51         pci_set_master(pci);
52         pci_set_drvdata(pci, adata);
53
54 release_regions:
55         pci_release_regions(pci);
56 disable_pci:
57         pci_disable_device(pci);
58
59         return ret;
60 }
61
62 static void snd_acp5x_remove(struct pci_dev *pci)
63 {
64         pci_release_regions(pci);
65         pci_disable_device(pci);
66 }
67
68 static const struct pci_device_id snd_acp5x_ids[] = {
69         { PCI_DEVICE(PCI_VENDOR_ID_AMD, ACP_DEVICE_ID),
70         .class = PCI_CLASS_MULTIMEDIA_OTHER << 8,
71         .class_mask = 0xffffff },
72         { 0, },
73 };
74 MODULE_DEVICE_TABLE(pci, snd_acp5x_ids);
75
76 static struct pci_driver acp5x_driver  = {
77         .name = KBUILD_MODNAME,
78         .id_table = snd_acp5x_ids,
79         .probe = snd_acp5x_probe,
80         .remove = snd_acp5x_remove,
81 };
82
83 module_pci_driver(acp5x_driver);
84
85 MODULE_AUTHOR("Vijendar.Mukunda@amd.com");
86 MODULE_DESCRIPTION("AMD Vangogh ACP PCI driver");
87 MODULE_LICENSE("GPL v2");