@@ -1044,6 +1044,7 @@ static int mmc_select_hs400(struct mmc_card *card)
1044
1044
{
1045
1045
struct mmc_host * host = card -> host ;
1046
1046
int err = 0 ;
1047
+ u8 val ;
1047
1048
1048
1049
/*
1049
1050
* HS400 mode requires 8-bit bus width
@@ -1059,8 +1060,10 @@ static int mmc_select_hs400(struct mmc_card *card)
1059
1060
mmc_set_timing (card -> host , MMC_TIMING_MMC_HS );
1060
1061
mmc_set_bus_speed (card );
1061
1062
1063
+ val = EXT_CSD_TIMING_HS |
1064
+ card -> drive_strength << EXT_CSD_DRV_STR_SHIFT ;
1062
1065
err = __mmc_switch (card , EXT_CSD_CMD_SET_NORMAL ,
1063
- EXT_CSD_HS_TIMING , EXT_CSD_TIMING_HS ,
1066
+ EXT_CSD_HS_TIMING , val ,
1064
1067
card -> ext_csd .generic_cmd6_time ,
1065
1068
true, true, true);
1066
1069
if (err ) {
@@ -1079,8 +1082,10 @@ static int mmc_select_hs400(struct mmc_card *card)
1079
1082
return err ;
1080
1083
}
1081
1084
1085
+ val = EXT_CSD_TIMING_HS400 |
1086
+ card -> drive_strength << EXT_CSD_DRV_STR_SHIFT ;
1082
1087
err = __mmc_switch (card , EXT_CSD_CMD_SET_NORMAL ,
1083
- EXT_CSD_HS_TIMING , EXT_CSD_TIMING_HS400 ,
1088
+ EXT_CSD_HS_TIMING , val ,
1084
1089
card -> ext_csd .generic_cmd6_time ,
1085
1090
true, true, true);
1086
1091
if (err ) {
@@ -1119,6 +1124,7 @@ int mmc_hs400_to_hs200(struct mmc_card *card)
1119
1124
bool send_status = true;
1120
1125
unsigned int max_dtr ;
1121
1126
int err ;
1127
+ u8 val ;
1122
1128
1123
1129
if (host -> caps & MMC_CAP_WAIT_WHILE_BUSY )
1124
1130
send_status = false;
@@ -1128,8 +1134,10 @@ int mmc_hs400_to_hs200(struct mmc_card *card)
1128
1134
mmc_set_clock (host , max_dtr );
1129
1135
1130
1136
/* Switch HS400 to HS DDR */
1137
+ val = EXT_CSD_TIMING_HS |
1138
+ card -> drive_strength << EXT_CSD_DRV_STR_SHIFT ;
1131
1139
err = __mmc_switch (card , EXT_CSD_CMD_SET_NORMAL , EXT_CSD_HS_TIMING ,
1132
- EXT_CSD_TIMING_HS , card -> ext_csd .generic_cmd6_time ,
1140
+ val , card -> ext_csd .generic_cmd6_time ,
1133
1141
true, send_status , true);
1134
1142
if (err )
1135
1143
goto out_err ;
@@ -1158,10 +1166,11 @@ int mmc_hs400_to_hs200(struct mmc_card *card)
1158
1166
}
1159
1167
1160
1168
/* Switch HS to HS200 */
1169
+ val = EXT_CSD_TIMING_HS200 |
1170
+ card -> drive_strength << EXT_CSD_DRV_STR_SHIFT ;
1161
1171
err = __mmc_switch (card , EXT_CSD_CMD_SET_NORMAL , EXT_CSD_HS_TIMING ,
1162
- EXT_CSD_TIMING_HS200 ,
1163
- card -> ext_csd .generic_cmd6_time , true, send_status ,
1164
- true);
1172
+ val , card -> ext_csd .generic_cmd6_time , true,
1173
+ send_status , true);
1165
1174
if (err )
1166
1175
goto out_err ;
1167
1176
@@ -1183,6 +1192,23 @@ int mmc_hs400_to_hs200(struct mmc_card *card)
1183
1192
return err ;
1184
1193
}
1185
1194
1195
+ static void mmc_select_driver_type (struct mmc_card * card )
1196
+ {
1197
+ int card_drv_type , drive_strength , drv_type ;
1198
+
1199
+ card_drv_type = card -> ext_csd .raw_driver_strength |
1200
+ mmc_driver_type_mask (0 );
1201
+
1202
+ drive_strength = mmc_select_drive_strength (card ,
1203
+ card -> ext_csd .hs200_max_dtr ,
1204
+ card_drv_type , & drv_type );
1205
+
1206
+ card -> drive_strength = drive_strength ;
1207
+
1208
+ if (drv_type )
1209
+ mmc_set_driver_type (card -> host , drv_type );
1210
+ }
1211
+
1186
1212
/*
1187
1213
* For device supporting HS200 mode, the following sequence
1188
1214
* should be done before executing the tuning process.
@@ -1194,6 +1220,7 @@ static int mmc_select_hs200(struct mmc_card *card)
1194
1220
{
1195
1221
struct mmc_host * host = card -> host ;
1196
1222
int err = - EINVAL ;
1223
+ u8 val ;
1197
1224
1198
1225
if (card -> mmc_avail_type & EXT_CSD_CARD_TYPE_HS200_1_2V )
1199
1226
err = __mmc_set_signal_voltage (host , MMC_SIGNAL_VOLTAGE_120 );
@@ -1205,14 +1232,18 @@ static int mmc_select_hs200(struct mmc_card *card)
1205
1232
if (err )
1206
1233
goto err ;
1207
1234
1235
+ mmc_select_driver_type (card );
1236
+
1208
1237
/*
1209
1238
* Set the bus width(4 or 8) with host's support and
1210
1239
* switch to HS200 mode if bus width is set successfully.
1211
1240
*/
1212
1241
err = mmc_select_bus_width (card );
1213
1242
if (!IS_ERR_VALUE (err )) {
1243
+ val = EXT_CSD_TIMING_HS200 |
1244
+ card -> drive_strength << EXT_CSD_DRV_STR_SHIFT ;
1214
1245
err = __mmc_switch (card , EXT_CSD_CMD_SET_NORMAL ,
1215
- EXT_CSD_HS_TIMING , EXT_CSD_TIMING_HS200 ,
1246
+ EXT_CSD_HS_TIMING , val ,
1216
1247
card -> ext_csd .generic_cmd6_time ,
1217
1248
true, true, true);
1218
1249
if (!err )
0 commit comments