summaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
authorNitin Kumbhar <nkumbhar@nvidia.com>2011-02-04 17:08:18 +0530
committerNitin Kumbhar <nkumbhar@nvidia.com>2011-02-04 17:08:18 +0530
commitb6b1f33f279fcb1c4a751f981153affa6469e94c (patch)
treea77ace4c91f29d814982c40bea8c4a172af9ee3e /arch
parentdf4a2fbff8471de3f75d55b93e2bf94dfd26ff7e (diff)
parenta979d00287bcd3297bd13a59534073e6faa570c9 (diff)
merging android-tegra-2.6.36 into git-master/linux-2.6/android-tegra-2.6.36
Conflicts: arch/arm/mach-tegra/include/mach/dc.h drivers/video/tegra/dc/hdmi.c drivers/video/tegra/host/nvhost_acm.c Change-Id: Iddf74984cc02f08dca3738967c0580ba7c375337
Diffstat (limited to 'arch')
-rw-r--r--arch/arm/kernel/entry-armv.S3
-rw-r--r--arch/arm/mach-tegra/include/mach/dc.h10
-rw-r--r--arch/arm/mach-tegra/tegra_i2s_audio.c37
-rw-r--r--arch/arm/mach-tegra/usb_phy.c11
-rw-r--r--arch/arm/vfp/entry.S3
5 files changed, 43 insertions, 21 deletions
diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S
index e572d24d018d..44cb9db8dd50 100644
--- a/arch/arm/kernel/entry-armv.S
+++ b/arch/arm/kernel/entry-armv.S
@@ -506,8 +506,7 @@ __und_usr:
blo __und_usr_unknown
3: ldrht r0, [r4]
add r2, r2, #2 @ r2 is PC + 2, make it PC + 4
- str r2, [sp, #S_PC] @ it's a 2x16bit instr, update
- orr r0, r0, r5, lsl #16 @ regs->ARM_pc
+ orr r0, r0, r5, lsl #16
#else
b __und_usr_unknown
#endif
diff --git a/arch/arm/mach-tegra/include/mach/dc.h b/arch/arm/mach-tegra/include/mach/dc.h
index b4453f4c2ac3..1dc9c556d6fa 100644
--- a/arch/arm/mach-tegra/include/mach/dc.h
+++ b/arch/arm/mach-tegra/include/mach/dc.h
@@ -38,8 +38,12 @@ struct tegra_dc_mode {
int h_front_porch;
int v_front_porch;
int stereo_mode;
+ u32 flags;
};
+#define TEGRA_DC_MODE_FLAG_NEG_V_SYNC (1 << 0)
+#define TEGRA_DC_MODE_FLAG_NEG_H_SYNC (1 << 1)
+
enum {
TEGRA_DC_OUT_RGB,
TEGRA_DC_OUT_HDMI,
@@ -84,6 +88,9 @@ struct tegra_dc_out {
unsigned depth;
unsigned dither;
+ unsigned height; /* mm */
+ unsigned width; /* mm */
+
struct tegra_dc_mode *modes;
int n_modes;
@@ -214,4 +221,7 @@ int tegra_dc_sync_windows(struct tegra_dc_win *windows[], int n);
int tegra_dc_set_mode(struct tegra_dc *dc, const struct tegra_dc_mode *mode);
+unsigned tegra_dc_get_out_height(struct tegra_dc *dc);
+unsigned tegra_dc_get_out_width(struct tegra_dc *dc);
+
#endif
diff --git a/arch/arm/mach-tegra/tegra_i2s_audio.c b/arch/arm/mach-tegra/tegra_i2s_audio.c
index 45e4cc5ee6f4..1bae833f4f2a 100644
--- a/arch/arm/mach-tegra/tegra_i2s_audio.c
+++ b/arch/arm/mach-tegra/tegra_i2s_audio.c
@@ -611,15 +611,15 @@ static int i2s_configure(struct platform_device *pdev)
static int init_stream_buffer(struct audio_stream *, int);
-static int setup_dma(struct audio_driver_state *);
-static void tear_down_dma(struct audio_driver_state *);
+static int setup_dma(struct audio_driver_state *, int);
+static void tear_down_dma(struct audio_driver_state *, int);
static void stop_dma_playback(struct audio_stream *);
static int start_dma_recording(struct audio_stream *, int);
static void stop_dma_recording(struct audio_stream *);
struct sound_ops {
- int (*setup)(struct audio_driver_state *);
- void (*tear_down)(struct audio_driver_state *);
+ int (*setup)(struct audio_driver_state *, int);
+ void (*tear_down)(struct audio_driver_state *, int);
void (*stop_playback)(struct audio_stream *);
int (*start_recording)(struct audio_stream *, int);
void (*stop_recording)(struct audio_stream *);
@@ -716,12 +716,12 @@ static void setup_dma_tx_request(struct tegra_dma_req *req,
static void setup_dma_rx_request(struct tegra_dma_req *req,
struct audio_stream *ais);
-static int setup_dma(struct audio_driver_state *ads)
+static int setup_dma(struct audio_driver_state *ads, int mask)
{
int rc, i;
pr_info("%s\n", __func__);
- if ((ads->pdata->mask & TEGRA_AUDIO_ENABLE_TX)) {
+ if (mask & TEGRA_AUDIO_ENABLE_TX) {
/* setup audio playback */
for (i = 0; i < ads->out.num_bufs; i++) {
ads->out.buf_phy[i] = dma_map_single(&ads->pdev->dev,
@@ -742,7 +742,7 @@ static int setup_dma(struct audio_driver_state *ads)
}
}
- if ((ads->pdata->mask & TEGRA_AUDIO_ENABLE_RX)) {
+ if (mask & TEGRA_AUDIO_ENABLE_RX) {
/* setup audio recording */
for (i = 0; i < ads->in.num_bufs; i++) {
ads->in.buf_phy[i] = dma_map_single(&ads->pdev->dev,
@@ -766,7 +766,7 @@ static int setup_dma(struct audio_driver_state *ads)
return 0;
fail_rx:
- if (ads->pdata->mask & TEGRA_AUDIO_ENABLE_RX) {
+ if (mask & TEGRA_AUDIO_ENABLE_RX) {
for (i = 0; i < ads->in.num_bufs; i++) {
dma_unmap_single(&ads->pdev->dev, ads->in.buf_phy[i],
1 << PCM_BUFFER_MAX_SIZE_ORDER,
@@ -777,7 +777,7 @@ fail_rx:
ads->in.dma_chan = 0;
}
fail_tx:
- if (ads->pdata->mask & TEGRA_AUDIO_ENABLE_TX) {
+ if (mask & TEGRA_AUDIO_ENABLE_TX) {
for (i = 0; i < ads->out.num_bufs; i++) {
dma_unmap_single(&ads->pdev->dev, ads->out.buf_phy[i],
1 << PCM_BUFFER_MAX_SIZE_ORDER,
@@ -791,12 +791,12 @@ fail_tx:
return rc;
}
-static void tear_down_dma(struct audio_driver_state *ads)
+static void tear_down_dma(struct audio_driver_state *ads, int mask)
{
int i;
pr_info("%s\n", __func__);
- if (ads->pdata->mask & TEGRA_AUDIO_ENABLE_TX) {
+ if (mask & TEGRA_AUDIO_ENABLE_TX) {
tegra_dma_free_channel(ads->out.dma_chan);
for (i = 0; i < ads->out.num_bufs; i++) {
dma_unmap_single(&ads->pdev->dev, ads->out.buf_phy[i],
@@ -807,7 +807,7 @@ static void tear_down_dma(struct audio_driver_state *ads)
}
ads->out.dma_chan = NULL;
- if (ads->pdata->mask & TEGRA_AUDIO_ENABLE_RX) {
+ if (mask & TEGRA_AUDIO_ENABLE_RX) {
tegra_dma_free_channel(ads->in.dma_chan);
for (i = 0; i < ads->in.num_bufs; i++) {
dma_unmap_single(&ads->pdev->dev, ads->in.buf_phy[i],
@@ -1122,7 +1122,9 @@ static long tegra_audio_out_ioctl(struct file *file,
if (rc < 0)
break;
aos->num_bufs = num;
- sound_ops->setup(ads);
+ sound_ops->tear_down(ads, TEGRA_AUDIO_ENABLE_TX);
+ sound_ops->setup(ads, TEGRA_AUDIO_ENABLE_TX);
+ pr_debug("%s: num buf set to %d\n", __func__, num);
}
break;
case TEGRA_AUDIO_OUT_GET_NUM_BUFS:
@@ -1187,9 +1189,9 @@ static long tegra_audio_ioctl(struct file *file,
rc = -EBUSY;
goto done;
}
- sound_ops->tear_down(ads);
+ sound_ops->tear_down(ads, ads->pdata->mask);
i2s_configure(ads->pdev);
- sound_ops->setup(ads);
+ sound_ops->setup(ads, ads->pdata->mask);
}
done:
@@ -1277,7 +1279,8 @@ static long tegra_audio_in_ioctl(struct file *file,
if (rc < 0)
break;
ais->num_bufs = num;
- sound_ops->setup(ads);
+ sound_ops->tear_down(ads, TEGRA_AUDIO_ENABLE_RX);
+ sound_ops->setup(ads, TEGRA_AUDIO_ENABLE_RX);
}
break;
case TEGRA_AUDIO_IN_GET_NUM_BUFS:
@@ -1897,7 +1900,7 @@ static int tegra_audio_probe(struct platform_device *pdev)
if (rc < 0)
return rc;
- sound_ops->setup(state);
+ sound_ops->setup(state, state->pdata->mask);
rc = device_create_file(&pdev->dev, &dev_attr_dma_toggle);
if (rc < 0) {
diff --git a/arch/arm/mach-tegra/usb_phy.c b/arch/arm/mach-tegra/usb_phy.c
index 9030545d4bdc..9e809253170f 100644
--- a/arch/arm/mach-tegra/usb_phy.c
+++ b/arch/arm/mach-tegra/usb_phy.c
@@ -157,7 +157,7 @@
#define UTMIP_PD_CHRG (1 << 0)
#define UTMIP_SPARE_CFG0 0x834
-#define FUSE_SETUP_SEL (1 << 3);
+#define FUSE_SETUP_SEL (1 << 3)
#define UTMIP_XCVR_CFG1 0x838
#define UTMIP_FORCE_PDDISC_POWERDOWN (1 << 0)
@@ -442,6 +442,15 @@ static void utmi_phy_power_on(struct tegra_usb_phy *phy)
val |= UTMIP_BIAS_PDTRK_COUNT(0x5);
writel(val, base + UTMIP_BIAS_CFG1);
+ if (phy->instance == 0) {
+ val = readl(base + UTMIP_SPARE_CFG0);
+ if (phy->mode == TEGRA_USB_PHY_MODE_DEVICE)
+ val &= ~FUSE_SETUP_SEL;
+ else
+ val |= FUSE_SETUP_SEL;
+ writel(val, base + UTMIP_SPARE_CFG0);
+ }
+
if (phy->instance == 2) {
val = readl(base + USB_SUSP_CTRL);
val |= UTMIP_PHY_ENABLE;
diff --git a/arch/arm/vfp/entry.S b/arch/arm/vfp/entry.S
index 4fa9903b83cf..c1a978402583 100644
--- a/arch/arm/vfp/entry.S
+++ b/arch/arm/vfp/entry.S
@@ -10,7 +10,7 @@
*
* Basic entry code, called from the kernel's undefined instruction trap.
* r0 = faulted instruction
- * r5 = faulted PC+4
+ * r2 = faulted PC+4
* r9 = successful return
* r10 = thread_info structure
* lr = failure return
@@ -26,6 +26,7 @@ ENTRY(do_vfp)
str r11, [r10, #TI_PREEMPT]
#endif
enable_irq
+ str r2, [sp, #S_PC] @ update regs->ARM_pc for Thumb 2 case
ldr r4, .LCvfp
ldr r11, [r10, #TI_CPU] @ CPU number
add r10, r10, #TI_VFPSTATE @ r10 = workspace