static int vpe_start(void)
{
	/*  enable the frame irq, bit 0 = Display list 0 ROI done */
	msm_io_w(1, vpe_device->vpebase + VPE_INTR_ENABLE_OFFSET);
	msm_io_dump(vpe_device->vpebase + 0x10000, 0x250);
	/* this triggers the operation. */
	msm_io_w(1, vpe_device->vpebase + VPE_DL0_START_OFFSET);

	return 0;
}
Example #2
0
void msm_camio_csi_core_reset(void)
{
    uint32_t val;
    val = msm_io_r(MSM_MMSS_CLK_CTL_BASE + 0x210);
    msm_io_w(val | 0x1000100, MSM_MMSS_CLK_CTL_BASE + 0x210);
#if 0
    val = msm_io_r(clkctl + 0x20C);
    msm_io_w(val | 0x20000, clkctl + 0x20C);
#endif
}
Example #3
0
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);
}
Example #4
0
void msm_send_frame_to_vpe(uint32_t pyaddr, uint32_t pcbcraddr,
		struct timespec *ts, int output_type)
{
	uint32_t temp_pyaddr = 0, temp_pcbcraddr = 0;
	CDBG("[CAM] vpe input, pyaddr = 0x%x, pcbcraddr = 0x%x\n",
		pyaddr, pcbcraddr);
	msm_io_w(pyaddr, vpe_device->vpebase + VPE_SRCP0_ADDR_OFFSET);
	msm_io_w(pcbcraddr, vpe_device->vpebase + VPE_SRCP1_ADDR_OFFSET);
	if (vpe_ctrl->state == 1)
		pr_err("[CAM] =====VPE is busy!!!  Wrong!========\n");

	if (output_type != OUTPUT_TYPE_ST_R)
		vpe_ctrl->ts = *ts;

	if (output_type == OUTPUT_TYPE_ST_L) {
		vpe_ctrl->pcbcr_before_dis = msm_io_r(vpe_device->vpebase +
			VPE_OUTP1_ADDR_OFFSET);
		temp_pyaddr = msm_io_r(vpe_device->vpebase +
			VPE_OUTP0_ADDR_OFFSET);

		if (vpe_ctrl->frame_pack == TOP_DOWN_FULL)
			temp_pcbcraddr = temp_pyaddr + (vpe_ctrl->out_w * vpe_ctrl->out_h * 2);
		else if ((vpe_ctrl->frame_pack == SIDE_BY_SIDE_HALF) ||
				(vpe_ctrl->frame_pack == SIDE_BY_SIDE_FULL))
			temp_pcbcraddr = temp_pyaddr +
				PAD_TO_2K((vpe_ctrl->out_w * 2) * vpe_ctrl->out_h,
				vpe_ctrl->pad_2k_bool);
		else
			CDBG("[CAM] %s: Invalid Frame Packing = %d\n", __func__,
				 vpe_ctrl->frame_pack);

		msm_io_w(temp_pcbcraddr, vpe_device->vpebase +
			VPE_OUTP1_ADDR_OFFSET);
	}

	if (vpe_ctrl->dis_en) {
		/* Changing the VPE output CBCR address,
		to make Y/CBCR continuous */
		vpe_ctrl->pcbcr_before_dis = msm_io_r(vpe_device->vpebase +
			VPE_OUTP1_ADDR_OFFSET);
		temp_pyaddr = msm_io_r(vpe_device->vpebase +
			VPE_OUTP0_ADDR_OFFSET);
		temp_pcbcraddr = temp_pyaddr + vpe_ctrl->pcbcr_dis_offset;
		msm_io_w(temp_pcbcraddr, vpe_device->vpebase +
			VPE_OUTP1_ADDR_OFFSET);
	}

