remoteproc: stm32: track the coprocessor state in a backup register

Update the dedicated backup register to track the coprocessor state and
rely on that register to compute the .is_running() value (which expects
a return value of 0 -not 1- if the processor is running).

Signed-off-by: Fabien Dessenne <fabien.dessenne@st.com>
Acked-by: Patrick Delaunay <patrick.delaunay@st.com>
This commit is contained in:
Fabien Dessenne 2019-10-30 14:38:31 +01:00 committed by Tom Rini
parent 7bff971a14
commit 4a4deb870f

View File

@ -22,14 +22,12 @@
* @hold_boot_regmap: regmap for remote processor reset hold boot * @hold_boot_regmap: regmap for remote processor reset hold boot
* @hold_boot_offset: offset of the register controlling the hold boot setting * @hold_boot_offset: offset of the register controlling the hold boot setting
* @hold_boot_mask: bitmask of the register for the hold boot field * @hold_boot_mask: bitmask of the register for the hold boot field
* @is_running: is the remote processor running
*/ */
struct stm32_copro_privdata { struct stm32_copro_privdata {
struct reset_ctl reset_ctl; struct reset_ctl reset_ctl;
struct regmap *hold_boot_regmap; struct regmap *hold_boot_regmap;
uint hold_boot_offset; uint hold_boot_offset;
uint hold_boot_mask; uint hold_boot_mask;
bool is_running;
}; };
/** /**
@ -165,11 +163,8 @@ static int stm32_copro_load(struct udevice *dev, ulong addr, ulong size)
*/ */
static int stm32_copro_start(struct udevice *dev) static int stm32_copro_start(struct udevice *dev)
{ {
struct stm32_copro_privdata *priv;
int ret; int ret;
priv = dev_get_priv(dev);
/* move hold boot from true to false start the copro */ /* move hold boot from true to false start the copro */
ret = stm32_copro_set_hold_boot(dev, false); ret = stm32_copro_set_hold_boot(dev, false);
if (ret) if (ret)
@ -180,7 +175,8 @@ static int stm32_copro_start(struct udevice *dev)
* rebooting autonomously * rebooting autonomously
*/ */
ret = stm32_copro_set_hold_boot(dev, true); ret = stm32_copro_set_hold_boot(dev, true);
priv->is_running = !ret; writel(ret ? TAMP_COPRO_STATE_OFF : TAMP_COPRO_STATE_CRUN,
TAMP_COPRO_STATE);
return ret; return ret;
} }
@ -206,7 +202,7 @@ static int stm32_copro_reset(struct udevice *dev)
return ret; return ret;
} }
priv->is_running = false; writel(TAMP_COPRO_STATE_OFF, TAMP_COPRO_STATE);
return 0; return 0;
} }
@ -224,14 +220,11 @@ static int stm32_copro_stop(struct udevice *dev)
/** /**
* stm32_copro_is_running() - Is the STM32 remote processor running * stm32_copro_is_running() - Is the STM32 remote processor running
* @dev: corresponding STM32 remote processor device * @dev: corresponding STM32 remote processor device
* @return 1 if the remote processor is running, 0 otherwise * @return 0 if the remote processor is running, 1 otherwise
*/ */
static int stm32_copro_is_running(struct udevice *dev) static int stm32_copro_is_running(struct udevice *dev)
{ {
struct stm32_copro_privdata *priv; return (readl(TAMP_COPRO_STATE) == TAMP_COPRO_STATE_OFF);
priv = dev_get_priv(dev);
return priv->is_running;
} }
static const struct dm_rproc_ops stm32_copro_ops = { static const struct dm_rproc_ops stm32_copro_ops = {