11bd4fe43Sopenharmony_ci/*
21bd4fe43Sopenharmony_ci * Copyright (c) 2022 HiSilicon (Shanghai) Technologies CO., LIMITED.
31bd4fe43Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
41bd4fe43Sopenharmony_ci * you may not use this file except in compliance with the License.
51bd4fe43Sopenharmony_ci * You may obtain a copy of the License at
61bd4fe43Sopenharmony_ci *
71bd4fe43Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
81bd4fe43Sopenharmony_ci *
91bd4fe43Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
101bd4fe43Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
111bd4fe43Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
121bd4fe43Sopenharmony_ci * See the License for the specific language governing permissions and
131bd4fe43Sopenharmony_ci * limitations under the License.
141bd4fe43Sopenharmony_ci */
151bd4fe43Sopenharmony_ci
161bd4fe43Sopenharmony_ci#ifndef __HI_MIPI_H__
171bd4fe43Sopenharmony_ci#define __HI_MIPI_H__
181bd4fe43Sopenharmony_ci
191bd4fe43Sopenharmony_citypedef unsigned int combo_dev_t;
201bd4fe43Sopenharmony_citypedef unsigned int sns_rst_source_t;
211bd4fe43Sopenharmony_citypedef unsigned int sns_clk_source_t;
221bd4fe43Sopenharmony_ci
231bd4fe43Sopenharmony_ci#define MIPI_LANE_NUM                4
241bd4fe43Sopenharmony_ci#define LVDS_LANE_NUM                4
251bd4fe43Sopenharmony_ci
261bd4fe43Sopenharmony_ci#define WDR_VC_NUM                   4
271bd4fe43Sopenharmony_ci#define SYNC_CODE_NUM                4
281bd4fe43Sopenharmony_ci
291bd4fe43Sopenharmony_ci#define MIPI_RX_MAX_DEV_NUM          2
301bd4fe43Sopenharmony_ci#define CMOS_MAX_DEV_NUM             1
311bd4fe43Sopenharmony_ci
321bd4fe43Sopenharmony_ci#define SNS_MAX_CLK_SOURCE_NUM       2
331bd4fe43Sopenharmony_ci#define SNS_MAX_RST_SOURCE_NUM       2
341bd4fe43Sopenharmony_ci#define MAX_EXT_DATA_TYPE_NUM        3
351bd4fe43Sopenharmony_ci
361bd4fe43Sopenharmony_ci#define hi_mipi_rx_unused(x) ((void)(x))
371bd4fe43Sopenharmony_ci
381bd4fe43Sopenharmony_ci#define HI_ERR(x...)                                     \
391bd4fe43Sopenharmony_ci    do {                                                 \
401bd4fe43Sopenharmony_ci        osal_printk("%s(%d): ", __FUNCTION__, __LINE__); \
411bd4fe43Sopenharmony_ci        osal_printk(x);                                  \
421bd4fe43Sopenharmony_ci    } while (0)
431bd4fe43Sopenharmony_ci
441bd4fe43Sopenharmony_citypedef enum {
451bd4fe43Sopenharmony_ci    LANE_DIVIDE_MODE_0 = 0,
461bd4fe43Sopenharmony_ci    LANE_DIVIDE_MODE_1 = 1,
471bd4fe43Sopenharmony_ci    LANE_DIVIDE_MODE_BUTT
481bd4fe43Sopenharmony_ci} lane_divide_mode_t;
491bd4fe43Sopenharmony_ci
501bd4fe43Sopenharmony_citypedef enum {
511bd4fe43Sopenharmony_ci    WORK_MODE_LVDS = 0x0,
521bd4fe43Sopenharmony_ci    WORK_MODE_MIPI = 0x1,
531bd4fe43Sopenharmony_ci    WORK_MODE_CMOS = 0x2,
541bd4fe43Sopenharmony_ci    WORK_MODE_BT1120 = 0x3,
551bd4fe43Sopenharmony_ci    WORK_MODE_SLVS = 0x4,
561bd4fe43Sopenharmony_ci    WORK_MODE_BUTT
571bd4fe43Sopenharmony_ci} work_mode_t;
581bd4fe43Sopenharmony_ci
591bd4fe43Sopenharmony_citypedef enum {
601bd4fe43Sopenharmony_ci    INPUT_MODE_MIPI = 0x0, /* mipi */
611bd4fe43Sopenharmony_ci    INPUT_MODE_SUBLVDS = 0x1, /* SUB_LVDS */
621bd4fe43Sopenharmony_ci    INPUT_MODE_LVDS = 0x2, /* LVDS */
631bd4fe43Sopenharmony_ci    INPUT_MODE_HISPI = 0x3, /* HISPI */
641bd4fe43Sopenharmony_ci    INPUT_MODE_CMOS = 0x4, /* CMOS */
651bd4fe43Sopenharmony_ci    INPUT_MODE_BT601 = 0x5, /* BT601 */
661bd4fe43Sopenharmony_ci    INPUT_MODE_BT656 = 0x6, /* BT656 */
671bd4fe43Sopenharmony_ci    INPUT_MODE_BT1120 = 0x7, /* BT1120 */
681bd4fe43Sopenharmony_ci    INPUT_MODE_BYPASS = 0x8, /* MIPI Bypass */
691bd4fe43Sopenharmony_ci
701bd4fe43Sopenharmony_ci    INPUT_MODE_BUTT
711bd4fe43Sopenharmony_ci} input_mode_t;
721bd4fe43Sopenharmony_ci
731bd4fe43Sopenharmony_citypedef enum {
741bd4fe43Sopenharmony_ci    MIPI_DATA_RATE_X1 = 0, /* output 1 pixel per clock */
751bd4fe43Sopenharmony_ci    MIPI_DATA_RATE_X2 = 1, /* output 2 pixel per clock */
761bd4fe43Sopenharmony_ci
771bd4fe43Sopenharmony_ci    MIPI_DATA_RATE_BUTT
781bd4fe43Sopenharmony_ci} mipi_data_rate_t;
791bd4fe43Sopenharmony_ci
801bd4fe43Sopenharmony_citypedef struct {
811bd4fe43Sopenharmony_ci    int x;
821bd4fe43Sopenharmony_ci    int y;
831bd4fe43Sopenharmony_ci    unsigned int width;
841bd4fe43Sopenharmony_ci    unsigned int height;
851bd4fe43Sopenharmony_ci} img_rect_t;
861bd4fe43Sopenharmony_ci
871bd4fe43Sopenharmony_citypedef struct {
881bd4fe43Sopenharmony_ci    unsigned int width;
891bd4fe43Sopenharmony_ci    unsigned int height;
901bd4fe43Sopenharmony_ci} img_size_t;
911bd4fe43Sopenharmony_ci
921bd4fe43Sopenharmony_citypedef enum {
931bd4fe43Sopenharmony_ci    DATA_TYPE_RAW_8BIT = 0,
941bd4fe43Sopenharmony_ci    DATA_TYPE_RAW_10BIT,
951bd4fe43Sopenharmony_ci    DATA_TYPE_RAW_12BIT,
961bd4fe43Sopenharmony_ci    DATA_TYPE_RAW_14BIT,
971bd4fe43Sopenharmony_ci    DATA_TYPE_RAW_16BIT,
981bd4fe43Sopenharmony_ci    DATA_TYPE_YUV420_8BIT_NORMAL,
991bd4fe43Sopenharmony_ci    DATA_TYPE_YUV420_8BIT_LEGACY,
1001bd4fe43Sopenharmony_ci    DATA_TYPE_YUV422_8BIT,
1011bd4fe43Sopenharmony_ci    DATA_TYPE_YUV422_PACKED, /* yuv422 8bit transform user define 16bit raw */
1021bd4fe43Sopenharmony_ci    DATA_TYPE_BUTT
1031bd4fe43Sopenharmony_ci} data_type_t;
1041bd4fe43Sopenharmony_ci
1051bd4fe43Sopenharmony_citypedef struct {
1061bd4fe43Sopenharmony_ci    combo_dev_t devno;
1071bd4fe43Sopenharmony_ci    unsigned int num;
1081bd4fe43Sopenharmony_ci    unsigned int ext_data_bit_width[MAX_EXT_DATA_TYPE_NUM];
1091bd4fe43Sopenharmony_ci    unsigned int ext_data_type[MAX_EXT_DATA_TYPE_NUM];
1101bd4fe43Sopenharmony_ci} ext_data_type_t;
1111bd4fe43Sopenharmony_ci
1121bd4fe43Sopenharmony_ci/* MIPI D_PHY WDR MODE defines */
1131bd4fe43Sopenharmony_citypedef enum {
1141bd4fe43Sopenharmony_ci    HI_MIPI_WDR_MODE_NONE = 0x0,
1151bd4fe43Sopenharmony_ci    HI_MIPI_WDR_MODE_VC = 0x1, /* Virtual Channel */
1161bd4fe43Sopenharmony_ci    HI_MIPI_WDR_MODE_DT = 0x2, /* Data Type */
1171bd4fe43Sopenharmony_ci    HI_MIPI_WDR_MODE_DOL = 0x3, /* DOL Mode */
1181bd4fe43Sopenharmony_ci    HI_MIPI_WDR_MODE_BUTT
1191bd4fe43Sopenharmony_ci} mipi_wdr_mode_t;
1201bd4fe43Sopenharmony_ci
1211bd4fe43Sopenharmony_citypedef struct {
1221bd4fe43Sopenharmony_ci    data_type_t input_data_type; /* data type: 8/10/12/14/16 bit */
1231bd4fe43Sopenharmony_ci    mipi_wdr_mode_t wdr_mode; /* MIPI WDR mode */
1241bd4fe43Sopenharmony_ci    short lane_id[MIPI_LANE_NUM]; /* lane_id: -1 - disable */
1251bd4fe43Sopenharmony_ci
1261bd4fe43Sopenharmony_ci    union {
1271bd4fe43Sopenharmony_ci        short data_type[WDR_VC_NUM]; /* used by the HI_MIPI_WDR_MODE_DT */
1281bd4fe43Sopenharmony_ci    };
1291bd4fe43Sopenharmony_ci} mipi_dev_attr_t;
1301bd4fe43Sopenharmony_ci
1311bd4fe43Sopenharmony_citypedef enum {
1321bd4fe43Sopenharmony_ci    HI_WDR_MODE_NONE = 0x0,
1331bd4fe43Sopenharmony_ci    HI_WDR_MODE_2F = 0x1,
1341bd4fe43Sopenharmony_ci    HI_WDR_MODE_3F = 0x2,
1351bd4fe43Sopenharmony_ci    HI_WDR_MODE_4F = 0x3,
1361bd4fe43Sopenharmony_ci    HI_WDR_MODE_DOL_2F = 0x4,
1371bd4fe43Sopenharmony_ci    HI_WDR_MODE_DOL_3F = 0x5,
1381bd4fe43Sopenharmony_ci    HI_WDR_MODE_DOL_4F = 0x6,
1391bd4fe43Sopenharmony_ci    HI_WDR_MODE_BUTT
1401bd4fe43Sopenharmony_ci} wdr_mode_t;
1411bd4fe43Sopenharmony_ci
1421bd4fe43Sopenharmony_citypedef enum {
1431bd4fe43Sopenharmony_ci    LVDS_SYNC_MODE_SOF = 0, /* sensor SOL, EOL, SOF, EOF */
1441bd4fe43Sopenharmony_ci    LVDS_SYNC_MODE_SAV, /* SAV, EAV */
1451bd4fe43Sopenharmony_ci    LVDS_SYNC_MODE_BUTT
1461bd4fe43Sopenharmony_ci} lvds_sync_mode_t;
1471bd4fe43Sopenharmony_ci
1481bd4fe43Sopenharmony_citypedef enum {
1491bd4fe43Sopenharmony_ci    LVDS_VSYNC_NORMAL = 0x00,
1501bd4fe43Sopenharmony_ci    LVDS_VSYNC_SHARE = 0x01,
1511bd4fe43Sopenharmony_ci    LVDS_VSYNC_HCONNECT = 0x02,
1521bd4fe43Sopenharmony_ci    LVDS_VSYNC_BUTT
1531bd4fe43Sopenharmony_ci} lvds_vsync_type_t;
1541bd4fe43Sopenharmony_ci
1551bd4fe43Sopenharmony_citypedef struct {
1561bd4fe43Sopenharmony_ci    lvds_vsync_type_t sync_type;
1571bd4fe43Sopenharmony_ci
1581bd4fe43Sopenharmony_ci    /* hconnect vsync blanking len, valid when the sync_type is LVDS_VSYNC_HCONNECT */
1591bd4fe43Sopenharmony_ci    unsigned short hblank1;
1601bd4fe43Sopenharmony_ci    unsigned short hblank2;
1611bd4fe43Sopenharmony_ci} lvds_vsync_attr_t;
1621bd4fe43Sopenharmony_ci
1631bd4fe43Sopenharmony_citypedef enum {
1641bd4fe43Sopenharmony_ci    LVDS_FID_NONE = 0x00,
1651bd4fe43Sopenharmony_ci    LVDS_FID_IN_SAV = 0x01, /* frame identification id in SAV 4th */
1661bd4fe43Sopenharmony_ci    LVDS_FID_IN_DATA = 0x02, /* frame identification id in first data */
1671bd4fe43Sopenharmony_ci    LVDS_FID_BUTT
1681bd4fe43Sopenharmony_ci} lvds_fid_type_t;
1691bd4fe43Sopenharmony_ci
1701bd4fe43Sopenharmony_citypedef struct {
1711bd4fe43Sopenharmony_ci    lvds_fid_type_t fid_type;
1721bd4fe43Sopenharmony_ci
1731bd4fe43Sopenharmony_ci    /*
1741bd4fe43Sopenharmony_ci     * Sony DOL has the Frame Information Line, in DOL H-Connection mode,
1751bd4fe43Sopenharmony_ci     * should configure this flag as false to disable output the Frame Information Line
1761bd4fe43Sopenharmony_ci     */
1771bd4fe43Sopenharmony_ci    unsigned char output_fil;
1781bd4fe43Sopenharmony_ci} lvds_fid_attr_t;
1791bd4fe43Sopenharmony_ci
1801bd4fe43Sopenharmony_citypedef enum {
1811bd4fe43Sopenharmony_ci    LVDS_ENDIAN_LITTLE = 0x0,
1821bd4fe43Sopenharmony_ci    LVDS_ENDIAN_BIG = 0x1,
1831bd4fe43Sopenharmony_ci    LVDS_ENDIAN_BUTT
1841bd4fe43Sopenharmony_ci} lvds_bit_endian_t;
1851bd4fe43Sopenharmony_ci
1861bd4fe43Sopenharmony_citypedef struct {
1871bd4fe43Sopenharmony_ci    data_type_t input_data_type; /* data type: 8/10/12/14 bit */
1881bd4fe43Sopenharmony_ci    wdr_mode_t wdr_mode; /* WDR mode */
1891bd4fe43Sopenharmony_ci
1901bd4fe43Sopenharmony_ci    lvds_sync_mode_t sync_mode; /* sync mode: SOF, SAV */
1911bd4fe43Sopenharmony_ci    lvds_vsync_attr_t vsync_attr; /* normal, share, hconnect */
1921bd4fe43Sopenharmony_ci    lvds_fid_attr_t fid_attr; /* frame identification code */
1931bd4fe43Sopenharmony_ci
1941bd4fe43Sopenharmony_ci    lvds_bit_endian_t data_endian; /* data endian: little/big */
1951bd4fe43Sopenharmony_ci    lvds_bit_endian_t sync_code_endian; /* sync code endian: little/big */
1961bd4fe43Sopenharmony_ci    short lane_id[LVDS_LANE_NUM]; /* lane_id: -1 - disable */
1971bd4fe43Sopenharmony_ci
1981bd4fe43Sopenharmony_ci    /*
1991bd4fe43Sopenharmony_ci     * each vc has 4 params, sync_code[i]:
2001bd4fe43Sopenharmony_ci     * sync_mode is SYNC_MODE_SOF: SOF, EOF, SOL, EOL
2011bd4fe43Sopenharmony_ci     * sync_mode is SYNC_MODE_SAV: invalid sav, invalid eav, valid sav, valid eav
2021bd4fe43Sopenharmony_ci     */
2031bd4fe43Sopenharmony_ci    unsigned short sync_code[LVDS_LANE_NUM][WDR_VC_NUM][SYNC_CODE_NUM];
2041bd4fe43Sopenharmony_ci} lvds_dev_attr_t;
2051bd4fe43Sopenharmony_ci
2061bd4fe43Sopenharmony_citypedef struct {
2071bd4fe43Sopenharmony_ci    combo_dev_t devno; /* device number */
2081bd4fe43Sopenharmony_ci    input_mode_t input_mode; /* input mode: MIPI/LVDS/SUBLVDS/HISPI/DC */
2091bd4fe43Sopenharmony_ci    mipi_data_rate_t data_rate;
2101bd4fe43Sopenharmony_ci    img_rect_t img_rect; /* MIPI Rx device crop area (corresponding to the oringnal sensor input image size) */
2111bd4fe43Sopenharmony_ci
2121bd4fe43Sopenharmony_ci    union {
2131bd4fe43Sopenharmony_ci        mipi_dev_attr_t mipi_attr;
2141bd4fe43Sopenharmony_ci        lvds_dev_attr_t lvds_attr;
2151bd4fe43Sopenharmony_ci    };
2161bd4fe43Sopenharmony_ci} combo_dev_attr_t;
2171bd4fe43Sopenharmony_ci
2181bd4fe43Sopenharmony_citypedef enum {
2191bd4fe43Sopenharmony_ci    PHY_CMV_GE1200MV = 0x00,
2201bd4fe43Sopenharmony_ci    PHY_CMV_LT1200MV = 0x01,
2211bd4fe43Sopenharmony_ci    PHY_CMV_BUTT
2221bd4fe43Sopenharmony_ci} phy_cmv_mode_t;
2231bd4fe43Sopenharmony_ci
2241bd4fe43Sopenharmony_citypedef struct {
2251bd4fe43Sopenharmony_ci    combo_dev_t devno;
2261bd4fe43Sopenharmony_ci    phy_cmv_mode_t cmv_mode;
2271bd4fe43Sopenharmony_ci} phy_cmv_t;
2281bd4fe43Sopenharmony_ci
2291bd4fe43Sopenharmony_ci#define HI_MIPI_IOC_MAGIC            'm'
2301bd4fe43Sopenharmony_ci
2311bd4fe43Sopenharmony_ci/* init data lane, input mode, data type */
2321bd4fe43Sopenharmony_ci#define HI_MIPI_SET_DEV_ATTR         _IOW(HI_MIPI_IOC_MAGIC, 0x01, combo_dev_attr_t)
2331bd4fe43Sopenharmony_ci
2341bd4fe43Sopenharmony_ci/* set phy common mode voltage mode */
2351bd4fe43Sopenharmony_ci#define HI_MIPI_SET_PHY_CMVMODE      _IOW(HI_MIPI_IOC_MAGIC, 0x04, phy_cmv_t)
2361bd4fe43Sopenharmony_ci
2371bd4fe43Sopenharmony_ci/* reset sensor */
2381bd4fe43Sopenharmony_ci#define HI_MIPI_RESET_SENSOR         _IOW(HI_MIPI_IOC_MAGIC, 0x05, sns_rst_source_t)
2391bd4fe43Sopenharmony_ci
2401bd4fe43Sopenharmony_ci/* unreset sensor */
2411bd4fe43Sopenharmony_ci#define HI_MIPI_UNRESET_SENSOR       _IOW(HI_MIPI_IOC_MAGIC, 0x06, sns_rst_source_t)
2421bd4fe43Sopenharmony_ci
2431bd4fe43Sopenharmony_ci/* reset mipi */
2441bd4fe43Sopenharmony_ci#define HI_MIPI_RESET_MIPI           _IOW(HI_MIPI_IOC_MAGIC, 0x07, combo_dev_t)
2451bd4fe43Sopenharmony_ci
2461bd4fe43Sopenharmony_ci/* unreset mipi */
2471bd4fe43Sopenharmony_ci#define HI_MIPI_UNRESET_MIPI         _IOW(HI_MIPI_IOC_MAGIC, 0x08, combo_dev_t)
2481bd4fe43Sopenharmony_ci
2491bd4fe43Sopenharmony_ci/* reset slvs */
2501bd4fe43Sopenharmony_ci#define HI_MIPI_RESET_SLVS           _IOW(HI_MIPI_IOC_MAGIC, 0x09, combo_dev_t)
2511bd4fe43Sopenharmony_ci
2521bd4fe43Sopenharmony_ci/* unreset slvs */
2531bd4fe43Sopenharmony_ci#define HI_MIPI_UNRESET_SLVS         _IOW(HI_MIPI_IOC_MAGIC, 0x0a, combo_dev_t)
2541bd4fe43Sopenharmony_ci
2551bd4fe43Sopenharmony_ci/* set mipi hs_mode */
2561bd4fe43Sopenharmony_ci#define HI_MIPI_SET_HS_MODE          _IOW(HI_MIPI_IOC_MAGIC, 0x0b, lane_divide_mode_t)
2571bd4fe43Sopenharmony_ci
2581bd4fe43Sopenharmony_ci/* enable mipi clock */
2591bd4fe43Sopenharmony_ci#define HI_MIPI_ENABLE_MIPI_CLOCK    _IOW(HI_MIPI_IOC_MAGIC, 0x0c, combo_dev_t)
2601bd4fe43Sopenharmony_ci
2611bd4fe43Sopenharmony_ci/* disable mipi clock */
2621bd4fe43Sopenharmony_ci#define HI_MIPI_DISABLE_MIPI_CLOCK   _IOW(HI_MIPI_IOC_MAGIC, 0x0d, combo_dev_t)
2631bd4fe43Sopenharmony_ci
2641bd4fe43Sopenharmony_ci/* enable slvs clock */
2651bd4fe43Sopenharmony_ci#define HI_MIPI_ENABLE_SLVS_CLOCK    _IOW(HI_MIPI_IOC_MAGIC, 0x0e, combo_dev_t)
2661bd4fe43Sopenharmony_ci
2671bd4fe43Sopenharmony_ci/* disable slvs clock */
2681bd4fe43Sopenharmony_ci#define HI_MIPI_DISABLE_SLVS_CLOCK   _IOW(HI_MIPI_IOC_MAGIC, 0x0f, combo_dev_t)
2691bd4fe43Sopenharmony_ci
2701bd4fe43Sopenharmony_ci/* enable sensor clock */
2711bd4fe43Sopenharmony_ci#define HI_MIPI_ENABLE_SENSOR_CLOCK  _IOW(HI_MIPI_IOC_MAGIC, 0x10, sns_clk_source_t)
2721bd4fe43Sopenharmony_ci
2731bd4fe43Sopenharmony_ci/* disable sensor clock */
2741bd4fe43Sopenharmony_ci#define HI_MIPI_DISABLE_SENSOR_CLOCK _IOW(HI_MIPI_IOC_MAGIC, 0x11, sns_clk_source_t)
2751bd4fe43Sopenharmony_ci
2761bd4fe43Sopenharmony_ci#define HI_MIPI_SET_EXT_DATA_TYPE    _IOW(HI_MIPI_IOC_MAGIC, 0x12, ext_data_type_t)
2771bd4fe43Sopenharmony_ci
2781bd4fe43Sopenharmony_ci#endif /* __HI_MIPI_RX_H__ */
279