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(); }
void __enable_irq(struct irq_desc *desc, unsigned int irq, bool resume) { if (resume) { if (!(desc->istate & IRQS_SUSPENDED)) { if (!desc->action) return; if (!(desc->action->flags & IRQF_FORCE_RESUME)) return; /* Pretend that it got disabled ! */ desc->depth++; } desc->istate &= ~IRQS_SUSPENDED; } switch (desc->depth) { case 0: err_out: WARN(1, KERN_WARNING "Unbalanced enable for IRQ %d\n", irq); break; case 1: { if (desc->istate & IRQS_SUSPENDED) goto err_out; /* Prevent probing on this irq: */ irq_settings_set_noprobe(desc); irq_enable(desc); check_irq_resend(desc, irq); /* fall-through */ } default: desc->depth--; } }
/** * enable_irq - enable handling of an irq * @irq: Interrupt to enable * * Undoes the effect of one call to disable_irq(). If this * matches the last disable, processing of interrupts on this * IRQ line is re-enabled. * * This function may be called from IRQ context. */ void enable_irq(unsigned int irq) { struct irq_desc *desc = irq_desc + irq; unsigned long flags; if (irq >= NR_IRQS) return; spin_lock_irqsave(&desc->lock, flags); switch (desc->depth) { case 0: printk(KERN_WARNING "Unbalanced enable for IRQ %d\n", irq); WARN_ON(1); break; case 1: { unsigned int status = desc->status & ~IRQ_DISABLED; /* Prevent probing on this irq: */ desc->status = status | IRQ_NOPROBE; check_irq_resend(desc, irq); /* fall-through */ } default: desc->depth--; } spin_unlock_irqrestore(&desc->lock, flags); }
void __enable_irq(struct irq_desc *desc, unsigned int irq, bool resume) { if (resume) desc->status &= ~IRQ_SUSPENDED; switch (desc->depth) { case 0: err_out: WARN(1, KERN_WARNING "Unbalanced enable for IRQ %d\n", irq); break; case 1: { unsigned int status = desc->status & ~IRQ_DISABLED; if (desc->status & IRQ_SUSPENDED) goto err_out; /* Prevent probing on this irq: */ desc->status = status | IRQ_NOPROBE; check_irq_resend(desc, irq); /* fall-through */ } default: desc->depth--; } }
int irq_startup(struct irq_desc *desc, bool resend, bool force) { struct irq_data *d = irq_desc_get_irq_data(desc); struct cpumask *aff = irq_data_get_affinity_mask(d); int ret = 0; desc->depth = 0; if (irqd_is_started(d)) { irq_enable(desc); } else { switch (__irq_startup_managed(desc, aff, force)) { case IRQ_STARTUP_NORMAL: ret = __irq_startup(desc); irq_setup_affinity(desc); break; case IRQ_STARTUP_MANAGED: irq_do_set_affinity(d, aff, false); ret = __irq_startup(desc); break; case IRQ_STARTUP_ABORT: irqd_set_managed_shutdown(d); return 0; } } if (resend) check_irq_resend(desc); return ret; }
void __enable_irq(struct irq_desc *desc, unsigned int irq, bool resume) { if (resume) { if (!(desc->istate & IRQS_SUSPENDED)) { if (!desc->action) return; if (!(desc->action->flags & IRQF_FORCE_RESUME)) return; desc->depth++; } desc->istate &= ~IRQS_SUSPENDED; } switch (desc->depth) { case 0: err_out: WARN(1, KERN_WARNING "Unbalanced enable for IRQ %d, desc->istate=0x%x, desc->depth=%d\n", irq, desc->istate, desc->depth); break; case 1: { if (desc->istate & IRQS_SUSPENDED) goto err_out; irq_settings_set_noprobe(desc); irq_enable(desc); check_irq_resend(desc, irq); } default: desc->depth--; } }
void touch_resend_irq(unsigned int irq) { struct irq_desc *desc = irq_to_desc(irq); if (desc) { if (desc->istate & 0x00000200 /*IRQS_PENDING*/) TOUCH_D(BASE_INFO, "irq(%d) pending\n", irq); check_irq_resend(desc, irq); } }
/* <-- [email protected] add enable/disable irq function for solving mg touch suspend/resume issue */ int __set_tg_irq_status(struct irq_desc *desc, unsigned int irq, bool resume) { if (resume) { desc->status = IRQ_NOPROBE | IRQ_TYPE_EDGE_FALLING; desc->depth = 0; } else { desc->status = IRQ_NOPROBE | IRQ_DISABLED | IRQ_TYPE_EDGE_FALLING; desc->depth = 1; } check_irq_resend(desc, irq); return desc->status; }
int irq_startup(struct irq_desc *desc, bool resend) { int ret = 0; irq_state_clr_disabled(desc); desc->depth = 0; if (desc->irq_data.chip->irq_startup) { ret = desc->irq_data.chip->irq_startup(&desc->irq_data); irq_state_clr_masked(desc); } else { irq_enable(desc); } if (resend) check_irq_resend(desc, desc->irq_data.irq); return ret; }
static void __enable_irq(struct irq_desc *desc, unsigned int irq) { switch (desc->depth) { case 0: WARN(1, KERN_WARNING "Unbalanced enable for IRQ %d\n", irq); break; case 1: { unsigned int status = desc->status & ~IRQ_DISABLED; /* Prevent probing on this irq: */ desc->status = status | IRQ_NOPROBE; check_irq_resend(desc, irq); /* fall-through */ } default: desc->depth--; } }
void __enable_irq(struct irq_desc *desc, unsigned int irq) { switch (desc->depth) { case 0: err_out: WARN(1, KERN_WARNING "Unbalanced enable for IRQ %d\n", irq); break; case 1: { if (desc->istate & IRQS_SUSPENDED) goto err_out; /* Prevent probing on this irq: */ irq_settings_set_noprobe(desc); irq_enable(desc); check_irq_resend(desc, irq); /* fall-through */ } default: desc->depth--; } }
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) || ((!from_idle) && (MSM_MPM_DEBUG_SUSPEND_PENDING_IRQ & msm_mpm_debug_mask))) pr_info("%s: pending.%d: 0x%08lx\n", __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; /* * This function is called when only CPU 0 is * running and when both preemption and irqs * are disabled. There is no need to lock desc. */ if (desc && (desc->status & IRQ_TYPE_EDGE_BOTH)) { desc->status |= IRQ_PENDING; if (from_idle) check_irq_resend(desc, apps_irq); } k = find_next_bit(&pending, 32, k + 1); } } msm_mpm_set(!from_idle); }
/* * 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 }