Lines Matching +full:syscon +full:- +full:sfpb
1 // SPDX-License-Identifier: GPL-2.0-only
8 #include <linux/dma-mapping.h>
12 #include <linux/mfd/syscon.h>
26 #include "sfpb.xml.h"
39 return -EINVAL; in dsi_get_version()
43 * makes all other registers 4-byte shifted down. in dsi_get_version()
47 * 0x1f0). In the case of DSIv2, this hast to be a non-zero value. In in dsi_get_version()
62 return -EINVAL; in dsi_get_version()
78 return -EINVAL; in dsi_get_version()
156 struct regmap *sfpb; member
195 return msm_readl(msm_host->ctrl_base + reg); in dsi_read()
199 msm_writel(data, msm_host->ctrl_base + reg); in dsi_write()
209 struct device *dev = &msm_host->pdev->dev; in dsi_get_config()
214 ahb_clk = msm_clk_get(msm_host->pdev, "iface"); in dsi_get_config()
228 ret = dsi_get_version(msm_host->ctrl_base, &major, &minor); in dsi_get_config()
253 struct regulator_bulk_data *s = msm_host->supplies; in dsi_host_regulator_disable()
254 const struct dsi_reg_entry *regs = msm_host->cfg_hnd->cfg->reg_cfg.regs; in dsi_host_regulator_disable()
255 int num = msm_host->cfg_hnd->cfg->reg_cfg.num; in dsi_host_regulator_disable()
259 for (i = num - 1; i >= 0; i--) in dsi_host_regulator_disable()
269 struct regulator_bulk_data *s = msm_host->supplies; in dsi_host_regulator_enable()
270 const struct dsi_reg_entry *regs = msm_host->cfg_hnd->cfg->reg_cfg.regs; in dsi_host_regulator_enable()
271 int num = msm_host->cfg_hnd->cfg->reg_cfg.num; in dsi_host_regulator_enable()
296 for (i--; i >= 0; i--) in dsi_host_regulator_enable()
303 struct regulator_bulk_data *s = msm_host->supplies; in dsi_regulator_init()
304 const struct dsi_reg_entry *regs = msm_host->cfg_hnd->cfg->reg_cfg.regs; in dsi_regulator_init()
305 int num = msm_host->cfg_hnd->cfg->reg_cfg.num; in dsi_regulator_init()
311 ret = devm_regulator_bulk_get(&msm_host->pdev->dev, num, s); in dsi_regulator_init()
323 struct platform_device *pdev = msm_host->pdev; in dsi_clk_init_v2()
326 msm_host->src_clk = msm_clk_get(pdev, "src"); in dsi_clk_init_v2()
328 if (IS_ERR(msm_host->src_clk)) { in dsi_clk_init_v2()
329 ret = PTR_ERR(msm_host->src_clk); in dsi_clk_init_v2()
332 msm_host->src_clk = NULL; in dsi_clk_init_v2()
336 msm_host->esc_clk_src = clk_get_parent(msm_host->esc_clk); in dsi_clk_init_v2()
337 if (!msm_host->esc_clk_src) { in dsi_clk_init_v2()
338 ret = -ENODEV; in dsi_clk_init_v2()
344 msm_host->dsi_clk_src = clk_get_parent(msm_host->src_clk); in dsi_clk_init_v2()
345 if (!msm_host->dsi_clk_src) { in dsi_clk_init_v2()
346 ret = -ENODEV; in dsi_clk_init_v2()
356 struct platform_device *pdev = msm_host->pdev; in dsi_clk_init_6g_v2()
359 msm_host->byte_intf_clk = msm_clk_get(pdev, "byte_intf"); in dsi_clk_init_6g_v2()
360 if (IS_ERR(msm_host->byte_intf_clk)) { in dsi_clk_init_6g_v2()
361 ret = PTR_ERR(msm_host->byte_intf_clk); in dsi_clk_init_6g_v2()
371 struct platform_device *pdev = msm_host->pdev; in dsi_clk_init()
372 const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd; in dsi_clk_init()
373 const struct msm_dsi_config *cfg = cfg_hnd->cfg; in dsi_clk_init()
377 for (i = 0; i < cfg->num_bus_clks; i++) { in dsi_clk_init()
378 msm_host->bus_clks[i] = msm_clk_get(pdev, in dsi_clk_init()
379 cfg->bus_clk_names[i]); in dsi_clk_init()
380 if (IS_ERR(msm_host->bus_clks[i])) { in dsi_clk_init()
381 ret = PTR_ERR(msm_host->bus_clks[i]); in dsi_clk_init()
383 __func__, cfg->bus_clk_names[i], ret); 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()
430 if (cfg_hnd->ops->clk_init_ver) in dsi_clk_init()
431 ret = cfg_hnd->ops->clk_init_ver(msm_host); in dsi_clk_init()
438 const struct msm_dsi_config *cfg = msm_host->cfg_hnd->cfg; in dsi_bus_clk_enable()
441 DBG("id=%d", msm_host->id); in dsi_bus_clk_enable()
443 for (i = 0; i < cfg->num_bus_clks; i++) { in dsi_bus_clk_enable()
444 ret = clk_prepare_enable(msm_host->bus_clks[i]); in dsi_bus_clk_enable()
454 while (--i >= 0) in dsi_bus_clk_enable()
455 clk_disable_unprepare(msm_host->bus_clks[i]); in dsi_bus_clk_enable()
462 const struct msm_dsi_config *cfg = msm_host->cfg_hnd->cfg; in dsi_bus_clk_disable()
467 for (i = cfg->num_bus_clks - 1; i >= 0; i--) in dsi_bus_clk_disable()
468 clk_disable_unprepare(msm_host->bus_clks[i]); in dsi_bus_clk_disable()
475 struct mipi_dsi_host *host = msm_dsi->host; in msm_dsi_runtime_suspend()
478 if (!msm_host->cfg_hnd) in msm_dsi_runtime_suspend()
490 struct mipi_dsi_host *host = msm_dsi->host; in msm_dsi_runtime_resume()
493 if (!msm_host->cfg_hnd) in msm_dsi_runtime_resume()
505 msm_host->mode->clock, msm_host->byte_clk_rate); in dsi_link_clk_set_rate_6g()
507 ret = dev_pm_opp_set_rate(&msm_host->pdev->dev, in dsi_link_clk_set_rate_6g()
508 msm_host->byte_clk_rate); in dsi_link_clk_set_rate_6g()
514 ret = clk_set_rate(msm_host->pixel_clk, msm_host->pixel_clk_rate); in dsi_link_clk_set_rate_6g()
520 if (msm_host->byte_intf_clk) { in dsi_link_clk_set_rate_6g()
522 if (msm_host->cphy_mode) in dsi_link_clk_set_rate_6g()
523 byte_intf_rate = msm_host->byte_clk_rate; in dsi_link_clk_set_rate_6g()
525 byte_intf_rate = msm_host->byte_clk_rate / 2; in dsi_link_clk_set_rate_6g()
527 ret = clk_set_rate(msm_host->byte_intf_clk, byte_intf_rate); in dsi_link_clk_set_rate_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()
587 msm_host->mode->clock, msm_host->byte_clk_rate, in dsi_link_clk_set_rate_v2()
588 msm_host->esc_clk_rate, msm_host->src_clk_rate); in dsi_link_clk_set_rate_v2()
590 ret = clk_set_rate(msm_host->byte_clk, msm_host->byte_clk_rate); in dsi_link_clk_set_rate_v2()
596 ret = clk_set_rate(msm_host->esc_clk, msm_host->esc_clk_rate); in dsi_link_clk_set_rate_v2()
602 ret = clk_set_rate(msm_host->src_clk, msm_host->src_clk_rate); in dsi_link_clk_set_rate_v2()
608 ret = clk_set_rate(msm_host->pixel_clk, msm_host->pixel_clk_rate); in dsi_link_clk_set_rate_v2()
621 ret = clk_prepare_enable(msm_host->byte_clk); in dsi_link_clk_enable_v2()
627 ret = clk_prepare_enable(msm_host->esc_clk); in dsi_link_clk_enable_v2()
633 ret = clk_prepare_enable(msm_host->src_clk); in dsi_link_clk_enable_v2()
639 ret = clk_prepare_enable(msm_host->pixel_clk); in dsi_link_clk_enable_v2()
648 clk_disable_unprepare(msm_host->src_clk); in dsi_link_clk_enable_v2()
650 clk_disable_unprepare(msm_host->esc_clk); in dsi_link_clk_enable_v2()
652 clk_disable_unprepare(msm_host->byte_clk); in dsi_link_clk_enable_v2()
660 dev_pm_opp_set_rate(&msm_host->pdev->dev, 0); in dsi_link_clk_disable_6g()
661 clk_disable_unprepare(msm_host->esc_clk); in dsi_link_clk_disable_6g()
662 clk_disable_unprepare(msm_host->pixel_clk); in dsi_link_clk_disable_6g()
663 if (msm_host->byte_intf_clk) in dsi_link_clk_disable_6g()
664 clk_disable_unprepare(msm_host->byte_intf_clk); in dsi_link_clk_disable_6g()
665 clk_disable_unprepare(msm_host->byte_clk); in dsi_link_clk_disable_6g()
670 clk_disable_unprepare(msm_host->pixel_clk); in dsi_link_clk_disable_v2()
671 clk_disable_unprepare(msm_host->src_clk); in dsi_link_clk_disable_v2()
672 clk_disable_unprepare(msm_host->esc_clk); in dsi_link_clk_disable_v2()
673 clk_disable_unprepare(msm_host->byte_clk); in dsi_link_clk_disable_v2()
678 struct drm_display_mode *mode = msm_host->mode; in dsi_get_pclk_rate()
681 pclk_rate = mode->clock * 1000; in dsi_get_pclk_rate()
697 u8 lanes = msm_host->lanes; in dsi_calc_pclk()
698 u32 bpp = dsi_get_bpp(msm_host->format); in dsi_calc_pclk()
708 if (msm_host->cphy_mode) in dsi_calc_pclk()
713 msm_host->pixel_clk_rate = pclk_rate; in dsi_calc_pclk()
714 msm_host->byte_clk_rate = pclk_bpp; in dsi_calc_pclk()
716 DBG("pclk=%d, bclk=%d", msm_host->pixel_clk_rate, in dsi_calc_pclk()
717 msm_host->byte_clk_rate); in dsi_calc_pclk()
723 if (!msm_host->mode) { in dsi_calc_clk_rate_6g()
725 return -EINVAL; in dsi_calc_clk_rate_6g()
729 msm_host->esc_clk_rate = clk_get_rate(msm_host->esc_clk); in dsi_calc_clk_rate_6g()
735 u32 bpp = dsi_get_bpp(msm_host->format); in dsi_calc_clk_rate_v2()
744 msm_host->src_clk_rate = pclk_bpp; in dsi_calc_clk_rate_v2()
755 byte_mhz = msm_host->byte_clk_rate / 1000000; in dsi_calc_clk_rate_v2()
757 for (esc_mhz = 20; esc_mhz >= 5; esc_mhz--) { in dsi_calc_clk_rate_v2()
771 return -EINVAL; in dsi_calc_clk_rate_v2()
773 msm_host->esc_clk_rate = msm_host->byte_clk_rate / esc_div; in dsi_calc_clk_rate_v2()
775 DBG("esc=%d, src=%d", msm_host->esc_clk_rate, in dsi_calc_clk_rate_v2()
776 msm_host->src_clk_rate); in dsi_calc_clk_rate_v2()
786 spin_lock_irqsave(&msm_host->intr_lock, flags); in dsi_intr_ctrl()
797 spin_unlock_irqrestore(&msm_host->intr_lock, flags); in dsi_intr_ctrl()
837 u32 flags = msm_host->mode_flags; in dsi_ctrl_config()
838 enum mipi_dsi_pixel_format mipi_fmt = msm_host->format; in dsi_ctrl_config()
839 const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd; in dsi_ctrl_config()
863 data |= DSI_VID_CFG0_VIRT_CHANNEL(msm_host->channel); in dsi_ctrl_config()
892 data |= DSI_TRIG_CTRL_STREAM(msm_host->channel); in dsi_ctrl_config()
893 if ((cfg_hnd->major == MSM_DSI_VER_MAJOR_6G) && in dsi_ctrl_config()
894 (cfg_hnd->minor >= MSM_DSI_6G_VER_MINOR_V1_2)) in dsi_ctrl_config()
898 data = DSI_CLKOUT_TIMING_CTRL_T_CLK_POST(phy_shared_timings->clk_post) | in dsi_ctrl_config()
899 DSI_CLKOUT_TIMING_CTRL_T_CLK_PRE(phy_shared_timings->clk_pre); in dsi_ctrl_config()
902 if ((cfg_hnd->major == MSM_DSI_VER_MAJOR_6G) && in dsi_ctrl_config()
903 (cfg_hnd->minor > MSM_DSI_6G_VER_MINOR_V1_0) && in dsi_ctrl_config()
904 phy_shared_timings->clk_pre_inc_by_2) in dsi_ctrl_config()
913 /* allow only ack-err-status to generate interrupt */ in dsi_ctrl_config()
922 DBG("lane number=%d", msm_host->lanes); in dsi_ctrl_config()
923 data |= ((DSI_CTRL_LANE0 << msm_host->lanes) - DSI_CTRL_LANE0); in dsi_ctrl_config()
926 DSI_LANE_SWAP_CTRL_DLN_SWAP_SEL(msm_host->dlane_swap)); in dsi_ctrl_config()
942 if (msm_host->cphy_mode) in dsi_ctrl_config()
948 struct drm_display_mode *mode = msm_host->mode; in dsi_timing_setup()
950 u32 h_total = mode->htotal; in dsi_timing_setup()
951 u32 v_total = mode->vtotal; in dsi_timing_setup()
952 u32 hs_end = mode->hsync_end - mode->hsync_start; in dsi_timing_setup()
953 u32 vs_end = mode->vsync_end - mode->vsync_start; in dsi_timing_setup()
954 u32 ha_start = h_total - mode->hsync_start; in dsi_timing_setup()
955 u32 ha_end = ha_start + mode->hdisplay; in dsi_timing_setup()
956 u32 va_start = v_total - mode->vsync_start; in dsi_timing_setup()
957 u32 va_end = va_start + mode->vdisplay; in dsi_timing_setup()
958 u32 hdisplay = mode->hdisplay; in dsi_timing_setup()
978 if (msm_host->mode_flags & MIPI_DSI_MODE_VIDEO) { in dsi_timing_setup()
986 DSI_TOTAL_H_TOTAL(h_total - 1) | in dsi_timing_setup()
987 DSI_TOTAL_V_TOTAL(v_total - 1)); in dsi_timing_setup()
998 wc = hdisplay * dsi_get_bpp(msm_host->format) / 8 + 1; in dsi_timing_setup()
1003 msm_host->channel) | in dsi_timing_setup()
1009 DSI_CMD_MDP_STREAM0_TOTAL_V_TOTAL(mode->vdisplay)); in dsi_timing_setup()
1065 struct device *dev = &msm_host->pdev->dev; in dsi_wait4video_done()
1069 reinit_completion(&msm_host->video_comp); in dsi_wait4video_done()
1071 ret = wait_for_completion_timeout(&msm_host->video_comp, in dsi_wait4video_done()
1082 if (!(msm_host->mode_flags & MIPI_DSI_MODE_VIDEO)) in dsi_wait4video_eng_busy()
1085 if (msm_host->power_on && msm_host->enabled) { in dsi_wait4video_eng_busy()
1094 struct drm_device *dev = msm_host->dev; in dsi_tx_buf_alloc_6g()
1095 struct msm_drm_private *priv = dev->dev_private; in dsi_tx_buf_alloc_6g()
1100 priv->kms->aspace, in dsi_tx_buf_alloc_6g()
1101 &msm_host->tx_gem_obj, &iova); in dsi_tx_buf_alloc_6g()
1104 msm_host->tx_gem_obj = NULL; in dsi_tx_buf_alloc_6g()
1108 msm_gem_object_set_name(msm_host->tx_gem_obj, "tx_gem"); in dsi_tx_buf_alloc_6g()
1110 msm_host->tx_size = msm_host->tx_gem_obj->size; in dsi_tx_buf_alloc_6g()
1117 struct drm_device *dev = msm_host->dev; in dsi_tx_buf_alloc_v2()
1119 msm_host->tx_buf = dma_alloc_coherent(dev->dev, size, in dsi_tx_buf_alloc_v2()
1120 &msm_host->tx_buf_paddr, GFP_KERNEL); in dsi_tx_buf_alloc_v2()
1121 if (!msm_host->tx_buf) in dsi_tx_buf_alloc_v2()
1122 return -ENOMEM; in dsi_tx_buf_alloc_v2()
1124 msm_host->tx_size = size; in dsi_tx_buf_alloc_v2()
1131 struct drm_device *dev = msm_host->dev; in dsi_tx_buf_free()
1143 priv = dev->dev_private; in dsi_tx_buf_free()
1144 if (msm_host->tx_gem_obj) { in dsi_tx_buf_free()
1145 msm_gem_unpin_iova(msm_host->tx_gem_obj, priv->kms->aspace); in dsi_tx_buf_free()
1146 drm_gem_object_put(msm_host->tx_gem_obj); in dsi_tx_buf_free()
1147 msm_host->tx_gem_obj = NULL; in dsi_tx_buf_free()
1150 if (msm_host->tx_buf) in dsi_tx_buf_free()
1151 dma_free_coherent(dev->dev, msm_host->tx_size, msm_host->tx_buf, in dsi_tx_buf_free()
1152 msm_host->tx_buf_paddr); in dsi_tx_buf_free()
1157 return msm_gem_get_vaddr(msm_host->tx_gem_obj); in dsi_tx_buf_get_6g()
1162 return msm_host->tx_buf; in dsi_tx_buf_get_v2()
1167 msm_gem_put_vaddr(msm_host->tx_gem_obj); in dsi_tx_buf_put_6g()
1176 const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd; in dsi_cmd_dma_add()
1189 if (len > msm_host->tx_size) { in dsi_cmd_dma_add()
1191 return -EINVAL; in dsi_cmd_dma_add()
1194 data = cfg_hnd->ops->tx_buf_get(msm_host); in dsi_cmd_dma_add()
1206 if (mipi_dsi_packet_format_is_long(msg->type)) in dsi_cmd_dma_add()
1208 if (msg->rx_buf && msg->rx_len) in dsi_cmd_dma_add()
1217 memset(data + packet.size, 0xff, len - packet.size); in dsi_cmd_dma_add()
1219 if (cfg_hnd->ops->tx_buf_put) in dsi_cmd_dma_add()
1220 cfg_hnd->ops->tx_buf_put(msm_host); in dsi_cmd_dma_add()
1230 u8 *data = msg->rx_buf; in dsi_short_read1_resp()
1231 if (data && (msg->rx_len >= 1)) { in dsi_short_read1_resp()
1236 __func__, msg->rx_len); in dsi_short_read1_resp()
1237 return -EINVAL; in dsi_short_read1_resp()
1246 u8 *data = msg->rx_buf; in dsi_short_read2_resp()
1247 if (data && (msg->rx_len >= 2)) { in dsi_short_read2_resp()
1253 __func__, msg->rx_len); in dsi_short_read2_resp()
1254 return -EINVAL; in dsi_short_read2_resp()
1261 if (msg->rx_buf && msg->rx_len) in dsi_long_read_resp()
1262 memcpy(msg->rx_buf, buf + 4, msg->rx_len); in dsi_long_read_resp()
1264 return msg->rx_len; in dsi_long_read_resp()
1269 struct drm_device *dev = msm_host->dev; in dsi_dma_base_get_6g()
1270 struct msm_drm_private *priv = dev->dev_private; in dsi_dma_base_get_6g()
1273 return -EINVAL; in dsi_dma_base_get_6g()
1275 return msm_gem_get_and_pin_iova(msm_host->tx_gem_obj, in dsi_dma_base_get_6g()
1276 priv->kms->aspace, dma_base); in dsi_dma_base_get_6g()
1282 return -EINVAL; in dsi_dma_base_get_v2()
1284 *dma_base = msm_host->tx_buf_paddr; in dsi_dma_base_get_v2()
1290 const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd; in dsi_cmd_dma_tx()
1295 ret = cfg_hnd->ops->dma_base_get(msm_host, &dma_base); in dsi_cmd_dma_tx()
1301 reinit_completion(&msm_host->dma_comp); in dsi_cmd_dma_tx()
1306 msm_host->id, dma_base, len); in dsi_cmd_dma_tx()
1308 ret = wait_for_completion_timeout(&msm_host->dma_comp, in dsi_cmd_dma_tx()
1312 ret = -ETIMEDOUT; in dsi_cmd_dma_tx()
1329 int buf_offset = buf - msm_host->rx_buf; in dsi_cmd_dma_rx()
1354 bytes_shifted = read_cnt - 16; in dsi_cmd_dma_rx()
1355 repeated_bytes = buf_offset - bytes_shifted; in dsi_cmd_dma_rx()
1358 for (i = cnt - 1; i >= 0; i--) { in dsi_cmd_dma_rx()
1374 int bllp_len = msm_host->mode->hdisplay * in dsi_cmds2buf_tx()
1375 dsi_get_bpp(msm_host->format) / 8; in dsi_cmds2buf_tx()
1380 __func__, msg->type); in dsi_cmds2buf_tx()
1381 return -EINVAL; in dsi_cmds2buf_tx()
1393 if ((msm_host->mode_flags & MIPI_DSI_MODE_VIDEO) && (len > bllp_len)) { in dsi_cmds2buf_tx()
1396 return -EINVAL; in dsi_cmds2buf_tx()
1402 __func__, msg->type, (*(u8 *)(msg->tx_buf)), len); in dsi_cmds2buf_tx()
1403 return -ECOMM; in dsi_cmds2buf_tx()
1440 drm_helper_hpd_irq_event(msm_host->dev); in dsi_hpd_worker()
1447 u32 status = msm_host->err_work_state; in dsi_err_worker()
1454 msm_host->err_work_state = 0; in dsi_err_worker()
1470 msm_host->err_work_state |= DSI_ERR_STATE_ACK; in dsi_ack_err_status()
1482 msm_host->err_work_state |= DSI_ERR_STATE_TIMEOUT; in dsi_timeout_status()
1498 msm_host->err_work_state |= DSI_ERR_STATE_DLN0_PHY; in dsi_dln0_phy_err()
1511 msm_host->err_work_state |= DSI_ERR_STATE_FIFO; in dsi_fifo_status()
1513 msm_host->err_work_state |= in dsi_fifo_status()
1526 msm_host->err_work_state |= in dsi_status()
1539 msm_host->err_work_state |= DSI_ERR_STATE_PLL_UNLOCKED; in dsi_clk_status()
1555 queue_work(msm_host->workqueue, &msm_host->err_work); in dsi_error()
1564 if (!msm_host->ctrl_base) in dsi_host_irq()
1567 spin_lock_irqsave(&msm_host->intr_lock, flags); in dsi_host_irq()
1570 spin_unlock_irqrestore(&msm_host->intr_lock, flags); in dsi_host_irq()
1572 DBG("isr=0x%x, id=%d", isr, msm_host->id); in dsi_host_irq()
1578 complete(&msm_host->video_comp); in dsi_host_irq()
1581 complete(&msm_host->dma_comp); in dsi_host_irq()
1589 msm_host->disp_en_gpio = devm_gpiod_get_optional(panel_device, in dsi_host_init_panel_gpios()
1590 "disp-enable", in dsi_host_init_panel_gpios()
1592 if (IS_ERR(msm_host->disp_en_gpio)) { in dsi_host_init_panel_gpios()
1593 DBG("cannot get disp-enable-gpios %ld", in dsi_host_init_panel_gpios()
1594 PTR_ERR(msm_host->disp_en_gpio)); in dsi_host_init_panel_gpios()
1595 return PTR_ERR(msm_host->disp_en_gpio); in dsi_host_init_panel_gpios()
1598 msm_host->te_gpio = devm_gpiod_get_optional(panel_device, "disp-te", in dsi_host_init_panel_gpios()
1600 if (IS_ERR(msm_host->te_gpio)) { in dsi_host_init_panel_gpios()
1601 DBG("cannot get disp-te-gpios %ld", PTR_ERR(msm_host->te_gpio)); in dsi_host_init_panel_gpios()
1602 return PTR_ERR(msm_host->te_gpio); in dsi_host_init_panel_gpios()
1614 if (dsi->lanes > msm_host->num_data_lanes) in dsi_host_attach()
1615 return -EINVAL; in dsi_host_attach()
1617 msm_host->channel = dsi->channel; in dsi_host_attach()
1618 msm_host->lanes = dsi->lanes; in dsi_host_attach()
1619 msm_host->format = dsi->format; in dsi_host_attach()
1620 msm_host->mode_flags = dsi->mode_flags; in dsi_host_attach()
1623 ret = dsi_host_init_panel_gpios(msm_host, &dsi->dev); in dsi_host_attach()
1627 DBG("id=%d", msm_host->id); in dsi_host_attach()
1628 if (msm_host->dev) in dsi_host_attach()
1629 queue_work(msm_host->workqueue, &msm_host->hpd_work); in dsi_host_attach()
1639 msm_host->device_node = NULL; in dsi_host_detach()
1641 DBG("id=%d", msm_host->id); in dsi_host_detach()
1642 if (msm_host->dev) in dsi_host_detach()
1643 queue_work(msm_host->workqueue, &msm_host->hpd_work); in dsi_host_detach()
1654 if (!msg || !msm_host->power_on) in dsi_host_transfer()
1655 return -EINVAL; in dsi_host_transfer()
1657 mutex_lock(&msm_host->cmd_mutex); in dsi_host_transfer()
1658 ret = msm_dsi_manager_cmd_xfer(msm_host->id, msg); in dsi_host_transfer()
1659 mutex_unlock(&msm_host->cmd_mutex); in dsi_host_transfer()
1674 * "3012": Logic 3->Phys 0; Logic 0->Phys 1; Logic 1->Phys 2; Logic 2->Phys 3;
1690 struct device *dev = &msm_host->pdev->dev; in dsi_host_parse_lane_data()
1695 prop = of_find_property(ep, "data-lanes", &len); in dsi_host_parse_lane_data()
1706 return -EINVAL; in dsi_host_parse_lane_data()
1709 msm_host->num_data_lanes = num_lanes; in dsi_host_parse_lane_data()
1711 ret = of_property_read_u32_array(ep, "data-lanes", lane_map, in dsi_host_parse_lane_data()
1719 * compare DT specified physical-logical lane mappings with the ones in dsi_host_parse_lane_data()
1727 * the data-lanes array we get from DT has a logical->physical in dsi_host_parse_lane_data()
1729 * supported configurations in a physical->logical mapping. in dsi_host_parse_lane_data()
1743 msm_host->dlane_swap = i; in dsi_host_parse_lane_data()
1748 return -EINVAL; in dsi_host_parse_lane_data()
1753 struct device *dev = &msm_host->pdev->dev; in dsi_host_parse_dt()
1754 struct device_node *np = dev->of_node; in dsi_host_parse_dt()
1764 endpoint = of_graph_get_endpoint_by_regs(np, 1, -1); in dsi_host_parse_dt()
1774 ret = -EINVAL; in dsi_host_parse_dt()
1782 ret = -ENODEV; in dsi_host_parse_dt()
1786 msm_host->device_node = device_node; in dsi_host_parse_dt()
1788 if (of_property_read_bool(np, "syscon-sfpb")) { in dsi_host_parse_dt()
1789 msm_host->sfpb = syscon_regmap_lookup_by_phandle(np, in dsi_host_parse_dt()
1790 "syscon-sfpb"); in dsi_host_parse_dt()
1791 if (IS_ERR(msm_host->sfpb)) { in dsi_host_parse_dt()
1792 DRM_DEV_ERROR(dev, "%s: failed to get sfpb regmap\n", in dsi_host_parse_dt()
1794 ret = PTR_ERR(msm_host->sfpb); in dsi_host_parse_dt()
1808 struct platform_device *pdev = msm_host->pdev; in dsi_host_get_id()
1809 const struct msm_dsi_config *cfg = msm_host->cfg_hnd->cfg; in dsi_host_get_id()
1815 return -EINVAL; in dsi_host_get_id()
1817 for (i = 0; i < cfg->num_dsi; i++) { in dsi_host_get_id()
1818 if (cfg->io_start[i] == res->start) in dsi_host_get_id()
1822 return -EINVAL; in dsi_host_get_id()
1828 struct platform_device *pdev = msm_dsi->pdev; in msm_dsi_host_init()
1831 msm_host = devm_kzalloc(&pdev->dev, sizeof(*msm_host), GFP_KERNEL); in msm_dsi_host_init()
1833 ret = -ENOMEM; in msm_dsi_host_init()
1837 msm_host->pdev = pdev; in msm_dsi_host_init()
1838 msm_dsi->host = &msm_host->base; in msm_dsi_host_init()
1846 msm_host->ctrl_base = msm_ioremap_size(pdev, "dsi_ctrl", "DSI CTRL", &msm_host->ctrl_size); in msm_dsi_host_init()
1847 if (IS_ERR(msm_host->ctrl_base)) { in msm_dsi_host_init()
1849 ret = PTR_ERR(msm_host->ctrl_base); in msm_dsi_host_init()
1853 pm_runtime_enable(&pdev->dev); in msm_dsi_host_init()
1855 msm_host->cfg_hnd = dsi_get_config(msm_host); in msm_dsi_host_init()
1856 if (!msm_host->cfg_hnd) { in msm_dsi_host_init()
1857 ret = -EINVAL; in msm_dsi_host_init()
1862 msm_host->id = dsi_host_get_id(msm_host); in msm_dsi_host_init()
1863 if (msm_host->id < 0) { in msm_dsi_host_init()
1864 ret = msm_host->id; in msm_dsi_host_init()
1870 msm_host->ctrl_base += msm_host->cfg_hnd->cfg->io_offset; in msm_dsi_host_init()
1884 msm_host->rx_buf = devm_kzalloc(&pdev->dev, SZ_4K, GFP_KERNEL); in msm_dsi_host_init()
1885 if (!msm_host->rx_buf) { in msm_dsi_host_init()
1886 ret = -ENOMEM; in msm_dsi_host_init()
1891 ret = devm_pm_opp_set_clkname(&pdev->dev, "byte"); in msm_dsi_host_init()
1895 ret = devm_pm_opp_of_add_table(&pdev->dev); in msm_dsi_host_init()
1896 if (ret && ret != -ENODEV) { in msm_dsi_host_init()
1897 dev_err(&pdev->dev, "invalid OPP table in device tree\n"); in msm_dsi_host_init()
1901 init_completion(&msm_host->dma_comp); in msm_dsi_host_init()
1902 init_completion(&msm_host->video_comp); in msm_dsi_host_init()
1903 mutex_init(&msm_host->dev_mutex); in msm_dsi_host_init()
1904 mutex_init(&msm_host->cmd_mutex); in msm_dsi_host_init()
1905 spin_lock_init(&msm_host->intr_lock); in msm_dsi_host_init()
1908 msm_host->workqueue = alloc_ordered_workqueue("dsi_drm_work", 0); in msm_dsi_host_init()
1909 INIT_WORK(&msm_host->err_work, dsi_err_worker); in msm_dsi_host_init()
1910 INIT_WORK(&msm_host->hpd_work, dsi_hpd_worker); in msm_dsi_host_init()
1912 msm_dsi->id = msm_host->id; in msm_dsi_host_init()
1914 DBG("Dsi Host %d initialized", msm_host->id); in msm_dsi_host_init()
1927 if (msm_host->workqueue) { in msm_dsi_host_destroy()
1928 flush_workqueue(msm_host->workqueue); in msm_dsi_host_destroy()
1929 destroy_workqueue(msm_host->workqueue); in msm_dsi_host_destroy()
1930 msm_host->workqueue = NULL; in msm_dsi_host_destroy()
1933 mutex_destroy(&msm_host->cmd_mutex); in msm_dsi_host_destroy()
1934 mutex_destroy(&msm_host->dev_mutex); in msm_dsi_host_destroy()
1936 pm_runtime_disable(&msm_host->pdev->dev); in msm_dsi_host_destroy()
1943 const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd; in msm_dsi_host_modeset_init()
1944 struct platform_device *pdev = msm_host->pdev; in msm_dsi_host_modeset_init()
1947 msm_host->irq = irq_of_parse_and_map(pdev->dev.of_node, 0); in msm_dsi_host_modeset_init()
1948 if (msm_host->irq < 0) { in msm_dsi_host_modeset_init()
1949 ret = msm_host->irq; in msm_dsi_host_modeset_init()
1950 DRM_DEV_ERROR(dev->dev, "failed to get irq: %d\n", ret); in msm_dsi_host_modeset_init()
1954 ret = devm_request_irq(&pdev->dev, msm_host->irq, in msm_dsi_host_modeset_init()
1958 DRM_DEV_ERROR(&pdev->dev, "failed to request IRQ%u: %d\n", in msm_dsi_host_modeset_init()
1959 msm_host->irq, ret); in msm_dsi_host_modeset_init()
1963 msm_host->dev = dev; in msm_dsi_host_modeset_init()
1964 ret = cfg_hnd->ops->tx_buf_alloc(msm_host, SZ_4K); in msm_dsi_host_modeset_init()
1979 if (!msm_host->registered) { in msm_dsi_host_register()
1980 host->dev = &msm_host->pdev->dev; in msm_dsi_host_register()
1981 host->ops = &dsi_host_ops; in msm_dsi_host_register()
1986 msm_host->registered = true; in msm_dsi_host_register()
1996 if (check_defer && msm_host->device_node) { in msm_dsi_host_register()
1997 if (IS_ERR(of_drm_find_panel(msm_host->device_node))) in msm_dsi_host_register()
1998 if (!of_drm_find_bridge(msm_host->device_node)) in msm_dsi_host_register()
1999 return -EPROBE_DEFER; in msm_dsi_host_register()
2010 if (msm_host->registered) { in msm_dsi_host_unregister()
2012 host->dev = NULL; in msm_dsi_host_unregister()
2013 host->ops = NULL; in msm_dsi_host_unregister()
2014 msm_host->registered = false; in msm_dsi_host_unregister()
2022 const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd; in msm_dsi_host_xfer_prepare()
2034 pm_runtime_get_sync(&msm_host->pdev->dev); in msm_dsi_host_xfer_prepare()
2035 cfg_hnd->ops->link_clk_set_rate(msm_host); in msm_dsi_host_xfer_prepare()
2036 cfg_hnd->ops->link_clk_enable(msm_host); in msm_dsi_host_xfer_prepare()
2040 if (!(msg->flags & MIPI_DSI_MSG_USE_LPM)) in msm_dsi_host_xfer_prepare()
2043 msm_host->dma_cmd_ctrl_restore = dsi_read(msm_host, REG_DSI_CTRL); in msm_dsi_host_xfer_prepare()
2045 msm_host->dma_cmd_ctrl_restore | in msm_dsi_host_xfer_prepare()
2057 const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd; in msm_dsi_host_xfer_restore()
2060 dsi_write(msm_host, REG_DSI_CTRL, msm_host->dma_cmd_ctrl_restore); in msm_dsi_host_xfer_restore()
2062 if (!(msg->flags & MIPI_DSI_MSG_USE_LPM)) in msm_dsi_host_xfer_restore()
2067 cfg_hnd->ops->link_clk_disable(msm_host); in msm_dsi_host_xfer_restore()
2068 pm_runtime_put_autosuspend(&msm_host->pdev->dev); in msm_dsi_host_xfer_restore()
2083 const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd; in msm_dsi_host_cmd_rx()
2087 int rlen = msg->rx_len; in msm_dsi_host_cmd_rx()
2104 buf = msm_host->rx_buf; in msm_dsi_host_cmd_rx()
2109 .channel = msg->channel, in msm_dsi_host_cmd_rx()
2122 return -EINVAL; in msm_dsi_host_cmd_rx()
2125 if ((cfg_hnd->major == MSM_DSI_VER_MAJOR_6G) && in msm_dsi_host_cmd_rx()
2126 (cfg_hnd->minor >= MSM_DSI_6G_VER_MINOR_V1_1)) { in msm_dsi_host_cmd_rx()
2136 if (ret < msg->tx_len) { in msm_dsi_host_cmd_rx()
2157 diff = data_byte - rlen; in msm_dsi_host_cmd_rx()
2161 rlen -= data_byte; in msm_dsi_host_cmd_rx()
2165 dlen -= 2; /* 2 crc */ in msm_dsi_host_cmd_rx()
2166 dlen -= diff; in msm_dsi_host_cmd_rx()
2184 buf = msm_host->rx_buf + (10 - rlen); in msm_dsi_host_cmd_rx()
2186 buf = msm_host->rx_buf; in msm_dsi_host_cmd_rx()
2234 msm_host->cphy_mode = src_phy->cphy_mode; in msm_dsi_host_set_src_pll()
2244 ret = clk_set_parent(msm_host->byte_clk_src, byte_clk_provider); in msm_dsi_host_set_src_pll()
2251 ret = clk_set_parent(msm_host->pixel_clk_src, pixel_clk_provider); in msm_dsi_host_set_src_pll()
2258 if (msm_host->dsi_clk_src) { in msm_dsi_host_set_src_pll()
2259 ret = clk_set_parent(msm_host->dsi_clk_src, pixel_clk_provider); in msm_dsi_host_set_src_pll()
2267 if (msm_host->esc_clk_src) { in msm_dsi_host_set_src_pll()
2268 ret = clk_set_parent(msm_host->esc_clk_src, byte_clk_provider); in msm_dsi_host_set_src_pll()
2298 const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd; in msm_dsi_host_get_phy_clk_req()
2301 ret = cfg_hnd->ops->calc_clk_rate(msm_host, is_bonded_dsi); in msm_dsi_host_get_phy_clk_req()
2308 * "byte_clk" is in units of 16-bits (see dsi_calc_pclk), in msm_dsi_host_get_phy_clk_req()
2311 if (msm_host->cphy_mode) in msm_dsi_host_get_phy_clk_req()
2312 clk_req->bitclk_rate = msm_host->byte_clk_rate * 7; in msm_dsi_host_get_phy_clk_req()
2314 clk_req->bitclk_rate = msm_host->byte_clk_rate * 8; in msm_dsi_host_get_phy_clk_req()
2315 clk_req->escclk_rate = msm_host->esc_clk_rate; in msm_dsi_host_get_phy_clk_req()
2323 !!(msm_host->mode_flags & MIPI_DSI_MODE_VIDEO), true); in msm_dsi_host_enable()
2329 /* if (msm_panel->mode == MSM_DSI_CMD_MODE) { in msm_dsi_host_enable()
2331 * pm_runtime_put_autosuspend(&msm_host->pdev->dev); in msm_dsi_host_enable()
2334 msm_host->enabled = true; in msm_dsi_host_enable()
2342 msm_host->enabled = false; in msm_dsi_host_disable()
2344 !!(msm_host->mode_flags & MIPI_DSI_MODE_VIDEO), false); in msm_dsi_host_disable()
2359 if (!msm_host->sfpb) in msm_dsi_sfpb_config()
2364 regmap_update_bits(msm_host->sfpb, REG_SFPB_GPREG, in msm_dsi_sfpb_config()
2374 const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd; in msm_dsi_host_power_on()
2377 mutex_lock(&msm_host->dev_mutex); in msm_dsi_host_power_on()
2378 if (msm_host->power_on) { in msm_dsi_host_power_on()
2392 pm_runtime_get_sync(&msm_host->pdev->dev); in msm_dsi_host_power_on()
2393 ret = cfg_hnd->ops->link_clk_set_rate(msm_host); in msm_dsi_host_power_on()
2395 ret = cfg_hnd->ops->link_clk_enable(msm_host); in msm_dsi_host_power_on()
2402 ret = pinctrl_pm_select_default_state(&msm_host->pdev->dev); in msm_dsi_host_power_on()
2413 if (msm_host->disp_en_gpio) in msm_dsi_host_power_on()
2414 gpiod_set_value(msm_host->disp_en_gpio, 1); in msm_dsi_host_power_on()
2416 msm_host->power_on = true; in msm_dsi_host_power_on()
2417 mutex_unlock(&msm_host->dev_mutex); in msm_dsi_host_power_on()
2422 cfg_hnd->ops->link_clk_disable(msm_host); in msm_dsi_host_power_on()
2423 pm_runtime_put_autosuspend(&msm_host->pdev->dev); in msm_dsi_host_power_on()
2427 mutex_unlock(&msm_host->dev_mutex); in msm_dsi_host_power_on()
2434 const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd; in msm_dsi_host_power_off()
2436 mutex_lock(&msm_host->dev_mutex); in msm_dsi_host_power_off()
2437 if (!msm_host->power_on) { in msm_dsi_host_power_off()
2444 if (msm_host->disp_en_gpio) in msm_dsi_host_power_off()
2445 gpiod_set_value(msm_host->disp_en_gpio, 0); in msm_dsi_host_power_off()
2447 pinctrl_pm_select_sleep_state(&msm_host->pdev->dev); in msm_dsi_host_power_off()
2449 cfg_hnd->ops->link_clk_disable(msm_host); in msm_dsi_host_power_off()
2450 pm_runtime_put_autosuspend(&msm_host->pdev->dev); in msm_dsi_host_power_off()
2456 DBG("-"); in msm_dsi_host_power_off()
2458 msm_host->power_on = false; in msm_dsi_host_power_off()
2461 mutex_unlock(&msm_host->dev_mutex); in msm_dsi_host_power_off()
2470 if (msm_host->mode) { in msm_dsi_host_set_display_mode()
2471 drm_mode_destroy(msm_host->dev, msm_host->mode); in msm_dsi_host_set_display_mode()
2472 msm_host->mode = NULL; in msm_dsi_host_set_display_mode()
2475 msm_host->mode = drm_mode_duplicate(msm_host->dev, mode); in msm_dsi_host_set_display_mode()
2476 if (!msm_host->mode) { in msm_dsi_host_set_display_mode()
2478 return -ENOMEM; in msm_dsi_host_set_display_mode()
2486 return of_drm_find_panel(to_msm_dsi_host(host)->device_node); in msm_dsi_host_get_panel()
2491 return to_msm_dsi_host(host)->mode_flags; in msm_dsi_host_get_mode_flags()
2498 return of_drm_find_bridge(msm_host->device_node); in msm_dsi_host_get_bridge()
2505 pm_runtime_get_sync(&msm_host->pdev->dev); in msm_dsi_host_snapshot()
2507 msm_disp_snapshot_add_block(disp_state, msm_host->ctrl_size, in msm_dsi_host_snapshot()
2508 msm_host->ctrl_base, "dsi%d_ctrl", msm_host->id); in msm_dsi_host_snapshot()
2510 pm_runtime_put_sync(&msm_host->pdev->dev); in msm_dsi_host_snapshot()
2523 /* use 24-bit RGB test pttern */ in msm_dsi_host_video_test_pattern_setup()
2556 bool is_video_mode = !!(msm_host->mode_flags & MIPI_DSI_MODE_VIDEO); in msm_dsi_host_test_pattern_en()