Skip to content

Commit 7734411

Browse files
committed
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>
1 parent 83c18a3 commit 7734411

2 files changed

Lines changed: 42 additions & 0 deletions

File tree

drivers/firmware/tegra/bpmp.c

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,40 @@ channel_to_ops(struct tegra_bpmp_channel *channel)
3232
return bpmp->soc->ops;
3333
}
3434

35+
struct tegra_bpmp *tegra_bpmp_get_with_id(struct device *dev, unsigned int *id)
36+
{
37+
struct platform_device *pdev;
38+
struct of_phandle_args args;
39+
struct tegra_bpmp *bpmp;
40+
int err;
41+
42+
err = __of_parse_phandle_with_args(dev->of_node, "nvidia,bpmp", NULL,
43+
1, 0, &args);
44+
if (err < 0)
45+
return ERR_PTR(err);
46+
47+
pdev = of_find_device_by_node(args.np);
48+
if (!pdev) {
49+
bpmp = ERR_PTR(-ENODEV);
50+
goto put;
51+
}
52+
53+
bpmp = platform_get_drvdata(pdev);
54+
if (!bpmp) {
55+
bpmp = ERR_PTR(-EPROBE_DEFER);
56+
put_device(&pdev->dev);
57+
goto put;
58+
}
59+
60+
if (id)
61+
*id = args.args[0];
62+
63+
put:
64+
of_node_put(args.np);
65+
return bpmp;
66+
}
67+
EXPORT_SYMBOL_GPL(tegra_bpmp_get_with_id);
68+
3569
struct tegra_bpmp *tegra_bpmp_get(struct device *dev)
3670
{
3771
struct platform_device *pdev;

include/soc/tegra/bpmp.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ struct tegra_bpmp_message {
127127

128128
#if IS_ENABLED(CONFIG_TEGRA_BPMP)
129129
struct tegra_bpmp *tegra_bpmp_get(struct device *dev);
130+
struct tegra_bpmp *tegra_bpmp_get_with_id(struct device *dev, unsigned int *id);
130131
void tegra_bpmp_put(struct tegra_bpmp *bpmp);
131132
int tegra_bpmp_transfer_atomic(struct tegra_bpmp *bpmp,
132133
struct tegra_bpmp_message *msg);
@@ -145,6 +146,13 @@ static inline struct tegra_bpmp *tegra_bpmp_get(struct device *dev)
145146
{
146147
return ERR_PTR(-ENOTSUPP);
147148
}
149+
150+
static inline struct tegra_bpmp *tegra_bpmp_get_with_id(struct device *dev,
151+
unsigned int *id)
152+
{
153+
return ERR_PTR(-ENODEV);
154+
}
155+
148156
static inline void tegra_bpmp_put(struct tegra_bpmp *bpmp)
149157
{
150158
}

0 commit comments

Comments
 (0)