Merge branch 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media
* 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media: [media] v4l2-ctrl: Send change events to all fh for auto cluster slave controls [media] v4l2-event: Don't set sev->fh to NULL on unsubscribe [media] v4l2-event: Remove pending events from fh event queue when unsubscribing [media] v4l2-event: Deny subscribing with a type of V4L2_EVENT_ALL [media] MAINTAINERS: add a maintainer for s5p-mfc driver [media] v4l: s5p-mfc: fix reported capabilities [media] media: vb2: reset queued list on REQBUFS(0) call [media] media: vb2: set buffer length correctly for all buffer types [media] media: vb2: add a check for uninitialized buffer [media] mxl111sf: fix build warning [media] mxl111sf: remove pointless if condition in mxl111sf_config_spi [media] mxl111sf: check for errors after mxl111sf_write_reg in mxl111sf_idac_config [media] mxl111sf: fix return value of mxl111sf_idac_config [media] uvcvideo: GET_RES should only be checked for BITMAP type menu controls
This commit is contained in:
commit
e6f1227e8b
9 changed files with 30 additions and 16 deletions
|
@ -1106,6 +1106,7 @@ F: drivers/media/video/s5p-fimc/
|
|||
ARM/SAMSUNG S5P SERIES Multi Format Codec (MFC) SUPPORT
|
||||
M: Kyungmin Park <kyungmin.park@samsung.com>
|
||||
M: Kamil Debski <k.debski@samsung.com>
|
||||
M: Jeongtae Park <jtp.park@samsung.com>
|
||||
L: linux-arm-kernel@lists.infradead.org
|
||||
L: linux-media@vger.kernel.org
|
||||
S: Maintained
|
||||
|
|
|
@ -398,7 +398,6 @@ static int mxl111sf_i2c_readagain(struct mxl111sf_state *state,
|
|||
u8 i2c_r_data[24];
|
||||
u8 i = 0;
|
||||
u8 fifo_status = 0;
|
||||
int ret;
|
||||
int status = 0;
|
||||
|
||||
mxl_i2c("read %d bytes", count);
|
||||
|
@ -418,7 +417,7 @@ static int mxl111sf_i2c_readagain(struct mxl111sf_state *state,
|
|||
i2c_w_data[4+(i*3)] = 0x00;
|
||||
}
|
||||
|
||||
ret = mxl111sf_i2c_get_data(state, 0, i2c_w_data, i2c_r_data);
|
||||
mxl111sf_i2c_get_data(state, 0, i2c_w_data, i2c_r_data);
|
||||
|
||||
/* Check for I2C NACK status */
|
||||
if (mxl111sf_i2c_check_status(state) == 1) {
|
||||
|
|
|
@ -296,8 +296,7 @@ int mxl111sf_config_spi(struct mxl111sf_state *state, int onoff)
|
|||
goto fail;
|
||||
|
||||
ret = mxl111sf_write_reg(state, 0x00, 0x00);
|
||||
if (mxl_fail(ret))
|
||||
goto fail;
|
||||
mxl_fail(ret);
|
||||
fail:
|
||||
return ret;
|
||||
}
|
||||
|
@ -328,11 +327,13 @@ int mxl111sf_idac_config(struct mxl111sf_state *state,
|
|||
/* set hysteresis value reg: 0x0B<5:0> */
|
||||
ret = mxl111sf_write_reg(state, V6_IDAC_HYSTERESIS_REG,
|
||||
(hysteresis_value & 0x3F));
|
||||
mxl_fail(ret);
|
||||
}
|
||||
|
||||
ret = mxl111sf_write_reg(state, V6_IDAC_SETTINGS_REG, val);
|
||||
mxl_fail(ret);
|
||||
|
||||
return val;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -220,8 +220,8 @@ static int vidioc_querycap(struct file *file, void *priv,
|
|||
strncpy(cap->card, dev->plat_dev->name, sizeof(cap->card) - 1);
|
||||
cap->bus_info[0] = 0;
|
||||
cap->version = KERNEL_VERSION(1, 0, 0);
|
||||
cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_VIDEO_OUTPUT
|
||||
| V4L2_CAP_STREAMING;
|
||||
cap->capabilities = V4L2_CAP_VIDEO_CAPTURE_MPLANE |
|
||||
V4L2_CAP_VIDEO_OUTPUT_MPLANE | V4L2_CAP_STREAMING;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -785,8 +785,8 @@ static int vidioc_querycap(struct file *file, void *priv,
|
|||
strncpy(cap->card, dev->plat_dev->name, sizeof(cap->card) - 1);
|
||||
cap->bus_info[0] = 0;
|
||||
cap->version = KERNEL_VERSION(1, 0, 0);
|
||||
cap->capabilities = V4L2_CAP_VIDEO_CAPTURE
|
||||
| V4L2_CAP_VIDEO_OUTPUT
|
||||
cap->capabilities = V4L2_CAP_VIDEO_CAPTURE_MPLANE
|
||||
| V4L2_CAP_VIDEO_OUTPUT_MPLANE
|
||||
| V4L2_CAP_STREAMING;
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -1016,7 +1016,8 @@ int uvc_query_v4l2_menu(struct uvc_video_chain *chain,
|
|||
|
||||
menu_info = &mapping->menu_info[query_menu->index];
|
||||
|
||||
if (ctrl->info.flags & UVC_CTRL_FLAG_GET_RES) {
|
||||
if (mapping->data_type == UVC_CTRL_DATA_TYPE_BITMASK &&
|
||||
(ctrl->info.flags & UVC_CTRL_FLAG_GET_RES)) {
|
||||
s32 bitmap;
|
||||
|
||||
if (!ctrl->cached) {
|
||||
|
@ -1225,7 +1226,8 @@ int uvc_ctrl_set(struct uvc_video_chain *chain,
|
|||
/* Valid menu indices are reported by the GET_RES request for
|
||||
* UVC controls that support it.
|
||||
*/
|
||||
if (ctrl->info.flags & UVC_CTRL_FLAG_GET_RES) {
|
||||
if (mapping->data_type == UVC_CTRL_DATA_TYPE_BITMASK &&
|
||||
(ctrl->info.flags & UVC_CTRL_FLAG_GET_RES)) {
|
||||
if (!ctrl->cached) {
|
||||
ret = uvc_ctrl_populate_cache(chain, ctrl);
|
||||
if (ret < 0)
|
||||
|
|
|
@ -821,8 +821,8 @@ static void send_event(struct v4l2_fh *fh, struct v4l2_ctrl *ctrl, u32 changes)
|
|||
fill_event(&ev, ctrl, changes);
|
||||
|
||||
list_for_each_entry(sev, &ctrl->ev_subs, node)
|
||||
if (sev->fh && (sev->fh != fh ||
|
||||
(sev->flags & V4L2_EVENT_SUB_FL_ALLOW_FEEDBACK)))
|
||||
if (sev->fh != fh ||
|
||||
(sev->flags & V4L2_EVENT_SUB_FL_ALLOW_FEEDBACK))
|
||||
v4l2_event_queue_fh(sev->fh, &ev);
|
||||
}
|
||||
|
||||
|
@ -947,6 +947,7 @@ static void new_to_cur(struct v4l2_fh *fh, struct v4l2_ctrl *ctrl,
|
|||
if (ctrl->cluster[0]->has_volatiles)
|
||||
ctrl->flags |= V4L2_CTRL_FLAG_VOLATILE;
|
||||
}
|
||||
fh = NULL;
|
||||
}
|
||||
if (changed || update_inactive) {
|
||||
/* If a control was changed that was not one of the controls
|
||||
|
|
|
@ -216,6 +216,9 @@ int v4l2_event_subscribe(struct v4l2_fh *fh,
|
|||
unsigned long flags;
|
||||
unsigned i;
|
||||
|
||||
if (sub->type == V4L2_EVENT_ALL)
|
||||
return -EINVAL;
|
||||
|
||||
if (elems < 1)
|
||||
elems = 1;
|
||||
if (sub->type == V4L2_EVENT_CTRL) {
|
||||
|
@ -283,6 +286,7 @@ int v4l2_event_unsubscribe(struct v4l2_fh *fh,
|
|||
{
|
||||
struct v4l2_subscribed_event *sev;
|
||||
unsigned long flags;
|
||||
int i;
|
||||
|
||||
if (sub->type == V4L2_EVENT_ALL) {
|
||||
v4l2_event_unsubscribe_all(fh);
|
||||
|
@ -293,8 +297,12 @@ int v4l2_event_unsubscribe(struct v4l2_fh *fh,
|
|||
|
||||
sev = v4l2_event_subscribed(fh, sub->type, sub->id);
|
||||
if (sev != NULL) {
|
||||
/* Remove any pending events for this subscription */
|
||||
for (i = 0; i < sev->in_use; i++) {
|
||||
list_del(&sev->events[sev_pos(sev, i)].list);
|
||||
fh->navailable--;
|
||||
}
|
||||
list_del(&sev->list);
|
||||
sev->fh = NULL;
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&fh->vdev->fh_lock, flags);
|
||||
|
|
|
@ -131,6 +131,7 @@ static void __setup_offsets(struct vb2_queue *q, unsigned int n)
|
|||
continue;
|
||||
|
||||
for (plane = 0; plane < vb->num_planes; ++plane) {
|
||||
vb->v4l2_planes[plane].length = q->plane_sizes[plane];
|
||||
vb->v4l2_planes[plane].m.mem_offset = off;
|
||||
|
||||
dprintk(3, "Buffer %d, plane %d offset 0x%08lx\n",
|
||||
|
@ -264,6 +265,7 @@ static void __vb2_queue_free(struct vb2_queue *q, unsigned int buffers)
|
|||
q->num_buffers -= buffers;
|
||||
if (!q->num_buffers)
|
||||
q->memory = 0;
|
||||
INIT_LIST_HEAD(&q->queued_list);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -296,14 +298,14 @@ static bool __buffer_in_use(struct vb2_queue *q, struct vb2_buffer *vb)
|
|||
{
|
||||
unsigned int plane;
|
||||
for (plane = 0; plane < vb->num_planes; ++plane) {
|
||||
void *mem_priv = vb->planes[plane].mem_priv;
|
||||
/*
|
||||
* If num_users() has not been provided, call_memop
|
||||
* will return 0, apparently nobody cares about this
|
||||
* case anyway. If num_users() returns more than 1,
|
||||
* we are not the only user of the plane's memory.
|
||||
*/
|
||||
if (call_memop(q, plane, num_users,
|
||||
vb->planes[plane].mem_priv) > 1)
|
||||
if (mem_priv && call_memop(q, plane, num_users, mem_priv) > 1)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
|
Loading…
Reference in a new issue