Lines Matching +full:pci +full:- +full:dev

1 // SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause)
11 * Generic PCI interface for ACP device
16 #include <linux/pci.h>
22 #include "../mach-config.h"
33 if (chip && chip->acp_hw_ops && chip->acp_hw_ops->irq) in irq_handler()
34 return chip->acp_hw_ops->irq(irq, chip); in irq_handler()
47 pdevinfo->name = name; in acp_fill_platform_dev_info()
48 pdevinfo->id = id; in acp_fill_platform_dev_info()
49 pdevinfo->parent = parent; in acp_fill_platform_dev_info()
50 pdevinfo->num_res = num_res; in acp_fill_platform_dev_info()
51 pdevinfo->res = res; in acp_fill_platform_dev_info()
52 pdevinfo->data = data; in acp_fill_platform_dev_info()
53 pdevinfo->size_data = size_data; in acp_fill_platform_dev_info()
54 pdevinfo->fwnode = fw_node; in acp_fill_platform_dev_info()
57 static int create_acp_platform_devs(struct pci_dev *pci, struct acp_chip_info *chip, u32 addr) in create_acp_platform_devs() argument
63 parent = &pci->dev; in create_acp_platform_devs()
65 if (chip->is_i2s_config || chip->is_pdm_dev) { in create_acp_platform_devs()
66 chip->res = devm_kzalloc(&pci->dev, sizeof(struct resource), GFP_KERNEL); in create_acp_platform_devs()
67 if (!chip->res) { in create_acp_platform_devs()
68 ret = -ENOMEM; in create_acp_platform_devs()
71 chip->res->flags = IORESOURCE_MEM; in create_acp_platform_devs()
72 chip->res->start = addr; in create_acp_platform_devs()
73 chip->res->end = addr + (ACP3x_REG_END - ACP3x_REG_START); in create_acp_platform_devs()
78 acp_fill_platform_dev_info(&pdevinfo, parent, NULL, chip->name, in create_acp_platform_devs()
79 0, chip->res, 1, chip, sizeof(*chip)); in create_acp_platform_devs()
81 chip->acp_plat_dev = platform_device_register_full(&pdevinfo); in create_acp_platform_devs()
82 if (IS_ERR(chip->acp_plat_dev)) { in create_acp_platform_devs()
83 dev_err(&pci->dev, in create_acp_platform_devs()
85 ret = PTR_ERR(chip->acp_plat_dev); in create_acp_platform_devs()
88 if (chip->is_pdm_dev && chip->is_pdm_config) { in create_acp_platform_devs()
89 chip->dmic_codec_dev = platform_device_register_data(&pci->dev, in create_acp_platform_devs()
90 "dmic-codec", in create_acp_platform_devs()
93 if (IS_ERR(chip->dmic_codec_dev)) { in create_acp_platform_devs()
94 dev_err(&pci->dev, "failed to create DMIC device\n"); in create_acp_platform_devs()
95 ret = PTR_ERR(chip->dmic_codec_dev); in create_acp_platform_devs()
101 platform_device_unregister(chip->acp_plat_dev); in create_acp_platform_devs()
106 static int acp_pci_probe(struct pci_dev *pci, const struct pci_device_id *pci_id) in acp_pci_probe() argument
108 struct device *dev = &pci->dev; in acp_pci_probe() local
113 flag = snd_amd_acp_find_config(pci); in acp_pci_probe()
115 return -ENODEV; in acp_pci_probe()
117 chip = devm_kzalloc(&pci->dev, sizeof(*chip), GFP_KERNEL); in acp_pci_probe()
119 return -ENOMEM; in acp_pci_probe()
121 if (pci_enable_device(pci)) in acp_pci_probe()
122 return dev_err_probe(&pci->dev, -ENODEV, in acp_pci_probe()
125 ret = pci_request_regions(pci, "AMD ACP3x audio"); in acp_pci_probe()
127 dev_err(&pci->dev, "pci_request_regions failed\n"); in acp_pci_probe()
128 ret = -ENOMEM; in acp_pci_probe()
132 pci_set_master(pci); in acp_pci_probe()
134 chip->acp_rev = pci->revision; in acp_pci_probe()
135 switch (pci->revision) { in acp_pci_probe()
137 chip->name = "acp_asoc_renoir"; in acp_pci_probe()
138 chip->rsrc = &rn_rsrc; in acp_pci_probe()
139 chip->acp_hw_ops_init = acp31_hw_ops_init; in acp_pci_probe()
140 chip->machines = snd_soc_acpi_amd_acp_machines; in acp_pci_probe()
143 chip->name = "acp_asoc_rembrandt"; in acp_pci_probe()
144 chip->rsrc = &rmb_rsrc; in acp_pci_probe()
145 chip->acp_hw_ops_init = acp6x_hw_ops_init; in acp_pci_probe()
146 chip->machines = snd_soc_acpi_amd_rmb_acp_machines; in acp_pci_probe()
149 chip->name = "acp_asoc_acp63"; in acp_pci_probe()
150 chip->rsrc = &acp63_rsrc; in acp_pci_probe()
151 chip->acp_hw_ops_init = acp63_hw_ops_init; in acp_pci_probe()
152 chip->machines = snd_soc_acpi_amd_acp63_acp_machines; in acp_pci_probe()
157 chip->name = "acp_asoc_acp70"; in acp_pci_probe()
158 chip->rsrc = &acp70_rsrc; in acp_pci_probe()
159 chip->acp_hw_ops_init = acp70_hw_ops_init; in acp_pci_probe()
160 chip->machines = snd_soc_acpi_amd_acp70_acp_machines; in acp_pci_probe()
163 dev_err(dev, "Unsupported device revision:0x%x\n", pci->revision); in acp_pci_probe()
164 ret = -EINVAL; in acp_pci_probe()
167 chip->flag = flag; in acp_pci_probe()
169 addr = pci_resource_start(pci, 0); in acp_pci_probe()
170 chip->base = devm_ioremap(&pci->dev, addr, pci_resource_len(pci, 0)); in acp_pci_probe()
171 if (!chip->base) { in acp_pci_probe()
172 ret = -ENOMEM; in acp_pci_probe()
176 chip->addr = addr; in acp_pci_probe()
178 chip->acp_hw_ops_init(chip); in acp_pci_probe()
183 ret = devm_request_irq(dev, pci->irq, irq_handler, in acp_pci_probe()
186 dev_err(&pci->dev, "ACP I2S IRQ request failed %d\n", ret); in acp_pci_probe()
190 check_acp_config(pci, chip); in acp_pci_probe()
191 if (!chip->is_pdm_dev && !chip->is_i2s_config) in acp_pci_probe()
194 ret = create_acp_platform_devs(pci, chip, addr); in acp_pci_probe()
196 dev_err(&pci->dev, "ACP platform devices creation failed\n"); in acp_pci_probe()
200 chip->chip_pdev = chip->acp_plat_dev; in acp_pci_probe()
201 chip->dev = &chip->acp_plat_dev->dev; in acp_pci_probe()
205 INIT_LIST_HEAD(&chip->stream_list); in acp_pci_probe()
206 spin_lock_init(&chip->acp_lock); in acp_pci_probe()
208 dev_set_drvdata(&pci->dev, chip); in acp_pci_probe()
209 pm_runtime_set_autosuspend_delay(&pci->dev, 2000); in acp_pci_probe()
210 pm_runtime_use_autosuspend(&pci->dev); in acp_pci_probe()
211 pm_runtime_put_noidle(&pci->dev); in acp_pci_probe()
212 pm_runtime_allow(&pci->dev); in acp_pci_probe()
218 pci_release_regions(pci); in acp_pci_probe()
220 pci_disable_device(pci); in acp_pci_probe()
225 static int snd_acp_suspend(struct device *dev) in snd_acp_suspend() argument
230 chip = dev_get_drvdata(dev); in snd_acp_suspend()
233 dev_err(dev, "ACP de-init failed\n"); in snd_acp_suspend()
237 static int snd_acp_resume(struct device *dev) in snd_acp_resume() argument
242 chip = dev_get_drvdata(dev); in snd_acp_resume()
245 dev_err(dev, "ACP init failed\n"); in snd_acp_resume()
249 dev_err(dev, "ACP en-interrupts failed\n"); in snd_acp_resume()
259 static void acp_pci_remove(struct pci_dev *pci) in acp_pci_remove() argument
264 chip = pci_get_drvdata(pci); in acp_pci_remove()
265 pm_runtime_forbid(&pci->dev); in acp_pci_remove()
266 pm_runtime_get_noresume(&pci->dev); in acp_pci_remove()
267 if (chip->dmic_codec_dev) in acp_pci_remove()
268 platform_device_unregister(chip->dmic_codec_dev); in acp_pci_remove()
269 if (chip->acp_plat_dev) in acp_pci_remove()
270 platform_device_unregister(chip->acp_plat_dev); in acp_pci_remove()
271 if (chip->mach_dev) in acp_pci_remove()
272 platform_device_unregister(chip->mach_dev); in acp_pci_remove()
276 dev_err(&pci->dev, "ACP de-init failed\n"); in acp_pci_remove()
279 /* PCI IDs */
284 MODULE_DEVICE_TABLE(pci, acp_pci_ids);
298 MODULE_DESCRIPTION("AMD ACP common PCI support");