Lines Matching refs:msm_host
194 static inline u32 dsi_read(struct msm_dsi_host *msm_host, u32 reg) in dsi_read() argument
196 return msm_readl(msm_host->ctrl_base + reg); in dsi_read()
198 static inline void dsi_write(struct msm_dsi_host *msm_host, u32 reg, u32 data) in dsi_write() argument
200 msm_writel(data, msm_host->ctrl_base + reg); in dsi_write()
203 static int dsi_host_regulator_enable(struct msm_dsi_host *msm_host);
204 static void dsi_host_regulator_disable(struct msm_dsi_host *msm_host);
207 struct msm_dsi_host *msm_host) in dsi_get_config() argument
210 struct device *dev = &msm_host->pdev->dev; in dsi_get_config()
215 ahb_clk = msm_clk_get(msm_host->pdev, "iface"); in dsi_get_config()
229 ret = dsi_get_version(msm_host->ctrl_base, &major, &minor); in dsi_get_config()
252 static void dsi_host_regulator_disable(struct msm_dsi_host *msm_host) in dsi_host_regulator_disable() argument
254 struct regulator_bulk_data *s = msm_host->supplies; in dsi_host_regulator_disable()
255 const struct dsi_reg_entry *regs = msm_host->cfg_hnd->cfg->reg_cfg.regs; in dsi_host_regulator_disable()
256 int num = msm_host->cfg_hnd->cfg->reg_cfg.num; in dsi_host_regulator_disable()
268 static int dsi_host_regulator_enable(struct msm_dsi_host *msm_host) in dsi_host_regulator_enable() argument
270 struct regulator_bulk_data *s = msm_host->supplies; in dsi_host_regulator_enable()
271 const struct dsi_reg_entry *regs = msm_host->cfg_hnd->cfg->reg_cfg.regs; in dsi_host_regulator_enable()
272 int num = msm_host->cfg_hnd->cfg->reg_cfg.num; in dsi_host_regulator_enable()
302 static int dsi_regulator_init(struct msm_dsi_host *msm_host) in dsi_regulator_init() argument
304 struct regulator_bulk_data *s = msm_host->supplies; in dsi_regulator_init()
305 const struct dsi_reg_entry *regs = msm_host->cfg_hnd->cfg->reg_cfg.regs; in dsi_regulator_init()
306 int num = msm_host->cfg_hnd->cfg->reg_cfg.num; in dsi_regulator_init()
312 ret = devm_regulator_bulk_get(&msm_host->pdev->dev, num, s); in dsi_regulator_init()
322 int dsi_clk_init_v2(struct msm_dsi_host *msm_host) in dsi_clk_init_v2() argument
324 struct platform_device *pdev = msm_host->pdev; in dsi_clk_init_v2()
327 msm_host->src_clk = msm_clk_get(pdev, "src"); in dsi_clk_init_v2()
329 if (IS_ERR(msm_host->src_clk)) { in dsi_clk_init_v2()
330 ret = PTR_ERR(msm_host->src_clk); in dsi_clk_init_v2()
333 msm_host->src_clk = NULL; in dsi_clk_init_v2()
337 msm_host->esc_clk_src = clk_get_parent(msm_host->esc_clk); in dsi_clk_init_v2()
338 if (!msm_host->esc_clk_src) { in dsi_clk_init_v2()
345 msm_host->dsi_clk_src = clk_get_parent(msm_host->src_clk); in dsi_clk_init_v2()
346 if (!msm_host->dsi_clk_src) { in dsi_clk_init_v2()
355 int dsi_clk_init_6g_v2(struct msm_dsi_host *msm_host) in dsi_clk_init_6g_v2() argument
357 struct platform_device *pdev = msm_host->pdev; in dsi_clk_init_6g_v2()
360 msm_host->byte_intf_clk = msm_clk_get(pdev, "byte_intf"); in dsi_clk_init_6g_v2()
361 if (IS_ERR(msm_host->byte_intf_clk)) { in dsi_clk_init_6g_v2()
362 ret = PTR_ERR(msm_host->byte_intf_clk); in dsi_clk_init_6g_v2()
370 static int dsi_clk_init(struct msm_dsi_host *msm_host) in dsi_clk_init() argument
372 struct platform_device *pdev = msm_host->pdev; in dsi_clk_init()
373 const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd; in dsi_clk_init()
379 msm_host->bus_clks[i].id = cfg->bus_clk_names[i]; in dsi_clk_init()
380 msm_host->num_bus_clks = cfg->num_bus_clks; in dsi_clk_init()
382 ret = devm_clk_bulk_get(&pdev->dev, msm_host->num_bus_clks, msm_host->bus_clks); in dsi_clk_init()
389 msm_host->byte_clk = msm_clk_get(pdev, "byte"); in dsi_clk_init()
390 if (IS_ERR(msm_host->byte_clk)) { in dsi_clk_init()
391 ret = PTR_ERR(msm_host->byte_clk); in dsi_clk_init()
394 msm_host->byte_clk = NULL; in dsi_clk_init()
398 msm_host->pixel_clk = msm_clk_get(pdev, "pixel"); in dsi_clk_init()
399 if (IS_ERR(msm_host->pixel_clk)) { in dsi_clk_init()
400 ret = PTR_ERR(msm_host->pixel_clk); in dsi_clk_init()
403 msm_host->pixel_clk = NULL; in dsi_clk_init()
407 msm_host->esc_clk = msm_clk_get(pdev, "core"); in dsi_clk_init()
408 if (IS_ERR(msm_host->esc_clk)) { in dsi_clk_init()
409 ret = PTR_ERR(msm_host->esc_clk); in dsi_clk_init()
412 msm_host->esc_clk = NULL; in dsi_clk_init()
416 msm_host->byte_clk_src = clk_get_parent(msm_host->byte_clk); in dsi_clk_init()
417 if (IS_ERR(msm_host->byte_clk_src)) { in dsi_clk_init()
418 ret = PTR_ERR(msm_host->byte_clk_src); in dsi_clk_init()
423 msm_host->pixel_clk_src = clk_get_parent(msm_host->pixel_clk); in dsi_clk_init()
424 if (IS_ERR(msm_host->pixel_clk_src)) { in dsi_clk_init()
425 ret = PTR_ERR(msm_host->pixel_clk_src); in dsi_clk_init()
431 ret = cfg_hnd->ops->clk_init_ver(msm_host); in dsi_clk_init()
441 struct msm_dsi_host *msm_host = to_msm_dsi_host(host); in msm_dsi_runtime_suspend() local
443 if (!msm_host->cfg_hnd) in msm_dsi_runtime_suspend()
446 clk_bulk_disable_unprepare(msm_host->num_bus_clks, msm_host->bus_clks); in msm_dsi_runtime_suspend()
456 struct msm_dsi_host *msm_host = to_msm_dsi_host(host); in msm_dsi_runtime_resume() local
458 if (!msm_host->cfg_hnd) in msm_dsi_runtime_resume()
461 return clk_bulk_prepare_enable(msm_host->num_bus_clks, msm_host->bus_clks); in msm_dsi_runtime_resume()
464 int dsi_link_clk_set_rate_6g(struct msm_dsi_host *msm_host) in dsi_link_clk_set_rate_6g() argument
470 msm_host->mode->clock, msm_host->byte_clk_rate); in dsi_link_clk_set_rate_6g()
472 ret = dev_pm_opp_set_rate(&msm_host->pdev->dev, in dsi_link_clk_set_rate_6g()
473 msm_host->byte_clk_rate); in dsi_link_clk_set_rate_6g()
479 ret = clk_set_rate(msm_host->pixel_clk, msm_host->pixel_clk_rate); in dsi_link_clk_set_rate_6g()
485 if (msm_host->byte_intf_clk) { in dsi_link_clk_set_rate_6g()
487 if (msm_host->cphy_mode) in dsi_link_clk_set_rate_6g()
488 byte_intf_rate = msm_host->byte_clk_rate; in dsi_link_clk_set_rate_6g()
490 byte_intf_rate = msm_host->byte_clk_rate / 2; in dsi_link_clk_set_rate_6g()
492 ret = clk_set_rate(msm_host->byte_intf_clk, byte_intf_rate); in dsi_link_clk_set_rate_6g()
504 int dsi_link_clk_enable_6g(struct msm_dsi_host *msm_host) in dsi_link_clk_enable_6g() argument
508 ret = clk_prepare_enable(msm_host->esc_clk); in dsi_link_clk_enable_6g()
514 ret = clk_prepare_enable(msm_host->byte_clk); in dsi_link_clk_enable_6g()
520 ret = clk_prepare_enable(msm_host->pixel_clk); in dsi_link_clk_enable_6g()
526 ret = clk_prepare_enable(msm_host->byte_intf_clk); in dsi_link_clk_enable_6g()
536 clk_disable_unprepare(msm_host->pixel_clk); in dsi_link_clk_enable_6g()
538 clk_disable_unprepare(msm_host->byte_clk); in dsi_link_clk_enable_6g()
540 clk_disable_unprepare(msm_host->esc_clk); in dsi_link_clk_enable_6g()
545 int dsi_link_clk_set_rate_v2(struct msm_dsi_host *msm_host) in dsi_link_clk_set_rate_v2() argument
550 msm_host->mode->clock, msm_host->byte_clk_rate, in dsi_link_clk_set_rate_v2()
551 msm_host->esc_clk_rate, msm_host->src_clk_rate); in dsi_link_clk_set_rate_v2()
553 ret = clk_set_rate(msm_host->byte_clk, msm_host->byte_clk_rate); in dsi_link_clk_set_rate_v2()
559 ret = clk_set_rate(msm_host->esc_clk, msm_host->esc_clk_rate); in dsi_link_clk_set_rate_v2()
565 ret = clk_set_rate(msm_host->src_clk, msm_host->src_clk_rate); in dsi_link_clk_set_rate_v2()
571 ret = clk_set_rate(msm_host->pixel_clk, msm_host->pixel_clk_rate); in dsi_link_clk_set_rate_v2()
580 int dsi_link_clk_enable_v2(struct msm_dsi_host *msm_host) in dsi_link_clk_enable_v2() argument
584 ret = clk_prepare_enable(msm_host->byte_clk); in dsi_link_clk_enable_v2()
590 ret = clk_prepare_enable(msm_host->esc_clk); in dsi_link_clk_enable_v2()
596 ret = clk_prepare_enable(msm_host->src_clk); in dsi_link_clk_enable_v2()
602 ret = clk_prepare_enable(msm_host->pixel_clk); in dsi_link_clk_enable_v2()
611 clk_disable_unprepare(msm_host->src_clk); in dsi_link_clk_enable_v2()
613 clk_disable_unprepare(msm_host->esc_clk); in dsi_link_clk_enable_v2()
615 clk_disable_unprepare(msm_host->byte_clk); in dsi_link_clk_enable_v2()
620 void dsi_link_clk_disable_6g(struct msm_dsi_host *msm_host) in dsi_link_clk_disable_6g() argument
623 dev_pm_opp_set_rate(&msm_host->pdev->dev, 0); in dsi_link_clk_disable_6g()
624 clk_disable_unprepare(msm_host->esc_clk); in dsi_link_clk_disable_6g()
625 clk_disable_unprepare(msm_host->pixel_clk); in dsi_link_clk_disable_6g()
626 clk_disable_unprepare(msm_host->byte_intf_clk); in dsi_link_clk_disable_6g()
627 clk_disable_unprepare(msm_host->byte_clk); in dsi_link_clk_disable_6g()
630 void dsi_link_clk_disable_v2(struct msm_dsi_host *msm_host) in dsi_link_clk_disable_v2() argument
632 clk_disable_unprepare(msm_host->pixel_clk); in dsi_link_clk_disable_v2()
633 clk_disable_unprepare(msm_host->src_clk); in dsi_link_clk_disable_v2()
634 clk_disable_unprepare(msm_host->esc_clk); in dsi_link_clk_disable_v2()
635 clk_disable_unprepare(msm_host->byte_clk); in dsi_link_clk_disable_v2()
638 static unsigned long dsi_get_pclk_rate(struct msm_dsi_host *msm_host, bool is_bonded_dsi) in dsi_get_pclk_rate() argument
640 struct drm_display_mode *mode = msm_host->mode; in dsi_get_pclk_rate()
657 static void dsi_calc_pclk(struct msm_dsi_host *msm_host, bool is_bonded_dsi) in dsi_calc_pclk() argument
659 u8 lanes = msm_host->lanes; in dsi_calc_pclk()
660 u32 bpp = dsi_get_bpp(msm_host->format); in dsi_calc_pclk()
661 unsigned long pclk_rate = dsi_get_pclk_rate(msm_host, is_bonded_dsi); in dsi_calc_pclk()
670 if (msm_host->cphy_mode) in dsi_calc_pclk()
675 msm_host->pixel_clk_rate = pclk_rate; in dsi_calc_pclk()
676 msm_host->byte_clk_rate = pclk_bpp; in dsi_calc_pclk()
678 DBG("pclk=%lu, bclk=%lu", msm_host->pixel_clk_rate, in dsi_calc_pclk()
679 msm_host->byte_clk_rate); in dsi_calc_pclk()
683 int dsi_calc_clk_rate_6g(struct msm_dsi_host *msm_host, bool is_bonded_dsi) in dsi_calc_clk_rate_6g() argument
685 if (!msm_host->mode) { in dsi_calc_clk_rate_6g()
690 dsi_calc_pclk(msm_host, is_bonded_dsi); in dsi_calc_clk_rate_6g()
691 msm_host->esc_clk_rate = clk_get_rate(msm_host->esc_clk); in dsi_calc_clk_rate_6g()
695 int dsi_calc_clk_rate_v2(struct msm_dsi_host *msm_host, bool is_bonded_dsi) in dsi_calc_clk_rate_v2() argument
697 u32 bpp = dsi_get_bpp(msm_host->format); in dsi_calc_clk_rate_v2()
702 dsi_calc_pclk(msm_host, is_bonded_dsi); in dsi_calc_clk_rate_v2()
704 pclk_bpp = (u64)dsi_get_pclk_rate(msm_host, is_bonded_dsi) * bpp; in dsi_calc_clk_rate_v2()
706 msm_host->src_clk_rate = pclk_bpp; in dsi_calc_clk_rate_v2()
717 byte_mhz = msm_host->byte_clk_rate / 1000000; in dsi_calc_clk_rate_v2()
735 msm_host->esc_clk_rate = msm_host->byte_clk_rate / esc_div; in dsi_calc_clk_rate_v2()
737 DBG("esc=%lu, src=%lu", msm_host->esc_clk_rate, in dsi_calc_clk_rate_v2()
738 msm_host->src_clk_rate); in dsi_calc_clk_rate_v2()
743 static void dsi_intr_ctrl(struct msm_dsi_host *msm_host, u32 mask, int enable) in dsi_intr_ctrl() argument
748 spin_lock_irqsave(&msm_host->intr_lock, flags); in dsi_intr_ctrl()
749 intr = dsi_read(msm_host, REG_DSI_INTR_CTRL); in dsi_intr_ctrl()
758 dsi_write(msm_host, REG_DSI_INTR_CTRL, intr); in dsi_intr_ctrl()
759 spin_unlock_irqrestore(&msm_host->intr_lock, flags); in dsi_intr_ctrl()
796 static void dsi_ctrl_config(struct msm_dsi_host *msm_host, bool enable, in dsi_ctrl_config() argument
799 u32 flags = msm_host->mode_flags; in dsi_ctrl_config()
800 enum mipi_dsi_pixel_format mipi_fmt = msm_host->format; in dsi_ctrl_config()
801 const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd; in dsi_ctrl_config()
805 dsi_write(msm_host, REG_DSI_CTRL, 0); in dsi_ctrl_config()
825 data |= DSI_VID_CFG0_VIRT_CHANNEL(msm_host->channel); in dsi_ctrl_config()
826 dsi_write(msm_host, REG_DSI_VID_CFG0, data); in dsi_ctrl_config()
830 dsi_write(msm_host, REG_DSI_VID_CFG1, 0); in dsi_ctrl_config()
835 dsi_write(msm_host, REG_DSI_CMD_CFG0, data); in dsi_ctrl_config()
842 dsi_write(msm_host, REG_DSI_CMD_CFG1, data); in dsi_ctrl_config()
845 dsi_write(msm_host, REG_DSI_CMD_DMA_CTRL, in dsi_ctrl_config()
854 data |= DSI_TRIG_CTRL_STREAM(msm_host->channel); in dsi_ctrl_config()
858 dsi_write(msm_host, REG_DSI_TRIG_CTRL, data); in dsi_ctrl_config()
862 dsi_write(msm_host, REG_DSI_CLKOUT_TIMING_CTRL, data); in dsi_ctrl_config()
867 dsi_write(msm_host, REG_DSI_T_CLK_PRE_EXTEND, in dsi_ctrl_config()
873 dsi_write(msm_host, REG_DSI_EOT_PACKET_CTRL, data); in dsi_ctrl_config()
876 dsi_write(msm_host, REG_DSI_ERR_INT_MASK0, 0x13ff3fe0); in dsi_ctrl_config()
878 dsi_intr_ctrl(msm_host, DSI_IRQ_MASK_ERROR, 1); in dsi_ctrl_config()
880 dsi_write(msm_host, REG_DSI_CLK_CTRL, DSI_CLK_CTRL_ENABLE_CLKS); in dsi_ctrl_config()
884 DBG("lane number=%d", msm_host->lanes); in dsi_ctrl_config()
885 data |= ((DSI_CTRL_LANE0 << msm_host->lanes) - DSI_CTRL_LANE0); in dsi_ctrl_config()
887 dsi_write(msm_host, REG_DSI_LANE_SWAP_CTRL, in dsi_ctrl_config()
888 DSI_LANE_SWAP_CTRL_DLN_SWAP_SEL(msm_host->dlane_swap)); in dsi_ctrl_config()
891 lane_ctrl = dsi_read(msm_host, REG_DSI_LANE_CTRL); in dsi_ctrl_config()
896 dsi_write(msm_host, REG_DSI_LANE_CTRL, in dsi_ctrl_config()
902 dsi_write(msm_host, REG_DSI_CTRL, data); in dsi_ctrl_config()
904 if (msm_host->cphy_mode) in dsi_ctrl_config()
905 dsi_write(msm_host, REG_DSI_CPHY_MODE_CTRL, BIT(0)); in dsi_ctrl_config()
908 static void dsi_timing_setup(struct msm_dsi_host *msm_host, bool is_bonded_dsi) in dsi_timing_setup() argument
910 struct drm_display_mode *mode = msm_host->mode; in dsi_timing_setup()
940 if (msm_host->mode_flags & MIPI_DSI_MODE_VIDEO) { in dsi_timing_setup()
941 dsi_write(msm_host, REG_DSI_ACTIVE_H, in dsi_timing_setup()
944 dsi_write(msm_host, REG_DSI_ACTIVE_V, in dsi_timing_setup()
947 dsi_write(msm_host, REG_DSI_TOTAL, in dsi_timing_setup()
951 dsi_write(msm_host, REG_DSI_ACTIVE_HSYNC, in dsi_timing_setup()
954 dsi_write(msm_host, REG_DSI_ACTIVE_VSYNC_HPOS, 0); in dsi_timing_setup()
955 dsi_write(msm_host, REG_DSI_ACTIVE_VSYNC_VPOS, in dsi_timing_setup()
960 wc = hdisplay * dsi_get_bpp(msm_host->format) / 8 + 1; in dsi_timing_setup()
962 dsi_write(msm_host, REG_DSI_CMD_MDP_STREAM0_CTRL, in dsi_timing_setup()
965 msm_host->channel) | in dsi_timing_setup()
969 dsi_write(msm_host, REG_DSI_CMD_MDP_STREAM0_TOTAL, in dsi_timing_setup()
975 static void dsi_sw_reset(struct msm_dsi_host *msm_host) in dsi_sw_reset() argument
977 dsi_write(msm_host, REG_DSI_CLK_CTRL, DSI_CLK_CTRL_ENABLE_CLKS); in dsi_sw_reset()
980 dsi_write(msm_host, REG_DSI_RESET, 1); in dsi_sw_reset()
982 dsi_write(msm_host, REG_DSI_RESET, 0); in dsi_sw_reset()
985 static void dsi_op_mode_config(struct msm_dsi_host *msm_host, in dsi_op_mode_config() argument
990 dsi_ctrl = dsi_read(msm_host, REG_DSI_CTRL); in dsi_op_mode_config()
995 dsi_intr_ctrl(msm_host, DSI_IRQ_MASK_CMD_MDP_DONE | in dsi_op_mode_config()
1002 dsi_intr_ctrl(msm_host, DSI_IRQ_MASK_CMD_MDP_DONE, 1); in dsi_op_mode_config()
1007 dsi_write(msm_host, REG_DSI_CTRL, dsi_ctrl); in dsi_op_mode_config()
1010 static void dsi_set_tx_power_mode(int mode, struct msm_dsi_host *msm_host) in dsi_set_tx_power_mode() argument
1014 data = dsi_read(msm_host, REG_DSI_CMD_DMA_CTRL); in dsi_set_tx_power_mode()
1021 dsi_write(msm_host, REG_DSI_CMD_DMA_CTRL, data); in dsi_set_tx_power_mode()
1024 static void dsi_wait4video_done(struct msm_dsi_host *msm_host) in dsi_wait4video_done() argument
1027 struct device *dev = &msm_host->pdev->dev; in dsi_wait4video_done()
1029 dsi_intr_ctrl(msm_host, DSI_IRQ_MASK_VIDEO_DONE, 1); in dsi_wait4video_done()
1031 reinit_completion(&msm_host->video_comp); in dsi_wait4video_done()
1033 ret = wait_for_completion_timeout(&msm_host->video_comp, in dsi_wait4video_done()
1039 dsi_intr_ctrl(msm_host, DSI_IRQ_MASK_VIDEO_DONE, 0); in dsi_wait4video_done()
1042 static void dsi_wait4video_eng_busy(struct msm_dsi_host *msm_host) in dsi_wait4video_eng_busy() argument
1044 if (!(msm_host->mode_flags & MIPI_DSI_MODE_VIDEO)) in dsi_wait4video_eng_busy()
1047 if (msm_host->power_on && msm_host->enabled) { in dsi_wait4video_eng_busy()
1048 dsi_wait4video_done(msm_host); in dsi_wait4video_eng_busy()
1054 int dsi_tx_buf_alloc_6g(struct msm_dsi_host *msm_host, int size) in dsi_tx_buf_alloc_6g() argument
1056 struct drm_device *dev = msm_host->dev; in dsi_tx_buf_alloc_6g()
1063 &msm_host->tx_gem_obj, &iova); in dsi_tx_buf_alloc_6g()
1066 msm_host->tx_gem_obj = NULL; in dsi_tx_buf_alloc_6g()
1070 msm_gem_object_set_name(msm_host->tx_gem_obj, "tx_gem"); in dsi_tx_buf_alloc_6g()
1072 msm_host->tx_size = msm_host->tx_gem_obj->size; in dsi_tx_buf_alloc_6g()
1077 int dsi_tx_buf_alloc_v2(struct msm_dsi_host *msm_host, int size) in dsi_tx_buf_alloc_v2() argument
1079 struct drm_device *dev = msm_host->dev; in dsi_tx_buf_alloc_v2()
1081 msm_host->tx_buf = dma_alloc_coherent(dev->dev, size, in dsi_tx_buf_alloc_v2()
1082 &msm_host->tx_buf_paddr, GFP_KERNEL); in dsi_tx_buf_alloc_v2()
1083 if (!msm_host->tx_buf) in dsi_tx_buf_alloc_v2()
1086 msm_host->tx_size = size; in dsi_tx_buf_alloc_v2()
1091 static void dsi_tx_buf_free(struct msm_dsi_host *msm_host) in dsi_tx_buf_free() argument
1093 struct drm_device *dev = msm_host->dev; in dsi_tx_buf_free()
1106 if (msm_host->tx_gem_obj) { in dsi_tx_buf_free()
1107 msm_gem_unpin_iova(msm_host->tx_gem_obj, priv->kms->aspace); in dsi_tx_buf_free()
1108 drm_gem_object_put(msm_host->tx_gem_obj); in dsi_tx_buf_free()
1109 msm_host->tx_gem_obj = NULL; in dsi_tx_buf_free()
1112 if (msm_host->tx_buf) in dsi_tx_buf_free()
1113 dma_free_coherent(dev->dev, msm_host->tx_size, msm_host->tx_buf, in dsi_tx_buf_free()
1114 msm_host->tx_buf_paddr); in dsi_tx_buf_free()
1117 void *dsi_tx_buf_get_6g(struct msm_dsi_host *msm_host) in dsi_tx_buf_get_6g() argument
1119 return msm_gem_get_vaddr(msm_host->tx_gem_obj); in dsi_tx_buf_get_6g()
1122 void *dsi_tx_buf_get_v2(struct msm_dsi_host *msm_host) in dsi_tx_buf_get_v2() argument
1124 return msm_host->tx_buf; in dsi_tx_buf_get_v2()
1127 void dsi_tx_buf_put_6g(struct msm_dsi_host *msm_host) in dsi_tx_buf_put_6g() argument
1129 msm_gem_put_vaddr(msm_host->tx_gem_obj); in dsi_tx_buf_put_6g()
1135 static int dsi_cmd_dma_add(struct msm_dsi_host *msm_host, in dsi_cmd_dma_add() argument
1138 const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd; in dsi_cmd_dma_add()
1151 if (len > msm_host->tx_size) { in dsi_cmd_dma_add()
1156 data = cfg_hnd->ops->tx_buf_get(msm_host); in dsi_cmd_dma_add()
1182 cfg_hnd->ops->tx_buf_put(msm_host); in dsi_cmd_dma_add()
1229 int dsi_dma_base_get_6g(struct msm_dsi_host *msm_host, uint64_t *dma_base) in dsi_dma_base_get_6g() argument
1231 struct drm_device *dev = msm_host->dev; in dsi_dma_base_get_6g()
1237 return msm_gem_get_and_pin_iova(msm_host->tx_gem_obj, in dsi_dma_base_get_6g()
1241 int dsi_dma_base_get_v2(struct msm_dsi_host *msm_host, uint64_t *dma_base) in dsi_dma_base_get_v2() argument
1246 *dma_base = msm_host->tx_buf_paddr; in dsi_dma_base_get_v2()
1250 static int dsi_cmd_dma_tx(struct msm_dsi_host *msm_host, int len) in dsi_cmd_dma_tx() argument
1252 const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd; in dsi_cmd_dma_tx()
1257 ret = cfg_hnd->ops->dma_base_get(msm_host, &dma_base); in dsi_cmd_dma_tx()
1263 reinit_completion(&msm_host->dma_comp); in dsi_cmd_dma_tx()
1265 dsi_wait4video_eng_busy(msm_host); in dsi_cmd_dma_tx()
1268 msm_host->id, dma_base, len); in dsi_cmd_dma_tx()
1270 ret = wait_for_completion_timeout(&msm_host->dma_comp, in dsi_cmd_dma_tx()
1283 static int dsi_cmd_dma_rx(struct msm_dsi_host *msm_host, in dsi_cmd_dma_rx() argument
1291 int buf_offset = buf - msm_host->rx_buf; in dsi_cmd_dma_rx()
1321 data = dsi_read(msm_host, REG_DSI_RDBK_DATA(i)); in dsi_cmd_dma_rx()
1332 static int dsi_cmds2buf_tx(struct msm_dsi_host *msm_host, in dsi_cmds2buf_tx() argument
1336 int bllp_len = msm_host->mode->hdisplay * in dsi_cmds2buf_tx()
1337 dsi_get_bpp(msm_host->format) / 8; in dsi_cmds2buf_tx()
1339 len = dsi_cmd_dma_add(msm_host, msg); in dsi_cmds2buf_tx()
1355 if ((msm_host->mode_flags & MIPI_DSI_MODE_VIDEO) && (len > bllp_len)) { in dsi_cmds2buf_tx()
1361 ret = dsi_cmd_dma_tx(msm_host, len); in dsi_cmds2buf_tx()
1371 static void dsi_sw_reset_restore(struct msm_dsi_host *msm_host) in dsi_sw_reset_restore() argument
1375 data0 = dsi_read(msm_host, REG_DSI_CTRL); in dsi_sw_reset_restore()
1378 dsi_write(msm_host, REG_DSI_CTRL, data1); in dsi_sw_reset_restore()
1385 dsi_write(msm_host, REG_DSI_CLK_CTRL, DSI_CLK_CTRL_ENABLE_CLKS); in dsi_sw_reset_restore()
1389 dsi_write(msm_host, REG_DSI_RESET, 1); in dsi_sw_reset_restore()
1391 dsi_write(msm_host, REG_DSI_RESET, 0); in dsi_sw_reset_restore()
1393 dsi_write(msm_host, REG_DSI_CTRL, data0); in dsi_sw_reset_restore()
1399 struct msm_dsi_host *msm_host = in dsi_hpd_worker() local
1402 drm_helper_hpd_irq_event(msm_host->dev); in dsi_hpd_worker()
1407 struct msm_dsi_host *msm_host = in dsi_err_worker() local
1409 u32 status = msm_host->err_work_state; in dsi_err_worker()
1413 dsi_sw_reset_restore(msm_host); in dsi_err_worker()
1416 msm_host->err_work_state = 0; in dsi_err_worker()
1419 dsi_intr_ctrl(msm_host, DSI_IRQ_MASK_ERROR, 1); in dsi_err_worker()
1422 static void dsi_ack_err_status(struct msm_dsi_host *msm_host) in dsi_ack_err_status() argument
1426 status = dsi_read(msm_host, REG_DSI_ACK_ERR_STATUS); in dsi_ack_err_status()
1429 dsi_write(msm_host, REG_DSI_ACK_ERR_STATUS, status); in dsi_ack_err_status()
1431 dsi_write(msm_host, REG_DSI_ACK_ERR_STATUS, 0); in dsi_ack_err_status()
1432 msm_host->err_work_state |= DSI_ERR_STATE_ACK; in dsi_ack_err_status()
1436 static void dsi_timeout_status(struct msm_dsi_host *msm_host) in dsi_timeout_status() argument
1440 status = dsi_read(msm_host, REG_DSI_TIMEOUT_STATUS); in dsi_timeout_status()
1443 dsi_write(msm_host, REG_DSI_TIMEOUT_STATUS, status); in dsi_timeout_status()
1444 msm_host->err_work_state |= DSI_ERR_STATE_TIMEOUT; in dsi_timeout_status()
1448 static void dsi_dln0_phy_err(struct msm_dsi_host *msm_host) in dsi_dln0_phy_err() argument
1452 status = dsi_read(msm_host, REG_DSI_DLN0_PHY_ERR); in dsi_dln0_phy_err()
1459 dsi_write(msm_host, REG_DSI_DLN0_PHY_ERR, status); in dsi_dln0_phy_err()
1460 msm_host->err_work_state |= DSI_ERR_STATE_DLN0_PHY; in dsi_dln0_phy_err()
1464 static void dsi_fifo_status(struct msm_dsi_host *msm_host) in dsi_fifo_status() argument
1468 status = dsi_read(msm_host, REG_DSI_FIFO_STATUS); in dsi_fifo_status()
1472 dsi_write(msm_host, REG_DSI_FIFO_STATUS, status); in dsi_fifo_status()
1473 msm_host->err_work_state |= DSI_ERR_STATE_FIFO; in dsi_fifo_status()
1475 msm_host->err_work_state |= in dsi_fifo_status()
1480 static void dsi_status(struct msm_dsi_host *msm_host) in dsi_status() argument
1484 status = dsi_read(msm_host, REG_DSI_STATUS0); in dsi_status()
1487 dsi_write(msm_host, REG_DSI_STATUS0, status); in dsi_status()
1488 msm_host->err_work_state |= in dsi_status()
1493 static void dsi_clk_status(struct msm_dsi_host *msm_host) in dsi_clk_status() argument
1497 status = dsi_read(msm_host, REG_DSI_CLK_STATUS); in dsi_clk_status()
1500 dsi_write(msm_host, REG_DSI_CLK_STATUS, status); in dsi_clk_status()
1501 msm_host->err_work_state |= DSI_ERR_STATE_PLL_UNLOCKED; in dsi_clk_status()
1505 static void dsi_error(struct msm_dsi_host *msm_host) in dsi_error() argument
1508 dsi_intr_ctrl(msm_host, DSI_IRQ_MASK_ERROR, 0); in dsi_error()
1510 dsi_clk_status(msm_host); in dsi_error()
1511 dsi_fifo_status(msm_host); in dsi_error()
1512 dsi_ack_err_status(msm_host); in dsi_error()
1513 dsi_timeout_status(msm_host); in dsi_error()
1514 dsi_status(msm_host); in dsi_error()
1515 dsi_dln0_phy_err(msm_host); in dsi_error()
1517 queue_work(msm_host->workqueue, &msm_host->err_work); in dsi_error()
1522 struct msm_dsi_host *msm_host = ptr; in dsi_host_irq() local
1526 if (!msm_host->ctrl_base) in dsi_host_irq()
1529 spin_lock_irqsave(&msm_host->intr_lock, flags); in dsi_host_irq()
1530 isr = dsi_read(msm_host, REG_DSI_INTR_CTRL); in dsi_host_irq()
1531 dsi_write(msm_host, REG_DSI_INTR_CTRL, isr); in dsi_host_irq()
1532 spin_unlock_irqrestore(&msm_host->intr_lock, flags); in dsi_host_irq()
1534 DBG("isr=0x%x, id=%d", isr, msm_host->id); in dsi_host_irq()
1537 dsi_error(msm_host); in dsi_host_irq()
1540 complete(&msm_host->video_comp); in dsi_host_irq()
1543 complete(&msm_host->dma_comp); in dsi_host_irq()
1548 static int dsi_host_init_panel_gpios(struct msm_dsi_host *msm_host, in dsi_host_init_panel_gpios() argument
1551 msm_host->disp_en_gpio = devm_gpiod_get_optional(panel_device, in dsi_host_init_panel_gpios()
1554 if (IS_ERR(msm_host->disp_en_gpio)) { in dsi_host_init_panel_gpios()
1556 PTR_ERR(msm_host->disp_en_gpio)); in dsi_host_init_panel_gpios()
1557 return PTR_ERR(msm_host->disp_en_gpio); in dsi_host_init_panel_gpios()
1560 msm_host->te_gpio = devm_gpiod_get_optional(panel_device, "disp-te", in dsi_host_init_panel_gpios()
1562 if (IS_ERR(msm_host->te_gpio)) { in dsi_host_init_panel_gpios()
1563 DBG("cannot get disp-te-gpios %ld", PTR_ERR(msm_host->te_gpio)); in dsi_host_init_panel_gpios()
1564 return PTR_ERR(msm_host->te_gpio); in dsi_host_init_panel_gpios()
1573 struct msm_dsi_host *msm_host = to_msm_dsi_host(host); in dsi_host_attach() local
1576 if (dsi->lanes > msm_host->num_data_lanes) in dsi_host_attach()
1579 msm_host->channel = dsi->channel; in dsi_host_attach()
1580 msm_host->lanes = dsi->lanes; in dsi_host_attach()
1581 msm_host->format = dsi->format; in dsi_host_attach()
1582 msm_host->mode_flags = dsi->mode_flags; in dsi_host_attach()
1585 ret = dsi_host_init_panel_gpios(msm_host, &dsi->dev); in dsi_host_attach()
1589 DBG("id=%d", msm_host->id); in dsi_host_attach()
1590 if (msm_host->dev) in dsi_host_attach()
1591 queue_work(msm_host->workqueue, &msm_host->hpd_work); in dsi_host_attach()
1599 struct msm_dsi_host *msm_host = to_msm_dsi_host(host); in dsi_host_detach() local
1601 msm_host->device_node = NULL; in dsi_host_detach()
1603 DBG("id=%d", msm_host->id); in dsi_host_detach()
1604 if (msm_host->dev) in dsi_host_detach()
1605 queue_work(msm_host->workqueue, &msm_host->hpd_work); in dsi_host_detach()
1613 struct msm_dsi_host *msm_host = to_msm_dsi_host(host); in dsi_host_transfer() local
1616 if (!msg || !msm_host->power_on) in dsi_host_transfer()
1619 mutex_lock(&msm_host->cmd_mutex); in dsi_host_transfer()
1620 ret = msm_dsi_manager_cmd_xfer(msm_host->id, msg); in dsi_host_transfer()
1621 mutex_unlock(&msm_host->cmd_mutex); in dsi_host_transfer()
1649 static int dsi_host_parse_lane_data(struct msm_dsi_host *msm_host, in dsi_host_parse_lane_data() argument
1652 struct device *dev = &msm_host->pdev->dev; in dsi_host_parse_lane_data()
1662 msm_host->num_data_lanes = 4; in dsi_host_parse_lane_data()
1673 msm_host->num_data_lanes = num_lanes; in dsi_host_parse_lane_data()
1707 msm_host->dlane_swap = i; in dsi_host_parse_lane_data()
1715 static int dsi_host_parse_dt(struct msm_dsi_host *msm_host) in dsi_host_parse_dt() argument
1717 struct device *dev = &msm_host->pdev->dev; in dsi_host_parse_dt()
1734 ret = dsi_host_parse_lane_data(msm_host, endpoint); in dsi_host_parse_dt()
1750 msm_host->device_node = device_node; in dsi_host_parse_dt()
1753 msm_host->sfpb = syscon_regmap_lookup_by_phandle(np, in dsi_host_parse_dt()
1755 if (IS_ERR(msm_host->sfpb)) { in dsi_host_parse_dt()
1758 ret = PTR_ERR(msm_host->sfpb); in dsi_host_parse_dt()
1770 static int dsi_host_get_id(struct msm_dsi_host *msm_host) in dsi_host_get_id() argument
1772 struct platform_device *pdev = msm_host->pdev; in dsi_host_get_id()
1773 const struct msm_dsi_config *cfg = msm_host->cfg_hnd->cfg; in dsi_host_get_id()
1791 struct msm_dsi_host *msm_host = NULL; in msm_dsi_host_init() local
1795 msm_host = devm_kzalloc(&pdev->dev, sizeof(*msm_host), GFP_KERNEL); in msm_dsi_host_init()
1796 if (!msm_host) { in msm_dsi_host_init()
1801 msm_host->pdev = pdev; in msm_dsi_host_init()
1802 msm_dsi->host = &msm_host->base; in msm_dsi_host_init()
1804 ret = dsi_host_parse_dt(msm_host); in msm_dsi_host_init()
1810 msm_host->ctrl_base = msm_ioremap_size(pdev, "dsi_ctrl", "DSI CTRL", &msm_host->ctrl_size); in msm_dsi_host_init()
1811 if (IS_ERR(msm_host->ctrl_base)) { in msm_dsi_host_init()
1813 ret = PTR_ERR(msm_host->ctrl_base); in msm_dsi_host_init()
1819 msm_host->cfg_hnd = dsi_get_config(msm_host); in msm_dsi_host_init()
1820 if (!msm_host->cfg_hnd) { in msm_dsi_host_init()
1826 msm_host->id = dsi_host_get_id(msm_host); in msm_dsi_host_init()
1827 if (msm_host->id < 0) { in msm_dsi_host_init()
1828 ret = msm_host->id; in msm_dsi_host_init()
1834 msm_host->ctrl_base += msm_host->cfg_hnd->cfg->io_offset; in msm_dsi_host_init()
1836 ret = dsi_regulator_init(msm_host); in msm_dsi_host_init()
1842 ret = dsi_clk_init(msm_host); in msm_dsi_host_init()
1848 msm_host->rx_buf = devm_kzalloc(&pdev->dev, SZ_4K, GFP_KERNEL); in msm_dsi_host_init()
1849 if (!msm_host->rx_buf) { in msm_dsi_host_init()
1865 msm_host->irq = irq_of_parse_and_map(pdev->dev.of_node, 0); in msm_dsi_host_init()
1866 if (msm_host->irq < 0) { in msm_dsi_host_init()
1867 ret = msm_host->irq; in msm_dsi_host_init()
1873 ret = devm_request_irq(&pdev->dev, msm_host->irq, dsi_host_irq, in msm_dsi_host_init()
1875 "dsi_isr", msm_host); in msm_dsi_host_init()
1878 msm_host->irq, ret); in msm_dsi_host_init()
1882 init_completion(&msm_host->dma_comp); in msm_dsi_host_init()
1883 init_completion(&msm_host->video_comp); in msm_dsi_host_init()
1884 mutex_init(&msm_host->dev_mutex); in msm_dsi_host_init()
1885 mutex_init(&msm_host->cmd_mutex); in msm_dsi_host_init()
1886 spin_lock_init(&msm_host->intr_lock); in msm_dsi_host_init()
1889 msm_host->workqueue = alloc_ordered_workqueue("dsi_drm_work", 0); in msm_dsi_host_init()
1890 INIT_WORK(&msm_host->err_work, dsi_err_worker); in msm_dsi_host_init()
1891 INIT_WORK(&msm_host->hpd_work, dsi_hpd_worker); in msm_dsi_host_init()
1893 msm_dsi->id = msm_host->id; in msm_dsi_host_init()
1895 DBG("Dsi Host %d initialized", msm_host->id); in msm_dsi_host_init()
1904 struct msm_dsi_host *msm_host = to_msm_dsi_host(host); in msm_dsi_host_destroy() local
1907 dsi_tx_buf_free(msm_host); in msm_dsi_host_destroy()
1908 if (msm_host->workqueue) { in msm_dsi_host_destroy()
1909 destroy_workqueue(msm_host->workqueue); in msm_dsi_host_destroy()
1910 msm_host->workqueue = NULL; in msm_dsi_host_destroy()
1913 mutex_destroy(&msm_host->cmd_mutex); in msm_dsi_host_destroy()
1914 mutex_destroy(&msm_host->dev_mutex); in msm_dsi_host_destroy()
1916 pm_runtime_disable(&msm_host->pdev->dev); in msm_dsi_host_destroy()
1922 struct msm_dsi_host *msm_host = to_msm_dsi_host(host); in msm_dsi_host_modeset_init() local
1923 const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd; in msm_dsi_host_modeset_init()
1926 msm_host->dev = dev; in msm_dsi_host_modeset_init()
1927 ret = cfg_hnd->ops->tx_buf_alloc(msm_host, SZ_4K); in msm_dsi_host_modeset_init()
1938 struct msm_dsi_host *msm_host = to_msm_dsi_host(host); in msm_dsi_host_register() local
1942 if (!msm_host->registered) { in msm_dsi_host_register()
1943 host->dev = &msm_host->pdev->dev; in msm_dsi_host_register()
1949 msm_host->registered = true; in msm_dsi_host_register()
1959 if (check_defer && msm_host->device_node) { in msm_dsi_host_register()
1960 if (IS_ERR(of_drm_find_panel(msm_host->device_node))) in msm_dsi_host_register()
1961 if (!of_drm_find_bridge(msm_host->device_node)) in msm_dsi_host_register()
1971 struct msm_dsi_host *msm_host = to_msm_dsi_host(host); in msm_dsi_host_unregister() local
1973 if (msm_host->registered) { in msm_dsi_host_unregister()
1977 msm_host->registered = false; in msm_dsi_host_unregister()
1984 struct msm_dsi_host *msm_host = to_msm_dsi_host(host); in msm_dsi_host_xfer_prepare() local
1985 const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd; in msm_dsi_host_xfer_prepare()
1997 pm_runtime_get_sync(&msm_host->pdev->dev); in msm_dsi_host_xfer_prepare()
1998 cfg_hnd->ops->link_clk_set_rate(msm_host); in msm_dsi_host_xfer_prepare()
1999 cfg_hnd->ops->link_clk_enable(msm_host); in msm_dsi_host_xfer_prepare()
2004 dsi_set_tx_power_mode(0, msm_host); in msm_dsi_host_xfer_prepare()
2006 msm_host->dma_cmd_ctrl_restore = dsi_read(msm_host, REG_DSI_CTRL); in msm_dsi_host_xfer_prepare()
2007 dsi_write(msm_host, REG_DSI_CTRL, in msm_dsi_host_xfer_prepare()
2008 msm_host->dma_cmd_ctrl_restore | in msm_dsi_host_xfer_prepare()
2011 dsi_intr_ctrl(msm_host, DSI_IRQ_MASK_CMD_DMA_DONE, 1); in msm_dsi_host_xfer_prepare()
2019 struct msm_dsi_host *msm_host = to_msm_dsi_host(host); in msm_dsi_host_xfer_restore() local
2020 const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd; in msm_dsi_host_xfer_restore()
2022 dsi_intr_ctrl(msm_host, DSI_IRQ_MASK_CMD_DMA_DONE, 0); in msm_dsi_host_xfer_restore()
2023 dsi_write(msm_host, REG_DSI_CTRL, msm_host->dma_cmd_ctrl_restore); in msm_dsi_host_xfer_restore()
2026 dsi_set_tx_power_mode(1, msm_host); in msm_dsi_host_xfer_restore()
2030 cfg_hnd->ops->link_clk_disable(msm_host); in msm_dsi_host_xfer_restore()
2031 pm_runtime_put_autosuspend(&msm_host->pdev->dev); in msm_dsi_host_xfer_restore()
2037 struct msm_dsi_host *msm_host = to_msm_dsi_host(host); in msm_dsi_host_cmd_tx() local
2039 return dsi_cmds2buf_tx(msm_host, msg); in msm_dsi_host_cmd_tx()
2045 struct msm_dsi_host *msm_host = to_msm_dsi_host(host); in msm_dsi_host_cmd_rx() local
2046 const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd; in msm_dsi_host_cmd_rx()
2067 buf = msm_host->rx_buf; in msm_dsi_host_cmd_rx()
2081 ret = dsi_cmds2buf_tx(msm_host, &max_pkt_size_msg); in msm_dsi_host_cmd_rx()
2091 dsi_write(msm_host, REG_DSI_RDBK_DATA_CTRL, in msm_dsi_host_cmd_rx()
2094 dsi_write(msm_host, REG_DSI_RDBK_DATA_CTRL, 0); in msm_dsi_host_cmd_rx()
2098 ret = dsi_cmds2buf_tx(msm_host, msg); in msm_dsi_host_cmd_rx()
2111 dlen = dsi_cmd_dma_rx(msm_host, buf, rx_byte, pkt_size); in msm_dsi_host_cmd_rx()
2147 buf = msm_host->rx_buf + (10 - rlen); in msm_dsi_host_cmd_rx()
2149 buf = msm_host->rx_buf; in msm_dsi_host_cmd_rx()
2180 struct msm_dsi_host *msm_host = to_msm_dsi_host(host); in msm_dsi_host_cmd_xfer_commit() local
2182 dsi_write(msm_host, REG_DSI_DMA_BASE, dma_base); in msm_dsi_host_cmd_xfer_commit()
2183 dsi_write(msm_host, REG_DSI_DMA_LEN, len); in msm_dsi_host_cmd_xfer_commit()
2184 dsi_write(msm_host, REG_DSI_TRIG_DMA, 1); in msm_dsi_host_cmd_xfer_commit()
2193 struct msm_dsi_host *msm_host = to_msm_dsi_host(host); in msm_dsi_host_set_src_pll() local
2197 msm_host->cphy_mode = src_phy->cphy_mode; in msm_dsi_host_set_src_pll()
2207 ret = clk_set_parent(msm_host->byte_clk_src, byte_clk_provider); in msm_dsi_host_set_src_pll()
2214 ret = clk_set_parent(msm_host->pixel_clk_src, pixel_clk_provider); in msm_dsi_host_set_src_pll()
2221 if (msm_host->dsi_clk_src) { in msm_dsi_host_set_src_pll()
2222 ret = clk_set_parent(msm_host->dsi_clk_src, pixel_clk_provider); in msm_dsi_host_set_src_pll()
2230 if (msm_host->esc_clk_src) { in msm_dsi_host_set_src_pll()
2231 ret = clk_set_parent(msm_host->esc_clk_src, byte_clk_provider); in msm_dsi_host_set_src_pll()
2245 struct msm_dsi_host *msm_host = to_msm_dsi_host(host); in msm_dsi_host_reset_phy() local
2248 dsi_write(msm_host, REG_DSI_PHY_RESET, DSI_PHY_RESET_RESET); in msm_dsi_host_reset_phy()
2252 dsi_write(msm_host, REG_DSI_PHY_RESET, 0); in msm_dsi_host_reset_phy()
2260 struct msm_dsi_host *msm_host = to_msm_dsi_host(host); in msm_dsi_host_get_phy_clk_req() local
2261 const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd; in msm_dsi_host_get_phy_clk_req()
2264 ret = cfg_hnd->ops->calc_clk_rate(msm_host, is_bonded_dsi); in msm_dsi_host_get_phy_clk_req()
2274 if (msm_host->cphy_mode) in msm_dsi_host_get_phy_clk_req()
2275 clk_req->bitclk_rate = msm_host->byte_clk_rate * 7; in msm_dsi_host_get_phy_clk_req()
2277 clk_req->bitclk_rate = msm_host->byte_clk_rate * 8; in msm_dsi_host_get_phy_clk_req()
2278 clk_req->escclk_rate = msm_host->esc_clk_rate; in msm_dsi_host_get_phy_clk_req()
2283 struct msm_dsi_host *msm_host = to_msm_dsi_host(host); in msm_dsi_host_enable_irq() local
2285 enable_irq(msm_host->irq); in msm_dsi_host_enable_irq()
2290 struct msm_dsi_host *msm_host = to_msm_dsi_host(host); in msm_dsi_host_disable_irq() local
2292 disable_irq(msm_host->irq); in msm_dsi_host_disable_irq()
2297 struct msm_dsi_host *msm_host = to_msm_dsi_host(host); in msm_dsi_host_enable() local
2299 dsi_op_mode_config(msm_host, in msm_dsi_host_enable()
2300 !!(msm_host->mode_flags & MIPI_DSI_MODE_VIDEO), true); in msm_dsi_host_enable()
2311 msm_host->enabled = true; in msm_dsi_host_enable()
2317 struct msm_dsi_host *msm_host = to_msm_dsi_host(host); in msm_dsi_host_disable() local
2319 msm_host->enabled = false; in msm_dsi_host_disable()
2320 dsi_op_mode_config(msm_host, in msm_dsi_host_disable()
2321 !!(msm_host->mode_flags & MIPI_DSI_MODE_VIDEO), false); in msm_dsi_host_disable()
2327 dsi_sw_reset(msm_host); in msm_dsi_host_disable()
2332 static void msm_dsi_sfpb_config(struct msm_dsi_host *msm_host, bool enable) in msm_dsi_sfpb_config() argument
2336 if (!msm_host->sfpb) in msm_dsi_sfpb_config()
2341 regmap_update_bits(msm_host->sfpb, REG_SFPB_GPREG, in msm_dsi_sfpb_config()
2350 struct msm_dsi_host *msm_host = to_msm_dsi_host(host); in msm_dsi_host_power_on() local
2351 const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd; in msm_dsi_host_power_on()
2354 mutex_lock(&msm_host->dev_mutex); in msm_dsi_host_power_on()
2355 if (msm_host->power_on) { in msm_dsi_host_power_on()
2360 msm_dsi_sfpb_config(msm_host, true); in msm_dsi_host_power_on()
2362 ret = dsi_host_regulator_enable(msm_host); in msm_dsi_host_power_on()
2369 pm_runtime_get_sync(&msm_host->pdev->dev); in msm_dsi_host_power_on()
2370 ret = cfg_hnd->ops->link_clk_set_rate(msm_host); in msm_dsi_host_power_on()
2372 ret = cfg_hnd->ops->link_clk_enable(msm_host); in msm_dsi_host_power_on()
2379 ret = pinctrl_pm_select_default_state(&msm_host->pdev->dev); in msm_dsi_host_power_on()
2386 dsi_timing_setup(msm_host, is_bonded_dsi); in msm_dsi_host_power_on()
2387 dsi_sw_reset(msm_host); in msm_dsi_host_power_on()
2388 dsi_ctrl_config(msm_host, true, phy_shared_timings, phy); in msm_dsi_host_power_on()
2390 if (msm_host->disp_en_gpio) in msm_dsi_host_power_on()
2391 gpiod_set_value(msm_host->disp_en_gpio, 1); in msm_dsi_host_power_on()
2393 msm_host->power_on = true; in msm_dsi_host_power_on()
2394 mutex_unlock(&msm_host->dev_mutex); in msm_dsi_host_power_on()
2399 cfg_hnd->ops->link_clk_disable(msm_host); in msm_dsi_host_power_on()
2400 pm_runtime_put_autosuspend(&msm_host->pdev->dev); in msm_dsi_host_power_on()
2402 dsi_host_regulator_disable(msm_host); in msm_dsi_host_power_on()
2404 mutex_unlock(&msm_host->dev_mutex); in msm_dsi_host_power_on()
2410 struct msm_dsi_host *msm_host = to_msm_dsi_host(host); in msm_dsi_host_power_off() local
2411 const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd; in msm_dsi_host_power_off()
2413 mutex_lock(&msm_host->dev_mutex); in msm_dsi_host_power_off()
2414 if (!msm_host->power_on) { in msm_dsi_host_power_off()
2419 dsi_ctrl_config(msm_host, false, NULL, NULL); in msm_dsi_host_power_off()
2421 if (msm_host->disp_en_gpio) in msm_dsi_host_power_off()
2422 gpiod_set_value(msm_host->disp_en_gpio, 0); in msm_dsi_host_power_off()
2424 pinctrl_pm_select_sleep_state(&msm_host->pdev->dev); in msm_dsi_host_power_off()
2426 cfg_hnd->ops->link_clk_disable(msm_host); in msm_dsi_host_power_off()
2427 pm_runtime_put_autosuspend(&msm_host->pdev->dev); in msm_dsi_host_power_off()
2429 dsi_host_regulator_disable(msm_host); in msm_dsi_host_power_off()
2431 msm_dsi_sfpb_config(msm_host, false); in msm_dsi_host_power_off()
2435 msm_host->power_on = false; in msm_dsi_host_power_off()
2438 mutex_unlock(&msm_host->dev_mutex); in msm_dsi_host_power_off()
2445 struct msm_dsi_host *msm_host = to_msm_dsi_host(host); in msm_dsi_host_set_display_mode() local
2447 if (msm_host->mode) { in msm_dsi_host_set_display_mode()
2448 drm_mode_destroy(msm_host->dev, msm_host->mode); in msm_dsi_host_set_display_mode()
2449 msm_host->mode = NULL; in msm_dsi_host_set_display_mode()
2452 msm_host->mode = drm_mode_duplicate(msm_host->dev, mode); in msm_dsi_host_set_display_mode()
2453 if (!msm_host->mode) { in msm_dsi_host_set_display_mode()
2473 struct msm_dsi_host *msm_host = to_msm_dsi_host(host); in msm_dsi_host_get_bridge() local
2475 return of_drm_find_bridge(msm_host->device_node); in msm_dsi_host_get_bridge()
2480 struct msm_dsi_host *msm_host = to_msm_dsi_host(host); in msm_dsi_host_snapshot() local
2482 pm_runtime_get_sync(&msm_host->pdev->dev); in msm_dsi_host_snapshot()
2484 msm_disp_snapshot_add_block(disp_state, msm_host->ctrl_size, in msm_dsi_host_snapshot()
2485 msm_host->ctrl_base, "dsi%d_ctrl", msm_host->id); in msm_dsi_host_snapshot()
2487 pm_runtime_put_sync(&msm_host->pdev->dev); in msm_dsi_host_snapshot()
2490 static void msm_dsi_host_video_test_pattern_setup(struct msm_dsi_host *msm_host) in msm_dsi_host_video_test_pattern_setup() argument
2494 reg = dsi_read(msm_host, REG_DSI_TEST_PATTERN_GEN_CTRL); in msm_dsi_host_video_test_pattern_setup()
2496 dsi_write(msm_host, REG_DSI_TEST_PATTERN_GEN_VIDEO_INIT_VAL, 0xff); in msm_dsi_host_video_test_pattern_setup()
2498 dsi_write(msm_host, REG_DSI_TPG_MAIN_CONTROL, in msm_dsi_host_video_test_pattern_setup()
2501 dsi_write(msm_host, REG_DSI_TPG_VIDEO_CONFIG, in msm_dsi_host_video_test_pattern_setup()
2506 dsi_write(msm_host, REG_DSI_TEST_PATTERN_GEN_CTRL, reg); in msm_dsi_host_video_test_pattern_setup()
2511 static void msm_dsi_host_cmd_test_pattern_setup(struct msm_dsi_host *msm_host) in msm_dsi_host_cmd_test_pattern_setup() argument
2515 reg = dsi_read(msm_host, REG_DSI_TEST_PATTERN_GEN_CTRL); in msm_dsi_host_cmd_test_pattern_setup()
2518 dsi_write(msm_host, REG_DSI_TEST_PATTERN_GEN_CMD_MDP_INIT_VAL0, 0xff); in msm_dsi_host_cmd_test_pattern_setup()
2522 dsi_write(msm_host, REG_DSI_TEST_PATTERN_GEN_CTRL, reg); in msm_dsi_host_cmd_test_pattern_setup()
2524 dsi_write(msm_host, REG_DSI_TPG_MAIN_CONTROL2, in msm_dsi_host_cmd_test_pattern_setup()
2532 struct msm_dsi_host *msm_host = to_msm_dsi_host(host); in msm_dsi_host_test_pattern_en() local
2533 bool is_video_mode = !!(msm_host->mode_flags & MIPI_DSI_MODE_VIDEO); in msm_dsi_host_test_pattern_en()
2537 msm_dsi_host_video_test_pattern_setup(msm_host); in msm_dsi_host_test_pattern_en()
2539 msm_dsi_host_cmd_test_pattern_setup(msm_host); in msm_dsi_host_test_pattern_en()
2541 reg = dsi_read(msm_host, REG_DSI_TEST_PATTERN_GEN_CTRL); in msm_dsi_host_test_pattern_en()
2543 dsi_write(msm_host, REG_DSI_TEST_PATTERN_GEN_CTRL, (reg | DSI_TEST_PATTERN_GEN_CTRL_EN)); in msm_dsi_host_test_pattern_en()
2547 dsi_write(msm_host, REG_DSI_TEST_PATTERN_GEN_CMD_STREAM0_TRIGGER, in msm_dsi_host_test_pattern_en()