static int __devexit twl6040_remove(struct platform_device *pdev) { struct twl6040 *twl6040 = platform_get_drvdata(pdev); struct twl4030_codec_data *pdata = dev_get_platdata(twl6040->dev); int audpwron = twl6040->audpwron; int naudint = twl6040->irq; twl6040_disable(twl6040); twl6040_free_irq(twl6040, TWL6040_IRQ_READY, twl6040); if (gpio_is_valid(audpwron)) gpio_free(audpwron); if (naudint) twl6040_irq_exit(twl6040); mfd_remove_devices(&pdev->dev); if (pdata->put_ext_clk32k) pdata->put_ext_clk32k(); platform_set_drvdata(pdev, NULL); kfree(twl6040); return 0; }
static int vib_suspend(struct device *dev) { struct vib_data *data = dev_get_drvdata(dev); twl6040_disable(data->twl6040); return 0; }
static void sdp4430_mcpdm_shutdown(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; struct snd_soc_codec *codec = rtd->codec; struct twl6040 *twl6040 = codec->control_data; /* TWL6040 supplies McPDM PAD_CLKS */ twl6040_disable(twl6040); }
static int sdp4430_mcpdm_startup(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; struct snd_soc_codec *codec = rtd->codec; struct snd_soc_dai *codec_dai = rtd->codec_dai; struct twl6040 *twl6040 = codec->control_data; int clk_id, freq, ret; /* TWL6040 supplies McPDM PAD_CLKS */ ret = twl6040_enable(twl6040); if (ret) { printk(KERN_ERR "failed to enable TWL6040\n"); return ret; } if (twl6040_power_mode) { clk_id = TWL6040_HPPLL_ID; /*freq = 38400000;*/ freq = 26000000; /* * TWL6040 requires MCLK to be active as long as * high-performance mode is in use. Glitch-free mux * cannot tolerate MCLK gating */ ret = cdc_tcxo_set_req_int(CDC_TCXO_CLK2, 1); if (ret) { printk(KERN_ERR "failed to enable twl6040 MCLK\n"); goto err; } } else { clk_id = TWL6040_LPPLL_ID; freq = 32768; } /* set the codec mclk */ ret = snd_soc_dai_set_sysclk(codec_dai, clk_id, freq, SND_SOC_CLOCK_IN); if (ret) { printk(KERN_ERR "can't set codec system clock\n"); goto err; } /* low-power mode uses 32k clock, MCLK is not required */ if (!twl6040_power_mode) { ret = cdc_tcxo_set_req_int(CDC_TCXO_CLK2, 0); if (ret) printk(KERN_ERR "failed to disable twl6040 MCLK\n"); } return 0; err: twl6040_disable(twl6040); return ret; }
static void twl6040_vib_power_work(struct work_struct *work) { mutex_lock(&misc_data->power_mutex); if (misc_data->powered) { twl6040_disable(misc_data->twl6040); misc_data->powered = false; } mutex_unlock(&misc_data->power_mutex); }
static int __devexit twl6040_vibra_remove(struct platform_device *pdev) { struct vibra_info *info = platform_get_drvdata(pdev); twl6040_disable(info->twl6040); input_unregister_device(info->input_dev); kfree(info); platform_set_drvdata(pdev, NULL); return 0; }
static int vib_remove(struct platform_device *pdev) { struct vib_data *data = platform_get_drvdata(pdev); if (data->pdata->exit) data->pdata->exit(); twl6040_disable(data->twl6040); timed_output_dev_unregister(&data->dev); kfree(data); return 0; }
static void sdp4430_mcpdm_twl6040_post(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; struct snd_soc_codec *codec = rtd->codec; struct twl6040 *twl6040 = codec->control_data; int ret; /* TWL6040 supplies McPDM PAD_CLKS */ twl6040_disable(twl6040); /* enable internal 32kHz oscillator */ twl6040_set_bits(twl6040, TWL6040_REG_ACCCTL, TWL6040_CLK32KSEL); /* disable external 32kHz clock */ ret = regulator_disable(twl6040_clk32kreg); if (ret) printk(KERN_ERR "failed to disable TWL6040 CLK32K\n"); }
static int sdp4430_mcpdm_startup(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; struct snd_soc_codec *codec = rtd->codec; struct snd_soc_dai *codec_dai = rtd->codec_dai; struct twl6040 *twl6040 = codec->control_data; int clk_id, freq, ret; /* TWL6040 supplies McPDM PAD_CLKS */ ret = twl6040_enable(twl6040); if (ret) { printk(KERN_ERR "failed to enable TWL6040\n"); return ret; } if (twl6040_power_mode) { clk_id = TWL6040_HPPLL_ID; freq = 38400000; } else { clk_id = TWL6040_LPPLL_ID; freq = 32768; } /* set the codec mclk */ ret = snd_soc_dai_set_sysclk(codec_dai, clk_id, freq, SND_SOC_CLOCK_IN); if (ret) { printk(KERN_ERR "can't set codec system clock\n"); goto err; } return 0; err: twl6040_disable(twl6040); return ret; }
static int twl6040_set_bias_level(struct snd_soc_codec *codec, enum snd_soc_bias_level level) { struct twl6040_codec *twl6040 = codec->control_data; struct twl6040_data *priv = snd_soc_codec_get_drvdata(codec); switch (level) { case SND_SOC_BIAS_ON: break; case SND_SOC_BIAS_PREPARE: break; case SND_SOC_BIAS_STANDBY: if (priv->codec_powered) break; twl6040_enable(twl6040); priv->codec_powered = 1; /* initialize vdd/vss registers with reg_cache */ twl6040_init_vdd_regs(codec); break; case SND_SOC_BIAS_OFF: if (!priv->codec_powered) break; twl6040_disable(twl6040); priv->codec_powered = 0; break; } priv->pll = twl6040_get_pll(twl6040); priv->sysclk = twl6040_get_sysclk(twl6040); codec->dapm->bias_level = level; return 0; }
static void sdp4430_dmic_shutdown(struct snd_pcm_substream *substream) { struct twl6040 *twl6040 = twl6040_codec->control_data; twl6040_disable(twl6040); }