• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

C++ snd_soc_register_dai函数代码示例

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

本文整理汇总了C++中snd_soc_register_dai函数的典型用法代码示例。如果您正苦于以下问题:C++ snd_soc_register_dai函数的具体用法?C++ snd_soc_register_dai怎么用?C++ snd_soc_register_dai使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。



在下文中一共展示了snd_soc_register_dai函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。

示例1: davinci_i2s_probe

static int davinci_i2s_probe(struct platform_device *pdev)
{
	struct snd_platform_data *pdata = pdev->dev.platform_data;
	struct davinci_mcbsp_dev *dev;
	struct resource *mem, *ioarea, *res;
	enum dma_event_q asp_chan_q = EVENTQ_0;
	enum dma_event_q ram_chan_q = EVENTQ_1;
	int ret;

	mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	if (!mem) {
		dev_err(&pdev->dev, "no mem resource?\n");
		return -ENODEV;
	}

	ioarea = devm_request_mem_region(&pdev->dev, mem->start,
					 resource_size(mem),
					 pdev->name);
	if (!ioarea) {
		dev_err(&pdev->dev, "McBSP region already claimed\n");
		return -EBUSY;
	}

	dev = devm_kzalloc(&pdev->dev, sizeof(struct davinci_mcbsp_dev),
			   GFP_KERNEL);
	if (!dev)
		return -ENOMEM;
	if (pdata) {
		dev->enable_channel_combine = pdata->enable_channel_combine;
		dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK].sram_size =
			pdata->sram_size_playback;
		dev->dma_params[SNDRV_PCM_STREAM_CAPTURE].sram_size =
			pdata->sram_size_capture;
		dev->clk_input_pin = pdata->clk_input_pin;
		dev->i2s_accurate_sck = pdata->i2s_accurate_sck;
		asp_chan_q = pdata->asp_chan_q;
		ram_chan_q = pdata->ram_chan_q;
	}

	dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK].asp_chan_q	= asp_chan_q;
	dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK].ram_chan_q	= ram_chan_q;
	dev->dma_params[SNDRV_PCM_STREAM_CAPTURE].asp_chan_q	= asp_chan_q;
	dev->dma_params[SNDRV_PCM_STREAM_CAPTURE].ram_chan_q	= ram_chan_q;

	dev->clk = clk_get(&pdev->dev, NULL);
	if (IS_ERR(dev->clk))
		return -ENODEV;
	clk_enable(dev->clk);

	dev->base = devm_ioremap(&pdev->dev, mem->start, resource_size(mem));
	if (!dev->base) {
		dev_err(&pdev->dev, "ioremap failed\n");
		ret = -ENOMEM;
		goto err_release_clk;
	}

	dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK].dma_addr =
	    (dma_addr_t)(mem->start + DAVINCI_MCBSP_DXR_REG);

	dev->dma_params[SNDRV_PCM_STREAM_CAPTURE].dma_addr =
	    (dma_addr_t)(mem->start + DAVINCI_MCBSP_DRR_REG);

	
	res = platform_get_resource(pdev, IORESOURCE_DMA, 0);
	if (!res) {
		dev_err(&pdev->dev, "no DMA resource\n");
		ret = -ENXIO;
		goto err_release_clk;
	}
	dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK].channel = res->start;

	res = platform_get_resource(pdev, IORESOURCE_DMA, 1);
	if (!res) {
		dev_err(&pdev->dev, "no DMA resource\n");
		ret = -ENXIO;
		goto err_release_clk;
	}
	dev->dma_params[SNDRV_PCM_STREAM_CAPTURE].channel = res->start;
	dev->dev = &pdev->dev;

	dev_set_drvdata(&pdev->dev, dev);

	ret = snd_soc_register_dai(&pdev->dev, &davinci_i2s_dai);
	if (ret != 0)
		goto err_release_clk;

	return 0;

err_release_clk:
	clk_disable(dev->clk);
	clk_put(dev->clk);
	return ret;
}
开发者ID:MiniBlu,项目名称:cm11_kernel_htc_msm8974a3ul,代码行数:93,代码来源:davinci-i2s.c


示例2: bfin_ac97_init

static int __init bfin_ac97_init(void)
{
	return snd_soc_register_dai(&bfin_ac97_dai);
}
开发者ID:Atrix-Dev-Team,项目名称:kernel-MB860,代码行数:4,代码来源:bf5xx-ac97.c


示例3: asoc_mcbsp_probe

static __devinit int asoc_mcbsp_probe(struct platform_device *pdev)
{
	return snd_soc_register_dai(&pdev->dev, &omap_mcbsp_dai);
}
开发者ID:shaqfu786,项目名称:FreshBake,代码行数:4,代码来源:omap-mcbsp.c


示例4: s6000_i2s_probe


//.........这里部分代码省略.........
	sifmem = platform_get_resource(pdev, IORESOURCE_MEM, 1);
	if (!sifmem) {
		dev_err(&pdev->dev, "no second mem resource?\n");
		ret = -ENODEV;
		goto err_release_map;
	}

	region = request_mem_region(sifmem->start, resource_size(sifmem),
								pdev->name);
	if (!region) {
		dev_err(&pdev->dev, "I2S SIF region already claimed\n");
		ret = -EBUSY;
		goto err_release_map;
	}

	dma1 = platform_get_resource(pdev, IORESOURCE_DMA, 0);
	if (!dma1) {
		dev_err(&pdev->dev, "no dma resource?\n");
		ret = -ENODEV;
		goto err_release_sif;
	}

	region = request_mem_region(dma1->start, resource_size(dma1),
								pdev->name);
	if (!region) {
		dev_err(&pdev->dev, "I2S DMA region already claimed\n");
		ret = -EBUSY;
		goto err_release_sif;
	}

	dma2 = platform_get_resource(pdev, IORESOURCE_DMA, 1);
	if (dma2) {
		region = request_mem_region(dma2->start, resource_size(dma2),
								pdev->name);
		if (!region) {
			dev_err(&pdev->dev,
				"I2S DMA region already claimed\n");
			ret = -EBUSY;
			goto err_release_dma1;
		}
	}

	dev = kzalloc(sizeof(struct s6000_i2s_dev), GFP_KERNEL);
	if (!dev) {
		ret = -ENOMEM;
		goto err_release_dma2;
	}
	dev_set_drvdata(&pdev->dev, dev);

	dev->sifbase = sifmem->start;
	dev->scbbase = mmio;

	s6_i2s_write_reg(dev, S6_I2S_INTERRUPT_ENABLE, 0);
	s6_i2s_write_reg(dev, S6_I2S_INTERRUPT_CLEAR,
			 S6_I2S_INT_ALIGNMENT |
			 S6_I2S_INT_UNDERRUN |
			 S6_I2S_INT_OVERRUN);

	s6000_i2s_stop_channel(dev, 0);
	s6000_i2s_stop_channel(dev, 1);
	s6000_i2s_wait_disabled(dev);

	dev->dma_params.check_xrun = s6000_i2s_check_xrun;
	dev->dma_params.trigger = s6000_i2s_trigger;
	dev->dma_params.dma_in = dma1->start;
	dev->dma_params.dma_out = dma2 ? dma2->start : 0;
	dev->dma_params.irq = platform_get_irq(pdev, 0);
	if (dev->dma_params.irq < 0) {
		dev_err(&pdev->dev, "no irq resource?\n");
		ret = -ENODEV;
		goto err_release_dev;
	}

	s6_i2s_write_reg(dev, S6_I2S_INTERRUPT_ENABLE,
			 S6_I2S_INT_ALIGNMENT |
			 S6_I2S_INT_UNDERRUN |
			 S6_I2S_INT_OVERRUN);

	ret = snd_soc_register_dai(&pdev->dev, &s6000_i2s_dai);
	if (ret)
		goto err_release_dev;

	return 0;

