diff mbox series

[U-Boot] MMC: davinici_mmc: Enable CD and WP with DM and OF_CONTROL

Message ID 20180817042603.24984-1-aford173@gmail.com
State Superseded
Delegated to: Tom Rini
Headers show
Series [U-Boot] MMC: davinici_mmc: Enable CD and WP with DM and OF_CONTROL | expand

Commit Message

Adam Ford Aug. 17, 2018, 4:26 a.m. UTC
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>

Comments

Peter Howard Aug. 23, 2018, 6:18 a.m. UTC | #1
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.


> +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);
Adam Ford Aug. 24, 2018, 5:06 p.m. UTC | #2
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);
diff mbox series

Patch

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
+
+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,
 };
 #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);