/*! * This function is the work handler of mcu interrupt. * It reads the events status and trigger the pseudo irq. */ static void mcu_event_handler(struct work_struct *work) { int i, err; unsigned int flag1, flag2; /* read int flags and ack int */ for (i = 0; i < 3; i++) { err = mcu_pmic_read_reg(REG_MCU_INT_FLAG_1, &flag1, 0xFFFFFFFF); err |= mcu_pmic_read_reg(REG_MCU_INT_FLAG_2, &flag2, 0xFFFFFFFF); err |= mcu_pmic_write_reg(REG_MCU_INT_FLAG_1, 0, 0xFFFFFFFF); err |= mcu_pmic_write_reg(REG_MCU_INT_FLAG_2, 0, 0xFFFFFFFF); if (err == 0) break; } if (i >= 3) { printk(KERN_ERR "Reads MCU event fail\n"); goto no_new_events; } for (i = 0; flag1 && (i < MCU_INT_RTC); i++, flag1 >>= 1) if (flag1 & 1) set_bit(i, &pseudo_irq_pending); for (i = MCU_INT_RTC; flag2 && (i <= MCU_INT_KEYPAD); i++, flag2 >>= 1) if (flag2 & 1) set_bit(i, &pseudo_irq_pending); no_new_events: if (pseudo_irq_pending & pseudo_irq_enable) mxc_pseudo_irq_trigger(); enable_irq(gpio_to_irq(0)); }
int pmic_gpio_get_designation_bit_val(unsigned int bit, unsigned int *val) { unsigned int reg_read_val; u8 reg_mask = 0; if (bit > 7) return -1; SET_BIT_IN_BYTE(reg_mask, bit); CHECK_ERROR( mcu_pmic_read_reg(REG_MCU_DES_FLAG, ®_read_val, reg_mask)); if (0 == reg_read_val) *val = 0; else *val = 1; return 0; }
int pmic_gpio_get_bit_val(int reg, unsigned int bit, unsigned int *val) { int reg_name; unsigned int reg_read_val; u8 reg_mask = 0; if (bit > 7) return -1; switch (reg) { case MCU_GPIO_REG_RESET_1: reg_name = REG_MCU_RESET_1; break; case MCU_GPIO_REG_RESET_2: reg_name = REG_MCU_RESET_2; break; case MCU_GPIO_REG_POWER_CONTROL: reg_name = REG_MCU_POWER_CTL; break; case MCU_GPIO_REG_GPIO_CONTROL_1: reg_name = REG_MCU_GPIO_1; break; case MCU_GPIO_REG_GPIO_CONTROL_2: reg_name = REG_MCU_GPIO_2; break; default: return -1; } SET_BIT_IN_BYTE(reg_mask, bit); CHECK_ERROR(mcu_pmic_read_reg(reg_name, ®_read_val, reg_mask)); if (0 == reg_read_val) *val = 0; else *val = 1; return 0; }