xref: /OK3568_Linux_fs/kernel/drivers/media/platform/rockchip/ispp/procfs.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /* Copyright (c) Rockchip Electronics Co., Ltd. */
3*4882a593Smuzhiyun #include <linux/clk.h>
4*4882a593Smuzhiyun #include <linux/proc_fs.h>
5*4882a593Smuzhiyun #include <linux/sem.h>
6*4882a593Smuzhiyun #include <linux/seq_file.h>
7*4882a593Smuzhiyun #include <media/v4l2-common.h>
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun #include "dev.h"
10*4882a593Smuzhiyun #include "procfs.h"
11*4882a593Smuzhiyun #include "regs.h"
12*4882a593Smuzhiyun #include "version.h"
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun #ifdef CONFIG_PROC_FS
ispp_show(struct seq_file * p,void * v)15*4882a593Smuzhiyun static int ispp_show(struct seq_file *p, void *v)
16*4882a593Smuzhiyun {
17*4882a593Smuzhiyun 	struct rkispp_device *dev = p->private;
18*4882a593Smuzhiyun 	enum rkispp_state state = dev->ispp_sdev.state;
19*4882a593Smuzhiyun 	struct rkispp_stream *stream;
20*4882a593Smuzhiyun 	u32 val;
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun 	seq_printf(p, "%-10s Version:v%02x.%02x.%02x\n",
23*4882a593Smuzhiyun 		   dev->name,
24*4882a593Smuzhiyun 		   RKISPP_DRIVER_VERSION >> 16,
25*4882a593Smuzhiyun 		   (RKISPP_DRIVER_VERSION & 0xff00) >> 8,
26*4882a593Smuzhiyun 		   RKISPP_DRIVER_VERSION & 0x00ff);
27*4882a593Smuzhiyun 	for (val = 0; val < dev->hw_dev->clks_num; val++) {
28*4882a593Smuzhiyun 		seq_printf(p, "%-10s %ld\n",
29*4882a593Smuzhiyun 			   dev->hw_dev->match_data->clks[val],
30*4882a593Smuzhiyun 			   clk_get_rate(dev->hw_dev->clks[val]));
31*4882a593Smuzhiyun 	}
32*4882a593Smuzhiyun 	if (state != ISPP_START)
33*4882a593Smuzhiyun 		return 0;
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun 	seq_printf(p, "%-10s Cnt:%d ErrCnt:%d\n",
36*4882a593Smuzhiyun 		   "Interrupt",
37*4882a593Smuzhiyun 		   dev->isr_cnt,
38*4882a593Smuzhiyun 		   dev->isr_err_cnt);
39*4882a593Smuzhiyun 	seq_printf(p, "%-10s rkisp%d Format:%s%s Size:%dx%d (frame:%d rate:%dms delay:%dms)\n",
40*4882a593Smuzhiyun 		   "Input",
41*4882a593Smuzhiyun 		   dev->dev_id,
42*4882a593Smuzhiyun 		   (dev->isp_mode & FMT_FBC) ? "FBC" : "YUV",
43*4882a593Smuzhiyun 		   (dev->isp_mode & FMT_YUV422) ? "422" : "420",
44*4882a593Smuzhiyun 		   dev->ispp_sdev.out_fmt.width,
45*4882a593Smuzhiyun 		   dev->ispp_sdev.out_fmt.height,
46*4882a593Smuzhiyun 		   dev->stream_vdev.dbg.id,
47*4882a593Smuzhiyun 		   dev->stream_vdev.dbg.interval / 1000 / 1000,
48*4882a593Smuzhiyun 		   dev->stream_vdev.dbg.delay / 1000 / 1000);
49*4882a593Smuzhiyun 	for (val = STREAM_MB; val <= STREAM_S2; val++) {
50*4882a593Smuzhiyun 		stream = &dev->stream_vdev.stream[val];
51*4882a593Smuzhiyun 		if (!stream->streaming)
52*4882a593Smuzhiyun 			continue;
53*4882a593Smuzhiyun 		seq_printf(p, "%-10s %s Format:%c%c%c%c Size:%dx%d (frame:%d rate:%dms delay:%dms frameloss:%d)\n",
54*4882a593Smuzhiyun 			   "Output",
55*4882a593Smuzhiyun 			   stream->vnode.vdev.name,
56*4882a593Smuzhiyun 			   stream->out_fmt.pixelformat,
57*4882a593Smuzhiyun 			   stream->out_fmt.pixelformat >> 8,
58*4882a593Smuzhiyun 			   stream->out_fmt.pixelformat >> 16,
59*4882a593Smuzhiyun 			   stream->out_fmt.pixelformat >> 24,
60*4882a593Smuzhiyun 			   stream->out_fmt.width,
61*4882a593Smuzhiyun 			   stream->out_fmt.height,
62*4882a593Smuzhiyun 			   stream->dbg.id,
63*4882a593Smuzhiyun 			   stream->dbg.interval / 1000 / 1000,
64*4882a593Smuzhiyun 			   stream->dbg.delay / 1000 / 1000,
65*4882a593Smuzhiyun 			   stream->dbg.frameloss);
66*4882a593Smuzhiyun 	}
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun 	val = rkispp_read(dev, RKISPP_TNR_CORE_CTRL);
69*4882a593Smuzhiyun 	seq_printf(p, "%-10s %s(0x%x) (mode: %s) (global gain: %s) (frame:%d time:%dms %s) CNT:0x%x STATE:0x%x\n",
70*4882a593Smuzhiyun 		   "TNR",
71*4882a593Smuzhiyun 		   (val & 1) ? "ON" : "OFF", val,
72*4882a593Smuzhiyun 		   (val & SW_TNR_MODE) ? "3to1" : "2to1",
73*4882a593Smuzhiyun 		   (val & SW_TNR_GLB_GAIN_EN) ? "enable" : "disable",
74*4882a593Smuzhiyun 		   dev->stream_vdev.tnr.dbg.id,
75*4882a593Smuzhiyun 		   dev->stream_vdev.tnr.dbg.interval / 1000 / 1000,
76*4882a593Smuzhiyun 		   dev->stream_vdev.tnr.is_end ? "idle" : "working",
77*4882a593Smuzhiyun 		   rkispp_read(dev, RKISPP_TNR_TILE_CNT),
78*4882a593Smuzhiyun 		   rkispp_read(dev, RKISPP_TNR_STATE));
79*4882a593Smuzhiyun 	val = rkispp_read(dev, RKISPP_NR_UVNR_CTRL_PARA);
80*4882a593Smuzhiyun 	seq_printf(p, "%-10s %s(0x%x) (external gain: %s) (frame:%d time:%dms %s) 0x%x:0x%x 0x%x:0x%x\n",
81*4882a593Smuzhiyun 		   "NR",
82*4882a593Smuzhiyun 		   (val & 1) ? "ON" : "OFF", val,
83*4882a593Smuzhiyun 		   (val & SW_NR_GAIN_BYPASS) ? "disable" : "enable",
84*4882a593Smuzhiyun 		   dev->stream_vdev.nr.dbg.id,
85*4882a593Smuzhiyun 		   dev->stream_vdev.nr.dbg.interval / 1000 / 1000,
86*4882a593Smuzhiyun 		   dev->stream_vdev.nr.is_end ? "idle" : "working",
87*4882a593Smuzhiyun 		   RKISPP_NR_BLOCK_CNT, rkispp_read(dev, RKISPP_NR_BLOCK_CNT),
88*4882a593Smuzhiyun 		   RKISPP_NR_BUFFER_READY, rkispp_read(dev, RKISPP_NR_BUFFER_READY));
89*4882a593Smuzhiyun 	val = rkispp_read(dev, RKISPP_SHARP_CORE_CTRL);
90*4882a593Smuzhiyun 	seq_printf(p, "%-10s %s(0x%x) (YNR input filter: %s) (local ratio: %s) 0x%x:0x%x\n",
91*4882a593Smuzhiyun 		   "SHARP",
92*4882a593Smuzhiyun 		   (val & 1) ? "ON" : "OFF", val,
93*4882a593Smuzhiyun 		   (val & SW_SHP_YIN_FLT_EN) ? "ON" : "OFF",
94*4882a593Smuzhiyun 		   (val & SW_SHP_ALPHA_ADP_EN) ? "ON" : "OFF",
95*4882a593Smuzhiyun 		   RKISPP_SHARP_TILE_IDX, rkispp_read(dev, RKISPP_SHARP_TILE_IDX));
96*4882a593Smuzhiyun 	val = rkispp_read(dev, RKISPP_FEC_CORE_CTRL);
97*4882a593Smuzhiyun 	seq_printf(p, "%-10s %s(0x%x) (frame:%d time:%dms %s) 0x%x:0x%x\n",
98*4882a593Smuzhiyun 		   "FEC",
99*4882a593Smuzhiyun 		   (val & 1) ? "ON" : "OFF", val,
100*4882a593Smuzhiyun 		   dev->stream_vdev.fec.dbg.id,
101*4882a593Smuzhiyun 		   dev->stream_vdev.fec.dbg.interval / 1000 / 1000,
102*4882a593Smuzhiyun 		   dev->stream_vdev.fec.is_end ? "idle" : "working",
103*4882a593Smuzhiyun 		   RKISPP_FEC_DMA_STATUS, rkispp_read(dev, RKISPP_FEC_DMA_STATUS));
104*4882a593Smuzhiyun 	val = rkispp_read(dev, RKISPP_ORB_CORE_CTRL);
105*4882a593Smuzhiyun 	seq_printf(p, "%-10s %s(0x%x)\n",
106*4882a593Smuzhiyun 		   "ORB",
107*4882a593Smuzhiyun 		   (val & 1) ? "ON" : "OFF", val);
108*4882a593Smuzhiyun 	seq_printf(p, "%-10s %s Cnt:%d\n",
109*4882a593Smuzhiyun 		   "Monitor",
110*4882a593Smuzhiyun 		   dev->stream_vdev.monitor.is_en ? "ON" : "OFF",
111*4882a593Smuzhiyun 		   dev->stream_vdev.monitor.retry);
112*4882a593Smuzhiyun 	return 0;
113*4882a593Smuzhiyun }
114*4882a593Smuzhiyun 
ispp_open(struct inode * inode,struct file * file)115*4882a593Smuzhiyun static int ispp_open(struct inode *inode, struct file *file)
116*4882a593Smuzhiyun {
117*4882a593Smuzhiyun 	struct rkispp_device *data = PDE_DATA(inode);
118*4882a593Smuzhiyun 
119*4882a593Smuzhiyun 	return single_open(file, ispp_show, data);
120*4882a593Smuzhiyun }
121*4882a593Smuzhiyun 
122*4882a593Smuzhiyun static const struct proc_ops ops = {
123*4882a593Smuzhiyun 	.proc_open		= ispp_open,
124*4882a593Smuzhiyun 	.proc_read		= seq_read,
125*4882a593Smuzhiyun 	.proc_lseek		= seq_lseek,
126*4882a593Smuzhiyun 	.proc_release		= single_release,
127*4882a593Smuzhiyun };
128*4882a593Smuzhiyun 
rkispp_proc_init(struct rkispp_device * dev)129*4882a593Smuzhiyun int rkispp_proc_init(struct rkispp_device *dev)
130*4882a593Smuzhiyun {
131*4882a593Smuzhiyun 	dev->procfs = proc_create_data(dev->name, 0, NULL, &ops, dev);
132*4882a593Smuzhiyun 	if (!dev->procfs)
133*4882a593Smuzhiyun 		return -EINVAL;
134*4882a593Smuzhiyun 	return 0;
135*4882a593Smuzhiyun }
136*4882a593Smuzhiyun 
rkispp_proc_cleanup(struct rkispp_device * dev)137*4882a593Smuzhiyun void rkispp_proc_cleanup(struct rkispp_device *dev)
138*4882a593Smuzhiyun {
139*4882a593Smuzhiyun 	if (dev->procfs)
140*4882a593Smuzhiyun 		remove_proc_entry(dev->name, NULL);
141*4882a593Smuzhiyun 	dev->procfs = NULL;
142*4882a593Smuzhiyun }
143*4882a593Smuzhiyun #endif /* CONFIG_PROC_FS */
144