Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

i2c: amd-mp2: use msix/msi if the hardware supports

Use msix or msi interrupts if the hardware supports it. Else, fallback to
legacy interrupts.

Co-developed-by: Basavaraj Natikar <basavaraj.natikar@amd.com>
Signed-off-by: Basavaraj Natikar <basavaraj.natikar@amd.com>
Signed-off-by: Raju Rangoju <Raju.Rangoju@amd.com>
Acked-by: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
Signed-off-by: Wolfram Sang <wsa@kernel.org>

authored by

Raju Rangoju and committed by
Wolfram Sang
969864ef 30a0b95b

+22 -9
+21 -9
drivers/i2c/busses/i2c-amd-mp2-pci.c
··· 288 288 static int amd_mp2_pci_init(struct amd_mp2_dev *privdata, 289 289 struct pci_dev *pci_dev) 290 290 { 291 - int rc; 291 + int irq_flag = 0, rc; 292 292 293 293 pci_set_drvdata(pci_dev, privdata); 294 294 ··· 311 311 if (rc) 312 312 goto err_dma_mask; 313 313 314 - /* Set up intx irq */ 314 + /* request and enable interrupt */ 315 315 writel(0, privdata->mmio + AMD_P2C_MSG_INTEN); 316 - pci_intx(pci_dev, 1); 317 - rc = devm_request_irq(&pci_dev->dev, pci_dev->irq, amd_mp2_irq_isr, 318 - IRQF_SHARED, dev_name(&pci_dev->dev), privdata); 319 - if (rc) 320 - pci_err(pci_dev, "Failure requesting irq %i: %d\n", 321 - pci_dev->irq, rc); 316 + rc = pci_alloc_irq_vectors(pci_dev, 1, 1, PCI_IRQ_ALL_TYPES); 317 + if (rc < 0) { 318 + dev_err(&pci_dev->dev, "Failed to allocate single IRQ err=%d\n", rc); 319 + goto err_dma_mask; 320 + } 321 + 322 + privdata->dev_irq = pci_irq_vector(pci_dev, 0); 323 + if (!pci_dev->msix_enabled && !pci_dev->msi_enabled) 324 + irq_flag = IRQF_SHARED; 325 + 326 + rc = devm_request_irq(&pci_dev->dev, privdata->dev_irq, 327 + amd_mp2_irq_isr, irq_flag, dev_name(&pci_dev->dev), privdata); 328 + if (rc) { 329 + pci_err(pci_dev, "Failure requesting irq %i: %d\n", privdata->dev_irq, rc); 330 + goto free_irq_vectors; 331 + } 322 332 323 333 return rc; 324 334 335 + free_irq_vectors: 336 + free_irq(privdata->dev_irq, privdata); 325 337 err_dma_mask: 326 338 pci_clear_master(pci_dev); 327 339 err_pci_enable: ··· 376 364 pm_runtime_forbid(&pci_dev->dev); 377 365 pm_runtime_get_noresume(&pci_dev->dev); 378 366 379 - pci_intx(pci_dev, 0); 367 + free_irq(privdata->dev_irq, privdata); 380 368 pci_clear_master(pci_dev); 381 369 382 370 amd_mp2_clear_reg(privdata);
+1
drivers/i2c/busses/i2c-amd-mp2.h
··· 183 183 struct mutex c2p_lock; 184 184 u8 c2p_lock_busid; 185 185 unsigned int probed; 186 + int dev_irq; 186 187 }; 187 188 188 189 /* PCIe communication driver */