Lines Matching refs:sdma

249 	struct sdma_engine		*sdma;  member
464 static inline u32 chnenbl_ofs(struct sdma_engine *sdma, unsigned int event) in chnenbl_ofs() argument
466 u32 chnenbl0 = sdma->drvdata->chnenbl0; in chnenbl_ofs()
473 struct sdma_engine *sdma = sdmac->sdma; in sdma_config_ownership() local
480 evt = readl_relaxed(sdma->regs + SDMA_H_EVTOVR); in sdma_config_ownership()
481 mcu = readl_relaxed(sdma->regs + SDMA_H_HOSTOVR); in sdma_config_ownership()
482 dsp = readl_relaxed(sdma->regs + SDMA_H_DSPOVR); in sdma_config_ownership()
499 writel_relaxed(evt, sdma->regs + SDMA_H_EVTOVR); in sdma_config_ownership()
500 writel_relaxed(mcu, sdma->regs + SDMA_H_HOSTOVR); in sdma_config_ownership()
501 writel_relaxed(dsp, sdma->regs + SDMA_H_DSPOVR); in sdma_config_ownership()
506 static void sdma_enable_channel(struct sdma_engine *sdma, int channel) in sdma_enable_channel() argument
508 writel(BIT(channel), sdma->regs + SDMA_H_START); in sdma_enable_channel()
514 static int sdma_run_channel0(struct sdma_engine *sdma) in sdma_run_channel0() argument
519 sdma_enable_channel(sdma, 0); in sdma_run_channel0()
521 while (!(ret = readl_relaxed(sdma->regs + SDMA_H_INTR) & 1)) { in sdma_run_channel0()
529 writel_relaxed(ret, sdma->regs + SDMA_H_INTR); in sdma_run_channel0()
531 dev_err(sdma->dev, "Timeout waiting for CH0 ready\n"); in sdma_run_channel0()
535 if (readl(sdma->regs + SDMA_H_CONFIG) == 0) in sdma_run_channel0()
536 writel_relaxed(SDMA_H_CONFIG_CSM, sdma->regs + SDMA_H_CONFIG); in sdma_run_channel0()
541 static int sdma_load_script(struct sdma_engine *sdma, void *buf, int size, in sdma_load_script() argument
544 struct sdma_buffer_descriptor *bd0 = sdma->channel[0].bd; in sdma_load_script()
557 spin_lock_irqsave(&sdma->channel_0_lock, flags); in sdma_load_script()
567 ret = sdma_run_channel0(sdma); in sdma_load_script()
569 spin_unlock_irqrestore(&sdma->channel_0_lock, flags); in sdma_load_script()
578 struct sdma_engine *sdma = sdmac->sdma; in sdma_event_enable() local
581 u32 chnenbl = chnenbl_ofs(sdma, event); in sdma_event_enable()
583 val = readl_relaxed(sdma->regs + chnenbl); in sdma_event_enable()
585 writel_relaxed(val, sdma->regs + chnenbl); in sdma_event_enable()
590 struct sdma_engine *sdma = sdmac->sdma; in sdma_event_disable() local
592 u32 chnenbl = chnenbl_ofs(sdma, event); in sdma_event_disable()
595 val = readl_relaxed(sdma->regs + chnenbl); in sdma_event_disable()
597 writel_relaxed(val, sdma->regs + chnenbl); in sdma_event_disable()
669 struct sdma_engine *sdma = dev_id; in sdma_int_handler() local
672 stat = readl_relaxed(sdma->regs + SDMA_H_INTR); in sdma_int_handler()
675 writel_relaxed(stat, sdma->regs + SDMA_H_INTR); in sdma_int_handler()
679 struct sdma_channel *sdmac = &sdma->channel[channel]; in sdma_int_handler()
698 struct sdma_engine *sdma = sdmac->sdma; in sdma_get_pc() local
711 emi_2_emi = sdma->script_addrs->ap_2_ap_addr; in sdma_get_pc()
714 emi_2_per = sdma->script_addrs->bp_2_ap_addr; in sdma_get_pc()
715 per_2_emi = sdma->script_addrs->ap_2_bp_addr; in sdma_get_pc()
718 per_2_emi = sdma->script_addrs->firi_2_mcu_addr; in sdma_get_pc()
719 emi_2_per = sdma->script_addrs->mcu_2_firi_addr; in sdma_get_pc()
722 per_2_emi = sdma->script_addrs->uart_2_mcu_addr; in sdma_get_pc()
723 emi_2_per = sdma->script_addrs->mcu_2_app_addr; in sdma_get_pc()
726 per_2_emi = sdma->script_addrs->uartsh_2_mcu_addr; in sdma_get_pc()
727 emi_2_per = sdma->script_addrs->mcu_2_shp_addr; in sdma_get_pc()
730 per_2_emi = sdma->script_addrs->ata_2_mcu_addr; in sdma_get_pc()
731 emi_2_per = sdma->script_addrs->mcu_2_ata_addr; in sdma_get_pc()
737 per_2_emi = sdma->script_addrs->app_2_mcu_addr; in sdma_get_pc()
738 emi_2_per = sdma->script_addrs->mcu_2_app_addr; in sdma_get_pc()
741 per_2_emi = sdma->script_addrs->ssish_2_mcu_addr; in sdma_get_pc()
742 emi_2_per = sdma->script_addrs->mcu_2_ssish_addr; in sdma_get_pc()
750 per_2_emi = sdma->script_addrs->shp_2_mcu_addr; in sdma_get_pc()
751 emi_2_per = sdma->script_addrs->mcu_2_shp_addr; in sdma_get_pc()
754 per_2_emi = sdma->script_addrs->asrc_2_mcu_addr; in sdma_get_pc()
755 emi_2_per = sdma->script_addrs->asrc_2_mcu_addr; in sdma_get_pc()
756 per_2_per = sdma->script_addrs->per_2_per_addr; in sdma_get_pc()
759 per_2_emi = sdma->script_addrs->shp_2_mcu_addr; in sdma_get_pc()
760 emi_2_per = sdma->script_addrs->mcu_2_shp_addr; in sdma_get_pc()
761 per_2_per = sdma->script_addrs->per_2_per_addr; in sdma_get_pc()
764 per_2_emi = sdma->script_addrs->mshc_2_mcu_addr; in sdma_get_pc()
765 emi_2_per = sdma->script_addrs->mcu_2_mshc_addr; in sdma_get_pc()
768 per_2_emi = sdma->script_addrs->dptc_dvfs_addr; in sdma_get_pc()
771 per_2_emi = sdma->script_addrs->spdif_2_mcu_addr; in sdma_get_pc()
772 emi_2_per = sdma->script_addrs->mcu_2_spdif_addr; in sdma_get_pc()
775 emi_2_per = sdma->script_addrs->ext_mem_2_ipu_addr; in sdma_get_pc()
787 struct sdma_engine *sdma = sdmac->sdma; in sdma_load_context() local
790 struct sdma_context_data *context = sdma->context; in sdma_load_context()
791 struct sdma_buffer_descriptor *bd0 = sdma->channel[0].bd; in sdma_load_context()
804 dev_dbg(sdma->dev, "load_address = %d\n", load_address); in sdma_load_context()
805 dev_dbg(sdma->dev, "wml = 0x%08x\n", (u32)sdmac->watermark_level); in sdma_load_context()
806 dev_dbg(sdma->dev, "shp_addr = 0x%08x\n", sdmac->shp_addr); in sdma_load_context()
807 dev_dbg(sdma->dev, "per_addr = 0x%08x\n", sdmac->per_addr); in sdma_load_context()
808 dev_dbg(sdma->dev, "event_mask0 = 0x%08x\n", (u32)sdmac->event_mask[0]); in sdma_load_context()
809 dev_dbg(sdma->dev, "event_mask1 = 0x%08x\n", (u32)sdmac->event_mask[1]); in sdma_load_context()
811 spin_lock_irqsave(&sdma->channel_0_lock, flags); in sdma_load_context()
828 bd0->buffer_addr = sdma->context_phys; in sdma_load_context()
830 ret = sdma_run_channel0(sdma); in sdma_load_context()
832 spin_unlock_irqrestore(&sdma->channel_0_lock, flags); in sdma_load_context()
845 struct sdma_engine *sdma = sdmac->sdma; in sdma_disable_channel() local
848 writel_relaxed(BIT(channel), sdma->regs + SDMA_H_STATSTOP); in sdma_disable_channel()
867 if (sdmac->event_id0 >= sdmac->sdma->drvdata->num_events) in sdma_config_channel()
915 struct sdma_engine *sdma = sdmac->sdma; in sdma_set_channel_priority() local
923 writel_relaxed(priority, sdma->regs + SDMA_CHNPRI_0 + 4 * channel); in sdma_set_channel_priority()
930 struct sdma_engine *sdma = sdmac->sdma; in sdma_request_channel() local
941 sdma->channel_control[channel].base_bd_ptr = sdmac->bd_phys; in sdma_request_channel()
942 sdma->channel_control[channel].current_bd_ptr = sdmac->bd_phys; in sdma_request_channel()
991 clk_enable(sdmac->sdma->clk_ipg); in sdma_alloc_chan_resources()
992 clk_enable(sdmac->sdma->clk_ahb); in sdma_alloc_chan_resources()
1013 struct sdma_engine *sdma = sdmac->sdma; in sdma_free_chan_resources() local
1029 clk_disable(sdma->clk_ipg); in sdma_free_chan_resources()
1030 clk_disable(sdma->clk_ahb); in sdma_free_chan_resources()
1039 struct sdma_engine *sdma = sdmac->sdma; in sdma_prep_slave_sg() local
1052 dev_dbg(sdma->dev, "setting up %d entries for channel %d.\n", in sdma_prep_slave_sg()
1061 dev_err(sdma->dev, "SDMA channel %d: maximum number of sg exceeded: %d > %d\n", in sdma_prep_slave_sg()
1077 dev_err(sdma->dev, "SDMA channel %d: maximum bytes for sg entry exceeded: %d > %d\n", in sdma_prep_slave_sg()
1117 dev_dbg(sdma->dev, "entry %d: count: %d dma: %#llx %s%s\n", in sdma_prep_slave_sg()
1126 sdma->channel_control[channel].current_bd_ptr = sdmac->bd_phys; in sdma_prep_slave_sg()
1140 struct sdma_engine *sdma = sdmac->sdma; in sdma_prep_dma_cyclic() local
1145 dev_dbg(sdma->dev, "%s channel: %d\n", __func__, channel); in sdma_prep_dma_cyclic()
1162 dev_err(sdma->dev, "SDMA channel %d: maximum number of sg exceeded: %d > %d\n", in sdma_prep_dma_cyclic()
1168 dev_err(sdma->dev, "SDMA channel %d: maximum period size exceeded: %d > %d\n", in sdma_prep_dma_cyclic()
1192 dev_dbg(sdma->dev, "entry %d: count: %d dma: %#llx %s%s\n", in sdma_prep_dma_cyclic()
1206 sdma->channel_control[channel].current_bd_ptr = sdmac->bd_phys; in sdma_prep_dma_cyclic()
1255 struct sdma_engine *sdma = sdmac->sdma; in sdma_issue_pending() local
1258 sdma_enable_channel(sdma, sdmac->channel); in sdma_issue_pending()
1265 static void sdma_add_scripts(struct sdma_engine *sdma, in sdma_add_scripts() argument
1269 s32 *saddr_arr = (u32 *)sdma->script_addrs; in sdma_add_scripts()
1273 if (!sdma->script_number) in sdma_add_scripts()
1274 sdma->script_number = SDMA_SCRIPT_ADDRS_ARRAY_SIZE_V1; in sdma_add_scripts()
1276 for (i = 0; i < sdma->script_number; i++) in sdma_add_scripts()
1283 struct sdma_engine *sdma = context; in sdma_load_firmware() local
1289 dev_info(sdma->dev, "external firmware not found, using ROM firmware\n"); in sdma_load_firmware()
1305 sdma->script_number = SDMA_SCRIPT_ADDRS_ARRAY_SIZE_V1; in sdma_load_firmware()
1308 sdma->script_number = SDMA_SCRIPT_ADDRS_ARRAY_SIZE_V2; in sdma_load_firmware()
1311 sdma->script_number = SDMA_SCRIPT_ADDRS_ARRAY_SIZE_V3; in sdma_load_firmware()
1314 dev_err(sdma->dev, "unknown firmware version\n"); in sdma_load_firmware()
1321 clk_enable(sdma->clk_ipg); in sdma_load_firmware()
1322 clk_enable(sdma->clk_ahb); in sdma_load_firmware()
1324 sdma_load_script(sdma, ram_code, in sdma_load_firmware()
1327 clk_disable(sdma->clk_ipg); in sdma_load_firmware()
1328 clk_disable(sdma->clk_ahb); in sdma_load_firmware()
1330 sdma_add_scripts(sdma, addr); in sdma_load_firmware()
1332 dev_info(sdma->dev, "loaded firmware %d.%d\n", in sdma_load_firmware()
1340 static int sdma_get_firmware(struct sdma_engine *sdma, in sdma_get_firmware() argument
1346 FW_ACTION_HOTPLUG, fw_name, sdma->dev, in sdma_get_firmware()
1347 GFP_KERNEL, sdma, sdma_load_firmware); in sdma_get_firmware()
1352 static int sdma_init(struct sdma_engine *sdma) in sdma_init() argument
1357 clk_enable(sdma->clk_ipg); in sdma_init()
1358 clk_enable(sdma->clk_ahb); in sdma_init()
1361 writel_relaxed(0, sdma->regs + SDMA_H_C0PTR); in sdma_init()
1363 sdma->channel_control = dma_alloc_coherent(NULL, in sdma_init()
1368 if (!sdma->channel_control) { in sdma_init()
1373 sdma->context = (void *)sdma->channel_control + in sdma_init()
1375 sdma->context_phys = ccb_phys + in sdma_init()
1379 memset(sdma->channel_control, 0, in sdma_init()
1383 for (i = 0; i < sdma->drvdata->num_events; i++) in sdma_init()
1384 writel_relaxed(0, sdma->regs + chnenbl_ofs(sdma, i)); in sdma_init()
1388 writel_relaxed(0, sdma->regs + SDMA_CHNPRI_0 + i * 4); in sdma_init()
1390 ret = sdma_request_channel(&sdma->channel[0]); in sdma_init()
1394 sdma_config_ownership(&sdma->channel[0], false, true, false); in sdma_init()
1397 writel_relaxed(0x4050, sdma->regs + SDMA_CHN0ADDR); in sdma_init()
1401 writel_relaxed(0, sdma->regs + SDMA_H_CONFIG); in sdma_init()
1403 writel_relaxed(ccb_phys, sdma->regs + SDMA_H_C0PTR); in sdma_init()
1406 sdma_set_channel_priority(&sdma->channel[0], 7); in sdma_init()
1408 clk_disable(sdma->clk_ipg); in sdma_init()
1409 clk_disable(sdma->clk_ahb); in sdma_init()
1414 clk_disable(sdma->clk_ipg); in sdma_init()
1415 clk_disable(sdma->clk_ahb); in sdma_init()
1416 dev_err(sdma->dev, "initialisation failed with %d\n", ret); in sdma_init()
1437 struct sdma_engine *sdma = ofdma->of_dma_data; in sdma_xlate() local
1438 dma_cap_mask_t mask = sdma->dma_device.cap_mask; in sdma_xlate()
1462 struct sdma_engine *sdma; in sdma_probe() local
1480 sdma = devm_kzalloc(&pdev->dev, sizeof(*sdma), GFP_KERNEL); in sdma_probe()
1481 if (!sdma) in sdma_probe()
1484 spin_lock_init(&sdma->channel_0_lock); in sdma_probe()
1486 sdma->dev = &pdev->dev; in sdma_probe()
1487 sdma->drvdata = drvdata; in sdma_probe()
1494 sdma->regs = devm_ioremap_resource(&pdev->dev, iores); in sdma_probe()
1495 if (IS_ERR(sdma->regs)) in sdma_probe()
1496 return PTR_ERR(sdma->regs); in sdma_probe()
1498 sdma->clk_ipg = devm_clk_get(&pdev->dev, "ipg"); in sdma_probe()
1499 if (IS_ERR(sdma->clk_ipg)) in sdma_probe()
1500 return PTR_ERR(sdma->clk_ipg); in sdma_probe()
1502 sdma->clk_ahb = devm_clk_get(&pdev->dev, "ahb"); in sdma_probe()
1503 if (IS_ERR(sdma->clk_ahb)) in sdma_probe()
1504 return PTR_ERR(sdma->clk_ahb); in sdma_probe()
1506 clk_prepare(sdma->clk_ipg); in sdma_probe()
1507 clk_prepare(sdma->clk_ahb); in sdma_probe()
1510 sdma); in sdma_probe()
1514 sdma->script_addrs = kzalloc(sizeof(*sdma->script_addrs), GFP_KERNEL); in sdma_probe()
1515 if (!sdma->script_addrs) in sdma_probe()
1519 saddr_arr = (s32 *)sdma->script_addrs; in sdma_probe()
1523 dma_cap_set(DMA_SLAVE, sdma->dma_device.cap_mask); in sdma_probe()
1524 dma_cap_set(DMA_CYCLIC, sdma->dma_device.cap_mask); in sdma_probe()
1526 INIT_LIST_HEAD(&sdma->dma_device.channels); in sdma_probe()
1529 struct sdma_channel *sdmac = &sdma->channel[i]; in sdma_probe()
1531 sdmac->sdma = sdma; in sdma_probe()
1534 sdmac->chan.device = &sdma->dma_device; in sdma_probe()
1547 &sdma->dma_device.channels); in sdma_probe()
1550 ret = sdma_init(sdma); in sdma_probe()
1554 if (sdma->drvdata->script_addrs) in sdma_probe()
1555 sdma_add_scripts(sdma, sdma->drvdata->script_addrs); in sdma_probe()
1557 sdma_add_scripts(sdma, pdata->script_addrs); in sdma_probe()
1560 ret = sdma_get_firmware(sdma, pdata->fw_name); in sdma_probe()
1574 ret = sdma_get_firmware(sdma, fw_name); in sdma_probe()
1580 sdma->dma_device.dev = &pdev->dev; in sdma_probe()
1582 sdma->dma_device.device_alloc_chan_resources = sdma_alloc_chan_resources; in sdma_probe()
1583 sdma->dma_device.device_free_chan_resources = sdma_free_chan_resources; in sdma_probe()
1584 sdma->dma_device.device_tx_status = sdma_tx_status; in sdma_probe()
1585 sdma->dma_device.device_prep_slave_sg = sdma_prep_slave_sg; in sdma_probe()
1586 sdma->dma_device.device_prep_dma_cyclic = sdma_prep_dma_cyclic; in sdma_probe()
1587 sdma->dma_device.device_config = sdma_config; in sdma_probe()
1588 sdma->dma_device.device_terminate_all = sdma_disable_channel; in sdma_probe()
1589 sdma->dma_device.src_addr_widths = BIT(DMA_SLAVE_BUSWIDTH_4_BYTES); in sdma_probe()
1590 sdma->dma_device.dst_addr_widths = BIT(DMA_SLAVE_BUSWIDTH_4_BYTES); in sdma_probe()
1591 sdma->dma_device.directions = BIT(DMA_DEV_TO_MEM) | BIT(DMA_MEM_TO_DEV); in sdma_probe()
1592 sdma->dma_device.residue_granularity = DMA_RESIDUE_GRANULARITY_BURST; in sdma_probe()
1593 sdma->dma_device.device_issue_pending = sdma_issue_pending; in sdma_probe()
1594 sdma->dma_device.dev->dma_parms = &sdma->dma_parms; in sdma_probe()
1595 dma_set_max_seg_size(sdma->dma_device.dev, 65535); in sdma_probe()
1597 platform_set_drvdata(pdev, sdma); in sdma_probe()
1599 ret = dma_async_device_register(&sdma->dma_device); in sdma_probe()
1606 ret = of_dma_controller_register(np, sdma_xlate, sdma); in sdma_probe()
1613 dev_info(sdma->dev, "initialized\n"); in sdma_probe()
1618 dma_async_device_unregister(&sdma->dma_device); in sdma_probe()
1620 kfree(sdma->script_addrs); in sdma_probe()
1626 struct sdma_engine *sdma = platform_get_drvdata(pdev); in sdma_remove() local
1629 dma_async_device_unregister(&sdma->dma_device); in sdma_remove()
1630 kfree(sdma->script_addrs); in sdma_remove()
1633 struct sdma_channel *sdmac = &sdma->channel[i]; in sdma_remove()