msm: vidc: Video driver update to kernel 3.4.

During the migration from kernel 3.0 to 3.4, V4L2 framework changed.
This requires changes from video driver. This change makes video
driver code compatible with kernel 3.4.

Change-Id: I12fb28e4b7c261c9755fbb62bb6bb8ea299d5272
Signed-off-by: Vinay Kalia <vkalia@codeaurora.org>
This commit is contained in:
Vinay Kalia
2012-06-22 15:25:13 -07:00
committed by Ashray Kulkarni
parent 3642ec172e
commit cf7e27f92a
6 changed files with 28 additions and 88 deletions
+10 -12
View File
@@ -28,6 +28,7 @@
#include "msm_smem.h"
#define BASE_DEVICE_NUMBER 32
#define MAX_EVENTS 30
struct msm_vidc_drv *vidc_driver;
@@ -215,21 +216,20 @@ int msm_v4l2_reqbufs(struct file *file, void *fh,
int rc;
struct buffer_info *bi;
struct v4l2_buffer buffer_info;
struct v4l2_plane plane;
v4l2_inst = get_v4l2_inst(file, NULL);
if (b->count == 0) {
list_for_each_safe(ptr, next, &v4l2_inst->registered_bufs) {
bi = list_entry(ptr, struct buffer_info, list);
if (bi->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) {
buffer_info.type = bi->type;
buffer_info.m.planes[0].reserved[0] =
bi->fd;
buffer_info.m.planes[0].reserved[1] =
bi->buff_off;
buffer_info.m.planes[0].length = bi->size;
buffer_info.m.planes[0].m.userptr =
bi->uvaddr;
plane.reserved[0] = bi->fd;
plane.reserved[1] = bi->buff_off;
plane.length = bi->size;
plane.m.userptr = bi->uvaddr;
buffer_info.m.planes = &plane;
buffer_info.length = 1;
pr_err("Releasing buffer: %d, %d, %d\n",
pr_info("Releasing buffer: %d, %d, %d\n",
buffer_info.m.planes[0].reserved[0],
buffer_info.m.planes[0].reserved[1],
buffer_info.m.planes[0].length);
@@ -359,9 +359,7 @@ static int msm_v4l2_subscribe_event(struct v4l2_fh *fh,
struct v4l2_event_subscription *sub)
{
int rc = 0;
if (sub->type == V4L2_EVENT_ALL)
sub->type = V4L2_EVENT_PRIVATE_START + V4L2_EVENT_VIDC_BASE;
rc = v4l2_event_subscribe(fh, sub, 0);
rc = v4l2_event_subscribe(fh, sub, MAX_EVENTS);
return rc;
}
@@ -445,7 +443,7 @@ static int msm_vidc_initialize_core(struct platform_device *pdev,
INIT_LIST_HEAD(&core->instances);
mutex_init(&core->sync_lock);
spin_lock_init(&core->lock);
core->base_addr = 0x34f00000;
core->base_addr = 0x14f00000;
core->state = VIDC_CORE_UNINIT;
for (i = SYS_MSG_INDEX(SYS_MSG_START);
i <= SYS_MSG_INDEX(SYS_MSG_END); i++) {
+4 -2
View File
@@ -348,7 +348,7 @@ static const struct msm_vidc_ctrl msm_venc_ctrls[] = {
{
.id = V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE,
.name = "H.264 Loop Filter Mode",
.type = V4L2_CTRL_TYPE_INTEGER,
.type = V4L2_CTRL_TYPE_MENU,
.minimum = V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_ENABLED,
.maximum = L_MODE,
.default_value = V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_ENABLED,
@@ -375,7 +375,9 @@ static u32 get_frame_size_nv21(int plane, u32 height, u32 width)
static u32 get_frame_size_compressed(int plane, u32 height, u32 width)
{
return ((height + 31) & (~31)) * ((width + 31) & (~31)) * 3/2;
int sz = ((height + 31) & (~31)) * ((width + 31) & (~31)) * 3/2;
sz = (sz + 4095) & (~4095);
return sz;
}
static struct hal_quantization
+1 -1
View File
@@ -186,7 +186,7 @@ int msm_vidc_streamoff(void *instance, enum v4l2_buf_type i)
void *vidc_get_userptr(void *alloc_ctx, unsigned long vaddr,
unsigned long size, int write)
{
return NULL;
return (void *)0xdeadbeef;
}
void vidc_put_userptr(void *buf_priv)
+9 -64
View File
@@ -183,21 +183,9 @@ static void handle_session_init_done(enum command_response cmd, void *data)
{
struct msm_vidc_cb_cmd_done *response = data;
struct msm_vidc_inst *inst;
struct video_device *vdev;
struct v4l2_event dqevent;
struct msm_vidc_core *core;
if (response) {
inst = (struct msm_vidc_inst *)response->session_id;
signal_session_msg_receipt(cmd, inst);
core = inst->core;
if (inst->session_type == MSM_VIDC_ENCODER)
vdev = &core->vdev[MSM_VIDC_ENCODER].vdev;
else
vdev = &core->vdev[MSM_VIDC_DECODER].vdev;
dqevent.type = V4L2_EVENT_PRIVATE_START + V4L2_EVENT_VIDC_BASE;
dqevent.u.data[0] = (uint8_t)MSM_VIDC_OPEN_DONE;
v4l2_event_queue(vdev, &dqevent);
return;
} else {
pr_err("Failed to get valid response for session init\n");
}
@@ -207,24 +195,17 @@ static void handle_event_change(enum command_response cmd, void *data)
{
struct msm_vidc_cb_cmd_done *response = data;
struct msm_vidc_inst *inst;
struct video_device *vdev;
struct v4l2_event dqevent;
struct msm_vidc_cb_event *event_notify;
struct msm_vidc_core *core;
if (response) {
inst = (struct msm_vidc_inst *)response->session_id;
core = inst->core;
if (inst->session_type == MSM_VIDC_ENCODER)
vdev = &core->vdev[MSM_VIDC_ENCODER].vdev;
else
vdev = &core->vdev[MSM_VIDC_DECODER].vdev;
dqevent.type = V4L2_EVENT_PRIVATE_START + V4L2_EVENT_VIDC_BASE;
dqevent.u.data[0] = (uint8_t)MSM_VIDC_DECODER_EVENT_CHANGE;
dqevent.type = V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED;
dqevent.id = 0;
event_notify = (struct msm_vidc_cb_event *) response->data;
inst->reconfig_height = event_notify->height;
inst->reconfig_width = event_notify->width;
inst->in_reconfig = true;
v4l2_event_queue(vdev, &dqevent);
v4l2_event_queue_fh(&inst->event_handler, &dqevent);
return;
} else {
pr_err("Failed to get valid response for event_change\n");
@@ -262,20 +243,9 @@ static void handle_start_done(enum command_response cmd, void *data)
{
struct msm_vidc_cb_cmd_done *response = data;
struct msm_vidc_inst *inst;
struct video_device *vdev;
struct v4l2_event dqevent;
struct msm_vidc_core *core;
if (response) {
inst = (struct msm_vidc_inst *)response->session_id;
signal_session_msg_receipt(cmd, inst);
core = inst->core;
if (inst->session_type == MSM_VIDC_ENCODER)
vdev = &core->vdev[MSM_VIDC_ENCODER].vdev;
else
vdev = &core->vdev[MSM_VIDC_DECODER].vdev;
dqevent.type = V4L2_EVENT_PRIVATE_START + V4L2_EVENT_VIDC_BASE;
dqevent.u.data[0] = (uint8_t)MSM_VIDC_START_DONE;
v4l2_event_queue(vdev, &dqevent);
} else {
pr_err("Failed to get valid response for start\n");
}
@@ -285,20 +255,9 @@ static void handle_stop_done(enum command_response cmd, void *data)
{
struct msm_vidc_cb_cmd_done *response = data;
struct msm_vidc_inst *inst;
struct video_device *vdev;
struct v4l2_event dqevent;
struct msm_vidc_core *core;
if (response) {
inst = (struct msm_vidc_inst *)response->session_id;
signal_session_msg_receipt(cmd, inst);
core = inst->core;
if (inst->session_type == MSM_VIDC_ENCODER)
vdev = &core->vdev[MSM_VIDC_ENCODER].vdev;
else
vdev = &core->vdev[MSM_VIDC_DECODER].vdev;
dqevent.type = V4L2_EVENT_PRIVATE_START + V4L2_EVENT_VIDC_BASE;
dqevent.u.data[0] = (uint8_t)MSM_VIDC_STOP_DONE;
v4l2_event_queue(vdev, &dqevent);
} else {
pr_err("Failed to get valid response for stop\n");
}
@@ -320,19 +279,12 @@ static void handle_session_flush(enum command_response cmd, void *data)
{
struct msm_vidc_cb_cmd_done *response = data;
struct msm_vidc_inst *inst;
struct video_device *vdev;
struct v4l2_event dqevent;
struct msm_vidc_core *core;
if (response) {
inst = (struct msm_vidc_inst *)response->session_id;
core = inst->core;
if (inst->session_type == MSM_VIDC_ENCODER)
vdev = &core->vdev[MSM_VIDC_ENCODER].vdev;
else
vdev = &core->vdev[MSM_VIDC_DECODER].vdev;
dqevent.type = V4L2_EVENT_PRIVATE_START + V4L2_EVENT_VIDC_BASE;
dqevent.u.data[0] = (uint8_t)MSM_VIDC_DECODER_FLUSH_DONE;
v4l2_event_queue(vdev, &dqevent);
dqevent.type = V4L2_EVENT_MSM_VIDC_FLUSH_DONE;
dqevent.id = 0;
v4l2_event_queue_fh(&inst->event_handler, &dqevent);
} else {
pr_err("Failed to get valid response for flush\n");
}
@@ -343,20 +295,13 @@ static void handle_session_close(enum command_response cmd, void *data)
{
struct msm_vidc_cb_cmd_done *response = data;
struct msm_vidc_inst *inst;
struct video_device *vdev;
struct v4l2_event dqevent;
struct msm_vidc_core *core;
if (response) {
inst = (struct msm_vidc_inst *)response->session_id;
signal_session_msg_receipt(cmd, inst);
core = inst->core;
if (inst->session_type == MSM_VIDC_ENCODER)
vdev = &core->vdev[MSM_VIDC_ENCODER].vdev;
else
vdev = &core->vdev[MSM_VIDC_DECODER].vdev;
dqevent.type = V4L2_EVENT_PRIVATE_START + V4L2_EVENT_VIDC_BASE;
dqevent.u.data[0] = (uint8_t)MSM_VIDC_CLOSE_DONE;
v4l2_event_queue(vdev, &dqevent);
dqevent.type = V4L2_EVENT_MSM_VIDC_CLOSE_DONE;
dqevent.id = 0;
v4l2_event_queue_fh(&inst->event_handler, &dqevent);
} else {
pr_err("Failed to get valid response for session close\n");
}
@@ -75,11 +75,6 @@ enum instance_state {
MSM_VIDC_CORE_UNINIT,
};
enum vidc_resposes_id {
MSM_VIDC_DECODER_FLUSH_DONE = 0x11,
MSM_VIDC_DECODER_EVENT_CHANGE,
};
struct buf_info {
struct list_head list;
struct vb2_buffer *buf;
+4 -4
View File
@@ -2295,11 +2295,11 @@ struct v4l2_streamparm {
#define V4L2_EVENT_FRAME_SYNC 4
#define V4L2_EVENT_PRIVATE_START 0x08000000
#define V4L2_EVENT_MSM_VIDC_START { V4L2_EVENT_PRIVATE_START + 0x00001000}
#define V4L2_EVENT_MSM_VIDC_FLUSH_DONE {V4L2_EVENT_PRIVATE_START + 1}
#define V4L2_EVENT_MSM_VIDC_START (V4L2_EVENT_PRIVATE_START + 0x00001000)
#define V4L2_EVENT_MSM_VIDC_FLUSH_DONE (V4L2_EVENT_PRIVATE_START + 1)
#define V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED \
{V4L2_EVENT_PRIVATE_START + 2}
#define V4L2_EVENT_MSM_VIDC_CLOSE_DONE {V4L2_EVENT_PRIVATE_START + 3}
(V4L2_EVENT_PRIVATE_START + 2)
#define V4L2_EVENT_MSM_VIDC_CLOSE_DONE (V4L2_EVENT_PRIVATE_START + 3)
/* Payload for V4L2_EVENT_VSYNC */
struct v4l2_event_vsync {