Lines Matching +full:r8a77965 +full:- +full:csi2
1 // SPDX-License-Identifier: GPL-2.0
3 * Driver for Renesas R-Car MIPI CSI-2 Receiver
19 #include <media/mipi-csi2.h>
20 #include <media/v4l2-ctrls.h>
21 #include <media/v4l2-device.h>
22 #include <media/v4l2-fwnode.h>
23 #include <media/v4l2-mc.h>
24 #include <media/v4l2-subdev.h>
55 * VCDT[0-15]: Channel 0 VCDT[16-31]: Channel 1
56 * VCDT2[0-15]: Channel 2 VCDT2[16-31]: Channel 3
164 #define V4H_PPI_STARTUP_RW_COMMON_DPHY_REG(n) (0x21800 + ((n) * 2)) /* n = 0 - 9 */
178 #define V4H_CORE_DIG_IOCTRL_RW_AFE_LANE0_CTRL_2_REG(n) (0x22040 + ((n) * 2)) /* n = 0 - 15 */
179 #define V4H_CORE_DIG_IOCTRL_RW_AFE_LANE1_CTRL_2_REG(n) (0x22440 + ((n) * 2)) /* n = 0 - 15 */
180 #define V4H_CORE_DIG_IOCTRL_RW_AFE_LANE2_CTRL_2_REG(n) (0x22840 + ((n) * 2)) /* n = 0 - 15 */
181 #define V4H_CORE_DIG_IOCTRL_RW_AFE_LANE3_CTRL_2_REG(n) (0x22c40 + ((n) * 2)) /* n = 0 - 15 */
182 #define V4H_CORE_DIG_IOCTRL_RW_AFE_LANE4_CTRL_2_REG(n) (0x23040 + ((n) * 2)) /* n = 0 - 15 */
183 #define V4H_CORE_DIG_IOCTRL_RW_AFE_CB_CTRL_2_REG(n) (0x23840 + ((n) * 2)) /* n = 0 - 11 */
184 #define V4H_CORE_DIG_RW_COMMON_REG(n) (0x23880 + ((n) * 2)) /* n = 0 - 15 */
185 #define V4H_CORE_DIG_ANACTRL_RW_COMMON_ANACTRL_REG(n) (0x239e0 + ((n) * 2)) /* n = 0 - 3 */
188 /* V4H C-PHY */
189 #define V4H_CORE_DIG_RW_TRIO0_REG(n) (0x22100 + ((n) * 2)) /* n = 0 - 3 */
190 #define V4H_CORE_DIG_RW_TRIO1_REG(n) (0x22500 + ((n) * 2)) /* n = 0 - 3 */
191 #define V4H_CORE_DIG_RW_TRIO2_REG(n) (0x22900 + ((n) * 2)) /* n = 0 - 3 */
194 #define V4H_CORE_DIG_CLANE_0_RW_HS_RX_REG(n) (0x2a100 + ((n) * 2)) /* n = 0 - 6 */
197 #define V4H_CORE_DIG_CLANE_1_RW_HS_RX_REG(n) (0x2a500 + ((n) * 2)) /* n = 0 - 6 */
200 #define V4H_CORE_DIG_CLANE_2_RW_HS_RX_REG(n) (0x2a900 + ((n) * 2)) /* n = 0 - 6 */
757 /* Used together with R-Car ISP: one sink and one source pad. */ in rcsi2_num_pads()
758 if (priv->info->use_isp) in rcsi2_num_pads()
761 /* Used together with R-Car VIN: one sink and four source pads. */ in rcsi2_num_pads()
767 return ioread32(priv->base + reg); in rcsi2_read()
772 iowrite32(data, priv->base + reg); in rcsi2_write()
777 return ioread16(priv->base + reg); in rcsi2_read16()
782 iowrite16(data, priv->base + reg); in rcsi2_write16()
797 rcsi2_write(priv, priv->info->regs->phtw, in rcsi2_phtw_write()
803 if (!(rcsi2_read(priv, priv->info->regs->phtw) & (PHTW_DWEN | PHTW_CWEN))) in rcsi2_phtw_write()
809 dev_err(priv->dev, "Timeout waiting for PHTW_DWEN and/or PHTW_CWEN\n"); in rcsi2_phtw_write()
811 return -ETIMEDOUT; in rcsi2_phtw_write()
836 if (mbps < infotable->mbps) in rcsi2_mbps_to_info()
837 dev_warn(priv->dev, "%u Mbps less than min PHY speed %u Mbps", in rcsi2_mbps_to_info()
838 mbps, infotable->mbps); in rcsi2_mbps_to_info()
840 for (info = infotable; info->mbps != 0; info++) { in rcsi2_mbps_to_info()
841 if (info->mbps >= mbps) in rcsi2_mbps_to_info()
846 if (!info->mbps) { in rcsi2_mbps_to_info()
847 dev_err(priv->dev, "Unsupported PHY speed (%u Mbps)", mbps); in rcsi2_mbps_to_info()
851 if (prev && ((mbps - prev->mbps) <= (info->mbps - mbps))) in rcsi2_mbps_to_info()
865 if (priv->info->enter_standby) in rcsi2_enter_standby()
866 priv->info->enter_standby(priv); in rcsi2_enter_standby()
868 reset_control_assert(priv->rstc); in rcsi2_enter_standby()
870 pm_runtime_put(priv->dev); in rcsi2_enter_standby()
877 ret = pm_runtime_resume_and_get(priv->dev); in rcsi2_exit_standby()
881 reset_control_deassert(priv->rstc); in rcsi2_exit_standby()
891 /* Wait for the clock and data lanes to enter LP-11 state. */ in rcsi2_wait_phy_start()
893 const u32 lane_mask = (1 << lanes) - 1; in rcsi2_wait_phy_start()
902 dev_err(priv->dev, "Timeout waiting for LP-11 state\n"); in rcsi2_wait_phy_start()
904 return -ETIMEDOUT; in rcsi2_wait_phy_start()
911 info = rcsi2_mbps_to_info(priv, priv->info->hsfreqrange, mbps); in rcsi2_set_phypll()
913 return -ERANGE; in rcsi2_set_phypll()
915 rcsi2_write(priv, priv->info->regs->phypll, PHYPLL_HSFREQRANGE(info->reg)); in rcsi2_set_phypll()
927 if (!priv->remote) in rcsi2_calc_mbps()
928 return -ENODEV; in rcsi2_calc_mbps()
930 source = priv->remote; in rcsi2_calc_mbps()
933 ctrl = v4l2_ctrl_find(source->ctrl_handler, V4L2_CID_PIXEL_RATE); in rcsi2_calc_mbps()
935 dev_err(priv->dev, "no pixel rate control in subdev %s\n", in rcsi2_calc_mbps()
936 source->name); in rcsi2_calc_mbps()
937 return -EINVAL; in rcsi2_calc_mbps()
948 /* Adjust for C-PHY, divide by 2.8. */ in rcsi2_calc_mbps()
949 if (priv->cphy) in rcsi2_calc_mbps()
961 *lanes = priv->lanes; in rcsi2_get_active_lanes()
963 ret = v4l2_subdev_call(priv->remote, pad, get_mbus_config, in rcsi2_get_active_lanes()
964 priv->remote_pad, &mbus_config); in rcsi2_get_active_lanes()
965 if (ret == -ENOIOCTLCMD) { in rcsi2_get_active_lanes()
966 dev_dbg(priv->dev, "No remote mbus configuration available\n"); in rcsi2_get_active_lanes()
971 dev_err(priv->dev, "Failed to get remote mbus configuration\n"); in rcsi2_get_active_lanes()
977 if (!priv->cphy) in rcsi2_get_active_lanes()
978 return -EINVAL; in rcsi2_get_active_lanes()
981 if (priv->cphy) in rcsi2_get_active_lanes()
982 return -EINVAL; in rcsi2_get_active_lanes()
985 dev_err(priv->dev, "Unsupported media bus type %u\n", in rcsi2_get_active_lanes()
987 return -EINVAL; in rcsi2_get_active_lanes()
990 if (mbus_config.bus.mipi_csi2.num_data_lanes > priv->lanes) { in rcsi2_get_active_lanes()
991 dev_err(priv->dev, in rcsi2_get_active_lanes()
994 return -EINVAL; in rcsi2_get_active_lanes()
1015 dev_dbg(priv->dev, "Input size (%ux%u%c)\n", in rcsi2_start_receiver_gen3()
1016 fmt->width, fmt->height, in rcsi2_start_receiver_gen3()
1017 fmt->field == V4L2_FIELD_NONE ? 'p' : 'i'); in rcsi2_start_receiver_gen3()
1020 format = rcsi2_code_to_fmt(fmt->code); in rcsi2_start_receiver_gen3()
1022 return -EINVAL; in rcsi2_start_receiver_gen3()
1025 * Enable all supported CSI-2 channels with virtual channel and in rcsi2_start_receiver_gen3()
1032 for (i = 0; i < priv->info->num_channels; i++) { in rcsi2_start_receiver_gen3()
1035 if (priv->channel_vc[i] < 0) in rcsi2_start_receiver_gen3()
1038 vcdt_part = VCDT_SEL_VC(priv->channel_vc[i]) | VCDT_VCDTN_EN | in rcsi2_start_receiver_gen3()
1039 VCDT_SEL_DTN_ON | VCDT_SEL_DT(format->datatype); in rcsi2_start_receiver_gen3()
1048 if (fmt->field == V4L2_FIELD_ALTERNATE) { in rcsi2_start_receiver_gen3()
1052 if (fmt->height == 240) in rcsi2_start_receiver_gen3()
1067 phycnt |= (1 << lanes) - 1; in rcsi2_start_receiver_gen3()
1069 mbps = rcsi2_calc_mbps(priv, format->bpp, lanes); in rcsi2_start_receiver_gen3()
1082 if (!priv->info->use_isp) { in rcsi2_start_receiver_gen3()
1090 LSWAP_L0SEL(priv->lane_swap[0] - 1) | in rcsi2_start_receiver_gen3()
1091 LSWAP_L1SEL(priv->lane_swap[1] - 1) | in rcsi2_start_receiver_gen3()
1092 LSWAP_L2SEL(priv->lane_swap[2] - 1) | in rcsi2_start_receiver_gen3()
1093 LSWAP_L3SEL(priv->lane_swap[3] - 1)); in rcsi2_start_receiver_gen3()
1096 if (priv->info->init_phtw) { in rcsi2_start_receiver_gen3()
1097 ret = priv->info->init_phtw(priv, mbps); in rcsi2_start_receiver_gen3()
1102 if (priv->info->hsfreqrange) { in rcsi2_start_receiver_gen3()
1108 if (priv->info->csi0clkfreqrange) in rcsi2_start_receiver_gen3()
1110 CSI0CLKFREQRANGE(priv->info->csi0clkfreqrange)); in rcsi2_start_receiver_gen3()
1112 if (priv->info->use_isp) in rcsi2_start_receiver_gen3()
1128 if (priv->info->use_isp) in rcsi2_start_receiver_gen3()
1132 if (priv->info->phy_post_init) { in rcsi2_start_receiver_gen3()
1133 ret = priv->info->phy_post_init(priv); in rcsi2_start_receiver_gen3()
1139 if (priv->info->clear_ulps) in rcsi2_start_receiver_gen3()
1162 rcsi2_modify16(priv, cfgreg, info->cfg, 0x000f); in rsci2_set_line_order()
1163 rcsi2_modify16(priv, ctrlreg, info->ctrl29, 0x0100); in rsci2_set_line_order()
1179 return -ETIMEDOUT; in rcsi2_wait_phy_start_v4h()
1186 for (conf = cphy_setting_table_r8a779g0; conf->msps != 0; conf++) { in rcsi2_c_phy_setting_v4h()
1187 if (conf->msps > msps) in rcsi2_c_phy_setting_v4h()
1191 if (!conf->msps) { in rcsi2_c_phy_setting_v4h()
1192 dev_err(priv->dev, "Unsupported PHY speed for msps setting (%u Msps)", msps); in rcsi2_c_phy_setting_v4h()
1193 return -ERANGE; in rcsi2_c_phy_setting_v4h()
1196 /* C-PHY specific */ in rcsi2_c_phy_setting_v4h()
1221 rcsi2_write16(priv, V4H_CORE_DIG_CLANE_0_RW_HS_RX_REG(2), conf->rx2); in rcsi2_c_phy_setting_v4h()
1222 rcsi2_write16(priv, V4H_CORE_DIG_CLANE_1_RW_HS_RX_REG(2), conf->rx2); in rcsi2_c_phy_setting_v4h()
1223 rcsi2_write16(priv, V4H_CORE_DIG_CLANE_2_RW_HS_RX_REG(2), conf->rx2); in rcsi2_c_phy_setting_v4h()
1231 rcsi2_write16(priv, V4H_CORE_DIG_RW_TRIO0_REG(0), conf->trio0); in rcsi2_c_phy_setting_v4h()
1232 rcsi2_write16(priv, V4H_CORE_DIG_RW_TRIO1_REG(0), conf->trio0); in rcsi2_c_phy_setting_v4h()
1233 rcsi2_write16(priv, V4H_CORE_DIG_RW_TRIO2_REG(0), conf->trio0); in rcsi2_c_phy_setting_v4h()
1235 rcsi2_write16(priv, V4H_CORE_DIG_RW_TRIO0_REG(2), conf->trio2); in rcsi2_c_phy_setting_v4h()
1236 rcsi2_write16(priv, V4H_CORE_DIG_RW_TRIO1_REG(2), conf->trio2); in rcsi2_c_phy_setting_v4h()
1237 rcsi2_write16(priv, V4H_CORE_DIG_RW_TRIO2_REG(2), conf->trio2); in rcsi2_c_phy_setting_v4h()
1239 rcsi2_write16(priv, V4H_CORE_DIG_RW_TRIO0_REG(1), conf->trio1); in rcsi2_c_phy_setting_v4h()
1240 rcsi2_write16(priv, V4H_CORE_DIG_RW_TRIO1_REG(1), conf->trio1); in rcsi2_c_phy_setting_v4h()
1241 rcsi2_write16(priv, V4H_CORE_DIG_RW_TRIO2_REG(1), conf->trio1); in rcsi2_c_phy_setting_v4h()
1244 rsci2_set_line_order(priv, priv->line_orders[0], in rcsi2_c_phy_setting_v4h()
1247 rsci2_set_line_order(priv, priv->line_orders[1], in rcsi2_c_phy_setting_v4h()
1250 rsci2_set_line_order(priv, priv->line_orders[2], in rcsi2_c_phy_setting_v4h()
1263 dev_err(priv->dev, "PHY calibration failed\n"); in rcsi2_c_phy_setting_v4h()
1264 return -ETIMEDOUT; in rcsi2_c_phy_setting_v4h()
1267 /* C-PHY setting - analog programing*/ in rcsi2_c_phy_setting_v4h()
1268 rcsi2_write16(priv, V4H_CORE_DIG_IOCTRL_RW_AFE_LANE0_CTRL_2_REG(9), conf->lane29); in rcsi2_c_phy_setting_v4h()
1269 rcsi2_write16(priv, V4H_CORE_DIG_IOCTRL_RW_AFE_LANE0_CTRL_2_REG(7), conf->lane27); in rcsi2_c_phy_setting_v4h()
1285 format = rcsi2_code_to_fmt(fmt->code); in rcsi2_start_receiver_v4h()
1287 return -EINVAL; in rcsi2_start_receiver_v4h()
1293 msps = rcsi2_calc_mbps(priv, format->bpp, lanes); in rcsi2_start_receiver_v4h()
1308 rcsi2_write(priv, V4H_N_LANES_REG, lanes - 1); in rcsi2_start_receiver_v4h()
1310 /* Reset CSI2 */ in rcsi2_start_receiver_v4h()
1330 /* C-PHY settings */ in rcsi2_start_receiver_v4h()
1362 for (timeout = 10; timeout > 0; timeout--) { in rcsi2_d_phy_setting_v4m()
1369 dev_err(priv->dev, "D-PHY calibration failed\n"); in rcsi2_d_phy_setting_v4m()
1370 return -ETIMEDOUT; in rcsi2_d_phy_setting_v4m()
1386 info = rcsi2_mbps_to_info(priv, priv->info->hsfreqrange, mbps); in rcsi2_set_osc_freq()
1388 return -ERANGE; in rcsi2_set_osc_freq()
1391 steps[1].data = (info->osc_freq & 0x00ff) >> 0; in rcsi2_set_osc_freq()
1392 steps[2].data = (info->osc_freq & 0x0f00) >> 8; in rcsi2_set_osc_freq()
1435 if (priv->info->hsfreqrange) { in rcsi2_init_common_v4m()
1451 if (priv->info->csi0clkfreqrange) in rcsi2_init_common_v4m()
1453 CSI0CLKFREQRANGE(priv->info->csi0clkfreqrange)); in rcsi2_init_common_v4m()
1479 format = rcsi2_code_to_fmt(fmt->code); in rcsi2_start_receiver_v4m()
1481 return -EINVAL; in rcsi2_start_receiver_v4m()
1487 mbps = rcsi2_calc_mbps(priv, format->bpp, lanes); in rcsi2_start_receiver_v4m()
1503 rcsi2_write(priv, V4H_N_LANES_REG, lanes - 1); in rcsi2_start_receiver_v4m()
1512 /* Reset CSI2 */ in rcsi2_start_receiver_v4m()
1521 /* D-PHY settings */ in rcsi2_start_receiver_v4m()
1544 ret = priv->info->start_receiver(priv, state); in rcsi2_start()
1550 ret = v4l2_subdev_call(priv->remote, video, s_stream, 1); in rcsi2_start()
1562 v4l2_subdev_call(priv->remote, video, s_stream, 0); in rcsi2_stop()
1571 if (!priv->remote) in rcsi2_s_stream()
1572 return -ENODEV; in rcsi2_s_stream()
1574 state = v4l2_subdev_lock_and_get_active_state(&priv->subdev); in rcsi2_s_stream()
1576 if (enable && priv->stream_count == 0) { in rcsi2_s_stream()
1580 } else if (!enable && priv->stream_count == 1) { in rcsi2_s_stream()
1584 priv->stream_count += enable ? 1 : -1; in rcsi2_s_stream()
1598 if (format->pad > RCAR_CSI2_SINK) in rcsi2_set_pad_format()
1601 if (!rcsi2_code_to_fmt(format->format.code)) in rcsi2_set_pad_format()
1602 format->format.code = rcar_csi2_formats[0].code; in rcsi2_set_pad_format()
1604 *v4l2_subdev_state_get_format(state, format->pad) = format->format; in rcsi2_set_pad_format()
1608 *v4l2_subdev_state_get_format(state, i) = format->format; in rcsi2_set_pad_format()
1672 dev_info(priv->dev, "Transfer error, restarting CSI-2 receiver\n"); in rcsi2_irq()
1682 state = v4l2_subdev_lock_and_get_active_state(&priv->subdev); in rcsi2_irq_thread()
1687 dev_warn(priv->dev, "Failed to restart CSI-2 receiver\n"); in rcsi2_irq_thread()
1694 /* -----------------------------------------------------------------------------
1705 pad = media_entity_get_fwnode_pad(&subdev->entity, asc->match.fwnode, in rcsi2_notify_bound()
1708 dev_err(priv->dev, "Failed to find pad for %s\n", subdev->name); in rcsi2_notify_bound()
1712 priv->remote = subdev; in rcsi2_notify_bound()
1713 priv->remote_pad = pad; in rcsi2_notify_bound()
1715 dev_dbg(priv->dev, "Bound %s pad: %d\n", subdev->name, pad); in rcsi2_notify_bound()
1717 return media_create_pad_link(&subdev->entity, pad, in rcsi2_notify_bound()
1718 &priv->subdev.entity, 0, in rcsi2_notify_bound()
1729 priv->remote = NULL; in rcsi2_notify_unbind()
1731 dev_dbg(priv->dev, "Unbind %s\n", subdev->name); in rcsi2_notify_unbind()
1745 if (vep->base.port || vep->base.id) in rcsi2_parse_v4l2()
1746 return -ENOTCONN; in rcsi2_parse_v4l2()
1748 priv->lanes = vep->bus.mipi_csi2.num_data_lanes; in rcsi2_parse_v4l2()
1750 switch (vep->bus_type) { in rcsi2_parse_v4l2()
1752 if (!priv->info->support_dphy) { in rcsi2_parse_v4l2()
1753 dev_err(priv->dev, "D-PHY not supported\n"); in rcsi2_parse_v4l2()
1754 return -EINVAL; in rcsi2_parse_v4l2()
1757 if (priv->lanes != 1 && priv->lanes != 2 && priv->lanes != 4) { in rcsi2_parse_v4l2()
1758 dev_err(priv->dev, in rcsi2_parse_v4l2()
1759 "Unsupported number of data-lanes for D-PHY: %u\n", in rcsi2_parse_v4l2()
1760 priv->lanes); in rcsi2_parse_v4l2()
1761 return -EINVAL; in rcsi2_parse_v4l2()
1764 priv->cphy = false; in rcsi2_parse_v4l2()
1767 if (!priv->info->support_cphy) { in rcsi2_parse_v4l2()
1768 dev_err(priv->dev, "C-PHY not supported\n"); in rcsi2_parse_v4l2()
1769 return -EINVAL; in rcsi2_parse_v4l2()
1772 if (priv->lanes != 3) { in rcsi2_parse_v4l2()
1773 dev_err(priv->dev, in rcsi2_parse_v4l2()
1774 "Unsupported number of data-lanes for C-PHY: %u\n", in rcsi2_parse_v4l2()
1775 priv->lanes); in rcsi2_parse_v4l2()
1776 return -EINVAL; in rcsi2_parse_v4l2()
1779 priv->cphy = true; in rcsi2_parse_v4l2()
1782 dev_err(priv->dev, "Unsupported bus: %u\n", vep->bus_type); in rcsi2_parse_v4l2()
1783 return -EINVAL; in rcsi2_parse_v4l2()
1786 for (i = 0; i < ARRAY_SIZE(priv->lane_swap); i++) { in rcsi2_parse_v4l2()
1787 priv->lane_swap[i] = i < priv->lanes ? in rcsi2_parse_v4l2()
1788 vep->bus.mipi_csi2.data_lanes[i] : i; in rcsi2_parse_v4l2()
1791 if (priv->lane_swap[i] < 1 || priv->lane_swap[i] > 4) { in rcsi2_parse_v4l2()
1792 dev_err(priv->dev, "data-lanes must be in 1-4 range\n"); in rcsi2_parse_v4l2()
1793 return -EINVAL; in rcsi2_parse_v4l2()
1797 for (i = 0; i < ARRAY_SIZE(priv->line_orders); i++) in rcsi2_parse_v4l2()
1798 priv->line_orders[i] = vep->bus.mipi_csi2.line_orders[i]; in rcsi2_parse_v4l2()
1813 ep = fwnode_graph_get_endpoint_by_id(dev_fwnode(priv->dev), 0, 0, 0); in rcsi2_parse_dt()
1815 dev_err(priv->dev, "Not connected to subdevice\n"); in rcsi2_parse_dt()
1816 return -EINVAL; in rcsi2_parse_dt()
1821 dev_err(priv->dev, "Could not parse v4l2 endpoint\n"); in rcsi2_parse_dt()
1823 return -EINVAL; in rcsi2_parse_dt()
1835 dev_dbg(priv->dev, "Found '%pOF'\n", to_of_node(fwnode)); in rcsi2_parse_dt()
1837 v4l2_async_subdev_nf_init(&priv->notifier, &priv->subdev); in rcsi2_parse_dt()
1838 priv->notifier.ops = &rcar_csi2_notify_ops; in rcsi2_parse_dt()
1840 asc = v4l2_async_nf_add_fwnode(&priv->notifier, fwnode, in rcsi2_parse_dt()
1846 ret = v4l2_async_nf_register(&priv->notifier); in rcsi2_parse_dt()
1848 v4l2_async_nf_cleanup(&priv->notifier); in rcsi2_parse_dt()
1853 /* -----------------------------------------------------------------------------
1866 return -ERANGE; in rcsi2_phtw_write_mbps()
1868 return rcsi2_phtw_write(priv, info->reg, code); in rcsi2_phtw_write_mbps()
1990 /* -----------------------------------------------------------------------------
2004 if (!is_media_entity_v4l2_video_device(remote->entity)) { in rcsi2_link_setup()
2005 dev_err(priv->dev, "Remote is not a video device\n"); in rcsi2_link_setup()
2006 return -EINVAL; in rcsi2_link_setup()
2009 vdev = media_entity_to_video_device(remote->entity); in rcsi2_link_setup()
2011 if (of_property_read_u32(vdev->dev_parent->of_node, "renesas,id", &id)) { in rcsi2_link_setup()
2012 dev_err(priv->dev, "No renesas,id, can't configure routing\n"); in rcsi2_link_setup()
2013 return -EINVAL; in rcsi2_link_setup()
2020 dev_dbg(priv->dev, in rcsi2_link_setup()
2022 return -EINVAL; in rcsi2_link_setup()
2025 vc = local->index - 1; in rcsi2_link_setup()
2027 dev_dbg(priv->dev, "Route VC%d to VIN%u on output channel %d\n", in rcsi2_link_setup()
2030 vc = -1; in rcsi2_link_setup()
2033 priv->channel_vc[channel] = vc; in rcsi2_link_setup()
2048 priv->base = devm_platform_ioremap_resource(pdev, 0); in rcsi2_probe_resources()
2049 if (IS_ERR(priv->base)) in rcsi2_probe_resources()
2050 return PTR_ERR(priv->base); in rcsi2_probe_resources()
2056 ret = devm_request_threaded_irq(&pdev->dev, irq, rcsi2_irq, in rcsi2_probe_resources()
2062 priv->rstc = devm_reset_control_get(&pdev->dev, NULL); in rcsi2_probe_resources()
2064 return PTR_ERR_OR_ZERO(priv->rstc); in rcsi2_probe_resources()
2192 .compatible = "renesas,r8a774a1-csi2",
2196 .compatible = "renesas,r8a774b1-csi2",
2200 .compatible = "renesas,r8a774c0-csi2",
2204 .compatible = "renesas,r8a774e1-csi2",
2208 .compatible = "renesas,r8a7795-csi2",
2212 .compatible = "renesas,r8a7796-csi2",
2216 .compatible = "renesas,r8a77961-csi2",
2220 .compatible = "renesas,r8a77965-csi2",
2224 .compatible = "renesas,r8a77970-csi2",
2228 .compatible = "renesas,r8a77980-csi2",
2232 .compatible = "renesas,r8a77990-csi2",
2236 .compatible = "renesas,r8a779a0-csi2",
2240 .compatible = "renesas,r8a779g0-csi2",
2244 .compatible = "renesas,r8a779h0-csi2",
2266 priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); in rcsi2_probe()
2268 return -ENOMEM; in rcsi2_probe()
2270 priv->info = of_device_get_match_data(&pdev->dev); in rcsi2_probe()
2278 priv->info = attr->data; in rcsi2_probe()
2280 priv->dev = &pdev->dev; in rcsi2_probe()
2282 priv->stream_count = 0; in rcsi2_probe()
2286 dev_err(priv->dev, "Failed to get resources\n"); in rcsi2_probe()
2296 priv->subdev.owner = THIS_MODULE; in rcsi2_probe()
2297 priv->subdev.dev = &pdev->dev; in rcsi2_probe()
2298 priv->subdev.internal_ops = &rcar_csi2_internal_ops; in rcsi2_probe()
2299 v4l2_subdev_init(&priv->subdev, &rcar_csi2_subdev_ops); in rcsi2_probe()
2300 v4l2_set_subdevdata(&priv->subdev, &pdev->dev); in rcsi2_probe()
2301 snprintf(priv->subdev.name, sizeof(priv->subdev.name), "%s %s", in rcsi2_probe()
2302 KBUILD_MODNAME, dev_name(&pdev->dev)); in rcsi2_probe()
2303 priv->subdev.flags = V4L2_SUBDEV_FL_HAS_DEVNODE; in rcsi2_probe()
2305 priv->subdev.entity.function = MEDIA_ENT_F_PROC_VIDEO_PIXEL_FORMATTER; in rcsi2_probe()
2306 priv->subdev.entity.ops = &rcar_csi2_entity_ops; in rcsi2_probe()
2310 priv->pads[RCAR_CSI2_SINK].flags = MEDIA_PAD_FL_SINK; in rcsi2_probe()
2312 priv->pads[i].flags = MEDIA_PAD_FL_SOURCE; in rcsi2_probe()
2314 ret = media_entity_pads_init(&priv->subdev.entity, num_pads, in rcsi2_probe()
2315 priv->pads); in rcsi2_probe()
2319 for (i = 0; i < ARRAY_SIZE(priv->channel_vc); i++) in rcsi2_probe()
2320 priv->channel_vc[i] = -1; in rcsi2_probe()
2322 pm_runtime_enable(&pdev->dev); in rcsi2_probe()
2324 ret = v4l2_subdev_init_finalize(&priv->subdev); in rcsi2_probe()
2328 ret = v4l2_async_register_subdev(&priv->subdev); in rcsi2_probe()
2332 dev_info(priv->dev, "%d lanes found\n", priv->lanes); in rcsi2_probe()
2337 v4l2_subdev_cleanup(&priv->subdev); in rcsi2_probe()
2339 pm_runtime_disable(&pdev->dev); in rcsi2_probe()
2341 v4l2_async_nf_unregister(&priv->notifier); in rcsi2_probe()
2342 v4l2_async_nf_cleanup(&priv->notifier); in rcsi2_probe()
2351 v4l2_async_nf_unregister(&priv->notifier); in rcsi2_remove()
2352 v4l2_async_nf_cleanup(&priv->notifier); in rcsi2_remove()
2353 v4l2_async_unregister_subdev(&priv->subdev); in rcsi2_remove()
2354 v4l2_subdev_cleanup(&priv->subdev); in rcsi2_remove()
2356 pm_runtime_disable(&pdev->dev); in rcsi2_remove()
2363 .name = "rcar-csi2",
2372 MODULE_DESCRIPTION("Renesas R-Car MIPI CSI-2 receiver driver");