diff options
author | Vinod G <vinodg@nvidia.com> | 2011-04-28 10:47:57 -0700 |
---|---|---|
committer | Varun Colbert <vcolbert@nvidia.com> | 2011-04-29 18:27:02 -0700 |
commit | 92adadc0c2ade93c3cbd4765cfd12455cf441cf5 (patch) | |
tree | f010b2edeab2d6f719361a44dfcae28a11b9e288 /sound | |
parent | 8f97f5c0af17fc52ca7c502d8ce85bf83a85e107 (diff) |
arm: tegra: fix audio issue
bug 820773
Fix the audio issue resulted from code merge.
Change-Id: I37999fabec7de077eac337db33eb2b01939349fc
Reviewed-on: http://git-master/r/29684
Reviewed-by: Varun Colbert <vcolbert@nvidia.com>
Tested-by: Varun Colbert <vcolbert@nvidia.com>
Diffstat (limited to 'sound')
-rw-r--r-- | sound/soc/tegra/tegra_i2s.c | 18 | ||||
-rw-r--r-- | sound/soc/tegra/tegra_pcm.c | 142 | ||||
-rw-r--r-- | sound/soc/tegra/tegra_soc.h | 36 | ||||
-rw-r--r-- | sound/soc/tegra/tegra_soc_controls.c | 4 | ||||
-rw-r--r-- | sound/soc/tegra/tegra_soc_wm8753.c | 49 | ||||
-rw-r--r-- | sound/soc/tegra/tegra_soc_wm8903.c | 57 | ||||
-rw-r--r-- | sound/soc/tegra/tegra_spdif.c | 15 | ||||
-rw-r--r-- | sound/soc/tegra/tegra_wired_jack.c | 4 |
8 files changed, 128 insertions, 197 deletions
diff --git a/sound/soc/tegra/tegra_i2s.c b/sound/soc/tegra/tegra_i2s.c index 6580ba3e3049..3285d3c7617c 100644 --- a/sound/soc/tegra/tegra_i2s.c +++ b/sound/soc/tegra/tegra_i2s.c @@ -136,23 +136,18 @@ static int tegra_i2s_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct tegra_i2s_info *info = dai->private_data; unsigned int i2s_id = dai->id; int val; - unsigned int sample_size; switch (params_format(params)) { case SNDRV_PCM_FORMAT_S16_LE: val = AUDIO_BIT_SIZE_16; - sample_size = 16; break; case SNDRV_PCM_FORMAT_S24_LE: val = AUDIO_BIT_SIZE_24; - sample_size = 24; break; case SNDRV_PCM_FORMAT_S32_LE: val = AUDIO_BIT_SIZE_32; - sample_size = 32; break; default: return -EINVAL; @@ -187,10 +182,10 @@ static int tegra_i2s_set_dai_fmt(struct snd_soc_dai *cpu_dai, switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { case SND_SOC_DAIFMT_CBS_CFS: - val1 = 1; + info->i2s_master = 1; break; case SND_SOC_DAIFMT_CBM_CFM: - val1 = 0; + info->i2s_master = 0; break; case SND_SOC_DAIFMT_CBS_CFM: case SND_SOC_DAIFMT_CBM_CFS: @@ -199,9 +194,7 @@ static int tegra_i2s_set_dai_fmt(struct snd_soc_dai *cpu_dai, default: return -EINVAL; } - i2s_set_master(i2s_id, val1); - info->i2s_master = val1; - + i2s_set_master(i2s_id, info->i2s_master); val2 = AUDIO_LRCK_LEFT_LOW; @@ -292,12 +285,9 @@ int tegra_i2s_suspend(struct snd_soc_dai *cpu_dai) { struct tegra_i2s_info *info = cpu_dai->private_data; - i2s_clock_enable(cpu_dai->id); - i2s_suspend(cpu_dai->id); tegra_das_get_all_regs(&info->das_regs); - i2s_clock_disable(cpu_dai->id); return 0; } @@ -306,13 +296,11 @@ int tegra_i2s_resume(struct snd_soc_dai *cpu_dai) { struct tegra_i2s_info *info = cpu_dai->private_data; - i2s_clock_enable(cpu_dai->id); tegra_das_set_all_regs(&info->das_regs); i2s_resume(cpu_dai->id); tegra_jack_resume(); - i2s_clock_disable(cpu_dai->id); /* disabled clock as it is being enabled back on startup */ i2s_clock_disable(cpu_dai->id); diff --git a/sound/soc/tegra/tegra_pcm.c b/sound/soc/tegra/tegra_pcm.c index 369e50743ace..e56ee2d8806d 100644 --- a/sound/soc/tegra/tegra_pcm.c +++ b/sound/soc/tegra/tegra_pcm.c @@ -24,48 +24,48 @@ #define PLAYBACK_STARTED true #define PLAYBACK_STOPPED false -static void tegra_pcm_play(struct tegra_runtime_data *prtd) -{ - struct snd_pcm_substream *substream = prtd->substream; - struct snd_pcm_runtime *runtime = substream->runtime; - struct snd_dma_buffer *buf = &substream->dma_buffer; - struct tegra_dma_req *dma_req; - - if (runtime->dma_addr) { - prtd->size = frames_to_bytes(runtime, runtime->period_size); - if (prtd->dma_state != STATE_ABORT) { - prtd->dma_reqid_tail = (prtd->dma_reqid_tail + 1) % DMA_REQ_QCOUNT; - prtd->dma_req[prtd->dma_reqid_tail].source_addr = buf->addr + - frames_to_bytes(runtime,prtd->dma_pos); - prtd->dma_req[prtd->dma_reqid_tail].size = prtd->size; - tegra_dma_enqueue_req(prtd->dma_chan, - &prtd->dma_req[prtd->dma_reqid_tail]); - } - } - - prtd->dma_pos += runtime->period_size; - if (prtd->dma_pos >= runtime->buffer_size) { - prtd->dma_pos = 0; - } - -} +static const struct snd_pcm_hardware tegra_pcm_hardware = { + .info = SNDRV_PCM_INFO_INTERLEAVED | + SNDRV_PCM_INFO_PAUSE | + SNDRV_PCM_INFO_RESUME | + SNDRV_PCM_INFO_MMAP | + SNDRV_PCM_INFO_MMAP_VALID , + .formats = SNDRV_PCM_FMTBIT_S16_LE, + .channels_min = 1, + .channels_max = 2, + .buffer_bytes_max = (PAGE_SIZE * 8), + .period_bytes_min = 128, + .period_bytes_max = (PAGE_SIZE), + .periods_min = 2, + .periods_max = 8, + .fifo_size = 4, +}; -static void tegra_pcm_capture(struct tegra_runtime_data *prtd) +static void tegra_pcm_queue_dma(struct tegra_runtime_data *prtd) { struct snd_pcm_substream *substream = prtd->substream; struct snd_pcm_runtime *runtime = substream->runtime; struct snd_dma_buffer *buf = &substream->dma_buffer; + struct tegra_dma_req *dma_req; if (runtime->dma_addr) { prtd->size = frames_to_bytes(runtime, runtime->period_size); if (prtd->dma_state != STATE_ABORT) { - prtd->dma_reqid_tail = (prtd->dma_reqid_tail + 1) % DMA_REQ_QCOUNT; - prtd->dma_req[prtd->dma_reqid_tail].dest_addr = buf->addr + - frames_to_bytes(runtime,prtd->dma_pos); - prtd->dma_req[prtd->dma_reqid_tail].size = prtd->size; - tegra_dma_enqueue_req(prtd->dma_chan, - &prtd->dma_req[prtd->dma_reqid_tail]); + prtd->dma_tail_idx = (prtd->dma_tail_idx + 1) % + DMA_REQ_QCOUNT; + dma_req = &prtd->dma_req[prtd->dma_tail_idx]; + + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { + dma_req->source_addr = buf->addr + + frames_to_bytes(runtime,prtd->dma_pos); + } else { + dma_req->dest_addr = buf->addr + + frames_to_bytes(runtime,prtd->dma_pos); + } + + dma_req->size = prtd->size; + tegra_dma_enqueue_req(prtd->dma_chan, dma_req); } } @@ -87,31 +87,13 @@ static void dma_complete_callback (struct tegra_dma_req *req) } if (prtd->dma_state != STATE_ABORT) { - prtd->dma_reqid_head = (prtd->dma_reqid_head + 1) % DMA_REQ_QCOUNT; + prtd->dma_head_idx = (prtd->dma_head_idx + 1) % + DMA_REQ_QCOUNT; snd_pcm_period_elapsed(substream); - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - tegra_pcm_play(prtd); - } else { - tegra_pcm_capture(prtd); - } + tegra_pcm_queue_dma(prtd); } } -static const struct snd_pcm_hardware tegra_pcm_hardware = { - .info = SNDRV_PCM_INFO_INTERLEAVED | \ - SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_RESUME | \ - SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_MMAP_VALID , - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .buffer_bytes_max = (PAGE_SIZE * 8), - .period_bytes_min = 128, - .period_bytes_max = (PAGE_SIZE), - .periods_min = 2, - .periods_max = 8, - .fifo_size = 4, -}; - static int tegra_pcm_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { @@ -140,8 +122,8 @@ static int tegra_pcm_prepare(struct snd_pcm_substream *substream) prtd->dma_pos = 0; prtd->period_index = 0; - prtd->dma_reqid_head = 0; - prtd->dma_reqid_tail = DMA_REQ_QCOUNT - 1; + prtd->dma_head_idx = 0; + prtd->dma_tail_idx = DMA_REQ_QCOUNT - 1; return 0; } @@ -155,18 +137,10 @@ static int tegra_pcm_trigger(struct snd_pcm_substream *substream, int cmd) case SNDRV_PCM_TRIGGER_START: case SNDRV_PCM_TRIGGER_RESUME: case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - prtd->state = STATE_INIT; - prtd->dma_state = STATE_INIT; - for (i = 0; i < DMA_REQ_QCOUNT; i++) - tegra_pcm_play(prtd); /* dma enqueue req */ - } else if (prtd->state != STATE_INIT) { - /* start recording */ - prtd->state = STATE_INIT; - prtd->dma_state = STATE_INIT; - for (i = 0; i < DMA_REQ_QCOUNT; i++) - tegra_pcm_capture(prtd); /* dma enqueue req */ - } + + prtd->dma_state = STATE_INIT; + tegra_pcm_queue_dma(prtd); /* dma enqueue req1 */ + tegra_pcm_queue_dma(prtd); /* dma enqueue req2 */ break; case SNDRV_PCM_TRIGGER_STOP: @@ -175,22 +149,13 @@ static int tegra_pcm_trigger(struct snd_pcm_substream *substream, int cmd) prtd->dma_state = STATE_ABORT; tegra_dma_cancel(prtd->dma_chan); - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - if (prtd->dma_chan) { - for (i = 0; i < DMA_REQ_QCOUNT; i++) - tegra_dma_dequeue_req(prtd->dma_chan, - &prtd->dma_req[i]); - prtd->dma_reqid_head = 0; - prtd->dma_reqid_tail = DMA_REQ_QCOUNT - 1; - } - } else { - if (prtd->dma_chan) { - for (i = 0; i < DMA_REQ_QCOUNT; i++) - tegra_dma_dequeue_req(prtd->dma_chan, - &prtd->dma_req[i]); - prtd->dma_reqid_head = 0; - prtd->dma_reqid_tail = DMA_REQ_QCOUNT - 1; - } + + if (prtd->dma_chan) { + for (i = 0; i < DMA_REQ_QCOUNT; i++) + tegra_dma_dequeue_req(prtd->dma_chan, + &prtd->dma_req[i]); + prtd->dma_head_idx = 0; + prtd->dma_tail_idx = DMA_REQ_QCOUNT - 1; } break; @@ -211,8 +176,9 @@ static snd_pcm_uframes_t tegra_pcm_pointer(struct snd_pcm_substream *substream) bytes_to_frames(runtime, tegra_dma_get_transfer_count( prtd->dma_chan, - &prtd->dma_req[prtd->dma_reqid_head], + &prtd->dma_req[prtd->dma_head_idx], false)); + return (size); } @@ -249,7 +215,7 @@ static int tegra_pcm_open(struct snd_pcm_substream *substream) runtime->private_data = prtd; prtd->substream = substream; - prtd->state = STATE_INVALID; + prtd->dma_state = STATE_INVALID; if (strcmp(cpu_dai->name, "tegra-spdif") == 0) { @@ -286,7 +252,7 @@ static int tegra_pcm_open(struct snd_pcm_substream *substream) fail: if (prtd) { - prtd->state = STATE_EXIT; + prtd->dma_state = STATE_EXIT; if (prtd->dma_chan) { tegra_dma_flush(prtd->dma_chan); @@ -324,8 +290,8 @@ static int tegra_pcm_close(struct snd_pcm_substream *substream) tegra_dma_flush(prtd->dma_chan); tegra_dma_free_channel(prtd->dma_chan); prtd->dma_chan = NULL; - prtd->dma_reqid_head = 0; - prtd->dma_reqid_tail = DMA_REQ_QCOUNT - 1; + prtd->dma_head_idx = 0; + prtd->dma_tail_idx = DMA_REQ_QCOUNT - 1; } kfree(prtd); diff --git a/sound/soc/tegra/tegra_soc.h b/sound/soc/tegra/tegra_soc.h index bfaf998f973e..495f5c2b53cc 100644 --- a/sound/soc/tegra/tegra_soc.h +++ b/sound/soc/tegra/tegra_soc.h @@ -71,9 +71,7 @@ #define I2S2_CLK 2000000 #define TEGRA_DEFAULT_SR 44100 -#define TEGRA_SAMPLE_RATES \ - (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \ - SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000) +#define TEGRA_SAMPLE_RATES (SNDRV_PCM_RATE_8000_96000) #define TEGRA_VOICE_SAMPLE_RATES SNDRV_PCM_RATE_8000 #define DMA_STEP_SIZE_MIN 8 @@ -95,12 +93,11 @@ struct tegra_runtime_data { struct snd_pcm_substream *substream; int size; int dma_pos; - struct tegra_dma_req dma_req[DMA_REQ_QCOUNT]; - int dma_reqid_head; - int dma_reqid_tail; - volatile int state; + int dma_tail_idx; + int dma_head_idx; int period_index; int dma_state; + struct tegra_dma_req dma_req[DMA_REQ_QCOUNT]; struct tegra_dma_channel *dma_chan; }; @@ -116,39 +113,26 @@ struct tegra_audio_data { int codec_con; }; -struct wired_jack_conf { - int hp_det_n; - int en_mic_int; - int en_mic_ext; - int cdc_irq; - int en_spkr; - const char *spkr_amp_reg; - struct regulator *amp_reg; - int amp_reg_enabled; -}; - void tegra_ext_control(struct snd_soc_codec *codec, int new_con); int tegra_controls_init(struct snd_soc_codec *codec); int tegra_jack_init(struct snd_soc_codec *codec); void tegra_jack_exit(void); void tegra_jack_resume(void); -void free_i2s_dma_request(struct snd_pcm_substream *substream); -void set_i2s_fifo_attention(struct snd_pcm_substream *substream, - int buffersize); -void free_spdif_dma_request(struct snd_pcm_substream *substream); -void set_spdif_fifo_attention(struct snd_pcm_substream *substream, - int buffersize); - void tegra_switch_set_state(int state); void setup_i2s_dma_request(struct snd_pcm_substream *substream, struct tegra_dma_req *req, void (*dma_callback)(struct tegra_dma_req *req), void *dma_data); +void free_i2s_dma_request(struct snd_pcm_substream *substream); +void set_i2s_fifo_attention(struct snd_pcm_substream *substream, + int buffersize); void setup_spdif_dma_request(struct snd_pcm_substream *substream, struct tegra_dma_req *req, void (*dma_callback)(struct tegra_dma_req *req), void *dma_data); - +void free_spdif_dma_request(struct snd_pcm_substream *substream); +void set_spdif_fifo_attention(struct snd_pcm_substream *substream, + int buffersize); #endif diff --git a/sound/soc/tegra/tegra_soc_controls.c b/sound/soc/tegra/tegra_soc_controls.c index dbb4bdf67aea..c430703f4bd4 100644 --- a/sound/soc/tegra/tegra_soc_controls.c +++ b/sound/soc/tegra/tegra_soc_controls.c @@ -79,7 +79,7 @@ static void tegra_audio_route(struct tegra_audio_data* audio_data, if ((is_call_mode_new != audio_data->is_call_mode) || (is_bt_sco_mode != was_bt_sco_mode)) { -#if defined(CONFIG_ARCH_TEGRA_2x_SOC) + if (is_call_mode_new && is_bt_sco_mode) { tegra_das_set_connection (tegra_das_port_con_id_voicecall_with_bt); @@ -96,7 +96,7 @@ static void tegra_audio_route(struct tegra_audio_data* audio_data, tegra_das_set_connection (tegra_das_port_con_id_hifi); } -#endif + audio_data->is_call_mode = is_call_mode_new; } } diff --git a/sound/soc/tegra/tegra_soc_wm8753.c b/sound/soc/tegra/tegra_soc_wm8753.c index 3456b2541ee8..85647bca9b9e 100644 --- a/sound/soc/tegra/tegra_soc_wm8753.c +++ b/sound/soc/tegra/tegra_soc_wm8753.c @@ -154,13 +154,12 @@ static int tegra_hifi_hw_params(struct snd_pcm_substream *substream, struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; struct snd_soc_codec *codec = codec_dai->codec; - struct tegra_audio_data* audio_data = rtd->socdev->codec_data; - enum dac_dap_data_format data_fmt; int dai_flag = 0, sys_clk; unsigned int value; int err; #ifdef CONFIG_ARCH_TEGRA_2x_SOC + enum dac_dap_data_format data_fmt; if (tegra_das_is_port_master(tegra_audio_codec_type_hifi)) dai_flag |= SND_SOC_DAIFMT_CBM_CFM; else @@ -190,7 +189,7 @@ static int tegra_hifi_hw_params(struct snd_pcm_substream *substream, return err; } - sys_clk = clk_get_rate(audio_data->dap_mclk); + sys_clk = tegra_das_get_mclk_rate(); err = snd_soc_dai_set_sysclk(codec_dai, 0, sys_clk, SND_SOC_CLOCK_IN); if (err < 0) { pr_err("codec_dai clock not set\n"); @@ -322,12 +321,12 @@ static int tegra_voice_hw_params(struct snd_pcm_substream *substream, struct snd_soc_pcm_runtime *rtd = substream->private_data; struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; - struct tegra_audio_data* audio_data = rtd->socdev->codec_data; - enum dac_dap_data_format data_fmt; int dai_flag = 0, sys_clk; int err; #ifdef CONFIG_ARCH_TEGRA_2x_SOC + enum dac_dap_data_format data_fmt; + if (tegra_das_is_port_master(tegra_audio_codec_type_bluetooth)) dai_flag |= SND_SOC_DAIFMT_CBM_CFM; else @@ -356,7 +355,7 @@ static int tegra_voice_hw_params(struct snd_pcm_substream *substream, return err; } - sys_clk = clk_get_rate(audio_data->dap_mclk); + sys_clk = tegra_das_get_mclk_rate(); err = snd_soc_dai_set_sysclk(codec_dai, 0, sys_clk, SND_SOC_CLOCK_IN); if (err < 0) { pr_err("cpu_dai clock not set\n"); @@ -402,20 +401,14 @@ int tegra_soc_suspend_pre(struct platform_device *pdev, pm_message_t state) int tegra_soc_suspend_post(struct platform_device *pdev, pm_message_t state) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct tegra_audio_data* audio_data = socdev->codec_data; - - clk_disable(audio_data->dap_mclk); + tegra_das_disable_mclk(); return 0; } int tegra_soc_resume_pre(struct platform_device *pdev) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct tegra_audio_data* audio_data = socdev->codec_data; - - clk_enable(audio_data->dap_mclk); + tegra_das_enable_mclk(); return 0; } @@ -588,13 +581,20 @@ static int tegra_codec_init(struct snd_soc_codec *codec) unsigned int value; if (!audio_data->init_done) { - audio_data->dap_mclk = tegra_das_get_dap_mclk(); - if (!audio_data->dap_mclk) { - pr_err("Failed to get dap mclk \n"); + + ret = tegra_das_open(); + if (ret) { + pr_err(" Failed get dap mclk \n"); + ret = -ENODEV; + goto wm8753_init_fail; + } + + ret = tegra_das_enable_mclk(); + if (ret) { + pr_err(" Failed to enable dap mclk \n"); ret = -ENODEV; - return ret; + goto wm8753_init_fail; } - clk_enable(audio_data->dap_mclk); /* Add tegra specific widgets */ snd_soc_dapm_new_controls(codec, tegra_dapm_widgets, @@ -608,7 +608,7 @@ static int tegra_codec_init(struct snd_soc_codec *codec) ret = tegra_jack_init(codec); if (ret < 0) { pr_err("Failed in jack init \n"); - return ret; + goto wm8753_init_fail; } /* Default to OFF */ @@ -617,14 +617,15 @@ static int tegra_codec_init(struct snd_soc_codec *codec) ret = tegra_controls_init(codec); if (ret < 0) { pr_err("Failed in controls init \n"); - return ret; + goto wm8753_init_fail; } if (!wm8753_jack) { wm8753_jack = kzalloc(sizeof(*wm8753_jack), GFP_KERNEL); if (!wm8753_jack) { pr_err("failed to allocate wm8753-jack\n"); - return -ENOMEM; + ret = -ENOMEM; + goto wm8753_init_fail; } wm8753_jack->gpio = TEGRA_GPIO_PW3; @@ -691,6 +692,10 @@ gpio_failed: gpio_free(wm8753_jack->gpio); failed: kfree(wm8753_jack); + +wm8753_init_fail: + tegra_das_disable_mclk(); + tegra_das_close(); wm8753_jack = NULL; return ret; } diff --git a/sound/soc/tegra/tegra_soc_wm8903.c b/sound/soc/tegra/tegra_soc_wm8903.c index 883941c119c0..b7ab17e37d66 100644 --- a/sound/soc/tegra/tegra_soc_wm8903.c +++ b/sound/soc/tegra/tegra_soc_wm8903.c @@ -75,12 +75,12 @@ static int tegra_hifi_hw_params(struct snd_pcm_substream *substream, struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; struct snd_soc_codec *codec = codec_dai->codec; - struct tegra_audio_data* audio_data = rtd->socdev->codec_data; - enum dac_dap_data_format data_fmt; int dai_flag = 0, sys_clk; int err; #ifdef CONFIG_ARCH_TEGRA_2x_SOC + enum dac_dap_data_format data_fmt; + if (tegra_das_is_port_master(tegra_audio_codec_type_hifi)) dai_flag |= SND_SOC_DAIFMT_CBM_CFM; else @@ -109,7 +109,9 @@ static int tegra_hifi_hw_params(struct snd_pcm_substream *substream, return err; } - sys_clk = clk_get_rate(audio_data->dap_mclk); + /*FIXME: not sure this is the right way. + This should be samplerate times 256 or 128 based on codec need*/ + sys_clk = tegra_das_get_mclk_rate(); err = snd_soc_dai_set_sysclk(codec_dai, 0, sys_clk, SND_SOC_CLOCK_IN); if (err < 0) { pr_err("codec_dai clock not set\n"); @@ -198,7 +200,6 @@ static int tegra_hifi_hw_params(struct snd_pcm_substream *substream, /* Enable ADC Digital volumes */ VolumeCtrlReg = ADC_DIGITAL_VOL_9DB; - // voulme for single ended mic snd_soc_write(codec, WM8903_ADC_DIGITAL_VOLUME_LEFT, VolumeCtrlReg); snd_soc_write(codec, WM8903_ADC_DIGITAL_VOLUME_RIGHT, @@ -219,12 +220,12 @@ static int tegra_voice_hw_params(struct snd_pcm_substream *substream, struct snd_soc_pcm_runtime *rtd = substream->private_data; struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; - struct tegra_audio_data* audio_data = rtd->socdev->codec_data; - enum dac_dap_data_format data_fmt; int dai_flag = 0, sys_clk; int err; #ifdef CONFIG_ARCH_TEGRA_2x_SOC + enum dac_dap_data_format data_fmt; + if (tegra_das_is_port_master(tegra_audio_codec_type_bluetooth)) dai_flag |= SND_SOC_DAIFMT_CBM_CFM; else @@ -253,7 +254,7 @@ static int tegra_voice_hw_params(struct snd_pcm_substream *substream, return err; } - sys_clk = clk_get_rate(audio_data->dap_mclk); + sys_clk = tegra_das_get_mclk_rate(); err = snd_soc_dai_set_sysclk(codec_dai, 0, sys_clk, SND_SOC_CLOCK_IN); if (err < 0) { pr_err("cpu_dai clock not set\n"); @@ -294,20 +295,14 @@ int tegra_soc_suspend_pre(struct platform_device *pdev, pm_message_t state) int tegra_soc_suspend_post(struct platform_device *pdev, pm_message_t state) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct tegra_audio_data* audio_data = socdev->codec_data; - - clk_disable(audio_data->dap_mclk); + tegra_das_disable_mclk(); return 0; } int tegra_soc_resume_pre(struct platform_device *pdev) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct tegra_audio_data* audio_data = socdev->codec_data; - - clk_enable(audio_data->dap_mclk); + tegra_das_enable_mclk(); return 0; } @@ -482,15 +477,20 @@ static int tegra_codec_init(struct snd_soc_codec *codec) int err = 0; if (!audio_data->init_done) { -#ifdef CONFIG_ARCH_TEGRA_2x_SOC - audio_data->dap_mclk = tegra_das_get_dap_mclk(); - if (!audio_data->dap_mclk) { - pr_err("Failed to get dap mclk \n"); + + err = tegra_das_open(); + if (err) { + pr_err(" Failed get dap mclk \n"); err = -ENODEV; - return err; + goto wm8903_init_fail; + } + + err = tegra_das_enable_mclk(); + if (err) { + pr_err(" Failed to enable dap mclk \n"); + err = -ENODEV; + goto wm8903_init_fail; } - clk_enable(audio_data->dap_mclk); -#endif /* Add tegra specific widgets */ snd_soc_dapm_new_controls(codec, tegra_dapm_widgets, @@ -504,7 +504,7 @@ static int tegra_codec_init(struct snd_soc_codec *codec) err = tegra_jack_init(codec); if (err < 0) { pr_err("Failed in jack init \n"); - return err; + goto wm8903_init_fail; } /* Default to OFF */ @@ -513,7 +513,7 @@ static int tegra_codec_init(struct snd_soc_codec *codec) err = tegra_controls_init(codec); if (err < 0) { pr_err("Failed in controls init \n"); - return err; + goto wm8903_init_fail; } audio_data->codec = codec; @@ -521,6 +521,12 @@ static int tegra_codec_init(struct snd_soc_codec *codec) } return err; + +wm8903_init_fail: + + tegra_das_disable_mclk(); + tegra_das_close(); + return err; } @@ -548,9 +554,6 @@ static struct snd_soc_dai_link tegra_soc_dai[] = { TEGRA_CREATE_SOC_DAI_LINK("Tegra-generic", "Tegra Generic Voice", &tegra_i2s_dai[1], &tegra_generic_codec_dai[1], &tegra_voice_ops), - TEGRA_CREATE_SOC_DAI_LINK("Tegra-spdif", "Tegra Spdif", - &tegra_spdif_dai, &tegra_generic_codec_dai[1], - &tegra_spdif_ops), #else /* FIXME: enabled once these device are enumerated TEGRA_CREATE_SOC_DAI_LINK("Tegra-generic-0", "Tegra BB Voice", diff --git a/sound/soc/tegra/tegra_spdif.c b/sound/soc/tegra/tegra_spdif.c index 7243efd22044..dff38ffe0b72 100644 --- a/sound/soc/tegra/tegra_spdif.c +++ b/sound/soc/tegra/tegra_spdif.c @@ -24,11 +24,8 @@ struct tegra_spdif_info { struct platform_device *pdev; struct tegra_audio_platform_data *pdata; - struct clk *spdif_clk; unsigned long spdif_phys; unsigned long spdif_base; - - int irq; }; void free_spdif_dma_request(struct snd_pcm_substream *substream) @@ -128,7 +125,6 @@ static int tegra_spdif_hw_params(struct snd_pcm_substream *substream, { struct tegra_spdif_info *info = dai->private_data; int val; - unsigned int rate, sample_size; int fifo_mode = AUDIO_RX_MODE; if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) @@ -137,15 +133,12 @@ static int tegra_spdif_hw_params(struct snd_pcm_substream *substream, switch (params_format(params)) { case SNDRV_PCM_FORMAT_S16_LE: val = SPDIF_BIT_MODE_MODE16BIT; - sample_size = 16; break; case SNDRV_PCM_FORMAT_S24_LE: val = SPDIF_BIT_MODE_MODE24BIT; - sample_size = 16; break; case SNDRV_PCM_FORMAT_S32_LE: val = SPDIF_BIT_MODE_MODERAW; - sample_size = 32; break; default: return -EINVAL; @@ -339,14 +332,6 @@ static int tegra_spdif_driver_probe(struct platform_device *pdev) goto fail_release_mem; } - res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); - if (!res) { - dev_err(&pdev->dev, "no irq resource!\n"); - err = -ENODEV; - goto fail_unmap_mem; - } - info->irq = res->start; - sp_prop.clk_rate = info->pdata->dev_clk_rate; spdif_init(info->spdif_base, AUDIO_TX_MODE, &sp_prop); diff --git a/sound/soc/tegra/tegra_wired_jack.c b/sound/soc/tegra/tegra_wired_jack.c index 235f4893add9..1ee029856cb0 100644 --- a/sound/soc/tegra/tegra_wired_jack.c +++ b/sound/soc/tegra/tegra_wired_jack.c @@ -146,9 +146,9 @@ static int tegra_wired_jack_probe(struct platform_device *pdev) int hp_det_n = 0, cdc_irq = 0; int en_mic_int = 0, en_mic_ext = 0; int en_spkr = 0; - struct tegra_wired_jack_conf *pdata; + struct wired_jack_conf *pdata; - pdata = (struct tegra_wired_jack_conf *)pdev->dev.platform_data; + pdata = (struct wired_jack_conf *)pdev->dev.platform_data; if (!pdata || !pdata->hp_det_n #if defined(CONFIG_ARCH_TEGRA_2x_SOC) |