• Home
  • Raw
  • Download

Lines Matching +full:irq +full:- +full:device

1 // SPDX-License-Identifier: GPL-2.0+
5 * Copyright (c) 2012 - 2014 Xilinx, Inc.
14 #include <linux/irq.h>
97 * struct xilinx_pcie_port - PCIe port information
99 * @irq: Interrupt number
101 * @dev: Device pointer
102 * @msi_domain: MSI IRQ domain pointer
103 * @leg_domain: Legacy IRQ domain pointer
108 u32 irq; member
110 struct device *dev;
120 return readl(port->reg_base + reg); in pcie_read()
125 writel(val, port->reg_base + reg); in pcie_write()
135 * xilinx_pcie_clear_err_interrupts - Clear Error Interrupts
140 struct device *dev = port->dev; in xilinx_pcie_clear_err_interrupts()
152 * xilinx_pcie_valid_device - Check if a valid device is present on bus
154 * @devfn: device/function
156 * Return: 'true' on success and 'false' if invalid device is found
160 struct xilinx_pcie_port *port = bus->sysdata; in xilinx_pcie_valid_device()
167 /* Only one device down on each root port */ in xilinx_pcie_valid_device()
174 * xilinx_pcie_map_bus - Get configuration base
176 * @devfn: Device/function
185 struct xilinx_pcie_port *port = bus->sysdata; in xilinx_pcie_map_bus()
191 relbus = (bus->number << ECAM_BUS_NUM_SHIFT) | in xilinx_pcie_map_bus()
194 return port->reg_base + relbus + where; in xilinx_pcie_map_bus()
207 * xilinx_pcie_destroy_msi - Free MSI number
208 * @irq: IRQ to be freed
210 static void xilinx_pcie_destroy_msi(unsigned int irq) in xilinx_pcie_destroy_msi() argument
214 struct irq_data *d = irq_get_irq_data(irq); in xilinx_pcie_destroy_msi()
218 msi = irq_get_msi_desc(irq); in xilinx_pcie_destroy_msi()
220 dev_err(port->dev, "Trying to free unused MSI#%d\n", irq); in xilinx_pcie_destroy_msi()
227 * xilinx_pcie_assign_msi - Allocate MSI number
229 * Return: A valid IRQ on success and error value on failure.
239 return -ENOSPC; in xilinx_pcie_assign_msi()
245 * xilinx_msi_teardown_irq - Destroy the MSI
247 * @irq: MSI IRQ to destroy
250 unsigned int irq) in xilinx_msi_teardown_irq() argument
252 xilinx_pcie_destroy_msi(irq); in xilinx_msi_teardown_irq()
253 irq_dispose_mapping(irq); in xilinx_msi_teardown_irq()
257 * xilinx_pcie_msi_setup_irq - Setup MSI request
259 * @pdev: PCIe device pointer
268 struct xilinx_pcie_port *port = pdev->bus->sysdata; in xilinx_pcie_msi_setup_irq()
269 unsigned int irq; in xilinx_pcie_msi_setup_irq() local
278 irq = irq_create_mapping(port->msi_domain, hwirq); in xilinx_pcie_msi_setup_irq()
279 if (!irq) in xilinx_pcie_msi_setup_irq()
280 return -EINVAL; in xilinx_pcie_msi_setup_irq()
282 irq_set_msi_desc(irq, desc); in xilinx_pcie_msi_setup_irq()
284 msg_addr = virt_to_phys((void *)port->msi_pages); in xilinx_pcie_msi_setup_irq()
288 msg.data = irq; in xilinx_pcie_msi_setup_irq()
290 pci_write_msi_msg(irq, &msg); in xilinx_pcie_msi_setup_irq()
311 * xilinx_pcie_msi_map - Set the handler for the MSI and mark IRQ as valid
312 * @domain: IRQ domain
313 * @irq: Virtual IRQ number
318 static int xilinx_pcie_msi_map(struct irq_domain *domain, unsigned int irq, in xilinx_pcie_msi_map() argument
321 irq_set_chip_and_handler(irq, &xilinx_msi_irq_chip, handle_simple_irq); in xilinx_pcie_msi_map()
322 irq_set_chip_data(irq, domain->host_data); in xilinx_pcie_msi_map()
327 /* IRQ Domain operations */
333 * xilinx_pcie_enable_msi - Enable MSI support
340 port->msi_pages = __get_free_pages(GFP_KERNEL, 0); in xilinx_pcie_enable_msi()
341 if (!port->msi_pages) in xilinx_pcie_enable_msi()
342 return -ENOMEM; in xilinx_pcie_enable_msi()
344 msg_addr = virt_to_phys((void *)port->msi_pages); in xilinx_pcie_enable_msi()
354 * xilinx_pcie_intx_map - Set the handler for the INTx and mark IRQ as valid
355 * @domain: IRQ domain
356 * @irq: Virtual IRQ number
361 static int xilinx_pcie_intx_map(struct irq_domain *domain, unsigned int irq, in xilinx_pcie_intx_map() argument
364 irq_set_chip_and_handler(irq, &dummy_irq_chip, handle_simple_irq); in xilinx_pcie_intx_map()
365 irq_set_chip_data(irq, domain->host_data); in xilinx_pcie_intx_map()
370 /* INTx IRQ Domain operations */
379 * xilinx_pcie_intr_handler - Interrupt Service Handler
380 * @irq: IRQ number
385 static irqreturn_t xilinx_pcie_intr_handler(int irq, void *data) in xilinx_pcie_intr_handler() argument
388 struct device *dev = port->dev; in xilinx_pcie_intr_handler()
438 /* Decode the IRQ number */ in xilinx_pcie_intr_handler()
445 val = irq_find_mapping(port->leg_domain, val); in xilinx_pcie_intr_handler()
493 * xilinx_pcie_init_irq_domain - Initialize IRQ domain
500 struct device *dev = port->dev; in xilinx_pcie_init_irq_domain()
501 struct device_node *node = dev->of_node; in xilinx_pcie_init_irq_domain()
509 return -ENODEV; in xilinx_pcie_init_irq_domain()
512 port->leg_domain = irq_domain_add_linear(pcie_intc_node, PCI_NUM_INTX, in xilinx_pcie_init_irq_domain()
516 if (!port->leg_domain) { in xilinx_pcie_init_irq_domain()
517 dev_err(dev, "Failed to get a INTx IRQ domain\n"); in xilinx_pcie_init_irq_domain()
518 return -ENODEV; in xilinx_pcie_init_irq_domain()
523 port->msi_domain = irq_domain_add_linear(node, in xilinx_pcie_init_irq_domain()
527 if (!port->msi_domain) { in xilinx_pcie_init_irq_domain()
528 dev_err(dev, "Failed to get a MSI IRQ domain\n"); in xilinx_pcie_init_irq_domain()
529 return -ENODEV; in xilinx_pcie_init_irq_domain()
541 * xilinx_pcie_init_port - Initialize hardware
546 struct device *dev = port->dev; in xilinx_pcie_init_port()
572 * xilinx_pcie_parse_dt - Parse Device tree
579 struct device *dev = port->dev; in xilinx_pcie_parse_dt()
580 struct device_node *node = dev->of_node; in xilinx_pcie_parse_dt()
590 port->reg_base = devm_pci_remap_cfg_resource(dev, &regs); in xilinx_pcie_parse_dt()
591 if (IS_ERR(port->reg_base)) in xilinx_pcie_parse_dt()
592 return PTR_ERR(port->reg_base); in xilinx_pcie_parse_dt()
594 port->irq = irq_of_parse_and_map(node, 0); in xilinx_pcie_parse_dt()
595 err = devm_request_irq(dev, port->irq, xilinx_pcie_intr_handler, in xilinx_pcie_parse_dt()
597 "xilinx-pcie", port); in xilinx_pcie_parse_dt()
599 dev_err(dev, "unable to request irq %d\n", port->irq); in xilinx_pcie_parse_dt()
607 * xilinx_pcie_probe - Probe function
608 * @pdev: Platform device pointer
614 struct device *dev = &pdev->dev; in xilinx_pcie_probe()
619 if (!dev->of_node) in xilinx_pcie_probe()
620 return -ENODEV; in xilinx_pcie_probe()
624 return -ENODEV; in xilinx_pcie_probe()
628 port->dev = dev; in xilinx_pcie_probe()
640 dev_err(dev, "Failed creating IRQ Domain\n"); in xilinx_pcie_probe()
644 bridge->sysdata = port; in xilinx_pcie_probe()
645 bridge->ops = &xilinx_pcie_ops; in xilinx_pcie_probe()
649 bridge->msi = &xilinx_pcie_msi_chip; in xilinx_pcie_probe()
655 { .compatible = "xlnx,axi-pcie-host-1.00.a", },
661 .name = "xilinx-pcie",