Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 //
0003 // Copyright (c) 2020-2021, The Linux Foundation. All rights reserved.
0004 //
0005 // ALSA SoC Machine driver for sc7280
0006 
0007 #include <linux/input.h>
0008 #include <linux/module.h>
0009 #include <linux/of_device.h>
0010 #include <linux/platform_device.h>
0011 #include <sound/core.h>
0012 #include <sound/jack.h>
0013 #include <sound/pcm.h>
0014 #include <sound/soc.h>
0015 #include <sound/rt5682s.h>
0016 #include <linux/soundwire/sdw.h>
0017 
0018 #include "../codecs/rt5682.h"
0019 #include "../codecs/rt5682s.h"
0020 #include "common.h"
0021 #include "lpass.h"
0022 #include "qdsp6/q6afe.h"
0023 
0024 #define DEFAULT_MCLK_RATE              19200000
0025 #define RT5682_PLL_FREQ (48000 * 512)
0026 #define MI2S_BCLK_RATE      1536000
0027 
0028 struct sc7280_snd_data {
0029     struct snd_soc_card card;
0030     struct sdw_stream_runtime *sruntime[LPASS_MAX_PORTS];
0031     u32 pri_mi2s_clk_count;
0032     struct snd_soc_jack hs_jack;
0033     struct snd_soc_jack hdmi_jack;
0034     bool jack_setup;
0035     bool stream_prepared[LPASS_MAX_PORTS];
0036 };
0037 
0038 static void sc7280_jack_free(struct snd_jack *jack)
0039 {
0040     struct snd_soc_component *component = jack->private_data;
0041 
0042     snd_soc_component_set_jack(component, NULL, NULL);
0043 }
0044 
0045 static int sc7280_headset_init(struct snd_soc_pcm_runtime *rtd)
0046 {
0047     struct snd_soc_card *card = rtd->card;
0048     struct sc7280_snd_data *pdata = snd_soc_card_get_drvdata(card);
0049     struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
0050     struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);
0051     struct snd_soc_component *component = codec_dai->component;
0052     struct snd_jack *jack;
0053     int rval, i;
0054 
0055     if (!pdata->jack_setup) {
0056         rval = snd_soc_card_jack_new(card, "Headset Jack",
0057                          SND_JACK_HEADSET | SND_JACK_LINEOUT |
0058                          SND_JACK_MECHANICAL |
0059                          SND_JACK_BTN_0 | SND_JACK_BTN_1 |
0060                          SND_JACK_BTN_2 | SND_JACK_BTN_3 |
0061                          SND_JACK_BTN_4 | SND_JACK_BTN_5,
0062                          &pdata->hs_jack);
0063 
0064         if (rval < 0) {
0065             dev_err(card->dev, "Unable to add Headset Jack\n");
0066             return rval;
0067         }
0068 
0069         jack = pdata->hs_jack.jack;
0070 
0071         snd_jack_set_key(jack, SND_JACK_BTN_0, KEY_PLAYPAUSE);
0072         snd_jack_set_key(jack, SND_JACK_BTN_1, KEY_VOICECOMMAND);
0073         snd_jack_set_key(jack, SND_JACK_BTN_2, KEY_VOLUMEUP);
0074         snd_jack_set_key(jack, SND_JACK_BTN_3, KEY_VOLUMEDOWN);
0075 
0076         jack->private_data = component;
0077         jack->private_free = sc7280_jack_free;
0078         pdata->jack_setup = true;
0079     }
0080     switch (cpu_dai->id) {
0081     case MI2S_PRIMARY:
0082     case LPASS_CDC_DMA_RX0:
0083     case LPASS_CDC_DMA_TX3:
0084     case TX_CODEC_DMA_TX_3:
0085         for_each_rtd_codec_dais(rtd, i, codec_dai) {
0086             rval = snd_soc_component_set_jack(component, &pdata->hs_jack, NULL);
0087             if (rval != 0 && rval != -ENOTSUPP) {
0088                 dev_err(card->dev, "Failed to set jack: %d\n", rval);
0089                 return rval;
0090             }
0091         }
0092         break;
0093     default:
0094         break;
0095     }
0096 
0097     return 0;
0098 }
0099 
0100 static int sc7280_hdmi_init(struct snd_soc_pcm_runtime *rtd)
0101 {
0102     struct snd_soc_card *card = rtd->card;
0103     struct sc7280_snd_data *pdata = snd_soc_card_get_drvdata(card);
0104     struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
0105     struct snd_soc_component *component = codec_dai->component;
0106     struct snd_jack *jack;
0107     int rval;
0108 
0109     rval = snd_soc_card_jack_new(card, "HDMI Jack", SND_JACK_LINEOUT,
0110                      &pdata->hdmi_jack);
0111 
0112     if (rval < 0) {
0113         dev_err(card->dev, "Unable to add HDMI Jack\n");
0114         return rval;
0115     }
0116 
0117     jack = pdata->hdmi_jack.jack;
0118     jack->private_data = component;
0119     jack->private_free = sc7280_jack_free;
0120 
0121     return snd_soc_component_set_jack(component, &pdata->hdmi_jack, NULL);
0122 }
0123 
0124 static int sc7280_rt5682_init(struct snd_soc_pcm_runtime *rtd)
0125 {
0126     struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);
0127     struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
0128     struct snd_soc_card *card = rtd->card;
0129     struct sc7280_snd_data *data = snd_soc_card_get_drvdata(card);
0130     int ret;
0131 
0132     if (++data->pri_mi2s_clk_count == 1) {
0133         snd_soc_dai_set_sysclk(cpu_dai,
0134             LPASS_MCLK0,
0135             DEFAULT_MCLK_RATE,
0136             SNDRV_PCM_STREAM_PLAYBACK);
0137     }
0138     snd_soc_dai_set_fmt(codec_dai,
0139                 SND_SOC_DAIFMT_CBC_CFC |
0140                 SND_SOC_DAIFMT_NB_NF |
0141                 SND_SOC_DAIFMT_I2S);
0142 
0143     ret = snd_soc_dai_set_pll(codec_dai, RT5682S_PLL2, RT5682S_PLL_S_MCLK,
0144                     DEFAULT_MCLK_RATE, RT5682_PLL_FREQ);
0145     if (ret) {
0146         dev_err(rtd->dev, "can't set codec pll: %d\n", ret);
0147         return ret;
0148     }
0149 
0150     ret = snd_soc_dai_set_sysclk(codec_dai, RT5682S_SCLK_S_PLL2,
0151                     RT5682_PLL_FREQ,
0152                     SND_SOC_CLOCK_IN);
0153 
0154     if (ret) {
0155         dev_err(rtd->dev, "snd_soc_dai_set_sysclk err = %d\n",
0156             ret);
0157         return ret;
0158     }
0159 
0160     return 0;
0161 }
0162 
0163 static int sc7280_init(struct snd_soc_pcm_runtime *rtd)
0164 {
0165     struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);
0166 
0167     switch (cpu_dai->id) {
0168     case MI2S_PRIMARY:
0169     case LPASS_CDC_DMA_TX3:
0170     case TX_CODEC_DMA_TX_3:
0171         return sc7280_headset_init(rtd);
0172     case LPASS_CDC_DMA_RX0:
0173     case LPASS_CDC_DMA_VA_TX0:
0174     case MI2S_SECONDARY:
0175     case RX_CODEC_DMA_RX_0:
0176     case SECONDARY_MI2S_RX:
0177     case VA_CODEC_DMA_TX_0:
0178         return 0;
0179     case LPASS_DP_RX:
0180         return sc7280_hdmi_init(rtd);
0181     default:
0182         dev_err(rtd->dev, "%s: invalid dai id 0x%x\n", __func__, cpu_dai->id);
0183     }
0184 
0185     return -EINVAL;
0186 }
0187 
0188 static int sc7280_snd_hw_params(struct snd_pcm_substream *substream,
0189                 struct snd_pcm_hw_params *params)
0190 {
0191     struct snd_pcm_runtime *runtime = substream->runtime;
0192     struct snd_soc_pcm_runtime *rtd = substream->private_data;
0193     struct snd_soc_dai *codec_dai;
0194     const struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);
0195     struct sc7280_snd_data *pdata = snd_soc_card_get_drvdata(rtd->card);
0196     struct sdw_stream_runtime *sruntime;
0197     int i;
0198 
0199     snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_CHANNELS, 2, 2);
0200     snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_RATE, 48000, 48000);
0201 
0202     switch (cpu_dai->id) {
0203     case LPASS_CDC_DMA_TX3:
0204     case LPASS_CDC_DMA_RX0:
0205     case RX_CODEC_DMA_RX_0:
0206     case SECONDARY_MI2S_RX:
0207     case TX_CODEC_DMA_TX_3:
0208     case VA_CODEC_DMA_TX_0:
0209         for_each_rtd_codec_dais(rtd, i, codec_dai) {
0210             sruntime = snd_soc_dai_get_stream(codec_dai, substream->stream);
0211             if (sruntime != ERR_PTR(-ENOTSUPP))
0212                 pdata->sruntime[cpu_dai->id] = sruntime;
0213         }
0214         break;
0215     }
0216 
0217     return 0;
0218 }
0219 
0220 static int sc7280_snd_swr_prepare(struct snd_pcm_substream *substream)
0221 {
0222     struct snd_soc_pcm_runtime *rtd = substream->private_data;
0223     const struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);
0224     struct sc7280_snd_data *data = snd_soc_card_get_drvdata(rtd->card);
0225     struct sdw_stream_runtime *sruntime = data->sruntime[cpu_dai->id];
0226     int ret;
0227 
0228     if (!sruntime)
0229         return 0;
0230 
0231     if (data->stream_prepared[cpu_dai->id]) {
0232         sdw_disable_stream(sruntime);
0233         sdw_deprepare_stream(sruntime);
0234         data->stream_prepared[cpu_dai->id] = false;
0235     }
0236 
0237     ret = sdw_prepare_stream(sruntime);
0238     if (ret)
0239         return ret;
0240 
0241     ret = sdw_enable_stream(sruntime);
0242     if (ret) {
0243         sdw_deprepare_stream(sruntime);
0244         return ret;
0245     }
0246     data->stream_prepared[cpu_dai->id] = true;
0247 
0248     return ret;
0249 }
0250 
0251 static int sc7280_snd_prepare(struct snd_pcm_substream *substream)
0252 {
0253     struct snd_soc_pcm_runtime *rtd = substream->private_data;
0254     const struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);
0255 
0256     switch (cpu_dai->id) {
0257     case LPASS_CDC_DMA_RX0:
0258     case LPASS_CDC_DMA_TX3:
0259     case RX_CODEC_DMA_RX_0:
0260     case TX_CODEC_DMA_TX_3:
0261     case VA_CODEC_DMA_TX_0:
0262         return sc7280_snd_swr_prepare(substream);
0263     default:
0264         break;
0265     }
0266 
0267     return 0;
0268 }
0269 
0270 static int sc7280_snd_hw_free(struct snd_pcm_substream *substream)
0271 {
0272     struct snd_soc_pcm_runtime *rtd = substream->private_data;
0273     struct sc7280_snd_data *data = snd_soc_card_get_drvdata(rtd->card);
0274     const struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);
0275     struct sdw_stream_runtime *sruntime = data->sruntime[cpu_dai->id];
0276 
0277     switch (cpu_dai->id) {
0278     case LPASS_CDC_DMA_RX0:
0279     case LPASS_CDC_DMA_TX3:
0280     case RX_CODEC_DMA_RX_0:
0281     case TX_CODEC_DMA_TX_3:
0282     case VA_CODEC_DMA_TX_0:
0283         if (sruntime && data->stream_prepared[cpu_dai->id]) {
0284             sdw_disable_stream(sruntime);
0285             sdw_deprepare_stream(sruntime);
0286             data->stream_prepared[cpu_dai->id] = false;
0287         }
0288         break;
0289     default:
0290         break;
0291     }
0292     return 0;
0293 }
0294 
0295 static void sc7280_snd_shutdown(struct snd_pcm_substream *substream)
0296 {
0297     struct snd_soc_pcm_runtime *rtd = substream->private_data;
0298     struct snd_soc_card *card = rtd->card;
0299     struct sc7280_snd_data *data = snd_soc_card_get_drvdata(card);
0300     struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);
0301 
0302     switch (cpu_dai->id) {
0303     case MI2S_PRIMARY:
0304         if (--data->pri_mi2s_clk_count == 0) {
0305             snd_soc_dai_set_sysclk(cpu_dai,
0306                            LPASS_MCLK0,
0307                            0,
0308                            SNDRV_PCM_STREAM_PLAYBACK);
0309         }
0310         break;
0311     case SECONDARY_MI2S_RX:
0312         snd_soc_dai_set_sysclk(cpu_dai, Q6AFE_LPASS_CLK_ID_SEC_MI2S_IBIT,
0313                            0, SNDRV_PCM_STREAM_PLAYBACK);
0314         break;
0315     default:
0316         break;
0317     }
0318 }
0319 
0320 static int sc7280_snd_startup(struct snd_pcm_substream *substream)
0321 {
0322     unsigned int fmt = SND_SOC_DAIFMT_CBS_CFS;
0323     unsigned int codec_dai_fmt = SND_SOC_DAIFMT_CBS_CFS;
0324     struct snd_soc_pcm_runtime *rtd = substream->private_data;
0325     struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);
0326     struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
0327     int ret = 0;
0328 
0329     switch (cpu_dai->id) {
0330     case MI2S_PRIMARY:
0331         ret = sc7280_rt5682_init(rtd);
0332         break;
0333     case SECONDARY_MI2S_RX:
0334         codec_dai_fmt |= SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_I2S;
0335 
0336         snd_soc_dai_set_sysclk(cpu_dai, Q6AFE_LPASS_CLK_ID_SEC_MI2S_IBIT,
0337             MI2S_BCLK_RATE, SNDRV_PCM_STREAM_PLAYBACK);
0338 
0339         snd_soc_dai_set_fmt(cpu_dai, fmt);
0340         snd_soc_dai_set_fmt(codec_dai, codec_dai_fmt);
0341         break;
0342     default:
0343         break;
0344     }
0345     return ret;
0346 }
0347 
0348 static const struct snd_soc_ops sc7280_ops = {
0349     .startup = sc7280_snd_startup,
0350     .hw_params = sc7280_snd_hw_params,
0351     .hw_free = sc7280_snd_hw_free,
0352     .prepare = sc7280_snd_prepare,
0353     .shutdown = sc7280_snd_shutdown,
0354 };
0355 
0356 static const struct snd_soc_dapm_widget sc7280_snd_widgets[] = {
0357     SND_SOC_DAPM_HP("Headphone Jack", NULL),
0358     SND_SOC_DAPM_MIC("Headset Mic", NULL),
0359 };
0360 
0361 static int sc7280_snd_platform_probe(struct platform_device *pdev)
0362 {
0363     struct snd_soc_card *card;
0364     struct sc7280_snd_data *data;
0365     struct device *dev = &pdev->dev;
0366     struct snd_soc_dai_link *link;
0367     int ret, i;
0368 
0369     data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
0370     if (!data)
0371         return -ENOMEM;
0372 
0373     card = &data->card;
0374     snd_soc_card_set_drvdata(card, data);
0375 
0376     card->owner = THIS_MODULE;
0377     card->driver_name = "SC7280";
0378     card->dev = dev;
0379 
0380     card->dapm_widgets = sc7280_snd_widgets;
0381     card->num_dapm_widgets = ARRAY_SIZE(sc7280_snd_widgets);
0382 
0383     ret = qcom_snd_parse_of(card);
0384     if (ret)
0385         return ret;
0386 
0387     for_each_card_prelinks(card, i, link) {
0388         link->init = sc7280_init;
0389         link->ops = &sc7280_ops;
0390     }
0391 
0392     return devm_snd_soc_register_card(dev, card);
0393 }
0394 
0395 static const struct of_device_id sc7280_snd_device_id[]  = {
0396     { .compatible = "google,sc7280-herobrine" },
0397     {}
0398 };
0399 MODULE_DEVICE_TABLE(of, sc7280_snd_device_id);
0400 
0401 static struct platform_driver sc7280_snd_driver = {
0402     .probe = sc7280_snd_platform_probe,
0403     .driver = {
0404         .name = "msm-snd-sc7280",
0405         .of_match_table = sc7280_snd_device_id,
0406         .pm = &snd_soc_pm_ops,
0407     },
0408 };
0409 module_platform_driver(sc7280_snd_driver);
0410 
0411 MODULE_DESCRIPTION("sc7280 ASoC Machine Driver");
0412 MODULE_LICENSE("GPL");