[U-Boot] [PATCH] MMC: davinici_mmc: Enable CD and WP with DM and OF_CONTROL
Adam Ford
aford173 at gmail.com
Fri Aug 24 17:06:20 UTC 2018
On Thu, Aug 23, 2018 at 7:19 AM Peter Howard <pjh at 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 at 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);
More information about the U-Boot
mailing list