OSDN Git Service

mmc: core: Simplify card drive strength mask
[uclinux-h8/linux.git] / drivers / mmc / core / sdio.c
index 5bc6c7d..ef82f3d 100644 (file)
@@ -403,22 +403,10 @@ static unsigned char host_drive_to_sdio_drive(int host_strength)
 static void sdio_select_driver_type(struct mmc_card *card)
 {
        int host_drv_type = SD_DRIVER_TYPE_B;
-       int card_drv_type = SD_DRIVER_TYPE_B;
-       int drive_strength;
+       int card_drv_type, drive_strength, drv_type;
        unsigned char card_strength;
        int err;
 
-       /*
-        * If the host doesn't support any of the Driver Types A,C or D,
-        * or there is no board specific handler then default Driver
-        * Type B is used.
-        */
-       if (!(card->host->caps &
-               (MMC_CAP_DRIVER_TYPE_A |
-                MMC_CAP_DRIVER_TYPE_C |
-                MMC_CAP_DRIVER_TYPE_D)))
-               return;
-
        if (!card->host->ops->select_drive_strength)
                return;
 
@@ -431,14 +419,7 @@ static void sdio_select_driver_type(struct mmc_card *card)
        if (card->host->caps & MMC_CAP_DRIVER_TYPE_D)
                host_drv_type |= SD_DRIVER_TYPE_D;
 
-       if (card->sw_caps.sd3_drv_type & SD_DRIVER_TYPE_A)
-               card_drv_type |= SD_DRIVER_TYPE_A;
-
-       if (card->sw_caps.sd3_drv_type & SD_DRIVER_TYPE_C)
-               card_drv_type |= SD_DRIVER_TYPE_C;
-
-       if (card->sw_caps.sd3_drv_type & SD_DRIVER_TYPE_D)
-               card_drv_type |= SD_DRIVER_TYPE_D;
+       card_drv_type = card->sw_caps.sd3_drv_type | SD_DRIVER_TYPE_B;
 
        /*
         * The drive strength that the hardware can support
@@ -448,23 +429,27 @@ static void sdio_select_driver_type(struct mmc_card *card)
         */
        drive_strength = card->host->ops->select_drive_strength(
                card->sw_caps.uhs_max_dtr,
-               host_drv_type, card_drv_type);
+               host_drv_type, card_drv_type, &drv_type);
 
-       /* if error just use default for drive strength B */
-       err = mmc_io_rw_direct(card, 0, 0, SDIO_CCCR_DRIVE_STRENGTH, 0,
-               &card_strength);
-       if (err)
-               return;
+       if (drive_strength) {
+               /* if error just use default for drive strength B */
+               err = mmc_io_rw_direct(card, 0, 0, SDIO_CCCR_DRIVE_STRENGTH, 0,
+                                      &card_strength);
+               if (err)
+                       return;
 
-       card_strength &= ~(SDIO_DRIVE_DTSx_MASK<<SDIO_DRIVE_DTSx_SHIFT);
-       card_strength |= host_drive_to_sdio_drive(drive_strength);
+               card_strength &= ~(SDIO_DRIVE_DTSx_MASK<<SDIO_DRIVE_DTSx_SHIFT);
+               card_strength |= host_drive_to_sdio_drive(drive_strength);
 
-       err = mmc_io_rw_direct(card, 1, 0, SDIO_CCCR_DRIVE_STRENGTH,
-               card_strength, NULL);
+               /* if error default to drive strength B */
+               err = mmc_io_rw_direct(card, 1, 0, SDIO_CCCR_DRIVE_STRENGTH,
+                                      card_strength, NULL);
+               if (err)
+                       return;
+       }
 
-       /* if error default to drive strength B */
-       if (!err)
-               mmc_set_driver_type(card->host, drive_strength);
+       if (drv_type)
+               mmc_set_driver_type(card->host, drv_type);
 }
 
 
@@ -934,8 +919,12 @@ static int mmc_sdio_suspend(struct mmc_host *host)
                mmc_release_host(host);
        }
 
-       if (!mmc_card_keep_power(host))
+       if (!mmc_card_keep_power(host)) {
                mmc_power_off(host);
+       } else if (host->retune_period) {
+               mmc_retune_timer_stop(host);
+               mmc_retune_needed(host);
+       }
 
        return 0;
 }
@@ -1056,6 +1045,12 @@ static int mmc_sdio_runtime_resume(struct mmc_host *host)
        return mmc_sdio_power_restore(host);
 }
 
+static int mmc_sdio_reset(struct mmc_host *host)
+{
+       mmc_power_cycle(host, host->card->ocr);
+       return mmc_sdio_power_restore(host);
+}
+
 static const struct mmc_bus_ops mmc_sdio_ops = {
        .remove = mmc_sdio_remove,
        .detect = mmc_sdio_detect,
@@ -1066,6 +1061,7 @@ static const struct mmc_bus_ops mmc_sdio_ops = {
        .runtime_resume = mmc_sdio_runtime_resume,
        .power_restore = mmc_sdio_power_restore,
        .alive = mmc_sdio_alive,
+       .reset = mmc_sdio_reset,
 };