static int hi6401_irq_map(struct irq_domain *d, unsigned int virq, irq_hw_number_t hw) { struct hi6401_irq *irq = d->host_data; irq_set_chip_and_handler_name(virq, &hi6401_irqchip, handle_simple_irq, "hi6401_irq"); irq_set_chip_data(virq, irq); irq_set_irq_type(virq, IRQ_TYPE_NONE); return 0; }
static int pl061_irq_map(struct irq_domain *d, unsigned int virq, irq_hw_number_t hw) { struct pl061_gpio *chip = d->host_data; irq_set_chip_and_handler_name(virq, &pl061_irqchip, handle_simple_irq, "pl061"); irq_set_chip_data(virq, chip); irq_set_irq_type(virq, IRQ_TYPE_NONE); return 0; }
struct pm_irq_chip * __devinit pm8xxx_irq_init(struct device *dev, const struct pm8xxx_irq_platform_data *pdata) { struct pm_irq_chip *chip; int devirq, rc; unsigned int pmirq; if (!pdata) { pr_err("No platform data\n"); return ERR_PTR(-EINVAL); } devirq = pdata->devirq; if (devirq < 0) { pr_err("missing devirq\n"); rc = devirq; return ERR_PTR(-EINVAL); } chip = kzalloc(sizeof(struct pm_irq_chip) + sizeof(u8) * pdata->irq_cdata.nirqs, GFP_KERNEL); if (!chip) { pr_err("Cannot alloc pm_irq_chip struct\n"); return ERR_PTR(-EINVAL); } chip->dev = dev; chip->devirq = devirq; chip->irq_base = pdata->irq_base; chip->num_irqs = pdata->irq_cdata.nirqs; chip->num_blocks = DIV_ROUND_UP(chip->num_irqs, 8); chip->num_masters = DIV_ROUND_UP(chip->num_blocks, 8); spin_lock_init(&chip->pm_irq_lock); for (pmirq = 0; pmirq < chip->num_irqs; pmirq++) { irq_set_chip_and_handler(chip->irq_base + pmirq, &pm8xxx_irq_chip, handle_level_irq); irq_set_chip_data(chip->irq_base + pmirq, chip); #ifdef CONFIG_ARM set_irq_flags(chip->irq_base + pmirq, IRQF_VALID); #else irq_set_noprobe(chip->irq_base + pmirq); #endif } irq_set_irq_type(devirq, pdata->irq_trigger_flag); irq_set_handler_data(devirq, chip); irq_set_chained_handler(devirq, pm8xxx_irq_handler); set_irq_wake(devirq, 1); return chip; }
static int rps_irq_domain_map(struct irq_domain *d, unsigned int irq, irq_hw_number_t hw) { irq_set_chip_and_handler(irq, &rps_chip, handle_level_irq); #if LINUX_VERSION_CODE < KERNEL_VERSION(4,2,0) set_irq_flags(irq, IRQF_VALID | IRQF_PROBE); #else irq_set_probe(irq); #endif irq_set_chip_data(irq, d->host_data); return 0; }
int gsc_assign_irq(struct irq_chip *type, void *data) { static int irq = GSC_IRQ_BASE; if (irq > GSC_IRQ_MAX) return NO_IRQ; irq_set_chip_and_handler(irq, type, handle_simple_irq); irq_set_chip_data(irq, data); return irq++; }
static int byt_gpio_irq_map(struct irq_domain *d, unsigned int virq, irq_hw_number_t hw) { struct byt_gpio *vg = d->host_data; irq_set_chip_and_handler_name(virq, &byt_irqchip, handle_simple_irq, "demux"); irq_set_chip_data(virq, vg); irq_set_irq_type(virq, IRQ_TYPE_NONE); return 0; }
static int gpio_rcar_irq_domain_map(struct irq_domain *h, unsigned int irq, irq_hw_number_t hwirq) { struct gpio_rcar_priv *p = h->host_data; dev_dbg(&p->pdev->dev, "map hw irq = %d, irq = %d\n", (int)hwirq, irq); irq_set_chip_data(irq, h->host_data); irq_set_chip_and_handler(irq, &p->irq_chip, handle_level_irq); set_irq_flags(irq, IRQF_VALID); /* kill me now */ return 0; }
static int em_gio_irq_domain_map(struct irq_domain *h, unsigned int virq, irq_hw_number_t hw) { struct em_gio_priv *p = h->host_data; pr_debug("gio: map hw irq = %d, virq = %d\n", (int)hw, virq); irq_set_chip_data(virq, h->host_data); irq_set_chip_and_handler(virq, &p->irq_chip, handle_level_irq); set_irq_flags(virq, IRQF_VALID); /* kill me now */ return 0; }
static int lpe_audio_irq_init(struct drm_i915_private *dev_priv) { int irq = dev_priv->lpe_audio.irq; WARN_ON(!intel_irqs_enabled(dev_priv)); irq_set_chip_and_handler_name(irq, &lpe_audio_irqchip, handle_simple_irq, "hdmi_lpe_audio_irq_handler"); return irq_set_chip_data(irq, dev_priv); }
static int adp5588_irq_setup(struct adp5588_gpio *dev) { struct i2c_client *client = dev->client; struct adp5588_gpio_platform_data *pdata = dev_get_platdata(&client->dev); unsigned gpio; int ret; adp5588_gpio_write(client, CFG, ADP5588_AUTO_INC); adp5588_gpio_write(client, INT_STAT, -1); /* status is W1C */ adp5588_gpio_read_intstat(client, dev->irq_stat); /* read to clear */ dev->irq_base = pdata->irq_base; mutex_init(&dev->irq_lock); for (gpio = 0; gpio < dev->gpio_chip.ngpio; gpio++) { int irq = gpio + dev->irq_base; irq_set_chip_data(irq, dev); irq_set_chip_and_handler(irq, &adp5588_irq_chip, handle_level_irq); irq_set_nested_thread(irq, 1); #ifdef CONFIG_ARM /* * ARM needs us to explicitly flag the IRQ as VALID, * once we do so, it will also set the noprobe. */ set_irq_flags(irq, IRQF_VALID); #else irq_set_noprobe(irq); #endif } ret = request_threaded_irq(client->irq, NULL, adp5588_irq_handler, IRQF_TRIGGER_FALLING | IRQF_ONESHOT, dev_name(&client->dev), dev); if (ret) { dev_err(&client->dev, "failed to request irq %d\n", client->irq); goto out; } dev->gpio_chip.to_irq = adp5588_gpio_to_irq; adp5588_gpio_write(client, CFG, ADP5588_AUTO_INC | ADP5588_INT_CFG | ADP5588_GPI_INT); return 0; out: dev->irq_base = 0; return ret; }
static int mx25_tsadc_domain_map(struct irq_domain *d, unsigned int irq, irq_hw_number_t hwirq) { struct mx25_tsadc *tsadc = d->host_data; irq_set_chip_data(irq, tsadc); irq_set_chip_and_handler(irq, &dummy_irq_chip, handle_level_irq); irq_modify_status(irq, IRQ_NOREQUEST, IRQ_NOPROBE); return 0; }
static int ft010_irqdomain_map(struct irq_domain *d, unsigned int irq, irq_hw_number_t hwirq) { struct ft010_irq_data *f = d->host_data; irq_set_chip_data(irq, f); /* All IRQs should set up their type, flags as bad by default */ irq_set_chip_and_handler(irq, &ft010_irq_chip, handle_bad_irq); irq_set_probe(irq); return 0; }
void __init arch_init_irq(void) { int i; clear_c0_status(0xff04); /* clear ERL */ set_c0_status(0x0400); /* set IP2 */ /* Set up MIPS CPU irq */ mips_cpu_irq_init(); /* Set up INTC irq */ intc_base = ioremap(INTC_IOBASE, 0xfff); writel(0xffffffff, intc_base + IMSR_OFF); writel(0xffffffff, intc_base + PART_OFF + IMSR_OFF); for (i = IRQ_INTC_BASE; i < IRQ_INTC_BASE + INTC_NR_IRQS; i++) { irq_set_chip_data(i, (void *)(i - IRQ_INTC_BASE)); irq_set_chip_and_handler(i, &jzintc_chip, handle_level_irq); } for (i = IRQ_OST_BASE; i < IRQ_OST_BASE + OST_NR_IRQS; i++) { irq_set_chip_data(i, (void *)(i - IRQ_OST_BASE)); irq_set_chip_and_handler(i, &ost_irq_type, handle_level_irq); } #ifdef CONFIG_SMP init_intc_affinity(); set_intc_cpu(26,0); // set_intc_cpu(27,1); #endif init_intc_mask(); init_irq_resp_fifo(); smp_enable_interrupt(0); /* enable cpu interrupt mask */ set_c0_status(IE_IRQ0 | IE_IRQ1); #ifdef CONFIG_SMP setup_ipi(); #endif return; }
static int max732x_irq_setup(struct max732x_chip *chip, const struct i2c_device_id *id) { struct i2c_client *client = chip->client; struct max732x_platform_data *pdata = client->dev.platform_data; int has_irq = max732x_features[id->driver_data] >> 32; int ret; if (pdata->irq_base && has_irq != INT_NONE) { int lvl; chip->irq_base = pdata->irq_base; chip->irq_features = has_irq; mutex_init(&chip->irq_lock); for (lvl = 0; lvl < chip->gpio_chip.ngpio; lvl++) { int irq = lvl + chip->irq_base; if (!(chip->dir_input & (1 << lvl))) continue; irq_set_chip_data(irq, chip); irq_set_chip_and_handler(irq, &max732x_irq_chip, handle_edge_irq); irq_set_nested_thread(irq, 1); #ifdef CONFIG_ARM set_irq_flags(irq, IRQF_VALID); #else irq_set_noprobe(irq); #endif } ret = request_threaded_irq(client->irq, NULL, max732x_irq_handler, IRQF_TRIGGER_FALLING | IRQF_ONESHOT, dev_name(&client->dev), chip); if (ret) { dev_err(&client->dev, "failed to request irq %d\n", client->irq); goto out_failed; } chip->gpio_chip.to_irq = max732x_gpio_to_irq; } return 0; out_failed: chip->irq_base = 0; return ret; }
static int mpc8xxx_gpio_irq_map(struct irq_domain *h, unsigned int virq, irq_hw_number_t hw) { struct mpc8xxx_gpio_chip *mpc8xxx_gc = h->host_data; if (mpc8xxx_gc->of_dev_id_data) mpc8xxx_irq_chip.irq_set_type = mpc8xxx_gc->of_dev_id_data; irq_set_chip_data(virq, h->host_data); irq_set_chip_and_handler(virq, &mpc8xxx_irq_chip, handle_level_irq); return 0; }
static void tc3589x_irq_remove(struct tc3589x *tc3589x) { int base = tc3589x->irq_base; int irq; for (irq = base; irq < base + TC3589x_NR_INTERNAL_IRQS; irq++) { #ifdef CONFIG_ARM set_irq_flags(irq, 0); #endif irq_set_chip_and_handler(irq, NULL, NULL); irq_set_chip_data(irq, NULL); } }
static int ps3_virq_destroy(unsigned int virq) { const struct ps3_private *pd = irq_get_chip_data(virq); pr_debug("%s:%d: ppe_id %llu, thread_id %llu, virq %u\n", __func__, __LINE__, pd->ppe_id, pd->thread_id, virq); irq_set_chip_data(virq, NULL); irq_dispose_mapping(virq); pr_debug("%s:%d <-\n", __func__, __LINE__); return 0; }
static int pmc_irq_map(struct irq_domain *h, unsigned int virq, irq_hw_number_t hw) { struct at91_pmc *pmc = h->host_data; irq_set_lockdep_class(virq, &pmc_lock_class); irq_set_chip_and_handler(virq, &pmc_irq, handle_level_irq); irq_set_chip_data(virq, pmc); return 0; }
/* * xgold map the irq */ int xgold_irq_domain_map(struct irq_domain *d, unsigned int virq, irq_hw_number_t hw) { struct xgold_irq_chip_data *data = d->host_data; pr_debug("%s: virq(%d) <=> hw(%d)\n", __func__, virq, (unsigned)hw); if (!data->flow_handler) data->flow_handler = handle_level_irq; irq_set_chip_and_handler(virq, data->chip, data->flow_handler); irq_set_chip_data(virq, data); /* set_irq_flags(virq, IRQF_VALID | IRQF_PROBE); */ return 0; }
static int mdss_hw_irqdomain_map(struct irq_domain *d, unsigned int irq, irq_hw_number_t hwirq) { struct msm_mdss *mdss = d->host_data; if (!(VALID_IRQS & (1 << hwirq))) return -EPERM; irq_set_chip_and_handler(irq, &mdss_hw_irq_chip, handle_level_irq); irq_set_chip_data(irq, mdss); return 0; }
static int irqc_irq_domain_map(struct irq_domain *h, unsigned int virq, irq_hw_number_t hw) { struct irqc_priv *p = h->host_data; p->irq[hw].domain_irq = virq; p->irq[hw].hw_irq = hw; irqc_dbg(&p->irq[hw], "map"); irq_set_chip_data(virq, h->host_data); irq_set_chip_and_handler(virq, &p->irq_chip, handle_level_irq); set_irq_flags(virq, IRQF_VALID); /* kill me now */ return 0; }
static int intc_irqpin_irq_domain_map(struct irq_domain *h, unsigned int virq, irq_hw_number_t hw) { struct intc_irqpin_priv *p = h->host_data; p->irq[hw].domain_irq = virq; p->irq[hw].hw_irq = hw; intc_irqpin_dbg(&p->irq[hw], "map"); irq_set_chip_data(virq, h->host_data); irq_set_lockdep_class(virq, &intc_irqpin_irq_lock_class); irq_set_chip_and_handler(virq, &p->irq_chip, handle_level_irq); return 0; }
static int davinci_gpio_irq_map(struct irq_domain *d, unsigned int irq, irq_hw_number_t hw) { struct davinci_gpio_regs __iomem *g = gpio2regs(hw); irq_set_chip_and_handler_name(irq, &gpio_irqchip, handle_simple_irq, "davinci_gpio"); irq_set_irq_type(irq, IRQ_TYPE_NONE); irq_set_chip_data(irq, (__force void *)g); irq_set_handler_data(irq, (void *)__gpio_mask(hw)); return 0; }
static int opb_host_map(struct irq_domain *host, unsigned int virq, irq_hw_number_t hwirq) { struct opb_pic *opb; opb = host->host_data; irq_set_chip_data(virq, opb); irq_set_chip_and_handler(virq, &opb_irq_chip, handle_level_irq); irq_set_irq_type(virq, IRQ_TYPE_NONE); return 0; }
static int fpga_irqdomain_map(struct irq_domain *d, unsigned int irq, irq_hw_number_t hwirq) { struct fpga_irq_data *f = d->host_data; /* Skip invalid IRQs, only register handlers for the real ones */ if (!(f->valid & BIT(hwirq))) return -EPERM; irq_set_chip_data(irq, f); irq_set_chip_and_handler(irq, &f->chip, handle_level_irq); set_irq_flags(irq, IRQF_VALID | IRQF_PROBE); return 0; }
static int __devinit tps6586x_irq_init(struct tps6586x *tps6586x, int irq, int irq_base) { int i, ret; u8 tmp[4]; if (!irq_base) { dev_warn(tps6586x->dev, "No interrupt support on IRQ base\n"); return -EINVAL; } mutex_init(&tps6586x->irq_lock); for (i = 0; i < 5; i++) { tps6586x->mask_cache[i] = 0xff; tps6586x->mask_reg[i] = 0xff; tps6586x_write(tps6586x->dev, TPS6586X_INT_MASK1 + i, 0xff); } tps6586x_reads(tps6586x->dev, TPS6586X_INT_ACK1, sizeof(tmp), tmp); tps6586x->irq_base = irq_base; tps6586x->irq_chip.name = "tps6586x"; tps6586x->irq_chip.irq_enable = tps6586x_irq_enable; tps6586x->irq_chip.irq_disable = tps6586x_irq_disable; tps6586x->irq_chip.irq_bus_lock = tps6586x_irq_lock; tps6586x->irq_chip.irq_bus_sync_unlock = tps6586x_irq_sync_unlock; for (i = 0; i < ARRAY_SIZE(tps6586x_irqs); i++) { int __irq = i + tps6586x->irq_base; irq_set_chip_data(__irq, tps6586x); irq_set_chip_and_handler(__irq, &tps6586x->irq_chip, handle_simple_irq); irq_set_nested_thread(__irq, 1); #ifdef CONFIG_ARM set_irq_flags(__irq, IRQF_VALID); #endif } ret = request_threaded_irq(irq, NULL, tps6586x_irq, IRQF_ONESHOT, "tps6586x", tps6586x); if (!ret) { device_init_wakeup(tps6586x->dev, 1); enable_irq_wake(irq); } return ret; }
static int mcp2210_irq_map(struct irq_domain *domain, unsigned int irq, irq_hw_number_t hwirq) { irq_set_chip_data(irq, domain->host_data); irq_set_chip(irq, &mcp2210_irq_chip); irq_set_nested_thread(irq, true); #ifdef CONFIG_ARM set_irq_flags(irq, IRQF_VALID); #else irq_set_noprobe(irq); #endif return 0; }
int cpu_claim_irq(unsigned int irq, struct irq_chip *type, void *data) { if (irq_has_action(irq)) return -EBUSY; if (irq_get_chip(irq) != &cpu_interrupt_type) return -EBUSY; /* for iosapic interrupts */ if (type) { irq_set_chip_and_handler(irq, type, handle_percpu_irq); irq_set_chip_data(irq, data); __cpu_unmask_irq(irq); } return 0; }
static int max8997_irq_domain_map(struct irq_domain *d, unsigned int irq, irq_hw_number_t hw) { struct max8997_dev *max8997 = d->host_data; irq_set_chip_data(irq, max8997); irq_set_chip_and_handler(irq, &max8997_irq_chip, handle_edge_irq); irq_set_nested_thread(irq, 1); #ifdef CONFIG_ARM set_irq_flags(irq, IRQF_VALID); #else irq_set_noprobe(irq); #endif return 0; }
static int xilinx_intc_map(struct irq_domain *h, unsigned int virq, irq_hw_number_t irq) { irq_set_chip_data(virq, h->host_data); if (xilinx_intc_typetable[irq] == IRQ_TYPE_LEVEL_HIGH || xilinx_intc_typetable[irq] == IRQ_TYPE_LEVEL_LOW) { irq_set_chip_and_handler(virq, &xilinx_intc_level_irqchip, handle_level_irq); } else { irq_set_chip_and_handler(virq, &xilinx_intc_edge_irqchip, handle_edge_irq); } return 0; }