cregit-Linux how code gets into the kernel

Release 4.14 arch/powerpc/platforms/82xx/pq2ads-pci-pic.c

/*
 * PQ2 ADS-style PCI interrupt controller
 *
 * Copyright 2007 Freescale Semiconductor, Inc.
 * Author: Scott Wood <scottwood@freescale.com>
 *
 * Loosely based on mpc82xx ADS support by Vitaly Bordug <vbordug@ru.mvista.com>
 * Copyright (c) 2006 MontaVista Software, Inc.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 as published
 * by the Free Software Foundation.
 */

#include <linux/init.h>
#include <linux/spinlock.h>
#include <linux/irq.h>
#include <linux/types.h>
#include <linux/slab.h>

#include <asm/io.h>
#include <asm/prom.h>
#include <asm/cpm2.h>

#include "pq2.h"

static DEFINE_RAW_SPINLOCK(pci_pic_lock);


struct pq2ads_pci_pic {
	
struct device_node *node;
	
struct irq_domain *host;

	struct {
		
u32 stat;
		
u32 mask;
	
} __iomem *regs;
};


#define NUM_IRQS 32


static void pq2ads_pci_mask_irq(struct irq_data *d) { struct pq2ads_pci_pic *priv = irq_data_get_irq_chip_data(d); int irq = NUM_IRQS - irqd_to_hwirq(d) - 1; if (irq != -1) { unsigned long flags; raw_spin_lock_irqsave(&pci_pic_lock, flags); setbits32(&priv->regs->mask, 1 << irq); mb(); raw_spin_unlock_irqrestore(&pci_pic_lock, flags); } }

Contributors

PersonTokensPropCommitsCommitProp
Scott Wood6987.34%125.00%
Lennert Buytenhek78.86%125.00%
Anton Vorontsov22.53%125.00%
Grant C. Likely11.27%125.00%
Total79100.00%4100.00%


static void pq2ads_pci_unmask_irq(struct irq_data *d) { struct pq2ads_pci_pic *priv = irq_data_get_irq_chip_data(d); int irq = NUM_IRQS - irqd_to_hwirq(d) - 1; if (irq != -1) { unsigned long flags; raw_spin_lock_irqsave(&pci_pic_lock, flags); clrbits32(&priv->regs->mask, 1 << irq); raw_spin_unlock_irqrestore(&pci_pic_lock, flags); } }

Contributors

PersonTokensPropCommitsCommitProp
Scott Wood6686.84%125.00%
Lennert Buytenhek79.21%125.00%
Anton Vorontsov22.63%125.00%
Grant C. Likely11.32%125.00%
Total76100.00%4100.00%

static struct irq_chip pq2ads_pci_ic = { .name = "PQ2 ADS PCI", .irq_mask = pq2ads_pci_mask_irq, .irq_mask_ack = pq2ads_pci_mask_irq, .irq_ack = pq2ads_pci_mask_irq, .irq_unmask = pq2ads_pci_unmask_irq, .irq_enable = pq2ads_pci_unmask_irq, .irq_disable = pq2ads_pci_mask_irq };
static void pq2ads_pci_irq_demux(struct irq_desc *desc) { struct pq2ads_pci_pic *priv = irq_desc_get_handler_data(desc); u32 stat, mask, pend; int bit; for (;;) { stat = in_be32(&priv->regs->stat); mask = in_be32(&priv->regs->mask); pend = stat & ~mask; if (!pend) break; for (bit = 0; pend != 0; ++bit, pend <<= 1) { if (pend & 0x80000000) { int virq = irq_linear_revmap(priv->host, bit); generic_handle_irq(virq); } } } }

Contributors

PersonTokensPropCommitsCommitProp
Scott Wood11697.48%133.33%
Lennert Buytenhek21.68%133.33%
Thomas Gleixner10.84%133.33%
Total119100.00%3100.00%


static int pci_pic_host_map(struct irq_domain *h, unsigned int virq, irq_hw_number_t hw) { irq_set_status_flags(virq, IRQ_LEVEL); irq_set_chip_data(virq, h->host_data); irq_set_chip_and_handler(virq, &pq2ads_pci_ic, handle_level_irq); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Scott Wood3982.98%120.00%
Thomas Gleixner510.64%240.00%
Rune Torgersen24.26%120.00%
Grant C. Likely12.13%120.00%
Total47100.00%5100.00%

static const struct irq_domain_ops pci_pic_host_ops = { .map = pci_pic_host_map, };
int __init pq2ads_pci_init_irq(void) { struct pq2ads_pci_pic *priv; struct irq_domain *host; struct device_node *np; int ret = -ENODEV; int irq; np = of_find_compatible_node(NULL, NULL, "fsl,pq2ads-pci-pic"); if (!np) { printk(KERN_ERR "No pci pic node in device tree.\n"); of_node_put(np); goto out; } irq = irq_of_parse_and_map(np, 0); if (!irq) { printk(KERN_ERR "No interrupt in pci pic node.\n"); of_node_put(np); goto out; } priv = kzalloc(sizeof(*priv), GFP_KERNEL); if (!priv) { of_node_put(np); ret = -ENOMEM; goto out_unmap_irq; } /* PCI interrupt controller registers: status and mask */ priv->regs = of_iomap(np, 0); if (!priv->regs) { printk(KERN_ERR "Cannot map PCI PIC registers.\n"); goto out_free_kmalloc; } /* mask all PCI interrupts */ out_be32(&priv->regs->mask, ~0); mb(); host = irq_domain_add_linear(np, NUM_IRQS, &pci_pic_host_ops, priv); if (!host) { ret = -ENOMEM; goto out_unmap_regs; } priv->host = host; irq_set_handler_data(irq, priv); irq_set_chained_handler(irq, pq2ads_pci_irq_demux); of_node_put(np); return 0; out_unmap_regs: iounmap(priv->regs); out_free_kmalloc: kfree(priv); of_node_put(np); out_unmap_irq: irq_dispose_mapping(irq); out: return ret; }

Contributors

PersonTokensPropCommitsCommitProp
Scott Wood25094.70%114.29%
Anton Vorontsov51.89%114.29%
Grant C. Likely31.14%228.57%
JoonSoo Kim31.14%114.29%
Thomas Gleixner20.76%114.29%
Michael Ellerman10.38%114.29%
Total264100.00%7100.00%


Overall Contributors

PersonTokensPropCommitsCommitProp
Scott Wood64891.78%17.14%
Lennert Buytenhek223.12%17.14%
Anton Vorontsov101.42%214.29%
Grant C. Likely91.27%428.57%
Thomas Gleixner81.13%214.29%
Tejun Heo30.42%17.14%
JoonSoo Kim30.42%17.14%
Rune Torgersen20.28%17.14%
Michael Ellerman10.14%17.14%
Total706100.00%14100.00%
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.