Merge remote-tracking branch 'asoc/topic/msm8916' into asoc-next
This commit is contained in:
commit
ab99d9872e
16
Documentation/devicetree/bindings/sound/dmic.txt
Normal file
16
Documentation/devicetree/bindings/sound/dmic.txt
Normal 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>;
|
||||
};
|
@ -31,8 +31,22 @@ Required properties
|
||||
- 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-micbias-supply: phandle of VDD_MICBIAS supply's regulator DT node.
|
||||
|
||||
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
|
||||
connected.
|
||||
- qcom,micbias2-ext-cap: boolean, present if micbias2 has external capacitor
|
||||
@ -48,6 +62,8 @@ spmi_bus {
|
||||
reg-names = "pmic-codec-core";
|
||||
clocks = <&gcc GCC_CODEC_DIGCODEC_CLK>;
|
||||
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>;
|
||||
interrupts = <0x1 0xf0 0x0 IRQ_TYPE_NONE>,
|
||||
<0x1 0xf0 0x1 IRQ_TYPE_NONE>,
|
||||
|
33
Documentation/devicetree/bindings/sound/rt274.txt
Normal file
33
Documentation/devicetree/bindings/sound/rt274.txt
Normal 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>;
|
||||
};
|
@ -1355,7 +1355,7 @@ static struct regmap *pm860x_get_regmap(struct device *dev)
|
||||
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,
|
||||
.remove = pm860x_remove,
|
||||
.set_bias_level = pm860x_set_bias_level,
|
||||
|
@ -71,7 +71,7 @@ config SND_SOC_ALL_CODECS
|
||||
select SND_SOC_DA732X if I2C
|
||||
select SND_SOC_DA9055 if I2C
|
||||
select SND_SOC_DIO2125
|
||||
select SND_SOC_DMIC
|
||||
select SND_SOC_DMIC if GPIOLIB
|
||||
select SND_SOC_ES8316 if I2C
|
||||
select SND_SOC_ES8328_SPI if SPI_MASTER
|
||||
select SND_SOC_ES8328_I2C if I2C
|
||||
@ -114,6 +114,7 @@ config SND_SOC_ALL_CODECS
|
||||
select SND_SOC_PCM5102A
|
||||
select SND_SOC_PCM512x_I2C if I2C
|
||||
select SND_SOC_PCM512x_SPI if SPI_MASTER
|
||||
select SND_SOC_RT274 if I2C
|
||||
select SND_SOC_RT286 if I2C
|
||||
select SND_SOC_RT298 if I2C
|
||||
select SND_SOC_RT5514 if I2C
|
||||
@ -716,11 +717,17 @@ config SND_SOC_RL6231
|
||||
|
||||
config SND_SOC_RL6347A
|
||||
tristate
|
||||
default y if SND_SOC_RT274=y
|
||||
default y if SND_SOC_RT286=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_RT298=m
|
||||
|
||||
config SND_SOC_RT274
|
||||
tristate
|
||||
depends on I2C
|
||||
|
||||
config SND_SOC_RT286
|
||||
tristate
|
||||
depends on I2C
|
||||
|
@ -113,6 +113,7 @@ snd-soc-pcm512x-i2c-objs := pcm512x-i2c.o
|
||||
snd-soc-pcm512x-spi-objs := pcm512x-spi.o
|
||||
snd-soc-rl6231-objs := rl6231.o
|
||||
snd-soc-rl6347a-objs := rl6347a.o
|
||||
snd-soc-rt274-objs := rt274.o
|
||||
snd-soc-rt286-objs := rt286.o
|
||||
snd-soc-rt298-objs := rt298.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_RL6231) += snd-soc-rl6231.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_RT298) += snd-soc-rt298.o
|
||||
obj-$(CONFIG_SND_SOC_RT5514) += snd-soc-rt5514.o
|
||||
|
@ -2523,7 +2523,7 @@ static int ab8500_codec_probe(struct snd_soc_codec *codec)
|
||||
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,
|
||||
.component_driver = {
|
||||
.controls = ab8500_ctrls,
|
||||
|
@ -112,7 +112,7 @@ static int ac97_soc_resume(struct snd_soc_codec *codec)
|
||||
#define ac97_soc_resume NULL
|
||||
#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,
|
||||
.suspend = ac97_soc_suspend,
|
||||
.resume = ac97_soc_resume,
|
||||
|
@ -321,7 +321,7 @@ static int ad1836_remove(struct snd_soc_codec *codec)
|
||||
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,
|
||||
.remove = ad1836_remove,
|
||||
.suspend = ad1836_suspend,
|
||||
|
@ -408,7 +408,7 @@ static int ad193x_codec_probe(struct snd_soc_codec *codec)
|
||||
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,
|
||||
.component_driver = {
|
||||
.controls = ad193x_snd_controls,
|
||||
|
@ -295,7 +295,7 @@ static int ad1980_soc_remove(struct snd_soc_codec *codec)
|
||||
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,
|
||||
.remove = ad1980_soc_remove,
|
||||
|
||||
|
@ -54,7 +54,7 @@ static struct snd_soc_dai_driver ad73311_dai = {
|
||||
.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 = {
|
||||
.dapm_widgets = ad73311_dapm_widgets,
|
||||
.num_dapm_widgets = ARRAY_SIZE(ad73311_dapm_widgets),
|
||||
|
@ -1458,7 +1458,7 @@ static const struct regmap_config adau1373_regmap_config = {
|
||||
.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,
|
||||
.resume = adau1373_resume,
|
||||
.set_bias_level = adau1373_set_bias_level,
|
||||
|
@ -757,7 +757,7 @@ static int adau1701_resume(struct snd_soc_codec *codec)
|
||||
#define adau1701_suspend NULL
|
||||
#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,
|
||||
.remove = adau1701_remove,
|
||||
.resume = adau1701_resume,
|
||||
|
@ -867,7 +867,7 @@ static int adau1977_codec_probe(struct snd_soc_codec *codec)
|
||||
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,
|
||||
.set_bias_level = adau1977_set_bias_level,
|
||||
.set_sysclk = adau1977_set_sysclk,
|
||||
|
@ -825,7 +825,7 @@ static int adav80x_resume(struct snd_soc_codec *codec)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct snd_soc_codec_driver adav80x_codec_driver = {
|
||||
static const struct snd_soc_codec_driver adav80x_codec_driver = {
|
||||
.probe = adav80x_probe,
|
||||
.resume = adav80x_resume,
|
||||
.set_bias_level = adav80x_set_bias_level,
|
||||
|
@ -58,7 +58,7 @@ static struct snd_soc_dai_driver ads117x_dai = {
|
||||
.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 = {
|
||||
.dapm_widgets = ads117x_dapm_widgets,
|
||||
.num_dapm_widgets = ARRAY_SIZE(ads117x_dapm_widgets),
|
||||
|
@ -242,7 +242,7 @@ static int ak4104_soc_resume(struct snd_soc_codec *codec)
|
||||
#define ak4104_soc_resume NULL
|
||||
#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,
|
||||
.remove = ak4104_remove,
|
||||
.suspend = ak4104_soc_suspend,
|
||||
|
@ -390,7 +390,7 @@ static const struct regmap_config ak4535_regmap = {
|
||||
.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,
|
||||
.set_bias_level = ak4535_set_bias_level,
|
||||
.suspend_bias_off = true,
|
||||
|
@ -64,7 +64,7 @@ static struct snd_soc_dai_driver ak4554_dai = {
|
||||
.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 = {
|
||||
.dapm_widgets = ak4554_dapm_widgets,
|
||||
.num_dapm_widgets = ARRAY_SIZE(ak4554_dapm_widgets),
|
||||
|
@ -522,7 +522,7 @@ static int ak4613_resume(struct snd_soc_codec *codec)
|
||||
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,
|
||||
.resume = ak4613_resume,
|
||||
.set_bias_level = ak4613_set_bias_level,
|
||||
|
@ -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 = {
|
||||
.controls = ak4641_snd_controls,
|
||||
.num_controls = ARRAY_SIZE(ak4641_snd_controls),
|
||||
|
@ -550,7 +550,7 @@ static int ak4642_probe(struct snd_soc_codec *codec)
|
||||
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,
|
||||
.suspend = ak4642_suspend,
|
||||
.resume = ak4642_resume,
|
||||
|
@ -610,7 +610,7 @@ static struct snd_soc_dai_driver ak4671_dai = {
|
||||
.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,
|
||||
.component_driver = {
|
||||
.controls = ak4671_snd_controls,
|
||||
|
@ -69,7 +69,7 @@ static int ak5386_soc_resume(struct snd_soc_codec *codec)
|
||||
#define ak5386_soc_resume NULL
|
||||
#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,
|
||||
.remove = ak5386_soc_remove,
|
||||
.suspend = ak5386_soc_suspend,
|
||||
|
@ -951,7 +951,7 @@ static int alc5623_probe(struct snd_soc_codec *codec)
|
||||
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,
|
||||
.suspend = alc5623_suspend,
|
||||
.resume = alc5623_resume,
|
||||
|
@ -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 = {
|
||||
.dapm_widgets = bt_sco_widgets,
|
||||
.num_dapm_widgets = ARRAY_SIZE(bt_sco_widgets),
|
||||
|
@ -128,7 +128,7 @@ static struct regmap *cq93vc_get_regmap(struct device *dev)
|
||||
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,
|
||||
.get_regmap = cq93vc_get_regmap,
|
||||
.component_driver = {
|
||||
|
@ -831,7 +831,7 @@ static int cs35l33_probe(struct snd_soc_codec *codec)
|
||||
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,
|
||||
|
||||
.set_bias_level = cs35l33_set_bias_level,
|
||||
|
@ -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,
|
||||
|
||||
.component_driver = {
|
||||
|
@ -1079,7 +1079,7 @@ static int cs35l35_codec_probe(struct snd_soc_codec *codec)
|
||||
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,
|
||||
.set_sysclk = cs35l35_codec_set_sysclk,
|
||||
.component_driver = {
|
||||
|
@ -639,7 +639,7 @@ static int cs4271_codec_remove(struct snd_soc_codec *codec)
|
||||
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,
|
||||
.remove = cs4271_codec_remove,
|
||||
.suspend = cs4271_soc_suspend,
|
||||
|
@ -504,7 +504,7 @@ static int cs42l51_codec_probe(struct snd_soc_codec *codec)
|
||||
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,
|
||||
|
||||
.component_driver = {
|
||||
|
@ -255,7 +255,7 @@ static struct snd_soc_dai_driver cs4349_dai = {
|
||||
.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 = {
|
||||
.controls = cs4349_snd_controls,
|
||||
.num_controls = ARRAY_SIZE(cs4349_snd_controls),
|
||||
|
@ -1183,7 +1183,7 @@ static struct regmap *cs47l24_get_regmap(struct device *dev)
|
||||
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,
|
||||
.remove = cs47l24_codec_remove,
|
||||
.get_regmap = cs47l24_get_regmap,
|
||||
@ -1213,7 +1213,7 @@ static struct snd_compr_ops cs47l24_compr_ops = {
|
||||
.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,
|
||||
};
|
||||
|
||||
|
@ -892,7 +892,7 @@ static int cs53l30_codec_probe(struct snd_soc_codec *codec)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct snd_soc_codec_driver cs53l30_driver = {
|
||||
static const struct snd_soc_codec_driver cs53l30_driver = {
|
||||
.probe = cs53l30_codec_probe,
|
||||
.set_bias_level = cs53l30_set_bias_level,
|
||||
.idle_bias_off = true,
|
||||
|
@ -398,7 +398,7 @@ static int cx20442_codec_remove(struct snd_soc_codec *codec)
|
||||
|
||||
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,
|
||||
.remove = cx20442_codec_remove,
|
||||
.set_bias_level = cx20442_set_bias_level,
|
||||
|
@ -1164,7 +1164,7 @@ static int da7210_probe(struct snd_soc_codec *codec)
|
||||
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,
|
||||
|
||||
.component_driver = {
|
||||
|
@ -1787,7 +1787,7 @@ static int da7213_probe(struct snd_soc_codec *codec)
|
||||
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,
|
||||
.set_bias_level = da7213_set_bias_level,
|
||||
|
||||
|
@ -3035,7 +3035,7 @@ static int da7218_resume(struct snd_soc_codec *codec)
|
||||
#define da7218_resume NULL
|
||||
#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,
|
||||
.remove = da7218_remove,
|
||||
.suspend = da7218_suspend,
|
||||
|
@ -1891,7 +1891,7 @@ static int da7219_resume(struct snd_soc_codec *codec)
|
||||
#define da7219_resume NULL
|
||||
#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,
|
||||
.remove = da7219_remove,
|
||||
.suspend = da7219_suspend,
|
||||
|
@ -1499,7 +1499,7 @@ static int da732x_set_bias_level(struct snd_soc_codec *codec,
|
||||
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,
|
||||
.component_driver = {
|
||||
.controls = da732x_snd_controls,
|
||||
|
@ -1451,7 +1451,7 @@ static int da9055_probe(struct snd_soc_codec *codec)
|
||||
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,
|
||||
.set_bias_level = da9055_set_bias_level,
|
||||
|
||||
|
@ -19,6 +19,8 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/gpio/consumer.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/module.h>
|
||||
@ -27,6 +29,34 @@
|
||||
#include <sound/soc.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 = {
|
||||
.name = "dmic-hifi",
|
||||
.capture = {
|
||||
@ -38,8 +68,23 @@ static struct snd_soc_dai_driver dmic_dai = {
|
||||
| SNDRV_PCM_FMTBIT_S24_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[] = {
|
||||
SND_SOC_DAPM_AIF_OUT("DMIC AIF", "Capture", 0,
|
||||
SND_SOC_NOPM, 0, 0),
|
||||
@ -50,7 +95,8 @@ static const struct snd_soc_dapm_route intercon[] = {
|
||||
{"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 = {
|
||||
.dapm_widgets = 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");
|
||||
|
||||
static const struct of_device_id dmic_dev_match[] = {
|
||||
{.compatible = "dmic-codec"},
|
||||
{}
|
||||
};
|
||||
|
||||
static struct platform_driver dmic_driver = {
|
||||
.driver = {
|
||||
.name = "dmic-codec",
|
||||
.of_match_table = dmic_dev_match,
|
||||
},
|
||||
.probe = dmic_dev_probe,
|
||||
.remove = dmic_dev_remove,
|
||||
|
@ -69,7 +69,7 @@ static const struct snd_soc_dapm_route es7134_dapm_routes[] = {
|
||||
{ "AOUTR", NULL, "DAC" },
|
||||
};
|
||||
|
||||
static struct snd_soc_codec_driver es7134_codec_driver = {
|
||||
static const struct snd_soc_codec_driver es7134_codec_driver = {
|
||||
.component_driver = {
|
||||
.dapm_widgets = es7134_dapm_widgets,
|
||||
.num_dapm_widgets = ARRAY_SIZE(es7134_dapm_widgets),
|
||||
|
@ -554,7 +554,7 @@ static int es8316_probe(struct snd_soc_codec *codec)
|
||||
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,
|
||||
.idle_bias_off = true,
|
||||
|
||||
|
@ -830,7 +830,7 @@ const struct regmap_config 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,
|
||||
.suspend = es8328_suspend,
|
||||
.resume = es8328_resume,
|
||||
|
@ -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,
|
||||
.shutdown = hdac_hdmi_pcm_close,
|
||||
.hw_params = hdac_hdmi_set_hw_params,
|
||||
@ -1858,7 +1858,7 @@ static void hdmi_codec_complete(struct device *dev)
|
||||
#define hdmi_codec_complete NULL
|
||||
#endif
|
||||
|
||||
static struct snd_soc_codec_driver hdmi_hda_codec = {
|
||||
static const struct snd_soc_codec_driver hdmi_hda_codec = {
|
||||
.probe = hdmi_codec_probe,
|
||||
.remove = hdmi_codec_remove,
|
||||
.idle_bias_off = true,
|
||||
|
@ -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)
|
||||
{
|
||||
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,
|
||||
[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;
|
||||
}
|
||||
|
||||
|
||||
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,
|
||||
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 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;
|
||||
|
||||
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_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",
|
||||
.id = DAI_ID_I2S,
|
||||
.playback = {
|
||||
@ -730,10 +733,8 @@ static int hdmi_of_xlate_dai_id(struct snd_soc_component *component,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static struct snd_soc_codec_driver hdmi_codec = {
|
||||
static const struct snd_soc_codec_driver hdmi_codec = {
|
||||
.component_driver = {
|
||||
.controls = hdmi_controls,
|
||||
.num_controls = ARRAY_SIZE(hdmi_controls),
|
||||
.dapm_widgets = hdmi_widgets,
|
||||
.num_dapm_widgets = ARRAY_SIZE(hdmi_widgets),
|
||||
.dapm_routes = hdmi_routes,
|
||||
|
@ -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)
|
||||
|
@ -376,7 +376,7 @@ static int rk3036_codec_set_bias_level(struct snd_soc_codec *codec,
|
||||
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,
|
||||
.remove = rk3036_codec_remove,
|
||||
.set_bias_level = rk3036_codec_set_bias_level,
|
||||
|
@ -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,
|
||||
.component_driver = {
|
||||
.controls = isabelle_snd_controls,
|
||||
|
@ -293,7 +293,7 @@ static int jz4740_codec_dev_probe(struct snd_soc_codec *codec)
|
||||
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,
|
||||
.set_bias_level = jz4740_codec_set_bias_level,
|
||||
.suspend_bias_off = true,
|
||||
|
@ -100,7 +100,7 @@ static const struct snd_soc_dapm_route lm4857_routes[] = {
|
||||
{ "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,
|
||||
.num_controls = ARRAY_SIZE(lm4857_controls),
|
||||
.dapm_widgets = lm4857_dapm_widgets,
|
||||
|
@ -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,
|
||||
.component_driver = {
|
||||
.controls = lm49453_snd_controls,
|
||||
|
@ -151,7 +151,7 @@ static int max9768_probe(struct snd_soc_component *component)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct snd_soc_component_driver max9768_component_driver = {
|
||||
static const struct snd_soc_component_driver max9768_component_driver = {
|
||||
.probe = max9768_probe,
|
||||
.controls = max9768_volume,
|
||||
.num_controls = ARRAY_SIZE(max9768_volume),
|
||||
|
@ -1698,7 +1698,7 @@ static int max98088_remove(struct snd_soc_codec *codec)
|
||||
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,
|
||||
.remove = max98088_remove,
|
||||
.set_bias_level = max98088_set_bias_level,
|
||||
|
@ -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,
|
||||
.remove = max98090_remove,
|
||||
.seq_notifier = max98090_seq_notifier,
|
||||
|
@ -2102,7 +2102,7 @@ static int max98095_remove(struct snd_soc_codec *codec)
|
||||
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,
|
||||
.remove = max98095_remove,
|
||||
.suspend = max98095_suspend,
|
||||
|
@ -72,7 +72,7 @@ static int max98357a_codec_probe(struct snd_soc_codec *codec)
|
||||
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,
|
||||
.component_driver = {
|
||||
.dapm_widgets = max98357a_dapm_widgets,
|
||||
|
@ -301,7 +301,7 @@ static int max9850_probe(struct snd_soc_codec *codec)
|
||||
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,
|
||||
.set_bias_level = max9850_set_bias_level,
|
||||
.suspend_bias_off = true,
|
||||
|
@ -534,7 +534,7 @@ static int max9860_set_bias_level(struct snd_soc_codec *codec,
|
||||
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,
|
||||
.idle_bias_off = true,
|
||||
|
||||
|
@ -413,7 +413,7 @@ static int max9867_probe(struct snd_soc_codec *codec)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct snd_soc_codec_driver max9867_codec = {
|
||||
static const struct snd_soc_codec_driver max9867_codec = {
|
||||
.probe = max9867_probe,
|
||||
.component_driver = {
|
||||
.controls = max9867_snd_controls,
|
||||
|
@ -496,7 +496,7 @@ static int max98926_probe(struct snd_soc_codec *codec)
|
||||
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,
|
||||
.component_driver = {
|
||||
.controls = max98926_snd_controls,
|
||||
|
@ -733,7 +733,7 @@ static struct regmap *mc13783_get_regmap(struct device *dev)
|
||||
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,
|
||||
.remove = mc13783_remove,
|
||||
.get_regmap = mc13783_get_regmap,
|
||||
|
@ -537,7 +537,7 @@ static int ml26124_probe(struct snd_soc_codec *codec)
|
||||
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,
|
||||
.set_bias_level = ml26124_set_bias_level,
|
||||
.suspend_bias_off = true,
|
||||
|
@ -12,9 +12,16 @@
|
||||
#include <sound/pcm.h>
|
||||
#include <sound/pcm_params.h>
|
||||
#include <sound/tlv.h>
|
||||
#include <sound/jack.h>
|
||||
|
||||
#define CDC_D_REVISION1 (0xf000)
|
||||
#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 RST_CTL_DIG_SW_RST_N_MASK BIT(7)
|
||||
#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_RXD2_CLK_EN BIT(1)
|
||||
#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_NCP_CLK_EN_MASK 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 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_V2P70V ((0x16) << 3)
|
||||
#define MICB_1_VAL_MICB_OUT_VAL_V1P80V ((0x4) << 3)
|
||||
#define CDC_A_MICB_1_CTL (0xf142)
|
||||
|
||||
#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 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_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_2_EN (0xf161)
|
||||
#define CDC_A_TX_1_2_TEST_CTL_1 (0xf162)
|
||||
@ -213,18 +269,37 @@
|
||||
#define MSM8916_WCD_ANALOG_FORMATS (SNDRV_PCM_FMTBIT_S16_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[] = {
|
||||
"vdd-cdc-io",
|
||||
"vdd-cdc-tx-rx-cx",
|
||||
};
|
||||
|
||||
#define MBHC_MAX_BUTTONS (5)
|
||||
|
||||
struct pm8916_wcd_analog_priv {
|
||||
u16 pmic_rev;
|
||||
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 snd_soc_codec *codec;
|
||||
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 micbias2_cap_mode;
|
||||
unsigned int micbias_mv;
|
||||
};
|
||||
|
||||
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)
|
||||
{
|
||||
struct pm8916_wcd_analog_priv *wcd = snd_soc_codec_get_drvdata(codec);
|
||||
|
||||
snd_soc_update_bits(codec, CDC_A_MICB_1_CTL,
|
||||
MICB_1_CTL_EXT_PRECHARG_EN_MASK |
|
||||
MICB_1_CTL_INT_PRECHARG_BYP_MASK,
|
||||
MICB_1_CTL_INT_PRECHARG_BYP_EXT_PRECHRG_SEL
|
||||
| MICB_1_CTL_EXT_PRECHARG_EN_ENABLE);
|
||||
|
||||
snd_soc_write(codec, CDC_A_MICB_1_VAL, MICB_1_VAL_MICB_OUT_VAL_V2P70V);
|
||||
/*
|
||||
* Special headset needs MICBIAS as 2.7V so wait for
|
||||
* 50 msec for the MICBIAS to reach 2.7 volts.
|
||||
*/
|
||||
msleep(50);
|
||||
if (wcd->micbias_mv) {
|
||||
snd_soc_write(codec, CDC_A_MICB_1_VAL,
|
||||
MICB_VOLTAGE_REGVAL(wcd->micbias_mv));
|
||||
/*
|
||||
* Special headset needs MICBIAS as 2.7V so wait for
|
||||
* 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,
|
||||
MICB_1_CTL_EXT_PRECHARG_EN_MASK |
|
||||
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);
|
||||
}
|
||||
|
||||
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
|
||||
snd_soc_dapm_widget
|
||||
*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 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,
|
||||
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,
|
||||
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;
|
||||
}
|
||||
|
||||
@ -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);
|
||||
|
||||
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),
|
||||
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),
|
||||
};
|
||||
|
||||
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)
|
||||
{
|
||||
return dev_get_regmap(dev->parent, NULL);
|
||||
}
|
||||
|
||||
static int pm8916_wcd_analog_startup(struct snd_pcm_substream *substream,
|
||||
struct snd_soc_dai *dai)
|
||||
static irqreturn_t mbhc_btn_release_irq_handler(int irq, void *arg)
|
||||
{
|
||||
snd_soc_update_bits(dai->codec, CDC_D_CDC_RST_CTL,
|
||||
RST_CTL_DIG_SW_RST_N_MASK,
|
||||
RST_CTL_DIG_SW_RST_N_REMOVE_RESET);
|
||||
struct pm8916_wcd_analog_priv *priv = arg;
|
||||
|
||||
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,
|
||||
struct snd_soc_dai *dai)
|
||||
static irqreturn_t mbhc_btn_press_irq_handler(int irq, void *arg)
|
||||
{
|
||||
snd_soc_update_bits(dai->codec, CDC_D_CDC_RST_CTL,
|
||||
RST_CTL_DIG_SW_RST_N_MASK, 0);
|
||||
struct pm8916_wcd_analog_priv *priv = arg;
|
||||
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,
|
||||
.shutdown = pm8916_wcd_analog_shutdown,
|
||||
};
|
||||
|
||||
static irqreturn_t pm8916_mbhc_switch_irq_handler(int irq, void *arg)
|
||||
{
|
||||
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[] = {
|
||||
[0] = {
|
||||
@ -769,7 +1059,6 @@ static struct snd_soc_dai_driver pm8916_wcd_analog_dai[] = {
|
||||
.channels_min = 1,
|
||||
.channels_max = 3,
|
||||
},
|
||||
.ops = &pm8916_wcd_analog_dai_ops,
|
||||
},
|
||||
[1] = {
|
||||
.name = "pm8916_wcd_analog_pdm_tx",
|
||||
@ -781,13 +1070,13 @@ static struct snd_soc_dai_driver pm8916_wcd_analog_dai[] = {
|
||||
.channels_min = 1,
|
||||
.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,
|
||||
.remove = pm8916_wcd_analog_remove,
|
||||
.set_jack = pm8916_wcd_analog_set_jack,
|
||||
.get_regmap = pm8916_get_regmap,
|
||||
.component_driver = {
|
||||
.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,
|
||||
struct pm8916_wcd_analog_priv *priv)
|
||||
{
|
||||
int rval;
|
||||
|
||||
if (of_property_read_bool(dev->of_node, "qcom,micbias1-ext-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
|
||||
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;
|
||||
}
|
||||
|
||||
@ -820,7 +1146,7 @@ static int pm8916_wcd_analog_spmi_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct pm8916_wcd_analog_priv *priv;
|
||||
struct device *dev = &pdev->dev;
|
||||
int ret, i;
|
||||
int ret, i, irq;
|
||||
|
||||
priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
|
||||
if (!priv)
|
||||
@ -852,6 +1178,48 @@ static int pm8916_wcd_analog_spmi_probe(struct platform_device *pdev)
|
||||
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);
|
||||
|
||||
return snd_soc_register_codec(dev, &pm8916_wcd_analog,
|
||||
|
@ -218,6 +218,8 @@ static const char *const rx_mix1_text[] = {
|
||||
static const char *const dec_mux_text[] = {
|
||||
"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 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(
|
||||
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 */
|
||||
static const struct snd_kcontrol_new dec1_mux = SOC_DAPM_ENUM(
|
||||
"DEC1 MUX Mux", dec1_mux_enum);
|
||||
static const struct snd_kcontrol_new dec2_mux = SOC_DAPM_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(
|
||||
"RX1 MIX1 INP1 Mux", rx_mix1_inp_enum[0]);
|
||||
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,
|
||||
&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 */
|
||||
SND_SOC_DAPM_MIXER("ADC1", 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 */
|
||||
SND_SOC_DAPM_SUPPLY_S("CDC_CONN", -2, LPASS_CDC_CLK_OTHR_CTL, 2, 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;
|
||||
}
|
||||
|
||||
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,
|
||||
struct snd_pcm_hw_params *params,
|
||||
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 TX3"},
|
||||
|
||||
{"CIC1 MUX", "DMIC", "DEC1 MUX"},
|
||||
{"CIC1 MUX", "AMIC", "DEC1 MUX"},
|
||||
{"CIC2 MUX", "DMIC", "DEC2 MUX"},
|
||||
{"CIC2 MUX", "AMIC", "DEC2 MUX"},
|
||||
|
||||
/* Decimator Inputs */
|
||||
{"DEC1 MUX", "DMIC1", "DMIC1"},
|
||||
{"DEC1 MUX", "DMIC2", "DMIC2"},
|
||||
@ -664,8 +694,8 @@ static const struct snd_soc_dapm_route msm8916_wcd_digital_audio_map[] = {
|
||||
{"DMIC1", NULL, "DMIC_CLK"},
|
||||
{"DMIC2", NULL, "DMIC_CLK"},
|
||||
|
||||
{"I2S TX1", NULL, "DEC1 MUX"},
|
||||
{"I2S TX2", NULL, "DEC2 MUX"},
|
||||
{"I2S TX1", NULL, "CIC1 MUX"},
|
||||
{"I2S TX2", NULL, "CIC2 MUX"},
|
||||
|
||||
{"I2S TX1", 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);
|
||||
}
|
||||
|
||||
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,
|
||||
.shutdown = msm8916_wcd_digital_shutdown,
|
||||
.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,
|
||||
.set_sysclk = msm8916_wcd_digital_codec_set_sysclk,
|
||||
.component_driver = {
|
||||
.controls = msm8916_wcd_digital_snd_controls,
|
||||
.num_controls = ARRAY_SIZE(msm8916_wcd_digital_snd_controls),
|
||||
|
@ -735,7 +735,7 @@ static int __maybe_unused nau8540_resume(struct snd_soc_codec *codec)
|
||||
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_pll = nau8540_set_pll,
|
||||
.suspend = nau8540_suspend,
|
||||
|
@ -808,7 +808,7 @@ static const struct regmap_config nau8810_regmap_config = {
|
||||
.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,
|
||||
.suspend_bias_off = true,
|
||||
|
||||
|
@ -1469,7 +1469,7 @@ static int __maybe_unused nau8824_resume(struct snd_soc_codec *codec)
|
||||
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,
|
||||
.set_sysclk = nau8824_set_sysclk,
|
||||
.set_pll = nau8824_set_pll,
|
||||
|
@ -2388,7 +2388,7 @@ static int __maybe_unused nau8825_resume(struct snd_soc_codec *codec)
|
||||
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,
|
||||
.remove = nau8825_codec_remove,
|
||||
.set_sysclk = nau8825_set_sysclk,
|
||||
|
@ -288,7 +288,7 @@ static const struct regmap_config pcm1681_regmap = {
|
||||
.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 = {
|
||||
.controls = pcm1681_controls,
|
||||
.num_controls = ARRAY_SIZE(pcm1681_controls),
|
||||
|
@ -205,7 +205,7 @@ const struct regmap_config 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 = {
|
||||
.controls = pcm179x_controls,
|
||||
.num_controls = ARRAY_SIZE(pcm179x_controls),
|
||||
|
@ -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 = {
|
||||
.dapm_widgets = pcm3008_dapm_widgets,
|
||||
.num_dapm_widgets = ARRAY_SIZE(pcm3008_dapm_widgets),
|
||||
|
@ -1344,7 +1344,7 @@ static struct snd_soc_dai_driver pcm512x_dai = {
|
||||
.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,
|
||||
.idle_bias_off = true,
|
||||
|
||||
|
1228
sound/soc/codecs/rt274.c
Normal file
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
217
sound/soc/codecs/rt274.h
Normal 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__ */
|
||||
|
@ -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,
|
||||
.remove = rt286_remove,
|
||||
.suspend = rt286_suspend,
|
||||
|
@ -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,
|
||||
.remove = rt298_remove,
|
||||
.suspend = rt298_suspend,
|
||||
|
@ -260,7 +260,7 @@ static int rt5514_spi_pcm_probe(struct snd_soc_platform *platform)
|
||||
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,
|
||||
.ops = &rt5514_spi_pcm_ops,
|
||||
};
|
||||
|
@ -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,
|
||||
.idle_bias_off = true,
|
||||
.set_bias_level = rt5514_set_bias_level,
|
||||
|
@ -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,
|
||||
.suspend = rt5616_suspend,
|
||||
.resume = rt5616_resume,
|
||||
|
@ -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,
|
||||
.set_bias_level = rt5631_set_bias_level,
|
||||
.suspend_bias_off = true,
|
||||
|
@ -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,
|
||||
.remove = rt5640_remove,
|
||||
.suspend = rt5640_suspend,
|
||||
|
@ -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,
|
||||
.remove = rt5645_remove,
|
||||
.suspend = rt5645_suspend,
|
||||
|
@ -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,
|
||||
.suspend = rt5651_suspend,
|
||||
.resume = rt5651_resume,
|
||||
|
@ -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,
|
||||
.remove = rt5659_remove,
|
||||
.suspend = rt5659_suspend,
|
||||
|
@ -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,
|
||||
.remove = rt5660_remove,
|
||||
.suspend = rt5660_suspend,
|
||||
|
@ -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,
|
||||
.remove = rt5663_remove,
|
||||
.suspend = rt5663_suspend,
|
||||
|
@ -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,
|
||||
.remove = rt5665_remove,
|
||||
.suspend = rt5665_suspend,
|
||||
|
@ -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,
|
||||
.remove = rt5670_remove,
|
||||
.suspend = rt5670_suspend,
|
||||
|
@ -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,
|
||||
.remove = rt5677_remove,
|
||||
.suspend = rt5677_suspend,
|
||||
|
@ -1248,7 +1248,7 @@ static int sgtl5000_remove(struct snd_soc_codec *codec)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct snd_soc_codec_driver sgtl5000_driver = {
|
||||
static const struct snd_soc_codec_driver sgtl5000_driver = {
|
||||
.probe = sgtl5000_probe,
|
||||
.remove = sgtl5000_remove,
|
||||
.set_bias_level = sgtl5000_set_bias_level,
|
||||
|
@ -236,7 +236,7 @@ static struct regmap *si476x_get_regmap(struct device *dev)
|
||||
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,
|
||||
.component_driver = {
|
||||
.dapm_widgets = si476x_dapm_widgets,
|
||||
|
@ -429,7 +429,7 @@ static int sirf_audio_codec_remove(struct snd_soc_codec *codec)
|
||||
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,
|
||||
.remove = sirf_audio_codec_remove,
|
||||
.dapm_widgets = sirf_audio_codec_dapm_widgets,
|
||||
|
@ -883,7 +883,7 @@ static int sn95031_codec_probe(struct snd_soc_codec *codec)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct snd_soc_codec_driver sn95031_codec = {
|
||||
static const struct snd_soc_codec_driver sn95031_codec = {
|
||||
.probe = sn95031_codec_probe,
|
||||
.set_bias_level = sn95031_set_vaud_bias,
|
||||
.idle_bias_off = true,
|
||||
|
@ -37,7 +37,7 @@ static const struct snd_soc_dapm_route dir_routes[] = {
|
||||
SNDRV_PCM_FMTBIT_S24_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 = {
|
||||
.dapm_widgets = dir_widgets,
|
||||
.num_dapm_widgets = ARRAY_SIZE(dir_widgets),
|
||||
|
@ -37,7 +37,7 @@ static const struct snd_soc_dapm_route dit_routes[] = {
|
||||
{ "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 = {
|
||||
.dapm_widgets = dit_widgets,
|
||||
.num_dapm_widgets = ARRAY_SIZE(dit_widgets),
|
||||
|
@ -710,7 +710,7 @@ static int ssm2518_set_sysclk(struct snd_soc_codec *codec, int clk_id,
|
||||
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_sysclk = ssm2518_set_sysclk,
|
||||
.idle_bias_off = true,
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user