summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNitin Kumbhar <nkumbhar@nvidia.com>2011-01-28 13:39:17 +0530
committerNitin Kumbhar <nkumbhar@nvidia.com>2011-01-28 13:39:17 +0530
commit8197cb15eaf0640d13c816926f65972ca6cbba84 (patch)
tree17b034f1f03a3d1b7776001cb63bdfd186415130
parent7cc7de288765bc634a0374e660de01a3fd4e8e39 (diff)
parent22b3c9ca22924cf7015ecadf7ce111cf402a707b (diff)
merging android-tegra-2.6.36 into git-master/linux-2.6/android-tegra-2.6.36
Conflicts: arch/arm/mach-tegra/tegra2_dvfs.c Change-Id: I3853d668107c191c94f731256a8d0b63149e8279
-rw-r--r--arch/arm/mach-tegra/include/mach/entry-macro.S2
-rw-r--r--arch/arm/mach-tegra/include/mach/io.h22
-rw-r--r--arch/arm/mach-tegra/io.c32
-rw-r--r--arch/arm/mach-tegra/tegra2_clocks.c4
-rw-r--r--drivers/base/power/main.c15
-rw-r--r--drivers/input/evdev.c1
-rw-r--r--drivers/input/keyreset.c2
-rw-r--r--drivers/usb/gadget/fsl_tegra_udc.c19
-rw-r--r--drivers/usb/host/ehci-tegra.c19
9 files changed, 109 insertions, 7 deletions
diff --git a/arch/arm/mach-tegra/include/mach/entry-macro.S b/arch/arm/mach-tegra/include/mach/entry-macro.S
index 2ba9e5c9d2f6..17a42dac3b01 100644
--- a/arch/arm/mach-tegra/include/mach/entry-macro.S
+++ b/arch/arm/mach-tegra/include/mach/entry-macro.S
@@ -20,7 +20,7 @@
#include <asm/hardware/gic.h>
/* Uses the GIC interrupt controller built into the cpu */
-#define ICTRL_BASE (IO_CPU_VIRT + 0x100)
+#define ICTRL_BASE (IO_CPU_VIRT + 0x40100)
.macro disable_fiq
.endm
diff --git a/arch/arm/mach-tegra/include/mach/io.h b/arch/arm/mach-tegra/include/mach/io.h
index 16f16189b5eb..9a7f8b93ea10 100644
--- a/arch/arm/mach-tegra/include/mach/io.h
+++ b/arch/arm/mach-tegra/include/mach/io.h
@@ -37,9 +37,9 @@
#define IO_IRAM_VIRT 0xFE400000
#define IO_IRAM_SIZE SZ_256K
-#define IO_CPU_PHYS 0x50040000
+#define IO_CPU_PHYS 0x50000000
#define IO_CPU_VIRT 0xFE000000
-#define IO_CPU_SIZE SZ_16K
+#define IO_CPU_SIZE SZ_1M
#define IO_PPSB_PHYS 0x60000000
#define IO_PPSB_VIRT 0xFE200000
@@ -49,6 +49,18 @@
#define IO_APB_VIRT 0xFE300000
#define IO_APB_SIZE SZ_1M
+#define IO_USB_PHYS 0xC5000000
+#define IO_USB_VIRT 0xFE500000
+#define IO_USB_SIZE SZ_1M
+
+#define IO_SDMMC_PHYS 0xC8000000
+#define IO_SDMMC_VIRT 0xFE600000
+#define IO_SDMMC_SIZE SZ_1M
+
+#define IO_HOST1X_PHYS 0x54000000
+#define IO_HOST1X_VIRT 0xFE700000
+#define IO_HOST1X_SIZE SZ_4M
+
#define IO_TO_VIRT_BETWEEN(p, st, sz) ((p) >= (st) && (p) < ((st) + (sz)))
#define IO_TO_VIRT_XLATE(p, pst, vst) (((p) - (pst) + (vst)))
@@ -61,6 +73,12 @@
IO_TO_VIRT_XLATE((n), IO_CPU_PHYS, IO_CPU_VIRT) : \
IO_TO_VIRT_BETWEEN((n), IO_IRAM_PHYS, IO_IRAM_SIZE) ? \
IO_TO_VIRT_XLATE((n), IO_IRAM_PHYS, IO_IRAM_VIRT) : \
+ IO_TO_VIRT_BETWEEN((n), IO_HOST1X_PHYS, IO_HOST1X_SIZE) ? \
+ IO_TO_VIRT_XLATE((n), IO_HOST1X_PHYS, IO_HOST1X_VIRT) : \
+ IO_TO_VIRT_BETWEEN((n), IO_USB_PHYS, IO_USB_SIZE) ? \
+ IO_TO_VIRT_XLATE((n), IO_USB_PHYS, IO_USB_VIRT) : \
+ IO_TO_VIRT_BETWEEN((n), IO_SDMMC_PHYS, IO_SDMMC_SIZE) ? \
+ IO_TO_VIRT_XLATE((n), IO_SDMMC_PHYS, IO_SDMMC_VIRT) : \
0)
#ifndef __ASSEMBLER__
diff --git a/arch/arm/mach-tegra/io.c b/arch/arm/mach-tegra/io.c
index 31848a9592f8..a1674da7dd81 100644
--- a/arch/arm/mach-tegra/io.c
+++ b/arch/arm/mach-tegra/io.c
@@ -55,6 +55,24 @@ static struct map_desc tegra_io_desc[] __initdata = {
.length = IO_IRAM_SIZE,
.type = MT_DEVICE,
},
+ {
+ .virtual = IO_HOST1X_VIRT,
+ .pfn = __phys_to_pfn(IO_HOST1X_PHYS),
+ .length = IO_HOST1X_SIZE,
+ .type = MT_DEVICE,
+ },
+ {
+ .virtual = IO_USB_VIRT,
+ .pfn = __phys_to_pfn(IO_USB_PHYS),
+ .length = IO_USB_SIZE,
+ .type = MT_DEVICE,
+ },
+ {
+ .virtual = IO_SDMMC_VIRT,
+ .pfn = __phys_to_pfn(IO_SDMMC_PHYS),
+ .length = IO_SDMMC_SIZE,
+ .type = MT_DEVICE,
+ },
};
void __init tegra_map_common_io(void)
@@ -68,8 +86,20 @@ void __init tegra_map_common_io(void)
void __iomem *tegra_ioremap(unsigned long p, size_t size, unsigned int type)
{
void __iomem *v = IO_ADDRESS(p);
- if (v == NULL)
+
+ /*
+ * __arm_ioremap fails to set the domain of ioremapped memory
+ * correctly, only use it on physical memory.
+ */
+ if (v == NULL && p < SZ_1G)
v = __arm_ioremap(p, size, type);
+
+ /*
+ * If the physical address was not physical memory or statically
+ * mapped, there's nothing we can do to map it safely.
+ */
+ BUG_ON(v == NULL);
+
return v;
}
EXPORT_SYMBOL(tegra_ioremap);
diff --git a/arch/arm/mach-tegra/tegra2_clocks.c b/arch/arm/mach-tegra/tegra2_clocks.c
index 5d566444b77a..d657ef0792c5 100644
--- a/arch/arm/mach-tegra/tegra2_clocks.c
+++ b/arch/arm/mach-tegra/tegra2_clocks.c
@@ -2026,6 +2026,10 @@ struct clk tegra_list_clks[] = {
SHARED_CLK("disp2.emc", "tegradc.1", "emc", &tegra_clk_emc),
SHARED_CLK("hdmi.emc", "hdmi", "emc", &tegra_clk_emc),
SHARED_CLK("host.emc", "tegra_grhost", "emc", &tegra_clk_emc),
+ SHARED_CLK("usbd.emc", "fsl-tegra-udc", "emc", &tegra_clk_emc),
+ SHARED_CLK("usb1.emc", "tegra-ehci.0", "emc", &tegra_clk_emc),
+ SHARED_CLK("usb2.emc", "tegra-ehci.1", "emc", &tegra_clk_emc),
+ SHARED_CLK("usb3.emc", "tegra-ehci.2", "emc", &tegra_clk_emc),
};
#define CLK_DUPLICATE(_name, _dev, _con) \
diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c
index 4a57ecc4ead9..33f9aafb47fb 100644
--- a/drivers/base/power/main.c
+++ b/drivers/base/power/main.c
@@ -48,6 +48,10 @@ static pm_message_t pm_transition;
static void dpm_drv_timeout(unsigned long data);
static DEFINE_TIMER(dpm_drv_wd, dpm_drv_timeout, 0, 0);
+static struct {
+ struct device *dev;
+ struct task_struct *tsk;
+} dpm_drv_wd_data;
/*
* Set once the preparation of devices for a PM transition has started, reset
@@ -601,10 +605,15 @@ static bool is_async(struct device *dev)
*/
static void dpm_drv_timeout(unsigned long data)
{
- struct device *dev = (struct device *) data;
+ struct device *dev = dpm_drv_wd_data.dev;
+ struct task_struct *tsk = dpm_drv_wd_data.tsk;
printk(KERN_EMERG "**** DPM device timeout: %s (%s)\n", dev_name(dev),
(dev->driver ? dev->driver->name : "no driver"));
+
+ printk(KERN_EMERG "dpm suspend stack:\n");
+ show_stack(tsk, NULL);
+
BUG();
}
@@ -615,7 +624,9 @@ static void dpm_drv_timeout(unsigned long data)
*/
static void dpm_drv_wdset(struct device *dev)
{
- dpm_drv_wd.data = (unsigned long) dev;
+ dpm_drv_wd_data.dev = dev;
+ dpm_drv_wd_data.tsk = get_current();
+ dpm_drv_wd.data = (unsigned long) &dpm_drv_wd_data;
mod_timer(&dpm_drv_wd, jiffies + (HZ * 3));
}
diff --git a/drivers/input/evdev.c b/drivers/input/evdev.c
index 7d22f51392dd..43e94e5188dd 100644
--- a/drivers/input/evdev.c
+++ b/drivers/input/evdev.c
@@ -316,6 +316,7 @@ static int evdev_open(struct inode *inode, struct file *file)
err_free_client:
evdev_detach_client(evdev, client);
+ wake_lock_destroy(&client->wake_lock);
kfree(client);
err_put_evdev:
put_device(&evdev->dev);
diff --git a/drivers/input/keyreset.c b/drivers/input/keyreset.c
index a5091ac19bbe..36208fe0baae 100644
--- a/drivers/input/keyreset.c
+++ b/drivers/input/keyreset.c
@@ -88,10 +88,10 @@ static void keyreset_event(struct input_handle *handle, unsigned int type,
state->restart_disabled = 1;
if (restart_requested)
panic("keyboard reset failed, %d", restart_requested);
- pr_info("keyboard reset\n");
if (state->reset_fn) {
restart_requested = state->reset_fn();
} else {
+ pr_info("keyboard reset\n");
schedule_work(&restart_work);
restart_requested = 1;
}
diff --git a/drivers/usb/gadget/fsl_tegra_udc.c b/drivers/usb/gadget/fsl_tegra_udc.c
index 6091d1f7ea0c..74c1d0b52541 100644
--- a/drivers/usb/gadget/fsl_tegra_udc.c
+++ b/drivers/usb/gadget/fsl_tegra_udc.c
@@ -15,6 +15,7 @@
static struct tegra_usb_phy *phy;
static struct clk *udc_clk;
+static struct clk *emc_clk;
static void *udc_base;
int fsl_udc_clk_init(struct platform_device *pdev)
@@ -33,6 +34,16 @@ int fsl_udc_clk_init(struct platform_device *pdev)
clk_enable(udc_clk);
+ emc_clk = clk_get(&pdev->dev, "emc");
+ if (IS_ERR(emc_clk)) {
+ dev_err(&pdev->dev, "Can't get emc clock\n");
+ err = PTR_ERR(emc_clk);
+ goto err_emc;
+ }
+
+ clk_enable(emc_clk);
+ clk_set_rate(emc_clk, 240000000);
+
/* we have to remap the registers ourselves as fsl_udc does not
* export them for us.
*/
@@ -65,6 +76,9 @@ int fsl_udc_clk_init(struct platform_device *pdev)
err1:
iounmap(udc_base);
err0:
+ clk_disable(emc_clk);
+ clk_put(emc_clk);
+err_emc:
clk_disable(udc_clk);
clk_put(udc_clk);
return err;
@@ -82,16 +96,21 @@ void fsl_udc_clk_release(void)
clk_disable(udc_clk);
clk_put(udc_clk);
+
+ clk_disable(emc_clk);
+ clk_put(emc_clk);
}
void fsl_udc_clk_suspend(void)
{
tegra_usb_phy_power_off(phy);
clk_disable(udc_clk);
+ clk_disable(emc_clk);
}
void fsl_udc_clk_resume(void)
{
+ clk_enable(emc_clk);
clk_enable(udc_clk);
tegra_usb_phy_power_on(phy);
}
diff --git a/drivers/usb/host/ehci-tegra.c b/drivers/usb/host/ehci-tegra.c
index 597c0a2a911e..5e14bfbe148c 100644
--- a/drivers/usb/host/ehci-tegra.c
+++ b/drivers/usb/host/ehci-tegra.c
@@ -50,6 +50,7 @@ struct tegra_ehci_hcd {
struct ehci_hcd *ehci;
struct tegra_usb_phy *phy;
struct clk *clk;
+ struct clk *emc_clk;
struct otg_transceiver *transceiver;
int host_resumed;
int bus_suspended;
@@ -62,6 +63,7 @@ static void tegra_ehci_power_up(struct usb_hcd *hcd)
{
struct tegra_ehci_hcd *tegra = dev_get_drvdata(hcd->self.controller);
+ clk_enable(tegra->emc_clk);
clk_enable(tegra->clk);
tegra_usb_phy_power_on(tegra->phy);
tegra->host_resumed = 1;
@@ -74,6 +76,7 @@ static void tegra_ehci_power_down(struct usb_hcd *hcd)
tegra->host_resumed = 0;
tegra_usb_phy_power_off(tegra->phy);
clk_disable(tegra->clk);
+ clk_disable(tegra->emc_clk);
}
static int tegra_ehci_hub_control(
@@ -634,6 +637,16 @@ static int tegra_ehci_probe(struct platform_device *pdev)
if (err)
goto fail_clken;
+ tegra->emc_clk = clk_get(&pdev->dev, "emc");
+ if (IS_ERR(tegra->emc_clk)) {
+ dev_err(&pdev->dev, "Can't get emc clock\n");
+ err = PTR_ERR(tegra->emc_clk);
+ goto fail_emc_clk;
+ }
+
+ clk_enable(tegra->emc_clk);
+ clk_set_rate(tegra->emc_clk, 240000000);
+
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!res) {
dev_err(&pdev->dev, "Failed to get I/O memory\n");
@@ -708,6 +721,9 @@ fail:
fail_phy:
iounmap(hcd->regs);
fail_io:
+ clk_disable(tegra->emc_clk);
+ clk_put(tegra->emc_clk);
+fail_emc_clk:
clk_disable(tegra->clk);
fail_clken:
clk_put(tegra->clk);
@@ -772,6 +788,9 @@ static int tegra_ehci_remove(struct platform_device *pdev)
clk_disable(tegra->clk);
clk_put(tegra->clk);
+ clk_disable(tegra->emc_clk);
+ clk_put(tegra->emc_clk);
+
kfree(tegra);
return 0;
}