[Feature] add GA346 baseline version
Change-Id: Ic62933698569507dcf98240cdf5d9931ae34348f
diff --git a/src/kernel/linux/v4.19/drivers/soc/mediatek/mtk-dvfsrc-start.c b/src/kernel/linux/v4.19/drivers/soc/mediatek/mtk-dvfsrc-start.c
new file mode 100644
index 0000000..5e68db6
--- /dev/null
+++ b/src/kernel/linux/v4.19/drivers/soc/mediatek/mtk-dvfsrc-start.c
@@ -0,0 +1,51 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2020 MediaTek Inc.
+ */
+#include <linux/arm-smccc.h>
+#include <linux/module.h>
+#include <linux/of_device.h>
+#include <linux/platform_device.h>
+#include <linux/soc/mediatek/mtk_sip_svc.h>
+
+#define MTK_SIP_DVFSRC_START 0x01
+
+/* We let dvfsrc working on parent main driver and setup
+ * framework (interconnect, regulator, ..) for user register
+ * and request, so we will lock high opp in that stage.
+ * We will release this lock in this driver and let probe on
+ * late_initsync stage. It send smc cmd MTK_SIP_DVFSRC_RUN
+ * to release lock let dvfsrc free run.
+ */
+
+static int mtk_dvfsrc_start_probe(struct platform_device *pdev)
+{
+ struct arm_smccc_res ares;
+
+ arm_smccc_smc(MTK_SIP_VCOREFS_CONTROL, MTK_SIP_DVFSRC_START, 0, 0, 0,
+ 0, 0, 0, &ares);
+
+ return 0;
+}
+
+static struct platform_driver mtk_dvfsrc_run_drv = {
+ .probe = mtk_dvfsrc_start_probe,
+ .driver = {
+ .name = "mtk-dvfsrc-start",
+ },
+};
+
+static int __init mtk_dvfsrc_run_init(void)
+{
+ return platform_driver_register(&mtk_dvfsrc_run_drv);
+}
+late_initcall_sync(mtk_dvfsrc_run_init);
+
+static void __exit mtk_dvfsrc_run_exit(void)
+{
+ platform_driver_unregister(&mtk_dvfsrc_run_drv);
+}
+module_exit(mtk_dvfsrc_run_exit);
+
+MODULE_LICENSE("GPL v2");
+MODULE_DESCRIPTION("MTK DVFSRC enable free run driver");