	vpe_ctrl->output_type = output_type;
	vpe_ctrl->state = 1;
	vpe_start();
}
Example #5
0
static void msm_camio_csi_disable(void)
{
	uint32_t val;

	val = 0x0;
	CDBG("%s MIPI_PHY_D0_CONTROL2 val=0x%x\n", __func__, val);
	msm_io_w(val, csibase + MIPI_PHY_D0_CONTROL2);
	msm_io_w(val, csibase + MIPI_PHY_D1_CONTROL2);
	msm_io_w(val, csibase + MIPI_PHY_D2_CONTROL2);
	msm_io_w(val, csibase + MIPI_PHY_D3_CONTROL2);

	CDBG("%s MIPI_PHY_CL_CONTROL val=0x%x\n", __func__, val);
	msm_io_w(val, csibase + MIPI_PHY_CL_CONTROL);
	msleep(10);

	val = msm_io_r(csibase + MIPI_PHY_D1_CONTROL);
	val &= ~((0x1 << MIPI_PHY_D1_CONTROL_MIPI_CLK_PHY_SHUTDOWNB_SHFT) |
	(0x1 << MIPI_PHY_D1_CONTROL_MIPI_DATA_PHY_SHUTDOWNB_SHFT));
	CDBG("%s MIPI_PHY_D1_CONTROL val=0x%x\n", __func__, val);
	msm_io_w(val, csibase + MIPI_PHY_D1_CONTROL);
	usleep_range(5000, 6000);
	msm_io_w(0x0, csibase + MIPI_INTERRUPT_MASK);
	msm_io_w(0x0, csibase + MIPI_INTERRUPT_STATUS);
	csi_free_irq();
	iounmap(csibase);
	release_mem_region(camio_ext.csiphy, camio_ext.csisz);
}
Example #6
0
static void vpe_config_axi_default(void)
{
	msm_io_w(0x25, vpe_ctrl->vpebase + VPE_AXI_ARB_2_OFFSET);
	CDBG("%s: yaddr %ld cbcraddr %ld", __func__,
		 vpe_ctrl->out_y_addr, vpe_ctrl->out_cbcr_addr);
	if (!vpe_ctrl->out_y_addr || !vpe_ctrl->out_cbcr_addr)
		return;
	msm_io_w(vpe_ctrl->out_y_addr,
		vpe_ctrl->vpebase + VPE_OUTP0_ADDR_OFFSET);
	
	msm_io_w(vpe_ctrl->out_cbcr_addr,
		vpe_ctrl->vpebase + VPE_OUTP1_ADDR_OFFSET);

}
Example #7
0
void msm_camio_disable(struct platform_device *pdev)
{
	uint32_t val;
	val = (0x0 << MIPI_CALIBRATION_CONTROL_SWCAL_CAL_EN_SHFT) |
		(0x0 <<
		MIPI_CALIBRATION_CONTROL_SWCAL_STRENGTH_OVERRIDE_EN_SHFT) |
		(0x0 << MIPI_CALIBRATION_CONTROL_CAL_SW_HW_MODE_SHFT) |
		(0x0 << MIPI_CALIBRATION_CONTROL_MANUAL_OVERRIDE_EN_SHFT);
	CDBG("%s MIPI_CALIBRATION_CONTROL val=0x%x\n", __func__, val);
	msm_io_w(val, csibase + MIPI_CALIBRATION_CONTROL);

	val = (20 <<
		MIPI_PHY_D0_CONTROL2_SETTLE_COUNT_SHFT) |
		(0x0F << MIPI_PHY_D0_CONTROL2_HS_TERM_IMP_SHFT) |
		(0x0 << MIPI_PHY_D0_CONTROL2_LP_REC_EN_SHFT) |
		(0x1 << MIPI_PHY_D0_CONTROL2_ERR_SOT_HS_EN_SHFT);
	CDBG("%s MIPI_PHY_D0_CONTROL2 val=0x%x\n", __func__, val);
	msm_io_w(val, csibase + MIPI_PHY_D0_CONTROL2);
	msm_io_w(val, csibase + MIPI_PHY_D1_CONTROL2);
	//msm_io_w(val, csibase + MIPI_PHY_D2_CONTROL2);
	//msm_io_w(val, csibase + MIPI_PHY_D3_CONTROL2);

	val = (0x0F << MIPI_PHY_CL_CONTROL_HS_TERM_IMP_SHFT) |
		(0x0 << MIPI_PHY_CL_CONTROL_LP_REC_EN_SHFT);
	CDBG("%s MIPI_PHY_CL_CONTROL val=0x%x\n", __func__, val);
	msm_io_w(val, csibase + MIPI_PHY_CL_CONTROL);
	msleep(10);

	val = msm_io_r(csibase + MIPI_PHY_D1_CONTROL);
	val &= ~((0x1 << MIPI_PHY_D1_CONTROL_MIPI_CLK_PHY_SHUTDOWNB_SHFT) |
	(0x1 << MIPI_PHY_D1_CONTROL_MIPI_DATA_PHY_SHUTDOWNB_SHFT));
	CDBG("%s MIPI_PHY_D1_CONTROL val=0x%x\n", __func__, val);
	msm_io_w(val, csibase + MIPI_PHY_D1_CONTROL);
	usleep_range(5000, 6000);
	free_irq(camio_ext.csiirq, 0);
	iounmap(csibase);
	release_mem_region(camio_ext.csiphy, camio_ext.csisz);
	CDBG("disable clocks\n");

	msm_camio_clk_disable(CAMIO_CSI0_VFE_CLK);
	msm_camio_clk_disable(CAMIO_CSI0_CLK);
	msm_camio_clk_disable(CAMIO_CSI1_VFE_CLK);
	msm_camio_clk_disable(CAMIO_CSI1_CLK);
	msm_camio_clk_disable(CAMIO_VFE_PCLK);
	msm_camio_clk_disable(CAMIO_CSI0_PCLK);
	msm_camio_clk_disable(CAMIO_CSI1_PCLK);
	msm_camio_clk_disable(CAMIO_CSI_SRC_CLK);
	msm_camio_clk_disable(CAMIO_VFE_CLK);
}
Example #8
0
void msm_camio_camif_pad_reg_reset_2(void)
{
	uint32_t reg;
	uint32_t mask, value;
	reg = (msm_io_r(camifpadbase)) & CAMIF_CFG_RMSK;
	mask = CAM_PAD_REG_SW_RESET_BMSK;
	value = 1 << CAM_PAD_REG_SW_RESET_SHFT;
	msm_io_w((reg & (~mask)) | (value & mask), camifpadbase);
	mdelay(10);
	reg = (msm_io_r(camifpadbase)) & CAMIF_CFG_RMSK;
	mask = CAM_PAD_REG_SW_RESET_BMSK;
	value = 0 << CAM_PAD_REG_SW_RESET_SHFT;
	msm_io_w((reg & (~mask)) | (value & mask), camifpadbase);
	mdelay(10);
}
Example #9
0
static irqreturn_t msm_csid_irq(int irq_num, void *data)
{
	uint32_t irq;
	struct csid_device *csid_dev = data;
	irq = msm_io_r(csid_dev->base + CSID_IRQ_STATUS_ADDR);
	CDBG("%s CSID_IRQ_STATUS_ADDR = 0x%x\n", __func__, irq);
	msm_io_w(irq, csid_dev->base + CSID_IRQ_CLEAR_CMD_ADDR);

	if (irq & 0x100) {
		printk(KERN_DEBUG "Long p.c.: %x, short : %x\n",
			msm_io_r(csid_dev->base + 0x74),
			msm_io_r(csid_dev->base + 0x70));
		msm_io_w(0x19 , csid_dev->base + 0x08);
	}
	return IRQ_HANDLED;
}
Example #10
0
static int msm_csid_cid_lut(
	struct msm_camera_csid_lut_params *csid_lut_params,
	void __iomem *csidbase)
{
	int rc = 0, i = 0;
	uint32_t val = 0;

	for (i = 0; i < csid_lut_params->num_cid && i < 4; i++) {
		if (csid_lut_params->vc_cfg[i].dt < 0x12 ||
			csid_lut_params->vc_cfg[i].dt > 0x37) {
			CDBG("%s: unsupported data type 0x%x\n",
				 __func__, csid_lut_params->vc_cfg[i].dt);
			return rc;
		}
		val = msm_io_r(csidbase + CSID_CID_LUT_VC_0_ADDR +
		(csid_lut_params->vc_cfg[i].cid >> 2) * 4)
		& ~(0xFF << csid_lut_params->vc_cfg[i].cid * 8);
		val |= csid_lut_params->vc_cfg[i].dt <<
			csid_lut_params->vc_cfg[i].cid * 8;
		msm_io_w(val, csidbase + CSID_CID_LUT_VC_0_ADDR +
			(csid_lut_params->vc_cfg[i].cid >> 2) * 4);
		val = csid_lut_params->vc_cfg[i].decode_format << 4 | 0x3;
		msm_io_w(val, csidbase + CSID_CID_n_CFG_ADDR +
			(csid_lut_params->vc_cfg[i].cid * 4));
	}
	return rc;
}
Example #11
0
static int msm_csid_config(struct csid_cfg_params *cfg_params)
{
	int rc = 0;
	uint32_t val = 0;
	struct csid_device *csid_dev;
	struct msm_camera_csid_params *csid_params;
	void __iomem *csidbase;
	csid_dev = v4l2_get_subdevdata(cfg_params->subdev);
	csidbase = csid_dev->base;
	if (csidbase == NULL)
		return -ENOMEM;	
	csid_params = cfg_params->parms;
	val = csid_params->lane_cnt - 1;
	val |= csid_params->lane_assign << 2;
	val |= 0x1 << 10;
	val |= 0x1 << 11;
	val |= 0x1 << 12;
	val |= 0x1 << 13;
	val |= 0x1 << 28;
	msm_io_w(val, csidbase + CSID_CORE_CTRL_ADDR);

	rc = msm_csid_cid_lut(&csid_params->lut_params, csidbase);
	if (rc < 0)
		return rc;

	msm_csid_set_debug_reg(csidbase, csid_params);

	return rc;
}
void msm_camio_mode_config(enum msm_cam_mode mode)
{
	uint32_t val;
	val = msm_io_r(s3d_ctl);
	if (mode == MODE_DUAL) {
		msm_io_w(val | 0x3, s3d_ctl);
	} else if (mode == MODE_L) {
		msm_io_w(((val | 0x2) & ~(0x1)), s3d_ctl);
		val = msm_io_r(s3d_ctl);
		CDBG("the camio mode config left value is %d\n", val);
	} else {
		msm_io_w(((val | 0x1) & ~(0x2)), s3d_ctl);
		val = msm_io_r(s3d_ctl);
		CDBG("the camio mode config right value is %d\n", val);
	}
}
void msm_vpe_offset_update(int frame_pack, uint32_t pyaddr, uint32_t pcbcraddr,
	struct timespec *ts, int output_id, struct msm_st_half st_half,
	int frameid)
{
	struct msm_vpe_buf_info vpe_buf;
	uint32_t input_stride;

	vpe_buf.vpe_crop.in2_w = st_half.stCropInfo.in_w;
	vpe_buf.vpe_crop.in2_h = st_half.stCropInfo.in_h;
	vpe_buf.vpe_crop.out2_w = st_half.stCropInfo.out_w;
	vpe_buf.vpe_crop.out2_h = st_half.stCropInfo.out_h;
	vpe_ctrl->dis_offset.dis_offset_x = st_half.pix_x_off;
	vpe_ctrl->dis_offset.dis_offset_y = st_half.pix_y_off;
	vpe_ctrl->dis_offset.frame_id = frameid;
	vpe_ctrl->frame_pack = frame_pack;
	vpe_ctrl->output_type = output_id;

	input_stride = (st_half.buf_cbcr_stride * (1<<16)) +
		st_half.buf_y_stride;

	msm_io_w(input_stride, vpe_device->vpebase + VPE_SRC_YSTRIDE1_OFFSET);

	vpe_update_scaler_with_dis(&(vpe_buf.vpe_crop),
		&(vpe_ctrl->dis_offset));

	msm_send_frame_to_vpe(pyaddr, pcbcraddr, ts, output_id);
}
Example #14
0
static irqreturn_t msm_io_csi_irq(int irq_num, void *data)
{
	uint32_t irq;
	irq = msm_io_r(csibase + MIPI_INTERRUPT_STATUS);
	CDBG("%s MIPI_INTERRUPT_STATUS = 0x%x\n", __func__, irq);
	msm_io_w(irq, csibase + MIPI_INTERRUPT_STATUS);
	return IRQ_HANDLED;
}
Example #15
0
static void msm_camio_csi_disable(void)
{
    uint32_t val;
    val = 0x0;
    CDBG("%s MIPI_PHY_D0_CONTROL2 val=0x%x\n", __func__, val);
    msm_io_w(val, csibase + MIPI_PHY_D0_CONTROL2);
    msm_io_w(val, csibase + MIPI_PHY_D1_CONTROL2);
    msm_io_w(val, csibase + MIPI_PHY_D2_CONTROL2);
    msm_io_w(val, csibase + MIPI_PHY_D3_CONTROL2);

    CDBG("%s MIPI_PHY_CL_CONTROL val=0x%x\n", __func__, val);
    msm_io_w(val, csibase + MIPI_PHY_CL_CONTROL);
    usleep_range(9000, 10000);
    free_irq(camio_ext.csiirq, 0);
    iounmap(csibase);
    release_mem_region(camio_ext.csiphy, camio_ext.csisz);
}
Example #16
0
int msm_camio_csi_enable_lp_rec(int lane_cnt)
{
    int rc = 0;
    uint32_t val = 0;
    pr_info("[CAM] msm_camio_csi_enable_lp_rec");
    val = (settle_cnt <<
		MIPI_PHY_D0_CONTROL2_SETTLE_COUNT_SHFT) |
		(hs_impedence_shift << MIPI_PHY_D0_CONTROL2_HS_TERM_IMP_SHFT) |
		(0x1 << MIPI_PHY_D0_CONTROL2_LP_REC_EN_SHFT) |
		(0x1 << MIPI_PHY_D0_CONTROL2_ERR_SOT_HS_EN_SHFT);
    CDBG("[CAM] %s MIPI_PHY_D0_CONTROL2 val=0x%x\n", __func__, val);
    msm_io_w(val, csibase + MIPI_PHY_D0_CONTROL2);
    msm_io_w(val, csibase + MIPI_PHY_D1_CONTROL2);

    /*HTC_START Horng 20110802*/
    /*Disable MIPI lane2,lane3 if not in use*/
    if (lane_cnt > 2) {
        msm_io_w(val, csibase + MIPI_PHY_D2_CONTROL2);
        msm_io_w(val, csibase + MIPI_PHY_D3_CONTROL2);
    } else {
        msm_io_w(0x00000000, csibase + MIPI_PHY_D2_CONTROL2);
        msm_io_w(0x00000000, csibase + MIPI_PHY_D3_CONTROL2);
    }
    /*HTC_END*/

    val = (0x0F << MIPI_PHY_CL_CONTROL_HS_TERM_IMP_SHFT) |
		(0x1 << MIPI_PHY_CL_CONTROL_LP_REC_EN_SHFT);
	CDBG("[CAM] %s MIPI_PHY_CL_CONTROL val=0x%x\n", __func__, val);
	msm_io_w(val, csibase + MIPI_PHY_CL_CONTROL);
    return rc;
}
static irqreturn_t msm_csiphy_irq(int irq_num, void *data)
{
	uint32_t irq;
	struct csiphy_device *csiphy_dev = data;
	irq = msm_io_r(csiphy_dev->base + MIPI_CSIPHY_INTERRUPT_STATUS0_ADDR);
	msm_io_w(irq, csiphy_dev->base + MIPI_CSIPHY_INTERRUPT_CLEAR0_ADDR);
	CDBG("%s MIPI_CSIPHY%d_INTERRUPT_STATUS0 = 0x%x\n",
		 __func__, csiphy_dev->pdev->id, irq);
	irq = msm_io_r(csiphy_dev->base + MIPI_CSIPHY_INTERRUPT_STATUS1_ADDR);
	msm_io_w(irq, csiphy_dev->base + MIPI_CSIPHY_INTERRUPT_CLEAR1_ADDR);
	CDBG("%s MIPI_CSIPHY%d_INTERRUPT_STATUS1 = 0x%x\n",
		__func__, csiphy_dev->pdev->id, irq);
	irq = msm_io_r(csiphy_dev->base + MIPI_CSIPHY_INTERRUPT_STATUS2_ADDR);
	msm_io_w(irq, csiphy_dev->base + MIPI_CSIPHY_INTERRUPT_CLEAR2_ADDR);
	CDBG("%s MIPI_CSIPHY%d_INTERRUPT_STATUS2 = 0x%x\n",
		__func__, csiphy_dev->pdev->id, irq);
	irq = msm_io_r(csiphy_dev->base + MIPI_CSIPHY_INTERRUPT_STATUS3_ADDR);
	msm_io_w(irq, csiphy_dev->base + MIPI_CSIPHY_INTERRUPT_CLEAR3_ADDR);
	CDBG("%s MIPI_CSIPHY%d_INTERRUPT_STATUS3 = 0x%x\n",
		__func__, csiphy_dev->pdev->id, irq);
	irq = msm_io_r(csiphy_dev->base + MIPI_CSIPHY_INTERRUPT_STATUS4_ADDR);
	msm_io_w(irq, csiphy_dev->base + MIPI_CSIPHY_INTERRUPT_CLEAR4_ADDR);
	CDBG("%s MIPI_CSIPHY%d_INTERRUPT_STATUS4 = 0x%x\n",
		__func__, csiphy_dev->pdev->id, irq);
	msm_io_w(0x1, csiphy_dev->base + 0x164);
	msm_io_w(0x0, csiphy_dev->base + 0x164);
	return IRQ_HANDLED;
}
void msm_camio_3d_disable(void)
{
	int32_t val = 0;
	msm_io_w((val & ~0x200), s3d_rw);
	iounmap(s3d_ctl);
	release_mem_region(s3dctl_mem->start, resource_size(s3dctl_mem));
	iounmap(s3d_rw);
	release_mem_region(s3drw_mem->start, resource_size(s3drw_mem));
}
Example #19
0
static irqreturn_t msm_csid_irq(int irq_num, void *data)
{
	uint32_t irq;
	struct csid_device *csid_dev = data;
	irq = msm_io_r(csid_dev->base + CSID_IRQ_STATUS_ADDR);
	CDBG("%s CSID_IRQ_STATUS_ADDR = 0x%x\n", __func__, irq);
	msm_io_w(irq, csid_dev->base + CSID_IRQ_CLEAR_CMD_ADDR);
	return IRQ_HANDLED;
}
Example #20
0
static int vpe_start(void)
{
#ifdef CONFIG_CAMERA_3D
	struct msm_sync *sync = (struct msm_sync *)vpe_ctrl->syncdata;
#endif
	/*  enable the frame irq, bit 0 = Display list 0 ROI done */
	msm_io_w(1, vpe_device->vpebase + VPE_INTR_ENABLE_OFFSET);
#ifdef CONFIG_CAMERA_3D
	if ((atomic_read(&sync->stereo_snap_state) == STEREO_SNAP_BUFFER1_PROCESSING) ||
		(atomic_read(&sync->stereo_snap_state) == STEREO_SNAP_BUFFER2_PROCESSING))
#endif
		msm_io_dump(vpe_device->vpebase + 0x10000, 0x250);

	/* this triggers the operation. */
	msm_io_w(1, vpe_device->vpebase + VPE_DL0_START_OFFSET);

	return 0;
}
Example #21
0
static irqreturn_t msm_io_csi_irq(int irq_num, void *data)
{
	uint32_t irq;
	irq = msm_io_r(csibase + MIPI_INTERRUPT_STATUS);
	CDBG("%s MIPI_INTERRUPT_STATUS = 0x%x\n", __func__, irq);

	if (irq & MIPI_IMASK_ERROR_OCCUR) {
		if (irq & MIPI_IMASK_ERR_SOT)
			pr_info("[CAM]msm_io_csi_irq: SOT error\n");
		if (irq & MIPI_IMASK_ERR_SOT_SYNC)
			pr_info("[CAM]msm_io_csi_irq: SOT SYNC error\n");
		if (irq & MIPI_IMASK_CLK_CTL_ERROR)
			pr_info("[CAM]msm_io_csi_irq: Clock lane ULPM mode sequence or command error\n");
		if (irq & MIPI_IMASK_DATA_CTL_ERROR)
			pr_info("[CAM]msm_io_csi_irq: Data lane ULPM mode sequence or command error\n");
#if 0
		if (irq & MIPI_IMASK_CLK_CMM_ERROR) /* defeatured */
			pr_err("[CAM]msm_io_csi_irq: Common mode error detected by PHY CLK lane\n");
		if (irq & MIPI_IMASK_DATA_CMM_ERROR) /* defeatured */
			pr_err("[CAM]msm_io_csi_irq: Common mode error detected by PHY data lane\n");
#endif
		if (irq & MIPI_IMASK_DL0_SYNC_ERROR)
			pr_info("[CAM]msm_io_csi_irq: An error occured while synchronizing data " \
				"from PHY to VFE clock domain on data lane 0\n");
		if (irq & MIPI_IMASK_DL1_SYNC_ERROR)
			pr_info("[CAM]msm_io_csi_irq: An error occured while synchronizing data " \
				"from PHY to VFE clock domain on data lane 1\n");
		if (irq & MIPI_IMASK_DL2_SYNC_ERROR)
			pr_info("[CAM]msm_io_csi_irq: An error occured while synchronizing data " \
				"from PHY to VFE clock domain on data lane 2\n");
		if (irq & MIPI_IMASK_DL3_SYNC_ERROR)
			pr_info("[CAM]msm_io_csi_irq: An error occured while synchronizing data " \
				"from PHY to VFE clock domain on data lane 3\n");
		if (irq & MIPI_IMASK_ECC_ERROR)
			pr_info("[CAM]msm_io_csi_irq: ECC error\n");
		if (irq & MIPI_IMASK_CRC_ERROR)
			pr_info("[CAM]msm_io_csi_irq: CRC error\n");
		if (irq & MIPI_IMASK_FRAME_SYNC_ERROR)
			pr_info("[CAM]msm_io_csi_irq: FS not paired with FE\n");
		if (irq & MIPI_IMASK_ID_ERROR)
			pr_info("[CAM]msm_io_csi_irq: Long packet ID not defined\n");
		if (irq & MIPI_IMASK_EOT_ERROR)
			pr_info("[CAM]msm_io_csi_irq: The received data is less than the value indicated by WC\n");
		if (irq & MIPI_IMASK_DL0_FIFO_OVERFLOW)
			pr_info("[CAM]msm_io_csi_irq: Data lane 0 FIFO overflow\n");
		if (irq & MIPI_IMASK_DL1_FIFO_OVERFLOW)
			pr_info("[CAM]msm_io_csi_irq: Data lane 1 FIFO overflow\n");
		if (irq & MIPI_IMASK_DL2_FIFO_OVERFLOW)
			pr_info("[CAM]msm_io_csi_irq: Data lane 2 FIFO overflow\n");
		if (irq & MIPI_IMASK_DL3_FIFO_OVERFLOW)
			pr_info("[CAM]msm_io_csi_irq: Data lane 3 FIFO overflow\n");
	}

	msm_io_w(irq, csibase + MIPI_INTERRUPT_STATUS);
	return IRQ_HANDLED;
}
int vpe_config_axi(struct axidata *ad)
{
	uint32_t p1;
	struct msm_pmem_region *regp1 = NULL;
	CDBG("vpe_config_axi:bufnum1 = %d.\n", ad->bufnum1);

	if (ad->bufnum1 != 1)
		return -EINVAL;

	regp1 = &(ad->region[0]);
	/* for video  Y address */
	p1 = (regp1->paddr + regp1->info.y_off);
	msm_io_w(p1, vpe_device->vpebase + VPE_OUTP0_ADDR_OFFSET);
	/* for video  CbCr address */
	p1 = (regp1->paddr + regp1->info.cbcr_off);
	msm_io_w(p1, vpe_device->vpebase + VPE_OUTP1_ADDR_OFFSET);

	return 0;
}
Example #23
0
void msm_camio_disable(struct platform_device *pdev)
{
	struct msm_camera_sensor_info *sinfo = pdev->dev.platform_data;
	struct msm_camera_device_platform_data *camdev = sinfo->pdata;

	if (!sinfo->csi_if) {
		msm_camio_clk_disable(CAMIO_VFE_CAMIF_CLK);
		iounmap(camifpadbase);
		release_mem_region(camio_ext.camifpadphy, camio_ext.camifpadsz);
	} else {
		uint32_t val;

		val = (20 << MIPI_PHY_D0_CONTROL2_SETTLE_COUNT_SHFT) |
			(0x0F << MIPI_PHY_D0_CONTROL2_HS_TERM_IMP_SHFT) |
			(0x0 << MIPI_PHY_D0_CONTROL2_LP_REC_EN_SHFT) |
			(0x1 << MIPI_PHY_D0_CONTROL2_ERR_SOT_HS_EN_SHFT);
		CDBG("%s MIPI_PHY_D0_CONTROL2 val=0x%x\n", __func__, val);
		msm_io_w(val, csibase + MIPI_PHY_D0_CONTROL2);
		msm_io_w(val, csibase + MIPI_PHY_D1_CONTROL2);
		msm_io_w(val, csibase + MIPI_PHY_D2_CONTROL2);
		msm_io_w(val, csibase + MIPI_PHY_D3_CONTROL2);

		val = (0x0F << MIPI_PHY_CL_CONTROL_HS_TERM_IMP_SHFT) |
			(0x0 << MIPI_PHY_CL_CONTROL_LP_REC_EN_SHFT);
		CDBG("%s MIPI_PHY_CL_CONTROL val=0x%x\n", __func__, val);
		msm_io_w(val, csibase + MIPI_PHY_CL_CONTROL);
		msleep(10);

		free_irq(camio_ext.csiirq, 0);
		msm_camio_clk_disable(CAMIO_CSI_PCLK);
		msm_camio_clk_disable(CAMIO_CSI_VFE_CLK);
		msm_camio_clk_disable(CAMIO_CSI_CLK);
		iounmap(csibase);
		release_mem_region(camio_ext.csiphy, camio_ext.csisz);
	}
	CDBG("disable clocks\n");

	msm_camio_clk_disable(CAMIO_VFE_CLK);
	msm_camio_clk_disable(CAMIO_CAM_MCLK_CLK);
	msm_camio_clk_disable(CAMIO_CAMIF_PAD_PBDG_CLK);
	msm_camio_clk_disable(CAMIO_VFE_PBDG_CLK);
	camdev->camera_gpio_off();
}
void msm_send_frame_to_vpe(uint32_t pyaddr, uint32_t pcbcraddr,
		struct timespec *ts, int output_type)
{
	uint32_t temp_pyaddr = 0, temp_pcbcraddr = 0;

