On 19.03.2022 18:30, Laurent Pinchart wrote: > It's useful to dumb the value of registers for debugging purpose. Add > two debugfs files to dump key core and ISP registers. > > Signed-off-by: Laurent Pinchart <laurent.pinchart@xxxxxxxxxxxxxxxx> > Signed-off-by: Paul Elder <paul.elder@xxxxxxxxxxxxxxxx> > --- > .../platform/rockchip/rkisp1/rkisp1-debug.c | 72 +++++++++++++++++++ > 1 file changed, 72 insertions(+) > > diff --git a/drivers/media/platform/rockchip/rkisp1/rkisp1-debug.c b/drivers/media/platform/rockchip/rkisp1/rkisp1-debug.c > index da3ed0ab697a..97be529a74e8 100644 > --- a/drivers/media/platform/rockchip/rkisp1/rkisp1-debug.c > +++ b/drivers/media/platform/rockchip/rkisp1/rkisp1-debug.c > @@ -17,6 +17,70 @@ > #include "rkisp1-common.h" > #include "rkisp1-regs.h" > > +struct rkisp1_debug_register { > + u32 offset; I'd call it 'reg' or 'address' instead of 'offset' since it is really what we call reg > + const char * const name; > +}; > + > +#define RKISP1_DEBUG_REG(name) { RKISP1_CIF_##name, #name } > + > +static int rkisp1_debug_dump_regs(struct seq_file *m, > + const struct rkisp1_debug_register *regs) > +{ > + struct rkisp1_device *rkisp1 = m->private; > + u32 val; > + int ret; > + > + ret = pm_runtime_get_if_in_use(rkisp1->dev); > + if (ret) > + return ret; Same comment as in the data collection patch, should it be if (ret <= 0) return ret; ? Thanks, Dafna > + > + for ( ; regs->name; ++regs) { > + val = rkisp1_read(rkisp1, regs->offset); > + seq_printf(m, "%14s: 0x%08x\n", regs->name, val); > + } > + > + pm_runtime_put(rkisp1->dev); > + > + return 0; > +} > + > +static int rkisp1_debug_dump_core_regs_show(struct seq_file *m, void *p) > +{ > + static const struct rkisp1_debug_register registers[] = { > + RKISP1_DEBUG_REG(VI_CCL), > + RKISP1_DEBUG_REG(VI_ICCL), > + RKISP1_DEBUG_REG(VI_IRCL), > + RKISP1_DEBUG_REG(VI_DPCL), > + RKISP1_DEBUG_REG(MI_CTRL), > + RKISP1_DEBUG_REG(MI_BYTE_CNT), > + RKISP1_DEBUG_REG(MI_CTRL_SHD), > + RKISP1_DEBUG_REG(MI_RIS), > + RKISP1_DEBUG_REG(MI_STATUS), > + RKISP1_DEBUG_REG(MI_DMA_CTRL), > + RKISP1_DEBUG_REG(MI_DMA_STATUS), > + { /* Sentinel */ }, > + }; > + > + return rkisp1_debug_dump_regs(m, registers); > +} > +DEFINE_SHOW_ATTRIBUTE(rkisp1_debug_dump_core_regs); > + > +static int rkisp1_debug_dump_isp_regs_show(struct seq_file *m, void *p) > +{ > + static const struct rkisp1_debug_register registers[] = { > + RKISP1_DEBUG_REG(ISP_CTRL), > + RKISP1_DEBUG_REG(ISP_ACQ_PROP), > + RKISP1_DEBUG_REG(ISP_FLAGS_SHD), > + RKISP1_DEBUG_REG(ISP_RIS), > + RKISP1_DEBUG_REG(ISP_ERR), > + { /* Sentinel */ }, > + }; > + > + return rkisp1_debug_dump_regs(m, registers); > +} > +DEFINE_SHOW_ATTRIBUTE(rkisp1_debug_dump_isp_regs); > + > #define RKISP1_DEBUG_DATA_COUNT_BINS 32 > #define RKISP1_DEBUG_DATA_COUNT_STEP (4096 / RKISP1_DEBUG_DATA_COUNT_BINS) > > @@ -68,6 +132,7 @@ DEFINE_SHOW_ATTRIBUTE(rkisp1_debug_input_status); > void rkisp1_debug_init(struct rkisp1_device *rkisp1) > { > struct rkisp1_debug *debug = &rkisp1->debug; > + struct dentry *regs_dir; > > debug->debugfs_dir = debugfs_create_dir(dev_name(rkisp1->dev), NULL); > > @@ -96,6 +161,13 @@ void rkisp1_debug_init(struct rkisp1_device *rkisp1) > &debug->frame_drop[RKISP1_SELFPATH]); > debugfs_create_file("input_status", 0444, debug->debugfs_dir, rkisp1, > &rkisp1_debug_input_status_fops); > + > + regs_dir = debugfs_create_dir("regs", debug->debugfs_dir); > + > + debugfs_create_file("core", 0444, regs_dir, rkisp1, > + &rkisp1_debug_dump_core_regs_fops); > + debugfs_create_file("isp", 0444, regs_dir, rkisp1, > + &rkisp1_debug_dump_isp_regs_fops); > } > > void rkisp1_debug_cleanup(struct rkisp1_device *rkisp1) > -- > Regards, > > Laurent Pinchart >