aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/arm/include/asm/irq.h2
-rw-r--r--arch/arm/include/asm/nmi.h14
-rw-r--r--arch/arm/kernel/irq.c2
-rw-r--r--drivers/gpu/pvr/Makefile2
-rw-r--r--drivers/gpu/pvr/deviceclass.c57
-rw-r--r--drivers/gpu/pvr/omaplfb/omaplfb_displayclass.c2
-rw-r--r--drivers/gpu/pvr/sgxerrata.h4
-rw-r--r--drivers/gpu/pvr/sgxfeaturedefs.h6
-rw-r--r--drivers/watchdog/omap_wdt.c23
9 files changed, 79 insertions, 33 deletions
diff --git a/arch/arm/include/asm/irq.h b/arch/arm/include/asm/irq.h
index 2721a58..904d0d2 100644
--- a/arch/arm/include/asm/irq.h
+++ b/arch/arm/include/asm/irq.h
@@ -3,6 +3,8 @@
#include <mach/irqs.h>
+#define ARCH_HAS_NMI_WATCHDOG
+
#ifndef irq_canonicalize
#define irq_canonicalize(i) (i)
#endif
diff --git a/arch/arm/include/asm/nmi.h b/arch/arm/include/asm/nmi.h
new file mode 100644
index 0000000..3cf8bdf
--- /dev/null
+++ b/arch/arm/include/asm/nmi.h
@@ -0,0 +1,14 @@
+#ifndef __ASM_ARM_NMI_H_
+#define __ASM_ARM_NMI_H_
+
+#include <linux/notifier.h>
+
+extern struct atomic_notifier_head touch_watchdog_notifier_head;
+
+static inline void touch_nmi_watchdog(void)
+{
+ atomic_notifier_call_chain(&touch_watchdog_notifier_head, 0, 0);
+ touch_softlockup_watchdog();
+}
+
+#endif /* __ASM_ARM_NMI_H_ */
diff --git a/arch/arm/kernel/irq.c b/arch/arm/kernel/irq.c
index 83bbad0..fee2edf 100644
--- a/arch/arm/kernel/irq.c
+++ b/arch/arm/kernel/irq.c
@@ -51,6 +51,8 @@
unsigned long irq_err_count;
+ATOMIC_NOTIFIER_HEAD(touch_watchdog_notifier_head);
+
int arch_show_interrupts(struct seq_file *p, int prec)
{
#ifdef CONFIG_FIQ
diff --git a/drivers/gpu/pvr/Makefile b/drivers/gpu/pvr/Makefile
index 5fa7aa2..ca9d02e 100644
--- a/drivers/gpu/pvr/Makefile
+++ b/drivers/gpu/pvr/Makefile
@@ -21,8 +21,8 @@ ccflags-y += \
-DPVRSRV_MODNAME="\"pvrsrvkm\"" \
-DPVR_LDM_DRIVER_REGISTRATION_NAME="\"pvrsrvkm\"" \
-DSUPPORT_DC_CMDCOMPLETE_WHEN_NO_LONGER_DISPLAYED \
- -DSUPPORT_OMAP_TILER \
-DSUPPORT_LARGE_GENERAL_HEAP \
+ -DPVR_NO_OMAP_TIMER \
-Idrivers/gpu/pvr/sgx
ccflags-$(CONFIG_PVR_SGXCORE_540) += \
diff --git a/drivers/gpu/pvr/deviceclass.c b/drivers/gpu/pvr/deviceclass.c
index 5708603..069f050 100644
--- a/drivers/gpu/pvr/deviceclass.c
+++ b/drivers/gpu/pvr/deviceclass.c
@@ -1518,6 +1518,8 @@ typedef struct _CALLBACK_DATA_
{
IMG_PVOID pvPrivData;
IMG_UINT32 ui32PrivDataLength;
+ IMG_PVOID ppvMemInfos;
+ IMG_UINT32 ui32NumMemInfos;
} CALLBACK_DATA;
static IMG_VOID FreePrivateData(IMG_HANDLE hCallbackData)
@@ -1525,7 +1527,10 @@ static IMG_VOID FreePrivateData(IMG_HANDLE hCallbackData)
CALLBACK_DATA *psCallbackData = hCallbackData;
OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, psCallbackData->ui32PrivDataLength,
- psCallbackData->pvPrivData, IMG_NULL);
+ psCallbackData->pvPrivData, IMG_NULL);
+ OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
+ sizeof(IMG_VOID *) * psCallbackData->ui32NumMemInfos,
+ psCallbackData->ppvMemInfos, IMG_NULL);
OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(CALLBACK_DATA), hCallbackData, IMG_NULL);
}
@@ -1545,10 +1550,11 @@ PVRSRV_ERROR PVRSRVSwapToDCBuffer2KM(IMG_HANDLE hDeviceKM,
PVRSRV_DISPLAYCLASS_INFO *psDCInfo;
PVRSRV_DC_SWAPCHAIN *psSwapChain;
PVRSRV_ERROR eError = PVRSRV_OK;
+ CALLBACK_DATA *psCallbackData;
PVRSRV_QUEUE_INFO *psQueue;
PVRSRV_COMMAND *psCommand;
+ IMG_PVOID *ppvMemInfos;
SYS_DATA *psSysData;
- CALLBACK_DATA *psCallbackData;
if(!hDeviceKM || !hSwapChain || !ppsMemInfos || !ppsSyncInfos || ui32NumMemSyncInfos < 1)
{
@@ -1576,10 +1582,30 @@ PVRSRV_ERROR PVRSRVSwapToDCBuffer2KM(IMG_HANDLE hDeviceKM,
{
return eError;
}
+
psCallbackData->pvPrivData = pvPrivData;
psCallbackData->ui32PrivDataLength = ui32PrivDataLength;
+ if(OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
+ sizeof(IMG_VOID *) * ui32NumMemSyncInfos,
+ (IMG_VOID **)&ppvMemInfos, IMG_NULL,
+ "Swap Command Meminfos") != PVRSRV_OK)
+ {
+ PVR_DPF((PVR_DBG_ERROR,"PVRSRVSwapToDCBuffer2KM: Failed to allocate space for meminfo list"));
+ psCallbackData->ppvMemInfos = IMG_NULL;
+ goto Exit;
+ }
+
+ for(i = 0; i < ui32NumMemSyncInfos; i++)
+ {
+ ppvMemInfos[i] = ppsMemInfos[i];
+ }
+
+ psCallbackData->ppvMemInfos = ppvMemInfos;
+ psCallbackData->ui32NumMemInfos = ui32NumMemSyncInfos;
+
+
psQueue = psSwapChain->psQueue;
#if !defined(SUPPORT_DC_CMDCOMPLETE_WHEN_NO_LONGER_DISPLAYED)
@@ -1674,21 +1700,7 @@ PVRSRV_ERROR PVRSRVSwapToDCBuffer2KM(IMG_HANDLE hDeviceKM,
psFlipCmd->pvPrivData = pvPrivData;
psFlipCmd->ui32PrivDataLength = ui32PrivDataLength;
-
- if(OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
- sizeof(IMG_VOID *) * ui32NumMemSyncInfos,
- (IMG_VOID **)&psFlipCmd->ppvMemInfos, IMG_NULL,
- "Swap Command Meminfos") != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVSwapToDCBuffer2KM: Failed to allocate space for meminfo list"));
- goto Exit;
- }
-
- for(i = 0; i < ui32NumMemSyncInfos; i++)
- {
- psFlipCmd->ppvMemInfos[i] = ppsMemInfos[i];
- }
-
+ psFlipCmd->ppvMemInfos = ppvMemInfos;
psFlipCmd->ui32NumMemInfos = ui32NumMemSyncInfos;
@@ -1696,12 +1708,9 @@ PVRSRV_ERROR PVRSRVSwapToDCBuffer2KM(IMG_HANDLE hDeviceKM,
if (eError != PVRSRV_OK)
{
PVR_DPF((PVR_DBG_ERROR,"PVRSRVSwapToDCBuffer2KM: Failed to submit command"));
- OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
- sizeof(IMG_VOID *) * ui32NumMemSyncInfos,
- (IMG_VOID *)psFlipCmd->ppvMemInfos,
- IMG_NULL);
goto Exit;
}
+
psCallbackData = IMG_NULL;
@@ -1747,6 +1756,12 @@ PVRSRV_ERROR PVRSRVSwapToDCBuffer2KM(IMG_HANDLE hDeviceKM,
Exit:
if (psCallbackData)
{
+ if(psCallbackData->ppvMemInfos)
+ {
+ OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
+ sizeof(IMG_VOID *) * psCallbackData->ui32NumMemInfos,
+ psCallbackData->ppvMemInfos, IMG_NULL);
+ }
OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(CALLBACK_DATA), psCallbackData, IMG_NULL);
}
if(eError == PVRSRV_ERROR_CANNOT_GET_QUEUE_SPACE)
diff --git a/drivers/gpu/pvr/omaplfb/omaplfb_displayclass.c b/drivers/gpu/pvr/omaplfb/omaplfb_displayclass.c
index f5ecab4..5ccfc04 100644
--- a/drivers/gpu/pvr/omaplfb/omaplfb_displayclass.c
+++ b/drivers/gpu/pvr/omaplfb/omaplfb_displayclass.c
@@ -1379,7 +1379,7 @@ static OMAPLFB_DEVINFO *OMAPLFBInitDev(unsigned uiFBDevID)
aui32SyncCountList[DC_FLIP_COMMAND][0] = 0;
- aui32SyncCountList[DC_FLIP_COMMAND][1] = 5;
+ aui32SyncCountList[DC_FLIP_COMMAND][1] = 10;
diff --git a/drivers/gpu/pvr/sgxerrata.h b/drivers/gpu/pvr/sgxerrata.h
index 1ad1a8a..9463308 100644
--- a/drivers/gpu/pvr/sgxerrata.h
+++ b/drivers/gpu/pvr/sgxerrata.h
@@ -566,10 +566,6 @@
#else
#if SGX_CORE_REV == 112
#define FIX_HW_BRN_31272
- #define FIX_HW_BRN_31780
- #if defined(SUPPORT_SGX_LOW_LATENCY_SCHEDULING) && defined(SGX_FEATURE_MP)
- #define FIX_HW_BRN_33657
- #endif
#define FIX_HW_BRN_33920
#else
#if SGX_CORE_REV == 114
diff --git a/drivers/gpu/pvr/sgxfeaturedefs.h b/drivers/gpu/pvr/sgxfeaturedefs.h
index 593176f..bdf36fe 100644
--- a/drivers/gpu/pvr/sgxfeaturedefs.h
+++ b/drivers/gpu/pvr/sgxfeaturedefs.h
@@ -137,11 +137,7 @@
#define SGX_FEATURE_MULTI_EVENT_KICK
#define SGX_FEATURE_EDM_VERTEX_PDSADDR_FULL_RANGE
#if defined(SUPPORT_SGX_LOW_LATENCY_SCHEDULING)
- #if defined(USE_SGX_CORE_REV_HEAD)
- #define SGX_FEATURE_FAST_RENDER_CONTEXT_SWITCH
- #endif
- #define SGX_FEATURE_SLAVE_VDM_CONTEXT_SWITCH
- #define SGX_FEATURE_ISP_CONTEXT_SWITCH_REV_2
+ #define SGX_FEATURE_SW_ISP_CONTEXT_SWITCH
#endif
#else
#if defined(SGX554)
diff --git a/drivers/watchdog/omap_wdt.c b/drivers/watchdog/omap_wdt.c
index ad89d05..574588b 100644
--- a/drivers/watchdog/omap_wdt.c
+++ b/drivers/watchdog/omap_wdt.c
@@ -45,6 +45,7 @@
#include <linux/pm_runtime.h>
#include <linux/interrupt.h>
#include <linux/workqueue.h>
+#include <linux/nmi.h>
#include <mach/hardware.h>
#include <plat/prcm.h>
@@ -70,6 +71,7 @@ struct omap_wdt_dev {
struct resource *mem;
struct miscdevice omap_wdt_miscdev;
int irq;
+ struct notifier_block nb;
};
static void omap_wdt_ping(struct omap_wdt_dev *wdev)
@@ -319,6 +321,17 @@ static const struct file_operations omap_wdt_fops = {
.llseek = no_llseek,
};
+static int omap_wdt_nb_func(struct notifier_block *nb, unsigned long val,
+ void *v)
+{
+ struct omap_wdt_dev *wdev = container_of(nb, struct omap_wdt_dev, nb);
+ pm_runtime_get_sync(wdev->dev);
+ omap_wdt_ping(wdev);
+ pm_runtime_put_sync_suspend(wdev->dev);
+
+ return NOTIFY_OK;
+}
+
static int __devinit omap_wdt_probe(struct platform_device *pdev)
{
struct resource *res, *mem, *res_irq;
@@ -397,8 +410,12 @@ static int __devinit omap_wdt_probe(struct platform_device *pdev)
omap_wdt_dev = pdev;
- if (kernelpet && wdev->irq)
+ if (kernelpet && wdev->irq) {
+ wdev->nb.notifier_call = omap_wdt_nb_func;
+ atomic_notifier_chain_register(&touch_watchdog_notifier_head,
+ &wdev->nb);
return omap_wdt_setup(wdev);
+ }
return 0;
@@ -450,6 +467,10 @@ static int __devexit omap_wdt_remove(struct platform_device *pdev)
if (wdev->irq)
free_irq(wdev->irq, wdev);
+ if (kernelpet && wdev->irq)
+ atomic_notifier_chain_unregister(&touch_watchdog_notifier_head,
+ &wdev->nb);
+
iounmap(wdev->base);
kfree(wdev);