From nobody Tue Apr 7 14:06:31 2026 Received: from courrier.aliel.fr (courrier.aliel.fr [65.21.61.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 57CEF3CEB84; Fri, 3 Apr 2026 16:09:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=65.21.61.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775232569; cv=none; b=UAaOH4olFdiMgdwDrVZCMlhEcEUhZn09DjLHmLwciTGhmXF7z8v1GYP0MhLxlbF6Uk6lc8Vnq9e0+gsmW+tVNRwOEghEjTw/8CEomQJ9CCxj6nf9z/0+xVxEoLlPmkl1fxvwJZgbRRG2aI7hu8pF0GIC+GpxdNDfbpQWe3zLFTQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775232569; c=relaxed/simple; bh=J2SoalosCyxImvGFu5R4J5FtFH7pMqPC3RBWKZVsADo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=O86LkqPCvB65w3/IJ2X3MSgsuFugBr4e4GSFjOmdkjGknkXItlJ2rCcLf4ZGlmyE4+dVt0Xgvmt+XZ4YOLGUrHPp0jf6L8zQcJJk+xUVepT/22fCsi3vw2p8Puq+D6wFXTfZ1AS1Z04F9Hrq2RCT4Va5o/UrOdoSww5COJW/8Ls= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=aliel.fr; spf=pass smtp.mailfrom=aliel.fr; dkim=pass (1024-bit key) header.d=aliel.fr header.i=@aliel.fr header.b=EUSknzW6; arc=none smtp.client-ip=65.21.61.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=aliel.fr Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=aliel.fr Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=aliel.fr header.i=@aliel.fr header.b="EUSknzW6" From: Ronald Claveau DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=aliel.fr; s=courrier-s1; t=1775232560; bh=J2SoalosCyxImvGFu5R4J5FtFH7pMqPC3RBWKZVsADo=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=EUSknzW6QXDFBYi2M6ZqAl4SVbok284Y2Y48z/7aUBxPgf4Wpt3v5SPa+HbN7rpAL WLGiXGrBZ6X60yVoUYMxcDSv7r2UdRJMBp69j74ROe1H5U2LKzKOLdGzrlQcwXe0DL c+A9m97tM5uv7aU3VCXXjAr06SfFnq444i9f2uco= Date: Fri, 03 Apr 2026 18:08:38 +0200 Subject: [PATCH v2 5/8] thermal: khadas-mcu-fan: Add fan config from platform data Add regulator 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: <20260403-add-mcu-fan-khadas-vim4-v2-5-70536b22439a@aliel.fr> References: <20260403-add-mcu-fan-khadas-vim4-v2-0-70536b22439a@aliel.fr> In-Reply-To: <20260403-add-mcu-fan-khadas-vim4-v2-0-70536b22439a@aliel.fr> To: Neil Armstrong , Lee Jones , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Andi Shyti , Kevin Hilman , Jerome Brunet , Martin Blumenstingl , Beniamino Galvani , "Rafael J. Wysocki" , Daniel Lezcano , Zhang Rui , Lukasz Luba , Liam Girdwood , Mark Brown Cc: linux-amlogic@lists.infradead.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-i2c@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-pm@vger.kernel.org, Ronald Claveau X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openssh-sha256; t=1775232552; l=3477; i=linux-kernel-dev@aliel.fr; s=id_ed25519; h=from:subject:message-id; bh=J2SoalosCyxImvGFu5R4J5FtFH7pMqPC3RBWKZVsADo=; b=U1NIU0lHAAAAAQAAADMAAAALc3NoLWVkMjU1MTkAAAAgMGec55oxeeisqykQiUedekMYyOnR9 BG9E/7rDWyqdNoAAAAGcGF0YXR0AAAAAAAAAAZzaGE1MTIAAABTAAAAC3NzaC1lZDI1NTE5AAAA QEFj0nfFG83jnBBd60nayCy9VVofB4EIdNwOIGL1JZxdO4sU2taPxbmzNMnLl+Iy7VzNGFGRYEq v3kniuehwGQI= X-Developer-Key: i=linux-kernel-dev@aliel.fr; a=openssh; fpr=SHA256:kch4osYZ6A1BrPps5AUs6KnfdE2wm4ocMtyTc8TmZMs Replace the hardcoded MAX_LEVEL constant and fan register with values read from platform_data (fan_reg, max_level), as new MCUs need different values. Optionally acquire and enable a "fan" regulator supply at probe time and on resume, so boards that gate fan power through a regulator are handled. Signed-off-by: Ronald Claveau --- drivers/thermal/khadas_mcu_fan.c | 49 +++++++++++++++++++++++++++++++++++-= ---- 1 file changed, 43 insertions(+), 6 deletions(-) diff --git a/drivers/thermal/khadas_mcu_fan.c b/drivers/thermal/khadas_mcu_= fan.c index d35e5313bea41..24559bf65de46 100644 --- a/drivers/thermal/khadas_mcu_fan.c +++ b/drivers/thermal/khadas_mcu_fan.c @@ -13,13 +13,15 @@ #include #include #include - -#define MAX_LEVEL 3 +#include =20 struct khadas_mcu_fan_ctx { struct khadas_mcu *mcu; + unsigned int fan_reg; unsigned int level; + unsigned int max_level; struct thermal_cooling_device *cdev; + struct regulator *power; }; =20 static int khadas_mcu_fan_set_level(struct khadas_mcu_fan_ctx *ctx, @@ -27,8 +29,7 @@ static int khadas_mcu_fan_set_level(struct khadas_mcu_fan= _ctx *ctx, { int ret; =20 - ret =3D regmap_write(ctx->mcu->regmap, KHADAS_MCU_CMD_FAN_STATUS_CTRL_REG, - level); + ret =3D regmap_write(ctx->mcu->regmap, ctx->fan_reg, level); if (ret) return ret; =20 @@ -40,7 +41,9 @@ static int khadas_mcu_fan_set_level(struct khadas_mcu_fan= _ctx *ctx, static int khadas_mcu_fan_get_max_state(struct thermal_cooling_device *cde= v, unsigned long *state) { - *state =3D MAX_LEVEL; + struct khadas_mcu_fan_ctx *ctx =3D cdev->devdata; + + *state =3D ctx->max_level; =20 return 0; } @@ -61,7 +64,7 @@ khadas_mcu_fan_set_cur_state(struct thermal_cooling_devic= e *cdev, { struct khadas_mcu_fan_ctx *ctx =3D cdev->devdata; =20 - if (state > MAX_LEVEL) + if (state > ctx->max_level) return -EINVAL; =20 if (state =3D=3D ctx->level) @@ -83,11 +86,32 @@ static int khadas_mcu_fan_probe(struct platform_device = *pdev) struct device *dev =3D &pdev->dev; struct khadas_mcu_fan_ctx *ctx; int ret; + const struct khadas_mcu_fan_pdata *pdata =3D dev_get_platdata(&pdev->dev); =20 ctx =3D devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL); if (!ctx) return -ENOMEM; + ctx->mcu =3D mcu; + ctx->fan_reg =3D pdata->fan_reg; + ctx->max_level =3D pdata->max_level; + + ctx->power =3D devm_regulator_get_optional(dev->parent, "fan"); + if (IS_ERR(ctx->power)) { + if (PTR_ERR(ctx->power) =3D=3D -ENODEV) + ctx->power =3D NULL; + else + return PTR_ERR(ctx->power); + } + + if (ctx->power) { + ret =3D regulator_enable(ctx->power); + if (ret) { + dev_err(dev, "Failed to enable fan power supply: %d\n", ret); + return ret; + } + } + platform_set_drvdata(pdev, ctx); =20 cdev =3D devm_thermal_of_cooling_device_register(dev->parent, @@ -124,12 +148,25 @@ static int khadas_mcu_fan_suspend(struct device *dev) =20 ctx->level =3D level_save; =20 + if (ctx->power) { + ret =3D regulator_disable(ctx->power); + if (ret) + return ret; + } + return 0; } =20 static int khadas_mcu_fan_resume(struct device *dev) { struct khadas_mcu_fan_ctx *ctx =3D dev_get_drvdata(dev); + int ret; + + if (ctx->power) { + ret =3D regulator_enable(ctx->power); + if (ret) + return ret; + } =20 return khadas_mcu_fan_set_level(ctx, ctx->level); } --=20 2.49.0