static int msm_mpm_set_irq_type_exclusive( unsigned int irq, unsigned int flow_type) { uint32_t mpm_irq; if (!msm_mpm_is_valid_apps_irq(irq)) return -EINVAL; if (msm_mpm_bypass_apps_irq(irq)) return 0; mpm_irq = msm_mpm_get_irq_a2m(irq); if (mpm_irq) { uint32_t index = MSM_MPM_IRQ_INDEX(mpm_irq); uint32_t mask = MSM_MPM_IRQ_MASK(mpm_irq); if (index >= MSM_MPM_REG_WIDTH) return -EFAULT; if (flow_type & IRQ_TYPE_EDGE_BOTH) msm_mpm_detect_ctl[index] |= mask; else msm_mpm_detect_ctl[index] &= ~mask; if (flow_type & (IRQ_TYPE_EDGE_RISING | IRQ_TYPE_LEVEL_HIGH)) msm_mpm_polarity[index] |= mask; else msm_mpm_polarity[index] &= ~mask; } return 0; }
static int msm_mpm_enable_irq_exclusive( unsigned int irq, bool enable, bool wakeset) { uint32_t mpm_irq; if (!msm_mpm_is_valid_apps_irq(irq)) return -EINVAL; if (msm_mpm_bypass_apps_irq(irq)) return 0; mpm_irq = msm_mpm_get_irq_a2m(irq); if (mpm_irq) { uint32_t *mpm_irq_masks = wakeset ? msm_mpm_wake_irq : msm_mpm_enabled_irq; uint32_t index = MSM_MPM_IRQ_INDEX(mpm_irq); uint32_t mask = MSM_MPM_IRQ_MASK(mpm_irq); if (enable) mpm_irq_masks[index] |= mask; else mpm_irq_masks[index] &= ~mask; } else { unsigned long *apps_irq_bitmap = wakeset ? msm_mpm_wake_apps_irqs : msm_mpm_enabled_apps_irqs; if (enable) __set_bit(irq, apps_irq_bitmap); else __clear_bit(irq, apps_irq_bitmap); } return 0; }
static int msm_gic_set_irq_wake(struct irq_data *d, unsigned int on) { uint32_t mask; int smsm_irq = msm_gic_irq_to_smsm[d->irq]; if (smsm_irq == 0) { pr_err("bad wake up irq %d\n", d->irq); return -EINVAL; } /* check whether irq to be bypassed are not */ if (msm_mpm_bypass_apps_irq(d->irq)) return 0; if (smsm_irq == SMSM_FAKE_IRQ) return 0; mask = GIC_IRQ_MASK(smsm_irq - 1); if (on) msm_gic_irq_smsm_wake_enable[1] |= mask; else msm_gic_irq_smsm_wake_enable[1] &= ~mask; return 0; }
static int msm_mpm_set_irq_type_exclusive( unsigned int irq, unsigned int flow_type) { uint32_t mpm_irq; if (!msm_mpm_is_valid_apps_irq(irq)) return -EINVAL; if (msm_mpm_bypass_apps_irq(irq)) return 0; mpm_irq = msm_mpm_get_irq_a2m(irq); if (mpm_irq) { uint32_t index = MSM_MPM_IRQ_INDEX(mpm_irq); uint32_t mask = MSM_MPM_IRQ_MASK(mpm_irq); if (index >= MSM_MPM_REG_WIDTH) return -EFAULT; if (flow_type & IRQ_TYPE_EDGE_BOTH) msm_mpm_detect_ctl[index] |= mask; else msm_mpm_detect_ctl[index] &= ~mask; if(index == 1 &&(irq ==356 || irq ==357)){ msm_mpm_polarity[1] = msm_mpm_polarity[1] & (~(1 << 13)); //printk(KERN_ERR "[%s] msm_mpm_polarity[1] = 0x%x \n", __func__, msm_mpm_polarity[index]); }else if (flow_type & (IRQ_TYPE_EDGE_RISING | IRQ_TYPE_LEVEL_HIGH)) msm_mpm_polarity[index] |= mask; else msm_mpm_polarity[index] &= ~mask; } return 0; }
static void msm_gic_unmask_irq(struct irq_data *d) { unsigned int index = GIC_IRQ_INDEX(d->irq); uint32_t mask; int smsm_irq = msm_gic_irq_to_smsm[d->irq]; mask = GIC_IRQ_MASK(d->irq); /* check whether irq to be bypassed are not */ if (msm_mpm_bypass_apps_irq(d->irq)) return; if (smsm_irq == 0) { msm_gic_irq_idle_disable[index] |= mask; } else { mask = GIC_IRQ_MASK(smsm_irq - 1); msm_gic_irq_smsm_wake_enable[0] |= mask; } }
static void msm_gic_mask_irq(struct irq_data *d) { unsigned int index = GIC_IRQ_INDEX(d->irq); uint32_t mask; int smsm_irq = msm_gic_irq_to_smsm[d->irq]; mask = GIC_IRQ_MASK(d->irq); if (msm_mpm_bypass_apps_irq(d->irq)) return; if (smsm_irq == 0) { msm_gic_irq_idle_disable[index] &= ~mask; } else { mask = GIC_IRQ_MASK(smsm_irq - 1); msm_gic_irq_smsm_wake_enable[0] &= ~mask; } }