Lines Matching refs:dsi

164 static void rzg2l_mipi_dsi_phy_write(struct rzg2l_mipi_dsi *dsi, u32 reg, u32 data)  in rzg2l_mipi_dsi_phy_write()  argument
166 iowrite32(data, dsi->mmio + reg); in rzg2l_mipi_dsi_phy_write()
169 static void rzg2l_mipi_dsi_link_write(struct rzg2l_mipi_dsi *dsi, u32 reg, u32 data) in rzg2l_mipi_dsi_link_write() argument
171 iowrite32(data, dsi->mmio + LINK_REG_OFFSET + reg); in rzg2l_mipi_dsi_link_write()
174 static u32 rzg2l_mipi_dsi_phy_read(struct rzg2l_mipi_dsi *dsi, u32 reg) in rzg2l_mipi_dsi_phy_read() argument
176 return ioread32(dsi->mmio + reg); in rzg2l_mipi_dsi_phy_read()
179 static u32 rzg2l_mipi_dsi_link_read(struct rzg2l_mipi_dsi *dsi, u32 reg) in rzg2l_mipi_dsi_link_read() argument
181 return ioread32(dsi->mmio + LINK_REG_OFFSET + reg); in rzg2l_mipi_dsi_link_read()
188 static int rzg2l_mipi_dsi_dphy_init(struct rzg2l_mipi_dsi *dsi, in rzg2l_mipi_dsi_dphy_init() argument
211 rzg2l_mipi_dsi_phy_write(dsi, DSIDPHYCTRL0, dphyctrl0); in rzg2l_mipi_dsi_dphy_init()
215 rzg2l_mipi_dsi_phy_write(dsi, DSIDPHYCTRL0, dphyctrl0); in rzg2l_mipi_dsi_dphy_init()
233 rzg2l_mipi_dsi_phy_write(dsi, DSIDPHYTIM0, dphytim0); in rzg2l_mipi_dsi_dphy_init()
234 rzg2l_mipi_dsi_phy_write(dsi, DSIDPHYTIM1, dphytim1); in rzg2l_mipi_dsi_dphy_init()
235 rzg2l_mipi_dsi_phy_write(dsi, DSIDPHYTIM2, dphytim2); in rzg2l_mipi_dsi_dphy_init()
236 rzg2l_mipi_dsi_phy_write(dsi, DSIDPHYTIM3, dphytim3); in rzg2l_mipi_dsi_dphy_init()
238 ret = reset_control_deassert(dsi->rstc); in rzg2l_mipi_dsi_dphy_init()
247 static void rzg2l_mipi_dsi_dphy_exit(struct rzg2l_mipi_dsi *dsi) in rzg2l_mipi_dsi_dphy_exit() argument
251 dphyctrl0 = rzg2l_mipi_dsi_phy_read(dsi, DSIDPHYCTRL0); in rzg2l_mipi_dsi_dphy_exit()
254 rzg2l_mipi_dsi_phy_write(dsi, DSIDPHYCTRL0, dphyctrl0); in rzg2l_mipi_dsi_dphy_exit()
256 reset_control_assert(dsi->rstc); in rzg2l_mipi_dsi_dphy_exit()
259 static int rzg2l_mipi_dsi_startup(struct rzg2l_mipi_dsi *dsi, in rzg2l_mipi_dsi_startup() argument
283 bpp = mipi_dsi_pixel_format_to_bpp(dsi->format); in rzg2l_mipi_dsi_startup()
284 hsfreq = (mode->clock * bpp * 8) / (8 * dsi->lanes); in rzg2l_mipi_dsi_startup()
286 ret = pm_runtime_resume_and_get(dsi->dev); in rzg2l_mipi_dsi_startup()
290 clk_set_rate(dsi->vclk, mode->clock * 1000); in rzg2l_mipi_dsi_startup()
292 ret = rzg2l_mipi_dsi_dphy_init(dsi, hsfreq); in rzg2l_mipi_dsi_startup()
297 txsetr = TXSETR_DLEN | TXSETR_NUMLANEUSE(dsi->lanes - 1) | TXSETR_CLEN; in rzg2l_mipi_dsi_startup()
298 rzg2l_mipi_dsi_link_write(dsi, TXSETR, txsetr); in rzg2l_mipi_dsi_startup()
327 rzg2l_mipi_dsi_link_write(dsi, CLSTPTSETR, clstptsetr); in rzg2l_mipi_dsi_startup()
330 rzg2l_mipi_dsi_link_write(dsi, LPTRNSTSETR, lptrnstsetr); in rzg2l_mipi_dsi_startup()
335 rzg2l_mipi_dsi_dphy_exit(dsi); in rzg2l_mipi_dsi_startup()
336 pm_runtime_put(dsi->dev); in rzg2l_mipi_dsi_startup()
341 static void rzg2l_mipi_dsi_stop(struct rzg2l_mipi_dsi *dsi) in rzg2l_mipi_dsi_stop() argument
343 rzg2l_mipi_dsi_dphy_exit(dsi); in rzg2l_mipi_dsi_stop()
344 pm_runtime_put(dsi->dev); in rzg2l_mipi_dsi_stop()
347 static void rzg2l_mipi_dsi_set_display_timing(struct rzg2l_mipi_dsi *dsi, in rzg2l_mipi_dsi_set_display_timing() argument
360 dsi_format = mipi_dsi_pixel_format_to_bpp(dsi->format); in rzg2l_mipi_dsi_set_display_timing()
370 if ((dsi->mode_flags & MIPI_DSI_MODE_VIDEO_SYNC_PULSE) && in rzg2l_mipi_dsi_set_display_timing()
371 !(dsi->mode_flags & MIPI_DSI_MODE_VIDEO_BURST)) in rzg2l_mipi_dsi_set_display_timing()
374 rzg2l_mipi_dsi_link_write(dsi, VICH1PPSETR, vich1ppsetr); in rzg2l_mipi_dsi_set_display_timing()
393 rzg2l_mipi_dsi_link_write(dsi, VICH1VSSETR, vich1vssetr); in rzg2l_mipi_dsi_set_display_timing()
394 rzg2l_mipi_dsi_link_write(dsi, VICH1VPSETR, vich1vpsetr); in rzg2l_mipi_dsi_set_display_timing()
395 rzg2l_mipi_dsi_link_write(dsi, VICH1HSSETR, vich1hssetr); in rzg2l_mipi_dsi_set_display_timing()
396 rzg2l_mipi_dsi_link_write(dsi, VICH1HPSETR, vich1hpsetr); in rzg2l_mipi_dsi_set_display_timing()
411 if (dsi->mode_flags & MIPI_DSI_CLOCK_NON_CONTINUOUS) in rzg2l_mipi_dsi_set_display_timing()
416 rzg2l_mipi_dsi_link_write(dsi, VICH1SET1R, in rzg2l_mipi_dsi_set_display_timing()
420 static int rzg2l_mipi_dsi_start_hs_clock(struct rzg2l_mipi_dsi *dsi) in rzg2l_mipi_dsi_start_hs_clock() argument
427 is_clk_cont = !(dsi->mode_flags & MIPI_DSI_CLOCK_NON_CONTINUOUS); in rzg2l_mipi_dsi_start_hs_clock()
433 rzg2l_mipi_dsi_link_write(dsi, HSCLKSETR, hsclksetr); in rzg2l_mipi_dsi_start_hs_clock()
438 2000, 20000, false, dsi, PLSR); in rzg2l_mipi_dsi_start_hs_clock()
440 dev_err(dsi->dev, "failed to start HS clock\n"); in rzg2l_mipi_dsi_start_hs_clock()
445 dev_dbg(dsi->dev, "Start High Speed Clock with %s clock mode", in rzg2l_mipi_dsi_start_hs_clock()
451 static int rzg2l_mipi_dsi_stop_hs_clock(struct rzg2l_mipi_dsi *dsi) in rzg2l_mipi_dsi_stop_hs_clock() argument
457 is_clk_cont = !(dsi->mode_flags & MIPI_DSI_CLOCK_NON_CONTINUOUS); in rzg2l_mipi_dsi_stop_hs_clock()
460 rzg2l_mipi_dsi_link_write(dsi, HSCLKSETR, in rzg2l_mipi_dsi_stop_hs_clock()
467 2000, 20000, false, dsi, PLSR); in rzg2l_mipi_dsi_stop_hs_clock()
469 dev_err(dsi->dev, "failed to stop HS clock\n"); in rzg2l_mipi_dsi_stop_hs_clock()
477 static int rzg2l_mipi_dsi_start_video(struct rzg2l_mipi_dsi *dsi) in rzg2l_mipi_dsi_start_video() argument
486 rzg2l_mipi_dsi_link_write(dsi, VICH1SET0R, vich1set0r); in rzg2l_mipi_dsi_start_video()
490 2000, 20000, false, dsi, VICH1SR); in rzg2l_mipi_dsi_start_video()
492 dev_err(dsi->dev, "Failed to start video signal input\n"); in rzg2l_mipi_dsi_start_video()
497 static int rzg2l_mipi_dsi_stop_video(struct rzg2l_mipi_dsi *dsi) in rzg2l_mipi_dsi_stop_video() argument
502 rzg2l_mipi_dsi_link_write(dsi, VICH1SET0R, VICH1SET0R_VSTPAFT); in rzg2l_mipi_dsi_stop_video()
505 2000, 20000, false, dsi, VICH1SR); in rzg2l_mipi_dsi_stop_video()
511 2000, 20000, false, dsi, LINKSR); in rzg2l_mipi_dsi_stop_video()
518 dev_err(dsi->dev, "Failed to stop video signal input\n"); in rzg2l_mipi_dsi_stop_video()
529 struct rzg2l_mipi_dsi *dsi = bridge_to_rzg2l_mipi_dsi(bridge); in rzg2l_mipi_dsi_attach() local
531 return drm_bridge_attach(bridge->encoder, dsi->next_bridge, bridge, in rzg2l_mipi_dsi_attach()
539 struct rzg2l_mipi_dsi *dsi = bridge_to_rzg2l_mipi_dsi(bridge); in rzg2l_mipi_dsi_atomic_enable() local
549 ret = rzg2l_mipi_dsi_startup(dsi, mode); in rzg2l_mipi_dsi_atomic_enable()
553 rzg2l_mipi_dsi_set_display_timing(dsi, mode); in rzg2l_mipi_dsi_atomic_enable()
555 ret = rzg2l_mipi_dsi_start_hs_clock(dsi); in rzg2l_mipi_dsi_atomic_enable()
559 ret = rzg2l_mipi_dsi_start_video(dsi); in rzg2l_mipi_dsi_atomic_enable()
566 rzg2l_mipi_dsi_stop_hs_clock(dsi); in rzg2l_mipi_dsi_atomic_enable()
568 rzg2l_mipi_dsi_stop(dsi); in rzg2l_mipi_dsi_atomic_enable()
574 struct rzg2l_mipi_dsi *dsi = bridge_to_rzg2l_mipi_dsi(bridge); in rzg2l_mipi_dsi_atomic_disable() local
576 rzg2l_mipi_dsi_stop_video(dsi); in rzg2l_mipi_dsi_atomic_disable()
577 rzg2l_mipi_dsi_stop_hs_clock(dsi); in rzg2l_mipi_dsi_atomic_disable()
578 rzg2l_mipi_dsi_stop(dsi); in rzg2l_mipi_dsi_atomic_disable()
609 struct rzg2l_mipi_dsi *dsi = host_to_rzg2l_mipi_dsi(host); in rzg2l_mipi_dsi_host_attach() local
612 if (device->lanes > dsi->num_data_lanes) { in rzg2l_mipi_dsi_host_attach()
613 dev_err(dsi->dev, in rzg2l_mipi_dsi_host_attach()
615 device->lanes, dsi->num_data_lanes); in rzg2l_mipi_dsi_host_attach()
624 dev_err(dsi->dev, "Unsupported format 0x%04x\n", device->format); in rzg2l_mipi_dsi_host_attach()
628 dsi->lanes = device->lanes; in rzg2l_mipi_dsi_host_attach()
629 dsi->format = device->format; in rzg2l_mipi_dsi_host_attach()
630 dsi->mode_flags = device->mode_flags; in rzg2l_mipi_dsi_host_attach()
632 dsi->next_bridge = devm_drm_of_get_bridge(dsi->dev, dsi->dev->of_node, in rzg2l_mipi_dsi_host_attach()
634 if (IS_ERR(dsi->next_bridge)) { in rzg2l_mipi_dsi_host_attach()
635 ret = PTR_ERR(dsi->next_bridge); in rzg2l_mipi_dsi_host_attach()
636 dev_err(dsi->dev, "failed to get next bridge: %d\n", ret); in rzg2l_mipi_dsi_host_attach()
640 drm_bridge_add(&dsi->bridge); in rzg2l_mipi_dsi_host_attach()
648 struct rzg2l_mipi_dsi *dsi = host_to_rzg2l_mipi_dsi(host); in rzg2l_mipi_dsi_host_detach() local
650 drm_bridge_remove(&dsi->bridge); in rzg2l_mipi_dsi_host_detach()
666 struct rzg2l_mipi_dsi *dsi = dev_get_drvdata(dev); in rzg2l_mipi_pm_runtime_suspend() local
668 reset_control_assert(dsi->prstc); in rzg2l_mipi_pm_runtime_suspend()
669 reset_control_assert(dsi->arstc); in rzg2l_mipi_pm_runtime_suspend()
676 struct rzg2l_mipi_dsi *dsi = dev_get_drvdata(dev); in rzg2l_mipi_pm_runtime_resume() local
679 ret = reset_control_deassert(dsi->arstc); in rzg2l_mipi_pm_runtime_resume()
683 ret = reset_control_deassert(dsi->prstc); in rzg2l_mipi_pm_runtime_resume()
685 reset_control_assert(dsi->arstc); in rzg2l_mipi_pm_runtime_resume()
701 struct rzg2l_mipi_dsi *dsi; in rzg2l_mipi_dsi_probe() local
705 dsi = devm_kzalloc(&pdev->dev, sizeof(*dsi), GFP_KERNEL); in rzg2l_mipi_dsi_probe()
706 if (!dsi) in rzg2l_mipi_dsi_probe()
709 platform_set_drvdata(pdev, dsi); in rzg2l_mipi_dsi_probe()
710 dsi->dev = &pdev->dev; in rzg2l_mipi_dsi_probe()
712 ret = drm_of_get_data_lanes_count_ep(dsi->dev->of_node, 1, 0, 1, 4); in rzg2l_mipi_dsi_probe()
714 return dev_err_probe(dsi->dev, ret, in rzg2l_mipi_dsi_probe()
719 dsi->mmio = devm_platform_ioremap_resource(pdev, 0); in rzg2l_mipi_dsi_probe()
720 if (IS_ERR(dsi->mmio)) in rzg2l_mipi_dsi_probe()
721 return PTR_ERR(dsi->mmio); in rzg2l_mipi_dsi_probe()
723 dsi->vclk = devm_clk_get(dsi->dev, "vclk"); in rzg2l_mipi_dsi_probe()
724 if (IS_ERR(dsi->vclk)) in rzg2l_mipi_dsi_probe()
725 return PTR_ERR(dsi->vclk); in rzg2l_mipi_dsi_probe()
727 dsi->rstc = devm_reset_control_get_exclusive(dsi->dev, "rst"); in rzg2l_mipi_dsi_probe()
728 if (IS_ERR(dsi->rstc)) in rzg2l_mipi_dsi_probe()
729 return dev_err_probe(dsi->dev, PTR_ERR(dsi->rstc), in rzg2l_mipi_dsi_probe()
732 dsi->arstc = devm_reset_control_get_exclusive(dsi->dev, "arst"); in rzg2l_mipi_dsi_probe()
733 if (IS_ERR(dsi->arstc)) in rzg2l_mipi_dsi_probe()
734 return dev_err_probe(&pdev->dev, PTR_ERR(dsi->arstc), in rzg2l_mipi_dsi_probe()
737 dsi->prstc = devm_reset_control_get_exclusive(dsi->dev, "prst"); in rzg2l_mipi_dsi_probe()
738 if (IS_ERR(dsi->prstc)) in rzg2l_mipi_dsi_probe()
739 return dev_err_probe(dsi->dev, PTR_ERR(dsi->prstc), in rzg2l_mipi_dsi_probe()
742 platform_set_drvdata(pdev, dsi); in rzg2l_mipi_dsi_probe()
744 pm_runtime_enable(dsi->dev); in rzg2l_mipi_dsi_probe()
746 ret = pm_runtime_resume_and_get(dsi->dev); in rzg2l_mipi_dsi_probe()
755 ret = rzg2l_mipi_dsi_dphy_init(dsi, 80000); in rzg2l_mipi_dsi_probe()
759 txsetr = rzg2l_mipi_dsi_link_read(dsi, TXSETR); in rzg2l_mipi_dsi_probe()
760 dsi->num_data_lanes = min(((txsetr >> 16) & 3) + 1, num_data_lanes); in rzg2l_mipi_dsi_probe()
761 rzg2l_mipi_dsi_dphy_exit(dsi); in rzg2l_mipi_dsi_probe()
762 pm_runtime_put(dsi->dev); in rzg2l_mipi_dsi_probe()
765 dsi->bridge.funcs = &rzg2l_mipi_dsi_bridge_ops; in rzg2l_mipi_dsi_probe()
766 dsi->bridge.of_node = dsi->dev->of_node; in rzg2l_mipi_dsi_probe()
769 dsi->host.dev = dsi->dev; in rzg2l_mipi_dsi_probe()
770 dsi->host.ops = &rzg2l_mipi_dsi_host_ops; in rzg2l_mipi_dsi_probe()
771 ret = mipi_dsi_host_register(&dsi->host); in rzg2l_mipi_dsi_probe()
778 rzg2l_mipi_dsi_dphy_exit(dsi); in rzg2l_mipi_dsi_probe()
779 pm_runtime_put(dsi->dev); in rzg2l_mipi_dsi_probe()
781 pm_runtime_disable(dsi->dev); in rzg2l_mipi_dsi_probe()
787 struct rzg2l_mipi_dsi *dsi = platform_get_drvdata(pdev); in rzg2l_mipi_dsi_remove() local
789 mipi_dsi_host_unregister(&dsi->host); in rzg2l_mipi_dsi_remove()