Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d6b24507 authored by Takashi Iwai's avatar Takashi Iwai
Browse files

Merge branch 'for-3.3' of git://git.kernel.org/pub/scm/linux/kernel/git/lrg/asoc into topic/asoc

parents 7a748e43 e48b46ba
Loading
Loading
Loading
Loading
+46 −2
Original line number Original line Diff line number Diff line
@@ -16,6 +16,7 @@
#include <linux/tty.h>
#include <linux/tty.h>
#include <linux/slab.h>
#include <linux/slab.h>
#include <linux/module.h>
#include <linux/module.h>
#include <linux/regulator/consumer.h>


#include <sound/core.h>
#include <sound/core.h>
#include <sound/initval.h>
#include <sound/initval.h>
@@ -25,8 +26,8 @@




struct cx20442_priv {
struct cx20442_priv {
	enum snd_soc_control_type control_type;
	void *control_data;
	void *control_data;
	struct regulator *por;
};
};


#define CX20442_PM		0x0
#define CX20442_PM		0x0
@@ -324,6 +325,38 @@ static struct snd_soc_dai_driver cx20442_dai = {
	},
	},
};
};


static int cx20442_set_bias_level(struct snd_soc_codec *codec,
		enum snd_soc_bias_level level)
{
	struct cx20442_priv *cx20442 = snd_soc_codec_get_drvdata(codec);
	int err = 0;

	switch (level) {
	case SND_SOC_BIAS_PREPARE:
		if (codec->dapm.bias_level != SND_SOC_BIAS_STANDBY)
			break;
		if (IS_ERR(cx20442->por))
			err = PTR_ERR(cx20442->por);
		else
			err = regulator_enable(cx20442->por);
		break;
	case SND_SOC_BIAS_STANDBY:
		if (codec->dapm.bias_level != SND_SOC_BIAS_PREPARE)
			break;
		if (IS_ERR(cx20442->por))
			err = PTR_ERR(cx20442->por);
		else
			err = regulator_disable(cx20442->por);
		break;
	default:
		break;
	}
	if (!err)
		codec->dapm.bias_level = level;

	return err;
}

