コード例 #1
0
int vpe_disable(struct msm_cam_media_controller *mctl)
{
	int rc = 0;
	unsigned long flags = 0;
	D("%s", __func__);
	vpe_send_outmsg();
	spin_lock_irqsave(&vpe_ctrl->lock, flags);
	if (vpe_ctrl->state == VPE_STATE_IDLE) {
		D("%s: VPE already disabled", __func__);
		spin_unlock_irqrestore(&vpe_ctrl->lock, flags);
		return rc;
	}
	spin_unlock_irqrestore(&vpe_ctrl->lock, flags);
#ifdef CONFIG_MSM_IOMMU
	iommu_detach_device(mctl->domain, vpe_ctrl->iommu_ctx_dst);
	iommu_detach_device(mctl->domain, vpe_ctrl->iommu_ctx_src);
#endif
	disable_irq(vpe_ctrl->vpeirq->start);
	tasklet_kill(&vpe_tasklet);
	msm_cam_clk_enable(&vpe_ctrl->pdev->dev, vpe_clk_info,
			vpe_ctrl->vpe_clk, ARRAY_SIZE(vpe_clk_info), 0);

	regulator_disable(vpe_ctrl->fs_vpe);
	spin_lock_irqsave(&vpe_ctrl->lock, flags);
	vpe_ctrl->state = VPE_STATE_IDLE;
	spin_unlock_irqrestore(&vpe_ctrl->lock, flags);
	return rc;
}
コード例 #2
0
ファイル: msm_vpe.c プロジェクト: DSMKexec/kexec-kernel-a850s
static void vpe_do_tasklet(unsigned long data)
{
	D("%s: irq_status = 0x%x",
		   __func__, vpe_ctrl->irq_status);
	if (vpe_ctrl->irq_status & 0x1)
		vpe_send_outmsg();

}
コード例 #3
0
ファイル: msm_vpe1.c プロジェクト: ARMP/samsung_kernel_cooper
static void vpe_do_tasklet(unsigned long data)
{
	unsigned long flags;
	uint32_t pyaddr, pcbcraddr, src_y, src_cbcr, temp;

	struct vpe_isr_queue_cmd_type *qcmd = NULL;

	CDBG("=== vpe_do_tasklet start === \n");

	spin_lock_irqsave(&vpe_ctrl->tasklet_lock, flags);
	qcmd = list_first_entry(&vpe_ctrl->tasklet_q,
		struct vpe_isr_queue_cmd_type, list);

	if (!qcmd) {
		spin_unlock_irqrestore(&vpe_ctrl->tasklet_lock, flags);
		return;
	}

	list_del(&qcmd->list);
	spin_unlock_irqrestore(&vpe_ctrl->tasklet_lock, flags);

	/* interrupt to be processed,  *qcmd has the payload.  */
	if (qcmd->irq_status & 0x1) {
		CDBG("vpe plane0 frame done.\n");

		pyaddr =
			msm_io_r(vpe_device->vpebase + VPE_OUTP0_ADDR_OFFSET);
		pcbcraddr =
			msm_io_r(vpe_device->vpebase + VPE_OUTP1_ADDR_OFFSET);

		if (vpe_ctrl->dis_en)
			pcbcraddr = vpe_ctrl->pcbcr_before_dis;

		src_y =
			msm_io_r(vpe_device->vpebase + VPE_SRCP0_ADDR_OFFSET);
		src_cbcr =
			msm_io_r(vpe_device->vpebase + VPE_SRCP1_ADDR_OFFSET);

		msm_io_w(src_y,
				vpe_device->vpebase + VPE_OUTP0_ADDR_OFFSET);
		msm_io_w(src_cbcr,
				vpe_device->vpebase + VPE_OUTP1_ADDR_OFFSET);

		temp = msm_io_r(
		vpe_device->vpebase + VPE_OP_MODE_OFFSET) & 0xFFFFFFFC;
		msm_io_w(temp, vpe_device->vpebase + VPE_OP_MODE_OFFSET);
		CDBG("vpe send out msg.\n");
		/*  now pass this frame to msm_camera.c. */
		vpe_send_outmsg(MSG_ID_VPE_OUTPUT_V, pyaddr, pcbcraddr);
		vpe_ctrl->state = 0;   /* put it back to idle. */
	}
	kfree(qcmd);
}
コード例 #4
0
static void vpe_do_tasklet(unsigned long data)
{
	unsigned long flags;
	uint32_t pyaddr = 0, pcbcraddr = 0;
	uint32_t src_y, src_cbcr, temp;

	struct vpe_isr_queue_cmd_type *qcmd = NULL;

	CDBG("=== vpe_do_tasklet start === \n");

	spin_lock_irqsave(&vpe_ctrl->tasklet_lock, flags);
	qcmd = list_first_entry(&vpe_ctrl->tasklet_q,
		struct vpe_isr_queue_cmd_type, list);

	if (!qcmd) {
		spin_unlock_irqrestore(&vpe_ctrl->tasklet_lock, flags);
		return;
	}

	list_del(&qcmd->list);
	spin_unlock_irqrestore(&vpe_ctrl->tasklet_lock, flags);

	/* interrupt to be processed,  *qcmd has the payload.  */
	if (qcmd->irq_status & 0x1) {
		if (vpe_ctrl->output_type == OUTPUT_TYPE_ST_L) {
			CDBG("vpe left frame done.\n");
			vpe_ctrl->output_type = 0;
			CDBG("vpe send out msg.\n");
			orig_src_y = msm_io_r(vpe_device->vpebase +
				VPE_SRCP0_ADDR_OFFSET);
			orig_src_cbcr = msm_io_r(vpe_device->vpebase +
				VPE_SRCP1_ADDR_OFFSET);

			pyaddr = msm_io_r(vpe_device->vpebase +
				VPE_OUTP0_ADDR_OFFSET);
			pcbcraddr = msm_io_r(vpe_device->vpebase +
				VPE_OUTP1_ADDR_OFFSET);
			CDBG("%s: out_w = %d, out_h = %d\n", __func__,
				vpe_ctrl->out_w, vpe_ctrl->out_h);

			if ((vpe_ctrl->frame_pack == TOP_DOWN_FULL) ||
				(vpe_ctrl->frame_pack == TOP_DOWN_HALF)) {
				msm_io_w(pyaddr + (vpe_ctrl->out_w *
					vpe_ctrl->out_h), vpe_device->vpebase +
					VPE_OUTP0_ADDR_OFFSET);
				msm_io_w(pcbcraddr + (vpe_ctrl->out_w *
					vpe_ctrl->out_h/2),
					vpe_device->vpebase +
					VPE_OUTP1_ADDR_OFFSET);
			} else if ((vpe_ctrl->frame_pack ==
				SIDE_BY_SIDE_HALF) || (vpe_ctrl->frame_pack ==
				SIDE_BY_SIDE_FULL)) {
				msm_io_w(pyaddr + vpe_ctrl->out_w,
					vpe_device->vpebase +
					VPE_OUTP0_ADDR_OFFSET);
				msm_io_w(pcbcraddr + vpe_ctrl->out_w,
					vpe_device->vpebase +
					VPE_OUTP1_ADDR_OFFSET);
			} else
				CDBG("%s: Invalid packing = %d\n", __func__,
					vpe_ctrl->frame_pack);

			vpe_send_msg_no_payload(MSG_ID_VPE_OUTPUT_ST_L);
			vpe_ctrl->state = VPE_STATE_INIT;
			kfree(qcmd);
			return;
		} else if (vpe_ctrl->output_type == OUTPUT_TYPE_ST_R) {
			src_y = orig_src_y;
			src_cbcr = orig_src_cbcr;
			CDBG("%s: out_w = %d, out_h = %d\n", __func__,
				vpe_ctrl->out_w, vpe_ctrl->out_h);

			if ((vpe_ctrl->frame_pack == TOP_DOWN_FULL) ||
				(vpe_ctrl->frame_pack == TOP_DOWN_HALF)) {
				pyaddr = msm_io_r(vpe_device->vpebase +
					VPE_OUTP0_ADDR_OFFSET) -
					(vpe_ctrl->out_w * vpe_ctrl->out_h);
			} else if ((vpe_ctrl->frame_pack ==
				SIDE_BY_SIDE_HALF) || (vpe_ctrl->frame_pack ==
				SIDE_BY_SIDE_FULL)) {
				pyaddr = msm_io_r(vpe_device->vpebase +
				VPE_OUTP0_ADDR_OFFSET) - vpe_ctrl->out_w;
			} else
				CDBG("%s: Invalid packing = %d\n", __func__,
					vpe_ctrl->frame_pack);

			pcbcraddr = vpe_ctrl->pcbcr_before_dis;
		} else {
			src_y =	msm_io_r(vpe_device->vpebase +
				VPE_SRCP0_ADDR_OFFSET);
			src_cbcr = msm_io_r(vpe_device->vpebase +
				VPE_SRCP1_ADDR_OFFSET);
			pyaddr = msm_io_r(vpe_device->vpebase +
				VPE_OUTP0_ADDR_OFFSET);
			pcbcraddr = msm_io_r(vpe_device->vpebase +
				VPE_OUTP1_ADDR_OFFSET);
		}

		if (vpe_ctrl->dis_en)
			pcbcraddr = vpe_ctrl->pcbcr_before_dis;

		msm_io_w(src_y,
				vpe_device->vpebase + VPE_OUTP0_ADDR_OFFSET);
		msm_io_w(src_cbcr,
				vpe_device->vpebase + VPE_OUTP1_ADDR_OFFSET);

		temp = msm_io_r(vpe_device->vpebase + VPE_OP_MODE_OFFSET) &
			0xFFFFFFFC;
		msm_io_w(temp, vpe_device->vpebase + VPE_OP_MODE_OFFSET);

		/*  now pass this frame to msm_camera.c. */
		if (vpe_ctrl->output_type == OUTPUT_TYPE_ST_R) {
			CDBG("vpe send out R msg.\n");
			vpe_send_outmsg(MSG_ID_VPE_OUTPUT_ST_R, pyaddr,
				pcbcraddr);
		} else if (vpe_ctrl->output_type == OUTPUT_TYPE_V) {
			CDBG("vpe send out V msg.\n");
			vpe_send_outmsg(MSG_ID_VPE_OUTPUT_V, pyaddr, pcbcraddr);
		}

		vpe_ctrl->output_type = 0;
		vpe_ctrl->state = VPE_STATE_INIT;   /* put it back to idle. */

	}
	kfree(qcmd);
}