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

Commit 55eafeb5 authored by Mark Brown's avatar Mark Brown
Browse files

Merge remote-tracking branches 'asoc/topic/rt5665', 'asoc/topic/rt5670',...

Merge remote-tracking branches 'asoc/topic/rt5665', 'asoc/topic/rt5670', 'asoc/topic/rt5677' and 'asoc/topic/samsung' into asoc-next
Loading
Loading
Loading
Loading
+0 −6
Original line number Diff line number Diff line
@@ -7,9 +7,6 @@ Required properties:
 - model - the user-visible name of this sound complex
 - clocks - should contain entries matching clock names in the clock-names
    property
 - clock-names - should contain following entries:
    - "epll" - indicating the EPLL output clock
    - "i2s_rclk" - indicating the RCLK (root) clock of the I2S0 controller
 - samsung,audio-widgets - this property specifies off-codec audio elements
   like headphones or speakers, for details see widgets.txt
 - samsung,audio-routing - a list of the connections between audio
@@ -46,9 +43,6 @@ sound {
		"IN1", "Mic Jack",
		"Mic Jack", "MICBIAS";

	clocks = <&clock CLK_FOUT_EPLL>, <&i2s0 CLK_I2S_RCLK_SRC>;
	clock-names = "epll", "sclk_i2s";

	cpu {
		sound-dai = <&i2s0 0>;
	};

include/sound/rt5677.h

deleted100644 → 0
+0 −45
Original line number Diff line number Diff line
/*
 * linux/sound/rt5677.h -- Platform data for RT5677
 *
 * Copyright 2013 Realtek Semiconductor Corp.
 * Author: Oder Chiou <oder_chiou@realtek.com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */

#ifndef __LINUX_SND_RT5677_H
#define __LINUX_SND_RT5677_H

enum rt5677_dmic2_clk {
	RT5677_DMIC_CLK1 = 0,
	RT5677_DMIC_CLK2 = 1,
};


struct rt5677_platform_data {
	/* IN1/IN2/LOUT1/LOUT2/LOUT3 can optionally be differential */
	bool in1_diff;
	bool in2_diff;
	bool lout1_diff;
	bool lout2_diff;
	bool lout3_diff;
	/* DMIC2 clock source selection */
	enum rt5677_dmic2_clk dmic2_clk_pin;

	/* configures GPIO, 0 - floating, 1 - pulldown, 2 - pullup */
	u8 gpio_config[6];

	/* jd1 can select 0 ~ 3 as OFF, GPIO1, GPIO2 and GPIO3 respectively */
	unsigned int jd1_gpio;
	/* jd2 and jd3 can select 0 ~ 3 as
		OFF, GPIO4, GPIO5 and GPIO6 respectively */
	unsigned int jd2_gpio;
	unsigned int jd3_gpio;

	/* Set MICBIAS1 VDD 1v8 or 3v3 */
	bool micbias1_vdd_3v3;
};

#endif
+48 −5
Original line number Diff line number Diff line
@@ -1381,6 +1381,16 @@ static void rt5665_jack_detect_handler(struct work_struct *work)
	mutex_unlock(&rt5665->calibrate_mutex);
}

static const char * const rt5665_clk_sync[] = {
	"I2S1_1", "I2S1_2", "I2S2", "I2S3", "IF2 Slave", "IF3 Slave"
};

static const struct soc_enum rt5665_enum[] = {
	SOC_ENUM_SINGLE(RT5665_I2S1_SDP, 11, 5, rt5665_clk_sync),
	SOC_ENUM_SINGLE(RT5665_I2S2_SDP, 11, 5, rt5665_clk_sync),
	SOC_ENUM_SINGLE(RT5665_I2S3_SDP, 11, 5, rt5665_clk_sync),
};

static const struct snd_kcontrol_new rt5665_snd_controls[] = {
	/* Headphone Output Volume */
	SOC_DOUBLE_R_EXT_TLV("Headphone Playback Volume", RT5665_HPL_GAIN,
@@ -1392,6 +1402,9 @@ static const struct snd_kcontrol_new rt5665_snd_controls[] = {
		RT5665_L_VOL_SFT, 15, 1, snd_soc_get_volsw,
		rt5665_mono_vol_put, mono_vol_tlv),

	SOC_SINGLE_TLV("MONOVOL Playback Volume", RT5665_MONO_OUT,
		RT5665_L_VOL_SFT, 39, 1, out_vol_tlv),

	/* Output Volume */
	SOC_DOUBLE_TLV("OUT Playback Volume", RT5665_LOUT, RT5665_L_VOL_SFT,
		RT5665_R_VOL_SFT, 39, 1, out_vol_tlv),
@@ -1446,6 +1459,11 @@ static const struct snd_kcontrol_new rt5665_snd_controls[] = {
	SOC_DOUBLE_TLV("STO2 ADC Boost Gain Volume", RT5665_STO2_ADC_BOOST,
		RT5665_STO2_ADC_L_BST_SFT, RT5665_STO2_ADC_R_BST_SFT,
		3, 0, adc_bst_tlv),

	/* I2S3 CLK Source */
	SOC_ENUM("I2S1 Master Clk Sel", rt5665_enum[0]),
	SOC_ENUM("I2S2 Master Clk Sel", rt5665_enum[1]),
	SOC_ENUM("I2S3 Master Clk Sel", rt5665_enum[2]),
};

/**
@@ -4098,9 +4116,12 @@ static int rt5665_hw_params(struct snd_pcm_substream *substream,
	rt5665->lrck[dai->id] = params_rate(params);
	pre_div = rl6231_get_clk_info(rt5665->sysclk, rt5665->lrck[dai->id]);
	if (pre_div < 0) {
		dev_err(codec->dev, "Unsupported clock setting %d for DAI %d\n",
			rt5665->lrck[dai->id], dai->id);
		return -EINVAL;
		dev_warn(codec->dev, "Force using PLL");
		snd_soc_codec_set_pll(codec, 0, RT5665_PLL1_S_MCLK,
			rt5665->sysclk,	rt5665->lrck[dai->id] * 512);
		snd_soc_codec_set_sysclk(codec, RT5665_SCLK_S_PLL1, 0,
			rt5665->lrck[dai->id] * 512, 0);
		pre_div = 1;
	}
	frame_size = snd_soc_params_to_frame_size(params);
	if (frame_size < 0) {
@@ -4183,6 +4204,15 @@ static int rt5665_hw_params(struct snd_pcm_substream *substream,
		break;
	}

	if (rt5665->master[RT5665_AIF2_1] || rt5665->master[RT5665_AIF2_2]) {
		snd_soc_update_bits(codec, RT5665_I2S_M_CLK_CTRL_1,
			RT5665_I2S2_M_PD_MASK, pre_div << RT5665_I2S2_M_PD_SFT);
	}
	if (rt5665->master[RT5665_AIF3]) {
		snd_soc_update_bits(codec, RT5665_I2S_M_CLK_CTRL_1,
			RT5665_I2S3_M_PD_MASK, pre_div << RT5665_I2S3_M_PD_SFT);
	}

	return 0;
}

@@ -4259,7 +4289,7 @@ static int rt5665_set_codec_sysclk(struct snd_soc_codec *codec, int clk_id,
				   int source, unsigned int freq, int dir)
{
	struct rt5665_priv *rt5665 = snd_soc_codec_get_drvdata(codec);
	unsigned int reg_val = 0;
	unsigned int reg_val = 0, src = 0;

	if (freq == rt5665->sysclk && clk_id == rt5665->sysclk_src)
		return 0;
@@ -4267,12 +4297,15 @@ static int rt5665_set_codec_sysclk(struct snd_soc_codec *codec, int clk_id,
	switch (clk_id) {
	case RT5665_SCLK_S_MCLK:
		reg_val |= RT5665_SCLK_SRC_MCLK;
		src = RT5665_CLK_SRC_MCLK;
		break;
	case RT5665_SCLK_S_PLL1:
		reg_val |= RT5665_SCLK_SRC_PLL1;
		src = RT5665_CLK_SRC_PLL1;
		break;
	case RT5665_SCLK_S_RCCLK:
		reg_val |= RT5665_SCLK_SRC_RCCLK;
		src = RT5665_CLK_SRC_RCCLK;
		break;
	default:
		dev_err(codec->dev, "Invalid clock id (%d)\n", clk_id);
@@ -4280,6 +4313,16 @@ static int rt5665_set_codec_sysclk(struct snd_soc_codec *codec, int clk_id,
	}
	snd_soc_update_bits(codec, RT5665_GLB_CLK,
		RT5665_SCLK_SRC_MASK, reg_val);

	if (rt5665->master[RT5665_AIF2_1] || rt5665->master[RT5665_AIF2_2]) {
		snd_soc_update_bits(codec, RT5665_I2S_M_CLK_CTRL_1,
			RT5665_I2S2_SRC_MASK, src << RT5665_I2S2_SRC_SFT);
	}
	if (rt5665->master[RT5665_AIF3]) {
		snd_soc_update_bits(codec, RT5665_I2S_M_CLK_CTRL_1,
			RT5665_I2S3_SRC_MASK, src << RT5665_I2S3_SRC_SFT);
	}

	rt5665->sysclk = freq;
	rt5665->sysclk_src = clk_id;

@@ -4927,7 +4970,7 @@ MODULE_DEVICE_TABLE(of, rt5665_of_match);
#endif

#ifdef CONFIG_ACPI
static struct acpi_device_id rt5665_acpi_match[] = {
static const struct acpi_device_id rt5665_acpi_match[] = {
	{"10EC5665", 0,},
	{"10EC5666", 0,},
	{"10EC5668", 0,},
+21 −0
Original line number Diff line number Diff line
@@ -1628,6 +1628,27 @@
#define RT5665_PWR_CLK1M_PD			(0x0 << 8)
#define RT5665_PWR_CLK1M_PU			(0x1 << 8)

/* I2S Master Mode Clock Control 1 (0x00a0) */
#define RT5665_CLK_SRC_MCLK			(0x0)
#define RT5665_CLK_SRC_PLL1			(0x1)
#define RT5665_CLK_SRC_RCCLK			(0x2)
#define RT5665_I2S_PD_1				(0x0)
#define RT5665_I2S_PD_2				(0x1)
#define RT5665_I2S_PD_3				(0x2)
#define RT5665_I2S_PD_4				(0x3)
#define RT5665_I2S_PD_6				(0x4)
#define RT5665_I2S_PD_8				(0x5)
#define RT5665_I2S_PD_12			(0x6)
#define RT5665_I2S_PD_16			(0x7)
#define RT5665_I2S2_SRC_MASK			(0x3 << 12)
#define RT5665_I2S2_SRC_SFT			12
#define RT5665_I2S2_M_PD_MASK			(0x7 << 8)
#define RT5665_I2S2_M_PD_SFT			8
#define RT5665_I2S3_SRC_MASK			(0x3 << 4)
#define RT5665_I2S3_SRC_SFT			4
#define RT5665_I2S3_M_PD_MASK			(0x7 << 0)
#define RT5665_I2S3_M_PD_SFT			0


/* EQ Control 1 (0x00b0) */
#define RT5665_EQ_SRC_DAC			(0x0 << 15)
+34 −26
Original line number Diff line number Diff line
@@ -1151,20 +1151,15 @@ static const char * const rt5670_stereo_adc1_src[] = {
static SOC_ENUM_SINGLE_DECL(rt5670_stereo1_adc1_enum, RT5670_STO1_ADC_MIXER,
	RT5670_ADC_1_SRC_SFT, rt5670_stereo_adc1_src);

static const struct snd_kcontrol_new rt5670_sto_adc_l1_mux =
	SOC_DAPM_ENUM("Stereo1 ADC L1 source", rt5670_stereo1_adc1_enum);

static const struct snd_kcontrol_new rt5670_sto_adc_r1_mux =
	SOC_DAPM_ENUM("Stereo1 ADC R1 source", rt5670_stereo1_adc1_enum);
static const struct snd_kcontrol_new rt5670_sto_adc_1_mux =
	SOC_DAPM_ENUM("Stereo1 ADC 1 Mux", rt5670_stereo1_adc1_enum);

static SOC_ENUM_SINGLE_DECL(rt5670_stereo2_adc1_enum, RT5670_STO2_ADC_MIXER,
	RT5670_ADC_1_SRC_SFT, rt5670_stereo_adc1_src);

static const struct snd_kcontrol_new rt5670_sto2_adc_l1_mux =
	SOC_DAPM_ENUM("Stereo2 ADC L1 source", rt5670_stereo2_adc1_enum);
static const struct snd_kcontrol_new rt5670_sto2_adc_1_mux =
	SOC_DAPM_ENUM("Stereo2 ADC 1 Mux", rt5670_stereo2_adc1_enum);

static const struct snd_kcontrol_new rt5670_sto2_adc_r1_mux =
	SOC_DAPM_ENUM("Stereo2 ADC R1 source", rt5670_stereo2_adc1_enum);

/* MX-27 MX-26 [11] */
static const char * const rt5670_stereo_adc2_src[] = {
@@ -1174,20 +1169,15 @@ static const char * const rt5670_stereo_adc2_src[] = {
static SOC_ENUM_SINGLE_DECL(rt5670_stereo1_adc2_enum, RT5670_STO1_ADC_MIXER,
	RT5670_ADC_2_SRC_SFT, rt5670_stereo_adc2_src);

static const struct snd_kcontrol_new rt5670_sto_adc_l2_mux =
	SOC_DAPM_ENUM("Stereo1 ADC L2 source", rt5670_stereo1_adc2_enum);

static const struct snd_kcontrol_new rt5670_sto_adc_r2_mux =
	SOC_DAPM_ENUM("Stereo1 ADC R2 source", rt5670_stereo1_adc2_enum);
static const struct snd_kcontrol_new rt5670_sto_adc_2_mux =
	SOC_DAPM_ENUM("Stereo1 ADC 2 Mux", rt5670_stereo1_adc2_enum);

static SOC_ENUM_SINGLE_DECL(rt5670_stereo2_adc2_enum, RT5670_STO2_ADC_MIXER,
	RT5670_ADC_2_SRC_SFT, rt5670_stereo_adc2_src);

static const struct snd_kcontrol_new rt5670_sto2_adc_l2_mux =
	SOC_DAPM_ENUM("Stereo2 ADC L2 source", rt5670_stereo2_adc2_enum);
static const struct snd_kcontrol_new rt5670_sto2_adc_2_mux =
	SOC_DAPM_ENUM("Stereo2 ADC 2 Mux", rt5670_stereo2_adc2_enum);

static const struct snd_kcontrol_new rt5670_sto2_adc_r2_mux =
	SOC_DAPM_ENUM("Stereo2 ADC R2 source", rt5670_stereo2_adc2_enum);

/* MX-27 MX26 [10] */
static const char * const rt5670_stereo_adc_src[] = {
@@ -1642,23 +1632,23 @@ static const struct snd_soc_dapm_widget rt5670_dapm_widgets[] = {
	SND_SOC_DAPM_MUX("Stereo1 DMIC Mux", SND_SOC_NOPM, 0, 0,
			 &rt5670_sto1_dmic_mux),
	SND_SOC_DAPM_MUX("Stereo1 ADC L2 Mux", SND_SOC_NOPM, 0, 0,
			 &rt5670_sto_adc_l2_mux),
			 &rt5670_sto_adc_2_mux),
	SND_SOC_DAPM_MUX("Stereo1 ADC R2 Mux", SND_SOC_NOPM, 0, 0,
			 &rt5670_sto_adc_r2_mux),
			 &rt5670_sto_adc_2_mux),
	SND_SOC_DAPM_MUX("Stereo1 ADC L1 Mux", SND_SOC_NOPM, 0, 0,
			 &rt5670_sto_adc_l1_mux),
			 &rt5670_sto_adc_1_mux),
	SND_SOC_DAPM_MUX("Stereo1 ADC R1 Mux", SND_SOC_NOPM, 0, 0,
			 &rt5670_sto_adc_r1_mux),
			 &rt5670_sto_adc_1_mux),
	SND_SOC_DAPM_MUX("Stereo2 DMIC Mux", SND_SOC_NOPM, 0, 0,
			 &rt5670_sto2_dmic_mux),
	SND_SOC_DAPM_MUX("Stereo2 ADC L2 Mux", SND_SOC_NOPM, 0, 0,
			 &rt5670_sto2_adc_l2_mux),
			 &rt5670_sto2_adc_2_mux),
	SND_SOC_DAPM_MUX("Stereo2 ADC R2 Mux", SND_SOC_NOPM, 0, 0,
			 &rt5670_sto2_adc_r2_mux),
			 &rt5670_sto2_adc_2_mux),
	SND_SOC_DAPM_MUX("Stereo2 ADC L1 Mux", SND_SOC_NOPM, 0, 0,
			 &rt5670_sto2_adc_l1_mux),
			 &rt5670_sto2_adc_1_mux),
	SND_SOC_DAPM_MUX("Stereo2 ADC R1 Mux", SND_SOC_NOPM, 0, 0,
			 &rt5670_sto2_adc_r1_mux),
			 &rt5670_sto2_adc_1_mux),
	SND_SOC_DAPM_MUX("Stereo2 ADC LR Mux", SND_SOC_NOPM, 0, 0,
			 &rt5670_sto2_adc_lr_mux),
	SND_SOC_DAPM_MUX("Mono DMIC L Mux", SND_SOC_NOPM, 0, 0,
@@ -2743,6 +2733,7 @@ static struct snd_soc_dai_driver rt5670_dai[] = {
			.formats = RT5670_FORMATS,
		},
		.ops = &rt5670_aif_dai_ops,
		.symmetric_rates = 1,
	},
	{
		.name = "rt5670-aif2",
@@ -2762,6 +2753,7 @@ static struct snd_soc_dai_driver rt5670_dai[] = {
			.formats = RT5670_FORMATS,
		},
		.ops = &rt5670_aif_dai_ops,
		.symmetric_rates = 1,
	},
};

