hc
2023-12-11 6778948f9de86c3cfaf36725a7c87dcff9ba247f
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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
/* SPDX-License-Identifier: GPL-2.0 */
/*
 * Rockchip Vehicle driver
 *
 * Copyright (C) 2022 Rockchip Electronics Co., Ltd.
 */
#ifndef __VEHICLE_CIF_H
#define __VEHICLE_CIF_H
 
#include "vehicle_cfg.h"
#include "vehicle_cif_regs.h"
#include "../../../media/platform/rockchip/cif/dev.h"
#include <linux/dma-mapping.h>
 
enum vehicle_rkcif_chip_id {
   CHIP_RK3568_VEHICLE_CIF = 0x0,
   CHIP_RK3588_VEHICLE_CIF,
   CHIP_RK3562_VEHICLE_CIF,
};
 
enum rkcif_csi_host_idx {
   RKCIF_MIPI0_CSI2 = 0x0,
   RKCIF_MIPI1_CSI2,
   RKCIF_MIPI2_CSI2,
   RKCIF_MIPI3_CSI2,
   RKCIF_MIPI4_CSI2,
   RKCIF_MIPI5_CSI2,
};
 
struct vehicle_rkcif_dummy_buffer {
   void *vaddr;
   dma_addr_t dma_addr;
   u32 size;
};
 
struct rk_cif_clk {
   /************clk************/
   struct clk    *clks[RKCIF_MAX_BUS_CLK];
   struct clk    *xvclk;
   int        clks_num;
   /************reset************/
   struct reset_control    *cif_rst[RKCIF_MAX_RESET];
   int        rsts_num;
   /*  spinlock_t lock; */
   bool        on;
};
 
struct rk_cif_irqinfo {
   unsigned int irq;
   unsigned long cifirq_idx;
   unsigned long cifirq_normal_idx;
   unsigned long cifirq_abnormal_idx;
   unsigned long dmairq_idx;
 
   /* @csi_overflow_cnt: count of csi overflow irq
    * @csi_bwidth_lack_cnt: count of csi bandwidth lack irq
    * @dvp_bus_err_cnt: count of dvp bus err irq
    * @dvp_overflow_cnt: count dvp overflow irq
    * @dvp_line_err_cnt: count dvp line err irq
    * @dvp_pix_err_cnt: count dvp pix err irq
    * @all_frm_end_cnt: raw frame end count
    * @all_err_cnt: all err count
    * @
    */
 
   u64 csi_overflow_cnt;
   u64 csi_bwidth_lack_cnt;
   u64 dvp_bus_err_cnt;
   u64 dvp_overflow_cnt;
   u64 dvp_line_err_cnt;
   u64 dvp_pix_err_cnt;
   u64 all_frm_end_cnt;
   u64 all_err_cnt;
   u64 dvp_size_err_cnt;
   u64 dvp_bwidth_lack_cnt;
   u64 csi_size_err_cnt;
};
 
#define RKCIF_MAX_CSI_CHANNEL    4
struct vehicle_csi_channel_info {
   unsigned char    id;
   unsigned char    enable;    /* capture enable */
   unsigned char    vc;
   unsigned char    data_type;
   unsigned char    crop_en;
   unsigned char    cmd_mode_en;
   unsigned char    fmt_val;
   unsigned int    width;
   unsigned int    height;
   unsigned int    virtual_width;
   unsigned int    crop_st_x;
   unsigned int    crop_st_y;
};
 
struct vehicle_csi2_err_state_work {
   struct workqueue_struct *err_print_wq;
   struct work_struct work;
   char err_str[CSI_ERRSTR_LEN];
   u32 err_val;
   u32 err_num;
   unsigned long err_stat;
};
 
struct vehicle_cif {
   struct        device *dev;
   struct        device_node *phy_node;
   struct        rk_cif_clk clk;
   struct        vehicle_cfg cif_cfg;
   char        *base;  /*cif base addr*/
   //unsigned long cru_base;
   //unsigned long grf_base;
   void __iomem    *cru_base; /*cru base addr*/
   void __iomem    *grf_base; /*grf base addr*/
   void __iomem    *csi2_dphy_base; /*csi2_dphy base addr*/
   void __iomem    *csi2_base; /*csi2 base addr*/
   struct        delayed_work work;
 
   bool        is_enabled;
   u32        frame_buf[MAX_BUF_NUM];
   u32        current_buf_index;
   u32        last_buf_index;
   u32        active[2];
   int        irq;
   int        csi2_irq1;
   int        csi2_irq2;
   int        drop_frames;
   struct        rk_cif_irqinfo irqinfo;
   const        struct vehicle_cif_reg *cif_regs;
   struct        regmap *regmap_grf;
   struct        regmap *regmap_dphy_grf;
   unsigned int    frame_idx;
   struct    vehicle_rkcif_dummy_buffer    dummy_buf;
   struct csi2_dphy_hw    *dphy_hw;
   int        num_channels;
   int        chip_id;
   int        inf_id;
   unsigned int    csi_host_idx;
   struct        vehicle_csi_channel_info channels[RKCIF_MAX_CSI_CHANNEL];
   spinlock_t    vbq_lock; /* vfd lock */
   bool        interlaced_enable;
   unsigned int    interlaced_offset;
   unsigned int    interlaced_counts;
   unsigned long    *interlaced_buffer;
   atomic_t    reset_status;
   wait_queue_head_t    wq_stopped;
   bool        stopping;
   struct mutex    stream_lock;
   enum rkcif_state    state;
   struct vehicle_csi2_err_state_work err_state;
};
 
int vehicle_cif_init_mclk(struct vehicle_cif *cif);
int vehicle_cif_init(struct vehicle_cif *cif);
int vehicle_cif_deinit(struct vehicle_cif *cif);
 
int vehicle_cif_reverse_open(struct vehicle_cfg *v_cfg);
 
int vehicle_cif_reverse_close(void);
int vehicle_wait_cif_reset_done(void);
 
/* CIF IRQ STAT*/
#define DMA_FRAME_END                    (0x01 << 0)
#define LINE_END                    (0x01 << 1)
#define IFIFO_OF                    (0x01 << 4)
#define DFIFO_OF                    (0x01 << 5)
#define PRE_INF_FRAME_END                (0x01 << 8)
#define PST_INF_FRAME_END                (0x01 << 9)
 
enum rk_camera_signal_polarity {
   RK_CAMERA_DEVICE_SIGNAL_HIGH_LEVEL = 1,
   RK_CAMERA_DEVICE_SIGNAL_LOW_LEVEL = 0,
};
 
enum rk_camera_device_type {
   RK_CAMERA_DEVICE_BT601_8    = 0x10000011,
   RK_CAMERA_DEVICE_BT601_10    = 0x10000012,
   RK_CAMERA_DEVICE_BT601_12    = 0x10000014,
   RK_CAMERA_DEVICE_BT601_16    = 0x10000018,
 
   RK_CAMERA_DEVICE_BT656_8    = 0x10000021,
   RK_CAMERA_DEVICE_BT656_10    = 0x10000022,
   RK_CAMERA_DEVICE_BT656_12    = 0x10000024,
   RK_CAMERA_DEVICE_BT656_16    = 0x10000028,
 
   RK_CAMERA_DEVICE_CVBS_NTSC    = 0x20000001,
   RK_CAMERA_DEVICE_CVBS_PAL    = 0x20000002
};
 
#endif