Commit e6f1227e authored by Linus Torvalds's avatar Linus Torvalds

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
parents 3455229f 1249a3a8
...@@ -1106,6 +1106,7 @@ F: drivers/media/video/s5p-fimc/ ...@@ -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, ...@@ -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, ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment