Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

media: rockchip: rkisp1: add support for v12 isp variants

The rkisp1 evolved over soc generations and the rk3326/px30 introduced
the so called v12 - probably meaning v1.2.

Add the new register definitions.

Signed-off-by: Heiko Stuebner <heiko.stuebner@theobroma-systems.com>
Reviewed-by: Dafna Hirschfeld <dafna.hirschfeld@collabora.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>

authored by

Heiko Stuebner and committed by
Mauro Carvalho Chehab
cd42f802 dce8ccb2

+608 -2
+43
Documentation/driver-api/media/drivers/rkisp1.rst
··· 1 + .. SPDX-License-Identifier: GPL-2.0 2 + 3 + The Rockchip Image Signal Processor Driver (rkisp1) 4 + =================================================== 5 + 6 + Versions and their differences 7 + ------------------------------ 8 + 9 + The rkisp1 block underwent some changes between SoC implementations. 10 + The vendor designates them as: 11 + 12 + - V10: used at least in rk3288 and rk3399 13 + - V11: declared in the original vendor code, but not used 14 + - V12: used at least in rk3326 and px30 15 + - V13: used at least in rk1808 16 + - V20: used in rk3568 and beyond 17 + 18 + Right now the kernel supports rkisp1 implementations based 19 + on V10 and V12 variants. V11 does not seem to be actually used 20 + and V13 will need some more additions but isn't researched yet, 21 + especially as it seems to be limited to the rk1808 which hasn't 22 + reached much market spread. 23 + 24 + V20 on the other hand will probably be used in future SoCs and 25 + has seen really big changes in the vendor kernel, so will need 26 + quite a bit of research. 27 + 28 + Changes from V10 to V12 29 + ----------------------- 30 + 31 + - V12 supports a new CSI-host implementation but can still 32 + also use the same implementation from V10 33 + - The module for lens shading correction got changed 34 + from 12bit to 13bit width 35 + - The AWB and AEC modules got replaced to support finer 36 + grained data collection 37 + 38 + Changes from V12 to V13 39 + ----------------------- 40 + 41 + The list for V13 is incomplete and needs further investigation. 42 + 43 + - V13 does not support the old CSI-host implementation anymore
+13
drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c
··· 414 414 415 415 rkisp1_write(rkisp1, mipi_ctrl, RKISP1_CIF_MIPI_CTRL); 416 416 417 + /* V12 could also use a newer csi2-host, but we don't want that yet */ 418 + if (rkisp1->media_dev.hw_revision == RKISP1_V12) 419 + rkisp1_write(rkisp1, 0, RKISP1_CIF_ISP_CSI0_CTRL0); 420 + 417 421 /* Configure Data Type and Virtual Channel */ 418 422 rkisp1_write(rkisp1, 419 423 RKISP1_CIF_MIPI_DATA_SEL_DT(sink_fmt->mipi_dt) | ··· 537 533 RKISP1_CIF_ICCL_DCROP_CLK; 538 534 539 535 rkisp1_write(rkisp1, val, RKISP1_CIF_ICCL); 536 + 537 + /* ensure sp and mp can run at the same time in V12 */ 538 + if (rkisp1->media_dev.hw_revision == RKISP1_V12) { 539 + val = RKISP1_CIF_CLK_CTRL_MI_Y12 | RKISP1_CIF_CLK_CTRL_MI_SP | 540 + RKISP1_CIF_CLK_CTRL_MI_RAW0 | RKISP1_CIF_CLK_CTRL_MI_RAW1 | 541 + RKISP1_CIF_CLK_CTRL_MI_READ | RKISP1_CIF_CLK_CTRL_MI_RAWRD | 542 + RKISP1_CIF_CLK_CTRL_CP | RKISP1_CIF_CLK_CTRL_IE; 543 + rkisp1_write(rkisp1, val, RKISP1_CIF_VI_ISP_CLK_CTRL_V12); 544 + } 540 545 } 541 546 542 547 static void rkisp1_isp_start(struct rkisp1_device *rkisp1)
+337 -1
drivers/media/platform/rockchip/rkisp1/rkisp1-params.c
··· 255 255 RKISP1_CIF_ISP_LSC_TABLE_SEL); 256 256 } 257 257 258 + static void 259 + rkisp1_lsc_matrix_config_v12(struct rkisp1_params *params, 260 + const struct rkisp1_cif_isp_lsc_config *pconfig) 261 + { 262 + unsigned int isp_lsc_status, sram_addr, isp_lsc_table_sel, i, j, data; 263 + 264 + isp_lsc_status = rkisp1_read(params->rkisp1, RKISP1_CIF_ISP_LSC_STATUS); 265 + 266 + /* RKISP1_CIF_ISP_LSC_TABLE_ADDRESS_153 = ( 17 * 18 ) >> 1 */ 267 + sram_addr = (isp_lsc_status & RKISP1_CIF_ISP_LSC_ACTIVE_TABLE) ? 268 + RKISP1_CIF_ISP_LSC_TABLE_ADDRESS_0 : 269 + RKISP1_CIF_ISP_LSC_TABLE_ADDRESS_153; 270 + rkisp1_write(params->rkisp1, sram_addr, RKISP1_CIF_ISP_LSC_R_TABLE_ADDR); 271 + rkisp1_write(params->rkisp1, sram_addr, RKISP1_CIF_ISP_LSC_GR_TABLE_ADDR); 272 + rkisp1_write(params->rkisp1, sram_addr, RKISP1_CIF_ISP_LSC_GB_TABLE_ADDR); 273 + rkisp1_write(params->rkisp1, sram_addr, RKISP1_CIF_ISP_LSC_B_TABLE_ADDR); 274 + 275 + /* program data tables (table size is 9 * 17 = 153) */ 276 + for (i = 0; i < RKISP1_CIF_ISP_LSC_SAMPLES_MAX; i++) { 277 + /* 278 + * 17 sectors with 2 values in one DWORD = 9 279 + * DWORDs (2nd value of last DWORD unused) 280 + */ 281 + for (j = 0; j < RKISP1_CIF_ISP_LSC_SAMPLES_MAX - 1; j += 2) { 282 + data = RKISP1_CIF_ISP_LSC_TABLE_DATA_V12( 283 + pconfig->r_data_tbl[i][j], 284 + pconfig->r_data_tbl[i][j + 1]); 285 + rkisp1_write(params->rkisp1, data, 286 + RKISP1_CIF_ISP_LSC_R_TABLE_DATA); 287 + 288 + data = RKISP1_CIF_ISP_LSC_TABLE_DATA_V12( 289 + pconfig->gr_data_tbl[i][j], 290 + pconfig->gr_data_tbl[i][j + 1]); 291 + rkisp1_write(params->rkisp1, data, 292 + RKISP1_CIF_ISP_LSC_GR_TABLE_DATA); 293 + 294 + data = RKISP1_CIF_ISP_LSC_TABLE_DATA_V12( 295 + pconfig->gb_data_tbl[i][j], 296 + pconfig->gb_data_tbl[i][j + 1]); 297 + rkisp1_write(params->rkisp1, data, 298 + RKISP1_CIF_ISP_LSC_GB_TABLE_DATA); 299 + 300 + data = RKISP1_CIF_ISP_LSC_TABLE_DATA_V12( 301 + pconfig->b_data_tbl[i][j], 302 + pconfig->b_data_tbl[i][j + 1]); 303 + rkisp1_write(params->rkisp1, data, 304 + RKISP1_CIF_ISP_LSC_B_TABLE_DATA); 305 + } 306 + 307 + data = RKISP1_CIF_ISP_LSC_TABLE_DATA_V12(pconfig->r_data_tbl[i][j], 0); 308 + rkisp1_write(params->rkisp1, data, 309 + RKISP1_CIF_ISP_LSC_R_TABLE_DATA); 310 + 311 + data = RKISP1_CIF_ISP_LSC_TABLE_DATA_V12(pconfig->gr_data_tbl[i][j], 0); 312 + rkisp1_write(params->rkisp1, data, 313 + RKISP1_CIF_ISP_LSC_GR_TABLE_DATA); 314 + 315 + data = RKISP1_CIF_ISP_LSC_TABLE_DATA_V12(pconfig->gb_data_tbl[i][j], 0); 316 + rkisp1_write(params->rkisp1, data, 317 + RKISP1_CIF_ISP_LSC_GB_TABLE_DATA); 318 + 319 + data = RKISP1_CIF_ISP_LSC_TABLE_DATA_V12(pconfig->b_data_tbl[i][j], 0); 320 + rkisp1_write(params->rkisp1, data, 321 + RKISP1_CIF_ISP_LSC_B_TABLE_DATA); 322 + } 323 + isp_lsc_table_sel = (isp_lsc_status & RKISP1_CIF_ISP_LSC_ACTIVE_TABLE) ? 324 + RKISP1_CIF_ISP_LSC_TABLE_0 : 325 + RKISP1_CIF_ISP_LSC_TABLE_1; 326 + rkisp1_write(params->rkisp1, isp_lsc_table_sel, 327 + RKISP1_CIF_ISP_LSC_TABLE_SEL); 328 + } 329 + 258 330 static void rkisp1_lsc_config(struct rkisp1_params *params, 259 331 const struct rkisp1_cif_isp_lsc_config *arg) 260 332 { ··· 468 396 RKISP1_CIF_ISP_GAMMA_OUT_Y_0_V10 + i * 4); 469 397 } 470 398 399 + static void rkisp1_goc_config_v12(struct rkisp1_params *params, 400 + const struct rkisp1_cif_isp_goc_config *arg) 401 + { 402 + unsigned int i; 403 + u32 value; 404 + 405 + rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_CTRL, 406 + RKISP1_CIF_ISP_CTRL_ISP_GAMMA_OUT_ENA); 407 + rkisp1_write(params->rkisp1, arg->mode, RKISP1_CIF_ISP_GAMMA_OUT_MODE_V12); 408 + 409 + for (i = 0; i < RKISP1_CIF_ISP_GAMMA_OUT_MAX_SAMPLES_V12 / 2; i++) { 410 + value = RKISP1_CIF_ISP_GAMMA_VALUE_V12( 411 + arg->gamma_y[2 * i + 1], 412 + arg->gamma_y[2 * i]); 413 + rkisp1_write(params->rkisp1, value, 414 + RKISP1_CIF_ISP_GAMMA_OUT_Y_0_V12 + i * 4); 415 + } 416 + } 417 + 471 418 /* ISP Cross Talk */ 472 419 static void rkisp1_ctk_config(struct rkisp1_params *params, 473 420 const struct rkisp1_cif_isp_ctk_config *arg) ··· 564 473 arg->frames, RKISP1_CIF_ISP_AWB_FRAMES_V10); 565 474 } 566 475 476 + static void rkisp1_awb_meas_config_v12(struct rkisp1_params *params, 477 + const struct rkisp1_cif_isp_awb_meas_config *arg) 478 + { 479 + u32 reg_val = 0; 480 + /* based on the mode,configure the awb module */ 481 + if (arg->awb_mode == RKISP1_CIF_ISP_AWB_MODE_YCBCR) { 482 + /* Reference Cb and Cr */ 483 + rkisp1_write(params->rkisp1, 484 + RKISP1_CIF_ISP_AWB_REF_CR_SET(arg->awb_ref_cr) | 485 + arg->awb_ref_cb, RKISP1_CIF_ISP_AWB_REF_V12); 486 + /* Yc Threshold */ 487 + rkisp1_write(params->rkisp1, 488 + RKISP1_CIF_ISP_AWB_MAX_Y_SET(arg->max_y) | 489 + RKISP1_CIF_ISP_AWB_MIN_Y_SET(arg->min_y) | 490 + RKISP1_CIF_ISP_AWB_MAX_CS_SET(arg->max_csum) | 491 + arg->min_c, RKISP1_CIF_ISP_AWB_THRESH_V12); 492 + } 493 + 494 + reg_val = rkisp1_read(params->rkisp1, RKISP1_CIF_ISP_AWB_PROP_V12); 495 + if (arg->enable_ymax_cmp) 496 + reg_val |= RKISP1_CIF_ISP_AWB_YMAX_CMP_EN; 497 + else 498 + reg_val &= ~RKISP1_CIF_ISP_AWB_YMAX_CMP_EN; 499 + reg_val &= ~RKISP1_CIF_ISP_AWB_SET_FRAMES_MASK_V12; 500 + reg_val |= RKISP1_CIF_ISP_AWB_SET_FRAMES_V12(arg->frames); 501 + rkisp1_write(params->rkisp1, reg_val, RKISP1_CIF_ISP_AWB_PROP_V12); 502 + 503 + /* window offset */ 504 + rkisp1_write(params->rkisp1, 505 + arg->awb_wnd.v_offs << 16 | 506 + arg->awb_wnd.h_offs, 507 + RKISP1_CIF_ISP_AWB_OFFS_V12); 508 + /* AWB window size */ 509 + rkisp1_write(params->rkisp1, 510 + arg->awb_wnd.v_size << 16 | 511 + arg->awb_wnd.h_size, 512 + RKISP1_CIF_ISP_AWB_SIZE_V12); 513 + } 514 + 567 515 static void 568 516 rkisp1_awb_meas_enable_v10(struct rkisp1_params *params, 569 517 const struct rkisp1_cif_isp_awb_meas_config *arg, ··· 633 503 } 634 504 635 505 static void 506 + rkisp1_awb_meas_enable_v12(struct rkisp1_params *params, 507 + const struct rkisp1_cif_isp_awb_meas_config *arg, 508 + bool en) 509 + { 510 + u32 reg_val = rkisp1_read(params->rkisp1, RKISP1_CIF_ISP_AWB_PROP_V12); 511 + 512 + /* switch off */ 513 + reg_val &= RKISP1_CIF_ISP_AWB_MODE_MASK_NONE; 514 + 515 + if (en) { 516 + if (arg->awb_mode == RKISP1_CIF_ISP_AWB_MODE_RGB) 517 + reg_val |= RKISP1_CIF_ISP_AWB_MODE_RGB_EN; 518 + else 519 + reg_val |= RKISP1_CIF_ISP_AWB_MODE_YCBCR_EN; 520 + 521 + rkisp1_write(params->rkisp1, reg_val, RKISP1_CIF_ISP_AWB_PROP_V12); 522 + 523 + /* Measurements require AWB block be active. */ 524 + rkisp1_param_set_bits(params, RKISP1_CIF_ISP_CTRL, 525 + RKISP1_CIF_ISP_CTRL_ISP_AWB_ENA); 526 + } else { 527 + rkisp1_write(params->rkisp1, 528 + reg_val, RKISP1_CIF_ISP_AWB_PROP_V12); 529 + rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_CTRL, 530 + RKISP1_CIF_ISP_CTRL_ISP_AWB_ENA); 531 + } 532 + } 533 + 534 + static void 636 535 rkisp1_awb_gain_config_v10(struct rkisp1_params *params, 637 536 const struct rkisp1_cif_isp_awb_gain_config *arg) 638 537 { ··· 672 513 rkisp1_write(params->rkisp1, 673 514 RKISP1_CIF_ISP_AWB_GAIN_R_SET(arg->gain_red) | 674 515 arg->gain_blue, RKISP1_CIF_ISP_AWB_GAIN_RB_V10); 516 + } 517 + 518 + static void 519 + rkisp1_awb_gain_config_v12(struct rkisp1_params *params, 520 + const struct rkisp1_cif_isp_awb_gain_config *arg) 521 + { 522 + rkisp1_write(params->rkisp1, 523 + RKISP1_CIF_ISP_AWB_GAIN_R_SET(arg->gain_green_r) | 524 + arg->gain_green_b, RKISP1_CIF_ISP_AWB_GAIN_G_V12); 525 + 526 + rkisp1_write(params->rkisp1, 527 + RKISP1_CIF_ISP_AWB_GAIN_R_SET(arg->gain_red) | 528 + arg->gain_blue, RKISP1_CIF_ISP_AWB_GAIN_RB_V12); 675 529 } 676 530 677 531 static void rkisp1_aec_config_v10(struct rkisp1_params *params, ··· 718 546 rkisp1_write(params->rkisp1, 719 547 RKISP1_CIF_ISP_EXP_V_SIZE_SET_V10(block_vsize), 720 548 RKISP1_CIF_ISP_EXP_V_SIZE_V10); 549 + } 550 + 551 + static void rkisp1_aec_config_v12(struct rkisp1_params *params, 552 + const struct rkisp1_cif_isp_aec_config *arg) 553 + { 554 + u32 exp_ctrl; 555 + u32 block_hsize, block_vsize; 556 + u32 wnd_num_idx = 1; 557 + const u32 ae_wnd_num[] = { 5, 9, 15, 15 }; 558 + 559 + /* avoid to override the old enable value */ 560 + exp_ctrl = rkisp1_read(params->rkisp1, RKISP1_CIF_ISP_EXP_CTRL); 561 + exp_ctrl &= RKISP1_CIF_ISP_EXP_ENA; 562 + if (arg->autostop) 563 + exp_ctrl |= RKISP1_CIF_ISP_EXP_CTRL_AUTOSTOP; 564 + if (arg->mode == RKISP1_CIF_ISP_EXP_MEASURING_MODE_1) 565 + exp_ctrl |= RKISP1_CIF_ISP_EXP_CTRL_MEASMODE_1; 566 + exp_ctrl |= RKISP1_CIF_ISP_EXP_CTRL_WNDNUM_SET_V12(wnd_num_idx); 567 + rkisp1_write(params->rkisp1, exp_ctrl, RKISP1_CIF_ISP_EXP_CTRL); 568 + 569 + rkisp1_write(params->rkisp1, 570 + RKISP1_CIF_ISP_EXP_V_OFFSET_SET_V12(arg->meas_window.v_offs) | 571 + RKISP1_CIF_ISP_EXP_H_OFFSET_SET_V12(arg->meas_window.h_offs), 572 + RKISP1_CIF_ISP_EXP_OFFS_V12); 573 + 574 + block_hsize = arg->meas_window.h_size / ae_wnd_num[wnd_num_idx] - 1; 575 + block_vsize = arg->meas_window.v_size / ae_wnd_num[wnd_num_idx] - 1; 576 + 577 + rkisp1_write(params->rkisp1, 578 + RKISP1_CIF_ISP_EXP_V_SIZE_SET_V12(block_vsize) | 579 + RKISP1_CIF_ISP_EXP_H_SIZE_SET_V12(block_hsize), 580 + RKISP1_CIF_ISP_EXP_SIZE_V12); 721 581 } 722 582 723 583 static void rkisp1_cproc_config(struct rkisp1_params *params, ··· 829 625 rkisp1_write(params->rkisp1, weight[0] & 0x1F, RKISP1_CIF_ISP_HIST_WEIGHT_44_V10); 830 626 } 831 627 628 + static void rkisp1_hst_config_v12(struct rkisp1_params *params, 629 + const struct rkisp1_cif_isp_hst_config *arg) 630 + { 631 + unsigned int i, j; 632 + u32 block_hsize, block_vsize; 633 + u32 wnd_num_idx, hist_weight_num, hist_ctrl, value; 634 + u8 weight15x15[RKISP1_CIF_ISP_HIST_WEIGHT_REG_SIZE_V12]; 635 + const u32 hist_wnd_num[] = { 5, 9, 15, 15 }; 636 + 637 + /* now we just support 9x9 window */ 638 + wnd_num_idx = 1; 639 + memset(weight15x15, 0x00, sizeof(weight15x15)); 640 + /* avoid to override the old enable value */ 641 + hist_ctrl = rkisp1_read(params->rkisp1, RKISP1_CIF_ISP_HIST_CTRL_V12); 642 + hist_ctrl &= RKISP1_CIF_ISP_HIST_CTRL_MODE_MASK_V12 | 643 + RKISP1_CIF_ISP_HIST_CTRL_EN_MASK_V12; 644 + hist_ctrl = hist_ctrl | 645 + RKISP1_CIF_ISP_HIST_CTRL_INTRSEL_SET_V12(1) | 646 + RKISP1_CIF_ISP_HIST_CTRL_DATASEL_SET_V12(0) | 647 + RKISP1_CIF_ISP_HIST_CTRL_WATERLINE_SET_V12(0) | 648 + RKISP1_CIF_ISP_HIST_CTRL_AUTOSTOP_SET_V12(0) | 649 + RKISP1_CIF_ISP_HIST_CTRL_WNDNUM_SET_V12(1) | 650 + RKISP1_CIF_ISP_HIST_CTRL_STEPSIZE_SET_V12(arg->histogram_predivider); 651 + rkisp1_write(params->rkisp1, hist_ctrl, RKISP1_CIF_ISP_HIST_CTRL_V12); 652 + 653 + rkisp1_write(params->rkisp1, 654 + RKISP1_CIF_ISP_HIST_OFFS_SET_V12(arg->meas_window.h_offs, 655 + arg->meas_window.v_offs), 656 + RKISP1_CIF_ISP_HIST_OFFS_V12); 657 + 658 + block_hsize = arg->meas_window.h_size / hist_wnd_num[wnd_num_idx] - 1; 659 + block_vsize = arg->meas_window.v_size / hist_wnd_num[wnd_num_idx] - 1; 660 + rkisp1_write(params->rkisp1, 661 + RKISP1_CIF_ISP_HIST_SIZE_SET_V12(block_hsize, block_vsize), 662 + RKISP1_CIF_ISP_HIST_SIZE_V12); 663 + 664 + for (i = 0; i < hist_wnd_num[wnd_num_idx]; i++) { 665 + for (j = 0; j < hist_wnd_num[wnd_num_idx]; j++) { 666 + weight15x15[i * RKISP1_CIF_ISP_HIST_ROW_NUM_V12 + j] = 667 + arg->hist_weight[i * hist_wnd_num[wnd_num_idx] + j]; 668 + } 669 + } 670 + 671 + hist_weight_num = RKISP1_CIF_ISP_HIST_WEIGHT_REG_SIZE_V12; 672 + for (i = 0; i < (hist_weight_num / 4); i++) { 673 + value = RKISP1_CIF_ISP_HIST_WEIGHT_SET_V12( 674 + weight15x15[4 * i + 0], 675 + weight15x15[4 * i + 1], 676 + weight15x15[4 * i + 2], 677 + weight15x15[4 * i + 3]); 678 + rkisp1_write(params->rkisp1, value, 679 + RKISP1_CIF_ISP_HIST_WEIGHT_V12 + 4 * i); 680 + } 681 + value = RKISP1_CIF_ISP_HIST_WEIGHT_SET_V12(weight15x15[4 * i + 0], 0, 0, 0); 682 + rkisp1_write(params->rkisp1, value, 683 + RKISP1_CIF_ISP_HIST_WEIGHT_V12 + 4 * i); 684 + } 685 + 832 686 static void 833 687 rkisp1_hst_enable_v10(struct rkisp1_params *params, 834 688 const struct rkisp1_cif_isp_hst_config *arg, bool en) ··· 902 640 } else { 903 641 rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_HIST_PROP_V10, 904 642 RKISP1_CIF_ISP_HIST_PROP_MODE_MASK_V10); 643 + } 644 + } 645 + 646 + static void 647 + rkisp1_hst_enable_v12(struct rkisp1_params *params, 648 + const struct rkisp1_cif_isp_hst_config *arg, bool en) 649 + { 650 + if (en) { 651 + u32 hist_ctrl = rkisp1_read(params->rkisp1, 652 + RKISP1_CIF_ISP_HIST_CTRL_V12); 653 + 654 + hist_ctrl &= ~RKISP1_CIF_ISP_HIST_CTRL_MODE_MASK_V12; 655 + hist_ctrl |= RKISP1_CIF_ISP_HIST_CTRL_MODE_SET_V12(arg->mode); 656 + hist_ctrl |= RKISP1_CIF_ISP_HIST_CTRL_EN_SET_V12(1); 657 + rkisp1_param_set_bits(params, RKISP1_CIF_ISP_HIST_CTRL_V12, 658 + hist_ctrl); 659 + } else { 660 + rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_HIST_CTRL_V12, 661 + RKISP1_CIF_ISP_HIST_CTRL_MODE_MASK_V12 | 662 + RKISP1_CIF_ISP_HIST_CTRL_EN_MASK_V12); 905 663 } 906 664 } 907 665 ··· 952 670 rkisp1_write(params->rkisp1, arg->thres, RKISP1_CIF_ISP_AFM_THRES); 953 671 rkisp1_write(params->rkisp1, arg->var_shift, 954 672 RKISP1_CIF_ISP_AFM_VAR_SHIFT); 673 + /* restore afm status */ 674 + rkisp1_write(params->rkisp1, afm_ctrl, RKISP1_CIF_ISP_AFM_CTRL); 675 + } 676 + 677 + static void rkisp1_afm_config_v12(struct rkisp1_params *params, 678 + const struct rkisp1_cif_isp_afc_config *arg) 679 + { 680 + size_t num_of_win = min_t(size_t, ARRAY_SIZE(arg->afm_win), 681 + arg->num_afm_win); 682 + u32 afm_ctrl = rkisp1_read(params->rkisp1, RKISP1_CIF_ISP_AFM_CTRL); 683 + u32 lum_var_shift, afm_var_shift; 684 + unsigned int i; 685 + 686 + /* Switch off to configure. */ 687 + rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_AFM_CTRL, 688 + RKISP1_CIF_ISP_AFM_ENA); 689 + 690 + for (i = 0; i < num_of_win; i++) { 691 + rkisp1_write(params->rkisp1, 692 + RKISP1_CIF_ISP_AFM_WINDOW_X(arg->afm_win[i].h_offs) | 693 + RKISP1_CIF_ISP_AFM_WINDOW_Y(arg->afm_win[i].v_offs), 694 + RKISP1_CIF_ISP_AFM_LT_A + i * 8); 695 + rkisp1_write(params->rkisp1, 696 + RKISP1_CIF_ISP_AFM_WINDOW_X(arg->afm_win[i].h_size + 697 + arg->afm_win[i].h_offs) | 698 + RKISP1_CIF_ISP_AFM_WINDOW_Y(arg->afm_win[i].v_size + 699 + arg->afm_win[i].v_offs), 700 + RKISP1_CIF_ISP_AFM_RB_A + i * 8); 701 + } 702 + rkisp1_write(params->rkisp1, arg->thres, RKISP1_CIF_ISP_AFM_THRES); 703 + 704 + lum_var_shift = RKISP1_CIF_ISP_AFM_GET_LUM_SHIFT_a_V12(arg->var_shift); 705 + afm_var_shift = RKISP1_CIF_ISP_AFM_GET_AFM_SHIFT_a_V12(arg->var_shift); 706 + rkisp1_write(params->rkisp1, 707 + RKISP1_CIF_ISP_AFM_SET_SHIFT_a_V12(lum_var_shift, afm_var_shift) | 708 + RKISP1_CIF_ISP_AFM_SET_SHIFT_b_V12(lum_var_shift, afm_var_shift) | 709 + RKISP1_CIF_ISP_AFM_SET_SHIFT_c_V12(lum_var_shift, afm_var_shift), 710 + RKISP1_CIF_ISP_AFM_VAR_SHIFT); 711 + 955 712 /* restore afm status */ 956 713 rkisp1_write(params->rkisp1, afm_ctrl, RKISP1_CIF_ISP_AFM_CTRL); 957 714 } ··· 1626 1305 .afm_config = rkisp1_afm_config_v10, 1627 1306 }; 1628 1307 1308 + static struct rkisp1_params_ops rkisp1_v12_params_ops = { 1309 + .lsc_matrix_config = rkisp1_lsc_matrix_config_v12, 1310 + .goc_config = rkisp1_goc_config_v12, 1311 + .awb_meas_config = rkisp1_awb_meas_config_v12, 1312 + .awb_meas_enable = rkisp1_awb_meas_enable_v12, 1313 + .awb_gain_config = rkisp1_awb_gain_config_v12, 1314 + .aec_config = rkisp1_aec_config_v12, 1315 + .hst_config = rkisp1_hst_config_v12, 1316 + .hst_enable = rkisp1_hst_enable_v12, 1317 + .afm_config = rkisp1_afm_config_v12, 1318 + }; 1319 + 1629 1320 static int rkisp1_params_enum_fmt_meta_out(struct file *file, void *priv, 1630 1321 struct v4l2_fmtdesc *f) 1631 1322 { ··· 1804 1471 params->vdev_fmt.fmt.meta.buffersize = 1805 1472 sizeof(struct rkisp1_params_cfg); 1806 1473 1807 - params->ops = &rkisp1_v10_params_ops; 1474 + if (params->rkisp1->media_dev.hw_revision == RKISP1_V12) 1475 + params->ops = &rkisp1_v12_params_ops; 1476 + else 1477 + params->ops = &rkisp1_v10_params_ops; 1808 1478 } 1809 1479 1810 1480 int rkisp1_params_register(struct rkisp1_device *rkisp1)
+143
drivers/media/platform/rockchip/rkisp1/rkisp1-regs.h
··· 212 212 213 213 /* CCL */ 214 214 #define RKISP1_CIF_CCL_CIF_CLK_DIS BIT(2) 215 + /* VI_ISP_CLK_CTRL */ 216 + #define RKISP1_CIF_CLK_CTRL_ISP_RAW BIT(0) 217 + #define RKISP1_CIF_CLK_CTRL_ISP_RGB BIT(1) 218 + #define RKISP1_CIF_CLK_CTRL_ISP_YUV BIT(2) 219 + #define RKISP1_CIF_CLK_CTRL_ISP_3A BIT(3) 220 + #define RKISP1_CIF_CLK_CTRL_MIPI_RAW BIT(4) 221 + #define RKISP1_CIF_CLK_CTRL_ISP_IE BIT(5) 222 + #define RKISP1_CIF_CLK_CTRL_RSZ_RAM BIT(6) 223 + #define RKISP1_CIF_CLK_CTRL_JPEG_RAM BIT(7) 224 + #define RKISP1_CIF_CLK_CTRL_ACLK_ISP BIT(8) 225 + #define RKISP1_CIF_CLK_CTRL_MI_IDC BIT(9) 226 + #define RKISP1_CIF_CLK_CTRL_MI_MP BIT(10) 227 + #define RKISP1_CIF_CLK_CTRL_MI_JPEG BIT(11) 228 + #define RKISP1_CIF_CLK_CTRL_MI_DP BIT(12) 229 + #define RKISP1_CIF_CLK_CTRL_MI_Y12 BIT(13) 230 + #define RKISP1_CIF_CLK_CTRL_MI_SP BIT(14) 231 + #define RKISP1_CIF_CLK_CTRL_MI_RAW0 BIT(15) 232 + #define RKISP1_CIF_CLK_CTRL_MI_RAW1 BIT(16) 233 + #define RKISP1_CIF_CLK_CTRL_MI_READ BIT(17) 234 + #define RKISP1_CIF_CLK_CTRL_MI_RAWRD BIT(18) 235 + #define RKISP1_CIF_CLK_CTRL_CP BIT(19) 236 + #define RKISP1_CIF_CLK_CTRL_IE BIT(20) 237 + #define RKISP1_CIF_CLK_CTRL_SI BIT(21) 238 + #define RKISP1_CIF_CLK_CTRL_RSZM BIT(22) 239 + #define RKISP1_CIF_CLK_CTRL_DPMUX BIT(23) 240 + #define RKISP1_CIF_CLK_CTRL_JPEG BIT(24) 241 + #define RKISP1_CIF_CLK_CTRL_RSZS BIT(25) 242 + #define RKISP1_CIF_CLK_CTRL_MIPI BIT(26) 243 + #define RKISP1_CIF_CLK_CTRL_MARVINMI BIT(27) 215 244 /* ICCL */ 216 245 #define RKISP1_CIF_ICCL_ISP_CLK BIT(0) 217 246 #define RKISP1_CIF_ICCL_CP_CLK BIT(1) ··· 396 367 #define RKISP1_CIF_ISP_HIST_COLUMN_NUM_V10 5 397 368 #define RKISP1_CIF_ISP_HIST_GET_BIN_V10(x) ((x) & 0x000FFFFF) 398 369 370 + /* ISP HISTOGRAM CALCULATION : CIF_ISP_HIST */ 371 + #define RKISP1_CIF_ISP_HIST_CTRL_EN_SET_V12(x) (((x) & 0x01) << 0) 372 + #define RKISP1_CIF_ISP_HIST_CTRL_EN_MASK_V12 RKISP1_CIF_ISP_HIST_CTRL_EN_SET_V12(0x01) 373 + #define RKISP1_CIF_ISP_HIST_CTRL_STEPSIZE_SET_V12(x) (((x) & 0x7F) << 1) 374 + #define RKISP1_CIF_ISP_HIST_CTRL_MODE_SET_V12(x) (((x) & 0x07) << 8) 375 + #define RKISP1_CIF_ISP_HIST_CTRL_MODE_MASK_V12 RKISP1_CIF_ISP_HIST_CTRL_MODE_SET_V12(0x07) 376 + #define RKISP1_CIF_ISP_HIST_CTRL_AUTOSTOP_SET_V12(x) (((x) & 0x01) << 11) 377 + #define RKISP1_CIF_ISP_HIST_CTRL_WATERLINE_SET_V12(x) (((x) & 0xFFF) << 12) 378 + #define RKISP1_CIF_ISP_HIST_CTRL_DATASEL_SET_V12(x) (((x) & 0x07) << 24) 379 + #define RKISP1_CIF_ISP_HIST_CTRL_INTRSEL_SET_V12(x) (((x) & 0x01) << 27) 380 + #define RKISP1_CIF_ISP_HIST_CTRL_WNDNUM_SET_V12(x) (((x) & 0x03) << 28) 381 + #define RKISP1_CIF_ISP_HIST_CTRL_DBGEN_SET_V12(x) (((x) & 0x01) << 30) 382 + #define RKISP1_CIF_ISP_HIST_ROW_NUM_V12 15 383 + #define RKISP1_CIF_ISP_HIST_COLUMN_NUM_V12 15 384 + #define RKISP1_CIF_ISP_HIST_WEIGHT_REG_SIZE_V12 \ 385 + (RKISP1_CIF_ISP_HIST_ROW_NUM_V12 * RKISP1_CIF_ISP_HIST_COLUMN_NUM_V12) 386 + 387 + #define RKISP1_CIF_ISP_HIST_WEIGHT_SET_V12(v0, v1, v2, v3) \ 388 + (((v0) & 0x3F) | (((v1) & 0x3F) << 8) |\ 389 + (((v2) & 0x3F) << 16) |\ 390 + (((v3) & 0x3F) << 24)) 391 + 392 + #define RKISP1_CIF_ISP_HIST_OFFS_SET_V12(v0, v1) \ 393 + (((v0) & 0x1FFF) | (((v1) & 0x1FFF) << 16)) 394 + #define RKISP1_CIF_ISP_HIST_SIZE_SET_V12(v0, v1) \ 395 + (((v0) & 0x7FF) | (((v1) & 0x7FF) << 16)) 396 + 397 + #define RKISP1_CIF_ISP_HIST_GET_BIN0_V12(x) \ 398 + ((x) & 0xFFFF) 399 + #define RKISP1_CIF_ISP_HIST_GET_BIN1_V12(x) \ 400 + (((x) >> 16) & 0xFFFF) 401 + 399 402 /* AUTO FOCUS MEASUREMENT: ISP_AFM_CTRL */ 400 403 #define RKISP1_ISP_AFM_CTRL_ENABLE BIT(0) 401 404 ··· 462 401 #define RKISP1_CIF_ISP_AWB_MODE_YCBCR_EN ((0 << 31) | (0x2 << 0)) 463 402 #define RKISP1_CIF_ISP_AWB_MODE_MASK_NONE 0xFFFFFFFC 464 403 #define RKISP1_CIF_ISP_AWB_MODE_READ(x) ((x) & 3) 404 + #define RKISP1_CIF_ISP_AWB_SET_FRAMES_V12(x) (((x) & 0x07) << 28) 405 + #define RKISP1_CIF_ISP_AWB_SET_FRAMES_MASK_V12 RKISP1_CIF_ISP_AWB_SET_FRAMES_V12(0x07) 465 406 /* ISP_AWB_GAIN_RB, ISP_AWB_GAIN_G */ 466 407 #define RKISP1_CIF_ISP_AWB_GAIN_R_SET(x) (((x) & 0x3FF) << 16) 467 408 #define RKISP1_CIF_ISP_AWB_GAIN_R_READ(x) (((x) >> 16) & 0x3FF) ··· 498 435 /* ISP_EXP_CTRL */ 499 436 #define RKISP1_CIF_ISP_EXP_ENA BIT(0) 500 437 #define RKISP1_CIF_ISP_EXP_CTRL_AUTOSTOP BIT(1) 438 + #define RKISP1_CIF_ISP_EXP_CTRL_WNDNUM_SET_V12(x) (((x) & 0x03) << 2) 501 439 /* 502 440 *'1' luminance calculation according to Y=(R+G+B) x 0.332 (85/256) 503 441 *'0' luminance calculation according to Y=16+0.25R+0.5G+0.1094B ··· 508 444 /* ISP_EXP_H_SIZE */ 509 445 #define RKISP1_CIF_ISP_EXP_H_SIZE_SET_V10(x) ((x) & 0x7FF) 510 446 #define RKISP1_CIF_ISP_EXP_HEIGHT_MASK_V10 0x000007FF 447 + #define RKISP1_CIF_ISP_EXP_H_SIZE_SET_V12(x) ((x) & 0x7FF) 448 + #define RKISP1_CIF_ISP_EXP_HEIGHT_MASK_V12 0x000007FF 511 449 /* ISP_EXP_V_SIZE : vertical size must be a multiple of 2). */ 512 450 #define RKISP1_CIF_ISP_EXP_V_SIZE_SET_V10(x) ((x) & 0x7FE) 451 + #define RKISP1_CIF_ISP_EXP_V_SIZE_SET_V12(x) (((x) & 0x7FE) << 16) 513 452 514 453 /* ISP_EXP_H_OFFSET */ 515 454 #define RKISP1_CIF_ISP_EXP_H_OFFSET_SET_V10(x) ((x) & 0x1FFF) 516 455 #define RKISP1_CIF_ISP_EXP_MAX_HOFFS_V10 2424 456 + #define RKISP1_CIF_ISP_EXP_H_OFFSET_SET_V12(x) ((x) & 0x1FFF) 457 + #define RKISP1_CIF_ISP_EXP_MAX_HOFFS_V12 0x1FFF 517 458 /* ISP_EXP_V_OFFSET */ 518 459 #define RKISP1_CIF_ISP_EXP_V_OFFSET_SET_V10(x) ((x) & 0x1FFF) 519 460 #define RKISP1_CIF_ISP_EXP_MAX_VOFFS_V10 1806 461 + #define RKISP1_CIF_ISP_EXP_V_OFFSET_SET_V12(x) (((x) & 0x1FFF) << 16) 462 + #define RKISP1_CIF_ISP_EXP_MAX_VOFFS_V12 0x1FFF 520 463 521 464 #define RKISP1_CIF_ISP_EXP_ROW_NUM_V10 5 522 465 #define RKISP1_CIF_ISP_EXP_COLUMN_NUM_V10 5 ··· 542 471 #define RKISP1_CIF_ISP_EXP_MIN_VSIZE_V10 \ 543 472 (RKISP1_CIF_ISP_EXP_BLOCK_MIN_VSIZE_V10 * RKISP1_CIF_ISP_EXP_ROW_NUM_V10 + 1) 544 473 474 + #define RKISP1_CIF_ISP_EXP_ROW_NUM_V12 15 475 + #define RKISP1_CIF_ISP_EXP_COLUMN_NUM_V12 15 476 + #define RKISP1_CIF_ISP_EXP_NUM_LUMA_REGS_V12 \ 477 + (RKISP1_CIF_ISP_EXP_ROW_NUM_V12 * RKISP1_CIF_ISP_EXP_COLUMN_NUM_V12) 478 + 479 + #define RKISP1_CIF_ISP_EXP_BLOCK_MAX_HSIZE_V12 0x7FF 480 + #define RKISP1_CIF_ISP_EXP_BLOCK_MIN_HSIZE_V12 0xE 481 + #define RKISP1_CIF_ISP_EXP_BLOCK_MAX_VSIZE_V12 0x7FE 482 + #define RKISP1_CIF_ISP_EXP_BLOCK_MIN_VSIZE_V12 0xE 483 + #define RKISP1_CIF_ISP_EXP_MAX_HSIZE_V12 \ 484 + (RKISP1_CIF_ISP_EXP_BLOCK_MAX_HSIZE_V12 * RKISP1_CIF_ISP_EXP_COLUMN_NUM_V12 + 1) 485 + #define RKISP1_CIF_ISP_EXP_MIN_HSIZE_V12 \ 486 + (RKISP1_CIF_ISP_EXP_BLOCK_MIN_HSIZE_V12 * RKISP1_CIF_ISP_EXP_COLUMN_NUM_V12 + 1) 487 + #define RKISP1_CIF_ISP_EXP_MAX_VSIZE_V12 \ 488 + (RKISP1_CIF_ISP_EXP_BLOCK_MAX_VSIZE_V12 * RKISP1_CIF_ISP_EXP_ROW_NUM_V12 + 1) 489 + #define RKISP1_CIF_ISP_EXP_MIN_VSIZE_V12 \ 490 + (RKISP1_CIF_ISP_EXP_BLOCK_MIN_VSIZE_V12 * RKISP1_CIF_ISP_EXP_ROW_NUM_V12 + 1) 491 + 492 + #define RKISP1_CIF_ISP_EXP_GET_MEAN_xy0_V12(x) ((x) & 0xFF) 493 + #define RKISP1_CIF_ISP_EXP_GET_MEAN_xy1_V12(x) (((x) >> 8) & 0xFF) 494 + #define RKISP1_CIF_ISP_EXP_GET_MEAN_xy2_V12(x) (((x) >> 16) & 0xFF) 495 + #define RKISP1_CIF_ISP_EXP_GET_MEAN_xy3_V12(x) (((x) >> 24) & 0xFF) 496 + 545 497 /* LSC: ISP_LSC_CTRL */ 546 498 #define RKISP1_CIF_ISP_LSC_CTRL_ENA BIT(0) 547 499 #define RKISP1_CIF_ISP_LSC_SECT_SIZE_RESERVED 0xFC00FC00 548 500 #define RKISP1_CIF_ISP_LSC_GRAD_RESERVED_V10 0xF000F000 549 501 #define RKISP1_CIF_ISP_LSC_SAMPLE_RESERVED_V10 0xF000F000 502 + #define RKISP1_CIF_ISP_LSC_GRAD_RESERVED_V12 0xE000E000 503 + #define RKISP1_CIF_ISP_LSC_SAMPLE_RESERVED_V12 0xE000E000 550 504 #define RKISP1_CIF_ISP_LSC_TABLE_DATA_V10(v0, v1) \ 551 505 (((v0) & 0xFFF) | (((v1) & 0xFFF) << 12)) 506 + #define RKISP1_CIF_ISP_LSC_TABLE_DATA_V12(v0, v1) \ 507 + (((v0) & 0x1FFF) | (((v1) & 0x1FFF) << 13)) 552 508 #define RKISP1_CIF_ISP_LSC_SECT_SIZE(v0, v1) \ 553 509 (((v0) & 0xFFF) | (((v1) & 0xFFF) << 16)) 554 510 #define RKISP1_CIF_ISP_LSC_GRAD_SIZE(v0, v1) \ ··· 648 550 (1 << 15) | (1 << 11) | (1 << 7) | (1 << 3)) 649 551 #define RKISP1_CIFISP_DEGAMMA_Y_RESERVED 0xFFFFF000 650 552 553 + /* GAMMA-OUT */ 554 + #define RKISP1_CIF_ISP_GAMMA_VALUE_V12(x, y) \ 555 + (((x) & 0xFFF) << 16 | ((y) & 0xFFF) << 0) 556 + 651 557 /* AFM */ 652 558 #define RKISP1_CIF_ISP_AFM_ENA BIT(0) 653 559 #define RKISP1_CIF_ISP_AFM_THRES_RESERVED 0xFFFF0000 ··· 662 560 #define RKISP1_CIF_ISP_AFM_WINDOW_Y_MIN 0x2 663 561 #define RKISP1_CIF_ISP_AFM_WINDOW_X(x) (((x) & 0x1FFF) << 16) 664 562 #define RKISP1_CIF_ISP_AFM_WINDOW_Y(x) ((x) & 0x1FFF) 563 + #define RKISP1_CIF_ISP_AFM_SET_SHIFT_a_V12(x, y) (((x) & 0x7) << 16 | ((y) & 0x7) << 0) 564 + #define RKISP1_CIF_ISP_AFM_SET_SHIFT_b_V12(x, y) (((x) & 0x7) << 20 | ((y) & 0x7) << 4) 565 + #define RKISP1_CIF_ISP_AFM_SET_SHIFT_c_V12(x, y) (((x) & 0x7) << 24 | ((y) & 0x7) << 8) 566 + #define RKISP1_CIF_ISP_AFM_GET_LUM_SHIFT_a_V12(x) (((x) & 0x70000) >> 16) 567 + #define RKISP1_CIF_ISP_AFM_GET_AFM_SHIFT_a_V12(x) ((x) & 0x7) 665 568 666 569 /* DPF */ 667 570 #define RKISP1_CIF_ISP_DPF_MODE_EN BIT(0) ··· 689 582 #define RKISP1_CIF_CTRL_BASE 0x00000000 690 583 #define RKISP1_CIF_CCL (RKISP1_CIF_CTRL_BASE + 0x00000000) 691 584 #define RKISP1_CIF_VI_ID (RKISP1_CIF_CTRL_BASE + 0x00000008) 585 + #define RKISP1_CIF_VI_ISP_CLK_CTRL_V12 (RKISP1_CIF_CTRL_BASE + 0x0000000C) 692 586 #define RKISP1_CIF_ICCL (RKISP1_CIF_CTRL_BASE + 0x00000010) 693 587 #define RKISP1_CIF_IRCL (RKISP1_CIF_CTRL_BASE + 0x00000014) 694 588 #define RKISP1_CIF_VI_DPCL (RKISP1_CIF_CTRL_BASE + 0x00000018) ··· 787 679 #define RKISP1_CIF_ISP_AWB_GAIN_RB_V10 (RKISP1_CIF_ISP_BASE + 0x0000013C) 788 680 #define RKISP1_CIF_ISP_AWB_WHITE_CNT_V10 (RKISP1_CIF_ISP_BASE + 0x00000140) 789 681 #define RKISP1_CIF_ISP_AWB_MEAN_V10 (RKISP1_CIF_ISP_BASE + 0x00000144) 682 + #define RKISP1_CIF_ISP_AWB_PROP_V12 (RKISP1_CIF_ISP_BASE + 0x00000110) 683 + #define RKISP1_CIF_ISP_AWB_SIZE_V12 (RKISP1_CIF_ISP_BASE + 0x00000114) 684 + #define RKISP1_CIF_ISP_AWB_OFFS_V12 (RKISP1_CIF_ISP_BASE + 0x00000118) 685 + #define RKISP1_CIF_ISP_AWB_REF_V12 (RKISP1_CIF_ISP_BASE + 0x0000011C) 686 + #define RKISP1_CIF_ISP_AWB_THRESH_V12 (RKISP1_CIF_ISP_BASE + 0x00000120) 687 + #define RKISP1_CIF_ISP_X_COOR12_V12 (RKISP1_CIF_ISP_BASE + 0x00000124) 688 + #define RKISP1_CIF_ISP_X_COOR34_V12 (RKISP1_CIF_ISP_BASE + 0x00000128) 689 + #define RKISP1_CIF_ISP_AWB_WHITE_CNT_V12 (RKISP1_CIF_ISP_BASE + 0x0000012C) 690 + #define RKISP1_CIF_ISP_AWB_MEAN_V12 (RKISP1_CIF_ISP_BASE + 0x00000130) 691 + #define RKISP1_CIF_ISP_DEGAIN_V12 (RKISP1_CIF_ISP_BASE + 0x00000134) 692 + #define RKISP1_CIF_ISP_AWB_GAIN_G_V12 (RKISP1_CIF_ISP_BASE + 0x00000138) 693 + #define RKISP1_CIF_ISP_AWB_GAIN_RB_V12 (RKISP1_CIF_ISP_BASE + 0x0000013C) 694 + #define RKISP1_CIF_ISP_REGION_LINE_V12 (RKISP1_CIF_ISP_BASE + 0x00000140) 695 + #define RKISP1_CIF_ISP_WP_CNT_REGION0_V12 (RKISP1_CIF_ISP_BASE + 0x00000160) 696 + #define RKISP1_CIF_ISP_WP_CNT_REGION1_V12 (RKISP1_CIF_ISP_BASE + 0x00000164) 697 + #define RKISP1_CIF_ISP_WP_CNT_REGION2_V12 (RKISP1_CIF_ISP_BASE + 0x00000168) 698 + #define RKISP1_CIF_ISP_WP_CNT_REGION3_V12 (RKISP1_CIF_ISP_BASE + 0x0000016C) 790 699 #define RKISP1_CIF_ISP_CC_COEFF_0 (RKISP1_CIF_ISP_BASE + 0x00000170) 791 700 #define RKISP1_CIF_ISP_CC_COEFF_1 (RKISP1_CIF_ISP_BASE + 0x00000174) 792 701 #define RKISP1_CIF_ISP_CC_COEFF_2 (RKISP1_CIF_ISP_BASE + 0x00000178) ··· 861 736 #define RKISP1_CIF_ISP_CT_OFFSET_R (RKISP1_CIF_ISP_BASE + 0x00000248) 862 737 #define RKISP1_CIF_ISP_CT_OFFSET_G (RKISP1_CIF_ISP_BASE + 0x0000024C) 863 738 #define RKISP1_CIF_ISP_CT_OFFSET_B (RKISP1_CIF_ISP_BASE + 0x00000250) 739 + #define RKISP1_CIF_ISP_GAMMA_OUT_MODE_V12 (RKISP1_CIF_ISP_BASE + 0x00000300) 740 + #define RKISP1_CIF_ISP_GAMMA_OUT_Y_0_V12 (RKISP1_CIF_ISP_BASE + 0x00000304) 864 741 865 742 #define RKISP1_CIF_ISP_FLASH_BASE 0x00000660 866 743 #define RKISP1_CIF_ISP_FLASH_CMD (RKISP1_CIF_ISP_FLASH_BASE + 0x00000000) ··· 1215 1088 #define RKISP1_CIF_ISP_EXP_MEAN_24_V10 (RKISP1_CIF_ISP_EXP_BASE + 0x0000006c) 1216 1089 #define RKISP1_CIF_ISP_EXP_MEAN_34_V10 (RKISP1_CIF_ISP_EXP_BASE + 0x00000070) 1217 1090 #define RKISP1_CIF_ISP_EXP_MEAN_44_V10 (RKISP1_CIF_ISP_EXP_BASE + 0x00000074) 1091 + #define RKISP1_CIF_ISP_EXP_SIZE_V12 (RKISP1_CIF_ISP_EXP_BASE + 0x00000004) 1092 + #define RKISP1_CIF_ISP_EXP_OFFS_V12 (RKISP1_CIF_ISP_EXP_BASE + 0x00000008) 1093 + #define RKISP1_CIF_ISP_EXP_MEAN_V12 (RKISP1_CIF_ISP_EXP_BASE + 0x0000000c) 1218 1094 1219 1095 #define RKISP1_CIF_ISP_BLS_BASE 0x00002700 1220 1096 #define RKISP1_CIF_ISP_BLS_CTRL (RKISP1_CIF_ISP_BLS_BASE + 0x00000000) ··· 1378 1248 #define RKISP1_CIF_ISP_WDR_TONECURVE_YM_31_SHD (RKISP1_CIF_ISP_WDR_BASE + 0x0000012C) 1379 1249 #define RKISP1_CIF_ISP_WDR_TONECURVE_YM_32_SHD (RKISP1_CIF_ISP_WDR_BASE + 0x00000130) 1380 1250 1251 + #define RKISP1_CIF_ISP_HIST_BASE_V12 0x00002C00 1252 + #define RKISP1_CIF_ISP_HIST_CTRL_V12 (RKISP1_CIF_ISP_HIST_BASE_V12 + 0x00000000) 1253 + #define RKISP1_CIF_ISP_HIST_SIZE_V12 (RKISP1_CIF_ISP_HIST_BASE_V12 + 0x00000004) 1254 + #define RKISP1_CIF_ISP_HIST_OFFS_V12 (RKISP1_CIF_ISP_HIST_BASE_V12 + 0x00000008) 1255 + #define RKISP1_CIF_ISP_HIST_DBG1_V12 (RKISP1_CIF_ISP_HIST_BASE_V12 + 0x0000000C) 1256 + #define RKISP1_CIF_ISP_HIST_DBG2_V12 (RKISP1_CIF_ISP_HIST_BASE_V12 + 0x0000001C) 1257 + #define RKISP1_CIF_ISP_HIST_DBG3_V12 (RKISP1_CIF_ISP_HIST_BASE_V12 + 0x0000002C) 1258 + #define RKISP1_CIF_ISP_HIST_WEIGHT_V12 (RKISP1_CIF_ISP_HIST_BASE_V12 + 0x0000003C) 1259 + #define RKISP1_CIF_ISP_HIST_BIN_V12 (RKISP1_CIF_ISP_HIST_BASE_V12 + 0x00000120) 1260 + 1381 1261 #define RKISP1_CIF_ISP_VSM_BASE 0x00002F00 1382 1262 #define RKISP1_CIF_ISP_VSM_MODE (RKISP1_CIF_ISP_VSM_BASE + 0x00000000) 1383 1263 #define RKISP1_CIF_ISP_VSM_H_OFFS (RKISP1_CIF_ISP_VSM_BASE + 0x00000004) ··· 1398 1258 #define RKISP1_CIF_ISP_VSM_V_SEGMENTS (RKISP1_CIF_ISP_VSM_BASE + 0x00000018) 1399 1259 #define RKISP1_CIF_ISP_VSM_DELTA_H (RKISP1_CIF_ISP_VSM_BASE + 0x0000001C) 1400 1260 #define RKISP1_CIF_ISP_VSM_DELTA_V (RKISP1_CIF_ISP_VSM_BASE + 0x00000020) 1261 + 1262 + #define RKISP1_CIF_ISP_CSI0_BASE 0x00007000 1263 + #define RKISP1_CIF_ISP_CSI0_CTRL0 (RKISP1_CIF_ISP_CSI0_BASE + 0x00000000) 1401 1264 1402 1265 #endif /* _RKISP1_REGS_H */
+72 -1
drivers/media/platform/rockchip/rkisp1/rkisp1-stats.c
··· 195 195 RKISP1_CIF_ISP_AWB_GET_MEAN_Y_G(reg_val); 196 196 } 197 197 198 + static void rkisp1_stats_get_awb_meas_v12(struct rkisp1_stats *stats, 199 + struct rkisp1_stat_buffer *pbuf) 200 + { 201 + /* Protect against concurrent access from ISR? */ 202 + struct rkisp1_device *rkisp1 = stats->rkisp1; 203 + u32 reg_val; 204 + 205 + pbuf->meas_type |= RKISP1_CIF_ISP_STAT_AWB; 206 + reg_val = rkisp1_read(rkisp1, RKISP1_CIF_ISP_AWB_WHITE_CNT_V12); 207 + pbuf->params.awb.awb_mean[0].cnt = 208 + RKISP1_CIF_ISP_AWB_GET_PIXEL_CNT(reg_val); 209 + reg_val = rkisp1_read(rkisp1, RKISP1_CIF_ISP_AWB_MEAN_V12); 210 + 211 + pbuf->params.awb.awb_mean[0].mean_cr_or_r = 212 + RKISP1_CIF_ISP_AWB_GET_MEAN_CR_R(reg_val); 213 + pbuf->params.awb.awb_mean[0].mean_cb_or_b = 214 + RKISP1_CIF_ISP_AWB_GET_MEAN_CB_B(reg_val); 215 + pbuf->params.awb.awb_mean[0].mean_y_or_g = 216 + RKISP1_CIF_ISP_AWB_GET_MEAN_Y_G(reg_val); 217 + } 218 + 198 219 static void rkisp1_stats_get_aec_meas_v10(struct rkisp1_stats *stats, 199 220 struct rkisp1_stat_buffer *pbuf) 200 221 { ··· 227 206 pbuf->params.ae.exp_mean[i] = 228 207 (u8)rkisp1_read(rkisp1, 229 208 RKISP1_CIF_ISP_EXP_MEAN_00_V10 + i * 4); 209 + } 210 + 211 + static void rkisp1_stats_get_aec_meas_v12(struct rkisp1_stats *stats, 212 + struct rkisp1_stat_buffer *pbuf) 213 + { 214 + struct rkisp1_device *rkisp1 = stats->rkisp1; 215 + u32 value; 216 + int i; 217 + 218 + pbuf->meas_type |= RKISP1_CIF_ISP_STAT_AUTOEXP; 219 + for (i = 0; i < RKISP1_CIF_ISP_AE_MEAN_MAX_V12 / 4; i++) { 220 + value = rkisp1_read(rkisp1, RKISP1_CIF_ISP_EXP_MEAN_V12 + i * 4); 221 + pbuf->params.ae.exp_mean[4 * i + 0] = 222 + RKISP1_CIF_ISP_EXP_GET_MEAN_xy0_V12(value); 223 + pbuf->params.ae.exp_mean[4 * i + 1] = 224 + RKISP1_CIF_ISP_EXP_GET_MEAN_xy1_V12(value); 225 + pbuf->params.ae.exp_mean[4 * i + 2] = 226 + RKISP1_CIF_ISP_EXP_GET_MEAN_xy2_V12(value); 227 + pbuf->params.ae.exp_mean[4 * i + 3] = 228 + RKISP1_CIF_ISP_EXP_GET_MEAN_xy3_V12(value); 229 + } 230 + 231 + value = rkisp1_read(rkisp1, RKISP1_CIF_ISP_EXP_MEAN_V12 + i * 4); 232 + pbuf->params.ae.exp_mean[4 * i + 0] = RKISP1_CIF_ISP_EXP_GET_MEAN_xy0_V12(value); 230 233 } 231 234 232 235 static void rkisp1_stats_get_afc_meas(struct rkisp1_stats *stats, ··· 281 236 u32 reg_val = rkisp1_read(rkisp1, RKISP1_CIF_ISP_HIST_BIN_0_V10 + i * 4); 282 237 283 238 pbuf->params.hist.hist_bins[i] = RKISP1_CIF_ISP_HIST_GET_BIN_V10(reg_val); 239 + } 240 + } 241 + 242 + static void rkisp1_stats_get_hst_meas_v12(struct rkisp1_stats *stats, 243 + struct rkisp1_stat_buffer *pbuf) 244 + { 245 + struct rkisp1_device *rkisp1 = stats->rkisp1; 246 + u32 value; 247 + int i; 248 + 249 + pbuf->meas_type |= RKISP1_CIF_ISP_STAT_HIST; 250 + for (i = 0; i < RKISP1_CIF_ISP_HIST_BIN_N_MAX_V12 / 2; i++) { 251 + value = rkisp1_read(rkisp1, RKISP1_CIF_ISP_HIST_BIN_V12 + i * 4); 252 + pbuf->params.hist.hist_bins[2 * i] = 253 + RKISP1_CIF_ISP_HIST_GET_BIN0_V12(value); 254 + pbuf->params.hist.hist_bins[2 * i + 1] = 255 + RKISP1_CIF_ISP_HIST_GET_BIN1_V12(value); 284 256 } 285 257 } 286 258 ··· 352 290 .get_awb_meas = rkisp1_stats_get_awb_meas_v10, 353 291 .get_aec_meas = rkisp1_stats_get_aec_meas_v10, 354 292 .get_hst_meas = rkisp1_stats_get_hst_meas_v10, 293 + }; 294 + 295 + static struct rkisp1_stats_ops rkisp1_v12_stats_ops = { 296 + .get_awb_meas = rkisp1_stats_get_awb_meas_v12, 297 + .get_aec_meas = rkisp1_stats_get_aec_meas_v12, 298 + .get_hst_meas = rkisp1_stats_get_hst_meas_v12, 355 299 }; 356 300 357 301 static void ··· 427 359 stats->vdev_fmt.fmt.meta.buffersize = 428 360 sizeof(struct rkisp1_stat_buffer); 429 361 430 - stats->ops = &rkisp1_v10_stats_ops; 362 + if (stats->rkisp1->media_dev.hw_revision == RKISP1_V12) 363 + stats->ops = &rkisp1_v12_stats_ops; 364 + else 365 + stats->ops = &rkisp1_v10_stats_ops; 431 366 } 432 367 433 368 int rkisp1_stats_register(struct rkisp1_device *rkisp1)