diff --git a/drivers/firmware/qcom_scm.c b/drivers/firmware/qcom_scm.c index 5b6543836b50..99593aaebacd 100644 --- a/drivers/firmware/qcom_scm.c +++ b/drivers/firmware/qcom_scm.c @@ -207,6 +207,25 @@ void qcom_scm_set_download_mode(enum qcom_download_mode mode, } EXPORT_SYMBOL(qcom_scm_set_download_mode); +int qcom_scm_get_download_mode(unsigned int *mode, phys_addr_t tcsr_boot_misc) +{ + int ret = -EINVAL; + struct device *dev = __scm ? __scm->dev : NULL; + + if (tcsr_boot_misc || (__scm && __scm->dload_mode_addr)) { + ret = qcom_scm_io_readl(tcsr_boot_misc ? : __scm->dload_mode_addr, mode); + } else { + dev_err(dev, + "No available mechanism for getting download mode\n"); + } + + if (ret) + dev_err(dev, "failed to get download mode: %d\n", ret); + + return ret; +} +EXPORT_SYMBOL_GPL(qcom_scm_get_download_mode); + int qcom_scm_config_cpu_errata(void) { return __qcom_scm_config_cpu_errata(__scm->dev); diff --git a/include/linux/qcom_scm.h b/include/linux/qcom_scm.h index d4ce6f0c7989..5b292531dd2f 100644 --- a/include/linux/qcom_scm.h +++ b/include/linux/qcom_scm.h @@ -95,6 +95,7 @@ extern int qcom_scm_set_remote_state(u32 state, u32 id); extern int qcom_scm_spin_cpu(void); extern void qcom_scm_set_download_mode(enum qcom_download_mode mode, phys_addr_t tcsr_boot_misc); +extern int qcom_scm_get_download_mode(unsigned int *mode, phys_addr_t tcsr_boot_misc); extern int qcom_scm_config_cpu_errata(void); extern void qcom_scm_phy_update_scm_level_shifter(u32 val); extern bool qcom_scm_pas_supported(u32 peripheral); @@ -244,6 +245,8 @@ static inline u32 qcom_scm_set_remote_state(u32 state, u32 id) static inline int qcom_scm_spin_cpu(void) { return -ENODEV; } static inline void qcom_scm_set_download_mode(enum qcom_download_mode mode, phys_addr_t tcsr_boot_misc) {} +static inline int qcom_scm_get_download_mode(unsigned int *mode, + phys_addr_t tcsr_boot_misc) {} static inline int qcom_scm_config_cpu_errata(void) { return -ENODEV; } static inline void qcom_scm_phy_update_scm_level_shifter(u32 val) {}