Received: by 10.213.65.68 with SMTP id h4csp1249454imn; Wed, 14 Mar 2018 14:18:20 -0700 (PDT) X-Google-Smtp-Source: AG47ELti786mM3NFBCdja9eMwAEwN9Fp84tZucW1U+OtvR/a/LBAzzqEjsYto+lR1CL4dfCzVtJH X-Received: by 10.98.223.143 with SMTP id d15mr5624064pfl.208.1521062300815; Wed, 14 Mar 2018 14:18:20 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1521062300; cv=none; d=google.com; s=arc-20160816; b=oCWUIJDh6vGJdvQDeTVH09khiHVmsM/Umvf0KHM67a1xmaiWUClcWNPTCXHe9hnMgF IoQVjBONiRjheGgD529PtCkBRB7sOOjpnVFisw2GmDtCd4BQJGSbywuJ4ECjvPrqqBjm rVkP5TosvnBP9g6cuw+iusyfs4NOJqSAcFep9ZNfGkoS2onTengLUqKz8m6AdiDvR9wv aEcab1vYAMF8Kw0byQaK+evwMdphapaoTuZAIM7W2AOut6xMuZSxKJTVyyExcq+pgJRC XR81GDoien64orO5tDyC9hOhFZyQ0vv61abvY1e8/zg8E60w89iiv4HLc3lyyWrxjaTj Ifsg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date:dkim-signature:arc-authentication-results; bh=ymcnxyEKysJE7iQ2uJixU3gTQtDQXicPQlnEGAZOwyo=; b=dxpsntYMHa2P5UndSEXmb07KB9IJvxeSviNWK8oO0Y4xGNS8AmBWfu/hjirgWi/Kny K30btKFs0e7XSjxexxOXUrbuCWQoBNDUNmK4WG79IIWSSdKNAgO0dJw/iQlujGMkAUjF xGma6lozLzYrOnKHbJegzH+P1l6ACbfKAfQpUUYcsg7dN3rMzVHL+pW2MSNBqJfOPTx4 B1ensegp8WM0MBgC18OuFzSaW7g+Sdpxi3+mzMJyK/bzl8KIJahEDuPka6yb5FfoMe4s h0u3o5upF8i7K2F9YXB/MK/Q/YmwmktRYLlM3kvSoPJ11QnJ5u9UuO04U824jaGZEQQN GM5w== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@gmail.com header.s=20161025 header.b=pU8ltsRV; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id a61-v6si2531747plc.669.2018.03.14.14.18.06; Wed, 14 Mar 2018 14:18:20 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=fail header.i=@gmail.com header.s=20161025 header.b=pU8ltsRV; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751559AbeCNVQw (ORCPT + 99 others); Wed, 14 Mar 2018 17:16:52 -0400 Received: from mail-pg0-f68.google.com ([74.125.83.68]:34265 "EHLO mail-pg0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750779AbeCNVQu (ORCPT ); Wed, 14 Mar 2018 17:16:50 -0400 Received: by mail-pg0-f68.google.com with SMTP id m15so1926132pgc.1; Wed, 14 Mar 2018 14:16:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=ymcnxyEKysJE7iQ2uJixU3gTQtDQXicPQlnEGAZOwyo=; b=pU8ltsRVvtOkaBIxDsRIz0KzEjQRFK4ByRi1caDcN0q/ygFnowZ0eyoBhbgZadab5k hkiLD8ayEp3xTCFsfa1iQNmo69NJ/8t4gN+Q9v5zpMj2SIXJEcyCP/Bu+lbu/EwLLga0 ov1si9kUxt2mOI70IYzln+6lYHDFmmv4zwilxHWR3rCqVQIc3NCqIme0X344Az1JH2Mt b84EtFVecuqExJYYTWiftdgssbJGVKNTxYLBp/TecvpVagPBI09uqh5ye3LG4ULB3dr8 yw3pU2mvCv09mrn+zIMTrkzjhf0KBb7OpXIccCzMxiqKk4NS2ptscihuVrHDiwnYBwpm sTrA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:date:from:to:cc:subject:message-id :references:mime-version:content-disposition:in-reply-to:user-agent; bh=ymcnxyEKysJE7iQ2uJixU3gTQtDQXicPQlnEGAZOwyo=; b=Tb8fIezbu4FKjZ1q40+vY/fv3A2XqyH8QC2xpncUMrzj1ksxdxkZjKYEnVlSLGwAvZ LcsqfcqYLDK6f6CN3hnK5hqAPXJ/z85pjB2MPxe6b2j+B/POfSHDgJQvVaRkiz2T/sZt K5AnzmT0zAZeRh6XyKbK/90pUeTaMYcTA4akkYiEvi/Rk7cwRpi0XDSzi/96mu1NkoJ8 YFxBVgr6sCW7j0QnAB/qmx5qd7s6hR0EIepH1BjkvIkWOo6faC3wqUXVAJ17b8Qi9qEM +SoJdDWuLprJ7okujzhO2UXZ/FFkH+7h2kLztovUMQoxvK9hW4wGYh6WgqSGUtVko4DZ n/7Q== X-Gm-Message-State: AElRT7G3ZgHEf/L9GaS4lFudxc+UKKzkiBECs3VQdcKGV5s8rPBZszOn orLcs4p1bhOEGyTbtNGCmnEJCw== X-Received: by 10.167.128.2 with SMTP id j2mr348509pfi.179.1521062210056; Wed, 14 Mar 2018 14:16:50 -0700 (PDT) Received: from localhost (108-223-40-66.lightspeed.sntcca.sbcglobal.net. [108.223.40.66]) by smtp.gmail.com with ESMTPSA id y27sm7155682pfi.156.2018.03.14.14.16.48 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 14 Mar 2018 14:16:48 -0700 (PDT) Date: Wed, 14 Mar 2018 14:16:47 -0700 From: Guenter Roeck To: Eddie James Cc: linux-hwmon@vger.kernel.org, linux-kernel@vger.kernel.org, jdelvare@suse.com, joel@jms.id.au, Christopher Bostic , Andrew Jeffery Subject: Re: [PATCH v2 2/2] hwmon: (ucd9000) Add debugfs attributes to provide mfr_status Message-ID: <20180314211647.GA30889@roeck-us.net> References: <1520974749-5372-1-git-send-email-eajames@linux.vnet.ibm.com> <1520974749-5372-3-git-send-email-eajames@linux.vnet.ibm.com> <20180314191927.GA25390@roeck-us.net> <3ee769ea-03b9-f614-1423-bfd2ec840c2e@linux.vnet.ibm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <3ee769ea-03b9-f614-1423-bfd2ec840c2e@linux.vnet.ibm.com> User-Agent: Mutt/1.5.24 (2015-08-30) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, Mar 14, 2018 at 02:46:55PM -0500, Eddie James wrote: > > > On 03/14/2018 02:19 PM, Guenter Roeck wrote: > >On Tue, Mar 13, 2018 at 03:59:09PM -0500, Eddie James wrote: > >>From: Christopher Bostic > >> > >>Expose the gpiN_fault fields of mfr_status as individual debugfs > >>attributes. This provides a way for users to be easily notified of gpi > >>faults. Also provide the whole mfr_status register in debugfs. > >> > >>Signed-off-by: Christopher Bostic > >>Signed-off-by: Andrew Jeffery > >>Signed-off-by: Eddie James > >>--- > >> drivers/hwmon/pmbus/ucd9000.c | 140 +++++++++++++++++++++++++++++++++++++++++- > >> 1 file changed, 139 insertions(+), 1 deletion(-) > >> > >>diff --git a/drivers/hwmon/pmbus/ucd9000.c b/drivers/hwmon/pmbus/ucd9000.c > >>index 023fb9e..b073d8e 100644 > >>--- a/drivers/hwmon/pmbus/ucd9000.c > >>+++ b/drivers/hwmon/pmbus/ucd9000.c > >>@@ -19,6 +19,7 @@ > >> * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. > >> */ > >>+#include > >> #include > >> #include > >> #include > >>@@ -36,6 +37,7 @@ > >> #define UCD9000_NUM_PAGES 0xd6 > >> #define UCD9000_FAN_CONFIG_INDEX 0xe7 > >> #define UCD9000_FAN_CONFIG 0xe8 > >>+#define UCD9000_MFR_STATUS 0xf3 > >> #define UCD9000_GPIO_SELECT 0xfa > >> #define UCD9000_GPIO_CONFIG 0xfb > >> #define UCD9000_DEVICE_ID 0xfd > >>@@ -63,13 +65,22 @@ > >> #define UCD901XX_NUM_GPIOS 26 > >> #define UCD90910_NUM_GPIOS 26 > >>+#define UCD9000_DEBUGFS_NAME_LEN 24 > >>+#define UCD9000_GPI_COUNT 8 > >>+ > >> struct ucd9000_data { > >> u8 fan_data[UCD9000_NUM_FAN][I2C_SMBUS_BLOCK_MAX]; > >> struct pmbus_driver_info info; > >> struct gpio_chip gpio; > >>+ struct dentry *debugfs; > >> }; > >> #define to_ucd9000_data(_info) container_of(_info, struct ucd9000_data, info) > >>+struct ucd9000_debugfs_entry { > >>+ struct i2c_client *client; > >>+ u8 index; > >>+}; > >>+ > >> static int ucd9000_get_fan_config(struct i2c_client *client, int fan) > >> { > >> int fan_config = 0; > >>@@ -306,6 +317,124 @@ static int ucd9000_gpio_direction_output(struct gpio_chip *gc, > >> val); > >> } > >>+#if IS_ENABLED(CONFIG_DEBUG_FS) > >DEBUG_FS is bool, so #ifdef CONFIG_DEBUG_FS is fine here. > > Ok. > > > > >>+static int ucd9000_get_mfr_status(struct i2c_client *client, u8 *buffer) > >>+{ > >>+ int ret = pmbus_set_page(client, 0); > >>+ > >>+ if (ret < 0) > >>+ return ret; > >>+ > >>+ /* > >>+ * With the ucd90120 and ucd90124 devices, this command [MFR_STATUS] > >>+ * is 2 bytes long (bits 0-15). With the ucd90240 this command is 5 > >>+ * bytes long. With all other devices, it is 4 bytes long. > >>+ */ > >>+ return i2c_smbus_read_block_data(client, UCD9000_MFR_STATUS, buffer); > >>+} > >>+ > >>+static int ucd9000_debugfs_show_mfr_status_bit(void *data, u64 *val) > >>+{ > >>+ struct ucd9000_debugfs_entry *entry = data; > >>+ struct i2c_client *client = entry->client; > >>+ u8 buffer[4]; > >>+ int ret; > >>+ > >>+ /* > >>+ * This attribute is only created for devices that return 4 bytes for > >>+ * status_mfr, so it's safe to call with 4-byte buffer. > >>+ */ > >>+ ret = ucd9000_get_mfr_status(client, buffer); > >>+ if (ret < 0) > >>+ return ret; > >>+ > >>+ /* > >>+ * Attribute only created for devices with gpi fault bits at bits > >>+ * 16-23, which is the second byte of the response. > >>+ */ > >>+ *val = !!(buffer[1] & BIT(entry->index)); > >>+ > >>+ return 0; > >>+} > >>+DEFINE_DEBUGFS_ATTRIBUTE(ucd9000_debugfs_mfr_status_bit, > >>+ ucd9000_debugfs_show_mfr_status_bit, NULL, "%1lld\n"); > >>+ > >>+static ssize_t ucd9000_debugfs_read_mfr_status(struct file *file, > >>+ char __user *buf, size_t count, > >>+ loff_t *ppos) > >>+{ > >>+ struct i2c_client *client = file->private_data; > >>+ u8 buffer[5] = { 0 }; /* Need max 5 bytes for any ucd9000 chip. */ > >>+ int ret; > >>+ > >>+ ret = ucd9000_get_mfr_status(client, buffer); > >>+ if (ret < 0) > >>+ return ret; > >>+ > >>+ return simple_read_from_buffer(buf, count, ppos, buffer, ret); > >Doesn't this report the raw binary data to userspace ? The output > >should be human-readable. > > Yes, sorry I thought that was your suggestion when you mentioned hexdump > earlier... Will fix. > Sorry for the confusion. I meant a user-readable hexdump. Guenter > Thanks, > Eddie > > > > >>+} > >>+ > >>+static const struct file_operations ucd9000_debugfs_show_mfr_status_fops = { > >>+ .llseek = noop_llseek, > >>+ .read = ucd9000_debugfs_read_mfr_status, > >>+ .open = simple_open, > >>+}; > >>+ > >>+static int ucd9000_init_debugfs(struct i2c_client *client, > >>+ const struct i2c_device_id *mid, > >>+ struct ucd9000_data *data) > >>+{ > >>+ struct dentry *debugfs; > >>+ struct ucd9000_debugfs_entry *entries; > >>+ int i; > >>+ char name[UCD9000_DEBUGFS_NAME_LEN]; > >>+ > >>+ debugfs = pmbus_get_debugfs_dir(client); > >>+ if (!debugfs) > >>+ return -ENOENT; > >>+ > >>+ data->debugfs = debugfs_create_dir(client->name, debugfs); > >>+ if (!data->debugfs) > >>+ return -ENOENT; > >>+ > >>+ /* > >>+ * Of the chips this driver supports, only the UCD9090, UCD90160, > >>+ * and UCD90910 report GPI faults in their MFR_STATUS register, so only > >>+ * create the GPI fault debugfs attributes for those chips. > >>+ */ > >>+ if (mid->driver_data == ucd9090 || mid->driver_data == ucd90160 || > >>+ mid->driver_data == ucd90910) { > >>+ entries = devm_kzalloc(&client->dev, > >>+ sizeof(*entries) * UCD9000_GPI_COUNT, > >>+ GFP_KERNEL); > >>+ if (!entries) > >>+ return -ENOMEM; > >>+ > >>+ for (i = 0; i < UCD9000_GPI_COUNT; i++) { > >>+ entries[i].client = client; > >>+ entries[i].index = i; > >>+ scnprintf(name, UCD9000_DEBUGFS_NAME_LEN, > >>+ "gpi%d_alarm", i + 1); > >>+ debugfs_create_file(name, 0444, data->debugfs, > >>+ &entries[i], > >>+ &ucd9000_debugfs_mfr_status_bit); > >>+ } > >>+ } > >>+ > >>+ scnprintf(name, UCD9000_DEBUGFS_NAME_LEN, "mfr_status"); > >>+ debugfs_create_file(name, 0444, data->debugfs, client, > >>+ &ucd9000_debugfs_show_mfr_status_fops); > >>+ > >>+ return 0; > >>+} > >>+#else > >>+static int ucd9000_init_debugfs(struct i2c_client *client, > >>+ struct ucd9000_data *data) > >>+{ > >>+ return 0; > >>+} > >>+#endif /* IS_ENABLED(CONFIG_DEBUG_FS) */ > >>+ > >> static int ucd9000_probe(struct i2c_client *client, > >> const struct i2c_device_id *id) > >> { > >>@@ -464,7 +593,16 @@ static int ucd9000_probe(struct i2c_client *client, > >> ret); > >> } > >>- return pmbus_do_probe(client, mid, info); > >>+ ret = pmbus_do_probe(client, mid, info); > >>+ if (ret) > >>+ return ret; > >>+ > >>+ ret = ucd9000_init_debugfs(client, mid, data); > >>+ if (ret) > >>+ dev_warn(&client->dev, "Failed to register debugfs: %d\n", > >>+ ret); > >>+ > >>+ return 0; > >> } > >> /* This is the driver that will be inserted */ > >>-- > >>1.8.3.1 > >> >