Commit 77344118 authored by Thierry Reding's avatar Thierry Reding
Browse files

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: default avatarThierry Reding <treding@nvidia.com>
parent 83c18a32
Loading
Loading
Loading
Loading
+34 −0
Original line number Diff line number Diff line
@@ -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;
+8 −0
Original line number Diff line number Diff line
@@ -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)
{
}