Lines Matching full:dsi
3 * R-Car MIPI DSI Encoder
71 struct clk *dsi; member
178 static void rcar_mipi_dsi_write(struct rcar_mipi_dsi *dsi, u32 reg, u32 data) in rcar_mipi_dsi_write() argument
180 iowrite32(data, dsi->mmio + reg); in rcar_mipi_dsi_write()
183 static u32 rcar_mipi_dsi_read(struct rcar_mipi_dsi *dsi, u32 reg) in rcar_mipi_dsi_read() argument
185 return ioread32(dsi->mmio + reg); in rcar_mipi_dsi_read()
188 static void rcar_mipi_dsi_clr(struct rcar_mipi_dsi *dsi, u32 reg, u32 clr) in rcar_mipi_dsi_clr() argument
190 rcar_mipi_dsi_write(dsi, reg, rcar_mipi_dsi_read(dsi, reg) & ~clr); in rcar_mipi_dsi_clr()
193 static void rcar_mipi_dsi_set(struct rcar_mipi_dsi *dsi, u32 reg, u32 set) in rcar_mipi_dsi_set() argument
195 rcar_mipi_dsi_write(dsi, reg, rcar_mipi_dsi_read(dsi, reg) | set); in rcar_mipi_dsi_set()
198 static int rcar_mipi_dsi_write_phtw(struct rcar_mipi_dsi *dsi, u32 phtw) in rcar_mipi_dsi_write_phtw() argument
203 rcar_mipi_dsi_write(dsi, PHTW, phtw); in rcar_mipi_dsi_write_phtw()
207 2000, 10000, false, dsi, PHTW); in rcar_mipi_dsi_write_phtw()
209 dev_err(dsi->dev, "PHY test interface write timeout (0x%08x)\n", in rcar_mipi_dsi_write_phtw()
217 static int rcar_mipi_dsi_write_phtw_arr(struct rcar_mipi_dsi *dsi, in rcar_mipi_dsi_write_phtw_arr() argument
221 int ret = rcar_mipi_dsi_write_phtw(dsi, phtw[i]); in rcar_mipi_dsi_write_phtw_arr()
234 ret = rcar_mipi_dsi_write_phtw_arr(dsi, phtw, \
239 static int rcar_mipi_dsi_init_phtw_v3u(struct rcar_mipi_dsi *dsi) in rcar_mipi_dsi_init_phtw_v3u() argument
246 static int rcar_mipi_dsi_post_init_phtw_v3u(struct rcar_mipi_dsi *dsi) in rcar_mipi_dsi_post_init_phtw_v3u() argument
253 static int rcar_mipi_dsi_init_phtw_v4h(struct rcar_mipi_dsi *dsi, in rcar_mipi_dsi_init_phtw_v4h() argument
283 if (dsi->lanes <= 1) { in rcar_mipi_dsi_init_phtw_v4h()
289 if (dsi->lanes <= 2) { in rcar_mipi_dsi_init_phtw_v4h()
295 if (dsi->lanes <= 3) { in rcar_mipi_dsi_init_phtw_v4h()
311 rcar_mipi_dsi_post_init_phtw_v4h(struct rcar_mipi_dsi *dsi, in rcar_mipi_dsi_post_init_phtw_v4h() argument
322 2000, 10000, false, dsi, PHTR); in rcar_mipi_dsi_post_init_phtw_v4h()
324 dev_err(dsi->dev, "failed to test PHTR\n"); in rcar_mipi_dsi_post_init_phtw_v4h()
338 static void rcar_mipi_dsi_pll_calc(struct rcar_mipi_dsi *dsi, in rcar_mipi_dsi_pll_calc() argument
344 const struct rcar_mipi_dsi_device_info *info = dsi->info; in rcar_mipi_dsi_pll_calc()
358 fout = div64_u64((u64)fpfd * m, dsi->info->n_mul); in rcar_mipi_dsi_pll_calc()
384 static void rcar_mipi_dsi_parameters_calc(struct rcar_mipi_dsi *dsi, in rcar_mipi_dsi_parameters_calc() argument
399 fout_target = target * mipi_dsi_pixel_format_to_bpp(dsi->format) in rcar_mipi_dsi_parameters_calc()
400 / (2 * dsi->lanes); in rcar_mipi_dsi_parameters_calc()
405 for (clk_cfg = dsi->info->clk_cfg; clk_cfg->min_freq != 0; clk_cfg++) { in rcar_mipi_dsi_parameters_calc()
415 switch (dsi->info->model) { in rcar_mipi_dsi_parameters_calc()
426 rcar_mipi_dsi_pll_calc(dsi, fin_rate, fout_target, setup_info); in rcar_mipi_dsi_parameters_calc()
439 dev_dbg(dsi->dev, in rcar_mipi_dsi_parameters_calc()
441 setup_info->m, fin_rate, dsi->info->n_mul, setup_info->n, in rcar_mipi_dsi_parameters_calc()
445 dev_dbg(dsi->dev, in rcar_mipi_dsi_parameters_calc()
451 static void rcar_mipi_dsi_set_display_timing(struct rcar_mipi_dsi *dsi, in rcar_mipi_dsi_set_display_timing() argument
462 switch (mipi_dsi_pixel_format_to_bpp(dsi->format)) { in rcar_mipi_dsi_set_display_timing()
464 rcar_mipi_dsi_write(dsi, TXVMPSPHSETR, TXVMPSPHSETR_DT_RGB24); in rcar_mipi_dsi_set_display_timing()
467 rcar_mipi_dsi_write(dsi, TXVMPSPHSETR, TXVMPSPHSETR_DT_RGB18); in rcar_mipi_dsi_set_display_timing()
470 rcar_mipi_dsi_write(dsi, TXVMPSPHSETR, TXVMPSPHSETR_DT_RGB16); in rcar_mipi_dsi_set_display_timing()
473 dev_warn(dsi->dev, "unsupported format"); in rcar_mipi_dsi_set_display_timing()
480 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO) { in rcar_mipi_dsi_set_display_timing()
481 if (!(dsi->mode_flags & MIPI_DSI_MODE_VIDEO_SYNC_PULSE)) in rcar_mipi_dsi_set_display_timing()
483 if (!(dsi->mode_flags & MIPI_DSI_MODE_VIDEO_NO_HFP)) in rcar_mipi_dsi_set_display_timing()
485 if (!(dsi->mode_flags & MIPI_DSI_MODE_VIDEO_NO_HBP)) in rcar_mipi_dsi_set_display_timing()
487 if (!(dsi->mode_flags & MIPI_DSI_MODE_VIDEO_NO_HSA)) in rcar_mipi_dsi_set_display_timing()
491 rcar_mipi_dsi_write(dsi, TXVMSETR, setr); in rcar_mipi_dsi_set_display_timing()
512 rcar_mipi_dsi_write(dsi, TXVMVPRMSET0R, vprmset0r); in rcar_mipi_dsi_set_display_timing()
513 rcar_mipi_dsi_write(dsi, TXVMVPRMSET1R, vprmset1r); in rcar_mipi_dsi_set_display_timing()
514 rcar_mipi_dsi_write(dsi, TXVMVPRMSET2R, vprmset2r); in rcar_mipi_dsi_set_display_timing()
515 rcar_mipi_dsi_write(dsi, TXVMVPRMSET3R, vprmset3r); in rcar_mipi_dsi_set_display_timing()
516 rcar_mipi_dsi_write(dsi, TXVMVPRMSET4R, vprmset4r); in rcar_mipi_dsi_set_display_timing()
519 static int rcar_mipi_dsi_startup(struct rcar_mipi_dsi *dsi, in rcar_mipi_dsi_startup() argument
532 dsi_format = mipi_dsi_pixel_format_to_bpp(dsi->format); in rcar_mipi_dsi_startup()
534 dev_warn(dsi->dev, "invalid format"); in rcar_mipi_dsi_startup()
539 rcar_mipi_dsi_parameters_calc(dsi, dsi->clocks.pll, in rcar_mipi_dsi_startup()
543 rcar_mipi_dsi_set(dsi, LPCLKSET, LPCLKSET_CKEN); in rcar_mipi_dsi_startup()
546 rcar_mipi_dsi_set(dsi, CFGCLKSET, CFGCLKSET_CKEN); in rcar_mipi_dsi_startup()
548 rcar_mipi_dsi_clr(dsi, PHYSETUP, PHYSETUP_RSTZ); in rcar_mipi_dsi_startup()
549 rcar_mipi_dsi_clr(dsi, PHYSETUP, PHYSETUP_SHUTDOWNZ); in rcar_mipi_dsi_startup()
551 rcar_mipi_dsi_set(dsi, PHTC, PHTC_TESTCLR); in rcar_mipi_dsi_startup()
552 rcar_mipi_dsi_clr(dsi, PHTC, PHTC_TESTCLR); in rcar_mipi_dsi_startup()
555 phy_setup = rcar_mipi_dsi_read(dsi, PHYSETUP); in rcar_mipi_dsi_startup()
558 rcar_mipi_dsi_write(dsi, PHYSETUP, phy_setup); in rcar_mipi_dsi_startup()
560 switch (dsi->info->model) { in rcar_mipi_dsi_startup()
563 ret = rcar_mipi_dsi_init_phtw_v3u(dsi); in rcar_mipi_dsi_startup()
569 ret = rcar_mipi_dsi_init_phtw_v4h(dsi, &setup_info); in rcar_mipi_dsi_startup()
576 rcar_mipi_dsi_clr(dsi, CLOCKSET1, CLOCKSET1_SHADOW_CLEAR); in rcar_mipi_dsi_startup()
577 rcar_mipi_dsi_set(dsi, CLOCKSET1, CLOCKSET1_SHADOW_CLEAR); in rcar_mipi_dsi_startup()
578 rcar_mipi_dsi_clr(dsi, CLOCKSET1, CLOCKSET1_SHADOW_CLEAR); in rcar_mipi_dsi_startup()
580 clockset2 = CLOCKSET2_M(setup_info.m - dsi->info->clockset2_m_offset) in rcar_mipi_dsi_startup()
587 rcar_mipi_dsi_write(dsi, CLOCKSET2, clockset2); in rcar_mipi_dsi_startup()
588 rcar_mipi_dsi_write(dsi, CLOCKSET3, clockset3); in rcar_mipi_dsi_startup()
590 rcar_mipi_dsi_clr(dsi, CLOCKSET1, CLOCKSET1_UPDATEPLL); in rcar_mipi_dsi_startup()
591 rcar_mipi_dsi_set(dsi, CLOCKSET1, CLOCKSET1_UPDATEPLL); in rcar_mipi_dsi_startup()
593 rcar_mipi_dsi_clr(dsi, CLOCKSET1, CLOCKSET1_UPDATEPLL); in rcar_mipi_dsi_startup()
595 rcar_mipi_dsi_clr(dsi, TXSETR, TXSETR_LANECNT_MASK); in rcar_mipi_dsi_startup()
596 rcar_mipi_dsi_set(dsi, TXSETR, dsi->lanes - 1); in rcar_mipi_dsi_startup()
598 ppisetr = ((BIT(dsi->lanes) - 1) & PPISETR_DLEN_MASK) | PPISETR_CLEN; in rcar_mipi_dsi_startup()
599 rcar_mipi_dsi_write(dsi, PPISETR, ppisetr); in rcar_mipi_dsi_startup()
601 rcar_mipi_dsi_set(dsi, PHYSETUP, PHYSETUP_SHUTDOWNZ); in rcar_mipi_dsi_startup()
602 rcar_mipi_dsi_set(dsi, PHYSETUP, PHYSETUP_RSTZ); in rcar_mipi_dsi_startup()
607 if ((rcar_mipi_dsi_read(dsi, PPICLSR) & PPICLSR_STPST) && in rcar_mipi_dsi_startup()
608 (rcar_mipi_dsi_read(dsi, PPIDLSR) & PPIDLSR_STPST) && in rcar_mipi_dsi_startup()
609 (rcar_mipi_dsi_read(dsi, CLOCKSET1) & CLOCKSET1_LOCK_PHY)) in rcar_mipi_dsi_startup()
616 dev_err(dsi->dev, "failed to enable PPI clock\n"); in rcar_mipi_dsi_startup()
620 switch (dsi->info->model) { in rcar_mipi_dsi_startup()
623 ret = rcar_mipi_dsi_post_init_phtw_v3u(dsi); in rcar_mipi_dsi_startup()
629 ret = rcar_mipi_dsi_post_init_phtw_v4h(dsi, &setup_info); in rcar_mipi_dsi_startup()
637 rcar_mipi_dsi_write(dsi, VCLKSET, vclkset); in rcar_mipi_dsi_startup()
647 dev_warn(dsi->dev, "unsupported format"); in rcar_mipi_dsi_startup()
651 vclkset |= VCLKSET_LANE(dsi->lanes - 1); in rcar_mipi_dsi_startup()
653 switch (dsi->info->model) { in rcar_mipi_dsi_startup()
664 rcar_mipi_dsi_write(dsi, VCLKSET, vclkset); in rcar_mipi_dsi_startup()
667 rcar_mipi_dsi_set(dsi, VCLKEN, VCLKEN_CKEN); in rcar_mipi_dsi_startup()
669 dev_dbg(dsi->dev, "DSI device is started\n"); in rcar_mipi_dsi_startup()
674 static void rcar_mipi_dsi_shutdown(struct rcar_mipi_dsi *dsi) in rcar_mipi_dsi_shutdown() argument
677 rcar_mipi_dsi_write(dsi, VCLKSET, 0); in rcar_mipi_dsi_shutdown()
680 rcar_mipi_dsi_write(dsi, VCLKSET, 0); in rcar_mipi_dsi_shutdown()
682 rcar_mipi_dsi_clr(dsi, PHYSETUP, PHYSETUP_RSTZ); in rcar_mipi_dsi_shutdown()
683 rcar_mipi_dsi_clr(dsi, PHYSETUP, PHYSETUP_SHUTDOWNZ); in rcar_mipi_dsi_shutdown()
686 rcar_mipi_dsi_clr(dsi, CFGCLKSET, CFGCLKSET_CKEN); in rcar_mipi_dsi_shutdown()
689 rcar_mipi_dsi_clr(dsi, LPCLKSET, LPCLKSET_CKEN); in rcar_mipi_dsi_shutdown()
691 dev_dbg(dsi->dev, "DSI device is shutdown\n"); in rcar_mipi_dsi_shutdown()
694 static int rcar_mipi_dsi_clk_enable(struct rcar_mipi_dsi *dsi) in rcar_mipi_dsi_clk_enable() argument
698 reset_control_deassert(dsi->rstc); in rcar_mipi_dsi_clk_enable()
700 ret = clk_prepare_enable(dsi->clocks.mod); in rcar_mipi_dsi_clk_enable()
704 ret = clk_prepare_enable(dsi->clocks.dsi); in rcar_mipi_dsi_clk_enable()
711 clk_disable_unprepare(dsi->clocks.mod); in rcar_mipi_dsi_clk_enable()
713 reset_control_assert(dsi->rstc); in rcar_mipi_dsi_clk_enable()
717 static void rcar_mipi_dsi_clk_disable(struct rcar_mipi_dsi *dsi) in rcar_mipi_dsi_clk_disable() argument
719 clk_disable_unprepare(dsi->clocks.dsi); in rcar_mipi_dsi_clk_disable()
720 clk_disable_unprepare(dsi->clocks.mod); in rcar_mipi_dsi_clk_disable()
722 reset_control_assert(dsi->rstc); in rcar_mipi_dsi_clk_disable()
725 static int rcar_mipi_dsi_start_hs_clock(struct rcar_mipi_dsi *dsi) in rcar_mipi_dsi_start_hs_clock() argument
735 rcar_mipi_dsi_set(dsi, PPICLCR, PPICLCR_TXREQHS); in rcar_mipi_dsi_start_hs_clock()
739 2000, 10000, false, dsi, PPICLSR); in rcar_mipi_dsi_start_hs_clock()
741 dev_err(dsi->dev, "failed to enable HS clock\n"); in rcar_mipi_dsi_start_hs_clock()
745 rcar_mipi_dsi_set(dsi, PPICLSCR, PPICLSCR_TOHS); in rcar_mipi_dsi_start_hs_clock()
750 static int rcar_mipi_dsi_start_video(struct rcar_mipi_dsi *dsi) in rcar_mipi_dsi_start_video() argument
758 2000, 10000, false, dsi, LINKSR); in rcar_mipi_dsi_start_video()
760 dev_err(dsi->dev, "Link failed to become ready\n"); in rcar_mipi_dsi_start_video()
765 rcar_mipi_dsi_clr(dsi, TXVMCR, TXVMCR_VFCLR); in rcar_mipi_dsi_start_video()
769 2000, 10000, false, dsi, TXVMSR); in rcar_mipi_dsi_start_video()
771 dev_err(dsi->dev, "Failed to de-assert video FIFO clear\n"); in rcar_mipi_dsi_start_video()
776 rcar_mipi_dsi_set(dsi, TXVMCR, TXVMCR_EN_VIDEO); in rcar_mipi_dsi_start_video()
780 2000, 10000, false, dsi, TXVMSR); in rcar_mipi_dsi_start_video()
782 dev_err(dsi->dev, "Failed to enable video transmission\n"); in rcar_mipi_dsi_start_video()
789 static void rcar_mipi_dsi_stop_video(struct rcar_mipi_dsi *dsi) in rcar_mipi_dsi_stop_video() argument
795 rcar_mipi_dsi_clr(dsi, TXVMCR, TXVMCR_EN_VIDEO); in rcar_mipi_dsi_stop_video()
799 2000, 100000, false, dsi, TXVMSR); in rcar_mipi_dsi_stop_video()
801 dev_err(dsi->dev, "Failed to disable video transmission\n"); in rcar_mipi_dsi_stop_video()
806 rcar_mipi_dsi_set(dsi, TXVMCR, TXVMCR_VFCLR); in rcar_mipi_dsi_stop_video()
810 2000, 100000, false, dsi, TXVMSR); in rcar_mipi_dsi_stop_video()
812 dev_err(dsi->dev, "Failed to assert video FIFO clear\n"); in rcar_mipi_dsi_stop_video()
825 struct rcar_mipi_dsi *dsi = bridge_to_rcar_mipi_dsi(bridge); in rcar_mipi_dsi_attach() local
827 return drm_bridge_attach(encoder, dsi->next_bridge, bridge, in rcar_mipi_dsi_attach()
834 struct rcar_mipi_dsi *dsi = bridge_to_rcar_mipi_dsi(bridge); in rcar_mipi_dsi_atomic_enable() local
836 rcar_mipi_dsi_start_video(dsi); in rcar_mipi_dsi_atomic_enable()
842 struct rcar_mipi_dsi *dsi = bridge_to_rcar_mipi_dsi(bridge); in rcar_mipi_dsi_atomic_disable() local
844 rcar_mipi_dsi_stop_video(dsi); in rcar_mipi_dsi_atomic_disable()
850 struct rcar_mipi_dsi *dsi = bridge_to_rcar_mipi_dsi(bridge); in rcar_mipi_dsi_pclk_enable() local
861 ret = rcar_mipi_dsi_clk_enable(dsi); in rcar_mipi_dsi_pclk_enable()
863 dev_err(dsi->dev, "failed to enable DSI clocks\n"); in rcar_mipi_dsi_pclk_enable()
867 ret = rcar_mipi_dsi_startup(dsi, mode); in rcar_mipi_dsi_pclk_enable()
871 rcar_mipi_dsi_set_display_timing(dsi, mode); in rcar_mipi_dsi_pclk_enable()
873 ret = rcar_mipi_dsi_start_hs_clock(dsi); in rcar_mipi_dsi_pclk_enable()
880 rcar_mipi_dsi_shutdown(dsi); in rcar_mipi_dsi_pclk_enable()
882 rcar_mipi_dsi_clk_disable(dsi); in rcar_mipi_dsi_pclk_enable()
888 struct rcar_mipi_dsi *dsi = bridge_to_rcar_mipi_dsi(bridge); in rcar_mipi_dsi_pclk_disable() local
890 rcar_mipi_dsi_shutdown(dsi); in rcar_mipi_dsi_pclk_disable()
891 rcar_mipi_dsi_clk_disable(dsi); in rcar_mipi_dsi_pclk_disable()
923 struct rcar_mipi_dsi *dsi = host_to_rcar_mipi_dsi(host); in rcar_mipi_dsi_host_attach() local
926 if (device->lanes > dsi->num_data_lanes) in rcar_mipi_dsi_host_attach()
929 dsi->lanes = device->lanes; in rcar_mipi_dsi_host_attach()
930 dsi->format = device->format; in rcar_mipi_dsi_host_attach()
931 dsi->mode_flags = device->mode_flags; in rcar_mipi_dsi_host_attach()
933 dsi->next_bridge = devm_drm_of_get_bridge(dsi->dev, dsi->dev->of_node, in rcar_mipi_dsi_host_attach()
935 if (IS_ERR(dsi->next_bridge)) { in rcar_mipi_dsi_host_attach()
936 ret = PTR_ERR(dsi->next_bridge); in rcar_mipi_dsi_host_attach()
937 dev_err(dsi->dev, "failed to get next bridge: %d\n", ret); in rcar_mipi_dsi_host_attach()
942 dsi->bridge.of_node = dsi->dev->of_node; in rcar_mipi_dsi_host_attach()
943 drm_bridge_add(&dsi->bridge); in rcar_mipi_dsi_host_attach()
951 struct rcar_mipi_dsi *dsi = host_to_rcar_mipi_dsi(host); in rcar_mipi_dsi_host_detach() local
953 drm_bridge_remove(&dsi->bridge); in rcar_mipi_dsi_host_detach()
963 struct rcar_mipi_dsi *dsi = host_to_rcar_mipi_dsi(host); in rcar_mipi_dsi_host_tx_transfer() local
974 rcar_mipi_dsi_write(dsi, TXCMSETR, (msg->flags & MIPI_DSI_MSG_USE_LPM) ? in rcar_mipi_dsi_host_tx_transfer()
979 rcar_mipi_dsi_write(dsi, RXPSETR, 0); in rcar_mipi_dsi_host_tx_transfer()
982 rcar_mipi_dsi_write(dsi, TXCMIER, 0); in rcar_mipi_dsi_host_tx_transfer()
990 rcar_mipi_dsi_write(dsi, TXCMPHDR, in rcar_mipi_dsi_host_tx_transfer()
1001 rcar_mipi_dsi_write(dsi, TXCMPPD0R, in rcar_mipi_dsi_host_tx_transfer()
1004 rcar_mipi_dsi_write(dsi, TXCMPPD1R, in rcar_mipi_dsi_host_tx_transfer()
1007 rcar_mipi_dsi_write(dsi, TXCMPPD2R, in rcar_mipi_dsi_host_tx_transfer()
1010 rcar_mipi_dsi_write(dsi, TXCMPPD3R, in rcar_mipi_dsi_host_tx_transfer()
1017 rcar_mipi_dsi_write(dsi, TXCMCR, TXCMCR_BTAREQ); in rcar_mipi_dsi_host_tx_transfer()
1022 2000, 50000, false, dsi, RXPSR); in rcar_mipi_dsi_host_tx_transfer()
1024 rcar_mipi_dsi_write(dsi, TXCMCR, TXCMCR_TXREQ); in rcar_mipi_dsi_host_tx_transfer()
1029 2000, 50000, false, dsi, TXCMSR); in rcar_mipi_dsi_host_tx_transfer()
1033 dev_err(dsi->dev, "Command transfer timeout (0x%08x)\n", in rcar_mipi_dsi_host_tx_transfer()
1044 struct rcar_mipi_dsi *dsi = host_to_rcar_mipi_dsi(host); in rcar_mipi_dsi_host_rx_transfer() local
1050 reg = rcar_mipi_dsi_read(dsi, TOSR); in rcar_mipi_dsi_host_rx_transfer()
1053 rcar_mipi_dsi_write(dsi, TOSR, TOSR_TATO); in rcar_mipi_dsi_host_rx_transfer()
1057 reg = rcar_mipi_dsi_read(dsi, RXPSR); in rcar_mipi_dsi_host_rx_transfer()
1077 data = rcar_mipi_dsi_read(dsi, RXPHDR); in rcar_mipi_dsi_host_rx_transfer()
1082 dev_warn(dsi->dev, in rcar_mipi_dsi_host_rx_transfer()
1089 dev_warn(dsi->dev, in rcar_mipi_dsi_host_rx_transfer()
1097 data = rcar_mipi_dsi_read(dsi, RXPPD0R + i); in rcar_mipi_dsi_host_rx_transfer()
1108 dev_warn(dsi->dev, in rcar_mipi_dsi_host_rx_transfer()
1123 2000, 50000, false, dsi, PPIDL0SR); in rcar_mipi_dsi_host_rx_transfer()
1125 dev_err(dsi->dev, "Command RX DIR timeout (0x%08x)\n", status); in rcar_mipi_dsi_host_rx_transfer()
1132 2000, 50000, false, dsi, PPIDL0SR); in rcar_mipi_dsi_host_rx_transfer()
1134 dev_err(dsi->dev, "Command RX STPST timeout (0x%08x)\n", status); in rcar_mipi_dsi_host_rx_transfer()
1145 struct rcar_mipi_dsi *dsi = host_to_rcar_mipi_dsi(host); in rcar_mipi_dsi_host_transfer() local
1150 dev_warn(dsi->dev, in rcar_mipi_dsi_host_transfer()
1169 * Until we can actually test with another DSI device, keep the in rcar_mipi_dsi_host_transfer()
1177 rcar_mipi_dsi_write(dsi, TXCMSR, TXCMSR_TXREQEND); in rcar_mipi_dsi_host_transfer()
1192 static int rcar_mipi_dsi_parse_dt(struct rcar_mipi_dsi *dsi) in rcar_mipi_dsi_parse_dt() argument
1196 ret = drm_of_get_data_lanes_count_ep(dsi->dev->of_node, 1, 0, 1, 4); in rcar_mipi_dsi_parse_dt()
1198 dev_err(dsi->dev, "missing or invalid data-lanes property\n"); in rcar_mipi_dsi_parse_dt()
1202 dsi->num_data_lanes = ret; in rcar_mipi_dsi_parse_dt()
1206 static struct clk *rcar_mipi_dsi_get_clock(struct rcar_mipi_dsi *dsi, in rcar_mipi_dsi_get_clock() argument
1212 clk = devm_clk_get(dsi->dev, name); in rcar_mipi_dsi_get_clock()
1219 dev_err_probe(dsi->dev, PTR_ERR(clk), "failed to get %s clock\n", in rcar_mipi_dsi_get_clock()
1225 static int rcar_mipi_dsi_get_clocks(struct rcar_mipi_dsi *dsi) in rcar_mipi_dsi_get_clocks() argument
1227 dsi->clocks.mod = rcar_mipi_dsi_get_clock(dsi, NULL, false); in rcar_mipi_dsi_get_clocks()
1228 if (IS_ERR(dsi->clocks.mod)) in rcar_mipi_dsi_get_clocks()
1229 return PTR_ERR(dsi->clocks.mod); in rcar_mipi_dsi_get_clocks()
1231 dsi->clocks.pll = rcar_mipi_dsi_get_clock(dsi, "pll", true); in rcar_mipi_dsi_get_clocks()
1232 if (IS_ERR(dsi->clocks.pll)) in rcar_mipi_dsi_get_clocks()
1233 return PTR_ERR(dsi->clocks.pll); in rcar_mipi_dsi_get_clocks()
1235 dsi->clocks.dsi = rcar_mipi_dsi_get_clock(dsi, "dsi", true); in rcar_mipi_dsi_get_clocks()
1236 if (IS_ERR(dsi->clocks.dsi)) in rcar_mipi_dsi_get_clocks()
1237 return PTR_ERR(dsi->clocks.dsi); in rcar_mipi_dsi_get_clocks()
1239 if (!dsi->clocks.pll && !dsi->clocks.dsi) { in rcar_mipi_dsi_get_clocks()
1240 dev_err(dsi->dev, "no input clock (pll, dsi)\n"); in rcar_mipi_dsi_get_clocks()
1249 struct rcar_mipi_dsi *dsi; in rcar_mipi_dsi_probe() local
1252 dsi = devm_drm_bridge_alloc(&pdev->dev, struct rcar_mipi_dsi, bridge, in rcar_mipi_dsi_probe()
1254 if (IS_ERR(dsi)) in rcar_mipi_dsi_probe()
1255 return PTR_ERR(dsi); in rcar_mipi_dsi_probe()
1257 platform_set_drvdata(pdev, dsi); in rcar_mipi_dsi_probe()
1259 dsi->dev = &pdev->dev; in rcar_mipi_dsi_probe()
1260 dsi->info = of_device_get_match_data(&pdev->dev); in rcar_mipi_dsi_probe()
1262 ret = rcar_mipi_dsi_parse_dt(dsi); in rcar_mipi_dsi_probe()
1267 dsi->mmio = devm_platform_ioremap_resource(pdev, 0); in rcar_mipi_dsi_probe()
1268 if (IS_ERR(dsi->mmio)) in rcar_mipi_dsi_probe()
1269 return PTR_ERR(dsi->mmio); in rcar_mipi_dsi_probe()
1271 ret = rcar_mipi_dsi_get_clocks(dsi); in rcar_mipi_dsi_probe()
1275 dsi->rstc = devm_reset_control_get(dsi->dev, NULL); in rcar_mipi_dsi_probe()
1276 if (IS_ERR(dsi->rstc)) { in rcar_mipi_dsi_probe()
1277 dev_err(dsi->dev, "failed to get cpg reset\n"); in rcar_mipi_dsi_probe()
1278 return PTR_ERR(dsi->rstc); in rcar_mipi_dsi_probe()
1281 /* Initialize the DSI host. */ in rcar_mipi_dsi_probe()
1282 dsi->host.dev = dsi->dev; in rcar_mipi_dsi_probe()
1283 dsi->host.ops = &rcar_mipi_dsi_host_ops; in rcar_mipi_dsi_probe()
1284 ret = mipi_dsi_host_register(&dsi->host); in rcar_mipi_dsi_probe()
1293 struct rcar_mipi_dsi *dsi = platform_get_drvdata(pdev); in rcar_mipi_dsi_remove() local
1295 mipi_dsi_host_unregister(&dsi->host); in rcar_mipi_dsi_remove()
1329 { .compatible = "renesas,r8a779a0-dsi-csi2-tx", .data = &v3u_data },
1330 { .compatible = "renesas,r8a779g0-dsi-csi2-tx", .data = &v4h_data },
1331 /* DSI in r8a779h0 is identical to r8a779g0 */
1332 { .compatible = "renesas,r8a779h0-dsi-csi2-tx", .data = &v4h_data },
1342 .name = "rcar-mipi-dsi",
1349 MODULE_DESCRIPTION("Renesas R-Car MIPI DSI Encoder Driver");