Merge "msm: camera: isp: Use HAL sent frameid for offline buffer"

This commit is contained in:
Linux Build Service Account 2015-10-30 22:19:32 -07:00 committed by Gerrit - the friendly Code Review server
commit 691251103e
9 changed files with 247 additions and 57 deletions

View File

@ -206,6 +206,67 @@ static void msm_isp_unprepare_v4l2_buf(
return;
}
static int msm_isp_map_buf(struct msm_isp_buf_mgr *buf_mgr,
struct msm_isp_buffer_mapped_info *mapped_info, uint32_t fd)
{
int rc = 0;
int ret;
int iommu_hdl;
if (!buf_mgr || !mapped_info) {
pr_err_ratelimited("%s: %d] NULL ptr buf_mgr %p mapped_info %p\n",
__func__, __LINE__, buf_mgr, mapped_info);
return -EINVAL;
}
if (buf_mgr->secure_enable == NON_SECURE_MODE)
iommu_hdl = buf_mgr->ns_iommu_hdl;
else
iommu_hdl = buf_mgr->sec_iommu_hdl;
ret = cam_smmu_get_phy_addr(iommu_hdl,
fd,
CAM_SMMU_MAP_RW,
&(mapped_info->paddr),
(size_t *)&(mapped_info->len));
if (ret) {
rc = -EINVAL;
pr_err_ratelimited("%s: cannot map address", __func__);
goto smmu_map_error;
}
CDBG("%s: addr:%lu\n",
__func__, (unsigned long)mapped_info->paddr);
return rc;
smmu_map_error:
cam_smmu_put_phy_addr(iommu_hdl,
fd);
return rc;
}
static int msm_isp_unmap_buf(struct msm_isp_buf_mgr *buf_mgr,
uint32_t fd)
{
int iommu_hdl;
if (!buf_mgr) {
pr_err_ratelimited("%s: %d] NULL ptr buf_mgr\n",
__func__, __LINE__);
return -EINVAL;
}
if (buf_mgr->secure_enable == NON_SECURE_MODE)
iommu_hdl = buf_mgr->ns_iommu_hdl;
else
iommu_hdl = buf_mgr->sec_iommu_hdl;
cam_smmu_put_phy_addr(iommu_hdl,
fd);
return 0;
}
static int msm_isp_buf_prepare(struct msm_isp_buf_mgr *buf_mgr,
struct msm_isp_qbuf_info *info, struct vb2_buffer *vb2_buf)
{
@ -1188,24 +1249,34 @@ int msm_isp_proc_buf_cmd(struct msm_isp_buf_mgr *buf_mgr,
switch (cmd) {
case VIDIOC_MSM_ISP_REQUEST_BUF: {
struct msm_isp_buf_request *buf_req = arg;
buf_mgr->ops->request_buf(buf_mgr, buf_req);
break;
}
case VIDIOC_MSM_ISP_ENQUEUE_BUF: {
struct msm_isp_qbuf_info *qbuf_info = arg;
buf_mgr->ops->enqueue_buf(buf_mgr, qbuf_info);
break;
}
case VIDIOC_MSM_ISP_DEQUEUE_BUF: {
struct msm_isp_qbuf_info *qbuf_info = arg;
buf_mgr->ops->dequeue_buf(buf_mgr, qbuf_info);
break;
}
case VIDIOC_MSM_ISP_RELEASE_BUF: {
struct msm_isp_buf_request *buf_req = arg;
buf_mgr->ops->release_buf(buf_mgr, buf_req->handle);
break;
}
case VIDIOC_MSM_ISP_UNMAP_BUF: {
struct msm_isp_unmap_buf_req *unmap_req = arg;
buf_mgr->ops->unmap_buf(buf_mgr, unmap_req->fd);
break;
}
}
return 0;
}
@ -1274,6 +1345,8 @@ static struct msm_isp_buf_ops isp_buf_ops = {
.get_buf_src = msm_isp_get_buf_src,
.get_buf = msm_isp_get_buf,
.get_buf_by_index = msm_isp_get_buf_by_index,
.map_buf = msm_isp_map_buf,
.unmap_buf = msm_isp_unmap_buf,
.put_buf = msm_isp_put_buf,
.flush_buf = msm_isp_flush_buf,
.buf_done = msm_isp_buf_done,

View File

@ -130,7 +130,12 @@ struct msm_isp_buf_ops {
uint32_t bufq_handle, uint32_t buf_index,
struct msm_isp_buffer **buf_info);
int (*put_buf) (struct msm_isp_buf_mgr *buf_mgr,
int (*map_buf)(struct msm_isp_buf_mgr *buf_mgr,
struct msm_isp_buffer_mapped_info *mapped_info, uint32_t fd);
int (*unmap_buf)(struct msm_isp_buf_mgr *buf_mgr, uint32_t fd);
int (*put_buf)(struct msm_isp_buf_mgr *buf_mgr,
uint32_t bufq_handle, uint32_t buf_index);
int (*flush_buf) (struct msm_isp_buf_mgr *buf_mgr,

View File

@ -420,6 +420,8 @@ struct msm_vfe_fetch_engine_info {
uint32_t bufq_handle;
uint32_t buf_idx;
uint8_t is_busy;
uint8_t offline_mode;
uint32_t fd;
};
enum msm_wm_ub_cfg_type {

View File

@ -1079,37 +1079,56 @@ static int msm_vfe40_start_fetch_engine(struct vfe_device *vfe_dev,
void *arg)
{
int rc = 0;
uint32_t bufq_handle;
uint32_t bufq_handle = 0;
struct msm_isp_buffer *buf = NULL;
struct msm_vfe_fetch_eng_start *fe_cfg = arg;
struct msm_isp_buffer_mapped_info mapped_info;
if (vfe_dev->fetch_engine_info.is_busy == 1) {
pr_err("%s: fetch engine busy\n", __func__);
return -EINVAL;
}
memset(&mapped_info, 0, sizeof(struct msm_isp_buffer_mapped_info));
/* There is other option of passing buffer address from user,
* in such case, driver needs to map the buffer and use it*/
bufq_handle = vfe_dev->buf_mgr->ops->get_bufq_handle(
vfe_dev->buf_mgr, fe_cfg->session_id, fe_cfg->stream_id);
vfe_dev->fetch_engine_info.bufq_handle = bufq_handle;
in such case, driver needs to map the buffer and use it*/
vfe_dev->fetch_engine_info.session_id = fe_cfg->session_id;
vfe_dev->fetch_engine_info.stream_id = fe_cfg->stream_id;
vfe_dev->fetch_engine_info.offline_mode = fe_cfg->offline_mode;
vfe_dev->fetch_engine_info.fd = fe_cfg->fd;
rc = vfe_dev->buf_mgr->ops->get_buf_by_index(
vfe_dev->buf_mgr, bufq_handle, fe_cfg->buf_idx, &buf);
if (!fe_cfg->offline_mode) {
bufq_handle = vfe_dev->buf_mgr->ops->get_bufq_handle(
vfe_dev->buf_mgr, fe_cfg->session_id,
fe_cfg->stream_id);
vfe_dev->fetch_engine_info.bufq_handle = bufq_handle;
rc = vfe_dev->buf_mgr->ops->get_buf_by_index(
vfe_dev->buf_mgr, bufq_handle, fe_cfg->buf_idx, &buf);
if (rc < 0 || !buf) {
pr_err("%s: No fetch buffer rc= %d buf= %p\n",
__func__, rc, buf);
return -EINVAL;
}
mapped_info = buf->mapped_info[0];
buf->state = MSM_ISP_BUFFER_STATE_DISPATCHED;
} else {
rc = vfe_dev->buf_mgr->ops->map_buf(vfe_dev->buf_mgr,
&mapped_info, fe_cfg->fd);
if (rc < 0) {
pr_err("%s: No fetch buffer\n", __func__);
pr_err("%s: can not map buffer\n", __func__);
return -EINVAL;
}
}
vfe_dev->fetch_engine_info.buf_idx = fe_cfg->buf_idx;
vfe_dev->fetch_engine_info.is_busy = 1;
msm_camera_io_w(buf->mapped_info[0].paddr, vfe_dev->vfe_base + 0x228);
msm_camera_io_w(mapped_info.paddr, vfe_dev->vfe_base + 0x228);
msm_camera_io_w_mb(0x10000, vfe_dev->vfe_base + 0x4C);
msm_camera_io_w_mb(0x20000, vfe_dev->vfe_base + 0x4C);
buf->state = MSM_ISP_BUFFER_STATE_DIVERTED;
ISP_DBG("%s:VFE%d Fetch Engine ready\n", __func__, vfe_dev->pdev->id);
return 0;
}

View File

@ -931,37 +931,51 @@ static int msm_vfe44_fetch_engine_start(struct vfe_device *vfe_dev,
uint32_t bufq_handle;
struct msm_isp_buffer *buf = NULL;
struct msm_vfe_fetch_eng_start *fe_cfg = arg;
struct msm_isp_buffer_mapped_info mapped_info;
if (vfe_dev->fetch_engine_info.is_busy == 1) {
pr_err("%s: fetch engine busy\n", __func__);
return -EINVAL;
}
memset(&mapped_info, 0, sizeof(struct msm_isp_buffer_mapped_info));
/* There is other option of passing buffer address from user,
in such case, driver needs to map the buffer and use it*/
bufq_handle = vfe_dev->buf_mgr->ops->get_bufq_handle(
vfe_dev->buf_mgr, fe_cfg->session_id, fe_cfg->stream_id);
vfe_dev->fetch_engine_info.bufq_handle = bufq_handle;
vfe_dev->fetch_engine_info.session_id = fe_cfg->session_id;
vfe_dev->fetch_engine_info.stream_id = fe_cfg->stream_id;
vfe_dev->fetch_engine_info.offline_mode = fe_cfg->offline_mode;
vfe_dev->fetch_engine_info.fd = fe_cfg->fd;
rc = vfe_dev->buf_mgr->ops->get_buf_by_index(
vfe_dev->buf_mgr, bufq_handle, fe_cfg->buf_idx, &buf);
if (rc < 0) {
pr_err("%s: No fetch buffer\n", __func__);
return -EINVAL;
if (!fe_cfg->offline_mode) {
bufq_handle = vfe_dev->buf_mgr->ops->get_bufq_handle(
vfe_dev->buf_mgr, fe_cfg->session_id,
fe_cfg->stream_id);
vfe_dev->fetch_engine_info.bufq_handle = bufq_handle;
rc = vfe_dev->buf_mgr->ops->get_buf_by_index(
vfe_dev->buf_mgr, bufq_handle, fe_cfg->buf_idx, &buf);
if (rc < 0) {
pr_err("%s: No fetch buffer\n", __func__);
return -EINVAL;
}
mapped_info = buf->mapped_info[0];
buf->state = MSM_ISP_BUFFER_STATE_DISPATCHED;
} else {
rc = vfe_dev->buf_mgr->ops->map_buf(vfe_dev->buf_mgr,
&mapped_info, fe_cfg->fd);
if (rc < 0) {
pr_err("%s: can not map buffer\n", __func__);
return -EINVAL;
}
}
vfe_dev->fetch_engine_info.buf_idx = fe_cfg->buf_idx;
vfe_dev->fetch_engine_info.is_busy = 1;
msm_camera_io_w(buf->mapped_info[0].paddr, vfe_dev->vfe_base + 0x228);
msm_camera_io_w(mapped_info.paddr, vfe_dev->vfe_base + 0x228);
msm_camera_io_w_mb(0x10000, vfe_dev->vfe_base + 0x4C);
msm_camera_io_w_mb(0x20000, vfe_dev->vfe_base + 0x4C);
ISP_DBG("%s: Fetch Engine ready\n", __func__);
buf->state = MSM_ISP_BUFFER_STATE_DIVERTED;
return 0;
}

View File

@ -750,7 +750,7 @@ static int32_t msm_vfe46_convert_bpp_to_reg(int32_t bpp, uint32_t *bpp_reg)
*bpp_reg = 0x3;
break;
default:
pr_err("%s:%d invalid bpp %d", __func__, __LINE__, bpp);
pr_err("%s:%d invalid bpp %d\n", __func__, __LINE__, bpp);
return -EINVAL;
}
@ -870,40 +870,56 @@ static int msm_vfe46_start_fetch_engine(struct vfe_device *vfe_dev,
void *arg)
{
int rc = 0;
uint32_t bufq_handle;
uint32_t bufq_handle = 0;
struct msm_isp_buffer *buf = NULL;
struct msm_vfe_fetch_eng_start *fe_cfg = arg;
struct msm_isp_buffer_mapped_info mapped_info;
if (vfe_dev->fetch_engine_info.is_busy == 1) {
pr_err("%s: fetch engine busy\n", __func__);
return -EINVAL;
}
memset(&mapped_info, 0, sizeof(struct msm_isp_buffer_mapped_info));
/* There is other option of passing buffer address from user,
in such case, driver needs to map the buffer and use it*/
bufq_handle = vfe_dev->buf_mgr->ops->get_bufq_handle(
vfe_dev->buf_mgr, fe_cfg->session_id, fe_cfg->stream_id);
vfe_dev->fetch_engine_info.bufq_handle = bufq_handle;
vfe_dev->fetch_engine_info.session_id = fe_cfg->session_id;
vfe_dev->fetch_engine_info.stream_id = fe_cfg->stream_id;
vfe_dev->fetch_engine_info.offline_mode = fe_cfg->offline_mode;
vfe_dev->fetch_engine_info.fd = fe_cfg->fd;
rc = vfe_dev->buf_mgr->ops->get_buf_by_index(
vfe_dev->buf_mgr, bufq_handle, fe_cfg->buf_idx, &buf);
if (rc < 0) {
pr_err("%s: No fetch buffer\n", __func__);
return -EINVAL;
if (!fe_cfg->offline_mode) {
bufq_handle = vfe_dev->buf_mgr->ops->get_bufq_handle(
vfe_dev->buf_mgr, fe_cfg->session_id,
fe_cfg->stream_id);
vfe_dev->fetch_engine_info.bufq_handle = bufq_handle;
rc = vfe_dev->buf_mgr->ops->get_buf_by_index(
vfe_dev->buf_mgr, bufq_handle, fe_cfg->buf_idx, &buf);
if (rc < 0 || !buf) {
pr_err("%s: No fetch buffer rc= %d buf= %p\n",
__func__, rc, buf);
return -EINVAL;
}
mapped_info = buf->mapped_info[0];
buf->state = MSM_ISP_BUFFER_STATE_DISPATCHED;
} else {
rc = vfe_dev->buf_mgr->ops->map_buf(vfe_dev->buf_mgr,
&mapped_info, fe_cfg->fd);
if (rc < 0) {
pr_err("%s: can not map buffer\n", __func__);
return -EINVAL;
}
}
vfe_dev->fetch_engine_info.buf_idx = fe_cfg->buf_idx;
vfe_dev->fetch_engine_info.is_busy = 1;
msm_camera_io_w(buf->mapped_info[0].paddr, vfe_dev->vfe_base + 0x268);
msm_camera_io_w(mapped_info.paddr, vfe_dev->vfe_base + 0x268);
msm_camera_io_w_mb(0x100000, vfe_dev->vfe_base + 0x80);
msm_camera_io_w_mb(0x200000, vfe_dev->vfe_base + 0x80);
ISP_DBG("%s:VFE%d Fetch Engine ready\n", __func__, vfe_dev->pdev->id);
buf->state = MSM_ISP_BUFFER_STATE_DISPATCHED;
return 0;
}

View File

@ -908,39 +908,58 @@ static int msm_vfe47_start_fetch_engine(struct vfe_device *vfe_dev,
void *arg)
{
int rc = 0;
uint32_t bufq_handle;
uint32_t bufq_handle = 0;
struct msm_isp_buffer *buf = NULL;
struct msm_vfe_fetch_eng_start *fe_cfg = arg;
struct msm_isp_buffer_mapped_info mapped_info;
if (vfe_dev->fetch_engine_info.is_busy == 1) {
pr_err("%s: fetch engine busy\n", __func__);
return -EINVAL;
}
memset(&mapped_info, 0, sizeof(struct msm_isp_buffer_mapped_info));
/* There is other option of passing buffer address from user,
in such case, driver needs to map the buffer and use it*/
bufq_handle = vfe_dev->buf_mgr->ops->get_bufq_handle(
vfe_dev->buf_mgr, fe_cfg->session_id, fe_cfg->stream_id);
vfe_dev->fetch_engine_info.bufq_handle = bufq_handle;
vfe_dev->fetch_engine_info.session_id = fe_cfg->session_id;
vfe_dev->fetch_engine_info.stream_id = fe_cfg->stream_id;
vfe_dev->fetch_engine_info.offline_mode = fe_cfg->offline_mode;
vfe_dev->fetch_engine_info.fd = fe_cfg->fd;
rc = vfe_dev->buf_mgr->ops->get_buf_by_index(
vfe_dev->buf_mgr, bufq_handle, fe_cfg->buf_idx, &buf);
if (rc < 0) {
pr_err("%s: No fetch buffer\n", __func__);
return -EINVAL;
if (!fe_cfg->offline_mode) {
bufq_handle = vfe_dev->buf_mgr->ops->get_bufq_handle(
vfe_dev->buf_mgr, fe_cfg->session_id,
fe_cfg->stream_id);
vfe_dev->fetch_engine_info.bufq_handle = bufq_handle;
rc = vfe_dev->buf_mgr->ops->get_buf_by_index(
vfe_dev->buf_mgr, bufq_handle, fe_cfg->buf_idx, &buf);
if (rc < 0 || !buf) {
pr_err("%s: No fetch buffer rc= %d buf= %p\n",
__func__, rc, buf);
return -EINVAL;
}
mapped_info = buf->mapped_info[0];
buf->state = MSM_ISP_BUFFER_STATE_DISPATCHED;
} else {
rc = vfe_dev->buf_mgr->ops->map_buf(vfe_dev->buf_mgr,
&mapped_info, fe_cfg->fd);
if (rc < 0) {
pr_err("%s: can not map buffer\n", __func__);
return -EINVAL;
}
}
vfe_dev->fetch_engine_info.buf_idx = fe_cfg->buf_idx;
vfe_dev->fetch_engine_info.is_busy = 1;
msm_camera_io_w(buf->mapped_info[0].paddr, vfe_dev->vfe_base + 0x2F4);
msm_camera_io_w(mapped_info.paddr, vfe_dev->vfe_base + 0x2F4);
msm_camera_io_w_mb(0x100000, vfe_dev->vfe_base + 0x80);
msm_camera_io_w_mb(0x200000, vfe_dev->vfe_base + 0x80);
ISP_DBG("%s:VFE%d Fetch Engine ready\n", __func__, vfe_dev->pdev->id);
buf->state = MSM_ISP_BUFFER_STATE_DISPATCHED;
return 0;
}

View File

@ -589,6 +589,21 @@ static int msm_isp_set_clk_rate(struct vfe_device *vfe_dev, long *rate)
return 0;
}
static int msm_isp_start_fetch_engine(struct vfe_device *vfe_dev,
void *arg)
{
struct msm_vfe_fetch_eng_start *fe_cfg = arg;
/*
* For Offline VFE, HAL expects same frame id
* for offline output which it requested in do_reprocess.
*/
vfe_dev->axi_data.src_info[VFE_PIX_0].frame_id =
fe_cfg->frame_id;
return vfe_dev->hw_info->vfe_ops.core_ops.
start_fetch_eng(vfe_dev, arg);
}
void msm_isp_fetch_engine_done_notify(struct vfe_device *vfe_dev,
struct msm_vfe_fetch_engine_info *fetch_engine_info)
{
@ -596,17 +611,18 @@ void msm_isp_fetch_engine_done_notify(struct vfe_device *vfe_dev,
if (!fetch_engine_info->is_busy)
return;
vfe_dev->axi_data.src_info[VFE_PIX_0].frame_id++;
if (vfe_dev->axi_data.src_info[VFE_PIX_0].frame_id == 0)
vfe_dev->axi_data.src_info[VFE_PIX_0].frame_id = 1;
memset(&fe_rd_done_event, 0, sizeof(struct msm_isp_event_data));
fe_rd_done_event.frame_id =
vfe_dev->axi_data.src_info[VFE_PIX_0].frame_id;
fe_rd_done_event.u.buf_done.session_id = fetch_engine_info->session_id;
fe_rd_done_event.u.buf_done.stream_id = fetch_engine_info->stream_id;
fe_rd_done_event.u.buf_done.handle = fetch_engine_info->bufq_handle;
fe_rd_done_event.u.buf_done.buf_idx = fetch_engine_info->buf_idx;
fe_rd_done_event.u.fetch_done.session_id =
fetch_engine_info->session_id;
fe_rd_done_event.u.fetch_done.stream_id = fetch_engine_info->stream_id;
fe_rd_done_event.u.fetch_done.handle = fetch_engine_info->bufq_handle;
fe_rd_done_event.u.fetch_done.buf_idx = fetch_engine_info->buf_idx;
fe_rd_done_event.u.fetch_done.fd = fetch_engine_info->fd;
fe_rd_done_event.u.fetch_done.offline_mode =
fetch_engine_info->offline_mode;
ISP_DBG("%s:VFE%d ISP_EVENT_FE_READ_DONE buf_idx %d\n",
__func__, vfe_dev->pdev->id, fetch_engine_info->buf_idx);
fetch_engine_info->is_busy = 0;
@ -998,6 +1014,8 @@ static long msm_isp_ioctl_unlocked(struct v4l2_subdev *sd,
/* fallthrough */
case VIDIOC_MSM_ISP_DEQUEUE_BUF:
/* fallthrough */
case VIDIOC_MSM_ISP_UNMAP_BUF:
/* fallthrough */
case VIDIOC_MSM_ISP_RELEASE_BUF: {
mutex_lock(&vfe_dev->buf_mgr_mutex);
rc = msm_isp_proc_buf_cmd(vfe_dev->buf_mgr, cmd, arg);
@ -1062,9 +1080,9 @@ static long msm_isp_ioctl_unlocked(struct v4l2_subdev *sd,
mutex_unlock(&vfe_dev->core_mutex);
break;
case VIDIOC_MSM_ISP_FETCH_ENG_START:
case VIDIOC_MSM_ISP_MAP_BUF_START_FE:
mutex_lock(&vfe_dev->core_mutex);
rc = vfe_dev->hw_info->vfe_ops.core_ops.
start_fetch_eng(vfe_dev, arg);
rc = msm_isp_start_fetch_engine(vfe_dev, arg);
mutex_unlock(&vfe_dev->core_mutex);
break;
case VIDIOC_MSM_ISP_REG_UPDATE_CMD:

View File

@ -240,7 +240,10 @@ struct msm_vfe_fetch_eng_start {
uint32_t session_id;
uint32_t stream_id;
uint32_t buf_idx;
uint8_t offline_mode;
uint32_t fd;
uint32_t buf_addr;
uint32_t frame_id;
};
struct msm_vfe_axi_plane_cfg {
@ -489,6 +492,10 @@ enum msm_isp_buf_type {
MAX_ISP_BUF_TYPE,
};
struct msm_isp_unmap_buf_req {
uint32_t fd;
};
struct msm_isp_buf_request {
uint32_t session_id;
uint32_t stream_id;
@ -621,6 +628,14 @@ struct msm_isp_buf_event {
uint32_t output_format;
int8_t buf_idx;
};
struct msm_isp_fetch_eng_event {
uint32_t session_id;
uint32_t stream_id;
uint32_t handle;
uint32_t fd;
int8_t buf_idx;
int8_t offline_mode;
};
struct msm_isp_stats_event {
uint32_t stats_mask; /* 4 bytes */
uint8_t stats_buf_idxs[MSM_ISP_STATS_MAX]; /* 11 bytes */
@ -692,6 +707,8 @@ struct msm_isp_event_data {
struct msm_isp_stats_event stats;
/* Sent for Buf_Divert event */
struct msm_isp_buf_event buf_done;
/* Sent for offline fetch done event */
struct msm_isp_fetch_eng_event fetch_done;
/* Sent for Error_Event */
struct msm_isp_error_info error_info;
/*
@ -712,6 +729,7 @@ struct msm_isp_event_data32 {
union {
struct msm_isp_stats_event stats;
struct msm_isp_buf_event buf_done;
struct msm_isp_fetch_eng_event fetch_done;
struct msm_isp_error_info error_info;
struct msm_isp_output_info output_info;
struct msm_isp_sof_info sof_info;
@ -825,4 +843,10 @@ struct msm_isp_set_stats_ab {
#define VIDIOC_MSM_ISP_SET_STATS_BANDWIDTH \
_IOWR('V', BASE_VIDIOC_PRIVATE+23, struct msm_isp_set_stats_ab)
#define VIDIOC_MSM_ISP_MAP_BUF_START_FE \
_IOWR('V', BASE_VIDIOC_PRIVATE+21, struct msm_vfe_fetch_eng_start)
#define VIDIOC_MSM_ISP_UNMAP_BUF \
_IOWR('V', BASE_VIDIOC_PRIVATE+22, struct msm_isp_unmap_buf_req)
#endif /* __MSMB_ISP__ */