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; }
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; }
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; }
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; }
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; }
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; }
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; }
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; }
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; }
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; }
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; }
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; }
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; }
static __devexit int msm_dai_q6_hdmi_dev_remove(struct platform_device *pdev) { snd_soc_unregister_dai(&pdev->dev); return 0; }
static void __exit au1xpsc_ac97_exit(void) { snd_soc_unregister_dai(&au1xpsc_ac97_dai); }
static __devexit int s3c2412_iis_dev_remove(struct platform_device *pdev) { snd_soc_unregister_dai(&pdev->dev); return 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; }
static void __exit jzcodec_exit(void) { snd_soc_unregister_dai(&jzcodec_dai); }
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); }