void msm_mpm_exit_sleep(bool from_idle) { unsigned long pending; int i; int k; for (i = 0; i < MSM_MPM_REG_WIDTH; i++) { pending = msm_mpm_read(MSM_MPM_STATUS_REG_PENDING, i); if (MSM_MPM_DEBUG_PENDING_IRQ & msm_mpm_debug_mask) pr_info("%s: pending.%d: 0x%08lx", __func__, i, pending); k = find_first_bit(&pending, 32); while (k < 32) { unsigned int mpm_irq = 32 * i + k; unsigned int apps_irq = msm_mpm_get_irq_m2a(mpm_irq); struct irq_desc *desc = apps_irq ? irq_to_desc(apps_irq) : NULL; if (desc && !irqd_is_level_type(&desc->irq_data)) { irq_set_pending(apps_irq); if (from_idle) check_irq_resend(desc, apps_irq); } k = find_next_bit(&pending, 32, k + 1); } } msm_mpm_clear(); }
static int probe_setup_port(struct fintek_8250 *pdata, struct uart_8250_port *uart) { static const u16 addr[] = {0x4e, 0x2e}; static const u8 keys[] = {0x77, 0xa0, 0x87, 0x67}; struct irq_data *irq_data; bool level_mode = false; int i, j, k, min, max; for (i = 0; i < ARRAY_SIZE(addr); i++) { for (j = 0; j < ARRAY_SIZE(keys); j++) { pdata->base_port = addr[i]; pdata->key = keys[j]; if (fintek_8250_enter_key(addr[i], keys[j])) continue; if (fintek_8250_check_id(pdata) || fintek_8250_get_ldn_range(pdata, &min, &max)) { fintek_8250_exit_key(addr[i]); continue; } for (k = min; k < max; k++) { u16 aux; sio_write_reg(pdata, LDN, k); aux = sio_read_reg(pdata, IO_ADDR1); aux |= sio_read_reg(pdata, IO_ADDR2) << 8; if (aux != uart->port.iobase) continue; pdata->index = k; irq_data = irq_get_irq_data(uart->port.irq); if (irq_data) level_mode = irqd_is_level_type(irq_data); fintek_8250_set_irq_mode(pdata, level_mode); fintek_8250_set_max_fifo(pdata); fintek_8250_goto_highspeed(uart, pdata); fintek_8250_exit_key(addr[i]); return 0; } fintek_8250_exit_key(addr[i]); } } return -ENODEV; }
static void intc_enable_or_unmask(struct irq_data *d) { unsigned long mask = 1 << d->irq; pr_debug("enable_or_unmask: %d\n", d->irq); out_be32(INTC_BASE + SIE, mask); /* ack level irqs because they can't be acked during * ack function since the handle_level_irq function * acks the irq before calling the interrupt handler */ if (irqd_is_level_type(d)) out_be32(INTC_BASE + IAR, mask); }
static ssize_t type_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf) { struct irq_desc *desc = container_of(kobj, struct irq_desc, kobj); ssize_t ret = 0; raw_spin_lock_irq(&desc->lock); ret = sprintf(buf, "%s\n", irqd_is_level_type(&desc->irq_data) ? "level" : "edge"); raw_spin_unlock_irq(&desc->lock); return ret; }
static void s5p_irq_eint_unmask(struct irq_data *data) { u32 mask; /* for level triggered interrupts, masking doesn't prevent * the interrupt from becoming pending again. by the time * the handler (either irq or thread) can do its thing to clear * the interrupt, it's too late because it could be pending * already. we have to ack it here, after the handler runs, * or else we get a false interrupt. */ if (irqd_is_level_type(data)) s5p_irq_eint_ack(data); mask = __raw_readl(S5P_EINT_MASK(EINT_REG_NR(data->irq))); mask &= ~(eint_irq_to_bit(data->irq)); __raw_writel(mask, S5P_EINT_MASK(EINT_REG_NR(data->irq))); }
int fintek_8250_probe(struct uart_8250_port *uart) { struct fintek_8250 *pdata; struct fintek_8250 probe_data; struct irq_data *irq_data = irq_get_irq_data(uart->port.irq); bool level_mode = irqd_is_level_type(irq_data); if (find_base_port(&probe_data, uart->port.iobase)) return -ENODEV; pdata = devm_kzalloc(uart->port.dev, sizeof(*pdata), GFP_KERNEL); if (!pdata) return -ENOMEM; memcpy(pdata, &probe_data, sizeof(probe_data)); uart->port.rs485_config = fintek_8250_rs485_config; uart->port.private_data = pdata; return fintek_8250_set_irq_mode(pdata, level_mode); }
/* * Restore interrupt subsystem from sleep -- phase 2 * Poke the specified pending interrupts into interrupt hardware. */ void msm_gic_irq_exit_sleep2(uint32_t irq_mask, uint32_t wakeup_reason, uint32_t pending) { int i, smsm_irq, smsm_mask; struct irq_desc *desc; if (msm_gic_irq_debug_mask & IRQ_DEBUG_SLEEP) pr_info("%s %x %x %x now\n", __func__, irq_mask, pending, wakeup_reason); for (i = 0; pending && i < ARRAY_SIZE(msm_gic_irq_to_smsm); i++) { smsm_irq = msm_gic_irq_to_smsm[i]; if (smsm_irq == 0) continue; smsm_mask = BIT(smsm_irq - 1); if (!(pending & smsm_mask)) continue; pending &= ~smsm_mask; if (msm_gic_irq_debug_mask & IRQ_DEBUG_SLEEP_INT) pr_info("%s, irq %d, still pending %x now\n", __func__, i, pending); /* Peding IRQ */ desc = i ? irq_to_desc(i) : NULL; /* Check if the pending */ if (desc && !irqd_is_level_type(&desc->irq_data)) { /* Mark the IRQ as pending, if not Level */ irq_set_pending(i); check_irq_resend(desc, i); } } }
void msm_mpm_exit_sleep(bool from_idle) { #ifndef CONFIG_PM_LOG_SIM_TEST unsigned long pending; int i; int k; for (i = 0; i < MSM_MPM_REG_WIDTH; i++) { pending = msm_mpm_read(MSM_MPM_STATUS_REG_PENDING, i); if (MSM_MPM_DEBUG_PENDING_IRQ & msm_mpm_debug_mask) pr_info("%s: pending.%d: 0x%08lx", __func__, i, pending); #ifdef CONFIG_PM_LOG pmlog_update_status(i, pending); #endif //CONFIG_PM_LOG k = find_first_bit(&pending, 32); while (k < 32) { unsigned int mpm_irq = 32 * i + k; unsigned int apps_irq = msm_mpm_get_irq_m2a(mpm_irq); struct irq_desc *desc = apps_irq ? irq_to_desc(apps_irq) : NULL; //Print wake up irq to debug power consumption /* Terry Cheng, 20120607, Needn't show wake up reason when waking from idle thread {*/ if(!from_idle) printk("mpm_irq = %d, apps_irq = %d\n", mpm_irq, apps_irq); /* } Terry Cheng, 20120607, Needn't show wake up reason when waking from idle thread */ if (desc && !irqd_is_level_type(&desc->irq_data)) { irq_set_pending(apps_irq); if (from_idle) check_irq_resend(desc, apps_irq); } k = find_next_bit(&pending, 32, k + 1); } } msm_mpm_clear(); #else unsigned long pending; int i; uint rand_interrupt; uint rand_which; srandom32((uint)jiffies); rand_interrupt = random32(); rand_which = random32(); //update wake up source pending = rand_interrupt % 32; pending = 1 << pending; i = rand_which % 2; //pending = pending % 31; pr_info("%s: pending.%d: 0x%08lx", __func__, i, pending); #ifdef CONFIG_PM_LOG pmlog_update_status(i, pending); #endif //CONFIG_PM_LOG return; #endif //CONFIG_PM_LOG_SIM_TEST }