mirror of
https://github.com/u-boot/u-boot.git
synced 2025-04-23 13:56:20 +00:00
dm: core: Add a helper to retrieve devices through graph endpoints
There are already several helpers to find a udevice based on its position in a device tree, like getting a child or a node pointed by a phandle, but there was no support for graph endpoints, which are very common in display pipelines. Add a new helper, named uclass_get_device_by_endpoint() which enters the child graph reprensentation, looks for a specific port, then follows the remote endpoint, and finally retrieves the first parent of the given uclass_id. This is a very handy and straightforward way to get a bridge or a panel handle. Reviewed-by: Simon Glass <sjg@chromium.org> Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
This commit is contained in:
parent
9fe367bb60
commit
04fcddac28
2 changed files with 43 additions and 0 deletions
|
@ -16,6 +16,7 @@
|
|||
#include <dm/device.h>
|
||||
#include <dm/device-internal.h>
|
||||
#include <dm/lists.h>
|
||||
#include <dm/ofnode_graph.h>
|
||||
#include <dm/uclass.h>
|
||||
#include <dm/uclass-internal.h>
|
||||
#include <dm/util.h>
|
||||
|
@ -582,6 +583,24 @@ int uclass_get_device_by_phandle(enum uclass_id id, struct udevice *parent,
|
|||
ret = uclass_find_device_by_phandle(id, parent, name, &dev);
|
||||
return uclass_get_device_tail(dev, ret, devp);
|
||||
}
|
||||
|
||||
int uclass_get_device_by_endpoint(enum uclass_id class_id, struct udevice *dev,
|
||||
int port_idx, int ep_idx, struct udevice **devp)
|
||||
{
|
||||
ofnode node_source = dev_ofnode(dev);
|
||||
ofnode node_dest = ofnode_graph_get_remote_node(node_source, port_idx, ep_idx);
|
||||
struct udevice *target = NULL;
|
||||
int ret;
|
||||
|
||||
if (!ofnode_valid(node_dest))
|
||||
return -EINVAL;
|
||||
|
||||
ret = uclass_find_device_by_ofnode(class_id, node_dest, &target);
|
||||
if (ret)
|
||||
return -ENODEV;
|
||||
|
||||
return uclass_get_device_tail(target, 0, devp);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
|
|
@ -333,6 +333,30 @@ int uclass_get_device_by_phandle(enum uclass_id id, struct udevice *parent,
|
|||
int uclass_get_device_by_driver(enum uclass_id id, const struct driver *drv,
|
||||
struct udevice **devp);
|
||||
|
||||
/**
|
||||
* uclass_get_device_by_endpoint() - Get a uclass device for a remote endpoint
|
||||
*
|
||||
* This searches through the parents of the specified remote endpoint
|
||||
* for the first device matching the uclass. Said otherwise, this helper
|
||||
* goes through the graph (endpoint) representation and searches for
|
||||
* matching devices. Endpoints can be subnodes of the "port" node or
|
||||
* subnodes of ports identified with a reg property, themselves in a
|
||||
* "ports" container.
|
||||
*
|
||||
* The device is probed to activate it ready for use.
|
||||
*
|
||||
* @class_id: uclass ID to look up
|
||||
* @dev: Device to start from
|
||||
* @port_idx: Index of the port to follow, -1 if there is a single 'port'
|
||||
* node without reg.
|
||||
* @ep_idx: Index of the endpoint to follow, -1 if there is a single 'endpoint'
|
||||
* node without reg.
|
||||
* @target: Returns pointer to the first device matching the expected uclass.
|
||||
* Return: 0 if OK, -ve on error
|
||||
*/
|
||||
int uclass_get_device_by_endpoint(enum uclass_id class_id, struct udevice *dev,
|
||||
int port_idx, int ep_idx, struct udevice **target);
|
||||
|
||||
/**
|
||||
* uclass_first_device() - Get the first device in a uclass
|
||||
*
|
||||
|
|
Loading…
Add table
Reference in a new issue