/** * extended_standby_disable_wakeup_src - disable the wakeup src. * * function: if the device driver do not want the system be wakenup while in standby state again. * the device driver should use this function to disable the corresponding intterupt. * * @src: wakeup src. * @para: if wakeup src need para, be the para of wakeup src, * else ignored. * notice: for gpio intterupt, only access the enable bit, mean u need care about other config, * such as: int mode, pull up or pull down resistance, etc. */ int extended_standby_disable_wakeup_src(cpu_wakeup_src_e src, int para) { unsigned long irqflags; spin_lock_irqsave(&data_lock, irqflags); extended_standby_manager.event &= (~src); if (CPUS_GPIO_SRC & src) { if ( para > GPIO_INDEX_END){ pr_info("gpio config err. \n"); }else if ( para >= AXP_NR_BASE) { extended_standby_manager.wakeup_gpio_map &= (~(WAKEUP_GPIO_AXP((para - AXP_NR_BASE)))); }else if ( para >= PM_NR_BASE) { extended_standby_manager.wakeup_gpio_map &= (~(WAKEUP_GPIO_PM((para - PM_NR_BASE)))); }else if ( para >= PL_NR_BASE) { extended_standby_manager.wakeup_gpio_map &= (~(WAKEUP_GPIO_PL((para - PL_NR_BASE)))); }else if ( para >= PH_NR_BASE) { extended_standby_manager.wakeup_gpio_group &= (~(WAKEUP_GPIO_GROUP('H'))); }else if ( para >= PG_NR_BASE) { extended_standby_manager.wakeup_gpio_group &= (~(WAKEUP_GPIO_GROUP('G'))); }else if ( para >= PF_NR_BASE) { extended_standby_manager.wakeup_gpio_group &= (~(WAKEUP_GPIO_GROUP('F'))); }else if ( para >= PE_NR_BASE) { extended_standby_manager.wakeup_gpio_group &= (~(WAKEUP_GPIO_GROUP('E'))); }else if ( para >= PD_NR_BASE) { extended_standby_manager.wakeup_gpio_group &= (~(WAKEUP_GPIO_GROUP('D'))); }else if ( para >= PC_NR_BASE) { extended_standby_manager.wakeup_gpio_group &= (~(WAKEUP_GPIO_GROUP('C'))); }else if ( para >= PA_NR_BASE) { extended_standby_manager.wakeup_gpio_group &= (~(WAKEUP_GPIO_GROUP('B'))); }else if ( para >= PB_NR_BASE) { extended_standby_manager.wakeup_gpio_group &= (~(WAKEUP_GPIO_GROUP('A'))); }else { pr_info("cpux need care gpio %d. but, notice, currently, \ cpux not support it.\n", para); } if (0 == para) { extended_standby_manager.wakeup_gpio_map = 0; extended_standby_manager.wakeup_gpio_group = 0; } } spin_unlock_irqrestore(&data_lock, irqflags); EXSTANDBY_DBG("leave %s : event 0x%lx\n", __func__, extended_standby_manager.event); EXSTANDBY_DBG("leave %s : wakeup_gpio_map 0x%lx\n", __func__, extended_standby_manager.wakeup_gpio_map); EXSTANDBY_DBG("leave %s : wakeup_gpio_group 0x%lx\n", __func__, extended_standby_manager.wakeup_gpio_group); return 0; }
/** * extended_standby_enable_wakeup_src - enable the wakeup src. * * function: the device driver care about the wakeup src. * if the device driver do want the system be wakenup while in standby state. * the device driver should use this function to enable corresponding intterupt. * @src: wakeup src. * @para: if wakeup src need para, be the para of wakeup src, * else ignored. * notice: 1. for gpio intterupt, only access the enable bit, mean u need care about other config, * such as: int mode, pull up or pull down resistance, etc. * 2. At a31, only gpio��pa, pb, pe, pg, pl, pm��int wakeup src is supported. */ int extended_standby_enable_wakeup_src(cpu_wakeup_src_e src, int para) { unsigned long irqflags; spin_lock_irqsave(&data_lock, irqflags); extended_standby_manager.event |= src; if (CPUS_GPIO_SRC & src) { if ( para >= AXP_PIN_BASE) { extended_standby_manager.wakeup_gpio_map |= (WAKEUP_GPIO_AXP((para - AXP_PIN_BASE))); } else if ( para >= SUNXI_PM_BASE) { extended_standby_manager.wakeup_gpio_map |= (WAKEUP_GPIO_PM((para - SUNXI_PM_BASE))); } else if ( para >= SUNXI_PL_BASE) { extended_standby_manager.wakeup_gpio_map |= (WAKEUP_GPIO_PL((para - SUNXI_PL_BASE))); } else if ( para >= SUNXI_PH_BASE) { extended_standby_manager.wakeup_gpio_group |= (WAKEUP_GPIO_GROUP('H')); } else if ( para >= SUNXI_PG_BASE) { extended_standby_manager.wakeup_gpio_group |= (WAKEUP_GPIO_GROUP('G')); } else if ( para >= SUNXI_PF_BASE) { extended_standby_manager.wakeup_gpio_group |= (WAKEUP_GPIO_GROUP('F')); } else if ( para >= SUNXI_PE_BASE) { extended_standby_manager.wakeup_gpio_group |= (WAKEUP_GPIO_GROUP('E')); } else if ( para >= SUNXI_PD_BASE) { extended_standby_manager.wakeup_gpio_group |= (WAKEUP_GPIO_GROUP('D')); } else if ( para >= SUNXI_PC_BASE) { extended_standby_manager.wakeup_gpio_group |= (WAKEUP_GPIO_GROUP('C')); } else if ( para >= SUNXI_PB_BASE) { extended_standby_manager.wakeup_gpio_group |= (WAKEUP_GPIO_GROUP('B')); } else if ( para >= SUNXI_PA_BASE) { extended_standby_manager.wakeup_gpio_group |= (WAKEUP_GPIO_GROUP('A')); } else { pr_info("cpux need care gpio %d. but, notice, currently, \ cpux not support it.\n", para); } } spin_unlock_irqrestore(&data_lock, irqflags); EXSTANDBY_DBG("leave %s : event 0x%lx\n", __func__, extended_standby_manager.event); EXSTANDBY_DBG("leave %s : wakeup_gpio_map 0x%lx\n", __func__, extended_standby_manager.wakeup_gpio_map); EXSTANDBY_DBG("leave %s : wakeup_gpio_group 0x%lx\n", __func__, extended_standby_manager.wakeup_gpio_group); return 0; }