Received: by 2002:a05:6a10:2726:0:0:0:0 with SMTP id ib38csp4091346pxb; Sun, 27 Mar 2022 11:53:22 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzPBiUx8iGLkdAKq2EvlS4C9+SJMkkFqgUJNk4srY+nhRxSrOC26UeWSnCpoCOPi3IMAdPx X-Received: by 2002:a63:af4b:0:b0:373:a2a1:bf9a with SMTP id s11-20020a63af4b000000b00373a2a1bf9amr7643082pgo.369.1648407202039; Sun, 27 Mar 2022 11:53:22 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1648407202; cv=none; d=google.com; s=arc-20160816; b=JXuq5g+x0emNl0d00mTvaneEoGDMcmusMeIFaoMD9Sagx9SVIJFGVIOoVBPZgrgclH ufNf5duZyL87yLSCeNuH8Q6ZmNM/W055krTLAOPt6MnvXWKNbkOQnC0TgRQfbLMhMv3Z zYSeAp2PlrVJvq2CxRlUNZvVTq8i1Xq+MmjmxpVtTRaBoCvJTUKtgCo9SG1rXIJ1iKru YN/M53KKvjGkn/j3DKvFgTQv9UJrajxZ6Doae8WwRed59MYEF2aqbIzepwl5ZhhBUuvz SCKOzZkWFRr0BhRzIGs0DQk8l9Bn8tajWjFhfIzIk2zoPYX/XPgL2guOJ19e8mVtkVh0 Hd3g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:dkim-signature; bh=/Zke8sap1SzyXwunVWB4j25bCDvUUmCNNsUp4pJAfQg=; b=SgSiw9rwKXYQjITfAUgtzQhSawzGPge4MOdtmZ+BKaIierQRXlUxpEZOcaITM+DNAt fJmF+S0eXhykd32B2fFt0ejNsDDIfLnMBRRnP5rXwSghhqRtD39uAfQ2GqfdqemyC2PE JWJjrgw6K9MWSDXxMfWtXoigz8BOAJ8bakuKzjYTM4nijepTT+ZneF5VhOS33zSU5esv qm6JneoNGykwPRHJhq+w3/R56XkeA8aYdsSx0MuXhS9Bq+5ZpOTLWQDLOZRABHHW2HkB v27lcAcl0EufW6wae436aCks0HgFRY6jcMN5ss/Q9E8edXIoPb1wxtonqHGVHVIvH1Fz hReQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmx.net header.s=badeba3b8450 header.b=DMR8XN6E; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=gmx.de Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id d7-20020a17090ad3c700b001c6edf679b4si12788043pjw.46.2022.03.27.11.52.48; Sun, 27 Mar 2022 11:53:22 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@gmx.net header.s=badeba3b8450 header.b=DMR8XN6E; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=gmx.de Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234707AbiCZT2P (ORCPT + 99 others); Sat, 26 Mar 2022 15:28:15 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40014 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233850AbiCZT2N (ORCPT ); Sat, 26 Mar 2022 15:28:13 -0400 Received: from mout.gmx.net (mout.gmx.net [212.227.17.21]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DB3D457498; Sat, 26 Mar 2022 12:26:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1648322775; bh=BhYwGJesufnhB1BugiBJY7l8WrEGuEqC2mGAreqhWuE=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date; b=DMR8XN6EnCWR38zGCa+LYRE1rVwuxxtXvGENMiZk/YAVBHNEotdDmRKfvNRJM4vzd 1wQ3qnDliXLXTTE+oQvtPfZtR5LLcOI0ig77GsaImVznnzOPaeSrmKp+v/KpS8cFzv SFgyJtFqoKLCi2Kh+IPV5cRigY0dX+qpZ1CW+Mx8= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from esprimo-mx.users.agdsn.de ([141.30.226.129]) by mail.gmx.net (mrgmx104 [212.227.17.168]) with ESMTPSA (Nemesis) id 1M1Ygt-1nVABI0X6J-0034Md; Sat, 26 Mar 2022 20:26:15 +0100 From: Armin Wolf To: pali@kernel.org Cc: jdelvare@suse.com, linux@roeck-us.net, linux-hwmon@vger.kernel.org, linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [RFC] hwmon: (dell_smm) Add cooling device support Date: Sat, 26 Mar 2022 20:25:09 +0100 Message-Id: <20220326192509.23175-1-W_Armin@gmx.de> X-Mailer: git-send-email 2.30.2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K1:XNw4w5M70AJchJrK8wKkebOiS3TxRSb0azt4ds2uX4w3jAmQv+k 0o6JtT7HnaI0itW31f1ABeovugR/pcg+pON3VWjbRmKNqi5DtIioUszO3qjZfHOT2kZS6sb aAzEAvsZdUwEbNumQYciugjkx6b2qQmYON+hFGeUXV2nsF3hsAiFgwvnoPmtKhvrpPD5Njq IAqWZsSG27W2xmk11+aKQ== X-UI-Out-Filterresults: notjunk:1;V03:K0:B132diyDJ4A=:0ujCpCgsjuRQf/LUXKrs9C 8N5xrD9xD2H6HwEDEE9V28N4TehDnkl0UYvAl6uIc/yAY7ETeYCs9KG+/cLo+6DKRQ+7wYPy8 AYnevOnYEKyaMLfYuNwAcwFIMuGK11zz9HDLN2sVCrEsyAMFxgnIImAsu7PfeFGKHRjXy6TOS 44V9DCx0WticGTbnXWUZtlP/5H4BSdUx9B36ulWRJ63n4n3g3UCnWV7LvaN/IhAeP5I+Lm9id z68wItR59tkdtTXyqTxbfDafPqF1S842nM9pYc7TUFQfaydlzUmk7hjK8wQxNXR2EyEmTkkX/ F+uCV06sN+8Ujp8pzA6Un8J/xsE/zT/poLJzODHeHrWh9cfoykfDrM0VfAk3H3Qm5ZCHE6H1g rPteKghBpLvNMxSt0z0Lfa4ss7JBO+awZwWmCDH2KO5NARPn7svqsyfZm2l8Be5XUK8oF0+Bt hUhVHI+GVPoiWXqlI0fShcosg41YU4IGspPFUOkK0EPD4baBta1VxWBXTkN6BLGfCZBXwLTd+ zhlfX5vCDO1MPrhdHuwDGaGG1W1SpkI25Xt7GmUaT2pYNMrt5WR0l5mSK1MeEUOe81dUla8fX TSR9ZSj/kuZ97KnVxE1T/PfcDcuATx/EdNr4QdwevLNs5wwoFUJJsd43LKzIjUajl9Nc6rpjo S3c8gO/WTqTAgJCGZ04W2NdNa48pZA3u8aQyHDtNU0Qcx8ETWPLmEa+IS2UDrbjc3O8ejHXS8 OGoFEL+e5k0YdMEFCu/e/ONjE2ZXWvS089nM47XVUSwrflZAXbziJZ/4/o6RVzZdoA++QdxkW 1V1mkSACAjHNryOka6xoKS3qHCRrvsoXJdRb+vSUkR/T1AonWiETGb2Uy5KXDG4LlVxEUwoUC TXCIqFRROu1O3k+hzS/hgpOkr230XR9l+g+lCbwzWc6PjprfxuS191oGGCL0BxHXZfB81pOGG dgL3QaO5XRXAjQFLmT7/lyUndhiZSia4F+N1naGs+jrdVY3MlLxv4uj6IawZO+NAn1ilChtCW Wg/VnN+jSiTPos/Lg/TU9eiWG2LiIp95Mb+QsQn9udvUqdmrA4JJUsJku5KmH96inaYrgW6rq vLkLt5vNlAs42Y= X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW,RCVD_IN_MSPIKE_H2, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Until now, only the temperature sensors where exported thru the thermal subsystem. Export the fans as "dell-smm-fan" too to make them available as cooling devices. This could be a potential successor of the nonstandard procfs interface currently provided by the driver. Also update Documentation. Signed-off-by: Armin Wolf =2D-- Documentation/hwmon/dell-smm-hwmon.rst | 7 +++ drivers/hwmon/dell-smm-hwmon.c | 68 ++++++++++++++++++++++++-- 2 files changed, 72 insertions(+), 3 deletions(-) diff --git a/Documentation/hwmon/dell-smm-hwmon.rst b/Documentation/hwmon/= dell-smm-hwmon.rst index d3323a96665d..da07e39935f1 100644 =2D-- a/Documentation/hwmon/dell-smm-hwmon.rst +++ b/Documentation/hwmon/dell-smm-hwmon.rst @@ -86,6 +86,13 @@ probe the BIOS on your machine and discover the appropr= iate codes. Again, when you find new codes, we'd be happy to have your patches! +``thermal`` interface +--------------------------- + +The driver also exports the fans as thermal cooling devices with +``type`` set to ``dell-smm-fan``. This allows for easy fan control +using one of the thermal governors. + Module parameters ----------------- diff --git a/drivers/hwmon/dell-smm-hwmon.c b/drivers/hwmon/dell-smm-hwmon= .c index 84cb1ede7bc0..fb2c70875c0a 100644 =2D-- a/drivers/hwmon/dell-smm-hwmon.c +++ b/drivers/hwmon/dell-smm-hwmon.c @@ -29,6 +29,7 @@ #include #include #include +#include #include #include @@ -80,6 +81,11 @@ struct dell_smm_data { int *fan_nominal_speed[DELL_SMM_NO_FANS]; }; +struct dell_smm_cooling_data { + u8 fan_num; + struct dell_smm_data *data; +}; + MODULE_AUTHOR("Massimo Dal Zotto (dz@debian.org)"); MODULE_AUTHOR("Pali Roh=C3=A1r "); MODULE_DESCRIPTION("Dell laptop SMM BIOS hwmon driver"); @@ -638,9 +644,50 @@ static void __init i8k_init_procfs(struct device *dev= ) #endif -/* - * Hwmon interface - */ +static int dell_smm_get_max_state(struct thermal_cooling_device *dev, uns= igned long *state) +{ + struct dell_smm_cooling_data *cdata =3D dev->devdata; + + *state =3D cdata->data->i8k_fan_max; + + return 0; +} + +static int dell_smm_get_cur_state(struct thermal_cooling_device *dev, uns= igned long *state) +{ + struct dell_smm_cooling_data *cdata =3D dev->devdata; + int ret; + + ret =3D i8k_get_fan_speed(cdata->data, cdata->fan_num); + if (ret < 0) + return ret; + + *state =3D ret; + + return 0; +} + +static int dell_smm_set_cur_state(struct thermal_cooling_device *dev, uns= igned long state) +{ + struct dell_smm_cooling_data *cdata =3D dev->devdata; + struct dell_smm_data *data =3D cdata->data; + int ret; + + if (state > data->i8k_fan_max) + return -EINVAL; + + mutex_lock(&data->i8k_mutex); + ret =3D i8k_set_fan(data, cdata->fan_num, (int)state); + mutex_unlock(&data->i8k_mutex); + + return ret; +} + +static const struct thermal_cooling_device_ops dell_smm_cooling_ops =3D { + .get_max_state =3D dell_smm_get_max_state, + .get_cur_state =3D dell_smm_get_cur_state, + .set_cur_state =3D dell_smm_set_cur_state, +}; static umode_t dell_smm_is_visible(const void *drvdata, enum hwmon_sensor= _types type, u32 attr, int channel) @@ -944,6 +991,8 @@ static const struct hwmon_chip_info dell_smm_chip_info= =3D { static int __init dell_smm_init_hwmon(struct device *dev) { struct dell_smm_data *data =3D dev_get_drvdata(dev); + struct thermal_cooling_device *cdev; + struct dell_smm_cooling_data *cdata; struct device *dell_smm_hwmon_dev; int state, err; u8 i; @@ -967,6 +1016,19 @@ static int __init dell_smm_init_hwmon(struct device = *dev) continue; data->fan[i] =3D true; + + /* the cooling device it not critical, ignore failures */ + cdata =3D devm_kmalloc(dev, sizeof(*cdata), GFP_KERNEL); + if (cdata) { + cdata->fan_num =3D i; + cdata->data =3D data; + cdev =3D devm_thermal_of_cooling_device_register(dev, NULL, "dell-smm-= fan", + cdata, + &dell_smm_cooling_ops); + if (IS_ERR(cdev)) + devm_kfree(dev, cdata); + } + data->fan_nominal_speed[i] =3D devm_kmalloc_array(dev, data->i8k_fan_ma= x + 1, sizeof(*data->fan_nominal_speed[i]), GFP_KERNEL); =2D- 2.30.2