/** * set_extended_standby_manager - set the extended_standby_manager; * manager@: the manager config. * * return value: if the setting is correct, return true. * else return false; * notes: the function will check the struct member: pextended_standby and event. * if the setting is not proper, return false. */ bool set_extended_standby_manager(scene_extended_standby_t *local_standby) { unsigned long irqflags; EXSTANDBY_DBG("enter %s\n", __func__); if (local_standby && 0 == local_standby->soc_pwr_dep.soc_pwr_dm_state.state) { return true; } if (!local_standby) { spin_lock_irqsave(&data_lock, irqflags); copy_extended_standby_data(NULL); extended_standby_manager.pextended_standby = NULL; spin_unlock_irqrestore(&data_lock, irqflags); return true; } else { spin_lock_irqsave(&data_lock, irqflags); copy_extended_standby_data(local_standby); extended_standby_manager.pextended_standby = &temp_standby_data; spin_unlock_irqrestore(&data_lock, irqflags); } if (NULL != extended_standby_manager.pextended_standby) EXSTANDBY_DBG("leave %s : id 0x%lx\n", __func__, extended_standby_manager.pextended_standby->id); return true; }
/** * extended_standby_show_state - show current standby state, for debug purpose. * * function: standby state including locked_scene, power_supply dependancy, the wakeup src. * * return value: succeed, return 0, else return -1. */ int extended_standby_show_state(void) { #ifdef CONFIG_ARCH_SUN8IW6P1 #else unsigned long irqflags; int i; standby_show_state(); spin_lock_irqsave(&data_lock, irqflags); printk("wakeup_src 0x%lx\n", extended_standby_manager.event); printk("wakeup_gpio_map 0x%lx\n", extended_standby_manager.wakeup_gpio_map); printk("wakeup_gpio_group 0x%lx\n", extended_standby_manager.wakeup_gpio_group); if (NULL != extended_standby_manager.pextended_standby) { printk("extended_standby id = 0x%lx\n", extended_standby_manager.pextended_standby->id); if (0 != extended_standby_manager.pextended_standby->pll_change) { for (i=0; i<PLL_NUM; i++) { #if (defined CONFIG_ARCH_SUN8IW1P1) || (defined CONFIG_ARCH_SUN8IW3P1) || (defined CONFIG_ARCH_SUN8IW5P1) EXSTANDBY_DBG("pll%i: n=%d k=%d m=%d p=%d\n", i, \ extended_standby_manager.pextended_standby->pll_factor[i].n, \ extended_standby_manager.pextended_standby->pll_factor[i].k, \ extended_standby_manager.pextended_standby->pll_factor[i].m, \ extended_standby_manager.pextended_standby->pll_factor[i].p); #elif (defined CONFIG_ARCH_SUN9IW1P1) EXSTANDBY_DBG("pll%i: n=%d p=%d divi=%d divo=%d\n", i, \ extended_standby_manager.pextended_standby->pll_factor[i].n, \ extended_standby_manager.pextended_standby->pll_factor[i].p, \ extended_standby_manager.pextended_standby->pll_factor[i].divi, \ extended_standby_manager.pextended_standby->pll_factor[i].divo); #endif } } if (0 != extended_standby_manager.pextended_standby->bus_change) { for (i=0; i<BUS_NUM; i++) { EXSTANDBY_DBG("bus%i: src=%d pre_div=%d div_ratio=%d n=%d m=%d\n", i, \ extended_standby_manager.pextended_standby->bus_factor[i].src, \ extended_standby_manager.pextended_standby->bus_factor[i].pre_div, \ extended_standby_manager.pextended_standby->bus_factor[i].div_ratio, \ extended_standby_manager.pextended_standby->bus_factor[i].n, \ extended_standby_manager.pextended_standby->bus_factor[i].m); } } } spin_unlock_irqrestore(&data_lock, irqflags); #endif return 0; }
/** * 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; }
/** * get_extended_standby_manager - get the extended_standby_manager pointer * * Return : if the extended_standby_manager is effective, return the extended_standby_manager pointer; * else return NULL; * Notes : you can check the configuration from the pointer. */ const extended_standby_manager_t *get_extended_standby_manager(void) { unsigned long irqflags; extended_standby_manager_t *manager_data = NULL; spin_lock_irqsave(&data_lock, irqflags); manager_data = &extended_standby_manager; spin_unlock_irqrestore(&data_lock, irqflags); if ((NULL != manager_data) && (NULL != manager_data->pextended_standby)) EXSTANDBY_DBG("leave %s : id 0x%lx\n", __func__, manager_data->pextended_standby->id); return manager_data; }
/** * 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; }
/** * set_extended_standby_manager - set the extended_standby_manager; * manager@: the manager config. * * return value: if the setting is correct, return true. * else return false; * notes: the function will check the struct member: pextended_standby and event. * if the setting is not proper, return false. */ bool set_extended_standby_manager(unsigned long flags) { unsigned long irqflags; EXSTANDBY_DBG("enter %s\n", __func__); if (USB_STANDBY_FLAGS & flags) { spin_lock_irqsave(&data_lock, irqflags); copy_extended_standby_data(&usb_standby); extended_standby_manager.pextended_standby = &temp_standby_data; spin_unlock_irqrestore(&data_lock, irqflags); } if (TALKING_STANDBY_FLAGS & flags) { spin_lock_irqsave(&data_lock, irqflags); copy_extended_standby_data(&talk_standby); extended_standby_manager.pextended_standby = &temp_standby_data; spin_unlock_irqrestore(&data_lock, irqflags); } if (MP3_STANDBY_FLAGE & flags) { } if (0 == flags) { spin_lock_irqsave(&data_lock, irqflags); temp_standby_data.id = 0; extended_standby_manager.pextended_standby = NULL; spin_unlock_irqrestore(&data_lock, irqflags); return true; } if (NULL != extended_standby_manager.pextended_standby) EXSTANDBY_DBG("leave %s : id 0x%lx\n", __func__, extended_standby_manager.pextended_standby->id); return true; }
/** * get_extended_standby_manager - get the extended_standby_manager pointer * * Return : if the extended_standby_manager is effective, return the extended_standby_manager pointer; * else return NULL; * Notes : you can check the configuration from the pointer. */ const extended_standby_manager_t *get_extended_standby_manager(void) { unsigned long irqflags; extended_standby_manager_t *manager_data = NULL; spin_lock_irqsave(&data_lock, irqflags); manager_data = &extended_standby_manager; spin_unlock_irqrestore(&data_lock, irqflags); if ((NULL != manager_data) && (NULL != manager_data->pextended_standby)){ //update sys_mask manager_data->pextended_standby->soc_pwr_dm_state.sys_mask = get_sys_pwr_dm_mask(); EXSTANDBY_DBG("leave %s : id 0x%lx\n", __func__, manager_data->pextended_standby->id); } return manager_data; }
/** * * function: standby state including locked_scene, power_supply dependancy, the wakeup src. * * return value: succeed, return 0, else return -1. */ int extended_standby_show_state(void) { unsigned long irqflags; int i = 0; unsigned int pwr_on_bitmap = 0; unsigned int pwr_off_bitmap = 0; standby_show_state(); spin_lock_irqsave(&data_lock, irqflags); printk(KERN_INFO "dynamic config wakeup_src: 0x%16lx\n", extended_standby_manager.event); parse_wakeup_event(NULL, 0, extended_standby_manager.event, CPUS_ID); printk(KERN_INFO "wakeup_gpio_map 0x%16lx\n", extended_standby_manager.wakeup_gpio_map); parse_wakeup_gpio_map(NULL, 0, extended_standby_manager.wakeup_gpio_map); printk(KERN_INFO "wakeup_gpio_group 0x%16lx\n", extended_standby_manager.wakeup_gpio_group); parse_wakeup_gpio_group_map(NULL, 0, extended_standby_manager.wakeup_gpio_group); if (NULL != extended_standby_manager.pextended_standby) { printk(KERN_INFO "extended_standby id = 0x%16lx\n", extended_standby_manager.pextended_standby->id); printk(KERN_INFO "extended_standby pmu_id = 0x%16x\n", extended_standby_manager.pextended_standby->pmu_id); printk(KERN_INFO "extended_standby soc_id = 0x%16x\n", extended_standby_manager.pextended_standby->soc_id); printk(KERN_INFO "extended_standby pwr dep as follow: \n"); printk(KERN_INFO "pwr dm state as follow: \n"); printk(KERN_INFO "\tpwr dm state = 0x%8x. \n", extended_standby_manager.pextended_standby->soc_pwr_dm_state.state); parse_pwr_dm_map(NULL, 0, extended_standby_manager.pextended_standby->soc_pwr_dm_state.state); printk(KERN_INFO "\tpwr dm sys mask = 0x%8x. \n", extended_standby_manager.pextended_standby->soc_pwr_dm_state.sys_mask); parse_pwr_dm_map(NULL, 0, extended_standby_manager.pextended_standby->soc_pwr_dm_state.sys_mask); pwr_on_bitmap = extended_standby_manager.pextended_standby->soc_pwr_dm_state.sys_mask & extended_standby_manager.pextended_standby->soc_pwr_dm_state.state; printk(KERN_INFO "\tpwr on = 0x%x. \n", pwr_on_bitmap); parse_pwr_dm_map(NULL, 0, pwr_on_bitmap); pwr_off_bitmap = (~extended_standby_manager.pextended_standby->soc_pwr_dm_state.sys_mask) | extended_standby_manager.pextended_standby->soc_pwr_dm_state.state; printk(KERN_INFO "\tpwr off = 0x%x. \n", pwr_off_bitmap); parse_pwr_dm_map(NULL, 0, (~pwr_off_bitmap)); EXSTANDBY_DBG("\tpwr on volt which need adjusted: \n"); if (0 != (extended_standby_manager.pextended_standby->soc_pwr_dm_state.state&\ extended_standby_manager.pextended_standby->soc_pwr_dm_state.sys_mask)) { for (i=0; i<VCC_MAX_INDEX; i++) { if(0 != extended_standby_manager.pextended_standby->soc_pwr_dm_state.volt[i]){ printk(KERN_INFO "index = %d, volt[]= %d. \n", i, extended_standby_manager.pextended_standby->soc_pwr_dm_state.volt[i]); } } } EXSTANDBY_DBG("cpux clk state as follow: \n"); EXSTANDBY_DBG(" cpux osc en: 0x%8x. \n", extended_standby_manager.pextended_standby->cpux_clk_state.osc_en); EXSTANDBY_DBG(" cpux pll init disabled config: 0x%8x. \n", extended_standby_manager.pextended_standby->cpux_clk_state.init_pll_dis); EXSTANDBY_DBG(" cpux pll exit enable config: 0x%8x. \n", extended_standby_manager.pextended_standby->cpux_clk_state.exit_pll_en); if (0 != extended_standby_manager.pextended_standby->cpux_clk_state.pll_change) { for (i=0; i<PLL_NUM; i++) { EXSTANDBY_DBG("pll%i: factor1=%d factor2=%d factor3=%d factor4=%d\n", i, \ extended_standby_manager.pextended_standby->cpux_clk_state.pll_factor[i].factor1, \ extended_standby_manager.pextended_standby->cpux_clk_state.pll_factor[i].factor2, \ extended_standby_manager.pextended_standby->cpux_clk_state.pll_factor[i].factor3, \ extended_standby_manager.pextended_standby->cpux_clk_state.pll_factor[i].factor4); } }else{ EXSTANDBY_DBG("pll_change == 0: no pll need change. \n"); } if (0 != extended_standby_manager.pextended_standby->cpux_clk_state.bus_change) { for (i=0; i<BUS_NUM; i++) { EXSTANDBY_DBG("bus%i: src=%d pre_div=%d div_ratio=%d n=%d m=%d\n", i, \ extended_standby_manager.pextended_standby->cpux_clk_state.bus_factor[i].src, \ extended_standby_manager.pextended_standby->cpux_clk_state.bus_factor[i].pre_div, \ extended_standby_manager.pextended_standby->cpux_clk_state.bus_factor[i].div_ratio, \ extended_standby_manager.pextended_standby->cpux_clk_state.bus_factor[i].n, \ extended_standby_manager.pextended_standby->cpux_clk_state.bus_factor[i].m); } }else{ EXSTANDBY_DBG("bus_change == 0: no bus need change. \n"); } EXSTANDBY_DBG("cpux io state as follow: \n"); EXSTANDBY_DBG(" hold_flag = %d. \n", extended_standby_manager.pextended_standby->soc_io_state.hold_flag); for (i=0; i<IO_NUM; i++){ if((unsigned int *)0 != extended_standby_manager.pextended_standby->soc_io_state.io_state[i].paddr){ printk(KERN_INFO " count %4d io config: addr 0x%8x, value_mask 0x%8x, value 0x%8x. \n", i, \ (unsigned int)extended_standby_manager.pextended_standby->soc_io_state.io_state[i].paddr, \ extended_standby_manager.pextended_standby->soc_io_state.io_state[i].value_mask, \ extended_standby_manager.pextended_standby->soc_io_state.io_state[i].value); } } EXSTANDBY_DBG("soc dram state as follow: \n"); EXSTANDBY_DBG(" selfresh_flag = %d. \n", extended_standby_manager.pextended_standby->soc_dram_state.selfresh_flag); } spin_unlock_irqrestore(&data_lock, irqflags); return 0; }