Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754049AbbGIVNn (ORCPT ); Thu, 9 Jul 2015 17:13:43 -0400 Received: from mail.savoirfairelinux.com ([209.172.62.77]:55151 "EHLO mail.savoirfairelinux.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753503AbbGIVNf (ORCPT ); Thu, 9 Jul 2015 17:13:35 -0400 From: Vivien Didelot To: netdev@vger.kernel.org Cc: "David S. Miller" , Guenter Roeck , Andrew Lunn , linux-kernel@vger.kernel.org, kernel@savoirfairelinux.com, Vivien Didelot Subject: [PATCH v2] net: dsa: mv88e6xxx: add write access to debugfs regs file Date: Thu, 9 Jul 2015 17:13:29 -0400 Message-Id: <1436476409-5033-1-git-send-email-vivien.didelot@savoirfairelinux.com> X-Mailer: git-send-email 2.4.5 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2755 Lines: 84 Allow write access to the regs file in the debugfs interface, with the following parameters: echo > regs Where "name" is the register name (as shown in the header row), "reg" is the register address (as shown in the first column) and "value" is the 16-bit value. e.g.: echo GLOBAL 1a 5550 > regs Signed-off-by: Vivien Didelot --- drivers/net/dsa/mv88e6xxx.c | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/drivers/net/dsa/mv88e6xxx.c b/drivers/net/dsa/mv88e6xxx.c index 8c130c0..9d14b1a 100644 --- a/drivers/net/dsa/mv88e6xxx.c +++ b/drivers/net/dsa/mv88e6xxx.c @@ -1648,6 +1648,38 @@ static int mv88e6xxx_regs_show(struct seq_file *s, void *p) return 0; } +static ssize_t mv88e6xxx_regs_write(struct file *file, const char __user *buf, + size_t count, loff_t *ppos) +{ + struct seq_file *s = file->private_data; + struct dsa_switch *ds = s->private; + struct mv88e6xxx_priv_state *ps = ds_to_priv(ds); + char name[32] = { 0 }; + unsigned int port, reg, val; + int ret; + + if (count > sizeof(name) - 1) + return -EINVAL; + + ret = sscanf(buf, "%s %x %x", name, ®, &val); + if (ret != 3) + return -EINVAL; + + if (reg > 0x1f || val > 0xffff) + return -ERANGE; + + if (strcasecmp(name, "GLOBAL") == 0) + ret = mv88e6xxx_reg_write(ds, REG_GLOBAL, reg, val); + else if (strcasecmp(name, "GLOBAL2") == 0) + ret = mv88e6xxx_reg_write(ds, REG_GLOBAL2, reg, val); + else if (kstrtouint(name, 10, &port) == 0 && port < ps->num_ports) + ret = mv88e6xxx_reg_write(ds, REG_PORT(port), reg, val); + else + return -EINVAL; + + return ret < 0 ? ret : count; +} + static int mv88e6xxx_regs_open(struct inode *inode, struct file *file) { return single_open(file, mv88e6xxx_regs_show, inode->i_private); @@ -1656,6 +1688,7 @@ static int mv88e6xxx_regs_open(struct inode *inode, struct file *file) static const struct file_operations mv88e6xxx_regs_fops = { .open = mv88e6xxx_regs_open, .read = seq_read, + .write = mv88e6xxx_regs_write, .llseek = no_llseek, .release = single_release, .owner = THIS_MODULE, @@ -1895,7 +1928,7 @@ int mv88e6xxx_setup_common(struct dsa_switch *ds) ps->dbgfs = debugfs_create_dir(name, NULL); kfree(name); - debugfs_create_file("regs", S_IRUGO, ps->dbgfs, ds, + debugfs_create_file("regs", S_IRUGO | S_IWUSR, ps->dbgfs, ds, &mv88e6xxx_regs_fops); debugfs_create_file("atu", S_IRUGO, ps->dbgfs, ds, -- 2.4.5 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/