firmware: tegra: bpmp: Add tegra_bpmp_get_with_id() function

Some device tree bindings need to specify a parameter along with a BPMP
phandle reference to designate the ID associated with a given controller
that needs to interoperate with BPMP. Typically this is specified as an
extra cell in the nvidia,bpmp property, so add a helper to parse this ID
while resolving the phandle reference.

Signed-off-by: Thierry Reding <treding@nvidia.com>
This commit is contained in:
Thierry Reding
2026-03-26 14:58:49 +01:00
parent 83c18a3245
commit 7734411872
2 changed files with 42 additions and 0 deletions

View File

@@ -32,6 +32,40 @@ channel_to_ops(struct tegra_bpmp_channel *channel)
return bpmp->soc->ops;
}
struct tegra_bpmp *tegra_bpmp_get_with_id(struct device *dev, unsigned int *id)
{
struct platform_device *pdev;
struct of_phandle_args args;
struct tegra_bpmp *bpmp;
int err;
err = __of_parse_phandle_with_args(dev->of_node, "nvidia,bpmp", NULL,
1, 0, &args);
if (err < 0)
return ERR_PTR(err);
pdev = of_find_device_by_node(args.np);
if (!pdev) {
bpmp = ERR_PTR(-ENODEV);
goto put;
}
bpmp = platform_get_drvdata(pdev);
if (!bpmp) {
bpmp = ERR_PTR(-EPROBE_DEFER);
put_device(&pdev->dev);
goto put;
}
if (id)
*id = args.args[0];
put:
of_node_put(args.np);
return bpmp;
}
EXPORT_SYMBOL_GPL(tegra_bpmp_get_with_id);
struct tegra_bpmp *tegra_bpmp_get(struct device *dev)
{
struct platform_device *pdev;

View File

@@ -127,6 +127,7 @@ struct tegra_bpmp_message {
#if IS_ENABLED(CONFIG_TEGRA_BPMP)
struct tegra_bpmp *tegra_bpmp_get(struct device *dev);
struct tegra_bpmp *tegra_bpmp_get_with_id(struct device *dev, unsigned int *id);
void tegra_bpmp_put(struct tegra_bpmp *bpmp);
int tegra_bpmp_transfer_atomic(struct tegra_bpmp *bpmp,
struct tegra_bpmp_message *msg);
@@ -145,6 +146,13 @@ static inline struct tegra_bpmp *tegra_bpmp_get(struct device *dev)
{
return ERR_PTR(-ENOTSUPP);
}
static inline struct tegra_bpmp *tegra_bpmp_get_with_id(struct device *dev,
unsigned int *id)
{
return ERR_PTR(-ENODEV);
}
static inline void tegra_bpmp_put(struct tegra_bpmp *bpmp)
{
}