err_release_dev:
	kfree(dev);
err_release_dma2:
	if (dma2)
		release_mem_region(dma2->start, resource_size(dma2));
err_release_dma1:
	release_mem_region(dma1->start, resource_size(dma1));
err_release_sif:
	release_mem_region(sifmem->start, resource_size(sifmem));
err_release_map:
	iounmap(mmio);
err_release_scb:
	release_mem_region(scbmem->start, resource_size(scbmem));
err_release_none:
	return ret;
}
开发者ID:nos1609,项目名称:Chrono_Kernel-1,代码行数:101,代码来源:s6000-i2s.c


示例5: cs4270_i2c_probe


//.........这里部分代码省略.........
	if ((ret & 0xF0) != 0xC0) {
		dev_err(&i2c_client->dev, "device at addr %X is not a CS4270\n",
		       i2c_client->addr);
		return -ENODEV;
	}

	dev_info(&i2c_client->dev, "found device at i2c address %X\n",
		i2c_client->addr);
	dev_info(&i2c_client->dev, "hardware revision %X\n", ret & 0xF);

	/* Allocate enough space for the snd_soc_codec structure
	   and our private data together. */
	cs4270 = kzalloc(sizeof(struct cs4270_private), GFP_KERNEL);
	if (!cs4270) {
		dev_err(&i2c_client->dev, "could not allocate codec\n");
		return -ENOMEM;
	}
	codec = &cs4270->codec;

	mutex_init(&codec->mutex);
	INIT_LIST_HEAD(&codec->dapm_widgets);
	INIT_LIST_HEAD(&codec->dapm_paths);

	codec->dev = &i2c_client->dev;
	codec->name = "CS4270";
	codec->owner = THIS_MODULE;
	codec->dai = &cs4270_dai;
	codec->num_dai = 1;
	codec->private_data = cs4270;
	codec->control_data = i2c_client;
	codec->read = cs4270_read_reg_cache;
	codec->write = cs4270_i2c_write;
	codec->reg_cache = cs4270->reg_cache;
	codec->reg_cache_size = CS4270_NUMREGS;

	/* The I2C interface is set up, so pre-fill our register cache */

	ret = cs4270_fill_cache(codec);
	if (ret < 0) {
		dev_err(&i2c_client->dev, "failed to fill register cache\n");
		goto error_free_codec;
	}

	/* Disable auto-mute.  This feature appears to be buggy.  In some
	 * situations, auto-mute will not deactivate when it should, so we want
	 * this feature disabled by default.  An application (e.g. alsactl) can
	 * re-enabled it by using the controls.
	 */

	reg = cs4270_read_reg_cache(codec, CS4270_MUTE);
	reg &= ~CS4270_MUTE_AUTO;
	ret = cs4270_i2c_write(codec, CS4270_MUTE, reg);
	if (ret < 0) {
		dev_err(&i2c_client->dev, "i2c write failed\n");
		return ret;
	}

	/* Disable automatic volume control.  The hardware enables, and it
	 * causes volume change commands to be delayed, sometimes until after
	 * playback has started.  An application (e.g. alsactl) can
	 * re-enabled it by using the controls.
	 */

	reg = cs4270_read_reg_cache(codec, CS4270_TRANS);
	reg &= ~(CS4270_TRANS_SOFT | CS4270_TRANS_ZERO);
	ret = cs4270_i2c_write(codec, CS4270_TRANS, reg);
	if (ret < 0) {
		dev_err(&i2c_client->dev, "i2c write failed\n");
		return ret;
	}

	/* Initialize the DAI. Normally, we'd prefer to have a kmalloc'd DAI
	 * structure for each CS4270 device, but the machine driver needs to
	 * have a pointer to the DAI structure, so for now it must be a global
	 * variable.
	 */
	cs4270_dai.dev = &i2c_client->dev;

	/* Register the DAI.  If all the other ASoC driver have already
	 * registered, then this will call our probe function, so
	 * cs4270_codec needs to be ready.
	 */
	cs4270_codec = codec;
	ret = snd_soc_register_dai(&cs4270_dai);
	if (ret < 0) {
		dev_err(&i2c_client->dev, "failed to register DAIe\n");
		goto error_free_codec;
	}

	i2c_set_clientdata(i2c_client, cs4270);

	return 0;

error_free_codec:
	kfree(cs4270);
	cs4270_codec = NULL;
	cs4270_dai.dev = NULL;

	return ret;
}
开发者ID:325116067,项目名称:semc-qsd8x50,代码行数:101,代码来源:cs4270.c


示例6: ak4535_modinit

static int __init ak4535_modinit(void)
{
	return snd_soc_register_dai(&ak4535_dai);
}
开发者ID:A2109devs,项目名称:lenovo_a2109a_kernel,代码行数:4,代码来源:ak4535.c


示例7: tegra30_i2s_platform_probe

