Lines Matching +full:data +full:- +full:lanes
1 // SPDX-License-Identifier: GPL-2.0
3 * Driver for Renesas R-Car MIPI CSI-2 Receiver
20 #include <media/mipi-csi2.h>
21 #include <media/v4l2-ctrls.h>
22 #include <media/v4l2-device.h>
23 #include <media/v4l2-fwnode.h>
24 #include <media/v4l2-mc.h>
25 #include <media/v4l2-subdev.h>
55 * Channel Data Type Select
56 * VCDT[0-15]: Channel 0 VCDT[16-31]: Channel 1
57 * VCDT2[0-15]: Channel 2 VCDT2[16-31]: Channel 3
66 /* Frame Data Type Select */
81 /* Long Data Type Setting 0 */
84 /* Long Data Type Setting 1 */
104 /* Short Packet Data */
137 u16 data; member
402 /* PHY Data Lane Monitor */
512 unsigned short lanes; member
528 return ioread32(priv->base + reg); in rcsi2_read()
531 static void rcsi2_write(struct rcar_csi2 *priv, unsigned int reg, u32 data) in rcsi2_write() argument
533 iowrite32(data, priv->base + reg); in rcsi2_write()
540 reset_control_assert(priv->rstc); in rcsi2_enter_standby()
542 pm_runtime_put(priv->dev); in rcsi2_enter_standby()
549 ret = pm_runtime_resume_and_get(priv->dev); in rcsi2_exit_standby()
553 reset_control_deassert(priv->rstc); in rcsi2_exit_standby()
559 unsigned int lanes) in rcsi2_wait_phy_start() argument
563 /* Wait for the clock and data lanes to enter LP-11 state. */ in rcsi2_wait_phy_start()
565 const u32 lane_mask = (1 << lanes) - 1; in rcsi2_wait_phy_start()
574 dev_err(priv->dev, "Timeout waiting for LP-11 state\n"); in rcsi2_wait_phy_start()
576 return -ETIMEDOUT; in rcsi2_wait_phy_start()
584 if (mbps < priv->info->hsfreqrange->mbps) in rcsi2_set_phypll()
585 dev_warn(priv->dev, "%u Mbps less than min PHY speed %u Mbps", in rcsi2_set_phypll()
586 mbps, priv->info->hsfreqrange->mbps); in rcsi2_set_phypll()
588 for (hsfreq = priv->info->hsfreqrange; hsfreq->mbps != 0; hsfreq++) { in rcsi2_set_phypll()
589 if (hsfreq->mbps >= mbps) in rcsi2_set_phypll()
594 if (!hsfreq->mbps) { in rcsi2_set_phypll()
595 dev_err(priv->dev, "Unsupported PHY speed (%u Mbps)", mbps); in rcsi2_set_phypll()
596 return -ERANGE; in rcsi2_set_phypll()
600 ((mbps - hsfreq_prev->mbps) <= (hsfreq->mbps - mbps))) in rcsi2_set_phypll()
603 rcsi2_write(priv, PHYPLL_REG, PHYPLL_HSFREQRANGE(hsfreq->reg)); in rcsi2_set_phypll()
609 unsigned int lanes) in rcsi2_calc_mbps() argument
615 if (!priv->remote) in rcsi2_calc_mbps()
616 return -ENODEV; in rcsi2_calc_mbps()
618 source = priv->remote; in rcsi2_calc_mbps()
621 ctrl = v4l2_ctrl_find(source->ctrl_handler, V4L2_CID_PIXEL_RATE); in rcsi2_calc_mbps()
623 dev_err(priv->dev, "no pixel rate control in subdev %s\n", in rcsi2_calc_mbps()
624 source->name); in rcsi2_calc_mbps()
625 return -EINVAL; in rcsi2_calc_mbps()
634 do_div(mbps, lanes * 1000000); in rcsi2_calc_mbps()
640 unsigned int *lanes) in rcsi2_get_active_lanes() argument
645 *lanes = priv->lanes; in rcsi2_get_active_lanes()
647 ret = v4l2_subdev_call(priv->remote, pad, get_mbus_config, in rcsi2_get_active_lanes()
648 priv->remote_pad, &mbus_config); in rcsi2_get_active_lanes()
649 if (ret == -ENOIOCTLCMD) { in rcsi2_get_active_lanes()
650 dev_dbg(priv->dev, "No remote mbus configuration available\n"); in rcsi2_get_active_lanes()
655 dev_err(priv->dev, "Failed to get remote mbus configuration\n"); in rcsi2_get_active_lanes()
660 dev_err(priv->dev, "Unsupported media bus type %u\n", in rcsi2_get_active_lanes()
662 return -EINVAL; in rcsi2_get_active_lanes()
665 if (mbus_config.bus.mipi_csi2.num_data_lanes > priv->lanes) { in rcsi2_get_active_lanes()
666 dev_err(priv->dev, in rcsi2_get_active_lanes()
667 "Unsupported mbus config: too many data lanes %u\n", in rcsi2_get_active_lanes()
669 return -EINVAL; in rcsi2_get_active_lanes()
672 *lanes = mbus_config.bus.mipi_csi2.num_data_lanes; in rcsi2_get_active_lanes()
681 unsigned int lanes; in rcsi2_start_receiver() local
685 dev_dbg(priv->dev, "Input size (%ux%u%c)\n", in rcsi2_start_receiver()
686 priv->mf.width, priv->mf.height, in rcsi2_start_receiver()
687 priv->mf.field == V4L2_FIELD_NONE ? 'p' : 'i'); in rcsi2_start_receiver()
690 format = rcsi2_code_to_fmt(priv->mf.code); in rcsi2_start_receiver()
692 return -EINVAL; in rcsi2_start_receiver()
695 * Enable all supported CSI-2 channels with virtual channel and in rcsi2_start_receiver()
696 * data type matching. in rcsi2_start_receiver()
702 for (i = 0; i < priv->info->num_channels; i++) { in rcsi2_start_receiver()
705 if (priv->channel_vc[i] < 0) in rcsi2_start_receiver()
708 vcdt_part = VCDT_SEL_VC(priv->channel_vc[i]) | VCDT_VCDTN_EN | in rcsi2_start_receiver()
709 VCDT_SEL_DTN_ON | VCDT_SEL_DT(format->datatype); in rcsi2_start_receiver()
718 if (priv->mf.field == V4L2_FIELD_ALTERNATE) { in rcsi2_start_receiver()
722 if (priv->mf.height == 240) in rcsi2_start_receiver()
729 * Get the number of active data lanes inspecting the remote mbus in rcsi2_start_receiver()
732 ret = rcsi2_get_active_lanes(priv, &lanes); in rcsi2_start_receiver()
737 phycnt |= (1 << lanes) - 1; in rcsi2_start_receiver()
739 mbps = rcsi2_calc_mbps(priv, format->bpp, lanes); in rcsi2_start_receiver()
752 if (!priv->info->use_isp) { in rcsi2_start_receiver()
758 /* Lanes are zero indexed. */ in rcsi2_start_receiver()
760 LSWAP_L0SEL(priv->lane_swap[0] - 1) | in rcsi2_start_receiver()
761 LSWAP_L1SEL(priv->lane_swap[1] - 1) | in rcsi2_start_receiver()
762 LSWAP_L2SEL(priv->lane_swap[2] - 1) | in rcsi2_start_receiver()
763 LSWAP_L3SEL(priv->lane_swap[3] - 1)); in rcsi2_start_receiver()
766 if (priv->info->init_phtw) { in rcsi2_start_receiver()
767 ret = priv->info->init_phtw(priv, mbps); in rcsi2_start_receiver()
772 if (priv->info->hsfreqrange) { in rcsi2_start_receiver()
778 if (priv->info->csi0clkfreqrange) in rcsi2_start_receiver()
780 CSI0CLKFREQRANGE(priv->info->csi0clkfreqrange)); in rcsi2_start_receiver()
782 if (priv->info->use_isp) in rcsi2_start_receiver()
794 ret = rcsi2_wait_phy_start(priv, lanes); in rcsi2_start_receiver()
798 if (priv->info->use_isp) in rcsi2_start_receiver()
802 if (priv->info->phy_post_init) { in rcsi2_start_receiver()
803 ret = priv->info->phy_post_init(priv); in rcsi2_start_receiver()
809 if (priv->info->clear_ulps) in rcsi2_start_receiver()
830 ret = v4l2_subdev_call(priv->remote, video, s_stream, 1); in rcsi2_start()
842 v4l2_subdev_call(priv->remote, video, s_stream, 0); in rcsi2_stop()
850 mutex_lock(&priv->lock); in rcsi2_s_stream()
852 if (!priv->remote) { in rcsi2_s_stream()
853 ret = -ENODEV; in rcsi2_s_stream()
857 if (enable && priv->stream_count == 0) { in rcsi2_s_stream()
861 } else if (!enable && priv->stream_count == 1) { in rcsi2_s_stream()
865 priv->stream_count += enable ? 1 : -1; in rcsi2_s_stream()
867 mutex_unlock(&priv->lock); in rcsi2_s_stream()
879 mutex_lock(&priv->lock); in rcsi2_set_pad_format()
881 if (!rcsi2_code_to_fmt(format->format.code)) in rcsi2_set_pad_format()
882 format->format.code = rcar_csi2_formats[0].code; in rcsi2_set_pad_format()
884 if (format->which == V4L2_SUBDEV_FORMAT_ACTIVE) { in rcsi2_set_pad_format()
885 priv->mf = format->format; in rcsi2_set_pad_format()
888 *framefmt = format->format; in rcsi2_set_pad_format()
891 mutex_unlock(&priv->lock); in rcsi2_set_pad_format()
902 mutex_lock(&priv->lock); in rcsi2_get_pad_format()
904 if (format->which == V4L2_SUBDEV_FORMAT_ACTIVE) in rcsi2_get_pad_format()
905 format->format = priv->mf; in rcsi2_get_pad_format()
907 format->format = *v4l2_subdev_get_try_format(sd, sd_state, 0); in rcsi2_get_pad_format()
909 mutex_unlock(&priv->lock); in rcsi2_get_pad_format()
928 static irqreturn_t rcsi2_irq(int irq, void *data) in rcsi2_irq() argument
930 struct rcar_csi2 *priv = data; in rcsi2_irq()
946 dev_info(priv->dev, "Transfer error, restarting CSI-2 receiver\n"); in rcsi2_irq()
951 static irqreturn_t rcsi2_irq_thread(int irq, void *data) in rcsi2_irq_thread() argument
953 struct rcar_csi2 *priv = data; in rcsi2_irq_thread()
955 mutex_lock(&priv->lock); in rcsi2_irq_thread()
959 dev_warn(priv->dev, "Failed to restart CSI-2 receiver\n"); in rcsi2_irq_thread()
960 mutex_unlock(&priv->lock); in rcsi2_irq_thread()
965 /* -----------------------------------------------------------------------------
976 pad = media_entity_get_fwnode_pad(&subdev->entity, asd->match.fwnode, in rcsi2_notify_bound()
979 dev_err(priv->dev, "Failed to find pad for %s\n", subdev->name); in rcsi2_notify_bound()
983 priv->remote = subdev; in rcsi2_notify_bound()
984 priv->remote_pad = pad; in rcsi2_notify_bound()
986 dev_dbg(priv->dev, "Bound %s pad: %d\n", subdev->name, pad); in rcsi2_notify_bound()
988 return media_create_pad_link(&subdev->entity, pad, in rcsi2_notify_bound()
989 &priv->subdev.entity, 0, in rcsi2_notify_bound()
1000 priv->remote = NULL; in rcsi2_notify_unbind()
1002 dev_dbg(priv->dev, "Unbind %s\n", subdev->name); in rcsi2_notify_unbind()
1016 if (vep->base.port || vep->base.id) in rcsi2_parse_v4l2()
1017 return -ENOTCONN; in rcsi2_parse_v4l2()
1019 if (vep->bus_type != V4L2_MBUS_CSI2_DPHY) { in rcsi2_parse_v4l2()
1020 dev_err(priv->dev, "Unsupported bus: %u\n", vep->bus_type); in rcsi2_parse_v4l2()
1021 return -EINVAL; in rcsi2_parse_v4l2()
1024 priv->lanes = vep->bus.mipi_csi2.num_data_lanes; in rcsi2_parse_v4l2()
1025 if (priv->lanes != 1 && priv->lanes != 2 && priv->lanes != 4) { in rcsi2_parse_v4l2()
1026 dev_err(priv->dev, "Unsupported number of data-lanes: %u\n", in rcsi2_parse_v4l2()
1027 priv->lanes); in rcsi2_parse_v4l2()
1028 return -EINVAL; in rcsi2_parse_v4l2()
1031 for (i = 0; i < ARRAY_SIZE(priv->lane_swap); i++) { in rcsi2_parse_v4l2()
1032 priv->lane_swap[i] = i < priv->lanes ? in rcsi2_parse_v4l2()
1033 vep->bus.mipi_csi2.data_lanes[i] : i; in rcsi2_parse_v4l2()
1036 if (priv->lane_swap[i] < 1 || priv->lane_swap[i] > 4) { in rcsi2_parse_v4l2()
1037 dev_err(priv->dev, "data-lanes must be in 1-4 range\n"); in rcsi2_parse_v4l2()
1038 return -EINVAL; in rcsi2_parse_v4l2()
1055 ep = fwnode_graph_get_endpoint_by_id(dev_fwnode(priv->dev), 0, 0, 0); in rcsi2_parse_dt()
1057 dev_err(priv->dev, "Not connected to subdevice\n"); in rcsi2_parse_dt()
1058 return -EINVAL; in rcsi2_parse_dt()
1063 dev_err(priv->dev, "Could not parse v4l2 endpoint\n"); in rcsi2_parse_dt()
1065 return -EINVAL; in rcsi2_parse_dt()
1077 dev_dbg(priv->dev, "Found '%pOF'\n", to_of_node(fwnode)); in rcsi2_parse_dt()
1079 v4l2_async_nf_init(&priv->notifier); in rcsi2_parse_dt()
1080 priv->notifier.ops = &rcar_csi2_notify_ops; in rcsi2_parse_dt()
1082 asd = v4l2_async_nf_add_fwnode(&priv->notifier, fwnode, in rcsi2_parse_dt()
1088 ret = v4l2_async_subdev_nf_register(&priv->subdev, &priv->notifier); in rcsi2_parse_dt()
1090 v4l2_async_nf_cleanup(&priv->notifier); in rcsi2_parse_dt()
1095 /* -----------------------------------------------------------------------------
1101 static int rcsi2_phtw_write(struct rcar_csi2 *priv, u16 data, u16 code) in rcsi2_phtw_write() argument
1106 PHTW_DWEN | PHTW_TESTDIN_DATA(data) | in rcsi2_phtw_write()
1117 dev_err(priv->dev, "Timeout waiting for PHTW_DWEN and/or PHTW_CWEN\n"); in rcsi2_phtw_write()
1119 return -ETIMEDOUT; in rcsi2_phtw_write()
1128 for (value = values; value->data || value->code; value++) { in rcsi2_phtw_write_array()
1129 ret = rcsi2_phtw_write(priv, value->data, value->code); in rcsi2_phtw_write_array()
1143 for (value = values; value->mbps; value++) { in rcsi2_phtw_write_mbps()
1144 if (value->mbps >= mbps) in rcsi2_phtw_write_mbps()
1150 ((mbps - prev_value->mbps) <= (value->mbps - mbps))) in rcsi2_phtw_write_mbps()
1153 if (!value->mbps) { in rcsi2_phtw_write_mbps()
1154 dev_err(priv->dev, "Unsupported PHY speed (%u Mbps)", mbps); in rcsi2_phtw_write_mbps()
1155 return -ERANGE; in rcsi2_phtw_write_mbps()
1158 return rcsi2_phtw_write(priv, value->reg, code); in rcsi2_phtw_write_mbps()
1165 { .data = 0xcc, .code = 0xe2 }, in __rcsi2_init_phtw_h3_v3h_m3n()
1166 { .data = 0x01, .code = 0xe3 }, in __rcsi2_init_phtw_h3_v3h_m3n()
1167 { .data = 0x11, .code = 0xe4 }, in __rcsi2_init_phtw_h3_v3h_m3n()
1168 { .data = 0x01, .code = 0xe5 }, in __rcsi2_init_phtw_h3_v3h_m3n()
1169 { .data = 0x10, .code = 0x04 }, in __rcsi2_init_phtw_h3_v3h_m3n()
1174 { .data = 0x38, .code = 0x08 }, in __rcsi2_init_phtw_h3_v3h_m3n()
1175 { .data = 0x01, .code = 0x00 }, in __rcsi2_init_phtw_h3_v3h_m3n()
1176 { .data = 0x4b, .code = 0xac }, in __rcsi2_init_phtw_h3_v3h_m3n()
1177 { .data = 0x03, .code = 0x00 }, in __rcsi2_init_phtw_h3_v3h_m3n()
1178 { .data = 0x80, .code = 0x07 }, in __rcsi2_init_phtw_h3_v3h_m3n()
1220 { .data = 0xee, .code = 0x34 }, in rcsi2_phy_post_init_v3m_e3()
1221 { .data = 0xee, .code = 0x44 }, in rcsi2_phy_post_init_v3m_e3()
1222 { .data = 0xee, .code = 0x54 }, in rcsi2_phy_post_init_v3m_e3()
1223 { .data = 0xee, .code = 0x84 }, in rcsi2_phy_post_init_v3m_e3()
1224 { .data = 0xee, .code = 0x94 }, in rcsi2_phy_post_init_v3m_e3()
1236 { .data = 0xcc, .code = 0xe2 }, in rcsi2_init_phtw_v3u()
1241 { .data = 0x01, .code = 0xe3 }, in rcsi2_init_phtw_v3u()
1242 { .data = 0x11, .code = 0xe4 }, in rcsi2_init_phtw_v3u()
1243 { .data = 0x01, .code = 0xe5 }, in rcsi2_init_phtw_v3u()
1249 { .data = 0x38, .code = 0x08 }, in rcsi2_init_phtw_v3u()
1254 { .data = 0x01, .code = 0x00 }, in rcsi2_init_phtw_v3u()
1255 { .data = 0x4b, .code = 0xac }, in rcsi2_init_phtw_v3u()
1256 { .data = 0x03, .code = 0x00 }, in rcsi2_init_phtw_v3u()
1257 { .data = 0x80, .code = 0x07 }, in rcsi2_init_phtw_v3u()
1287 /* -----------------------------------------------------------------------------
1301 if (!is_media_entity_v4l2_video_device(remote->entity)) { in rcsi2_link_setup()
1302 dev_err(priv->dev, "Remote is not a video device\n"); in rcsi2_link_setup()
1303 return -EINVAL; in rcsi2_link_setup()
1306 vdev = media_entity_to_video_device(remote->entity); in rcsi2_link_setup()
1308 if (of_property_read_u32(vdev->dev_parent->of_node, "renesas,id", &id)) { in rcsi2_link_setup()
1309 dev_err(priv->dev, "No renesas,id, can't configure routing\n"); in rcsi2_link_setup()
1310 return -EINVAL; in rcsi2_link_setup()
1317 dev_dbg(priv->dev, in rcsi2_link_setup()
1319 return -EINVAL; in rcsi2_link_setup()
1322 vc = local->index - 1; in rcsi2_link_setup()
1324 dev_dbg(priv->dev, "Route VC%d to VIN%u on output channel %d\n", in rcsi2_link_setup()
1327 vc = -1; in rcsi2_link_setup()
1330 priv->channel_vc[channel] = vc; in rcsi2_link_setup()
1345 priv->base = devm_platform_ioremap_resource(pdev, 0); in rcsi2_probe_resources()
1346 if (IS_ERR(priv->base)) in rcsi2_probe_resources()
1347 return PTR_ERR(priv->base); in rcsi2_probe_resources()
1353 ret = devm_request_threaded_irq(&pdev->dev, irq, rcsi2_irq, in rcsi2_probe_resources()
1359 priv->rstc = devm_reset_control_get(&pdev->dev, NULL); in rcsi2_probe_resources()
1361 return PTR_ERR_OR_ZERO(priv->rstc); in rcsi2_probe_resources()
1432 .compatible = "renesas,r8a774a1-csi2",
1433 .data = &rcar_csi2_info_r8a7796,
1436 .compatible = "renesas,r8a774b1-csi2",
1437 .data = &rcar_csi2_info_r8a77965,
1440 .compatible = "renesas,r8a774c0-csi2",
1441 .data = &rcar_csi2_info_r8a77990,
1444 .compatible = "renesas,r8a774e1-csi2",
1445 .data = &rcar_csi2_info_r8a7795,
1448 .compatible = "renesas,r8a7795-csi2",
1449 .data = &rcar_csi2_info_r8a7795,
1452 .compatible = "renesas,r8a7796-csi2",
1453 .data = &rcar_csi2_info_r8a7796,
1456 .compatible = "renesas,r8a77961-csi2",
1457 .data = &rcar_csi2_info_r8a77961,
1460 .compatible = "renesas,r8a77965-csi2",
1461 .data = &rcar_csi2_info_r8a77965,
1464 .compatible = "renesas,r8a77970-csi2",
1465 .data = &rcar_csi2_info_r8a77970,
1468 .compatible = "renesas,r8a77980-csi2",
1469 .data = &rcar_csi2_info_r8a77980,
1472 .compatible = "renesas,r8a77990-csi2",
1473 .data = &rcar_csi2_info_r8a77990,
1476 .compatible = "renesas,r8a779a0-csi2",
1477 .data = &rcar_csi2_info_r8a779a0,
1486 .data = &rcar_csi2_info_r8a7795es1,
1490 .data = &rcar_csi2_info_r8a7795es2,
1502 priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); in rcsi2_probe()
1504 return -ENOMEM; in rcsi2_probe()
1506 priv->info = of_device_get_match_data(&pdev->dev); in rcsi2_probe()
1514 priv->info = attr->data; in rcsi2_probe()
1516 priv->dev = &pdev->dev; in rcsi2_probe()
1518 mutex_init(&priv->lock); in rcsi2_probe()
1519 priv->stream_count = 0; in rcsi2_probe()
1523 dev_err(priv->dev, "Failed to get resources\n"); in rcsi2_probe()
1533 priv->subdev.owner = THIS_MODULE; in rcsi2_probe()
1534 priv->subdev.dev = &pdev->dev; in rcsi2_probe()
1535 v4l2_subdev_init(&priv->subdev, &rcar_csi2_subdev_ops); in rcsi2_probe()
1536 v4l2_set_subdevdata(&priv->subdev, &pdev->dev); in rcsi2_probe()
1537 snprintf(priv->subdev.name, V4L2_SUBDEV_NAME_SIZE, "%s %s", in rcsi2_probe()
1538 KBUILD_MODNAME, dev_name(&pdev->dev)); in rcsi2_probe()
1539 priv->subdev.flags = V4L2_SUBDEV_FL_HAS_DEVNODE; in rcsi2_probe()
1541 priv->subdev.entity.function = MEDIA_ENT_F_PROC_VIDEO_PIXEL_FORMATTER; in rcsi2_probe()
1542 priv->subdev.entity.ops = &rcar_csi2_entity_ops; in rcsi2_probe()
1544 num_pads = priv->info->use_isp ? 2 : NR_OF_RCAR_CSI2_PAD; in rcsi2_probe()
1546 priv->pads[RCAR_CSI2_SINK].flags = MEDIA_PAD_FL_SINK; in rcsi2_probe()
1548 priv->pads[i].flags = MEDIA_PAD_FL_SOURCE; in rcsi2_probe()
1550 ret = media_entity_pads_init(&priv->subdev.entity, num_pads, in rcsi2_probe()
1551 priv->pads); in rcsi2_probe()
1555 for (i = 0; i < ARRAY_SIZE(priv->channel_vc); i++) in rcsi2_probe()
1556 priv->channel_vc[i] = -1; in rcsi2_probe()
1558 pm_runtime_enable(&pdev->dev); in rcsi2_probe()
1560 ret = v4l2_async_register_subdev(&priv->subdev); in rcsi2_probe()
1564 dev_info(priv->dev, "%d lanes found\n", priv->lanes); in rcsi2_probe()
1569 v4l2_async_nf_unregister(&priv->notifier); in rcsi2_probe()
1570 v4l2_async_nf_cleanup(&priv->notifier); in rcsi2_probe()
1572 mutex_destroy(&priv->lock); in rcsi2_probe()
1581 v4l2_async_nf_unregister(&priv->notifier); in rcsi2_remove()
1582 v4l2_async_nf_cleanup(&priv->notifier); in rcsi2_remove()
1583 v4l2_async_unregister_subdev(&priv->subdev); in rcsi2_remove()
1585 pm_runtime_disable(&pdev->dev); in rcsi2_remove()
1587 mutex_destroy(&priv->lock); in rcsi2_remove()
1596 .name = "rcar-csi2",
1605 MODULE_DESCRIPTION("Renesas R-Car MIPI CSI-2 receiver driver");