int tegra_pcm_platform_register_with_chan_names(struct device *dev, struct snd_dmaengine_pcm_config *config, char *txdmachan, char *rxdmachan) { *config = tegra_dmaengine_pcm_config; config->dma_dev = dev->parent; config->chan_names[0] = txdmachan; config->chan_names[1] = rxdmachan; return snd_dmaengine_pcm_register(dev, config, 0); }
static int rt5350_pcm_dev_probe(struct platform_device *pdev) { struct rt5350_pcm *pcm; int ret; snd_dmaengine_pcm_register(&pdev->dev, &rt5350_dmaengine_pcm_config, SND_DMAENGINE_PCM_FLAG_COMPAT); pcm = kzalloc(sizeof(*pcm), GFP_KERNEL); if (!pcm) return -ENOMEM; pcm->mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!pcm->mem) { ret = -ENOENT; goto err_free; } pcm->mem = request_mem_region(pcm->mem->start, resource_size(pcm->mem), pdev->name); if (!pcm->mem) { ret = -EBUSY; goto err_free; } pcm->base = ioremap_nocache(pcm->mem->start, resource_size(pcm->mem)); if (!pcm->base) { ret = -EBUSY; goto err_release_mem_region; } pcm->phys_base = pcm->mem->start; platform_set_drvdata(pdev, pcm); ret = snd_soc_register_component(&pdev->dev, &rt5350_pcm_component, &rt5350_pcm_dai, 1); if (!ret) { dev_err(&pdev->dev, "loaded\n"); return ret; } dev_err(&pdev->dev, "Failed to register DAI\n"); iounmap(pcm->base); err_release_mem_region: release_mem_region(pcm->mem->start, resource_size(pcm->mem)); err_free: kfree(pcm); return ret; }
int ux500_pcm_register_platform(struct platform_device *pdev) { int ret; ret = snd_dmaengine_pcm_register(&pdev->dev, &ux500_dmaengine_pcm_config, SND_DMAENGINE_PCM_FLAG_NO_RESIDUE | SND_DMAENGINE_PCM_FLAG_COMPAT | SND_DMAENGINE_PCM_FLAG_NO_DT); if (ret < 0) { dev_err(&pdev->dev, "%s: ERROR: Failed to register platform '%s' (%d)!\n", __func__, pdev->name, ret); return ret; } return 0; }
/** * devm_snd_dmaengine_pcm_register - resource managed dmaengine PCM registration * @dev: The parent device for the PCM device * @config: Platform specific PCM configuration * @flags: Platform specific quirks * * Register a dmaengine based PCM device with automatic unregistration when the * device is unregistered. */ int devm_snd_dmaengine_pcm_register(struct device *dev, const struct snd_dmaengine_pcm_config *config, unsigned int flags) { struct device **ptr; int ret; ptr = devres_alloc(devm_dmaengine_pcm_release, sizeof(*ptr), GFP_KERNEL); if (!ptr) return -ENOMEM; ret = snd_dmaengine_pcm_register(dev, config, flags); if (ret == 0) { *ptr = dev; devres_add(dev, ptr); } else { devres_free(ptr); } return ret; }
static int rockchip_i2s_probe(struct platform_device *pdev) { struct rk_i2s_dev *i2s; struct resource *res; void __iomem *regs; int ret; i2s = devm_kzalloc(&pdev->dev, sizeof(*i2s), GFP_KERNEL); if (!i2s) { dev_err(&pdev->dev, "Can't allocate rk_i2s_dev\n"); return -ENOMEM; } /* try to prepare related clocks */ i2s->hclk = devm_clk_get(&pdev->dev, "i2s_hclk"); if (IS_ERR(i2s->hclk)) { dev_err(&pdev->dev, "Can't retrieve i2s bus clock\n"); return PTR_ERR(i2s->hclk); } i2s->mclk = devm_clk_get(&pdev->dev, "i2s_clk"); if (IS_ERR(i2s->mclk)) { dev_err(&pdev->dev, "Can't retrieve i2s master clock\n"); return PTR_ERR(i2s->mclk); } res = platform_get_resource(pdev, IORESOURCE_MEM, 0); regs = devm_ioremap_resource(&pdev->dev, res); if (IS_ERR(regs)) return PTR_ERR(regs); i2s->regmap = devm_regmap_init_mmio(&pdev->dev, regs, &rockchip_i2s_regmap_config); if (IS_ERR(i2s->regmap)) { dev_err(&pdev->dev, "Failed to initialise managed register map\n"); return PTR_ERR(i2s->regmap); } i2s->playback_dma_data.addr = res->start + I2S_TXDR; i2s->playback_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; i2s->playback_dma_data.maxburst = 16; i2s->capture_dma_data.addr = res->start + I2S_RXDR; i2s->capture_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; i2s->capture_dma_data.maxburst = 16; i2s->dev = &pdev->dev; dev_set_drvdata(&pdev->dev, i2s); pm_runtime_enable(&pdev->dev); if (!pm_runtime_enabled(&pdev->dev)) { ret = i2s_runtime_resume(&pdev->dev); if (ret) goto err_pm_disable; } ret = devm_snd_soc_register_component(&pdev->dev, &rockchip_i2s_component, &rockchip_i2s_dai, 1); if (ret) { dev_err(&pdev->dev, "Could not register DAI\n"); goto err_suspend; } ret = snd_dmaengine_pcm_register(&pdev->dev, NULL, 0); if (ret) { dev_err(&pdev->dev, "Could not register PCM\n"); goto err_pcm_register; } return 0; err_pcm_register: snd_dmaengine_pcm_unregister(&pdev->dev); err_suspend: if (!pm_runtime_status_suspended(&pdev->dev)) i2s_runtime_suspend(&pdev->dev); err_pm_disable: pm_runtime_disable(&pdev->dev); return ret; }
int tegra_pcm_platform_register(struct device *dev) { return snd_dmaengine_pcm_register(dev, &tegra_dmaengine_pcm_config, SND_DMAENGINE_PCM_FLAG_NO_DT | SND_DMAENGINE_PCM_FLAG_COMPAT); }
int atmel_pcm_dma_platform_register(struct device *dev) { return snd_dmaengine_pcm_register(dev, &atmel_dmaengine_pcm_config, 0); }
int atmel_pcm_dma_platform_register(struct device *dev) { return snd_dmaengine_pcm_register(dev, &atmel_dmaengine_pcm_config, SND_DMAENGINE_PCM_FLAG_NO_RESIDUE); }
int mxs_pcm_platform_register(struct device *dev) { return snd_dmaengine_pcm_register(dev, &mxs_dmaengine_pcm_config, SND_DMAENGINE_PCM_FLAG_NO_RESIDUE | SND_DMAENGINE_PCM_FLAG_HALF_DUPLEX); }
int tegra_pcm_platform_register(struct device *dev) { return snd_dmaengine_pcm_register(dev, &tegra_dmaengine_pcm_config, 0); }
int rockchip_pcm_platform_register(struct device *dev) { return snd_dmaengine_pcm_register(dev, &rockchip_dmaengine_pcm_config, SND_DMAENGINE_PCM_FLAG_COMPAT| SND_DMAENGINE_PCM_FLAG_NO_RESIDUE); }