Lines Matching refs:sdc

1286 	struct sun6i_dma_dev *sdc;  in sun6i_dma_probe()  local
1289 sdc = devm_kzalloc(&pdev->dev, sizeof(*sdc), GFP_KERNEL); in sun6i_dma_probe()
1290 if (!sdc) in sun6i_dma_probe()
1293 sdc->cfg = of_device_get_match_data(&pdev->dev); in sun6i_dma_probe()
1294 if (!sdc->cfg) in sun6i_dma_probe()
1297 sdc->base = devm_platform_ioremap_resource(pdev, 0); in sun6i_dma_probe()
1298 if (IS_ERR(sdc->base)) in sun6i_dma_probe()
1299 return PTR_ERR(sdc->base); in sun6i_dma_probe()
1301 sdc->irq = platform_get_irq(pdev, 0); in sun6i_dma_probe()
1302 if (sdc->irq < 0) in sun6i_dma_probe()
1303 return sdc->irq; in sun6i_dma_probe()
1305 sdc->clk = devm_clk_get(&pdev->dev, NULL); in sun6i_dma_probe()
1306 if (IS_ERR(sdc->clk)) { in sun6i_dma_probe()
1308 return PTR_ERR(sdc->clk); in sun6i_dma_probe()
1311 if (sdc->cfg->has_mbus_clk) { in sun6i_dma_probe()
1312 sdc->clk_mbus = devm_clk_get(&pdev->dev, "mbus"); in sun6i_dma_probe()
1313 if (IS_ERR(sdc->clk_mbus)) { in sun6i_dma_probe()
1315 return PTR_ERR(sdc->clk_mbus); in sun6i_dma_probe()
1319 sdc->rstc = devm_reset_control_get(&pdev->dev, NULL); in sun6i_dma_probe()
1320 if (IS_ERR(sdc->rstc)) { in sun6i_dma_probe()
1322 return PTR_ERR(sdc->rstc); in sun6i_dma_probe()
1325 sdc->pool = dmam_pool_create(dev_name(&pdev->dev), &pdev->dev, in sun6i_dma_probe()
1327 if (!sdc->pool) { in sun6i_dma_probe()
1332 platform_set_drvdata(pdev, sdc); in sun6i_dma_probe()
1333 INIT_LIST_HEAD(&sdc->pending); in sun6i_dma_probe()
1334 spin_lock_init(&sdc->lock); in sun6i_dma_probe()
1338 dma_cap_set(DMA_PRIVATE, sdc->slave.cap_mask); in sun6i_dma_probe()
1339 dma_cap_set(DMA_MEMCPY, sdc->slave.cap_mask); in sun6i_dma_probe()
1340 dma_cap_set(DMA_SLAVE, sdc->slave.cap_mask); in sun6i_dma_probe()
1341 dma_cap_set(DMA_CYCLIC, sdc->slave.cap_mask); in sun6i_dma_probe()
1343 INIT_LIST_HEAD(&sdc->slave.channels); in sun6i_dma_probe()
1344 sdc->slave.device_free_chan_resources = sun6i_dma_free_chan_resources; in sun6i_dma_probe()
1345 sdc->slave.device_tx_status = sun6i_dma_tx_status; in sun6i_dma_probe()
1346 sdc->slave.device_issue_pending = sun6i_dma_issue_pending; in sun6i_dma_probe()
1347 sdc->slave.device_prep_slave_sg = sun6i_dma_prep_slave_sg; in sun6i_dma_probe()
1348 sdc->slave.device_prep_dma_memcpy = sun6i_dma_prep_dma_memcpy; in sun6i_dma_probe()
1349 sdc->slave.device_prep_dma_cyclic = sun6i_dma_prep_dma_cyclic; in sun6i_dma_probe()
1350 sdc->slave.copy_align = DMAENGINE_ALIGN_4_BYTES; in sun6i_dma_probe()
1351 sdc->slave.device_config = sun6i_dma_config; in sun6i_dma_probe()
1352 sdc->slave.device_pause = sun6i_dma_pause; in sun6i_dma_probe()
1353 sdc->slave.device_resume = sun6i_dma_resume; in sun6i_dma_probe()
1354 sdc->slave.device_terminate_all = sun6i_dma_terminate_all; in sun6i_dma_probe()
1355 sdc->slave.src_addr_widths = sdc->cfg->src_addr_widths; in sun6i_dma_probe()
1356 sdc->slave.dst_addr_widths = sdc->cfg->dst_addr_widths; in sun6i_dma_probe()
1357 sdc->slave.directions = BIT(DMA_DEV_TO_MEM) | in sun6i_dma_probe()
1359 sdc->slave.residue_granularity = DMA_RESIDUE_GRANULARITY_BURST; in sun6i_dma_probe()
1360 sdc->slave.dev = &pdev->dev; in sun6i_dma_probe()
1362 sdc->num_pchans = sdc->cfg->nr_max_channels; in sun6i_dma_probe()
1363 sdc->num_vchans = sdc->cfg->nr_max_vchans; in sun6i_dma_probe()
1364 sdc->max_request = sdc->cfg->nr_max_requests; in sun6i_dma_probe()
1366 ret = of_property_read_u32(np, "dma-channels", &sdc->num_pchans); in sun6i_dma_probe()
1367 if (ret && !sdc->num_pchans) { in sun6i_dma_probe()
1372 ret = of_property_read_u32(np, "dma-requests", &sdc->max_request); in sun6i_dma_probe()
1373 if (ret && !sdc->max_request) { in sun6i_dma_probe()
1376 sdc->max_request = DMA_CHAN_MAX_DRQ_A31; in sun6i_dma_probe()
1383 if (!sdc->num_vchans) in sun6i_dma_probe()
1384 sdc->num_vchans = 2 * (sdc->max_request + 1); in sun6i_dma_probe()
1386 sdc->pchans = devm_kcalloc(&pdev->dev, sdc->num_pchans, in sun6i_dma_probe()
1388 if (!sdc->pchans) in sun6i_dma_probe()
1391 sdc->vchans = devm_kcalloc(&pdev->dev, sdc->num_vchans, in sun6i_dma_probe()
1393 if (!sdc->vchans) in sun6i_dma_probe()
1396 tasklet_setup(&sdc->task, sun6i_dma_tasklet); in sun6i_dma_probe()
1398 for (i = 0; i < sdc->num_pchans; i++) { in sun6i_dma_probe()
1399 struct sun6i_pchan *pchan = &sdc->pchans[i]; in sun6i_dma_probe()
1402 pchan->base = sdc->base + 0x100 + i * 0x40; in sun6i_dma_probe()
1405 for (i = 0; i < sdc->num_vchans; i++) { in sun6i_dma_probe()
1406 struct sun6i_vchan *vchan = &sdc->vchans[i]; in sun6i_dma_probe()
1410 vchan_init(&vchan->vc, &sdc->slave); in sun6i_dma_probe()
1413 ret = reset_control_deassert(sdc->rstc); in sun6i_dma_probe()
1419 ret = clk_prepare_enable(sdc->clk); in sun6i_dma_probe()
1425 if (sdc->cfg->has_mbus_clk) { in sun6i_dma_probe()
1426 ret = clk_prepare_enable(sdc->clk_mbus); in sun6i_dma_probe()
1433 ret = devm_request_irq(&pdev->dev, sdc->irq, sun6i_dma_interrupt, 0, in sun6i_dma_probe()
1434 dev_name(&pdev->dev), sdc); in sun6i_dma_probe()
1440 ret = dma_async_device_register(&sdc->slave); in sun6i_dma_probe()
1447 sdc); in sun6i_dma_probe()
1453 if (sdc->cfg->clock_autogate_enable) in sun6i_dma_probe()
1454 sdc->cfg->clock_autogate_enable(sdc); in sun6i_dma_probe()
1459 dma_async_device_unregister(&sdc->slave); in sun6i_dma_probe()
1461 sun6i_kill_tasklet(sdc); in sun6i_dma_probe()
1463 clk_disable_unprepare(sdc->clk_mbus); in sun6i_dma_probe()
1465 clk_disable_unprepare(sdc->clk); in sun6i_dma_probe()
1467 reset_control_assert(sdc->rstc); in sun6i_dma_probe()
1469 sun6i_dma_free(sdc); in sun6i_dma_probe()
1475 struct sun6i_dma_dev *sdc = platform_get_drvdata(pdev); in sun6i_dma_remove() local
1478 dma_async_device_unregister(&sdc->slave); in sun6i_dma_remove()
1480 sun6i_kill_tasklet(sdc); in sun6i_dma_remove()
1482 clk_disable_unprepare(sdc->clk_mbus); in sun6i_dma_remove()
1483 clk_disable_unprepare(sdc->clk); in sun6i_dma_remove()
1484 reset_control_assert(sdc->rstc); in sun6i_dma_remove()
1486 sun6i_dma_free(sdc); in sun6i_dma_remove()