summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrank Gevaerts <frank@gevaerts.be>2010-06-06 13:20:47 +0000
committerFrank Gevaerts <frank@gevaerts.be>2010-06-06 13:20:47 +0000
commit9c43b2ce17cbc1f88b825ab8a5021575cee46dd7 (patch)
tree8d96e95861b3b0df1a7efa6b660395c317ecb475
parent4a2cab6aa1008a4f5ac05dac44c99b7f1a05e8f4 (diff)
downloadrockbox-9c43b2ce17cbc1f88b825ab8a5021575cee46dd7.tar.gz
rockbox-9c43b2ce17cbc1f88b825ab8a5021575cee46dd7.zip
Remove card_enable_monitoring() and use a mutex instead. The card_enable_monitoring() method actually didn't eliminate the possible race conditions it was meant to fix.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@26627 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/main.c3
-rw-r--r--firmware/common/disk.c34
-rw-r--r--firmware/drivers/ata_mmc.c60
-rw-r--r--firmware/export/disk.h3
-rw-r--r--firmware/export/sd.h1
-rw-r--r--firmware/export/sdmmc.h5
-rw-r--r--firmware/target/arm/as3525/sd-as3525.c12
-rw-r--r--firmware/target/arm/as3525/sd-as3525v2.c11
-rw-r--r--firmware/target/arm/ata-sd-pp.c27
-rw-r--r--firmware/target/arm/s3c2440/sd-s3c2440.c21
-rw-r--r--firmware/target/arm/tcc780x/sd-tcc780x.c13
-rw-r--r--firmware/target/mips/ingenic_jz47xx/ata-sd-jz4740.c8
12 files changed, 73 insertions, 125 deletions
diff --git a/apps/main.c b/apps/main.c
index e8043a79d4..f8dddcd9ae 100644
--- a/apps/main.c
+++ b/apps/main.c
@@ -342,6 +342,7 @@ static void init(void)
342 sb_skin_init(); 342 sb_skin_init();
343 viewportmanager_init(); 343 viewportmanager_init();
344 344
345 disk_init_subsystem();
345 storage_init(); 346 storage_init();
346 settings_reset(); 347 settings_reset();
347 settings_load(SETTINGS_ALL); 348 settings_load(SETTINGS_ALL);
@@ -506,6 +507,8 @@ static void init(void)
506 } 507 }
507#endif 508#endif
508 509
510
511 disk_init_subsystem();
509 CHART(">storage_init"); 512 CHART(">storage_init");
510 rc = storage_init(); 513 rc = storage_init();
511 CHART("<storage_init"); 514 CHART("<storage_init");
diff --git a/firmware/common/disk.c b/firmware/common/disk.c
index 8d93f3b8cd..bc0ad793d2 100644
--- a/firmware/common/disk.c
+++ b/firmware/common/disk.c
@@ -19,11 +19,11 @@
19 * 19 *
20 ****************************************************************************/ 20 ****************************************************************************/
21#include <stdio.h> 21#include <stdio.h>
22#include "kernel.h"
22#include "storage.h" 23#include "storage.h"
23#include "debug.h" 24#include "debug.h"
24#include "fat.h" 25#include "fat.h"
25#ifdef HAVE_HOTSWAP 26#ifdef HAVE_HOTSWAP
26#include "sdmmc.h" /* for card_enable_monitoring() */
27#include "dir.h" /* for release_dirs() */ 27#include "dir.h" /* for release_dirs() */
28#include "file.h" /* for release_files() */ 28#include "file.h" /* for release_files() */
29#endif 29#endif
@@ -60,12 +60,13 @@ static const unsigned char fat_partition_types[] = {
60 60
61static struct partinfo part[NUM_DRIVES*4]; /* space for 4 partitions on 2 drives */ 61static struct partinfo part[NUM_DRIVES*4]; /* space for 4 partitions on 2 drives */
62static int vol_drive[NUM_VOLUMES]; /* mounted to which drive (-1 if none) */ 62static int vol_drive[NUM_VOLUMES]; /* mounted to which drive (-1 if none) */
63static struct mutex disk_mutex;
63 64
64#ifdef MAX_LOG_SECTOR_SIZE 65#ifdef MAX_LOG_SECTOR_SIZE
65int disk_sector_multiplier = 1; 66int disk_sector_multiplier = 1;
66#endif 67#endif
67 68
68struct partinfo* disk_init(IF_MD_NONVOID(int drive)) 69static struct partinfo* disk_init(IF_MD_NONVOID(int drive))
69{ 70{
70 int i; 71 int i;
71 unsigned char sector[SECTOR_SIZE]; 72 unsigned char sector[SECTOR_SIZE];
@@ -113,13 +114,18 @@ struct partinfo* disk_partinfo(int partition)
113 return &part[partition]; 114 return &part[partition];
114} 115}
115 116
117void disk_init_subsystem(void)
118{
119 mutex_init(&disk_mutex);
120}
121
116int disk_mount_all(void) 122int disk_mount_all(void)
117{ 123{
118 int mounted=0; 124 int mounted=0;
119 int i; 125 int i;
120 126
121#ifdef HAVE_HOTSWAP 127#ifdef HAVE_HOTSWAP
122 card_enable_monitoring(false); 128 mutex_lock(&disk_mutex);
123#endif 129#endif
124 130
125 fat_init(); /* reset all mounted partitions */ 131 fat_init(); /* reset all mounted partitions */
@@ -139,9 +145,8 @@ int disk_mount_all(void)
139#endif 145#endif
140 146
141#ifdef HAVE_HOTSWAP 147#ifdef HAVE_HOTSWAP
142 card_enable_monitoring(true); 148 mutex_unlock(&disk_mutex);
143#endif 149#endif
144
145 return mounted; 150 return mounted;
146} 151}
147 152
@@ -160,11 +165,21 @@ static int get_free_volume(void)
160int disk_mount(int drive) 165int disk_mount(int drive)
161{ 166{
162 int mounted = 0; /* reset partition-on-drive flag */ 167 int mounted = 0; /* reset partition-on-drive flag */
163 int volume = get_free_volume(); 168 int volume;
164 struct partinfo* pinfo = disk_init(IF_MD(drive)); 169 struct partinfo* pinfo;
170
171#ifdef HAVE_HOTSWAP
172 mutex_lock(&disk_mutex);
173#endif
174
175 volume = get_free_volume();
176 pinfo = disk_init(IF_MD(drive));
165 177
166 if (pinfo == NULL) 178 if (pinfo == NULL)
167 { 179 {
180#ifdef HAVE_HOTSWAP
181 mutex_unlock(&disk_mutex);
182#endif
168 return 0; 183 return 0;
169 } 184 }
170#if defined(TOSHIBA_GIGABEAT_S) 185#if defined(TOSHIBA_GIGABEAT_S)
@@ -214,6 +229,9 @@ int disk_mount(int drive)
214 vol_drive[volume] = drive; /* remember the drive for this volume */ 229 vol_drive[volume] = drive; /* remember the drive for this volume */
215 } 230 }
216 } 231 }
232#ifdef HAVE_HOTSWAP
233 mutex_unlock(&disk_mutex);
234#endif
217 return mounted; 235 return mounted;
218} 236}
219 237
@@ -222,6 +240,7 @@ int disk_unmount(int drive)
222{ 240{
223 int unmounted = 0; 241 int unmounted = 0;
224 int i; 242 int i;
243 mutex_lock(&disk_mutex);
225 for (i=0; i<NUM_VOLUMES; i++) 244 for (i=0; i<NUM_VOLUMES; i++)
226 { 245 {
227 if (vol_drive[i] == drive) 246 if (vol_drive[i] == drive)
@@ -233,6 +252,7 @@ int disk_unmount(int drive)
233 fat_unmount(i, false); 252 fat_unmount(i, false);
234 } 253 }
235 } 254 }
255 mutex_unlock(&disk_mutex);
236 256
237 return unmounted; 257 return unmounted;
238} 258}
diff --git a/firmware/drivers/ata_mmc.c b/firmware/drivers/ata_mmc.c
index 5da0b44292..c27c3b5d05 100644
--- a/firmware/drivers/ata_mmc.c
+++ b/firmware/drivers/ata_mmc.c
@@ -93,7 +93,6 @@ static long last_disk_activity = -1;
93static struct mutex mmc_mutex; 93static struct mutex mmc_mutex;
94 94
95#ifdef HAVE_HOTSWAP 95#ifdef HAVE_HOTSWAP
96static bool mmc_monitor_enabled = true;
97static long mmc_stack[((DEFAULT_STACK_SIZE*2) + 0x800)/sizeof(long)]; 96static long mmc_stack[((DEFAULT_STACK_SIZE*2) + 0x800)/sizeof(long)];
98#else 97#else
99static long mmc_stack[(DEFAULT_STACK_SIZE*2)/sizeof(long)]; 98static long mmc_stack[(DEFAULT_STACK_SIZE*2)/sizeof(long)];
@@ -130,7 +129,9 @@ static tCardInfo card_info[2];
130static int current_card = 0; 129static int current_card = 0;
131#endif 130#endif
132static bool last_mmc_status = false; 131static bool last_mmc_status = false;
133static int countdown = HZ/3; /* for mmc switch debouncing */ 132static int countdown = -1; /* for mmc switch debouncing. -1 because the
133 countdown should not happen if the card
134 is inserted at boot */
134static bool usb_activity; /* monitoring the USB bridge */ 135static bool usb_activity; /* monitoring the USB bridge */
135static long last_usb_activity; 136static long last_usb_activity;
136 137
@@ -807,13 +808,6 @@ static void mmc_thread(void)
807 } 808 }
808} 809}
809 810
810#ifdef HAVE_HOTSWAP
811void mmc_enable_monitoring(bool on)
812{
813 mmc_monitor_enabled = on;
814}
815#endif
816
817bool mmc_detect(void) 811bool mmc_detect(void)
818{ 812{
819 return (adc_read(ADC_MMC_SWITCH) < 0x200); 813 return (adc_read(ADC_MMC_SWITCH) < 0x200);
@@ -846,9 +840,6 @@ bool mmc_usb_active(int delayticks)
846static void mmc_tick(void) 840static void mmc_tick(void)
847{ 841{
848 bool current_status; 842 bool current_status;
849#ifndef HAVE_HOTSWAP
850 const bool mmc_monitor_enabled = true;
851#endif
852 843
853 if (new_mmc_circuit) 844 if (new_mmc_circuit)
854 /* USB bridge activity is 0 on idle, ~527 on active */ 845 /* USB bridge activity is 0 on idle, ~527 on active */
@@ -860,33 +851,30 @@ static void mmc_tick(void)
860 last_usb_activity = current_tick; 851 last_usb_activity = current_tick;
861 usb_activity = current_status; 852 usb_activity = current_status;
862 853
863 if (mmc_monitor_enabled) 854 current_status = mmc_detect();
855 /* Only report when the status has changed */
856 if (current_status != last_mmc_status)
864 { 857 {
865 current_status = mmc_detect(); 858 last_mmc_status = current_status;
866 /* Only report when the status has changed */ 859 countdown = HZ/3;
867 if (current_status != last_mmc_status) 860 }
868 { 861 else
869 last_mmc_status = current_status; 862 {
870 countdown = HZ/3; 863 /* Count down until it gets negative */
871 } 864 if (countdown >= 0)
872 else 865 countdown--;
873 {
874 /* Count down until it gets negative */
875 if (countdown >= 0)
876 countdown--;
877 866
878 if (countdown == 0) 867 if (countdown == 0)
868 {
869 if (current_status)
879 { 870 {
880 if (current_status) 871 queue_broadcast(SYS_HOTSWAP_INSERTED, 0);
881 { 872 }
882 queue_broadcast(SYS_HOTSWAP_INSERTED, 0); 873 else
883 } 874 {
884 else 875 queue_broadcast(SYS_HOTSWAP_EXTRACTED, 0);
885 { 876 mmc_status = MMC_UNTOUCHED;
886 queue_broadcast(SYS_HOTSWAP_EXTRACTED, 0); 877 card_info[1].initialized = false;
887 mmc_status = MMC_UNTOUCHED;
888 card_info[1].initialized = false;
889 }
890 } 878 }
891 } 879 }
892 } 880 }
diff --git a/firmware/export/disk.h b/firmware/export/disk.h
index cd937fdf66..d73a2a7f88 100644
--- a/firmware/export/disk.h
+++ b/firmware/export/disk.h
@@ -35,8 +35,9 @@ struct partinfo {
35#define PARTITION_TYPE_OS2_HIDDEN_C_DRIVE 0x84 35#define PARTITION_TYPE_OS2_HIDDEN_C_DRIVE 0x84
36 36
37/* returns a pointer to an array of 8 partinfo structs */ 37/* returns a pointer to an array of 8 partinfo structs */
38struct partinfo* disk_init(IF_MD_NONVOID(int drive));
39struct partinfo* disk_partinfo(int partition); 38struct partinfo* disk_partinfo(int partition);
39
40void disk_init_subsystem(void); /* Initialises mutexes */
40int disk_mount_all(void); /* returns the # of successful mounts */ 41int disk_mount_all(void); /* returns the # of successful mounts */
41int disk_mount(int drive); 42int disk_mount(int drive);
42int disk_unmount(int drive); 43int disk_unmount(int drive);
diff --git a/firmware/export/sd.h b/firmware/export/sd.h
index 1c61364566..c798f54e9a 100644
--- a/firmware/export/sd.h
+++ b/firmware/export/sd.h
@@ -48,7 +48,6 @@ void sd_get_info(IF_MD2(int drive,) struct storage_info *info);
48#ifdef HAVE_HOTSWAP 48#ifdef HAVE_HOTSWAP
49bool sd_removable(IF_MV_NONVOID(int drive)); 49bool sd_removable(IF_MV_NONVOID(int drive));
50bool sd_present(IF_MV_NONVOID(int drive)); 50bool sd_present(IF_MV_NONVOID(int drive));
51void card_enable_monitoring_target(bool on);
52#endif 51#endif
53 52
54long sd_last_disk_activity(void); 53long sd_last_disk_activity(void);
diff --git a/firmware/export/sdmmc.h b/firmware/export/sdmmc.h
index 6ac3bd2af5..4351c85c42 100644
--- a/firmware/export/sdmmc.h
+++ b/firmware/export/sdmmc.h
@@ -57,17 +57,12 @@ typedef struct
57tCardInfo *card_get_info_target(int card_no); 57tCardInfo *card_get_info_target(int card_no);
58void sd_parse_csd(tCardInfo *card); 58void sd_parse_csd(tCardInfo *card);
59 59
60#ifdef HAVE_HOTSWAP
61#define card_enable_monitoring card_enable_monitoring_target
62#endif
63
64#else /* STORAGE_MMC */ 60#else /* STORAGE_MMC */
65 61
66#include "ata_mmc.h" 62#include "ata_mmc.h"
67#define card_get_info mmc_card_info 63#define card_get_info mmc_card_info
68tCardInfo *mmc_card_info(int card_no); 64tCardInfo *mmc_card_info(int card_no);
69#define card_touched mmc_touched 65#define card_touched mmc_touched
70#define card_enable_monitoring mmc_enable_monitoring
71 66
72#endif 67#endif
73 68
diff --git a/firmware/target/arm/as3525/sd-as3525.c b/firmware/target/arm/as3525/sd-as3525.c
index 9c0b4124ac..8aaae55cf4 100644
--- a/firmware/target/arm/as3525/sd-as3525.c
+++ b/firmware/target/arm/as3525/sd-as3525.c
@@ -508,6 +508,8 @@ static void init_pl180_controller(const int drive)
508 GPIOA_IS &= ~EXT_SD_BITS; 508 GPIOA_IS &= ~EXT_SD_BITS;
509 /* detect both raising and falling edges */ 509 /* detect both raising and falling edges */
510 GPIOA_IBE |= EXT_SD_BITS; 510 GPIOA_IBE |= EXT_SD_BITS;
511 /* enable the card detect interrupt */
512 GPIOA_IE |= EXT_SD_BITS;
511 513
512#else 514#else
513 VIC_INT_ENABLE = INTERRUPT_NAND; 515 VIC_INT_ENABLE = INTERRUPT_NAND;
@@ -922,16 +924,6 @@ tCardInfo *card_get_info_target(int card_no)
922 return &card_info[card_no]; 924 return &card_info[card_no];
923} 925}
924 926
925#ifdef HAVE_HOTSWAP
926void card_enable_monitoring_target(bool on)
927{
928 if (on) /* enable interrupt */
929 GPIOA_IE |= EXT_SD_BITS;
930 else /* disable interrupt */
931 GPIOA_IE &= ~EXT_SD_BITS;
932}
933#endif /* HAVE_HOTSWAP */
934
935#endif /* !BOOTLOADER */ 927#endif /* !BOOTLOADER */
936 928
937#ifdef CONFIG_STORAGE_MULTI 929#ifdef CONFIG_STORAGE_MULTI
diff --git a/firmware/target/arm/as3525/sd-as3525v2.c b/firmware/target/arm/as3525/sd-as3525v2.c
index ccc88be25d..1a555e745d 100644
--- a/firmware/target/arm/as3525/sd-as3525v2.c
+++ b/firmware/target/arm/as3525/sd-as3525v2.c
@@ -731,6 +731,9 @@ int sd_init(void)
731 GPIOA_IS &= ~EXT_SD_BITS; 731 GPIOA_IS &= ~EXT_SD_BITS;
732 /* detect both raising and falling edges */ 732 /* detect both raising and falling edges */
733 GPIOA_IBE |= EXT_SD_BITS; 733 GPIOA_IBE |= EXT_SD_BITS;
734 /* enable the card detect interrupt */
735 GPIOA_IE |= EXT_SD_BITS;
736
734 /* Configure XPD for SD-MCI interface */ 737 /* Configure XPD for SD-MCI interface */
735 CCU_IO |= (1<<2); 738 CCU_IO |= (1<<2);
736#endif 739#endif
@@ -989,14 +992,6 @@ void sd_gpioa_isr(void)
989 /* acknowledge interrupt */ 992 /* acknowledge interrupt */
990 GPIOA_IC = EXT_SD_BITS; 993 GPIOA_IC = EXT_SD_BITS;
991} 994}
992
993void card_enable_monitoring_target(bool on)
994{
995 if (on) /* enable interrupt */
996 GPIOA_IE |= EXT_SD_BITS;
997 else /* disable interrupt */
998 GPIOA_IE &= ~EXT_SD_BITS;
999}
1000#endif /* HAVE_HOTSWAP */ 995#endif /* HAVE_HOTSWAP */
1001 996
1002#ifdef CONFIG_STORAGE_MULTI 997#ifdef CONFIG_STORAGE_MULTI
diff --git a/firmware/target/arm/ata-sd-pp.c b/firmware/target/arm/ata-sd-pp.c
index f7b4a992e4..a2dcfe518f 100644
--- a/firmware/target/arm/ata-sd-pp.c
+++ b/firmware/target/arm/ata-sd-pp.c
@@ -1190,27 +1190,6 @@ void sd_enable(bool on)
1190 } 1190 }
1191} 1191}
1192 1192
1193#ifdef HAVE_HOTSWAP
1194void card_enable_monitoring_target(bool on)
1195{
1196 if (on)
1197 {
1198#ifdef SANSA_E200
1199 GPIO_SET_BITWISE(GPIOA_INT_EN, 0x80);
1200#elif defined(SANSA_C200)
1201 GPIO_SET_BITWISE(GPIOL_INT_EN, 0x08);
1202#endif
1203 }
1204 else
1205 {
1206#ifdef SANSA_E200
1207 GPIO_CLEAR_BITWISE(GPIOA_INT_EN, 0x80);
1208#elif defined(SANSA_C200)
1209 GPIO_CLEAR_BITWISE(GPIOL_INT_EN, 0x08);
1210#endif
1211 }
1212}
1213#endif
1214 1193
1215int sd_init(void) 1194int sd_init(void)
1216{ 1195{
@@ -1275,6 +1254,9 @@ int sd_init(void)
1275 GPIOA_INT_LEV = (0x80 << 8) | (~GPIOA_INPUT_VAL & 0x80); 1254 GPIOA_INT_LEV = (0x80 << 8) | (~GPIOA_INPUT_VAL & 0x80);
1276 1255
1277 GPIOA_INT_CLR = 0x80; 1256 GPIOA_INT_CLR = 0x80;
1257
1258 /* enable the card detect interrupt */
1259 GPIO_SET_BITWISE(GPIOA_INT_EN, 0x80);
1278#elif defined SANSA_C200 1260#elif defined SANSA_C200
1279 CPU_INT_EN = HI_MASK; 1261 CPU_INT_EN = HI_MASK;
1280 CPU_HI_INT_EN = GPIO2_MASK; 1262 CPU_HI_INT_EN = GPIO2_MASK;
@@ -1282,6 +1264,9 @@ int sd_init(void)
1282 GPIOL_INT_LEV = (0x08 << 8) | (~GPIOL_INPUT_VAL & 0x08); 1264 GPIOL_INT_LEV = (0x08 << 8) | (~GPIOL_INPUT_VAL & 0x08);
1283 1265
1284 GPIOL_INT_CLR = 0x08; 1266 GPIOL_INT_CLR = 0x08;
1267
1268 /* enable the card detect interrupt */
1269 GPIO_SET_BITWISE(GPIOL_INT_EN, 0x08);
1285#endif 1270#endif
1286#endif 1271#endif
1287 } 1272 }
diff --git a/firmware/target/arm/s3c2440/sd-s3c2440.c b/firmware/target/arm/s3c2440/sd-s3c2440.c
index 33b995213e..f4c8a4f599 100644
--- a/firmware/target/arm/s3c2440/sd-s3c2440.c
+++ b/firmware/target/arm/s3c2440/sd-s3c2440.c
@@ -270,6 +270,11 @@ static void init_sdi_controller(const int card_no)
270 270
271 /* Card Detect input */ 271 /* Card Detect input */
272 S3C2440_GPIO_CONFIG (GPGCON, 8, GPIO_INPUT); 272 S3C2440_GPIO_CONFIG (GPGCON, 8, GPIO_INPUT);
273 /* enable external irq 8-23 on the internal interrupt controller */
274 INTMSK &= ~1<<5;
275 /* enable GPG8 IRQ on the external interrupt controller */
276 EINTMASK &= ~(1<<16);
277
273 278
274 /* Write Protect input */ 279 /* Write Protect input */
275 S3C2440_GPIO_CONFIG (GPHCON, 8, GPIO_INPUT); 280 S3C2440_GPIO_CONFIG (GPHCON, 8, GPIO_INPUT);
@@ -523,22 +528,6 @@ static int sd1_oneshot_callback(struct timeout *tmo)
523 return 0; 528 return 0;
524} 529}
525 530
526void card_enable_monitoring_target(bool on)
527{
528 if (on)
529 { /* enable external irq 8-23 on the internal interrupt controller */
530 INTMSK &= ~1<<5;
531 /* enable GPG8 IRQ on the external interrupt controller */
532 EINTMASK &= ~(1<<16);
533 }
534 else
535 {
536 /* mask internal and external IRQs */
537 INTMSK |= 1<<5;
538 EINTMASK |= (1<<16);
539 }
540}
541
542void EINT8_23(void) 531void EINT8_23(void)
543{ 532{
544 static struct timeout sd1_oneshot; 533 static struct timeout sd1_oneshot;
diff --git a/firmware/target/arm/tcc780x/sd-tcc780x.c b/firmware/target/arm/tcc780x/sd-tcc780x.c
index bfab9fdddd..88ccf187f0 100644
--- a/firmware/target/arm/tcc780x/sd-tcc780x.c
+++ b/firmware/target/arm/tcc780x/sd-tcc780x.c
@@ -214,18 +214,6 @@ static inline bool card_detect_target(void)
214#endif 214#endif
215} 215}
216 216
217void card_enable_monitoring_target(bool on)
218{
219 if (on)
220 {
221 IEN |= EXT0_IRQ_MASK;
222 }
223 else
224 {
225 IEN &= ~EXT0_IRQ_MASK;
226 }
227}
228
229static int sd1_oneshot_callback(struct timeout *tmo) 217static int sd1_oneshot_callback(struct timeout *tmo)
230{ 218{
231 (void)tmo; 219 (void)tmo;
@@ -786,6 +774,7 @@ int sd_init(void)
786 /* Configure interrupts for the card slot */ 774 /* Configure interrupts for the card slot */
787 TMODE &= ~EXT0_IRQ_MASK; /* edge-triggered */ 775 TMODE &= ~EXT0_IRQ_MASK; /* edge-triggered */
788 TMODEA |= EXT0_IRQ_MASK; /* trigger on both edges */ 776 TMODEA |= EXT0_IRQ_MASK; /* trigger on both edges */
777 IEN |= EXT0_IRQ_MASK; /* enable the interrupt */
789#endif 778#endif
790 } 779 }
791 780
diff --git a/firmware/target/mips/ingenic_jz47xx/ata-sd-jz4740.c b/firmware/target/mips/ingenic_jz47xx/ata-sd-jz4740.c
index be534bf24e..8fdf7d0287 100644
--- a/firmware/target/mips/ingenic_jz47xx/ata-sd-jz4740.c
+++ b/firmware/target/mips/ingenic_jz47xx/ata-sd-jz4740.c
@@ -1412,14 +1412,6 @@ bool sd_removable(IF_MV_NONVOID(int drive))
1412 return true; 1412 return true;
1413} 1413}
1414 1414
1415void card_enable_monitoring_target(bool on)
1416{
1417 if(on)
1418 sd_gpio_setup_irq(card_detect_target());
1419 else
1420 __gpio_mask_irq(MMC_CD_PIN);
1421}
1422
1423static int sd_oneshot_callback(struct timeout *tmo) 1415static int sd_oneshot_callback(struct timeout *tmo)
1424{ 1416{
1425 (void)tmo; 1417 (void)tmo;