#endif
+#if gcdENABLE_LONG_IDLE_POWEROFF
+#include <linux/workqueue.h>
+struct delayed_work poweroff_work;
+static gckHARDWARE gHardware = gcvNULL;
+void time_to_poweroff(struct work_struct *work)
+{
+ gceSTATUS status;
+ if(NULL==gHardware) return;
+
+ status = gckHARDWARE_SetPowerManagementState(gHardware, gcvPOWER_OFF_BROADCAST);
+ if (gcmIS_ERROR(status))
+ {
+ printk("%s fail!\n", __func__);
+ return;
+ }
+}
+#endif
+
/******************************************************************************\
********************************* Support Code *********************************
\******************************************************************************/
/* Return pointer to the gckHARDWARE object. */
*Hardware = hardware;
+#if gcdENABLE_LONG_IDLE_POWEROFF
+ INIT_DELAYED_WORK(&poweroff_work, time_to_poweroff);
+ gHardware = hardware;
+#endif
+
/* Success. */
gcmkFOOTER_ARG("*Hardware=0x%x", *Hardware);
return gcvSTATUS_OK;
os = Hardware->os;
gcmkVERIFY_OBJECT(os, gcvOBJ_OS);
+#if gcdENABLE_LONG_IDLE_POWEROFF
+ if(gcvPOWER_IDLE_BROADCAST==State) {
+ cancel_delayed_work_sync(&poweroff_work);
+ schedule_delayed_work(&poweroff_work, 5*HZ);
+ } else if(gcvPOWER_OFF_BROADCAST==State) {
+ // NULL
+ } else {
+ cancel_delayed_work_sync(&poweroff_work);
+ }
+#endif
+
/* Convert the broadcast power state. */
switch (State)
{
if ((flag == 0) || (Hardware->settingPowerState))
{
+#if gcdENABLE_LONG_IDLE_POWEROFF
+ if( (gcvPOWER_OFF==Hardware->chipPowerState) && (gcvPOWER_OFF==State) && (gcvFALSE==broadcast) )
+ {
+ Hardware->broadcast = gcvFALSE;
+ }
+#endif
/* Release the power mutex. */
Hardware->powerProcess = 0;
Hardware->powerThread = 0;
*/
#define gcdENABLE_MEM_CACHE 2
+
/*
gcdENABLE_DELAY_EARLY_SUSPEND
ÔÚgpu_early_suspendÖÐʹÓÃÑÓʱ¹¤×÷¶ÓÁÐÀ´Ö´ÐÐsuspend,
±ÜÃâgpu_early_suspend¹ýÔçÖ´Ðе¼ÖÂÓû§Ï̵߳ÄÊÂÇ黹´¦Àí¸É¾»
+ 0: ʹÓÃÕý³£µÄearly_suspend¹¦ÄÜ
+ 1: ʹÓÃdelayµÄearly_suspend¹¦ÄÜ
+ 2: ¹Ø±Õearly_suspend¹¦ÄÜ
+*/
+#define gcdENABLE_DELAY_EARLY_SUSPEND 2
+
+
+/*
+ gcdENABLE_LONG_IDLE_POWEROFF
+
+ ³¤Ê±¼äIDLEºó½øÈëPowerOff, ¸Ã¹¦ÄÜ¿ªÆôºóÐèÒª°ÑEarlySuspend¹¦Äܹصô
+ ÕâÑù¿ÉÒÔʹijЩ²»Ê¹ÓÃGPUµÄ³¡¾°µÄ¹¦ºÄ½øÒ»²½½µµÍ£¬ÈçÊÓÆµ²¥·Åʱ£¬Ò»¼¶´ý»úʱ£¬
+ »ò³¤Ê±¼ä²»²Ù×÷½çÃæµ«»¹Î´½øÈëÒ»¼¶´ý»ú
*/
-#define gcdENABLE_DELAY_EARLY_SUSPEND 0
+#define gcdENABLE_LONG_IDLE_POWEROFF 1
#endif /* __gc_hal_options_h_ */
device->registerBase = (gctPOINTER) ioremap_nocache(RegisterMemBase,
RegisterMemSize);
if (!device->registerBase)
- {
+ {
gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_DRIVER,
"[galcore] gckGALDEVICE_Construct: Unable to map location->0x%lX for size->%ld",
RegisterMemBase,
return gcvSTATUS_OUT_OF_RESOURCES;
}
+ printk("---- gpu regbase: 0x%08x ---- \n", (unsigned int)device->registerBase);
physical += RegisterMemSize;
}
#endif
-#if gcdENABLE_DELAY_EARLY_SUSPEND
+#if (1==gcdENABLE_DELAY_EARLY_SUSPEND)
struct delayed_work suspend_work;
void real_suspend(struct work_struct *work)
{
#if CONFIG_HAS_EARLYSUSPEND
static void gpu_early_suspend(struct early_suspend *h)
{
-#if gcdENABLE_DELAY_EARLY_SUSPEND
+#if (1==gcdENABLE_DELAY_EARLY_SUSPEND)
schedule_delayed_work(&suspend_work, 5*HZ);
#else
gceSTATUS status;
-
status = gckHARDWARE_SetPowerManagementState(galDevice->kernel->hardware, gcvPOWER_OFF);
if (gcmIS_ERROR(status))
{
gceSTATUS status;
-#if gcdENABLE_DELAY_EARLY_SUSPEND
+#if (1==gcdENABLE_DELAY_EARLY_SUSPEND)
cancel_delayed_work_sync(&suspend_work);
#endif
status = gckHARDWARE_SetPowerManagementState(galDevice->kernel->hardware, gcvPOWER_ON);
#endif
#if CONFIG_HAS_EARLYSUSPEND
- //register_early_suspend(&gpu_early_suspend_info);
+#if (2!=gcdENABLE_DELAY_EARLY_SUSPEND)
+ register_early_suspend(&gpu_early_suspend_info);
+#endif
#endif
-#if gcdENABLE_DELAY_EARLY_SUSPEND
+#if (1==gcdENABLE_DELAY_EARLY_SUSPEND)
INIT_DELAYED_WORK(&suspend_work, real_suspend);
#endif
static int __devinit gpu_remove(struct platform_device *pdev)
{
-#if gcdENABLE_DELAY_EARLY_SUSPEND
+#if (1==gcdENABLE_DELAY_EARLY_SUSPEND)
cancel_delayed_work_sync(&suspend_work);
#endif
drv_exit();
gceSTATUS status;
gckGALDEVICE device;
-#if gcdENABLE_DELAY_EARLY_SUSPEND
+#if (1==gcdENABLE_DELAY_EARLY_SUSPEND)
cancel_delayed_work_sync(&suspend_work);
#endif
device = platform_get_drvdata(dev);
static void __devinit gpu_shutdown(struct platform_device *dev)
{
-#if gcdENABLE_DELAY_EARLY_SUSPEND
+#if (1==gcdENABLE_DELAY_EARLY_SUSPEND)
cancel_delayed_work_sync(&suspend_work);
#endif
drv_exit();