cregit-Linux how code gets into the kernel

Release 4.7 drivers/irqchip/irq-sirfsoc.c

Directory: drivers/irqchip
/*
 * interrupt controller support for CSR SiRFprimaII
 *
 * Copyright (c) 2011 Cambridge Silicon Radio Limited, a CSR plc group company.
 *
 * Licensed under GPLv2 or later.
 */

#include <linux/init.h>
#include <linux/io.h>
#include <linux/irq.h>
#include <linux/of.h>
#include <linux/of_address.h>
#include <linux/irqchip.h>
#include <linux/irqdomain.h>
#include <linux/syscore_ops.h>
#include <asm/mach/irq.h>
#include <asm/exception.h>


#define SIRFSOC_INT_RISC_MASK0		0x0018

#define SIRFSOC_INT_RISC_MASK1		0x001C

#define SIRFSOC_INT_RISC_LEVEL0		0x0020

#define SIRFSOC_INT_RISC_LEVEL1		0x0024

#define SIRFSOC_INIT_IRQ_ID		0x0038

#define SIRFSOC_INT_BASE_OFFSET		0x0004


#define SIRFSOC_NUM_IRQS		64

#define SIRFSOC_NUM_BANKS		(SIRFSOC_NUM_IRQS / 32)


static struct irq_domain *sirfsoc_irqdomain;


static __init void sirfsoc_alloc_gc(void __iomem *base) { unsigned int clr = IRQ_NOREQUEST | IRQ_NOPROBE | IRQ_NOAUTOEN; unsigned int set = IRQ_LEVEL; struct irq_chip_generic *gc; struct irq_chip_type *ct; int i; irq_alloc_domain_generic_chips(sirfsoc_irqdomain, 32, 1, "irq_sirfsoc", handle_level_irq, clr, set, IRQ_GC_INIT_MASK_CACHE); for (i = 0; i < SIRFSOC_NUM_BANKS; i++) { gc = irq_get_domain_generic_chip(sirfsoc_irqdomain, i * 32); gc->reg_base = base + i * SIRFSOC_INT_BASE_OFFSET; ct = gc->chip_types; ct->chip.irq_mask = irq_gc_mask_clr_bit; ct->chip.irq_unmask = irq_gc_mask_set_bit; ct->regs.mask = SIRFSOC_INT_RISC_MASK0; } }

Contributors

PersonTokensPropCommitsCommitProp
binghua duanbinghua duan5039.68%125.00%
barry songbarry song4031.75%250.00%
thomas gleixnerthomas gleixner3628.57%125.00%
Total126100.00%4100.00%


static void __exception_irq_entry sirfsoc_handle_irq(struct pt_regs *regs) { void __iomem *base = sirfsoc_irqdomain->host_data; u32 irqstat; irqstat = readl_relaxed(base + SIRFSOC_INIT_IRQ_ID); handle_domain_irq(sirfsoc_irqdomain, irqstat & 0xff, regs); }

Contributors

PersonTokensPropCommitsCommitProp
barry songbarry song2965.91%133.33%
arnd bergmannarnd bergmann1431.82%133.33%
marc zyngiermarc zyngier12.27%133.33%
Total44100.00%3100.00%


static int __init sirfsoc_irq_init(struct device_node *np, struct device_node *parent) { void __iomem *base = of_iomap(np, 0); if (!base) panic("unable to map intc cpu registers\n"); sirfsoc_irqdomain = irq_domain_add_linear(np, SIRFSOC_NUM_IRQS, &irq_generic_chip_ops, base); sirfsoc_alloc_gc(base); writel_relaxed(0, base + SIRFSOC_INT_RISC_LEVEL0); writel_relaxed(0, base + SIRFSOC_INT_RISC_LEVEL1); writel_relaxed(0, base + SIRFSOC_INT_RISC_MASK0); writel_relaxed(0, base + SIRFSOC_INT_RISC_MASK1); set_handle_irq(sirfsoc_handle_irq); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
arnd bergmannarnd bergmann6866.67%120.00%
binghua duanbinghua duan2423.53%120.00%
barry songbarry song76.86%240.00%
grant likelygrant likely32.94%120.00%
Total102100.00%5100.00%

IRQCHIP_DECLARE(sirfsoc_intc, "sirf,prima2-intc", sirfsoc_irq_init); struct sirfsoc_irq_status { u32 mask0; u32 mask1; u32 level0; u32 level1; }; static struct sirfsoc_irq_status sirfsoc_irq_st;
static int sirfsoc_irq_suspend(void) { void __iomem *base = sirfsoc_irqdomain->host_data; sirfsoc_irq_st.mask0 = readl_relaxed(base + SIRFSOC_INT_RISC_MASK0); sirfsoc_irq_st.mask1 = readl_relaxed(base + SIRFSOC_INT_RISC_MASK1); sirfsoc_irq_st.level0 = readl_relaxed(base + SIRFSOC_INT_RISC_LEVEL0); sirfsoc_irq_st.level1 = readl_relaxed(base + SIRFSOC_INT_RISC_LEVEL1); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
barry songbarry song5179.69%150.00%
arnd bergmannarnd bergmann1320.31%150.00%
Total64100.00%2100.00%


static void sirfsoc_irq_resume(void) { void __iomem *base = sirfsoc_irqdomain->host_data; writel_relaxed(sirfsoc_irq_st.mask0, base + SIRFSOC_INT_RISC_MASK0); writel_relaxed(sirfsoc_irq_st.mask1, base + SIRFSOC_INT_RISC_MASK1); writel_relaxed(sirfsoc_irq_st.level0, base + SIRFSOC_INT_RISC_LEVEL0); writel_relaxed(sirfsoc_irq_st.level1, base + SIRFSOC_INT_RISC_LEVEL1); }

Contributors

PersonTokensPropCommitsCommitProp
barry songbarry song4878.69%150.00%
arnd bergmannarnd bergmann1321.31%150.00%
Total61100.00%2100.00%

static struct syscore_ops sirfsoc_irq_syscore_ops = { .suspend = sirfsoc_irq_suspend, .resume = sirfsoc_irq_resume, };
static int __init sirfsoc_irq_pm_init(void) { if (!sirfsoc_irqdomain) return 0; register_syscore_ops(&sirfsoc_irq_syscore_ops); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
barry songbarry song1869.23%150.00%
arnd bergmannarnd bergmann830.77%150.00%
Total26100.00%2100.00%

device_initcall(sirfsoc_irq_pm_init);

Overall Contributors

PersonTokensPropCommitsCommitProp
barry songbarry song25045.87%545.45%
arnd bergmannarnd bergmann13224.22%19.09%
binghua duanbinghua duan11020.18%19.09%
thomas gleixnerthomas gleixner448.07%19.09%
joel porquetjoel porquet50.92%19.09%
grant likelygrant likely30.55%19.09%
marc zyngiermarc zyngier10.18%19.09%
Total545100.00%11100.00%
Directory: drivers/irqchip
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
{% endraw %}