@@ -88,7 +88,8 @@ static u32 rsi_sdio_set_cmd52_arg(bool rw,
*/
static int rsi_cmd52writebyte(struct mmc_card *card,
u32 address,
- u8 byte)
+ u8 byte,
+ bool expect_resp)
{
struct mmc_command io_cmd;
u32 arg;
@@ -97,7 +98,9 @@ static int rsi_cmd52writebyte(struct mmc_card *card,
arg = rsi_sdio_set_cmd52_arg(1, 0, 0, address, byte);
io_cmd.opcode = SD_IO_RW_DIRECT;
io_cmd.arg = arg;
- io_cmd.flags = /*MMC_RSP_R5 | */MMC_CMD_AC;
+ io_cmd.flags = MMC_CMD_AC;
+ if (expect_resp)
+ io_cmd.flags |= MMC_RSP_R5;
return mmc_wait_for_cmd(card->host, &io_cmd, 0);
}
@@ -112,7 +115,8 @@ static int rsi_cmd52writebyte(struct mmc_card *card,
*/
static int rsi_cmd52readbyte(struct mmc_card *card,
u32 address,
- u8 *byte)
+ u8 *byte,
+ bool expect_resp)
{
struct mmc_command io_cmd;
u32 arg;
@@ -122,7 +126,9 @@ static int rsi_cmd52readbyte(struct mmc_card *card,
arg = rsi_sdio_set_cmd52_arg(0, 0, 0, address, 0);
io_cmd.opcode = SD_IO_RW_DIRECT;
io_cmd.arg = arg;
- io_cmd.flags = /*MMC_RSP_R5 | */MMC_CMD_AC;
+ io_cmd.flags = MMC_CMD_AC;
+ if (expect_resp)
+ io_cmd.flags |= MMC_RSP_R5;
err = mmc_wait_for_cmd(card->host, &io_cmd, 0);
if ((!err) && (byte))
@@ -311,7 +317,7 @@ static void rsi_reset_card(struct sdio_func *pfunction)
/* Reset 9110 chip */
err = rsi_cmd52writebyte(pfunction->card,
SDIO_CCCR_ABORT,
- (1 << 3));
+ (1 << 3), true);
/* Card will not send any response as it is getting reset immediately
* Hence expect a timeout status from host controller
@@ -446,14 +452,16 @@ static void rsi_reset_card(struct sdio_func *pfunction)
/* Enable high speed */
if (card->host->caps & MMC_CAP_SD_HIGHSPEED) {
ven_rsi_dbg(ERR_ZONE, "%s: Set high speed mode\n", __func__);
- err = rsi_cmd52readbyte(card, SDIO_CCCR_SPEED, &cmd52_resp);
+ err = rsi_cmd52readbyte(card, SDIO_CCCR_SPEED, &cmd52_resp,
+ true);
if (err) {
ven_rsi_dbg(ERR_ZONE, "%s: CCCR speed reg read failed: %d\n",
__func__, err);
} else {
err = rsi_cmd52writebyte(card,
SDIO_CCCR_SPEED,
- (cmd52_resp | SDIO_SPEED_EHS));
+ (cmd52_resp | SDIO_SPEED_EHS),
+ true);
if (err) {
ven_rsi_dbg(ERR_ZONE,
"%s: CCR speed regwrite failed %d\n",
@@ -482,7 +490,7 @@ static void rsi_reset_card(struct sdio_func *pfunction)
err = rsi_cmd52writebyte(card,
SDIO_CCCR_IF,
(SDIO_BUS_CD_DISABLE |
- SDIO_BUS_WIDTH_4BIT));
+ SDIO_BUS_WIDTH_4BIT), true);
if (err) {
ven_rsi_dbg(ERR_ZONE, "%s: Set bus mode failed : %d\n",
__func__, err);
@@ -1220,7 +1228,7 @@ static int rsi_sdio_disable_interrupts(struct sdio_func *pfunction)
ven_rsi_dbg(ERR_ZONE, "\nInterrupts cleared");
sdio_claim_host(pfunction);
- ret = rsi_cmd52readbyte(pfunction->card, 0x04, &data);
+ ret = rsi_cmd52readbyte(pfunction->card, 0x04, &data, false);
if (ret < 0) {
ven_rsi_dbg(ERR_ZONE,
"%s: Failed to read INTR_EN register\n",
@@ -1233,7 +1241,7 @@ static int rsi_sdio_disable_interrupts(struct sdio_func *pfunction)
/* And bit0 and b1 */
data &= 0xfc;
- ret = rsi_cmd52writebyte(pfunction->card, 0x04, data);
+ ret = rsi_cmd52writebyte(pfunction->card, 0x04, data, false);
if (ret < 0) {
ven_rsi_dbg(ERR_ZONE,
"%s: Failed to Write to INTR_EN register\n",
@@ -1241,7 +1249,7 @@ static int rsi_sdio_disable_interrupts(struct sdio_func *pfunction)
sdio_release_host(pfunction);
return ret;
}
- ret = rsi_cmd52readbyte(pfunction->card, 0x04, &data);
+ ret = rsi_cmd52readbyte(pfunction->card, 0x04, &data, false);
if (ret < 0) {
ven_rsi_dbg(ERR_ZONE,
"%s: Failed to read INTR_EN register\n",
@@ -1262,7 +1270,7 @@ static int rsi_sdio_enable_interrupts(struct sdio_func *pfunction)
int ret;
sdio_claim_host(pfunction);
- ret = rsi_cmd52readbyte(pfunction->card, 0x04, &data);
+ ret = rsi_cmd52readbyte(pfunction->card, 0x04, &data, false);
if (ret < 0) {
ven_rsi_dbg(ERR_ZONE,
"%s: Failed to read INTR_EN register\n", __func__);
@@ -1274,7 +1282,7 @@ static int rsi_sdio_enable_interrupts(struct sdio_func *pfunction)
/* Enable b1 and b0 */
data |= 0x03;
- ret = rsi_cmd52writebyte(pfunction->card, 0x04, data);
+ ret = rsi_cmd52writebyte(pfunction->card, 0x04, data, false);
if (ret < 0) {
ven_rsi_dbg(ERR_ZONE,
"%s: Failed to Write to INTR_EN register\n",
@@ -1282,8 +1290,8 @@ static int rsi_sdio_enable_interrupts(struct sdio_func *pfunction)
sdio_release_host(pfunction);
return ret;
}
-
- ret = rsi_cmd52readbyte(pfunction->card, 0x04, &data);
+
+ ret = rsi_cmd52readbyte(pfunction->card, 0x04, &data, false);
if (ret < 0) {
ven_rsi_dbg(ERR_ZONE,
"%s: Failed to read INTR_EN register\n", __func__);