@@ -2859,6 +2851,17 @@ static const struct dmi_system_id dmi_platform_intel_bytcht_jdmode2[] = {
	{}
};

static const struct dmi_system_id dmi_platform_intel_bytcht_jdmode3[] = {
	{
		.ident = "Dell Venue 8 Pro 5855",
		.matches = {
			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
			DMI_MATCH(DMI_PRODUCT_NAME, "Venue 8 Pro 5855"),
		},
	},
	{}
};

static int rt5670_i2c_probe(struct i2c_client *i2c,
		    const struct i2c_device_id *id)
{
@@ -2888,6 +2891,11 @@ static int rt5670_i2c_probe(struct i2c_client *i2c,
		rt5670->pdata.dmic1_data_pin = RT5670_DMIC_DATA_IN2P;
		rt5670->pdata.dev_gpio = true;
		rt5670->pdata.jd_mode = 2;
	} else if (dmi_check_system(dmi_platform_intel_bytcht_jdmode3)) {
		rt5670->pdata.dmic_en = true;
		rt5670->pdata.dmic1_data_pin = RT5670_DMIC_DATA_IN2P;
		rt5670->pdata.dev_gpio = true;
		rt5670->pdata.jd_mode = 3;
	}

	rt5670->regmap = devm_regmap_init_i2c(i2c, &rt5670_regmap);
Loading