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