/*************************************************************************** * __________ __ ___. * Open \______ \ ____ ____ | | _\_ |__ _______ ___ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ * \/ \/ \/ \/ \/ * $Id$ * * Copyright (C) 2006 Jonathan Gordon * * All files in this archive are subject to the GNU General Public License. * See the file COPYING in the source tree root for full license agreement. * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY * KIND, either express or implied. * ****************************************************************************/ #include #include "system.h" #include "ata.h" #include "ata_idle_notify.h" #include "kernel.h" #include "string.h" void register_ata_idle_func(ata_idle_notify function) { #if USING_ATA_CALLBACK add_event(DISK_EVENT_SPINUP, function); #else function(); /* just call the function now */ /* this _may_ cause problems later if the calling function sets a variable expecting the callback to unset it, because the callback will be run before this function exits, so before the var is set */ #endif } #if USING_ATA_CALLBACK void unregister_ata_idle_func(ata_idle_notify func, bool run) { remove_event(DISK_EVENT_SPINUP, func); if (run) func(); } bool call_ata_idle_notifys(bool force) { static int lock_until = 0; if (!force) { if (TIME_BEFORE(current_tick,lock_until) ) return false; } lock_until = current_tick + 30*HZ; send_event(DISK_EVENT_SPINUP, true, NULL); return true; } #endif