sunxi: Add mmc card-detect functionality
authorHans de Goede <hdegoede@redhat.com>
Thu, 2 Oct 2014 18:29:26 +0000 (20:29 +0200)
committerHans de Goede <hdegoede@redhat.com>
Fri, 24 Oct 2014 07:35:38 +0000 (09:35 +0200)
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Acked-by: Ian Campbell <ijc@hellion.org.uk>
board/sunxi/Kconfig
drivers/mmc/sunxi_mmc.c
include/configs/sunxi-common.h

index 05defacfcafe9f262e133fe203301c54fb3294aa..63188dd32114f334592e819cfd6b20070621459f 100644 (file)
@@ -41,4 +41,30 @@ config SYS_SOC
 config FDTFILE
        string "Default fdtfile env setting for this board"
 
+config MMC0_CD_PIN
+       string "Card detect pin for mmc0"
+       default ""
+       ---help---
+       Set the card detect pin for mmc0, leave empty to not use cd. This
+       takes a string in the format understood by sunxi_name_to_gpio, e.g.
+       PH1 for pin 1 of port H.
+
+config MMC1_CD_PIN
+       string "Card detect pin for mmc1"
+       default ""
+       ---help---
+       See MMC0_CD_PIN help text.
+
+config MMC2_CD_PIN
+       string "Card detect pin for mmc2"
+       default ""
+       ---help---
+       See MMC0_CD_PIN help text.
+
+config MMC3_CD_PIN
+       string "Card detect pin for mmc3"
+       default ""
+       ---help---
+       See MMC0_CD_PIN help text.
+
 endif
index 8f4b50ba9855e89310f8ec83941f082a2f619e46..b47376a79383fb38de3ad6fee033850274046845 100644 (file)
@@ -14,7 +14,9 @@
 #include <asm/io.h>
 #include <asm/arch/clock.h>
 #include <asm/arch/cpu.h>
+#include <asm/arch/gpio.h>
 #include <asm/arch/mmc.h>
+#include <asm-generic/gpio.h>
 
 struct sunxi_mmc_host {
        unsigned mmc_no;
@@ -346,10 +348,29 @@ out:
        return error;
 }
 
+static int sunxi_mmc_getcd(struct mmc *mmc)
+{
+       struct sunxi_mmc_host *mmchost = mmc->priv;
+       int cd_pin = -1;
+
+       switch (mmchost->mmc_no) {
+       case 0: cd_pin = sunxi_name_to_gpio(CONFIG_MMC0_CD_PIN); break;
+       case 1: cd_pin = sunxi_name_to_gpio(CONFIG_MMC1_CD_PIN); break;
+       case 2: cd_pin = sunxi_name_to_gpio(CONFIG_MMC2_CD_PIN); break;
+       case 3: cd_pin = sunxi_name_to_gpio(CONFIG_MMC3_CD_PIN); break;
+       }
+
+       if (cd_pin == -1)
+               return 1;
+
+       return !gpio_direction_input(cd_pin);
+}
+
 static const struct mmc_ops sunxi_mmc_ops = {
        .send_cmd       = mmc_send_cmd,
        .set_ios        = mmc_set_ios,
        .init           = mmc_core_init,
+       .getcd          = sunxi_mmc_getcd,
 };
 
 int sunxi_mmc_init(int sdc_no)
index 318f526d3400d5caf2b92ad3f2e62cab9e227ab8..5f54c01653a8045dbfd5e62be3e92b0d14298bcb 100644 (file)
 
 /* GPIO */
 #define CONFIG_SUNXI_GPIO
+#define CONFIG_SPL_GPIO_SUPPORT
 #define CONFIG_CMD_GPIO
 
 /* Ethernet support */