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