Merge "[msm7k]: Fix ACPU clock initialization"
diff --git a/AndroidBoot.mk b/AndroidBoot.mk
index 13316ac..fbe0527 100644
--- a/AndroidBoot.mk
+++ b/AndroidBoot.mk
@@ -3,6 +3,9 @@
 TARGET_BOOTLOADER := $(PRODUCT_OUT)/appsboot.mbn
 BOOTLOADER_OUT := $(TOP)/$(TARGET_OUT_INTERMEDIATES)/BOOTLOADER_OBJ
 
+# Force GCC 4.4.0 crosstool chain for Android builds
+CROSS_TOOL := ../../../prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi-
+
 # Remove bootloader binary to trigger recompile when source changes
 appsbootldr_clean:
 	$(hide) rm -f $(TARGET_BOOTLOADER)
@@ -12,7 +15,19 @@
 	mkdir -p $(BOOTLOADER_OUT)
 
 
+TARGET_EMMC := 0
 ifeq ($(TARGET_USERIMAGES_USE_EXT2),true)
+  TARGET_EMMC := 1
+endif
+ifeq ($(TARGET_USERIMAGES_USE_EXT3),true)
+  TARGET_EMMC := 1
+endif
+ifeq ($(TARGET_USERIMAGES_USE_EXT4),true)
+  TARGET_EMMC := 1
+endif
+
+
+ifeq ($(TARGET_EMMC),1)
 TARGET_BOOTLOADER_EMMC := $(PRODUCT_OUT)/EMMCBOOT.MBN
 BOOTLOADER_EMMC_OUT := $(TOP)/$(TARGET_OUT_INTERMEDIATES)/BOOTLOADER_EMMC_OBJ
 
@@ -24,13 +39,13 @@
 	mkdir -p $(BOOTLOADER_EMMC_OUT)
 
 $(TARGET_BOOTLOADER): appsbootldr_clean emmc_appsbootldr_clean $(BOOTLOADER_OUT) $(BOOTLOADER_EMMC_OUT)
-	$(MAKE) -C bootable/bootloader/lk BOOTLOADER_OUT=../../../$(BOOTLOADER_OUT) $(TARGET_PRODUCT)
-	$(MAKE) -C bootable/bootloader/lk BOOTLOADER_OUT=../../../$(BOOTLOADER_EMMC_OUT) $(TARGET_PRODUCT) EMMC_BOOT=1
+	$(MAKE) -C bootable/bootloader/lk TOOLCHAIN_PREFIX=$(CROSS_TOOL) BOOTLOADER_OUT=../../../$(BOOTLOADER_OUT) $(TARGET_PRODUCT)
+	$(MAKE) -C bootable/bootloader/lk TOOLCHAIN_PREFIX=$(CROSS_TOOL) BOOTLOADER_OUT=../../../$(BOOTLOADER_EMMC_OUT) $(TARGET_PRODUCT) EMMC_BOOT=1
 
 else
 
 $(TARGET_BOOTLOADER): appsbootldr_clean $(BOOTLOADER_OUT)
-	$(MAKE) -C bootable/bootloader/lk BOOTLOADER_OUT=../../../$(BOOTLOADER_OUT) $(TARGET_PRODUCT)
+	$(MAKE) -C bootable/bootloader/lk TOOLCHAIN_PREFIX=$(CROSS_TOOL) BOOTLOADER_OUT=../../../$(BOOTLOADER_OUT) $(TARGET_PRODUCT)
 
 endif
 
@@ -47,5 +62,5 @@
 
 $(TARGET_NANDWRITE): nandwrite_clean $(NANDWRITE_OUT)
 	@echo $(TARGET_PRODUCT)_nandwrite
