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