	CDBG("vpe input, pyaddr = 0x%x, pcbcraddr = 0x%x\n",
		pyaddr, pcbcraddr);
	msm_io_w(pyaddr, vpe_device->vpebase + VPE_SRCP0_ADDR_OFFSET);
	msm_io_w(pcbcraddr, vpe_device->vpebase + VPE_SRCP1_ADDR_OFFSET);

	if (vpe_ctrl->state == VPE_STATE_ACTIVE)
		CDBG(" =====VPE is busy!!!  Wrong!========\n");

	if (output_type != OUTPUT_TYPE_ST_R)
		vpe_ctrl->ts = *ts;

	if (output_type == OUTPUT_TYPE_ST_L) {
		vpe_ctrl->pcbcr_before_dis = msm_io_r(vpe_device->vpebase +
			VPE_OUTP1_ADDR_OFFSET);
		temp_pyaddr = msm_io_r(vpe_device->vpebase +
			VPE_OUTP0_ADDR_OFFSET);
		temp_pcbcraddr = temp_pyaddr + PAD_TO_2K(vpe_ctrl->out_w *
			vpe_ctrl->out_h * 2, vpe_ctrl->pad_2k_bool);
		msm_io_w(temp_pcbcraddr, vpe_device->vpebase +
			VPE_OUTP1_ADDR_OFFSET);
	}

