Lines Matching refs:cif
1238 static void rkcif_write_reg(struct vehicle_cif *cif, in rkcif_write_reg() argument
1241 void __iomem *base = cif->base; in rkcif_write_reg()
1242 const struct vehicle_cif_reg *reg = &cif->cif_regs[index]; in rkcif_write_reg()
1245 if (cif->inf_id == RKCIF_MIPI_LVDS && in rkcif_write_reg()
1248 if (cif->chip_id == CHIP_RK3588_VEHICLE_CIF) { in rkcif_write_reg()
1249 csi_offset = cif->csi_host_idx * 0x100; in rkcif_write_reg()
1250 } else if (cif->chip_id == CHIP_RK3562_VEHICLE_CIF) { in rkcif_write_reg()
1251 if (cif->csi_host_idx < 3) in rkcif_write_reg()
1252 csi_offset = cif->csi_host_idx * 0x200; in rkcif_write_reg()
1271 static void rkcif_write_reg_or(struct vehicle_cif *cif, in rkcif_write_reg_or() argument
1274 void __iomem *base = cif->base; in rkcif_write_reg_or()
1275 const struct vehicle_cif_reg *reg = &cif->cif_regs[index]; in rkcif_write_reg_or()
1279 if (cif->inf_id == RKCIF_MIPI_LVDS && in rkcif_write_reg_or()
1282 if (cif->chip_id == CHIP_RK3588_VEHICLE_CIF) { in rkcif_write_reg_or()
1283 csi_offset = cif->csi_host_idx * 0x100; in rkcif_write_reg_or()
1284 } else if (cif->chip_id == CHIP_RK3562_VEHICLE_CIF) { in rkcif_write_reg_or()
1285 if (cif->csi_host_idx < 3) in rkcif_write_reg_or()
1286 csi_offset = cif->csi_host_idx * 0x200; in rkcif_write_reg_or()
1307 static void rkcif_write_reg_and(struct vehicle_cif *cif, in rkcif_write_reg_and() argument
1310 void __iomem *base = cif->base; in rkcif_write_reg_and()
1311 const struct vehicle_cif_reg *reg = &cif->cif_regs[index]; in rkcif_write_reg_and()
1315 if (cif->inf_id == RKCIF_MIPI_LVDS && in rkcif_write_reg_and()
1318 if (cif->chip_id == CHIP_RK3588_VEHICLE_CIF) { in rkcif_write_reg_and()
1319 csi_offset = cif->csi_host_idx * 0x100; in rkcif_write_reg_and()
1320 } else if (cif->chip_id == CHIP_RK3562_VEHICLE_CIF) { in rkcif_write_reg_and()
1321 if (cif->csi_host_idx < 3) in rkcif_write_reg_and()
1322 csi_offset = cif->csi_host_idx * 0x200; in rkcif_write_reg_and()
1343 static unsigned int rkcif_read_reg(struct vehicle_cif *cif, in rkcif_read_reg() argument
1347 void __iomem *base = cif->base; in rkcif_read_reg()
1348 const struct vehicle_cif_reg *reg = &cif->cif_regs[index]; in rkcif_read_reg()
1351 if (cif->inf_id == RKCIF_MIPI_LVDS && in rkcif_read_reg()
1354 if (cif->chip_id == CHIP_RK3588_VEHICLE_CIF) { in rkcif_read_reg()
1355 csi_offset = cif->csi_host_idx * 0x100; in rkcif_read_reg()
1356 } else if (cif->chip_id == CHIP_RK3562_VEHICLE_CIF) { in rkcif_read_reg()
1357 if (cif->csi_host_idx < 3) in rkcif_read_reg()
1358 csi_offset = cif->csi_host_idx * 0x200; in rkcif_read_reg()
1377 static void rkvehicle_cif_write_grf_reg(struct vehicle_cif *cif, in rkvehicle_cif_write_grf_reg() argument
1380 const struct vehicle_cif_reg *reg = &cif->cif_regs[index]; in rkvehicle_cif_write_grf_reg()
1384 if (!IS_ERR(cif->regmap_grf)) in rkvehicle_cif_write_grf_reg()
1385 regmap_write(cif->regmap_grf, reg->offset, val); in rkvehicle_cif_write_grf_reg()
1395 static u32 rkvehicle_cif_read_grf_reg(struct vehicle_cif *cif, in rkvehicle_cif_read_grf_reg() argument
1398 const struct vehicle_cif_reg *reg = &cif->cif_regs[index]; in rkvehicle_cif_read_grf_reg()
1403 if (!IS_ERR(cif->regmap_grf)) in rkvehicle_cif_read_grf_reg()
1404 regmap_read(cif->regmap_grf, reg->offset, &val); in rkvehicle_cif_read_grf_reg()
1493 static void rkvehicle_cif_cfg_dvp_clk_sampling_edge(struct vehicle_cif *cif, in rkvehicle_cif_cfg_dvp_clk_sampling_edge() argument
1498 if (!IS_ERR(cif->regmap_grf)) { in rkvehicle_cif_cfg_dvp_clk_sampling_edge()
1499 if (cif->chip_id == CHIP_RK3568_VEHICLE_CIF) { in rkvehicle_cif_cfg_dvp_clk_sampling_edge()
1505 if (cif->chip_id == CHIP_RK3588_VEHICLE_CIF) { in rkvehicle_cif_cfg_dvp_clk_sampling_edge()
1511 rkvehicle_cif_write_grf_reg(cif, CIF_REG_GRF_CIFIO_CON, val); in rkvehicle_cif_cfg_dvp_clk_sampling_edge()
1539 static int cif_stream_setup(struct vehicle_cif *cif) in cif_stream_setup() argument
1541 struct vehicle_cfg *cfg = &cif->cif_cfg; in cif_stream_setup()
1557 rkvehicle_cif_cfg_dvp_clk_sampling_edge(cif, RKCIF_CLK_RISING); in cif_stream_setup()
1559 rkvehicle_cif_cfg_dvp_clk_sampling_edge(cif, RKCIF_CLK_FALLING); in cif_stream_setup()
1569 if (cif->chip_id == CHIP_RK3568_VEHICLE_CIF) { in cif_stream_setup()
1584 rkcif_write_reg(cif, CIF_REG_DVP_FOR, val); in cif_stream_setup()
1586 rkcif_write_reg(cif, CIF_REG_DVP_VIR_LINE_WIDTH, cfg->width); in cif_stream_setup()
1587 rkcif_write_reg(cif, CIF_REG_DVP_SET_SIZE, in cif_stream_setup()
1591 rkcif_write_reg(cif, CIF_REG_DVP_CROP, crop); in cif_stream_setup()
1593 rkcif_write_reg(cif, CIF_REG_DVP_FRAME_STATUS, FRAME_STAT_CLS); in cif_stream_setup()
1595 if (cif->chip_id < CHIP_RK3588_VEHICLE_CIF) { in cif_stream_setup()
1596 rkcif_write_reg(cif, CIF_REG_DVP_INTSTAT, INTSTAT_CLS); in cif_stream_setup()
1597 rkcif_write_reg(cif, CIF_REG_DVP_SCL_CTRL, ENABLE_YUV_16BIT_BYPASS); in cif_stream_setup()
1598 rkcif_write_reg(cif, CIF_REG_DVP_INTEN, in cif_stream_setup()
1602 rkcif_write_reg(cif, CIF_REG_DVP_LINE_INT_NUM, 0x1); in cif_stream_setup()
1603 rkcif_write_reg(cif, CIF_REG_DVP_INTEN, LINE_INT_EN); in cif_stream_setup()
1605 rkcif_write_reg(cif, CIF_REG_DVP_INTSTAT, 0x3c3ffff); in cif_stream_setup()
1606 rkcif_write_reg_or(cif, CIF_REG_DVP_INTEN, 0x033ffff);//0x3c3ffff in cif_stream_setup()
1609 cif->interlaced_enable = false; in cif_stream_setup()
1647 static void csi2_dphy_config_dual_mode(struct vehicle_cif *cif) in csi2_dphy_config_dual_mode() argument
1649 struct csi2_dphy_hw *hw = cif->dphy_hw; in csi2_dphy_config_dual_mode()
1653 if (cif->dphy_hw->phy_index < 3) { in csi2_dphy_config_dual_mode()
1655 GENMASK(cif->cif_cfg.lanes - 1, 0)); in csi2_dphy_config_dual_mode()
1657 if (cif->chip_id != CHIP_RK3588_VEHICLE_CIF) in csi2_dphy_config_dual_mode()
1662 if (cif->chip_id <= CHIP_ID_RK3588) { in csi2_dphy_config_dual_mode()
1664 GENMASK(cif->cif_cfg.lanes - 1, 0)); in csi2_dphy_config_dual_mode()
1668 GENMASK(cif->cif_cfg.lanes - 1, 0)); in csi2_dphy_config_dual_mode()
1671 if (cif->chip_id != CHIP_RK3588_VEHICLE_CIF) in csi2_dphy_config_dual_mode()
1678 static int vehicle_csi2_dphy_stream_start(struct vehicle_cif *cif) in vehicle_csi2_dphy_stream_start() argument
1680 struct csi2_dphy_hw *hw = cif->dphy_hw; in vehicle_csi2_dphy_stream_start()
1696 val |= (GENMASK(cif->cif_cfg.lanes - 1, 0) << in vehicle_csi2_dphy_stream_start()
1703 if (cif->cif_cfg.type == V4L2_MBUS_CSI2_DPHY) { in vehicle_csi2_dphy_stream_start()
1706 csi2_dphy_config_dual_mode(cif); in vehicle_csi2_dphy_stream_start()
1715 if (cif->cif_cfg.lanes > 0x00) in vehicle_csi2_dphy_stream_start()
1717 if (cif->cif_cfg.lanes > 0x01) in vehicle_csi2_dphy_stream_start()
1719 if (cif->cif_cfg.lanes > 0x02) in vehicle_csi2_dphy_stream_start()
1721 if (cif->cif_cfg.lanes > 0x03) in vehicle_csi2_dphy_stream_start()
1741 hw->data_rate_mbps, hsfreq, cif->cif_cfg.lanes); in vehicle_csi2_dphy_stream_start()
1744 if (cif->cif_cfg.lanes > 0x00) in vehicle_csi2_dphy_stream_start()
1746 if (cif->cif_cfg.lanes > 0x01) in vehicle_csi2_dphy_stream_start()
1748 if (cif->cif_cfg.lanes > 0x02) in vehicle_csi2_dphy_stream_start()
1750 if (cif->cif_cfg.lanes > 0x03) in vehicle_csi2_dphy_stream_start()
1760 static void vehicle_samsung_dcphy_rx_config_settle(struct vehicle_cif *cif) in vehicle_samsung_dcphy_rx_config_settle() argument
1762 struct csi2_dphy_hw *hw = cif->dphy_hw; in vehicle_samsung_dcphy_rx_config_settle()
1769 if (cif->cif_cfg.type == V4L2_MBUS_CSI2_DPHY) { in vehicle_samsung_dcphy_rx_config_settle()
1784 if (cif->cif_cfg.type == V4L2_MBUS_CSI2_DPHY) in vehicle_samsung_dcphy_rx_config_settle()
1787 if (cif->cif_cfg.lanes > 0x00) { in vehicle_samsung_dcphy_rx_config_settle()
1791 if (cif->cif_cfg.lanes > 0x01) { in vehicle_samsung_dcphy_rx_config_settle()
1795 if (cif->cif_cfg.lanes > 0x02) { in vehicle_samsung_dcphy_rx_config_settle()
1799 if (cif->cif_cfg.lanes > 0x03) { in vehicle_samsung_dcphy_rx_config_settle()
1805 static int vehicle_samsung_dcphy_rx_config_common(struct vehicle_cif *cif) in vehicle_samsung_dcphy_rx_config_common() argument
1807 struct csi2_dphy_hw *hw = cif->dphy_hw; in vehicle_samsung_dcphy_rx_config_common()
1812 if (cif->cif_cfg.type == V4L2_MBUS_CSI2_DPHY) { in vehicle_samsung_dcphy_rx_config_common()
1828 for (i = 0; i < cif->cif_cfg.lanes; i++) { in vehicle_samsung_dcphy_rx_config_common()
1858 if (cif->cif_cfg.lanes > 0x00) { in vehicle_samsung_dcphy_rx_config_common()
1870 if (cif->cif_cfg.lanes > 0x01) { in vehicle_samsung_dcphy_rx_config_common()
1882 if (cif->cif_cfg.lanes > 0x02) { in vehicle_samsung_dcphy_rx_config_common()
1894 if (cif->cif_cfg.lanes > 0x03) { in vehicle_samsung_dcphy_rx_config_common()
1910 static int vehicle_samsung_dcphy_rx_lane_enable(struct vehicle_cif *cif) in vehicle_samsung_dcphy_rx_lane_enable() argument
1912 struct csi2_dphy_hw *hw = cif->dphy_hw; in vehicle_samsung_dcphy_rx_lane_enable()
1917 if (cif->cif_cfg.type == V4L2_MBUS_CSI2_DPHY) in vehicle_samsung_dcphy_rx_lane_enable()
1920 if (cif->cif_cfg.lanes > 0x00) in vehicle_samsung_dcphy_rx_lane_enable()
1922 if (cif->cif_cfg.lanes > 0x01) in vehicle_samsung_dcphy_rx_lane_enable()
1924 if (cif->cif_cfg.lanes > 0x02) in vehicle_samsung_dcphy_rx_lane_enable()
1926 if (cif->cif_cfg.lanes > 0x03) in vehicle_samsung_dcphy_rx_lane_enable()
1930 if (cif->cif_cfg.type == V4L2_MBUS_CSI2_DPHY) { in vehicle_samsung_dcphy_rx_lane_enable()
1940 if (cif->cif_cfg.lanes > 0x00) { in vehicle_samsung_dcphy_rx_lane_enable()
1948 if (cif->cif_cfg.lanes > 0x01) { in vehicle_samsung_dcphy_rx_lane_enable()
1956 if (cif->cif_cfg.lanes > 0x02) { in vehicle_samsung_dcphy_rx_lane_enable()
1965 if (cif->cif_cfg.lanes > 0x03) { in vehicle_samsung_dcphy_rx_lane_enable()
1976 static void vehicle_samsung_mipi_dcphy_bias_block_enable(struct vehicle_cif *cif) in vehicle_samsung_mipi_dcphy_bias_block_enable() argument
1978 struct csi2_dphy_hw *hw = cif->dphy_hw; in vehicle_samsung_mipi_dcphy_bias_block_enable()
2005 static int vehicle_csi2_dcphy_stream_start(struct vehicle_cif *cif) in vehicle_csi2_dcphy_stream_start() argument
2007 struct csi2_dphy_hw *hw = cif->dphy_hw; in vehicle_csi2_dcphy_stream_start()
2017 vehicle_samsung_mipi_dcphy_bias_block_enable(cif); in vehicle_csi2_dcphy_stream_start()
2018 ret = vehicle_samsung_dcphy_rx_config_common(cif); in vehicle_csi2_dcphy_stream_start()
2022 vehicle_samsung_dcphy_rx_config_settle(cif); in vehicle_csi2_dcphy_stream_start()
2024 ret = vehicle_samsung_dcphy_rx_lane_enable(cif); in vehicle_csi2_dcphy_stream_start()
2043 static int vehicle_csi2_dcphy_stream_stop(struct vehicle_cif *cif) in vehicle_csi2_dcphy_stream_stop() argument
2045 struct csi2_dphy_hw *hw = cif->dphy_hw; in vehicle_csi2_dcphy_stream_stop()
2056 if (cif->cif_cfg.type == V4L2_MBUS_CSI2_DPHY) in vehicle_csi2_dcphy_stream_stop()
2059 if (cif->cif_cfg.lanes > 0x00) in vehicle_csi2_dcphy_stream_stop()
2061 if (cif->cif_cfg.lanes > 0x01) in vehicle_csi2_dcphy_stream_stop()
2063 if (cif->cif_cfg.lanes > 0x02) in vehicle_csi2_dcphy_stream_stop()
2065 if (cif->cif_cfg.lanes > 0x03) in vehicle_csi2_dcphy_stream_stop()
2077 static void vehicle_csi2_disable(struct vehicle_cif *cif) in vehicle_csi2_disable() argument
2079 void __iomem *base = cif->csi2_base; in vehicle_csi2_disable()
2086 static void vehicle_csi2_enable(struct vehicle_cif *cif, in vehicle_csi2_enable() argument
2089 struct csi2_dphy_hw *hw = cif->dphy_hw; in vehicle_csi2_enable()
2091 int lanes = cif->cif_cfg.lanes; in vehicle_csi2_enable()
2115 static int vehicle_csi2_stream_start(struct vehicle_cif *cif) in vehicle_csi2_stream_start() argument
2117 struct csi2_dphy_hw *hw = cif->dphy_hw; in vehicle_csi2_stream_start()
2122 vehicle_csi2_enable(cif, host_type); in vehicle_csi2_stream_start()
2129 static void vehicle_cif_csi_get_vc_num(struct vehicle_cif *cif) in vehicle_cif_csi_get_vc_num() argument
2132 unsigned int mbus_flags = cif->cif_cfg.mbus_flags; in vehicle_cif_csi_get_vc_num()
2136 cif->channels[vc_num].vc = vc_num; in vehicle_cif_csi_get_vc_num()
2141 cif->channels[vc_num].vc = vc_num; in vehicle_cif_csi_get_vc_num()
2147 cif->channels[vc_num].vc = vc_num; in vehicle_cif_csi_get_vc_num()
2153 cif->channels[vc_num].vc = vc_num; in vehicle_cif_csi_get_vc_num()
2159 cif->num_channels = vc_num ? (vc_num - 1) : 1; in vehicle_cif_csi_get_vc_num()
2160 if (cif->num_channels == 1) in vehicle_cif_csi_get_vc_num()
2161 cif->channels[0].vc = 0; in vehicle_cif_csi_get_vc_num()
2633 #define UV_OFFSET (cif->cif_cfg.width * cif->cif_cfg.height)
2635 static int vehicle_cif_init_buffer(struct vehicle_cif *cif, in vehicle_cif_init_buffer() argument
2638 struct vehicle_rkcif_dummy_buffer *dummy_buf = &cif->dummy_buf; in vehicle_cif_init_buffer()
2644 if (cif->cif_cfg.buf_num < 2) in vehicle_cif_init_buffer()
2647 if (cif->cif_cfg.buf_num > MAX_BUF_NUM) in vehicle_cif_init_buffer()
2648 cif->cif_cfg.buf_num = MAX_BUF_NUM; in vehicle_cif_init_buffer()
2650 for (i = 0 ; i < cif->cif_cfg.buf_num; i++) { in vehicle_cif_init_buffer()
2651 cif->frame_buf[i] = cif->cif_cfg.buf_phy_addr[i]; in vehicle_cif_init_buffer()
2652 if (cif->frame_buf[i] == 0) in vehicle_cif_init_buffer()
2656 cif->last_buf_index = 0; in vehicle_cif_init_buffer()
2657 cif->current_buf_index = 1; in vehicle_cif_init_buffer()
2659 if (cif->cif_cfg.type == V4L2_MBUS_CSI2_DPHY) { in vehicle_cif_init_buffer()
2671 spin_lock(&cif->vbq_lock); in vehicle_cif_init_buffer()
2676 rkcif_write_reg(cif, frm0_addr_y, y_addr); in vehicle_cif_init_buffer()
2677 rkcif_write_reg(cif, frm0_addr_uv, uv_addr); in vehicle_cif_init_buffer()
2678 cif->active[0] = y_addr; in vehicle_cif_init_buffer()
2680 rkcif_write_reg(cif, frm0_addr_y, dummy_buf->dma_addr); in vehicle_cif_init_buffer()
2681 rkcif_write_reg(cif, frm0_addr_uv, dummy_buf->dma_addr); in vehicle_cif_init_buffer()
2682 cif->active[0] = y_addr; in vehicle_cif_init_buffer()
2688 rkcif_write_reg(cif, frm1_addr_y, y_addr); in vehicle_cif_init_buffer()
2689 rkcif_write_reg(cif, frm1_addr_uv, uv_addr); in vehicle_cif_init_buffer()
2690 cif->active[1] = y_addr; in vehicle_cif_init_buffer()
2692 rkcif_write_reg(cif, frm1_addr_y, dummy_buf->dma_addr); in vehicle_cif_init_buffer()
2693 rkcif_write_reg(cif, frm1_addr_uv, dummy_buf->dma_addr); in vehicle_cif_init_buffer()
2694 cif->active[1] = y_addr; in vehicle_cif_init_buffer()
2697 if (cif->cif_cfg.type != V4L2_MBUS_CSI2_DPHY) { in vehicle_cif_init_buffer()
2704 rkcif_write_reg(cif, get_dvp_reg_index_of_frm0_y_addr(ch_id), in vehicle_cif_init_buffer()
2706 rkcif_write_reg(cif, get_dvp_reg_index_of_frm1_y_addr(ch_id), in vehicle_cif_init_buffer()
2708 rkcif_write_reg(cif, get_dvp_reg_index_of_frm0_uv_addr(ch_id), in vehicle_cif_init_buffer()
2710 rkcif_write_reg(cif, get_dvp_reg_index_of_frm1_uv_addr(ch_id), in vehicle_cif_init_buffer()
2715 spin_unlock(&cif->vbq_lock); in vehicle_cif_init_buffer()
2720 static int vehicle_cif_csi_channel_init(struct vehicle_cif *cif, in vehicle_cif_csi_channel_init() argument
2723 struct vehicle_cfg *cfg = &cif->cif_cfg; in vehicle_cif_csi_channel_init()
2730 cif->interlaced_enable = false; in vehicle_cif_csi_channel_init()
2788 cif->interlaced_enable = true; in vehicle_cif_csi_channel_init()
2789 cif->interlaced_offset = channel->width; in vehicle_cif_csi_channel_init()
2790 cif->interlaced_counts = 0; in vehicle_cif_csi_channel_init()
2791 cif->interlaced_buffer = 0; in vehicle_cif_csi_channel_init()
2802 static int vehicle_cif_csi_channel_set(struct vehicle_cif *cif, in vehicle_cif_csi_channel_set() argument
2813 rkcif_write_reg(cif, get_reg_index_of_id_ctrl0(channel->id), in vehicle_cif_csi_channel_set()
2818 rkcif_write_reg_and(cif, CIF_REG_MIPI_LVDS_INTSTAT, in vehicle_cif_csi_channel_set()
2824 rkcif_write_reg_and(cif, CIF_REG_MIPI_LVDS_INTEN, 0x0); in vehicle_cif_csi_channel_set()
2830 rkcif_write_reg_or(cif, CIF_REG_MIPI_LVDS_INTEN, in vehicle_cif_csi_channel_set()
2833 rkcif_write_reg(cif, CIF_REG_MIPI_LVDS_LINE_INT_NUM_ID0_1, in vehicle_cif_csi_channel_set()
2835 rkcif_write_reg(cif, CIF_REG_MIPI_LVDS_LINE_INT_NUM_ID2_3, in vehicle_cif_csi_channel_set()
2838 rkcif_write_reg_or(cif, CIF_REG_MIPI_LVDS_INTEN, in vehicle_cif_csi_channel_set()
2841 rkcif_write_reg(cif, CIF_REG_MIPI_WATER_LINE, in vehicle_cif_csi_channel_set()
2856 rkcif_write_reg(cif, CIF_REG_MIPI_LVDS_CTRL, val); in vehicle_cif_csi_channel_set()
2858 rkcif_write_reg_or(cif, CIF_REG_MIPI_LVDS_INTEN, in vehicle_cif_csi_channel_set()
2861 rkcif_write_reg(cif, get_reg_index_of_id_ctrl1(channel->id), in vehicle_cif_csi_channel_set()
2864 rkcif_write_reg(cif, get_reg_index_of_frm0_y_vlw(channel->id), in vehicle_cif_csi_channel_set()
2866 rkcif_write_reg(cif, get_reg_index_of_frm1_y_vlw(channel->id), in vehicle_cif_csi_channel_set()
2868 rkcif_write_reg(cif, get_reg_index_of_frm0_uv_vlw(channel->id), in vehicle_cif_csi_channel_set()
2870 rkcif_write_reg(cif, get_reg_index_of_frm1_uv_vlw(channel->id), in vehicle_cif_csi_channel_set()
2874 rkcif_write_reg(cif, get_reg_index_of_id_crop_start(channel->id), in vehicle_cif_csi_channel_set()
2881 static int vehicle_cif_csi_channel_set_v1(struct vehicle_cif *cif, in vehicle_cif_csi_channel_set_v1() argument
2891 rkcif_write_reg(cif, get_reg_index_of_id_ctrl0(channel->id), in vehicle_cif_csi_channel_set_v1()
2896 rkcif_write_reg_and(cif, CIF_REG_MIPI_LVDS_INTSTAT, in vehicle_cif_csi_channel_set_v1()
2905 rkcif_write_reg_or(cif, CIF_REG_MIPI_LVDS_INTEN, in vehicle_cif_csi_channel_set_v1()
2908 rkcif_write_reg(cif, CIF_REG_MIPI_LVDS_LINE_INT_NUM_ID0_1, in vehicle_cif_csi_channel_set_v1()
2910 rkcif_write_reg(cif, CIF_REG_MIPI_LVDS_LINE_INT_NUM_ID2_3, in vehicle_cif_csi_channel_set_v1()
2913 rkcif_write_reg_or(cif, CIF_REG_MIPI_LVDS_INTEN, in vehicle_cif_csi_channel_set_v1()
2923 rkcif_write_reg(cif, CIF_REG_MIPI_LVDS_CTRL, val); in vehicle_cif_csi_channel_set_v1()
2925 rkcif_write_reg_or(cif, CIF_REG_MIPI_LVDS_INTEN, in vehicle_cif_csi_channel_set_v1()
2928 rkcif_write_reg(cif, get_reg_index_of_id_ctrl1(channel->id), in vehicle_cif_csi_channel_set_v1()
2931 rkcif_write_reg(cif, get_reg_index_of_frm0_y_vlw(channel->id), in vehicle_cif_csi_channel_set_v1()
2935 rkcif_write_reg(cif, get_reg_index_of_id_crop_start(channel->id), in vehicle_cif_csi_channel_set_v1()
2941 static int vehicle_cif_stream_start(struct vehicle_cif *cif) in vehicle_cif_stream_start() argument
2945 vehicle_cif_csi_get_vc_num(cif); in vehicle_cif_stream_start()
2948 channel = &cif->channels[0]; in vehicle_cif_stream_start()
2950 vehicle_cif_csi_channel_init(cif, channel); in vehicle_cif_stream_start()
2951 if (cif->chip_id < CHIP_RK3588_VEHICLE_CIF) in vehicle_cif_stream_start()
2952 vehicle_cif_csi_channel_set(cif, channel, V4L2_MBUS_CSI2_DPHY); in vehicle_cif_stream_start()
2954 vehicle_cif_csi_channel_set_v1(cif, channel, V4L2_MBUS_CSI2_DPHY); in vehicle_cif_stream_start()
2959 static int cif_csi_stream_setup(struct vehicle_cif *cif) in cif_csi_stream_setup() argument
2961 vehicle_csi2_stream_start(cif); in cif_csi_stream_setup()
2962 if (cif->dphy_hw->chip_id == CHIP_ID_RK3588_DCPHY) in cif_csi_stream_setup()
2963 vehicle_csi2_dcphy_stream_start(cif); in cif_csi_stream_setup()
2965 vehicle_csi2_dphy_stream_start(cif); in cif_csi_stream_setup()
2966 vehicle_cif_stream_start(cif); in cif_csi_stream_setup()
2971 static void vehicle_csi2_dphy_hw_do_reset(struct vehicle_cif *cif) in vehicle_csi2_dphy_hw_do_reset() argument
2974 struct csi2_dphy_hw *dphy_hw = cif->dphy_hw; in vehicle_csi2_dphy_hw_do_reset()
2985 static void vehicle_csi2_hw_soft_reset(struct vehicle_cif *cif) in vehicle_csi2_hw_soft_reset() argument
2988 struct csi2_dphy_hw *dphy_hw = cif->dphy_hw; in vehicle_csi2_hw_soft_reset()
2999 static int vehicle_csi2_dphy_stream_stop(struct vehicle_cif *cif) in vehicle_csi2_dphy_stream_stop() argument
3001 struct csi2_dphy_hw *hw = cif->dphy_hw; in vehicle_csi2_dphy_stream_stop()
3006 if (cif->dphy_hw->chip_id == CHIP_ID_RK3588) in vehicle_csi2_dphy_stream_stop()
3007 vehicle_csi2_dphy_hw_do_reset(cif); in vehicle_csi2_dphy_stream_stop()
3042 static void rkcif_s_mclk(struct vehicle_cif *cif, int on, int clk_rate) in rkcif_s_mclk() argument
3045 struct device *dev = cif->dev; in rkcif_s_mclk()
3046 struct rk_cif_clk *clk = &cif->clk; in rkcif_s_mclk()
3067 static int rk_cif_mclk_ctrl(struct vehicle_cif *cif, int on, int clk_rate) in rk_cif_mclk_ctrl() argument
3071 struct rk_cif_clk *clk = &cif->clk; in rk_cif_mclk_ctrl()
3150 static int vehicle_csi2_clk_ctrl(struct vehicle_cif *cif, int on) in vehicle_csi2_clk_ctrl() argument
3153 struct csi2_dphy_hw *dphy_hw = cif->dphy_hw; in vehicle_csi2_clk_ctrl()
3179 static int vehicle_csi2_stream_stop(struct vehicle_cif *cif) in vehicle_csi2_stream_stop() argument
3181 vehicle_csi2_disable(cif); in vehicle_csi2_stream_stop()
3186 static int vehicle_cif_stream_stop(struct vehicle_cif *cif) in vehicle_cif_stream_stop() argument
3191 static int vehicle_cif_csi_stream_stop(struct vehicle_cif *cif) in vehicle_cif_csi_stream_stop() argument
3193 vehicle_cif_stream_stop(cif); in vehicle_cif_csi_stream_stop()
3194 vehicle_csi2_stream_stop(cif); in vehicle_cif_csi_stream_stop()
3195 if (cif->dphy_hw->chip_id == CHIP_ID_RK3588_DCPHY) in vehicle_cif_csi_stream_stop()
3196 vehicle_csi2_dcphy_stream_stop(cif); in vehicle_cif_csi_stream_stop()
3198 vehicle_csi2_dphy_stream_stop(cif); in vehicle_cif_csi_stream_stop()
3203 static int vehicle_cif_csi2_s_stream(struct vehicle_cif *cif, in vehicle_cif_csi2_s_stream() argument
3213 channel = &cif->channels[0]; in vehicle_cif_csi2_s_stream()
3222 infmt = find_input_fmt(cif->cif_cfg.mbus_code); in vehicle_cif_csi2_s_stream()
3229 rkcif_write_reg(cif, get_reg_index_of_id_ctrl0(channel->id), val); in vehicle_cif_csi2_s_stream()
3230 cif->state = RKCIF_STATE_STREAMING; in vehicle_cif_csi2_s_stream()
3233 val = rkcif_read_reg(cif, get_reg_index_of_id_ctrl0(id)); in vehicle_cif_csi2_s_stream()
3236 rkcif_write_reg(cif, get_reg_index_of_id_ctrl0(id), val); in vehicle_cif_csi2_s_stream()
3238 rkcif_write_reg_or(cif, CIF_REG_MIPI_LVDS_INTSTAT, in vehicle_cif_csi2_s_stream()
3243 rkcif_write_reg_and(cif, CIF_REG_MIPI_LVDS_INTEN, in vehicle_cif_csi2_s_stream()
3248 rkcif_write_reg_and(cif, CIF_REG_MIPI_LVDS_INTEN, in vehicle_cif_csi2_s_stream()
3250 cif->state = RKCIF_STATE_READY; in vehicle_cif_csi2_s_stream()
3256 static int vehicle_cif_csi2_s_stream_v1(struct vehicle_cif *cif, in vehicle_cif_csi2_s_stream_v1() argument
3264 struct vehicle_cfg *cfg = &cif->cif_cfg; in vehicle_cif_csi2_s_stream_v1()
3267 channel = &cif->channels[0]; in vehicle_cif_csi2_s_stream_v1()
3274 infmt = find_input_fmt(cif->cif_cfg.mbus_code); in vehicle_cif_csi2_s_stream_v1()
3290 rkcif_write_reg(cif, get_reg_index_of_id_ctrl0(channel->id), val); in vehicle_cif_csi2_s_stream_v1()
3291 rkcif_write_reg(cif, CIF_REG_MIPI_EFFECT_CODE_ID0, 0x02410251); in vehicle_cif_csi2_s_stream_v1()
3292 rkcif_write_reg(cif, CIF_REG_MIPI_EFFECT_CODE_ID1, 0x02420252); in vehicle_cif_csi2_s_stream_v1()
3293 cif->state = RKCIF_STATE_STREAMING; in vehicle_cif_csi2_s_stream_v1()
3296 val = rkcif_read_reg(cif, get_reg_index_of_id_ctrl0(id)); in vehicle_cif_csi2_s_stream_v1()
3299 rkcif_write_reg(cif, get_reg_index_of_id_ctrl0(id), val); in vehicle_cif_csi2_s_stream_v1()
3301 rkcif_write_reg_or(cif, CIF_REG_MIPI_LVDS_INTSTAT, in vehicle_cif_csi2_s_stream_v1()
3306 rkcif_write_reg_and(cif, CIF_REG_MIPI_LVDS_INTEN, in vehicle_cif_csi2_s_stream_v1()
3311 rkcif_write_reg_and(cif, CIF_REG_MIPI_LVDS_INTEN, in vehicle_cif_csi2_s_stream_v1()
3313 cif->state = RKCIF_STATE_READY; in vehicle_cif_csi2_s_stream_v1()
3319 static int cif_interrupt_setup(struct vehicle_cif *cif) in cif_interrupt_setup() argument
3321 rkcif_write_reg(cif, CIF_REG_DVP_INTEN, in cif_interrupt_setup()
3326 rkcif_write_reg(cif, CIF_REG_DVP_LINE_INT_NUM, 0x1); in cif_interrupt_setup()
3327 rkcif_write_reg(cif, CIF_REG_DVP_INTEN, LINE_INT_EN); in cif_interrupt_setup()
3332 static void vehicle_cif_dvp_dump_regs(struct vehicle_cif *cif) in vehicle_cif_dvp_dump_regs() argument
3339 val = rkcif_read_reg(cif, CIF_REG_DVP_CTRL); in vehicle_cif_dvp_dump_regs()
3342 val = rkcif_read_reg(cif, CIF_REG_DVP_INTEN); in vehicle_cif_dvp_dump_regs()
3345 val = rkcif_read_reg(cif, CIF_REG_DVP_INTSTAT); in vehicle_cif_dvp_dump_regs()
3348 val = rkcif_read_reg(cif, CIF_REG_DVP_FOR); in vehicle_cif_dvp_dump_regs()
3351 val = rkcif_read_reg(cif, CIF_REG_DVP_MULTI_ID); in vehicle_cif_dvp_dump_regs()
3354 val = rkcif_read_reg(cif, CIF_REG_DVP_LINE_NUM_ADDR); in vehicle_cif_dvp_dump_regs()
3357 val = rkcif_read_reg(cif, CIF_REG_DVP_FRM0_ADDR_Y); in vehicle_cif_dvp_dump_regs()
3360 val = rkcif_read_reg(cif, CIF_REG_DVP_FRM0_ADDR_UV); in vehicle_cif_dvp_dump_regs()
3363 val = rkcif_read_reg(cif, CIF_REG_DVP_FRM1_ADDR_Y); in vehicle_cif_dvp_dump_regs()
3366 val = rkcif_read_reg(cif, CIF_REG_DVP_FRM1_ADDR_UV); in vehicle_cif_dvp_dump_regs()
3369 val = rkcif_read_reg(cif, CIF_REG_DVP_VIR_LINE_WIDTH); in vehicle_cif_dvp_dump_regs()
3372 val = rkcif_read_reg(cif, CIF_REG_DVP_SET_SIZE); in vehicle_cif_dvp_dump_regs()
3375 val = rkcif_read_reg(cif, CIF_REG_DVP_LINE_INT_NUM); in vehicle_cif_dvp_dump_regs()
3378 val = rkcif_read_reg(cif, CIF_REG_DVP_LINE_CNT); in vehicle_cif_dvp_dump_regs()
3381 val = rkcif_read_reg(cif, CIF_REG_DVP_CROP); in vehicle_cif_dvp_dump_regs()
3384 val = rkcif_read_reg(cif, CIF_REG_DVP_SCL_CTRL); in vehicle_cif_dvp_dump_regs()
3387 val = rkcif_read_reg(cif, CIF_REG_DVP_FRAME_STATUS); in vehicle_cif_dvp_dump_regs()
3390 val = rkcif_read_reg(cif, CIF_REG_DVP_CUR_DST); in vehicle_cif_dvp_dump_regs()
3393 val = rkcif_read_reg(cif, CIF_REG_DVP_LAST_LINE); in vehicle_cif_dvp_dump_regs()
3396 val = rkcif_read_reg(cif, CIF_REG_DVP_LAST_PIX); in vehicle_cif_dvp_dump_regs()
3399 val = rkcif_read_reg(cif, CIF_REG_DVP_SCL_VALID_NUM); in vehicle_cif_dvp_dump_regs()
3402 val = rkcif_read_reg(cif, CIF_REG_DVP_LINE_NUM_ADDR); in vehicle_cif_dvp_dump_regs()
3406 val = rkvehicle_cif_read_grf_reg(cif, CIF_REG_GRF_CIFIO_CON); in vehicle_cif_dvp_dump_regs()
3410 static void vehicle_cif_csi2_dump_regs(struct vehicle_cif *cif) in vehicle_cif_csi2_dump_regs() argument
3413 void __iomem *csi2_base = cif->csi2_base; in vehicle_cif_csi2_dump_regs()
3414 struct csi2_dphy_hw *hw = cif->dphy_hw; in vehicle_cif_csi2_dump_regs()
3420 if (cif->dphy_hw->chip_id == CHIP_ID_RK3588) { in vehicle_cif_csi2_dump_regs()
3460 val = rkcif_read_reg(cif, CIF_REG_MIPI_LVDS_CTRL); in vehicle_cif_csi2_dump_regs()
3463 val = rkcif_read_reg(cif, CIF_REG_MIPI_LVDS_INTEN); in vehicle_cif_csi2_dump_regs()
3466 val = rkcif_read_reg(cif, CIF_REG_MIPI_LVDS_INTSTAT); in vehicle_cif_csi2_dump_regs()
3469 val = rkcif_read_reg(cif, CIF_REG_MIPI_LVDS_ID0_CTRL0); in vehicle_cif_csi2_dump_regs()
3472 val = rkcif_read_reg(cif, CIF_REG_MIPI_LVDS_ID0_CTRL1); in vehicle_cif_csi2_dump_regs()
3475 val = rkcif_read_reg(cif, CIF_REG_MIPI_LVDS_LINE_INT_NUM_ID0_1); in vehicle_cif_csi2_dump_regs()
3478 val = rkcif_read_reg(cif, CIF_REG_MIPI_LVDS_LINE_INT_NUM_ID2_3); in vehicle_cif_csi2_dump_regs()
3481 val = rkcif_read_reg(cif, CIF_REG_MIPI_LVDS_FRAME0_VLW_Y_ID0); in vehicle_cif_csi2_dump_regs()
3484 val = rkcif_read_reg(cif, CIF_REG_MIPI_LVDS_FRAME0_VLW_UV_ID0); in vehicle_cif_csi2_dump_regs()
3487 val = rkcif_read_reg(cif, CIF_REG_MIPI_LVDS_FRAME1_VLW_Y_ID0); in vehicle_cif_csi2_dump_regs()
3490 val = rkcif_read_reg(cif, CIF_REG_MIPI_LVDS_FRAME1_VLW_UV_ID0); in vehicle_cif_csi2_dump_regs()
3493 val = rkcif_read_reg(cif, CIF_REG_MIPI_LVDS_FRAME0_ADDR_Y_ID0); in vehicle_cif_csi2_dump_regs()
3496 val = rkcif_read_reg(cif, CIF_REG_MIPI_LVDS_FRAME0_ADDR_UV_ID0); in vehicle_cif_csi2_dump_regs()
3499 val = rkcif_read_reg(cif, CIF_REG_MIPI_LVDS_FRAME1_ADDR_Y_ID0); in vehicle_cif_csi2_dump_regs()
3502 val = rkcif_read_reg(cif, CIF_REG_MIPI_LVDS_FRAME1_ADDR_UV_ID0); in vehicle_cif_csi2_dump_regs()
3505 val = rkcif_read_reg(cif, CIF_REG_MIPI_LVDS_ID0_CROP_START); in vehicle_cif_csi2_dump_regs()
3509 val = rkvehicle_cif_read_grf_reg(cif, CIF_REG_GRF_CIFIO_CON); in vehicle_cif_csi2_dump_regs()
3513 static int vehicle_cif_s_stream(struct vehicle_cif *cif, int enable) in vehicle_cif_s_stream() argument
3518 cif->is_enabled = enable; in vehicle_cif_s_stream()
3523 cif->irqinfo.cifirq_idx = 0; in vehicle_cif_s_stream()
3524 cif->irqinfo.cifirq_normal_idx = 0; in vehicle_cif_s_stream()
3525 cif->irqinfo.cifirq_abnormal_idx = 0; in vehicle_cif_s_stream()
3526 cif->irqinfo.dmairq_idx = 0; in vehicle_cif_s_stream()
3527 cif->irqinfo.all_err_cnt = 0; in vehicle_cif_s_stream()
3528 cif->irqinfo.dvp_bus_err_cnt = 0; in vehicle_cif_s_stream()
3529 cif->irqinfo.dvp_overflow_cnt = 0; in vehicle_cif_s_stream()
3530 cif->irqinfo.dvp_pix_err_cnt = 0; in vehicle_cif_s_stream()
3531 cif->irqinfo.dvp_line_err_cnt = 0; in vehicle_cif_s_stream()
3532 cif->irqinfo.dvp_size_err_cnt = 0; in vehicle_cif_s_stream()
3533 cif->irqinfo.dvp_bwidth_lack_cnt = 0; in vehicle_cif_s_stream()
3534 cif->irqinfo.csi_size_err_cnt = 0; in vehicle_cif_s_stream()
3536 rkcif_write_reg(cif, CIF_REG_DVP_INTEN, in vehicle_cif_s_stream()
3540 if (cif->chip_id == CHIP_RK3588_VEHICLE_CIF) { in vehicle_cif_s_stream()
3541 rkcif_write_reg(cif, CIF_REG_DVP_LINE_INT_NUM, 0x1); in vehicle_cif_s_stream()
3542 rkcif_write_reg_or(cif, CIF_REG_DVP_INTEN, 0x033ffff); in vehicle_cif_s_stream()
3546 if (cif->chip_id < CHIP_RK3588_VEHICLE_CIF) in vehicle_cif_s_stream()
3547 rkcif_write_reg(cif, CIF_REG_DVP_CTRL, in vehicle_cif_s_stream()
3550 rkcif_write_reg(cif, CIF_REG_DVP_CTRL, in vehicle_cif_s_stream()
3559 cif->frame_idx = 0; in vehicle_cif_s_stream()
3560 cif->state = RKCIF_STATE_STREAMING; in vehicle_cif_s_stream()
3562 cif_ctrl_val = rkcif_read_reg(cif, CIF_REG_DVP_CTRL); in vehicle_cif_s_stream()
3564 rkcif_write_reg(cif, CIF_REG_DVP_CTRL, cif_ctrl_val); in vehicle_cif_s_stream()
3565 rkcif_write_reg(cif, CIF_REG_DVP_INTEN, 0); in vehicle_cif_s_stream()
3566 rkcif_write_reg(cif, CIF_REG_DVP_INTSTAT, 0x3ff); in vehicle_cif_s_stream()
3567 rkcif_write_reg(cif, CIF_REG_DVP_FRAME_STATUS, 0x0); in vehicle_cif_s_stream()
3568 cif->state = RKCIF_STATE_READY; in vehicle_cif_s_stream()
3574 static int vehicle_cif_create_dummy_buf(struct vehicle_cif *cif) in vehicle_cif_create_dummy_buf() argument
3576 struct vehicle_rkcif_dummy_buffer *dummy_buf = &cif->dummy_buf; in vehicle_cif_create_dummy_buf()
3577 struct vehicle_cfg *cfg = &cif->cif_cfg; in vehicle_cif_create_dummy_buf()
3582 dummy_buf->vaddr = dma_alloc_coherent(cif->dev, dummy_buf->size, in vehicle_cif_create_dummy_buf()
3595 static void vehicle_cif_destroy_dummy_buf(struct vehicle_cif *cif) in vehicle_cif_destroy_dummy_buf() argument
3597 struct vehicle_rkcif_dummy_buffer *dummy_buf = &cif->dummy_buf; in vehicle_cif_destroy_dummy_buf()
3602 dma_free_coherent(cif->dev, dummy_buf->size, in vehicle_cif_destroy_dummy_buf()
3608 static void vehicle_cif_hw_soft_reset(struct vehicle_cif *cif) in vehicle_cif_hw_soft_reset() argument
3611 struct rk_cif_clk *clk = &cif->clk; in vehicle_cif_hw_soft_reset()
3622 static void vehicle_rkcif_do_soft_reset(struct vehicle_cif *cif) in vehicle_rkcif_do_soft_reset() argument
3624 if (cif->cif_cfg.type == V4L2_MBUS_CSI2_DPHY) in vehicle_rkcif_do_soft_reset()
3625 rkcif_write_reg_or(cif, CIF_REG_MIPI_LVDS_CTRL, 0x000A0000); in vehicle_rkcif_do_soft_reset()
3627 rkcif_write_reg_or(cif, CIF_REG_DVP_CTRL, 0x000A0000); in vehicle_rkcif_do_soft_reset()
3632 static int vehicle_cif_do_stop_stream(struct vehicle_cif *cif) in vehicle_cif_do_stop_stream() argument
3634 if (!cif) in vehicle_cif_do_stop_stream()
3637 if (cif->cif_cfg.type == V4L2_MBUS_CSI2_DPHY) { in vehicle_cif_do_stop_stream()
3638 if (cif->chip_id >= CHIP_RK3588_VEHICLE_CIF) { in vehicle_cif_do_stop_stream()
3639 vehicle_cif_csi2_s_stream_v1(cif, 0, V4L2_MBUS_CSI2_DPHY); in vehicle_cif_do_stop_stream()
3640 vehicle_cif_csi_stream_stop(cif); in vehicle_cif_do_stop_stream()
3642 vehicle_cif_csi2_s_stream(cif, 0, V4L2_MBUS_CSI2_DPHY); in vehicle_cif_do_stop_stream()
3643 vehicle_cif_csi_stream_stop(cif); in vehicle_cif_do_stop_stream()
3646 vehicle_cif_s_stream(cif, 0); in vehicle_cif_do_stop_stream()
3648 if (cif->chip_id >= CHIP_RK3588_VEHICLE_CIF) in vehicle_cif_do_stop_stream()
3649 vehicle_rkcif_do_soft_reset(cif); in vehicle_cif_do_stop_stream()
3650 vehicle_cif_destroy_dummy_buf(cif); in vehicle_cif_do_stop_stream()
3655 static int vehicle_cif_do_start_stream(struct vehicle_cif *cif) in vehicle_cif_do_start_stream() argument
3659 if (!cif) in vehicle_cif_do_start_stream()
3662 if (cif->cif_cfg.type == V4L2_MBUS_CSI2_DPHY) { in vehicle_cif_do_start_stream()
3665 cif_csi_stream_setup(cif); in vehicle_cif_do_start_stream()
3668 ret = vehicle_cif_create_dummy_buf(cif); in vehicle_cif_do_start_stream()
3673 if (vehicle_cif_init_buffer(cif, 1, cif->channels[0].id) < 0) in vehicle_cif_do_start_stream()
3677 vehicle_cif_csi2_dump_regs(cif); in vehicle_cif_do_start_stream()
3680 if (cif->chip_id >= CHIP_RK3588_VEHICLE_CIF) in vehicle_cif_do_start_stream()
3681 vehicle_cif_csi2_s_stream_v1(cif, 1, V4L2_MBUS_CSI2_DPHY); in vehicle_cif_do_start_stream()
3683 vehicle_cif_csi2_s_stream(cif, 1, V4L2_MBUS_CSI2_DPHY); in vehicle_cif_do_start_stream()
3687 cif_stream_setup(cif); in vehicle_cif_do_start_stream()
3690 ret = vehicle_cif_create_dummy_buf(cif); in vehicle_cif_do_start_stream()
3695 if (vehicle_cif_init_buffer(cif, 1, 0) < 0) in vehicle_cif_do_start_stream()
3699 if (cif->chip_id < CHIP_RK3588_VEHICLE_CIF) in vehicle_cif_do_start_stream()
3700 cif_interrupt_setup(cif); in vehicle_cif_do_start_stream()
3703 vehicle_cif_dvp_dump_regs(cif); in vehicle_cif_do_start_stream()
3706 vehicle_cif_s_stream(cif, 1); in vehicle_cif_do_start_stream()
3715 static void vehicle_cif_reset(struct vehicle_cif *cif, int only_rst) in vehicle_cif_reset() argument
3719 mutex_lock(&cif->stream_lock); in vehicle_cif_reset()
3720 if (cif->cif_cfg.type == V4L2_MBUS_CSI2_DPHY) { in vehicle_cif_reset()
3725 vehicle_cif_hw_soft_reset(cif); in vehicle_cif_reset()
3727 vehicle_cif_do_stop_stream(cif); in vehicle_cif_reset()
3728 vehicle_cif_hw_soft_reset(cif); in vehicle_cif_reset()
3729 vehicle_cif_do_start_stream(cif); in vehicle_cif_reset()
3738 vehicle_cif_hw_soft_reset(cif); in vehicle_cif_reset()
3740 ctrl_reg = rkcif_read_reg(cif, CIF_REG_DVP_CTRL); in vehicle_cif_reset()
3742 rkcif_write_reg(cif, CIF_REG_DVP_CTRL, in vehicle_cif_reset()
3745 crop_reg = rkcif_read_reg(cif, CIF_REG_DVP_CROP); in vehicle_cif_reset()
3746 set_size_reg = rkcif_read_reg(cif, CIF_REG_DVP_SET_SIZE); in vehicle_cif_reset()
3747 inten_reg = rkcif_read_reg(cif, CIF_REG_DVP_INTEN); in vehicle_cif_reset()
3748 for_reg = rkcif_read_reg(cif, CIF_REG_DVP_FOR); in vehicle_cif_reset()
3749 vir_line_width_reg = rkcif_read_reg(cif, in vehicle_cif_reset()
3751 scl_reg = rkcif_read_reg(cif, CIF_REG_DVP_SCL_CTRL); in vehicle_cif_reset()
3752 y0_reg = rkcif_read_reg(cif, CIF_REG_DVP_FRM0_ADDR_Y); in vehicle_cif_reset()
3753 uv0_reg = rkcif_read_reg(cif, CIF_REG_DVP_FRM0_ADDR_UV); in vehicle_cif_reset()
3754 y1_reg = rkcif_read_reg(cif, CIF_REG_DVP_FRM1_ADDR_Y); in vehicle_cif_reset()
3755 uv1_reg = rkcif_read_reg(cif, CIF_REG_DVP_FRM1_ADDR_UV); in vehicle_cif_reset()
3758 vehicle_cif_hw_soft_reset(cif); in vehicle_cif_reset()
3759 vehicle_rkcif_disable_sys_clk(&cif->clk); in vehicle_cif_reset()
3761 ret = vehicle_rkcif_enable_sys_clk(&cif->clk); in vehicle_cif_reset()
3767 rkcif_write_reg(cif, CIF_REG_DVP_CTRL, in vehicle_cif_reset()
3769 rkcif_write_reg(cif, CIF_REG_DVP_INTEN, inten_reg); in vehicle_cif_reset()
3770 rkcif_write_reg(cif, CIF_REG_DVP_CROP, crop_reg); in vehicle_cif_reset()
3771 rkcif_write_reg(cif, CIF_REG_DVP_SET_SIZE, set_size_reg); in vehicle_cif_reset()
3772 rkcif_write_reg(cif, CIF_REG_DVP_FOR, for_reg); in vehicle_cif_reset()
3773 rkcif_write_reg(cif, CIF_REG_DVP_VIR_LINE_WIDTH, in vehicle_cif_reset()
3775 rkcif_write_reg(cif, CIF_REG_DVP_SCL_CTRL, scl_reg); in vehicle_cif_reset()
3776 rkcif_write_reg(cif, CIF_REG_DVP_FRM0_ADDR_Y, y0_reg); in vehicle_cif_reset()
3777 rkcif_write_reg(cif, CIF_REG_DVP_FRM0_ADDR_UV, uv0_reg); in vehicle_cif_reset()
3778 rkcif_write_reg(cif, CIF_REG_DVP_FRM1_ADDR_Y, y1_reg); in vehicle_cif_reset()
3779 rkcif_write_reg(cif, CIF_REG_DVP_FRM1_ADDR_UV, uv1_reg); in vehicle_cif_reset()
3783 mutex_unlock(&cif->stream_lock); in vehicle_cif_reset()
3786 static void vehicle_cif_reset_delay(struct vehicle_cif *cif) in vehicle_cif_reset_delay() argument
3789 vehicle_cif_reset(cif, 0); in vehicle_cif_reset_delay()
3791 vehicle_cif_s_stream(cif, 1); in vehicle_cif_reset_delay()
3807 struct vehicle_cif *cif = container_of(work, struct vehicle_cif, in vehicle_cif_reset_work_func() local
3810 if (cif->stopping) in vehicle_cif_reset_work_func()
3813 atomic_set(&cif->reset_status, 1); in vehicle_cif_reset_work_func()
3814 vehicle_cif_reset_delay(cif); in vehicle_cif_reset_work_func()
3815 atomic_set(&cif->reset_status, 0); in vehicle_cif_reset_work_func()
3816 wake_up(&cif->wq_stopped); in vehicle_cif_reset_work_func()
3821 struct vehicle_cif *cif = g_cif; in vehicle_wait_cif_reset_done() local
3825 ret = wait_event_timeout(cif->wq_stopped, in vehicle_wait_cif_reset_done()
3826 !atomic_read(&cif->reset_status), in vehicle_wait_cif_reset_done()
3839 static int cif_irq_error_process(struct vehicle_cif *cif, unsigned int reg_intstat) in cif_irq_error_process() argument
3842 cif->irqinfo.all_err_cnt); in cif_irq_error_process()
3844 cif->irqinfo.all_err_cnt++; in cif_irq_error_process()
3847 cif->irqinfo.dvp_bus_err_cnt++; in cif_irq_error_process()
3852 cif->irqinfo.dvp_overflow_cnt++; in cif_irq_error_process()
3857 cif->irqinfo.dvp_line_err_cnt++; in cif_irq_error_process()
3862 cif->irqinfo.dvp_pix_err_cnt++; in cif_irq_error_process()
3866 if (cif->irqinfo.all_err_cnt < 10) { in cif_irq_error_process()
3870 mask = rkcif_read_reg(cif, CIF_REG_DVP_INTEN); in cif_irq_error_process()
3872 rkcif_write_reg(cif, CIF_REG_DVP_INTEN, mask); in cif_irq_error_process()
3874 } else if (cif->irqinfo.all_err_cnt >= 10) { in cif_irq_error_process()
3877 mask = rkcif_read_reg(cif, CIF_REG_DVP_INTEN); in cif_irq_error_process()
3879 rkcif_write_reg(cif, CIF_REG_DVP_INTEN, mask); in cif_irq_error_process()
3950 static int vehicle_cif_next_buffer(struct vehicle_cif *cif, u32 frame_ready, int mipi_id) in vehicle_cif_next_buffer() argument
3957 struct vehicle_rkcif_dummy_buffer *dummy_buf = &cif->dummy_buf; in vehicle_cif_next_buffer()
3961 if ((frame_ready > 1) || (cif->cif_cfg.buf_num < 2) || in vehicle_cif_next_buffer()
3962 (cif->cif_cfg.buf_num > MAX_BUF_NUM)) in vehicle_cif_next_buffer()
3965 cif->last_buf_index = cif->current_buf_index; in vehicle_cif_next_buffer()
3966 cif->current_buf_index = (cif->current_buf_index + 1) % in vehicle_cif_next_buffer()
3967 cif->cif_cfg.buf_num; in vehicle_cif_next_buffer()
3969 if (cif->cif_cfg.type == V4L2_MBUS_CSI2_DPHY) { in vehicle_cif_next_buffer()
3975 frame_id = rkcif_read_reg(cif, frm_num_reg); in vehicle_cif_next_buffer()
3985 spin_lock(&cif->vbq_lock); in vehicle_cif_next_buffer()
3987 if (!cif->interlaced_enable) { in vehicle_cif_next_buffer()
3991 spin_unlock(&cif->vbq_lock); in vehicle_cif_next_buffer()
3994 rkcif_write_reg(cif, frm0_addr_y, dummy_buf->dma_addr); in vehicle_cif_next_buffer()
3995 rkcif_write_reg(cif, frm0_addr_uv, dummy_buf->dma_addr); in vehicle_cif_next_buffer()
3997 rkcif_write_reg(cif, frm1_addr_y, dummy_buf->dma_addr); in vehicle_cif_next_buffer()
3998 rkcif_write_reg(cif, frm1_addr_uv, dummy_buf->dma_addr); in vehicle_cif_next_buffer()
4012 (frame_id == 0 && (cif->interlaced_counts % 2 == 0))) { in vehicle_cif_next_buffer()
4016 spin_unlock(&cif->vbq_lock); in vehicle_cif_next_buffer()
4024 y_addr = temp_y_addr + cif->interlaced_offset; in vehicle_cif_next_buffer()
4026 uv_addr = temp_uv_addr + cif->interlaced_offset; in vehicle_cif_next_buffer()
4030 spin_unlock(&cif->vbq_lock); in vehicle_cif_next_buffer()
4034 WARN_ON(y_addr == cif->interlaced_offset); in vehicle_cif_next_buffer()
4035 WARN_ON(uv_addr == cif->interlaced_offset); in vehicle_cif_next_buffer()
4039 rkcif_write_reg(cif, frm0_addr_y, y_addr); in vehicle_cif_next_buffer()
4040 rkcif_write_reg(cif, frm0_addr_uv, uv_addr); in vehicle_cif_next_buffer()
4041 cif->active[0] = temp_y_addr; in vehicle_cif_next_buffer()
4043 rkcif_write_reg(cif, frm1_addr_y, y_addr); in vehicle_cif_next_buffer()
4044 rkcif_write_reg(cif, frm1_addr_uv, uv_addr); in vehicle_cif_next_buffer()
4045 cif->active[1] = temp_y_addr; in vehicle_cif_next_buffer()
4047 cif->interlaced_counts++; in vehicle_cif_next_buffer()
4048 spin_unlock(&cif->vbq_lock); in vehicle_cif_next_buffer()
4058 struct vehicle_cif *cif = (struct vehicle_cif *)data; in rk_camera_irq() local
4074 cif->irqinfo.cifirq_normal_idx, cif->frame_idx); in rk_camera_irq()
4075 if (cif->cif_cfg.type == V4L2_MBUS_CSI2_DPHY) { in rk_camera_irq()
4076 if (!cif->stopping) { in rk_camera_irq()
4077 if (cif->irqinfo.cifirq_normal_idx == cif->frame_idx) { in rk_camera_irq()
4078 cif->irqinfo.cifirq_abnormal_idx++; in rk_camera_irq()
4080 cif->irqinfo.cifirq_normal_idx = cif->frame_idx; in rk_camera_irq()
4081 cif->irqinfo.cifirq_abnormal_idx = 0; in rk_camera_irq()
4085 intstat = rkcif_read_reg(cif, CIF_REG_MIPI_LVDS_INTSTAT); in rk_camera_irq()
4086 lastline = rkcif_read_reg(cif, CIF_REG_MIPI_LVDS_LINE_LINE_CNT_ID0_1); in rk_camera_irq()
4089 rkcif_write_reg(cif, CIF_REG_MIPI_LVDS_INTSTAT, intstat); in rk_camera_irq()
4092 if (cif->irqinfo.cifirq_abnormal_idx >= 5) { in rk_camera_irq()
4095 cif->irqinfo.cifirq_abnormal_idx); in rk_camera_irq()
4098 cif->irqinfo.cifirq_abnormal_idx = 0; in rk_camera_irq()
4104 cif->irqinfo.csi_overflow_cnt++; in rk_camera_irq()
4112 cif->irqinfo.csi_bwidth_lack_cnt++; in rk_camera_irq()
4116 if (cif->irqinfo.csi_bwidth_lack_cnt >= 5) { in rk_camera_irq()
4125 cif->irqinfo.all_err_cnt++; in rk_camera_irq()
4143 if (cif->stopping) { in rk_camera_irq()
4144 vehicle_cif_csi2_s_stream(cif, 0, V4L2_MBUS_CSI2_DPHY); in rk_camera_irq()
4145 cif->stopping = false; in rk_camera_irq()
4146 wake_up(&cif->wq_stopped); in rk_camera_irq()
4150 if (cif->state != RKCIF_STATE_STREAMING) in rk_camera_irq()
4177 addr = cif->active[frame_ready]; in rk_camera_irq()
4178 if (vehicle_cif_next_buffer(cif, frame_ready, mipi_id) < 0) in rk_camera_irq()
4183 cif->frame_idx++; in rk_camera_irq()
4185 intstat = rkcif_read_reg(cif, CIF_REG_DVP_INTSTAT); in rk_camera_irq()
4186 cif_frmst = rkcif_read_reg(cif, CIF_REG_DVP_FRAME_STATUS); in rk_camera_irq()
4187 lastline = rkcif_read_reg(cif, CIF_REG_DVP_LAST_LINE); in rk_camera_irq()
4189 lastpix = rkcif_read_reg(cif, CIF_REG_DVP_LAST_PIX); in rk_camera_irq()
4191 ctl = rkcif_read_reg(cif, CIF_REG_DVP_CTRL); in rk_camera_irq()
4195 rkcif_write_reg(cif, CIF_REG_DVP_INTSTAT, intstat); in rk_camera_irq()
4200 int_en = rkcif_read_reg(cif, CIF_REG_DVP_INTEN); in rk_camera_irq()
4202 rkcif_write_reg(cif, CIF_REG_DVP_INTEN, int_en); in rk_camera_irq()
4208 if (cif_irq_error_process(cif, intstat) < 0) { in rk_camera_irq()
4223 cif->irqinfo.cifirq_idx++; in rk_camera_irq()
4224 if (cif->stopping) { in rk_camera_irq()
4226 vehicle_cif_s_stream(cif, 0); in rk_camera_irq()
4227 cif->stopping = false; in rk_camera_irq()
4228 wake_up(&cif->wq_stopped); in rk_camera_irq()
4234 int_en = rkcif_read_reg(cif, CIF_REG_DVP_INTEN); in rk_camera_irq()
4236 rkcif_write_reg(cif, CIF_REG_DVP_INTEN, int_en); in rk_camera_irq()
4238 if (cif->stopping) { in rk_camera_irq()
4239 vehicle_cif_s_stream(cif, 0); in rk_camera_irq()
4240 cif->stopping = false; in rk_camera_irq()
4241 wake_up(&cif->wq_stopped); in rk_camera_irq()
4249 rkcif_write_reg(cif, CIF_REG_DVP_FRAME_STATUS, in rk_camera_irq()
4255 cif_capture_en(cif->base, 0); in rk_camera_irq()
4256 rkcif_write_reg(cif, CIF_REG_DVP_INTEN, 0); in rk_camera_irq()
4257 mod_delayed_work(system_wq, &cif->work, in rk_camera_irq()
4266 addr = cif->active[frame_ready]; in rk_camera_irq()
4267 if (vehicle_cif_next_buffer(cif, frame_ready, mipi_id) < 0) in rk_camera_irq()
4271 cif->frame_idx++; in rk_camera_irq()
4274 cif->irqinfo.all_frm_end_cnt++; in rk_camera_irq()
4282 struct vehicle_cif *cif = (struct vehicle_cif *)data; in rk_camera_irq_v1() local
4297 cif->irqinfo.cifirq_normal_idx, cif->frame_idx); in rk_camera_irq_v1()
4298 if (cif->cif_cfg.type == V4L2_MBUS_CSI2_DPHY) { in rk_camera_irq_v1()
4299 if (!cif->stopping) { in rk_camera_irq_v1()
4300 if (cif->irqinfo.cifirq_normal_idx == cif->frame_idx) { in rk_camera_irq_v1()
4301 cif->irqinfo.cifirq_abnormal_idx++; in rk_camera_irq_v1()
4303 cif->irqinfo.cifirq_normal_idx = cif->frame_idx; in rk_camera_irq_v1()
4304 cif->irqinfo.cifirq_abnormal_idx = 0; in rk_camera_irq_v1()
4308 intstat = rkcif_read_reg(cif, CIF_REG_MIPI_LVDS_INTSTAT); in rk_camera_irq_v1()
4309 lastline = rkcif_read_reg(cif, CIF_REG_MIPI_LVDS_LINE_LINE_CNT_ID0_1); in rk_camera_irq_v1()
4315 rkcif_write_reg(cif, CIF_REG_MIPI_LVDS_INTSTAT, intstat); in rk_camera_irq_v1()
4321 if (cif->irqinfo.cifirq_abnormal_idx >= 5) { in rk_camera_irq_v1()
4324 cif->irqinfo.cifirq_abnormal_idx); in rk_camera_irq_v1()
4325 cif->irqinfo.cifirq_abnormal_idx = 0; in rk_camera_irq_v1()
4331 cif->irqinfo.csi_size_err_cnt++; in rk_camera_irq_v1()
4338 cif->irqinfo.csi_overflow_cnt++; in rk_camera_irq_v1()
4345 cif->irqinfo.csi_bwidth_lack_cnt++; in rk_camera_irq_v1()
4352 cif->irqinfo.all_err_cnt++; in rk_camera_irq_v1()
4369 if (cif->stopping) { in rk_camera_irq_v1()
4370 vehicle_cif_csi2_s_stream_v1(cif, 0, V4L2_MBUS_CSI2_DPHY); in rk_camera_irq_v1()
4371 cif->stopping = false; in rk_camera_irq_v1()
4372 wake_up(&cif->wq_stopped); in rk_camera_irq_v1()
4376 if (cif->state != RKCIF_STATE_STREAMING) in rk_camera_irq_v1()
4403 addr = cif->active[frame_ready]; in rk_camera_irq_v1()
4404 if (vehicle_cif_next_buffer(cif, frame_ready, mipi_id) < 0) in rk_camera_irq_v1()
4409 cif->frame_idx++; in rk_camera_irq_v1()
4413 intstat = rkcif_read_reg(cif, CIF_REG_DVP_INTSTAT); in rk_camera_irq_v1()
4415 rkcif_write_reg(cif, CIF_REG_DVP_INTSTAT, intstat); in rk_camera_irq_v1()
4418 cif->irqinfo.dvp_size_err_cnt++; in rk_camera_irq_v1()
4423 cif->irqinfo.dvp_overflow_cnt++; in rk_camera_irq_v1()
4428 cif->irqinfo.dvp_bwidth_lack_cnt++; in rk_camera_irq_v1()
4433 cif->irqinfo.all_err_cnt++; in rk_camera_irq_v1()
4442 if (cif->stopping) { in rk_camera_irq_v1()
4443 vehicle_cif_s_stream(cif, 0); in rk_camera_irq_v1()
4444 cif->stopping = false; in rk_camera_irq_v1()
4445 wake_up(&cif->wq_stopped); in rk_camera_irq_v1()
4449 if (cif->state != RKCIF_STATE_STREAMING) in rk_camera_irq_v1()
4476 addr = cif->active[frame_ready]; in rk_camera_irq_v1()
4477 if (vehicle_cif_next_buffer(cif, frame_ready, ch_id) < 0) in rk_camera_irq_v1()
4482 cif->frame_idx++; in rk_camera_irq_v1()
4485 cif->irqinfo.all_frm_end_cnt++; in rk_camera_irq_v1()
4524 struct vehicle_cif *cif = (struct vehicle_cif *)data; in vehicle_csirx_irq1() local
4525 struct csi2_dphy_hw *hw = cif->dphy_hw; in vehicle_csirx_irq1()
4599 cif->err_state.err_val = val; in vehicle_csirx_irq1()
4600 cif->err_state.err_num = 1; in vehicle_csirx_irq1()
4601 cif->err_state.err_stat = err_stat; in vehicle_csirx_irq1()
4602 strscpy(cif->err_state.err_str, err_str, CSI_ERRSTR_LEN); in vehicle_csirx_irq1()
4603 queue_work(cif->err_state.err_print_wq, &cif->err_state.work); in vehicle_csirx_irq1()
4612 struct vehicle_cif *cif = (struct vehicle_cif *)data; in vehicle_csirx_irq2() local
4613 struct csi2_dphy_hw *hw = cif->dphy_hw; in vehicle_csirx_irq2()
4645 cif->err_state.err_val = val; in vehicle_csirx_irq2()
4646 cif->err_state.err_num = 2; in vehicle_csirx_irq2()
4647 strscpy(cif->err_state.err_str, err_str, CSI_ERRSTR_LEN); in vehicle_csirx_irq2()
4648 queue_work(cif->err_state.err_print_wq, &cif->err_state.work); in vehicle_csirx_irq2()
4658 struct vehicle_cif *cif = g_cif; in vehicle_cif_reverse_open() local
4660 if (!cif) in vehicle_cif_reverse_open()
4663 mutex_lock(&cif->stream_lock); in vehicle_cif_reverse_open()
4664 memcpy(&cif->cif_cfg, v_cfg, sizeof(struct vehicle_cfg)); in vehicle_cif_reverse_open()
4665 ret = pm_runtime_get_sync(cif->dev); in vehicle_cif_reverse_open()
4667 pm_runtime_put_noidle(cif->dev); in vehicle_cif_reverse_open()
4673 if (cif->dphy_hw->chip_id == CHIP_ID_RK3588_DCPHY) { in vehicle_cif_reverse_open()
4674 if (cif->cif_cfg.dphy_param) { in vehicle_cif_reverse_open()
4675 cif->dphy_hw->dphy_param = cif->cif_cfg.dphy_param; in vehicle_cif_reverse_open()
4676 dev_info(cif->dev, "-----get dphy param from sensor----\n"); in vehicle_cif_reverse_open()
4678 cif->dphy_hw->dphy_param = &rk3588_dcphy_param; in vehicle_cif_reverse_open()
4679 dev_info(cif->dev, "fail to get dphy param, used default value\n"); in vehicle_cif_reverse_open()
4684 vehicle_cif_hw_soft_reset(cif); in vehicle_cif_reverse_open()
4685 if (cif->cif_cfg.type == V4L2_MBUS_CSI2_DPHY) { in vehicle_cif_reverse_open()
4687 cif->dphy_hw->data_rate_mbps = cif->cif_cfg.mipi_freq * 2 / 1000 / 1000; in vehicle_cif_reverse_open()
4690 vehicle_csi2_hw_soft_reset(cif); in vehicle_cif_reverse_open()
4691 if (cif->dphy_hw->chip_id == CHIP_ID_RK3588) in vehicle_cif_reverse_open()
4692 vehicle_csi2_dphy_hw_do_reset(cif); in vehicle_cif_reverse_open()
4694 if (!cif->dphy_hw->on) in vehicle_cif_reverse_open()
4695 vehicle_csi2_clk_ctrl(cif, 1); in vehicle_cif_reverse_open()
4698 cif_csi_stream_setup(cif); in vehicle_cif_reverse_open()
4701 ret = vehicle_cif_create_dummy_buf(cif); in vehicle_cif_reverse_open()
4706 if (vehicle_cif_init_buffer(cif, 1, cif->channels[0].id) < 0) in vehicle_cif_reverse_open()
4710 vehicle_cif_csi2_dump_regs(cif); in vehicle_cif_reverse_open()
4713 if (cif->chip_id >= CHIP_RK3588_VEHICLE_CIF) in vehicle_cif_reverse_open()
4714 vehicle_cif_csi2_s_stream_v1(cif, 1, V4L2_MBUS_CSI2_DPHY); in vehicle_cif_reverse_open()
4716 vehicle_cif_csi2_s_stream(cif, 1, V4L2_MBUS_CSI2_DPHY); in vehicle_cif_reverse_open()
4720 cif_stream_setup(cif); in vehicle_cif_reverse_open()
4723 ret = vehicle_cif_create_dummy_buf(cif); in vehicle_cif_reverse_open()
4728 if (vehicle_cif_init_buffer(cif, 1, 0) < 0) in vehicle_cif_reverse_open()
4732 if (cif->chip_id < CHIP_RK3588_VEHICLE_CIF) in vehicle_cif_reverse_open()
4733 cif_interrupt_setup(cif); in vehicle_cif_reverse_open()
4736 vehicle_cif_dvp_dump_regs(cif); in vehicle_cif_reverse_open()
4739 vehicle_cif_s_stream(cif, 1); in vehicle_cif_reverse_open()
4742 cif->stopping = false; in vehicle_cif_reverse_open()
4743 drop_frames_number = cif->drop_frames; in vehicle_cif_reverse_open()
4745 mutex_unlock(&cif->stream_lock); in vehicle_cif_reverse_open()
4750 mutex_unlock(&cif->stream_lock); in vehicle_cif_reverse_open()
4757 struct vehicle_cif *cif = g_cif; in vehicle_cif_reverse_close() local
4759 if (!cif) in vehicle_cif_reverse_close()
4762 mutex_lock(&cif->stream_lock); in vehicle_cif_reverse_close()
4765 cif->stopping = true; in vehicle_cif_reverse_close()
4766 cancel_delayed_work_sync(&(cif->work)); in vehicle_cif_reverse_close()
4767 flush_delayed_work(&(cif->work)); in vehicle_cif_reverse_close()
4768 cancel_work_sync(&cif->err_state.work); in vehicle_cif_reverse_close()
4770 ret = wait_event_timeout(cif->wq_stopped, in vehicle_cif_reverse_close()
4771 cif->state != RKCIF_STATE_STREAMING, in vehicle_cif_reverse_close()
4775 if (cif->cif_cfg.type == V4L2_MBUS_CSI2_DPHY) { in vehicle_cif_reverse_close()
4776 if (cif->chip_id >= CHIP_RK3588_VEHICLE_CIF) in vehicle_cif_reverse_close()
4777 vehicle_cif_csi2_s_stream_v1(cif, 0, V4L2_MBUS_CSI2_DPHY); in vehicle_cif_reverse_close()
4779 vehicle_cif_csi2_s_stream(cif, 0, V4L2_MBUS_CSI2_DPHY); in vehicle_cif_reverse_close()
4781 vehicle_cif_s_stream(cif, 0); in vehicle_cif_reverse_close()
4785 if (cif->cif_cfg.type == V4L2_MBUS_CSI2_DPHY) { in vehicle_cif_reverse_close()
4786 vehicle_cif_csi_stream_stop(cif); in vehicle_cif_reverse_close()
4787 vehicle_csi2_hw_soft_reset(cif); in vehicle_cif_reverse_close()
4788 if (cif->dphy_hw->chip_id == CHIP_ID_RK3588) in vehicle_cif_reverse_close()
4789 vehicle_csi2_dphy_hw_do_reset(cif); in vehicle_cif_reverse_close()
4790 if (cif->dphy_hw->on) in vehicle_cif_reverse_close()
4791 vehicle_csi2_clk_ctrl(cif, 0); in vehicle_cif_reverse_close()
4794 vehicle_cif_destroy_dummy_buf(cif); in vehicle_cif_reverse_close()
4798 mutex_unlock(&cif->stream_lock); in vehicle_cif_reverse_close()
4799 cif->stopping = false; in vehicle_cif_reverse_close()
4804 static void vehicle_cif_dphy_get_node(struct vehicle_cif *cif) in vehicle_cif_dphy_get_node() argument
4808 struct device *dev = cif->dev; in vehicle_cif_dphy_get_node()
4822 cif->phy_node = cp; in vehicle_cif_dphy_get_node()
4827 static int cif_parse_dt(struct vehicle_cif *cif) in cif_parse_dt() argument
4829 struct device *dev = cif->dev; in cif_parse_dt()
4831 struct device_node *phy_node = cif->phy_node; in cif_parse_dt()
4836 &cif->drop_frames)) { in cif_parse_dt()
4838 cif->drop_frames = 0; //default drop frames; in cif_parse_dt()
4842 &cif->chip_id)) { in cif_parse_dt()
4844 cif->chip_id = CHIP_RK3588_VEHICLE_CIF; //default rk3588; in cif_parse_dt()
4848 cif->base = (char *)of_iomap(cif_node, 0); in cif_parse_dt()
4851 cif->cru_base = of_iomap(node, 0); in cif_parse_dt()
4854 cif->grf_base = of_iomap(node, 0); in cif_parse_dt()
4856 cif->regmap_grf = syscon_regmap_lookup_by_phandle(dev->of_node, "rockchip,grf"); in cif_parse_dt()
4857 if (IS_ERR(cif->regmap_grf)) in cif_parse_dt()
4860 cif->irq = irq_of_parse_and_map(cif_node, 0); in cif_parse_dt()
4861 if (cif->irq < 0) { in cif_parse_dt()
4863 iounmap(cif->base); in cif_parse_dt()
4864 iounmap(cif->cru_base); in cif_parse_dt()
4865 iounmap(cif->grf_base); in cif_parse_dt()
4869 if (of_property_read_u32(phy_node, "csihost-idx", &cif->csi_host_idx)) { in cif_parse_dt()
4872 cif->inf_id = RKCIF_DVP; in cif_parse_dt()
4874 cif->inf_id = RKCIF_MIPI_LVDS; in cif_parse_dt()
4878 if (cif->inf_id == RKCIF_MIPI_LVDS) { in cif_parse_dt()
4879 if (cif->chip_id == CHIP_RK3588_VEHICLE_CIF && in cif_parse_dt()
4880 !(cif->csi_host_idx == RKCIF_MIPI0_CSI2 || in cif_parse_dt()
4881 cif->csi_host_idx == RKCIF_MIPI1_CSI2)) { in cif_parse_dt()
4883 cif->csi2_dphy_base = of_iomap(node, 0); in cif_parse_dt()
4885 cif->regmap_dphy_grf = in cif_parse_dt()
4887 if (IS_ERR(cif->regmap_dphy_grf)) in cif_parse_dt()
4889 } else if (cif->chip_id != CHIP_RK3588_VEHICLE_CIF) { in cif_parse_dt()
4891 cif->csi2_dphy_base = of_iomap(node, 0); in cif_parse_dt()
4895 cif->csi2_base = of_iomap(cis2_node, 0); in cif_parse_dt()
4897 cif->csi2_irq1 = irq_of_parse_and_map(cis2_node, 0); in cif_parse_dt()
4898 if (cif->csi2_irq1 < 0) { in cif_parse_dt()
4900 iounmap(cif->base); in cif_parse_dt()
4901 iounmap(cif->cru_base); in cif_parse_dt()
4902 iounmap(cif->grf_base); in cif_parse_dt()
4903 iounmap(cif->csi2_dphy_base); in cif_parse_dt()
4904 iounmap(cif->csi2_base); in cif_parse_dt()
4908 cif->csi2_irq2 = irq_of_parse_and_map(cis2_node, 1); in cif_parse_dt()
4909 if (cif->csi2_irq2 < 0) { in cif_parse_dt()
4911 iounmap(cif->base); in cif_parse_dt()
4912 iounmap(cif->cru_base); in cif_parse_dt()
4913 iounmap(cif->grf_base); in cif_parse_dt()
4914 iounmap(cif->csi2_dphy_base); in cif_parse_dt()
4915 iounmap(cif->csi2_base); in cif_parse_dt()
4920 VEHICLE_DG("%s, drop_frames = %d\n", __func__, cif->drop_frames); in cif_parse_dt()
4925 int vehicle_cif_init_mclk(struct vehicle_cif *cif) in vehicle_cif_init_mclk() argument
4927 struct device *dev = cif->dev; in vehicle_cif_init_mclk()
4928 struct rk_cif_clk *clk = &cif->clk; in vehicle_cif_init_mclk()
4933 vehicle_cif_dphy_get_node(cif); in vehicle_cif_init_mclk()
4934 clk->xvclk = of_clk_get_by_name(cif->phy_node, "xvclk"); in vehicle_cif_init_mclk()
4940 rkcif_s_mclk(cif, 1, 24000000); in vehicle_cif_init_mclk()
4946 static int vehicle_cif_deinit_mclk(struct vehicle_cif *cif) in vehicle_cif_deinit_mclk() argument
4948 struct rk_cif_clk *clk = &cif->clk; in vehicle_cif_deinit_mclk()
4960 int vehicle_cif_init(struct vehicle_cif *cif) in vehicle_cif_init() argument
4970 if (!cif) in vehicle_cif_init()
4973 dev = cif->dev; in vehicle_cif_init()
4974 clk = &cif->clk; in vehicle_cif_init()
4975 g_cif = cif; in vehicle_cif_init()
4978 if (cif_parse_dt(cif) < -1) { in vehicle_cif_init()
4983 inf_id = cif->inf_id; in vehicle_cif_init()
4985 if (cif->chip_id == CHIP_RK3588_VEHICLE_CIF) { in vehicle_cif_init()
4986 if (cif->csi_host_idx == RKCIF_MIPI0_CSI2 || in vehicle_cif_init()
4987 cif->csi_host_idx == RKCIF_MIPI1_CSI2) in vehicle_cif_init()
4991 } else if (cif->chip_id == CHIP_RK3562_VEHICLE_CIF) { in vehicle_cif_init()
4999 if (cif->chip_id == CHIP_RK3588_VEHICLE_CIF) { in vehicle_cif_init()
5002 } else if (cif->chip_id == CHIP_RK3562_VEHICLE_CIF) { in vehicle_cif_init()
5011 cif->dphy_hw = dphy_hw; in vehicle_cif_init()
5012 dphy_hw->dev = cif->dev; in vehicle_cif_init()
5014 if (cif->dphy_hw->chip_id == CHIP_ID_RK3588) { in vehicle_cif_init()
5015 if (cif->csi_host_idx >= RKCIF_MIPI4_CSI2) in vehicle_cif_init()
5016 cif->dphy_hw->phy_index = 3; in vehicle_cif_init()
5018 cif->dphy_hw->phy_index = 0; in vehicle_cif_init()
5019 } else if (cif->dphy_hw->chip_id == CHIP_ID_RK3562) { in vehicle_cif_init()
5020 if (cif->csi_host_idx >= RKCIF_MIPI2_CSI2) in vehicle_cif_init()
5021 cif->dphy_hw->phy_index = 3; in vehicle_cif_init()
5023 cif->dphy_hw->phy_index = 0; in vehicle_cif_init()
5025 cif->dphy_hw->phy_index = 0; in vehicle_cif_init()
5028 if (cif->dphy_hw->chip_id == CHIP_ID_RK3588_DCPHY) { in vehicle_cif_init()
5032 dcphy = of_phy_get(cif->phy_node, "dcphy"); in vehicle_cif_init()
5039 dcphy_hw->dphy_vehicle[dcphy_hw->dphy_vehicle_num] = cif->dphy_hw; in vehicle_cif_init()
5041 cif->dphy_hw->samsung_phy = dcphy_hw; in vehicle_cif_init()
5044 if (cif->dphy_hw->chip_id == CHIP_ID_RK3588 || in vehicle_cif_init()
5045 cif->dphy_hw->chip_id == CHIP_ID_RK3562) { in vehicle_cif_init()
5049 rst = of_reset_control_get(cif->phy_node, dphy_hw->dphy_rsts[i]); in vehicle_cif_init()
5063 of_clk_get_by_name(cif->phy_node, dphy_hw->dphy_clks[i].id); in vehicle_cif_init()
5076 of_clk_get_by_name(cif->phy_node, dphy_hw->csi2_clks[i].id); in vehicle_cif_init()
5090 rst = of_reset_control_get(cif->phy_node, dphy_hw->csi2_rsts[i]); in vehicle_cif_init()
5100 if (cif->chip_id == CHIP_RK3588_VEHICLE_CIF) { in vehicle_cif_init()
5111 } else if (cif->chip_id == CHIP_RK3562_VEHICLE_CIF) { in vehicle_cif_init()
5136 if (cif->chip_id == CHIP_RK3588_VEHICLE_CIF) { in vehicle_cif_init()
5148 } else if (cif->chip_id == CHIP_RK3562_VEHICLE_CIF) { in vehicle_cif_init()
5175 rk_cif_mclk_ctrl(cif, 1, 24000000); in vehicle_cif_init()
5176 INIT_DELAYED_WORK(&cif->work, vehicle_cif_reset_work_func); in vehicle_cif_init()
5180 if (!cif->dphy_hw->on) in vehicle_cif_init()
5181 vehicle_csi2_clk_ctrl(cif, 1); in vehicle_cif_init()
5184 if (cif->chip_id >= CHIP_RK3588_VEHICLE_CIF) { in vehicle_cif_init()
5185 ret = request_irq(cif->irq, rk_camera_irq_v1, IRQF_SHARED, "vehicle_cif", cif); in vehicle_cif_init()
5191 ret = request_irq(cif->irq, rk_camera_irq, IRQF_SHARED, "vehicle_cif", cif); in vehicle_cif_init()
5201 ret = request_irq(cif->csi2_irq1, vehicle_csirx_irq1, in vehicle_cif_init()
5202 IRQF_SHARED, "vehicle_csi_intr1", cif); in vehicle_cif_init()
5208 ret = request_irq(cif->csi2_irq2, vehicle_csirx_irq2, in vehicle_cif_init()
5209 IRQF_SHARED, "vehicle_csi_intr2", cif); in vehicle_cif_init()
5216 if (cif->chip_id == CHIP_RK3588_VEHICLE_CIF) in vehicle_cif_init()
5217 cif->cif_regs = rk3588_cif_regs; in vehicle_cif_init()
5218 else if (cif->chip_id == CHIP_RK3562_VEHICLE_CIF) in vehicle_cif_init()
5219 cif->cif_regs = rk3562_cif_regs; in vehicle_cif_init()
5221 cif->cif_regs = rk3568_cif_regs; in vehicle_cif_init()
5225 if (cif->dphy_hw->chip_id == CHIP_ID_RK3588 || in vehicle_cif_init()
5226 cif->dphy_hw->chip_id == CHIP_ID_RK3562) in vehicle_cif_init()
5227 cif->dphy_hw->csi2_dphy_base = cif->csi2_dphy_base; in vehicle_cif_init()
5230 cif->dphy_hw->csi2_base = cif->csi2_base; in vehicle_cif_init()
5233 if (cif->chip_id == CHIP_RK3588_VEHICLE_CIF) { in vehicle_cif_init()
5234 if (cif->dphy_hw->chip_id == CHIP_ID_RK3588) { in vehicle_cif_init()
5235 cif->dphy_hw->regmap_grf = cif->regmap_dphy_grf; in vehicle_cif_init()
5236 cif->dphy_hw->regmap_sys_grf = cif->regmap_grf; in vehicle_cif_init()
5239 cif->dphy_hw->regmap_grf = cif->regmap_grf; in vehicle_cif_init()
5244 atomic_set(&cif->reset_status, 0); in vehicle_cif_init()
5245 init_waitqueue_head(&cif->wq_stopped); in vehicle_cif_init()
5247 spin_lock_init(&cif->vbq_lock); in vehicle_cif_init()
5249 INIT_WORK(&cif->err_state.work, vehicle_csi2_err_print_work); in vehicle_cif_init()
5250 cif->err_state.err_print_wq = create_workqueue("cis2_err_print_queue"); in vehicle_cif_init()
5251 if (cif->err_state.err_print_wq == NULL) { in vehicle_cif_init()
5259 int vehicle_cif_deinit(struct vehicle_cif *cif) in vehicle_cif_deinit() argument
5261 struct rk_cif_clk *clk = &cif->clk; in vehicle_cif_deinit()
5262 struct device *dev = cif->dev; in vehicle_cif_deinit()
5264 struct csi2_dphy_hw *dphy_hw = cif->dphy_hw; in vehicle_cif_deinit()
5265 int inf_id = cif->inf_id; in vehicle_cif_deinit()
5271 rk_cif_mclk_ctrl(cif, 0, 0); in vehicle_cif_deinit()
5273 if (cif->dphy_hw->on) in vehicle_cif_deinit()
5274 vehicle_csi2_clk_ctrl(cif, 0); in vehicle_cif_deinit()
5277 vehicle_cif_deinit_mclk(cif); in vehicle_cif_deinit()
5289 if (cif->dphy_hw->chip_id == CHIP_ID_RK3588_DCPHY) { in vehicle_cif_deinit()
5290 struct samsung_mipi_dcphy *dcphy_hw = cif->dphy_hw->samsung_phy; in vehicle_cif_deinit()
5306 if (cif->dphy_hw->chip_id == CHIP_ID_RK3588 || in vehicle_cif_deinit()
5307 cif->dphy_hw->chip_id == CHIP_ID_RK3562) { in vehicle_cif_deinit()
5321 free_irq(cif->irq, cif); in vehicle_cif_deinit()
5323 free_irq(cif->csi2_irq1, cif); in vehicle_cif_deinit()
5324 free_irq(cif->csi2_irq2, cif); in vehicle_cif_deinit()
5326 if (cif->err_state.err_print_wq) { in vehicle_cif_deinit()
5327 flush_workqueue(cif->err_state.err_print_wq); in vehicle_cif_deinit()
5328 destroy_workqueue(cif->err_state.err_print_wq); in vehicle_cif_deinit()