mirror of
https://github.com/ukui/kernel.git
synced 2026-03-09 10:07:04 -07:00
Merge remote-tracking branches 'asoc/topic/rt5614', 'asoc/topic/rt5645', 'asoc/topic/rt5651', 'asoc/topic/rt5665' and 'asoc/topic/rt5670' into asoc-next
This commit is contained in:
@@ -21,8 +21,10 @@ struct rt5645_platform_data {
|
||||
/* 0 = IN2P; 1 = GPIO6; 2 = GPIO10; 3 = GPIO12 */
|
||||
|
||||
unsigned int jd_mode;
|
||||
/* Invert JD when jack insert */
|
||||
bool jd_invert;
|
||||
/* Use level triggered irq */
|
||||
bool level_trigger_irq;
|
||||
/* Invert JD1_1 status polarity */
|
||||
bool inv_jd1_1;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -396,14 +396,14 @@ static const char * const rt5514_dmic_src[] = {
|
||||
"DMIC1", "DMIC2"
|
||||
};
|
||||
|
||||
static const SOC_ENUM_SINGLE_DECL(
|
||||
static SOC_ENUM_SINGLE_DECL(
|
||||
rt5514_stereo1_dmic_enum, RT5514_DIG_SOURCE_CTRL,
|
||||
RT5514_AD0_DMIC_INPUT_SEL_SFT, rt5514_dmic_src);
|
||||
|
||||
static const struct snd_kcontrol_new rt5514_sto1_dmic_mux =
|
||||
SOC_DAPM_ENUM("Stereo1 DMIC Source", rt5514_stereo1_dmic_enum);
|
||||
|
||||
static const SOC_ENUM_SINGLE_DECL(
|
||||
static SOC_ENUM_SINGLE_DECL(
|
||||
rt5514_stereo2_dmic_enum, RT5514_DIG_SOURCE_CTRL,
|
||||
RT5514_AD1_DMIC_INPUT_SEL_SFT, rt5514_dmic_src);
|
||||
|
||||
|
||||
@@ -34,6 +34,17 @@
|
||||
#include "rl6231.h"
|
||||
#include "rt5645.h"
|
||||
|
||||
#define QUIRK_INV_JD1_1(q) ((q) & 1)
|
||||
#define QUIRK_LEVEL_IRQ(q) (((q) >> 1) & 1)
|
||||
#define QUIRK_IN2_DIFF(q) (((q) >> 2) & 1)
|
||||
#define QUIRK_JD_MODE(q) (((q) >> 4) & 7)
|
||||
#define QUIRK_DMIC1_DATA_PIN(q) (((q) >> 8) & 3)
|
||||
#define QUIRK_DMIC2_DATA_PIN(q) (((q) >> 12) & 3)
|
||||
|
||||
static unsigned int quirk = -1;
|
||||
module_param(quirk, uint, 0444);
|
||||
MODULE_PARM_DESC(quirk, "RT5645 pdata quirk override");
|
||||
|
||||
#define RT5645_DEVICE_ID 0x6308
|
||||
#define RT5650_DEVICE_ID 0x6419
|
||||
|
||||
@@ -59,7 +70,7 @@ static const struct regmap_range_cfg rt5645_ranges[] = {
|
||||
|
||||
static const struct reg_sequence init_list[] = {
|
||||
{RT5645_PR_BASE + 0x3d, 0x3600},
|
||||
{RT5645_PR_BASE + 0x1c, 0xfd20},
|
||||
{RT5645_PR_BASE + 0x1c, 0xfd70},
|
||||
{RT5645_PR_BASE + 0x20, 0x611f},
|
||||
{RT5645_PR_BASE + 0x21, 0x4040},
|
||||
{RT5645_PR_BASE + 0x23, 0x0004},
|
||||
@@ -3151,7 +3162,7 @@ static int rt5645_jack_detect(struct snd_soc_codec *codec, int jack_insert)
|
||||
snd_soc_dapm_sync(dapm);
|
||||
rt5645->jack_type = SND_JACK_HEADPHONE;
|
||||
}
|
||||
if (rt5645->pdata.jd_invert)
|
||||
if (rt5645->pdata.level_trigger_irq)
|
||||
regmap_update_bits(rt5645->regmap, RT5645_IRQ_CTRL2,
|
||||
RT5645_JD_1_1_MASK, RT5645_JD_1_1_NOR);
|
||||
} else { /* jack out */
|
||||
@@ -3172,7 +3183,7 @@ static int rt5645_jack_detect(struct snd_soc_codec *codec, int jack_insert)
|
||||
snd_soc_dapm_disable_pin(dapm, "LDO2");
|
||||
snd_soc_dapm_disable_pin(dapm, "Mic Det Power");
|
||||
snd_soc_dapm_sync(dapm);
|
||||
if (rt5645->pdata.jd_invert)
|
||||
if (rt5645->pdata.level_trigger_irq)
|
||||
regmap_update_bits(rt5645->regmap, RT5645_IRQ_CTRL2,
|
||||
RT5645_JD_1_1_MASK, RT5645_JD_1_1_INV);
|
||||
}
|
||||
@@ -3238,24 +3249,16 @@ static void rt5645_jack_detect_work(struct work_struct *work)
|
||||
snd_soc_jack_report(rt5645->mic_jack,
|
||||
report, SND_JACK_MICROPHONE);
|
||||
return;
|
||||
case 1: /* 2 port */
|
||||
val = snd_soc_read(rt5645->codec, RT5645_A_JD_CTRL1) & 0x0070;
|
||||
break;
|
||||
default: /* 1 port */
|
||||
val = snd_soc_read(rt5645->codec, RT5645_A_JD_CTRL1) & 0x0020;
|
||||
default: /* read rt5645 jd1_1 status */
|
||||
val = snd_soc_read(rt5645->codec, RT5645_INT_IRQ_ST) & 0x1000;
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
switch (val) {
|
||||
/* jack in */
|
||||
case 0x30: /* 2 port */
|
||||
case 0x0: /* 1 port or 2 port */
|
||||
if (rt5645->jack_type == 0) {
|
||||
report = rt5645_jack_detect(rt5645->codec, 1);
|
||||
/* for push button and jack out */
|
||||
break;
|
||||
}
|
||||
if (!val && (rt5645->jack_type == 0)) { /* jack in */
|
||||
report = rt5645_jack_detect(rt5645->codec, 1);
|
||||
} else if (!val && rt5645->jack_type != 0) {
|
||||
/* for push button and jack out */
|
||||
btn_type = 0;
|
||||
if (snd_soc_read(rt5645->codec, RT5645_INT_IRQ_ST) & 0x4) {
|
||||
/* button pressed */
|
||||
@@ -3302,19 +3305,12 @@ static void rt5645_jack_detect_work(struct work_struct *work)
|
||||
mod_timer(&rt5645->btn_check_timer,
|
||||
msecs_to_jiffies(100));
|
||||
}
|
||||
|
||||
break;
|
||||
/* jack out */
|
||||
case 0x70: /* 2 port */
|
||||
case 0x10: /* 2 port */
|
||||
case 0x20: /* 1 port */
|
||||
} else {
|
||||
/* jack out */
|
||||
report = 0;
|
||||
snd_soc_update_bits(rt5645->codec,
|
||||
RT5645_INT_IRQ_ST, 0x1, 0x0);
|
||||
rt5645_jack_detect(rt5645->codec, 0);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
snd_soc_jack_report(rt5645->hp_jack, report, SND_JACK_HEADPHONE);
|
||||
@@ -3601,7 +3597,7 @@ static struct rt5645_platform_data buddy_platform_data = {
|
||||
.dmic1_data_pin = RT5645_DMIC_DATA_GPIO5,
|
||||
.dmic2_data_pin = RT5645_DMIC_DATA_IN2P,
|
||||
.jd_mode = 3,
|
||||
.jd_invert = true,
|
||||
.level_trigger_irq = true,
|
||||
};
|
||||
|
||||
static struct dmi_system_id dmi_platform_intel_broadwell[] = {
|
||||
@@ -3614,6 +3610,33 @@ static struct dmi_system_id dmi_platform_intel_broadwell[] = {
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct rt5645_platform_data gpd_win_platform_data = {
|
||||
.jd_mode = 3,
|
||||
.inv_jd1_1 = true,
|
||||
};
|
||||
|
||||
static const struct dmi_system_id dmi_platform_gpd_win[] = {
|
||||
{
|
||||
/*
|
||||
* Match for the GPDwin which unfortunately uses somewhat
|
||||
* generic dmi strings, which is why we test for 4 strings.
|
||||
* Comparing against 23 other byt/cht boards, board_vendor
|
||||
* and board_name are unique to the GPDwin, where as only one
|
||||
* other board has the same board_serial and 3 others have
|
||||
* the same default product_name. Also the GPDwin is the
|
||||
* only device to have both board_ and product_name not set.
|
||||
*/
|
||||
.ident = "GPD Win",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "AMI Corporation"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "Default string"),
|
||||
DMI_MATCH(DMI_BOARD_SERIAL, "Default string"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "Default string"),
|
||||
},
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
static bool rt5645_check_dp(struct device *dev)
|
||||
{
|
||||
if (device_property_present(dev, "realtek,in2-differential") ||
|
||||
@@ -3664,6 +3687,17 @@ static int rt5645_i2c_probe(struct i2c_client *i2c,
|
||||
rt5645_parse_dt(rt5645, &i2c->dev);
|
||||
else if (dmi_check_system(dmi_platform_intel_braswell))
|
||||
rt5645->pdata = general_platform_data;
|
||||
else if (dmi_check_system(dmi_platform_gpd_win))
|
||||
rt5645->pdata = gpd_win_platform_data;
|
||||
|
||||
if (quirk != -1) {
|
||||
rt5645->pdata.in2_diff = QUIRK_IN2_DIFF(quirk);
|
||||
rt5645->pdata.level_trigger_irq = QUIRK_LEVEL_IRQ(quirk);
|
||||
rt5645->pdata.inv_jd1_1 = QUIRK_INV_JD1_1(quirk);
|
||||
rt5645->pdata.jd_mode = QUIRK_JD_MODE(quirk);
|
||||
rt5645->pdata.dmic1_data_pin = QUIRK_DMIC1_DATA_PIN(quirk);
|
||||
rt5645->pdata.dmic2_data_pin = QUIRK_DMIC2_DATA_PIN(quirk);
|
||||
}
|
||||
|
||||
rt5645->gpiod_hp_det = devm_gpiod_get_optional(&i2c->dev, "hp-detect",
|
||||
GPIOD_IN);
|
||||
@@ -3745,6 +3779,8 @@ static int rt5645_i2c_probe(struct i2c_client *i2c,
|
||||
ret);
|
||||
}
|
||||
|
||||
regmap_update_bits(rt5645->regmap, RT5645_CLSD_OUT_CTRL, 0xc0, 0xc0);
|
||||
|
||||
if (rt5645->pdata.in2_diff)
|
||||
regmap_update_bits(rt5645->regmap, RT5645_IN2_CTRL,
|
||||
RT5645_IN_DF2, RT5645_IN_DF2);
|
||||
@@ -3848,12 +3884,16 @@ static int rt5645_i2c_probe(struct i2c_client *i2c,
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (rt5645->pdata.inv_jd1_1) {
|
||||
regmap_update_bits(rt5645->regmap, RT5645_IRQ_CTRL2,
|
||||
RT5645_JD_1_1_MASK, RT5645_JD_1_1_INV);
|
||||
}
|
||||
}
|
||||
|
||||
regmap_update_bits(rt5645->regmap, RT5645_ADDA_CLK1,
|
||||
RT5645_I2S_PD1_MASK, RT5645_I2S_PD1_2);
|
||||
|
||||
if (rt5645->pdata.jd_invert) {
|
||||
if (rt5645->pdata.level_trigger_irq) {
|
||||
regmap_update_bits(rt5645->regmap, RT5645_IRQ_CTRL2,
|
||||
RT5645_JD_1_1_MASK, RT5645_JD_1_1_INV);
|
||||
}
|
||||
|
||||
@@ -586,44 +586,6 @@ static const struct snd_kcontrol_new hpo_r_mute_control =
|
||||
SOC_DAPM_SINGLE_AUTODISABLE("Switch", RT5651_HP_VOL,
|
||||
RT5651_R_MUTE_SFT, 1, 1);
|
||||
|
||||
/* INL/R source */
|
||||
static const char * const rt5651_inl_src[] = {"IN2P", "HPOVOLLP"};
|
||||
|
||||
static SOC_ENUM_SINGLE_DECL(
|
||||
rt5651_inl_enum, RT5651_INL1_INR1_VOL,
|
||||
RT5651_INL_SEL_SFT, rt5651_inl_src);
|
||||
|
||||
static const struct snd_kcontrol_new rt5651_inl1_mux =
|
||||
SOC_DAPM_ENUM("INL1 source", rt5651_inl_enum);
|
||||
|
||||
static const char * const rt5651_inr1_src[] = {"IN2N", "HPOVOLRP"};
|
||||
|
||||
static SOC_ENUM_SINGLE_DECL(
|
||||
rt5651_inr1_enum, RT5651_INL1_INR1_VOL,
|
||||
RT5651_INR_SEL_SFT, rt5651_inr1_src);
|
||||
|
||||
static const struct snd_kcontrol_new rt5651_inr1_mux =
|
||||
SOC_DAPM_ENUM("INR1 source", rt5651_inr1_enum);
|
||||
|
||||
static const char * const rt5651_inl2_src[] = {"IN3P", "OUTVOLLP"};
|
||||
|
||||
static SOC_ENUM_SINGLE_DECL(
|
||||
rt5651_inl2_enum, RT5651_INL2_INR2_VOL,
|
||||
RT5651_INL_SEL_SFT, rt5651_inl2_src);
|
||||
|
||||
static const struct snd_kcontrol_new rt5651_inl2_mux =
|
||||
SOC_DAPM_ENUM("INL2 source", rt5651_inl2_enum);
|
||||
|
||||
static const char * const rt5651_inr2_src[] = {"IN3N", "OUTVOLRP"};
|
||||
|
||||
static SOC_ENUM_SINGLE_DECL(
|
||||
rt5651_inr2_enum, RT5651_INL2_INR2_VOL,
|
||||
RT5651_INR_SEL_SFT, rt5651_inr2_src);
|
||||
|
||||
static const struct snd_kcontrol_new rt5651_inr2_mux =
|
||||
SOC_DAPM_ENUM("INR2 source", rt5651_inr2_enum);
|
||||
|
||||
|
||||
/* Stereo ADC source */
|
||||
static const char * const rt5651_stereo1_adc1_src[] = {"DD MIX", "ADC"};
|
||||
|
||||
@@ -955,11 +917,7 @@ static const struct snd_soc_dapm_widget rt5651_dapm_widgets[] = {
|
||||
RT5651_PWR_IN2_L_BIT, 0, NULL, 0),
|
||||
SND_SOC_DAPM_PGA("INR2 VOL", RT5651_PWR_VOL,
|
||||
RT5651_PWR_IN2_R_BIT, 0, NULL, 0),
|
||||
/* IN Mux */
|
||||
SND_SOC_DAPM_MUX("INL1 Mux", SND_SOC_NOPM, 0, 0, &rt5651_inl1_mux),
|
||||
SND_SOC_DAPM_MUX("INR1 Mux", SND_SOC_NOPM, 0, 0, &rt5651_inr1_mux),
|
||||
SND_SOC_DAPM_MUX("INL2 Mux", SND_SOC_NOPM, 0, 0, &rt5651_inl2_mux),
|
||||
SND_SOC_DAPM_MUX("INR2 Mux", SND_SOC_NOPM, 0, 0, &rt5651_inr2_mux),
|
||||
|
||||
/* REC Mixer */
|
||||
SND_SOC_DAPM_MIXER("RECMIXL", RT5651_PWR_MIXER, RT5651_PWR_RM_L_BIT, 0,
|
||||
rt5651_rec_l_mix, ARRAY_SIZE(rt5651_rec_l_mix)),
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -2022,7 +2022,6 @@ static const struct snd_soc_dapm_route rt5670_dapm_routes[] = {
|
||||
|
||||
{ "Stereo1 ADC MIXL", NULL, "Sto1 ADC MIXL" },
|
||||
{ "Stereo1 ADC MIXL", NULL, "ADC Stereo1 Filter" },
|
||||
{ "ADC Stereo1 Filter", NULL, "PLL1", is_sys_clk_from_pll },
|
||||
|
||||
{ "Stereo1 ADC MIXR", NULL, "Sto1 ADC MIXR" },
|
||||
{ "Stereo1 ADC MIXR", NULL, "ADC Stereo1 Filter" },
|
||||
@@ -2061,7 +2060,6 @@ static const struct snd_soc_dapm_route rt5670_dapm_routes[] = {
|
||||
|
||||
{ "Stereo2 ADC MIXL", NULL, "Stereo2 ADC LR Mux" },
|
||||
{ "Stereo2 ADC MIXL", NULL, "ADC Stereo2 Filter" },
|
||||
{ "ADC Stereo2 Filter", NULL, "PLL1", is_sys_clk_from_pll },
|
||||
|
||||
{ "Stereo2 ADC MIXR", NULL, "Sto2 ADC MIXR" },
|
||||
{ "Stereo2 ADC MIXR", NULL, "ADC Stereo2 Filter" },
|
||||
@@ -2444,10 +2442,9 @@ static int rt5670_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rt5670_set_dai_sysclk(struct snd_soc_dai *dai,
|
||||
int clk_id, unsigned int freq, int dir)
|
||||
static int rt5670_set_codec_sysclk(struct snd_soc_codec *codec, int clk_id,
|
||||
int source, unsigned int freq, int dir)
|
||||
{
|
||||
struct snd_soc_codec *codec = dai->codec;
|
||||
struct rt5670_priv *rt5670 = snd_soc_codec_get_drvdata(codec);
|
||||
unsigned int reg_val = 0;
|
||||
|
||||
@@ -2471,7 +2468,7 @@ static int rt5670_set_dai_sysclk(struct snd_soc_dai *dai,
|
||||
if (clk_id != RT5670_SCLK_S_RCCLK)
|
||||
rt5670->sysclk_src = clk_id;
|
||||
|
||||
dev_dbg(dai->dev, "Sysclk is %dHz and clock id is %d\n", freq, clk_id);
|
||||
dev_dbg(codec->dev, "Sysclk : %dHz clock id : %d\n", freq, clk_id);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -2723,7 +2720,6 @@ static int rt5670_resume(struct snd_soc_codec *codec)
|
||||
static const struct snd_soc_dai_ops rt5670_aif_dai_ops = {
|
||||
.hw_params = rt5670_hw_params,
|
||||
.set_fmt = rt5670_set_dai_fmt,
|
||||
.set_sysclk = rt5670_set_dai_sysclk,
|
||||
.set_tdm_slot = rt5670_set_tdm_slot,
|
||||
.set_pll = rt5670_set_dai_pll,
|
||||
};
|
||||
@@ -2776,6 +2772,7 @@ static struct snd_soc_codec_driver soc_codec_dev_rt5670 = {
|
||||
.resume = rt5670_resume,
|
||||
.set_bias_level = rt5670_set_bias_level,
|
||||
.idle_bias_off = true,
|
||||
.set_sysclk = rt5670_set_codec_sysclk,
|
||||
.component_driver = {
|
||||
.controls = rt5670_snd_controls,
|
||||
.num_controls = ARRAY_SIZE(rt5670_snd_controls),
|
||||
|
||||
Reference in New Issue
Block a user