Received: by 2002:a25:e74b:0:0:0:0:0 with SMTP id e72csp1695032ybh; Tue, 14 Jul 2020 05:03:35 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwUHyTKpxCJstF/A/3DYq6Fnbvf1ljhDY0+9LGD49Fb34+z4lfmbcJPNvFp4P6QUEwcYaaG X-Received: by 2002:a50:93a2:: with SMTP id o31mr4197183eda.203.1594728215756; Tue, 14 Jul 2020 05:03:35 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1594728215; cv=none; d=google.com; s=arc-20160816; b=fpAHacmIU4w1HBc5mFWyw59v03kEVrDbDvYsWJtZ3/zmVZj67Bzhb/+3c3pv31wq1o mGcWDEQD8/rmTAvir8SZvAcHEXnP/EIx2jIMlMtfLMLhLR8ecVFrHjNAhPi8k84aek0V jT7zLp8Lx+Y+WL1CvqeBu7XRL5QKBag+SK3K39fXCWPVq6BL9xU290niCofusyCmtM1E G5OvH0mYc3M8dDf+ZHS7CsOZQ5QoVa6PwoFXLvTnGm+rmT5FIboc+IKb5wL9nHhIx1BL QT80lPZnu1TxvUwfL1qw1TGqnLlPjzOzPlIFLULq02cR1AFiWTL2UVH4nJP4YytaekuD pJVA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from; bh=Jkeww7AZXICVyWkx/LqZeRPPIcBOjKgRLI/oepHasAg=; b=W3/TvMuq24QmwWEem2kcKrswNztehsyuTgFQVpz8Nl+7E1IzQZTdOupN5nI6VDdtRQ d172EOifYbwwzBXuW3qSHvNMAazS0lRMHxCbb693pRmKcxjve5e6ypRDK76yKchX/Z4F BIq22wnNW18UUinbnzpmXSugVzHGqvLkFOyn4KuHMXN2RWrQ3jdbJKBdd+NH2MyHdnIC yZ8D7Nx2Tq0nVgWsNgTkHzOLyLh4E4Q5oQ6PqOgveBLSFYPgBNnFXpv+DDYv90+jV9Yb XBETIBM28CZliIXmY8UDHzf116KIy9gXVPuLexbZRVJIMFn0aYVKjwLCItAbU4BjO44x ARfA== 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=mellanox.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id b15si11149888edx.0.2020.07.14.05.03.11; Tue, 14 Jul 2020 05:03:35 -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=mellanox.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728172AbgGNMCW (ORCPT + 99 others); Tue, 14 Jul 2020 08:02:22 -0400 Received: from mail-il-dmz.mellanox.com ([193.47.165.129]:52625 "EHLO mellanox.co.il" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1728125AbgGNMCT (ORCPT ); Tue, 14 Jul 2020 08:02:19 -0400 Received: from Internal Mail-Server by MTLPINE1 (envelope-from vadimp@mellanox.com) with SMTP; 14 Jul 2020 15:02:16 +0300 Received: from r-build-lowlevel.mtr.labs.mlnx. (r-build-lowlevel.mtr.labs.mlnx [10.209.0.190]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 06EC25dl004353; Tue, 14 Jul 2020 15:02:16 +0300 From: Vadim Pasternak To: andy@infradead.org, dvhart@infradead.org Cc: platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org, Vadim Pasternak Subject: [PATCH platform-next v2 08/11] platform/mellanox: mlxreg-io: Add support for complex attributes Date: Tue, 14 Jul 2020 15:02:00 +0300 Message-Id: <20200714120203.10352-9-vadimp@mellanox.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20200714120203.10352-1-vadimp@mellanox.com> References: <20200714120203.10352-1-vadimp@mellanox.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add support for attributes composed from few registers. Such attributes could occupy from 2 to 4 sequential registers. For word size register space complex attributes can occupy up to two registers, for byte size - up to four. These attributes can carry, for example, CPLD or FPGA versioning, power consuming info, etcetera. Such registers contain read-only data. Signed-off-by: Vadim Pasternak --- v1->v2: Comments pointed out by Andy: - Fix commit text. - Fix few comments. - Drop attribute validation for read-only access in mlxreg_io_get_reg(). This is redundant and wrong validation in attribute 'show' callback. --- drivers/platform/mellanox/mlxreg-io.c | 45 +++++++++++++++++++++++++---------- 1 file changed, 33 insertions(+), 12 deletions(-) diff --git a/drivers/platform/mellanox/mlxreg-io.c b/drivers/platform/mellanox/mlxreg-io.c index acfaf64ffde6..7646708d57e4 100644 --- a/drivers/platform/mellanox/mlxreg-io.c +++ b/drivers/platform/mellanox/mlxreg-io.c @@ -30,6 +30,7 @@ * @mlxreg_io_dev_attr: sysfs sensor device attribute array; * @group: sysfs attribute group; * @groups: list of sysfs attribute group for hwmon registration; + * @regsize: size of a register value; */ struct mlxreg_io_priv_data { struct platform_device *pdev; @@ -39,27 +40,30 @@ struct mlxreg_io_priv_data { struct sensor_device_attribute mlxreg_io_dev_attr[MLXREG_IO_ATT_NUM]; struct attribute_group group; const struct attribute_group *groups[2]; + int regsize; }; static int mlxreg_io_get_reg(void *regmap, struct mlxreg_core_data *data, u32 in_val, - bool rw_flag, u32 *regval) + bool rw_flag, int regsize, u32 *regval) { - int ret; + int i, val, ret; ret = regmap_read(regmap, data->reg, regval); if (ret) goto access_error; /* - * There are three kinds of attributes: single bit, full register's - * bits and bit sequence. For the first kind field mask indicates which - * bits are not related and field bit is set zero. For the second kind - * field mask is set to zero and field bit is set with all bits one. - * No special handling for such kind of attributes - pass value as is. - * For the third kind, field mask indicates which bits are related and - * field bit is set to the first bit number (from 1 to 32) is the bit - * sequence. + * There are four kinds of attributes: single bit, full register's + * bits, bit sequence, bits in few registers For the first kind field + * mask indicates which bits are not related and field bit is set zero. + * For the second kind field mask is set to zero and field bit is set + * with all bits one. No special handling for such kind of attributes - + * pass value as is. For the third kind, the field mask indicates which + * bits are related and the field bit is set to the first bit number + * (from 1 to 32) is the bit sequence. For the fourth kind - the number + * of registers which should be read for getting an attribute are + * specified through 'data->regnum' field. */ if (!data->bit) { /* Single bit. */ @@ -83,6 +87,19 @@ mlxreg_io_get_reg(void *regmap, struct mlxreg_core_data *data, u32 in_val, /* Clear relevant bits and set them to new value. */ *regval = (*regval & ~data->mask) | in_val; } + } else { + /* + * Some attributes could occupied few registers in case regmap + * bit size is 8 or 16. Compose such attributes from 'regnum' + * registers. Such attributes contain read-only data. + */ + for (i = 1; i < data->regnum; i++) { + ret = regmap_read(regmap, data->reg + i, &val); + if (ret) + goto access_error; + + *regval |= rol32(val, regsize * i); + } } access_error: @@ -99,7 +116,8 @@ mlxreg_io_attr_show(struct device *dev, struct device_attribute *attr, u32 regval = 0; int ret; - ret = mlxreg_io_get_reg(priv->pdata->regmap, data, 0, true, ®val); + ret = mlxreg_io_get_reg(priv->pdata->regmap, data, 0, true, + priv->regsize, ®val); if (ret) goto access_error; @@ -128,7 +146,7 @@ mlxreg_io_attr_store(struct device *dev, struct device_attribute *attr, return ret; ret = mlxreg_io_get_reg(priv->pdata->regmap, data, input_val, false, - ®val); + priv->regsize, ®val); if (ret) goto access_error; @@ -207,6 +225,9 @@ static int mlxreg_io_probe(struct platform_device *pdev) } priv->pdev = pdev; + priv->regsize = regmap_get_val_bytes(priv->pdata->regmap); + if (priv->regsize < 0) + return priv->regsize; err = mlxreg_io_attr_init(priv); if (err) { -- 2.11.0