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_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; }
int msm_mpm_set_pin_wake(unsigned int pin, unsigned int on) { uint32_t index = MSM_MPM_IRQ_INDEX(pin); uint32_t mask = MSM_MPM_IRQ_MASK(pin); unsigned long flags; spin_lock_irqsave(&msm_mpm_lock, flags); if (on) msm_mpm_wake_irq[index] |= mask; else msm_mpm_wake_irq[index] &= ~mask; spin_unlock_irqrestore(&msm_mpm_lock, flags); return 0; }
int msm_mpm_enable_pin(unsigned int pin, unsigned int enable) { uint32_t index = MSM_MPM_IRQ_INDEX(pin); uint32_t mask = MSM_MPM_IRQ_MASK(pin); unsigned long flags; spin_lock_irqsave(&msm_mpm_lock, flags); if (enable) msm_mpm_enabled_irq[index] |= mask; else msm_mpm_enabled_irq[index] &= ~mask; spin_unlock_irqrestore(&msm_mpm_lock, flags); return 0; }
int msm_mpm_set_pin_type(unsigned int pin, unsigned int flow_type) { uint32_t index = MSM_MPM_IRQ_INDEX(pin); uint32_t mask = MSM_MPM_IRQ_MASK(pin); unsigned long flags; spin_lock_irqsave(&msm_mpm_lock, flags); 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; spin_unlock_irqrestore(&msm_mpm_lock, flags); return 0; }