cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

omap_remoteproc.c (37359B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * OMAP Remote Processor driver
      4 *
      5 * Copyright (C) 2011-2020 Texas Instruments Incorporated - http://www.ti.com/
      6 * Copyright (C) 2011 Google, Inc.
      7 *
      8 * Ohad Ben-Cohen <ohad@wizery.com>
      9 * Brian Swetland <swetland@google.com>
     10 * Fernando Guzman Lugo <fernando.lugo@ti.com>
     11 * Mark Grosen <mgrosen@ti.com>
     12 * Suman Anna <s-anna@ti.com>
     13 * Hari Kanigeri <h-kanigeri2@ti.com>
     14 */
     15
     16#include <linux/kernel.h>
     17#include <linux/module.h>
     18#include <linux/clk.h>
     19#include <linux/clk/ti.h>
     20#include <linux/err.h>
     21#include <linux/io.h>
     22#include <linux/of_device.h>
     23#include <linux/of_reserved_mem.h>
     24#include <linux/platform_device.h>
     25#include <linux/pm_runtime.h>
     26#include <linux/dma-mapping.h>
     27#include <linux/interrupt.h>
     28#include <linux/remoteproc.h>
     29#include <linux/mailbox_client.h>
     30#include <linux/omap-iommu.h>
     31#include <linux/omap-mailbox.h>
     32#include <linux/regmap.h>
     33#include <linux/mfd/syscon.h>
     34#include <linux/reset.h>
     35#include <clocksource/timer-ti-dm.h>
     36
     37#include <linux/platform_data/dmtimer-omap.h>
     38
     39#include "omap_remoteproc.h"
     40#include "remoteproc_internal.h"
     41
     42/* default auto-suspend delay (ms) */
     43#define DEFAULT_AUTOSUSPEND_DELAY		10000
     44
     45/**
     46 * struct omap_rproc_boot_data - boot data structure for the DSP omap rprocs
     47 * @syscon: regmap handle for the system control configuration module
     48 * @boot_reg: boot register offset within the @syscon regmap
     49 * @boot_reg_shift: bit-field shift required for the boot address value in
     50 *		    @boot_reg
     51 */
     52struct omap_rproc_boot_data {
     53	struct regmap *syscon;
     54	unsigned int boot_reg;
     55	unsigned int boot_reg_shift;
     56};
     57
     58/**
     59 * struct omap_rproc_mem - internal memory structure
     60 * @cpu_addr: MPU virtual address of the memory region
     61 * @bus_addr: bus address used to access the memory region
     62 * @dev_addr: device address of the memory region from DSP view
     63 * @size: size of the memory region
     64 */
     65struct omap_rproc_mem {
     66	void __iomem *cpu_addr;
     67	phys_addr_t bus_addr;
     68	u32 dev_addr;
     69	size_t size;
     70};
     71
     72/**
     73 * struct omap_rproc_timer - data structure for a timer used by a omap rproc
     74 * @odt: timer pointer
     75 * @timer_ops: OMAP dmtimer ops for @odt timer
     76 * @irq: timer irq
     77 */
     78struct omap_rproc_timer {
     79	struct omap_dm_timer *odt;
     80	const struct omap_dm_timer_ops *timer_ops;
     81	int irq;
     82};
     83
     84/**
     85 * struct omap_rproc - omap remote processor state
     86 * @mbox: mailbox channel handle
     87 * @client: mailbox client to request the mailbox channel
     88 * @boot_data: boot data structure for setting processor boot address
     89 * @mem: internal memory regions data
     90 * @num_mems: number of internal memory regions
     91 * @num_timers: number of rproc timer(s)
     92 * @num_wd_timers: number of rproc watchdog timers
     93 * @timers: timer(s) info used by rproc
     94 * @autosuspend_delay: auto-suspend delay value to be used for runtime pm
     95 * @need_resume: if true a resume is needed in the system resume callback
     96 * @rproc: rproc handle
     97 * @reset: reset handle
     98 * @pm_comp: completion primitive to sync for suspend response
     99 * @fck: functional clock for the remoteproc
    100 * @suspend_acked: state machine flag to store the suspend request ack
    101 */
    102struct omap_rproc {
    103	struct mbox_chan *mbox;
    104	struct mbox_client client;
    105	struct omap_rproc_boot_data *boot_data;
    106	struct omap_rproc_mem *mem;
    107	int num_mems;
    108	int num_timers;
    109	int num_wd_timers;
    110	struct omap_rproc_timer *timers;
    111	int autosuspend_delay;
    112	bool need_resume;
    113	struct rproc *rproc;
    114	struct reset_control *reset;
    115	struct completion pm_comp;
    116	struct clk *fck;
    117	bool suspend_acked;
    118};
    119
    120/**
    121 * struct omap_rproc_mem_data - memory definitions for an omap remote processor
    122 * @name: name for this memory entry
    123 * @dev_addr: device address for the memory entry
    124 */
    125struct omap_rproc_mem_data {
    126	const char *name;
    127	const u32 dev_addr;
    128};
    129
    130/**
    131 * struct omap_rproc_dev_data - device data for the omap remote processor
    132 * @device_name: device name of the remote processor
    133 * @mems: memory definitions for this remote processor
    134 */
    135struct omap_rproc_dev_data {
    136	const char *device_name;
    137	const struct omap_rproc_mem_data *mems;
    138};
    139
    140/**
    141 * omap_rproc_request_timer() - request a timer for a remoteproc
    142 * @dev: device requesting the timer
    143 * @np: device node pointer to the desired timer
    144 * @timer: handle to a struct omap_rproc_timer to return the timer handle
    145 *
    146 * This helper function is used primarily to request a timer associated with
    147 * a remoteproc. The returned handle is stored in the .odt field of the
    148 * @timer structure passed in, and is used to invoke other timer specific
    149 * ops (like starting a timer either during device initialization or during
    150 * a resume operation, or for stopping/freeing a timer).
    151 *
    152 * Return: 0 on success, otherwise an appropriate failure
    153 */
    154static int omap_rproc_request_timer(struct device *dev, struct device_node *np,
    155				    struct omap_rproc_timer *timer)
    156{
    157	int ret;
    158
    159	timer->odt = timer->timer_ops->request_by_node(np);
    160	if (!timer->odt) {
    161		dev_err(dev, "request for timer node %p failed\n", np);
    162		return -EBUSY;
    163	}
    164
    165	ret = timer->timer_ops->set_source(timer->odt, OMAP_TIMER_SRC_SYS_CLK);
    166	if (ret) {
    167		dev_err(dev, "error setting OMAP_TIMER_SRC_SYS_CLK as source for timer node %p\n",
    168			np);
    169		timer->timer_ops->free(timer->odt);
    170		return ret;
    171	}
    172
    173	/* clean counter, remoteproc code will set the value */
    174	timer->timer_ops->set_load(timer->odt, 0);
    175
    176	return 0;
    177}
    178
    179/**
    180 * omap_rproc_start_timer() - start a timer for a remoteproc
    181 * @timer: handle to a OMAP rproc timer
    182 *
    183 * This helper function is used to start a timer associated with a remoteproc,
    184 * obtained using the request_timer ops. The helper function needs to be
    185 * invoked by the driver to start the timer (during device initialization)
    186 * or to just resume the timer.
    187 *
    188 * Return: 0 on success, otherwise a failure as returned by DMTimer ops
    189 */
    190static inline int omap_rproc_start_timer(struct omap_rproc_timer *timer)
    191{
    192	return timer->timer_ops->start(timer->odt);
    193}
    194
    195/**
    196 * omap_rproc_stop_timer() - stop a timer for a remoteproc
    197 * @timer: handle to a OMAP rproc timer
    198 *
    199 * This helper function is used to disable a timer associated with a
    200 * remoteproc, and needs to be called either during a device shutdown
    201 * or suspend operation. The separate helper function allows the driver
    202 * to just stop a timer without having to release the timer during a
    203 * suspend operation.
    204 *
    205 * Return: 0 on success, otherwise a failure as returned by DMTimer ops
    206 */
    207static inline int omap_rproc_stop_timer(struct omap_rproc_timer *timer)
    208{
    209	return timer->timer_ops->stop(timer->odt);
    210}
    211
    212/**
    213 * omap_rproc_release_timer() - release a timer for a remoteproc
    214 * @timer: handle to a OMAP rproc timer
    215 *
    216 * This helper function is used primarily to release a timer associated
    217 * with a remoteproc. The dmtimer will be available for other clients to
    218 * use once released.
    219 *
    220 * Return: 0 on success, otherwise a failure as returned by DMTimer ops
    221 */
    222static inline int omap_rproc_release_timer(struct omap_rproc_timer *timer)
    223{
    224	return timer->timer_ops->free(timer->odt);
    225}
    226
    227/**
    228 * omap_rproc_get_timer_irq() - get the irq for a timer
    229 * @timer: handle to a OMAP rproc timer
    230 *
    231 * This function is used to get the irq associated with a watchdog timer. The
    232 * function is called by the OMAP remoteproc driver to register a interrupt
    233 * handler to handle watchdog events on the remote processor.
    234 *
    235 * Return: irq id on success, otherwise a failure as returned by DMTimer ops
    236 */
    237static inline int omap_rproc_get_timer_irq(struct omap_rproc_timer *timer)
    238{
    239	return timer->timer_ops->get_irq(timer->odt);
    240}
    241
    242/**
    243 * omap_rproc_ack_timer_irq() - acknowledge a timer irq
    244 * @timer: handle to a OMAP rproc timer
    245 *
    246 * This function is used to clear the irq associated with a watchdog timer. The
    247 * The function is called by the OMAP remoteproc upon a watchdog event on the
    248 * remote processor to clear the interrupt status of the watchdog timer.
    249 */
    250static inline void omap_rproc_ack_timer_irq(struct omap_rproc_timer *timer)
    251{
    252	timer->timer_ops->write_status(timer->odt, OMAP_TIMER_INT_OVERFLOW);
    253}
    254
    255/**
    256 * omap_rproc_watchdog_isr() - Watchdog ISR handler for remoteproc device
    257 * @irq: IRQ number associated with a watchdog timer
    258 * @data: IRQ handler data
    259 *
    260 * This ISR routine executes the required necessary low-level code to
    261 * acknowledge a watchdog timer interrupt. There can be multiple watchdog
    262 * timers associated with a rproc (like IPUs which have 2 watchdog timers,
    263 * one per Cortex M3/M4 core), so a lookup has to be performed to identify
    264 * the timer to acknowledge its interrupt.
    265 *
    266 * The function also invokes rproc_report_crash to report the watchdog event
    267 * to the remoteproc driver core, to trigger a recovery.
    268 *
    269 * Return: IRQ_HANDLED on success, otherwise IRQ_NONE
    270 */
    271static irqreturn_t omap_rproc_watchdog_isr(int irq, void *data)
    272{
    273	struct rproc *rproc = data;
    274	struct omap_rproc *oproc = rproc->priv;
    275	struct device *dev = rproc->dev.parent;
    276	struct omap_rproc_timer *timers = oproc->timers;
    277	struct omap_rproc_timer *wd_timer = NULL;
    278	int num_timers = oproc->num_timers + oproc->num_wd_timers;
    279	int i;
    280
    281	for (i = oproc->num_timers; i < num_timers; i++) {
    282		if (timers[i].irq > 0 && irq == timers[i].irq) {
    283			wd_timer = &timers[i];
    284			break;
    285		}
    286	}
    287
    288	if (!wd_timer) {
    289		dev_err(dev, "invalid timer\n");
    290		return IRQ_NONE;
    291	}
    292
    293	omap_rproc_ack_timer_irq(wd_timer);
    294
    295	rproc_report_crash(rproc, RPROC_WATCHDOG);
    296
    297	return IRQ_HANDLED;
    298}
    299
    300/**
    301 * omap_rproc_enable_timers() - enable the timers for a remoteproc
    302 * @rproc: handle of a remote processor
    303 * @configure: boolean flag used to acquire and configure the timer handle
    304 *
    305 * This function is used primarily to enable the timers associated with
    306 * a remoteproc. The configure flag is provided to allow the driver to
    307 * to either acquire and start a timer (during device initialization) or
    308 * to just start a timer (during a resume operation).
    309 *
    310 * Return: 0 on success, otherwise an appropriate failure
    311 */
    312static int omap_rproc_enable_timers(struct rproc *rproc, bool configure)
    313{
    314	int i;
    315	int ret = 0;
    316	struct platform_device *tpdev;
    317	struct dmtimer_platform_data *tpdata;
    318	const struct omap_dm_timer_ops *timer_ops;
    319	struct omap_rproc *oproc = rproc->priv;
    320	struct omap_rproc_timer *timers = oproc->timers;
    321	struct device *dev = rproc->dev.parent;
    322	struct device_node *np = NULL;
    323	int num_timers = oproc->num_timers + oproc->num_wd_timers;
    324
    325	if (!num_timers)
    326		return 0;
    327
    328	if (!configure)
    329		goto start_timers;
    330
    331	for (i = 0; i < num_timers; i++) {
    332		if (i < oproc->num_timers)
    333			np = of_parse_phandle(dev->of_node, "ti,timers", i);
    334		else
    335			np = of_parse_phandle(dev->of_node,
    336					      "ti,watchdog-timers",
    337					      (i - oproc->num_timers));
    338		if (!np) {
    339			ret = -ENXIO;
    340			dev_err(dev, "device node lookup for timer at index %d failed: %d\n",
    341				i < oproc->num_timers ? i :
    342				i - oproc->num_timers, ret);
    343			goto free_timers;
    344		}
    345
    346		tpdev = of_find_device_by_node(np);
    347		if (!tpdev) {
    348			ret = -ENODEV;
    349			dev_err(dev, "could not get timer platform device\n");
    350			goto put_node;
    351		}
    352
    353		tpdata = dev_get_platdata(&tpdev->dev);
    354		put_device(&tpdev->dev);
    355		if (!tpdata) {
    356			ret = -EINVAL;
    357			dev_err(dev, "dmtimer pdata structure NULL\n");
    358			goto put_node;
    359		}
    360
    361		timer_ops = tpdata->timer_ops;
    362		if (!timer_ops || !timer_ops->request_by_node ||
    363		    !timer_ops->set_source || !timer_ops->set_load ||
    364		    !timer_ops->free || !timer_ops->start ||
    365		    !timer_ops->stop || !timer_ops->get_irq ||
    366		    !timer_ops->write_status) {
    367			ret = -EINVAL;
    368			dev_err(dev, "device does not have required timer ops\n");
    369			goto put_node;
    370		}
    371
    372		timers[i].irq = -1;
    373		timers[i].timer_ops = timer_ops;
    374		ret = omap_rproc_request_timer(dev, np, &timers[i]);
    375		if (ret) {
    376			dev_err(dev, "request for timer %p failed: %d\n", np,
    377				ret);
    378			goto put_node;
    379		}
    380		of_node_put(np);
    381
    382		if (i >= oproc->num_timers) {
    383			timers[i].irq = omap_rproc_get_timer_irq(&timers[i]);
    384			if (timers[i].irq < 0) {
    385				dev_err(dev, "get_irq for timer %p failed: %d\n",
    386					np, timers[i].irq);
    387				ret = -EBUSY;
    388				goto free_timers;
    389			}
    390
    391			ret = request_irq(timers[i].irq,
    392					  omap_rproc_watchdog_isr, IRQF_SHARED,
    393					  "rproc-wdt", rproc);
    394			if (ret) {
    395				dev_err(dev, "error requesting irq for timer %p\n",
    396					np);
    397				omap_rproc_release_timer(&timers[i]);
    398				timers[i].odt = NULL;
    399				timers[i].timer_ops = NULL;
    400				timers[i].irq = -1;
    401				goto free_timers;
    402			}
    403		}
    404	}
    405
    406start_timers:
    407	for (i = 0; i < num_timers; i++) {
    408		ret = omap_rproc_start_timer(&timers[i]);
    409		if (ret) {
    410			dev_err(dev, "start timer %p failed failed: %d\n", np,
    411				ret);
    412			break;
    413		}
    414	}
    415	if (ret) {
    416		while (i >= 0) {
    417			omap_rproc_stop_timer(&timers[i]);
    418			i--;
    419		}
    420		goto put_node;
    421	}
    422	return 0;
    423
    424put_node:
    425	if (configure)
    426		of_node_put(np);
    427free_timers:
    428	while (i--) {
    429		if (i >= oproc->num_timers)
    430			free_irq(timers[i].irq, rproc);
    431		omap_rproc_release_timer(&timers[i]);
    432		timers[i].odt = NULL;
    433		timers[i].timer_ops = NULL;
    434		timers[i].irq = -1;
    435	}
    436
    437	return ret;
    438}
    439
    440/**
    441 * omap_rproc_disable_timers() - disable the timers for a remoteproc
    442 * @rproc: handle of a remote processor
    443 * @configure: boolean flag used to release the timer handle
    444 *
    445 * This function is used primarily to disable the timers associated with
    446 * a remoteproc. The configure flag is provided to allow the driver to
    447 * to either stop and release a timer (during device shutdown) or to just
    448 * stop a timer (during a suspend operation).
    449 *
    450 * Return: 0 on success or no timers
    451 */
    452static int omap_rproc_disable_timers(struct rproc *rproc, bool configure)
    453{
    454	int i;
    455	struct omap_rproc *oproc = rproc->priv;
    456	struct omap_rproc_timer *timers = oproc->timers;
    457	int num_timers = oproc->num_timers + oproc->num_wd_timers;
    458
    459	if (!num_timers)
    460		return 0;
    461
    462	for (i = 0; i < num_timers; i++) {
    463		omap_rproc_stop_timer(&timers[i]);
    464		if (configure) {
    465			if (i >= oproc->num_timers)
    466				free_irq(timers[i].irq, rproc);
    467			omap_rproc_release_timer(&timers[i]);
    468			timers[i].odt = NULL;
    469			timers[i].timer_ops = NULL;
    470			timers[i].irq = -1;
    471		}
    472	}
    473
    474	return 0;
    475}
    476
    477/**
    478 * omap_rproc_mbox_callback() - inbound mailbox message handler
    479 * @client: mailbox client pointer used for requesting the mailbox channel
    480 * @data: mailbox payload
    481 *
    482 * This handler is invoked by omap's mailbox driver whenever a mailbox
    483 * message is received. Usually, the mailbox payload simply contains
    484 * the index of the virtqueue that is kicked by the remote processor,
    485 * and we let remoteproc core handle it.
    486 *
    487 * In addition to virtqueue indices, we also have some out-of-band values
    488 * that indicates different events. Those values are deliberately very
    489 * big so they don't coincide with virtqueue indices.
    490 */
    491static void omap_rproc_mbox_callback(struct mbox_client *client, void *data)
    492{
    493	struct omap_rproc *oproc = container_of(client, struct omap_rproc,
    494						client);
    495	struct device *dev = oproc->rproc->dev.parent;
    496	const char *name = oproc->rproc->name;
    497	u32 msg = (u32)data;
    498
    499	dev_dbg(dev, "mbox msg: 0x%x\n", msg);
    500
    501	switch (msg) {
    502	case RP_MBOX_CRASH:
    503		/*
    504		 * remoteproc detected an exception, notify the rproc core.
    505		 * The remoteproc core will handle the recovery.
    506		 */
    507		dev_err(dev, "omap rproc %s crashed\n", name);
    508		rproc_report_crash(oproc->rproc, RPROC_FATAL_ERROR);
    509		break;
    510	case RP_MBOX_ECHO_REPLY:
    511		dev_info(dev, "received echo reply from %s\n", name);
    512		break;
    513	case RP_MBOX_SUSPEND_ACK:
    514	case RP_MBOX_SUSPEND_CANCEL:
    515		oproc->suspend_acked = msg == RP_MBOX_SUSPEND_ACK;
    516		complete(&oproc->pm_comp);
    517		break;
    518	default:
    519		if (msg >= RP_MBOX_READY && msg < RP_MBOX_END_MSG)
    520			return;
    521		if (msg > oproc->rproc->max_notifyid) {
    522			dev_dbg(dev, "dropping unknown message 0x%x", msg);
    523			return;
    524		}
    525		/* msg contains the index of the triggered vring */
    526		if (rproc_vq_interrupt(oproc->rproc, msg) == IRQ_NONE)
    527			dev_dbg(dev, "no message was found in vqid %d\n", msg);
    528	}
    529}
    530
    531/* kick a virtqueue */
    532static void omap_rproc_kick(struct rproc *rproc, int vqid)
    533{
    534	struct omap_rproc *oproc = rproc->priv;
    535	struct device *dev = rproc->dev.parent;
    536	int ret;
    537
    538	/* wake up the rproc before kicking it */
    539	ret = pm_runtime_get_sync(dev);
    540	if (WARN_ON(ret < 0)) {
    541		dev_err(dev, "pm_runtime_get_sync() failed during kick, ret = %d\n",
    542			ret);
    543		pm_runtime_put_noidle(dev);
    544		return;
    545	}
    546
    547	/* send the index of the triggered virtqueue in the mailbox payload */
    548	ret = mbox_send_message(oproc->mbox, (void *)vqid);
    549	if (ret < 0)
    550		dev_err(dev, "failed to send mailbox message, status = %d\n",
    551			ret);
    552
    553	pm_runtime_mark_last_busy(dev);
    554	pm_runtime_put_autosuspend(dev);
    555}
    556
    557/**
    558 * omap_rproc_write_dsp_boot_addr() - set boot address for DSP remote processor
    559 * @rproc: handle of a remote processor
    560 *
    561 * Set boot address for a supported DSP remote processor.
    562 *
    563 * Return: 0 on success, or -EINVAL if boot address is not aligned properly
    564 */
    565static int omap_rproc_write_dsp_boot_addr(struct rproc *rproc)
    566{
    567	struct device *dev = rproc->dev.parent;
    568	struct omap_rproc *oproc = rproc->priv;
    569	struct omap_rproc_boot_data *bdata = oproc->boot_data;
    570	u32 offset = bdata->boot_reg;
    571	u32 value;
    572	u32 mask;
    573
    574	if (rproc->bootaddr & (SZ_1K - 1)) {
    575		dev_err(dev, "invalid boot address 0x%llx, must be aligned on a 1KB boundary\n",
    576			rproc->bootaddr);
    577		return -EINVAL;
    578	}
    579
    580	value = rproc->bootaddr >> bdata->boot_reg_shift;
    581	mask = ~(SZ_1K - 1) >> bdata->boot_reg_shift;
    582
    583	return regmap_update_bits(bdata->syscon, offset, mask, value);
    584}
    585
    586/*
    587 * Power up the remote processor.
    588 *
    589 * This function will be invoked only after the firmware for this rproc
    590 * was loaded, parsed successfully, and all of its resource requirements
    591 * were met.
    592 */
    593static int omap_rproc_start(struct rproc *rproc)
    594{
    595	struct omap_rproc *oproc = rproc->priv;
    596	struct device *dev = rproc->dev.parent;
    597	int ret;
    598	struct mbox_client *client = &oproc->client;
    599
    600	if (oproc->boot_data) {
    601		ret = omap_rproc_write_dsp_boot_addr(rproc);
    602		if (ret)
    603			return ret;
    604	}
    605
    606	client->dev = dev;
    607	client->tx_done = NULL;
    608	client->rx_callback = omap_rproc_mbox_callback;
    609	client->tx_block = false;
    610	client->knows_txdone = false;
    611
    612	oproc->mbox = mbox_request_channel(client, 0);
    613	if (IS_ERR(oproc->mbox)) {
    614		ret = -EBUSY;
    615		dev_err(dev, "mbox_request_channel failed: %ld\n",
    616			PTR_ERR(oproc->mbox));
    617		return ret;
    618	}
    619
    620	/*
    621	 * Ping the remote processor. this is only for sanity-sake;
    622	 * there is no functional effect whatsoever.
    623	 *
    624	 * Note that the reply will _not_ arrive immediately: this message
    625	 * will wait in the mailbox fifo until the remote processor is booted.
    626	 */
    627	ret = mbox_send_message(oproc->mbox, (void *)RP_MBOX_ECHO_REQUEST);
    628	if (ret < 0) {
    629		dev_err(dev, "mbox_send_message failed: %d\n", ret);
    630		goto put_mbox;
    631	}
    632
    633	ret = omap_rproc_enable_timers(rproc, true);
    634	if (ret) {
    635		dev_err(dev, "omap_rproc_enable_timers failed: %d\n", ret);
    636		goto put_mbox;
    637	}
    638
    639	ret = reset_control_deassert(oproc->reset);
    640	if (ret) {
    641		dev_err(dev, "reset control deassert failed: %d\n", ret);
    642		goto disable_timers;
    643	}
    644
    645	/*
    646	 * remote processor is up, so update the runtime pm status and
    647	 * enable the auto-suspend. The device usage count is incremented
    648	 * manually for balancing it for auto-suspend
    649	 */
    650	pm_runtime_set_active(dev);
    651	pm_runtime_use_autosuspend(dev);
    652	pm_runtime_get_noresume(dev);
    653	pm_runtime_enable(dev);
    654	pm_runtime_mark_last_busy(dev);
    655	pm_runtime_put_autosuspend(dev);
    656
    657	return 0;
    658
    659disable_timers:
    660	omap_rproc_disable_timers(rproc, true);
    661put_mbox:
    662	mbox_free_channel(oproc->mbox);
    663	return ret;
    664}
    665
    666/* power off the remote processor */
    667static int omap_rproc_stop(struct rproc *rproc)
    668{
    669	struct device *dev = rproc->dev.parent;
    670	struct omap_rproc *oproc = rproc->priv;
    671	int ret;
    672
    673	/*
    674	 * cancel any possible scheduled runtime suspend by incrementing
    675	 * the device usage count, and resuming the device. The remoteproc
    676	 * also needs to be woken up if suspended, to avoid the remoteproc
    677	 * OS to continue to remember any context that it has saved, and
    678	 * avoid potential issues in misindentifying a subsequent device
    679	 * reboot as a power restore boot
    680	 */
    681	ret = pm_runtime_get_sync(dev);
    682	if (ret < 0) {
    683		pm_runtime_put_noidle(dev);
    684		return ret;
    685	}
    686
    687	ret = reset_control_assert(oproc->reset);
    688	if (ret)
    689		goto out;
    690
    691	ret = omap_rproc_disable_timers(rproc, true);
    692	if (ret)
    693		goto enable_device;
    694
    695	mbox_free_channel(oproc->mbox);
    696
    697	/*
    698	 * update the runtime pm states and status now that the remoteproc
    699	 * has stopped
    700	 */
    701	pm_runtime_disable(dev);
    702	pm_runtime_dont_use_autosuspend(dev);
    703	pm_runtime_put_noidle(dev);
    704	pm_runtime_set_suspended(dev);
    705
    706	return 0;
    707
    708enable_device:
    709	reset_control_deassert(oproc->reset);
    710out:
    711	/* schedule the next auto-suspend */
    712	pm_runtime_mark_last_busy(dev);
    713	pm_runtime_put_autosuspend(dev);
    714	return ret;
    715}
    716
    717/**
    718 * omap_rproc_da_to_va() - internal memory translation helper
    719 * @rproc: remote processor to apply the address translation for
    720 * @da: device address to translate
    721 * @len: length of the memory buffer
    722 *
    723 * Custom function implementing the rproc .da_to_va ops to provide address
    724 * translation (device address to kernel virtual address) for internal RAMs
    725 * present in a DSP or IPU device). The translated addresses can be used
    726 * either by the remoteproc core for loading, or by any rpmsg bus drivers.
    727 *
    728 * Return: translated virtual address in kernel memory space on success,
    729 *         or NULL on failure.
    730 */
    731static void *omap_rproc_da_to_va(struct rproc *rproc, u64 da, size_t len, bool *is_iomem)
    732{
    733	struct omap_rproc *oproc = rproc->priv;
    734	int i;
    735	u32 offset;
    736
    737	if (len <= 0)
    738		return NULL;
    739
    740	if (!oproc->num_mems)
    741		return NULL;
    742
    743	for (i = 0; i < oproc->num_mems; i++) {
    744		if (da >= oproc->mem[i].dev_addr && da + len <=
    745		    oproc->mem[i].dev_addr + oproc->mem[i].size) {
    746			offset = da - oproc->mem[i].dev_addr;
    747			/* __force to make sparse happy with type conversion */
    748			return (__force void *)(oproc->mem[i].cpu_addr +
    749						offset);
    750		}
    751	}
    752
    753	return NULL;
    754}
    755
    756static const struct rproc_ops omap_rproc_ops = {
    757	.start		= omap_rproc_start,
    758	.stop		= omap_rproc_stop,
    759	.kick		= omap_rproc_kick,
    760	.da_to_va	= omap_rproc_da_to_va,
    761};
    762
    763#ifdef CONFIG_PM
    764static bool _is_rproc_in_standby(struct omap_rproc *oproc)
    765{
    766	return ti_clk_is_in_standby(oproc->fck);
    767}
    768
    769/* 1 sec is long enough time to let the remoteproc side suspend the device */
    770#define DEF_SUSPEND_TIMEOUT 1000
    771static int _omap_rproc_suspend(struct rproc *rproc, bool auto_suspend)
    772{
    773	struct device *dev = rproc->dev.parent;
    774	struct omap_rproc *oproc = rproc->priv;
    775	unsigned long to = msecs_to_jiffies(DEF_SUSPEND_TIMEOUT);
    776	unsigned long ta = jiffies + to;
    777	u32 suspend_msg = auto_suspend ?
    778				RP_MBOX_SUSPEND_AUTO : RP_MBOX_SUSPEND_SYSTEM;
    779	int ret;
    780
    781	reinit_completion(&oproc->pm_comp);
    782	oproc->suspend_acked = false;
    783	ret = mbox_send_message(oproc->mbox, (void *)suspend_msg);
    784	if (ret < 0) {
    785		dev_err(dev, "PM mbox_send_message failed: %d\n", ret);
    786		return ret;
    787	}
    788
    789	ret = wait_for_completion_timeout(&oproc->pm_comp, to);
    790	if (!oproc->suspend_acked)
    791		return -EBUSY;
    792
    793	/*
    794	 * The remoteproc side is returning the ACK message before saving the
    795	 * context, because the context saving is performed within a SYS/BIOS
    796	 * function, and it cannot have any inter-dependencies against the IPC
    797	 * layer. Also, as the SYS/BIOS needs to preserve properly the processor
    798	 * register set, sending this ACK or signalling the completion of the
    799	 * context save through a shared memory variable can never be the
    800	 * absolute last thing to be executed on the remoteproc side, and the
    801	 * MPU cannot use the ACK message as a sync point to put the remoteproc
    802	 * into reset. The only way to ensure that the remote processor has
    803	 * completed saving the context is to check that the module has reached
    804	 * STANDBY state (after saving the context, the SYS/BIOS executes the
    805	 * appropriate target-specific WFI instruction causing the module to
    806	 * enter STANDBY).
    807	 */
    808	while (!_is_rproc_in_standby(oproc)) {
    809		if (time_after(jiffies, ta))
    810			return -ETIME;
    811		schedule();
    812	}
    813
    814	ret = reset_control_assert(oproc->reset);
    815	if (ret) {
    816		dev_err(dev, "reset assert during suspend failed %d\n", ret);
    817		return ret;
    818	}
    819
    820	ret = omap_rproc_disable_timers(rproc, false);
    821	if (ret) {
    822		dev_err(dev, "disabling timers during suspend failed %d\n",
    823			ret);
    824		goto enable_device;
    825	}
    826
    827	/*
    828	 * IOMMUs would have to be disabled specifically for runtime suspend.
    829	 * They are handled automatically through System PM callbacks for
    830	 * regular system suspend
    831	 */
    832	if (auto_suspend) {
    833		ret = omap_iommu_domain_deactivate(rproc->domain);
    834		if (ret) {
    835			dev_err(dev, "iommu domain deactivate failed %d\n",
    836				ret);
    837			goto enable_timers;
    838		}
    839	}
    840
    841	return 0;
    842
    843enable_timers:
    844	/* ignore errors on re-enabling code */
    845	omap_rproc_enable_timers(rproc, false);
    846enable_device:
    847	reset_control_deassert(oproc->reset);
    848	return ret;
    849}
    850
    851static int _omap_rproc_resume(struct rproc *rproc, bool auto_suspend)
    852{
    853	struct device *dev = rproc->dev.parent;
    854	struct omap_rproc *oproc = rproc->priv;
    855	int ret;
    856
    857	/*
    858	 * IOMMUs would have to be enabled specifically for runtime resume.
    859	 * They would have been already enabled automatically through System
    860	 * PM callbacks for regular system resume
    861	 */
    862	if (auto_suspend) {
    863		ret = omap_iommu_domain_activate(rproc->domain);
    864		if (ret) {
    865			dev_err(dev, "omap_iommu activate failed %d\n", ret);
    866			goto out;
    867		}
    868	}
    869
    870	/* boot address could be lost after suspend, so restore it */
    871	if (oproc->boot_data) {
    872		ret = omap_rproc_write_dsp_boot_addr(rproc);
    873		if (ret) {
    874			dev_err(dev, "boot address restore failed %d\n", ret);
    875			goto suspend_iommu;
    876		}
    877	}
    878
    879	ret = omap_rproc_enable_timers(rproc, false);
    880	if (ret) {
    881		dev_err(dev, "enabling timers during resume failed %d\n", ret);
    882		goto suspend_iommu;
    883	}
    884
    885	ret = reset_control_deassert(oproc->reset);
    886	if (ret) {
    887		dev_err(dev, "reset deassert during resume failed %d\n", ret);
    888		goto disable_timers;
    889	}
    890
    891	return 0;
    892
    893disable_timers:
    894	omap_rproc_disable_timers(rproc, false);
    895suspend_iommu:
    896	if (auto_suspend)
    897		omap_iommu_domain_deactivate(rproc->domain);
    898out:
    899	return ret;
    900}
    901
    902static int __maybe_unused omap_rproc_suspend(struct device *dev)
    903{
    904	struct rproc *rproc = dev_get_drvdata(dev);
    905	struct omap_rproc *oproc = rproc->priv;
    906	int ret = 0;
    907
    908	mutex_lock(&rproc->lock);
    909	if (rproc->state == RPROC_OFFLINE)
    910		goto out;
    911
    912	if (rproc->state == RPROC_SUSPENDED)
    913		goto out;
    914
    915	if (rproc->state != RPROC_RUNNING) {
    916		ret = -EBUSY;
    917		goto out;
    918	}
    919
    920	ret = _omap_rproc_suspend(rproc, false);
    921	if (ret) {
    922		dev_err(dev, "suspend failed %d\n", ret);
    923		goto out;
    924	}
    925
    926	/*
    927	 * remoteproc is running at the time of system suspend, so remember
    928	 * it so as to wake it up during system resume
    929	 */
    930	oproc->need_resume = true;
    931	rproc->state = RPROC_SUSPENDED;
    932
    933out:
    934	mutex_unlock(&rproc->lock);
    935	return ret;
    936}
    937
    938static int __maybe_unused omap_rproc_resume(struct device *dev)
    939{
    940	struct rproc *rproc = dev_get_drvdata(dev);
    941	struct omap_rproc *oproc = rproc->priv;
    942	int ret = 0;
    943
    944	mutex_lock(&rproc->lock);
    945	if (rproc->state == RPROC_OFFLINE)
    946		goto out;
    947
    948	if (rproc->state != RPROC_SUSPENDED) {
    949		ret = -EBUSY;
    950		goto out;
    951	}
    952
    953	/*
    954	 * remoteproc was auto-suspended at the time of system suspend,
    955	 * so no need to wake-up the processor (leave it in suspended
    956	 * state, will be woken up during a subsequent runtime_resume)
    957	 */
    958	if (!oproc->need_resume)
    959		goto out;
    960
    961	ret = _omap_rproc_resume(rproc, false);
    962	if (ret) {
    963		dev_err(dev, "resume failed %d\n", ret);
    964		goto out;
    965	}
    966
    967	oproc->need_resume = false;
    968	rproc->state = RPROC_RUNNING;
    969
    970	pm_runtime_mark_last_busy(dev);
    971out:
    972	mutex_unlock(&rproc->lock);
    973	return ret;
    974}
    975
    976static int omap_rproc_runtime_suspend(struct device *dev)
    977{
    978	struct rproc *rproc = dev_get_drvdata(dev);
    979	struct omap_rproc *oproc = rproc->priv;
    980	int ret;
    981
    982	mutex_lock(&rproc->lock);
    983	if (rproc->state == RPROC_CRASHED) {
    984		dev_dbg(dev, "rproc cannot be runtime suspended when crashed!\n");
    985		ret = -EBUSY;
    986		goto out;
    987	}
    988
    989	if (WARN_ON(rproc->state != RPROC_RUNNING)) {
    990		dev_err(dev, "rproc cannot be runtime suspended when not running!\n");
    991		ret = -EBUSY;
    992		goto out;
    993	}
    994
    995	/*
    996	 * do not even attempt suspend if the remote processor is not
    997	 * idled for runtime auto-suspend
    998	 */
    999	if (!_is_rproc_in_standby(oproc)) {
   1000		ret = -EBUSY;
   1001		goto abort;
   1002	}
   1003
   1004	ret = _omap_rproc_suspend(rproc, true);
   1005	if (ret)
   1006		goto abort;
   1007
   1008	rproc->state = RPROC_SUSPENDED;
   1009	mutex_unlock(&rproc->lock);
   1010	return 0;
   1011
   1012abort:
   1013	pm_runtime_mark_last_busy(dev);
   1014out:
   1015	mutex_unlock(&rproc->lock);
   1016	return ret;
   1017}
   1018
   1019static int omap_rproc_runtime_resume(struct device *dev)
   1020{
   1021	struct rproc *rproc = dev_get_drvdata(dev);
   1022	int ret;
   1023
   1024	mutex_lock(&rproc->lock);
   1025	if (WARN_ON(rproc->state != RPROC_SUSPENDED)) {
   1026		dev_err(dev, "rproc cannot be runtime resumed if not suspended! state=%d\n",
   1027			rproc->state);
   1028		ret = -EBUSY;
   1029		goto out;
   1030	}
   1031
   1032	ret = _omap_rproc_resume(rproc, true);
   1033	if (ret) {
   1034		dev_err(dev, "runtime resume failed %d\n", ret);
   1035		goto out;
   1036	}
   1037
   1038	rproc->state = RPROC_RUNNING;
   1039out:
   1040	mutex_unlock(&rproc->lock);
   1041	return ret;
   1042}
   1043#endif /* CONFIG_PM */
   1044
   1045static const struct omap_rproc_mem_data ipu_mems[] = {
   1046	{ .name = "l2ram", .dev_addr = 0x20000000 },
   1047	{ },
   1048};
   1049
   1050static const struct omap_rproc_mem_data dra7_dsp_mems[] = {
   1051	{ .name = "l2ram", .dev_addr = 0x800000 },
   1052	{ .name = "l1pram", .dev_addr = 0xe00000 },
   1053	{ .name = "l1dram", .dev_addr = 0xf00000 },
   1054	{ },
   1055};
   1056
   1057static const struct omap_rproc_dev_data omap4_dsp_dev_data = {
   1058	.device_name	= "dsp",
   1059};
   1060
   1061static const struct omap_rproc_dev_data omap4_ipu_dev_data = {
   1062	.device_name	= "ipu",
   1063	.mems		= ipu_mems,
   1064};
   1065
   1066static const struct omap_rproc_dev_data omap5_dsp_dev_data = {
   1067	.device_name	= "dsp",
   1068};
   1069
   1070static const struct omap_rproc_dev_data omap5_ipu_dev_data = {
   1071	.device_name	= "ipu",
   1072	.mems		= ipu_mems,
   1073};
   1074
   1075static const struct omap_rproc_dev_data dra7_dsp_dev_data = {
   1076	.device_name	= "dsp",
   1077	.mems		= dra7_dsp_mems,
   1078};
   1079
   1080static const struct omap_rproc_dev_data dra7_ipu_dev_data = {
   1081	.device_name	= "ipu",
   1082	.mems		= ipu_mems,
   1083};
   1084
   1085static const struct of_device_id omap_rproc_of_match[] = {
   1086	{
   1087		.compatible     = "ti,omap4-dsp",
   1088		.data           = &omap4_dsp_dev_data,
   1089	},
   1090	{
   1091		.compatible     = "ti,omap4-ipu",
   1092		.data           = &omap4_ipu_dev_data,
   1093	},
   1094	{
   1095		.compatible     = "ti,omap5-dsp",
   1096		.data           = &omap5_dsp_dev_data,
   1097	},
   1098	{
   1099		.compatible     = "ti,omap5-ipu",
   1100		.data           = &omap5_ipu_dev_data,
   1101	},
   1102	{
   1103		.compatible     = "ti,dra7-dsp",
   1104		.data           = &dra7_dsp_dev_data,
   1105	},
   1106	{
   1107		.compatible     = "ti,dra7-ipu",
   1108		.data           = &dra7_ipu_dev_data,
   1109	},
   1110	{
   1111		/* end */
   1112	},
   1113};
   1114MODULE_DEVICE_TABLE(of, omap_rproc_of_match);
   1115
   1116static const char *omap_rproc_get_firmware(struct platform_device *pdev)
   1117{
   1118	const char *fw_name;
   1119	int ret;
   1120
   1121	ret = of_property_read_string(pdev->dev.of_node, "firmware-name",
   1122				      &fw_name);
   1123	if (ret)
   1124		return ERR_PTR(ret);
   1125
   1126	return fw_name;
   1127}
   1128
   1129static int omap_rproc_get_boot_data(struct platform_device *pdev,
   1130				    struct rproc *rproc)
   1131{
   1132	struct device_node *np = pdev->dev.of_node;
   1133	struct omap_rproc *oproc = rproc->priv;
   1134	const struct omap_rproc_dev_data *data;
   1135	int ret;
   1136
   1137	data = of_device_get_match_data(&pdev->dev);
   1138	if (!data)
   1139		return -ENODEV;
   1140
   1141	if (!of_property_read_bool(np, "ti,bootreg"))
   1142		return 0;
   1143
   1144	oproc->boot_data = devm_kzalloc(&pdev->dev, sizeof(*oproc->boot_data),
   1145					GFP_KERNEL);
   1146	if (!oproc->boot_data)
   1147		return -ENOMEM;
   1148
   1149	oproc->boot_data->syscon =
   1150			syscon_regmap_lookup_by_phandle(np, "ti,bootreg");
   1151	if (IS_ERR(oproc->boot_data->syscon)) {
   1152		ret = PTR_ERR(oproc->boot_data->syscon);
   1153		return ret;
   1154	}
   1155
   1156	if (of_property_read_u32_index(np, "ti,bootreg", 1,
   1157				       &oproc->boot_data->boot_reg)) {
   1158		dev_err(&pdev->dev, "couldn't get the boot register\n");
   1159		return -EINVAL;
   1160	}
   1161
   1162	of_property_read_u32_index(np, "ti,bootreg", 2,
   1163				   &oproc->boot_data->boot_reg_shift);
   1164
   1165	return 0;
   1166}
   1167
   1168static int omap_rproc_of_get_internal_memories(struct platform_device *pdev,
   1169					       struct rproc *rproc)
   1170{
   1171	struct omap_rproc *oproc = rproc->priv;
   1172	struct device *dev = &pdev->dev;
   1173	const struct omap_rproc_dev_data *data;
   1174	struct resource *res;
   1175	int num_mems;
   1176	int i;
   1177
   1178	data = of_device_get_match_data(dev);
   1179	if (!data)
   1180		return -ENODEV;
   1181
   1182	if (!data->mems)
   1183		return 0;
   1184
   1185	num_mems = of_property_count_elems_of_size(dev->of_node, "reg",
   1186						   sizeof(u32)) / 2;
   1187
   1188	oproc->mem = devm_kcalloc(dev, num_mems, sizeof(*oproc->mem),
   1189				  GFP_KERNEL);
   1190	if (!oproc->mem)
   1191		return -ENOMEM;
   1192
   1193	for (i = 0; data->mems[i].name; i++) {
   1194		res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
   1195						   data->mems[i].name);
   1196		if (!res) {
   1197			dev_err(dev, "no memory defined for %s\n",
   1198				data->mems[i].name);
   1199			return -ENOMEM;
   1200		}
   1201		oproc->mem[i].cpu_addr = devm_ioremap_resource(dev, res);
   1202		if (IS_ERR(oproc->mem[i].cpu_addr)) {
   1203			dev_err(dev, "failed to parse and map %s memory\n",
   1204				data->mems[i].name);
   1205			return PTR_ERR(oproc->mem[i].cpu_addr);
   1206		}
   1207		oproc->mem[i].bus_addr = res->start;
   1208		oproc->mem[i].dev_addr = data->mems[i].dev_addr;
   1209		oproc->mem[i].size = resource_size(res);
   1210
   1211		dev_dbg(dev, "memory %8s: bus addr %pa size 0x%x va %pK da 0x%x\n",
   1212			data->mems[i].name, &oproc->mem[i].bus_addr,
   1213			oproc->mem[i].size, oproc->mem[i].cpu_addr,
   1214			oproc->mem[i].dev_addr);
   1215	}
   1216	oproc->num_mems = num_mems;
   1217
   1218	return 0;
   1219}
   1220
   1221#ifdef CONFIG_OMAP_REMOTEPROC_WATCHDOG
   1222static int omap_rproc_count_wdog_timers(struct device *dev)
   1223{
   1224	struct device_node *np = dev->of_node;
   1225	int ret;
   1226
   1227	ret = of_count_phandle_with_args(np, "ti,watchdog-timers", NULL);
   1228	if (ret <= 0) {
   1229		dev_dbg(dev, "device does not have watchdog timers, status = %d\n",
   1230			ret);
   1231		ret = 0;
   1232	}
   1233
   1234	return ret;
   1235}
   1236#else
   1237static int omap_rproc_count_wdog_timers(struct device *dev)
   1238{
   1239	return 0;
   1240}
   1241#endif
   1242
   1243static int omap_rproc_of_get_timers(struct platform_device *pdev,
   1244				    struct rproc *rproc)
   1245{
   1246	struct device_node *np = pdev->dev.of_node;
   1247	struct omap_rproc *oproc = rproc->priv;
   1248	struct device *dev = &pdev->dev;
   1249	int num_timers;
   1250
   1251	/*
   1252	 * Timer nodes are directly used in client nodes as phandles, so
   1253	 * retrieve the count using appropriate size
   1254	 */
   1255	oproc->num_timers = of_count_phandle_with_args(np, "ti,timers", NULL);
   1256	if (oproc->num_timers <= 0) {
   1257		dev_dbg(dev, "device does not have timers, status = %d\n",
   1258			oproc->num_timers);
   1259		oproc->num_timers = 0;
   1260	}
   1261
   1262	oproc->num_wd_timers = omap_rproc_count_wdog_timers(dev);
   1263
   1264	num_timers = oproc->num_timers + oproc->num_wd_timers;
   1265	if (num_timers) {
   1266		oproc->timers = devm_kcalloc(dev, num_timers,
   1267					     sizeof(*oproc->timers),
   1268					     GFP_KERNEL);
   1269		if (!oproc->timers)
   1270			return -ENOMEM;
   1271
   1272		dev_dbg(dev, "device has %d tick timers and %d watchdog timers\n",
   1273			oproc->num_timers, oproc->num_wd_timers);
   1274	}
   1275
   1276	return 0;
   1277}
   1278
   1279static int omap_rproc_probe(struct platform_device *pdev)
   1280{
   1281	struct device_node *np = pdev->dev.of_node;
   1282	struct omap_rproc *oproc;
   1283	struct rproc *rproc;
   1284	const char *firmware;
   1285	int ret;
   1286	struct reset_control *reset;
   1287
   1288	if (!np) {
   1289		dev_err(&pdev->dev, "only DT-based devices are supported\n");
   1290		return -ENODEV;
   1291	}
   1292
   1293	reset = devm_reset_control_array_get_exclusive(&pdev->dev);
   1294	if (IS_ERR(reset))
   1295		return PTR_ERR(reset);
   1296
   1297	firmware = omap_rproc_get_firmware(pdev);
   1298	if (IS_ERR(firmware))
   1299		return PTR_ERR(firmware);
   1300
   1301	ret = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(32));
   1302	if (ret) {
   1303		dev_err(&pdev->dev, "dma_set_coherent_mask: %d\n", ret);
   1304		return ret;
   1305	}
   1306
   1307	rproc = rproc_alloc(&pdev->dev, dev_name(&pdev->dev), &omap_rproc_ops,
   1308			    firmware, sizeof(*oproc));
   1309	if (!rproc)
   1310		return -ENOMEM;
   1311
   1312	oproc = rproc->priv;
   1313	oproc->rproc = rproc;
   1314	oproc->reset = reset;
   1315	/* All existing OMAP IPU and DSP processors have an MMU */
   1316	rproc->has_iommu = true;
   1317
   1318	ret = omap_rproc_of_get_internal_memories(pdev, rproc);
   1319	if (ret)
   1320		goto free_rproc;
   1321
   1322	ret = omap_rproc_get_boot_data(pdev, rproc);
   1323	if (ret)
   1324		goto free_rproc;
   1325
   1326	ret = omap_rproc_of_get_timers(pdev, rproc);
   1327	if (ret)
   1328		goto free_rproc;
   1329
   1330	init_completion(&oproc->pm_comp);
   1331	oproc->autosuspend_delay = DEFAULT_AUTOSUSPEND_DELAY;
   1332
   1333	of_property_read_u32(pdev->dev.of_node, "ti,autosuspend-delay-ms",
   1334			     &oproc->autosuspend_delay);
   1335
   1336	pm_runtime_set_autosuspend_delay(&pdev->dev, oproc->autosuspend_delay);
   1337
   1338	oproc->fck = devm_clk_get(&pdev->dev, 0);
   1339	if (IS_ERR(oproc->fck)) {
   1340		ret = PTR_ERR(oproc->fck);
   1341		goto free_rproc;
   1342	}
   1343
   1344	ret = of_reserved_mem_device_init(&pdev->dev);
   1345	if (ret) {
   1346		dev_warn(&pdev->dev, "device does not have specific CMA pool.\n");
   1347		dev_warn(&pdev->dev, "Typically this should be provided,\n");
   1348		dev_warn(&pdev->dev, "only omit if you know what you are doing.\n");
   1349	}
   1350
   1351	platform_set_drvdata(pdev, rproc);
   1352
   1353	ret = rproc_add(rproc);
   1354	if (ret)
   1355		goto release_mem;
   1356
   1357	return 0;
   1358
   1359release_mem:
   1360	of_reserved_mem_device_release(&pdev->dev);
   1361free_rproc:
   1362	rproc_free(rproc);
   1363	return ret;
   1364}
   1365
   1366static int omap_rproc_remove(struct platform_device *pdev)
   1367{
   1368	struct rproc *rproc = platform_get_drvdata(pdev);
   1369
   1370	rproc_del(rproc);
   1371	rproc_free(rproc);
   1372	of_reserved_mem_device_release(&pdev->dev);
   1373
   1374	return 0;
   1375}
   1376
   1377static const struct dev_pm_ops omap_rproc_pm_ops = {
   1378	SET_SYSTEM_SLEEP_PM_OPS(omap_rproc_suspend, omap_rproc_resume)
   1379	SET_RUNTIME_PM_OPS(omap_rproc_runtime_suspend,
   1380			   omap_rproc_runtime_resume, NULL)
   1381};
   1382
   1383static struct platform_driver omap_rproc_driver = {
   1384	.probe = omap_rproc_probe,
   1385	.remove = omap_rproc_remove,
   1386	.driver = {
   1387		.name = "omap-rproc",
   1388		.pm = &omap_rproc_pm_ops,
   1389		.of_match_table = omap_rproc_of_match,
   1390	},
   1391};
   1392
   1393module_platform_driver(omap_rproc_driver);
   1394
   1395MODULE_LICENSE("GPL v2");
   1396MODULE_DESCRIPTION("OMAP Remote Processor control driver");