diff --git a/drivers/firmware/qcom_scm-smc.c b/drivers/firmware/qcom_scm-smc.c index 518bcbca5def..863ad4fbb2e6 100644 --- a/drivers/firmware/qcom_scm-smc.c +++ b/drivers/firmware/qcom_scm-smc.c @@ -651,6 +651,20 @@ void __qcom_scm_cpu_power_down(struct device *dev, u32 flags) qcom_scm_call_atomic(dev, &desc); } +int __qcom_scm_sec_wdog_deactivate(struct device *dev) +{ + struct qcom_scm_desc desc = { + .svc = QCOM_SCM_SVC_BOOT, + .cmd = QCOM_SCM_BOOT_SEC_WDOG_DIS, + .owner = ARM_SMCCC_OWNER_SIP + }; + + desc.args[0] = 1; + desc.arginfo = QCOM_SCM_ARGS(1); + + return qcom_scm_call(dev, &desc); +} + int __qcom_scm_set_remote_state(struct device *dev, u32 state, u32 id) { struct qcom_scm_desc desc = { diff --git a/drivers/firmware/qcom_scm.c b/drivers/firmware/qcom_scm.c index 75c535e63b1a..cb23204aa278 100644 --- a/drivers/firmware/qcom_scm.c +++ b/drivers/firmware/qcom_scm.c @@ -128,6 +128,15 @@ void qcom_scm_cpu_power_down(u32 flags) } EXPORT_SYMBOL(qcom_scm_cpu_power_down); +/** + * qcm_scm_sec_wdog_deactivate() - Deactivate secure watchdog + */ +int qcom_scm_sec_wdog_deactivate(void) +{ + return __qcom_scm_sec_wdog_deactivate(__scm->dev); +} +EXPORT_SYMBOL(qcom_scm_sec_wdog_deactivate); + int qcom_scm_set_remote_state(u32 state, u32 id) { return __qcom_scm_set_remote_state(__scm->dev, state, id); diff --git a/drivers/firmware/qcom_scm.h b/drivers/firmware/qcom_scm.h index 5b04e587f362..30e5d39462dc 100644 --- a/drivers/firmware/qcom_scm.h +++ b/drivers/firmware/qcom_scm.h @@ -7,6 +7,7 @@ #define QCOM_SCM_SVC_BOOT 0x01 #define QCOM_SCM_BOOT_SET_ADDR 0x01 #define QCOM_SCM_BOOT_TERMINATE_PC 0x02 +#define QCOM_SCM_BOOT_SEC_WDOG_DIS 0x07 #define QCOM_SCM_BOOT_SET_REMOTE_STATE 0x0a #define QCOM_SCM_BOOT_SET_DLOAD_MODE 0x10 extern int __qcom_scm_set_cold_boot_addr(struct device *dev, void *entry, @@ -14,6 +15,7 @@ extern int __qcom_scm_set_cold_boot_addr(struct device *dev, void *entry, extern int __qcom_scm_set_warm_boot_addr(struct device *dev, void *entry, const cpumask_t *cpus); extern void __qcom_scm_cpu_power_down(struct device *dev, u32 flags); +extern int __qcom_scm_sec_wdog_deactivate(struct device *dev); extern int __qcom_scm_set_remote_state(struct device *dev, u32 state, u32 id); extern int __qcom_scm_set_dload_mode(struct device *dev, bool enable); #define QCOM_SCM_FLUSH_FLAG_MASK 0x3 diff --git a/drivers/soc/qcom/qcom_watchdog.c b/drivers/soc/qcom/qcom_watchdog.c index 06310e3086ce..e652ccfe2b0b 100644 --- a/drivers/soc/qcom/qcom_watchdog.c +++ b/drivers/soc/qcom/qcom_watchdog.c @@ -18,7 +18,7 @@ #include #include #include -#include +#include #include #include #include @@ -40,8 +40,6 @@ #define UNMASKED_INT_EN 1 #define MASK_SIZE 32 -#define SCM_SET_REGSAVE_CMD 0x2 -#define SCM_SVC_SEC_WDOG_DIS 0x7 #define MAX_CPU_CTX_SIZE 2048 #define WDT_HZ 32765 @@ -225,7 +223,6 @@ static ssize_t wdog_disable_set(struct device *dev, const char *buf, size_t count) { struct msm_watchdog_data *wdog_dd = dev_get_drvdata(dev); - struct scm_desc desc = {0}; u8 disable; int ret; @@ -243,10 +240,7 @@ static ssize_t wdog_disable_set(struct device *dev, } disable = 1; - desc.args[0] = 1; - desc.arginfo = SCM_ARGS(1); - ret = scm_call2(SCM_SIP_FNID(SCM_SVC_BOOT, - SCM_SVC_SEC_WDOG_DIS), &desc); + ret = qcom_scm_sec_wdog_deactivate(); if (ret) { dev_err(wdog_dd->dev, "Failed to deactivate secure wdog\n"); diff --git a/include/linux/qcom_scm.h b/include/linux/qcom_scm.h index ca6d307c17b5..d4db91a69f18 100644 --- a/include/linux/qcom_scm.h +++ b/include/linux/qcom_scm.h @@ -38,6 +38,7 @@ struct qcom_scm_vmperm { extern int qcom_scm_set_cold_boot_addr(void *entry, const cpumask_t *cpus); extern int qcom_scm_set_warm_boot_addr(void *entry, const cpumask_t *cpus); extern void qcom_scm_cpu_power_down(u32 flags); +extern int qcom_scm_sec_wdog_deactivate(void); extern int qcom_scm_set_remote_state(u32 state, u32 id); extern bool qcom_scm_pas_supported(u32 peripheral); extern int qcom_scm_pas_init_image(u32 peripheral, const void *metadata, @@ -71,6 +72,7 @@ static inline int qcom_scm_set_warm_boot_addr(void *entry, const cpumask_t *cpus) { return -ENODEV; } static inline void qcom_scm_cpu_power_down(u32 flags) {} +static inline int qcom_scm_sec_wdog_deactivate(void) { return -ENODEV; } static inline u32 qcom_scm_set_remote_state(u32 state, u32 id) { return -ENODEV; } static inline bool qcom_scm_pas_supported(u32 peripheral) { return false; }