Esempio n. 1
0
int arch_interrupt_init (void)
{
	DEBUG_MEMORY
	/* disable and clear any residue */
	gic_dic_disable_secure ();
	gic_dic_clear_enable_all_intr ();
	gic_dic_clear_pending_all_intr ();

	/* set the priority so all IRQ will trigger exception */
	gic_cpu_set_priority_mask (1<<3);

	/* enable DIC and CPU IF */
	gic_dic_enable_secure ();
	gic_cpu_enable ();

	return 0;
}
int sc8825_enter_lowpower(void)
{
	int status, ret = 0;
	unsigned long flags, time;
	unsigned int cpu = smp_processor_id();

#ifdef CONFIG_SPRD_PM_DEBUG
	__raw_writel(0xfdffbfff, SPRD_INTC0_BASE + 0xc);//intc0
	__raw_writel(0x02004000, SPRD_INTC0_BASE + 0x8);//intc0
	__raw_writel(0xffffffff, SPRD_INTC0_BASE + 0x100c);//intc1
#endif	

	time = get_sys_cnt();
	if (!hw_irqs_disabled())  {
		flags = read_cpsr();
		printk("##: Error(%s): IRQ is enabled(%08lx)!\n",
			 "wakelock_suspend", flags);
	}
	/*TODO:
	* we need to known clock status in modem side
	*/
#ifdef FORCE_DISABLE_DSP
	status = 0;
#else
#ifdef CONFIG_NKERNEL
	status = sc8825_get_clock_status();
#else
	/*
	* TODO: get clock status in native version, force deep sleep now
	*/
	status = 0;
#endif
#endif
	if (status & DEVICE_AHB)  {
		/*printk("###### %s,  DEVICE_AHB ###\n", __func__ );*/
		set_sleep_mode(SLP_MODE_ARM);
		arm_sleep();
	} else if (status & DEVICE_APB) {
		/*printk("###### %s,	DEVICE_APB ###\n", __func__ );*/
		set_sleep_mode(SLP_MODE_MCU);
		mcu_sleep();
	} else {
		/*printk("###### %s,	DEEP ###\n", __func__ );*/
		set_sleep_mode(SLP_MODE_DEP);
		gic_save_context( );
		scu_save_context();
		ret = deep_sleep( );
		scu_restore_context();
		flush_cache_all();
		gic_restore_context( );
		gic_cpu_enable(cpu);
		gic_dist_enable( );
#if 1
		void notrace __update_sched_clock(void);
		__update_sched_clock();
#endif
	}
	
	time_add(get_sys_cnt() - time, ret);

	return ret;

}