/**
 *	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;
}
Example #2
0
/**
 *	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;
}
Example #5
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;
}
/**
 *	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;
}