1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (C) STMicroelectronics SA 2015
4 * Authors: Yannick Fertre <yannick.fertre@st.com>
5 * Hugues Fruchet <hugues.fruchet@st.com>
8 #include <linux/module.h>
9 #include <linux/mod_devicetable.h>
10 #include <linux/platform_device.h>
11 #include <linux/slab.h>
12 #include <media/v4l2-event.h>
13 #include <media/v4l2-ioctl.h>
14 #include <media/videobuf2-dma-contig.h>
22 #define HVA_MIN_WIDTH 32
23 #define HVA_MAX_WIDTH 1920
24 #define HVA_MIN_HEIGHT 32
25 #define HVA_MAX_HEIGHT 1920
27 /* HVA requires a 16x16 pixels alignment for frames */
28 #define HVA_WIDTH_ALIGNMENT 16
29 #define HVA_HEIGHT_ALIGNMENT 16
31 #define HVA_DEFAULT_WIDTH HVA_MIN_WIDTH
32 #define HVA_DEFAULT_HEIGHT HVA_MIN_HEIGHT
33 #define HVA_DEFAULT_FRAME_NUM 1
34 #define HVA_DEFAULT_FRAME_DEN 30
36 #define to_type_str(type) (type == V4L2_BUF_TYPE_VIDEO_OUTPUT ? \
39 #define fh_to_ctx(f) (container_of(f, struct hva_ctx, fh))
41 /* registry of available encoders */
42 static const struct hva_enc
*hva_encoders
[] = {
47 static inline int frame_size(u32 w
, u32 h
, u32 fmt
)
50 case V4L2_PIX_FMT_NV12
:
51 case V4L2_PIX_FMT_NV21
:
52 return (w
* h
* 3) / 2;
58 static inline int frame_stride(u32 w
, u32 fmt
)
61 case V4L2_PIX_FMT_NV12
:
62 case V4L2_PIX_FMT_NV21
:
69 static inline int frame_alignment(u32 fmt
)
72 case V4L2_PIX_FMT_NV12
:
73 case V4L2_PIX_FMT_NV21
:
81 static inline int estimated_stream_size(u32 w
, u32 h
)
84 * HVA only encodes in YUV420 format, whatever the frame format.
85 * A compression ratio of 2 is assumed: thus, the maximum size
86 * of a stream is estimated to ((width x height x 3 / 2) / 2)
88 return (w
* h
* 3) / 4;
91 static void set_default_params(struct hva_ctx
*ctx
)
93 struct hva_frameinfo
*frameinfo
= &ctx
->frameinfo
;
94 struct hva_streaminfo
*streaminfo
= &ctx
->streaminfo
;
96 frameinfo
->pixelformat
= V4L2_PIX_FMT_NV12
;
97 frameinfo
->width
= HVA_DEFAULT_WIDTH
;
98 frameinfo
->height
= HVA_DEFAULT_HEIGHT
;
99 frameinfo
->aligned_width
= ALIGN(frameinfo
->width
,
100 HVA_WIDTH_ALIGNMENT
);
101 frameinfo
->aligned_height
= ALIGN(frameinfo
->height
,
102 HVA_HEIGHT_ALIGNMENT
);
103 frameinfo
->size
= frame_size(frameinfo
->aligned_width
,
104 frameinfo
->aligned_height
,
105 frameinfo
->pixelformat
);
107 streaminfo
->streamformat
= V4L2_PIX_FMT_H264
;
108 streaminfo
->width
= HVA_DEFAULT_WIDTH
;
109 streaminfo
->height
= HVA_DEFAULT_HEIGHT
;
111 ctx
->colorspace
= V4L2_COLORSPACE_REC709
;
112 ctx
->xfer_func
= V4L2_XFER_FUNC_DEFAULT
;
113 ctx
->ycbcr_enc
= V4L2_YCBCR_ENC_DEFAULT
;
114 ctx
->quantization
= V4L2_QUANTIZATION_DEFAULT
;
116 ctx
->max_stream_size
= estimated_stream_size(streaminfo
->width
,
120 static const struct hva_enc
*hva_find_encoder(struct hva_ctx
*ctx
,
124 struct hva_dev
*hva
= ctx_to_hdev(ctx
);
125 const struct hva_enc
*enc
;
128 for (i
= 0; i
< hva
->nb_of_encoders
; i
++) {
129 enc
= hva
->encoders
[i
];
130 if ((enc
->pixelformat
== pixelformat
) &&
131 (enc
->streamformat
== streamformat
))
138 static void register_format(u32 format
, u32 formats
[], u32
*nb_of_formats
)
143 for (i
= 0; i
< *nb_of_formats
; i
++) {
144 if (format
== formats
[i
]) {
151 formats
[(*nb_of_formats
)++] = format
;
154 static void register_formats(struct hva_dev
*hva
)
158 for (i
= 0; i
< hva
->nb_of_encoders
; i
++) {
159 register_format(hva
->encoders
[i
]->pixelformat
,
161 &hva
->nb_of_pixelformats
);
163 register_format(hva
->encoders
[i
]->streamformat
,
165 &hva
->nb_of_streamformats
);
169 static void register_encoders(struct hva_dev
*hva
)
171 struct device
*dev
= hva_to_dev(hva
);
174 for (i
= 0; i
< ARRAY_SIZE(hva_encoders
); i
++) {
175 if (hva
->nb_of_encoders
>= HVA_MAX_ENCODERS
) {
177 "%s failed to register %s encoder (%d maximum reached)\n",
178 HVA_PREFIX
, hva_encoders
[i
]->name
,
183 hva
->encoders
[hva
->nb_of_encoders
++] = hva_encoders
[i
];
184 dev_info(dev
, "%s %s encoder registered\n", HVA_PREFIX
,
185 hva_encoders
[i
]->name
);
189 static int hva_open_encoder(struct hva_ctx
*ctx
, u32 streamformat
,
190 u32 pixelformat
, struct hva_enc
**penc
)
192 struct hva_dev
*hva
= ctx_to_hdev(ctx
);
193 struct device
*dev
= ctx_to_dev(ctx
);
197 /* find an encoder which can deal with these formats */
198 enc
= (struct hva_enc
*)hva_find_encoder(ctx
, pixelformat
,
201 dev_err(dev
, "%s no encoder found matching %4.4s => %4.4s\n",
202 ctx
->name
, (char *)&pixelformat
, (char *)&streamformat
);
206 dev_dbg(dev
, "%s one encoder matching %4.4s => %4.4s\n",
207 ctx
->name
, (char *)&pixelformat
, (char *)&streamformat
);
209 /* update instance name */
210 snprintf(ctx
->name
, sizeof(ctx
->name
), "[%3d:%4.4s]",
211 hva
->instance_id
, (char *)&streamformat
);
213 /* open encoder instance */
214 ret
= enc
->open(ctx
);
216 dev_err(dev
, "%s failed to open encoder instance (%d)\n",
221 dev_dbg(dev
, "%s %s encoder opened\n", ctx
->name
, enc
->name
);
228 static void hva_dbg_summary(struct hva_ctx
*ctx
)
230 struct device
*dev
= ctx_to_dev(ctx
);
231 struct hva_streaminfo
*stream
= &ctx
->streaminfo
;
232 struct hva_frameinfo
*frame
= &ctx
->frameinfo
;
234 if (!(ctx
->flags
& HVA_FLAG_STREAMINFO
))
237 dev_dbg(dev
, "%s %4.4s %dx%d > %4.4s %dx%d %s %s: %d frames encoded, %d system errors, %d encoding errors, %d frame errors\n",
239 (char *)&frame
->pixelformat
,
240 frame
->aligned_width
, frame
->aligned_height
,
241 (char *)&stream
->streamformat
,
242 stream
->width
, stream
->height
,
243 stream
->profile
, stream
->level
,
251 * V4L2 ioctl operations
254 static int hva_querycap(struct file
*file
, void *priv
,
255 struct v4l2_capability
*cap
)
257 struct hva_ctx
*ctx
= fh_to_ctx(file
->private_data
);
258 struct hva_dev
*hva
= ctx_to_hdev(ctx
);
260 strscpy(cap
->driver
, HVA_NAME
, sizeof(cap
->driver
));
261 strscpy(cap
->card
, hva
->vdev
->name
, sizeof(cap
->card
));
262 snprintf(cap
->bus_info
, sizeof(cap
->bus_info
), "platform:%s",
268 static int hva_enum_fmt_stream(struct file
*file
, void *priv
,
269 struct v4l2_fmtdesc
*f
)
271 struct hva_ctx
*ctx
= fh_to_ctx(file
->private_data
);
272 struct hva_dev
*hva
= ctx_to_hdev(ctx
);
274 if (unlikely(f
->index
>= hva
->nb_of_streamformats
))
277 f
->pixelformat
= hva
->streamformats
[f
->index
];
282 static int hva_enum_fmt_frame(struct file
*file
, void *priv
,
283 struct v4l2_fmtdesc
*f
)
285 struct hva_ctx
*ctx
= fh_to_ctx(file
->private_data
);
286 struct hva_dev
*hva
= ctx_to_hdev(ctx
);
288 if (unlikely(f
->index
>= hva
->nb_of_pixelformats
))
291 f
->pixelformat
= hva
->pixelformats
[f
->index
];
296 static int hva_g_fmt_stream(struct file
*file
, void *fh
, struct v4l2_format
*f
)
298 struct hva_ctx
*ctx
= fh_to_ctx(file
->private_data
);
299 struct hva_streaminfo
*streaminfo
= &ctx
->streaminfo
;
301 f
->fmt
.pix
.width
= streaminfo
->width
;
302 f
->fmt
.pix
.height
= streaminfo
->height
;
303 f
->fmt
.pix
.field
= V4L2_FIELD_NONE
;
304 f
->fmt
.pix
.colorspace
= ctx
->colorspace
;
305 f
->fmt
.pix
.xfer_func
= ctx
->xfer_func
;
306 f
->fmt
.pix
.ycbcr_enc
= ctx
->ycbcr_enc
;
307 f
->fmt
.pix
.quantization
= ctx
->quantization
;
308 f
->fmt
.pix
.pixelformat
= streaminfo
->streamformat
;
309 f
->fmt
.pix
.bytesperline
= 0;
310 f
->fmt
.pix
.sizeimage
= ctx
->max_stream_size
;
315 static int hva_g_fmt_frame(struct file
*file
, void *fh
, struct v4l2_format
*f
)
317 struct hva_ctx
*ctx
= fh_to_ctx(file
->private_data
);
318 struct hva_frameinfo
*frameinfo
= &ctx
->frameinfo
;
320 f
->fmt
.pix
.width
= frameinfo
->width
;
321 f
->fmt
.pix
.height
= frameinfo
->height
;
322 f
->fmt
.pix
.field
= V4L2_FIELD_NONE
;
323 f
->fmt
.pix
.colorspace
= ctx
->colorspace
;
324 f
->fmt
.pix
.xfer_func
= ctx
->xfer_func
;
325 f
->fmt
.pix
.ycbcr_enc
= ctx
->ycbcr_enc
;
326 f
->fmt
.pix
.quantization
= ctx
->quantization
;
327 f
->fmt
.pix
.pixelformat
= frameinfo
->pixelformat
;
328 f
->fmt
.pix
.bytesperline
= frame_stride(frameinfo
->aligned_width
,
329 frameinfo
->pixelformat
);
330 f
->fmt
.pix
.sizeimage
= frameinfo
->size
;
335 static int hva_try_fmt_stream(struct file
*file
, void *priv
,
336 struct v4l2_format
*f
)
338 struct hva_ctx
*ctx
= fh_to_ctx(file
->private_data
);
339 struct device
*dev
= ctx_to_dev(ctx
);
340 struct v4l2_pix_format
*pix
= &f
->fmt
.pix
;
341 u32 streamformat
= pix
->pixelformat
;
342 const struct hva_enc
*enc
;
346 enc
= hva_find_encoder(ctx
, ctx
->frameinfo
.pixelformat
, streamformat
);
349 "%s V4L2 TRY_FMT (CAPTURE): unsupported format %.4s\n",
350 ctx
->name
, (char *)&pix
->pixelformat
);
355 height
= pix
->height
;
356 if (ctx
->flags
& HVA_FLAG_FRAMEINFO
) {
358 * if the frame resolution is already fixed, only allow the
359 * same stream resolution
361 pix
->width
= ctx
->frameinfo
.width
;
362 pix
->height
= ctx
->frameinfo
.height
;
363 if ((pix
->width
!= width
) || (pix
->height
!= height
))
365 "%s V4L2 TRY_FMT (CAPTURE): resolution updated %dx%d -> %dx%d to fit frame resolution\n",
366 ctx
->name
, width
, height
,
367 pix
->width
, pix
->height
);
369 /* adjust width & height */
370 v4l_bound_align_image(&pix
->width
,
371 HVA_MIN_WIDTH
, enc
->max_width
,
374 HVA_MIN_HEIGHT
, enc
->max_height
,
378 if ((pix
->width
!= width
) || (pix
->height
!= height
))
380 "%s V4L2 TRY_FMT (CAPTURE): resolution updated %dx%d -> %dx%d to fit min/max/alignment\n",
381 ctx
->name
, width
, height
,
382 pix
->width
, pix
->height
);
385 stream_size
= estimated_stream_size(pix
->width
, pix
->height
);
386 if (pix
->sizeimage
< stream_size
)
387 pix
->sizeimage
= stream_size
;
389 pix
->bytesperline
= 0;
390 pix
->colorspace
= ctx
->colorspace
;
391 pix
->xfer_func
= ctx
->xfer_func
;
392 pix
->ycbcr_enc
= ctx
->ycbcr_enc
;
393 pix
->quantization
= ctx
->quantization
;
394 pix
->field
= V4L2_FIELD_NONE
;
399 static int hva_try_fmt_frame(struct file
*file
, void *priv
,
400 struct v4l2_format
*f
)
402 struct hva_ctx
*ctx
= fh_to_ctx(file
->private_data
);
403 struct device
*dev
= ctx_to_dev(ctx
);
404 struct v4l2_pix_format
*pix
= &f
->fmt
.pix
;
405 u32 pixelformat
= pix
->pixelformat
;
406 const struct hva_enc
*enc
;
409 enc
= hva_find_encoder(ctx
, pixelformat
, ctx
->streaminfo
.streamformat
);
412 "%s V4L2 TRY_FMT (OUTPUT): unsupported format %.4s\n",
413 ctx
->name
, (char *)&pixelformat
);
417 /* adjust width & height */
419 height
= pix
->height
;
420 v4l_bound_align_image(&pix
->width
,
421 HVA_MIN_WIDTH
, HVA_MAX_WIDTH
,
422 frame_alignment(pixelformat
) - 1,
424 HVA_MIN_HEIGHT
, HVA_MAX_HEIGHT
,
425 frame_alignment(pixelformat
) - 1,
428 if ((pix
->width
!= width
) || (pix
->height
!= height
))
430 "%s V4L2 TRY_FMT (OUTPUT): resolution updated %dx%d -> %dx%d to fit min/max/alignment\n",
431 ctx
->name
, width
, height
, pix
->width
, pix
->height
);
433 width
= ALIGN(pix
->width
, HVA_WIDTH_ALIGNMENT
);
434 height
= ALIGN(pix
->height
, HVA_HEIGHT_ALIGNMENT
);
436 if (!pix
->colorspace
) {
437 pix
->colorspace
= V4L2_COLORSPACE_REC709
;
438 pix
->xfer_func
= V4L2_XFER_FUNC_DEFAULT
;
439 pix
->ycbcr_enc
= V4L2_YCBCR_ENC_DEFAULT
;
440 pix
->quantization
= V4L2_QUANTIZATION_DEFAULT
;
443 pix
->bytesperline
= frame_stride(width
, pixelformat
);
444 pix
->sizeimage
= frame_size(width
, height
, pixelformat
);
445 pix
->field
= V4L2_FIELD_NONE
;
450 static int hva_s_fmt_stream(struct file
*file
, void *fh
, struct v4l2_format
*f
)
452 struct hva_ctx
*ctx
= fh_to_ctx(file
->private_data
);
453 struct device
*dev
= ctx_to_dev(ctx
);
454 struct vb2_queue
*vq
;
457 ret
= hva_try_fmt_stream(file
, fh
, f
);
459 dev_dbg(dev
, "%s V4L2 S_FMT (CAPTURE): unsupported format %.4s\n",
460 ctx
->name
, (char *)&f
->fmt
.pix
.pixelformat
);
464 vq
= v4l2_m2m_get_vq(ctx
->fh
.m2m_ctx
, f
->type
);
465 if (vb2_is_streaming(vq
)) {
466 dev_dbg(dev
, "%s V4L2 S_FMT (CAPTURE): queue busy\n",
471 ctx
->max_stream_size
= f
->fmt
.pix
.sizeimage
;
472 ctx
->streaminfo
.width
= f
->fmt
.pix
.width
;
473 ctx
->streaminfo
.height
= f
->fmt
.pix
.height
;
474 ctx
->streaminfo
.streamformat
= f
->fmt
.pix
.pixelformat
;
475 ctx
->flags
|= HVA_FLAG_STREAMINFO
;
480 static int hva_s_fmt_frame(struct file
*file
, void *fh
, struct v4l2_format
*f
)
482 struct hva_ctx
*ctx
= fh_to_ctx(file
->private_data
);
483 struct device
*dev
= ctx_to_dev(ctx
);
484 struct v4l2_pix_format
*pix
= &f
->fmt
.pix
;
485 struct vb2_queue
*vq
;
488 ret
= hva_try_fmt_frame(file
, fh
, f
);
490 dev_dbg(dev
, "%s V4L2 S_FMT (OUTPUT): unsupported format %.4s\n",
491 ctx
->name
, (char *)&pix
->pixelformat
);
495 vq
= v4l2_m2m_get_vq(ctx
->fh
.m2m_ctx
, f
->type
);
496 if (vb2_is_streaming(vq
)) {
497 dev_dbg(dev
, "%s V4L2 S_FMT (OUTPUT): queue busy\n", ctx
->name
);
501 ctx
->colorspace
= pix
->colorspace
;
502 ctx
->xfer_func
= pix
->xfer_func
;
503 ctx
->ycbcr_enc
= pix
->ycbcr_enc
;
504 ctx
->quantization
= pix
->quantization
;
506 ctx
->frameinfo
.aligned_width
= ALIGN(pix
->width
, HVA_WIDTH_ALIGNMENT
);
507 ctx
->frameinfo
.aligned_height
= ALIGN(pix
->height
,
508 HVA_HEIGHT_ALIGNMENT
);
509 ctx
->frameinfo
.size
= pix
->sizeimage
;
510 ctx
->frameinfo
.pixelformat
= pix
->pixelformat
;
511 ctx
->frameinfo
.width
= pix
->width
;
512 ctx
->frameinfo
.height
= pix
->height
;
513 ctx
->flags
|= HVA_FLAG_FRAMEINFO
;
518 static int hva_g_parm(struct file
*file
, void *fh
, struct v4l2_streamparm
*sp
)
520 struct hva_ctx
*ctx
= fh_to_ctx(file
->private_data
);
521 struct v4l2_fract
*time_per_frame
= &ctx
->ctrls
.time_per_frame
;
523 if (sp
->type
!= V4L2_BUF_TYPE_VIDEO_OUTPUT
)
526 sp
->parm
.output
.capability
= V4L2_CAP_TIMEPERFRAME
;
527 sp
->parm
.output
.timeperframe
.numerator
= time_per_frame
->numerator
;
528 sp
->parm
.output
.timeperframe
.denominator
=
529 time_per_frame
->denominator
;
534 static int hva_s_parm(struct file
*file
, void *fh
, struct v4l2_streamparm
*sp
)
536 struct hva_ctx
*ctx
= fh_to_ctx(file
->private_data
);
537 struct v4l2_fract
*time_per_frame
= &ctx
->ctrls
.time_per_frame
;
539 if (sp
->type
!= V4L2_BUF_TYPE_VIDEO_OUTPUT
)
542 if (!sp
->parm
.output
.timeperframe
.numerator
||
543 !sp
->parm
.output
.timeperframe
.denominator
)
544 return hva_g_parm(file
, fh
, sp
);
546 sp
->parm
.output
.capability
= V4L2_CAP_TIMEPERFRAME
;
547 time_per_frame
->numerator
= sp
->parm
.output
.timeperframe
.numerator
;
548 time_per_frame
->denominator
=
549 sp
->parm
.output
.timeperframe
.denominator
;
554 static int hva_qbuf(struct file
*file
, void *priv
, struct v4l2_buffer
*buf
)
556 struct hva_ctx
*ctx
= fh_to_ctx(file
->private_data
);
557 struct device
*dev
= ctx_to_dev(ctx
);
559 if (buf
->type
== V4L2_BUF_TYPE_VIDEO_CAPTURE
) {
561 * depending on the targeted compressed video format, the
562 * capture buffer might contain headers (e.g. H.264 SPS/PPS)
563 * filled in by the driver client; the size of these data is
564 * copied from the bytesused field of the V4L2 buffer in the
565 * payload field of the hva stream buffer
567 struct vb2_queue
*vq
;
568 struct hva_stream
*stream
;
569 struct vb2_buffer
*vb2_buf
;
571 vq
= v4l2_m2m_get_vq(ctx
->fh
.m2m_ctx
, buf
->type
);
573 if (buf
->index
>= vq
->num_buffers
) {
574 dev_dbg(dev
, "%s buffer index %d out of range (%d)\n",
575 ctx
->name
, buf
->index
, vq
->num_buffers
);
579 vb2_buf
= vb2_get_buffer(vq
, buf
->index
);
580 stream
= to_hva_stream(to_vb2_v4l2_buffer(vb2_buf
));
581 stream
->bytesused
= buf
->bytesused
;
584 return v4l2_m2m_qbuf(file
, ctx
->fh
.m2m_ctx
, buf
);
588 static const struct v4l2_ioctl_ops hva_ioctl_ops
= {
589 .vidioc_querycap
= hva_querycap
,
590 .vidioc_enum_fmt_vid_cap
= hva_enum_fmt_stream
,
591 .vidioc_enum_fmt_vid_out
= hva_enum_fmt_frame
,
592 .vidioc_g_fmt_vid_cap
= hva_g_fmt_stream
,
593 .vidioc_g_fmt_vid_out
= hva_g_fmt_frame
,
594 .vidioc_try_fmt_vid_cap
= hva_try_fmt_stream
,
595 .vidioc_try_fmt_vid_out
= hva_try_fmt_frame
,
596 .vidioc_s_fmt_vid_cap
= hva_s_fmt_stream
,
597 .vidioc_s_fmt_vid_out
= hva_s_fmt_frame
,
598 .vidioc_g_parm
= hva_g_parm
,
599 .vidioc_s_parm
= hva_s_parm
,
600 .vidioc_reqbufs
= v4l2_m2m_ioctl_reqbufs
,
601 .vidioc_create_bufs
= v4l2_m2m_ioctl_create_bufs
,
602 .vidioc_querybuf
= v4l2_m2m_ioctl_querybuf
,
603 .vidioc_expbuf
= v4l2_m2m_ioctl_expbuf
,
604 .vidioc_qbuf
= hva_qbuf
,
605 .vidioc_dqbuf
= v4l2_m2m_ioctl_dqbuf
,
606 .vidioc_streamon
= v4l2_m2m_ioctl_streamon
,
607 .vidioc_streamoff
= v4l2_m2m_ioctl_streamoff
,
608 .vidioc_subscribe_event
= v4l2_ctrl_subscribe_event
,
609 .vidioc_unsubscribe_event
= v4l2_event_unsubscribe
,
613 * V4L2 control operations
616 static int hva_s_ctrl(struct v4l2_ctrl
*ctrl
)
618 struct hva_ctx
*ctx
= container_of(ctrl
->handler
, struct hva_ctx
,
620 struct device
*dev
= ctx_to_dev(ctx
);
622 dev_dbg(dev
, "%s S_CTRL: id = %d, val = %d\n", ctx
->name
,
623 ctrl
->id
, ctrl
->val
);
626 case V4L2_CID_MPEG_VIDEO_BITRATE_MODE
:
627 ctx
->ctrls
.bitrate_mode
= ctrl
->val
;
629 case V4L2_CID_MPEG_VIDEO_GOP_SIZE
:
630 ctx
->ctrls
.gop_size
= ctrl
->val
;
632 case V4L2_CID_MPEG_VIDEO_BITRATE
:
633 ctx
->ctrls
.bitrate
= ctrl
->val
;
635 case V4L2_CID_MPEG_VIDEO_ASPECT
:
636 ctx
->ctrls
.aspect
= ctrl
->val
;
638 case V4L2_CID_MPEG_VIDEO_H264_PROFILE
:
639 ctx
->ctrls
.profile
= ctrl
->val
;
640 snprintf(ctx
->streaminfo
.profile
,
641 sizeof(ctx
->streaminfo
.profile
),
643 v4l2_ctrl_get_menu(ctrl
->id
)[ctrl
->val
]);
645 case V4L2_CID_MPEG_VIDEO_H264_LEVEL
:
646 ctx
->ctrls
.level
= ctrl
->val
;
647 snprintf(ctx
->streaminfo
.level
,
648 sizeof(ctx
->streaminfo
.level
),
650 v4l2_ctrl_get_menu(ctrl
->id
)[ctrl
->val
]);
652 case V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE
:
653 ctx
->ctrls
.entropy_mode
= ctrl
->val
;
655 case V4L2_CID_MPEG_VIDEO_H264_CPB_SIZE
:
656 ctx
->ctrls
.cpb_size
= ctrl
->val
;
658 case V4L2_CID_MPEG_VIDEO_H264_8X8_TRANSFORM
:
659 ctx
->ctrls
.dct8x8
= ctrl
->val
;
661 case V4L2_CID_MPEG_VIDEO_H264_MIN_QP
:
662 ctx
->ctrls
.qpmin
= ctrl
->val
;
664 case V4L2_CID_MPEG_VIDEO_H264_MAX_QP
:
665 ctx
->ctrls
.qpmax
= ctrl
->val
;
667 case V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_ENABLE
:
668 ctx
->ctrls
.vui_sar
= ctrl
->val
;
670 case V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_IDC
:
671 ctx
->ctrls
.vui_sar_idc
= ctrl
->val
;
673 case V4L2_CID_MPEG_VIDEO_H264_SEI_FRAME_PACKING
:
674 ctx
->ctrls
.sei_fp
= ctrl
->val
;
676 case V4L2_CID_MPEG_VIDEO_H264_SEI_FP_ARRANGEMENT_TYPE
:
677 ctx
->ctrls
.sei_fp_type
= ctrl
->val
;
680 dev_dbg(dev
, "%s S_CTRL: invalid control (id = %d)\n",
681 ctx
->name
, ctrl
->id
);
688 /* V4L2 control ops */
689 static const struct v4l2_ctrl_ops hva_ctrl_ops
= {
690 .s_ctrl
= hva_s_ctrl
,
693 static int hva_ctrls_setup(struct hva_ctx
*ctx
)
695 struct device
*dev
= ctx_to_dev(ctx
);
697 enum v4l2_mpeg_video_h264_sei_fp_arrangement_type sei_fp_type
=
698 V4L2_MPEG_VIDEO_H264_SEI_FP_ARRANGEMENT_TYPE_TOP_BOTTOM
;
700 v4l2_ctrl_handler_init(&ctx
->ctrl_handler
, 15);
702 v4l2_ctrl_new_std_menu(&ctx
->ctrl_handler
, &hva_ctrl_ops
,
703 V4L2_CID_MPEG_VIDEO_BITRATE_MODE
,
704 V4L2_MPEG_VIDEO_BITRATE_MODE_CBR
,
706 V4L2_MPEG_VIDEO_BITRATE_MODE_CBR
);
708 v4l2_ctrl_new_std(&ctx
->ctrl_handler
, &hva_ctrl_ops
,
709 V4L2_CID_MPEG_VIDEO_GOP_SIZE
,
712 v4l2_ctrl_new_std(&ctx
->ctrl_handler
, &hva_ctrl_ops
,
713 V4L2_CID_MPEG_VIDEO_BITRATE
,
714 1000, 60000000, 1000, 20000000);
716 mask
= ~(1 << V4L2_MPEG_VIDEO_ASPECT_1x1
);
717 v4l2_ctrl_new_std_menu(&ctx
->ctrl_handler
, &hva_ctrl_ops
,
718 V4L2_CID_MPEG_VIDEO_ASPECT
,
719 V4L2_MPEG_VIDEO_ASPECT_1x1
,
721 V4L2_MPEG_VIDEO_ASPECT_1x1
);
723 mask
= ~((1 << V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE
) |
724 (1 << V4L2_MPEG_VIDEO_H264_PROFILE_MAIN
) |
725 (1 << V4L2_MPEG_VIDEO_H264_PROFILE_HIGH
) |
726 (1 << V4L2_MPEG_VIDEO_H264_PROFILE_STEREO_HIGH
));
727 v4l2_ctrl_new_std_menu(&ctx
->ctrl_handler
, &hva_ctrl_ops
,
728 V4L2_CID_MPEG_VIDEO_H264_PROFILE
,
729 V4L2_MPEG_VIDEO_H264_PROFILE_STEREO_HIGH
,
731 V4L2_MPEG_VIDEO_H264_PROFILE_HIGH
);
733 v4l2_ctrl_new_std_menu(&ctx
->ctrl_handler
, &hva_ctrl_ops
,
734 V4L2_CID_MPEG_VIDEO_H264_LEVEL
,
735 V4L2_MPEG_VIDEO_H264_LEVEL_4_2
,
737 V4L2_MPEG_VIDEO_H264_LEVEL_4_0
);
739 v4l2_ctrl_new_std_menu(&ctx
->ctrl_handler
, &hva_ctrl_ops
,
740 V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE
,
741 V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC
,
743 V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CAVLC
);
745 v4l2_ctrl_new_std(&ctx
->ctrl_handler
, &hva_ctrl_ops
,
746 V4L2_CID_MPEG_VIDEO_H264_CPB_SIZE
,
749 v4l2_ctrl_new_std(&ctx
->ctrl_handler
, &hva_ctrl_ops
,
750 V4L2_CID_MPEG_VIDEO_H264_8X8_TRANSFORM
,
753 v4l2_ctrl_new_std(&ctx
->ctrl_handler
, &hva_ctrl_ops
,
754 V4L2_CID_MPEG_VIDEO_H264_MIN_QP
,
757 v4l2_ctrl_new_std(&ctx
->ctrl_handler
, &hva_ctrl_ops
,
758 V4L2_CID_MPEG_VIDEO_H264_MAX_QP
,
761 v4l2_ctrl_new_std(&ctx
->ctrl_handler
, &hva_ctrl_ops
,
762 V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_ENABLE
,
765 mask
= ~(1 << V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_1x1
);
766 v4l2_ctrl_new_std_menu(&ctx
->ctrl_handler
, &hva_ctrl_ops
,
767 V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_IDC
,
768 V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_1x1
,
770 V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_1x1
);
772 v4l2_ctrl_new_std(&ctx
->ctrl_handler
, &hva_ctrl_ops
,
773 V4L2_CID_MPEG_VIDEO_H264_SEI_FRAME_PACKING
,
776 mask
= ~(1 << sei_fp_type
);
777 v4l2_ctrl_new_std_menu(&ctx
->ctrl_handler
, &hva_ctrl_ops
,
778 V4L2_CID_MPEG_VIDEO_H264_SEI_FP_ARRANGEMENT_TYPE
,
783 if (ctx
->ctrl_handler
.error
) {
784 int err
= ctx
->ctrl_handler
.error
;
786 dev_dbg(dev
, "%s controls setup failed (%d)\n",
788 v4l2_ctrl_handler_free(&ctx
->ctrl_handler
);
792 v4l2_ctrl_handler_setup(&ctx
->ctrl_handler
);
794 /* set default time per frame */
795 ctx
->ctrls
.time_per_frame
.numerator
= HVA_DEFAULT_FRAME_NUM
;
796 ctx
->ctrls
.time_per_frame
.denominator
= HVA_DEFAULT_FRAME_DEN
;
802 * mem-to-mem operations
805 static void hva_run_work(struct work_struct
*work
)
807 struct hva_ctx
*ctx
= container_of(work
, struct hva_ctx
, run_work
);
808 struct vb2_v4l2_buffer
*src_buf
, *dst_buf
;
809 const struct hva_enc
*enc
= ctx
->enc
;
810 struct hva_frame
*frame
;
811 struct hva_stream
*stream
;
814 /* protect instance against reentrancy */
815 mutex_lock(&ctx
->lock
);
817 #ifdef CONFIG_VIDEO_STI_HVA_DEBUGFS
818 hva_dbg_perf_begin(ctx
);
821 src_buf
= v4l2_m2m_src_buf_remove(ctx
->fh
.m2m_ctx
);
822 dst_buf
= v4l2_m2m_dst_buf_remove(ctx
->fh
.m2m_ctx
);
824 frame
= to_hva_frame(src_buf
);
825 stream
= to_hva_stream(dst_buf
);
826 frame
->vbuf
.sequence
= ctx
->frame_num
++;
828 ret
= enc
->encode(ctx
, frame
, stream
);
830 vb2_set_plane_payload(&dst_buf
->vb2_buf
, 0, stream
->bytesused
);
832 v4l2_m2m_buf_done(src_buf
, VB2_BUF_STATE_ERROR
);
833 v4l2_m2m_buf_done(dst_buf
, VB2_BUF_STATE_ERROR
);
835 /* propagate frame timestamp */
836 dst_buf
->vb2_buf
.timestamp
= src_buf
->vb2_buf
.timestamp
;
837 dst_buf
->field
= V4L2_FIELD_NONE
;
838 dst_buf
->sequence
= ctx
->stream_num
- 1;
840 ctx
->encoded_frames
++;
842 #ifdef CONFIG_VIDEO_STI_HVA_DEBUGFS
843 hva_dbg_perf_end(ctx
, stream
);
846 v4l2_m2m_buf_done(src_buf
, VB2_BUF_STATE_DONE
);
847 v4l2_m2m_buf_done(dst_buf
, VB2_BUF_STATE_DONE
);
850 mutex_unlock(&ctx
->lock
);
852 v4l2_m2m_job_finish(ctx
->hva_dev
->m2m_dev
, ctx
->fh
.m2m_ctx
);
855 static void hva_device_run(void *priv
)
857 struct hva_ctx
*ctx
= priv
;
858 struct hva_dev
*hva
= ctx_to_hdev(ctx
);
860 queue_work(hva
->work_queue
, &ctx
->run_work
);
863 static void hva_job_abort(void *priv
)
865 struct hva_ctx
*ctx
= priv
;
866 struct device
*dev
= ctx_to_dev(ctx
);
868 dev_dbg(dev
, "%s aborting job\n", ctx
->name
);
870 ctx
->aborting
= true;
873 static int hva_job_ready(void *priv
)
875 struct hva_ctx
*ctx
= priv
;
876 struct device
*dev
= ctx_to_dev(ctx
);
878 if (!v4l2_m2m_num_src_bufs_ready(ctx
->fh
.m2m_ctx
)) {
879 dev_dbg(dev
, "%s job not ready: no frame buffers\n",
884 if (!v4l2_m2m_num_dst_bufs_ready(ctx
->fh
.m2m_ctx
)) {
885 dev_dbg(dev
, "%s job not ready: no stream buffers\n",
891 dev_dbg(dev
, "%s job not ready: aborting\n", ctx
->name
);
899 static const struct v4l2_m2m_ops hva_m2m_ops
= {
900 .device_run
= hva_device_run
,
901 .job_abort
= hva_job_abort
,
902 .job_ready
= hva_job_ready
,
906 * VB2 queue operations
909 static int hva_queue_setup(struct vb2_queue
*vq
,
910 unsigned int *num_buffers
, unsigned int *num_planes
,
911 unsigned int sizes
[], struct device
*alloc_devs
[])
913 struct hva_ctx
*ctx
= vb2_get_drv_priv(vq
);
914 struct device
*dev
= ctx_to_dev(ctx
);
917 dev_dbg(dev
, "%s %s queue setup: num_buffers %d\n", ctx
->name
,
918 to_type_str(vq
->type
), *num_buffers
);
920 size
= vq
->type
== V4L2_BUF_TYPE_VIDEO_OUTPUT
?
921 ctx
->frameinfo
.size
: ctx
->max_stream_size
;
924 return sizes
[0] < size
? -EINVAL
: 0;
926 /* only one plane supported */
933 static int hva_buf_prepare(struct vb2_buffer
*vb
)
935 struct hva_ctx
*ctx
= vb2_get_drv_priv(vb
->vb2_queue
);
936 struct device
*dev
= ctx_to_dev(ctx
);
937 struct vb2_v4l2_buffer
*vbuf
= to_vb2_v4l2_buffer(vb
);
939 if (vb
->vb2_queue
->type
== V4L2_BUF_TYPE_VIDEO_OUTPUT
) {
940 struct hva_frame
*frame
= to_hva_frame(vbuf
);
942 if (vbuf
->field
== V4L2_FIELD_ANY
)
943 vbuf
->field
= V4L2_FIELD_NONE
;
944 if (vbuf
->field
!= V4L2_FIELD_NONE
) {
946 "%s frame[%d] prepare: %d field not supported\n",
947 ctx
->name
, vb
->index
, vbuf
->field
);
951 if (!frame
->prepared
) {
952 /* get memory addresses */
953 frame
->vaddr
= vb2_plane_vaddr(&vbuf
->vb2_buf
, 0);
954 frame
->paddr
= vb2_dma_contig_plane_dma_addr(
956 frame
->info
= ctx
->frameinfo
;
957 frame
->prepared
= true;
960 "%s frame[%d] prepared; virt=%p, phy=%pad\n",
961 ctx
->name
, vb
->index
,
962 frame
->vaddr
, &frame
->paddr
);
965 struct hva_stream
*stream
= to_hva_stream(vbuf
);
967 if (!stream
->prepared
) {
968 /* get memory addresses */
969 stream
->vaddr
= vb2_plane_vaddr(&vbuf
->vb2_buf
, 0);
970 stream
->paddr
= vb2_dma_contig_plane_dma_addr(
972 stream
->size
= vb2_plane_size(&vbuf
->vb2_buf
, 0);
973 stream
->prepared
= true;
976 "%s stream[%d] prepared; virt=%p, phy=%pad\n",
977 ctx
->name
, vb
->index
,
978 stream
->vaddr
, &stream
->paddr
);
985 static void hva_buf_queue(struct vb2_buffer
*vb
)
987 struct hva_ctx
*ctx
= vb2_get_drv_priv(vb
->vb2_queue
);
988 struct vb2_v4l2_buffer
*vbuf
= to_vb2_v4l2_buffer(vb
);
991 v4l2_m2m_buf_queue(ctx
->fh
.m2m_ctx
, vbuf
);
994 static int hva_start_streaming(struct vb2_queue
*vq
, unsigned int count
)
996 struct hva_ctx
*ctx
= vb2_get_drv_priv(vq
);
997 struct hva_dev
*hva
= ctx_to_hdev(ctx
);
998 struct device
*dev
= ctx_to_dev(ctx
);
999 struct vb2_v4l2_buffer
*vbuf
;
1004 dev_dbg(dev
, "%s %s start streaming\n", ctx
->name
,
1005 to_type_str(vq
->type
));
1007 /* open encoder when both start_streaming have been called */
1008 if (V4L2_TYPE_IS_OUTPUT(vq
->type
)) {
1009 if (!vb2_start_streaming_called(&ctx
->fh
.m2m_ctx
->cap_q_ctx
.q
))
1012 if (!vb2_start_streaming_called(&ctx
->fh
.m2m_ctx
->out_q_ctx
.q
))
1016 /* store the instance context in the instances array */
1017 for (i
= 0; i
< HVA_MAX_INSTANCES
; i
++) {
1018 if (!hva
->instances
[i
]) {
1019 hva
->instances
[i
] = ctx
;
1020 /* save the context identifier in the context */
1028 dev_err(dev
, "%s maximum instances reached\n", ctx
->name
);
1033 hva
->nb_of_instances
++;
1036 ret
= hva_open_encoder(ctx
,
1037 ctx
->streaminfo
.streamformat
,
1038 ctx
->frameinfo
.pixelformat
,
1047 hva
->instances
[ctx
->id
] = NULL
;
1048 hva
->nb_of_instances
--;
1050 if (vq
->type
== V4L2_BUF_TYPE_VIDEO_OUTPUT
) {
1051 /* return of all pending buffers to vb2 (in queued state) */
1052 while ((vbuf
= v4l2_m2m_src_buf_remove(ctx
->fh
.m2m_ctx
)))
1053 v4l2_m2m_buf_done(vbuf
, VB2_BUF_STATE_QUEUED
);
1055 /* return of all pending buffers to vb2 (in queued state) */
1056 while ((vbuf
= v4l2_m2m_dst_buf_remove(ctx
->fh
.m2m_ctx
)))
1057 v4l2_m2m_buf_done(vbuf
, VB2_BUF_STATE_QUEUED
);
1065 static void hva_stop_streaming(struct vb2_queue
*vq
)
1067 struct hva_ctx
*ctx
= vb2_get_drv_priv(vq
);
1068 struct hva_dev
*hva
= ctx_to_hdev(ctx
);
1069 struct device
*dev
= ctx_to_dev(ctx
);
1070 const struct hva_enc
*enc
= ctx
->enc
;
1071 struct vb2_v4l2_buffer
*vbuf
;
1073 dev_dbg(dev
, "%s %s stop streaming\n", ctx
->name
,
1074 to_type_str(vq
->type
));
1076 if (vq
->type
== V4L2_BUF_TYPE_VIDEO_OUTPUT
) {
1077 /* return of all pending buffers to vb2 (in error state) */
1079 while ((vbuf
= v4l2_m2m_src_buf_remove(ctx
->fh
.m2m_ctx
)))
1080 v4l2_m2m_buf_done(vbuf
, VB2_BUF_STATE_ERROR
);
1082 /* return of all pending buffers to vb2 (in error state) */
1083 ctx
->stream_num
= 0;
1084 while ((vbuf
= v4l2_m2m_dst_buf_remove(ctx
->fh
.m2m_ctx
)))
1085 v4l2_m2m_buf_done(vbuf
, VB2_BUF_STATE_ERROR
);
1088 if ((V4L2_TYPE_IS_OUTPUT(vq
->type
) &&
1089 vb2_is_streaming(&ctx
->fh
.m2m_ctx
->cap_q_ctx
.q
)) ||
1090 (V4L2_TYPE_IS_CAPTURE(vq
->type
) &&
1091 vb2_is_streaming(&ctx
->fh
.m2m_ctx
->out_q_ctx
.q
))) {
1092 dev_dbg(dev
, "%s %s out=%d cap=%d\n",
1093 ctx
->name
, to_type_str(vq
->type
),
1094 vb2_is_streaming(&ctx
->fh
.m2m_ctx
->out_q_ctx
.q
),
1095 vb2_is_streaming(&ctx
->fh
.m2m_ctx
->cap_q_ctx
.q
));
1099 /* close encoder when both stop_streaming have been called */
1101 dev_dbg(dev
, "%s %s encoder closed\n", ctx
->name
, enc
->name
);
1105 /* clear instance context in instances array */
1106 hva
->instances
[ctx
->id
] = NULL
;
1107 hva
->nb_of_instances
--;
1110 ctx
->aborting
= false;
1114 static const struct vb2_ops hva_qops
= {
1115 .queue_setup
= hva_queue_setup
,
1116 .buf_prepare
= hva_buf_prepare
,
1117 .buf_queue
= hva_buf_queue
,
1118 .start_streaming
= hva_start_streaming
,
1119 .stop_streaming
= hva_stop_streaming
,
1120 .wait_prepare
= vb2_ops_wait_prepare
,
1121 .wait_finish
= vb2_ops_wait_finish
,
1125 * V4L2 file operations
1128 static int queue_init(struct hva_ctx
*ctx
, struct vb2_queue
*vq
)
1130 vq
->io_modes
= VB2_MMAP
| VB2_DMABUF
;
1132 vq
->ops
= &hva_qops
;
1133 vq
->mem_ops
= &vb2_dma_contig_memops
;
1134 vq
->timestamp_flags
= V4L2_BUF_FLAG_TIMESTAMP_COPY
;
1135 vq
->lock
= &ctx
->hva_dev
->lock
;
1137 return vb2_queue_init(vq
);
1140 static int hva_queue_init(void *priv
, struct vb2_queue
*src_vq
,
1141 struct vb2_queue
*dst_vq
)
1143 struct hva_ctx
*ctx
= priv
;
1146 src_vq
->type
= V4L2_BUF_TYPE_VIDEO_OUTPUT
;
1147 src_vq
->buf_struct_size
= sizeof(struct hva_frame
);
1148 src_vq
->min_buffers_needed
= MIN_FRAMES
;
1149 src_vq
->dev
= ctx
->hva_dev
->dev
;
1151 ret
= queue_init(ctx
, src_vq
);
1155 dst_vq
->type
= V4L2_BUF_TYPE_VIDEO_CAPTURE
;
1156 dst_vq
->buf_struct_size
= sizeof(struct hva_stream
);
1157 dst_vq
->min_buffers_needed
= MIN_STREAMS
;
1158 dst_vq
->dev
= ctx
->hva_dev
->dev
;
1160 return queue_init(ctx
, dst_vq
);
1163 static int hva_open(struct file
*file
)
1165 struct hva_dev
*hva
= video_drvdata(file
);
1166 struct device
*dev
= hva_to_dev(hva
);
1167 struct hva_ctx
*ctx
;
1170 ctx
= kzalloc(sizeof(*ctx
), GFP_KERNEL
);
1177 INIT_WORK(&ctx
->run_work
, hva_run_work
);
1178 v4l2_fh_init(&ctx
->fh
, video_devdata(file
));
1179 file
->private_data
= &ctx
->fh
;
1180 v4l2_fh_add(&ctx
->fh
);
1182 ret
= hva_ctrls_setup(ctx
);
1184 dev_err(dev
, "%s [x:x] failed to setup controls\n",
1189 ctx
->fh
.ctrl_handler
= &ctx
->ctrl_handler
;
1191 mutex_init(&ctx
->lock
);
1193 ctx
->fh
.m2m_ctx
= v4l2_m2m_ctx_init(hva
->m2m_dev
, ctx
,
1195 if (IS_ERR(ctx
->fh
.m2m_ctx
)) {
1196 ret
= PTR_ERR(ctx
->fh
.m2m_ctx
);
1197 dev_err(dev
, "%s failed to initialize m2m context (%d)\n",
1203 /* set the instance name */
1204 mutex_lock(&hva
->lock
);
1206 snprintf(ctx
->name
, sizeof(ctx
->name
), "[%3d:----]",
1208 mutex_unlock(&hva
->lock
);
1210 /* default parameters for frame and stream */
1211 set_default_params(ctx
);
1213 #ifdef CONFIG_VIDEO_STI_HVA_DEBUGFS
1214 hva_dbg_ctx_create(ctx
);
1217 dev_info(dev
, "%s encoder instance created\n", ctx
->name
);
1222 v4l2_ctrl_handler_free(&ctx
->ctrl_handler
);
1224 v4l2_fh_del(&ctx
->fh
);
1225 v4l2_fh_exit(&ctx
->fh
);
1231 static int hva_release(struct file
*file
)
1233 struct hva_ctx
*ctx
= fh_to_ctx(file
->private_data
);
1234 struct hva_dev
*hva
= ctx_to_hdev(ctx
);
1235 struct device
*dev
= ctx_to_dev(ctx
);
1236 const struct hva_enc
*enc
= ctx
->enc
;
1239 dev_dbg(dev
, "%s %s encoder closed\n", ctx
->name
, enc
->name
);
1243 /* clear instance context in instances array */
1244 hva
->instances
[ctx
->id
] = NULL
;
1245 hva
->nb_of_instances
--;
1248 /* trace a summary of instance before closing (debug purpose) */
1249 hva_dbg_summary(ctx
);
1251 v4l2_m2m_ctx_release(ctx
->fh
.m2m_ctx
);
1253 v4l2_ctrl_handler_free(&ctx
->ctrl_handler
);
1255 v4l2_fh_del(&ctx
->fh
);
1256 v4l2_fh_exit(&ctx
->fh
);
1258 #ifdef CONFIG_VIDEO_STI_HVA_DEBUGFS
1259 hva_dbg_ctx_remove(ctx
);
1262 dev_info(dev
, "%s encoder instance released\n", ctx
->name
);
1270 static const struct v4l2_file_operations hva_fops
= {
1271 .owner
= THIS_MODULE
,
1273 .release
= hva_release
,
1274 .unlocked_ioctl
= video_ioctl2
,
1275 .mmap
= v4l2_m2m_fop_mmap
,
1276 .poll
= v4l2_m2m_fop_poll
,
1280 * Platform device operations
1283 static int hva_register_device(struct hva_dev
*hva
)
1286 struct video_device
*vdev
;
1291 dev
= hva_to_dev(hva
);
1293 hva
->m2m_dev
= v4l2_m2m_init(&hva_m2m_ops
);
1294 if (IS_ERR(hva
->m2m_dev
)) {
1295 dev_err(dev
, "%s failed to initialize v4l2-m2m device\n",
1297 ret
= PTR_ERR(hva
->m2m_dev
);
1301 vdev
= video_device_alloc();
1303 dev_err(dev
, "%s failed to allocate video device\n",
1306 goto err_m2m_release
;
1309 vdev
->fops
= &hva_fops
;
1310 vdev
->ioctl_ops
= &hva_ioctl_ops
;
1311 vdev
->release
= video_device_release
;
1312 vdev
->lock
= &hva
->lock
;
1313 vdev
->vfl_dir
= VFL_DIR_M2M
;
1314 vdev
->device_caps
= V4L2_CAP_STREAMING
| V4L2_CAP_VIDEO_M2M
;
1315 vdev
->v4l2_dev
= &hva
->v4l2_dev
;
1316 snprintf(vdev
->name
, sizeof(vdev
->name
), "%s%lx", HVA_NAME
,
1319 ret
= video_register_device(vdev
, VFL_TYPE_VIDEO
, -1);
1321 dev_err(dev
, "%s failed to register video device\n",
1323 goto err_vdev_release
;
1327 video_set_drvdata(vdev
, hva
);
1331 video_device_release(vdev
);
1333 v4l2_m2m_release(hva
->m2m_dev
);
1338 static void hva_unregister_device(struct hva_dev
*hva
)
1344 v4l2_m2m_release(hva
->m2m_dev
);
1346 video_unregister_device(hva
->vdev
);
1349 static int hva_probe(struct platform_device
*pdev
)
1351 struct hva_dev
*hva
;
1352 struct device
*dev
= &pdev
->dev
;
1355 hva
= devm_kzalloc(dev
, sizeof(*hva
), GFP_KERNEL
);
1361 ret
= dma_coerce_mask_and_coherent(dev
, DMA_BIT_MASK(32));
1367 platform_set_drvdata(pdev
, hva
);
1369 mutex_init(&hva
->lock
);
1371 /* probe hardware */
1372 ret
= hva_hw_probe(pdev
, hva
);
1376 /* register all available encoders */
1377 register_encoders(hva
);
1379 /* register all supported formats */
1380 register_formats(hva
);
1382 /* register on V4L2 */
1383 ret
= v4l2_device_register(dev
, &hva
->v4l2_dev
);
1385 dev_err(dev
, "%s %s failed to register V4L2 device\n",
1386 HVA_PREFIX
, HVA_NAME
);
1390 #ifdef CONFIG_VIDEO_STI_HVA_DEBUGFS
1391 hva_debugfs_create(hva
);
1394 hva
->work_queue
= create_workqueue(HVA_NAME
);
1395 if (!hva
->work_queue
) {
1396 dev_err(dev
, "%s %s failed to allocate work queue\n",
1397 HVA_PREFIX
, HVA_NAME
);
1402 /* register device */
1403 ret
= hva_register_device(hva
);
1405 goto err_work_queue
;
1407 dev_info(dev
, "%s %s registered as /dev/video%d\n", HVA_PREFIX
,
1408 HVA_NAME
, hva
->vdev
->num
);
1413 destroy_workqueue(hva
->work_queue
);
1415 #ifdef CONFIG_VIDEO_STI_HVA_DEBUGFS
1416 hva_debugfs_remove(hva
);
1418 v4l2_device_unregister(&hva
->v4l2_dev
);
1425 static int hva_remove(struct platform_device
*pdev
)
1427 struct hva_dev
*hva
= platform_get_drvdata(pdev
);
1428 struct device
*dev
= hva_to_dev(hva
);
1430 hva_unregister_device(hva
);
1432 destroy_workqueue(hva
->work_queue
);
1436 #ifdef CONFIG_VIDEO_STI_HVA_DEBUGFS
1437 hva_debugfs_remove(hva
);
1440 v4l2_device_unregister(&hva
->v4l2_dev
);
1442 dev_info(dev
, "%s %s removed\n", HVA_PREFIX
, pdev
->name
);
1448 static const struct dev_pm_ops hva_pm_ops
= {
1449 .runtime_suspend
= hva_hw_runtime_suspend
,
1450 .runtime_resume
= hva_hw_runtime_resume
,
1453 static const struct of_device_id hva_match_types
[] = {
1455 .compatible
= "st,st-hva",
1460 MODULE_DEVICE_TABLE(of
, hva_match_types
);
1462 static struct platform_driver hva_driver
= {
1464 .remove
= hva_remove
,
1467 .of_match_table
= hva_match_types
,
1472 module_platform_driver(hva_driver
);
1474 MODULE_LICENSE("GPL");
1475 MODULE_AUTHOR("Yannick Fertre <yannick.fertre@st.com>");
1476 MODULE_DESCRIPTION("STMicroelectronics HVA video encoder V4L2 driver");