Received: by 2002:a05:6902:102b:0:0:0:0 with SMTP id x11csp664057ybt; Wed, 24 Jun 2020 08:18:03 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwiYRDEylY6QXpSLSsuLTt3P9PkmlnTiERZPdkCNK+QDd/ygEy/ZjsFr1cMvkdophGWj7qk X-Received: by 2002:a17:906:e0c7:: with SMTP id gl7mr12026225ejb.264.1593011883545; Wed, 24 Jun 2020 08:18:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1593011883; cv=none; d=google.com; s=arc-20160816; b=wTfE45d1mpWDdw/aWynvrmtcjBrr6zgRtln5vEhywlfHwlKuPCVzBd48QwLxD4qPuV /kjLHbYaZS8Lp2Y4itjhqJO706acEH4bZVUC/4K9QSM/dji/KO2CIQ3+cCI5tDOzwSBJ p+f0PWKJWN+NU7aBwwrYkkdMPxMMxA6/WwRg4U9YYEC6or5N4giNlGJdDrNSrddL7LHA H+wuCRZjyorWSRUfTklkbbkvQRl3etnnaP4Mt2CAOUU4cqW9IHEy3lbRhqAYEYnfvPkb mb0QBNVwCJ04tTUNr108PHklGMZK0fvuDimtikM2UbfDD2BDsjLDQhYSVKFaVZODenCY 0lQg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from; bh=Faa97tB02J0IoqLrPjfZjwKSLVB6vMBRLHD4nBsRos4=; b=HGvAriARki2noAgPyCc5ALhqIB+sRZqO0cxqot+1Rh7eklsySVnN3s8TL83dyXbTjq fp9vAeqYZ0LZDlC43A5ALnNu+WWPRF0lRGW6lEpM3TKiuePv8pYQqNDY9TjbkMwQWOXa wLZVjED6xtWDwjH5Qa8MyH9AiVXWyIN+8MY/BbSTujd8tr4hzmquQG3rHAIaOfsTUgGo EyGCT7NmXXoYPjWNZGrqU/QiwC1vjJ//urU/FZyhLx9pDbGA/HGdoU6LM9BGk/4cj3Gg rAv0f7DyuN6KF0iszJqZGZLjNuGBmG8cNHVecUXLnqgehvYxtbDiSDbl1Lpd1dFGFdcx 75cw== 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id v7si9001490edd.252.2020.06.24.08.17.40; Wed, 24 Jun 2020 08:18:03 -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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2404029AbgFXPQO (ORCPT + 99 others); Wed, 24 Jun 2020 11:16:14 -0400 Received: from mx0a-00128a01.pphosted.com ([148.163.135.77]:5634 "EHLO mx0a-00128a01.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2404514AbgFXPQI (ORCPT ); Wed, 24 Jun 2020 11:16:08 -0400 Received: from pps.filterd (m0167089.ppops.net [127.0.0.1]) by mx0a-00128a01.pphosted.com (8.16.0.42/8.16.0.42) with SMTP id 05OEvgrs023438; Wed, 24 Jun 2020 11:15:47 -0400 Received: from nwd2mta3.analog.com ([137.71.173.56]) by mx0a-00128a01.pphosted.com with ESMTP id 31uuqvjesg-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 24 Jun 2020 11:15:47 -0400 Received: from SCSQMBX11.ad.analog.com (scsqmbx11.ad.analog.com [10.77.17.10]) by nwd2mta3.analog.com (8.14.7/8.14.7) with ESMTP id 05OFFjte012595 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=FAIL); Wed, 24 Jun 2020 11:15:46 -0400 Received: from SCSQMBX10.ad.analog.com (10.77.17.5) by SCSQMBX11.ad.analog.com (10.77.17.10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.1779.2; Wed, 24 Jun 2020 08:15:44 -0700 Received: from zeus.spd.analog.com (10.64.82.11) by SCSQMBX10.ad.analog.com (10.77.17.5) with Microsoft SMTP Server id 15.1.1779.2 via Frontend Transport; Wed, 24 Jun 2020 08:15:44 -0700 Received: from localhost.localdomain ([10.48.65.12]) by zeus.spd.analog.com (8.15.1/8.15.1) with ESMTP id 05OFFdRr023607; Wed, 24 Jun 2020 11:15:42 -0400 From: To: , , CC: , , Alexandru Tachici Subject: [PATCH v5 2/7] hwmon: pmbus: adm1266: Add Block process call Date: Wed, 24 Jun 2020 18:17:31 +0300 Message-ID: <20200624151736.95785-3-alexandru.tachici@analog.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200624151736.95785-1-alexandru.tachici@analog.com> References: <20200624151736.95785-1-alexandru.tachici@analog.com> MIME-Version: 1.0 Content-Type: text/plain X-ADIRoutedOnPrem: True X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.216,18.0.687 definitions=2020-06-24_08:2020-06-24,2020-06-24 signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 mlxlogscore=999 spamscore=0 impostorscore=0 lowpriorityscore=0 clxscore=1015 cotscore=-2147483648 priorityscore=1501 mlxscore=0 bulkscore=0 adultscore=0 phishscore=0 suspectscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2004280000 definitions=main-2006240107 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Alexandru Tachici PmBus devices support Block Write-Block Read Process Call described in SMBus specification v 2.0 with the exception that Block writes and reads are permitted to have up 255 data bytes instead of max 32 bytes (SMBus). This patch adds Block WR process call support for ADM1266. Signed-off-by: Alexandru Tachici --- drivers/hwmon/pmbus/Kconfig | 1 + drivers/hwmon/pmbus/adm1266.c | 79 +++++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+) diff --git a/drivers/hwmon/pmbus/Kconfig b/drivers/hwmon/pmbus/Kconfig index da34083e1ffd..c04068b665e6 100644 --- a/drivers/hwmon/pmbus/Kconfig +++ b/drivers/hwmon/pmbus/Kconfig @@ -28,6 +28,7 @@ config SENSORS_PMBUS config SENSORS_ADM1266 tristate "Analog Devices ADM1266 Sequencer" + select CRC8 help If you say yes here you get hardware monitoring support for Analog Devices ADM1266 Cascadable Super Sequencer. diff --git a/drivers/hwmon/pmbus/adm1266.c b/drivers/hwmon/pmbus/adm1266.c index a7ef048a9a5c..381d89a8569f 100644 --- a/drivers/hwmon/pmbus/adm1266.c +++ b/drivers/hwmon/pmbus/adm1266.c @@ -6,6 +6,7 @@ * Copyright 2020 Analog Devices Inc. */ +#include #include #include #include @@ -14,6 +15,82 @@ #include "pmbus.h" +#define ADM1266_PMBUS_BLOCK_MAX 255 + +DECLARE_CRC8_TABLE(pmbus_crc_table); + +/* Different from Block Read as it sends data and waits for the slave to + * return a value dependent on that data. The protocol is simply a Write Block + * followed by a Read Block without the Read-Block command field and the + * Write-Block STOP bit. + */ +int pmbus_block_xfer(struct i2c_client *client, u8 cmd, u8 w_len, + u8 *data_w, u8 *data_r) +{ + u8 write_buf[ADM1266_PMBUS_BLOCK_MAX + 2]; + struct i2c_msg msgs[2] = { + { + .addr = client->addr, + .flags = 0, + .buf = write_buf, + .len = w_len + 2, + }, + { + .addr = client->addr, + .flags = I2C_M_RD, + .len = ADM1266_PMBUS_BLOCK_MAX + 2, + } + }; + u8 addr = 0; + u8 crc = 0; + int ret; + + msgs[0].buf[0] = cmd; + msgs[0].buf[1] = w_len; + memcpy(&msgs[0].buf[2], data_w, w_len); + + msgs[0].buf = i2c_get_dma_safe_msg_buf(&msgs[0], 1); + if (!msgs[0].buf) + return -ENOMEM; + + msgs[1].buf = i2c_get_dma_safe_msg_buf(&msgs[1], 1); + if (!msgs[1].buf) { + i2c_put_dma_safe_msg_buf(msgs[0].buf, &msgs[0], false); + return -ENOMEM; + } + + ret = i2c_transfer(client->adapter, msgs, 2); + if (ret != 2) { + ret = -EPROTO; + goto cleanup; + } + + if (client->flags & I2C_CLIENT_PEC) { + addr = i2c_8bit_addr_from_msg(&msgs[0]); + crc = crc8(pmbus_crc_table, &addr, 1, crc); + crc = crc8(pmbus_crc_table, msgs[0].buf, msgs[0].len, crc); + + addr = i2c_8bit_addr_from_msg(&msgs[1]); + crc = crc8(pmbus_crc_table, &addr, 1, crc); + crc = crc8(pmbus_crc_table, msgs[1].buf, msgs[1].buf[0] + 1, + crc); + + if (crc != msgs[1].buf[msgs[1].buf[0] + 1]) { + ret = -EBADMSG; + goto cleanup; + } + } + + memcpy(data_r, &msgs[1].buf[1], msgs[1].buf[0]); + ret = msgs[1].buf[0]; + +cleanup: + i2c_put_dma_safe_msg_buf(msgs[0].buf, &msgs[0], true); + i2c_put_dma_safe_msg_buf(msgs[1].buf, &msgs[1], true); + + return ret; +} + static int adm1266_probe(struct i2c_client *client, const struct i2c_device_id *id) { @@ -24,6 +101,8 @@ static int adm1266_probe(struct i2c_client *client, info = devm_kzalloc(&client->dev, sizeof(struct pmbus_driver_info), GFP_KERNEL); + crc8_populate_msb(pmbus_crc_table, 0x7); + info->pages = 17; info->format[PSC_VOLTAGE_OUT] = linear; funcs = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT; -- 2.20.1