Received: by 2002:a05:6a10:5bc5:0:0:0:0 with SMTP id os5csp1988149pxb; Sun, 31 Oct 2021 05:24:09 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyP8cFksxVbHxu76P/BRZHR646NgHp0ngEQk04+G83VCpB45mm+sdkRrlORCzihAz/NjnlW X-Received: by 2002:a02:cb42:: with SMTP id k2mr2786208jap.25.1635683049529; Sun, 31 Oct 2021 05:24:09 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1635683049; cv=none; d=google.com; s=arc-20160816; b=vmaGjX2qZ07B97j6IvZdwuRD5+HryJSXCLCb6GDntcfgyaFZ1RWCz0Gj4sxthpgSzL +Gu40fHZji/h6PwK31sFRAYD6toJoMs2aQVUdBaP55rBrJ06gEyEgCkzO4tZiTp5l3cb fWMu6AEmsR9bP3ComKrzCTWgjp4hKDGdKqvhsgadLFqR4wBJABci0Jw6zSmczJH0BLlZ fAaKEyMn9wCHG+86SHDnHHrFwS2Vsv9nBs5+XbMI63C/0CswHxMyaul8hgl6cYNsmfFa Rg5oGyTc6VrmZTnxfLwdMHyLIeKtvYG28CBkCGxlziI6jZmST7RAeUMkYIMTJGtWYTnR uUUA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=3iEY6GQYQz83dpV+fT6R+J5oU7g9/XFul1oWQ/m49lI=; b=umfH+pQq/Ym4V3RJrXwLpJLYtHGJ8+JNpTZifjK5XSpTQp8rzVwme1ww41DobQ0Vwh aGSCTkWfHZJPAnSyN2E1w7EtK6dTThz9iqfsLUO/YPs8lc07t0Dp6MeuVcN5fhtzBbig eIM7f9gvszFsFSoITBR/bQYmLoTCu69zlr4hdo0PJggENcVfDs/z2P4WuHUexYiNF+9d IW98exQNrGoGR3NfT3YyUwEHPOtLuWtvgIHHjjhMBJcMLJMJ5PFDY70+wU4StdmVfySp eAC86VWSn5+znpgWyTDAeSyxYQyspTeUR9p0PK4B9Pr5ZCQjsO5/Bc46igN3JIFsm7Qe cHpQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=paMNXcWg; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id b11si6280734ilv.42.2021.10.31.05.23.58; Sun, 31 Oct 2021 05:24:09 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=paMNXcWg; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232245AbhJaMZ0 (ORCPT + 99 others); Sun, 31 Oct 2021 08:25:26 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51100 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232236AbhJaMZK (ORCPT ); Sun, 31 Oct 2021 08:25:10 -0400 Received: from mail-ed1-x532.google.com (mail-ed1-x532.google.com [IPv6:2a00:1450:4864:20::532]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4B83FC06120A for ; Sun, 31 Oct 2021 05:22:38 -0700 (PDT) Received: by mail-ed1-x532.google.com with SMTP id m17so53702178edc.12 for ; Sun, 31 Oct 2021 05:22:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=3iEY6GQYQz83dpV+fT6R+J5oU7g9/XFul1oWQ/m49lI=; b=paMNXcWgNsqVxxXLElooVUCI5zgF9Hx8RgxZ2SqhdtT64USC0+p7vplys9LI42Uk+1 XcU4l37vhiQcoRIWt5azDuYrnmh5IDKVqJc2xo/tk8KjqUUnlgSmmo4z9NkvrcU3SSX5 QoN4cEBdqEFK6lU+VVqu6DYrBL1qV2xiY1ny52WZRRYLeQpL/MYhO+j/03383iBqwu8P RmzESNsirHGqn4jcwi801Dial2eRQkEliy84+LkWS1TprmKj0oHbrNH75HxsPQuJlhEl SX9IMToBjQAihJR4aIzFvGGKsjBCXpjLOVv2nMhhF/Rn7p+nTy2kDV30CrexMJ0fbxfK B+YQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=3iEY6GQYQz83dpV+fT6R+J5oU7g9/XFul1oWQ/m49lI=; b=pmkDUE+tDWyqIyketnADAa+GTG+eiqDFt/hp/e9hKIt4ROJV65EvdL4n8yeYV0FuFL RYcP+lD17lsIeZQXybu5+pwhZKsLo6WTX4yG8cCZVLf/4Y4RYs4wMsC6ko94Hs6c8TuP FwI/PpVf0UwThTCAGo29Oc9Kaak/74ndraMIgCkmaxzLJmfb0FZXDYVGHsPN4W2BNF5T UWbDNnb89UhAyWeuXPN/+SJjSisHX9A4l1+bAiXUm4BmuFWdj98ODaPJm39hG+E10cJy wbRFqRJobJ/jVfhEPszEfnkaarcnRVsKmF74o7EzokRj/xgzqRxsvS6warWWK35w+eM0 zKEg== X-Gm-Message-State: AOAM532k9o10kJJ9tqspsu5XuZNc0sgLaCSC37llWCF0gCicy4Z08jTA Bc2rp3AMhS3ra7yRcWrfpbBZ7A== X-Received: by 2002:aa7:da10:: with SMTP id r16mr9332682eds.56.1635682956847; Sun, 31 Oct 2021 05:22:36 -0700 (PDT) Received: from localhost ([31.134.121.151]) by smtp.gmail.com with ESMTPSA id eg33sm4316607edb.77.2021.10.31.05.22.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 31 Oct 2021 05:22:36 -0700 (PDT) From: Sam Protsenko To: Wim Van Sebroeck , Guenter Roeck , Rob Herring , Krzysztof Kozlowski Cc: linux-watchdog@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-samsung-soc@vger.kernel.org Subject: [PATCH v2 12/12] watchdog: s3c2410: Add Exynos850 support Date: Sun, 31 Oct 2021 14:22:16 +0200 Message-Id: <20211031122216.30212-13-semen.protsenko@linaro.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20211031122216.30212-1-semen.protsenko@linaro.org> References: <20211031122216.30212-1-semen.protsenko@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Exynos850 is a bit different from SoCs already supported in WDT driver: - AUTOMATIC_WDT_RESET_DISABLE register is removed, so its value is always 0; .disable_auto_reset callback is not set for that reason - MASK_WDT_RESET_REQUEST register is replaced with CLUSTERx_NONCPU_IN_EN register; instead of masking (disabling) WDT reset interrupt it's now enabled with the same value; .mask_reset callback is reused for that functionality though - To make WDT functional, WDT counter needs to be enabled in CLUSTERx_NONCPU_OUT register; it's done using .enable_counter callback Also Exynos850 has two CPU clusters, each has its own dedicated WDT instance. Different PMU registers and bits are used for each cluster. So driver data is now modified in probe, adding needed info depending on cluster index passed from device tree. Signed-off-by: Sam Protsenko --- Changes in v2: - Used single compatible for Exynos850, populating missing driver data in probe - Added "index" property to specify CPU cluster index drivers/watchdog/s3c2410_wdt.c | 68 +++++++++++++++++++++++++++++++++- 1 file changed, 66 insertions(+), 2 deletions(-) diff --git a/drivers/watchdog/s3c2410_wdt.c b/drivers/watchdog/s3c2410_wdt.c index 8fdda2ede1c3..457b725c30ac 100644 --- a/drivers/watchdog/s3c2410_wdt.c +++ b/drivers/watchdog/s3c2410_wdt.c @@ -56,6 +56,14 @@ #define EXYNOS5_RST_STAT_REG_OFFSET 0x0404 #define EXYNOS5_WDT_DISABLE_REG_OFFSET 0x0408 #define EXYNOS5_WDT_MASK_RESET_REG_OFFSET 0x040c +#define EXYNOS850_CLUSTER0_NONCPU_OUT 0x1220 +#define EXYNOS850_CLUSTER0_NONCPU_INT_EN 0x1244 +#define EXYNOS850_CLUSTER1_NONCPU_OUT 0x1620 +#define EXYNOS850_CLUSTER1_NONCPU_INT_EN 0x1644 + +#define EXYNOS850_CLUSTER0_WDTRESET_BIT 24 +#define EXYNOS850_CLUSTER1_WDTRESET_BIT 23 + #define QUIRK_HAS_WTCLRINT_REG (1 << 0) #define QUIRK_HAS_PMU_MASK_RESET (1 << 1) #define QUIRK_HAS_PMU_RST_STAT (1 << 2) @@ -171,6 +179,21 @@ static const struct s3c2410_wdt_variant drv_data_exynos7 = { QUIRK_HAS_PMU_RST_STAT | QUIRK_HAS_PMU_AUTO_DISABLE, }; +static const struct s3c2410_wdt_variant drv_data_exynos850 = { + /* + * Next fields will be set in probe(), based on cluster index: + * - .mask_reset_reg + * - .rst_stat_bit + * - .cnt_en_reg + */ + .mask_reset_inv = true, + .mask_bit = 2, + .rst_stat_reg = EXYNOS5_RST_STAT_REG_OFFSET, + .cnt_en_bit = 7, + .quirks = QUIRK_HAS_WTCLRINT_REG | QUIRK_HAS_PMU_MASK_RESET | \ + QUIRK_HAS_PMU_RST_STAT | QUIRK_HAS_PMU_CNT_EN, +}; + static const struct of_device_id s3c2410_wdt_match[] = { { .compatible = "samsung,s3c2410-wdt", .data = &drv_data_s3c2410 }, @@ -182,6 +205,8 @@ static const struct of_device_id s3c2410_wdt_match[] = { .data = &drv_data_exynos5420 }, { .compatible = "samsung,exynos7-wdt", .data = &drv_data_exynos7 }, + { .compatible = "samsung,exynos850-wdt", + .data = &drv_data_exynos850 }, {}, }; MODULE_DEVICE_TABLE(of, s3c2410_wdt_match); @@ -548,15 +573,51 @@ static inline const struct s3c2410_wdt_variant * s3c2410_get_wdt_drv_data(struct platform_device *pdev) { const struct s3c2410_wdt_variant *variant; + struct s3c2410_wdt_variant *data; + struct device *dev = &pdev->dev; - variant = of_device_get_match_data(&pdev->dev); + variant = of_device_get_match_data(dev); if (!variant) { /* Device matched by platform_device_id */ variant = (struct s3c2410_wdt_variant *) platform_get_device_id(pdev)->driver_data; } - return variant; + /* Have to copy driver data over to keep its const qualifier intact */ + data = devm_kmemdup(dev, variant, sizeof(*variant), GFP_KERNEL); + if (!data) + return NULL; + + /* Populate missing fields for Exynos850 w.r.t. cluster index */ + if (variant == &drv_data_exynos850) { + u32 index; + int err; + + err = of_property_read_u32(dev->of_node, "samsung,index", + &index); + if (err) { + dev_err(dev, "failed to get cluster index\n"); + return NULL; + } + + switch (index) { + case 0: + data->mask_reset_reg = EXYNOS850_CLUSTER0_NONCPU_INT_EN; + data->rst_stat_bit = EXYNOS850_CLUSTER0_WDTRESET_BIT; + data->cnt_en_reg = EXYNOS850_CLUSTER0_NONCPU_OUT; + break; + case 1: + data->mask_reset_reg = EXYNOS850_CLUSTER1_NONCPU_INT_EN; + data->rst_stat_bit = EXYNOS850_CLUSTER1_WDTRESET_BIT; + data->cnt_en_reg = EXYNOS850_CLUSTER1_NONCPU_OUT; + break; + default: + dev_err(dev, "wrong cluster index: %u\n", index); + return NULL; + } + } + + return data; } static int s3c2410wdt_probe(struct platform_device *pdev) @@ -576,6 +637,9 @@ static int s3c2410wdt_probe(struct platform_device *pdev) wdt->wdt_device = s3c2410_wdd; wdt->drv_data = s3c2410_get_wdt_drv_data(pdev); + if (!wdt->drv_data) + return -EINVAL; + if (wdt->drv_data->quirks & QUIRKS_HAVE_PMUREG) { wdt->pmureg = syscon_regmap_lookup_by_phandle(dev->of_node, "samsung,syscon-phandle"); -- 2.30.2