-	$(MAKE) -C bootable/bootloader/lk BOOTLOADER_OUT=../../../$(NANDWRITE_OUT) $(TARGET_PRODUCT)_nandwrite BUILD_NANDWRITE=1
+	$(MAKE) -C bootable/bootloader/lk TOOLCHAIN_PREFIX=$(CROSS_TOOL) BOOTLOADER_OUT=../../../$(NANDWRITE_OUT) $(TARGET_PRODUCT)_nandwrite BUILD_NANDWRITE=1
 
diff --git a/platform/msm_shared/include/mmc.h b/platform/msm_shared/include/mmc.h
index 8f2c4e7..1d230c1 100755
--- a/platform/msm_shared/include/mmc.h
+++ b/platform/msm_shared/include/mmc.h
@@ -479,6 +479,7 @@
 #define MMC_BOOT_TYPE_SDHC               1

 #define MMC_BOOT_TYPE_SDIO               2

 #define MMC_BOOT_TYPE_MMCHC              3

+#define MMC_BOOT_TYPE_STD_MMC            4

     unsigned int status;

 #define MMC_BOOT_STATUS_INACTIVE         0

 #define MMC_BOOT_STATUS_ACTIVE           1

diff --git a/platform/msm_shared/mmc.c b/platform/msm_shared/mmc.c
index 5451a59..ecdd90f 100644
--- a/platform/msm_shared/mmc.c
+++ b/platform/msm_shared/mmc.c
@@ -189,10 +189,11 @@
     {

         card->rd_timeout_ns = 100000000;

     }

-    else if( card->type == MMC_BOOT_TYPE_STD_SD )

+    else if( (card->type == MMC_BOOT_TYPE_STD_SD) || (card->type == MMC_BOOT_TYPE_STD_MMC) )

     {

         timeout_ns = 10 * ( (card->csd.taac_ns ) +

                 ( card->csd.nsac_clk_cycle / (host->mclk_rate/1000000000)));

+        card->rd_timeout_ns = timeout_ns;

     }

     else

     {

@@ -220,11 +221,12 @@
     {

         card->wr_timeout_ns = 100000000;

     }

-    else if( card->type == MMC_BOOT_TYPE_STD_SD )

+    else if( card->type == MMC_BOOT_TYPE_STD_SD || (card->type == MMC_BOOT_TYPE_STD_MMC) )

     {

         timeout_ns = 10 * ( (  card->csd.taac_ns ) +

                 ( card->csd.nsac_clk_cycle / ( host->mclk_rate/1000000000 ) ) );

         timeout_ns = timeout_ns << card->csd.r2w_factor;

+        card->wr_timeout_ns = timeout_ns;

     }

     else

     {

@@ -639,6 +641,14 @@
         return MMC_BOOT_E_CARD_BUSY;

     }

 

+    if(mmc_resp & MMC_BOOT_OCR_SEC_MODE)

+    {

+        card->type = MMC_BOOT_TYPE_MMCHC;

+    }

+    else

+    {

+        card->type = MMC_BOOT_TYPE_STD_MMC;

+    }

     return MMC_BOOT_E_SUCCESS;

 }

 

@@ -704,7 +714,7 @@
     /* CMD3 Format:

      * [31:0] stuff bits

      */

-    if(card->type == MMC_BOOT_TYPE_SDHC)

+    if(card->type == MMC_BOOT_TYPE_SDHC || card->type == MMC_BOOT_TYPE_STD_SD)

     {

         cmd.cmd_index = CMD3_SEND_RELATIVE_ADDR;

         cmd.argument = 0;

@@ -819,7 +829,7 @@
     /* If we are deselecting card, we do not get response */

     if( rca == card->rca && rca)

     {

-        if(card->type == MMC_BOOT_TYPE_SDHC)

+        if(card->type == MMC_BOOT_TYPE_SDHC || card->type == MMC_BOOT_TYPE_STD_SD)

             cmd.resp_type = MMC_BOOT_RESP_R1B;

         else

             cmd.resp_type = MMC_BOOT_RESP_R1;

@@ -1184,7 +1194,6 @@
         mmc_width = width-1;

     }

 

-    mmc_boot_send_ext_cmd (card, ext_csd_buf);

 

     do

     {

@@ -1193,8 +1202,7 @@
         {

             return mmc_ret;

         }

-    }while( (mmc_ret == MMC_BOOT_E_SUCCESS) &&

-        (MMC_BOOT_CARD_STATUS(status) == MMC_BOOT_PROG_STATE));

+    }while(MMC_BOOT_CARD_STATUS(status) == MMC_BOOT_PROG_STATE);

 

     if(MMC_BOOT_CARD_STATUS(status) != MMC_BOOT_TRAN_STATE)

         return MMC_BOOT_E_FAILURE;

