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