Lines Matching +full:no +full:- +full:tick +full:- +full:in +full:- +full:suspend

1 // SPDX-License-Identifier: GPL-2.0-only
5 * Copyright (C) 2011-2020 Texas Instruments Incorporated - http://www.ti.com/
8 * Ohad Ben-Cohen <[email protected]>
12 * Suman Anna <s-[email protected]>
13 * Hari Kanigeri <h-[email protected]>
27 #include <linux/dma-mapping.h>
31 #include <linux/omap-iommu.h>
32 #include <linux/omap-mailbox.h>
36 #include <clocksource/timer-ti-dm.h>
38 #include <linux/platform_data/dmtimer-omap.h>
41 #include <asm/dma-iommu.h>
47 /* default auto-suspend delay (ms) */
51 * struct omap_rproc_boot_data - boot data structure for the DSP omap rprocs
54 * @boot_reg_shift: bit-field shift required for the boot address value in
64 * struct omap_rproc_mem - internal memory structure
78 * struct omap_rproc_timer - data structure for a timer used by a omap rproc
90 * struct omap_rproc - omap remote processor state
99 * @autosuspend_delay: auto-suspend delay value to be used for runtime pm
100 * @need_resume: if true a resume is needed in the system resume callback
103 * @pm_comp: completion primitive to sync for suspend response
105 * @suspend_acked: state machine flag to store the suspend request ack
126 * struct omap_rproc_mem_data - memory definitions for an omap remote processor
136 * struct omap_rproc_dev_data - device data for the omap remote processor
146 * omap_rproc_request_timer() - request a timer for a remoteproc
152 * a remoteproc. The returned handle is stored in the .odt field of the
153 * @timer structure passed in, and is used to invoke other timer specific
164 timer->odt = timer->timer_ops->request_by_node(np); in omap_rproc_request_timer()
165 if (!timer->odt) { in omap_rproc_request_timer()
167 return -EBUSY; in omap_rproc_request_timer()
170 ret = timer->timer_ops->set_source(timer->odt, OMAP_TIMER_SRC_SYS_CLK); in omap_rproc_request_timer()
174 timer->timer_ops->free(timer->odt); in omap_rproc_request_timer()
179 timer->timer_ops->set_load(timer->odt, 0); in omap_rproc_request_timer()
185 * omap_rproc_start_timer() - start a timer for a remoteproc
197 return timer->timer_ops->start(timer->odt); in omap_rproc_start_timer()
201 * omap_rproc_stop_timer() - stop a timer for a remoteproc
206 * or suspend operation. The separate helper function allows the driver
208 * suspend operation.
214 return timer->timer_ops->stop(timer->odt); in omap_rproc_stop_timer()
218 * omap_rproc_release_timer() - release a timer for a remoteproc
229 return timer->timer_ops->free(timer->odt); in omap_rproc_release_timer()
233 * omap_rproc_get_timer_irq() - get the irq for a timer
244 return timer->timer_ops->get_irq(timer->odt); in omap_rproc_get_timer_irq()
248 * omap_rproc_ack_timer_irq() - acknowledge a timer irq
257 timer->timer_ops->write_status(timer->odt, OMAP_TIMER_INT_OVERFLOW); in omap_rproc_ack_timer_irq()
261 * omap_rproc_watchdog_isr() - Watchdog ISR handler for remoteproc device
265 * This ISR routine executes the required necessary low-level code to
279 struct omap_rproc *oproc = rproc->priv; in omap_rproc_watchdog_isr()
280 struct device *dev = rproc->dev.parent; in omap_rproc_watchdog_isr()
281 struct omap_rproc_timer *timers = oproc->timers; in omap_rproc_watchdog_isr()
283 int num_timers = oproc->num_timers + oproc->num_wd_timers; in omap_rproc_watchdog_isr()
286 for (i = oproc->num_timers; i < num_timers; i++) { in omap_rproc_watchdog_isr()
306 * omap_rproc_enable_timers() - enable the timers for a remoteproc
324 struct omap_rproc *oproc = rproc->priv; in omap_rproc_enable_timers()
325 struct omap_rproc_timer *timers = oproc->timers; in omap_rproc_enable_timers()
326 struct device *dev = rproc->dev.parent; in omap_rproc_enable_timers()
328 int num_timers = oproc->num_timers + oproc->num_wd_timers; in omap_rproc_enable_timers()
337 if (i < oproc->num_timers) in omap_rproc_enable_timers()
338 np = of_parse_phandle(dev->of_node, "ti,timers", i); in omap_rproc_enable_timers()
340 np = of_parse_phandle(dev->of_node, in omap_rproc_enable_timers()
341 "ti,watchdog-timers", in omap_rproc_enable_timers()
342 (i - oproc->num_timers)); in omap_rproc_enable_timers()
344 ret = -ENXIO; in omap_rproc_enable_timers()
346 i < oproc->num_timers ? i : in omap_rproc_enable_timers()
347 i - oproc->num_timers, ret); in omap_rproc_enable_timers()
353 ret = -ENODEV; in omap_rproc_enable_timers()
358 tpdata = dev_get_platdata(&tpdev->dev); in omap_rproc_enable_timers()
359 put_device(&tpdev->dev); in omap_rproc_enable_timers()
361 ret = -EINVAL; in omap_rproc_enable_timers()
366 timer_ops = tpdata->timer_ops; in omap_rproc_enable_timers()
367 if (!timer_ops || !timer_ops->request_by_node || in omap_rproc_enable_timers()
368 !timer_ops->set_source || !timer_ops->set_load || in omap_rproc_enable_timers()
369 !timer_ops->free || !timer_ops->start || in omap_rproc_enable_timers()
370 !timer_ops->stop || !timer_ops->get_irq || in omap_rproc_enable_timers()
371 !timer_ops->write_status) { in omap_rproc_enable_timers()
372 ret = -EINVAL; in omap_rproc_enable_timers()
377 timers[i].irq = -1; in omap_rproc_enable_timers()
387 if (i >= oproc->num_timers) { in omap_rproc_enable_timers()
392 ret = -EBUSY; in omap_rproc_enable_timers()
398 "rproc-wdt", rproc); in omap_rproc_enable_timers()
405 timers[i].irq = -1; in omap_rproc_enable_timers()
423 i--; in omap_rproc_enable_timers()
433 while (i--) { in omap_rproc_enable_timers()
434 if (i >= oproc->num_timers) in omap_rproc_enable_timers()
439 timers[i].irq = -1; in omap_rproc_enable_timers()
446 * omap_rproc_disable_timers() - disable the timers for a remoteproc
453 * stop a timer (during a suspend operation).
455 * Return: 0 on success or no timers
460 struct omap_rproc *oproc = rproc->priv; in omap_rproc_disable_timers()
461 struct omap_rproc_timer *timers = oproc->timers; in omap_rproc_disable_timers()
462 int num_timers = oproc->num_timers + oproc->num_wd_timers; in omap_rproc_disable_timers()
470 if (i >= oproc->num_timers) in omap_rproc_disable_timers()
475 timers[i].irq = -1; in omap_rproc_disable_timers()
483 * omap_rproc_mbox_callback() - inbound mailbox message handler
492 * In addition to virtqueue indices, we also have some out-of-band values
500 struct device *dev = oproc->rproc->dev.parent; in omap_rproc_mbox_callback()
501 const char *name = oproc->rproc->name; in omap_rproc_mbox_callback()
513 rproc_report_crash(oproc->rproc, RPROC_FATAL_ERROR); in omap_rproc_mbox_callback()
520 oproc->suspend_acked = msg == RP_MBOX_SUSPEND_ACK; in omap_rproc_mbox_callback()
521 complete(&oproc->pm_comp); in omap_rproc_mbox_callback()
526 if (msg > oproc->rproc->max_notifyid) { in omap_rproc_mbox_callback()
531 if (rproc_vq_interrupt(oproc->rproc, msg) == IRQ_NONE) in omap_rproc_mbox_callback()
532 dev_dbg(dev, "no message was found in vqid %d\n", msg); in omap_rproc_mbox_callback()
539 struct omap_rproc *oproc = rproc->priv; in omap_rproc_kick()
540 struct device *dev = rproc->dev.parent; in omap_rproc_kick()
552 /* send the index of the triggered virtqueue in the mailbox payload */ in omap_rproc_kick()
553 ret = mbox_send_message(oproc->mbox, (void *)vqid); in omap_rproc_kick()
563 * omap_rproc_write_dsp_boot_addr() - set boot address for DSP remote processor
568 * Return: 0 on success, or -EINVAL if boot address is not aligned properly
572 struct device *dev = rproc->dev.parent; in omap_rproc_write_dsp_boot_addr()
573 struct omap_rproc *oproc = rproc->priv; in omap_rproc_write_dsp_boot_addr()
574 struct omap_rproc_boot_data *bdata = oproc->boot_data; in omap_rproc_write_dsp_boot_addr()
575 u32 offset = bdata->boot_reg; in omap_rproc_write_dsp_boot_addr()
579 if (rproc->bootaddr & (SZ_1K - 1)) { in omap_rproc_write_dsp_boot_addr()
581 rproc->bootaddr); in omap_rproc_write_dsp_boot_addr()
582 return -EINVAL; in omap_rproc_write_dsp_boot_addr()
585 value = rproc->bootaddr >> bdata->boot_reg_shift; in omap_rproc_write_dsp_boot_addr()
586 mask = ~(SZ_1K - 1) >> bdata->boot_reg_shift; in omap_rproc_write_dsp_boot_addr()
588 return regmap_update_bits(bdata->syscon, offset, mask, value); in omap_rproc_write_dsp_boot_addr()
600 struct omap_rproc *oproc = rproc->priv; in omap_rproc_start()
601 struct device *dev = rproc->dev.parent; in omap_rproc_start()
603 struct mbox_client *client = &oproc->client; in omap_rproc_start()
605 if (oproc->boot_data) { in omap_rproc_start()
611 client->dev = dev; in omap_rproc_start()
612 client->tx_done = NULL; in omap_rproc_start()
613 client->rx_callback = omap_rproc_mbox_callback; in omap_rproc_start()
614 client->tx_block = false; in omap_rproc_start()
615 client->knows_txdone = false; in omap_rproc_start()
617 oproc->mbox = mbox_request_channel(client, 0); in omap_rproc_start()
618 if (IS_ERR(oproc->mbox)) { in omap_rproc_start()
619 ret = -EBUSY; in omap_rproc_start()
621 PTR_ERR(oproc->mbox)); in omap_rproc_start()
626 * Ping the remote processor. this is only for sanity-sake; in omap_rproc_start()
627 * there is no functional effect whatsoever. in omap_rproc_start()
630 * will wait in the mailbox fifo until the remote processor is booted. in omap_rproc_start()
632 ret = mbox_send_message(oproc->mbox, (void *)RP_MBOX_ECHO_REQUEST); in omap_rproc_start()
644 ret = reset_control_deassert(oproc->reset); in omap_rproc_start()
652 * enable the auto-suspend. The device usage count is incremented in omap_rproc_start()
653 * manually for balancing it for auto-suspend in omap_rproc_start()
667 mbox_free_channel(oproc->mbox); in omap_rproc_start()
674 struct device *dev = rproc->dev.parent; in omap_rproc_stop()
675 struct omap_rproc *oproc = rproc->priv; in omap_rproc_stop()
679 * cancel any possible scheduled runtime suspend by incrementing in omap_rproc_stop()
683 * avoid potential issues in misindentifying a subsequent device in omap_rproc_stop()
692 ret = reset_control_assert(oproc->reset); in omap_rproc_stop()
700 mbox_free_channel(oproc->mbox); in omap_rproc_stop()
714 reset_control_deassert(oproc->reset); in omap_rproc_stop()
716 /* schedule the next auto-suspend */ in omap_rproc_stop()
723 * omap_rproc_da_to_va() - internal memory translation helper
730 * present in a DSP or IPU device). The translated addresses can be used
733 * Return: translated virtual address in kernel memory space on success,
738 struct omap_rproc *oproc = rproc->priv; in omap_rproc_da_to_va()
745 if (!oproc->num_mems) in omap_rproc_da_to_va()
748 for (i = 0; i < oproc->num_mems; i++) { in omap_rproc_da_to_va()
749 if (da >= oproc->mem[i].dev_addr && da + len <= in omap_rproc_da_to_va()
750 oproc->mem[i].dev_addr + oproc->mem[i].size) { in omap_rproc_da_to_va()
751 offset = da - oproc->mem[i].dev_addr; in omap_rproc_da_to_va()
753 return (__force void *)(oproc->mem[i].cpu_addr + in omap_rproc_da_to_va()
771 return ti_clk_is_in_standby(oproc->fck); in _is_rproc_in_standby()
774 /* 1 sec is long enough time to let the remoteproc side suspend the device */
778 struct device *dev = rproc->dev.parent; in _omap_rproc_suspend()
779 struct omap_rproc *oproc = rproc->priv; in _omap_rproc_suspend()
786 reinit_completion(&oproc->pm_comp); in _omap_rproc_suspend()
787 oproc->suspend_acked = false; in _omap_rproc_suspend()
788 ret = mbox_send_message(oproc->mbox, (void *)suspend_msg); in _omap_rproc_suspend()
794 ret = wait_for_completion_timeout(&oproc->pm_comp, to); in _omap_rproc_suspend()
795 if (!oproc->suspend_acked) in _omap_rproc_suspend()
796 return -EBUSY; in _omap_rproc_suspend()
801 * function, and it cannot have any inter-dependencies against the IPC in _omap_rproc_suspend()
810 * appropriate target-specific WFI instruction causing the module to in _omap_rproc_suspend()
815 return -ETIME; in _omap_rproc_suspend()
819 ret = reset_control_assert(oproc->reset); in _omap_rproc_suspend()
821 dev_err(dev, "reset assert during suspend failed %d\n", ret); in _omap_rproc_suspend()
827 dev_err(dev, "disabling timers during suspend failed %d\n", in _omap_rproc_suspend()
833 * IOMMUs would have to be disabled specifically for runtime suspend. in _omap_rproc_suspend()
835 * regular system suspend in _omap_rproc_suspend()
838 ret = omap_iommu_domain_deactivate(rproc->domain); in _omap_rproc_suspend()
849 /* ignore errors on re-enabling code */ in _omap_rproc_suspend()
852 reset_control_deassert(oproc->reset); in _omap_rproc_suspend()
858 struct device *dev = rproc->dev.parent; in _omap_rproc_resume()
859 struct omap_rproc *oproc = rproc->priv; in _omap_rproc_resume()
868 ret = omap_iommu_domain_activate(rproc->domain); in _omap_rproc_resume()
875 /* boot address could be lost after suspend, so restore it */ in _omap_rproc_resume()
876 if (oproc->boot_data) { in _omap_rproc_resume()
890 ret = reset_control_deassert(oproc->reset); in _omap_rproc_resume()
902 omap_iommu_domain_deactivate(rproc->domain); in _omap_rproc_resume()
910 struct omap_rproc *oproc = rproc->priv; in omap_rproc_suspend()
913 mutex_lock(&rproc->lock); in omap_rproc_suspend()
914 if (rproc->state == RPROC_OFFLINE) in omap_rproc_suspend()
917 if (rproc->state == RPROC_SUSPENDED) in omap_rproc_suspend()
920 if (rproc->state != RPROC_RUNNING) { in omap_rproc_suspend()
921 ret = -EBUSY; in omap_rproc_suspend()
927 dev_err(dev, "suspend failed %d\n", ret); in omap_rproc_suspend()
932 * remoteproc is running at the time of system suspend, so remember in omap_rproc_suspend()
935 oproc->need_resume = true; in omap_rproc_suspend()
936 rproc->state = RPROC_SUSPENDED; in omap_rproc_suspend()
939 mutex_unlock(&rproc->lock); in omap_rproc_suspend()
946 struct omap_rproc *oproc = rproc->priv; in omap_rproc_resume()
949 mutex_lock(&rproc->lock); in omap_rproc_resume()
950 if (rproc->state == RPROC_OFFLINE) in omap_rproc_resume()
953 if (rproc->state != RPROC_SUSPENDED) { in omap_rproc_resume()
954 ret = -EBUSY; in omap_rproc_resume()
959 * remoteproc was auto-suspended at the time of system suspend, in omap_rproc_resume()
960 * so no need to wake-up the processor (leave it in suspended in omap_rproc_resume()
963 if (!oproc->need_resume) in omap_rproc_resume()
972 oproc->need_resume = false; in omap_rproc_resume()
973 rproc->state = RPROC_RUNNING; in omap_rproc_resume()
977 mutex_unlock(&rproc->lock); in omap_rproc_resume()
984 struct omap_rproc *oproc = rproc->priv; in omap_rproc_runtime_suspend()
987 mutex_lock(&rproc->lock); in omap_rproc_runtime_suspend()
988 if (rproc->state == RPROC_CRASHED) { in omap_rproc_runtime_suspend()
990 ret = -EBUSY; in omap_rproc_runtime_suspend()
994 if (WARN_ON(rproc->state != RPROC_RUNNING)) { in omap_rproc_runtime_suspend()
996 ret = -EBUSY; in omap_rproc_runtime_suspend()
1001 * do not even attempt suspend if the remote processor is not in omap_rproc_runtime_suspend()
1002 * idled for runtime auto-suspend in omap_rproc_runtime_suspend()
1005 ret = -EBUSY; in omap_rproc_runtime_suspend()
1013 rproc->state = RPROC_SUSPENDED; in omap_rproc_runtime_suspend()
1014 mutex_unlock(&rproc->lock); in omap_rproc_runtime_suspend()
1020 mutex_unlock(&rproc->lock); in omap_rproc_runtime_suspend()
1029 mutex_lock(&rproc->lock); in omap_rproc_runtime_resume()
1030 if (WARN_ON(rproc->state != RPROC_SUSPENDED)) { in omap_rproc_runtime_resume()
1032 rproc->state); in omap_rproc_runtime_resume()
1033 ret = -EBUSY; in omap_rproc_runtime_resume()
1043 rproc->state = RPROC_RUNNING; in omap_rproc_runtime_resume()
1045 mutex_unlock(&rproc->lock); in omap_rproc_runtime_resume()
1092 .compatible = "ti,omap4-dsp",
1096 .compatible = "ti,omap4-ipu",
1100 .compatible = "ti,omap5-dsp",
1104 .compatible = "ti,omap5-ipu",
1108 .compatible = "ti,dra7-dsp",
1112 .compatible = "ti,dra7-ipu",
1126 ret = of_property_read_string(pdev->dev.of_node, "firmware-name", in omap_rproc_get_firmware()
1137 struct device_node *np = pdev->dev.of_node; in omap_rproc_get_boot_data()
1138 struct omap_rproc *oproc = rproc->priv; in omap_rproc_get_boot_data()
1141 data = of_device_get_match_data(&pdev->dev); in omap_rproc_get_boot_data()
1143 return -ENODEV; in omap_rproc_get_boot_data()
1148 oproc->boot_data = devm_kzalloc(&pdev->dev, sizeof(*oproc->boot_data), in omap_rproc_get_boot_data()
1150 if (!oproc->boot_data) in omap_rproc_get_boot_data()
1151 return -ENOMEM; in omap_rproc_get_boot_data()
1153 oproc->boot_data->syscon = in omap_rproc_get_boot_data()
1155 if (IS_ERR(oproc->boot_data->syscon)) in omap_rproc_get_boot_data()
1156 return PTR_ERR(oproc->boot_data->syscon); in omap_rproc_get_boot_data()
1159 &oproc->boot_data->boot_reg)) { in omap_rproc_get_boot_data()
1160 dev_err(&pdev->dev, "couldn't get the boot register\n"); in omap_rproc_get_boot_data()
1161 return -EINVAL; in omap_rproc_get_boot_data()
1165 &oproc->boot_data->boot_reg_shift); in omap_rproc_get_boot_data()
1173 struct omap_rproc *oproc = rproc->priv; in omap_rproc_of_get_internal_memories()
1174 struct device *dev = &pdev->dev; in omap_rproc_of_get_internal_memories()
1182 return -ENODEV; in omap_rproc_of_get_internal_memories()
1184 if (!data->mems) in omap_rproc_of_get_internal_memories()
1187 num_mems = of_property_count_elems_of_size(dev->of_node, "reg", in omap_rproc_of_get_internal_memories()
1190 oproc->mem = devm_kcalloc(dev, num_mems, sizeof(*oproc->mem), in omap_rproc_of_get_internal_memories()
1192 if (!oproc->mem) in omap_rproc_of_get_internal_memories()
1193 return -ENOMEM; in omap_rproc_of_get_internal_memories()
1195 for (i = 0; data->mems[i].name; i++) { in omap_rproc_of_get_internal_memories()
1197 data->mems[i].name); in omap_rproc_of_get_internal_memories()
1199 dev_err(dev, "no memory defined for %s\n", in omap_rproc_of_get_internal_memories()
1200 data->mems[i].name); in omap_rproc_of_get_internal_memories()
1201 return -ENOMEM; in omap_rproc_of_get_internal_memories()
1203 oproc->mem[i].cpu_addr = devm_ioremap_resource(dev, res); in omap_rproc_of_get_internal_memories()
1204 if (IS_ERR(oproc->mem[i].cpu_addr)) { in omap_rproc_of_get_internal_memories()
1206 data->mems[i].name); in omap_rproc_of_get_internal_memories()
1207 return PTR_ERR(oproc->mem[i].cpu_addr); in omap_rproc_of_get_internal_memories()
1209 oproc->mem[i].bus_addr = res->start; in omap_rproc_of_get_internal_memories()
1210 oproc->mem[i].dev_addr = data->mems[i].dev_addr; in omap_rproc_of_get_internal_memories()
1211 oproc->mem[i].size = resource_size(res); in omap_rproc_of_get_internal_memories()
1214 data->mems[i].name, &oproc->mem[i].bus_addr, in omap_rproc_of_get_internal_memories()
1215 oproc->mem[i].size, oproc->mem[i].cpu_addr, in omap_rproc_of_get_internal_memories()
1216 oproc->mem[i].dev_addr); in omap_rproc_of_get_internal_memories()
1218 oproc->num_mems = num_mems; in omap_rproc_of_get_internal_memories()
1226 struct device_node *np = dev->of_node; in omap_rproc_count_wdog_timers()
1229 ret = of_count_phandle_with_args(np, "ti,watchdog-timers", NULL); in omap_rproc_count_wdog_timers()
1248 struct device_node *np = pdev->dev.of_node; in omap_rproc_of_get_timers()
1249 struct omap_rproc *oproc = rproc->priv; in omap_rproc_of_get_timers()
1250 struct device *dev = &pdev->dev; in omap_rproc_of_get_timers()
1254 * Timer nodes are directly used in client nodes as phandles, so in omap_rproc_of_get_timers()
1257 oproc->num_timers = of_count_phandle_with_args(np, "ti,timers", NULL); in omap_rproc_of_get_timers()
1258 if (oproc->num_timers <= 0) { in omap_rproc_of_get_timers()
1260 oproc->num_timers); in omap_rproc_of_get_timers()
1261 oproc->num_timers = 0; in omap_rproc_of_get_timers()
1264 oproc->num_wd_timers = omap_rproc_count_wdog_timers(dev); in omap_rproc_of_get_timers()
1266 num_timers = oproc->num_timers + oproc->num_wd_timers; in omap_rproc_of_get_timers()
1268 oproc->timers = devm_kcalloc(dev, num_timers, in omap_rproc_of_get_timers()
1269 sizeof(*oproc->timers), in omap_rproc_of_get_timers()
1271 if (!oproc->timers) in omap_rproc_of_get_timers()
1272 return -ENOMEM; in omap_rproc_of_get_timers()
1274 dev_dbg(dev, "device has %d tick timers and %d watchdog timers\n", in omap_rproc_of_get_timers()
1275 oproc->num_timers, oproc->num_wd_timers); in omap_rproc_of_get_timers()
1290 struct device_node *np = pdev->dev.of_node; in omap_rproc_probe()
1298 dev_err(&pdev->dev, "only DT-based devices are supported\n"); in omap_rproc_probe()
1299 return -ENODEV; in omap_rproc_probe()
1302 reset = devm_reset_control_array_get_exclusive(&pdev->dev); in omap_rproc_probe()
1310 ret = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(32)); in omap_rproc_probe()
1312 dev_err(&pdev->dev, "dma_set_coherent_mask: %d\n", ret); in omap_rproc_probe()
1316 rproc = devm_rproc_alloc(&pdev->dev, dev_name(&pdev->dev), &omap_rproc_ops, in omap_rproc_probe()
1319 return -ENOMEM; in omap_rproc_probe()
1321 oproc = rproc->priv; in omap_rproc_probe()
1322 oproc->rproc = rproc; in omap_rproc_probe()
1323 oproc->reset = reset; in omap_rproc_probe()
1325 rproc->has_iommu = true; in omap_rproc_probe()
1330 * interfere with the core rproc->domain and we get the right DMA ops. in omap_rproc_probe()
1332 if (pdev->dev.archdata.mapping) { in omap_rproc_probe()
1333 struct dma_iommu_mapping *mapping = to_dma_iommu_mapping(&pdev->dev); in omap_rproc_probe()
1335 arm_iommu_detach_device(&pdev->dev); in omap_rproc_probe()
1352 init_completion(&oproc->pm_comp); in omap_rproc_probe()
1353 oproc->autosuspend_delay = DEFAULT_AUTOSUSPEND_DELAY; in omap_rproc_probe()
1355 of_property_read_u32(pdev->dev.of_node, "ti,autosuspend-delay-ms", in omap_rproc_probe()
1356 &oproc->autosuspend_delay); in omap_rproc_probe()
1358 pm_runtime_set_autosuspend_delay(&pdev->dev, oproc->autosuspend_delay); in omap_rproc_probe()
1360 oproc->fck = devm_clk_get(&pdev->dev, 0); in omap_rproc_probe()
1361 if (IS_ERR(oproc->fck)) in omap_rproc_probe()
1362 return PTR_ERR(oproc->fck); in omap_rproc_probe()
1364 ret = of_reserved_mem_device_init(&pdev->dev); in omap_rproc_probe()
1366 dev_warn(&pdev->dev, "device does not have specific CMA pool.\n"); in omap_rproc_probe()
1367 dev_warn(&pdev->dev, "Typically this should be provided,\n"); in omap_rproc_probe()
1368 dev_warn(&pdev->dev, "only omit if you know what you are doing.\n"); in omap_rproc_probe()
1370 ret = devm_add_action_or_reset(&pdev->dev, omap_rproc_mem_release, &pdev->dev); in omap_rproc_probe()
1376 ret = devm_rproc_add(&pdev->dev, rproc); in omap_rproc_probe()
1392 .name = "omap-rproc",