From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on sa.local.altlinux.org X-Spam-Level: X-Spam-Status: No, score=-3.4 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,RP_MATCHES_RCVD autolearn=ham autolearn_force=no version=3.4.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=basealt.ru; s=dkim; t=1772188380; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=sPH0SGxkjPJx/pXgbpFZHvPKkYTD4z25AxXrnp0OJyw=; b=SopjuTydHDbh0ODYVHwao5khJNWmHr5EiiyjWdbDIuF56ZCIoj6YbH5K3JpBPUuwz5GNGs ujMnHBp9hSFTAgArysZdwkfDf5F9KXT+ur8bDq5pkg+kkEAj8XR6pvc1sVECjVkykKOqRR 3UIMNTq5L7IBuAFFm0WimeO1CK0FdJ4GdQ/Ale1ueVbo5kW9VL2OOUMXJn6bDqeNT4qJJK l6atUlhmaofEKVPcFoJ9BQQAsYF2t20AJkOM791OSqQsBlsyW0TQPdHLUWBm/MVj5Vfxj3 yGpWWvucp2sfKsv8Sc3gihwP/ukY8OVJrSYTgWPfdRvEZ1QxiTa/bTmlTi8gcg== From: Daniil Gnusarev To: gnusarevda@basealt.ru, devel-kernel@lists.altlinux.org Date: Fri, 27 Feb 2026 14:32:34 +0400 Message-ID: <20260227103236.785736-34-gnusarevda@basealt.ru> X-Mailer: git-send-email 2.42.2 In-Reply-To: <20260227103236.785736-1-gnusarevda@basealt.ru> References: <20260227103236.785736-1-gnusarevda@basealt.ru> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [d-kernel] [PATCH 33/35] hwmon: baikal-pvt: support work on machines with old firmware X-BeenThere: devel-kernel@lists.altlinux.org X-Mailman-Version: 2.1.12 Precedence: list Reply-To: ALT Linux kernel packages development List-Id: ALT Linux kernel packages development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 27 Feb 2026 10:33:36 -0000 Archived-At: List-Archive: List-Post: The first firmware versions used PVT channel indices, while the latest versions have switched to direct addressing. Depending on the presence of the "pvt_id" property in the DTS, the corresponding addressing scheme is used. Also, if the "clock-names" property is missing in the DTS, the value 25000000 / 21 is used instead of determining the operating frequency. SMC32 calls are also used. Signed-off-by: Daniil Gnusarev Do-not-upstream: this is a feature of Baikal-M --- drivers/hwmon/baikal-pvt-core.c | 6 +++--- drivers/hwmon/baikal-pvt.h | 1 + drivers/hwmon/bm1000-pvt-hwmon.c | 11 ++++++++--- include/linux/firmware/baikal/baikal-smc.h | 2 +- 4 files changed, 13 insertions(+), 7 deletions(-) diff --git a/drivers/hwmon/baikal-pvt-core.c b/drivers/hwmon/baikal-pvt-core.c index 7a649b65768f72..2853a841135917 100644 --- a/drivers/hwmon/baikal-pvt-core.c +++ b/drivers/hwmon/baikal-pvt-core.c @@ -556,7 +556,7 @@ static int pvt_write_timeout(struct pvt_hwmon *pvt, long val) rate = clk_get_rate(pvt->clks[PVT_CLOCK_REF].clk); if (!rate) - return -ENODEV; + rate = 25000000 / 21; /* * If alarms are enabled, the requested timeout must be divided @@ -952,8 +952,8 @@ static int pvt_init_iface(struct pvt_hwmon *pvt) rate = clk_get_rate(pvt->clks[PVT_CLOCK_REF].clk); if (!rate) { - dev_err(pvt->dev, "Invalid reference clock rate\n"); - return -ENODEV; + dev_warn(pvt->dev, "Invalid reference clock rate, default value is used\n"); + rate = 25000000 / 21; } /* diff --git a/drivers/hwmon/baikal-pvt.h b/drivers/hwmon/baikal-pvt.h index ca1c786f872dfe..b419f847e67834 100644 --- a/drivers/hwmon/baikal-pvt.h +++ b/drivers/hwmon/baikal-pvt.h @@ -250,6 +250,7 @@ struct pvt_hwmon { struct device *hwmon; void __iomem *regs; + int pvt_id; int irq; struct clk_bulk_data clks[PVT_CLOCK_NUM]; diff --git a/drivers/hwmon/bm1000-pvt-hwmon.c b/drivers/hwmon/bm1000-pvt-hwmon.c index 5b955da5996972..f355fce876037a 100644 --- a/drivers/hwmon/bm1000-pvt-hwmon.c +++ b/drivers/hwmon/bm1000-pvt-hwmon.c @@ -126,6 +126,9 @@ static int baikal_init_pvt(struct pvt_hwmon *pvt) return -ENODEV; pvt->regs = (void __iomem *)res->start; + pvt->pvt_id = -1; + of_property_read_u32(pvt->dev->of_node, "pvt_id", &(pvt->pvt_id)); + return 0; } @@ -133,9 +136,9 @@ static u32 baikal_read_pvt(struct pvt_hwmon *pvt, u32 reg) { struct arm_smccc_res res; - arm_smccc_smc(BAIKAL_SMC_PVT_CMD, PVT_READ, (unsigned long)pvt->regs, + arm_smccc_smc(BAIKAL_SMC_PVT_CMD, PVT_READ, + (pvt->pvt_id >= 0) ? (unsigned long)pvt->pvt_id : (unsigned long)pvt->regs, reg, 0, 0, 0, 0, &res); - return res.a0; } @@ -143,7 +146,8 @@ static int baikal_write_pvt(struct pvt_hwmon *pvt, u32 reg, u32 data) { struct arm_smccc_res res; - arm_smccc_smc(BAIKAL_SMC_PVT_CMD, PVT_WRITE, (unsigned long)pvt->regs, + arm_smccc_smc(BAIKAL_SMC_PVT_CMD, PVT_WRITE, + (pvt->pvt_id >= 0) ? (unsigned long)pvt->pvt_id : (unsigned long)pvt->regs, reg, data, 0, 0, 0, &res); return res.a0; } @@ -183,6 +187,7 @@ static int pvt_probe(struct platform_device *pdev) static const struct of_device_id pvt_of_match[] = { { .compatible = "baikal,bm1000-pvt" }, + { .compatible = "baikal,pvt" }, { } }; MODULE_DEVICE_TABLE(of, pvt_of_match); diff --git a/include/linux/firmware/baikal/baikal-smc.h b/include/linux/firmware/baikal/baikal-smc.h index 648b1e9507de48..1ff7b775975238 100644 --- a/include/linux/firmware/baikal/baikal-smc.h +++ b/include/linux/firmware/baikal/baikal-smc.h @@ -9,7 +9,7 @@ #include #define BAIKALL_SIP_SMC_FAST_CALL_VAL(func_num) \ - ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, ARM_SMCCC_SMC_64, \ + ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, ARM_SMCCC_SMC_32, \ ARM_SMCCC_OWNER_SIP, (func_num)) #define BAIKAL_SMC_CMU_CMD BAIKALL_SIP_SMC_FAST_CALL_VAL(0x0000) -- 2.42.2