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_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_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 int __init msm_mpm_early_init(void) { uint8_t mpm_irq; uint16_t apps_irq; for (mpm_irq = 0; msm_mpm_is_valid_mpm_irq(mpm_irq); mpm_irq++) { apps_irq = msm_mpm_get_irq_m2a(mpm_irq); if (apps_irq && msm_mpm_is_valid_apps_irq(apps_irq)) msm_mpm_set_irq_a2m(apps_irq, mpm_irq); } return 0; }