Lines Matching +full:dsi +full:- +full:lanes
1 // SPDX-License-Identifier: GPL-2.0
27 #include <linux/phy/phy-mipi-dphy.h>
71 #define DATA_LANE_EN(x) BIT((x) - 1)
488 return mode->hsync_start - mode->hdisplay; in mode_to_dpi_hfp()
490 return mode->crtc_hsync_start - mode->crtc_hdisplay; in mode_to_dpi_hfp()
502 dsi_timing -= dsi_pkt_overhead; in dpi_to_dsi_timing()
507 static int cdns_dsi_mode2cfg(struct cdns_dsi *dsi, in cdns_dsi_mode2cfg() argument
512 struct cdns_dsi_output *output = &dsi->output; in cdns_dsi_mode2cfg()
519 if (output->dev->mode_flags & MIPI_DSI_MODE_VIDEO_SYNC_PULSE) in cdns_dsi_mode2cfg()
522 bpp = mipi_dsi_pixel_format_to_bpp(output->dev->format); in cdns_dsi_mode2cfg()
525 tmp = mode->htotal - in cdns_dsi_mode2cfg()
526 (sync_pulse ? mode->hsync_end : mode->hsync_start); in cdns_dsi_mode2cfg()
528 tmp = mode->crtc_htotal - in cdns_dsi_mode2cfg()
530 mode->crtc_hsync_end : mode->crtc_hsync_start); in cdns_dsi_mode2cfg()
532 dsi_cfg->hbp = dpi_to_dsi_timing(tmp, bpp, DSI_HBP_FRAME_OVERHEAD); in cdns_dsi_mode2cfg()
536 tmp = mode->hsync_end - mode->hsync_start; in cdns_dsi_mode2cfg()
538 tmp = mode->crtc_hsync_end - mode->crtc_hsync_start; in cdns_dsi_mode2cfg()
540 dsi_cfg->hsa = dpi_to_dsi_timing(tmp, bpp, in cdns_dsi_mode2cfg()
544 dsi_cfg->hact = dpi_to_dsi_timing(mode_valid_check ? in cdns_dsi_mode2cfg()
545 mode->hdisplay : mode->crtc_hdisplay, in cdns_dsi_mode2cfg()
547 dsi_cfg->hfp = dpi_to_dsi_timing(mode_to_dpi_hfp(mode, mode_valid_check), in cdns_dsi_mode2cfg()
553 static int cdns_dsi_adjust_phy_config(struct cdns_dsi *dsi, in cdns_dsi_adjust_phy_config() argument
559 struct cdns_dsi_output *output = &dsi->output; in cdns_dsi_adjust_phy_config()
566 unsigned int lanes = output->dev->lanes; in cdns_dsi_adjust_phy_config() local
568 dsi_htotal = dsi_cfg->hbp + DSI_HBP_FRAME_OVERHEAD; in cdns_dsi_adjust_phy_config()
569 if (output->dev->mode_flags & MIPI_DSI_MODE_VIDEO_SYNC_PULSE) in cdns_dsi_adjust_phy_config()
570 dsi_htotal += dsi_cfg->hsa + DSI_HSA_FRAME_OVERHEAD; in cdns_dsi_adjust_phy_config()
572 dsi_htotal += dsi_cfg->hact; in cdns_dsi_adjust_phy_config()
573 dsi_htotal += dsi_cfg->hfp + DSI_HFP_FRAME_OVERHEAD; in cdns_dsi_adjust_phy_config()
576 * Make sure DSI htotal is aligned on a lane boundary when calculating in cdns_dsi_adjust_phy_config()
581 if (dsi_htotal % lanes) in cdns_dsi_adjust_phy_config()
582 adj_dsi_htotal += lanes - (dsi_htotal % lanes); in cdns_dsi_adjust_phy_config()
584 dpi_hz = (mode_valid_check ? mode->clock : mode->crtc_clock) * 1000; in cdns_dsi_adjust_phy_config()
588 dpi_htotal = mode_valid_check ? mode->htotal : mode->crtc_htotal; in cdns_dsi_adjust_phy_config()
589 if (do_div(dlane_bps, lanes * dpi_htotal)) in cdns_dsi_adjust_phy_config()
590 return -EINVAL; in cdns_dsi_adjust_phy_config()
593 phy_cfg->hs_clk_rate = dlane_bps * 8; in cdns_dsi_adjust_phy_config()
595 dsi_hfp_ext = adj_dsi_htotal - dsi_htotal; in cdns_dsi_adjust_phy_config()
596 dsi_cfg->hfp += dsi_hfp_ext; in cdns_dsi_adjust_phy_config()
597 dsi_cfg->htotal = dsi_htotal + dsi_hfp_ext; in cdns_dsi_adjust_phy_config()
602 static int cdns_dsi_check_conf(struct cdns_dsi *dsi, in cdns_dsi_check_conf() argument
607 struct cdns_dsi_output *output = &dsi->output; in cdns_dsi_check_conf()
608 struct phy_configure_opts_mipi_dphy *phy_cfg = &output->phy_opts.mipi_dphy; in cdns_dsi_check_conf()
610 unsigned int nlanes = output->dev->lanes; in cdns_dsi_check_conf()
613 ret = cdns_dsi_mode2cfg(dsi, mode, dsi_cfg, mode_valid_check); in cdns_dsi_check_conf()
617 phy_mipi_dphy_get_default_config(mode->crtc_clock * 1000, in cdns_dsi_check_conf()
618 mipi_dsi_pixel_format_to_bpp(output->dev->format), in cdns_dsi_check_conf()
621 ret = cdns_dsi_adjust_phy_config(dsi, dsi_cfg, phy_cfg, mode, mode_valid_check); in cdns_dsi_check_conf()
625 ret = phy_validate(dsi->dphy, PHY_MODE_MIPI_DPHY, 0, &output->phy_opts); in cdns_dsi_check_conf()
629 dsi_hss_hsa_hse_hbp = dsi_cfg->hbp + DSI_HBP_FRAME_OVERHEAD; in cdns_dsi_check_conf()
630 if (output->dev->mode_flags & MIPI_DSI_MODE_VIDEO_SYNC_PULSE) in cdns_dsi_check_conf()
631 dsi_hss_hsa_hse_hbp += dsi_cfg->hsa + DSI_HSA_FRAME_OVERHEAD; in cdns_dsi_check_conf()
634 * Make sure DPI(HFP) > DSI(HSS+HSA+HSE+HBP) to guarantee that the FIFO in cdns_dsi_check_conf()
638 if ((u64)phy_cfg->hs_clk_rate * in cdns_dsi_check_conf()
641 (mode_valid_check ? mode->clock : mode->crtc_clock) * 1000) in cdns_dsi_check_conf()
642 return -EINVAL; in cdns_dsi_check_conf()
651 struct cdns_dsi *dsi = input_to_dsi(input); in cdns_dsi_bridge_attach() local
652 struct cdns_dsi_output *output = &dsi->output; in cdns_dsi_bridge_attach()
654 if (!drm_core_check_feature(bridge->dev, DRIVER_ATOMIC)) { in cdns_dsi_bridge_attach()
655 dev_err(dsi->base.dev, in cdns_dsi_bridge_attach()
656 "cdns-dsi driver is only compatible with DRM devices supporting atomic updates"); in cdns_dsi_bridge_attach()
657 return -ENOTSUPP; in cdns_dsi_bridge_attach()
660 return drm_bridge_attach(bridge->encoder, output->bridge, bridge, in cdns_dsi_bridge_attach()
670 struct cdns_dsi *dsi = input_to_dsi(input); in cdns_dsi_bridge_mode_valid() local
671 struct cdns_dsi_output *output = &dsi->output; in cdns_dsi_bridge_mode_valid()
679 if (mode->vtotal - mode->vsync_end < 2) in cdns_dsi_bridge_mode_valid()
683 if (mode->vsync_end - mode->vsync_start < 2) in cdns_dsi_bridge_mode_valid()
686 /* HACT must be 32-bits aligned. */ in cdns_dsi_bridge_mode_valid()
687 bpp = mipi_dsi_pixel_format_to_bpp(output->dev->format); in cdns_dsi_bridge_mode_valid()
688 if ((mode->hdisplay * bpp) % 32) in cdns_dsi_bridge_mode_valid()
691 ret = cdns_dsi_check_conf(dsi, mode, &dsi_cfg, true); in cdns_dsi_bridge_mode_valid()
701 struct cdns_dsi *dsi = input_to_dsi(input); in cdns_dsi_bridge_disable() local
704 val = readl(dsi->regs + MCTL_MAIN_DATA_CTL); in cdns_dsi_bridge_disable()
707 writel(val, dsi->regs + MCTL_MAIN_DATA_CTL); in cdns_dsi_bridge_disable()
709 val = readl(dsi->regs + MCTL_MAIN_EN) & ~IF_EN(input->id); in cdns_dsi_bridge_disable()
710 writel(val, dsi->regs + MCTL_MAIN_EN); in cdns_dsi_bridge_disable()
711 pm_runtime_put(dsi->base.dev); in cdns_dsi_bridge_disable()
714 static void cdns_dsi_hs_init(struct cdns_dsi *dsi) in cdns_dsi_hs_init() argument
716 struct cdns_dsi_output *output = &dsi->output; in cdns_dsi_hs_init()
725 dsi->regs + MCTL_DPHY_CFG0); in cdns_dsi_hs_init()
727 phy_init(dsi->dphy); in cdns_dsi_hs_init()
728 phy_set_mode(dsi->dphy, PHY_MODE_MIPI_DPHY); in cdns_dsi_hs_init()
729 phy_configure(dsi->dphy, &output->phy_opts); in cdns_dsi_hs_init()
730 phy_power_on(dsi->dphy); in cdns_dsi_hs_init()
733 writel(PLL_LOCKED, dsi->regs + MCTL_MAIN_STS_CLR); in cdns_dsi_hs_init()
735 dsi->regs + MCTL_DPHY_CFG0); in cdns_dsi_hs_init()
736 WARN_ON_ONCE(readl_poll_timeout(dsi->regs + MCTL_MAIN_STS, status, in cdns_dsi_hs_init()
738 /* De-assert data and clock reset lines. */ in cdns_dsi_hs_init()
740 DPHY_D_RSTB(output->dev->lanes) | DPHY_C_RSTB, in cdns_dsi_hs_init()
741 dsi->regs + MCTL_DPHY_CFG0); in cdns_dsi_hs_init()
744 static void cdns_dsi_init_link(struct cdns_dsi *dsi) in cdns_dsi_init_link() argument
746 struct cdns_dsi_output *output = &dsi->output; in cdns_dsi_init_link()
751 if (dsi->link_initialized) in cdns_dsi_init_link()
755 for (i = 1; i < output->dev->lanes; i++) in cdns_dsi_init_link()
758 if (!(output->dev->mode_flags & MIPI_DSI_CLOCK_NON_CONTINUOUS)) in cdns_dsi_init_link()
761 writel(val, dsi->regs + MCTL_MAIN_PHY_CTL); in cdns_dsi_init_link()
764 sysclk_period = NSEC_PER_SEC / clk_get_rate(dsi->dsi_sys_clk); in cdns_dsi_init_link()
767 dsi->regs + MCTL_ULPOUT_TIME); in cdns_dsi_init_link()
769 writel(LINK_EN, dsi->regs + MCTL_MAIN_DATA_CTL); in cdns_dsi_init_link()
772 for (i = 0; i < output->dev->lanes; i++) in cdns_dsi_init_link()
775 writel(val, dsi->regs + MCTL_MAIN_EN); in cdns_dsi_init_link()
777 dsi->link_initialized = true; in cdns_dsi_init_link()
783 struct cdns_dsi *dsi = input_to_dsi(input); in cdns_dsi_bridge_enable() local
784 struct cdns_dsi_output *output = &dsi->output; in cdns_dsi_bridge_enable()
786 struct phy_configure_opts_mipi_dphy *phy_cfg = &output->phy_opts.mipi_dphy; in cdns_dsi_bridge_enable()
792 if (WARN_ON(pm_runtime_get_sync(dsi->base.dev) < 0)) in cdns_dsi_bridge_enable()
795 mode = &bridge->encoder->crtc->state->adjusted_mode; in cdns_dsi_bridge_enable()
796 nlanes = output->dev->lanes; in cdns_dsi_bridge_enable()
798 WARN_ON_ONCE(cdns_dsi_check_conf(dsi, mode, &dsi_cfg, false)); in cdns_dsi_bridge_enable()
800 cdns_dsi_hs_init(dsi); in cdns_dsi_bridge_enable()
801 cdns_dsi_init_link(dsi); in cdns_dsi_bridge_enable()
804 dsi->regs + VID_HSIZE1); in cdns_dsi_bridge_enable()
806 dsi->regs + VID_HSIZE2); in cdns_dsi_bridge_enable()
808 writel(VBP_LEN(mode->crtc_vtotal - mode->crtc_vsync_end - 1) | in cdns_dsi_bridge_enable()
809 VFP_LEN(mode->crtc_vsync_start - mode->crtc_vdisplay) | in cdns_dsi_bridge_enable()
810 VSA_LEN(mode->crtc_vsync_end - mode->crtc_vsync_start + 1), in cdns_dsi_bridge_enable()
811 dsi->regs + VID_VSIZE1); in cdns_dsi_bridge_enable()
812 writel(mode->crtc_vdisplay, dsi->regs + VID_VSIZE2); in cdns_dsi_bridge_enable()
814 tmp = dsi_cfg.htotal - in cdns_dsi_bridge_enable()
817 writel(BLK_LINE_PULSE_PKT_LEN(tmp), dsi->regs + VID_BLKSIZE2); in cdns_dsi_bridge_enable()
818 if (output->dev->mode_flags & MIPI_DSI_MODE_VIDEO_SYNC_PULSE) in cdns_dsi_bridge_enable()
819 writel(MAX_LINE_LIMIT(tmp - DSI_NULL_FRAME_OVERHEAD), in cdns_dsi_bridge_enable()
820 dsi->regs + VID_VCA_SETTING2); in cdns_dsi_bridge_enable()
822 tmp = dsi_cfg.htotal - in cdns_dsi_bridge_enable()
824 writel(BLK_LINE_EVENT_PKT_LEN(tmp), dsi->regs + VID_BLKSIZE1); in cdns_dsi_bridge_enable()
825 if (!(output->dev->mode_flags & MIPI_DSI_MODE_VIDEO_SYNC_PULSE)) in cdns_dsi_bridge_enable()
826 writel(MAX_LINE_LIMIT(tmp - DSI_NULL_FRAME_OVERHEAD), in cdns_dsi_bridge_enable()
827 dsi->regs + VID_VCA_SETTING2); in cdns_dsi_bridge_enable()
829 tmp = DIV_ROUND_UP(dsi_cfg.htotal, nlanes) - in cdns_dsi_bridge_enable()
832 if (!(output->dev->mode_flags & MIPI_DSI_MODE_EOT_PACKET)) in cdns_dsi_bridge_enable()
833 tmp -= DIV_ROUND_UP(DSI_EOT_PKT_SIZE, nlanes); in cdns_dsi_bridge_enable()
836 phy_cfg->hs_clk_rate); in cdns_dsi_bridge_enable()
837 reg_wakeup = (phy_cfg->hs_prepare + phy_cfg->hs_zero) / tx_byte_period; in cdns_dsi_bridge_enable()
839 dsi->regs + VID_DPHY_TIME); in cdns_dsi_bridge_enable()
860 dsi->regs + MCTL_DPHY_TIMEOUT1); in cdns_dsi_bridge_enable()
862 writel(LPRX_TIMEOUT(tmp), dsi->regs + MCTL_DPHY_TIMEOUT2); in cdns_dsi_bridge_enable()
864 if (output->dev->mode_flags & MIPI_DSI_MODE_VIDEO) { in cdns_dsi_bridge_enable()
865 switch (output->dev->format) { in cdns_dsi_bridge_enable()
887 dev_err(dsi->base.dev, "Unsupported DSI format\n"); in cdns_dsi_bridge_enable()
891 if (output->dev->mode_flags & MIPI_DSI_MODE_VIDEO_SYNC_PULSE) in cdns_dsi_bridge_enable()
899 writel(tmp, dsi->regs + VID_MAIN_CTL); in cdns_dsi_bridge_enable()
902 tmp = readl(dsi->regs + MCTL_MAIN_DATA_CTL); in cdns_dsi_bridge_enable()
905 if (!(output->dev->mode_flags & MIPI_DSI_MODE_EOT_PACKET)) in cdns_dsi_bridge_enable()
908 if (output->dev->mode_flags & MIPI_DSI_MODE_VIDEO) in cdns_dsi_bridge_enable()
909 tmp |= IF_VID_MODE | IF_VID_SELECT(input->id) | VID_EN; in cdns_dsi_bridge_enable()
911 writel(tmp, dsi->regs + MCTL_MAIN_DATA_CTL); in cdns_dsi_bridge_enable()
913 tmp = readl(dsi->regs + MCTL_MAIN_EN) | IF_EN(input->id); in cdns_dsi_bridge_enable()
914 writel(tmp, dsi->regs + MCTL_MAIN_EN); in cdns_dsi_bridge_enable()
927 struct cdns_dsi *dsi = to_cdns_dsi(host); in cdns_dsi_attach() local
928 struct cdns_dsi_output *output = &dsi->output; in cdns_dsi_attach()
929 struct cdns_dsi_input *input = &dsi->input; in cdns_dsi_attach()
936 * We currently do not support connecting several DSI devices to the in cdns_dsi_attach()
940 if (output->dev) in cdns_dsi_attach()
941 return -EBUSY; in cdns_dsi_attach()
944 if (dev->mode_flags & MIPI_DSI_MODE_VIDEO_BURST) in cdns_dsi_attach()
945 return -ENOTSUPP; in cdns_dsi_attach()
948 * The host <-> device link might be described using an OF-graph in cdns_dsi_attach()
950 * this representation, otherwise we use dsidev->dev.of_node which in cdns_dsi_attach()
953 np = of_graph_get_remote_node(dsi->base.dev->of_node, DSI_OUTPUT_PORT, in cdns_dsi_attach()
954 dev->channel); in cdns_dsi_attach()
956 np = of_node_get(dev->dev.of_node); in cdns_dsi_attach()
963 bridge = of_drm_find_bridge(dev->dev.of_node); in cdns_dsi_attach()
965 bridge = ERR_PTR(-EINVAL); in cdns_dsi_attach()
972 dev_err(host->dev, "failed to add DSI device %s (err = %d)", in cdns_dsi_attach()
973 dev->name, ret); in cdns_dsi_attach()
977 output->dev = dev; in cdns_dsi_attach()
978 output->bridge = bridge; in cdns_dsi_attach()
979 output->panel = panel; in cdns_dsi_attach()
982 * The DSI output has been properly configured, we can now safely in cdns_dsi_attach()
986 drm_bridge_add(&input->bridge); in cdns_dsi_attach()
994 struct cdns_dsi *dsi = to_cdns_dsi(host); in cdns_dsi_detach() local
995 struct cdns_dsi_output *output = &dsi->output; in cdns_dsi_detach()
996 struct cdns_dsi_input *input = &dsi->input; in cdns_dsi_detach()
998 drm_bridge_remove(&input->bridge); in cdns_dsi_detach()
999 if (output->panel) in cdns_dsi_detach()
1000 drm_panel_bridge_remove(output->bridge); in cdns_dsi_detach()
1007 struct cdns_dsi *dsi = data; in cdns_dsi_interrupt() local
1011 flag = readl(dsi->regs + DIRECT_CMD_STS_FLAG); in cdns_dsi_interrupt()
1013 ctl = readl(dsi->regs + DIRECT_CMD_STS_CTL); in cdns_dsi_interrupt()
1015 writel(ctl, dsi->regs + DIRECT_CMD_STS_CTL); in cdns_dsi_interrupt()
1016 complete(&dsi->direct_cmd_comp); in cdns_dsi_interrupt()
1026 struct cdns_dsi *dsi = to_cdns_dsi(host); in cdns_dsi_transfer() local
1031 ret = pm_runtime_resume_and_get(host->dev); in cdns_dsi_transfer()
1035 cdns_dsi_init_link(dsi); in cdns_dsi_transfer()
1041 tx_len = msg->tx_buf ? msg->tx_len : 0; in cdns_dsi_transfer()
1042 rx_len = msg->rx_buf ? msg->rx_len : 0; in cdns_dsi_transfer()
1046 ret = -ENOTSUPP; in cdns_dsi_transfer()
1051 if (tx_len > dsi->direct_cmd_fifo_depth) { in cdns_dsi_transfer()
1052 ret = -ENOTSUPP; in cdns_dsi_transfer()
1057 if (rx_len > dsi->rx_fifo_depth) { in cdns_dsi_transfer()
1058 ret = -ENOTSUPP; in cdns_dsi_transfer()
1062 cmd = CMD_SIZE(tx_len) | CMD_VCHAN_ID(msg->channel) | in cdns_dsi_transfer()
1063 CMD_DATATYPE(msg->type); in cdns_dsi_transfer()
1065 if (msg->flags & MIPI_DSI_MSG_USE_LPM) in cdns_dsi_transfer()
1068 if (mipi_dsi_packet_format_is_long(msg->type)) in cdns_dsi_transfer()
1075 } else if (msg->flags & MIPI_DSI_MSG_REQ_ACK) { in cdns_dsi_transfer()
1081 writel(readl(dsi->regs + MCTL_MAIN_DATA_CTL) | ctl, in cdns_dsi_transfer()
1082 dsi->regs + MCTL_MAIN_DATA_CTL); in cdns_dsi_transfer()
1084 writel(cmd, dsi->regs + DIRECT_CMD_MAIN_SETTINGS); in cdns_dsi_transfer()
1087 const u8 *buf = msg->tx_buf; in cdns_dsi_transfer()
1094 writel(val, dsi->regs + DIRECT_CMD_WRDATA); in cdns_dsi_transfer()
1098 writel(wait, dsi->regs + DIRECT_CMD_STS_CLR); in cdns_dsi_transfer()
1099 writel(wait, dsi->regs + DIRECT_CMD_STS_CTL); in cdns_dsi_transfer()
1100 reinit_completion(&dsi->direct_cmd_comp); in cdns_dsi_transfer()
1101 writel(0, dsi->regs + DIRECT_CMD_SEND); in cdns_dsi_transfer()
1103 wait_for_completion_timeout(&dsi->direct_cmd_comp, in cdns_dsi_transfer()
1106 sts = readl(dsi->regs + DIRECT_CMD_STS); in cdns_dsi_transfer()
1107 writel(wait, dsi->regs + DIRECT_CMD_STS_CLR); in cdns_dsi_transfer()
1108 writel(0, dsi->regs + DIRECT_CMD_STS_CTL); in cdns_dsi_transfer()
1110 writel(readl(dsi->regs + MCTL_MAIN_DATA_CTL) & ~ctl, in cdns_dsi_transfer()
1111 dsi->regs + MCTL_MAIN_DATA_CTL); in cdns_dsi_transfer()
1115 ret = -ETIMEDOUT; in cdns_dsi_transfer()
1121 ret = -EIO; in cdns_dsi_transfer()
1126 u8 *buf = msg->rx_buf; in cdns_dsi_transfer()
1129 val = readl(dsi->regs + DIRECT_CMD_RDDATA); in cdns_dsi_transfer()
1135 pm_runtime_put(host->dev); in cdns_dsi_transfer()
1147 struct cdns_dsi *dsi = dev_get_drvdata(dev); in cdns_dsi_resume() local
1149 reset_control_deassert(dsi->dsi_p_rst); in cdns_dsi_resume()
1150 clk_prepare_enable(dsi->dsi_p_clk); in cdns_dsi_resume()
1151 clk_prepare_enable(dsi->dsi_sys_clk); in cdns_dsi_resume()
1158 struct cdns_dsi *dsi = dev_get_drvdata(dev); in cdns_dsi_suspend() local
1160 clk_disable_unprepare(dsi->dsi_sys_clk); in cdns_dsi_suspend()
1161 clk_disable_unprepare(dsi->dsi_p_clk); in cdns_dsi_suspend()
1162 reset_control_assert(dsi->dsi_p_rst); in cdns_dsi_suspend()
1163 dsi->link_initialized = false; in cdns_dsi_suspend()
1172 struct cdns_dsi *dsi; in cdns_dsi_drm_probe() local
1178 dsi = devm_kzalloc(&pdev->dev, sizeof(*dsi), GFP_KERNEL); in cdns_dsi_drm_probe()
1179 if (!dsi) in cdns_dsi_drm_probe()
1180 return -ENOMEM; in cdns_dsi_drm_probe()
1182 platform_set_drvdata(pdev, dsi); in cdns_dsi_drm_probe()
1184 input = &dsi->input; in cdns_dsi_drm_probe()
1187 dsi->regs = devm_ioremap_resource(&pdev->dev, res); in cdns_dsi_drm_probe()
1188 if (IS_ERR(dsi->regs)) in cdns_dsi_drm_probe()
1189 return PTR_ERR(dsi->regs); in cdns_dsi_drm_probe()
1191 dsi->dsi_p_clk = devm_clk_get(&pdev->dev, "dsi_p_clk"); in cdns_dsi_drm_probe()
1192 if (IS_ERR(dsi->dsi_p_clk)) in cdns_dsi_drm_probe()
1193 return PTR_ERR(dsi->dsi_p_clk); in cdns_dsi_drm_probe()
1195 dsi->dsi_p_rst = devm_reset_control_get_optional_exclusive(&pdev->dev, in cdns_dsi_drm_probe()
1197 if (IS_ERR(dsi->dsi_p_rst)) in cdns_dsi_drm_probe()
1198 return PTR_ERR(dsi->dsi_p_rst); in cdns_dsi_drm_probe()
1200 dsi->dsi_sys_clk = devm_clk_get(&pdev->dev, "dsi_sys_clk"); in cdns_dsi_drm_probe()
1201 if (IS_ERR(dsi->dsi_sys_clk)) in cdns_dsi_drm_probe()
1202 return PTR_ERR(dsi->dsi_sys_clk); in cdns_dsi_drm_probe()
1208 dsi->dphy = devm_phy_get(&pdev->dev, "dphy"); in cdns_dsi_drm_probe()
1209 if (IS_ERR(dsi->dphy)) in cdns_dsi_drm_probe()
1210 return PTR_ERR(dsi->dphy); in cdns_dsi_drm_probe()
1212 ret = clk_prepare_enable(dsi->dsi_p_clk); in cdns_dsi_drm_probe()
1216 val = readl(dsi->regs + ID_REG); in cdns_dsi_drm_probe()
1218 dev_err(&pdev->dev, "invalid vendor id\n"); in cdns_dsi_drm_probe()
1219 ret = -EINVAL; in cdns_dsi_drm_probe()
1223 val = readl(dsi->regs + IP_CONF); in cdns_dsi_drm_probe()
1224 dsi->direct_cmd_fifo_depth = 1 << (DIRCMD_FIFO_DEPTH(val) + 2); in cdns_dsi_drm_probe()
1225 dsi->rx_fifo_depth = RX_FIFO_DEPTH(val); in cdns_dsi_drm_probe()
1226 init_completion(&dsi->direct_cmd_comp); in cdns_dsi_drm_probe()
1228 writel(0, dsi->regs + MCTL_MAIN_DATA_CTL); in cdns_dsi_drm_probe()
1229 writel(0, dsi->regs + MCTL_MAIN_EN); in cdns_dsi_drm_probe()
1230 writel(0, dsi->regs + MCTL_MAIN_PHY_CTL); in cdns_dsi_drm_probe()
1233 * We only support the DPI input, so force input->id to in cdns_dsi_drm_probe()
1236 input->id = CDNS_DPI_INPUT; in cdns_dsi_drm_probe()
1237 input->bridge.funcs = &cdns_dsi_bridge_funcs; in cdns_dsi_drm_probe()
1238 input->bridge.of_node = pdev->dev.of_node; in cdns_dsi_drm_probe()
1241 writel(0, dsi->regs + MCTL_MAIN_STS_CTL); in cdns_dsi_drm_probe()
1242 writel(0, dsi->regs + MCTL_DPHY_ERR_CTL1); in cdns_dsi_drm_probe()
1243 writel(0, dsi->regs + CMD_MODE_STS_CTL); in cdns_dsi_drm_probe()
1244 writel(0, dsi->regs + DIRECT_CMD_STS_CTL); in cdns_dsi_drm_probe()
1245 writel(0, dsi->regs + DIRECT_CMD_RD_STS_CTL); in cdns_dsi_drm_probe()
1246 writel(0, dsi->regs + VID_MODE_STS_CTL); in cdns_dsi_drm_probe()
1247 writel(0, dsi->regs + TVG_STS_CTL); in cdns_dsi_drm_probe()
1248 writel(0, dsi->regs + DPI_IRQ_EN); in cdns_dsi_drm_probe()
1249 ret = devm_request_irq(&pdev->dev, irq, cdns_dsi_interrupt, 0, in cdns_dsi_drm_probe()
1250 dev_name(&pdev->dev), dsi); in cdns_dsi_drm_probe()
1254 pm_runtime_enable(&pdev->dev); in cdns_dsi_drm_probe()
1255 dsi->base.dev = &pdev->dev; in cdns_dsi_drm_probe()
1256 dsi->base.ops = &cdns_dsi_ops; in cdns_dsi_drm_probe()
1258 ret = mipi_dsi_host_register(&dsi->base); in cdns_dsi_drm_probe()
1262 clk_disable_unprepare(dsi->dsi_p_clk); in cdns_dsi_drm_probe()
1267 pm_runtime_disable(&pdev->dev); in cdns_dsi_drm_probe()
1270 clk_disable_unprepare(dsi->dsi_p_clk); in cdns_dsi_drm_probe()
1277 struct cdns_dsi *dsi = platform_get_drvdata(pdev); in cdns_dsi_drm_remove() local
1279 mipi_dsi_host_unregister(&dsi->base); in cdns_dsi_drm_remove()
1280 pm_runtime_disable(&pdev->dev); in cdns_dsi_drm_remove()
1286 { .compatible = "cdns,dsi" },
1295 .name = "cdns-dsi",
1303 MODULE_DESCRIPTION("Cadence DSI driver");
1305 MODULE_ALIAS("platform:cdns-dsi");