static int __atomisp_update_run_mode(struct atomisp_sub_device *asd) { struct atomisp_device *isp = asd->isp; struct v4l2_ctrl *ctrl = asd->run_mode; struct v4l2_ctrl *c; struct v4l2_streamparm p = {0}; int modes[] = { CI_MODE_NONE, CI_MODE_VIDEO, CI_MODE_STILL_CAPTURE, CI_MODE_CONTINUOUS, CI_MODE_PREVIEW }; s32 mode; if (ctrl->val != ATOMISP_RUN_MODE_VIDEO && asd->continuous_mode->val) mode = ATOMISP_RUN_MODE_PREVIEW; else mode = ctrl->val; c = v4l2_ctrl_find( isp->inputs[asd->input_curr].camera->ctrl_handler, V4L2_CID_RUN_MODE); if (c) return v4l2_ctrl_s_ctrl(c, mode); /* Fall back to obsolete s_parm */ p.parm.capture.capturemode = modes[mode]; return v4l2_subdev_call( isp->inputs[asd->input_curr].camera, video, s_parm, &p); }
int omap4iss_get_external_info(struct iss_pipeline *pipe, struct media_link *link) { struct iss_device *iss = container_of(pipe, struct iss_video, pipe)->iss; struct v4l2_subdev_format fmt; struct v4l2_ctrl *ctrl; int ret; if (!pipe->external) return 0; if (pipe->external_rate) return 0; memset(&fmt, 0, sizeof(fmt)); fmt.pad = link->source->index; fmt.which = V4L2_SUBDEV_FORMAT_ACTIVE; ret = v4l2_subdev_call(media_entity_to_v4l2_subdev(link->sink->entity), pad, get_fmt, NULL, &fmt); if (ret < 0) return -EPIPE; pipe->external_bpp = omap4iss_video_format_info(fmt.format.code)->bpp; ctrl = v4l2_ctrl_find(pipe->external->ctrl_handler, V4L2_CID_PIXEL_RATE); if (!ctrl) { dev_warn(iss->dev, "no pixel rate control in subdev %s\n", pipe->external->name); return -EPIPE; } pipe->external_rate = v4l2_ctrl_g_ctrl_int64(ctrl); return 0; }
static int ap1302_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct ap1302_device *dev; int ret; unsigned int i; dev_info(&client->dev, "ap1302 probe called.\n"); /* allocate device & init sub device */ dev = devm_kzalloc(&client->dev, sizeof(*dev), GFP_KERNEL); if (!dev) { dev_err(&client->dev, "%s: out of memory\n", __func__); return -ENOMEM; } mutex_init(&dev->input_lock); v4l2_i2c_subdev_init(&(dev->sd), client, &ap1302_ops); ret = ap1302_request_firmware(&(dev->sd)); if (ret) { dev_err(&client->dev, "Cannot request ap1302 firmware.\n"); goto out_free; } dev->regmap16 = devm_regmap_init_i2c(client, &ap1302_reg16_config); if (IS_ERR(dev->regmap16)) { ret = PTR_ERR(dev->regmap16); dev_err(&client->dev, "Failed to allocate 16bit register map: %d\n", ret); return ret; } dev->regmap32 = devm_regmap_init_i2c(client, &ap1302_reg32_config); if (IS_ERR(dev->regmap32)) { ret = PTR_ERR(dev->regmap32); dev_err(&client->dev, "Failed to allocate 32bit register map: %d\n", ret); return ret; } if (client->dev.platform_data) { ret = ap1302_s_config(&dev->sd, client->dev.platform_data); if (ret) goto out_free; } dev->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; dev->pad.flags = MEDIA_PAD_FL_SOURCE; dev->sd.entity.type = MEDIA_ENT_T_V4L2_SUBDEV_SENSOR; dev->cntx_res[CONTEXT_PREVIEW].res_num = ARRAY_SIZE(ap1302_preview_res); dev->cntx_res[CONTEXT_PREVIEW].res_table = ap1302_preview_res; dev->cntx_res[CONTEXT_SNAPSHOT].res_num = ARRAY_SIZE(ap1302_snapshot_res); dev->cntx_res[CONTEXT_SNAPSHOT].res_table = ap1302_snapshot_res; dev->cntx_res[CONTEXT_VIDEO].res_num = ARRAY_SIZE(ap1302_video_res); dev->cntx_res[CONTEXT_VIDEO].res_table = ap1302_video_res; ret = v4l2_ctrl_handler_init(&dev->ctrl_handler, ARRAY_SIZE(ctrls)); if (ret) { ap1302_remove(client); return ret; } for (i = 0; i < ARRAY_SIZE(ctrls); i++) v4l2_ctrl_new_custom(&dev->ctrl_handler, &ctrls[i], NULL); if (dev->ctrl_handler.error) { ap1302_remove(client); return dev->ctrl_handler.error; } /* Use same lock for controls as for everything else. */ dev->ctrl_handler.lock = &dev->input_lock; dev->sd.ctrl_handler = &dev->ctrl_handler; v4l2_ctrl_handler_setup(&dev->ctrl_handler); dev->run_mode = v4l2_ctrl_find(&dev->ctrl_handler, V4L2_CID_RUN_MODE); v4l2_ctrl_s_ctrl(dev->run_mode, ATOMISP_RUN_MODE_PREVIEW); ret = media_entity_init(&dev->sd.entity, 1, &dev->pad, 0); if (ret) ap1302_remove(client); return ret; out_free: v4l2_device_unregister_subdev(&dev->sd); return ret; }