int msm_mctl_pp_proc_cmd(struct msm_cam_media_controller *p_mctl,
			struct msm_mctl_pp_cmd *pp_cmd)
{
	int rc = 0;
	struct msm_mctl_pp_frame_buffer pp_buffer;
	struct msm_frame_buffer *buf = NULL;
	void __user *argp = (void __user *)pp_cmd->value;
	int msg_type = VFE_MSG_OUTPUT_V;
	unsigned long flags;

	switch (pp_cmd->id) {
	case MCTL_CMD_GET_FRAME_BUFFER: {
		if (copy_from_user(&pp_buffer, pp_cmd->value,
				sizeof(pp_buffer)))
			return -EFAULT;
		msg_type = msm_mctl_pp_path_to_msg_type(pp_buffer.path);
		buf = msm_mctl_get_free_buf(p_mctl, msg_type);
		pp_buffer.buf_handle = (uint32_t)buf;
		if (copy_to_user((void *)argp,
			&pp_buffer,
			sizeof(struct msm_mctl_pp_frame_buffer))) {
			ERR_COPY_TO_USER();
			rc = -EFAULT;
		}
		break;
	}
	case MCTL_CMD_PUT_FRAME_BUFFER: {
		if (copy_from_user(&pp_buffer, pp_cmd->value,
				sizeof(pp_buffer)))
			return -EFAULT;
		msg_type = msm_mctl_pp_path_to_msg_type(pp_buffer.path);
			buf = (struct msm_frame_buffer *)pp_buffer.buf_handle;
		msm_mctl_put_free_buf(p_mctl, msg_type, buf);
		break;
	}
	case MCTL_CMD_DIVERT_FRAME_PP_PATH: {
		struct msm_mctl_pp_divert_pp divert_pp;
		if (copy_from_user(&divert_pp, pp_cmd->value,
				sizeof(divert_pp)))
			return -EFAULT;
		D("%s: PP_PATH, path=%d",
			__func__, divert_pp.path);
		spin_lock_irqsave(&p_mctl->pp_info.lock, flags);
		if (divert_pp.enable)
			p_mctl->pp_info.pp_ctrl.pp_msg_type |= divert_pp.path;
		else
			p_mctl->pp_info.pp_ctrl.pp_msg_type &= ~divert_pp.path;
		spin_unlock_irqrestore(&p_mctl->pp_info.lock, flags);
		D("%s: pp path = 0x%x", __func__,
			p_mctl->pp_info.pp_ctrl.pp_msg_type);
		break;
	}
	default:
		rc = -EPERM;
	break;
	}
	return rc;
}
int msm_mctl_pp_notify(struct msm_cam_media_controller *p_mctl,
			struct msm_mctl_pp_frame_info *pp_frame_info)
{
		struct msm_mctl_pp_frame_cmd *pp_frame_cmd;
		pp_frame_cmd = &pp_frame_info->pp_frame_cmd;

