linux/drivers/staging/media/rkisp1/rkisp1-params.c
<<
>>
Prefs
   1// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
   2/*
   3 * Rockchip ISP1 Driver - Params subdevice
   4 *
   5 * Copyright (C) 2017 Rockchip Electronics Co., Ltd.
   6 */
   7
   8#include <media/v4l2-common.h>
   9#include <media/v4l2-event.h>
  10#include <media/v4l2-ioctl.h>
  11#include <media/videobuf2-core.h>
  12#include <media/videobuf2-vmalloc.h>    /* for ISP params */
  13
  14#include "rkisp1-common.h"
  15
  16#define RKISP1_PARAMS_DEV_NAME  RKISP1_DRIVER_NAME "_params"
  17
  18#define RKISP1_ISP_PARAMS_REQ_BUFS_MIN  2
  19#define RKISP1_ISP_PARAMS_REQ_BUFS_MAX  8
  20
  21#define RKISP1_ISP_DPCC_LINE_THRESH(n) \
  22                        (RKISP1_CIF_ISP_DPCC_LINE_THRESH_1 + 0x14 * (n))
  23#define RKISP1_ISP_DPCC_LINE_MAD_FAC(n) \
  24                        (RKISP1_CIF_ISP_DPCC_LINE_MAD_FAC_1 + 0x14 * (n))
  25#define RKISP1_ISP_DPCC_PG_FAC(n) \
  26                        (RKISP1_CIF_ISP_DPCC_PG_FAC_1 + 0x14 * (n))
  27#define RKISP1_ISP_DPCC_RND_THRESH(n) \
  28                        (RKISP1_CIF_ISP_DPCC_RND_THRESH_1 + 0x14 * (n))
  29#define RKISP1_ISP_DPCC_RG_FAC(n) \
  30                        (RKISP1_CIF_ISP_DPCC_RG_FAC_1 + 0x14 * (n))
  31#define RKISP1_ISP_CC_COEFF(n) \
  32                        (RKISP1_CIF_ISP_CC_COEFF_0 + (n) * 4)
  33
  34static inline void
  35rkisp1_param_set_bits(struct rkisp1_params *params, u32 reg, u32 bit_mask)
  36{
  37        u32 val;
  38
  39        val = rkisp1_read(params->rkisp1, reg);
  40        rkisp1_write(params->rkisp1, val | bit_mask, reg);
  41}
  42
  43static inline void
  44rkisp1_param_clear_bits(struct rkisp1_params *params, u32 reg, u32 bit_mask)
  45{
  46        u32 val;
  47
  48        val = rkisp1_read(params->rkisp1, reg);
  49        rkisp1_write(params->rkisp1, val & ~bit_mask, reg);
  50}
  51
  52/* ISP BP interface function */
  53static void rkisp1_dpcc_config(struct rkisp1_params *params,
  54                               const struct rkisp1_cif_isp_dpcc_config *arg)
  55{
  56        unsigned int i;
  57        u32 mode;
  58
  59        /* avoid to override the old enable value */
  60        mode = rkisp1_read(params->rkisp1, RKISP1_CIF_ISP_DPCC_MODE);
  61        mode &= RKISP1_CIF_ISP_DPCC_ENA;
  62        mode |= arg->mode & ~RKISP1_CIF_ISP_DPCC_ENA;
  63        rkisp1_write(params->rkisp1, mode, RKISP1_CIF_ISP_DPCC_MODE);
  64        rkisp1_write(params->rkisp1, arg->output_mode,
  65                     RKISP1_CIF_ISP_DPCC_OUTPUT_MODE);
  66        rkisp1_write(params->rkisp1, arg->set_use,
  67                     RKISP1_CIF_ISP_DPCC_SET_USE);
  68
  69        rkisp1_write(params->rkisp1, arg->methods[0].method,
  70                     RKISP1_CIF_ISP_DPCC_METHODS_SET_1);
  71        rkisp1_write(params->rkisp1, arg->methods[1].method,
  72                     RKISP1_CIF_ISP_DPCC_METHODS_SET_2);
  73        rkisp1_write(params->rkisp1, arg->methods[2].method,
  74                     RKISP1_CIF_ISP_DPCC_METHODS_SET_3);
  75        for (i = 0; i < RKISP1_CIF_ISP_DPCC_METHODS_MAX; i++) {
  76                rkisp1_write(params->rkisp1, arg->methods[i].line_thresh,
  77                             RKISP1_ISP_DPCC_LINE_THRESH(i));
  78                rkisp1_write(params->rkisp1, arg->methods[i].line_mad_fac,
  79                             RKISP1_ISP_DPCC_LINE_MAD_FAC(i));
  80                rkisp1_write(params->rkisp1, arg->methods[i].pg_fac,
  81                             RKISP1_ISP_DPCC_PG_FAC(i));
  82                rkisp1_write(params->rkisp1, arg->methods[i].rnd_thresh,
  83                             RKISP1_ISP_DPCC_RND_THRESH(i));
  84                rkisp1_write(params->rkisp1, arg->methods[i].rg_fac,
  85                             RKISP1_ISP_DPCC_RG_FAC(i));
  86        }
  87
  88        rkisp1_write(params->rkisp1, arg->rnd_offs,
  89                     RKISP1_CIF_ISP_DPCC_RND_OFFS);
  90        rkisp1_write(params->rkisp1, arg->ro_limits,
  91                     RKISP1_CIF_ISP_DPCC_RO_LIMITS);
  92}
  93
  94/* ISP black level subtraction interface function */
  95static void rkisp1_bls_config(struct rkisp1_params *params,
  96                              const struct rkisp1_cif_isp_bls_config *arg)
  97{
  98        /* avoid to override the old enable value */
  99        u32 new_control;
 100
 101        new_control = rkisp1_read(params->rkisp1, RKISP1_CIF_ISP_BLS_CTRL);
 102        new_control &= RKISP1_CIF_ISP_BLS_ENA;
 103        /* fixed subtraction values */
 104        if (!arg->enable_auto) {
 105                const struct rkisp1_cif_isp_bls_fixed_val *pval =
 106                                                                &arg->fixed_val;
 107
 108                switch (params->raw_type) {
 109                case RKISP1_RAW_BGGR:
 110                        rkisp1_write(params->rkisp1,
 111                                     pval->r, RKISP1_CIF_ISP_BLS_D_FIXED);
 112                        rkisp1_write(params->rkisp1,
 113                                     pval->gr, RKISP1_CIF_ISP_BLS_C_FIXED);
 114                        rkisp1_write(params->rkisp1,
 115                                     pval->gb, RKISP1_CIF_ISP_BLS_B_FIXED);
 116                        rkisp1_write(params->rkisp1,
 117                                     pval->b, RKISP1_CIF_ISP_BLS_A_FIXED);
 118                        break;
 119                case RKISP1_RAW_GBRG:
 120                        rkisp1_write(params->rkisp1,
 121                                     pval->r, RKISP1_CIF_ISP_BLS_C_FIXED);
 122                        rkisp1_write(params->rkisp1,
 123                                     pval->gr, RKISP1_CIF_ISP_BLS_D_FIXED);
 124                        rkisp1_write(params->rkisp1,
 125                                     pval->gb, RKISP1_CIF_ISP_BLS_A_FIXED);
 126                        rkisp1_write(params->rkisp1,
 127                                     pval->b, RKISP1_CIF_ISP_BLS_B_FIXED);
 128                        break;
 129                case RKISP1_RAW_GRBG:
 130                        rkisp1_write(params->rkisp1,
 131                                     pval->r, RKISP1_CIF_ISP_BLS_B_FIXED);
 132                        rkisp1_write(params->rkisp1,
 133                                     pval->gr, RKISP1_CIF_ISP_BLS_A_FIXED);
 134                        rkisp1_write(params->rkisp1,
 135                                     pval->gb, RKISP1_CIF_ISP_BLS_D_FIXED);
 136                        rkisp1_write(params->rkisp1,
 137                                     pval->b, RKISP1_CIF_ISP_BLS_C_FIXED);
 138                        break;
 139                case RKISP1_RAW_RGGB:
 140                        rkisp1_write(params->rkisp1,
 141                                     pval->r, RKISP1_CIF_ISP_BLS_A_FIXED);
 142                        rkisp1_write(params->rkisp1,
 143                                     pval->gr, RKISP1_CIF_ISP_BLS_B_FIXED);
 144                        rkisp1_write(params->rkisp1,
 145                                     pval->gb, RKISP1_CIF_ISP_BLS_C_FIXED);
 146                        rkisp1_write(params->rkisp1,
 147                                     pval->b, RKISP1_CIF_ISP_BLS_D_FIXED);
 148                        break;
 149                default:
 150                        break;
 151                }
 152
 153        } else {
 154                if (arg->en_windows & BIT(1)) {
 155                        rkisp1_write(params->rkisp1, arg->bls_window2.h_offs,
 156                                     RKISP1_CIF_ISP_BLS_H2_START);
 157                        rkisp1_write(params->rkisp1, arg->bls_window2.h_size,
 158                                     RKISP1_CIF_ISP_BLS_H2_STOP);
 159                        rkisp1_write(params->rkisp1, arg->bls_window2.v_offs,
 160                                     RKISP1_CIF_ISP_BLS_V2_START);
 161                        rkisp1_write(params->rkisp1, arg->bls_window2.v_size,
 162                                     RKISP1_CIF_ISP_BLS_V2_STOP);
 163                        new_control |= RKISP1_CIF_ISP_BLS_WINDOW_2;
 164                }
 165
 166                if (arg->en_windows & BIT(0)) {
 167                        rkisp1_write(params->rkisp1, arg->bls_window1.h_offs,
 168                                     RKISP1_CIF_ISP_BLS_H1_START);
 169                        rkisp1_write(params->rkisp1, arg->bls_window1.h_size,
 170                                     RKISP1_CIF_ISP_BLS_H1_STOP);
 171                        rkisp1_write(params->rkisp1, arg->bls_window1.v_offs,
 172                                     RKISP1_CIF_ISP_BLS_V1_START);
 173                        rkisp1_write(params->rkisp1, arg->bls_window1.v_size,
 174                                     RKISP1_CIF_ISP_BLS_V1_STOP);
 175                        new_control |= RKISP1_CIF_ISP_BLS_WINDOW_1;
 176                }
 177
 178                rkisp1_write(params->rkisp1, arg->bls_samples,
 179                             RKISP1_CIF_ISP_BLS_SAMPLES);
 180
 181                new_control |= RKISP1_CIF_ISP_BLS_MODE_MEASURED;
 182        }
 183        rkisp1_write(params->rkisp1, new_control, RKISP1_CIF_ISP_BLS_CTRL);
 184}
 185
 186/* ISP LS correction interface function */
 187static void
 188rkisp1_lsc_correct_matrix_config(struct rkisp1_params *params,
 189                                const struct rkisp1_cif_isp_lsc_config *pconfig)
 190{
 191        unsigned int isp_lsc_status, sram_addr, isp_lsc_table_sel, i, j, data;
 192
 193        isp_lsc_status = rkisp1_read(params->rkisp1, RKISP1_CIF_ISP_LSC_STATUS);
 194
 195        /* RKISP1_CIF_ISP_LSC_TABLE_ADDRESS_153 = ( 17 * 18 ) >> 1 */
 196        sram_addr = (isp_lsc_status & RKISP1_CIF_ISP_LSC_ACTIVE_TABLE) ?
 197                    RKISP1_CIF_ISP_LSC_TABLE_ADDRESS_0 :
 198                    RKISP1_CIF_ISP_LSC_TABLE_ADDRESS_153;
 199        rkisp1_write(params->rkisp1, sram_addr,
 200                     RKISP1_CIF_ISP_LSC_R_TABLE_ADDR);
 201        rkisp1_write(params->rkisp1, sram_addr,
 202                     RKISP1_CIF_ISP_LSC_GR_TABLE_ADDR);
 203        rkisp1_write(params->rkisp1, sram_addr,
 204                     RKISP1_CIF_ISP_LSC_GB_TABLE_ADDR);
 205        rkisp1_write(params->rkisp1, sram_addr,
 206                     RKISP1_CIF_ISP_LSC_B_TABLE_ADDR);
 207
 208        /* program data tables (table size is 9 * 17 = 153) */
 209        for (i = 0;
 210             i < RKISP1_CIF_ISP_LSC_SECTORS_MAX * RKISP1_CIF_ISP_LSC_SECTORS_MAX;
 211             i += RKISP1_CIF_ISP_LSC_SECTORS_MAX) {
 212                /*
 213                 * 17 sectors with 2 values in one DWORD = 9
 214                 * DWORDs (2nd value of last DWORD unused)
 215                 */
 216                for (j = 0; j < RKISP1_CIF_ISP_LSC_SECTORS_MAX - 1; j += 2) {
 217                        data = RKISP1_CIF_ISP_LSC_TABLE_DATA(pconfig->r_data_tbl[i + j],
 218                                                             pconfig->r_data_tbl[i + j + 1]);
 219                        rkisp1_write(params->rkisp1, data,
 220                                     RKISP1_CIF_ISP_LSC_R_TABLE_DATA);
 221
 222                        data = RKISP1_CIF_ISP_LSC_TABLE_DATA(pconfig->gr_data_tbl[i + j],
 223                                                             pconfig->gr_data_tbl[i + j + 1]);
 224                        rkisp1_write(params->rkisp1, data,
 225                                     RKISP1_CIF_ISP_LSC_GR_TABLE_DATA);
 226
 227                        data = RKISP1_CIF_ISP_LSC_TABLE_DATA(pconfig->gb_data_tbl[i + j],
 228                                                             pconfig->gb_data_tbl[i + j + 1]);
 229                        rkisp1_write(params->rkisp1, data,
 230                                     RKISP1_CIF_ISP_LSC_GB_TABLE_DATA);
 231
 232                        data = RKISP1_CIF_ISP_LSC_TABLE_DATA(pconfig->b_data_tbl[i + j],
 233                                                             pconfig->b_data_tbl[i + j + 1]);
 234                        rkisp1_write(params->rkisp1, data,
 235                                     RKISP1_CIF_ISP_LSC_B_TABLE_DATA);
 236                }
 237                data = RKISP1_CIF_ISP_LSC_TABLE_DATA(pconfig->r_data_tbl[i + j], 0);
 238                rkisp1_write(params->rkisp1, data,
 239                             RKISP1_CIF_ISP_LSC_R_TABLE_DATA);
 240
 241                data = RKISP1_CIF_ISP_LSC_TABLE_DATA(pconfig->gr_data_tbl[i + j], 0);
 242                rkisp1_write(params->rkisp1, data,
 243                             RKISP1_CIF_ISP_LSC_GR_TABLE_DATA);
 244
 245                data = RKISP1_CIF_ISP_LSC_TABLE_DATA(pconfig->gb_data_tbl[i + j], 0);
 246                rkisp1_write(params->rkisp1, data,
 247                             RKISP1_CIF_ISP_LSC_GB_TABLE_DATA);
 248
 249                data = RKISP1_CIF_ISP_LSC_TABLE_DATA(pconfig->b_data_tbl[i + j], 0);
 250                rkisp1_write(params->rkisp1, data,
 251                             RKISP1_CIF_ISP_LSC_B_TABLE_DATA);
 252        }
 253        isp_lsc_table_sel = (isp_lsc_status & RKISP1_CIF_ISP_LSC_ACTIVE_TABLE) ?
 254                            RKISP1_CIF_ISP_LSC_TABLE_0 :
 255                            RKISP1_CIF_ISP_LSC_TABLE_1;
 256        rkisp1_write(params->rkisp1, isp_lsc_table_sel,
 257                     RKISP1_CIF_ISP_LSC_TABLE_SEL);
 258}
 259
 260static void rkisp1_lsc_config(struct rkisp1_params *params,
 261                              const struct rkisp1_cif_isp_lsc_config *arg)
 262{
 263        unsigned int i, data;
 264        u32 lsc_ctrl;
 265
 266        /* To config must be off , store the current status firstly */
 267        lsc_ctrl = rkisp1_read(params->rkisp1, RKISP1_CIF_ISP_LSC_CTRL);
 268        rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_LSC_CTRL,
 269                                RKISP1_CIF_ISP_LSC_CTRL_ENA);
 270        rkisp1_lsc_correct_matrix_config(params, arg);
 271
 272        for (i = 0; i < 4; i++) {
 273                /* program x size tables */
 274                data = RKISP1_CIF_ISP_LSC_SECT_SIZE(arg->x_size_tbl[i * 2],
 275                                                    arg->x_size_tbl[i * 2 + 1]);
 276                rkisp1_write(params->rkisp1, data,
 277                             RKISP1_CIF_ISP_LSC_XSIZE_01 + i * 4);
 278
 279                /* program x grad tables */
 280                data = RKISP1_CIF_ISP_LSC_SECT_SIZE(arg->x_grad_tbl[i * 2],
 281                                                    arg->x_grad_tbl[i * 2 + 1]);
 282                rkisp1_write(params->rkisp1, data,
 283                             RKISP1_CIF_ISP_LSC_XGRAD_01 + i * 4);
 284
 285                /* program y size tables */
 286                data = RKISP1_CIF_ISP_LSC_SECT_SIZE(arg->y_size_tbl[i * 2],
 287                                                    arg->y_size_tbl[i * 2 + 1]);
 288                rkisp1_write(params->rkisp1, data,
 289                             RKISP1_CIF_ISP_LSC_YSIZE_01 + i * 4);
 290
 291                /* program y grad tables */
 292                data = RKISP1_CIF_ISP_LSC_SECT_SIZE(arg->y_grad_tbl[i * 2],
 293                                                    arg->y_grad_tbl[i * 2 + 1]);
 294                rkisp1_write(params->rkisp1, data,
 295                             RKISP1_CIF_ISP_LSC_YGRAD_01 + i * 4);
 296        }
 297
 298        /* restore the lsc ctrl status */
 299        if (lsc_ctrl & RKISP1_CIF_ISP_LSC_CTRL_ENA) {
 300                rkisp1_param_set_bits(params,
 301                                      RKISP1_CIF_ISP_LSC_CTRL,
 302                                      RKISP1_CIF_ISP_LSC_CTRL_ENA);
 303        } else {
 304                rkisp1_param_clear_bits(params,
 305                                        RKISP1_CIF_ISP_LSC_CTRL,
 306                                        RKISP1_CIF_ISP_LSC_CTRL_ENA);
 307        }
 308}
 309
 310/* ISP Filtering function */
 311static void rkisp1_flt_config(struct rkisp1_params *params,
 312                              const struct rkisp1_cif_isp_flt_config *arg)
 313{
 314        u32 filt_mode;
 315
 316        rkisp1_write(params->rkisp1,
 317                     arg->thresh_bl0, RKISP1_CIF_ISP_FILT_THRESH_BL0);
 318        rkisp1_write(params->rkisp1,
 319                     arg->thresh_bl1, RKISP1_CIF_ISP_FILT_THRESH_BL1);
 320        rkisp1_write(params->rkisp1,
 321                     arg->thresh_sh0, RKISP1_CIF_ISP_FILT_THRESH_SH0);
 322        rkisp1_write(params->rkisp1,
 323                     arg->thresh_sh1, RKISP1_CIF_ISP_FILT_THRESH_SH1);
 324        rkisp1_write(params->rkisp1, arg->fac_bl0, RKISP1_CIF_ISP_FILT_FAC_BL0);
 325        rkisp1_write(params->rkisp1, arg->fac_bl1, RKISP1_CIF_ISP_FILT_FAC_BL1);
 326        rkisp1_write(params->rkisp1, arg->fac_mid, RKISP1_CIF_ISP_FILT_FAC_MID);
 327        rkisp1_write(params->rkisp1, arg->fac_sh0, RKISP1_CIF_ISP_FILT_FAC_SH0);
 328        rkisp1_write(params->rkisp1, arg->fac_sh1, RKISP1_CIF_ISP_FILT_FAC_SH1);
 329        rkisp1_write(params->rkisp1,
 330                     arg->lum_weight, RKISP1_CIF_ISP_FILT_LUM_WEIGHT);
 331
 332        rkisp1_write(params->rkisp1,
 333                     (arg->mode ? RKISP1_CIF_ISP_FLT_MODE_DNR : 0) |
 334                     RKISP1_CIF_ISP_FLT_CHROMA_V_MODE(arg->chr_v_mode) |
 335                     RKISP1_CIF_ISP_FLT_CHROMA_H_MODE(arg->chr_h_mode) |
 336                     RKISP1_CIF_ISP_FLT_GREEN_STAGE1(arg->grn_stage1),
 337                     RKISP1_CIF_ISP_FILT_MODE);
 338
 339        /* avoid to override the old enable value */
 340        filt_mode = rkisp1_read(params->rkisp1, RKISP1_CIF_ISP_FILT_MODE);
 341        filt_mode &= RKISP1_CIF_ISP_FLT_ENA;
 342        if (arg->mode)
 343                filt_mode |= RKISP1_CIF_ISP_FLT_MODE_DNR;
 344        filt_mode |= RKISP1_CIF_ISP_FLT_CHROMA_V_MODE(arg->chr_v_mode) |
 345                     RKISP1_CIF_ISP_FLT_CHROMA_H_MODE(arg->chr_h_mode) |
 346                     RKISP1_CIF_ISP_FLT_GREEN_STAGE1(arg->grn_stage1);
 347        rkisp1_write(params->rkisp1, filt_mode, RKISP1_CIF_ISP_FILT_MODE);
 348}
 349
 350/* ISP demosaic interface function */
 351static int rkisp1_bdm_config(struct rkisp1_params *params,
 352                             const struct rkisp1_cif_isp_bdm_config *arg)
 353{
 354        u32 bdm_th;
 355
 356        /* avoid to override the old enable value */
 357        bdm_th = rkisp1_read(params->rkisp1, RKISP1_CIF_ISP_DEMOSAIC);
 358        bdm_th &= RKISP1_CIF_ISP_DEMOSAIC_BYPASS;
 359        bdm_th |= arg->demosaic_th & ~RKISP1_CIF_ISP_DEMOSAIC_BYPASS;
 360        /* set demosaic threshold */
 361        rkisp1_write(params->rkisp1, bdm_th, RKISP1_CIF_ISP_DEMOSAIC);
 362        return 0;
 363}
 364
 365/* ISP GAMMA correction interface function */
 366static void rkisp1_sdg_config(struct rkisp1_params *params,
 367                              const struct rkisp1_cif_isp_sdg_config *arg)
 368{
 369        unsigned int i;
 370
 371        rkisp1_write(params->rkisp1,
 372                     arg->xa_pnts.gamma_dx0, RKISP1_CIF_ISP_GAMMA_DX_LO);
 373        rkisp1_write(params->rkisp1,
 374                     arg->xa_pnts.gamma_dx1, RKISP1_CIF_ISP_GAMMA_DX_HI);
 375
 376        for (i = 0; i < RKISP1_CIF_ISP_DEGAMMA_CURVE_SIZE; i++) {
 377                rkisp1_write(params->rkisp1, arg->curve_r.gamma_y[i],
 378                             RKISP1_CIF_ISP_GAMMA_R_Y0 + i * 4);
 379                rkisp1_write(params->rkisp1, arg->curve_g.gamma_y[i],
 380                             RKISP1_CIF_ISP_GAMMA_G_Y0 + i * 4);
 381                rkisp1_write(params->rkisp1, arg->curve_b.gamma_y[i],
 382                             RKISP1_CIF_ISP_GAMMA_B_Y0 + i * 4);
 383        }
 384}
 385
 386/* ISP GAMMA correction interface function */
 387static void rkisp1_goc_config(struct rkisp1_params *params,
 388                              const struct rkisp1_cif_isp_goc_config *arg)
 389{
 390        unsigned int i;
 391
 392        rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_CTRL,
 393                                RKISP1_CIF_ISP_CTRL_ISP_GAMMA_OUT_ENA);
 394        rkisp1_write(params->rkisp1, arg->mode, RKISP1_CIF_ISP_GAMMA_OUT_MODE);
 395
 396        for (i = 0; i < RKISP1_CIF_ISP_GAMMA_OUT_MAX_SAMPLES; i++)
 397                rkisp1_write(params->rkisp1, arg->gamma_y[i],
 398                             RKISP1_CIF_ISP_GAMMA_OUT_Y_0 + i * 4);
 399}
 400
 401/* ISP Cross Talk */
 402static void rkisp1_ctk_config(struct rkisp1_params *params,
 403                              const struct rkisp1_cif_isp_ctk_config *arg)
 404{
 405        rkisp1_write(params->rkisp1, arg->coeff0, RKISP1_CIF_ISP_CT_COEFF_0);
 406        rkisp1_write(params->rkisp1, arg->coeff1, RKISP1_CIF_ISP_CT_COEFF_1);
 407        rkisp1_write(params->rkisp1, arg->coeff2, RKISP1_CIF_ISP_CT_COEFF_2);
 408        rkisp1_write(params->rkisp1, arg->coeff3, RKISP1_CIF_ISP_CT_COEFF_3);
 409        rkisp1_write(params->rkisp1, arg->coeff4, RKISP1_CIF_ISP_CT_COEFF_4);
 410        rkisp1_write(params->rkisp1, arg->coeff5, RKISP1_CIF_ISP_CT_COEFF_5);
 411        rkisp1_write(params->rkisp1, arg->coeff6, RKISP1_CIF_ISP_CT_COEFF_6);
 412        rkisp1_write(params->rkisp1, arg->coeff7, RKISP1_CIF_ISP_CT_COEFF_7);
 413        rkisp1_write(params->rkisp1, arg->coeff8, RKISP1_CIF_ISP_CT_COEFF_8);
 414        rkisp1_write(params->rkisp1, arg->ct_offset_r,
 415                     RKISP1_CIF_ISP_CT_OFFSET_R);
 416        rkisp1_write(params->rkisp1, arg->ct_offset_g,
 417                     RKISP1_CIF_ISP_CT_OFFSET_G);
 418        rkisp1_write(params->rkisp1, arg->ct_offset_b,
 419                     RKISP1_CIF_ISP_CT_OFFSET_B);
 420}
 421
 422static void rkisp1_ctk_enable(struct rkisp1_params *params, bool en)
 423{
 424        if (en)
 425                return;
 426
 427        /* Write back the default values. */
 428        rkisp1_write(params->rkisp1, 0x80, RKISP1_CIF_ISP_CT_COEFF_0);
 429        rkisp1_write(params->rkisp1, 0, RKISP1_CIF_ISP_CT_COEFF_1);
 430        rkisp1_write(params->rkisp1, 0, RKISP1_CIF_ISP_CT_COEFF_2);
 431        rkisp1_write(params->rkisp1, 0, RKISP1_CIF_ISP_CT_COEFF_3);
 432        rkisp1_write(params->rkisp1, 0x80, RKISP1_CIF_ISP_CT_COEFF_4);
 433        rkisp1_write(params->rkisp1, 0, RKISP1_CIF_ISP_CT_COEFF_5);
 434        rkisp1_write(params->rkisp1, 0, RKISP1_CIF_ISP_CT_COEFF_6);
 435        rkisp1_write(params->rkisp1, 0, RKISP1_CIF_ISP_CT_COEFF_7);
 436        rkisp1_write(params->rkisp1, 0x80, RKISP1_CIF_ISP_CT_COEFF_8);
 437
 438        rkisp1_write(params->rkisp1, 0, RKISP1_CIF_ISP_CT_OFFSET_R);
 439        rkisp1_write(params->rkisp1, 0, RKISP1_CIF_ISP_CT_OFFSET_G);
 440        rkisp1_write(params->rkisp1, 0, RKISP1_CIF_ISP_CT_OFFSET_B);
 441}
 442
 443/* ISP White Balance Mode */
 444static void rkisp1_awb_meas_config(struct rkisp1_params *params,
 445                        const struct rkisp1_cif_isp_awb_meas_config *arg)
 446{
 447        u32 reg_val = 0;
 448        /* based on the mode,configure the awb module */
 449        if (arg->awb_mode == RKISP1_CIF_ISP_AWB_MODE_YCBCR) {
 450                /* Reference Cb and Cr */
 451                rkisp1_write(params->rkisp1,
 452                             RKISP1_CIF_ISP_AWB_REF_CR_SET(arg->awb_ref_cr) |
 453                             arg->awb_ref_cb, RKISP1_CIF_ISP_AWB_REF);
 454                /* Yc Threshold */
 455                rkisp1_write(params->rkisp1,
 456                             RKISP1_CIF_ISP_AWB_MAX_Y_SET(arg->max_y) |
 457                             RKISP1_CIF_ISP_AWB_MIN_Y_SET(arg->min_y) |
 458                             RKISP1_CIF_ISP_AWB_MAX_CS_SET(arg->max_csum) |
 459                             arg->min_c, RKISP1_CIF_ISP_AWB_THRESH);
 460        }
 461
 462        reg_val = rkisp1_read(params->rkisp1, RKISP1_CIF_ISP_AWB_PROP);
 463        if (arg->enable_ymax_cmp)
 464                reg_val |= RKISP1_CIF_ISP_AWB_YMAX_CMP_EN;
 465        else
 466                reg_val &= ~RKISP1_CIF_ISP_AWB_YMAX_CMP_EN;
 467        rkisp1_write(params->rkisp1, reg_val, RKISP1_CIF_ISP_AWB_PROP);
 468
 469        /* window offset */
 470        rkisp1_write(params->rkisp1,
 471                     arg->awb_wnd.v_offs, RKISP1_CIF_ISP_AWB_WND_V_OFFS);
 472        rkisp1_write(params->rkisp1,
 473                     arg->awb_wnd.h_offs, RKISP1_CIF_ISP_AWB_WND_H_OFFS);
 474        /* AWB window size */
 475        rkisp1_write(params->rkisp1,
 476                     arg->awb_wnd.v_size, RKISP1_CIF_ISP_AWB_WND_V_SIZE);
 477        rkisp1_write(params->rkisp1,
 478                     arg->awb_wnd.h_size, RKISP1_CIF_ISP_AWB_WND_H_SIZE);
 479        /* Number of frames */
 480        rkisp1_write(params->rkisp1,
 481                     arg->frames, RKISP1_CIF_ISP_AWB_FRAMES);
 482}
 483
 484static void
 485rkisp1_awb_meas_enable(struct rkisp1_params *params,
 486                       const struct rkisp1_cif_isp_awb_meas_config *arg,
 487                       bool en)
 488{
 489        u32 reg_val = rkisp1_read(params->rkisp1, RKISP1_CIF_ISP_AWB_PROP);
 490
 491        /* switch off */
 492        reg_val &= RKISP1_CIF_ISP_AWB_MODE_MASK_NONE;
 493
 494        if (en) {
 495                if (arg->awb_mode == RKISP1_CIF_ISP_AWB_MODE_RGB)
 496                        reg_val |= RKISP1_CIF_ISP_AWB_MODE_RGB_EN;
 497                else
 498                        reg_val |= RKISP1_CIF_ISP_AWB_MODE_YCBCR_EN;
 499
 500                rkisp1_write(params->rkisp1, reg_val, RKISP1_CIF_ISP_AWB_PROP);
 501
 502                /* Measurements require AWB block be active. */
 503                rkisp1_param_set_bits(params, RKISP1_CIF_ISP_CTRL,
 504                                      RKISP1_CIF_ISP_CTRL_ISP_AWB_ENA);
 505        } else {
 506                rkisp1_write(params->rkisp1,
 507                             reg_val, RKISP1_CIF_ISP_AWB_PROP);
 508                rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_CTRL,
 509                                        RKISP1_CIF_ISP_CTRL_ISP_AWB_ENA);
 510        }
 511}
 512
 513static void
 514rkisp1_awb_gain_config(struct rkisp1_params *params,
 515                       const struct rkisp1_cif_isp_awb_gain_config *arg)
 516{
 517        rkisp1_write(params->rkisp1,
 518                     RKISP1_CIF_ISP_AWB_GAIN_R_SET(arg->gain_green_r) |
 519                     arg->gain_green_b, RKISP1_CIF_ISP_AWB_GAIN_G);
 520
 521        rkisp1_write(params->rkisp1,
 522                     RKISP1_CIF_ISP_AWB_GAIN_R_SET(arg->gain_red) |
 523                     arg->gain_blue, RKISP1_CIF_ISP_AWB_GAIN_RB);
 524}
 525
 526static void rkisp1_aec_config(struct rkisp1_params *params,
 527                              const struct rkisp1_cif_isp_aec_config *arg)
 528{
 529        unsigned int block_hsize, block_vsize;
 530        u32 exp_ctrl;
 531
 532        /* avoid to override the old enable value */
 533        exp_ctrl = rkisp1_read(params->rkisp1, RKISP1_CIF_ISP_EXP_CTRL);
 534        exp_ctrl &= RKISP1_CIF_ISP_EXP_ENA;
 535        if (arg->autostop)
 536                exp_ctrl |= RKISP1_CIF_ISP_EXP_CTRL_AUTOSTOP;
 537        if (arg->mode == RKISP1_CIF_ISP_EXP_MEASURING_MODE_1)
 538                exp_ctrl |= RKISP1_CIF_ISP_EXP_CTRL_MEASMODE_1;
 539        rkisp1_write(params->rkisp1, exp_ctrl, RKISP1_CIF_ISP_EXP_CTRL);
 540
 541        rkisp1_write(params->rkisp1,
 542                     arg->meas_window.h_offs, RKISP1_CIF_ISP_EXP_H_OFFSET);
 543        rkisp1_write(params->rkisp1,
 544                     arg->meas_window.v_offs, RKISP1_CIF_ISP_EXP_V_OFFSET);
 545
 546        block_hsize = arg->meas_window.h_size /
 547                      RKISP1_CIF_ISP_EXP_COLUMN_NUM - 1;
 548        block_vsize = arg->meas_window.v_size /
 549                      RKISP1_CIF_ISP_EXP_ROW_NUM - 1;
 550
 551        rkisp1_write(params->rkisp1,
 552                     RKISP1_CIF_ISP_EXP_H_SIZE_SET(block_hsize),
 553                     RKISP1_CIF_ISP_EXP_H_SIZE);
 554        rkisp1_write(params->rkisp1,
 555                     RKISP1_CIF_ISP_EXP_V_SIZE_SET(block_vsize),
 556                     RKISP1_CIF_ISP_EXP_V_SIZE);
 557}
 558
 559static void rkisp1_cproc_config(struct rkisp1_params *params,
 560                                const struct rkisp1_cif_isp_cproc_config *arg)
 561{
 562        struct rkisp1_cif_isp_isp_other_cfg *cur_other_cfg =
 563                                                &params->cur_params.others;
 564        struct rkisp1_cif_isp_ie_config *cur_ie_config =
 565                                                &cur_other_cfg->ie_config;
 566        u32 effect = cur_ie_config->effect;
 567        u32 quantization = params->quantization;
 568
 569        rkisp1_write(params->rkisp1, arg->contrast, RKISP1_CIF_C_PROC_CONTRAST);
 570        rkisp1_write(params->rkisp1, arg->hue, RKISP1_CIF_C_PROC_HUE);
 571        rkisp1_write(params->rkisp1, arg->sat, RKISP1_CIF_C_PROC_SATURATION);
 572        rkisp1_write(params->rkisp1, arg->brightness,
 573                     RKISP1_CIF_C_PROC_BRIGHTNESS);
 574
 575        if (quantization != V4L2_QUANTIZATION_FULL_RANGE ||
 576            effect != V4L2_COLORFX_NONE) {
 577                rkisp1_param_clear_bits(params, RKISP1_CIF_C_PROC_CTRL,
 578                                        RKISP1_CIF_C_PROC_YOUT_FULL |
 579                                        RKISP1_CIF_C_PROC_YIN_FULL |
 580                                        RKISP1_CIF_C_PROC_COUT_FULL);
 581        } else {
 582                rkisp1_param_set_bits(params, RKISP1_CIF_C_PROC_CTRL,
 583                                      RKISP1_CIF_C_PROC_YOUT_FULL |
 584                                      RKISP1_CIF_C_PROC_YIN_FULL |
 585                                      RKISP1_CIF_C_PROC_COUT_FULL);
 586        }
 587}
 588
 589static void rkisp1_hst_config(struct rkisp1_params *params,
 590                              const struct rkisp1_cif_isp_hst_config *arg)
 591{
 592        unsigned int block_hsize, block_vsize;
 593        static const u32 hist_weight_regs[] = {
 594                RKISP1_CIF_ISP_HIST_WEIGHT_00TO30,
 595                RKISP1_CIF_ISP_HIST_WEIGHT_40TO21,
 596                RKISP1_CIF_ISP_HIST_WEIGHT_31TO12,
 597                RKISP1_CIF_ISP_HIST_WEIGHT_22TO03,
 598                RKISP1_CIF_ISP_HIST_WEIGHT_13TO43,
 599                RKISP1_CIF_ISP_HIST_WEIGHT_04TO34,
 600                RKISP1_CIF_ISP_HIST_WEIGHT_44,
 601        };
 602        const u8 *weight;
 603        unsigned int i;
 604        u32 hist_prop;
 605
 606        /* avoid to override the old enable value */
 607        hist_prop = rkisp1_read(params->rkisp1, RKISP1_CIF_ISP_HIST_PROP);
 608        hist_prop &= RKISP1_CIF_ISP_HIST_PROP_MODE_MASK;
 609        hist_prop |= RKISP1_CIF_ISP_HIST_PREDIV_SET(arg->histogram_predivider);
 610        rkisp1_write(params->rkisp1, hist_prop, RKISP1_CIF_ISP_HIST_PROP);
 611        rkisp1_write(params->rkisp1,
 612                     arg->meas_window.h_offs,
 613                     RKISP1_CIF_ISP_HIST_H_OFFS);
 614        rkisp1_write(params->rkisp1,
 615                     arg->meas_window.v_offs,
 616                     RKISP1_CIF_ISP_HIST_V_OFFS);
 617
 618        block_hsize = arg->meas_window.h_size /
 619                      RKISP1_CIF_ISP_HIST_COLUMN_NUM - 1;
 620        block_vsize = arg->meas_window.v_size / RKISP1_CIF_ISP_HIST_ROW_NUM - 1;
 621
 622        rkisp1_write(params->rkisp1, block_hsize, RKISP1_CIF_ISP_HIST_H_SIZE);
 623        rkisp1_write(params->rkisp1, block_vsize, RKISP1_CIF_ISP_HIST_V_SIZE);
 624
 625        weight = arg->hist_weight;
 626        for (i = 0; i < ARRAY_SIZE(hist_weight_regs); ++i, weight += 4)
 627                rkisp1_write(params->rkisp1,
 628                             RKISP1_CIF_ISP_HIST_WEIGHT_SET(weight[0],
 629                                                            weight[1],
 630                                                            weight[2],
 631                                                            weight[3]),
 632                                 hist_weight_regs[i]);
 633}
 634
 635static void
 636rkisp1_hst_enable(struct rkisp1_params *params,
 637                  const struct rkisp1_cif_isp_hst_config *arg, bool en)
 638{
 639        if (en) {
 640                u32 hist_prop = rkisp1_read(params->rkisp1,
 641                                            RKISP1_CIF_ISP_HIST_PROP);
 642
 643                hist_prop &= ~RKISP1_CIF_ISP_HIST_PROP_MODE_MASK;
 644                hist_prop |= arg->mode;
 645                rkisp1_param_set_bits(params, RKISP1_CIF_ISP_HIST_PROP,
 646                                      hist_prop);
 647        } else {
 648                rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_HIST_PROP,
 649                                        RKISP1_CIF_ISP_HIST_PROP_MODE_MASK);
 650        }
 651}
 652
 653static void rkisp1_afm_config(struct rkisp1_params *params,
 654                              const struct rkisp1_cif_isp_afc_config *arg)
 655{
 656        size_t num_of_win = min_t(size_t, ARRAY_SIZE(arg->afm_win),
 657                                  arg->num_afm_win);
 658        u32 afm_ctrl = rkisp1_read(params->rkisp1, RKISP1_CIF_ISP_AFM_CTRL);
 659        unsigned int i;
 660
 661        /* Switch off to configure. */
 662        rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_AFM_CTRL,
 663                                RKISP1_CIF_ISP_AFM_ENA);
 664
 665        for (i = 0; i < num_of_win; i++) {
 666                rkisp1_write(params->rkisp1,
 667                             RKISP1_CIF_ISP_AFM_WINDOW_X(arg->afm_win[i].h_offs) |
 668                             RKISP1_CIF_ISP_AFM_WINDOW_Y(arg->afm_win[i].v_offs),
 669                             RKISP1_CIF_ISP_AFM_LT_A + i * 8);
 670                rkisp1_write(params->rkisp1,
 671                             RKISP1_CIF_ISP_AFM_WINDOW_X(arg->afm_win[i].h_size +
 672                                                         arg->afm_win[i].h_offs) |
 673                             RKISP1_CIF_ISP_AFM_WINDOW_Y(arg->afm_win[i].v_size +
 674                                                         arg->afm_win[i].v_offs),
 675                             RKISP1_CIF_ISP_AFM_RB_A + i * 8);
 676        }
 677        rkisp1_write(params->rkisp1, arg->thres, RKISP1_CIF_ISP_AFM_THRES);
 678        rkisp1_write(params->rkisp1, arg->var_shift,
 679                     RKISP1_CIF_ISP_AFM_VAR_SHIFT);
 680        /* restore afm status */
 681        rkisp1_write(params->rkisp1, afm_ctrl, RKISP1_CIF_ISP_AFM_CTRL);
 682}
 683
 684static void rkisp1_ie_config(struct rkisp1_params *params,
 685                             const struct rkisp1_cif_isp_ie_config *arg)
 686{
 687        u32 eff_ctrl;
 688
 689        eff_ctrl = rkisp1_read(params->rkisp1, RKISP1_CIF_IMG_EFF_CTRL);
 690        eff_ctrl &= ~RKISP1_CIF_IMG_EFF_CTRL_MODE_MASK;
 691
 692        if (params->quantization == V4L2_QUANTIZATION_FULL_RANGE)
 693                eff_ctrl |= RKISP1_CIF_IMG_EFF_CTRL_YCBCR_FULL;
 694
 695        switch (arg->effect) {
 696        case V4L2_COLORFX_SEPIA:
 697                eff_ctrl |= RKISP1_CIF_IMG_EFF_CTRL_MODE_SEPIA;
 698                break;
 699        case V4L2_COLORFX_SET_CBCR:
 700                rkisp1_write(params->rkisp1, arg->eff_tint,
 701                             RKISP1_CIF_IMG_EFF_TINT);
 702                eff_ctrl |= RKISP1_CIF_IMG_EFF_CTRL_MODE_SEPIA;
 703                break;
 704                /*
 705                 * Color selection is similar to water color(AQUA):
 706                 * grayscale + selected color w threshold
 707                 */
 708        case V4L2_COLORFX_AQUA:
 709                eff_ctrl |= RKISP1_CIF_IMG_EFF_CTRL_MODE_COLOR_SEL;
 710                rkisp1_write(params->rkisp1, arg->color_sel,
 711                             RKISP1_CIF_IMG_EFF_COLOR_SEL);
 712                break;
 713        case V4L2_COLORFX_EMBOSS:
 714                eff_ctrl |= RKISP1_CIF_IMG_EFF_CTRL_MODE_EMBOSS;
 715                rkisp1_write(params->rkisp1, arg->eff_mat_1,
 716                             RKISP1_CIF_IMG_EFF_MAT_1);
 717                rkisp1_write(params->rkisp1, arg->eff_mat_2,
 718                             RKISP1_CIF_IMG_EFF_MAT_2);
 719                rkisp1_write(params->rkisp1, arg->eff_mat_3,
 720                             RKISP1_CIF_IMG_EFF_MAT_3);
 721                break;
 722        case V4L2_COLORFX_SKETCH:
 723                eff_ctrl |= RKISP1_CIF_IMG_EFF_CTRL_MODE_SKETCH;
 724                rkisp1_write(params->rkisp1, arg->eff_mat_3,
 725                             RKISP1_CIF_IMG_EFF_MAT_3);
 726                rkisp1_write(params->rkisp1, arg->eff_mat_4,
 727                             RKISP1_CIF_IMG_EFF_MAT_4);
 728                rkisp1_write(params->rkisp1, arg->eff_mat_5,
 729                             RKISP1_CIF_IMG_EFF_MAT_5);
 730                break;
 731        case V4L2_COLORFX_BW:
 732                eff_ctrl |= RKISP1_CIF_IMG_EFF_CTRL_MODE_BLACKWHITE;
 733                break;
 734        case V4L2_COLORFX_NEGATIVE:
 735                eff_ctrl |= RKISP1_CIF_IMG_EFF_CTRL_MODE_NEGATIVE;
 736                break;
 737        default:
 738                break;
 739        }
 740
 741        rkisp1_write(params->rkisp1, eff_ctrl, RKISP1_CIF_IMG_EFF_CTRL);
 742}
 743
 744static void rkisp1_ie_enable(struct rkisp1_params *params, bool en)
 745{
 746        if (en) {
 747                rkisp1_param_set_bits(params, RKISP1_CIF_ICCL,
 748                                      RKISP1_CIF_ICCL_IE_CLK);
 749                rkisp1_write(params->rkisp1, RKISP1_CIF_IMG_EFF_CTRL_ENABLE,
 750                             RKISP1_CIF_IMG_EFF_CTRL);
 751                rkisp1_param_set_bits(params, RKISP1_CIF_IMG_EFF_CTRL,
 752                                      RKISP1_CIF_IMG_EFF_CTRL_CFG_UPD);
 753        } else {
 754                rkisp1_param_clear_bits(params, RKISP1_CIF_IMG_EFF_CTRL,
 755                                        RKISP1_CIF_IMG_EFF_CTRL_ENABLE);
 756                rkisp1_param_clear_bits(params, RKISP1_CIF_ICCL,
 757                                        RKISP1_CIF_ICCL_IE_CLK);
 758        }
 759}
 760
 761static void rkisp1_csm_config(struct rkisp1_params *params, bool full_range)
 762{
 763        static const u16 full_range_coeff[] = {
 764                0x0026, 0x004b, 0x000f,
 765                0x01ea, 0x01d6, 0x0040,
 766                0x0040, 0x01ca, 0x01f6
 767        };
 768        static const u16 limited_range_coeff[] = {
 769                0x0021, 0x0040, 0x000d,
 770                0x01ed, 0x01db, 0x0038,
 771                0x0038, 0x01d1, 0x01f7,
 772        };
 773        unsigned int i;
 774
 775        if (full_range) {
 776                for (i = 0; i < ARRAY_SIZE(full_range_coeff); i++)
 777                        rkisp1_write(params->rkisp1, full_range_coeff[i],
 778                                     RKISP1_CIF_ISP_CC_COEFF_0 + i * 4);
 779
 780                rkisp1_param_set_bits(params, RKISP1_CIF_ISP_CTRL,
 781                                      RKISP1_CIF_ISP_CTRL_ISP_CSM_Y_FULL_ENA |
 782                                      RKISP1_CIF_ISP_CTRL_ISP_CSM_C_FULL_ENA);
 783        } else {
 784                for (i = 0; i < ARRAY_SIZE(limited_range_coeff); i++)
 785                        rkisp1_write(params->rkisp1, limited_range_coeff[i],
 786                                     RKISP1_CIF_ISP_CC_COEFF_0 + i * 4);
 787
 788                rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_CTRL,
 789                                        RKISP1_CIF_ISP_CTRL_ISP_CSM_Y_FULL_ENA |
 790                                        RKISP1_CIF_ISP_CTRL_ISP_CSM_C_FULL_ENA);
 791        }
 792}
 793
 794/* ISP De-noise Pre-Filter(DPF) function */
 795static void rkisp1_dpf_config(struct rkisp1_params *params,
 796                              const struct rkisp1_cif_isp_dpf_config *arg)
 797{
 798        unsigned int isp_dpf_mode, spatial_coeff, i;
 799
 800        switch (arg->gain.mode) {
 801        case RKISP1_CIF_ISP_DPF_GAIN_USAGE_NF_GAINS:
 802                isp_dpf_mode = RKISP1_CIF_ISP_DPF_MODE_USE_NF_GAIN |
 803                               RKISP1_CIF_ISP_DPF_MODE_AWB_GAIN_COMP;
 804                break;
 805        case RKISP1_CIF_ISP_DPF_GAIN_USAGE_LSC_GAINS:
 806                isp_dpf_mode = RKISP1_CIF_ISP_DPF_MODE_LSC_GAIN_COMP;
 807                break;
 808        case RKISP1_CIF_ISP_DPF_GAIN_USAGE_NF_LSC_GAINS:
 809                isp_dpf_mode = RKISP1_CIF_ISP_DPF_MODE_USE_NF_GAIN |
 810                               RKISP1_CIF_ISP_DPF_MODE_AWB_GAIN_COMP |
 811                               RKISP1_CIF_ISP_DPF_MODE_LSC_GAIN_COMP;
 812                break;
 813        case RKISP1_CIF_ISP_DPF_GAIN_USAGE_AWB_GAINS:
 814                isp_dpf_mode = RKISP1_CIF_ISP_DPF_MODE_AWB_GAIN_COMP;
 815                break;
 816        case RKISP1_CIF_ISP_DPF_GAIN_USAGE_AWB_LSC_GAINS:
 817                isp_dpf_mode = RKISP1_CIF_ISP_DPF_MODE_LSC_GAIN_COMP |
 818                               RKISP1_CIF_ISP_DPF_MODE_AWB_GAIN_COMP;
 819                break;
 820        case RKISP1_CIF_ISP_DPF_GAIN_USAGE_DISABLED:
 821        default:
 822                isp_dpf_mode = 0;
 823                break;
 824        }
 825
 826        if (arg->nll.scale_mode == RKISP1_CIF_ISP_NLL_SCALE_LOGARITHMIC)
 827                isp_dpf_mode |= RKISP1_CIF_ISP_DPF_MODE_NLL_SEGMENTATION;
 828        if (arg->rb_flt.fltsize == RKISP1_CIF_ISP_DPF_RB_FILTERSIZE_9x9)
 829                isp_dpf_mode |= RKISP1_CIF_ISP_DPF_MODE_RB_FLTSIZE_9x9;
 830        if (!arg->rb_flt.r_enable)
 831                isp_dpf_mode |= RKISP1_CIF_ISP_DPF_MODE_R_FLT_DIS;
 832        if (!arg->rb_flt.b_enable)
 833                isp_dpf_mode |= RKISP1_CIF_ISP_DPF_MODE_B_FLT_DIS;
 834        if (!arg->g_flt.gb_enable)
 835                isp_dpf_mode |= RKISP1_CIF_ISP_DPF_MODE_GB_FLT_DIS;
 836        if (!arg->g_flt.gr_enable)
 837                isp_dpf_mode |= RKISP1_CIF_ISP_DPF_MODE_GR_FLT_DIS;
 838
 839        rkisp1_param_set_bits(params, RKISP1_CIF_ISP_DPF_MODE,
 840                              isp_dpf_mode);
 841        rkisp1_write(params->rkisp1, arg->gain.nf_b_gain,
 842                     RKISP1_CIF_ISP_DPF_NF_GAIN_B);
 843        rkisp1_write(params->rkisp1, arg->gain.nf_r_gain,
 844                     RKISP1_CIF_ISP_DPF_NF_GAIN_R);
 845        rkisp1_write(params->rkisp1, arg->gain.nf_gb_gain,
 846                     RKISP1_CIF_ISP_DPF_NF_GAIN_GB);
 847        rkisp1_write(params->rkisp1, arg->gain.nf_gr_gain,
 848                     RKISP1_CIF_ISP_DPF_NF_GAIN_GR);
 849
 850        for (i = 0; i < RKISP1_CIF_ISP_DPF_MAX_NLF_COEFFS; i++) {
 851                rkisp1_write(params->rkisp1, arg->nll.coeff[i],
 852                             RKISP1_CIF_ISP_DPF_NULL_COEFF_0 + i * 4);
 853        }
 854
 855        spatial_coeff = arg->g_flt.spatial_coeff[0] |
 856                        (arg->g_flt.spatial_coeff[1] << 8) |
 857                        (arg->g_flt.spatial_coeff[2] << 16) |
 858                        (arg->g_flt.spatial_coeff[3] << 24);
 859        rkisp1_write(params->rkisp1, spatial_coeff,
 860                     RKISP1_CIF_ISP_DPF_S_WEIGHT_G_1_4);
 861
 862        spatial_coeff = arg->g_flt.spatial_coeff[4] |
 863                        (arg->g_flt.spatial_coeff[5] << 8);
 864        rkisp1_write(params->rkisp1, spatial_coeff,
 865                     RKISP1_CIF_ISP_DPF_S_WEIGHT_G_5_6);
 866
 867        spatial_coeff = arg->rb_flt.spatial_coeff[0] |
 868                        (arg->rb_flt.spatial_coeff[1] << 8) |
 869                        (arg->rb_flt.spatial_coeff[2] << 16) |
 870                        (arg->rb_flt.spatial_coeff[3] << 24);
 871        rkisp1_write(params->rkisp1, spatial_coeff,
 872                     RKISP1_CIF_ISP_DPF_S_WEIGHT_RB_1_4);
 873
 874        spatial_coeff = arg->rb_flt.spatial_coeff[4] |
 875                        (arg->rb_flt.spatial_coeff[5] << 8);
 876        rkisp1_write(params->rkisp1, spatial_coeff,
 877                     RKISP1_CIF_ISP_DPF_S_WEIGHT_RB_5_6);
 878}
 879
 880static void
 881rkisp1_dpf_strength_config(struct rkisp1_params *params,
 882                           const struct rkisp1_cif_isp_dpf_strength_config *arg)
 883{
 884        rkisp1_write(params->rkisp1, arg->b, RKISP1_CIF_ISP_DPF_STRENGTH_B);
 885        rkisp1_write(params->rkisp1, arg->g, RKISP1_CIF_ISP_DPF_STRENGTH_G);
 886        rkisp1_write(params->rkisp1, arg->r, RKISP1_CIF_ISP_DPF_STRENGTH_R);
 887}
 888
 889static void
 890rkisp1_isp_isr_other_config(struct rkisp1_params *params,
 891                            const struct rkisp1_params_cfg *new_params)
 892{
 893        unsigned int module_en_update, module_cfg_update, module_ens;
 894
 895        module_en_update = new_params->module_en_update;
 896        module_cfg_update = new_params->module_cfg_update;
 897        module_ens = new_params->module_ens;
 898
 899        if ((module_en_update & RKISP1_CIF_ISP_MODULE_DPCC) ||
 900            (module_cfg_update & RKISP1_CIF_ISP_MODULE_DPCC)) {
 901                /*update dpc config */
 902                if ((module_cfg_update & RKISP1_CIF_ISP_MODULE_DPCC))
 903                        rkisp1_dpcc_config(params,
 904                                           &new_params->others.dpcc_config);
 905
 906                if (module_en_update & RKISP1_CIF_ISP_MODULE_DPCC) {
 907                        if (!!(module_ens & RKISP1_CIF_ISP_MODULE_DPCC))
 908                                rkisp1_param_set_bits(params,
 909                                                      RKISP1_CIF_ISP_DPCC_MODE,
 910                                                      RKISP1_CIF_ISP_DPCC_ENA);
 911                        else
 912                                rkisp1_param_clear_bits(params,
 913                                                RKISP1_CIF_ISP_DPCC_MODE,
 914                                                RKISP1_CIF_ISP_DPCC_ENA);
 915                }
 916        }
 917
 918        if ((module_en_update & RKISP1_CIF_ISP_MODULE_BLS) ||
 919            (module_cfg_update & RKISP1_CIF_ISP_MODULE_BLS)) {
 920                /* update bls config */
 921                if ((module_cfg_update & RKISP1_CIF_ISP_MODULE_BLS))
 922                        rkisp1_bls_config(params,
 923                                          &new_params->others.bls_config);
 924
 925                if (module_en_update & RKISP1_CIF_ISP_MODULE_BLS) {
 926                        if (!!(module_ens & RKISP1_CIF_ISP_MODULE_BLS))
 927                                rkisp1_param_set_bits(params,
 928                                                      RKISP1_CIF_ISP_BLS_CTRL,
 929                                                      RKISP1_CIF_ISP_BLS_ENA);
 930                        else
 931                                rkisp1_param_clear_bits(params,
 932                                                        RKISP1_CIF_ISP_BLS_CTRL,
 933                                                        RKISP1_CIF_ISP_BLS_ENA);
 934                }
 935        }
 936
 937        if ((module_en_update & RKISP1_CIF_ISP_MODULE_SDG) ||
 938            (module_cfg_update & RKISP1_CIF_ISP_MODULE_SDG)) {
 939                /* update sdg config */
 940                if ((module_cfg_update & RKISP1_CIF_ISP_MODULE_SDG))
 941                        rkisp1_sdg_config(params,
 942                                          &new_params->others.sdg_config);
 943
 944                if (module_en_update & RKISP1_CIF_ISP_MODULE_SDG) {
 945                        if (!!(module_ens & RKISP1_CIF_ISP_MODULE_SDG))
 946                                rkisp1_param_set_bits(params,
 947                                        RKISP1_CIF_ISP_CTRL,
 948                                        RKISP1_CIF_ISP_CTRL_ISP_GAMMA_IN_ENA);
 949                        else
 950                                rkisp1_param_clear_bits(params,
 951                                        RKISP1_CIF_ISP_CTRL,
 952                                        RKISP1_CIF_ISP_CTRL_ISP_GAMMA_IN_ENA);
 953                }
 954        }
 955
 956        if ((module_en_update & RKISP1_CIF_ISP_MODULE_LSC) ||
 957            (module_cfg_update & RKISP1_CIF_ISP_MODULE_LSC)) {
 958                /* update lsc config */
 959                if ((module_cfg_update & RKISP1_CIF_ISP_MODULE_LSC))
 960                        rkisp1_lsc_config(params,
 961                                          &new_params->others.lsc_config);
 962
 963                if (module_en_update & RKISP1_CIF_ISP_MODULE_LSC) {
 964                        if (!!(module_ens & RKISP1_CIF_ISP_MODULE_LSC))
 965                                rkisp1_param_set_bits(params,
 966                                                RKISP1_CIF_ISP_LSC_CTRL,
 967                                                RKISP1_CIF_ISP_LSC_CTRL_ENA);
 968                        else
 969                                rkisp1_param_clear_bits(params,
 970                                                RKISP1_CIF_ISP_LSC_CTRL,
 971                                                RKISP1_CIF_ISP_LSC_CTRL_ENA);
 972                }
 973        }
 974
 975        if ((module_en_update & RKISP1_CIF_ISP_MODULE_AWB_GAIN) ||
 976            (module_cfg_update & RKISP1_CIF_ISP_MODULE_AWB_GAIN)) {
 977                /* update awb gains */
 978                if ((module_cfg_update & RKISP1_CIF_ISP_MODULE_AWB_GAIN))
 979                        rkisp1_awb_gain_config(params,
 980                                        &new_params->others.awb_gain_config);
 981
 982                if (module_en_update & RKISP1_CIF_ISP_MODULE_AWB_GAIN) {
 983                        if (!!(module_ens & RKISP1_CIF_ISP_MODULE_AWB_GAIN))
 984                                rkisp1_param_set_bits(params,
 985                                        RKISP1_CIF_ISP_CTRL,
 986                                        RKISP1_CIF_ISP_CTRL_ISP_AWB_ENA);
 987                        else
 988                                rkisp1_param_clear_bits(params,
 989                                        RKISP1_CIF_ISP_CTRL,
 990                                        RKISP1_CIF_ISP_CTRL_ISP_AWB_ENA);
 991                }
 992        }
 993
 994        if ((module_en_update & RKISP1_CIF_ISP_MODULE_BDM) ||
 995            (module_cfg_update & RKISP1_CIF_ISP_MODULE_BDM)) {
 996                /* update bdm config */
 997                if ((module_cfg_update & RKISP1_CIF_ISP_MODULE_BDM))
 998                        rkisp1_bdm_config(params,
 999                                          &new_params->others.bdm_config);
1000
1001                if (module_en_update & RKISP1_CIF_ISP_MODULE_BDM) {
1002                        if (!!(module_ens & RKISP1_CIF_ISP_MODULE_BDM))
1003                                rkisp1_param_set_bits(params,
1004                                                RKISP1_CIF_ISP_DEMOSAIC,
1005                                                RKISP1_CIF_ISP_DEMOSAIC_BYPASS);
1006                        else
1007                                rkisp1_param_clear_bits(params,
1008                                                RKISP1_CIF_ISP_DEMOSAIC,
1009                                                RKISP1_CIF_ISP_DEMOSAIC_BYPASS);
1010                }
1011        }
1012
1013        if ((module_en_update & RKISP1_CIF_ISP_MODULE_FLT) ||
1014            (module_cfg_update & RKISP1_CIF_ISP_MODULE_FLT)) {
1015                /* update filter config */
1016                if ((module_cfg_update & RKISP1_CIF_ISP_MODULE_FLT))
1017                        rkisp1_flt_config(params,
1018                                          &new_params->others.flt_config);
1019
1020                if (module_en_update & RKISP1_CIF_ISP_MODULE_FLT) {
1021                        if (!!(module_ens & RKISP1_CIF_ISP_MODULE_FLT))
1022                                rkisp1_param_set_bits(params,
1023                                                      RKISP1_CIF_ISP_FILT_MODE,
1024                                                      RKISP1_CIF_ISP_FLT_ENA);
1025                        else
1026                                rkisp1_param_clear_bits(params,
1027                                                RKISP1_CIF_ISP_FILT_MODE,
1028                                                RKISP1_CIF_ISP_FLT_ENA);
1029                }
1030        }
1031
1032        if ((module_en_update & RKISP1_CIF_ISP_MODULE_CTK) ||
1033            (module_cfg_update & RKISP1_CIF_ISP_MODULE_CTK)) {
1034                /* update ctk config */
1035                if ((module_cfg_update & RKISP1_CIF_ISP_MODULE_CTK))
1036                        rkisp1_ctk_config(params,
1037                                          &new_params->others.ctk_config);
1038
1039                if (module_en_update & RKISP1_CIF_ISP_MODULE_CTK)
1040                        rkisp1_ctk_enable(params,
1041                                !!(module_ens & RKISP1_CIF_ISP_MODULE_CTK));
1042        }
1043
1044        if ((module_en_update & RKISP1_CIF_ISP_MODULE_GOC) ||
1045            (module_cfg_update & RKISP1_CIF_ISP_MODULE_GOC)) {
1046                /* update goc config */
1047                if ((module_cfg_update & RKISP1_CIF_ISP_MODULE_GOC))
1048                        rkisp1_goc_config(params,
1049                                          &new_params->others.goc_config);
1050
1051                if (module_en_update & RKISP1_CIF_ISP_MODULE_GOC) {
1052                        if (!!(module_ens & RKISP1_CIF_ISP_MODULE_GOC))
1053                                rkisp1_param_set_bits(params,
1054                                        RKISP1_CIF_ISP_CTRL,
1055                                        RKISP1_CIF_ISP_CTRL_ISP_GAMMA_OUT_ENA);
1056                        else
1057                                rkisp1_param_clear_bits(params,
1058                                        RKISP1_CIF_ISP_CTRL,
1059                                        RKISP1_CIF_ISP_CTRL_ISP_GAMMA_OUT_ENA);
1060                }
1061        }
1062
1063        if ((module_en_update & RKISP1_CIF_ISP_MODULE_CPROC) ||
1064            (module_cfg_update & RKISP1_CIF_ISP_MODULE_CPROC)) {
1065                /* update cproc config */
1066                if ((module_cfg_update & RKISP1_CIF_ISP_MODULE_CPROC)) {
1067                        rkisp1_cproc_config(params,
1068                                            &new_params->others.cproc_config);
1069                }
1070
1071                if (module_en_update & RKISP1_CIF_ISP_MODULE_CPROC) {
1072                        if (!!(module_ens & RKISP1_CIF_ISP_MODULE_CPROC))
1073                                rkisp1_param_set_bits(params,
1074                                                RKISP1_CIF_C_PROC_CTRL,
1075                                                RKISP1_CIF_C_PROC_CTR_ENABLE);
1076                        else
1077                                rkisp1_param_clear_bits(params,
1078                                                RKISP1_CIF_C_PROC_CTRL,
1079                                                RKISP1_CIF_C_PROC_CTR_ENABLE);
1080                }
1081        }
1082
1083        if ((module_en_update & RKISP1_CIF_ISP_MODULE_IE) ||
1084            (module_cfg_update & RKISP1_CIF_ISP_MODULE_IE)) {
1085                /* update ie config */
1086                if ((module_cfg_update & RKISP1_CIF_ISP_MODULE_IE))
1087                        rkisp1_ie_config(params,
1088                                         &new_params->others.ie_config);
1089
1090                if (module_en_update & RKISP1_CIF_ISP_MODULE_IE)
1091                        rkisp1_ie_enable(params,
1092                                !!(module_ens & RKISP1_CIF_ISP_MODULE_IE));
1093        }
1094
1095        if ((module_en_update & RKISP1_CIF_ISP_MODULE_DPF) ||
1096            (module_cfg_update & RKISP1_CIF_ISP_MODULE_DPF)) {
1097                /* update dpf  config */
1098                if ((module_cfg_update & RKISP1_CIF_ISP_MODULE_DPF))
1099                        rkisp1_dpf_config(params,
1100                                          &new_params->others.dpf_config);
1101
1102                if (module_en_update & RKISP1_CIF_ISP_MODULE_DPF) {
1103                        if (!!(module_ens & RKISP1_CIF_ISP_MODULE_DPF))
1104                                rkisp1_param_set_bits(params,
1105                                                   RKISP1_CIF_ISP_DPF_MODE,
1106                                                   RKISP1_CIF_ISP_DPF_MODE_EN);
1107                        else
1108                                rkisp1_param_clear_bits(params,
1109                                                RKISP1_CIF_ISP_DPF_MODE,
1110                                                RKISP1_CIF_ISP_DPF_MODE_EN);
1111                }
1112        }
1113
1114        if ((module_en_update & RKISP1_CIF_ISP_MODULE_DPF_STRENGTH) ||
1115            (module_cfg_update & RKISP1_CIF_ISP_MODULE_DPF_STRENGTH)) {
1116                /* update dpf strength config */
1117                rkisp1_dpf_strength_config(params,
1118                                &new_params->others.dpf_strength_config);
1119        }
1120}
1121
1122static void rkisp1_isp_isr_meas_config(struct rkisp1_params *params,
1123                                       struct  rkisp1_params_cfg *new_params)
1124{
1125        unsigned int module_en_update, module_cfg_update, module_ens;
1126
1127        module_en_update = new_params->module_en_update;
1128        module_cfg_update = new_params->module_cfg_update;
1129        module_ens = new_params->module_ens;
1130
1131        if ((module_en_update & RKISP1_CIF_ISP_MODULE_AWB) ||
1132            (module_cfg_update & RKISP1_CIF_ISP_MODULE_AWB)) {
1133                /* update awb config */
1134                if ((module_cfg_update & RKISP1_CIF_ISP_MODULE_AWB))
1135                        rkisp1_awb_meas_config(params,
1136                                        &new_params->meas.awb_meas_config);
1137
1138                if (module_en_update & RKISP1_CIF_ISP_MODULE_AWB)
1139                        rkisp1_awb_meas_enable(params,
1140                                &new_params->meas.awb_meas_config,
1141                                !!(module_ens & RKISP1_CIF_ISP_MODULE_AWB));
1142        }
1143
1144        if ((module_en_update & RKISP1_CIF_ISP_MODULE_AFC) ||
1145            (module_cfg_update & RKISP1_CIF_ISP_MODULE_AFC)) {
1146                /* update afc config */
1147                if ((module_cfg_update & RKISP1_CIF_ISP_MODULE_AFC))
1148                        rkisp1_afm_config(params,
1149                                          &new_params->meas.afc_config);
1150
1151                if (module_en_update & RKISP1_CIF_ISP_MODULE_AFC) {
1152                        if (!!(module_ens & RKISP1_CIF_ISP_MODULE_AFC))
1153                                rkisp1_param_set_bits(params,
1154                                                      RKISP1_CIF_ISP_AFM_CTRL,
1155                                                      RKISP1_CIF_ISP_AFM_ENA);
1156                        else
1157                                rkisp1_param_clear_bits(params,
1158                                                        RKISP1_CIF_ISP_AFM_CTRL,
1159                                                        RKISP1_CIF_ISP_AFM_ENA);
1160                }
1161        }
1162
1163        if ((module_en_update & RKISP1_CIF_ISP_MODULE_HST) ||
1164            (module_cfg_update & RKISP1_CIF_ISP_MODULE_HST)) {
1165                /* update hst config */
1166                if ((module_cfg_update & RKISP1_CIF_ISP_MODULE_HST))
1167                        rkisp1_hst_config(params,
1168                                          &new_params->meas.hst_config);
1169
1170                if (module_en_update & RKISP1_CIF_ISP_MODULE_HST)
1171                        rkisp1_hst_enable(params,
1172                                &new_params->meas.hst_config,
1173                                !!(module_ens & RKISP1_CIF_ISP_MODULE_HST));
1174        }
1175
1176        if ((module_en_update & RKISP1_CIF_ISP_MODULE_AEC) ||
1177            (module_cfg_update & RKISP1_CIF_ISP_MODULE_AEC)) {
1178                /* update aec config */
1179                if ((module_cfg_update & RKISP1_CIF_ISP_MODULE_AEC))
1180                        rkisp1_aec_config(params,
1181                                          &new_params->meas.aec_config);
1182
1183                if (module_en_update & RKISP1_CIF_ISP_MODULE_AEC) {
1184                        if (!!(module_ens & RKISP1_CIF_ISP_MODULE_AEC))
1185                                rkisp1_param_set_bits(params,
1186                                                      RKISP1_CIF_ISP_EXP_CTRL,
1187                                                      RKISP1_CIF_ISP_EXP_ENA);
1188                        else
1189                                rkisp1_param_clear_bits(params,
1190                                                        RKISP1_CIF_ISP_EXP_CTRL,
1191                                                        RKISP1_CIF_ISP_EXP_ENA);
1192                }
1193        }
1194}
1195
1196void rkisp1_params_isr(struct rkisp1_device *rkisp1, u32 isp_mis)
1197{
1198        unsigned int frame_sequence = atomic_read(&rkisp1->isp.frame_sequence);
1199        struct rkisp1_params *params = &rkisp1->params;
1200        struct rkisp1_params_cfg *new_params;
1201        struct rkisp1_buffer *cur_buf = NULL;
1202
1203        spin_lock(&params->config_lock);
1204        if (!params->is_streaming) {
1205                spin_unlock(&params->config_lock);
1206                return;
1207        }
1208
1209        /* get one empty buffer */
1210        if (!list_empty(&params->params))
1211                cur_buf = list_first_entry(&params->params,
1212                                           struct rkisp1_buffer, queue);
1213        spin_unlock(&params->config_lock);
1214
1215        if (!cur_buf)
1216                return;
1217
1218        new_params = (struct rkisp1_params_cfg *)(cur_buf->vaddr[0]);
1219
1220        if (isp_mis & RKISP1_CIF_ISP_FRAME) {
1221                u32 isp_ctrl;
1222
1223                rkisp1_isp_isr_other_config(params, new_params);
1224                rkisp1_isp_isr_meas_config(params, new_params);
1225
1226                /* update shadow register immediately */
1227                isp_ctrl = rkisp1_read(params->rkisp1, RKISP1_CIF_ISP_CTRL);
1228                isp_ctrl |= RKISP1_CIF_ISP_CTRL_ISP_CFG_UPD;
1229                rkisp1_write(params->rkisp1, isp_ctrl, RKISP1_CIF_ISP_CTRL);
1230
1231                spin_lock(&params->config_lock);
1232                list_del(&cur_buf->queue);
1233                spin_unlock(&params->config_lock);
1234
1235                cur_buf->vb.sequence = frame_sequence;
1236                vb2_buffer_done(&cur_buf->vb.vb2_buf, VB2_BUF_STATE_DONE);
1237        }
1238}
1239
1240static const struct rkisp1_cif_isp_awb_meas_config rkisp1_awb_params_default_config = {
1241        {
1242                0, 0, RKISP1_DEFAULT_WIDTH, RKISP1_DEFAULT_HEIGHT
1243        },
1244        RKISP1_CIF_ISP_AWB_MODE_YCBCR, 200, 30, 20, 20, 0, 128, 128
1245};
1246
1247static const struct rkisp1_cif_isp_aec_config rkisp1_aec_params_default_config = {
1248        RKISP1_CIF_ISP_EXP_MEASURING_MODE_0,
1249        RKISP1_CIF_ISP_EXP_CTRL_AUTOSTOP_0,
1250        {
1251                RKISP1_DEFAULT_WIDTH >> 2, RKISP1_DEFAULT_HEIGHT >> 2,
1252                RKISP1_DEFAULT_WIDTH >> 1, RKISP1_DEFAULT_HEIGHT >> 1
1253        }
1254};
1255
1256static const struct rkisp1_cif_isp_hst_config rkisp1_hst_params_default_config = {
1257        RKISP1_CIF_ISP_HISTOGRAM_MODE_RGB_COMBINED,
1258        3,
1259        {
1260                RKISP1_DEFAULT_WIDTH >> 2, RKISP1_DEFAULT_HEIGHT >> 2,
1261                RKISP1_DEFAULT_WIDTH >> 1, RKISP1_DEFAULT_HEIGHT >> 1
1262        },
1263        {
1264                0, /* To be filled in with 0x01 at runtime. */
1265        }
1266};
1267
1268static const struct rkisp1_cif_isp_afc_config rkisp1_afc_params_default_config = {
1269        1,
1270        {
1271                {
1272                        300, 225, 200, 150
1273                }
1274        },
1275        4,
1276        14
1277};
1278
1279static void rkisp1_params_config_parameter(struct rkisp1_params *params)
1280{
1281        struct rkisp1_cif_isp_hst_config hst = rkisp1_hst_params_default_config;
1282
1283        spin_lock(&params->config_lock);
1284
1285        rkisp1_awb_meas_config(params, &rkisp1_awb_params_default_config);
1286        rkisp1_awb_meas_enable(params, &rkisp1_awb_params_default_config,
1287                               true);
1288
1289        rkisp1_aec_config(params, &rkisp1_aec_params_default_config);
1290        rkisp1_param_set_bits(params, RKISP1_CIF_ISP_EXP_CTRL,
1291                              RKISP1_CIF_ISP_EXP_ENA);
1292
1293        rkisp1_afm_config(params, &rkisp1_afc_params_default_config);
1294        rkisp1_param_set_bits(params, RKISP1_CIF_ISP_AFM_CTRL,
1295                              RKISP1_CIF_ISP_AFM_ENA);
1296
1297        memset(hst.hist_weight, 0x01, sizeof(hst.hist_weight));
1298        rkisp1_hst_config(params, &hst);
1299        rkisp1_param_set_bits(params, RKISP1_CIF_ISP_HIST_PROP,
1300                              ~RKISP1_CIF_ISP_HIST_PROP_MODE_MASK |
1301                              rkisp1_hst_params_default_config.mode);
1302
1303        /* set the  range */
1304        if (params->quantization == V4L2_QUANTIZATION_FULL_RANGE)
1305                rkisp1_csm_config(params, true);
1306        else
1307                rkisp1_csm_config(params, false);
1308
1309        /* override the default things */
1310        rkisp1_isp_isr_other_config(params, &params->cur_params);
1311        rkisp1_isp_isr_meas_config(params, &params->cur_params);
1312
1313        spin_unlock(&params->config_lock);
1314}
1315
1316/* Not called when the camera active, thus not isr protection. */
1317void rkisp1_params_configure(struct rkisp1_params *params,
1318                             enum rkisp1_fmt_raw_pat_type bayer_pat,
1319                             enum v4l2_quantization quantization)
1320{
1321        params->quantization = quantization;
1322        params->raw_type = bayer_pat;
1323        rkisp1_params_config_parameter(params);
1324}
1325
1326/* Not called when the camera active, thus not isr protection. */
1327void rkisp1_params_disable(struct rkisp1_params *params)
1328{
1329        rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_DPCC_MODE,
1330                                RKISP1_CIF_ISP_DPCC_ENA);
1331        rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_LSC_CTRL,
1332                                RKISP1_CIF_ISP_LSC_CTRL_ENA);
1333        rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_BLS_CTRL,
1334                                RKISP1_CIF_ISP_BLS_ENA);
1335        rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_CTRL,
1336                                RKISP1_CIF_ISP_CTRL_ISP_GAMMA_IN_ENA);
1337        rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_CTRL,
1338                                RKISP1_CIF_ISP_CTRL_ISP_GAMMA_OUT_ENA);
1339        rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_DEMOSAIC,
1340                                RKISP1_CIF_ISP_DEMOSAIC_BYPASS);
1341        rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_FILT_MODE,
1342                                RKISP1_CIF_ISP_FLT_ENA);
1343        rkisp1_awb_meas_enable(params, NULL, false);
1344        rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_CTRL,
1345                                RKISP1_CIF_ISP_CTRL_ISP_AWB_ENA);
1346        rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_EXP_CTRL,
1347                                RKISP1_CIF_ISP_EXP_ENA);
1348        rkisp1_ctk_enable(params, false);
1349        rkisp1_param_clear_bits(params, RKISP1_CIF_C_PROC_CTRL,
1350                                RKISP1_CIF_C_PROC_CTR_ENABLE);
1351        rkisp1_hst_enable(params, NULL, false);
1352        rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_AFM_CTRL,
1353                                RKISP1_CIF_ISP_AFM_ENA);
1354        rkisp1_ie_enable(params, false);
1355        rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_DPF_MODE,
1356                                RKISP1_CIF_ISP_DPF_MODE_EN);
1357}
1358
1359static int rkisp1_params_enum_fmt_meta_out(struct file *file, void *priv,
1360                                           struct v4l2_fmtdesc *f)
1361{
1362        struct video_device *video = video_devdata(file);
1363        struct rkisp1_params *params = video_get_drvdata(video);
1364
1365        if (f->index > 0 || f->type != video->queue->type)
1366                return -EINVAL;
1367
1368        f->pixelformat = params->vdev_fmt.fmt.meta.dataformat;
1369
1370        return 0;
1371}
1372
1373static int rkisp1_params_g_fmt_meta_out(struct file *file, void *fh,
1374                                        struct v4l2_format *f)
1375{
1376        struct video_device *video = video_devdata(file);
1377        struct rkisp1_params *params = video_get_drvdata(video);
1378        struct v4l2_meta_format *meta = &f->fmt.meta;
1379
1380        if (f->type != video->queue->type)
1381                return -EINVAL;
1382
1383        memset(meta, 0, sizeof(*meta));
1384        meta->dataformat = params->vdev_fmt.fmt.meta.dataformat;
1385        meta->buffersize = params->vdev_fmt.fmt.meta.buffersize;
1386
1387        return 0;
1388}
1389
1390static int rkisp1_params_querycap(struct file *file,
1391                                  void *priv, struct v4l2_capability *cap)
1392{
1393        struct video_device *vdev = video_devdata(file);
1394
1395        strscpy(cap->driver, RKISP1_DRIVER_NAME, sizeof(cap->driver));
1396        strscpy(cap->card, vdev->name, sizeof(cap->card));
1397        strscpy(cap->bus_info, RKISP1_BUS_INFO, sizeof(cap->bus_info));
1398
1399        return 0;
1400}
1401
1402/* ISP params video device IOCTLs */
1403static const struct v4l2_ioctl_ops rkisp1_params_ioctl = {
1404        .vidioc_reqbufs = vb2_ioctl_reqbufs,
1405        .vidioc_querybuf = vb2_ioctl_querybuf,
1406        .vidioc_create_bufs = vb2_ioctl_create_bufs,
1407        .vidioc_qbuf = vb2_ioctl_qbuf,
1408        .vidioc_dqbuf = vb2_ioctl_dqbuf,
1409        .vidioc_prepare_buf = vb2_ioctl_prepare_buf,
1410        .vidioc_expbuf = vb2_ioctl_expbuf,
1411        .vidioc_streamon = vb2_ioctl_streamon,
1412        .vidioc_streamoff = vb2_ioctl_streamoff,
1413        .vidioc_enum_fmt_meta_out = rkisp1_params_enum_fmt_meta_out,
1414        .vidioc_g_fmt_meta_out = rkisp1_params_g_fmt_meta_out,
1415        .vidioc_s_fmt_meta_out = rkisp1_params_g_fmt_meta_out,
1416        .vidioc_try_fmt_meta_out = rkisp1_params_g_fmt_meta_out,
1417        .vidioc_querycap = rkisp1_params_querycap,
1418        .vidioc_subscribe_event = v4l2_ctrl_subscribe_event,
1419        .vidioc_unsubscribe_event = v4l2_event_unsubscribe,
1420};
1421
1422static int rkisp1_params_vb2_queue_setup(struct vb2_queue *vq,
1423                                         unsigned int *num_buffers,
1424                                         unsigned int *num_planes,
1425                                         unsigned int sizes[],
1426                                         struct device *alloc_devs[])
1427{
1428        struct rkisp1_params *params = vq->drv_priv;
1429
1430        *num_buffers = clamp_t(u32, *num_buffers,
1431                               RKISP1_ISP_PARAMS_REQ_BUFS_MIN,
1432                               RKISP1_ISP_PARAMS_REQ_BUFS_MAX);
1433
1434        *num_planes = 1;
1435
1436        sizes[0] = sizeof(struct rkisp1_params_cfg);
1437
1438        INIT_LIST_HEAD(&params->params);
1439        params->is_first_params = true;
1440
1441        return 0;
1442}
1443
1444static void rkisp1_params_vb2_buf_queue(struct vb2_buffer *vb)
1445{
1446        struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
1447        struct rkisp1_buffer *params_buf =
1448                container_of(vbuf, struct rkisp1_buffer, vb);
1449        struct vb2_queue *vq = vb->vb2_queue;
1450        struct rkisp1_params *params = vq->drv_priv;
1451        struct rkisp1_params_cfg *new_params;
1452        unsigned long flags;
1453        unsigned int frame_sequence =
1454                atomic_read(&params->rkisp1->isp.frame_sequence);
1455
1456        if (params->is_first_params) {
1457                new_params = (struct rkisp1_params_cfg *)
1458                        (vb2_plane_vaddr(vb, 0));
1459                vbuf->sequence = frame_sequence;
1460                vb2_buffer_done(&params_buf->vb.vb2_buf, VB2_BUF_STATE_DONE);
1461                params->is_first_params = false;
1462                params->cur_params = *new_params;
1463                return;
1464        }
1465
1466        params_buf->vaddr[0] = vb2_plane_vaddr(vb, 0);
1467        spin_lock_irqsave(&params->config_lock, flags);
1468        list_add_tail(&params_buf->queue, &params->params);
1469        spin_unlock_irqrestore(&params->config_lock, flags);
1470}
1471
1472static int rkisp1_params_vb2_buf_prepare(struct vb2_buffer *vb)
1473{
1474        if (vb2_plane_size(vb, 0) < sizeof(struct rkisp1_params_cfg))
1475                return -EINVAL;
1476
1477        vb2_set_plane_payload(vb, 0, sizeof(struct rkisp1_params_cfg));
1478
1479        return 0;
1480}
1481
1482static void rkisp1_params_vb2_stop_streaming(struct vb2_queue *vq)
1483{
1484        struct rkisp1_params *params = vq->drv_priv;
1485        struct rkisp1_buffer *buf;
1486        unsigned long flags;
1487        unsigned int i;
1488
1489        /* stop params input firstly */
1490        spin_lock_irqsave(&params->config_lock, flags);
1491        params->is_streaming = false;
1492        spin_unlock_irqrestore(&params->config_lock, flags);
1493
1494        for (i = 0; i < RKISP1_ISP_PARAMS_REQ_BUFS_MAX; i++) {
1495                spin_lock_irqsave(&params->config_lock, flags);
1496                if (!list_empty(&params->params)) {
1497                        buf = list_first_entry(&params->params,
1498                                               struct rkisp1_buffer, queue);
1499                        list_del(&buf->queue);
1500                        spin_unlock_irqrestore(&params->config_lock,
1501                                               flags);
1502                } else {
1503                        spin_unlock_irqrestore(&params->config_lock,
1504                                               flags);
1505                        break;
1506                }
1507
1508                if (buf)
1509                        vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
1510                buf = NULL;
1511        }
1512}
1513
1514static int
1515rkisp1_params_vb2_start_streaming(struct vb2_queue *queue, unsigned int count)
1516{
1517        struct rkisp1_params *params = queue->drv_priv;
1518        unsigned long flags;
1519
1520        spin_lock_irqsave(&params->config_lock, flags);
1521        params->is_streaming = true;
1522        spin_unlock_irqrestore(&params->config_lock, flags);
1523
1524        return 0;
1525}
1526
1527static struct vb2_ops rkisp1_params_vb2_ops = {
1528        .queue_setup = rkisp1_params_vb2_queue_setup,
1529        .wait_prepare = vb2_ops_wait_prepare,
1530        .wait_finish = vb2_ops_wait_finish,
1531        .buf_queue = rkisp1_params_vb2_buf_queue,
1532        .buf_prepare = rkisp1_params_vb2_buf_prepare,
1533        .start_streaming = rkisp1_params_vb2_start_streaming,
1534        .stop_streaming = rkisp1_params_vb2_stop_streaming,
1535
1536};
1537
1538static struct v4l2_file_operations rkisp1_params_fops = {
1539        .mmap = vb2_fop_mmap,
1540        .unlocked_ioctl = video_ioctl2,
1541        .poll = vb2_fop_poll,
1542        .open = v4l2_fh_open,
1543        .release = vb2_fop_release
1544};
1545
1546static int rkisp1_params_init_vb2_queue(struct vb2_queue *q,
1547                                        struct rkisp1_params *params)
1548{
1549        struct rkisp1_vdev_node *node;
1550
1551        node = container_of(q, struct rkisp1_vdev_node, buf_queue);
1552
1553        q->type = V4L2_BUF_TYPE_META_OUTPUT;
1554        q->io_modes = VB2_MMAP | VB2_USERPTR | VB2_DMABUF;
1555        q->drv_priv = params;
1556        q->ops = &rkisp1_params_vb2_ops;
1557        q->mem_ops = &vb2_vmalloc_memops;
1558        q->buf_struct_size = sizeof(struct rkisp1_buffer);
1559        q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
1560        q->lock = &node->vlock;
1561
1562        return vb2_queue_init(q);
1563}
1564
1565static void rkisp1_init_params(struct rkisp1_params *params)
1566{
1567        params->vdev_fmt.fmt.meta.dataformat =
1568                V4L2_META_FMT_RK_ISP1_PARAMS;
1569        params->vdev_fmt.fmt.meta.buffersize =
1570                sizeof(struct rkisp1_params_cfg);
1571}
1572
1573int rkisp1_params_register(struct rkisp1_params *params,
1574                           struct v4l2_device *v4l2_dev,
1575                           struct rkisp1_device *rkisp1)
1576{
1577        struct rkisp1_vdev_node *node = &params->vnode;
1578        struct video_device *vdev = &node->vdev;
1579        int ret;
1580
1581        params->rkisp1 = rkisp1;
1582        mutex_init(&node->vlock);
1583        spin_lock_init(&params->config_lock);
1584
1585        strscpy(vdev->name, RKISP1_PARAMS_DEV_NAME, sizeof(vdev->name));
1586
1587        video_set_drvdata(vdev, params);
1588        vdev->ioctl_ops = &rkisp1_params_ioctl;
1589        vdev->fops = &rkisp1_params_fops;
1590        vdev->release = video_device_release_empty;
1591        /*
1592         * Provide a mutex to v4l2 core. It will be used
1593         * to protect all fops and v4l2 ioctls.
1594         */
1595        vdev->lock = &node->vlock;
1596        vdev->v4l2_dev = v4l2_dev;
1597        vdev->queue = &node->buf_queue;
1598        vdev->device_caps = V4L2_CAP_STREAMING | V4L2_CAP_META_OUTPUT;
1599        vdev->vfl_dir = VFL_DIR_TX;
1600        rkisp1_params_init_vb2_queue(vdev->queue, params);
1601        rkisp1_init_params(params);
1602        video_set_drvdata(vdev, params);
1603
1604        node->pad.flags = MEDIA_PAD_FL_SOURCE;
1605        ret = media_entity_pads_init(&vdev->entity, 1, &node->pad);
1606        if (ret)
1607                goto err_release_queue;
1608        ret = video_register_device(vdev, VFL_TYPE_VIDEO, -1);
1609        if (ret) {
1610                dev_err(rkisp1->dev,
1611                        "failed to register %s, ret=%d\n", vdev->name, ret);
1612                goto err_cleanup_media_entity;
1613        }
1614        return 0;
1615err_cleanup_media_entity:
1616        media_entity_cleanup(&vdev->entity);
1617err_release_queue:
1618        vb2_queue_release(vdev->queue);
1619        return ret;
1620}
1621
1622void rkisp1_params_unregister(struct rkisp1_params *params)
1623{
1624        struct rkisp1_vdev_node *node = &params->vnode;
1625        struct video_device *vdev = &node->vdev;
1626
1627        video_unregister_device(vdev);
1628        media_entity_cleanup(&vdev->entity);
1629        vb2_queue_release(vdev->queue);
1630}
1631