Re: [PATCH v5 2/2] watchdog: mtk_wdt: mt8183: Add reset controller

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 12/2/19 7:02 PM, Yong Liang wrote:
On Mon, 2019-12-02 at 21:02 +0800, Philipp Zabel wrote:
On Fri, 2019-11-29 at 16:36 +0800, Yong Liang wrote:
On Mon, 2019-11-25 at 17:51 +0800, Philipp Zabel wrote:
On Sun, 2019-11-24 at 22:16 -0800, Guenter Roeck wrote:
On Mon, Nov 25, 2019 at 11:03:50AM +0800, Jiaxin Yu wrote:
From: "yong.liang" <yong.liang@xxxxxxxxxxxx>

Add reset controller API in watchdog driver.
Besides watchdog, MTK toprgu module also provide sub-system (eg, audio,
camera, codec and connectivity) software reset functionality.

Signed-off-by: yong.liang <yong.liang@xxxxxxxxxxxx>
Signed-off-by: jiaxin.yu <jiaxin.yu@xxxxxxxxxxxx>
Reviewed-by: Yingjoe Chen <yingjoe.chen@xxxxxxxxxxxx>
---
  drivers/watchdog/Kconfig   |   1 +
  drivers/watchdog/mtk_wdt.c | 111 ++++++++++++++++++++++++++++++++++++-
  2 files changed, 111 insertions(+), 1 deletion(-)

diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig
index 2e07caab9db2..629249fe5305 100644
--- a/drivers/watchdog/Kconfig
+++ b/drivers/watchdog/Kconfig
@@ -717,6 +717,7 @@ config MEDIATEK_WATCHDOG
  	tristate "Mediatek SoCs watchdog support"
  	depends on ARCH_MEDIATEK || COMPILE_TEST
  	select WATCHDOG_CORE
+	select RESET_CONTROLLER
  	help
  	  Say Y here to include support for the watchdog timer
  	  in Mediatek SoCs.
diff --git a/drivers/watchdog/mtk_wdt.c b/drivers/watchdog/mtk_wdt.c
index 9c3d0033260d..d29484c7940a 100644
--- a/drivers/watchdog/mtk_wdt.c
+++ b/drivers/watchdog/mtk_wdt.c
@@ -9,6 +9,9 @@
   * Based on sunxi_wdt.c
   */
+#include <dt-bindings/reset-controller/mt2712-resets.h>
+#include <dt-bindings/reset-controller/mt8183-resets.h>
+#include <linux/delay.h>
  #include <linux/err.h>
  #include <linux/init.h>
  #include <linux/io.h>
@@ -16,10 +19,12 @@
  #include <linux/module.h>
  #include <linux/moduleparam.h>
  #include <linux/of.h>
+#include <linux/of_device.h>
  #include <linux/platform_device.h>
+#include <linux/reset-controller.h>
+#include <linux/slab.h>
  #include <linux/types.h>
  #include <linux/watchdog.h>
-#include <linux/delay.h>
#define WDT_MAX_TIMEOUT 31
  #define WDT_MIN_TIMEOUT		1
@@ -44,6 +49,9 @@
  #define WDT_SWRST		0x14
  #define WDT_SWRST_KEY		0x1209
+#define WDT_SWSYSRST 0x18U
+#define WDT_SWSYS_RST_KEY	0x88000000
+
  #define DRV_NAME		"mtk-wdt"
  #define DRV_VERSION		"1.0"
@@ -53,8 +61,99 @@ static unsigned int timeout;
  struct mtk_wdt_dev {
  	struct watchdog_device wdt_dev;
  	void __iomem *wdt_base;
+	spinlock_t lock; /* protects WDT_SWSYSRST reg */
+	struct reset_controller_dev rcdev;
+};
+
+struct mtk_wdt_data {
+	int sw_rst_num;
  };
+static const struct mtk_wdt_data mt2712_data = {
+	.sw_rst_num = MT2712_TOPRGU_SW_RST_NUM,
+};
+
+static const struct mtk_wdt_data mt8183_data = {
+	.sw_rst_num = MT8183_TOPRGU_SW_RST_NUM,
+};

The number of resets can be set in .data directly; there is no need
for the structures.

     We want to put all properities in mtxxxx-resets.h and it easy to
manager. If there are new properity in the feture, we can put it in
mtk_wdt_data mtxxxx_data

Do you expect there will be more properties in the future?

   Yes, We may put some infra reset bit and max number in mtxxxx-resets.h

Please either do that now or introduce the complexity when needed.

Thanks,
Guenter


+static int toprgu_reset_deassert(struct reset_controller_dev *rcdev,
+				 unsigned long id)
+{
+	unsigned int tmp;
+	unsigned long flags;
+	struct mtk_wdt_dev *data =
+		 container_of(rcdev, struct mtk_wdt_dev, rcdev);
+
+	spin_lock_irqsave(&data->lock, flags);
+
+	tmp = __raw_readl(data->wdt_base + WDT_SWSYSRST);
+	tmp &= ~BIT(id);
+	tmp |= WDT_SWSYS_RST_KEY;
+	writel(tmp, data->wdt_base + WDT_SWSYSRST);
+
+	spin_unlock_irqrestore(&data->lock, flags);
+
+	return 0;
+}

There is a lot of duplication in those functions. Only one line
is different. I think this is a good example where a helper function
with an additional argument indicating set or reset would be helpful.

     .assert and .dessert are two numbers of struct reset_control_ops.
      I think it's better to define both of them.

The suggestion was to have two very short _assert and _deassert
functions that only contain a single call to a common helper function.
See the reset-a10sr.c driver for an example.

   OK. I will modify it as reset-a10sr.c do.

regards
Philipp


_______________________________________________
Linux-mediatek mailing list
Linux-mediatek@xxxxxxxxxxxxxxxxxxx
http://lists.infradead.org/mailman/listinfo/linux-mediatek


_______________________________________________
Alsa-devel mailing list
Alsa-devel@xxxxxxxxxxxxxxxx
https://mailman.alsa-project.org/mailman/listinfo/alsa-devel



[Index of Archives]     [ALSA User]     [Linux Audio Users]     [Pulse Audio]     [Kernel Archive]     [Asterisk PBX]     [Photo Sharing]     [Linux Sound]     [Video 4 Linux]     [Gimp]     [Yosemite News]

  Powered by Linux