When the corresponding output device is not in playback, we can hear a little
noises.

Fix it by powering on the device only when it's in playback.

Signed-off-by: Lu Guanqun <[email protected]>
Reviewed-by: Wu Fengguang <[email protected]>
---
 drivers/staging/intel_sst/intelmid_v2_control.c |   19 +++++++++++++++----
 1 files changed, 15 insertions(+), 4 deletions(-)

diff --git a/drivers/staging/intel_sst/intelmid_v2_control.c 
b/drivers/staging/intel_sst/intelmid_v2_control.c
index 9f1b4a5..ad1b03e 100644
--- a/drivers/staging/intel_sst/intelmid_v2_control.c
+++ b/drivers/staging/intel_sst/intelmid_v2_control.c
@@ -217,6 +217,8 @@ static int nc_power_up_pb(unsigned int port)
 
        msleep(30);
 
+       snd_pmic_ops_nc.pb_on = 1;
+
        /*
         * There is a mismatch between Playback Sources and the enumerated
         * values of output sources.  This mismatch causes ALSA upper to send
@@ -376,6 +378,8 @@ static int nc_power_down_pb(unsigned int device)
 
        msleep(30);
 
+       snd_pmic_ops_nc.pb_on = 0;
+
        return nc_enable_audiodac(UNMUTE);
 
 
@@ -519,11 +523,13 @@ static int nc_set_selected_output_dev(u8 value)
 {
        struct sc_reg_access sc_access_HP[] = {
                {LMUTE, 0x02, 0x06},
-               {RMUTE, 0x02, 0x06}
+               {RMUTE, 0x02, 0x06},
+               {DRVPOWERCTRL, 0x06, 0x06},
        };
        struct sc_reg_access sc_access_IS[] = {
                {LMUTE, 0x04, 0x06},
-               {RMUTE, 0x04, 0x06}
+               {RMUTE, 0x04, 0x06},
+               {DRVPOWERCTRL, 0x00, 0x06},
        };
        int retval = 0;
 
@@ -535,13 +541,18 @@ static int nc_set_selected_output_dev(u8 value)
        pr_debug("sst: nc set selected output:%d\n", value);
        switch (value) {
        case STEREO_HEADPHONE:
+               if (snd_pmic_ops_nc.pb_on) {
+                       sst_sc_reg_access(sc_access_HP+2, PMIC_WRITE, 1);
+                       msleep(100);
+               }
                retval = sst_sc_reg_access(sc_access_HP, PMIC_WRITE, 2);
                nc_set_amp_power(0);
                break;
        case MONO_EARPIECE:
        case INTERNAL_SPKR:
-               retval = sst_sc_reg_access(sc_access_IS, PMIC_WRITE, 2);
-               nc_set_amp_power(1);
+               retval = sst_sc_reg_access(sc_access_IS, PMIC_WRITE, 3);
+               if (snd_pmic_ops_nc.pb_on)
+                       nc_set_amp_power(1);
                break;
        default:
                pr_err("sst: rcvd illegal request: %d\n", value);

_______________________________________________
MeeGo-kernel mailing list
[email protected]
http://lists.meego.com/listinfo/meego-kernel

Reply via email to