Lines Matching +full:am654 +full:- +full:tx +full:- +full:pru

1 // SPDX-License-Identifier: GPL-2.0-only
3 * PRU-ICSS remoteproc driver for various TI SoCs
5 * Copyright (C) 2014-2022 Texas Instruments Incorporated - https://www.ti.com/
8 * Suman Anna <s-anna@ti.com>
11 * Puranjay Mohan <p-mohan@ti.com>
41 /* CTRL register bit-fields */
53 /* PRU/RTU/Tx_PRU Core IRAM address masks */
62 /* PRU device addresses for various type of PRU RAMs */
71 * enum pru_iomem - PRU core memory/register range identifiers
73 * @PRU_IOMEM_IRAM: PRU Instruction RAM range
74 * @PRU_IOMEM_CTRL: PRU Control register range
75 * @PRU_IOMEM_DEBUG: PRU Debug register range
86 * struct pru_private_data - device data for a PRU core
87 * @type: type of the PRU core (PRU, RTU, Tx_PRU)
96 * struct pru_rproc - PRU remoteproc structure
97 * @id: id of the PRU core within the PRUSS
98 * @dev: PRU core device pointer
99 * @pruss: back-reference to parent PRUSS structure
100 * @rproc: remoteproc pointer for this PRU core
101 * @data: PRU core specific data
102 * @mem_regions: data for each of the PRU memory regions
110 * @dbg_single_step: debug state variable to set PRU into single step mode
111 * @dbg_continuous: debug state variable to restore PRU execution mode
135 static inline u32 pru_control_read_reg(struct pru_rproc *pru, unsigned int reg) in pru_control_read_reg() argument
137 return readl_relaxed(pru->mem_regions[PRU_IOMEM_CTRL].va + reg); in pru_control_read_reg()
141 void pru_control_write_reg(struct pru_rproc *pru, unsigned int reg, u32 val) in pru_control_write_reg() argument
143 writel_relaxed(val, pru->mem_regions[PRU_IOMEM_CTRL].va + reg); in pru_control_write_reg()
147 void pru_control_set_reg(struct pru_rproc *pru, unsigned int reg, in pru_control_set_reg() argument
153 spin_lock_irqsave(&pru->rmw_lock, flags); in pru_control_set_reg()
155 val = pru_control_read_reg(pru, reg); in pru_control_set_reg()
158 pru_control_write_reg(pru, reg, val); in pru_control_set_reg()
160 spin_unlock_irqrestore(&pru->rmw_lock, flags); in pru_control_set_reg()
164 * pru_rproc_set_firmware() - set firmware for a PRU core
165 * @rproc: the rproc instance of the PRU
172 struct pru_rproc *pru = rproc->priv; in pru_rproc_set_firmware() local
175 fw_name = pru->fw_name; in pru_rproc_set_firmware()
192 ret = -EPROBE_DEFER; in __pru_rproc_get()
196 /* make sure it is PRU rproc */ in __pru_rproc_get()
197 if (!is_pru_rproc(rproc->dev.parent)) { in __pru_rproc_get()
199 return ERR_PTR(-ENODEV); in __pru_rproc_get()
206 * pru_rproc_get() - get the PRU rproc instance from a device node
209 * @pru_id: optional pointer to return the PRU remoteproc processor id
212 * index @index and returns the rproc handle for a valid PRU remote processor if
213 * found. The function allows only one user to own the PRU rproc resource at a
217 * When optional @pru_id pointer is passed the PRU remoteproc processor id is
222 * -ENODEV if device is not found
223 * -EBUSY if PRU is already acquired by anyone
224 * -EPROBE_DEFER is PRU device is not probed yet
230 struct pru_rproc *pru; in pru_rproc_get() local
240 pru = rproc->priv; in pru_rproc_get()
241 dev = &rproc->dev; in pru_rproc_get()
243 mutex_lock(&pru->lock); in pru_rproc_get()
245 if (pru->client_np) { in pru_rproc_get()
246 mutex_unlock(&pru->lock); in pru_rproc_get()
247 ret = -EBUSY; in pru_rproc_get()
251 pru->client_np = np; in pru_rproc_get()
252 rproc->sysfs_read_only = true; in pru_rproc_get()
254 mutex_unlock(&pru->lock); in pru_rproc_get()
257 *pru_id = pru->id; in pru_rproc_get()
259 ret = pruss_cfg_get_gpmux(pru->pruss, pru->id, &pru->gpmux_save); in pru_rproc_get()
266 ret = of_property_read_u32_index(np, "ti,pruss-gp-mux-sel", index, in pru_rproc_get()
269 ret = pruss_cfg_set_gpmux(pru->pruss, pru->id, mux); in pru_rproc_get()
276 ret = of_property_read_string_index(np, "firmware-name", index, in pru_rproc_get()
299 * pru_rproc_put() - release the PRU rproc resource
302 * Releases the PRU rproc resource and makes it available to other
307 struct pru_rproc *pru; in pru_rproc_put() local
309 if (IS_ERR_OR_NULL(rproc) || !is_pru_rproc(rproc->dev.parent)) in pru_rproc_put()
312 pru = rproc->priv; in pru_rproc_put()
314 pruss_cfg_set_gpmux(pru->pruss, pru->id, pru->gpmux_save); in pru_rproc_put()
318 mutex_lock(&pru->lock); in pru_rproc_put()
320 if (!pru->client_np) { in pru_rproc_put()
321 mutex_unlock(&pru->lock); in pru_rproc_put()
325 pru->client_np = NULL; in pru_rproc_put()
326 rproc->sysfs_read_only = false; in pru_rproc_put()
327 mutex_unlock(&pru->lock); in pru_rproc_put()
334 * pru_rproc_set_ctable() - set the constant table index for the PRU
335 * @rproc: the rproc instance of the PRU
343 struct pru_rproc *pru = rproc->priv; in pru_rproc_set_ctable() local
350 return -EINVAL; in pru_rproc_set_ctable()
352 if (!rproc->dev.parent || !is_pru_rproc(rproc->dev.parent)) in pru_rproc_set_ctable()
353 return -ENODEV; in pru_rproc_set_ctable()
355 /* pointer is 16 bit and index is 8-bit so mask out the rest */ in pru_rproc_set_ctable()
366 pru_control_set_reg(pru, reg, mask, set); in pru_rproc_set_ctable()
372 static inline u32 pru_debug_read_reg(struct pru_rproc *pru, unsigned int reg) in pru_debug_read_reg() argument
374 return readl_relaxed(pru->mem_regions[PRU_IOMEM_DEBUG].va + reg); in pru_debug_read_reg()
379 struct rproc *rproc = s->private; in regs_show()
380 struct pru_rproc *pru = rproc->priv; in regs_show() local
387 pru_control_read_reg(pru, PRU_CTRL_CTRL)); in regs_show()
388 pru_sts = pru_control_read_reg(pru, PRU_CTRL_STS); in regs_show()
391 pru_control_read_reg(pru, PRU_CTRL_WAKEUP_EN)); in regs_show()
393 pru_control_read_reg(pru, PRU_CTRL_CYCLE)); in regs_show()
395 pru_control_read_reg(pru, PRU_CTRL_STALL)); in regs_show()
397 pru_control_read_reg(pru, PRU_CTRL_CTBIR0)); in regs_show()
399 pru_control_read_reg(pru, PRU_CTRL_CTBIR1)); in regs_show()
401 pru_control_read_reg(pru, PRU_CTRL_CTPPR0)); in regs_show()
403 pru_control_read_reg(pru, PRU_CTRL_CTPPR1)); in regs_show()
406 pru_is_running = pru_control_read_reg(pru, PRU_CTRL_CTRL) & in regs_show()
409 seq_puts(s, "PRU is executing, cannot print/access debug registers.\n"); in regs_show()
414 seq_printf(s, "GPREG%-2d := 0x%08x\tCT_REG%-2d := 0x%08x\n", in regs_show()
415 i, pru_debug_read_reg(pru, PRU_DEBUG_GPREG(i)), in regs_show()
416 i, pru_debug_read_reg(pru, PRU_DEBUG_CT_REG(i))); in regs_show()
424 * Control PRU single-step mode
426 * This is a debug helper function used for controlling the single-step
427 * mode of the PRU. The PRU Debug registers are not accessible when the
428 * PRU is in RUNNING state.
430 * Writing a non-zero value sets the PRU into single-step mode irrespective
431 * of its previous state. The PRU mode is saved only on the first set into
432 * a single-step mode. Writing a zero value will restore the PRU into its
438 struct pru_rproc *pru = rproc->priv; in pru_rproc_debug_ss_set() local
442 if (!val && !pru->dbg_single_step) in pru_rproc_debug_ss_set()
445 reg_val = pru_control_read_reg(pru, PRU_CTRL_CTRL); in pru_rproc_debug_ss_set()
447 if (val && !pru->dbg_single_step) in pru_rproc_debug_ss_set()
448 pru->dbg_continuous = reg_val; in pru_rproc_debug_ss_set()
453 reg_val = pru->dbg_continuous; in pru_rproc_debug_ss_set()
455 pru->dbg_single_step = val; in pru_rproc_debug_ss_set()
456 pru_control_write_reg(pru, PRU_CTRL_CTRL, reg_val); in pru_rproc_debug_ss_set()
464 struct pru_rproc *pru = rproc->priv; in pru_rproc_debug_ss_get() local
466 *val = pru->dbg_single_step; in pru_rproc_debug_ss_get()
474 * Create PRU-specific debugfs entries
481 if (!rproc->dbg_dir) in pru_rproc_create_debug_entries()
484 debugfs_create_file("regs", 0400, rproc->dbg_dir, in pru_rproc_create_debug_entries()
486 debugfs_create_file("single_step", 0600, rproc->dbg_dir, in pru_rproc_create_debug_entries()
490 static void pru_dispose_irq_mapping(struct pru_rproc *pru) in pru_dispose_irq_mapping() argument
492 if (!pru->mapped_irq) in pru_dispose_irq_mapping()
495 while (pru->evt_count) { in pru_dispose_irq_mapping()
496 pru->evt_count--; in pru_dispose_irq_mapping()
497 if (pru->mapped_irq[pru->evt_count] > 0) in pru_dispose_irq_mapping()
498 irq_dispose_mapping(pru->mapped_irq[pru->evt_count]); in pru_dispose_irq_mapping()
501 kfree(pru->mapped_irq); in pru_dispose_irq_mapping()
502 pru->mapped_irq = NULL; in pru_dispose_irq_mapping()
506 * Parse the custom PRU interrupt map resource and configure the INTC
511 struct device *dev = rproc->dev.parent; in pru_handle_intrmap()
512 struct pru_rproc *pru = rproc->priv; in pru_handle_intrmap() local
513 struct pru_irq_rsc *rsc = pru->pru_interrupt_map; in pru_handle_intrmap()
523 if (rsc->type != 0) { in pru_handle_intrmap()
524 dev_err(dev, "unsupported rsc type: %d\n", rsc->type); in pru_handle_intrmap()
525 return -EINVAL; in pru_handle_intrmap()
528 if (rsc->num_evts > MAX_PRU_SYS_EVENTS) in pru_handle_intrmap()
529 return -EINVAL; in pru_handle_intrmap()
531 if (sizeof(*rsc) + rsc->num_evts * sizeof(struct pruss_int_map) != in pru_handle_intrmap()
532 pru->pru_interrupt_map_sz) in pru_handle_intrmap()
533 return -EINVAL; in pru_handle_intrmap()
535 pru->evt_count = rsc->num_evts; in pru_handle_intrmap()
536 pru->mapped_irq = kcalloc(pru->evt_count, sizeof(unsigned int), in pru_handle_intrmap()
538 if (!pru->mapped_irq) { in pru_handle_intrmap()
539 pru->evt_count = 0; in pru_handle_intrmap()
540 return -ENOMEM; in pru_handle_intrmap()
545 * channel-to-host mapping. The interrupt controller to be used in pru_handle_intrmap()
546 * for these mappings for a given PRU remoteproc is always its in pru_handle_intrmap()
549 parent = of_get_parent(dev_of_node(pru->dev)); in pru_handle_intrmap()
551 kfree(pru->mapped_irq); in pru_handle_intrmap()
552 pru->mapped_irq = NULL; in pru_handle_intrmap()
553 pru->evt_count = 0; in pru_handle_intrmap()
554 return -ENODEV; in pru_handle_intrmap()
557 irq_parent = of_get_child_by_name(parent, "interrupt-controller"); in pru_handle_intrmap()
560 kfree(pru->mapped_irq); in pru_handle_intrmap()
561 pru->mapped_irq = NULL; in pru_handle_intrmap()
562 pru->evt_count = 0; in pru_handle_intrmap()
563 return -ENODEV; in pru_handle_intrmap()
568 for (i = 0; i < pru->evt_count; i++) { in pru_handle_intrmap()
569 fwspec.param[0] = rsc->pru_intc_map[i].event; in pru_handle_intrmap()
570 fwspec.param[1] = rsc->pru_intc_map[i].chnl; in pru_handle_intrmap()
571 fwspec.param[2] = rsc->pru_intc_map[i].host; in pru_handle_intrmap()
576 pru->mapped_irq[i] = irq_create_fwspec_mapping(&fwspec); in pru_handle_intrmap()
577 if (!pru->mapped_irq[i]) { in pru_handle_intrmap()
581 ret = -EINVAL; in pru_handle_intrmap()
590 pru_dispose_irq_mapping(pru); in pru_handle_intrmap()
598 struct device *dev = &rproc->dev; in pru_rproc_start()
599 struct pru_rproc *pru = rproc->priv; in pru_rproc_start() local
600 const char *names[PRU_TYPE_MAX] = { "PRU", "RTU", "Tx_PRU" }; in pru_rproc_start()
604 dev_dbg(dev, "starting %s%d: entry-point = 0x%llx\n", in pru_rproc_start()
605 names[pru->data->type], pru->id, (rproc->bootaddr >> 2)); in pru_rproc_start()
609 * reset references to pru interrupt map - they will stop being valid in pru_rproc_start()
612 pru->pru_interrupt_map = NULL; in pru_rproc_start()
613 pru->pru_interrupt_map_sz = 0; in pru_rproc_start()
617 val = CTRL_CTRL_EN | ((rproc->bootaddr >> 2) << 16); in pru_rproc_start()
618 pru_control_write_reg(pru, PRU_CTRL_CTRL, val); in pru_rproc_start()
625 struct device *dev = &rproc->dev; in pru_rproc_stop()
626 struct pru_rproc *pru = rproc->priv; in pru_rproc_stop() local
627 const char *names[PRU_TYPE_MAX] = { "PRU", "RTU", "Tx_PRU" }; in pru_rproc_stop()
630 dev_dbg(dev, "stopping %s%d\n", names[pru->data->type], pru->id); in pru_rproc_stop()
632 val = pru_control_read_reg(pru, PRU_CTRL_CTRL); in pru_rproc_stop()
634 pru_control_write_reg(pru, PRU_CTRL_CTRL, val); in pru_rproc_stop()
636 /* dispose irq mapping - new firmware can provide new mapping */ in pru_rproc_stop()
637 pru_dispose_irq_mapping(pru); in pru_rproc_stop()
643 * Convert PRU device address (data spaces only) to kernel virtual address.
645 * Each PRU has access to all data memories within the PRUSS, accessible at
647 * RAMs as well as any shared Data RAM to convert a PRU device address to
651 static void *pru_d_da_to_va(struct pru_rproc *pru, u32 da, size_t len) in pru_d_da_to_va() argument
654 struct pruss *pruss = pru->pruss; in pru_d_da_to_va()
661 dram0 = pruss->mem_regions[PRUSS_MEM_DRAM0]; in pru_d_da_to_va()
662 dram1 = pruss->mem_regions[PRUSS_MEM_DRAM1]; in pru_d_da_to_va()
664 if (pru->id == PRUSS_PRU1) in pru_d_da_to_va()
666 shrd_ram = pruss->mem_regions[PRUSS_MEM_SHRD_RAM2]; in pru_d_da_to_va()
669 offset = da - PRU_PDRAM_DA; in pru_d_da_to_va()
673 offset = da - PRU_SDRAM_DA; in pru_d_da_to_va()
677 offset = da - PRU_SHRDRAM_DA; in pru_d_da_to_va()
685 * Convert PRU device address (instruction space) to kernel virtual address.
687 * A PRU does not have an unified address space. Each PRU has its very own
691 static void *pru_i_da_to_va(struct pru_rproc *pru, u32 da, size_t len) in pru_i_da_to_va() argument
707 * bits anyway. PRU architecture limits the program counter to 16-bit in pru_i_da_to_va()
708 * word-address range. This in turn corresponds to 18-bit IRAM in pru_i_da_to_va()
709 * byte-address range for ELF. in pru_i_da_to_va()
711 * Two more bits are added just in case to make the final 20-bit mask. in pru_i_da_to_va()
717 if (da + len <= PRU_IRAM_DA + pru->mem_regions[PRU_IOMEM_IRAM].size) { in pru_i_da_to_va()
718 offset = da - PRU_IRAM_DA; in pru_i_da_to_va()
719 va = (__force void *)(pru->mem_regions[PRU_IOMEM_IRAM].va + in pru_i_da_to_va()
727 * Provide address translations for only PRU Data RAMs through the remoteproc
728 * core for any PRU client drivers. The PRU Instruction RAM access is restricted
729 * only to the PRU loader code.
733 struct pru_rproc *pru = rproc->priv; in pru_rproc_da_to_va() local
735 return pru_d_da_to_va(pru, da, len); in pru_rproc_da_to_va()
738 /* PRU-specific address translator used by PRU loader. */
741 struct pru_rproc *pru = rproc->priv; in pru_da_to_va() local
745 va = pru_i_da_to_va(pru, da, len); in pru_da_to_va()
747 va = pru_d_da_to_va(pru, da, len); in pru_da_to_va()
759 * Custom memory copy implementation for ICSSG PRU/RTU/Tx_PRU Cores
761 * The ICSSG PRU/RTU/Tx_PRU cores have a memory copying issue with IRAM
763 * properly in the IRAM memories only for integer (4-byte) copies. Any unaligned
764 * copies result in all the other pre-existing bytes zeroed out within that
765 * 4-byte boundary, thereby resulting in wrong text/code in the IRAMs. Also, the
766 * IRAM memory port interface does not allow any 8-byte copies (as commonly used
778 * TODO: relax limitation of 4-byte aligned dest addresses and copy in pru_rproc_memcpy()
782 return -EINVAL; in pru_rproc_memcpy()
784 /* src offsets in ELF firmware image can be non-aligned */ in pru_rproc_memcpy()
788 return -ENOMEM; in pru_rproc_memcpy()
792 while (size--) in pru_rproc_memcpy()
803 struct pru_rproc *pru = rproc->priv; in pru_rproc_load_elf_segments() local
804 struct device *dev = &rproc->dev; in pru_rproc_load_elf_segments()
808 const u8 *elf_data = fw->data; in pru_rproc_load_elf_segments()
811 phdr = (struct elf32_phdr *)(elf_data + ehdr->e_phoff); in pru_rproc_load_elf_segments()
814 for (i = 0; i < ehdr->e_phnum; i++, phdr++) { in pru_rproc_load_elf_segments()
815 u32 da = phdr->p_paddr; in pru_rproc_load_elf_segments()
816 u32 memsz = phdr->p_memsz; in pru_rproc_load_elf_segments()
817 u32 filesz = phdr->p_filesz; in pru_rproc_load_elf_segments()
818 u32 offset = phdr->p_offset; in pru_rproc_load_elf_segments()
822 if (phdr->p_type != PT_LOAD || !filesz) in pru_rproc_load_elf_segments()
826 phdr->p_type, da, memsz, filesz); in pru_rproc_load_elf_segments()
831 ret = -EINVAL; in pru_rproc_load_elf_segments()
835 if (offset + filesz > fw->size) { in pru_rproc_load_elf_segments()
837 offset + filesz, fw->size); in pru_rproc_load_elf_segments()
838 ret = -EINVAL; in pru_rproc_load_elf_segments()
843 is_iram = phdr->p_flags & PF_X; in pru_rproc_load_elf_segments()
847 ret = -EINVAL; in pru_rproc_load_elf_segments()
851 if (pru->data->is_k3) { in pru_rproc_load_elf_segments()
852 ret = pru_rproc_memcpy(ptr, elf_data + phdr->p_offset, in pru_rproc_load_elf_segments()
855 dev_err(dev, "PRU memory copy failed for da 0x%x memsz 0x%x\n", in pru_rproc_load_elf_segments()
860 memcpy(ptr, elf_data + phdr->p_offset, filesz); in pru_rproc_load_elf_segments()
874 const u8 *elf_data = fw->data; in pru_rproc_find_interrupt_map()
876 u16 shnum = ehdr->e_shnum; in pru_rproc_find_interrupt_map()
877 u16 shstrndx = ehdr->e_shstrndx; in pru_rproc_find_interrupt_map()
881 shdr = (struct elf32_shdr *)(elf_data + ehdr->e_shoff); in pru_rproc_find_interrupt_map()
885 name_table = elf_data + name_table_shdr->sh_offset; in pru_rproc_find_interrupt_map()
888 u32 size = shdr->sh_size; in pru_rproc_find_interrupt_map()
889 u32 offset = shdr->sh_offset; in pru_rproc_find_interrupt_map()
890 u32 name = shdr->sh_name; in pru_rproc_find_interrupt_map()
896 if (offset + size > fw->size || offset + size < size) { in pru_rproc_find_interrupt_map()
898 return ERR_PTR(-EINVAL); in pru_rproc_find_interrupt_map()
903 dev_err(dev, "header-less .pru_irq_map section\n"); in pru_rproc_find_interrupt_map()
904 return ERR_PTR(-EINVAL); in pru_rproc_find_interrupt_map()
916 * Use a custom parse_fw callback function for dealing with PRU firmware
921 * description, which needs to be setup before powering on the PRU core. To
923 * firmware linker) and therefore is not loaded to PRU memory.
927 struct device *dev = &rproc->dev; in pru_rproc_parse_fw()
928 struct pru_rproc *pru = rproc->priv; in pru_rproc_parse_fw() local
929 const u8 *elf_data = fw->data; in pru_rproc_parse_fw()
937 if (ret == -EINVAL) in pru_rproc_parse_fw()
938 dev_dbg(&rproc->dev, "no resource table found for this fw\n"); in pru_rproc_parse_fw()
950 /* preserve pointer to PRU interrupt map together with it size */ in pru_rproc_parse_fw()
952 pru->pru_interrupt_map = (struct pru_irq_rsc *)(elf_data + sh_offset); in pru_rproc_parse_fw()
953 pru->pru_interrupt_map_sz = elf_shdr_get_sh_size(class, shdr); in pru_rproc_parse_fw()
959 * Compute PRU id based on the IRAM addresses. The PRU IRAMs are
962 static int pru_rproc_set_id(struct pru_rproc *pru) in pru_rproc_set_id() argument
966 switch (pru->mem_regions[PRU_IOMEM_IRAM].pa & PRU_IRAM_ADDR_MASK) { in pru_rproc_set_id()
972 pru->id = PRUSS_PRU0; in pru_rproc_set_id()
979 pru->id = PRUSS_PRU1; in pru_rproc_set_id()
982 ret = -EINVAL; in pru_rproc_set_id()
990 struct device *dev = &pdev->dev; in pru_rproc_probe()
991 struct device_node *np = dev->of_node; in pru_rproc_probe()
992 struct platform_device *ppdev = to_platform_device(dev->parent); in pru_rproc_probe()
993 struct pru_rproc *pru; in pru_rproc_probe() local
1001 data = of_device_get_match_data(&pdev->dev); in pru_rproc_probe()
1003 return -ENODEV; in pru_rproc_probe()
1005 ret = of_property_read_string(np, "firmware-name", &fw_name); in pru_rproc_probe()
1007 dev_err(dev, "unable to retrieve firmware-name %d\n", ret); in pru_rproc_probe()
1011 rproc = devm_rproc_alloc(dev, pdev->name, &pru_rproc_ops, fw_name, in pru_rproc_probe()
1012 sizeof(*pru)); in pru_rproc_probe()
1015 return -ENOMEM; in pru_rproc_probe()
1017 /* use a custom load function to deal with PRU-specific quirks */ in pru_rproc_probe()
1018 rproc->ops->load = pru_rproc_load_elf_segments; in pru_rproc_probe()
1020 /* use a custom parse function to deal with PRU-specific resources */ in pru_rproc_probe()
1021 rproc->ops->parse_fw = pru_rproc_parse_fw; in pru_rproc_probe()
1024 rproc->recovery_disabled = true; in pru_rproc_probe()
1027 * rproc_add will auto-boot the processor normally, but this is not in pru_rproc_probe()
1028 * desired with PRU client driven boot-flow methodology. A PRU in pru_rproc_probe()
1029 * application/client driver will boot the corresponding PRU in pru_rproc_probe()
1030 * remote-processor as part of its state machine either through the in pru_rproc_probe()
1033 rproc->auto_boot = false; in pru_rproc_probe()
1035 pru = rproc->priv; in pru_rproc_probe()
1036 pru->dev = dev; in pru_rproc_probe()
1037 pru->data = data; in pru_rproc_probe()
1038 pru->pruss = platform_get_drvdata(ppdev); in pru_rproc_probe()
1039 pru->rproc = rproc; in pru_rproc_probe()
1040 pru->fw_name = fw_name; in pru_rproc_probe()
1041 pru->client_np = NULL; in pru_rproc_probe()
1042 spin_lock_init(&pru->rmw_lock); in pru_rproc_probe()
1043 mutex_init(&pru->lock); in pru_rproc_probe()
1048 pru->mem_regions[i].va = devm_ioremap_resource(dev, res); in pru_rproc_probe()
1049 if (IS_ERR(pru->mem_regions[i].va)) { in pru_rproc_probe()
1052 ret = PTR_ERR(pru->mem_regions[i].va); in pru_rproc_probe()
1055 pru->mem_regions[i].pa = res->start; in pru_rproc_probe()
1056 pru->mem_regions[i].size = resource_size(res); in pru_rproc_probe()
1059 mem_names[i], &pru->mem_regions[i].pa, in pru_rproc_probe()
1060 pru->mem_regions[i].size, pru->mem_regions[i].va); in pru_rproc_probe()
1063 ret = pru_rproc_set_id(pru); in pru_rproc_probe()
1069 ret = devm_rproc_add(dev, pru->rproc); in pru_rproc_probe()
1077 dev_dbg(dev, "PRU rproc node %pOF probed successfully\n", np); in pru_rproc_probe()
1084 struct device *dev = &pdev->dev; in pru_rproc_remove()
1087 dev_dbg(dev, "%s: removing rproc %s\n", __func__, rproc->name); in pru_rproc_remove()
1110 { .compatible = "ti,am3356-pru", .data = &pru_data },
1111 { .compatible = "ti,am4376-pru", .data = &pru_data },
1112 { .compatible = "ti,am5728-pru", .data = &pru_data },
1113 { .compatible = "ti,am642-pru", .data = &k3_pru_data },
1114 { .compatible = "ti,am642-rtu", .data = &k3_rtu_data },
1115 { .compatible = "ti,am642-tx-pru", .data = &k3_tx_pru_data },
1116 { .compatible = "ti,k2g-pru", .data = &pru_data },
1117 { .compatible = "ti,am654-pru", .data = &k3_pru_data },
1118 { .compatible = "ti,am654-rtu", .data = &k3_rtu_data },
1119 { .compatible = "ti,am654-tx-pru", .data = &k3_tx_pru_data },
1120 { .compatible = "ti,j721e-pru", .data = &k3_pru_data },
1121 { .compatible = "ti,j721e-rtu", .data = &k3_rtu_data },
1122 { .compatible = "ti,j721e-tx-pru", .data = &k3_tx_pru_data },
1123 { .compatible = "ti,am625-pru", .data = &k3_pru_data },
1139 MODULE_AUTHOR("Suman Anna <s-anna@ti.com>");
1142 MODULE_AUTHOR("Puranjay Mohan <p-mohan@ti.com>");
1144 MODULE_DESCRIPTION("PRU-ICSS Remote Processor Driver");