		D("%s: msm_cam_evt_divert_frame=%d",
			__func__, sizeof(struct msm_mctl_pp_event_info));
		if ((MSM_MCTL_PP_VPE_FRAME_TO_APP &
			pp_frame_cmd->vpe_output_action)) {
			struct msm_free_buf done_frame;
			int msg_type =
				msm_mctl_pp_path_to_msg_type(
					pp_frame_cmd->path);

			done_frame.ch_paddr[0] =
				pp_frame_info->dest_frame.sp.phy_addr;
			done_frame.vb =
				pp_frame_info->dest_frame.handle;
			msm_mctl_buf_done_pp(
				p_mctl, msg_type, &done_frame, 0);
			pr_info("%s: vpe done to app, vb=0x%x, path=%d, phy=0x%x",
				__func__, done_frame.vb,
				pp_frame_cmd->path, done_frame.ch_paddr[0]);
		}
		if ((MSM_MCTL_PP_VPE_FRAME_ACK &
			pp_frame_cmd->vpe_output_action)) {
			struct v4l2_event v4l2_evt;
			struct msm_mctl_pp_event_info *pp_event_info;
			struct msm_isp_event_ctrl *isp_event;
			isp_event = kzalloc(sizeof(struct msm_isp_event_ctrl),
								GFP_ATOMIC);
			if (!isp_event) {
				pr_err("%s Insufficient memory.", __func__);
				return -ENOMEM;
			}
			memset(&v4l2_evt, 0, sizeof(v4l2_evt));
			*((uint32_t *)v4l2_evt.u.data) = (uint32_t)isp_event;

			/* Get hold of pp event info struct inside event ctrl.*/
			pp_event_info = &(isp_event->isp_data.pp_event_info);

			pp_event_info->event = MCTL_PP_EVENT_CMD_ACK;
			pp_event_info->ack.cmd = pp_frame_info->user_cmd;
			pp_event_info->ack.status = 0;
			pp_event_info->ack.cookie = pp_frame_cmd->cookie;
			v4l2_evt.type = V4L2_EVENT_PRIVATE_START +
						MSM_CAM_RESP_MCTL_PP_EVENT;

			v4l2_event_queue(
				p_mctl->config_device->
					config_stat_event_queue.pvdev,
				&v4l2_evt);
			D("%s: ack to daemon, cookie=0x%x, event = 0x%x",
				__func__, pp_frame_info->pp_frame_cmd.cookie,
				v4l2_evt.type);
		}
		kfree(pp_frame_info); /* free mem */
		return 0;
}
Exemple #3
0
int msm_mctl_pp_notify(struct msm_cam_media_controller *p_mctl,
                       struct msm_mctl_pp_frame_info *pp_frame_info)
{
    struct msm_mctl_pp_frame_cmd *pp_frame_cmd;
    pp_frame_cmd = &pp_frame_info->pp_frame_cmd;

    D("%s: msm_cam_evt_divert_frame=%d",
      __func__, sizeof(struct msm_mctl_pp_event_info));
    if ((MSM_MCTL_PP_VPE_FRAME_TO_APP &
            pp_frame_cmd->vpe_output_action)) {
        struct msm_free_buf done_frame;
        int msg_type =
            msm_mctl_pp_path_to_msg_type(
                pp_frame_cmd->path);

        done_frame.ch_paddr[0] =
            pp_frame_info->dest_frame.sp.phy_addr;
        done_frame.vb =
            pp_frame_info->dest_frame.handle;
        msm_mctl_buf_done_pp(
            p_mctl, msg_type, &done_frame, 0);
        pr_err("%s: vpe done to app, vb=0x%x, path=%d, phy=0x%x",
               __func__, done_frame.vb,
               pp_frame_cmd->path, done_frame.ch_paddr[0]);
    }
    if ((MSM_MCTL_PP_VPE_FRAME_ACK &
            pp_frame_cmd->vpe_output_action)) {
        struct v4l2_event v4l2_evt;
        struct msm_mctl_pp_event_info *pp_event_info;
        memset(&v4l2_evt, 0, sizeof(v4l2_evt));
        pp_event_info =
            (struct msm_mctl_pp_event_info *)v4l2_evt.
            u.data;
        pp_event_info->event = MCTL_PP_EVENT_CMD_ACK;
        pp_event_info->ack.cmd = pp_frame_info->user_cmd;
        pp_event_info->ack.status = 0;
        pp_event_info->ack.cookie = pp_frame_cmd->cookie;
        v4l2_evt.type = V4L2_EVENT_PRIVATE_START +
                        MSM_CAM_RESP_MCTL_PP_EVENT;
        v4l2_event_queue(
            p_mctl->config_device->
            config_stat_event_queue.pvdev,
            &v4l2_evt);
        pr_err("%s: ack to daemon, cookie=0x%x, event = 0x%x",
               __func__, pp_frame_info->pp_frame_cmd.cookie,
               v4l2_evt.type);
    }
    kfree(pp_frame_info); /* free mem */
    return 0;
}