Lines Matching defs:pru
135 static inline u32 pru_control_read_reg(struct pru_rproc *pru, unsigned int reg)
137 return readl_relaxed(pru->mem_regions[PRU_IOMEM_CTRL].va + reg);
141 void pru_control_write_reg(struct pru_rproc *pru, unsigned int reg, u32 val)
143 writel_relaxed(val, pru->mem_regions[PRU_IOMEM_CTRL].va + reg);
147 void pru_control_set_reg(struct pru_rproc *pru, unsigned int reg,
153 spin_lock_irqsave(&pru->rmw_lock, flags);
155 val = pru_control_read_reg(pru, reg);
158 pru_control_write_reg(pru, reg, val);
160 spin_unlock_irqrestore(&pru->rmw_lock, flags);
172 struct pru_rproc *pru = rproc->priv;
175 fw_name = pru->fw_name;
230 struct pru_rproc *pru;
240 pru = rproc->priv;
243 mutex_lock(&pru->lock);
245 if (pru->client_np) {
246 mutex_unlock(&pru->lock);
251 pru->client_np = np;
254 mutex_unlock(&pru->lock);
257 *pru_id = pru->id;
259 ret = pruss_cfg_get_gpmux(pru->pruss, pru->id, &pru->gpmux_save);
269 ret = pruss_cfg_set_gpmux(pru->pruss, pru->id, mux);
307 struct pru_rproc *pru;
312 pru = rproc->priv;
314 pruss_cfg_set_gpmux(pru->pruss, pru->id, pru->gpmux_save);
318 mutex_lock(&pru->lock);
320 if (!pru->client_np) {
321 mutex_unlock(&pru->lock);
325 pru->client_np = NULL;
327 mutex_unlock(&pru->lock);
343 struct pru_rproc *pru = rproc->priv;
366 pru_control_set_reg(pru, reg, mask, set);
372 static inline u32 pru_debug_read_reg(struct pru_rproc *pru, unsigned int reg)
374 return readl_relaxed(pru->mem_regions[PRU_IOMEM_DEBUG].va + reg);
380 struct pru_rproc *pru = rproc->priv;
387 pru_control_read_reg(pru, PRU_CTRL_CTRL));
388 pru_sts = pru_control_read_reg(pru, PRU_CTRL_STS);
391 pru_control_read_reg(pru, PRU_CTRL_WAKEUP_EN));
393 pru_control_read_reg(pru, PRU_CTRL_CYCLE));
395 pru_control_read_reg(pru, PRU_CTRL_STALL));
397 pru_control_read_reg(pru, PRU_CTRL_CTBIR0));
399 pru_control_read_reg(pru, PRU_CTRL_CTBIR1));
401 pru_control_read_reg(pru, PRU_CTRL_CTPPR0));
403 pru_control_read_reg(pru, PRU_CTRL_CTPPR1));
406 pru_is_running = pru_control_read_reg(pru, PRU_CTRL_CTRL) &
415 i, pru_debug_read_reg(pru, PRU_DEBUG_GPREG(i)),
416 i, pru_debug_read_reg(pru, PRU_DEBUG_CT_REG(i)));
438 struct pru_rproc *pru = rproc->priv;
442 if (!val && !pru->dbg_single_step)
445 reg_val = pru_control_read_reg(pru, PRU_CTRL_CTRL);
447 if (val && !pru->dbg_single_step)
448 pru->dbg_continuous = reg_val;
453 reg_val = pru->dbg_continuous;
455 pru->dbg_single_step = val;
456 pru_control_write_reg(pru, PRU_CTRL_CTRL, reg_val);
464 struct pru_rproc *pru = rproc->priv;
466 *val = pru->dbg_single_step;
490 static void pru_dispose_irq_mapping(struct pru_rproc *pru)
492 if (!pru->mapped_irq)
495 while (pru->evt_count) {
496 pru->evt_count--;
497 if (pru->mapped_irq[pru->evt_count] > 0)
498 irq_dispose_mapping(pru->mapped_irq[pru->evt_count]);
501 kfree(pru->mapped_irq);
502 pru->mapped_irq = NULL;
512 struct pru_rproc *pru = rproc->priv;
513 struct pru_irq_rsc *rsc = pru->pru_interrupt_map;
532 pru->pru_interrupt_map_sz)
535 pru->evt_count = rsc->num_evts;
536 pru->mapped_irq = kcalloc(pru->evt_count, sizeof(unsigned int),
538 if (!pru->mapped_irq) {
539 pru->evt_count = 0;
549 parent = of_get_parent(dev_of_node(pru->dev));
551 kfree(pru->mapped_irq);
552 pru->mapped_irq = NULL;
553 pru->evt_count = 0;
560 kfree(pru->mapped_irq);
561 pru->mapped_irq = NULL;
562 pru->evt_count = 0;
568 for (i = 0; i < pru->evt_count; i++) {
576 pru->mapped_irq[i] = irq_create_fwspec_mapping(&fwspec);
577 if (!pru->mapped_irq[i]) {
590 pru_dispose_irq_mapping(pru);
599 struct pru_rproc *pru = rproc->priv;
605 names[pru->data->type], pru->id, (rproc->bootaddr >> 2));
609 * reset references to pru interrupt map - they will stop being valid
612 pru->pru_interrupt_map = NULL;
613 pru->pru_interrupt_map_sz = 0;
618 pru_control_write_reg(pru, PRU_CTRL_CTRL, val);
626 struct pru_rproc *pru = rproc->priv;
630 dev_dbg(dev, "stopping %s%d\n", names[pru->data->type], pru->id);
632 val = pru_control_read_reg(pru, PRU_CTRL_CTRL);
634 pru_control_write_reg(pru, PRU_CTRL_CTRL, val);
637 pru_dispose_irq_mapping(pru);
651 static void *pru_d_da_to_va(struct pru_rproc *pru, u32 da, size_t len)
654 struct pruss *pruss = pru->pruss;
664 if (pru->id == PRUSS_PRU1)
691 static void *pru_i_da_to_va(struct pru_rproc *pru, u32 da, size_t len)
717 if (da + len <= PRU_IRAM_DA + pru->mem_regions[PRU_IOMEM_IRAM].size) {
719 va = (__force void *)(pru->mem_regions[PRU_IOMEM_IRAM].va +
733 struct pru_rproc *pru = rproc->priv;
735 return pru_d_da_to_va(pru, da, len);
741 struct pru_rproc *pru = rproc->priv;
745 va = pru_i_da_to_va(pru, da, len);
747 va = pru_d_da_to_va(pru, da, len);
803 struct pru_rproc *pru = rproc->priv;
851 if (pru->data->is_k3) {
928 struct pru_rproc *pru = rproc->priv;
952 pru->pru_interrupt_map = (struct pru_irq_rsc *)(elf_data + sh_offset);
953 pru->pru_interrupt_map_sz = elf_shdr_get_sh_size(class, shdr);
962 static int pru_rproc_set_id(struct pru_rproc *pru)
966 switch (pru->mem_regions[PRU_IOMEM_IRAM].pa & PRU_IRAM_ADDR_MASK) {
972 pru->id = PRUSS_PRU0;
979 pru->id = PRUSS_PRU1;
993 struct pru_rproc *pru;
1012 sizeof(*pru));
1035 pru = rproc->priv;
1036 pru->dev = dev;
1037 pru->data = data;
1038 pru->pruss = platform_get_drvdata(ppdev);
1039 pru->rproc = rproc;
1040 pru->fw_name = fw_name;
1041 pru->client_np = NULL;
1042 spin_lock_init(&pru->rmw_lock);
1043 mutex_init(&pru->lock);
1048 pru->mem_regions[i].va = devm_ioremap_resource(dev, res);
1049 if (IS_ERR(pru->mem_regions[i].va)) {
1052 ret = PTR_ERR(pru->mem_regions[i].va);
1055 pru->mem_regions[i].pa = res->start;
1056 pru->mem_regions[i].size = resource_size(res);
1059 mem_names[i], &pru->mem_regions[i].pa,
1060 pru->mem_regions[i].size, pru->mem_regions[i].va);
1063 ret = pru_rproc_set_id(pru);
1069 ret = devm_rproc_add(dev, pru->rproc);
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 },
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 },
1119 { .compatible = "ti,am654-tx-pru", .data = &k3_tx_pru_data },
1120 { .compatible = "ti,j721e-pru", .data = &k3_pru_data },
1122 { .compatible = "ti,j721e-tx-pru", .data = &k3_tx_pru_data },
1123 { .compatible = "ti,am625-pru", .data = &k3_pru_data },