linux/drivers/media/platform/rcar_fdp1.c
<<
>>
Prefs
   1/*
   2 * Renesas RCar Fine Display Processor
   3 *
   4 * Video format converter and frame deinterlacer device.
   5 *
   6 * Author: Kieran Bingham, <kieran@bingham.xyz>
   7 * Copyright (c) 2016 Renesas Electronics Corporation.
   8 *
   9 * This code is developed and inspired from the vim2m, rcar_jpu,
  10 * m2m-deinterlace, and vsp1 drivers.
  11 *
  12 * This program is free software; you can redistribute it and/or modify
  13 * it under the terms of the GNU General Public License as published by the
  14 * Free Software Foundation; either version 2 of the
  15 * License, or (at your option) any later version
  16 */
  17
  18#include <linux/clk.h>
  19#include <linux/delay.h>
  20#include <linux/dma-mapping.h>
  21#include <linux/fs.h>
  22#include <linux/interrupt.h>
  23#include <linux/module.h>
  24#include <linux/of.h>
  25#include <linux/of_device.h>
  26#include <linux/platform_device.h>
  27#include <linux/pm_runtime.h>
  28#include <linux/sched.h>
  29#include <linux/slab.h>
  30#include <linux/timer.h>
  31#include <media/rcar-fcp.h>
  32#include <media/v4l2-ctrls.h>
  33#include <media/v4l2-device.h>
  34#include <media/v4l2-event.h>
  35#include <media/v4l2-ioctl.h>
  36#include <media/v4l2-mem2mem.h>
  37#include <media/videobuf2-dma-contig.h>
  38
  39static unsigned int debug;
  40module_param(debug, uint, 0644);
  41MODULE_PARM_DESC(debug, "activate debug info");
  42
  43/* Minimum and maximum frame width/height */
  44#define FDP1_MIN_W              80U
  45#define FDP1_MIN_H              80U
  46
  47#define FDP1_MAX_W              3840U
  48#define FDP1_MAX_H              2160U
  49
  50#define FDP1_MAX_PLANES         3U
  51#define FDP1_MAX_STRIDE         8190U
  52
  53/* Flags that indicate a format can be used for capture/output */
  54#define FDP1_CAPTURE            BIT(0)
  55#define FDP1_OUTPUT             BIT(1)
  56
  57#define DRIVER_NAME             "rcar_fdp1"
  58
  59/* Number of Job's to have available on the processing queue */
  60#define FDP1_NUMBER_JOBS 8
  61
  62#define dprintk(fdp1, fmt, arg...) \
  63        v4l2_dbg(1, debug, &fdp1->v4l2_dev, "%s: " fmt, __func__, ## arg)
  64
  65/*
  66 * FDP1 registers and bits
  67 */
  68
  69/* FDP1 start register - Imm */
  70#define FD1_CTL_CMD                     0x0000
  71#define FD1_CTL_CMD_STRCMD              BIT(0)
  72
  73/* Sync generator register - Imm */
  74#define FD1_CTL_SGCMD                   0x0004
  75#define FD1_CTL_SGCMD_SGEN              BIT(0)
  76
  77/* Register set end register - Imm */
  78#define FD1_CTL_REGEND                  0x0008
  79#define FD1_CTL_REGEND_REGEND           BIT(0)
  80
  81/* Channel activation register - Vupdt */
  82#define FD1_CTL_CHACT                   0x000c
  83#define FD1_CTL_CHACT_SMW               BIT(9)
  84#define FD1_CTL_CHACT_WR                BIT(8)
  85#define FD1_CTL_CHACT_SMR               BIT(3)
  86#define FD1_CTL_CHACT_RD2               BIT(2)
  87#define FD1_CTL_CHACT_RD1               BIT(1)
  88#define FD1_CTL_CHACT_RD0               BIT(0)
  89
  90/* Operation Mode Register - Vupdt */
  91#define FD1_CTL_OPMODE                  0x0010
  92#define FD1_CTL_OPMODE_PRG              BIT(4)
  93#define FD1_CTL_OPMODE_VIMD_INTERRUPT   (0 << 0)
  94#define FD1_CTL_OPMODE_VIMD_BESTEFFORT  (1 << 0)
  95#define FD1_CTL_OPMODE_VIMD_NOINTERRUPT (2 << 0)
  96
  97#define FD1_CTL_VPERIOD                 0x0014
  98#define FD1_CTL_CLKCTRL                 0x0018
  99#define FD1_CTL_CLKCTRL_CSTP_N          BIT(0)
 100
 101/* Software reset register */
 102#define FD1_CTL_SRESET                  0x001c
 103#define FD1_CTL_SRESET_SRST             BIT(0)
 104
 105/* Control status register (V-update-status) */
 106#define FD1_CTL_STATUS                  0x0024
 107#define FD1_CTL_STATUS_VINT_CNT_MASK    GENMASK(31, 16)
 108#define FD1_CTL_STATUS_VINT_CNT_SHIFT   16
 109#define FD1_CTL_STATUS_SGREGSET         BIT(10)
 110#define FD1_CTL_STATUS_SGVERR           BIT(9)
 111#define FD1_CTL_STATUS_SGFREND          BIT(8)
 112#define FD1_CTL_STATUS_BSY              BIT(0)
 113
 114#define FD1_CTL_VCYCLE_STAT             0x0028
 115
 116/* Interrupt enable register */
 117#define FD1_CTL_IRQENB                  0x0038
 118/* Interrupt status register */
 119#define FD1_CTL_IRQSTA                  0x003c
 120/* Interrupt control register */
 121#define FD1_CTL_IRQFSET                 0x0040
 122
 123/* Common IRQ Bit settings */
 124#define FD1_CTL_IRQ_VERE                BIT(16)
 125#define FD1_CTL_IRQ_VINTE               BIT(4)
 126#define FD1_CTL_IRQ_FREE                BIT(0)
 127#define FD1_CTL_IRQ_MASK                (FD1_CTL_IRQ_VERE | \
 128                                         FD1_CTL_IRQ_VINTE | \
 129                                         FD1_CTL_IRQ_FREE)
 130
 131/* RPF */
 132#define FD1_RPF_SIZE                    0x0060
 133#define FD1_RPF_SIZE_MASK               GENMASK(12, 0)
 134#define FD1_RPF_SIZE_H_SHIFT            16
 135#define FD1_RPF_SIZE_V_SHIFT            0
 136
 137#define FD1_RPF_FORMAT                  0x0064
 138#define FD1_RPF_FORMAT_CIPM             BIT(16)
 139#define FD1_RPF_FORMAT_RSPYCS           BIT(13)
 140#define FD1_RPF_FORMAT_RSPUVS           BIT(12)
 141#define FD1_RPF_FORMAT_CF               BIT(8)
 142
 143#define FD1_RPF_PSTRIDE                 0x0068
 144#define FD1_RPF_PSTRIDE_Y_SHIFT         16
 145#define FD1_RPF_PSTRIDE_C_SHIFT         0
 146
 147/* RPF0 Source Component Y Address register */
 148#define FD1_RPF0_ADDR_Y                 0x006c
 149
 150/* RPF1 Current Picture Registers */
 151#define FD1_RPF1_ADDR_Y                 0x0078
 152#define FD1_RPF1_ADDR_C0                0x007c
 153#define FD1_RPF1_ADDR_C1                0x0080
 154
 155/* RPF2 next picture register */
 156#define FD1_RPF2_ADDR_Y                 0x0084
 157
 158#define FD1_RPF_SMSK_ADDR               0x0090
 159#define FD1_RPF_SWAP                    0x0094
 160
 161/* WPF */
 162#define FD1_WPF_FORMAT                  0x00c0
 163#define FD1_WPF_FORMAT_PDV_SHIFT        24
 164#define FD1_WPF_FORMAT_FCNL             BIT(20)
 165#define FD1_WPF_FORMAT_WSPYCS           BIT(15)
 166#define FD1_WPF_FORMAT_WSPUVS           BIT(14)
 167#define FD1_WPF_FORMAT_WRTM_601_16      (0 << 9)
 168#define FD1_WPF_FORMAT_WRTM_601_0       (1 << 9)
 169#define FD1_WPF_FORMAT_WRTM_709_16      (2 << 9)
 170#define FD1_WPF_FORMAT_CSC              BIT(8)
 171
 172#define FD1_WPF_RNDCTL                  0x00c4
 173#define FD1_WPF_RNDCTL_CBRM             BIT(28)
 174#define FD1_WPF_RNDCTL_CLMD_NOCLIP      (0 << 12)
 175#define FD1_WPF_RNDCTL_CLMD_CLIP_16_235 (1 << 12)
 176#define FD1_WPF_RNDCTL_CLMD_CLIP_1_254  (2 << 12)
 177
 178#define FD1_WPF_PSTRIDE                 0x00c8
 179#define FD1_WPF_PSTRIDE_Y_SHIFT         16
 180#define FD1_WPF_PSTRIDE_C_SHIFT         0
 181
 182/* WPF Destination picture */
 183#define FD1_WPF_ADDR_Y                  0x00cc
 184#define FD1_WPF_ADDR_C0                 0x00d0
 185#define FD1_WPF_ADDR_C1                 0x00d4
 186#define FD1_WPF_SWAP                    0x00d8
 187#define FD1_WPF_SWAP_OSWAP_SHIFT        0
 188#define FD1_WPF_SWAP_SSWAP_SHIFT        4
 189
 190/* WPF/RPF Common */
 191#define FD1_RWPF_SWAP_BYTE              BIT(0)
 192#define FD1_RWPF_SWAP_WORD              BIT(1)
 193#define FD1_RWPF_SWAP_LWRD              BIT(2)
 194#define FD1_RWPF_SWAP_LLWD              BIT(3)
 195
 196/* IPC */
 197#define FD1_IPC_MODE                    0x0100
 198#define FD1_IPC_MODE_DLI                BIT(8)
 199#define FD1_IPC_MODE_DIM_ADAPT2D3D      (0 << 0)
 200#define FD1_IPC_MODE_DIM_FIXED2D        (1 << 0)
 201#define FD1_IPC_MODE_DIM_FIXED3D        (2 << 0)
 202#define FD1_IPC_MODE_DIM_PREVFIELD      (3 << 0)
 203#define FD1_IPC_MODE_DIM_NEXTFIELD      (4 << 0)
 204
 205#define FD1_IPC_SMSK_THRESH             0x0104
 206#define FD1_IPC_SMSK_THRESH_CONST       0x00010002
 207
 208#define FD1_IPC_COMB_DET                0x0108
 209#define FD1_IPC_COMB_DET_CONST          0x00200040
 210
 211#define FD1_IPC_MOTDEC                  0x010c
 212#define FD1_IPC_MOTDEC_CONST            0x00008020
 213
 214/* DLI registers */
 215#define FD1_IPC_DLI_BLEND               0x0120
 216#define FD1_IPC_DLI_BLEND_CONST         0x0080ff02
 217
 218#define FD1_IPC_DLI_HGAIN               0x0124
 219#define FD1_IPC_DLI_HGAIN_CONST         0x001000ff
 220
 221#define FD1_IPC_DLI_SPRS                0x0128
 222#define FD1_IPC_DLI_SPRS_CONST          0x009004ff
 223
 224#define FD1_IPC_DLI_ANGLE               0x012c
 225#define FD1_IPC_DLI_ANGLE_CONST         0x0004080c
 226
 227#define FD1_IPC_DLI_ISOPIX0             0x0130
 228#define FD1_IPC_DLI_ISOPIX0_CONST       0xff10ff10
 229
 230#define FD1_IPC_DLI_ISOPIX1             0x0134
 231#define FD1_IPC_DLI_ISOPIX1_CONST       0x0000ff10
 232
 233/* Sensor registers */
 234#define FD1_IPC_SENSOR_TH0              0x0140
 235#define FD1_IPC_SENSOR_TH0_CONST        0x20208080
 236
 237#define FD1_IPC_SENSOR_TH1              0x0144
 238#define FD1_IPC_SENSOR_TH1_CONST        0
 239
 240#define FD1_IPC_SENSOR_CTL0             0x0170
 241#define FD1_IPC_SENSOR_CTL0_CONST       0x00002201
 242
 243#define FD1_IPC_SENSOR_CTL1             0x0174
 244#define FD1_IPC_SENSOR_CTL1_CONST       0
 245
 246#define FD1_IPC_SENSOR_CTL2             0x0178
 247#define FD1_IPC_SENSOR_CTL2_X_SHIFT     16
 248#define FD1_IPC_SENSOR_CTL2_Y_SHIFT     0
 249
 250#define FD1_IPC_SENSOR_CTL3             0x017c
 251#define FD1_IPC_SENSOR_CTL3_0_SHIFT     16
 252#define FD1_IPC_SENSOR_CTL3_1_SHIFT     0
 253
 254/* Line memory pixel number register */
 255#define FD1_IPC_LMEM                    0x01e0
 256#define FD1_IPC_LMEM_LINEAR             1024
 257#define FD1_IPC_LMEM_TILE               960
 258
 259/* Internal Data (HW Version) */
 260#define FD1_IP_INTDATA                  0x0800
 261#define FD1_IP_H3                       0x02010101
 262#define FD1_IP_M3W                      0x02010202
 263
 264/* LUTs */
 265#define FD1_LUT_DIF_ADJ                 0x1000
 266#define FD1_LUT_SAD_ADJ                 0x1400
 267#define FD1_LUT_BLD_GAIN                0x1800
 268#define FD1_LUT_DIF_GAIN                0x1c00
 269#define FD1_LUT_MDET                    0x2000
 270
 271/**
 272 * struct fdp1_fmt - The FDP1 internal format data
 273 * @fourcc: the fourcc code, to match the V4L2 API
 274 * @bpp: bits per pixel per plane
 275 * @num_planes: number of planes
 276 * @hsub: horizontal subsampling factor
 277 * @vsub: vertical subsampling factor
 278 * @fmt: 7-bit format code for the fdp1 hardware
 279 * @swap_yc: the Y and C components are swapped (Y comes before C)
 280 * @swap_uv: the U and V components are swapped (V comes before U)
 281 * @swap: swap register control
 282 * @types: types of queue this format is applicable to
 283 */
 284struct fdp1_fmt {
 285        u32     fourcc;
 286        u8      bpp[3];
 287        u8      num_planes;
 288        u8      hsub;
 289        u8      vsub;
 290        u8      fmt;
 291        bool    swap_yc;
 292        bool    swap_uv;
 293        u8      swap;
 294        u8      types;
 295};
 296
 297static const struct fdp1_fmt fdp1_formats[] = {
 298        /* RGB formats are only supported by the Write Pixel Formatter */
 299
 300        { V4L2_PIX_FMT_RGB332, { 8, 0, 0 }, 1, 1, 1, 0x00, false, false,
 301          FD1_RWPF_SWAP_LLWD | FD1_RWPF_SWAP_LWRD |
 302          FD1_RWPF_SWAP_WORD | FD1_RWPF_SWAP_BYTE,
 303          FDP1_CAPTURE },
 304        { V4L2_PIX_FMT_XRGB444, { 16, 0, 0 }, 1, 1, 1, 0x01, false, false,
 305          FD1_RWPF_SWAP_LLWD | FD1_RWPF_SWAP_LWRD |
 306          FD1_RWPF_SWAP_WORD,
 307          FDP1_CAPTURE },
 308        { V4L2_PIX_FMT_XRGB555, { 16, 0, 0 }, 1, 1, 1, 0x04, false, false,
 309          FD1_RWPF_SWAP_LLWD | FD1_RWPF_SWAP_LWRD |
 310          FD1_RWPF_SWAP_WORD,
 311          FDP1_CAPTURE },
 312        { V4L2_PIX_FMT_RGB565, { 16, 0, 0 }, 1, 1, 1, 0x06, false, false,
 313          FD1_RWPF_SWAP_LLWD | FD1_RWPF_SWAP_LWRD |
 314          FD1_RWPF_SWAP_WORD,
 315          FDP1_CAPTURE },
 316        { V4L2_PIX_FMT_ABGR32, { 32, 0, 0 }, 1, 1, 1, 0x13, false, false,
 317          FD1_RWPF_SWAP_LLWD | FD1_RWPF_SWAP_LWRD,
 318          FDP1_CAPTURE },
 319        { V4L2_PIX_FMT_XBGR32, { 32, 0, 0 }, 1, 1, 1, 0x13, false, false,
 320          FD1_RWPF_SWAP_LLWD | FD1_RWPF_SWAP_LWRD,
 321          FDP1_CAPTURE },
 322        { V4L2_PIX_FMT_ARGB32, { 32, 0, 0 }, 1, 1, 1, 0x13, false, false,
 323          FD1_RWPF_SWAP_LLWD | FD1_RWPF_SWAP_LWRD |
 324          FD1_RWPF_SWAP_WORD | FD1_RWPF_SWAP_BYTE,
 325          FDP1_CAPTURE },
 326        { V4L2_PIX_FMT_XRGB32, { 32, 0, 0 }, 1, 1, 1, 0x13, false, false,
 327          FD1_RWPF_SWAP_LLWD | FD1_RWPF_SWAP_LWRD |
 328          FD1_RWPF_SWAP_WORD | FD1_RWPF_SWAP_BYTE,
 329          FDP1_CAPTURE },
 330        { V4L2_PIX_FMT_RGB24, { 24, 0, 0 }, 1, 1, 1, 0x15, false, false,
 331          FD1_RWPF_SWAP_LLWD | FD1_RWPF_SWAP_LWRD |
 332          FD1_RWPF_SWAP_WORD | FD1_RWPF_SWAP_BYTE,
 333          FDP1_CAPTURE },
 334        { V4L2_PIX_FMT_BGR24, { 24, 0, 0 }, 1, 1, 1, 0x18, false, false,
 335          FD1_RWPF_SWAP_LLWD | FD1_RWPF_SWAP_LWRD |
 336          FD1_RWPF_SWAP_WORD | FD1_RWPF_SWAP_BYTE,
 337          FDP1_CAPTURE },
 338        { V4L2_PIX_FMT_ARGB444, { 16, 0, 0 }, 1, 1, 1, 0x19, false, false,
 339          FD1_RWPF_SWAP_LLWD | FD1_RWPF_SWAP_LWRD |
 340          FD1_RWPF_SWAP_WORD,
 341          FDP1_CAPTURE },
 342        { V4L2_PIX_FMT_ARGB555, { 16, 0, 0 }, 1, 1, 1, 0x1b, false, false,
 343          FD1_RWPF_SWAP_LLWD | FD1_RWPF_SWAP_LWRD |
 344          FD1_RWPF_SWAP_WORD,
 345          FDP1_CAPTURE },
 346
 347        /* YUV Formats are supported by Read and Write Pixel Formatters */
 348
 349        { V4L2_PIX_FMT_NV16M, { 8, 16, 0 }, 2, 2, 1, 0x41, false, false,
 350          FD1_RWPF_SWAP_LLWD | FD1_RWPF_SWAP_LWRD |
 351          FD1_RWPF_SWAP_WORD | FD1_RWPF_SWAP_BYTE,
 352          FDP1_CAPTURE | FDP1_OUTPUT },
 353        { V4L2_PIX_FMT_NV61M, { 8, 16, 0 }, 2, 2, 1, 0x41, false, true,
 354          FD1_RWPF_SWAP_LLWD | FD1_RWPF_SWAP_LWRD |
 355          FD1_RWPF_SWAP_WORD | FD1_RWPF_SWAP_BYTE,
 356          FDP1_CAPTURE | FDP1_OUTPUT },
 357        { V4L2_PIX_FMT_NV12M, { 8, 16, 0 }, 2, 2, 2, 0x42, false, false,
 358          FD1_RWPF_SWAP_LLWD | FD1_RWPF_SWAP_LWRD |
 359          FD1_RWPF_SWAP_WORD | FD1_RWPF_SWAP_BYTE,
 360          FDP1_CAPTURE | FDP1_OUTPUT },
 361        { V4L2_PIX_FMT_NV21M, { 8, 16, 0 }, 2, 2, 2, 0x42, false, true,
 362          FD1_RWPF_SWAP_LLWD | FD1_RWPF_SWAP_LWRD |
 363          FD1_RWPF_SWAP_WORD | FD1_RWPF_SWAP_BYTE,
 364          FDP1_CAPTURE | FDP1_OUTPUT },
 365        { V4L2_PIX_FMT_UYVY, { 16, 0, 0 }, 1, 2, 1, 0x47, false, false,
 366          FD1_RWPF_SWAP_LLWD | FD1_RWPF_SWAP_LWRD |
 367          FD1_RWPF_SWAP_WORD | FD1_RWPF_SWAP_BYTE,
 368          FDP1_CAPTURE | FDP1_OUTPUT },
 369        { V4L2_PIX_FMT_VYUY, { 16, 0, 0 }, 1, 2, 1, 0x47, false, true,
 370          FD1_RWPF_SWAP_LLWD | FD1_RWPF_SWAP_LWRD |
 371          FD1_RWPF_SWAP_WORD | FD1_RWPF_SWAP_BYTE,
 372          FDP1_CAPTURE | FDP1_OUTPUT },
 373        { V4L2_PIX_FMT_YUYV, { 16, 0, 0 }, 1, 2, 1, 0x47, true, false,
 374          FD1_RWPF_SWAP_LLWD | FD1_RWPF_SWAP_LWRD |
 375          FD1_RWPF_SWAP_WORD | FD1_RWPF_SWAP_BYTE,
 376          FDP1_CAPTURE | FDP1_OUTPUT },
 377        { V4L2_PIX_FMT_YVYU, { 16, 0, 0 }, 1, 2, 1, 0x47, true, true,
 378          FD1_RWPF_SWAP_LLWD | FD1_RWPF_SWAP_LWRD |
 379          FD1_RWPF_SWAP_WORD | FD1_RWPF_SWAP_BYTE,
 380          FDP1_CAPTURE | FDP1_OUTPUT },
 381        { V4L2_PIX_FMT_YUV444M, { 8, 8, 8 }, 3, 1, 1, 0x4a, false, false,
 382          FD1_RWPF_SWAP_LLWD | FD1_RWPF_SWAP_LWRD |
 383          FD1_RWPF_SWAP_WORD | FD1_RWPF_SWAP_BYTE,
 384          FDP1_CAPTURE | FDP1_OUTPUT },
 385        { V4L2_PIX_FMT_YVU444M, { 8, 8, 8 }, 3, 1, 1, 0x4a, false, true,
 386          FD1_RWPF_SWAP_LLWD | FD1_RWPF_SWAP_LWRD |
 387          FD1_RWPF_SWAP_WORD | FD1_RWPF_SWAP_BYTE,
 388          FDP1_CAPTURE | FDP1_OUTPUT },
 389        { V4L2_PIX_FMT_YUV422M, { 8, 8, 8 }, 3, 2, 1, 0x4b, false, false,
 390          FD1_RWPF_SWAP_LLWD | FD1_RWPF_SWAP_LWRD |
 391          FD1_RWPF_SWAP_WORD | FD1_RWPF_SWAP_BYTE,
 392          FDP1_CAPTURE | FDP1_OUTPUT },
 393        { V4L2_PIX_FMT_YVU422M, { 8, 8, 8 }, 3, 2, 1, 0x4b, false, true,
 394          FD1_RWPF_SWAP_LLWD | FD1_RWPF_SWAP_LWRD |
 395          FD1_RWPF_SWAP_WORD | FD1_RWPF_SWAP_BYTE,
 396          FDP1_CAPTURE | FDP1_OUTPUT },
 397        { V4L2_PIX_FMT_YUV420M, { 8, 8, 8 }, 3, 2, 2, 0x4c, false, false,
 398          FD1_RWPF_SWAP_LLWD | FD1_RWPF_SWAP_LWRD |
 399          FD1_RWPF_SWAP_WORD | FD1_RWPF_SWAP_BYTE,
 400          FDP1_CAPTURE | FDP1_OUTPUT },
 401        { V4L2_PIX_FMT_YVU420M, { 8, 8, 8 }, 3, 2, 2, 0x4c, false, true,
 402          FD1_RWPF_SWAP_LLWD | FD1_RWPF_SWAP_LWRD |
 403          FD1_RWPF_SWAP_WORD | FD1_RWPF_SWAP_BYTE,
 404          FDP1_CAPTURE | FDP1_OUTPUT },
 405};
 406
 407static int fdp1_fmt_is_rgb(const struct fdp1_fmt *fmt)
 408{
 409        return fmt->fmt <= 0x1b; /* Last RGB code */
 410}
 411
 412/*
 413 * FDP1 Lookup tables range from 0...255 only
 414 *
 415 * Each table must be less than 256 entries, and all tables
 416 * are padded out to 256 entries by duplicating the last value.
 417 */
 418static const u8 fdp1_diff_adj[] = {
 419        0x00, 0x24, 0x43, 0x5e, 0x76, 0x8c, 0x9e, 0xaf,
 420        0xbd, 0xc9, 0xd4, 0xdd, 0xe4, 0xea, 0xef, 0xf3,
 421        0xf6, 0xf9, 0xfb, 0xfc, 0xfd, 0xfe, 0xfe, 0xff,
 422};
 423
 424static const u8 fdp1_sad_adj[] = {
 425        0x00, 0x24, 0x43, 0x5e, 0x76, 0x8c, 0x9e, 0xaf,
 426        0xbd, 0xc9, 0xd4, 0xdd, 0xe4, 0xea, 0xef, 0xf3,
 427        0xf6, 0xf9, 0xfb, 0xfc, 0xfd, 0xfe, 0xfe, 0xff,
 428};
 429
 430static const u8 fdp1_bld_gain[] = {
 431        0x80,
 432};
 433
 434static const u8 fdp1_dif_gain[] = {
 435        0x80,
 436};
 437
 438static const u8 fdp1_mdet[] = {
 439        0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
 440        0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
 441        0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
 442        0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
 443        0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
 444        0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
 445        0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
 446        0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
 447        0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
 448        0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
 449        0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
 450        0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
 451        0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
 452        0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
 453        0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
 454        0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
 455        0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
 456        0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
 457        0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
 458        0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
 459        0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
 460        0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
 461        0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
 462        0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
 463        0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
 464        0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
 465        0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
 466        0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
 467        0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
 468        0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
 469        0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
 470        0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
 471};
 472
 473/* Per-queue, driver-specific private data */
 474struct fdp1_q_data {
 475        const struct fdp1_fmt           *fmt;
 476        struct v4l2_pix_format_mplane   format;
 477
 478        unsigned int                    vsize;
 479        unsigned int                    stride_y;
 480        unsigned int                    stride_c;
 481};
 482
 483static const struct fdp1_fmt *fdp1_find_format(u32 pixelformat)
 484{
 485        const struct fdp1_fmt *fmt;
 486        unsigned int i;
 487
 488        for (i = 0; i < ARRAY_SIZE(fdp1_formats); i++) {
 489                fmt = &fdp1_formats[i];
 490                if (fmt->fourcc == pixelformat)
 491                        return fmt;
 492        }
 493
 494        return NULL;
 495}
 496
 497enum fdp1_deint_mode {
 498        FDP1_PROGRESSIVE = 0, /* Must be zero when !deinterlacing */
 499        FDP1_ADAPT2D3D,
 500        FDP1_FIXED2D,
 501        FDP1_FIXED3D,
 502        FDP1_PREVFIELD,
 503        FDP1_NEXTFIELD,
 504};
 505
 506#define FDP1_DEINT_MODE_USES_NEXT(mode) \
 507        (mode == FDP1_ADAPT2D3D || \
 508         mode == FDP1_FIXED3D   || \
 509         mode == FDP1_NEXTFIELD)
 510
 511#define FDP1_DEINT_MODE_USES_PREV(mode) \
 512        (mode == FDP1_ADAPT2D3D || \
 513         mode == FDP1_FIXED3D   || \
 514         mode == FDP1_PREVFIELD)
 515
 516/*
 517 * FDP1 operates on potentially 3 fields, which are tracked
 518 * from the VB buffers using this context structure.
 519 * Will always be a field or a full frame, never two fields.
 520 */
 521struct fdp1_field_buffer {
 522        struct vb2_v4l2_buffer          *vb;
 523        dma_addr_t                      addrs[3];
 524
 525        /* Should be NONE:TOP:BOTTOM only */
 526        enum v4l2_field                 field;
 527
 528        /* Flag to indicate this is the last field in the vb */
 529        bool                            last_field;
 530
 531        /* Buffer queue lists */
 532        struct list_head                list;
 533};
 534
 535struct fdp1_buffer {
 536        struct v4l2_m2m_buffer          m2m_buf;
 537        struct fdp1_field_buffer        fields[2];
 538        unsigned int                    num_fields;
 539};
 540
 541static inline struct fdp1_buffer *to_fdp1_buffer(struct vb2_v4l2_buffer *vb)
 542{
 543        return container_of(vb, struct fdp1_buffer, m2m_buf.vb);
 544}
 545
 546struct fdp1_job {
 547        struct fdp1_field_buffer        *previous;
 548        struct fdp1_field_buffer        *active;
 549        struct fdp1_field_buffer        *next;
 550        struct fdp1_field_buffer        *dst;
 551
 552        /* A job can only be on one list at a time */
 553        struct list_head                list;
 554};
 555
 556struct fdp1_dev {
 557        struct v4l2_device              v4l2_dev;
 558        struct video_device             vfd;
 559
 560        struct mutex                    dev_mutex;
 561        spinlock_t                      irqlock;
 562        spinlock_t                      device_process_lock;
 563
 564        void __iomem                    *regs;
 565        unsigned int                    irq;
 566        struct device                   *dev;
 567
 568        /* Job Queues */
 569        struct fdp1_job                 jobs[FDP1_NUMBER_JOBS];
 570        struct list_head                free_job_list;
 571        struct list_head                queued_job_list;
 572        struct list_head                hw_job_list;
 573
 574        unsigned int                    clk_rate;
 575
 576        struct rcar_fcp_device          *fcp;
 577        struct v4l2_m2m_dev             *m2m_dev;
 578};
 579
 580struct fdp1_ctx {
 581        struct v4l2_fh                  fh;
 582        struct fdp1_dev                 *fdp1;
 583
 584        struct v4l2_ctrl_handler        hdl;
 585        unsigned int                    sequence;
 586
 587        /* Processed buffers in this transaction */
 588        u8                              num_processed;
 589
 590        /* Transaction length (i.e. how many buffers per transaction) */
 591        u32                             translen;
 592
 593        /* Abort requested by m2m */
 594        int                             aborting;
 595
 596        /* Deinterlace processing mode */
 597        enum fdp1_deint_mode            deint_mode;
 598
 599        /*
 600         * Adaptive 2D/3D mode uses a shared mask
 601         * This is allocated at streamon, if the ADAPT2D3D mode
 602         * is requested
 603         */
 604        unsigned int                    smsk_size;
 605        dma_addr_t                      smsk_addr[2];
 606        void                            *smsk_cpu;
 607
 608        /* Capture pipeline, can specify an alpha value
 609         * for supported formats. 0-255 only
 610         */
 611        unsigned char                   alpha;
 612
 613        /* Source and destination queue data */
 614        struct fdp1_q_data              out_q; /* HW Source */
 615        struct fdp1_q_data              cap_q; /* HW Destination */
 616
 617        /*
 618         * Field Queues
 619         * Interlaced fields are used on 3 occasions, and tracked in this list.
 620         *
 621         * V4L2 Buffers are tracked inside the fdp1_buffer
 622         * and released when the last 'field' completes
 623         */
 624        struct list_head                fields_queue;
 625        unsigned int                    buffers_queued;
 626
 627        /*
 628         * For de-interlacing we need to track our previous buffer
 629         * while preparing our job lists.
 630         */
 631        struct fdp1_field_buffer        *previous;
 632};
 633
 634static inline struct fdp1_ctx *fh_to_ctx(struct v4l2_fh *fh)
 635{
 636        return container_of(fh, struct fdp1_ctx, fh);
 637}
 638
 639static struct fdp1_q_data *get_q_data(struct fdp1_ctx *ctx,
 640                                         enum v4l2_buf_type type)
 641{
 642        if (V4L2_TYPE_IS_OUTPUT(type))
 643                return &ctx->out_q;
 644        else
 645                return &ctx->cap_q;
 646}
 647
 648/*
 649 * list_remove_job: Take the first item off the specified job list
 650 *
 651 * Returns: pointer to a job, or NULL if the list is empty.
 652 */
 653static struct fdp1_job *list_remove_job(struct fdp1_dev *fdp1,
 654                                         struct list_head *list)
 655{
 656        struct fdp1_job *job;
 657        unsigned long flags;
 658
 659        spin_lock_irqsave(&fdp1->irqlock, flags);
 660        job = list_first_entry_or_null(list, struct fdp1_job, list);
 661        if (job)
 662                list_del(&job->list);
 663        spin_unlock_irqrestore(&fdp1->irqlock, flags);
 664
 665        return job;
 666}
 667
 668/*
 669 * list_add_job: Add a job to the specified job list
 670 *
 671 * Returns: void - always succeeds
 672 */
 673static void list_add_job(struct fdp1_dev *fdp1,
 674                         struct list_head *list,
 675                         struct fdp1_job *job)
 676{
 677        unsigned long flags;
 678
 679        spin_lock_irqsave(&fdp1->irqlock, flags);
 680        list_add_tail(&job->list, list);
 681        spin_unlock_irqrestore(&fdp1->irqlock, flags);
 682}
 683
 684static struct fdp1_job *fdp1_job_alloc(struct fdp1_dev *fdp1)
 685{
 686        return list_remove_job(fdp1, &fdp1->free_job_list);
 687}
 688
 689static void fdp1_job_free(struct fdp1_dev *fdp1, struct fdp1_job *job)
 690{
 691        /* Ensure that all residue from previous jobs is gone */
 692        memset(job, 0, sizeof(struct fdp1_job));
 693
 694        list_add_job(fdp1, &fdp1->free_job_list, job);
 695}
 696
 697static void queue_job(struct fdp1_dev *fdp1, struct fdp1_job *job)
 698{
 699        list_add_job(fdp1, &fdp1->queued_job_list, job);
 700}
 701
 702static struct fdp1_job *get_queued_job(struct fdp1_dev *fdp1)
 703{
 704        return list_remove_job(fdp1, &fdp1->queued_job_list);
 705}
 706
 707static void queue_hw_job(struct fdp1_dev *fdp1, struct fdp1_job *job)
 708{
 709        list_add_job(fdp1, &fdp1->hw_job_list, job);
 710}
 711
 712static struct fdp1_job *get_hw_queued_job(struct fdp1_dev *fdp1)
 713{
 714        return list_remove_job(fdp1, &fdp1->hw_job_list);
 715}
 716
 717/*
 718 * Buffer lists handling
 719 */
 720static void fdp1_field_complete(struct fdp1_ctx *ctx,
 721                                struct fdp1_field_buffer *fbuf)
 722{
 723        /* job->previous may be on the first field */
 724        if (!fbuf)
 725                return;
 726
 727        if (fbuf->last_field)
 728                v4l2_m2m_buf_done(fbuf->vb, VB2_BUF_STATE_DONE);
 729}
 730
 731static void fdp1_queue_field(struct fdp1_ctx *ctx,
 732                             struct fdp1_field_buffer *fbuf)
 733{
 734        unsigned long flags;
 735
 736        spin_lock_irqsave(&ctx->fdp1->irqlock, flags);
 737        list_add_tail(&fbuf->list, &ctx->fields_queue);
 738        spin_unlock_irqrestore(&ctx->fdp1->irqlock, flags);
 739
 740        ctx->buffers_queued++;
 741}
 742
 743static struct fdp1_field_buffer *fdp1_dequeue_field(struct fdp1_ctx *ctx)
 744{
 745        struct fdp1_field_buffer *fbuf;
 746        unsigned long flags;
 747
 748        ctx->buffers_queued--;
 749
 750        spin_lock_irqsave(&ctx->fdp1->irqlock, flags);
 751        fbuf = list_first_entry_or_null(&ctx->fields_queue,
 752                                        struct fdp1_field_buffer, list);
 753        if (fbuf)
 754                list_del(&fbuf->list);
 755        spin_unlock_irqrestore(&ctx->fdp1->irqlock, flags);
 756
 757        return fbuf;
 758}
 759
 760/*
 761 * Return the next field in the queue - or NULL,
 762 * without removing the item from the list
 763 */
 764static struct fdp1_field_buffer *fdp1_peek_queued_field(struct fdp1_ctx *ctx)
 765{
 766        struct fdp1_field_buffer *fbuf;
 767        unsigned long flags;
 768
 769        spin_lock_irqsave(&ctx->fdp1->irqlock, flags);
 770        fbuf = list_first_entry_or_null(&ctx->fields_queue,
 771                                        struct fdp1_field_buffer, list);
 772        spin_unlock_irqrestore(&ctx->fdp1->irqlock, flags);
 773
 774        return fbuf;
 775}
 776
 777static u32 fdp1_read(struct fdp1_dev *fdp1, unsigned int reg)
 778{
 779        u32 value = ioread32(fdp1->regs + reg);
 780
 781        if (debug >= 2)
 782                dprintk(fdp1, "Read 0x%08x from 0x%04x\n", value, reg);
 783
 784        return value;
 785}
 786
 787static void fdp1_write(struct fdp1_dev *fdp1, u32 val, unsigned int reg)
 788{
 789        if (debug >= 2)
 790                dprintk(fdp1, "Write 0x%08x to 0x%04x\n", val, reg);
 791
 792        iowrite32(val, fdp1->regs + reg);
 793}
 794
 795/* IPC registers are to be programmed with constant values */
 796static void fdp1_set_ipc_dli(struct fdp1_ctx *ctx)
 797{
 798        struct fdp1_dev *fdp1 = ctx->fdp1;
 799
 800        fdp1_write(fdp1, FD1_IPC_SMSK_THRESH_CONST,     FD1_IPC_SMSK_THRESH);
 801        fdp1_write(fdp1, FD1_IPC_COMB_DET_CONST,        FD1_IPC_COMB_DET);
 802        fdp1_write(fdp1, FD1_IPC_MOTDEC_CONST,  FD1_IPC_MOTDEC);
 803
 804        fdp1_write(fdp1, FD1_IPC_DLI_BLEND_CONST,       FD1_IPC_DLI_BLEND);
 805        fdp1_write(fdp1, FD1_IPC_DLI_HGAIN_CONST,       FD1_IPC_DLI_HGAIN);
 806        fdp1_write(fdp1, FD1_IPC_DLI_SPRS_CONST,        FD1_IPC_DLI_SPRS);
 807        fdp1_write(fdp1, FD1_IPC_DLI_ANGLE_CONST,       FD1_IPC_DLI_ANGLE);
 808        fdp1_write(fdp1, FD1_IPC_DLI_ISOPIX0_CONST,     FD1_IPC_DLI_ISOPIX0);
 809        fdp1_write(fdp1, FD1_IPC_DLI_ISOPIX1_CONST,     FD1_IPC_DLI_ISOPIX1);
 810}
 811
 812
 813static void fdp1_set_ipc_sensor(struct fdp1_ctx *ctx)
 814{
 815        struct fdp1_dev *fdp1 = ctx->fdp1;
 816        struct fdp1_q_data *src_q_data = &ctx->out_q;
 817        unsigned int x0, x1;
 818        unsigned int hsize = src_q_data->format.width;
 819        unsigned int vsize = src_q_data->format.height;
 820
 821        x0 = hsize / 3;
 822        x1 = 2 * hsize / 3;
 823
 824        fdp1_write(fdp1, FD1_IPC_SENSOR_TH0_CONST, FD1_IPC_SENSOR_TH0);
 825        fdp1_write(fdp1, FD1_IPC_SENSOR_TH1_CONST, FD1_IPC_SENSOR_TH1);
 826        fdp1_write(fdp1, FD1_IPC_SENSOR_CTL0_CONST, FD1_IPC_SENSOR_CTL0);
 827        fdp1_write(fdp1, FD1_IPC_SENSOR_CTL1_CONST, FD1_IPC_SENSOR_CTL1);
 828
 829        fdp1_write(fdp1, ((hsize - 1) << FD1_IPC_SENSOR_CTL2_X_SHIFT) |
 830                         ((vsize - 1) << FD1_IPC_SENSOR_CTL2_Y_SHIFT),
 831                         FD1_IPC_SENSOR_CTL2);
 832
 833        fdp1_write(fdp1, (x0 << FD1_IPC_SENSOR_CTL3_0_SHIFT) |
 834                         (x1 << FD1_IPC_SENSOR_CTL3_1_SHIFT),
 835                         FD1_IPC_SENSOR_CTL3);
 836}
 837
 838/*
 839 * fdp1_write_lut: Write a padded LUT to the hw
 840 *
 841 * FDP1 uses constant data for de-interlacing processing,
 842 * with large tables. These hardware tables are all 256 bytes
 843 * long, however they often contain repeated data at the end.
 844 *
 845 * The last byte of the table is written to all remaining entries.
 846 */
 847static void fdp1_write_lut(struct fdp1_dev *fdp1, const u8 *lut,
 848                           unsigned int len, unsigned int base)
 849{
 850        unsigned int i;
 851        u8 pad;
 852
 853        /* Tables larger than the hw are clipped */
 854        len = min(len, 256u);
 855
 856        for (i = 0; i < len; i++)
 857                fdp1_write(fdp1, lut[i], base + (i*4));
 858
 859        /* Tables are padded with the last entry */
 860        pad = lut[i-1];
 861
 862        for (; i < 256; i++)
 863                fdp1_write(fdp1, pad, base + (i*4));
 864}
 865
 866static void fdp1_set_lut(struct fdp1_dev *fdp1)
 867{
 868        fdp1_write_lut(fdp1, fdp1_diff_adj, ARRAY_SIZE(fdp1_diff_adj),
 869                        FD1_LUT_DIF_ADJ);
 870        fdp1_write_lut(fdp1, fdp1_sad_adj,  ARRAY_SIZE(fdp1_sad_adj),
 871                        FD1_LUT_SAD_ADJ);
 872        fdp1_write_lut(fdp1, fdp1_bld_gain, ARRAY_SIZE(fdp1_bld_gain),
 873                        FD1_LUT_BLD_GAIN);
 874        fdp1_write_lut(fdp1, fdp1_dif_gain, ARRAY_SIZE(fdp1_dif_gain),
 875                        FD1_LUT_DIF_GAIN);
 876        fdp1_write_lut(fdp1, fdp1_mdet, ARRAY_SIZE(fdp1_mdet),
 877                        FD1_LUT_MDET);
 878}
 879
 880static void fdp1_configure_rpf(struct fdp1_ctx *ctx,
 881                               struct fdp1_job *job)
 882{
 883        struct fdp1_dev *fdp1 = ctx->fdp1;
 884        u32 picture_size;
 885        u32 pstride;
 886        u32 format;
 887        u32 smsk_addr;
 888
 889        struct fdp1_q_data *q_data = &ctx->out_q;
 890
 891        /* Picture size is common to Source and Destination frames */
 892        picture_size = (q_data->format.width << FD1_RPF_SIZE_H_SHIFT)
 893                     | (q_data->vsize << FD1_RPF_SIZE_V_SHIFT);
 894
 895        /* Strides */
 896        pstride = q_data->stride_y << FD1_RPF_PSTRIDE_Y_SHIFT;
 897        if (q_data->format.num_planes > 1)
 898                pstride |= q_data->stride_c << FD1_RPF_PSTRIDE_C_SHIFT;
 899
 900        /* Format control */
 901        format = q_data->fmt->fmt;
 902        if (q_data->fmt->swap_yc)
 903                format |= FD1_RPF_FORMAT_RSPYCS;
 904
 905        if (q_data->fmt->swap_uv)
 906                format |= FD1_RPF_FORMAT_RSPUVS;
 907
 908        if (job->active->field == V4L2_FIELD_BOTTOM) {
 909                format |= FD1_RPF_FORMAT_CF; /* Set for Bottom field */
 910                smsk_addr = ctx->smsk_addr[0];
 911        } else {
 912                smsk_addr = ctx->smsk_addr[1];
 913        }
 914
 915        /* Deint mode is non-zero when deinterlacing */
 916        if (ctx->deint_mode)
 917                format |= FD1_RPF_FORMAT_CIPM;
 918
 919        fdp1_write(fdp1, format, FD1_RPF_FORMAT);
 920        fdp1_write(fdp1, q_data->fmt->swap, FD1_RPF_SWAP);
 921        fdp1_write(fdp1, picture_size, FD1_RPF_SIZE);
 922        fdp1_write(fdp1, pstride, FD1_RPF_PSTRIDE);
 923        fdp1_write(fdp1, smsk_addr, FD1_RPF_SMSK_ADDR);
 924
 925        /* Previous Field Channel (CH0) */
 926        if (job->previous)
 927                fdp1_write(fdp1, job->previous->addrs[0], FD1_RPF0_ADDR_Y);
 928
 929        /* Current Field Channel (CH1) */
 930        fdp1_write(fdp1, job->active->addrs[0], FD1_RPF1_ADDR_Y);
 931        fdp1_write(fdp1, job->active->addrs[1], FD1_RPF1_ADDR_C0);
 932        fdp1_write(fdp1, job->active->addrs[2], FD1_RPF1_ADDR_C1);
 933
 934        /* Next Field  Channel (CH2) */
 935        if (job->next)
 936                fdp1_write(fdp1, job->next->addrs[0], FD1_RPF2_ADDR_Y);
 937}
 938
 939static void fdp1_configure_wpf(struct fdp1_ctx *ctx,
 940                               struct fdp1_job *job)
 941{
 942        struct fdp1_dev *fdp1 = ctx->fdp1;
 943        struct fdp1_q_data *src_q_data = &ctx->out_q;
 944        struct fdp1_q_data *q_data = &ctx->cap_q;
 945        u32 pstride;
 946        u32 format;
 947        u32 swap;
 948        u32 rndctl;
 949
 950        pstride = q_data->format.plane_fmt[0].bytesperline
 951                        << FD1_WPF_PSTRIDE_Y_SHIFT;
 952
 953        if (q_data->format.num_planes > 1)
 954                pstride |= q_data->format.plane_fmt[1].bytesperline
 955                        << FD1_WPF_PSTRIDE_C_SHIFT;
 956
 957        format = q_data->fmt->fmt; /* Output Format Code */
 958
 959        if (q_data->fmt->swap_yc)
 960                format |= FD1_WPF_FORMAT_WSPYCS;
 961
 962        if (q_data->fmt->swap_uv)
 963                format |= FD1_WPF_FORMAT_WSPUVS;
 964
 965        if (fdp1_fmt_is_rgb(q_data->fmt)) {
 966                /* Enable Colour Space conversion */
 967                format |= FD1_WPF_FORMAT_CSC;
 968
 969                /* Set WRTM */
 970                if (src_q_data->format.ycbcr_enc == V4L2_YCBCR_ENC_709)
 971                        format |= FD1_WPF_FORMAT_WRTM_709_16;
 972                else if (src_q_data->format.quantization ==
 973                                V4L2_QUANTIZATION_FULL_RANGE)
 974                        format |= FD1_WPF_FORMAT_WRTM_601_0;
 975                else
 976                        format |= FD1_WPF_FORMAT_WRTM_601_16;
 977        }
 978
 979        /* Set an alpha value into the Pad Value */
 980        format |= ctx->alpha << FD1_WPF_FORMAT_PDV_SHIFT;
 981
 982        /* Determine picture rounding and clipping */
 983        rndctl = FD1_WPF_RNDCTL_CBRM; /* Rounding Off */
 984        rndctl |= FD1_WPF_RNDCTL_CLMD_NOCLIP;
 985
 986        /* WPF Swap needs both ISWAP and OSWAP setting */
 987        swap = q_data->fmt->swap << FD1_WPF_SWAP_OSWAP_SHIFT;
 988        swap |= src_q_data->fmt->swap << FD1_WPF_SWAP_SSWAP_SHIFT;
 989
 990        fdp1_write(fdp1, format, FD1_WPF_FORMAT);
 991        fdp1_write(fdp1, rndctl, FD1_WPF_RNDCTL);
 992        fdp1_write(fdp1, swap, FD1_WPF_SWAP);
 993        fdp1_write(fdp1, pstride, FD1_WPF_PSTRIDE);
 994
 995        fdp1_write(fdp1, job->dst->addrs[0], FD1_WPF_ADDR_Y);
 996        fdp1_write(fdp1, job->dst->addrs[1], FD1_WPF_ADDR_C0);
 997        fdp1_write(fdp1, job->dst->addrs[2], FD1_WPF_ADDR_C1);
 998}
 999
