mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 19:21:31 -04:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Lots of conflicts, by happily all cases of overlapping changes, parallel adds, things of that nature. Thanks to Stephen Rothwell, Saeed Mahameed, and others for their guidance in these resolutions. Signed-off-by: David S. Miller <[email protected]>
This commit is contained in:
commit
2be09de7d6
314 changed files with 3466 additions and 1727 deletions
|
|
@ -110,6 +110,19 @@ config MEDIA_CONTROLLER_DVB
|
|||
|
||||
This is currently experimental.
|
||||
|
||||
config MEDIA_CONTROLLER_REQUEST_API
|
||||
bool "Enable Media controller Request API (EXPERIMENTAL)"
|
||||
depends on MEDIA_CONTROLLER && STAGING_MEDIA
|
||||
default n
|
||||
---help---
|
||||
DO NOT ENABLE THIS OPTION UNLESS YOU KNOW WHAT YOU'RE DOING.
|
||||
|
||||
This option enables the Request API for the Media controller and V4L2
|
||||
interfaces. It is currently needed by a few stateless codec drivers.
|
||||
|
||||
There is currently no intention to provide API or ABI stability for
|
||||
this new API as of yet.
|
||||
|
||||
#
|
||||
# Video4Linux support
|
||||
# Only enables if one of the V4L2 types (ATV, webcam, radio) is selected
|
||||
|
|
|
|||
|
|
@ -947,7 +947,7 @@ void vb2_buffer_done(struct vb2_buffer *vb, enum vb2_buffer_state state)
|
|||
}
|
||||
atomic_dec(&q->owned_by_drv_count);
|
||||
|
||||
if (vb->req_obj.req) {
|
||||
if (state != VB2_BUF_STATE_QUEUED && vb->req_obj.req) {
|
||||
/* This is not supported at the moment */
|
||||
WARN_ON(state == VB2_BUF_STATE_REQUEUEING);
|
||||
media_request_object_unbind(&vb->req_obj);
|
||||
|
|
@ -1359,8 +1359,12 @@ static void vb2_req_release(struct media_request_object *obj)
|
|||
{
|
||||
struct vb2_buffer *vb = container_of(obj, struct vb2_buffer, req_obj);
|
||||
|
||||
if (vb->state == VB2_BUF_STATE_IN_REQUEST)
|
||||
if (vb->state == VB2_BUF_STATE_IN_REQUEST) {
|
||||
vb->state = VB2_BUF_STATE_DEQUEUED;
|
||||
if (vb->request)
|
||||
media_request_put(vb->request);
|
||||
vb->request = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static const struct media_request_object_ops vb2_core_req_ops = {
|
||||
|
|
@ -1528,6 +1532,18 @@ int vb2_core_qbuf(struct vb2_queue *q, unsigned int index, void *pb,
|
|||
return ret;
|
||||
|
||||
vb->state = VB2_BUF_STATE_IN_REQUEST;
|
||||
|
||||
/*
|
||||
* Increment the refcount and store the request.
|
||||
* The request refcount is decremented again when the
|
||||
* buffer is dequeued. This is to prevent vb2_buffer_done()
|
||||
* from freeing the request from interrupt context, which can
|
||||
* happen if the application closed the request fd after
|
||||
* queueing the request.
|
||||
*/
|
||||
media_request_get(req);
|
||||
vb->request = req;
|
||||
|
||||
/* Fill buffer information for the userspace */
|
||||
if (pb) {
|
||||
call_void_bufop(q, copy_timestamp, vb, pb);
|
||||
|
|
@ -1749,10 +1765,6 @@ static void __vb2_dqbuf(struct vb2_buffer *vb)
|
|||
call_void_memop(vb, unmap_dmabuf, vb->planes[i].mem_priv);
|
||||
vb->planes[i].dbuf_mapped = 0;
|
||||
}
|
||||
if (vb->req_obj.req) {
|
||||
media_request_object_unbind(&vb->req_obj);
|
||||
media_request_object_put(&vb->req_obj);
|
||||
}
|
||||
call_void_bufop(q, init_buffer, vb);
|
||||
}
|
||||
|
||||
|
|
@ -1797,6 +1809,14 @@ int vb2_core_dqbuf(struct vb2_queue *q, unsigned int *pindex, void *pb,
|
|||
/* go back to dequeued state */
|
||||
__vb2_dqbuf(vb);
|
||||
|
||||
if (WARN_ON(vb->req_obj.req)) {
|
||||
media_request_object_unbind(&vb->req_obj);
|
||||
media_request_object_put(&vb->req_obj);
|
||||
}
|
||||
if (vb->request)
|
||||
media_request_put(vb->request);
|
||||
vb->request = NULL;
|
||||
|
||||
dprintk(2, "dqbuf of buffer %d, with state %d\n",
|
||||
vb->index, vb->state);
|
||||
|
||||
|
|
@ -1903,6 +1923,14 @@ static void __vb2_queue_cancel(struct vb2_queue *q)
|
|||
vb->prepared = false;
|
||||
}
|
||||
__vb2_dqbuf(vb);
|
||||
|
||||
if (vb->req_obj.req) {
|
||||
media_request_object_unbind(&vb->req_obj);
|
||||
media_request_object_put(&vb->req_obj);
|
||||
}
|
||||
if (vb->request)
|
||||
media_request_put(vb->request);
|
||||
vb->request = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1940,10 +1968,8 @@ int vb2_core_streamon(struct vb2_queue *q, unsigned int type)
|
|||
if (ret)
|
||||
return ret;
|
||||
ret = vb2_start_streaming(q);
|
||||
if (ret) {
|
||||
__vb2_queue_cancel(q);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
q->streaming = 1;
|
||||
|
|
|
|||
|
|
@ -333,10 +333,10 @@ static int vb2_fill_vb2_v4l2_buffer(struct vb2_buffer *vb, struct v4l2_buffer *b
|
|||
}
|
||||
|
||||
static int vb2_queue_or_prepare_buf(struct vb2_queue *q, struct media_device *mdev,
|
||||
struct v4l2_buffer *b,
|
||||
const char *opname,
|
||||
struct v4l2_buffer *b, bool is_prepare,
|
||||
struct media_request **p_req)
|
||||
{
|
||||
const char *opname = is_prepare ? "prepare_buf" : "qbuf";
|
||||
struct media_request *req;
|
||||
struct vb2_v4l2_buffer *vbuf;
|
||||
struct vb2_buffer *vb;
|
||||
|
|
@ -378,6 +378,9 @@ static int vb2_queue_or_prepare_buf(struct vb2_queue *q, struct media_device *md
|
|||
return ret;
|
||||
}
|
||||
|
||||
if (is_prepare)
|
||||
return 0;
|
||||
|
||||
if (!(b->flags & V4L2_BUF_FLAG_REQUEST_FD)) {
|
||||
if (q->uses_requests) {
|
||||
dprintk(1, "%s: queue uses requests\n", opname);
|
||||
|
|
@ -631,8 +634,10 @@ static void fill_buf_caps(struct vb2_queue *q, u32 *caps)
|
|||
*caps |= V4L2_BUF_CAP_SUPPORTS_USERPTR;
|
||||
if (q->io_modes & VB2_DMABUF)
|
||||
*caps |= V4L2_BUF_CAP_SUPPORTS_DMABUF;
|
||||
#ifdef CONFIG_MEDIA_CONTROLLER_REQUEST_API
|
||||
if (q->supports_requests)
|
||||
*caps |= V4L2_BUF_CAP_SUPPORTS_REQUESTS;
|
||||
#endif
|
||||
}
|
||||
|
||||
int vb2_reqbufs(struct vb2_queue *q, struct v4l2_requestbuffers *req)
|
||||
|
|
@ -657,7 +662,7 @@ int vb2_prepare_buf(struct vb2_queue *q, struct media_device *mdev,
|
|||
if (b->flags & V4L2_BUF_FLAG_REQUEST_FD)
|
||||
return -EINVAL;
|
||||
|
||||
ret = vb2_queue_or_prepare_buf(q, mdev, b, "prepare_buf", NULL);
|
||||
ret = vb2_queue_or_prepare_buf(q, mdev, b, true, NULL);
|
||||
|
||||
return ret ? ret : vb2_core_prepare_buf(q, b->index, b);
|
||||
}
|
||||
|
|
@ -729,7 +734,7 @@ int vb2_qbuf(struct vb2_queue *q, struct media_device *mdev,
|
|||
return -EBUSY;
|
||||
}
|
||||
|
||||
ret = vb2_queue_or_prepare_buf(q, mdev, b, "qbuf", &req);
|
||||
ret = vb2_queue_or_prepare_buf(q, mdev, b, false, &req);
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = vb2_core_qbuf(q, b->index, b, req);
|
||||
|
|
|
|||
|
|
@ -381,10 +381,14 @@ static long media_device_get_topology(struct media_device *mdev, void *arg)
|
|||
static long media_device_request_alloc(struct media_device *mdev,
|
||||
int *alloc_fd)
|
||||
{
|
||||
#ifdef CONFIG_MEDIA_CONTROLLER_REQUEST_API
|
||||
if (!mdev->ops || !mdev->ops->req_validate || !mdev->ops->req_queue)
|
||||
return -ENOTTY;
|
||||
|
||||
return media_request_alloc(mdev, alloc_fd);
|
||||
#else
|
||||
return -ENOTTY;
|
||||
#endif
|
||||
}
|
||||
|
||||
static long copy_arg_from_user(void *karg, void __user *uarg, unsigned int cmd)
|
||||
|
|
|
|||
|
|
@ -997,11 +997,18 @@ static int vicodec_start_streaming(struct vb2_queue *q,
|
|||
|
||||
q_data->sequence = 0;
|
||||
|
||||
if (!V4L2_TYPE_IS_OUTPUT(q->type))
|
||||
if (!V4L2_TYPE_IS_OUTPUT(q->type)) {
|
||||
if (!ctx->is_enc) {
|
||||
state->width = q_data->width;
|
||||
state->height = q_data->height;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
state->width = q_data->width;
|
||||
state->height = q_data->height;
|
||||
if (ctx->is_enc) {
|
||||
state->width = q_data->width;
|
||||
state->height = q_data->height;
|
||||
}
|
||||
state->ref_frame.width = state->ref_frame.height = 0;
|
||||
state->ref_frame.luma = kvmalloc(size + 2 * size / chroma_div,
|
||||
GFP_KERNEL);
|
||||
|
|
|
|||
|
|
@ -276,8 +276,6 @@ static int sdr_cap_start_streaming(struct vb2_queue *vq, unsigned count)
|
|||
|
||||
list_for_each_entry_safe(buf, tmp, &dev->sdr_cap_active, list) {
|
||||
list_del(&buf->list);
|
||||
v4l2_ctrl_request_complete(buf->vb.vb2_buf.req_obj.req,
|
||||
&dev->ctrl_hdl_sdr_cap);
|
||||
vb2_buffer_done(&buf->vb.vb2_buf,
|
||||
VB2_BUF_STATE_QUEUED);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -204,8 +204,6 @@ static int vbi_cap_start_streaming(struct vb2_queue *vq, unsigned count)
|
|||
|
||||
list_for_each_entry_safe(buf, tmp, &dev->vbi_cap_active, list) {
|
||||
list_del(&buf->list);
|
||||
v4l2_ctrl_request_complete(buf->vb.vb2_buf.req_obj.req,
|
||||
&dev->ctrl_hdl_vbi_cap);
|
||||
vb2_buffer_done(&buf->vb.vb2_buf,
|
||||
VB2_BUF_STATE_QUEUED);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -96,8 +96,6 @@ static int vbi_out_start_streaming(struct vb2_queue *vq, unsigned count)
|
|||
|
||||
list_for_each_entry_safe(buf, tmp, &dev->vbi_out_active, list) {
|
||||
list_del(&buf->list);
|
||||
v4l2_ctrl_request_complete(buf->vb.vb2_buf.req_obj.req,
|
||||
&dev->ctrl_hdl_vbi_out);
|
||||
vb2_buffer_done(&buf->vb.vb2_buf,
|
||||
VB2_BUF_STATE_QUEUED);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -243,8 +243,6 @@ static int vid_cap_start_streaming(struct vb2_queue *vq, unsigned count)
|
|||
|
||||
list_for_each_entry_safe(buf, tmp, &dev->vid_cap_active, list) {
|
||||
list_del(&buf->list);
|
||||
v4l2_ctrl_request_complete(buf->vb.vb2_buf.req_obj.req,
|
||||
&dev->ctrl_hdl_vid_cap);
|
||||
vb2_buffer_done(&buf->vb.vb2_buf,
|
||||
VB2_BUF_STATE_QUEUED);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -162,8 +162,6 @@ static int vid_out_start_streaming(struct vb2_queue *vq, unsigned count)
|
|||
|
||||
list_for_each_entry_safe(buf, tmp, &dev->vid_out_active, list) {
|
||||
list_del(&buf->list);
|
||||
v4l2_ctrl_request_complete(buf->vb.vb2_buf.req_obj.req,
|
||||
&dev->ctrl_hdl_vid_out);
|
||||
vb2_buffer_done(&buf->vb.vb2_buf,
|
||||
VB2_BUF_STATE_QUEUED);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -95,7 +95,7 @@ static void lif_configure_stream(struct vsp1_entity *entity,
|
|||
format = vsp1_entity_get_pad_format(&lif->entity, lif->entity.config,
|
||||
LIF_PAD_SOURCE);
|
||||
|
||||
switch (entity->vsp1->version & VI6_IP_VERSION_SOC_MASK) {
|
||||
switch (entity->vsp1->version & VI6_IP_VERSION_MODEL_MASK) {
|
||||
case VI6_IP_VERSION_MODEL_VSPD_GEN2:
|
||||
case VI6_IP_VERSION_MODEL_VSPD_V2H:
|
||||
hbth = 1536;
|
||||
|
|
|
|||
|
|
@ -1563,7 +1563,7 @@ static int std_validate(const struct v4l2_ctrl *ctrl, u32 idx,
|
|||
u64 offset;
|
||||
s64 val;
|
||||
|
||||
switch (ctrl->type) {
|
||||
switch ((u32)ctrl->type) {
|
||||
case V4L2_CTRL_TYPE_INTEGER:
|
||||
return ROUND_TO_RANGE(ptr.p_s32[idx], u32, ctrl);
|
||||
case V4L2_CTRL_TYPE_INTEGER64:
|
||||
|
|
@ -2232,7 +2232,7 @@ static struct v4l2_ctrl *v4l2_ctrl_new(struct v4l2_ctrl_handler *hdl,
|
|||
is_array = nr_of_dims > 0;
|
||||
|
||||
/* Prefill elem_size for all types handled by std_type_ops */
|
||||
switch (type) {
|
||||
switch ((u32)type) {
|
||||
case V4L2_CTRL_TYPE_INTEGER64:
|
||||
elem_size = sizeof(s64);
|
||||
break;
|
||||
|
|
|
|||
Loading…
Reference in a new issue