root/drivers/staging/media/starfive/camss/stf-isp.h
/* SPDX-License-Identifier: GPL-2.0 */
/*
 * stf_isp.h
 *
 * StarFive Camera Subsystem - ISP Module
 *
 * Copyright (C) 2021-2023 StarFive Technology Co., Ltd.
 */

#ifndef STF_ISP_H
#define STF_ISP_H

#include <media/v4l2-subdev.h>

#include "stf-video.h"

#define ISP_RAW_DATA_BITS                       12
#define SCALER_RATIO_MAX                        1
#define STF_ISP_REG_OFFSET_MAX                  0x0fff
#define STF_ISP_REG_DELAY_MAX                   100

/* isp registers */
#define ISP_REG_CSI_INPUT_EN_AND_STATUS         0x000
#define CSI_SCD_ERR                             BIT(6)
#define CSI_ITU656_ERR                          BIT(4)
#define CSI_ITU656_F                            BIT(3)
#define CSI_SCD_DONE                            BIT(2)
#define CSI_BUSY_S                              BIT(1)
#define CSI_EN_S                                BIT(0)

#define ISP_REG_CSIINTS                         0x008
#define CSI_INTS(n)                             ((n) << 16)
#define CSI_SHA_M(n)                            ((n) << 0)
#define CSI_INTS_MASK                           GENMASK(17, 16)

#define ISP_REG_CSI_MODULE_CFG                  0x010
#define CSI_DUMP_EN                             BIT(19)
#define CSI_VS_EN                               BIT(18)
#define CSI_SC_EN                               BIT(17)
#define CSI_OBA_EN                              BIT(16)
#define CSI_AWB_EN                              BIT(7)
#define CSI_LCCF_EN                             BIT(6)
#define CSI_OECFHM_EN                           BIT(5)
#define CSI_OECF_EN                             BIT(4)
#define CSI_LCBQ_EN                             BIT(3)
#define CSI_OBC_EN                              BIT(2)
#define CSI_DEC_EN                              BIT(1)
#define CSI_DC_EN                               BIT(0)

#define ISP_REG_SENSOR                          0x014
#define DVP_SYNC_POL(n)                         ((n) << 2)
#define ITU656_EN(n)                            ((n) << 1)
#define IMAGER_SEL(n)                           ((n) << 0)

#define ISP_REG_RAW_FORMAT_CFG                  0x018
#define SMY13(n)                                ((n) << 14)
#define SMY12(n)                                ((n) << 12)
#define SMY11(n)                                ((n) << 10)
#define SMY10(n)                                ((n) << 8)
#define SMY3(n)                                 ((n) << 6)
#define SMY2(n)                                 ((n) << 4)
#define SMY1(n)                                 ((n) << 2)
#define SMY0(n)                                 ((n) << 0)

#define ISP_REG_PIC_CAPTURE_START_CFG           0x01c
#define VSTART_CAP(n)                           ((n) << 16)
#define HSTART_CAP(n)                           ((n) << 0)

#define ISP_REG_PIC_CAPTURE_END_CFG             0x020
#define VEND_CAP(n)                             ((n) << 16)
#define HEND_CAP(n)                             ((n) << 0)

#define ISP_REG_DUMP_CFG_0                      0x024
#define ISP_REG_DUMP_CFG_1                      0x028
#define DUMP_ID(n)                              ((n) << 24)
#define DUMP_SHT(n)                             ((n) << 20)
#define DUMP_BURST_LEN(n)                       ((n) << 16)
#define DUMP_SD(n)                              ((n) << 0)
#define DUMP_BURST_LEN_MASK                     GENMASK(17, 16)
#define DUMP_SD_MASK                            GENMASK(15, 0)

#define ISP_REG_DEC_CFG                         0x030
#define DEC_V_KEEP(n)                           ((n) << 24)
#define DEC_V_PERIOD(n)                         ((n) << 16)
#define DEC_H_KEEP(n)                           ((n) << 8)
#define DEC_H_PERIOD(n)                         ((n) << 0)

#define ISP_REG_OBC_CFG                         0x034
#define OBC_W_H(y)                              ((y) << 4)
#define OBC_W_W(x)                              ((x) << 0)

