From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 46580C433EF for ; Tue, 21 Jun 2022 09:17:54 +0000 (UTC) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 4C2FC839F9; Tue, 21 Jun 2022 11:17:52 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=baylibre.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (2048-bit key; unprotected) header.d=baylibre-com.20210112.gappssmtp.com header.i=@baylibre-com.20210112.gappssmtp.com header.b="YfrxUo5+"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id A22F9839F9; Tue, 21 Jun 2022 11:17:50 +0200 (CEST) Received: from mail-wr1-x42d.google.com (mail-wr1-x42d.google.com [IPv6:2a00:1450:4864:20::42d]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 0E3E9839E6 for ; Tue, 21 Jun 2022 11:17:47 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=baylibre.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=narmstrong@baylibre.com Received: by mail-wr1-x42d.google.com with SMTP id o8so18009236wro.3 for ; Tue, 21 Jun 2022 02:17:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20210112.gappssmtp.com; s=20210112; h=message-id:date:mime-version:user-agent:subject:content-language:to :cc:references:from:organization:in-reply-to :content-transfer-encoding; bh=Jb8NQRFURgXRBblEMVH/lWjItiJGnMfanr5HRRnITEs=; b=YfrxUo5+V/oBt+Q9Yq0a5nq1W9YhPNNL5Bz76ZTC/+Cfbz+WJ79FbcCC/BG68hVfcB X6CmZ7/2kjae5cS0rk7URejqunwedh19ymLlxj5klkAUIShQqTmRHjyzSOcNY9atiIXu V+ECAcWVCi+EnbauW8bRCOW5Mz2gm9fp3k+lAgiU60H+cqad1XI0SSYvaE6LP9tx3JCM /EBGE4g1GlIYFpNA5GbJS34hJtasbOIh9G9qNGmsTg3MF1fE/6qPUCIfSFJggwpsXt3z ZKZq/UQuMotdWeACtAQB36frji1BKN/RbpRx7uef+UgIsbcaKCDYBfs0E0z69/PWEeMe qihg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:date:mime-version:user-agent:subject :content-language:to:cc:references:from:organization:in-reply-to :content-transfer-encoding; bh=Jb8NQRFURgXRBblEMVH/lWjItiJGnMfanr5HRRnITEs=; b=HjFAwKKdKtLWshHT1SYbnifLMjflk1z0gDlx6LQmY0NFaMNlvZsr1RNesWCDkyLk1w X9lNarfmA31u/8VaS6F7MEAfRgvuAQIqP58rxLxerr/PHg0txu2YPiyUYfF/ReGLL7xy rR6kPBGkA5VTxA+w5eLgbtINWOCdjPzKNCSh4zj9HP7uooQcbp8YV6SuuXm+a3qo6eNk U75ROkEVgXoxOPWYGHjHUlUjvMCOEZ2zyMw7muSZRWx+B2nUIB8JmS2J+5kvJJzuRtx7 xyG6ExaaGsBrQd+2m88VLMFFn3HmZh/asgBbXRrXnwmoBK2JKEF0IO9tGGW0WPmwZe13 pYbg== X-Gm-Message-State: AJIora+SD4dZGk6yqcRd3zrSnS/tZQQbTaWXnKLRwsUr1QF9LHC47SQa HVVDx70FK3P//zoaBlhgerw/IA== X-Google-Smtp-Source: AGRyM1tt+onD1CLCQACgIOJ3u6NEQQivlYtX2vvkM4qlGIk8L5A9D0018p5sng5wtsbYaOq4ajV3OQ== X-Received: by 2002:a5d:410d:0:b0:21b:893a:7ca2 with SMTP id l13-20020a5d410d000000b0021b893a7ca2mr13572813wrp.449.1655803066462; Tue, 21 Jun 2022 02:17:46 -0700 (PDT) Received: from ?IPV6:2001:861:44c0:66c0:9f05:9492:230:f51f? ([2001:861:44c0:66c0:9f05:9492:230:f51f]) by smtp.gmail.com with ESMTPSA id p19-20020a05600c359300b0039c54bb28f2sm18340627wmq.36.2022.06.21.02.17.45 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 21 Jun 2022 02:17:45 -0700 (PDT) Message-ID: <14f84a15-5a48-9c12-5df2-39c695b439ab@baylibre.com> Date: Tue, 21 Jun 2022 11:17:44 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.8.1 Subject: Re: [PATCH v2] watchdog: add amlogic watchdog support Content-Language: en-US To: Stefan Roese , Philippe Boos Cc: u-boot@lists.denx.de, u-boot-amlogic@groups.io, Jerome Brunet , Alexandre Bailon References: <20220613140056.10316-1-pboos@baylibre.com> <31663304-da94-67af-163c-d82ec75322bd@denx.de> From: Neil Armstrong Organization: Baylibre In-Reply-To: <31663304-da94-67af-163c-d82ec75322bd@denx.de> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit 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.6 at phobos.denx.de X-Virus-Status: Clean Hi Stefan, On 20/06/2022 16:55, Stefan Roese wrote: > On 13.06.22 16:00, Philippe Boos wrote: >> Add support for hardware watchdog timer for Amlogic SoCs. >> This driver has been heavily inspired by his Linux equivalent >> (meson_gxbb_wdt.c). >> >> Reviewed-by: Jerome Brunet >> Reviewed-by: Neil Armstrong >> >> Signed-off-by: Philippe Boos >> > > Reviewed-by: Stefan Roese Should I take it into my tree ? Thanks, Neil > > Thanks, > Stefan > >> --- >> >> Your recommendations have been implemented. I let you check this version 2. >> The reset works well when triggered by the wdt command in u-boot. >> >> This watchdog driver has been tested on a GXL libretech-cc board and also on >> a custom G12a board. I did the following test cases: >>   * boot with a faulty boot command, then we reach watchdog reset successfully, >>   * boot a Linux kernel with and without watchdog support, and check if it is >>     working as expected. >> >> >>   MAINTAINERS                       |   1 + >>   doc/board/amlogic/index.rst       |   2 + >>   drivers/watchdog/Kconfig          |   7 ++ >>   drivers/watchdog/Makefile         |   1 + >>   drivers/watchdog/meson_gxbb_wdt.c | 136 ++++++++++++++++++++++++++++++ >>   5 files changed, 147 insertions(+) >>   create mode 100644 drivers/watchdog/meson_gxbb_wdt.c >> >> diff --git a/MAINTAINERS b/MAINTAINERS >> index 28e4d38238..ab3ef041f7 100644 >> --- a/MAINTAINERS >> +++ b/MAINTAINERS >> @@ -160,6 +160,7 @@ F:    drivers/spi/meson_spifc.c >>   F:    drivers/pinctrl/meson/ >>   F:    drivers/power/domain/meson-gx-pwrc-vpu.c >>   F:    drivers/video/meson/ >> +F:    drivers/watchdog/meson_gxbb_wdt.c >>   F:    include/configs/meson64.h >>   F:    include/configs/meson64_android.h >>   F:    doc/board/amlogic/ >> diff --git a/doc/board/amlogic/index.rst b/doc/board/amlogic/index.rst >> index 9c7fadf2c0..cc2ba50889 100644 >> --- a/doc/board/amlogic/index.rst >> +++ b/doc/board/amlogic/index.rst >> @@ -73,6 +73,8 @@ This matrix concerns the actual source code version. >>   +-------------------------------+-----------+-----------------+--------------+-------------+------------+-------------+--------------+ >>   | PCIe (+NVMe)                  | *N/A*     | *N/A*           | *N/A*        | **Yes**     | **Yes**    | **Yes**     | **Yes**      | >>   +-------------------------------+-----------+-----------------+--------------+-------------+------------+-------------+--------------+ >> +| Watchdog                      | *N/A*     | **Yes**         | *N/A*        | *N/A*       | *N/A*      | *N/A*       | *N/A*        | >> ++-------------------------------+-----------+-----------------+--------------+-------------+------------+-------------+--------------+ >>   Boot Documentation >>   ------------------ >> diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig >> index c3eb8a8aec..da0fa5396f 100644 >> --- a/drivers/watchdog/Kconfig >> +++ b/drivers/watchdog/Kconfig >> @@ -175,6 +175,13 @@ config WDT_MAX6370 >>       help >>         Select this to enable max6370 watchdog timer. >> +config WDT_MESON_GXBB >> +    bool "Amlogic watchdog timer support" >> +    depends on WDT >> +    help >> +      Select this to enable Meson watchdog timer, >> +      which can be found on some Amlogic platforms. >> + >>   config WDT_MPC8xx >>       bool "MPC8xx watchdog timer support" >>       depends on WDT && MPC8xx >> diff --git a/drivers/watchdog/Makefile b/drivers/watchdog/Makefile >> index 1f6199beca..0e2f582a5f 100644 >> --- a/drivers/watchdog/Makefile >> +++ b/drivers/watchdog/Makefile >> @@ -27,6 +27,7 @@ obj-$(CONFIG_WDT_ORION) += orion_wdt.o >>   obj-$(CONFIG_WDT_CDNS) += cdns_wdt.o >>   obj-$(CONFIG_WDT_GPIO) += gpio_wdt.o >>   obj-$(CONFIG_WDT_MAX6370) += max6370_wdt.o >> +obj-$(CONFIG_WDT_MESON_GXBB) += meson_gxbb_wdt.o >>   obj-$(CONFIG_WDT_MPC8xx) += mpc8xx_wdt.o >>   obj-$(CONFIG_WDT_MT7620) += mt7620_wdt.o >>   obj-$(CONFIG_WDT_MT7621) += mt7621_wdt.o >> diff --git a/drivers/watchdog/meson_gxbb_wdt.c b/drivers/watchdog/meson_gxbb_wdt.c >> new file mode 100644 >> index 0000000000..6ab005813f >> --- /dev/null >> +++ b/drivers/watchdog/meson_gxbb_wdt.c >> @@ -0,0 +1,136 @@ >> +// SPDX-License-Identifier: GPL-2.0+ >> +/* >> + * Copyright (c) 2022 BayLibre, SAS. >> + */ >> + >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> + >> +#define GXBB_WDT_CTRL_REG            0x0 >> +#define GXBB_WDT_TCNT_REG            0x8 >> +#define GXBB_WDT_RSET_REG            0xc >> + >> +#define GXBB_WDT_CTRL_SYS_RESET_NOW        BIT(26) >> +#define GXBB_WDT_CTRL_CLKDIV_EN            BIT(25) >> +#define GXBB_WDT_CTRL_CLK_EN            BIT(24) >> +#define GXBB_WDT_CTRL_EE_RESET            BIT(21) >> +#define GXBB_WDT_CTRL_EN            BIT(18) >> + >> +#define GXBB_WDT_CTRL_DIV_MASK            GENMASK(17, 0) >> +#define GXBB_WDT_TCNT_SETUP_MASK        GENMASK(15, 0) >> + >> + >> +struct amlogic_wdt_priv { >> +    void __iomem *reg_base; >> +}; >> + >> +static int amlogic_wdt_set_timeout(struct udevice *dev, u64 timeout_ms) >> +{ >> +    struct amlogic_wdt_priv *data = dev_get_priv(dev); >> + >> +    if (timeout_ms > GXBB_WDT_TCNT_SETUP_MASK) { >> +        dev_warn(dev, "%s: timeout_ms=%llu: maximum watchdog timeout exceeded\n", >> +                 __func__, timeout_ms); >> +        timeout_ms = GXBB_WDT_TCNT_SETUP_MASK; >> +    } >> + >> +    writel(timeout_ms, data->reg_base + GXBB_WDT_TCNT_REG); >> + >> +    return 0; >> +} >> + >> +static int amlogic_wdt_stop(struct udevice *dev) >> +{ >> +    struct amlogic_wdt_priv *data = dev_get_priv(dev); >> + >> +    writel(readl(data->reg_base + GXBB_WDT_CTRL_REG) & ~GXBB_WDT_CTRL_EN, >> +           data->reg_base + GXBB_WDT_CTRL_REG); >> + >> +    return 0; >> +} >> + >> +static int amlogic_wdt_start(struct udevice *dev, u64 time_ms, ulong flags) >> +{ >> +    struct amlogic_wdt_priv *data = dev_get_priv(dev); >> + >> +    writel(readl(data->reg_base + GXBB_WDT_CTRL_REG) | GXBB_WDT_CTRL_EN, >> +           data->reg_base + GXBB_WDT_CTRL_REG); >> + >> +    return amlogic_wdt_set_timeout(dev, time_ms); >> +} >> + >> +static int amlogic_wdt_reset(struct udevice *dev) >> +{ >> +    struct amlogic_wdt_priv *data = dev_get_priv(dev); >> + >> +    writel(0, data->reg_base + GXBB_WDT_RSET_REG); >> + >> +    return 0; >> +} >> + >> +static int amlogic_wdt_expire_now(struct udevice *dev, ulong flags) >> +{ >> +    struct amlogic_wdt_priv *data = dev_get_priv(dev); >> + >> +    writel(0, data->reg_base + GXBB_WDT_CTRL_SYS_RESET_NOW); >> + >> +    return 0; >> +} >> + >> +static int amlogic_wdt_probe(struct udevice *dev) >> +{ >> +    struct amlogic_wdt_priv *data = dev_get_priv(dev); >> +    int ret; >> + >> +    data->reg_base = dev_remap_addr(dev); >> +    if (!data->reg_base) >> +        return -EINVAL; >> + >> +    struct clk clk; >> + >> +    ret = clk_get_by_index(dev, 0, &clk); >> +    if (ret) >> +        return ret; >> + >> +    ret = clk_enable(&clk); >> +    if (ret) { >> +        clk_free(&clk); >> +        return ret; >> +    } >> + >> +    /* Setup with 1ms timebase */ >> +    writel(((clk_get_rate(&clk) / 1000) & GXBB_WDT_CTRL_DIV_MASK) | >> +           GXBB_WDT_CTRL_EE_RESET | >> +           GXBB_WDT_CTRL_CLK_EN | >> +           GXBB_WDT_CTRL_CLKDIV_EN, >> +           data->reg_base + GXBB_WDT_CTRL_REG); >> + >> +    return 0; >> +} >> + >> +static const struct wdt_ops amlogic_wdt_ops = { >> +    .start = amlogic_wdt_start, >> +    .reset = amlogic_wdt_reset, >> +    .stop = amlogic_wdt_stop, >> +    .expire_now = amlogic_wdt_expire_now, >> +}; >> + >> +static const struct udevice_id amlogic_wdt_ids[] = { >> +    { .compatible = "amlogic,meson-gxbb-wdt" }, >> +    {} >> +}; >> + >> +U_BOOT_DRIVER(amlogic_wdt) = { >> +    .name = "amlogic_wdt", >> +    .id = UCLASS_WDT, >> +    .of_match = amlogic_wdt_ids, >> +    .priv_auto = sizeof(struct amlogic_wdt_priv), >> +    .probe = amlogic_wdt_probe, >> +    .ops = &amlogic_wdt_ops, >> +    .flags = DM_FLAG_PRE_RELOC, >> +}; > > Viele Grüße, > Stefan Roese >