Pull media fixes from Mauro Carvalho Chehab: "The rockship rkisp1 driver will be promoted from staging in 5.11. While not too late, do a few uAPI changes which are needed to better support its functionalities" * tag 'media/v5.11-3' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media: media: rockchip: rkisp1: extend uapi array sizes media: rockchip: rkisp1: carry ip version information media: rockchip: rkisp1: reduce number of histogram grid elements in uapi media: rkisp1: stats: mask the hist_bins values media: rkisp1: stats: remove a wrong cast to u8 media: rkisp1: uapi: change hist_bins array type from __u16 to __u32
Unified · Split
| @@ -13,6 +13,22 @@ This file documents the driver for the Rockchip ISP1 that is part of RK3288 · 12 unmodified lines | ||
| 13 | 13 | and RK3399 SoCs. The driver is located under drivers/staging/media/rkisp1 |
| 14 | 14 | and uses the Media-Controller API. |
| 15 | 15 | |
| 16 | +Revisions | |
| 17 | +========= | |
| 18 | + | |
| 19 | +There exist multiple smaller revisions to this ISP that got introduced in | |
| 20 | +later SoCs. Revisions can be found in the enum :c:type:`rkisp1_cif_isp_version` | |
| 21 | +in the UAPI and the revision of the ISP inside the running SoC can be read | |
| 22 | +in the field hw_revision of struct media_device_info as returned by | |
| 23 | +ioctl MEDIA_IOC_DEVICE_INFO. | |
| 24 | + | |
| 25 | +Versions in use are: | |
| 26 | + | |
| 27 | +- RKISP1_V10: used at least in rk3288 and rk3399 | |
| 28 | +- RKISP1_V11: declared in the original vendor code, but not used | |
| 29 | +- RKISP1_V12: used at least in rk3326 and px30 | |
| 30 | +- RKISP1_V13: used at least in rk1808 | |
| 31 | + | |
| 16 | 32 | Topology |
| 17 | 33 | ======== |
| 18 | 34 | .. _rkisp1_topology_graph: |
| @@ -104,6 +104,7 @@ · 103 unmodified lines | ||
| 104 | 104 | struct rkisp1_match_data { |
| 105 | 105 | const char * const *clks; |
| 106 | 106 | unsigned int size; |
| 107 | + enum rkisp1_cif_isp_version isp_ver; | |
| 107 | 108 | }; |
| 108 | 109 | |
| 109 | 110 | /* ---------------------------------------------------------------------------- |
| @@ -411,15 +412,16 @@ static const char * const rk3399_isp_clks[] = { · 301 unmodified lines | ||
| 411 | 412 | "hclk", |
| 412 | 413 | }; |
| 413 | 414 | |
| 414 | −static const struct rkisp1_match_data rk3399_isp_clk_data = { | |
| 415 | +static const struct rkisp1_match_data rk3399_isp_match_data = { | |
| 415 | 416 | .clks = rk3399_isp_clks, |
| 416 | 417 | .size = ARRAY_SIZE(rk3399_isp_clks), |
| 418 | + .isp_ver = RKISP1_V10, | |
| 417 | 419 | }; |
| 418 | 420 | |
| 419 | 421 | static const struct of_device_id rkisp1_of_match[] = { |
| 420 | 422 | { |
| 421 | 423 | .compatible = "rockchip,rk3399-cif-isp", |
| 422 | − .data = &rk3399_isp_clk_data, | |
| 424 | + .data = &rk3399_isp_match_data, | |
| 423 | 425 | }, |
| 424 | 426 | {}, |
| 425 | 427 | }; |
| @@ -457,15 +459,15 @@ static void rkisp1_debug_init(struct rkisp1_device *rkisp1) · 31 unmodified lines | ||
| 457 | 459 | |
| 458 | 460 | static int rkisp1_probe(struct platform_device *pdev) |
| 459 | 461 | { |
| 460 | − const struct rkisp1_match_data *clk_data; | |
| 462 | + const struct rkisp1_match_data *match_data; | |
| 461 | 463 | struct device *dev = &pdev->dev; |
| 462 | 464 | struct rkisp1_device *rkisp1; |
| 463 | 465 | struct v4l2_device *v4l2_dev; |
| 464 | 466 | unsigned int i; |
| 465 | 467 | int ret, irq; |
| 466 | 468 | |
| 467 | − clk_data = of_device_get_match_data(&pdev->dev); | |
| 468 | − if (!clk_data) | |
| 469 | + match_data = of_device_get_match_data(&pdev->dev); | |
| 470 | + if (!match_data) | |
| 469 | 471 | return -ENODEV; |
| 470 | 472 | |
| 471 | 473 | rkisp1 = devm_kzalloc(dev, sizeof(*rkisp1), GFP_KERNEL); |
| @@ -494,15 +496,16 @@ static int rkisp1_probe(struct platform_device *pdev) · 22 unmodified lines | ||
| 494 | 496 | |
| 495 | 497 | rkisp1->irq = irq; |
| 496 | 498 | |
| 497 | − for (i = 0; i < clk_data->size; i++) | |
| 498 | − rkisp1->clks[i].id = clk_data->clks[i]; | |
| 499 | − ret = devm_clk_bulk_get(dev, clk_data->size, rkisp1->clks); | |
| 499 | + for (i = 0; i < match_data->size; i++) | |
| 500 | + rkisp1->clks[i].id = match_data->clks[i]; | |
| 501 | + ret = devm_clk_bulk_get(dev, match_data->size, rkisp1->clks); | |
| 500 | 502 | if (ret) |
| 501 | 503 | return ret; |
| 502 | − rkisp1->clk_size = clk_data->size; | |
| 504 | + rkisp1->clk_size = match_data->size; | |
| 503 | 505 | |
| 504 | 506 | pm_runtime_enable(&pdev->dev); |
| 505 | 507 | |
| 508 | + rkisp1->media_dev.hw_revision = match_data->isp_ver; | |
| 506 | 509 | strscpy(rkisp1->media_dev.model, RKISP1_DRIVER_NAME, |
| 507 | 510 | sizeof(rkisp1->media_dev.model)); |
| 508 | 511 | rkisp1->media_dev.dev = &pdev->dev; |
| @@ -391,7 +391,7 @@ static void rkisp1_goc_config(struct rkisp1_params *params, · 390 unmodified lines | ||
| 391 | 391 | RKISP1_CIF_ISP_CTRL_ISP_GAMMA_OUT_ENA); |
| 392 | 392 | rkisp1_write(params->rkisp1, arg->mode, RKISP1_CIF_ISP_GAMMA_OUT_MODE); |
| 393 | 393 | |
| 394 | − for (i = 0; i < RKISP1_CIF_ISP_GAMMA_OUT_MAX_SAMPLES; i++) | |
| 394 | + for (i = 0; i < RKISP1_CIF_ISP_GAMMA_OUT_MAX_SAMPLES_V10; i++) | |
| 395 | 395 | rkisp1_write(params->rkisp1, arg->gamma_y[i], |
| 396 | 396 | RKISP1_CIF_ISP_GAMMA_OUT_Y_0 + i * 4); |
| 397 | 397 | } |
| @@ -589,7 +589,6 @@ static void rkisp1_hst_config(struct rkisp1_params *params, · 191 unmodified lines | ||
| 589 | 589 | RKISP1_CIF_ISP_HIST_WEIGHT_22TO03, |
| 590 | 590 | RKISP1_CIF_ISP_HIST_WEIGHT_13TO43, |
| 591 | 591 | RKISP1_CIF_ISP_HIST_WEIGHT_04TO34, |
| 592 | − RKISP1_CIF_ISP_HIST_WEIGHT_44, | |
| 593 | 592 | }; |
| 594 | 593 | const u8 *weight; |
| 595 | 594 | unsigned int i; |
| @@ -622,6 +621,8 @@ static void rkisp1_hst_config(struct rkisp1_params *params, · 26 unmodified lines | ||
| 622 | 621 | weight[2], |
| 623 | 622 | weight[3]), |
| 624 | 623 | hist_weight_regs[i]); |
| 624 | + | |
| 625 | + rkisp1_write(params->rkisp1, weight[0] & 0x1F, RKISP1_CIF_ISP_HIST_WEIGHT_44); | |
| 625 | 626 | } |
| 626 | 627 | |
| 627 | 628 | static void |
| @@ -365,6 +365,7 @@ · 364 unmodified lines | ||
| 365 | 365 | #define RKISP1_CIF_ISP_MAX_HIST_PREDIVIDER 0x0000007F |
| 366 | 366 | #define RKISP1_CIF_ISP_HIST_ROW_NUM 5 |
| 367 | 367 | #define RKISP1_CIF_ISP_HIST_COLUMN_NUM 5 |
| 368 | +#define RKISP1_CIF_ISP_HIST_GET_BIN(x) ((x) & 0x000FFFFF) | |
| 368 | 369 | |
| 369 | 370 | /* AUTO FOCUS MEASUREMENT: ISP_AFM_CTRL */ |
| 370 | 371 | #define RKISP1_ISP_AFM_CTRL_ENABLE BIT(0) |
| @@ -203,7 +203,7 @@ static void rkisp1_stats_get_aec_meas(struct rkisp1_stats *stats, · 202 unmodified lines | ||
| 203 | 203 | unsigned int i; |
| 204 | 204 | |
| 205 | 205 | pbuf->meas_type |= RKISP1_CIF_ISP_STAT_AUTOEXP; |
| 206 | − for (i = 0; i < RKISP1_CIF_ISP_AE_MEAN_MAX; i++) | |
| 206 | + for (i = 0; i < RKISP1_CIF_ISP_AE_MEAN_MAX_V10; i++) | |
| 207 | 207 | pbuf->params.ae.exp_mean[i] = |
| 208 | 208 | (u8)rkisp1_read(rkisp1, |
| 209 | 209 | RKISP1_CIF_ISP_EXP_MEAN_00 + i * 4); |
| @@ -233,10 +233,11 @@ static void rkisp1_stats_get_hst_meas(struct rkisp1_stats *stats, · 23 unmodified lines | ||
| 233 | 233 | unsigned int i; |
| 234 | 234 | |
| 235 | 235 | pbuf->meas_type |= RKISP1_CIF_ISP_STAT_HIST; |
| 236 | − for (i = 0; i < RKISP1_CIF_ISP_HIST_BIN_N_MAX; i++) | |
| 237 | − pbuf->params.hist.hist_bins[i] = | |
| 238 | − (u8)rkisp1_read(rkisp1, | |
| 239 | − RKISP1_CIF_ISP_HIST_BIN_0 + i * 4); | |
| 236 | + for (i = 0; i < RKISP1_CIF_ISP_HIST_BIN_N_MAX_V10; i++) { | |
| 237 | + u32 reg_val = rkisp1_read(rkisp1, RKISP1_CIF_ISP_HIST_BIN_0 + i * 4); | |
| 238 | + | |
| 239 | + pbuf->params.hist.hist_bins[i] = RKISP1_CIF_ISP_HIST_GET_BIN(reg_val); | |
| 240 | + } | |
| 240 | 241 | } |
| 241 | 242 | |
| 242 | 243 | static void rkisp1_stats_get_bls_meas(struct rkisp1_stats *stats, |
| @@ -49,8 +49,14 @@ · 48 unmodified lines | ||
| 49 | 49 | #define RKISP1_CIF_ISP_CTK_COEFF_MAX 0x100 |
| 50 | 50 | #define RKISP1_CIF_ISP_CTK_OFFSET_MAX 0x800 |
| 51 | 51 | |
| 52 | −#define RKISP1_CIF_ISP_AE_MEAN_MAX 25 | |
| 53 | −#define RKISP1_CIF_ISP_HIST_BIN_N_MAX 16 | |
| 52 | +#define RKISP1_CIF_ISP_AE_MEAN_MAX_V10 25 | |
| 53 | +#define RKISP1_CIF_ISP_AE_MEAN_MAX_V12 81 | |
| 54 | +#define RKISP1_CIF_ISP_AE_MEAN_MAX RKISP1_CIF_ISP_AE_MEAN_MAX_V12 | |
| 55 | + | |
| 56 | +#define RKISP1_CIF_ISP_HIST_BIN_N_MAX_V10 16 | |
| 57 | +#define RKISP1_CIF_ISP_HIST_BIN_N_MAX_V12 32 | |
| 58 | +#define RKISP1_CIF_ISP_HIST_BIN_N_MAX RKISP1_CIF_ISP_HIST_BIN_N_MAX_V12 | |
| 59 | + | |
| 54 | 60 | #define RKISP1_CIF_ISP_AFM_MAX_WINDOWS 3 |
| 55 | 61 | #define RKISP1_CIF_ISP_DEGAMMA_CURVE_SIZE 17 |
| 56 | 62 | |
| @@ -86,7 +92,9 @@ · 29 unmodified lines | ||
| 86 | 92 | * Gamma out |
| 87 | 93 | */ |
| 88 | 94 | /* Maximum number of color samples supported */ |
| 89 | −#define RKISP1_CIF_ISP_GAMMA_OUT_MAX_SAMPLES 17 | |
| 95 | +#define RKISP1_CIF_ISP_GAMMA_OUT_MAX_SAMPLES_V10 17 | |
| 96 | +#define RKISP1_CIF_ISP_GAMMA_OUT_MAX_SAMPLES_V12 34 | |
| 97 | +#define RKISP1_CIF_ISP_GAMMA_OUT_MAX_SAMPLES RKISP1_CIF_ISP_GAMMA_OUT_MAX_SAMPLES_V12 | |
| 90 | 98 | |
| 91 | 99 | /* |
| 92 | 100 | * Lens shade correction |
| @@ -102,8 +110,9 @@ · 9 unmodified lines | ||
| 102 | 110 | /* |
| 103 | 111 | * Histogram calculation |
| 104 | 112 | */ |
| 105 | −/* Last 3 values unused. */ | |
| 106 | −#define RKISP1_CIF_ISP_HISTOGRAM_WEIGHT_GRIDS_SIZE 28 | |
| 113 | +#define RKISP1_CIF_ISP_HISTOGRAM_WEIGHT_GRIDS_SIZE_V10 25 | |
| 114 | +#define RKISP1_CIF_ISP_HISTOGRAM_WEIGHT_GRIDS_SIZE_V12 81 | |
| 115 | +#define RKISP1_CIF_ISP_HISTOGRAM_WEIGHT_GRIDS_SIZE RKISP1_CIF_ISP_HISTOGRAM_WEIGHT_GRIDS_SIZE_V12 | |
| 107 | 116 | |
| 108 | 117 | /* |
| 109 | 118 | * Defect Pixel Cluster Correction |
| @@ -124,6 +133,21 @@ · 14 unmodified lines | ||
| 124 | 133 | #define RKISP1_CIF_ISP_STAT_AFM (1U << 2) |
| 125 | 134 | #define RKISP1_CIF_ISP_STAT_HIST (1U << 3) |
| 126 | 135 | |
| 136 | +/** | |
| 137 | + * enum rkisp1_cif_isp_version - ISP variants | |
| 138 | + * | |
| 139 | + * @RKISP1_V10: used at least in rk3288 and rk3399 | |
| 140 | + * @RKISP1_V11: declared in the original vendor code, but not used | |
| 141 | + * @RKISP1_V12: used at least in rk3326 and px30 | |
| 142 | + * @RKISP1_V13: used at least in rk1808 | |
| 143 | + */ | |
| 144 | +enum rkisp1_cif_isp_version { | |
| 145 | + RKISP1_V10 = 10, | |
| 146 | + RKISP1_V11, | |
| 147 | + RKISP1_V12, | |
| 148 | + RKISP1_V13, | |
| 149 | +}; | |
| 150 | + | |
| 127 | 151 | enum rkisp1_cif_isp_histogram_mode { |
| 128 | 152 | RKISP1_CIF_ISP_HISTOGRAM_MODE_DISABLE, |
| 129 | 153 | RKISP1_CIF_ISP_HISTOGRAM_MODE_RGB_COMBINED, |
| @@ -510,6 +534,15 @@ enum rkisp1_cif_isp_goc_mode { · 380 unmodified lines | ||
| 510 | 534 | * |
| 511 | 535 | * @mode: goc mode (from enum rkisp1_cif_isp_goc_mode) |
| 512 | 536 | * @gamma_y: gamma out curve y-axis for all color components |
| 537 | + * | |
| 538 | + * The number of entries of @gamma_y depends on the hardware revision | |
| 539 | + * as is reported by the hw_revision field of the struct media_device_info | |
| 540 | + * that is returned by ioctl MEDIA_IOC_DEVICE_INFO. | |
| 541 | + * | |
| 542 | + * Versions <= V11 have RKISP1_CIF_ISP_GAMMA_OUT_MAX_SAMPLES_V10 | |
| 543 | + * entries, versions >= V12 have RKISP1_CIF_ISP_GAMMA_OUT_MAX_SAMPLES_V12 | |
| 544 | + * entries. RKISP1_CIF_ISP_GAMMA_OUT_MAX_SAMPLES is equal to the maximum | |
| 545 | + * of the two. | |
| 513 | 546 | */ |
| 514 | 547 | struct rkisp1_cif_isp_goc_config { |
| 515 | 548 | __u32 mode; |
| @@ -524,6 +557,15 @@ struct rkisp1_cif_isp_goc_config { · 8 unmodified lines | ||
| 524 | 557 | * skipped |
| 525 | 558 | * @meas_window: coordinates of the measure window |
| 526 | 559 | * @hist_weight: weighting factor for sub-windows |
| 560 | + * | |
| 561 | + * The number of entries of @hist_weight depends on the hardware revision | |
| 562 | + * as is reported by the hw_revision field of the struct media_device_info | |
| 563 | + * that is returned by ioctl MEDIA_IOC_DEVICE_INFO. | |
| 564 | + * | |
| 565 | + * Versions <= V11 have RKISP1_CIF_ISP_HISTOGRAM_WEIGHT_GRIDS_SIZE_V10 | |
| 566 | + * entries, versions >= V12 have RKISP1_CIF_ISP_HISTOGRAM_WEIGHT_GRIDS_SIZE_V12 | |
| 567 | + * entries. RKISP1_CIF_ISP_HISTOGRAM_WEIGHT_GRIDS_SIZE is equal to the maximum | |
| 568 | + * of the two. | |
| 527 | 569 | */ |
| 528 | 570 | struct rkisp1_cif_isp_hst_config { |
| 529 | 571 | __u32 mode; |
| @@ -811,7 +853,15 @@ struct rkisp1_cif_isp_bls_meas_val { · 281 unmodified lines | ||
| 811 | 853 | * @exp_mean: Mean luminance value of block xx |
| 812 | 854 | * @bls_val: BLS measured values |
| 813 | 855 | * |
| 814 | − * Image is divided into 5x5 blocks. | |
| 856 | + * The number of entries of @exp_mean depends on the hardware revision | |
| 857 | + * as is reported by the hw_revision field of the struct media_device_info | |
| 858 | + * that is returned by ioctl MEDIA_IOC_DEVICE_INFO. | |
| 859 | + * | |
| 860 | + * Versions <= V11 have RKISP1_CIF_ISP_AE_MEAN_MAX_V10 entries, | |
| 861 | + * versions >= V12 have RKISP1_CIF_ISP_AE_MEAN_MAX_V12 entries. | |
| 862 | + * RKISP1_CIF_ISP_AE_MEAN_MAX is equal to the maximum of the two. | |
| 863 | + * | |
| 864 | + * Image is divided into 5x5 blocks on V10 and 9x9 blocks on V12. | |
| 815 | 865 | */ |
| 816 | 866 | struct rkisp1_cif_isp_ae_stat { |
| 817 | 867 | __u8 exp_mean[RKISP1_CIF_ISP_AE_MEAN_MAX]; |
| @@ -844,13 +894,29 @@ struct rkisp1_cif_isp_af_stat { · 26 unmodified lines | ||
| 844 | 894 | /** |
| 845 | 895 | * struct rkisp1_cif_isp_hist_stat - statistics histogram data |
| 846 | 896 | * |
| 847 | − * @hist_bins: measured bin counters | |
| 897 | + * @hist_bins: measured bin counters. Each bin is a 20 bits unsigned fixed point | |
| 898 | + * type. Bits 0-4 are the fractional part and bits 5-19 are the | |
| 899 | + * integer part. | |
| 900 | + * | |
| 901 | + * The window of the measurements area is divided to 5x5 sub-windows for | |
| 902 | + * V10/V11 and to 9x9 sub-windows for V12. The histogram is then computed for | |
| 903 | + * each sub-window independently and the final result is a weighted average of | |
| 904 | + * the histogram measurements on all sub-windows. The window of the | |
| 905 | + * measurements area and the weight of each sub-window are configurable using | |
| 906 | + * struct @rkisp1_cif_isp_hst_config. | |
| 907 | + * | |
| 908 | + * The histogram contains 16 bins in V10/V11 and 32 bins in V12/V13. | |
| 909 | + * | |
| 910 | + * The number of entries of @hist_bins depends on the hardware revision | |
| 911 | + * as is reported by the hw_revision field of the struct media_device_info | |
| 912 | + * that is returned by ioctl MEDIA_IOC_DEVICE_INFO. | |
| 848 | 913 | * |
| 849 | − * Measurement window divided into 25 sub-windows, set | |
| 850 | − * with ISP_HIST_XXX | |
| 914 | + * Versions <= V11 have RKISP1_CIF_ISP_HIST_BIN_N_MAX_V10 entries, | |
| 915 | + * versions >= V12 have RKISP1_CIF_ISP_HIST_BIN_N_MAX_V12 entries. | |
| 916 | + * RKISP1_CIF_ISP_HIST_BIN_N_MAX is equal to the maximum of the two. | |
| 851 | 917 | */ |
| 852 | 918 | struct rkisp1_cif_isp_hist_stat { |
| 853 | − __u16 hist_bins[RKISP1_CIF_ISP_HIST_BIN_N_MAX]; | |
| 919 | + __u32 hist_bins[RKISP1_CIF_ISP_HIST_BIN_N_MAX]; | |
| 854 | 920 | }; |
| 855 | 921 | |
| 856 | 922 | /** |