diff options
author | Nitin Kumbhar <nkumbhar@nvidia.com> | 2011-01-28 13:39:17 +0530 |
---|---|---|
committer | Nitin Kumbhar <nkumbhar@nvidia.com> | 2011-01-28 13:39:17 +0530 |
commit | 8197cb15eaf0640d13c816926f65972ca6cbba84 (patch) | |
tree | 17b034f1f03a3d1b7776001cb63bdfd186415130 | |
parent | 7cc7de288765bc634a0374e660de01a3fd4e8e39 (diff) | |
parent | 22b3c9ca22924cf7015ecadf7ce111cf402a707b (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.S | 2 | ||||
-rw-r--r-- | arch/arm/mach-tegra/include/mach/io.h | 22 | ||||
-rw-r--r-- | arch/arm/mach-tegra/io.c | 32 | ||||
-rw-r--r-- | arch/arm/mach-tegra/tegra2_clocks.c | 4 | ||||
-rw-r--r-- | drivers/base/power/main.c | 15 | ||||
-rw-r--r-- | drivers/input/evdev.c | 1 | ||||
-rw-r--r-- | drivers/input/keyreset.c | 2 | ||||
-rw-r--r-- | drivers/usb/gadget/fsl_tegra_udc.c | 19 | ||||
-rw-r--r-- | drivers/usb/host/ehci-tegra.c | 19 |
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; } |