/* * On gecko style machines (e.g. 712/xx and 715/xx) * the power switch status is stored in Bit 0 ("the highest bit") * of CPU diagnose register 25. * */ static void gecko_tasklet_func(unsigned long unused) { if (!pwrsw_enabled) return; if (__getDIAG(25) & 0x80000000) { /* power switch button not pressed or released again */ /* Warning: Some machines do never reset this DIAG flag! */ shutdown_timer = 0; } else { process_shutdown(); } }
/* main kernel thread worker. It polls the button state */ static int kpowerswd(void *param) { __set_current_state(TASK_RUNNING); do { int button_not_pressed; unsigned long soft_power_reg = (unsigned long) param; schedule_timeout_interruptible(pwrsw_enabled ? HZ : HZ/POWERSWITCH_POLL_PER_SEC); __set_current_state(TASK_RUNNING); if (unlikely(!pwrsw_enabled)) continue; if (soft_power_reg) { /* * Non-Gecko-style machines: * Check the power switch status which is read from the * real I/O location at soft_power_reg. * Bit 31 ("the lowest bit) is the status of the power switch. * This bit is "1" if the button is NOT pressed. */ button_not_pressed = (gsc_readl(soft_power_reg) & 0x1); } else { /* * On gecko style machines (e.g. 712/xx and 715/xx) * the power switch status is stored in Bit 0 ("the highest bit") * of CPU diagnose register 25. * Warning: Some machines never reset the DIAG flag, even if * the button has been released again. */ button_not_pressed = (__getDIAG(25) & 0x80000000); } if (likely(button_not_pressed)) { if (unlikely(shutdown_timer && /* avoid writing if not necessary */ shutdown_timer < (POWERSWITCH_DOWN_SEC*POWERSWITCH_POLL_PER_SEC))) { shutdown_timer = 0; printk(KERN_INFO KTHREAD_NAME ": Shutdown request aborted.\n"); } } else process_shutdown(); } while (!kthread_should_stop()); return 0; }
static int kpowerswd(void *param) { __set_current_state(TASK_RUNNING); do { int button_not_pressed; unsigned long soft_power_reg = (unsigned long) param; schedule_timeout_interruptible(pwrsw_enabled ? HZ : HZ/POWERSWITCH_POLL_PER_SEC); __set_current_state(TASK_RUNNING); if (unlikely(!pwrsw_enabled)) continue; if (soft_power_reg) { /* */ button_not_pressed = (gsc_readl(soft_power_reg) & 0x1); } else { /* */ button_not_pressed = (__getDIAG(25) & 0x80000000); } if (likely(button_not_pressed)) { if (unlikely(shutdown_timer && /* */ shutdown_timer < (POWERSWITCH_DOWN_SEC*POWERSWITCH_POLL_PER_SEC))) { shutdown_timer = 0; printk(KERN_INFO KTHREAD_NAME ": Shutdown request aborted.\n"); } } else process_shutdown(); } while (!kthread_should_stop()); return 0; }