summaryrefslogtreecommitdiff
path: root/arch/arm/mach-tegra/dam.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/mach-tegra/dam.c')
-rw-r--r--arch/arm/mach-tegra/dam.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/arch/arm/mach-tegra/dam.c b/arch/arm/mach-tegra/dam.c
index 1edc25941a83..3f335372018e 100644
--- a/arch/arm/mach-tegra/dam.c
+++ b/arch/arm/mach-tegra/dam.c
@@ -40,7 +40,7 @@ struct dam_context {
bool ch_alloc[DAM_NUM_INPUT_CHANNELS];
bool ch_inuse[DAM_NUM_INPUT_CHANNELS];
int ch_insamplerate[DAM_NUM_INPUT_CHANNELS];
- int ctrlreg_cache[DAM_CTRL_REGINDEX];
+ int ctrlreg_cache[DAM_CTRL_REGINDEX + 1];
struct clk *dam_clk;
int clk_refcnt;
int dma_ch[dam_ch_maxnum];
@@ -98,7 +98,9 @@ void dam_ch1_set_gain(int ifc,int gain);
static inline void dam_writel(int ifc, u32 val, u32 reg)
{
+ struct dam_context *ch = &dam_cont_info[ifc];
__raw_writel(val, dam_base[ifc] + reg);
+ ch->ctrlreg_cache[(reg >> 2)] = val;
DAM_DEBUG_PRINT("dam write 0x%p: %08x\n", dam_base[ifc] + reg, val);
}
@@ -394,7 +396,6 @@ int dam_suspend(int ifc)
ch = &dam_cont_info[ifc];
dam_save_ctrl_registers(ifc);
- dam_disable_clock(ifc);
return 0;
}
@@ -404,7 +405,6 @@ int dam_resume(int ifc)
struct dam_context *ch;
ch = &dam_cont_info[ifc];
- dam_enable_clock(ifc);
dam_restore_ctrl_registers(ifc);
return 0;
@@ -438,6 +438,7 @@ void dam_disable_clock(int ifc)
ch->clk_refcnt--;
if ((ch->clk_refcnt == 0) &&
(ch->dam_clk)) {
+ dam_suspend(ifc);
clk_disable(ch->dam_clk);
}
}
@@ -463,6 +464,7 @@ int dam_enable_clock(int ifc)
err = PTR_ERR(ch->dam_clk);
goto fail_dam_clock;
}
+ dam_resume(ifc);
}
ch->clk_refcnt++;
@@ -480,20 +482,26 @@ EXPORT_SYMBOL(dam_enable_clock);
int dam_set_acif(int ifc, int chtype, struct audio_cif *cifInfo)
{
+ struct dam_context *ch;
unsigned int reg_addr = (unsigned int)dam_base[ifc];
+ unsigned int reg_index = 0;
bool found = true;
+ ch = &dam_cont_info[ifc];
switch (chtype) {
case dam_ch_out:
reg_addr += DAM_AUDIOCIF_OUT_CTRL_0;
+ reg_index = (DAM_AUDIOCIF_OUT_CTRL_0 >> 2);
break;
case dam_ch_in0:
/*always Mono channel*/
cifInfo->client_channels = AUDIO_CHANNEL_1;
reg_addr += DAM_AUDIOCIF_CH0_CTRL_0;
+ reg_index = (DAM_AUDIOCIF_CH0_CTRL_0 >> 2);
break;
case dam_ch_in1:
reg_addr += DAM_AUDIOCIF_CH1_CTRL_0;
+ reg_index = (DAM_AUDIOCIF_CH1_CTRL_0 >> 2);
break;
default:
found = false;
@@ -501,7 +509,8 @@ int dam_set_acif(int ifc, int chtype, struct audio_cif *cifInfo)
}
if (found == true)
- audio_switch_set_acif(reg_addr, cifInfo);
+ ch->ctrlreg_cache[reg_index] =
+ audio_switch_set_acif(reg_addr, cifInfo);
return 0;
}