29 #include <linux/module.h>
34 #include <linux/i2c.h>
37 #include <linux/slab.h>
72 0x0097, 0x0097, 0x0079, 0x0079,
73 0x000a, 0x0008, 0x009f, 0x000a,
79 static const char *ssm2602_input_select[] = {
80 "Line",
"Mic",
"None",
"None",
"None",
81 "None",
"None",
"None",
84 static const char *ssm2602_deemph[] = {
"None",
"32Khz",
"44.1Khz",
"48Khz"};
86 static const struct soc_enum ssm2602_enum[] = {
91 static const unsigned int ssm260x_outmix_tlv[] = {
108 SOC_ENUM(
"Playback De-emphasis", ssm2602_enum[1]),
113 0, 127, 0, ssm260x_outmix_tlv),
117 ssm260x_sidetone_tlv),
150 ssm260x_output_mixer_controls,
163 ssm260x_output_mixer_controls,
164 ARRAY_SIZE(ssm260x_output_mixer_controls) - 1),
168 {
"DAC",
NULL,
"Digital Core Power"},
169 {
"ADC",
NULL,
"Digital Core Power"},
171 {
"Output Mixer",
"Line Bypass Switch",
"Line Input"},
172 {
"Output Mixer",
"HiFi Playback Switch",
"DAC"},
174 {
"ROUT",
NULL,
"Output Mixer"},
175 {
"LOUT",
NULL,
"Output Mixer"},
177 {
"Line Input",
NULL,
"LLINEIN"},
178 {
"Line Input",
NULL,
"RLINEIN"},
182 {
"Output Mixer",
"Mic Sidetone Switch",
"Mic Bias"},
184 {
"RHPOUT",
NULL,
"Output Mixer"},
185 {
"LHPOUT",
NULL,
"Output Mixer"},
187 {
"Input Mux",
"Line",
"Line Input"},
188 {
"Input Mux",
"Mic",
"Mic Bias"},
189 {
"ADC",
NULL,
"Input Mux"},
191 {
"Mic Bias",
NULL,
"MICIN"},
195 {
"ADC",
NULL,
"Line Input"},
198 static const unsigned int ssm2602_rates_12288000[] = {
199 8000, 32000, 48000, 96000,
203 .list = ssm2602_rates_12288000,
207 static const unsigned int ssm2602_rates_11289600[] = {
212 .list = ssm2602_rates_11289600,
222 #define SSM2602_COEFF_SRATE(sr, bosr, usb) (((sr) << 2) | ((bosr) << 1) | (usb))
259 static inline int ssm2602_get_coeff(
int mclk,
int rate)
263 for (i = 0; i <
ARRAY_SIZE(ssm2602_coeff_table); i++) {
264 if (ssm2602_coeff_table[i].rate == rate &&
265 ssm2602_coeff_table[i].mclk == mclk)
266 return ssm2602_coeff_table[
i].
srate;
276 struct ssm2602_priv *ssm2602 = snd_soc_codec_get_drvdata(codec);
281 dev_dbg(codec->
dev,
"Ignoring hw_params for slave substream\n");
316 struct ssm2602_priv *ssm2602 = snd_soc_codec_get_drvdata(codec);
325 dev_dbg(codec->
dev,
"Constraining to %d bits at %dHz\n",
327 master_runtime->
rate);
329 if (master_runtime->
rate != 0)
332 master_runtime->
rate,
333 master_runtime->
rate);
358 struct ssm2602_priv *ssm2602 = snd_soc_codec_get_drvdata(codec);
381 static int ssm2602_set_dai_sysclk(
struct snd_soc_dai *codec_dai,
382 int clk_id,
unsigned int freq,
int dir)
385 struct ssm2602_priv *ssm2602 = snd_soc_codec_get_drvdata(codec);
433 static int ssm2602_set_dai_fmt(
struct snd_soc_dai *codec_dai,
437 unsigned int iface = 0;
492 static int ssm2602_set_bias_level(
struct snd_soc_codec *codec,
495 struct ssm2602_priv *ssm2602 = snd_soc_codec_get_drvdata(codec);
523 #define SSM2602_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_32000 |\
524 SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000 |\
525 SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000)
527 #define SSM2602_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\
528 SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
531 .startup = ssm2602_startup,
532 .hw_params = ssm2602_hw_params,
533 .shutdown = ssm2602_shutdown,
534 .digital_mute = ssm2602_mute,
535 .set_sysclk = ssm2602_set_dai_sysclk,
536 .set_fmt = ssm2602_set_dai_fmt,
540 .name =
"ssm2602-hifi",
542 .stream_name =
"Playback",
548 .stream_name =
"Capture",
553 .ops = &ssm2602_dai_ops,
573 struct ssm2602_priv *ssm2602 = snd_soc_codec_get_drvdata(codec);
612 struct ssm2602_priv *ssm2602 = snd_soc_codec_get_drvdata(codec);
618 dev_err(codec->
dev,
"Failed to set cache I/O: %d\n", ret);
624 dev_err(codec->
dev,
"Failed to issue reset: %d\n", ret);
637 switch (ssm2602->
type) {
639 ret = ssm2602_probe(codec);
642 ret = ssm2604_probe(codec);
662 .probe = ssm260x_probe,
663 .remove = ssm2602_remove,
664 .suspend = ssm2602_suspend,
665 .resume = ssm2602_resume,
666 .set_bias_level = ssm2602_set_bias_level,
668 .controls = ssm260x_snd_controls,
669 .num_controls =
ARRAY_SIZE(ssm260x_snd_controls),
670 .dapm_widgets = ssm260x_dapm_widgets,
671 .num_dapm_widgets =
ARRAY_SIZE(ssm260x_dapm_widgets),
672 .dapm_routes = ssm260x_routes,
673 .num_dapm_routes =
ARRAY_SIZE(ssm260x_routes),
676 static bool ssm2602_register_volatile(
struct device *
dev,
unsigned int reg)
681 static const struct regmap_config ssm2602_regmap_config = {
686 .volatile_reg = ssm2602_register_volatile,
689 .reg_defaults_raw = ssm2602_reg,
690 .num_reg_defaults_raw =
ARRAY_SIZE(ssm2602_reg),
693 #if defined(CONFIG_SPI_MASTER)
704 spi_set_drvdata(spi, ssm2602);
708 if (IS_ERR(ssm2602->
regmap))
709 return PTR_ERR(ssm2602->
regmap);
712 &soc_codec_dev_ssm2602, &ssm2602_dai, 1);
722 static struct spi_driver ssm2602_spi_driver = {
727 .probe = ssm2602_spi_probe,
732 #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
750 i2c_set_clientdata(i2c, ssm2602);
751 ssm2602->
type =
id->driver_data;
754 if (IS_ERR(ssm2602->
regmap))
755 return PTR_ERR(ssm2602->
regmap);
758 &soc_codec_dev_ssm2602, &ssm2602_dai, 1);
777 static struct i2c_driver ssm2602_i2c_driver = {
782 .probe = ssm2602_i2c_probe,
784 .id_table = ssm2602_i2c_id,
789 static int __init ssm2602_modinit(
void)
793 #if defined(CONFIG_SPI_MASTER)
799 #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
800 ret = i2c_add_driver(&ssm2602_i2c_driver);
809 static void __exit ssm2602_exit(
void)
811 #if defined(CONFIG_SPI_MASTER)
812 spi_unregister_driver(&ssm2602_spi_driver);
815 #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)