#define ISP_REG_DC_CFG_1                        0x044
#define DC_AXI_ID(n)                            ((n) << 0)

#define ISP_REG_LCCF_CFG_0                      0x050
#define Y_DISTANCE(y)                           ((y) << 16)
#define X_DISTANCE(x)                           ((x) << 0)

#define ISP_REG_LCCF_CFG_1                      0x058
#define LCCF_MAX_DIS(n)                         ((n) << 0)

#define ISP_REG_LCBQ_CFG_0                      0x074
#define H_LCBQ(y)                               ((y) << 12)
#define W_LCBQ(x)                               ((x) << 8)

#define ISP_REG_LCBQ_CFG_1                      0x07c
#define Y_COOR(y)                               ((y) << 16)
#define X_COOR(x)                               ((x) << 0)

#define ISP_REG_LCCF_CFG_2                      0x0e0
#define ISP_REG_LCCF_CFG_3                      0x0e4
#define ISP_REG_LCCF_CFG_4                      0x0e8
#define ISP_REG_LCCF_CFG_5                      0x0ec
#define LCCF_F2_PAR(n)                          ((n) << 16)
#define LCCF_F1_PAR(n)                          ((n) << 0)

#define ISP_REG_OECF_X0_CFG0                    0x100
#define ISP_REG_OECF_X0_CFG1                    0x104
#define ISP_REG_OECF_X0_CFG2                    0x108
#define ISP_REG_OECF_X0_CFG3                    0x10c
#define ISP_REG_OECF_X0_CFG4                    0x110
#define ISP_REG_OECF_X0_CFG5                    0x114
#define ISP_REG_OECF_X0_CFG6                    0x118
#define ISP_REG_OECF_X0_CFG7                    0x11c

#define ISP_REG_OECF_Y3_CFG0                    0x1e0
#define ISP_REG_OECF_Y3_CFG1                    0x1e4
#define ISP_REG_OECF_Y3_CFG2                    0x1e8
#define ISP_REG_OECF_Y3_CFG3                    0x1ec
#define ISP_REG_OECF_Y3_CFG4                    0x1f0
#define ISP_REG_OECF_Y3_CFG5                    0x1f4
#define ISP_REG_OECF_Y3_CFG6                    0x1f8
#define ISP_REG_OECF_Y3_CFG7                    0x1fc

#define ISP_REG_OECF_S0_CFG0                    0x200
#define ISP_REG_OECF_S3_CFG7                    0x27c
#define OCEF_PAR_H(n)                           ((n) << 16)
#define OCEF_PAR_L(n)                           ((n) << 0)

#define ISP_REG_AWB_X0_CFG_0                    0x280
#define ISP_REG_AWB_X0_CFG_1                    0x284
#define ISP_REG_AWB_X1_CFG_0                    0x288
#define ISP_REG_AWB_X1_CFG_1                    0x28c
#define ISP_REG_AWB_X2_CFG_0                    0x290
#define ISP_REG_AWB_X2_CFG_1                    0x294
#define ISP_REG_AWB_X3_CFG_0                    0x298
#define ISP_REG_AWB_X3_CFG_1                    0x29c
#define AWB_X_SYMBOL_H(n)                       ((n) << 16)
#define AWB_X_SYMBOL_L(n)                       ((n) << 0)

#define ISP_REG_AWB_Y0_CFG_0                    0x2a0
#define ISP_REG_AWB_Y0_CFG_1                    0x2a4
#define ISP_REG_AWB_Y1_CFG_0                    0x2a8
#define ISP_REG_AWB_Y1_CFG_1                    0x2ac
#define ISP_REG_AWB_Y2_CFG_0                    0x2b0
#define ISP_REG_AWB_Y2_CFG_1                    0x2b4
#define ISP_REG_AWB_Y3_CFG_0                    0x2b8
#define ISP_REG_AWB_Y3_CFG_1                    0x2bc
#define AWB_Y_SYMBOL_H(n)                       ((n) << 16)
#define AWB_Y_SYMBOL_L(n)                       ((n) << 0)

