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.
232 #define VPG_DEFS(name, dsi) \ argument
233 ((void __force *)&((*dsi).vpg_defs.name))
235 #define REGISTER(name, mask, dsi) \ argument
236 { #name, VPG_DEFS(name, dsi), mask, dsi }
242 struct dw_mipi_dsi *dsi; member
275 struct dw_mipi_dsi *master; /* dual-dsi master ptr */
276 struct dw_mipi_dsi *slave; /* dual-dsi slave ptr */
284 static inline bool dw_mipi_is_dual_mode(struct dw_mipi_dsi *dsi) in dw_mipi_is_dual_mode() argument
286 return dsi->slave || dsi->master; in dw_mipi_is_dual_mode()
317 static inline void dsi_write(struct dw_mipi_dsi *dsi, u32 reg, u32 val) in dsi_write() argument
319 writel(val, dsi->base + reg); in dsi_write()
322 static inline u32 dsi_read(struct dw_mipi_dsi *dsi, u32 reg) in dsi_read() argument
324 return readl(dsi->base + reg); in dsi_read()
330 struct dw_mipi_dsi *dsi = host_to_dsi(host); in dw_mipi_dsi_host_attach() local
331 const struct dw_mipi_dsi_plat_data *pdata = dsi->plat_data; in dw_mipi_dsi_host_attach()
332 int max_data_lanes = dsi->plat_data->max_data_lanes; in dw_mipi_dsi_host_attach()
335 dsi->lanes = (device->lanes > max_data_lanes) ? device->lanes / 2 : device->lanes; in dw_mipi_dsi_host_attach()
336 dsi->channel = device->channel; in dw_mipi_dsi_host_attach()
337 dsi->format = device->format; in dw_mipi_dsi_host_attach()
338 dsi->mode_flags = device->mode_flags; in dw_mipi_dsi_host_attach()
341 &dsi->panel, &dsi->next_bridge); in dw_mipi_dsi_host_attach()
343 DRM_DEV_ERROR(dsi->dev, "Failed to find panel or bridge: %d\n", ret); in dw_mipi_dsi_host_attach()
347 drm_bridge_add(&dsi->bridge); in dw_mipi_dsi_host_attach()
361 struct dw_mipi_dsi *dsi = host_to_dsi(host); in dw_mipi_dsi_host_detach() local
362 const struct dw_mipi_dsi_plat_data *pdata = dsi->plat_data; in dw_mipi_dsi_host_detach()
373 drm_bridge_remove(&dsi->bridge); in dw_mipi_dsi_host_detach()
378 static void dw_mipi_message_config(struct dw_mipi_dsi *dsi, in dw_mipi_message_config() argument
391 dsi_write(dsi, DSI_DPI_LP_CMD_TIM, OUTVACT_LPCMD_TIME(16) in dw_mipi_message_config()
399 dsi_write(dsi, DSI_CMD_MODE_CFG, val); in dw_mipi_message_config()
401 val = dsi_read(dsi, DSI_VID_MODE_CFG); in dw_mipi_message_config()
402 ctrl = dsi_read(dsi, DSI_LPCLK_CTRL); in dw_mipi_message_config()
411 dsi_write(dsi, DSI_VID_MODE_CFG, val); in dw_mipi_message_config()
412 dsi_write(dsi, DSI_LPCLK_CTRL, ctrl); in dw_mipi_message_config()
415 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
420 ret = readl_poll_timeout(dsi->base + DSI_CMD_PKT_STATUS, in dw_mipi_dsi_gen_pkt_hdr_write()
424 dev_err(dsi->dev, "failed to get available command FIFO\n"); in dw_mipi_dsi_gen_pkt_hdr_write()
428 dsi_write(dsi, DSI_GEN_HDR, hdr_val); in dw_mipi_dsi_gen_pkt_hdr_write()
431 ret = readl_poll_timeout(dsi->base + DSI_CMD_PKT_STATUS, in dw_mipi_dsi_gen_pkt_hdr_write()
435 dev_err(dsi->dev, "failed to write command FIFO\n"); in dw_mipi_dsi_gen_pkt_hdr_write()
442 static int dw_mipi_dsi_write(struct dw_mipi_dsi *dsi, in dw_mipi_dsi_write() argument
454 dsi_write(dsi, DSI_GEN_PLD_DATA, le32_to_cpu(word)); in dw_mipi_dsi_write()
458 dsi_write(dsi, DSI_GEN_PLD_DATA, le32_to_cpu(word)); in dw_mipi_dsi_write()
463 ret = readl_poll_timeout(dsi->base + DSI_CMD_PKT_STATUS, in dw_mipi_dsi_write()
467 dev_err(dsi->dev, in dw_mipi_dsi_write()
475 return dw_mipi_dsi_gen_pkt_hdr_write(dsi, le32_to_cpu(word)); in dw_mipi_dsi_write()
478 static int dw_mipi_dsi_read(struct dw_mipi_dsi *dsi, in dw_mipi_dsi_read() argument
486 ret = readl_poll_timeout(dsi->base + DSI_CMD_PKT_STATUS, in dw_mipi_dsi_read()
490 dev_err(dsi->dev, "Timeout during read operation\n"); in dw_mipi_dsi_read()
496 ret = readl_poll_timeout(dsi->base + DSI_CMD_PKT_STATUS, in dw_mipi_dsi_read()
500 dev_err(dsi->dev, "Read payload FIFO is empty\n"); in dw_mipi_dsi_read()
504 val = dsi_read(dsi, DSI_GEN_PLD_DATA); in dw_mipi_dsi_read()
515 struct dw_mipi_dsi *dsi = host_to_dsi(host); in dw_mipi_dsi_host_transfer() local
521 dev_err(dsi->dev, "failed to create packet: %d\n", ret); in dw_mipi_dsi_host_transfer()
525 dw_mipi_message_config(dsi, msg); in dw_mipi_dsi_host_transfer()
526 if (dsi->slave) in dw_mipi_dsi_host_transfer()
527 dw_mipi_message_config(dsi->slave, msg); in dw_mipi_dsi_host_transfer()
529 ret = dw_mipi_dsi_write(dsi, &packet); in dw_mipi_dsi_host_transfer()
532 if (dsi->slave) { in dw_mipi_dsi_host_transfer()
533 ret = dw_mipi_dsi_write(dsi->slave, &packet); in dw_mipi_dsi_host_transfer()
539 ret = dw_mipi_dsi_read(dsi, msg); in dw_mipi_dsi_host_transfer()
556 static void dw_mipi_dsi_video_mode_config(struct dw_mipi_dsi *dsi) in dw_mipi_dsi_video_mode_config() argument
561 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_HFP) in dw_mipi_dsi_video_mode_config()
564 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_HBP) in dw_mipi_dsi_video_mode_config()
567 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_BURST) in dw_mipi_dsi_video_mode_config()
569 else if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_SYNC_PULSE) in dw_mipi_dsi_video_mode_config()
575 if (dsi->vpg_defs.vpg) { in dw_mipi_dsi_video_mode_config()
577 val |= dsi->vpg_defs.vpg_horizontal ? in dw_mipi_dsi_video_mode_config()
579 val |= dsi->vpg_defs.vpg_ber_pattern ? VID_MODE_VPG_MODE : 0; in dw_mipi_dsi_video_mode_config()
583 dsi_write(dsi, DSI_VID_MODE_CFG, val); in dw_mipi_dsi_video_mode_config()
586 static void dw_mipi_dsi_set_mode(struct dw_mipi_dsi *dsi, in dw_mipi_dsi_set_mode() argument
589 dsi_write(dsi, DSI_PWR_UP, RESET); in dw_mipi_dsi_set_mode()
592 dsi_write(dsi, DSI_MODE_CFG, ENABLE_VIDEO_MODE); in dw_mipi_dsi_set_mode()
593 dw_mipi_dsi_video_mode_config(dsi); in dw_mipi_dsi_set_mode()
595 dsi_write(dsi, DSI_MODE_CFG, ENABLE_CMD_MODE); in dw_mipi_dsi_set_mode()
598 dsi_write(dsi, DSI_PWR_UP, POWERUP); in dw_mipi_dsi_set_mode()
601 static void dw_mipi_dsi_disable(struct dw_mipi_dsi *dsi) in dw_mipi_dsi_disable() argument
603 dsi_write(dsi, DSI_LPCLK_CTRL, 0); in dw_mipi_dsi_disable()
604 dsi_write(dsi, DSI_EDPI_CMD_SIZE, 0); in dw_mipi_dsi_disable()
605 dw_mipi_dsi_set_mode(dsi, 0); in dw_mipi_dsi_disable()
606 if (dsi->slave) in dw_mipi_dsi_disable()
607 dw_mipi_dsi_disable(dsi->slave); in dw_mipi_dsi_disable()
610 static void dw_mipi_dsi_init(struct dw_mipi_dsi *dsi) in dw_mipi_dsi_init() argument
612 const struct dw_mipi_dsi_phy_ops *phy_ops = dsi->plat_data->phy_ops; in dw_mipi_dsi_init()
622 ret = phy_ops->get_esc_clk_rate(dsi->plat_data->priv_data, in dw_mipi_dsi_init()
635 esc_clk_division = (dsi->lane_mbps >> 3) / esc_rate + 1; in dw_mipi_dsi_init()
637 dsi_write(dsi, DSI_PWR_UP, RESET); in dw_mipi_dsi_init()
644 dsi_write(dsi, DSI_CLKMGR_CFG, TO_CLK_DIVISION(10) | in dw_mipi_dsi_init()
648 static void dw_mipi_dsi_dpi_config(struct dw_mipi_dsi *dsi, in dw_mipi_dsi_dpi_config() argument
653 switch (dsi->format) { in dw_mipi_dsi_dpi_config()
673 dsi_write(dsi, DSI_DPI_VCID, DPI_VCID(dsi->channel)); in dw_mipi_dsi_dpi_config()
674 dsi_write(dsi, DSI_DPI_COLOR_CODING, color); in dw_mipi_dsi_dpi_config()
675 dsi_write(dsi, DSI_DPI_CFG_POL, val); in dw_mipi_dsi_dpi_config()
678 static void dw_mipi_dsi_packet_handler_config(struct dw_mipi_dsi *dsi) in dw_mipi_dsi_packet_handler_config() argument
680 dsi_write(dsi, DSI_PCKHDL_CFG, CRC_RX_EN | ECC_RX_EN | BTA_EN); in dw_mipi_dsi_packet_handler_config()
683 static void dw_mipi_dsi_video_packet_config(struct dw_mipi_dsi *dsi, in dw_mipi_dsi_video_packet_config() argument
694 dsi_write(dsi, DSI_VID_PKT_SIZE, in dw_mipi_dsi_video_packet_config()
695 dw_mipi_is_dual_mode(dsi) ? in dw_mipi_dsi_video_packet_config()
700 static void dw_mipi_dsi_command_mode_config(struct dw_mipi_dsi *dsi) in dw_mipi_dsi_command_mode_config() argument
707 dsi_write(dsi, DSI_TO_CNT_CFG, HSTX_TO_CNT(1000) | LPRX_TO_CNT(1000)); in dw_mipi_dsi_command_mode_config()
713 dsi_write(dsi, DSI_BTA_TO_CNT, 0xd00); in dw_mipi_dsi_command_mode_config()
714 dsi_write(dsi, DSI_MODE_CFG, ENABLE_CMD_MODE); in dw_mipi_dsi_command_mode_config()
718 static u32 dw_mipi_dsi_get_hcomponent_lbcc(struct dw_mipi_dsi *dsi, in dw_mipi_dsi_get_hcomponent_lbcc() argument
724 lbcc = hcomponent * dsi->lane_mbps * MSEC_PER_SEC / 8; in dw_mipi_dsi_get_hcomponent_lbcc()
727 DRM_ERROR("dsi mode clock is 0!\n"); in dw_mipi_dsi_get_hcomponent_lbcc()
734 static void dw_mipi_dsi_line_timer_config(struct dw_mipi_dsi *dsi, in dw_mipi_dsi_line_timer_config() argument
747 lbcc = dw_mipi_dsi_get_hcomponent_lbcc(dsi, mode, htotal); in dw_mipi_dsi_line_timer_config()
748 dsi_write(dsi, DSI_VID_HLINE_TIME, lbcc); in dw_mipi_dsi_line_timer_config()
750 lbcc = dw_mipi_dsi_get_hcomponent_lbcc(dsi, mode, hsa); in dw_mipi_dsi_line_timer_config()
751 dsi_write(dsi, DSI_VID_HSA_TIME, lbcc); in dw_mipi_dsi_line_timer_config()
753 lbcc = dw_mipi_dsi_get_hcomponent_lbcc(dsi, mode, hbp); in dw_mipi_dsi_line_timer_config()
754 dsi_write(dsi, DSI_VID_HBP_TIME, lbcc); in dw_mipi_dsi_line_timer_config()
757 static void dw_mipi_dsi_vertical_timing_config(struct dw_mipi_dsi *dsi, in dw_mipi_dsi_vertical_timing_config() argument
767 dsi_write(dsi, DSI_VID_VACTIVE_LINES, vactive); in dw_mipi_dsi_vertical_timing_config()
768 dsi_write(dsi, DSI_VID_VSA_LINES, vsa); in dw_mipi_dsi_vertical_timing_config()
769 dsi_write(dsi, DSI_VID_VFP_LINES, vfp); in dw_mipi_dsi_vertical_timing_config()
770 dsi_write(dsi, DSI_VID_VBP_LINES, vbp); in dw_mipi_dsi_vertical_timing_config()
773 static void dw_mipi_dsi_dphy_timing_config(struct dw_mipi_dsi *dsi) in dw_mipi_dsi_dphy_timing_config() argument
775 const struct dw_mipi_dsi_phy_ops *phy_ops = dsi->plat_data->phy_ops; in dw_mipi_dsi_dphy_timing_config()
780 ret = phy_ops->get_timing(dsi->plat_data->priv_data, in dw_mipi_dsi_dphy_timing_config()
781 dsi->lane_mbps, &timing); in dw_mipi_dsi_dphy_timing_config()
783 DRM_DEV_ERROR(dsi->dev, "Retrieving phy timings failed\n"); in dw_mipi_dsi_dphy_timing_config()
793 hw_version = dsi_read(dsi, DSI_VERSION) & VERSION; in dw_mipi_dsi_dphy_timing_config()
796 dsi_write(dsi, DSI_PHY_TMR_CFG, in dw_mipi_dsi_dphy_timing_config()
799 dsi_write(dsi, DSI_PHY_TMR_RD_CFG, MAX_RD_TIME_V131(10000)); in dw_mipi_dsi_dphy_timing_config()
801 dsi_write(dsi, DSI_PHY_TMR_CFG, in dw_mipi_dsi_dphy_timing_config()
807 dsi_write(dsi, DSI_PHY_TMR_LPCLK_CFG, in dw_mipi_dsi_dphy_timing_config()
812 static void dw_mipi_dsi_dphy_interface_config(struct dw_mipi_dsi *dsi) in dw_mipi_dsi_dphy_interface_config() argument
816 * stop wait time should be the maximum between host dsi in dw_mipi_dsi_dphy_interface_config()
819 dsi_write(dsi, DSI_PHY_IF_CFG, PHY_STOP_WAIT_TIME(0x20) | in dw_mipi_dsi_dphy_interface_config()
820 N_LANES(dsi->lanes)); in dw_mipi_dsi_dphy_interface_config()
823 static void dw_mipi_dsi_dphy_init(struct dw_mipi_dsi *dsi) in dw_mipi_dsi_dphy_init() argument
826 dsi_write(dsi, DSI_PHY_RSTZ, PHY_DISFORCEPLL | PHY_DISABLECLK in dw_mipi_dsi_dphy_init()
828 dsi_write(dsi, DSI_PHY_TST_CTRL0, PHY_UNTESTCLR); in dw_mipi_dsi_dphy_init()
829 dsi_write(dsi, DSI_PHY_TST_CTRL0, PHY_TESTCLR); in dw_mipi_dsi_dphy_init()
830 dsi_write(dsi, DSI_PHY_TST_CTRL0, PHY_UNTESTCLR); in dw_mipi_dsi_dphy_init()
833 static void dw_mipi_dsi_dphy_enable(struct dw_mipi_dsi *dsi) in dw_mipi_dsi_dphy_enable() argument
838 dsi_write(dsi, DSI_PHY_RSTZ, PHY_ENFORCEPLL | PHY_ENABLECLK | in dw_mipi_dsi_dphy_enable()
841 ret = readl_poll_timeout(dsi->base + DSI_PHY_STATUS, val, in dw_mipi_dsi_dphy_enable()
846 ret = readl_poll_timeout(dsi->base + DSI_PHY_STATUS, in dw_mipi_dsi_dphy_enable()
853 static void dw_mipi_dsi_clear_err(struct dw_mipi_dsi *dsi) in dw_mipi_dsi_clear_err() argument
855 dsi_read(dsi, DSI_INT_ST0); in dw_mipi_dsi_clear_err()
856 dsi_read(dsi, DSI_INT_ST1); in dw_mipi_dsi_clear_err()
857 dsi_write(dsi, DSI_INT_MSK0, 0); in dw_mipi_dsi_clear_err()
858 dsi_write(dsi, DSI_INT_MSK1, 0); in dw_mipi_dsi_clear_err()
861 static void dw_mipi_dsi_post_disable(struct dw_mipi_dsi *dsi) in dw_mipi_dsi_post_disable() argument
863 const struct dw_mipi_dsi_phy_ops *phy_ops = dsi->plat_data->phy_ops; in dw_mipi_dsi_post_disable()
866 phy_ops->power_off(dsi->plat_data->priv_data); in dw_mipi_dsi_post_disable()
868 dsi_write(dsi, DSI_PWR_UP, RESET); in dw_mipi_dsi_post_disable()
869 dsi_write(dsi, DSI_PHY_RSTZ, PHY_RSTZ); in dw_mipi_dsi_post_disable()
870 pm_runtime_put(dsi->dev); in dw_mipi_dsi_post_disable()
872 if (dsi->slave) in dw_mipi_dsi_post_disable()
873 dw_mipi_dsi_post_disable(dsi->slave); in dw_mipi_dsi_post_disable()
878 struct dw_mipi_dsi *dsi = bridge_to_dsi(bridge); in dw_mipi_dsi_bridge_post_disable() local
880 if (dsi->panel) in dw_mipi_dsi_bridge_post_disable()
881 drm_panel_unprepare(dsi->panel); in dw_mipi_dsi_bridge_post_disable()
883 dw_mipi_dsi_post_disable(dsi); in dw_mipi_dsi_bridge_post_disable()
888 struct dw_mipi_dsi *dsi = bridge_to_dsi(bridge); in dw_mipi_dsi_bridge_disable() local
890 if (dsi->panel) in dw_mipi_dsi_bridge_disable()
891 drm_panel_disable(dsi->panel); in dw_mipi_dsi_bridge_disable()
893 dw_mipi_dsi_disable(dsi); in dw_mipi_dsi_bridge_disable()
896 static unsigned int dw_mipi_dsi_get_lanes(struct dw_mipi_dsi *dsi) in dw_mipi_dsi_get_lanes() argument
899 if (dsi->master) in dw_mipi_dsi_get_lanes()
900 return dsi->master->lanes + dsi->lanes; in dw_mipi_dsi_get_lanes()
903 if (dsi->slave) in dw_mipi_dsi_get_lanes()
904 return dsi->lanes + dsi->slave->lanes; in dw_mipi_dsi_get_lanes()
906 /* single-dsi, so no other instance to consider */ in dw_mipi_dsi_get_lanes()
907 return dsi->lanes; in dw_mipi_dsi_get_lanes()
914 struct dw_mipi_dsi *dsi = bridge_to_dsi(bridge); in dw_mipi_dsi_bridge_mode_set() local
916 drm_mode_copy(&dsi->mode, adjusted_mode); in dw_mipi_dsi_bridge_mode_set()
918 if (dsi->slave) in dw_mipi_dsi_bridge_mode_set()
919 drm_mode_copy(&dsi->slave->mode, adjusted_mode); in dw_mipi_dsi_bridge_mode_set()
922 static void dw_mipi_dsi_pre_enable(struct dw_mipi_dsi *dsi) in dw_mipi_dsi_pre_enable() argument
924 const struct dw_mipi_dsi_phy_ops *phy_ops = dsi->plat_data->phy_ops; in dw_mipi_dsi_pre_enable()
925 void *priv_data = dsi->plat_data->priv_data; in dw_mipi_dsi_pre_enable()
926 const struct drm_display_mode *adjusted_mode = &dsi->mode; in dw_mipi_dsi_pre_enable()
928 u32 lanes = dw_mipi_dsi_get_lanes(dsi); in dw_mipi_dsi_pre_enable()
930 if (dsi->apb_rst) { in dw_mipi_dsi_pre_enable()
931 reset_control_assert(dsi->apb_rst); in dw_mipi_dsi_pre_enable()
933 reset_control_deassert(dsi->apb_rst); in dw_mipi_dsi_pre_enable()
936 ret = phy_ops->get_lane_mbps(priv_data, adjusted_mode, dsi->mode_flags, in dw_mipi_dsi_pre_enable()
937 lanes, dsi->format, &dsi->lane_mbps); in dw_mipi_dsi_pre_enable()
941 pm_runtime_get_sync(dsi->dev); in dw_mipi_dsi_pre_enable()
942 dw_mipi_dsi_init(dsi); in dw_mipi_dsi_pre_enable()
943 dw_mipi_dsi_dpi_config(dsi, adjusted_mode); in dw_mipi_dsi_pre_enable()
944 dw_mipi_dsi_packet_handler_config(dsi); in dw_mipi_dsi_pre_enable()
945 dw_mipi_dsi_video_mode_config(dsi); in dw_mipi_dsi_pre_enable()
946 dw_mipi_dsi_video_packet_config(dsi, adjusted_mode); in dw_mipi_dsi_pre_enable()
947 dw_mipi_dsi_command_mode_config(dsi); in dw_mipi_dsi_pre_enable()
948 dw_mipi_dsi_line_timer_config(dsi, adjusted_mode); in dw_mipi_dsi_pre_enable()
949 dw_mipi_dsi_vertical_timing_config(dsi, adjusted_mode); in dw_mipi_dsi_pre_enable()
951 dw_mipi_dsi_dphy_init(dsi); in dw_mipi_dsi_pre_enable()
952 dw_mipi_dsi_dphy_timing_config(dsi); in dw_mipi_dsi_pre_enable()
953 dw_mipi_dsi_dphy_interface_config(dsi); in dw_mipi_dsi_pre_enable()
955 dw_mipi_dsi_clear_err(dsi); in dw_mipi_dsi_pre_enable()
962 phy_ops->power_on(dsi->plat_data->priv_data); in dw_mipi_dsi_pre_enable()
964 dw_mipi_dsi_dphy_enable(dsi); in dw_mipi_dsi_pre_enable()
969 dw_mipi_dsi_set_mode(dsi, 0); in dw_mipi_dsi_pre_enable()
971 if (dsi->slave) in dw_mipi_dsi_pre_enable()
972 dw_mipi_dsi_pre_enable(dsi->slave); in dw_mipi_dsi_pre_enable()
977 struct dw_mipi_dsi *dsi = bridge_to_dsi(bridge); in dw_mipi_dsi_bridge_pre_enable() local
979 dw_mipi_dsi_pre_enable(dsi); in dw_mipi_dsi_bridge_pre_enable()
981 if (dsi->panel) in dw_mipi_dsi_bridge_pre_enable()
982 drm_panel_prepare(dsi->panel); in dw_mipi_dsi_bridge_pre_enable()
985 static void dw_mipi_dsi_enable(struct dw_mipi_dsi *dsi) in dw_mipi_dsi_enable() argument
990 if (dsi->mode_flags & MIPI_DSI_CLOCK_NON_CONTINUOUS) in dw_mipi_dsi_enable()
993 dsi_write(dsi, DSI_LPCLK_CTRL, val); in dw_mipi_dsi_enable()
995 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO) { in dw_mipi_dsi_enable()
996 dw_mipi_dsi_set_mode(dsi, MIPI_DSI_MODE_VIDEO); in dw_mipi_dsi_enable()
998 dsi_write(dsi, DSI_EDPI_CMD_SIZE, dsi->mode.hdisplay); in dw_mipi_dsi_enable()
999 dw_mipi_dsi_set_mode(dsi, 0); in dw_mipi_dsi_enable()
1002 if (dsi->slave) in dw_mipi_dsi_enable()
1003 dw_mipi_dsi_enable(dsi->slave); in dw_mipi_dsi_enable()
1008 struct dw_mipi_dsi *dsi = bridge_to_dsi(bridge); in dw_mipi_dsi_bridge_enable() local
1010 dw_mipi_dsi_enable(dsi); in dw_mipi_dsi_bridge_enable()
1012 if (dsi->panel) in dw_mipi_dsi_bridge_enable()
1013 drm_panel_enable(dsi->panel); in dw_mipi_dsi_bridge_enable()
1015 DRM_DEV_INFO(dsi->dev, "final DSI-Link bandwidth: %u x %d Mbps\n", in dw_mipi_dsi_bridge_enable()
1016 dsi->lane_mbps, dsi->slave ? dsi->lanes * 2 : dsi->lanes); in dw_mipi_dsi_bridge_enable()
1024 struct dw_mipi_dsi *dsi = bridge_to_dsi(bridge); in dw_mipi_dsi_bridge_mode_valid() local
1025 const struct dw_mipi_dsi_plat_data *pdata = dsi->plat_data; in dw_mipi_dsi_bridge_mode_valid()
1037 struct dw_mipi_dsi *dsi = bridge_to_dsi(bridge); in dw_mipi_dsi_bridge_attach() local
1047 /* Attach the next-bridge to the dsi bridge */ in dw_mipi_dsi_bridge_attach()
1048 if (dsi->next_bridge) in dw_mipi_dsi_bridge_attach()
1049 return drm_bridge_attach(bridge->encoder, dsi->next_bridge, in dw_mipi_dsi_bridge_attach()
1070 struct dw_mipi_dsi *dsi; in dw_mipi_dsi_debugfs_write() local
1076 dsi = vpg->dsi; in dw_mipi_dsi_debugfs_write()
1080 mode_cfg = dsi_read(dsi, DSI_VID_MODE_CFG); in dw_mipi_dsi_debugfs_write()
1087 dsi_write(dsi, DSI_VID_MODE_CFG, mode_cfg); in dw_mipi_dsi_debugfs_write()
1109 struct dw_mipi_dsi *dsi = data; in debugfs_create_files() local
1111 REGISTER(vpg, VID_MODE_VPG_ENABLE, dsi), in debugfs_create_files()
1112 REGISTER(vpg_horizontal, VID_MODE_VPG_HORIZONTAL, dsi), in debugfs_create_files()
1113 REGISTER(vpg_ber_pattern, VID_MODE_VPG_MODE, dsi), in debugfs_create_files()
1117 dsi->debugfs_vpg = kmemdup(debugfs, sizeof(debugfs), GFP_KERNEL); in debugfs_create_files()
1118 if (!dsi->debugfs_vpg) in debugfs_create_files()
1122 debugfs_create_file(dsi->debugfs_vpg[i].name, 0644, in debugfs_create_files()
1123 dsi->debugfs, &dsi->debugfs_vpg[i], in debugfs_create_files()
1127 static void dw_mipi_dsi_debugfs_init(struct dw_mipi_dsi *dsi) in dw_mipi_dsi_debugfs_init() argument
1129 dsi->debugfs = debugfs_create_dir(dev_name(dsi->dev), NULL); in dw_mipi_dsi_debugfs_init()
1130 if (IS_ERR(dsi->debugfs)) { in dw_mipi_dsi_debugfs_init()
1131 dev_err(dsi->dev, "failed to create debugfs root\n"); in dw_mipi_dsi_debugfs_init()
1135 debugfs_create_files(dsi); in dw_mipi_dsi_debugfs_init()
1138 static void dw_mipi_dsi_debugfs_remove(struct dw_mipi_dsi *dsi) in dw_mipi_dsi_debugfs_remove() argument
1140 debugfs_remove_recursive(dsi->debugfs); in dw_mipi_dsi_debugfs_remove()
1141 kfree(dsi->debugfs_vpg); in dw_mipi_dsi_debugfs_remove()
1146 static void dw_mipi_dsi_debugfs_init(struct dw_mipi_dsi *dsi) { } in dw_mipi_dsi_debugfs_init() argument
1147 static void dw_mipi_dsi_debugfs_remove(struct dw_mipi_dsi *dsi) { } in dw_mipi_dsi_debugfs_remove() argument
1156 struct dw_mipi_dsi *dsi; in __dw_mipi_dsi_probe() local
1159 dsi = devm_kzalloc(dev, sizeof(*dsi), GFP_KERNEL); in __dw_mipi_dsi_probe()
1160 if (!dsi) in __dw_mipi_dsi_probe()
1163 dsi->dev = dev; in __dw_mipi_dsi_probe()
1164 dsi->plat_data = plat_data; in __dw_mipi_dsi_probe()
1173 dsi->base = devm_platform_ioremap_resource(pdev, 0); in __dw_mipi_dsi_probe()
1174 if (IS_ERR(dsi->base)) in __dw_mipi_dsi_probe()
1178 dsi->base = plat_data->base; in __dw_mipi_dsi_probe()
1185 dsi->apb_rst = devm_reset_control_get_optional_exclusive(dev, "apb"); in __dw_mipi_dsi_probe()
1186 if (IS_ERR(dsi->apb_rst)) { in __dw_mipi_dsi_probe()
1187 ret = PTR_ERR(dsi->apb_rst); in __dw_mipi_dsi_probe()
1195 dw_mipi_dsi_debugfs_init(dsi); in __dw_mipi_dsi_probe()
1198 dsi->dsi_host.ops = &dw_mipi_dsi_host_ops; in __dw_mipi_dsi_probe()
1199 dsi->dsi_host.dev = dev; in __dw_mipi_dsi_probe()
1200 ret = mipi_dsi_host_register(&dsi->dsi_host); in __dw_mipi_dsi_probe()
1204 dw_mipi_dsi_debugfs_remove(dsi); in __dw_mipi_dsi_probe()
1208 dsi->bridge.driver_private = dsi; in __dw_mipi_dsi_probe()
1209 dsi->bridge.funcs = &dw_mipi_dsi_bridge_funcs; in __dw_mipi_dsi_probe()
1211 dsi->bridge.of_node = pdev->dev.of_node; in __dw_mipi_dsi_probe()
1214 return dsi; in __dw_mipi_dsi_probe()
1217 static void __dw_mipi_dsi_remove(struct dw_mipi_dsi *dsi) in __dw_mipi_dsi_remove() argument
1219 mipi_dsi_host_unregister(&dsi->dsi_host); in __dw_mipi_dsi_remove()
1221 pm_runtime_disable(dsi->dev); in __dw_mipi_dsi_remove()
1222 dw_mipi_dsi_debugfs_remove(dsi); in __dw_mipi_dsi_remove()
1225 void dw_mipi_dsi_set_slave(struct dw_mipi_dsi *dsi, struct dw_mipi_dsi *slave) in dw_mipi_dsi_set_slave() argument
1228 dsi->slave = slave; in dw_mipi_dsi_set_slave()
1229 dsi->slave->master = dsi; in dw_mipi_dsi_set_slave()
1232 dsi->slave->lanes = dsi->lanes; in dw_mipi_dsi_set_slave()
1233 dsi->slave->channel = dsi->channel; in dw_mipi_dsi_set_slave()
1234 dsi->slave->format = dsi->format; in dw_mipi_dsi_set_slave()
1235 dsi->slave->mode_flags = dsi->mode_flags; in dw_mipi_dsi_set_slave()
1250 void dw_mipi_dsi_remove(struct dw_mipi_dsi *dsi) in dw_mipi_dsi_remove() argument
1252 __dw_mipi_dsi_remove(dsi); in dw_mipi_dsi_remove()
1258 struct dw_mipi_dsi *dsi = con_to_dsi(connector); in dw_mipi_dsi_connector_get_modes() local
1260 if (dsi->next_bridge && (dsi->next_bridge->ops & DRM_BRIDGE_OP_MODES)) in dw_mipi_dsi_connector_get_modes()
1261 return drm_bridge_get_modes(dsi->next_bridge, connector); in dw_mipi_dsi_connector_get_modes()
1263 if (dsi->panel) in dw_mipi_dsi_connector_get_modes()
1264 return drm_panel_get_modes(dsi->panel, connector); in dw_mipi_dsi_connector_get_modes()
1276 struct dw_mipi_dsi *dsi = con_to_dsi(connector); in dw_mipi_dsi_connector_detect() local
1278 if (dsi->next_bridge && (dsi->next_bridge->ops & DRM_BRIDGE_OP_DETECT)) in dw_mipi_dsi_connector_detect()
1279 return drm_bridge_detect(dsi->next_bridge); in dw_mipi_dsi_connector_detect()
1299 static int dw_mipi_dsi_connector_init(struct dw_mipi_dsi *dsi) in dw_mipi_dsi_connector_init() argument
1301 struct drm_encoder *encoder = dsi->encoder; in dw_mipi_dsi_connector_init()
1302 struct drm_connector *connector = &dsi->connector; in dw_mipi_dsi_connector_init()
1303 struct drm_device *drm_dev = dsi->bridge.dev; in dw_mipi_dsi_connector_init()
1304 struct device *dev = dsi->dev; in dw_mipi_dsi_connector_init()
1334 int dw_mipi_dsi_bind(struct dw_mipi_dsi *dsi, struct drm_encoder *encoder) in dw_mipi_dsi_bind() argument
1338 dsi->encoder = encoder; in dw_mipi_dsi_bind()
1340 ret = drm_bridge_attach(encoder, &dsi->bridge, NULL, 0); in dw_mipi_dsi_bind()
1350 void dw_mipi_dsi_unbind(struct dw_mipi_dsi *dsi) in dw_mipi_dsi_unbind() argument
1355 struct drm_connector *dw_mipi_dsi_get_connector(struct dw_mipi_dsi *dsi) in dw_mipi_dsi_get_connector() argument
1361 if (dsi->next_bridge) { in dw_mipi_dsi_get_connector()
1364 &dsi->next_bridge->dev->mode_config.connector_list; in dw_mipi_dsi_get_connector()
1366 flags = dsi->next_bridge->ops & DRM_BRIDGE_OP_MODES ? in dw_mipi_dsi_get_connector()
1371 dsi->encoder)) in dw_mipi_dsi_get_connector()
1375 if (dsi->panel || (dsi->next_bridge && (flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR))) { in dw_mipi_dsi_get_connector()
1376 ret = dw_mipi_dsi_connector_init(dsi); in dw_mipi_dsi_get_connector()
1380 connector = &dsi->connector; in dw_mipi_dsi_get_connector()
1389 MODULE_DESCRIPTION("DW MIPI DSI host controller driver");
1391 MODULE_ALIAS("platform:dw-mipi-dsi");