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; }
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(); }
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); }
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); }