Commit 364b40c6 authored by Thierry Reding's avatar Thierry Reding
Browse files

Merge branch 'for-6.7/firmware' into for-6.7/memory

parents 0bb80ecc ea608a01
Loading
Loading
Loading
Loading
+30 −0
Original line number Diff line number Diff line
@@ -313,6 +313,8 @@ static ssize_t tegra_bpmp_channel_write(struct tegra_bpmp_channel *channel,
	return __tegra_bpmp_channel_write(channel, mrq, flags, data, size);
}

static int __maybe_unused tegra_bpmp_resume(struct device *dev);

int tegra_bpmp_transfer_atomic(struct tegra_bpmp *bpmp,
			       struct tegra_bpmp_message *msg)
{
@@ -325,6 +327,14 @@ int tegra_bpmp_transfer_atomic(struct tegra_bpmp *bpmp,
	if (!tegra_bpmp_message_valid(msg))
		return -EINVAL;

	if (bpmp->suspended) {
		/* Reset BPMP IPC channels during resume based on flags passed */
		if (msg->flags & TEGRA_BPMP_MESSAGE_RESET)
			tegra_bpmp_resume(bpmp->dev);
		else
			return -EAGAIN;
	}

	channel = bpmp->tx_channel;

	spin_lock(&bpmp->atomic_tx_lock);
@@ -364,6 +374,14 @@ int tegra_bpmp_transfer(struct tegra_bpmp *bpmp,
	if (!tegra_bpmp_message_valid(msg))
		return -EINVAL;

	if (bpmp->suspended) {
		/* Reset BPMP IPC channels during resume based on flags passed */
		if (msg->flags & TEGRA_BPMP_MESSAGE_RESET)
			tegra_bpmp_resume(bpmp->dev);
		else
			return -EAGAIN;
	}

	channel = tegra_bpmp_write_threaded(bpmp, msg->mrq, msg->tx.data,
					    msg->tx.size);
	if (IS_ERR(channel))
@@ -796,10 +814,21 @@ static int tegra_bpmp_probe(struct platform_device *pdev)
	return err;
}

static int __maybe_unused tegra_bpmp_suspend(struct device *dev)
{
	struct tegra_bpmp *bpmp = dev_get_drvdata(dev);

	bpmp->suspended = true;

	return 0;
}

static int __maybe_unused tegra_bpmp_resume(struct device *dev)
{
	struct tegra_bpmp *bpmp = dev_get_drvdata(dev);

	bpmp->suspended = false;

	if (bpmp->soc->ops->resume)
		return bpmp->soc->ops->resume(bpmp);
	else
@@ -807,6 +836,7 @@ static int __maybe_unused tegra_bpmp_resume(struct device *dev)
}

static const struct dev_pm_ops tegra_bpmp_pm_ops = {
	.suspend_noirq = tegra_bpmp_suspend,
	.resume_noirq = tegra_bpmp_resume,
};

+1 −1
Original line number Diff line number Diff line
@@ -1194,7 +1194,7 @@ struct cmd_clk_is_enabled_request {
 */
struct cmd_clk_is_enabled_response {
	/**
	 * @brief The state of the clock that has been succesfully
	 * @brief The state of the clock that has been successfully
	 * requested with CMD_CLK_ENABLE or CMD_CLK_DISABLE by the
	 * master invoking the command earlier.
	 *
+6 −0
Original line number Diff line number Diff line
@@ -102,8 +102,12 @@ struct tegra_bpmp {
#ifdef CONFIG_DEBUG_FS
	struct dentry *debugfs_mirror;
#endif

	bool suspended;
};

#define TEGRA_BPMP_MESSAGE_RESET BIT(0)

struct tegra_bpmp_message {
	unsigned int mrq;

@@ -117,6 +121,8 @@ struct tegra_bpmp_message {
		size_t size;
		int ret;
	} rx;

	unsigned long flags;
};

#if IS_ENABLED(CONFIG_TEGRA_BPMP)