]> git.ipfire.org Git - people/ms/u-boot.git/blobdiff - drivers/mmc/omap_hsmmc.c
mmc: Remove ops from struct mmc and put in mmc_ops
[people/ms/u-boot.git] / drivers / mmc / omap_hsmmc.c
index d3a8b5303d534efbfc68fd412635e5e082798a27..6bf602fea59401559a1ee93a361b137a3807a483 100644 (file)
 #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;