summaryrefslogtreecommitdiff
path: root/firmware/ata_idle_notify.c
diff options
context:
space:
mode:
authorJonathan Gordon <rockbox@jdgordon.info>2006-11-06 14:24:18 +0000
committerJonathan Gordon <rockbox@jdgordon.info>2006-11-06 14:24:18 +0000
commit0b22795e26ee09de14f6ac23219adeda12f2fd5b (patch)
treec1ccbda32170de48111a4b75e1f723ba953096bf /firmware/ata_idle_notify.c
parente543901777843a1734474aba7aa5d96cf61708ab (diff)
adds ata_idle_notify system which allows callbacks in apps/ to be called
when the hard disk is idle but spinning, and just before shutting down. on SWCODEC targets with > 8MB RAM the playback engine will try to refill the buffer if it is less than 75% full while the disk is spinning (temporarily disabled on the nano) git-svn-id: svn://svn.rockbox.org/rockbox/trunk@11451 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/ata_idle_notify.c')
-rw-r--r--firmware/ata_idle_notify.c96
1 files changed, 96 insertions, 0 deletions
diff --git a/firmware/ata_idle_notify.c b/firmware/ata_idle_notify.c
new file mode 100644
index 0000000000..a0a56e958b
--- /dev/null
+++ b/firmware/ata_idle_notify.c
@@ -0,0 +1,96 @@
+/***************************************************************************
+ * __________ __ ___.
+ * 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 <stdbool.h>
+#include "system.h"
+#include "ata_idle_notify.h"
+#include "logf.h"
+
+#if USING_ATA_CALLBACK
+static ata_idle_notify ata_idle_notify_funcs[MAX_ATA_CALLBACKS];
+static int ata_callback_count = 0;
+#endif
+
+bool register_ata_idle_func(ata_idle_notify function)
+{
+#if USING_ATA_CALLBACK
+ int i;
+ for (i=0; i<MAX_ATA_CALLBACKS; i++)
+ {
+ if (ata_idle_notify_funcs[i] == NULL)
+ {
+ ata_idle_notify_funcs[i] = function;
+ ata_callback_count++;
+ return true;
+ }
+ else if (ata_idle_notify_funcs[i] == function)
+ return true;
+ }
+ return false;
+#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 */
+ return true;
+#endif
+}
+
+#if USING_ATA_CALLBACK
+void unregister_ata_idle_func(ata_idle_notify func)
+{
+ int i;
+ for (i=0; i<MAX_ATA_CALLBACKS; i++)
+ {
+ if (ata_idle_notify_funcs[i] == func)
+ {
+ ata_idle_notify_funcs[i] = NULL;
+ ata_callback_count--;
+ }
+ }
+ return;
+}
+
+bool call_ata_idle_notifys(void)
+{
+ int i;
+ ata_idle_notify function;
+ if (ata_callback_count == 0)
+ return false;
+ ata_callback_count = 0; /* so we dont re-enter every time the callbacks read/write */
+ for (i = 0; i < MAX_ATA_CALLBACKS; i++)
+ {
+ if (ata_idle_notify_funcs[i])
+ {
+ function = ata_idle_notify_funcs[i];
+ ata_idle_notify_funcs[i] = NULL;
+ function();
+ }
+ }
+ return true;
+}
+
+void ata_idle_notify_init(void)
+{
+ int i;
+ for (i=0; i<MAX_ATA_CALLBACKS; i++)
+ {
+ ata_idle_notify_funcs[i] = NULL;
+ }
+}
+#endif