Lines Matching refs:d

74 	struct mcde_dsi *d;  in mcde_dsi_irq()  local
78 d = host_to_mcde_dsi(mdsi->host); in mcde_dsi_irq()
80 dev_dbg(d->dev, "%s called\n", __func__); in mcde_dsi_irq()
82 val = readl(d->regs + DSI_DIRECT_CMD_STS_FLAG); in mcde_dsi_irq()
84 dev_dbg(d->dev, "DSI_DIRECT_CMD_STS_FLAG = %08x\n", val); in mcde_dsi_irq()
86 dev_dbg(d->dev, "direct command write completed\n"); in mcde_dsi_irq()
89 dev_dbg(d->dev, "direct command TE received\n"); in mcde_dsi_irq()
92 dev_err(d->dev, "direct command ACK ERR received\n"); in mcde_dsi_irq()
94 dev_err(d->dev, "direct command read ERR received\n"); in mcde_dsi_irq()
96 writel(val, d->regs + DSI_DIRECT_CMD_STS_CLR); in mcde_dsi_irq()
98 val = readl(d->regs + DSI_CMD_MODE_STS_FLAG); in mcde_dsi_irq()
100 dev_dbg(d->dev, "DSI_CMD_MODE_STS_FLAG = %08x\n", val); in mcde_dsi_irq()
103 dev_dbg(d->dev, "CMD mode no TE\n"); in mcde_dsi_irq()
106 dev_dbg(d->dev, "CMD mode TE miss\n"); in mcde_dsi_irq()
108 dev_err(d->dev, "CMD mode SD1 underrun\n"); in mcde_dsi_irq()
110 dev_err(d->dev, "CMD mode SD2 underrun\n"); in mcde_dsi_irq()
112 dev_err(d->dev, "CMD mode unwanted RD\n"); in mcde_dsi_irq()
113 writel(val, d->regs + DSI_CMD_MODE_STS_CLR); in mcde_dsi_irq()
115 val = readl(d->regs + DSI_DIRECT_CMD_RD_STS_FLAG); in mcde_dsi_irq()
117 dev_dbg(d->dev, "DSI_DIRECT_CMD_RD_STS_FLAG = %08x\n", val); in mcde_dsi_irq()
118 writel(val, d->regs + DSI_DIRECT_CMD_RD_STS_CLR); in mcde_dsi_irq()
120 val = readl(d->regs + DSI_TG_STS_FLAG); in mcde_dsi_irq()
122 dev_dbg(d->dev, "DSI_TG_STS_FLAG = %08x\n", val); in mcde_dsi_irq()
123 writel(val, d->regs + DSI_TG_STS_CLR); in mcde_dsi_irq()
125 val = readl(d->regs + DSI_VID_MODE_STS_FLAG); in mcde_dsi_irq()
127 dev_err(d->dev, "some video mode error status\n"); in mcde_dsi_irq()
128 writel(val, d->regs + DSI_VID_MODE_STS_CLR); in mcde_dsi_irq()
136 struct mcde_dsi *d = host_to_mcde_dsi(host); in mcde_dsi_host_attach() local
143 dev_info(d->dev, "attached DSI device with %d lanes\n", mdsi->lanes); in mcde_dsi_host_attach()
145 dev_info(d->dev, "format %08x, %dbpp\n", mdsi->format, in mcde_dsi_host_attach()
147 dev_info(d->dev, "mode flags: %08lx\n", mdsi->mode_flags); in mcde_dsi_host_attach()
149 d->mdsi = mdsi; in mcde_dsi_host_attach()
150 if (d->mcde) in mcde_dsi_host_attach()
151 d->mcde->mdsi = mdsi; in mcde_dsi_host_attach()
159 struct mcde_dsi *d = host_to_mcde_dsi(host); in mcde_dsi_host_detach() local
161 d->mdsi = NULL; in mcde_dsi_host_detach()
162 if (d->mcde) in mcde_dsi_host_detach()
163 d->mcde->mdsi = NULL; in mcde_dsi_host_detach()
177 struct mcde_dsi *d = host_to_mcde_dsi(host); in mcde_dsi_host_transfer() local
188 dev_err(d->dev, in mcde_dsi_host_transfer()
193 dev_err(d->dev, in mcde_dsi_host_transfer()
198 dev_dbg(d->dev, in mcde_dsi_host_transfer()
220 writel(val, d->regs + DSI_DIRECT_CMD_MAIN_SETTINGS); in mcde_dsi_host_transfer()
228 writel(val, d->regs + DSI_DIRECT_CMD_WRDAT0); in mcde_dsi_host_transfer()
233 writel(val, d->regs + DSI_DIRECT_CMD_WRDAT1); in mcde_dsi_host_transfer()
239 writel(val, d->regs + DSI_DIRECT_CMD_WRDAT2); in mcde_dsi_host_transfer()
245 writel(val, d->regs + DSI_DIRECT_CMD_WRDAT3); in mcde_dsi_host_transfer()
248 writel(~0, d->regs + DSI_DIRECT_CMD_STS_CLR); in mcde_dsi_host_transfer()
249 writel(~0, d->regs + DSI_CMD_MODE_STS_CLR); in mcde_dsi_host_transfer()
251 writel(1, d->regs + DSI_DIRECT_CMD_SEND); in mcde_dsi_host_transfer()
256 while (!(readl(d->regs + DSI_DIRECT_CMD_STS) & in mcde_dsi_host_transfer()
262 dev_err(d->dev, "DSI read timeout!\n"); in mcde_dsi_host_transfer()
267 while (!(readl(d->regs + DSI_DIRECT_CMD_STS) & in mcde_dsi_host_transfer()
273 dev_err(d->dev, "DSI write timeout!\n"); in mcde_dsi_host_transfer()
278 val = readl(d->regs + DSI_DIRECT_CMD_STS); in mcde_dsi_host_transfer()
280 dev_err(d->dev, "read completed with error\n"); in mcde_dsi_host_transfer()
281 writel(1, d->regs + DSI_DIRECT_CMD_RD_INIT); in mcde_dsi_host_transfer()
286 dev_err(d->dev, "error during transmission: %04x\n", in mcde_dsi_host_transfer()
300 rdsz = readl(d->regs + DSI_DIRECT_CMD_RD_PROPERTY); in mcde_dsi_host_transfer()
302 rddat = readl(d->regs + DSI_DIRECT_CMD_RDDAT); in mcde_dsi_host_transfer()
304 dev_err(d->dev, "read error, requested %zd got %d\n", in mcde_dsi_host_transfer()
314 writel(~0, d->regs + DSI_DIRECT_CMD_STS_CLR); in mcde_dsi_host_transfer()
315 writel(~0, d->regs + DSI_CMD_MODE_STS_CLR); in mcde_dsi_host_transfer()
329 struct mcde_dsi *d; in mcde_dsi_te_request() local
332 d = host_to_mcde_dsi(mdsi->host); in mcde_dsi_te_request()
341 writel(val, d->regs + DSI_DIRECT_CMD_MAIN_SETTINGS); in mcde_dsi_te_request()
346 d->regs + DSI_DIRECT_CMD_STS_CLR); in mcde_dsi_te_request()
347 val = readl(d->regs + DSI_DIRECT_CMD_STS_CTL); in mcde_dsi_te_request()
350 writel(val, d->regs + DSI_DIRECT_CMD_STS_CTL); in mcde_dsi_te_request()
355 d->regs + DSI_CMD_MODE_STS_CLR); in mcde_dsi_te_request()
356 val = readl(d->regs + DSI_CMD_MODE_STS_CTL); in mcde_dsi_te_request()
359 writel(val, d->regs + DSI_CMD_MODE_STS_CTL); in mcde_dsi_te_request()
362 writel(1, d->regs + DSI_DIRECT_CMD_SEND); in mcde_dsi_te_request()
365 static void mcde_dsi_setup_video_mode(struct mcde_dsi *d, in mcde_dsi_setup_video_mode() argument
368 u8 bpp = mipi_dsi_pixel_format_to_bpp(d->mdsi->format); in mcde_dsi_setup_video_mode()
378 if (d->mdsi->mode_flags & MIPI_DSI_MODE_VIDEO_BURST) in mcde_dsi_setup_video_mode()
380 if (d->mdsi->mode_flags & MIPI_DSI_MODE_VIDEO_SYNC_PULSE) { in mcde_dsi_setup_video_mode()
385 switch (d->mdsi->format) { in mcde_dsi_setup_video_mode()
407 dev_err(d->dev, "unknown pixel mode\n"); in mcde_dsi_setup_video_mode()
420 writel(val, d->regs + DSI_VID_MAIN_CTL); in mcde_dsi_setup_video_mode()
433 writel(val, d->regs + DSI_VID_VSIZE); in mcde_dsi_setup_video_mode()
443 if (d->mdsi->mode_flags & MIPI_DSI_MODE_VIDEO_SYNC_PULSE) { in mcde_dsi_setup_video_mode()
466 dev_dbg(d->dev, "hfp: %u, hbp: %u, hsa: %u\n", in mcde_dsi_setup_video_mode()
475 writel(val, d->regs + DSI_VID_HSIZE1); in mcde_dsi_setup_video_mode()
479 writel(val, d->regs + DSI_VID_HSIZE2); in mcde_dsi_setup_video_mode()
489 bpl *= (d->hs_freq / 8); in mcde_dsi_setup_video_mode()
492 bpl *= d->mdsi->lanes; in mcde_dsi_setup_video_mode()
493 dev_dbg(d->dev, "calculated bytes per line: %llu\n", bpl); in mcde_dsi_setup_video_mode()
498 if (d->mdsi->mode_flags & MIPI_DSI_MODE_VIDEO_SYNC_PULSE) { in mcde_dsi_setup_video_mode()
502 writel(val, d->regs + DSI_VID_BLKSIZE2); in mcde_dsi_setup_video_mode()
506 writel(val, d->regs + DSI_VID_BLKSIZE1); in mcde_dsi_setup_video_mode()
509 line_duration = (blkline_pck + 6) / d->mdsi->lanes; in mcde_dsi_setup_video_mode()
510 dev_dbg(d->dev, "line duration %u\n", line_duration); in mcde_dsi_setup_video_mode()
517 writel(val, d->regs + DSI_VID_DPHY_TIME); in mcde_dsi_setup_video_mode()
521 blkeol_duration = (blkeol_pck + 6) / d->mdsi->lanes; in mcde_dsi_setup_video_mode()
522 dev_dbg(d->dev, "blkeol pck: %u, duration: %u\n", in mcde_dsi_setup_video_mode()
525 if (d->mdsi->mode_flags & MIPI_DSI_MODE_VIDEO_BURST) { in mcde_dsi_setup_video_mode()
527 val = readl(d->regs + DSI_VID_BLKSIZE1); in mcde_dsi_setup_video_mode()
529 writel(val, d->regs + DSI_VID_BLKSIZE1); in mcde_dsi_setup_video_mode()
530 writel(blkeol_pck, d->regs + DSI_VID_VCA_SETTING2); in mcde_dsi_setup_video_mode()
532 writel(blkeol_duration, d->regs + DSI_VID_PCK_TIME); in mcde_dsi_setup_video_mode()
533 writel(blkeol_duration - 6, d->regs + DSI_VID_VCA_SETTING1); in mcde_dsi_setup_video_mode()
537 val = readl(d->regs + DSI_VID_VCA_SETTING2); in mcde_dsi_setup_video_mode()
540 writel(val, d->regs + DSI_VID_VCA_SETTING2); in mcde_dsi_setup_video_mode()
543 val = readl(d->regs + DSI_MCTL_MAIN_DATA_CTL); in mcde_dsi_setup_video_mode()
545 writel(val, d->regs + DSI_MCTL_MAIN_DATA_CTL); in mcde_dsi_setup_video_mode()
548 val = readl(d->regs + DSI_CMD_MODE_CTL); in mcde_dsi_setup_video_mode()
550 writel(val, d->regs + DSI_CMD_MODE_CTL); in mcde_dsi_setup_video_mode()
553 val = readl(d->regs + DSI_VID_MODE_STS_CTL); in mcde_dsi_setup_video_mode()
556 writel(val, d->regs + DSI_VID_MODE_STS_CTL); in mcde_dsi_setup_video_mode()
559 val = readl(d->regs + DSI_MCTL_MAIN_DATA_CTL); in mcde_dsi_setup_video_mode()
561 writel(val, d->regs + DSI_MCTL_MAIN_DATA_CTL); in mcde_dsi_setup_video_mode()
564 static void mcde_dsi_start(struct mcde_dsi *d) in mcde_dsi_start() argument
571 writel(0, d->regs + DSI_MCTL_INTEGRATION_MODE); in mcde_dsi_start()
578 if (d->mdsi->mode_flags & MIPI_DSI_MODE_EOT_PACKET) in mcde_dsi_start()
580 writel(val, d->regs + DSI_MCTL_MAIN_DATA_CTL); in mcde_dsi_start()
584 writel(val, d->regs + DSI_CMD_MODE_CTL); in mcde_dsi_start()
591 hs_freq = clk_get_rate(d->hs_clk); in mcde_dsi_start()
594 dev_dbg(d->dev, "UI value: %d\n", val); in mcde_dsi_start()
597 writel(val, d->regs + DSI_MCTL_DPHY_STATIC); in mcde_dsi_start()
606 if (d->mdsi->lanes == 2) in mcde_dsi_start()
608 if (!(d->mdsi->mode_flags & MIPI_DSI_CLOCK_NON_CONTINUOUS)) in mcde_dsi_start()
613 writel(val, d->regs + DSI_MCTL_MAIN_PHY_CTL); in mcde_dsi_start()
617 writel(val, d->regs + DSI_MCTL_ULPOUT_TIME); in mcde_dsi_start()
620 d->regs + DSI_DPHY_LANES_TRIM); in mcde_dsi_start()
626 writel(val, d->regs + DSI_MCTL_DPHY_TIMEOUT); in mcde_dsi_start()
632 if (d->mdsi->lanes == 2) in mcde_dsi_start()
634 writel(val, d->regs + DSI_MCTL_MAIN_EN); in mcde_dsi_start()
641 if (d->mdsi->lanes == 2) in mcde_dsi_start()
643 while ((readl(d->regs + DSI_MCTL_MAIN_STS) & val) != val) { in mcde_dsi_start()
647 dev_warn(d->dev, "DSI lanes did not start up\n"); in mcde_dsi_start()
655 val = readl(d->regs + DSI_CMD_MODE_CTL); in mcde_dsi_start()
662 writel(val, d->regs + DSI_CMD_MODE_CTL); in mcde_dsi_start()
666 dev_info(d->dev, "DSI link enabled\n"); in mcde_dsi_start()
672 struct mcde_dsi *d = bridge_to_mcde_dsi(bridge); in mcde_dsi_bridge_enable() local
674 dev_info(d->dev, "enable DSI master\n"); in mcde_dsi_bridge_enable()
681 struct mcde_dsi *d = bridge_to_mcde_dsi(bridge); in mcde_dsi_bridge_mode_set() local
687 if (!d->mdsi) { in mcde_dsi_bridge_mode_set()
688 dev_err(d->dev, "no DSI device attached to encoder!\n"); in mcde_dsi_bridge_mode_set()
692 dev_info(d->dev, "set DSI master to %dx%d %lu Hz %s mode\n", in mcde_dsi_bridge_mode_set()
694 (d->mdsi->mode_flags & MIPI_DSI_MODE_VIDEO) ? "VIDEO" : "CMD" in mcde_dsi_bridge_mode_set()
698 if (d->mdsi->lp_rate) in mcde_dsi_bridge_mode_set()
699 lp_freq = d->mdsi->lp_rate; in mcde_dsi_bridge_mode_set()
702 if (d->mdsi->hs_rate) in mcde_dsi_bridge_mode_set()
703 hs_freq = d->mdsi->hs_rate; in mcde_dsi_bridge_mode_set()
708 d->lp_freq = clk_round_rate(d->lp_clk, lp_freq); in mcde_dsi_bridge_mode_set()
709 ret = clk_set_rate(d->lp_clk, d->lp_freq); in mcde_dsi_bridge_mode_set()
711 dev_err(d->dev, "failed to set LP clock rate %lu Hz\n", in mcde_dsi_bridge_mode_set()
712 d->lp_freq); in mcde_dsi_bridge_mode_set()
714 d->hs_freq = clk_round_rate(d->hs_clk, hs_freq); in mcde_dsi_bridge_mode_set()
715 ret = clk_set_rate(d->hs_clk, d->hs_freq); in mcde_dsi_bridge_mode_set()
717 dev_err(d->dev, "failed to set HS clock rate %lu Hz\n", in mcde_dsi_bridge_mode_set()
718 d->hs_freq); in mcde_dsi_bridge_mode_set()
721 ret = clk_prepare_enable(d->lp_clk); in mcde_dsi_bridge_mode_set()
723 dev_err(d->dev, "failed to enable LP clock\n"); in mcde_dsi_bridge_mode_set()
725 dev_info(d->dev, "DSI LP clock rate %lu Hz\n", in mcde_dsi_bridge_mode_set()
726 d->lp_freq); in mcde_dsi_bridge_mode_set()
727 ret = clk_prepare_enable(d->hs_clk); in mcde_dsi_bridge_mode_set()
729 dev_err(d->dev, "failed to enable HS clock\n"); in mcde_dsi_bridge_mode_set()
731 dev_info(d->dev, "DSI HS clock rate %lu Hz\n", in mcde_dsi_bridge_mode_set()
732 d->hs_freq); in mcde_dsi_bridge_mode_set()
734 if (d->mdsi->mode_flags & MIPI_DSI_MODE_VIDEO) { in mcde_dsi_bridge_mode_set()
735 mcde_dsi_setup_video_mode(d, mode); in mcde_dsi_bridge_mode_set()
738 val = readl(d->regs + DSI_CMD_MODE_CTL); in mcde_dsi_bridge_mode_set()
745 writel(val, d->regs + DSI_CMD_MODE_CTL); in mcde_dsi_bridge_mode_set()
749 static void mcde_dsi_wait_for_command_mode_stop(struct mcde_dsi *d) in mcde_dsi_wait_for_command_mode_stop() argument
760 while ((readl(d->regs + DSI_CMD_MODE_STS) & val) == val) { in mcde_dsi_wait_for_command_mode_stop()
764 dev_warn(d->dev, in mcde_dsi_wait_for_command_mode_stop()
771 static void mcde_dsi_wait_for_video_mode_stop(struct mcde_dsi *d) in mcde_dsi_wait_for_video_mode_stop() argument
779 while ((readl(d->regs + DSI_VID_MODE_STS) & val) == val) { in mcde_dsi_wait_for_video_mode_stop()
783 dev_warn(d->dev, in mcde_dsi_wait_for_video_mode_stop()
792 struct mcde_dsi *d = bridge_to_mcde_dsi(bridge); in mcde_dsi_bridge_disable() local
796 writel(0, d->regs + DSI_VID_MODE_STS_CTL); in mcde_dsi_bridge_disable()
798 if (d->mdsi->mode_flags & MIPI_DSI_MODE_VIDEO) { in mcde_dsi_bridge_disable()
800 val = readl(d->regs + DSI_MCTL_MAIN_DATA_CTL); in mcde_dsi_bridge_disable()
802 writel(val, d->regs + DSI_MCTL_MAIN_DATA_CTL); in mcde_dsi_bridge_disable()
803 mcde_dsi_wait_for_video_mode_stop(d); in mcde_dsi_bridge_disable()
806 mcde_dsi_wait_for_command_mode_stop(d); in mcde_dsi_bridge_disable()
810 clk_disable_unprepare(d->hs_clk); in mcde_dsi_bridge_disable()
811 clk_disable_unprepare(d->lp_clk); in mcde_dsi_bridge_disable()
828 struct mcde_dsi *d = connector_to_mcde_dsi(connector); in mcde_dsi_get_modes() local
831 if (d->panel) in mcde_dsi_get_modes()
832 return drm_panel_get_modes(d->panel); in mcde_dsi_get_modes()
846 struct mcde_dsi *d = bridge_to_mcde_dsi(bridge); in mcde_dsi_bridge_attach() local
850 drm_connector_helper_add(&d->connector, in mcde_dsi_bridge_attach()
854 dev_err(d->dev, "we need atomic updates\n"); in mcde_dsi_bridge_attach()
858 ret = drm_connector_init(drm, &d->connector, in mcde_dsi_bridge_attach()
862 dev_err(d->dev, "failed to initialize DSI bridge connector\n"); in mcde_dsi_bridge_attach()
865 d->connector.polled = DRM_CONNECTOR_POLL_CONNECT; in mcde_dsi_bridge_attach()
867 drm_connector_attach_encoder(&d->connector, bridge->encoder); in mcde_dsi_bridge_attach()
869 ret = drm_bridge_attach(bridge->encoder, d->bridge_out, bridge); in mcde_dsi_bridge_attach()
871 dev_err(d->dev, "failed to attach the DSI bridge\n"); in mcde_dsi_bridge_attach()
874 d->connector.status = connector_status_connected; in mcde_dsi_bridge_attach()
891 struct mcde_dsi *d = dev_get_drvdata(dev); in mcde_dsi_bind() local
898 d->unused = true; in mcde_dsi_bind()
901 d->mcde = mcde; in mcde_dsi_bind()
903 if (d->mdsi) in mcde_dsi_bind()
904 d->mcde->mdsi = d->mdsi; in mcde_dsi_bind()
907 d->hs_clk = devm_clk_get(dev, "hs"); in mcde_dsi_bind()
908 if (IS_ERR(d->hs_clk)) { in mcde_dsi_bind()
910 return PTR_ERR(d->hs_clk); in mcde_dsi_bind()
913 d->lp_clk = devm_clk_get(dev, "lp"); in mcde_dsi_bind()
914 if (IS_ERR(d->lp_clk)) { in mcde_dsi_bind()
916 return PTR_ERR(d->lp_clk); in mcde_dsi_bind()
921 regmap_update_bits(d->prcmu, PRCM_DSI_SW_RESET, in mcde_dsi_bind()
927 regmap_update_bits(d->prcmu, PRCM_DSI_SW_RESET, in mcde_dsi_bind()
932 mcde_dsi_start(d); in mcde_dsi_bind()
956 d->panel = panel; in mcde_dsi_bind()
966 d->bridge_out = bridge; in mcde_dsi_bind()
969 d->bridge.funcs = &mcde_dsi_bridge_funcs; in mcde_dsi_bind()
970 d->bridge.of_node = dev->of_node; in mcde_dsi_bind()
971 drm_bridge_add(&d->bridge); in mcde_dsi_bind()
974 mcde->bridge = &d->bridge; in mcde_dsi_bind()
984 struct mcde_dsi *d = dev_get_drvdata(dev); in mcde_dsi_unbind() local
986 if (d->panel) in mcde_dsi_unbind()
987 drm_panel_bridge_remove(d->bridge_out); in mcde_dsi_unbind()
988 regmap_update_bits(d->prcmu, PRCM_DSI_SW_RESET, in mcde_dsi_unbind()
1000 struct mcde_dsi *d; in mcde_dsi_probe() local
1006 d = devm_kzalloc(dev, sizeof(*d), GFP_KERNEL); in mcde_dsi_probe()
1007 if (!d) in mcde_dsi_probe()
1009 d->dev = dev; in mcde_dsi_probe()
1010 platform_set_drvdata(pdev, d); in mcde_dsi_probe()
1013 d->prcmu = in mcde_dsi_probe()
1015 if (IS_ERR(d->prcmu)) { in mcde_dsi_probe()
1017 return PTR_ERR(d->prcmu); in mcde_dsi_probe()
1021 d->regs = devm_ioremap_resource(dev, res); in mcde_dsi_probe()
1022 if (IS_ERR(d->regs)) { in mcde_dsi_probe()
1024 return PTR_ERR(d->regs); in mcde_dsi_probe()
1027 dsi_id = readl(d->regs + DSI_ID_REG); in mcde_dsi_probe()
1030 host = &d->dsi_host; in mcde_dsi_probe()
1040 platform_set_drvdata(pdev, d); in mcde_dsi_probe()
1046 struct mcde_dsi *d = platform_get_drvdata(pdev); in mcde_dsi_remove() local
1049 mipi_dsi_host_unregister(&d->dsi_host); in mcde_dsi_remove()