From patchwork Sun Apr 13 10:12:47 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Sajna X-Patchwork-Id: 880905 Delivered-To: patch@linaro.org Received: by 2002:a5d:4882:0:b0:38f:210b:807b with SMTP id g2csp1575428wrq; Sun, 13 Apr 2025 06:38:27 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCUAebbKDYJo9YQG7fpo8PqC5ZjPL4nZzFE3eam1CZDBGFXGSQjkQhGuNT3rIgPQcqGmuLdLQg==@linaro.org X-Google-Smtp-Source: AGHT+IFc1vZNYuvPDxteLVTl/onfOP2pnxkmJZ1K/460q1udyzpBdLihqIojSWMcSK9qv59QEveO X-Received: by 2002:a05:6102:f0a:b0:4c1:86ff:4af7 with SMTP id ada2fe7eead31-4c9e5047692mr5669312137.21.1744551507429; Sun, 13 Apr 2025 06:38:27 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1744551507; cv=none; d=google.com; s=arc-20240605; b=eOYs45sV5NFFRncZ20zk691eOWgukRaZMDIM+BAPt7cSoIAKT2P59EiS+kJDMjL6jz /swf+4rZIg/2Zo7g0R7zSAj2Uug3I0Z9Z3POO/86x06G/IVmGcaIJVeSpqjQNRQ9cF6w YpWyGmFTN5GHYybNVApkWQ3ywz2TQa80jLFipdyFHrglBz7MBZY0kprZGqY39p0OywmK LiEbkCxAa9m2rGcqSB5drk6Du3TC6YUQda952XepwQISvrUnhNuMfNUdXL7lTmolZXYX gmcSkAQZenlfwhzs+f2M6GdTYfP+47IVsMG35lv8I+1v3E9qI7rM+lPdMnEi6cUSJj9U qa8Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=sender:errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:content-transfer-encoding :mime-version:feedback-id:message-id:subject:cc:from:to:date :dkim-signature; bh=3lfGm9i/Mx5j7rO6t2gWJkOHROvZiuF6D9470QfI8BQ=; fh=lqa/Twt0Ho5SUVbILP9wj9gALuRYAH3Ux2G7qyXSd5Y=; b=Fqv0BrflDOLNUFdJz71Vt/8LXzMfqPilWlvgjmSkVeoiwedaCjsGvrS9/VlzDU5+5u EgmZw37au7NZbdsgfihaVhHtbassXZ5quCRO1x4iIII58LFrHzfYfiTx/CB7OzGHj3in azHhi5h0KDX8iKWKNh12FBjzcYMvm47cwgeaSVkqvlkM7FYqJ2HO4sse+VzmBZlu48UJ 3+GlPEXh2KeDzfyTErzgqfkwSmsDrktQg0K7mbFqYOt2iB/6H5NNr0vx4FxERaYULrAw VX1EdOscWafgIJTS//zYwQaq2BQ7/ZzNsbhWSZhCxUNq90F5WhiLDz4U0pnlsk8rVvRC GvSg==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@paulsajna.com header.s=protonmail header.b="zz/Gb0wT"; spf=pass (google.com: domain of u-boot-bounces@lists.denx.de designates 2a01:238:438b:c500:173d:9f52:ddab:ee01 as permitted sender) smtp.mailfrom=u-boot-bounces@lists.denx.de; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=paulsajna.com Return-Path: Received: from phobos.denx.de (phobos.denx.de. [2a01:238:438b:c500:173d:9f52:ddab:ee01]) by mx.google.com with ESMTPS id ada2fe7eead31-4c9c991e0d6si2865991137.652.2025.04.13.06.38.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 13 Apr 2025 06:38:27 -0700 (PDT) Received-SPF: pass (google.com: domain of u-boot-bounces@lists.denx.de designates 2a01:238:438b:c500:173d:9f52:ddab:ee01 as permitted sender) client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; Authentication-Results: mx.google.com; dkim=fail header.i=@paulsajna.com header.s=protonmail header.b="zz/Gb0wT"; spf=pass (google.com: domain of u-boot-bounces@lists.denx.de designates 2a01:238:438b:c500:173d:9f52:ddab:ee01 as permitted sender) smtp.mailfrom=u-boot-bounces@lists.denx.de; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=paulsajna.com Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 6FEBB828D0; Sun, 13 Apr 2025 15:38:25 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=fail (p=none dis=none) header.from=paulsajna.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=paulsajna.com header.i=@paulsajna.com header.b="zz/Gb0wT"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 9823582A87; Sun, 13 Apr 2025 12:12:58 +0200 (CEST) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_BLOCKED, RCVD_IN_VALIDITY_RPBL_BLOCKED,RCVD_IN_VALIDITY_SAFE_BLOCKED, SPF_HELO_PASS,SPF_PASS autolearn=ham autolearn_force=no version=3.4.2 Received: from mail-10624.protonmail.ch (mail-10624.protonmail.ch [79.135.106.24]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 8A94B8293C for ; Sun, 13 Apr 2025 12:12:55 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=paulsajna.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=hello@paulsajna.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=paulsajna.com; s=protonmail; t=1744539173; x=1744798373; bh=3lfGm9i/Mx5j7rO6t2gWJkOHROvZiuF6D9470QfI8BQ=; h=Date:To:From:Cc:Subject:Message-ID:Feedback-ID:From:To:Cc:Date: Subject:Reply-To:Feedback-ID:Message-ID:BIMI-Selector: List-Unsubscribe:List-Unsubscribe-Post; b=zz/Gb0wTnt6C75dC/nOsPY7emZKhbJI6jy3VW/v31aVfoIXQx18SiP1I3semQQxrI N/YDmAILT5f4z6dACdvB01iByGNX5VAoe4vfyLWUNgGcrRiT9fdjrq4dW/Jyn65jB2 vFjnENOiwtag6t7mtdewoCSho+79CeFlQiuJiEzOGaAm+mX+nzpghzP/6cCOldxPLu v9KjGIT6g0ozCwzlXv3FHP3gm3yn6j/z2vyfaE2JXOMNfPuFhhm0I7tPHMiPvooFDf LUemdyXVyiFYwjWfS7e/J003TKHfycolrCNw5nIVpP9LfCxK23SeT1R1abLvVfBKCB +1z6u7BK47Wfw== Date: Sun, 13 Apr 2025 10:12:47 +0000 To: u-boot@lists.denx.de, Caleb Connolly , Neil Armstrong , Sumit Garg , Tom Rini , Stefan Roese From: Paul Sajna Cc: u-boot-qcom@groups.io, Sam Day , Paul Sajna Subject: [PATCH] watchdog: qcom: introduce qcom-wdt driver Message-ID: <20250413-b4-qcom-wdt-v1-1-db42cb93dff8@paulsajna.com> Feedback-ID: 29073965:user:proton X-Pm-Message-ID: 77f0a82ad604d540264422583067732c2c8a6c5d MIME-Version: 1.0 X-Mailman-Approved-At: Sun, 13 Apr 2025 15:38:24 +0200 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.39 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.103.8 at phobos.denx.de X-Virus-Status: Clean From: Caleb Connolly Some Qualcomm device vendors decide to turn the watchdog on in the bootloader, resulting in the device being reset if it isn't petted every ~30 seconds. Introduce a driver to disable the watchdog and prevent this annoying behaviour. Signed-off-by: Caleb Connolly Signed-off-by: Paul Sajna Tested-by: Paul Sajna --- This patch introduces a simple watchdog driver for Qualcomm devices. Some devices, including one I have been spending a lot of time with, the LG G7 ThinQ (codename judyln, arch sdm845) will reset within 30 seconds if the watchdog is not serviced. I have tested this patch from Caleb Connolly that is over a year old and has not yet been upstreamed, and it is very useful to me. I can hardly use u-boot on this device without it. I have received Caleb's permission to work on upstreaming this patch. This is my first contribution to U-Boot, and I am unfamiliar with mailing list workflows, so please be patient :) --- configs/qcom_defconfig | 2 + drivers/watchdog/Kconfig | 7 ++++ drivers/watchdog/Makefile | 1 + drivers/watchdog/qcom-wdt.c | 100 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 110 insertions(+) --- base-commit: f3563fc30356c8079527b90e532407050dff7c7b change-id: 20250413-b4-qcom-wdt-e7b913fc375e Best regards, diff --git a/configs/qcom_defconfig b/configs/qcom_defconfig index 537806450dc4a61d3c617cdd2b0cfb8eab1c343c..0232f6d51c552bd06c8ba72b71edb5cb72fe0706 100644 --- a/configs/qcom_defconfig +++ b/configs/qcom_defconfig @@ -144,3 +144,5 @@ CONFIG_VIDEO_FONT_16X32=y CONFIG_SYS_WHITE_ON_BLACK=y CONFIG_NO_FB_CLEAR=y CONFIG_VIDEO_SIMPLE=y +CONFIG_WDT_QCOM=y +CONFIG_WDT=y diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig index 1bb67f5035231df9f6ce01adb08d074855393143..808f4e578e28e7812f93b393a7f7d95d9501cdd4 100644 --- a/drivers/watchdog/Kconfig +++ b/drivers/watchdog/Kconfig @@ -335,6 +335,13 @@ config WDT_K3_RTI_FW_FILE endif +config WDT_QCOM + bool "Qualcomm watchdog timer support" + depends on WDT && ARCH_SNAPDRAGON + help + Select this to enable Qualcomm watchdog timer, which can be found on + some Qualcomm chips. + config WDT_SANDBOX bool "Enable Watchdog Timer support for Sandbox" depends on SANDBOX && WDT diff --git a/drivers/watchdog/Makefile b/drivers/watchdog/Makefile index e6bd4c587af6133c405dde6dbada8050debc781c..5eaabd4aba58c815de4165f901aecfba0e0da255 100644 --- a/drivers/watchdog/Makefile +++ b/drivers/watchdog/Makefile @@ -54,3 +54,4 @@ obj-$(CONFIG_WDT_SUNXI) += sunxi_wdt.o obj-$(CONFIG_WDT_TANGIER) += tangier_wdt.o obj-$(CONFIG_WDT_XILINX) += xilinx_wwdt.o obj-$(CONFIG_WDT_ADI) += adi_wdt.o +obj-$(CONFIG_WDT_QCOM) += qcom-wdt.o diff --git a/drivers/watchdog/qcom-wdt.c b/drivers/watchdog/qcom-wdt.c new file mode 100644 index 0000000000000000000000000000000000000000..a7ce31ef811c717fd16700aa7d984a000763a93e --- /dev/null +++ b/drivers/watchdog/qcom-wdt.c @@ -0,0 +1,100 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (c) 2014, The Linux Foundation. All rights reserved. + * Copyright (c) Linaro Ltd. 2024 + * + * Authors: + * Caleb Connolly + * + * Derived from linux/drivers/watchdog/qcom-wdt.c + */ + +#include +#include + +#include + +enum wdt_reg { + WDT_RST, + WDT_EN, + WDT_STS, + WDT_BARK_TIME, + WDT_BITE_TIME, +}; + +struct qcom_wdt_match_data { + const u32 *offset; +}; + +struct qcom_wdt { + void __iomem *base; + const u32 *layout; +}; + +static const u32 reg_offset_data_kpss[] = { + [WDT_RST] = 0x4, + [WDT_EN] = 0x8, + [WDT_STS] = 0xC, + [WDT_BARK_TIME] = 0x10, + [WDT_BITE_TIME] = 0x14, +}; + +static const struct qcom_wdt_match_data match_data_kpss = { + .offset = reg_offset_data_kpss, +}; + +static void __iomem *wdt_addr(struct qcom_wdt *wdt, enum wdt_reg reg) +{ + return wdt->base + wdt->layout[reg]; +} + +int qcom_wdt_start(struct udevice *dev, u64 timeout_ms, ulong flags) +{ + /* unimplemented */ + return 0; +} + +int qcom_wdt_stop(struct udevice *dev) +{ + struct qcom_wdt *wdt = dev_get_priv(dev); + + writel(0, wdt_addr(wdt, WDT_EN)); + if (readl(wdt_addr(wdt, WDT_EN))) { + printf("Failed to disable Qualcomm watchdog!\n"); + return -EIO; + } + + return 0; +} + +static int qcom_wdt_probe(struct udevice *dev) +{ + struct qcom_wdt *wdt = dev_get_priv(dev); + struct qcom_wdt_match_data *data = (void *)dev_get_driver_data(dev); + int ret; + + wdt->base = dev_read_addr_ptr(dev); + wdt->layout = data->offset; + + ret = qcom_wdt_stop(dev); + + return ret; +} + +static const struct wdt_ops qcom_wdt_ops = { + .stop = qcom_wdt_stop, +}; + +static const struct udevice_id qcom_wdt_ids[] = { + { .compatible = "qcom,kpss-wdt", .data = (ulong)&match_data_kpss }, + {} +}; + +U_BOOT_DRIVER(qcom_wdt) = { + .name = "qcom_wdt", + .id = UCLASS_WDT, + .of_match = qcom_wdt_ids, + .ops = &qcom_wdt_ops, + .probe = qcom_wdt_probe, + .priv_auto = sizeof(struct qcom_wdt), +};