static int tegra30_i2s_platform_probe(struct platform_device *pdev)
{
	struct tegra30_i2s *i2s;
	u32 cif_ids[2];
	struct resource *mem, *memregion;
	void __iomem *regs;
	int ret;

	i2s = devm_kzalloc(&pdev->dev, sizeof(struct tegra30_i2s), GFP_KERNEL);
	if (!i2s) {
		dev_err(&pdev->dev, "Can't allocate tegra30_i2s\n");
		ret = -ENOMEM;
		goto err;
	}
	dev_set_drvdata(&pdev->dev, i2s);

	i2s->dai = tegra30_i2s_dai_template;
	i2s->dai.name = dev_name(&pdev->dev);

	ret = of_property_read_u32_array(pdev->dev.of_node,
					 "nvidia,ahub-cif-ids", cif_ids,
					 ARRAY_SIZE(cif_ids));
	if (ret < 0)
		goto err;

	i2s->playback_i2s_cif = cif_ids[0];
	i2s->capture_i2s_cif = cif_ids[1];

	i2s->clk_i2s = clk_get(&pdev->dev, NULL);
	if (IS_ERR(i2s->clk_i2s)) {
		dev_err(&pdev->dev, "Can't retrieve i2s clock\n");
		ret = PTR_ERR(i2s->clk_i2s);
		goto err;
	}

	mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	if (!mem) {
		dev_err(&pdev->dev, "No memory resource\n");
		ret = -ENODEV;
		goto err_clk_put;
	}

	memregion = devm_request_mem_region(&pdev->dev, mem->start,
					    resource_size(mem), DRV_NAME);
	if (!memregion) {
		dev_err(&pdev->dev, "Memory region already claimed\n");
		ret = -EBUSY;
		goto err_clk_put;
	}

	regs = devm_ioremap(&pdev->dev, mem->start, resource_size(mem));
	if (!regs) {
		dev_err(&pdev->dev, "ioremap failed\n");
		ret = -ENOMEM;
		goto err_clk_put;
	}

	i2s->regmap = devm_regmap_init_mmio(&pdev->dev, regs,
					    &tegra30_i2s_regmap_config);
	if (IS_ERR(i2s->regmap)) {
		dev_err(&pdev->dev, "regmap init failed\n");
		ret = PTR_ERR(i2s->regmap);
		goto err_clk_put;
	}
	regcache_cache_only(i2s->regmap, true);

	pm_runtime_enable(&pdev->dev);
	if (!pm_runtime_enabled(&pdev->dev)) {
		ret = tegra30_i2s_runtime_resume(&pdev->dev);
		if (ret)
			goto err_pm_disable;
	}

	ret = snd_soc_register_dai(&pdev->dev, &i2s->dai);
	if (ret) {
		dev_err(&pdev->dev, "Could not register DAI: %d\n", ret);
		ret = -ENOMEM;
		goto err_suspend;
	}

	ret = tegra_pcm_platform_register(&pdev->dev);
	if (ret) {
		dev_err(&pdev->dev, "Could not register PCM: %d\n", ret);
		goto err_unregister_dai;
	}

	return 0;

err_unregister_dai:
	snd_soc_unregister_dai(&pdev->dev);
err_suspend:
	if (!pm_runtime_status_suspended(&pdev->dev))
		tegra30_i2s_runtime_suspend(&pdev->dev);
err_pm_disable:
	pm_runtime_disable(&pdev->dev);
err_clk_put:
	clk_put(i2s->clk_i2s);
err:
	return ret;
}
开发者ID:AiWinters,项目名称:linux,代码行数:100,代码来源:tegra30_i2s.c


示例8: asoc_pcm_cpu_probe

static __devinit int asoc_pcm_cpu_probe(struct platform_device *pdev)
{
	return snd_soc_register_dai(&pdev->dev, msm_pcm_cpu_dais);
}
开发者ID:98416,项目名称:Z7Max_NX505J_H129_kernel,代码行数:4,代码来源:msm-dai.c


示例9: mxs_spdif_dai_init

static int __init mxs_spdif_dai_init(void)
{
	return snd_soc_register_dai(&mxs_spdif_dai);
}
开发者ID:YCsuperlife,项目名称:imx53_kernel,代码行数:4,代码来源:mxs-spdif-dai.c


示例10: ux500_msp_drv_probe

static int __devinit ux500_msp_drv_probe(struct platform_device *pdev)
{
    struct ux500_msp_i2s_drvdata *drvdata;
    int ret = 0;

    dev_dbg(&pdev->dev, "%s: Enter (pdev->name = %s).\n", __func__,
            pdev->name);

    drvdata = devm_kzalloc(&pdev->dev,
                           sizeof(struct ux500_msp_i2s_drvdata),
                           GFP_KERNEL);
    drvdata->fmt = 0;
    drvdata->slots = 1;
    drvdata->tx_mask = 0x01;
    drvdata->rx_mask = 0x01;
    drvdata->slot_width = 16;
    drvdata->master_clk = MSP_INPUT_FREQ_APB;

    drvdata->reg_vape = devm_regulator_get(&pdev->dev, "v-ape");
    if (IS_ERR(drvdata->reg_vape)) {
        ret = (int)PTR_ERR(drvdata->reg_vape);
        dev_err(&pdev->dev,
                "%s: ERROR: Failed to get Vape supply (%d)!\n",
                __func__, ret);
        return ret;
    }
    prcmu_qos_add_requirement(PRCMU_QOS_APE_OPP, (char *)pdev->name, 50);

    drvdata->clk = clk_get(&pdev->dev, NULL);
    if (IS_ERR(drvdata->clk)) {
        ret = (int)PTR_ERR(drvdata->clk);
        dev_err(&pdev->dev, "%s: ERROR: clk_get failed (%d)!\n",
                __func__, ret);
        goto err_clk;
    }

    ret = ux500_msp_i2s_init_msp(pdev, &drvdata->msp,
                                 pdev->dev.platform_data);
    if (!drvdata->msp) {
        dev_err(&pdev->dev,
                "%s: ERROR: Failed to init MSP-struct (%d)!",
                __func__, ret);
        goto err_init_msp;
    }
    dev_set_drvdata(&pdev->dev, drvdata);

    ret = snd_soc_register_dai(&pdev->dev,
                               &ux500_msp_dai_drv[drvdata->msp->id]);
    if (ret < 0) {
        dev_err(&pdev->dev, "Error: %s: Failed to register MSP%d!\n",
                __func__, drvdata->msp->id);
        goto err_init_msp;
    }

    return 0;

err_init_msp:
    clk_put(drvdata->clk);

err_clk:
    devm_regulator_put(drvdata->reg_vape);

    return ret;
}
开发者ID:hackeran,项目名称:linux-netmap,代码行数:64,代码来源:ux500_msp_dai.c


