From nobody Fri Oct 10 13:35:26 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 7285C193079; Fri, 13 Jun 2025 13:42:55 +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=1749822176; cv=none; b=eh8TLvUbUwf7+Fu2W1+hKEGg35k+JX30RewihcoeE70903A+vI3y8XFdxsx5Dmx+4mlTwT6CYn1tJeikqK04tch3EMrkEnkCn9bIdRIt4OD1n6aRWP8T0ldP9iZ/V/J2gw4zOPkJdiJ0a46JO+TOIRnTQWTQWf3QgUi2DpjK//U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749822176; c=relaxed/simple; bh=TOEaZuzSUXd+sIGSfBcee2w8UJ6mBNvvMs4YAMDgnM8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=rQ1SMKPJ2KmEGvh/q15q1fC5Vxwc7OKU6itByT7lBplnE/WDIJk2J7QtFdXtslWN0s5GpgNF2jqpml5qTb2WZfcjyflTbTMZWNr666hDwugjujYkyNyyBmbkBFv4D+8EA74JquQ2XworZyE2mwsgd3W31vM/GYb2Okh5Cv4X/D4= 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=LJ+WlqzL; 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="LJ+WlqzL" Received: by mail-pf1-f176.google.com with SMTP id d2e1a72fcca58-747fba9f962so1895633b3a.0; Fri, 13 Jun 2025 06:42:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1749822175; x=1750426975; 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=F+Al+rcEeVomzlpH7id5dsEDyu2Wr5Mn2KS1+UwiDXo=; b=LJ+WlqzLtmEv/6SKQRQ2s1rVwPp/LWnQhth6hhvCHB2rTHg932f8nPqqUU1PFgaV+e /GUGYl/fi/hhb9FBGTfpW06hFnxNRDjr7Pcm59PEGpqJR9nczpyWmGouSkzzS6BIMBhc 4aVFAC+RFI0TQcA1d+DqC3c1ZUY0pW25SEjuxD9yh8KSb6vC40FLrCMaVd8Q1gKGmlRG t/KYqJCdnQ1B2/NRK1aN5uJtYSobWYUQywwHlJIJkl8yIzVSLeQAEwgYIGlxy152J1TU zZrIASkyE0U21YrJeGWjNzel43iR+5uwLJVI2u9pq64ZykjhgvuUcU9k01JVewAVbNhf 2N9Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1749822175; x=1750426975; 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=F+Al+rcEeVomzlpH7id5dsEDyu2Wr5Mn2KS1+UwiDXo=; b=gAg+lrD1Hna3InFJIoxsBMCvFl5zNN1PifrbltOlgN/6q07PXailSMEtSncw1hc+MR dC+EN+T61k0001URpU6nJ71HWMWMCIft7doJLhn+UMOSKc5J9PQU2Zm1im5C8BYup1ho hxxzYHbVmBhyeKBbpAL1r5Ip4/abrciDNpQsJHWChXSjca0o/uiXuYIkNjjpkzfC+Bnu 9/eKVow8mpONK1GMFQC/msV6Vvs1sYt2XlYvysw+kg8hm9V9+NzsMEPmFysPKleRvTdJ IzY13HvVjnTz74K2GaGIr7Wh93s8aNsJFeqzriJFOZe3Mub8F5mBJg7PPr62C0gAKmrG LTng== X-Forwarded-Encrypted: i=1; AJvYcCWLoav7S2/MnywIt2C86pYd6hGLDhN+LxMh1tt9NTVWO/ySDjBOG53OEg55zFZpiHKCuUEjqaVkhMhFa1d5@vger.kernel.org, AJvYcCXzJkhaQzX6e1d5ahnZmfRomRmcGQaHtZl9rSrIzXUTu2zR/6GZtdVJYKC7Q6mlsXYkghNKAwK3UazF@vger.kernel.org X-Gm-Message-State: AOJu0Yzx+WdhxYWai/1BicycJxf697qZnbDjCm0D669TfJQcpXAHPraZ tTtjqtPwNCviqNfx266KrUYRIdw1n87jSA5JpfyrziQiowaLiWlctiqt X-Gm-Gg: ASbGnctPWaG7julZw2DHvVoKZxOU/4R+IU/gbbYdpS17Tpx4CETZfNjhKpq9wWxr0o6 ngChyxc/FOhq7cRxKrZOda6IjWYvwRTZoyl4tzTBcFlhEoBv2WLigY+Ndkrys6o3rOttJ9K4hFY PpjahmhoVNbjQ5Mi4AC8horFEVbh8HfaJfMYof9PEx0QdZUI2coI9ApMG/5s+2Uh3mD+jmrolUt smrndezMNnXu4pZuTLVd140n5olQd645xRCmvkPVrXJGbWG1vcF+Uobx/+fCV42pffZEHFddEaV o4XiJQzyVciSC+SHehXfCfR+G/T9bKMmB3P5IGrt99kOhft8BpuYBO4zhkX4huxF8A3CmGGRQGx 7WxYTSPF/7QGkqajlu1Ai X-Google-Smtp-Source: AGHT+IF+3O9dHtKLsjzYloFYOj0EW9oeTtJ8k/2nzKdctgjYkG5BELXu+krmEMvJIrs8/+n3+N5sIw== X-Received: by 2002:a05:6a00:8b08:b0:742:b9d2:dc8f with SMTP id d2e1a72fcca58-748982ba345mr653458b3a.1.1749822174528; Fri, 13 Jun 2025 06:42:54 -0700 (PDT) Received: from joaog-nb.corp.toradex.com ([67.159.246.222]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-748900b2d8asm1605826b3a.132.2025.06.13.06.42.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 13 Jun 2025 06:42:54 -0700 (PDT) From: =?utf-8?q?Jo=C3=A3o_Paulo_Gon=C3=A7alves?= Date: Fri, 13 Jun 2025 10:42:38 -0300 Subject: [PATCH v4 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: <20250613-b4-amc6821-cooling-device-support-v4-1-a8fc063c55de@toradex.com> References: <20250613-b4-amc6821-cooling-device-support-v4-0-a8fc063c55de@toradex.com> In-Reply-To: <20250613-b4-amc6821-cooling-device-support-v4-0-a8fc063c55de@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 Acked-by: Conor Dooley --- v4: Unchanged v3: https://lore.kernel.org/lkml/20250612-b4-amc6821-cooling-device-support= -v3-0-360681a7652c@toradex.com/ 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 13:35:26 2025 Received: from mail-pf1-f169.google.com (mail-pf1-f169.google.com [209.85.210.169]) (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 5B02C19C55E; Fri, 13 Jun 2025 13:42:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.169 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749822179; cv=none; b=fElW1HBuTELDmaS6J1t8WRenVwLPZxC0sbZ1aMcdpEfbrOHTTSt3JaGNHdJ59JMIGr6s0tXTqFvgbH5q43Ic295w+KF8nqTFmjWp5cUCIF0BAoG+6xR4A4V3wr/bhDYCyN8oaAmDqrAfnodtTvYb0jdYtt1NJyioG0ocbZoLNwU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749822179; c=relaxed/simple; bh=X/nB8WLx7zz4/NBfeOTzqK6Hg2MbKXiI163jTQh1DBs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=WTgZM12CgU7TcwfFfthHAdnuYWVQ/5BG7F/4Sd03e4AbC07vxeN7J30v8eyk/57MGGNGBDbG+tQXuyymofUxNXlZHBVPDarbcbr97tYRFuxcavk8OtVkbpPrgwKBf1cRHDYavoi+oNEqZoT3XnDCnRYWskRkpGDiA/ACKt+8wIM= 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=A9QQTxMR; arc=none smtp.client-ip=209.85.210.169 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="A9QQTxMR" Received: by mail-pf1-f169.google.com with SMTP id d2e1a72fcca58-74801bc6dc5so1732435b3a.1; Fri, 13 Jun 2025 06:42:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1749822178; x=1750426978; 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=d6Y1ZQon7Ei1dxPdOS13fefVnxKxvM6C2HzI9CWHYO4=; b=A9QQTxMRaiTs0BF3IF17wLDIN9iL3NxaF9cD7K9uwjNI+/+AZpH9tsLYdvR2ObLEBN 4hdwBEIR7YDAF2pi+m7Awq7x3E1GesI+zFfzuoU3vISzKkjJ8byKHSYl3jQqXXhdQc/S bI3h5iZZutUhNGt2TQ1uau4huOiMaJVMt2SirXitQGPSrqKDRX+U/cJ9KJ/HsUa2BM6b 2uZbjgVNsiQHYhvvDuLWQKzXZFBBrRFi79oWkxfnIg0m3xUODrAyNnIMz/7JWkx+QBUw XJFAT+0GJR6Z+VSVNMoBMhZklb4rc4A4qH9mQKUhlgvyqa3l7xgpdxVSe/v3cJzTfbPD +zNA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1749822178; x=1750426978; 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=d6Y1ZQon7Ei1dxPdOS13fefVnxKxvM6C2HzI9CWHYO4=; b=q4FLd+oSY48+BFOYN+tD2BrETcOYKrLhFwpzUuL91TNXo6rA7i4+5ipA7uFYcTWHmk EerR42Da7V4UwJVLRFP+z26nQsaFrkUgrKWY/uhzjCA3MJWX6uOpcGuKruLjqYjGK+7M tebQrdWK3RnDgMXeoqE9Tra/Ld0oZpL3tW1KN4vrnCqVYjcJ4Eyj/92D6QLlTMlpX0ux 2jXG8xQK4CSh27eDvfMXqb/weao/4sdFAMOPDZqVHm9+Z07QwPwmgT9aWR7bVqtSQRS/ dr3aIIKa8Blr4KjF2naTu53zYV+3dThb7/YFkkoqTcqz3hi+OT0hD1SBbbP4LmdA4ehP vA9Q== X-Forwarded-Encrypted: i=1; AJvYcCUyaXZz3U0UH3kNZdaT8VqLRmlCk7sUJ+av8DD94oEgHYhHkEc4Es/sqOCkmNoUp0HlKIKrargOMs4f9/HV@vger.kernel.org, AJvYcCX2Q40ZLBwG4cUC7UfIC26r4XCoxyft0n5PzuJvqXL3zW02Wui5nzupgG+1YnAJMNO325IME2YnSY+z@vger.kernel.org X-Gm-Message-State: AOJu0Yyr+/8hgdaInonc82HbMyfaKJZTGHPy999QSoPspmheBfOIj2z9 jti8YVo0jfLMRVgenhkiu6HCXnwbf0XX5ayUcj6jFCEOq+0B/adU/UNZ X-Gm-Gg: ASbGncv1FkzG6LNqB4HyL/F5dIum0axanMQfprV/KYUg3sQkF5TS2/o81hglA8ujnh5 MJns4AImmW6mGZIb89DMOjIIg/um6c/DLxAJ7Nk3WDQvkXtXJQDu7ccRg9eUXeBrlExZqJlpz3V ZquFMpuJTf4YvsYc/PACANK+TRpyGoWL/pDecjbTV+qX1sqg07JzNCfTe74UXSnbVgnnT9Y77/c My6rg+q7i8uWGZm52SWpvTMFs/t5DFx+wpVw3vq1d48ybi2kA0XJXbiFN6H0Kz4+TI1sFs2ZyeC qRqd/a8LISAPblQYYVrE3sOmccCZSyszsoEnWaWJInQ+2kMvOXRKnD7pUKOwCwnqO0Zcey+39nK QUkTHbIYqkYhFPZc4Z/VR X-Google-Smtp-Source: AGHT+IG2MCMgeN0/FLKpk9+/1bFsnlSCRDdiLGKQPQyMkmIj3t0cVzXbZ9nOGNKrFJ+kZbes+D61BA== X-Received: by 2002:a05:6a00:3c89:b0:748:6a12:1b47 with SMTP id d2e1a72fcca58-74898845eb2mr879795b3a.10.1749822177608; Fri, 13 Jun 2025 06:42:57 -0700 (PDT) Received: from joaog-nb.corp.toradex.com ([67.159.246.222]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-748900b2d8asm1605826b3a.132.2025.06.13.06.42.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 13 Jun 2025 06:42:57 -0700 (PDT) From: =?utf-8?q?Jo=C3=A3o_Paulo_Gon=C3=A7alves?= Date: Fri, 13 Jun 2025 10:42:39 -0300 Subject: [PATCH v4 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: <20250613-b4-amc6821-cooling-device-support-v4-2-a8fc063c55de@toradex.com> References: <20250613-b4-amc6821-cooling-device-support-v4-0-a8fc063c55de@toradex.com> In-Reply-To: <20250613-b4-amc6821-cooling-device-support-v4-0-a8fc063c55de@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 --- v4: Unchanged v3: https://lore.kernel.org/lkml/20250612-b4-amc6821-cooling-device-support= -v3-0-360681a7652c@toradex.com/ - 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 13:35:26 2025 Received: from mail-pf1-f171.google.com (mail-pf1-f171.google.com [209.85.210.171]) (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 8FEF122068B; Fri, 13 Jun 2025 13:43:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749822183; cv=none; b=RgXRMwaYVHgS0xRjWOC8wrJZ+fLmWtwbIfI0jc4v2hT1Bfb00Lc17HstoaNeOThOJOZnRxdfae6tGUer8kKD1+/7OdoC0Ab0BHyB2HnmtKzzk5mS5kwjyu1GjVq0H9ltvk82t4uw7u4JY5nqnI0l9s+dKesHTZK71kSBh+G7LEU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749822183; c=relaxed/simple; bh=FG+6pw/Hy+Vh9d4vKITWpmW62t7eU4Oui5u3Rce6lOI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ShPlzboC4dsxAS+eCj4lI72Stjz8lAc3Fa0l/qjb1QWIXOiKU185Q71Gm0IVUTQHh0L+AO73djYExCkN57UqXUUNQJEmPwjn7vHTc27HYgkZ6kcU98ciGDiN43xfH8f09C004lauaC+URw6R5gD3IbGUrLeapgD5Ext9VaDru6A= 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=LEp61zKv; arc=none smtp.client-ip=209.85.210.171 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="LEp61zKv" Received: by mail-pf1-f171.google.com with SMTP id d2e1a72fcca58-7399a2dc13fso2526532b3a.2; Fri, 13 Jun 2025 06:43:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1749822181; x=1750426981; 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=jAtnD418SuWs21ocMxuEndfuEBcj1a9ZJ99bfmYjokU=; b=LEp61zKvpwsXyE9LsCPWdI9f3knC4Z1x582tLDxoKOW/j3EwVMCzDlIGgLjkgwpMSH brmseOdKvG26pZKryzPNiGubLapuHxRlGbKovBdQ1DrGIHE+SZs9TD4T0m+D+ZlsVJpm TR8Q8bC5IkvGjzSQr1JyUhYy+VUG5Mb1AP+bdy7vOa+sQWVj99qEeEAy7sLcPAgJNYW5 ZbB1pkojff1t6QiSQBxaXfjNd/oG/Ye8hCagFel5z8ZYbEE1nQlIe/v9wr10+oTd3l7h zbYTjO8NZ0GQ7H5Jcdx/ZUDQIrNALtOcPlx5TUTz1WIefYkWd4XF4Gv4pB3kaynB/XaW EYvQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1749822181; x=1750426981; 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=jAtnD418SuWs21ocMxuEndfuEBcj1a9ZJ99bfmYjokU=; b=CYBfYAIxXcPOh5zwI8KGWy/1mJibKADEvTOj02vVR/1qa3o9BORrhvNxdL5H18v9/P iiLqObg9wH21m9ISS02Vsz5gk5utjjE0rA6oHq6oIGul6YQHH1sbxMHDo4+Csa08Ydc6 apC1aZRVVR3kJVT2qCh9hKe96BcO+TW6edAlbB3IU1w+4dHbhIL5/8H68gPPeg4XzkVp nfsFuMmye6mYVNDy9SPyL8mJWiIsPLFpNdaGTRqn+NfbhlJTXaskUODhefTsEs2NdWkA zfMVmeU9Zz6+M/yykI/xSixEuMS92omYCExfzohKVQl4P1m3oMfYC1m2JKSM7OR7gjUG zjGw== X-Forwarded-Encrypted: i=1; AJvYcCWPam/AR1r/9NHi30d9pZa3QrO3oyqYzkPIoBZKlsezm3WWzaOPFY4Un4Q1/Kfg5fhJymjIDXs/KOsjWC83@vger.kernel.org, AJvYcCWyTztXMywn51lomKtIAZp7ngMIokZCJfBtRwYk69VVjsNVWhBCfFaoHYmPNOyxY1z8FcBl4ZCnrapm@vger.kernel.org X-Gm-Message-State: AOJu0YwjoBVmQ/Ch6pzhTfe+W9XeP5w9Kfk0pX/Q/WGOCPsarWR/8ATo daOlux7c/DTwU2Hs/BQ9aFcVepaFSGTQ0lvvMYhBUVKRbbp/XjT9bzxC X-Gm-Gg: ASbGnctuRwFTxWmr8zVZbM+3CZ36uohFtIcJns/OKPeKBaJNZSI9ap2ZyezOopFac83 9JRy2plirGre7N0DDuvetPRIkrPK2pVfuVWb8sqRLk5VI+wKIP2eOyWbrSZdJvLtVq1xmaWEXTU WdaAlA71v8uOFYe48QLzTVfrS5FZBqhojP6c36JUUe6kUI5N7xqsUc+bxcO6nQa6vM+0KpsOmgN Re+Xsi6my0gxFrV76YbAxpTUHUeHrBcdIW5zKKK99j/bXStLVeitXeDwP31I+1xGL9eY7nRoMlT wQFj6aqKHCIkpVpQH5/mSxulAnElQPzgYIOCz2YQ3JrP+8k0wGOAS5s1l3tvfRuN9YAKyRTYrLU p7o3s8IIoTMBfo5Zthbnk X-Google-Smtp-Source: AGHT+IGqESe51MKfxljQ0iMGdQIn23lwfA9917DjtSpW/5FeC3+SHQEebgC5JnIZNDUoPE53AfPolA== X-Received: by 2002:a05:6a00:2d06:b0:740:9e87:9625 with SMTP id d2e1a72fcca58-7488f62327bmr4504200b3a.4.1749822180677; Fri, 13 Jun 2025 06:43:00 -0700 (PDT) Received: from joaog-nb.corp.toradex.com ([67.159.246.222]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-748900b2d8asm1605826b3a.132.2025.06.13.06.42.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 13 Jun 2025 06:43:00 -0700 (PDT) From: =?utf-8?q?Jo=C3=A3o_Paulo_Gon=C3=A7alves?= Date: Fri, 13 Jun 2025 10:42:40 -0300 Subject: [PATCH v4 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: <20250613-b4-amc6821-cooling-device-support-v4-3-a8fc063c55de@toradex.com> References: <20250613-b4-amc6821-cooling-device-support-v4-0-a8fc063c55de@toradex.com> In-Reply-To: <20250613-b4-amc6821-cooling-device-support-v4-0-a8fc063c55de@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 --- v4: - Fix uninitialized variable `err` on probe() v3: https://lore.kernel.org/lkml/20250612-b4-amc6821-cooling-device-support= -v3-0-360681a7652c@toradex.com/ - 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 | 116 ++++++++++++++++++++++++++++++++++++++++++++= +--- 1 file changed, 110 insertions(+), 6 deletions(-) diff --git a/drivers/hwmon/amc6821.c b/drivers/hwmon/amc6821.c index 612895db7d8d4096372310c9fa71c103d642dd07..bca33090a93fd745b5c51ec404f= 671d07c2ba43c 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; } @@ -961,8 +1050,12 @@ static int amc6821_probe(struct i2c_client *client) 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); + if (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