Commit 133f30d3 authored by Tero Kristo's avatar Tero Kristo Committed by Mathieu Poirier
Browse files

remoteproc: pru: Configure firmware based on client setup



Client device node property firmware-name is now used to configure
firmware for the PRU instances. The default firmware is also
restored once releasing the PRU resource.

Signed-off-by: default avatarSuman Anna <s-anna@ti.com>
Signed-off-by: default avatarTero Kristo <t-kristo@ti.com>
Signed-off-by: default avatarGrzegorz Jaszczyk <grzegorz.jaszczyk@linaro.org>
Signed-off-by: default avatarMD Danish Anwar <danishanwar@ti.com>
Reviewed-by: default avatarRoger Quadros <rogerq@kernel.org>
Link: https://lore.kernel.org/r/20230106121046.886863-7-danishanwar@ti.com


Signed-off-by: default avatarMathieu Poirier <mathieu.poirier@linaro.org>
parent 10285340
Loading
Loading
Loading
Loading
+34 −0
Original line number Diff line number Diff line
@@ -172,6 +172,23 @@ void pru_control_set_reg(struct pru_rproc *pru, unsigned int reg,
	spin_unlock_irqrestore(&pru->rmw_lock, flags);
}

/**
 * pru_rproc_set_firmware() - set firmware for a PRU core
 * @rproc: the rproc instance of the PRU
 * @fw_name: the new firmware name, or NULL if default is desired
 *
 * Return: 0 on success, or errno in error case.
 */
static int pru_rproc_set_firmware(struct rproc *rproc, const char *fw_name)
{
	struct pru_rproc *pru = rproc->priv;

	if (!fw_name)
		fw_name = pru->fw_name;

	return rproc_set_firmware(rproc, fw_name);
}

static struct rproc *__pru_rproc_get(struct device_node *np, int index)
{
	struct rproc *rproc;
@@ -224,6 +241,7 @@ struct rproc *pru_rproc_get(struct device_node *np, int index,
	struct rproc *rproc;
	struct pru_rproc *pru;
	struct device *dev;
	const char *fw_name;
	int ret;

	rproc = __pru_rproc_get(np, index);
@@ -249,11 +267,25 @@ struct rproc *pru_rproc_get(struct device_node *np, int index,
	if (pru_id)
		*pru_id = pru->id;

	ret = of_property_read_string_index(np, "firmware-name", index,
					    &fw_name);
	if (!ret) {
		ret = pru_rproc_set_firmware(rproc, fw_name);
		if (ret) {
			dev_err(dev, "failed to set firmware: %d\n", ret);
			goto err;
		}
	}

	return rproc;

err_no_rproc_handle:
	rproc_put(rproc);
	return ERR_PTR(ret);

err:
	pru_rproc_put(rproc);
	return ERR_PTR(ret);
}
EXPORT_SYMBOL_GPL(pru_rproc_get);

@@ -273,6 +305,8 @@ void pru_rproc_put(struct rproc *rproc)

	pru = rproc->priv;

	pru_rproc_set_firmware(rproc, NULL);

	mutex_lock(&pru->lock);

	if (!pru->client_np) {