Merge branch 'linux-tegra-2.6.36' into android-tegra-2.6.36
authorColin Cross <ccross@android.com>
Wed, 20 Oct 2010 21:39:20 +0000 (14:39 -0700)
committerColin Cross <ccross@android.com>
Wed, 20 Oct 2010 21:39:20 +0000 (14:39 -0700)
Conflicts:
arch/arm/mach-tegra/tegra_i2s_audio.c

Change-Id: I3e05a70e3fb8fdaa8ca4c5ed78ca020c75ed0caa

1  2 
arch/arm/mach-tegra/tegra_i2s_audio.c

index 03ef3c3551b804880afcba72acf5dc4c576f9dba,bca3828f3c6a012eb0c8d6a197c226ce72578478..277532c2270050e807eb3c937156ee178213f8a0
@@@ -2301,88 -2383,86 +2392,98 @@@ static int tegra_audio_probe(struct pla
        i2s_set_bit_size(state->i2s_base, state->pdata->bit_size);
        i2s_set_fifo_format(state->i2s_base, state->pdata->fifo_fmt);
  
-       state->out.opened = 0;
-       state->out.active = false;
-       mutex_init(&state->out.lock);
-       init_completion(&state->out.fifo_completion);
-       init_completion(&state->out.stop_completion);
-       spin_lock_init(&state->out.dma_req_lock);
-       state->out.buf_phys = 0;
-       state->out.dma_chan = NULL;
-       state->out.dma_has_it = false;
-       state->in.opened = 0;
-       state->in.active = false;
-       mutex_init(&state->in.lock);
-       init_completion(&state->in.fifo_completion);
-       init_completion(&state->in.stop_completion);
-       spin_lock_init(&state->in.dma_req_lock);
-       state->in.buf_phys = 0;
-       state->in.dma_chan = NULL;
-       state->in.dma_has_it = false;
-       state->out.buffer = 0;
-       state->out.buf_config.size = PCM_BUFFER_MAX_SIZE_ORDER;
-       state->out.buf_config.threshold = PCM_BUFFER_THRESHOLD_ORDER;
-       state->out.buf_config.chunk = PCM_BUFFER_DMA_CHUNK_SIZE_ORDER;
-       rc = init_stream_buffer(&state->out, &state->out.buf_config, 0);
-       if (rc < 0)
-               return rc;
-       state->in.buffer = 0;
-       state->in.buf_config.size = PCM_BUFFER_MAX_SIZE_ORDER;
-       state->in.buf_config.threshold = PCM_BUFFER_THRESHOLD_ORDER;
-       state->in.buf_config.chunk = PCM_BUFFER_DMA_CHUNK_SIZE_ORDER;
-       rc = init_stream_buffer(&state->in, &state->in.buf_config,
-                       PCM_IN_BUFFER_PADDING);
-       if (rc < 0)
-               return rc;
+       if ((state->pdata->mask & TEGRA_AUDIO_ENABLE_TX)) {
+               state->out.opened = 0;
+               state->out.active = false;
+               mutex_init(&state->out.lock);
+               init_completion(&state->out.fifo_completion);
+               init_completion(&state->out.stop_completion);
+               spin_lock_init(&state->out.dma_req_lock);
+               state->out.buf_phys = 0;
+               state->out.dma_chan = NULL;
+               state->out.dma_has_it = false;
+               state->out.i2s_fifo_atn_level = I2S_FIFO_ATN_LVL_FOUR_SLOTS;
+               state->out.buffer = 0;
+               state->out.buf_config.size = PCM_BUFFER_MAX_SIZE_ORDER;
+               state->out.buf_config.threshold = PCM_BUFFER_THRESHOLD_ORDER;
+               state->out.buf_config.chunk = PCM_BUFFER_DMA_CHUNK_SIZE_ORDER;
+               rc = init_stream_buffer(&state->out, &state->out.buf_config, 0);
+               if (rc < 0)
+                       return rc;
  
-       pm_qos_add_request(&state->in.pm_qos, PM_QOS_CPU_DMA_LATENCY,
-                               PM_QOS_DEFAULT_VALUE);
-       pm_qos_add_request(&state->out.pm_qos, PM_QOS_CPU_DMA_LATENCY,
+               pm_qos_add_request(&state->out.pm_qos, PM_QOS_CPU_DMA_LATENCY,
                                PM_QOS_DEFAULT_VALUE);
  
-       snprintf(state->in.wake_lock_name, sizeof(state->in.wake_lock_name),
-               "i2s.%d-audio-in", state->pdev->id);
-       wake_lock_init(&state->in.wake_lock, WAKE_LOCK_SUSPEND,
-                       state->in.wake_lock_name);
-       snprintf(state->out.wake_lock_name, sizeof(state->out.wake_lock_name),
-               "i2s.%d-audio-out", state->pdev->id);
-       wake_lock_init(&state->out.wake_lock, WAKE_LOCK_SUSPEND,
++              snprintf(state->out.wake_lock_name,
++                      sizeof(state->out.wake_lock_name),
++                      "i2s.%d-audio-out", state->pdev->id);
++              wake_lock_init(&state->out.wake_lock, WAKE_LOCK_SUSPEND,
 +                      state->out.wake_lock_name);
 +
-       if (request_irq(state->irq, i2s_interrupt,
-                       IRQF_DISABLED, state->pdev->name, state) < 0) {
-               dev_err(&pdev->dev,
-                       "%s: could not register handler for irq %d\n",
-                       __func__, state->irq);
-               return -EIO;
-       }
-       rc = setup_misc_device(&state->misc_out,
+               rc = setup_misc_device(&state->misc_out,
                        &tegra_audio_out_fops,
                        "audio%d_out", state->pdev->id);
-       if (rc < 0)
-               return rc;
+               if (rc < 0)
+                       return rc;
  
-       rc = setup_misc_device(&state->misc_out_ctl,
-                       &tegra_audio_out_ctl_fops,
-                       "audio%d_out_ctl", state->pdev->id);
-       if (rc < 0)
-               return rc;
+               rc = setup_misc_device(&state->misc_out_ctl,
+                               &tegra_audio_out_ctl_fops,
+                               "audio%d_out_ctl", state->pdev->id);
+               if (rc < 0)
+                       return rc;
+       }
+       if ((state->pdata->mask & TEGRA_AUDIO_ENABLE_RX)) {
+               state->in.opened = 0;
+               state->in.active = false;
+               mutex_init(&state->in.lock);
+               init_completion(&state->in.fifo_completion);
+               init_completion(&state->in.stop_completion);
+               spin_lock_init(&state->in.dma_req_lock);
+               state->in.buf_phys = 0;
+               state->in.dma_chan = NULL;
+               state->in.dma_has_it = false;
+               state->in.i2s_fifo_atn_level = I2S_FIFO_ATN_LVL_FOUR_SLOTS;
+               state->in.buffer = 0;
+               state->in.buf_config.size = PCM_BUFFER_MAX_SIZE_ORDER;
+               state->in.buf_config.threshold = PCM_BUFFER_THRESHOLD_ORDER;
+               state->in.buf_config.chunk = PCM_BUFFER_DMA_CHUNK_SIZE_ORDER;
+               rc = init_stream_buffer(&state->in, &state->in.buf_config,
+                               PCM_IN_BUFFER_PADDING);
+               if (rc < 0)
+                       return rc;
  
-       rc = setup_misc_device(&state->misc_in,
+               pm_qos_add_request(&state->in.pm_qos, PM_QOS_CPU_DMA_LATENCY,
+                                       PM_QOS_DEFAULT_VALUE);
++              snprintf(state->in.wake_lock_name,
++                      sizeof(state->in.wake_lock_name),
++                      "i2s.%d-audio-in", state->pdev->id);
++              wake_lock_init(&state->in.wake_lock, WAKE_LOCK_SUSPEND,
++                      state->in.wake_lock_name);
++
+               rc = setup_misc_device(&state->misc_in,
                        &tegra_audio_in_fops,
                        "audio%d_in", state->pdev->id);
-       if (rc < 0)
-               return rc;
+               if (rc < 0)
+                       return rc;
  
-       rc = setup_misc_device(&state->misc_in_ctl,
+               rc = setup_misc_device(&state->misc_in_ctl,
                        &tegra_audio_in_ctl_fops,
                        "audio%d_in_ctl", state->pdev->id);
-       if (rc < 0)
-               return rc;
+               if (rc < 0)
+                       return rc;
+       }
+       if (request_irq(state->irq, i2s_interrupt,
+                       IRQF_DISABLED, state->pdev->name, state) < 0) {
+               dev_err(&pdev->dev,
+                       "%s: could not register handler for irq %d\n",
+                       __func__, state->irq);
+               return -EIO;
+       }
  
        rc = setup_misc_device(&state->misc_ctl,
                        &tegra_audio_ctl_fops,