static int fimc_init_camera(struct fimc_control *ctrl) { struct fimc_global *fimc = get_fimc_dev(); struct s3c_platform_fimc *pdata; struct s3c_platform_camera *cam; struct v4l2_streamparm stream; int ret; pdata = to_fimc_plat(ctrl->dev); if (pdata->default_cam >= FIMC_MAXCAMS) { dev_err(ctrl->dev, "%s: invalid camera index\n", __func__); return -EINVAL; } if (!fimc->camera[pdata->default_cam]) { dev_err(ctrl->dev, "no external camera device\n"); return -ENODEV; } /* * ctrl->cam may not be null if already s_input called, * otherwise, that should be default_cam if ctrl->cam is null. */ if (!ctrl->cam) ctrl->cam = fimc->camera[pdata->default_cam]; cam = ctrl->cam; /* do nothing if already initialized */ if (cam->initialized) return 0; /* * WriteBack mode doesn't need to set clock and power, * but it needs to set source width, height depend on LCD resolution. */ if (cam->id == CAMERA_WB) { s3cfb_direct_ioctl(0, S3CFB_GET_LCD_WIDTH, (unsigned long)&cam->width); s3cfb_direct_ioctl(0, S3CFB_GET_LCD_HEIGHT, (unsigned long)&cam->height); cam->window.width = cam->width; cam->window.height = cam->height; cam->initialized = 1; return 0; } /* set rate for mclk */ if (cam->clk->set_rate) { clk_disable(cam->clk); cam->clk->set_rate(cam->clk, cam->clk_rate); clk_enable(cam->clk); dev_info(ctrl->dev, "clock for camera: %d\n", cam->clk_rate); } /* enable camera power if needed */ if (cam->cam_power) cam->cam_power(1); /* camera s/w reset*/ fimc_hwset_hw_reset(); /* subdev call for init */ ret = v4l2_subdev_call(cam->sd, core, init, 0); if (ret == -ENOIOCTLCMD) { dev_err(ctrl->dev, "%s: init subdev api not supported\n", __func__); return ret; } /*set resolution SVGA*/ stream.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; stream.parm.capture.capturemode = 0; ret = v4l2_subdev_call(cam->sd, video, s_parm, &stream); if (ret == -ENOIOCTLCMD) { dev_err(ctrl->dev, "%s: init subdev api not supported\n", __func__); return ret; } if (cam->type == CAM_TYPE_MIPI) { /* * subdev call for sleep/wakeup: * no error although no s_stream api support */ v4l2_subdev_call(cam->sd, video, s_stream, 0); s3c_csis_start(cam->mipi_lanes, cam->mipi_settle, \ cam->mipi_align, cam->width, cam->height); v4l2_subdev_call(cam->sd, video, s_stream, 1); } cam->initialized = 1; return 0; }
static int fimc_init_camera(struct fimc_control *ctrl) { struct fimc_global *fimc = get_fimc_dev(); struct s3c_platform_fimc *pdata; struct s3c_platform_camera *cam; int ret; #ifdef VIEW_FUNCTION_CALL printk("[FIMC_CAPTURE] %s(%d)\n", __func__, __LINE__); #endif pdata = to_fimc_plat(ctrl->dev); if (pdata->default_cam >= FIMC_MAXCAMS) { dev_err(ctrl->dev, "%s: invalid camera index\n", __func__); return -EINVAL; } if (!fimc->camera[pdata->default_cam]) { dev_err(ctrl->dev, "no external camera device\n"); return -ENODEV; } /* * ctrl->cam may not be null if already s_input called, * otherwise, that should be default_cam if ctrl->cam is null. */ if (!ctrl->cam) ctrl->cam = fimc->camera[pdata->default_cam]; cam = ctrl->cam; /* do nothing if already initialized */ if (cam->initialized) return 0; /* set rate for mclk */ if (cam->clk->set_rate) { cam->clk->set_rate(cam->clk, cam->clk_rate); clk_enable(cam->clk); dev_info(ctrl->dev, "clock for camera: %d\n", cam->clk_rate); } /* enable camera power if needed */ if (cam->cam_power) cam->cam_power(1); /* subdev call for init */ ret = v4l2_subdev_call(cam->sd, core, init, 0); if (ret == -ENOIOCTLCMD) { dev_err(ctrl->dev, "%s: init subdev api not supported\n", __func__); return ret; } if (cam->type == CAM_TYPE_MIPI) { /* * subdev call for sleep/wakeup: * no error although no s_stream api support */ v4l2_subdev_call(cam->sd, video, s_stream, 0); s3c_csis_start(cam->mipi_lanes, cam->mipi_settle, \ cam->mipi_align, cam->width, cam->height); v4l2_subdev_call(cam->sd, video, s_stream, 1); } cam->initialized = 1; return 0; }