@@ -1543,9 +1551,21 @@
 static unsigned int mmc_boot_adjust_interface_speed( struct mmc_boot_host* host,

         struct mmc_boot_card* card )

 {

-    int mmc_ret;

+    unsigned int mmc_ret = MMC_BOOT_E_SUCCESS;

+    unsigned int status;

 

-    mmc_boot_send_ext_cmd (card, ext_csd_buf);

+

+    do

+    {

+        mmc_ret = mmc_boot_get_card_status(card, 1, &status);

+        if(mmc_ret != MMC_BOOT_E_SUCCESS)

+        {

+            return mmc_ret;

+        }

+    }while(MMC_BOOT_CARD_STATUS(status) == MMC_BOOT_PROG_STATE);

+

+    if(MMC_BOOT_CARD_STATUS(status) != MMC_BOOT_TRAN_STATE)

+        return MMC_BOOT_E_FAILURE;

 

     /* Setting HS_TIMING in EXT_CSD (CMD6) */

     mmc_ret = mmc_boot_switch_cmd(card, MMC_BOOT_ACCESS_WRITE, MMC_BOOT_EXT_CMMC_HS_TIMING, 1);

@@ -1850,7 +1870,7 @@
     return MMC_BOOT_E_SUCCESS;

 }

 

-static unsigned int mmc_boot_sd_init_card(void)

+static unsigned int mmc_boot_sd_init_card(struct mmc_boot_card* card)

 {

     unsigned int i,mmc_ret;

     unsigned int ocr_cmd_arg;

@@ -1901,7 +1921,15 @@
         }

         else if (cmd.resp[0] & MMC_BOOT_SD_DEV_READY)

         {

-            /* Check for HC later */

+            /* Check for HC */

+            if(cmd.resp[0] & (1 << 30))

+            {

+                card->type = MMC_BOOT_TYPE_SDHC;

+            }

+            else

+            {

+                card->type = MMC_BOOT_TYPE_STD_SD;

+            }

             break;

         }

         mdelay(50);

@@ -1959,12 +1987,7 @@
                     mmc_return );

 

             /* Check for sD card */

-            mmc_return = mmc_boot_sd_init_card();

-            if (mmc_return == MMC_BOOT_E_SUCCESS)

-            {

-                card->type = MMC_BOOT_TYPE_SDHC;

-            }

-

+            mmc_return = mmc_boot_sd_init_card(card);

             return mmc_return;

         }

     }while( mmc_retry < host->cmd_retry );

@@ -1977,10 +2000,6 @@
                 Initialization not completed\n", mmc_return );

         return MMC_BOOT_E_CARD_BUSY;

     }

-

-    /*Assuming high capacity mmc card*/

-    card->type = MMC_BOOT_TYPE_MMCHC;

-

     return MMC_BOOT_E_SUCCESS;

 }

 

@@ -2118,7 +2137,7 @@
         return mmc_return;

     }

 

-    if(card->type == MMC_BOOT_TYPE_SDHC)

+    if(card->type == MMC_BOOT_TYPE_SDHC || card->type == MMC_BOOT_TYPE_STD_SD)

     {

         mmc_return = mmc_boot_set_sd_hs(host, card);

         if(mmc_return != MMC_BOOT_E_SUCCESS)