示例11: davinci_mcasp_probe

static int davinci_mcasp_probe(struct platform_device *pdev)
{
	struct davinci_pcm_dma_params *dma_data;
	struct resource *mem, *ioarea, *res;
	struct snd_platform_data *pdata;
	struct davinci_audio_dev *dev;
	int ret = 0;

	dev = kzalloc(sizeof(struct davinci_audio_dev), GFP_KERNEL);
	if (!dev)
		return	-ENOMEM;

	mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	if (!mem) {
		dev_err(&pdev->dev, "no mem resource?\n");
		ret = -ENODEV;
		goto err_release_data;
	}

	ioarea = request_mem_region(mem->start,
			(mem->end - mem->start) + 1, pdev->name);
	if (!ioarea) {
		dev_err(&pdev->dev, "Audio region already claimed\n");
		ret = -EBUSY;
		goto err_release_data;
	}

	pdata = pdev->dev.platform_data;
	dev->clk = clk_get(&pdev->dev, NULL);
	if (IS_ERR(dev->clk)) {
		ret = -ENODEV;
		goto err_release_region;
	}

	clk_enable(dev->clk);
	dev->clk_active = 1;

	dev->base = (void __iomem *)IO_ADDRESS(mem->start);
	dev->op_mode = pdata->op_mode;
	dev->tdm_slots = pdata->tdm_slots;
	dev->num_serializer = pdata->num_serializer;
	dev->serial_dir = pdata->serial_dir;
	dev->codec_fmt = pdata->codec_fmt;
	dev->version = pdata->version;
	dev->txnumevt = pdata->txnumevt;
	dev->rxnumevt = pdata->rxnumevt;

	dma_data = &dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK];
	dma_data->asp_chan_q = pdata->asp_chan_q;
	dma_data->ram_chan_q = pdata->ram_chan_q;
	dma_data->dma_addr = (dma_addr_t) (pdata->tx_dma_offset +
							io_v2p(dev->base));

	/* first TX, then RX */
	res = platform_get_resource(pdev, IORESOURCE_DMA, 0);
	if (!res) {
		dev_err(&pdev->dev, "no DMA resource\n");
		goto err_release_region;
	}

	dma_data->channel = res->start;

	dma_data = &dev->dma_params[SNDRV_PCM_STREAM_CAPTURE];
	dma_data->asp_chan_q = pdata->asp_chan_q;
	dma_data->ram_chan_q = pdata->ram_chan_q;
	dma_data->dma_addr = (dma_addr_t)(pdata->rx_dma_offset +
							io_v2p(dev->base));

	res = platform_get_resource(pdev, IORESOURCE_DMA, 1);
	if (!res) {
		dev_err(&pdev->dev, "no DMA resource\n");
		goto err_release_region;
	}

	dma_data->channel = res->start;
	dev_set_drvdata(&pdev->dev, dev);
	ret = snd_soc_register_dai(&pdev->dev, &davinci_mcasp_dai[pdata->op_mode]);

	if (ret != 0)
		goto err_release_region;
	return 0;

err_release_region:
	release_mem_region(mem->start, (mem->end - mem->start) + 1);
err_release_data:
	kfree(dev);

	return ret;
}
开发者ID:CallMeVentus,项目名称:i9070_kernel_CoCore-P,代码行数:89,代码来源:davinci-mcasp.c


示例12: s3c_pcm_dev_probe

