armv8: ls1012a: define esdhc_status_fixup for QDS board
authorYangbo Lu <yangbo.lu@nxp.com>
Tue, 17 Jan 2017 02:43:55 +0000 (10:43 +0800)
committerYork Sun <york.sun@nxp.com>
Wed, 18 Jan 2017 17:46:45 +0000 (09:46 -0800)
The LS1012AQDS board has a hardware issue. When there is no eMMC
adapter card inserted in SDHC2 adapter slot, the command inhibit
bits of eSDHC2_PRSSTAT register will never release. This would cause
below continious error messages in linux since it uses polling mode
to detect card.
"mmc1: Controller never released inhibit bit(s)."
"mmc1: Controller never released inhibit bit(s)."
"mmc1: Controller never released inhibit bit(s)."
This patch is to define esdhc_status_fixup function for QDS to
disable SDHC2 status if no eMMC adapter card is detected.

Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
Reviewed-by: York Sun <york.sun@nxp.com>
board/freescale/ls1012aqds/ls1012aqds.c

index 94440b3c8091050c05d857c60a60ea2fabca80e5..88fb4ce99b91acd7d65e729cc37dffd32edf788f 100644 (file)
@@ -121,6 +121,34 @@ int board_eth_init(bd_t *bis)
        return pci_eth_init(bis);
 }
 
+int esdhc_status_fixup(void *blob, const char *compat)
+{
+       char esdhc0_path[] = "/soc/esdhc@1560000";
+       char esdhc1_path[] = "/soc/esdhc@1580000";
+       u8 card_id;
+
+       do_fixup_by_path(blob, esdhc0_path, "status", "okay",
+                        sizeof("okay"), 1);
+
+       /*
+        * The Presence Detect 2 register detects the installation
+        * of cards in various PCI Express or SGMII slots.
+        *
+        * STAT_PRS2[7:5]: Specifies the type of card installed in the
+        * SDHC2 Adapter slot. 0b111 indicates no adapter is installed.
+        */
+       card_id = (QIXIS_READ(present2) & 0xe0) >> 5;
+
+       /* If no adapter is installed in SDHC2, disable SDHC2 */
+       if (card_id == 0x7)
+               do_fixup_by_path(blob, esdhc1_path, "status", "disabled",
+                                sizeof("disabled"), 1);
+       else
+               do_fixup_by_path(blob, esdhc1_path, "status", "okay",
+                                sizeof("okay"), 1);
+       return 0;
+}
+
 #ifdef CONFIG_OF_BOARD_SETUP
 int ft_board_setup(void *blob, bd_t *bd)
 {