Lines Matching full:dsi
7 * This generic Synopsys DesignWare MIPI DSI host driver is based on the
8 * Rockchip version from rockchip/dw-mipi-dsi.c with phy & bridge APIs.
226 #define VPG_DEFS(name, dsi) \ argument
227 ((void __force *)&((*dsi).vpg_defs.name))
229 #define REGISTER(name, mask, dsi) \ argument
230 { #name, VPG_DEFS(name, dsi), mask, dsi }
236 struct dw_mipi_dsi *dsi; member
266 struct dw_mipi_dsi *master; /* dual-dsi master ptr */
267 struct dw_mipi_dsi *slave; /* dual-dsi slave ptr */
275 static inline bool dw_mipi_is_dual_mode(struct dw_mipi_dsi *dsi) in dw_mipi_is_dual_mode() argument
277 return dsi->slave || dsi->master; in dw_mipi_is_dual_mode()
303 static inline void dsi_write(struct dw_mipi_dsi *dsi, u32 reg, u32 val) in dsi_write() argument
305 writel(val, dsi->base + reg); in dsi_write()
308 static inline u32 dsi_read(struct dw_mipi_dsi *dsi, u32 reg) in dsi_read() argument
310 return readl(dsi->base + reg); in dsi_read()
313 static int dw_mipi_dsi_panel_or_bridge(struct dw_mipi_dsi *dsi, in dw_mipi_dsi_panel_or_bridge() argument
331 dsi->panel_bridge = bridge; in dw_mipi_dsi_panel_or_bridge()
333 if (!dsi->panel_bridge) in dw_mipi_dsi_panel_or_bridge()
342 struct dw_mipi_dsi *dsi = host_to_dsi(host); in dw_mipi_dsi_host_attach() local
343 const struct dw_mipi_dsi_plat_data *pdata = dsi->plat_data; in dw_mipi_dsi_host_attach()
346 if (device->lanes > dsi->plat_data->max_data_lanes) { in dw_mipi_dsi_host_attach()
347 dev_err(dsi->dev, "the number of data lanes(%u) is too many\n", in dw_mipi_dsi_host_attach()
352 dsi->lanes = device->lanes; in dw_mipi_dsi_host_attach()
353 dsi->channel = device->channel; in dw_mipi_dsi_host_attach()
354 dsi->format = device->format; in dw_mipi_dsi_host_attach()
355 dsi->mode_flags = device->mode_flags; in dw_mipi_dsi_host_attach()
357 if (!dsi->device_found) { in dw_mipi_dsi_host_attach()
358 ret = dw_mipi_dsi_panel_or_bridge(dsi, host->dev->of_node); in dw_mipi_dsi_host_attach()
362 dsi->device_found = true; in dw_mipi_dsi_host_attach()
377 struct dw_mipi_dsi *dsi = host_to_dsi(host); in dw_mipi_dsi_host_detach() local
378 const struct dw_mipi_dsi_plat_data *pdata = dsi->plat_data; in dw_mipi_dsi_host_detach()
389 drm_bridge_remove(&dsi->bridge); in dw_mipi_dsi_host_detach()
394 static void dw_mipi_message_config(struct dw_mipi_dsi *dsi, in dw_mipi_message_config() argument
406 dsi_write(dsi, DSI_DPI_LP_CMD_TIM, OUTVACT_LPCMD_TIME(16) in dw_mipi_message_config()
414 dsi_write(dsi, DSI_CMD_MODE_CFG, val); in dw_mipi_message_config()
416 val = dsi_read(dsi, DSI_VID_MODE_CFG); in dw_mipi_message_config()
421 dsi_write(dsi, DSI_VID_MODE_CFG, val); in dw_mipi_message_config()
424 static int dw_mipi_dsi_gen_pkt_hdr_write(struct dw_mipi_dsi *dsi, u32 hdr_val) in dw_mipi_dsi_gen_pkt_hdr_write() argument
429 ret = readl_poll_timeout(dsi->base + DSI_CMD_PKT_STATUS, in dw_mipi_dsi_gen_pkt_hdr_write()
433 dev_err(dsi->dev, "failed to get available command FIFO\n"); in dw_mipi_dsi_gen_pkt_hdr_write()
437 dsi_write(dsi, DSI_GEN_HDR, hdr_val); in dw_mipi_dsi_gen_pkt_hdr_write()
440 ret = readl_poll_timeout(dsi->base + DSI_CMD_PKT_STATUS, in dw_mipi_dsi_gen_pkt_hdr_write()
444 dev_err(dsi->dev, "failed to write command FIFO\n"); in dw_mipi_dsi_gen_pkt_hdr_write()
451 static int dw_mipi_dsi_write(struct dw_mipi_dsi *dsi, in dw_mipi_dsi_write() argument
463 dsi_write(dsi, DSI_GEN_PLD_DATA, le32_to_cpu(word)); in dw_mipi_dsi_write()
467 dsi_write(dsi, DSI_GEN_PLD_DATA, le32_to_cpu(word)); in dw_mipi_dsi_write()
472 ret = readl_poll_timeout(dsi->base + DSI_CMD_PKT_STATUS, in dw_mipi_dsi_write()
476 dev_err(dsi->dev, in dw_mipi_dsi_write()
484 return dw_mipi_dsi_gen_pkt_hdr_write(dsi, le32_to_cpu(word)); in dw_mipi_dsi_write()
487 static int dw_mipi_dsi_read(struct dw_mipi_dsi *dsi, in dw_mipi_dsi_read() argument
495 ret = readl_poll_timeout(dsi->base + DSI_CMD_PKT_STATUS, in dw_mipi_dsi_read()
499 dev_err(dsi->dev, "Timeout during read operation\n"); in dw_mipi_dsi_read()
505 ret = readl_poll_timeout(dsi->base + DSI_CMD_PKT_STATUS, in dw_mipi_dsi_read()
509 dev_err(dsi->dev, "Read payload FIFO is empty\n"); in dw_mipi_dsi_read()
513 val = dsi_read(dsi, DSI_GEN_PLD_DATA); in dw_mipi_dsi_read()
524 struct dw_mipi_dsi *dsi = host_to_dsi(host); in dw_mipi_dsi_host_transfer() local
530 dev_err(dsi->dev, "failed to create packet: %d\n", ret); in dw_mipi_dsi_host_transfer()
534 dw_mipi_message_config(dsi, msg); in dw_mipi_dsi_host_transfer()
535 if (dsi->slave) in dw_mipi_dsi_host_transfer()
536 dw_mipi_message_config(dsi->slave, msg); in dw_mipi_dsi_host_transfer()
538 ret = dw_mipi_dsi_write(dsi, &packet); in dw_mipi_dsi_host_transfer()
541 if (dsi->slave) { in dw_mipi_dsi_host_transfer()
542 ret = dw_mipi_dsi_write(dsi->slave, &packet); in dw_mipi_dsi_host_transfer()
548 ret = dw_mipi_dsi_read(dsi, msg); in dw_mipi_dsi_host_transfer()
565 static void dw_mipi_dsi_video_mode_config(struct dw_mipi_dsi *dsi) in dw_mipi_dsi_video_mode_config() argument
576 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_BURST) in dw_mipi_dsi_video_mode_config()
578 else if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_SYNC_PULSE) in dw_mipi_dsi_video_mode_config()
584 if (dsi->vpg_defs.vpg) { in dw_mipi_dsi_video_mode_config()
586 val |= dsi->vpg_defs.vpg_horizontal ? in dw_mipi_dsi_video_mode_config()
588 val |= dsi->vpg_defs.vpg_ber_pattern ? VID_MODE_VPG_MODE : 0; in dw_mipi_dsi_video_mode_config()
592 dsi_write(dsi, DSI_VID_MODE_CFG, val); in dw_mipi_dsi_video_mode_config()
595 static void dw_mipi_dsi_set_mode(struct dw_mipi_dsi *dsi, in dw_mipi_dsi_set_mode() argument
600 dsi_write(dsi, DSI_PWR_UP, RESET); in dw_mipi_dsi_set_mode()
603 dsi_write(dsi, DSI_MODE_CFG, ENABLE_VIDEO_MODE); in dw_mipi_dsi_set_mode()
604 dw_mipi_dsi_video_mode_config(dsi); in dw_mipi_dsi_set_mode()
606 dsi_write(dsi, DSI_MODE_CFG, ENABLE_CMD_MODE); in dw_mipi_dsi_set_mode()
610 if (dsi->mode_flags & MIPI_DSI_CLOCK_NON_CONTINUOUS) in dw_mipi_dsi_set_mode()
612 dsi_write(dsi, DSI_LPCLK_CTRL, val); in dw_mipi_dsi_set_mode()
614 dsi_write(dsi, DSI_PWR_UP, POWERUP); in dw_mipi_dsi_set_mode()
617 static void dw_mipi_dsi_disable(struct dw_mipi_dsi *dsi) in dw_mipi_dsi_disable() argument
619 dsi_write(dsi, DSI_PWR_UP, RESET); in dw_mipi_dsi_disable()
620 dsi_write(dsi, DSI_PHY_RSTZ, PHY_RSTZ); in dw_mipi_dsi_disable()
623 static void dw_mipi_dsi_init(struct dw_mipi_dsi *dsi) in dw_mipi_dsi_init() argument
625 const struct dw_mipi_dsi_phy_ops *phy_ops = dsi->plat_data->phy_ops; in dw_mipi_dsi_init()
635 ret = phy_ops->get_esc_clk_rate(dsi->plat_data->priv_data, in dw_mipi_dsi_init()
648 esc_clk_division = (dsi->lane_mbps >> 3) / esc_rate + 1; in dw_mipi_dsi_init()
650 dsi_write(dsi, DSI_PWR_UP, RESET); in dw_mipi_dsi_init()
657 dsi_write(dsi, DSI_CLKMGR_CFG, TO_CLK_DIVISION(10) | in dw_mipi_dsi_init()
661 static void dw_mipi_dsi_dpi_config(struct dw_mipi_dsi *dsi, in dw_mipi_dsi_dpi_config() argument
666 switch (dsi->format) { in dw_mipi_dsi_dpi_config()
686 dsi_write(dsi, DSI_DPI_VCID, DPI_VCID(dsi->channel)); in dw_mipi_dsi_dpi_config()
687 dsi_write(dsi, DSI_DPI_COLOR_CODING, color); in dw_mipi_dsi_dpi_config()
688 dsi_write(dsi, DSI_DPI_CFG_POL, val); in dw_mipi_dsi_dpi_config()
691 static void dw_mipi_dsi_packet_handler_config(struct dw_mipi_dsi *dsi) in dw_mipi_dsi_packet_handler_config() argument
693 dsi_write(dsi, DSI_PCKHDL_CFG, CRC_RX_EN | ECC_RX_EN | BTA_EN); in dw_mipi_dsi_packet_handler_config()
696 static void dw_mipi_dsi_video_packet_config(struct dw_mipi_dsi *dsi, in dw_mipi_dsi_video_packet_config() argument
707 dsi_write(dsi, DSI_VID_PKT_SIZE, in dw_mipi_dsi_video_packet_config()
708 dw_mipi_is_dual_mode(dsi) ? in dw_mipi_dsi_video_packet_config()
713 static void dw_mipi_dsi_command_mode_config(struct dw_mipi_dsi *dsi) in dw_mipi_dsi_command_mode_config() argument
720 dsi_write(dsi, DSI_TO_CNT_CFG, HSTX_TO_CNT(1000) | LPRX_TO_CNT(1000)); in dw_mipi_dsi_command_mode_config()
726 dsi_write(dsi, DSI_BTA_TO_CNT, 0xd00); in dw_mipi_dsi_command_mode_config()
727 dsi_write(dsi, DSI_MODE_CFG, ENABLE_CMD_MODE); in dw_mipi_dsi_command_mode_config()
731 static u32 dw_mipi_dsi_get_hcomponent_lbcc(struct dw_mipi_dsi *dsi, in dw_mipi_dsi_get_hcomponent_lbcc() argument
737 lbcc = hcomponent * dsi->lane_mbps * MSEC_PER_SEC / 8; in dw_mipi_dsi_get_hcomponent_lbcc()
747 static void dw_mipi_dsi_line_timer_config(struct dw_mipi_dsi *dsi, in dw_mipi_dsi_line_timer_config() argument
760 lbcc = dw_mipi_dsi_get_hcomponent_lbcc(dsi, mode, htotal); in dw_mipi_dsi_line_timer_config()
761 dsi_write(dsi, DSI_VID_HLINE_TIME, lbcc); in dw_mipi_dsi_line_timer_config()
763 lbcc = dw_mipi_dsi_get_hcomponent_lbcc(dsi, mode, hsa); in dw_mipi_dsi_line_timer_config()
764 dsi_write(dsi, DSI_VID_HSA_TIME, lbcc); in dw_mipi_dsi_line_timer_config()
766 lbcc = dw_mipi_dsi_get_hcomponent_lbcc(dsi, mode, hbp); in dw_mipi_dsi_line_timer_config()
767 dsi_write(dsi, DSI_VID_HBP_TIME, lbcc); in dw_mipi_dsi_line_timer_config()
770 static void dw_mipi_dsi_vertical_timing_config(struct dw_mipi_dsi *dsi, in dw_mipi_dsi_vertical_timing_config() argument
780 dsi_write(dsi, DSI_VID_VACTIVE_LINES, vactive); in dw_mipi_dsi_vertical_timing_config()
781 dsi_write(dsi, DSI_VID_VSA_LINES, vsa); in dw_mipi_dsi_vertical_timing_config()
782 dsi_write(dsi, DSI_VID_VFP_LINES, vfp); in dw_mipi_dsi_vertical_timing_config()
783 dsi_write(dsi, DSI_VID_VBP_LINES, vbp); in dw_mipi_dsi_vertical_timing_config()
786 static void dw_mipi_dsi_dphy_timing_config(struct dw_mipi_dsi *dsi) in dw_mipi_dsi_dphy_timing_config() argument
788 const struct dw_mipi_dsi_phy_ops *phy_ops = dsi->plat_data->phy_ops; in dw_mipi_dsi_dphy_timing_config()
793 ret = phy_ops->get_timing(dsi->plat_data->priv_data, in dw_mipi_dsi_dphy_timing_config()
794 dsi->lane_mbps, &timing); in dw_mipi_dsi_dphy_timing_config()
796 DRM_DEV_ERROR(dsi->dev, "Retrieving phy timings failed\n"); in dw_mipi_dsi_dphy_timing_config()
806 hw_version = dsi_read(dsi, DSI_VERSION) & VERSION; in dw_mipi_dsi_dphy_timing_config()
809 dsi_write(dsi, DSI_PHY_TMR_CFG, in dw_mipi_dsi_dphy_timing_config()
812 dsi_write(dsi, DSI_PHY_TMR_RD_CFG, MAX_RD_TIME_V131(10000)); in dw_mipi_dsi_dphy_timing_config()
814 dsi_write(dsi, DSI_PHY_TMR_CFG, in dw_mipi_dsi_dphy_timing_config()
820 dsi_write(dsi, DSI_PHY_TMR_LPCLK_CFG, in dw_mipi_dsi_dphy_timing_config()
825 static void dw_mipi_dsi_dphy_interface_config(struct dw_mipi_dsi *dsi) in dw_mipi_dsi_dphy_interface_config() argument
829 * stop wait time should be the maximum between host dsi in dw_mipi_dsi_dphy_interface_config()
832 dsi_write(dsi, DSI_PHY_IF_CFG, PHY_STOP_WAIT_TIME(0x20) | in dw_mipi_dsi_dphy_interface_config()
833 N_LANES(dsi->lanes)); in dw_mipi_dsi_dphy_interface_config()
836 static void dw_mipi_dsi_dphy_init(struct dw_mipi_dsi *dsi) in dw_mipi_dsi_dphy_init() argument
839 dsi_write(dsi, DSI_PHY_RSTZ, PHY_DISFORCEPLL | PHY_DISABLECLK in dw_mipi_dsi_dphy_init()
841 dsi_write(dsi, DSI_PHY_TST_CTRL0, PHY_UNTESTCLR); in dw_mipi_dsi_dphy_init()
842 dsi_write(dsi, DSI_PHY_TST_CTRL0, PHY_TESTCLR); in dw_mipi_dsi_dphy_init()
843 dsi_write(dsi, DSI_PHY_TST_CTRL0, PHY_UNTESTCLR); in dw_mipi_dsi_dphy_init()
846 static void dw_mipi_dsi_dphy_enable(struct dw_mipi_dsi *dsi) in dw_mipi_dsi_dphy_enable() argument
851 dsi_write(dsi, DSI_PHY_RSTZ, PHY_ENFORCEPLL | PHY_ENABLECLK | in dw_mipi_dsi_dphy_enable()
854 ret = readl_poll_timeout(dsi->base + DSI_PHY_STATUS, val, in dw_mipi_dsi_dphy_enable()
859 ret = readl_poll_timeout(dsi->base + DSI_PHY_STATUS, in dw_mipi_dsi_dphy_enable()
866 static void dw_mipi_dsi_clear_err(struct dw_mipi_dsi *dsi) in dw_mipi_dsi_clear_err() argument
868 dsi_read(dsi, DSI_INT_ST0); in dw_mipi_dsi_clear_err()
869 dsi_read(dsi, DSI_INT_ST1); in dw_mipi_dsi_clear_err()
870 dsi_write(dsi, DSI_INT_MSK0, 0); in dw_mipi_dsi_clear_err()
871 dsi_write(dsi, DSI_INT_MSK1, 0); in dw_mipi_dsi_clear_err()
876 struct dw_mipi_dsi *dsi = bridge_to_dsi(bridge); in dw_mipi_dsi_bridge_post_disable() local
877 const struct dw_mipi_dsi_phy_ops *phy_ops = dsi->plat_data->phy_ops; in dw_mipi_dsi_bridge_post_disable()
885 dw_mipi_dsi_set_mode(dsi, 0); in dw_mipi_dsi_bridge_post_disable()
889 * panel unprepare before the dsi "final" disable... in dw_mipi_dsi_bridge_post_disable()
893 if (dsi->panel_bridge->funcs->post_disable) in dw_mipi_dsi_bridge_post_disable()
894 dsi->panel_bridge->funcs->post_disable(dsi->panel_bridge); in dw_mipi_dsi_bridge_post_disable()
897 phy_ops->power_off(dsi->plat_data->priv_data); in dw_mipi_dsi_bridge_post_disable()
899 if (dsi->slave) { in dw_mipi_dsi_bridge_post_disable()
900 dw_mipi_dsi_disable(dsi->slave); in dw_mipi_dsi_bridge_post_disable()
901 clk_disable_unprepare(dsi->slave->pclk); in dw_mipi_dsi_bridge_post_disable()
902 pm_runtime_put(dsi->slave->dev); in dw_mipi_dsi_bridge_post_disable()
904 dw_mipi_dsi_disable(dsi); in dw_mipi_dsi_bridge_post_disable()
906 clk_disable_unprepare(dsi->pclk); in dw_mipi_dsi_bridge_post_disable()
907 pm_runtime_put(dsi->dev); in dw_mipi_dsi_bridge_post_disable()
910 static unsigned int dw_mipi_dsi_get_lanes(struct dw_mipi_dsi *dsi) in dw_mipi_dsi_get_lanes() argument
913 if (dsi->master) in dw_mipi_dsi_get_lanes()
914 return dsi->master->lanes + dsi->lanes; in dw_mipi_dsi_get_lanes()
917 if (dsi->slave) in dw_mipi_dsi_get_lanes()
918 return dsi->lanes + dsi->slave->lanes; in dw_mipi_dsi_get_lanes()
920 /* single-dsi, so no other instance to consider */ in dw_mipi_dsi_get_lanes()
921 return dsi->lanes; in dw_mipi_dsi_get_lanes()
924 static void dw_mipi_dsi_mode_set(struct dw_mipi_dsi *dsi, in dw_mipi_dsi_mode_set() argument
927 const struct dw_mipi_dsi_phy_ops *phy_ops = dsi->plat_data->phy_ops; in dw_mipi_dsi_mode_set()
928 void *priv_data = dsi->plat_data->priv_data; in dw_mipi_dsi_mode_set()
930 u32 lanes = dw_mipi_dsi_get_lanes(dsi); in dw_mipi_dsi_mode_set()
932 clk_prepare_enable(dsi->pclk); in dw_mipi_dsi_mode_set()
934 ret = phy_ops->get_lane_mbps(priv_data, adjusted_mode, dsi->mode_flags, in dw_mipi_dsi_mode_set()
935 lanes, dsi->format, &dsi->lane_mbps); in dw_mipi_dsi_mode_set()
939 pm_runtime_get_sync(dsi->dev); in dw_mipi_dsi_mode_set()
940 dw_mipi_dsi_init(dsi); in dw_mipi_dsi_mode_set()
941 dw_mipi_dsi_dpi_config(dsi, adjusted_mode); in dw_mipi_dsi_mode_set()
942 dw_mipi_dsi_packet_handler_config(dsi); in dw_mipi_dsi_mode_set()
943 dw_mipi_dsi_video_mode_config(dsi); in dw_mipi_dsi_mode_set()
944 dw_mipi_dsi_video_packet_config(dsi, adjusted_mode); in dw_mipi_dsi_mode_set()
945 dw_mipi_dsi_command_mode_config(dsi); in dw_mipi_dsi_mode_set()
946 dw_mipi_dsi_line_timer_config(dsi, adjusted_mode); in dw_mipi_dsi_mode_set()
947 dw_mipi_dsi_vertical_timing_config(dsi, adjusted_mode); in dw_mipi_dsi_mode_set()
949 dw_mipi_dsi_dphy_init(dsi); in dw_mipi_dsi_mode_set()
950 dw_mipi_dsi_dphy_timing_config(dsi); in dw_mipi_dsi_mode_set()
951 dw_mipi_dsi_dphy_interface_config(dsi); in dw_mipi_dsi_mode_set()
953 dw_mipi_dsi_clear_err(dsi); in dw_mipi_dsi_mode_set()
959 dw_mipi_dsi_dphy_enable(dsi); in dw_mipi_dsi_mode_set()
964 dw_mipi_dsi_set_mode(dsi, 0); in dw_mipi_dsi_mode_set()
967 phy_ops->power_on(dsi->plat_data->priv_data); in dw_mipi_dsi_mode_set()
974 struct dw_mipi_dsi *dsi = bridge_to_dsi(bridge); in dw_mipi_dsi_bridge_mode_set() local
976 dw_mipi_dsi_mode_set(dsi, adjusted_mode); in dw_mipi_dsi_bridge_mode_set()
977 if (dsi->slave) in dw_mipi_dsi_bridge_mode_set()
978 dw_mipi_dsi_mode_set(dsi->slave, adjusted_mode); in dw_mipi_dsi_bridge_mode_set()
983 struct dw_mipi_dsi *dsi = bridge_to_dsi(bridge); in dw_mipi_dsi_bridge_enable() local
986 dw_mipi_dsi_set_mode(dsi, MIPI_DSI_MODE_VIDEO); in dw_mipi_dsi_bridge_enable()
987 if (dsi->slave) in dw_mipi_dsi_bridge_enable()
988 dw_mipi_dsi_set_mode(dsi->slave, MIPI_DSI_MODE_VIDEO); in dw_mipi_dsi_bridge_enable()
996 struct dw_mipi_dsi *dsi = bridge_to_dsi(bridge); in dw_mipi_dsi_bridge_mode_valid() local
997 const struct dw_mipi_dsi_plat_data *pdata = dsi->plat_data; in dw_mipi_dsi_bridge_mode_valid()
1009 struct dw_mipi_dsi *dsi = bridge_to_dsi(bridge); in dw_mipi_dsi_bridge_attach() local
1019 if (!dsi->device_found) { in dw_mipi_dsi_bridge_attach()
1022 ret = dw_mipi_dsi_panel_or_bridge(dsi, dsi->dev->of_node); in dw_mipi_dsi_bridge_attach()
1026 dsi->device_found = true; in dw_mipi_dsi_bridge_attach()
1029 /* Attach the panel-bridge to the dsi bridge */ in dw_mipi_dsi_bridge_attach()
1030 return drm_bridge_attach(bridge->encoder, dsi->panel_bridge, bridge, in dw_mipi_dsi_bridge_attach()
1047 struct dw_mipi_dsi *dsi; in dw_mipi_dsi_debugfs_write() local
1053 dsi = vpg->dsi; in dw_mipi_dsi_debugfs_write()
1057 mode_cfg = dsi_read(dsi, DSI_VID_MODE_CFG); in dw_mipi_dsi_debugfs_write()
1064 dsi_write(dsi, DSI_VID_MODE_CFG, mode_cfg); in dw_mipi_dsi_debugfs_write()
1086 struct dw_mipi_dsi *dsi = data; in debugfs_create_files() local
1088 REGISTER(vpg, VID_MODE_VPG_ENABLE, dsi), in debugfs_create_files()
1089 REGISTER(vpg_horizontal, VID_MODE_VPG_HORIZONTAL, dsi), in debugfs_create_files()
1090 REGISTER(vpg_ber_pattern, VID_MODE_VPG_MODE, dsi), in debugfs_create_files()
1094 dsi->debugfs_vpg = kmemdup(debugfs, sizeof(debugfs), GFP_KERNEL); in debugfs_create_files()
1095 if (!dsi->debugfs_vpg) in debugfs_create_files()
1099 debugfs_create_file(dsi->debugfs_vpg[i].name, 0644, in debugfs_create_files()
1100 dsi->debugfs, &dsi->debugfs_vpg[i], in debugfs_create_files()
1104 static void dw_mipi_dsi_debugfs_init(struct dw_mipi_dsi *dsi) in dw_mipi_dsi_debugfs_init() argument
1106 dsi->debugfs = debugfs_create_dir(dev_name(dsi->dev), NULL); in dw_mipi_dsi_debugfs_init()
1107 if (IS_ERR(dsi->debugfs)) { in dw_mipi_dsi_debugfs_init()
1108 dev_err(dsi->dev, "failed to create debugfs root\n"); in dw_mipi_dsi_debugfs_init()
1112 debugfs_create_files(dsi); in dw_mipi_dsi_debugfs_init()
1115 static void dw_mipi_dsi_debugfs_remove(struct dw_mipi_dsi *dsi) in dw_mipi_dsi_debugfs_remove() argument
1117 debugfs_remove_recursive(dsi->debugfs); in dw_mipi_dsi_debugfs_remove()
1118 kfree(dsi->debugfs_vpg); in dw_mipi_dsi_debugfs_remove()
1123 static void dw_mipi_dsi_debugfs_init(struct dw_mipi_dsi *dsi) { } in dw_mipi_dsi_debugfs_init() argument
1124 static void dw_mipi_dsi_debugfs_remove(struct dw_mipi_dsi *dsi) { } in dw_mipi_dsi_debugfs_remove() argument
1134 struct dw_mipi_dsi *dsi; in __dw_mipi_dsi_probe() local
1137 dsi = devm_kzalloc(dev, sizeof(*dsi), GFP_KERNEL); in __dw_mipi_dsi_probe()
1138 if (!dsi) in __dw_mipi_dsi_probe()
1141 dsi->dev = dev; in __dw_mipi_dsi_probe()
1142 dsi->plat_data = plat_data; in __dw_mipi_dsi_probe()
1151 dsi->base = devm_platform_ioremap_resource(pdev, 0); in __dw_mipi_dsi_probe()
1152 if (IS_ERR(dsi->base)) in __dw_mipi_dsi_probe()
1156 dsi->base = plat_data->base; in __dw_mipi_dsi_probe()
1159 dsi->pclk = devm_clk_get(dev, "pclk"); in __dw_mipi_dsi_probe()
1160 if (IS_ERR(dsi->pclk)) { in __dw_mipi_dsi_probe()
1161 ret = PTR_ERR(dsi->pclk); in __dw_mipi_dsi_probe()
1181 ret = clk_prepare_enable(dsi->pclk); in __dw_mipi_dsi_probe()
1191 clk_disable_unprepare(dsi->pclk); in __dw_mipi_dsi_probe()
1194 dw_mipi_dsi_debugfs_init(dsi); in __dw_mipi_dsi_probe()
1197 dsi->dsi_host.ops = &dw_mipi_dsi_host_ops; in __dw_mipi_dsi_probe()
1198 dsi->dsi_host.dev = dev; in __dw_mipi_dsi_probe()
1199 ret = mipi_dsi_host_register(&dsi->dsi_host); in __dw_mipi_dsi_probe()
1202 dw_mipi_dsi_debugfs_remove(dsi); in __dw_mipi_dsi_probe()
1206 dsi->bridge.driver_private = dsi; in __dw_mipi_dsi_probe()
1207 dsi->bridge.funcs = &dw_mipi_dsi_bridge_funcs; in __dw_mipi_dsi_probe()
1209 dsi->bridge.of_node = pdev->dev.of_node; in __dw_mipi_dsi_probe()
1211 drm_bridge_add(&dsi->bridge); in __dw_mipi_dsi_probe()
1213 return dsi; in __dw_mipi_dsi_probe()
1216 static void __dw_mipi_dsi_remove(struct dw_mipi_dsi *dsi) in __dw_mipi_dsi_remove() argument
1218 mipi_dsi_host_unregister(&dsi->dsi_host); in __dw_mipi_dsi_remove()
1220 pm_runtime_disable(dsi->dev); in __dw_mipi_dsi_remove()
1221 dw_mipi_dsi_debugfs_remove(dsi); in __dw_mipi_dsi_remove()
1224 void dw_mipi_dsi_set_slave(struct dw_mipi_dsi *dsi, struct dw_mipi_dsi *slave) in dw_mipi_dsi_set_slave() argument
1227 dsi->slave = slave; in dw_mipi_dsi_set_slave()
1228 dsi->slave->master = dsi; in dw_mipi_dsi_set_slave()
1231 dsi->slave->lanes = dsi->lanes; in dw_mipi_dsi_set_slave()
1232 dsi->slave->channel = dsi->channel; in dw_mipi_dsi_set_slave()
1233 dsi->slave->format = dsi->format; in dw_mipi_dsi_set_slave()
1234 dsi->slave->mode_flags = dsi->mode_flags; in dw_mipi_dsi_set_slave()
1249 void dw_mipi_dsi_remove(struct dw_mipi_dsi *dsi) in dw_mipi_dsi_remove() argument
1251 __dw_mipi_dsi_remove(dsi); in dw_mipi_dsi_remove()
1258 int dw_mipi_dsi_bind(struct dw_mipi_dsi *dsi, struct drm_encoder *encoder) in dw_mipi_dsi_bind() argument
1260 return drm_bridge_attach(encoder, &dsi->bridge, NULL, 0); in dw_mipi_dsi_bind()
1264 void dw_mipi_dsi_unbind(struct dw_mipi_dsi *dsi) in dw_mipi_dsi_unbind() argument
1271 MODULE_DESCRIPTION("DW MIPI DSI host controller driver");
1273 MODULE_ALIAS("platform:dw-mipi-dsi");