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;
}
Example #2
0
static int vib_suspend(struct device *dev)
{
	struct vib_data *data = dev_get_drvdata(dev);

	twl6040_disable(data->twl6040);

	return 0;
}
Example #3
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);
}
Example #6
0
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;
}
Example #7
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;
}
Example #8
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");
}
Example #9
0
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;
}
Example #10
0
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;
}
Example #11
0
static void sdp4430_dmic_shutdown(struct snd_pcm_substream *substream)
{
	struct twl6040 *twl6040 = twl6040_codec->control_data;
	twl6040_disable(twl6040);
}