Lines Matching full:dsi

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()
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()
576 * Make sure DSI htotal is aligned on a lane boundary when calculating 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()
613 ret = cdns_dsi_mode2cfg(dsi, mode, dsi_cfg, mode_valid_check); 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()
634 * Make sure DPI(HFP) > DSI(HSS+HSA+HSE+HBP) to guarantee that the FIFO 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()
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()
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()
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()
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()
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()
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()
792 if (WARN_ON(pm_runtime_get_sync(dsi->base.dev) < 0)) 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()
811 dsi->regs + VID_VSIZE1); in cdns_dsi_bridge_enable()
812 writel(mode->crtc_vdisplay, dsi->regs + VID_VSIZE2); in cdns_dsi_bridge_enable()
817 writel(BLK_LINE_PULSE_PKT_LEN(tmp), dsi->regs + VID_BLKSIZE2); in cdns_dsi_bridge_enable()
820 dsi->regs + VID_VCA_SETTING2); in cdns_dsi_bridge_enable()
824 writel(BLK_LINE_EVENT_PKT_LEN(tmp), dsi->regs + VID_BLKSIZE1); in cdns_dsi_bridge_enable()
827 dsi->regs + VID_VCA_SETTING2); 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()
887 dev_err(dsi->base.dev, "Unsupported DSI format\n"); 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()
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()
953 np = of_graph_get_remote_node(dsi->base.dev->of_node, DSI_OUTPUT_PORT, in cdns_dsi_attach()
972 dev_err(host->dev, "failed to add DSI device %s (err = %d)", in cdns_dsi_attach()
982 * The DSI output has been properly configured, we can now safely 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()
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
1035 cdns_dsi_init_link(dsi); in cdns_dsi_transfer()
1051 if (tx_len > dsi->direct_cmd_fifo_depth) { in cdns_dsi_transfer()
1057 if (rx_len > dsi->rx_fifo_depth) { 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()
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()
1129 val = readl(dsi->regs + DIRECT_CMD_RDDATA); 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()
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()
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()
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()
1250 dev_name(&pdev->dev), dsi); 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()
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()
1286 { .compatible = "cdns,dsi" },
1294 .name = "cdns-dsi",
1302 MODULE_DESCRIPTION("Cadence DSI driver");
1304 MODULE_ALIAS("platform:cdns-dsi");