/* 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 */