[][kernel][mt7988][misc][add infra bus hang protect driver]

[Description]
Add infra bus hang protect driver to fix pwm problem

[Release-log]
N/A

Change-Id: I2b9176253c9e2b4ab11672961399d5a0c5d447d5
Reviewed-on: https://gerrit.mediatek.inc/c/openwrt/feeds/mtk_openwrt_feeds/+/6717598
diff --git a/target/linux/mediatek/files-5.4/drivers/misc/mediatek/Makefile b/target/linux/mediatek/files-5.4/drivers/misc/mediatek/Makefile
index 55e7465..b725c38 100644
--- a/target/linux/mediatek/files-5.4/drivers/misc/mediatek/Makefile
+++ b/target/linux/mediatek/files-5.4/drivers/misc/mediatek/Makefile
@@ -1 +1,2 @@
-obj-$(CONFIG_MTK_ICE_DEBUG) +=ice_debug/
+obj-$(CONFIG_MTK_ICE_DEBUG) += ice_debug/
+obj-y += infra_bus_prot/
diff --git a/target/linux/mediatek/files-5.4/drivers/misc/mediatek/infra_bus_prot/Makefile b/target/linux/mediatek/files-5.4/drivers/misc/mediatek/infra_bus_prot/Makefile
new file mode 100644
index 0000000..e025a6d
--- /dev/null
+++ b/target/linux/mediatek/files-5.4/drivers/misc/mediatek/infra_bus_prot/Makefile
@@ -0,0 +1 @@
+obj-y += infra_bus_prot.o
diff --git a/target/linux/mediatek/files-5.4/drivers/misc/mediatek/infra_bus_prot/infra_bus_prot.c b/target/linux/mediatek/files-5.4/drivers/misc/mediatek/infra_bus_prot/infra_bus_prot.c
new file mode 100644
index 0000000..de2c841
--- /dev/null
+++ b/target/linux/mediatek/files-5.4/drivers/misc/mediatek/infra_bus_prot/infra_bus_prot.c
@@ -0,0 +1,78 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Mediatek bus hang protect driver
+ *
+ * Copyright (C) 2022 MediaTek Inc.
+ * Author: Sam Shih <sam.shih@mediatek.com>
+ */
+
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
+#include <linux/regmap.h>
+#include <linux/of_address.h>
+#include <linux/io.h>
+
+#define	HANG_FREE_PROT_INFRA_AO		0x0
+
+/**
+ * struct mediatek_bus_prot - struct representing mediatek
+ * @regs: base address of PWM chip
+ */
+struct mediatek_bus_prot {
+	void __iomem *regs;
+};
+
+struct bus_hang_prot_of_data {
+	unsigned int offset;
+};
+
+static int mtk_bus_hang_prot_probe(struct platform_device *pdev)
+{
+	const struct bus_hang_prot_of_data *data;
+	struct resource *res;
+	void __iomem *regs;
+	int ret = 0;
+
+	data = of_device_get_match_data(&pdev->dev);
+	if (!data)
+		return -ENODEV;
+
+	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+	regs = devm_ioremap_resource(&pdev->dev, res);
+
+	if (IS_ERR(regs))
+		return PTR_ERR(regs);
+
+	writel(0x0, regs + data->offset);
+
+	return 0;
+}
+
+static const struct bus_hang_prot_of_data infracfg_ao_bus_hang_prot_data = {
+	.offset = HANG_FREE_PROT_INFRA_AO,
+};
+
+static const struct of_device_id bus_hang_prot_match[] = {
+	{
+		.compatible = "mediatek,infracfg_ao_bus_hang_prot",
+		.data = &infracfg_ao_bus_hang_prot_data
+	},
+	{ }
+};
+
+static struct platform_driver mtk_bus_hang_prot_driver = {
+	.probe = mtk_bus_hang_prot_probe,
+	.driver = {
+		.name = "mediatek,bus_hang_prot",
+		.of_match_table = bus_hang_prot_match,
+	},
+};
+
+static int __init mtk_bus_hang_prot_init(void)
+{
+	return platform_driver_register(&mtk_bus_hang_prot_driver);
+}
+
+arch_initcall(mtk_bus_hang_prot_init);