|
@@ -35,14 +35,24 @@
|
|
|
#include <asm/arch/mmc_host_def.h>
|
|
|
#include <asm/arch/sys_proto.h>
|
|
|
|
|
|
+/* simplify defines to OMAP_HSMMC_USE_GPIO */
|
|
|
+#if (defined(CONFIG_OMAP_GPIO) && !defined(CONFIG_SPL_BUILD)) || \
|
|
|
+ (defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_GPIO_SUPPORT))
|
|
|
+#define OMAP_HSMMC_USE_GPIO
|
|
|
+#else
|
|
|
+#undef OMAP_HSMMC_USE_GPIO
|
|
|
+#endif
|
|
|
+
|
|
|
/* common definitions for all OMAPs */
|
|
|
#define SYSCTL_SRC (1 << 25)
|
|
|
#define SYSCTL_SRD (1 << 26)
|
|
|
|
|
|
struct omap_hsmmc_data {
|
|
|
struct hsmmc *base_addr;
|
|
|
+#ifdef OMAP_HSMMC_USE_GPIO
|
|
|
int cd_gpio;
|
|
|
int wp_gpio;
|
|
|
+#endif
|
|
|
};
|
|
|
|
|
|
/* If we fail after 1 second wait, something is really bad */
|
|
@@ -54,8 +64,7 @@ static int mmc_write_data(struct hsmmc *mmc_base, const char *buf,
|
|
|
static struct mmc hsmmc_dev[3];
|
|
|
static struct omap_hsmmc_data hsmmc_dev_data[3];
|
|
|
|
|
|
-#if (defined(CONFIG_OMAP_GPIO) && !defined(CONFIG_SPL_BUILD)) || \
|
|
|
- (defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_GPIO_SUPPORT))
|
|
|
+#ifdef OMAP_HSMMC_USE_GPIO
|
|
|
static int omap_mmc_setup_gpio_in(int gpio, const char *label)
|
|
|
{
|
|
|
if (!gpio_is_valid(gpio))
|
|
@@ -69,26 +78,6 @@ static int omap_mmc_setup_gpio_in(int gpio, const char *label)
|
|
|
|
|
|
return gpio;
|
|
|
}
|
|
|
-
|
|
|
-static int omap_mmc_getcd(struct mmc *mmc)
|
|
|
-{
|
|
|
- int cd_gpio = ((struct omap_hsmmc_data *)mmc->priv)->cd_gpio;
|
|
|
- return gpio_get_value(cd_gpio);
|
|
|
-}
|
|
|
-
|
|
|
-static int omap_mmc_getwp(struct mmc *mmc)
|
|
|
-{
|
|
|
- int wp_gpio = ((struct omap_hsmmc_data *)mmc->priv)->wp_gpio;
|
|
|
- return gpio_get_value(wp_gpio);
|
|
|
-}
|
|
|
-#else
|
|
|
-static inline int omap_mmc_setup_gpio_in(int gpio, const char *label)
|
|
|
-{
|
|
|
- return -1;
|
|
|
-}
|
|
|
-
|
|
|
-#define omap_mmc_getcd NULL
|
|
|
-#define omap_mmc_getwp NULL
|
|
|
#endif
|
|
|
|
|
|
#if defined(CONFIG_OMAP44XX) && defined(CONFIG_TWL6030_POWER)
|
|
@@ -213,7 +202,7 @@ void mmc_init_stream(struct hsmmc *mmc_base)
|
|
|
}
|
|
|
|
|
|
|
|
|
-static int mmc_init_setup(struct mmc *mmc)
|
|
|
+static int omap_hsmmc_init_setup(struct mmc *mmc)
|
|
|
{
|
|
|
struct hsmmc *mmc_base;
|
|
|
unsigned int reg_val;
|
|
@@ -322,7 +311,7 @@ static void mmc_reset_controller_fsm(struct hsmmc *mmc_base, u32 bit)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,
|
|
|
+static int omap_hsmmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,
|
|
|
struct mmc_data *data)
|
|
|
{
|
|
|
struct hsmmc *mmc_base;
|
|
@@ -552,7 +541,7 @@ static int mmc_write_data(struct hsmmc *mmc_base, const char *buf,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static void mmc_set_ios(struct mmc *mmc)
|
|
|
+static void omap_hsmmc_set_ios(struct mmc *mmc)
|
|
|
{
|
|
|
struct hsmmc *mmc_base;
|
|
|
unsigned int dsor = 0;
|
|
@@ -606,6 +595,44 @@ static void mmc_set_ios(struct mmc *mmc)
|
|
|
writel(readl(&mmc_base->sysctl) | CEN_ENABLE, &mmc_base->sysctl);
|
|
|
}
|
|
|
|
|
|
+#ifdef OMAP_HSMMC_USE_GPIO
|
|
|
+static int omap_hsmmc_getcd(struct mmc *mmc)
|
|
|
+{
|
|
|
+ struct omap_hsmmc_data *priv_data = mmc->priv;
|
|
|
+ int cd_gpio;
|
|
|
+
|
|
|
+ /* if no CD return as 1 */
|
|
|
+ cd_gpio = priv_data->cd_gpio;
|
|
|
+ if (cd_gpio < 0)
|
|
|
+ return 1;
|
|
|
+
|
|
|
+ return gpio_get_value(cd_gpio);
|
|
|
+}
|
|
|
+
|
|
|
+static int omap_hsmmc_getwp(struct mmc *mmc)
|
|
|
+{
|
|
|
+ struct omap_hsmmc_data *priv_data = mmc->priv;
|
|
|
+ int wp_gpio;
|
|
|
+
|
|
|
+ /* if no WP return as 0 */
|
|
|
+ wp_gpio = priv_data->wp_gpio;
|
|
|
+ if (wp_gpio < 0)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ return gpio_get_value(wp_gpio);
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
+static const struct mmc_ops omap_hsmmc_ops = {
|
|
|
+ .send_cmd = omap_hsmmc_send_cmd,
|
|
|
+ .set_ios = omap_hsmmc_set_ios,
|
|
|
+ .init = omap_hsmmc_init_setup,
|
|
|
+#ifdef OMAP_HSMMC_USE_GPIO
|
|
|
+ .getcd = omap_hsmmc_getcd,
|
|
|
+ .getwp = omap_hsmmc_getwp,
|
|
|
+#endif
|
|
|
+};
|
|
|
+
|
|
|
int omap_mmc_init(int dev_index, uint host_caps_mask, uint f_max, int cd_gpio,
|
|
|
int wp_gpio)
|
|
|
{
|
|
@@ -615,9 +642,7 @@ int omap_mmc_init(int dev_index, uint host_caps_mask, uint f_max, int cd_gpio,
|
|
|
MMC_MODE_HC;
|
|
|
|
|
|
sprintf(mmc->name, "OMAP SD/MMC");
|
|
|
- mmc->send_cmd = mmc_send_cmd;
|
|
|
- mmc->set_ios = mmc_set_ios;
|
|
|
- mmc->init = mmc_init_setup;
|
|
|
+ mmc->ops = &omap_hsmmc_ops;
|
|
|
mmc->priv = priv_data;
|
|
|
|
|
|
switch (dev_index) {
|
|
@@ -647,13 +672,11 @@ int omap_mmc_init(int dev_index, uint host_caps_mask, uint f_max, int cd_gpio,
|
|
|
priv_data->base_addr = (struct hsmmc *)OMAP_HSMMC1_BASE;
|
|
|
return 1;
|
|
|
}
|
|
|
+#ifdef OMAP_HSMMC_USE_GPIO
|
|
|
+ /* on error gpio values are set to -1, which is what we want */
|
|
|
priv_data->cd_gpio = omap_mmc_setup_gpio_in(cd_gpio, "mmc_cd");
|
|
|
- if (priv_data->cd_gpio != -1)
|
|
|
- mmc->getcd = omap_mmc_getcd;
|
|
|
-
|
|
|
priv_data->wp_gpio = omap_mmc_setup_gpio_in(wp_gpio, "mmc_wp");
|
|
|
- if (priv_data->wp_gpio != -1)
|
|
|
- mmc->getwp = omap_mmc_getwp;
|
|
|
+#endif
|
|
|
|
|
|
mmc->voltages = MMC_VDD_32_33 | MMC_VDD_33_34 | MMC_VDD_165_195;
|
|
|
mmc->host_caps = host_caps_val & ~host_caps_mask;
|