xref: /OK3568_Linux_fs/kernel/drivers/media/spi/rk1608_core.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /**
3  * Rockchip rk1608 driver
4  *
5  * Copyright (C) 2017-2018 Rockchip Electronics Co., Ltd.
6  *
7  */
8 
9 #ifndef __RK1608_CORE_H__
10 #define __RK1608_CORE_H__
11 
12 #include <linux/clk.h>
13 #include <linux/spi/spi.h>
14 #include <linux/miscdevice.h>
15 #include <linux/version.h>
16 #include "rk1608_dphy.h"
17 
18 #define RK1608_VERSION			KERNEL_VERSION(0, 0x01, 0x04)
19 
20 #define UPDATE_REF_DATA_FROM_EEPROM (1)
21 
22 #define RK1608_OP_TRY_MAX		3
23 #define RK1608_OP_TRY_DELAY		10
24 #define RK1608_CMD_WRITE		0x00000011
25 #define RK1608_CMD_WRITE_REG0		0X00010011
26 #define RK1608_CMD_WRITE_REG1		0X00020011
27 #define RK1608_CMD_READ			0x00000077
28 #define RK1608_CMD_READ_BEGIN		0x000000aa
29 #define RK1608_CMD_QUERY		0x000000ff
30 #define RK1608_CMD_QUERY_REG2		0x000001ff
31 #define RK1608_STATE_ID_MASK		0xffff0000
32 #define RK1608_STATE_ID			0X16080000
33 #define RK1608_STATE_MASK		0x0000ffff
34 #define APB_CMD_WRITE_REG1		0X00020011
35 #define RK1608_R_MSG_QUEUE_ADDR		0x60050000
36 
37 #define RK1608_IRQ_TYPE_MSG		0x12345678
38 #define BOOT_REQUEST_ADDR		0x18000010
39 #define RK1608_HEAD_ADDR		0x60000000
40 #define RK1608_FW_NAME			"rk1608.rkl"
41 #define RK1608_S_MSG_QUEUE_ADDR		0x60050010
42 #define RK1608_PMU_SYS_REG0		0x120000f0
43 #define RK1608_MSG_QUEUE_OK_MASK	0xffff0001
44 #define RK1608_MSG_QUEUE_OK_TAG		0x16080001
45 #define RK1608_MAX_OP_BYTES		60000
46 #define MSG_SYNC_TIMEOUT		3000
47 
48 #define BOOT_FLAG_CRC			(0x01 << 0)
49 #define BOOT_FLAG_EXE			(0x01 << 1)
50 #define BOOT_FLAG_LOAD_PMEM		(0x01 << 2)
51 #define BOOT_FLAG_ACK			(0x01 << 3)
52 #define BOOT_FLAG_READ_WAIT		(0x01 << 4)
53 #define BOOT_FLAG_BOOT_REQUEST		(0x01 << 5)
54 
55 #define DEBUG_DUMP_ALL_SEND_RECV_MSG	0
56 #define RK1608_MCLK_RATE		(24 * 1000 * 1000ul)
57 #define SENSOR_TIMEOUT			1000
58 
59 #define OPM_SLAVE_MODE			0x100000
60 #define RSD_SEL_2CYC			0x008000
61 #define DFS_SEL_16BIT			0x000002
62 #define SPI_CTRL0			0x11060000
63 #define SPI_ENR				0x11060008
64 #define CRUPMU_CLKSEL14_CON		0x12008098
65 #define PMUGRF_GPIO1A_E			0x12030040
66 #define PMUGRF_GPIO1B_E			0x12030044
67 #define BIT7_6_SEL_8MA			0xf000a000
68 #define BIT1_0_SEL_8MA			0x000f000a
69 #define SPI0_PLL_SEL_APLL		0xff004000
70 #define INVALID_ID			-1
71 #define RK1608_MAX_SEC_NUM		10
72 
73 #define ISP_DSP_HDRAE_MAXGRIDITEMS	225
74 
75 #define MIRROR_BIT_MASK BIT(0)
76 #define FLIP_BIT_MASK BIT(1)
77 
78 #ifndef MIN
79 #define MIN(a, b) ((a) < (b) ? (a) : (b))
80 #endif
81 
82 #ifndef MSB2LSB32
83 #define MSB2LSB32(x)	((((u32)(x) & 0x80808080) >> 7) | \
84 			(((u32)(x) & 0x40404040) >> 5) | \
85 			(((u32)(x) & 0x20202020) >> 3) | \
86 			(((u32)(x) & 0x10101010) >> 1) | \
87 			(((u32)(x) & 0x08080808) << 1) | \
88 			(((u32)(x) & 0x04040404) << 3) | \
89 			(((u32)(x) & 0x02020202) << 5) | \
90 			(((u32)(x) & 0x01010101) << 7))
91 #endif
92 
93 struct rk1608_client_list {
94 	struct mutex mutex; /* protect clients */
95 	struct list_head list;
96 };
97 
98 struct rk1608_state {
99 	struct v4l2_subdev sd;
100 	struct rk1608_dphy *dphy[2];
101 	struct mutex lock; /* protect resource */
102 	struct mutex sensor_lock; /* protect sensor */
103 	struct mutex send_msg_lock; /* protect msg */
104 	struct mutex spi2apb_lock; /* protect spi2apb write/read */
105 	spinlock_t hdrae_lock; /* protect hdrae parameter */
106 	struct gpio_desc *reset_gpio;
107 	struct gpio_desc *pwren_gpio;
108 	struct gpio_desc *irq_gpio;
109 	int irq;
110 	struct gpio_desc *wakeup_gpio;
111 	struct gpio_desc *aesync_gpio;
112 	struct v4l2_subdev *sensor[4];
113 	struct device *dev;
114 	struct spi_device *spi;
115 	struct clk *mclk;
116 	struct miscdevice misc;
117 	struct rk1608_client_list clients;
118 	int log_level;
119 	int power_count;
120 	int msg_num;
121 	u32 link_nums;
122 	u32 sensor_cnt;
123 	u32 sensor_nums[2];
124 	u32 msg_done[8];
125 	wait_queue_head_t msg_wait;
126 	struct media_pad pad;
127 	struct v4l2_ctrl *link_freq;
128 	struct v4l2_ctrl *pixel_rate;
129 	struct v4l2_ctrl *hblank;
130 	struct v4l2_ctrl *vblank;
131 	struct v4l2_ctrl *exposure;
132 	struct v4l2_ctrl *gain;
133 	struct v4l2_ctrl *h_flip;
134 	struct v4l2_ctrl *v_flip;
135 	struct v4l2_ctrl_handler ctrl_handler;
136 	u32 max_speed_hz;
137 	u32 min_speed_hz;
138 	struct preisp_hdrae_para_s hdrae_para;
139 	struct preisp_hdrae_exp_s hdrae_exp;
140 	u32 set_exp_cnt;
141 	const char *firm_name;
142 	u8 flip;
143 };
144 
145 struct rk1608_section {
146 	union {
147 		u32 offset;
148 		u32 wait_value;
149 	};
150 	u32 size;
151 	union {
152 		u32 load_addr;
153 		u32 wait_addr;
154 	};
155 	u16 wait_time;
156 	u16 timeout;
157 	u16 crc_16;
158 	u8 flag;
159 	u8 type;
160 };
161 
162 struct rk1608_header {
163 	char version[32];
164 	u32 header_size;
165 	u32 section_count;
166 	struct rk1608_section sections[RK1608_MAX_SEC_NUM];
167 };
168 
169 struct rk1608_boot_req {
170 	u32 flag;
171 	u32 load_addr;
172 	u32 boot_len;
173 	u8 status;
174 	u8 dummy[2];
175 	u8 cmd;
176 };
177 
178 struct rk1608_msg_queue {
179 	u32 buf_head; /* msg buffer head */
180 	u32 buf_tail; /* msg buffer tail */
181 	u32 cur_send; /* current msg send position */
182 	u32 cur_recv; /* current msg receive position */
183 };
184 
185 enum _log_level {
186 	LOG_ERROR,
187 	LOG_WARN,
188 	LOG_INFO,
189 	LOG_DEBUG,
190 };
191 
192 struct msg {
193 	u32 size; /* unit 4 bytes */
194 	u16 type;
195 	union {
196 		u8 camera_id;
197 		u8 core_id;
198 	} id;
199 	union {
200 		u8 sync;
201 		u8 log_level;
202 		s8 err;
203 	} mux;
204 };
205 
206 struct msg_init {
207 	struct msg msg_head;
208 	u32 i2c_bus;
209 	u32 i2c_clk;
210 	s8 in_mipi_phy;
211 	s8 out_mipi_phy;
212 	s8 mipi_lane;
213 	s8 bayer;
214 	u8 sensor_name[32];
215 	u8 i2c_slave_addr;
216 	u8 sub_sensor_num;
217 };
218 
219 struct preisp_vc_cfg {
220 	s8 data_id;
221 	s8 decode_format;
222 	s8 flag;
223 	s8 unused;
224 
225 	u16 width;
226 	u16 height;
227 };
228 
229 struct msg_in_size {
230 	struct msg msg_head;
231 	struct preisp_vc_cfg channel[4];
232 };
233 
234 struct msg_out_size_head {
235 	struct msg msg_head;
236 	u16 width;
237 	u16 height;
238 	u32 mipi_clk;
239 	u16 line_length_pclk;
240 	u16 frame_length_lines;
241 	u16 mipi_lane;
242 	union {
243 		u16 flip;
244 		u16 reserved;
245 	};
246 };
247 
248 struct msg_set_output_size {
249 	struct msg_out_size_head head;
250 	struct preisp_vc_cfg channel[4];
251 };
252 
253 struct msg_init_dsp_time {
254 	struct msg msg_head;
255 	u16 t_ms;
256 	s32 tv_sec;
257 	s32 tv_usec;
258 };
259 
260 enum ISP_AE_Bayer_Mode_e {
261 	BAYER_MODE_MIN = 0,
262 	BAYER_MODE_BGGR = 1,
263 	BAYER_MODE_GRBG = 2,
264 	BAYER_MODE_GBRG = 3,
265 	BAYER_MODE_RGGB = 4,
266 	BAYER_MODE_MAX = 5
267 };
268 
269 struct ISP_AE_YCOEFF_s {
270 	int rcoef;
271 	int gcoef;
272 	int bcoef;
273 	int offset;
274 };
275 
276 enum ISP_AE_Hist_Mode_e {
277 	AE_HISTSTATICMODE_INVALID = 0,
278 	AE_HISTSTATICMODE_Y,
279 	AE_HISTSTATICMODE_R,
280 	AE_HISTSTATICMODE_G,
281 	AE_HISTSTATICMODE_B,
282 	AE_HISTSTATICMODE_MAX
283 };
284 
285 enum ISP_AE_Grid_Mode_e {
286 	AE_MEASURE_GRID_INVALID = 0,
287 	AE_MEASURE_GRID_1X1,
288 	AE_MEASURE_GRID_5X5,
289 	AE_MEASURE_GRID_9X9,
290 	AE_MEASURE_GRID_15X15,
291 	AE_MEASURE_GRID_MAX
292 };
293 
294 struct ISP_DSP_hdrae_cfg_s {
295 	enum ISP_AE_Bayer_Mode_e bayer_mode;
296 	enum ISP_AE_Grid_Mode_e grid_mode;
297 	u8 weight[ISP_DSP_HDRAE_MAXGRIDITEMS];
298 	enum ISP_AE_Hist_Mode_e hist_mode;
299 	struct ISP_AE_YCOEFF_s ycoeff;
300 	u8 imgbits;
301 	u16 width;
302 	u16 height;
303 	u16 frames;
304 };
305 
306 struct msg_set_sensor_info_s {
307 	struct msg msg_head;
308 	u32 set_exp_cnt;
309 	u16 r_gain;
310 	u16 b_gain;
311 	u16 gr_gain;
312 	u16 gb_gain;
313 	u32 exp_time[3];
314 	u32 exp_gain[3];
315 	u32 reg_exp_time[3];
316 	u32 reg_exp_gain[3];
317 	s32 lsc_table[17 * 17];
318 	struct ISP_DSP_hdrae_cfg_s dsp_hdrae;
319 };
320 
321 struct msg_calib_temp {
322 	u32 size; // unit 4 bytes
323 	u16 type; // msg identification
324 	s8  camera_id;
325 	s8  sync;
326 
327 	u32 temp;
328 	u32 calib_version;
329 
330 #if UPDATE_REF_DATA_FROM_EEPROM
331 	u32 calib_exist;
332 	u32 calib_sn_size;
333 	u32 calib_sn_offset;
334 	u8 calib_sn_code[64];
335 #endif
336 };
337 
338 #define MSG_RESPONSE_ID_OFFSET 0x2ff
339 
340 enum {
341 	/* AP -> RK1608
342 	 * 1 msg of sensor
343 	 */
344 	id_msg_init_sensor_t =		0x0001,
345 	id_msg_set_input_size_t,
346 	id_msg_set_output_size_t,
347 	id_msg_set_stream_in_on_t,
348 	id_msg_set_stream_in_off_t,
349 	id_msg_set_stream_out_on_t,
350 	id_msg_set_stream_out_off_t,
351 
352 	/* AP -> RK1608
353 	 * 2 msg of take picture
354 	 */
355 	id_msg_take_picture_t =		0x0021,
356 	id_msg_take_picture_done_t,
357 
358 	/* AP -> RK1608
359 	 * 3 msg of realtime parameter
360 	 */
361 	id_msg_rt_args_t =		0x0031,
362 	id_msg_set_sensor_info_t,
363 
364 	/* AP -> RK1608
365 	 * 4 msg of power manager
366 	 */
367 	id_msg_set_sys_mode_bypass_t =	0x0200,
368 	id_msg_set_sys_mode_standby_t,
369 	id_msg_set_sys_mode_idle_enable_t,
370 	id_msg_set_sys_mode_idle_disable_t,
371 	id_msg_set_sys_mode_slave_dsp_on_t,
372 	id_msg_set_sys_mode_slave_dsp_off_t,
373 
374 	/* AP -> RK1608
375 	 * 5 msg of debug config
376 	 */
377 	id_msg_set_log_level_t =	0x0250,
378 
379 	/* RK1608 -> AP
380 	 * 6 response of sensor msg
381 	 */
382 	id_msg_init_sensor_ret_t =	0x0300,
383 	id_msg_set_input_size_ret_t,
384 	id_msg_set_output_size_ret_t,
385 	id_msg_set_stream_in_on_ret_t,
386 	id_msg_set_stream_in_off_ret_t,
387 	id_msg_set_stream_out_on_ret_t,
388 	id_msg_set_stream_out_off_ret_t,
389 
390 	/* RK1608 -> AP
391 	 * 7 response of take picture msg
392 	 */
393 	id_msg_take_picture_ret_t =	0x0320,
394 	id_msg_take_picture_done_ret_t,
395 
396 	/* RK1608 -> AP
397 	 * 8 response of realtime parameter msg
398 	 */
399 	id_msg_rt_args_ret_t =		0x0330,
400 
401 	/* rk1608 -> AP */
402 	id_msg_do_i2c_t =		0x0390,
403 	/* AP -> rk1608 */
404 	id_msg_do_i2c_ret_t,
405 
406 	/* RK1608 -> AP
407 	 * 9 msg of print log
408 	 */
409 	id_msg_rk1608_log_t =		0x0400,
410 
411 	/* dsi2csi dump */
412 	id_msg_dsi2sci_rgb_dump_t =	0x6000,
413 	id_msg_dsi2sci_nv12_dump_t =	0x6001,
414 
415 	/* RK1608 -> AP
416 	 * 10  msg of xfile
417 	 */
418 	/* id_msg_xfile_import_t =		0x8000 + 0x0600,
419 	 * id_msg_xfile_export_t,
420 	 * id_msg_xfile_mkdir_t
421 	 */
422 
423 	/* for dsp time. */
424 	id_msg_frame_time_t = 0x1000,
425 	id_msg_sys_time_set_t,
426 
427 	//calib temperature and version
428 	id_msg_temperature_t = 0x1002,
429 	id_msg_temperature_req_t = 0x1302,
430 	id_msg_calib_temperature_t = 0x1004,
431 	id_msg_calib_temperature_req_t = 0x1303,
432 
433 	id_msg_calibration_write_req_t = 0x1050,
434 	id_msg_calibration_write_done_t,
435 	id_msg_calibration_read_req_t = 0x1052,
436 	id_msg_calibration_read_done_t,
437 	id_msg_calibration_write_req_mode2_t = 0x1054,
438 	id_msg_calibration_read_req_mode2_t,
439 
440 	id_msg_calibration_write_req_ret_t = 0x1050 + MSG_RESPONSE_ID_OFFSET,
441 	id_msg_calibration_write_done_ret_t = 0x1051 + MSG_RESPONSE_ID_OFFSET,
442 	id_msg_calibration_read_req_ret_t = 0x1052 + MSG_RESPONSE_ID_OFFSET,
443 	id_msg_calibration_read_done_ret_t = 0x1053 + MSG_RESPONSE_ID_OFFSET,
444 
445 
446 	/* 1808 for disp control */
447 	id_msg_disp_set_frame_output_t = 0x1070,
448 	id_msg_disp_set_frame_format_t,
449 	id_msg_disp_set_frame_type_t,
450 	id_msg_disp_set_pro_time_t,
451 	id_msg_disp_set_pro_current_t,
452 	id_msg_disp_set_denoise_t,
453 	id_msg_disp_set_led_on_off_t,
454 
455 	/* 0xf000 ~ 0xfdff id reversed. */
456 	id_msg_xfile_import_t = 0xfe00,
457 	id_msg_xfile_export_t,
458 	id_msg_xfile_mkdir_t
459 
460 };
461 
462 
463 #define PREISP_CALIB_ITEM_NUM       24
464 #define PREISP_CALIB_MAGIC      "#SLM_CALIB_DATA#"
465 
466 struct calib_item {
467 	unsigned char name[48];
468 	unsigned int  offset;
469 	unsigned int  size;
470 	unsigned int  temp;
471 	unsigned int  crc32;
472 };
473 
474 struct calib_head {
475 	unsigned char magic[16];
476 	unsigned int  version;
477 	unsigned int  head_size;
478 	unsigned int  image_size;
479 	unsigned int  items_number;
480 	unsigned char reserved0[32];
481 	unsigned int  hash_len;
482 	unsigned char hash[32];
483 	unsigned char reserved1[28];
484 	unsigned int  sign_tag;
485 	unsigned int  sign_len;
486 	unsigned char rsa_hash[256];
487 	unsigned char reserved2[120];
488 	struct calib_item item[PREISP_CALIB_ITEM_NUM];
489 };
490 
491 #define XFILE_MAX_PATH 256
492 struct msg_xfile {
493 	u32 size;
494 	u16 type;
495 	s8  camera_id;
496 	union {
497 		s8 sync;
498 		s8 ret;
499 	};
500 	u32 addr;
501 	u32 data_size;
502 	u32 cb;
503 	u32 args;
504 	char path[XFILE_MAX_PATH];
505 };
506 
507 int rk1608_send_msg_to_dsp(struct rk1608_state *pdata, struct msg *m);
508 /**
509  * rk1608_write - RK1608 synchronous write
510  *
511  * @spi: spi device
512  * @addr: resource address
513  * @data: data buffer
514  * @data_len: data buffer size, in bytes
515  * Context: can sleep
516  *
517  * It returns zero on success, else a negative error code.
518  */
519 int rk1608_write(struct spi_device *spi, s32 addr,
520 		 const s32 *data, size_t data_len);
521 
522 /**
523  * rk1608_safe_write - RK1608 synchronous write with state check
524  *
525  * @spi: spi device
526  * @addr: resource address
527  * @data: data buffer
528  * @data_len: data buffer size, in bytes
529  * Context: can sleep
530  *
531  * It returns zero on success, else operation state code.
532  */
533 int rk1608_safe_write(struct rk1608_state *rk1608, struct spi_device *spi,
534 		      s32 addr, const s32 *data, size_t data_len);
535 
536 /**
537  * rk1608_read - RK1608 synchronous read
538  *
539  * @spi: spi device
540  * @addr: resource address
541  * @data: data buffer [out]
542  * @data_len: data buffer size, in bytes
543  * Context: can sleep
544  *
545  * It returns zero on success, else a negative error code.
546  */
547 int rk1608_read(struct spi_device *spi, s32 addr,
548 		s32 *data, size_t data_len);
549 
550 /**
551  * rk1608_safe_read - RK1608 synchronous read with state check
552  *
553  * @spi: spi device
554  * @addr: resource address
555  * @data: data buffer [out]
556  * @data_len: data buffer size, in bytes
557  * Context: can sleep
558  *
559  * It returns zero on success, else operation state code.
560  */
561 int rk1608_safe_read(struct rk1608_state *rk1608, struct spi_device *spi,
562 		     s32 addr, s32 *data, size_t data_len);
563 
564 /**
565  * rk1608_operation_query - RK1608 last operation state query
566  *
567  * @spi: spi device
568  * @state: last operation state [out]
569  * Context: can sleep
570  *
571  * It returns zero on success, else a negative error code.
572  */
573 int rk1608_operation_query(struct spi_device *spi, s32 *state);
574 
575 /**
576  * rk1608_state_query - RK1608 system state query
577  *
578  * @spi: spi device
579  * @state: system state [out]
580  * Context: can sleep
581  *
582  * It returns zero on success, else a negative error code.
583  */
584 int rk1608_state_query(struct spi_device *spi, int32_t *state);
585 
586 /**
587  * rk1608_interrupt_request - RK1608 request a rk1608 interrupt
588  *
589  * @spi: spi device
590  * @interrupt_num: interrupt identification
591  * Context: can sleep
592  *
593  * It returns zero on success, else a negative error code.
594  */
595 int rk1608_interrupt_request(struct spi_device *spi, s32 interrupt_num);
596 
597 /**
598  * rk1608_download_fw: - rk1608 firmware download through spi
599  *
600  * @spi: spi device
601  * @fw_name: name of firmware file, NULL for default firmware name
602  * Context: can sleep
603  *
604  * It returns zero on success, else a negative error code.
605  **/
606 int rk1608_download_fw(struct rk1608_state *rk1608, struct spi_device *spi,
607 			const char *fw_name);
608 
609 /**
610  * rk1608_msq_recv_msg - receive a msg from RK1608 -> AP msg queue
611  *
612  * @spi: spi device
613  * @m: a msg pointer buf [out]
614  *
615  * need call rk1608_msq_free_received_msg to free msg after msg use done
616  *
617  * It returns zero on success, else a negative error code.
618  */
619 int rk1608_msq_recv_msg(struct rk1608_state *rk1608, struct spi_device *spi,
620 			struct msg **m);
621 
622 /*
623  * rk1608_msq_send_msg - send a msg from AP -> RK1608 msg queue
624  *
625  * @spi: spi device
626  * @m: a msg to send
627  *
628  * It returns zero on success, else a negative error code.
629  */
630 int rk1608_msq_send_msg(struct rk1608_state *rk1608, struct spi_device *spi,
631 			struct msg *m);
632 
633 int rk1608_set_power(struct rk1608_state *pdata, int on);
634 
635 void rk1608_set_spi_speed(struct rk1608_state *pdata, u32 hz);
636 
637 int rk1608_set_log_level(struct rk1608_state *pdata, int level);
638 
639 int rk1608_get_dcrop_cfg(struct v4l2_rect *crop_in,
640 			 struct v4l2_rect *crop_out);
641 #endif
642