Commit e40c24aa authored by Jaikumar's avatar Jaikumar Committed by Phil Elwell
Browse files

Added mute stream func

parent 58eb131c
Loading
Loading
Loading
Loading
+46 −18
Original line number Diff line number Diff line
@@ -43,7 +43,9 @@
#define KATANA_CODEC_DOP		(KATANA_CODEC_VIRT_BASE + 7)
#define KATANA_CODEC_FORMAT		(KATANA_CODEC_VIRT_BASE + 8)
#define KATANA_CODEC_COMMAND		(KATANA_CODEC_VIRT_BASE + 9)
#define KATANA_CODEC_MAX_REGISTER	(KATANA_CODEC_VIRT_BASE + 9)
#define KATANA_CODEC_MUTE_STREAM	(KATANA_CODEC_VIRT_BASE + 10)

#define KATANA_CODEC_MAX_REGISTER	(KATANA_CODEC_VIRT_BASE + 10)

#define KATANA_CODEC_FMT		0xff
#define KATANA_CODEC_CHAN_MONO		0x00
@@ -135,7 +137,8 @@ static const struct snd_kcontrol_new katana_codec_controls[] = {
	SOC_SINGLE("DoP Playback Switch", KATANA_CODEC_DOP, 0, 1, 1)
};

static bool katana_codec_readable_register(struct device *dev, unsigned int reg)
static bool katana_codec_readable_register(struct device *dev,
				unsigned int reg)
{
	switch (reg) {
	case KATANA_CODEC_CHIP_ID_REG:
@@ -150,13 +153,15 @@ static int katana_codec_hw_params(struct snd_pcm_substream *substream,
			     struct snd_soc_dai *dai)
{
	struct snd_soc_codec *codec = dai->codec;
	struct katana_codec_priv *katana_codec = snd_soc_codec_get_drvdata(codec);
	struct katana_codec_priv *katana_codec =
				snd_soc_codec_get_drvdata(codec);
	int fmt = 0;
	int ret;

	dev_dbg(codec->dev, "hw_params %u Hz, %u channels\n",
	dev_dbg(codec->dev, "hw_params %u Hz, %u channels %u bits\n",
			params_rate(params),
			params_channels(params));
			params_channels(params),
			params_width(params));

	switch (katana_codec->fmt & SND_SOC_DAIFMT_MASTER_MASK) {
	case SND_SOC_DAIFMT_CBM_CFM: // master
@@ -212,13 +217,17 @@ static int katana_codec_hw_params(struct snd_pcm_substream *substream,
			return -EINVAL;
		}

		ret = regmap_write(katana_codec->regmap, KATANA_CODEC_FORMAT, fmt);
		ret = regmap_write(katana_codec->regmap, KATANA_CODEC_FORMAT,
					fmt);
		if (ret != 0) {
			dev_err(codec->dev, "Failed to set format: %d\n", ret);
			return ret;
		}
		break;

	case SND_SOC_DAIFMT_CBS_CFS:
		break;

	default:
		return -EINVAL;
	}
@@ -229,14 +238,33 @@ static int katana_codec_hw_params(struct snd_pcm_substream *substream,
static int katana_codec_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
{
	struct snd_soc_codec *codec = dai->codec;
	struct katana_codec_priv *katana_codec = snd_soc_codec_get_drvdata(codec);
	struct katana_codec_priv *katana_codec =
				snd_soc_codec_get_drvdata(codec);

	katana_codec->fmt = fmt;

	return 0;
}

int katana_codec_dai_mute_stream(struct snd_soc_dai *dai, int mute,
						int stream)
{
	struct snd_soc_codec *codec = dai->codec;
	struct katana_codec_priv *katana_codec =
				snd_soc_codec_get_drvdata(codec);
	int ret = 0;

	ret = regmap_write(katana_codec->regmap, KATANA_CODEC_MUTE_STREAM,
				mute);
	if (ret != 0) {
		dev_err(codec->dev, "Failed to set mute: %d\n", ret);
		return ret;
	}
	return ret;
}

static const struct snd_soc_dai_ops katana_codec_dai_ops = {
	.mute_stream = katana_codec_dai_mute_stream,
	.hw_params = katana_codec_hw_params,
	.set_fmt = katana_codec_set_fmt,
};