mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-05 03:44:03 +08:00
Merge branch 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media
Pull media fixes from Mauro Carvalho Chehab: "Some driver fixes (em28xx, coda, usbtv, s5p, hdpvr and ml86v7667) and a fix for media DocBook" * 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media: [media] em28xx: fix assignment of the eeprom data [media] hdpvr: fix iteration over uninitialized lists in hdpvr_probe() [media] usbtv: fix dependency [media] usbtv: Throw corrupted frames away [media] usbtv: Fix deinterlacing [media] v4l2: added missing mutex.h include to v4l2-ctrls.h [media] DocBook: upgrade media_api DocBook version to 4.2 [media] ml86v7667: fix compile warning: 'ret' set but not used [media] s5p-g2d: Fix registration failure [media] media: coda: Fix DT driver data pointer for i.MX27 [media] s5p-mfc: Fix input/output format reporting
This commit is contained in:
commit
79a6fb1ace
@ -1,6 +1,6 @@
|
||||
<?xml version="1.0"?>
|
||||
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
|
||||
"http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
|
||||
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
|
||||
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
|
||||
<!ENTITY % media-entities SYSTEM "./media-entities.tmpl"> %media-entities;
|
||||
<!ENTITY media-indices SYSTEM "./media-indices.tmpl">
|
||||
|
||||
|
@ -117,7 +117,7 @@ static int ml86v7667_s_ctrl(struct v4l2_ctrl *ctrl)
|
||||
{
|
||||
struct v4l2_subdev *sd = to_sd(ctrl);
|
||||
struct i2c_client *client = v4l2_get_subdevdata(sd);
|
||||
int ret;
|
||||
int ret = -EINVAL;
|
||||
|
||||
switch (ctrl->id) {
|
||||
case V4L2_CID_BRIGHTNESS:
|
||||
@ -157,7 +157,7 @@ static int ml86v7667_s_ctrl(struct v4l2_ctrl *ctrl)
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int ml86v7667_querystd(struct v4l2_subdev *sd, v4l2_std_id *std)
|
||||
|
@ -1987,7 +1987,7 @@ MODULE_DEVICE_TABLE(platform, coda_platform_ids);
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
static const struct of_device_id coda_dt_ids[] = {
|
||||
{ .compatible = "fsl,imx27-vpu", .data = &coda_platform_ids[CODA_IMX27] },
|
||||
{ .compatible = "fsl,imx27-vpu", .data = &coda_devdata[CODA_IMX27] },
|
||||
{ .compatible = "fsl,imx53-vpu", .data = &coda_devdata[CODA_IMX53] },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
|
@ -784,6 +784,7 @@ static int g2d_probe(struct platform_device *pdev)
|
||||
}
|
||||
*vfd = g2d_videodev;
|
||||
vfd->lock = &dev->mutex;
|
||||
vfd->v4l2_dev = &dev->v4l2_dev;
|
||||
ret = video_register_device(vfd, VFL_TYPE_GRABBER, 0);
|
||||
if (ret) {
|
||||
v4l2_err(&dev->v4l2_dev, "Failed to register video device\n");
|
||||
|
@ -344,7 +344,7 @@ static int vidioc_g_fmt(struct file *file, void *priv, struct v4l2_format *f)
|
||||
pix_mp->num_planes = 2;
|
||||
/* Set pixelformat to the format in which MFC
|
||||
outputs the decoded frame */
|
||||
pix_mp->pixelformat = V4L2_PIX_FMT_NV12MT;
|
||||
pix_mp->pixelformat = ctx->dst_fmt->fourcc;
|
||||
pix_mp->plane_fmt[0].bytesperline = ctx->buf_width;
|
||||
pix_mp->plane_fmt[0].sizeimage = ctx->luma_size;
|
||||
pix_mp->plane_fmt[1].bytesperline = ctx->buf_width;
|
||||
@ -382,10 +382,16 @@ static int vidioc_try_fmt(struct file *file, void *priv, struct v4l2_format *f)
|
||||
mfc_err("Unsupported format for source.\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
if (!IS_MFCV6(dev) && (fmt->fourcc == V4L2_PIX_FMT_VP8)) {
|
||||
mfc_err("Not supported format.\n");
|
||||
if (fmt->codec_mode == S5P_FIMV_CODEC_NONE) {
|
||||
mfc_err("Unknown codec\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
if (!IS_MFCV6(dev)) {
|
||||
if (fmt->fourcc == V4L2_PIX_FMT_VP8) {
|
||||
mfc_err("Not supported format.\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
} else if (f->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) {
|
||||
fmt = find_format(f, MFC_FMT_RAW);
|
||||
if (!fmt) {
|
||||
@ -411,7 +417,6 @@ static int vidioc_s_fmt(struct file *file, void *priv, struct v4l2_format *f)
|
||||
struct s5p_mfc_dev *dev = video_drvdata(file);
|
||||
struct s5p_mfc_ctx *ctx = fh_to_ctx(priv);
|
||||
int ret = 0;
|
||||
struct s5p_mfc_fmt *fmt;
|
||||
struct v4l2_pix_format_mplane *pix_mp;
|
||||
|
||||
mfc_debug_enter();
|
||||
@ -425,54 +430,32 @@ static int vidioc_s_fmt(struct file *file, void *priv, struct v4l2_format *f)
|
||||
goto out;
|
||||
}
|
||||
if (f->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) {
|
||||
fmt = find_format(f, MFC_FMT_RAW);
|
||||
if (!fmt) {
|
||||
mfc_err("Unsupported format for source.\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
if (!IS_MFCV6(dev) && (fmt->fourcc != V4L2_PIX_FMT_NV12MT)) {
|
||||
mfc_err("Not supported format.\n");
|
||||
return -EINVAL;
|
||||
} else if (IS_MFCV6(dev) &&
|
||||
(fmt->fourcc == V4L2_PIX_FMT_NV12MT)) {
|
||||
mfc_err("Not supported format.\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
ctx->dst_fmt = fmt;
|
||||
mfc_debug_leave();
|
||||
return ret;
|
||||
} else if (f->type != V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
|
||||
mfc_err("Wrong type error for S_FMT : %d", f->type);
|
||||
return -EINVAL;
|
||||
}
|
||||
fmt = find_format(f, MFC_FMT_DEC);
|
||||
if (!fmt || fmt->codec_mode == S5P_MFC_CODEC_NONE) {
|
||||
mfc_err("Unknown codec\n");
|
||||
ret = -EINVAL;
|
||||
/* dst_fmt is validated by call to vidioc_try_fmt */
|
||||
ctx->dst_fmt = find_format(f, MFC_FMT_RAW);
|
||||
ret = 0;
|
||||
goto out;
|
||||
}
|
||||
if (fmt->type != MFC_FMT_DEC) {
|
||||
mfc_err("Wrong format selected, you should choose "
|
||||
"format for decoding\n");
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
if (!IS_MFCV6(dev) && (fmt->fourcc == V4L2_PIX_FMT_VP8)) {
|
||||
mfc_err("Not supported format.\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
ctx->src_fmt = fmt;
|
||||
ctx->codec_mode = fmt->codec_mode;
|
||||
mfc_debug(2, "The codec number is: %d\n", ctx->codec_mode);
|
||||
pix_mp->height = 0;
|
||||
pix_mp->width = 0;
|
||||
if (pix_mp->plane_fmt[0].sizeimage)
|
||||
ctx->dec_src_buf_size = pix_mp->plane_fmt[0].sizeimage;
|
||||
else
|
||||
pix_mp->plane_fmt[0].sizeimage = ctx->dec_src_buf_size =
|
||||
} else if (f->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
|
||||
/* src_fmt is validated by call to vidioc_try_fmt */
|
||||
ctx->src_fmt = find_format(f, MFC_FMT_DEC);
|
||||
ctx->codec_mode = ctx->src_fmt->codec_mode;
|
||||
mfc_debug(2, "The codec number is: %d\n", ctx->codec_mode);
|
||||
pix_mp->height = 0;
|
||||
pix_mp->width = 0;
|
||||
if (pix_mp->plane_fmt[0].sizeimage)
|
||||
ctx->dec_src_buf_size = pix_mp->plane_fmt[0].sizeimage;
|
||||
else
|
||||
pix_mp->plane_fmt[0].sizeimage = ctx->dec_src_buf_size =
|
||||
DEF_CPB_SIZE;
|
||||
pix_mp->plane_fmt[0].bytesperline = 0;
|
||||
ctx->state = MFCINST_INIT;
|
||||
pix_mp->plane_fmt[0].bytesperline = 0;
|
||||
ctx->state = MFCINST_INIT;
|
||||
ret = 0;
|
||||
goto out;
|
||||
} else {
|
||||
mfc_err("Wrong type error for S_FMT : %d", f->type);
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
out:
|
||||
mfc_debug_leave();
|
||||
return ret;
|
||||
|
@ -906,6 +906,7 @@ static int vidioc_g_fmt(struct file *file, void *priv, struct v4l2_format *f)
|
||||
|
||||
static int vidioc_try_fmt(struct file *file, void *priv, struct v4l2_format *f)
|
||||
{
|
||||
struct s5p_mfc_dev *dev = video_drvdata(file);
|
||||
struct s5p_mfc_fmt *fmt;
|
||||
struct v4l2_pix_format_mplane *pix_fmt_mp = &f->fmt.pix_mp;
|
||||
|
||||
@ -930,6 +931,18 @@ static int vidioc_try_fmt(struct file *file, void *priv, struct v4l2_format *f)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (!IS_MFCV6(dev)) {
|
||||
if (fmt->fourcc == V4L2_PIX_FMT_NV12MT_16X16) {
|
||||
mfc_err("Not supported format.\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
} else if (IS_MFCV6(dev)) {
|
||||
if (fmt->fourcc == V4L2_PIX_FMT_NV12MT) {
|
||||
mfc_err("Not supported format.\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
if (fmt->num_planes != pix_fmt_mp->num_planes) {
|
||||
mfc_err("failed to try output format\n");
|
||||
return -EINVAL;
|
||||
@ -947,7 +960,6 @@ static int vidioc_s_fmt(struct file *file, void *priv, struct v4l2_format *f)
|
||||
{
|
||||
struct s5p_mfc_dev *dev = video_drvdata(file);
|
||||
struct s5p_mfc_ctx *ctx = fh_to_ctx(priv);
|
||||
struct s5p_mfc_fmt *fmt;
|
||||
struct v4l2_pix_format_mplane *pix_fmt_mp = &f->fmt.pix_mp;
|
||||
int ret = 0;
|
||||
|
||||
@ -960,13 +972,9 @@ static int vidioc_s_fmt(struct file *file, void *priv, struct v4l2_format *f)
|
||||
goto out;
|
||||
}
|
||||
if (f->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) {
|
||||
fmt = find_format(f, MFC_FMT_ENC);
|
||||
if (!fmt) {
|
||||
mfc_err("failed to set capture format\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
/* dst_fmt is validated by call to vidioc_try_fmt */
|
||||
ctx->dst_fmt = find_format(f, MFC_FMT_ENC);
|
||||
ctx->state = MFCINST_INIT;
|
||||
ctx->dst_fmt = fmt;
|
||||
ctx->codec_mode = ctx->dst_fmt->codec_mode;
|
||||
ctx->enc_dst_buf_size = pix_fmt_mp->plane_fmt[0].sizeimage;
|
||||
pix_fmt_mp->plane_fmt[0].bytesperline = 0;
|
||||
@ -987,28 +995,8 @@ static int vidioc_s_fmt(struct file *file, void *priv, struct v4l2_format *f)
|
||||
}
|
||||
mfc_debug(2, "Got instance number: %d\n", ctx->inst_no);
|
||||
} else if (f->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
|
||||
fmt = find_format(f, MFC_FMT_RAW);
|
||||
if (!fmt) {
|
||||
mfc_err("failed to set output format\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (!IS_MFCV6(dev) &&
|
||||
(fmt->fourcc == V4L2_PIX_FMT_NV12MT_16X16)) {
|
||||
mfc_err("Not supported format.\n");
|
||||
return -EINVAL;
|
||||
} else if (IS_MFCV6(dev) &&
|
||||
(fmt->fourcc == V4L2_PIX_FMT_NV12MT)) {
|
||||
mfc_err("Not supported format.\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (fmt->num_planes != pix_fmt_mp->num_planes) {
|
||||
mfc_err("failed to set output format\n");
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
ctx->src_fmt = fmt;
|
||||
/* src_fmt is validated by call to vidioc_try_fmt */
|
||||
ctx->src_fmt = find_format(f, MFC_FMT_RAW);
|
||||
ctx->img_width = pix_fmt_mp->width;
|
||||
ctx->img_height = pix_fmt_mp->height;
|
||||
mfc_debug(2, "codec number: %d\n", ctx->src_fmt->codec_mode);
|
||||
|
@ -726,7 +726,7 @@ static int em28xx_i2c_eeprom(struct em28xx *dev, unsigned bus,
|
||||
|
||||
*eedata = data;
|
||||
*eedata_len = len;
|
||||
dev_config = (void *)eedata;
|
||||
dev_config = (void *)*eedata;
|
||||
|
||||
switch (le16_to_cpu(dev_config->chip_conf) >> 4 & 0x3) {
|
||||
case 0:
|
||||
|
@ -303,6 +303,11 @@ static int hdpvr_probe(struct usb_interface *interface,
|
||||
|
||||
dev->workqueue = 0;
|
||||
|
||||
/* init video transfer queues first of all */
|
||||
/* to prevent oops in hdpvr_delete() on error paths */
|
||||
INIT_LIST_HEAD(&dev->free_buff_list);
|
||||
INIT_LIST_HEAD(&dev->rec_buff_list);
|
||||
|
||||
/* register v4l2_device early so it can be used for printks */
|
||||
if (v4l2_device_register(&interface->dev, &dev->v4l2_dev)) {
|
||||
dev_err(&interface->dev, "v4l2_device_register failed\n");
|
||||
@ -325,10 +330,6 @@ static int hdpvr_probe(struct usb_interface *interface,
|
||||
if (!dev->workqueue)
|
||||
goto error;
|
||||
|
||||
/* init video transfer queues */
|
||||
INIT_LIST_HEAD(&dev->free_buff_list);
|
||||
INIT_LIST_HEAD(&dev->rec_buff_list);
|
||||
|
||||
dev->options = hdpvr_default_options;
|
||||
|
||||
if (default_video_input < HDPVR_VIDEO_INPUTS)
|
||||
@ -405,7 +406,7 @@ static int hdpvr_probe(struct usb_interface *interface,
|
||||
video_nr[atomic_inc_return(&dev_nr)]);
|
||||
if (retval < 0) {
|
||||
v4l2_err(&dev->v4l2_dev, "registering videodev failed\n");
|
||||
goto error;
|
||||
goto reg_fail;
|
||||
}
|
||||
|
||||
/* let the user know what node this device is now attached to */
|
||||
|
@ -1,6 +1,6 @@
|
||||
config VIDEO_USBTV
|
||||
tristate "USBTV007 video capture support"
|
||||
depends on VIDEO_DEV
|
||||
depends on VIDEO_V4L2
|
||||
select VIDEOBUF2_VMALLOC
|
||||
|
||||
---help---
|
||||
|
@ -57,7 +57,7 @@
|
||||
#define USBTV_CHUNK_SIZE 256
|
||||
#define USBTV_CHUNK 240
|
||||
#define USBTV_CHUNKS (USBTV_WIDTH * USBTV_HEIGHT \
|
||||
/ 2 / USBTV_CHUNK)
|
||||
/ 4 / USBTV_CHUNK)
|
||||
|
||||
/* Chunk header. */
|
||||
#define USBTV_MAGIC_OK(chunk) ((be32_to_cpu(chunk[0]) & 0xff000000) \
|
||||
@ -89,6 +89,7 @@ struct usbtv {
|
||||
/* Number of currently processed frame, useful find
|
||||
* out when a new one begins. */
|
||||
u32 frame_id;
|
||||
int chunks_done;
|
||||
|
||||
int iso_size;
|
||||
unsigned int sequence;
|
||||
@ -202,6 +203,26 @@ static int usbtv_setup_capture(struct usbtv *usbtv)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Copy data from chunk into a frame buffer, deinterlacing the data
|
||||
* into every second line. Unfortunately, they don't align nicely into
|
||||
* 720 pixel lines, as the chunk is 240 words long, which is 480 pixels.
|
||||
* Therefore, we break down the chunk into two halves before copyting,
|
||||
* so that we can interleave a line if needed. */
|
||||
static void usbtv_chunk_to_vbuf(u32 *frame, u32 *src, int chunk_no, int odd)
|
||||
{
|
||||
int half;
|
||||
|
||||
for (half = 0; half < 2; half++) {
|
||||
int part_no = chunk_no * 2 + half;
|
||||
int line = part_no / 3;
|
||||
int part_index = (line * 2 + !odd) * 3 + (part_no % 3);
|
||||
|
||||
u32 *dst = &frame[part_index * USBTV_CHUNK/2];
|
||||
memcpy(dst, src, USBTV_CHUNK/2 * sizeof(*src));
|
||||
src += USBTV_CHUNK/2;
|
||||
}
|
||||
}
|
||||
|
||||
/* Called for each 256-byte image chunk.
|
||||
* First word identifies the chunk, followed by 240 words of image
|
||||
* data and padding. */
|
||||
@ -218,17 +239,17 @@ static void usbtv_image_chunk(struct usbtv *usbtv, u32 *chunk)
|
||||
frame_id = USBTV_FRAME_ID(chunk);
|
||||
odd = USBTV_ODD(chunk);
|
||||
chunk_no = USBTV_CHUNK_NO(chunk);
|
||||
|
||||
/* Deinterlace. TODO: Use interlaced frame format. */
|
||||
chunk_no = (chunk_no - chunk_no % 3) * 2 + chunk_no % 3;
|
||||
chunk_no += !odd * 3;
|
||||
|
||||
if (chunk_no >= USBTV_CHUNKS)
|
||||
return;
|
||||
|
||||
/* Beginning of a frame. */
|
||||
if (chunk_no == 0)
|
||||
if (chunk_no == 0) {
|
||||
usbtv->frame_id = frame_id;
|
||||
usbtv->chunks_done = 0;
|
||||
}
|
||||
|
||||
if (usbtv->frame_id != frame_id)
|
||||
return;
|
||||
|
||||
spin_lock_irqsave(&usbtv->buflock, flags);
|
||||
if (list_empty(&usbtv->bufs)) {
|
||||
@ -241,19 +262,23 @@ static void usbtv_image_chunk(struct usbtv *usbtv, u32 *chunk)
|
||||
buf = list_first_entry(&usbtv->bufs, struct usbtv_buf, list);
|
||||
frame = vb2_plane_vaddr(&buf->vb, 0);
|
||||
|
||||
/* Copy the chunk. */
|
||||
memcpy(&frame[chunk_no * USBTV_CHUNK], &chunk[1],
|
||||
USBTV_CHUNK * sizeof(chunk[1]));
|
||||
/* Copy the chunk data. */
|
||||
usbtv_chunk_to_vbuf(frame, &chunk[1], chunk_no, odd);
|
||||
usbtv->chunks_done++;
|
||||
|
||||
/* Last chunk in a frame, signalling an end */
|
||||
if (usbtv->frame_id && chunk_no == USBTV_CHUNKS-1) {
|
||||
if (odd && chunk_no == USBTV_CHUNKS-1) {
|
||||
int size = vb2_plane_size(&buf->vb, 0);
|
||||
enum vb2_buffer_state state = usbtv->chunks_done ==
|
||||
USBTV_CHUNKS ?
|
||||
VB2_BUF_STATE_DONE :
|
||||
VB2_BUF_STATE_ERROR;
|
||||
|
||||
buf->vb.v4l2_buf.field = V4L2_FIELD_INTERLACED;
|
||||
buf->vb.v4l2_buf.sequence = usbtv->sequence++;
|
||||
v4l2_get_timestamp(&buf->vb.v4l2_buf.timestamp);
|
||||
vb2_set_plane_payload(&buf->vb, 0, size);
|
||||
vb2_buffer_done(&buf->vb, VB2_BUF_STATE_DONE);
|
||||
vb2_buffer_done(&buf->vb, state);
|
||||
list_del(&buf->list);
|
||||
}
|
||||
|
||||
@ -518,7 +543,7 @@ static int usbtv_queue_setup(struct vb2_queue *vq,
|
||||
if (*nbuffers < 2)
|
||||
*nbuffers = 2;
|
||||
*nplanes = 1;
|
||||
sizes[0] = USBTV_CHUNK * USBTV_CHUNKS * sizeof(u32);
|
||||
sizes[0] = USBTV_WIDTH * USBTV_HEIGHT / 2 * sizeof(u32);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -22,6 +22,7 @@
|
||||
#define _V4L2_CTRLS_H
|
||||
|
||||
#include <linux/list.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/videodev2.h>
|
||||
|
||||
/* forward references */
|
||||
|
Loading…
Reference in New Issue
Block a user