Lines Matching +full:suspend +full:- +full:address
1 // SPDX-License-Identifier: GPL-2.0-only
5 * Copyright (C) 2011-2020 Texas Instruments Incorporated - http://www.ti.com/
8 * Ohad Ben-Cohen <ohad@wizery.com>
12 * Suman Anna <s-anna@ti.com>
13 * Hari Kanigeri <h-kanigeri2@ti.com>
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
65 * @cpu_addr: MPU virtual address of the memory region
66 * @bus_addr: bus address used to access the memory region
67 * @dev_addr: device address of the memory region from DSP view
78 * struct omap_rproc_timer - data structure for a timer used by a omap rproc
90 * struct omap_rproc - omap remote processor state
93 * @boot_data: boot data structure for setting processor boot address
99 * @autosuspend_delay: auto-suspend delay value to be used for runtime pm
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
128 * @dev_addr: device address for the memory entry
136 * struct omap_rproc_dev_data - device data for the omap remote processor
146 * omap_rproc_request_timer() - request a timer for a remoteproc
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).
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()
539 struct omap_rproc *oproc = rproc->priv; in omap_rproc_kick()
540 struct device *dev = rproc->dev.parent; 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
566 * Set boot address for a supported 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()
580 dev_err(dev, "invalid boot address 0x%llx, must be aligned on a 1KB boundary\n", 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()
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()
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
724 * @rproc: remote processor to apply the address translation for
725 * @da: device address to translate
729 * Custom function implementing the rproc .da_to_va ops to provide address
730 * translation (device address to kernel virtual address) for internal RAMs
734 * Return: translated virtual address in kernel memory space on success,
739 struct omap_rproc *oproc = rproc->priv; in omap_rproc_da_to_va()
746 if (!oproc->num_mems) in omap_rproc_da_to_va()
749 for (i = 0; i < oproc->num_mems; i++) { in omap_rproc_da_to_va()
750 if (da >= oproc->mem[i].dev_addr && da + len <= in omap_rproc_da_to_va()
751 oproc->mem[i].dev_addr + oproc->mem[i].size) { in omap_rproc_da_to_va()
752 offset = da - oproc->mem[i].dev_addr; in omap_rproc_da_to_va()
754 return (__force void *)(oproc->mem[i].cpu_addr + in omap_rproc_da_to_va()
772 return ti_clk_is_in_standby(oproc->fck); in _is_rproc_in_standby()
775 /* 1 sec is long enough time to let the remoteproc side suspend the device */
779 struct device *dev = rproc->dev.parent; in _omap_rproc_suspend()
780 struct omap_rproc *oproc = rproc->priv; in _omap_rproc_suspend()
787 reinit_completion(&oproc->pm_comp); in _omap_rproc_suspend()
788 oproc->suspend_acked = false; in _omap_rproc_suspend()
789 ret = mbox_send_message(oproc->mbox, (void *)suspend_msg); in _omap_rproc_suspend()
795 ret = wait_for_completion_timeout(&oproc->pm_comp, to); in _omap_rproc_suspend()
796 if (!oproc->suspend_acked) in _omap_rproc_suspend()
797 return -EBUSY; in _omap_rproc_suspend()
802 * function, and it cannot have any inter-dependencies against the IPC in _omap_rproc_suspend()
811 * appropriate target-specific WFI instruction causing the module to in _omap_rproc_suspend()
816 return -ETIME; in _omap_rproc_suspend()
820 ret = reset_control_assert(oproc->reset); in _omap_rproc_suspend()
822 dev_err(dev, "reset assert during suspend failed %d\n", ret); in _omap_rproc_suspend()
828 dev_err(dev, "disabling timers during suspend failed %d\n", in _omap_rproc_suspend()
834 * IOMMUs would have to be disabled specifically for runtime suspend. in _omap_rproc_suspend()
836 * regular system suspend in _omap_rproc_suspend()
839 ret = omap_iommu_domain_deactivate(rproc->domain); in _omap_rproc_suspend()
850 /* ignore errors on re-enabling code */ in _omap_rproc_suspend()
853 reset_control_deassert(oproc->reset); in _omap_rproc_suspend()
859 struct device *dev = rproc->dev.parent; in _omap_rproc_resume()
860 struct omap_rproc *oproc = rproc->priv; in _omap_rproc_resume()
869 ret = omap_iommu_domain_activate(rproc->domain); in _omap_rproc_resume()
876 /* boot address could be lost after suspend, so restore it */ in _omap_rproc_resume()
877 if (oproc->boot_data) { in _omap_rproc_resume()
880 dev_err(dev, "boot address restore failed %d\n", ret); in _omap_rproc_resume()
891 ret = reset_control_deassert(oproc->reset); in _omap_rproc_resume()
903 omap_iommu_domain_deactivate(rproc->domain); in _omap_rproc_resume()
911 struct omap_rproc *oproc = rproc->priv; in omap_rproc_suspend()
914 mutex_lock(&rproc->lock); in omap_rproc_suspend()
915 if (rproc->state == RPROC_OFFLINE) in omap_rproc_suspend()
918 if (rproc->state == RPROC_SUSPENDED) in omap_rproc_suspend()
921 if (rproc->state != RPROC_RUNNING) { in omap_rproc_suspend()
922 ret = -EBUSY; in omap_rproc_suspend()
928 dev_err(dev, "suspend failed %d\n", ret); in omap_rproc_suspend()
933 * remoteproc is running at the time of system suspend, so remember in omap_rproc_suspend()
936 oproc->need_resume = true; in omap_rproc_suspend()
937 rproc->state = RPROC_SUSPENDED; in omap_rproc_suspend()
940 mutex_unlock(&rproc->lock); in omap_rproc_suspend()
947 struct omap_rproc *oproc = rproc->priv; in omap_rproc_resume()
950 mutex_lock(&rproc->lock); in omap_rproc_resume()
951 if (rproc->state == RPROC_OFFLINE) in omap_rproc_resume()
954 if (rproc->state != RPROC_SUSPENDED) { in omap_rproc_resume()
955 ret = -EBUSY; in omap_rproc_resume()
960 * remoteproc was auto-suspended at the time of system suspend, in omap_rproc_resume()
961 * so no need to wake-up the processor (leave it in suspended in omap_rproc_resume()
964 if (!oproc->need_resume) in omap_rproc_resume()
973 oproc->need_resume = false; in omap_rproc_resume()
974 rproc->state = RPROC_RUNNING; in omap_rproc_resume()
978 mutex_unlock(&rproc->lock); in omap_rproc_resume()
985 struct omap_rproc *oproc = rproc->priv; in omap_rproc_runtime_suspend()
988 mutex_lock(&rproc->lock); in omap_rproc_runtime_suspend()
989 if (rproc->state == RPROC_CRASHED) { in omap_rproc_runtime_suspend()
991 ret = -EBUSY; in omap_rproc_runtime_suspend()
995 if (WARN_ON(rproc->state != RPROC_RUNNING)) { in omap_rproc_runtime_suspend()
997 ret = -EBUSY; in omap_rproc_runtime_suspend()
1002 * do not even attempt suspend if the remote processor is not in omap_rproc_runtime_suspend()
1003 * idled for runtime auto-suspend in omap_rproc_runtime_suspend()
1006 ret = -EBUSY; in omap_rproc_runtime_suspend()
1014 rproc->state = RPROC_SUSPENDED; in omap_rproc_runtime_suspend()
1015 mutex_unlock(&rproc->lock); in omap_rproc_runtime_suspend()
1021 mutex_unlock(&rproc->lock); in omap_rproc_runtime_suspend()
1030 mutex_lock(&rproc->lock); in omap_rproc_runtime_resume()
1031 if (WARN_ON(rproc->state != RPROC_SUSPENDED)) { in omap_rproc_runtime_resume()
1033 rproc->state); in omap_rproc_runtime_resume()
1034 ret = -EBUSY; in omap_rproc_runtime_resume()
1044 rproc->state = RPROC_RUNNING; in omap_rproc_runtime_resume()
1046 mutex_unlock(&rproc->lock); in omap_rproc_runtime_resume()
1093 .compatible = "ti,omap4-dsp",
1097 .compatible = "ti,omap4-ipu",
1101 .compatible = "ti,omap5-dsp",
1105 .compatible = "ti,omap5-ipu",
1109 .compatible = "ti,dra7-dsp",
1113 .compatible = "ti,dra7-ipu",
1127 ret = of_property_read_string(pdev->dev.of_node, "firmware-name", in omap_rproc_get_firmware()
1138 struct device_node *np = pdev->dev.of_node; in omap_rproc_get_boot_data()
1139 struct omap_rproc *oproc = rproc->priv; in omap_rproc_get_boot_data()
1142 data = of_device_get_match_data(&pdev->dev); in omap_rproc_get_boot_data()
1144 return -ENODEV; in omap_rproc_get_boot_data()
1149 oproc->boot_data = devm_kzalloc(&pdev->dev, sizeof(*oproc->boot_data), in omap_rproc_get_boot_data()
1151 if (!oproc->boot_data) in omap_rproc_get_boot_data()
1152 return -ENOMEM; in omap_rproc_get_boot_data()
1154 oproc->boot_data->syscon = in omap_rproc_get_boot_data()
1156 if (IS_ERR(oproc->boot_data->syscon)) in omap_rproc_get_boot_data()
1157 return PTR_ERR(oproc->boot_data->syscon); in omap_rproc_get_boot_data()
1160 &oproc->boot_data->boot_reg)) { in omap_rproc_get_boot_data()
1161 dev_err(&pdev->dev, "couldn't get the boot register\n"); in omap_rproc_get_boot_data()
1162 return -EINVAL; in omap_rproc_get_boot_data()
1166 &oproc->boot_data->boot_reg_shift); in omap_rproc_get_boot_data()
1174 struct omap_rproc *oproc = rproc->priv; in omap_rproc_of_get_internal_memories()
1175 struct device *dev = &pdev->dev; in omap_rproc_of_get_internal_memories()
1183 return -ENODEV; in omap_rproc_of_get_internal_memories()
1185 if (!data->mems) in omap_rproc_of_get_internal_memories()
1188 num_mems = of_property_count_elems_of_size(dev->of_node, "reg", in omap_rproc_of_get_internal_memories()
1191 oproc->mem = devm_kcalloc(dev, num_mems, sizeof(*oproc->mem), in omap_rproc_of_get_internal_memories()
1193 if (!oproc->mem) in omap_rproc_of_get_internal_memories()
1194 return -ENOMEM; in omap_rproc_of_get_internal_memories()
1196 for (i = 0; data->mems[i].name; i++) { in omap_rproc_of_get_internal_memories()
1198 data->mems[i].name); in omap_rproc_of_get_internal_memories()
1201 data->mems[i].name); in omap_rproc_of_get_internal_memories()
1202 return -ENOMEM; in omap_rproc_of_get_internal_memories()
1204 oproc->mem[i].cpu_addr = devm_ioremap_resource(dev, res); in omap_rproc_of_get_internal_memories()
1205 if (IS_ERR(oproc->mem[i].cpu_addr)) { in omap_rproc_of_get_internal_memories()
1207 data->mems[i].name); in omap_rproc_of_get_internal_memories()
1208 return PTR_ERR(oproc->mem[i].cpu_addr); in omap_rproc_of_get_internal_memories()
1210 oproc->mem[i].bus_addr = res->start; in omap_rproc_of_get_internal_memories()
1211 oproc->mem[i].dev_addr = data->mems[i].dev_addr; in omap_rproc_of_get_internal_memories()
1212 oproc->mem[i].size = resource_size(res); in omap_rproc_of_get_internal_memories()
1215 data->mems[i].name, &oproc->mem[i].bus_addr, in omap_rproc_of_get_internal_memories()
1216 oproc->mem[i].size, oproc->mem[i].cpu_addr, in omap_rproc_of_get_internal_memories()
1217 oproc->mem[i].dev_addr); in omap_rproc_of_get_internal_memories()
1219 oproc->num_mems = num_mems; in omap_rproc_of_get_internal_memories()
1227 struct device_node *np = dev->of_node; in omap_rproc_count_wdog_timers()
1230 ret = of_count_phandle_with_args(np, "ti,watchdog-timers", NULL); in omap_rproc_count_wdog_timers()
1249 struct device_node *np = pdev->dev.of_node; in omap_rproc_of_get_timers()
1250 struct omap_rproc *oproc = rproc->priv; in omap_rproc_of_get_timers()
1251 struct device *dev = &pdev->dev; in omap_rproc_of_get_timers()
1258 oproc->num_timers = of_count_phandle_with_args(np, "ti,timers", NULL); in omap_rproc_of_get_timers()
1259 if (oproc->num_timers <= 0) { in omap_rproc_of_get_timers()
1261 oproc->num_timers); in omap_rproc_of_get_timers()
1262 oproc->num_timers = 0; in omap_rproc_of_get_timers()
1265 oproc->num_wd_timers = omap_rproc_count_wdog_timers(dev); in omap_rproc_of_get_timers()
1267 num_timers = oproc->num_timers + oproc->num_wd_timers; in omap_rproc_of_get_timers()
1269 oproc->timers = devm_kcalloc(dev, num_timers, in omap_rproc_of_get_timers()
1270 sizeof(*oproc->timers), in omap_rproc_of_get_timers()
1272 if (!oproc->timers) in omap_rproc_of_get_timers()
1273 return -ENOMEM; in omap_rproc_of_get_timers()
1276 oproc->num_timers, oproc->num_wd_timers); in omap_rproc_of_get_timers()
1291 struct device_node *np = pdev->dev.of_node; in omap_rproc_probe()
1299 dev_err(&pdev->dev, "only DT-based devices are supported\n"); in omap_rproc_probe()
1300 return -ENODEV; in omap_rproc_probe()
1303 reset = devm_reset_control_array_get_exclusive(&pdev->dev); in omap_rproc_probe()
1311 ret = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(32)); in omap_rproc_probe()
1313 dev_err(&pdev->dev, "dma_set_coherent_mask: %d\n", ret); in omap_rproc_probe()
1317 rproc = devm_rproc_alloc(&pdev->dev, dev_name(&pdev->dev), &omap_rproc_ops, in omap_rproc_probe()
1320 return -ENOMEM; in omap_rproc_probe()
1322 oproc = rproc->priv; in omap_rproc_probe()
1323 oproc->rproc = rproc; in omap_rproc_probe()
1324 oproc->reset = reset; in omap_rproc_probe()
1326 rproc->has_iommu = true; in omap_rproc_probe()
1331 * interfere with the core rproc->domain and we get the right DMA ops. in omap_rproc_probe()
1333 if (pdev->dev.archdata.mapping) { in omap_rproc_probe()
1334 struct dma_iommu_mapping *mapping = to_dma_iommu_mapping(&pdev->dev); in omap_rproc_probe()
1336 arm_iommu_detach_device(&pdev->dev); in omap_rproc_probe()
1353 init_completion(&oproc->pm_comp); in omap_rproc_probe()
1354 oproc->autosuspend_delay = DEFAULT_AUTOSUSPEND_DELAY; in omap_rproc_probe()
1356 of_property_read_u32(pdev->dev.of_node, "ti,autosuspend-delay-ms", in omap_rproc_probe()
1357 &oproc->autosuspend_delay); in omap_rproc_probe()
1359 pm_runtime_set_autosuspend_delay(&pdev->dev, oproc->autosuspend_delay); in omap_rproc_probe()
1361 oproc->fck = devm_clk_get(&pdev->dev, 0); in omap_rproc_probe()
1362 if (IS_ERR(oproc->fck)) in omap_rproc_probe()
1363 return PTR_ERR(oproc->fck); in omap_rproc_probe()
1365 ret = of_reserved_mem_device_init(&pdev->dev); in omap_rproc_probe()
1367 dev_warn(&pdev->dev, "device does not have specific CMA pool.\n"); in omap_rproc_probe()
1368 dev_warn(&pdev->dev, "Typically this should be provided,\n"); in omap_rproc_probe()
1369 dev_warn(&pdev->dev, "only omit if you know what you are doing.\n"); in omap_rproc_probe()
1371 ret = devm_add_action_or_reset(&pdev->dev, omap_rproc_mem_release, &pdev->dev); in omap_rproc_probe()
1377 ret = devm_rproc_add(&pdev->dev, rproc); in omap_rproc_probe()
1393 .name = "omap-rproc",