#define ISP_REG_AWB_S0_CFG_0                    0x2c0
#define ISP_REG_AWB_S0_CFG_1                    0x2c4
#define ISP_REG_AWB_S1_CFG_0                    0x2c8
#define ISP_REG_AWB_S1_CFG_1                    0x2cc
#define ISP_REG_AWB_S2_CFG_0                    0x2d0
#define ISP_REG_AWB_S2_CFG_1                    0x2d4
#define ISP_REG_AWB_S3_CFG_0                    0x2d8
#define ISP_REG_AWB_S3_CFG_1                    0x2dc
#define AWB_S_SYMBOL_H(n)                       ((n) << 16)
#define AWB_S_SYMBOL_L(n)                       ((n) << 0)

#define ISP_REG_OBCG_CFG_0                      0x2e0
#define ISP_REG_OBCG_CFG_1                      0x2e4
#define ISP_REG_OBCG_CFG_2                      0x2e8
#define ISP_REG_OBCG_CFG_3                      0x2ec
#define ISP_REG_OBCO_CFG_0                      0x2f0
#define ISP_REG_OBCO_CFG_1                      0x2f4
#define ISP_REG_OBCO_CFG_2                      0x2f8
#define ISP_REG_OBCO_CFG_3                      0x2fc
#define GAIN_D_POINT(x)                         ((x) << 24)
#define GAIN_C_POINT(x)                         ((x) << 16)
#define GAIN_B_POINT(x)                         ((x) << 8)
#define GAIN_A_POINT(x)                         ((x) << 0)
#define OFFSET_D_POINT(x)                       ((x) << 24)
#define OFFSET_C_POINT(x)                       ((x) << 16)
#define OFFSET_B_POINT(x)                       ((x) << 8)
#define OFFSET_A_POINT(x)                       ((x) << 0)

#define ISP_REG_ISP_CTRL_0                      0xa00
#define ISPC_LINE                               BIT(27)
#define ISPC_SC                                 BIT(26)
#define ISPC_CSI                                BIT(25)
#define ISPC_ISP                                BIT(24)
#define ISPC_ENUO                               BIT(20)
#define ISPC_ENLS                               BIT(17)
#define ISPC_ENSS1                              BIT(12)
#define ISPC_ENSS0                              BIT(11)
#define ISPC_RST                                BIT(1)
#define ISPC_EN                                 BIT(0)
#define ISPC_RST_MASK                           BIT(1)
#define ISPC_INT_ALL_MASK                       GENMASK(27, 24)

#define ISP_REG_ISP_CTRL_1                      0xa08
#define CTRL_SAT(n)                             ((n) << 28)
#define CTRL_DBC                                BIT(22)
#define CTRL_CTC                                BIT(21)
#define CTRL_YHIST                              BIT(20)
#define CTRL_YCURVE                             BIT(19)
#define CTRL_CTM                                BIT(18)
#define CTRL_BIYUV                              BIT(17)
#define CTRL_SCE                                BIT(8)
#define CTRL_EE                                 BIT(7)
#define CTRL_CCE                                BIT(5)
#define CTRL_RGE                                BIT(4)
#define CTRL_CME                                BIT(3)
#define CTRL_AE                                 BIT(2)
#define CTRL_CE                                 BIT(1)
#define CTRL_SAT_MASK                           GENMASK(31, 28)

#define ISP_REG_PIPELINE_XY_SIZE                0xa0c
#define H_ACT_CAP(n)                            ((n) << 16)
#define W_ACT_CAP(n)                            ((n) << 0)

#define ISP_REG_ICTC                            0xa10
#define GF_MODE(n)                              ((n) << 30)
#define MAXGT(n)                                ((n) << 16)
#define MINGT(n)                                ((n) << 0)

#define ISP_REG_IDBC                            0xa14
#define BADGT(n)                                ((n) << 16)
#define BADXT(n)                                ((n) << 0)

#define ISP_REG_ICFAM                           0xa1c
#define CROSS_COV(n)                            ((n) << 4)
#define HV_W(n)                                 ((n) << 0)

#define ISP_REG_CS_GAIN                         0xa30
#define CMAD(n)                                 ((n) << 16)
#define CMAB(n)                                 ((n) << 0)

#define ISP_REG_CS_THRESHOLD                    0xa34
#define CMD(n)                                  ((n) << 16)
#define CMB(n)                                  ((n) << 0)

#define ISP_REG_CS_OFFSET                       0xa38
#define VOFF(n)                                 ((n) << 16)
#define UOFF(n)                                 ((n) << 0)

