summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
Diffstat (limited to 'firmware')
-rw-r--r--firmware/target/mips/ingenic_jz47xx/ata-sd-jz4740.c27
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
1254static inline void sd_start_transfer(void)
1255{
1256 mutex_lock(&sd_mtx);
1257 __cpm_start_msc();
1258 led(true);
1259}
1260
1261static inline void sd_stop_transfer(void)
1262{
1263 led(false);
1264 __cpm_stop_msc();
1265 mutex_unlock(&sd_mtx);
1266}
1267
1253int sd_read_sectors(IF_MV2(int drive,) unsigned long start, int count, void* buf) 1268int 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
1302err: 1316err:
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
1359err: 1371err:
1360 led(false); 1372 sd_stop_transfer();
1361 mutex_unlock(&sd_mtx);
1362 1373
1363 return retval; 1374 return retval;
1364} 1375}