[Feature] add GA346 baseline version

Change-Id: Ic62933698569507dcf98240cdf5d9931ae34348f
diff --git a/src/kernel/linux/v4.19/drivers/interconnect/mediatek/mmqos-mtk.h b/src/kernel/linux/v4.19/drivers/interconnect/mediatek/mmqos-mtk.h
new file mode 100644
index 0000000..c6ebf33
--- /dev/null
+++ b/src/kernel/linux/v4.19/drivers/interconnect/mediatek/mmqos-mtk.h
@@ -0,0 +1,108 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (c) 2019 MediaTek Inc.
+ * Author: Ming-Fan Chen <ming-fan.chen@mediatek.com>
+ */
+#ifndef MMQOS_MTK_H
+#define MMQOS_MTK_H
+
+#include <linux/interconnect-provider.h>
+#include <linux/notifier.h>
+#include <linux/platform_device.h>
+#include <linux/workqueue.h>
+#include <soc/mediatek/mmqos.h>
+
+#define MMQOS_NO_LINK	(0xffffffff)
+#define MMQOS_MAX_COMM_PORT_NUM	(15)
+
+struct mmqos_hrt {
+	u32 hrt_bw[HRT_TYPE_NUM];
+	u32 hrt_total_bw;
+	u32 cam_max_bw;
+	u32 cam_occu_bw;
+	bool blocking;
+	struct delayed_work work;
+	struct blocking_notifier_head hrt_bw_throttle_notifier;
+	atomic_t lock_count;
+	wait_queue_head_t hrt_wait;
+	struct mutex blocking_lock;
+};
+
+struct mmqos_base_node {
+	struct icc_node *icc_node;
+	u32	mix_bw;
+};
+
+struct common_node {
+	struct mmqos_base_node *base;
+	const char *clk_name;
+	struct clk *clk;
+	u64 freq;
+	struct list_head list;
+	struct icc_path *icc_path;
+	struct work_struct work;
+	struct list_head comm_port_list;
+};
+
+struct common_port_node {
+	struct mmqos_base_node *base;
+	struct common_node *common;
+	struct device *larb_dev;
+	struct mutex bw_lock;
+	u32 latest_mix_bw;
+	u32 latest_peak_bw;
+	u32 latest_avg_bw;
+	struct list_head list;
+};
+
+struct larb_node {
+	struct mmqos_base_node *base;
+	struct device *larb_dev;
+};
+
+struct larb_port_node {
+	struct mmqos_base_node *base;
+	u16 bw_ratio;
+};
+
+struct mtk_mmqos {
+	struct device *dev;
+	struct icc_provider prov;
+	struct notifier_block nb;
+	struct list_head comm_list;
+	struct workqueue_struct *wq;
+	u32 max_ratio;
+	bool qos_bound; /* Todo: Set qos_bound to true if necessary */
+};
+
+struct mtk_node_desc {
+	const char *name;
+	u32 id;
+	u32 link;
+	u16 bw_ratio;
+};
+
+struct mtk_mmqos_desc {
+	const struct mtk_node_desc *nodes;
+	const size_t num_nodes;
+	const char * const *comm_muxes;
+	const char * const *comm_icc_path_names;
+	const u32 max_ratio;
+	const struct mmqos_hrt hrt;
+};
+
+#define DEFINE_MNODE(_name, _id, _bw_ratio, _link) {	\
+	.name = #_name,	\
+	.id = _id,	\
+	.bw_ratio = _bw_ratio,	\
+	.link = _link,	\
+	}
+
+int mtk_mmqos_probe(struct platform_device *pdev);
+int mtk_mmqos_remove(struct platform_device *pdev);
+
+/* For HRT */
+void mtk_mmqos_init_hrt(struct mmqos_hrt *hrt);
+int mtk_mmqos_register_hrt_sysfs(struct device *dev);
+void mtk_mmqos_unregister_hrt_sysfs(struct device *dev);
+#endif /* MMQOS_MTK_H */