static int cx20442_codec_probe(struct snd_soc_codec *codec)
static int cx20442_codec_probe(struct snd_soc_codec *codec)
{
{
	struct cx20442_priv *cx20442;
	struct cx20442_priv *cx20442;
@@ -331,9 +364,13 @@ static int cx20442_codec_probe(struct snd_soc_codec *codec)
	cx20442 = kzalloc(sizeof(struct cx20442_priv), GFP_KERNEL);
	cx20442 = kzalloc(sizeof(struct cx20442_priv), GFP_KERNEL);
	if (cx20442 == NULL)
	if (cx20442 == NULL)
		return -ENOMEM;
		return -ENOMEM;
	snd_soc_codec_set_drvdata(codec, cx20442);


	cx20442->por = regulator_get(codec->dev, "POR");
	if (IS_ERR(cx20442->por))
		dev_warn(codec->dev, "failed to get the regulator");
	cx20442->control_data = NULL;
	cx20442->control_data = NULL;

	snd_soc_codec_set_drvdata(codec, cx20442);
	codec->hw_write = NULL;
	codec->hw_write = NULL;
	codec->card->pop_time = 0;
	codec->card->pop_time = 0;


@@ -350,6 +387,12 @@ static int cx20442_codec_remove(struct snd_soc_codec *codec)
			tty_hangup(tty);
			tty_hangup(tty);
	}
	}


	if (!IS_ERR(cx20442->por)) {
		/* should be already in STANDBY, hence disabled */
		regulator_put(cx20442->por);
	}

	snd_soc_codec_set_drvdata(codec, NULL);
	kfree(cx20442);
	kfree(cx20442);
	return 0;
	return 0;
}
}
@@ -359,6 +402,7 @@ static const u8 cx20442_reg;
static struct snd_soc_codec_driver cx20442_codec_dev = {
static struct snd_soc_codec_driver cx20442_codec_dev = {
	.probe = 	cx20442_codec_probe,
	.probe = 	cx20442_codec_probe,
	.remove = 	cx20442_codec_remove,
	.remove = 	cx20442_codec_remove,
	.set_bias_level = cx20442_set_bias_level,
	.reg_cache_default = &cx20442_reg,
	.reg_cache_default = &cx20442_reg,
	.reg_cache_size = 1,
	.reg_cache_size = 1,
	.reg_word_size = sizeof(u8),
	.reg_word_size = sizeof(u8),
+23 −0
Original line number Original line Diff line number Diff line
@@ -33,6 +33,7 @@
#include <sound/pcm.h>
#include <sound/pcm.h>
#include <sound/pcm_params.h>
#include <sound/pcm_params.h>
#include <sound/soc.h>
#include <sound/soc.h>
#include <sound/soc-dapm.h>
#include <sound/initval.h>
#include <sound/initval.h>
#include <sound/tlv.h>
#include <sound/tlv.h>


@@ -1012,6 +1013,28 @@ static int twl6040_pll_put_enum(struct snd_kcontrol *kcontrol,
	return 0;
	return 0;
}
}


int twl6040_get_dl1_gain(struct snd_soc_codec *codec)
{
	struct snd_soc_dapm_context *dapm = &codec->dapm;

	if (snd_soc_dapm_get_pin_status(dapm, "EP"))
		return -1; /* -1dB */

	if (snd_soc_dapm_get_pin_status(dapm, "HSOR") ||
		snd_soc_dapm_get_pin_status(dapm, "HSOL")) {

		u8 val = snd_soc_read(codec, TWL6040_REG_HSLCTL);
		if (val & TWL6040_HSDACMODE)
			/* HSDACL in LP mode */
			return -8; /* -8dB */
		else
			/* HSDACL in HP mode */
			return -1; /* -1dB */
	}
	return 0; /* 0dB */
}
EXPORT_SYMBOL_GPL(twl6040_get_dl1_gain);

int twl6040_get_clk_id(struct snd_soc_codec *codec)
int twl6040_get_clk_id(struct snd_soc_codec *codec)
{
{
	struct twl6040_data *priv = snd_soc_codec_get_drvdata(codec);
	struct twl6040_data *priv = snd_soc_codec_get_drvdata(codec);
+1 −0
Original line number Original line Diff line number Diff line
@@ -34,6 +34,7 @@ enum twl6040_trim {
#define TWL6040_HSF_TRIM_LEFT(x)	(x & 0x0f)
#define TWL6040_HSF_TRIM_LEFT(x)	(x & 0x0f)
#define TWL6040_HSF_TRIM_RIGHT(x)	((x >> 4) & 0x0f)
#define TWL6040_HSF_TRIM_RIGHT(x)	((x >> 4) & 0x0f)


int twl6040_get_dl1_gain(struct snd_soc_codec *codec);
void twl6040_hs_jack_detect(struct snd_soc_codec *codec,
void twl6040_hs_jack_detect(struct snd_soc_codec *codec,
			    struct snd_soc_jack *jack, int report);
			    struct snd_soc_jack *jack, int report);
int twl6040_get_clk_id(struct snd_soc_codec *codec);
int twl6040_get_clk_id(struct snd_soc_codec *codec);
+1 −0
Original line number Original line Diff line number Diff line
@@ -107,6 +107,7 @@ static struct snd_soc_dai_link am3517evm_dai = {
/* Audio machine driver */
/* Audio machine driver */
static struct snd_soc_card snd_soc_am3517evm = {
static struct snd_soc_card snd_soc_am3517evm = {
	.name = "am3517evm",
	.name = "am3517evm",
	.owner = THIS_MODULE,
	.dai_link = &am3517evm_dai,
	.dai_link = &am3517evm_dai,
	.num_links = 1,
	.num_links = 1,


+4 −5
Original line number Original line Diff line number Diff line
@@ -431,22 +431,20 @@ static int ams_delta_set_bias_level(struct snd_soc_card *card,
				    struct snd_soc_dapm_context *dapm,
				    struct snd_soc_dapm_context *dapm,
				    enum snd_soc_bias_level level)
				    enum snd_soc_bias_level level)
{
{
	struct snd_soc_codec *codec = card->rtd->codec;

	switch (level) {
	switch (level) {
	case SND_SOC_BIAS_ON:
	case SND_SOC_BIAS_ON:
	case SND_SOC_BIAS_PREPARE:
	case SND_SOC_BIAS_PREPARE:
	case SND_SOC_BIAS_STANDBY:
	case SND_SOC_BIAS_STANDBY:
		if (codec->dapm.bias_level == SND_SOC_BIAS_OFF)
		if (card->dapm.bias_level == SND_SOC_BIAS_OFF)
			ams_delta_latch2_write(AMS_DELTA_LATCH2_MODEM_NRESET,
			ams_delta_latch2_write(AMS_DELTA_LATCH2_MODEM_NRESET,
						AMS_DELTA_LATCH2_MODEM_NRESET);
						AMS_DELTA_LATCH2_MODEM_NRESET);
		break;
		break;
	case SND_SOC_BIAS_OFF:
	case SND_SOC_BIAS_OFF:
		if (codec->dapm.bias_level != SND_SOC_BIAS_OFF)
		if (card->dapm.bias_level != SND_SOC_BIAS_OFF)
			ams_delta_latch2_write(AMS_DELTA_LATCH2_MODEM_NRESET,
			ams_delta_latch2_write(AMS_DELTA_LATCH2_MODEM_NRESET,
						0);
						0);
	}
	}
	codec->dapm.bias_level = level;
	card->dapm.bias_level = level;


	return 0;
	return 0;
}
}
@@ -597,6 +595,7 @@ static struct snd_soc_dai_link ams_delta_dai_link = {
/* Audio card driver */
/* Audio card driver */
static struct snd_soc_card ams_delta_audio_card = {
static struct snd_soc_card ams_delta_audio_card = {
	.name = "AMS_DELTA",
	.name = "AMS_DELTA",
	.owner = THIS_MODULE,
	.dai_link = &ams_delta_dai_link,
	.dai_link = &ams_delta_dai_link,
	.num_links = 1,
	.num_links = 1,
	.set_bias_level = ams_delta_set_bias_level,
	.set_bias_level = ams_delta_set_bias_level,
Loading