Received: by 2002:a17:90b:8d0:0:0:0:0 with SMTP id ds16csp5057441pjb; Mon, 27 Jul 2020 11:49:04 -0700 (PDT) X-Google-Smtp-Source: ABdhPJztM35n0QV7wYe4hztkO+KDaHWDu5Lr7wsDWmAIa+mKPFk6DbhDceSGA95r9tEL1f5z4Zt3 X-Received: by 2002:a05:6402:2212:: with SMTP id cq18mr23446304edb.173.1595875744283; Mon, 27 Jul 2020 11:49:04 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1595875744; cv=none; d=google.com; s=arc-20160816; b=pubCDiQFNmnUGABJE8VaS4LQnQM5hlJpYZR0r2EQ/MRXsE7ioZsZB9z/+pa2HPivM3 4JBlWYxyqJxkXZt3T+J4xzslwveq/ln2KMFf3Z9fwPeT30wR9Jb7yllm31y8FCL1HQnk IZMftMv+fqEv9tqIlYMYH4Is0sU+RqSSK9WkdpjCxIrArlPcLR2tjOMs9ZVokddNRHXY 6N2JhCypdJuhs+mmWzUJSfAod+MCqrz9DzrqYc2gzgrKcbrU7vrAEmixk2k26C05K83l RXrAnDLH5SrI1W9XoxlTEn4oDU4802VNvQxPMpVE4B49S5MQzMdKdQIfOqdx8g/3A+L5 i6+w== 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=M3/WqlMowGXNI2311ZBk8Fdl3cHpi4UbH+AN8B1GLvw=; b=Ys61av3xmmtzDat4nA1eMohefG1RXjr7LTg6QxLX832Od+nmw+NvwzY1Y8Nfew2REB fEG7k9pyhvoLkJa2kcF1O7gLBNs5iGP1vOxYKtW4hQxi67eWEhTq7ccEEzAZv1FNHqdr 7hH4nQn/yichyENa3j1fdD42hpYOchKXxFt2fyFfG2GwYLFeO8Zr5LrobHvhzohyi1Tb F6OINsA5ZmDFCmNB6mQKXfw4FgrLc67uSK3BKvEEMh2qWuj3YHQLSALv773tcG3VVvZJ uYmr7sodDSaxDlccODNQdBmLl7kjBEI9bi6c0KF+8uSeiZqMRbMX0LKdvMGcCPlVY8J/ ft0Q== 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=analog.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id co19si5781418edb.605.2020.07.27.11.48.42; Mon, 27 Jul 2020 11:49:04 -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=analog.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728964AbgG0QSA (ORCPT + 99 others); Mon, 27 Jul 2020 12:18:00 -0400 Received: from mx0a-00128a01.pphosted.com ([148.163.135.77]:34542 "EHLO mx0a-00128a01.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728717AbgG0QSA (ORCPT ); Mon, 27 Jul 2020 12:18:00 -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 06RG7rnL019019; Mon, 27 Jul 2020 12:17:59 -0400 Received: from nwd2mta3.analog.com ([137.71.173.56]) by mx0a-00128a01.pphosted.com with ESMTP id 32ghn5eyq5-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 27 Jul 2020 12:17:58 -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 06RGHvLS050894 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=FAIL); Mon, 27 Jul 2020 12:17:57 -0400 Received: from SCSQCASHYB6.ad.analog.com (10.77.17.132) 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; Mon, 27 Jul 2020 09:17:56 -0700 Received: from SCSQMBX10.ad.analog.com (10.77.17.5) by SCSQCASHYB6.ad.analog.com (10.77.17.132) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.1779.2; Mon, 27 Jul 2020 09:17: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; Mon, 27 Jul 2020 09:17:55 -0700 Received: from localhost.localdomain ([10.48.65.12]) by zeus.spd.analog.com (8.15.1/8.15.1) with ESMTP id 06RGHjXC009637; Mon, 27 Jul 2020 12:17:53 -0400 From: To: , , CC: , , Alexandru Tachici Subject: [PATCH v7 6/9] hwmon: pmbus: adm1266: Add group command support Date: Mon, 27 Jul 2020 19:19:25 +0300 Message-ID: <20200727161928.14122-7-alexandru.tachici@analog.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200727161928.14122-1-alexandru.tachici@analog.com> References: <20200727161928.14122-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.235,18.0.687 definitions=2020-07-27_11:2020-07-27,2020-07-27 signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 clxscore=1015 lowpriorityscore=0 bulkscore=0 mlxscore=0 mlxlogscore=999 adultscore=0 suspectscore=0 malwarescore=0 phishscore=0 spamscore=0 impostorscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2006250000 definitions=main-2007270111 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Alexandru Tachici The Group Command Protocol is used to send commands to more than one PMBus device. Some devices working together require that they must execute some commands all at once. The commands are sent in one continuous transmission. When the devices detect the STOP condition that ends the sending of commands, they all begin executing the command they received. This patch adds support for the group command protocol. Signed-off-by: Alexandru Tachici --- drivers/hwmon/pmbus/adm1266.c | 50 +++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/drivers/hwmon/pmbus/adm1266.c b/drivers/hwmon/pmbus/adm1266.c index b61a968d67f9..f571fe1ee35d 100644 --- a/drivers/hwmon/pmbus/adm1266.c +++ b/drivers/hwmon/pmbus/adm1266.c @@ -73,6 +73,56 @@ static const struct nvmem_cell_info adm1266_nvmem_cells[] = { DECLARE_CRC8_TABLE(pmbus_crc_table); +/* PMBus Group command. */ +static int adm1266_pmbus_group_command(struct adm1266_data *data, struct i2c_client **clients, + u8 nr_clients, u8 cmd, u8 w_len, u8 *data_w) +{ + struct i2c_msg *msgs; + u8 addr; + int ret; + int i; + + msgs = kcalloc(nr_clients, sizeof(struct i2c_msg), GFP_KERNEL); + if (!msgs) + return -ENOMEM; + + for (i = 0; i < nr_clients; i++) { + msgs[i].addr = clients[i]->addr; + msgs[i].len = w_len + 1; + + msgs[i].buf = kcalloc(ADM1266_PMBUS_BLOCK_MAX + 2, sizeof(u8), GFP_KERNEL); + if (!msgs[i].buf) { + ret = -ENOMEM; + goto cleanup; + } + + msgs[i].buf[0] = cmd; + memcpy(&msgs[i].buf[1], data_w, w_len); + + if (clients[i]->flags & I2C_CLIENT_PEC) { + u8 crc = 0; + + addr = i2c_8bit_addr_from_msg(&msgs[i]); + crc = crc8(pmbus_crc_table, &addr, 1, crc); + crc = crc8(pmbus_crc_table, msgs[i].buf, msgs[i].len, + crc); + + msgs[i].buf[msgs[i].len] = crc; + msgs[i].len++; + } + }; + + ret = i2c_transfer(data->client->adapter, msgs, nr_clients); + +cleanup: + for (i = i - 1; i >= 0; i--) + kfree(msgs[i].buf); + + kfree(msgs); + + return ret; +} + /* * 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 -- 2.20.1