|  | /* Copyright (c) 2010,2015, The Linux Foundation. All rights reserved. | 
|  | * Copyright (C) 2015 Linaro Ltd. | 
|  | * | 
|  | * This program is free software; you can redistribute it and/or modify | 
|  | * it under the terms of the GNU General Public License version 2 and | 
|  | * only version 2 as published by the Free Software Foundation. | 
|  | * | 
|  | * This program is distributed in the hope that it will be useful, | 
|  | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
|  | * GNU General Public License for more details. | 
|  | * | 
|  | * You should have received a copy of the GNU General Public License | 
|  | * along with this program; if not, write to the Free Software | 
|  | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA | 
|  | * 02110-1301, USA. | 
|  | */ | 
|  |  | 
|  | #include <linux/cpumask.h> | 
|  | #include <linux/export.h> | 
|  | #include <linux/types.h> | 
|  | #include <linux/qcom_scm.h> | 
|  |  | 
|  | #include "qcom_scm.h" | 
|  |  | 
|  | /** | 
|  | * qcom_scm_set_cold_boot_addr() - Set the cold boot address for cpus | 
|  | * @entry: Entry point function for the cpus | 
|  | * @cpus: The cpumask of cpus that will use the entry point | 
|  | * | 
|  | * Set the cold boot address of the cpus. Any cpu outside the supported | 
|  | * range would be removed from the cpu present mask. | 
|  | */ | 
|  | int qcom_scm_set_cold_boot_addr(void *entry, const cpumask_t *cpus) | 
|  | { | 
|  | return __qcom_scm_set_cold_boot_addr(entry, cpus); | 
|  | } | 
|  | EXPORT_SYMBOL(qcom_scm_set_cold_boot_addr); | 
|  |  | 
|  | /** | 
|  | * qcom_scm_set_warm_boot_addr() - Set the warm boot address for cpus | 
|  | * @entry: Entry point function for the cpus | 
|  | * @cpus: The cpumask of cpus that will use the entry point | 
|  | * | 
|  | * Set the Linux entry point for the SCM to transfer control to when coming | 
|  | * out of a power down. CPU power down may be executed on cpuidle or hotplug. | 
|  | */ | 
|  | int qcom_scm_set_warm_boot_addr(void *entry, const cpumask_t *cpus) | 
|  | { | 
|  | return __qcom_scm_set_warm_boot_addr(entry, cpus); | 
|  | } | 
|  | EXPORT_SYMBOL(qcom_scm_set_warm_boot_addr); | 
|  |  | 
|  | /** | 
|  | * qcom_scm_cpu_power_down() - Power down the cpu | 
|  | * @flags - Flags to flush cache | 
|  | * | 
|  | * This is an end point to power down cpu. If there was a pending interrupt, | 
|  | * the control would return from this function, otherwise, the cpu jumps to the | 
|  | * warm boot entry point set for this cpu upon reset. | 
|  | */ | 
|  | void qcom_scm_cpu_power_down(u32 flags) | 
|  | { | 
|  | __qcom_scm_cpu_power_down(flags); | 
|  | } | 
|  | EXPORT_SYMBOL(qcom_scm_cpu_power_down); | 
|  |  | 
|  | /** | 
|  | * qcom_scm_hdcp_available() - Check if secure environment supports HDCP. | 
|  | * | 
|  | * Return true if HDCP is supported, false if not. | 
|  | */ | 
|  | bool qcom_scm_hdcp_available(void) | 
|  | { | 
|  | int ret; | 
|  |  | 
|  | ret = __qcom_scm_is_call_available(QCOM_SCM_SVC_HDCP, | 
|  | QCOM_SCM_CMD_HDCP); | 
|  |  | 
|  | return (ret > 0) ? true : false; | 
|  | } | 
|  | EXPORT_SYMBOL(qcom_scm_hdcp_available); | 
|  |  | 
|  | /** | 
|  | * qcom_scm_hdcp_req() - Send HDCP request. | 
|  | * @req: HDCP request array | 
|  | * @req_cnt: HDCP request array count | 
|  | * @resp: response buffer passed to SCM | 
|  | * | 
|  | * Write HDCP register(s) through SCM. | 
|  | */ | 
|  | int qcom_scm_hdcp_req(struct qcom_scm_hdcp_req *req, u32 req_cnt, u32 *resp) | 
|  | { | 
|  | return __qcom_scm_hdcp_req(req, req_cnt, resp); | 
|  | } | 
|  | EXPORT_SYMBOL(qcom_scm_hdcp_req); |