diff options
author | Sitanshu Nanavati <sitanshu.nanavati@intel.com> | 2011-05-03 17:33:01 +0100 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2011-05-10 12:55:56 -0700 |
commit | eb02c700d265b9ae516c1e5facdf4257163ae39d (patch) | |
tree | 561decc9d2b33557a2829113f1e1536b7bfa7444 /drivers/staging/intel_sst/intelmid_msic_control.c | |
parent | 2784a80c97c73cfa1ca80543d7e4dd096637e1af (diff) |
intel_sst: DMIC routing
This patch adds support for configuring and routing the
DMICs (assigned HW route to DMICs)
Signed-off-by: Sitanshu Nanavati <sitanshu.nanavati@intel.com>
Signed-off-by: Ramesh Babu K V <ramesh.babu@intel.com>
Signed-off-by: Alan Cox <alan@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/staging/intel_sst/intelmid_msic_control.c')
-rw-r--r-- | drivers/staging/intel_sst/intelmid_msic_control.c | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/drivers/staging/intel_sst/intelmid_msic_control.c b/drivers/staging/intel_sst/intelmid_msic_control.c index 10073c5b5f64..976091b69965 100644 --- a/drivers/staging/intel_sst/intelmid_msic_control.c +++ b/drivers/staging/intel_sst/intelmid_msic_control.c @@ -29,8 +29,14 @@ #include <linux/pci.h> #include <linux/file.h> #include <linux/delay.h> +#include <sound/control.h> #include "intel_sst.h" +#include <linux/input.h> #include "intelmid_snd_control.h" +#include "intelmid.h" + +#define AUDIOMUX12 0x24c +#define AUDIOMUX34 0x24d static int msic_init_card(void) { @@ -680,6 +686,57 @@ static int msic_set_selected_input_dev(u8 value) return retval; } +static int msic_set_hw_dmic_route(u8 hw_ch_index) +{ + struct sc_reg_access sc_access_router; + int retval = -EINVAL; + + switch (hw_ch_index) { + case HW_CH0: + sc_access_router.reg_addr = AUDIOMUX12; + sc_access_router.value = snd_msic_ops.hw_dmic_map[0]; + sc_access_router.mask = (MASK2 | MASK1 | MASK0); + pr_debug("hw_ch0. value = 0x%x\n", + sc_access_router.value); + retval = sst_sc_reg_access(&sc_access_router, + PMIC_READ_MODIFY, 1); + break; + + case HW_CH1: + sc_access_router.reg_addr = AUDIOMUX12; + sc_access_router.value = (snd_msic_ops.hw_dmic_map[1]) << 4; + sc_access_router.mask = (MASK6 | MASK5 | MASK4); + pr_debug("### hw_ch1. value = 0x%x\n", + sc_access_router.value); + retval = sst_sc_reg_access(&sc_access_router, + PMIC_READ_MODIFY, 1); + break; + + case HW_CH2: + sc_access_router.reg_addr = AUDIOMUX34; + sc_access_router.value = snd_msic_ops.hw_dmic_map[2]; + sc_access_router.mask = (MASK2 | MASK1 | MASK0); + pr_debug("hw_ch2. value = 0x%x\n", + sc_access_router.value); + retval = sst_sc_reg_access(&sc_access_router, + PMIC_READ_MODIFY, 1); + break; + + case HW_CH3: + sc_access_router.reg_addr = AUDIOMUX34; + sc_access_router.value = (snd_msic_ops.hw_dmic_map[3]) << 4; + sc_access_router.mask = (MASK6 | MASK5 | MASK4); + pr_debug("hw_ch3. value = 0x%x\n", + sc_access_router.value); + retval = sst_sc_reg_access(&sc_access_router, + PMIC_READ_MODIFY, 1); + break; + } + + return retval; +} + + static int msic_set_pcm_voice_params(void) { return 0; @@ -724,6 +781,7 @@ struct snd_pmic_ops snd_msic_ops = { .set_input_dev = msic_set_selected_input_dev, .set_output_dev = msic_set_selected_output_dev, .set_lineout_dev = msic_set_selected_lineout_dev, + .set_hw_dmic_route = msic_set_hw_dmic_route, .set_mute = msic_set_mute, .get_mute = msic_get_mute, .set_vol = msic_set_vol, |