Merge remote-tracking branch 'asoc/topic/msm8916' into asoc-next

This commit is contained in:
Mark Brown 2017-09-01 12:12:16 +01:00
commit ab99d9872e
123 changed files with 2186 additions and 168 deletions

View File

@ -0,0 +1,16 @@
Device-Tree bindings for Digital microphone (DMIC) codec
This device support generic PDM digital microphone.
Required properties:
- compatible: should be "dmic-codec".
Optional properties:
- dmicen-gpios: GPIO specifier for dmic to control start and stop
Example node:
dmic_codec: dmic@0 {
compatible = "dmic-codec";
dmicen-gpios = <&gpio4 3 GPIO_ACTIVE_HIGH>;
};

View File

@ -31,8 +31,22 @@ Required properties
- vdd-cdc-io-supply: phandle to VDD_CDC_IO regulator DT node. - vdd-cdc-io-supply: phandle to VDD_CDC_IO regulator DT node.
- vdd-cdc-tx-rx-cx-supply: phandle to VDD_CDC_TX/RX/CX regulator DT node. - vdd-cdc-tx-rx-cx-supply: phandle to VDD_CDC_TX/RX/CX regulator DT node.
- vdd-micbias-supply: phandle of VDD_MICBIAS supply's regulator DT node. - vdd-micbias-supply: phandle of VDD_MICBIAS supply's regulator DT node.
Optional Properties: Optional Properties:
- qcom,mbhc-vthreshold-low: Array of 5 threshold voltages in mV for 5 buttons
detection on headset when the mbhc is powered up
by internal current source, this is a low power.
- qcom,mbhc-vthreshold-high: Array of 5 thresold voltages in mV for 5 buttons
detection on headset when mbhc is powered up
from micbias.
- qcom,micbias-lvl: Voltage (mV) for Mic Bias
- qcom,hphl-jack-type-normally-open: boolean, present if hphl pin on jack is a
NO (Normally Open). If not specified, then
its assumed that hphl pin on jack is NC
(Normally Closed).
- qcom,gnd-jack-type-normally-open: boolean, present if gnd pin on jack is
NO (Normally Open). If not specified, then
its assumed that gnd pin on jack is NC
(Normally Closed).
- qcom,micbias1-ext-cap: boolean, present if micbias1 has external capacitor - qcom,micbias1-ext-cap: boolean, present if micbias1 has external capacitor
connected. connected.
- qcom,micbias2-ext-cap: boolean, present if micbias2 has external capacitor - qcom,micbias2-ext-cap: boolean, present if micbias2 has external capacitor
@ -48,6 +62,8 @@ spmi_bus {
reg-names = "pmic-codec-core"; reg-names = "pmic-codec-core";
clocks = <&gcc GCC_CODEC_DIGCODEC_CLK>; clocks = <&gcc GCC_CODEC_DIGCODEC_CLK>;
clock-names = "mclk"; clock-names = "mclk";
qcom,mbhc-vthreshold-low = <75 150 237 450 500>;
qcom,mbhc-vthreshold-high = <75 150 237 450 500>;
interrupt-parent = <&spmi_bus>; interrupt-parent = <&spmi_bus>;
interrupts = <0x1 0xf0 0x0 IRQ_TYPE_NONE>, interrupts = <0x1 0xf0 0x0 IRQ_TYPE_NONE>,
<0x1 0xf0 0x1 IRQ_TYPE_NONE>, <0x1 0xf0 0x1 IRQ_TYPE_NONE>,

View File

@ -0,0 +1,33 @@
RT274 audio CODEC
This device supports I2C only.
Required properties:
- compatible : "realtek,rt274".
- reg : The I2C address of the device.
Optional properties:
- interrupts : The CODEC's interrupt output.
Pins on the device (for linking into audio routes) for RT274:
* DMIC1 Pin
* DMIC2 Pin
* MIC
* LINE1
* LINE2
* HPO Pin
* SPDIF
* LINE3
Example:
codec: rt274@1c {
compatible = "realtek,rt274";
reg = <0x1c>;
interrupts = <7 IRQ_TYPE_EDGE_FALLING>;
};

View File

@ -1355,7 +1355,7 @@ static struct regmap *pm860x_get_regmap(struct device *dev)
return pm860x->regmap; return pm860x->regmap;
} }
static struct snd_soc_codec_driver soc_codec_dev_pm860x = { static const struct snd_soc_codec_driver soc_codec_dev_pm860x = {
.probe = pm860x_probe, .probe = pm860x_probe,
.remove = pm860x_remove, .remove = pm860x_remove,
.set_bias_level = pm860x_set_bias_level, .set_bias_level = pm860x_set_bias_level,

View File

@ -71,7 +71,7 @@ config SND_SOC_ALL_CODECS
select SND_SOC_DA732X if I2C select SND_SOC_DA732X if I2C
select SND_SOC_DA9055 if I2C select SND_SOC_DA9055 if I2C
select SND_SOC_DIO2125 select SND_SOC_DIO2125
select SND_SOC_DMIC select SND_SOC_DMIC if GPIOLIB
select SND_SOC_ES8316 if I2C select SND_SOC_ES8316 if I2C
select SND_SOC_ES8328_SPI if SPI_MASTER select SND_SOC_ES8328_SPI if SPI_MASTER
select SND_SOC_ES8328_I2C if I2C select SND_SOC_ES8328_I2C if I2C
@ -114,6 +114,7 @@ config SND_SOC_ALL_CODECS
select SND_SOC_PCM5102A select SND_SOC_PCM5102A
select SND_SOC_PCM512x_I2C if I2C select SND_SOC_PCM512x_I2C if I2C
select SND_SOC_PCM512x_SPI if SPI_MASTER select SND_SOC_PCM512x_SPI if SPI_MASTER
select SND_SOC_RT274 if I2C
select SND_SOC_RT286 if I2C select SND_SOC_RT286 if I2C
select SND_SOC_RT298 if I2C select SND_SOC_RT298 if I2C
select SND_SOC_RT5514 if I2C select SND_SOC_RT5514 if I2C
@ -716,11 +717,17 @@ config SND_SOC_RL6231
config SND_SOC_RL6347A config SND_SOC_RL6347A
tristate tristate
default y if SND_SOC_RT274=y
default y if SND_SOC_RT286=y default y if SND_SOC_RT286=y
default y if SND_SOC_RT298=y default y if SND_SOC_RT298=y
default m if SND_SOC_RT274=m
default m if SND_SOC_RT286=m default m if SND_SOC_RT286=m
default m if SND_SOC_RT298=m default m if SND_SOC_RT298=m
config SND_SOC_RT274
tristate
depends on I2C
config SND_SOC_RT286 config SND_SOC_RT286
tristate tristate
depends on I2C depends on I2C

View File

@ -113,6 +113,7 @@ snd-soc-pcm512x-i2c-objs := pcm512x-i2c.o
snd-soc-pcm512x-spi-objs := pcm512x-spi.o snd-soc-pcm512x-spi-objs := pcm512x-spi.o
snd-soc-rl6231-objs := rl6231.o snd-soc-rl6231-objs := rl6231.o
snd-soc-rl6347a-objs := rl6347a.o snd-soc-rl6347a-objs := rl6347a.o
snd-soc-rt274-objs := rt274.o
snd-soc-rt286-objs := rt286.o snd-soc-rt286-objs := rt286.o
snd-soc-rt298-objs := rt298.o snd-soc-rt298-objs := rt298.o
snd-soc-rt5514-objs := rt5514.o snd-soc-rt5514-objs := rt5514.o
@ -349,6 +350,7 @@ obj-$(CONFIG_SND_SOC_PCM512x_I2C) += snd-soc-pcm512x-i2c.o
obj-$(CONFIG_SND_SOC_PCM512x_SPI) += snd-soc-pcm512x-spi.o obj-$(CONFIG_SND_SOC_PCM512x_SPI) += snd-soc-pcm512x-spi.o
obj-$(CONFIG_SND_SOC_RL6231) += snd-soc-rl6231.o obj-$(CONFIG_SND_SOC_RL6231) += snd-soc-rl6231.o
obj-$(CONFIG_SND_SOC_RL6347A) += snd-soc-rl6347a.o obj-$(CONFIG_SND_SOC_RL6347A) += snd-soc-rl6347a.o
obj-$(CONFIG_SND_SOC_RT274) += snd-soc-rt274.o
obj-$(CONFIG_SND_SOC_RT286) += snd-soc-rt286.o obj-$(CONFIG_SND_SOC_RT286) += snd-soc-rt286.o
obj-$(CONFIG_SND_SOC_RT298) += snd-soc-rt298.o obj-$(CONFIG_SND_SOC_RT298) += snd-soc-rt298.o
obj-$(CONFIG_SND_SOC_RT5514) += snd-soc-rt5514.o obj-$(CONFIG_SND_SOC_RT5514) += snd-soc-rt5514.o

View File

@ -2523,7 +2523,7 @@ static int ab8500_codec_probe(struct snd_soc_codec *codec)
return status; return status;
} }
static struct snd_soc_codec_driver ab8500_codec_driver = { static const struct snd_soc_codec_driver ab8500_codec_driver = {
.probe = ab8500_codec_probe, .probe = ab8500_codec_probe,
.component_driver = { .component_driver = {
.controls = ab8500_ctrls, .controls = ab8500_ctrls,

View File

@ -112,7 +112,7 @@ static int ac97_soc_resume(struct snd_soc_codec *codec)
#define ac97_soc_resume NULL #define ac97_soc_resume NULL
#endif #endif
static struct snd_soc_codec_driver soc_codec_dev_ac97 = { static const struct snd_soc_codec_driver soc_codec_dev_ac97 = {
.probe = ac97_soc_probe, .probe = ac97_soc_probe,
.suspend = ac97_soc_suspend, .suspend = ac97_soc_suspend,
.resume = ac97_soc_resume, .resume = ac97_soc_resume,

View File

@ -321,7 +321,7 @@ static int ad1836_remove(struct snd_soc_codec *codec)
AD1836_ADC_SERFMT_MASK, 0); AD1836_ADC_SERFMT_MASK, 0);
} }
static struct snd_soc_codec_driver soc_codec_dev_ad1836 = { static const struct snd_soc_codec_driver soc_codec_dev_ad1836 = {
.probe = ad1836_probe, .probe = ad1836_probe,
.remove = ad1836_remove, .remove = ad1836_remove,
.suspend = ad1836_suspend, .suspend = ad1836_suspend,

View File

@ -408,7 +408,7 @@ static int ad193x_codec_probe(struct snd_soc_codec *codec)
return 0; return 0;
} }
static struct snd_soc_codec_driver soc_codec_dev_ad193x = { static const struct snd_soc_codec_driver soc_codec_dev_ad193x = {
.probe = ad193x_codec_probe, .probe = ad193x_codec_probe,
.component_driver = { .component_driver = {
.controls = ad193x_snd_controls, .controls = ad193x_snd_controls,

View File

@ -295,7 +295,7 @@ static int ad1980_soc_remove(struct snd_soc_codec *codec)
return 0; return 0;
} }
static struct snd_soc_codec_driver soc_codec_dev_ad1980 = { static const struct snd_soc_codec_driver soc_codec_dev_ad1980 = {
.probe = ad1980_soc_probe, .probe = ad1980_soc_probe,
.remove = ad1980_soc_remove, .remove = ad1980_soc_remove,

View File

@ -54,7 +54,7 @@ static struct snd_soc_dai_driver ad73311_dai = {
.formats = SNDRV_PCM_FMTBIT_S16_LE, }, .formats = SNDRV_PCM_FMTBIT_S16_LE, },
}; };
static struct snd_soc_codec_driver soc_codec_dev_ad73311 = { static const struct snd_soc_codec_driver soc_codec_dev_ad73311 = {
.component_driver = { .component_driver = {
.dapm_widgets = ad73311_dapm_widgets, .dapm_widgets = ad73311_dapm_widgets,
.num_dapm_widgets = ARRAY_SIZE(ad73311_dapm_widgets), .num_dapm_widgets = ARRAY_SIZE(ad73311_dapm_widgets),

View File

@ -1458,7 +1458,7 @@ static const struct regmap_config adau1373_regmap_config = {
.num_reg_defaults = ARRAY_SIZE(adau1373_reg_defaults), .num_reg_defaults = ARRAY_SIZE(adau1373_reg_defaults),
}; };
static struct snd_soc_codec_driver adau1373_codec_driver = { static const struct snd_soc_codec_driver adau1373_codec_driver = {
.probe = adau1373_probe, .probe = adau1373_probe,
.resume = adau1373_resume, .resume = adau1373_resume,
.set_bias_level = adau1373_set_bias_level, .set_bias_level = adau1373_set_bias_level,

View File

@ -757,7 +757,7 @@ static int adau1701_resume(struct snd_soc_codec *codec)
#define adau1701_suspend NULL #define adau1701_suspend NULL
#endif /* CONFIG_PM */ #endif /* CONFIG_PM */
static struct snd_soc_codec_driver adau1701_codec_drv = { static const struct snd_soc_codec_driver adau1701_codec_drv = {
.probe = adau1701_probe, .probe = adau1701_probe,
.remove = adau1701_remove, .remove = adau1701_remove,
.resume = adau1701_resume, .resume = adau1701_resume,

View File

@ -867,7 +867,7 @@ static int adau1977_codec_probe(struct snd_soc_codec *codec)
return 0; return 0;
} }
static struct snd_soc_codec_driver adau1977_codec_driver = { static const struct snd_soc_codec_driver adau1977_codec_driver = {
.probe = adau1977_codec_probe, .probe = adau1977_codec_probe,
.set_bias_level = adau1977_set_bias_level, .set_bias_level = adau1977_set_bias_level,
.set_sysclk = adau1977_set_sysclk, .set_sysclk = adau1977_set_sysclk,

View File

@ -825,7 +825,7 @@ static int adav80x_resume(struct snd_soc_codec *codec)
return 0; return 0;
} }
static struct snd_soc_codec_driver adav80x_codec_driver = { static const struct snd_soc_codec_driver adav80x_codec_driver = {
.probe = adav80x_probe, .probe = adav80x_probe,
.resume = adav80x_resume, .resume = adav80x_resume,
.set_bias_level = adav80x_set_bias_level, .set_bias_level = adav80x_set_bias_level,

View File

@ -58,7 +58,7 @@ static struct snd_soc_dai_driver ads117x_dai = {
.formats = ADS117X_FORMATS,}, .formats = ADS117X_FORMATS,},
}; };
static struct snd_soc_codec_driver soc_codec_dev_ads117x = { static const struct snd_soc_codec_driver soc_codec_dev_ads117x = {
.component_driver = { .component_driver = {
.dapm_widgets = ads117x_dapm_widgets, .dapm_widgets = ads117x_dapm_widgets,
.num_dapm_widgets = ARRAY_SIZE(ads117x_dapm_widgets), .num_dapm_widgets = ARRAY_SIZE(ads117x_dapm_widgets),

View File

@ -242,7 +242,7 @@ static int ak4104_soc_resume(struct snd_soc_codec *codec)
#define ak4104_soc_resume NULL #define ak4104_soc_resume NULL
#endif /* CONFIG_PM */ #endif /* CONFIG_PM */
static struct snd_soc_codec_driver soc_codec_device_ak4104 = { static const struct snd_soc_codec_driver soc_codec_device_ak4104 = {
.probe = ak4104_probe, .probe = ak4104_probe,
.remove = ak4104_remove, .remove = ak4104_remove,
.suspend = ak4104_soc_suspend, .suspend = ak4104_soc_suspend,

View File

@ -390,7 +390,7 @@ static const struct regmap_config ak4535_regmap = {
.num_reg_defaults = ARRAY_SIZE(ak4535_reg_defaults), .num_reg_defaults = ARRAY_SIZE(ak4535_reg_defaults),
}; };
static struct snd_soc_codec_driver soc_codec_dev_ak4535 = { static const struct snd_soc_codec_driver soc_codec_dev_ak4535 = {
.resume = ak4535_resume, .resume = ak4535_resume,
.set_bias_level = ak4535_set_bias_level, .set_bias_level = ak4535_set_bias_level,
.suspend_bias_off = true, .suspend_bias_off = true,

View File

@ -64,7 +64,7 @@ static struct snd_soc_dai_driver ak4554_dai = {
.symmetric_rates = 1, .symmetric_rates = 1,
}; };
static struct snd_soc_codec_driver soc_codec_dev_ak4554 = { static const struct snd_soc_codec_driver soc_codec_dev_ak4554 = {
.component_driver = { .component_driver = {
.dapm_widgets = ak4554_dapm_widgets, .dapm_widgets = ak4554_dapm_widgets,
.num_dapm_widgets = ARRAY_SIZE(ak4554_dapm_widgets), .num_dapm_widgets = ARRAY_SIZE(ak4554_dapm_widgets),

View File

@ -522,7 +522,7 @@ static int ak4613_resume(struct snd_soc_codec *codec)
return regcache_sync(regmap); return regcache_sync(regmap);
} }
static struct snd_soc_codec_driver soc_codec_dev_ak4613 = { static const struct snd_soc_codec_driver soc_codec_dev_ak4613 = {
.suspend = ak4613_suspend, .suspend = ak4613_suspend,
.resume = ak4613_resume, .resume = ak4613_resume,
.set_bias_level = ak4613_set_bias_level, .set_bias_level = ak4613_set_bias_level,

View File

@ -524,7 +524,7 @@ static struct snd_soc_dai_driver ak4641_dai[] = {
}, },
}; };
static struct snd_soc_codec_driver soc_codec_dev_ak4641 = { static const struct snd_soc_codec_driver soc_codec_dev_ak4641 = {
.component_driver = { .component_driver = {
.controls = ak4641_snd_controls, .controls = ak4641_snd_controls,
.num_controls = ARRAY_SIZE(ak4641_snd_controls), .num_controls = ARRAY_SIZE(ak4641_snd_controls),

View File

@ -550,7 +550,7 @@ static int ak4642_probe(struct snd_soc_codec *codec)
return 0; return 0;
} }
static struct snd_soc_codec_driver soc_codec_dev_ak4642 = { static const struct snd_soc_codec_driver soc_codec_dev_ak4642 = {
.probe = ak4642_probe, .probe = ak4642_probe,
.suspend = ak4642_suspend, .suspend = ak4642_suspend,
.resume = ak4642_resume, .resume = ak4642_resume,

View File

@ -610,7 +610,7 @@ static struct snd_soc_dai_driver ak4671_dai = {
.ops = &ak4671_dai_ops, .ops = &ak4671_dai_ops,
}; };
static struct snd_soc_codec_driver soc_codec_dev_ak4671 = { static const struct snd_soc_codec_driver soc_codec_dev_ak4671 = {
.set_bias_level = ak4671_set_bias_level, .set_bias_level = ak4671_set_bias_level,
.component_driver = { .component_driver = {
.controls = ak4671_snd_controls, .controls = ak4671_snd_controls,

View File

@ -69,7 +69,7 @@ static int ak5386_soc_resume(struct snd_soc_codec *codec)
#define ak5386_soc_resume NULL #define ak5386_soc_resume NULL
#endif /* CONFIG_PM */ #endif /* CONFIG_PM */
static struct snd_soc_codec_driver soc_codec_ak5386 = { static const struct snd_soc_codec_driver soc_codec_ak5386 = {
.probe = ak5386_soc_probe, .probe = ak5386_soc_probe,
.remove = ak5386_soc_remove, .remove = ak5386_soc_remove,
.suspend = ak5386_soc_suspend, .suspend = ak5386_soc_suspend,

View File

@ -951,7 +951,7 @@ static int alc5623_probe(struct snd_soc_codec *codec)
return 0; return 0;
} }
static struct snd_soc_codec_driver soc_codec_device_alc5623 = { static const struct snd_soc_codec_driver soc_codec_device_alc5623 = {
.probe = alc5623_probe, .probe = alc5623_probe,
.suspend = alc5623_suspend, .suspend = alc5623_suspend,
.resume = alc5623_resume, .resume = alc5623_resume,

View File

@ -62,7 +62,7 @@ static struct snd_soc_dai_driver bt_sco_dai[] = {
} }
}; };
static struct snd_soc_codec_driver soc_codec_dev_bt_sco = { static const struct snd_soc_codec_driver soc_codec_dev_bt_sco = {
.component_driver = { .component_driver = {
.dapm_widgets = bt_sco_widgets, .dapm_widgets = bt_sco_widgets,
.num_dapm_widgets = ARRAY_SIZE(bt_sco_widgets), .num_dapm_widgets = ARRAY_SIZE(bt_sco_widgets),

View File

@ -128,7 +128,7 @@ static struct regmap *cq93vc_get_regmap(struct device *dev)
return davinci_vc->regmap; return davinci_vc->regmap;
} }
static struct snd_soc_codec_driver soc_codec_dev_cq93vc = { static const struct snd_soc_codec_driver soc_codec_dev_cq93vc = {
.set_bias_level = cq93vc_set_bias_level, .set_bias_level = cq93vc_set_bias_level,
.get_regmap = cq93vc_get_regmap, .get_regmap = cq93vc_get_regmap,
.component_driver = { .component_driver = {

View File

@ -831,7 +831,7 @@ static int cs35l33_probe(struct snd_soc_codec *codec)
return 0; return 0;
} }
static struct snd_soc_codec_driver soc_codec_dev_cs35l33 = { static const struct snd_soc_codec_driver soc_codec_dev_cs35l33 = {
.probe = cs35l33_probe, .probe = cs35l33_probe,
.set_bias_level = cs35l33_set_bias_level, .set_bias_level = cs35l33_set_bias_level,

View File

@ -779,7 +779,7 @@ static int cs35l34_probe(struct snd_soc_codec *codec)
} }
static struct snd_soc_codec_driver soc_codec_dev_cs35l34 = { static const struct snd_soc_codec_driver soc_codec_dev_cs35l34 = {
.probe = cs35l34_probe, .probe = cs35l34_probe,
.component_driver = { .component_driver = {

View File

@ -1079,7 +1079,7 @@ static int cs35l35_codec_probe(struct snd_soc_codec *codec)
return 0; return 0;
} }
static struct snd_soc_codec_driver soc_codec_dev_cs35l35 = { static const struct snd_soc_codec_driver soc_codec_dev_cs35l35 = {
.probe = cs35l35_codec_probe, .probe = cs35l35_codec_probe,
.set_sysclk = cs35l35_codec_set_sysclk, .set_sysclk = cs35l35_codec_set_sysclk,
.component_driver = { .component_driver = {

View File

@ -639,7 +639,7 @@ static int cs4271_codec_remove(struct snd_soc_codec *codec)
return 0; return 0;
}; };
static struct snd_soc_codec_driver soc_codec_dev_cs4271 = { static const struct snd_soc_codec_driver soc_codec_dev_cs4271 = {
.probe = cs4271_codec_probe, .probe = cs4271_codec_probe,
.remove = cs4271_codec_remove, .remove = cs4271_codec_remove,
.suspend = cs4271_soc_suspend, .suspend = cs4271_soc_suspend,

View File

@ -504,7 +504,7 @@ static int cs42l51_codec_probe(struct snd_soc_codec *codec)
return 0; return 0;
} }
static struct snd_soc_codec_driver soc_codec_device_cs42l51 = { static const struct snd_soc_codec_driver soc_codec_device_cs42l51 = {
.probe = cs42l51_codec_probe, .probe = cs42l51_codec_probe,
.component_driver = { .component_driver = {

View File

@ -255,7 +255,7 @@ static struct snd_soc_dai_driver cs4349_dai = {
.symmetric_rates = 1, .symmetric_rates = 1,
}; };
static struct snd_soc_codec_driver soc_codec_dev_cs4349 = { static const struct snd_soc_codec_driver soc_codec_dev_cs4349 = {
.component_driver = { .component_driver = {
.controls = cs4349_snd_controls, .controls = cs4349_snd_controls,
.num_controls = ARRAY_SIZE(cs4349_snd_controls), .num_controls = ARRAY_SIZE(cs4349_snd_controls),

View File

@ -1183,7 +1183,7 @@ static struct regmap *cs47l24_get_regmap(struct device *dev)
return priv->core.arizona->regmap; return priv->core.arizona->regmap;
} }
static struct snd_soc_codec_driver soc_codec_dev_cs47l24 = { static const struct snd_soc_codec_driver soc_codec_dev_cs47l24 = {
.probe = cs47l24_codec_probe, .probe = cs47l24_codec_probe,
.remove = cs47l24_codec_remove, .remove = cs47l24_codec_remove,
.get_regmap = cs47l24_get_regmap, .get_regmap = cs47l24_get_regmap,
@ -1213,7 +1213,7 @@ static struct snd_compr_ops cs47l24_compr_ops = {
.copy = wm_adsp_compr_copy, .copy = wm_adsp_compr_copy,
}; };
static struct snd_soc_platform_driver cs47l24_compr_platform = { static const struct snd_soc_platform_driver cs47l24_compr_platform = {
.compr_ops = &cs47l24_compr_ops, .compr_ops = &cs47l24_compr_ops,
}; };

View File

@ -892,7 +892,7 @@ static int cs53l30_codec_probe(struct snd_soc_codec *codec)
return 0; return 0;
} }
static struct snd_soc_codec_driver cs53l30_driver = { static const struct snd_soc_codec_driver cs53l30_driver = {
.probe = cs53l30_codec_probe, .probe = cs53l30_codec_probe,
.set_bias_level = cs53l30_set_bias_level, .set_bias_level = cs53l30_set_bias_level,
.idle_bias_off = true, .idle_bias_off = true,

View File

@ -398,7 +398,7 @@ static int cx20442_codec_remove(struct snd_soc_codec *codec)
static const u8 cx20442_reg; static const u8 cx20442_reg;
static struct snd_soc_codec_driver cx20442_codec_dev = { static const 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, .set_bias_level = cx20442_set_bias_level,

View File

@ -1164,7 +1164,7 @@ static int da7210_probe(struct snd_soc_codec *codec)
return 0; return 0;
} }
static struct snd_soc_codec_driver soc_codec_dev_da7210 = { static const struct snd_soc_codec_driver soc_codec_dev_da7210 = {
.probe = da7210_probe, .probe = da7210_probe,
.component_driver = { .component_driver = {

View File

@ -1787,7 +1787,7 @@ static int da7213_probe(struct snd_soc_codec *codec)
return 0; return 0;
} }
static struct snd_soc_codec_driver soc_codec_dev_da7213 = { static const struct snd_soc_codec_driver soc_codec_dev_da7213 = {
.probe = da7213_probe, .probe = da7213_probe,
.set_bias_level = da7213_set_bias_level, .set_bias_level = da7213_set_bias_level,

View File

@ -3035,7 +3035,7 @@ static int da7218_resume(struct snd_soc_codec *codec)
#define da7218_resume NULL #define da7218_resume NULL
#endif #endif
static struct snd_soc_codec_driver soc_codec_dev_da7218 = { static const struct snd_soc_codec_driver soc_codec_dev_da7218 = {
.probe = da7218_probe, .probe = da7218_probe,
.remove = da7218_remove, .remove = da7218_remove,
.suspend = da7218_suspend, .suspend = da7218_suspend,

View File

@ -1891,7 +1891,7 @@ static int da7219_resume(struct snd_soc_codec *codec)
#define da7219_resume NULL #define da7219_resume NULL
#endif #endif
static struct snd_soc_codec_driver soc_codec_dev_da7219 = { static const struct snd_soc_codec_driver soc_codec_dev_da7219 = {
.probe = da7219_probe, .probe = da7219_probe,
.remove = da7219_remove, .remove = da7219_remove,
.suspend = da7219_suspend, .suspend = da7219_suspend,

View File

@ -1499,7 +1499,7 @@ static int da732x_set_bias_level(struct snd_soc_codec *codec,
return 0; return 0;
} }
static struct snd_soc_codec_driver soc_codec_dev_da732x = { static const struct snd_soc_codec_driver soc_codec_dev_da732x = {
.set_bias_level = da732x_set_bias_level, .set_bias_level = da732x_set_bias_level,
.component_driver = { .component_driver = {
.controls = da732x_snd_controls, .controls = da732x_snd_controls,

View File

@ -1451,7 +1451,7 @@ static int da9055_probe(struct snd_soc_codec *codec)
return 0; return 0;
} }
static struct snd_soc_codec_driver soc_codec_dev_da9055 = { static const struct snd_soc_codec_driver soc_codec_dev_da9055 = {
.probe = da9055_probe, .probe = da9055_probe,
.set_bias_level = da9055_set_bias_level, .set_bias_level = da9055_set_bias_level,

View File

@ -19,6 +19,8 @@
* *
*/ */
#include <linux/gpio.h>
#include <linux/gpio/consumer.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/module.h> #include <linux/module.h>
@ -27,6 +29,34 @@
#include <sound/soc.h> #include <sound/soc.h>
#include <sound/soc-dapm.h> #include <sound/soc-dapm.h>
static int dmic_daiops_trigger(struct snd_pcm_substream *substream,
int cmd, struct snd_soc_dai *dai)
{
struct gpio_desc *dmic_en = snd_soc_dai_get_drvdata(dai);
if (!dmic_en)
return 0;
switch (cmd) {
case SNDRV_PCM_TRIGGER_START:
case SNDRV_PCM_TRIGGER_RESUME:
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
gpiod_set_value(dmic_en, 1);
break;
case SNDRV_PCM_TRIGGER_STOP:
case SNDRV_PCM_TRIGGER_SUSPEND:
case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
gpiod_set_value(dmic_en, 0);
break;
}
return 0;
}
static const struct snd_soc_dai_ops dmic_dai_ops = {
.trigger = dmic_daiops_trigger,
};
static struct snd_soc_dai_driver dmic_dai = { static struct snd_soc_dai_driver dmic_dai = {
.name = "dmic-hifi", .name = "dmic-hifi",
.capture = { .capture = {
@ -38,8 +68,23 @@ static struct snd_soc_dai_driver dmic_dai = {
| SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S24_LE
| SNDRV_PCM_FMTBIT_S16_LE, | SNDRV_PCM_FMTBIT_S16_LE,
}, },
.ops = &dmic_dai_ops,
}; };
static int dmic_codec_probe(struct snd_soc_codec *codec)
{
struct gpio_desc *dmic_en;
dmic_en = devm_gpiod_get_optional(codec->dev,
"dmicen", GPIOD_OUT_LOW);
if (IS_ERR(dmic_en))
return PTR_ERR(dmic_en);
snd_soc_codec_set_drvdata(codec, dmic_en);
return 0;
}
static const struct snd_soc_dapm_widget dmic_dapm_widgets[] = { static const struct snd_soc_dapm_widget dmic_dapm_widgets[] = {
SND_SOC_DAPM_AIF_OUT("DMIC AIF", "Capture", 0, SND_SOC_DAPM_AIF_OUT("DMIC AIF", "Capture", 0,
SND_SOC_NOPM, 0, 0), SND_SOC_NOPM, 0, 0),
@ -50,7 +95,8 @@ static const struct snd_soc_dapm_route intercon[] = {
{"DMIC AIF", NULL, "DMic"}, {"DMIC AIF", NULL, "DMic"},
}; };
static struct snd_soc_codec_driver soc_dmic = { static const struct snd_soc_codec_driver soc_dmic = {
.probe = dmic_codec_probe,
.component_driver = { .component_driver = {
.dapm_widgets = dmic_dapm_widgets, .dapm_widgets = dmic_dapm_widgets,
.num_dapm_widgets = ARRAY_SIZE(dmic_dapm_widgets), .num_dapm_widgets = ARRAY_SIZE(dmic_dapm_widgets),
@ -73,9 +119,15 @@ static int dmic_dev_remove(struct platform_device *pdev)
MODULE_ALIAS("platform:dmic-codec"); MODULE_ALIAS("platform:dmic-codec");
static const struct of_device_id dmic_dev_match[] = {
{.compatible = "dmic-codec"},
{}
};
static struct platform_driver dmic_driver = { static struct platform_driver dmic_driver = {
.driver = { .driver = {
.name = "dmic-codec", .name = "dmic-codec",
.of_match_table = dmic_dev_match,
}, },
.probe = dmic_dev_probe, .probe = dmic_dev_probe,
.remove = dmic_dev_remove, .remove = dmic_dev_remove,

View File

@ -69,7 +69,7 @@ static const struct snd_soc_dapm_route es7134_dapm_routes[] = {
{ "AOUTR", NULL, "DAC" }, { "AOUTR", NULL, "DAC" },
}; };
static struct snd_soc_codec_driver es7134_codec_driver = { static const struct snd_soc_codec_driver es7134_codec_driver = {
.component_driver = { .component_driver = {
.dapm_widgets = es7134_dapm_widgets, .dapm_widgets = es7134_dapm_widgets,
.num_dapm_widgets = ARRAY_SIZE(es7134_dapm_widgets), .num_dapm_widgets = ARRAY_SIZE(es7134_dapm_widgets),

View File

@ -554,7 +554,7 @@ static int es8316_probe(struct snd_soc_codec *codec)
return 0; return 0;
} }
static struct snd_soc_codec_driver soc_codec_dev_es8316 = { static const struct snd_soc_codec_driver soc_codec_dev_es8316 = {
.probe = es8316_probe, .probe = es8316_probe,
.idle_bias_off = true, .idle_bias_off = true,

View File

@ -830,7 +830,7 @@ const struct regmap_config es8328_regmap_config = {
}; };
EXPORT_SYMBOL_GPL(es8328_regmap_config); EXPORT_SYMBOL_GPL(es8328_regmap_config);
static struct snd_soc_codec_driver es8328_codec_driver = { static const struct snd_soc_codec_driver es8328_codec_driver = {
.probe = es8328_codec_probe, .probe = es8328_codec_probe,
.suspend = es8328_suspend, .suspend = es8328_suspend,
.resume = es8328_resume, .resume = es8328_resume,

View File

@ -1360,7 +1360,7 @@ static void hdac_hdmi_skl_enable_dp12(struct hdac_device *hdac)
} }
static struct snd_soc_dai_ops hdmi_dai_ops = { static const struct snd_soc_dai_ops hdmi_dai_ops = {
.startup = hdac_hdmi_pcm_open, .startup = hdac_hdmi_pcm_open,
.shutdown = hdac_hdmi_pcm_close, .shutdown = hdac_hdmi_pcm_close,
.hw_params = hdac_hdmi_set_hw_params, .hw_params = hdac_hdmi_set_hw_params,
@ -1858,7 +1858,7 @@ static void hdmi_codec_complete(struct device *dev)
#define hdmi_codec_complete NULL #define hdmi_codec_complete NULL
#endif #endif
static struct snd_soc_codec_driver hdmi_hda_codec = { static const struct snd_soc_codec_driver hdmi_hda_codec = {
.probe = hdmi_codec_probe, .probe = hdmi_codec_probe,
.remove = hdmi_codec_remove, .remove = hdmi_codec_remove,
.idle_bias_off = true, .idle_bias_off = true,

View File

@ -326,7 +326,7 @@ static int hdmi_eld_ctl_get(struct snd_kcontrol *kcontrol,
static unsigned long hdmi_codec_spk_mask_from_alloc(int spk_alloc) static unsigned long hdmi_codec_spk_mask_from_alloc(int spk_alloc)
{ {
int i; int i;
const unsigned long hdmi_codec_eld_spk_alloc_bits[] = { static const unsigned long hdmi_codec_eld_spk_alloc_bits[] = {
[0] = FL | FR, [1] = LFE, [2] = FC, [3] = RL | RR, [0] = FL | FR, [1] = LFE, [2] = FC, [3] = RL | RR,
[4] = RC, [5] = FLC | FRC, [6] = RLC | RRC, [4] = RC, [5] = FLC | FRC, [6] = RLC | RRC,
}; };
@ -399,18 +399,6 @@ static int hdmi_codec_chmap_ctl_get(struct snd_kcontrol *kcontrol,
return 0; return 0;
} }
static const struct snd_kcontrol_new hdmi_controls[] = {
{
.access = SNDRV_CTL_ELEM_ACCESS_READ |
SNDRV_CTL_ELEM_ACCESS_VOLATILE,
.iface = SNDRV_CTL_ELEM_IFACE_PCM,
.name = "ELD",
.info = hdmi_eld_ctl_info,
.get = hdmi_eld_ctl_get,
},
};
static int hdmi_codec_new_stream(struct snd_pcm_substream *substream, static int hdmi_codec_new_stream(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai) struct snd_soc_dai *dai)
{ {
@ -668,6 +656,16 @@ static int hdmi_codec_pcm_new(struct snd_soc_pcm_runtime *rtd,
{ {
struct snd_soc_dai_driver *drv = dai->driver; struct snd_soc_dai_driver *drv = dai->driver;
struct hdmi_codec_priv *hcp = snd_soc_dai_get_drvdata(dai); struct hdmi_codec_priv *hcp = snd_soc_dai_get_drvdata(dai);
struct snd_kcontrol *kctl;
struct snd_kcontrol_new hdmi_eld_ctl = {
.access = SNDRV_CTL_ELEM_ACCESS_READ |
SNDRV_CTL_ELEM_ACCESS_VOLATILE,
.iface = SNDRV_CTL_ELEM_IFACE_PCM,
.name = "ELD",
.info = hdmi_eld_ctl_info,
.get = hdmi_eld_ctl_get,
.device = rtd->pcm->device,
};
int ret; int ret;
dev_dbg(dai->dev, "%s()\n", __func__); dev_dbg(dai->dev, "%s()\n", __func__);
@ -686,10 +684,15 @@ static int hdmi_codec_pcm_new(struct snd_soc_pcm_runtime *rtd,
hcp->chmap_info->chmap = hdmi_codec_stereo_chmaps; hcp->chmap_info->chmap = hdmi_codec_stereo_chmaps;
hcp->chmap_idx = HDMI_CODEC_CHMAP_IDX_UNKNOWN; hcp->chmap_idx = HDMI_CODEC_CHMAP_IDX_UNKNOWN;
return 0; /* add ELD ctl with the device number corresponding to the PCM stream */
kctl = snd_ctl_new1(&hdmi_eld_ctl, dai->component);
if (!kctl)
return -ENOMEM;
return snd_ctl_add(rtd->card->snd_card, kctl);
} }
static struct snd_soc_dai_driver hdmi_i2s_dai = { static const struct snd_soc_dai_driver hdmi_i2s_dai = {
.name = "i2s-hifi", .name = "i2s-hifi",
.id = DAI_ID_I2S, .id = DAI_ID_I2S,
.playback = { .playback = {
@ -730,10 +733,8 @@ static int hdmi_of_xlate_dai_id(struct snd_soc_component *component,
return ret; return ret;
} }
static struct snd_soc_codec_driver hdmi_codec = { static const struct snd_soc_codec_driver hdmi_codec = {
.component_driver = { .component_driver = {
.controls = hdmi_controls,
.num_controls = ARRAY_SIZE(hdmi_controls),
.dapm_widgets = hdmi_widgets, .dapm_widgets = hdmi_widgets,
.num_dapm_widgets = ARRAY_SIZE(hdmi_widgets), .num_dapm_widgets = ARRAY_SIZE(hdmi_widgets),
.dapm_routes = hdmi_routes, .dapm_routes = hdmi_routes,

View File

@ -37,7 +37,7 @@ static struct snd_soc_dai_driver ics43432_dai = {
}, },
}; };
static struct snd_soc_codec_driver ics43432_codec_driver = { static const struct snd_soc_codec_driver ics43432_codec_driver = {
}; };
static int ics43432_probe(struct platform_device *pdev) static int ics43432_probe(struct platform_device *pdev)

View File

@ -376,7 +376,7 @@ static int rk3036_codec_set_bias_level(struct snd_soc_codec *codec,
return 0; return 0;
} }
static struct snd_soc_codec_driver rk3036_codec_driver = { static const struct snd_soc_codec_driver rk3036_codec_driver = {
.probe = rk3036_codec_probe, .probe = rk3036_codec_probe,
.remove = rk3036_codec_remove, .remove = rk3036_codec_remove,
.set_bias_level = rk3036_codec_set_bias_level, .set_bias_level = rk3036_codec_set_bias_level,

View File

@ -1087,7 +1087,7 @@ static struct snd_soc_dai_driver isabelle_dai[] = {
}, },
}; };
static struct snd_soc_codec_driver soc_codec_dev_isabelle = { static const struct snd_soc_codec_driver soc_codec_dev_isabelle = {
.set_bias_level = isabelle_set_bias_level, .set_bias_level = isabelle_set_bias_level,
.component_driver = { .component_driver = {
.controls = isabelle_snd_controls, .controls = isabelle_snd_controls,

View File

@ -293,7 +293,7 @@ static int jz4740_codec_dev_probe(struct snd_soc_codec *codec)
return 0; return 0;
} }
static struct snd_soc_codec_driver soc_codec_dev_jz4740_codec = { static const struct snd_soc_codec_driver soc_codec_dev_jz4740_codec = {
.probe = jz4740_codec_dev_probe, .probe = jz4740_codec_dev_probe,
.set_bias_level = jz4740_codec_set_bias_level, .set_bias_level = jz4740_codec_set_bias_level,
.suspend_bias_off = true, .suspend_bias_off = true,

View File

@ -100,7 +100,7 @@ static const struct snd_soc_dapm_route lm4857_routes[] = {
{ "EP", "Earpiece", "Mode" }, { "EP", "Earpiece", "Mode" },
}; };
static struct snd_soc_component_driver lm4857_component_driver = { static const struct snd_soc_component_driver lm4857_component_driver = {
.controls = lm4857_controls, .controls = lm4857_controls,
.num_controls = ARRAY_SIZE(lm4857_controls), .num_controls = ARRAY_SIZE(lm4857_controls),
.dapm_widgets = lm4857_dapm_widgets, .dapm_widgets = lm4857_dapm_widgets,

View File

@ -1389,7 +1389,7 @@ static struct snd_soc_dai_driver lm49453_dai[] = {
}, },
}; };
static struct snd_soc_codec_driver soc_codec_dev_lm49453 = { static const struct snd_soc_codec_driver soc_codec_dev_lm49453 = {
.set_bias_level = lm49453_set_bias_level, .set_bias_level = lm49453_set_bias_level,
.component_driver = { .component_driver = {
.controls = lm49453_snd_controls, .controls = lm49453_snd_controls,

View File

@ -151,7 +151,7 @@ static int max9768_probe(struct snd_soc_component *component)
return 0; return 0;
} }
static struct snd_soc_component_driver max9768_component_driver = { static const struct snd_soc_component_driver max9768_component_driver = {
.probe = max9768_probe, .probe = max9768_probe,
.controls = max9768_volume, .controls = max9768_volume,
.num_controls = ARRAY_SIZE(max9768_volume), .num_controls = ARRAY_SIZE(max9768_volume),

View File

@ -1698,7 +1698,7 @@ static int max98088_remove(struct snd_soc_codec *codec)
return 0; return 0;
} }
static struct snd_soc_codec_driver soc_codec_dev_max98088 = { static const struct snd_soc_codec_driver soc_codec_dev_max98088 = {
.probe = max98088_probe, .probe = max98088_probe,
.remove = max98088_remove, .remove = max98088_remove,
.set_bias_level = max98088_set_bias_level, .set_bias_level = max98088_set_bias_level,

View File

@ -2499,7 +2499,7 @@ static void max98090_seq_notifier(struct snd_soc_dapm_context *dapm,
} }
} }
static struct snd_soc_codec_driver soc_codec_dev_max98090 = { static const struct snd_soc_codec_driver soc_codec_dev_max98090 = {
.probe = max98090_probe, .probe = max98090_probe,
.remove = max98090_remove, .remove = max98090_remove,
.seq_notifier = max98090_seq_notifier, .seq_notifier = max98090_seq_notifier,

View File

@ -2102,7 +2102,7 @@ static int max98095_remove(struct snd_soc_codec *codec)
return 0; return 0;
} }
static struct snd_soc_codec_driver soc_codec_dev_max98095 = { static const struct snd_soc_codec_driver soc_codec_dev_max98095 = {
.probe = max98095_probe, .probe = max98095_probe,
.remove = max98095_remove, .remove = max98095_remove,
.suspend = max98095_suspend, .suspend = max98095_suspend,

View File

@ -72,7 +72,7 @@ static int max98357a_codec_probe(struct snd_soc_codec *codec)
return 0; return 0;
} }
static struct snd_soc_codec_driver max98357a_codec_driver = { static const struct snd_soc_codec_driver max98357a_codec_driver = {
.probe = max98357a_codec_probe, .probe = max98357a_codec_probe,
.component_driver = { .component_driver = {
.dapm_widgets = max98357a_dapm_widgets, .dapm_widgets = max98357a_dapm_widgets,

View File

@ -301,7 +301,7 @@ static int max9850_probe(struct snd_soc_codec *codec)
return 0; return 0;
} }
static struct snd_soc_codec_driver soc_codec_dev_max9850 = { static const struct snd_soc_codec_driver soc_codec_dev_max9850 = {
.probe = max9850_probe, .probe = max9850_probe,
.set_bias_level = max9850_set_bias_level, .set_bias_level = max9850_set_bias_level,
.suspend_bias_off = true, .suspend_bias_off = true,

View File

@ -534,7 +534,7 @@ static int max9860_set_bias_level(struct snd_soc_codec *codec,
return 0; return 0;
} }
static struct snd_soc_codec_driver max9860_codec_driver = { static const struct snd_soc_codec_driver max9860_codec_driver = {
.set_bias_level = max9860_set_bias_level, .set_bias_level = max9860_set_bias_level,
.idle_bias_off = true, .idle_bias_off = true,

View File

@ -413,7 +413,7 @@ static int max9867_probe(struct snd_soc_codec *codec)
return 0; return 0;
} }
static struct snd_soc_codec_driver max9867_codec = { static const struct snd_soc_codec_driver max9867_codec = {
.probe = max9867_probe, .probe = max9867_probe,
.component_driver = { .component_driver = {
.controls = max9867_snd_controls, .controls = max9867_snd_controls,

View File

@ -496,7 +496,7 @@ static int max98926_probe(struct snd_soc_codec *codec)
return 0; return 0;
} }
static struct snd_soc_codec_driver soc_codec_dev_max98926 = { static const struct snd_soc_codec_driver soc_codec_dev_max98926 = {
.probe = max98926_probe, .probe = max98926_probe,
.component_driver = { .component_driver = {
.controls = max98926_snd_controls, .controls = max98926_snd_controls,

View File

@ -733,7 +733,7 @@ static struct regmap *mc13783_get_regmap(struct device *dev)
return dev_get_regmap(dev->parent, NULL); return dev_get_regmap(dev->parent, NULL);
} }
static struct snd_soc_codec_driver soc_codec_dev_mc13783 = { static const struct snd_soc_codec_driver soc_codec_dev_mc13783 = {
.probe = mc13783_probe, .probe = mc13783_probe,
.remove = mc13783_remove, .remove = mc13783_remove,
.get_regmap = mc13783_get_regmap, .get_regmap = mc13783_get_regmap,

View File

@ -537,7 +537,7 @@ static int ml26124_probe(struct snd_soc_codec *codec)
return 0; return 0;
} }
static struct snd_soc_codec_driver soc_codec_dev_ml26124 = { static const struct snd_soc_codec_driver soc_codec_dev_ml26124 = {
.probe = ml26124_probe, .probe = ml26124_probe,
.set_bias_level = ml26124_set_bias_level, .set_bias_level = ml26124_set_bias_level,
.suspend_bias_off = true, .suspend_bias_off = true,

View File

@ -12,9 +12,16 @@
#include <sound/pcm.h> #include <sound/pcm.h>
#include <sound/pcm_params.h> #include <sound/pcm_params.h>
#include <sound/tlv.h> #include <sound/tlv.h>
#include <sound/jack.h>
#define CDC_D_REVISION1 (0xf000) #define CDC_D_REVISION1 (0xf000)
#define CDC_D_PERPH_SUBTYPE (0xf005) #define CDC_D_PERPH_SUBTYPE (0xf005)
#define CDC_D_INT_EN_SET (0x015)
#define CDC_D_INT_EN_CLR (0x016)
#define MBHC_SWITCH_INT BIT(7)
#define MBHC_MIC_ELECTRICAL_INS_REM_DET BIT(6)
#define MBHC_BUTTON_PRESS_DET BIT(5)
#define MBHC_BUTTON_RELEASE_DET BIT(4)
#define CDC_D_CDC_RST_CTL (0xf046) #define CDC_D_CDC_RST_CTL (0xf046)
#define RST_CTL_DIG_SW_RST_N_MASK BIT(7) #define RST_CTL_DIG_SW_RST_N_MASK BIT(7)
#define RST_CTL_DIG_SW_RST_N_RESET 0 #define RST_CTL_DIG_SW_RST_N_RESET 0
@ -37,6 +44,8 @@
#define DIG_CLK_CTL_RXD1_CLK_EN BIT(0) #define DIG_CLK_CTL_RXD1_CLK_EN BIT(0)
#define DIG_CLK_CTL_RXD2_CLK_EN BIT(1) #define DIG_CLK_CTL_RXD2_CLK_EN BIT(1)
#define DIG_CLK_CTL_RXD3_CLK_EN BIT(2) #define DIG_CLK_CTL_RXD3_CLK_EN BIT(2)
#define DIG_CLK_CTL_D_MBHC_CLK_EN_MASK BIT(3)
#define DIG_CLK_CTL_D_MBHC_CLK_EN BIT(3)
#define DIG_CLK_CTL_TXD_CLK_EN BIT(4) #define DIG_CLK_CTL_TXD_CLK_EN BIT(4)
#define DIG_CLK_CTL_NCP_CLK_EN_MASK BIT(6) #define DIG_CLK_CTL_NCP_CLK_EN_MASK BIT(6)
#define DIG_CLK_CTL_NCP_CLK_EN BIT(6) #define DIG_CLK_CTL_NCP_CLK_EN BIT(6)
@ -93,8 +102,12 @@
#define MICB_1_EN_TX3_GND_SEL_TX_GND 0 #define MICB_1_EN_TX3_GND_SEL_TX_GND 0
#define CDC_A_MICB_1_VAL (0xf141) #define CDC_A_MICB_1_VAL (0xf141)
#define MICB_MIN_VAL 1600
#define MICB_STEP_SIZE 50
#define MICB_VOLTAGE_REGVAL(v) ((v - MICB_MIN_VAL)/MICB_STEP_SIZE)
#define MICB_1_VAL_MICB_OUT_VAL_MASK GENMASK(7, 3) #define MICB_1_VAL_MICB_OUT_VAL_MASK GENMASK(7, 3)
#define MICB_1_VAL_MICB_OUT_VAL_V2P70V ((0x16) << 3) #define MICB_1_VAL_MICB_OUT_VAL_V2P70V ((0x16) << 3)
#define MICB_1_VAL_MICB_OUT_VAL_V1P80V ((0x4) << 3)
#define CDC_A_MICB_1_CTL (0xf142) #define CDC_A_MICB_1_CTL (0xf142)
#define MICB_1_CTL_CFILT_REF_SEL_MASK BIT(1) #define MICB_1_CTL_CFILT_REF_SEL_MASK BIT(1)
@ -128,8 +141,51 @@
#define MICB_1_INT_TX3_INT_PULLUP_EN_TX1N_TO_GND 0 #define MICB_1_INT_TX3_INT_PULLUP_EN_TX1N_TO_GND 0
#define CDC_A_MICB_2_EN (0xf144) #define CDC_A_MICB_2_EN (0xf144)
#define CDC_A_MICB_2_EN_ENABLE BIT(7)
#define CDC_A_MICB_2_PULL_DOWN_EN_MASK BIT(5)
#define CDC_A_MICB_2_PULL_DOWN_EN BIT(5)
#define CDC_A_TX_1_2_ATEST_CTL_2 (0xf145) #define CDC_A_TX_1_2_ATEST_CTL_2 (0xf145)
#define CDC_A_MASTER_BIAS_CTL (0xf146) #define CDC_A_MASTER_BIAS_CTL (0xf146)
#define CDC_A_MBHC_DET_CTL_1 (0xf147)
#define CDC_A_MBHC_DET_CTL_L_DET_EN BIT(7)
#define CDC_A_MBHC_DET_CTL_GND_DET_EN BIT(6)
#define CDC_A_MBHC_DET_CTL_MECH_DET_TYPE_INSERTION BIT(5)
#define CDC_A_MBHC_DET_CTL_MECH_DET_TYPE_REMOVAL (0)
#define CDC_A_MBHC_DET_CTL_MECH_DET_TYPE_MASK BIT(5)
#define CDC_A_MBHC_DET_CTL_MECH_DET_TYPE_SHIFT (5)
#define CDC_A_MBHC_DET_CTL_MIC_CLAMP_CTL_AUTO BIT(4)
#define CDC_A_MBHC_DET_CTL_MIC_CLAMP_CTL_MANUAL BIT(3)
#define CDC_A_MBHC_DET_CTL_MIC_CLAMP_CTL_MASK GENMASK(4, 3)
#define CDC_A_MBHC_DET_CTL_MBHC_BIAS_EN BIT(2)
#define CDC_A_MBHC_DET_CTL_2 (0xf150)
#define CDC_A_MBHC_DET_CTL_HS_L_DET_PULL_UP_CTRL_I_3P0 (BIT(7) | BIT(6))
#define CDC_A_MBHC_DET_CTL_HS_L_DET_COMPA_CTRL_V0P9_VDD BIT(5)
#define CDC_A_PLUG_TYPE_MASK GENMASK(4, 3)
#define CDC_A_HPHL_PLUG_TYPE_NO BIT(4)
#define CDC_A_GND_PLUG_TYPE_NO BIT(3)
#define CDC_A_MBHC_DET_CTL_HPHL_100K_TO_GND_EN_MASK BIT(0)
#define CDC_A_MBHC_DET_CTL_HPHL_100K_TO_GND_EN BIT(0)
#define CDC_A_MBHC_FSM_CTL (0xf151)
#define CDC_A_MBHC_FSM_CTL_MBHC_FSM_EN BIT(7)
#define CDC_A_MBHC_FSM_CTL_MBHC_FSM_EN_MASK BIT(7)
#define CDC_A_MBHC_FSM_CTL_BTN_ISRC_CTRL_I_100UA (0x3 << 4)
#define CDC_A_MBHC_FSM_CTL_BTN_ISRC_CTRL_MASK GENMASK(6, 4)
#define CDC_A_MBHC_DBNC_TIMER (0xf152)
#define CDC_A_MBHC_DBNC_TIMER_BTN_DBNC_T_16MS BIT(3)
#define CDC_A_MBHC_DBNC_TIMER_INSREM_DBNC_T_256_MS (0x9 << 4)
#define CDC_A_MBHC_BTN0_ZDET_CTL_0 (0xf153)
#define CDC_A_MBHC_BTN1_ZDET_CTL_1 (0xf154)
#define CDC_A_MBHC_BTN2_ZDET_CTL_2 (0xf155)
#define CDC_A_MBHC_BTN3_CTL (0xf156)
#define CDC_A_MBHC_BTN4_CTL (0xf157)
#define CDC_A_MBHC_BTN_VREF_FINE_SHIFT (2)
#define CDC_A_MBHC_BTN_VREF_FINE_MASK GENMASK(4, 2)
#define CDC_A_MBHC_BTN_VREF_COARSE_MASK GENMASK(7, 5)
#define CDC_A_MBHC_BTN_VREF_COARSE_SHIFT (5)
#define CDC_A_MBHC_BTN_VREF_MASK (CDC_A_MBHC_BTN_VREF_COARSE_MASK | \
CDC_A_MBHC_BTN_VREF_FINE_MASK)
#define CDC_A_MBHC_RESULT_1 (0xf158)
#define CDC_A_MBHC_RESULT_1_BTN_RESULT_MASK GENMASK(4, 0)
#define CDC_A_TX_1_EN (0xf160) #define CDC_A_TX_1_EN (0xf160)
#define CDC_A_TX_2_EN (0xf161) #define CDC_A_TX_2_EN (0xf161)
#define CDC_A_TX_1_2_TEST_CTL_1 (0xf162) #define CDC_A_TX_1_2_TEST_CTL_1 (0xf162)
@ -213,18 +269,37 @@
#define MSM8916_WCD_ANALOG_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\ #define MSM8916_WCD_ANALOG_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
SNDRV_PCM_FMTBIT_S24_LE) SNDRV_PCM_FMTBIT_S24_LE)
static int btn_mask = SND_JACK_BTN_0 | SND_JACK_BTN_1 |
SND_JACK_BTN_2 | SND_JACK_BTN_3 | SND_JACK_BTN_4;
static int hs_jack_mask = SND_JACK_HEADPHONE | SND_JACK_HEADSET;
static const char * const supply_names[] = { static const char * const supply_names[] = {
"vdd-cdc-io", "vdd-cdc-io",
"vdd-cdc-tx-rx-cx", "vdd-cdc-tx-rx-cx",
}; };
#define MBHC_MAX_BUTTONS (5)
struct pm8916_wcd_analog_priv { struct pm8916_wcd_analog_priv {
u16 pmic_rev; u16 pmic_rev;
u16 codec_version; u16 codec_version;
bool mbhc_btn_enabled;
/* special event to detect accessory type */
bool mbhc_btn0_pressed;
bool detect_accessory_type;
struct clk *mclk; struct clk *mclk;
struct snd_soc_codec *codec;
struct regulator_bulk_data supplies[ARRAY_SIZE(supply_names)]; struct regulator_bulk_data supplies[ARRAY_SIZE(supply_names)];
struct snd_soc_jack *jack;
bool hphl_jack_type_normally_open;
bool gnd_jack_type_normally_open;
/* Voltage threshold when internal current source of 100uA is used */
u32 vref_btn_cs[MBHC_MAX_BUTTONS];
/* Voltage threshold when microphone bias is ON */
u32 vref_btn_micb[MBHC_MAX_BUTTONS];
unsigned int micbias1_cap_mode; unsigned int micbias1_cap_mode;
unsigned int micbias2_cap_mode; unsigned int micbias2_cap_mode;
unsigned int micbias_mv;
}; };
static const char *const adc2_mux_text[] = { "ZERO", "INP2", "INP3" }; static const char *const adc2_mux_text[] = { "ZERO", "INP2", "INP3" };
@ -265,18 +340,25 @@ static const struct snd_kcontrol_new pm8916_wcd_analog_snd_controls[] = {
static void pm8916_wcd_analog_micbias_enable(struct snd_soc_codec *codec) static void pm8916_wcd_analog_micbias_enable(struct snd_soc_codec *codec)
{ {
struct pm8916_wcd_analog_priv *wcd = snd_soc_codec_get_drvdata(codec);
snd_soc_update_bits(codec, CDC_A_MICB_1_CTL, snd_soc_update_bits(codec, CDC_A_MICB_1_CTL,
MICB_1_CTL_EXT_PRECHARG_EN_MASK | MICB_1_CTL_EXT_PRECHARG_EN_MASK |
MICB_1_CTL_INT_PRECHARG_BYP_MASK, MICB_1_CTL_INT_PRECHARG_BYP_MASK,
MICB_1_CTL_INT_PRECHARG_BYP_EXT_PRECHRG_SEL MICB_1_CTL_INT_PRECHARG_BYP_EXT_PRECHRG_SEL
| MICB_1_CTL_EXT_PRECHARG_EN_ENABLE); | MICB_1_CTL_EXT_PRECHARG_EN_ENABLE);
snd_soc_write(codec, CDC_A_MICB_1_VAL, MICB_1_VAL_MICB_OUT_VAL_V2P70V); if (wcd->micbias_mv) {
/* snd_soc_write(codec, CDC_A_MICB_1_VAL,
* Special headset needs MICBIAS as 2.7V so wait for MICB_VOLTAGE_REGVAL(wcd->micbias_mv));
* 50 msec for the MICBIAS to reach 2.7 volts. /*
*/ * Special headset needs MICBIAS as 2.7V so wait for
msleep(50); * 50 msec for the MICBIAS to reach 2.7 volts.
*/
if (wcd->micbias_mv >= 2700)
msleep(50);
}
snd_soc_update_bits(codec, CDC_A_MICB_1_CTL, snd_soc_update_bits(codec, CDC_A_MICB_1_CTL,
MICB_1_CTL_EXT_PRECHARG_EN_MASK | MICB_1_CTL_EXT_PRECHARG_EN_MASK |
MICB_1_CTL_INT_PRECHARG_BYP_MASK, 0); MICB_1_CTL_INT_PRECHARG_BYP_MASK, 0);
@ -361,6 +443,97 @@ static int pm8916_wcd_analog_enable_micbias_int1(struct
wcd->micbias1_cap_mode); wcd->micbias1_cap_mode);
} }
static void pm8916_wcd_setup_mbhc(struct pm8916_wcd_analog_priv *wcd)
{
struct snd_soc_codec *codec = wcd->codec;
u32 plug_type = 0;
u32 int_en_mask;
snd_soc_write(codec, CDC_A_MBHC_DET_CTL_1,
CDC_A_MBHC_DET_CTL_L_DET_EN |
CDC_A_MBHC_DET_CTL_MECH_DET_TYPE_INSERTION |
CDC_A_MBHC_DET_CTL_MIC_CLAMP_CTL_AUTO |
CDC_A_MBHC_DET_CTL_MBHC_BIAS_EN);
if (wcd->hphl_jack_type_normally_open)
plug_type |= CDC_A_HPHL_PLUG_TYPE_NO;
if (wcd->gnd_jack_type_normally_open)
plug_type |= CDC_A_GND_PLUG_TYPE_NO;
snd_soc_write(codec, CDC_A_MBHC_DET_CTL_2,
CDC_A_MBHC_DET_CTL_HS_L_DET_PULL_UP_CTRL_I_3P0 |
CDC_A_MBHC_DET_CTL_HS_L_DET_COMPA_CTRL_V0P9_VDD |
plug_type |
CDC_A_MBHC_DET_CTL_HPHL_100K_TO_GND_EN);
snd_soc_write(codec, CDC_A_MBHC_DBNC_TIMER,
CDC_A_MBHC_DBNC_TIMER_INSREM_DBNC_T_256_MS |
CDC_A_MBHC_DBNC_TIMER_BTN_DBNC_T_16MS);
/* enable MBHC clock */
snd_soc_update_bits(codec, CDC_D_CDC_DIG_CLK_CTL,
DIG_CLK_CTL_D_MBHC_CLK_EN_MASK,
DIG_CLK_CTL_D_MBHC_CLK_EN);
int_en_mask = MBHC_SWITCH_INT;
if (wcd->mbhc_btn_enabled)
int_en_mask |= MBHC_BUTTON_PRESS_DET | MBHC_BUTTON_RELEASE_DET;
snd_soc_update_bits(codec, CDC_D_INT_EN_CLR, int_en_mask, 0);
snd_soc_update_bits(codec, CDC_D_INT_EN_SET, int_en_mask, int_en_mask);
wcd->mbhc_btn0_pressed = false;
wcd->detect_accessory_type = true;
}
static int pm8916_mbhc_configure_bias(struct pm8916_wcd_analog_priv *priv,
bool micbias2_enabled)
{
struct snd_soc_codec *codec = priv->codec;
u32 coarse, fine, reg_val, reg_addr;
int *vrefs, i;
if (!micbias2_enabled) { /* use internal 100uA Current source */
/* Enable internal 2.2k Internal Rbias Resistor */
snd_soc_update_bits(codec, CDC_A_MICB_1_INT_RBIAS,
MICB_1_INT_TX2_INT_RBIAS_EN_MASK,
MICB_1_INT_TX2_INT_RBIAS_EN_ENABLE);
/* Remove pull down on MIC BIAS2 */
snd_soc_update_bits(codec, CDC_A_MICB_2_EN,
CDC_A_MICB_2_PULL_DOWN_EN_MASK,
0);
/* enable 100uA internal current source */
snd_soc_update_bits(codec, CDC_A_MBHC_FSM_CTL,
CDC_A_MBHC_FSM_CTL_BTN_ISRC_CTRL_MASK,
CDC_A_MBHC_FSM_CTL_BTN_ISRC_CTRL_I_100UA);
}
snd_soc_update_bits(codec, CDC_A_MBHC_FSM_CTL,
CDC_A_MBHC_FSM_CTL_MBHC_FSM_EN_MASK,
CDC_A_MBHC_FSM_CTL_MBHC_FSM_EN);
if (micbias2_enabled)
vrefs = &priv->vref_btn_micb[0];
else
vrefs = &priv->vref_btn_cs[0];
/* program vref ranges for all the buttons */
reg_addr = CDC_A_MBHC_BTN0_ZDET_CTL_0;
for (i = 0; i < MBHC_MAX_BUTTONS; i++) {
/* split mv in to coarse parts of 100mv & fine parts of 12mv */
coarse = (vrefs[i] / 100);
fine = ((vrefs[i] % 100) / 12);
reg_val = (coarse << CDC_A_MBHC_BTN_VREF_COARSE_SHIFT) |
(fine << CDC_A_MBHC_BTN_VREF_FINE_SHIFT);
snd_soc_update_bits(codec, reg_addr,
CDC_A_MBHC_BTN_VREF_MASK,
reg_val);
reg_addr++;
}
return 0;
}
static int pm8916_wcd_analog_enable_micbias_int2(struct static int pm8916_wcd_analog_enable_micbias_int2(struct
snd_soc_dapm_widget snd_soc_dapm_widget
*w, struct snd_kcontrol *w, struct snd_kcontrol
@ -369,6 +542,15 @@ static int pm8916_wcd_analog_enable_micbias_int2(struct
struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
struct pm8916_wcd_analog_priv *wcd = snd_soc_codec_get_drvdata(codec); struct pm8916_wcd_analog_priv *wcd = snd_soc_codec_get_drvdata(codec);
switch (event) {
case SND_SOC_DAPM_POST_PMU:
pm8916_mbhc_configure_bias(wcd, true);
break;
case SND_SOC_DAPM_POST_PMD:
pm8916_mbhc_configure_bias(wcd, false);
break;
}
return pm8916_wcd_analog_enable_micbias_int(codec, event, w->reg, return pm8916_wcd_analog_enable_micbias_int(codec, event, w->reg,
wcd->micbias2_cap_mode); wcd->micbias2_cap_mode);
} }
@ -536,6 +718,14 @@ static int pm8916_wcd_analog_probe(struct snd_soc_codec *codec)
snd_soc_write(codec, wcd_reg_defaults_2_0[reg].reg, snd_soc_write(codec, wcd_reg_defaults_2_0[reg].reg,
wcd_reg_defaults_2_0[reg].def); wcd_reg_defaults_2_0[reg].def);
priv->codec = codec;
snd_soc_update_bits(codec, CDC_D_CDC_RST_CTL,
RST_CTL_DIG_SW_RST_N_MASK,
RST_CTL_DIG_SW_RST_N_REMOVE_RESET);
pm8916_wcd_setup_mbhc(priv);
return 0; return 0;
} }
@ -543,6 +733,9 @@ static int pm8916_wcd_analog_remove(struct snd_soc_codec *codec)
{ {
struct pm8916_wcd_analog_priv *priv = dev_get_drvdata(codec->dev); struct pm8916_wcd_analog_priv *priv = dev_get_drvdata(codec->dev);
snd_soc_update_bits(codec, CDC_D_CDC_RST_CTL,
RST_CTL_DIG_SW_RST_N_MASK, 0);
return regulator_bulk_disable(ARRAY_SIZE(priv->supplies), return regulator_bulk_disable(ARRAY_SIZE(priv->supplies),
priv->supplies); priv->supplies);
} }
@ -731,32 +924,129 @@ static const struct snd_soc_dapm_widget pm8916_wcd_analog_dapm_widgets[] = {
SND_SOC_DAPM_SUPPLY("A_MCLK2", CDC_D_CDC_TOP_CLK_CTL, 3, 0, NULL, 0), SND_SOC_DAPM_SUPPLY("A_MCLK2", CDC_D_CDC_TOP_CLK_CTL, 3, 0, NULL, 0),
}; };
static int pm8916_wcd_analog_set_jack(struct snd_soc_codec *codec,
struct snd_soc_jack *jack,
void *data)
{
struct pm8916_wcd_analog_priv *wcd = snd_soc_codec_get_drvdata(codec);
wcd->jack = jack;
return 0;
}
static struct regmap *pm8916_get_regmap(struct device *dev) static struct regmap *pm8916_get_regmap(struct device *dev)
{ {
return dev_get_regmap(dev->parent, NULL); return dev_get_regmap(dev->parent, NULL);
} }
static int pm8916_wcd_analog_startup(struct snd_pcm_substream *substream, static irqreturn_t mbhc_btn_release_irq_handler(int irq, void *arg)
struct snd_soc_dai *dai)
{ {
snd_soc_update_bits(dai->codec, CDC_D_CDC_RST_CTL, struct pm8916_wcd_analog_priv *priv = arg;
RST_CTL_DIG_SW_RST_N_MASK,
RST_CTL_DIG_SW_RST_N_REMOVE_RESET);
return 0; if (priv->detect_accessory_type) {
struct snd_soc_codec *codec = priv->codec;
u32 val = snd_soc_read(codec, CDC_A_MBHC_RESULT_1);
/* check if its BTN0 thats released */
if ((val != -1) && !(val & CDC_A_MBHC_RESULT_1_BTN_RESULT_MASK))
priv->mbhc_btn0_pressed = false;
} else {
snd_soc_jack_report(priv->jack, 0, btn_mask);
}
return IRQ_HANDLED;
} }
static void pm8916_wcd_analog_shutdown(struct snd_pcm_substream *substream, static irqreturn_t mbhc_btn_press_irq_handler(int irq, void *arg)
struct snd_soc_dai *dai)
{ {
snd_soc_update_bits(dai->codec, CDC_D_CDC_RST_CTL, struct pm8916_wcd_analog_priv *priv = arg;
RST_CTL_DIG_SW_RST_N_MASK, 0); struct snd_soc_codec *codec = priv->codec;
u32 btn_result;
btn_result = snd_soc_read(codec, CDC_A_MBHC_RESULT_1) &
CDC_A_MBHC_RESULT_1_BTN_RESULT_MASK;
switch (btn_result) {
case 0xf:
snd_soc_jack_report(priv->jack, SND_JACK_BTN_4, btn_mask);
break;
case 0x7:
snd_soc_jack_report(priv->jack, SND_JACK_BTN_3, btn_mask);
break;
case 0x3:
snd_soc_jack_report(priv->jack, SND_JACK_BTN_2, btn_mask);
break;
case 0x1:
snd_soc_jack_report(priv->jack, SND_JACK_BTN_1, btn_mask);
break;
case 0x0:
/* handle BTN_0 specially for type detection */
if (priv->detect_accessory_type)
priv->mbhc_btn0_pressed = true;
else
snd_soc_jack_report(priv->jack,
SND_JACK_BTN_0, btn_mask);
break;
default:
dev_err(codec->dev,
"Unexpected button press result (%x)", btn_result);
break;
}
return IRQ_HANDLED;
} }
static struct snd_soc_dai_ops pm8916_wcd_analog_dai_ops = {
.startup = pm8916_wcd_analog_startup, static irqreturn_t pm8916_mbhc_switch_irq_handler(int irq, void *arg)
.shutdown = pm8916_wcd_analog_shutdown, {
}; struct pm8916_wcd_analog_priv *priv = arg;
struct snd_soc_codec *codec = priv->codec;
bool ins = false;
if (snd_soc_read(codec, CDC_A_MBHC_DET_CTL_1) &
CDC_A_MBHC_DET_CTL_MECH_DET_TYPE_MASK)
ins = true;
/* Set the detection type appropriately */
snd_soc_update_bits(codec, CDC_A_MBHC_DET_CTL_1,
CDC_A_MBHC_DET_CTL_MECH_DET_TYPE_MASK,
(!ins << CDC_A_MBHC_DET_CTL_MECH_DET_TYPE_SHIFT));
if (ins) { /* hs insertion */
bool micbias_enabled = false;
if (snd_soc_read(codec, CDC_A_MICB_2_EN) &
CDC_A_MICB_2_EN_ENABLE)
micbias_enabled = true;
pm8916_mbhc_configure_bias(priv, micbias_enabled);
/*
* if only a btn0 press event is receive just before
* insert event then its a 3 pole headphone else if
* both press and release event received then its
* a headset.
*/
if (priv->mbhc_btn0_pressed)
snd_soc_jack_report(priv->jack,
SND_JACK_HEADPHONE, hs_jack_mask);
else
snd_soc_jack_report(priv->jack,
SND_JACK_HEADSET, hs_jack_mask);
priv->detect_accessory_type = false;
} else { /* removal */
snd_soc_jack_report(priv->jack, 0, hs_jack_mask);
priv->detect_accessory_type = true;
priv->mbhc_btn0_pressed = false;
}
return IRQ_HANDLED;
}
static struct snd_soc_dai_driver pm8916_wcd_analog_dai[] = { static struct snd_soc_dai_driver pm8916_wcd_analog_dai[] = {
[0] = { [0] = {
@ -769,7 +1059,6 @@ static struct snd_soc_dai_driver pm8916_wcd_analog_dai[] = {
.channels_min = 1, .channels_min = 1,
.channels_max = 3, .channels_max = 3,
}, },
.ops = &pm8916_wcd_analog_dai_ops,
}, },
[1] = { [1] = {
.name = "pm8916_wcd_analog_pdm_tx", .name = "pm8916_wcd_analog_pdm_tx",
@ -781,13 +1070,13 @@ static struct snd_soc_dai_driver pm8916_wcd_analog_dai[] = {
.channels_min = 1, .channels_min = 1,
.channels_max = 4, .channels_max = 4,
}, },
.ops = &pm8916_wcd_analog_dai_ops,
}, },
}; };
static struct snd_soc_codec_driver pm8916_wcd_analog = { static const struct snd_soc_codec_driver pm8916_wcd_analog = {
.probe = pm8916_wcd_analog_probe, .probe = pm8916_wcd_analog_probe,
.remove = pm8916_wcd_analog_remove, .remove = pm8916_wcd_analog_remove,
.set_jack = pm8916_wcd_analog_set_jack,
.get_regmap = pm8916_get_regmap, .get_regmap = pm8916_get_regmap,
.component_driver = { .component_driver = {
.controls = pm8916_wcd_analog_snd_controls, .controls = pm8916_wcd_analog_snd_controls,
@ -802,6 +1091,7 @@ static struct snd_soc_codec_driver pm8916_wcd_analog = {
static int pm8916_wcd_analog_parse_dt(struct device *dev, static int pm8916_wcd_analog_parse_dt(struct device *dev,
struct pm8916_wcd_analog_priv *priv) struct pm8916_wcd_analog_priv *priv)
{ {
int rval;
if (of_property_read_bool(dev->of_node, "qcom,micbias1-ext-cap")) if (of_property_read_bool(dev->of_node, "qcom,micbias1-ext-cap"))
priv->micbias1_cap_mode = MICB_1_EN_EXT_BYP_CAP; priv->micbias1_cap_mode = MICB_1_EN_EXT_BYP_CAP;
@ -813,6 +1103,42 @@ static int pm8916_wcd_analog_parse_dt(struct device *dev,
else else
priv->micbias2_cap_mode = MICB_1_EN_NO_EXT_BYP_CAP; priv->micbias2_cap_mode = MICB_1_EN_NO_EXT_BYP_CAP;
of_property_read_u32(dev->of_node, "qcom,micbias-lvl",
&priv->micbias_mv);
if (of_property_read_bool(dev->of_node,
"qcom,hphl-jack-type-normally-open"))
priv->hphl_jack_type_normally_open = true;
else
priv->hphl_jack_type_normally_open = false;
if (of_property_read_bool(dev->of_node,
"qcom,gnd-jack-type-normally-open"))
priv->gnd_jack_type_normally_open = true;
else
priv->gnd_jack_type_normally_open = false;
priv->mbhc_btn_enabled = true;
rval = of_property_read_u32_array(dev->of_node,
"qcom,mbhc-vthreshold-low",
&priv->vref_btn_cs[0],
MBHC_MAX_BUTTONS);
if (rval < 0) {
priv->mbhc_btn_enabled = false;
} else {
rval = of_property_read_u32_array(dev->of_node,
"qcom,mbhc-vthreshold-high",
&priv->vref_btn_micb[0],
MBHC_MAX_BUTTONS);
if (rval < 0)
priv->mbhc_btn_enabled = false;
}
if (!priv->mbhc_btn_enabled)
dev_err(dev,
"DT property missing, MBHC btn detection disabled\n");
return 0; return 0;
} }
@ -820,7 +1146,7 @@ static int pm8916_wcd_analog_spmi_probe(struct platform_device *pdev)
{ {
struct pm8916_wcd_analog_priv *priv; struct pm8916_wcd_analog_priv *priv;
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
int ret, i; int ret, i, irq;
priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
if (!priv) if (!priv)
@ -852,6 +1178,48 @@ static int pm8916_wcd_analog_spmi_probe(struct platform_device *pdev)
return ret; return ret;
} }
irq = platform_get_irq_byname(pdev, "mbhc_switch_int");
if (irq < 0) {
dev_err(dev, "failed to get mbhc switch irq\n");
return irq;
}
ret = devm_request_irq(dev, irq, pm8916_mbhc_switch_irq_handler,
IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING |
IRQF_ONESHOT,
"mbhc switch irq", priv);
if (ret)
dev_err(dev, "cannot request mbhc switch irq\n");
if (priv->mbhc_btn_enabled) {
irq = platform_get_irq_byname(pdev, "mbhc_but_press_det");
if (irq < 0) {
dev_err(dev, "failed to get button press irq\n");
return irq;
}
ret = devm_request_irq(dev, irq, mbhc_btn_press_irq_handler,
IRQF_TRIGGER_RISING |
IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
"mbhc btn press irq", priv);
if (ret)
dev_err(dev, "cannot request mbhc button press irq\n");
irq = platform_get_irq_byname(pdev, "mbhc_but_rel_det");
if (irq < 0) {
dev_err(dev, "failed to get button release irq\n");
return irq;
}
ret = devm_request_irq(dev, irq, mbhc_btn_release_irq_handler,
IRQF_TRIGGER_RISING |
IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
"mbhc btn release irq", priv);
if (ret)
dev_err(dev, "cannot request mbhc button release irq\n");
}
dev_set_drvdata(dev, priv); dev_set_drvdata(dev, priv);
return snd_soc_register_codec(dev, &pm8916_wcd_analog, return snd_soc_register_codec(dev, &pm8916_wcd_analog,

View File

@ -218,6 +218,8 @@ static const char *const rx_mix1_text[] = {
static const char *const dec_mux_text[] = { static const char *const dec_mux_text[] = {
"ZERO", "ADC1", "ADC2", "ADC3", "DMIC1", "DMIC2" "ZERO", "ADC1", "ADC2", "ADC3", "DMIC1", "DMIC2"
}; };
static const char *const cic_mux_text[] = { "AMIC", "DMIC" };
static const char *const rx_mix2_text[] = { "ZERO", "IIR1", "IIR2" }; static const char *const rx_mix2_text[] = { "ZERO", "IIR1", "IIR2" };
static const char *const adc2_mux_text[] = { "ZERO", "INP2", "INP3" }; static const char *const adc2_mux_text[] = { "ZERO", "INP2", "INP3" };
@ -256,11 +258,21 @@ static const struct soc_enum dec1_mux_enum = SOC_ENUM_SINGLE(
static const struct soc_enum dec2_mux_enum = SOC_ENUM_SINGLE( static const struct soc_enum dec2_mux_enum = SOC_ENUM_SINGLE(
LPASS_CDC_CONN_TX_B1_CTL, 3, 6, dec_mux_text); LPASS_CDC_CONN_TX_B1_CTL, 3, 6, dec_mux_text);
/* CIC */
static const struct soc_enum cic1_mux_enum = SOC_ENUM_SINGLE(
LPASS_CDC_TX1_MUX_CTL, 0, 2, cic_mux_text);
static const struct soc_enum cic2_mux_enum = SOC_ENUM_SINGLE(
LPASS_CDC_TX2_MUX_CTL, 0, 2, cic_mux_text);
/* RDAC2 MUX */ /* RDAC2 MUX */
static const struct snd_kcontrol_new dec1_mux = SOC_DAPM_ENUM( static const struct snd_kcontrol_new dec1_mux = SOC_DAPM_ENUM(
"DEC1 MUX Mux", dec1_mux_enum); "DEC1 MUX Mux", dec1_mux_enum);
static const struct snd_kcontrol_new dec2_mux = SOC_DAPM_ENUM( static const struct snd_kcontrol_new dec2_mux = SOC_DAPM_ENUM(
"DEC2 MUX Mux", dec2_mux_enum); "DEC2 MUX Mux", dec2_mux_enum);
static const struct snd_kcontrol_new cic1_mux = SOC_DAPM_ENUM(
"CIC1 MUX Mux", cic1_mux_enum);
static const struct snd_kcontrol_new cic2_mux = SOC_DAPM_ENUM(
"CIC2 MUX Mux", cic2_mux_enum);
static const struct snd_kcontrol_new rx_mix1_inp1_mux = SOC_DAPM_ENUM( static const struct snd_kcontrol_new rx_mix1_inp1_mux = SOC_DAPM_ENUM(
"RX1 MIX1 INP1 Mux", rx_mix1_inp_enum[0]); "RX1 MIX1 INP1 Mux", rx_mix1_inp_enum[0]);
static const struct snd_kcontrol_new rx_mix1_inp2_mux = SOC_DAPM_ENUM( static const struct snd_kcontrol_new rx_mix1_inp2_mux = SOC_DAPM_ENUM(
@ -500,6 +512,8 @@ static const struct snd_soc_dapm_widget msm8916_wcd_digital_dapm_widgets[] = {
SND_SOC_DAPM_MUX("RX3 MIX1 INP3", SND_SOC_NOPM, 0, 0, SND_SOC_DAPM_MUX("RX3 MIX1 INP3", SND_SOC_NOPM, 0, 0,
&rx3_mix1_inp3_mux), &rx3_mix1_inp3_mux),
SND_SOC_DAPM_MUX("CIC1 MUX", SND_SOC_NOPM, 0, 0, &cic1_mux),
SND_SOC_DAPM_MUX("CIC2 MUX", SND_SOC_NOPM, 0, 0, &cic2_mux),
/* TX */ /* TX */
SND_SOC_DAPM_MIXER("ADC1", SND_SOC_NOPM, 0, 0, NULL, 0), SND_SOC_DAPM_MIXER("ADC1", SND_SOC_NOPM, 0, 0, NULL, 0),
SND_SOC_DAPM_MIXER("ADC2", SND_SOC_NOPM, 0, 0, NULL, 0), SND_SOC_DAPM_MIXER("ADC2", SND_SOC_NOPM, 0, 0, NULL, 0),
@ -536,6 +550,8 @@ static const struct snd_soc_dapm_widget msm8916_wcd_digital_dapm_widgets[] = {
/* Connectivity Clock */ /* Connectivity Clock */
SND_SOC_DAPM_SUPPLY_S("CDC_CONN", -2, LPASS_CDC_CLK_OTHR_CTL, 2, 0, SND_SOC_DAPM_SUPPLY_S("CDC_CONN", -2, LPASS_CDC_CLK_OTHR_CTL, 2, 0,
NULL, 0), NULL, 0),
SND_SOC_DAPM_MIC("Digital Mic1", NULL),
SND_SOC_DAPM_MIC("Digital Mic2", NULL),
}; };
@ -568,6 +584,15 @@ static int msm8916_wcd_digital_codec_probe(struct snd_soc_codec *codec)
return 0; return 0;
} }
static int msm8916_wcd_digital_codec_set_sysclk(struct snd_soc_codec *codec,
int clk_id, int source,
unsigned int freq, int dir)
{
struct msm8916_wcd_digital_priv *p = dev_get_drvdata(codec->dev);
return clk_set_rate(p->mclk, freq);
}
static int msm8916_wcd_digital_hw_params(struct snd_pcm_substream *substream, static int msm8916_wcd_digital_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params, struct snd_pcm_hw_params *params,
struct snd_soc_dai *dai) struct snd_soc_dai *dai)
@ -646,6 +671,11 @@ static const struct snd_soc_dapm_route msm8916_wcd_digital_audio_map[] = {
{"AIF1 Capture", NULL, "I2S TX2"}, {"AIF1 Capture", NULL, "I2S TX2"},
{"AIF1 Capture", NULL, "I2S TX3"}, {"AIF1 Capture", NULL, "I2S TX3"},
{"CIC1 MUX", "DMIC", "DEC1 MUX"},
{"CIC1 MUX", "AMIC", "DEC1 MUX"},
{"CIC2 MUX", "DMIC", "DEC2 MUX"},
{"CIC2 MUX", "AMIC", "DEC2 MUX"},
/* Decimator Inputs */ /* Decimator Inputs */
{"DEC1 MUX", "DMIC1", "DMIC1"}, {"DEC1 MUX", "DMIC1", "DMIC1"},
{"DEC1 MUX", "DMIC2", "DMIC2"}, {"DEC1 MUX", "DMIC2", "DMIC2"},
@ -664,8 +694,8 @@ static const struct snd_soc_dapm_route msm8916_wcd_digital_audio_map[] = {
{"DMIC1", NULL, "DMIC_CLK"}, {"DMIC1", NULL, "DMIC_CLK"},
{"DMIC2", NULL, "DMIC_CLK"}, {"DMIC2", NULL, "DMIC_CLK"},
{"I2S TX1", NULL, "DEC1 MUX"}, {"I2S TX1", NULL, "CIC1 MUX"},
{"I2S TX2", NULL, "DEC2 MUX"}, {"I2S TX2", NULL, "CIC2 MUX"},
{"I2S TX1", NULL, "TX_I2S_CLK"}, {"I2S TX1", NULL, "TX_I2S_CLK"},
{"I2S TX2", NULL, "TX_I2S_CLK"}, {"I2S TX2", NULL, "TX_I2S_CLK"},
@ -788,7 +818,7 @@ static void msm8916_wcd_digital_shutdown(struct snd_pcm_substream *substream,
LPASS_CDC_CLK_PDM_CTL_PDM_CLK_SEL_MASK, 0); LPASS_CDC_CLK_PDM_CTL_PDM_CLK_SEL_MASK, 0);
} }
static struct snd_soc_dai_ops msm8916_wcd_digital_dai_ops = { static const struct snd_soc_dai_ops msm8916_wcd_digital_dai_ops = {
.startup = msm8916_wcd_digital_startup, .startup = msm8916_wcd_digital_startup,
.shutdown = msm8916_wcd_digital_shutdown, .shutdown = msm8916_wcd_digital_shutdown,
.hw_params = msm8916_wcd_digital_hw_params, .hw_params = msm8916_wcd_digital_hw_params,
@ -821,8 +851,9 @@ static struct snd_soc_dai_driver msm8916_wcd_digital_dai[] = {
}, },
}; };
static struct snd_soc_codec_driver msm8916_wcd_digital = { static const struct snd_soc_codec_driver msm8916_wcd_digital = {
.probe = msm8916_wcd_digital_codec_probe, .probe = msm8916_wcd_digital_codec_probe,
.set_sysclk = msm8916_wcd_digital_codec_set_sysclk,
.component_driver = { .component_driver = {
.controls = msm8916_wcd_digital_snd_controls, .controls = msm8916_wcd_digital_snd_controls,
.num_controls = ARRAY_SIZE(msm8916_wcd_digital_snd_controls), .num_controls = ARRAY_SIZE(msm8916_wcd_digital_snd_controls),

View File

@ -735,7 +735,7 @@ static int __maybe_unused nau8540_resume(struct snd_soc_codec *codec)
return 0; return 0;
} }
static struct snd_soc_codec_driver nau8540_codec_driver = { static const struct snd_soc_codec_driver nau8540_codec_driver = {
.set_sysclk = nau8540_set_sysclk, .set_sysclk = nau8540_set_sysclk,
.set_pll = nau8540_set_pll, .set_pll = nau8540_set_pll,
.suspend = nau8540_suspend, .suspend = nau8540_suspend,

View File

@ -808,7 +808,7 @@ static const struct regmap_config nau8810_regmap_config = {
.num_reg_defaults = ARRAY_SIZE(nau8810_reg_defaults), .num_reg_defaults = ARRAY_SIZE(nau8810_reg_defaults),
}; };
static struct snd_soc_codec_driver nau8810_codec_driver = { static const struct snd_soc_codec_driver nau8810_codec_driver = {
.set_bias_level = nau8810_set_bias_level, .set_bias_level = nau8810_set_bias_level,
.suspend_bias_off = true, .suspend_bias_off = true,

View File

@ -1469,7 +1469,7 @@ static int __maybe_unused nau8824_resume(struct snd_soc_codec *codec)
return 0; return 0;
} }
static struct snd_soc_codec_driver nau8824_codec_driver = { static const struct snd_soc_codec_driver nau8824_codec_driver = {
.probe = nau8824_codec_probe, .probe = nau8824_codec_probe,
.set_sysclk = nau8824_set_sysclk, .set_sysclk = nau8824_set_sysclk,
.set_pll = nau8824_set_pll, .set_pll = nau8824_set_pll,

View File

@ -2388,7 +2388,7 @@ static int __maybe_unused nau8825_resume(struct snd_soc_codec *codec)
return 0; return 0;
} }
static struct snd_soc_codec_driver nau8825_codec_driver = { static const struct snd_soc_codec_driver nau8825_codec_driver = {
.probe = nau8825_codec_probe, .probe = nau8825_codec_probe,
.remove = nau8825_codec_remove, .remove = nau8825_codec_remove,
.set_sysclk = nau8825_set_sysclk, .set_sysclk = nau8825_set_sysclk,

View File

@ -288,7 +288,7 @@ static const struct regmap_config pcm1681_regmap = {
.readable_reg = pcm1681_accessible_reg, .readable_reg = pcm1681_accessible_reg,
}; };
static struct snd_soc_codec_driver soc_codec_dev_pcm1681 = { static const struct snd_soc_codec_driver soc_codec_dev_pcm1681 = {
.component_driver = { .component_driver = {
.controls = pcm1681_controls, .controls = pcm1681_controls,
.num_controls = ARRAY_SIZE(pcm1681_controls), .num_controls = ARRAY_SIZE(pcm1681_controls),

View File

@ -205,7 +205,7 @@ const struct regmap_config pcm179x_regmap_config = {
}; };
EXPORT_SYMBOL_GPL(pcm179x_regmap_config); EXPORT_SYMBOL_GPL(pcm179x_regmap_config);
static struct snd_soc_codec_driver soc_codec_dev_pcm179x = { static const struct snd_soc_codec_driver soc_codec_dev_pcm179x = {
.component_driver = { .component_driver = {
.controls = pcm179x_controls, .controls = pcm179x_controls,
.num_controls = ARRAY_SIZE(pcm179x_controls), .num_controls = ARRAY_SIZE(pcm179x_controls),

View File

@ -98,7 +98,7 @@ static struct snd_soc_dai_driver pcm3008_dai = {
}, },
}; };
static struct snd_soc_codec_driver soc_codec_dev_pcm3008 = { static const struct snd_soc_codec_driver soc_codec_dev_pcm3008 = {
.component_driver = { .component_driver = {
.dapm_widgets = pcm3008_dapm_widgets, .dapm_widgets = pcm3008_dapm_widgets,
.num_dapm_widgets = ARRAY_SIZE(pcm3008_dapm_widgets), .num_dapm_widgets = ARRAY_SIZE(pcm3008_dapm_widgets),

View File

@ -1344,7 +1344,7 @@ static struct snd_soc_dai_driver pcm512x_dai = {
.ops = &pcm512x_dai_ops, .ops = &pcm512x_dai_ops,
}; };
static struct snd_soc_codec_driver pcm512x_codec_driver = { static const struct snd_soc_codec_driver pcm512x_codec_driver = {
.set_bias_level = pcm512x_set_bias_level, .set_bias_level = pcm512x_set_bias_level,
.idle_bias_off = true, .idle_bias_off = true,

1228
sound/soc/codecs/rt274.c Normal file

File diff suppressed because it is too large Load Diff

217
sound/soc/codecs/rt274.h Normal file
View File

@ -0,0 +1,217 @@
/*
* rt274.h -- RT274 ALSA SoC audio driver
*
* Copyright 2016 Realtek Microelectronics
* Author: Bard Liao <bardliao@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 __RT274_H__
#define __RT274_H__
#define VERB_CMD(V, N, D) ((N << 20) | (V << 8) | D)
#define RT274_AUDIO_FUNCTION_GROUP 0x01
#define RT274_DAC_OUT0 0x02
#define RT274_DAC_OUT1 0x03
#define RT274_ADC_IN2 0x08
#define RT274_ADC_IN1 0x09
#define RT274_DIG_CVT 0x0a
#define RT274_DMIC1 0x12
#define RT274_DMIC2 0x13
#define RT274_MIC 0x19
#define RT274_LINE1 0x1a
#define RT274_LINE2 0x1b
#define RT274_LINE3 0x16
#define RT274_SPDIF 0x1e
#define RT274_VENDOR_REGISTERS 0x20
#define RT274_HP_OUT 0x21
#define RT274_MIXER_IN1 0x22
#define RT274_MIXER_IN2 0x23
#define RT274_INLINE_CMD 0x55
#define RT274_SET_PIN_SFT 6
#define RT274_SET_PIN_ENABLE 0x40
#define RT274_SET_PIN_DISABLE 0
#define RT274_SET_EAPD_HIGH 0x2
#define RT274_SET_EAPD_LOW 0
#define RT274_MUTE_SFT 7
/* Verb commands */
#define RT274_RESET\
VERB_CMD(AC_VERB_SET_CODEC_RESET, RT274_AUDIO_FUNCTION_GROUP, 0)
#define RT274_GET_PARAM(NID, PARAM) VERB_CMD(AC_VERB_PARAMETERS, NID, PARAM)
#define RT274_SET_POWER(NID) VERB_CMD(AC_VERB_SET_POWER_STATE, NID, 0)
#define RT274_SET_AUDIO_POWER RT274_SET_POWER(RT274_AUDIO_FUNCTION_GROUP)
#define RT274_SET_HPO_POWER RT274_SET_POWER(RT274_HP_OUT)
#define RT274_SET_DMIC1_POWER RT274_SET_POWER(RT274_DMIC1)
#define RT274_LOUT_MUX\
VERB_CMD(AC_VERB_SET_CONNECT_SEL, RT274_LINE3, 0)
#define RT274_HPO_MUX\
VERB_CMD(AC_VERB_SET_CONNECT_SEL, RT274_HP_OUT, 0)
#define RT274_ADC0_MUX\
VERB_CMD(AC_VERB_SET_CONNECT_SEL, RT274_MIXER_IN1, 0)
#define RT274_ADC1_MUX\
VERB_CMD(AC_VERB_SET_CONNECT_SEL, RT274_MIXER_IN2, 0)
#define RT274_SET_MIC\
VERB_CMD(AC_VERB_SET_PIN_WIDGET_CONTROL, RT274_MIC, 0)
#define RT274_SET_PIN_LOUT3\
VERB_CMD(AC_VERB_SET_PIN_WIDGET_CONTROL, RT274_LINE3, 0)
#define RT274_SET_PIN_HPO\
VERB_CMD(AC_VERB_SET_PIN_WIDGET_CONTROL, RT274_HP_OUT, 0)
#define RT274_SET_PIN_DMIC1\
VERB_CMD(AC_VERB_SET_PIN_WIDGET_CONTROL, RT274_DMIC1, 0)
#define RT274_SET_PIN_SPDIF\
VERB_CMD(AC_VERB_SET_PIN_WIDGET_CONTROL, RT274_SPDIF, 0)
#define RT274_SET_PIN_DIG_CVT\
VERB_CMD(AC_VERB_SET_DIGI_CONVERT_1, RT274_DIG_CVT, 0)
#define RT274_SET_AMP_GAIN_HPO\
VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT274_HP_OUT, 0)
#define RT274_SET_AMP_GAIN_ADC_IN1\
VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT274_ADC_IN1, 0)
#define RT274_SET_AMP_GAIN_ADC_IN2\
VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT274_ADC_IN2, 0)
#define RT274_GET_HP_SENSE\
VERB_CMD(AC_VERB_GET_PIN_SENSE, RT274_HP_OUT, 0)
#define RT274_GET_MIC_SENSE\
VERB_CMD(AC_VERB_GET_PIN_SENSE, RT274_MIC, 0)
#define RT274_SET_DMIC2_DEFAULT\
VERB_CMD(AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, RT274_DMIC2, 0)
#define RT274_SET_SPDIF_DEFAULT\
VERB_CMD(AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, RT274_SPDIF, 0)
#define RT274_DAC0L_GAIN\
VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT274_DAC_OUT0, 0xa000)
#define RT274_DAC0R_GAIN\
VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT274_DAC_OUT0, 0x9000)
#define RT274_DAC1L_GAIN\
VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT274_DAC_OUT1, 0xa000)
#define RT274_DAC1R_GAIN\
VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT274_DAC_OUT1, 0x9000)
#define RT274_ADCL_GAIN\
VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT274_ADC_IN1, 0x6000)
#define RT274_ADCR_GAIN\
VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT274_ADC_IN1, 0x5000)
#define RT274_MIC_GAIN\
VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT274_MIC, 0x7000)
#define RT274_LOUTL_GAIN\
VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT274_LINE3, 0xa000)
#define RT274_LOUTR_GAIN\
VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT274_LINE3, 0x9000)
#define RT274_HPOL_GAIN\
VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT274_HP_OUT, 0xa000)
#define RT274_HPOR_GAIN\
VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT274_HP_OUT, 0x9000)
#define RT274_DAC_FORMAT\
VERB_CMD(AC_VERB_SET_STREAM_FORMAT, RT274_DAC_OUT0, 0)
#define RT274_ADC_FORMAT\
VERB_CMD(AC_VERB_SET_STREAM_FORMAT, RT274_ADC_IN1, 0)
#define RT274_COEF_INDEX\
VERB_CMD(AC_VERB_SET_COEF_INDEX, RT274_VENDOR_REGISTERS, 0)
#define RT274_PROC_COEF\
VERB_CMD(AC_VERB_SET_PROC_COEF, RT274_VENDOR_REGISTERS, 0)
#define RT274_UNSOLICITED_INLINE_CMD\
VERB_CMD(AC_VERB_SET_UNSOLICITED_ENABLE, RT274_INLINE_CMD, 0)
#define RT274_UNSOLICITED_HP_OUT\
VERB_CMD(AC_VERB_SET_UNSOLICITED_ENABLE, RT274_HP_OUT, 0)
#define RT274_UNSOLICITED_MIC\
VERB_CMD(AC_VERB_SET_UNSOLICITED_ENABLE, RT274_MIC, 0)
#define RT274_COEF58_INDEX\
VERB_CMD(AC_VERB_SET_COEF_INDEX, 0x58, 0)
#define RT274_COEF58_COEF\
VERB_CMD(AC_VERB_SET_PROC_COEF, 0x58, 0)
#define RT274_COEF5b_INDEX\
VERB_CMD(AC_VERB_SET_COEF_INDEX, 0x5b, 0)
#define RT274_COEF5b_COEF\
VERB_CMD(AC_VERB_SET_PROC_COEF, 0x5b, 0)
#define RT274_SET_STREAMID_DAC0\
VERB_CMD(AC_VERB_SET_CHANNEL_STREAMID, RT274_DAC_OUT0, 0)
#define RT274_SET_STREAMID_DAC1\
VERB_CMD(AC_VERB_SET_CHANNEL_STREAMID, RT274_DAC_OUT1, 0)
#define RT274_SET_STREAMID_ADC1\
VERB_CMD(AC_VERB_SET_CHANNEL_STREAMID, RT274_ADC_IN1, 0)
#define RT274_SET_STREAMID_ADC2\
VERB_CMD(AC_VERB_SET_CHANNEL_STREAMID, RT274_ADC_IN2, 0)
/* Index registers */
#define RT274_EAPD_GPIO_IRQ_CTRL 0x10
#define RT274_PAD_CTRL12 0x35
#define RT274_I2S_CTRL1 0x63
#define RT274_I2S_CTRL2 0x64
#define RT274_MCLK_CTRL 0x71
#define RT274_CLK_CTRL 0x72
#define RT274_PLL2_CTRL 0x7b
/* EAPD GPIO IRQ control (Index 0x10) */
#define RT274_IRQ_DIS (0x0 << 13)
#define RT274_IRQ_EN (0x1 << 13)
#define RT274_IRQ_CLR (0x1 << 12)
#define RT274_GPI2_SEL_MASK (0x3 << 7)
#define RT274_GPI2_SEL_GPIO2 (0x0 << 7)
#define RT274_GPI2_SEL_I2S (0x1 << 7)
#define RT274_GPI2_SEL_DMIC_CLK (0x2 << 7)
#define RT274_GPI2_SEL_CBJ (0x3 << 7)
/* Front I2S_Interface control 1 (Index 0x63) */
#define RT274_I2S_MODE_MASK (0x1 << 11)
#define RT274_I2S_MODE_S (0x0 << 11)
#define RT274_I2S_MODE_M (0x1 << 11)
#define RT274_TDM_DIS (0x0 << 10)
#define RT274_TDM_EN (0x1 << 10)
#define RT274_TDM_CH_NUM (0x1 << 7)
#define RT274_TDM_2CH (0x0 << 7)
#define RT274_TDM_4CH (0x1 << 7)
#define RT274_I2S_FMT_MASK (0x3 << 8)
#define RT274_I2S_FMT_I2S (0x0 << 8)
#define RT274_I2S_FMT_LJ (0x1 << 8)
#define RT274_I2S_FMT_PCMA (0x2 << 8)
#define RT274_I2S_FMT_PCMB (0x3 << 8)
/* MCLK clock domain control (Index 0x71) */
#define RT274_MCLK_MODE_MASK (0x1 << 14)
#define RT274_MCLK_MODE_DIS (0x0 << 14)
#define RT274_MCLK_MODE_EN (0x1 << 14)
/* Clock control (Index 0x72) */
#define RT274_CLK_SRC_MASK (0x7 << 3)
#define RT274_CLK_SRC_MCLK (0x0 << 3)
#define RT274_CLK_SRC_PLL2 (0x3 << 3)
/* PLL2 control (Index 0x7b) */
#define RT274_PLL2_SRC_MASK (0x1 << 13)
#define RT274_PLL2_SRC_MCLK (0x0 << 13)
#define RT274_PLL2_SRC_BCLK (0x1 << 13)
/* HP-OUT (0x21) */
#define RT274_M_HP_MUX_SFT 14
#define RT274_HP_SEL_MASK 0x1
#define RT274_HP_SEL_SFT 0
#define RT274_HP_SEL_F 0
#define RT274_HP_SEL_S 1
/* ADC (0x22) (0x23) */
#define RT274_ADC_SEL_MASK 0x7
#define RT274_ADC_SEL_SFT 0
#define RT274_ADC_SEL_MIC 0
#define RT274_ADC_SEL_LINE1 1
#define RT274_ADC_SEL_LINE2 2
#define RT274_ADC_SEL_DMIC 3
#define RT274_SCLK_S_MCLK 0
#define RT274_SCLK_S_PLL1 1
#define RT274_SCLK_S_PLL2 2
#define RT274_PLL2_S_MCLK 0
#define RT274_PLL2_S_BCLK 1
enum {
RT274_AIF1,
RT274_AIFS,
};
#endif /* __RT274_H__ */

View File

@ -1046,7 +1046,7 @@ static struct snd_soc_dai_driver rt286_dai[] = {
}; };
static struct snd_soc_codec_driver soc_codec_dev_rt286 = { static const struct snd_soc_codec_driver soc_codec_dev_rt286 = {
.probe = rt286_probe, .probe = rt286_probe,
.remove = rt286_remove, .remove = rt286_remove,
.suspend = rt286_suspend, .suspend = rt286_suspend,

View File

@ -1113,7 +1113,7 @@ static struct snd_soc_dai_driver rt298_dai[] = {
}; };
static struct snd_soc_codec_driver soc_codec_dev_rt298 = { static const struct snd_soc_codec_driver soc_codec_dev_rt298 = {
.probe = rt298_probe, .probe = rt298_probe,
.remove = rt298_remove, .remove = rt298_remove,
.suspend = rt298_suspend, .suspend = rt298_suspend,

View File

@ -260,7 +260,7 @@ static int rt5514_spi_pcm_probe(struct snd_soc_platform *platform)
return 0; return 0;
} }
static struct snd_soc_platform_driver rt5514_spi_platform = { static const struct snd_soc_platform_driver rt5514_spi_platform = {
.probe = rt5514_spi_pcm_probe, .probe = rt5514_spi_pcm_probe,
.ops = &rt5514_spi_pcm_ops, .ops = &rt5514_spi_pcm_ops,
}; };

View File

@ -1042,7 +1042,7 @@ struct snd_soc_dai_driver rt5514_dai[] = {
} }
}; };
static struct snd_soc_codec_driver soc_codec_dev_rt5514 = { static const struct snd_soc_codec_driver soc_codec_dev_rt5514 = {
.probe = rt5514_probe, .probe = rt5514_probe,
.idle_bias_off = true, .idle_bias_off = true,
.set_bias_level = rt5514_set_bias_level, .set_bias_level = rt5514_set_bias_level,

View File

@ -1294,7 +1294,7 @@ static struct snd_soc_dai_driver rt5616_dai[] = {
}, },
}; };
static struct snd_soc_codec_driver soc_codec_dev_rt5616 = { static const struct snd_soc_codec_driver soc_codec_dev_rt5616 = {
.probe = rt5616_probe, .probe = rt5616_probe,
.suspend = rt5616_suspend, .suspend = rt5616_suspend,
.resume = rt5616_resume, .resume = rt5616_resume,

View File

@ -1653,7 +1653,7 @@ static struct snd_soc_dai_driver rt5631_dai[] = {
}, },
}; };
static struct snd_soc_codec_driver soc_codec_dev_rt5631 = { static const struct snd_soc_codec_driver soc_codec_dev_rt5631 = {
.probe = rt5631_probe, .probe = rt5631_probe,
.set_bias_level = rt5631_set_bias_level, .set_bias_level = rt5631_set_bias_level,
.suspend_bias_off = true, .suspend_bias_off = true,

View File

@ -2259,7 +2259,7 @@ static struct snd_soc_dai_driver rt5640_dai[] = {
}, },
}; };
static struct snd_soc_codec_driver soc_codec_dev_rt5640 = { static const struct snd_soc_codec_driver soc_codec_dev_rt5640 = {
.probe = rt5640_probe, .probe = rt5640_probe,
.remove = rt5640_remove, .remove = rt5640_remove,
.suspend = rt5640_suspend, .suspend = rt5640_suspend,

View File

@ -3473,7 +3473,7 @@ static struct snd_soc_dai_driver rt5645_dai[] = {
}, },
}; };
static struct snd_soc_codec_driver soc_codec_dev_rt5645 = { static const struct snd_soc_codec_driver soc_codec_dev_rt5645 = {
.probe = rt5645_probe, .probe = rt5645_probe,
.remove = rt5645_remove, .remove = rt5645_remove,
.suspend = rt5645_suspend, .suspend = rt5645_suspend,

View File

@ -1664,7 +1664,7 @@ static struct snd_soc_dai_driver rt5651_dai[] = {
}, },
}; };
static struct snd_soc_codec_driver soc_codec_dev_rt5651 = { static const struct snd_soc_codec_driver soc_codec_dev_rt5651 = {
.probe = rt5651_probe, .probe = rt5651_probe,
.suspend = rt5651_suspend, .suspend = rt5651_suspend,
.resume = rt5651_resume, .resume = rt5651_resume,

View File

@ -3730,7 +3730,7 @@ static struct snd_soc_dai_driver rt5659_dai[] = {
}, },
}; };
static struct snd_soc_codec_driver soc_codec_dev_rt5659 = { static const struct snd_soc_codec_driver soc_codec_dev_rt5659 = {
.probe = rt5659_probe, .probe = rt5659_probe,
.remove = rt5659_remove, .remove = rt5659_remove,
.suspend = rt5659_suspend, .suspend = rt5659_suspend,

View File

@ -1197,7 +1197,7 @@ static struct snd_soc_dai_driver rt5660_dai[] = {
}, },
}; };
static struct snd_soc_codec_driver soc_codec_dev_rt5660 = { static const struct snd_soc_codec_driver soc_codec_dev_rt5660 = {
.probe = rt5660_probe, .probe = rt5660_probe,
.remove = rt5660_remove, .remove = rt5660_remove,
.suspend = rt5660_suspend, .suspend = rt5660_suspend,

View File

@ -2891,7 +2891,7 @@ static struct snd_soc_dai_driver rt5663_dai[] = {
}, },
}; };
static struct snd_soc_codec_driver soc_codec_dev_rt5663 = { static const struct snd_soc_codec_driver soc_codec_dev_rt5663 = {
.probe = rt5663_probe, .probe = rt5663_probe,
.remove = rt5663_remove, .remove = rt5663_remove,
.suspend = rt5663_suspend, .suspend = rt5663_suspend,

View File

@ -4562,7 +4562,7 @@ static struct snd_soc_dai_driver rt5665_dai[] = {
}, },
}; };
static struct snd_soc_codec_driver soc_codec_dev_rt5665 = { static const struct snd_soc_codec_driver soc_codec_dev_rt5665 = {
.probe = rt5665_probe, .probe = rt5665_probe,
.remove = rt5665_remove, .remove = rt5665_remove,
.suspend = rt5665_suspend, .suspend = rt5665_suspend,

View File

@ -2765,7 +2765,7 @@ static struct snd_soc_dai_driver rt5670_dai[] = {
}, },
}; };
static struct snd_soc_codec_driver soc_codec_dev_rt5670 = { static const struct snd_soc_codec_driver soc_codec_dev_rt5670 = {
.probe = rt5670_probe, .probe = rt5670_probe,
.remove = rt5670_remove, .remove = rt5670_remove,
.suspend = rt5670_suspend, .suspend = rt5670_suspend,

View File

@ -4968,7 +4968,7 @@ static struct snd_soc_dai_driver rt5677_dai[] = {
}, },
}; };
static struct snd_soc_codec_driver soc_codec_dev_rt5677 = { static const struct snd_soc_codec_driver soc_codec_dev_rt5677 = {
.probe = rt5677_probe, .probe = rt5677_probe,
.remove = rt5677_remove, .remove = rt5677_remove,
.suspend = rt5677_suspend, .suspend = rt5677_suspend,

View File

@ -1248,7 +1248,7 @@ static int sgtl5000_remove(struct snd_soc_codec *codec)
return 0; return 0;
} }
static struct snd_soc_codec_driver sgtl5000_driver = { static const struct snd_soc_codec_driver sgtl5000_driver = {
.probe = sgtl5000_probe, .probe = sgtl5000_probe,
.remove = sgtl5000_remove, .remove = sgtl5000_remove,
.set_bias_level = sgtl5000_set_bias_level, .set_bias_level = sgtl5000_set_bias_level,

View File

@ -236,7 +236,7 @@ static struct regmap *si476x_get_regmap(struct device *dev)
return dev_get_regmap(dev->parent, NULL); return dev_get_regmap(dev->parent, NULL);
} }
static struct snd_soc_codec_driver soc_codec_dev_si476x = { static const struct snd_soc_codec_driver soc_codec_dev_si476x = {
.get_regmap = si476x_get_regmap, .get_regmap = si476x_get_regmap,
.component_driver = { .component_driver = {
.dapm_widgets = si476x_dapm_widgets, .dapm_widgets = si476x_dapm_widgets,

View File

@ -429,7 +429,7 @@ static int sirf_audio_codec_remove(struct snd_soc_codec *codec)
return 0; return 0;
} }
static struct snd_soc_codec_driver soc_codec_device_sirf_audio_codec = { static const struct snd_soc_codec_driver soc_codec_device_sirf_audio_codec = {
.probe = sirf_audio_codec_probe, .probe = sirf_audio_codec_probe,
.remove = sirf_audio_codec_remove, .remove = sirf_audio_codec_remove,
.dapm_widgets = sirf_audio_codec_dapm_widgets, .dapm_widgets = sirf_audio_codec_dapm_widgets,

View File

@ -883,7 +883,7 @@ static int sn95031_codec_probe(struct snd_soc_codec *codec)
return 0; return 0;
} }
static struct snd_soc_codec_driver sn95031_codec = { static const struct snd_soc_codec_driver sn95031_codec = {
.probe = sn95031_codec_probe, .probe = sn95031_codec_probe,
.set_bias_level = sn95031_set_vaud_bias, .set_bias_level = sn95031_set_vaud_bias,
.idle_bias_off = true, .idle_bias_off = true,

View File

@ -37,7 +37,7 @@ static const struct snd_soc_dapm_route dir_routes[] = {
SNDRV_PCM_FMTBIT_S24_LE | \ SNDRV_PCM_FMTBIT_S24_LE | \
SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_LE) SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_LE)
static struct snd_soc_codec_driver soc_codec_spdif_dir = { static const struct snd_soc_codec_driver soc_codec_spdif_dir = {
.component_driver = { .component_driver = {
.dapm_widgets = dir_widgets, .dapm_widgets = dir_widgets,
.num_dapm_widgets = ARRAY_SIZE(dir_widgets), .num_dapm_widgets = ARRAY_SIZE(dir_widgets),

View File

@ -37,7 +37,7 @@ static const struct snd_soc_dapm_route dit_routes[] = {
{ "spdif-out", NULL, "Playback" }, { "spdif-out", NULL, "Playback" },
}; };
static struct snd_soc_codec_driver soc_codec_spdif_dit = { static const struct snd_soc_codec_driver soc_codec_spdif_dit = {
.component_driver = { .component_driver = {
.dapm_widgets = dit_widgets, .dapm_widgets = dit_widgets,
.num_dapm_widgets = ARRAY_SIZE(dit_widgets), .num_dapm_widgets = ARRAY_SIZE(dit_widgets),

View File

@ -710,7 +710,7 @@ static int ssm2518_set_sysclk(struct snd_soc_codec *codec, int clk_id,
SSM2518_POWER1_NO_BCLK, val); SSM2518_POWER1_NO_BCLK, val);
} }
static struct snd_soc_codec_driver ssm2518_codec_driver = { static const struct snd_soc_codec_driver ssm2518_codec_driver = {
.set_bias_level = ssm2518_set_bias_level, .set_bias_level = ssm2518_set_bias_level,
.set_sysclk = ssm2518_set_sysclk, .set_sysclk = ssm2518_set_sysclk,
.idle_bias_off = true, .idle_bias_off = true,

Some files were not shown because too many files have changed in this diff Show More