mirror of https://github.com/OpenIPC/firmware.git
				
				
				
			
		
			
				
	
	
		
			56 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Diff
		
	
	
			
		
		
	
	
			56 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Diff
		
	
	
| diff -drupN a/arch/mips/kernel/idle.c b/arch/mips/kernel/idle.c
 | |
| --- a/arch/mips/kernel/idle.c	2017-10-21 18:09:07.000000000 +0300
 | |
| +++ b/arch/mips/kernel/idle.c	2022-06-09 05:02:27.000000000 +0300
 | |
| @@ -52,6 +52,30 @@ void r4k_wait(void)
 | |
|  	__r4k_wait();
 | |
|  }
 | |
|  
 | |
| +#ifdef X2000_IDLE_PD
 | |
| +extern int x2000_pm_enter(void);
 | |
| +static void ingenic_wait_irqoff_pd(void)
 | |
| +{
 | |
| +	WARN_ON_ONCE(!irqs_disabled());
 | |
| +	x2000_pm_enter(PM_SUSPEND_STANDBY);
 | |
| +	local_irq_enable();
 | |
| +}
 | |
| +#else
 | |
| +void ingenic_wait_irqoff(void)
 | |
| +{
 | |
| +	local_irq_disable();
 | |
| +	if (!need_resched())
 | |
| +		__asm__(
 | |
| +		"	.set	push		\n"
 | |
| +		"	.set	arch=r4000	\n"
 | |
| +		"	sync			\n"
 | |
| +		"	wait			\n"
 | |
| +		"	.set	pop		\n");
 | |
| +	local_irq_enable();
 | |
| +}
 | |
| +#endif
 | |
| +
 | |
| +
 | |
|  /*
 | |
|   * This variant is preferable as it allows testing need_resched and going to
 | |
|   * sleep depending on the outcome atomically.  Unfortunately the "It is
 | |
| @@ -175,12 +199,19 @@ void __init check_wait(void)
 | |
|  	case CPU_CAVIUM_OCTEON_PLUS:
 | |
|  	case CPU_CAVIUM_OCTEON2:
 | |
|  	case CPU_CAVIUM_OCTEON3:
 | |
| -	case CPU_JZRISC:
 | |
|  	case CPU_LOONGSON1:
 | |
|  	case CPU_XLR:
 | |
|  	case CPU_XLP:
 | |
|  		cpu_wait = r4k_wait;
 | |
|  		break;
 | |
| +	case CPU_JZRISC:
 | |
| +#ifdef X2000_IDLE_PD
 | |
| +		cpu_wait = ingenic_wait_irqoff_pd;
 | |
| +#else
 | |
| +		cpu_wait = ingenic_wait_irqoff;
 | |
| +#endif
 | |
| +
 | |
| +		break;
 | |
|  	case CPU_BMIPS5000:
 | |
|  		cpu_wait = r4k_wait_irqoff;
 | |
|  		break;
 |