Lines Matching +full:dphy +full:- +full:cfg
1 // SPDX-License-Identifier: (GPL-2.0+ OR MIT)
3 * Rockchip ISP1 Driver - CSI-2 Receiver
16 #include <linux/phy/phy-mipi-dphy.h>
18 #include <media/v4l2-ctrls.h>
19 #include <media/v4l2-fwnode.h>
21 #include "rkisp1-common.h"
22 #include "rkisp1-csi.h"
39 .pads = csi->pad_cfg in rkisp1_csi_get_pad_fmt()
42 lockdep_assert_held(&csi->lock); in rkisp1_csi_get_pad_fmt()
45 return v4l2_subdev_get_try_format(&csi->sd, sd_state, pad); in rkisp1_csi_get_pad_fmt()
47 return v4l2_subdev_get_try_format(&csi->sd, &state, pad); in rkisp1_csi_get_pad_fmt()
54 struct rkisp1_csi *csi = &rkisp1->csi; in rkisp1_csi_link_sensor()
57 s_asd->pixel_rate_ctrl = v4l2_ctrl_find(sd->ctrl_handler, in rkisp1_csi_link_sensor()
59 if (!s_asd->pixel_rate_ctrl) { in rkisp1_csi_link_sensor()
60 dev_err(rkisp1->dev, "No pixel rate control in subdev %s\n", in rkisp1_csi_link_sensor()
61 sd->name); in rkisp1_csi_link_sensor()
62 return -EINVAL; in rkisp1_csi_link_sensor()
66 ret = media_create_pad_link(&sd->entity, source_pad, in rkisp1_csi_link_sensor()
67 &csi->sd.entity, RKISP1_CSI_PAD_SINK, in rkisp1_csi_link_sensor()
68 !s_asd->index ? MEDIA_LNK_FL_ENABLED : 0); in rkisp1_csi_link_sensor()
70 dev_err(csi->rkisp1->dev, "failed to link src pad of %s\n", in rkisp1_csi_link_sensor()
71 sd->name); in rkisp1_csi_link_sensor()
81 struct rkisp1_device *rkisp1 = csi->rkisp1; in rkisp1_csi_config()
82 unsigned int lanes = sensor->lanes; in rkisp1_csi_config()
86 return -EINVAL; in rkisp1_csi_config()
88 mipi_ctrl = RKISP1_CIF_MIPI_CTRL_NUM_LANES(lanes - 1) | in rkisp1_csi_config()
95 /* V12 could also use a newer csi2-host, but we don't want that yet */ in rkisp1_csi_config()
96 if (rkisp1->info->isp_ver == RKISP1_V12) in rkisp1_csi_config()
101 RKISP1_CIF_MIPI_DATA_SEL_DT(csi->sink_fmt->mipi_dt) | in rkisp1_csi_config()
117 dev_dbg(rkisp1->dev, "\n MIPI_CTRL 0x%08x\n" in rkisp1_csi_config()
131 struct rkisp1_device *rkisp1 = csi->rkisp1; in rkisp1_csi_enable()
141 struct rkisp1_device *rkisp1 = csi->rkisp1; in rkisp1_csi_disable()
155 synchronize_irq(rkisp1->irqs[RKISP1_IRQ_MIPI]); in rkisp1_csi_disable()
168 struct rkisp1_device *rkisp1 = csi->rkisp1; in rkisp1_csi_start()
170 struct phy_configure_opts_mipi_dphy *cfg = &opts.mipi_dphy; in rkisp1_csi_start() local
178 pixel_clock = v4l2_ctrl_g_ctrl_int64(sensor->pixel_rate_ctrl); in rkisp1_csi_start()
180 dev_err(rkisp1->dev, "Invalid pixel rate value\n"); in rkisp1_csi_start()
181 return -EINVAL; in rkisp1_csi_start()
184 phy_mipi_dphy_get_default_config(pixel_clock, csi->sink_fmt->bus_width, in rkisp1_csi_start()
185 sensor->lanes, cfg); in rkisp1_csi_start()
186 phy_set_mode(csi->dphy, PHY_MODE_MIPI_DPHY); in rkisp1_csi_start()
187 phy_configure(csi->dphy, &opts); in rkisp1_csi_start()
188 phy_power_on(csi->dphy); in rkisp1_csi_start()
205 phy_power_off(csi->dphy); in rkisp1_csi_stop()
214 if (!rkisp1->irqs_enabled) in rkisp1_csi_isr()
224 * Disable DPHY errctrl interrupt, because this dphy in rkisp1_csi_isr()
233 rkisp1->csi.is_dphy_errctrl_disabled = true; in rkisp1_csi_isr()
237 * Enable DPHY errctrl interrupt again, if mipi have receive in rkisp1_csi_isr()
242 * Enable DPHY errctrl interrupt again, if mipi have receive in rkisp1_csi_isr()
245 if (rkisp1->csi.is_dphy_errctrl_disabled) { in rkisp1_csi_isr()
249 rkisp1->csi.is_dphy_errctrl_disabled = false; in rkisp1_csi_isr()
252 rkisp1->debug.mipi_error++; in rkisp1_csi_isr()
258 /* ----------------------------------------------------------------------------
270 if (code->pad == RKISP1_CSI_PAD_SRC) { in rkisp1_csi_enum_mbus_code()
273 if (code->index) in rkisp1_csi_enum_mbus_code()
274 return -EINVAL; in rkisp1_csi_enum_mbus_code()
276 mutex_lock(&csi->lock); in rkisp1_csi_enum_mbus_code()
280 code->which); in rkisp1_csi_enum_mbus_code()
281 code->code = sink_fmt->code; in rkisp1_csi_enum_mbus_code()
283 mutex_unlock(&csi->lock); in rkisp1_csi_enum_mbus_code()
293 return -EINVAL; in rkisp1_csi_enum_mbus_code()
295 if (!(fmt->direction & RKISP1_ISP_SD_SINK)) in rkisp1_csi_enum_mbus_code()
298 if (code->index == pos) { in rkisp1_csi_enum_mbus_code()
299 code->code = fmt->mbus_code; in rkisp1_csi_enum_mbus_code()
306 return -EINVAL; in rkisp1_csi_enum_mbus_code()
319 sink_fmt->width = RKISP1_DEFAULT_WIDTH; in rkisp1_csi_init_config()
320 sink_fmt->height = RKISP1_DEFAULT_HEIGHT; in rkisp1_csi_init_config()
321 sink_fmt->field = V4L2_FIELD_NONE; in rkisp1_csi_init_config()
322 sink_fmt->code = RKISP1_CSI_DEF_FMT; in rkisp1_csi_init_config()
335 mutex_lock(&csi->lock); in rkisp1_csi_get_fmt()
336 fmt->format = *rkisp1_csi_get_pad_fmt(csi, sd_state, fmt->pad, in rkisp1_csi_get_fmt()
337 fmt->which); in rkisp1_csi_get_fmt()
338 mutex_unlock(&csi->lock); in rkisp1_csi_get_fmt()
352 if (fmt->pad == RKISP1_CSI_PAD_SRC) in rkisp1_csi_set_fmt()
355 mutex_lock(&csi->lock); in rkisp1_csi_set_fmt()
358 fmt->which); in rkisp1_csi_set_fmt()
360 sink_fmt->code = fmt->format.code; in rkisp1_csi_set_fmt()
362 mbus_info = rkisp1_mbus_info_get_by_code(sink_fmt->code); in rkisp1_csi_set_fmt()
363 if (!mbus_info || !(mbus_info->direction & RKISP1_ISP_SD_SINK)) { in rkisp1_csi_set_fmt()
364 sink_fmt->code = RKISP1_CSI_DEF_FMT; in rkisp1_csi_set_fmt()
365 mbus_info = rkisp1_mbus_info_get_by_code(sink_fmt->code); in rkisp1_csi_set_fmt()
368 sink_fmt->width = clamp_t(u32, fmt->format.width, in rkisp1_csi_set_fmt()
371 sink_fmt->height = clamp_t(u32, fmt->format.height, in rkisp1_csi_set_fmt()
375 fmt->format = *sink_fmt; in rkisp1_csi_set_fmt()
377 if (fmt->which == V4L2_SUBDEV_FORMAT_ACTIVE) in rkisp1_csi_set_fmt()
378 csi->sink_fmt = mbus_info; in rkisp1_csi_set_fmt()
382 fmt->which); in rkisp1_csi_set_fmt()
385 mutex_unlock(&csi->lock); in rkisp1_csi_set_fmt()
390 /* ----------------------------------------------------------------------------
397 struct rkisp1_device *rkisp1 = csi->rkisp1; in rkisp1_csi_s_stream()
405 v4l2_subdev_call(csi->source, video, s_stream, false); in rkisp1_csi_s_stream()
412 source_pad = media_entity_remote_source_pad_unique(&sd->entity); in rkisp1_csi_s_stream()
414 dev_dbg(rkisp1->dev, "Failed to get source for CSI: %ld\n", in rkisp1_csi_s_stream()
416 return -EPIPE; in rkisp1_csi_s_stream()
419 source = media_entity_to_v4l2_subdev(source_pad->entity); in rkisp1_csi_s_stream()
422 return -EPIPE; in rkisp1_csi_s_stream()
427 return -EPIPE; in rkisp1_csi_s_stream()
430 if (source_asd->mbus_type != V4L2_MBUS_CSI2_DPHY) in rkisp1_csi_s_stream()
431 return -EINVAL; in rkisp1_csi_s_stream()
433 mutex_lock(&csi->lock); in rkisp1_csi_s_stream()
435 mutex_unlock(&csi->lock); in rkisp1_csi_s_stream()
445 csi->source = source; in rkisp1_csi_s_stream()
450 /* ----------------------------------------------------------------------------
476 struct rkisp1_csi *csi = &rkisp1->csi; in rkisp1_csi_register()
482 csi->rkisp1 = rkisp1; in rkisp1_csi_register()
483 mutex_init(&csi->lock); in rkisp1_csi_register()
485 sd = &csi->sd; in rkisp1_csi_register()
487 sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; in rkisp1_csi_register()
488 sd->entity.ops = &rkisp1_csi_media_ops; in rkisp1_csi_register()
489 sd->entity.function = MEDIA_ENT_F_VID_IF_BRIDGE; in rkisp1_csi_register()
490 sd->owner = THIS_MODULE; in rkisp1_csi_register()
491 strscpy(sd->name, RKISP1_CSI_DEV_NAME, sizeof(sd->name)); in rkisp1_csi_register()
493 pads = csi->pads; in rkisp1_csi_register()
499 csi->sink_fmt = rkisp1_mbus_info_get_by_code(RKISP1_CSI_DEF_FMT); in rkisp1_csi_register()
501 ret = media_entity_pads_init(&sd->entity, RKISP1_CSI_PAD_NUM, pads); in rkisp1_csi_register()
505 state.pads = csi->pad_cfg; in rkisp1_csi_register()
508 ret = v4l2_device_register_subdev(&csi->rkisp1->v4l2_dev, sd); in rkisp1_csi_register()
510 dev_err(sd->dev, "Failed to register csi receiver subdev\n"); in rkisp1_csi_register()
517 media_entity_cleanup(&sd->entity); in rkisp1_csi_register()
518 mutex_destroy(&csi->lock); in rkisp1_csi_register()
519 csi->rkisp1 = NULL; in rkisp1_csi_register()
525 struct rkisp1_csi *csi = &rkisp1->csi; in rkisp1_csi_unregister()
527 if (!csi->rkisp1) in rkisp1_csi_unregister()
530 v4l2_device_unregister_subdev(&csi->sd); in rkisp1_csi_unregister()
531 media_entity_cleanup(&csi->sd.entity); in rkisp1_csi_unregister()
532 mutex_destroy(&csi->lock); in rkisp1_csi_unregister()
537 struct rkisp1_csi *csi = &rkisp1->csi; in rkisp1_csi_init()
539 csi->rkisp1 = rkisp1; in rkisp1_csi_init()
541 csi->dphy = devm_phy_get(rkisp1->dev, "dphy"); in rkisp1_csi_init()
542 if (IS_ERR(csi->dphy)) in rkisp1_csi_init()
543 return dev_err_probe(rkisp1->dev, PTR_ERR(csi->dphy), in rkisp1_csi_init()
544 "Couldn't get the MIPI D-PHY\n"); in rkisp1_csi_init()
546 phy_init(csi->dphy); in rkisp1_csi_init()
553 struct rkisp1_csi *csi = &rkisp1->csi; in rkisp1_csi_cleanup()
555 phy_exit(csi->dphy); in rkisp1_csi_cleanup()