Lines Matching refs:csi

50 	/* used to set csi ownership */
168 static int mei_csi_send(struct mei_csi *csi, u8 *buf, size_t len)
173 reinit_completion(&csi->cmd_completion);
175 ret = mei_cldev_send(csi->cldev, buf, len);
179 ret = wait_for_completion_killable_timeout(&csi->cmd_completion,
189 ret = csi->cmd_response.status;
195 if (csi->cmd_response.cmd_id != cmd->cmd_id)
203 static int csi_set_link_owner(struct mei_csi *csi, enum csi_link_owner owner)
213 mutex_lock(&csi->lock);
215 ret = mei_csi_send(csi, (u8 *)&cmd, cmd_size);
217 mutex_unlock(&csi->lock);
223 static int csi_set_link_cfg(struct mei_csi *csi)
230 cmd.param.conf.nr_of_lanes = csi->nr_of_lanes;
231 cmd.param.conf.link_freq = CSI_LINK_FREQ(csi->link_freq);
234 mutex_lock(&csi->lock);
236 ret = mei_csi_send(csi, (u8 *)&cmd, cmd_size);
245 mutex_unlock(&csi->lock);
253 struct mei_csi *csi = mei_cldev_get_drvdata(cldev);
266 csi->status = notif.cont.cont;
267 v4l2_ctrl_s_ctrl(csi->privacy_ctrl, csi->status);
272 memcpy(&csi->cmd_response, &notif, ret);
274 complete(&csi->cmd_completion);
283 struct mei_csi *csi = sd_to_csi(sd);
287 if (enable && csi->streaming == 0) {
288 freq = v4l2_get_link_freq(csi->remote->ctrl_handler, 0, 0);
290 dev_err(&csi->cldev->dev,
295 csi->link_freq = freq;
298 ret = csi_set_link_owner(csi, CSI_LINK_HOST);
303 ret = csi_set_link_cfg(csi);
307 ret = v4l2_subdev_call(csi->remote, video, s_stream, 1);
310 } else if (!enable && csi->streaming == 1) {
311 v4l2_subdev_call(csi->remote, video, s_stream, 0);
314 ret = csi_set_link_owner(csi, CSI_LINK_IVSC);
316 dev_warn(&csi->cldev->dev,
320 csi->streaming = enable;
325 csi_set_link_owner(csi, CSI_LINK_IVSC);
470 struct mei_csi *csi = ctrl_to_csi(ctrl);
474 if (!csi->remote)
477 freq = v4l2_get_link_freq(csi->remote->ctrl_handler, 0, 0);
479 dev_err(&csi->cldev->dev,
523 struct mei_csi *csi = notifier_to_csi(notifier);
531 csi->remote = subdev;
532 csi->remote_pad = pad;
535 &csi->subdev.entity, CSI_PAD_SINK,
544 struct mei_csi *csi = notifier_to_csi(notifier);
546 csi->remote = NULL;
554 static int mei_csi_init_controls(struct mei_csi *csi)
559 ret = v4l2_ctrl_handler_init(&csi->ctrl_handler, 2);
563 csi->ctrl_handler.lock = &csi->lock;
566 csi->freq_ctrl = v4l2_ctrl_new_int_menu(&csi->ctrl_handler,
572 if (csi->freq_ctrl)
573 csi->freq_ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY |
576 csi->privacy_ctrl = v4l2_ctrl_new_std(&csi->ctrl_handler, NULL,
578 if (csi->privacy_ctrl)
579 csi->privacy_ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY;
581 if (csi->ctrl_handler.error)
582 return csi->ctrl_handler.error;
584 csi->subdev.ctrl_handler = &csi->ctrl_handler;
589 static int mei_csi_parse_firmware(struct mei_csi *csi)
594 struct device *dev = &csi->cldev->dev;
605 v4l2_async_subdev_nf_init(&csi->notifier, &csi->subdev);
606 csi->notifier.ops = &mei_csi_notify_ops;
614 csi->nr_of_lanes = v4l2_ep.bus.mipi_csi2.num_data_lanes;
630 if (csi->nr_of_lanes != v4l2_ep.bus.mipi_csi2.num_data_lanes) {
634 csi->nr_of_lanes, v4l2_ep.bus.mipi_csi2.num_data_lanes);
638 asd = v4l2_async_nf_add_fwnode_remote(&csi->notifier, sink_ep,
645 ret = v4l2_async_nf_register(&csi->notifier);
654 v4l2_async_nf_cleanup(&csi->notifier);
664 struct mei_csi *csi;
670 csi = devm_kzalloc(dev, sizeof(struct mei_csi), GFP_KERNEL);
671 if (!csi)
674 csi->cldev = cldev;
675 mutex_init(&csi->lock);
676 init_completion(&csi->cmd_completion);
678 mei_cldev_set_drvdata(cldev, csi);
692 ret = mei_csi_parse_firmware(csi);
696 csi->subdev.dev = &cldev->dev;
697 csi->subdev.state_lock = &csi->lock;
698 v4l2_subdev_init(&csi->subdev, &mei_csi_subdev_ops);
699 csi->subdev.internal_ops = &mei_csi_internal_ops;
700 v4l2_set_subdevdata(&csi->subdev, csi);
701 csi->subdev.flags = V4L2_SUBDEV_FL_HAS_DEVNODE |
703 csi->subdev.entity.function = MEDIA_ENT_F_VID_IF_BRIDGE;
704 csi->subdev.entity.ops = &mei_csi_entity_ops;
706 snprintf(csi->subdev.name, sizeof(csi->subdev.name),
709 ret = mei_csi_init_controls(csi);
713 csi->pads[CSI_PAD_SOURCE].flags = MEDIA_PAD_FL_SOURCE;
714 csi->pads[CSI_PAD_SINK].flags = MEDIA_PAD_FL_SINK;
715 ret = media_entity_pads_init(&csi->subdev.entity, CSI_NUM_PADS,
716 csi->pads);
720 ret = v4l2_subdev_init_finalize(&csi->subdev);
724 ret = v4l2_async_register_subdev(&csi->subdev);
733 v4l2_subdev_cleanup(&csi->subdev);
736 media_entity_cleanup(&csi->subdev.entity);
739 v4l2_ctrl_handler_free(&csi->ctrl_handler);
740 v4l2_async_nf_unregister(&csi->notifier);
741 v4l2_async_nf_cleanup(&csi->notifier);
747 mutex_destroy(&csi->lock);
754 struct mei_csi *csi = mei_cldev_get_drvdata(cldev);
756 v4l2_async_nf_unregister(&csi->notifier);
757 v4l2_async_nf_cleanup(&csi->notifier);
758 v4l2_ctrl_handler_free(&csi->ctrl_handler);
759 v4l2_async_unregister_subdev(&csi->subdev);
760 v4l2_subdev_cleanup(&csi->subdev);
761 media_entity_cleanup(&csi->subdev.entity);
765 mutex_destroy(&csi->lock);