Hi Arjan,

Could you accept this patch into your patchset?
As I check your devel version kernel-adaptation-mrst-2.6.37.6-57.1,
this is not in yet.

This patch fixes this bug:
https://bugzilla.otcshare.org/show_bug.cgi?id=4807

Thanks!

On Wed, Apr 27, 2011 at 10:09:07AM +0800, Lu Guanqun wrote:
> With this patch, Master Volume will control AUDIOLVOL(0x10c) and
> AUDIORVOL(0x10d); while PCM Volume will control HPLVOL(0x123) and
> HPRVOL(0x124).
> 
> Signed-off-by: Lu Guanqun <[email protected]>
> ---
>  drivers/staging/intel_sst/intelmid.h             |    7 ++-
>  drivers/staging/intel_sst/intelmid_ctrl.c        |   40 +++++++++++++++++-
>  drivers/staging/intel_sst/intelmid_snd_control.h |    2 +
>  drivers/staging/intel_sst/intelmid_v2_control.c  |   48 
> +++++++++++++++++-----
>  4 files changed, 81 insertions(+), 16 deletions(-)
> 
> diff --git a/drivers/staging/intel_sst/intelmid.h 
> b/drivers/staging/intel_sst/intelmid.h
> index 68ecfbf..6170d3c 100644
> --- a/drivers/staging/intel_sst/intelmid.h
> +++ b/drivers/staging/intel_sst/intelmid.h
> @@ -57,9 +57,9 @@
>  #define MAX_CHANNEL_DMIC     5
>  #define FIFO_SIZE            0 /* fifo not being used */
>  #define INTEL_MAD            "Intel MAD"
> -#define MAX_CTRL_MRST                7
> +#define MAX_CTRL_MRST                8
>  #define MAX_CTRL_MFLD                7
> -#define MAX_CTRL             7
> +#define MAX_CTRL             8
>  #define MAX_VENDORS          4
>  /* TODO +6 db */
>  #define MAX_VOL              64
> @@ -145,6 +145,8 @@ struct snd_control_val {
>       int     playback_vol_min;
>       int     capture_vol_max;
>       int     capture_vol_min;
> +     int     master_vol_max;
> +     int     master_vol_min;
>  };
>  
>  struct mad_stream_pvt {
> @@ -175,6 +177,7 @@ enum _widget_ctrl {
>       PLAYBACK_MUTE,
>       CAPTURE_VOL,
>       CAPTURE_MUTE,
> +     MASTER_VOL,
>       MASTER_MUTE
>  };
>  enum _widget_ctrl_mfld {
> diff --git a/drivers/staging/intel_sst/intelmid_ctrl.c 
> b/drivers/staging/intel_sst/intelmid_ctrl.c
> index 51d3ddf..6638972 100644
> --- a/drivers/staging/intel_sst/intelmid_ctrl.c
> +++ b/drivers/staging/intel_sst/intelmid_ctrl.c
> @@ -77,9 +77,11 @@ struct snd_control_val intelmad_ctrl_val[MAX_VENDORS] = {
>       },
>       {
>               .playback_vol_max = 0,
> -             .playback_vol_min = -126,
> +             .playback_vol_min = -31,
>               .capture_vol_max = 0,
>               .capture_vol_min = -31,
> +             .master_vol_max = 0,
> +             .master_vol_min = -126,
>       },
>  };
>  
> @@ -156,6 +158,15 @@ static int snd_intelmad_playback_volume_info(struct 
> snd_kcontrol *kcontrol,
>       return 0;
>  }
>  
> +static int snd_intelmad_master_volume_info(struct snd_kcontrol *kcontrol,
> +                                     struct snd_ctl_elem_info *uinfo)
> +{
> +     snd_intelmad_volume_info(uinfo, STEREO_CNTL,
> +             intelmad_ctrl_val[sst_card_vendor_id].master_vol_max,
> +             intelmad_ctrl_val[sst_card_vendor_id].master_vol_min);
> +     return 0;
> +}
> +
>  /**
>  * snd_intelmad_device_info_mrst - provides information about the devices 
> available
>  *
> @@ -278,6 +289,11 @@ static int snd_intelmad_volume_get(struct snd_kcontrol 
> *kcontrol,
>       case CAPTURE_VOL:
>               cntl_list[0] = PMIC_SND_CAPTURE_VOL;
>               break;
> +
> +     case MASTER_VOL:
> +             cntl_list[0] = PMIC_SND_RIGHT_MASTER_VOL;
> +             cntl_list[1] = PMIC_SND_LEFT_MASTER_VOL;
> +             break;
>       default:
>               return -EINVAL;
>       }
> @@ -288,7 +304,8 @@ static int snd_intelmad_volume_get(struct snd_kcontrol 
> *kcontrol,
>       if (ret_val)
>               return ret_val;
>  
> -     if (kcontrol->id.numid == PLAYBACK_VOL) {
> +     if (kcontrol->id.numid == PLAYBACK_VOL ||
> +             kcontrol->id.numid == MASTER_VOL) {
>               ret_val = scard_ops->get_vol(cntl_list[1], &value);
>               uval->value.integer.value[1] = value;
>       }
> @@ -396,6 +413,12 @@ static int snd_intelmad_volume_set(struct snd_kcontrol 
> *kcontrol,
>       case CAPTURE_VOL:
>               cntl_list[0] = PMIC_SND_CAPTURE_VOL;
>               break;
> +
> +     case MASTER_VOL:
> +             cntl_list[0] = PMIC_SND_LEFT_MASTER_VOL;
> +             cntl_list[1] = PMIC_SND_RIGHT_MASTER_VOL;
> +             break;
> +
>       default:
>               return -EINVAL;
>       }
> @@ -405,7 +428,8 @@ static int snd_intelmad_volume_set(struct snd_kcontrol 
> *kcontrol,
>       if (ret_val)
>               return ret_val;
>  
> -     if (kcontrol->id.numid == PLAYBACK_VOL)
> +     if (kcontrol->id.numid == PLAYBACK_VOL ||
> +             kcontrol->id.numid == MASTER_VOL)
>               ret_val = scard_ops->set_vol(cntl_list[1],
>                               uval->value.integer.value[1]);
>       return ret_val;
> @@ -750,7 +774,6 @@ static int snd_intelmad_device_dmic_info_mfld(struct 
> snd_kcontrol *kcontrol,
>       return 0;
>  }
>  
> -
>  struct snd_kcontrol_new snd_intelmad_controls_mrst[MAX_CTRL] __devinitdata = 
> {
>  {
>       .iface          =       SNDRV_CTL_ELEM_IFACE_MIXER,
> @@ -808,6 +831,15 @@ struct snd_kcontrol_new 
> snd_intelmad_controls_mrst[MAX_CTRL] __devinitdata = {
>  },
>  {
>       .iface          =       SNDRV_CTL_ELEM_IFACE_MIXER,
> +     .name           =       "Master Playback Volume",
> +     .access         =       SNDRV_CTL_ELEM_ACCESS_READWRITE,
> +     .info           =       snd_intelmad_master_volume_info,
> +     .get            =       snd_intelmad_volume_get,
> +     .put            =       snd_intelmad_volume_set,
> +     .private_value  =       0,
> +},
> +{
> +     .iface          =       SNDRV_CTL_ELEM_IFACE_MIXER,
>       .name           =       "Master Playback Switch",
>       .access         =       SNDRV_CTL_ELEM_ACCESS_READWRITE,
>       .info           =       snd_intelmad_mute_info,
> diff --git a/drivers/staging/intel_sst/intelmid_snd_control.h 
> b/drivers/staging/intel_sst/intelmid_snd_control.h
> index c7e9f16..06ad3a1 100644
> --- a/drivers/staging/intel_sst/intelmid_snd_control.h
> +++ b/drivers/staging/intel_sst/intelmid_snd_control.h
> @@ -111,6 +111,8 @@ enum pmic_controls {
>       PMIC_SND_RIGHT_SPEAKER_MUTE =           0x0015,
>       PMIC_SND_RECEIVER_VOL =                 0x0016,
>       PMIC_SND_RECEIVER_MUTE =                0x0017,
> +     PMIC_SND_LEFT_MASTER_VOL =              0x0018,
> +     PMIC_SND_RIGHT_MASTER_VOL =             0x0019,
>  /* Other controls */
>       PMIC_SND_MUTE_ALL =                     0x0020,
>       PMIC_MAX_CONTROLS =                     0x0020,
> diff --git a/drivers/staging/intel_sst/intelmid_v2_control.c 
> b/drivers/staging/intel_sst/intelmid_v2_control.c
> index 2010ba6..149a387 100644
> --- a/drivers/staging/intel_sst/intelmid_v2_control.c
> +++ b/drivers/staging/intel_sst/intelmid_v2_control.c
> @@ -819,9 +819,8 @@ static int nc_set_vol(int dev_id, int value)
>       case PMIC_SND_LEFT_PB_VOL:
>               pr_debug("sst: PMIC_SND_LEFT_HP_VOL %d\n", value);
>               sc_access[0].value = -value;
> -             sc_access[0].reg_addr  = AUDIOLVOL;
> -             sc_access[0].mask =
> -                     (MASK0|MASK1|MASK2|MASK3|MASK4|MASK5|MASK6);
> +             sc_access[0].reg_addr  = HPLVOL;
> +             sc_access[0].mask = (MASK0|MASK1|MASK2|MASK3|MASK4);
>               entries = 1;
>               break;
>  
> @@ -829,15 +828,32 @@ static int nc_set_vol(int dev_id, int value)
>               pr_debug("sst: PMIC_SND_RIGHT_HP_VOL value %d\n", value);
>               if (snd_pmic_ops_nc.num_channel == 1) {
>                       sc_access[0].value = 0x04;
> -                 sc_access[0].reg_addr = RMUTE;
> +                     sc_access[0].reg_addr = RMUTE;
>                       sc_access[0].mask = MASK2;
>               } else {
> +                     sc_access[0].value = -value;
> +                     sc_access[0].reg_addr  = HPRVOL;
> +                     sc_access[0].mask = (MASK0|MASK1|MASK2|MASK3|MASK4);
> +             }
> +             entries = 1;
> +             break;
> +
> +     case PMIC_SND_LEFT_MASTER_VOL:
> +             pr_debug("sst: PMIC_SND_LEFT_MASTER_VOL value %d\n", value);
> +             sc_access[0].value = -value;
> +             sc_access[0].reg_addr = AUDIOLVOL;
> +             sc_access[0].mask =
> +                     (MASK0|MASK1|MASK2|MASK3|MASK4|MASK5|MASK6);
> +             entries = 1;
> +             break;
> +
> +     case PMIC_SND_RIGHT_MASTER_VOL:
> +             pr_debug("sst: PMIC_SND_RIGHT_MASTER_VOL value %d\n", value);
>               sc_access[0].value = -value;
> -             sc_access[0].reg_addr  = AUDIORVOL;
> +             sc_access[0].reg_addr = AUDIORVOL;
>               sc_access[0].mask =
>                               (MASK0|MASK1|MASK2|MASK3|MASK4|MASK5|MASK6);
>               entries = 1;
> -             }
>               break;
>  
>       default:
> @@ -1002,18 +1018,30 @@ static int nc_get_vol(int dev_id, int *value)
>               mask = (MASK0|MASK1|MASK2|MASK3|MASK4|MASK5);
>               break;
>  
> -     case PMIC_SND_RIGHT_PB_VOL:
> -             pr_debug("sst: GET_VOLUME_PMIC_LEFT_HP_VOL\n");
> +     case PMIC_SND_LEFT_MASTER_VOL:
> +             pr_debug("sst: GET_VOLUME_PMIC_LEFT_MASTER_VOL\n");
>               sc_access.reg_addr = AUDIOLVOL;
>               mask = (MASK0|MASK1|MASK2|MASK3|MASK4|MASK5|MASK6);
>               break;
>  
> -     case PMIC_SND_LEFT_PB_VOL:
> -             pr_debug("sst: GET_VOLUME_PMIC_RIGHT_HP_VOL\n");
> +     case PMIC_SND_RIGHT_MASTER_VOL:
> +             pr_debug("sst: GET_VOLUME_PMIC_RIGHT_MASTER_VOL\n");
>               sc_access.reg_addr = AUDIORVOL;
>               mask = (MASK0|MASK1|MASK2|MASK3|MASK4|MASK5|MASK6);
>               break;
>  
> +     case PMIC_SND_RIGHT_PB_VOL:
> +             pr_debug("sst: GET_VOLUME_PMIC_RIGHT_HP_VOL\n");
> +             sc_access.reg_addr = HPRVOL;
> +             mask = (MASK0|MASK1|MASK2|MASK3|MASK4);
> +             break;
> +
> +     case PMIC_SND_LEFT_PB_VOL:
> +             pr_debug("sst: GET_VOLUME_PMIC_LEFT_HP_VOL\n");
> +             sc_access.reg_addr = HPLVOL;
> +             mask = (MASK0|MASK1|MASK2|MASK3|MASK4);
> +             break;
> +
>       default:
>               return -EINVAL;
>  
> 
> _______________________________________________
> MeeGo-kernel mailing list
> [email protected]
> http://lists.meego.com/listinfo/meego-kernel

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

Reply via email to