|
@@ -21,6 +21,7 @@
|
|
|
#include <linux/of.h>
|
|
|
#include <linux/of_platform.h>
|
|
|
#include <linux/clk.h>
|
|
|
+#include <linux/reset-controller.h>
|
|
|
|
|
|
#include "qcom_scm.h"
|
|
|
|
|
@@ -29,6 +30,7 @@ struct qcom_scm {
|
|
|
struct clk *core_clk;
|
|
|
struct clk *iface_clk;
|
|
|
struct clk *bus_clk;
|
|
|
+ struct reset_controller_dev reset;
|
|
|
};
|
|
|
|
|
|
static struct qcom_scm *__scm;
|
|
@@ -283,6 +285,30 @@ int qcom_scm_pas_shutdown(u32 peripheral)
|
|
|
}
|
|
|
EXPORT_SYMBOL(qcom_scm_pas_shutdown);
|
|
|
|
|
|
+static int qcom_scm_pas_reset_assert(struct reset_controller_dev *rcdev,
|
|
|
+ unsigned long idx)
|
|
|
+{
|
|
|
+ if (idx != 0)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ return __qcom_scm_pas_mss_reset(__scm->dev, 1);
|
|
|
+}
|
|
|
+
|
|
|
+static int qcom_scm_pas_reset_deassert(struct reset_controller_dev *rcdev,
|
|
|
+ unsigned long idx)
|
|
|
+{
|
|
|
+ if (idx != 0)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ return __qcom_scm_pas_mss_reset(__scm->dev, 0);
|
|
|
+}
|
|
|
+
|
|
|
+static const struct reset_control_ops qcom_scm_pas_reset_ops = {
|
|
|
+ .assert = qcom_scm_pas_reset_assert,
|
|
|
+ .deassert = qcom_scm_pas_reset_deassert,
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
static int qcom_scm_probe(struct platform_device *pdev)
|
|
|
{
|
|
|
struct qcom_scm *scm;
|
|
@@ -316,6 +342,11 @@ static int qcom_scm_probe(struct platform_device *pdev)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ scm->reset.ops = &qcom_scm_pas_reset_ops;
|
|
|
+ scm->reset.nr_resets = 1;
|
|
|
+ scm->reset.of_node = pdev->dev.of_node;
|
|
|
+ reset_controller_register(&scm->reset);
|
|
|
+
|
|
|
/* vote for max clk rate for highest performance */
|
|
|
ret = clk_set_rate(scm->core_clk, INT_MAX);
|
|
|
if (ret)
|