Linux Audio

Check our new training course

Loading...
Note: File does not exist in v6.8.
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * Author: Mikhail Ulyanov
   4 * Copyright (C) 2014-2015 Cogent Embedded, Inc.  <source@cogentembedded.com>
   5 * Copyright (C) 2014-2015 Renesas Electronics Corporation
   6 *
   7 * This is based on the drivers/media/platform/s5p-jpeg driver by
   8 * Andrzej Pietrasiewicz and Jacek Anaszewski.
   9 * Some portions of code inspired by VSP1 driver by Laurent Pinchart.
  10 *
  11 * TODO in order of priority:
  12 *      1) Rotation
  13 *      2) Cropping
  14 *      3) V4L2_CID_JPEG_ACTIVE_MARKER
  15 */
  16
  17#include <asm/unaligned.h>
  18#include <linux/clk.h>
  19#include <linux/err.h>
  20#include <linux/interrupt.h>
  21#include <linux/io.h>
  22#include <linux/kernel.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/slab.h>
  28#include <linux/spinlock.h>
  29#include <linux/string.h>
  30#include <linux/videodev2.h>
  31#include <media/v4l2-ctrls.h>
  32#include <media/v4l2-device.h>
  33#include <media/v4l2-event.h>
  34#include <media/v4l2-fh.h>
  35#include <media/v4l2-mem2mem.h>
  36#include <media/v4l2-ioctl.h>
  37#include <media/videobuf2-v4l2.h>
  38#include <media/videobuf2-dma-contig.h>
  39
  40
  41#define DRV_NAME "rcar_jpu"
  42
  43/*
  44 * Align JPEG header end to cache line to make sure we will not have any issues
  45 * with cache; additionally to requerment (33.3.27 R01UH0501EJ0100 Rev.1.00)
  46 */
  47#define JPU_JPEG_HDR_SIZE		(ALIGN(0x258, L1_CACHE_BYTES))
  48#define JPU_JPEG_MAX_BYTES_PER_PIXEL	2	/* 16 bit precision format */
  49#define JPU_JPEG_MIN_SIZE		25	/* SOI + SOF + EOI */
  50#define JPU_JPEG_QTBL_SIZE		0x40
  51#define JPU_JPEG_HDCTBL_SIZE		0x1c
  52#define JPU_JPEG_HACTBL_SIZE		0xb2
  53#define JPU_JPEG_HEIGHT_OFFSET		0x91
  54#define JPU_JPEG_WIDTH_OFFSET		0x93
  55#define JPU_JPEG_SUBS_OFFSET		0x97
  56#define JPU_JPEG_QTBL_LUM_OFFSET	0x07
  57#define JPU_JPEG_QTBL_CHR_OFFSET	0x4c
  58#define JPU_JPEG_HDCTBL_LUM_OFFSET	0xa4
  59#define JPU_JPEG_HACTBL_LUM_OFFSET	0xc5
  60#define JPU_JPEG_HDCTBL_CHR_OFFSET	0x17c
  61#define JPU_JPEG_HACTBL_CHR_OFFSET	0x19d
  62#define JPU_JPEG_PADDING_OFFSET		0x24f
  63#define JPU_JPEG_LUM 0x00
  64#define JPU_JPEG_CHR 0x01
  65#define JPU_JPEG_DC  0x00
  66#define JPU_JPEG_AC  0x10
  67
  68#define JPU_JPEG_422 0x21
  69#define JPU_JPEG_420 0x22
  70
  71#define JPU_JPEG_DEFAULT_422_PIX_FMT V4L2_PIX_FMT_NV16M
  72#define JPU_JPEG_DEFAULT_420_PIX_FMT V4L2_PIX_FMT_NV12M
  73
  74/* JPEG markers */
  75#define TEM	0x01
  76#define SOF0	0xc0
  77#define RST	0xd0
  78#define SOI	0xd8
  79#define EOI	0xd9
  80#define DHP	0xde
  81#define DHT	0xc4
  82#define COM	0xfe
  83#define DQT	0xdb
  84#define DRI	0xdd
  85#define APP0	0xe0
  86
  87#define JPU_RESET_TIMEOUT	100 /* ms */
  88#define JPU_JOB_TIMEOUT		300 /* ms */
  89#define JPU_MAX_QUALITY		4
  90#define JPU_WIDTH_MIN		16
  91#define JPU_HEIGHT_MIN		16
  92#define JPU_WIDTH_MAX		4096
  93#define JPU_HEIGHT_MAX		4096
  94#define JPU_MEMALIGN		8
  95
  96/* Flags that indicate a format can be used for capture/output */
  97#define JPU_FMT_TYPE_OUTPUT	0
  98#define JPU_FMT_TYPE_CAPTURE	1
  99#define JPU_ENC_CAPTURE		(1 << 0)
 100#define JPU_ENC_OUTPUT		(1 << 1)
 101#define JPU_DEC_CAPTURE		(1 << 2)
 102#define JPU_DEC_OUTPUT		(1 << 3)
 103
 104/*
 105 * JPEG registers and bits
 106 */
 107
 108/* JPEG code mode register */
 109#define JCMOD	0x00
 110#define JCMOD_PCTR		(1 << 7)
 111#define JCMOD_MSKIP_ENABLE	(1 << 5)
 112#define JCMOD_DSP_ENC		(0 << 3)
 113#define JCMOD_DSP_DEC		(1 << 3)
 114#define JCMOD_REDU		(7 << 0)
 115#define JCMOD_REDU_422		(1 << 0)
 116#define JCMOD_REDU_420		(2 << 0)
 117
 118/* JPEG code command register */
 119#define JCCMD	0x04
 120#define JCCMD_SRST	(1 << 12)
 121#define JCCMD_JEND	(1 << 2)
 122#define JCCMD_JSRT	(1 << 0)
 123
 124/* JPEG code quantanization table number register */
 125#define JCQTN	0x0c
 126#define JCQTN_SHIFT(t)		(((t) - 1) << 1)
 127
 128/* JPEG code Huffman table number register */
 129#define JCHTN	0x10
 130#define JCHTN_AC_SHIFT(t)	(((t) << 1) - 1)
 131#define JCHTN_DC_SHIFT(t)	(((t) - 1) << 1)
 132
 133#define JCVSZU	0x1c /* JPEG code vertical size upper register */
 134#define JCVSZD	0x20 /* JPEG code vertical size lower register */
 135#define JCHSZU	0x24 /* JPEG code horizontal size upper register */
 136#define JCHSZD	0x28 /* JPEG code horizontal size lower register */
 137#define JCSZ_MASK 0xff /* JPEG code h/v size register contains only 1 byte*/
 138
 139#define JCDTCU	0x2c /* JPEG code data count upper register */
 140#define JCDTCM	0x30 /* JPEG code data count middle register */
 141#define JCDTCD	0x34 /* JPEG code data count lower register */
 142
 143/* JPEG interrupt enable register */
 144#define JINTE	0x38
 145#define JINTE_ERR		(7 << 5) /* INT5 + INT6 + INT7 */
 146#define JINTE_TRANSF_COMPL	(1 << 10)
 147
 148/* JPEG interrupt status register */
 149#define JINTS	0x3c
 150#define JINTS_MASK	0x7c68
 151#define JINTS_ERR		(1 << 5)
 152#define JINTS_PROCESS_COMPL	(1 << 6)
 153#define JINTS_TRANSF_COMPL	(1 << 10)
 154
 155#define JCDERR	0x40 /* JPEG code decode error register */
 156#define JCDERR_MASK	0xf /* JPEG code decode error register mask*/
 157
 158/* JPEG interface encoding */
 159#define JIFECNT	0x70
 160#define JIFECNT_INFT_422	0
 161#define JIFECNT_INFT_420	1
 162#define JIFECNT_SWAP_WB		(3 << 4) /* to JPU */
 163
 164#define JIFESYA1	0x74	/* encode source Y address register 1 */
 165#define JIFESCA1	0x78	/* encode source C address register 1 */
 166#define JIFESYA2	0x7c	/* encode source Y address register 2 */
 167#define JIFESCA2	0x80	/* encode source C address register 2 */
 168#define JIFESMW		0x84	/* encode source memory width register */
 169#define JIFESVSZ	0x88	/* encode source vertical size register */
 170#define JIFESHSZ	0x8c	/* encode source horizontal size register */
 171#define JIFEDA1		0x90	/* encode destination address register 1 */
 172#define JIFEDA2		0x94	/* encode destination address register 2 */
 173
 174/* JPEG decoding control register */
 175#define JIFDCNT	0xa0
 176#define JIFDCNT_SWAP_WB		(3 << 1) /* from JPU */
 177
 178#define JIFDSA1		0xa4	/* decode source address register 1 */
 179#define JIFDDMW		0xb0	/* decode destination  memory width register */
 180#define JIFDDVSZ	0xb4	/* decode destination  vert. size register */
 181#define JIFDDHSZ	0xb8	/* decode destination  horiz. size register */
 182#define JIFDDYA1	0xbc	/* decode destination  Y address register 1 */
 183#define JIFDDCA1	0xc0	/* decode destination  C address register 1 */
 184
 185#define JCQTBL(n)	(0x10000 + (n) * 0x40)	/* quantization tables regs */
 186#define JCHTBD(n)	(0x10100 + (n) * 0x100)	/* Huffman table DC regs */
 187#define JCHTBA(n)	(0x10120 + (n) * 0x100)	/* Huffman table AC regs */
 188
 189/**
 190 * struct jpu - JPEG IP abstraction
 191 * @mutex: the mutex protecting this structure
 192 * @lock: spinlock protecting the device contexts
 193 * @v4l2_dev: v4l2 device for mem2mem mode
 194 * @vfd_encoder: video device node for encoder mem2mem mode
 195 * @vfd_decoder: video device node for decoder mem2mem mode
 196 * @m2m_dev: v4l2 mem2mem device data
 197 * @curr: pointer to current context
 198 * @regs: JPEG IP registers mapping
 199 * @irq: JPEG IP irq
 200 * @clk: JPEG IP clock
 201 * @dev: JPEG IP struct device
 202 * @ref_count: reference counter
 203 */
 204struct jpu {
 205	struct mutex	mutex;
 206	spinlock_t	lock;
 207	struct v4l2_device	v4l2_dev;
 208	struct video_device	vfd_encoder;
 209	struct video_device	vfd_decoder;
 210	struct v4l2_m2m_dev	*m2m_dev;
 211	struct jpu_ctx		*curr;
 212
 213	void __iomem		*regs;
 214	unsigned int		irq;
 215	struct clk		*clk;
 216	struct device		*dev;
 217	int			ref_count;
 218};
 219
 220/**
 221 * struct jpu_buffer - driver's specific video buffer
 222 * @buf: m2m buffer
 223 * @compr_quality: destination image quality in compression mode
 224 * @subsampling: source image subsampling in decompression mode
 225 */
 226struct jpu_buffer {
 227	struct v4l2_m2m_buffer buf;
 228	unsigned short	compr_quality;
 229	unsigned char	subsampling;
 230};
 231
 232/**
 233 * struct jpu_fmt - driver's internal format data
 234 * @fourcc: the fourcc code, 0 if not applicable
 235 * @colorspace: the colorspace specifier
 236 * @bpp: number of bits per pixel per plane
 237 * @h_align: horizontal alignment order (align to 2^h_align)
 238 * @v_align: vertical alignment order (align to 2^v_align)
 239 * @subsampling: (horizontal:4 | vertical:4) subsampling factor
 240 * @num_planes: number of planes
 241 * @types: types of queue this format is applicable to
 242 */
 243struct jpu_fmt {
 244	u32 fourcc;
 245	u32 colorspace;
 246	u8 bpp[2];
 247	u8 h_align;
 248	u8 v_align;
 249	u8 subsampling;
 250	u8 num_planes;
 251	u16 types;
 252};
 253
 254/**
 255 * struct jpu_q_data - parameters of one queue
 256 * @fmtinfo: driver-specific format of this queue
 257 * @format: multiplanar format of this queue
 258 * @sequence: sequence number
 259 */
 260struct jpu_q_data {
 261	struct jpu_fmt *fmtinfo;
 262	struct v4l2_pix_format_mplane format;
 263	unsigned int sequence;
 264};
 265
 266/**
 267 * struct jpu_ctx - the device context data
 268 * @jpu: JPEG IP device for this context
 269 * @encoder: compression (encode) operation or decompression (decode)
 270 * @compr_quality: destination image quality in compression (encode) mode
 271 * @out_q: source (output) queue information
 272 * @cap_q: destination (capture) queue information
 273 * @fh: file handler
 274 * @ctrl_handler: controls handler
 275 */
 276struct jpu_ctx {
 277	struct jpu		*jpu;
 278	bool			encoder;
 279	unsigned short		compr_quality;
 280	struct jpu_q_data	out_q;
 281	struct jpu_q_data	cap_q;
 282	struct v4l2_fh		fh;
 283	struct v4l2_ctrl_handler ctrl_handler;
 284};
 285
 286 /**
 287 * jpeg_buffer - description of memory containing input JPEG data
 288 * @end: end position in the buffer
 289 * @curr: current position in the buffer
 290 */
 291struct jpeg_buffer {
 292	void *end;
 293	void *curr;
 294};
 295
 296static struct jpu_fmt jpu_formats[] = {
 297	{ V4L2_PIX_FMT_JPEG, V4L2_COLORSPACE_JPEG,
 298	  {0, 0}, 0, 0, 0, 1, JPU_ENC_CAPTURE | JPU_DEC_OUTPUT },
 299	{ V4L2_PIX_FMT_NV16M, V4L2_COLORSPACE_SRGB,
 300	  {8, 8}, 2, 2, JPU_JPEG_422, 2, JPU_ENC_OUTPUT | JPU_DEC_CAPTURE },
 301	{ V4L2_PIX_FMT_NV12M, V4L2_COLORSPACE_SRGB,
 302	  {8, 4}, 2, 2, JPU_JPEG_420, 2, JPU_ENC_OUTPUT | JPU_DEC_CAPTURE },
 303	{ V4L2_PIX_FMT_NV16, V4L2_COLORSPACE_SRGB,
 304	  {16, 0}, 2, 2, JPU_JPEG_422, 1, JPU_ENC_OUTPUT | JPU_DEC_CAPTURE },
 305	{ V4L2_PIX_FMT_NV12, V4L2_COLORSPACE_SRGB,
 306	  {12, 0}, 2, 2, JPU_JPEG_420, 1, JPU_ENC_OUTPUT | JPU_DEC_CAPTURE },
 307};
 308
 309static const u8 zigzag[] = {
 310	0x03, 0x02, 0x0b, 0x13, 0x0a, 0x01, 0x00, 0x09,
 311	0x12, 0x1b, 0x23, 0x1a, 0x11, 0x08, 0x07, 0x06,
 312	0x0f, 0x10, 0x19, 0x22, 0x2b, 0x33, 0x2a, 0x21,
 313	0x18, 0x17, 0x0e, 0x05, 0x04, 0x0d, 0x16, 0x1f,
 314	0x20, 0x29, 0x32, 0x3b, 0x3a, 0x31, 0x28, 0x27,
 315	0x1e, 0x15, 0x0e, 0x14, 0x10, 0x26, 0x2f, 0x30,
 316	0x39, 0x38, 0x37, 0x2e, 0x25, 0x1c, 0x24, 0x2b,
 317	0x36, 0x3f, 0x3e, 0x35, 0x2c, 0x34, 0x3d, 0x3c
 318};
 319
 320#define QTBL_SIZE (ALIGN(JPU_JPEG_QTBL_SIZE, \
 321			  sizeof(unsigned int)) / sizeof(unsigned int))
 322#define HDCTBL_SIZE (ALIGN(JPU_JPEG_HDCTBL_SIZE, \
 323			  sizeof(unsigned int)) / sizeof(unsigned int))
 324#define HACTBL_SIZE (ALIGN(JPU_JPEG_HACTBL_SIZE, \
 325			  sizeof(unsigned int)) / sizeof(unsigned int))
 326/*
 327 * Start of image; Quantization tables
 328 * SOF0 (17 bytes payload) is Baseline DCT - Sample precision, height, width,
 329 * Number of image components, (Ci:8 - Hi:4 - Vi:4 - Tq:8) * 3 - Y,Cb,Cr;
 330 * Huffman tables; Padding with 0xff (33.3.27 R01UH0501EJ0100 Rev.1.00)
 331 */
 332#define JPU_JPEG_HDR_BLOB {                                                    \
 333	0xff, SOI, 0xff, DQT, 0x00, JPU_JPEG_QTBL_SIZE + 0x3, JPU_JPEG_LUM,    \
 334	[JPU_JPEG_QTBL_LUM_OFFSET ...                                          \
 335		JPU_JPEG_QTBL_LUM_OFFSET + JPU_JPEG_QTBL_SIZE - 1] = 0x00,     \
 336	0xff, DQT, 0x00, JPU_JPEG_QTBL_SIZE + 0x3, JPU_JPEG_CHR,               \
 337	[JPU_JPEG_QTBL_CHR_OFFSET ... JPU_JPEG_QTBL_CHR_OFFSET +               \
 338		JPU_JPEG_QTBL_SIZE - 1] = 0x00, 0xff, SOF0, 0x00, 0x11, 0x08,  \
 339	[JPU_JPEG_HEIGHT_OFFSET ... JPU_JPEG_HEIGHT_OFFSET + 1] = 0x00,        \
 340	[JPU_JPEG_WIDTH_OFFSET ... JPU_JPEG_WIDTH_OFFSET + 1] = 0x00,          \
 341	0x03, 0x01, [JPU_JPEG_SUBS_OFFSET] = 0x00, JPU_JPEG_LUM,               \
 342	0x02, 0x11, JPU_JPEG_CHR, 0x03, 0x11, JPU_JPEG_CHR,                    \
 343	0xff, DHT, 0x00, JPU_JPEG_HDCTBL_SIZE + 0x3, JPU_JPEG_LUM|JPU_JPEG_DC, \
 344	[JPU_JPEG_HDCTBL_LUM_OFFSET ...                                        \
 345		JPU_JPEG_HDCTBL_LUM_OFFSET + JPU_JPEG_HDCTBL_SIZE - 1] = 0x00, \
 346	0xff, DHT, 0x00, JPU_JPEG_HACTBL_SIZE + 0x3, JPU_JPEG_LUM|JPU_JPEG_AC, \
 347	[JPU_JPEG_HACTBL_LUM_OFFSET ...                                        \
 348		JPU_JPEG_HACTBL_LUM_OFFSET + JPU_JPEG_HACTBL_SIZE - 1] = 0x00, \
 349	0xff, DHT, 0x00, JPU_JPEG_HDCTBL_SIZE + 0x3, JPU_JPEG_CHR|JPU_JPEG_DC, \
 350	[JPU_JPEG_HDCTBL_CHR_OFFSET ...                                        \
 351		JPU_JPEG_HDCTBL_CHR_OFFSET + JPU_JPEG_HDCTBL_SIZE - 1] = 0x00, \
 352	0xff, DHT, 0x00, JPU_JPEG_HACTBL_SIZE + 0x3, JPU_JPEG_CHR|JPU_JPEG_AC, \
 353	[JPU_JPEG_HACTBL_CHR_OFFSET ...                                        \
 354		JPU_JPEG_HACTBL_CHR_OFFSET + JPU_JPEG_HACTBL_SIZE - 1] = 0x00, \
 355	[JPU_JPEG_PADDING_OFFSET ... JPU_JPEG_HDR_SIZE - 1] = 0xff             \
 356}
 357
 358static unsigned char jpeg_hdrs[JPU_MAX_QUALITY][JPU_JPEG_HDR_SIZE] = {
 359	[0 ... JPU_MAX_QUALITY - 1] = JPU_JPEG_HDR_BLOB
 360};
 361
 362static const unsigned int qtbl_lum[JPU_MAX_QUALITY][QTBL_SIZE] = {
 363	{
 364		0x14101927, 0x322e3e44, 0x10121726, 0x26354144,
 365		0x19171f26, 0x35414444, 0x27262635, 0x41444444,
 366		0x32263541, 0x44444444, 0x2e354144, 0x44444444,
 367		0x3e414444, 0x44444444, 0x44444444, 0x44444444
 368	},
 369	{
 370		0x100b0b10, 0x171b1f1e, 0x0b0c0c0f, 0x1417171e,
 371		0x0b0c0d10, 0x171a232f, 0x100f1017, 0x1a252f40,
 372		0x1714171a, 0x27334040, 0x1b171a25, 0x33404040,
 373		0x1f17232f, 0x40404040, 0x1e1e2f40, 0x40404040
 374	},
 375	{
 376		0x0c08080c, 0x11151817, 0x0809090b, 0x0f131217,
 377		0x08090a0c, 0x13141b24, 0x0c0b0c15, 0x141c2435,
 378		0x110f1314, 0x1e27333b, 0x1513141c, 0x27333b3b,
 379		0x18121b24, 0x333b3b3b, 0x17172435, 0x3b3b3b3b
 380	},
 381	{
 382		0x08060608, 0x0c0e1011, 0x06060608, 0x0a0d0c0f,
 383		0x06060708, 0x0d0e1218, 0x0808080e, 0x0d131823,
 384		0x0c0a0d0d, 0x141a2227, 0x0e0d0e13, 0x1a222727,
 385		0x100c1318, 0x22272727, 0x110f1823, 0x27272727
 386	}
 387};
 388
 389static const unsigned int qtbl_chr[JPU_MAX_QUALITY][QTBL_SIZE] = {
 390	{
 391		0x15192026, 0x36444444, 0x191c1826, 0x36444444,
 392		0x2018202b, 0x42444444, 0x26262b35, 0x44444444,
 393		0x36424444, 0x44444444, 0x44444444, 0x44444444,
 394		0x44444444, 0x44444444, 0x44444444, 0x44444444
 395	},
 396	{
 397		0x110f1115, 0x141a2630, 0x0f131211, 0x141a232b,
 398		0x11121416, 0x1a1e2e35, 0x1511161c, 0x1e273540,
 399		0x14141a1e, 0x27304040, 0x1a1a1e27, 0x303f4040,
 400		0x26232e35, 0x40404040, 0x302b3540, 0x40404040
 401	},
 402	{
 403		0x0d0b0d10, 0x14141d25, 0x0b0e0e0e, 0x10141a20,
 404		0x0d0e0f11, 0x14172328, 0x100e1115, 0x171e2832,
 405		0x14101417, 0x1e25323b, 0x1414171e, 0x25303b3b,
 406		0x1d1a2328, 0x323b3b3b, 0x25202832, 0x3b3b3b3b
 407	},
 408	{
 409		0x0908090b, 0x0e111318, 0x080a090b, 0x0e0d1116,
 410		0x09090d0e, 0x0d0f171a, 0x0b0b0e0e, 0x0f141a21,
 411		0x0e0e0d0f, 0x14182127, 0x110d0f14, 0x18202727,
 412		0x1311171a, 0x21272727, 0x18161a21, 0x27272727
 413	}
 414};
 415
 416static const unsigned int hdctbl_lum[HDCTBL_SIZE] = {
 417	0x00010501, 0x01010101, 0x01000000, 0x00000000,
 418	0x00010203, 0x04050607, 0x08090a0b
 419};
 420
 421static const unsigned int hdctbl_chr[HDCTBL_SIZE] = {
 422	0x00010501, 0x01010101, 0x01000000, 0x00000000,
 423	0x00010203, 0x04050607, 0x08090a0b
 424};
 425
 426static const unsigned int hactbl_lum[HACTBL_SIZE] = {
 427	0x00020103, 0x03020403, 0x05050404, 0x0000017d, 0x01020300, 0x04110512,
 428	0x21314106, 0x13516107,	0x22711432, 0x8191a108, 0x2342b1c1, 0x1552d1f0,
 429	0x24336272, 0x82090a16, 0x1718191a, 0x25262728, 0x292a3435, 0x36373839,
 430	0x3a434445, 0x46474849, 0x4a535455, 0x56575859, 0x5a636465, 0x66676869,
 431	0x6a737475, 0x76777879, 0x7a838485, 0x86878889, 0x8a929394, 0x95969798,
 432	0x999aa2a3, 0xa4a5a6a7, 0xa8a9aab2, 0xb3b4b5b6, 0xb7b8b9ba, 0xc2c3c4c5,
 433	0xc6c7c8c9, 0xcad2d3d4, 0xd5d6d7d8, 0xd9dae1e2, 0xe3e4e5e6, 0xe7e8e9ea,
 434	0xf1f2f3f4, 0xf5f6f7f8, 0xf9fa0000
 435};
 436
 437static const unsigned int hactbl_chr[HACTBL_SIZE] = {
 438	0x00020103, 0x03020403, 0x05050404, 0x0000017d, 0x01020300, 0x04110512,
 439	0x21314106, 0x13516107,	0x22711432, 0x8191a108, 0x2342b1c1, 0x1552d1f0,
 440	0x24336272, 0x82090a16, 0x1718191a, 0x25262728, 0x292a3435, 0x36373839,
 441	0x3a434445, 0x46474849, 0x4a535455, 0x56575859, 0x5a636465, 0x66676869,
 442	0x6a737475, 0x76777879, 0x7a838485, 0x86878889, 0x8a929394, 0x95969798,
 443	0x999aa2a3, 0xa4a5a6a7, 0xa8a9aab2, 0xb3b4b5b6, 0xb7b8b9ba, 0xc2c3c4c5,
 444	0xc6c7c8c9, 0xcad2d3d4, 0xd5d6d7d8, 0xd9dae1e2, 0xe3e4e5e6, 0xe7e8e9ea,
 445	0xf1f2f3f4, 0xf5f6f7f8, 0xf9fa0000
 446};
 447
 448static const char *error_to_text[16] = {
 449	"Normal",
 450	"SOI not detected",
 451	"SOF1 to SOFF detected",
 452	"Subsampling not detected",
 453	"SOF accuracy error",
 454	"DQT accuracy error",
 455	"Component error 1",
 456	"Component error 2",
 457	"SOF0, DQT, and DHT not detected when SOS detected",
 458	"SOS not detected",
 459	"EOI not detected",
 460	"Restart interval data number error detected",
 461	"Image size error",
 462	"Last MCU data number error",
 463	"Block data number error",
 464	"Unknown"
 465};
 466
 467static struct jpu_buffer *vb2_to_jpu_buffer(struct vb2_v4l2_buffer *vb)
 468{
 469	struct v4l2_m2m_buffer *b =
 470		container_of(vb, struct v4l2_m2m_buffer, vb);
 471
 472	return container_of(b, struct jpu_buffer, buf);
 473}
 474
 475static u32 jpu_read(struct jpu *jpu, unsigned int reg)
 476{
 477	return ioread32(jpu->regs + reg);
 478}
 479
 480static void jpu_write(struct jpu *jpu, u32 val, unsigned int reg)
 481{
 482	iowrite32(val, jpu->regs + reg);
 483}
 484
 485static struct jpu_ctx *ctrl_to_ctx(struct v4l2_ctrl *c)
 486{
 487	return container_of(c->handler, struct jpu_ctx, ctrl_handler);
 488}
 489
 490static struct jpu_ctx *fh_to_ctx(struct v4l2_fh *fh)
 491{
 492	return container_of(fh, struct jpu_ctx, fh);
 493}
 494
 495static void jpu_set_tbl(struct jpu *jpu, u32 reg, const unsigned int *tbl,
 496			unsigned int len) {
 497	unsigned int i;
 498
 499	for (i = 0; i < len; i++)
 500		jpu_write(jpu, tbl[i], reg + (i << 2));
 501}
 502
 503static void jpu_set_qtbl(struct jpu *jpu, unsigned short quality)
 504{
 505	jpu_set_tbl(jpu, JCQTBL(0), qtbl_lum[quality], QTBL_SIZE);
 506	jpu_set_tbl(jpu, JCQTBL(1), qtbl_chr[quality], QTBL_SIZE);
 507}
 508
 509static void jpu_set_htbl(struct jpu *jpu)
 510{
 511	jpu_set_tbl(jpu, JCHTBD(0), hdctbl_lum, HDCTBL_SIZE);
 512	jpu_set_tbl(jpu, JCHTBA(0), hactbl_lum, HACTBL_SIZE);
 513	jpu_set_tbl(jpu, JCHTBD(1), hdctbl_chr, HDCTBL_SIZE);
 514	jpu_set_tbl(jpu, JCHTBA(1), hactbl_chr, HACTBL_SIZE);
 515}
 516
 517static int jpu_wait_reset(struct jpu *jpu)
 518{
 519	unsigned long timeout;
 520
 521	timeout = jiffies + msecs_to_jiffies(JPU_RESET_TIMEOUT);
 522
 523	while (jpu_read(jpu, JCCMD) & JCCMD_SRST) {
 524		if (time_after(jiffies, timeout)) {
 525			dev_err(jpu->dev, "timed out in reset\n");
 526			return -ETIMEDOUT;
 527		}
 528		schedule();
 529	}
 530
 531	return 0;
 532}
 533
 534static int jpu_reset(struct jpu *jpu)
 535{
 536	jpu_write(jpu, JCCMD_SRST, JCCMD);
 537	return jpu_wait_reset(jpu);
 538}
 539
 540/*
 541 * ============================================================================
 542 * video ioctl operations
 543 * ============================================================================
 544 */
 545static void put_qtbl(u8 *p, const u8 *qtbl)
 546{
 547	unsigned int i;
 548
 549	for (i = 0; i < ARRAY_SIZE(zigzag); i++)
 550		p[i] = *(qtbl + zigzag[i]);
 551}
 552
 553static void put_htbl(u8 *p, const u8 *htbl, unsigned int len)
 554{
 555	unsigned int i, j;
 556
 557	for (i = 0; i < len; i += 4)
 558		for (j = 0; j < 4 && (i + j) < len; ++j)
 559			p[i + j] = htbl[i + 3 - j];
 560}
 561
 562static void jpu_generate_hdr(unsigned short quality, unsigned char *p)
 563{
 564	put_qtbl(p + JPU_JPEG_QTBL_LUM_OFFSET, (const u8 *)qtbl_lum[quality]);
 565	put_qtbl(p + JPU_JPEG_QTBL_CHR_OFFSET, (const u8 *)qtbl_chr[quality]);
 566
 567	put_htbl(p + JPU_JPEG_HDCTBL_LUM_OFFSET, (const u8 *)hdctbl_lum,
 568		 JPU_JPEG_HDCTBL_SIZE);
 569	put_htbl(p + JPU_JPEG_HACTBL_LUM_OFFSET, (const u8 *)hactbl_lum,
 570		 JPU_JPEG_HACTBL_SIZE);
 571
 572	put_htbl(p + JPU_JPEG_HDCTBL_CHR_OFFSET, (const u8 *)hdctbl_chr,
 573		 JPU_JPEG_HDCTBL_SIZE);
 574	put_htbl(p + JPU_JPEG_HACTBL_CHR_OFFSET, (const u8 *)hactbl_chr,
 575		 JPU_JPEG_HACTBL_SIZE);
 576}
 577
 578static int get_byte(struct jpeg_buffer *buf)
 579{
 580	if (buf->curr >= buf->end)
 581		return -1;
 582
 583	return *(u8 *)buf->curr++;
 584}
 585
 586static int get_word_be(struct jpeg_buffer *buf, unsigned int *word)
 587{
 588	if (buf->end - buf->curr < 2)
 589		return -1;
 590
 591	*word = get_unaligned_be16(buf->curr);
 592	buf->curr += 2;
 593
 594	return 0;
 595}
 596
 597static void skip(struct jpeg_buffer *buf, unsigned long len)
 598{
 599	buf->curr += min((unsigned long)(buf->end - buf->curr), len);
 600}
 601
 602static u8 jpu_parse_hdr(void *buffer, unsigned long size, unsigned int *width,
 603			  unsigned int *height)
 604{
 605	struct jpeg_buffer jpeg_buffer;
 606	unsigned int word;
 607	bool soi = false;
 608
 609	jpeg_buffer.end = buffer + size;
 610	jpeg_buffer.curr = buffer;
 611
 612	/*
 613	 * basic size check and EOI - we don't want to let JPU cross
 614	 * buffer bounds in any case. Hope it's stopping by EOI.
 615	 */
 616	if (size < JPU_JPEG_MIN_SIZE || *(u8 *)(buffer + size - 1) != EOI)
 617		return 0;
 618
 619	for (;;) {
 620		int c;
 621
 622		/* skip preceding filler bytes */
 623		do
 624			c = get_byte(&jpeg_buffer);
 625		while (c == 0xff || c == 0);
 626
 627		if (!soi && c == SOI) {
 628			soi = true;
 629			continue;
 630		} else if (soi != (c != SOI))
 631			return 0;
 632
 633		switch (c) {
 634		case SOF0: /* SOF0: baseline JPEG */
 635			skip(&jpeg_buffer, 3); /* segment length and bpp */
 636			if (get_word_be(&jpeg_buffer, height) ||
 637			    get_word_be(&jpeg_buffer, width) ||
 638			    get_byte(&jpeg_buffer) != 3) /* YCbCr only */
 639				return 0;
 640
 641			skip(&jpeg_buffer, 1);
 642			return get_byte(&jpeg_buffer);
 643		case DHT:
 644		case DQT:
 645		case COM:
 646		case DRI:
 647		case APP0 ... APP0 + 0x0f:
 648			if (get_word_be(&jpeg_buffer, &word))
 649				return 0;
 650			skip(&jpeg_buffer, (long)word - 2);
 651		case 0:
 652			break;
 653		default:
 654			return 0;
 655		}
 656	}
 657
 658	return 0;
 659}
 660
 661static int jpu_querycap(struct file *file, void *priv,
 662			struct v4l2_capability *cap)
 663{
 664	struct jpu_ctx *ctx = fh_to_ctx(priv);
 665
 666	if (ctx->encoder)
 667		strscpy(cap->card, DRV_NAME " encoder", sizeof(cap->card));
 668	else
 669		strscpy(cap->card, DRV_NAME " decoder", sizeof(cap->card));
 670
 671	strscpy(cap->driver, DRV_NAME, sizeof(cap->driver));
 672	snprintf(cap->bus_info, sizeof(cap->bus_info), "platform:%s",
 673		 dev_name(ctx->jpu->dev));
 674	memset(cap->reserved, 0, sizeof(cap->reserved));
 675
 676	return 0;
 677}
 678
 679static struct jpu_fmt *jpu_find_format(bool encoder, u32 pixelformat,
 680				       unsigned int fmt_type)
 681{
 682	unsigned int i, fmt_flag;
 683
 684	if (encoder)
 685		fmt_flag = fmt_type == JPU_FMT_TYPE_OUTPUT ? JPU_ENC_OUTPUT :
 686							     JPU_ENC_CAPTURE;
 687	else
 688		fmt_flag = fmt_type == JPU_FMT_TYPE_OUTPUT ? JPU_DEC_OUTPUT :
 689							     JPU_DEC_CAPTURE;
 690
 691	for (i = 0; i < ARRAY_SIZE(jpu_formats); i++) {
 692		struct jpu_fmt *fmt = &jpu_formats[i];
 693
 694		if (fmt->fourcc == pixelformat && fmt->types & fmt_flag)
 695			return fmt;
 696	}
 697
 698	return NULL;
 699}
 700
 701static int jpu_enum_fmt(struct v4l2_fmtdesc *f, u32 type)
 702{
 703	unsigned int i, num = 0;
 704
 705	for (i = 0; i < ARRAY_SIZE(jpu_formats); ++i) {
 706		if (jpu_formats[i].types & type) {
 707			if (num == f->index)
 708				break;
 709			++num;
 710		}
 711	}
 712
 713	if (i >= ARRAY_SIZE(jpu_formats))
 714		return -EINVAL;
 715
 716	f->pixelformat = jpu_formats[i].fourcc;
 717
 718	return 0;
 719}
 720
 721static int jpu_enum_fmt_cap(struct file *file, void *priv,
 722			    struct v4l2_fmtdesc *f)
 723{
 724	struct jpu_ctx *ctx = fh_to_ctx(priv);
 725
 726	return jpu_enum_fmt(f, ctx->encoder ? JPU_ENC_CAPTURE :
 727			    JPU_DEC_CAPTURE);
 728}
 729
 730static int jpu_enum_fmt_out(struct file *file, void *priv,
 731			    struct v4l2_fmtdesc *f)
 732{
 733	struct jpu_ctx *ctx = fh_to_ctx(priv);
 734
 735	return jpu_enum_fmt(f, ctx->encoder ? JPU_ENC_OUTPUT : JPU_DEC_OUTPUT);
 736}
 737
 738static struct jpu_q_data *jpu_get_q_data(struct jpu_ctx *ctx,
 739					 enum v4l2_buf_type type)
 740{
 741	if (V4L2_TYPE_IS_OUTPUT(type))
 742		return &ctx->out_q;
 743	else
 744		return &ctx->cap_q;
 745}
 746
 747static void jpu_bound_align_image(u32 *w, unsigned int w_min,
 748				  unsigned int w_max, unsigned int w_align,
 749				  u32 *h, unsigned int h_min,
 750				  unsigned int h_max, unsigned int h_align)
 751{
 752	unsigned int width, height, w_step, h_step;
 753
 754	width = *w;
 755	height = *h;
 756
 757	w_step = 1U << w_align;
 758	h_step = 1U << h_align;
 759	v4l_bound_align_image(w, w_min, w_max, w_align, h, h_min, h_max,
 760			      h_align, 3);
 761
 762	if (*w < width && *w + w_step < w_max)
 763		*w += w_step;
 764	if (*h < height && *h + h_step < h_max)
 765		*h += h_step;
 766}
 767
 768static int __jpu_try_fmt(struct jpu_ctx *ctx, struct jpu_fmt **fmtinfo,
 769			 struct v4l2_pix_format_mplane *pix,
 770			 enum v4l2_buf_type type)
 771{
 772	struct jpu_fmt *fmt;
 773	unsigned int f_type, w, h;
 774
 775	f_type = V4L2_TYPE_IS_OUTPUT(type) ? JPU_FMT_TYPE_OUTPUT :
 776						JPU_FMT_TYPE_CAPTURE;
 777
 778	fmt = jpu_find_format(ctx->encoder, pix->pixelformat, f_type);
 779	if (!fmt) {
 780		unsigned int pixelformat;
 781
 782		dev_dbg(ctx->jpu->dev, "unknown format; set default format\n");
 783		if (ctx->encoder)
 784			pixelformat = f_type == JPU_FMT_TYPE_OUTPUT ?
 785				V4L2_PIX_FMT_NV16M : V4L2_PIX_FMT_JPEG;
 786		else
 787			pixelformat = f_type == JPU_FMT_TYPE_CAPTURE ?
 788				V4L2_PIX_FMT_NV16M : V4L2_PIX_FMT_JPEG;
 789		fmt = jpu_find_format(ctx->encoder, pixelformat, f_type);
 790	}
 791
 792	pix->pixelformat = fmt->fourcc;
 793	pix->colorspace = fmt->colorspace;
 794	pix->field = V4L2_FIELD_NONE;
 795	pix->num_planes = fmt->num_planes;
 796	memset(pix->reserved, 0, sizeof(pix->reserved));
 797
 798	jpu_bound_align_image(&pix->width, JPU_WIDTH_MIN, JPU_WIDTH_MAX,
 799			      fmt->h_align, &pix->height, JPU_HEIGHT_MIN,
 800			      JPU_HEIGHT_MAX, fmt->v_align);
 801
 802	w = pix->width;
 803	h = pix->height;
 804
 805	if (fmt->fourcc == V4L2_PIX_FMT_JPEG) {
 806		/* ignore userspaces's sizeimage for encoding */
 807		if (pix->plane_fmt[0].sizeimage <= 0 || ctx->encoder)
 808			pix->plane_fmt[0].sizeimage = JPU_JPEG_HDR_SIZE +
 809				(JPU_JPEG_MAX_BYTES_PER_PIXEL * w * h);
 810		pix->plane_fmt[0].bytesperline = 0;
 811		memset(pix->plane_fmt[0].reserved, 0,
 812		       sizeof(pix->plane_fmt[0].reserved));
 813	} else {
 814		unsigned int i, bpl = 0;
 815
 816		for (i = 0; i < pix->num_planes; ++i)
 817			bpl = max(bpl, pix->plane_fmt[i].bytesperline);
 818
 819		bpl = clamp_t(unsigned int, bpl, w, JPU_WIDTH_MAX);
 820		bpl = round_up(bpl, JPU_MEMALIGN);
 821
 822		for (i = 0; i < pix->num_planes; ++i) {
 823			pix->plane_fmt[i].bytesperline = bpl;
 824			pix->plane_fmt[i].sizeimage = bpl * h * fmt->bpp[i] / 8;
 825			memset(pix->plane_fmt[i].reserved, 0,
 826			       sizeof(pix->plane_fmt[i].reserved));
 827		}
 828	}
 829
 830	if (fmtinfo)
 831		*fmtinfo = fmt;
 832
 833	return 0;
 834}
 835
 836static int jpu_try_fmt(struct file *file, void *priv, struct v4l2_format *f)
 837{
 838	struct jpu_ctx *ctx = fh_to_ctx(priv);
 839
 840	if (!v4l2_m2m_get_vq(ctx->fh.m2m_ctx, f->type))
 841		return -EINVAL;
 842
 843	return __jpu_try_fmt(ctx, NULL, &f->fmt.pix_mp, f->type);
 844}
 845
 846static int jpu_s_fmt(struct file *file, void *priv, struct v4l2_format *f)
 847{
 848	struct vb2_queue *vq;
 849	struct jpu_ctx *ctx = fh_to_ctx(priv);
 850	struct v4l2_m2m_ctx *m2m_ctx = ctx->fh.m2m_ctx;
 851	struct jpu_fmt *fmtinfo;
 852	struct jpu_q_data *q_data;
 853	int ret;
 854
 855	vq = v4l2_m2m_get_vq(m2m_ctx, f->type);
 856	if (!vq)
 857		return -EINVAL;
 858
 859	if (vb2_is_busy(vq)) {
 860		v4l2_err(&ctx->jpu->v4l2_dev, "%s queue busy\n", __func__);
 861		return -EBUSY;
 862	}
 863
 864	ret = __jpu_try_fmt(ctx, &fmtinfo, &f->fmt.pix_mp, f->type);
 865	if (ret < 0)
 866		return ret;
 867
 868	q_data = jpu_get_q_data(ctx, f->type);
 869
 870	q_data->format = f->fmt.pix_mp;
 871	q_data->fmtinfo = fmtinfo;
 872
 873	return 0;
 874}
 875
 876static int jpu_g_fmt(struct file *file, void *priv, struct v4l2_format *f)
 877{
 878	struct jpu_q_data *q_data;
 879	struct jpu_ctx *ctx = fh_to_ctx(priv);
 880
 881	if (!v4l2_m2m_get_vq(ctx->fh.m2m_ctx, f->type))
 882		return -EINVAL;
 883
 884	q_data = jpu_get_q_data(ctx, f->type);
 885	f->fmt.pix_mp = q_data->format;
 886
 887	return 0;
 888}
 889
 890/*
 891 * V4L2 controls
 892 */
 893static int jpu_s_ctrl(struct v4l2_ctrl *ctrl)
 894{
 895	struct jpu_ctx *ctx = ctrl_to_ctx(ctrl);
 896	unsigned long flags;
 897
 898	spin_lock_irqsave(&ctx->jpu->lock, flags);
 899	if (ctrl->id == V4L2_CID_JPEG_COMPRESSION_QUALITY)
 900		ctx->compr_quality = ctrl->val;
 901	spin_unlock_irqrestore(&ctx->jpu->lock, flags);
 902
 903	return 0;
 904}
 905
 906static const struct v4l2_ctrl_ops jpu_ctrl_ops = {
 907	.s_ctrl		= jpu_s_ctrl,
 908};
 909
 910static int jpu_streamon(struct file *file, void *priv, enum v4l2_buf_type type)
 911{
 912	struct jpu_ctx *ctx = fh_to_ctx(priv);
 913	struct jpu_q_data *src_q_data, *dst_q_data, *orig, adj, *ref;
 914	enum v4l2_buf_type adj_type;
 915
 916	src_q_data = jpu_get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
 917	dst_q_data = jpu_get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE);
 918
 919	if (ctx->encoder) {
 920		adj = *src_q_data;
 921		orig = src_q_data;
 922		ref = dst_q_data;
 923		adj_type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
 924	} else {
 925		adj = *dst_q_data;
 926		orig = dst_q_data;
 927		ref = src_q_data;
 928		adj_type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
 929	}
 930
 931	adj.format.width = ref->format.width;
 932	adj.format.height = ref->format.height;
 933
 934	__jpu_try_fmt(ctx, NULL, &adj.format, adj_type);
 935
 936	if (adj.format.width != orig->format.width ||
 937	    adj.format.height != orig->format.height) {
 938		dev_err(ctx->jpu->dev, "src and dst formats do not match.\n");
 939		/* maybe we can return -EPIPE here? */
 940		return -EINVAL;
 941	}
 942
 943	return v4l2_m2m_streamon(file, ctx->fh.m2m_ctx, type);
 944}
 945
 946static const struct v4l2_ioctl_ops jpu_ioctl_ops = {
 947	.vidioc_querycap		= jpu_querycap,
 948
 949	.vidioc_enum_fmt_vid_cap	= jpu_enum_fmt_cap,
 950	.vidioc_enum_fmt_vid_out	= jpu_enum_fmt_out,
 951	.vidioc_g_fmt_vid_cap_mplane	= jpu_g_fmt,
 952	.vidioc_g_fmt_vid_out_mplane	= jpu_g_fmt,
 953	.vidioc_try_fmt_vid_cap_mplane	= jpu_try_fmt,
 954	.vidioc_try_fmt_vid_out_mplane	= jpu_try_fmt,
 955	.vidioc_s_fmt_vid_cap_mplane	= jpu_s_fmt,
 956	.vidioc_s_fmt_vid_out_mplane	= jpu_s_fmt,
 957
 958	.vidioc_reqbufs			= v4l2_m2m_ioctl_reqbufs,
 959	.vidioc_create_bufs             = v4l2_m2m_ioctl_create_bufs,
 960	.vidioc_querybuf		= v4l2_m2m_ioctl_querybuf,
 961	.vidioc_qbuf			= v4l2_m2m_ioctl_qbuf,
 962	.vidioc_dqbuf			= v4l2_m2m_ioctl_dqbuf,
 963	.vidioc_expbuf			= v4l2_m2m_ioctl_expbuf,
 964
 965	.vidioc_streamon		= jpu_streamon,
 966	.vidioc_streamoff		= v4l2_m2m_ioctl_streamoff,
 967
 968	.vidioc_subscribe_event		= v4l2_ctrl_subscribe_event,
 969	.vidioc_unsubscribe_event	= v4l2_event_unsubscribe
 970};
 971
 972static int jpu_controls_create(struct jpu_ctx *ctx)
 973{
 974	struct v4l2_ctrl *ctrl;
 975	int ret;
 976
 977	v4l2_ctrl_handler_init(&ctx->ctrl_handler, 1);
 978
 979	ctrl = v4l2_ctrl_new_std(&ctx->ctrl_handler, &jpu_ctrl_ops,
 980				 V4L2_CID_JPEG_COMPRESSION_QUALITY,
 981				 0, JPU_MAX_QUALITY - 1, 1, 0);
 982
 983	if (ctx->ctrl_handler.error) {
 984		ret = ctx->ctrl_handler.error;
 985		goto error_free;
 986	}
 987
 988	if (!ctx->encoder)
 989		ctrl->flags |= V4L2_CTRL_FLAG_VOLATILE |
 990				V4L2_CTRL_FLAG_READ_ONLY;
 991
 992	ret = v4l2_ctrl_handler_setup(&ctx->ctrl_handler);
 993	if (ret < 0)
 994		goto error_free;
 995
 996	return 0;
 997
 998error_free:
 999	v4l2_ctrl_handler_free(&ctx->ctrl_handler);
1000	return ret;
1001}
1002
1003/*
1004 * ============================================================================
1005 * Queue operations
1006 * ============================================================================
1007 */
1008static int jpu_queue_setup(struct vb2_queue *vq,
1009			   unsigned int *nbuffers, unsigned int *nplanes,
1010			   unsigned int sizes[], struct device *alloc_devs[])
1011{
1012	struct jpu_ctx *ctx = vb2_get_drv_priv(vq);
1013	struct jpu_q_data *q_data;
1014	unsigned int i;
1015
1016	q_data = jpu_get_q_data(ctx, vq->type);
1017
1018	if (*nplanes) {
1019		if (*nplanes != q_data->format.num_planes)
1020			return -EINVAL;
1021
1022		for (i = 0; i < *nplanes; i++) {
1023			unsigned int q_size = q_data->format.plane_fmt[i].sizeimage;
1024
1025			if (sizes[i] < q_size)
1026				return -EINVAL;
1027		}
1028		return 0;
1029	}
1030
1031	*nplanes = q_data->format.num_planes;
1032
1033	for (i = 0; i < *nplanes; i++)
1034		sizes[i] = q_data->format.plane_fmt[i].sizeimage;
1035
1036	return 0;
1037}
1038
1039static int jpu_buf_prepare(struct vb2_buffer *vb)
1040{
1041	struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
1042	struct jpu_ctx *ctx = vb2_get_drv_priv(vb->vb2_queue);
1043	struct jpu_q_data *q_data;
1044	unsigned int i;
1045
1046	q_data = jpu_get_q_data(ctx, vb->vb2_queue->type);
1047
1048	if (V4L2_TYPE_IS_OUTPUT(vb->vb2_queue->type)) {
1049		if (vbuf->field == V4L2_FIELD_ANY)
1050			vbuf->field = V4L2_FIELD_NONE;
1051		if (vbuf->field != V4L2_FIELD_NONE) {
1052			dev_err(ctx->jpu->dev, "%s field isn't supported\n",
1053					__func__);
1054			return -EINVAL;
1055		}
1056	}
1057
1058	for (i = 0; i < q_data->format.num_planes; i++) {
1059		unsigned long size = q_data->format.plane_fmt[i].sizeimage;
1060
1061		if (vb2_plane_size(vb, i) < size) {
1062			dev_err(ctx->jpu->dev,
1063				"%s: data will not fit into plane (%lu < %lu)\n",
1064			       __func__, vb2_plane_size(vb, i), size);
1065			return -EINVAL;
1066		}
1067
1068		/* decoder capture queue */
1069		if (!ctx->encoder && !V4L2_TYPE_IS_OUTPUT(vb->vb2_queue->type))
1070			vb2_set_plane_payload(vb, i, size);
1071	}
1072
1073	return 0;
1074}
1075
1076static void jpu_buf_queue(struct vb2_buffer *vb)
1077{
1078	struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
1079	struct jpu_ctx *ctx = vb2_get_drv_priv(vb->vb2_queue);
1080
1081	if (!ctx->encoder && V4L2_TYPE_IS_OUTPUT(vb->vb2_queue->type)) {
1082		struct jpu_buffer *jpu_buf = vb2_to_jpu_buffer(vbuf);
1083		struct jpu_q_data *q_data, adjust;
1084		void *buffer = vb2_plane_vaddr(vb, 0);
1085		unsigned long buf_size = vb2_get_plane_payload(vb, 0);
1086		unsigned int width, height;
1087
1088		u8 subsampling = jpu_parse_hdr(buffer, buf_size, &width,
1089						 &height);
1090
1091		/* check if JPEG data basic parsing was successful */
1092		if (subsampling != JPU_JPEG_422 && subsampling != JPU_JPEG_420)
1093			goto format_error;
1094
1095		q_data = &ctx->out_q;
1096
1097		adjust = *q_data;
1098		adjust.format.width = width;
1099		adjust.format.height = height;
1100
1101		__jpu_try_fmt(ctx, &adjust.fmtinfo, &adjust.format,
1102			      V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
1103
1104		if (adjust.format.width != q_data->format.width ||
1105		    adjust.format.height != q_data->format.height)
1106			goto format_error;
1107
1108		/*
1109		 * keep subsampling in buffer to check it
1110		 * for compatibility in device_run
1111		 */
1112		jpu_buf->subsampling = subsampling;
1113	}
1114
1115	if (ctx->fh.m2m_ctx)
1116		v4l2_m2m_buf_queue(ctx->fh.m2m_ctx, vbuf);
1117
1118	return;
1119
1120format_error:
1121	dev_err(ctx->jpu->dev, "incompatible or corrupted JPEG data\n");
1122	vb2_buffer_done(vb, VB2_BUF_STATE_ERROR);
1123}
1124
1125static void jpu_buf_finish(struct vb2_buffer *vb)
1126{
1127	struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
1128	struct jpu_buffer *jpu_buf = vb2_to_jpu_buffer(vbuf);
1129	struct jpu_ctx *ctx = vb2_get_drv_priv(vb->vb2_queue);
1130	struct jpu_q_data *q_data = &ctx->out_q;
1131	enum v4l2_buf_type type = vb->vb2_queue->type;
1132	u8 *buffer;
1133
1134	if (vb->state == VB2_BUF_STATE_DONE)
1135		vbuf->sequence = jpu_get_q_data(ctx, type)->sequence++;
1136
1137	if (!ctx->encoder || vb->state != VB2_BUF_STATE_DONE ||
1138	    V4L2_TYPE_IS_OUTPUT(type))
1139		return;
1140
1141	buffer = vb2_plane_vaddr(vb, 0);
1142
1143	memcpy(buffer, jpeg_hdrs[jpu_buf->compr_quality], JPU_JPEG_HDR_SIZE);
1144	*(__be16 *)(buffer + JPU_JPEG_HEIGHT_OFFSET) =
1145					cpu_to_be16(q_data->format.height);
1146	*(__be16 *)(buffer + JPU_JPEG_WIDTH_OFFSET) =
1147					cpu_to_be16(q_data->format.width);
1148	*(buffer + JPU_JPEG_SUBS_OFFSET) = q_data->fmtinfo->subsampling;
1149}
1150
1151static int jpu_start_streaming(struct vb2_queue *vq, unsigned count)
1152{
1153	struct jpu_ctx *ctx = vb2_get_drv_priv(vq);
1154	struct jpu_q_data *q_data = jpu_get_q_data(ctx, vq->type);
1155
1156	q_data->sequence = 0;
1157	return 0;
1158}
1159
1160static void jpu_stop_streaming(struct vb2_queue *vq)
1161{
1162	struct jpu_ctx *ctx = vb2_get_drv_priv(vq);
1163	struct vb2_v4l2_buffer *vb;
1164	unsigned long flags;
1165
1166	for (;;) {
1167		if (V4L2_TYPE_IS_OUTPUT(vq->type))
1168			vb = v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx);
1169		else
1170			vb = v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx);
1171		if (vb == NULL)
1172			return;
1173		spin_lock_irqsave(&ctx->jpu->lock, flags);
1174		v4l2_m2m_buf_done(vb, VB2_BUF_STATE_ERROR);
1175		spin_unlock_irqrestore(&ctx->jpu->lock, flags);
1176	}
1177}
1178
1179static const struct vb2_ops jpu_qops = {
1180	.queue_setup		= jpu_queue_setup,
1181	.buf_prepare		= jpu_buf_prepare,
1182	.buf_queue		= jpu_buf_queue,
1183	.buf_finish		= jpu_buf_finish,
1184	.start_streaming	= jpu_start_streaming,
1185	.stop_streaming		= jpu_stop_streaming,
1186	.wait_prepare		= vb2_ops_wait_prepare,
1187	.wait_finish		= vb2_ops_wait_finish,
1188};
1189
1190static int jpu_queue_init(void *priv, struct vb2_queue *src_vq,
1191			  struct vb2_queue *dst_vq)
1192{
1193	struct jpu_ctx *ctx = priv;
1194	int ret;
1195
1196	memset(src_vq, 0, sizeof(*src_vq));
1197	src_vq->type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
1198	src_vq->io_modes = VB2_MMAP | VB2_DMABUF;
1199	src_vq->drv_priv = ctx;
1200	src_vq->buf_struct_size = sizeof(struct jpu_buffer);
1201	src_vq->ops = &jpu_qops;
1202	src_vq->mem_ops = &vb2_dma_contig_memops;
1203	src_vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY;
1204	src_vq->lock = &ctx->jpu->mutex;
1205	src_vq->dev = ctx->jpu->v4l2_dev.dev;
1206
1207	ret = vb2_queue_init(src_vq);
1208	if (ret)
1209		return ret;
1210
1211	memset(dst_vq, 0, sizeof(*dst_vq));
1212	dst_vq->type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1213	dst_vq->io_modes = VB2_MMAP | VB2_DMABUF;
1214	dst_vq->drv_priv = ctx;
1215	dst_vq->buf_struct_size = sizeof(struct jpu_buffer);
1216	dst_vq->ops = &jpu_qops;
1217	dst_vq->mem_ops = &vb2_dma_contig_memops;
1218	dst_vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY;
1219	dst_vq->lock = &ctx->jpu->mutex;
1220	dst_vq->dev = ctx->jpu->v4l2_dev.dev;
1221
1222	return vb2_queue_init(dst_vq);
1223}
1224
1225/*
1226 * ============================================================================
1227 * Device file operations
1228 * ============================================================================
1229 */
1230static int jpu_open(struct file *file)
1231{
1232	struct jpu *jpu = video_drvdata(file);
1233	struct video_device *vfd = video_devdata(file);
1234	struct jpu_ctx *ctx;
1235	int ret;
1236
1237	ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
1238	if (!ctx)
1239		return -ENOMEM;
1240
1241	v4l2_fh_init(&ctx->fh, vfd);
1242	ctx->fh.ctrl_handler = &ctx->ctrl_handler;
1243	file->private_data = &ctx->fh;
1244	v4l2_fh_add(&ctx->fh);
1245
1246	ctx->jpu = jpu;
1247	ctx->encoder = vfd == &jpu->vfd_encoder;
1248
1249	__jpu_try_fmt(ctx, &ctx->out_q.fmtinfo, &ctx->out_q.format,
1250		      V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
1251	__jpu_try_fmt(ctx, &ctx->cap_q.fmtinfo, &ctx->cap_q.format,
1252		      V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE);
1253
1254	ctx->fh.m2m_ctx = v4l2_m2m_ctx_init(jpu->m2m_dev, ctx, jpu_queue_init);
1255	if (IS_ERR(ctx->fh.m2m_ctx)) {
1256		ret = PTR_ERR(ctx->fh.m2m_ctx);
1257		goto v4l_prepare_rollback;
1258	}
1259
1260	ret = jpu_controls_create(ctx);
1261	if (ret < 0)
1262		goto v4l_prepare_rollback;
1263
1264	if (mutex_lock_interruptible(&jpu->mutex)) {
1265		ret = -ERESTARTSYS;
1266		goto v4l_prepare_rollback;
1267	}
1268
1269	if (jpu->ref_count == 0) {
1270		ret = clk_prepare_enable(jpu->clk);
1271		if (ret < 0)
1272			goto device_prepare_rollback;
1273		/* ...issue software reset */
1274		ret = jpu_reset(jpu);
1275		if (ret)
1276			goto jpu_reset_rollback;
1277	}
1278
1279	jpu->ref_count++;
1280
1281	mutex_unlock(&jpu->mutex);
1282	return 0;
1283
1284jpu_reset_rollback:
1285	clk_disable_unprepare(jpu->clk);
1286device_prepare_rollback:
1287	mutex_unlock(&jpu->mutex);
1288v4l_prepare_rollback:
1289	v4l2_fh_del(&ctx->fh);
1290	v4l2_fh_exit(&ctx->fh);
1291	kfree(ctx);
1292	return ret;
1293}
1294
1295static int jpu_release(struct file *file)
1296{
1297	struct jpu *jpu = video_drvdata(file);
1298	struct jpu_ctx *ctx = fh_to_ctx(file->private_data);
1299
1300	v4l2_m2m_ctx_release(ctx->fh.m2m_ctx);
1301	v4l2_ctrl_handler_free(&ctx->ctrl_handler);
1302	v4l2_fh_del(&ctx->fh);
1303	v4l2_fh_exit(&ctx->fh);
1304	kfree(ctx);
1305
1306	mutex_lock(&jpu->mutex);
1307	if (--jpu->ref_count == 0)
1308		clk_disable_unprepare(jpu->clk);
1309	mutex_unlock(&jpu->mutex);
1310
1311	return 0;
1312}
1313
1314static const struct v4l2_file_operations jpu_fops = {
1315	.owner		= THIS_MODULE,
1316	.open		= jpu_open,
1317	.release	= jpu_release,
1318	.unlocked_ioctl	= video_ioctl2,
1319	.poll		= v4l2_m2m_fop_poll,
1320	.mmap		= v4l2_m2m_fop_mmap,
1321};
1322
1323/*
1324 * ============================================================================
1325 * mem2mem callbacks
1326 * ============================================================================
1327 */
1328static void jpu_cleanup(struct jpu_ctx *ctx, bool reset)
1329{
1330	/* remove current buffers and finish job */
1331	struct vb2_v4l2_buffer *src_buf, *dst_buf;
1332	unsigned long flags;
1333
1334	spin_lock_irqsave(&ctx->jpu->lock, flags);
1335
1336	src_buf = v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx);
1337	dst_buf = v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx);
1338
1339	v4l2_m2m_buf_done(src_buf, VB2_BUF_STATE_ERROR);
1340	v4l2_m2m_buf_done(dst_buf, VB2_BUF_STATE_ERROR);
1341
1342	/* ...and give it a chance on next run */
1343	if (reset)
1344		jpu_write(ctx->jpu, JCCMD_SRST, JCCMD);
1345
1346	spin_unlock_irqrestore(&ctx->jpu->lock, flags);
1347
1348	v4l2_m2m_job_finish(ctx->jpu->m2m_dev, ctx->fh.m2m_ctx);
1349}
1350
1351static void jpu_device_run(void *priv)
1352{
1353	struct jpu_ctx *ctx = priv;
1354	struct jpu *jpu = ctx->jpu;
1355	struct jpu_buffer *jpu_buf;
1356	struct jpu_q_data *q_data;
1357	struct vb2_v4l2_buffer *src_buf, *dst_buf;
1358	unsigned int w, h, bpl;
1359	unsigned char num_planes, subsampling;
1360	unsigned long flags;
1361
1362	/* ...wait until module reset completes; we have mutex locked here */
1363	if (jpu_wait_reset(jpu)) {
1364		jpu_cleanup(ctx, true);
1365		return;
1366	}
1367
1368	spin_lock_irqsave(&ctx->jpu->lock, flags);
1369
1370	jpu->curr = ctx;
1371
1372	src_buf = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx);
1373	dst_buf = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx);
1374
1375	if (ctx->encoder) {
1376		jpu_buf = vb2_to_jpu_buffer(dst_buf);
1377		q_data = &ctx->out_q;
1378	} else {
1379		jpu_buf = vb2_to_jpu_buffer(src_buf);
1380		q_data = &ctx->cap_q;
1381	}
1382
1383	w = q_data->format.width;
1384	h = q_data->format.height;
1385	bpl = q_data->format.plane_fmt[0].bytesperline;
1386	num_planes = q_data->fmtinfo->num_planes;
1387	subsampling = q_data->fmtinfo->subsampling;
1388
1389	if (ctx->encoder) {
1390		unsigned long src_1_addr, src_2_addr, dst_addr;
1391		unsigned int redu, inft;
1392
1393		dst_addr = vb2_dma_contig_plane_dma_addr(&dst_buf->vb2_buf, 0);
1394		src_1_addr =
1395			vb2_dma_contig_plane_dma_addr(&src_buf->vb2_buf, 0);
1396		if (num_planes > 1)
1397			src_2_addr = vb2_dma_contig_plane_dma_addr(
1398					&src_buf->vb2_buf, 1);
1399		else
1400			src_2_addr = src_1_addr + w * h;
1401
1402		jpu_buf->compr_quality = ctx->compr_quality;
1403
1404		if (subsampling == JPU_JPEG_420) {
1405			redu = JCMOD_REDU_420;
1406			inft = JIFECNT_INFT_420;
1407		} else {
1408			redu = JCMOD_REDU_422;
1409			inft = JIFECNT_INFT_422;
1410		}
1411
1412		/* only no marker mode works for encoding */
1413		jpu_write(jpu, JCMOD_DSP_ENC | JCMOD_PCTR | redu |
1414			  JCMOD_MSKIP_ENABLE, JCMOD);
1415
1416		jpu_write(jpu, JIFECNT_SWAP_WB | inft, JIFECNT);
1417		jpu_write(jpu, JIFDCNT_SWAP_WB, JIFDCNT);
1418		jpu_write(jpu, JINTE_TRANSF_COMPL, JINTE);
1419
1420		/* Y and C components source addresses */
1421		jpu_write(jpu, src_1_addr, JIFESYA1);
1422		jpu_write(jpu, src_2_addr, JIFESCA1);
1423
1424		/* memory width */
1425		jpu_write(jpu, bpl, JIFESMW);
1426
1427		jpu_write(jpu, (w >> 8) & JCSZ_MASK, JCHSZU);
1428		jpu_write(jpu, w & JCSZ_MASK, JCHSZD);
1429
1430		jpu_write(jpu, (h >> 8) & JCSZ_MASK, JCVSZU);
1431		jpu_write(jpu, h & JCSZ_MASK, JCVSZD);
1432
1433		jpu_write(jpu, w, JIFESHSZ);
1434		jpu_write(jpu, h, JIFESVSZ);
1435
1436		jpu_write(jpu, dst_addr + JPU_JPEG_HDR_SIZE, JIFEDA1);
1437
1438		jpu_write(jpu, 0 << JCQTN_SHIFT(1) | 1 << JCQTN_SHIFT(2) |
1439			  1 << JCQTN_SHIFT(3), JCQTN);
1440
1441		jpu_write(jpu, 0 << JCHTN_AC_SHIFT(1) | 0 << JCHTN_DC_SHIFT(1) |
1442			  1 << JCHTN_AC_SHIFT(2) | 1 << JCHTN_DC_SHIFT(2) |
1443			  1 << JCHTN_AC_SHIFT(3) | 1 << JCHTN_DC_SHIFT(3),
1444			  JCHTN);
1445
1446		jpu_set_qtbl(jpu, ctx->compr_quality);
1447		jpu_set_htbl(jpu);
1448	} else {
1449		unsigned long src_addr, dst_1_addr, dst_2_addr;
1450
1451		if (jpu_buf->subsampling != subsampling) {
1452			dev_err(ctx->jpu->dev,
1453				"src and dst formats do not match.\n");
1454			spin_unlock_irqrestore(&ctx->jpu->lock, flags);
1455			jpu_cleanup(ctx, false);
1456			return;
1457		}
1458
1459		src_addr = vb2_dma_contig_plane_dma_addr(&src_buf->vb2_buf, 0);
1460		dst_1_addr =
1461			vb2_dma_contig_plane_dma_addr(&dst_buf->vb2_buf, 0);
1462		if (q_data->fmtinfo->num_planes > 1)
1463			dst_2_addr = vb2_dma_contig_plane_dma_addr(
1464					&dst_buf->vb2_buf, 1);
1465		else
1466			dst_2_addr = dst_1_addr + w * h;
1467
1468		/* ...set up decoder operation */
1469		jpu_write(jpu, JCMOD_DSP_DEC | JCMOD_PCTR, JCMOD);
1470		jpu_write(jpu, JIFECNT_SWAP_WB, JIFECNT);
1471		jpu_write(jpu, JIFDCNT_SWAP_WB, JIFDCNT);
1472
1473		/* ...enable interrupts on transfer completion and d-g error */
1474		jpu_write(jpu, JINTE_TRANSF_COMPL | JINTE_ERR, JINTE);
1475
1476		/* ...set source/destination addresses of encoded data */
1477		jpu_write(jpu, src_addr, JIFDSA1);
1478		jpu_write(jpu, dst_1_addr, JIFDDYA1);
1479		jpu_write(jpu, dst_2_addr, JIFDDCA1);
1480
1481		jpu_write(jpu, bpl, JIFDDMW);
1482	}
1483
1484	/* ...start encoder/decoder operation */
1485	jpu_write(jpu, JCCMD_JSRT, JCCMD);
1486
1487	spin_unlock_irqrestore(&ctx->jpu->lock, flags);
1488}
1489
1490static const struct v4l2_m2m_ops jpu_m2m_ops = {
1491	.device_run	= jpu_device_run,
1492};
1493
1494/*
1495 * ============================================================================
1496 * IRQ handler
1497 * ============================================================================
1498 */
1499static irqreturn_t jpu_irq_handler(int irq, void *dev_id)
1500{
1501	struct jpu *jpu = dev_id;
1502	struct jpu_ctx *curr_ctx;
1503	struct vb2_v4l2_buffer *src_buf, *dst_buf;
1504	unsigned int int_status;
1505
1506	int_status = jpu_read(jpu, JINTS);
1507
1508	/* ...spurious interrupt */
1509	if (!((JINTS_TRANSF_COMPL | JINTS_PROCESS_COMPL | JINTS_ERR) &
1510	    int_status))
1511		return IRQ_NONE;
1512
1513	/* ...clear interrupts */
1514	jpu_write(jpu, ~(int_status & JINTS_MASK), JINTS);
1515	if (int_status & (JINTS_ERR | JINTS_PROCESS_COMPL))
1516		jpu_write(jpu, JCCMD_JEND, JCCMD);
1517
1518	spin_lock(&jpu->lock);
1519
1520	if ((int_status & JINTS_PROCESS_COMPL) &&
1521	   !(int_status & JINTS_TRANSF_COMPL))
1522		goto handled;
1523
1524	curr_ctx = v4l2_m2m_get_curr_priv(jpu->m2m_dev);
1525	if (!curr_ctx) {
1526		/* ...instance is not running */
1527		dev_err(jpu->dev, "no active context for m2m\n");
1528		goto handled;
1529	}
1530
1531	src_buf = v4l2_m2m_src_buf_remove(curr_ctx->fh.m2m_ctx);
1532	dst_buf = v4l2_m2m_dst_buf_remove(curr_ctx->fh.m2m_ctx);
1533
1534	if (int_status & JINTS_TRANSF_COMPL) {
1535		if (curr_ctx->encoder) {
1536			unsigned long payload_size = jpu_read(jpu, JCDTCU) << 16
1537						   | jpu_read(jpu, JCDTCM) << 8
1538						   | jpu_read(jpu, JCDTCD);
1539			vb2_set_plane_payload(&dst_buf->vb2_buf, 0,
1540				payload_size + JPU_JPEG_HDR_SIZE);
1541		}
1542
1543		dst_buf->field = src_buf->field;
1544		dst_buf->vb2_buf.timestamp = src_buf->vb2_buf.timestamp;
1545		if (src_buf->flags & V4L2_BUF_FLAG_TIMECODE)
1546			dst_buf->timecode = src_buf->timecode;
1547		dst_buf->flags = src_buf->flags &
1548			(V4L2_BUF_FLAG_TIMECODE | V4L2_BUF_FLAG_KEYFRAME |
1549			 V4L2_BUF_FLAG_PFRAME | V4L2_BUF_FLAG_BFRAME |
1550			 V4L2_BUF_FLAG_TSTAMP_SRC_MASK);
1551
1552		v4l2_m2m_buf_done(src_buf, VB2_BUF_STATE_DONE);
1553		v4l2_m2m_buf_done(dst_buf, VB2_BUF_STATE_DONE);
1554	} else if (int_status & JINTS_ERR) {
1555		unsigned char error = jpu_read(jpu, JCDERR) & JCDERR_MASK;
1556
1557		dev_dbg(jpu->dev, "processing error: %#X: %s\n", error,
1558			error_to_text[error]);
1559
1560		v4l2_m2m_buf_done(src_buf, VB2_BUF_STATE_ERROR);
1561		v4l2_m2m_buf_done(dst_buf, VB2_BUF_STATE_ERROR);
1562	}
1563
1564	jpu->curr = NULL;
1565
1566	/* ...reset JPU after completion */
1567	jpu_write(jpu, JCCMD_SRST, JCCMD);
1568	spin_unlock(&jpu->lock);
1569
1570	v4l2_m2m_job_finish(jpu->m2m_dev, curr_ctx->fh.m2m_ctx);
1571
1572	return IRQ_HANDLED;
1573
1574handled:
1575	spin_unlock(&jpu->lock);
1576	return IRQ_HANDLED;
1577}
1578
1579/*
1580 * ============================================================================
1581 * Driver basic infrastructure
1582 * ============================================================================
1583 */
1584static const struct of_device_id jpu_dt_ids[] = {
1585	{ .compatible = "renesas,jpu-r8a7790" }, /* H2 */
1586	{ .compatible = "renesas,jpu-r8a7791" }, /* M2-W */
1587	{ .compatible = "renesas,jpu-r8a7792" }, /* V2H */
1588	{ .compatible = "renesas,jpu-r8a7793" }, /* M2-N */
1589	{ .compatible = "renesas,rcar-gen2-jpu" },
1590	{ },
1591};
1592MODULE_DEVICE_TABLE(of, jpu_dt_ids);
1593
1594static int jpu_probe(struct platform_device *pdev)
1595{
1596	struct jpu *jpu;
1597	struct resource *res;
1598	int ret;
1599	unsigned int i;
1600
1601	jpu = devm_kzalloc(&pdev->dev, sizeof(*jpu), GFP_KERNEL);
1602	if (!jpu)
1603		return -ENOMEM;
1604
1605	mutex_init(&jpu->mutex);
1606	spin_lock_init(&jpu->lock);
1607	jpu->dev = &pdev->dev;
1608
1609	/* memory-mapped registers */
1610	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1611	jpu->regs = devm_ioremap_resource(&pdev->dev, res);
1612	if (IS_ERR(jpu->regs))
1613		return PTR_ERR(jpu->regs);
1614
1615	/* interrupt service routine registration */
1616	jpu->irq = ret = platform_get_irq(pdev, 0);
1617	if (ret < 0) {
1618		dev_err(&pdev->dev, "cannot find IRQ\n");
1619		return ret;
1620	}
1621
1622	ret = devm_request_irq(&pdev->dev, jpu->irq, jpu_irq_handler, 0,
1623			       dev_name(&pdev->dev), jpu);
1624	if (ret) {
1625		dev_err(&pdev->dev, "cannot claim IRQ %d\n", jpu->irq);
1626		return ret;
1627	}
1628
1629	/* clocks */
1630	jpu->clk = devm_clk_get(&pdev->dev, NULL);
1631	if (IS_ERR(jpu->clk)) {
1632		dev_err(&pdev->dev, "cannot get clock\n");
1633		return PTR_ERR(jpu->clk);
1634	}
1635
1636	/* v4l2 device */
1637	ret = v4l2_device_register(&pdev->dev, &jpu->v4l2_dev);
1638	if (ret) {
1639		dev_err(&pdev->dev, "Failed to register v4l2 device\n");
1640		return ret;
1641	}
1642
1643	/* mem2mem device */
1644	jpu->m2m_dev = v4l2_m2m_init(&jpu_m2m_ops);
1645	if (IS_ERR(jpu->m2m_dev)) {
1646		v4l2_err(&jpu->v4l2_dev, "Failed to init mem2mem device\n");
1647		ret = PTR_ERR(jpu->m2m_dev);
1648		goto device_register_rollback;
1649	}
1650
1651	/* fill in qantization and Huffman tables for encoder */
1652	for (i = 0; i < JPU_MAX_QUALITY; i++)
1653		jpu_generate_hdr(i, (unsigned char *)jpeg_hdrs[i]);
1654
1655	strscpy(jpu->vfd_encoder.name, DRV_NAME, sizeof(jpu->vfd_encoder.name));
1656	jpu->vfd_encoder.fops		= &jpu_fops;
1657	jpu->vfd_encoder.ioctl_ops	= &jpu_ioctl_ops;
1658	jpu->vfd_encoder.minor		= -1;
1659	jpu->vfd_encoder.release	= video_device_release_empty;
1660	jpu->vfd_encoder.lock		= &jpu->mutex;
1661	jpu->vfd_encoder.v4l2_dev	= &jpu->v4l2_dev;
1662	jpu->vfd_encoder.vfl_dir	= VFL_DIR_M2M;
1663	jpu->vfd_encoder.device_caps	= V4L2_CAP_STREAMING |
1664					  V4L2_CAP_VIDEO_M2M_MPLANE;
1665
1666	ret = video_register_device(&jpu->vfd_encoder, VFL_TYPE_GRABBER, -1);
1667	if (ret) {
1668		v4l2_err(&jpu->v4l2_dev, "Failed to register video device\n");
1669		goto m2m_init_rollback;
1670	}
1671
1672	video_set_drvdata(&jpu->vfd_encoder, jpu);
1673
1674	strscpy(jpu->vfd_decoder.name, DRV_NAME, sizeof(jpu->vfd_decoder.name));
1675	jpu->vfd_decoder.fops		= &jpu_fops;
1676	jpu->vfd_decoder.ioctl_ops	= &jpu_ioctl_ops;
1677	jpu->vfd_decoder.minor		= -1;
1678	jpu->vfd_decoder.release	= video_device_release_empty;
1679	jpu->vfd_decoder.lock		= &jpu->mutex;
1680	jpu->vfd_decoder.v4l2_dev	= &jpu->v4l2_dev;
1681	jpu->vfd_decoder.vfl_dir	= VFL_DIR_M2M;
1682	jpu->vfd_decoder.device_caps	= V4L2_CAP_STREAMING |
1683					  V4L2_CAP_VIDEO_M2M_MPLANE;
1684
1685	ret = video_register_device(&jpu->vfd_decoder, VFL_TYPE_GRABBER, -1);
1686	if (ret) {
1687		v4l2_err(&jpu->v4l2_dev, "Failed to register video device\n");
1688		goto enc_vdev_register_rollback;
1689	}
1690
1691	video_set_drvdata(&jpu->vfd_decoder, jpu);
1692	platform_set_drvdata(pdev, jpu);
1693
1694	v4l2_info(&jpu->v4l2_dev, "encoder device registered as /dev/video%d\n",
1695		  jpu->vfd_encoder.num);
1696	v4l2_info(&jpu->v4l2_dev, "decoder device registered as /dev/video%d\n",
1697		  jpu->vfd_decoder.num);
1698
1699	return 0;
1700
1701enc_vdev_register_rollback:
1702	video_unregister_device(&jpu->vfd_encoder);
1703
1704m2m_init_rollback:
1705	v4l2_m2m_release(jpu->m2m_dev);
1706
1707device_register_rollback:
1708	v4l2_device_unregister(&jpu->v4l2_dev);
1709
1710	return ret;
1711}
1712
1713static int jpu_remove(struct platform_device *pdev)
1714{
1715	struct jpu *jpu = platform_get_drvdata(pdev);
1716
1717	video_unregister_device(&jpu->vfd_decoder);
1718	video_unregister_device(&jpu->vfd_encoder);
1719	v4l2_m2m_release(jpu->m2m_dev);
1720	v4l2_device_unregister(&jpu->v4l2_dev);
1721
1722	return 0;
1723}
1724
1725#ifdef CONFIG_PM_SLEEP
1726static int jpu_suspend(struct device *dev)
1727{
1728	struct jpu *jpu = dev_get_drvdata(dev);
1729
1730	if (jpu->ref_count == 0)
1731		return 0;
1732
1733	clk_disable_unprepare(jpu->clk);
1734
1735	return 0;
1736}
1737
1738static int jpu_resume(struct device *dev)
1739{
1740	struct jpu *jpu = dev_get_drvdata(dev);
1741
1742	if (jpu->ref_count == 0)
1743		return 0;
1744
1745	clk_prepare_enable(jpu->clk);
1746
1747	return 0;
1748}
1749#endif
1750
1751static const struct dev_pm_ops jpu_pm_ops = {
1752	SET_SYSTEM_SLEEP_PM_OPS(jpu_suspend, jpu_resume)
1753};
1754
1755static struct platform_driver jpu_driver = {
1756	.probe = jpu_probe,
1757	.remove = jpu_remove,
1758	.driver = {
1759		.of_match_table = jpu_dt_ids,
1760		.name = DRV_NAME,
1761		.pm = &jpu_pm_ops,
1762	},
1763};
1764
1765module_platform_driver(jpu_driver);
1766
1767MODULE_ALIAS("platform:" DRV_NAME);
1768MODULE_AUTHOR("Mikhail Ulianov <mikhail.ulyanov@cogentembedded.com>");
1769MODULE_DESCRIPTION("Renesas R-Car JPEG processing unit driver");
1770MODULE_LICENSE("GPL v2");