static __devinit int s3c_pcm_dev_probe(struct platform_device *pdev)
{
    struct s3c_pcm_info *pcm;
    struct snd_soc_dai *dai;
    struct resource *mem_res, *dmatx_res, *dmarx_res;
    struct s3c_audio_pdata *pcm_pdata;
    int ret;

    /* Check for valid device index */
    if ((pdev->id < 0) || pdev->id >= ARRAY_SIZE(s3c_pcm)) {
        dev_err(&pdev->dev, "id %d out of range\n", pdev->id);
        return -EINVAL;
    }

    pcm_pdata = pdev->dev.platform_data;

    /* Check for availability of necessary resource */
    dmatx_res = platform_get_resource(pdev, IORESOURCE_DMA, 0);
    if (!dmatx_res) {
        dev_err(&pdev->dev, "Unable to get PCM-TX dma resource\n");
        return -ENXIO;
    }

    dmarx_res = platform_get_resource(pdev, IORESOURCE_DMA, 1);
    if (!dmarx_res) {
        dev_err(&pdev->dev, "Unable to get PCM-RX dma resource\n");
        return -ENXIO;
    }

    mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
    if (!mem_res) {
        dev_err(&pdev->dev, "Unable to get register resource\n");
        return -ENXIO;
    }

    if (pcm_pdata && pcm_pdata->cfg_gpio && pcm_pdata->cfg_gpio(pdev)) {
        dev_err(&pdev->dev, "Unable to configure gpio\n");
        return -EINVAL;
    }

    pcm = &s3c_pcm[pdev->id];
    pcm->dev = &pdev->dev;

    spin_lock_init(&pcm->lock);

    dai = &s3c_pcm_dai[pdev->id];
    dai->dev = &pdev->dev;

    /* Default is 128fs */
    pcm->sclk_per_fs = 128;

    pcm->cclk = clk_get(&pdev->dev, "audio-bus");
    if (IS_ERR(pcm->cclk)) {
        dev_err(&pdev->dev, "failed to get audio-bus\n");
        ret = PTR_ERR(pcm->cclk);
        goto err1;
    }
    clk_enable(pcm->cclk);

    /* record our pcm structure for later use in the callbacks */
    dai->private_data = pcm;

    if (!request_mem_region(mem_res->start,
                            resource_size(mem_res), "samsung-pcm")) {
        dev_err(&pdev->dev, "Unable to request register region\n");
        ret = -EBUSY;
        goto err2;
    }

    pcm->regs = ioremap(mem_res->start, 0x100);
    if (pcm->regs == NULL) {
        dev_err(&pdev->dev, "cannot ioremap registers\n");
        ret = -ENXIO;
        goto err3;
    }

    pcm->pclk = clk_get(&pdev->dev, "pcm");
    if (IS_ERR(pcm->pclk)) {
        dev_err(&pdev->dev, "failed to get pcm_clock\n");
        ret = -ENOENT;
        goto err4;
    }
    clk_enable(pcm->pclk);

    ret = snd_soc_register_dai(dai);
    if (ret != 0) {
        dev_err(&pdev->dev, "failed to get pcm_clock\n");
        goto err5;
    }

    s3c_pcm_stereo_in[pdev->id].dma_addr = mem_res->start
                                           + S3C_PCM_RXFIFO;
    s3c_pcm_stereo_out[pdev->id].dma_addr = mem_res->start
                                            + S3C_PCM_TXFIFO;

    s3c_pcm_stereo_in[pdev->id].channel = dmarx_res->start;
    s3c_pcm_stereo_out[pdev->id].channel = dmatx_res->start;

    pcm->dma_capture = &s3c_pcm_stereo_in[pdev->id];
    pcm->dma_playback = &s3c_pcm_stereo_out[pdev->id];
//.........这里部分代码省略.........
开发者ID:asdlei00,项目名称:Ace-i,代码行数:101,代码来源:s3c-pcm.c


示例13: spdif_probe

static __devinit int spdif_probe(struct platform_device *pdev)
{
	int ret;
	struct samsung_spdif_info *spdif;
	struct snd_soc_dai *dai;
	struct resource *mem_res, *dma_res;
	struct s3c_audio_pdata *spdif_pdata;

	spdif_pdata = pdev->dev.platform_data;

	dev_dbg(&pdev->dev, "Entered %s\n", __func__);

	dma_res = platform_get_resource(pdev, IORESOURCE_DMA, 0);
	if (!dma_res) {
		dev_err(&pdev->dev, "Unable to get dma resource.\n");
		return -ENXIO;
	}

	mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	if (!mem_res) {
		dev_err(&pdev->dev, "Unable to get register resource.\n");
		return -ENXIO;
	}

	if (spdif_pdata && spdif_pdata->cfg_gpio
			&& spdif_pdata->cfg_gpio(pdev)) {
		dev_err(&pdev->dev, "Unable to configure GPIO pins\n");
		return -EINVAL;
	}

	/* Fill-up basic DAI features */
	samsung_spdif_dai.name = "samsung-spdif";
	samsung_spdif_dai.ops = &spdif_dai_ops;
	samsung_spdif_dai.suspend = spdif_suspend;
	samsung_spdif_dai.resume = spdif_resume;
	samsung_spdif_dai.playback.channels_min = 2;
	samsung_spdif_dai.playback.channels_max = 2;
	samsung_spdif_dai.playback.rates = S5P_SPDIF_RATES;
	samsung_spdif_dai.playback.formats = S5P_SPDIF_FORMATS;

	spdif = &spdif_info;
	spdif->dev = &pdev->dev;

	spin_lock_init(&spdif->lock);

	spdif->pclk = clk_get(&pdev->dev, "spdif");
	if (IS_ERR(spdif->pclk)) {
		dev_err(&pdev->dev, "failed to get SPDIF PCLK\n");
		ret = -ENOENT;
		goto err0;
	}
	clk_enable(spdif->pclk);

	spdif->use_int_clk = 1;
	spdif->clk_rate = 0;

	/* Get source clock that can be set rate. Actually 'sclk_spdif'
	 * has no divider to set it's rate, so we should have to use
	 * parent clock of 'sclk_spdif' that has divider.
	 */
	spdif->sclk = clk_get_parent(clk_get(&pdev->dev, "sclk_spdif"));
	if (IS_ERR(spdif->sclk)) {
		dev_err(&pdev->dev, "failed to get SPDIF source clock\n");
		ret = -ENOENT;
		goto err1;
	}
	clk_enable(spdif->sclk);

	/* Request SPDIF Register's memory region */
	if (!request_mem_region(mem_res->start,
				resource_size(mem_res), "samsung-spdif")) {
		dev_err(&pdev->dev, "Unable to request register region\n");
		ret = -EBUSY;
		goto err2;
	}

	spdif->regs = ioremap(mem_res->start, 0x100);
	if (spdif->regs == NULL) {
		dev_err(&pdev->dev, "Cannot ioremap registers\n");
		ret = -ENXIO;
		goto err4;
	}

	/* Register cpu dai */
	dai = &samsung_spdif_dai;
	dai->dev = &pdev->dev;
	dai->private_data = spdif;

	ret = snd_soc_register_dai(dai);
	if (ret != 0) {
		dev_err(&pdev->dev, "Failed to register cpu dai\n");
		goto err5;
	}

	spdif_stereo_out.dma_size = 2;
	spdif_stereo_out.client = &spdif_dma_client_out;
	spdif_stereo_out.dma_addr = mem_res->start + DATA_OUTBUF;
	spdif_stereo_out.channel = dma_res->start;

	spdif->dma_playback = &spdif_stereo_out;
//.........这里部分代码省略.........
开发者ID:FrozenData,项目名称:SGS2-Kernel-Update2,代码行数:101,代码来源:spdif.c


示例14: tegra20_spdif_platform_probe

static int tegra20_spdif_platform_probe(struct platform_device *pdev)
{
	struct tegra20_spdif *spdif;
	struct resource *mem, *memregion, *dmareq;
	void __iomem *regs;
	int ret;
	u32 reg_val;

	spdif = devm_kzalloc(&pdev->dev, sizeof(struct tegra20_spdif),
			     GFP_KERNEL);
	if (!spdif) {
		dev_err(&pdev->dev, "Can't allocate tegra20_spdif\n");
		ret = -ENOMEM;
		goto err;
	}
	dev_set_drvdata(&pdev->dev, spdif);

	spdif->clk_spdif_out = clk_get(&pdev->dev, "spdif_out");
	if (IS_ERR(spdif->clk_spdif_out)) {
		pr_err("Can't retrieve spdif clock\n");
		ret = PTR_ERR(spdif->clk_spdif_out);
		goto err;
	}

	mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	if (!mem) {
		dev_err(&pdev->dev, "No memory resource\n");
		ret = -ENODEV;
		goto err_clk_put;
	}

	dmareq = platform_get_resource(pdev, IORESOURCE_DMA, 0);
	if (!dmareq) {
		dev_err(&pdev->dev, "No DMA resource\n");
		ret = -ENODEV;
		goto err_clk_put;
	}

	memregion = devm_request_mem_region(&pdev->dev, mem->start,
					    resource_size(mem), DRV_NAME);
	if (!memregion) {
		dev_err(&pdev->dev, "Memory region already claimed\n");
		ret = -EBUSY;
		goto err_clk_put;
	}

	regs = devm_ioremap(&pdev->dev, mem->start, resource_size(mem));
	if (!regs) {
		dev_err(&pdev->dev, "ioremap failed\n");
		ret = -ENOMEM;
		goto err_clk_put;
	}

	spdif->regmap = devm_regmap_init_mmio(&pdev->dev, regs,
					    &tegra20_spdif_regmap_config);
	if (IS_ERR(spdif->regmap)) {
		dev_err(&pdev->dev, "regmap init failed\n");
		ret = PTR_ERR(spdif->regmap);
		goto err_clk_put;
	}

	spdif->playback_dma_data.addr = mem->start + TEGRA20_SPDIF_DATA_OUT;
	spdif->playback_dma_data.wrap = 4;
	spdif->playback_dma_data.width = 32;
	spdif->playback_dma_data.req_sel = dmareq->start;

	pm_runtime_enable(&pdev->dev);
	if (!pm_runtime_enabled(&pdev->dev)) {
		ret = tegra20_spdif_runtime_resume(&pdev->dev);
		if (ret)
			goto err_pm_disable;
	}

	clk_enable(spdif->clk_spdif_out);

	reg_val = tegra20_spdif_read(spdif, TEGRA20_SPDIF_DATA_FIFO_CSR);
	reg_val &= ~TEGRA20_SPDIF_DATA_FIFO_CSR_TX_ATN_LVL_MASK;
	reg_val |= TEGRA20_SPDIF_DATA_FIFO_CSR_TX_ATN_LVL_TU4_WORD_FULL;
	tegra20_spdif_write(spdif, TEGRA20_SPDIF_DATA_FIFO_CSR, reg_val);

	clk_disable(spdif->clk_spdif_out);

	ret = snd_soc_register_dai(&pdev->dev, &tegra20_spdif_dai);
	if (ret) {
		dev_err(&pdev->dev, "Could not register DAI: %d\n", ret);
		ret = -ENOMEM;
		goto err_suspend;
	}

	ret = tegra_pcm_platform_register(&pdev->dev);
	if (ret) {
		dev_err(&pdev->dev, "Could not register PCM: %d\n", ret);
		goto err_unregister_dai;
	}

	return 0;

err_unregister_dai:
	snd_soc_unregister_dai(&pdev->dev);
err_suspend:
//.........这里部分代码省略.........
开发者ID:FrozenCow,项目名称:FIRE-ICE,代码行数:101,代码来源:tegra20_spdif.c


示例15: wm8523_register


//.........这里部分代码省略.........
	codec->name = "WM8523";
	codec->owner = THIS_MODULE;
	codec->bias_level = SND_SOC_BIAS_OFF;
	codec->set_bias_level = wm8523_set_bias_level;
	codec->dai = &wm8523_dai;
	codec->num_dai = 1;
	codec->reg_cache_size = WM8523_REGISTER_COUNT;
	codec->reg_cache = &wm8523->reg_cache;
	codec->volatile_register = wm8523_volatile_register;

	wm8523->rate_constraint.list = &wm8523->rate_constraint_list[0];
	wm8523->rate_constraint.count =
		ARRAY_SIZE(wm8523->rate_constraint_list);

	memcpy(codec->reg_cache, wm8523_reg, sizeof(wm8523_reg));

	ret = snd_soc_codec_set_cache_io(codec, 8, 16, control);
	if (ret != 0) {
		dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret);
		goto err;
	}

	for (i = 0; i < ARRAY_SIZE(wm8523->supplies); i++)
		wm8523->supplies[i].supply = wm8523_supply_names[i];

	ret = regulator_bulk_get(codec->dev, ARRAY_SIZE(wm8523->supplies),
				 wm8523->supplies);
	if (ret != 0) {
		dev_err(codec->dev, "Failed to request supplies: %d\n", ret);
		goto err;
	}

	ret = regulator_bulk_enable(ARRAY_SIZE(wm8523->supplies),
				    wm8523->supplies);
	if (ret != 0) {
		dev_err(codec->dev, "Failed to enable supplies: %d\n", ret);
		goto err_get;
	}

	ret = snd_soc_read(codec, WM8523_DEVICE_ID);
	if (ret < 0) {
		dev_err(codec->dev, "Failed to read ID register\n");
		goto err_enable;
	}
	if (ret != wm8523_reg[WM8523_DEVICE_ID]) {
		dev_err(codec->dev, "Device is not a WM8523, ID is %x\n", ret);
		ret = -EINVAL;
		goto err_enable;
	}

	ret = snd_soc_read(codec, WM8523_REVISION);
	if (ret < 0) {
		dev_err(codec->dev, "Failed to read revision register\n");
		goto err_enable;
	}
	dev_info(codec->dev, "revision %c\n",
		 (ret & WM8523_CHIP_REV_MASK) + 'A');

	ret = wm8523_reset(codec);
	if (ret < 0) {
		dev_err(codec->dev, "Failed to issue reset\n");
		goto err_enable;
	}

	wm8523_dai.dev = codec->dev;

	/* Change some default settings - latch VU and enable ZC */
	wm8523->reg_cache[WM8523_DAC_GAINR] |= WM8523_DACR_VU;
	wm8523->reg_cache[WM8523_DAC_CTRL3] |= WM8523_ZC;

	wm8523_set_bias_level(codec, SND_SOC_BIAS_STANDBY);

	/* Bias level configuration will have done an extra enable */
	regulator_bulk_disable(ARRAY_SIZE(wm8523->supplies), wm8523->supplies);

	wm8523_codec = codec;

	ret = snd_soc_register_codec(codec);
	if (ret != 0) {
		dev_err(codec->dev, "Failed to register codec: %d\n", ret);
		return ret;
	}

	ret = snd_soc_register_dai(&wm8523_dai);
	if (ret != 0) {
		dev_err(codec->dev, "Failed to register DAI: %d\n", ret);
		snd_soc_unregister_codec(codec);
		return ret;
	}

	return 0;

err_enable:
	regulator_bulk_disable(ARRAY_SIZE(wm8523->supplies), wm8523->supplies);
err_get:
	regulator_bulk_free(ARRAY_SIZE(wm8523->supplies), wm8523->supplies);
err:
	kfree(wm8523);
	return ret;
}
开发者ID:12rafael,项目名称:jellytimekernel,代码行数:101,代码来源:wm8523.c


示例16: imx_ssi_dev_probe

static int imx_ssi_dev_probe(struct platform_device *pdev)
{
	int fifo0_channel = pdev->id * 2;
	struct snd_soc_dai *dai;
	struct imx_ssi *priv;
	int fifo, channel;
	struct resource *res;
	int ret;

	BUG_ON(fifo0_channel >= MAX_SSI_CHANNELS);

	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	if (!res)
		return -ENODEV;

	priv = kzalloc(sizeof(struct imx_ssi), GFP_KERNEL);
	if (!priv)
		return -ENOMEM;

	/* Each SSI block has 2 fifos which share the same
	   private data (struct imx_ssi) */
	priv->baseaddr = res->start;
	priv->ioaddr = ioremap(res->start, 0x5C);
	priv->irq = platform_get_irq(pdev, 0);
	priv->ssi_clk = clk_get(&pdev->dev, "ssi_clk");
	priv->pdev = pdev;

	for (fifo = 0; fifo < 2; fifo++) {
		channel = (pdev->id * 2) + fifo;

		dai = kzalloc(sizeof(struct snd_soc_dai), GFP_KERNEL);
		if (IS_ERR(dai)) {
			ret = -ENOMEM;
			goto DAI_ERR;
		}

		dai->name = kasprintf(GFP_KERNEL, "imx-ssi-%d-%d",
				      pdev->id + 1, fifo);
		if (IS_ERR(dai->name)) {
			kfree(dai);
			ret = -ENOMEM;
			goto DAI_ERR;
		}

		dai->probe = imx_ssi_probe;
		dai->suspend = imx_ssi_suspend;
		dai->remove = imx_ssi_remove;
		dai->resume = imx_ssi_resume;

		dai->playback.channels_min = 1;
		dai->playback.channels_max = 2;
		dai->playback.rates = IMX_SSI_RATES;
		dai->playback.formats = IMX_SSI_FORMATS;

		dai->capture.channels_min = 1;
		dai->capture.channels_max = 2;
		dai->capture.rates = IMX_SSI_RATES;
		dai->capture.formats = IMX_SSI_FORMATS;

		dai->ops = &imx_ssi_dai_ops;

		dai->private_data = priv;

		dai->id = channel;
		imx_ssi_dai[channel] = dai;

		ret = snd_soc_register_dai(dai);
		if (ret < 0) {
			kfree(dai->name);
			kfree(dai);
			goto DAI_ERR;
		}
	}
	return 0;

DAI_ERR:
	if (fifo == 1) {
		dai = imx_ssi_dai[fifo0_channel];
		snd_soc_unregister_dai(dai);
		kfree(dai->name);
		kfree(dai);
	}

	clk_put(priv->ssi_clk);
	iounmap(priv->ioaddr);
	kfree(priv);
	return ret;
}
开发者ID:YCsuperlife,项目名称:imx53_kernel,代码行数:88,代码来源:imx-ssi.c


示例17: wm8993_i2c_probe


//.........这里部分代码省略.........

	wm8993->hubs_data.hp_startup_mode = 1;
	wm8993->hubs_data.dcs_codes = -2;

	memcpy(wm8993->reg_cache, wm8993_reg_defaults,
	       sizeof(wm8993->reg_cache));

	ret = snd_soc_codec_set_cache_io(codec, 8, 16, SND_SOC_I2C);
	if (ret != 0) {
		dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret);
		goto err;
	}

	i2c_set_clientdata(i2c, wm8993);
	codec->control_data = i2c;
	wm8993_codec = codec;

	codec->dev = &i2c->dev;

	for (i = 0; i < ARRAY_SIZE(wm8993->supplies); i++)
		wm8993->supplies[i].supply = wm8993_supply_names[i];

	ret = regulator_bulk_get(codec->dev, ARRAY_SIZE(wm8993->supplies),
				 wm8993->supplies);
	if (ret != 0) {
		dev_err(codec->dev, "Failed to request supplies: %d\n", ret);
		goto err;
	}

	ret = regulator_bulk_enable(ARRAY_SIZE(wm8993->supplies),
				    wm8993->supplies);
	if (ret != 0) {
		dev_err(codec->dev, "Failed to enable supplies: %d\n", ret);
		goto err_get;
	}

	val = snd_soc_read(codec, WM8993_SOFTWARE_RESET);
	if (val != wm8993_reg_defaults[WM8993_SOFTWARE_RESET]) {
		dev_err(codec->dev, "Invalid ID register value %x\n", val);
		ret = -EINVAL;
		goto err_enable;
	}

	ret = snd_soc_write(codec, WM8993_SOFTWARE_RESET, 0xffff);
	if (ret != 0)
		goto err_enable;

	codec->cache_only = 1;

	/* By default we're using the output mixers */
	wm8993->class_w_users = 2;

	/* Latch volume update bits and default ZC on */
	snd_soc_update_bits(codec, WM8993_RIGHT_DAC_DIGITAL_VOLUME,
			    WM8993_DAC_VU, WM8993_DAC_VU);
	snd_soc_update_bits(codec, WM8993_RIGHT_ADC_DIGITAL_VOLUME,
			    WM8993_ADC_VU, WM8993_ADC_VU);

	/* Manualy manage the HPOUT sequencing for independent stereo
	 * control. */
	snd_soc_update_bits(codec, WM8993_ANALOGUE_HP_0,
			    WM8993_HPOUT1_AUTO_PU, 0);

	/* Use automatic clock configuration */
	snd_soc_update_bits(codec, WM8993_CLOCKING_4, WM8993_SR_MODE, 0);

	wm_hubs_handle_analogue_pdata(codec, wm8993->pdata.lineout1_diff,
				      wm8993->pdata.lineout2_diff,
				      wm8993->pdata.lineout1fb,
				      wm8993->pdata.lineout2fb,
				      wm8993->pdata.jd_scthr,
				      wm8993->pdata.jd_thr,
				      wm8993->pdata.micbias1_lvl,
				      wm8993->pdata.micbias2_lvl);
			     
	ret = wm8993_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
	if (ret != 0)
		goto err_enable;

	wm8993_dai.dev = codec->dev;

	ret = snd_soc_register_dai(&wm8993_dai);
	if (ret != 0)
		goto err_bias;

	ret = snd_soc_register_codec(codec);

	return 0;

