ASoC: rt5640: Rename the function of clock checking
[deliverable/linux.git] / sound / soc / codecs / rt5640.c
index 13ccee43cfc59ac57f94b077117ce6ccaad04b7d..19634d0992bcf98c30acbda85f8e7c58e21ff660 100644 (file)
@@ -59,7 +59,7 @@ static struct reg_default init_list[] = {
 };
 #define RT5640_INIT_REG_LEN ARRAY_SIZE(init_list)
 
-static const struct reg_default rt5640_reg[RT5640_VENDOR_ID2 + 1] = {
+static const struct reg_default rt5640_reg[] = {
        { 0x00, 0x000e },
        { 0x01, 0xc8c8 },
        { 0x02, 0xc8c8 },
@@ -480,7 +480,7 @@ static int set_dmic_clk(struct snd_soc_dapm_widget *w,
        return idx;
 }
 
-static int check_sysclk1_source(struct snd_soc_dapm_widget *source,
+static int is_sys_clk_from_pll(struct snd_soc_dapm_widget *source,
                         struct snd_soc_dapm_widget *sink)
 {
        unsigned int val;
@@ -872,54 +872,6 @@ static SOC_ENUM_SINGLE_DECL(rt5640_sdi_sel_enum, RT5640_I2S2_SDP,
 static const struct snd_kcontrol_new rt5640_sdi_mux =
        SOC_DAPM_ENUM("SDI select", rt5640_sdi_sel_enum);
 
-static int rt5640_set_dmic1_event(struct snd_soc_dapm_widget *w,
-       struct snd_kcontrol *kcontrol, int event)
-{
-       struct snd_soc_codec *codec = w->codec;
-
-       switch (event) {
-       case SND_SOC_DAPM_PRE_PMU:
-               snd_soc_update_bits(codec, RT5640_GPIO_CTRL1,
-                       RT5640_GP2_PIN_MASK | RT5640_GP3_PIN_MASK,
-                       RT5640_GP2_PIN_DMIC1_SCL | RT5640_GP3_PIN_DMIC1_SDA);
-               snd_soc_update_bits(codec, RT5640_DMIC,
-                       RT5640_DMIC_1L_LH_MASK | RT5640_DMIC_1R_LH_MASK |
-                       RT5640_DMIC_1_DP_MASK,
-                       RT5640_DMIC_1L_LH_FALLING | RT5640_DMIC_1R_LH_RISING |
-                       RT5640_DMIC_1_DP_IN1P);
-               break;
-
-       default:
-               return 0;
-       }
-
-       return 0;
-}
-
-static int rt5640_set_dmic2_event(struct snd_soc_dapm_widget *w,
-       struct snd_kcontrol *kcontrol, int event)
-{
-       struct snd_soc_codec *codec = w->codec;
-
-       switch (event) {
-       case SND_SOC_DAPM_PRE_PMU:
-               snd_soc_update_bits(codec, RT5640_GPIO_CTRL1,
-                       RT5640_GP2_PIN_MASK | RT5640_GP4_PIN_MASK,
-                       RT5640_GP2_PIN_DMIC1_SCL | RT5640_GP4_PIN_DMIC2_SDA);
-               snd_soc_update_bits(codec, RT5640_DMIC,
-                       RT5640_DMIC_2L_LH_MASK | RT5640_DMIC_2R_LH_MASK |
-                       RT5640_DMIC_2_DP_MASK,
-                       RT5640_DMIC_2L_LH_FALLING | RT5640_DMIC_2R_LH_RISING |
-                       RT5640_DMIC_2_DP_IN1N);
-               break;
-
-       default:
-               return 0;
-       }
-
-       return 0;
-}
-
 static void hp_amp_power_on(struct snd_soc_codec *codec)
 {
        struct rt5640_priv *rt5640 = snd_soc_codec_get_drvdata(codec);
@@ -1054,12 +1006,10 @@ static const struct snd_soc_dapm_widget rt5640_dapm_widgets[] = {
 
        SND_SOC_DAPM_SUPPLY("DMIC CLK", SND_SOC_NOPM, 0, 0,
                set_dmic_clk, SND_SOC_DAPM_PRE_PMU),
-       SND_SOC_DAPM_SUPPLY("DMIC1 Power", RT5640_DMIC,
-               RT5640_DMIC_1_EN_SFT, 0, rt5640_set_dmic1_event,
-               SND_SOC_DAPM_PRE_PMU),
-       SND_SOC_DAPM_SUPPLY("DMIC2 Power", RT5640_DMIC,
-               RT5640_DMIC_2_EN_SFT, 0, rt5640_set_dmic2_event,
-               SND_SOC_DAPM_PRE_PMU),
+       SND_SOC_DAPM_SUPPLY("DMIC1 Power", RT5640_DMIC, RT5640_DMIC_1_EN_SFT, 0,
+               NULL, 0),
+       SND_SOC_DAPM_SUPPLY("DMIC2 Power", RT5640_DMIC, RT5640_DMIC_2_EN_SFT, 0,
+               NULL, 0),
        /* Boost */
        SND_SOC_DAPM_PGA("BST1", RT5640_PWR_ANLG2,
                RT5640_PWR_BST1_BIT, 0, NULL, 0),
@@ -1323,22 +1273,22 @@ static const struct snd_soc_dapm_route rt5640_dapm_routes[] = {
        {"Stereo ADC MIXL", "ADC1 Switch", "Stereo ADC L1 Mux"},
        {"Stereo ADC MIXL", "ADC2 Switch", "Stereo ADC L2 Mux"},
        {"Stereo ADC MIXL", NULL, "Stereo Filter"},
-       {"Stereo Filter", NULL, "PLL1", check_sysclk1_source},
+       {"Stereo Filter", NULL, "PLL1", is_sys_clk_from_pll},
 
        {"Stereo ADC MIXR", "ADC1 Switch", "Stereo ADC R1 Mux"},
        {"Stereo ADC MIXR", "ADC2 Switch", "Stereo ADC R2 Mux"},
        {"Stereo ADC MIXR", NULL, "Stereo Filter"},
-       {"Stereo Filter", NULL, "PLL1", check_sysclk1_source},
+       {"Stereo Filter", NULL, "PLL1", is_sys_clk_from_pll},
 
        {"Mono ADC MIXL", "ADC1 Switch", "Mono ADC L1 Mux"},
        {"Mono ADC MIXL", "ADC2 Switch", "Mono ADC L2 Mux"},
        {"Mono ADC MIXL", NULL, "Mono Left Filter"},
-       {"Mono Left Filter", NULL, "PLL1", check_sysclk1_source},
+       {"Mono Left Filter", NULL, "PLL1", is_sys_clk_from_pll},
 
        {"Mono ADC MIXR", "ADC1 Switch", "Mono ADC R1 Mux"},
        {"Mono ADC MIXR", "ADC2 Switch", "Mono ADC R2 Mux"},
        {"Mono ADC MIXR", NULL, "Mono Right Filter"},
-       {"Mono Right Filter", NULL, "PLL1", check_sysclk1_source},
+       {"Mono Right Filter", NULL, "PLL1", is_sys_clk_from_pll},
 
        {"IF2 ADC L", NULL, "Mono ADC MIXL"},
        {"IF2 ADC R", NULL, "Mono ADC MIXR"},
@@ -1427,13 +1377,13 @@ static const struct snd_soc_dapm_route rt5640_dapm_routes[] = {
        {"DIG MIXR", "DAC R2 Switch", "DAC R2 Mux"},
 
        {"DAC L1", NULL, "Stereo DAC MIXL"},
-       {"DAC L1", NULL, "PLL1", check_sysclk1_source},
+       {"DAC L1", NULL, "PLL1", is_sys_clk_from_pll},
        {"DAC R1", NULL, "Stereo DAC MIXR"},
-       {"DAC R1", NULL, "PLL1", check_sysclk1_source},
+       {"DAC R1", NULL, "PLL1", is_sys_clk_from_pll},
        {"DAC L2", NULL, "Mono DAC MIXL"},
-       {"DAC L2", NULL, "PLL1", check_sysclk1_source},
+       {"DAC L2", NULL, "PLL1", is_sys_clk_from_pll},
        {"DAC R2", NULL, "Mono DAC MIXR"},
-       {"DAC R2", NULL, "PLL1", check_sysclk1_source},
+       {"DAC R2", NULL, "PLL1", is_sys_clk_from_pll},
 
        {"SPK MIXL", "REC MIXL Switch", "RECMIXL"},
        {"SPK MIXL", "INL Switch", "INL VOL"},
@@ -1594,8 +1544,7 @@ static int get_clk_info(int sclk, int rate)
 static int rt5640_hw_params(struct snd_pcm_substream *substream,
        struct snd_pcm_hw_params *params, struct snd_soc_dai *dai)
 {
-       struct snd_soc_pcm_runtime *rtd = substream->private_data;
-       struct snd_soc_codec *codec = rtd->codec;
+       struct snd_soc_codec *codec = dai->codec;
        struct rt5640_priv *rt5640 = snd_soc_codec_get_drvdata(codec);
        unsigned int val_len = 0, val_clk, mask_clk;
        int dai_sel, pre_div, bclk_ms, frame_size;
@@ -1623,16 +1572,16 @@ static int rt5640_hw_params(struct snd_pcm_substream *substream,
        dev_dbg(dai->dev, "bclk_ms is %d and pre_div is %d for iis %d\n",
                                bclk_ms, pre_div, dai->id);
 
-       switch (params_format(params)) {
-       case SNDRV_PCM_FORMAT_S16_LE:
+       switch (params_width(params)) {
+       case 16:
                break;
-       case SNDRV_PCM_FORMAT_S20_3LE:
+       case 20:
                val_len |= RT5640_I2S_DL_20;
                break;
-       case SNDRV_PCM_FORMAT_S24_LE:
+       case 24:
                val_len |= RT5640_I2S_DL_24;
                break;
-       case SNDRV_PCM_FORMAT_S8:
+       case 8:
                val_len |= RT5640_I2S_DL_8;
                break;
        default:
@@ -1891,11 +1840,9 @@ static int rt5640_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int source,
 static int rt5640_set_bias_level(struct snd_soc_codec *codec,
                        enum snd_soc_bias_level level)
 {
-       struct rt5640_priv *rt5640 = snd_soc_codec_get_drvdata(codec);
        switch (level) {
        case SND_SOC_BIAS_STANDBY:
                if (SND_SOC_BIAS_OFF == codec->dapm.bias_level) {
-                       regcache_cache_only(rt5640->regmap, false);
                        snd_soc_update_bits(codec, RT5640_PWR_ANLG1,
                                RT5640_PWR_VREF1 | RT5640_PWR_MB |
                                RT5640_PWR_BG | RT5640_PWR_VREF2,
@@ -1905,7 +1852,6 @@ static int rt5640_set_bias_level(struct snd_soc_codec *codec,
                        snd_soc_update_bits(codec, RT5640_PWR_ANLG1,
                                RT5640_PWR_FV1 | RT5640_PWR_FV2,
                                RT5640_PWR_FV1 | RT5640_PWR_FV2);
-                       regcache_sync(rt5640->regmap);
                        snd_soc_update_bits(codec, RT5640_DUMMY1,
                                                0x0301, 0x0301);
                        snd_soc_update_bits(codec, RT5640_MICBIAS,
@@ -1980,6 +1926,9 @@ static int rt5640_resume(struct snd_soc_codec *codec)
                msleep(400);
        }
 
+       regcache_cache_only(rt5640->regmap, false);
+       regcache_sync(rt5640->regmap);
+
        return 0;
 }
 #else
@@ -2075,6 +2024,14 @@ static const struct i2c_device_id rt5640_i2c_id[] = {
 };
 MODULE_DEVICE_TABLE(i2c, rt5640_i2c_id);
 
+#if defined(CONFIG_OF)
+static const struct of_device_id rt5640_of_match[] = {
+       { .compatible = "realtek,rt5640", },
+       {},
+};
+MODULE_DEVICE_TABLE(of, rt5640_of_match);
+#endif
+
 #ifdef CONFIG_ACPI
 static struct acpi_device_id rt5640_acpi_match[] = {
        { "INT33CA", 0 },
@@ -2180,6 +2137,25 @@ static int rt5640_i2c_probe(struct i2c_client *i2c,
                regmap_update_bits(rt5640->regmap, RT5640_IN3_IN4,
                                        RT5640_IN_DF2, RT5640_IN_DF2);
 
+       if (rt5640->pdata.dmic_en) {
+               regmap_update_bits(rt5640->regmap, RT5640_GPIO_CTRL1,
+                       RT5640_GP2_PIN_MASK, RT5640_GP2_PIN_DMIC1_SCL);
+
+               if (rt5640->pdata.dmic1_data_pin) {
+                       regmap_update_bits(rt5640->regmap, RT5640_DMIC,
+                               RT5640_DMIC_1_DP_MASK, RT5640_DMIC_1_DP_GPIO3);
+                       regmap_update_bits(rt5640->regmap, RT5640_GPIO_CTRL1,
+                               RT5640_GP3_PIN_MASK, RT5640_GP3_PIN_DMIC1_SDA);
+               }
+
+               if (rt5640->pdata.dmic2_data_pin) {
+                       regmap_update_bits(rt5640->regmap, RT5640_DMIC,
+                               RT5640_DMIC_2_DP_MASK, RT5640_DMIC_2_DP_GPIO4);
+                       regmap_update_bits(rt5640->regmap, RT5640_GPIO_CTRL1,
+                               RT5640_GP4_PIN_MASK, RT5640_GP4_PIN_DMIC2_SDA);
+               }
+       }
+
        rt5640->hp_mute = 1;
 
        ret = snd_soc_register_codec(&i2c->dev, &soc_codec_dev_rt5640,
@@ -2204,6 +2180,7 @@ static struct i2c_driver rt5640_i2c_driver = {
                .name = "rt5640",
                .owner = THIS_MODULE,
                .acpi_match_table = ACPI_PTR(rt5640_acpi_match),
+               .of_match_table = of_match_ptr(rt5640_of_match),
        },
        .probe = rt5640_i2c_probe,
        .remove   = rt5640_i2c_remove,
This page took 0.034504 seconds and 5 git commands to generate.