summaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
authorSumit Bhattacharya <sumitb@nvidia.com>2011-02-21 16:05:21 +0530
committerVarun Colbert <vcolbert@nvidia.com>2011-02-22 18:09:04 -0800
commite74baeb904c579cc8fff2d7fa12cd4a6d83a2708 (patch)
treec4e4f6073eb6f2fcfd993e85a87dea1f24d895a3 /arch
parent98d54eb3423b961039d7db01889f5c57d9128d76 (diff)
[ARM] tegra: i2s and das suspend/resume
Add APIs in das driver to get and set das register values. ALSA driver will be using these APIs to cache das register values during system suspend resume. In i2s register get/set APIs caching few more registers. Bug 789967 Bug 792879 Change-Id: Iaa4487cb003d2f75d5c54f450f17833c7af96cf2 Reviewed-on: http://git-master/r/20291 Tested-by: Sumit Bhattacharya <sumitb@nvidia.com> Reviewed-by: Vijay Mali <vmali@nvidia.com> Reviewed-by: Ravindra Lokhande <rlokhande@nvidia.com> Reviewed-by: Bharat Nihalani <bnihalani@nvidia.com> Reviewed-by: Scott Peterson <speterson@nvidia.com>
Diffstat (limited to 'arch')
-rw-r--r--arch/arm/mach-tegra/include/mach/tegra2_i2s.h4
-rw-r--r--arch/arm/mach-tegra/include/mach/tegra_das.h20
-rw-r--r--arch/arm/mach-tegra/tegra2_i2s.c8
-rw-r--r--arch/arm/mach-tegra/tegra_das.c37
4 files changed, 68 insertions, 1 deletions
diff --git a/arch/arm/mach-tegra/include/mach/tegra2_i2s.h b/arch/arm/mach-tegra/include/mach/tegra2_i2s.h
index 46846c1ef834..12a757139af7 100644
--- a/arch/arm/mach-tegra/include/mach/tegra2_i2s.h
+++ b/arch/arm/mach-tegra/include/mach/tegra2_i2s.h
@@ -265,6 +265,10 @@ struct i2s_runtime_data {
int i2s_status_0;
int i2s_timing_0;
int i2s__fifo_scr_0;
+ int i2s_pcm_ctrl_0;
+ int i2s_nw_ctrl_0;
+ int i2s_tdm_ctrl_0;
+ int i2s_tdm_tx_rx_ctrl_0;
int i2s_fifo1_0;
int i2s_fifo2_0;
};
diff --git a/arch/arm/mach-tegra/include/mach/tegra_das.h b/arch/arm/mach-tegra/include/mach/tegra_das.h
index e3e29b044f8d..cba71ff38e18 100644
--- a/arch/arm/mach-tegra/include/mach/tegra_das.h
+++ b/arch/arm/mach-tegra/include/mach/tegra_das.h
@@ -204,6 +204,17 @@ struct tegra_das_mux_select {
u32 mux_value;
};
+struct das_regs_cache {
+ u32 das_dap_ctrl_0;
+ u32 das_dap_ctrl_1;
+ u32 das_dap_ctrl_2;
+ u32 das_dap_ctrl_3;
+ u32 das_dap_ctrl_4;
+ u32 das_dac_input_data_clk_0;
+ u32 das_dac_input_data_clk_1;
+ u32 das_dac_input_data_clk_2;
+};
+
int tegra_das_open(void);
@@ -227,5 +238,14 @@ int tegra_das_get_connection(void);
*/
int tegra_das_power_mode(bool is_normal);
+/*
+ * Function to get the content of all the das registers
+ */
+void tegra_das_get_all_regs(struct das_regs_cache* regs);
+
+/*
+ * Function to set values in all the das registers
+ */
+void tegra_das_set_all_regs(struct das_regs_cache* regs);
#endif
diff --git a/arch/arm/mach-tegra/tegra2_i2s.c b/arch/arm/mach-tegra/tegra2_i2s.c
index de50df917048..7147b0b38efb 100644
--- a/arch/arm/mach-tegra/tegra2_i2s.c
+++ b/arch/arm/mach-tegra/tegra2_i2s.c
@@ -78,6 +78,10 @@ void i2s_get_all_regs(int ifc, struct i2s_runtime_data* ird)
ird->i2s_status_0 = i2s_readl(ifc, I2S_I2S_STATUS_0);
ird->i2s_timing_0 = i2s_readl(ifc, I2S_I2S_TIMING_0);
ird->i2s__fifo_scr_0 = i2s_readl(ifc, I2S_I2S_FIFO_SCR_0);
+ ird->i2s_pcm_ctrl_0 = i2s_readl(ifc, I2S_I2S_PCM_CTRL_0);
+ ird->i2s_nw_ctrl_0 = i2s_readl(ifc, I2S_I2S_NW_CTRL_0);
+ ird->i2s_tdm_ctrl_0 = i2s_readl(ifc, I2S_I2S_TDM_CTRL_0);
+ ird->i2s_tdm_tx_rx_ctrl_0 = i2s_readl(ifc, I2S_I2S_TDM_TX_RX_CTRL_0);
ird->i2s_fifo1_0 = i2s_readl(ifc, I2S_I2S_FIFO1_0);
ird->i2s_fifo2_0 = i2s_readl(ifc, I2S_I2S_FIFO2_0);
}
@@ -89,6 +93,10 @@ void i2s_set_all_regs(int ifc, struct i2s_runtime_data* ird)
i2s_writel(ifc, ird->i2s_status_0, I2S_I2S_STATUS_0);
i2s_writel(ifc, ird->i2s_timing_0, I2S_I2S_TIMING_0);
i2s_writel(ifc, ird->i2s__fifo_scr_0, I2S_I2S_FIFO_SCR_0);
+ i2s_writel(ifc, ird->i2s_pcm_ctrl_0, I2S_I2S_PCM_CTRL_0);
+ i2s_writel(ifc, ird->i2s_nw_ctrl_0, I2S_I2S_NW_CTRL_0);
+ i2s_writel(ifc, ird->i2s_tdm_ctrl_0, I2S_I2S_TDM_CTRL_0);
+ i2s_writel(ifc, ird->i2s_tdm_tx_rx_ctrl_0, I2S_I2S_TDM_TX_RX_CTRL_0);
i2s_writel(ifc, ird->i2s_fifo1_0, I2S_I2S_FIFO1_0);
i2s_writel(ifc, ird->i2s_fifo2_0, I2S_I2S_FIFO2_0);
}
diff --git a/arch/arm/mach-tegra/tegra_das.c b/arch/arm/mach-tegra/tegra_das.c
index 601759c10b29..66dfc1da7597 100644
--- a/arch/arm/mach-tegra/tegra_das.c
+++ b/arch/arm/mach-tegra/tegra_das.c
@@ -502,6 +502,41 @@ static int __init tegra_das_init(void)
{
return platform_driver_register(&tegra_das_driver);
}
-
module_init(tegra_das_init);
+
+void tegra_das_get_all_regs(struct das_regs_cache* regs)
+{
+ unsigned long reg_base = das_drv_data->das_base;
+
+ regs->das_dap_ctrl_0 = das_readl(reg_base, APB_MISC_DAS_DAP_CTRL_SEL_0);
+ regs->das_dap_ctrl_1 = das_readl(reg_base, APB_MISC_DAS_DAP_CTRL_SEL_1);
+ regs->das_dap_ctrl_2 = das_readl(reg_base, APB_MISC_DAS_DAP_CTRL_SEL_2);
+ regs->das_dap_ctrl_3 = das_readl(reg_base, APB_MISC_DAS_DAP_CTRL_SEL_3);
+ regs->das_dap_ctrl_4 = das_readl(reg_base, APB_MISC_DAS_DAP_CTRL_SEL_4);
+ regs->das_dac_input_data_clk_0 = das_readl(reg_base,
+ APB_MISC_DAS_DAC_INPUT_DATA_CLK_SEL_0);
+ regs->das_dac_input_data_clk_1 = das_readl(reg_base,
+ APB_MISC_DAS_DAC_INPUT_DATA_CLK_SEL_1);
+ regs->das_dac_input_data_clk_2 = das_readl(reg_base,
+ APB_MISC_DAS_DAC_INPUT_DATA_CLK_SEL_2);
+}
+EXPORT_SYMBOL_GPL(tegra_das_get_all_regs);
+
+void tegra_das_set_all_regs(struct das_regs_cache* regs)
+{
+ unsigned long reg_base = das_drv_data->das_base;
+
+ das_writel(reg_base, regs->das_dap_ctrl_0, APB_MISC_DAS_DAP_CTRL_SEL_0);
+ das_writel(reg_base, regs->das_dap_ctrl_1, APB_MISC_DAS_DAP_CTRL_SEL_1);
+ das_writel(reg_base, regs->das_dap_ctrl_2, APB_MISC_DAS_DAP_CTRL_SEL_2);
+ das_writel(reg_base, regs->das_dap_ctrl_3, APB_MISC_DAS_DAP_CTRL_SEL_3);
+ das_writel(reg_base, regs->das_dap_ctrl_4, APB_MISC_DAS_DAP_CTRL_SEL_4);
+ das_writel(reg_base, regs->das_dac_input_data_clk_0,
+ APB_MISC_DAS_DAC_INPUT_DATA_CLK_SEL_0);
+ das_writel(reg_base, regs->das_dac_input_data_clk_1,
+ APB_MISC_DAS_DAC_INPUT_DATA_CLK_SEL_1);
+ das_writel(reg_base, regs->das_dac_input_data_clk_2,
+ APB_MISC_DAS_DAC_INPUT_DATA_CLK_SEL_2);
+}
+EXPORT_SYMBOL_GPL(tegra_das_set_all_regs);
MODULE_LICENSE("GPL");