From nobody Fri Oct 10 20:57:17 2025 Received: from mail-pl1-f182.google.com (mail-pl1-f182.google.com [209.85.214.182]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 656432BCF43; Thu, 12 Jun 2025 17:28:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749749319; cv=none; b=isylcyxIkGLTScOtfQfTY8FBogLawKfc8OrxFZXe+D1JwRTnRAzs5HG9ilaVgbatdHeJvauXBs7U6oTAxTbT8b9M4va1iVVz92F2dVC/9rRqSyHM7uvHmx+uLJg1fVAlW5F9ov0D28aC8B/MELIS8zS/PGDOqKy9T2hd5gx77QA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749749319; c=relaxed/simple; bh=qy4+z2eCuvdAfpj6qu9T8tb+o+Geo1ztE//E6KOquBo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=gCguPGEtRqx1od01mIKppwa31oOPbBHPFeWkQOEDsE/qSJIQJc0nq6cnmYh21bf4CNCUpXVWgIHPZVMjCBhndcemnGnIptBRqslbDE87iQvNMR427FVw5onFuMuGHJl1Uua2nbfi94KwzUmt/o7HpOSEUxPBTkc1q402SkxFpyU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=grIWrtXa; arc=none smtp.client-ip=209.85.214.182 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="grIWrtXa" Received: by mail-pl1-f182.google.com with SMTP id d9443c01a7336-236377f00easo17580555ad.1; Thu, 12 Jun 2025 10:28:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1749749316; x=1750354116; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=XwCNlpfzkn7qDRn/apDNuOvaF0oDSDJcpIEjdVQwiCY=; b=grIWrtXa5TacbBSpoJOC52fW3qDsJoMjwmFSfDY0huQBHpjz5wSYD86HuoNjWvhY2Z kNP3IMcEeiFyYfSv8qd1LgMYc1Gta7q5EoHvaYzymcY1MGzvmEcuImuAzUqF28HA+bnn ElXlTCMkof/UAbLHq5BXWxO9nE/Y37k2XyatR/AU43FR4qEbKIjpNZwRuIXFqFbIg1t8 nz7quEBvRZbPtiIDaW+LUc6A3AXmp9MxFFOld01glu1yGNaEtIx/2hoaPIl49becEWMP 1uCDZw8KIKKcx9TBOV+KO14o+w9GBTuj8ig4HCc9w2UxBgooctqsYeJNlu1BRnB2aytX 4qFQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1749749316; x=1750354116; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=XwCNlpfzkn7qDRn/apDNuOvaF0oDSDJcpIEjdVQwiCY=; b=KThje05Wl1Bm5rkcVAx/q1d2WOB7LmfIFhL0rIv5Y20jPsMgPxrzrzPfTLuiPAo2y1 n4wL7kZO6EBqabAccqOiHQyRRqq/ZOuYaxpenpN4Xkv1Fk+wWsbYVtm0QnMwgTkPyOXb X1n4ILFVZKSLOIjY2tj9Qc8ZS5kuebhiQpYhFCsfolx9Po9fwRvcklLaa9QN4kgf/TLr RFRpMEDm/FK/pnoAhwG+yhSc8etwPL0EwCFWJh1zAYa+1jdqhiWVF8vWZ43QCIspFn8l JQWsakuccyWvpmLg4D4Iw9d7PGFjXeiDnd6NsBqHWNdewOS5nNixjP3EmW5JjbPjlUWr W1gg== X-Forwarded-Encrypted: i=1; AJvYcCUGfQUO+1bXyujEyn3/ev/aZ1nRNsfOoui/2/wdo2xnAlxqu+y9kyyjyXas41wfUzxQ9lRVIciZNdtR4mei@vger.kernel.org, AJvYcCWKu+lkaUq0jffUsePG8y9pMu2nWaRmmxcoStZLiAPhvvFCbSxcL5aBsrwmOp4gF/F5QzMx6X3hUjL7@vger.kernel.org X-Gm-Message-State: AOJu0YzD4RMEezN0UMsa0C3/UoM9eR6kTUoAytStdfWtg6fQ7DOXKVvQ Kw1U5rfmO28CN2Hvg2hU5gKvROZsoy3eKvhvs7Qgnkq7Puhl20eb6EDO X-Gm-Gg: ASbGnctKeLz1nTEn93unocPPPl5ePrJFs8UQV9hsOFXeIzzwu3fyVIicGgtW3OvQIkq WB0Vnu+uqZ2qZoXm70fq58X1Q0hgR4EoWXUkt0qrB8KTEetf48W0ev2ObQ5TckKiuB6NKfp2LrJ I0jMR7kuAm8nK5kjG6aWKDlmF5cNltKmWeEXshkmQvsLKpLX2RFkywMuOx66+zAtLQuJt3LCYi6 wucE0e+y2XYHxq2o+nqfKcvfCkUHJn5QDJvScDqXFe1sf+bmJRnynEPXOGKTP2x9FkFxYi3zrOu l0i5sk/coKipJmGnMYLq404WPR+emNtyqOUusVR5kIdLNVPhhbkwzYxUsUYI1MSimz2IP2oZMmL UhrCinuj1vKHqYRgYKJNuwEm0gLxtjFg= X-Google-Smtp-Source: AGHT+IFlAK50X5FiPH2h1K9p8IuwqbMs7eXfq8Y0Ooa1zUmgLBMKxjTUsrwf/O1nZUJBwM7rLrDIqA== X-Received: by 2002:a17:903:1b26:b0:235:eefe:68f4 with SMTP id d9443c01a7336-2364ca49931mr57691425ad.29.1749749316556; Thu, 12 Jun 2025 10:28:36 -0700 (PDT) Received: from joaog-nb.corp.toradex.com ([67.159.246.222]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-b2fd6362e28sm1665891a12.66.2025.06.12.10.28.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 12 Jun 2025 10:28:36 -0700 (PDT) From: =?utf-8?q?Jo=C3=A3o_Paulo_Gon=C3=A7alves?= Date: Thu, 12 Jun 2025 14:28:08 -0300 Subject: [PATCH v3 1/3] dt-bindings: hwmon: amc6821: Add cooling levels Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250612-b4-amc6821-cooling-device-support-v3-1-360681a7652c@toradex.com> References: <20250612-b4-amc6821-cooling-device-support-v3-0-360681a7652c@toradex.com> In-Reply-To: <20250612-b4-amc6821-cooling-device-support-v3-0-360681a7652c@toradex.com> To: Jean Delvare , Guenter Roeck , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Farouk Bouabid , Quentin Schulz Cc: linux-hwmon@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, =?utf-8?q?Jo=C3=A3o_Paulo_Gon=C3=A7alves?= X-Mailer: b4 0.14.2 From: Jo=C3=A3o Paulo Gon=C3=A7alves The fan can be used as a cooling device, add a description of the `cooling-levels` property and restrict the maximum value to 255, which is the highest PWM duty cycle supported by the AMC6821 fan controller. Signed-off-by: Jo=C3=A3o Paulo Gon=C3=A7alves --- v3: Unchanged v2: https://lore.kernel.org/lkml/20250603-b4-amc6821-cooling-device-support= -v2-0-74943c889a2d@toradex.com/ v1: https://lore.kernel.org/lkml/20250530-b4-v1-amc6821-cooling-device-supp= ort-b4-v1-0-7bb98496c969@toradex.com/ --- Documentation/devicetree/bindings/hwmon/ti,amc6821.yaml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Documentation/devicetree/bindings/hwmon/ti,amc6821.yaml b/Docu= mentation/devicetree/bindings/hwmon/ti,amc6821.yaml index 9ca7356760a74b1ab5e6c5a4966ba30f050a1eed..eb00756988be158b104642707d9= 6e371930c9fd7 100644 --- a/Documentation/devicetree/bindings/hwmon/ti,amc6821.yaml +++ b/Documentation/devicetree/bindings/hwmon/ti,amc6821.yaml @@ -32,6 +32,12 @@ properties: $ref: fan-common.yaml# unevaluatedProperties: false =20 + properties: + cooling-levels: + description: PWM duty cycle values corresponding to thermal coolin= g states. + items: + maximum: 255 + "#pwm-cells": const: 2 description: | --=20 2.43.0 From nobody Fri Oct 10 20:57:17 2025 Received: from mail-pf1-f176.google.com (mail-pf1-f176.google.com [209.85.210.176]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4FD9C29B8C7; Thu, 12 Jun 2025 17:28:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749749325; cv=none; b=L76dolipedkDUMQvWzX74KICJ5qXQFtsMAtCZL3Lng91wZV7X0uzEiUZ9L8jel4bFJQkzpz/8eOKn2R4AdSM43zBEpK1bjLjlVdBL24uFrdHm1fobt2DLkHgwgCrOoqep7C17h3bqcBXPxX+nD4pFDeRTUFbpuDQD8BXoQw43iE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749749325; c=relaxed/simple; bh=+XwTpQpsyBzCtMnqJ7LepVkLlvQgjzcUOIXHNpHa6Yc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=LwSLyU+W1VdQHOG6bxc4jvSUs+zthOjMJ5PaxXImBYxjgl/gJYL4U7euUZtWfWeuUXdGlrUCnIGLwuW66xgWZGwXw3deTROwQICjZWGWRJ0qV0wApCLDnQDtF8xNE4YgW79jBJVDLn4gVtc+mbrkQueWodpEFX5BADqihf4fx4U= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=JN7+VJ2Z; arc=none smtp.client-ip=209.85.210.176 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="JN7+VJ2Z" Received: by mail-pf1-f176.google.com with SMTP id d2e1a72fcca58-742c46611b6so1481713b3a.1; Thu, 12 Jun 2025 10:28:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1749749321; x=1750354121; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=NAiocoSvj6K/palouwV8t5u5i0cthUdH+QFCjgdRxdU=; b=JN7+VJ2Z6Cgrkbm2sWIiAVoq88uZQvlKEXoRvexnJag0abvL+qVeKB42LkEUZKmBRg TA1jyP6TgZtY+uZkZvGF0YY3dU7ax3cZvU5dBsVVyWL1RNIJ9fQDrMX+86scJwBOr3RN wA5FRIiLS/ze1ChJX8mXq7ae/8WE0jTEBO16HPqOIuQ2FjCJgPkCAh1sCXrFUUxiayEr YjO1d7I+MPdYEYgnvl3yzyYtiJ/YLmJuXglmlvMi5n5XegoQ7689JreqgjdhC/2ijKzQ J7MwWyhH1qZZ37YYhlHvANEuzDnibORA/8aqXf0/pOHKqUygBHKhufuCPs7kHhPsLzJx l3Eg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1749749321; x=1750354121; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=NAiocoSvj6K/palouwV8t5u5i0cthUdH+QFCjgdRxdU=; b=YCNnOLeO143odrpjY1dPsL+HAaFc2uAEeNr1f2r4jxdP9hQ/iy1Wz3JfehWK/nEG5Y ph7zmCRdsQTGFdz1YZIoXMo3BIgh5IpUeHh62cw169B2O3XKs9MPJC5aoaAYhZ8+rfwC ciAMwfszrFa/OhVERVc1TzX9vqwQCr+uInujPnD8s/KYQccE0TTHx6QF3hCs49ccVmt3 wtOY6+jILwNuIKDcxeD7hkCpD1QMkMhQe19MsiF6vHCC8M08/Q+RKOiAjJBDexkn8lkW aOw5HT9fhhIN8JtlEqsl56GfS7H82GIOHDT1Kiy3xER2EP/2l2aoWWbuAeqt8REL/QqS I3zA== X-Forwarded-Encrypted: i=1; AJvYcCW8amWDMJPuj36hn+H0v83l9W8l3tp8PVTMebTX8nFW5U/wxjkrgcJAa6CDMGZYXno6a6u+1+9mksz2@vger.kernel.org, AJvYcCXxx36Xj5K8hg7pLN7tnzBDh/iXhUCxUdkw8kxgkaLgNFudXwliI7dmiqy5gW/sUSislG6JIRQ74fkTXis+@vger.kernel.org X-Gm-Message-State: AOJu0YzOASbYrTZ9Tw5l5sZI/UC3Ok2d89vmCnZ9pYKBrTzcEljPj66T iw/VecKKJiXHEjOlaf8jXi7GLdTZ+bvGM2L31PuKGdG+h9h3BOlMAfJS X-Gm-Gg: ASbGnctS0Xd/s7boZNUsTwtLyDGLaOzMeFi5aflpHgqhaFC2ZJwJVbiWwkpsMl0GidN 0x1zv14uEE7ht53yNDurBgiKKgR+op3qb2bakvySl9rJcBkC74QQy4I/NqRgKoy0ljcPPtk7AFS 8jYzy2lUASrNOrZPtcA8zrhULUifmHcjub72QHE+KtQdObxn+4WUsjR78VVTWFHmLF7G+apz6CY Y5G2h275tgphDtvyRxiswFOGssF/+ALE7FbMI1zX/o5kORGqlF4l7axbsjdlv1/UGrG3Pz9F6vI qQjwh7XXkV1BXUKofyeJbkBXiECUJw2gPpCeLD2jadtDoBndOKloLWqvMHIsOUww2CsjbslD/7C hUBvdLV/q6sUhttksDZ2H X-Google-Smtp-Source: AGHT+IGhvmvmwHtFXNI/TFKTh/f+nkQSfssbJsX/a2IkGQJBc8XIAd1a0VsUBpyD2FsFGeyyRvdPJQ== X-Received: by 2002:a05:6a00:b87:b0:747:bd28:1ca1 with SMTP id d2e1a72fcca58-7488f6230admr213099b3a.3.1749749321434; Thu, 12 Jun 2025 10:28:41 -0700 (PDT) Received: from joaog-nb.corp.toradex.com ([67.159.246.222]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-b2fd6362e28sm1665891a12.66.2025.06.12.10.28.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 12 Jun 2025 10:28:40 -0700 (PDT) From: =?utf-8?q?Jo=C3=A3o_Paulo_Gon=C3=A7alves?= Date: Thu, 12 Jun 2025 14:28:09 -0300 Subject: [PATCH v3 2/3] hwmon: (amc6821) Move reading fan data from OF to a function Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250612-b4-amc6821-cooling-device-support-v3-2-360681a7652c@toradex.com> References: <20250612-b4-amc6821-cooling-device-support-v3-0-360681a7652c@toradex.com> In-Reply-To: <20250612-b4-amc6821-cooling-device-support-v3-0-360681a7652c@toradex.com> To: Jean Delvare , Guenter Roeck , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Farouk Bouabid , Quentin Schulz Cc: linux-hwmon@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, =?utf-8?q?Jo=C3=A3o_Paulo_Gon=C3=A7alves?= X-Mailer: b4 0.14.2 From: Jo=C3=A3o Paulo Gon=C3=A7alves Move fan property reading from OF to a separate function. This keeps OF data handling separate from the code logic and makes it easier to add features like cooling device support that use the same fan node. Signed-off-by: Jo=C3=A3o Paulo Gon=C3=A7alves --- v3: - Change call to of_node_put() on fan node to be scope based v2: https://lore.kernel.org/lkml/20250603-b4-amc6821-cooling-device-support= -v2-0-74943c889a2d@toradex.com/ - Remove devm_action on release and call of_node_put() manually - Change of_pwm_polarity to store resulting pwm polarity on driver private = data v1: https://lore.kernel.org/lkml/20250530-b4-v1-amc6821-cooling-device-supp= ort-b4-v1-0-7bb98496c969@toradex.com/ --- drivers/hwmon/amc6821.c | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/drivers/hwmon/amc6821.c b/drivers/hwmon/amc6821.c index 13a789cc85d24da282430eb2d4edf0003617fe6b..612895db7d8d4096372310c9fa7= 1c103d642dd07 100644 --- a/drivers/hwmon/amc6821.c +++ b/drivers/hwmon/amc6821.c @@ -126,6 +126,7 @@ module_param(init, int, 0444); struct amc6821_data { struct regmap *regmap; struct mutex update_lock; + enum pwm_polarity pwm_polarity; }; =20 /* @@ -848,11 +849,11 @@ static int amc6821_detect(struct i2c_client *client, = struct i2c_board_info *info return 0; } =20 -static enum pwm_polarity amc6821_pwm_polarity(struct i2c_client *client) +static enum pwm_polarity amc6821_pwm_polarity(struct i2c_client *client, + struct device_node *fan_np) { enum pwm_polarity polarity =3D PWM_POLARITY_NORMAL; struct of_phandle_args args; - struct device_node *fan_np; =20 /* * For backward compatibility, the pwminv module parameter takes @@ -863,10 +864,6 @@ static enum pwm_polarity amc6821_pwm_polarity(struct i= 2c_client *client) if (pwminv > 0) return PWM_POLARITY_INVERSED; =20 - fan_np =3D of_get_child_by_name(client->dev.of_node, "fan"); - if (!fan_np) - return PWM_POLARITY_NORMAL; - if (of_parse_phandle_with_args(fan_np, "pwms", "#pwm-cells", 0, &args)) goto out; of_node_put(args.np); @@ -877,10 +874,16 @@ static enum pwm_polarity amc6821_pwm_polarity(struct = i2c_client *client) if (args.args[1] & PWM_POLARITY_INVERTED) polarity =3D PWM_POLARITY_INVERSED; out: - of_node_put(fan_np); return polarity; } =20 +static void amc6821_of_fan_read_data(struct i2c_client *client, + struct amc6821_data *data, + struct device_node *fan_np) +{ + data->pwm_polarity =3D amc6821_pwm_polarity(client, fan_np); +} + static int amc6821_init_client(struct i2c_client *client, struct amc6821_d= ata *data) { struct regmap *regmap =3D data->regmap; @@ -902,7 +905,7 @@ static int amc6821_init_client(struct i2c_client *clien= t, struct amc6821_data *d return err; =20 regval =3D AMC6821_CONF1_START; - if (amc6821_pwm_polarity(client) =3D=3D PWM_POLARITY_INVERSED) + if (data->pwm_polarity =3D=3D PWM_POLARITY_INVERSED) regval |=3D AMC6821_CONF1_PWMINV; =20 err =3D regmap_update_bits(regmap, AMC6821_REG_CONF1, @@ -944,6 +947,7 @@ static int amc6821_probe(struct i2c_client *client) struct amc6821_data *data; struct device *hwmon_dev; struct regmap *regmap; + struct device_node *fan_np __free(device_node) =3D NULL; int err; =20 data =3D devm_kzalloc(dev, sizeof(struct amc6821_data), GFP_KERNEL); @@ -956,6 +960,10 @@ static int amc6821_probe(struct i2c_client *client) "Failed to initialize regmap\n"); data->regmap =3D regmap; =20 + fan_np =3D of_get_child_by_name(dev->of_node, "fan"); + if (fan_np) + amc6821_of_fan_read_data(client, data, fan_np); + err =3D amc6821_init_client(client, data); if (err) return err; --=20 2.43.0 From nobody Fri Oct 10 20:57:17 2025 Received: from mail-pg1-f175.google.com (mail-pg1-f175.google.com [209.85.215.175]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2200A2BDC00; Thu, 12 Jun 2025 17:28:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749749327; cv=none; b=CNHl6dyJBWNOV9eTO7YxnuBB4lqRY3D2zaVYuXNt+kczjXeFU4RhQMNLbx/yoW/ZgZPVbdPbKXY3RF3VR0LKf/FJJURVAfZUJjyAP0sw+sxyrA27C+Om2kc4gd9zWbg/wfQWodXRsaltPxkhipHfl5A/HnYVLZIjVV6fDnr0Gg4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749749327; c=relaxed/simple; bh=AozvK/5U+6wBXRp41xZyaThogAWf0PSIUKgwcAN2z2g=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=YQa92bQ7G1dvmUGxURGaBNHPeiZong7j2dbeYonI3UtFRFjOkb1yEM2Fzlfj+/w25s5jJF63sMeaNp+87Eo3cnDkBczIQHeaKCyTGMptz54gyjcrCLa5lacLB9bj5A+cWaxaF8luAkyX3s23GbwoSozpysFeq4I8ZZmVK3u+7sQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Obw8W6sE; arc=none smtp.client-ip=209.85.215.175 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Obw8W6sE" Received: by mail-pg1-f175.google.com with SMTP id 41be03b00d2f7-b26f5f47ba1so1064665a12.1; Thu, 12 Jun 2025 10:28:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1749749325; x=1750354125; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=UmuUO8nQoY3c7DRNnxZ7kn0ESbqmdfBPxrOAUf2SnQg=; b=Obw8W6sEKB6tlBCBbHT84FpdFxrkJ/282T7flXfuDRjQbRiVoGxsRNIpygJQAoU/Dd WwlrgY8gEHhTfnvNhd4Ag8hRcmz/f5HEWMkxCIyjAPVCXy9SGOKjXjxY/CxzLImRbIK6 u0rnxHa2DaL1jFRbvCy3JxIu+pXkCPnWONhUQnsHkxdWza0hM4Fg80zyn0Q3cr5ramJK duKj+ZFHgUi38eCfX14o2QIxDyobpiIoopjmoIU7AtPX44KT1dMc0+BUoGPfKLOqDVg8 M9D+tiW+53UegtfVM37SDqz7MsxQcoucn2FnYnVfnxEzUiasPWqGfQB/y1suwuleRcwz VyOg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1749749325; x=1750354125; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=UmuUO8nQoY3c7DRNnxZ7kn0ESbqmdfBPxrOAUf2SnQg=; b=eAG10S0cnxwbBHmVVqFvwkjnQY1rWgyzwkdb4CD7DjHbm2+ov5c7Bmf7N4Ked0tf+8 9ctIgEPnl6gb5EfP4bF9HwJMCAcNNza0oN2oMPeW6Jcbi7Sw7FZmfXfeBNP2AmimbjpO qPCovezPSjnl0qD9h5+grzJazr5ZFEWLGkQ5H01uyUMq7mUY9xipdeiNPhc/EYg3Mg6d wqmAIHsbCappx4lXjg3egG+h7AE5l2/x53nPIuMdlChMZB7yr9Xu6Bh1BLJtCftKpVbS 7GAKAEB3KQCoi+GICClNq3psBLqMc5bkUY0t/Ppkts3QWAipXRDXcOgIV/t1L4o93+Ux kvQQ== X-Forwarded-Encrypted: i=1; AJvYcCVK7tNxErugodUDPEGxjNXFWuxOdjAVPdpcbVfdXO4yZNyYRCU5T7SAp5PB+lBqxBo6O8AVoYKD09JHfMjz@vger.kernel.org, AJvYcCWY/Ow7pE8N13RLMlFvoSFOkEHHubqFJ7LKjJKjcYF5823g9w585VLctmVqaQOdfqkPidD7shEeqZZe@vger.kernel.org X-Gm-Message-State: AOJu0Ywlr4il3Lk3HD9Y4zh4YOwHl+p0KIj7kukmTkbRSsc2rh9zzJ3T 9R+LJIpxLslw5S9VXCgNQdII1mh/BKTIqlu0KAb6sV40Db4cdP9tHPgY X-Gm-Gg: ASbGnctb8OOJZxyA7HrpCx+Cg3zU9XreB2o/vAdCB9DNKwa3cIMy72/pebD7i9ecyCY 9pq1rqG8gGfl7dBCERNFRxcJ95CTfKS7j85svJeItA/0fgCIo8sCbZ5yIUDbaZ4jI4+MGIE6Gyj 2NbLJJmGoqx6IPBpdKgnojPSmJ+wuaP3PXd5JM8QlvtofXuOpBKpwkmywELOk82VpW23Suk3ipp hW0Yix4A0GZBD5fRf7ag0RiQW+iLid6ty+V7b3+0VquC5XhIj0HWM9SuZCFdCWNLeXf9xNHSx49 wRdsLfwRBYLVso0DUkNWwySwXtUuhlfwPy9cip8vzQsen/WTSHohnm2SYHpw/C6bP0BuGJExJgn ANZJdg+nTcuktNSBQ0LSm X-Google-Smtp-Source: AGHT+IGD0uYZhWH0OKCohG5z9EZ68VQHAMQbmcy/0Ff19PH2tXQ5aYKeM50xbHDWiR90sfEGEIPptQ== X-Received: by 2002:a05:6a20:9e4d:b0:218:bcbf:52f9 with SMTP id adf61e73a8af0-21f978f4abcmr6132869637.42.1749749325294; Thu, 12 Jun 2025 10:28:45 -0700 (PDT) Received: from joaog-nb.corp.toradex.com ([67.159.246.222]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-b2fd6362e28sm1665891a12.66.2025.06.12.10.28.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 12 Jun 2025 10:28:44 -0700 (PDT) From: =?utf-8?q?Jo=C3=A3o_Paulo_Gon=C3=A7alves?= Date: Thu, 12 Jun 2025 14:28:10 -0300 Subject: [PATCH v3 3/3] hwmon: (amc6821) Add cooling device support Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250612-b4-amc6821-cooling-device-support-v3-3-360681a7652c@toradex.com> References: <20250612-b4-amc6821-cooling-device-support-v3-0-360681a7652c@toradex.com> In-Reply-To: <20250612-b4-amc6821-cooling-device-support-v3-0-360681a7652c@toradex.com> To: Jean Delvare , Guenter Roeck , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Farouk Bouabid , Quentin Schulz Cc: linux-hwmon@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, =?utf-8?q?Jo=C3=A3o_Paulo_Gon=C3=A7alves?= X-Mailer: b4 0.14.2 From: Jo=C3=A3o Paulo Gon=C3=A7alves Add support for using the AMC6821 as a cooling device. The AMC6821 registers with the thermal framework only if the `cooling-levels` property is present in the fan device tree child node. If this property is present, the driver assumes the fan will operate in open-loop, and the kernel will control it directly. In this case, the driver will change the AMC6821 mode to manual (software DCY) and set the initial PWM duty cycle to the maximum fan cooling state level as defined in the DT. It is worth mentioning that the cooling device is registered on the child fan node, not on the fan controller node. Existing behavior is unchanged, so the AMC6821 can still be used without the thermal framework (hwmon only). Signed-off-by: Jo=C3=A3o Paulo Gon=C3=A7alves --- v3: - Fix using fan node after of_node_put() - Add setting the pwm duty cycle to max fan cooling state level on initialization v2: https://lore.kernel.org/lkml/20250603-b4-amc6821-cooling-device-support= -v2-0-74943c889a2d@toradex.com/ v1: https://lore.kernel.org/lkml/20250530-b4-v1-amc6821-cooling-device-supp= ort-b4-v1-0-7bb98496c969@toradex.com/ --- drivers/hwmon/amc6821.c | 114 ++++++++++++++++++++++++++++++++++++++++++++= +--- 1 file changed, 109 insertions(+), 5 deletions(-) diff --git a/drivers/hwmon/amc6821.c b/drivers/hwmon/amc6821.c index 612895db7d8d4096372310c9fa71c103d642dd07..143a2d6a5593f462a456c5d9a9d= ad0e97fa73ab5 100644 --- a/drivers/hwmon/amc6821.c +++ b/drivers/hwmon/amc6821.c @@ -26,6 +26,7 @@ #include #include #include +#include =20 #include =20 @@ -126,6 +127,9 @@ module_param(init, int, 0444); struct amc6821_data { struct regmap *regmap; struct mutex update_lock; + unsigned long fan_state; + unsigned long fan_max_state; + unsigned int *fan_cooling_levels; enum pwm_polarity pwm_polarity; }; =20 @@ -805,6 +809,65 @@ static const struct hwmon_chip_info amc6821_chip_info = =3D { .info =3D amc6821_info, }; =20 +static int amc6821_set_sw_dcy(struct amc6821_data *data, u8 duty_cycle) +{ + int ret; + + ret =3D regmap_write(data->regmap, AMC6821_REG_DCY, duty_cycle); + if (ret) + return ret; + + return regmap_update_bits(data->regmap, AMC6821_REG_CONF1, + AMC6821_CONF1_FDRC0 | AMC6821_CONF1_FDRC1, 0); +} + +static int amc6821_get_max_state(struct thermal_cooling_device *cdev, unsi= gned long *state) +{ + struct amc6821_data *data =3D cdev->devdata; + + if (!data) + return -EINVAL; + + *state =3D data->fan_max_state; + + return 0; +} + +static int amc6821_get_cur_state(struct thermal_cooling_device *cdev, unsi= gned long *state) +{ + struct amc6821_data *data =3D cdev->devdata; + + if (!data) + return -EINVAL; + + *state =3D data->fan_state; + + return 0; +} + +static int amc6821_set_cur_state(struct thermal_cooling_device *cdev, unsi= gned long state) +{ + struct amc6821_data *data =3D cdev->devdata; + int ret; + + if (!data || state > data->fan_max_state) + return -EINVAL; + + ret =3D amc6821_set_sw_dcy(data, data->fan_cooling_levels[state]); + if (ret) + return ret; + + data->fan_state =3D state; + + return 0; +} + +static const struct thermal_cooling_device_ops amc6821_cooling_ops =3D { + .get_max_state =3D amc6821_get_max_state, + .get_cur_state =3D amc6821_get_cur_state, + .set_cur_state =3D amc6821_set_cur_state, +}; + /* Return 0 if detection is successful, -ENODEV otherwise */ static int amc6821_detect(struct i2c_client *client, struct i2c_board_info= *info) { @@ -877,11 +940,29 @@ static enum pwm_polarity amc6821_pwm_polarity(struct = i2c_client *client, return polarity; } =20 -static void amc6821_of_fan_read_data(struct i2c_client *client, - struct amc6821_data *data, - struct device_node *fan_np) +static int amc6821_of_fan_read_data(struct i2c_client *client, + struct amc6821_data *data, + struct device_node *fan_np) { + int num; + data->pwm_polarity =3D amc6821_pwm_polarity(client, fan_np); + + num =3D of_property_count_u32_elems(fan_np, "cooling-levels"); + if (num <=3D 0) + return 0; + + data->fan_max_state =3D num - 1; + + data->fan_cooling_levels =3D devm_kcalloc(&client->dev, num, + sizeof(u32), + GFP_KERNEL); + + if (!data->fan_cooling_levels) + return -ENOMEM; + + return of_property_read_u32_array(fan_np, "cooling-levels", + data->fan_cooling_levels, num); } =20 static int amc6821_init_client(struct i2c_client *client, struct amc6821_d= ata *data) @@ -914,6 +995,14 @@ static int amc6821_init_client(struct i2c_client *clie= nt, struct amc6821_data *d regval); if (err) return err; + + /* Software DCY-control mode with fan enabled when cooling-levels presen= t */ + if (data->fan_cooling_levels) { + err =3D amc6821_set_sw_dcy(data, + data->fan_cooling_levels[data->fan_max_state]); + if (err) + return err; + } } return 0; } @@ -962,7 +1051,11 @@ static int amc6821_probe(struct i2c_client *client) =20 fan_np =3D of_get_child_by_name(dev->of_node, "fan"); if (fan_np) - amc6821_of_fan_read_data(client, data, fan_np); + err =3D amc6821_of_fan_read_data(client, data, fan_np); + + if (err) + return dev_err_probe(dev, err, + "Failed to read fan device tree data\n"); =20 err =3D amc6821_init_client(client, data); if (err) @@ -978,7 +1071,18 @@ static int amc6821_probe(struct i2c_client *client) hwmon_dev =3D devm_hwmon_device_register_with_info(dev, client->name, data, &amc6821_chip_info, amc6821_groups); - return PTR_ERR_OR_ZERO(hwmon_dev); + if (IS_ERR(hwmon_dev)) + return dev_err_probe(dev, PTR_ERR(hwmon_dev), + "Failed to initialize hwmon\n"); + + if (IS_ENABLED(CONFIG_THERMAL) && fan_np && data->fan_cooling_levels) + return PTR_ERR_OR_ZERO(devm_thermal_of_cooling_device_register(dev, + fan_np, + client->name, + data, + &amc6821_cooling_ops)); + + return 0; } =20 static const struct i2c_device_id amc6821_id[] =3D { --=20 2.43.0