#include <linux/interrupt.h>
#include <linux/irqchip/chained_irq.h>
#include <linux/irqdomain.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/msi.h>
#include <linux/of_address.h>
#include <linux/of_pci.h>
#include <linux/pci.h>
#include <linux/platform_device.h>
#include <linux/slab.h>
#define MSI_STATUS …
#define MSI_ERROR …
#define MSI_INTMASK …
#define MAX_MSI_VECTORS …
struct altera_msi { … };
static inline void msi_writel(struct altera_msi *msi, const u32 value,
const u32 reg)
{ … }
static inline u32 msi_readl(struct altera_msi *msi, const u32 reg)
{ … }
static void altera_msi_isr(struct irq_desc *desc)
{ … }
static struct irq_chip altera_msi_irq_chip = …;
static struct msi_domain_info altera_msi_domain_info = …;
static void altera_compose_msi_msg(struct irq_data *data, struct msi_msg *msg)
{ … }
static int altera_msi_set_affinity(struct irq_data *irq_data,
const struct cpumask *mask, bool force)
{ … }
static struct irq_chip altera_msi_bottom_irq_chip = …;
static int altera_irq_domain_alloc(struct irq_domain *domain, unsigned int virq,
unsigned int nr_irqs, void *args)
{ … }
static void altera_irq_domain_free(struct irq_domain *domain,
unsigned int virq, unsigned int nr_irqs)
{ … }
static const struct irq_domain_ops msi_domain_ops = …;
static int altera_allocate_domains(struct altera_msi *msi)
{ … }
static void altera_free_domains(struct altera_msi *msi)
{ … }
static void altera_msi_remove(struct platform_device *pdev)
{ … }
static int altera_msi_probe(struct platform_device *pdev)
{ … }
static const struct of_device_id altera_msi_of_match[] = …;
static struct platform_driver altera_msi_driver = …;
static int __init altera_msi_init(void)
{ … }
static void __exit altera_msi_exit(void)
{ … }
subsys_initcall(altera_msi_init);
MODULE_DEVICE_TABLE(of, altera_msi_of_match);
module_exit(altera_msi_exit);
MODULE_DESCRIPTION(…) …;
MODULE_LICENSE(…) …;