static int msm_dai_q6_dai_auxpcm_remove(struct snd_soc_dai *dai)
{
	struct msm_dai_q6_dai_data *dai_data;
	int rc;

	dai_data = dev_get_drvdata(dai->dev);

	mutex_lock(&aux_pcm_mutex);

	if (aux_pcm_count == 0) {
		dev_dbg(dai->dev, "%s(): dai->id %d aux_pcm_count is 0. clean"
				" up and return\n", __func__, dai->id);
		goto done;
	}

	aux_pcm_count--;

	if (aux_pcm_count > 0) {
		dev_dbg(dai->dev, "%s(): dai->id %d aux_pcm_count = %d\n",
			__func__, dai->id, aux_pcm_count);
		goto done;
	} else if (aux_pcm_count < 0) {
		dev_err(dai->dev, "%s(): ERROR: dai->id %d"
			" aux_pcm_count = %d < 0\n",
			__func__, dai->id, aux_pcm_count);
		goto done;
	}

	dev_dbg(dai->dev, "%s(): dai->id %d aux_pcm_count = %d."
			"closing afe\n",
		__func__, dai->id, aux_pcm_count);

	rc = afe_close(PCM_RX); /* can block */
	if (IS_ERR_VALUE(rc))
		dev_err(dai->dev, "fail to close AUX PCM RX AFE port\n");

	rc = afe_close(PCM_TX);
	if (IS_ERR_VALUE(rc))
		dev_err(dai->dev, "fail to close AUX PCM TX AFE port\n");

done:
	kfree(dai_data);
	snd_soc_unregister_dai(dai->dev);

	mutex_unlock(&aux_pcm_mutex);

	return 0;
}
static __devexit int wm8903_i2c_remove(struct i2c_client *client)
{
	struct snd_soc_codec *codec = i2c_get_clientdata(client);

	snd_soc_unregister_dai(&wm8903_dai);
	snd_soc_unregister_codec(codec);

	wm8903_set_bias_level(codec, SND_SOC_BIAS_OFF);

	kfree(codec->private_data);

	wm8903_codec = NULL;
	wm8903_dai.dev = NULL;

	return 0;
}
static __devexit int s3c64xx_i2sv4_dev_remove(struct platform_device *pdev)
{
	struct s3c_i2sv2_info *i2s = &s3c64xx_i2sv4;
	struct resource *res;

	snd_soc_unregister_dai(&pdev->dev);
	clk_put(i2s->iis_cclk);

	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	if (res)
		release_mem_region(res->start, resource_size(res));
	else
		dev_warn(&pdev->dev, "Unable to get I2S SFR address\n");
		
	return 0;
}
static int davinci_mcasp_remove(struct platform_device *pdev)
{
	struct davinci_audio_dev *dev = dev_get_drvdata(&pdev->dev);
	struct resource *mem;

	snd_soc_unregister_dai(&pdev->dev);
	pm_runtime_put_sync(&pdev->dev);
	pm_runtime_disable(&pdev->dev);
	mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	release_mem_region(mem->start, resource_size(mem));
	if (dev->version == MCASP_VERSION_3)
		kfree(dev->xrsrctl);
	kfree(dev);

	return 0;
}
Exemple #5
0
static int fsl_ssi_remove(struct platform_device *pdev)
{
	struct fsl_ssi_private *ssi_private = dev_get_drvdata(&pdev->dev);

	platform_device_unregister(ssi_private->pdev);
	snd_soc_unregister_dai(&pdev->dev);
	device_remove_file(&pdev->dev, &ssi_private->dev_attr);

	free_irq(ssi_private->irq, ssi_private);
	irq_dispose_mapping(ssi_private->irq);

	kfree(ssi_private);
	dev_set_drvdata(&pdev->dev, NULL);

	return 0;
}
Exemple #6
0
static __devexit int kirkwood_i2s_dev_remove(struct platform_device *pdev)
{
	struct kirkwood_dma_data *priv = dev_get_drvdata(&pdev->dev);

	snd_soc_unregister_dai(&pdev->dev);
	if (!IS_ERR(priv->extclk)) {
		clk_disable_unprepare(priv->extclk);
		clk_put(priv->extclk);	
	}
	clk_disable_unprepare(priv->clk);
	clk_put(priv->clk);	
	iounmap(priv->io);
	release_mem_region(priv->mem->start, SZ_16K);
	kfree(priv);

	return 0;
}
Exemple #7
0
static int __devexit jz4740_i2s_dev_remove(struct platform_device *pdev)
{
	struct jz4740_i2s *i2s = platform_get_drvdata(pdev);

	snd_soc_unregister_dai(&pdev->dev);

	clk_put(i2s->clk_i2s);
	clk_put(i2s->clk_aic);

	iounmap(i2s->base);
	release_mem_region(i2s->mem->start, resource_size(i2s->mem));

	platform_set_drvdata(pdev, NULL);
	kfree(i2s);

	return 0;
}
static int davinci_mcasp_remove(struct platform_device *pdev)
{
	struct davinci_audio_dev *dev = dev_get_drvdata(&pdev->dev);
	struct resource *mem;

	snd_soc_unregister_dai(&pdev->dev);
	clk_disable(dev->clk);
	clk_put(dev->clk);
	dev->clk = NULL;

	mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	release_mem_region(mem->start, (mem->end - mem->start) + 1);

	kfree(dev);

	return 0;
}
static int asoc_mcbsp_remove(struct platform_device *pdev)
{
	struct omap_mcbsp *mcbsp = platform_get_drvdata(pdev);

	snd_soc_unregister_dai(&pdev->dev);

	if (mcbsp->pdata->ops && mcbsp->pdata->ops->free)
		mcbsp->pdata->ops->free(mcbsp->id);

	omap_mcbsp_sysfs_remove(mcbsp);

	clk_put(mcbsp->fclk);

	platform_set_drvdata(pdev, NULL);

	return 0;
}
Exemple #10
0
static int __devexit mxs_saif_remove(struct platform_device *pdev)
{
	struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	struct mxs_saif *saif = platform_get_drvdata(pdev);

	platform_device_unregister(saif->soc_platform_pdev);

	snd_soc_unregister_dai(&pdev->dev);

	iounmap(saif->base);
	release_mem_region(res->start, resource_size(res));
	free_irq(saif->irq, saif);

	clk_put(saif->clk);
	kfree(saif);

	return 0;
}
Exemple #11
0
static int __devexit au1xpsc_i2s_drvremove(struct platform_device *pdev)
{
	struct au1xpsc_audio_data *wd = platform_get_drvdata(pdev);
	struct resource *r = platform_get_resource(pdev, IORESOURCE_MEM, 0);

	snd_soc_unregister_dai(&pdev->dev);

	au_writel(0, I2S_CFG(wd));
	au_sync();
	au_writel(PSC_CTRL_DISABLE, PSC_CTRL(wd));
	au_sync();

	iounmap(wd->mmio);
	release_mem_region(r->start, resource_size(r));
	kfree(wd);

	return 0;
}
Exemple #12
0
static int davinci_mcasp_remove(struct platform_device *pdev)
{
	struct snd_platform_data *pdata = pdev->dev.platform_data;
	struct davinci_audio_dev *dev;
	struct resource *mem;

	snd_soc_unregister_dai(&davinci_mcasp_dai[pdata->op_mode]);
	dev = davinci_mcasp_dai[pdata->op_mode].private_data;
	clk_disable(dev->clk);
	clk_put(dev->clk);
	dev->clk = NULL;

	mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	release_mem_region(mem->start, (mem->end - mem->start) + 1);

	kfree(dev);

	return 0;
}
Exemple #13
0
static __devexit int s3c_pcm_dev_remove(struct platform_device *pdev)
{
	struct s3c_pcm_info *pcm = &s3c_pcm[pdev->id];
	struct resource *mem_res;

	snd_soc_unregister_dai(&pdev->dev);

	iounmap(pcm->regs);

	mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	release_mem_region(mem_res->start, resource_size(mem_res));

	clk_disable(pcm->cclk);
	clk_disable(pcm->pclk);
	clk_put(pcm->pclk);
	clk_put(pcm->cclk);

	return 0;
}
Exemple #14
0
static int __devexit tegra_spdif_platform_remove(struct platform_device *pdev)
{
	struct tegra_spdif *spdif = dev_get_drvdata(&pdev->dev);
	struct resource *res;

	snd_soc_unregister_dai(&pdev->dev);

	tegra_spdif_debug_remove(spdif);

	iounmap(spdif->regs);

	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	release_mem_region(res->start, resource_size(res));

	clk_put(spdif->clk_spdif_out);

	kfree(spdif);

	return 0;
}
static __devexit int spdif_remove(struct platform_device *pdev)
{
	struct snd_soc_dai *dai = &samsung_spdif_dai;
	struct samsung_spdif_info *spdif = &spdif_info;
	struct resource *mem_res;

	snd_soc_unregister_dai(dai);

	iounmap(spdif->regs);

	mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	release_mem_region(mem_res->start, resource_size(mem_res));

	clk_disable(spdif->pclk);
	clk_disable(spdif->sclk);
	clk_put(spdif->pclk);
	clk_put(spdif->sclk);

	return 0;
}
Exemple #16
0
static int __devexit twl6040_codec_remove(struct platform_device *pdev)
{
	struct twl6040_data *priv = snd_soc_codec_get_drvdata(twl6040_codec);
	int audpwron = priv->audpwron;
	int naudint = priv->naudint;

	if (gpio_is_valid(audpwron))
		gpio_free(audpwron);

	if (naudint)
		free_irq(naudint, twl6040_codec);

	snd_soc_unregister_dai(&twl6040_dai);
	snd_soc_unregister_codec(twl6040_codec);

	kfree(twl6040_codec);
	twl6040_codec = NULL;

	return 0;
}
Exemple #17
0
static int msm_dai_q6_hdmi_dai_remove(struct snd_soc_dai *dai)
{
	struct msm_dai_q6_hdmi_dai_data *dai_data;
	int rc;

	dai_data = dev_get_drvdata(dai->dev);

	/* If AFE port is still up, close it */
	if (test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) {
		rc = afe_close(dai->id); /* can block */

		if (IS_ERR_VALUE(rc))
			dev_err(dai->dev, "fail to close AFE port\n");

		clear_bit(STATUS_PORT_STARTED, dai_data->status_mask);
	}
	kfree(dai_data);
	snd_soc_unregister_dai(dai->dev);

	return 0;
}
static int __devexit asoc_dmic_remove(struct platform_device *pdev)
{
	struct tegra_dmic *dmic = platform_get_drvdata(pdev);
	struct resource *res;

	tegra_dmic_debug_remove(dmic);
	snd_soc_unregister_dai(&pdev->dev);
	iounmap(dmic->io_base);
	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	release_mem_region(res->start, resource_size(res));

	if (dmic->parent)
		clk_put(dmic->parent);

	if (dmic->clk)
		clk_put(dmic->clk);

	kfree(dmic);

	return 0;
}
static int __devexit sun7i_pcm_dev_remove(struct platform_device *pdev)
{
	if(pcm_used) {
		pcm_used = 0;
		if ((NULL == i2s_moduleclk) ||(IS_ERR(i2s_moduleclk))) {
			printk("i2s_moduleclk handle is invalid, just return\n");
			return -EFAULT;
		} else {
		/*release the module clock*/
		clk_disable(i2s_moduleclk);
		}
		if ((NULL == i2s_pllx8) ||(IS_ERR(i2s_pllx8))) {
			printk("i2s_pllx8 handle is invalid, just return\n");
			return -EFAULT;
		} else {
		/*release pllx8clk*/
		clk_put(i2s_pllx8);
		}
		if ((NULL == i2s_pll2clk) ||(IS_ERR(i2s_pll2clk))) {
			printk("i2s_pll2clk handle is invalid, just return\n");
			return -EFAULT;
		} else {
		/*release pll2clk*/
		clk_put(i2s_pll2clk);
		}
		if ((NULL == i2s_apbclk) ||(IS_ERR(i2s_apbclk))) {
			printk("i2s_apbclk handle is invalid, just return\n");
			return -EFAULT;
		} else {		
		/*release apbclk*/
		clk_put(i2s_apbclk);
		
		/*gpio_release(i2s_handle, 2);*/		
		snd_soc_unregister_dai(&pdev->dev);
		platform_set_drvdata(pdev, NULL);
		}
	}
	return 0;
}
Exemple #20
0
static int __devexit sun4i_i2s_dev_remove(struct platform_device *pdev)
{
	if(i2s_used) {
		i2s_used = 0;
		//release the module clock
		clk_disable(i2s_moduleclk);
		
		//release pllx8clk
		clk_put(i2s_pllx8);
		
		//release pll2clk
		clk_put(i2s_pll2clk);
		
		//release apbclk
		clk_put(i2s_apbclk);
		
		gpio_release(i2s_handle, 2);		
		snd_soc_unregister_dai(&pdev->dev);
		platform_set_drvdata(pdev, NULL);
	}
	return 0;
}
static int __devexit au1xpsc_i2s_drvremove(struct platform_device *pdev)
{
	struct au1xpsc_audio_data *wd = platform_get_drvdata(pdev);

	if (wd->dmapd)
		au1xpsc_pcm_destroy(wd->dmapd);

	snd_soc_unregister_dai(&au1xpsc_i2s_dai);

	au_writel(0, I2S_CFG(wd));
	au_sync();
	au_writel(PSC_CTRL_DISABLE, PSC_CTRL(wd));
	au_sync();

	iounmap(wd->mmio);
	release_resource(wd->ioarea);
	kfree(wd->ioarea);
	kfree(wd);

	au1xpsc_i2s_workdata = NULL;	/* MDEV */

	return 0;
}
Exemple #22
0
static int __devinit fsl_ssi_probe(struct platform_device *pdev,
				   const struct of_device_id *match)
{
	struct fsl_ssi_private *ssi_private;
	int ret = 0;
	struct device_attribute *dev_attr = NULL;
	struct device_node *np = pdev->dev.of_node;
	const char *p, *sprop;
	const uint32_t *iprop;
	struct resource res;
	char name[64];

	/* SSIs that are not connected on the board should have a
	 *      status = "disabled"
	 * property in their device tree nodes.
	 */
	if (!of_device_is_available(np))
		return -ENODEV;

	/* Check for a codec-handle property. */
	if (!of_get_property(np, "codec-handle", NULL)) {
		dev_err(&pdev->dev, "missing codec-handle property\n");
		return -ENODEV;
	}

	/* We only support the SSI in "I2S Slave" mode */
	sprop = of_get_property(np, "fsl,mode", NULL);
	if (!sprop || strcmp(sprop, "i2s-slave")) {
		dev_notice(&pdev->dev, "mode %s is unsupported\n", sprop);
		return -ENODEV;
	}

	/* The DAI name is the last part of the full name of the node. */
	p = strrchr(np->full_name, '/') + 1;
	ssi_private = kzalloc(sizeof(struct fsl_ssi_private) + strlen(p),
			      GFP_KERNEL);
	if (!ssi_private) {
		dev_err(&pdev->dev, "could not allocate DAI object\n");
		return -ENOMEM;
	}

	strcpy(ssi_private->name, p);

	/* Initialize this copy of the CPU DAI driver structure */
	memcpy(&ssi_private->cpu_dai_drv, &fsl_ssi_dai_template,
	       sizeof(fsl_ssi_dai_template));
	ssi_private->cpu_dai_drv.name = ssi_private->name;

	/* Get the addresses and IRQ */
	ret = of_address_to_resource(np, 0, &res);
	if (ret) {
		dev_err(&pdev->dev, "could not determine device resources\n");
		kfree(ssi_private);
		return ret;
	}
	ssi_private->ssi = ioremap(res.start, 1 + res.end - res.start);
	ssi_private->ssi_phys = res.start;
	ssi_private->irq = irq_of_parse_and_map(np, 0);

	/* Are the RX and the TX clocks locked? */
	if (of_find_property(np, "fsl,ssi-asynchronous", NULL))
		ssi_private->asynchronous = 1;
	else
		ssi_private->cpu_dai_drv.symmetric_rates = 1;

	/* Determine the FIFO depth. */
	iprop = of_get_property(np, "fsl,fifo-depth", NULL);
	if (iprop)
		ssi_private->fifo_depth = *iprop;
	else
                /* Older 8610 DTs didn't have the fifo-depth property */
		ssi_private->fifo_depth = 8;

	/* Initialize the the device_attribute structure */
	dev_attr = &ssi_private->dev_attr;
	dev_attr->attr.name = "statistics";
	dev_attr->attr.mode = S_IRUGO;
	dev_attr->show = fsl_sysfs_ssi_show;

	ret = device_create_file(&pdev->dev, dev_attr);
	if (ret) {
		dev_err(&pdev->dev, "could not create sysfs %s file\n",
			ssi_private->dev_attr.attr.name);
		goto error;
	}

	/* Register with ASoC */
	dev_set_drvdata(&pdev->dev, ssi_private);

	ret = snd_soc_register_dai(&pdev->dev, &ssi_private->cpu_dai_drv);
	if (ret) {
		dev_err(&pdev->dev, "failed to register DAI: %d\n", ret);
		goto error;
	}

	/* Trigger the machine driver's probe function.  The platform driver
	 * name of the machine driver is taken from the /model property of the
	 * device tree.  We also pass the address of the CPU DAI driver
	 * structure.
	 */
	sprop = of_get_property(of_find_node_by_path("/"), "model", NULL);
	/* Sometimes the model name has a "fsl," prefix, so we strip that. */
	p = strrchr(sprop, ',');
	if (p)
		sprop = p + 1;
	snprintf(name, sizeof(name), "snd-soc-%s", sprop);
	make_lowercase(name);

	ssi_private->pdev =
		platform_device_register_data(&pdev->dev, name, 0, NULL, 0);
	if (IS_ERR(ssi_private->pdev)) {
		ret = PTR_ERR(ssi_private->pdev);
		dev_err(&pdev->dev, "failed to register platform: %d\n", ret);
		goto error;
	}

	return 0;

error:
	snd_soc_unregister_dai(&pdev->dev);
	dev_set_drvdata(&pdev->dev, NULL);
	if (dev_attr)
		device_remove_file(&pdev->dev, dev_attr);
	irq_dispose_mapping(ssi_private->irq);
	iounmap(ssi_private->ssi);
	kfree(ssi_private);

	return ret;
}
Exemple #23
0
static __devexit int msm_dai_q6_hdmi_dev_remove(struct platform_device *pdev)
{
	snd_soc_unregister_dai(&pdev->dev);
	return 0;
}
Exemple #24
0
static void __exit au1xpsc_ac97_exit(void)
{
	snd_soc_unregister_dai(&au1xpsc_ac97_dai);
}
Exemple #25
0
static __devexit int s3c2412_iis_dev_remove(struct platform_device *pdev)
{
    snd_soc_unregister_dai(&pdev->dev);
    return 0;
}
Exemple #26
0
static void __exit s3c_pcmdev_exit(void)
{
	debug_msg("%s\n", __func__);
	snd_soc_unregister_dai(&s3c_pcmdev_dai);
}
static int __init au1xpsc_i2s_drvprobe(struct platform_device *pdev)
{
	struct resource *r;
	unsigned long sel;
	int ret;
	struct au1xpsc_audio_data *wd;

	if (au1xpsc_i2s_workdata)
		return -EBUSY;

	wd = kzalloc(sizeof(struct au1xpsc_audio_data), GFP_KERNEL);
	if (!wd)
		return -ENOMEM;

	r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	if (!r) {
		ret = -ENODEV;
		goto out0;
	}

	ret = -EBUSY;
	wd->ioarea = request_mem_region(r->start, r->end - r->start + 1,
					"au1xpsc_i2s");
	if (!wd->ioarea)
		goto out0;

	wd->mmio = ioremap(r->start, 0xffff);
	if (!wd->mmio)
		goto out1;

	/* preserve PSC clock source set up by platform (dev.platform_data
	 * is already occupied by soc layer)
	 */
	sel = au_readl(PSC_SEL(wd)) & PSC_SEL_CLK_MASK;
	au_writel(PSC_CTRL_DISABLE, PSC_CTRL(wd));
	au_sync();
	au_writel(PSC_SEL_PS_I2SMODE | sel, PSC_SEL(wd));
	au_writel(0, I2S_CFG(wd));
	au_sync();

	/* preconfigure: set max rx/tx fifo depths */
	wd->cfg |= PSC_I2SCFG_RT_FIFO8 | PSC_I2SCFG_TT_FIFO8;

	/* don't wait for I2S core to become ready now; clocks may not
	 * be running yet; depending on clock input for PSC a wait might
	 * time out.
	 */

	ret = snd_soc_register_dai(&au1xpsc_i2s_dai);
	if (ret)
		goto out1;

	/* finally add the DMA device for this PSC */
	wd->dmapd = au1xpsc_pcm_add(pdev);
	if (wd->dmapd) {
		platform_set_drvdata(pdev, wd);
		au1xpsc_i2s_workdata = wd;
		return 0;
	}

	snd_soc_unregister_dai(&au1xpsc_i2s_dai);
out1:
	release_resource(wd->ioarea);
	kfree(wd->ioarea);
out0:
	kfree(wd);
	return ret;
}
Exemple #28
0
static void __exit jzcodec_exit(void)
{
	snd_soc_unregister_dai(&jzcodec_dai);
}
Exemple #29
0
static int __devexit asoc_mcbsp_remove(struct platform_device *pdev)
{
	snd_soc_unregister_dai(&pdev->dev);
	return 0;
}
static void __exit s3c24xx_i2s_exit(void)
{
	snd_soc_unregister_dai(&s3c24xx_i2s_dai);
}