Lines Matching full:dsi
25 #include "cdns-dsi-core.h"
27 #include "cdns-dsi-j721e.h"
467 static int cdns_dsi_mode2cfg(struct cdns_dsi *dsi, in cdns_dsi_mode2cfg() argument
472 struct cdns_dsi_output *output = &dsi->output; in cdns_dsi_mode2cfg()
513 static int cdns_dsi_adjust_phy_config(struct cdns_dsi *dsi, in cdns_dsi_adjust_phy_config() argument
519 struct cdns_dsi_output *output = &dsi->output; in cdns_dsi_adjust_phy_config()
536 * Make sure DSI htotal is aligned on a lane boundary when calculating in cdns_dsi_adjust_phy_config()
562 static int cdns_dsi_check_conf(struct cdns_dsi *dsi, in cdns_dsi_check_conf() argument
567 struct cdns_dsi_output *output = &dsi->output; in cdns_dsi_check_conf()
573 ret = cdns_dsi_mode2cfg(dsi, mode, dsi_cfg, mode_valid_check); in cdns_dsi_check_conf()
581 ret = cdns_dsi_adjust_phy_config(dsi, dsi_cfg, phy_cfg, mode, mode_valid_check); in cdns_dsi_check_conf()
585 ret = phy_validate(dsi->dphy, PHY_MODE_MIPI_DPHY, 0, &output->phy_opts); in cdns_dsi_check_conf()
594 * Make sure DPI(HFP) > DSI(HSS+HSA+HSE+HBP) to guarantee that the FIFO in cdns_dsi_check_conf()
611 struct cdns_dsi *dsi = input_to_dsi(input); in cdns_dsi_bridge_attach() local
612 struct cdns_dsi_output *output = &dsi->output; in cdns_dsi_bridge_attach()
615 dev_err(dsi->base.dev, in cdns_dsi_bridge_attach()
616 "cdns-dsi driver is only compatible with DRM devices supporting atomic updates"); in cdns_dsi_bridge_attach()
630 struct cdns_dsi *dsi = input_to_dsi(input); in cdns_dsi_bridge_mode_valid() local
631 struct cdns_dsi_output *output = &dsi->output; in cdns_dsi_bridge_mode_valid()
651 ret = cdns_dsi_check_conf(dsi, mode, &dsi_cfg, true); in cdns_dsi_bridge_mode_valid()
661 struct cdns_dsi *dsi = input_to_dsi(input); in cdns_dsi_bridge_disable() local
664 val = readl(dsi->regs + MCTL_MAIN_DATA_CTL); in cdns_dsi_bridge_disable()
667 writel(val, dsi->regs + MCTL_MAIN_DATA_CTL); in cdns_dsi_bridge_disable()
669 val = readl(dsi->regs + MCTL_MAIN_EN) & ~IF_EN(input->id); in cdns_dsi_bridge_disable()
670 writel(val, dsi->regs + MCTL_MAIN_EN); in cdns_dsi_bridge_disable()
672 if (dsi->platform_ops && dsi->platform_ops->disable) in cdns_dsi_bridge_disable()
673 dsi->platform_ops->disable(dsi); in cdns_dsi_bridge_disable()
675 pm_runtime_put(dsi->base.dev); in cdns_dsi_bridge_disable()
681 struct cdns_dsi *dsi = input_to_dsi(input); in cdns_dsi_bridge_post_disable() local
683 pm_runtime_put(dsi->base.dev); in cdns_dsi_bridge_post_disable()
686 static void cdns_dsi_hs_init(struct cdns_dsi *dsi) in cdns_dsi_hs_init() argument
688 struct cdns_dsi_output *output = &dsi->output; in cdns_dsi_hs_init()
691 if (dsi->phy_initialized) in cdns_dsi_hs_init()
699 dsi->regs + MCTL_DPHY_CFG0); in cdns_dsi_hs_init()
701 phy_init(dsi->dphy); in cdns_dsi_hs_init()
702 phy_set_mode(dsi->dphy, PHY_MODE_MIPI_DPHY); in cdns_dsi_hs_init()
703 phy_configure(dsi->dphy, &output->phy_opts); in cdns_dsi_hs_init()
704 phy_power_on(dsi->dphy); in cdns_dsi_hs_init()
707 writel(PLL_LOCKED, dsi->regs + MCTL_MAIN_STS_CLR); in cdns_dsi_hs_init()
709 dsi->regs + MCTL_DPHY_CFG0); in cdns_dsi_hs_init()
710 WARN_ON_ONCE(readl_poll_timeout(dsi->regs + MCTL_MAIN_STS, status, in cdns_dsi_hs_init()
715 dsi->regs + MCTL_DPHY_CFG0); in cdns_dsi_hs_init()
716 dsi->phy_initialized = true; in cdns_dsi_hs_init()
719 static void cdns_dsi_init_link(struct cdns_dsi *dsi) in cdns_dsi_init_link() argument
721 struct cdns_dsi_output *output = &dsi->output; in cdns_dsi_init_link()
726 if (dsi->link_initialized) in cdns_dsi_init_link()
736 writel(val, dsi->regs + MCTL_MAIN_PHY_CTL); in cdns_dsi_init_link()
739 sysclk_period = NSEC_PER_SEC / clk_get_rate(dsi->dsi_sys_clk); in cdns_dsi_init_link()
742 dsi->regs + MCTL_ULPOUT_TIME); in cdns_dsi_init_link()
744 writel(LINK_EN, dsi->regs + MCTL_MAIN_DATA_CTL); in cdns_dsi_init_link()
750 writel(val, dsi->regs + MCTL_MAIN_EN); in cdns_dsi_init_link()
752 dsi->link_initialized = true; in cdns_dsi_init_link()
758 struct cdns_dsi *dsi = input_to_dsi(input); in cdns_dsi_bridge_enable() local
759 struct cdns_dsi_output *output = &dsi->output; in cdns_dsi_bridge_enable()
767 if (WARN_ON(pm_runtime_get_sync(dsi->base.dev) < 0)) in cdns_dsi_bridge_enable()
770 if (dsi->platform_ops && dsi->platform_ops->enable) in cdns_dsi_bridge_enable()
771 dsi->platform_ops->enable(dsi); in cdns_dsi_bridge_enable()
776 WARN_ON_ONCE(cdns_dsi_check_conf(dsi, mode, &dsi_cfg, false)); in cdns_dsi_bridge_enable()
778 cdns_dsi_hs_init(dsi); in cdns_dsi_bridge_enable()
779 cdns_dsi_init_link(dsi); in cdns_dsi_bridge_enable()
782 dsi->regs + VID_HSIZE1); in cdns_dsi_bridge_enable()
784 dsi->regs + VID_HSIZE2); in cdns_dsi_bridge_enable()
789 dsi->regs + VID_VSIZE1); in cdns_dsi_bridge_enable()
790 writel(mode->crtc_vdisplay, dsi->regs + VID_VSIZE2); in cdns_dsi_bridge_enable()
795 writel(BLK_LINE_PULSE_PKT_LEN(tmp), dsi->regs + VID_BLKSIZE2); in cdns_dsi_bridge_enable()
798 dsi->regs + VID_VCA_SETTING2); in cdns_dsi_bridge_enable()
802 writel(BLK_LINE_EVENT_PKT_LEN(tmp), dsi->regs + VID_BLKSIZE1); in cdns_dsi_bridge_enable()
805 dsi->regs + VID_VCA_SETTING2); in cdns_dsi_bridge_enable()
817 dsi->regs + VID_DPHY_TIME); in cdns_dsi_bridge_enable()
838 dsi->regs + MCTL_DPHY_TIMEOUT1); in cdns_dsi_bridge_enable()
840 writel(LPRX_TIMEOUT(tmp), dsi->regs + MCTL_DPHY_TIMEOUT2); in cdns_dsi_bridge_enable()
865 dev_err(dsi->base.dev, "Unsupported DSI format\n"); in cdns_dsi_bridge_enable()
877 writel(tmp, dsi->regs + VID_MAIN_CTL); in cdns_dsi_bridge_enable()
880 tmp = readl(dsi->regs + MCTL_MAIN_DATA_CTL); in cdns_dsi_bridge_enable()
889 writel(tmp, dsi->regs + MCTL_MAIN_DATA_CTL); in cdns_dsi_bridge_enable()
891 tmp = readl(dsi->regs + MCTL_MAIN_EN) | IF_EN(input->id); in cdns_dsi_bridge_enable()
892 writel(tmp, dsi->regs + MCTL_MAIN_EN); in cdns_dsi_bridge_enable()
898 struct cdns_dsi *dsi = input_to_dsi(input); in cdns_dsi_bridge_pre_enable() local
900 if (WARN_ON(pm_runtime_get_sync(dsi->base.dev) < 0)) in cdns_dsi_bridge_pre_enable()
903 cdns_dsi_init_link(dsi); in cdns_dsi_bridge_pre_enable()
904 cdns_dsi_hs_init(dsi); in cdns_dsi_bridge_pre_enable()
919 struct cdns_dsi *dsi = to_cdns_dsi(host); in cdns_dsi_attach() local
920 struct cdns_dsi_output *output = &dsi->output; in cdns_dsi_attach()
921 struct cdns_dsi_input *input = &dsi->input; in cdns_dsi_attach()
928 * We currently do not support connecting several DSI devices to the in cdns_dsi_attach()
945 np = of_graph_get_remote_node(dsi->base.dev->of_node, DSI_OUTPUT_PORT, in cdns_dsi_attach()
964 dev_err(host->dev, "failed to add DSI device %s (err = %d)", in cdns_dsi_attach()
974 * The DSI output has been properly configured, we can now safely in cdns_dsi_attach()
986 struct cdns_dsi *dsi = to_cdns_dsi(host); in cdns_dsi_detach() local
987 struct cdns_dsi_output *output = &dsi->output; in cdns_dsi_detach()
988 struct cdns_dsi_input *input = &dsi->input; in cdns_dsi_detach()
999 struct cdns_dsi *dsi = data; in cdns_dsi_interrupt() local
1003 flag = readl(dsi->regs + DIRECT_CMD_STS_FLAG); in cdns_dsi_interrupt()
1005 ctl = readl(dsi->regs + DIRECT_CMD_STS_CTL); in cdns_dsi_interrupt()
1007 writel(ctl, dsi->regs + DIRECT_CMD_STS_CTL); in cdns_dsi_interrupt()
1008 complete(&dsi->direct_cmd_comp); in cdns_dsi_interrupt()
1018 struct cdns_dsi *dsi = to_cdns_dsi(host); in cdns_dsi_transfer() local
1027 cdns_dsi_init_link(dsi); in cdns_dsi_transfer()
1043 if (tx_len > dsi->direct_cmd_fifo_depth) { in cdns_dsi_transfer()
1049 if (rx_len > dsi->rx_fifo_depth) { in cdns_dsi_transfer()
1073 writel(readl(dsi->regs + MCTL_MAIN_DATA_CTL) | ctl, in cdns_dsi_transfer()
1074 dsi->regs + MCTL_MAIN_DATA_CTL); in cdns_dsi_transfer()
1076 writel(cmd, dsi->regs + DIRECT_CMD_MAIN_SETTINGS); in cdns_dsi_transfer()
1086 writel(val, dsi->regs + DIRECT_CMD_WRDATA); in cdns_dsi_transfer()
1090 writel(wait, dsi->regs + DIRECT_CMD_STS_CLR); in cdns_dsi_transfer()
1091 writel(wait, dsi->regs + DIRECT_CMD_STS_CTL); in cdns_dsi_transfer()
1092 reinit_completion(&dsi->direct_cmd_comp); in cdns_dsi_transfer()
1093 writel(0, dsi->regs + DIRECT_CMD_SEND); in cdns_dsi_transfer()
1095 wait_for_completion_timeout(&dsi->direct_cmd_comp, in cdns_dsi_transfer()
1098 sts = readl(dsi->regs + DIRECT_CMD_STS); in cdns_dsi_transfer()
1099 writel(wait, dsi->regs + DIRECT_CMD_STS_CLR); in cdns_dsi_transfer()
1100 writel(0, dsi->regs + DIRECT_CMD_STS_CTL); in cdns_dsi_transfer()
1102 writel(readl(dsi->regs + MCTL_MAIN_DATA_CTL) & ~ctl, in cdns_dsi_transfer()
1103 dsi->regs + MCTL_MAIN_DATA_CTL); in cdns_dsi_transfer()
1121 val = readl(dsi->regs + DIRECT_CMD_RDDATA); in cdns_dsi_transfer()
1139 struct cdns_dsi *dsi = dev_get_drvdata(dev); in cdns_dsi_resume() local
1141 reset_control_deassert(dsi->dsi_p_rst); in cdns_dsi_resume()
1142 clk_prepare_enable(dsi->dsi_p_clk); in cdns_dsi_resume()
1143 clk_prepare_enable(dsi->dsi_sys_clk); in cdns_dsi_resume()
1150 struct cdns_dsi *dsi = dev_get_drvdata(dev); in cdns_dsi_suspend() local
1152 clk_disable_unprepare(dsi->dsi_sys_clk); in cdns_dsi_suspend()
1153 clk_disable_unprepare(dsi->dsi_p_clk); in cdns_dsi_suspend()
1154 reset_control_assert(dsi->dsi_p_rst); in cdns_dsi_suspend()
1155 dsi->link_initialized = false; in cdns_dsi_suspend()
1164 struct cdns_dsi *dsi; in cdns_dsi_drm_probe() local
1169 dsi = devm_kzalloc(&pdev->dev, sizeof(*dsi), GFP_KERNEL); in cdns_dsi_drm_probe()
1170 if (!dsi) in cdns_dsi_drm_probe()
1173 platform_set_drvdata(pdev, dsi); in cdns_dsi_drm_probe()
1175 input = &dsi->input; in cdns_dsi_drm_probe()
1177 dsi->regs = devm_platform_ioremap_resource(pdev, 0); in cdns_dsi_drm_probe()
1178 if (IS_ERR(dsi->regs)) in cdns_dsi_drm_probe()
1179 return PTR_ERR(dsi->regs); in cdns_dsi_drm_probe()
1181 dsi->dsi_p_clk = devm_clk_get(&pdev->dev, "dsi_p_clk"); in cdns_dsi_drm_probe()
1182 if (IS_ERR(dsi->dsi_p_clk)) in cdns_dsi_drm_probe()
1183 return PTR_ERR(dsi->dsi_p_clk); in cdns_dsi_drm_probe()
1185 dsi->dsi_p_rst = devm_reset_control_get_optional_exclusive(&pdev->dev, in cdns_dsi_drm_probe()
1187 if (IS_ERR(dsi->dsi_p_rst)) in cdns_dsi_drm_probe()
1188 return PTR_ERR(dsi->dsi_p_rst); in cdns_dsi_drm_probe()
1190 dsi->dsi_sys_clk = devm_clk_get(&pdev->dev, "dsi_sys_clk"); in cdns_dsi_drm_probe()
1191 if (IS_ERR(dsi->dsi_sys_clk)) in cdns_dsi_drm_probe()
1192 return PTR_ERR(dsi->dsi_sys_clk); in cdns_dsi_drm_probe()
1198 dsi->dphy = devm_phy_get(&pdev->dev, "dphy"); in cdns_dsi_drm_probe()
1199 if (IS_ERR(dsi->dphy)) in cdns_dsi_drm_probe()
1200 return PTR_ERR(dsi->dphy); in cdns_dsi_drm_probe()
1202 ret = clk_prepare_enable(dsi->dsi_p_clk); in cdns_dsi_drm_probe()
1206 val = readl(dsi->regs + ID_REG); in cdns_dsi_drm_probe()
1213 dsi->platform_ops = of_device_get_match_data(&pdev->dev); in cdns_dsi_drm_probe()
1215 val = readl(dsi->regs + IP_CONF); in cdns_dsi_drm_probe()
1216 dsi->direct_cmd_fifo_depth = 1 << (DIRCMD_FIFO_DEPTH(val) + 2); in cdns_dsi_drm_probe()
1217 dsi->rx_fifo_depth = RX_FIFO_DEPTH(val); in cdns_dsi_drm_probe()
1218 init_completion(&dsi->direct_cmd_comp); in cdns_dsi_drm_probe()
1220 writel(0, dsi->regs + MCTL_MAIN_DATA_CTL); in cdns_dsi_drm_probe()
1221 writel(0, dsi->regs + MCTL_MAIN_EN); in cdns_dsi_drm_probe()
1222 writel(0, dsi->regs + MCTL_MAIN_PHY_CTL); in cdns_dsi_drm_probe()
1233 writel(0, dsi->regs + MCTL_MAIN_STS_CTL); in cdns_dsi_drm_probe()
1234 writel(0, dsi->regs + MCTL_DPHY_ERR_CTL1); in cdns_dsi_drm_probe()
1235 writel(0, dsi->regs + CMD_MODE_STS_CTL); in cdns_dsi_drm_probe()
1236 writel(0, dsi->regs + DIRECT_CMD_STS_CTL); in cdns_dsi_drm_probe()
1237 writel(0, dsi->regs + DIRECT_CMD_RD_STS_CTL); in cdns_dsi_drm_probe()
1238 writel(0, dsi->regs + VID_MODE_STS_CTL); in cdns_dsi_drm_probe()
1239 writel(0, dsi->regs + TVG_STS_CTL); in cdns_dsi_drm_probe()
1240 writel(0, dsi->regs + DPI_IRQ_EN); in cdns_dsi_drm_probe()
1242 dev_name(&pdev->dev), dsi); in cdns_dsi_drm_probe()
1247 dsi->base.dev = &pdev->dev; in cdns_dsi_drm_probe()
1248 dsi->base.ops = &cdns_dsi_ops; in cdns_dsi_drm_probe()
1250 if (dsi->platform_ops && dsi->platform_ops->init) { in cdns_dsi_drm_probe()
1251 ret = dsi->platform_ops->init(dsi); in cdns_dsi_drm_probe()
1259 ret = mipi_dsi_host_register(&dsi->base); in cdns_dsi_drm_probe()
1263 clk_disable_unprepare(dsi->dsi_p_clk); in cdns_dsi_drm_probe()
1268 if (dsi->platform_ops && dsi->platform_ops->deinit) in cdns_dsi_drm_probe()
1269 dsi->platform_ops->deinit(dsi); in cdns_dsi_drm_probe()
1275 clk_disable_unprepare(dsi->dsi_p_clk); in cdns_dsi_drm_probe()
1282 struct cdns_dsi *dsi = platform_get_drvdata(pdev); in cdns_dsi_drm_remove() local
1284 mipi_dsi_host_unregister(&dsi->base); in cdns_dsi_drm_remove()
1286 if (dsi->platform_ops && dsi->platform_ops->deinit) in cdns_dsi_drm_remove()
1287 dsi->platform_ops->deinit(dsi); in cdns_dsi_drm_remove()
1293 { .compatible = "cdns,dsi" },
1295 { .compatible = "ti,j721e-dsi", .data = &dsi_ti_j721e_ops, },
1305 .name = "cdns-dsi",
1313 MODULE_DESCRIPTION("Cadence DSI driver");
1315 MODULE_ALIAS("platform:cdns-dsi");