From patchwork Tue Jul 12 09:03:20 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ben Dooks X-Patchwork-Id: 1655254 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=pass (2048-bit key; secure) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=bombadil.20210309 header.b=n2bNqfVQ; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=sifive.com header.i=@sifive.com header.a=rsa-sha256 header.s=google header.b=lJ/nQ4Hd; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.infradead.org (client-ip=2607:7c80:54:3::133; helo=bombadil.infradead.org; envelope-from=opensbi-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=) Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:3::133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4Lhvtz382Sz9sB4 for ; Tue, 12 Jul 2022 19:03:55 +1000 (AEST) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:Message-Id:Date:Subject:Cc :To:From:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References: List-Owner; bh=vZeDfiYGtNXLEQldOX84PzgFw+hMASmPSWjKnW+LuLY=; b=n2bNqfVQOeJA3z 8LuetraOQCn5WgXAXQvpZsmpML8BMihVIesIIFgYIdb7NyvChIObIBdZ9TksmeeBN+hDbsVE9HoKv bX8XvJJ9JD1wMqf+UtOE19MESLnYXeXqfMjucI+AUkCrAOhYZzgRjLXs2pYuS3xfxQDHxX3sXTcE3 FUn9NFXGBKTYlLjOVfJ75uXEL/xHkVByQhDhshAFijyNLzt1AY35LDW0po3QnQwaIFfUHbqJNIAPQ s97+jeTIUIl1iVLXnM0hsDb1ONPXl8TsoKHAFy/mvhm92SN41sWRu8sFH9Xsw6qvxeN3BHe2WUzku knNSq430kqKjXly3v8OA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1oBBnq-0092M1-FP; Tue, 12 Jul 2022 09:03:34 +0000 Received: from mail-wr1-x434.google.com ([2a00:1450:4864:20::434]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1oBBnl-0092Il-0F for opensbi@lists.infradead.org; Tue, 12 Jul 2022 09:03:31 +0000 Received: by mail-wr1-x434.google.com with SMTP id r10so4067007wrv.4 for ; Tue, 12 Jul 2022 02:03:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sifive.com; s=google; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=sxhclL2BaG41mnX5g1YVEW11AEfbtl3rPYHXjBwrAwQ=; b=lJ/nQ4HdCXNFXr43wea2TzP3oD/2QgDZESIAAS/btBiEV8ZzEwiymy0qo3K5QVFRKY PoRrv0CMEaif70wKlN1wv6AjRoszGcm/U7dzC1llQjuFcdhOL9L7Zu0bfbntEQYKOx4C tclQuAafnjda6IC25fFwdMepxpp6mMcLTRb9peQavydTDANs/dNHHd4d2WckhZ9IrFs2 TqUHFK+m+AJXoP6HI3+HpGUQt1B4l8g0Gw3ZRpBFay7yAqrI+jsea9lxcfjXh1C++SyS x7b2qeikO/hFPrf/uG4FEtDPGWgPl4+CJ42ob0Xcaxd+h7sjqwZ7ndOA8xSP+M73z1G/ G0+A== 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:mime-version :content-transfer-encoding; bh=sxhclL2BaG41mnX5g1YVEW11AEfbtl3rPYHXjBwrAwQ=; b=eTom/jDKyBCdXvFjRYNhi3o69rSzEsfbBDCb1zBEf9X+l51y6fResS6kahu2fkFzCI 7G2aJD3S0BdQ2Yd6+O2T7gwhS1iki6nWkODKGm52KlC5VT1emDjVnxxYoYC8+XNN+LIo 0EWAOD2m8Dkt/KGw79WeNC5cR654MBU/vDqDIB/ryg2teB6igaQdfmvHLi9wQ/4w45fd XDzFgAhv0AiShKK5DeVlsQx5213K5i2FwCfGjy4OSnh3RLt6oSuIvE9ov2xqXrtrakCn Z72w2J7goKkdeoZDbsKJKr9ZBhRYk4dStGzrp188ECZ6Ibu3SeWHIgH0ML16y8vX0II+ ivUw== X-Gm-Message-State: AJIora9Qhw9BWabShpcExUCu+SIiN1dRDZRU8uoj++NVQ65KW/BlCrfI lhfFvoKXdwUYspty+DQDNp8wkAUZu4Zp4pVd X-Google-Smtp-Source: AGRyM1sZBxrFjlOxpddZIx+foMGZW6ICQM2ZbmwLHDFgpTjfCVVkGyWFVrxndcte9LpDZDlvJQgxkA== X-Received: by 2002:a05:6000:2cc:b0:21d:76d7:995d with SMTP id o12-20020a05600002cc00b0021d76d7995dmr21743562wry.339.1657616604272; Tue, 12 Jul 2022 02:03:24 -0700 (PDT) Received: from rainbowdash.office.codethink.co.uk ([167.98.27.226]) by smtp.gmail.com with ESMTPSA id f10-20020a7bc8ca000000b003a0231af43csm8657919wml.48.2022.07.12.02.03.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 12 Jul 2022 02:03:23 -0700 (PDT) From: Ben Dooks To: opensbi@lists.infradead.org Cc: Jude Onyenegecha , Sudip Mukherjee , William Salmon , Adnan Chowdhury , Ben Dooks Subject: [PATCH] platform: move da9063-reset driver to shareable code Date: Tue, 12 Jul 2022 10:03:20 +0100 Message-Id: <20220712090320.564729-1-ben.dooks@sifive.com> X-Mailer: git-send-email 2.35.1 MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220712_020329_088634_3E38E076 X-CRM114-Status: GOOD ( 23.39 ) X-Spam-Score: -0.2 (/) X-Spam-Report: Spam detection software, running on the system "bombadil.infradead.org", has NOT identified this incoming email as spam. The original message has been attached to this so you can view it or label similar future email. If you have any questions, see the administrator of that system for details. Content preview: The da9063 reset code may be useful for other users, so move this out to a new file from the current sifive_fu740.c user. This can then be called from the relevant machines. Signed-off-by: Ben Dooks --- platform/generic/da9063_reset.c | 229 ++++++++++++++++++++++++ platform/generic/include/da9063_reset.h | 14 ++ platform/generic/objects.mk | 3 + pla [...] Content analysis details: (-0.2 points, 5.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at https://www.dnswl.org/, no trust [2a00:1450:4864:20:0:0:0:434 listed in] [list.dnswl.org] -0.0 SPF_PASS SPF: sender matches SPF record 0.0 SPF_HELO_NONE SPF: HELO does not publish an SPF Record -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid -0.1 DKIM_VALID_EF Message has a valid DKIM or DK signature from envelope-from domain X-BeenThere: opensbi@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "opensbi" Errors-To: opensbi-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org The da9063 reset code may be useful for other users, so move this out to a new file from the current sifive_fu740.c user. This can then be called from the relevant machines. Signed-off-by: Ben Dooks --- platform/generic/da9063_reset.c | 229 ++++++++++++++++++++++++ platform/generic/include/da9063_reset.h | 14 ++ platform/generic/objects.mk | 3 + platform/generic/sifive/fu740.c | 197 +------------------- 4 files changed, 248 insertions(+), 195 deletions(-) create mode 100644 platform/generic/da9063_reset.c create mode 100644 platform/generic/include/da9063_reset.h diff --git a/platform/generic/da9063_reset.c b/platform/generic/da9063_reset.c new file mode 100644 index 0000000..50c987d --- /dev/null +++ b/platform/generic/da9063_reset.c @@ -0,0 +1,229 @@ +/* + * SPDX-License-Identifier: BSD-2-Clause + * + * Copyright (c) 2021 SiFive + * Copyright (c) 2021 YADRO + * + * Split from sifive_fu740.c + * + * Authors: + * David Abdurachmanov + * Nikita Shubin + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define DA9063_REG_PAGE_CON 0x00 +#define DA9063_REG_CONTROL_A 0x0e +#define DA9063_REG_CONTROL_D 0x11 +#define DA9063_REG_CONTROL_F 0x13 +#define DA9063_REG_DEVICE_ID 0x81 + +#define DA9063_CONTROL_A_M_POWER1_EN (1 << 6) +#define DA9063_CONTROL_A_M_POWER_EN (1 << 5) +#define DA9063_CONTROL_A_STANDBY (1 << 3) + +#define DA9063_CONTROL_D_TWDSCALE_MASK 0x07 + +#define DA9063_CONTROL_F_WAKEUP (1 << 2) +#define DA9063_CONTROL_F_SHUTDOWN (1 << 1) + +#define PMIC_CHIP_ID_DA9063 0x61 + +static struct { + struct i2c_adapter *adapter; + uint32_t reg; +} da9063; + +static int da9063_system_reset_check(u32 type, u32 reason) +{ + switch (type) { + case SBI_SRST_RESET_TYPE_SHUTDOWN: + return 1; + case SBI_SRST_RESET_TYPE_COLD_REBOOT: + case SBI_SRST_RESET_TYPE_WARM_REBOOT: + return 255; + } + + return 0; +} + +static inline int da9063_sanity_check(struct i2c_adapter *adap, uint32_t reg) +{ + uint8_t val; + int rc = i2c_adapter_reg_write(adap, reg, DA9063_REG_PAGE_CON, 0x02); + + if (rc) + return rc; + + /* check set page*/ + rc = i2c_adapter_reg_read(adap, reg, 0x0, &val); + if (rc) + return rc; + + if (val != 0x02) + return SBI_ENODEV; + + /* read and check device id */ + rc = i2c_adapter_reg_read(adap, reg, DA9063_REG_DEVICE_ID, &val); + if (rc) + return rc; + + if (val != PMIC_CHIP_ID_DA9063) + return SBI_ENODEV; + + return 0; +} + +static inline int da9063_stop_watchdog(struct i2c_adapter *adap, uint32_t reg) +{ + uint8_t val; + int rc = i2c_adapter_reg_write(adap, reg, + DA9063_REG_PAGE_CON, 0x00); + + if (rc) + return rc; + + rc = i2c_adapter_reg_read(adap, reg, DA9063_REG_CONTROL_D, &val); + if (rc) + return rc; + + if ((val & DA9063_CONTROL_D_TWDSCALE_MASK) == 0) + return 0; + + val &= ~DA9063_CONTROL_D_TWDSCALE_MASK; + + return i2c_adapter_reg_write(adap, reg, DA9063_REG_CONTROL_D, val); +} + +static inline int da9063_shutdown(struct i2c_adapter *adap, uint32_t reg) +{ + int rc = i2c_adapter_reg_write(adap, reg, + DA9063_REG_PAGE_CON, 0x00); + + if (rc) + return rc; + + return i2c_adapter_reg_write(adap, reg, + DA9063_REG_CONTROL_F, + DA9063_CONTROL_F_SHUTDOWN); +} + +static inline int da9063_reset(struct i2c_adapter *adap, uint32_t reg) +{ + int rc = i2c_adapter_reg_write(adap, reg, + DA9063_REG_PAGE_CON, 0x00); + + if (rc) + return rc; + + rc = i2c_adapter_reg_write(adap, reg, + DA9063_REG_CONTROL_F, + DA9063_CONTROL_F_WAKEUP); + if (rc) + return rc; + + return i2c_adapter_reg_write(adap, reg, + DA9063_REG_CONTROL_A, + DA9063_CONTROL_A_M_POWER1_EN | + DA9063_CONTROL_A_M_POWER_EN | + DA9063_CONTROL_A_STANDBY); +} + +static void da9063_system_reset(u32 type, u32 reason) +{ + struct i2c_adapter *adap = da9063.adapter; + uint32_t reg = da9063.reg; + int rc; + + if (adap) { + /* sanity check */ + rc = da9063_sanity_check(adap, reg); + if (rc) { + sbi_printf("%s: chip is not da9063 PMIC\n", __func__); + goto skip_reset; + } + + switch (type) { + case SBI_SRST_RESET_TYPE_SHUTDOWN: + da9063_shutdown(adap, reg); + break; + case SBI_SRST_RESET_TYPE_COLD_REBOOT: + case SBI_SRST_RESET_TYPE_WARM_REBOOT: + da9063_stop_watchdog(adap, reg); + da9063_reset(adap, reg); + break; + } + } + +skip_reset: + sbi_hart_hang(); +} + +static struct sbi_system_reset_device da9063_reset_i2c = { + .name = "da9063-reset", + .system_reset_check = da9063_system_reset_check, + .system_reset = da9063_system_reset +}; + +static int da9063_reset_init(void *fdt, int nodeoff, + const struct fdt_match *match) +{ + int rc, i2c_bus; + struct i2c_adapter *adapter; + uint64_t addr; + + /* we are dlg,da9063 node */ + rc = fdt_get_node_addr_size(fdt, nodeoff, 0, &addr, NULL); + if (rc) + return rc; + + da9063.reg = addr; + + /* find i2c bus parent node */ + i2c_bus = fdt_parent_offset(fdt, nodeoff); + if (i2c_bus < 0) + return i2c_bus; + + /* i2c adapter get */ + rc = fdt_i2c_adapter_get(fdt, i2c_bus, &adapter); + if (rc) + return rc; + + da9063.adapter = adapter; + + sbi_system_reset_add_device(&da9063_reset_i2c); + + return 0; +} + +static const struct fdt_match da9063_reset_match[] = { + { .compatible = "dlg,da9063", .data = (void *)TRUE }, + { }, +}; + +static struct fdt_reset fdt_reset_da9063 = { + .match_table = da9063_reset_match, + .init = da9063_reset_init, +}; + +int da9063_reset_bind(void *fdt) +{ + int rc; + + rc = fdt_reset_driver_init(fdt, &fdt_reset_da9063); + if (rc) + sbi_printf("error: failed to find da9063 for reset\n"); + return rc; +} + diff --git a/platform/generic/include/da9063_reset.h b/platform/generic/include/da9063_reset.h new file mode 100644 index 0000000..3075c25 --- /dev/null +++ b/platform/generic/include/da9063_reset.h @@ -0,0 +1,14 @@ +/* + * SPDX-License-Identifier: BSD-2-Clause + * + * Copyright (c) 2021 SiFive + * Copyright (c) 2021 YADRO + * + * Split from sifive_fu740.c + * + * Authors: + * David Abdurachmanov + * Nikita Shubin + */ + +extern int da9063_reset_bind(void *fdt); diff --git a/platform/generic/objects.mk b/platform/generic/objects.mk index 4907754..465a2f6 100644 --- a/platform/generic/objects.mk +++ b/platform/generic/objects.mk @@ -9,3 +9,6 @@ platform-objs-y += platform.o platform-objs-y += platform_override_modules.o + +platform-objs-y += da9063_reset.o + diff --git a/platform/generic/sifive/fu740.c b/platform/generic/sifive/fu740.c index f595c04..7ba4162 100644 --- a/platform/generic/sifive/fu740.c +++ b/platform/generic/sifive/fu740.c @@ -10,6 +10,7 @@ */ #include +#include #include #include #include @@ -20,200 +21,6 @@ #include #include -#define DA9063_REG_PAGE_CON 0x00 -#define DA9063_REG_CONTROL_A 0x0e -#define DA9063_REG_CONTROL_D 0x11 -#define DA9063_REG_CONTROL_F 0x13 -#define DA9063_REG_DEVICE_ID 0x81 - -#define DA9063_CONTROL_A_M_POWER1_EN (1 << 6) -#define DA9063_CONTROL_A_M_POWER_EN (1 << 5) -#define DA9063_CONTROL_A_STANDBY (1 << 3) - -#define DA9063_CONTROL_D_TWDSCALE_MASK 0x07 - -#define DA9063_CONTROL_F_WAKEUP (1 << 2) -#define DA9063_CONTROL_F_SHUTDOWN (1 << 1) - -#define PMIC_CHIP_ID_DA9063 0x61 - -static struct { - struct i2c_adapter *adapter; - uint32_t reg; -} da9063; - -static int da9063_system_reset_check(u32 type, u32 reason) -{ - switch (type) { - case SBI_SRST_RESET_TYPE_SHUTDOWN: - return 1; - case SBI_SRST_RESET_TYPE_COLD_REBOOT: - case SBI_SRST_RESET_TYPE_WARM_REBOOT: - return 255; - } - - return 0; -} - -static inline int da9063_sanity_check(struct i2c_adapter *adap, uint32_t reg) -{ - uint8_t val; - int rc = i2c_adapter_reg_write(adap, reg, DA9063_REG_PAGE_CON, 0x02); - - if (rc) - return rc; - - /* check set page*/ - rc = i2c_adapter_reg_read(adap, reg, 0x0, &val); - if (rc) - return rc; - - if (val != 0x02) - return SBI_ENODEV; - - /* read and check device id */ - rc = i2c_adapter_reg_read(adap, reg, DA9063_REG_DEVICE_ID, &val); - if (rc) - return rc; - - if (val != PMIC_CHIP_ID_DA9063) - return SBI_ENODEV; - - return 0; -} - -static inline int da9063_stop_watchdog(struct i2c_adapter *adap, uint32_t reg) -{ - uint8_t val; - int rc = i2c_adapter_reg_write(adap, reg, - DA9063_REG_PAGE_CON, 0x00); - - if (rc) - return rc; - - rc = i2c_adapter_reg_read(adap, reg, DA9063_REG_CONTROL_D, &val); - if (rc) - return rc; - - if ((val & DA9063_CONTROL_D_TWDSCALE_MASK) == 0) - return 0; - - val &= ~DA9063_CONTROL_D_TWDSCALE_MASK; - - return i2c_adapter_reg_write(adap, reg, DA9063_REG_CONTROL_D, val); -} - -static inline int da9063_shutdown(struct i2c_adapter *adap, uint32_t reg) -{ - int rc = i2c_adapter_reg_write(adap, reg, - DA9063_REG_PAGE_CON, 0x00); - - if (rc) - return rc; - - return i2c_adapter_reg_write(adap, reg, - DA9063_REG_CONTROL_F, - DA9063_CONTROL_F_SHUTDOWN); -} - -static inline int da9063_reset(struct i2c_adapter *adap, uint32_t reg) -{ - int rc = i2c_adapter_reg_write(adap, reg, - DA9063_REG_PAGE_CON, 0x00); - - if (rc) - return rc; - - rc = i2c_adapter_reg_write(adap, reg, - DA9063_REG_CONTROL_F, - DA9063_CONTROL_F_WAKEUP); - if (rc) - return rc; - - return i2c_adapter_reg_write(adap, reg, - DA9063_REG_CONTROL_A, - DA9063_CONTROL_A_M_POWER1_EN | - DA9063_CONTROL_A_M_POWER_EN | - DA9063_CONTROL_A_STANDBY); -} - -static void da9063_system_reset(u32 type, u32 reason) -{ - struct i2c_adapter *adap = da9063.adapter; - uint32_t reg = da9063.reg; - int rc; - - if (adap) { - /* sanity check */ - rc = da9063_sanity_check(adap, reg); - if (rc) { - sbi_printf("%s: chip is not da9063 PMIC\n", __func__); - goto skip_reset; - } - - switch (type) { - case SBI_SRST_RESET_TYPE_SHUTDOWN: - da9063_shutdown(adap, reg); - break; - case SBI_SRST_RESET_TYPE_COLD_REBOOT: - case SBI_SRST_RESET_TYPE_WARM_REBOOT: - da9063_stop_watchdog(adap, reg); - da9063_reset(adap, reg); - break; - } - } - -skip_reset: - sbi_hart_hang(); -} - -static struct sbi_system_reset_device da9063_reset_i2c = { - .name = "da9063-reset", - .system_reset_check = da9063_system_reset_check, - .system_reset = da9063_system_reset -}; - -static int da9063_reset_init(void *fdt, int nodeoff, - const struct fdt_match *match) -{ - int rc, i2c_bus; - struct i2c_adapter *adapter; - uint64_t addr; - - /* we are dlg,da9063 node */ - rc = fdt_get_node_addr_size(fdt, nodeoff, 0, &addr, NULL); - if (rc) - return rc; - - da9063.reg = addr; - - /* find i2c bus parent node */ - i2c_bus = fdt_parent_offset(fdt, nodeoff); - if (i2c_bus < 0) - return i2c_bus; - - /* i2c adapter get */ - rc = fdt_i2c_adapter_get(fdt, i2c_bus, &adapter); - if (rc) - return rc; - - da9063.adapter = adapter; - - sbi_system_reset_add_device(&da9063_reset_i2c); - - return 0; -} - -static const struct fdt_match da9063_reset_match[] = { - { .compatible = "dlg,da9063", .data = (void *)TRUE }, - { }, -}; - -struct fdt_reset fdt_reset_da9063 = { - .match_table = da9063_reset_match, - .init = da9063_reset_init, -}; - static u64 sifive_fu740_tlbr_flush_limit(const struct fdt_match *match) { /* @@ -233,7 +40,7 @@ static int sifive_fu740_final_init(bool cold_boot, void *fdt = fdt_get_address(); if (cold_boot) { - rc = fdt_reset_driver_init(fdt, &fdt_reset_da9063); + rc = da9063_reset_bind(fdt); if (rc) sbi_printf("%s: failed to find da9063 for reset\n", __func__);