diff options
Diffstat (limited to 'firmware/target/arm')
-rw-r--r-- | firmware/target/arm/s5l8700/ata-nand-s5l8700.c | 31 |
1 files changed, 28 insertions, 3 deletions
diff --git a/firmware/target/arm/s5l8700/ata-nand-s5l8700.c b/firmware/target/arm/s5l8700/ata-nand-s5l8700.c index 308f0a5e61..d00580279b 100644 --- a/firmware/target/arm/s5l8700/ata-nand-s5l8700.c +++ b/firmware/target/arm/s5l8700/ata-nand-s5l8700.c | |||
@@ -37,6 +37,8 @@ long last_disk_activity = -1; | |||
37 | /** static, private data **/ | 37 | /** static, private data **/ |
38 | static bool initialized = false; | 38 | static bool initialized = false; |
39 | 39 | ||
40 | static long nand_stack[20]; | ||
41 | |||
40 | /* API Functions */ | 42 | /* API Functions */ |
41 | 43 | ||
42 | void nand_led(bool onoff) | 44 | void nand_led(bool onoff) |
@@ -47,13 +49,17 @@ void nand_led(bool onoff) | |||
47 | int nand_read_sectors(IF_MD2(int drive,) unsigned long start, int incount, | 49 | int nand_read_sectors(IF_MD2(int drive,) unsigned long start, int incount, |
48 | void* inbuf) | 50 | void* inbuf) |
49 | { | 51 | { |
50 | return ftl_read(start, incount, inbuf); | 52 | int rc = ftl_read(start, incount, inbuf); |
53 | last_disk_activity = current_tick; | ||
54 | return rc; | ||
51 | } | 55 | } |
52 | 56 | ||
53 | int nand_write_sectors(IF_MD2(int drive,) unsigned long start, int count, | 57 | int nand_write_sectors(IF_MD2(int drive,) unsigned long start, int count, |
54 | const void* outbuf) | 58 | const void* outbuf) |
55 | { | 59 | { |
56 | return ftl_write(start, count, outbuf); | 60 | int rc = ftl_write(start, count, outbuf); |
61 | last_disk_activity = current_tick; | ||
62 | return rc; | ||
57 | } | 63 | } |
58 | 64 | ||
59 | void nand_spindown(int seconds) | 65 | void nand_spindown(int seconds) |
@@ -73,6 +79,7 @@ void nand_sleepnow(void) | |||
73 | 79 | ||
74 | void nand_spin(void) | 80 | void nand_spin(void) |
75 | { | 81 | { |
82 | last_disk_activity = current_tick; | ||
76 | nand_power_up(); | 83 | nand_power_up(); |
77 | } | 84 | } |
78 | 85 | ||
@@ -88,20 +95,38 @@ void nand_get_info(IF_MD2(int drive,) struct storage_info *info) | |||
88 | 95 | ||
89 | long nand_last_disk_activity(void) | 96 | long nand_last_disk_activity(void) |
90 | { | 97 | { |
91 | return 0; | 98 | return last_disk_activity; |
92 | } | 99 | } |
93 | 100 | ||
94 | #ifdef HAVE_STORAGE_FLUSH | 101 | #ifdef HAVE_STORAGE_FLUSH |
95 | int nand_flush(void) | 102 | int nand_flush(void) |
96 | { | 103 | { |
104 | last_disk_activity = current_tick; | ||
97 | return ftl_sync(); | 105 | return ftl_sync(); |
98 | } | 106 | } |
99 | #endif | 107 | #endif |
100 | 108 | ||
109 | static void nand_thread(void) | ||
110 | { | ||
111 | while (1) | ||
112 | { | ||
113 | if (TIME_AFTER(current_tick, last_disk_activity + HZ / 5)) | ||
114 | nand_power_down(); | ||
115 | sleep(HZ / 10); | ||
116 | } | ||
117 | } | ||
118 | |||
101 | int nand_init(void) | 119 | int nand_init(void) |
102 | { | 120 | { |
103 | if (ftl_init()) return 1; | 121 | if (ftl_init()) return 1; |
104 | 122 | ||
123 | last_disk_activity = current_tick; | ||
124 | |||
125 | create_thread(nand_thread, nand_stack, | ||
126 | sizeof(nand_stack), 0, "nand" | ||
127 | IF_PRIO(, PRIORITY_USER_INTERFACE) | ||
128 | IF_COP(, CPU)); | ||
129 | |||
105 | initialized = true; | 130 | initialized = true; |
106 | return 0; | 131 | return 0; |
107 | } | 132 | } |