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
|
ARM/SAMSUNG S5P SERIES Multi Format Codec (MFC) SUPPORT
|
||||||
M: Kyungmin Park <kyungmin.park@samsung.com>
|
M: Kyungmin Park <kyungmin.park@samsung.com>
|
||||||
M: Kamil Debski <k.debski@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-arm-kernel@lists.infradead.org
|
||||||
L: linux-media@vger.kernel.org
|
L: linux-media@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
|
@ -398,7 +398,6 @@ static int mxl111sf_i2c_readagain(struct mxl111sf_state *state,
|
||||||
u8 i2c_r_data[24];
|
u8 i2c_r_data[24];
|
||||||
u8 i = 0;
|
u8 i = 0;
|
||||||
u8 fifo_status = 0;
|
u8 fifo_status = 0;
|
||||||
int ret;
|
|
||||||
int status = 0;
|
int status = 0;
|
||||||
|
|
||||||
mxl_i2c("read %d bytes", count);
|
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;
|
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 */
|
/* Check for I2C NACK status */
|
||||||
if (mxl111sf_i2c_check_status(state) == 1) {
|
if (mxl111sf_i2c_check_status(state) == 1) {
|
||||||
|
|
|
@ -296,8 +296,7 @@ int mxl111sf_config_spi(struct mxl111sf_state *state, int onoff)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
ret = mxl111sf_write_reg(state, 0x00, 0x00);
|
ret = mxl111sf_write_reg(state, 0x00, 0x00);
|
||||||
if (mxl_fail(ret))
|
mxl_fail(ret);
|
||||||
goto fail;
|
|
||||||
fail:
|
fail:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -328,11 +327,13 @@ int mxl111sf_idac_config(struct mxl111sf_state *state,
|
||||||
/* set hysteresis value reg: 0x0B<5:0> */
|
/* set hysteresis value reg: 0x0B<5:0> */
|
||||||
ret = mxl111sf_write_reg(state, V6_IDAC_HYSTERESIS_REG,
|
ret = mxl111sf_write_reg(state, V6_IDAC_HYSTERESIS_REG,
|
||||||
(hysteresis_value & 0x3F));
|
(hysteresis_value & 0x3F));
|
||||||
|
mxl_fail(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = mxl111sf_write_reg(state, V6_IDAC_SETTINGS_REG, val);
|
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);
|
strncpy(cap->card, dev->plat_dev->name, sizeof(cap->card) - 1);
|
||||||
cap->bus_info[0] = 0;
|
cap->bus_info[0] = 0;
|
||||||
cap->version = KERNEL_VERSION(1, 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_STREAMING;
|
V4L2_CAP_VIDEO_OUTPUT_MPLANE | V4L2_CAP_STREAMING;
|
||||||
return 0;
|
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);
|
strncpy(cap->card, dev->plat_dev->name, sizeof(cap->card) - 1);
|
||||||
cap->bus_info[0] = 0;
|
cap->bus_info[0] = 0;
|
||||||
cap->version = KERNEL_VERSION(1, 0, 0);
|
cap->version = KERNEL_VERSION(1, 0, 0);
|
||||||
cap->capabilities = V4L2_CAP_VIDEO_CAPTURE
|
cap->capabilities = V4L2_CAP_VIDEO_CAPTURE_MPLANE
|
||||||
| V4L2_CAP_VIDEO_OUTPUT
|
| V4L2_CAP_VIDEO_OUTPUT_MPLANE
|
||||||
| V4L2_CAP_STREAMING;
|
| V4L2_CAP_STREAMING;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1016,7 +1016,8 @@ int uvc_query_v4l2_menu(struct uvc_video_chain *chain,
|
||||||
|
|
||||||
menu_info = &mapping->menu_info[query_menu->index];
|
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;
|
s32 bitmap;
|
||||||
|
|
||||||
if (!ctrl->cached) {
|
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
|
/* Valid menu indices are reported by the GET_RES request for
|
||||||
* UVC controls that support it.
|
* 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) {
|
if (!ctrl->cached) {
|
||||||
ret = uvc_ctrl_populate_cache(chain, ctrl);
|
ret = uvc_ctrl_populate_cache(chain, ctrl);
|
||||||
if (ret < 0)
|
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);
|
fill_event(&ev, ctrl, changes);
|
||||||
|
|
||||||
list_for_each_entry(sev, &ctrl->ev_subs, node)
|
list_for_each_entry(sev, &ctrl->ev_subs, node)
|
||||||
if (sev->fh && (sev->fh != fh ||
|
if (sev->fh != fh ||
|
||||||
(sev->flags & V4L2_EVENT_SUB_FL_ALLOW_FEEDBACK)))
|
(sev->flags & V4L2_EVENT_SUB_FL_ALLOW_FEEDBACK))
|
||||||
v4l2_event_queue_fh(sev->fh, &ev);
|
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)
|
if (ctrl->cluster[0]->has_volatiles)
|
||||||
ctrl->flags |= V4L2_CTRL_FLAG_VOLATILE;
|
ctrl->flags |= V4L2_CTRL_FLAG_VOLATILE;
|
||||||
}
|
}
|
||||||
|
fh = NULL;
|
||||||
}
|
}
|
||||||
if (changed || update_inactive) {
|
if (changed || update_inactive) {
|
||||||
/* If a control was changed that was not one of the controls
|
/* 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 long flags;
|
||||||
unsigned i;
|
unsigned i;
|
||||||
|
|
||||||
|
if (sub->type == V4L2_EVENT_ALL)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
if (elems < 1)
|
if (elems < 1)
|
||||||
elems = 1;
|
elems = 1;
|
||||||
if (sub->type == V4L2_EVENT_CTRL) {
|
if (sub->type == V4L2_EVENT_CTRL) {
|
||||||
|
@ -283,6 +286,7 @@ int v4l2_event_unsubscribe(struct v4l2_fh *fh,
|
||||||
{
|
{
|
||||||
struct v4l2_subscribed_event *sev;
|
struct v4l2_subscribed_event *sev;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
int i;
|
||||||
|
|
||||||
if (sub->type == V4L2_EVENT_ALL) {
|
if (sub->type == V4L2_EVENT_ALL) {
|
||||||
v4l2_event_unsubscribe_all(fh);
|
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);
|
sev = v4l2_event_subscribed(fh, sub->type, sub->id);
|
||||||
if (sev != NULL) {
|
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);
|
list_del(&sev->list);
|
||||||
sev->fh = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
spin_unlock_irqrestore(&fh->vdev->fh_lock, flags);
|
spin_unlock_irqrestore(&fh->vdev->fh_lock, flags);
|
||||||
|
|
|
@ -131,6 +131,7 @@ static void __setup_offsets(struct vb2_queue *q, unsigned int n)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
for (plane = 0; plane < vb->num_planes; ++plane) {
|
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;
|
vb->v4l2_planes[plane].m.mem_offset = off;
|
||||||
|
|
||||||
dprintk(3, "Buffer %d, plane %d offset 0x%08lx\n",
|
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;
|
q->num_buffers -= buffers;
|
||||||
if (!q->num_buffers)
|
if (!q->num_buffers)
|
||||||
q->memory = 0;
|
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;
|
unsigned int plane;
|
||||||
for (plane = 0; plane < vb->num_planes; ++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
|
* If num_users() has not been provided, call_memop
|
||||||
* will return 0, apparently nobody cares about this
|
* will return 0, apparently nobody cares about this
|
||||||
* case anyway. If num_users() returns more than 1,
|
* case anyway. If num_users() returns more than 1,
|
||||||
* we are not the only user of the plane's memory.
|
* we are not the only user of the plane's memory.
|
||||||
*/
|
*/
|
||||||
if (call_memop(q, plane, num_users,
|
if (mem_priv && call_memop(q, plane, num_users, mem_priv) > 1)
|
||||||
vb->planes[plane].mem_priv) > 1)
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|
Loading…
Reference in a new issue