asoc: tegra: add regulators and RT5639 on Laguna
Nikesh Oswal [Tue, 18 Jun 2013 11:05:34 +0000 (16:05 +0530)]
1. Add support for RT5639 on Laguna
2. Use proper Regulator names in RT5639 and RT5645
   machine driver
3. avdd, dbvdd, micvdd and ldoen are always on
   regulators
4. dmicvdd and spkvdd can be turned on/off on
   need basis

Change-Id: I2dd77b6d91abf3ed41899d213122527398ad0d3a
Signed-off-by: Nikesh Oswal <noswal@nvidia.com>
Reviewed-on: http://git-master/r/241916
Reviewed-by: Seema Khowala <seemaj@nvidia.com>
Tested-by: Seema Khowala <seemaj@nvidia.com>

arch/arm/boot/dts/tegra114-laguna.dts
arch/arm/mach-tegra/Kconfig
arch/arm/mach-tegra/board-ardbeg.c
arch/arm/mach-tegra/board-ardbeg.h
sound/soc/tegra/tegra_rt5639.c
sound/soc/tegra/tegra_rt5645.c

index dc0f5ec..277e7ef 100644 (file)
                status = "okay";
        };
 
+       ahub {
+               status = "okay";
+               i2s@70080300 {
+                       status = "okay";
+               };
+               i2s@70080400 {
+                       status = "okay";
+               };
+               i2s@70080500 {
+                       status = "okay";
+               };
+               i2s@70080600 {
+                       status = "okay";
+               };
+               i2s@70080700 {
+                       status = "okay";
+               };
+               dam@70080800 {
+                       status = "okay";
+               };
+               dam@70080900 {
+                       status = "okay";
+               };
+               dam@70080A00 {
+                       status = "okay";
+               };
+               spdif@70080B00 {
+                       status = "okay";
+               };
+       };
+
        i2c@7000c000 {
                status = "okay";
                clock-frequency = <100000>;
+               rt5645: rt5645@1a {
+                       compatible = "realtek,rt5645";
+                       reg = <0x1a>;
+               };
+               /*rt5639: rt5639@1c {
+                       compatible = "realtek,rt5639";
+                       reg = <0x1c>;
+               };*/
        };
 
        i2c@7000c400 {
        camera {
                status = "okay";
        };
+
+       sound {
+               compatible = "nvidia,tegra-audio-rt5645";
+               nvidia,codec_name = "rt5645.0-001a";
+               nvidia,codec_dai_name = "rt5645-aif1";
+               nvidia,hp-det-gpios = <&gpio 143 0>;
+               nvidia,i2s-param-hifi = <1 1 2 16 48000 2 1536000>;
+               nvidia,i2s-param-bt = <3 1 0 16 8000 1 512000>;
+       };
+
+       /*sound {
+               compatible = "nvidia,tegra-audio-rt5639";
+               nvidia,codec_name = "rt5639.0-001c";
+               nvidia,codec_dai_name = "rt5639-aif1";
+               nvidia,hp-det-gpios = <&gpio 143 0>;
+               nvidia,i2s-param-hifi = <1 1 2 16 48000 2 1536000>;
+               nvidia,i2s-param-bt = <3 1 0 16 8000 1 512000>;
+       };*/
 };
index 8adb062..c321933 100644 (file)
@@ -286,6 +286,8 @@ config MACH_ARDBEG
 config MACH_LAGUNA
         bool "LAGUNA board"
         depends on ARCH_TEGRA_12x_SOC || ARCH_TEGRA_11x_SOC
+        select MACH_HAS_SND_SOC_TEGRA_RT5639 if SND_SOC
+        select MACH_HAS_SND_SOC_TEGRA_RT5645 if SND_SOC
         help
         Support for NVIDIA LAGUNA Development platform
 
