Lines Matching full:csi

4  * Intel Visual Sensing Controller CSI Linux driver
8 * To set ownership of CSI-2 link and to configure CSI-2 link, there
33 #define MEI_CSI_ENTITY_NAME "Intel IVSC CSI"
39 /* to setup CSI-2 link an extra delay needed and determined experimentally */
50 /* used to set csi ownership */
53 /* used to configure CSI-2 link */
60 /* CSI-2 link ownership definition */
79 /* configuration of the CSI-2 link between host and IVSC */
81 /* number of data lanes used on the CSI-2 link */
84 /* frequency of the CSI-2 link */
91 /* CSI command structure */
100 /* CSI notification structure */
133 /* number of data lanes used on the CSI-2 link */
135 /* frequency of the CSI-2 link */
169 static int mei_csi_send(struct mei_csi *csi, u8 *buf, size_t len) in mei_csi_send() argument
174 reinit_completion(&csi->cmd_completion); in mei_csi_send()
176 ret = mei_cldev_send(csi->cldev, buf, len); in mei_csi_send()
180 ret = wait_for_completion_killable_timeout(&csi->cmd_completion, in mei_csi_send()
190 ret = csi->cmd_response.status; in mei_csi_send()
196 if (csi->cmd_response.cmd_id != cmd->cmd_id) in mei_csi_send()
203 /* set CSI-2 link ownership */
204 static int csi_set_link_owner(struct mei_csi *csi, enum csi_link_owner owner) in csi_set_link_owner() argument
214 mutex_lock(&csi->lock); in csi_set_link_owner()
216 ret = mei_csi_send(csi, (u8 *)&cmd, cmd_size); in csi_set_link_owner()
218 mutex_unlock(&csi->lock); in csi_set_link_owner()
223 /* configure CSI-2 link between host and IVSC */
224 static int csi_set_link_cfg(struct mei_csi *csi) in csi_set_link_cfg() argument
231 cmd.param.conf.nr_of_lanes = csi->nr_of_lanes; in csi_set_link_cfg()
232 cmd.param.conf.link_freq = CSI_LINK_FREQ(csi->link_freq); in csi_set_link_cfg()
235 mutex_lock(&csi->lock); in csi_set_link_cfg()
237 ret = mei_csi_send(csi, (u8 *)&cmd, cmd_size); in csi_set_link_cfg()
246 mutex_unlock(&csi->lock); in csi_set_link_cfg()
254 struct mei_csi *csi = mei_cldev_get_drvdata(cldev); in mei_csi_rx() local
267 csi->status = notif.cont.cont; in mei_csi_rx()
268 v4l2_ctrl_s_ctrl(csi->privacy_ctrl, csi->status); in mei_csi_rx()
273 memcpy(&csi->cmd_response, &notif, ret); in mei_csi_rx()
275 complete(&csi->cmd_completion); in mei_csi_rx()
284 struct mei_csi *csi = sd_to_csi(sd); in mei_csi_set_stream() local
288 if (enable && csi->streaming == 0) { in mei_csi_set_stream()
289 freq = v4l2_get_link_freq(csi->remote->ctrl_handler, 0, 0); in mei_csi_set_stream()
291 dev_err(&csi->cldev->dev, in mei_csi_set_stream()
296 csi->link_freq = freq; in mei_csi_set_stream()
298 /* switch CSI-2 link to host */ in mei_csi_set_stream()
299 ret = csi_set_link_owner(csi, CSI_LINK_HOST); in mei_csi_set_stream()
303 /* configure CSI-2 link */ in mei_csi_set_stream()
304 ret = csi_set_link_cfg(csi); in mei_csi_set_stream()
308 ret = v4l2_subdev_call(csi->remote, video, s_stream, 1); in mei_csi_set_stream()
311 } else if (!enable && csi->streaming == 1) { in mei_csi_set_stream()
312 v4l2_subdev_call(csi->remote, video, s_stream, 0); in mei_csi_set_stream()
314 /* switch CSI-2 link to IVSC */ in mei_csi_set_stream()
315 ret = csi_set_link_owner(csi, CSI_LINK_IVSC); in mei_csi_set_stream()
317 dev_warn(&csi->cldev->dev, in mei_csi_set_stream()
321 csi->streaming = enable; in mei_csi_set_stream()
326 csi_set_link_owner(csi, CSI_LINK_IVSC); in mei_csi_set_stream()
337 struct mei_csi *csi = sd_to_csi(sd); in mei_csi_get_pad_format() local
343 return &csi->format_mbus[pad]; in mei_csi_get_pad_format()
353 struct mei_csi *csi = sd_to_csi(sd); in mei_csi_init_state() local
356 mutex_lock(&csi->lock); in mei_csi_init_state()
363 mutex_unlock(&csi->lock); in mei_csi_init_state()
373 struct mei_csi *csi = sd_to_csi(sd); in mei_csi_get_fmt() local
375 mutex_lock(&csi->lock); in mei_csi_get_fmt()
382 mutex_unlock(&csi->lock); in mei_csi_get_fmt()
393 struct mei_csi *csi = sd_to_csi(sd); in mei_csi_set_fmt() local
507 mutex_lock(&csi->lock); in mei_csi_set_fmt()
509 pad = &csi->pads[format->pad]; in mei_csi_set_fmt()
511 format->format = csi->format_mbus[CSI_PAD_SINK]; in mei_csi_set_fmt()
518 mutex_unlock(&csi->lock); in mei_csi_set_fmt()
525 struct mei_csi *csi = ctrl_to_csi(ctrl); in mei_csi_g_volatile_ctrl() local
529 if (!csi->remote) in mei_csi_g_volatile_ctrl()
532 freq = v4l2_get_link_freq(csi->remote->ctrl_handler, 0, 0); in mei_csi_g_volatile_ctrl()
534 dev_err(&csi->cldev->dev, in mei_csi_g_volatile_ctrl()
578 struct mei_csi *csi = notifier_to_csi(notifier); in mei_csi_notify_bound() local
586 csi->remote = subdev; in mei_csi_notify_bound()
587 csi->remote_pad = pad; in mei_csi_notify_bound()
590 &csi->subdev.entity, 1, in mei_csi_notify_bound()
599 struct mei_csi *csi = notifier_to_csi(notifier); in mei_csi_notify_unbind() local
601 csi->remote = NULL; in mei_csi_notify_unbind()
609 static int mei_csi_init_controls(struct mei_csi *csi) in mei_csi_init_controls() argument
614 ret = v4l2_ctrl_handler_init(&csi->ctrl_handler, 2); in mei_csi_init_controls()
618 csi->ctrl_handler.lock = &csi->lock; in mei_csi_init_controls()
621 csi->freq_ctrl = v4l2_ctrl_new_int_menu(&csi->ctrl_handler, in mei_csi_init_controls()
627 if (csi->freq_ctrl) in mei_csi_init_controls()
628 csi->freq_ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY | in mei_csi_init_controls()
631 csi->privacy_ctrl = v4l2_ctrl_new_std(&csi->ctrl_handler, NULL, in mei_csi_init_controls()
633 if (csi->privacy_ctrl) in mei_csi_init_controls()
634 csi->privacy_ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY; in mei_csi_init_controls()
636 if (csi->ctrl_handler.error) in mei_csi_init_controls()
637 return csi->ctrl_handler.error; in mei_csi_init_controls()
639 csi->subdev.ctrl_handler = &csi->ctrl_handler; in mei_csi_init_controls()
644 static int mei_csi_parse_firmware(struct mei_csi *csi) in mei_csi_parse_firmware() argument
649 struct device *dev = &csi->cldev->dev; in mei_csi_parse_firmware()
660 v4l2_async_subdev_nf_init(&csi->notifier, &csi->subdev); in mei_csi_parse_firmware()
661 csi->notifier.ops = &mei_csi_notify_ops; in mei_csi_parse_firmware()
669 csi->nr_of_lanes = v4l2_ep.bus.mipi_csi2.num_data_lanes; in mei_csi_parse_firmware()
685 if (csi->nr_of_lanes != v4l2_ep.bus.mipi_csi2.num_data_lanes) { in mei_csi_parse_firmware()
689 csi->nr_of_lanes, v4l2_ep.bus.mipi_csi2.num_data_lanes); in mei_csi_parse_firmware()
693 asd = v4l2_async_nf_add_fwnode_remote(&csi->notifier, sink_ep, in mei_csi_parse_firmware()
700 ret = v4l2_async_nf_register(&csi->notifier); in mei_csi_parse_firmware()
709 v4l2_async_nf_cleanup(&csi->notifier); in mei_csi_parse_firmware()
719 struct mei_csi *csi; in mei_csi_probe() local
725 csi = devm_kzalloc(dev, sizeof(struct mei_csi), GFP_KERNEL); in mei_csi_probe()
726 if (!csi) in mei_csi_probe()
729 csi->cldev = cldev; in mei_csi_probe()
730 mutex_init(&csi->lock); in mei_csi_probe()
731 init_completion(&csi->cmd_completion); in mei_csi_probe()
733 mei_cldev_set_drvdata(cldev, csi); in mei_csi_probe()
747 ret = mei_csi_parse_firmware(csi); in mei_csi_probe()
751 csi->subdev.dev = &cldev->dev; in mei_csi_probe()
752 v4l2_subdev_init(&csi->subdev, &mei_csi_subdev_ops); in mei_csi_probe()
753 csi->subdev.internal_ops = &mei_csi_internal_ops; in mei_csi_probe()
754 v4l2_set_subdevdata(&csi->subdev, csi); in mei_csi_probe()
755 csi->subdev.flags = V4L2_SUBDEV_FL_HAS_DEVNODE | in mei_csi_probe()
757 csi->subdev.entity.function = MEDIA_ENT_F_VID_IF_BRIDGE; in mei_csi_probe()
758 csi->subdev.entity.ops = &mei_csi_entity_ops; in mei_csi_probe()
760 snprintf(csi->subdev.name, sizeof(csi->subdev.name), in mei_csi_probe()
763 ret = mei_csi_init_controls(csi); in mei_csi_probe()
767 csi->format_mbus[CSI_PAD_SOURCE] = mei_csi_format_mbus_default; in mei_csi_probe()
768 csi->format_mbus[CSI_PAD_SINK] = mei_csi_format_mbus_default; in mei_csi_probe()
770 csi->pads[CSI_PAD_SOURCE].flags = MEDIA_PAD_FL_SOURCE; in mei_csi_probe()
771 csi->pads[CSI_PAD_SINK].flags = MEDIA_PAD_FL_SINK; in mei_csi_probe()
772 ret = media_entity_pads_init(&csi->subdev.entity, CSI_NUM_PADS, in mei_csi_probe()
773 csi->pads); in mei_csi_probe()
777 ret = v4l2_subdev_init_finalize(&csi->subdev); in mei_csi_probe()
781 ret = v4l2_async_register_subdev(&csi->subdev); in mei_csi_probe()
790 v4l2_subdev_cleanup(&csi->subdev); in mei_csi_probe()
793 media_entity_cleanup(&csi->subdev.entity); in mei_csi_probe()
796 v4l2_ctrl_handler_free(&csi->ctrl_handler); in mei_csi_probe()
797 v4l2_async_nf_unregister(&csi->notifier); in mei_csi_probe()
798 v4l2_async_nf_cleanup(&csi->notifier); in mei_csi_probe()
804 mutex_destroy(&csi->lock); in mei_csi_probe()
811 struct mei_csi *csi = mei_cldev_get_drvdata(cldev); in mei_csi_remove() local
813 v4l2_async_nf_unregister(&csi->notifier); in mei_csi_remove()
814 v4l2_async_nf_cleanup(&csi->notifier); in mei_csi_remove()
815 v4l2_ctrl_handler_free(&csi->ctrl_handler); in mei_csi_remove()
816 v4l2_async_unregister_subdev(&csi->subdev); in mei_csi_remove()
817 v4l2_subdev_cleanup(&csi->subdev); in mei_csi_remove()
818 media_entity_cleanup(&csi->subdev.entity); in mei_csi_remove()
822 mutex_destroy(&csi->lock); in mei_csi_remove()
846 MODULE_DESCRIPTION("Device driver for IVSC CSI");