firmware: scmi: factorize scmi transport look up

Defines local helper function find_scmi_transport_device() with the
instructions to find the SCMI transport device from a SCMI protocol
device.

Cc: Patrick Delaunay <patrick.delaunay@foss.st.com>
Signed-off-by: Etienne Carriere <etienne.carriere@linaro.org>
This commit is contained in:
Etienne Carriere 2022-05-31 18:09:20 +02:00 committed by Tom Rini
parent 85dc582892
commit 5a11df381a

View file

@ -109,6 +109,20 @@ static int scmi_bind_protocols(struct udevice *dev)
return ret;
}
static struct udevice *find_scmi_transport_device(struct udevice *dev)
{
struct udevice *parent = dev;
do {
parent = dev_get_parent(parent);
} while (parent && device_get_uclass_id(parent) != UCLASS_SCMI_AGENT);
if (!parent)
dev_err(dev, "Invalid SCMI device, agent not found\n");
return parent;
}
static const struct scmi_agent_ops *transport_dev_ops(struct udevice *dev)
{
return (const struct scmi_agent_ops *)dev->driver->ops;
@ -118,17 +132,11 @@ int devm_scmi_process_msg(struct udevice *dev, struct scmi_channel *channel,
struct scmi_msg *msg)
{
const struct scmi_agent_ops *ops;
struct udevice *parent = dev;
struct udevice *parent;
/* Find related SCMI agent device */
do {
parent = dev_get_parent(parent);
} while (parent && device_get_uclass_id(parent) != UCLASS_SCMI_AGENT);
if (!parent) {
dev_err(dev, "Invalid SCMI device, agent not found\n");
parent = find_scmi_transport_device(dev);
if (!parent)
return -ENODEV;
}
ops = transport_dev_ops(parent);