
On Thu, Aug 23, 2018 at 7:19 AM Peter Howard pjh@northern-ridge.com.au wrote:
On Thu, 2018-08-16 at 23:26 -0500, Adam Ford wrote:
When used with a device tree, this will extract the card detect and write protect pins from the device tree and configure them accordingly. This assumes the GPIO_ACTIVE_LOW/HIGH is supported byt da8xx_gpio.
Signed-off-by: Adam Ford aford173@gmail.com
diff --git a/drivers/mmc/davinci_mmc.c b/drivers/mmc/davinci_mmc.c index db950ea5ec..01d60f394f 100644 --- a/drivers/mmc/davinci_mmc.c +++ b/drivers/mmc/davinci_mmc.c @@ -15,6 +15,7 @@ #include <malloc.h> #include <asm/io.h> #include <asm/arch/sdmmc_defs.h> +#include <asm-generic/gpio.h>
#define DAVINCI_MAX_BLOCKS (32) #define WATCHDOG_COUNT (100000) @@ -35,6 +36,8 @@ struct davinci_mmc_priv { struct davinci_mmc_regs *reg_base; /* Register base address */ uint input_clk; /* Input clock to MMC controller */ uint version; /* MMC Controller version */
struct gpio_desc cd_gpio; /* Card Detect GPIO */
struct gpio_desc wp_gpio; /* Write Protect GPIO */
};
struct davinci_mmc_plat @@ -425,9 +428,38 @@ static const struct mmc_ops dmmc_ops = { .init = dmmc_init, }; #else
The two new functions here - davinci_mmc_getcd() and davinci_mmc_getwp() - also need to be wrapped in a check for DM_GPIO being enabled, otherwise dm_gpio_get_value() isn't built.
Good catch. I'm on vacation now in London, but I'll be home Sept 4. I should be able to post a V2 around then.
adam
+static int davinci_mmc_getcd(struct udevice *dev) +{
struct davinci_mmc_priv *priv = dev_get_priv(dev);
int value;
value = dm_gpio_get_value(&priv->cd_gpio);
/* if no CD return as 1 */
if (value < 0)
return 1;
return value;
+}
+static int davinci_mmc_getwp(struct udevice *dev) +{
struct davinci_mmc_priv *priv = dev_get_priv(dev);
int value;
value = dm_gpio_get_value(&priv->wp_gpio);
/* if no WP return as 0 */
if (value < 0)
return 0;
return value;
+}
static const struct dm_mmc_ops davinci_mmc_ops = { .send_cmd = davinci_mmc_send_cmd, .set_ios = davinci_mmc_set_ios,
.get_cd = davinci_mmc_getcd,
.get_wp = davinci_mmc_getwp,
Again the assignment of .get_cd and .get_wp need to be wrapped in a check for DM_GPIO.
}; #endif
@@ -475,6 +507,12 @@ static int davinci_mmc_probe(struct udevice *dev) priv->reg_base = (struct davinci_mmc_regs *)dev_read_addr(dev); priv->input_clk = clk_get(DAVINCI_MMCSD_CLKID);
+#if CONFIG_IS_ENABLED(DM_GPIO)
/* These GPIOs are optional */
gpio_request_by_name(dev, "cd-gpios", 0, &priv->cd_gpio,
GPIOD_IS_IN);
gpio_request_by_name(dev, "wp-gpios", 0, &priv->wp_gpio,
GPIOD_IS_IN); +#endif
upriv->mmc = &plat->mmc; return davinci_dm_mmc_init(dev);