linux/drivers/staging/media/imx/imx-media-csi.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2/*
   3 * V4L2 Capture CSI Subdev for Freescale i.MX5/6 SOC
   4 *
   5 * Copyright (c) 2014-2017 Mentor Graphics Inc.
   6 * Copyright (C) 2017 Pengutronix, Philipp Zabel <kernel@pengutronix.de>
   7 */
   8#include <linux/delay.h>
   9#include <linux/gcd.h>
  10#include <linux/interrupt.h>
  11#include <linux/module.h>
  12#include <linux/of_graph.h>
  13#include <linux/pinctrl/consumer.h>
  14#include <linux/platform_device.h>
  15#include <media/v4l2-ctrls.h>
  16#include <media/v4l2-device.h>
  17#include <media/v4l2-event.h>
  18#include <media/v4l2-fwnode.h>
  19#include <media/v4l2-mc.h>
  20#include <media/v4l2-subdev.h>
  21#include <media/videobuf2-dma-contig.h>
  22#include <video/imx-ipu-v3.h>
  23#include <media/imx.h>
  24#include "imx-media.h"
  25
  26/*
  27 * Min/Max supported width and heights.
  28 *
  29 * We allow planar output, so we have to align width by 16 pixels
  30 * to meet IDMAC alignment requirements.
  31 *
  32 * TODO: move this into pad format negotiation, if capture device
  33 * has not requested planar formats, we should allow 8 pixel
  34 * alignment.
  35 */
  36#define MIN_W       32
  37#define MIN_H       32
  38#define MAX_W      4096
  39#define MAX_H      4096
  40#define W_ALIGN    1 /* multiple of 2 pixels */
  41#define H_ALIGN    1 /* multiple of 2 lines */
  42#define S_ALIGN    1 /* multiple of 2 */
  43
  44/*
  45 * struct csi_skip_desc - CSI frame skipping descriptor
  46 * @keep - number of frames kept per max_ratio frames
  47 * @max_ratio - width of skip_smfc, written to MAX_RATIO bitfield
  48 * @skip_smfc - skip pattern written to the SKIP_SMFC bitfield
  49 */
  50struct csi_skip_desc {
  51        u8 keep;
  52        u8 max_ratio;
  53        u8 skip_smfc;
  54};
  55
  56struct csi_priv {
  57        struct device *dev;
  58        struct ipu_soc *ipu;
  59        struct v4l2_subdev sd;
  60        struct media_pad pad[CSI_NUM_PADS];
  61        struct v4l2_async_notifier notifier;
  62
  63        /* the video device at IDMAC output pad */
  64        struct imx_media_video_dev *vdev;
  65        struct imx_media_fim *fim;
  66        int csi_id;
  67        int smfc_id;
  68
  69        /* lock to protect all members below */
  70        struct mutex lock;
  71
  72        int active_output_pad;
  73
  74        struct ipuv3_channel *idmac_ch;
  75        struct ipu_smfc *smfc;
  76        struct ipu_csi *csi;
  77
  78        struct v4l2_mbus_framefmt format_mbus[CSI_NUM_PADS];
  79        const struct imx_media_pixfmt *cc[CSI_NUM_PADS];
  80        struct v4l2_fract frame_interval[CSI_NUM_PADS];
  81        struct v4l2_rect crop;
  82        struct v4l2_rect compose;
  83        const struct csi_skip_desc *skip;
  84
  85        /* active vb2 buffers to send to video dev sink */
  86        struct imx_media_buffer *active_vb2_buf[2];
  87        struct imx_media_dma_buf underrun_buf;
  88
  89        int ipu_buf_num;  /* ipu double buffer index: 0-1 */
  90
  91        /* the sink for the captured frames */
  92        struct media_entity *sink;
  93        enum ipu_csi_dest dest;
  94        /* the source subdev */
  95        struct v4l2_subdev *src_sd;
  96
  97        /* the mipi virtual channel number at link validate */
  98        int vc_num;
  99
 100        /* the upstream endpoint CSI is receiving from */
 101        struct v4l2_fwnode_endpoint upstream_ep;
 102
 103        spinlock_t irqlock; /* protect eof_irq handler */
 104        struct timer_list eof_timeout_timer;
 105        int eof_irq;
 106        int nfb4eof_irq;
 107
 108        struct v4l2_ctrl_handler ctrl_hdlr;
 109
 110        int stream_count; /* streaming counter */
 111        u32 frame_sequence; /* frame sequence counter */
 112        bool last_eof;   /* waiting for last EOF at stream off */
 113        bool nfb4eof;    /* NFB4EOF encountered during streaming */
 114        bool interweave_swap; /* swap top/bottom lines when interweaving */
 115        struct completion last_eof_comp;
 116};
 117
 118static inline struct csi_priv *sd_to_dev(struct v4l2_subdev *sdev)
 119{
 120        return container_of(sdev, struct csi_priv, sd);
 121}
 122
 123static inline struct csi_priv *notifier_to_dev(struct v4l2_async_notifier *n)
 124{
 125        return container_of(n, struct csi_priv, notifier);
 126}
 127
 128static inline bool is_parallel_bus(struct v4l2_fwnode_endpoint *ep)
 129{
 130        return ep->bus_type != V4L2_MBUS_CSI2_DPHY;
 131}
 132
 133static inline bool is_parallel_16bit_bus(struct v4l2_fwnode_endpoint *ep)
 134{
 135        return is_parallel_bus(ep) && ep->bus.parallel.bus_width >= 16;
 136}
 137
 138/*
 139 * Check for conditions that require the IPU to handle the
 140 * data internally as generic data, aka passthrough mode:
 141 * - raw bayer media bus formats, or
 142 * - the CSI is receiving from a 16-bit parallel bus, or
 143 * - the CSI is receiving from an 8-bit parallel bus and the incoming
 144 *   media bus format is other than UYVY8_2X8/YUYV8_2X8.
 145 */
 146static inline bool requires_passthrough(struct v4l2_fwnode_endpoint *ep,
 147                                        struct v4l2_mbus_framefmt *infmt,
 148                                        const struct imx_media_pixfmt *incc)
 149{
 150        return incc->bayer || is_parallel_16bit_bus(ep) ||
 151                (is_parallel_bus(ep) &&
 152                 infmt->code != MEDIA_BUS_FMT_UYVY8_2X8 &&
 153                 infmt->code != MEDIA_BUS_FMT_YUYV8_2X8);
 154}
 155
 156/*
 157 * Parses the fwnode endpoint from the source pad of the entity
 158 * connected to this CSI. This will either be the entity directly
 159 * upstream from the CSI-2 receiver, directly upstream from the
 160 * video mux, or directly upstream from the CSI itself. The endpoint
 161 * is needed to determine the bus type and bus config coming into
 162 * the CSI.
 163 */
 164static int csi_get_upstream_endpoint(struct csi_priv *priv,
 165                                     struct v4l2_fwnode_endpoint *ep)
 166{
 167        struct fwnode_handle *endpoint;
 168        struct v4l2_subdev *sd;
 169        struct media_pad *pad;
 170
 171        if (!IS_ENABLED(CONFIG_OF))
 172                return -ENXIO;
 173
 174        if (!priv->src_sd)
 175                return -EPIPE;
 176
 177        sd = priv->src_sd;
 178
 179        switch (sd->grp_id) {
 180        case IMX_MEDIA_GRP_ID_CSI_MUX:
 181                /*
 182                 * CSI is connected directly to CSI mux, skip up to
 183                 * CSI-2 receiver if it is in the path, otherwise stay
 184                 * with the CSI mux.
 185                 */
 186                sd = imx_media_pipeline_subdev(&sd->entity,
 187                                               IMX_MEDIA_GRP_ID_CSI2,
 188                                               true);
 189                if (IS_ERR(sd))
 190                        sd = priv->src_sd;
 191                break;
 192        case IMX_MEDIA_GRP_ID_CSI2:
 193                break;
 194        default:
 195                /*
 196                 * the source is neither the CSI mux nor the CSI-2 receiver,
 197                 * get the source pad directly upstream from CSI itself.
 198                 */
 199                sd = &priv->sd;
 200                break;
 201        }
 202
 203        /* get source pad of entity directly upstream from sd */
 204        pad = imx_media_pipeline_pad(&sd->entity, 0, 0, true);
 205        if (!pad)
 206                return -ENODEV;
 207
 208        endpoint = imx_media_get_pad_fwnode(pad);
 209        if (IS_ERR(endpoint))
 210                return PTR_ERR(endpoint);
 211
 212        v4l2_fwnode_endpoint_parse(endpoint, ep);
 213
 214        fwnode_handle_put(endpoint);
 215
 216        return 0;
 217}
 218
 219static void csi_idmac_put_ipu_resources(struct csi_priv *priv)
 220{
 221        if (priv->idmac_ch)
 222                ipu_idmac_put(priv->idmac_ch);
 223        priv->idmac_ch = NULL;
 224
 225        if (priv->smfc)
 226                ipu_smfc_put(priv->smfc);
 227        priv->smfc = NULL;
 228}
 229
 230static int csi_idmac_get_ipu_resources(struct csi_priv *priv)
 231{
 232        int ch_num, ret;
 233        struct ipu_smfc *smfc;
 234        struct ipuv3_channel *idmac_ch;
 235
 236        ch_num = IPUV3_CHANNEL_CSI0 + priv->smfc_id;
 237
 238        smfc = ipu_smfc_get(priv->ipu, ch_num);
 239        if (IS_ERR(smfc)) {
 240                v4l2_err(&priv->sd, "failed to get SMFC\n");
 241                ret = PTR_ERR(smfc);
 242                goto out;
 243        }
 244        priv->smfc = smfc;
 245
 246        idmac_ch = ipu_idmac_get(priv->ipu, ch_num);
 247        if (IS_ERR(idmac_ch)) {
 248                v4l2_err(&priv->sd, "could not get IDMAC channel %u\n",
 249                         ch_num);
 250                ret = PTR_ERR(idmac_ch);
 251                goto out;
 252        }
 253        priv->idmac_ch = idmac_ch;
 254
 255        return 0;
 256out:
 257        csi_idmac_put_ipu_resources(priv);
 258        return ret;
 259}
 260
 261static void csi_vb2_buf_done(struct csi_priv *priv)
 262{
 263        struct imx_media_video_dev *vdev = priv->vdev;
 264        struct imx_media_buffer *done, *next;
 265        struct vb2_buffer *vb;
 266        dma_addr_t phys;
 267
 268        done = priv->active_vb2_buf[priv->ipu_buf_num];
 269        if (done) {
 270                done->vbuf.field = vdev->fmt.field;
 271                done->vbuf.sequence = priv->frame_sequence;
 272                vb = &done->vbuf.vb2_buf;
 273                vb->timestamp = ktime_get_ns();
 274                vb2_buffer_done(vb, priv->nfb4eof ?
 275                                VB2_BUF_STATE_ERROR : VB2_BUF_STATE_DONE);
 276        }
 277
 278        priv->frame_sequence++;
 279        priv->nfb4eof = false;
 280
 281        /* get next queued buffer */
 282        next = imx_media_capture_device_next_buf(vdev);
 283        if (next) {
 284                phys = vb2_dma_contig_plane_dma_addr(&next->vbuf.vb2_buf, 0);
 285                priv->active_vb2_buf[priv->ipu_buf_num] = next;
 286        } else {
 287                phys = priv->underrun_buf.phys;
 288                priv->active_vb2_buf[priv->ipu_buf_num] = NULL;
 289        }
 290
 291        if (ipu_idmac_buffer_is_ready(priv->idmac_ch, priv->ipu_buf_num))
 292                ipu_idmac_clear_buffer(priv->idmac_ch, priv->ipu_buf_num);
 293
 294        if (priv->interweave_swap)
 295                phys += vdev->fmt.bytesperline;
 296
 297        ipu_cpmem_set_buffer(priv->idmac_ch, priv->ipu_buf_num, phys);
 298}
 299
 300static irqreturn_t csi_idmac_eof_interrupt(int irq, void *dev_id)
 301{
 302        struct csi_priv *priv = dev_id;
 303
 304        spin_lock(&priv->irqlock);
 305
 306        if (priv->last_eof) {
 307                complete(&priv->last_eof_comp);
 308                priv->last_eof = false;
 309                goto unlock;
 310        }
 311
 312        if (priv->fim)
 313                /* call frame interval monitor */
 314                imx_media_fim_eof_monitor(priv->fim, ktime_get());
 315
 316        csi_vb2_buf_done(priv);
 317
 318        /* select new IPU buf */
 319        ipu_idmac_select_buffer(priv->idmac_ch, priv->ipu_buf_num);
 320        /* toggle IPU double-buffer index */
 321        priv->ipu_buf_num ^= 1;
 322
 323        /* bump the EOF timeout timer */
 324        mod_timer(&priv->eof_timeout_timer,
 325                  jiffies + msecs_to_jiffies(IMX_MEDIA_EOF_TIMEOUT));
 326
 327unlock:
 328        spin_unlock(&priv->irqlock);
 329        return IRQ_HANDLED;
 330}
 331
 332static irqreturn_t csi_idmac_nfb4eof_interrupt(int irq, void *dev_id)
 333{
 334        struct csi_priv *priv = dev_id;
 335
 336        spin_lock(&priv->irqlock);
 337
 338        /*
 339         * this is not an unrecoverable error, just mark
 340         * the next captured frame with vb2 error flag.
 341         */
 342        priv->nfb4eof = true;
 343
 344        v4l2_err(&priv->sd, "NFB4EOF\n");
 345
 346        spin_unlock(&priv->irqlock);
 347
 348        return IRQ_HANDLED;
 349}
 350
 351/*
 352 * EOF timeout timer function. This is an unrecoverable condition
 353 * without a stream restart.
 354 */
 355static void csi_idmac_eof_timeout(struct timer_list *t)
 356{
 357        struct csi_priv *priv = from_timer(priv, t, eof_timeout_timer);
 358        struct imx_media_video_dev *vdev = priv->vdev;
 359
 360        v4l2_err(&priv->sd, "EOF timeout\n");
 361
 362        /* signal a fatal error to capture device */
 363        imx_media_capture_device_error(vdev);
 364}
 365
 366static void csi_idmac_setup_vb2_buf(struct csi_priv *priv, dma_addr_t *phys)
 367{
 368        struct imx_media_video_dev *vdev = priv->vdev;
 369        struct imx_media_buffer *buf;
 370        int i;
 371
 372        for (i = 0; i < 2; i++) {
 373                buf = imx_media_capture_device_next_buf(vdev);
 374                if (buf) {
 375                        priv->active_vb2_buf[i] = buf;
 376                        phys[i] = vb2_dma_contig_plane_dma_addr(
 377                                &buf->vbuf.vb2_buf, 0);
 378                } else {
 379                        priv->active_vb2_buf[i] = NULL;
 380                        phys[i] = priv->underrun_buf.phys;
 381                }
 382        }
 383}
 384
 385static void csi_idmac_unsetup_vb2_buf(struct csi_priv *priv,
 386                                      enum vb2_buffer_state return_status)
 387{
 388        struct imx_media_buffer *buf;
 389        int i;
 390
 391        /* return any remaining active frames with return_status */
 392        for (i = 0; i < 2; i++) {
 393                buf = priv->active_vb2_buf[i];
 394                if (buf) {
 395                        struct vb2_buffer *vb = &buf->vbuf.vb2_buf;
 396
 397                        vb->timestamp = ktime_get_ns();
 398                        vb2_buffer_done(vb, return_status);
 399                }
 400        }
 401}
 402
 403/* init the SMFC IDMAC channel */
 404static int csi_idmac_setup_channel(struct csi_priv *priv)
 405{
 406        struct imx_media_video_dev *vdev = priv->vdev;
 407        const struct imx_media_pixfmt *incc;
 408        struct v4l2_mbus_framefmt *infmt;
 409        struct v4l2_mbus_framefmt *outfmt;
 410        bool passthrough, interweave;
 411        struct ipu_image image;
 412        u32 passthrough_bits;
 413        u32 passthrough_cycles;
 414        dma_addr_t phys[2];
 415        u32 burst_size;
 416        int ret;
 417
 418        infmt = &priv->format_mbus[CSI_SINK_PAD];
 419        incc = priv->cc[CSI_SINK_PAD];
 420        outfmt = &priv->format_mbus[CSI_SRC_PAD_IDMAC];
 421
 422        ipu_cpmem_zero(priv->idmac_ch);
 423
 424        memset(&image, 0, sizeof(image));
 425        image.pix = vdev->fmt;
 426        image.rect = vdev->compose;
 427
 428        csi_idmac_setup_vb2_buf(priv, phys);
 429
 430        image.phys0 = phys[0];
 431        image.phys1 = phys[1];
 432
 433        passthrough = requires_passthrough(&priv->upstream_ep, infmt, incc);
 434        passthrough_cycles = 1;
 435
 436        /*
 437         * If the field type at capture interface is interlaced, and
 438         * the output IDMAC pad is sequential, enable interweave at
 439         * the IDMAC output channel.
 440         */
 441        interweave = V4L2_FIELD_IS_INTERLACED(image.pix.field) &&
 442                V4L2_FIELD_IS_SEQUENTIAL(outfmt->field);
 443        priv->interweave_swap = interweave &&
 444                image.pix.field == V4L2_FIELD_INTERLACED_BT;
 445
 446        switch (image.pix.pixelformat) {
 447        case V4L2_PIX_FMT_SBGGR8:
 448        case V4L2_PIX_FMT_SGBRG8:
 449        case V4L2_PIX_FMT_SGRBG8:
 450        case V4L2_PIX_FMT_SRGGB8:
 451        case V4L2_PIX_FMT_GREY:
 452                burst_size = 16;
 453                passthrough_bits = 8;
 454                break;
 455        case V4L2_PIX_FMT_SBGGR16:
 456        case V4L2_PIX_FMT_SGBRG16:
 457        case V4L2_PIX_FMT_SGRBG16:
 458        case V4L2_PIX_FMT_SRGGB16:
 459        case V4L2_PIX_FMT_Y10:
 460        case V4L2_PIX_FMT_Y12:
 461                burst_size = 8;
 462                passthrough_bits = 16;
 463                break;
 464        case V4L2_PIX_FMT_YUV420:
 465        case V4L2_PIX_FMT_YVU420:
 466        case V4L2_PIX_FMT_NV12:
 467                burst_size = (image.pix.width & 0x3f) ?
 468                             ((image.pix.width & 0x1f) ?
 469                              ((image.pix.width & 0xf) ? 8 : 16) : 32) : 64;
 470                passthrough_bits = 16;
 471                /*
 472                 * Skip writing U and V components to odd rows (but not
 473                 * when enabling IDMAC interweaving, they are incompatible).
 474                 */
 475                if (!interweave)
 476                        ipu_cpmem_skip_odd_chroma_rows(priv->idmac_ch);
 477                break;
 478        case V4L2_PIX_FMT_YUYV:
 479        case V4L2_PIX_FMT_UYVY:
 480                burst_size = (image.pix.width & 0x1f) ?
 481                             ((image.pix.width & 0xf) ? 8 : 16) : 32;
 482                passthrough_bits = 16;
 483                break;
 484        case V4L2_PIX_FMT_RGB565:
 485                if (passthrough) {
 486                        burst_size = 16;
 487                        passthrough_bits = 8;
 488                        passthrough_cycles = incc->cycles;
 489                        break;
 490                }
 491                fallthrough;    /* non-passthrough RGB565 (CSI-2 bus) */
 492        default:
 493                burst_size = (image.pix.width & 0xf) ? 8 : 16;
 494                passthrough_bits = 16;
 495                break;
 496        }
 497
 498        if (passthrough) {
 499                if (priv->interweave_swap) {
 500                        /* start interweave scan at 1st top line (2nd line) */
 501                        image.phys0 += image.pix.bytesperline;
 502                        image.phys1 += image.pix.bytesperline;
 503                }
 504
 505                ipu_cpmem_set_resolution(priv->idmac_ch,
 506                                         image.rect.width * passthrough_cycles,
 507                                         image.rect.height);
 508                ipu_cpmem_set_stride(priv->idmac_ch, image.pix.bytesperline);
 509                ipu_cpmem_set_buffer(priv->idmac_ch, 0, image.phys0);
 510                ipu_cpmem_set_buffer(priv->idmac_ch, 1, image.phys1);
 511                ipu_cpmem_set_format_passthrough(priv->idmac_ch,
 512                                                 passthrough_bits);
 513        } else {
 514                if (priv->interweave_swap) {
 515                        /* start interweave scan at 1st top line (2nd line) */
 516                        image.rect.top = 1;
 517                }
 518
 519                ret = ipu_cpmem_set_image(priv->idmac_ch, &image);
 520                if (ret)
 521                        goto unsetup_vb2;
 522        }
 523
 524        ipu_cpmem_set_burstsize(priv->idmac_ch, burst_size);
 525
 526        /*
 527         * Set the channel for the direct CSI-->memory via SMFC
 528         * use-case to very high priority, by enabling the watermark
 529         * signal in the SMFC, enabling WM in the channel, and setting
 530         * the channel priority to high.
 531         *
 532         * Refer to the i.mx6 rev. D TRM Table 36-8: Calculated priority
 533         * value.
 534         *
 535         * The WM's are set very low by intention here to ensure that
 536         * the SMFC FIFOs do not overflow.
 537         */
 538        ipu_smfc_set_watermark(priv->smfc, 0x02, 0x01);
 539        ipu_cpmem_set_high_priority(priv->idmac_ch);
 540        ipu_idmac_enable_watermark(priv->idmac_ch, true);
 541        ipu_cpmem_set_axi_id(priv->idmac_ch, 0);
 542
 543        burst_size = passthrough ?
 544                (burst_size >> 3) - 1 : (burst_size >> 2) - 1;
 545
 546        ipu_smfc_set_burstsize(priv->smfc, burst_size);
 547
 548        if (interweave)
 549                ipu_cpmem_interlaced_scan(priv->idmac_ch,
 550                                          priv->interweave_swap ?
 551                                          -image.pix.bytesperline :
 552                                          image.pix.bytesperline,
 553                                          image.pix.pixelformat);
 554
 555        ipu_idmac_set_double_buffer(priv->idmac_ch, true);
 556
 557        return 0;
 558
 559unsetup_vb2:
 560        csi_idmac_unsetup_vb2_buf(priv, VB2_BUF_STATE_QUEUED);
 561        return ret;
 562}
 563
 564static void csi_idmac_unsetup(struct csi_priv *priv,
 565                              enum vb2_buffer_state state)
 566{
 567        ipu_idmac_disable_channel(priv->idmac_ch);
 568        ipu_smfc_disable(priv->smfc);
 569
 570        csi_idmac_unsetup_vb2_buf(priv, state);
 571}
 572
 573static int csi_idmac_setup(struct csi_priv *priv)
 574{
 575        int ret;
 576
 577        ret = csi_idmac_setup_channel(priv);
 578        if (ret)
 579                return ret;
 580
 581        ipu_cpmem_dump(priv->idmac_ch);
 582        ipu_dump(priv->ipu);
 583
 584        ipu_smfc_enable(priv->smfc);
 585
 586        /* set buffers ready */
 587        ipu_idmac_select_buffer(priv->idmac_ch, 0);
 588        ipu_idmac_select_buffer(priv->idmac_ch, 1);
 589
 590        /* enable the channels */
 591        ipu_idmac_enable_channel(priv->idmac_ch);
 592
 593        return 0;
 594}
 595
 596static int csi_idmac_start(struct csi_priv *priv)
 597{
 598        struct imx_media_video_dev *vdev = priv->vdev;
 599        int ret;
 600
 601        ret = csi_idmac_get_ipu_resources(priv);
 602        if (ret)
 603                return ret;
 604
 605        ipu_smfc_map_channel(priv->smfc, priv->csi_id, priv->vc_num);
 606
 607        ret = imx_media_alloc_dma_buf(priv->dev, &priv->underrun_buf,
 608                                      vdev->fmt.sizeimage);
 609        if (ret)
 610                goto out_put_ipu;
 611
 612        priv->ipu_buf_num = 0;
 613
 614        /* init EOF completion waitq */
 615        init_completion(&priv->last_eof_comp);
 616        priv->frame_sequence = 0;
 617        priv->last_eof = false;
 618        priv->nfb4eof = false;
 619
 620        ret = csi_idmac_setup(priv);
 621        if (ret) {
 622                v4l2_err(&priv->sd, "csi_idmac_setup failed: %d\n", ret);
 623                goto out_free_dma_buf;
 624        }
 625
 626        priv->nfb4eof_irq = ipu_idmac_channel_irq(priv->ipu,
 627                                                  priv->idmac_ch,
 628                                                  IPU_IRQ_NFB4EOF);
 629        ret = devm_request_irq(priv->dev, priv->nfb4eof_irq,
 630                               csi_idmac_nfb4eof_interrupt, 0,
 631                               "imx-smfc-nfb4eof", priv);
 632        if (ret) {
 633                v4l2_err(&priv->sd,
 634                         "Error registering NFB4EOF irq: %d\n", ret);
 635                goto out_unsetup;
 636        }
 637
 638        priv->eof_irq = ipu_idmac_channel_irq(priv->ipu, priv->idmac_ch,
 639                                              IPU_IRQ_EOF);
 640
 641        ret = devm_request_irq(priv->dev, priv->eof_irq,
 642                               csi_idmac_eof_interrupt, 0,
 643                               "imx-smfc-eof", priv);
 644        if (ret) {
 645                v4l2_err(&priv->sd,
 646                         "Error registering eof irq: %d\n", ret);
 647                goto out_free_nfb4eof_irq;
 648        }
 649
 650        /* start the EOF timeout timer */
 651        mod_timer(&priv->eof_timeout_timer,
 652                  jiffies + msecs_to_jiffies(IMX_MEDIA_EOF_TIMEOUT));
 653
 654        return 0;
 655
 656out_free_nfb4eof_irq:
 657        devm_free_irq(priv->dev, priv->nfb4eof_irq, priv);
 658out_unsetup:
 659        csi_idmac_unsetup(priv, VB2_BUF_STATE_QUEUED);
 660out_free_dma_buf:
 661        imx_media_free_dma_buf(priv->dev, &priv->underrun_buf);
 662out_put_ipu:
 663        csi_idmac_put_ipu_resources(priv);
 664        return ret;
 665}
 666
 667static void csi_idmac_wait_last_eof(struct csi_priv *priv)
 668{
 669        unsigned long flags;
 670        int ret;
 671
 672        /* mark next EOF interrupt as the last before stream off */
 673        spin_lock_irqsave(&priv->irqlock, flags);
 674        priv->last_eof = true;
 675        spin_unlock_irqrestore(&priv->irqlock, flags);
 676
 677        /*
 678         * and then wait for interrupt handler to mark completion.
 679         */
 680        ret = wait_for_completion_timeout(
 681                &priv->last_eof_comp, msecs_to_jiffies(IMX_MEDIA_EOF_TIMEOUT));
 682        if (ret == 0)
 683                v4l2_warn(&priv->sd, "wait last EOF timeout\n");
 684}
 685
 686static void csi_idmac_stop(struct csi_priv *priv)
 687{
 688        devm_free_irq(priv->dev, priv->eof_irq, priv);
 689        devm_free_irq(priv->dev, priv->nfb4eof_irq, priv);
 690
 691        csi_idmac_unsetup(priv, VB2_BUF_STATE_ERROR);
 692
 693        imx_media_free_dma_buf(priv->dev, &priv->underrun_buf);
 694
 695        /* cancel the EOF timeout timer */
 696        del_timer_sync(&priv->eof_timeout_timer);
 697
 698        csi_idmac_put_ipu_resources(priv);
 699}
 700
 701/* Update the CSI whole sensor and active windows */
 702static int csi_setup(struct csi_priv *priv)
 703{
 704        struct v4l2_mbus_framefmt *infmt, *outfmt;
 705        const struct imx_media_pixfmt *incc;
 706        struct v4l2_mbus_config mbus_cfg;
 707        struct v4l2_mbus_framefmt if_fmt;
 708        struct v4l2_rect crop;
 709
 710        infmt = &priv->format_mbus[CSI_SINK_PAD];
 711        incc = priv->cc[CSI_SINK_PAD];
 712        outfmt = &priv->format_mbus[priv->active_output_pad];
 713
 714        /* compose mbus_config from the upstream endpoint */
 715        mbus_cfg.type = priv->upstream_ep.bus_type;
 716        mbus_cfg.flags = is_parallel_bus(&priv->upstream_ep) ?
 717                priv->upstream_ep.bus.parallel.flags :
 718                priv->upstream_ep.bus.mipi_csi2.flags;
 719
 720        if_fmt = *infmt;
 721        crop = priv->crop;
 722
 723        /*
 724         * if cycles is set, we need to handle this over multiple cycles as
 725         * generic/bayer data
 726         */
 727        if (is_parallel_bus(&priv->upstream_ep) && incc->cycles) {
 728                if_fmt.width *= incc->cycles;
 729                crop.width *= incc->cycles;
 730        }
 731
 732        ipu_csi_set_window(priv->csi, &crop);
 733
 734        ipu_csi_set_downsize(priv->csi,
 735                             priv->crop.width == 2 * priv->compose.width,
 736                             priv->crop.height == 2 * priv->compose.height);
 737
 738        ipu_csi_init_interface(priv->csi, &mbus_cfg, &if_fmt, outfmt);
 739
 740        ipu_csi_set_dest(priv->csi, priv->dest);
 741
 742        if (priv->dest == IPU_CSI_DEST_IDMAC)
 743                ipu_csi_set_skip_smfc(priv->csi, priv->skip->skip_smfc,
 744                                      priv->skip->max_ratio - 1, 0);
 745
 746        ipu_csi_dump(priv->csi);
 747
 748        return 0;
 749}
 750
 751static int csi_start(struct csi_priv *priv)
 752{
 753        struct v4l2_fract *input_fi, *output_fi;
 754        int ret;
 755
 756        input_fi = &priv->frame_interval[CSI_SINK_PAD];
 757        output_fi = &priv->frame_interval[priv->active_output_pad];
 758
 759        /* start upstream */
 760        ret = v4l2_subdev_call(priv->src_sd, video, s_stream, 1);
 761        ret = (ret && ret != -ENOIOCTLCMD) ? ret : 0;
 762        if (ret)
 763                return ret;
 764
 765        /* Skip first few frames from a BT.656 source */
 766        if (priv->upstream_ep.bus_type == V4L2_MBUS_BT656) {
 767                u32 delay_usec, bad_frames = 20;
 768
 769                delay_usec = DIV_ROUND_UP_ULL((u64)USEC_PER_SEC *
 770                        input_fi->numerator * bad_frames,
 771                        input_fi->denominator);
 772
 773                usleep_range(delay_usec, delay_usec + 1000);
 774        }
 775
 776        if (priv->dest == IPU_CSI_DEST_IDMAC) {
 777                ret = csi_idmac_start(priv);
 778                if (ret)
 779                        goto stop_upstream;
 780        }
 781
 782        ret = csi_setup(priv);
 783        if (ret)
 784                goto idmac_stop;
 785
 786        /* start the frame interval monitor */
 787        if (priv->fim && priv->dest == IPU_CSI_DEST_IDMAC) {
 788                ret = imx_media_fim_set_stream(priv->fim, output_fi, true);
 789                if (ret)
 790                        goto idmac_stop;
 791        }
 792
 793        ret = ipu_csi_enable(priv->csi);
 794        if (ret) {
 795                v4l2_err(&priv->sd, "CSI enable error: %d\n", ret);
 796                goto fim_off;
 797        }
 798
 799        return 0;
 800
 801fim_off:
 802        if (priv->fim && priv->dest == IPU_CSI_DEST_IDMAC)
 803                imx_media_fim_set_stream(priv->fim, NULL, false);
 804idmac_stop:
 805        if (priv->dest == IPU_CSI_DEST_IDMAC)
 806                csi_idmac_stop(priv);
 807stop_upstream:
 808        v4l2_subdev_call(priv->src_sd, video, s_stream, 0);
 809        return ret;
 810}
 811
 812static void csi_stop(struct csi_priv *priv)
 813{
 814        if (priv->dest == IPU_CSI_DEST_IDMAC)
 815                csi_idmac_wait_last_eof(priv);
 816
 817        /*
 818         * Disable the CSI asap, after syncing with the last EOF.
 819         * Doing so after the IDMA channel is disabled has shown to
 820         * create hard system-wide hangs.
 821         */
 822        ipu_csi_disable(priv->csi);
 823
 824        /* stop upstream */
 825        v4l2_subdev_call(priv->src_sd, video, s_stream, 0);
 826
 827        if (priv->dest == IPU_CSI_DEST_IDMAC) {
 828                csi_idmac_stop(priv);
 829
 830                /* stop the frame interval monitor */
 831                if (priv->fim)
 832                        imx_media_fim_set_stream(priv->fim, NULL, false);
 833        }
 834}
 835
 836static const struct csi_skip_desc csi_skip[12] = {
 837        { 1, 1, 0x00 }, /* Keep all frames */
 838        { 5, 6, 0x10 }, /* Skip every sixth frame */
 839        { 4, 5, 0x08 }, /* Skip every fifth frame */
 840        { 3, 4, 0x04 }, /* Skip every fourth frame */
 841        { 2, 3, 0x02 }, /* Skip every third frame */
 842        { 3, 5, 0x0a }, /* Skip frames 1 and 3 of every 5 */
 843        { 1, 2, 0x01 }, /* Skip every second frame */
 844        { 2, 5, 0x0b }, /* Keep frames 1 and 4 of every 5 */
 845        { 1, 3, 0x03 }, /* Keep one in three frames */
 846        { 1, 4, 0x07 }, /* Keep one in four frames */
 847        { 1, 5, 0x0f }, /* Keep one in five frames */
 848        { 1, 6, 0x1f }, /* Keep one in six frames */
 849};
 850
 851static void csi_apply_skip_interval(const struct csi_skip_desc *skip,
 852                                    struct v4l2_fract *interval)
 853{
 854        unsigned int div;
 855
 856        interval->numerator *= skip->max_ratio;
 857        interval->denominator *= skip->keep;
 858
 859        /* Reduce fraction to lowest terms */
 860        div = gcd(interval->numerator, interval->denominator);
 861        if (div > 1) {
 862                interval->numerator /= div;
 863                interval->denominator /= div;
 864        }
 865}
 866
 867/*
 868 * Find the skip pattern to produce the output frame interval closest to the
 869 * requested one, for the given input frame interval. Updates the output frame
 870 * interval to the exact value.
 871 */
 872static const struct csi_skip_desc *csi_find_best_skip(struct v4l2_fract *in,
 873                                                      struct v4l2_fract *out)
 874{
 875        const struct csi_skip_desc *skip = &csi_skip[0], *best_skip = skip;
 876        u32 min_err = UINT_MAX;
 877        u64 want_us;
 878        int i;
 879
 880        /* Default to 1:1 ratio */
 881        if (out->numerator == 0 || out->denominator == 0 ||
 882            in->numerator == 0 || in->denominator == 0) {
 883                *out = *in;
 884                return best_skip;
 885        }
 886
 887        want_us = div_u64((u64)USEC_PER_SEC * out->numerator, out->denominator);
 888
 889        /* Find the reduction closest to the requested time per frame */
 890        for (i = 0; i < ARRAY_SIZE(csi_skip); i++, skip++) {
 891                u64 tmp, err;
 892
 893                tmp = div_u64((u64)USEC_PER_SEC * in->numerator *
 894                              skip->max_ratio, in->denominator * skip->keep);
 895
 896                err = abs((s64)tmp - want_us);
 897                if (err < min_err) {
 898                        min_err = err;
 899                        best_skip = skip;
 900                }
 901        }
 902
 903        *out = *in;
 904        csi_apply_skip_interval(best_skip, out);
 905
 906        return best_skip;
 907}
 908
 909/*
 910 * V4L2 subdev operations.
 911 */
 912
 913static int csi_g_frame_interval(struct v4l2_subdev *sd,
 914                                struct v4l2_subdev_frame_interval *fi)
 915{
 916        struct csi_priv *priv = v4l2_get_subdevdata(sd);
 917
 918        if (fi->pad >= CSI_NUM_PADS)
 919                return -EINVAL;
 920
 921        mutex_lock(&priv->lock);
 922
 923        fi->interval = priv->frame_interval[fi->pad];
 924
 925        mutex_unlock(&priv->lock);
 926
 927        return 0;
 928}
 929
 930static int csi_s_frame_interval(struct v4l2_subdev *sd,
 931                                struct v4l2_subdev_frame_interval *fi)
 932{
 933        struct csi_priv *priv = v4l2_get_subdevdata(sd);
 934        struct v4l2_fract *input_fi;
 935        int ret = 0;
 936
 937        mutex_lock(&priv->lock);
 938
 939        input_fi = &priv->frame_interval[CSI_SINK_PAD];
 940
 941        switch (fi->pad) {
 942        case CSI_SINK_PAD:
 943                /* No limits on valid input frame intervals */
 944                if (fi->interval.numerator == 0 ||
 945                    fi->interval.denominator == 0)
 946                        fi->interval = *input_fi;
 947                /* Reset output intervals and frame skipping ratio to 1:1 */
 948                priv->frame_interval[CSI_SRC_PAD_IDMAC] = fi->interval;
 949                priv->frame_interval[CSI_SRC_PAD_DIRECT] = fi->interval;
 950                priv->skip = &csi_skip[0];
 951                break;
 952        case CSI_SRC_PAD_IDMAC:
 953                /*
 954                 * frame interval at IDMAC output pad depends on input
 955                 * interval, modified by frame skipping.
 956                 */
 957                priv->skip = csi_find_best_skip(input_fi, &fi->interval);
 958                break;
 959        case CSI_SRC_PAD_DIRECT:
 960                /*
 961                 * frame interval at DIRECT output pad is same as input
 962                 * interval.
 963                 */
 964                fi->interval = *input_fi;
 965                break;
 966        default:
 967                ret = -EINVAL;
 968                goto out;
 969        }
 970
 971        priv->frame_interval[fi->pad] = fi->interval;
 972out:
 973        mutex_unlock(&priv->lock);
 974        return ret;
 975}
 976
 977static int csi_s_stream(struct v4l2_subdev *sd, int enable)
 978{
 979        struct csi_priv *priv = v4l2_get_subdevdata(sd);
 980        int ret = 0;
 981
 982        mutex_lock(&priv->lock);
 983
 984        if (!priv->src_sd || !priv->sink) {
 985                ret = -EPIPE;
 986                goto out;
 987        }
 988
 989        /*
 990         * enable/disable streaming only if stream_count is
 991         * going from 0 to 1 / 1 to 0.
 992         */
 993        if (priv->stream_count != !enable)
 994                goto update_count;
 995
 996        if (enable) {
 997                dev_dbg(priv->dev, "stream ON\n");
 998                ret = csi_start(priv);
 999                if (ret)
1000                        goto out;
1001        } else {
1002                dev_dbg(priv->dev, "stream OFF\n");
1003                csi_stop(priv);
1004        }
1005
1006update_count:
1007        priv->stream_count += enable ? 1 : -1;
1008        if (priv->stream_count < 0)
1009                priv->stream_count = 0;
1010out:
1011        mutex_unlock(&priv->lock);
1012        return ret;
1013}
1014
1015static int csi_link_setup(struct media_entity *entity,
1016                          const struct media_pad *local,
1017                          const struct media_pad *remote, u32 flags)
1018{
1019        struct v4l2_subdev *sd = media_entity_to_v4l2_subdev(entity);
1020        struct csi_priv *priv = v4l2_get_subdevdata(sd);
1021        struct v4l2_subdev *remote_sd;
1022        int ret = 0;
1023
1024        dev_dbg(priv->dev, "link setup %s -> %s\n", remote->entity->name,
1025                local->entity->name);
1026
1027        mutex_lock(&priv->lock);
1028
1029        if (local->flags & MEDIA_PAD_FL_SINK) {
1030                if (!is_media_entity_v4l2_subdev(remote->entity)) {
1031                        ret = -EINVAL;
1032                        goto out;
1033                }
1034
1035                remote_sd = media_entity_to_v4l2_subdev(remote->entity);
1036
1037                if (flags & MEDIA_LNK_FL_ENABLED) {
1038                        if (priv->src_sd) {
1039                                ret = -EBUSY;
1040                                goto out;
1041                        }
1042                        priv->src_sd = remote_sd;
1043                } else {
1044                        priv->src_sd = NULL;
1045                }
1046
1047                goto out;
1048        }
1049
1050        /* this is a source pad */
1051
1052        if (flags & MEDIA_LNK_FL_ENABLED) {
1053                if (priv->sink) {
1054                        ret = -EBUSY;
1055                        goto out;
1056                }
1057        } else {
1058                v4l2_ctrl_handler_free(&priv->ctrl_hdlr);
1059                v4l2_ctrl_handler_init(&priv->ctrl_hdlr, 0);
1060                priv->sink = NULL;
1061                /* do not apply IC burst alignment in csi_try_crop */
1062                priv->active_output_pad = CSI_SRC_PAD_IDMAC;
1063                goto out;
1064        }
1065
1066        /* record which output pad is now active */
1067        priv->active_output_pad = local->index;
1068
1069        /* set CSI destination */
1070        if (local->index == CSI_SRC_PAD_IDMAC) {
1071                if (!is_media_entity_v4l2_video_device(remote->entity)) {
1072                        ret = -EINVAL;
1073                        goto out;
1074                }
1075
1076                if (priv->fim) {
1077                        ret = imx_media_fim_add_controls(priv->fim);
1078                        if (ret)
1079                                goto out;
1080                }
1081
1082                priv->dest = IPU_CSI_DEST_IDMAC;
1083        } else {
1084                if (!is_media_entity_v4l2_subdev(remote->entity)) {
1085                        ret = -EINVAL;
1086                        goto out;
1087                }
1088
1089                remote_sd = media_entity_to_v4l2_subdev(remote->entity);
1090                switch (remote_sd->grp_id) {
1091                case IMX_MEDIA_GRP_ID_IPU_VDIC:
1092                        priv->dest = IPU_CSI_DEST_VDIC;
1093                        break;
1094                case IMX_MEDIA_GRP_ID_IPU_IC_PRP:
1095                        priv->dest = IPU_CSI_DEST_IC;
1096                        break;
1097                default:
1098                        ret = -EINVAL;
1099                        goto out;
1100                }
1101        }
1102
1103        priv->sink = remote->entity;
1104out:
1105        mutex_unlock(&priv->lock);
1106        return ret;
1107}
1108
1109static int csi_link_validate(struct v4l2_subdev *sd,
1110                             struct media_link *link,
1111                             struct v4l2_subdev_format *source_fmt,
1112                             struct v4l2_subdev_format *sink_fmt)
1113{
1114        struct csi_priv *priv = v4l2_get_subdevdata(sd);
1115        struct v4l2_fwnode_endpoint upstream_ep = { .bus_type = 0 };
1116        bool is_csi2;
1117        int ret;
1118
1119        ret = v4l2_subdev_link_validate_default(sd, link,
1120                                                source_fmt, sink_fmt);
1121        if (ret)
1122                return ret;
1123
1124        ret = csi_get_upstream_endpoint(priv, &upstream_ep);
1125        if (ret) {
1126                v4l2_err(&priv->sd, "failed to find upstream endpoint\n");
1127                return ret;
1128        }
1129
1130        mutex_lock(&priv->lock);
1131
1132        priv->upstream_ep = upstream_ep;
1133        is_csi2 = !is_parallel_bus(&upstream_ep);
1134        if (is_csi2) {
1135                /*
1136                 * NOTE! It seems the virtual channels from the mipi csi-2
1137                 * receiver are used only for routing by the video mux's,
1138                 * or for hard-wired routing to the CSI's. Once the stream
1139                 * enters the CSI's however, they are treated internally
1140                 * in the IPU as virtual channel 0.
1141                 */
1142                ipu_csi_set_mipi_datatype(priv->csi, 0,
1143                                          &priv->format_mbus[CSI_SINK_PAD]);
1144        }
1145
1146        /* select either parallel or MIPI-CSI2 as input to CSI */
1147        ipu_set_csi_src_mux(priv->ipu, priv->csi_id, is_csi2);
1148
1149        mutex_unlock(&priv->lock);
1150        return ret;
1151}
1152
1153static struct v4l2_mbus_framefmt *
1154__csi_get_fmt(struct csi_priv *priv, struct v4l2_subdev_state *sd_state,
1155              unsigned int pad, enum v4l2_subdev_format_whence which)
1156{
1157        if (which == V4L2_SUBDEV_FORMAT_TRY)
1158                return v4l2_subdev_get_try_format(&priv->sd, sd_state, pad);
1159        else
1160                return &priv->format_mbus[pad];
1161}
1162
1163static struct v4l2_rect *
1164__csi_get_crop(struct csi_priv *priv, struct v4l2_subdev_state *sd_state,
1165               enum v4l2_subdev_format_whence which)
1166{
1167        if (which == V4L2_SUBDEV_FORMAT_TRY)
1168                return v4l2_subdev_get_try_crop(&priv->sd, sd_state,
1169                                                CSI_SINK_PAD);
1170        else
1171                return &priv->crop;
1172}
1173
1174static struct v4l2_rect *
1175__csi_get_compose(struct csi_priv *priv, struct v4l2_subdev_state *sd_state,
1176                  enum v4l2_subdev_format_whence which)
1177{
1178        if (which == V4L2_SUBDEV_FORMAT_TRY)
1179                return v4l2_subdev_get_try_compose(&priv->sd, sd_state,
1180                                                   CSI_SINK_PAD);
1181        else
1182                return &priv->compose;
1183}
1184
1185static void csi_try_crop(struct csi_priv *priv,
1186                         struct v4l2_rect *crop,
1187                         struct v4l2_subdev_state *sd_state,
1188                         struct v4l2_mbus_framefmt *infmt,
1189                         struct v4l2_fwnode_endpoint *upstream_ep)
1190{
1191        u32 in_height;
1192
1193        crop->width = min_t(__u32, infmt->width, crop->width);
1194        if (crop->left + crop->width > infmt->width)
1195                crop->left = infmt->width - crop->width;
1196        /* adjust crop left/width to h/w alignment restrictions */
1197        crop->left &= ~0x3;
1198        if (priv->active_output_pad == CSI_SRC_PAD_DIRECT)
1199                crop->width &= ~0x7; /* multiple of 8 pixels (IC burst) */
1200        else
1201                crop->width &= ~0x1; /* multiple of 2 pixels */
1202
1203        in_height = infmt->height;
1204        if (infmt->field == V4L2_FIELD_ALTERNATE)
1205                in_height *= 2;
1206
1207        /*
1208         * FIXME: not sure why yet, but on interlaced bt.656,
1209         * changing the vertical cropping causes loss of vertical
1210         * sync, so fix it to NTSC/PAL active lines. NTSC contains
1211         * 2 extra lines of active video that need to be cropped.
1212         */
1213        if (upstream_ep->bus_type == V4L2_MBUS_BT656 &&
1214            (V4L2_FIELD_HAS_BOTH(infmt->field) ||
1215             infmt->field == V4L2_FIELD_ALTERNATE)) {
1216                crop->height = in_height;
1217                crop->top = (in_height == 480) ? 2 : 0;
1218        } else {
1219                crop->height = min_t(__u32, in_height, crop->height);
1220                if (crop->top + crop->height > in_height)
1221                        crop->top = in_height - crop->height;
1222        }
1223}
1224
1225static int csi_enum_mbus_code(struct v4l2_subdev *sd,
1226                              struct v4l2_subdev_state *sd_state,
1227                              struct v4l2_subdev_mbus_code_enum *code)
1228{
1229        struct csi_priv *priv = v4l2_get_subdevdata(sd);
1230        struct v4l2_fwnode_endpoint upstream_ep = { .bus_type = 0 };
1231        const struct imx_media_pixfmt *incc;
1232        struct v4l2_mbus_framefmt *infmt;
1233        int ret = 0;
1234
1235        mutex_lock(&priv->lock);
1236
1237        infmt = __csi_get_fmt(priv, sd_state, CSI_SINK_PAD, code->which);
1238        incc = imx_media_find_mbus_format(infmt->code, PIXFMT_SEL_ANY);
1239
1240        switch (code->pad) {
1241        case CSI_SINK_PAD:
1242                ret = imx_media_enum_mbus_formats(&code->code, code->index,
1243                                                  PIXFMT_SEL_ANY);
1244                break;
1245        case CSI_SRC_PAD_DIRECT:
1246        case CSI_SRC_PAD_IDMAC:
1247                ret = csi_get_upstream_endpoint(priv, &upstream_ep);
1248                if (ret) {
1249                        v4l2_err(&priv->sd, "failed to find upstream endpoint\n");
1250                        goto out;
1251                }
1252
1253                if (requires_passthrough(&upstream_ep, infmt, incc)) {
1254                        if (code->index != 0) {
1255                                ret = -EINVAL;
1256                                goto out;
1257                        }
1258                        code->code = infmt->code;
1259                } else {
1260                        enum imx_pixfmt_sel fmt_sel =
1261                                (incc->cs == IPUV3_COLORSPACE_YUV) ?
1262                                PIXFMT_SEL_YUV : PIXFMT_SEL_RGB;
1263
1264                        ret = imx_media_enum_ipu_formats(&code->code,
1265                                                         code->index,
1266                                                         fmt_sel);
1267                }
1268                break;
1269        default:
1270                ret = -EINVAL;
1271        }
1272
1273out:
1274        mutex_unlock(&priv->lock);
1275        return ret;
1276}
1277
1278static int csi_enum_frame_size(struct v4l2_subdev *sd,
1279                               struct v4l2_subdev_state *sd_state,
1280                               struct v4l2_subdev_frame_size_enum *fse)
1281{
1282        struct csi_priv *priv = v4l2_get_subdevdata(sd);
1283        struct v4l2_rect *crop;
1284        int ret = 0;
1285
1286        if (fse->pad >= CSI_NUM_PADS ||
1287            fse->index > (fse->pad == CSI_SINK_PAD ? 0 : 3))
1288                return -EINVAL;
1289
1290        mutex_lock(&priv->lock);
1291
1292        if (fse->pad == CSI_SINK_PAD) {
1293                fse->min_width = MIN_W;
1294                fse->max_width = MAX_W;
1295                fse->min_height = MIN_H;
1296                fse->max_height = MAX_H;
1297        } else {
1298                crop = __csi_get_crop(priv, sd_state, fse->which);
1299
1300                fse->min_width = fse->index & 1 ?
1301                        crop->width / 2 : crop->width;
1302                fse->max_width = fse->min_width;
1303                fse->min_height = fse->index & 2 ?
1304                        crop->height / 2 : crop->height;
1305                fse->max_height = fse->min_height;
1306        }
1307
1308        mutex_unlock(&priv->lock);
1309        return ret;
1310}
1311
1312static int csi_enum_frame_interval(struct v4l2_subdev *sd,
1313                                   struct v4l2_subdev_state *sd_state,
1314                                   struct v4l2_subdev_frame_interval_enum *fie)
1315{
1316        struct csi_priv *priv = v4l2_get_subdevdata(sd);
1317        struct v4l2_fract *input_fi;
1318        struct v4l2_rect *crop;
1319        int ret = 0;
1320
1321        if (fie->pad >= CSI_NUM_PADS ||
1322            fie->index >= (fie->pad != CSI_SRC_PAD_IDMAC ?
1323                           1 : ARRAY_SIZE(csi_skip)))
1324                return -EINVAL;
1325
1326        mutex_lock(&priv->lock);
1327
1328        input_fi = &priv->frame_interval[CSI_SINK_PAD];
1329        crop = __csi_get_crop(priv, sd_state, fie->which);
1330
1331        if ((fie->width != crop->width && fie->width != crop->width / 2) ||
1332            (fie->height != crop->height && fie->height != crop->height / 2)) {
1333                ret = -EINVAL;
1334                goto out;
1335        }
1336
1337        fie->interval = *input_fi;
1338
1339        if (fie->pad == CSI_SRC_PAD_IDMAC)
1340                csi_apply_skip_interval(&csi_skip[fie->index],
1341                                        &fie->interval);
1342
1343out:
1344        mutex_unlock(&priv->lock);
1345        return ret;
1346}
1347
1348static int csi_get_fmt(struct v4l2_subdev *sd,
1349                       struct v4l2_subdev_state *sd_state,
1350                       struct v4l2_subdev_format *sdformat)
1351{
1352        struct csi_priv *priv = v4l2_get_subdevdata(sd);
1353        struct v4l2_mbus_framefmt *fmt;
1354        int ret = 0;
1355
1356        if (sdformat->pad >= CSI_NUM_PADS)
1357                return -EINVAL;
1358
1359        mutex_lock(&priv->lock);
1360
1361        fmt = __csi_get_fmt(priv, sd_state, sdformat->pad, sdformat->which);
1362        if (!fmt) {
1363                ret = -EINVAL;
1364                goto out;
1365        }
1366
1367        sdformat->format = *fmt;
1368out:
1369        mutex_unlock(&priv->lock);
1370        return ret;
1371}
1372
1373static void csi_try_field(struct csi_priv *priv,
1374                          struct v4l2_subdev_state *sd_state,
1375                          struct v4l2_subdev_format *sdformat)
1376{
1377        struct v4l2_mbus_framefmt *infmt =
1378                __csi_get_fmt(priv, sd_state, CSI_SINK_PAD, sdformat->which);
1379
1380        /*
1381         * no restrictions on sink pad field type except must
1382         * be initialized.
1383         */
1384        if (sdformat->pad == CSI_SINK_PAD) {
1385                if (sdformat->format.field == V4L2_FIELD_ANY)
1386                        sdformat->format.field = V4L2_FIELD_NONE;
1387                return;
1388        }
1389
1390        switch (infmt->field) {
1391        case V4L2_FIELD_SEQ_TB:
1392        case V4L2_FIELD_SEQ_BT:
1393                /*
1394                 * If the user requests sequential at the source pad,
1395                 * allow it (along with possibly inverting field order).
1396                 * Otherwise passthrough the field type.
1397                 */
1398                if (!V4L2_FIELD_IS_SEQUENTIAL(sdformat->format.field))
1399                        sdformat->format.field = infmt->field;
1400                break;
1401        case V4L2_FIELD_ALTERNATE:
1402                /*
1403                 * This driver does not support alternate field mode, and
1404                 * the CSI captures a whole frame, so the CSI never presents
1405                 * alternate mode at its source pads. If user has not
1406                 * already requested sequential, translate ALTERNATE at
1407                 * sink pad to SEQ_TB or SEQ_BT at the source pad depending
1408                 * on input height (assume NTSC BT order if 480 total active
1409                 * frame lines, otherwise PAL TB order).
1410                 */
1411                if (!V4L2_FIELD_IS_SEQUENTIAL(sdformat->format.field))
1412                        sdformat->format.field = (infmt->height == 480 / 2) ?
1413                                V4L2_FIELD_SEQ_BT : V4L2_FIELD_SEQ_TB;
1414                break;
1415        default:
1416                /* Passthrough for all other input field types */
1417                sdformat->format.field = infmt->field;
1418                break;
1419        }
1420}
1421
1422static void csi_try_fmt(struct csi_priv *priv,
1423                        struct v4l2_fwnode_endpoint *upstream_ep,
1424                        struct v4l2_subdev_state *sd_state,
1425                        struct v4l2_subdev_format *sdformat,
1426                        struct v4l2_rect *crop,
1427                        struct v4l2_rect *compose,
1428                        const struct imx_media_pixfmt **cc)
1429{
1430        const struct imx_media_pixfmt *incc;
1431        struct v4l2_mbus_framefmt *infmt;
1432        u32 code;
1433
1434        infmt = __csi_get_fmt(priv, sd_state, CSI_SINK_PAD, sdformat->which);
1435
1436        switch (sdformat->pad) {
1437        case CSI_SRC_PAD_DIRECT:
1438        case CSI_SRC_PAD_IDMAC:
1439                incc = imx_media_find_mbus_format(infmt->code, PIXFMT_SEL_ANY);
1440
1441                sdformat->format.width = compose->width;
1442                sdformat->format.height = compose->height;
1443
1444                if (requires_passthrough(upstream_ep, infmt, incc)) {
1445                        sdformat->format.code = infmt->code;
1446                        *cc = incc;
1447                } else {
1448                        enum imx_pixfmt_sel fmt_sel =
1449                                (incc->cs == IPUV3_COLORSPACE_YUV) ?
1450                                PIXFMT_SEL_YUV : PIXFMT_SEL_RGB;
1451
1452                        *cc = imx_media_find_ipu_format(sdformat->format.code,
1453                                                        fmt_sel);
1454                        if (!*cc) {
1455                                imx_media_enum_ipu_formats(&code, 0, fmt_sel);
1456                                *cc = imx_media_find_ipu_format(code, fmt_sel);
1457                                sdformat->format.code = (*cc)->codes[0];
1458                        }
1459                }
1460
1461                csi_try_field(priv, sd_state, sdformat);
1462
1463                /* propagate colorimetry from sink */
1464                sdformat->format.colorspace = infmt->colorspace;
1465                sdformat->format.xfer_func = infmt->xfer_func;
1466                sdformat->format.quantization = infmt->quantization;
1467                sdformat->format.ycbcr_enc = infmt->ycbcr_enc;
1468
1469                break;
1470        case CSI_SINK_PAD:
1471                v4l_bound_align_image(&sdformat->format.width, MIN_W, MAX_W,
1472                                      W_ALIGN, &sdformat->format.height,
1473                                      MIN_H, MAX_H, H_ALIGN, S_ALIGN);
1474
1475                *cc = imx_media_find_mbus_format(sdformat->format.code,
1476                                                 PIXFMT_SEL_ANY);
1477                if (!*cc) {
1478                        imx_media_enum_mbus_formats(&code, 0,
1479                                                    PIXFMT_SEL_YUV_RGB);
1480                        *cc = imx_media_find_mbus_format(code,
1481                                                         PIXFMT_SEL_YUV_RGB);
1482                        sdformat->format.code = (*cc)->codes[0];
1483                }
1484
1485                csi_try_field(priv, sd_state, sdformat);
1486
1487                /* Reset crop and compose rectangles */
1488                crop->left = 0;
1489                crop->top = 0;
1490                crop->width = sdformat->format.width;
1491                crop->height = sdformat->format.height;
1492                if (sdformat->format.field == V4L2_FIELD_ALTERNATE)
1493                        crop->height *= 2;
1494                csi_try_crop(priv, crop, sd_state, &sdformat->format,
1495                             upstream_ep);
1496                compose->left = 0;
1497                compose->top = 0;
1498                compose->width = crop->width;
1499                compose->height = crop->height;
1500
1501                break;
1502        }
1503
1504        imx_media_try_colorimetry(&sdformat->format,
1505                        priv->active_output_pad == CSI_SRC_PAD_DIRECT);
1506}
1507
1508static int csi_set_fmt(struct v4l2_subdev *sd,
1509                       struct v4l2_subdev_state *sd_state,
1510                       struct v4l2_subdev_format *sdformat)
1511{
1512        struct csi_priv *priv = v4l2_get_subdevdata(sd);
1513        struct v4l2_fwnode_endpoint upstream_ep = { .bus_type = 0 };
1514        const struct imx_media_pixfmt *cc;
1515        struct v4l2_mbus_framefmt *fmt;
1516        struct v4l2_rect *crop, *compose;
1517        int ret;
1518
1519        if (sdformat->pad >= CSI_NUM_PADS)
1520                return -EINVAL;
1521
1522        ret = csi_get_upstream_endpoint(priv, &upstream_ep);
1523        if (ret) {
1524                v4l2_err(&priv->sd, "failed to find upstream endpoint\n");
1525                return ret;
1526        }
1527
1528        mutex_lock(&priv->lock);
1529
1530        if (priv->stream_count > 0) {
1531                ret = -EBUSY;
1532                goto out;
1533        }
1534
1535        crop = __csi_get_crop(priv, sd_state, sdformat->which);
1536        compose = __csi_get_compose(priv, sd_state, sdformat->which);
1537
1538        csi_try_fmt(priv, &upstream_ep, sd_state, sdformat, crop, compose,
1539                    &cc);
1540
1541        fmt = __csi_get_fmt(priv, sd_state, sdformat->pad, sdformat->which);
1542        *fmt = sdformat->format;
1543
1544        if (sdformat->pad == CSI_SINK_PAD) {
1545                int pad;
1546
1547                /* propagate format to source pads */
1548                for (pad = CSI_SINK_PAD + 1; pad < CSI_NUM_PADS; pad++) {
1549                        const struct imx_media_pixfmt *outcc;
1550                        struct v4l2_mbus_framefmt *outfmt;
1551                        struct v4l2_subdev_format format;
1552
1553                        format.pad = pad;
1554                        format.which = sdformat->which;
1555                        format.format = sdformat->format;
1556                        csi_try_fmt(priv, &upstream_ep, sd_state, &format,
1557                                    NULL, compose, &outcc);
1558
1559                        outfmt = __csi_get_fmt(priv, sd_state, pad,
1560                                               sdformat->which);
1561                        *outfmt = format.format;
1562
1563                        if (sdformat->which == V4L2_SUBDEV_FORMAT_ACTIVE)
1564                                priv->cc[pad] = outcc;
1565                }
1566        }
1567
1568        if (sdformat->which == V4L2_SUBDEV_FORMAT_ACTIVE)
1569                priv->cc[sdformat->pad] = cc;
1570
1571out:
1572        mutex_unlock(&priv->lock);
1573        return ret;
1574}
1575
1576static int csi_get_selection(struct v4l2_subdev *sd,
1577                             struct v4l2_subdev_state *sd_state,
1578                             struct v4l2_subdev_selection *sel)
1579{
1580        struct csi_priv *priv = v4l2_get_subdevdata(sd);
1581        struct v4l2_mbus_framefmt *infmt;
1582        struct v4l2_rect *crop, *compose;
1583        int ret = 0;
1584
1585        if (sel->pad != CSI_SINK_PAD)
1586                return -EINVAL;
1587
1588        mutex_lock(&priv->lock);
1589
1590        infmt = __csi_get_fmt(priv, sd_state, CSI_SINK_PAD, sel->which);
1591        crop = __csi_get_crop(priv, sd_state, sel->which);
1592        compose = __csi_get_compose(priv, sd_state, sel->which);
1593
1594        switch (sel->target) {
1595        case V4L2_SEL_TGT_CROP_BOUNDS:
1596                sel->r.left = 0;
1597                sel->r.top = 0;
1598                sel->r.width = infmt->width;
1599                sel->r.height = infmt->height;
1600                if (infmt->field == V4L2_FIELD_ALTERNATE)
1601                        sel->r.height *= 2;
1602                break;
1603        case V4L2_SEL_TGT_CROP:
1604                sel->r = *crop;
1605                break;
1606        case V4L2_SEL_TGT_COMPOSE_BOUNDS:
1607                sel->r.left = 0;
1608                sel->r.top = 0;
1609                sel->r.width = crop->width;
1610                sel->r.height = crop->height;
1611                break;
1612        case V4L2_SEL_TGT_COMPOSE:
1613                sel->r = *compose;
1614                break;
1615        default:
1616                ret = -EINVAL;
1617        }
1618
1619        mutex_unlock(&priv->lock);
1620        return ret;
1621}
1622
1623static int csi_set_scale(u32 *compose, u32 crop, u32 flags)
1624{
1625        if ((flags & (V4L2_SEL_FLAG_LE | V4L2_SEL_FLAG_GE)) ==
1626                     (V4L2_SEL_FLAG_LE | V4L2_SEL_FLAG_GE) &&
1627            *compose != crop && *compose != crop / 2)
1628                return -ERANGE;
1629
1630        if (*compose <= crop / 2 ||
1631            (*compose < crop * 3 / 4 && !(flags & V4L2_SEL_FLAG_GE)) ||
1632            (*compose < crop && (flags & V4L2_SEL_FLAG_LE)))
1633                *compose = crop / 2;
1634        else
1635                *compose = crop;
1636
1637        return 0;
1638}
1639
1640static int csi_set_selection(struct v4l2_subdev *sd,
1641                             struct v4l2_subdev_state *sd_state,
1642                             struct v4l2_subdev_selection *sel)
1643{
1644        struct csi_priv *priv = v4l2_get_subdevdata(sd);
1645        struct v4l2_fwnode_endpoint upstream_ep = { .bus_type = 0 };
1646        struct v4l2_mbus_framefmt *infmt;
1647        struct v4l2_rect *crop, *compose;
1648        int pad, ret;
1649
1650        if (sel->pad != CSI_SINK_PAD)
1651                return -EINVAL;
1652
1653        ret = csi_get_upstream_endpoint(priv, &upstream_ep);
1654        if (ret) {
1655                v4l2_err(&priv->sd, "failed to find upstream endpoint\n");
1656                return ret;
1657        }
1658
1659        mutex_lock(&priv->lock);
1660
1661        if (priv->stream_count > 0) {
1662                ret = -EBUSY;
1663                goto out;
1664        }
1665
1666        infmt = __csi_get_fmt(priv, sd_state, CSI_SINK_PAD, sel->which);
1667        crop = __csi_get_crop(priv, sd_state, sel->which);
1668        compose = __csi_get_compose(priv, sd_state, sel->which);
1669
1670        switch (sel->target) {
1671        case V4L2_SEL_TGT_CROP:
1672                /*
1673                 * Modifying the crop rectangle always changes the format on
1674                 * the source pads. If the KEEP_CONFIG flag is set, just return
1675                 * the current crop rectangle.
1676                 */
1677                if (sel->flags & V4L2_SEL_FLAG_KEEP_CONFIG) {
1678                        sel->r = priv->crop;
1679                        if (sel->which == V4L2_SUBDEV_FORMAT_TRY)
1680                                *crop = sel->r;
1681                        goto out;
1682                }
1683
1684                csi_try_crop(priv, &sel->r, sd_state, infmt, &upstream_ep);
1685
1686                *crop = sel->r;
1687
1688                /* Reset scaling to 1:1 */
1689                compose->width = crop->width;
1690                compose->height = crop->height;
1691                break;
1692        case V4L2_SEL_TGT_COMPOSE:
1693                /*
1694                 * Modifying the compose rectangle always changes the format on
1695                 * the source pads. If the KEEP_CONFIG flag is set, just return
1696                 * the current compose rectangle.
1697                 */
1698                if (sel->flags & V4L2_SEL_FLAG_KEEP_CONFIG) {
1699                        sel->r = priv->compose;
1700                        if (sel->which == V4L2_SUBDEV_FORMAT_TRY)
1701                                *compose = sel->r;
1702                        goto out;
1703                }
1704
1705                sel->r.left = 0;
1706                sel->r.top = 0;
1707                ret = csi_set_scale(&sel->r.width, crop->width, sel->flags);
1708                if (ret)
1709                        goto out;
1710                ret = csi_set_scale(&sel->r.height, crop->height, sel->flags);
1711                if (ret)
1712                        goto out;
1713
1714                *compose = sel->r;
1715                break;
1716        default:
1717                ret = -EINVAL;
1718                goto out;
1719        }
1720
1721        /* Reset source pads to sink compose rectangle */
1722        for (pad = CSI_SINK_PAD + 1; pad < CSI_NUM_PADS; pad++) {
1723                struct v4l2_mbus_framefmt *outfmt;
1724
1725                outfmt = __csi_get_fmt(priv, sd_state, pad, sel->which);
1726                outfmt->width = compose->width;
1727                outfmt->height = compose->height;
1728        }
1729
1730out:
1731        mutex_unlock(&priv->lock);
1732        return ret;
1733}
1734
1735static int csi_subscribe_event(struct v4l2_subdev *sd, struct v4l2_fh *fh,
1736                               struct v4l2_event_subscription *sub)
1737{
1738        if (sub->type != V4L2_EVENT_IMX_FRAME_INTERVAL_ERROR)
1739                return -EINVAL;
1740        if (sub->id != 0)
1741                return -EINVAL;
1742
1743        return v4l2_event_subscribe(fh, sub, 0, NULL);
1744}
1745
1746static int csi_unsubscribe_event(struct v4l2_subdev *sd, struct v4l2_fh *fh,
1747                                 struct v4l2_event_subscription *sub)
1748{
1749        return v4l2_event_unsubscribe(fh, sub);
1750}
1751
1752static int csi_registered(struct v4l2_subdev *sd)
1753{
1754        struct csi_priv *priv = v4l2_get_subdevdata(sd);
1755        struct ipu_csi *csi;
1756        int i, ret;
1757        u32 code;
1758
1759        /* get handle to IPU CSI */
1760        csi = ipu_csi_get(priv->ipu, priv->csi_id);
1761        if (IS_ERR(csi)) {
1762                v4l2_err(&priv->sd, "failed to get CSI%d\n", priv->csi_id);
1763                return PTR_ERR(csi);
1764        }
1765        priv->csi = csi;
1766
1767        for (i = 0; i < CSI_NUM_PADS; i++) {
1768                code = 0;
1769                if (i != CSI_SINK_PAD)
1770                        imx_media_enum_ipu_formats(&code, 0, PIXFMT_SEL_YUV);
1771
1772                /* set a default mbus format  */
1773                ret = imx_media_init_mbus_fmt(&priv->format_mbus[i],
1774                                              IMX_MEDIA_DEF_PIX_WIDTH,
1775                                              IMX_MEDIA_DEF_PIX_HEIGHT, code,
1776                                              V4L2_FIELD_NONE, &priv->cc[i]);
1777                if (ret)
1778                        goto put_csi;
1779
1780                /* init default frame interval */
1781                priv->frame_interval[i].numerator = 1;
1782                priv->frame_interval[i].denominator = 30;
1783        }
1784
1785        /* disable frame skipping */
1786        priv->skip = &csi_skip[0];
1787
1788        /* init default crop and compose rectangle sizes */
1789        priv->crop.width = IMX_MEDIA_DEF_PIX_WIDTH;
1790        priv->crop.height = IMX_MEDIA_DEF_PIX_HEIGHT;
1791        priv->compose.width = IMX_MEDIA_DEF_PIX_WIDTH;
1792        priv->compose.height = IMX_MEDIA_DEF_PIX_HEIGHT;
1793
1794        priv->fim = imx_media_fim_init(&priv->sd);
1795        if (IS_ERR(priv->fim)) {
1796                ret = PTR_ERR(priv->fim);
1797                goto put_csi;
1798        }
1799
1800        priv->vdev = imx_media_capture_device_init(priv->sd.dev, &priv->sd,
1801                                                   CSI_SRC_PAD_IDMAC, true);
1802        if (IS_ERR(priv->vdev)) {
1803                ret = PTR_ERR(priv->vdev);
1804                goto free_fim;
1805        }
1806
1807        ret = imx_media_capture_device_register(priv->vdev, 0);
1808        if (ret)
1809                goto remove_vdev;
1810
1811        return 0;
1812
1813remove_vdev:
1814        imx_media_capture_device_remove(priv->vdev);
1815free_fim:
1816        if (priv->fim)
1817                imx_media_fim_free(priv->fim);
1818put_csi:
1819        ipu_csi_put(priv->csi);
1820        return ret;
1821}
1822
1823static void csi_unregistered(struct v4l2_subdev *sd)
1824{
1825        struct csi_priv *priv = v4l2_get_subdevdata(sd);
1826
1827        imx_media_capture_device_unregister(priv->vdev);
1828        imx_media_capture_device_remove(priv->vdev);
1829
1830        if (priv->fim)
1831                imx_media_fim_free(priv->fim);
1832
1833        if (priv->csi)
1834                ipu_csi_put(priv->csi);
1835}
1836
1837/*
1838 * The CSI has only one fwnode endpoint, at the sink pad. Verify the
1839 * endpoint belongs to us, and return CSI_SINK_PAD.
1840 */
1841static int csi_get_fwnode_pad(struct media_entity *entity,
1842                              struct fwnode_endpoint *endpoint)
1843{
1844        struct v4l2_subdev *sd = media_entity_to_v4l2_subdev(entity);
1845        struct csi_priv *priv = v4l2_get_subdevdata(sd);
1846        struct fwnode_handle *csi_port = dev_fwnode(priv->dev);
1847        struct fwnode_handle *csi_ep;
1848        int ret;
1849
1850        csi_ep = fwnode_get_next_child_node(csi_port, NULL);
1851
1852        ret = endpoint->local_fwnode == csi_ep ? CSI_SINK_PAD : -ENXIO;
1853
1854        fwnode_handle_put(csi_ep);
1855
1856        return ret;
1857}
1858
1859static const struct media_entity_operations csi_entity_ops = {
1860        .link_setup = csi_link_setup,
1861        .link_validate = v4l2_subdev_link_validate,
1862        .get_fwnode_pad = csi_get_fwnode_pad,
1863};
1864
1865static const struct v4l2_subdev_core_ops csi_core_ops = {
1866        .subscribe_event = csi_subscribe_event,
1867        .unsubscribe_event = csi_unsubscribe_event,
1868};
1869
1870static const struct v4l2_subdev_video_ops csi_video_ops = {
1871        .g_frame_interval = csi_g_frame_interval,
1872        .s_frame_interval = csi_s_frame_interval,
1873        .s_stream = csi_s_stream,
1874};
1875
1876static const struct v4l2_subdev_pad_ops csi_pad_ops = {
1877        .init_cfg = imx_media_init_cfg,
1878        .enum_mbus_code = csi_enum_mbus_code,
1879        .enum_frame_size = csi_enum_frame_size,
1880        .enum_frame_interval = csi_enum_frame_interval,
1881        .get_fmt = csi_get_fmt,
1882        .set_fmt = csi_set_fmt,
1883        .get_selection = csi_get_selection,
1884        .set_selection = csi_set_selection,
1885        .link_validate = csi_link_validate,
1886};
1887
1888static const struct v4l2_subdev_ops csi_subdev_ops = {
1889        .core = &csi_core_ops,
1890        .video = &csi_video_ops,
1891        .pad = &csi_pad_ops,
1892};
1893
1894static const struct v4l2_subdev_internal_ops csi_internal_ops = {
1895        .registered = csi_registered,
1896        .unregistered = csi_unregistered,
1897};
1898
1899static int imx_csi_notify_bound(struct v4l2_async_notifier *notifier,
1900                                struct v4l2_subdev *sd,
1901                                struct v4l2_async_subdev *asd)
1902{
1903        struct csi_priv *priv = notifier_to_dev(notifier);
1904        struct media_pad *sink = &priv->sd.entity.pads[CSI_SINK_PAD];
1905
1906        /*
1907         * If the subdev is a video mux, it must be one of the CSI
1908         * muxes. Mark it as such via its group id.
1909         */
1910        if (sd->entity.function == MEDIA_ENT_F_VID_MUX)
1911                sd->grp_id = IMX_MEDIA_GRP_ID_CSI_MUX;
1912
1913        return v4l2_create_fwnode_links_to_pad(sd, sink, 0);
1914}
1915
1916static const struct v4l2_async_notifier_operations csi_notify_ops = {
1917        .bound = imx_csi_notify_bound,
1918};
1919
1920static int imx_csi_async_register(struct csi_priv *priv)
1921{
1922        struct v4l2_async_subdev *asd = NULL;
1923        struct fwnode_handle *ep;
1924        unsigned int port;
1925        int ret;
1926
1927        v4l2_async_notifier_init(&priv->notifier);
1928
1929        /* get this CSI's port id */
1930        ret = fwnode_property_read_u32(dev_fwnode(priv->dev), "reg", &port);
1931        if (ret < 0)
1932                return ret;
1933
1934        ep = fwnode_graph_get_endpoint_by_id(dev_fwnode(priv->dev->parent),
1935                                             port, 0,
1936                                             FWNODE_GRAPH_ENDPOINT_NEXT);
1937        if (ep) {
1938                asd = v4l2_async_notifier_add_fwnode_remote_subdev(
1939                        &priv->notifier, ep, struct v4l2_async_subdev);
1940
1941                fwnode_handle_put(ep);
1942
1943                if (IS_ERR(asd)) {
1944                        ret = PTR_ERR(asd);
1945                        /* OK if asd already exists */
1946                        if (ret != -EEXIST)
1947                                return ret;
1948                }
1949        }
1950
1951        priv->notifier.ops = &csi_notify_ops;
1952
1953        ret = v4l2_async_subdev_notifier_register(&priv->sd,
1954                                                  &priv->notifier);
1955        if (ret)
1956                return ret;
1957
1958        return v4l2_async_register_subdev(&priv->sd);
1959}
1960
1961static int imx_csi_probe(struct platform_device *pdev)
1962{
1963        struct ipu_client_platformdata *pdata;
1964        struct pinctrl *pinctrl;
1965        struct csi_priv *priv;
1966        int i, ret;
1967
1968        priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
1969        if (!priv)
1970                return -ENOMEM;
1971
1972        platform_set_drvdata(pdev, &priv->sd);
1973        priv->dev = &pdev->dev;
1974
1975        ret = dma_set_coherent_mask(priv->dev, DMA_BIT_MASK(32));
1976        if (ret)
1977                return ret;
1978
1979        /* get parent IPU */
1980        priv->ipu = dev_get_drvdata(priv->dev->parent);
1981
1982        /* get our CSI id */
1983        pdata = priv->dev->platform_data;
1984        priv->csi_id = pdata->csi;
1985        priv->smfc_id = (priv->csi_id == 0) ? 0 : 2;
1986
1987        priv->active_output_pad = CSI_SRC_PAD_IDMAC;
1988
1989        timer_setup(&priv->eof_timeout_timer, csi_idmac_eof_timeout, 0);
1990        spin_lock_init(&priv->irqlock);
1991
1992        v4l2_subdev_init(&priv->sd, &csi_subdev_ops);
1993        v4l2_set_subdevdata(&priv->sd, priv);
1994        priv->sd.internal_ops = &csi_internal_ops;
1995        priv->sd.entity.ops = &csi_entity_ops;
1996        priv->sd.entity.function = MEDIA_ENT_F_PROC_VIDEO_PIXEL_FORMATTER;
1997        priv->sd.dev = &pdev->dev;
1998        priv->sd.fwnode = of_fwnode_handle(pdata->of_node);
1999        priv->sd.owner = THIS_MODULE;
2000        priv->sd.flags = V4L2_SUBDEV_FL_HAS_DEVNODE | V4L2_SUBDEV_FL_HAS_EVENTS;
2001        priv->sd.grp_id = priv->csi_id ?
2002                IMX_MEDIA_GRP_ID_IPU_CSI1 : IMX_MEDIA_GRP_ID_IPU_CSI0;
2003        imx_media_grp_id_to_sd_name(priv->sd.name, sizeof(priv->sd.name),
2004                                    priv->sd.grp_id, ipu_get_num(priv->ipu));
2005
2006        for (i = 0; i < CSI_NUM_PADS; i++)
2007                priv->pad[i].flags = (i == CSI_SINK_PAD) ?
2008                        MEDIA_PAD_FL_SINK : MEDIA_PAD_FL_SOURCE;
2009
2010        ret = media_entity_pads_init(&priv->sd.entity, CSI_NUM_PADS,
2011                                     priv->pad);
2012        if (ret)
2013                return ret;
2014
2015        mutex_init(&priv->lock);
2016
2017        v4l2_ctrl_handler_init(&priv->ctrl_hdlr, 0);
2018        priv->sd.ctrl_handler = &priv->ctrl_hdlr;
2019
2020        /*
2021         * The IPUv3 driver did not assign an of_node to this
2022         * device. As a result, pinctrl does not automatically
2023         * configure our pin groups, so we need to do that manually
2024         * here, after setting this device's of_node.
2025         */
2026        priv->dev->of_node = pdata->of_node;
2027        pinctrl = devm_pinctrl_get_select_default(priv->dev);
2028        if (IS_ERR(pinctrl)) {
2029                ret = PTR_ERR(pinctrl);
2030                dev_dbg(priv->dev,
2031                        "devm_pinctrl_get_select_default() failed: %d\n", ret);
2032                if (ret != -ENODEV)
2033                        goto free;
2034        }
2035
2036        ret = imx_csi_async_register(priv);
2037        if (ret)
2038                goto cleanup;
2039
2040        return 0;
2041
2042cleanup:
2043        v4l2_async_notifier_unregister(&priv->notifier);
2044        v4l2_async_notifier_cleanup(&priv->notifier);
2045free:
2046        v4l2_ctrl_handler_free(&priv->ctrl_hdlr);
2047        mutex_destroy(&priv->lock);
2048        return ret;
2049}
2050
2051static int imx_csi_remove(struct platform_device *pdev)
2052{
2053        struct v4l2_subdev *sd = platform_get_drvdata(pdev);
2054        struct csi_priv *priv = sd_to_dev(sd);
2055
2056        v4l2_ctrl_handler_free(&priv->ctrl_hdlr);
2057        mutex_destroy(&priv->lock);
2058        v4l2_async_notifier_unregister(&priv->notifier);
2059        v4l2_async_notifier_cleanup(&priv->notifier);
2060        v4l2_async_unregister_subdev(sd);
2061        media_entity_cleanup(&sd->entity);
2062
2063        return 0;
2064}
2065
2066static const struct platform_device_id imx_csi_ids[] = {
2067        { .name = "imx-ipuv3-csi" },
2068        { },
2069};
2070MODULE_DEVICE_TABLE(platform, imx_csi_ids);
2071
2072static struct platform_driver imx_csi_driver = {
2073        .probe = imx_csi_probe,
2074        .remove = imx_csi_remove,
2075        .id_table = imx_csi_ids,
2076        .driver = {
2077                .name = "imx-ipuv3-csi",
2078        },
2079};
2080module_platform_driver(imx_csi_driver);
2081
2082MODULE_DESCRIPTION("i.MX CSI subdev driver");
2083MODULE_AUTHOR("Steve Longerbeam <steve_longerbeam@mentor.com>");
2084MODULE_LICENSE("GPL");
2085MODULE_ALIAS("platform:imx-ipuv3-csi");
2086