]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commitdiff
mfd: ab8500-debugfs: add debugfs node to read all registers
authorMian Yousaf Kaukab <mian.yousaf.kaukab@stericsson.com>
Thu, 26 Jan 2012 14:39:20 +0000 (15:39 +0100)
committerLee Jones <lee.jones@linaro.org>
Mon, 4 Feb 2013 08:31:45 +0000 (08:31 +0000)
Update the ab8500_registers_print() to reuse it from multiple places.

Signed-off-by: Lee Jones <lee.jones@linaro.org>
Signed-off-by: Mian Yousaf Kaukab <mian.yousaf.kaukab@stericsson.com>
Reviewed-by: Linus WALLEIJ <linus.walleij@stericsson.com>
Reviewed-by: Jonas ABERG <jonas.aberg@stericsson.com>
drivers/mfd/ab8500-debugfs.c

index 226d751d7e5104c31f16d7eab807f074f9c1d2a6..cd3cee814fb763bba3cf161e9181cf2597aaa5fc 100644 (file)
@@ -495,15 +495,12 @@ static irqreturn_t ab8500_debug_handler(int irq, void *data)
        return IRQ_HANDLED;
 }
 
-static int ab8500_registers_print(struct seq_file *s, void *p)
+/* Prints to seq_file or log_buf */
+static int ab8500_registers_print(struct device *dev, u32 bank,
+                               struct seq_file *s)
 {
-       struct device *dev = s->private;
        unsigned int i;
-       u32 bank = debug_bank;
-
-       seq_printf(s, AB8500_NAME_STRING " register values:\n");
 
-       seq_printf(s, " bank %u:\n", bank);
        for (i = 0; i < debug_ranges[bank].num_ranges; i++) {
                u32 reg;
 
@@ -520,22 +517,42 @@ static int ab8500_registers_print(struct seq_file *s, void *p)
                                return err;
                        }
 
-                       err = seq_printf(s, "  [%u/0x%02X]: 0x%02X\n", bank,
-                               reg, value);
-                       if (err < 0) {
-                               dev_err(dev, "seq_printf overflow\n");
-                               /* Error is not returned here since
-                                * the output is wanted in any case */
-                               return 0;
+                       if (s) {
+                               err = seq_printf(s, "  [%u/0x%02X]: 0x%02X\n",
+                                       bank, reg, value);
+                               if (err < 0) {
+                                       dev_err(dev,
+                                       "seq_printf overflow bank=%d reg=%d\n",
+                                               bank, reg);
+                                       /* Error is not returned here since
+                                        * the output is wanted in any case */
+                                       return 0;
+                               }
+                       } else {
+                               printk(KERN_INFO" [%u/0x%02X]: 0x%02X\n", bank,
+                                       reg, value);
                        }
                }
        }
        return 0;
 }
 
+static int ab8500_print_bank_registers(struct seq_file *s, void *p)
+{
+       struct device *dev = s->private;
+       u32 bank = debug_bank;
+
+       seq_printf(s, AB8500_NAME_STRING " register values:\n");
+
+       seq_printf(s, " bank %u:\n", bank);
+
+       ab8500_registers_print(dev, bank, s);
+       return 0;
+}
+
 static int ab8500_registers_open(struct inode *inode, struct file *file)
 {
-       return single_open(file, ab8500_registers_print, inode->i_private);
+       return single_open(file, ab8500_print_bank_registers, inode->i_private);
 }
 
 static const struct file_operations ab8500_registers_fops = {
@@ -546,6 +563,51 @@ static const struct file_operations ab8500_registers_fops = {
        .owner = THIS_MODULE,
 };
 
+static int ab8500_print_all_banks(struct seq_file *s, void *p)
+{
+       struct device *dev = s->private;
+       unsigned int i;
+       int err;
+
+       seq_printf(s, AB8500_NAME_STRING " register values:\n");
+
+       for (i = 1; i < AB8500_NUM_BANKS; i++) {
+               err = seq_printf(s, " bank %u:\n", i);
+               if (err < 0)
+                       dev_err(dev, "seq_printf overflow, bank=%d\n", i);
+
+               ab8500_registers_print(dev, i, s);
+       }
+       return 0;
+}
+
+static int ab8500_all_banks_open(struct inode *inode, struct file *file)
+{
+       struct seq_file *s;
+       int err;
+
+       err = single_open(file, ab8500_print_all_banks, inode->i_private);
+       if (!err) {
+               /* Default buf size in seq_read is not enough */
+               s = (struct seq_file *)file->private_data;
+               s->size = (PAGE_SIZE * 2);
+               s->buf = kmalloc(s->size, GFP_KERNEL);
+               if (!s->buf) {
+                       single_release(inode, file);
+                       err = -ENOMEM;
+               }
+       }
+       return err;
+}
+
+static const struct file_operations ab8500_all_banks_fops = {
+       .open = ab8500_all_banks_open,
+       .read = seq_read,
+       .llseek = seq_lseek,
+       .release = single_release,
+       .owner = THIS_MODULE,
+};
+
 static int ab8500_bank_print(struct seq_file *s, void *p)
 {
        return seq_printf(s, "%d\n", debug_bank);
@@ -1477,6 +1539,11 @@ static int ab8500_debug_probe(struct platform_device *plf)
        if (!file)
                goto err;
 
+       file = debugfs_create_file("all-banks", S_IRUGO,
+           ab8500_dir, &plf->dev, &ab8500_all_banks_fops);
+       if (!file)
+               goto err;
+
        file = debugfs_create_file("register-bank", (S_IRUGO | S_IWUSR),
            ab8500_dir, &plf->dev, &ab8500_bank_fops);
        if (!file)