static long msm_ispif_cmd(struct v4l2_subdev *sd, void *arg)
{
	long rc = 0;
	struct ispif_cfg_data *pcdata = (struct ispif_cfg_data *)arg;
	struct ispif_device *ispif =
		(struct ispif_device *)v4l2_get_subdevdata(sd);

	BUG_ON(!sd);
	BUG_ON(!pcdata);

	mutex_lock(&ispif->mutex);
	switch (pcdata->cfg_type) {
	case ISPIF_ENABLE_REG_DUMP:
		ispif->enb_dump_reg = pcdata->reg_dump; /* save dump config */
		break;
	case ISPIF_INIT:
		rc = msm_ispif_init(ispif, pcdata->csid_version);
		msm_ispif_io_dump_reg(ispif);
		break;
	case ISPIF_CFG:
		rc = msm_ispif_config(ispif, &pcdata->params);
		msm_ispif_io_dump_reg(ispif);
		break;
	case ISPIF_START_FRAME_BOUNDARY:
		rc = msm_ispif_start_frame_boundary(ispif, &pcdata->params);
		msm_ispif_io_dump_reg(ispif);
		break;
	case ISPIF_RESTART_FRAME_BOUNDARY:
		rc = msm_ispif_restart_frame_boundary(ispif, &pcdata->params);
		msm_ispif_io_dump_reg(ispif);
		break;

	case ISPIF_STOP_FRAME_BOUNDARY:
		rc = msm_ispif_stop_frame_boundary(ispif, &pcdata->params);
		msm_ispif_io_dump_reg(ispif);
		break;
	case ISPIF_STOP_IMMEDIATELY:
		rc = msm_ispif_stop_immediately(ispif, &pcdata->params);
		msm_ispif_io_dump_reg(ispif);
		break;
	case ISPIF_RELEASE:
		msm_ispif_release(ispif);
		break;
	case ISPIF_SET_VFE_INFO:
		rc = msm_ispif_set_vfe_info(ispif, &pcdata->vfe_info);
		break;
	default:
		pr_err("%s: invalid cfg_type\n", __func__);
		rc = -EINVAL;
		break;
	}
	mutex_unlock(&ispif->mutex);
	return rc;
}
Exemple #2
0
int msm_camio_enable(struct platform_device *pdev)
{
	int rc = 0;
	void __iomem *clkbase;
	struct msm_camera_sensor_info *sinfo = pdev->dev.platform_data;
	struct msm_camera_device_platform_data *camdev = sinfo->pdata;

	camio_dev = pdev;
	camio_ext = camdev->ioext;
	camio_clk = camdev->ioclk;

	clkbase = ioremap(0x4000000, 0x334);
	msm_io_w(0x0, clkbase + 0x204);
	msm_io_w(0x0, clkbase + 0x208);
	msm_io_w(0x0, clkbase + 0x20C);
	msm_io_w(0x0, clkbase + 0x210);

/* TODO */
	msm_camio_clk_enable(CAMIO_VFE_CLK);
	msm_camio_clk_enable(CAMIO_CSI0_VFE_CLK);
	msm_camio_clk_enable(CAMIO_CSI_SRC_CLK);
	msm_camio_clk_enable(CAMIO_CSI1_SRC_CLK);
	msm_camio_clk_enable(CAMIO_CSI0_CLK);
	msm_camio_clk_enable(CAMIO_CSI1_CLK);
	msm_camio_clk_enable(CAMIO_CSI_PIX_CLK);
	msm_camio_clk_enable(CAMIO_CSI_RDI_CLK);
	msm_camio_clk_enable(CAMIO_CSIPHY0_TIMER_CLK);
	msm_camio_clk_enable(CAMIO_CSIPHY1_TIMER_CLK);
	msm_camio_clk_enable(CAMIO_CSI0_PCLK);

	csidio = request_mem_region(camio_ext.csiphy,
		camio_ext.csisz, pdev->name);
	if (!csidio) {
		rc = -EBUSY;
		goto common_fail;
	}
	csidbase = ioremap(camio_ext.csiphy,
		camio_ext.csisz);
	if (!csidbase) {
		rc = -ENOMEM;
		goto csi_busy;
	}
	rc = request_irq(camio_ext.csiirq, msm_io_csi_irq,
		IRQF_TRIGGER_RISING, "csid", 0);
	if (rc < 0)
		goto csi_irq_fail;

	csiphyio = request_mem_region(camio_ext.csiphyphy,
		camio_ext.csiphysz, pdev->name);
	if (!csidio) {
		rc = -EBUSY;
		goto csi_irq_fail;
	}
	csiphybase = ioremap(camio_ext.csiphyphy,
		camio_ext.csiphysz);
	if (!csiphybase) {
		rc = -ENOMEM;
		goto csiphy_busy;
	}
	rc = request_irq(camio_ext.csiphyirq , msm_io_csiphy_irq,
		IRQF_TRIGGER_RISING, "csiphy", 0);
	if (rc < 0)
		goto csiphy_irq_fail;
	rc = msm_ispif_init(pdev);
	if (rc < 0)
		goto csiphy_irq_fail;
	CDBG("camio enable done\n");
	return 0;
csiphy_irq_fail:
	iounmap(csiphybase);
csiphy_busy:
	release_mem_region(camio_ext.csiphyphy, camio_ext.csiphysz);
csi_irq_fail:
	iounmap(csidbase);
csi_busy:
	release_mem_region(camio_ext.csiphy, camio_ext.csisz);
common_fail:
	msm_camio_clk_disable(CAMIO_CSI0_PCLK);
	msm_camio_clk_disable(CAMIO_CSIPHY1_TIMER_CLK);
	msm_camio_clk_disable(CAMIO_CSIPHY0_TIMER_CLK);
	msm_camio_clk_disable(CAMIO_CSI_RDI_CLK);
	msm_camio_clk_disable(CAMIO_CSI_PIX_CLK);
	msm_camio_clk_disable(CAMIO_CSI1_CLK);
	msm_camio_clk_disable(CAMIO_CSI0_CLK);
	msm_camio_clk_disable(CAMIO_CSI1_SRC_CLK);
	msm_camio_clk_disable(CAMIO_CSI_SRC_CLK);
	msm_camio_clk_disable(CAMIO_CSI0_VFE_CLK);
	msm_camio_clk_disable(CAMIO_VFE_CLK);
	msm_camera_vreg_disable();
	camdev->camera_gpio_off();
	return rc;
}