b/arch/arm/plat-omap/include/plat/remoteproc.h
@@ -30,6 +30,7 @@ struct platform_device;
* @ops: start/stop rproc handlers
* @device_enable: omap-specific handler for enabling a device
* @device_shutdown: omap-specific handler for shutting down a device
+ * @boot_reg: physical address of the control register for storing boot address
*/
struct omap_rproc_pdata {
const char *name;
@@ -40,6 +41,7 @@ struct omap_rproc_pdata {
const struct rproc_ops *ops;
int (*device_enable) (struct platform_device *pdev);
int (*device_shutdown) (struct platform_device *pdev);
+ u32 boot_reg;
};
#if defined(CONFIG_OMAP_REMOTEPROC) || defined(CONFIG_OMAP_REMOTEPROC_MODULE)
b/drivers/remoteproc/omap_remoteproc.c
@@ -39,11 +39,13 @@
* @mbox: omap mailbox handle
* @nb: notifier block that will be invoked on inbound mailbox messages
* @rproc: rproc handle
+ * @boot_reg: virtual address of the register where the bootaddr is stored
*/
struct omap_rproc {
struct omap_mbox *mbox;
struct notifier_block nb;
struct rproc *rproc;
+ void __iomem *boot_reg;
};
/**
@@ -114,6 +116,10 @@ static int omap_rproc_start(struct rproc *rproc)
struct omap_rproc_pdata *pdata = pdev->dev.platform_data;
int ret;
+ /* load remote processor boot address if needed. */
+ if (oproc->boot_reg)
+ writel(rproc->bootaddr, oproc->boot_reg);
+
oproc->nb.notifier_call = omap_rproc_mbox_callback;
/* every omap rproc is assigned a mailbox instance for messaging */
@@ -194,6 +200,12 @@ static int __devinit omap_rproc_probe(struct
platform_device *pdev)
oproc = rproc->priv;
oproc->rproc = rproc;
+ if (pdata->boot_reg) {
+ oproc->boot_reg = ioremap(pdata->boot_reg, sizeof(u32));
+ if (!oproc->boot_reg)
+ goto err_ioremap;
+ }
+
platform_set_drvdata(pdev, rproc);