Skip to content

Commit 8378449

Browse files
fancerbroonie
authored andcommitted
spi: dw: Use regset32 DebugFS method to create regdump file
DebugFS kernel interface provides a dedicated method to create the registers dump file. Use it instead of creating a generic DebugFS file with manually written read callback function. Signed-off-by: Serge Semin <[email protected]> Reviewed-by: Andy Shevchenko <[email protected]> Cc: Georgy Vlasov <[email protected]> Cc: Ramil Zaripov <[email protected]> Cc: Alexey Malahov <[email protected]> Cc: Thomas Bogendoerfer <[email protected]> Cc: Arnd Bergmann <[email protected]> Cc: Feng Tang <[email protected]> Cc: Rob Herring <[email protected]> Cc: [email protected] Cc: [email protected] Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Mark Brown <[email protected]>
1 parent 0fdad59 commit 8378449

File tree

2 files changed

+28
-60
lines changed

2 files changed

+28
-60
lines changed

drivers/spi/spi-dw-core.c

Lines changed: 26 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -29,66 +29,29 @@ struct chip_data {
2929
};
3030

3131
#ifdef CONFIG_DEBUG_FS
32-
#define SPI_REGS_BUFSIZE 1024
33-
static ssize_t dw_spi_show_regs(struct file *file, char __user *user_buf,
34-
size_t count, loff_t *ppos)
35-
{
36-
struct dw_spi *dws = file->private_data;
37-
char *buf;
38-
u32 len = 0;
39-
ssize_t ret;
40-
41-
buf = kzalloc(SPI_REGS_BUFSIZE, GFP_KERNEL);
42-
if (!buf)
43-
return 0;
44-
45-
len += scnprintf(buf + len, SPI_REGS_BUFSIZE - len,
46-
"%s registers:\n", dev_name(&dws->master->dev));
47-
len += scnprintf(buf + len, SPI_REGS_BUFSIZE - len,
48-
"=================================\n");
49-
len += scnprintf(buf + len, SPI_REGS_BUFSIZE - len,
50-
"CTRLR0: \t0x%08x\n", dw_readl(dws, DW_SPI_CTRLR0));
51-
len += scnprintf(buf + len, SPI_REGS_BUFSIZE - len,
52-
"CTRLR1: \t0x%08x\n", dw_readl(dws, DW_SPI_CTRLR1));
53-
len += scnprintf(buf + len, SPI_REGS_BUFSIZE - len,
54-
"SSIENR: \t0x%08x\n", dw_readl(dws, DW_SPI_SSIENR));
55-
len += scnprintf(buf + len, SPI_REGS_BUFSIZE - len,
56-
"SER: \t\t0x%08x\n", dw_readl(dws, DW_SPI_SER));
57-
len += scnprintf(buf + len, SPI_REGS_BUFSIZE - len,
58-
"BAUDR: \t\t0x%08x\n", dw_readl(dws, DW_SPI_BAUDR));
59-
len += scnprintf(buf + len, SPI_REGS_BUFSIZE - len,
60-
"TXFTLR: \t0x%08x\n", dw_readl(dws, DW_SPI_TXFTLR));
61-
len += scnprintf(buf + len, SPI_REGS_BUFSIZE - len,
62-
"RXFTLR: \t0x%08x\n", dw_readl(dws, DW_SPI_RXFTLR));
63-
len += scnprintf(buf + len, SPI_REGS_BUFSIZE - len,
64-
"TXFLR: \t\t0x%08x\n", dw_readl(dws, DW_SPI_TXFLR));
65-
len += scnprintf(buf + len, SPI_REGS_BUFSIZE - len,
66-
"RXFLR: \t\t0x%08x\n", dw_readl(dws, DW_SPI_RXFLR));
67-
len += scnprintf(buf + len, SPI_REGS_BUFSIZE - len,
68-
"SR: \t\t0x%08x\n", dw_readl(dws, DW_SPI_SR));
69-
len += scnprintf(buf + len, SPI_REGS_BUFSIZE - len,
70-
"IMR: \t\t0x%08x\n", dw_readl(dws, DW_SPI_IMR));
71-
len += scnprintf(buf + len, SPI_REGS_BUFSIZE - len,
72-
"ISR: \t\t0x%08x\n", dw_readl(dws, DW_SPI_ISR));
73-
len += scnprintf(buf + len, SPI_REGS_BUFSIZE - len,
74-
"DMACR: \t\t0x%08x\n", dw_readl(dws, DW_SPI_DMACR));
75-
len += scnprintf(buf + len, SPI_REGS_BUFSIZE - len,
76-
"DMATDLR: \t0x%08x\n", dw_readl(dws, DW_SPI_DMATDLR));
77-
len += scnprintf(buf + len, SPI_REGS_BUFSIZE - len,
78-
"DMARDLR: \t0x%08x\n", dw_readl(dws, DW_SPI_DMARDLR));
79-
len += scnprintf(buf + len, SPI_REGS_BUFSIZE - len,
80-
"=================================\n");
81-
82-
ret = simple_read_from_buffer(user_buf, count, ppos, buf, len);
83-
kfree(buf);
84-
return ret;
32+
33+
#define DW_SPI_DBGFS_REG(_name, _off) \
34+
{ \
35+
.name = _name, \
36+
.offset = _off, \
8537
}
8638

87-
static const struct file_operations dw_spi_regs_ops = {
88-
.owner = THIS_MODULE,
89-
.open = simple_open,
90-
.read = dw_spi_show_regs,
91-
.llseek = default_llseek,
39+
static const struct debugfs_reg32 dw_spi_dbgfs_regs[] = {
40+
DW_SPI_DBGFS_REG("CTRLR0", DW_SPI_CTRLR0),
41+
DW_SPI_DBGFS_REG("CTRLR1", DW_SPI_CTRLR1),
42+
DW_SPI_DBGFS_REG("SSIENR", DW_SPI_SSIENR),
43+
DW_SPI_DBGFS_REG("SER", DW_SPI_SER),
44+
DW_SPI_DBGFS_REG("BAUDR", DW_SPI_BAUDR),
45+
DW_SPI_DBGFS_REG("TXFTLR", DW_SPI_TXFTLR),
46+
DW_SPI_DBGFS_REG("RXFTLR", DW_SPI_RXFTLR),
47+
DW_SPI_DBGFS_REG("TXFLR", DW_SPI_TXFLR),
48+
DW_SPI_DBGFS_REG("RXFLR", DW_SPI_RXFLR),
49+
DW_SPI_DBGFS_REG("SR", DW_SPI_SR),
50+
DW_SPI_DBGFS_REG("IMR", DW_SPI_IMR),
51+
DW_SPI_DBGFS_REG("ISR", DW_SPI_ISR),
52+
DW_SPI_DBGFS_REG("DMACR", DW_SPI_DMACR),
53+
DW_SPI_DBGFS_REG("DMATDLR", DW_SPI_DMATDLR),
54+
DW_SPI_DBGFS_REG("DMARDLR", DW_SPI_DMARDLR),
9255
};
9356

9457
static int dw_spi_debugfs_init(struct dw_spi *dws)
@@ -100,8 +63,11 @@ static int dw_spi_debugfs_init(struct dw_spi *dws)
10063
if (!dws->debugfs)
10164
return -ENOMEM;
10265

103-
debugfs_create_file("registers", S_IFREG | S_IRUGO,
104-
dws->debugfs, (void *)dws, &dw_spi_regs_ops);
66+
dws->regset.regs = dw_spi_dbgfs_regs;
67+
dws->regset.nregs = ARRAY_SIZE(dw_spi_dbgfs_regs);
68+
dws->regset.base = dws->regs;
69+
debugfs_create_regset32("registers", 0400, dws->debugfs, &dws->regset);
70+
10571
return 0;
10672
}
10773

drivers/spi/spi-dw.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#define DW_SPI_HEADER_H
44

55
#include <linux/completion.h>
6+
#include <linux/debugfs.h>
67
#include <linux/irqreturn.h>
78
#include <linux/io.h>
89
#include <linux/scatterlist.h>
@@ -152,6 +153,7 @@ struct dw_spi {
152153

153154
#ifdef CONFIG_DEBUG_FS
154155
struct dentry *debugfs;
156+
struct debugfs_regset32 regset;
155157
#endif
156158
};
157159

0 commit comments

Comments
 (0)