	if (vpe_ctrl->dis_en) {
		/* Changing the VPE output CBCR address,
		to make Y/CBCR continuous */
		vpe_ctrl->pcbcr_before_dis = msm_io_r(vpe_device->vpebase +
			VPE_OUTP1_ADDR_OFFSET);
		temp_pyaddr = msm_io_r(vpe_device->vpebase +
			VPE_OUTP0_ADDR_OFFSET);
		temp_pcbcraddr = temp_pyaddr + vpe_ctrl->pcbcr_dis_offset;
		msm_io_w(temp_pcbcraddr, vpe_device->vpebase +
			VPE_OUTP1_ADDR_OFFSET);
	}

	vpe_ctrl->output_type = output_type;
	vpe_ctrl->state = VPE_STATE_ACTIVE;
	vpe_start();
}
int32_t msm_camio_3d_enable(const struct msm_camera_sensor_info *s_info)
{
	int32_t val = 0, rc = 0;
	char s3drw[] = "s3d_rw";
	char s3dctl[] = "s3d_ctl";
	struct platform_device *pdev = camio_dev;
	pdev->resource = s_info->resource;
	pdev->num_resources = s_info->num_resources;

	s3drw_mem = platform_get_resource_byname(pdev, IORESOURCE_MEM, s3drw);
	if (!s3drw_mem) {
		pr_err("%s: no mem resource?\n", __func__);
		return -ENODEV;
	}
	s3dctl_mem = platform_get_resource_byname(pdev, IORESOURCE_MEM, s3dctl);
	if (!s3dctl_mem) {
		pr_err("%s: no mem resource?\n", __func__);
		return -ENODEV;
	}
	s3drw_io = request_mem_region(s3drw_mem->start,
		resource_size(s3drw_mem), pdev->name);
	if (!s3drw_io)
		return -EBUSY;

	s3d_rw = ioremap(s3drw_mem->start,
		resource_size(s3drw_mem));
	if (!s3d_rw) {
		rc = -ENOMEM;
		goto s3drw_nomem;
	}
	s3dctl_io = request_mem_region(s3dctl_mem->start,
		resource_size(s3dctl_mem), pdev->name);
	if (!s3dctl_io) {
		rc = -EBUSY;
		goto s3dctl_busy;
	}
	s3d_ctl = ioremap(s3dctl_mem->start,
		resource_size(s3dctl_mem));
	if (!s3d_ctl) {
		rc = -ENOMEM;
		goto s3dctl_nomem;
	}

	val = msm_io_r(s3d_rw);
	msm_io_w((val | 0x200), s3d_rw);
	return rc;

s3dctl_nomem:
	release_mem_region(s3dctl_mem->start, resource_size(s3dctl_mem));
s3dctl_busy:
	iounmap(s3d_rw);
s3drw_nomem:
	release_mem_region(s3drw_mem->start, resource_size(s3drw_mem));
return rc;
}
Example #26
0
static irqreturn_t vpe_parse_irq(int irq_num, void *data)
{
	vpe_ctrl->irq_status = msm_io_r_mb(vpe_ctrl->vpebase +
							VPE_INTR_STATUS_OFFSET);
	msm_io_w_mb(vpe_ctrl->irq_status, vpe_ctrl->vpebase +
				VPE_INTR_CLEAR_OFFSET);
	msm_io_w(0, vpe_ctrl->vpebase + VPE_INTR_ENABLE_OFFSET);
	CDBG("%s: vpe_parse_irq =0x%x.\n", __func__, vpe_ctrl->irq_status);
	tasklet_schedule(&vpe_tasklet);
	return IRQ_HANDLED;
}
static int msm_csiphy_release(struct v4l2_subdev *sd)
{
	struct csiphy_device *csiphy_dev;
	int i;
	csiphy_dev = v4l2_get_subdevdata(sd);
	for (i = 0; i < 4; i++)
		msm_io_w(0x0, csiphy_dev->base +
		MIPI_CSIPHY_LNn_CFG2_ADDR + 0x40*i);

	msm_io_w(0x0, csiphy_dev->base + MIPI_CSIPHY_LNCK_CFG2_ADDR);
	msm_io_w(0x0, csiphy_dev->base + MIPI_CSIPHY_GLBL_PWR_CFG_ADDR);

#if DBG_CSIPHY
	disable_irq(csiphy_dev->irq->start);
#endif
	msm_cam_clk_enable(&csiphy_dev->pdev->dev, csiphy_clk_info,
		csiphy_dev->csiphy_clk, ARRAY_SIZE(csiphy_clk_info), 0);

	iounmap(csiphy_dev->base);
	return 0;
}
Example #28
0
static irqreturn_t msm_csid_irq(int irq_num, void *data)
{
	uint32_t irq;
	struct csid_device *csid_dev = data;
	irq = msm_io_r(csid_dev->base + CSID_IRQ_STATUS_ADDR);
	CDBG("%s CSID%d_IRQ_STATUS_ADDR = 0x%x\n",
		 __func__, csid_dev->pdev->id, irq);
	if (irq & (0x1 << CSID_RST_DONE_IRQ_BITSHIFT))
			complete(&csid_dev->reset_complete);
	msm_io_w(irq, csid_dev->base + CSID_IRQ_CLEAR_CMD_ADDR);
	return IRQ_HANDLED;
}
Example #29
0
static int msm_csiphy_release(struct v4l2_subdev *sd)
{
	struct csiphy_device *csiphy_dev;
	int i;
	csiphy_dev = v4l2_get_subdevdata(sd);
	for (i = 0; i < 4; i++)
		msm_io_w(0x0, csiphy_dev->base +
		MIPI_CSIPHY_LNn_CFG2_ADDR + 0x40*i);

	msm_io_w(0x0, csiphy_dev->base + MIPI_CSIPHY_LNCK_CFG2_ADDR);
	msm_io_w(0x0, csiphy_dev->base + MIPI_CSIPHY_GLBL_PWR_CFG_ADDR);

#if DBG_CSIPHY
	disable_irq(csiphy_dev->irq->start);
#endif
	msm_cam_clk_enable(&csiphy_dev->pdev->dev, csiphy_clk_info,
		csiphy_dev->csiphy_clk, ARRAY_SIZE(csiphy_clk_info), 0);

	iounmap(csiphy_dev->base);
	csiphy_dev->base = NULL; /* LGE_CHANGE, Assign Null to unmapped addresses, 2012-05-14, [email protected] */
	return 0;
}
Example #30
0
void msm_camio_camif_pad_reg_reset(void)
{
	uint32_t reg;

	msm_camio_clk_sel(MSM_CAMIO_CLK_SRC_INTERNAL);
	msleep(10);

	reg = (msm_io_r(camifpadbase)) & CAMIF_CFG_RMSK;
	reg |= 0x3;
	msm_io_w(reg, camifpadbase);
	msleep(10);

	reg = (msm_io_r(camifpadbase)) & CAMIF_CFG_RMSK;
	reg |= 0x10;
	msm_io_w(reg, camifpadbase);
	msleep(10);

	reg = (msm_io_r(camifpadbase)) & CAMIF_CFG_RMSK;
	/* Need to be uninverted*/
	reg &= 0x03;
	msm_io_w(reg, camifpadbase);
	msleep(10);
}