err_bias:
	wm8993_set_bias_level(codec, SND_SOC_BIAS_OFF);
err_enable:
	regulator_bulk_disable(ARRAY_SIZE(wm8993->supplies), wm8993->supplies);
err_get:
	regulator_bulk_free(ARRAY_SIZE(wm8993->supplies), wm8993->supplies);
err:
	wm8993_codec = NULL;
	kfree(wm8993);
	return ret;
}
开发者ID:KaZoom,项目名称:buildroot-linux-kernel-m3,代码行数:101,代码来源:wm8993.c


示例18: sunxi_spdif_dev_probe


//.........这里部分代码省略.........
	if(script_get_item("spdif0", "spdif_voltage", &spdif_voltage) != SCIRPT_ITEM_VALUE_TYPE_STR){
		printk("[aif3_voltage]script_get_item return type err\n");
		return -EFAULT;
	}
	/*spdif:dcdc1*/
	spdif_vol = regulator_get(NULL, spdif_voltage.str);
	if (!spdif_vol) {
		printk("get audio spdif_vol failed\n");
		return -EFAULT;
	}
	//regulator_set_voltage(spdif_vol, 3000000, 3000000);
	regulator_enable(spdif_vol);
	#endif

	sunxi_spdif.regs = ioremap(SUNXI_SPDIFBASE, 0x100);
	if (sunxi_spdif.regs == NULL) {
		return -ENXIO;
	}
	printk("%s, line:%d, dev_name(&pdev->dev):%s\n", __func__, __LINE__, dev_name(&pdev->dev));
	spdif_pinctrl = devm_pinctrl_get_select_default(&pdev->dev);
	if (IS_ERR_OR_NULL(spdif_pinctrl)) {
		dev_warn(&pdev->dev,
			"pins are not configured from the driver\n");
	}

    #ifdef CONFIG_ARCH_SUN8IW6
	spdif_pllx8 = clk_get(NULL, "pll_audiox8");
    if ((!spdif_pllx8)||(IS_ERR(spdif_pllx8))) {
		printk("try to get spdif_pllx8 failed\n");
	}
	if (clk_prepare_enable(spdif_pllx8)) {
		printk("enable spdif_pll2clk failed; \n");
	}
    #else
    #ifdef CONFIG_ARCH_SUN9IW1
	/*spdif pll3clk*/
	spdif_pll3clk = clk_get(NULL, "pll3");
	if ((!spdif_pll3clk)||(IS_ERR(spdif_pll3clk))) {
		printk("try to get spdif_pll3clk failed\n");
	}
	if (clk_prepare_enable(spdif_pll3clk)) {
		printk("enable spdif_pll3clk failed; \n");
	}
    #else
	spdif_pllx8 = clk_get(NULL, "pll2x8");
	if ((!spdif_pllx8)||(IS_ERR(spdif_pllx8))) {
		printk("try to get spdif_pllx8 failed\n");
	}
	if (clk_prepare_enable(spdif_pllx8)) {
		printk("enable spdif_pll2clk failed; \n");
	}
	#endif
	#endif
