Lines Matching full:lvds
95 int (*probe)(struct rockchip_lvds *lvds);
96 void (*enable)(struct rockchip_lvds *lvds);
97 void (*disable)(struct rockchip_lvds *lvds);
139 struct rockchip_lvds *lvds = connector_to_lvds(connector); in rockchip_lvds_atomic_connector_get_property() local
143 *val = lvds->id; in rockchip_lvds_atomic_connector_get_property()
147 DRM_ERROR("failed to get rockchip LVDS property\n"); in rockchip_lvds_atomic_connector_get_property()
162 struct rockchip_lvds *lvds = connector_to_lvds(connector); in rockchip_lvds_connector_get_modes() local
163 struct drm_panel *panel = lvds->panel; in rockchip_lvds_connector_get_modes()
178 struct rockchip_lvds *lvds = encoder_to_lvds(encoder); in rockchip_lvds_encoder_atomic_mode_set() local
179 struct drm_connector *connector = &lvds->connector; in rockchip_lvds_encoder_atomic_mode_set()
188 lvds->format = LVDS_8BIT_MODE_FORMAT_2; in rockchip_lvds_encoder_atomic_mode_set()
191 lvds->format = LVDS_10BIT_MODE_FORMAT_2; in rockchip_lvds_encoder_atomic_mode_set()
194 lvds->format = LVDS_6BIT_MODE_FORMAT_1; in rockchip_lvds_encoder_atomic_mode_set()
197 lvds->format = LVDS_10BIT_MODE_FORMAT_1; in rockchip_lvds_encoder_atomic_mode_set()
201 lvds->format = LVDS_8BIT_MODE_FORMAT_1; in rockchip_lvds_encoder_atomic_mode_set()
205 if (lvds->secondary) in rockchip_lvds_encoder_atomic_mode_set()
206 lvds->secondary->format = lvds->format; in rockchip_lvds_encoder_atomic_mode_set()
208 drm_mode_copy(&lvds->mode, &crtc_state->adjusted_mode); in rockchip_lvds_encoder_atomic_mode_set()
217 struct rockchip_lvds *lvds = encoder_to_lvds(encoder); in rockchip_lvds_encoder_atomic_check() local
238 switch (lvds->pixel_order) { in rockchip_lvds_encoder_atomic_check()
263 if (lvds->id) in rockchip_lvds_encoder_atomic_check()
273 static void rockchip_lvds_enable(struct rockchip_lvds *lvds) in rockchip_lvds_enable() argument
277 if (lvds->funcs->enable) in rockchip_lvds_enable()
278 lvds->funcs->enable(lvds); in rockchip_lvds_enable()
280 ret = phy_set_mode(lvds->phy, PHY_MODE_LVDS); in rockchip_lvds_enable()
282 DRM_DEV_ERROR(lvds->dev, "failed to set phy mode: %d\n", ret); in rockchip_lvds_enable()
286 if (lvds->phy && !lvds->phy_enabled) { in rockchip_lvds_enable()
287 phy_power_on(lvds->phy); in rockchip_lvds_enable()
288 lvds->phy_enabled = true; in rockchip_lvds_enable()
291 if (lvds->secondary) in rockchip_lvds_enable()
292 rockchip_lvds_enable(lvds->secondary); in rockchip_lvds_enable()
295 static void rockchip_lvds_disable(struct rockchip_lvds *lvds) in rockchip_lvds_disable() argument
297 if (lvds->funcs->disable) in rockchip_lvds_disable()
298 lvds->funcs->disable(lvds); in rockchip_lvds_disable()
300 if (lvds->phy && lvds->phy_enabled) { in rockchip_lvds_disable()
301 phy_power_off(lvds->phy); in rockchip_lvds_disable()
302 lvds->phy_enabled = false; in rockchip_lvds_disable()
305 if (lvds->secondary) in rockchip_lvds_disable()
306 rockchip_lvds_disable(lvds->secondary); in rockchip_lvds_disable()
311 struct rockchip_lvds *lvds = encoder_to_lvds(encoder); in rockchip_lvds_encoder_enable() local
313 if (lvds->panel) in rockchip_lvds_encoder_enable()
314 drm_panel_prepare(lvds->panel); in rockchip_lvds_encoder_enable()
315 rockchip_lvds_enable(lvds); in rockchip_lvds_encoder_enable()
316 if (lvds->panel) in rockchip_lvds_encoder_enable()
317 drm_panel_enable(lvds->panel); in rockchip_lvds_encoder_enable()
322 struct rockchip_lvds *lvds = encoder_to_lvds(encoder); in rockchip_lvds_encoder_disable() local
324 if (lvds->panel) in rockchip_lvds_encoder_disable()
325 drm_panel_disable(lvds->panel); in rockchip_lvds_encoder_disable()
326 rockchip_lvds_disable(lvds); in rockchip_lvds_encoder_disable()
327 if (lvds->panel) in rockchip_lvds_encoder_disable()
328 drm_panel_unprepare(lvds->panel); in rockchip_lvds_encoder_disable()
334 struct rockchip_lvds *lvds = encoder_to_lvds(encoder); in rockchip_lvds_encoder_loader_protect() local
336 if (lvds->panel) in rockchip_lvds_encoder_loader_protect()
337 panel_simple_loader_protect(lvds->panel); in rockchip_lvds_encoder_loader_protect()
341 phy_init(lvds->phy); in rockchip_lvds_encoder_loader_protect()
342 if (lvds->phy) { in rockchip_lvds_encoder_loader_protect()
343 lvds->phy->power_count++; in rockchip_lvds_encoder_loader_protect()
344 lvds->phy_enabled = true; in rockchip_lvds_encoder_loader_protect()
347 phy_exit(lvds->phy); in rockchip_lvds_encoder_loader_protect()
348 if (lvds->phy) { in rockchip_lvds_encoder_loader_protect()
349 lvds->phy->power_count--; in rockchip_lvds_encoder_loader_protect()
350 lvds->phy_enabled = false; in rockchip_lvds_encoder_loader_protect()
371 struct rockchip_lvds *lvds = dev_get_drvdata(dev); in rockchip_lvds_match_by_id() local
374 return lvds->id == *id; in rockchip_lvds_match_by_id()
392 struct rockchip_lvds *lvds = dev_get_drvdata(dev); in rockchip_lvds_bind() local
394 struct drm_encoder *encoder = &lvds->encoder; in rockchip_lvds_bind()
395 struct drm_connector *connector = &lvds->connector; in rockchip_lvds_bind()
399 * dual channel lvds mode only need to register one connector. in rockchip_lvds_bind()
401 if (lvds->primary) in rockchip_lvds_bind()
405 &lvds->panel, &lvds->bridge); in rockchip_lvds_bind()
415 DRM_DEV_ERROR(lvds->dev, in rockchip_lvds_bind()
422 if (lvds->panel) { in rockchip_lvds_bind()
439 DRM_DEV_ERROR(lvds->dev, in rockchip_lvds_bind()
444 lvds->sub_dev.connector = &lvds->connector; in rockchip_lvds_bind()
445 lvds->sub_dev.of_node = lvds->dev->of_node; in rockchip_lvds_bind()
446 lvds->sub_dev.loader_protect = rockchip_lvds_encoder_loader_protect; in rockchip_lvds_bind()
447 rockchip_drm_register_sub_dev(&lvds->sub_dev); in rockchip_lvds_bind()
450 ret = drm_bridge_attach(encoder, lvds->bridge, NULL, 0); in rockchip_lvds_bind()
452 DRM_DEV_ERROR(lvds->dev, in rockchip_lvds_bind()
470 struct rockchip_lvds *lvds = dev_get_drvdata(dev); in rockchip_lvds_unbind() local
472 if (lvds->sub_dev.connector) in rockchip_lvds_unbind()
473 rockchip_drm_unregister_sub_dev(&lvds->sub_dev); in rockchip_lvds_unbind()
474 if (lvds->panel) in rockchip_lvds_unbind()
475 drm_connector_cleanup(&lvds->connector); in rockchip_lvds_unbind()
477 if (lvds->encoder.dev) in rockchip_lvds_unbind()
478 drm_encoder_cleanup(&lvds->encoder); in rockchip_lvds_unbind()
489 struct rockchip_lvds *lvds; in rockchip_lvds_probe() local
495 lvds = devm_kzalloc(dev, sizeof(*lvds), GFP_KERNEL); in rockchip_lvds_probe()
496 if (!lvds) in rockchip_lvds_probe()
499 lvds->id = of_alias_get_id(dev->of_node, "lvds"); in rockchip_lvds_probe()
500 if (lvds->id < 0) in rockchip_lvds_probe()
501 lvds->id = 0; in rockchip_lvds_probe()
503 lvds->dev = dev; in rockchip_lvds_probe()
504 lvds->funcs = of_device_get_match_data(dev); in rockchip_lvds_probe()
505 platform_set_drvdata(pdev, lvds); in rockchip_lvds_probe()
507 lvds->dual_channel = of_property_read_bool(dev->of_node, in rockchip_lvds_probe()
509 lvds->data_swap = of_property_read_bool(dev->of_node, in rockchip_lvds_probe()
512 lvds->phy = devm_phy_get(dev, "phy"); in rockchip_lvds_probe()
513 if (IS_ERR(lvds->phy)) { in rockchip_lvds_probe()
514 ret = PTR_ERR(lvds->phy); in rockchip_lvds_probe()
519 lvds->grf = syscon_node_to_regmap(dev->parent->of_node); in rockchip_lvds_probe()
520 if (IS_ERR(lvds->grf)) { in rockchip_lvds_probe()
521 ret = PTR_ERR(lvds->grf); in rockchip_lvds_probe()
526 lvds->pixel_order = -1; in rockchip_lvds_probe()
527 if (lvds->funcs->probe) { in rockchip_lvds_probe()
528 ret = lvds->funcs->probe(lvds); in rockchip_lvds_probe()
543 static void px30_lvds_enable(struct rockchip_lvds *lvds) in px30_lvds_enable() argument
545 int pipe = drm_of_encoder_active_endpoint_id(lvds->dev->of_node, in px30_lvds_enable()
546 &lvds->encoder); in px30_lvds_enable()
548 regmap_write(lvds->grf, PX30_GRF_PD_VO_CON1, in px30_lvds_enable()
549 PX30_LVDS_SELECT(lvds->format) | in px30_lvds_enable()
554 static void px30_lvds_disable(struct rockchip_lvds *lvds) in px30_lvds_disable() argument
556 regmap_write(lvds->grf, PX30_GRF_PD_VO_CON1, in px30_lvds_disable()
565 static void rk3126_lvds_enable(struct rockchip_lvds *lvds) in rk3126_lvds_enable() argument
567 regmap_write(lvds->grf, RK3126_GRF_LVDS_CON0, in rk3126_lvds_enable()
569 RK3126_LVDS_MSBSEL(1) | RK3126_LVDS_SELECT(lvds->format)); in rk3126_lvds_enable()
572 static void rk3126_lvds_disable(struct rockchip_lvds *lvds) in rk3126_lvds_disable() argument
574 regmap_write(lvds->grf, RK3126_GRF_LVDS_CON0, in rk3126_lvds_disable()
583 static void rk3288_lvds_enable(struct rockchip_lvds *lvds) in rk3288_lvds_enable() argument
585 struct drm_display_mode *mode = &lvds->mode; in rk3288_lvds_enable()
589 pipe = drm_of_encoder_active_endpoint_id(lvds->dev->of_node, in rk3288_lvds_enable()
590 &lvds->encoder); in rk3288_lvds_enable()
591 regmap_write(lvds->grf, RK3288_GRF_SOC_CON6, in rk3288_lvds_enable()
595 RK3288_LVDS_CON_CHASEL(lvds->dual_channel) | in rk3288_lvds_enable()
596 RK3288_LVDS_CON_SELECT(lvds->format); in rk3288_lvds_enable()
598 if (lvds->dual_channel) { in rk3288_lvds_enable()
603 RK3288_LVDS_CON_STARTSEL(lvds->data_swap); in rk3288_lvds_enable()
615 regmap_write(lvds->grf, RK3288_GRF_SOC_CON7, val); in rk3288_lvds_enable()
617 phy_set_bus_width(lvds->phy, lvds->dual_channel ? 2 : 1); in rk3288_lvds_enable()
620 static void rk3288_lvds_disable(struct rockchip_lvds *lvds) in rk3288_lvds_disable() argument
622 regmap_write(lvds->grf, RK3288_GRF_SOC_CON7, RK3288_LVDS_PWRDWN(1)); in rk3288_lvds_disable()
630 static void rk3368_lvds_enable(struct rockchip_lvds *lvds) in rk3368_lvds_enable() argument
632 regmap_write(lvds->grf, RK3368_GRF_SOC_CON7, in rk3368_lvds_enable()
633 RK3368_LVDS_SELECT(lvds->format) | in rk3368_lvds_enable()
638 static void rk3368_lvds_disable(struct rockchip_lvds *lvds) in rk3368_lvds_disable() argument
640 regmap_write(lvds->grf, RK3368_GRF_SOC_CON7, in rk3368_lvds_disable()
649 static int __maybe_unused rockchip_secondary_lvds_probe(struct rockchip_lvds *lvds) in rockchip_secondary_lvds_probe() argument
651 if (lvds->dual_channel) { in rockchip_secondary_lvds_probe()
656 secondary = rockchip_lvds_find_by_id(lvds->dev->driver, 1); in rockchip_secondary_lvds_probe()
660 port0 = of_graph_get_port_by_id(lvds->dev->of_node, 1); in rockchip_secondary_lvds_probe()
666 secondary->primary = lvds; in rockchip_secondary_lvds_probe()
667 lvds->secondary = secondary; in rockchip_secondary_lvds_probe()
668 lvds->pixel_order = pixel_order >= 0 ? pixel_order : 0; in rockchip_secondary_lvds_probe()
674 static void rk3562_lvds_enable(struct rockchip_lvds *lvds) in rk3562_lvds_enable() argument
676 regmap_write(lvds->grf, RK3562_GRF_VO_CON1, in rk3562_lvds_enable()
679 regmap_write(lvds->grf, RK3562_GRF_VO_CON0, in rk3562_lvds_enable()
680 RK3568_LVDS0_SELECT(lvds->format) | RK3568_LVDS0_MSBSEL(1)); in rk3562_lvds_enable()
683 static void rk3562_lvds_disable(struct rockchip_lvds *lvds) in rk3562_lvds_disable() argument
685 regmap_write(lvds->grf, RK3562_GRF_VO_CON1, RK3568_LVDS0_MODE_EN(0)); in rk3562_lvds_disable()
693 static void rk3568_lvds_enable(struct rockchip_lvds *lvds) in rk3568_lvds_enable() argument
695 regmap_write(lvds->grf, RK3568_GRF_VO_CON2, in rk3568_lvds_enable()
698 regmap_write(lvds->grf, RK3568_GRF_VO_CON0, in rk3568_lvds_enable()
699 RK3568_LVDS0_SELECT(lvds->format) | RK3568_LVDS0_MSBSEL(1)); in rk3568_lvds_enable()
702 static void rk3568_lvds_disable(struct rockchip_lvds *lvds) in rk3568_lvds_disable() argument
704 regmap_write(lvds->grf, RK3568_GRF_VO_CON2, RK3568_LVDS0_MODE_EN(0)); in rk3568_lvds_disable()
713 { .compatible = "rockchip,px30-lvds", .data = &px30_lvds_funcs },
714 { .compatible = "rockchip,rk3126-lvds", .data = &rk3126_lvds_funcs },
715 { .compatible = "rockchip,rk3288-lvds", .data = &rk3288_lvds_funcs },
716 { .compatible = "rockchip,rk3368-lvds", .data = &rk3368_lvds_funcs },
717 { .compatible = "rockchip,rk3562-lvds", .data = &rk3562_lvds_funcs },
718 { .compatible = "rockchip,rk3568-lvds", .data = &rk3568_lvds_funcs },
727 .name = "rockchip-lvds",