linux/drivers/staging/media/rkisp1/rkisp1-isp.c
<<
>>
Prefs
   1// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
   2/*
   3 * Rockchip ISP1 Driver - ISP Subdevice
   4 *
   5 * Copyright (C) 2019 Collabora, Ltd.
   6 *
   7 * Based on Rockchip ISP1 driver by Rockchip Electronics Co., Ltd.
   8 * Copyright (C) 2017 Rockchip Electronics Co., Ltd.
   9 */
  10
  11#include <linux/iopoll.h>
  12#include <linux/phy/phy.h>
  13#include <linux/phy/phy-mipi-dphy.h>
  14#include <linux/pm_runtime.h>
  15#include <linux/videodev2.h>
  16#include <linux/vmalloc.h>
  17#include <media/v4l2-event.h>
  18
  19#include "rkisp1-common.h"
  20
  21#define RKISP1_DEF_SINK_PAD_FMT MEDIA_BUS_FMT_SRGGB10_1X10
  22#define RKISP1_DEF_SRC_PAD_FMT MEDIA_BUS_FMT_YUYV8_2X8
  23
  24#define RKISP1_ISP_DEV_NAME     RKISP1_DRIVER_NAME "_isp"
  25
  26/*
  27 * NOTE: MIPI controller and input MUX are also configured in this file.
  28 * This is because ISP Subdev describes not only ISP submodule (input size,
  29 * format, output size, format), but also a virtual route device.
  30 */
  31
  32/*
  33 * There are many variables named with format/frame in below code,
  34 * please see here for their meaning.
  35 * Cropping in the sink pad defines the image region from the sensor.
  36 * Cropping in the source pad defines the region for the Image Stabilizer (IS)
  37 *
  38 * Cropping regions of ISP
  39 *
  40 * +---------------------------------------------------------+
  41 * | Sensor image                                            |
  42 * | +---------------------------------------------------+   |
  43 * | | CIF_ISP_ACQ (for black level)                     |   |
  44 * | | sink pad format                                   |   |
  45 * | | +--------------------------------------------+    |   |
  46 * | | |    CIF_ISP_OUT                             |    |   |
  47 * | | |    sink pad crop                           |    |   |
  48 * | | |    +---------------------------------+     |    |   |
  49 * | | |    |   CIF_ISP_IS                    |     |    |   |
  50 * | | |    |   source pad crop and format    |     |    |   |
  51 * | | |    +---------------------------------+     |    |   |
  52 * | | +--------------------------------------------+    |   |
  53 * | +---------------------------------------------------+   |
  54 * +---------------------------------------------------------+
  55 */
  56
  57static const struct rkisp1_isp_mbus_info rkisp1_isp_formats[] = {
  58        {
  59                .mbus_code      = MEDIA_BUS_FMT_YUYV8_2X8,
  60                .pixel_enc      = V4L2_PIXEL_ENC_YUV,
  61                .direction      = RKISP1_ISP_SD_SRC,
  62        }, {
  63                .mbus_code      = MEDIA_BUS_FMT_SRGGB10_1X10,
  64                .pixel_enc      = V4L2_PIXEL_ENC_BAYER,
  65                .mipi_dt        = RKISP1_CIF_CSI2_DT_RAW10,
  66                .bayer_pat      = RKISP1_RAW_RGGB,
  67                .bus_width      = 10,
  68                .direction      = RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC,
  69        }, {
  70                .mbus_code      = MEDIA_BUS_FMT_SBGGR10_1X10,
  71                .pixel_enc      = V4L2_PIXEL_ENC_BAYER,
  72                .mipi_dt        = RKISP1_CIF_CSI2_DT_RAW10,
  73                .bayer_pat      = RKISP1_RAW_BGGR,
  74                .bus_width      = 10,
  75                .direction      = RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC,
  76        }, {
  77                .mbus_code      = MEDIA_BUS_FMT_SGBRG10_1X10,
  78                .pixel_enc      = V4L2_PIXEL_ENC_BAYER,
  79                .mipi_dt        = RKISP1_CIF_CSI2_DT_RAW10,
  80                .bayer_pat      = RKISP1_RAW_GBRG,
  81                .bus_width      = 10,
  82                .direction      = RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC,
  83        }, {
  84                .mbus_code      = MEDIA_BUS_FMT_SGRBG10_1X10,
  85                .pixel_enc      = V4L2_PIXEL_ENC_BAYER,
  86                .mipi_dt        = RKISP1_CIF_CSI2_DT_RAW10,
  87                .bayer_pat      = RKISP1_RAW_GRBG,
  88                .bus_width      = 10,
  89                .direction      = RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC,
  90        }, {
  91                .mbus_code      = MEDIA_BUS_FMT_SRGGB12_1X12,
  92                .pixel_enc      = V4L2_PIXEL_ENC_BAYER,
  93                .mipi_dt        = RKISP1_CIF_CSI2_DT_RAW12,
  94                .bayer_pat      = RKISP1_RAW_RGGB,
  95                .bus_width      = 12,
  96                .direction      = RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC,
  97        }, {
  98                .mbus_code      = MEDIA_BUS_FMT_SBGGR12_1X12,
  99                .pixel_enc      = V4L2_PIXEL_ENC_BAYER,
 100                .mipi_dt        = RKISP1_CIF_CSI2_DT_RAW12,
 101                .bayer_pat      = RKISP1_RAW_BGGR,
 102                .bus_width      = 12,
 103                .direction      = RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC,
 104        }, {
 105                .mbus_code      = MEDIA_BUS_FMT_SGBRG12_1X12,
 106                .pixel_enc      = V4L2_PIXEL_ENC_BAYER,
 107                .mipi_dt        = RKISP1_CIF_CSI2_DT_RAW12,
 108                .bayer_pat      = RKISP1_RAW_GBRG,
 109                .bus_width      = 12,
 110                .direction      = RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC,
 111        }, {
 112                .mbus_code      = MEDIA_BUS_FMT_SGRBG12_1X12,
 113                .pixel_enc      = V4L2_PIXEL_ENC_BAYER,
 114                .mipi_dt        = RKISP1_CIF_CSI2_DT_RAW12,
 115                .bayer_pat      = RKISP1_RAW_GRBG,
 116                .bus_width      = 12,
 117                .direction      = RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC,
 118        }, {
 119                .mbus_code      = MEDIA_BUS_FMT_SRGGB8_1X8,
 120                .pixel_enc      = V4L2_PIXEL_ENC_BAYER,
 121                .mipi_dt        = RKISP1_CIF_CSI2_DT_RAW8,
 122                .bayer_pat      = RKISP1_RAW_RGGB,
 123                .bus_width      = 8,
 124                .direction      = RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC,
 125        }, {
 126                .mbus_code      = MEDIA_BUS_FMT_SBGGR8_1X8,
 127                .pixel_enc      = V4L2_PIXEL_ENC_BAYER,
 128                .mipi_dt        = RKISP1_CIF_CSI2_DT_RAW8,
 129                .bayer_pat      = RKISP1_RAW_BGGR,
 130                .bus_width      = 8,
 131                .direction      = RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC,
 132        }, {
 133                .mbus_code      = MEDIA_BUS_FMT_SGBRG8_1X8,
 134                .pixel_enc      = V4L2_PIXEL_ENC_BAYER,
 135                .mipi_dt        = RKISP1_CIF_CSI2_DT_RAW8,
 136                .bayer_pat      = RKISP1_RAW_GBRG,
 137                .bus_width      = 8,
 138                .direction      = RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC,
 139        }, {
 140                .mbus_code      = MEDIA_BUS_FMT_SGRBG8_1X8,
 141                .pixel_enc      = V4L2_PIXEL_ENC_BAYER,
 142                .mipi_dt        = RKISP1_CIF_CSI2_DT_RAW8,
 143                .bayer_pat      = RKISP1_RAW_GRBG,
 144                .bus_width      = 8,
 145                .direction      = RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC,
 146        }, {
 147                .mbus_code      = MEDIA_BUS_FMT_YUYV8_1X16,
 148                .pixel_enc      = V4L2_PIXEL_ENC_YUV,
 149                .mipi_dt        = RKISP1_CIF_CSI2_DT_YUV422_8b,
 150                .yuv_seq        = RKISP1_CIF_ISP_ACQ_PROP_YCBYCR,
 151                .bus_width      = 16,
 152                .direction      = RKISP1_ISP_SD_SINK,
 153        }, {
 154                .mbus_code      = MEDIA_BUS_FMT_YVYU8_1X16,
 155                .pixel_enc      = V4L2_PIXEL_ENC_YUV,
 156                .mipi_dt        = RKISP1_CIF_CSI2_DT_YUV422_8b,
 157                .yuv_seq        = RKISP1_CIF_ISP_ACQ_PROP_YCRYCB,
 158                .bus_width      = 16,
 159                .direction      = RKISP1_ISP_SD_SINK,
 160        }, {
 161                .mbus_code      = MEDIA_BUS_FMT_UYVY8_1X16,
 162                .pixel_enc      = V4L2_PIXEL_ENC_YUV,
 163                .mipi_dt        = RKISP1_CIF_CSI2_DT_YUV422_8b,
 164                .yuv_seq        = RKISP1_CIF_ISP_ACQ_PROP_CBYCRY,
 165                .bus_width      = 16,
 166                .direction      = RKISP1_ISP_SD_SINK,
 167        }, {
 168                .mbus_code      = MEDIA_BUS_FMT_VYUY8_1X16,
 169                .pixel_enc      = V4L2_PIXEL_ENC_YUV,
 170                .mipi_dt        = RKISP1_CIF_CSI2_DT_YUV422_8b,
 171                .yuv_seq        = RKISP1_CIF_ISP_ACQ_PROP_CRYCBY,
 172                .bus_width      = 16,
 173                .direction      = RKISP1_ISP_SD_SINK,
 174        },
 175};
 176
 177/* ----------------------------------------------------------------------------
 178 * Helpers
 179 */
 180
 181const struct rkisp1_isp_mbus_info *rkisp1_isp_mbus_info_get(u32 mbus_code)
 182{
 183        unsigned int i;
 184
 185        for (i = 0; i < ARRAY_SIZE(rkisp1_isp_formats); i++) {
 186                const struct rkisp1_isp_mbus_info *fmt = &rkisp1_isp_formats[i];
 187
 188                if (fmt->mbus_code == mbus_code)
 189                        return fmt;
 190        }
 191
 192        return NULL;
 193}
 194
 195static struct v4l2_subdev *rkisp1_get_remote_sensor(struct v4l2_subdev *sd)
 196{
 197        struct media_pad *local, *remote;
 198        struct media_entity *sensor_me;
 199
 200        local = &sd->entity.pads[RKISP1_ISP_PAD_SINK_VIDEO];
 201        remote = media_entity_remote_pad(local);
 202        if (!remote)
 203                return NULL;
 204
 205        sensor_me = remote->entity;
 206        return media_entity_to_v4l2_subdev(sensor_me);
 207}
 208
 209static struct v4l2_mbus_framefmt *
 210rkisp1_isp_get_pad_fmt(struct rkisp1_isp *isp,
 211                       struct v4l2_subdev_pad_config *cfg,
 212                       unsigned int pad, u32 which)
 213{
 214        if (which == V4L2_SUBDEV_FORMAT_TRY)
 215                return v4l2_subdev_get_try_format(&isp->sd, cfg, pad);
 216        else
 217                return v4l2_subdev_get_try_format(&isp->sd, isp->pad_cfg, pad);
 218}
 219
 220static struct v4l2_rect *
 221rkisp1_isp_get_pad_crop(struct rkisp1_isp *isp,
 222                        struct v4l2_subdev_pad_config *cfg,
 223                        unsigned int pad, u32 which)
 224{
 225        if (which == V4L2_SUBDEV_FORMAT_TRY)
 226                return v4l2_subdev_get_try_crop(&isp->sd, cfg, pad);
 227        else
 228                return v4l2_subdev_get_try_crop(&isp->sd, isp->pad_cfg, pad);
 229}
 230
 231/* ----------------------------------------------------------------------------
 232 * Camera Interface registers configurations
 233 */
 234
 235/*
 236 * Image Stabilization.
 237 * This should only be called when configuring CIF
 238 * or at the frame end interrupt
 239 */
 240static void rkisp1_config_ism(struct rkisp1_device *rkisp1)
 241{
 242        struct v4l2_rect *src_crop =
 243                rkisp1_isp_get_pad_crop(&rkisp1->isp, NULL,
 244                                        RKISP1_ISP_PAD_SOURCE_VIDEO,
 245                                        V4L2_SUBDEV_FORMAT_ACTIVE);
 246        u32 val;
 247
 248        rkisp1_write(rkisp1, 0, RKISP1_CIF_ISP_IS_RECENTER);
 249        rkisp1_write(rkisp1, 0, RKISP1_CIF_ISP_IS_MAX_DX);
 250        rkisp1_write(rkisp1, 0, RKISP1_CIF_ISP_IS_MAX_DY);
 251        rkisp1_write(rkisp1, 0, RKISP1_CIF_ISP_IS_DISPLACE);
 252        rkisp1_write(rkisp1, src_crop->left, RKISP1_CIF_ISP_IS_H_OFFS);
 253        rkisp1_write(rkisp1, src_crop->top, RKISP1_CIF_ISP_IS_V_OFFS);
 254        rkisp1_write(rkisp1, src_crop->width, RKISP1_CIF_ISP_IS_H_SIZE);
 255        rkisp1_write(rkisp1, src_crop->height, RKISP1_CIF_ISP_IS_V_SIZE);
 256
 257        /* IS(Image Stabilization) is always on, working as output crop */
 258        rkisp1_write(rkisp1, 1, RKISP1_CIF_ISP_IS_CTRL);
 259        val = rkisp1_read(rkisp1, RKISP1_CIF_ISP_CTRL);
 260        val |= RKISP1_CIF_ISP_CTRL_ISP_CFG_UPD;
 261        rkisp1_write(rkisp1, val, RKISP1_CIF_ISP_CTRL);
 262}
 263
 264/*
 265 * configure ISP blocks with input format, size......
 266 */
 267static int rkisp1_config_isp(struct rkisp1_device *rkisp1)
 268{
 269        u32 isp_ctrl = 0, irq_mask = 0, acq_mult = 0, signal = 0;
 270        const struct rkisp1_isp_mbus_info *src_fmt, *sink_fmt;
 271        struct rkisp1_sensor_async *sensor;
 272        struct v4l2_mbus_framefmt *sink_frm;
 273        struct v4l2_rect *sink_crop;
 274
 275        sensor = rkisp1->active_sensor;
 276        sink_fmt = rkisp1->isp.sink_fmt;
 277        src_fmt = rkisp1->isp.src_fmt;
 278        sink_frm = rkisp1_isp_get_pad_fmt(&rkisp1->isp, NULL,
 279                                          RKISP1_ISP_PAD_SINK_VIDEO,
 280                                          V4L2_SUBDEV_FORMAT_ACTIVE);
 281        sink_crop = rkisp1_isp_get_pad_crop(&rkisp1->isp, NULL,
 282                                            RKISP1_ISP_PAD_SINK_VIDEO,
 283                                            V4L2_SUBDEV_FORMAT_ACTIVE);
 284
 285        if (sink_fmt->pixel_enc == V4L2_PIXEL_ENC_BAYER) {
 286                acq_mult = 1;
 287                if (src_fmt->pixel_enc == V4L2_PIXEL_ENC_BAYER) {
 288                        if (sensor->mbus_type == V4L2_MBUS_BT656)
 289                                isp_ctrl = RKISP1_CIF_ISP_CTRL_ISP_MODE_RAW_PICT_ITU656;
 290                        else
 291                                isp_ctrl = RKISP1_CIF_ISP_CTRL_ISP_MODE_RAW_PICT;
 292                } else {
 293                        rkisp1_write(rkisp1, RKISP1_CIF_ISP_DEMOSAIC_TH(0xc),
 294                                     RKISP1_CIF_ISP_DEMOSAIC);
 295
 296                        if (sensor->mbus_type == V4L2_MBUS_BT656)
 297                                isp_ctrl = RKISP1_CIF_ISP_CTRL_ISP_MODE_BAYER_ITU656;
 298                        else
 299                                isp_ctrl = RKISP1_CIF_ISP_CTRL_ISP_MODE_BAYER_ITU601;
 300                }
 301        } else if (sink_fmt->pixel_enc == V4L2_PIXEL_ENC_YUV) {
 302                acq_mult = 2;
 303                if (sensor->mbus_type == V4L2_MBUS_CSI2_DPHY) {
 304                        isp_ctrl = RKISP1_CIF_ISP_CTRL_ISP_MODE_ITU601;
 305                } else {
 306                        if (sensor->mbus_type == V4L2_MBUS_BT656)
 307                                isp_ctrl = RKISP1_CIF_ISP_CTRL_ISP_MODE_ITU656;
 308                        else
 309                                isp_ctrl = RKISP1_CIF_ISP_CTRL_ISP_MODE_ITU601;
 310                }
 311
 312                irq_mask |= RKISP1_CIF_ISP_DATA_LOSS;
 313        }
 314
 315        /* Set up input acquisition properties */
 316        if (sensor->mbus_type == V4L2_MBUS_BT656 ||
 317            sensor->mbus_type == V4L2_MBUS_PARALLEL) {
 318                if (sensor->mbus_flags & V4L2_MBUS_PCLK_SAMPLE_RISING)
 319                        signal = RKISP1_CIF_ISP_ACQ_PROP_POS_EDGE;
 320        }
 321
 322        if (sensor->mbus_type == V4L2_MBUS_PARALLEL) {
 323                if (sensor->mbus_flags & V4L2_MBUS_VSYNC_ACTIVE_LOW)
 324                        signal |= RKISP1_CIF_ISP_ACQ_PROP_VSYNC_LOW;
 325
 326                if (sensor->mbus_flags & V4L2_MBUS_HSYNC_ACTIVE_LOW)
 327                        signal |= RKISP1_CIF_ISP_ACQ_PROP_HSYNC_LOW;
 328        }
 329
 330        rkisp1_write(rkisp1, isp_ctrl, RKISP1_CIF_ISP_CTRL);
 331        rkisp1_write(rkisp1, signal | sink_fmt->yuv_seq |
 332                     RKISP1_CIF_ISP_ACQ_PROP_BAYER_PAT(sink_fmt->bayer_pat) |
 333                     RKISP1_CIF_ISP_ACQ_PROP_FIELD_SEL_ALL,
 334                     RKISP1_CIF_ISP_ACQ_PROP);
 335        rkisp1_write(rkisp1, 0, RKISP1_CIF_ISP_ACQ_NR_FRAMES);
 336
 337        /* Acquisition Size */
 338        rkisp1_write(rkisp1, 0, RKISP1_CIF_ISP_ACQ_H_OFFS);
 339        rkisp1_write(rkisp1, 0, RKISP1_CIF_ISP_ACQ_V_OFFS);
 340        rkisp1_write(rkisp1,
 341                     acq_mult * sink_frm->width, RKISP1_CIF_ISP_ACQ_H_SIZE);
 342        rkisp1_write(rkisp1, sink_frm->height, RKISP1_CIF_ISP_ACQ_V_SIZE);
 343
 344        /* ISP Out Area */
 345        rkisp1_write(rkisp1, sink_crop->left, RKISP1_CIF_ISP_OUT_H_OFFS);
 346        rkisp1_write(rkisp1, sink_crop->top, RKISP1_CIF_ISP_OUT_V_OFFS);
 347        rkisp1_write(rkisp1, sink_crop->width, RKISP1_CIF_ISP_OUT_H_SIZE);
 348        rkisp1_write(rkisp1, sink_crop->height, RKISP1_CIF_ISP_OUT_V_SIZE);
 349
 350        irq_mask |= RKISP1_CIF_ISP_FRAME | RKISP1_CIF_ISP_V_START |
 351                    RKISP1_CIF_ISP_PIC_SIZE_ERROR;
 352        rkisp1_write(rkisp1, irq_mask, RKISP1_CIF_ISP_IMSC);
 353
 354        if (src_fmt->pixel_enc == V4L2_PIXEL_ENC_BAYER) {
 355                rkisp1_params_disable(&rkisp1->params);
 356        } else {
 357                struct v4l2_mbus_framefmt *src_frm;
 358
 359                src_frm = rkisp1_isp_get_pad_fmt(&rkisp1->isp, NULL,
 360                                                 RKISP1_ISP_PAD_SINK_VIDEO,
 361                                                 V4L2_SUBDEV_FORMAT_ACTIVE);
 362                rkisp1_params_configure(&rkisp1->params, sink_fmt->bayer_pat,
 363                                        src_frm->quantization);
 364        }
 365
 366        return 0;
 367}
 368
 369static int rkisp1_config_dvp(struct rkisp1_device *rkisp1)
 370{
 371        const struct rkisp1_isp_mbus_info *sink_fmt = rkisp1->isp.sink_fmt;
 372        u32 val, input_sel;
 373
 374        switch (sink_fmt->bus_width) {
 375        case 8:
 376                input_sel = RKISP1_CIF_ISP_ACQ_PROP_IN_SEL_8B_ZERO;
 377                break;
 378        case 10:
 379                input_sel = RKISP1_CIF_ISP_ACQ_PROP_IN_SEL_10B_ZERO;
 380                break;
 381        case 12:
 382                input_sel = RKISP1_CIF_ISP_ACQ_PROP_IN_SEL_12B;
 383                break;
 384        default:
 385                dev_err(rkisp1->dev, "Invalid bus width\n");
 386                return -EINVAL;
 387        }
 388
 389        val = rkisp1_read(rkisp1, RKISP1_CIF_ISP_ACQ_PROP);
 390        rkisp1_write(rkisp1, val | input_sel, RKISP1_CIF_ISP_ACQ_PROP);
 391
 392        return 0;
 393}
 394
 395static int rkisp1_config_mipi(struct rkisp1_device *rkisp1)
 396{
 397        const struct rkisp1_isp_mbus_info *sink_fmt = rkisp1->isp.sink_fmt;
 398        unsigned int lanes = rkisp1->active_sensor->lanes;
 399        u32 mipi_ctrl;
 400
 401        if (lanes < 1 || lanes > 4)
 402                return -EINVAL;
 403
 404        mipi_ctrl = RKISP1_CIF_MIPI_CTRL_NUM_LANES(lanes - 1) |
 405                    RKISP1_CIF_MIPI_CTRL_SHUTDOWNLANES(0xf) |
 406                    RKISP1_CIF_MIPI_CTRL_ERR_SOT_SYNC_HS_SKIP |
 407                    RKISP1_CIF_MIPI_CTRL_CLOCKLANE_ENA;
 408
 409        rkisp1_write(rkisp1, mipi_ctrl, RKISP1_CIF_MIPI_CTRL);
 410
 411        /* Configure Data Type and Virtual Channel */
 412        rkisp1_write(rkisp1,
 413                     RKISP1_CIF_MIPI_DATA_SEL_DT(sink_fmt->mipi_dt) |
 414                     RKISP1_CIF_MIPI_DATA_SEL_VC(0),
 415                     RKISP1_CIF_MIPI_IMG_DATA_SEL);
 416
 417        /* Clear MIPI interrupts */
 418        rkisp1_write(rkisp1, ~0, RKISP1_CIF_MIPI_ICR);
 419        /*
 420         * Disable RKISP1_CIF_MIPI_ERR_DPHY interrupt here temporary for
 421         * isp bus may be dead when switch isp.
 422         */
 423        rkisp1_write(rkisp1,
 424                     RKISP1_CIF_MIPI_FRAME_END | RKISP1_CIF_MIPI_ERR_CSI |
 425                     RKISP1_CIF_MIPI_ERR_DPHY |
 426                     RKISP1_CIF_MIPI_SYNC_FIFO_OVFLW(0x03) |
 427                     RKISP1_CIF_MIPI_ADD_DATA_OVFLW,
 428                     RKISP1_CIF_MIPI_IMSC);
 429
 430        dev_dbg(rkisp1->dev, "\n  MIPI_CTRL 0x%08x\n"
 431                "  MIPI_IMG_DATA_SEL 0x%08x\n"
 432                "  MIPI_STATUS 0x%08x\n"
 433                "  MIPI_IMSC 0x%08x\n",
 434                rkisp1_read(rkisp1, RKISP1_CIF_MIPI_CTRL),
 435                rkisp1_read(rkisp1, RKISP1_CIF_MIPI_IMG_DATA_SEL),
 436                rkisp1_read(rkisp1, RKISP1_CIF_MIPI_STATUS),
 437                rkisp1_read(rkisp1, RKISP1_CIF_MIPI_IMSC));
 438
 439        return 0;
 440}
 441
 442/* Configure MUX */
 443static int rkisp1_config_path(struct rkisp1_device *rkisp1)
 444{
 445        struct rkisp1_sensor_async *sensor = rkisp1->active_sensor;
 446        u32 dpcl = rkisp1_read(rkisp1, RKISP1_CIF_VI_DPCL);
 447        int ret = 0;
 448
 449        if (sensor->mbus_type == V4L2_MBUS_BT656 ||
 450            sensor->mbus_type == V4L2_MBUS_PARALLEL) {
 451                ret = rkisp1_config_dvp(rkisp1);
 452                dpcl |= RKISP1_CIF_VI_DPCL_IF_SEL_PARALLEL;
 453        } else if (sensor->mbus_type == V4L2_MBUS_CSI2_DPHY) {
 454                ret = rkisp1_config_mipi(rkisp1);
 455                dpcl |= RKISP1_CIF_VI_DPCL_IF_SEL_MIPI;
 456        }
 457
 458        rkisp1_write(rkisp1, dpcl, RKISP1_CIF_VI_DPCL);
 459
 460        return ret;
 461}
 462
 463/* Hardware configure Entry */
 464static int rkisp1_config_cif(struct rkisp1_device *rkisp1)
 465{
 466        u32 cif_id;
 467        int ret;
 468
 469        cif_id = rkisp1_read(rkisp1, RKISP1_CIF_VI_ID);
 470        dev_dbg(rkisp1->dev, "CIF_ID 0x%08x\n", cif_id);
 471
 472        ret = rkisp1_config_isp(rkisp1);
 473        if (ret)
 474                return ret;
 475        ret = rkisp1_config_path(rkisp1);
 476        if (ret)
 477                return ret;
 478        rkisp1_config_ism(rkisp1);
 479
 480        return 0;
 481}
 482
 483static void rkisp1_isp_stop(struct rkisp1_device *rkisp1)
 484{
 485        u32 val;
 486
 487        /*
 488         * ISP(mi) stop in mi frame end -> Stop ISP(mipi) ->
 489         * Stop ISP(isp) ->wait for ISP isp off
 490         */
 491        /* stop and clear MI, MIPI, and ISP interrupts */
 492        rkisp1_write(rkisp1, 0, RKISP1_CIF_MIPI_IMSC);
 493        rkisp1_write(rkisp1, ~0, RKISP1_CIF_MIPI_ICR);
 494
 495        rkisp1_write(rkisp1, 0, RKISP1_CIF_ISP_IMSC);
 496        rkisp1_write(rkisp1, ~0, RKISP1_CIF_ISP_ICR);
 497
 498        rkisp1_write(rkisp1, 0, RKISP1_CIF_MI_IMSC);
 499        rkisp1_write(rkisp1, ~0, RKISP1_CIF_MI_ICR);
 500        val = rkisp1_read(rkisp1, RKISP1_CIF_MIPI_CTRL);
 501        rkisp1_write(rkisp1, val & (~RKISP1_CIF_MIPI_CTRL_OUTPUT_ENA),
 502                     RKISP1_CIF_MIPI_CTRL);
 503        /* stop ISP */
 504        val = rkisp1_read(rkisp1, RKISP1_CIF_ISP_CTRL);
 505        val &= ~(RKISP1_CIF_ISP_CTRL_ISP_INFORM_ENABLE |
 506                 RKISP1_CIF_ISP_CTRL_ISP_ENABLE);
 507        rkisp1_write(rkisp1, val, RKISP1_CIF_ISP_CTRL);
 508
 509        val = rkisp1_read(rkisp1,       RKISP1_CIF_ISP_CTRL);
 510        rkisp1_write(rkisp1, val | RKISP1_CIF_ISP_CTRL_ISP_CFG_UPD,
 511                     RKISP1_CIF_ISP_CTRL);
 512
 513        readx_poll_timeout(readl, rkisp1->base_addr + RKISP1_CIF_ISP_RIS,
 514                           val, val & RKISP1_CIF_ISP_OFF, 20, 100);
 515        rkisp1_write(rkisp1,
 516                     RKISP1_CIF_IRCL_MIPI_SW_RST | RKISP1_CIF_IRCL_ISP_SW_RST,
 517                     RKISP1_CIF_IRCL);
 518        rkisp1_write(rkisp1, 0x0, RKISP1_CIF_IRCL);
 519}
 520
 521static void rkisp1_config_clk(struct rkisp1_device *rkisp1)
 522{
 523        u32 val = RKISP1_CIF_ICCL_ISP_CLK | RKISP1_CIF_ICCL_CP_CLK |
 524                  RKISP1_CIF_ICCL_MRSZ_CLK | RKISP1_CIF_ICCL_SRSZ_CLK |
 525                  RKISP1_CIF_ICCL_JPEG_CLK | RKISP1_CIF_ICCL_MI_CLK |
 526                  RKISP1_CIF_ICCL_IE_CLK | RKISP1_CIF_ICCL_MIPI_CLK |
 527                  RKISP1_CIF_ICCL_DCROP_CLK;
 528
 529        rkisp1_write(rkisp1, val, RKISP1_CIF_ICCL);
 530}
 531
 532static void rkisp1_isp_start(struct rkisp1_device *rkisp1)
 533{
 534        struct rkisp1_sensor_async *sensor = rkisp1->active_sensor;
 535        u32 val;
 536
 537        rkisp1_config_clk(rkisp1);
 538
 539        /* Activate MIPI */
 540        if (sensor->mbus_type == V4L2_MBUS_CSI2_DPHY) {
 541                val = rkisp1_read(rkisp1, RKISP1_CIF_MIPI_CTRL);
 542                rkisp1_write(rkisp1, val | RKISP1_CIF_MIPI_CTRL_OUTPUT_ENA,
 543                             RKISP1_CIF_MIPI_CTRL);
 544        }
 545        /* Activate ISP */
 546        val = rkisp1_read(rkisp1, RKISP1_CIF_ISP_CTRL);
 547        val |= RKISP1_CIF_ISP_CTRL_ISP_CFG_UPD |
 548               RKISP1_CIF_ISP_CTRL_ISP_ENABLE |
 549               RKISP1_CIF_ISP_CTRL_ISP_INFORM_ENABLE;
 550        rkisp1_write(rkisp1, val, RKISP1_CIF_ISP_CTRL);
 551
 552        /*
 553         * CIF spec says to wait for sufficient time after enabling
 554         * the MIPI interface and before starting the sensor output.
 555         */
 556        usleep_range(1000, 1200);
 557}
 558
 559/* ----------------------------------------------------------------------------
 560 * Subdev pad operations
 561 */
 562
 563static int rkisp1_isp_enum_mbus_code(struct v4l2_subdev *sd,
 564                                     struct v4l2_subdev_pad_config *cfg,
 565                                     struct v4l2_subdev_mbus_code_enum *code)
 566{
 567        unsigned int i, dir;
 568        int pos = 0;
 569
 570        if (code->pad == RKISP1_ISP_PAD_SINK_VIDEO) {
 571                dir = RKISP1_ISP_SD_SINK;
 572        } else if (code->pad == RKISP1_ISP_PAD_SOURCE_VIDEO) {
 573                dir = RKISP1_ISP_SD_SRC;
 574        } else {
 575                if (code->index > 0)
 576                        return -EINVAL;
 577                code->code = MEDIA_BUS_FMT_FIXED;
 578                return 0;
 579        }
 580
 581        if (code->index >= ARRAY_SIZE(rkisp1_isp_formats))
 582                return -EINVAL;
 583
 584        for (i = 0; i < ARRAY_SIZE(rkisp1_isp_formats); i++) {
 585                const struct rkisp1_isp_mbus_info *fmt = &rkisp1_isp_formats[i];
 586
 587                if (fmt->direction & dir)
 588                        pos++;
 589
 590                if (code->index == pos - 1) {
 591                        code->code = fmt->mbus_code;
 592                        if (fmt->pixel_enc == V4L2_PIXEL_ENC_YUV &&
 593                            dir == RKISP1_ISP_SD_SRC)
 594                                code->flags =
 595                                        V4L2_SUBDEV_MBUS_CODE_CSC_QUANTIZATION;
 596                        return 0;
 597                }
 598        }
 599
 600        return -EINVAL;
 601}
 602
 603static int rkisp1_isp_init_config(struct v4l2_subdev *sd,
 604                                  struct v4l2_subdev_pad_config *cfg)
 605{
 606        struct v4l2_mbus_framefmt *sink_fmt, *src_fmt;
 607        struct v4l2_rect *sink_crop, *src_crop;
 608
 609        sink_fmt = v4l2_subdev_get_try_format(sd, cfg,
 610                                              RKISP1_ISP_PAD_SINK_VIDEO);
 611        sink_fmt->width = RKISP1_DEFAULT_WIDTH;
 612        sink_fmt->height = RKISP1_DEFAULT_HEIGHT;
 613        sink_fmt->field = V4L2_FIELD_NONE;
 614        sink_fmt->code = RKISP1_DEF_SINK_PAD_FMT;
 615
 616        sink_crop = v4l2_subdev_get_try_crop(sd, cfg,
 617                                             RKISP1_ISP_PAD_SINK_VIDEO);
 618        sink_crop->width = RKISP1_DEFAULT_WIDTH;
 619        sink_crop->height = RKISP1_DEFAULT_HEIGHT;
 620        sink_crop->left = 0;
 621        sink_crop->top = 0;
 622
 623        src_fmt = v4l2_subdev_get_try_format(sd, cfg,
 624                                             RKISP1_ISP_PAD_SOURCE_VIDEO);
 625        *src_fmt = *sink_fmt;
 626        src_fmt->code = RKISP1_DEF_SRC_PAD_FMT;
 627
 628        src_crop = v4l2_subdev_get_try_crop(sd, cfg,
 629                                            RKISP1_ISP_PAD_SOURCE_VIDEO);
 630        *src_crop = *sink_crop;
 631
 632        sink_fmt = v4l2_subdev_get_try_format(sd, cfg,
 633                                              RKISP1_ISP_PAD_SINK_PARAMS);
 634        src_fmt = v4l2_subdev_get_try_format(sd, cfg,
 635                                             RKISP1_ISP_PAD_SOURCE_STATS);
 636        sink_fmt->width = RKISP1_DEFAULT_WIDTH;
 637        sink_fmt->height = RKISP1_DEFAULT_HEIGHT;
 638        sink_fmt->field = V4L2_FIELD_NONE;
 639        sink_fmt->code = MEDIA_BUS_FMT_FIXED;
 640        *src_fmt = *sink_fmt;
 641
 642        return 0;
 643}
 644
 645static void rkisp1_isp_set_src_fmt(struct rkisp1_isp *isp,
 646                                   struct v4l2_subdev_pad_config *cfg,
 647                                   struct v4l2_mbus_framefmt *format,
 648                                   unsigned int which)
 649{
 650        const struct rkisp1_isp_mbus_info *mbus_info;
 651        struct v4l2_mbus_framefmt *src_fmt;
 652        const struct v4l2_rect *src_crop;
 653
 654        src_fmt = rkisp1_isp_get_pad_fmt(isp, cfg,
 655                                         RKISP1_ISP_PAD_SOURCE_VIDEO, which);
 656        src_crop = rkisp1_isp_get_pad_crop(isp, cfg,
 657                                           RKISP1_ISP_PAD_SOURCE_VIDEO, which);
 658
 659        src_fmt->code = format->code;
 660        mbus_info = rkisp1_isp_mbus_info_get(src_fmt->code);
 661        if (!mbus_info || !(mbus_info->direction & RKISP1_ISP_SD_SRC)) {
 662                src_fmt->code = RKISP1_DEF_SRC_PAD_FMT;
 663                mbus_info = rkisp1_isp_mbus_info_get(src_fmt->code);
 664        }
 665        if (which == V4L2_SUBDEV_FORMAT_ACTIVE)
 666                isp->src_fmt = mbus_info;
 667        src_fmt->width  = src_crop->width;
 668        src_fmt->height = src_crop->height;
 669
 670        /*
 671         * The CSC API is used to allow userspace to force full
 672         * quantization on YUV formats.
 673         */
 674        if (format->flags & V4L2_MBUS_FRAMEFMT_SET_CSC &&
 675            format->quantization == V4L2_QUANTIZATION_FULL_RANGE &&
 676            mbus_info->pixel_enc == V4L2_PIXEL_ENC_YUV)
 677                src_fmt->quantization = V4L2_QUANTIZATION_FULL_RANGE;
 678        else if (mbus_info->pixel_enc == V4L2_PIXEL_ENC_YUV)
 679                src_fmt->quantization = V4L2_QUANTIZATION_LIM_RANGE;
 680        else
 681                src_fmt->quantization = V4L2_QUANTIZATION_FULL_RANGE;
 682
 683        *format = *src_fmt;
 684}
 685
 686static void rkisp1_isp_set_src_crop(struct rkisp1_isp *isp,
 687                                    struct v4l2_subdev_pad_config *cfg,
 688                                    struct v4l2_rect *r, unsigned int which)
 689{
 690        struct v4l2_mbus_framefmt *src_fmt;
 691        const struct v4l2_rect *sink_crop;
 692        struct v4l2_rect *src_crop;
 693
 694        src_crop = rkisp1_isp_get_pad_crop(isp, cfg,
 695                                           RKISP1_ISP_PAD_SOURCE_VIDEO,
 696                                           which);
 697        sink_crop = rkisp1_isp_get_pad_crop(isp, cfg,
 698                                            RKISP1_ISP_PAD_SINK_VIDEO,
 699                                            which);
 700
 701        src_crop->left = ALIGN(r->left, 2);
 702        src_crop->width = ALIGN(r->width, 2);
 703        src_crop->top = r->top;
 704        src_crop->height = r->height;
 705        rkisp1_sd_adjust_crop_rect(src_crop, sink_crop);
 706
 707        *r = *src_crop;
 708
 709        /* Propagate to out format */
 710        src_fmt = rkisp1_isp_get_pad_fmt(isp, cfg,
 711                                         RKISP1_ISP_PAD_SOURCE_VIDEO, which);
 712        rkisp1_isp_set_src_fmt(isp, cfg, src_fmt, which);
 713}
 714
 715static void rkisp1_isp_set_sink_crop(struct rkisp1_isp *isp,
 716                                     struct v4l2_subdev_pad_config *cfg,
 717                                     struct v4l2_rect *r, unsigned int which)
 718{
 719        struct v4l2_rect *sink_crop, *src_crop;
 720        struct v4l2_mbus_framefmt *sink_fmt;
 721
 722        sink_crop = rkisp1_isp_get_pad_crop(isp, cfg, RKISP1_ISP_PAD_SINK_VIDEO,
 723                                            which);
 724        sink_fmt = rkisp1_isp_get_pad_fmt(isp, cfg, RKISP1_ISP_PAD_SINK_VIDEO,
 725                                          which);
 726
 727        sink_crop->left = ALIGN(r->left, 2);
 728        sink_crop->width = ALIGN(r->width, 2);
 729        sink_crop->top = r->top;
 730        sink_crop->height = r->height;
 731        rkisp1_sd_adjust_crop(sink_crop, sink_fmt);
 732
 733        *r = *sink_crop;
 734
 735        /* Propagate to out crop */
 736        src_crop = rkisp1_isp_get_pad_crop(isp, cfg,
 737                                           RKISP1_ISP_PAD_SOURCE_VIDEO, which);
 738        rkisp1_isp_set_src_crop(isp, cfg, src_crop, which);
 739}
 740
 741static void rkisp1_isp_set_sink_fmt(struct rkisp1_isp *isp,
 742                                    struct v4l2_subdev_pad_config *cfg,
 743                                    struct v4l2_mbus_framefmt *format,
 744                                    unsigned int which)
 745{
 746        const struct rkisp1_isp_mbus_info *mbus_info;
 747        struct v4l2_mbus_framefmt *sink_fmt;
 748        struct v4l2_rect *sink_crop;
 749
 750        sink_fmt = rkisp1_isp_get_pad_fmt(isp, cfg, RKISP1_ISP_PAD_SINK_VIDEO,
 751                                          which);
 752        sink_fmt->code = format->code;
 753        mbus_info = rkisp1_isp_mbus_info_get(sink_fmt->code);
 754        if (!mbus_info || !(mbus_info->direction & RKISP1_ISP_SD_SINK)) {
 755                sink_fmt->code = RKISP1_DEF_SINK_PAD_FMT;
 756                mbus_info = rkisp1_isp_mbus_info_get(sink_fmt->code);
 757        }
 758        if (which == V4L2_SUBDEV_FORMAT_ACTIVE)
 759                isp->sink_fmt = mbus_info;
 760
 761        sink_fmt->width = clamp_t(u32, format->width,
 762                                  RKISP1_ISP_MIN_WIDTH,
 763                                  RKISP1_ISP_MAX_WIDTH);
 764        sink_fmt->height = clamp_t(u32, format->height,
 765                                   RKISP1_ISP_MIN_HEIGHT,
 766                                   RKISP1_ISP_MAX_HEIGHT);
 767
 768        *format = *sink_fmt;
 769
 770        /* Propagate to in crop */
 771        sink_crop = rkisp1_isp_get_pad_crop(isp, cfg, RKISP1_ISP_PAD_SINK_VIDEO,
 772                                            which);
 773        rkisp1_isp_set_sink_crop(isp, cfg, sink_crop, which);
 774}
 775
 776static int rkisp1_isp_get_fmt(struct v4l2_subdev *sd,
 777                              struct v4l2_subdev_pad_config *cfg,
 778                              struct v4l2_subdev_format *fmt)
 779{
 780        struct rkisp1_isp *isp = container_of(sd, struct rkisp1_isp, sd);
 781
 782        mutex_lock(&isp->ops_lock);
 783        fmt->format = *rkisp1_isp_get_pad_fmt(isp, cfg, fmt->pad, fmt->which);
 784        mutex_unlock(&isp->ops_lock);
 785        return 0;
 786}
 787
 788static int rkisp1_isp_set_fmt(struct v4l2_subdev *sd,
 789                              struct v4l2_subdev_pad_config *cfg,
 790                              struct v4l2_subdev_format *fmt)
 791{
 792        struct rkisp1_isp *isp = container_of(sd, struct rkisp1_isp, sd);
 793
 794        mutex_lock(&isp->ops_lock);
 795        if (fmt->pad == RKISP1_ISP_PAD_SINK_VIDEO)
 796                rkisp1_isp_set_sink_fmt(isp, cfg, &fmt->format, fmt->which);
 797        else if (fmt->pad == RKISP1_ISP_PAD_SOURCE_VIDEO)
 798                rkisp1_isp_set_src_fmt(isp, cfg, &fmt->format, fmt->which);
 799        else
 800                fmt->format = *rkisp1_isp_get_pad_fmt(isp, cfg, fmt->pad,
 801                                                      fmt->which);
 802
 803        mutex_unlock(&isp->ops_lock);
 804        return 0;
 805}
 806
 807static int rkisp1_isp_get_selection(struct v4l2_subdev *sd,
 808                                    struct v4l2_subdev_pad_config *cfg,
 809                                    struct v4l2_subdev_selection *sel)
 810{
 811        struct rkisp1_isp *isp = container_of(sd, struct rkisp1_isp, sd);
 812        int ret = 0;
 813
 814        if (sel->pad != RKISP1_ISP_PAD_SOURCE_VIDEO &&
 815            sel->pad != RKISP1_ISP_PAD_SINK_VIDEO)
 816                return -EINVAL;
 817
 818        mutex_lock(&isp->ops_lock);
 819        switch (sel->target) {
 820        case V4L2_SEL_TGT_CROP_BOUNDS:
 821                if (sel->pad == RKISP1_ISP_PAD_SINK_VIDEO) {
 822                        struct v4l2_mbus_framefmt *fmt;
 823
 824                        fmt = rkisp1_isp_get_pad_fmt(isp, cfg, sel->pad,
 825                                                     sel->which);
 826                        sel->r.height = fmt->height;
 827                        sel->r.width = fmt->width;
 828                        sel->r.left = 0;
 829                        sel->r.top = 0;
 830                } else {
 831                        sel->r = *rkisp1_isp_get_pad_crop(isp, cfg,
 832                                                RKISP1_ISP_PAD_SINK_VIDEO,
 833                                                sel->which);
 834                }
 835                break;
 836        case V4L2_SEL_TGT_CROP:
 837                sel->r = *rkisp1_isp_get_pad_crop(isp, cfg, sel->pad,
 838                                                  sel->which);
 839                break;
 840        default:
 841                ret = -EINVAL;
 842        }
 843        mutex_unlock(&isp->ops_lock);
 844        return ret;
 845}
 846
 847static int rkisp1_isp_set_selection(struct v4l2_subdev *sd,
 848                                    struct v4l2_subdev_pad_config *cfg,
 849                                    struct v4l2_subdev_selection *sel)
 850{
 851        struct rkisp1_device *rkisp1 =
 852                container_of(sd->v4l2_dev, struct rkisp1_device, v4l2_dev);
 853        struct rkisp1_isp *isp = container_of(sd, struct rkisp1_isp, sd);
 854        int ret = 0;
 855
 856        if (sel->target != V4L2_SEL_TGT_CROP)
 857                return -EINVAL;
 858
 859        dev_dbg(rkisp1->dev, "%s: pad: %d sel(%d,%d)/%dx%d\n", __func__,
 860                sel->pad, sel->r.left, sel->r.top, sel->r.width, sel->r.height);
 861        mutex_lock(&isp->ops_lock);
 862        if (sel->pad == RKISP1_ISP_PAD_SINK_VIDEO)
 863                rkisp1_isp_set_sink_crop(isp, cfg, &sel->r, sel->which);
 864        else if (sel->pad == RKISP1_ISP_PAD_SOURCE_VIDEO)
 865                rkisp1_isp_set_src_crop(isp, cfg, &sel->r, sel->which);
 866        else
 867                ret = -EINVAL;
 868
 869        mutex_unlock(&isp->ops_lock);
 870        return ret;
 871}
 872
 873static int rkisp1_subdev_link_validate(struct media_link *link)
 874{
 875        if (link->sink->index == RKISP1_ISP_PAD_SINK_PARAMS)
 876                return 0;
 877
 878        return v4l2_subdev_link_validate(link);
 879}
 880
 881static const struct v4l2_subdev_pad_ops rkisp1_isp_pad_ops = {
 882        .enum_mbus_code = rkisp1_isp_enum_mbus_code,
 883        .get_selection = rkisp1_isp_get_selection,
 884        .set_selection = rkisp1_isp_set_selection,
 885        .init_cfg = rkisp1_isp_init_config,
 886        .get_fmt = rkisp1_isp_get_fmt,
 887        .set_fmt = rkisp1_isp_set_fmt,
 888        .link_validate = v4l2_subdev_link_validate_default,
 889};
 890
 891/* ----------------------------------------------------------------------------
 892 * Stream operations
 893 */
 894
 895static int rkisp1_mipi_csi2_start(struct rkisp1_isp *isp,
 896                                  struct rkisp1_sensor_async *sensor)
 897{
 898        struct rkisp1_device *rkisp1 =
 899                container_of(isp->sd.v4l2_dev, struct rkisp1_device, v4l2_dev);
 900        union phy_configure_opts opts;
 901        struct phy_configure_opts_mipi_dphy *cfg = &opts.mipi_dphy;
 902        s64 pixel_clock;
 903
 904        if (!sensor->pixel_rate_ctrl) {
 905                dev_warn(rkisp1->dev, "No pixel rate control in sensor subdev\n");
 906                return -EPIPE;
 907        }
 908
 909        pixel_clock = v4l2_ctrl_g_ctrl_int64(sensor->pixel_rate_ctrl);
 910        if (!pixel_clock) {
 911                dev_err(rkisp1->dev, "Invalid pixel rate value\n");
 912                return -EINVAL;
 913        }
 914
 915        phy_mipi_dphy_get_default_config(pixel_clock, isp->sink_fmt->bus_width,
 916                                         sensor->lanes, cfg);
 917        phy_set_mode(sensor->dphy, PHY_MODE_MIPI_DPHY);
 918        phy_configure(sensor->dphy, &opts);
 919        phy_power_on(sensor->dphy);
 920
 921        return 0;
 922}
 923
 924static void rkisp1_mipi_csi2_stop(struct rkisp1_sensor_async *sensor)
 925{
 926        phy_power_off(sensor->dphy);
 927}
 928
 929static int rkisp1_isp_s_stream(struct v4l2_subdev *sd, int enable)
 930{
 931        struct rkisp1_device *rkisp1 =
 932                container_of(sd->v4l2_dev, struct rkisp1_device, v4l2_dev);
 933        struct rkisp1_isp *isp = &rkisp1->isp;
 934        struct v4l2_subdev *sensor_sd;
 935        int ret = 0;
 936
 937        if (!enable) {
 938                rkisp1_isp_stop(rkisp1);
 939                rkisp1_mipi_csi2_stop(rkisp1->active_sensor);
 940                return 0;
 941        }
 942
 943        sensor_sd = rkisp1_get_remote_sensor(sd);
 944        if (!sensor_sd) {
 945                dev_warn(rkisp1->dev, "No link between isp and sensor\n");
 946                return -ENODEV;
 947        }
 948
 949        rkisp1->active_sensor = container_of(sensor_sd->asd,
 950                                             struct rkisp1_sensor_async, asd);
 951
 952        if (rkisp1->active_sensor->mbus_type != V4L2_MBUS_CSI2_DPHY)
 953                return -EINVAL;
 954
 955        rkisp1->isp.frame_sequence = -1;
 956        mutex_lock(&isp->ops_lock);
 957        ret = rkisp1_config_cif(rkisp1);
 958        if (ret)
 959                goto mutex_unlock;
 960
 961        ret = rkisp1_mipi_csi2_start(&rkisp1->isp, rkisp1->active_sensor);
 962        if (ret)
 963                goto mutex_unlock;
 964
 965        rkisp1_isp_start(rkisp1);
 966
 967mutex_unlock:
 968        mutex_unlock(&isp->ops_lock);
 969        return ret;
 970}
 971
 972static int rkisp1_isp_subs_evt(struct v4l2_subdev *sd, struct v4l2_fh *fh,
 973                               struct v4l2_event_subscription *sub)
 974{
 975        if (sub->type != V4L2_EVENT_FRAME_SYNC)
 976                return -EINVAL;
 977
 978        /* V4L2_EVENT_FRAME_SYNC doesn't require an id, so zero should be set */
 979        if (sub->id != 0)
 980                return -EINVAL;
 981
 982        return v4l2_event_subscribe(fh, sub, 0, NULL);
 983}
 984
 985static const struct media_entity_operations rkisp1_isp_media_ops = {
 986        .link_validate = rkisp1_subdev_link_validate,
 987};
 988
 989static const struct v4l2_subdev_video_ops rkisp1_isp_video_ops = {
 990        .s_stream = rkisp1_isp_s_stream,
 991};
 992
 993static const struct v4l2_subdev_core_ops rkisp1_isp_core_ops = {
 994        .subscribe_event = rkisp1_isp_subs_evt,
 995        .unsubscribe_event = v4l2_event_subdev_unsubscribe,
 996};
 997
 998static const struct v4l2_subdev_ops rkisp1_isp_ops = {
 999        .core = &rkisp1_isp_core_ops,
1000        .video = &rkisp1_isp_video_ops,
1001        .pad = &rkisp1_isp_pad_ops,
1002};
1003
1004int rkisp1_isp_register(struct rkisp1_device *rkisp1)
1005{
1006        struct rkisp1_isp *isp = &rkisp1->isp;
1007        struct media_pad *pads = isp->pads;
1008        struct v4l2_subdev *sd = &isp->sd;
1009        int ret;
1010
1011        v4l2_subdev_init(sd, &rkisp1_isp_ops);
1012        sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | V4L2_SUBDEV_FL_HAS_EVENTS;
1013        sd->entity.ops = &rkisp1_isp_media_ops;
1014        sd->entity.function = MEDIA_ENT_F_PROC_VIDEO_PIXEL_FORMATTER;
1015        sd->owner = THIS_MODULE;
1016        strscpy(sd->name, RKISP1_ISP_DEV_NAME, sizeof(sd->name));
1017
1018        pads[RKISP1_ISP_PAD_SINK_VIDEO].flags = MEDIA_PAD_FL_SINK |
1019                                                MEDIA_PAD_FL_MUST_CONNECT;
1020        pads[RKISP1_ISP_PAD_SINK_PARAMS].flags = MEDIA_PAD_FL_SINK;
1021        pads[RKISP1_ISP_PAD_SOURCE_VIDEO].flags = MEDIA_PAD_FL_SOURCE;
1022        pads[RKISP1_ISP_PAD_SOURCE_STATS].flags = MEDIA_PAD_FL_SOURCE;
1023
1024        isp->sink_fmt = rkisp1_isp_mbus_info_get(RKISP1_DEF_SINK_PAD_FMT);
1025        isp->src_fmt = rkisp1_isp_mbus_info_get(RKISP1_DEF_SRC_PAD_FMT);
1026
1027        mutex_init(&isp->ops_lock);
1028        ret = media_entity_pads_init(&sd->entity, RKISP1_ISP_PAD_MAX, pads);
1029        if (ret)
1030                return ret;
1031
1032        ret = v4l2_device_register_subdev(&rkisp1->v4l2_dev, sd);
1033        if (ret) {
1034                dev_err(rkisp1->dev, "Failed to register isp subdev\n");
1035                goto err_cleanup_media_entity;
1036        }
1037
1038        rkisp1_isp_init_config(sd, rkisp1->isp.pad_cfg);
1039        return 0;
1040
1041err_cleanup_media_entity:
1042        media_entity_cleanup(&sd->entity);
1043
1044        return ret;
1045}
1046
1047void rkisp1_isp_unregister(struct rkisp1_device *rkisp1)
1048{
1049        struct v4l2_subdev *sd = &rkisp1->isp.sd;
1050
1051        v4l2_device_unregister_subdev(sd);
1052        media_entity_cleanup(&sd->entity);
1053}
1054
1055/* ----------------------------------------------------------------------------
1056 * Interrupt handlers
1057 */
1058
1059void rkisp1_mipi_isr(struct rkisp1_device *rkisp1)
1060{
1061        u32 val, status;
1062
1063        status = rkisp1_read(rkisp1, RKISP1_CIF_MIPI_MIS);
1064        if (!status)
1065                return;
1066
1067        rkisp1_write(rkisp1, status, RKISP1_CIF_MIPI_ICR);
1068
1069        /*
1070         * Disable DPHY errctrl interrupt, because this dphy
1071         * erctrl signal is asserted until the next changes
1072         * of line state. This time is may be too long and cpu
1073         * is hold in this interrupt.
1074         */
1075        if (status & RKISP1_CIF_MIPI_ERR_CTRL(0x0f)) {
1076                val = rkisp1_read(rkisp1, RKISP1_CIF_MIPI_IMSC);
1077                rkisp1_write(rkisp1, val & ~RKISP1_CIF_MIPI_ERR_CTRL(0x0f),
1078                             RKISP1_CIF_MIPI_IMSC);
1079                rkisp1->isp.is_dphy_errctrl_disabled = true;
1080        }
1081
1082        /*
1083         * Enable DPHY errctrl interrupt again, if mipi have receive
1084         * the whole frame without any error.
1085         */
1086        if (status == RKISP1_CIF_MIPI_FRAME_END) {
1087                /*
1088                 * Enable DPHY errctrl interrupt again, if mipi have receive
1089                 * the whole frame without any error.
1090                 */
1091                if (rkisp1->isp.is_dphy_errctrl_disabled) {
1092                        val = rkisp1_read(rkisp1, RKISP1_CIF_MIPI_IMSC);
1093                        val |= RKISP1_CIF_MIPI_ERR_CTRL(0x0f);
1094                        rkisp1_write(rkisp1, val, RKISP1_CIF_MIPI_IMSC);
1095                        rkisp1->isp.is_dphy_errctrl_disabled = false;
1096                }
1097        } else {
1098                rkisp1->debug.mipi_error++;
1099        }
1100}
1101
1102static void rkisp1_isp_queue_event_sof(struct rkisp1_isp *isp)
1103{
1104        struct v4l2_event event = {
1105                .type = V4L2_EVENT_FRAME_SYNC,
1106        };
1107        event.u.frame_sync.frame_sequence = isp->frame_sequence;
1108
1109        v4l2_event_queue(isp->sd.devnode, &event);
1110}
1111
1112void rkisp1_isp_isr(struct rkisp1_device *rkisp1)
1113{
1114        u32 status, isp_err;
1115
1116        status = rkisp1_read(rkisp1, RKISP1_CIF_ISP_MIS);
1117        if (!status)
1118                return;
1119
1120        rkisp1_write(rkisp1, status, RKISP1_CIF_ISP_ICR);
1121
1122        /* Vertical sync signal, starting generating new frame */
1123        if (status & RKISP1_CIF_ISP_V_START) {
1124                rkisp1->isp.frame_sequence++;
1125                rkisp1_isp_queue_event_sof(&rkisp1->isp);
1126                if (status & RKISP1_CIF_ISP_FRAME) {
1127                        WARN_ONCE(1, "irq delay is too long, buffers might not be in sync\n");
1128                        rkisp1->debug.irq_delay++;
1129                }
1130        }
1131        if (status & RKISP1_CIF_ISP_PIC_SIZE_ERROR) {
1132                /* Clear pic_size_error */
1133                isp_err = rkisp1_read(rkisp1, RKISP1_CIF_ISP_ERR);
1134                if (isp_err & RKISP1_CIF_ISP_ERR_INFORM_SIZE)
1135                        rkisp1->debug.inform_size_error++;
1136                if (isp_err & RKISP1_CIF_ISP_ERR_IS_SIZE)
1137                        rkisp1->debug.img_stabilization_size_error++;
1138                if (isp_err & RKISP1_CIF_ISP_ERR_OUTFORM_SIZE)
1139                        rkisp1->debug.outform_size_error++;
1140                rkisp1_write(rkisp1, isp_err, RKISP1_CIF_ISP_ERR_CLR);
1141        } else if (status & RKISP1_CIF_ISP_DATA_LOSS) {
1142                /* keep track of data_loss in debugfs */
1143                rkisp1->debug.data_loss++;
1144        }
1145
1146        if (status & RKISP1_CIF_ISP_FRAME) {
1147                u32 isp_ris;
1148
1149                /* New frame from the sensor received */
1150                isp_ris = rkisp1_read(rkisp1, RKISP1_CIF_ISP_RIS);
1151                if (isp_ris & RKISP1_STATS_MEAS_MASK)
1152                        rkisp1_stats_isr(&rkisp1->stats, isp_ris);
1153                /*
1154                 * Then update changed configs. Some of them involve
1155                 * lot of register writes. Do those only one per frame.
1156                 * Do the updates in the order of the processing flow.
1157                 */
1158                rkisp1_params_isr(rkisp1);
1159        }
1160
1161}
1162