Received: by 2002:a05:6a10:a841:0:0:0:0 with SMTP id d1csp169040pxy; Wed, 28 Apr 2021 01:40:21 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxY2+SuQWDpmxVWezBSnkzc4SKFtpaPd6gFgDwnJVF8Urea/fDrEAzaKd6Z8W/zySjvPF+s X-Received: by 2002:a05:6402:254f:: with SMTP id l15mr9683813edb.189.1619599221532; Wed, 28 Apr 2021 01:40:21 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1619599221; cv=none; d=google.com; s=arc-20160816; b=ZDfOFbc+/z2X9a1sX6hBw/OyuD1j3uRLihMtYBIGelNEYieCiHgF7nts3cxBnnpm66 JgUyN02NCfMfmAfqmjiG1w5BVhF20bJpGmurSnoRDhYlveBrnWpshXVIdjSv3LUVqNFB r6YShG5DZM1JuApz5J/ypKrlu09BIJPspVDUwPqhepIIQ7q/rfH/GekZKo0AJQjv2cet MAts5gHRNl5GiUcw71HKXCrBgHm0ZPkjL626PoL9w/BbZVlLlnYMA8VsjWSFTNX/FyYP JLxTMJ+6MMw4alyNfO5UwEr75eT8ThdPItAKbzzoCPYqJG5mC7oqJobMZxPFgeQ4twqW ppzA== 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; bh=5dhVOJV1v1xe2BZ8GwY6vRjyrU1hKrudsBliQOL/+ww=; b=oqEtPLfM8Ro2O7yB8BZsT/FBBOzRZqZkOsYEH0e2fv5oMviJzNxnQ7MnaLod2ENEuX g1RT6ml/daZESVexNLXyZx4AMFBwI5jFyxRbZAO5c7yU+C5HDF2Dm1jWQn3edeV5POfv 50B68ZqZGX7VVBy5uxJnbUWcN1h/YcX9tHTtg7CNIwfxtIi2bPJINiiih0WAjAHb9XsI nuNp8K4/UVnWirz4yyFcbExzclFc7Xt+M/baiSVO5poH0gq64yQC12LG7jNFaIiJS4Wj c9VV+Z6y/NFV7cxMuyOnp7gmSzW1VHio7kFXFP+rVBZTeS4If39sQg4DdKc8ZNHzdwhw qIGQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=cesnet.cz Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id ar9si3016565ejc.713.2021.04.28.01.39.55; Wed, 28 Apr 2021 01:40:21 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=cesnet.cz Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237187AbhD1IjX (ORCPT + 99 others); Wed, 28 Apr 2021 04:39:23 -0400 Received: from mail-wr1-f45.google.com ([209.85.221.45]:41735 "EHLO mail-wr1-f45.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232153AbhD1IjW (ORCPT ); Wed, 28 Apr 2021 04:39:22 -0400 Received: by mail-wr1-f45.google.com with SMTP id d11so4257823wrw.8; Wed, 28 Apr 2021 01:38:37 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=5dhVOJV1v1xe2BZ8GwY6vRjyrU1hKrudsBliQOL/+ww=; b=RJp50+8EF1+q+Rh4lxlIuKjycZe99IILmUb4oOsQ0zKWeb49ZYIPXE6Xrwlfel0281 /cMr6XchdzYoYQ9iZ6Y6DcemTQuBybmakehHpNoEU462RFi48v+N77MV2py/1PlWdWaN YCla7j+gC3HTATfBM+JUOJR3g/tuVD1t4ITP10cyRy6Pt7xHknwH3uztGN5GOd2qACji lKJZ7nk132SjF4FlH2c6jaukuPTUOzojAH3uEbvdk7KTlduJvdIKKlPHuUzNHTnfxmQa 0JgO2XYmizZRVVj+R2ay2moaSswPn6/wgYXU+5Vk0Z5rwiClB/E9sCiZjbDR4rmm77/l ubtw== X-Gm-Message-State: AOAM532c2yp4Th0ncSeyE/DMXgIOMEbEQWisyMP91ugBi12IcPn2+mC7 Sgw+nQQPQAi/nnoTbWaVUMk= X-Received: by 2002:a5d:6383:: with SMTP id p3mr8032355wru.230.1619599117243; Wed, 28 Apr 2021 01:38:37 -0700 (PDT) Received: from localhost ([2a02:8308:387:c900:a7b5:b859:9449:c07b]) by smtp.gmail.com with ESMTPSA id d14sm7438735wrp.12.2021.04.28.01.38.36 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 28 Apr 2021 01:38:36 -0700 (PDT) From: =?UTF-8?q?V=C3=A1clav=20Kubern=C3=A1t?= To: Guenter Roeck , Jean Delvare , linux-hwmon@vger.kernel.org, linux-kernel@vger.kernel.org Cc: =?UTF-8?q?V=C3=A1clav=20Kubern=C3=A1t?= Subject: [PATCH v2] Fix FSP-3Y YH-5151E non-compliant vout encoding Date: Wed, 28 Apr 2021 10:38:32 +0200 Message-Id: <20210428083833.4136346-1-kubernat@cesnet.cz> X-Mailer: git-send-email 2.31.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org I didn't properly test the driver for YH-5151E, so it was completely broken. Firstly, the log/real mapping was incorrect in one case. Secondly, PMBus specifies that output voltages should be in the linear16 encoding. However, the PDU is non-compliant and uses linear11. YM-2151E isn't affected by this. Fix this by converting the values inside the read functions. linear16 gets the exponent from the VOUT_MODE command. The device doesn't support it, so I have to manually supply the value for it. Both supported devices have now been tested to report correct vout values. Signed-off-by: Václav Kubernát --- drivers/hwmon/pmbus/fsp-3y.c | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/drivers/hwmon/pmbus/fsp-3y.c b/drivers/hwmon/pmbus/fsp-3y.c index 564649e87e34..dc147a79d6aa 100644 --- a/drivers/hwmon/pmbus/fsp-3y.c +++ b/drivers/hwmon/pmbus/fsp-3y.c @@ -57,7 +57,7 @@ static int page_log_to_page_real(int page_log, enum chips chip) case YH5151E_PAGE_12V_LOG: return YH5151E_PAGE_12V_REAL; case YH5151E_PAGE_5V_LOG: - return YH5151E_PAGE_5V_LOG; + return YH5151E_PAGE_5V_REAL; case YH5151E_PAGE_3V3_LOG: return YH5151E_PAGE_3V3_REAL; } @@ -103,17 +103,28 @@ static int set_page(struct i2c_client *client, int page_log) static int fsp3y_read_byte_data(struct i2c_client *client, int page, int reg) { + const struct pmbus_driver_info *info = pmbus_get_driver_info(client); + struct fsp3y_data *data = to_fsp3y_data(info); int rv; rv = set_page(client, page); if (rv < 0) return rv; + /* + * YH5151-E outputs vout in linear11. The conversion is done later, but + * I have to inject pmbus_core with the correct exponent. + */ + if (data->chip == yh5151e && reg == PMBUS_VOUT_MODE) + return 0x1A; + return i2c_smbus_read_byte_data(client, reg); } static int fsp3y_read_word_data(struct i2c_client *client, int page, int phase, int reg) { + const struct pmbus_driver_info *info = pmbus_get_driver_info(client); + struct fsp3y_data *data = to_fsp3y_data(info); int rv; /* @@ -144,7 +155,18 @@ static int fsp3y_read_word_data(struct i2c_client *client, int page, int phase, if (rv < 0) return rv; - return i2c_smbus_read_word_data(client, reg); + rv = i2c_smbus_read_word_data(client, reg); + if (rv < 0) + return rv; + + /* + * The PDU is non-compliant and outputs output voltages in linear11 + * instead of linear16. + */ + if (data->chip == yh5151e && reg == PMBUS_READ_VOUT) + rv = ((s16)((rv & 0x7ff) << 5)) >> 5; + + return rv; } struct pmbus_driver_info fsp3y_info[] = { -- 2.31.1