diff options
Diffstat (limited to 'firmware/target')
-rw-r--r-- | firmware/target/mips/ingenic_jz47xx/ata-sd-jz4740.c | 27 |
1 files changed, 19 insertions, 8 deletions
diff --git a/firmware/target/mips/ingenic_jz47xx/ata-sd-jz4740.c b/firmware/target/mips/ingenic_jz47xx/ata-sd-jz4740.c index 8c1c335c13..b558c4f87c 100644 --- a/firmware/target/mips/ingenic_jz47xx/ata-sd-jz4740.c +++ b/firmware/target/mips/ingenic_jz47xx/ata-sd-jz4740.c | |||
@@ -1216,6 +1216,7 @@ static int sd_init_device(void) | |||
1216 | while((retval = sd_init_card_state(&init_req)) == SD_INIT_DOING); | 1216 | while((retval = sd_init_card_state(&init_req)) == SD_INIT_DOING); |
1217 | retval = (retval == SD_INIT_PASSED ? sd_select_card() : -1); | 1217 | retval = (retval == SD_INIT_PASSED ? sd_select_card() : -1); |
1218 | 1218 | ||
1219 | __cpm_stop_msc(); /* disable SD clock */ | ||
1219 | mutex_unlock(&sd_mtx); | 1220 | mutex_unlock(&sd_mtx); |
1220 | 1221 | ||
1221 | return retval; | 1222 | return retval; |
@@ -1250,13 +1251,26 @@ tCardInfo* card_get_info_target(int card_no) | |||
1250 | return &card; | 1251 | return &card; |
1251 | } | 1252 | } |
1252 | 1253 | ||
1254 | static inline void sd_start_transfer(void) | ||
1255 | { | ||
1256 | mutex_lock(&sd_mtx); | ||
1257 | __cpm_start_msc(); | ||
1258 | led(true); | ||
1259 | } | ||
1260 | |||
1261 | static inline void sd_stop_transfer(void) | ||
1262 | { | ||
1263 | led(false); | ||
1264 | __cpm_stop_msc(); | ||
1265 | mutex_unlock(&sd_mtx); | ||
1266 | } | ||
1267 | |||
1253 | int sd_read_sectors(IF_MV2(int drive,) unsigned long start, int count, void* buf) | 1268 | int sd_read_sectors(IF_MV2(int drive,) unsigned long start, int count, void* buf) |
1254 | { | 1269 | { |
1255 | #ifdef HAVE_MULTIVOLUME | 1270 | #ifdef HAVE_MULTIVOLUME |
1256 | (void)drive; | 1271 | (void)drive; |
1257 | #endif | 1272 | #endif |
1258 | mutex_lock(&sd_mtx); | 1273 | sd_start_transfer(); |
1259 | led(true); | ||
1260 | 1274 | ||
1261 | struct sd_request request; | 1275 | struct sd_request request; |
1262 | struct sd_response_r1 r1; | 1276 | struct sd_response_r1 r1; |
@@ -1300,8 +1314,7 @@ int sd_read_sectors(IF_MV2(int drive,) unsigned long start, int count, void* buf | |||
1300 | goto err; | 1314 | goto err; |
1301 | 1315 | ||
1302 | err: | 1316 | err: |
1303 | led(false); | 1317 | sd_stop_transfer(); |
1304 | mutex_unlock(&sd_mtx); | ||
1305 | 1318 | ||
1306 | return retval; | 1319 | return retval; |
1307 | } | 1320 | } |
@@ -1311,8 +1324,7 @@ int sd_write_sectors(IF_MV2(int drive,) unsigned long start, int count, const vo | |||
1311 | #ifdef HAVE_MULTIVOLUME | 1324 | #ifdef HAVE_MULTIVOLUME |
1312 | (void)drive; | 1325 | (void)drive; |
1313 | #endif | 1326 | #endif |
1314 | mutex_lock(&sd_mtx); | 1327 | sd_start_transfer(); |
1315 | led(true); | ||
1316 | 1328 | ||
1317 | struct sd_request request; | 1329 | struct sd_request request; |
1318 | struct sd_response_r1 r1; | 1330 | struct sd_response_r1 r1; |
@@ -1357,8 +1369,7 @@ int sd_write_sectors(IF_MV2(int drive,) unsigned long start, int count, const vo | |||
1357 | goto err; | 1369 | goto err; |
1358 | 1370 | ||
1359 | err: | 1371 | err: |
1360 | led(false); | 1372 | sd_stop_transfer(); |
1361 | mutex_unlock(&sd_mtx); | ||
1362 | 1373 | ||
1363 | return retval; | 1374 | return retval; |
1364 | } | 1375 | } |