#define ISP_REG_CS_HUE_F                        0xa3c
#define SIN(n)                                  ((n) << 16)
#define COS(n)                                  ((n) << 0)

#define ISP_REG_CS_SCALE                        0xa40

#define ISP_REG_IESHD                           0xa50
#define SHAD_UP_M                               BIT(1)
#define SHAD_UP_EN                              BIT(0)

#define ISP_REG_YADJ0                           0xa54
#define YOIR(n)                                 ((n) << 16)
#define YIMIN(n)                                ((n) << 0)

#define ISP_REG_YADJ1                           0xa58
#define YOMAX(n)                                ((n) << 16)
#define YOMIN(n)                                ((n) << 0)

#define ISP_REG_Y_PLANE_START_ADDR              0xa80
#define ISP_REG_UV_PLANE_START_ADDR             0xa84
#define ISP_REG_STRIDE                          0xa88

#define ISP_REG_ITIIWSR                         0xb20
#define ITI_HSIZE(n)                            ((n) << 16)
#define ITI_WSIZE(n)                            ((n) << 0)

#define ISP_REG_ITIDWLSR                        0xb24
#define ISP_REG_ITIPDFR                         0xb38
#define ISP_REG_ITIDRLSR                        0xb3C

#define ISP_REG_DNYUV_YSWR0                     0xc00
#define ISP_REG_DNYUV_YSWR1                     0xc04
#define ISP_REG_DNYUV_CSWR0                     0xc08
#define ISP_REG_DNYUV_CSWR1                     0xc0c
#define YUVSW5(n)                               ((n) << 20)
#define YUVSW4(n)                               ((n) << 16)
#define YUVSW3(n)                               ((n) << 12)
#define YUVSW2(n)                               ((n) << 8)
#define YUVSW1(n)                               ((n) << 4)
#define YUVSW0(n)                               ((n) << 0)

#define ISP_REG_DNYUV_YDR0                      0xc10
#define ISP_REG_DNYUV_YDR1                      0xc14
#define ISP_REG_DNYUV_YDR2                      0xc18
#define ISP_REG_DNYUV_CDR0                      0xc1c
#define ISP_REG_DNYUV_CDR1                      0xc20
#define ISP_REG_DNYUV_CDR2                      0xc24
#define CURVE_D_H(n)                            ((n) << 16)
#define CURVE_D_L(n)                            ((n) << 0)

#define ISP_REG_ICAMD_0                         0xc40
#define ISP_REG_ICAMD_12                        0xc70
#define ISP_REG_ICAMD_20                        0xc90
#define ISP_REG_ICAMD_24                        0xca0
#define ISP_REG_ICAMD_25                        0xca4
#define DNRM_F(n)                               ((n) << 16)
#define CCM_M_DAT(n)                            ((n) << 0)

#define ISP_REG_GAMMA_VAL0                      0xe00
#define ISP_REG_GAMMA_VAL1                      0xe04
#define ISP_REG_GAMMA_VAL2                      0xe08
#define ISP_REG_GAMMA_VAL3                      0xe0c
#define ISP_REG_GAMMA_VAL4                      0xe10
#define ISP_REG_GAMMA_VAL5                      0xe14
#define ISP_REG_GAMMA_VAL6                      0xe18
#define ISP_REG_GAMMA_VAL7                      0xe1c
#define ISP_REG_GAMMA_VAL8                      0xe20
#define ISP_REG_GAMMA_VAL9                      0xe24
#define ISP_REG_GAMMA_VAL10                     0xe28
#define ISP_REG_GAMMA_VAL11                     0xe2c
#define ISP_REG_GAMMA_VAL12                     0xe30
#define ISP_REG_GAMMA_VAL13                     0xe34
#define ISP_REG_GAMMA_VAL14                     0xe38
#define GAMMA_S_VAL(n)                          ((n) << 16)
#define GAMMA_VAL(n)                            ((n) << 0)

#define ISP_REG_R2Y_0                           0xe40
#define ISP_REG_R2Y_1                           0xe44
#define ISP_REG_R2Y_2                           0xe48
#define ISP_REG_R2Y_3                           0xe4c
#define ISP_REG_R2Y_4                           0xe50
#define ISP_REG_R2Y_5                           0xe54
#define ISP_REG_R2Y_6                           0xe58
#define ISP_REG_R2Y_7                           0xe5c
#define ISP_REG_R2Y_8                           0xe60