index 6227fe1..19dcebe 100644 (file)
@@ -316,15 +316,15 @@ static struct tegra_uart_platform_data ardbeg_uart_pdata;
 /*use board file for T12x*/
 #if defined(CONFIG_ARCH_TEGRA_12x_SOC) || !defined(CONFIG_USE_OF)
 static struct tegra_asoc_platform_data ardbeg_audio_pdata = {
-       .gpio_spkr_en = TEGRA_GPIO_SPKR_EN,
        .gpio_hp_det = TEGRA_GPIO_HP_DET,
+       .gpio_ldo1_en = TEGRA_GPIO_LDO_EN,
+       .gpio_spkr_en = -1,
+       .gpio_int_mic_en = -1,
+       .gpio_ext_mic_en = -1,
        .gpio_hp_mute = -1,
-       .gpio_int_mic_en = TEGRA_GPIO_INT_MIC_EN,
-       .gpio_ext_mic_en = TEGRA_GPIO_EXT_MIC_EN,
-       .gpio_ldo1_en = TEGRA_GPIO_LDO1_EN,
-       .gpio_codec1 = TEGRA_GPIO_CODEC1_EN,
-       .gpio_codec2 = TEGRA_GPIO_CODEC2_EN,
-       .gpio_codec3 = TEGRA_GPIO_CODEC3_EN,
+       .gpio_codec1 = -1,
+       .gpio_codec2 = -1,
+       .gpio_codec3 = -1,
        .i2s_param[HIFI_CODEC]       = {
                .audio_port_id = 1,
                .is_i2s_master = 1,
@@ -339,6 +339,23 @@ static struct tegra_asoc_platform_data ardbeg_audio_pdata = {
 
 static void ardbeg_audio_init(void)
 {
+       struct board_info board_info;
+       tegra_get_board_info(&board_info);
+       if (board_info.board_id == BOARD_PM359 ||
+                       board_info.board_id == BOARD_PM358 ||
+                       board_info.board_id == BOARD_PM363) {
+               /*Laguna*/
+               ardbeg_audio_pdata.gpio_hp_det =
+                       TEGRA_GPIO_HP_DET;
+               ardbeg_audio_pdata.gpio_ldo1_en = -1;
+       } else {
+               /*Ardbeg*/
+               ardbeg_audio_pdata.gpio_hp_det =
+                       TEGRA_GPIO_HP_DET;
+               ardbeg_audio_pdata.gpio_ldo1_en =
+                       TEGRA_GPIO_LDO_EN;
+       }
+
 #ifdef USED_AUDIO_RT5639
        ardbeg_audio_pdata.codec_name = "rt5639.0-001c";
        ardbeg_audio_pdata.codec_dai_name = "rt5639-aif1";
index f067c7f..247b573 100644 (file)
@@ -79,28 +79,17 @@ enum tegra_bb_type {
 #endif
 
 /* Audio-related GPIOs */
-#ifdef CONFIG_ARCH_TEGRA_11x_SOC
-#define TEGRA_GPIO_CDC_IRQ TEGRA_GPIO_PW3
-#define TEGRA_GPIO_LDO1_EN TEGRA_GPIO_PR2
-#define TEGRA_GPIO_HP_DET  TEGRA_GPIO_PR7
-#define TEGRA_GPIO_CODEC1_EN  -1 /*TEGRA_GPIO_PP3*/
-#define TEGRA_GPIO_CODEC2_EN  -1 /*TEGRA_GPIO_PP1*/
-#define TEGRA_GPIO_CODEC3_EN  -1 /*TEGRA_GPIO_PV0*/
-#define TEGRA_GPIO_INT_MIC_EN -1 /*TEGRA_GPIO_PK3*/
-#define TEGRA_GPIO_SPKR_EN    -1
-#define TEGRA_GPIO_EXT_MIC_EN -1
-#else
-/*for t124 ardbeg */
-#define TEGRA_GPIO_CDC_IRQ TEGRA_GPIO_PH4
-#define TEGRA_GPIO_LDO1_EN TEGRA_GPIO_PR2
-#define TEGRA_GPIO_HP_DET  TEGRA_GPIO_PR7
-#define TEGRA_GPIO_CODEC1_EN  -1 /*TEGRA_GPIO_PP3*/
-#define TEGRA_GPIO_CODEC2_EN  -1 /*TEGRA_GPIO_PP1*/
-#define TEGRA_GPIO_CODEC3_EN  -1 /*TEGRA_GPIO_PV0*/
-#define TEGRA_GPIO_INT_MIC_EN -1 /*TEGRA_GPIO_PK3*/
-#define TEGRA_GPIO_SPKR_EN    -1
-#define TEGRA_GPIO_EXT_MIC_EN -1
-#endif
+/*Same GPIO's used for T114(Interposer) and T124*/
+/*Below GPIO's are same for Laguna and Ardbeg*/
+#define TEGRA_GPIO_CDC_IRQ     TEGRA_GPIO_PH4
+#define TEGRA_GPIO_HP_DET              TEGRA_GPIO_PR7
+/*LDO_EN signal is required only for RT5639 and not for RT5645,
+on Laguna the LDO_EN signal comes from a GPIO expander and
+this is exposed as a fixed regulator directly handeled from
+machine driver of rt5639 and for ardebeg we use the below tegra
+GPIO, also the GPIO is same for T114 interposer and T124*/
+#define TEGRA_GPIO_LDO_EN      TEGRA_GPIO_PR2
+
 
 /* Laguna specific */
 
index badc12d..894a479 100644 (file)
@@ -73,17 +73,18 @@ const char *tegra_rt5639_i2s_dai_name[TEGRA30_NR_I2S_IFC] = {
 struct tegra_rt5639 {
        struct tegra_asoc_utils_data util_data;
        struct tegra_asoc_platform_data *pdata;
-       struct regulator *spk_reg;
-       struct regulator *dmic_reg;
-       struct regulator *cdc_en;
        int gpio_requested;
 #ifdef CONFIG_SWITCH
        int jack_status;
 #endif
        enum snd_soc_bias_level bias_level;
        int clock_enabled;
-       struct regulator *dbvdd;
-       struct regulator *avdd;
+       struct regulator *codec_reg;
+       struct regulator *digital_reg;
+       struct regulator *analog_reg;
+       struct regulator *spk_reg;
+       struct regulator *mic_reg;
+       struct regulator *dmic_reg;
 };
 
 static int tegra_rt5639_hw_params(struct snd_pcm_substream *substream,
@@ -598,52 +599,6 @@ static int tegra_rt5639_init(struct snd_soc_pcm_runtime *rtd)
        struct tegra_asoc_platform_data *pdata = machine->pdata;
        int ret;
 
-       if (gpio_is_valid(pdata->gpio_spkr_en)) {
-               ret = gpio_request(pdata->gpio_spkr_en, "spkr_en");
-               if (ret) {
-                       dev_err(card->dev, "cannot get spkr_en gpio\n");
-                       return ret;
-               }
-               machine->gpio_requested |= GPIO_SPKR_EN;
-
-               gpio_direction_output(pdata->gpio_spkr_en, 0);
-       }
-
-       if (gpio_is_valid(pdata->gpio_hp_mute)) {
-               ret = gpio_request(pdata->gpio_hp_mute, "hp_mute");
-               if (ret) {
-                       dev_err(card->dev, "cannot get hp_mute gpio\n");
-                       return ret;
-               }
-               machine->gpio_requested |= GPIO_HP_MUTE;
-
-               gpio_direction_output(pdata->gpio_hp_mute, 0);
-       }
-
-       if (gpio_is_valid(pdata->gpio_int_mic_en)) {
-               ret = gpio_request(pdata->gpio_int_mic_en, "int_mic_en");
-               if (ret) {
-                       dev_err(card->dev, "cannot get int_mic_en gpio\n");
-               } else {
-                       machine->gpio_requested |= GPIO_INT_MIC_EN;
-
-                       /* Disable int mic; enable signal is active-high */
-                       gpio_direction_output(pdata->gpio_int_mic_en, 0);
-               }
-       }
-
-       if (gpio_is_valid(pdata->gpio_ext_mic_en)) {
-               ret = gpio_request(pdata->gpio_ext_mic_en, "ext_mic_en");
-               if (ret) {
-                       dev_err(card->dev, "cannot get ext_mic_en gpio\n");
-               } else {
-                       machine->gpio_requested |= GPIO_EXT_MIC_EN;
-
-                       /* Disable ext mic; enable signal is active-low */
-                       gpio_direction_output(pdata->gpio_ext_mic_en, 1);
-               }
-       }
-
        if (gpio_is_valid(pdata->gpio_hp_det)) {
                tegra_rt5639_hp_jack_gpio.gpio = pdata->gpio_hp_det;
                snd_soc_jack_new(codec, "Headphone Jack", SND_JACK_HEADPHONE,
@@ -802,13 +757,13 @@ static int tegra_rt5639_driver_probe(struct platform_device *pdev)
 
                pdata->gpio_ldo1_en = of_get_named_gpio(np,
                                                "nvidia,ldo-gpios", 0);
-               if (pdata->gpio_ldo1_en == -EPROBE_DEFER)
-                       return -EPROBE_DEFER;
+               if (pdata->gpio_ldo1_en < 0)
+                       dev_warn(&pdev->dev, "Failed to get LDO_EN GPIO\n");
 
                pdata->gpio_hp_det = of_get_named_gpio(np,
                                                "nvidia,hp-det-gpios", 0);
-               if (pdata->gpio_hp_det == -EPROBE_DEFER)
-                       return -EPROBE_DEFER;
+               if (pdata->gpio_hp_det < 0)
+                       dev_warn(&pdev->dev, "Failed to get HP Det GPIO\n");
 
                pdata->gpio_codec1 = pdata->gpio_codec2 = pdata->gpio_codec3 =
                pdata->gpio_spkr_en = pdata->gpio_hp_mute =
@@ -856,42 +811,6 @@ static int tegra_rt5639_driver_probe(struct platform_device *pdev)
                msleep(200);
        }
 
-       if (gpio_is_valid(pdata->gpio_codec1)) {
-               ret = gpio_request(pdata->gpio_codec1, "rt5639");
-               if (ret)
-                       dev_err(&pdev->dev, "Fail gpio_request GPIO_CODEC1\n");
-
-               ret = gpio_direction_output(pdata->gpio_codec1, 1);
-               if (ret)
-                       dev_err(&pdev->dev, "Fail gpio_direction GPIO_CODEC1\n");
-
-               msleep(200);
-       }
-
-       if (gpio_is_valid(pdata->gpio_codec2)) {
-               ret = gpio_request(pdata->gpio_codec2, "rt5639");
-               if (ret)
-                       dev_err(&pdev->dev, "Fail gpio_request GPIO_CODEC2\n");
-
-               ret = gpio_direction_output(pdata->gpio_codec2, 1);
-               if (ret)
-                       dev_err(&pdev->dev, "Fail gpio_direction GPIO_CODEC2\n");
-
-               msleep(200);
-       }
-
-       if (gpio_is_valid(pdata->gpio_codec3)) {
-               ret = gpio_request(pdata->gpio_codec3, "rt5639");
-               if (ret)
-                       dev_err(&pdev->dev, "Fail gpio_request GPIO_CODEC3\n");
-
-               ret = gpio_direction_output(pdata->gpio_codec3, 1);
-               if (ret)
-                       dev_err(&pdev->dev, "Fail gpio_direction GPIO_CODEC3\n");
-
-               msleep(200);
-       }
-
        machine->pdata = pdata;
 
        ret = tegra_asoc_utils_init(&machine->util_data, &pdev->dev, card);
@@ -901,36 +820,68 @@ static int tegra_rt5639_driver_probe(struct platform_device *pdev)
        machine->bias_level = SND_SOC_BIAS_STANDBY;
        machine->clock_enabled = 1;
 
+       /*
+       *codec_reg - its a GPIO (in the form of a fixed regulator) that enables
+       *the basic(I2C) power for the codec and must be ON always
+       */
        if (!gpio_is_valid(pdata->gpio_ldo1_en)) {
-               machine->cdc_en = regulator_get(&pdev->dev, "ldo1_en");
-               if (IS_ERR(machine->cdc_en)) {
-                       dev_err(&pdev->dev, "ldo1_en regulator not found %ld\n",
-                                       PTR_ERR(machine->cdc_en));
-                       machine->cdc_en = 0;
-               } else {
-                       regulator_enable(machine->cdc_en);
-               }
+               machine->codec_reg = regulator_get(&pdev->dev, "ldoen");
+               if (IS_ERR(machine->codec_reg))
+                       machine->codec_reg = 0;
+               else
+                       regulator_enable(machine->codec_reg);
        }
 
-       machine->spk_reg = regulator_get(&pdev->dev, "vdd_spk");
-       if (IS_ERR(machine->spk_reg)) {
-               dev_info(&pdev->dev, "No speaker regulator found\n");
+       /*
+       *digital_reg - provided the digital power for the codec and must be
+       *ON always
+       */
+       machine->digital_reg = regulator_get(&pdev->dev, "dbvdd");
+       if (IS_ERR(machine->digital_reg))
+               machine->digital_reg = 0;
+       else
+               regulator_enable(machine->digital_reg);
+
+       /*
+       *analog_reg - provided the analog power for the codec and must be
+       *ON always
+       */
+       machine->analog_reg = regulator_get(&pdev->dev, "avdd");
+       if (IS_ERR(machine->analog_reg))
+               machine->analog_reg = 0;
+       else
+               regulator_enable(machine->analog_reg);
+
+       /*
+       *mic_reg - provided the micbias power and jack detection power
+       *for the codec and must be ON always
+       */
+       machine->mic_reg = regulator_get(&pdev->dev, "micvdd");
+       if (IS_ERR(machine->mic_reg))
+               machine->mic_reg = 0;
+       else
+               regulator_enable(machine->mic_reg);
+
+       /*
+       *spk_reg - provided the speaker power and can be turned ON
+       *on need basis, when required
+       */
+       machine->spk_reg = regulator_get(&pdev->dev, "spkvdd");
+       if (IS_ERR(machine->spk_reg))
                machine->spk_reg = 0;
-       }
-
-
-       machine->dbvdd = regulator_get(&pdev->dev, "vdd_aud_dgtl");
-       if (IS_ERR(machine->dbvdd))
-               machine->dbvdd = 0;
        else
-               regulator_enable(machine->dbvdd);
-
-
-       machine->avdd = regulator_get(&pdev->dev, "vdd_aud_anlg");
-       if (IS_ERR(machine->avdd))
-               machine->avdd = 0;
+               regulator_disable(machine->spk_reg);
+
+       /*
+       *dmic_reg - provided the DMIC power and can be turned ON
+       *on need basis, when required
+       */
+       machine->dmic_reg = regulator_get(&pdev->dev, "dmicvdd");
+       if (IS_ERR(machine->dmic_reg))
+               machine->dmic_reg = 0;
        else
-               regulator_enable(machine->avdd);
+               regulator_disable(machine->dmic_reg);
+
 
 #ifdef CONFIG_SWITCH
        /* Addd h2w swith class support */
@@ -1012,29 +963,19 @@ static int tegra_rt5639_driver_remove(struct platform_device *pdev)
                snd_soc_jack_free_gpios(&tegra_rt5639_hp_jack,
                                        1,
                                        &tegra_rt5639_hp_jack_gpio);
-       if (machine->gpio_requested & GPIO_EXT_MIC_EN)
-               gpio_free(pdata->gpio_ext_mic_en);
-       if (machine->gpio_requested & GPIO_INT_MIC_EN)
-               gpio_free(pdata->gpio_int_mic_en);
-       if (machine->gpio_requested & GPIO_HP_MUTE)
-               gpio_free(pdata->gpio_hp_mute);
-       if (machine->gpio_requested & GPIO_SPKR_EN)
-               gpio_free(pdata->gpio_spkr_en);
-       machine->gpio_requested = 0;
 
+       if (machine->digital_reg)
+               regulator_put(machine->digital_reg);
+       if (machine->analog_reg)
+               regulator_put(machine->analog_reg);
+       if (machine->mic_reg)
+               regulator_put(machine->mic_reg);
        if (machine->spk_reg)
                regulator_put(machine->spk_reg);
        if (machine->dmic_reg)
                regulator_put(machine->dmic_reg);
-       if (machine->dbvdd)
-               regulator_put(machine->dbvdd);
-       if (machine->avdd)
-               regulator_put(machine->avdd);
-
-       if (machine->cdc_en) {
-               regulator_disable(machine->cdc_en);
-               regulator_put(machine->cdc_en);
-       }
+       if (machine->codec_reg)
+               regulator_put(machine->codec_reg);
 
        if (gpio_is_valid(pdata->gpio_ldo1_en)) {
                gpio_set_value(pdata->gpio_ldo1_en, 0);
index ecc2ef8..bceff6a 100644 (file)
@@ -73,17 +73,18 @@ const char *tegra_rt5645_i2s_dai_name[TEGRA30_NR_I2S_IFC] = {
 struct tegra_rt5645 {
        struct tegra_asoc_utils_data util_data;
        struct tegra_asoc_platform_data *pdata;
-       struct regulator *spk_reg;
-       struct regulator *dmic_reg;
-       struct regulator *cdc_en;
        int gpio_requested;
 #ifdef CONFIG_SWITCH
        int jack_status;
 #endif
        enum snd_soc_bias_level bias_level;
        int clock_enabled;
-       struct regulator *dbvdd;
-       struct regulator *avdd;
+       struct regulator *codec_reg;
+       struct regulator *digital_reg;
+       struct regulator *analog_reg;
+       struct regulator *spk_reg;
+       struct regulator *mic_reg;
+       struct regulator *dmic_reg;
 };
 
 static int tegra_rt5645_hw_params(struct snd_pcm_substream *substream,
@@ -518,12 +519,18 @@ static int tegra_rt5645_event_int_mic(struct snd_soc_dapm_widget *w,
        struct tegra_rt5645 *machine = snd_soc_card_get_drvdata(card);
        struct tegra_asoc_platform_data *pdata = machine->pdata;
 
+       /*
+       *enable the below code if we use onboard mic as DMIC
+       *currently its AMIC
+       */
+#ifdef USE_DMIC
        if (machine->dmic_reg) {
                if (SND_SOC_DAPM_EVENT_ON(event))
                        regulator_enable(machine->dmic_reg);
                else
                        regulator_disable(machine->dmic_reg);
        }
+#endif
 
        if (!(machine->gpio_requested & GPIO_INT_MIC_EN))
                return 0;
@@ -592,52 +599,6 @@ static int tegra_rt5645_init(struct snd_soc_pcm_runtime *rtd)
        struct tegra_asoc_platform_data *pdata = machine->pdata;
        int ret;
 
-       if (gpio_is_valid(pdata->gpio_spkr_en)) {
-               ret = gpio_request(pdata->gpio_spkr_en, "spkr_en");
-               if (ret) {
-                       dev_err(card->dev, "cannot get spkr_en gpio\n");
-                       return ret;
-               }
-               machine->gpio_requested |= GPIO_SPKR_EN;
-
-               gpio_direction_output(pdata->gpio_spkr_en, 0);
-       }
-
-       if (gpio_is_valid(pdata->gpio_hp_mute)) {
-               ret = gpio_request(pdata->gpio_hp_mute, "hp_mute");
-               if (ret) {
-                       dev_err(card->dev, "cannot get hp_mute gpio\n");
-                       return ret;
-               }
-               machine->gpio_requested |= GPIO_HP_MUTE;
-
-               gpio_direction_output(pdata->gpio_hp_mute, 0);
-       }
-
-       if (gpio_is_valid(pdata->gpio_int_mic_en)) {
-               ret = gpio_request(pdata->gpio_int_mic_en, "int_mic_en");
-               if (ret) {
-                       dev_err(card->dev, "cannot get int_mic_en gpio\n");
-               } else {
-                       machine->gpio_requested |= GPIO_INT_MIC_EN;
-
-                       /* Disable int mic; enable signal is active-high */
-                       gpio_direction_output(pdata->gpio_int_mic_en, 0);
-               }
-       }
-
-       if (gpio_is_valid(pdata->gpio_ext_mic_en)) {
-               ret = gpio_request(pdata->gpio_ext_mic_en, "ext_mic_en");
-               if (ret) {
-                       dev_err(card->dev, "cannot get ext_mic_en gpio\n");
-               } else {
-                       machine->gpio_requested |= GPIO_EXT_MIC_EN;
-
-                       /* Disable ext mic; enable signal is active-low */
-                       gpio_direction_output(pdata->gpio_ext_mic_en, 1);
-               }
-       }
-
        if (gpio_is_valid(pdata->gpio_hp_det)) {
                tegra_rt5645_hp_jack_gpio.gpio = pdata->gpio_hp_det;
                snd_soc_jack_new(codec, "Headphone Jack", SND_JACK_HEADPHONE,
@@ -796,13 +757,13 @@ static int tegra_rt5645_driver_probe(struct platform_device *pdev)
 
                pdata->gpio_ldo1_en = of_get_named_gpio(np,
                                                "nvidia,ldo-gpios", 0);
-               if (pdata->gpio_ldo1_en == -EPROBE_DEFER)
-                       return -EPROBE_DEFER;
+               if (pdata->gpio_ldo1_en < 0)
+                       dev_warn(&pdev->dev, "Failed to get LDO_EN GPIO\n");
 
                pdata->gpio_hp_det = of_get_named_gpio(np,
                                                "nvidia,hp-det-gpios", 0);
-               if (pdata->gpio_hp_det == -EPROBE_DEFER)
-                       return -EPROBE_DEFER;
+               if (pdata->gpio_hp_det < 0)
+                       dev_warn(&pdev->dev, "Failed to get HP Det GPIO\n");
 
                pdata->gpio_codec1 = pdata->gpio_codec2 = pdata->gpio_codec3 =
                pdata->gpio_spkr_en = pdata->gpio_hp_mute =
@@ -850,42 +811,6 @@ static int tegra_rt5645_driver_probe(struct platform_device *pdev)
                msleep(200);
        }
 
-       if (gpio_is_valid(pdata->gpio_codec1)) {
-               ret = gpio_request(pdata->gpio_codec1, "rt5645");
-               if (ret)
-                       dev_err(&pdev->dev, "Fail gpio_request GPIO_CODEC1\n");
-
-               ret = gpio_direction_output(pdata->gpio_codec1, 1);
-               if (ret)
-                       dev_err(&pdev->dev, "Fail gpio_direction GPIO_CODEC1\n");
-
-               msleep(200);
-       }
-
-       if (gpio_is_valid(pdata->gpio_codec2)) {
-               ret = gpio_request(pdata->gpio_codec2, "rt5645");
-               if (ret)
-                       dev_err(&pdev->dev, "Fail gpio_request GPIO_CODEC2\n");
-
-               ret = gpio_direction_output(pdata->gpio_codec2, 1);
-               if (ret)
-                       dev_err(&pdev->dev, "Fail gpio_direction GPIO_CODEC2\n");
-
-               msleep(200);
-       }
-
-       if (gpio_is_valid(pdata->gpio_codec3)) {
-               ret = gpio_request(pdata->gpio_codec3, "rt5645");
-               if (ret)
-                       dev_err(&pdev->dev, "Fail gpio_request GPIO_CODEC3\n");
-
-               ret = gpio_direction_output(pdata->gpio_codec3, 1);
-               if (ret)
-                       dev_err(&pdev->dev, "Fail gpio_direction GPIO_CODEC3\n");
-
-               msleep(200);
-       }
-
        machine->pdata = pdata;
 
        ret = tegra_asoc_utils_init(&machine->util_data, &pdev->dev, card);
@@ -895,36 +820,67 @@ static int tegra_rt5645_driver_probe(struct platform_device *pdev)
        machine->bias_level = SND_SOC_BIAS_STANDBY;
        machine->clock_enabled = 1;
 
+       /*
+       *codec_reg - its a GPIO (in the form of a fixed regulator) that enables
+       *the basic(I2C) power for the codec and must be ON always
+       */
        if (!gpio_is_valid(pdata->gpio_ldo1_en)) {
-               machine->cdc_en = regulator_get(&pdev->dev, "ldo1_en");
-               if (IS_ERR(machine->cdc_en)) {
-                       dev_err(&pdev->dev, "ldo1_en regulator not found %ld\n",
-                                       PTR_ERR(machine->cdc_en));
-                       machine->cdc_en = 0;
-               } else {
-                       regulator_enable(machine->cdc_en);
-               }
+               machine->codec_reg = regulator_get(&pdev->dev, "ldoen");
+               if (IS_ERR(machine->codec_reg))
+                       machine->codec_reg = 0;
+               else
+                       regulator_enable(machine->codec_reg);
        }
 
-       machine->spk_reg = regulator_get(&pdev->dev, "vdd_spk");
-       if (IS_ERR(machine->spk_reg)) {
-               dev_info(&pdev->dev, "No speaker regulator found\n");
+       /*
+       *digital_reg - provided the digital power for the codec and must be
+       *ON always
+       */
+       machine->digital_reg = regulator_get(&pdev->dev, "dbvdd");
+       if (IS_ERR(machine->digital_reg))
+               machine->digital_reg = 0;
+       else
+               regulator_enable(machine->digital_reg);
+
+       /*
+       *analog_reg - provided the analog power for the codec and must be
+       *ON always
+       */
+       machine->analog_reg = regulator_get(&pdev->dev, "avdd");
+       if (IS_ERR(machine->analog_reg))
+               machine->analog_reg = 0;
+       else
+               regulator_enable(machine->analog_reg);
+
+       /*
+       *mic_reg - provided the micbias power and jack detection power
+       *for the codec and must be ON always
+       */
+       machine->mic_reg = regulator_get(&pdev->dev, "micvdd");
+       if (IS_ERR(machine->mic_reg))
+               machine->mic_reg = 0;
+       else
+               regulator_enable(machine->mic_reg);
+
+       /*
+       *spk_reg - provided the speaker power and can be turned ON
+       *on need basis, when required
+       */
+       machine->spk_reg = regulator_get(&pdev->dev, "spkvdd");
+       if (IS_ERR(machine->spk_reg))
                machine->spk_reg = 0;
-       }
-
-
-       machine->dbvdd = regulator_get(&pdev->dev, "vdd_aud_dgtl");
-       if (IS_ERR(machine->dbvdd))
-               machine->dbvdd = 0;
        else
-               regulator_enable(machine->dbvdd);
-
-
-       machine->avdd = regulator_get(&pdev->dev, "vdd_aud_anlg");
-       if (IS_ERR(machine->avdd))
-               machine->avdd = 0;
+               regulator_disable(machine->spk_reg);
+
+       /*
+       *dmic_reg - provided the DMIC power and can be turned ON
+       *on need basis, when required
+       */
+       machine->dmic_reg = regulator_get(&pdev->dev, "dmicvdd");
+       if (IS_ERR(machine->dmic_reg))
+               machine->dmic_reg = 0;
        else
-               regulator_enable(machine->avdd);
+               regulator_disable(machine->dmic_reg);
 
 #ifdef CONFIG_SWITCH
        /* Addd h2w swith class support */
@@ -1006,29 +962,19 @@ static int tegra_rt5645_driver_remove(struct platform_device *pdev)
                snd_soc_jack_free_gpios(&tegra_rt5645_hp_jack,
                                        1,
                                        &tegra_rt5645_hp_jack_gpio);
-       if (machine->gpio_requested & GPIO_EXT_MIC_EN)
-               gpio_free(pdata->gpio_ext_mic_en);
-       if (machine->gpio_requested & GPIO_INT_MIC_EN)
-               gpio_free(pdata->gpio_int_mic_en);
-       if (machine->gpio_requested & GPIO_HP_MUTE)
-               gpio_free(pdata->gpio_hp_mute);
-       if (machine->gpio_requested & GPIO_SPKR_EN)
-               gpio_free(pdata->gpio_spkr_en);
-       machine->gpio_requested = 0;
 
+       if (machine->digital_reg)
+               regulator_put(machine->digital_reg);
+       if (machine->analog_reg)
+               regulator_put(machine->analog_reg);
+       if (machine->mic_reg)
+               regulator_put(machine->mic_reg);
        if (machine->spk_reg)
                regulator_put(machine->spk_reg);
        if (machine->dmic_reg)
                regulator_put(machine->dmic_reg);
-       if (machine->dbvdd)
-               regulator_put(machine->dbvdd);
-       if (machine->avdd)
-               regulator_put(machine->avdd);
-
-       if (machine->cdc_en) {
-               regulator_disable(machine->cdc_en);
-               regulator_put(machine->cdc_en);
-       }
+       if (machine->codec_reg)
+               regulator_put(machine->codec_reg);
 
        if (gpio_is_valid(pdata->gpio_ldo1_en)) {
                gpio_set_value(pdata->gpio_ldo1_en, 0);