diff options
author | Chris Fries <C.Fries@motorola.com> | 2010-10-14 16:31:52 -0500 |
---|---|---|
committer | Iliyan Malchev <malchev@google.com> | 2010-10-16 20:53:07 -0700 |
commit | eee4c1fd23d4642b4d06e68f35f7c6172cd96cb1 (patch) | |
tree | 238ac296355ad9cc5b36a96a63ee03d3781e75f1 /arch/arm/mach-tegra/tegra_i2s_audio.c | |
parent | 810694cfa9c90b1fe4bee572ad11159a43826f23 (diff) |
[ARM] tegra_i2s_audio: add suspend/resume handlers
The resume handler restores i2s state, which gets lost on LP0
Signed-off-by: Iliyan Malchev <malchev@google.com>
Diffstat (limited to 'arch/arm/mach-tegra/tegra_i2s_audio.c')
-rw-r--r-- | arch/arm/mach-tegra/tegra_i2s_audio.c | 49 |
1 files changed, 48 insertions, 1 deletions
diff --git a/arch/arm/mach-tegra/tegra_i2s_audio.c b/arch/arm/mach-tegra/tegra_i2s_audio.c index 48b1bec21f67..47830789a74a 100644 --- a/arch/arm/mach-tegra/tegra_i2s_audio.c +++ b/arch/arm/mach-tegra/tegra_i2s_audio.c @@ -43,7 +43,7 @@ #include <linux/pm_qos_params.h> #include <linux/delay.h> #include <linux/tegra_audio.h> - +#include <linux/pm.h> #include <mach/dma.h> #include <mach/iomap.h> #include <mach/i2s.h> @@ -2380,12 +2380,59 @@ static int tegra_audio_probe(struct platform_device *pdev) return 0; } +#ifdef CONFIG_PM +static int tegra_audio_suspend(struct platform_device *pdev, pm_message_t mesg) +{ + /* dev_info(&pdev->dev, "%s\n", __func__); */ + return 0; +} + +static int tegra_audio_resume(struct platform_device *pdev) +{ + struct tegra_audio_platform_data *pdata = pdev->dev.platform_data; + struct audio_driver_state *state = pdata->driver_data; + + /* dev_info(&pdev->dev, "%s\n", __func__); */ + + if (!state) + return -ENOMEM; + + /* disable interrupts from I2S */ + i2s_fifo_clear(state->i2s_base, I2S_FIFO_TX); + i2s_fifo_clear(state->i2s_base, I2S_FIFO_RX); + i2s_enable_fifos(state->i2s_base, 0); + + i2s_set_left_right_control_polarity(state->i2s_base, 0); /* default */ + + if (state->pdata->master) + i2s_set_channel_bit_count(state->i2s_base, 44100, + state->pdata->i2s_clk_rate); + i2s_set_master(state->i2s_base, state->pdata->master); + + i2s_set_fifo_mode(state->i2s_base, I2S_FIFO_TX, 1); + i2s_set_fifo_mode(state->i2s_base, I2S_FIFO_RX, 0); + + if (state->bit_format == TEGRA_AUDIO_BIT_FORMAT_DSP) + i2s_set_bit_format(state->i2s_base, I2S_BIT_FORMAT_DSP); + else + i2s_set_bit_format(state->i2s_base, state->pdata->mode); + i2s_set_bit_size(state->i2s_base, state->pdata->bit_size); + i2s_set_fifo_format(state->i2s_base, state->pdata->fifo_fmt); + + return 0; +} +#endif /* CONFIG_PM */ + static struct platform_driver tegra_audio_driver = { .driver = { .name = "i2s", .owner = THIS_MODULE, }, .probe = tegra_audio_probe, +#ifdef CONFIG_PM + .suspend = tegra_audio_suspend, + .resume = tegra_audio_resume, +#endif }; static int __init tegra_audio_init(void) |