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