1000static void fdp1_configure_deint_mode(struct fdp1_ctx *ctx,
1001                                      struct fdp1_job *job)
1002{
1003        struct fdp1_dev *fdp1 = ctx->fdp1;
1004        u32 opmode = FD1_CTL_OPMODE_VIMD_NOINTERRUPT;
1005        u32 ipcmode = FD1_IPC_MODE_DLI; /* Always set */
1006        u32 channels = FD1_CTL_CHACT_WR | FD1_CTL_CHACT_RD1; /* Always on */
1007
1008        /* De-interlacing Mode */
1009        switch (ctx->deint_mode) {
1010        default:
1011        case FDP1_PROGRESSIVE:
1012                dprintk(fdp1, "Progressive Mode\n");
1013                opmode |= FD1_CTL_OPMODE_PRG;
1014                ipcmode |= FD1_IPC_MODE_DIM_FIXED2D;
1015                break;
1016        case FDP1_ADAPT2D3D:
1017                dprintk(fdp1, "Adapt2D3D Mode\n");
1018                if (ctx->sequence == 0 || ctx->aborting)
1019                        ipcmode |= FD1_IPC_MODE_DIM_FIXED2D;
1020                else
1021                        ipcmode |= FD1_IPC_MODE_DIM_ADAPT2D3D;
1022
1023                if (ctx->sequence > 1) {
1024                        channels |= FD1_CTL_CHACT_SMW;
1025                        channels |= FD1_CTL_CHACT_RD0 | FD1_CTL_CHACT_RD2;
1026                }
1027
1028                if (ctx->sequence > 2)
1029                        channels |= FD1_CTL_CHACT_SMR;
1030
1031                break;
1032        case FDP1_FIXED3D:
1033                dprintk(fdp1, "Fixed 3D Mode\n");
1034                ipcmode |= FD1_IPC_MODE_DIM_FIXED3D;
1035                /* Except for first and last frame, enable all channels */
1036                if (!(ctx->sequence == 0 || ctx->aborting))
1037                        channels |= FD1_CTL_CHACT_RD0 | FD1_CTL_CHACT_RD2;
1038                break;
1039        case FDP1_FIXED2D:
1040                dprintk(fdp1, "Fixed 2D Mode\n");
1041                ipcmode |= FD1_IPC_MODE_DIM_FIXED2D;
1042                /* No extra channels enabled */
1043                break;
1044        case FDP1_PREVFIELD:
1045                dprintk(fdp1, "Previous Field Mode\n");
1046                ipcmode |= FD1_IPC_MODE_DIM_PREVFIELD;
1047                channels |= FD1_CTL_CHACT_RD0; /* Previous */
1048                break;
1049        case FDP1_NEXTFIELD:
1050                dprintk(fdp1, "Next Field Mode\n");
1051                ipcmode |= FD1_IPC_MODE_DIM_NEXTFIELD;
1052                channels |= FD1_CTL_CHACT_RD2; /* Next */
1053                break;
1054        }
1055
1056        fdp1_write(fdp1, channels,      FD1_CTL_CHACT);
1057        fdp1_write(fdp1, opmode,        FD1_CTL_OPMODE);
1058        fdp1_write(fdp1, ipcmode,       FD1_IPC_MODE);
1059}
1060
1061/*
1062 * fdp1_device_process() - Run the hardware
1063 *
1064 * Configure and start the hardware to generate a single frame
1065 * of output given our input parameters.
1066 */
1067static int fdp1_device_process(struct fdp1_ctx *ctx)
1068
1069{
1070        struct fdp1_dev *fdp1 = ctx->fdp1;
1071        struct fdp1_job *job;
1072        unsigned long flags;
1073
1074        spin_lock_irqsave(&fdp1->device_process_lock, flags);
1075
1076        /* Get a job to process */
1077        job = get_queued_job(fdp1);
1078        if (!job) {
1079                /*
1080                 * VINT can call us to see if we can queue another job.
1081                 * If we have no work to do, we simply return.
1082                 */
1083                spin_unlock_irqrestore(&fdp1->device_process_lock, flags);
1084                return 0;
1085        }
1086
1087        /* First Frame only? ... */
1088        fdp1_write(fdp1, FD1_CTL_CLKCTRL_CSTP_N, FD1_CTL_CLKCTRL);
1089
1090        /* Set the mode, and configuration */
1091        fdp1_configure_deint_mode(ctx, job);
1092
1093        /* DLI Static Configuration */
1094        fdp1_set_ipc_dli(ctx);
1095
1096        /* Sensor Configuration */
1097        fdp1_set_ipc_sensor(ctx);
1098
1099        /* Setup the source picture */
1100        fdp1_configure_rpf(ctx, job);
1101
1102        /* Setup the destination picture */
1103        fdp1_configure_wpf(ctx, job);
1104
1105        /* Line Memory Pixel Number Register for linear access */
1106        fdp1_write(fdp1, FD1_IPC_LMEM_LINEAR, FD1_IPC_LMEM);
1107
1108        /* Enable Interrupts */
1109        fdp1_write(fdp1, FD1_CTL_IRQ_MASK, FD1_CTL_IRQENB);
1110
1111        /* Finally, the Immediate Registers */
1112
1113        /* This job is now in the HW queue */
1114        queue_hw_job(fdp1, job);
1115
1116        /* Start the command */
1117        fdp1_write(fdp1, FD1_CTL_CMD_STRCMD, FD1_CTL_CMD);
1118
1119        /* Registers will update to HW at next VINT */
1120        fdp1_write(fdp1, FD1_CTL_REGEND_REGEND, FD1_CTL_REGEND);
1121
1122        /* Enable VINT Generator */
1123        fdp1_write(fdp1, FD1_CTL_SGCMD_SGEN, FD1_CTL_SGCMD);
1124
1125        spin_unlock_irqrestore(&fdp1->device_process_lock, flags);
1126
1127        return 0;
1128}
1129
1130/*
1131 * mem2mem callbacks
1132 */
1133
1134/**
1135 * job_ready() - check whether an instance is ready to be scheduled to run
1136 */
1137static int fdp1_m2m_job_ready(void *priv)
1138{
1139        struct fdp1_ctx *ctx = priv;
1140        struct fdp1_q_data *src_q_data = &ctx->out_q;
1141        int srcbufs = 1;
1142        int dstbufs = 1;
1143
1144        dprintk(ctx->fdp1, "+ Src: %d : Dst: %d\n",
1145                        v4l2_m2m_num_src_bufs_ready(ctx->fh.m2m_ctx),
1146                        v4l2_m2m_num_dst_bufs_ready(ctx->fh.m2m_ctx));
1147
1148        /* One output buffer is required for each field */
1149        if (V4L2_FIELD_HAS_BOTH(src_q_data->format.field))
1150                dstbufs = 2;
1151
1152        if (v4l2_m2m_num_src_bufs_ready(ctx->fh.m2m_ctx) < srcbufs
1153            || v4l2_m2m_num_dst_bufs_ready(ctx->fh.m2m_ctx) < dstbufs) {
1154                dprintk(ctx->fdp1, "Not enough buffers available\n");
1155                return 0;
1156        }
1157
1158        return 1;
1159}
1160
1161static void fdp1_m2m_job_abort(void *priv)
1162{
1163        struct fdp1_ctx *ctx = priv;
1164
1165        dprintk(ctx->fdp1, "+\n");
1166
1167        /* Will cancel the transaction in the next interrupt handler */
1168        ctx->aborting = 1;
1169
1170        /* Immediate abort sequence */
1171        fdp1_write(ctx->fdp1, 0, FD1_CTL_SGCMD);
1172        fdp1_write(ctx->fdp1, FD1_CTL_SRESET_SRST, FD1_CTL_SRESET);
1173}
1174
1175/*
1176 * fdp1_prepare_job: Prepare and queue a new job for a single action of work
1177 *
1178 * Prepare the next field, (or frame in progressive) and an output
1179 * buffer for the hardware to perform a single operation.
1180 */
1181static struct fdp1_job *fdp1_prepare_job(struct fdp1_ctx *ctx)
1182{
1183        struct vb2_v4l2_buffer *vbuf;
1184        struct fdp1_buffer *fbuf;
1185        struct fdp1_dev *fdp1 = ctx->fdp1;
1186        struct fdp1_job *job;
1187        unsigned int buffers_required = 1;
1188
1189        dprintk(fdp1, "+\n");
1190
1191        if (FDP1_DEINT_MODE_USES_NEXT(ctx->deint_mode))
1192                buffers_required = 2;
1193
1194        if (ctx->buffers_queued < buffers_required)
1195                return NULL;
1196
1197        job = fdp1_job_alloc(fdp1);
1198        if (!job) {
1199                dprintk(fdp1, "No free jobs currently available\n");
1200                return NULL;
1201        }
1202
1203        job->active = fdp1_dequeue_field(ctx);
1204        if (!job->active) {
1205                /* Buffer check should prevent this ever happening */
1206                dprintk(fdp1, "No input buffers currently available\n");
1207
1208                fdp1_job_free(fdp1, job);
1209                return NULL;
1210        }
1211
1212        dprintk(fdp1, "+ Buffer en-route...\n");
1213
1214        /* Source buffers have been prepared on our buffer_queue
1215         * Prepare our Output buffer
1216         */
1217        vbuf = v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx);
1218        fbuf = to_fdp1_buffer(vbuf);
1219        job->dst = &fbuf->fields[0];
1220
1221        job->active->vb->sequence = ctx->sequence;
1222        job->dst->vb->sequence = ctx->sequence;
1223        ctx->sequence++;
1224
1225        if (FDP1_DEINT_MODE_USES_PREV(ctx->deint_mode)) {
1226                job->previous = ctx->previous;
1227
1228                /* Active buffer becomes the next job's previous buffer */
1229                ctx->previous = job->active;
1230        }
1231
1232        if (FDP1_DEINT_MODE_USES_NEXT(ctx->deint_mode)) {
1233                /* Must be called after 'active' is dequeued */
1234                job->next = fdp1_peek_queued_field(ctx);
1235        }
1236
1237        /* Transfer timestamps and flags from src->dst */
1238
1239        job->dst->vb->vb2_buf.timestamp = job->active->vb->vb2_buf.timestamp;
1240
1241        job->dst->vb->flags = job->active->vb->flags &
1242                                V4L2_BUF_FLAG_TSTAMP_SRC_MASK;
1243
1244        /* Ideally, the frame-end function will just 'check' to see
1245         * if there are more jobs instead
1246         */
1247        ctx->translen++;
1248
1249        /* Finally, Put this job on the processing queue */
1250        queue_job(fdp1, job);
1251
1252        dprintk(fdp1, "Job Queued translen = %d\n", ctx->translen);
1253
1254        return job;
1255}
1256
1257/* fdp1_m2m_device_run() - prepares and starts the device for an M2M task
1258 *
1259 * A single input buffer is taken and serialised into our fdp1_buffer
1260 * queue. The queue is then processed to create as many jobs as possible
1261 * from our available input.
1262 */
1263static void fdp1_m2m_device_run(void *priv)
1264{
1265        struct fdp1_ctx *ctx = priv;
1266        struct fdp1_dev *fdp1 = ctx->fdp1;
1267        struct vb2_v4l2_buffer *src_vb;
1268        struct fdp1_buffer *buf;
1269        unsigned int i;
1270
1271        dprintk(fdp1, "+\n");
1272
1273        ctx->translen = 0;
1274
1275        /* Get our incoming buffer of either one or two fields, or one frame */
1276        src_vb = v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx);
1277        buf = to_fdp1_buffer(src_vb);
1278
1279        for (i = 0; i < buf->num_fields; i++) {
1280                struct fdp1_field_buffer *fbuf = &buf->fields[i];
1281
1282                fdp1_queue_field(ctx, fbuf);
1283                dprintk(fdp1, "Queued Buffer [%d] last_field:%d\n",
1284                                i, fbuf->last_field);
1285        }
1286
1287        /* Queue as many jobs as our data provides for */
1288        while (fdp1_prepare_job(ctx))
1289                ;
1290
1291        if (ctx->translen == 0) {
1292                dprintk(fdp1, "No jobs were processed. M2M action complete\n");
1293                v4l2_m2m_job_finish(fdp1->m2m_dev, ctx->fh.m2m_ctx);
1294                return;
1295        }
1296
1297        /* Kick the job processing action */
1298        fdp1_device_process(ctx);
1299}
1300
1301/*
1302 * device_frame_end:
1303 *
1304 * Handles the M2M level after a buffer completion event.
1305 */
1306static void device_frame_end(struct fdp1_dev *fdp1,
1307                             enum vb2_buffer_state state)
1308{
1309        struct fdp1_ctx *ctx;
1310        unsigned long flags;
1311        struct fdp1_job *job = get_hw_queued_job(fdp1);
1312
1313        dprintk(fdp1, "+\n");
1314
1315        ctx = v4l2_m2m_get_curr_priv(fdp1->m2m_dev);
1316
1317        if (ctx == NULL) {
1318                v4l2_err(&fdp1->v4l2_dev,
1319                        "Instance released before the end of transaction\n");
1320                return;
1321        }
1322
1323        ctx->num_processed++;
1324
1325        /*
1326         * fdp1_field_complete will call buf_done only when the last vb2_buffer
1327         * reference is complete
1328         */
1329        if (FDP1_DEINT_MODE_USES_PREV(ctx->deint_mode))
1330                fdp1_field_complete(ctx, job->previous);
1331        else
1332                fdp1_field_complete(ctx, job->active);
1333
1334        spin_lock_irqsave(&fdp1->irqlock, flags);
1335        v4l2_m2m_buf_done(job->dst->vb, state);
1336        job->dst = NULL;
1337        spin_unlock_irqrestore(&fdp1->irqlock, flags);
1338
1339        /* Move this job back to the free job list */
1340        fdp1_job_free(fdp1, job);
1341
1342        dprintk(fdp1, "curr_ctx->num_processed %d curr_ctx->translen %d\n",
1343                        ctx->num_processed, ctx->translen);
1344
1345        if (ctx->num_processed == ctx->translen ||
1346                        ctx->aborting) {
1347                dprintk(ctx->fdp1, "Finishing transaction\n");
1348                ctx->num_processed = 0;
1349                v4l2_m2m_job_finish(fdp1->m2m_dev, ctx->fh.m2m_ctx);
1350        } else {
1351                /*
1352                 * For pipelined performance support, this would
1353                 * be called from a VINT handler
1354                 */
1355                fdp1_device_process(ctx);
1356        }
1357}
1358
1359/*
1360 * video ioctls
1361 */
1362static int fdp1_vidioc_querycap(struct file *file, void *priv,
1363                           struct v4l2_capability *cap)
1364{
1365        strlcpy(cap->driver, DRIVER_NAME, sizeof(cap->driver));
1366        strlcpy(cap->card, DRIVER_NAME, sizeof(cap->card));
1367        snprintf(cap->bus_info, sizeof(cap->bus_info),
1368                        "platform:%s", DRIVER_NAME);
1369        return 0;
1370}
1371
1372static int fdp1_enum_fmt(struct v4l2_fmtdesc *f, u32 type)
1373{
1374        unsigned int i, num;
1375
1376        num = 0;
1377
1378        for (i = 0; i < ARRAY_SIZE(fdp1_formats); ++i) {
1379                if (fdp1_formats[i].types & type) {
1380                        if (num == f->index)
1381                                break;
1382                        ++num;
1383                }
1384        }
1385
1386        /* Format not found */
1387        if (i >= ARRAY_SIZE(fdp1_formats))
1388                return -EINVAL;
1389
1390        /* Format found */
1391        f->pixelformat = fdp1_formats[i].fourcc;
1392
1393        return 0;
1394}
1395
1396static int fdp1_enum_fmt_vid_cap(struct file *file, void *priv,
1397                                 struct v4l2_fmtdesc *f)
1398{
1399        return fdp1_enum_fmt(f, FDP1_CAPTURE);
1400}
1401
1402static int fdp1_enum_fmt_vid_out(struct file *file, void *priv,
1403                                   struct v4l2_fmtdesc *f)
1404{
1405        return fdp1_enum_fmt(f, FDP1_OUTPUT);
1406}
1407
1408static int fdp1_g_fmt(struct file *file, void *priv, struct v4l2_format *f)
1409{
1410        struct fdp1_q_data *q_data;
1411        struct fdp1_ctx *ctx = fh_to_ctx(priv);
1412
1413        if (!v4l2_m2m_get_vq(ctx->fh.m2m_ctx, f->type))
1414                return -EINVAL;
1415
1416        q_data = get_q_data(ctx, f->type);
1417        f->fmt.pix_mp = q_data->format;
1418
1419        return 0;
1420}
1421
1422static void fdp1_compute_stride(struct v4l2_pix_format_mplane *pix,
1423                                const struct fdp1_fmt *fmt)
1424{
1425        unsigned int i;
1426
1427        /* Compute and clamp the stride and image size. */
1428        for (i = 0; i < min_t(unsigned int, fmt->num_planes, 2U); ++i) {
1429                unsigned int hsub = i > 0 ? fmt->hsub : 1;
1430                unsigned int vsub = i > 0 ? fmt->vsub : 1;
1431                 /* From VSP : TODO: Confirm alignment limits for FDP1 */
1432                unsigned int align = 128;
1433                unsigned int bpl;
1434
1435                bpl = clamp_t(unsigned int, pix->plane_fmt[i].bytesperline,
1436                              pix->width / hsub * fmt->bpp[i] / 8,
1437                              round_down(FDP1_MAX_STRIDE, align));
1438
1439                pix->plane_fmt[i].bytesperline = round_up(bpl, align);
1440                pix->plane_fmt[i].sizeimage = pix->plane_fmt[i].bytesperline
1441                                            * pix->height / vsub;
1442
1443                memset(pix->plane_fmt[i].reserved, 0,
1444                       sizeof(pix->plane_fmt[i].reserved));
1445        }
1446
1447        if (fmt->num_planes == 3) {
1448                /* The two chroma planes must have the same stride. */
1449                pix->plane_fmt[2].bytesperline = pix->plane_fmt[1].bytesperline;
1450                pix->plane_fmt[2].sizeimage = pix->plane_fmt[1].sizeimage;
1451
1452                memset(pix->plane_fmt[2].reserved, 0,
1453                       sizeof(pix->plane_fmt[2].reserved));
1454        }
1455}
1456
1457static void fdp1_try_fmt_output(struct fdp1_ctx *ctx,
1458                                const struct fdp1_fmt **fmtinfo,
1459                                struct v4l2_pix_format_mplane *pix)
1460{
1461        const struct fdp1_fmt *fmt;
1462        unsigned int width;
1463        unsigned int height;
1464
1465        /* Validate the pixel format to ensure the output queue supports it. */
1466        fmt = fdp1_find_format(pix->pixelformat);
1467        if (!fmt || !(fmt->types & FDP1_OUTPUT))
1468                fmt = fdp1_find_format(V4L2_PIX_FMT_YUYV);
1469
1470        if (fmtinfo)
1471                *fmtinfo = fmt;
1472
1473        pix->pixelformat = fmt->fourcc;
1474        pix->num_planes = fmt->num_planes;
1475
1476        /*
1477         * Progressive video and all interlaced field orders are acceptable.
1478         * Default to V4L2_FIELD_INTERLACED.
1479         */
1480        if (pix->field != V4L2_FIELD_NONE &&
1481            pix->field != V4L2_FIELD_ALTERNATE &&
1482            !V4L2_FIELD_HAS_BOTH(pix->field))
1483                pix->field = V4L2_FIELD_INTERLACED;
1484
1485        /*
1486         * The deinterlacer doesn't care about the colorspace, accept all values
1487         * and default to V4L2_COLORSPACE_SMPTE170M. The YUV to RGB conversion
1488         * at the output of the deinterlacer supports a subset of encodings and
1489         * quantization methods and will only be available when the colorspace
1490         * allows it.
1491         */
1492        if (pix->colorspace == V4L2_COLORSPACE_DEFAULT)
1493                pix->colorspace = V4L2_COLORSPACE_SMPTE170M;
1494
1495        /*
1496         * Align the width and height for YUV 4:2:2 and 4:2:0 formats and clamp
1497         * them to the supported frame size range. The height boundary are
1498         * related to the full frame, divide them by two when the format passes
1499         * fields in separate buffers.
1500         */
1501        width = round_down(pix->width, fmt->hsub);
1502        pix->width = clamp(width, FDP1_MIN_W, FDP1_MAX_W);
1503
1504        height = round_down(pix->height, fmt->vsub);
1505        if (pix->field == V4L2_FIELD_ALTERNATE)
1506                pix->height = clamp(height, FDP1_MIN_H / 2, FDP1_MAX_H / 2);
1507        else
1508                pix->height = clamp(height, FDP1_MIN_H, FDP1_MAX_H);
1509
1510        fdp1_compute_stride(pix, fmt);
1511}
1512
1513static void fdp1_try_fmt_capture(struct fdp1_ctx *ctx,
1514                                 const struct fdp1_fmt **fmtinfo,
1515                                 struct v4l2_pix_format_mplane *pix)
1516{
1517        struct fdp1_q_data *src_data = &ctx->out_q;
1518        enum v4l2_colorspace colorspace;
1519        enum v4l2_ycbcr_encoding ycbcr_enc;
1520        enum v4l2_quantization quantization;
1521        const struct fdp1_fmt *fmt;
1522        bool allow_rgb;
1523
1524        /*
1525         * Validate the pixel format. We can only accept RGB output formats if
1526         * the input encoding and quantization are compatible with the format
1527         * conversions supported by the hardware. The supported combinations are
1528         *
1529         * V4L2_YCBCR_ENC_601 + V4L2_QUANTIZATION_LIM_RANGE
1530         * V4L2_YCBCR_ENC_601 + V4L2_QUANTIZATION_FULL_RANGE
1531         * V4L2_YCBCR_ENC_709 + V4L2_QUANTIZATION_LIM_RANGE
1532         */
1533        colorspace = src_data->format.colorspace;
1534
1535        ycbcr_enc = src_data->format.ycbcr_enc;
1536        if (ycbcr_enc == V4L2_YCBCR_ENC_DEFAULT)
1537                ycbcr_enc = V4L2_MAP_YCBCR_ENC_DEFAULT(colorspace);
1538
1539        quantization = src_data->format.quantization;
1540        if (quantization == V4L2_QUANTIZATION_DEFAULT)
1541                quantization = V4L2_MAP_QUANTIZATION_DEFAULT(false, colorspace,
1542                                                             ycbcr_enc);
1543
1544        allow_rgb = ycbcr_enc == V4L2_YCBCR_ENC_601 ||
1545                    (ycbcr_enc == V4L2_YCBCR_ENC_709 &&
1546                     quantization == V4L2_QUANTIZATION_LIM_RANGE);
1547
1548        fmt = fdp1_find_format(pix->pixelformat);
1549        if (!fmt || (!allow_rgb && fdp1_fmt_is_rgb(fmt)))
1550                fmt = fdp1_find_format(V4L2_PIX_FMT_YUYV);
1551
1552        if (fmtinfo)
1553                *fmtinfo = fmt;
1554
1555        pix->pixelformat = fmt->fourcc;
1556        pix->num_planes = fmt->num_planes;
1557        pix->field = V4L2_FIELD_NONE;
1558
1559        /*
1560         * The colorspace on the capture queue is copied from the output queue
1561         * as the hardware can't change the colorspace. It can convert YCbCr to
1562         * RGB though, in which case the encoding and quantization are set to
1563         * default values as anything else wouldn't make sense.
1564         */
1565        pix->colorspace = src_data->format.colorspace;
1566        pix->xfer_func = src_data->format.xfer_func;
1567
1568        if (fdp1_fmt_is_rgb(fmt)) {
1569                pix->ycbcr_enc = V4L2_YCBCR_ENC_DEFAULT;
1570                pix->quantization = V4L2_QUANTIZATION_DEFAULT;
1571        } else {
1572                pix->ycbcr_enc = src_data->format.ycbcr_enc;
1573                pix->quantization = src_data->format.quantization;
1574        }
1575
1576        /*
1577         * The frame width is identical to the output queue, and the height is
1578         * either doubled or identical depending on whether the output queue
1579         * field order contains one or two fields per frame.
1580         */
1581        pix->width = src_data->format.width;
1582        if (src_data->format.field == V4L2_FIELD_ALTERNATE)
1583                pix->height = 2 * src_data->format.height;
1584        else
1585                pix->height = src_data->format.height;
1586
1587        fdp1_compute_stride(pix, fmt);
1588}
1589
1590static int fdp1_try_fmt(struct file *file, void *priv, struct v4l2_format *f)
1591{
1592        struct fdp1_ctx *ctx = fh_to_ctx(priv);
1593
1594        if (f->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE)
1595                fdp1_try_fmt_output(ctx, NULL, &f->fmt.pix_mp);
1596        else
1597                fdp1_try_fmt_capture(ctx, NULL, &f->fmt.pix_mp);
1598
1599        dprintk(ctx->fdp1, "Try %s format: %4.4s (0x%08x) %ux%u field %u\n",
1600                V4L2_TYPE_IS_OUTPUT(f->type) ? "output" : "capture",
1601                (char *)&f->fmt.pix_mp.pixelformat, f->fmt.pix_mp.pixelformat,
1602                f->fmt.pix_mp.width, f->fmt.pix_mp.height, f->fmt.pix_mp.field);
1603
1604        return 0;
1605}
1606
1607static void fdp1_set_format(struct fdp1_ctx *ctx,
1608                            struct v4l2_pix_format_mplane *pix,
1609                            enum v4l2_buf_type type)
1610{
1611        struct fdp1_q_data *q_data = get_q_data(ctx, type);
1612        const struct fdp1_fmt *fmtinfo;
1613
1614        if (type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE)
1615                fdp1_try_fmt_output(ctx, &fmtinfo, pix);
1616        else
1617                fdp1_try_fmt_capture(ctx, &fmtinfo, pix);
1618
1619        q_data->fmt = fmtinfo;
1620        q_data->format = *pix;
1621
1622        q_data->vsize = pix->height;
1623        if (pix->field != V4L2_FIELD_NONE)
1624                q_data->vsize /= 2;
1625
1626        q_data->stride_y = pix->plane_fmt[0].bytesperline;
1627        q_data->stride_c = pix->plane_fmt[1].bytesperline;
1628
1629        /* Adjust strides for interleaved buffers */
1630        if (pix->field == V4L2_FIELD_INTERLACED ||
1631            pix->field == V4L2_FIELD_INTERLACED_TB ||
1632            pix->field == V4L2_FIELD_INTERLACED_BT) {
1633                q_data->stride_y *= 2;
1634                q_data->stride_c *= 2;
1635        }
1636
1637        /* Propagate the format from the output node to the capture node. */
1638        if (type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
1639                struct fdp1_q_data *dst_data = &ctx->cap_q;
1640
1641                /*
1642                 * Copy the format, clear the per-plane bytes per line and image
1643                 * size, override the field and double the height if needed.
1644                 */
1645                dst_data->format = q_data->format;
1646                memset(dst_data->format.plane_fmt, 0,
1647                       sizeof(dst_data->format.plane_fmt));
1648
1649                dst_data->format.field = V4L2_FIELD_NONE;
1650                if (pix->field == V4L2_FIELD_ALTERNATE)
1651                        dst_data->format.height *= 2;
1652
1653                fdp1_try_fmt_capture(ctx, &dst_data->fmt, &dst_data->format);
1654
1655                dst_data->vsize = dst_data->format.height;
1656                dst_data->stride_y = dst_data->format.plane_fmt[0].bytesperline;
1657                dst_data->stride_c = dst_data->format.plane_fmt[1].bytesperline;
1658        }
1659}
1660
1661static int fdp1_s_fmt(struct file *file, void *priv, struct v4l2_format *f)
1662{
1663        struct fdp1_ctx *ctx = fh_to_ctx(priv);
1664        struct v4l2_m2m_ctx *m2m_ctx = ctx->fh.m2m_ctx;
1665        struct vb2_queue *vq = v4l2_m2m_get_vq(m2m_ctx, f->type);
1666
1667        if (vb2_is_busy(vq)) {
1668                v4l2_err(&ctx->fdp1->v4l2_dev, "%s queue busy\n", __func__);
1669                return -EBUSY;
1670        }
1671
1672        fdp1_set_format(ctx, &f->fmt.pix_mp, f->type);
1673
1674        dprintk(ctx->fdp1, "Set %s format: %4.4s (0x%08x) %ux%u field %u\n",
1675                V4L2_TYPE_IS_OUTPUT(f->type) ? "output" : "capture",
1676                (char *)&f->fmt.pix_mp.pixelformat, f->fmt.pix_mp.pixelformat,
1677                f->fmt.pix_mp.width, f->fmt.pix_mp.height, f->fmt.pix_mp.field);
1678
1679        return 0;
1680}
1681
1682static int fdp1_g_ctrl(struct v4l2_ctrl *ctrl)
1683{
1684        struct fdp1_ctx *ctx =
1685                container_of(ctrl->handler, struct fdp1_ctx, hdl);
1686        struct fdp1_q_data *src_q_data = &ctx->out_q;
1687
1688        switch (ctrl->id) {
1689        case V4L2_CID_MIN_BUFFERS_FOR_CAPTURE:
1690                if (V4L2_FIELD_HAS_BOTH(src_q_data->format.field))
1691                        ctrl->val = 2;
1692                else
1693                        ctrl->val = 1;
1694                return 0;
1695        }
1696
1697        return 1;
1698}
1699
1700static int fdp1_s_ctrl(struct v4l2_ctrl *ctrl)
1701{
1702        struct fdp1_ctx *ctx =
1703                container_of(ctrl->handler, struct fdp1_ctx, hdl);
1704
1705        switch (ctrl->id) {
1706        case V4L2_CID_ALPHA_COMPONENT:
1707                ctx->alpha = ctrl->val;
1708                break;
1709
1710        case V4L2_CID_DEINTERLACING_MODE:
1711                ctx->deint_mode = ctrl->val;
1712                break;
1713        }
1714
1715        return 0;
1716}
1717
1718static const struct v4l2_ctrl_ops fdp1_ctrl_ops = {
1719        .s_ctrl = fdp1_s_ctrl,
1720        .g_volatile_ctrl = fdp1_g_ctrl,
1721};
1722
1723static const char * const fdp1_ctrl_deint_menu[] = {
1724        "Progressive",
1725        "Adaptive 2D/3D",
1726        "Fixed 2D",
1727        "Fixed 3D",
1728        "Previous field",
1729        "Next field",
1730        NULL
1731};
1732
1733static const struct v4l2_ioctl_ops fdp1_ioctl_ops = {
1734        .vidioc_querycap        = fdp1_vidioc_querycap,
1735
1736        .vidioc_enum_fmt_vid_cap_mplane = fdp1_enum_fmt_vid_cap,
1737        .vidioc_enum_fmt_vid_out_mplane = fdp1_enum_fmt_vid_out,
1738        .vidioc_g_fmt_vid_cap_mplane    = fdp1_g_fmt,
1739        .vidioc_g_fmt_vid_out_mplane    = fdp1_g_fmt,
1740        .vidioc_try_fmt_vid_cap_mplane  = fdp1_try_fmt,
1741        .vidioc_try_fmt_vid_out_mplane  = fdp1_try_fmt,
1742        .vidioc_s_fmt_vid_cap_mplane    = fdp1_s_fmt,
1743        .vidioc_s_fmt_vid_out_mplane    = fdp1_s_fmt,
1744
1745        .vidioc_reqbufs         = v4l2_m2m_ioctl_reqbufs,
1746        .vidioc_querybuf        = v4l2_m2m_ioctl_querybuf,
1747        .vidioc_qbuf            = v4l2_m2m_ioctl_qbuf,
1748        .vidioc_dqbuf           = v4l2_m2m_ioctl_dqbuf,
1749        .vidioc_prepare_buf     = v4l2_m2m_ioctl_prepare_buf,
1750        .vidioc_create_bufs     = v4l2_m2m_ioctl_create_bufs,
1751        .vidioc_expbuf          = v4l2_m2m_ioctl_expbuf,
1752
1753        .vidioc_streamon        = v4l2_m2m_ioctl_streamon,
1754        .vidioc_streamoff       = v4l2_m2m_ioctl_streamoff,
1755
1756        .vidioc_subscribe_event = v4l2_ctrl_subscribe_event,
1757        .vidioc_unsubscribe_event = v4l2_event_unsubscribe,
1758};
1759
1760/*
1761 * Queue operations
1762 */
1763
1764static int fdp1_queue_setup(struct vb2_queue *vq,
1765                                unsigned int *nbuffers, unsigned int *nplanes,
1766                                unsigned int sizes[],
1767                                struct device *alloc_ctxs[])
1768{
1769        struct fdp1_ctx *ctx = vb2_get_drv_priv(vq);
1770        struct fdp1_q_data *q_data;
1771        unsigned int i;
1772
1773        q_data = get_q_data(ctx, vq->type);
1774
1775        if (*nplanes) {
1776                if (*nplanes > FDP1_MAX_PLANES)
1777                        return -EINVAL;
1778
1779                return 0;
1780        }
1781
1782        *nplanes = q_data->format.num_planes;
1783
1784        for (i = 0; i < *nplanes; i++)
1785                sizes[i] = q_data->format.plane_fmt[i].sizeimage;
1786
1787        return 0;
1788}
1789
1790static void fdp1_buf_prepare_field(struct fdp1_q_data *q_data,
1791                                   struct vb2_v4l2_buffer *vbuf,
1792                                   unsigned int field_num)
1793{
1794        struct fdp1_buffer *buf = to_fdp1_buffer(vbuf);
1795        struct fdp1_field_buffer *fbuf = &buf->fields[field_num];
1796        unsigned int num_fields;
1797        unsigned int i;
1798
1799        num_fields = V4L2_FIELD_HAS_BOTH(vbuf->field) ? 2 : 1;
1800
1801        fbuf->vb = vbuf;
1802        fbuf->last_field = (field_num + 1) == num_fields;
1803
1804        for (i = 0; i < vbuf->vb2_buf.num_planes; ++i)
1805                fbuf->addrs[i] = vb2_dma_contig_plane_dma_addr(&vbuf->vb2_buf, i);
1806
1807        switch (vbuf->field) {
1808        case V4L2_FIELD_INTERLACED:
1809                /*
1810                 * Interlaced means bottom-top for 60Hz TV standards (NTSC) and
1811                 * top-bottom for 50Hz. As TV standards are not applicable to
1812                 * the mem-to-mem API, use the height as a heuristic.
1813                 */
1814                fbuf->field = (q_data->format.height < 576) == field_num
1815                            ? V4L2_FIELD_TOP : V4L2_FIELD_BOTTOM;
1816                break;
1817        case V4L2_FIELD_INTERLACED_TB:
1818        case V4L2_FIELD_SEQ_TB:
1819                fbuf->field = field_num ? V4L2_FIELD_BOTTOM : V4L2_FIELD_TOP;
1820                break;
1821        case V4L2_FIELD_INTERLACED_BT:
1822        case V4L2_FIELD_SEQ_BT:
1823                fbuf->field = field_num ? V4L2_FIELD_TOP : V4L2_FIELD_BOTTOM;
1824                break;
1825        default:
1826                fbuf->field = vbuf->field;
1827                break;
1828        }
1829
1830        /* Buffer is completed */
1831        if (!field_num)
1832                return;
1833
1834        /* Adjust buffer addresses for second field */
1835        switch (vbuf->field) {
1836        case V4L2_FIELD_INTERLACED:
1837        case V4L2_FIELD_INTERLACED_TB:
1838        case V4L2_FIELD_INTERLACED_BT:
1839                for (i = 0; i < vbuf->vb2_buf.num_planes; i++)
1840                        fbuf->addrs[i] +=
1841                                (i == 0 ? q_data->stride_y : q_data->stride_c);
1842                break;
1843        case V4L2_FIELD_SEQ_TB:
1844        case V4L2_FIELD_SEQ_BT:
1845                for (i = 0; i < vbuf->vb2_buf.num_planes; i++)
1846                        fbuf->addrs[i] += q_data->vsize *
1847                                (i == 0 ? q_data->stride_y : q_data->stride_c);
1848                break;
1849        }
1850}
1851
1852static int fdp1_buf_prepare(struct vb2_buffer *vb)
1853{
1854        struct fdp1_ctx *ctx = vb2_get_drv_priv(vb->vb2_queue);
1855        struct fdp1_q_data *q_data = get_q_data(ctx, vb->vb2_queue->type);
1856        struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
1857        struct fdp1_buffer *buf = to_fdp1_buffer(vbuf);
1858        unsigned int i;
1859
1860        if (V4L2_TYPE_IS_OUTPUT(vb->vb2_queue->type)) {
1861                bool field_valid = true;
1862
1863                /* Validate the buffer field. */
1864                switch (q_data->format.field) {
1865                case V4L2_FIELD_NONE:
1866                        if (vbuf->field != V4L2_FIELD_NONE)
1867                                field_valid = false;
1868                        break;
1869
1870                case V4L2_FIELD_ALTERNATE:
1871                        if (vbuf->field != V4L2_FIELD_TOP &&
1872                            vbuf->field != V4L2_FIELD_BOTTOM)
1873                                field_valid = false;
1874                        break;
1875
1876                case V4L2_FIELD_INTERLACED:
1877                case V4L2_FIELD_SEQ_TB:
1878                case V4L2_FIELD_SEQ_BT:
1879                case V4L2_FIELD_INTERLACED_TB:
1880                case V4L2_FIELD_INTERLACED_BT:
1881                        if (vbuf->field != q_data->format.field)
1882                                field_valid = false;
1883                        break;
1884                }
1885
1886                if (!field_valid) {
1887                        dprintk(ctx->fdp1,
1888                                "buffer field %u invalid for format field %u\n",
1889                                vbuf->field, q_data->format.field);
1890                        return -EINVAL;
1891                }
1892        } else {
1893                vbuf->field = V4L2_FIELD_NONE;
1894        }
1895
1896        /* Validate the planes sizes. */
1897        for (i = 0; i < q_data->format.num_planes; i++) {
1898                unsigned long size = q_data->format.plane_fmt[i].sizeimage;
1899
1900                if (vb2_plane_size(vb, i) < size) {
1901                        dprintk(ctx->fdp1,
1902                                "data will not fit into plane [%u/%u] (%lu < %lu)\n",
1903                                i, q_data->format.num_planes,
1904                                vb2_plane_size(vb, i), size);
1905                        return -EINVAL;
1906                }
1907
1908                /* We have known size formats all around */
1909                vb2_set_plane_payload(vb, i, size);
1910        }
1911
1912        buf->num_fields = V4L2_FIELD_HAS_BOTH(vbuf->field) ? 2 : 1;
1913        for (i = 0; i < buf->num_fields; ++i)
1914                fdp1_buf_prepare_field(q_data, vbuf, i);
1915
1916        return 0;
1917}
1918
1919static void fdp1_buf_queue(struct vb2_buffer *vb)
1920{
1921        struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
1922        struct fdp1_ctx *ctx = vb2_get_drv_priv(vb->vb2_queue);
1923
1924        v4l2_m2m_buf_queue(ctx->fh.m2m_ctx, vbuf);
1925}
1926
1927static int fdp1_start_streaming(struct vb2_queue *q, unsigned int count)
1928{
1929        struct fdp1_ctx *ctx = vb2_get_drv_priv(q);
1930        struct fdp1_q_data *q_data = get_q_data(ctx, q->type);
1931
1932        if (V4L2_TYPE_IS_OUTPUT(q->type)) {
1933                /*
1934                 * Force our deint_mode when we are progressive,
1935                 * ignoring any setting on the device from the user,
1936                 * Otherwise, lock in the requested de-interlace mode.
1937                 */
1938                if (q_data->format.field == V4L2_FIELD_NONE)
1939                        ctx->deint_mode = FDP1_PROGRESSIVE;
1940
1941                if (ctx->deint_mode == FDP1_ADAPT2D3D) {
1942                        u32 stride;
1943                        dma_addr_t smsk_base;
1944                        const u32 bpp = 2; /* bytes per pixel */
1945
1946                        stride = round_up(q_data->format.width, 8);
1947
1948                        ctx->smsk_size = bpp * stride * q_data->vsize;
1949
1950                        ctx->smsk_cpu = dma_alloc_coherent(ctx->fdp1->dev,
1951                                ctx->smsk_size, &smsk_base, GFP_KERNEL);
1952
1953                        if (ctx->smsk_cpu == NULL) {
1954                                dprintk(ctx->fdp1, "Failed to alloc smsk\n");
1955                                return -ENOMEM;
1956                        }
1957
1958                        ctx->smsk_addr[0] = smsk_base;
1959                        ctx->smsk_addr[1] = smsk_base + (ctx->smsk_size/2);
1960                }
1961        }
1962
1963        return 0;
1964}
1965
1966static void fdp1_stop_streaming(struct vb2_queue *q)
1967{
1968        struct fdp1_ctx *ctx = vb2_get_drv_priv(q);
1969        struct vb2_v4l2_buffer *vbuf;
1970        unsigned long flags;
1971
1972        while (1) {
1973                if (V4L2_TYPE_IS_OUTPUT(q->type))
1974                        vbuf = v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx);
1975                else
1976                        vbuf = v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx);
1977                if (vbuf == NULL)
1978                        break;
1979                spin_lock_irqsave(&ctx->fdp1->irqlock, flags);
1980                v4l2_m2m_buf_done(vbuf, VB2_BUF_STATE_ERROR);
1981                spin_unlock_irqrestore(&ctx->fdp1->irqlock, flags);
1982        }
1983
1984        /* Empty Output queues */
1985        if (V4L2_TYPE_IS_OUTPUT(q->type)) {
1986                /* Empty our internal queues */
1987                struct fdp1_field_buffer *fbuf;
1988
1989                /* Free any queued buffers */
1990                fbuf = fdp1_dequeue_field(ctx);
1991                while (fbuf != NULL) {
1992                        fdp1_field_complete(ctx, fbuf);
1993                        fbuf = fdp1_dequeue_field(ctx);
1994                }
1995
1996                /* Free smsk_data */
1997                if (ctx->smsk_cpu) {
1998                        dma_free_coherent(ctx->fdp1->dev, ctx->smsk_size,
1999                                        ctx->smsk_cpu, ctx->smsk_addr[0]);
2000                        ctx->smsk_addr[0] = ctx->smsk_addr[1] = 0;
2001                        ctx->smsk_cpu = NULL;
2002                }
2003
2004                WARN(!list_empty(&ctx->fields_queue),
2005                                "Buffer queue not empty");
2006        } else {
2007                /* Empty Capture queues (Jobs) */
2008                struct fdp1_job *job;
2009
2010                job = get_queued_job(ctx->fdp1);
2011                while (job) {
2012                        if (FDP1_DEINT_MODE_USES_PREV(ctx->deint_mode))
2013                                fdp1_field_complete(ctx, job->previous);
2014                        else
2015                                fdp1_field_complete(ctx, job->active);
2016
2017                        v4l2_m2m_buf_done(job->dst->vb, VB2_BUF_STATE_ERROR);
2018                        job->dst = NULL;
2019
2020                        job = get_queued_job(ctx->fdp1);
2021                }
2022
2023                /* Free any held buffer in the ctx */
2024                fdp1_field_complete(ctx, ctx->previous);
2025
2026                WARN(!list_empty(&ctx->fdp1->queued_job_list),
2027                                "Queued Job List not empty");
2028
2029                WARN(!list_empty(&ctx->fdp1->hw_job_list),
2030                                "HW Job list not empty");
2031        }
2032}
2033
2034static struct vb2_ops fdp1_qops = {
2035        .queue_setup     = fdp1_queue_setup,
2036        .buf_prepare     = fdp1_buf_prepare,
2037        .buf_queue       = fdp1_buf_queue,
2038        .start_streaming = fdp1_start_streaming,
2039        .stop_streaming  = fdp1_stop_streaming,
2040        .wait_prepare    = vb2_ops_wait_prepare,
2041        .wait_finish     = vb2_ops_wait_finish,
2042};
2043
2044static int queue_init(void *priv, struct vb2_queue *src_vq,
2045                      struct vb2_queue *dst_vq)
2046{
2047        struct fdp1_ctx *ctx = priv;
2048        int ret;
2049
2050        src_vq->type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
2051        src_vq->io_modes = VB2_MMAP | VB2_USERPTR | VB2_DMABUF;
2052        src_vq->drv_priv = ctx;
2053        src_vq->buf_struct_size = sizeof(struct fdp1_buffer);
2054        src_vq->ops = &fdp1_qops;
2055        src_vq->mem_ops = &vb2_dma_contig_memops;
2056        src_vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY;
2057        src_vq->lock = &ctx->fdp1->dev_mutex;
2058        src_vq->dev = ctx->fdp1->dev;
2059
2060        ret = vb2_queue_init(src_vq);
2061        if (ret)
2062                return ret;
2063
2064        dst_vq->type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
2065        dst_vq->io_modes = VB2_MMAP | VB2_USERPTR | VB2_DMABUF;
2066        dst_vq->drv_priv = ctx;
2067        dst_vq->buf_struct_size = sizeof(struct fdp1_buffer);
2068        dst_vq->ops = &fdp1_qops;
2069        dst_vq->mem_ops = &vb2_dma_contig_memops;
2070        dst_vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY;
2071        dst_vq->lock = &ctx->fdp1->dev_mutex;
2072        dst_vq->dev = ctx->fdp1->dev;
2073
2074        return vb2_queue_init(dst_vq);
2075}
2076
2077/*
2078 * File operations
2079 */
2080static int fdp1_open(struct file *file)
2081{
2082        struct fdp1_dev *fdp1 = video_drvdata(file);
2083        struct v4l2_pix_format_mplane format;
2084        struct fdp1_ctx *ctx = NULL;
2085        struct v4l2_ctrl *ctrl;
2086        int ret = 0;
2087
2088        if (mutex_lock_interruptible(&fdp1->dev_mutex))
2089                return -ERESTARTSYS;
2090
2091        ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
2092        if (!ctx) {
2093                ret = -ENOMEM;
2094                goto done;
2095        }
2096
2097        v4l2_fh_init(&ctx->fh, video_devdata(file));
2098        file->private_data = &ctx->fh;
2099        ctx->fdp1 = fdp1;
2100
2101        /* Initialise Queues */
2102        INIT_LIST_HEAD(&ctx->fields_queue);
2103
2104        ctx->translen = 1;
2105        ctx->sequence = 0;
2106
2107        /* Initialise controls */
2108
2109        v4l2_ctrl_handler_init(&ctx->hdl, 3);
2110        v4l2_ctrl_new_std_menu_items(&ctx->hdl, &fdp1_ctrl_ops,
2111                                     V4L2_CID_DEINTERLACING_MODE,
2112                                     FDP1_NEXTFIELD, BIT(0), FDP1_FIXED3D,
2113                                     fdp1_ctrl_deint_menu);
2114
2115        ctrl = v4l2_ctrl_new_std(&ctx->hdl, &fdp1_ctrl_ops,
2116                        V4L2_CID_MIN_BUFFERS_FOR_CAPTURE, 1, 2, 1, 1);
2117        if (ctrl)
2118                ctrl->flags |= V4L2_CTRL_FLAG_VOLATILE;
2119
2120        v4l2_ctrl_new_std(&ctx->hdl, &fdp1_ctrl_ops,
2121                          V4L2_CID_ALPHA_COMPONENT, 0, 255, 1, 255);
2122
2123        if (ctx->hdl.error) {
2124                ret = ctx->hdl.error;
2125                v4l2_ctrl_handler_free(&ctx->hdl);
2126                goto done;
2127        }
2128
2129        ctx->fh.ctrl_handler = &ctx->hdl;
2130        v4l2_ctrl_handler_setup(&ctx->hdl);
2131
2132        /* Configure default parameters. */
2133        memset(&format, 0, sizeof(format));
2134        fdp1_set_format(ctx, &format, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
2135
2136        ctx->fh.m2m_ctx = v4l2_m2m_ctx_init(fdp1->m2m_dev, ctx, &queue_init);
2137
2138        if (IS_ERR(ctx->fh.m2m_ctx)) {
2139                ret = PTR_ERR(ctx->fh.m2m_ctx);
2140
2141                v4l2_ctrl_handler_free(&ctx->hdl);
2142                kfree(ctx);
2143                goto done;
2144        }
2145
2146        /* Perform any power management required */
2147        pm_runtime_get_sync(fdp1->dev);
2148
2149        v4l2_fh_add(&ctx->fh);
2150
2151        dprintk(fdp1, "Created instance: %p, m2m_ctx: %p\n",
2152                ctx, ctx->fh.m2m_ctx);
2153
2154done:
2155        mutex_unlock(&fdp1->dev_mutex);
2156        return ret;
2157}
2158
2159static int fdp1_release(struct file *file)
2160{
2161        struct fdp1_dev *fdp1 = video_drvdata(file);
2162        struct fdp1_ctx *ctx = fh_to_ctx(file->private_data);
2163
2164        dprintk(fdp1, "Releasing instance %p\n", ctx);
2165
2166        v4l2_fh_del(&ctx->fh);
2167        v4l2_fh_exit(&ctx->fh);
2168        v4l2_ctrl_handler_free(&ctx->hdl);
2169        mutex_lock(&fdp1->dev_mutex);
2170        v4l2_m2m_ctx_release(ctx->fh.m2m_ctx);
2171        mutex_unlock(&fdp1->dev_mutex);
2172        kfree(ctx);
2173
2174        pm_runtime_put(fdp1->dev);
2175
2176        return 0;
2177}
2178
2179static const struct v4l2_file_operations fdp1_fops = {
2180        .owner          = THIS_MODULE,
2181        .open           = fdp1_open,
2182        .release        = fdp1_release,
2183        .poll           = v4l2_m2m_fop_poll,
2184        .unlocked_ioctl = video_ioctl2,
2185        .mmap           = v4l2_m2m_fop_mmap,
2186};
2187
2188static const struct video_device fdp1_videodev = {
2189        .name           = DRIVER_NAME,
2190        .vfl_dir        = VFL_DIR_M2M,
2191        .fops           = &fdp1_fops,
2192        .device_caps    = V4L2_CAP_VIDEO_M2M_MPLANE | V4L2_CAP_STREAMING,
2193        .ioctl_ops      = &fdp1_ioctl_ops,
2194        .minor          = -1,
2195        .release        = video_device_release_empty,
2196};
2197
2198static const struct v4l2_m2m_ops m2m_ops = {
2199        .device_run     = fdp1_m2m_device_run,
2200        .job_ready      = fdp1_m2m_job_ready,
2201        .job_abort      = fdp1_m2m_job_abort,
2202};
2203
2204static irqreturn_t fdp1_irq_handler(int irq, void *dev_id)
2205{
2206        struct fdp1_dev *fdp1 = dev_id;
2207        u32 int_status;
2208        u32 ctl_status;
2209        u32 vint_cnt;
2210        u32 cycles;
2211
2212        int_status = fdp1_read(fdp1, FD1_CTL_IRQSTA);
2213        cycles = fdp1_read(fdp1, FD1_CTL_VCYCLE_STAT);
2214        ctl_status = fdp1_read(fdp1, FD1_CTL_STATUS);
2215        vint_cnt = (ctl_status & FD1_CTL_STATUS_VINT_CNT_MASK) >>
2216                        FD1_CTL_STATUS_VINT_CNT_SHIFT;
2217
2218        /* Clear interrupts */
2219        fdp1_write(fdp1, ~(int_status) & FD1_CTL_IRQ_MASK, FD1_CTL_IRQSTA);
2220
2221        if (debug >= 2) {
2222                dprintk(fdp1, "IRQ: 0x%x %s%s%s\n", int_status,
2223                        int_status & FD1_CTL_IRQ_VERE ? "[Error]" : "[!E]",
2224                        int_status & FD1_CTL_IRQ_VINTE ? "[VSync]" : "[!V]",
2225                        int_status & FD1_CTL_IRQ_FREE ? "[FrameEnd]" : "[!F]");
2226
2227                dprintk(fdp1, "CycleStatus = %d (%dms)\n",
2228                        cycles, cycles/(fdp1->clk_rate/1000));
2229
2230                dprintk(fdp1,
2231                        "Control Status = 0x%08x : VINT_CNT = %d %s:%s:%s:%s\n",
2232                        ctl_status, vint_cnt,
2233                        ctl_status & FD1_CTL_STATUS_SGREGSET ? "RegSet" : "",
2234                        ctl_status & FD1_CTL_STATUS_SGVERR ? "Vsync Error" : "",
2235                        ctl_status & FD1_CTL_STATUS_SGFREND ? "FrameEnd" : "",
2236                        ctl_status & FD1_CTL_STATUS_BSY ? "Busy" : "");
2237                dprintk(fdp1, "***********************************\n");
2238        }
2239
2240        /* Spurious interrupt */
2241        if (!(FD1_CTL_IRQ_MASK & int_status))
2242                return IRQ_NONE;
2243
2244        /* Work completed, release the frame */
2245        if (FD1_CTL_IRQ_VERE & int_status)
2246                device_frame_end(fdp1, VB2_BUF_STATE_ERROR);
2247        else if (FD1_CTL_IRQ_FREE & int_status)
2248                device_frame_end(fdp1, VB2_BUF_STATE_DONE);
2249
2250        return IRQ_HANDLED;
2251}
2252
2253static int fdp1_probe(struct platform_device *pdev)
2254{
2255        struct fdp1_dev *fdp1;
2256        struct video_device *vfd;
2257        struct device_node *fcp_node;
2258        struct resource *res;
2259        struct clk *clk;
2260        unsigned int i;
2261
2262        int ret;
2263        int hw_version;
2264
2265        fdp1 = devm_kzalloc(&pdev->dev, sizeof(*fdp1), GFP_KERNEL);
2266        if (!fdp1)
2267                return -ENOMEM;
2268
2269        INIT_LIST_HEAD(&fdp1->free_job_list);
2270        INIT_LIST_HEAD(&fdp1->queued_job_list);
2271        INIT_LIST_HEAD(&fdp1->hw_job_list);
2272
2273        /* Initialise the jobs on the free list */
2274        for (i = 0; i < ARRAY_SIZE(fdp1->jobs); i++)
2275                list_add(&fdp1->jobs[i].list, &fdp1->free_job_list);
2276
2277        mutex_init(&fdp1->dev_mutex);
2278
2279        spin_lock_init(&fdp1->irqlock);
2280        spin_lock_init(&fdp1->device_process_lock);
2281        fdp1->dev = &pdev->dev;
2282        platform_set_drvdata(pdev, fdp1);
2283
2284        /* Memory-mapped registers */
2285        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
2286        fdp1->regs = devm_ioremap_resource(&pdev->dev, res);
2287        if (IS_ERR(fdp1->regs))
2288                return PTR_ERR(fdp1->regs);
2289
2290        /* Interrupt service routine registration */
2291        fdp1->irq = ret = platform_get_irq(pdev, 0);
2292        if (ret < 0) {
2293                dev_err(&pdev->dev, "cannot find IRQ\n");
2294                return ret;
2295        }
2296
2297        ret = devm_request_irq(&pdev->dev, fdp1->irq, fdp1_irq_handler, 0,
2298                               dev_name(&pdev->dev), fdp1);
2299        if (ret) {
2300                dev_err(&pdev->dev, "cannot claim IRQ %d\n", fdp1->irq);
2301                return ret;
2302        }
2303
2304        /* FCP */
2305        fcp_node = of_parse_phandle(pdev->dev.of_node, "renesas,fcp", 0);
2306        if (fcp_node) {
2307                fdp1->fcp = rcar_fcp_get(fcp_node);
2308                of_node_put(fcp_node);
2309                if (IS_ERR(fdp1->fcp)) {
2310                        dev_err(&pdev->dev, "FCP not found (%ld)\n",
2311                                PTR_ERR(fdp1->fcp));
2312                        return PTR_ERR(fdp1->fcp);
2313                }
2314        }
2315
2316        /* Determine our clock rate */
2317        clk = clk_get(&pdev->dev, NULL);
2318        if (IS_ERR(clk))
2319                return PTR_ERR(clk);
2320
2321        fdp1->clk_rate = clk_get_rate(clk);
2322        clk_put(clk);
2323
2324        /* V4L2 device registration */
2325        ret = v4l2_device_register(&pdev->dev, &fdp1->v4l2_dev);
2326        if (ret) {
2327                v4l2_err(&fdp1->v4l2_dev, "Failed to register video device\n");
2328                return ret;
2329        }
2330
2331        /* M2M registration */
2332        fdp1->m2m_dev = v4l2_m2m_init(&m2m_ops);
2333        if (IS_ERR(fdp1->m2m_dev)) {
2334                v4l2_err(&fdp1->v4l2_dev, "Failed to init mem2mem device\n");
2335                ret = PTR_ERR(fdp1->m2m_dev);
2336                goto unreg_dev;
2337        }
2338
2339        /* Video registration */
2340        fdp1->vfd = fdp1_videodev;
2341        vfd = &fdp1->vfd;
2342        vfd->lock = &fdp1->dev_mutex;
2343        vfd->v4l2_dev = &fdp1->v4l2_dev;
2344        video_set_drvdata(vfd, fdp1);
2345        strlcpy(vfd->name, fdp1_videodev.name, sizeof(vfd->name));
2346
2347        ret = video_register_device(vfd, VFL_TYPE_GRABBER, 0);
2348        if (ret) {
2349                v4l2_err(&fdp1->v4l2_dev, "Failed to register video device\n");
2350                goto release_m2m;
2351        }
2352
2353        v4l2_info(&fdp1->v4l2_dev,
2354                        "Device registered as /dev/video%d\n", vfd->num);
2355
2356        /* Power up the cells to read HW */
2357        pm_runtime_enable(&pdev->dev);
2358        pm_runtime_get_sync(fdp1->dev);
2359
2360        hw_version = fdp1_read(fdp1, FD1_IP_INTDATA);
2361        switch (hw_version) {
2362        case FD1_IP_H3:
2363                dprintk(fdp1, "FDP1 Version R-Car H3\n");
2364                break;
2365        case FD1_IP_M3W:
2366                dprintk(fdp1, "FDP1 Version R-Car M3-W\n");
2367                break;
2368        default:
2369                dev_err(fdp1->dev, "FDP1 Unidentifiable (0x%08x)\n",
2370                                hw_version);
2371        }
2372
2373        /* Allow the hw to sleep until an open call puts it to use */
2374        pm_runtime_put(fdp1->dev);
2375
2376        return 0;
2377
2378release_m2m:
2379        v4l2_m2m_release(fdp1->m2m_dev);
2380
2381unreg_dev:
2382        v4l2_device_unregister(&fdp1->v4l2_dev);
2383
2384        return ret;
2385}
2386
2387static int fdp1_remove(struct platform_device *pdev)
2388{
2389        struct fdp1_dev *fdp1 = platform_get_drvdata(pdev);
2390
2391        v4l2_m2m_release(fdp1->m2m_dev);
2392        video_unregister_device(&fdp1->vfd);
2393        v4l2_device_unregister(&fdp1->v4l2_dev);
2394        pm_runtime_disable(&pdev->dev);
2395
2396        return 0;
2397}
2398
2399static int __maybe_unused fdp1_pm_runtime_suspend(struct device *dev)
2400{
2401        struct fdp1_dev *fdp1 = dev_get_drvdata(dev);
2402
2403        rcar_fcp_disable(fdp1->fcp);
2404
2405        return 0;
2406}
2407
2408static int __maybe_unused fdp1_pm_runtime_resume(struct device *dev)
2409{
2410        struct fdp1_dev *fdp1 = dev_get_drvdata(dev);
2411
2412        /* Program in the static LUTs */
2413        fdp1_set_lut(fdp1);
2414
2415        return rcar_fcp_enable(fdp1->fcp);
2416}
2417
2418static const struct dev_pm_ops fdp1_pm_ops = {
2419        SET_RUNTIME_PM_OPS(fdp1_pm_runtime_suspend,
2420                           fdp1_pm_runtime_resume,
2421                           NULL)
2422};
2423
2424static const struct of_device_id fdp1_dt_ids[] = {
2425        { .compatible = "renesas,fdp1" },
2426        { },
2427};
2428MODULE_DEVICE_TABLE(of, fdp1_dt_ids);
2429
2430static struct platform_driver fdp1_pdrv = {
2431        .probe          = fdp1_probe,
2432        .remove         = fdp1_remove,
2433        .driver         = {
2434                .name   = DRIVER_NAME,
2435                .of_match_table = fdp1_dt_ids,
2436                .pm     = &fdp1_pm_ops,
2437        },
2438};
2439
2440module_platform_driver(fdp1_pdrv);
2441
2442MODULE_DESCRIPTION("Renesas R-Car Fine Display Processor Driver");
2443MODULE_AUTHOR("Kieran Bingham <kieran@bingham.xyz>");
2444MODULE_LICENSE("GPL");
2445MODULE_ALIAS("platform:" DRIVER_NAME);
2446