Example #1
0
static int mdss_mdp_overlay_rotator_setup(struct msm_fb_data_type *mfd,
        struct mdp_overlay *req)
{
    struct mdss_mdp_rotator_session *rot;
    struct mdss_mdp_format_params *fmt;
    int ret = 0;

    pr_debug("rot ctl=%u req id=%x\n", mfd->ctl->num, req->id);

    fmt = mdss_mdp_get_format_params(req->src.format);
    if (!fmt) {
        pr_err("invalid rot format %d\n", req->src.format);
        return -EINVAL;
    }

    ret = mdss_mdp_overlay_req_check(mfd, req, fmt);
    if (ret)
        return ret;

    if (req->id == MSMFB_NEW_REQUEST) {
        rot = mdss_mdp_rotator_session_alloc();

        if (!rot) {
            pr_err("unable to allocate rotator session\n");
            return -ENOMEM;
        }
    } else if (req->id & MDSS_MDP_ROT_SESSION_MASK) {
        rot = mdss_mdp_rotator_session_get(req->id);

        if (!rot) {
            pr_err("rotator session=%x not found\n", req->id);
            return -ENODEV;
        }
    } else {
        pr_err("invalid rotator session id=%x\n", req->id);
        return -EINVAL;
    }

    rot->rotations = req->flags & (MDP_ROT_90 | MDP_FLIP_LR | MDP_FLIP_UD);

    rot->format = fmt->format;
    rot->img_width = req->src.width;
    rot->img_height = req->src.height;
    rot->src_rect.x = req->src_rect.x;
    rot->src_rect.y = req->src_rect.y;
    rot->src_rect.w = req->src_rect.w;
    rot->src_rect.h = req->src_rect.h;

    rot->params_changed++;

    req->id = rot->session_id;

    return ret;
}
struct msm_sync_pt_data *mdss_mdp_rotator_sync_pt_get(
	struct msm_fb_data_type *mfd, const struct mdp_buf_sync *buf_sync)
{
	struct mdss_mdp_rotator_session *rot;

	rot = mdss_mdp_rotator_session_get(buf_sync->session_id);
	if (!rot)
		return NULL;
	if (!rot->rot_sync_pt_data)
		rot->rot_sync_pt_data = mdss_mdp_rotator_sync_pt_create(rot);
	if (rot->rot_sync_pt_data)
		rot->use_sync_pt = true;

	return rot->rot_sync_pt_data;
}
Example #3
0
static int mdss_mdp_overlay_unset(struct msm_fb_data_type *mfd, int ndx)
{
    struct mdss_mdp_pipe *pipe;
    struct mdss_mdp_pipe *cleanup_pipes[MDSS_MDP_MAX_SSPP];
    int i, ret = 0, clean_cnt = 0;
    u32 pipe_ndx, unset_ndx = 0;

    if (!mfd || !mfd->ctl)
        return -ENODEV;

    pr_debug("unset ndx=%x\n", ndx);

    if (ndx & MDSS_MDP_ROT_SESSION_MASK) {
        struct mdss_mdp_rotator_session *rot;
        rot = mdss_mdp_rotator_session_get(ndx);
        if (rot) {
            mdss_mdp_rotator_finish(rot);
        } else {
            pr_warn("unknown session id=%x\n", ndx);
            ret = -ENODEV;
        }

        return ret;
    }

    for (i = 0; unset_ndx != ndx && i < MDSS_MDP_MAX_SSPP; i++) {
        pipe_ndx = BIT(i);
        if (pipe_ndx & ndx) {
            unset_ndx |= pipe_ndx;
            pipe = mdss_mdp_pipe_get_locked(pipe_ndx);
            if (pipe) {
                mdss_mdp_mixer_pipe_unstage(pipe);
                cleanup_pipes[clean_cnt++] = pipe;
            } else {
                pr_warn("unknown pipe ndx=%x\n", pipe_ndx);
            }
        }
    }

    if (clean_cnt) {
        ret = mfd->kickoff_fnc(mfd->ctl);

        for (i = 0; i < clean_cnt; i++)
            mdss_mdp_pipe_destroy(cleanup_pipes[i]);
    }

    return ret;
}
Example #4
0
static int mdss_mdp_overlay_rotate(struct msmfb_overlay_data *req,
                                   struct mdss_mdp_data *src_data,
                                   struct mdss_mdp_data *dst_data)
{
    struct mdss_mdp_rotator_session *rot;
    int ret;

    rot = mdss_mdp_rotator_session_get(req->id);
    if (!rot) {
        pr_err("invalid session id=%x\n", req->id);
        return -ENODEV;
    }

    ret = mdss_mdp_rotator_queue(rot, src_data, dst_data);
    if (ret) {
        pr_err("rotator queue error session id=%x\n", req->id);
        return ret;
    }

    return 0;
}