mirror of https://github.com/OpenIPC/firmware.git
				
				
				
			
		
			
				
	
	
		
			70 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Diff
		
	
	
			
		
		
	
	
			70 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Diff
		
	
	
| --- linux-4.9.37/drivers/firmware/psci.c	2017-07-12 16:42:41.000000000 +0300
 | |
| +++ linux-4.9.y/drivers/firmware/psci.c	2021-06-07 13:01:33.000000000 +0300
 | |
| @@ -59,7 +59,9 @@
 | |
|  	return cpu == resident_cpu;
 | |
|  }
 | |
|  
 | |
| -struct psci_operations psci_ops;
 | |
| +struct psci_operations psci_ops = {
 | |
| +	.conduit = PSCI_CONDUIT_NONE,
 | |
| +};
 | |
|  
 | |
|  typedef unsigned long (psci_fn)(unsigned long, unsigned long,
 | |
|  				unsigned long, unsigned long);
 | |
| @@ -210,6 +212,22 @@
 | |
|  			      0, 0, 0);
 | |
|  }
 | |
|  
 | |
| +static void set_conduit(enum psci_conduit conduit)
 | |
| +{
 | |
| +	switch (conduit) {
 | |
| +	case PSCI_CONDUIT_HVC:
 | |
| +		invoke_psci_fn = __invoke_psci_fn_hvc;
 | |
| +		break;
 | |
| +	case PSCI_CONDUIT_SMC:
 | |
| +		invoke_psci_fn = __invoke_psci_fn_smc;
 | |
| +		break;
 | |
| +	default:
 | |
| +		WARN(1, "Unexpected PSCI conduit %d\n", conduit);
 | |
| +	}
 | |
| +
 | |
| +	psci_ops.conduit = conduit;
 | |
| +}
 | |
| +
 | |
|  static int get_set_conduit_method(struct device_node *np)
 | |
|  {
 | |
|  	const char *method;
 | |
| @@ -222,9 +240,9 @@
 | |
|  	}
 | |
|  
 | |
|  	if (!strcmp("hvc", method)) {
 | |
| -		invoke_psci_fn = __invoke_psci_fn_hvc;
 | |
| +		set_conduit(PSCI_CONDUIT_HVC);
 | |
|  	} else if (!strcmp("smc", method)) {
 | |
| -		invoke_psci_fn = __invoke_psci_fn_smc;
 | |
| +		set_conduit(PSCI_CONDUIT_SMC);
 | |
|  	} else {
 | |
|  		pr_warn("invalid \"method\" property: %s\n", method);
 | |
|  		return -EINVAL;
 | |
| @@ -496,6 +514,8 @@
 | |
|  static void __init psci_0_2_set_functions(void)
 | |
|  {
 | |
|  	pr_info("Using standard PSCI v0.2 function IDs\n");
 | |
| +	psci_ops.get_version = psci_get_version;
 | |
| +
 | |
|  	psci_function_id[PSCI_FN_CPU_SUSPEND] =
 | |
|  					PSCI_FN_NATIVE(0_2, CPU_SUSPEND);
 | |
|  	psci_ops.cpu_suspend = psci_cpu_suspend;
 | |
| @@ -652,9 +672,9 @@
 | |
|  	pr_info("probing for conduit method from ACPI.\n");
 | |
|  
 | |
|  	if (acpi_psci_use_hvc())
 | |
| -		invoke_psci_fn = __invoke_psci_fn_hvc;
 | |
| +		set_conduit(PSCI_CONDUIT_HVC);
 | |
|  	else
 | |
| -		invoke_psci_fn = __invoke_psci_fn_smc;
 | |
| +		set_conduit(PSCI_CONDUIT_SMC);
 | |
|  
 | |
|  	return psci_probe();
 | |
|  }
 |