Lines Matching refs:msm_host
192 static inline u32 dsi_read(struct msm_dsi_host *msm_host, u32 reg) in dsi_read() argument
194 return msm_readl(msm_host->ctrl_base + reg); in dsi_read()
196 static inline void dsi_write(struct msm_dsi_host *msm_host, u32 reg, u32 data) in dsi_write() argument
198 msm_writel(data, msm_host->ctrl_base + reg); in dsi_write()
201 static int dsi_host_regulator_enable(struct msm_dsi_host *msm_host);
202 static void dsi_host_regulator_disable(struct msm_dsi_host *msm_host);
205 struct msm_dsi_host *msm_host) in dsi_get_config() argument
208 struct device *dev = &msm_host->pdev->dev; in dsi_get_config()
220 ahb_clk = msm_clk_get(msm_host->pdev, "iface"); in dsi_get_config()
240 ret = dsi_get_version(msm_host->ctrl_base, &major, &minor); in dsi_get_config()
266 static void dsi_host_regulator_disable(struct msm_dsi_host *msm_host) in dsi_host_regulator_disable() argument
268 struct regulator_bulk_data *s = msm_host->supplies; in dsi_host_regulator_disable()
269 const struct dsi_reg_entry *regs = msm_host->cfg_hnd->cfg->reg_cfg.regs; in dsi_host_regulator_disable()
270 int num = msm_host->cfg_hnd->cfg->reg_cfg.num; in dsi_host_regulator_disable()
282 static int dsi_host_regulator_enable(struct msm_dsi_host *msm_host) in dsi_host_regulator_enable() argument
284 struct regulator_bulk_data *s = msm_host->supplies; in dsi_host_regulator_enable()
285 const struct dsi_reg_entry *regs = msm_host->cfg_hnd->cfg->reg_cfg.regs; in dsi_host_regulator_enable()
286 int num = msm_host->cfg_hnd->cfg->reg_cfg.num; in dsi_host_regulator_enable()
316 static int dsi_regulator_init(struct msm_dsi_host *msm_host) in dsi_regulator_init() argument
318 struct regulator_bulk_data *s = msm_host->supplies; in dsi_regulator_init()
319 const struct dsi_reg_entry *regs = msm_host->cfg_hnd->cfg->reg_cfg.regs; in dsi_regulator_init()
320 int num = msm_host->cfg_hnd->cfg->reg_cfg.num; in dsi_regulator_init()
326 ret = devm_regulator_bulk_get(&msm_host->pdev->dev, num, s); in dsi_regulator_init()
336 int dsi_clk_init_v2(struct msm_dsi_host *msm_host) in dsi_clk_init_v2() argument
338 struct platform_device *pdev = msm_host->pdev; in dsi_clk_init_v2()
341 msm_host->src_clk = msm_clk_get(pdev, "src"); in dsi_clk_init_v2()
343 if (IS_ERR(msm_host->src_clk)) { in dsi_clk_init_v2()
344 ret = PTR_ERR(msm_host->src_clk); in dsi_clk_init_v2()
347 msm_host->src_clk = NULL; in dsi_clk_init_v2()
351 msm_host->esc_clk_src = clk_get_parent(msm_host->esc_clk); in dsi_clk_init_v2()
352 if (!msm_host->esc_clk_src) { in dsi_clk_init_v2()
359 msm_host->dsi_clk_src = clk_get_parent(msm_host->src_clk); in dsi_clk_init_v2()
360 if (!msm_host->dsi_clk_src) { in dsi_clk_init_v2()
369 int dsi_clk_init_6g_v2(struct msm_dsi_host *msm_host) in dsi_clk_init_6g_v2() argument
371 struct platform_device *pdev = msm_host->pdev; in dsi_clk_init_6g_v2()
374 msm_host->byte_intf_clk = msm_clk_get(pdev, "byte_intf"); in dsi_clk_init_6g_v2()
375 if (IS_ERR(msm_host->byte_intf_clk)) { in dsi_clk_init_6g_v2()
376 ret = PTR_ERR(msm_host->byte_intf_clk); in dsi_clk_init_6g_v2()
384 static int dsi_clk_init(struct msm_dsi_host *msm_host) in dsi_clk_init() argument
386 struct platform_device *pdev = msm_host->pdev; in dsi_clk_init()
387 const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd; in dsi_clk_init()
393 msm_host->bus_clks[i] = msm_clk_get(pdev, in dsi_clk_init()
395 if (IS_ERR(msm_host->bus_clks[i])) { in dsi_clk_init()
396 ret = PTR_ERR(msm_host->bus_clks[i]); in dsi_clk_init()
404 msm_host->byte_clk = msm_clk_get(pdev, "byte"); in dsi_clk_init()
405 if (IS_ERR(msm_host->byte_clk)) { in dsi_clk_init()
406 ret = PTR_ERR(msm_host->byte_clk); in dsi_clk_init()
409 msm_host->byte_clk = NULL; in dsi_clk_init()
413 msm_host->pixel_clk = msm_clk_get(pdev, "pixel"); in dsi_clk_init()
414 if (IS_ERR(msm_host->pixel_clk)) { in dsi_clk_init()
415 ret = PTR_ERR(msm_host->pixel_clk); in dsi_clk_init()
418 msm_host->pixel_clk = NULL; in dsi_clk_init()
422 msm_host->esc_clk = msm_clk_get(pdev, "core"); in dsi_clk_init()
423 if (IS_ERR(msm_host->esc_clk)) { in dsi_clk_init()
424 ret = PTR_ERR(msm_host->esc_clk); in dsi_clk_init()
427 msm_host->esc_clk = NULL; in dsi_clk_init()
431 msm_host->byte_clk_src = clk_get_parent(msm_host->byte_clk); in dsi_clk_init()
432 if (!msm_host->byte_clk_src) { in dsi_clk_init()
438 msm_host->pixel_clk_src = clk_get_parent(msm_host->pixel_clk); in dsi_clk_init()
439 if (!msm_host->pixel_clk_src) { in dsi_clk_init()
446 ret = cfg_hnd->ops->clk_init_ver(msm_host); in dsi_clk_init()
451 static int dsi_bus_clk_enable(struct msm_dsi_host *msm_host) in dsi_bus_clk_enable() argument
453 const struct msm_dsi_config *cfg = msm_host->cfg_hnd->cfg; in dsi_bus_clk_enable()
456 DBG("id=%d", msm_host->id); in dsi_bus_clk_enable()
459 ret = clk_prepare_enable(msm_host->bus_clks[i]); in dsi_bus_clk_enable()
470 clk_disable_unprepare(msm_host->bus_clks[i]); in dsi_bus_clk_enable()
475 static void dsi_bus_clk_disable(struct msm_dsi_host *msm_host) in dsi_bus_clk_disable() argument
477 const struct msm_dsi_config *cfg = msm_host->cfg_hnd->cfg; in dsi_bus_clk_disable()
483 clk_disable_unprepare(msm_host->bus_clks[i]); in dsi_bus_clk_disable()
491 struct msm_dsi_host *msm_host = to_msm_dsi_host(host); in msm_dsi_runtime_suspend() local
493 if (!msm_host->cfg_hnd) in msm_dsi_runtime_suspend()
496 dsi_bus_clk_disable(msm_host); in msm_dsi_runtime_suspend()
506 struct msm_dsi_host *msm_host = to_msm_dsi_host(host); in msm_dsi_runtime_resume() local
508 if (!msm_host->cfg_hnd) in msm_dsi_runtime_resume()
511 return dsi_bus_clk_enable(msm_host); in msm_dsi_runtime_resume()
514 int dsi_link_clk_enable_6g(struct msm_dsi_host *msm_host) in dsi_link_clk_enable_6g() argument
519 msm_host->mode->clock, msm_host->byte_clk_rate); in dsi_link_clk_enable_6g()
521 ret = clk_set_rate(msm_host->byte_clk, msm_host->byte_clk_rate); in dsi_link_clk_enable_6g()
527 ret = clk_set_rate(msm_host->pixel_clk, msm_host->pixel_clk_rate); in dsi_link_clk_enable_6g()
533 if (msm_host->byte_intf_clk) { in dsi_link_clk_enable_6g()
534 ret = clk_set_rate(msm_host->byte_intf_clk, in dsi_link_clk_enable_6g()
535 msm_host->byte_clk_rate / 2); in dsi_link_clk_enable_6g()
543 ret = clk_prepare_enable(msm_host->esc_clk); in dsi_link_clk_enable_6g()
549 ret = clk_prepare_enable(msm_host->byte_clk); in dsi_link_clk_enable_6g()
555 ret = clk_prepare_enable(msm_host->pixel_clk); in dsi_link_clk_enable_6g()
561 if (msm_host->byte_intf_clk) { in dsi_link_clk_enable_6g()
562 ret = clk_prepare_enable(msm_host->byte_intf_clk); in dsi_link_clk_enable_6g()
573 clk_disable_unprepare(msm_host->pixel_clk); in dsi_link_clk_enable_6g()
575 clk_disable_unprepare(msm_host->byte_clk); in dsi_link_clk_enable_6g()
577 clk_disable_unprepare(msm_host->esc_clk); in dsi_link_clk_enable_6g()
582 int dsi_link_clk_enable_v2(struct msm_dsi_host *msm_host) in dsi_link_clk_enable_v2() argument
587 msm_host->mode->clock, msm_host->byte_clk_rate, in dsi_link_clk_enable_v2()
588 msm_host->esc_clk_rate, msm_host->src_clk_rate); in dsi_link_clk_enable_v2()
590 ret = clk_set_rate(msm_host->byte_clk, msm_host->byte_clk_rate); in dsi_link_clk_enable_v2()
596 ret = clk_set_rate(msm_host->esc_clk, msm_host->esc_clk_rate); in dsi_link_clk_enable_v2()
602 ret = clk_set_rate(msm_host->src_clk, msm_host->src_clk_rate); in dsi_link_clk_enable_v2()
608 ret = clk_set_rate(msm_host->pixel_clk, msm_host->pixel_clk_rate); in dsi_link_clk_enable_v2()
614 ret = clk_prepare_enable(msm_host->byte_clk); in dsi_link_clk_enable_v2()
620 ret = clk_prepare_enable(msm_host->esc_clk); in dsi_link_clk_enable_v2()
626 ret = clk_prepare_enable(msm_host->src_clk); in dsi_link_clk_enable_v2()
632 ret = clk_prepare_enable(msm_host->pixel_clk); in dsi_link_clk_enable_v2()
641 clk_disable_unprepare(msm_host->src_clk); in dsi_link_clk_enable_v2()
643 clk_disable_unprepare(msm_host->esc_clk); in dsi_link_clk_enable_v2()
645 clk_disable_unprepare(msm_host->byte_clk); in dsi_link_clk_enable_v2()
650 void dsi_link_clk_disable_6g(struct msm_dsi_host *msm_host) in dsi_link_clk_disable_6g() argument
652 clk_disable_unprepare(msm_host->esc_clk); in dsi_link_clk_disable_6g()
653 clk_disable_unprepare(msm_host->pixel_clk); in dsi_link_clk_disable_6g()
654 if (msm_host->byte_intf_clk) in dsi_link_clk_disable_6g()
655 clk_disable_unprepare(msm_host->byte_intf_clk); in dsi_link_clk_disable_6g()
656 clk_disable_unprepare(msm_host->byte_clk); in dsi_link_clk_disable_6g()
659 void dsi_link_clk_disable_v2(struct msm_dsi_host *msm_host) in dsi_link_clk_disable_v2() argument
661 clk_disable_unprepare(msm_host->pixel_clk); in dsi_link_clk_disable_v2()
662 clk_disable_unprepare(msm_host->src_clk); in dsi_link_clk_disable_v2()
663 clk_disable_unprepare(msm_host->esc_clk); in dsi_link_clk_disable_v2()
664 clk_disable_unprepare(msm_host->byte_clk); in dsi_link_clk_disable_v2()
667 static u32 dsi_get_pclk_rate(struct msm_dsi_host *msm_host, bool is_dual_dsi) in dsi_get_pclk_rate() argument
669 struct drm_display_mode *mode = msm_host->mode; in dsi_get_pclk_rate()
686 static void dsi_calc_pclk(struct msm_dsi_host *msm_host, bool is_dual_dsi) in dsi_calc_pclk() argument
688 u8 lanes = msm_host->lanes; in dsi_calc_pclk()
689 u32 bpp = dsi_get_bpp(msm_host->format); in dsi_calc_pclk()
690 u32 pclk_rate = dsi_get_pclk_rate(msm_host, is_dual_dsi); in dsi_calc_pclk()
700 msm_host->pixel_clk_rate = pclk_rate; in dsi_calc_pclk()
701 msm_host->byte_clk_rate = pclk_bpp; in dsi_calc_pclk()
703 DBG("pclk=%d, bclk=%d", msm_host->pixel_clk_rate, in dsi_calc_pclk()
704 msm_host->byte_clk_rate); in dsi_calc_pclk()
708 int dsi_calc_clk_rate_6g(struct msm_dsi_host *msm_host, bool is_dual_dsi) in dsi_calc_clk_rate_6g() argument
710 if (!msm_host->mode) { in dsi_calc_clk_rate_6g()
715 dsi_calc_pclk(msm_host, is_dual_dsi); in dsi_calc_clk_rate_6g()
716 msm_host->esc_clk_rate = clk_get_rate(msm_host->esc_clk); in dsi_calc_clk_rate_6g()
720 int dsi_calc_clk_rate_v2(struct msm_dsi_host *msm_host, bool is_dual_dsi) in dsi_calc_clk_rate_v2() argument
722 u32 bpp = dsi_get_bpp(msm_host->format); in dsi_calc_clk_rate_v2()
727 dsi_calc_pclk(msm_host, is_dual_dsi); in dsi_calc_clk_rate_v2()
729 pclk_bpp = (u64)dsi_get_pclk_rate(msm_host, is_dual_dsi) * bpp; in dsi_calc_clk_rate_v2()
731 msm_host->src_clk_rate = pclk_bpp; in dsi_calc_clk_rate_v2()
742 byte_mhz = msm_host->byte_clk_rate / 1000000; in dsi_calc_clk_rate_v2()
760 msm_host->esc_clk_rate = msm_host->byte_clk_rate / esc_div; in dsi_calc_clk_rate_v2()
762 DBG("esc=%d, src=%d", msm_host->esc_clk_rate, in dsi_calc_clk_rate_v2()
763 msm_host->src_clk_rate); in dsi_calc_clk_rate_v2()
768 static void dsi_intr_ctrl(struct msm_dsi_host *msm_host, u32 mask, int enable) in dsi_intr_ctrl() argument
773 spin_lock_irqsave(&msm_host->intr_lock, flags); in dsi_intr_ctrl()
774 intr = dsi_read(msm_host, REG_DSI_INTR_CTRL); in dsi_intr_ctrl()
783 dsi_write(msm_host, REG_DSI_INTR_CTRL, intr); in dsi_intr_ctrl()
784 spin_unlock_irqrestore(&msm_host->intr_lock, flags); in dsi_intr_ctrl()
821 static void dsi_ctrl_config(struct msm_dsi_host *msm_host, bool enable, in dsi_ctrl_config() argument
824 u32 flags = msm_host->mode_flags; in dsi_ctrl_config()
825 enum mipi_dsi_pixel_format mipi_fmt = msm_host->format; in dsi_ctrl_config()
826 const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd; in dsi_ctrl_config()
830 dsi_write(msm_host, REG_DSI_CTRL, 0); in dsi_ctrl_config()
850 data |= DSI_VID_CFG0_VIRT_CHANNEL(msm_host->channel); in dsi_ctrl_config()
851 dsi_write(msm_host, REG_DSI_VID_CFG0, data); in dsi_ctrl_config()
855 dsi_write(msm_host, REG_DSI_VID_CFG1, 0); in dsi_ctrl_config()
860 dsi_write(msm_host, REG_DSI_CMD_CFG0, data); in dsi_ctrl_config()
867 dsi_write(msm_host, REG_DSI_CMD_CFG1, data); in dsi_ctrl_config()
870 dsi_write(msm_host, REG_DSI_CMD_DMA_CTRL, in dsi_ctrl_config()
879 data |= DSI_TRIG_CTRL_STREAM(msm_host->channel); in dsi_ctrl_config()
883 dsi_write(msm_host, REG_DSI_TRIG_CTRL, data); in dsi_ctrl_config()
887 dsi_write(msm_host, REG_DSI_CLKOUT_TIMING_CTRL, data); in dsi_ctrl_config()
892 dsi_write(msm_host, REG_DSI_T_CLK_PRE_EXTEND, in dsi_ctrl_config()
898 dsi_write(msm_host, REG_DSI_EOT_PACKET_CTRL, data); in dsi_ctrl_config()
901 dsi_write(msm_host, REG_DSI_ERR_INT_MASK0, 0x13ff3fe0); in dsi_ctrl_config()
903 dsi_intr_ctrl(msm_host, DSI_IRQ_MASK_ERROR, 1); in dsi_ctrl_config()
905 dsi_write(msm_host, REG_DSI_CLK_CTRL, DSI_CLK_CTRL_ENABLE_CLKS); in dsi_ctrl_config()
909 DBG("lane number=%d", msm_host->lanes); in dsi_ctrl_config()
910 data |= ((DSI_CTRL_LANE0 << msm_host->lanes) - DSI_CTRL_LANE0); in dsi_ctrl_config()
912 dsi_write(msm_host, REG_DSI_LANE_SWAP_CTRL, in dsi_ctrl_config()
913 DSI_LANE_SWAP_CTRL_DLN_SWAP_SEL(msm_host->dlane_swap)); in dsi_ctrl_config()
916 dsi_write(msm_host, REG_DSI_LANE_CTRL, in dsi_ctrl_config()
921 dsi_write(msm_host, REG_DSI_CTRL, data); in dsi_ctrl_config()
924 static void dsi_timing_setup(struct msm_dsi_host *msm_host, bool is_dual_dsi) in dsi_timing_setup() argument
926 struct drm_display_mode *mode = msm_host->mode; in dsi_timing_setup()
956 if (msm_host->mode_flags & MIPI_DSI_MODE_VIDEO) { in dsi_timing_setup()
957 dsi_write(msm_host, REG_DSI_ACTIVE_H, in dsi_timing_setup()
960 dsi_write(msm_host, REG_DSI_ACTIVE_V, in dsi_timing_setup()
963 dsi_write(msm_host, REG_DSI_TOTAL, in dsi_timing_setup()
967 dsi_write(msm_host, REG_DSI_ACTIVE_HSYNC, in dsi_timing_setup()
970 dsi_write(msm_host, REG_DSI_ACTIVE_VSYNC_HPOS, 0); in dsi_timing_setup()
971 dsi_write(msm_host, REG_DSI_ACTIVE_VSYNC_VPOS, in dsi_timing_setup()
976 wc = hdisplay * dsi_get_bpp(msm_host->format) / 8 + 1; in dsi_timing_setup()
978 dsi_write(msm_host, REG_DSI_CMD_MDP_STREAM_CTRL, in dsi_timing_setup()
981 msm_host->channel) | in dsi_timing_setup()
985 dsi_write(msm_host, REG_DSI_CMD_MDP_STREAM_TOTAL, in dsi_timing_setup()
991 static void dsi_sw_reset(struct msm_dsi_host *msm_host) in dsi_sw_reset() argument
993 dsi_write(msm_host, REG_DSI_CLK_CTRL, DSI_CLK_CTRL_ENABLE_CLKS); in dsi_sw_reset()
996 dsi_write(msm_host, REG_DSI_RESET, 1); in dsi_sw_reset()
998 dsi_write(msm_host, REG_DSI_RESET, 0); in dsi_sw_reset()
1001 static void dsi_op_mode_config(struct msm_dsi_host *msm_host, in dsi_op_mode_config() argument
1006 dsi_ctrl = dsi_read(msm_host, REG_DSI_CTRL); in dsi_op_mode_config()
1011 dsi_intr_ctrl(msm_host, DSI_IRQ_MASK_CMD_MDP_DONE | in dsi_op_mode_config()
1018 dsi_intr_ctrl(msm_host, DSI_IRQ_MASK_CMD_MDP_DONE, 1); in dsi_op_mode_config()
1023 dsi_write(msm_host, REG_DSI_CTRL, dsi_ctrl); in dsi_op_mode_config()
1026 static void dsi_set_tx_power_mode(int mode, struct msm_dsi_host *msm_host) in dsi_set_tx_power_mode() argument
1030 data = dsi_read(msm_host, REG_DSI_CMD_DMA_CTRL); in dsi_set_tx_power_mode()
1037 dsi_write(msm_host, REG_DSI_CMD_DMA_CTRL, data); in dsi_set_tx_power_mode()
1040 static void dsi_wait4video_done(struct msm_dsi_host *msm_host) in dsi_wait4video_done() argument
1043 struct device *dev = &msm_host->pdev->dev; in dsi_wait4video_done()
1045 dsi_intr_ctrl(msm_host, DSI_IRQ_MASK_VIDEO_DONE, 1); in dsi_wait4video_done()
1047 reinit_completion(&msm_host->video_comp); in dsi_wait4video_done()
1049 ret = wait_for_completion_timeout(&msm_host->video_comp, in dsi_wait4video_done()
1055 dsi_intr_ctrl(msm_host, DSI_IRQ_MASK_VIDEO_DONE, 0); in dsi_wait4video_done()
1058 static void dsi_wait4video_eng_busy(struct msm_dsi_host *msm_host) in dsi_wait4video_eng_busy() argument
1060 if (!(msm_host->mode_flags & MIPI_DSI_MODE_VIDEO)) in dsi_wait4video_eng_busy()
1063 if (msm_host->power_on && msm_host->enabled) { in dsi_wait4video_eng_busy()
1064 dsi_wait4video_done(msm_host); in dsi_wait4video_eng_busy()
1070 int dsi_tx_buf_alloc_6g(struct msm_dsi_host *msm_host, int size) in dsi_tx_buf_alloc_6g() argument
1072 struct drm_device *dev = msm_host->dev; in dsi_tx_buf_alloc_6g()
1079 &msm_host->tx_gem_obj, &iova); in dsi_tx_buf_alloc_6g()
1082 msm_host->tx_gem_obj = NULL; in dsi_tx_buf_alloc_6g()
1086 msm_host->tx_size = msm_host->tx_gem_obj->size; in dsi_tx_buf_alloc_6g()
1091 int dsi_tx_buf_alloc_v2(struct msm_dsi_host *msm_host, int size) in dsi_tx_buf_alloc_v2() argument
1093 struct drm_device *dev = msm_host->dev; in dsi_tx_buf_alloc_v2()
1095 msm_host->tx_buf = dma_alloc_coherent(dev->dev, size, in dsi_tx_buf_alloc_v2()
1096 &msm_host->tx_buf_paddr, GFP_KERNEL); in dsi_tx_buf_alloc_v2()
1097 if (!msm_host->tx_buf) in dsi_tx_buf_alloc_v2()
1100 msm_host->tx_size = size; in dsi_tx_buf_alloc_v2()
1105 static void dsi_tx_buf_free(struct msm_dsi_host *msm_host) in dsi_tx_buf_free() argument
1107 struct drm_device *dev = msm_host->dev; in dsi_tx_buf_free()
1120 if (msm_host->tx_gem_obj) { in dsi_tx_buf_free()
1121 msm_gem_put_iova(msm_host->tx_gem_obj, priv->kms->aspace); in dsi_tx_buf_free()
1122 drm_gem_object_put_unlocked(msm_host->tx_gem_obj); in dsi_tx_buf_free()
1123 msm_host->tx_gem_obj = NULL; in dsi_tx_buf_free()
1126 if (msm_host->tx_buf) in dsi_tx_buf_free()
1127 dma_free_coherent(dev->dev, msm_host->tx_size, msm_host->tx_buf, in dsi_tx_buf_free()
1128 msm_host->tx_buf_paddr); in dsi_tx_buf_free()
1131 void *dsi_tx_buf_get_6g(struct msm_dsi_host *msm_host) in dsi_tx_buf_get_6g() argument
1133 return msm_gem_get_vaddr(msm_host->tx_gem_obj); in dsi_tx_buf_get_6g()
1136 void *dsi_tx_buf_get_v2(struct msm_dsi_host *msm_host) in dsi_tx_buf_get_v2() argument
1138 return msm_host->tx_buf; in dsi_tx_buf_get_v2()
1141 void dsi_tx_buf_put_6g(struct msm_dsi_host *msm_host) in dsi_tx_buf_put_6g() argument
1143 msm_gem_put_vaddr(msm_host->tx_gem_obj); in dsi_tx_buf_put_6g()
1149 static int dsi_cmd_dma_add(struct msm_dsi_host *msm_host, in dsi_cmd_dma_add() argument
1152 const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd; in dsi_cmd_dma_add()
1165 if (len > msm_host->tx_size) { in dsi_cmd_dma_add()
1170 data = cfg_hnd->ops->tx_buf_get(msm_host); in dsi_cmd_dma_add()
1196 cfg_hnd->ops->tx_buf_put(msm_host); in dsi_cmd_dma_add()
1243 int dsi_dma_base_get_6g(struct msm_dsi_host *msm_host, uint64_t *dma_base) in dsi_dma_base_get_6g() argument
1245 struct drm_device *dev = msm_host->dev; in dsi_dma_base_get_6g()
1251 return msm_gem_get_iova(msm_host->tx_gem_obj, in dsi_dma_base_get_6g()
1255 int dsi_dma_base_get_v2(struct msm_dsi_host *msm_host, uint64_t *dma_base) in dsi_dma_base_get_v2() argument
1260 *dma_base = msm_host->tx_buf_paddr; in dsi_dma_base_get_v2()
1264 static int dsi_cmd_dma_tx(struct msm_dsi_host *msm_host, int len) in dsi_cmd_dma_tx() argument
1266 const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd; in dsi_cmd_dma_tx()
1271 ret = cfg_hnd->ops->dma_base_get(msm_host, &dma_base); in dsi_cmd_dma_tx()
1277 reinit_completion(&msm_host->dma_comp); in dsi_cmd_dma_tx()
1279 dsi_wait4video_eng_busy(msm_host); in dsi_cmd_dma_tx()
1282 msm_host->id, dma_base, len); in dsi_cmd_dma_tx()
1284 ret = wait_for_completion_timeout(&msm_host->dma_comp, in dsi_cmd_dma_tx()
1297 static int dsi_cmd_dma_rx(struct msm_dsi_host *msm_host, in dsi_cmd_dma_rx() argument
1305 int buf_offset = buf - msm_host->rx_buf; in dsi_cmd_dma_rx()
1336 data = dsi_read(msm_host, REG_DSI_RDBK_DATA(i)); in dsi_cmd_dma_rx()
1347 static int dsi_cmds2buf_tx(struct msm_dsi_host *msm_host, in dsi_cmds2buf_tx() argument
1351 int bllp_len = msm_host->mode->hdisplay * in dsi_cmds2buf_tx()
1352 dsi_get_bpp(msm_host->format) / 8; in dsi_cmds2buf_tx()
1354 len = dsi_cmd_dma_add(msm_host, msg); in dsi_cmds2buf_tx()
1370 if ((msm_host->mode_flags & MIPI_DSI_MODE_VIDEO) && (len > bllp_len)) { in dsi_cmds2buf_tx()
1376 ret = dsi_cmd_dma_tx(msm_host, len); in dsi_cmds2buf_tx()
1386 static void dsi_sw_reset_restore(struct msm_dsi_host *msm_host) in dsi_sw_reset_restore() argument
1390 data0 = dsi_read(msm_host, REG_DSI_CTRL); in dsi_sw_reset_restore()
1393 dsi_write(msm_host, REG_DSI_CTRL, data1); in dsi_sw_reset_restore()
1400 dsi_write(msm_host, REG_DSI_CLK_CTRL, DSI_CLK_CTRL_ENABLE_CLKS); in dsi_sw_reset_restore()
1404 dsi_write(msm_host, REG_DSI_RESET, 1); in dsi_sw_reset_restore()
1406 dsi_write(msm_host, REG_DSI_RESET, 0); in dsi_sw_reset_restore()
1408 dsi_write(msm_host, REG_DSI_CTRL, data0); in dsi_sw_reset_restore()
1414 struct msm_dsi_host *msm_host = in dsi_hpd_worker() local
1417 drm_helper_hpd_irq_event(msm_host->dev); in dsi_hpd_worker()
1422 struct msm_dsi_host *msm_host = in dsi_err_worker() local
1424 u32 status = msm_host->err_work_state; in dsi_err_worker()
1428 dsi_sw_reset_restore(msm_host); in dsi_err_worker()
1431 msm_host->err_work_state = 0; in dsi_err_worker()
1434 dsi_intr_ctrl(msm_host, DSI_IRQ_MASK_ERROR, 1); in dsi_err_worker()
1437 static void dsi_ack_err_status(struct msm_dsi_host *msm_host) in dsi_ack_err_status() argument
1441 status = dsi_read(msm_host, REG_DSI_ACK_ERR_STATUS); in dsi_ack_err_status()
1444 dsi_write(msm_host, REG_DSI_ACK_ERR_STATUS, status); in dsi_ack_err_status()
1446 dsi_write(msm_host, REG_DSI_ACK_ERR_STATUS, 0); in dsi_ack_err_status()
1447 msm_host->err_work_state |= DSI_ERR_STATE_ACK; in dsi_ack_err_status()
1451 static void dsi_timeout_status(struct msm_dsi_host *msm_host) in dsi_timeout_status() argument
1455 status = dsi_read(msm_host, REG_DSI_TIMEOUT_STATUS); in dsi_timeout_status()
1458 dsi_write(msm_host, REG_DSI_TIMEOUT_STATUS, status); in dsi_timeout_status()
1459 msm_host->err_work_state |= DSI_ERR_STATE_TIMEOUT; in dsi_timeout_status()
1463 static void dsi_dln0_phy_err(struct msm_dsi_host *msm_host) in dsi_dln0_phy_err() argument
1467 status = dsi_read(msm_host, REG_DSI_DLN0_PHY_ERR); in dsi_dln0_phy_err()
1474 dsi_write(msm_host, REG_DSI_DLN0_PHY_ERR, status); in dsi_dln0_phy_err()
1475 msm_host->err_work_state |= DSI_ERR_STATE_DLN0_PHY; in dsi_dln0_phy_err()
1479 static void dsi_fifo_status(struct msm_dsi_host *msm_host) in dsi_fifo_status() argument
1483 status = dsi_read(msm_host, REG_DSI_FIFO_STATUS); in dsi_fifo_status()
1487 dsi_write(msm_host, REG_DSI_FIFO_STATUS, status); in dsi_fifo_status()
1488 msm_host->err_work_state |= DSI_ERR_STATE_FIFO; in dsi_fifo_status()
1490 msm_host->err_work_state |= in dsi_fifo_status()
1495 static void dsi_status(struct msm_dsi_host *msm_host) in dsi_status() argument
1499 status = dsi_read(msm_host, REG_DSI_STATUS0); in dsi_status()
1502 dsi_write(msm_host, REG_DSI_STATUS0, status); in dsi_status()
1503 msm_host->err_work_state |= in dsi_status()
1508 static void dsi_clk_status(struct msm_dsi_host *msm_host) in dsi_clk_status() argument
1512 status = dsi_read(msm_host, REG_DSI_CLK_STATUS); in dsi_clk_status()
1515 dsi_write(msm_host, REG_DSI_CLK_STATUS, status); in dsi_clk_status()
1516 msm_host->err_work_state |= DSI_ERR_STATE_PLL_UNLOCKED; in dsi_clk_status()
1520 static void dsi_error(struct msm_dsi_host *msm_host) in dsi_error() argument
1523 dsi_intr_ctrl(msm_host, DSI_IRQ_MASK_ERROR, 0); in dsi_error()
1525 dsi_clk_status(msm_host); in dsi_error()
1526 dsi_fifo_status(msm_host); in dsi_error()
1527 dsi_ack_err_status(msm_host); in dsi_error()
1528 dsi_timeout_status(msm_host); in dsi_error()
1529 dsi_status(msm_host); in dsi_error()
1530 dsi_dln0_phy_err(msm_host); in dsi_error()
1532 queue_work(msm_host->workqueue, &msm_host->err_work); in dsi_error()
1537 struct msm_dsi_host *msm_host = ptr; in dsi_host_irq() local
1541 if (!msm_host->ctrl_base) in dsi_host_irq()
1544 spin_lock_irqsave(&msm_host->intr_lock, flags); in dsi_host_irq()
1545 isr = dsi_read(msm_host, REG_DSI_INTR_CTRL); in dsi_host_irq()
1546 dsi_write(msm_host, REG_DSI_INTR_CTRL, isr); in dsi_host_irq()
1547 spin_unlock_irqrestore(&msm_host->intr_lock, flags); in dsi_host_irq()
1549 DBG("isr=0x%x, id=%d", isr, msm_host->id); in dsi_host_irq()
1552 dsi_error(msm_host); in dsi_host_irq()
1555 complete(&msm_host->video_comp); in dsi_host_irq()
1558 complete(&msm_host->dma_comp); in dsi_host_irq()
1563 static int dsi_host_init_panel_gpios(struct msm_dsi_host *msm_host, in dsi_host_init_panel_gpios() argument
1566 msm_host->disp_en_gpio = devm_gpiod_get_optional(panel_device, in dsi_host_init_panel_gpios()
1569 if (IS_ERR(msm_host->disp_en_gpio)) { in dsi_host_init_panel_gpios()
1571 PTR_ERR(msm_host->disp_en_gpio)); in dsi_host_init_panel_gpios()
1572 return PTR_ERR(msm_host->disp_en_gpio); in dsi_host_init_panel_gpios()
1575 msm_host->te_gpio = devm_gpiod_get_optional(panel_device, "disp-te", in dsi_host_init_panel_gpios()
1577 if (IS_ERR(msm_host->te_gpio)) { in dsi_host_init_panel_gpios()
1578 DBG("cannot get disp-te-gpios %ld", PTR_ERR(msm_host->te_gpio)); in dsi_host_init_panel_gpios()
1579 return PTR_ERR(msm_host->te_gpio); in dsi_host_init_panel_gpios()
1588 struct msm_dsi_host *msm_host = to_msm_dsi_host(host); in dsi_host_attach() local
1591 if (dsi->lanes > msm_host->num_data_lanes) in dsi_host_attach()
1594 msm_host->channel = dsi->channel; in dsi_host_attach()
1595 msm_host->lanes = dsi->lanes; in dsi_host_attach()
1596 msm_host->format = dsi->format; in dsi_host_attach()
1597 msm_host->mode_flags = dsi->mode_flags; in dsi_host_attach()
1599 msm_dsi_manager_attach_dsi_device(msm_host->id, dsi->mode_flags); in dsi_host_attach()
1602 ret = dsi_host_init_panel_gpios(msm_host, &dsi->dev); in dsi_host_attach()
1606 DBG("id=%d", msm_host->id); in dsi_host_attach()
1607 if (msm_host->dev) in dsi_host_attach()
1608 queue_work(msm_host->workqueue, &msm_host->hpd_work); in dsi_host_attach()
1616 struct msm_dsi_host *msm_host = to_msm_dsi_host(host); in dsi_host_detach() local
1618 msm_host->device_node = NULL; in dsi_host_detach()
1620 DBG("id=%d", msm_host->id); in dsi_host_detach()
1621 if (msm_host->dev) in dsi_host_detach()
1622 queue_work(msm_host->workqueue, &msm_host->hpd_work); in dsi_host_detach()
1630 struct msm_dsi_host *msm_host = to_msm_dsi_host(host); in dsi_host_transfer() local
1633 if (!msg || !msm_host->power_on) in dsi_host_transfer()
1636 mutex_lock(&msm_host->cmd_mutex); in dsi_host_transfer()
1637 ret = msm_dsi_manager_cmd_xfer(msm_host->id, msg); in dsi_host_transfer()
1638 mutex_unlock(&msm_host->cmd_mutex); in dsi_host_transfer()
1666 static int dsi_host_parse_lane_data(struct msm_dsi_host *msm_host, in dsi_host_parse_lane_data() argument
1669 struct device *dev = &msm_host->pdev->dev; in dsi_host_parse_lane_data()
1688 msm_host->num_data_lanes = num_lanes; in dsi_host_parse_lane_data()
1722 msm_host->dlane_swap = i; in dsi_host_parse_lane_data()
1730 static int dsi_host_parse_dt(struct msm_dsi_host *msm_host) in dsi_host_parse_dt() argument
1732 struct device *dev = &msm_host->pdev->dev; in dsi_host_parse_dt()
1749 ret = dsi_host_parse_lane_data(msm_host, endpoint); in dsi_host_parse_dt()
1763 msm_host->device_node = device_node; in dsi_host_parse_dt()
1766 msm_host->sfpb = syscon_regmap_lookup_by_phandle(np, in dsi_host_parse_dt()
1768 if (IS_ERR(msm_host->sfpb)) { in dsi_host_parse_dt()
1771 ret = PTR_ERR(msm_host->sfpb); in dsi_host_parse_dt()
1783 static int dsi_host_get_id(struct msm_dsi_host *msm_host) in dsi_host_get_id() argument
1785 struct platform_device *pdev = msm_host->pdev; in dsi_host_get_id()
1786 const struct msm_dsi_config *cfg = msm_host->cfg_hnd->cfg; in dsi_host_get_id()
1804 struct msm_dsi_host *msm_host = NULL; in msm_dsi_host_init() local
1808 msm_host = devm_kzalloc(&pdev->dev, sizeof(*msm_host), GFP_KERNEL); in msm_dsi_host_init()
1809 if (!msm_host) { in msm_dsi_host_init()
1816 msm_host->pdev = pdev; in msm_dsi_host_init()
1817 msm_dsi->host = &msm_host->base; in msm_dsi_host_init()
1819 ret = dsi_host_parse_dt(msm_host); in msm_dsi_host_init()
1825 msm_host->ctrl_base = msm_ioremap(pdev, "dsi_ctrl", "DSI CTRL"); in msm_dsi_host_init()
1826 if (IS_ERR(msm_host->ctrl_base)) { in msm_dsi_host_init()
1828 ret = PTR_ERR(msm_host->ctrl_base); in msm_dsi_host_init()
1834 msm_host->cfg_hnd = dsi_get_config(msm_host); in msm_dsi_host_init()
1835 if (!msm_host->cfg_hnd) { in msm_dsi_host_init()
1841 msm_host->id = dsi_host_get_id(msm_host); in msm_dsi_host_init()
1842 if (msm_host->id < 0) { in msm_dsi_host_init()
1843 ret = msm_host->id; in msm_dsi_host_init()
1849 msm_host->ctrl_base += msm_host->cfg_hnd->cfg->io_offset; in msm_dsi_host_init()
1851 ret = dsi_regulator_init(msm_host); in msm_dsi_host_init()
1857 ret = dsi_clk_init(msm_host); in msm_dsi_host_init()
1863 msm_host->rx_buf = devm_kzalloc(&pdev->dev, SZ_4K, GFP_KERNEL); in msm_dsi_host_init()
1864 if (!msm_host->rx_buf) { in msm_dsi_host_init()
1870 init_completion(&msm_host->dma_comp); in msm_dsi_host_init()
1871 init_completion(&msm_host->video_comp); in msm_dsi_host_init()
1872 mutex_init(&msm_host->dev_mutex); in msm_dsi_host_init()
1873 mutex_init(&msm_host->cmd_mutex); in msm_dsi_host_init()
1874 spin_lock_init(&msm_host->intr_lock); in msm_dsi_host_init()
1877 msm_host->workqueue = alloc_ordered_workqueue("dsi_drm_work", 0); in msm_dsi_host_init()
1878 INIT_WORK(&msm_host->err_work, dsi_err_worker); in msm_dsi_host_init()
1879 INIT_WORK(&msm_host->hpd_work, dsi_hpd_worker); in msm_dsi_host_init()
1881 msm_dsi->id = msm_host->id; in msm_dsi_host_init()
1883 DBG("Dsi Host %d initialized", msm_host->id); in msm_dsi_host_init()
1892 struct msm_dsi_host *msm_host = to_msm_dsi_host(host); in msm_dsi_host_destroy() local
1895 dsi_tx_buf_free(msm_host); in msm_dsi_host_destroy()
1896 if (msm_host->workqueue) { in msm_dsi_host_destroy()
1897 flush_workqueue(msm_host->workqueue); in msm_dsi_host_destroy()
1898 destroy_workqueue(msm_host->workqueue); in msm_dsi_host_destroy()
1899 msm_host->workqueue = NULL; in msm_dsi_host_destroy()
1902 mutex_destroy(&msm_host->cmd_mutex); in msm_dsi_host_destroy()
1903 mutex_destroy(&msm_host->dev_mutex); in msm_dsi_host_destroy()
1905 pm_runtime_disable(&msm_host->pdev->dev); in msm_dsi_host_destroy()
1911 struct msm_dsi_host *msm_host = to_msm_dsi_host(host); in msm_dsi_host_modeset_init() local
1912 const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd; in msm_dsi_host_modeset_init()
1913 struct platform_device *pdev = msm_host->pdev; in msm_dsi_host_modeset_init()
1916 msm_host->irq = irq_of_parse_and_map(pdev->dev.of_node, 0); in msm_dsi_host_modeset_init()
1917 if (msm_host->irq < 0) { in msm_dsi_host_modeset_init()
1918 ret = msm_host->irq; in msm_dsi_host_modeset_init()
1923 ret = devm_request_irq(&pdev->dev, msm_host->irq, in msm_dsi_host_modeset_init()
1925 "dsi_isr", msm_host); in msm_dsi_host_modeset_init()
1928 msm_host->irq, ret); in msm_dsi_host_modeset_init()
1932 msm_host->dev = dev; in msm_dsi_host_modeset_init()
1933 ret = cfg_hnd->ops->tx_buf_alloc(msm_host, SZ_4K); in msm_dsi_host_modeset_init()
1944 struct msm_dsi_host *msm_host = to_msm_dsi_host(host); in msm_dsi_host_register() local
1948 if (!msm_host->registered) { in msm_dsi_host_register()
1949 host->dev = &msm_host->pdev->dev; in msm_dsi_host_register()
1955 msm_host->registered = true; in msm_dsi_host_register()
1965 if (check_defer && msm_host->device_node) { in msm_dsi_host_register()
1966 if (IS_ERR(of_drm_find_panel(msm_host->device_node))) in msm_dsi_host_register()
1967 if (!of_drm_find_bridge(msm_host->device_node)) in msm_dsi_host_register()
1977 struct msm_dsi_host *msm_host = to_msm_dsi_host(host); in msm_dsi_host_unregister() local
1979 if (msm_host->registered) { in msm_dsi_host_unregister()
1983 msm_host->registered = false; in msm_dsi_host_unregister()
1990 struct msm_dsi_host *msm_host = to_msm_dsi_host(host); in msm_dsi_host_xfer_prepare() local
1991 const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd; in msm_dsi_host_xfer_prepare()
2003 pm_runtime_get_sync(&msm_host->pdev->dev); in msm_dsi_host_xfer_prepare()
2004 cfg_hnd->ops->link_clk_enable(msm_host); in msm_dsi_host_xfer_prepare()
2009 dsi_set_tx_power_mode(0, msm_host); in msm_dsi_host_xfer_prepare()
2011 msm_host->dma_cmd_ctrl_restore = dsi_read(msm_host, REG_DSI_CTRL); in msm_dsi_host_xfer_prepare()
2012 dsi_write(msm_host, REG_DSI_CTRL, in msm_dsi_host_xfer_prepare()
2013 msm_host->dma_cmd_ctrl_restore | in msm_dsi_host_xfer_prepare()
2016 dsi_intr_ctrl(msm_host, DSI_IRQ_MASK_CMD_DMA_DONE, 1); in msm_dsi_host_xfer_prepare()
2024 struct msm_dsi_host *msm_host = to_msm_dsi_host(host); in msm_dsi_host_xfer_restore() local
2025 const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd; in msm_dsi_host_xfer_restore()
2027 dsi_intr_ctrl(msm_host, DSI_IRQ_MASK_CMD_DMA_DONE, 0); in msm_dsi_host_xfer_restore()
2028 dsi_write(msm_host, REG_DSI_CTRL, msm_host->dma_cmd_ctrl_restore); in msm_dsi_host_xfer_restore()
2031 dsi_set_tx_power_mode(1, msm_host); in msm_dsi_host_xfer_restore()
2035 cfg_hnd->ops->link_clk_disable(msm_host); in msm_dsi_host_xfer_restore()
2036 pm_runtime_put_autosuspend(&msm_host->pdev->dev); in msm_dsi_host_xfer_restore()
2042 struct msm_dsi_host *msm_host = to_msm_dsi_host(host); in msm_dsi_host_cmd_tx() local
2044 return dsi_cmds2buf_tx(msm_host, msg); in msm_dsi_host_cmd_tx()
2050 struct msm_dsi_host *msm_host = to_msm_dsi_host(host); in msm_dsi_host_cmd_rx() local
2051 const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd; in msm_dsi_host_cmd_rx()
2072 buf = msm_host->rx_buf; in msm_dsi_host_cmd_rx()
2086 ret = dsi_cmds2buf_tx(msm_host, &max_pkt_size_msg); in msm_dsi_host_cmd_rx()
2096 dsi_write(msm_host, REG_DSI_RDBK_DATA_CTRL, in msm_dsi_host_cmd_rx()
2099 dsi_write(msm_host, REG_DSI_RDBK_DATA_CTRL, 0); in msm_dsi_host_cmd_rx()
2103 ret = dsi_cmds2buf_tx(msm_host, msg); in msm_dsi_host_cmd_rx()
2116 dlen = dsi_cmd_dma_rx(msm_host, buf, rx_byte, pkt_size); in msm_dsi_host_cmd_rx()
2152 buf = msm_host->rx_buf + (10 - rlen); in msm_dsi_host_cmd_rx()
2154 buf = msm_host->rx_buf; in msm_dsi_host_cmd_rx()
2185 struct msm_dsi_host *msm_host = to_msm_dsi_host(host); in msm_dsi_host_cmd_xfer_commit() local
2187 dsi_write(msm_host, REG_DSI_DMA_BASE, dma_base); in msm_dsi_host_cmd_xfer_commit()
2188 dsi_write(msm_host, REG_DSI_DMA_LEN, len); in msm_dsi_host_cmd_xfer_commit()
2189 dsi_write(msm_host, REG_DSI_TRIG_DMA, 1); in msm_dsi_host_cmd_xfer_commit()
2198 struct msm_dsi_host *msm_host = to_msm_dsi_host(host); in msm_dsi_host_set_src_pll() local
2210 ret = clk_set_parent(msm_host->byte_clk_src, byte_clk_provider); in msm_dsi_host_set_src_pll()
2217 ret = clk_set_parent(msm_host->pixel_clk_src, pixel_clk_provider); in msm_dsi_host_set_src_pll()
2224 if (msm_host->dsi_clk_src) { in msm_dsi_host_set_src_pll()
2225 ret = clk_set_parent(msm_host->dsi_clk_src, pixel_clk_provider); in msm_dsi_host_set_src_pll()
2233 if (msm_host->esc_clk_src) { in msm_dsi_host_set_src_pll()
2234 ret = clk_set_parent(msm_host->esc_clk_src, byte_clk_provider); in msm_dsi_host_set_src_pll()
2248 struct msm_dsi_host *msm_host = to_msm_dsi_host(host); in msm_dsi_host_reset_phy() local
2251 dsi_write(msm_host, REG_DSI_PHY_RESET, DSI_PHY_RESET_RESET); in msm_dsi_host_reset_phy()
2255 dsi_write(msm_host, REG_DSI_PHY_RESET, 0); in msm_dsi_host_reset_phy()
2263 struct msm_dsi_host *msm_host = to_msm_dsi_host(host); in msm_dsi_host_get_phy_clk_req() local
2264 const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd; in msm_dsi_host_get_phy_clk_req()
2267 ret = cfg_hnd->ops->calc_clk_rate(msm_host, is_dual_dsi); in msm_dsi_host_get_phy_clk_req()
2273 clk_req->bitclk_rate = msm_host->byte_clk_rate * 8; in msm_dsi_host_get_phy_clk_req()
2274 clk_req->escclk_rate = msm_host->esc_clk_rate; in msm_dsi_host_get_phy_clk_req()
2279 struct msm_dsi_host *msm_host = to_msm_dsi_host(host); in msm_dsi_host_enable() local
2281 dsi_op_mode_config(msm_host, in msm_dsi_host_enable()
2282 !!(msm_host->mode_flags & MIPI_DSI_MODE_VIDEO), true); in msm_dsi_host_enable()
2293 msm_host->enabled = true; in msm_dsi_host_enable()
2299 struct msm_dsi_host *msm_host = to_msm_dsi_host(host); in msm_dsi_host_disable() local
2301 msm_host->enabled = false; in msm_dsi_host_disable()
2302 dsi_op_mode_config(msm_host, in msm_dsi_host_disable()
2303 !!(msm_host->mode_flags & MIPI_DSI_MODE_VIDEO), false); in msm_dsi_host_disable()
2309 dsi_sw_reset(msm_host); in msm_dsi_host_disable()
2314 static void msm_dsi_sfpb_config(struct msm_dsi_host *msm_host, bool enable) in msm_dsi_sfpb_config() argument
2318 if (!msm_host->sfpb) in msm_dsi_sfpb_config()
2323 regmap_update_bits(msm_host->sfpb, REG_SFPB_GPREG, in msm_dsi_sfpb_config()
2332 struct msm_dsi_host *msm_host = to_msm_dsi_host(host); in msm_dsi_host_power_on() local
2333 const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd; in msm_dsi_host_power_on()
2336 mutex_lock(&msm_host->dev_mutex); in msm_dsi_host_power_on()
2337 if (msm_host->power_on) { in msm_dsi_host_power_on()
2342 msm_dsi_sfpb_config(msm_host, true); in msm_dsi_host_power_on()
2344 ret = dsi_host_regulator_enable(msm_host); in msm_dsi_host_power_on()
2351 pm_runtime_get_sync(&msm_host->pdev->dev); in msm_dsi_host_power_on()
2352 ret = cfg_hnd->ops->link_clk_enable(msm_host); in msm_dsi_host_power_on()
2359 ret = pinctrl_pm_select_default_state(&msm_host->pdev->dev); in msm_dsi_host_power_on()
2366 dsi_timing_setup(msm_host, is_dual_dsi); in msm_dsi_host_power_on()
2367 dsi_sw_reset(msm_host); in msm_dsi_host_power_on()
2368 dsi_ctrl_config(msm_host, true, phy_shared_timings); in msm_dsi_host_power_on()
2370 if (msm_host->disp_en_gpio) in msm_dsi_host_power_on()
2371 gpiod_set_value(msm_host->disp_en_gpio, 1); in msm_dsi_host_power_on()
2373 msm_host->power_on = true; in msm_dsi_host_power_on()
2374 mutex_unlock(&msm_host->dev_mutex); in msm_dsi_host_power_on()
2379 cfg_hnd->ops->link_clk_disable(msm_host); in msm_dsi_host_power_on()
2380 pm_runtime_put_autosuspend(&msm_host->pdev->dev); in msm_dsi_host_power_on()
2382 dsi_host_regulator_disable(msm_host); in msm_dsi_host_power_on()
2384 mutex_unlock(&msm_host->dev_mutex); in msm_dsi_host_power_on()
2390 struct msm_dsi_host *msm_host = to_msm_dsi_host(host); in msm_dsi_host_power_off() local
2391 const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd; in msm_dsi_host_power_off()
2393 mutex_lock(&msm_host->dev_mutex); in msm_dsi_host_power_off()
2394 if (!msm_host->power_on) { in msm_dsi_host_power_off()
2399 dsi_ctrl_config(msm_host, false, NULL); in msm_dsi_host_power_off()
2401 if (msm_host->disp_en_gpio) in msm_dsi_host_power_off()
2402 gpiod_set_value(msm_host->disp_en_gpio, 0); in msm_dsi_host_power_off()
2404 pinctrl_pm_select_sleep_state(&msm_host->pdev->dev); in msm_dsi_host_power_off()
2406 cfg_hnd->ops->link_clk_disable(msm_host); in msm_dsi_host_power_off()
2407 pm_runtime_put_autosuspend(&msm_host->pdev->dev); in msm_dsi_host_power_off()
2409 dsi_host_regulator_disable(msm_host); in msm_dsi_host_power_off()
2411 msm_dsi_sfpb_config(msm_host, false); in msm_dsi_host_power_off()
2415 msm_host->power_on = false; in msm_dsi_host_power_off()
2418 mutex_unlock(&msm_host->dev_mutex); in msm_dsi_host_power_off()
2425 struct msm_dsi_host *msm_host = to_msm_dsi_host(host); in msm_dsi_host_set_display_mode() local
2427 if (msm_host->mode) { in msm_dsi_host_set_display_mode()
2428 drm_mode_destroy(msm_host->dev, msm_host->mode); in msm_dsi_host_set_display_mode()
2429 msm_host->mode = NULL; in msm_dsi_host_set_display_mode()
2432 msm_host->mode = drm_mode_duplicate(msm_host->dev, mode); in msm_dsi_host_set_display_mode()
2433 if (!msm_host->mode) { in msm_dsi_host_set_display_mode()
2444 struct msm_dsi_host *msm_host = to_msm_dsi_host(host); in msm_dsi_host_get_panel() local
2447 panel = of_drm_find_panel(msm_host->device_node); in msm_dsi_host_get_panel()
2449 *panel_flags = msm_host->mode_flags; in msm_dsi_host_get_panel()
2456 struct msm_dsi_host *msm_host = to_msm_dsi_host(host); in msm_dsi_host_get_bridge() local
2458 return of_drm_find_bridge(msm_host->device_node); in msm_dsi_host_get_bridge()