#define ISP_REG_SHARPEN0                        0xe80
#define ISP_REG_SHARPEN1                        0xe84
#define ISP_REG_SHARPEN2                        0xe88
#define ISP_REG_SHARPEN3                        0xe8c
#define ISP_REG_SHARPEN4                        0xe90
#define ISP_REG_SHARPEN5                        0xe94
#define ISP_REG_SHARPEN6                        0xe98
#define ISP_REG_SHARPEN7                        0xe9c
#define ISP_REG_SHARPEN8                        0xea0
#define ISP_REG_SHARPEN9                        0xea4
#define ISP_REG_SHARPEN10                       0xea8
#define ISP_REG_SHARPEN11                       0xeac
#define ISP_REG_SHARPEN12                       0xeb0
#define ISP_REG_SHARPEN13                       0xeb4
#define ISP_REG_SHARPEN14                       0xeb8
#define S_DELTA(n)                              ((n) << 16)
#define S_WEIGHT(n)                             ((n) << 8)

#define ISP_REG_SHARPEN_FS0                     0xebc
#define ISP_REG_SHARPEN_FS1                     0xec0
#define ISP_REG_SHARPEN_FS2                     0xec4
#define ISP_REG_SHARPEN_FS3                     0xec8
#define ISP_REG_SHARPEN_FS4                     0xecc
#define ISP_REG_SHARPEN_FS5                     0xed0
#define S_FACTOR(n)                             ((n) << 24)
#define S_SLOPE(n)                              ((n) << 0)

#define ISP_REG_SHARPEN_WN                      0xed4
#define PDIRF(n)                                ((n) << 28)
#define NDIRF(n)                                ((n) << 24)
#define WSUM(n)                                 ((n) << 0)

#define ISP_REG_IUVS1                           0xed8
#define UVDIFF2(n)                              ((n) << 16)
#define UVDIFF1(n)                              ((n) << 0)

#define ISP_REG_IUVS2                           0xedc
#define UVF(n)                                  ((n) << 24)
#define UVSLOPE(n)                              ((n) << 0)

#define ISP_REG_IUVCKS1                         0xee0
#define UVCKDIFF2(n)                            ((n) << 16)
#define UVCKDIFF1(n)                            ((n) << 0)

#define ISP_REG_IUVCKS2                         0xee4

#define ISP_REG_ISHRPET                         0xee8
#define TH(n)                                   ((n) << 8)
#define EN(n)                                   ((n) << 0)

#define ISP_REG_YCURVE_0                        0xf00
#define ISP_REG_YCURVE_63                       0xffc

#define IMAGE_MAX_WIDTH                         1920
#define IMAGE_MAX_HEIGH                         1080

/* pad id for media framework */
enum stf_isp_pad_id {
        STF_ISP_PAD_SINK = 0,
        STF_ISP_PAD_SRC,
        STF_ISP_PAD_MAX
};

struct stf_isp_format {
        u32 code;
        u8 bpp;
};

struct stf_isp_format_table {
        const struct stf_isp_format *fmts;
        int nfmts;
};

struct stf_isp_dev {
        struct stfcamss *stfcamss;
        struct v4l2_subdev subdev;
        struct media_pad pads[STF_ISP_PAD_MAX];
        const struct stf_isp_format_table *formats;
        unsigned int nformats;
        struct v4l2_subdev *source_subdev;
        const struct stf_isp_format *current_fmt;
};

int stf_isp_reset(struct stf_isp_dev *isp_dev);
void stf_isp_init_cfg(struct stf_isp_dev *isp_dev);
void stf_isp_settings(struct stf_isp_dev *isp_dev,
                      struct v4l2_rect *crop, u32 mcode);
void stf_isp_stream_set(struct stf_isp_dev *isp_dev);
int stf_isp_init(struct stfcamss *stfcamss);
int stf_isp_register(struct stf_isp_dev *isp_dev, struct v4l2_device *v4l2_dev);
int stf_isp_unregister(struct stf_isp_dev *isp_dev);

#endif /* STF_ISP_H */