Lines Matching refs:bridge

220 bool drm_bridge_enter(struct drm_bridge *bridge, int *idx)  in drm_bridge_enter()  argument
224 if (bridge->unplugged) { in drm_bridge_enter()
257 void drm_bridge_unplug(struct drm_bridge *bridge) in drm_bridge_unplug() argument
259 bridge->unplugged = true; in drm_bridge_unplug()
263 drm_bridge_remove(bridge); in drm_bridge_unplug()
269 struct drm_bridge *bridge = container_of(kref, struct drm_bridge, refcount); in __drm_bridge_free() local
272 list_del(&bridge->list); in __drm_bridge_free()
275 if (bridge->funcs->destroy) in __drm_bridge_free()
276 bridge->funcs->destroy(bridge); in __drm_bridge_free()
278 drm_bridge_put(bridge->next_bridge); in __drm_bridge_free()
280 kfree(bridge->container); in __drm_bridge_free()
292 struct drm_bridge *drm_bridge_get(struct drm_bridge *bridge) in drm_bridge_get() argument
294 if (bridge) in drm_bridge_get()
295 kref_get(&bridge->refcount); in drm_bridge_get()
297 return bridge; in drm_bridge_get()
308 void drm_bridge_put(struct drm_bridge *bridge) in drm_bridge_put() argument
310 if (bridge) in drm_bridge_put()
311 kref_put(&bridge->refcount, __drm_bridge_free); in drm_bridge_put()
325 struct drm_bridge *bridge = (struct drm_bridge *)data; in drm_bridge_put_void() local
327 drm_bridge_put(bridge); in drm_bridge_put_void()
334 struct drm_bridge *bridge; in __devm_drm_bridge_alloc() local
346 bridge = container + offset; in __devm_drm_bridge_alloc()
347 INIT_LIST_HEAD(&bridge->list); in __devm_drm_bridge_alloc()
348 bridge->container = container; in __devm_drm_bridge_alloc()
349 bridge->funcs = funcs; in __devm_drm_bridge_alloc()
350 kref_init(&bridge->refcount); in __devm_drm_bridge_alloc()
352 err = devm_add_action_or_reset(dev, drm_bridge_put_void, bridge); in __devm_drm_bridge_alloc()
371 void drm_bridge_add(struct drm_bridge *bridge) in drm_bridge_add() argument
373 if (!bridge->container) in drm_bridge_add()
376 drm_bridge_get(bridge); in drm_bridge_add()
383 if (!list_empty(&bridge->list)) in drm_bridge_add()
384 list_del_init(&bridge->list); in drm_bridge_add()
386 mutex_init(&bridge->hpd_mutex); in drm_bridge_add()
388 if (bridge->ops & DRM_BRIDGE_OP_HDMI) in drm_bridge_add()
389 bridge->ycbcr_420_allowed = !!(bridge->supported_formats & in drm_bridge_add()
393 list_add_tail(&bridge->list, &bridge_list); in drm_bridge_add()
398 static void drm_bridge_remove_void(void *bridge) in drm_bridge_remove_void() argument
400 drm_bridge_remove(bridge); in drm_bridge_remove_void()
414 int devm_drm_bridge_add(struct device *dev, struct drm_bridge *bridge) in devm_drm_bridge_add() argument
416 drm_bridge_add(bridge); in devm_drm_bridge_add()
417 return devm_add_action_or_reset(dev, drm_bridge_remove_void, bridge); in devm_drm_bridge_add()
431 void drm_bridge_remove(struct drm_bridge *bridge) in drm_bridge_remove() argument
434 list_move_tail(&bridge->list, &bridge_lingering_list); in drm_bridge_remove()
437 mutex_destroy(&bridge->hpd_mutex); in drm_bridge_remove()
439 drm_bridge_put(bridge); in drm_bridge_remove()
446 struct drm_bridge *bridge = drm_priv_to_bridge(obj); in drm_bridge_atomic_duplicate_priv_state() local
449 state = bridge->funcs->atomic_duplicate_state(bridge); in drm_bridge_atomic_duplicate_priv_state()
458 struct drm_bridge *bridge = drm_priv_to_bridge(obj); in drm_bridge_atomic_destroy_priv_state() local
460 bridge->funcs->atomic_destroy_state(bridge, state); in drm_bridge_atomic_destroy_priv_state()
468 static bool drm_bridge_is_atomic(struct drm_bridge *bridge) in drm_bridge_is_atomic() argument
470 return bridge->funcs->atomic_reset != NULL; in drm_bridge_is_atomic()
499 int drm_bridge_attach(struct drm_encoder *encoder, struct drm_bridge *bridge, in drm_bridge_attach() argument
505 if (!encoder || !bridge) in drm_bridge_attach()
508 if (!bridge->container) in drm_bridge_attach()
511 if (list_empty(&bridge->list)) in drm_bridge_attach()
514 drm_bridge_get(bridge); in drm_bridge_attach()
521 if (bridge->dev) { in drm_bridge_attach()
526 bridge->dev = encoder->dev; in drm_bridge_attach()
527 bridge->encoder = encoder; in drm_bridge_attach()
530 list_add(&bridge->chain_node, &previous->chain_node); in drm_bridge_attach()
532 list_add(&bridge->chain_node, &encoder->bridge_chain); in drm_bridge_attach()
534 if (bridge->funcs->attach) { in drm_bridge_attach()
535 ret = bridge->funcs->attach(bridge, encoder, flags); in drm_bridge_attach()
540 if (drm_bridge_is_atomic(bridge)) { in drm_bridge_attach()
543 state = bridge->funcs->atomic_reset(bridge); in drm_bridge_attach()
549 drm_atomic_private_obj_init(bridge->dev, &bridge->base, in drm_bridge_attach()
557 if (bridge->funcs->detach) in drm_bridge_attach()
558 bridge->funcs->detach(bridge); in drm_bridge_attach()
561 bridge->dev = NULL; in drm_bridge_attach()
562 bridge->encoder = NULL; in drm_bridge_attach()
563 list_del(&bridge->chain_node); in drm_bridge_attach()
567 bridge->of_node, encoder->name, ret); in drm_bridge_attach()
571 bridge->of_node, encoder->name); in drm_bridge_attach()
574 drm_bridge_put(bridge); in drm_bridge_attach()
579 void drm_bridge_detach(struct drm_bridge *bridge) in drm_bridge_detach() argument
581 if (WARN_ON(!bridge)) in drm_bridge_detach()
584 if (WARN_ON(!bridge->dev)) in drm_bridge_detach()
587 if (drm_bridge_is_atomic(bridge)) in drm_bridge_detach()
588 drm_atomic_private_obj_fini(&bridge->base); in drm_bridge_detach()
590 if (bridge->funcs->detach) in drm_bridge_detach()
591 bridge->funcs->detach(bridge); in drm_bridge_detach()
593 list_del(&bridge->chain_node); in drm_bridge_detach()
594 bridge->dev = NULL; in drm_bridge_detach()
595 drm_bridge_put(bridge); in drm_bridge_detach()
704 drm_bridge_chain_mode_valid(struct drm_bridge *bridge, in drm_bridge_chain_mode_valid() argument
710 if (!bridge) in drm_bridge_chain_mode_valid()
713 encoder = bridge->encoder; in drm_bridge_chain_mode_valid()
714 list_for_each_entry_from(bridge, &encoder->bridge_chain, chain_node) { in drm_bridge_chain_mode_valid()
717 if (!bridge->funcs->mode_valid) in drm_bridge_chain_mode_valid()
720 ret = bridge->funcs->mode_valid(bridge, info, mode); in drm_bridge_chain_mode_valid()
741 void drm_bridge_chain_mode_set(struct drm_bridge *bridge, in drm_bridge_chain_mode_set() argument
747 if (!bridge) in drm_bridge_chain_mode_set()
750 encoder = bridge->encoder; in drm_bridge_chain_mode_set()
751 list_for_each_entry_from(bridge, &encoder->bridge_chain, chain_node) { in drm_bridge_chain_mode_set()
752 if (bridge->funcs->mode_set) in drm_bridge_chain_mode_set()
753 bridge->funcs->mode_set(bridge, mode, adjusted_mode); in drm_bridge_chain_mode_set()
770 void drm_atomic_bridge_chain_disable(struct drm_bridge *bridge, in drm_atomic_bridge_chain_disable() argument
776 if (!bridge) in drm_atomic_bridge_chain_disable()
779 encoder = bridge->encoder; in drm_atomic_bridge_chain_disable()
787 if (iter == bridge) in drm_atomic_bridge_chain_disable()
793 static void drm_atomic_bridge_call_post_disable(struct drm_bridge *bridge, in drm_atomic_bridge_call_post_disable() argument
796 if (state && bridge->funcs->atomic_post_disable) in drm_atomic_bridge_call_post_disable()
797 bridge->funcs->atomic_post_disable(bridge, state); in drm_atomic_bridge_call_post_disable()
798 else if (bridge->funcs->post_disable) in drm_atomic_bridge_call_post_disable()
799 bridge->funcs->post_disable(bridge); in drm_atomic_bridge_call_post_disable()
826 void drm_atomic_bridge_chain_post_disable(struct drm_bridge *bridge, in drm_atomic_bridge_chain_post_disable() argument
832 if (!bridge) in drm_atomic_bridge_chain_post_disable()
835 encoder = bridge->encoder; in drm_atomic_bridge_chain_post_disable()
837 list_for_each_entry_from(bridge, &encoder->bridge_chain, chain_node) { in drm_atomic_bridge_chain_post_disable()
840 if (!list_is_last(&bridge->chain_node, &encoder->bridge_chain)) { in drm_atomic_bridge_chain_post_disable()
841 next = list_next_entry(bridge, chain_node); in drm_atomic_bridge_chain_post_disable()
870 if (next == bridge) in drm_atomic_bridge_chain_post_disable()
879 drm_atomic_bridge_call_post_disable(bridge, state); in drm_atomic_bridge_chain_post_disable()
883 bridge = limit; in drm_atomic_bridge_chain_post_disable()
888 static void drm_atomic_bridge_call_pre_enable(struct drm_bridge *bridge, in drm_atomic_bridge_call_pre_enable() argument
891 if (state && bridge->funcs->atomic_pre_enable) in drm_atomic_bridge_call_pre_enable()
892 bridge->funcs->atomic_pre_enable(bridge, state); in drm_atomic_bridge_call_pre_enable()
893 else if (bridge->funcs->pre_enable) in drm_atomic_bridge_call_pre_enable()
894 bridge->funcs->pre_enable(bridge); in drm_atomic_bridge_call_pre_enable()
920 void drm_atomic_bridge_chain_pre_enable(struct drm_bridge *bridge, in drm_atomic_bridge_chain_pre_enable() argument
926 if (!bridge) in drm_atomic_bridge_chain_pre_enable()
929 encoder = bridge->encoder; in drm_atomic_bridge_chain_pre_enable()
934 limit = bridge; in drm_atomic_bridge_chain_pre_enable()
938 if (next == bridge) in drm_atomic_bridge_chain_pre_enable()
970 if (iter == bridge) in drm_atomic_bridge_chain_pre_enable()
988 void drm_atomic_bridge_chain_enable(struct drm_bridge *bridge, in drm_atomic_bridge_chain_enable() argument
993 if (!bridge) in drm_atomic_bridge_chain_enable()
996 encoder = bridge->encoder; in drm_atomic_bridge_chain_enable()
997 list_for_each_entry_from(bridge, &encoder->bridge_chain, chain_node) { in drm_atomic_bridge_chain_enable()
998 if (bridge->funcs->atomic_enable) { in drm_atomic_bridge_chain_enable()
999 bridge->funcs->atomic_enable(bridge, state); in drm_atomic_bridge_chain_enable()
1000 } else if (bridge->funcs->enable) { in drm_atomic_bridge_chain_enable()
1001 bridge->funcs->enable(bridge); in drm_atomic_bridge_chain_enable()
1007 static int drm_atomic_bridge_check(struct drm_bridge *bridge, in drm_atomic_bridge_check() argument
1011 if (bridge->funcs->atomic_check) { in drm_atomic_bridge_check()
1016 bridge); in drm_atomic_bridge_check()
1020 ret = bridge->funcs->atomic_check(bridge, bridge_state, in drm_atomic_bridge_check()
1024 } else if (bridge->funcs->mode_fixup) { in drm_atomic_bridge_check()
1025 if (!bridge->funcs->mode_fixup(bridge, &crtc_state->mode, in drm_atomic_bridge_check()
1154 drm_atomic_bridge_chain_select_bus_fmts(struct drm_bridge *bridge, in drm_atomic_bridge_chain_select_bus_fmts() argument
1159 struct drm_encoder *encoder = bridge->encoder; in drm_atomic_bridge_chain_select_bus_fmts()
1204 ret = select_bus_fmt_recursive(bridge, last_bridge, crtc_state, in drm_atomic_bridge_chain_select_bus_fmts()
1216 drm_atomic_bridge_propagate_bus_flags(struct drm_bridge *bridge, in drm_atomic_bridge_propagate_bus_flags() argument
1223 bridge_state = drm_atomic_get_new_bridge_state(state, bridge); in drm_atomic_bridge_propagate_bus_flags()
1229 struct drm_bridge *next_bridge __free(drm_bridge_put) = drm_bridge_get_next_bridge(bridge); in drm_atomic_bridge_propagate_bus_flags()
1280 int drm_atomic_bridge_chain_check(struct drm_bridge *bridge, in drm_atomic_bridge_chain_check() argument
1289 if (!bridge) in drm_atomic_bridge_chain_check()
1292 ret = drm_atomic_bridge_chain_select_bus_fmts(bridge, crtc_state, in drm_atomic_bridge_chain_check()
1297 encoder = bridge->encoder; in drm_atomic_bridge_chain_check()
1315 if (iter == bridge) in drm_atomic_bridge_chain_check()
1338 drm_bridge_detect(struct drm_bridge *bridge, struct drm_connector *connector) in drm_bridge_detect() argument
1340 if (!(bridge->ops & DRM_BRIDGE_OP_DETECT)) in drm_bridge_detect()
1343 return bridge->funcs->detect(bridge, connector); in drm_bridge_detect()
1361 int drm_bridge_get_modes(struct drm_bridge *bridge, in drm_bridge_get_modes() argument
1364 if (!(bridge->ops & DRM_BRIDGE_OP_MODES)) in drm_bridge_get_modes()
1367 return bridge->funcs->get_modes(bridge, connector); in drm_bridge_get_modes()
1383 const struct drm_edid *drm_bridge_edid_read(struct drm_bridge *bridge, in drm_bridge_edid_read() argument
1386 if (!(bridge->ops & DRM_BRIDGE_OP_EDID)) in drm_bridge_edid_read()
1389 return bridge->funcs->edid_read(bridge, connector); in drm_bridge_edid_read()
1411 void drm_bridge_hpd_enable(struct drm_bridge *bridge, in drm_bridge_hpd_enable() argument
1416 if (!(bridge->ops & DRM_BRIDGE_OP_HPD)) in drm_bridge_hpd_enable()
1419 mutex_lock(&bridge->hpd_mutex); in drm_bridge_hpd_enable()
1421 if (WARN(bridge->hpd_cb, "Hot plug detection already enabled\n")) in drm_bridge_hpd_enable()
1424 bridge->hpd_cb = cb; in drm_bridge_hpd_enable()
1425 bridge->hpd_data = data; in drm_bridge_hpd_enable()
1427 if (bridge->funcs->hpd_enable) in drm_bridge_hpd_enable()
1428 bridge->funcs->hpd_enable(bridge); in drm_bridge_hpd_enable()
1431 mutex_unlock(&bridge->hpd_mutex); in drm_bridge_hpd_enable()
1447 void drm_bridge_hpd_disable(struct drm_bridge *bridge) in drm_bridge_hpd_disable() argument
1449 if (!(bridge->ops & DRM_BRIDGE_OP_HPD)) in drm_bridge_hpd_disable()
1452 mutex_lock(&bridge->hpd_mutex); in drm_bridge_hpd_disable()
1453 if (bridge->funcs->hpd_disable) in drm_bridge_hpd_disable()
1454 bridge->funcs->hpd_disable(bridge); in drm_bridge_hpd_disable()
1456 bridge->hpd_cb = NULL; in drm_bridge_hpd_disable()
1457 bridge->hpd_data = NULL; in drm_bridge_hpd_disable()
1458 mutex_unlock(&bridge->hpd_mutex); in drm_bridge_hpd_disable()
1473 void drm_bridge_hpd_notify(struct drm_bridge *bridge, in drm_bridge_hpd_notify() argument
1476 mutex_lock(&bridge->hpd_mutex); in drm_bridge_hpd_notify()
1477 if (bridge->hpd_cb) in drm_bridge_hpd_notify()
1478 bridge->hpd_cb(bridge->hpd_data, status); in drm_bridge_hpd_notify()
1479 mutex_unlock(&bridge->hpd_mutex); in drm_bridge_hpd_notify()
1497 struct drm_bridge *bridge; in of_drm_find_and_get_bridge() local
1500 list_for_each_entry(bridge, &bridge_list, list) in of_drm_find_and_get_bridge()
1501 if (bridge->of_node == np) in of_drm_find_and_get_bridge()
1502 return drm_bridge_get(bridge); in of_drm_find_and_get_bridge()
1537 struct drm_bridge *bridge = of_drm_find_and_get_bridge(np); in of_drm_find_bridge() local
1545 drm_bridge_put(bridge); in of_drm_find_bridge()
1547 return bridge; in of_drm_find_bridge()
1563 void devm_drm_put_bridge(struct device *dev, struct drm_bridge *bridge) in devm_drm_put_bridge() argument
1565 devm_release_action(dev, drm_bridge_put_void, bridge); in devm_drm_put_bridge()
1570 struct drm_bridge *bridge, in drm_bridge_debugfs_show_bridge() argument
1574 drm_printf(p, "bridge[%u]: %ps\n", idx, bridge->funcs); in drm_bridge_debugfs_show_bridge()
1576 drm_printf(p, "\trefcount: %u%s\n", kref_read(&bridge->refcount), in drm_bridge_debugfs_show_bridge()
1580 bridge->type, in drm_bridge_debugfs_show_bridge()
1581 drm_get_connector_type_name(bridge->type)); in drm_bridge_debugfs_show_bridge()
1584 if (bridge->of_node && !lingering) in drm_bridge_debugfs_show_bridge()
1585 drm_printf(p, "\tOF: %pOFfc\n", bridge->of_node); in drm_bridge_debugfs_show_bridge()
1587 drm_printf(p, "\tops: [0x%x]", bridge->ops); in drm_bridge_debugfs_show_bridge()
1588 if (bridge->ops & DRM_BRIDGE_OP_DETECT) in drm_bridge_debugfs_show_bridge()
1590 if (bridge->ops & DRM_BRIDGE_OP_EDID) in drm_bridge_debugfs_show_bridge()
1592 if (bridge->ops & DRM_BRIDGE_OP_HPD) in drm_bridge_debugfs_show_bridge()
1594 if (bridge->ops & DRM_BRIDGE_OP_MODES) in drm_bridge_debugfs_show_bridge()
1596 if (bridge->ops & DRM_BRIDGE_OP_HDMI) in drm_bridge_debugfs_show_bridge()
1604 struct drm_bridge *bridge; in allbridges_show() local
1609 list_for_each_entry(bridge, &bridge_list, list) in allbridges_show()
1610 drm_bridge_debugfs_show_bridge(&p, bridge, idx++, false); in allbridges_show()
1612 list_for_each_entry(bridge, &bridge_lingering_list, list) in allbridges_show()
1613 drm_bridge_debugfs_show_bridge(&p, bridge, idx++, true); in allbridges_show()
1627 drm_for_each_bridge_in_chain_scoped(encoder, bridge) in encoder_bridges_show()
1628 drm_bridge_debugfs_show_bridge(&p, bridge, idx++, false); in encoder_bridges_show()