Lines Matching full:dsi
508 static int cdns_dsi_mode2cfg(struct cdns_dsi *dsi, in cdns_dsi_mode2cfg() argument
513 struct cdns_dsi_output *output = &dsi->output; in cdns_dsi_mode2cfg()
554 static int cdns_dsi_adjust_phy_config(struct cdns_dsi *dsi, in cdns_dsi_adjust_phy_config() argument
560 struct cdns_dsi_output *output = &dsi->output; in cdns_dsi_adjust_phy_config()
577 * Make sure DSI htotal is aligned on a lane boundary when calculating in cdns_dsi_adjust_phy_config()
603 static int cdns_dsi_check_conf(struct cdns_dsi *dsi, in cdns_dsi_check_conf() argument
608 struct cdns_dsi_output *output = &dsi->output; in cdns_dsi_check_conf()
614 ret = cdns_dsi_mode2cfg(dsi, mode, dsi_cfg, mode_valid_check); in cdns_dsi_check_conf()
622 ret = cdns_dsi_adjust_phy_config(dsi, dsi_cfg, phy_cfg, mode, mode_valid_check); in cdns_dsi_check_conf()
626 ret = phy_validate(dsi->dphy, PHY_MODE_MIPI_DPHY, 0, &output->phy_opts); in cdns_dsi_check_conf()
635 * Make sure DPI(HFP) > DSI(HSS+HSA+HSE+HBP) to guarantee that the FIFO in cdns_dsi_check_conf()
652 struct cdns_dsi *dsi = input_to_dsi(input); in cdns_dsi_bridge_attach() local
653 struct cdns_dsi_output *output = &dsi->output; in cdns_dsi_bridge_attach()
656 dev_err(dsi->base.dev, in cdns_dsi_bridge_attach()
657 "cdns-dsi driver is only compatible with DRM devices supporting atomic updates"); in cdns_dsi_bridge_attach()
671 struct cdns_dsi *dsi = input_to_dsi(input); in cdns_dsi_bridge_mode_valid() local
672 struct cdns_dsi_output *output = &dsi->output; in cdns_dsi_bridge_mode_valid()
692 ret = cdns_dsi_check_conf(dsi, mode, &dsi_cfg, true); in cdns_dsi_bridge_mode_valid()
702 struct cdns_dsi *dsi = input_to_dsi(input); in cdns_dsi_bridge_disable() local
705 val = readl(dsi->regs + MCTL_MAIN_DATA_CTL); in cdns_dsi_bridge_disable()
708 writel(val, dsi->regs + MCTL_MAIN_DATA_CTL); in cdns_dsi_bridge_disable()
710 val = readl(dsi->regs + MCTL_MAIN_EN) & ~IF_EN(input->id); in cdns_dsi_bridge_disable()
711 writel(val, dsi->regs + MCTL_MAIN_EN); in cdns_dsi_bridge_disable()
712 pm_runtime_put(dsi->base.dev); in cdns_dsi_bridge_disable()
718 struct cdns_dsi *dsi = input_to_dsi(input); in cdns_dsi_bridge_post_disable() local
720 pm_runtime_put(dsi->base.dev); in cdns_dsi_bridge_post_disable()
723 static void cdns_dsi_hs_init(struct cdns_dsi *dsi) in cdns_dsi_hs_init() argument
725 struct cdns_dsi_output *output = &dsi->output; in cdns_dsi_hs_init()
728 if (dsi->phy_initialized) in cdns_dsi_hs_init()
736 dsi->regs + MCTL_DPHY_CFG0); in cdns_dsi_hs_init()
738 phy_init(dsi->dphy); in cdns_dsi_hs_init()
739 phy_set_mode(dsi->dphy, PHY_MODE_MIPI_DPHY); in cdns_dsi_hs_init()
740 phy_configure(dsi->dphy, &output->phy_opts); in cdns_dsi_hs_init()
741 phy_power_on(dsi->dphy); in cdns_dsi_hs_init()
744 writel(PLL_LOCKED, dsi->regs + MCTL_MAIN_STS_CLR); in cdns_dsi_hs_init()
746 dsi->regs + MCTL_DPHY_CFG0); in cdns_dsi_hs_init()
747 WARN_ON_ONCE(readl_poll_timeout(dsi->regs + MCTL_MAIN_STS, status, in cdns_dsi_hs_init()
752 dsi->regs + MCTL_DPHY_CFG0); in cdns_dsi_hs_init()
753 dsi->phy_initialized = true; in cdns_dsi_hs_init()
756 static void cdns_dsi_init_link(struct cdns_dsi *dsi) in cdns_dsi_init_link() argument
758 struct cdns_dsi_output *output = &dsi->output; in cdns_dsi_init_link()
763 if (dsi->link_initialized) in cdns_dsi_init_link()
773 writel(val, dsi->regs + MCTL_MAIN_PHY_CTL); in cdns_dsi_init_link()
776 sysclk_period = NSEC_PER_SEC / clk_get_rate(dsi->dsi_sys_clk); in cdns_dsi_init_link()
779 dsi->regs + MCTL_ULPOUT_TIME); in cdns_dsi_init_link()
781 writel(LINK_EN, dsi->regs + MCTL_MAIN_DATA_CTL); in cdns_dsi_init_link()
787 writel(val, dsi->regs + MCTL_MAIN_EN); in cdns_dsi_init_link()
789 dsi->link_initialized = true; in cdns_dsi_init_link()
795 struct cdns_dsi *dsi = input_to_dsi(input); in cdns_dsi_bridge_enable() local
796 struct cdns_dsi_output *output = &dsi->output; in cdns_dsi_bridge_enable()
804 if (WARN_ON(pm_runtime_get_sync(dsi->base.dev) < 0)) in cdns_dsi_bridge_enable()
810 WARN_ON_ONCE(cdns_dsi_check_conf(dsi, mode, &dsi_cfg, false)); in cdns_dsi_bridge_enable()
812 cdns_dsi_hs_init(dsi); in cdns_dsi_bridge_enable()
813 cdns_dsi_init_link(dsi); in cdns_dsi_bridge_enable()
816 dsi->regs + VID_HSIZE1); in cdns_dsi_bridge_enable()
818 dsi->regs + VID_HSIZE2); in cdns_dsi_bridge_enable()
823 dsi->regs + VID_VSIZE1); in cdns_dsi_bridge_enable()
824 writel(mode->crtc_vdisplay, dsi->regs + VID_VSIZE2); in cdns_dsi_bridge_enable()
829 writel(BLK_LINE_PULSE_PKT_LEN(tmp), dsi->regs + VID_BLKSIZE2); in cdns_dsi_bridge_enable()
832 dsi->regs + VID_VCA_SETTING2); in cdns_dsi_bridge_enable()
836 writel(BLK_LINE_EVENT_PKT_LEN(tmp), dsi->regs + VID_BLKSIZE1); in cdns_dsi_bridge_enable()
839 dsi->regs + VID_VCA_SETTING2); in cdns_dsi_bridge_enable()
851 dsi->regs + VID_DPHY_TIME); in cdns_dsi_bridge_enable()
872 dsi->regs + MCTL_DPHY_TIMEOUT1); in cdns_dsi_bridge_enable()
874 writel(LPRX_TIMEOUT(tmp), dsi->regs + MCTL_DPHY_TIMEOUT2); in cdns_dsi_bridge_enable()
899 dev_err(dsi->base.dev, "Unsupported DSI format\n"); in cdns_dsi_bridge_enable()
911 writel(tmp, dsi->regs + VID_MAIN_CTL); in cdns_dsi_bridge_enable()
914 tmp = readl(dsi->regs + MCTL_MAIN_DATA_CTL); in cdns_dsi_bridge_enable()
923 writel(tmp, dsi->regs + MCTL_MAIN_DATA_CTL); in cdns_dsi_bridge_enable()
925 tmp = readl(dsi->regs + MCTL_MAIN_EN) | IF_EN(input->id); in cdns_dsi_bridge_enable()
926 writel(tmp, dsi->regs + MCTL_MAIN_EN); in cdns_dsi_bridge_enable()
932 struct cdns_dsi *dsi = input_to_dsi(input); in cdns_dsi_bridge_pre_enable() local
934 if (WARN_ON(pm_runtime_get_sync(dsi->base.dev) < 0)) in cdns_dsi_bridge_pre_enable()
937 cdns_dsi_init_link(dsi); in cdns_dsi_bridge_pre_enable()
938 cdns_dsi_hs_init(dsi); in cdns_dsi_bridge_pre_enable()
953 struct cdns_dsi *dsi = to_cdns_dsi(host); in cdns_dsi_attach() local
954 struct cdns_dsi_output *output = &dsi->output; in cdns_dsi_attach()
955 struct cdns_dsi_input *input = &dsi->input; in cdns_dsi_attach()
962 * We currently do not support connecting several DSI devices to the in cdns_dsi_attach()
979 np = of_graph_get_remote_node(dsi->base.dev->of_node, DSI_OUTPUT_PORT, in cdns_dsi_attach()
998 dev_err(host->dev, "failed to add DSI device %s (err = %d)", in cdns_dsi_attach()
1008 * The DSI output has been properly configured, we can now safely in cdns_dsi_attach()
1020 struct cdns_dsi *dsi = to_cdns_dsi(host); in cdns_dsi_detach() local
1021 struct cdns_dsi_output *output = &dsi->output; in cdns_dsi_detach()
1022 struct cdns_dsi_input *input = &dsi->input; in cdns_dsi_detach()
1033 struct cdns_dsi *dsi = data; in cdns_dsi_interrupt() local
1037 flag = readl(dsi->regs + DIRECT_CMD_STS_FLAG); in cdns_dsi_interrupt()
1039 ctl = readl(dsi->regs + DIRECT_CMD_STS_CTL); in cdns_dsi_interrupt()
1041 writel(ctl, dsi->regs + DIRECT_CMD_STS_CTL); in cdns_dsi_interrupt()
1042 complete(&dsi->direct_cmd_comp); in cdns_dsi_interrupt()
1052 struct cdns_dsi *dsi = to_cdns_dsi(host); in cdns_dsi_transfer() local
1061 cdns_dsi_init_link(dsi); in cdns_dsi_transfer()
1077 if (tx_len > dsi->direct_cmd_fifo_depth) { in cdns_dsi_transfer()
1083 if (rx_len > dsi->rx_fifo_depth) { in cdns_dsi_transfer()
1107 writel(readl(dsi->regs + MCTL_MAIN_DATA_CTL) | ctl, in cdns_dsi_transfer()
1108 dsi->regs + MCTL_MAIN_DATA_CTL); in cdns_dsi_transfer()
1110 writel(cmd, dsi->regs + DIRECT_CMD_MAIN_SETTINGS); in cdns_dsi_transfer()
1120 writel(val, dsi->regs + DIRECT_CMD_WRDATA); in cdns_dsi_transfer()
1124 writel(wait, dsi->regs + DIRECT_CMD_STS_CLR); in cdns_dsi_transfer()
1125 writel(wait, dsi->regs + DIRECT_CMD_STS_CTL); in cdns_dsi_transfer()
1126 reinit_completion(&dsi->direct_cmd_comp); in cdns_dsi_transfer()
1127 writel(0, dsi->regs + DIRECT_CMD_SEND); in cdns_dsi_transfer()
1129 wait_for_completion_timeout(&dsi->direct_cmd_comp, in cdns_dsi_transfer()
1132 sts = readl(dsi->regs + DIRECT_CMD_STS); in cdns_dsi_transfer()
1133 writel(wait, dsi->regs + DIRECT_CMD_STS_CLR); in cdns_dsi_transfer()
1134 writel(0, dsi->regs + DIRECT_CMD_STS_CTL); in cdns_dsi_transfer()
1136 writel(readl(dsi->regs + MCTL_MAIN_DATA_CTL) & ~ctl, in cdns_dsi_transfer()
1137 dsi->regs + MCTL_MAIN_DATA_CTL); in cdns_dsi_transfer()
1155 val = readl(dsi->regs + DIRECT_CMD_RDDATA); in cdns_dsi_transfer()
1173 struct cdns_dsi *dsi = dev_get_drvdata(dev); in cdns_dsi_resume() local
1175 reset_control_deassert(dsi->dsi_p_rst); in cdns_dsi_resume()
1176 clk_prepare_enable(dsi->dsi_p_clk); in cdns_dsi_resume()
1177 clk_prepare_enable(dsi->dsi_sys_clk); in cdns_dsi_resume()
1184 struct cdns_dsi *dsi = dev_get_drvdata(dev); in cdns_dsi_suspend() local
1186 clk_disable_unprepare(dsi->dsi_sys_clk); in cdns_dsi_suspend()
1187 clk_disable_unprepare(dsi->dsi_p_clk); in cdns_dsi_suspend()
1188 reset_control_assert(dsi->dsi_p_rst); in cdns_dsi_suspend()
1189 dsi->link_initialized = false; in cdns_dsi_suspend()
1198 struct cdns_dsi *dsi; in cdns_dsi_drm_probe() local
1203 dsi = devm_kzalloc(&pdev->dev, sizeof(*dsi), GFP_KERNEL); in cdns_dsi_drm_probe()
1204 if (!dsi) in cdns_dsi_drm_probe()
1207 platform_set_drvdata(pdev, dsi); in cdns_dsi_drm_probe()
1209 input = &dsi->input; in cdns_dsi_drm_probe()
1211 dsi->regs = devm_platform_ioremap_resource(pdev, 0); in cdns_dsi_drm_probe()
1212 if (IS_ERR(dsi->regs)) in cdns_dsi_drm_probe()
1213 return PTR_ERR(dsi->regs); in cdns_dsi_drm_probe()
1215 dsi->dsi_p_clk = devm_clk_get(&pdev->dev, "dsi_p_clk"); in cdns_dsi_drm_probe()
1216 if (IS_ERR(dsi->dsi_p_clk)) in cdns_dsi_drm_probe()
1217 return PTR_ERR(dsi->dsi_p_clk); in cdns_dsi_drm_probe()
1219 dsi->dsi_p_rst = devm_reset_control_get_optional_exclusive(&pdev->dev, in cdns_dsi_drm_probe()
1221 if (IS_ERR(dsi->dsi_p_rst)) in cdns_dsi_drm_probe()
1222 return PTR_ERR(dsi->dsi_p_rst); in cdns_dsi_drm_probe()
1224 dsi->dsi_sys_clk = devm_clk_get(&pdev->dev, "dsi_sys_clk"); in cdns_dsi_drm_probe()
1225 if (IS_ERR(dsi->dsi_sys_clk)) in cdns_dsi_drm_probe()
1226 return PTR_ERR(dsi->dsi_sys_clk); in cdns_dsi_drm_probe()
1232 dsi->dphy = devm_phy_get(&pdev->dev, "dphy"); in cdns_dsi_drm_probe()
1233 if (IS_ERR(dsi->dphy)) in cdns_dsi_drm_probe()
1234 return PTR_ERR(dsi->dphy); in cdns_dsi_drm_probe()
1236 ret = clk_prepare_enable(dsi->dsi_p_clk); in cdns_dsi_drm_probe()
1240 val = readl(dsi->regs + ID_REG); in cdns_dsi_drm_probe()
1247 val = readl(dsi->regs + IP_CONF); in cdns_dsi_drm_probe()
1248 dsi->direct_cmd_fifo_depth = 1 << (DIRCMD_FIFO_DEPTH(val) + 2); in cdns_dsi_drm_probe()
1249 dsi->rx_fifo_depth = RX_FIFO_DEPTH(val); in cdns_dsi_drm_probe()
1250 init_completion(&dsi->direct_cmd_comp); in cdns_dsi_drm_probe()
1252 writel(0, dsi->regs + MCTL_MAIN_DATA_CTL); in cdns_dsi_drm_probe()
1253 writel(0, dsi->regs + MCTL_MAIN_EN); in cdns_dsi_drm_probe()
1254 writel(0, dsi->regs + MCTL_MAIN_PHY_CTL); in cdns_dsi_drm_probe()
1265 writel(0, dsi->regs + MCTL_MAIN_STS_CTL); in cdns_dsi_drm_probe()
1266 writel(0, dsi->regs + MCTL_DPHY_ERR_CTL1); in cdns_dsi_drm_probe()
1267 writel(0, dsi->regs + CMD_MODE_STS_CTL); in cdns_dsi_drm_probe()
1268 writel(0, dsi->regs + DIRECT_CMD_STS_CTL); in cdns_dsi_drm_probe()
1269 writel(0, dsi->regs + DIRECT_CMD_RD_STS_CTL); in cdns_dsi_drm_probe()
1270 writel(0, dsi->regs + VID_MODE_STS_CTL); in cdns_dsi_drm_probe()
1271 writel(0, dsi->regs + TVG_STS_CTL); in cdns_dsi_drm_probe()
1272 writel(0, dsi->regs + DPI_IRQ_EN); in cdns_dsi_drm_probe()
1274 dev_name(&pdev->dev), dsi); in cdns_dsi_drm_probe()
1279 dsi->base.dev = &pdev->dev; in cdns_dsi_drm_probe()
1280 dsi->base.ops = &cdns_dsi_ops; in cdns_dsi_drm_probe()
1282 ret = mipi_dsi_host_register(&dsi->base); in cdns_dsi_drm_probe()
1286 clk_disable_unprepare(dsi->dsi_p_clk); in cdns_dsi_drm_probe()
1294 clk_disable_unprepare(dsi->dsi_p_clk); in cdns_dsi_drm_probe()
1301 struct cdns_dsi *dsi = platform_get_drvdata(pdev); in cdns_dsi_drm_remove() local
1303 mipi_dsi_host_unregister(&dsi->base); in cdns_dsi_drm_remove()
1310 { .compatible = "cdns,dsi" },
1319 .name = "cdns-dsi",
1327 MODULE_DESCRIPTION("Cadence DSI driver");
1329 MODULE_ALIAS("platform:cdns-dsi");