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