aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2015-03-27 22:27:23 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2015-03-27 22:27:23 -0700
commitab6247476e54da1330d1f11c9e9fedded1b542d4 (patch)
treed2ffe476b0698abb3dd749843a887fa81f43ff3d
parent2098c031acc7db62a97ecaeb33d8af0c48aee0ff (diff)
parente70bb9c32c8987b8fd3c8cda3f45df50f7becedb (diff)
Merge "msm: qseecom: Update ICE driver for next version of ICE hardware"
-rw-r--r--Documentation/devicetree/bindings/qseecom/qseecom.txt2
-rw-r--r--drivers/misc/qseecom.c66
2 files changed, 66 insertions, 2 deletions
diff --git a/Documentation/devicetree/bindings/qseecom/qseecom.txt b/Documentation/devicetree/bindings/qseecom/qseecom.txt
index cdad86eed9c..b53adcb1a1b 100644
--- a/Documentation/devicetree/bindings/qseecom/qseecom.txt
+++ b/Documentation/devicetree/bindings/qseecom/qseecom.txt
@@ -21,6 +21,7 @@ Optional properties:
- qcom,support-pfe : indicates if driver support key managing for per file encryption feature.
- qcom,no-clock-support : indicates clocks are not handled by qseecom (could be handled by RPM)
- qcom,appsbl-qseecom-support : indicates if there is qseecom support in appsbootloader
+ - vdd-hba-supply : handle for fixed power regulator
Example:
qcom,qseecom@fe806000 {
@@ -47,4 +48,5 @@ Example:
<55 512 3936000000 393600000>,
<55 512 3936000000 393600000>;
qcom,ce-opp-freq = <100000000>;
+ vdd-hba-supply = <&gdsc_ufs>;
};
diff --git a/drivers/misc/qseecom.c b/drivers/misc/qseecom.c
index 784d5da3ec3..bcda1fcbd99 100644
--- a/drivers/misc/qseecom.c
+++ b/drivers/misc/qseecom.c
@@ -34,6 +34,7 @@
#include <linux/firmware.h>
#include <linux/freezer.h>
#include <linux/scatterlist.h>
+#include <linux/regulator/consumer.h>
#include <soc/qcom/subsystem_restart.h>
#include <soc/qcom/scm.h>
#include <soc/qcom/socinfo.h>
@@ -183,6 +184,8 @@ struct qseecom_control {
struct qseecom_clk qsee;
struct qseecom_clk ce_drv;
struct qseecom_clk ce_ice;
+ struct regulator *reg;
+ bool is_regulator_available;
bool support_bus_scaling;
bool support_fde;
@@ -4107,6 +4110,20 @@ static int __qseecom_update_current_key_user_info(
return ret;
}
+static int qseecom_get_vreg(void)
+{
+ int ret = 0;
+ if (!qseecom.is_regulator_available)
+ return 0;
+ qseecom.reg = devm_regulator_get(qseecom.pdev, "vdd-hba");
+ if (IS_ERR(qseecom.reg)) {
+ ret = PTR_ERR(qseecom.reg);
+ dev_err(qseecom.pdev, "%s: %s get failed, err=%d\n",
+ __func__, "vdd-hba-supply", ret);
+ }
+ return ret;
+}
+
static int qseecom_create_key(struct qseecom_dev_handle *data,
void __user *argp)
{
@@ -4199,8 +4216,19 @@ static int qseecom_create_key(struct qseecom_dev_handle *data,
pr_err("Failed to get storage clocks\n");
goto free_buf;
}
- __qseecom_enable_clk(CLK_ICE);
+ if (qseecom_get_vreg()) {
+ pr_err("%s: Could not get regulator\n",
+ __func__);
+ goto free_buf;
+ }
+ }
+ if (qseecom.is_regulator_available &&
+ regulator_enable(qseecom.reg)) {
+ pr_err("%s: Could not enable regulator\n",
+ __func__);
+ goto free_buf;
}
+ __qseecom_enable_clk(CLK_ICE);
}
ret = __qseecom_set_clear_ce_key(data,
@@ -4209,13 +4237,24 @@ static int qseecom_create_key(struct qseecom_dev_handle *data,
if (create_key_req.usage ==
QSEOS_KM_USAGE_ICE_DISK_ENCRYPTION) {
+ if (!ret)
+ pr_err("Set the key successfully\n");
+ else
+ pr_err("Set the key failed\n");
__qseecom_disable_clk(CLK_ICE);
+ if (qseecom.is_regulator_available &&
+ regulator_disable(qseecom.reg)) {
+ pr_err("%s:Could not disable regulator\n",
+ __func__);
+ }
break;
}
if (ret) {
pr_err("Failed to create key: pipe %d, ce %d: %d\n",
pipe, ce_hw[i], ret);
goto free_buf;
+ } else {
+ pr_err("Set the key successfully\n");
}
}
@@ -4307,6 +4346,17 @@ static int qseecom_wipe_key(struct qseecom_dev_handle *data,
pr_err("Failed to get storage clocks\n");
goto free_buf;
}
+ if (qseecom_get_vreg()) {
+ pr_err("%s: Could not get regulator\n",
+ __func__);
+ goto free_buf;
+ }
+ if (qseecom.is_regulator_available &&
+ regulator_enable(qseecom.reg)) {
+ pr_err("%s:Couldnot enable regulator\n",
+ __func__);
+ goto free_buf;
+ }
__qseecom_enable_clk(CLK_ICE);
}
}
@@ -4317,6 +4367,11 @@ static int qseecom_wipe_key(struct qseecom_dev_handle *data,
if (wipe_key_req.usage ==
QSEOS_KM_USAGE_ICE_DISK_ENCRYPTION) {
__qseecom_disable_clk(CLK_ICE);
+ if (qseecom.is_regulator_available &&
+ regulator_disable(qseecom.reg)) {
+ pr_err("%s:Could not disable regulator\n",
+ __func__);
+ }
break;
}
@@ -5687,7 +5742,7 @@ static int __qseecom_init_clk(enum qseecom_ce_hw_instance ce)
return -EIO;
}
- if (qseecom.no_clock_support) {
+ if (qseecom.no_clock_support && ce != CLK_ICE) {
qclk->ce_core_clk = NULL;
qclk->ce_clk = NULL;
qclk->ce_bus_clk = NULL;
@@ -6108,6 +6163,13 @@ static int qseecom_probe(struct platform_device *pdev)
qseecom.qsee_perf_client = msm_bus_scale_register_client(
qseecom_platform_support);
+ if (!of_parse_phandle(pdev->dev.of_node, "vdd-hba-supply", 0)) {
+ pr_err("%s: No vdd-hba-supply regulator, assuming not needed\n",
+ __func__);
+ qseecom.is_regulator_available = false;
+ } else {
+ qseecom.is_regulator_available = true;
+ }
if (!qseecom.qsee_perf_client)
pr_err("Unable to register bus client\n");
return 0;