1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Rockchip isp1 driver 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Copyright (C) 2017 Rockchip Electronics Co., Ltd. 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * This software is available to you under a choice of one of two 7*4882a593Smuzhiyun * licenses. You may choose to be licensed under the terms of the GNU 8*4882a593Smuzhiyun * General Public License (GPL) Version 2, available from the file 9*4882a593Smuzhiyun * COPYING in the main directory of this source tree, or the 10*4882a593Smuzhiyun * OpenIB.org BSD license below: 11*4882a593Smuzhiyun * 12*4882a593Smuzhiyun * Redistribution and use in source and binary forms, with or 13*4882a593Smuzhiyun * without modification, are permitted provided that the following 14*4882a593Smuzhiyun * conditions are met: 15*4882a593Smuzhiyun * 16*4882a593Smuzhiyun * - Redistributions of source code must retain the above 17*4882a593Smuzhiyun * copyright notice, this list of conditions and the following 18*4882a593Smuzhiyun * disclaimer. 19*4882a593Smuzhiyun * 20*4882a593Smuzhiyun * - Redistributions in binary form must reproduce the above 21*4882a593Smuzhiyun * copyright notice, this list of conditions and the following 22*4882a593Smuzhiyun * disclaimer in the documentation and/or other materials 23*4882a593Smuzhiyun * provided with the distribution. 24*4882a593Smuzhiyun * 25*4882a593Smuzhiyun * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 26*4882a593Smuzhiyun * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 27*4882a593Smuzhiyun * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 28*4882a593Smuzhiyun * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 29*4882a593Smuzhiyun * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 30*4882a593Smuzhiyun * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 31*4882a593Smuzhiyun * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 32*4882a593Smuzhiyun * SOFTWARE. 33*4882a593Smuzhiyun */ 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun #ifndef _RKISP1_DEV_H 36*4882a593Smuzhiyun #define _RKISP1_DEV_H 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun #include "capture.h" 39*4882a593Smuzhiyun #include "dmarx.h" 40*4882a593Smuzhiyun #include "rkisp1.h" 41*4882a593Smuzhiyun #include "isp_params.h" 42*4882a593Smuzhiyun #include "isp_stats.h" 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun #define DRIVER_NAME "rkisp1" 45*4882a593Smuzhiyun #define ISP_VDEV_NAME DRIVER_NAME "_ispdev" 46*4882a593Smuzhiyun #define SP_VDEV_NAME DRIVER_NAME "_selfpath" 47*4882a593Smuzhiyun #define MP_VDEV_NAME DRIVER_NAME "_mainpath" 48*4882a593Smuzhiyun #define DMA_VDEV_NAME DRIVER_NAME "_dmapath" 49*4882a593Smuzhiyun #define RAW_VDEV_NAME DRIVER_NAME "_rawpath" 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun #define GRP_ID_SENSOR BIT(0) 52*4882a593Smuzhiyun #define GRP_ID_MIPIPHY BIT(1) 53*4882a593Smuzhiyun #define GRP_ID_ISP BIT(2) 54*4882a593Smuzhiyun #define GRP_ID_ISP_MP BIT(3) 55*4882a593Smuzhiyun #define GRP_ID_ISP_SP BIT(4) 56*4882a593Smuzhiyun #define GRP_ID_ISP_DMARX BIT(5) 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun #define RKISP1_MAX_BUS_CLK 8 59*4882a593Smuzhiyun #define RKISP1_MAX_SENSOR 2 60*4882a593Smuzhiyun #define RKISP1_MAX_PIPELINE 4 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun #define RKISP1_MEDIA_BUS_FMT_MASK 0xF000 63*4882a593Smuzhiyun #define RKISP1_MEDIA_BUS_FMT_BAYER 0x3000 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun #define RKISP1_CONTI_ERR_MAX 50 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun /* ISP_V10_1 for only support MP */ 68*4882a593Smuzhiyun enum rkisp1_isp_ver { 69*4882a593Smuzhiyun ISP_V10 = 0x00, 70*4882a593Smuzhiyun ISP_V10_1 = 0x01, 71*4882a593Smuzhiyun ISP_V11 = 0x10, 72*4882a593Smuzhiyun ISP_V12 = 0x20, 73*4882a593Smuzhiyun ISP_V13 = 0x30, 74*4882a593Smuzhiyun }; 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun enum rkisp1_isp_state { 77*4882a593Smuzhiyun ISP_STOP = 0, 78*4882a593Smuzhiyun ISP_START, 79*4882a593Smuzhiyun ISP_ERROR 80*4882a593Smuzhiyun }; 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun enum rkisp1_isp_inp { 83*4882a593Smuzhiyun INP_INVAL = 0, 84*4882a593Smuzhiyun INP_CSI, 85*4882a593Smuzhiyun INP_DVP, 86*4882a593Smuzhiyun INP_DMARX_ISP, 87*4882a593Smuzhiyun }; 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun /* 90*4882a593Smuzhiyun * struct rkisp1_pipeline - An ISP hardware pipeline 91*4882a593Smuzhiyun * 92*4882a593Smuzhiyun * Capture device call other devices via pipeline 93*4882a593Smuzhiyun * 94*4882a593Smuzhiyun * @num_subdevs: number of linked subdevs 95*4882a593Smuzhiyun * @power_cnt: pipeline power count 96*4882a593Smuzhiyun * @stream_cnt: stream power count 97*4882a593Smuzhiyun */ 98*4882a593Smuzhiyun struct rkisp1_pipeline { 99*4882a593Smuzhiyun struct media_pipeline pipe; 100*4882a593Smuzhiyun int num_subdevs; 101*4882a593Smuzhiyun atomic_t power_cnt; 102*4882a593Smuzhiyun atomic_t stream_cnt; 103*4882a593Smuzhiyun struct v4l2_subdev *subdevs[RKISP1_MAX_PIPELINE]; 104*4882a593Smuzhiyun int (*open)(struct rkisp1_pipeline *p, 105*4882a593Smuzhiyun struct media_entity *me, bool prepare); 106*4882a593Smuzhiyun int (*close)(struct rkisp1_pipeline *p); 107*4882a593Smuzhiyun int (*set_stream)(struct rkisp1_pipeline *p, bool on); 108*4882a593Smuzhiyun }; 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun /* 111*4882a593Smuzhiyun * struct rkisp1_sensor_info - Sensor infomations 112*4882a593Smuzhiyun * @mbus: media bus configuration 113*4882a593Smuzhiyun */ 114*4882a593Smuzhiyun struct rkisp1_sensor_info { 115*4882a593Smuzhiyun struct v4l2_subdev *sd; 116*4882a593Smuzhiyun struct v4l2_mbus_config mbus; 117*4882a593Smuzhiyun struct v4l2_subdev_format fmt; 118*4882a593Smuzhiyun struct v4l2_subdev_pad_config cfg; 119*4882a593Smuzhiyun }; 120*4882a593Smuzhiyun 121*4882a593Smuzhiyun /* 122*4882a593Smuzhiyun * struct rkisp1_device - ISP platform device 123*4882a593Smuzhiyun * @base_addr: base register address 124*4882a593Smuzhiyun * @active_sensor: sensor in-use, set when streaming on 125*4882a593Smuzhiyun * @isp_sdev: ISP sub-device 126*4882a593Smuzhiyun * @rkisp1_stream: capture video device 127*4882a593Smuzhiyun * @stats_vdev: ISP statistics output device 128*4882a593Smuzhiyun * @params_vdev: ISP input parameters device 129*4882a593Smuzhiyun */ 130*4882a593Smuzhiyun struct rkisp1_device { 131*4882a593Smuzhiyun struct list_head list; 132*4882a593Smuzhiyun struct regmap *grf; 133*4882a593Smuzhiyun void __iomem *base_addr; 134*4882a593Smuzhiyun int irq; 135*4882a593Smuzhiyun struct device *dev; 136*4882a593Smuzhiyun struct clk *clks[RKISP1_MAX_BUS_CLK]; 137*4882a593Smuzhiyun int num_clks; 138*4882a593Smuzhiyun struct v4l2_device v4l2_dev; 139*4882a593Smuzhiyun struct v4l2_ctrl_handler ctrl_handler; 140*4882a593Smuzhiyun struct media_device media_dev; 141*4882a593Smuzhiyun struct v4l2_async_notifier notifier; 142*4882a593Smuzhiyun struct v4l2_subdev *subdevs[RKISP1_SD_MAX]; 143*4882a593Smuzhiyun struct rkisp1_sensor_info *active_sensor; 144*4882a593Smuzhiyun struct rkisp1_sensor_info sensors[RKISP1_MAX_SENSOR]; 145*4882a593Smuzhiyun int num_sensors; 146*4882a593Smuzhiyun struct rkisp1_isp_subdev isp_sdev; 147*4882a593Smuzhiyun struct rkisp1_stream stream[RKISP1_MAX_STREAM]; 148*4882a593Smuzhiyun struct rkisp1_isp_stats_vdev stats_vdev; 149*4882a593Smuzhiyun struct rkisp1_isp_params_vdev params_vdev; 150*4882a593Smuzhiyun struct rkisp1_dmarx_device dmarx_dev; 151*4882a593Smuzhiyun struct rkisp1_pipeline pipe; 152*4882a593Smuzhiyun struct iommu_domain *domain; 153*4882a593Smuzhiyun enum rkisp1_isp_ver isp_ver; 154*4882a593Smuzhiyun const unsigned int *clk_rate_tbl; 155*4882a593Smuzhiyun int num_clk_rate_tbl; 156*4882a593Smuzhiyun atomic_t open_cnt; 157*4882a593Smuzhiyun struct rkisp1_emd_data emd_data_fifo[RKISP1_EMDDATA_FIFO_MAX]; 158*4882a593Smuzhiyun unsigned int emd_data_idx; 159*4882a593Smuzhiyun unsigned int emd_vc; 160*4882a593Smuzhiyun unsigned int emd_dt; 161*4882a593Smuzhiyun int vs_irq; 162*4882a593Smuzhiyun int mipi_irq; 163*4882a593Smuzhiyun struct gpio_desc *vs_irq_gpio; 164*4882a593Smuzhiyun struct v4l2_subdev *hdr_sensor; 165*4882a593Smuzhiyun enum rkisp1_isp_state isp_state; 166*4882a593Smuzhiyun unsigned int isp_err_cnt; 167*4882a593Smuzhiyun enum rkisp1_isp_inp isp_inp; 168*4882a593Smuzhiyun struct mutex apilock; /* mutex to serialize the calls of stream */ 169*4882a593Smuzhiyun struct mutex iqlock; /* mutex to serialize the calls of iq */ 170*4882a593Smuzhiyun wait_queue_head_t sync_onoff; 171*4882a593Smuzhiyun }; 172*4882a593Smuzhiyun 173*4882a593Smuzhiyun #endif 174