xref: /OK3568_Linux_fs/kernel/drivers/media/platform/rockchip/isp/isp_params.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /* Copyright (c) 2019 Fuzhou Rockchip Electronics Co., Ltd. */
3 
4 #ifndef _RKISP_ISP_PARAM_H
5 #define _RKISP_ISP_PARAM_H
6 
7 #include <linux/rk-isp1-config.h>
8 #include <linux/rk-isp2-config.h>
9 #include <linux/rk-isp3-config.h>
10 #include <linux/rk-isp32-config.h>
11 #include <linux/rk-preisp.h>
12 #include "common.h"
13 
14 #define ISP_PACK_4BYTE(a, b, c, d)	\
15 	(((a) & 0xFF) << 0 | ((b) & 0xFF) << 8 | \
16 	 ((c) & 0xFF) << 16 | ((d) & 0xFF) << 24)
17 
18 #define ISP_PACK_2SHORT(a, b)	\
19 	(((a) & 0xFFFF) << 0 | ((b) & 0xFFFF) << 16)
20 
21 enum rkisp_params_type {
22 	RKISP_PARAMS_ALL,
23 	RKISP_PARAMS_IMD,
24 	RKISP_PARAMS_SHD,
25 };
26 
27 struct rkisp_isp_params_vdev;
28 struct rkisp_isp_params_ops {
29 	void (*save_first_param)(struct rkisp_isp_params_vdev *params_vdev, void *param);
30 	void (*clear_first_param)(struct rkisp_isp_params_vdev *params_vdev);
31 	void (*get_param_size)(struct rkisp_isp_params_vdev *params_vdev, unsigned int sizes[]);
32 	void (*first_cfg)(struct rkisp_isp_params_vdev *params_vdev);
33 	void (*disable_isp)(struct rkisp_isp_params_vdev *params_vdev);
34 	void (*isr_hdl)(struct rkisp_isp_params_vdev *params_vdev, u32 isp_mis);
35 	void (*param_cfg)(struct rkisp_isp_params_vdev *params_vdev, u32 frame_id,
36 			  enum rkisp_params_type type);
37 	void (*param_cfgsram)(struct rkisp_isp_params_vdev *params_vdev);
38 	void (*get_meshbuf_inf)(struct rkisp_isp_params_vdev *params_vdev, void *meshbuf);
39 	int (*set_meshbuf_size)(struct rkisp_isp_params_vdev *params_vdev, void *meshsize);
40 	void (*free_meshbuf)(struct rkisp_isp_params_vdev *params_vdev, u64 id);
41 	void (*stream_stop)(struct rkisp_isp_params_vdev *params_vdev);
42 	void (*fop_release)(struct rkisp_isp_params_vdev *params_vdev);
43 	bool (*check_bigmode)(struct rkisp_isp_params_vdev *params_vdev);
44 	int (*info2ddr_cfg)(struct rkisp_isp_params_vdev *params_vdev, void *arg);
45 };
46 
47 /*
48  * struct rkisp_isp_params_vdev - ISP input parameters device
49  *
50  * @cur_params: Current ISP parameters
51  * @first_params: the first params should take effect immediately
52  */
53 struct rkisp_isp_params_vdev {
54 	struct rkisp_vdev_node vnode;
55 	struct rkisp_device *dev;
56 
57 	spinlock_t config_lock;
58 	struct list_head params;
59 	union {
60 		struct rkisp1_isp_params_cfg *isp1x_params;
61 		struct isp2x_isp_params_cfg *isp2x_params;
62 		struct isp21_isp_params_cfg *isp21_params;
63 		struct isp3x_isp_params_cfg *isp3x_params;
64 		struct isp32_isp_params_cfg *isp32_params;
65 	};
66 	struct v4l2_format vdev_fmt;
67 	bool streamon;
68 	bool first_params;
69 	bool first_cfg_params;
70 	bool hdrtmo_en;
71 	bool afaemode_en;
72 
73 	enum v4l2_quantization quantization;
74 	enum rkisp_fmt_raw_pat_type raw_type;
75 	u32 in_mbus_code;
76 	u32 cur_frame_id;
77 	struct preisp_hdrae_para_s hdrae_para;
78 
79 	struct rkisp_isp_params_ops *ops;
80 	void *priv_ops;
81 	void *priv_cfg;
82 	void *priv_val;
83 
84 	struct rkisp_buffer *cur_buf;
85 	u32 rdbk_times;
86 
87 	struct sensor_exposure_cfg exposure;
88 
89 	bool is_subs_evt;
90 	bool is_first_cfg;
91 };
92 
93 static inline void
rkisp_iowrite32(struct rkisp_isp_params_vdev * params_vdev,u32 value,u32 addr)94 rkisp_iowrite32(struct rkisp_isp_params_vdev *params_vdev,
95 		u32 value, u32 addr)
96 {
97 	rkisp_write(params_vdev->dev, addr, value, false);
98 }
99 
100 static inline u32
rkisp_ioread32(struct rkisp_isp_params_vdev * params_vdev,u32 addr)101 rkisp_ioread32(struct rkisp_isp_params_vdev *params_vdev,
102 	       u32 addr)
103 {
104 	return rkisp_read(params_vdev->dev, addr, false);
105 }
106 
107 static inline void
isp_param_set_bits(struct rkisp_isp_params_vdev * params_vdev,u32 reg,u32 bit_mask)108 isp_param_set_bits(struct rkisp_isp_params_vdev *params_vdev,
109 		   u32 reg, u32 bit_mask)
110 {
111 	u32 val;
112 
113 	val = rkisp_ioread32(params_vdev, reg);
114 	rkisp_iowrite32(params_vdev, val | bit_mask, reg);
115 }
116 
117 static inline void
isp_param_clear_bits(struct rkisp_isp_params_vdev * params_vdev,u32 reg,u32 bit_mask)118 isp_param_clear_bits(struct rkisp_isp_params_vdev *params_vdev,
119 		     u32 reg, u32 bit_mask)
120 {
121 	u32 val;
122 
123 	val = rkisp_ioread32(params_vdev, reg);
124 	rkisp_iowrite32(params_vdev, val & ~bit_mask, reg);
125 }
126 
127 /* config params before ISP streaming */
128 void rkisp_params_first_cfg(struct rkisp_isp_params_vdev *params_vdev,
129 			    struct ispsd_in_fmt *in_fmt,
130 			    enum v4l2_quantization quantization);
131 void rkisp_params_disable_isp(struct rkisp_isp_params_vdev *params_vdev);
132 
133 int rkisp_register_params_vdev(struct rkisp_isp_params_vdev *params_vdev,
134 			       struct v4l2_device *v4l2_dev,
135 			       struct rkisp_device *dev);
136 
137 void rkisp_unregister_params_vdev(struct rkisp_isp_params_vdev *params_vdev);
138 
139 void rkisp_params_isr(struct rkisp_isp_params_vdev *params_vdev, u32 isp_mis);
140 
141 void rkisp_params_cfg(struct rkisp_isp_params_vdev *params_vdev, u32 frame_id);
142 
143 void rkisp_params_cfgsram(struct rkisp_isp_params_vdev *params_vdev);
144 void rkisp_params_get_meshbuf_inf(struct rkisp_isp_params_vdev *params_vdev, void *meshbuf);
145 int rkisp_params_set_meshbuf_size(struct rkisp_isp_params_vdev *params_vdev, void *meshsize);
146 void rkisp_params_meshbuf_free(struct rkisp_isp_params_vdev *params_vdev, u64 id);
147 void rkisp_params_stream_stop(struct rkisp_isp_params_vdev *params_vdev);
148 bool rkisp_params_check_bigmode(struct rkisp_isp_params_vdev *params_vdev);
149 int rkisp_params_info2ddr_cfg(struct rkisp_isp_params_vdev *params_vdev, void *arg);
150 #endif /* _RKISP_ISP_PARAM_H */
151