summaryrefslogtreecommitdiffstats
path: root/firmware/target/arm/s5l8700/ipodnano2g/nand-nano2g.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target/arm/s5l8700/ipodnano2g/nand-nano2g.c')
-rw-r--r--firmware/target/arm/s5l8700/ipodnano2g/nand-nano2g.c76
1 files changed, 41 insertions, 35 deletions
diff --git a/firmware/target/arm/s5l8700/ipodnano2g/nand-nano2g.c b/firmware/target/arm/s5l8700/ipodnano2g/nand-nano2g.c
index 1698dc2b9b..4b74405c1c 100644
--- a/firmware/target/arm/s5l8700/ipodnano2g/nand-nano2g.c
+++ b/firmware/target/arm/s5l8700/ipodnano2g/nand-nano2g.c
@@ -31,8 +31,7 @@
#include <mmu-arm.h>
#include <string.h>
#include "led.h"
-#include "ata_idle_notify.h"
-
+#include "storage.h"
#define NAND_CMD_READ 0x00
#define NAND_CMD_PROGCNFRM 0x10
@@ -91,7 +90,6 @@ static int nand_powered = 0;
static int nand_interleaved = 0;
static int nand_cached = 0;
static long nand_last_activity_value = -1;
-static long nand_stack[DEFAULT_STACK_SIZE];
static struct mutex nand_mtx;
static struct semaphore nand_complete;
@@ -359,20 +357,22 @@ void nand_power_up(void)
void nand_power_down(void)
{
- if (!nand_powered) return;
mutex_lock(&nand_mtx);
- pmu_ldo_power_off(4);
- PCON2 = 0x11111111;
- PDAT2 = 0;
- PCON3 = 0x11111111;
- PDAT3 = 0;
- PCON4 = 0x11111111;
- PDAT4 = 0;
- PCON5 = (PCON5 & ~0xF) | 1;
- PUNK5 = 1;
- PWRCONEXT |= 0x40;
- PWRCON |= 0x100000;
- nand_powered = 0;
+ if (nand_powered)
+ {
+ pmu_ldo_power_off(4);
+ PCON2 = 0x11111111;
+ PDAT2 = 0;
+ PCON3 = 0x11111111;
+ PDAT3 = 0;
+ PCON4 = 0x11111111;
+ PDAT4 = 0;
+ PCON5 = (PCON5 & ~0xF) | 1;
+ PUNK5 = 1;
+ PWRCONEXT |= 0x40;
+ PWRCON |= 0x100000;
+ nand_powered = 0;
+ }
mutex_unlock(&nand_mtx);
}
@@ -714,20 +714,6 @@ const struct nand_device_info_type* nand_get_device_type(uint32_t bank)
return &nand_deviceinfotable[nand_type[bank]];
}
-static void nand_thread(void)
-{
- while (1)
- {
- if (TIME_AFTER(current_tick, nand_last_activity_value + HZ / 5)
- && nand_powered)
- {
- call_storage_idle_notifys(false);
- nand_power_down();
- }
- sleep(HZ / 10);
- }
-}
-
int nand_device_init(void)
{
mutex_init(&nand_mtx);
@@ -776,10 +762,30 @@ int nand_device_init(void)
nand_cached = ((nand_deviceinfotable[nand_type[0]].id >> 23) & 1);
nand_last_activity_value = current_tick;
- create_thread(nand_thread, nand_stack,
- sizeof(nand_stack), 0, "nand"
- IF_PRIO(, PRIORITY_USER_INTERFACE)
- IF_COP(, CPU));
-
return 0;
}
+
+int nand_event(long id, intptr_t data)
+{
+ int rc = 0;
+
+ if (LIKELY(id == Q_STORAGE_TICK))
+ {
+ if (!nand_powered ||
+ TIME_BEFORE(current_tick, nand_last_activity_value + HZ / 5))
+ {
+ STG_EVENT_ASSERT_ACTIVE(STORAGE_NAND);
+ }
+ }
+ else if (id == Q_STORAGE_SLEEPNOW)
+ {
+ nand_power_down();
+ }
+ else
+ {
+ rc = storage_event_default_handler(id, data, nand_last_activity_value,
+ STORAGE_NAND);
+ }
+
+ return rc;
+}