Received: by 2002:a6b:500f:0:0:0:0:0 with SMTP id e15csp2568093iob; Sat, 30 Apr 2022 12:12:19 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzrRWw5PWk1VpqLeNdJIoL5BQIfdvJ5FuUZOzbARSiUu0lNIGJFN6ZpA2il2pTqlebpuMGU X-Received: by 2002:a17:90b:1a8f:b0:1d2:acdc:71d2 with SMTP id ng15-20020a17090b1a8f00b001d2acdc71d2mr5326520pjb.41.1651345939718; Sat, 30 Apr 2022 12:12:19 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1651345939; cv=none; d=google.com; s=arc-20160816; b=RHupKvZD1yvGD/pxDuYRA8jquN4Arj+0V3oq936sSOh5TBjOIxImhZky+jy6S5cDZI y9UAptwoB7wcBHAK4FCcg/pYWDqp36KSiJlgjmYa8QBrI1D8Vl4F4JfhU43Ui56idUXl 6HEr8+rSY/SdiA7aj+qnoAG6EJbgPAWhDEAKZDS1NOufQ93KAkjN47rtCsAaoN37UQBt tL4oCNEitHm8xtcGrnCuq7h+xNSxDShnnMCIZEI4XmqCQplszZrZ2cW3F1U+pogL2Ewi uxeSisCcKQlGxkyVrEZyqiSuQk2pRso7ezsOMFcY3OxPT38n0dkF/mWYcw+7h2l+iN85 6g8w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:message-id:date:subject:cc:to:from :dkim-signature; bh=qo6jg5LipZrMgiLJ4jQ6Jvz7qThlbvhz0K01yeV8P5I=; b=i4HRkXmCjmmNSR+iCsaSXpTe7WhnedqsSnqC76AhkRFeASwq13dOF7M75289zbMLIO 0BXRDKeC3W9vTF4NTLgHO+VoJHwfqirImY9KbrrhpprVmip3940iX4c9TKFWM/h3ZiqO wU/YI+ecXuzJe/KJDrmt04DIz3BTLvTZ/NxuFJXpct0TQtiE522G1JIMewqsy05K+WdQ TGOJd5IStxBjSJR2A7UYMmhvoY1cEwc7G7wNLeNmYyNKCQnceyFVBTEb8ruBiGKEFPRq 9neKnM8njmeeWzQv11f/GHuEKABGFiiEeevR+tDU6rWMuv7WtWEUKtXfG0YUNFM3k9oK rE3A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@amazon.com header.s=amazon201209 header.b=JESb1nSF; 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=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=amazon.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id h2-20020a17090adb8200b001bed39e61cesi9933382pjv.23.2022.04.30.12.12.04; Sat, 30 Apr 2022 12:12:19 -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=@amazon.com header.s=amazon201209 header.b=JESb1nSF; 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=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=amazon.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1350628AbiD1Rww (ORCPT + 99 others); Thu, 28 Apr 2022 13:52:52 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35118 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240271AbiD1Rwu (ORCPT ); Thu, 28 Apr 2022 13:52:50 -0400 Received: from smtp-fw-9102.amazon.com (smtp-fw-9102.amazon.com [207.171.184.29]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C1B73BAB8C; Thu, 28 Apr 2022 10:49:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amazon.com; i=@amazon.com; q=dns/txt; s=amazon201209; t=1651168176; x=1682704176; h=from:to:cc:subject:date:message-id:mime-version; bh=qo6jg5LipZrMgiLJ4jQ6Jvz7qThlbvhz0K01yeV8P5I=; b=JESb1nSFuEq8xC3spN54Tm0lQyb3JFhbAA3jAfHfVAF+W9C4mwO/30p6 FVzcZgC23m7XWGyNdzZLlaXHQPoKRPL+Y0zSnt1bm4MnpV5MBThKXR+Hj MTvKqaJwVrPewKO7lJdlKL8F2cOY+Ew6x1C3yISuUOI809EgOTpgWIkKg I=; X-IronPort-AV: E=Sophos;i="5.91,296,1647302400"; d="scan'208";a="214791997" Received: from pdx4-co-svc-p1-lb2-vlan3.amazon.com (HELO email-inbound-relay-iad-1e-90d70b14.us-east-1.amazon.com) ([10.25.36.214]) by smtp-border-fw-9102.sea19.amazon.com with ESMTP; 28 Apr 2022 17:49:35 +0000 Received: from EX13MTAUWC001.ant.amazon.com (iad12-ws-svc-p26-lb9-vlan3.iad.amazon.com [10.40.163.38]) by email-inbound-relay-iad-1e-90d70b14.us-east-1.amazon.com (Postfix) with ESMTPS id EEC4FC08BA; Thu, 28 Apr 2022 17:49:32 +0000 (UTC) Received: from EX13D05UWC004.ant.amazon.com (10.43.162.223) by EX13MTAUWC001.ant.amazon.com (10.43.162.135) with Microsoft SMTP Server (TLS) id 15.0.1497.32; Thu, 28 Apr 2022 17:49:32 +0000 Received: from EX13MTAUEB002.ant.amazon.com (10.43.60.12) by EX13D05UWC004.ant.amazon.com (10.43.162.223) with Microsoft SMTP Server (TLS) id 15.0.1497.32; Thu, 28 Apr 2022 17:49:31 +0000 Received: from localhost (10.107.60.87) by mail-relay.amazon.com (10.43.60.234) with Microsoft SMTP Server id 15.0.1497.32 via Frontend Transport; Thu, 28 Apr 2022 17:49:30 +0000 From: Eduardo Valentin To: Guenter Roeck , CC: Jean Delvare , , , Eduardo Valentin Subject: [PATCHv2 1/1] drivers: hwmon: pmbus: register with thermal for PSC_TEMPERATURE Date: Thu, 28 Apr 2022 10:49:26 -0700 Message-ID: <20220428174926.2150-1-eduval@amazon.com> X-Mailer: git-send-email 2.17.1 MIME-Version: 1.0 Content-Type: text/plain X-Spam-Status: No, score=-15.2 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_HI, SPF_HELO_NONE,SPF_PASS,USER_IN_DEF_SPF_WL 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 Some pmbus device drivers have device tree support and may want to use of-thermal to register a thermal zone OF sensor for those device drivers. This way we allow describing device tree thermal zones for pmbus device drivers with device tree support. This patch achieves this by registering pmbus sensors with thermal subsystem if they are PSC_TEMPERATURE and are providing _input hwmon interface. Cc: Guenter Roeck (maintainer:PMBUS HARDWARE MONITORING DRIVERS) Cc: Jean Delvare (maintainer:HARDWARE MONITORING) Cc: linux-hwmon@vger.kernel.org (open list:PMBUS HARDWARE MONITORING DRIVERS) Cc: linux-kernel@vger.kernel.org (open list) Signed-off-by: Eduardo Valentin Signed-off-by: Eduardo Valentin --- V2: Incorporated Guenter's suggestion to use pmbus_data as field of pmbus_thermal_data. --- drivers/hwmon/pmbus/pmbus_core.c | 68 ++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/drivers/hwmon/pmbus/pmbus_core.c b/drivers/hwmon/pmbus/pmbus_core.c index 776ee2237be2..371d16e3bac6 100644 --- a/drivers/hwmon/pmbus/pmbus_core.c +++ b/drivers/hwmon/pmbus/pmbus_core.c @@ -19,6 +19,8 @@ #include #include #include +#include +#include #include "pmbus.h" /* @@ -1078,6 +1080,68 @@ static int pmbus_add_boolean(struct pmbus_data *data, return pmbus_add_attribute(data, &a->dev_attr.attr); } +/* of thermal for pmbus temperature sensors */ +struct pmbus_thermal_data { + struct pmbus_data *pmbus_data; + struct pmbus_sensor *sensor; +}; + +static int pmbus_thermal_get_temp(void *data, int *temp) +{ + struct pmbus_thermal_data *tdata = data; + struct pmbus_sensor *sensor = tdata->sensor; + struct pmbus_data *pmbus_data = tdata->pmbus_data; + struct i2c_client *client = to_i2c_client(pmbus_data->dev); + struct device *dev = pmbus_data->hwmon_dev; + int ret = 0; + + if (!dev) { + /* May not even get to hwmon yet */ + *temp = 0; + return 0; + } + + mutex_lock(&pmbus_data->update_lock); + pmbus_update_sensor_data(client, sensor); + if (sensor->data < 0) + ret = sensor->data; + else + *temp = (int)pmbus_reg2data(pmbus_data, sensor); + mutex_unlock(&pmbus_data->update_lock); + + return ret; +} + +static const struct thermal_zone_of_device_ops pmbus_thermal_ops = { + .get_temp = pmbus_thermal_get_temp, +}; + +static int pmbus_thermal_add_sensor(struct pmbus_data *pmbus_data, + struct pmbus_sensor *sensor, int index) +{ + struct device *dev = pmbus_data->dev; + struct pmbus_thermal_data *tdata; + struct thermal_zone_device *tzd; + + tdata = devm_kzalloc(dev, sizeof(*tdata), GFP_KERNEL); + if (!tdata) + return -ENOMEM; + + tdata->sensor = sensor; + tdata->pmbus_data = pmbus_data; + + tzd = devm_thermal_zone_of_sensor_register(dev, index, tdata, + &pmbus_thermal_ops); + /* + * If CONFIG_THERMAL_OF is disabled, this returns -ENODEV, + * so ignore that error but forward any other error. + */ + if (IS_ERR(tzd) && (PTR_ERR(tzd) != -ENODEV)) + return PTR_ERR(tzd); + + return 0; +} + static struct pmbus_sensor *pmbus_add_sensor(struct pmbus_data *data, const char *name, const char *type, int seq, int page, int phase, @@ -1121,6 +1185,10 @@ static struct pmbus_sensor *pmbus_add_sensor(struct pmbus_data *data, sensor->next = data->sensors; data->sensors = sensor; + /* temperature sensors with _input values are registered with thermal */ + if (class == PSC_TEMPERATURE && strcmp(type, "input") == 0) + pmbus_thermal_add_sensor(data, sensor, seq); + return sensor; } -- 2.17.1