diff options
Diffstat (limited to 'drivers/firmware/psci.c')
| -rw-r--r-- | drivers/firmware/psci.c | 23 | 
1 files changed, 21 insertions, 2 deletions
diff --git a/drivers/firmware/psci.c b/drivers/firmware/psci.c index d24f35d74b27..f25cd79c8a79 100644 --- a/drivers/firmware/psci.c +++ b/drivers/firmware/psci.c @@ -13,6 +13,7 @@  #define pr_fmt(fmt) "psci: " fmt +#include <linux/arm-smccc.h>  #include <linux/errno.h>  #include <linux/linkage.h>  #include <linux/of.h> @@ -58,8 +59,6 @@ struct psci_operations psci_ops;  typedef unsigned long (psci_fn)(unsigned long, unsigned long,  				unsigned long, unsigned long); -asmlinkage psci_fn __invoke_psci_fn_hvc; -asmlinkage psci_fn __invoke_psci_fn_smc;  static psci_fn *invoke_psci_fn;  enum psci_function { @@ -107,6 +106,26 @@ bool psci_power_state_is_valid(u32 state)  	return !(state & ~valid_mask);  } +static unsigned long __invoke_psci_fn_hvc(unsigned long function_id, +			unsigned long arg0, unsigned long arg1, +			unsigned long arg2) +{ +	struct arm_smccc_res res; + +	arm_smccc_hvc(function_id, arg0, arg1, arg2, 0, 0, 0, 0, &res); +	return res.a0; +} + +static unsigned long __invoke_psci_fn_smc(unsigned long function_id, +			unsigned long arg0, unsigned long arg1, +			unsigned long arg2) +{ +	struct arm_smccc_res res; + +	arm_smccc_smc(function_id, arg0, arg1, arg2, 0, 0, 0, 0, &res); +	return res.a0; +} +  static int psci_to_linux_errno(int errno)  {  	switch (errno) {  | 
