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/platform_device.h>
10 #include <linux/slab.h>
11 #include <media/v4l2-event.h>
12 #include <media/v4l2-ioctl.h>
13 #include <media/videobuf2-dma-contig.h>
21 #define HVA_MIN_WIDTH 32
22 #define HVA_MAX_WIDTH 1920
23 #define HVA_MIN_HEIGHT 32
24 #define HVA_MAX_HEIGHT 1920
26 /* HVA requires a 16x16 pixels alignment for frames */
27 #define HVA_WIDTH_ALIGNMENT 16
28 #define HVA_HEIGHT_ALIGNMENT 16
30 #define HVA_DEFAULT_WIDTH HVA_MIN_WIDTH
31 #define HVA_DEFAULT_HEIGHT HVA_MIN_HEIGHT
32 #define HVA_DEFAULT_FRAME_NUM 1
33 #define HVA_DEFAULT_FRAME_DEN 30
35 #define to_type_str(type) (type == V4L2_BUF_TYPE_VIDEO_OUTPUT ? \
38 #define fh_to_ctx(f) (container_of(f, struct hva_ctx, fh))
40 /* registry of available encoders */
41 static const struct hva_enc
*hva_encoders
[] = {
46 static inline int frame_size(u32 w
, u32 h
, u32 fmt
)
49 case V4L2_PIX_FMT_NV12
:
50 case V4L2_PIX_FMT_NV21
:
51 return (w
* h
* 3) / 2;
57 static inline int frame_stride(u32 w
, u32 fmt
)
60 case V4L2_PIX_FMT_NV12
:
61 case V4L2_PIX_FMT_NV21
:
68 static inline int frame_alignment(u32 fmt
)
71 case V4L2_PIX_FMT_NV12
:
72 case V4L2_PIX_FMT_NV21
:
80 static inline int estimated_stream_size(u32 w
, u32 h
)
83 * HVA only encodes in YUV420 format, whatever the frame format.
84 * A compression ratio of 2 is assumed: thus, the maximum size
85 * of a stream is estimated to ((width x height x 3 / 2) / 2)
87 return (w
* h
* 3) / 4;
90 static void set_default_params(struct hva_ctx
*ctx
)
92 struct hva_frameinfo
*frameinfo
= &ctx
->frameinfo
;
93 struct hva_streaminfo
*streaminfo
= &ctx
->streaminfo
;
95 frameinfo
->pixelformat
= V4L2_PIX_FMT_NV12
;
96 frameinfo
->width
= HVA_DEFAULT_WIDTH
;
97 frameinfo
->height
= HVA_DEFAULT_HEIGHT
;
98 frameinfo
->aligned_width
= ALIGN(frameinfo
->width
,
100 frameinfo
->aligned_height
= ALIGN(frameinfo
->height
,
101 HVA_HEIGHT_ALIGNMENT
);
102 frameinfo
->size
= frame_size(frameinfo
->aligned_width
,
103 frameinfo
->aligned_height
,
104 frameinfo
->pixelformat
);
106 streaminfo
->streamformat
= V4L2_PIX_FMT_H264
;
107 streaminfo
->width
= HVA_DEFAULT_WIDTH
;
108 streaminfo
->height
= HVA_DEFAULT_HEIGHT
;
110 ctx
->colorspace
= V4L2_COLORSPACE_REC709
;
111 ctx
->xfer_func
= V4L2_XFER_FUNC_DEFAULT
;
112 ctx
->ycbcr_enc
= V4L2_YCBCR_ENC_DEFAULT
;
113 ctx
->quantization
= V4L2_QUANTIZATION_DEFAULT
;
115 ctx
->max_stream_size
= estimated_stream_size(streaminfo
->width
,
119 static const struct hva_enc
*hva_find_encoder(struct hva_ctx
*ctx
,
123 struct hva_dev
*hva
= ctx_to_hdev(ctx
);
124 const struct hva_enc
*enc
;
127 for (i
= 0; i
< hva
->nb_of_encoders
; i
++) {
128 enc
= hva
->encoders
[i
];
129 if ((enc
->pixelformat
== pixelformat
) &&
130 (enc
->streamformat
== streamformat
))
137 static void register_format(u32 format
, u32 formats
[], u32
*nb_of_formats
)
142 for (i
= 0; i
< *nb_of_formats
; i
++) {
143 if (format
== formats
[i
]) {
150 formats
[(*nb_of_formats
)++] = format
;
153 static void register_formats(struct hva_dev
*hva
)
157 for (i
= 0; i
< hva
->nb_of_encoders
; i
++) {
158 register_format(hva
->encoders
[i
]->pixelformat
,
160 &hva
->nb_of_pixelformats
);
162 register_format(hva
->encoders
[i
]->streamformat
,
164 &hva
->nb_of_streamformats
);
168 static void register_encoders(struct hva_dev
*hva
)
170 struct device
*dev
= hva_to_dev(hva
);
173 for (i
= 0; i
< ARRAY_SIZE(hva_encoders
); i
++) {
174 if (hva
->nb_of_encoders
>= HVA_MAX_ENCODERS
) {
176 "%s failed to register %s encoder (%d maximum reached)\n",
177 HVA_PREFIX
, hva_encoders
[i
]->name
,
182 hva
->encoders
[hva
->nb_of_encoders
++] = hva_encoders
[i
];
183 dev_info(dev
, "%s %s encoder registered\n", HVA_PREFIX
,
184 hva_encoders
[i
]->name
);
188 static int hva_open_encoder(struct hva_ctx
*ctx
, u32 streamformat
,
189 u32 pixelformat
, struct hva_enc
**penc
)
191 struct hva_dev
*hva
= ctx_to_hdev(ctx
);
192 struct device
*dev
= ctx_to_dev(ctx
);
196 /* find an encoder which can deal with these formats */
197 enc
= (struct hva_enc
*)hva_find_encoder(ctx
, pixelformat
,
200 dev_err(dev
, "%s no encoder found matching %4.4s => %4.4s\n",
201 ctx
->name
, (char *)&pixelformat
, (char *)&streamformat
);
205 dev_dbg(dev
, "%s one encoder matching %4.4s => %4.4s\n",
206 ctx
->name
, (char *)&pixelformat
, (char *)&streamformat
);
208 /* update instance name */
209 snprintf(ctx
->name
, sizeof(ctx
->name
), "[%3d:%4.4s]",
210 hva
->instance_id
, (char *)&streamformat
);
212 /* open encoder instance */
213 ret
= enc
->open(ctx
);
215 dev_err(dev
, "%s failed to open encoder instance (%d)\n",
220 dev_dbg(dev
, "%s %s encoder opened\n", ctx
->name
, enc
->name
);
227 static void hva_dbg_summary(struct hva_ctx
*ctx
)
229 struct device
*dev
= ctx_to_dev(ctx
);
230 struct hva_streaminfo
*stream
= &ctx
->streaminfo
;
231 struct hva_frameinfo
*frame
= &ctx
->frameinfo
;
233 if (!(ctx
->flags
& HVA_FLAG_STREAMINFO
))
236 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",
238 (char *)&frame
->pixelformat
,
239 frame
->aligned_width
, frame
->aligned_height
,
240 (char *)&stream
->streamformat
,
241 stream
->width
, stream
->height
,
242 stream
->profile
, stream
->level
,
250 * V4L2 ioctl operations
253 static int hva_querycap(struct file
*file
, void *priv
,
254 struct v4l2_capability
*cap
)
256 struct hva_ctx
*ctx
= fh_to_ctx(file
->private_data
);
257 struct hva_dev
*hva
= ctx_to_hdev(ctx
);
259 strlcpy(cap
->driver
, HVA_NAME
, sizeof(cap
->driver
));
260 strlcpy(cap
->card
, hva
->vdev
->name
, sizeof(cap
->card
));
261 snprintf(cap
->bus_info
, sizeof(cap
->bus_info
), "platform:%s",
267 static int hva_enum_fmt_stream(struct file
*file
, void *priv
,
268 struct v4l2_fmtdesc
*f
)
270 struct hva_ctx
*ctx
= fh_to_ctx(file
->private_data
);
271 struct hva_dev
*hva
= ctx_to_hdev(ctx
);
273 if (unlikely(f
->index
>= hva
->nb_of_streamformats
))
276 f
->pixelformat
= hva
->streamformats
[f
->index
];
281 static int hva_enum_fmt_frame(struct file
*file
, void *priv
,
282 struct v4l2_fmtdesc
*f
)
284 struct hva_ctx
*ctx
= fh_to_ctx(file
->private_data
);
285 struct hva_dev
*hva
= ctx_to_hdev(ctx
);
287 if (unlikely(f
->index
>= hva
->nb_of_pixelformats
))
290 f
->pixelformat
= hva
->pixelformats
[f
->index
];
295 static int hva_g_fmt_stream(struct file
*file
, void *fh
, struct v4l2_format
*f
)
297 struct hva_ctx
*ctx
= fh_to_ctx(file
->private_data
);
298 struct hva_streaminfo
*streaminfo
= &ctx
->streaminfo
;
300 f
->fmt
.pix
.width
= streaminfo
->width
;
301 f
->fmt
.pix
.height
= streaminfo
->height
;
302 f
->fmt
.pix
.field
= V4L2_FIELD_NONE
;
303 f
->fmt
.pix
.colorspace
= ctx
->colorspace
;
304 f
->fmt
.pix
.xfer_func
= ctx
->xfer_func
;
305 f
->fmt
.pix
.ycbcr_enc
= ctx
->ycbcr_enc
;
306 f
->fmt
.pix
.quantization
= ctx
->quantization
;
307 f
->fmt
.pix
.pixelformat
= streaminfo
->streamformat
;
308 f
->fmt
.pix
.bytesperline
= 0;
309 f
->fmt
.pix
.sizeimage
= ctx
->max_stream_size
;
314 static int hva_g_fmt_frame(struct file
*file
, void *fh
, struct v4l2_format
*f
)
316 struct hva_ctx
*ctx
= fh_to_ctx(file
->private_data
);
317 struct hva_frameinfo
*frameinfo
= &ctx
->frameinfo
;
319 f
->fmt
.pix
.width
= frameinfo
->width
;
320 f
->fmt
.pix
.height
= frameinfo
->height
;
321 f
->fmt
.pix
.field
= V4L2_FIELD_NONE
;
322 f
->fmt
.pix
.colorspace
= ctx
->colorspace
;
323 f
->fmt
.pix
.xfer_func
= ctx
->xfer_func
;
324 f
->fmt
.pix
.ycbcr_enc
= ctx
->ycbcr_enc
;
325 f
->fmt
.pix
.quantization
= ctx
->quantization
;
326 f
->fmt
.pix
.pixelformat
= frameinfo
->pixelformat
;
327 f
->fmt
.pix
.bytesperline
= frame_stride(frameinfo
->aligned_width
,
328 frameinfo
->pixelformat
);
329 f
->fmt
.pix
.sizeimage
= frameinfo
->size
;
334 static int hva_try_fmt_stream(struct file
*file
, void *priv
,
335 struct v4l2_format
*f
)
337 struct hva_ctx
*ctx
= fh_to_ctx(file
->private_data
);
338 struct device
*dev
= ctx_to_dev(ctx
);
339 struct v4l2_pix_format
*pix
= &f
->fmt
.pix
;
340 u32 streamformat
= pix
->pixelformat
;
341 const struct hva_enc
*enc
;
345 enc
= hva_find_encoder(ctx
, ctx
->frameinfo
.pixelformat
, streamformat
);
348 "%s V4L2 TRY_FMT (CAPTURE): unsupported format %.4s\n",
349 ctx
->name
, (char *)&pix
->pixelformat
);
354 height
= pix
->height
;
355 if (ctx
->flags
& HVA_FLAG_FRAMEINFO
) {
357 * if the frame resolution is already fixed, only allow the
358 * same stream resolution
360 pix
->width
= ctx
->frameinfo
.width
;
361 pix
->height
= ctx
->frameinfo
.height
;
362 if ((pix
->width
!= width
) || (pix
->height
!= height
))
364 "%s V4L2 TRY_FMT (CAPTURE): resolution updated %dx%d -> %dx%d to fit frame resolution\n",
365 ctx
->name
, width
, height
,
366 pix
->width
, pix
->height
);
368 /* adjust width & height */
369 v4l_bound_align_image(&pix
->width
,
370 HVA_MIN_WIDTH
, enc
->max_width
,
373 HVA_MIN_HEIGHT
, enc
->max_height
,
377 if ((pix
->width
!= width
) || (pix
->height
!= height
))
379 "%s V4L2 TRY_FMT (CAPTURE): resolution updated %dx%d -> %dx%d to fit min/max/alignment\n",
380 ctx
->name
, width
, height
,
381 pix
->width
, pix
->height
);
384 stream_size
= estimated_stream_size(pix
->width
, pix
->height
);
385 if (pix
->sizeimage
< stream_size
)
386 pix
->sizeimage
= stream_size
;
388 pix
->bytesperline
= 0;
389 pix
->colorspace
= ctx
->colorspace
;
390 pix
->xfer_func
= ctx
->xfer_func
;
391 pix
->ycbcr_enc
= ctx
->ycbcr_enc
;
392 pix
->quantization
= ctx
->quantization
;
393 pix
->field
= V4L2_FIELD_NONE
;
398 static int hva_try_fmt_frame(struct file
*file
, void *priv
,
399 struct v4l2_format
*f
)
401 struct hva_ctx
*ctx
= fh_to_ctx(file
->private_data
);
402 struct device
*dev
= ctx_to_dev(ctx
);
403 struct v4l2_pix_format
*pix
= &f
->fmt
.pix
;
404 u32 pixelformat
= pix
->pixelformat
;
405 const struct hva_enc
*enc
;
408 enc
= hva_find_encoder(ctx
, pixelformat
, ctx
->streaminfo
.streamformat
);
411 "%s V4L2 TRY_FMT (OUTPUT): unsupported format %.4s\n",
412 ctx
->name
, (char *)&pixelformat
);
416 /* adjust width & height */
418 height
= pix
->height
;
419 v4l_bound_align_image(&pix
->width
,
420 HVA_MIN_WIDTH
, HVA_MAX_WIDTH
,
421 frame_alignment(pixelformat
) - 1,
423 HVA_MIN_HEIGHT
, HVA_MAX_HEIGHT
,
424 frame_alignment(pixelformat
) - 1,
427 if ((pix
->width
!= width
) || (pix
->height
!= height
))
429 "%s V4L2 TRY_FMT (OUTPUT): resolution updated %dx%d -> %dx%d to fit min/max/alignment\n",
430 ctx
->name
, width
, height
, pix
->width
, pix
->height
);
432 width
= ALIGN(pix
->width
, HVA_WIDTH_ALIGNMENT
);
433 height
= ALIGN(pix
->height
, HVA_HEIGHT_ALIGNMENT
);
435 if (!pix
->colorspace
) {
436 pix
->colorspace
= V4L2_COLORSPACE_REC709
;
437 pix
->xfer_func
= V4L2_XFER_FUNC_DEFAULT
;
438 pix
->ycbcr_enc
= V4L2_YCBCR_ENC_DEFAULT
;
439 pix
->quantization
= V4L2_QUANTIZATION_DEFAULT
;
442 pix
->bytesperline
= frame_stride(width
, pixelformat
);
443 pix
->sizeimage
= frame_size(width
, height
, pixelformat
);
444 pix
->field
= V4L2_FIELD_NONE
;
449 static int hva_s_fmt_stream(struct file
*file
, void *fh
, struct v4l2_format
*f
)
451 struct hva_ctx
*ctx
= fh_to_ctx(file
->private_data
);
452 struct device
*dev
= ctx_to_dev(ctx
);
453 struct vb2_queue
*vq
;
456 ret
= hva_try_fmt_stream(file
, fh
, f
);
458 dev_dbg(dev
, "%s V4L2 S_FMT (CAPTURE): unsupported format %.4s\n",
459 ctx
->name
, (char *)&f
->fmt
.pix
.pixelformat
);
463 vq
= v4l2_m2m_get_vq(ctx
->fh
.m2m_ctx
, f
->type
);
464 if (vb2_is_streaming(vq
)) {
465 dev_dbg(dev
, "%s V4L2 S_FMT (CAPTURE): queue busy\n",
470 ctx
->max_stream_size
= f
->fmt
.pix
.sizeimage
;
471 ctx
->streaminfo
.width
= f
->fmt
.pix
.width
;
472 ctx
->streaminfo
.height
= f
->fmt
.pix
.height
;
473 ctx
->streaminfo
.streamformat
= f
->fmt
.pix
.pixelformat
;
474 ctx
->flags
|= HVA_FLAG_STREAMINFO
;
479 static int hva_s_fmt_frame(struct file
*file
, void *fh
, struct v4l2_format
*f
)
481 struct hva_ctx
*ctx
= fh_to_ctx(file
->private_data
);
482 struct device
*dev
= ctx_to_dev(ctx
);
483 struct v4l2_pix_format
*pix
= &f
->fmt
.pix
;
484 struct vb2_queue
*vq
;
487 ret
= hva_try_fmt_frame(file
, fh
, f
);
489 dev_dbg(dev
, "%s V4L2 S_FMT (OUTPUT): unsupported format %.4s\n",
490 ctx
->name
, (char *)&pix
->pixelformat
);
494 vq
= v4l2_m2m_get_vq(ctx
->fh
.m2m_ctx
, f
->type
);
495 if (vb2_is_streaming(vq
)) {
496 dev_dbg(dev
, "%s V4L2 S_FMT (OUTPUT): queue busy\n", ctx
->name
);
500 ctx
->colorspace
= pix
->colorspace
;
501 ctx
->xfer_func
= pix
->xfer_func
;
502 ctx
->ycbcr_enc
= pix
->ycbcr_enc
;
503 ctx
->quantization
= pix
->quantization
;
505 ctx
->frameinfo
.aligned_width
= ALIGN(pix
->width
, HVA_WIDTH_ALIGNMENT
);
506 ctx
->frameinfo
.aligned_height
= ALIGN(pix
->height
,
507 HVA_HEIGHT_ALIGNMENT
);
508 ctx
->frameinfo
.size
= pix
->sizeimage
;
509 ctx
->frameinfo
.pixelformat
= pix
->pixelformat
;
510 ctx
->frameinfo
.width
= pix
->width
;
511 ctx
->frameinfo
.height
= pix
->height
;
512 ctx
->flags
|= HVA_FLAG_FRAMEINFO
;
517 static int hva_g_parm(struct file
*file
, void *fh
, struct v4l2_streamparm
*sp
)
519 struct hva_ctx
*ctx
= fh_to_ctx(file
->private_data
);
520 struct v4l2_fract
*time_per_frame
= &ctx
->ctrls
.time_per_frame
;
522 if (sp
->type
!= V4L2_BUF_TYPE_VIDEO_OUTPUT
)
525 sp
->parm
.output
.capability
= V4L2_CAP_TIMEPERFRAME
;
526 sp
->parm
.output
.timeperframe
.numerator
= time_per_frame
->numerator
;
527 sp
->parm
.output
.timeperframe
.denominator
=
528 time_per_frame
->denominator
;
533 static int hva_s_parm(struct file
*file
, void *fh
, struct v4l2_streamparm
*sp
)
535 struct hva_ctx
*ctx
= fh_to_ctx(file
->private_data
);
536 struct v4l2_fract
*time_per_frame
= &ctx
->ctrls
.time_per_frame
;
538 if (sp
->type
!= V4L2_BUF_TYPE_VIDEO_OUTPUT
)
541 if (!sp
->parm
.output
.timeperframe
.numerator
||
542 !sp
->parm
.output
.timeperframe
.denominator
)
543 return hva_g_parm(file
, fh
, sp
);
545 sp
->parm
.output
.capability
= V4L2_CAP_TIMEPERFRAME
;
546 time_per_frame
->numerator
= sp
->parm
.output
.timeperframe
.numerator
;
547 time_per_frame
->denominator
=
548 sp
->parm
.output
.timeperframe
.denominator
;
553 static int hva_qbuf(struct file
*file
, void *priv
, struct v4l2_buffer
*buf
)
555 struct hva_ctx
*ctx
= fh_to_ctx(file
->private_data
);
556 struct device
*dev
= ctx_to_dev(ctx
);
558 if (buf
->type
== V4L2_BUF_TYPE_VIDEO_CAPTURE
) {
560 * depending on the targeted compressed video format, the
561 * capture buffer might contain headers (e.g. H.264 SPS/PPS)
562 * filled in by the driver client; the size of these data is
563 * copied from the bytesused field of the V4L2 buffer in the
564 * payload field of the hva stream buffer
566 struct vb2_queue
*vq
;
567 struct hva_stream
*stream
;
569 vq
= v4l2_m2m_get_vq(ctx
->fh
.m2m_ctx
, buf
->type
);
571 if (buf
->index
>= vq
->num_buffers
) {
572 dev_dbg(dev
, "%s buffer index %d out of range (%d)\n",
573 ctx
->name
, buf
->index
, vq
->num_buffers
);
577 stream
= (struct hva_stream
*)vq
->bufs
[buf
->index
];
578 stream
->bytesused
= buf
->bytesused
;
581 return v4l2_m2m_qbuf(file
, ctx
->fh
.m2m_ctx
, buf
);
585 static const struct v4l2_ioctl_ops hva_ioctl_ops
= {
586 .vidioc_querycap
= hva_querycap
,
587 .vidioc_enum_fmt_vid_cap
= hva_enum_fmt_stream
,
588 .vidioc_enum_fmt_vid_out
= hva_enum_fmt_frame
,
589 .vidioc_g_fmt_vid_cap
= hva_g_fmt_stream
,
590 .vidioc_g_fmt_vid_out
= hva_g_fmt_frame
,
591 .vidioc_try_fmt_vid_cap
= hva_try_fmt_stream
,
592 .vidioc_try_fmt_vid_out
= hva_try_fmt_frame
,
593 .vidioc_s_fmt_vid_cap
= hva_s_fmt_stream
,
594 .vidioc_s_fmt_vid_out
= hva_s_fmt_frame
,
595 .vidioc_g_parm
= hva_g_parm
,
596 .vidioc_s_parm
= hva_s_parm
,
597 .vidioc_reqbufs
= v4l2_m2m_ioctl_reqbufs
,
598 .vidioc_create_bufs
= v4l2_m2m_ioctl_create_bufs
,
599 .vidioc_querybuf
= v4l2_m2m_ioctl_querybuf
,
600 .vidioc_expbuf
= v4l2_m2m_ioctl_expbuf
,
601 .vidioc_qbuf
= hva_qbuf
,
602 .vidioc_dqbuf
= v4l2_m2m_ioctl_dqbuf
,
603 .vidioc_streamon
= v4l2_m2m_ioctl_streamon
,
604 .vidioc_streamoff
= v4l2_m2m_ioctl_streamoff
,
605 .vidioc_subscribe_event
= v4l2_ctrl_subscribe_event
,
606 .vidioc_unsubscribe_event
= v4l2_event_unsubscribe
,
610 * V4L2 control operations
613 static int hva_s_ctrl(struct v4l2_ctrl
*ctrl
)
615 struct hva_ctx
*ctx
= container_of(ctrl
->handler
, struct hva_ctx
,
617 struct device
*dev
= ctx_to_dev(ctx
);
619 dev_dbg(dev
, "%s S_CTRL: id = %d, val = %d\n", ctx
->name
,
620 ctrl
->id
, ctrl
->val
);
623 case V4L2_CID_MPEG_VIDEO_BITRATE_MODE
:
624 ctx
->ctrls
.bitrate_mode
= ctrl
->val
;
626 case V4L2_CID_MPEG_VIDEO_GOP_SIZE
:
627 ctx
->ctrls
.gop_size
= ctrl
->val
;
629 case V4L2_CID_MPEG_VIDEO_BITRATE
:
630 ctx
->ctrls
.bitrate
= ctrl
->val
;
632 case V4L2_CID_MPEG_VIDEO_ASPECT
:
633 ctx
->ctrls
.aspect
= ctrl
->val
;
635 case V4L2_CID_MPEG_VIDEO_H264_PROFILE
:
636 ctx
->ctrls
.profile
= ctrl
->val
;
637 snprintf(ctx
->streaminfo
.profile
,
638 sizeof(ctx
->streaminfo
.profile
),
640 v4l2_ctrl_get_menu(ctrl
->id
)[ctrl
->val
]);
642 case V4L2_CID_MPEG_VIDEO_H264_LEVEL
:
643 ctx
->ctrls
.level
= ctrl
->val
;
644 snprintf(ctx
->streaminfo
.level
,
645 sizeof(ctx
->streaminfo
.level
),
647 v4l2_ctrl_get_menu(ctrl
->id
)[ctrl
->val
]);
649 case V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE
:
650 ctx
->ctrls
.entropy_mode
= ctrl
->val
;
652 case V4L2_CID_MPEG_VIDEO_H264_CPB_SIZE
:
653 ctx
->ctrls
.cpb_size
= ctrl
->val
;
655 case V4L2_CID_MPEG_VIDEO_H264_8X8_TRANSFORM
:
656 ctx
->ctrls
.dct8x8
= ctrl
->val
;
658 case V4L2_CID_MPEG_VIDEO_H264_MIN_QP
:
659 ctx
->ctrls
.qpmin
= ctrl
->val
;
661 case V4L2_CID_MPEG_VIDEO_H264_MAX_QP
:
662 ctx
->ctrls
.qpmax
= ctrl
->val
;
664 case V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_ENABLE
:
665 ctx
->ctrls
.vui_sar
= ctrl
->val
;
667 case V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_IDC
:
668 ctx
->ctrls
.vui_sar_idc
= ctrl
->val
;
670 case V4L2_CID_MPEG_VIDEO_H264_SEI_FRAME_PACKING
:
671 ctx
->ctrls
.sei_fp
= ctrl
->val
;
673 case V4L2_CID_MPEG_VIDEO_H264_SEI_FP_ARRANGEMENT_TYPE
:
674 ctx
->ctrls
.sei_fp_type
= ctrl
->val
;
677 dev_dbg(dev
, "%s S_CTRL: invalid control (id = %d)\n",
678 ctx
->name
, ctrl
->id
);
685 /* V4L2 control ops */
686 static const struct v4l2_ctrl_ops hva_ctrl_ops
= {
687 .s_ctrl
= hva_s_ctrl
,
690 static int hva_ctrls_setup(struct hva_ctx
*ctx
)
692 struct device
*dev
= ctx_to_dev(ctx
);
694 enum v4l2_mpeg_video_h264_sei_fp_arrangement_type sei_fp_type
=
695 V4L2_MPEG_VIDEO_H264_SEI_FP_ARRANGEMENT_TYPE_TOP_BOTTOM
;
697 v4l2_ctrl_handler_init(&ctx
->ctrl_handler
, 15);
699 v4l2_ctrl_new_std_menu(&ctx
->ctrl_handler
, &hva_ctrl_ops
,
700 V4L2_CID_MPEG_VIDEO_BITRATE_MODE
,
701 V4L2_MPEG_VIDEO_BITRATE_MODE_CBR
,
703 V4L2_MPEG_VIDEO_BITRATE_MODE_CBR
);
705 v4l2_ctrl_new_std(&ctx
->ctrl_handler
, &hva_ctrl_ops
,
706 V4L2_CID_MPEG_VIDEO_GOP_SIZE
,
709 v4l2_ctrl_new_std(&ctx
->ctrl_handler
, &hva_ctrl_ops
,
710 V4L2_CID_MPEG_VIDEO_BITRATE
,
711 1000, 60000000, 1000, 20000000);
713 mask
= ~(1 << V4L2_MPEG_VIDEO_ASPECT_1x1
);
714 v4l2_ctrl_new_std_menu(&ctx
->ctrl_handler
, &hva_ctrl_ops
,
715 V4L2_CID_MPEG_VIDEO_ASPECT
,
716 V4L2_MPEG_VIDEO_ASPECT_1x1
,
718 V4L2_MPEG_VIDEO_ASPECT_1x1
);
720 mask
= ~((1 << V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE
) |
721 (1 << V4L2_MPEG_VIDEO_H264_PROFILE_MAIN
) |
722 (1 << V4L2_MPEG_VIDEO_H264_PROFILE_HIGH
) |
723 (1 << V4L2_MPEG_VIDEO_H264_PROFILE_STEREO_HIGH
));
724 v4l2_ctrl_new_std_menu(&ctx
->ctrl_handler
, &hva_ctrl_ops
,
725 V4L2_CID_MPEG_VIDEO_H264_PROFILE
,
726 V4L2_MPEG_VIDEO_H264_PROFILE_STEREO_HIGH
,
728 V4L2_MPEG_VIDEO_H264_PROFILE_HIGH
);
730 v4l2_ctrl_new_std_menu(&ctx
->ctrl_handler
, &hva_ctrl_ops
,
731 V4L2_CID_MPEG_VIDEO_H264_LEVEL
,
732 V4L2_MPEG_VIDEO_H264_LEVEL_4_2
,
734 V4L2_MPEG_VIDEO_H264_LEVEL_4_0
);
736 v4l2_ctrl_new_std_menu(&ctx
->ctrl_handler
, &hva_ctrl_ops
,
737 V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE
,
738 V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC
,
740 V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CAVLC
);
742 v4l2_ctrl_new_std(&ctx
->ctrl_handler
, &hva_ctrl_ops
,
743 V4L2_CID_MPEG_VIDEO_H264_CPB_SIZE
,
746 v4l2_ctrl_new_std(&ctx
->ctrl_handler
, &hva_ctrl_ops
,
747 V4L2_CID_MPEG_VIDEO_H264_8X8_TRANSFORM
,
750 v4l2_ctrl_new_std(&ctx
->ctrl_handler
, &hva_ctrl_ops
,
751 V4L2_CID_MPEG_VIDEO_H264_MIN_QP
,
754 v4l2_ctrl_new_std(&ctx
->ctrl_handler
, &hva_ctrl_ops
,
755 V4L2_CID_MPEG_VIDEO_H264_MAX_QP
,
758 v4l2_ctrl_new_std(&ctx
->ctrl_handler
, &hva_ctrl_ops
,
759 V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_ENABLE
,
762 mask
= ~(1 << V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_1x1
);
763 v4l2_ctrl_new_std_menu(&ctx
->ctrl_handler
, &hva_ctrl_ops
,
764 V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_IDC
,
765 V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_1x1
,
767 V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_1x1
);
769 v4l2_ctrl_new_std(&ctx
->ctrl_handler
, &hva_ctrl_ops
,
770 V4L2_CID_MPEG_VIDEO_H264_SEI_FRAME_PACKING
,
773 mask
= ~(1 << sei_fp_type
);
774 v4l2_ctrl_new_std_menu(&ctx
->ctrl_handler
, &hva_ctrl_ops
,
775 V4L2_CID_MPEG_VIDEO_H264_SEI_FP_ARRANGEMENT_TYPE
,
780 if (ctx
->ctrl_handler
.error
) {
781 int err
= ctx
->ctrl_handler
.error
;
783 dev_dbg(dev
, "%s controls setup failed (%d)\n",
785 v4l2_ctrl_handler_free(&ctx
->ctrl_handler
);
789 v4l2_ctrl_handler_setup(&ctx
->ctrl_handler
);
791 /* set default time per frame */
792 ctx
->ctrls
.time_per_frame
.numerator
= HVA_DEFAULT_FRAME_NUM
;
793 ctx
->ctrls
.time_per_frame
.denominator
= HVA_DEFAULT_FRAME_DEN
;
799 * mem-to-mem operations
802 static void hva_run_work(struct work_struct
*work
)
804 struct hva_ctx
*ctx
= container_of(work
, struct hva_ctx
, run_work
);
805 struct vb2_v4l2_buffer
*src_buf
, *dst_buf
;
806 const struct hva_enc
*enc
= ctx
->enc
;
807 struct hva_frame
*frame
;
808 struct hva_stream
*stream
;
811 /* protect instance against reentrancy */
812 mutex_lock(&ctx
->lock
);
814 #ifdef CONFIG_VIDEO_STI_HVA_DEBUGFS
815 hva_dbg_perf_begin(ctx
);
818 src_buf
= v4l2_m2m_src_buf_remove(ctx
->fh
.m2m_ctx
);
819 dst_buf
= v4l2_m2m_dst_buf_remove(ctx
->fh
.m2m_ctx
);
821 frame
= to_hva_frame(src_buf
);
822 stream
= to_hva_stream(dst_buf
);
823 frame
->vbuf
.sequence
= ctx
->frame_num
++;
825 ret
= enc
->encode(ctx
, frame
, stream
);
827 vb2_set_plane_payload(&dst_buf
->vb2_buf
, 0, stream
->bytesused
);
829 v4l2_m2m_buf_done(src_buf
, VB2_BUF_STATE_ERROR
);
830 v4l2_m2m_buf_done(dst_buf
, VB2_BUF_STATE_ERROR
);
832 /* propagate frame timestamp */
833 dst_buf
->vb2_buf
.timestamp
= src_buf
->vb2_buf
.timestamp
;
834 dst_buf
->field
= V4L2_FIELD_NONE
;
835 dst_buf
->sequence
= ctx
->stream_num
- 1;
837 ctx
->encoded_frames
++;
839 #ifdef CONFIG_VIDEO_STI_HVA_DEBUGFS
840 hva_dbg_perf_end(ctx
, stream
);
843 v4l2_m2m_buf_done(src_buf
, VB2_BUF_STATE_DONE
);
844 v4l2_m2m_buf_done(dst_buf
, VB2_BUF_STATE_DONE
);
847 mutex_unlock(&ctx
->lock
);
849 v4l2_m2m_job_finish(ctx
->hva_dev
->m2m_dev
, ctx
->fh
.m2m_ctx
);
852 static void hva_device_run(void *priv
)
854 struct hva_ctx
*ctx
= priv
;
855 struct hva_dev
*hva
= ctx_to_hdev(ctx
);
857 queue_work(hva
->work_queue
, &ctx
->run_work
);
860 static void hva_job_abort(void *priv
)
862 struct hva_ctx
*ctx
= priv
;
863 struct device
*dev
= ctx_to_dev(ctx
);
865 dev_dbg(dev
, "%s aborting job\n", ctx
->name
);
867 ctx
->aborting
= true;
870 static int hva_job_ready(void *priv
)
872 struct hva_ctx
*ctx
= priv
;
873 struct device
*dev
= ctx_to_dev(ctx
);
875 if (!v4l2_m2m_num_src_bufs_ready(ctx
->fh
.m2m_ctx
)) {
876 dev_dbg(dev
, "%s job not ready: no frame buffers\n",
881 if (!v4l2_m2m_num_dst_bufs_ready(ctx
->fh
.m2m_ctx
)) {
882 dev_dbg(dev
, "%s job not ready: no stream buffers\n",
888 dev_dbg(dev
, "%s job not ready: aborting\n", ctx
->name
);
896 static const struct v4l2_m2m_ops hva_m2m_ops
= {
897 .device_run
= hva_device_run
,
898 .job_abort
= hva_job_abort
,
899 .job_ready
= hva_job_ready
,
903 * VB2 queue operations
906 static int hva_queue_setup(struct vb2_queue
*vq
,
907 unsigned int *num_buffers
, unsigned int *num_planes
,
908 unsigned int sizes
[], struct device
*alloc_devs
[])
910 struct hva_ctx
*ctx
= vb2_get_drv_priv(vq
);
911 struct device
*dev
= ctx_to_dev(ctx
);
914 dev_dbg(dev
, "%s %s queue setup: num_buffers %d\n", ctx
->name
,
915 to_type_str(vq
->type
), *num_buffers
);
917 size
= vq
->type
== V4L2_BUF_TYPE_VIDEO_OUTPUT
?
918 ctx
->frameinfo
.size
: ctx
->max_stream_size
;
921 return sizes
[0] < size
? -EINVAL
: 0;
923 /* only one plane supported */
930 static int hva_buf_prepare(struct vb2_buffer
*vb
)
932 struct hva_ctx
*ctx
= vb2_get_drv_priv(vb
->vb2_queue
);
933 struct device
*dev
= ctx_to_dev(ctx
);
934 struct vb2_v4l2_buffer
*vbuf
= to_vb2_v4l2_buffer(vb
);
936 if (vb
->vb2_queue
->type
== V4L2_BUF_TYPE_VIDEO_OUTPUT
) {
937 struct hva_frame
*frame
= to_hva_frame(vbuf
);
939 if (vbuf
->field
== V4L2_FIELD_ANY
)
940 vbuf
->field
= V4L2_FIELD_NONE
;
941 if (vbuf
->field
!= V4L2_FIELD_NONE
) {
943 "%s frame[%d] prepare: %d field not supported\n",
944 ctx
->name
, vb
->index
, vbuf
->field
);
948 if (!frame
->prepared
) {
949 /* get memory addresses */
950 frame
->vaddr
= vb2_plane_vaddr(&vbuf
->vb2_buf
, 0);
951 frame
->paddr
= vb2_dma_contig_plane_dma_addr(
953 frame
->info
= ctx
->frameinfo
;
954 frame
->prepared
= true;
957 "%s frame[%d] prepared; virt=%p, phy=%pad\n",
958 ctx
->name
, vb
->index
,
959 frame
->vaddr
, &frame
->paddr
);
962 struct hva_stream
*stream
= to_hva_stream(vbuf
);
964 if (!stream
->prepared
) {
965 /* get memory addresses */
966 stream
->vaddr
= vb2_plane_vaddr(&vbuf
->vb2_buf
, 0);
967 stream
->paddr
= vb2_dma_contig_plane_dma_addr(
969 stream
->size
= vb2_plane_size(&vbuf
->vb2_buf
, 0);
970 stream
->prepared
= true;
973 "%s stream[%d] prepared; virt=%p, phy=%pad\n",
974 ctx
->name
, vb
->index
,
975 stream
->vaddr
, &stream
->paddr
);
982 static void hva_buf_queue(struct vb2_buffer
*vb
)
984 struct hva_ctx
*ctx
= vb2_get_drv_priv(vb
->vb2_queue
);
985 struct vb2_v4l2_buffer
*vbuf
= to_vb2_v4l2_buffer(vb
);
988 v4l2_m2m_buf_queue(ctx
->fh
.m2m_ctx
, vbuf
);
991 static int hva_start_streaming(struct vb2_queue
*vq
, unsigned int count
)
993 struct hva_ctx
*ctx
= vb2_get_drv_priv(vq
);
994 struct hva_dev
*hva
= ctx_to_hdev(ctx
);
995 struct device
*dev
= ctx_to_dev(ctx
);
996 struct vb2_v4l2_buffer
*vbuf
;
1001 dev_dbg(dev
, "%s %s start streaming\n", ctx
->name
,
1002 to_type_str(vq
->type
));
1004 /* open encoder when both start_streaming have been called */
1005 if (V4L2_TYPE_IS_OUTPUT(vq
->type
)) {
1006 if (!vb2_start_streaming_called(&ctx
->fh
.m2m_ctx
->cap_q_ctx
.q
))
1009 if (!vb2_start_streaming_called(&ctx
->fh
.m2m_ctx
->out_q_ctx
.q
))
1013 /* store the instance context in the instances array */
1014 for (i
= 0; i
< HVA_MAX_INSTANCES
; i
++) {
1015 if (!hva
->instances
[i
]) {
1016 hva
->instances
[i
] = ctx
;
1017 /* save the context identifier in the context */
1025 dev_err(dev
, "%s maximum instances reached\n", ctx
->name
);
1030 hva
->nb_of_instances
++;
1033 ret
= hva_open_encoder(ctx
,
1034 ctx
->streaminfo
.streamformat
,
1035 ctx
->frameinfo
.pixelformat
,
1044 hva
->instances
[ctx
->id
] = NULL
;
1045 hva
->nb_of_instances
--;
1047 if (vq
->type
== V4L2_BUF_TYPE_VIDEO_OUTPUT
) {
1048 /* return of all pending buffers to vb2 (in queued state) */
1049 while ((vbuf
= v4l2_m2m_src_buf_remove(ctx
->fh
.m2m_ctx
)))
1050 v4l2_m2m_buf_done(vbuf
, VB2_BUF_STATE_QUEUED
);
1052 /* return of all pending buffers to vb2 (in queued state) */
1053 while ((vbuf
= v4l2_m2m_dst_buf_remove(ctx
->fh
.m2m_ctx
)))
1054 v4l2_m2m_buf_done(vbuf
, VB2_BUF_STATE_QUEUED
);
1062 static void hva_stop_streaming(struct vb2_queue
*vq
)
1064 struct hva_ctx
*ctx
= vb2_get_drv_priv(vq
);
1065 struct hva_dev
*hva
= ctx_to_hdev(ctx
);
1066 struct device
*dev
= ctx_to_dev(ctx
);
1067 const struct hva_enc
*enc
= ctx
->enc
;
1068 struct vb2_v4l2_buffer
*vbuf
;
1070 dev_dbg(dev
, "%s %s stop streaming\n", ctx
->name
,
1071 to_type_str(vq
->type
));
1073 if (vq
->type
== V4L2_BUF_TYPE_VIDEO_OUTPUT
) {
1074 /* return of all pending buffers to vb2 (in error state) */
1076 while ((vbuf
= v4l2_m2m_src_buf_remove(ctx
->fh
.m2m_ctx
)))
1077 v4l2_m2m_buf_done(vbuf
, VB2_BUF_STATE_ERROR
);
1079 /* return of all pending buffers to vb2 (in error state) */
1080 ctx
->stream_num
= 0;
1081 while ((vbuf
= v4l2_m2m_dst_buf_remove(ctx
->fh
.m2m_ctx
)))
1082 v4l2_m2m_buf_done(vbuf
, VB2_BUF_STATE_ERROR
);
1085 if ((V4L2_TYPE_IS_OUTPUT(vq
->type
) &&
1086 vb2_is_streaming(&ctx
->fh
.m2m_ctx
->cap_q_ctx
.q
)) ||
1087 (!V4L2_TYPE_IS_OUTPUT(vq
->type
) &&
1088 vb2_is_streaming(&ctx
->fh
.m2m_ctx
->out_q_ctx
.q
))) {
1089 dev_dbg(dev
, "%s %s out=%d cap=%d\n",
1090 ctx
->name
, to_type_str(vq
->type
),
1091 vb2_is_streaming(&ctx
->fh
.m2m_ctx
->out_q_ctx
.q
),
1092 vb2_is_streaming(&ctx
->fh
.m2m_ctx
->cap_q_ctx
.q
));
1096 /* close encoder when both stop_streaming have been called */
1098 dev_dbg(dev
, "%s %s encoder closed\n", ctx
->name
, enc
->name
);
1102 /* clear instance context in instances array */
1103 hva
->instances
[ctx
->id
] = NULL
;
1104 hva
->nb_of_instances
--;
1107 ctx
->aborting
= false;
1111 static const struct vb2_ops hva_qops
= {
1112 .queue_setup
= hva_queue_setup
,
1113 .buf_prepare
= hva_buf_prepare
,
1114 .buf_queue
= hva_buf_queue
,
1115 .start_streaming
= hva_start_streaming
,
1116 .stop_streaming
= hva_stop_streaming
,
1117 .wait_prepare
= vb2_ops_wait_prepare
,
1118 .wait_finish
= vb2_ops_wait_finish
,
1122 * V4L2 file operations
1125 static int queue_init(struct hva_ctx
*ctx
, struct vb2_queue
*vq
)
1127 vq
->io_modes
= VB2_MMAP
| VB2_DMABUF
;
1129 vq
->ops
= &hva_qops
;
1130 vq
->mem_ops
= &vb2_dma_contig_memops
;
1131 vq
->timestamp_flags
= V4L2_BUF_FLAG_TIMESTAMP_COPY
;
1132 vq
->lock
= &ctx
->hva_dev
->lock
;
1134 return vb2_queue_init(vq
);
1137 static int hva_queue_init(void *priv
, struct vb2_queue
*src_vq
,
1138 struct vb2_queue
*dst_vq
)
1140 struct hva_ctx
*ctx
= priv
;
1143 src_vq
->type
= V4L2_BUF_TYPE_VIDEO_OUTPUT
;
1144 src_vq
->buf_struct_size
= sizeof(struct hva_frame
);
1145 src_vq
->min_buffers_needed
= MIN_FRAMES
;
1146 src_vq
->dev
= ctx
->hva_dev
->dev
;
1148 ret
= queue_init(ctx
, src_vq
);
1152 dst_vq
->type
= V4L2_BUF_TYPE_VIDEO_CAPTURE
;
1153 dst_vq
->buf_struct_size
= sizeof(struct hva_stream
);
1154 dst_vq
->min_buffers_needed
= MIN_STREAMS
;
1155 dst_vq
->dev
= ctx
->hva_dev
->dev
;
1157 return queue_init(ctx
, dst_vq
);
1160 static int hva_open(struct file
*file
)
1162 struct hva_dev
*hva
= video_drvdata(file
);
1163 struct device
*dev
= hva_to_dev(hva
);
1164 struct hva_ctx
*ctx
;
1167 ctx
= kzalloc(sizeof(*ctx
), GFP_KERNEL
);
1174 INIT_WORK(&ctx
->run_work
, hva_run_work
);
1175 v4l2_fh_init(&ctx
->fh
, video_devdata(file
));
1176 file
->private_data
= &ctx
->fh
;
1177 v4l2_fh_add(&ctx
->fh
);
1179 ret
= hva_ctrls_setup(ctx
);
1181 dev_err(dev
, "%s [x:x] failed to setup controls\n",
1186 ctx
->fh
.ctrl_handler
= &ctx
->ctrl_handler
;
1188 mutex_init(&ctx
->lock
);
1190 ctx
->fh
.m2m_ctx
= v4l2_m2m_ctx_init(hva
->m2m_dev
, ctx
,
1192 if (IS_ERR(ctx
->fh
.m2m_ctx
)) {
1193 ret
= PTR_ERR(ctx
->fh
.m2m_ctx
);
1194 dev_err(dev
, "%s failed to initialize m2m context (%d)\n",
1200 /* set the instance name */
1201 mutex_lock(&hva
->lock
);
1203 snprintf(ctx
->name
, sizeof(ctx
->name
), "[%3d:----]",
1205 mutex_unlock(&hva
->lock
);
1207 /* default parameters for frame and stream */
1208 set_default_params(ctx
);
1210 #ifdef CONFIG_VIDEO_STI_HVA_DEBUGFS
1211 hva_dbg_ctx_create(ctx
);
1214 dev_info(dev
, "%s encoder instance created\n", ctx
->name
);
1219 v4l2_ctrl_handler_free(&ctx
->ctrl_handler
);
1221 v4l2_fh_del(&ctx
->fh
);
1222 v4l2_fh_exit(&ctx
->fh
);
1228 static int hva_release(struct file
*file
)
1230 struct hva_ctx
*ctx
= fh_to_ctx(file
->private_data
);
1231 struct hva_dev
*hva
= ctx_to_hdev(ctx
);
1232 struct device
*dev
= ctx_to_dev(ctx
);
1233 const struct hva_enc
*enc
= ctx
->enc
;
1236 dev_dbg(dev
, "%s %s encoder closed\n", ctx
->name
, enc
->name
);
1240 /* clear instance context in instances array */
1241 hva
->instances
[ctx
->id
] = NULL
;
1242 hva
->nb_of_instances
--;
1245 /* trace a summary of instance before closing (debug purpose) */
1246 hva_dbg_summary(ctx
);
1248 v4l2_m2m_ctx_release(ctx
->fh
.m2m_ctx
);
1250 v4l2_ctrl_handler_free(&ctx
->ctrl_handler
);
1252 v4l2_fh_del(&ctx
->fh
);
1253 v4l2_fh_exit(&ctx
->fh
);
1255 #ifdef CONFIG_VIDEO_STI_HVA_DEBUGFS
1256 hva_dbg_ctx_remove(ctx
);
1259 dev_info(dev
, "%s encoder instance released\n", ctx
->name
);
1267 static const struct v4l2_file_operations hva_fops
= {
1268 .owner
= THIS_MODULE
,
1270 .release
= hva_release
,
1271 .unlocked_ioctl
= video_ioctl2
,
1272 .mmap
= v4l2_m2m_fop_mmap
,
1273 .poll
= v4l2_m2m_fop_poll
,
1277 * Platform device operations
1280 static int hva_register_device(struct hva_dev
*hva
)
1283 struct video_device
*vdev
;
1288 dev
= hva_to_dev(hva
);
1290 hva
->m2m_dev
= v4l2_m2m_init(&hva_m2m_ops
);
1291 if (IS_ERR(hva
->m2m_dev
)) {
1292 dev_err(dev
, "%s failed to initialize v4l2-m2m device\n",
1294 ret
= PTR_ERR(hva
->m2m_dev
);
1298 vdev
= video_device_alloc();
1300 dev_err(dev
, "%s failed to allocate video device\n",
1303 goto err_m2m_release
;
1306 vdev
->fops
= &hva_fops
;
1307 vdev
->ioctl_ops
= &hva_ioctl_ops
;
1308 vdev
->release
= video_device_release
;
1309 vdev
->lock
= &hva
->lock
;
1310 vdev
->vfl_dir
= VFL_DIR_M2M
;
1311 vdev
->device_caps
= V4L2_CAP_STREAMING
| V4L2_CAP_VIDEO_M2M
;
1312 vdev
->v4l2_dev
= &hva
->v4l2_dev
;
1313 snprintf(vdev
->name
, sizeof(vdev
->name
), "%s%lx", HVA_NAME
,
1316 ret
= video_register_device(vdev
, VFL_TYPE_GRABBER
, -1);
1318 dev_err(dev
, "%s failed to register video device\n",
1320 goto err_vdev_release
;
1324 video_set_drvdata(vdev
, hva
);
1328 video_device_release(vdev
);
1330 v4l2_m2m_release(hva
->m2m_dev
);
1335 static void hva_unregister_device(struct hva_dev
*hva
)
1341 v4l2_m2m_release(hva
->m2m_dev
);
1343 video_unregister_device(hva
->vdev
);
1346 static int hva_probe(struct platform_device
*pdev
)
1348 struct hva_dev
*hva
;
1349 struct device
*dev
= &pdev
->dev
;
1352 hva
= devm_kzalloc(dev
, sizeof(*hva
), GFP_KERNEL
);
1360 platform_set_drvdata(pdev
, hva
);
1362 mutex_init(&hva
->lock
);
1364 /* probe hardware */
1365 ret
= hva_hw_probe(pdev
, hva
);
1369 /* register all available encoders */
1370 register_encoders(hva
);
1372 /* register all supported formats */
1373 register_formats(hva
);
1375 /* register on V4L2 */
1376 ret
= v4l2_device_register(dev
, &hva
->v4l2_dev
);
1378 dev_err(dev
, "%s %s failed to register V4L2 device\n",
1379 HVA_PREFIX
, HVA_NAME
);
1383 #ifdef CONFIG_VIDEO_STI_HVA_DEBUGFS
1384 hva_debugfs_create(hva
);
1387 hva
->work_queue
= create_workqueue(HVA_NAME
);
1388 if (!hva
->work_queue
) {
1389 dev_err(dev
, "%s %s failed to allocate work queue\n",
1390 HVA_PREFIX
, HVA_NAME
);
1395 /* register device */
1396 ret
= hva_register_device(hva
);
1398 goto err_work_queue
;
1400 dev_info(dev
, "%s %s registered as /dev/video%d\n", HVA_PREFIX
,
1401 HVA_NAME
, hva
->vdev
->num
);
1406 destroy_workqueue(hva
->work_queue
);
1408 #ifdef CONFIG_VIDEO_STI_HVA_DEBUGFS
1409 hva_debugfs_remove(hva
);
1411 v4l2_device_unregister(&hva
->v4l2_dev
);
1418 static int hva_remove(struct platform_device
*pdev
)
1420 struct hva_dev
*hva
= platform_get_drvdata(pdev
);
1421 struct device
*dev
= hva_to_dev(hva
);
1423 hva_unregister_device(hva
);
1425 destroy_workqueue(hva
->work_queue
);
1429 #ifdef CONFIG_VIDEO_STI_HVA_DEBUGFS
1430 hva_debugfs_remove(hva
);
1433 v4l2_device_unregister(&hva
->v4l2_dev
);
1435 dev_info(dev
, "%s %s removed\n", HVA_PREFIX
, pdev
->name
);
1441 static const struct dev_pm_ops hva_pm_ops
= {
1442 .runtime_suspend
= hva_hw_runtime_suspend
,
1443 .runtime_resume
= hva_hw_runtime_resume
,
1446 static const struct of_device_id hva_match_types
[] = {
1448 .compatible
= "st,st-hva",
1453 MODULE_DEVICE_TABLE(of
, hva_match_types
);
1455 static struct platform_driver hva_driver
= {
1457 .remove
= hva_remove
,
1460 .of_match_table
= hva_match_types
,
1465 module_platform_driver(hva_driver
);
1467 MODULE_LICENSE("GPL");
1468 MODULE_AUTHOR("Yannick Fertre <yannick.fertre@st.com>");
1469 MODULE_DESCRIPTION("STMicroelectronics HVA video encoder V4L2 driver");