#ifndef CONFIG_ARCH_SUN9IW1
/********spdif pll2clk can be remove****************/
	/*spdif pll2clk*/
	spdif_pll2clk = clk_get(NULL, "pll2");
	if ((!spdif_pll2clk)||(IS_ERR(spdif_pll2clk))) {
		printk("try to get spdif_pll2clk failed\n");
	}
	if (clk_prepare_enable(spdif_pll2clk)) {
		printk("enable spdif_pll2clk failed; \n");
	}
#endif
	/*spdif module clk*/
	spdif_moduleclk = clk_get(NULL, "spdif");
	if ((!spdif_moduleclk)||(IS_ERR(spdif_moduleclk))) {
		printk("try to get spdif_moduleclk failed\n");
	}
#ifndef CONFIG_ARCH_SUN9IW1
/*******clk_set_parent can be remove*******/
	if (clk_set_parent(spdif_moduleclk, spdif_pll2clk)) {
		printk("try to set parent of spdif_moduleclk to spdif_pll2ck failed! line = %d\n",__LINE__);
	}
	if (clk_set_rate(spdif_moduleclk, 24576000/8)) {
		printk("set spdif_moduleclk clock freq to 24576000 failed! line = %d\n", __LINE__);
	}
#else
	if (clk_set_parent(spdif_moduleclk, spdif_pll3clk)) {
		printk("try to set parent of spdif_moduleclk to spdif_pll2ck failed! line = %d\n",__LINE__);
	}
	if (clk_set_rate(spdif_moduleclk, 24576000)) {
		printk("set spdif_moduleclk clock freq to 24576000 failed! line = %d\n", __LINE__);
	}
#endif
	if (clk_prepare_enable(spdif_moduleclk)) {
		printk("open spdif_moduleclk failed! line = %d\n", __LINE__);
	}
//	if (clk_reset(spdif_moduleclk, AW_CCU_CLK_NRESET)) {
//		printk("try to NRESET spdif module clk failed!\n");
//	}

	/*global enbale*/
	reg_val = readl(sunxi_spdif.regs + SUNXI_SPDIF_CTL);
	reg_val |= SUNXI_SPDIF_CTL_GEN;
	writel(reg_val, sunxi_spdif.regs + SUNXI_SPDIF_CTL);

	ret = snd_soc_register_dai(&pdev->dev, &sunxi_spdif_dai);
	return 0;
}
开发者ID:alex-deng,项目名称:a33_linux,代码行数:101,代码来源:sunxi_spdif.c


示例19: davinci_i2s_probe

static int davinci_i2s_probe 

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C++ snd_soc_unregister_platform函数代码示例发布时间:2022-05-31
下一篇:
C++ snd_printdd函数代码示例发布时间:2022-05-31
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap