mfd: ab8500-debugfs: add debugfs node to read all registers

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>
This commit is contained in:
Mian Yousaf Kaukab 2012-01-26 15:39:20 +01:00 committed by Lee Jones
parent 40c064e43e
commit 42002c6de9
1 changed files with 81 additions and 14 deletions

View 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)